<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Posts on Random Ramblings</title><link>https://blog.foundev.pro/posts/index.html</link><description>Recent content in Posts on Random Ramblings</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Fri, 18 Sep 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://blog.foundev.pro/posts/index.xml" rel="self" type="application/rss+xml"/><item><title>Using Opus 5 Without Going Insane</title><link>https://blog.foundev.pro/2026/09/18/using-opus-5-without-going-insane.html</link><pubDate>Fri, 18 Sep 2026 00:00:00 +0000</pubDate><guid>https://blog.foundev.pro/2026/09/18/using-opus-5-without-going-insane.html</guid><description>&lt;p&gt;I&amp;rsquo;ve been using Opus 5 as my daily driver for a few weeks now across a bunch of projects and it&amp;rsquo;s a really capable model, but it has two habits that drove me a little nuts before I figured out how to deal with them:&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;It is verbose in a way that actually hides the answer. You ask a yes or no question and get four paragraphs of context, a code snippet, a caveat, and then the answer somewhere in the middle.&lt;/li&gt;&#10;&lt;li&gt;When it doesn&amp;rsquo;t understand something it does not go look it up, it guesses, and then it builds a lot of confident sounding structure on top of the guess.&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;This isn&amp;rsquo;t a post about whether Opus 5 is good or not (it is), it&amp;rsquo;s strictly what I do day to day to keep it useful. None of this is clever, most of it is just repeating yourself.&lt;/p&gt;</description></item><item><title>New Minimal Dependency vimrc with ALE</title><link>https://blog.foundev.pro/2022/10/06/new-minimal-dep-vimrc-with-ale.html</link><pubDate>Thu, 06 Oct 2022 00:00:00 +0000</pubDate><guid>https://blog.foundev.pro/2022/10/06/new-minimal-dep-vimrc-with-ale.html</guid><description>&lt;h1&gt;New Minimal Dependency vimrc with ALE&lt;/h1&gt;&#10;&lt;p&gt;&#10;I stumbled onto a good simple adjustment to my minimal config while trying to figure out a good vim setup for Java, Rust, and Go. Yes I know I can just use VSCode and everything will just work,&#10;but for my home stuff I like to keep things relatively stripped down, maybe a few packages via homebrew to keep things up to date, but I no longer like to spend&#10;oodles of time every time I log in running updates on a hundred different packages, vscode often feels like this to me, a chain of updates if I haven't logged in for awhile.&#10;&lt;/p&gt;</description></item><item><title>Confirmed Daily Writing is Too Much</title><link>https://blog.foundev.pro/2022/07/17/confirmed-daily-writing-is-too-much.html</link><pubDate>Sun, 17 Jul 2022 00:00:00 +0000</pubDate><guid>https://blog.foundev.pro/2022/07/17/confirmed-daily-writing-is-too-much.html</guid><description>&lt;h1 id="confirmed-daily-writing-is-too-much"&gt;Confirmed Daily Writing is Too Much&lt;/h1&gt;&#10;&lt;p&gt;Not much to say here, but my little experiment lasted a week (and even then I missed a day).&lt;/p&gt;&#10;&lt;p&gt;While I admit this is starting to pull opinions out of the back of my head and that is useful and I do see the appeal for others, but I think meditation can give me that.&lt;/p&gt;&#10;&lt;p&gt;I think a good middle ground maybe every weekend. I believe I have some good or at least interesting ideas to document for myself and sometimes link to others, but I was really reaching for ideas by day 5.&lt;/p&gt;</description></item><item><title>Why Free Software Still Matters to Me</title><link>https://blog.foundev.pro/2022/07/16/why-free-software-still-matters-to-me.html</link><pubDate>Sat, 16 Jul 2022 00:00:00 +0000</pubDate><guid>https://blog.foundev.pro/2022/07/16/why-free-software-still-matters-to-me.html</guid><description>&lt;h1 id="why-free-software-still-matters-to-me"&gt;Why Free Software Still Matters to Me&lt;/h1&gt;&#10;&lt;p&gt;When I was younger I had very little money, this was one part bad decision and one part background that I had to overcome. I got my first computer as an adult on a loan from an aunt who had saved all her money and wanted to make sure her nephew could go back to university (I never finished sorry auntie, but I think I did plenty well due to that loan, it all worked out extremely well.)&lt;/p&gt;</description></item><item><title>Ukrainian Proving Easy And Hard 1st Week</title><link>https://blog.foundev.pro/2022/07/15/ukrainian-proving-easy-and-hard-1st-week.html</link><pubDate>Fri, 15 Jul 2022 00:00:00 +0000</pubDate><guid>https://blog.foundev.pro/2022/07/15/ukrainian-proving-easy-and-hard-1st-week.html</guid><description>&lt;h1 id="ukrainian-proving-easy-and-hard-1st-week"&gt;Ukrainian Proving Easy And Hard 1st week&lt;/h1&gt;&#10;&lt;p&gt;About a week in with my 2nd try and a lot of things are sticking that I thought would be impossible. I’ll touch on those points and hope I am right as I am just beginning in this language.&lt;/p&gt;&#10;&lt;h2 id="the-easier-than-expected"&gt;The easier than expected&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Changing endings for nouns to say something is on or in, not super hard, seems pretty intuitive really as the sounds connect the words together.&lt;/li&gt;&#10;&lt;li&gt;Pronunciation is often super easy and I feel like I’ve already got a very good accent in most of what I’ve learned. At times it reminds me of European Portuguese.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="the-harder-than-expected"&gt;The harder than expected&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;the combination of endings and beginnings to words changes a lot. To say “also” changes to entirely different sounds depending on what you are doing or what noun you’re working with.&lt;/li&gt;&#10;&lt;li&gt;Pronunciation is SOMETIMES insanely hard and a given word will have effectively tons of syllables with several “kh” “ts” “shch” combos in it at once. I sometimes forget the other words I’m trying to say while I am focusing on a massively long word.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="week-2-strategy"&gt;Week 2 strategy&lt;/h2&gt;&#10;&lt;p&gt;I plan on drilling more vocabulary but the main focus is still getting the new sounds right. This work is the most important at the beginning and if I had to do French over again it would be to focus on pronunciation for the first 6 months with little grammar, little conjugation, and just learn some travel/daily life phrases but say them very very well. I am trying this now with Ukrainian.&lt;/p&gt;</description></item><item><title>Coding in Lieu of Scripting in Practice</title><link>https://blog.foundev.pro/2022/07/13/scripting-in-lieu-of-coding-in-practice.html</link><pubDate>Wed, 13 Jul 2022 00:00:00 +0000</pubDate><guid>https://blog.foundev.pro/2022/07/13/scripting-in-lieu-of-coding-in-practice.html</guid><description>&lt;h1 id="coding-in-lieu-of-scripting-in-practice"&gt;Coding in Lieu of Scripting in Practice&lt;/h1&gt;&#10;&lt;p&gt;I wrote a short blog yesterday about how I approach the problem of munging large amount of log data without just relying on grep, sed or awk to do my troubleshooting. I would like to talk about how that tends to actually work out.&lt;/p&gt;&#10;&lt;h2 id="finding-patterns"&gt;finding patterns&lt;/h2&gt;&#10;&lt;p&gt;Take the following log from a random server that maybe has issues.&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f7f7f7;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-txt" data-lang="txt"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;INFO [main] 2019-12-10 22:37:19,773 YamlConfigurationLoader.java:89 - Configuration location: file:/home/ubuntu/apache-cassandra-3.11.5/conf/cassandra.yaml&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;INFO [main] 2019-12-10 22:37:20,087 Config.java:516 - Node configuration:[allocate_tokens_for_keyspace=null; authenticator=AllowAllAuthenticator; authorizer=AllowAllAuthorizer; auto_bootstrap=true; auto_snapshot=true; back_pressure_enabled=false; back_pressure_strategy=org.apache.cassandra.net.RateBasedBackPressure{high_ratio=0.9, factor=5, flow=FAST}; batch_size_fail_threshold_in_kb=50; batch_size_warn_threshold_in_kb=5; batchlog_replay_throttle_in_kb=1024; broadcast_address=null; broadcast_rpc_address=null; buffer_pool_use_heap_if_exhausted=true; cas_contention_timeout_in_ms=1000; cdc_enabled=false; cdc_free_space_check_interval_ms=250; cdc_raw_directory=null; cdc_total_space_in_mb=0; client_encryption_options=&amp;lt;REDACTED&amp;gt;; cluster_name=Test Cluster; column_index_cache_size_in_kb=2; column_index_size_in_kb=64; commit_failure_policy=stop; commitlog_compression=null; commitlog_directory=null; commitlog_max_compression_buffers_in_pool=3; commitlog_periodic_queue_size=-1; commitlog_segment_size_in_mb=32; commitlog_sync=periodic; commitlog_sync_batch_window_in_ms=NaN; commitlog_sync_period_in_ms=10000; commitlog_total_space_in_mb=null; compaction_large_partition_warning_threshold_mb=100; compaction_throughput_mb_per_sec=16; concurrent_compactors=null; concurrent_counter_writes=32; concurrent_materialized_view_writes=32; concurrent_reads=32; concurrent_replicates=null; concurrent_writes=32; counter_cache_keys_to_save=2147483647; counter_cache_save_period=7200; counter_cache_size_in_mb=null; counter_write_request_timeout_in_ms=5000; credentials_cache_max_entries=1000; credentials_update_interval_in_ms=-1; credentials_validity_in_ms=2000; cross_node_timeout=false; data_file_directories=[Ljava.lang.String;@3ee0fea4; disk_access_mode=auto; disk_failure_policy=stop; disk_optimization_estimate_percentile=0.95; disk_optimization_page_cross_chance=0.1; disk_optimization_strategy=ssd; dynamic_snitch=true; dynamic_snitch_badness_threshold=0.1; dynamic_snitch_reset_interval_in_ms=600000; dynamic_snitch_update_interval_in_ms=100; enable_materialized_views=true; enable_sasi_indexes=true; enable_scripted_user_defined_functions=false; enable_user_defined_functions=false; enable_user_defined_functions_threads=true; encryption_options=null; endpoint_snitch=SimpleSnitch; file_cache_round_up=null; file_cache_size_in_mb=null; gc_log_threshold_in_ms=200; gc_warn_threshold_in_ms=1000; hinted_handoff_disabled_datacenters=[]; hinted_handoff_enabled=true; hinted_handoff_throttle_in_kb=1024; hints_compression=null; hints_directory=null; hints_flush_period_in_ms=10000; incremental_backups=false; index_interval=null; index_summary_capacity_in_mb=null; index_summary_resize_interval_in_minutes=60; initial_token=null; inter_dc_stream_throughput_outbound_megabits_per_sec=200; inter_dc_tcp_nodelay=false; internode_authenticator=null; internode_compression=dc; internode_recv_buff_size_in_bytes=0; internode_send_buff_size_in_bytes=0; key_cache_keys_to_save=2147483647; key_cache_save_period=14400; key_cache_size_in_mb=null; listen_address=localhost; listen_interface=null; listen_interface_prefer_ipv6=false; listen_on_broadcast_address=false; max_hint_window_in_ms=10800000; max_hints_delivery_threads=2; max_hints_file_size_in_mb=128; max_mutation_size_in_kb=null; max_streaming_retries=3; max_value_size_in_mb=256; memtable_allocation_type=heap_buffers; memtable_cleanup_threshold=null; memtable_flush_writers=0; memtable_heap_space_in_mb=null; memtable_offheap_space_in_mb=null; min_free_space_per_drive_in_mb=50; native_transport_flush_in_batches_legacy=true; native_transport_max_concurrent_connections=-1; native_transport_max_concurrent_connections_per_ip=-1; native_transport_max_concurrent_requests_in_bytes=-1; native_transport_max_concurrent_requests_in_bytes_per_ip=-1; native_transport_max_frame_size_in_mb=256; native_transport_max_negotiable_protocol_version=-2147483648; native_transport_max_threads=128; native_transport_port=9042; native_transport_port_ssl=null; num_tokens=256; otc_backlog_expiration_interval_ms=200; otc_coalescing_enough_coalesced_messages=8; otc_coalescing_strategy=DISABLED; otc_coalescing_window_us=200; partitioner=org.apache.cassandra.dht.Murmur3Partitioner; permissions_cache_max_entries=1000; permissions_update_interval_in_ms=-1; permissions_validity_in_ms=2000; phi_convict_threshold=8.0; prepared_statements_cache_size_mb=null; range_request_timeout_in_ms=10000; read_request_timeout_in_ms=5000; repair_session_max_tree_depth=18; request_scheduler=org.apache.cassandra.scheduler.NoScheduler; request_scheduler_id=null; request_scheduler_options=null; request_timeout_in_ms=10000; role_manager=CassandraRoleManager; roles_cache_max_entries=1000; roles_update_interval_in_ms=-1; roles_validity_in_ms=2000; row_cache_class_name=org.apache.cassandra.cache.OHCProvider; row_cache_keys_to_save=2147483647; row_cache_save_period=0; row_cache_size_in_mb=0; rpc_address=localhost; rpc_interface=null; rpc_interface_prefer_ipv6=false; rpc_keepalive=true; rpc_listen_backlog=50; rpc_max_threads=2147483647; rpc_min_threads=16; rpc_port=9160; rpc_recv_buff_size_in_bytes=null; rpc_send_buff_size_in_bytes=null; rpc_server_type=sync; saved_caches_directory=null; seed_provider=org.apache.cassandra.locator.SimpleSeedProvider{seeds=127.0.0.1}; server_encryption_options=&amp;lt;REDACTED&amp;gt;; slow_query_log_timeout_in_ms=500; snapshot_before_compaction=false; ssl_storage_port=7001; sstable_preemptive_open_interval_in_mb=50; start_native_transport=true; start_rpc=false; storage_port=7000; stream_throughput_outbound_megabits_per_sec=200; streaming_keep_alive_period_in_secs=300; streaming_socket_timeout_in_ms=86400000; thrift_framed_transport_size_in_mb=15; thrift_max_message_length_in_mb=16; thrift_prepared_statements_cache_size_mb=null; tombstone_failure_threshold=100000; tombstone_warn_threshold=1000; tracetype_query_ttl=86400; tracetype_repair_ttl=604800; transparent_data_encryption_options=org.apache.cassandra.config.TransparentDataEncryptionOptions@48524010; trickle_fsync=false; trickle_fsync_interval_in_kb=10240; truncate_request_timeout_in_ms=60000; unlogged_batch_across_partitions_warn_threshold=10; user_defined_function_fail_timeout=1500; user_defined_function_warn_timeout=500; user_function_timeout_policy=die; windows_timer_interval=1; write_request_timeout_in_ms=2000]&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;INFO [main] 2019-12-10 22:37:20,088 DatabaseDescriptor.java:381 - DiskAccessMode &amp;#39;auto&amp;#39; determined to be mmap, indexAccessMode is mmap&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;INFO [main] 2019-12-10 22:37:20,088 DatabaseDescriptor.java:439 - Global memtable on-heap threshold is enabled at 919MB&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;INFO [main] 2019-12-10 22:37:20,089 DatabaseDescriptor.java:443 - Global memtable off-heap threshold is enabled at 919MB&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;WARN [main] 2019-12-10 22:37:20,243 DatabaseDescriptor.java:579 - Only 54.609GiB free across all data volumes. Consider adding more capacity to your cluster or removing obsolete snapshots&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;INFO [main] 2019-12-10 22:37:20,281 RateBasedBackPressure.java:123 - Initialized back-pressure with high ratio: 0.9, factor: 5, flow: FAST, window size: 2000.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;INFO [main] 2019-12-10 22:37:20,281 DatabaseDescriptor.java:773 - Back-pressure is disabled with strategy org.apache.cassandra.net.RateBasedBackPressure{high_ratio=0.9, factor=5, flow=FAST}.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;INFO [main] 2019-12-10 22:37:20,430 JMXServerUtils.java:246 - Configured JMX server at: service:jmx:rmi://127.0.0.1/jndi/rmi://127.0.0.1:7199/jmxrmi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;INFO [main] 2019-12-10 22:37:20,439 CassandraDaemon.java:476 - Hostname: ryan-java-devINFO [main] 2019-12-10 22:37:20,439 CassandraDaemon.java:483 - JVM vendor/version: OpenJDK 64-Bit Server VM/1.8.0_222&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;INFO [main] 2019-12-10 22:37:20,440 CassandraDaemon.java:484 - Heap size: 3.592GiB/3.592GiB&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;INFO [main] 2019-12-10 22:37:20,440 CassandraDaemon.java:489 - Code Cache Non-heap memory: init = 2555904(2496K) used = 4285440(4185K) committed = 4325376(4224K) max = 251658240(245760K)INFO [main] 2019-12-10 22:37:20,441 CassandraDaemon.java:489 - Metaspace Non-heap memory: init = 0(0K) used = 17108928(16707K) committed = 17694720(17280K) max = -1(-1K)INFO [main] 2019-12-10 22:37:20,441 CassandraDaemon.java:489 - Compressed Class Space Non-heap memory: init = 0(0K) used = 2056736(2008K) committed = 2228224(2176K) max = 1073741824(1048576K)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;INFO [main] 2019-12-10 22:37:20,441 CassandraDaemon.java:489 - Par Eden Space Heap memory: init = 671088640(655360K) used = 161072712(157297K) committed = 671088640(655360K) max = 671088640(655360K)INFO [main] 2019-12-10 22:37:20,442 CassandraDaemon.java:489 - Par Survivor Space Heap memory: init = 83886080(81920K) used = 0(0K) committed = 83886080(81920K) max = 83886080(81920K)INFO [main] 2019-12-10 22:37:20,442 CassandraDaemon.java:489 - CMS Old Gen Heap memory: init = 3101687808(3028992K) used = 0(0K) committed = 3101687808(3028992K) max = 3101687808(3028992K)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;INFO [main] 2019-12-10 22:37:20,442 CassandraDaemon.java:491 - Classpath: /home/ubuntu/apache-cassandra-3.11.5/bin/../conf:/home/ubuntu/apache-cassandra-3.11.5/bin/../build/classes/main:/home/ubuntu/apache-cassandra-3.11.5/bin/../build/classes/thrift:/home/ubuntu/apache-cassandra-3.11.5/bin/../lib/HdrHistogram-2.1.9.jar:/home/ubuntu/apache-cassandra-3.11.5/bin/../lib/ST4-4.0.8.jar:/home/ubuntu/apache-cassandra-3.11.5/bin/../lib/airline-0.6.jar:/home/ubuntu/apache-cassandra-3.11.5/bin/../lib/antlr-runtime-3.5.2.jar:/home/ubuntu/apache-cassandra-3.11.5/bin/../lib/apache-cassandra-3.11.5.jar:/home/ubuntu/apache-cassandra-3.11.5/bin/../lib/apache-cassandra-thrift-3.11.5.jar:/home/ubuntu/apache-cassandra-3.11.5/bin/../lib/asm-5.0.4.jar:/home/ubuntu/apache-cassandra-3.11.5/bin/../lib/caffeine-2.2.6.jar:/home/ubuntu/apache-cassandra-3.11.5/bin/../lib/cassandra-driver-core-3.0.1-shaded.jar:/home/ubuntu/apache-cassandra-3.11.5/bin/../lib/commons-cli-1.1.jar:/home/ubuntu/apache-cassandra-3.11.5/bin/../lib/commons-codec-1.9.jar:/home/ubuntu/apache-cassandra-3.11.5/bin/../lib/commons-lang3-3.1.jar:/home/ubuntu/apache-cassandra-3.11.5/bin/../lib/commons-math3-3.2.jar:/home/ubuntu/apache-cassandra-3.11.5/bin/../lib/compress-lzf-0.8.4.jar:/home/ubuntu/apache-cassandra-3.11.5/bin/../lib/concurrent-trees-2.4.0.jar:/home/ubuntu/apache-cassandra-3.11.5/bin/../lib/concurrentlinkedhashmap-lru-1.4.jar:/home/ubuntu/apache-cassandra-3.11.5/bin/../lib/disruptor-3.0.1.jar:/home/ubuntu/apache-cassandra-3.11.5/bin/../lib/ecj-4.4.2.jar:/home/ubuntu/apache-cassandra-3.11.5/bin/../lib/guava-18.0.jar:/home/ubuntu/apache-cassandra-3.11.5/bin/../lib/high-scale-lib-1.0.6.jar:/home/ubuntu/apache-cassandra-3.11.5/bin/../lib/hppc-0.5.4.jar:/home/ubuntu/apache-cassandra-3.11.5/bin/../lib/jackson-core-asl-1.9.13.jar:/home/ubuntu/apache-cassandra-3.11.5/bin/../lib/jackson-mapper-asl-1.9.13.jar:/home/ubuntu/apache-cassandra-3.11.5/bin/../lib/jamm-0.3.0.jar:/home/ubuntu/apache-cassandra-3.11.5/bin/../lib/javax.inject.jar:/home/ubuntu/apache-cassandra-3.11.5/bin/../lib/jbcrypt-0.3m.jar:/home/ubuntu/apache-cassandra-3.11.5/bin/../lib/jcl-over-slf4j-1.7.7.jar:/home/ubuntu/apache-cassandra-3.11.5/bin/../lib/jctools-core-1.2.1.jar:/home/ubuntu/apache-cassandra-3.11.5/bin/../lib/jflex-1.6.0.jar:/home/ubuntu/apache-cassandra-3.11.5/bin/../lib/jna-4.2.2.jar:/home/ubuntu/apache-cassandra-3.11.5/bin/../lib/joda-time-2.4.jar:/home/ubuntu/apache-cassandra-3.11.5/bin/../lib/json-simple-1.1.jar:/home/ubuntu/apache-cassandra-3.11.5/bin/../lib/jstackjunit-0.0.1.jar:/home/ubuntu/apache-cassandra-3.11.5/bin/../lib/libthrift-0.9.2.jar:/home/ubuntu/apache-cassandra-3.11.5/bin/../lib/log4j-over-slf4j-1.7.7.jar:/home/ubuntu/apache-cassandra-3.11.5/bin/../lib/logback-classic-1.1.3.jar:/home/ubuntu/apache-cassandra-3.11.5/bin/../lib/logback-core-1.1.3.jar:/home/ubuntu/apache-cassandra-3.11.5/bin/../lib/lz4-1.3.0.jar:/home/ubuntu/apache-cassandra-3.11.5/bin/../lib/metrics-core-3.1.5.jar:/home/ubuntu/apache-cassandra-3.11.5/bin/../lib/metrics-jvm-3.1.5.jar:/home/ubuntu/apache-cassandra-3.11.5/bin/../lib/metrics-logback-3.1.5.jar:/home/ubuntu/apache-cassandra-3.11.5/bin/../lib/netty-all-4.0.44.Final.jar:/home/ubuntu/apache-cassandra-3.11.5/bin/../lib/ohc-core-0.4.4.jar:/home/ubuntu/apache-cassandra-3.11.5/bin/../lib/ohc-core-j8-0.4.4.jar:/home/ubuntu/apache-cassandra-3.11.5/bin/../lib/reporter-config-base-3.0.3.jar:/home/ubuntu/apache-cassandra-3.11.5/bin/../lib/reporter-config3-3.0.3.jar:/home/ubuntu/apache-cassandra-3.11.5/bin/../lib/sigar-1.6.4.jar:/home/ubuntu/apache-cassandra-3.11.5/bin/../lib/slf4j-api-1.7.7.jar:/home/ubuntu/apache-cassandra-3.11.5/bin/../lib/snakeyaml-1.11.jar:/home/ubuntu/apache-cassandra-3.11.5/bin/../lib/snappy-java-1.1.1.7.jar:/home/ubuntu/apache-cassandra-3.11.5/bin/../lib/snowball-stemmer-1.3.0.581.1.jar:/home/ubuntu/apache-cassandra-3.11.5/bin/../lib/stream-2.5.2.jar:/home/ubuntu/apache-cassandra-3.11.5/bin/../lib/thrift-server-0.3.7.jar:/home/ubuntu/apache-cassandra-3.11.5/bin/../lib/jsr223/*/*.jar:/home/ubuntu/apache-cassandra-3.11.5/bin/../lib/jamm-0.3.0.jar&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;INFO [main] 2019-12-10 22:37:20,443 CassandraDaemon.java:493 - JVM Arguments: [-Xloggc:/home/ubuntu/apache-cassandra-3.11.5/bin/../logs/gc.log, -ea, -XX:+UseThreadPriorities, -XX:ThreadPriorityPolicy=42, -XX:+HeapDumpOnOutOfMemoryError, -Xss256k, -XX:StringTableSize=1000003, -XX:+AlwaysPreTouch, -XX:-UseBiasedLocking, -XX:+UseTLAB, -XX:+ResizeTLAB, -XX:+UseNUMA, -XX:+PerfDisableSharedMem, -Djava.net.preferIPv4Stack=true, -XX:+UseParNewGC, -XX:+UseConcMarkSweepGC, -XX:+CMSParallelRemarkEnabled, -XX:SurvivorRatio=8, -XX:MaxTenuringThreshold=1, -XX:CMSInitiatingOccupancyFraction=75, -XX:+UseCMSInitiatingOccupancyOnly, -XX:CMSWaitDuration=10000, -XX:+CMSParallelInitialMarkEnabled, -XX:+CMSEdenChunksRecordAlways, -XX:+CMSClassUnloadingEnabled, -XX:+PrintGCDetails, -XX:+PrintGCDateStamps, -XX:+PrintHeapAtGC, -XX:+PrintTenuringDistribution, -XX:+PrintGCApplicationStoppedTime, -XX:+PrintPromotionFailure, -XX:+UseGCLogFileRotation, -XX:NumberOfGCLogFiles=10, -XX:GCLogFileSize=10M, -Xms3757M, -Xmx3757M, -Xmn800M, -XX:+UseCondCardMark, -XX:CompileCommandFile=/home/ubuntu/apache-cassandra-3.11.5/bin/../conf/hotspot_compiler, -javaagent:/home/ubuntu/apache-cassandra-3.11.5/bin/../lib/jamm-0.3.0.jar, -Dcassandra.jmx.local.port=7199, -Dcom.sun.management.jmxremote.authenticate=false, -Dcom.sun.management.jmxremote.password.file=/etc/cassandra/jmxremote.password, -Djava.library.path=/home/ubuntu/apache-cassandra-3.11.5/bin/../lib/sigar-bin, -XX:OnOutOfMemoryError=kill -9 %p, -Dlogback.configurationFile=logback.xml, -Dcassandra.logdir=/home/ubuntu/apache-cassandra-3.11.5/bin/../logs, -Dcassandra.storagedir=/home/ubuntu/apache-cassandra-3.11.5/bin/../data]&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;INFO [main] 2019-12-10 22:37:20,939 NativeLibrary.java:176 - JNA mlockall successful&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;WARN [main] 2019-12-10 22:37:20,940 StartupChecks.java:136 - jemalloc shared library could not be preloaded to speed up memory allocations&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;WARN [main] 2019-12-10 22:37:20,941 StartupChecks.java:169 - JMX is not enabled to receive remote connections. Please see cassandra-env.sh for more info.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;INFO [main] 2019-12-10 22:37:20,944 SigarLibrary.java:44 - Initializing SIGAR library&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;INFO [main] 2019-12-10 22:37:20,959 SigarLibrary.java:180 - Checked OS settings and found them configured for optimal performance.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;WARN [main] 2019-12-10 22:37:20,963 StartupChecks.java:311 - Maximum number of memory map areas per process (vm.max_map_count) 65530 is too low, recommended value: 1048575, you can change it with sysctl.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;WARN [main] 2019-12-10 22:37:20,974 StartupChecks.java:332 - Directory /home/ubuntu/apache-cassandra-3.11.5/bin/../data/data doesn&amp;#39;t exist&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;WARN [main] 2019-12-10 22:37:20,981 StartupChecks.java:332 - Directory /home/ubuntu/apache-cassandra-3.11.5/bin/../data/commitlog doesn&amp;#39;t exist&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;WARN [main] 2019-12-10 22:37:20,982 StartupChecks.java:332 - Directory /home/ubuntu/apache-cassandra-3.11.5/bin/../data/saved_caches doesn&amp;#39;t exist&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;WARN [main] 2019-12-10 22:37:20,983 StartupChecks.java:332 - Directory /home/ubuntu/apache-cassandra-3.11.5/bin/../data/hints doesn&amp;#39;t exist&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This is a Cassandra startup log I have taken from an old computer. This is only the first few lines and not even close to a full startup log. Most would agree, it is still a great deal of text.&lt;/p&gt;</description></item><item><title>Coding in Lieu of Scripting</title><link>https://blog.foundev.pro/2022/07/12/coding-in-lieu-of-scripting.html</link><pubDate>Tue, 12 Jul 2022 00:00:00 +0000</pubDate><guid>https://blog.foundev.pro/2022/07/12/coding-in-lieu-of-scripting.html</guid><description>&lt;h1&gt;Coding in Lieu of Scripting&lt;/h1&gt;&#10;&lt;p&gt;&#10;Since I "mostly" moved to support about 8 years ago now I have parsed a LOT of logs, and I enjoy it.&#10; I like to search for unknown problems before they become known at 3am, or figure out what happened exactly at&#10;a given point in time, especially when no one else seems to know. The discovery is fun and I get to tell a&#10; story with the data. At first I used the shell at lot and I rediscovered lost skills from my early days&#10; in ISP land. However, I found it very difficult to share that knowledge. Scripts were never quite portable&#10; enough, and the Windows users would just stare at me in bewilderment when I handed them a bash script &#10; Note this is before WSL was really a thing, and while I enjoy powershell support is unix centric.&#10;&lt;/p&gt;</description></item><item><title>Slavic Languages</title><link>https://blog.foundev.pro/2022/07/11/slavic-languages.html</link><pubDate>Mon, 11 Jul 2022 00:00:00 +0000</pubDate><guid>https://blog.foundev.pro/2022/07/11/slavic-languages.html</guid><description>&lt;h1 id="slavic-languages"&gt;Slavic Languages&lt;/h1&gt;&#10;&lt;p&gt;I have just started toying with Slavic Languages. Due to my family tree this has always been a bit of a toy interest of mine, butI never pursued it seriously as there seemed little need. The war in Ukraine has changed that focus and from that point on I&amp;rsquo;ve had at least one Slavic language going in the background of my language learning.&lt;/p&gt;&#10;&lt;h2 id="goals"&gt;Goals&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;I would like to be able to follow the events in Ukraine, Poland and Russia more directly and without translation.&lt;/li&gt;&#10;&lt;li&gt;Be able to have a brief conversation with anyone in those three languages someday. Mastery is unlikely while living in a country where I need to survive in a different non native language to my target language (so my normal strategy of full immersion is out).&lt;/li&gt;&#10;&lt;li&gt;If need be, help out with refugees here in France, this seems somewhat unnecessary now as of yet there are enough native speakers around to satisfy needs as the expected massive influx of Ukrainians never fully materialized in France for a variety of reasons. However, the future is hard to see, may as well get started.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="initial-thoughts"&gt;Initial thoughts&lt;/h2&gt;&#10;&lt;p&gt;I am not even the slightest of an expert in any of this and I&amp;rsquo;ve only studied some linguistics aimed at the general public. I do have a pretty considerable exposure to Latin languages now and I&amp;rsquo;m not a newbie to language learning, so I think I may have something valuable to add.&lt;/p&gt;</description></item><item><title>fallen into rust</title><link>https://blog.foundev.pro/2022/07/10/fallen-into-rust.html</link><pubDate>Sun, 10 Jul 2022 00:00:00 +0000</pubDate><guid>https://blog.foundev.pro/2022/07/10/fallen-into-rust.html</guid><description>&lt;h1 id="fallen-into-rust"&gt;fallen into rust&lt;/h1&gt;&#10;&lt;p&gt;I have just fallen into my first days of the Rust programming language. It wasn&amp;rsquo;t as difficult as I feared and I wrote a high performance log reporter and analyzer. It took longer than normal to write and I did waste 2 days trying to understand how variable life times worked and this &amp;ldquo;borrow checker&amp;rdquo; thing but I managed to write a fast and seemingly major bug free prototype that is getting some heavy usage.&lt;/p&gt;</description></item><item><title>Post a day</title><link>https://blog.foundev.pro/2022/07/09/post-a-day.html</link><pubDate>Sat, 09 Jul 2022 00:00:00 +0000</pubDate><guid>https://blog.foundev.pro/2022/07/09/post-a-day.html</guid><description>&lt;h1&gt;Post a day&lt;/h1&gt;&#10;&lt;p&gt;&#10;I have read that people try to write daily, and I always thought this was a bit silly, even if laudable. The idea of trying to take something and make it a habit is commendable. Still, I am not sure anyone will have high-quality writing every day. Furthermore, my state of mind changes so often it is difficult for me to do anything once a day. &#10; It is just not natural for me, even if I have known plenty of people who seemed to thrive on daily habits for decades.&#10;&lt;/p&gt;</description></item><item><title>Language Learning Strategy 2022</title><link>https://blog.foundev.pro/2022/05/26/language-learning-strategy-2022.html</link><pubDate>Thu, 26 May 2022 00:00:00 +0000</pubDate><guid>https://blog.foundev.pro/2022/05/26/language-learning-strategy-2022.html</guid><description>&lt;h1&gt;Language Learning Strategy 2022&lt;/h1&gt;&#10;&lt;p&gt;Taking a big departure from my traditional blogging to talk about something probably a bit less interesting for those of you who still read this for tech, sorry, you can just skip this one if you want to read up on tech. &lt;/p&gt;&#10;&lt;h2&gt;Where I am at&lt;/h2&gt;&#10;&lt;p&gt;Today I have pretty middling levels in three languages French, Spanish and Portuguese (I can have conversations in all of them, with errors of course). A common question is why don't you focus on one and master it?&#10; Fair question, Spanish I got pretty close to advanced Spanish, but life got in the way and so picked up Portuguese, that got pretty good then again life changed plans and so then came French out of necessity.&lt;/p&gt;</description></item><item><title>Trying to Get Away From Jekyll</title><link>https://blog.foundev.pro/2022/03/30/trying-to-get-away-from-jekyll.html</link><pubDate>Wed, 30 Mar 2022 00:00:00 +0000</pubDate><guid>https://blog.foundev.pro/2022/03/30/trying-to-get-away-from-jekyll.html</guid><description>&lt;h1&gt;Trying to Get Away From Jekyll&lt;/h1&gt;&#10;&lt;p&gt;&#10;This morning I tried to switch to pure HTML from Jekyll on GitHub pages and it was not trivial, I finally punted and gave up but I wanted&#10;to share the brick wall I ran into so I can try again later.&#10;&lt;/p&gt;&#10;&lt;h2&gt;why?&lt;/h2&gt;&#10;&lt;h3&gt;Access&lt;/h3&gt;&#10;&lt;p&gt;&#10;Simple, I am trying to use my computer less. When I have a thought I would like to share&#10;and say I have my phone on me, I would just like to rip out a blog post, without setting&#10;up git, getting a decent text editor, etc it's just too much work to do well.&#10;&lt;/p&gt;</description></item><item><title>Getting Index Size in DSE Search</title><link>https://blog.foundev.pro/2022/03/24/getting-indexsize-in-dse-search.html</link><pubDate>Thu, 24 Mar 2022 02:00:00 +0000</pubDate><guid>https://blog.foundev.pro/2022/03/24/getting-indexsize-in-dse-search.html</guid><description>&lt;h1&gt;Getting Index Size in DSE Search&lt;/h1&gt;&#10;&lt;p&gt;Applies to DSE Search versions 3.2 to 6.8&lt;/p&gt;&#10;&lt;p&gt;For some reason finding this information is dreadfully stupidly hard and I finally decided to write it down myself since I own it and someone may benefit from it some day.&#10;There are three ways that I know of (I am sure there is a JMX way I just do not happen to know it atm)&lt;/p&gt;</description></item><item><title>Busy Engineers Guide to Deploying on K8s Part 1 - Setting up Docker with GitHub Packages</title><link>https://blog.foundev.pro/2021/10/12/busy-engineers-guide-to-deploying-on-k8s-part-1-github-packages.html</link><pubDate>Tue, 12 Oct 2021 00:00:00 +0000</pubDate><guid>https://blog.foundev.pro/2021/10/12/busy-engineers-guide-to-deploying-on-k8s-part-1-github-packages.html</guid><description>&lt;h1&gt;Busy Engineers Guide to Deploying on K8s Part 1 - Setting up Docker with GitHub Packages&lt;/h1&gt;&#10;&lt;p&gt;Post Valid as of October 12, 2021.&lt;/p&gt;&#10;&lt;h3 id="busy-engineers-guide-to-deploying-on-k8s"&gt;Busy Engineer&amp;rsquo;s Guide to Deploying On K8s&lt;/h3&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://blog.foundev.pro/2021/10/12/busy-engineers-guide-to-deploying-on-k8s-part-1-github-packages.html"&gt;Part 1 - GitHub Packages (this post)&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://blog.foundev.pro/2021/10/12/busy-engineers-guide-to-deploying-on-k8s-part-2-kind.html"&gt;Part 2 - Kind &lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://blog.foundev.pro/2021/10/12/busy-engineers-guide-to-deploying-on-k8s-part-3-helm.html"&gt;Part 3 - Helm&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;While trying to take some coworkers through setting up Docker with GitHub Packages I ran some not obvious edges and my boss pointed out&#10;for new to Docker and new to Kubernetes people these could be totally derailing corners. I have to agree, so this series will take people front to back&#10;through setting up Kubernetes with the options most readily available to us.&lt;/p&gt;</description></item><item><title>Busy Engineers Guide to Deploying on K8s Part 2 - Kind</title><link>https://blog.foundev.pro/2021/10/12/busy-engineers-guide-to-deploying-on-k8s-part-2-kind.html</link><pubDate>Tue, 12 Oct 2021 01:00:00 +0000</pubDate><guid>https://blog.foundev.pro/2021/10/12/busy-engineers-guide-to-deploying-on-k8s-part-2-kind.html</guid><description>&lt;h1&gt;Busy Engineers Guide to Deploying on K8s Part 2 - Kind&lt;/h1&gt;&#10;&lt;p&gt;Post Valid as of October 12, 2021.&lt;/p&gt;&#10;&lt;h3 id="busy-engineers-guide-to-deploying-on-k8s"&gt;Busy Engineer&amp;rsquo;s Guide to Deploying On K8s&lt;/h3&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://blog.foundev.pro/2021/10/12/busy-engineers-guide-to-deploying-on-k8s-part-1-github-packages.html"&gt;Part 1 - GitHub Packages&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://blog.foundev.pro/2021/10/12/busy-engineers-guide-to-deploying-on-k8s-part-2-kind.html"&gt;Part 2 - Kind (this post)&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://blog.foundev.pro/2021/10/12/busy-engineers-guide-to-deploying-on-k8s-part-3-helm.html"&gt;Part 3 - Helm&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;This is a continuation from the &lt;a href="https://blog.foundev.pro/2021/10/12/busy-engineers-guide-to-deploying-on-k8s-part-1-github-packages.html"&gt;last post in the series&lt;/a&gt;. There are three primary ways&#10;to run Kubernetes locally on a notebook: &lt;a href="https://kind.sigs.k8s.io"&gt;Kind&lt;/a&gt;, &lt;a href="https://k3d.io/v5.0.0/"&gt;k3d&lt;/a&gt;, and &lt;a href="https://github.com/kubernetes/minikube"&gt;Minikube&lt;/a&gt;. I personally far prefer k3d due to it having good defaults to get&#10;up and running with stateful sets long before the other two and it can create large worker nodes, these have lead to a loyalty to the product. However, my org seems to have standardized on Kind for most of their CI so I will be covering&#10;that here as it is the easiest for my coworkers to find help and documentation. It is also an excellent product to get started with Kubernetes.&lt;/p&gt;</description></item><item><title>Busy Engineers Guide to Deploying on K8s Part 3 - Helm</title><link>https://blog.foundev.pro/2021/10/12/busy-engineers-guide-to-deploying-on-k8s-part-3-helm.html</link><pubDate>Tue, 12 Oct 2021 02:00:00 +0000</pubDate><guid>https://blog.foundev.pro/2021/10/12/busy-engineers-guide-to-deploying-on-k8s-part-3-helm.html</guid><description>&lt;h1&gt;Busy Engineers Guide to Deploying on K8s Part 3 - Helm&lt;/h1&gt;&#10;&lt;p&gt;Post Valid as of October 12, 2021.&lt;/p&gt;&#10;&lt;h3 id="busy-engineers-guide-to-deploying-on-k8s"&gt;Busy Engineer&amp;rsquo;s Guide to Deploying On K8s&lt;/h3&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://blog.foundev.pro/2021/10/12/busy-engineers-guide-to-deploying-on-k8s-part-1-github-packages.html"&gt;Part 1 - GitHub Packages&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://blog.foundev.pro/2021/10/12/busy-engineers-guide-to-deploying-on-k8s-part-2-kind.html"&gt;Part 2 - Kind &lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://blog.foundev.pro/2021/10/12/busy-engineers-guide-to-deploying-on-k8s-part-3-helm.html"&gt;Part 3 - Helm (this post)&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;Ok so now that you have Kubernetes installing in a deployment and you can see it with kubectl port-forward how to you get beyond the&#10;toy stage?&lt;/p&gt;&#10;&lt;h2 id="helm-charts"&gt;Helm Charts&lt;/h2&gt;&#10;&lt;p&gt;&lt;a href="helm.sh"&gt;Helm&lt;/a&gt; is a great way to make your app &amp;ldquo;production ready&amp;rdquo; on Kubernetes with minimal effort assuming you do not try to overthink your deployment.&#10;Helm fundamentally provides a way for us to deploy apps to kubernetes by easily changing a handful of values at deployment time or in something called a values.yaml&lt;/p&gt;</description></item><item><title>Detecting and dealing with backpressure in DSE 6.x</title><link>https://blog.foundev.pro/2021/07/28/Detecting-and-dealing-with-backpressure-in-DSE-6.html</link><pubDate>Wed, 28 Jul 2021 08:11:00 +0000</pubDate><guid>https://blog.foundev.pro/2021/07/28/Detecting-and-dealing-with-backpressure-in-DSE-6.html</guid><description>&lt;h1&gt;Detecting and dealing with backpressure in DSE 6.x&lt;/h1&gt;&#10;&lt;p&gt;Several years ago DataStax change DataStax Enterprise from a version of Cassandra with some closed source plugins and a handful of fixes most of which were backports of&#10;fixes in very old versions, to &lt;a href="https://www.datastax.com/blog/dse-advanced-performance-apache-cassandratm-goes-turbo"&gt;a fundamentally different architecture&lt;/a&gt;. This new architecure we will&#10;refer to as TPC, however, there were also several internals that were changed that may have relied or depended on TPC but were not actually themselves part of TPC.&lt;/p&gt;</description></item><item><title>Creating a Spark cluster with Cass Operator</title><link>https://blog.foundev.pro/2021/06/08/creating-a-spark-cluster-with-cass-operator.html</link><pubDate>Tue, 08 Jun 2021 00:00:00 +0000</pubDate><guid>https://blog.foundev.pro/2021/06/08/creating-a-spark-cluster-with-cass-operator.html</guid><description>&lt;h1 id="creating-a-spark-cluster-with-cass-operator"&gt;Creating a Spark cluster with Cass Operator&lt;/h1&gt;&#10;&lt;p&gt;This is not officially supported as of June 8, 2021 but I am including it anyway since it is not obvious and documented anywhere. There are cases where for some POC or simple&#10;thing you want to test out in development this maybe a desirable thing to have handy (I use it to run clusters on my notebook).&lt;/p&gt;&#10;&lt;p&gt;First install the cass-operator by running the following &lt;a href="https://helm.sh/docs/intro/install/"&gt;helm commands&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Random Kubernetes Failures and Node Size</title><link>https://blog.foundev.pro/2021/03/09/random-k8s-failures-and-node-size.html</link><pubDate>Tue, 09 Mar 2021 00:00:00 +0000</pubDate><guid>https://blog.foundev.pro/2021/03/09/random-k8s-failures-and-node-size.html</guid><description>&lt;h1&gt;Random Kubernetes Failures and Node Size&lt;/h1&gt;&#10;I had a report of ingress failing on traefik randomly during a test job and since it worked on a local workstation the belief was it had to be a problem with traefik. I looked at the logs and asked them to spin up bigger nodes for the test and it fixed things.&#10;&lt;p&gt;The reason the beefier machines come into play are varied but ultimately come down to &amp;ldquo;no free lunch&amp;rdquo;. It all started with these log entries in traefik:&lt;/p&gt;</description></item><item><title>The Joy and Pain of Swagger</title><link>https://blog.foundev.pro/2021/03/05/the-joy-and-pain-of-swagger.html</link><pubDate>Fri, 05 Mar 2021 00:00:00 +0000</pubDate><guid>https://blog.foundev.pro/2021/03/05/the-joy-and-pain-of-swagger.html</guid><description>&lt;h1&gt;The Joy and Pain of Swagger&lt;/h1&gt;&#10;&lt;p&gt;I have had to use &lt;a href="https://swagger.io"&gt;Swagger&lt;/a&gt; for many a project since my first introduction to it while working for an ecommerce site in 2015. I did like being able to&#10;easily convert documentation into viewable API docs complete with executable examples and forms ready to go that let me actually try out my new API. In many ways it is the closest&#10;to the promise of API first development.&lt;/p&gt;</description></item><item><title>Why I Don't Cobra</title><link>https://blog.foundev.pro/2021/03/04/why-I-dont-cobra.html</link><pubDate>Thu, 04 Mar 2021 00:00:00 +0000</pubDate><guid>https://blog.foundev.pro/2021/03/04/why-I-dont-cobra.html</guid><description>&lt;h1&gt;Why I Don't Cobra&lt;/h1&gt;&#10;&lt;p&gt;So I just implemented this &lt;a href="https://github.com/rsds143/astra-cli"&gt;DataStax Astra CLI&lt;/a&gt; interface and it has gotten some attention where I work. One of the developers&#10;who had worked on a similar tool had suggested I use cobra to build a command line interface.&lt;/p&gt;&#10;&lt;h2 id="code-size"&gt;Code size&lt;/h2&gt;&#10;&lt;p&gt;I explained to him that I actually had a lot of experience with &lt;a href="https://github.com/spf13/cobra"&gt;Cobra&lt;/a&gt; and that I thought it was an&#10;excellent library with lots of great support for nested commands, it also &lt;a href="https://github.com/spf13/cobra/blob/master/go.sum"&gt;had lots of transitive dependencies&lt;/a&gt; (313 lines in the go.sum at the time of this post),&#10;and I&amp;rsquo;ve discovered that it actually can bloat the size of the executable quite a bit. Therefore I had elected to&#10;use the standard library to build my command line flags. Admittedly, I&amp;rsquo;ve had to do a lot more work to actually build&#10;my commandline interface, I did kept the executable size to under 4 mb for all platforms.&lt;/p&gt;</description></item><item><title>Tuning Indexing Speed in DSE Search 5.x</title><link>https://blog.foundev.pro/2021/02/26/tuning-indexing-speed-dse-search-5.html</link><pubDate>Fri, 26 Feb 2021 00:00:00 +0000</pubDate><guid>https://blog.foundev.pro/2021/02/26/tuning-indexing-speed-dse-search-5.html</guid><description>&lt;h1&gt;Tuning Indexing Speed in DSE Search 5.x&lt;/h1&gt;&#10;What follows is a summary of the things you need to consider dealing with indexing speed problems in DSE 5.x (note the model of indexing is wildly different in DSE 6.x and will not apply, I will have a guide on that soon).&#10;&lt;h2 id="dropped-mutations"&gt;Dropped Mutations&lt;/h2&gt;&#10;&lt;p&gt;With Solr 5.x dropped mutations have three causes over regular Cassandra:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;During the merging of Solr indexes, you can &amp;ldquo;stall&amp;rdquo; due to configuration limits.&lt;/li&gt;&#10;&lt;li&gt;By default, Solr indexing is very aggressive and can starve IO, all activities will slow, and the cluster may experience dropped mutations.&lt;/li&gt;&#10;&lt;li&gt;Back pressure leading to drops. If QueueWeight in the com.datastax.bdp.search.keyspace_name.table_name.IndexPool MBean is greater than back_pressure_threshold_per_core, back pressure is happening.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;To minimize IO contention and merge stalling do the following steps:&lt;/p&gt;</description></item><item><title>A Tale of Two Vims</title><link>https://blog.foundev.pro/2021/02/23/a-tale-of-two-vims.html</link><pubDate>Tue, 23 Feb 2021 00:00:00 +0000</pubDate><guid>https://blog.foundev.pro/2021/02/23/a-tale-of-two-vims.html</guid><description>&lt;h1&gt;A Tale of Two Vims&lt;/h1&gt;&#10;&lt;p&gt;I have two primary vim onfigurations depending on what I am feeling. I have my &amp;ldquo;everything is modern&amp;rdquo; configuration that I will bring out if I need to get a lot of work done. Which is below.&#10;This has autocomplete, nice dark theme, git integration, airline like, nerdtree, ctrlp, and with COC it has strong support for nearly every language. It is like running VSCode in the terminal, works fantastique.&lt;/p&gt;</description></item><item><title>Configuring UFW with Mosh support</title><link>https://blog.foundev.pro/2021/02/23/ufw-with-mosh.html</link><pubDate>Tue, 23 Feb 2021 00:00:00 +0000</pubDate><guid>https://blog.foundev.pro/2021/02/23/ufw-with-mosh.html</guid><description>&lt;h1&gt;Configuring UFW with Mosh support&lt;/h1&gt;&#10;&lt;p&gt;&lt;a href="https://blink.sh/"&gt;Mosh&lt;/a&gt; is kind of my secret weapon for working remotely but getting it configured to be allowed through the firewall is something I always seem to forget. So here is my&#10;UFW script I use for new servers with mosh added in:&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;sudo ufw default deny incoming&#10;sudo ufw allow 22/tcp&#10;# this is hte part that allows mosh to work&#10;sudo ufw allow 60000:61000/udp&#10;sudo ufw enable&#10;&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>Getting the DataStax cass-operator working on Mac</title><link>https://blog.foundev.pro/2021/02/23/kubernetes-cassandra-local-workstation.html</link><pubDate>Tue, 23 Feb 2021 00:00:00 +0000</pubDate><guid>https://blog.foundev.pro/2021/02/23/kubernetes-cassandra-local-workstation.html</guid><description>&lt;h1&gt;Getting the DataStax cass-operator working on Mac&lt;/h1&gt;&#10;&lt;p&gt;Just leaving this here for anyone coming back to this later. This works as of Feb 23 2021 on Big Sur&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;install docker desktop &lt;a href="https://www.docker.com/products/docker-desktop"&gt;https://www.docker.com/products/docker-desktop&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;install k3d &lt;a href="https://github.com/rancher/k3d#get"&gt;https://github.com/rancher/k3d#get&lt;/a&gt; you can just run &lt;code&gt;curl -s https://raw.githubusercontent.com/rancher/k3d/main/install.sh | bash&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;create cluster: &lt;code&gt;k3d cluster create&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;install operator manifest &lt;code&gt;kubectl create -f https://raw.githubusercontent.com/datastax/cass-operator/v1.5.1/docs/user/cass-operator-manifests-v1.19.yaml&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;download a cassandra data center yaml &lt;code&gt;curl -O https://gist.githubusercontent.com/rsds143/0e9263ed4287d888fab36eb3e4aec502/raw/f919172c64452a2277b7523d680a9e12916d0d39/cassandra-dc.yaml&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;run &lt;code&gt;kubectl create -f cassandra-dc.yaml --namespace cass-operator&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;wait for cassandra to come up &lt;code&gt;kubectl logs cluster1-dc1-default-sts-0 --namespace cass-operator server-system-logger&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;get username &lt;code&gt;export CQLUSER=$(kubectl get secret cluster1-superuser -o json -n cass-operator | grep \&amp;quot;username\&amp;quot; | sed -E 's/\&amp;quot;(.+)\&amp;quot;: \&amp;quot;(.+)\&amp;quot;/\2/' | base64 -d)&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;get password &lt;code&gt;export CQLPASS=$(kubectl get secret cluster1-superuser -o json -n cass-operator | grep \&amp;quot;password\&amp;quot; | sed -E 's/\&amp;quot;(.+)\&amp;quot;: \&amp;quot;(.+)\&amp;quot;/\2/' | sed -E 's/,*$//g' | base64 -d )&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;log into cqlsh &lt;code&gt;kubectl exec -it -n cass-operator cluster1-dc1-default-sts-0 -- cqlsh -u $CQLUSER -p $CQLPASS&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;enjoy your cassandra cluster&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;The yaml I have linked too above is here&lt;/p&gt;</description></item><item><title>minimal zsh prompt that is useful</title><link>https://blog.foundev.pro/2021/02/23/minimal-zsh.html</link><pubDate>Tue, 23 Feb 2021 00:00:00 +0000</pubDate><guid>https://blog.foundev.pro/2021/02/23/minimal-zsh.html</guid><description>&lt;h1&gt;minimal zsh prompt that is useful&lt;/h1&gt;&#10;So oh-my-zsh is great but I like to do as much as I can on my own So I came up with a basic zsh prompt that gives me enough &#10;information to know what server I am on and what directory I am in (also git branch)&#10;&lt;p&gt;Enjoy&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f7f7f7;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;autoload -Uz vcs_info&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;precmd&lt;span style="color:#0550ae"&gt;()&lt;/span&gt; &lt;span style="color:#0550ae"&gt;{&lt;/span&gt; vcs_info &lt;span style="color:#0550ae"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#57606a"&gt;# Format the vcs_info_msg_0_ variable&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;zstyle &lt;span style="color:#0a3069"&gt;&amp;#39;:vcs_info:git:*&amp;#39;&lt;/span&gt; formats &lt;span style="color:#0a3069"&gt;&amp;#39; %b&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;setopt PROMPT_SUBST&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#57606a"&gt;# export PATH=$HOME/bin:/usr/local/bin:$PATH&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#57606a"&gt;# &lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#57606a"&gt;# %(?.√.?%?) if return code ? is 0, show √, else show ?%?&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#57606a"&gt;# %? exit code of previous command&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#57606a"&gt;# %1~ current working dir, shortening home to ~, show only last 1 element&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#57606a"&gt;# %# # with root privileges, % otherwise&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#57606a"&gt;# %B %b start/stop bold&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#57606a"&gt;# %F{...} text (foreground) color, see table&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#57606a"&gt;# %f reset to default textcolor&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6639ba"&gt;export&lt;/span&gt; &lt;span style="color:#953800"&gt;PROMPT&lt;/span&gt;&lt;span style="color:#0550ae"&gt;=&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#39;%(?.%F{green}√.%F{red}?%?)%f %B%F{240}%1~%f%b@%F{184}%m%f %F{green}${vcs_info_msg_0_}%f %# &amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#6639ba"&gt;export&lt;/span&gt; &lt;span style="color:#953800"&gt;PATH&lt;/span&gt;&lt;span style="color:#0550ae"&gt;=&lt;/span&gt;&lt;span style="color:#953800"&gt;$PATH&lt;/span&gt;:&lt;span style="color:#953800"&gt;$HOME&lt;/span&gt;/go/bin:&lt;span style="color:#953800"&gt;$HOME&lt;/span&gt;/.cargo/bin&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>Quick IP scan without nmap</title><link>https://blog.foundev.pro/2021/02/23/quick-ip-scan-without-nmap.html</link><pubDate>Tue, 23 Feb 2021 00:00:00 +0000</pubDate><guid>https://blog.foundev.pro/2021/02/23/quick-ip-scan-without-nmap.html</guid><description>&lt;h1&gt;Quick IP scan without nmap&lt;/h1&gt;&#10;&lt;p&gt;So nmap isn&amp;rsquo;t always available to figure out what devices are up on your local network or where they may have moved too after you installed that new router but python is usually around.&#10;This script will ping your local network for ip addresses. It is as basic as you can get and does not work on Windows. Some day I would like to make a better version of this, when I do, I will&#10;link it back to here. In the meantime this maybe useful.&lt;/p&gt;</description></item><item><title>Apache NiFi and Cassandra</title><link>https://blog.foundev.pro/2021/02/08/apache-nifi-cassandra-sprocs.html</link><pubDate>Mon, 08 Feb 2021 00:00:00 +0000</pubDate><guid>https://blog.foundev.pro/2021/02/08/apache-nifi-cassandra-sprocs.html</guid><description>&lt;h1&gt;Apache NiFi and Cassandra&lt;/h1&gt;&#10;&lt;p&gt;Looked at Apache NiFi for the first time in a long time as someone didn&amp;rsquo;t know if it had support for stored procedures or not. I looked up the latest source&#10;and sure enough I see no stored procedures used for any of the statements. Looking at the &lt;a href="https://github.com/apache/nifi/blob/953327cdf587c6b68765c0d32508873d8a0031e7/nifi-nar-bundles/nifi-cassandra-bundle/nifi-cassandra-processors/src/main/java/org/apache/nifi/processors/cassandra/PutCassandraRecord.java"&gt;PutCassandraRecord.java&lt;/a&gt; I see inserts and updates are just statements that are never prepared:&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt; query = generateInsert(cassandraTable, schema, recordContentMap);&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;and&lt;/p&gt;</description></item><item><title>Heap Size Around 32 GB</title><link>https://blog.foundev.pro/2021/02/03/heap-size-around-31gb.html</link><pubDate>Wed, 03 Feb 2021 00:00:00 +0000</pubDate><guid>https://blog.foundev.pro/2021/02/03/heap-size-around-31gb.html</guid><description>&lt;h1&gt;Heap Size Around 32 GB&lt;/h1&gt;&#10;note: originally written Feb 3 2021&#10;&lt;p&gt;There was a question this morning around a pretty common discussion point around 31 gb versus 32 gb of heap. This &lt;a href="http://java-performance.info/over-32g-heap-java/"&gt;article discusses this in more detail&lt;/a&gt;, the key point follows:&lt;/p&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;Be careful when you increase your application heap size over 32G (from under 32G to over 32G) – JVM switches to 64 bit object references at that moment, which means that your application may end up with less available heap space. A rule of thumb is to jump from 32G right to 37-38G and continue adding memory from that point. The actual area of “grey” territory depends on your application – the bigger an average Java object in your application, the smaller is the overhead.&lt;/p&gt;</description></item><item><title>coc-vim the perfect compliment to vim</title><link>https://blog.foundev.pro/2020/06/14/coc-vim.html</link><pubDate>Sun, 14 Jun 2020 00:00:00 +0000</pubDate><guid>https://blog.foundev.pro/2020/06/14/coc-vim.html</guid><description>&lt;h1&gt;coc-vim the perfect compliment to vim&lt;/h1&gt;&#10;&lt;p&gt;Vi(m) has been the reliable editor of my career. I&amp;rsquo;ve either used Vi bindings in my IDEs or used Vim itself for my editor of choice. Some of this was because I was working on servers a lot during my career as an admin, sometimes it was because the dynamic languages I liked using don&amp;rsquo;t or didn&amp;rsquo;t have great IDE support so may as well use something I&amp;rsquo;m familar with and is light weight.&lt;/p&gt;</description></item><item><title>Picking a web microframework for an existing Scala codebase</title><link>https://blog.foundev.pro/2020/05/27/picking-a-microframework.html</link><pubDate>Wed, 27 May 2020 00:00:00 +0000</pubDate><guid>https://blog.foundev.pro/2020/05/27/picking-a-microframework.html</guid><description>&lt;h1&gt;Picking a web microframework for an existing Scala codebase&lt;/h1&gt;&#10;&lt;p&gt;I&amp;rsquo;ve had to use this at work the last couple of weeks. We had a &amp;ldquo;home grown&amp;rdquo; framework for a new application&#10;we&amp;rsquo;re working and the first thing I did was try and rip that out (new project so didn&amp;rsquo;t have URL and parameter sanitization&#10;anyway to do routes, etc).&lt;/p&gt;&#10;&lt;p&gt;However, being that the group I was working had bad expierences in the past with frameworks, I had to settle on something that was light weight, integrated&#10;with jetty and allowed us to work the way that was comfortable for us as team (also it had to work with Scala).&lt;/p&gt;</description></item><item><title>Starting Cassandra - Data modeling in the brief</title><link>https://blog.foundev.pro/2020/02/05/getting-started-cassandra-part-3.html</link><pubDate>Wed, 05 Feb 2020 00:00:00 +0000</pubDate><guid>https://blog.foundev.pro/2020/02/05/getting-started-cassandra-part-3.html</guid><description>&lt;h1&gt;Starting Cassandra - Data modeling in the brief&lt;/h1&gt;&#10;&lt;p&gt;Cassandra data modeling isn&amp;rsquo;t really something you can do &amp;ldquo;in the brief&amp;rdquo; and is itself a subject that can take years to fully grasp, but this should be a good starting point.&lt;/p&gt;&#10;&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;&#10;&lt;p&gt;Cassandra distributes data around the cluster via the &lt;em&gt;partition&lt;/em&gt; &lt;em&gt;key&lt;/em&gt;.&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f7f7f7;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#cf222e"&gt;CREATE&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#cf222e"&gt;TABLE&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;my_key&lt;span style="color:#1f2328"&gt;.&lt;/span&gt;my_table_by_postal_code&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;postal_code&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#6639ba"&gt;text&lt;/span&gt;&lt;span style="color:#1f2328"&gt;,&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;id&lt;span style="color:#fff"&gt; &lt;/span&gt;uuid&lt;span style="color:#1f2328"&gt;,&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;balance&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#6639ba"&gt;float&lt;/span&gt;&lt;span style="color:#1f2328"&gt;,&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#cf222e"&gt;PRIMARY&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#cf222e"&gt;KEY&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;postal_code&lt;span style="color:#1f2328"&gt;,&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;id&lt;span style="color:#1f2328"&gt;));&lt;/span&gt;&lt;span style="color:#fff"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;In the above table the &lt;em&gt;partition&lt;/em&gt; &lt;em&gt;key&lt;/em&gt; is &lt;code&gt;postal_code&lt;/code&gt; and the &lt;em&gt;clustering&lt;/em&gt; &lt;em&gt;column&lt;/em&gt; is&lt;code&gt;id&lt;/code&gt;. The &lt;em&gt;partition&lt;/em&gt; &lt;em&gt;key&lt;/em&gt; will locate the data on the cluster for us. The clustering column allows us multiple rows per &lt;em&gt;partition&lt;/em&gt; &lt;em&gt;key&lt;/em&gt; so that we can filter how much data we read per partition.&#10;The &amp;lsquo;optimal&amp;rsquo; query is one that retrieves data from only one node and not so much data that GC pressure or latency issues result. The following query is breaking that rule and retrieving 2 partitions at once via the IN parameter.&lt;/p&gt;</description></item><item><title>Starting Cassandra - Load testing Cassandra in brief</title><link>https://blog.foundev.pro/2020/02/04/getting-started-cassandra-part-2.html</link><pubDate>Tue, 04 Feb 2020 00:00:00 +0000</pubDate><guid>https://blog.foundev.pro/2020/02/04/getting-started-cassandra-part-2.html</guid><description>&lt;h1&gt;Starting Cassandra - Load testing Cassandra in brief&lt;/h1&gt;&#10;&lt;p&gt;An opinionated guide on the &amp;ldquo;correct&amp;rdquo; way to load test Cassandra. I&amp;rsquo;m aiming to keep this short so I&amp;rsquo;m going to leave out a &lt;em&gt;lot&lt;/em&gt; of the nuance that one would normally get into when talking about load testing cassandra.&lt;/p&gt;&#10;&lt;h2 id="if-you-have-no-data-model-in-mind"&gt;If you have no data model in mind&lt;/h2&gt;&#10;&lt;p&gt;Use cassandra stress since it&amp;rsquo;s around:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;first initialize the keyspace with RF3 &lt;code&gt;cassandra-stress &amp;quot;write cl=ONE no-warmup -col size=FIXED(15000) -schema replication(strategy=SimpleStrategy,factor=3)&amp;quot;&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;second run stress &lt;code&gt;cassandra-stress &amp;quot;mixed n=1000k cl=ONE -col size=FIXED(15000)&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;repeat as often as you&amp;rsquo;d like with as many clients as you want.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="if-you-have-a-specific-data-model-in-mind"&gt;If you have a specific data model in mind&lt;/h2&gt;&#10;&lt;p&gt;You can use cassandra-stress, but I suspect you&amp;rsquo;re going to find your data model isn&amp;rsquo;t supported (collections for example) or that you don&amp;rsquo;t have the required PHD to make it work the way you want. There are probably 2 dozen options from here you can use to build your load test, some of the more popular ones are gatling, jmeter, and tlp-stress. My personal favorite for this though, write a small simple python or java program that replicates your use case accurately in your own code, using a faker library to generate your data. This takes more time but you tend to have less surprises in production as it will accurately model your code.&lt;/p&gt;</description></item><item><title>Starting Cassandra - Setting up a Multi-DC environment</title><link>https://blog.foundev.pro/2020/02/03/getting-started-cassandra-part1.html</link><pubDate>Mon, 03 Feb 2020 00:00:00 +0000</pubDate><guid>https://blog.foundev.pro/2020/02/03/getting-started-cassandra-part1.html</guid><description>&lt;h1&gt;Starting Cassandra - Setting up a Multi-DC environment&lt;/h1&gt;&#10;&lt;p&gt;This is a quick and dirty opinionated guide to setting up a Cassandra cluster with multiple data centers.&lt;/p&gt;&#10;&lt;h2 id="a-new-cluster"&gt;A new cluster&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;In cassandra.yaml set &lt;code&gt;endpoint_snitch: GossipingPropertyFileSnitch&lt;/code&gt;, some prefer PropertyFileSnitch for the ease of pushing out one file. GossipingPropertyFileSnitch is harder to get wrong in my experience.&lt;/li&gt;&#10;&lt;li&gt;set dc in cassandra-rackdc.properties. Set to be whatever dc you want that node to be in. Ignore rack until you really need it, 8/10 people that use racks do it wrong the first time, and it&amp;rsquo;s slightly painful to unwind.&lt;/li&gt;&#10;&lt;li&gt;finish adding all of your nodes.&lt;/li&gt;&#10;&lt;li&gt;if using authentication, set &lt;code&gt;system_auth&lt;/code&gt; keyspace to use NetworkTopologyStrategy in cqlsh with RF 3 (or == number of replicas if less than 3 per dc) for each datacenter you&amp;rsquo;ve created &lt;code&gt;ALTER KEYSPACE system_auth WITH REPLICATION= {'class' : 'NetworkTopologyStrategy', 'data_center_name' : 3, 'data_center_name' : 3};&lt;/code&gt;, run repair after changing RF&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;nodetool repair -pr system_auth&lt;/code&gt; on each node in the cluster on the new keyspace.&lt;/li&gt;&#10;&lt;li&gt;create your new keyspaces for your app with RF 3 in each dc (much like you did for the &lt;code&gt;system_auth&lt;/code&gt; step above).&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;nodetool repair -pr whatever_new_keyspace&lt;/code&gt; on each node in the cluster on the new keyspace.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="an-existing-cluster"&gt;An existing cluster&lt;/h2&gt;&#10;&lt;p&gt;This is harder and involves more work and more options, but I&amp;rsquo;m going to discuss the way that gets you into the least amount of trouble operationally.&lt;/p&gt;</description></item><item><title>Snakeyaml error handling is tough</title><link>https://blog.foundev.pro/2019/12/27/snakeyaml-perms.html</link><pubDate>Fri, 27 Dec 2019 09:30:00 -0600</pubDate><guid>https://blog.foundev.pro/2019/12/27/snakeyaml-perms.html</guid><description>&lt;h1&gt;"Snakeyaml error handling is tough"&lt;/h1&gt;&#10;&lt;p&gt;Cassandra for years has relied on snakeyaml to parse configuration files, and it does a fine job, really not a lot of complaints. Until one day a colleague of mine discovered an issue where a permission issue incorrectly reported as an invalid yaml file (complete with the supposedly offending key). Digging into the source code and trying to match up the message. I found that &lt;a href="https://github.com/apache/cassandra/blob/06209037ea56b5a2a49615a99f1542d6ea1b2947/src/java/org/apache/cassandra/config/YamlConfigurationLoader.java#L128"&gt;we were handling YAMLException&lt;/a&gt;&lt;/p&gt;</description></item><item><title>MVP how minimal</title><link>https://blog.foundev.pro/2018/12/20/mvp-how-minimal.html</link><pubDate>Thu, 20 Dec 2018 20:00:00 +0000</pubDate><guid>https://blog.foundev.pro/2018/12/20/mvp-how-minimal.html</guid><description>&lt;h1&gt;MVP how minimal&lt;/h1&gt;&#10;MVPs or Minimum Viable Products are pretty contentious ideas for something seemingly simple. Depending on background and where pepole are coming from experience wise those terms carry radically different ideas.&#10;In recent history I've seen up close two extreme constrasting examples of MVP:&#10;&lt;ul&gt;&#10;&lt;li&gt;Mega Minimal: website and db, mostly manual on the backend&lt;/li&gt;&#10;&lt;li&gt;Mega Mega: provisioning system, dynamic tuning of systems via ML, automated operations, monitoring a few others I&amp;rsquo;m leaving out.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="feedback"&gt;Feedback&lt;/h2&gt;&#10;&lt;p&gt;If we&amp;rsquo;re evaluating which approach gives us more feedback, Mega Minimal MVP is gonna win hands down here. Some will&#10;counter they don&amp;rsquo;t want to give people a bad impression with a limited product and that&amp;rsquo;s fair, but it&amp;rsquo;s better than no impression (the dreaded never shipped MVP). The Mega Mega&#10;MVP I referenced took months to demo. only had one of those checkboxes setup and wasn&amp;rsquo;t ever demod again. So we can categorical say that failed&#10;at getting any feedback.&lt;/p&gt;</description></item><item><title>Surprise Go is ok for me now</title><link>https://blog.foundev.pro/2018/12/13/surprise-go-is-ok.html</link><pubDate>Thu, 13 Dec 2018 20:23:00 +0000</pubDate><guid>https://blog.foundev.pro/2018/12/13/surprise-go-is-ok.html</guid><description>&lt;h1&gt;Surprise Go is ok for me now&lt;/h1&gt;&#10;&lt;p&gt;&lt;em&gt;EDIT: this is an old post &lt;a href="https://lostechies.com/ryansvihla/2018/12/13/surprise-go-is-ok/"&gt;from my old blog&lt;/a&gt; I have updated it here and ported it over here for archival reasons.&lt;/em&gt;&lt;/p&gt;&#10;&lt;p&gt;I&amp;rsquo;m surprised to say this. I am ok using Go now. It&amp;rsquo;s not my style, but I can build almost anything I want to with it, and the tooling around it continues to improve.&lt;/p&gt;&#10;&lt;p&gt;About seven months ago, I wrote about all the things I didn&amp;rsquo;t care for in Go and now I either no longer am so bothered by it, or things have improved.&lt;/p&gt;</description></item><item><title>Lessons from a year of Golang</title><link>https://blog.foundev.pro/2018/05/07/lessons-from-a-year-of-go.html</link><pubDate>Mon, 07 May 2018 13:16:00 +0000</pubDate><guid>https://blog.foundev.pro/2018/05/07/lessons-from-a-year-of-go.html</guid><description>&lt;h1&gt;Lessons from a year of Golang&lt;/h1&gt;&#10;I’m hoping to share in a non-negative way help others avoid the pitfalls I ran into with my most recent work building infrastructure software on top of a Kubernetes using Go, it sounded like an awesome job at first but I ran into a lot of problems getting productive. &#10;&lt;p&gt;This isn’t meant to evaluate if you should pick up Go or tell you what you should think of it, this is strictly meant to help people out that are new to the language but experienced in Java, Python, Ruby, C#, etc and have read some basic Go getting started guide.&lt;/p&gt;</description></item><item><title>Cassandra - Batch Loading Without the Batch The Nuanced Edition</title><link>https://blog.foundev.pro/2016/04/29/cassandra-batch-loading-without-the-batch-the-nuanced-edition.html</link><pubDate>Fri, 29 Apr 2016 16:03:56 +0000</pubDate><guid>https://blog.foundev.pro/2016/04/29/cassandra-batch-loading-without-the-batch-the-nuanced-edition.html</guid><description>&lt;h1&gt;Cassandra - Batch Loading Without the Batch The Nuanced Edition&lt;/h1&gt;&#10; My [previous post on this subject](https://blog.foundev.pro/2014/08/28/cassandra-batch-loading-without-the-batch-keyword.html) has proven extraordinarily popular and I get commentary on it all the time, most of it quite good. It has however, gotten a decent number of comments from people quibbling with the nuance of the post and pointing out it’s failings, which is fair because I didn’t explicitly spell this out as a “framework of thinking” blog post or a series of principles to consider. This is the tension between making something approachable and understandable to the new user but still technically correct for the advanced one. Because of where Cassandra was at the time and the user base I was encountering day to day, I took the approach of simplification for the sake of understanding. However, now I think is a good time to write this up with all the complexity and detail of a production implementation and the tradeoffs to consider.&#10;&lt;h3 id="tldr"&gt;&lt;em&gt;TLDR&lt;/em&gt;&lt;/h3&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&lt;em&gt;Find the ideal write size it can make a 10x difference in perf (10k-100k is common).&lt;/em&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;em&gt;Limit threads in flight when writing.&lt;/em&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;em&gt;Use tokenaware unlogged batches if you need to get to your ideal size.&lt;/em&gt;&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;&lt;em&gt;Details on all this below.&lt;/em&gt;&lt;/p&gt;</description></item><item><title>CASSANDRA LOCAL_QUORUM SHOULD STAY LOCAL</title><link>https://blog.foundev.pro/2016/04/21/cassandra-local_quorum-should-stay-local.html</link><pubDate>Thu, 21 Apr 2016 00:00:00 +0000</pubDate><guid>https://blog.foundev.pro/2016/04/21/cassandra-local_quorum-should-stay-local.html</guid><description>&lt;h1&gt;CASSANDRA LOCAL_QUORUM SHOULD STAY LOCAL&lt;/h1&gt;&#10;&lt;p id="0479"&gt;&#10; A couple of times a week I get a question where someone wants to know how to “failover” to a remote DC in the driver if the local Cassandra DC fails or even if there is only a couple of nodes in the local data center that are down.&#10;&lt;/p&gt;&#10;&lt;p id="32eb"&gt;&#10; Frequently the customer is using LOCAL_QUORUM or LOCAL_ONE at our suggestion to pin all reads and writes to the local data center often times at their request to help with p99 latencies. But now they want the driver to “do the right thing” and start using replicas in another data center when there is a local outage.&#10;&lt;/p&gt;</description></item><item><title>Connection to Oracle From Spark</title><link>https://blog.foundev.pro/2016/04/10/connection-to-oracle-from-spark.html</link><pubDate>Sun, 10 Apr 2016 00:00:00 +0000</pubDate><guid>https://blog.foundev.pro/2016/04/10/connection-to-oracle-from-spark.html</guid><description>&lt;h1&gt;Connection to Oracle From Spark&lt;/h1&gt;&#10;&lt;p id="9b2b"&gt;&#10; For some silly reason there is a has been a fair amount of difficulty in reading and writing to Oracle from Spark when using DataFrames.&#10;&lt;/p&gt;&#10;&lt;p id="8d92"&gt;&#10; SPARK-10648 — &lt;a href="https://issues.apache.org/jira/browse/SPARK-10648" rel="nofollow" data-href="https://issues.apache.org/jira/browse/SPARK-10648"&gt;Spark-SQL JDBC fails to set a default precision and scale when they are not defined in an oracle schema.&lt;/a&gt;&#10;&lt;/p&gt;&#10;&lt;p id="819b"&gt;&#10; This issue manifests itself when you have numbers in your schema with no precision or scale and attempt to read. They added the following dialect here&#10;&lt;/p&gt;</description></item><item><title>Reflection Scala-2.10 and Spark weird errors when saving to Cassandra</title><link>https://blog.foundev.pro/2016/04/09/reflection-scala-2-10-and-spark-weird-errors-when-saving-to-cassandra.html</link><pubDate>Sat, 09 Apr 2016 00:00:00 +0000</pubDate><guid>https://blog.foundev.pro/2016/04/09/reflection-scala-2-10-and-spark-weird-errors-when-saving-to-cassandra.html</guid><description>&lt;h1&gt;Reflection Scala-2.10 and Spark weird errors when saving to Cassandra&lt;/h1&gt;&#10;&lt;p id="d1a6"&gt;&#10; This originally started with this &lt;a href="http://stackoverflow.com/questions/35024274/java-io-invalidclassexception-org-apache-spark-sql-types-timestamptype-and-java/35187029#35187029" rel="nofollow" data-href="http://stackoverflow.com/questions/35024274/java-io-invalidclassexception-org-apache-spark-sql-types-timestamptype-and-java/35187029#35187029"&gt;SO question&lt;/a&gt;, and I’ll be honest I was flummoxed for a couple of days looking at this (in no small part because the code was doing a lot). But at some point I was able to isolate all issues down to dataFrame.saveToCassandra. Every 5 or so runs I’d get one or two errors:&#10;&lt;/p&gt;&#10;&lt;script src="https://gist.github.com/b3b0d2b0c8a3cc15d7c6e651425dddc0.js"&gt;&lt;/script&gt;&#10;&lt;p id="716c"&gt;&#10; or&#10;&lt;/p&gt;&#10;&lt;script src="https://gist.github.com/820a6def4f9c97dd73561dd33e84804d.js"&gt;&lt;/script&gt;&#10;&lt;p id="186f"&gt;&#10; I could write this data to a file with no issue, but when writing to a Cassandra these errors would come flying out at me. With the help of &lt;a href="https://twitter.com/RussSpitzer" rel="nofollow" data-href="https://twitter.com/RussSpitzer"&gt;Russ Spitzer&lt;/a&gt; (by help I mean explaining to my thick skull what was going on) I was pointed to the fact that reflection &lt;a href="http://docs.scala-lang.org/overviews/reflection/thread-safety.html" rel="nofollow" data-href="http://docs.scala-lang.org/overviews/reflection/thread-safety.html"&gt;wasn’t thread safe in Scala 2.10&lt;/a&gt;.&#10;&lt;/p&gt;</description></item><item><title>Logging The Generated CQL from the Spark Cassandra Connector</title><link>https://blog.foundev.pro/2016/04/07/logging-the-generated-cql-from-the-spark-cassandra-connector.html</link><pubDate>Thu, 07 Apr 2016 00:00:00 +0000</pubDate><guid>https://blog.foundev.pro/2016/04/07/logging-the-generated-cql-from-the-spark-cassandra-connector.html</guid><description>&lt;h1&gt;Logging The Generated CQL from the Spark Cassandra Connector&lt;/h1&gt;&#10;&lt;p id="b9fd"&gt;&#10; This has come up some in the last few days so I thought I’d share the available options and the tradeoffs.&#10;&lt;/p&gt;&#10;&lt;h3 id="354c"&gt;Option 1: Turn ON ALL THE TRACING! nodetool settraceprobability 1.0&lt;/h3&gt;&#10;&lt;p id="8ada"&gt;&#10; Probabilistic tracing is a handy feature for finding expensive queries in use cases where there is little control over who has access to the cluster IE most enterprises in my experience (ironic considering all the process). However, it’s too expensive to turn it up too high in production, but in development it’s a good way to give you an idea of what a query turns into. Read more about probalistic tracing here:&#10;&lt;/p&gt;</description></item><item><title>Don’t use TextField for your unique key in Solr</title><link>https://blog.foundev.pro/2016/04/06/dont-use-textfield-for-your-unique-key-in-solr.html</link><pubDate>Wed, 06 Apr 2016 00:00:00 +0000</pubDate><guid>https://blog.foundev.pro/2016/04/06/dont-use-textfield-for-your-unique-key-in-solr.html</guid><description>&lt;h1&gt;Don’t use TextField for your unique key in Solr&lt;/h1&gt;&#10;&lt;div&gt;&#10; &lt;p id="651b"&gt;&#10; This seems immediately obvious when you think about it, but TextField is what you use for fuzzy searches in Solr, and why would a person want a fuzzy search on a unique value? While I can come up with some oddball use cases, making use of copy fields would seem to be the more valid approach and fitting with the typical use of Solr IE you filter on strings and query on text.&#10; &lt;/p&gt;</description></item><item><title>Spark job that writes to Cassandra just hangs when one node goes down?</title><link>https://blog.foundev.pro/2016/04/05/spark-job-that-writes-to-cassandra-just-hangs-when-one-node-goes-down.html</link><pubDate>Tue, 05 Apr 2016 00:00:00 +0000</pubDate><guid>https://blog.foundev.pro/2016/04/05/spark-job-that-writes-to-cassandra-just-hangs-when-one-node-goes-down.html</guid><description>&lt;h1&gt;Spark job that writes to Cassandra just hangs when one node goes down?&lt;/h1&gt;&#10;### &lt;span style="font-size: 16px;"&gt;So this was hyper obvious once I saw the executor logs and the database schema, but this had me befuddled at first and the change in behavior with one node should have made it obvious.&lt;/span&gt; {#23da}&#10;&lt;p id="f2c8"&gt;&#10; The code was simple, read a bunch of information, do some minor transformations and flush to Cassandra. This was nothing crazy. But during the users fault tolerance testing, the job would just seamingly hang indefinitely when a node was down.&#10;&lt;/p&gt;</description></item><item><title>Synthetic Sharding with Cassandra. Or How To Deal With Large Partitions.</title><link>https://blog.foundev.pro/2016/03/15/synthetic-sharding-with-cassandra-or-how-to-deal-with-large-partitions.html</link><pubDate>Tue, 15 Mar 2016 00:00:00 +0000</pubDate><guid>https://blog.foundev.pro/2016/03/15/synthetic-sharding-with-cassandra-or-how-to-deal-with-large-partitions.html</guid><description>&lt;h1&gt;Synthetic Sharding with Cassandra. Or How To Deal With Large Partitions.&lt;/h1&gt;&#10;Extremely overdue that I write this down as it’s a common problem, and really applies to any database that needs to scale horizontally, not just Cassandra.&#10;&lt;h2 id="problem-statement"&gt;Problem Statement&lt;/h2&gt;&#10;&lt;p&gt;Good partition keys are not always obvious, and it’s easy to create a bad one.&lt;/p&gt;&#10;&lt;h2 id="defining-a-bad-partition"&gt;Defining A Bad Partition&lt;/h2&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Uneven Access. Read OR write count is more than 2x different from one partition to another. This is a purist view and some of you using time series are screaming at me right now, but set that aside, I’ll have another blog post for you, but if you’re new to Cassandra consider it a good principle and goal to aim for.&lt;/li&gt;&#10;&lt;li&gt;Uneven Size. Same as above really you can run cfhistograms and if you see really tiny or empty partitions next to really large ones or ones with really high cell count, you are at least on ingest uneven. I would shoot for within an order of magnitude or two. If you’re smart enough to tell me why I’m wrong here that’s fine, I’m not gonna care, but if you’re new to Cassandra this is a good goal.&lt;/li&gt;&#10;&lt;li&gt;Too Many Cells. The partition cell count for a given partition is over 100k (run cfhistograms to get these numbers). This is entirely a rule of thumb and varies amazingly between hardware, tuning and column names (length matters). You may find you can add more and not hit a problem and you may find you can’t get near this. If you want to be exacting you should test.&lt;/li&gt;&#10;&lt;li&gt;Too Large. Your partition size is over 32mb (also in cfhisograms EDIT in 2022, this is usually much larger on modern hardware). This also varies like cell count. Some people tell me this matters less now (as of Apache Cassandra™ 2.1), and they run a lot larger. However, I’ve seen it cause problems on a number of clusters. I repeat as a new user this is a good number to shoot for, once you’re advanced enough to tell me why I’m wrong you may ignore this rule. Again you should test your cluster to get the number where things get problematic.&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h2 id="options-if-you-have-a-bad-partition"&gt;Options if you have a bad partition&lt;/h2&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Pick a better partition key &lt;a href="http://www.datastax.com/dev/blog/basic-rules-of-cassandra-data-modeling"&gt;read&lt;/a&gt;.&lt;/li&gt;&#10;&lt;li&gt;Give up and use Synthetic Sharding.&lt;/li&gt;&#10;&lt;li&gt;Pretend it’s not a problem and find out the hard way that it really is, usually this is at 3 am.&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h2 id="synthetic-sharding-strategy-shard-table"&gt;Synthetic Sharding Strategy: Shard Table&lt;/h2&gt;&#10;&lt;p&gt;&lt;strong&gt;Pros&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Cassandra’s “Repair” Should Be Called “Required Maintenance</title><link>https://blog.foundev.pro/2015/09/25/cassandras-repair-should-be-called-required-maintenance.html</link><pubDate>Fri, 25 Sep 2015 00:00:00 +0000</pubDate><guid>https://blog.foundev.pro/2015/09/25/cassandras-repair-should-be-called-required-maintenance.html</guid><description>&lt;h1&gt;Cassandra’s “Repair” Should Be Called “Required Maintenance”&lt;/h1&gt;&#10;&lt;p id="f577"&gt;&#10; &lt;span style="font-size: 16px;"&gt;One of the bigger challenges when you go Eventually Consistent is how to reconcile data not being replicated. This happens if your using Oracle and multi-data centers with tech like Golden Gate and it happens if you’re using async replicas with MySQL and one of your replicas got out of whack. You need a way to “repair” the lost data.&lt;/span&gt;&#10;&lt;/p&gt;&#10;&lt;p id="c3fa"&gt;&#10; Since Cassandra fully embraces eventually consistency repair is actually a important mechanism for making sure copies of data are shipped around the cluster to meet your specified replication factor. About now several of you have alarm bells going off and think I’m insane. Let’s step through the common objections I hear.&#10;&lt;/p&gt;</description></item><item><title>Scale is a Dish Best Served Eventually Consistent</title><link>https://blog.foundev.pro/2015/09/23/scale-is-a-dish-best-served-eventually-consistent.html</link><pubDate>Wed, 23 Sep 2015 00:00:00 +0000</pubDate><guid>https://blog.foundev.pro/2015/09/23/scale-is-a-dish-best-served-eventually-consistent.html</guid><description>&lt;h1&gt;Scale is a Dish Best Served Eventually Consistent&lt;/h1&gt;&#10;&lt;p id="6c7d"&gt;&#10; &lt;span style="font-size: 16px;"&gt;A lot of people new to Cassandra find the data modeling required tedious and outrageously hard. They’ll long for their RDMBS, if only &lt;/span&gt;&lt;strong style="font-size: 16px;"&gt;i&lt;em&gt;nsert favorite vendor or project lead here&lt;/em&gt;&lt;/strong&gt;&lt;span style="font-size: 16px;"&gt; would make their RDBMS scale like Cassandra they could tell their bosses to shove off and go back to using their favorite tool. To people saying this (and I hear the echos of it in conversations often), I’ve got news for you, the problem isn’t Cassandra or your favorite tool, it’s your style of data modeling.&lt;/span&gt;&#10;&lt;/p&gt;</description></item><item><title>Data Density! Destroyer of Scalability</title><link>https://blog.foundev.pro/2015/09/17/data-density-destroyer-of-scalability.html</link><pubDate>Thu, 17 Sep 2015 00:00:00 +0000</pubDate><guid>https://blog.foundev.pro/2015/09/17/data-density-destroyer-of-scalability.html</guid><description>&lt;h1&gt;Data Density! Destroyer of Scalability&lt;/h1&gt;&#10;&lt;p id="3e0f"&gt;&#10; &lt;em style="font-size: 16px;"&gt;UPDATE: I’d incorrectly attributed a practice to Netflix about scaling down daily . I cannot find any reference to using today, and I’ve been unable to find the previous reference to it. So I’ve just removed the point. I’ll cover cluster scaling strategies later in another blog post. TLDR smaller nodes are easier to scale.&lt;/em&gt;&#10;&lt;/p&gt;&#10;&lt;p id="6852"&gt;&#10; My past couple of years I’ve seen a growing and to my mind unfortunate trend towards ever larger Cassandra nodes running more expensive and more specialized hardware. Teams wanting 17TB nodes in a quest to get ever more data on a single unit (TLDR that rarely works). While wanting to lower one’s rack footprint sounds hyper appealing let me be the first to tell you, it comes at a great cost.&#10;&lt;/p&gt;</description></item><item><title>DataStax a Love Letter</title><link>https://blog.foundev.pro/2015/09/17/datastax-a-love-letter.html</link><pubDate>Thu, 17 Sep 2015 00:00:00 +0000</pubDate><guid>https://blog.foundev.pro/2015/09/17/datastax-a-love-letter.html</guid><description>&lt;h1&gt;DataStax a Love Letter&lt;/h1&gt;&#10;&lt;p id="19c9"&gt;&#10; Today is my last day at DataStax and what an amazing ride it was. This is easily the best job and the best group of people I’ve ever worked with and I’m very sad to go, but I had an opportunity I could not pass up.&#10;&lt;/p&gt;&#10;&lt;p id="30d6"&gt;&#10; I want to specifically speak to some (but not all cause this would read like Numbers in the Bible) of the amazing people I’m truly blessed to know.&#10;&lt;/p&gt;</description></item><item><title>Event Sourcing and System of Record: Sane Distributed Development In The Modern Era</title><link>https://blog.foundev.pro/2015/09/17/event-sourcing-and-system-of-record-sane-distributed-development-in-the-modern-era-2.html</link><pubDate>Thu, 17 Sep 2015 00:00:00 +0000</pubDate><guid>https://blog.foundev.pro/2015/09/17/event-sourcing-and-system-of-record-sane-distributed-development-in-the-modern-era-2.html</guid><description>&lt;h1&gt;Event Sourcing and System of Record: Sane Distributed Development In The Modern Era&lt;/h1&gt;&#10;No matter the message queue or broker you rely on whether it be RabbitMQ, JMS, ActiveMQ, Websphere, MSMQ and yes even Kafka you can lose messages in any of the following ways:&#10;&lt;ul&gt;&#10;&lt;li&gt;A downstream system from the broker can have data loss&lt;/li&gt;&#10;&lt;li&gt;All message queues today can lose already acknowledged messages during failover or leader election.&lt;/li&gt;&#10;&lt;li&gt;A bug can send the wrong messages to the wrong systems.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;em&gt;AKA the typical distributed systems problem set.&lt;/em&gt; Despite these data safety issues, messaging remains a popular pattern for the following reasons:&lt;/p&gt;</description></item><item><title>Lambda+ or Event Sourcing with TTLs</title><link>https://blog.foundev.pro/2015/09/17/lambda-or-event-sourcing-with-ttls.html</link><pubDate>Thu, 17 Sep 2015 00:00:00 +0000</pubDate><guid>https://blog.foundev.pro/2015/09/17/lambda-or-event-sourcing-with-ttls.html</guid><description>&lt;h1&gt;Lambda+ or Event Sourcing with TTLs&lt;/h1&gt;&#10;&lt;p&gt;Some people are worried about the data volume that a strategy like Lambda+ or Event Sourcing implies. As a disclaimer, &lt;em&gt;by giving up the historical data you have, you risk losing useful data layer and you lose the ability to have bi-temporal data or go back in time.&lt;/em&gt; However, if you still don’t care about that, please continue reading.&lt;/p&gt;&#10;&lt;h3 id="transaction-log-lessons"&gt;Transaction Log Lessons&lt;/h3&gt;&#10;&lt;p&gt;If we think of Event Sourcing as a transaction log we can borrow some valuable lessons. How is it like a transaction log you ask?&lt;/p&gt;</description></item><item><title>Lambda+: Cassandra and Spark for Scalable Architecture</title><link>https://blog.foundev.pro/2015/09/17/lambda-cassandra-and-spark-for-scalable-architecture.html</link><pubDate>Thu, 17 Sep 2015 00:00:00 +0000</pubDate><guid>https://blog.foundev.pro/2015/09/17/lambda-cassandra-and-spark-for-scalable-architecture.html</guid><description>&lt;h1&gt;Lambda+: Cassandra and Spark for Scalable Architecture&lt;/h1&gt;&#10;&lt;p id="6964"&gt;&#10;&lt;em style="font-size: 16px;"&gt;UPDATE: For some background on Spark Streaming and Cassandra please consult some of my previous &lt;/em&gt;&lt;a style="font-size: 16px;" href="https://medium.com/@foundev/real-time-analytics-with-spark-streaming-and-cassandra-2f90d03342f7" data-href="https://medium.com/@foundev/real-time-analytics-with-spark-streaming-and-cassandra-2f90d03342f7"&gt;&lt;em&gt;blog post on the subject&lt;/em&gt;&lt;/a&gt;&lt;em style="font-size: 16px;"&gt;.&lt;/em&gt;&#10;&lt;/p&gt;&#10;&lt;p id="abf8"&gt;&#10; Many of you have heard of and a few of you may have used the Lambda Architecture. If you’ve not heard of it the name doesn’t communicate a lot. In short the Lambda Architecture has 3 primary components with a 2 pronged approach to analytics:&#10;&lt;/p&gt;</description></item><item><title>Real Time Analytics With Spark Streaming and Cassandra</title><link>https://blog.foundev.pro/2015/09/17/real-time-analytics-with-spark-streaming-and-cassandra.html</link><pubDate>Thu, 17 Sep 2015 00:00:00 +0000</pubDate><guid>https://blog.foundev.pro/2015/09/17/real-time-analytics-with-spark-streaming-and-cassandra.html</guid><description>&lt;h1&gt;Real Time Analytics With Spark Streaming and Cassandra&lt;/h1&gt;&#10;&lt;p id="2c8c"&gt;&#10; &lt;a style="font-size: 16px;" href="http://spark.apache.org/streaming/" rel="nofollow" data-href="http://spark.apache.org/streaming/"&gt;Spark Streaming&lt;/a&gt;&lt;span style="font-size: 16px;"&gt; is a good tool to roll up transactions data into summaries as they enter the system. When paired with an easily idempotent data store like Cassandra you get a high performance low hassle approach to getting your work done.&lt;/span&gt;&#10;&lt;/p&gt;&#10;&lt;h3 id="2967"&gt;Useful Background&lt;/h3&gt;&#10;&lt;li id="b8ca"&gt;&#10; &lt;a href="https://medium.com/@foundev/retry-not-rollback-9a0412fe63c4" data-href="https://medium.com/@foundev/retry-not-rollback-9a0412fe63c4"&gt;Retry Not Rollback: Idempotent Data Models in Cassandra&lt;/a&gt;&#10;&lt;/li&gt;&#10;&lt;li id="242c"&gt;&#10; &lt;a href="https://medium.com/@foundev/event-sourcing-and-system-of-record-b919714512b8" data-href="https://medium.com/@foundev/event-sourcing-and-system-of-record-b919714512b8"&gt;Event Sourcing and System Of Record&lt;/a&gt; (addresses &lt;em&gt;Message Replay &lt;/em&gt;and &lt;em&gt;System Of Record&lt;/em&gt;)&#10;&lt;/li&gt;&#10;&lt;li id="ef49"&gt;&#10; &lt;a href="http://docs.datastax.com/en/cql/3.1/cql/cql_using/use_counter_t.html" rel="nofollow" data-href="http://docs.datastax.com/en/cql/3.1/cql/cql_using/use_counter_t.html"&gt;Cassandra CQL Docs on Counters&lt;/a&gt;&#10;&lt;/li&gt;&#10;&lt;li id="9da8"&gt;&#10; &lt;a href="https://databricks.com/blog/2015/01/15/improved-driver-fault-tolerance-and-zero-data-loss-in-spark-streaming.html" rel="nofollow" data-href="https://databricks.com/blog/2015/01/15/improved-driver-fault-tolerance-and-zero-data-loss-in-spark-streaming.html"&gt;WAL: Write Ahead Logging&lt;/a&gt;&#10;&lt;/li&gt;&#10;&lt;li id="1d95"&gt;&#10; &lt;a href="https://databricks.com/blog/2015/03/30/improvements-to-kafka-integration-of-spark-streaming.html" rel="nofollow" data-href="https://databricks.com/blog/2015/03/30/improvements-to-kafka-integration-of-spark-streaming.html"&gt;Direct API in Spark Streaming&lt;/a&gt;&#10;&lt;/li&gt;&#10;&lt;h3 id="general-best-practice"&gt;General Best Practice&lt;/h3&gt;&#10;&lt;p id="a9a5"&gt;&#10; The safe choice will be an&lt;em&gt; Idempotent Data Model&lt;/em&gt; that you can safely retry,&lt;em&gt;Aggregate with Spark Streaming&lt;/em&gt;&lt;strong&gt; &lt;/strong&gt;and use &lt;em&gt;Message Replay&lt;/em&gt; driven by a &lt;em&gt;System Of Record&lt;/em&gt; to handle any lost messages.&#10;&lt;/p&gt;</description></item><item><title>Retry not Rollback: Idempotent Data Models in Cassandra</title><link>https://blog.foundev.pro/2015/09/17/retry-not-rollback-idempotent-data-models-in-cassandra.html</link><pubDate>Thu, 17 Sep 2015 00:00:00 +0000</pubDate><guid>https://blog.foundev.pro/2015/09/17/retry-not-rollback-idempotent-data-models-in-cassandra.html</guid><description>&lt;h1&gt;Retry not Rollback: Idempotent Data Models in Cassandra&lt;/h1&gt;&#10;### {#737a}&#10;&lt;h3 id="d037"&gt;Naive Consistency&lt;/h3&gt;&#10;&lt;p id="fad8"&gt;&#10; Often the first error handling code I see from new Cassandra users is the client side rollback in an attempt to replicate database transactions from the ACID world. This is typically done when a write to multiple tables fail, or a write is not able to meet requested Consistency Level. Unfortunately, client side rollbacks, while well intentioned, generally create more problems than they solve. Let’s discuss how this will end up&#10;&lt;/p&gt;</description></item><item><title>My Cassandra 2.0 Diagnostics Checklist (Brain Dump)</title><link>https://blog.foundev.pro/2014/11/25/my-cassandra-diagnostics-checklist-brain-dump.html</link><pubDate>Tue, 25 Nov 2014 00:00:00 +0000</pubDate><guid>https://blog.foundev.pro/2014/11/25/my-cassandra-diagnostics-checklist-brain-dump.html</guid><description>&lt;h1&gt;My Cassandra 2.0 Diagnostics Checklist (Brain Dump)&lt;/h1&gt;&#10;UPDATE:&#10;&lt;p&gt;This list needs to be updated and as of today only has been verified with Cassandra 2.0.&lt;/p&gt;&#10;&lt;p&gt;Original Blog Post:&lt;/p&gt;&#10;&lt;p&gt;This isn’t remotely complete, but I had a colleague ask me to do a brain dump of my process and this is by and large usually it. I’m sure this will leave more questions than answers for many of you, and I’d like to follow up this post at some point with detail of the why and the how of a lot of it so it can be more useful to beginners. Today this is in a very raw form.&lt;/p&gt;</description></item><item><title>Domain Modeling Around Deletes or “Using Cassandra as a queue even when you know better</title><link>https://blog.foundev.pro/2014/10/20/domain-modeling-around-deletes-or-using-cassandra-as-a-queue-even-when-you-know-better.html</link><pubDate>Mon, 20 Oct 2014 00:00:00 +0000</pubDate><guid>https://blog.foundev.pro/2014/10/20/domain-modeling-around-deletes-or-using-cassandra-as-a-queue-even-when-you-know-better.html</guid><description>&lt;h1&gt;Domain Modeling Around Deletes or &amp;#8220;Using Cassandra as a queue even when you know better&amp;#8221;&lt;/h1&gt;&#10;# Understanding Deletes&#10;&lt;p&gt;Delete heavy workloads have a number of pretty serious issues when it comes to using a distributed database. Unfortunately one of the most common delete heavy workloads and the most common desired use case for Cassandra is to use it as a global queue. This blog post is aimed at addressing the queue anti-pattern primarily, but could be modeled for other delete heavy use cases.&lt;/p&gt;</description></item><item><title>Cassandra Auth: Never use the cassandra user in production!</title><link>https://blog.foundev.pro/2014/09/22/cassandra-auth-never-use-the-cassandra-user-in-production.html</link><pubDate>Mon, 22 Sep 2014 00:00:00 +0000</pubDate><guid>https://blog.foundev.pro/2014/09/22/cassandra-auth-never-use-the-cassandra-user-in-production.html</guid><description>&lt;h1&gt;Cassandra Auth: Never use the cassandra user in production!&lt;/h1&gt;&#10;Normal best practice for security with applications is never to use the default admin user. In Sql Server this is manifested by the recommendation not to use the “sa” user. Likewise in Cassandra the default Cassandra user has full rights to all tables and operations. This is needless to say bad security from an application design perspective, but there is yet another consideration that I see people in larger organizations run into, performance &amp; availability.&#10;&lt;h2 id="quorum-versus-local_one"&gt;QUORUM versus LOCAL_ONE&lt;/h2&gt;&#10;&lt;p&gt;The default cassandra username is a special case for authentication, since it’s used to modify initial &lt;a href="https://issues.apache.org/jira/browse/CASSANDRA-5310"&gt;user permissions uses QUORUM consistency when logging in&lt;/a&gt;. In a production use case this has important performance implication for multiple data center scenarios (hereafter referered to as MDC) which means if you have 3 data centers, all with system_auth set to a replication factor of 3 (or 9 replicas total), QUORUM consistency will query 6 nodes, some of which going over high latency network links! Worse, if you were to lose 1 data center and 1 other node, you’d be unable to login! &lt;/p&gt;</description></item><item><title>Cassandra Query Patterns: Not using the “in” query for multiple partitions.</title><link>https://blog.foundev.pro/2014/09/22/cassandra-query-patterns-not-using-the-in-query-for-multiple-partitions.html</link><pubDate>Mon, 22 Sep 2014 22:12:58 +0000</pubDate><guid>https://blog.foundev.pro/2014/09/22/cassandra-query-patterns-not-using-the-in-query-for-multiple-partitions.html</guid><description>&lt;h1&gt;Cassandra Query Patterns: Not using the “in” query for multiple partitions.&lt;/h1&gt;&#10;So lets say you’re doing you’re best to data model all around one partition. You’ve done your homework and all you queries look like this:&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f7f7f7;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#cf222e"&gt;SELECT&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#0550ae"&gt;*&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#cf222e"&gt;FROM&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;my_keyspace&lt;span style="color:#1f2328"&gt;.&lt;/span&gt;users&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#cf222e"&gt;where&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;id&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#0550ae"&gt;=&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#0550ae"&gt;1&lt;/span&gt;&lt;span style="color:#fff"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Over time as features are added however, you make some tradeoffs and need to start doing queries across partitions. At first there are only a few queries like this.&lt;/p&gt;</description></item><item><title>Apache Cassandra: Some useful JMX metrics to monitor</title><link>https://blog.foundev.pro/2014/09/03/apache-cassandra-some-useful-jmx-metrics-to-monitor.html</link><pubDate>Wed, 03 Sep 2014 00:00:00 +0000</pubDate><guid>https://blog.foundev.pro/2014/09/03/apache-cassandra-some-useful-jmx-metrics-to-monitor.html</guid><description>&lt;h1&gt;Apache Cassandra: Some useful JMX metrics to monitor&lt;/h1&gt;&#10;This is not a complete list, but is this what I’ve typically had to look out for in the wild. There maybe some selection bias at play since once I’m involved with a cluster it’s not in a good place.&#10;&lt;p&gt;&lt;sub&gt;&lt;strong&gt;&lt;em&gt;org.apache.cassandra.metrics/DroppedMessage/MUTATION/Attributes/Count&lt;/em&gt;&lt;/strong&gt;&lt;/sub&gt;&lt;/p&gt;&#10;&lt;p&gt;This should always be 0. This is indicative of load shedding and while there can be short term bursts where this is only a temporary problem that normal maintenance cleans up, it’s more often than not indicative that your cluster is overloaded, mistuned or just flat our running on bad hardware to begin with.&lt;/p&gt;</description></item><item><title>Cassandra C# Driver: Surprising gotcha with SimpleStatement</title><link>https://blog.foundev.pro/2014/08/29/132.html</link><pubDate>Fri, 29 Aug 2014 00:00:00 +0000</pubDate><guid>https://blog.foundev.pro/2014/08/29/132.html</guid><description>&lt;h1&gt;Cassandra C# Driver: Surprising gotcha with SimpleStatement&lt;/h1&gt;&#10;When helping someone with a Batch using the C# driver and I had a bit of a surprise. I wanted to reuse the CQL and I couldn’t at that point use a Prepare because of a bug, since SimpleStatement has a nearly identical API I figured it’d be a one for one replacement so my friend and I started with:&#10;&lt;pre&gt;&lt;code&gt;var batchStmt = new BatchStmt();&#10;var v2Insert = new SimpleStatement(&amp;quot;insert into v1_readonly.documents &amp;quot; +&#10;&amp;quot;(key, column1, value) values(?, ?, ?);&amp;quot;);&#10;batchStmt.Add(v2Insert.Bind(&amp;quot;1&amp;quot;, &amp;quot;DateStamp&amp;quot;, &amp;quot;foo&amp;quot;)) //1&#10;.Add(v2Insert.Bind(&amp;quot;1&amp;quot;, &amp;quot;EprsVersion&amp;quot;, &amp;quot;foo&amp;quot;)) //2&#10;.Add(v2Insert.Bind(&amp;quot;1&amp;quot;, &amp;quot;ExternalDocId&amp;quot;, &amp;quot;foo&amp;quot;)) //3&#10;.Add(v2Insert.Bind(&amp;quot;1&amp;quot;, &amp;quot;RecordType&amp;quot;, &amp;quot;foo&amp;quot;)) //4&#10;.Add(v2Insert.Bind(&amp;quot;1&amp;quot;, &amp;quot;Status&amp;quot;, &amp;quot;foo&amp;quot;)) //5&#10;.Add(v2Insert.Bind(&amp;quot;1&amp;quot;, &amp;quot;XmlRecord&amp;quot;, &amp;quot;foo&amp;quot;)); //6&#10;session.Execute(batchStmt);&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;and expected to get 6 rows but instead got the last record:&lt;/p&gt;</description></item><item><title>Cassandra - Batch loading without the Batch keyword</title><link>https://blog.foundev.pro/2014/08/28/cassandra-batch-loading-without-the-batch-keyword.html</link><pubDate>Thu, 28 Aug 2014 13:10:55 +0000</pubDate><guid>https://blog.foundev.pro/2014/08/28/cassandra-batch-loading-without-the-batch-keyword.html</guid><description>&lt;h1&gt;Cassandra - Batch loading without the Batch keyword&lt;/h1&gt;&#10;ATTENTION:&#10;&lt;p&gt;&lt;em&gt;This post is intentionally simplistic to help explain tradeoffs that need to be made. If you are looking for some production level nuance go &lt;a href="https://blog.foundev.pro/2016/04/29/cassandra-batch-loading-without-the-batch-the-nuanced-edition.html"&gt;read this afterwords.&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;&#10;&lt;p&gt;Batches in Cassandra are often mistaken as a performance optimization. They can be but only in rare cases. First we need to discuss the different types of batches:&lt;/p&gt;&#10;&lt;h2 id="unlogged-batch"&gt;Unlogged Batch&lt;/h2&gt;&#10;&lt;p&gt;A good example of an unlogged batch follows and assumes a partition key of date. The following batch is effectively one insert because all inserts are sharing the same partition key. Assuming a partition key of date the above batch will only resolve to one write internally, no matter how many there are as long as they have the same date value. This is therefore the primary use case of an unlogged batch:&lt;/p&gt;</description></item><item><title>Cassandra &amp; Rails: Cequel Batch Support</title><link>https://blog.foundev.pro/2014/07/15/cassandra-rails-cequel-batch-support.html</link><pubDate>Tue, 15 Jul 2014 00:00:00 +0000</pubDate><guid>https://blog.foundev.pro/2014/07/15/cassandra-rails-cequel-batch-support.html</guid><description>&lt;h1&gt;Cassandra &amp;#038; Rails: Cequel Batch Support&lt;/h1&gt;&#10;Cassandra On Rails using Cequel Atomic Batch Support When I first tried to use Cassandra with Rails over a year ago the lack of a good native (IE not thrift) driver and a good mapper was a show stopper for the project I was on. Today the situation has improved markedly with the cql-rb driver proving stable in usage, and the excellent Cequel ActiveModel capable library switching to use cql-rb.&#10;&lt;p&gt;I’d like to cover a common use case that’s not been handled by ORM style mapping libraries very well, atomic batches. Cequel has support for this even though you have to hunt a bit for it and it works well. Consider the following scenario, you’ve got 2 related tables, and you want one to update when the other one changes.&lt;/p&gt;</description></item><item><title>Buffer Cache Makes Slow Disks Seem Fast, Till You Need Them.</title><link>https://blog.foundev.pro/2014/04/20/buffer-cache-makes-slow-disks-seem-fast-till-you-need-them.html</link><pubDate>Sun, 20 Apr 2014 00:00:00 +0000</pubDate><guid>https://blog.foundev.pro/2014/04/20/buffer-cache-makes-slow-disks-seem-fast-till-you-need-them.html</guid><description>&lt;h1&gt;Buffer Cache Makes Slow Disks Seem Fast, Till You Need Them.&lt;/h1&gt;&#10;Linux has this wonderful thing called the buffer cache (for more detail read [here](http://www.tldp.org/LDP/sag/html/buffer-cache.html) ). In summary, it uses all your free ram as a cache for file access. Because of buffer cache you can easily get under 1 millisecond response times.&#10;&lt;p&gt;However, this sets a lot of people up for a trap. Imagine you buy a “database server” with a 5400RPM hard disk at Best Buy, while you’re there you pick up an extra 8 gigs of RAM. After loading the latest Ubuntu and restoring a 1 gig customer database backup. You check to see how much RAM you’re using and you have 2 gigs free. You test the new server out and records are coming off that server at an unbelievable speed, your happy, your boss is happy, you look like a genius.&lt;/p&gt;</description></item><item><title>Data Modeling for Scale with Cassandra</title><link>https://blog.foundev.pro/2014/04/17/100.html</link><pubDate>Thu, 17 Apr 2014 00:00:00 +0000</pubDate><guid>https://blog.foundev.pro/2014/04/17/100.html</guid><description>&lt;h1&gt;Data Modeling for Scale with Cassandra&lt;/h1&gt;&#10;## Reads and the perils of index tables.&#10;&lt;p&gt;I frequently see index tables in Cassandra being used to allow a One Source Of Truth. It’s important to remember when designing a truly distributed system relational algebra really doesn’t scale, and in memory joins will only get you so far (very little really). So as we often do in relational systems when we have an expensive dataset that is to expensive to calculate on the fly we create a materialized view. In Cassandra it’s helpful to think this way for all datasets that would require joins in a relational system.&lt;/p&gt;</description></item><item><title>How to become in polyglot in 5 hard steps.</title><link>https://blog.foundev.pro/2014/01/31/how-to-become-in-polyglot-in-5-hard-steps.html</link><pubDate>Fri, 31 Jan 2014 00:00:00 +0000</pubDate><guid>https://blog.foundev.pro/2014/01/31/how-to-become-in-polyglot-in-5-hard-steps.html</guid><description>&lt;h1&gt;How to become in polyglot in 5 hard steps.&lt;/h1&gt;&#10;With today&amp;#8217;s world of programming languages where many languages are better at certain tasks than other&amp;#8217;s you&amp;#8217;ll find it useful to learn multiple languages over the course of your career (as well as keeping your skill sets current).&#10;&lt;p&gt;Here are some tips I’ve had to learn the hard way:&lt;/p&gt;&#10;&lt;h3 id="step-1-your-second-language-should-be-similar-to-your-first"&gt;Step 1: Your second language should be similar to your first&lt;/h3&gt;&#10;&lt;p&gt;Your brain will confuse a lot of language decisions with computational necessities. Warts from your first language will show more, and syntax will make your head explode.&lt;/p&gt;</description></item><item><title>An Evernote backed Journal using Vim/Emacs</title><link>https://blog.foundev.pro/2013/04/07/an-evernote-backed-journal-using-vimemacs.html</link><pubDate>Sun, 07 Apr 2013 00:00:00 +0000</pubDate><guid>https://blog.foundev.pro/2013/04/07/an-evernote-backed-journal-using-vimemacs.html</guid><description>&lt;h1&gt;An Evernote backed Journal using Vim/Emacs&lt;/h1&gt;&#10;I journal quite a bit and my holy grail has been using my favorite text editor (Vim or Vim bindings) with Evernote to store the everything in a smart searchable format. Today I stumbled onto a neat little tool that makes this all happen called Geeknote http://www.geeknote.me/.  It&amp;#8217;s written in Python and works fine on my Mac.&#10;&lt;h3 id="installing-geeknote"&gt;Installing Geeknote&lt;/h3&gt;&#10;&lt;div&gt;&#10; In the directory of your choosing run the following script.  This will checkout the latest copy from source and allow you to login:&#10;&lt;/div&gt;&#10;&lt;div&gt;&#10; &lt;blockquote&gt;&#10;&lt;div id="file-install_geeknote-LC1" class="line"&gt;&#10; &lt;span class="c" style="color: #999988; font-style: italic;"&gt;#!/bin/sh&lt;/span&gt;&#10;&lt;/div&gt;&#10;&lt;div id="file-install_geeknote-LC2" class="line"&gt;&#10; &lt;span class="c" style="color: #999988; font-style: italic;"&gt;# Download the repository.&lt;/span&gt;&#10;&lt;/div&gt;&#10;&lt;div id="file-install_geeknote-LC3" class="line"&gt;&#10; git clone git://github.com/VitaliyRodnenko/geeknote.git&#10;&lt;/div&gt;&#10;&lt;div id="file-install_geeknote-LC4" class="line"&gt;&#10;&lt;/div&gt;&#10;&lt;div id="file-install_geeknote-LC5" class="line"&gt;&#10; &lt;span class="nb" style="color: #0086b3;"&gt;cd &lt;/span&gt;geeknote&#10;&lt;/div&gt;&#10;&lt;div id="file-install_geeknote-LC6" class="line"&gt;&#10;&lt;/div&gt;&#10;&lt;div id="file-install_geeknote-LC7" class="line"&gt;&#10; &lt;span class="c" style="color: #999988; font-style: italic;"&gt;# Launch Geeknote and go through login procedure.&lt;/span&gt;&#10;&lt;/div&gt;&#10;&lt;div id="file-install_geeknote-LC8" class="line"&gt;&#10; python geeknote.py login&#10;&lt;/div&gt;&#10;&lt;div id="file-install_geeknote-LC9" class="line"&gt;&#10; &lt;span class="c" style="color: #999988; font-style: italic;"&gt;#change vim to whatever you want it to be&lt;/span&gt;&#10;&lt;/div&gt;&#10;&lt;div id="file-install_geeknote-LC11" class="line"&gt;&#10; python geeknote.py settings &amp;#8211;editor vim&#10;&lt;/div&gt;&#10; &lt;/blockquote&gt;&#10;&lt;/div&gt;&#10;&lt;div&gt;&#10;&lt;/div&gt;&#10;&lt;div&gt;&#10; Then add the following script and execute it from whatever directory you want to install Geeknote into&#10;&lt;/div&gt;&#10;&lt;div&gt;&#10; &lt;blockquote&gt;&#10;&lt;div id="file-gistfile1-sh-LC1" class="line"&gt;&#10; &lt;span class="c" style="color: #999988; font-style: italic;"&gt;#!/bin/sh&lt;/span&gt;&#10;&lt;/div&gt;&#10;&lt;div id="file-gistfile1-sh-LC2" class="line"&gt;&#10;&lt;/div&gt;&#10;&lt;div id="file-gistfile1-sh-LC3" class="line"&gt;&#10; &lt;span class="c" style="color: #999988; font-style: italic;"&gt;#change checkout_dir to match where you&amp;#8217;ve checked out the latest&lt;/span&gt;&#10;&lt;/div&gt;&#10;&lt;div id="file-gistfile1-sh-LC4" class="line"&gt;&#10; &lt;span class="nv" style="color: teal;"&gt;checkout_dir&lt;/span&gt;&lt;span class="o" style="font-weight: bold;"&gt;=&lt;/span&gt;~/Documents/geeknote&#10;&lt;/div&gt;&#10;&lt;div id="file-gistfile1-sh-LC5" class="line"&gt;&#10; &lt;span class="c" style="color: #999988; font-style: italic;"&gt;#change notebook to whatever notebook you use as your journal&lt;/span&gt;&#10;&lt;/div&gt;&#10;&lt;div id="file-gistfile1-sh-LC6" class="line"&gt;&#10; &lt;span class="nv" style="color: teal;"&gt;notebook&lt;/span&gt;&lt;span class="o" style="font-weight: bold;"&gt;=&lt;/span&gt;Journal&#10;&lt;/div&gt;&#10;&lt;div id="file-gistfile1-sh-LC7" class="line"&gt;&#10; &lt;span class="nv" style="color: teal;"&gt;title&lt;/span&gt;&lt;span class="o" style="font-weight: bold;"&gt;=&lt;/span&gt;&lt;span class="nv" style="color: teal;"&gt;$1&lt;/span&gt;&#10;&lt;/div&gt;&#10;&lt;div id="file-gistfile1-sh-LC8" class="line"&gt;&#10; &lt;span class="k" style="font-weight: bold;"&gt;if&lt;/span&gt; &lt;span class="o" style="font-weight: bold;"&gt;[&lt;/span&gt; -z &lt;span class="s2" style="color: #dd1144;"&gt;&amp;#8220;$1&amp;#8221;&lt;/span&gt; &lt;span class="o" style="font-weight: bold;"&gt;]&lt;/span&gt;&#10;&lt;/div&gt;&#10;&lt;div id="file-gistfile1-sh-LC9" class="line"&gt;&#10; &lt;span class="k" style="font-weight: bold;"&gt;    then&lt;/span&gt;&#10;&lt;/div&gt;&#10;&lt;div id="file-gistfile1-sh-LC10" class="line"&gt;&#10; &lt;span class="nv" style="color: teal;"&gt;        title&lt;/span&gt;&lt;span class="o" style="font-weight: bold;"&gt;=&lt;/span&gt;&lt;span class="k" style="font-weight: bold;"&gt;$(&lt;/span&gt;date +%Y-%m-%d&lt;span class="k" style="font-weight: bold;"&gt;)&lt;/span&gt;&#10;&lt;/div&gt;&#10;&lt;div id="file-gistfile1-sh-LC11" class="line"&gt;&#10; &lt;span class="k" style="font-weight: bold;"&gt;fi&lt;/span&gt;&#10;&lt;/div&gt;&#10;&lt;div id="file-gistfile1-sh-LC12" class="line"&gt;&#10; &lt;span class="nb" style="color: #0086b3;"&gt;echo &lt;/span&gt;creating a note named &lt;span class="nv" style="color: teal;"&gt;$title&lt;/span&gt; in the &lt;span class="nv" style="color: teal;"&gt;$notebook&lt;/span&gt; notebook&#10;&lt;/div&gt;&#10;&lt;div id="file-gistfile1-sh-LC13" class="line"&gt;&#10;&lt;/div&gt;&#10;&lt;div id="file-gistfile1-sh-LC14" class="line"&gt;&#10; python &lt;span class="nv" style="color: teal;"&gt;$checkout_dir&lt;/span&gt;/geeknote.py create &amp;#8211;title &lt;span class="nv" style="color: teal;"&gt;$title&lt;/span&gt; &amp;#8211;notebook &lt;span class="nv" style="color: teal;"&gt;$notebook&lt;/span&gt; &amp;#8211;content &lt;span class="s2" style="color: #dd1144;"&gt;&amp;#8220;test&amp;#8221;&lt;/span&gt;&#10;&lt;/div&gt;&#10;&lt;div id="file-gistfile1-sh-LC15" class="line"&gt;&#10; python &lt;span class="nv" style="color: teal;"&gt;$checkout_dir&lt;/span&gt;/geeknote.py edit &amp;#8211;note &lt;span class="nv" style="color: teal;"&gt;$title&lt;/span&gt; &amp;#8211;notebook &lt;span class="nv" style="color: teal;"&gt;$notebook&lt;/span&gt; &amp;#8211;content &lt;span class="s2" style="color: #dd1144;"&gt;&amp;#8220;WRITE&amp;#8221;&lt;/span&gt;&#10;&lt;/div&gt;&#10; &lt;/blockquote&gt;&#10;&lt;/div&gt;&#10;&lt;div&gt;&#10; &lt;h3&gt;&#10; Writing Journal Entries&#10; &lt;/h3&gt;&#10; &lt;div&gt;&#10; My script is named journal so for me I just type either of the following:&#10; &lt;/div&gt;&#10; &lt;blockquote&gt;&#10;&lt;div&gt;&#10; &lt;span style="background-color: white; font-family: monospace; font-size: 12px; line-height: 16px; white-space: pre;"&gt;journal &lt;/span&gt; &lt;span style="background-color: white; color: #999988; font-family: Consolas, 'Liberation Mono', Courier, monospace; font-size: 12px; font-style: italic; line-height: 16px;"&gt;#creates a note in journal with todays date as the title&lt;/span&gt;&#10;&lt;/div&gt;&#10; &lt;/blockquote&gt;&#10; &lt;div&gt;&#10; or&#10; &lt;/div&gt;&#10; &lt;blockquote&gt;&#10;&lt;div&gt;&#10; &lt;span style="background-color: white; font-family: monospace; font-size: 12px; line-height: 16px; white-space: pre;"&gt;journal custom_title &lt;/span&gt; &lt;span style="background-color: white; color: #999988; font-family: Consolas, 'Liberation Mono', Courier, monospace; font-size: 12px; font-style: italic; line-height: 16px;"&gt;#no spaces allowed and will use the title specified&lt;/span&gt;&#10;&lt;/div&gt;&#10; &lt;/blockquote&gt;&#10; &lt;div&gt;&#10; &lt;/div&gt;&#10; &lt;h3&gt;&#10; Summary&#10; &lt;/h3&gt;&#10; &lt;div&gt;&#10; With a few simple scripts and in moments you two can be writing notes in the command prompt. I highly recommend you extend these scripts to your needs or just use the Geeknote command prompt as you see fit.  &lt;span style="background-color: white; font-family: Consolas, 'Liberation Mono', Courier, monospace; font-size: 12px; line-height: 16px;"&gt; &lt;/span&gt;&#10; &lt;/div&gt;&#10; &lt;p&gt;&#10; &amp;nbsp;&#10; &lt;/p&gt;</description></item><item><title>Ruth's Story</title><link>https://blog.foundev.pro/2013/02/04/ruths-story.html</link><pubDate>Mon, 04 Feb 2013 06:28:45 +0000</pubDate><guid>https://blog.foundev.pro/2013/02/04/ruths-story.html</guid><description>&lt;h1&gt;"Ruth's Story"&lt;/h1&gt;&#10;Ruth Ann Svihla came into this world screaming and angry on October 30 2011 at 6:57 am. She was and has always been a beautiful, intelligent child that brought us a great deal of joy, but she was born with many challenges to overcome.&#10;&lt;h2 id="cleft"&gt;Cleft&lt;/h2&gt;&#10;&lt;p&gt;The first such challenge we faced was a pretty severe cleft lip and pallet. Although this turned out to the be the most minimal of her problems, it was significant at the time. She was unable to eat on her own that first day, and we had to feed her through a nose tube. Attempts to teach her how to eat were met with frustration, both from my daughter and from us as well. I went to bed that night distraught and worried at challenges of being a new father of &amp;ldquo;special needs&amp;rdquo; child. Would my wife and I be able to cope?&lt;/p&gt;</description></item><item><title>Rail 3.1 CI setup with Jenkins, Test Unit &amp; SimpleCov on OS X Lion.</title><link>https://blog.foundev.pro/2011/09/25/rail-3-1-ci-setup-with-jenkins-test-unit-simplecov-on-os-x-lion.html</link><pubDate>Sun, 25 Sep 2011 12:04:54 +0000</pubDate><guid>https://blog.foundev.pro/2011/09/25/rail-3-1-ci-setup-with-jenkins-test-unit-simplecov-on-os-x-lion.html</guid><description>&lt;h1&gt;Rail 3.1 CI setup with Jenkins, Test Unit &amp;#038; SimpleCov on OS X Lion.&lt;/h1&gt;&#10;I recently had to setup a build server for some rails work I'm doing. Still wanting to support my other projects I setup Jenkins. I ran into several issues.&#10;&lt;h2 id="running-jenkins-as-a-hidden-user"&gt;Running Jenkins as a hidden user&lt;/h2&gt;&#10;&lt;p&gt;First I noticed that jenkins was running as the &amp;ldquo;daemon&amp;rdquo; user, this obviously wasn&amp;rsquo;t going to work for github and rvm needs. So I did some googling and had some guides to get Jenkins running as a specific user. I did the following (sourced from &lt;a href="http://colonelpanic.net/2011/06/jenkins-on-mac-os-x-git-w-ssh-public-key/"&gt;http://colonelpanic.net/2011/06/jenkins-on-mac-os-x-git-w-ssh-public-key/&lt;/a&gt; ).&lt;/p&gt;</description></item><item><title>The difficult definition of professional software development</title><link>https://blog.foundev.pro/2011/02/04/the-difficult-definition-of-professional-software-development.html</link><pubDate>Fri, 04 Feb 2011 22:51:00 +0000</pubDate><guid>https://blog.foundev.pro/2011/02/04/the-difficult-definition-of-professional-software-development.html</guid><description>&lt;h1&gt;The difficult definition of professional software development&lt;/h1&gt;&#10;Here are some of the contradictory phrases (and a few paraphrases) I&amp;#8217;ve overheard used to define what is &amp;#8220;good&amp;#8221; and &amp;#8220;bad&amp;#8221; code. &#10;&lt;ul&gt;&#10;&lt;li&gt;Code should always be well commented&lt;/li&gt;&#10;&lt;li&gt;Maintainable code has unit tests and well named methods therefore needs little if any comments&lt;/li&gt;&#10;&lt;li&gt;Class explosion is to be avoided at all costs&lt;/li&gt;&#10;&lt;li&gt;Many small simple well named classes are the key to well organized code&lt;/li&gt;&#10;&lt;li&gt;Unit tests really don’t test anything useful&lt;/li&gt;&#10;&lt;li&gt;Dependency injection leads to an unusable mess&lt;/li&gt;&#10;&lt;li&gt;Dependency Injection is a very useful tool for making your code extensible and easily reused”&lt;/li&gt;&#10;&lt;li&gt;Inheritance leads to solid code reuse&lt;/li&gt;&#10;&lt;li&gt;Inheritance is the strongest coupling of your code you can have&lt;/li&gt;&#10;&lt;li&gt;Functional programming simplifies and minimizes the complexity of your code&lt;/li&gt;&#10;&lt;li&gt;Functional programing just makes my eyes bleed!&lt;/li&gt;&#10;&lt;li&gt;Static global references are ‘just programming’ and something you have to learn how to manage to make simple easy to understand code&lt;/li&gt;&#10;&lt;li&gt;Static global spiderwebs are crippling to maintenance and program lifetime&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt; &lt;/p&gt;</description></item><item><title>Java IoC containers and classpath scanning (or what I’ve been looking for from .NET for months)</title><link>https://blog.foundev.pro/2010/09/19/java-ioc-containers-and-classpath-scanning-or-what-i-ve-been-looking-for-from-net-for-months.html</link><pubDate>Sun, 19 Sep 2010 19:01:00 +0000</pubDate><guid>https://blog.foundev.pro/2010/09/19/java-ioc-containers-and-classpath-scanning-or-what-i-ve-been-looking-for-from-net-for-months.html</guid><description>&lt;h1&gt;Java IoC containers and classpath scanning (or what I’ve been looking for from .NET for months)&lt;/h1&gt;&#10;Frustrated with the typical way I saw IoC used in Java where every example I found involved thousands of lines of XML &#10;and/or Java code to configure Java beans or components.&amp;#160; This is very different than IoC typically used in .NET where most IoC containers allow &#10;you to "autowire" in their terminology up every class in an assembly with a couple of lines of code.&amp;#160; Having been coding in that fashion &#10;for several years in .NET I was dismayed when none of my fellow Java coders that I worked with or knew personally had any concept &#10;of the equivalent functionality, and instead informed me the IDE would be my help in maintaining these massive XML files. &#10;&lt;p&gt;Not content with their answers I burrowed into Spring, Guice and PicoContainer docs and found &amp;ldquo;classpath scanning&amp;rdquo; which is roughly&lt;br&gt;&#10;equivalent to &amp;ldquo;autowire&amp;rdquo; in .NET. Below is an example of this in Spring 3:&lt;/p&gt;</description></item><item><title>Anti-Pattern: Too much of your application is about interacting with external resources</title><link>https://blog.foundev.pro/2010/07/16/anti-pattern-too-much-of-your-application-is-about-interacting-with-external-resources.html</link><pubDate>Fri, 16 Jul 2010 02:24:00 +0000</pubDate><guid>https://blog.foundev.pro/2010/07/16/anti-pattern-too-much-of-your-application-is-about-interacting-with-external-resources.html</guid><description>&lt;h1&gt;Anti-Pattern: Too much of your application is about interacting with external resources&lt;/h1&gt;&#10;Firstly, what am I talking about? Applications that meet some of the following descriptions:&#10;&lt;ol&gt;&#10;&lt;li&gt;Stored procedures with a fair amount of conditional logic or complicated business rules buried in a sub-query (some would argue sprocs at all).&lt;/li&gt;&#10;&lt;li&gt;Web pages with lots of conditional output again encoding business rules in snippets of view logic. if else checks that display the latest price for something if before and certain date or a default price.&lt;/li&gt;&#10;&lt;li&gt;The majority of ‘unit tests’ require a database, or web and application server to be up and running.&lt;/li&gt;&#10;&lt;li&gt;The majority of code files make reference to language default I/O or database libraries.&lt;/li&gt;&#10;&lt;li&gt;Hours are spent trying to determine if differences in version of infrastructure are the cause of certain bugs.&lt;/li&gt;&#10;&lt;li&gt;Changing database schema results in hours of refactoring, as hundreds of querys and sprocs are hunted through to see if this index or that index is being properly hit.&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;Why is this an anti-pattern? First before I bore you with endless reasoning behind SOLID principles, proper OO etc if you’re reading this and you’re of a bent that disagrees with me so far entirely..none of that will mean anything to you, and none of it will mean anything to your customers so let me put this in the most practical terms I can.&lt;/p&gt;</description></item><item><title>Project Management in Java: A Confused .NET Developer’s Perspective</title><link>https://blog.foundev.pro/2010/07/12/project-management-in-java-a-confused-net-developer-s-perspective.html</link><pubDate>Mon, 12 Jul 2010 11:00:00 +0000</pubDate><guid>https://blog.foundev.pro/2010/07/12/project-management-in-java-a-confused-net-developer-s-perspective.html</guid><description>&lt;h1&gt;Project Management in Java: A Confused .NET Developer’s Perspective&lt;/h1&gt;&#10;When I was first introduced to workplace Java the amount of ways one could define a project appeared to be restrictive, confusing and a point of frequent friction. While those things may all be true, it’s a great deal better than I would have expected since I was coming from a world where an upgrade to a newer version of Visual Studio requires your whole team to sync up to that same version!&amp;#160; So how do cross IDEA teams get any work done in the Java workplace? Do Java OSS projects require everyone uses Eclipse, NetBeans, or IntelliJ?&amp;#160; Does every new IDE need to have import/export filters for all of the other existing ones and if it becomes popular do the already present IDE’s have to include this? Which system is the best and what matters?&#10;&lt;p&gt;To answer these questions let break down what makes a project and while doing so compare and contrast the Java perspective with the .NET one.&lt;/p&gt;</description></item><item><title>MySQL 5 Performance Tuning Toolkit</title><link>https://blog.foundev.pro/2010/07/02/mysql-5-performance-tuning-toolkit.html</link><pubDate>Fri, 02 Jul 2010 02:57:00 +0000</pubDate><guid>https://blog.foundev.pro/2010/07/02/mysql-5-performance-tuning-toolkit.html</guid><description>&lt;h1&gt;MySQL 5 Performance Tuning Toolkit&lt;/h1&gt;&#10;Recently we’d played with table partitioning and because of the limitations of it and some decisions we’d made a very long time ago we ended up spending a couple of days tracking down hotspots. In the process I picked up a few tricks, I’m not even an authority on any of this but I figured it’d help out others in the same spot.&#10;&lt;h3 id="logging-toolkit"&gt;Logging Toolkit&lt;/h3&gt;&#10;&lt;p&gt;If you have a slow loading page or test and have no idea which one of the thirty or so queries going on is the cause how to do you find it.  Slow query log and logging queries that are not using indexes. Adding the following to your my.ini, my.cnf or whatever your mysql config file is named on your system and you’ll be able to get a list of offenders to further investigate.&lt;/p&gt;</description></item><item><title>Java Dependency Management with Apache Ivy</title><link>https://blog.foundev.pro/2010/06/29/java-dependency-management-with-apache-ivy.html</link><pubDate>Tue, 29 Jun 2010 13:10:00 +0000</pubDate><guid>https://blog.foundev.pro/2010/06/29/java-dependency-management-with-apache-ivy.html</guid><description>&lt;h1&gt;Java Dependency Management with Apache Ivy&lt;/h1&gt;&#10;Not wanting to ditch your already built well working ant scripts for the plugin-centric view of Maven, especially if your project structure doesn&amp;#8217;t line up quite right with Maven&amp;#8217;s point of view? Enter Apache Ivy which like Maven can automatically download and resolve all of your dependencies and their dependencies for you with just a few simple lines of XML (if only I could get rid of the XML Part).&#10;&lt;p&gt;&lt;span style="font-size: 14px;font-weight: bold"&gt;Pros&lt;/span&gt;&lt;/p&gt;</description></item><item><title>Hibernate Connection Pooling: why isn’t the default one for production?</title><link>https://blog.foundev.pro/2010/06/26/hibernate-connection-pooling-why-is-the-default-one-for-production.html</link><pubDate>Sat, 26 Jun 2010 13:50:00 +0000</pubDate><guid>https://blog.foundev.pro/2010/06/26/hibernate-connection-pooling-why-is-the-default-one-for-production.html</guid><description>&lt;h1&gt;Hibernate Connection Pooling: why isn&amp;#8217;t the default one for production?&lt;/h1&gt;&#10;Hibernate unlike NHibernate comes with a variety of connection pooling options. The three primary ones of which I&amp;#8217;m aware are [Proxool](http://proxool.sourceforge.net/), [Apache DBCP](http://commons.apache.org/dbcp/), and [c3p0](http://sourceforge.net/projects/c3p0/) . I myself have only so far used c3p0 and it works quite well having saved me from a couple of jams so far where the default one was in use previously. First why not use the default one? Because the official Hibernate documentation says in a big yellow box marked caution the following words:&#10;&lt;p&gt;&lt;span style="font-family: 'Lucida Grande', Geneva, Verdana, Arial, sans-serif;color: #533500;line-height: 18px"&gt;&lt;/span&gt;&lt;/p&gt;</description></item><item><title>Dynamic DNS with Amazon EC2 Linux and EveryDNS</title><link>https://blog.foundev.pro/2010/06/06/dynamic-dns-with-amazon-ec2-linux-and-everydns.html</link><pubDate>Sun, 06 Jun 2010 18:02:32 +0000</pubDate><guid>https://blog.foundev.pro/2010/06/06/dynamic-dns-with-amazon-ec2-linux-and-everydns.html</guid><description>&lt;h1&gt;Dynamic DNS with Amazon EC2 Linux and EveryDNS&lt;/h1&gt;&#10;So I finally sat down and did the math and found out Amazon EC2 was quite a bit cheaper than what I’d been paying for hosting as long as I was willing to prepay for at least a year.&amp;#160; However, with EC2 you are getting a dynamic ip’s so what to do? Well I’ve been using EveryDNS for years for my dns hosting and despite it’s recent acquisition by Dyn, Inc it’s still works the same. The scripts that are described below can be downloaded &lt;a href="http://unstabletransit.com/blogfiles/dyndns.tgz" target="_blank"&gt;here&lt;/a&gt;, what follows is a brief walkthrough.&#10;&lt;ol&gt;&#10;&lt;li&gt;Download EveryDns update script from &lt;a href="http://www.everydns.com/dynamic.php"&gt;http://www.everydns.com/dynamic.php&lt;/a&gt;  and place it in something like /usr/local/bin.&lt;/li&gt;&#10;&lt;li&gt;Create a convenience script in /usr/local/bin that will get your external ip and have it contain the following lines and call it &lt;strong&gt;external-ip.sh .&lt;/strong&gt; This is using Amazon’s suggested curl command to find out your EC2 instance Ip address.&#10;&lt;ol&gt;&#10;&lt;li&gt;&lt;a href="https://lostechies.com/content/ryansvihla/uploads/2011/03/externalip_03406163.png"&gt;&lt;img style="border-right-width: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px" border="0" alt="external-ip" src="https://lostechies.com/content/ryansvihla/uploads/2011/03/externalip_thumb_7E5DADA6.png" width="670" height="168" /&gt;&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;Then create a script for the actual dynamic DNS update in /usr/local/bin/ and call it updatedns-sh. This is using the set command to grab the output of external ip and storing it in the variable $1, and then passing that value to the update command. &lt;strong&gt;NOTE: this will update the dns record of ALL your domains with everydns set to dynamic&lt;/strong&gt;. If you need to use specific domain names there is a –d flag for the eDNS client.&lt;a href="https://lostechies.com/content/ryansvihla/uploads/2011/03/update_3944E070.png"&gt;&lt;img style="border-right-width: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px" border="0" alt="update" src="https://lostechies.com/content/ryansvihla/uploads/2011/03/update_thumb_547D3971.png" width="677" height="169" /&gt;&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;create a cron job on your linux distro of choice but the cron job line should look like the following.&#10;&lt;ol&gt;&#10;&lt;li&gt;&lt;a href="https://lostechies.com/content/ryansvihla/uploads/2011/03/cron_791157A6.png"&gt;&lt;img style="border-right-width: 0px;border-top-width: 0px;border-bottom-width: 0px;border-left-width: 0px" border="0" alt="cron" src="https://lostechies.com/content/ryansvihla/uploads/2011/03/cron_thumb_51D70E71.png" width="754" height="38" /&gt;&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;For those wishing to comment I’ve cross posted to my blogger account.&lt;/p&gt;</description></item><item><title>Projects in Java with Maven 2</title><link>https://blog.foundev.pro/2010/05/23/projects-in-java-with-maven-2.html</link><pubDate>Sun, 23 May 2010 00:00:00 +0000</pubDate><guid>https://blog.foundev.pro/2010/05/23/projects-in-java-with-maven-2.html</guid><description>&lt;h1&gt;Projects in Java with Maven 2&lt;/h1&gt;&#10;NOTE: due to issues with spam I’ve turned off comments, I’ve cross posted on my [old blogger account](http://ryansvihla.blogspot.com/2010/05/projects-in-java-with-maven-2.html) if you have comments.&#10;&lt;p&gt;For those of you who don’t know Maven is a build tool/dependency manager/project model. Those in the Microsoft space can probably imagine MSBuild + the ability to download all dll’s for you.&lt;/p&gt;&#10;&lt;h3 id="what-i-liked"&gt;What I liked&lt;/h3&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Dependency Resolution. Automatic downloading of dependencies rocks in concept. Just specify library name and version and when you compile again it’s there.  No need to check in jar’s into your source tree.&lt;/li&gt;&#10;&lt;li&gt;IDE Independence. In practical terms lets you use whatever IDE you want with no import/export.  Intellij, Eclipse and Netbeans all understand maven as a full project format. So your team can all have different IDE’s and not create havoc with one another.&lt;/li&gt;&#10;&lt;li&gt;Good Default Project Structure. Tests are in the same location by default, resources for tests and your prod code are in expected places.&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h3 id="what-i-hated"&gt;What I hated&lt;/h3&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Inefficient with already downloaded dependencies. It will check remote repositories &lt;em&gt;every time&lt;/em&gt; you build even when you specified version number. Now I can see why they did that but not as a default. I mean sure version 1.12 may have had a bad bug and the project hotfixed in a new one with the same version number, but I’d say that’s really unlikely.  In a larger project with several repositories the difference in time to build between this and an alternate dependency manager Apache Ivy is stark.&lt;/li&gt;&#10;&lt;li&gt;Very opinionated view of the build process. Those of you used to (N)Ant or Rake will miss the lack of control. The AntRun plugin will help mitigate some of the lose of control.&lt;/li&gt;&#10;&lt;li&gt;HOME/.m2/settings.xml . Specific system wide settings do not belong in a build language. The bad heavy friction ideas that it enabled were legion. Just one example was I had to connect to my work VPN even when working on my home OSS projects hosted on github.&lt;/li&gt;&#10;&lt;li&gt;Way too XML for for sometimes simple things. To specify the version of java target language version see the figure below, this specifies Java 1.6.&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt; &lt;/p&gt;</description></item><item><title>Hudson CI Server: setting up remote slaves AND restrictive security together</title><link>https://blog.foundev.pro/2010/04/14/hudson-ci-server-setting-up-remote-slaves-and-restrictive-security-together.html</link><pubDate>Wed, 14 Apr 2010 00:00:00 +0000</pubDate><guid>https://blog.foundev.pro/2010/04/14/hudson-ci-server-setting-up-remote-slaves-and-restrictive-security-together.html</guid><description>&lt;h1&gt;Hudson CI Server: setting up remote slaves AND restrictive security together&lt;/h1&gt;&#10;### &lt;font color="#ff0000"&gt;NOTE: this applies to Hudson version 1.352&lt;/font&gt;&#10;&lt;p&gt;Ok so yesterday I was setting up a publicly accessible build server, that was not to be viewable to anonymous sources. So I configured Hudson to “matrix security” and disallowed all access to anonymous see fig 1-1.However, once I did this my slaves stopped working entirely.  Now I could have allowed some anonymous access but here was the long sought for trick.&lt;/p&gt;</description></item><item><title>Come see my Boo talk at Alamo Coders on the 14th</title><link>https://blog.foundev.pro/2010/04/13/come-see-my-boo-talk-at-alamo-coders-on-the-14th.html</link><pubDate>Tue, 13 Apr 2010 00:00:00 +0000</pubDate><guid>https://blog.foundev.pro/2010/04/13/come-see-my-boo-talk-at-alamo-coders-on-the-14th.html</guid><description>&lt;h1&gt;Come see my Boo talk at Alamo Coders on the 14th&lt;/h1&gt;&#10;UPDATE: added links for video, slides and source&#10;&lt;p&gt;&lt;strong&gt;S****ubject:&lt;/strong&gt; Boo: The Extensible Little Language On The CLR You’ve Never Heard Of.&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;When:&lt;/strong&gt; Wednesday April 14th at 5:45pm&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Where:&lt;/strong&gt; New Horizons In San Antonio &lt;a href="http://www.google.com/maps?f=q&amp;source=s_q&amp;hl=en&amp;geocode=&amp;q=New+Horizons+Computer+Learning,+8200+W+Ih+10,+San+Antonio,+TX+78230&amp;sll=29.520113,-98.490576&amp;sspn=0.051834,0.090895&amp;ie=UTF8&amp;hq=New+Horizons+Computer+Learning,&amp;hnear=W+Ih+10,+San+Antonio,+TX+78230&amp;ll=29.516185,-98.554401&amp;spn=0.049968,0.090895&amp;z=14&amp;iwloc=A" target="_blank"&gt;map&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Summary:&lt;/strong&gt; &lt;/p&gt;&#10;&lt;p&gt;I will be covering Boo basics, advanced features, and building a small domain specific language.&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Resources:&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;slides and source code are at &lt;a href="https://github.com/rssvihla/Presentations/tree/master/boo-dsl-talk/"&gt;https://github.com/rssvihla/Presentations/tree/master/boo-dsl-talk/&lt;/a&gt; .sorry keynote for now when final touches are made will export to PDF.&lt;/p&gt;</description></item><item><title>Domain Specific Languages with Boo: AST Macros</title><link>https://blog.foundev.pro/2010/04/05/domain-specific-languages-with-boo-ast-macros.html</link><pubDate>Mon, 05 Apr 2010 00:00:00 +0000</pubDate><guid>https://blog.foundev.pro/2010/04/05/domain-specific-languages-with-boo-ast-macros.html</guid><description>&lt;h1&gt;Domain Specific Languages with Boo: AST Macros&lt;/h1&gt;&#10;For those of you who don’t know what Boo is its a statically typed CLR language with Python like syntax that lets you extend it’s compiler, and the language itself easily by giving you access to the AST (Abstract Syntax Tree) and compiler’s context directly.&amp;#160; This gives you very powerful tools for building your own language or Domain Specific Language or DSL from here on out. Some examples of DSL’s include rSpec and Fluent NHibernate. In fact the entire subject of what is a DSL and what types of DSL there are and how to create a proper DSL could be a book itself and a fascinating one at that.&amp;#160; &#10;&lt;p&gt;Which is why I’ve been reading Ayende’s book &lt;a href="http://www.amazon.com/DSLs-Boo-Domain-Specific-Languages/dp/1933988606" target="_blank"&gt;DSLs in Boo: Domain Specific Languages in .NET&lt;/a&gt;. To make sure I understood the concepts I’ve taken to building a toy BDD DSL called bSpec, it’s got a long way to go to be something useful and I may not care to take it that far, however I did get my brain wrapped around a really cool thing called AST Macros. &lt;/p&gt;</description></item><item><title>Newbie Win32 Development Using Python</title><link>https://blog.foundev.pro/2010/01/16/newbie-win32-development-using-python.html</link><pubDate>Sat, 16 Jan 2010 00:00:00 +0000</pubDate><guid>https://blog.foundev.pro/2010/01/16/newbie-win32-development-using-python.html</guid><description>&lt;h1&gt;Newbie Win32 Development Using Python&lt;/h1&gt;&#10;First a disclaimer. I’m not in anyway shape or form an experienced win32 systems programmer.&amp;#160; I’ve always done application development or systems administration scripting. That in-between area where you get out your C/C++ compiler and start dealing with pointers is completely alien to me.&amp;#160; This has created problems in the past when I need to do something outside of the scope of C# and found myself staring at MSDN docs in C trying to extrapolate the equivalent C# code, and typically being disgusted at having to use hand rolled Structs with calls to Marshall.GetLastWin32Error().&#10;&lt;p&gt;Worse still I end up with a nasty implementation that requires slow, fragile integration tests to verify behavior or very verbose mirror interfaces where I’m testing order of calls. Look at the following code sample to read a reparse point’s target directory from &lt;a href="http://www.codeproject.com/KB/vista/Windows_Vista.aspx" target="_blank"&gt;code project&lt;/a&gt;:&lt;/p&gt;</description></item><item><title>Adventures in Meta programming in Python</title><link>https://blog.foundev.pro/2010/01/08/adventures-in-meta-programming-in-python-im-class-import-getattribute.html</link><pubDate>Fri, 08 Jan 2010 05:03:00 +0000</pubDate><guid>https://blog.foundev.pro/2010/01/08/adventures-in-meta-programming-in-python-im-class-import-getattribute.html</guid><description>&lt;h1&gt;Adventures in Meta programming in Python&lt;/h1&gt;&#10;With my recent work in Python win32 programming I&amp;rsquo;ve had a real need for AAA style mocking framework. Unable to find anything that I&amp;rsquo;ve been completely happy with I started my own simple mocking framework and got to learn some Python style meta programming&amp;nbsp; in the process. I&amp;rsquo;ve found out a lot about the depth of the Python 2.x object model over the last 2 weeks and here are some of the nicer things I&amp;rsquo;ve found (updated as per Chris Taveres below):&#10;&lt;h3 id="function_class--myclassfooim_class"&gt;function_class = MyClass.foo.im_class&lt;/h3&gt;&#10;&lt;p&gt;This is useful if you pass in an instance method  somewhere and you want to be able to access its attached class.  Decorators on instance methods normally use this, but I needed it to get a nicer syntax on my asserts, I wanted this:&lt;/p&gt;</description></item><item><title>Take 3: Python, ISP, IoC, and OCP need a fundamental rethink.</title><link>https://blog.foundev.pro/2009/11/20/take-3-python-isp-ioc-and-ocp-need-a-fundamental-rethink.html</link><pubDate>Fri, 20 Nov 2009 00:00:00 +0000</pubDate><guid>https://blog.foundev.pro/2009/11/20/take-3-python-isp-ioc-and-ocp-need-a-fundamental-rethink.html</guid><description>&lt;h1&gt;Take 3: Python, ISP, IoC, and OCP need a fundamental rethink.&lt;/h1&gt;&#10;In response to Julian’s thoughtful &lt;a href="http://www.colourcoding.net/Blog/archive/2009/11/20/dynamic-languages-and-solid-principles.aspx" target="_blank"&gt;Dynamic Languages and SOLID Principles&lt;/a&gt; I’d have to argue he is about 95% there but is missing the last critical links needed to view this in a whole different light. For ISP, Julian says it all:&#10;&lt;blockquote&gt;&#10;&lt;p&gt;Ultimately, I don’t think ISP is changed by Python, it’s just kind of irrelevant, for better or worse.&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;p&gt;Exactly!  Why even bother mentioning in the context of dynamic languages. A developer that understands it fully and one that does not will code the same way. Whereas LSP is still taught in dynamic languages, I’ve never seen it called that but I’ve seen many admonishments about subclass consistency, and not making client code aware of the differences, and is something that requires mentioning. With ISP we could ignore it’s entire existence and developers would code the same.&lt;/p&gt;</description></item><item><title>Take 2: Why we use SOLID in static languages and how we get the same functionality for cheap in dynamic languages</title><link>https://blog.foundev.pro/2009/11/19/take-2-why-we-use-solid-in-static-languages-and-how-we-get-the-same-functionality-for-cheap-in-dynamic-languages.html</link><pubDate>Thu, 19 Nov 2009 00:00:00 +0000</pubDate><guid>https://blog.foundev.pro/2009/11/19/take-2-why-we-use-solid-in-static-languages-and-how-we-get-the-same-functionality-for-cheap-in-dynamic-languages.html</guid><description>&lt;h1&gt;Take 2: Why we use SOLID in static languages and how we get the same functionality for cheap in dynamic languages&lt;/h1&gt;&#10;One of the things we do pretty well at Los Techies is explaining SOLID principles and why they make our code more maintainable and if you’re not familiar with our work on SOLID,&amp;#160; read &lt;a href="https://lostechies.com/blogs/chad_myers/archive/2008/03/07/pablo-s-topic-of-the-month-march-solid-principles.aspx" target="_blank"&gt;Chad Meyer&amp;#8217;s post&lt;/a&gt; to get an understanding on the Los Techies perspective. Now that you’ve taken a bit of time to read that the following chart takes SOLID’s benefits and then shows how they apply to dynamic languages:&#10;&lt;p&gt; &lt;/p&gt;</description></item><item><title>I recant my IoC! IoC containers in dynamic languages are silly.</title><link>https://blog.foundev.pro/2009/11/16/i-recant-my-ioc-ioc-containers-in-dynamic-languages-are-silly.html</link><pubDate>Mon, 16 Nov 2009 00:00:00 +0000</pubDate><guid>https://blog.foundev.pro/2009/11/16/i-recant-my-ioc-ioc-containers-in-dynamic-languages-are-silly.html</guid><description>&lt;h1&gt;I recant my IoC! IoC containers in dynamic languages are silly.&lt;/h1&gt;&#10;After a year or so of solid Alt Dot Net infection (as far as infections go its a pretty awesome one to have), I decided to give Python a try again for more than one off sysadmin tasks, and to actually dive into it as a newly minted “Agilista”.&amp;#160; &#10;&lt;p&gt;However, I had  a problem..there were no non-painful IoC containers in Python (sorry to the other authors of IoC frameworks in Python like Spring Python and Snake Guice, I know you try and I respect the effort).  Ultimately, I could &lt;u&gt;&lt;strong&gt;not&lt;/strong&gt;&lt;/u&gt;  imagine coding anymore without something to handle all my registration for me, that’d dynamically inject in my dependencies, give me hooks for contextual resolution, and give me rich interception support.&lt;/p&gt;</description></item><item><title>Alt.Net Evangelism And What We Could Do Better</title><link>https://blog.foundev.pro/2009/09/14/alt-net-evangelism-and-what-we-could-do-better.html</link><pubDate>Mon, 14 Sep 2009 00:00:00 +0000</pubDate><guid>https://blog.foundev.pro/2009/09/14/alt-net-evangelism-and-what-we-could-do-better.html</guid><description>&lt;h1&gt;Alt.Net Evangelism And What We Could Do Better&lt;/h1&gt;&#10;If we assume our goal as the Alt.Net community is to improve software development as a whole, we&amp;#8217;re doing a pretty bad job. &amp;nbsp;Not that many people have even heard of the concepts we espouse, and those that have but didn&amp;#8217;t convert become hostile to our ideas.&amp;nbsp;&#10;&lt;p&gt;My theory is because we focus so much on things that at the surface seem extraordinarily complex. Our terminology while correct, is acryonym laden and hard to grasp the real meaning. We ourselves sometimes lose site of why we even care about some of those principles, why we enacted them in the first place and what pain they caused to begin with.  &lt;/p&gt;</description></item><item><title>Playing With Haskell</title><link>https://blog.foundev.pro/2009/09/02/playing-with-haskell.html</link><pubDate>Wed, 02 Sep 2009 00:00:00 +0000</pubDate><guid>https://blog.foundev.pro/2009/09/02/playing-with-haskell.html</guid><description>&lt;h1&gt;Playing With Haskell&lt;/h1&gt;&#10;My tech book club is starting to look at Haskell. I'm as big of a language addict as anyone so I wanted to dive in early and this is the overview of what I've found so far&#10;&lt;h3 id="statically-typed-but-dynamically-inferred"&gt;Statically Typed But Dynamically Inferred&lt;/h3&gt;&#10;&lt;p&gt;for those of you familiar with Boo this is a familiar concept to you. Once a type is made that type will not autoconvert. For Example:&lt;/p&gt;</description></item><item><title>Simple BDD/TDD</title><link>https://blog.foundev.pro/2009/09/02/simple-bdd-tdd.html</link><pubDate>Wed, 02 Sep 2009 00:00:00 +0000</pubDate><guid>https://blog.foundev.pro/2009/09/02/simple-bdd-tdd.html</guid><description>&lt;h1&gt;Simple BDD/TDD&lt;/h1&gt;&#10;Todays theory is **most tests and specs should be very short (2-3 lines), have at most a setup for context establishment, avoid the majority of test framework features as they should be used as an exception and not as a rule.**&amp;nbsp; Note: I practice BDD nowadays and do not like using the term &amp;#8220;test&amp;#8221;, but these rules apply for BDD as well as TDD, and I imagine most of you practice TDD so I&amp;#8217;ll be using primarily TDD terminology.&#10;&lt;p&gt;If you look at my first attempts at TDD they are very similar to my current BDD work with only changes in language. But the contexts, conditions and tests are similar. Most importantly they’re easy to read. They’re all very short, very descriptive, make limited use of arguments in the NUnit Attributes, and make very limited use of mocking.&lt;/p&gt;</description></item><item><title>Dynamic Loading of .Net Assemblies</title><link>https://blog.foundev.pro/2009/08/31/dynamic-loading-of-net-assemblies.html</link><pubDate>Mon, 31 Aug 2009 00:00:00 +0000</pubDate><guid>https://blog.foundev.pro/2009/08/31/dynamic-loading-of-net-assemblies.html</guid><description>&lt;h1&gt;Dynamic Loading of .Net Assemblies&lt;/h1&gt;&#10;Problem: You have dependencies which can be in a number of directories outside of the directory your app is running in. DotNet AppDomains are heavy to say the least and very high in ceremony.&amp;#160; You do not want to deal with secondary app domain creation.&#10;&lt;p&gt;Solution: Override  AssemblyResolve event on your current app domain.&lt;/p&gt;&#10;&lt;p&gt; &lt;/p&gt;&lt;/p&gt;&#10;&lt;div style="padding-bottom: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;float: none;padding-top: 0px" class="wlWriterEditableSmartContent"&gt;&#10; &lt;div style="font-family:consolas,lucida console,courier,monospace"&gt;&#10; &amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff"&gt;public&lt;/span&gt;&amp;#160;&lt;span style="color:#0000ff"&gt;class&lt;/span&gt;&amp;#160;&lt;span style="color:#2b91af"&gt;AppDomainLoader&lt;/span&gt;&amp;#160;:&amp;#160;IAppDomainLoader&lt;br /&gt; &amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff"&gt;{&lt;/span&gt;&lt;br /&gt; &amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;br /&gt; &amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff"&gt;private&lt;/span&gt;&amp;#160;ResolveEventHandler&amp;#160;_searchAssemblyMethod&amp;#160;=&amp;#160;_searchDir;&lt;br /&gt; &amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff"&gt;public&lt;/span&gt;&amp;#160;ResolveEventHandler&amp;#160;FindAssemblyMethod&lt;br /&gt; &amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff"&gt;{&lt;/span&gt;&lt;br /&gt; &amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff"&gt;set&lt;/span&gt;&amp;#160;&lt;span style="color:#0000ff"&gt;{&lt;/span&gt;&amp;#160;_searchAssemblyMethod&amp;#160;=&amp;#160;&lt;span style="color:#0000ff"&gt;value&lt;/span&gt;;&amp;#160;&lt;span style="color:#0000ff"&gt;}&lt;/span&gt;&lt;br /&gt; &amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff"&gt;}&lt;/span&gt;&lt;br /&gt; &amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff"&gt;private&lt;/span&gt;&amp;#160;&lt;span style="color:#0000ff"&gt;static&lt;/span&gt;&amp;#160;&lt;span style="color:#2b91af"&gt;string&lt;/span&gt;[]&amp;#160;_directoriesToSearch;&lt;br /&gt; &amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff"&gt;private&lt;/span&gt;&amp;#160;&amp;#160;&lt;span style="color:#0000ff"&gt;static&lt;/span&gt;&amp;#160;Assembly&amp;#160;_searchDir(Object&amp;#160;o,&amp;#160;ResolveEventArgs&amp;#160;e)&lt;br /&gt; &amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff"&gt;{&lt;/span&gt;&lt;br /&gt; &amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff"&gt;foreach&lt;/span&gt;&amp;#160;(var&amp;#160;s&amp;#160;&lt;span style="color:#0000ff"&gt;in&lt;/span&gt;&amp;#160;_directoriesToSearch)&lt;br /&gt; &amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff"&gt;{&lt;/span&gt;&lt;br /&gt; &amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;var&amp;#160;filetoload&amp;#160;=&amp;#160;s&amp;#160;+&amp;#160;&amp;#160;e.Name.Split(&lt;span style="color:#a31515"&gt;&amp;#8216;,&amp;#8217;&lt;/span&gt;)[0]&amp;#160;+&amp;#160;&lt;span style="color:#a31515"&gt;&amp;#8220;.dll&amp;#8221;&lt;/span&gt;;&amp;#160;&lt;span style="color:#008000"&gt;//bad&amp;#160;one&amp;#160;liner&amp;#160;that&amp;#160;parses&amp;#160;the&amp;#160;first&amp;#160;part&amp;#160;of&amp;#160;the&amp;#160;assembly&amp;#160;name&amp;#160;and&amp;#160;adds&amp;#160;.dll&amp;#160;at&amp;#160;the&amp;#160;end&lt;br /&gt; &lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff"&gt;if&lt;/span&gt;&amp;#160;(File.Exists(filetoload))&amp;#160;&lt;span style="color:#008000"&gt;//sees&amp;#160;if&amp;#160;the&amp;#160;file&amp;#160;is&amp;#160;even&amp;#160;in&amp;#160;the&amp;#160;directory&lt;br /&gt; &lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff"&gt;{&lt;/span&gt;&lt;br /&gt; &amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff"&gt;return&lt;/span&gt;&amp;#160;Assembly.LoadFrom(filetoload);&amp;#160;&amp;#160;&lt;span style="color:#008000"&gt;//returns&amp;#160;assembly&amp;#160;once&amp;#160;found,&amp;#160;a&amp;#160;bit&amp;#160;naive&amp;#160;and&amp;#160;does&amp;#160;not&amp;#160;handle&amp;#160;version&amp;#160;conflicts&amp;#160;well.&lt;br /&gt; &lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff"&gt;}&lt;/span&gt;&lt;br /&gt; &amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff"&gt;}&lt;/span&gt;&lt;br /&gt; &amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff"&gt;return&lt;/span&gt;&amp;#160;&lt;span style="color:#0000ff"&gt;null&lt;/span&gt;;&lt;br /&gt; &amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;br /&gt; &amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff"&gt;}&lt;/span&gt;&lt;br /&gt; &amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;br /&gt; &amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff"&gt;public&lt;/span&gt;&amp;#160;&lt;span style="color:#0000ff"&gt;void&lt;/span&gt;&amp;#160;Search(&lt;span style="color:#2b91af"&gt;string&lt;/span&gt;[]&amp;#160;directoriesToSearch)&lt;br /&gt; &amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff"&gt;{&lt;/span&gt;&lt;br /&gt; &amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;_directoriesToSearch&amp;#160;=&amp;#160;directoriesToSearch;&amp;#160;&lt;span style="color:#008000"&gt;//sets&amp;#160;directories&amp;#160;to&amp;#160;search&amp;#160;to&amp;#160;allow&amp;#160;entry&amp;#160;point&amp;#160;for&amp;#160;dynamic&amp;#160;searching&lt;br /&gt; &lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;AppDomain.CurrentDomain.AssemblyResolve&amp;#160;-=&amp;#160;_searchAssemblyMethod;&amp;#160;&lt;span style="color:#008000"&gt;//cleans&amp;#160;up&amp;#160;previous&amp;#160;events,&amp;#160;may&amp;#160;not&amp;#160;be&amp;#160;needed.&lt;br /&gt; &lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;AppDomain.CurrentDomain.AssemblyResolve&amp;#160;+=&amp;#160;_searchAssemblyMethod;&amp;#160;&lt;span style="color:#008000"&gt;//registered&amp;#160;the&amp;#160;event&lt;br /&gt; &lt;/span&gt;&lt;br /&gt; &amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff"&gt;}&lt;/span&gt;&lt;br /&gt; &amp;#160;&amp;#160;&amp;#160;&amp;#160;&lt;span style="color:#0000ff"&gt;}&lt;/span&gt;&#10; &lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;Now whenever there is a missing Assembly, the _searchAssemblyMethod will be fired,  and all directories given to the Search method will attempt to find an assembly with the matching name.&lt;/p&gt;</description></item><item><title>Focused and Narrow; Superficial and Broad</title><link>https://blog.foundev.pro/2009/08/30/focused-and-narrow-superficial-and-broad.html</link><pubDate>Sun, 30 Aug 2009 00:00:00 +0000</pubDate><guid>https://blog.foundev.pro/2009/08/30/focused-and-narrow-superficial-and-broad.html</guid><description>&lt;h1&gt;Focused and Narrow; Superficial and Broad&lt;/h1&gt;&#10;In my 20&amp;#8217;s I got exposed to a large variety of work situations and was able to succeed in a variety of technical fields (admin, developer, hardware tech, etc). I had the time back then to not have to choose which direction I went with things, I went broad but deep into each field I was interested in. Every couple of years I&amp;#8217;d go head long into another field and read dozen books, setup labs experiment like crazy, use whatever connections I&amp;#8217;d made to get my foot in the door somewhere and then make sure I delivered in big ways, and most importantly keep reviewing what I&amp;#8217;d done in the past to make sure it actually did work and did work well.&#10;&lt;p&gt;This obsessive learning habit had a great side effect, as long as I stuck to slightly related fields I learned exponentially more. Learning about networking made helping customers with a variety of issues far easier when I was just a lowly computer tech.  When I was trying to automate customer installations in a repeatable way, learning software development even at a trivial level made things possible that were not otherwise.  I got to see how everythign interconnected.&lt;/p&gt;</description></item><item><title>Hero Mode Refactoring” AKA Enemy Of Brown Field Development</title><link>https://blog.foundev.pro/2009/08/14/hero-mode-refactoring-aka-enemy-of-brown-field-development.html</link><pubDate>Fri, 14 Aug 2009 00:00:00 +0000</pubDate><guid>https://blog.foundev.pro/2009/08/14/hero-mode-refactoring-aka-enemy-of-brown-field-development.html</guid><description>&lt;h1&gt;“Hero Mode Refactoring” AKA Enemy Of Brown Field Development&lt;/h1&gt;&#10;What do I mean by “Hero Mode Refactoring”?&amp;#160; We’ve all worked with code that wasn’t easily made testable. Most of the time we see a big ball of mud and have no idea where to begin. Sometimes however we have an epiphany, a \_great\_idea_ , a “cold fusion” moment (that ends up being poignant in so many ways).&amp;#160; &#10;&lt;p&gt;Filled with the excitement of our vision we dive head long into our work, replacing concrete classes with interfaces, removing big swaths of redundant code, and in general making changes you should only make with a an already unit tested code base.  Before we know it, 5 things are broken in weird ways, and it now takes us days of manual verification to figure out what works and what doesn’t.  That is hero mode refactoring at its best.&lt;/p&gt;</description></item><item><title>Introducing SpecMaker “Rspec style” BDD in C#</title><link>https://blog.foundev.pro/2009/08/08/introducing-specmaker-rspec-style-bdd-in-c.html</link><pubDate>Sat, 08 Aug 2009 00:00:00 +0000</pubDate><guid>https://blog.foundev.pro/2009/08/08/introducing-specmaker-rspec-style-bdd-in-c.html</guid><description>&lt;h1&gt;Introducing SpecMaker “Rspec style” BDD in C#&lt;/h1&gt;&#10;So I&amp;rsquo;m certain this will be met with mixed response, because really .Net already has several decent BDD frameworks and many of you will chastise me for adding yet another framework when really BDD has nothing to do with what testing framework you use.&amp;nbsp; So why you ask?&#10;&lt;ol&gt;&#10;&lt;li&gt;Most of the BDD frameworks I’ve looked at are Acceptance style and trying to make stories into executable code (NBehave, StoryTeller, Fitnesse.Net ,Acceptance, etc).  I want something that describes to other developers in a behavior centric way what my code is doing (like RSpec’s default DSL does).  This is not aimed at business analysts.&lt;/li&gt;&#10;&lt;li&gt;The other RSpec style framework for C# I’ve played with while very nice, did not go over well with people I’ve tried to introduce to BDD.&lt;/li&gt;&#10;&lt;li&gt;Using NUnit in a context BDD style is normally what I do but produces a lot of artifacts, is underscore heaven and provides no guidance to newer practitioners of BDD.&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;With all this in mind how does SpecMaker improve our situation at all?  First lets look at how I might approach a BDD test with NUnit&lt;/p&gt;</description></item><item><title>Windsor style convention over configuration in StructureMap</title><link>https://blog.foundev.pro/2009/08/07/windsor-style-convention-over-configuration-in-structuremap.html</link><pubDate>Fri, 07 Aug 2009 00:00:00 +0000</pubDate><guid>https://blog.foundev.pro/2009/08/07/windsor-style-convention-over-configuration-in-structuremap.html</guid><description>&lt;h1&gt;Windsor style convention over configuration in StructureMap&lt;/h1&gt;&#10;So I was trying to get my&amp;#160; BDD project &lt;a href="https://github.com/rssvihla/specmaker/tree/master" target="_blank"&gt;SpecMaker&lt;/a&gt; working on Mono only to find out&amp;#160; my usual IoC container of choice &lt;a href="http://www.castleproject.org/container/index.html" target="_blank"&gt;Castle Windsor&lt;/a&gt; does not play nice.&amp;#160; &lt;a href="http://structuremap.sourceforge.net/Default.htm" target="_blank"&gt;StructureMap&lt;/a&gt; I’ve heard plays nice in Mono, and I know a bunch of people that use it, so I gave it a whirl.&#10;&lt;p&gt;My original Windsor configuration looked something like this:&lt;/p&gt;&#10;&lt;div style="padding-bottom: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;float: none;padding-top: 0px" class="wlWriterEditableSmartContent"&gt;&#10; &lt;div style="font-family:consolas,lucida console,courier,monospace"&gt;&#10; &amp;#160;var&amp;#160;kernel&amp;#160;=&amp;#160;&lt;span style="color:#0000ff"&gt;new&lt;/span&gt;&amp;#160;DefaultKernel();&lt;br /&gt; &amp;#160;kernel.Register(Component.For&lt;IReportFactory&gt;().ImplementedBy(factory));&amp;#160;&lt;span style="color:#008000"&gt;//load&amp;#160;implementation&lt;br /&gt; &lt;/span&gt;&amp;#160;kernel.Register(&lt;br /&gt; &amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;AllTypes.Pick().&lt;br /&gt; &amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;FromAssembly(GetType().Assembly).&lt;br /&gt; &amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;WithService.FirstInterface().&amp;#160;&amp;#160;&lt;span style="color:#008000"&gt;//regardless&amp;#160;of&amp;#160;naming&amp;#160;first&amp;#160;interface&amp;#160;is&amp;#160;listed&amp;#160;as&amp;#160;service&lt;br /&gt; &lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;Configure(c=&gt;c.LifeStyle.Transient));&#10; &lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;I changed this to the what I thought was the StructureMap equivalent:&lt;/p&gt;</description></item><item><title>Discussion: Mentoring, Knowledge Transfer and Different Styles Of Learning</title><link>https://blog.foundev.pro/2009/07/17/discussion-mentoring-knowledge-transfer-and-different-styles-of-learning.html</link><pubDate>Fri, 17 Jul 2009 00:00:00 +0000</pubDate><guid>https://blog.foundev.pro/2009/07/17/discussion-mentoring-knowledge-transfer-and-different-styles-of-learning.html</guid><description>&lt;h1&gt;Discussion: Mentoring, Knowledge Transfer and Different Styles Of Learning&lt;/h1&gt;&#10;I&amp;rsquo;ve been very fortunate that for most of my adult life, even before I got into tech I&amp;rsquo;ve been &amp;ldquo;the boss&amp;rdquo;, and had gobs of mentoring opportunities. I enjoy it and more importantly I know I will have a greater effect for my company&amp;#8217;s growth through teaching than I would by solely focusing on my advancement.&#10;&lt;p&gt;My students have been visual learners, “doing” learners, audio learners, those that learn by rote memorization with photographic memories, “theorists” that are fascinated by the theory of things far more than the practice, and those that can’t memorize anything unless they see an entire system in place. Each type or combination needs to have information presented in different ways.&lt;/p&gt;</description></item><item><title>Lessons From My First Attempt At Bringing Agile Into A Non-Agile shop.</title><link>https://blog.foundev.pro/2009/07/12/lessons-from-my-first-attempt-at-bringing-agile-into-a-non-agile-shop.html</link><pubDate>Sun, 12 Jul 2009 00:00:00 +0000</pubDate><guid>https://blog.foundev.pro/2009/07/12/lessons-from-my-first-attempt-at-bringing-agile-into-a-non-agile-shop.html</guid><description>&lt;h1&gt;Lessons From My First Attempt At Bringing Agile Into A Non-Agile shop.&lt;/h1&gt;&#10;Since I’m moving on from my current employer I figure now is a great time to share my post-mortem of my time there, specifically what worked, what didn’t and what did I learn.&#10;&lt;h3&gt;&lt;/h3&gt;&#10;&lt;h3 id="iterations-of-any-length"&gt;Iterations Of Any Length&lt;/h3&gt;&#10;&lt;p&gt;We tried 3 weeks, 2 weeks, 1 week, monthly and eventually just sort of tossed the system out all together as our team got shrunk from 5 to 2.  We did find get a fairly desirable result ultimately but more on that later.  Ultimately our problem was especially as we got smaller, dealing with our “particular” realities made iterations tend to fall apart, we were spending a fair amount of time trying to torture ever more atomic stories together.  Cutting iterations out all together and focusing on features being completed was MUCH more time effective for us.&lt;/p&gt;</description></item><item><title>VAN: Castle Monorail, Active Record and Brail talk at Wednesday 8PM CST (-5 GMT), by yours truly.</title><link>https://blog.foundev.pro/2009/07/07/van-castle-monorail-active-record-and-brail-talk-at-wednesday-8pm-cst-5-gmt-by-yours-truly.html</link><pubDate>Tue, 07 Jul 2009 00:00:00 +0000</pubDate><guid>https://blog.foundev.pro/2009/07/07/van-castle-monorail-active-record-and-brail-talk-at-wednesday-8pm-cst-5-gmt-by-yours-truly.html</guid><description>&lt;h1&gt;VAN: Castle Monorail, Active Record and Brail talk at Wednesday 8PM CST (-5 GMT), by yours truly.&lt;/h1&gt;&#10;Last week I did a talk on Windsor and it went..ok. I’m not used to online presentations and am more experienced in front of crowds that I can interact with.&#10;&lt;p&gt;So between last week’s experience and some advice from &lt;a href="https://lostechies.com/blogs/joe_ocampo/" target="_blank"&gt;Agile Joe&lt;/a&gt; this talk I’ll be aiming for more of a screen cast feel.  The talk should go for close to an hour and will be open for questions afterword.&lt;/p&gt;</description></item><item><title>Python Web Framework Series – Pylons: Part 7 Refactoring Deployment and Wrap up</title><link>https://blog.foundev.pro/2009/07/04/python-web-series-pylons-part-7-refactoring-deployment-and-wrap-up.html</link><pubDate>Sat, 04 Jul 2009 00:00:00 +0000</pubDate><guid>https://blog.foundev.pro/2009/07/04/python-web-series-pylons-part-7-refactoring-deployment-and-wrap-up.html</guid><description>&lt;h1&gt;Python Web Framework Series – Pylons: Part 7 Refactoring Deployment and Wrap up&lt;/h1&gt;&#10;Lets take a look at our existing site and what we can do to clean it up and add some badly needed functionality, however that is beyond the scope of my series. So I&amp;rsquo;m going to leave some hints for the remaining functionality to get you started.&#10;&lt;h3 id="refactoring-ideas"&gt;Refactoring Ideas&lt;/h3&gt;&#10;&lt;h3&gt;&lt;/h3&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Replace default authkit login with custom login. HINT: make a sign-in link on your public page. then redirect to a custom login page that uses authkit. Trying it any other way will make you lose hair.&lt;/li&gt;&#10;&lt;li&gt;Refactor database access into a class or two. This will make the db access more testable and allow you to monkey patch in different behavior later. HINT: If your controllers can avoid having to know anything about SQLAlchemy you’ve done your job.&lt;/li&gt;&#10;&lt;li&gt;Replace return “rsvihla” in the users.py module with actual authkit user. HINT: just access pylons request object: “request.environ.get(“REMOTE_USER”)”&lt;/li&gt;&#10;&lt;li&gt;Create admin ui for users, with roles. HINT: look at &lt;a target="_blank" href="http://pylonsbook.com/en/1.0/simplesite-tutorial-part-3.html"&gt;Pylons Book&lt;/a&gt; for Authkit ideas here.&lt;/li&gt;&#10;&lt;li&gt;Split threads into categories and then give the ability to respond to posts. HINT: just more controllers and views.&lt;/li&gt;&#10;&lt;li&gt;Makes parts of your view visible depending on if a user has certain rights or not. HINT: while this is not what you’ll find in the Pylons Book I highly suggest not have gobs of if/else checks in your views. Make small functions that you can unit test easily which will change what is visible depending on role, then have your views call these. See what I did with my user.py module for a concept.&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h3 id="deployment"&gt;Deployment&lt;/h3&gt;&#10;&lt;p&gt;This almost completely depends on your situation with hosting. If you are using something like &lt;a target="_blank" href="http://www.webfaction.com/"&gt;WebFaction&lt;/a&gt; you just have to upload files and follow their directions. I found it trivial to have a production site up and running with them.&lt;/p&gt;</description></item><item><title>Python Web Framework Series – Pylons: Part 6 Basic Authorization With AuthKit</title><link>https://blog.foundev.pro/2009/07/03/python-web-framework-series-pylons-part-6-authentication-and-authorization-with-authkit.html</link><pubDate>Fri, 03 Jul 2009 00:00:00 +0000</pubDate><guid>https://blog.foundev.pro/2009/07/03/python-web-framework-series-pylons-part-6-authentication-and-authorization-with-authkit.html</guid><description>&lt;h1&gt;Python Web Framework Series – Pylons: Part 6 Basic Authorization With AuthKit&lt;/h1&gt;&#10;Last post we left off with very basic database access, and testing story completed. Now we&amp;#8217;re going to look at basic Authorization and Authentication with AuthKit. NOTE: most of this post is just an aggregation of a couple of chapters in the [Pylons Book](http://pylonsbook.com/en/1.0/simplesite-tutorial-part-3.html) since this setup is a good base starting point. Read the previous link to the Pylons Book for more in depth coverage of this topic.&amp;nbsp; &#10;&lt;h3 id="setting-up-authkit"&gt;Setting Up AuthKit&lt;/h3&gt;&#10;&lt;p&gt;First lets make sure we have AuthKit installed: &lt;em&gt;easy_install AuthKit&lt;/em&gt;. For this post we’re working with AuthKit 0.4.3, your mileage may vary if you read this post in the future and are using a different version. Now that we have Authkit installed open up &lt;strong&gt;pylonsforumconfigmiddleware.py&lt;/strong&gt; add the following imports:&lt;/p&gt;</description></item><item><title>Python Web Framework Series – Pylons: Part 5 Testing Models</title><link>https://blog.foundev.pro/2009/07/02/python-web-framework-series-pylons-part-5-testing-models.html</link><pubDate>Thu, 02 Jul 2009 20:09:00 +0000</pubDate><guid>https://blog.foundev.pro/2009/07/02/python-web-framework-series-pylons-part-5-testing-models.html</guid><description>&lt;h1&gt;"Python Web Framework Series – Pylons: Part 5 Testing Models"&lt;/h1&gt;&#10;UPDATE: was an error caught by Govind (who is turning out to be my unofficial proofreader). I&amp;#8217;ve made a correction in the thread mapping for &amp;#8220;dateadded&amp;#8221; property in the _previous_ article. If this you are caught up with and _error indicating there is no dateadded property on thread_ make sure to edit your **model\_\_init\_\_.py** file to match the previous article and rebuild your db so that everything is happy. Please bear with me as I hone my tutorial writing skill set.&#10;&lt;p&gt;When we last left of with our Pylons forum we had a had just successfully created a post, and then could immediately retrieve that same post. However, we kind of skimped on the testing story so lets fill in the gaps and do some refactoring as a bonus.&lt;/p&gt;</description></item><item><title>Python Web Framework Series – Pylons: Part 4 Introduction For Database Support With SQL Alchemy</title><link>https://blog.foundev.pro/2009/06/29/python-web-framework-series-pylons-part-4-database-support-with-sql-alchemy.html</link><pubDate>Mon, 29 Jun 2009 02:54:00 +0000</pubDate><guid>https://blog.foundev.pro/2009/06/29/python-web-framework-series-pylons-part-4-database-support-with-sql-alchemy.html</guid><description>&lt;h1&gt;"Python Web Framework Series – Pylons: Part 4 Introduction For Database Support With SQL Alchemy"&lt;/h1&gt;&#10;We last left off with &lt;a href="https://blog.foundev.pro/2009/06/25/python-web-framework-series-pylons-part-3-views-with-mako.html" target="_blank"&gt;Views with Mako&lt;/a&gt;, now Pylons does not enforce on you an ORM at all, so you can use hand crafted SQL if you prefer. However, since I&amp;rsquo;ve done enough of that for a career or two we&amp;rsquo;re going to use my Python ORM of choice and the preferred one for Pylons SQLAlchemy. &#10;&lt;h3 id="where-does-sqlalchemy-fit-in-as-an-orm"&gt;Where does SQLAlchemy fit in as an ORM?&lt;/h3&gt;&#10;&lt;p&gt;If you used NHibernate, you should feel pretty close to right at home with SQLAlchemy. If you come from an ActiveRecord, Entity Framework, Subsonic,  or even Linq2Sql background this will be a bit more hand management than you are used to. If that is the case, I suggest  &lt;a href="http://elixir.ematia.de/trac/wiki" target="_blank"&gt;Elixir&lt;/a&gt; (which I’ve heard great things about) or &lt;a href="http://www.sqlobject.org/" target="_blank"&gt;SQLObject&lt;/a&gt; (which I’ve used as well and works fine).&lt;/p&gt;</description></item><item><title>Python Web Framework Series – Pylons: Part 3 Views with Mako</title><link>https://blog.foundev.pro/2009/06/25/python-web-framework-series-pylons-part-3-views-with-mako.html</link><pubDate>Thu, 25 Jun 2009 04:53:00 +0000</pubDate><guid>https://blog.foundev.pro/2009/06/25/python-web-framework-series-pylons-part-3-views-with-mako.html</guid><description>&lt;h1&gt;"Python Web Framework Series – Pylons: Part 3 Views with Mako"&lt;/h1&gt;&#10;This is a huge post and I should have split this into several smaller ones so please bear with me while I get my series format tweaked. We last left off with &lt;a href="https://blog.foundev.pro/2009/06/24/python-web-framework-series-pylons-part-2-controllers-and-views.html" target="_blank"&gt;Controllers, Views and Testing&lt;/a&gt; with a basic test, basic view and basic controller.&amp;nbsp; Now with our basic scaffold built we can focus on making our views reusable, dynamic, and more pleasant to look at.&#10;&lt;h3 id="first-things-first"&gt;First things first&lt;/h3&gt;&#10;&lt;p&gt;First before we dive too deeply into Mako, lets setup a default home page by doing the following:&lt;/p&gt;</description></item><item><title>VAN: Doing 2 Part Series on Castle development July 1st and 8th at 8pm</title><link>https://blog.foundev.pro/2009/06/25/van-doing-2-part-series-on-castle-development-july-1st-and-8th-at-8pm.html</link><pubDate>Thu, 25 Jun 2009 00:00:00 +0000</pubDate><guid>https://blog.foundev.pro/2009/06/25/van-doing-2-part-series-on-castle-development-july-1st-and-8th-at-8pm.html</guid><description>&lt;h1&gt;VAN: Doing 2 Part Series on Castle development July 1st and 8th at 8pm&lt;/h1&gt;&#10;I know this isn't related to my Pylons series and worry not there is no interruption in that, but I&amp;#8217;m giving a couple of talks on &lt;a target="_blank" title="Virtual Alt.net" href="https://blog.foundev.pro/controlpanel/blogs/posteditor.aspx/www.virtualaltnet.com"&gt;Virtual Alt.Net&lt;/a&gt;&lt;span style="border-collapse: collapse"&gt;. The first one I've done before and you may have heard it at Alamo Coders, the second one is all new and it'll give me opportunity to clean up and release my lightweight plugin framework for monorail.&lt;/span&gt;&#10;&lt;p&gt;For those of you who don&amp;rsquo;t know Virtual Alt Net is held over Live Meeting &lt;a target="_self" title="here" href="http://www.snipr.com/virtualaltnet"&gt;here&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Python Web Framework Series – Pylons: Part 2 Controllers, Views and Testing</title><link>https://blog.foundev.pro/2009/06/24/python-web-framework-series-pylons-part-2-controllers-and-views.html</link><pubDate>Wed, 24 Jun 2009 13:22:00 +0000</pubDate><guid>https://blog.foundev.pro/2009/06/24/python-web-framework-series-pylons-part-2-controllers-and-views.html</guid><description>&lt;h1&gt;"Python Web Framework Series – Pylons: Part 2 Controllers, Views and Testing"&lt;/h1&gt;&#10;We last left off with &lt;a target="_blank" href="https://blog.foundev.pro/2009/06/23/python-web-framework-series-pylons-part-1-getting-started.html"&gt;Getting Started&lt;/a&gt; and having created our &amp;ldquo;pylonsforum&amp;rdquo; project and generated our first controller.&#10;&lt;p&gt;Source for home.py&lt;/p&gt;&#10;&lt;p&gt;``&lt;/p&gt;&#10;&lt;div class="wlWriterEditableSmartContent" style="padding-bottom: 0px;margin: 0px;padding-left: 0px;padding-right: 0px;float: none;padding-top: 0px"&gt;&#10;&lt;div style="font-family:consolas,lucida console,courier,monospace"&gt;&#10;&lt;span style="color: #0000ff"&gt;import&lt;/span&gt;&amp;nbsp;logging&amp;nbsp;&lt;/p&gt; &#10;&lt;p&gt;&#10;&lt;span style="color: #0000ff"&gt;from&lt;/span&gt;&amp;nbsp;pylons&amp;nbsp;&lt;span style="color: #0000ff"&gt;import&lt;/span&gt;&amp;nbsp;request,&amp;nbsp;response,&amp;nbsp;session,&amp;nbsp;tmpl_context&amp;nbsp;&lt;span style="color: #0000ff"&gt;as&lt;/span&gt;&amp;nbsp;c&amp;nbsp;&lt;br /&gt; &lt;span style="color: #0000ff"&gt;from&lt;/span&gt;&amp;nbsp;pylons.controllers.util&amp;nbsp;&lt;span style="color: #0000ff"&gt;import&lt;/span&gt;&amp;nbsp;abort,&amp;nbsp;redirect_to&amp;nbsp;&#10;&lt;/p&gt;&#10;&lt;p&gt;&#10;&lt;span style="color: #0000ff"&gt;from&lt;/span&gt;&amp;nbsp;pylonsforum.lib.base&amp;nbsp;&lt;span style="color: #0000ff"&gt;import&lt;/span&gt;&amp;nbsp;BaseController,&amp;nbsp;render&amp;nbsp;&#10;&lt;/p&gt;&#10;&lt;p&gt;&#10; log&amp;nbsp;=&amp;nbsp;logging.getLogger(__name__)&amp;nbsp;&#10;&lt;/p&gt;&#10;&lt;p&gt;&#10;&lt;span style="color: #0000ff"&gt;class&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af"&gt;HomeController&lt;/span&gt;(BaseController):&amp;nbsp;&#10;&lt;/p&gt;&#10;&lt;p&gt;&#10; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;def&lt;/span&gt;&amp;nbsp;index(self):&amp;nbsp;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000"&gt;#&amp;nbsp;Return&amp;nbsp;a&amp;nbsp;rendered&amp;nbsp;template&amp;nbsp;&lt;/span&gt;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000"&gt;#return&amp;nbsp;render(&amp;#8216;/home.mako&amp;#8217;)&amp;nbsp;&lt;/span&gt;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000"&gt;#&amp;nbsp;or,&amp;nbsp;return&amp;nbsp;a&amp;nbsp;response&amp;nbsp;&lt;/span&gt;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style="color: #a31515"&gt;&amp;#8216;Hello&amp;nbsp;World&lt;/span&gt; &lt;/div&gt; &lt;/div&gt; &#10;&lt;p&gt;&#10; Source for test_home.py&lt;code&gt;&lt;/code&gt;&#10;&lt;/p&gt;</description></item><item><title>Python Web Framework Series – Pylons: Part 1 Getting Started</title><link>https://blog.foundev.pro/2009/06/23/python-web-framework-series-pylons-part-1-getting-started.html</link><pubDate>Tue, 23 Jun 2009 14:00:00 +0000</pubDate><guid>https://blog.foundev.pro/2009/06/23/python-web-framework-series-pylons-part-1-getting-started.html</guid><description>&lt;h1&gt;Python Web Framework Series – Pylons: Part 1 Getting Started&lt;/h1&gt;&#10;This article assumes you have &lt;a target="_blank" href="http://www.python.org/download/"&gt;Python 2.6&lt;/a&gt; and &lt;a target="_blank" href="http://pypi.python.org/pypi/setuptools"&gt;Setuptools&lt;/a&gt; already installed on your machine and that you&amp;rsquo;re install SQL Alchemy 0.54 and Pylons 0.97&#10;&lt;h3 id="overview"&gt;Overview&lt;/h3&gt;&#10;&lt;p&gt;Pylons is a component based MVC web framework. It, like a lot of more recent MVC frameworks, is borrowing some ideas and concepts from rails  in a less “opinionated “ way.&lt;/p&gt;&#10;&lt;p&gt;Out of the box Pylons has a preference for using &lt;a target="_blank" href="http://www.sqlalchemy.org/"&gt;SQL Alchemy&lt;/a&gt; for ORM (similar to NHibernate in philosophy) and &lt;a target="_blank" href="http://www.makotemplates.org/"&gt;Mako&lt;/a&gt; template engine (uses Python code for markup) .  Now if you prefer &lt;a target="_blank" href="http://www.sqlobject.org/"&gt;SQLObject&lt;/a&gt; , or the &lt;a target="_blank" href="http://elixir.ematia.de/trac/wiki"&gt;Elixer&lt;/a&gt; dialect of SQL Alchemy for ORM and &lt;a target="_blank" href="http://genshi.edgewall.org/"&gt;Genshi&lt;/a&gt; template engine pylons supports them all (and others).  More importantly this means you have choice down the road to match your personal preferences or particular project complexity needs.&lt;/p&gt;</description></item><item><title>Python Web Framework Series</title><link>https://blog.foundev.pro/2009/06/22/python-web-framework-series.html</link><pubDate>Mon, 22 Jun 2009 13:31:00 +0000</pubDate><guid>https://blog.foundev.pro/2009/06/22/python-web-framework-series.html</guid><description>&lt;h1&gt;Python Web Framework Series&lt;/h1&gt;&#10;I've wanted to dive more in depth into Python's web frameworks for some time and get to know them the way I know Castle Monorail.&#10;&lt;p&gt;What better way to learn something in depth than to have to know it well enough to show to someone else.Therefore, I plan on posting a relatively in depth walkthrough of Pylons (and if the interest is there Django and Turbogears as well).&lt;/p&gt;</description></item><item><title>Engineering or Customer Service which is more important?</title><link>https://blog.foundev.pro/2009/06/07/engineering-or-customer-service-which-is-more-important.html</link><pubDate>Sun, 07 Jun 2009 19:16:00 +0000</pubDate><guid>https://blog.foundev.pro/2009/06/07/engineering-or-customer-service-which-is-more-important.html</guid><description>&lt;h1&gt;Engineering or Customer Service which is more important?&lt;/h1&gt;&#10;I've been reading a lot about lean/toyota way lately, mixing that with my past experience as an IT Consultant and throwing that up against a bit of an Ivory tower I fell into with XP that left me unable to deal with the following scenario:&#10;&lt;p&gt;&lt;em&gt;You&amp;rsquo;re reviewing code either yours or someone elses right before release. you find the code strewn with anti-patterns and unnecessary conditionals. You are due to ship tomorrow. The code works but is not maintainable, do you ship?&lt;/em&gt;&lt;/p&gt;</description></item><item><title>Castle ActiveRecord and registering classes at runtime</title><link>https://blog.foundev.pro/2009/06/03/castle-activerecord-and-registering-classes-at-runtime.html</link><pubDate>Wed, 03 Jun 2009 06:02:00 +0000</pubDate><guid>https://blog.foundev.pro/2009/06/03/castle-activerecord-and-registering-classes-at-runtime.html</guid><description>&lt;h1&gt;Castle ActiveRecord and registering classes at runtime&lt;/h1&gt;&#10;*EDIT: this is an old post copied over from my [old blog on Los Techies](https://lostechies.com/ryansvihla/2009/06/03/castle-activerecord-and-registering-classes-at-runtime/), I have kept it here for archival reasons.*&#10;&lt;p&gt;I use the following trick for adding ActiveRecord classes after the fact for our in-house plug-in architecture. Thanks to whichever blogger/mailing list I picked this up from so long ago.&lt;/p&gt;&#10;&lt;h2 id="scenario-1-classes-to-load-inherit-from-same-base-class-as-current-running-activerecord-classes"&gt;Scenario 1: Class(es) to load inherit from same base class as current running ActiveRecord classes&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f7f7f7;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#cf222e"&gt;var&lt;/span&gt; holder &lt;span style="color:#1f2328"&gt;=&lt;/span&gt; ActiveRecordMediator&lt;span style="color:#1f2328"&gt;.&lt;/span&gt;GetSessionFactoryHolder&lt;span style="color:#1f2328"&gt;();&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#57606a"&gt;//register your subclasses here&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ActiveRecordStarter&lt;span style="color:#1f2328"&gt;.&lt;/span&gt;RegisterTypes&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;&lt;span style="color:#cf222e"&gt;typeof&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;Employee&lt;span style="color:#1f2328"&gt;),&lt;/span&gt; &lt;span style="color:#cf222e"&gt;typeof&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;Customer&lt;span style="color:#1f2328"&gt;));&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;holder&lt;span style="color:#1f2328"&gt;.&lt;/span&gt;RegisterSessionFactory&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; holder&lt;span style="color:#1f2328"&gt;.&lt;/span&gt;GetConfiguration&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;&lt;span style="color:#cf222e"&gt;typeof&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;ActiveRecordBase&lt;span style="color:#1f2328"&gt;)).&lt;/span&gt;BuildSessionFactory&lt;span style="color:#1f2328"&gt;(),&lt;/span&gt; &lt;span style="color:#cf222e"&gt;typeof&lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;ActiveRecordBase&lt;span style="color:#1f2328"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#1f2328"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#57606a"&gt;//reloads session factory without this types will not be registered. &lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#57606a"&gt;//I believe this is actually a &amp;#34;feature&amp;#34; in Castle trunk. may be fixed now.&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This is all you need to register extra classes that are accessing the same database as the application is using.&lt;/p&gt;</description></item><item><title>IronPython how cool it is</title><link>https://blog.foundev.pro/2009/05/28/ironpython-how-cool-it-is.html</link><pubDate>Thu, 28 May 2009 05:08:00 +0000</pubDate><guid>https://blog.foundev.pro/2009/05/28/ironpython-how-cool-it-is.html</guid><description>&lt;h1&gt;IronPython how cool it is&lt;/h1&gt;&#10;*EDIT: this is an old post copied over from my [old blog on Los Techies](https://lostechies.com/ryansvihla/2009/05/28/ironpython-how-cool-it-is/), I have kept it here for archival reasons.*&#10;&lt;p&gt;Briefly, &lt;a href="http://www.codeplex.com/IronPython"&gt;IronPython&lt;/a&gt; is an implementation of Python in the .Net runtime. This allows you access to .Net framework goodness while programming in a dynamic language. The current stable version 2.0.1 maps to CPython 2.5.This allows me to do fun fun things like use my python project to access a c# project. follows is a python script using Pinsor and accessing a .net dll.&lt;/p&gt;</description></item><item><title>Context and Spec style testing and my approach to BDD</title><link>https://blog.foundev.pro/2009/05/22/context-spec-style-testing-and-my-approach-to-bdd.html</link><pubDate>Fri, 22 May 2009 00:21:00 +0000</pubDate><guid>https://blog.foundev.pro/2009/05/22/context-spec-style-testing-and-my-approach-to-bdd.html</guid><description>&lt;h1&gt;Context and Spec style testing and my approach to BDD&lt;/h1&gt;&#10;*EDIT: this is an old post copied over from my [old blog on Los Techies](https://lostechies.com/ryansvihla/2009/05/22/context-spec-style-testing-and-my-approach-to-bdd/), I have kept it here for archival reasons.*&#10;&lt;p&gt;I borrow heavily my approach to testing from a combination of Ayende&amp;rsquo;s &lt;a href="http://rhino-tools.svn.sourceforge.net/viewvc/rhino-tools/trunk/"&gt;Rhino Tools&lt;/a&gt; tests, and my reading of the &lt;a href="http://www.pragprog.com/titles/achbd/the-rspec-book"&gt;Rspec&lt;/a&gt; beta book. But I think I&amp;rsquo;ve stumbled onto something I&amp;rsquo;m happy with and I can generate reports out of. Let&amp;rsquo;s go over some basic rules first:&lt;/p&gt;</description></item><item><title>Glad to be here</title><link>https://blog.foundev.pro/2009/05/21/glad-to-be-here.html</link><pubDate>Thu, 21 May 2009 22:02:14 +0000</pubDate><guid>https://blog.foundev.pro/2009/05/21/glad-to-be-here.html</guid><description>&lt;h1&gt;Glad to be here&lt;/h1&gt;&#10;&lt;p&gt;&lt;em&gt;EDIT: this is an old post copied over from my &lt;a href="https://lostechies.com/ryansvihla/2009/05/21/glad-to-be-here/"&gt;old blog on Los Techies&lt;/a&gt;, I have kept it here for archival reasons. The contact info and links below are almost certainly no longer accurate&lt;/em&gt;&lt;/p&gt;&#10;&lt;p&gt;Hi, my name is Ryan Svihla, and I’m the newest member of Los Techies; and I’d like to provide some background for most of you wondering, “who is this guy.”&lt;/p&gt;&#10;&lt;p&gt;I’ve recently moved to San Antonio, TX, and love it here. I don’t miss the winters and humidity of the farm states where I previously lived. I greatly appreciate the local developer community and learning at the feet of people like Jasdeep, &lt;a href="https://lostechies.com/blogs/jason_meridth/default.aspx"&gt;Jason&lt;/a&gt;, &lt;a href="https://lostechies.com/blogs/joe_ocampo/default.aspx"&gt;Joe&lt;/a&gt;, Josh](&lt;a href="https://lostechies.com/blogs/joshua_lockwood/default.aspx"&gt;https://lostechies.com/blogs/joshua_lockwood/default.aspx&lt;/a&gt;), &lt;a href="http://devlicio.us/blogs/anne_epstein/default.aspx"&gt;Anne&lt;/a&gt;, &lt;a href="http://twitter.com/pjdennis"&gt;Phil&lt;/a&gt;, and many others.&lt;/p&gt;</description></item></channel></rss>