<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:creativeCommons="http://backend.userland.com/creativeCommonsRssModule" xmlns:html="http://www.w3.org/1999/html" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">
<channel>
   <title>semicomplete.com - Jordan Sissel</title>
   <link>http://www.semicomplete.com/blog</link>
   <description>Projects, articles, tips, and experiences on topics ranging from AJAX to Network Security.</description>
   <language>en</language>
   <copyright>Copyright 2009 Jordan Sissel</copyright>
   <ttl>60</ttl>
   <pubDate>Mon, 05 Nov 2012 20:04 GMT</pubDate>
   <managingEditor>jls@semicomplete.com</managingEditor>
   <generator>PyBlosxom http://pyblosxom.sourceforge.net/ 1.3.2 2/13/2006</generator>
<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/semicomplete/main" /><feedburner:info uri="semicomplete/main" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
   <title>Disabling battery/power management in Ubuntu</title>
   <guid isPermaLink="false">http://www.semicomplete.com/blog/geekery/disabling-battery-in-ubuntu-vms.html</guid>
   <link>http://feedproxy.google.com/~r/semicomplete/main/~3/_Y2v4LdkZQo/disabling-battery-in-ubuntu-vms.html</link>
   <description>I have some ubuntu VMs. VirtualBox's guest tools provide a way for guest OSs to
see battery and other power states.

&lt;p&gt;

The problem is that Ubuntu 12.04 will always suspend itself when battery is
low. What is "low"? Something  not tunable. Can you change the 'low battery'
action? No, the setting panel for it says "Perform action on critical battery"
or something and the dropdown box is blank.

&lt;p&gt;

When Ubuntu decides it's 'critical' time, OSX (the host os, here) claims
usually 20% battery remaining. Critical, eh? :\

&lt;p&gt;

So, the next step is to get Ubuntu/Gnome to not even see a battery.

&lt;p&gt;

The utility providing this data is 'upowerd'. You can try to kill it, but dbus
will just start it back up again. It's not a service you can disable with upstart,
since it's managed by dbus itself.

&lt;p&gt;

You can't just uninstall the 'upower' package, no, because it will remove
gnome-session and other probably important packages for your workstation.

&lt;p&gt;

To disable upowerd, you have to remove this file:

&lt;pre&gt;
/etc/dbus-1/system.d/org.freedesktop.UPower.conf
&lt;/pre&gt;

Then reboot. Alternately, you could 'pkill upower; restart dbus' but I found
that restarting dbus made gnome/xorg freak out (blink, apps restarting
frequently, etc) as well as it killing the network (because networkmanager), so
I had to reboot anyway.

&lt;p&gt;

And now I have a vm that doesn't foolishly suspend itself. Also, dbus is shitty.

&lt;img src="/images/spacer.gif?geekery/disabling-battery-in-ubuntu-vms" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/semicomplete/main?a=_Y2v4LdkZQo:DPa4sDAiTp4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/semicomplete/main?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/semicomplete/main?a=_Y2v4LdkZQo:DPa4sDAiTp4:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/semicomplete/main?i=_Y2v4LdkZQo:DPa4sDAiTp4:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/semicomplete/main?a=_Y2v4LdkZQo:DPa4sDAiTp4:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/semicomplete/main?i=_Y2v4LdkZQo:DPa4sDAiTp4:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/semicomplete/main/~4/_Y2v4LdkZQo" height="1" width="1"/&gt;</description>
   <category domain="http://www.semicomplete.com/blog">geekery</category>
   <pubDate>Mon, 05 Nov 2012 20:04 GMT</pubDate>
<feedburner:origLink>http://www.semicomplete.com/blog/geekery/disabling-battery-in-ubuntu-vms.html</feedburner:origLink></item>
<item>
   <title>TF2 performance on wine+linux</title>
   <guid isPermaLink="false">http://www.semicomplete.com/blog/geekery/tf2-wine-linux-performance-tuning.html</guid>
   <link>http://feedproxy.google.com/~r/semicomplete/main/~3/qZxAIZX4J3o/tf2-wine-linux-performance-tuning.html</link>
   <description>I recently gave up windows 8 (which is horrible, by the way) to install Fedora
on my workstation at home.

&lt;p&gt;

I wanted to still play TF2, so while I wait for the steam linux/tf2 beta, I
figured wine would work.

&lt;p&gt;

I used the fedora wine packages as well as 'winetricks' to install steam
(winetricks is awesomesauce.). Basically, with winetricks, you just do
'winetricks steam' to install steam. Bam! Done.

&lt;p&gt;

To run steam after winetricks installs it, you'll want to do this crazy business, because winetricks installs steam to it's own "wine prefix":

&lt;pre&gt;
WINEPREFIX=$HOME/.local/share/wineprefixes/steam/ wine "C:\\Program Files (x86)\\Steam\\Steam.exe"
&lt;/pre&gt;

