[{"content":"We are living through a strange professional silence. Many of us use AI every day while feeling a quiet guilt about it. We worry that by offloading the labor of coding, we are offloading our value as engineers. We reach for the tool because it works. Then we wonder what it means that we needed it. The discomfort is not about the technology. It is the sense that we are moving faster than we can think.\nThe mechanical friction of engineering is dissolving. AI may seem like the ultimate “easy button,” and for some that feels like a victory. But in the world of software and its operation, easy and simple are not synonyms.1\nEasy is about friction and nearness. It describes the effort required to start. Simple is about structure. It describes how few parts are involved and how they relate.\nWe have seen this pattern before. Every leap in speed, from C to Cloud, has pulled us into higher levels of abstraction. We gained immense power, but we moved further from the machine. In that distance, we sacrificed immediate comprehension.\nToday, the speed of generation is outrunning our ability to understand. When we ship code we do not fully grasp, we are not being lazy. We are simply being outpaced by our own tools. AI made the work easy. It did not make it simple.\nThe danger is not just a bad pull request. It is the atrophy of instinct. If we stop thinking because generation is fast, we lose the ability to recognize structural danger before it fails in production.\nBut easy is not a dead end. It is a starting point. We will actually understand our systems more as AI writes them, provided we follow one rule: we must live in the system every day.\nWe can dispatch the labor of coding to AI, but we own the architecture. To reclaim the spec is to reclaim our agency. When we define the plan in plain English, we are not just giving instructions. We are exercising the judgment that the machine lacks.\nAI can handle the implementation; we own the intent. Writing the plan is the work. The plan is where simple lives. It is where we do our thinking. When we engage with the architecture daily, the AI becomes a mirror for our judgment. It does not replace our understanding. It forces us to become better architects of our own intentions.\nThe software is not the work. The system that produces it is. Tools like Swamp are making this real. Be the person who builds that system. Not the approver of an LLM’s output. The architect of the machine that builds the machine.2\nRich Hickey, Simple Made Easy (Strange Loop, 2011). Transcript.\u0026#160;\u0026#x21a9;\u0026#xfe0e;\nAdam Jacob, As We Build, So We Believe.\u0026#160;\u0026#x21a9;\u0026#xfe0e;\n","permalink":"https://webframp.com/posts/architects-instinct/","summary":"\u003cp\u003eWe are living through a strange professional silence. Many of us use AI every\nday while feeling a quiet guilt about it. We worry that by offloading the labor\nof coding, we are offloading our value as engineers. We reach for the tool\nbecause it works. Then we wonder what it means that we needed it. The discomfort\nis not about the technology. It is the sense that we are moving faster than we\ncan think.\u003c/p\u003e","title":"The Architect's Instinct"},{"content":"Growing into SparkleFormation In my continued usage with SparkleFormation I\u0026rsquo;m really growing to appreciate the convenience of having ruby available when composing templates. Things that would be challenging in a simplistic serialization format or lead to unmanageable duplication become easily solvable thanks to the powerful combination of an actual programming language, which json and yml are not, and the simplicity of the SparkleFormation DSL.\nAt it\u0026rsquo;s simplest you can mirror the structure of any cloudformation json (and finally have comments inline!) but you quickly discover more advanced use cases.\nSparkleFormation registries Registries are described as:\n\u0026ldquo;lightweight dynamics that are useful for storing items that may be used in multiple locations. \u0026quot;\nA dynamic in SparkleFormation is just a reusable block of code that generates some section of the template and can be very flexible. This is in comparison to components which are meant as single use items to insert a static block of code.\nRegistries and dynamics are similar in that they are just building blocks for composing the template elements for any declarative orchestration API such as CloudFormation or Azure Resource Manager, well any arbitrary json data structure really. Registries should be simpler and more static than a full fledged dynamic, useful for things like a list of AWS instance sizes as in the documentation:\nSfnRegistry.register(:instance_size_default){ \u0026#39;m3.medium\u0026#39; } or even something a little more involved like shared AWS::CloudFormation::Init data.\nA more dynamic registry for AWS cfn-init Recently the need arose to provide a shared registry for the necessary init commands to bootstrap a new ec2 instance with chef-client. Since we deal with both Windows and linux nodes in ec2 it would be a bit annoying to have to declare different registries like\nregistry!(:windows_chef_client) registry!(:linux_chef_client) After a brief discussion on freenode irc #sparkleformation, @luckymike pointed me in the direction of a technique he discovered that took advantage of the cfn-init configsets feature and the fact that registries can take args, just like any other SparkleFormation dynamic.\nEssentially, cloudformation init will look for an array of config names and run them in order. This can be used in ruby to create an empty array called default and then conditionally append to the array based on parameters passed to the registry dynamic.\nSfnRegistry.register(:chef_client) do | _config = {} | metadata(\u0026#39;AWS::CloudFormation::Init\u0026#39;) do _camel_keys_set(:auto_disable) # take advantage of fact that cfn-init runs the `default` # configsets http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-init.html configSets do |sets| if _config.fetch(:platform) == \u0026#39;windows\u0026#39; set.default += [\u0026#34;windows_config\u0026#34;] else set.default += [\u0026#34;default_config\u0026#34;] end end # Windows init config windows_config do # windows specific elements here end default_config do # generic elements here end Clearly some of the code has been left out. With a fully fleshed out dynamic using this approach it can then be used in a template by passing :platform as a configuration element:\nregistry!(:chef_client, :platform =\u0026gt; \u0026#39;windows\u0026#39;) The intent of this reads much clearer in the template code and everything needed for the :chef_client registry is contained in the same block of code.\nAnother good example of this can be seen in the Sensu evaluation stack codebase. The RabbitMQ registry needed a generated password that is passed in as an argument when calling the registry in the stack template.\nA simple example perhaps but this is exactly the type of thing that leads to better code reuse and eases management of complex definitions over the lifespan of any infrastructure as code workflow.\n","permalink":"https://webframp.com/posts/growing-with-the-sparkleformation-registry/","summary":"\u003ch1 id=\"growing-into-sparkleformation\"\u003eGrowing into SparkleFormation\u003c/h1\u003e\n\u003cp\u003eIn my continued usage with \u003ca href=\"http://www.sparkleformation.io/\"\u003eSparkleFormation\u003c/a\u003e\nI\u0026rsquo;m really growing to appreciate the convenience of having ruby available when\ncomposing templates. Things that would be challenging in a simplistic\nserialization format or lead to unmanageable duplication become easily solvable\nthanks to the powerful combination of an actual programming language, which json\nand yml are not, and the simplicity of the SparkleFormation DSL.\u003c/p\u003e\n\u003cp\u003eAt it\u0026rsquo;s simplest you can mirror the structure of any cloudformation json (and\nfinally have comments inline!) but you quickly discover more advanced use cases.\u003c/p\u003e","title":"Growing with the SparkleFormation registry"},{"content":"A very brief whirlwind tour of sparkles or: How I learned to stop writing terrible serialization formats directly and love the dsl\nAn imaginary story of the beginner exploring some infrastructure tooling.\nGetting started Set env variables. Maybe create an init.sh while practicing.\nexport AWS_ACCESS_KEY_ID=\u0026#34;your key\u0026#34; export AWS_SECRET_ACCESS_KEY=\u0026#34;your sekret\u0026#34; export AWS_REGION=\u0026#34;us-east-1\u0026#34; # because YOLO export NESTED_BUCKET=\u0026#34;s3://mah_bukkit\u0026#34; load that stuff into my current shell\nsource ./init.sh\nCreate a config .sfn file aready exists, thanks @luckymike. no need to create one.\nLet\u0026rsquo;s make a VPC! Initial creation results\n~/s/sparkleformation-workshops ❯❯❯ be sfn create training-vpc --file sparkleformation/vpc.rb \u0026hellip; (a bunch of cloudformation stack output) \u0026hellip; (like really a lot)\nThe important stuff:\n[Sfn]: Stack create complete: SUCCESS [Sfn]: Stack description of training-vpc: [Sfn]: Outputs for stack: training-vpc [Sfn]: Vpc Id: vpc-62950a06 [Sfn]: Vpc Cidr: 10.0.0.0/16 [Sfn]: Public Route Table: rtb-f45b0f90 [Sfn]: Private Route Table: rtb-e95b0f8d [Sfn]: Internet Gateway: igw-625db206 [Sfn]: Public Us East1a Subnet: subnet-bb0be8e3 [Sfn]: Public Us East1c Subnet: subnet-ce829fe5 [Sfn]: Public Us East1d Subnet: subnet-07ba7271 [Sfn]: Public Us East1e Subnet: subnet-27fc781a OK, lets go with that, at least I\u0026rsquo;ve got something. Note to self: Save that, you\u0026rsquo;re going to need it later (or better yet use --apply-stack)!\nLet\u0026rsquo;s update it to add an ec2 instance (Update plans are amaze!)\nUpdate: 2015-12-14 sfn update is the wrong command here, better to use sfn create --apply-stack\n~/s/sparkleformation-workshops ❯❯❯ be sfn update training-vpc --file sparkleformation/example.rb [Sfn]: SparkleFormation: update [Sfn]: -\u0026gt; Name: training-vpc Path: /Users/sme/src/sparkleformation-workshops/sparkleformation/example.rb [Sfn]: Stack runtime parameters: [Sfn]: Stack Creator [sme]: [Sfn]: Github User: [ERROR]: Please provide a valid value [Sfn]: Github User: webframp [Sfn]: Hello World: How do you do! [Sfn]: Vpc Id: vpc-62950a06 [Sfn]: Public Us East1a Subnet: subnet-bb0be8e3 [Sfn]: Pre-update resource planning report: Update plan for: training-vpc Resources to be removed: [AWS::EC2::DHCPOptions] DhcpOptions [AWS::EC2::InternetGateway] InternetGateway [AWS::EC2::VPCGatewayAttachment] InternetGatewayAttachment [AWS::EC2::RouteTable] PrivateRouteTable [AWS::EC2::RouteTable] PublicRouteTable [AWS::EC2::Route] PublicSubnetInternetRoute [AWS::EC2::Subnet] PublicUsEast1aSubnet [AWS::EC2::SubnetRouteTableAssociation] PublicUsEast1aSubnetRouteTableAssociation [AWS::EC2::Subnet] PublicUsEast1cSubnet [AWS::EC2::SubnetRouteTableAssociation] PublicUsEast1cSubnetRouteTableAssociation [AWS::EC2::Subnet] PublicUsEast1dSubnet [AWS::EC2::SubnetRouteTableAssociation] PublicUsEast1dSubnetRouteTableAssociation [AWS::EC2::Subnet] PublicUsEast1eSubnet [AWS::EC2::SubnetRouteTableAssociation] PublicUsEast1eSubnetRouteTableAssociation [AWS::EC2::VPC] Vpc [AWS::EC2::VPCDHCPOptionsAssociation] VpcDhcpOptionsAssociation Resources to be added: [AWS::IAM::AccessKey] CfnKeys [AWS::IAM::User] CfnUser [AWS::EC2::SecurityGroupEgress] ExampleAllSecurityGroupEgress [AWS::EC2::Instance] ExampleEc2Instance [AWS::EC2::SecurityGroupIngress] ExampleHttpSecurityGroupIngress [AWS::EC2::SecurityGroup] ExampleSecurityGroup [AWS::EC2::SecurityGroupIngress] ExampleSshSecurityGroupIngress [Sfn]: No resources life cycle changes detected in this update! [Sfn]: Apply this stack update? (Y/N): Y sfn update output:\nTime Resource Logical Id Resource Status Resource Status Reason 2015-12-12 02:35:36 UTC training-vpc CREATE_IN_PROGRESS User Initiated 2015-12-12 02:35:46 UTC DhcpOptions CREATE_IN_PROGRESS ... 2015-12-12 02:36:50 UTC training-vpc CREATE_COMPLETE 2015-12-12 03:01:43 UTC training-vpc UPDATE_IN_PROGRESS User Initiated ... 2015-12-12 03:02:20 UTC ExampleEc2Instance CREATE_FAILED Invalid availability zone: [us-west-2a] ... 2015-12-12 03:02:45 UTC training-vpc UPDATE_ROLLBACK_COMPLETE [FATAL]: Update of stack training-vpc: FAILED FAIL! Why is it trying to us-west-2a for ec2 instance when I clearly set us-east-1 ?\noh, because example.rb is using hardcoded us-west-2a\u0026hellip;\nlet\u0026rsquo;s change that, emacs sparkleformation/example.rb\ndiff --git a/sparkleformation/example.rb b/sparkleformation/example.rb index f0a8155..fd89915 100644 --- a/sparkleformation/example.rb +++ b/sparkleformation/example.rb @@ -1,7 +1,7 @@ example_ec2_instance do type \u0026#39;AWS::EC2::Instance\u0026#39; properties do - availability_zone \u0026#39;us-west-2a\u0026#39; + availability_zone zone That should work. Now update again: be sfn update training-vpc --file sparkleformation/example.rb\nnow what?!\n2015-12-12 03:15:40 UTC ExampleEc2Instance CREATE_FAILED The image id \u0026#39;[ami-e5b8b4d5]\u0026#39; does not exist oh. This is not the ami you are looking for. Every. Time.\nWhy is this part of ec2 still such a PITA?\n(fiercly googling \u0026ldquo;e5b8b4d5\u0026rdquo;) \u0026hellip; \u0026hellip;.\nWell hello, Ubuntu 14.04.2 LTS (Trusty Tahr) 64bit ebs\nNext stop, Amazon EC2 AMI Locator, searching us-east-1. Gotcha! you sneaky ami-7388cd19\nSure, in a perfect world I could just fire up pry and do this kind of junk:\n~/s/sparkle_formation ❯❯❯ pry [1] pry(main)\u0026gt; require \u0026#39;aws-sdk-core\u0026#39; =\u0026gt; true [2] pry(main)\u0026gt; ec2 = ::Aws::EC2::Client.new =\u0026gt; #\u0026lt;Aws::EC2::Client\u0026gt; [3] pry(main)\u0026gt; ec2.what? # I have no idea. But we live in the real world of hostile amis that don\u0026rsquo;t love you. You\u0026rsquo;re on your own. Find it yourself and edit that file. (but at least we have the comfort of .tuesday? and .saturday? methods in ::Aws::EC2::Client, right?)\nNow, let\u0026rsquo;s try that update again.\n~/s/sparkleformation-workshops ❯❯❯ be sfn update training-vpc --file sparkleformation/example.rb (lots of cloudformation output)\nBut this looks good, right?\n2015-12-12 03:56:35 UTC ExampleEc2Instance CREATE_IN_PROGRESS Received SUCCESS signal with UniqueId i-1dc9f7ad 2015-12-12 03:56:38 UTC ExampleEc2Instance CREATE_COMPLETE yea! maybe there\u0026rsquo;s an instance somewhere in mah clouds now? ok, I guess I\u0026rsquo;ll let this finish\u0026hellip;\n2015-12-12 04:00:06 UTC InternetGatewayAttachment DELETE_FAILED Network vpc-62950a06 has some mapped public address(es). Please unmap those public address(es) before detaching the gateway. 2015-12-12 04:01:03 UTC PublicUsEast1aSubnet DELETE_FAILED The subnet \u0026#39;subnet-bb0be8e3\u0026#39; has dependencies and cannot be deleted. 2015-12-12 04:01:06 UTC Vpc DELETE_IN_PROGRESS 2015-12-12 04:04:24 UTC Vpc DELETE_FAILED The vpc \u0026#39;vpc-62950a06\u0026#39; has dependencies and cannot be deleted Is that good or bad? I didn\u0026rsquo;t ask you to delete, but maybe you are trying to save me from myself. I give up, it\u0026rsquo;s time for bed.\nbundle exec destroy training-vpc Footnote: In all seriousness, none of this is ever easy and all software is terrible. The alternatives are far, far worse and you should just be using SparkleFormation\nUpdate: 2015-12-14 The actual source of my issue here was not SparkleFormation. I was trying to create a new stack but the update command is intended to update an existing stack (Surprise!).\nWhat worked perfectly as advertised was to actually use:\nbundle exec sfn create example-stack --apply-stack training-vpc --file sparkleformation/example.rb This automatically takes the stack outputs from the previously created vpc, training-vpc and uses it as inputs for the new example-stack created from the template example.rb\n","permalink":"https://webframp.com/posts/sparkleformation-bedtime-story/","summary":"\u003ch1 id=\"a-very-brief-whirlwind-tour-of-sparkles\"\u003eA very brief whirlwind tour of sparkles\u003c/h1\u003e\n\u003cp\u003eor: How I learned to stop writing terrible \u003ca href=\"https://aws.amazon.com/cloudformation/aws-cloudformation-templates/\"\u003eserialization\u003c/a\u003e formats \u003ca href=\"https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/working-with-templates-cfn-designer-json-editor.html\"\u003edirectly\u003c/a\u003e and \u003ca href=\"http://www.sparkleformation.io/\"\u003elove the dsl\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eAn imaginary story of the beginner exploring some infrastructure tooling.\u003c/p\u003e\n\u003ch2 id=\"getting-started\"\u003eGetting started\u003c/h2\u003e\n\u003cp\u003eSet env variables. Maybe create an init.sh while practicing.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#8be9fd;font-style:italic\"\u003eexport\u003c/span\u003e \u003cspan style=\"color:#8be9fd;font-style:italic\"\u003eAWS_ACCESS_KEY_ID\u003c/span\u003e\u003cspan style=\"color:#ff79c6\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#f1fa8c\"\u003e\u0026#34;your key\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#8be9fd;font-style:italic\"\u003eexport\u003c/span\u003e \u003cspan style=\"color:#8be9fd;font-style:italic\"\u003eAWS_SECRET_ACCESS_KEY\u003c/span\u003e\u003cspan style=\"color:#ff79c6\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#f1fa8c\"\u003e\u0026#34;your sekret\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#8be9fd;font-style:italic\"\u003eexport\u003c/span\u003e \u003cspan style=\"color:#8be9fd;font-style:italic\"\u003eAWS_REGION\u003c/span\u003e\u003cspan style=\"color:#ff79c6\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#f1fa8c\"\u003e\u0026#34;us-east-1\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#6272a4\"\u003e# because YOLO\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#8be9fd;font-style:italic\"\u003eexport\u003c/span\u003e \u003cspan style=\"color:#8be9fd;font-style:italic\"\u003eNESTED_BUCKET\u003c/span\u003e\u003cspan style=\"color:#ff79c6\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#f1fa8c\"\u003e\u0026#34;s3://mah_bukkit\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eload that stuff into my current shell\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003esource ./init.sh\u003c/code\u003e\u003c/p\u003e\n\u003ch3 id=\"create-a-config\"\u003eCreate a config\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003e.sfn\u003c/code\u003e file aready exists, thanks \u003ca href=\"https://github.com/luckymike\"\u003e@luckymike\u003c/a\u003e. no need to create one.\u003c/p\u003e","title":"SparkleFormation Bedtime Story"},{"content":"Recently I had a need to create a bootable sd card containing OpenBSD. Since my day to day machine is a MacBook Air with no cdrom drive this initially seemed difficult. It turned out to be much easier than I expected thanks to VirtualBox raw disk access.\nRaw hard disk access can be dangerous, mainly because there\u0026rsquo;s a risk you use the wrong device and blow away things you actually need, so be careful and make sure you know you\u0026rsquo;re using the right physical device.\nThe disk has to be connected but not mounted and the Mac tries to repeatedly automount the sdcard, if you encounter an error that may be the case. The command to unmount is simply:\ndiskutil unmountDisk /dev/disk6\nA raw disk vmdk needs to be created which can then be attached to the VM to give it direct access to the disk. With Mavericks the disk is automatically owned by root each time it\u0026rsquo;s mounted but in order to create the raw disk vmdk your user needs to have full access to the disk. In my case the device was /dev/disk6 so it just required adjusting permissions:\nsudo chown sme /dev/disk6\nIt\u0026rsquo;s not enough to just chown the resulting file, since it\u0026rsquo;s basically just a pointer to the raw disk the user VirtualBox runs as needs full device access.\nNext to create the raw disk vmdk (the magic command):\nVBoxManage internalcommands createrawvmdk -filename sdcard.vmdk -rawdisk /dev/disk6\nThis creates a tiny file, sdcard.vmdk, that can be attached to a VirtualBox VM to give it full access to /dev/disk6. Next I created a new OpenBSD VM, mounting the OpenBSD 5.4 iso and attached the raw disk vmdk as the only storage. This is done by selecting \u0026lsquo;Choose existing disk\u0026rsquo; during the VM creation disk selection phase.\nFrom here I was able to do a standard OpenBSD install and the VM saw the raw disk as the only available HD. After finishing the install I was able to \u0026lsquo;option\u0026rsquo; boot to select the sdcard as the startup disk and run OpenBSD from the sdcard on my MacBook Air.\nFor more info check out this helpful SuperUser post\n","permalink":"https://webframp.com/posts/os-install-using-virtualbox-raw-disk-access/","summary":"\u003cp\u003eRecently I had a need to create a bootable sd card containing OpenBSD.\nSince my day to day machine is a MacBook Air with no cdrom drive this\ninitially seemed difficult. It turned out to be much easier than I\nexpected thanks to\n\u003ca href=\"https://www.virtualbox.org/manual/ch09.html#idp15871152\"\u003eVirtualBox raw disk access\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eRaw hard disk access can be dangerous, mainly because there\u0026rsquo;s a risk\nyou use the wrong device and blow away things you actually need, so be\ncareful and make sure you know you\u0026rsquo;re using the right physical device.\u003c/p\u003e","title":"OS Install using VirtualBox raw disk access"},{"content":"I genuinely dislike email, yet it\u0026rsquo;s a necessary part of working and communicating these days. I suppose there is occasional value found in the community of certain mailing lists, but generally the way email is used today is simply more of a distraction or interruption.\nA while back Steve Losh described how to setup Mutt the way he likes. It was an interesting read because he was detailed, technical and clearly prefers very customizable tools. I agree with him, and although I\u0026rsquo;ve long since abandonded Mutt I was motivated to describe my version of powerful, customizable, terminal based email management.\nThis isn\u0026rsquo;t intended to say that what I use is inherently better than the setup Steve described, it\u0026rsquo;s simply what works for me. Much of the setup is similar. I used Mutt for many years before giving Sup a try, and recently settling on the configuration I describe here. Sup is still actively developed and a great standalone mail client.\nI do use Gmail and while the Gmail web interface has a great set of keybindings for most everything, they aren\u0026rsquo;t customizable so it\u0026rsquo;s a whole new set of bindings to learn. That\u0026rsquo;s not a terrible thing, but I spend most of my day in a text editor where the bindings (and subsequent muscle memory) I know are very different than those available in the Gmail web interface.\nSeveral times in the past I\u0026rsquo;ve searched for a fast, configurable way to use emacs for accessing my email. For one reason or another the existing options were lacking in my opinion and didn\u0026rsquo;t fit my needs. However, a little over 2 years ago I stumbled across Notmuch, which is billed as a: \u0026ldquo;fast, global search and tag based email reader to use within your text editor or in a terminal\u0026rdquo;. This sounded like exactly what I was looking for.\nIt\u0026rsquo;s essentially a minimal interface to a Xapian index of your mail so powerful searching is easy, but not limited.\nI also primarily use OS X so the basic design is very similar to what Steve mentions in his Overview, the difference is that I\u0026rsquo;ve removed Mutt from the picture and substitute the notmuch emacs integration.\nOfflineimap and msmtp setup is essentially the same and I have two accounts configured, one personal and one for work both of which are google accounts.\nSetup If you use OS X, it\u0026rsquo;s easily available using homebrew:\nbrew install notmuch\nAnd from emacs, assuming you have melpa setup, notmuch is only an M-x package-install away.\nThis gist has the settings I use in my emacs load-path to setup custom identities for my personal and work email accounts and configure how notmuch works.\nThere\u0026rsquo;s plenty of additional customization available depending on how deep the rabbit hole you choose to go. This setup has worked well for me up to this point and still allows me to use the gmail web interface in a pinch.\n","permalink":"https://webframp.com/posts/email-in-emacs/","summary":"\u003cp\u003eI genuinely dislike email, yet it\u0026rsquo;s a necessary part of working and\ncommunicating these days. I suppose there is occasional value found in\nthe community of certain mailing lists, but generally the way email is\nused today is simply more of a distraction or interruption.\u003c/p\u003e\n\u003cp\u003eA while back Steve Losh described how to setup Mutt\n\u003ca href=\"http://stevelosh.com/blog/2012/10/the-homely-mutt/\"\u003ethe way he likes\u003c/a\u003e.\nIt was an interesting read because he was detailed, technical and\nclearly prefers very customizable tools. I agree with him, and\nalthough I\u0026rsquo;ve long since abandonded Mutt I was motivated to describe\nmy version of powerful, customizable, terminal based email management.\u003c/p\u003e","title":"Email in emacs"},{"content":"I spend a decent amount of time in org-mode, using Emacs + iTerm2 on a Macbook Air. I fixed a recent annoyance I encountered when using Emacs org-mode to track time for a project.\nOrg-mode has a handy time tracking feature and as the manual points out both C-S-\u0026lt;up/down\u0026gt; S-M-\u0026lt;up/down\u0026gt; can be used to call various functions for adjusting recorded time. In particular I wanted to use org-timestamp-down to add some time for a CLOCK item I had forgotten to start before a Skype call.\nObviously though, I hadn\u0026rsquo;t used S-M-down previously because when I did instead of adjusting the time, I only got the raw escape code \\e[1;10B.\nI tried adjusting the settings in iTerm2 to no avail, so after a bit of a meandering search down the emacs rabbit hole I found a solution that worked well for me.\n(define-key input-decode-map \u0026#34;\\e[1;10A\u0026#34; [M-S-up]) (define-key input-decode-map \u0026#34;\\e[1;10B\u0026#34; [M-S-down]) (define-key input-decode-map \u0026#34;\\e[1;10C\u0026#34; [M-S-right]) (define-key input-decode-map \u0026#34;\\e[1;10D\u0026#34; [M-S-left]) (define-key input-decode-map \u0026#34;\\e[1;3A\u0026#34; [M-up]) (define-key input-decode-map \u0026#34;\\e[1;3B\u0026#34; [M-down]) (define-key input-decode-map \u0026#34;\\e[1;3C\u0026#34; [M-right]) (define-key input-decode-map \u0026#34;\\e[1;3D\u0026#34; [M-left]) One handy tip in discovering these keybindings was to use cat to display the raw keycodes:\n$ cat \\e[1;10A \\e[1;10B \\e[1;10C \\e[1;10D This can also be done use C-q in emacs if you prefer, both will give you the results you need.\n","permalink":"https://webframp.com/posts/fixing-emacs-bindings-in-iterm2/","summary":"\u003cp\u003eI spend a decent amount of time in org-mode, using Emacs + iTerm2 on a\nMacbook Air. I fixed a recent annoyance I encountered when using Emacs\norg-mode to track time for a project.\u003c/p\u003e\n\u003cp\u003eOrg-mode has a handy\n\u003ca href=\"http://orgmode.org/org.html#The-clock-table\"\u003etime tracking feature\u003c/a\u003e\nand as the manual points out both \u003ccode\u003eC-S-\u0026lt;up/down\u0026gt;\u003c/code\u003e \u003ccode\u003eS-M-\u0026lt;up/down\u0026gt;\u003c/code\u003e can\nbe used to call various functions for adjusting recorded time. In\nparticular I wanted to use \u003ccode\u003eorg-timestamp-down\u003c/code\u003e to add some time for a\nCLOCK item I had forgotten to start before a Skype call.\u003c/p\u003e","title":"Fixing emacs bindings in iTerm2"},{"content":"Sometimes it\u0026rsquo;s the simplest things that remind me why I love the classic unix tools. Here\u0026rsquo;s a quick way to fill in cookbook_versions for a chef environment using awk.\nOf course, this is a ridiculously simple usage of awk. There\u0026rsquo;s plenty more that can be done with just a single line of awk.\n","permalink":"https://webframp.com/posts/update-cookbook-versions-with-an-awk-one-liner/","summary":"\u003cp\u003eSometimes it\u0026rsquo;s the simplest things that remind me why I love the classic unix tools. Here\u0026rsquo;s a quick way to fill in cookbook_versions for a chef environment using awk.\u003c/p\u003e\n\u003cscript src=\"https://gist.github.com/webframp/2174632.js\"\u003e\u003c/script\u003e\n\n\u003cp\u003eOf course, this is a ridiculously simple usage of awk. There\u0026rsquo;s plenty \u003ca href=\"http://www.softpanorama.org/Tools/Awk/awk_one_liners.shtml\"\u003emore\u003c/a\u003e that \u003ca href=\"http://awk.info/?OneLiners\"\u003ecan\u003c/a\u003e be \u003ca href=\"http://www.pement.org/awk/awk1line.txt\"\u003edone\u003c/a\u003e with just \u003ca href=\"http://www.catonmat.net/blog/awk-one-liners-explained-part-one/\"\u003ea single line of awk\u003c/a\u003e.\u003c/p\u003e","title":"Update cookbook_versions with an awk one-liner"},{"content":"It seems in the chef community lately there\u0026rsquo;s a growing trend for cookbooks to be kept in separate repos, or even separate branches in a single repo. I wanted to share the script I used to split out the community-cookbooks repo for Heavywater\nI knew the general git commands I needed to use, but it did take a few local trial runs to get it exactly as I wanted. To create the actual repos on github I made use of the excellent hub script.\nWhile there\u0026rsquo;s definitely a more elegant way to do this, maybe you can use this as a starting point should you need to do the same.\n","permalink":"https://webframp.com/posts/splitting-up-a-cookbook-repo/","summary":"\u003cp\u003eIt seems in the chef community lately there\u0026rsquo;s a growing trend for\ncookbooks to be kept in separate repos, or even separate branches in a\nsingle repo. I wanted to share the script I used to split out the\ncommunity-cookbooks repo for \u003ca href=\"https://github.com/heavywater/\"\u003eHeavywater\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eI knew the general git commands I needed to use, but it did take a few\nlocal trial runs to get it exactly as I wanted. To create the actual\nrepos on github I made use of the excellent\n\u003ca href=\"http://defunkt.io/hub/\"\u003ehub\u003c/a\u003e script.\u003c/p\u003e","title":"Splitting up a cookbook repo"},{"content":"There\u0026rsquo;s a thought provoking article by David Mitchell at The Guardian site right now. It\u0026rsquo;s relatively short and worth reading, and I say that even as someone who isn\u0026rsquo;t all that interested in the NHS project that frames the article\u0026rsquo;s opening paragraphs.\nMitchell makes two points that I found myself both agreeing with as a developer and sysadmin, and leading me to further thought. First, from David Mitchell in I want to talk to you about the NHS\u0026hellip;\nNothing sharpens the brain like a whetstone of tedium\nIn the context of our work tedium could be any number of things. For some it\u0026rsquo;s documentation, labeling cables, seemingly minor manual config changes made in production up or the ever present yak shaving in some form or another. A drive to erase this boredom or tedium has resulted in many of the excellent tools in use today, such as Chef, Puppet, and other powerful automation software. Repeated slogging through boring steps led someone to think \u0026ldquo;I can do this better\u0026rdquo;.\nOf course, not all tedium is bad and needs to be eliminated. In programming there\u0026rsquo;s no substitute for the hours of typing code in an editor that improves your grasp of a language, the way repeated physical exercise hones the body. The ability to focus for increasing lengths of time on a given problem or task is a valuable skill. Ones mental acuity, that ability to concentrate, focus and understand, can be greatly improved with effort. These are valuable skills that improve over time, accompanied by some percentage of tedium, the way practicing scales may see to a new guitarist.\nThe second point Mitchell makes actually comes from Alex Hope, co-author of the recent Next Gen report: \u0026ldquo;Coding is the new Latin\u0026rdquo;. He is also quoted in a recent BBC news article by Rory Cellan-Jones\nComputers are here to stay and yet for the most part many still view them as \u0026ldquo;an imposition, a distraction, something stultifying that dominates our lives but we somehow feel shouldn\u0026rsquo;t\u0026rdquo;. The way they are explained and taught is a perhaps a direct outcome of this, sometimes silently unacknowledged, viewpoint.\n\u0026hellip;even a rudimentary knowledge of Latin cuts down the labor and pains of learning almost any other subject by at least 50 percent.\nCode needs to be the common language to teach people about the world we now live in. The perspective and understanding gained from learning to solve even a simple problem using python or ruby can give people a sense that these machines they now depend on are not so foreign or unknowable. It certainly does more than teaching them how to SUM numbers in a spreadsheet.\nDavid Mitchell compared code as Latin for the assumed tedium, but I think it can be done better. Everyone should be able to at least read and understand the flow of some code.\nOne of the most intriguing things I\u0026rsquo;ve noticed about the devops movement is the emphasis on a culture of inclusion and instruction. This is one of the main reasons I enjoy being a part of it. Certainly learning to code is not generally an issue with people who are either in development or systems administration, but we need to continue to be better at instilling our love for what we do and why we do it in others. Not just within our culture or respective fields, but everywhere.\nIn a healthy organization no one should be content to just \u0026ldquo;throw code over the wall\u0026rdquo; or not think about how all the pieces fit together. We\u0026rsquo;re certainly working to change that, but it can go further. Everyone who touches computing resources in an organization can have a basic understanding of \u0026lsquo;what makes it tick\u0026rsquo;. They may never be driven to tinker and make changes on their own, but they can be helped to see and appreciate the inner workings in a favorable light.\nWe shouldn\u0026rsquo;t be keepers of some ivory tower but instead mentors and instructors, sharing excitement and understanding, the very thing we should already possess and that brought us to the field we are in. I believe teaching others to code and to understand code, even though they may not choose to do so themselves, can have a significant impact on their comfort level and enjoyment in working with the tools we use today.\n","permalink":"https://webframp.com/posts/code-as-the-new-latin/","summary":"\u003cp\u003eThere\u0026rsquo;s a thought provoking article by David Mitchell at\n\u003ca href=\"http://www.guardiannews.com/\"\u003eThe Guardian\u003c/a\u003e site right now. It\u0026rsquo;s\nrelatively short and worth reading, and I say that even as someone who\nisn\u0026rsquo;t all that interested in the NHS project that frames the article\u0026rsquo;s\nopening paragraphs.\u003c/p\u003e\n\u003cp\u003eMitchell makes two points that I found myself both agreeing with as a\ndeveloper and sysadmin, and leading me to further thought. First, from\n\u003ca href=\"http://www.guardian.co.uk/commentisfree/2011/dec/11/nhs-it-computer-david-mitchell?mobile-redirect=false\"\u003eDavid Mitchell\u003c/a\u003e\nin \u003cem\u003eI want to talk to you about the NHS\u0026hellip;\u003c/em\u003e\u003c/p\u003e","title":"Code as the new Latin"},{"content":"One topic frequently tossed around at the recent Opscode summit was a re-org of the cookbooks repository. No more monolothic cookbooks repo on github, instead replaced by single cookbook repos, making it much easier to pull and contribute to a single cookbook.\n@jtimberman will be leading this effort.\nOn a slightly unrelated note, it looks like @dysinger posted a handy little cleanup script:\n","permalink":"https://webframp.com/posts/this-i-want-to-remember/","summary":"\u003cp\u003eOne topic frequently tossed around at the recent Opscode summit was a\nre-org of the cookbooks repository. No more monolothic \u003ca href=\"https://github.com/opscode/cookbooks\"\u003ecookbooks\u003c/a\u003e repo\non github, instead replaced by single cookbook repos, making it much\neasier to pull and contribute to a single cookbook.\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://twitter.com/jtimberman\"\u003e@jtimberman\u003c/a\u003e will be leading this effort.\u003c/p\u003e\n\u003cp\u003eOn a slightly unrelated note, it looks like \u003ca href=\"https://twitter.com/dysinger/status/141954044188037121\"\u003e@dysinger\u003c/a\u003e posted a handy little cleanup script:\u003c/p\u003e\n\u003cscript src=\"https://gist.github.com/dysinger/1410287.js\"\u003e\u003c/script\u003e","title":"This I want to remember"},{"content":"The first historic Opscode Community Summit is officially over. See yesterdays post for a basic description of the event and structure.\nAfter another brief introduction, topics were discussed, a schedule arranged and the agenda was live. Topics for day two included:\nManaged Nodes a.k.a external entities Chef for big data projects, such as hadoop, cassandra and similar Ticket/triage process Network monitoring, it sucks Feature roadmaps, both short and long term\nThere\u0026rsquo;s more, but I lost track due to poor note taking on my part.\nBy far the biggest announcement to come out of today was the fact that Hosted Chef is moving from Ruby+NoSQL to Erlang+MySQL. For Opscode it boils down to using the right tools for the job and after a hard look at how Hosted Chef is being used it\u0026rsquo;s clear this change will be for the better. Erlang brings a ton of cool benefits and I look forward to hearing about their migration path from the current platform. Lots of nice performance graphs accompanied this discussion, led by Chris Brown and Kevin Smith from Opscode.\nSean Porter led a discussion about monitoring and the how the community is using the myriad of tools available to us. Basically monitoring is hard and has subtle challenges at scale in current implementations. He showed off sensu and discussed ways for possible collaboration with the community. I hope to dig in to this a little more since I\u0026rsquo;ve been thinking about problems in around monitoring, metrics and alerting for a little while lately.\nOverall what I most enjoyed about the summit is the sense of community that is clearly maturing around chef. With so many passionate people and hard problems, there\u0026rsquo;s bound to be some neat things on the horizon. It\u0026rsquo;ll be exciting to see what the next year holds in store for Opscode and the chef community.\nCheck out further details on the individual sessions on the Opscode wiki\n","permalink":"https://webframp.com/posts/opscode-community-summit-day-two/","summary":"\u003cp\u003eThe first historic Opscode Community Summit is officially over. See\nyesterdays post for a basic description of the event and structure.\u003c/p\u003e\n\u003cp\u003eAfter another brief introduction, topics were discussed, a schedule\narranged and the agenda was live. Topics for day two included:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eManaged Nodes a.k.a external entities\nChef for big data projects, such as hadoop, cassandra and similar\nTicket/triage process\nNetwork monitoring, it sucks\nFeature roadmaps, both short and long term\u003c/p\u003e","title":"Opscode Community Summit - Day Two"},{"content":"Opscode Summit day one has passed. I had to skip the sponsored dinner tonight, so for others it might still be going on. While there were lot\u0026rsquo;s of great sessions going on, and a great variety of people (seemed like 100+ in attendance), one thing stood out to me: The Chef community is awesome.\nTo be fair, there are many great tech communities but the advantage the chef community has, and devops culture in general, is how many different skill sets are necessarily brought together combined with a culture of friendliness. Networking gurus, SysAdmin fanatics and passionate Devs are all brought together to solve some of the toughest challenges in modern computing infrastructures.\nThe benefits from this variety of experiences are immediately evident with everyone brought to the same table, each one sharing their unique perspectives and experience. With so much to learn it\u0026rsquo;s great there\u0026rsquo;s so many experienced, friendly people to learn from.\nAgenda and Sessions The Community Summit is structured in an Open Space unconference style, which is a refreshing change from the usual conference agenda approach.\nAfter a brief introduction attendees gathered to discuss the topics and sessions that would be discussed throughout the day. The resulting agenda board is pictured at right.\nThroughout the day I especially like how the guiding idea of the Law of Two Feet was evident: \u0026quot; If at any time you find yourself in any situation where you are neither learning nor contributing: Give greetings, use your two feet, and go do something useful. Responsibility resides with you. \u0026quot;\nThis fosters a relaxed, self-learner friendly style of participation, which I felt lowered the social barrier for participation within the groups.\nPersonally I was able to attend the discussions on Cookbook syntax checking \u0026lsquo;Lint\u0026rsquo; style, Management of External Entities, Documentation improvements, How to handle \u0026ldquo;tactical\u0026rdquo; or short-lived changes and the \u0026lsquo;Choose-your-own-adventure\u0026rsquo; style talk by Adam Jacob.\nFurther details for the individual sessions are available over on the wiki: Chef Summit - Day One\nI\u0026rsquo;m looking forward to the sessions tomorrow.\n","permalink":"https://webframp.com/posts/opscode-community-summit-day-one/","summary":"\u003cp\u003eOpscode Summit day one has passed. I had to skip the sponsored dinner\ntonight, so for others it might still be going on. While there were\nlot\u0026rsquo;s of great sessions going on, and a great variety of people\n(seemed like 100+ in attendance), one thing stood out to me: \u003cem\u003eThe Chef\ncommunity is awesome.\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg alt=\"Community Circle\" loading=\"lazy\" src=\"http://farm8.staticflickr.com/7002/6428818519_0fb57b8155.jpg\"\u003e\u003c/p\u003e\n\u003cp\u003eTo be fair, there are many great tech communities but the advantage the chef\ncommunity has, and devops culture in general, is how many different\nskill sets are necessarily brought together combined with a culture of\nfriendliness. Networking gurus, SysAdmin\nfanatics and passionate Devs are all brought together to solve some of\nthe toughest challenges in modern computing infrastructures.\u003c/p\u003e","title":"Opscode Community Summit - Day One"},{"content":"My name is Sean Escriva. I\u0026rsquo;m an infrastructure hacker and continuous delivery evangelist with over 20 years of IT operations experience and 15 years with AWS and cloud services.\nMy past work and experiences are easily found online, if you\u0026rsquo;re interested, or just feel free to reach out. I\u0026rsquo;ve spent years building networks, managing data centers, building infrastructure and teaching DevOps.\nI have a lot of history using Chef, formerly worked with the amazingly talented teams at Heavy Water Software and Sensu.\nCurrently I\u0026rsquo;m using Go, learning Rust and always trying to get better with Swift. I maintain MobileOrg and perpetually learn from others.\nMy limited spare time is filled with functional languages, mechanical keyboards, occasional attempts at guitar and learning spoken languages.\nWebframp? It started as a joke. My wife\u0026rsquo;s side of the family didn\u0026rsquo;t use the word fart and instead used framp. I always found this hilarious so made up webframp as a joke and a reminder to never take myself or anything online too seriously.\n","permalink":"https://webframp.com/about/","summary":"\u003cp\u003eMy name is Sean Escriva. I\u0026rsquo;m an infrastructure hacker and continuous delivery evangelist with over 20 years of IT operations experience and 15 years with AWS and cloud services.\u003c/p\u003e\n\u003cp\u003eMy past work and experiences are easily found online, if you\u0026rsquo;re\ninterested, or just feel free to \u003ca href=\"https://hachyderm.io/@webframp\"\u003ereach out\u003c/a\u003e.\nI\u0026rsquo;ve spent years building networks, managing data centers, building\ninfrastructure and teaching DevOps.\u003c/p\u003e\n\u003cp\u003eI have a lot of history using \u003ca href=\"https://www.chef.io/\"\u003eChef\u003c/a\u003e, formerly worked with\nthe amazingly talented teams at \u003ca href=\"http://hw-ops.com\"\u003eHeavy Water Software\u003c/a\u003e and \u003ca href=\"https://sensu.io/\"\u003eSensu\u003c/a\u003e.\u003c/p\u003e","title":"About"}]