&lt;p&gt;

When running TF2, I noticed framerates were pretty crappy. Most googling I did
found practically no useful information except for one or two forum posts that
indicate CPU affinity being the most likely cause. This made sense given frame
rates were completely the same regardless of graphical settings used
(resolution or features like model quality, etc).

&lt;p&gt;

First step is to enable 'multicore rendering'

&lt;p&gt;

Then, when tf2 is up, run this script below. It looks for the most cpu-hungry
threads in hl2.exe (tf2) as well as for the steam/wine/xorg processes. It then
pins them to specific CPUs.

&lt;pre&gt;
(
  # Get the top cpu-using threads for the 'hl2.exe' process (tf2)
  # then pin each to a separate CPUs and give them elevated scheduling priority
  top -bn1 -Hp $(pgrep hl2.exe) \
  | awk '$NF == "hl2.exe" { split($(NF - 1), t, ":"); cputime = t[1] * 60.0 + t[2]; print cputime, $1 }'  \
  | sort -n | tail -3 | awk '{print $2}'

  pgrep 'Steam|wineserver|Xorg'
) \
| awk '{print NR, $1}' \
| sudo xargs -tn2 sh -c 'taskset -p $((1 &lt;&lt; ($1 - 1))) $2; renice -n -2 $2' -
&lt;/pre&gt;

Once I run this command while tf2 is up, frame rate doubles (to around 60) and
is much more consistent (bursty drops in framerates)

&lt;img src="/images/spacer.gif?geekery/tf2-wine-linux-performance-tuning" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/semicomplete/main?a=qZxAIZX4J3o:_9fI8djYsGQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/semicomplete/main?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/semicomplete/main?a=qZxAIZX4J3o:_9fI8djYsGQ:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/semicomplete/main?i=qZxAIZX4J3o:_9fI8djYsGQ:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/semicomplete/main?a=qZxAIZX4J3o:_9fI8djYsGQ:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/semicomplete/main?i=qZxAIZX4J3o:_9fI8djYsGQ:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/semicomplete/main/~4/qZxAIZX4J3o" height="1" width="1"/&gt;</description>
   <category domain="http://www.semicomplete.com/blog">geekery</category>
   <pubDate>Mon, 05 Nov 2012 05:11 GMT</pubDate>
<feedburner:origLink>http://www.semicomplete.com/blog/geekery/tf2-wine-linux-performance-tuning.html</feedburner:origLink></item>
<item>
   <title>MITRE's CEE is a failure for profit.</title>
   <guid isPermaLink="false">http://www.semicomplete.com/blog/geekery/CEE-logging-for-profit.html</guid>
   <link>http://feedproxy.google.com/~r/semicomplete/main/~3/G6JsvFM1q_E/CEE-logging-for-profit.html</link>
   <description>I wrote this post a few months ago, but never got around to publishing it.

&lt;p&gt;Anyway, someone mentioned 'project lumberjack' and I found it was based on &lt;a href="http://cee.mitre.org/"&gt;CEE: Common Event Expression&lt;/a&gt;. CEE is a sort of comedic tragedy of design.&lt;/p&gt;

&lt;p&gt;The effort is owned by a "non-profit" (MITRE), but the complexity and
obfuscation in CEE can only drive towards one thing: consultant profits.
I had a go at explaining what I describe in this post on the 'project
lumberjack' mailing list, but I did it quite poorly and got a few foot-stomps
in response, so I gave up.&lt;/p&gt;

&lt;p&gt;CEE is a failure because, while claiming to be a standards effort, it &lt;strong&gt;maximizes
incompatibility&lt;/strong&gt; between implementations by doing the following:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;poorly describes multiple serialization formats, requires none of them.
  &lt;em&gt;This ensures maximum incompatibility in event serialization&lt;/em&gt;&lt;/li&gt;
  &lt;li&gt;defines requirements for log transport protocols, but does not describe
  an actual protocol. &lt;em&gt;This ensures maximum protocol
  incompatibility&lt;/em&gt;&lt;/li&gt;
  &lt;li&gt;naming style inconsistencies &lt;em&gt;This ensures confusion&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In general, the goal of CEE sounds like, but is actually not, creating a
standard for common event expression. Instead, CEE is aimed at ensuring
consulting dollars through obfuscation, complexity, and inconsistency.&lt;/p&gt;

&lt;h1 id="inconsistency"&gt;Inconsistency.&lt;/h1&gt;

&lt;p&gt;No consistency in naming.  Some names are abbreviations like ‘crit’, some
are prefixed abbreviations (“p_” prefix), some are full english words like
‘action’. &lt;/p&gt;

&lt;p&gt;If the goal was to be inconsistent, CEE has succeeded.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Mysterious ‘p_’ prefix.
Base fields are abbreviated names like “crit”, “id”, “pri”, yet others are
called “p_app”, “p_proc”, and “p_proc_id”.&lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Some fields are abbreviated, like “crit” and “pri”, but others are full
english words, like “action” and “domain”&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;there’s “id” which marks the “event type” by identifier, but “uuid” which
marks the event instance identifier. You are confusing. I’m still not sure
what the purpose of ‘uuid’ is.&lt;/li&gt;
&lt;/ul&gt;

&lt;h1 id="etoomanyprotocols"&gt;ETOOMANYPROTOCOLS&lt;/h1&gt;

&lt;ul&gt;
  &lt;li&gt;Serializations: JSON, RFC3164, RFC5424, and XML serializations&lt;/li&gt;
  &lt;li&gt;4 conformance levels.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pick one serialization and one transport (“conformance”) requirements list.
Describe those two. Drop all the others.&lt;/p&gt;

&lt;p&gt;If I pick JSON, and you pick XML, we can both be CEE-conforming and have zero interoperability between our tools. Nice!&lt;/p&gt;

&lt;h1 id="serialization-underspecified"&gt;Serialization underspecified&lt;/h1&gt;

&lt;p&gt;JSON for event serialization is fine, but no message framing is defined. Newline terminated? Length prefixed? You don’t know :(&lt;/p&gt;

&lt;h1 id="json"&gt;JSON&lt;/h1&gt;

&lt;ul&gt;
  &lt;li&gt;“Reserved Characters” - I don’t think you have read the JSON spec. Most
(all?) of the ‘escaping’ detailed in CEE JSON is already specified in JSON:
&lt;a href="http://www.json.org/string.gif"&gt;http://www.json.org/string.gif&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Specific comments on the ‘json’ format inline as comments, this example was
copied verbatim from the CEE :&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;{
    # Forget this "Event" crap, just move everything up a level.
    "Event": {
        "p_proc": "proc1",
        "p_sys": "host.vendor.com",
        "time": "2012-01-18T05:55:12.4321-05:00",
        "Type": {
            # Action is like, edge-trigger information.
            # Status is like, line-trigger information.
            # You don't usually have both edge and line triggers in the
            # same event. Confusing.
            "action": "login",
            "status": "ongoing",

            # Custom tag values also MUST start with a colon? It's silly to make
            # the common case (custom tags) the longer form.
            # Also, tags is a plural word, but the value is a string. What?
            "tags": ":hipaa"
        },
        "Profile": {
            # This is a *huge* bloat, seriously. Stop making JSON into XML, guys.
            "CustomProfile": {
                "schema": "http://vendor.com/events/cee-profile.xsd",
                "new_field": "a string value",
                "new_val": 1234,
                "product_host": "source.example.com"
            }
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;If you include the schema (CEE calls it a Profile) in &lt;em&gt;every&lt;/em&gt; message, you’re
just funding companies who’s business model relies on you paying them per-byte
of log transit.&lt;/p&gt;

&lt;p&gt;Prior art here for sharing schema can be observed in the Apache Avro
project, for example.&lt;/p&gt;

&lt;h1 id="clt-protocol"&gt;CLT Protocol&lt;/h1&gt;

&lt;p&gt;Just define the protocol, all these requirements and conformance levels make
things more confusing and harder to write tooling for.&lt;/p&gt;

&lt;p&gt;If you don’t define the protocol, there’s no incentive for vendors to use prior
art and are just as likely to invent their own protocols. &lt;/p&gt;

&lt;p&gt;Combining this incentive-to-invent with the whole of CEE that underspecifies just about every feature, this guarantees incompatibilities in implementations.&lt;/p&gt;

&lt;img src="/images/spacer.gif?geekery/CEE-logging-for-profit" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/semicomplete/main?a=G6JsvFM1q_E:2VSvw5bQUUY:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/semicomplete/main?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/semicomplete/main?a=G6JsvFM1q_E:2VSvw5bQUUY:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/semicomplete/main?i=G6JsvFM1q_E:2VSvw5bQUUY:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/semicomplete/main?a=G6JsvFM1q_E:2VSvw5bQUUY:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/semicomplete/main?i=G6JsvFM1q_E:2VSvw5bQUUY:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/semicomplete/main/~4/G6JsvFM1q_E" height="1" width="1"/&gt;</description>
   <category domain="http://www.semicomplete.com/blog">geekery</category>
   <pubDate>Wed, 12 Sep 2012 05:34 GMT</pubDate>
<feedburner:origLink>http://www.semicomplete.com/blog/geekery/CEE-logging-for-profit.html</feedburner:origLink></item>
<item>
   <title>Growing logstash's value</title>
   <guid isPermaLink="false">http://www.semicomplete.com/blog/growing-logstash-value.html</guid>
   <link>http://feedproxy.google.com/~r/semicomplete/main/~3/TWRG4TWbuqk/growing-logstash-value.html</link>
   <description>I spent a while today thinking about nerdy stuff - logstash, etc. I want to
grow logstash in terms of performance, use case, deployment instances, happy
users, and community.

&lt;p&gt;

While musing about on my mental roadmap of logstash, I found most things boil
down to costs and returns on investment, even with open source software.
Money, time, energy, and patience are all costs. Just because something
doesn't cost any money doesn't mean it won't consume any time or energy.

&lt;p&gt;

I see two distinct groups of users, with respect to cost. New users and current
users. In terms of inputs and outputs, the phrase 'return on investment' comes
to mind. New users are likely in the evaluation and investigation phase, mainly
estimating ROI or judging "is this solution useful to me?" Existing users are
likely in the maintenance and integration phases, mainly trying to improve or
maintain ROI or pushing towards improving value provided by a tool.

&lt;p&gt;

These two user groups are, in my observation and from a seller's perspective,
quite distinct in terms of strategy. How you acquire happy new users is not
necessarily how you maintain and energize existing users.

&lt;p&gt;

&lt;h4&gt; Targeting New Users &lt;/h4&gt;

New users easily stumble on bad documentation, complex architectures, and excessive steps.

&lt;p&gt;

I have a few goals regarding minimization for new users: reducing mean time to
demo and mean time to deploy are critical. Reducing 'time to demo' requires
that I focus on minimizing steps required to answer 'is logstash useful?'.
Additionally, ensuring each required step in 'time to demo' is as simple as
possible. Reducing time to deploy means publishing high quality init scripts
(upstart, systemd, sysv init) as well as high quality puppet, chef, and
cfengine modules.

&lt;p&gt;

The time someone spends as what I consider a 'new user' is actually quite
short. My goal with users in this stage are to help them quickly and accurately
answer, "will this tool benefit me?" 

&lt;h4&gt; Targeting Existing Users &lt;/h4&gt;

As an existing user of a tool, I'm often looking for how to reduce operational,
maintenance, and integration costs. Operational costs appear as physical
resource usage (servers, or fuel-like resources). Maintenance costs appear as
bugs and related investigations, monitoring, etc. Integration costs appear as
time and energy spent making the tool work well with your infrastructure.

&lt;p&gt;

These kind of users are usually a bit more invested in use of the tool, but I
want to avoid abusing that fact. Time and energy investments in a free tool
can cause as much vendor trappings as monetary investments. Don't treat
your existing users like dirt, right?

&lt;p&gt;

My goal for the next few months is to become one of these existing users of
logstash (to date, as I've confessed, I've never run logstash in production).
I'll be able to do that at DreamHost (starting tomorrow!).

&lt;p&gt;

Additionally, I will be focusing strongly on improving logstash new user
experience. Happier new users should reflect nicely on community growth and
activity. That's my goal, anyway!

&lt;img src="/images/spacer.gif?growing-logstash-value" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/semicomplete/main?a=TWRG4TWbuqk:fef0VrP0d-k:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/semicomplete/main?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/semicomplete/main?a=TWRG4TWbuqk:fef0VrP0d-k:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/semicomplete/main?i=TWRG4TWbuqk:fef0VrP0d-k:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/semicomplete/main?a=TWRG4TWbuqk:fef0VrP0d-k:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/semicomplete/main?i=TWRG4TWbuqk:fef0VrP0d-k:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/semicomplete/main/~4/TWRG4TWbuqk" height="1" width="1"/&gt;</description>
   <category domain="http://www.semicomplete.com/blog" />
   <pubDate>Mon, 30 Jul 2012 06:00 GMT</pubDate>
<feedburner:origLink>http://www.semicomplete.com/blog/growing-logstash-value.html</feedburner:origLink></item>
<item>
   <title>Installing Windows 8 Consumer Preview</title>
   <guid isPermaLink="false">http://www.semicomplete.com/blog/geekery/installing-windows-8-consumer-preview.html</guid>
   <link>http://feedproxy.google.com/~r/semicomplete/main/~3/PK2Xz8iRi08/installing-windows-8-consumer-preview.html</link>
   <description>I have a fresh workstation and am running through the windows 8 installer on USB.

When choosing the drive to install to, I get an error:

&lt;blockquote&gt;
We couldn't create a new partition or locate an existing one
&lt;/blockquote&gt;

Lots of googling and I didn't find any hints for windows 8, but windows 7 has a
similar error and folks pointed at diskpart nonsense to fix it. So let's do that -

&lt;ul&gt;
&lt;li&gt; At the installer, choose "Repair your computer"&lt;/li&gt;
&lt;li&gt; Choose "troubleshoot" &lt;/li&gt;
&lt;li&gt; Choose "advanced options" &lt;/li&gt;
&lt;li&gt; Choose "command prompt"&lt;/li&gt;
&lt;li&gt; Run diskpart.
&lt;/ul&gt;

In diskpart, you'll want to make sure your target drive is formatted and active.

&lt;pre&gt;
list disk

# now pick your disk
select disk 0
clear
create partition
format fs=ntfs compress quick
active
&lt;/pre&gt;

Now reboot and try the installer again, it worked for me.

&lt;img src="/images/spacer.gif?geekery/installing-windows-8-consumer-preview" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/semicomplete/main?a=PK2Xz8iRi08:NW6osc0mv_E:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/semicomplete/main?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/semicomplete/main?a=PK2Xz8iRi08:NW6osc0mv_E:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/semicomplete/main?i=PK2Xz8iRi08:NW6osc0mv_E:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/semicomplete/main?a=PK2Xz8iRi08:NW6osc0mv_E:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/semicomplete/main?i=PK2Xz8iRi08:NW6osc0mv_E:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/semicomplete/main/~4/PK2Xz8iRi08" height="1" width="1"/&gt;</description>
   <category domain="http://www.semicomplete.com/blog">geekery</category>
   <pubDate>Thu, 10 May 2012 06:50 GMT</pubDate>
<feedburner:origLink>http://www.semicomplete.com/blog/geekery/installing-windows-8-consumer-preview.html</feedburner:origLink></item>
<item>
   <title>When all you have is a hammer, make your own tools?</title>
   <guid isPermaLink="false">http://www.semicomplete.com/blog/geekery/solving-good-or-bad-problems.html</guid>
   <link>http://feedproxy.google.com/~r/semicomplete/main/~3/9eQzidfXYxo/solving-good-or-bad-problems.html</link>
   <description>Clarifying my position from &lt;a href="https://twitter.com/#!/jordansissel/status/174684550763511809"&gt;this post&lt;/a&gt;:

&lt;blockquote&gt;
The "ops folks need coding skills" groupthink is lame. Software requires extra
coding because it is shitty, not because people are unskilled
&lt;/blockquote&gt;

&lt;p&gt;

I will lead with this: I want more people who use technology to grow and learn
better skills for bending that technology to their needs. An ops guy with
programming skills is, to me, more valuable than one who cannot - programming
in any language or platform lets you extend an otherwise static system.

&lt;p&gt;

Anyway, back at the post in question, I'm not trying to say people (ops or
otherwise) shouldn't want stronger programming skills. I'm saying the equipment
we use is pretty shitty.

&lt;p&gt;

I am part of the generation raised near devices ever blinking "12:00". Devices
which have no business caring what time it is, nor any sane reason to make the
state of "I don't know what time it is" a high priority alert worth blinking
forever.

&lt;p&gt;

It's 2012, and this problem persists - my microwave refuses to cook food unless
it has the time *and* date from user input. Now I have to program it every time
it has a power disruption (which is has frequently due to some bug in the
hardware causing it to power off randomly with certain dishes at home).

&lt;p&gt;

&lt;b&gt;
Now I have to learn to program or configure these devices before they'll stop
irritating me. And, damn it I hate that.&lt;/b&gt; If, instead, this were enterprise
software, I could report these irritations to the vendor who would kindly offer
me training and consulting for extortionate piles of money.

&lt;p&gt;

I love coding. It's fun, and many times lets me solve problems I couldn't
otherwise. Allowing me to abuse an analogy, "When all you have is a hammer, you
can sit down and build whatever tool you need to repair the delusion that
everything is a nail."

&lt;p&gt;

But despite being able to solve my own problems in software, I don't think this
is a great pattern of work. I write code, most of the time, because the
solutions available are terrible or don't meet my requirements. With a new
software popping up every day, I see a strong correlation between software
availability and people asking for more programmers.

&lt;p&gt;

So, the more software we have, the more programmers we need to work around
limitations in the available body of software. I think that's pretty lame :(

&lt;p&gt;

And regarding my microwave problems, I want some confidence that the problems
being solved are meaningful problems, not programming learned for the sake of
working around bugs and misfeatures in software we're suffering with.

&lt;img src="/images/spacer.gif?geekery/solving-good-or-bad-problems" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/semicomplete/main?a=9eQzidfXYxo:VgD7dy3i9AI:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/semicomplete/main?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/semicomplete/main?a=9eQzidfXYxo:VgD7dy3i9AI:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/semicomplete/main?i=9eQzidfXYxo:VgD7dy3i9AI:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/semicomplete/main?a=9eQzidfXYxo:VgD7dy3i9AI:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/semicomplete/main?i=9eQzidfXYxo:VgD7dy3i9AI:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/semicomplete/main/~4/9eQzidfXYxo" height="1" width="1"/&gt;</description>
   <category domain="http://www.semicomplete.com/blog">geekery</category>
   <pubDate>Wed, 29 Feb 2012 06:01 GMT</pubDate>
<feedburner:origLink>http://www.semicomplete.com/blog/geekery/solving-good-or-bad-problems.html</feedburner:origLink></item>
<item>
   <title>Goodbye, 2011.</title>
   <guid isPermaLink="false">http://www.semicomplete.com/blog/geekery/year-in-review-2011.html</guid>
   <link>http://feedproxy.google.com/~r/semicomplete/main/~3/ICzS-sI0u60/year-in-review-2011.html</link>
   <description>This year's been pretty good, but the last two months were pretty lame.

&lt;p&gt;

In the last six weeks, I found out &lt;a
href="http://www.flickr.com/photos/jordansissel/sets/72157607393160502/"&gt;Caramel&lt;/a&gt;
has lymphoma, got unemployed, and had emergency surgery to remove my appendix
on Christmas Day. The unemployment caused me to lose an in-progress mortgage
refinance.

&lt;p&gt;

I'll pick up the mortgage thing once I remedy the employment problem, but I'm
staying quite happily unemployed until after my kid is born - should be any day
now!

&lt;p&gt;

Most of my career-growing moves were outside of work: at meetups, in open
source efforts, or in networking with folks on IRC or twitter. Lots of awesome
folks out there, so go introduce yourself. Don't be a dick. :)

&lt;p&gt;

I didn't write much on this site, but mainly, that was due to an increase in
my activities on IRC and twitter. Most of what I published this year was code
and was less writing about said code. I'd like to fix that, though.

&lt;p&gt;

This years successes were topped by two new major projects, &lt;a
href="https://github.com/jordansissel/fpm#readme"&gt;fpm&lt;/a&gt; and &lt;a
href="http://logstash.net/"&gt;logstash&lt;/a&gt;. I also released some major
improvements to xdotool and other tools.

&lt;p&gt;

The current implementation of logstash isn't very old, but prototypes, hacks,
and other incarnations of pretty much the same thing date back to at least 2005
and probably earlier. This project has been a long-time-coming, and Pete
Fritchman and I have been talking about logstash for years, so it's nice to
finally have some code shipped and a community building around it.

&lt;p&gt;

FPM had a crazy positive response. I wrote it as a hack, and it's used all over
the place now. Bonus that people are contributing patches and other
improvements as well.

&lt;p&gt;

Sysadvent was another excellent success, the end of which marked the 4th year
and 100th article posted to the project. It is awesome seeing such community
involvement from so many different authors.

&lt;p&gt;

This year also cemented my move to git from svn. Why? Github, mostly, and not
really the features of git itself. Sharing code and patches is so much easier
on github than it is with other services.

&lt;p&gt;

I went to &lt;a href="http://blip.tv/carolinacon/logstash-open-source-log-and-event-management-jordan-sissel-5123601"&gt;CarolinaCon&lt;/a&gt;
and &lt;a href="http://www.oscon.com/oscon2011/public/schedule/detail/18899"&gt;OSCON&lt;/a&gt; to
talk about logstash. I also went to DevOps Days Mountain View and gave a
lightning talk on logstash.

&lt;p&gt;

My OSCON talk was overflowing with people standing at the back of the room,
etc; it went awesomely. I've also been able to do lunchtime logstash
presentations at places like Square and others. I also gave talks at BayLISA
meetings. It was a good year for getting out of the house and talking about
code.

&lt;p&gt;

I tried to get a count of how much code I'd written this year, but I had lots
of web-based projects that included third-party stuff like jquery, and I'm
too lazy to pick through the results and trim that stuff out. I'm up to about
70 different projects on github now, some useful; some not; all fun!

&lt;p&gt;

Looking forward to 2012 :)

&lt;img src="/images/spacer.gif?geekery/year-in-review-2011" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/semicomplete/main?a=ICzS-sI0u60:jmjOZsH4Pcc:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/semicomplete/main?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/semicomplete/main?a=ICzS-sI0u60:jmjOZsH4Pcc:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/semicomplete/main?i=ICzS-sI0u60:jmjOZsH4Pcc:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/semicomplete/main?a=ICzS-sI0u60:jmjOZsH4Pcc:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/semicomplete/main?i=ICzS-sI0u60:jmjOZsH4Pcc:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/semicomplete/main/~4/ICzS-sI0u60" height="1" width="1"/&gt;</description>
   <category domain="http://www.semicomplete.com/blog">geekery</category>
   <pubDate>Sun, 01 Jan 2012 00:29 GMT</pubDate>
<feedburner:origLink>http://www.semicomplete.com/blog/geekery/year-in-review-2011.html</feedburner:origLink></item>
<item>
   <title>Insist on better asserts</title>
   <guid isPermaLink="false">http://www.semicomplete.com/blog/geekery/insist-on-better-asserts.html</guid>
   <link>http://feedproxy.google.com/~r/semicomplete/main/~3/6RvXS8TAI5A/insist-on-better-asserts.html</link>
   <description>I never really liked C's assert() feature. If an assertion is violated, it'll
tell you what assertion failed but completely lacks any context:

&lt;pre&gt;
example: example.c:9: main: Assertion `i == 3' failed.
&lt;/pre&gt;

This is better:

&lt;pre&gt;
Assertion failed insist.c:7 in main(), insist(i == 3): Something went wrong, wanted i == 3, got 4
&lt;/pre&gt;

The main difference here is that there's context about what failed. A message
for humans looking to debug this. This is especially important on Linux these
days because every distro I've used recently hates sysadmins and hates
debugging - all libraries are stripped of debug symbols and coredumps are
disabled by default.

&lt;p&gt;

What's the usage look like?

&lt;pre&gt;
#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;
#include "insist.h"

int main() {
  int i = 4;
  //assert(i == 3);
  insist(i == 3, "Something went wrong, wanted i == 3, got %d", i);
  return 0;
} 
&lt;/pre&gt;

I also added a special 'return' version of this, 'insist_return' that lets you
do error checking and early aborting like this:

&lt;pre&gt;
insist_return(fd &gt;= 0, START_FAILURE,
              "socket() returned %d, an error: %s", fd, strerror(errno));
&lt;/pre&gt;

Works just like insist() except returns START_FAILURE if 'fd &gt; 0' is false and
additionally logs the error formatted above.

&lt;p&gt;

Code here: &lt;a href="https://github.com/jordansissel/experiments/tree/master/c/better-assert/insist.h"&gt;insist.h&lt;/a&gt;

&lt;img src="/images/spacer.gif?geekery/insist-on-better-asserts" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/semicomplete/main?a=6RvXS8TAI5A:03kXXEm1oJg:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/semicomplete/main?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/semicomplete/main?a=6RvXS8TAI5A:03kXXEm1oJg:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/semicomplete/main?i=6RvXS8TAI5A:03kXXEm1oJg:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/semicomplete/main?a=6RvXS8TAI5A:03kXXEm1oJg:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/semicomplete/main?i=6RvXS8TAI5A:03kXXEm1oJg:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/semicomplete/main/~4/6RvXS8TAI5A" height="1" width="1"/&gt;</description>
   <category domain="http://www.semicomplete.com/blog">geekery</category>
   <pubDate>Sun, 09 Oct 2011 05:25 GMT</pubDate>
<feedburner:origLink>http://www.semicomplete.com/blog/geekery/insist-on-better-asserts.html</feedburner:origLink></item>
<item>
   <title>xdotool 2.20110530release</title>
   <guid isPermaLink="false">http://www.semicomplete.com/blog/geekery/xdotool-2.20110530.html</guid>
   <link>http://feedproxy.google.com/~r/semicomplete/main/~3/PHZKFQqvoIs/xdotool-2.20110530.html</link>
   <description>It's been about 8 months since the last xdotool release, and I think it's long
overdue! This release has a ton of new feature and fixes.


&lt;p&gt;

Download: &lt;a href="http://semicomplete.googlecode.com/files/xdotool-2.20110530.1.tar.gz"&gt;xdotool-2.20110530.1.tar.gz&lt;/a&gt;

&lt;p&gt;

As usual, if you find problems or have feature requests, please file &lt;a
href="http://code.google.com/p/semicomplete/issues/list"&gt;bugs&lt;/a&gt; or send an
email to the &lt;a href="http://groups.google.com/group/xdotool-users"&gt;list&lt;/a&gt;.

&lt;p&gt;

Changelist since previous announcement:
&lt;pre&gt;
2.20110530.*
  - New set_window feature: --urgency. This lets you set the urgency flag on a
    window Window managers will interpret this as something about your window
    needing attention. It might flash in the taskbar, pop up, or other.
    Original patch and suggestion by ervandew.
    Issue: http://code.google.com/p/semicomplete/issues/detail?id=39
  - New function: xdo_window_seturgency (see above)
  - Hack in OS X support as it is missing a proper clock_gettime.
    Should fix http://code.google.com/p/semicomplete/issues/detail?id=37
    Reported by ryandesign.com
  - Add support for typing UTF-8 characters. Patch from Joseph Krahn.
  - Make all output call fflush to send data immediately (for pipes). Reported
    by Andreas Wagner on the mailing list.
  - Make 'get_desktop_viewport' output usable with 'set_desktop_viewport'
    http://code.google.com/p/semicomplete/issues/detail?id=47
  - You can now make 'libxdo.a' for embedding libxdo into your binary
    (Requested by psc on the mailing list).
  - Fixed a typing bug where the keymap changes unnecessarily 
  - Should now build cleanly in C++ environments (Reported by psc on the
    mailing list)
  - bugfix: xdotool should use command names first before trying file scripts. 
    See https://bbs.archlinux.org/viewtopic.php?pid=938309 for original report.
  - Add a 'sleep' command. (Requested by Joseph Krahn via mailing list)
  - Add --relative flag to windowmve. (Requested by Anthony Thyssen via mailing
  - Add --desktop flag to the search command. This lets you search for windows
    on specific desktop. Requires a window manager that supports multiple
    desktops in a way that EWMH supports.
    Fixes http://code.google.com/p/semicomplete/issues/detail?id=38
  - Add --limit flag to search. This allows you to break the search early after
    a certain number of matches. (Requested by Anthony Thyssen)
  - New command 'getwindowgeometry' for fetching window position and size
    (Requested by Anthony Thyssen via mailing list)
  - Add --sync flag to search command; blocks until results are found.
    xdotool will search every 0.5 seconds for results.
    http://code.google.com/p/semicomplete/issues/detail?id=42
  - windowmove can now move windows along an axis. Give literal 'x' or 'y'
    instead of a coordinate and it uses the current position. (Requested by
    etnlIcarus via mailing list)
  - Add '--args N' and '--terminator TERMINATOR' to the 'exec' command.
    Default terminator unless specified (or --args is) is ':' (Requested by
    Joseph Krahn and Henning Bekel via mailing list)
  - set_desktop now supports --relative flag (+N or -N to move relative)
    (Requested by Anthony Thyssen)
  - The mouse cursor now changes during 'xdotool selectwindow' (Requested by
    Anthony Thyssen via mailing list)
  - Added '--args N' and '--terminator TERMINATOR' to the 'type' command.
  - Add 'getdisplaygeometry' command for querying the size of your screen.
    (Requested by @rrwo via twitter)
  - Add xdo_get_viewport_dimensions function.
&lt;/pre&gt;

&lt;img src="/images/spacer.gif?geekery/xdotool-2.20110530" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/semicomplete/main?a=PHZKFQqvoIs:pU4gVcy0kmo:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/semicomplete/main?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/semicomplete/main?a=PHZKFQqvoIs:pU4gVcy0kmo:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/semicomplete/main?i=PHZKFQqvoIs:pU4gVcy0kmo:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/semicomplete/main?a=PHZKFQqvoIs:pU4gVcy0kmo:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/semicomplete/main?i=PHZKFQqvoIs:pU4gVcy0kmo:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/semicomplete/main/~4/PHZKFQqvoIs" height="1" width="1"/&gt;</description>
   <category domain="http://www.semicomplete.com/blog">geekery</category>
   <pubDate>Mon, 30 May 2011 08:34 GMT</pubDate>
<feedburner:origLink>http://www.semicomplete.com/blog/geekery/xdotool-2.20110530.html</feedburner:origLink></item>
<item>
   <title>logstash's first major release - 1.0.0</title>
   <guid isPermaLink="false">http://www.semicomplete.com/blog/geekery/logstash-1.0.0-release.html</guid>
   <link>http://feedproxy.google.com/~r/semicomplete/main/~3/oD0CzjVldY4/logstash-1.0.0-release.html</link>
   <description>Ready for log and event management that doesn't suck or drain your budget? It's
time to logstash.

&lt;p&gt;
After lots of refactoring and improvements to logstash since the first minor
release last November, logstash is ready for wider usage now.

&lt;p&gt;
Read &lt;a
href="https://groups.google.com/group/logstash-users/browse_thread/thread/5a274d530a53eaaa"&gt;my announcement here&lt;/a&gt;. 

&lt;p&gt;

The logstash site is also online and has docs, intros, slides, and videos.

&lt;p&gt;

&lt;a href="http://logstash.net/"&gt;http://logstash.net&lt;/a&gt;

&lt;p&gt;

Happy logstashing!


&lt;img src="/images/spacer.gif?geekery/logstash-1.0.0-release" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/semicomplete/main?a=oD0CzjVldY4:YLxAJDUecg8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/semicomplete/main?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/semicomplete/main?a=oD0CzjVldY4:YLxAJDUecg8:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/semicomplete/main?i=oD0CzjVldY4:YLxAJDUecg8:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/semicomplete/main?a=oD0CzjVldY4:YLxAJDUecg8:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/semicomplete/main?i=oD0CzjVldY4:YLxAJDUecg8:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/semicomplete/main/~4/oD0CzjVldY4" height="1" width="1"/&gt;</description>
   <category domain="http://www.semicomplete.com/blog">geekery</category>
   <pubDate>Sat, 07 May 2011 08:00 GMT</pubDate>
<feedburner:origLink>http://www.semicomplete.com/blog/geekery/logstash-1.0.0-release.html</feedburner:origLink></item>
</channel>
</rss>
