<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"><channel><atom:link rel="hub" href="http://tumblr.superfeedr.com/" xmlns:atom="http://www.w3.org/2005/Atom"/><description>And so it was decided that Slava should be deployed to America.</description><title>sshrkv is awsm</title><generator>Tumblr (3.0; @sshrkv)</generator><link>http://sshrkv.tumblr.com/</link><item><title>Annoying problems get annoying solutions.</title><description>&lt;a href="https://gist.github.com/sshirokov/5025751"&gt;Annoying problems get annoying solutions.&lt;/a&gt;: &lt;p&gt;The latest build of emacs came with a flakey erc timer that &lt;a href="https://github.com/sshirokov/ZNC.el"&gt;ZNC.el&lt;/a&gt; didn’t agree with during reconnects.&lt;/p&gt;

&lt;p&gt;This is my highly engineered solution to the problem.&lt;/p&gt;</description><link>http://sshrkv.tumblr.com/post/43925337981</link><guid>http://sshrkv.tumblr.com/post/43925337981</guid><pubDate>Sun, 24 Feb 2013 16:41:04 -0500</pubDate><category>emacs</category><category>elisp</category><category>lifehacks</category><category>badcode</category></item><item><title>"The authors then did a separate experiment where instead of using ‘sexually naive’ rats as the..."</title><description>“The authors then did a separate experiment where instead of using ‘sexually naive’ rats as the stimulus rats, they used ‘sexually expert’ rats.”&lt;br/&gt;&lt;br/&gt; - &lt;em&gt;&lt;a href="http://cellularscale.blogspot.com/2012/10/can-you-turn-rat-gay.html"&gt;Can you turn a rat gay?&lt;/a&gt; (via &lt;a class="tumblr_blog" href="http://outofcontextscience.com/"&gt;outofcontextscience&lt;/a&gt;)&lt;/em&gt;</description><link>http://sshrkv.tumblr.com/post/35170174875</link><guid>http://sshrkv.tumblr.com/post/35170174875</guid><pubDate>Tue, 06 Nov 2012 20:58:35 -0500</pubDate></item><item><title>"On its third firing the chain snapped immediately and one ball tore into a nearby cabin, knocking..."</title><description>“On its third firing the chain snapped immediately and one ball tore into a nearby cabin, knocking down its chimney, the other spun off erratically and struck a nearby cow, killing it instantly. Gilleland considered the test-firings a success.”&lt;br/&gt;&lt;br/&gt; - &lt;em&gt;&lt;a href="http://en.wikipedia.org/wiki/Double-barreled_cannon"&gt;Double-barreled cannon&lt;/a&gt;&lt;/em&gt;</description><link>http://sshrkv.tumblr.com/post/33979483807</link><guid>http://sshrkv.tumblr.com/post/33979483807</guid><pubDate>Sat, 20 Oct 2012 16:35:14 -0400</pubDate></item><item><title>I am having trouble determining if this article is real or not</title><description>&lt;a href="http://www.redandblack.com/opinion/how-to-find-that-perfect-husband-in-college/article_8b6d38e2-c575-11e1-8ce5-0019bb30f31a.html#user-comment-area"&gt;I am having trouble determining if this article is real or not&lt;/a&gt;</description><link>http://sshrkv.tumblr.com/post/26708975349</link><guid>http://sshrkv.tumblr.com/post/26708975349</guid><pubDate>Sat, 07 Jul 2012 14:26:36 -0400</pubDate></item><item><title>Photo</title><description>&lt;img src="http://24.media.tumblr.com/tumblr_m57582FcnE1r362mdo1_500.png"/&gt;&lt;br/&gt;&lt;br/&gt;</description><link>http://sshrkv.tumblr.com/post/24550745650</link><guid>http://sshrkv.tumblr.com/post/24550745650</guid><pubDate>Wed, 06 Jun 2012 14:41:41 -0400</pubDate></item><item><title>wilwheaton:

I was playing Civilization: Revolution on my iPad...</title><description>&lt;img src="http://24.media.tumblr.com/tumblr_m52gkltnXj1qz9bu3o1_500.png"/&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;&lt;a href="http://wilwheaton.tumblr.com/post/24368556296/i-was-playing-civilization-revolution-on-my-ipad" class="tumblr_blog"&gt;wilwheaton&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;I was playing Civilization: Revolution on my iPad today. When I got access to the “Fundamentalism” government, this is the warning the game gave me.&lt;/p&gt;
&lt;p&gt;I stuck with Monarchy, and eventually won a cultural victory.&lt;/p&gt;&lt;/blockquote&gt;</description><link>http://sshrkv.tumblr.com/post/24435299846</link><guid>http://sshrkv.tumblr.com/post/24435299846</guid><pubDate>Mon, 04 Jun 2012 19:58:18 -0400</pubDate></item><item><title>mcgoats:


oh my god




You have been warned.</title><description>&lt;img src="http://25.media.tumblr.com/tumblr_m4i8vqleNT1qd40x1o1_500.png"/&gt;&lt;br/&gt; &lt;br/&gt;&lt;img src="http://24.media.tumblr.com/tumblr_m4i8vqleNT1qd40x1o2_500.png"/&gt;&lt;br/&gt; &lt;br/&gt;&lt;p&gt;&lt;a class="tumblr_blog" href="http://mcgoats.tumblr.com/post/23722576109/oh-my-god"&gt;mcgoats&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;oh my god&lt;/p&gt;
&lt;/blockquote&gt;



&lt;p&gt;You have been warned.&lt;/p&gt;</description><link>http://sshrkv.tumblr.com/post/24019628652</link><guid>http://sshrkv.tumblr.com/post/24019628652</guid><pubDate>Tue, 29 May 2012 17:54:27 -0400</pubDate></item><item><title>I don’t understand what’s going on, and I think...</title><description>&lt;img src="http://24.media.tumblr.com/tumblr_m3mqvzvoEv1r5b59so1_500.jpg"/&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;I don’t understand what’s going on, and I think understanding would ruin the magic.&lt;/p&gt;</description><link>http://sshrkv.tumblr.com/post/23275492119</link><guid>http://sshrkv.tumblr.com/post/23275492119</guid><pubDate>Fri, 18 May 2012 00:28:00 -0400</pubDate></item><item><title>CLOS FSM with MOP Sauce</title><description>&lt;p&gt;Common Lisp in the desire to be as cool as possible includes in its specification the Common Lisp Object System, or CLOS, which itself can be introspected and altered in great detail using the MetaObject Protocol, or MOP, as described in &lt;a href="http://www.amazon.com/gp/product/0262610744/ref=as_li_qf_sp_asin_tl?ie=UTF8&amp;amp;tag=sshrkvisawsm-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0262610744"&gt;The Art of the Metaobject Protocol&lt;/a&gt;. Unfortunately, MOP didn&amp;#8217;t make it into the ANSI standard, but most implementations include MOP as it is described in the book, and a compatibility package &lt;a href="http://common-lisp.net/project/closer/closer-mop.html"&gt;:closer-mop&lt;/a&gt; (available in &lt;a href="http://www.quicklisp.org/"&gt;Quicklisp&lt;/a&gt;) makes using the symbols described seamless between implementations.&lt;/p&gt;

&lt;p&gt;One of the features of MOP is the ability to make an instance of a CLOS class funcallable, that is allow a class instance to be a valid first argument to &lt;a href="http://www.lispworks.com/documentation/HyperSpec/Body/f_funcal.htm"&gt;funcall&lt;/a&gt;. This behavior in a lot of ways can resemble the traditional method model from other languages, but that&amp;#8217;s not how I intend use it here.&lt;/p&gt;

&lt;h3&gt;The Idea&lt;/h3&gt;

&lt;p&gt;I&amp;#8217;m going to show and tell an implementation of a generic &lt;a href="http://en.wikipedia.org/wiki/Finite-state_machine"&gt;finite state machine&lt;/a&gt; that uses the MOP concepts of &lt;code&gt;funcallable-standard-object&lt;/code&gt; and &lt;code&gt;funcallable-standard-class&lt;/code&gt; to marshal the flow of incoming events to the machine and the concept of CLOS generic method dispatch to handle the execution of transition handlers for any given state of the machine.&lt;/p&gt;

&lt;p&gt;These features will allow us to build a structure that lets us focus solely on the problem at hand and defer features like event data binding, state-dependent method selection and unexpected state handling entirely to the language without pushing the boundaries of any specific feature.&lt;/p&gt;

&lt;h3&gt;The Design&lt;/h3&gt;

&lt;p&gt;The design we&amp;#8217;re going for is such that we can define a class with a &lt;code&gt;state&lt;/code&gt; slot that will hold &lt;code&gt;:keyword&lt;/code&gt; name of a state. We&amp;#8217;ll make instances of this class funcallable so that when we make an instance we will be able to simply &lt;code&gt;(funcall fsm-instance fsm-evemt)&lt;/code&gt; repeatedly and have the machine dispatch to the correct event, perform any logic, and transition to the next state based on the input.&lt;/p&gt;

&lt;p&gt;We would be able to query the state of the machine with &lt;code&gt;(state fsm-instance)&lt;/code&gt; and receive a keyword, and we should be able to drive events into the machine until we&amp;#8217;re in a desired or unexpected state. Any attempt to feed the machine an event while the machine is in an invalid state should result in an error.&lt;/p&gt;

&lt;!-- more --&gt;

&lt;h3&gt;Setup&lt;/h3&gt;

&lt;p&gt;Dependencies in Common Lisp these days should come from &lt;a href="http://www.quicklisp.org/"&gt;Quicklisp&lt;/a&gt;. Install it now before even reading the next paragraph, and during the installation phase ask it to write itself to your lisp configuration&amp;#8217;s init file.&lt;/p&gt;

&lt;p&gt;The code samples below, as should any code using MOP intending to run more than once, uses the &lt;a href="http://common-lisp.net/project/closer/closer-mop.html"&gt;:closer-mop&lt;/a&gt; package. Fetch it from Quicklisp before attempting these examples by evaluating:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;(ql:quickload :closer-mop)&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;At the REPL before attempting to evaluate any example code.&lt;/p&gt;

&lt;h3&gt;Implementation&lt;/h3&gt;

&lt;p&gt;We&amp;#8217;ll first declare the base of our state machine. We&amp;#8217;ll call the base &lt;code&gt;standard-state-machine&lt;/code&gt; to follow the convention CL seems to have of sticking the &lt;code&gt;standard-&lt;/code&gt; prefix to base classes.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;(defclass standard-state-machine (c2mop:funcallable-standard-object)
  ((state :initform :initial :initarg :state
          :accessor state)
   (last-event :initform (get-internal-real-time)
               :accessor last-event))

  (:metaclass c2mop:funcallable-standard-class))
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This grants us the majority of our desired features from the design. The resulting class holds a &lt;code&gt;:keyword&lt;/code&gt; state name in a &lt;code&gt;state&lt;/code&gt; slot, and is declared to be funcallable by the inclusion of the &lt;code&gt;funcallable-standard-object&lt;/code&gt; base and the &lt;code&gt;funcallable-standard-class&lt;/code&gt; &lt;a href="http://en.wikipedia.org/wiki/Metaclass"&gt;metaclass&lt;/a&gt; for the class itself.&lt;/p&gt;

&lt;p&gt;When events fire through this state machine we will need to invoke a method that we can use to dispatch to various handlers in the machine depending on the state we happen to be in. We can use the CLOS generic method feature called &lt;strong&gt;eql specializers&lt;/strong&gt; to distinguish which method should be invoked based on the name of the state a machine happens to be in. EQL specializers are just like type specializers for method parameters, but instead of the comparison of the parameter to the specialization happening based on the type of the parameter, it happens as if an &lt;code&gt;(eql parameter-value parameter-specialization)&lt;/code&gt; test is performed to determine if a given method is applicable to an invocation.&lt;/p&gt;

&lt;p&gt;With this in mind we can design a generic method that is aware of three things as parameters that we can choose to specialize: The current state machine, the state of the current state machine, and the event that was received by the machine.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;(defgeneric standard-state-machine-event (machine state event))
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;We won&amp;#8217;t define any such methods now, because right now we have no state machine to model, and as such have no state handing methods to define.&lt;/p&gt;

&lt;p&gt;To actually invoke a function when the funcallable instance is called as a function a lambda must be bound to be the &lt;em&gt;funcallable instance function&lt;/em&gt; of a given instance of a class. Since there is no mandate for an inherent &lt;em&gt;this&lt;/em&gt; pointer in CL, the best place to bind this function is often in one of the specializations of &lt;code&gt;initialize-instance&lt;/code&gt; and close over the current instance in the process. The attachment of a function to an instance is done with the MOP function &lt;code&gt;set-funcallable-instance-function&lt;/code&gt;, which places no special requirements on the args list of the attached function.&lt;/p&gt;

&lt;p&gt;We&amp;#8217;ll bind our driver to the state machine instance in the &lt;code&gt;:before&lt;/code&gt; specializer of its &lt;code&gt;initialize-instance&lt;/code&gt; method, and use an args list that expects only the &lt;code&gt;event&lt;/code&gt; that is being delivered to the state machine:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;(defmethod initialize-instance :before ((machine standard-state-machine) &amp;amp;key)
  (c2mop:set-funcallable-instance-function
   machine
   #'(lambda (event)
       (multiple-value-bind (next-state recur-p)
           (standard-state-machine-event machine (state machine) event)

         (setf (last-event machine) (get-internal-real-time)
               (state machine) (or next-state (state machine)))

         (if recur-p
             (funcall machine event)
             (values machine (state machine)))))))
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Now when we have instance of the state machine invoked with &lt;code&gt;(funcall fsm-instance event)&lt;/code&gt;, the inner &lt;code&gt;lambda&lt;/code&gt; expression will get passed the event and compute a return. This function despite having some length does very little.&lt;/p&gt;

&lt;p&gt;First, it dispatches the event to our previous &lt;code&gt;standard-state-machine-event&lt;/code&gt; method using the instance of the state machine we closed over as the first parameter, the state of the state machine as the second parameter and the event that the machine was called with.&lt;/p&gt;

&lt;p&gt;It expects a multi-value return, but if the method only returns one value, no error is raised and the second value, &lt;code&gt;recur-p&lt;/code&gt; is left bound to nil. Its meaning will become abundant in a moment.&lt;/p&gt;

&lt;p&gt;Once the state handler is called the new state returned by the handler is stored as the current state of the state machine, and if a second value was returned, the machine is invoked again with the same event it had just received before returning from the handler the value of the current machine instance for chaining and the value of the current state.&lt;/p&gt;

&lt;p&gt;The second, &lt;code&gt;recur-p&lt;/code&gt; value is a hook that can be used from a state handler to force the machine to retry handling the event in a new state. This is useful when the same event should loop through the machine a second time before the transition is complete, and the optional second value return from a state handler allows that without additional external plumbing.&lt;/p&gt;

&lt;p&gt;Functionally, the implementation of the state machine is complete. It can now cycle through a graph of events, provided that those events are defined as specialized methods. But, in its current state, the API leaves very much to be desired.&lt;/p&gt;

&lt;h3&gt;The Polish&lt;/h3&gt;

&lt;p&gt;As the state machine stands now, to implement one that for all inputs remains in the default &lt;code&gt;:initial&lt;/code&gt; state, one would have to be defined explicitly by specializing the &lt;code&gt;standard-state-machine&lt;/code&gt; event.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;(defmethod standard-state-machine-event
            ((fsm standard-state-machine)
             (state (eql :initial))
             event)
  nil)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The trailing nil makes the return value explicit, due to the length of the specializations. This makes the structure of the dispatch clear, and the nil return value could be traced through the driver above to determine that this machine would do absolutely nothing given any kind of input. Remaining eternally in the &lt;code&gt;:initial&lt;/code&gt; state.&lt;/p&gt;

&lt;p&gt;To make the task of defining states for a given type of state machine we can write a simple macro to write the above form for us. After all, the majority of it is filler.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;(defmacro defstate (machine-type state-name (machine-sym event-sym) &amp;amp;body body)
  `(defmethod standard-state-machine-event
       ((,machine-sym ,machine-type) (state (eql ,state-name)) ,event-sym)
     ,@body))
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Using the macro above we can now declare an identical looping &lt;code&gt;:initial&lt;/code&gt; state for the standard-state-machine as follows:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;(defstate standard-state-machine :initial (fsm event)
  nil)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Which results in identical code to the one we wrote previously. The symbols given in the argument list of the &lt;code&gt;defstate&lt;/code&gt; forms are bound to the machine evaluating the event and the event that is being sent through the machine. The remaining forms will be evaluated just as in any other defun/defmethod with the return value treated as either next state for the machine to enter, nil to stay in the same state, or a multivalue return with one of the previous and a non-nil second value to indicate the event should be fired through the machine a second time before the final state is stored.&lt;/p&gt;

&lt;p&gt;To create subclasses of the standard state machine, we again run into a similar situation as before with boilerplate requirements. Each subclass of &lt;code&gt;standard-state-machine&lt;/code&gt; must not only include the &lt;code&gt;standard-state-machine&lt;/code&gt; class in the list of parents, it must also include &lt;code&gt;funcallable-standard-class&lt;/code&gt; as its metaclass, as in:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;(defclass my-fsm (standard-state-machine)
  ()
  (:metaclass c2mop:standard-funcallable-class))
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This peculiarity could be documented a thousand times in a thousand places, but that will make it no less ugly or difficult to remember. It would be much easier to provide a familiar tasting API to consumers that results in the same code. For example, using a structure like this to generate code equivalent to the above&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;(deffsm my-fsm ()
  ())
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This leaves the consumer free to do whatever their heart desires with CLOS without disturbing the requirements of our function. Such a construct can be stated simply as another tiny macro.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;(defmacro deffsm (name parents slots &amp;amp;rest options)
  `(defclass ,name ,(append (list 'standard-state-machine) parents)
     ,slots
     (:metaclass c2mop:funcallable-standard-class)
     ,@options))
&lt;/code&gt;&lt;/pre&gt;

&lt;h3&gt;The Result&lt;/h3&gt;

&lt;p&gt;If we were to put all of that code together in one place with a bunch of documentation strings for the methods, classes and slots in a slightly more condensed form than this article, it might look something &lt;a href="https://gist.github.com/2698150"&gt;like this&lt;/a&gt;. Which is actually a &lt;a href="https://github.com/sshirokov/hinge/blob/68c73767d962e21a5f128de2309d78aa1da66eea/src/http/fsm.lisp"&gt;minimal extraction&lt;/a&gt; of the state machine that drives the &lt;a href="https://github.com/sshirokov/hinge/blob/68c73767d962e21a5f128de2309d78aa1da66eea/src/http/parser.lisp"&gt;HTTP parser&lt;/a&gt; in &lt;a href="https://github.com/sshirokov/hinge"&gt;Hinge&lt;/a&gt;. If this article gets enough interest, I will extract &lt;code&gt;standard-state-machine&lt;/code&gt; into a QuickLisp compatible package for even easier reuse.&lt;/p&gt;

&lt;h3&gt;The Demo&lt;/h3&gt;

&lt;p&gt;Let&amp;#8217;s construct an FSM for determining if a sequence of characters contains the string &amp;#8220;Hi&amp;#8221;, but before the character &amp;#8220;!&amp;#8221; appears. Once a string contains &amp;#8220;Hi&amp;#8221; it can contain &amp;#8220;!&amp;#8221; characters again.&lt;/p&gt;

&lt;p&gt;We&amp;#8217;ll model this as a machine of three states, with events being single characters of input. The states will be &lt;code&gt;:initial&lt;/code&gt;, &lt;code&gt;:want-i&lt;/code&gt; and &lt;code&gt;:done&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;In the &lt;code&gt;:initial&lt;/code&gt; state, we&amp;#8217;ll accept any input without transitioning except for &amp;#8220;!&amp;#8221; which will cause the machine to transition into an error state so that no more input can pass, and &amp;#8220;H&amp;#8221; will cause the machine to transition to the &lt;code&gt;:want-i&lt;/code&gt; state.&lt;/p&gt;

&lt;p&gt;Any event other than &amp;#8220;i&amp;#8221; in the &lt;code&gt;:want-i&lt;/code&gt; state will transition back to &lt;code&gt;:initial&lt;/code&gt; and the event &amp;#8220;i&amp;#8221; will cause the machine to enter the state &lt;code&gt;:done&lt;/code&gt;, which will be a no-op looping state that allows input to pass through uninspected. The implementation for such a machine would look like &lt;a href="https://gist.github.com/2699337"&gt;this&lt;/a&gt;, assuming we have previously defined the &lt;a href="https://gist.github.com/2698150"&gt;:fsm package&lt;/a&gt;.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;(fsm:deffsm hi-fsm ()
  ())

(fsm:defstate hi-fsm :initial (fsm c)
  (case c
    (#\! :error)
    (#\H :want-i)))

(fsm:defstate hi-fsm :want-i (fsm c)
  (if (char-equal c #\i)
      :done
      (values :initial t)))

(fsm:defstate hi-fsm :done (fsm c)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;We can observe it in action by running it through a couple of strings and measuring the terminal state of the machine:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;(let ((fsm (make-instance 'hi-fsm))
       (input "Oh? Hello there. Hi. How are you!?"))
  (map 'list 
       (lambda (c) 
         (if (eql :error (fsm:state fsm))
             (format t "Skipping: ~S~%" c)
             (funcall fsm c))) 
       input)
  (fsm:state fsm))
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Resulting in &lt;code&gt;:DONE&lt;/code&gt; as the final state of &lt;code&gt;hi-fsm&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;This will iterate the string character by character through the machine we just defined, and unless the machine is in an error state, it will submit each token, then return the state of the machine when it has completed its run.&lt;/p&gt;

&lt;p&gt;If we change the string to one where neither &amp;#8220;Hi&amp;#8221; nor &amp;#8220;!&amp;#8221; appear at all, the machine will remain in &lt;code&gt;:initial&lt;/code&gt; and if &amp;#8220;!&amp;#8221; appears before &amp;#8220;Hi&amp;#8221;, then the machine will leave the loop in an &lt;code&gt;:error&lt;/code&gt; state, and any tokens after the &amp;#8220;!&amp;#8221; won&amp;#8217;t even be sent into the machine. Changing the binding of &lt;code&gt;input&lt;/code&gt; in the  above to &amp;#8220;Go away! Now.&amp;#8221; results in the value of &lt;code&gt;:ERROR&lt;/code&gt; and the printing of the lines&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Skipping: #\ 
Skipping: #\N
Skipping: #\o
Skipping: #\w
Skipping: #\.
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;So there you have it. You now know how to leverage the powers of Common Lisp and MOP to build a pretty cool and useful abstraction for a pretty common algorithm.&lt;/p&gt;</description><link>http://sshrkv.tumblr.com/post/23090889739</link><guid>http://sshrkv.tumblr.com/post/23090889739</guid><pubDate>Tue, 15 May 2012 01:33:00 -0400</pubDate><category>common lisp</category><category>lisp</category><category>programming</category><category>algorithms</category><category>CLOS</category><category>FSM</category><category>MOP</category><category>howto</category></item><item><title>wilwheaton:

Holy Balls, this is hilarious. My friend Joel...</title><description>&lt;img src="http://24.media.tumblr.com/tumblr_m3zhpfXxUE1qz9bu3o1_500.jpg"/&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;&lt;a href="http://wilwheaton.tumblr.com/post/23041137013/holy-balls-this-is-hilarious-my-friend-joel" class="tumblr_blog"&gt;wilwheaton&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Holy Balls, this is hilarious. My friend Joel witnessed a disastrous first date, and twittered the whole thing.&lt;/p&gt;
&lt;p&gt;(via &lt;a href="http://hijinksensue.com/2012/05/10/you-dont-have-to-go-home-but-you-cant-stay-here/starbucks-datewreck-live-tweet/"&gt;HijiNKS ENSUE – A Geek Comic - Starbucks DateWreck Live Tweet&lt;/a&gt;)&lt;/p&gt;&lt;/blockquote&gt;</description><link>http://sshrkv.tumblr.com/post/23042343330</link><guid>http://sshrkv.tumblr.com/post/23042343330</guid><pubDate>Mon, 14 May 2012 12:21:12 -0400</pubDate></item><item><title>suztacular:

This is horrible and I shouldn’t laugh</title><description>&lt;img src="http://25.media.tumblr.com/tumblr_m2dnqh0zNE1qzbj1vo1_500.jpg"/&gt;&lt;br/&gt; &lt;br/&gt;&lt;img src="http://24.media.tumblr.com/tumblr_m2dnqh0zNE1qzbj1vo2_500.jpg"/&gt;&lt;br/&gt; &lt;br/&gt;&lt;img src="http://25.media.tumblr.com/tumblr_m2dnqh0zNE1qzbj1vo3_500.jpg"/&gt;&lt;br/&gt; &lt;br/&gt;&lt;img src="http://24.media.tumblr.com/tumblr_m2dnqh0zNE1qzbj1vo4_500.jpg"/&gt;&lt;br/&gt; &lt;br/&gt;&lt;img src="http://25.media.tumblr.com/tumblr_m2dnqh0zNE1qzbj1vo5_400.png"/&gt;&lt;br/&gt; &lt;br/&gt;&lt;p&gt;&lt;a href="http://suztacular.tumblr.com/post/22708818225/this-is-horrible-and-i-shouldnt-laugh" class="tumblr_blog"&gt;suztacular&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;This is horrible and I shouldn’t laugh&lt;/p&gt;&lt;/blockquote&gt;</description><link>http://sshrkv.tumblr.com/post/22719716138</link><guid>http://sshrkv.tumblr.com/post/22719716138</guid><pubDate>Wed, 09 May 2012 12:19:19 -0400</pubDate></item><item><title>Hinge -- v0.0.1</title><description>&lt;a href="https://github.com/sshirokov/hinge/tree/v0.0.1"&gt;Hinge -- v0.0.1&lt;/a&gt;: &lt;p&gt;&lt;a href="https://github.com/sshirokov/hinge"&gt;Hinge&lt;/a&gt;, my Node.js inspired API for Common Lisp wrapping &lt;a href="https://github.com/sbryant/cl-ev"&gt;libev&lt;/a&gt; is finally to a state where I feel okay giving it a non-zero version.&lt;/p&gt;

&lt;p&gt;I’ve decided now would be a good milestone because the HTTP server functions, and has a set of &lt;a href="https://github.com/sshirokov/hinge/tree/v0.0.1#quickstart"&gt;exported APIs that let you reply to the requests it generates&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The quick set of terrible benchmarks I performed on the “Hello World!” example show me a requests/second throughput of 1500-2500 depending on the mood of &lt;a href="http://httpd.apache.org/docs/2.0/programs/ab.html"&gt;ab&lt;/a&gt; (and the state of the number of sockets available on localhost). I intend to run it through a more serious (and HTTP/1.1 supporting) tool in the future, but for now ab has convinced me that the decisions I’ve made so far have not been abysmal.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://github.com/sshirokov/hinge/tree/v0.0.1/examples"&gt;examples&lt;/a&gt; directory contains a bunch of example programs, or in the earlier cases, code snippets demonstrating various levels of functionality.&lt;/p&gt;

&lt;p&gt;In the near future, in addition to covering the issues in the &lt;a href="https://github.com/sshirokov/hinge/tree/v0.0.1#readme"&gt;README&lt;/a&gt;, adding additional polish, and any bugs or blatant performance issues that come up I would like at some point to add support for:&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;HTTP Clients&lt;/li&gt;
&lt;li&gt;SSL Sockets and Servers&lt;/li&gt;
&lt;li&gt;SSL HTTP Servers and Clients&lt;/li&gt;
&lt;li&gt;Async wrappers around FS calls&lt;/li&gt;
&lt;li&gt;Websockets (&lt;a href="http://tools.ietf.org/html/rfc6455"&gt;RFC6455&lt;/a&gt;) support&lt;/li&gt;
&lt;li&gt;&lt;a href="http://mongrel2.org/"&gt;Mongrel2&lt;/a&gt; ZeroMQ handler support (through &lt;a href="https://github.com/galdor/m2cl"&gt;m2cl&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href="http://mongrel2.org/"&gt;Mongrel2&lt;/a&gt; ZeroMQ protocol-compatible server&lt;/li&gt;
&lt;li&gt;SPDY Support (Somewhere down the list, maybe)&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Any feedback is welcome however way you want to deliver it to me. This initial version stands to serve as a basic starting point for the concepts I wanted to convey, the take on the core APIs I wanted to offer, and a proof of a series of related concepts and architectural decisions. It may (hopefully) be useful as a stable base for progress, rather than chasing an otherwise potentially unstable head.&lt;/p&gt;</description><link>http://sshrkv.tumblr.com/post/22704481029</link><guid>http://sshrkv.tumblr.com/post/22704481029</guid><pubDate>Wed, 09 May 2012 02:10:16 -0400</pubDate><category>lisp</category><category>common lisp</category><category>programming</category><category>hinge</category><category>open source</category><category>libev</category><category>release</category></item><item><title>ilovecharts:

Jason also gave me the opportunity to stretch the...</title><description>&lt;img src="http://24.media.tumblr.com/tumblr_m3gaqr8LTg1qa0uujo1_500.jpg"/&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;&lt;a href="http://ilovecharts.tumblr.com/post/22326242182/jason-also-gave-me-the-opportunity-to-stretch-the" class="tumblr_blog"&gt;ilovecharts&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;&lt;span&gt;Jason also gave me the opportunity to stretch the idea of the graph &lt;/span&gt;&lt;span&gt;format. The first graph I ever did for him, I think, was a &lt;a href="http://twitpic.com/3mrpvx"&gt;Venn &lt;/a&gt;&lt;/span&gt;&lt;span&gt;&lt;a href="http://twitpic.com/3mrpvx"&gt;diagram&lt;/a&gt; that said “Diagrams” on one side and “Things That Venn Thought &lt;/span&gt;&lt;span&gt;Of” on the other. The middle was blank. About a year later, I went &lt;/span&gt;&lt;span&gt;back to the Venn to try to make sense of the most world-changing of &lt;/span&gt;&lt;span&gt;modern inventions.&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;</description><link>http://sshrkv.tumblr.com/post/22390273077</link><guid>http://sshrkv.tumblr.com/post/22390273077</guid><pubDate>Fri, 04 May 2012 13:50:24 -0400</pubDate></item><item><title>The Definitive Guide, now on Amazon.com</title><description>&lt;a href="http://www.amazon.com/The-Definitive-Guide-To-Everything/dp/1105412679/"&gt;The Definitive Guide, now on Amazon.com&lt;/a&gt;: &lt;p&gt;You’ve never had less excuses to not own this 21st century classic by this up-and-coming, though inexplicably universally respected author.&lt;/p&gt;</description><link>http://sshrkv.tumblr.com/post/21802931430</link><guid>http://sshrkv.tumblr.com/post/21802931430</guid><pubDate>Wed, 25 Apr 2012 17:25:05 -0400</pubDate><category>book</category><category>ad</category><category>writing</category><category>essential reading</category><category>buy my book</category></item><item><title>GitHub and CI Project Workflow Guide</title><description>&lt;p&gt;This is an overview of how I believe a real software project lifecycle can and should be managed when the tools at your disposal include a &lt;a href="http://github.com"&gt;GitHub&lt;/a&gt; repository and a CI server. The explanation favors &lt;a href="http://jenkins-ci.org/"&gt;Jenkins&lt;/a&gt; but shouldn&amp;#8217;t be exclusive to it.&lt;/p&gt;

&lt;p&gt;It was originally written for work to finally get down in writing my opinions on project code, build and release management for the project I&amp;#8217;ve suddenly started leading. I&amp;#8217;m sharing it here because I believe these guidelines to be more generally applicable to any project that actually makes releases and has more than a single team member.&lt;/p&gt;

&lt;!-- more --&gt;

&lt;p&gt;In an effort to reduce the number of pain and contention points during development as well as being able to maintain a high velocity without reducing the ability to experiment the following process should be applied to development of a given project. This applies for any developer providing code to the project: internal, external, senior or junior.&lt;/p&gt;

&lt;p&gt;The process is always up for discussion and is not a dictated commandment, but a description of what seems to be a good idea over time. If in the process of applying the process something becomes clearly a bad idea we should try to figure out why and how to prevent it rather than pushing harder on enforcing process. Don&amp;#8217;t be that guy, or that other guy and we&amp;#8217;ll be ok.&lt;/p&gt;

&lt;h1&gt;Overview&lt;/h1&gt;

&lt;p&gt;The following assumptions should hold true at all times for the state of the repository and supporting tools.&lt;/p&gt;

&lt;h3&gt;Production code is always a &lt;code&gt;git-tag&lt;/code&gt;&amp;#8216;ed promoted Jenkins build&lt;/h3&gt;

&lt;p&gt;Any code running in the production environment must have arrived there from a successful build from Jenkins that has been promoted to production using the &lt;a href="https://wiki.jenkins-ci.org/display/JENKINS/Promoted+Builds+Plugin"&gt;Promoted Builds&lt;/a&gt; Jenkins plugin. Evidence for exception to this principle should be of similar quality as that one would expect for a serial murder defense.&lt;/p&gt;

&lt;h3&gt;&lt;code&gt;origin/master&lt;/code&gt; is always in good shape&lt;/h3&gt;

&lt;p&gt;The upstream master branch should reflect the latest, well-tested, peer-reviewed state of the repository. It doesn&amp;#8217;t have to always reflect the tree in production, but anything in the master branch should certainly be destined there. The features should be well tested and serve as a reliable starting point for new work.&lt;/p&gt;

&lt;p&gt;Any merge that causes master to fail the test suite should be reverted immediately to the last passing state and work to resolve the problem should happen elsewhere.&lt;/p&gt;

&lt;h3&gt;Every line of code is peer reviewed&lt;/h3&gt;

&lt;p&gt;Nothing should ever get merged into a mainline branch of the repo until at &lt;strong&gt;least&lt;/strong&gt; two people have seen the code: The original author and a team member.&lt;/p&gt;

&lt;p&gt;Any code that wants to be included in the mainline of the project should be introduced to the project by the author as a pull request. It doesn&amp;#8217;t matter if the request comes from a branch within the repository or a fork of the same as long as the branch is rebased on the current branch the request targets. It should be the responsibility of the author of the branch to keep the branch rebased if its integration target moves during development. The final resulting merge should appear as forced merge commit on an otherwise fast-forward merge.&lt;/p&gt;

&lt;p&gt;Pull requests should &lt;strong&gt;never&lt;/strong&gt; be merged by the same person that authored them, and should always be done with the press of the green merge button on GitHub. If no one is available for review and :+1: &lt;strong&gt;please chase someone down rather than bending this rule&lt;/strong&gt;. This one practice pays massive dividends.&lt;/p&gt;

&lt;h3&gt;Every pull request passes the test suite&lt;/h3&gt;

&lt;p&gt;Before any pull request to the project can be merged a comment should be added to the pull request with a link to the latest Jenkins build of the branch under review. Those merging the request should actively seek out such a link, even if one is known to exist and refuse to merge requests that omit it until one is available and present in the conversation thread.&lt;/p&gt;

&lt;p&gt;This practice forces the author to assert through an unfeeling machine that the code presented for review and inclusion passes not only the full test suite of the application, but also the tests it included as part of development. The presence of this step also tends to eliminate seemingly simple changes with unforeseen consequences.&lt;/p&gt;

&lt;p&gt;The convention the author wishes to introduce for including such comments in a pull request is:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;:sparkles: &lt;a href="http://jenkins.your.host.com/job/project/170/"&gt;http://jenkins.your.host.com/job/project/170/&lt;/a&gt; :sparkles:&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Which renders using &lt;a href="http://www.emoji-cheat-sheet.com/"&gt;Emoji&lt;/a&gt; as a link to the build between two shiny sparkling thingies, which pretty much makes everyone happy. This also allows the shorthand conversational notation of &amp;#8220;Sparkles&amp;#8221; or &amp;#8220;Sparkles build&amp;#8221; for builds that pass the test suite, making everyone feel silly about themselves.&lt;/p&gt;

&lt;h3&gt;Everything that was ever a conversation is documented&lt;/h3&gt;

&lt;p&gt;If for any reason you need to offer an explanation, a walk through or a conversation about a topic relating to the development, deployment, operation or maintenance of the project you should instead of offering it directly take the time to write it down as a wiki page and link that instead.&lt;/p&gt;

&lt;p&gt;This not only makes sure that the things we explain get written down for later, they can also serve as roadmaps or design documents for things still in development or earlier.&lt;/p&gt;

&lt;p&gt;Since the internet is big and space is largely free documentation should not be reserved for special occasions. It should be written for design discussions, external and internal APIs, proposals, suggestions or even tangentially related ramblings. If it seems relevant, it should be linked together into groups of pages for easier navigation, like some sort of manual.&lt;/p&gt;

&lt;h3&gt;No new features without tests&lt;/h3&gt;

&lt;p&gt;If you write something that wasn&amp;#8217;t there before, no one will believe you until you have tests proving that it works. When used in concert with the other guidelines this should also make sure that your feature works and does so well by the time it&amp;#8217;s integrated.&lt;/p&gt;

&lt;p&gt;Failure to do this should be easy to notice in peer review. If the feature is not only new, but also interesting it should also come with documentation.&lt;/p&gt;

&lt;h1&gt;On pull requests&lt;/h1&gt;

&lt;p&gt;Pull requests are the starting point of conversations about a set of changes. They are not demands, edicts, sticky notes or contracts. As such they can and should be opened whenever a conversation about a set of changes needs to take place. That is to say, they should not be a tool reserved for finished code waiting integration, they serve as an excellent platform to get feedback on code in progress or in question and should be used liberally.&lt;/p&gt;

&lt;p&gt;Given that definition, the opening of a pull request should be given the same attention as a potential conversation with an audience. Don&amp;#8217;t just accept the default copy inserted into the request based on your &lt;code&gt;HEAD&lt;/code&gt;. Give the pull request a title that describes the code it carries and use the description field to explain the intent and approach of the changeset as well as any tradeoffs that may not be evident. Try to make the reviewers job easier rather than expecting them to divine details and direction of the change from the diff. It&amp;#8217;ll save everyone time and sanity.&lt;/p&gt;

&lt;h1&gt;On Hotfixes&lt;/h1&gt;

&lt;p&gt;By the nature of the event, a Hotfix is something that is both urgent and completely unplanned so suggestion of a concrete process for dealing with them is quite ambitious and one won&amp;#8217;t be attempted. Instead, these are some suggestions for how to find some generally relevant information and a best-case path for making an urgent code change, deploying it, and still managing to review and safely integrate it back into the codebase without generating a great deal of extra state, disruption and contention.&lt;/p&gt;

&lt;p&gt;Determine which build is running in the affected environment by seeking the last promoted build in the CI environment. This should be linked with a specific build and an associated git commit. This would be a good place to branch from in the repository to implement the change with minimal impact.&lt;/p&gt;

&lt;p&gt;You can do this by executing the following in the repository root.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;$ git branch hotfix-description $COMMIT_SHA_FROM_CI_BUILD&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;The changes can then be made on the branch &lt;code&gt;hotfix-description&lt;/code&gt; and pushed upstream as usual, triggering a CI build that can then be promoted to the required environment and deployed. If favorable, the same build can endure multiple, sequential promotions to be deployed first for internal testing in lower-risk sandbox or staging environments.&lt;/p&gt;

&lt;p&gt;When the build carrying the hotfix is promoted and deployed to the desired environment and is tested to be a satisfactory solution to the hotfix condition, reintegration work can take place at a more relaxed pace without any incurred interruption to any other ongoing development work.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;hotfix-description&lt;/code&gt; branch can either be directly rebased on an upstream branch such as &lt;code&gt;origin/master&lt;/code&gt; and replaced, left as-is, or copied to another upstream head. The resulting branch can then be submitted as a pull request for inclusion in the main line of code and a proper release can be made in the future, replacing the promoted hotfix build from earlier, but including the changes with proper review.&lt;/p&gt;

&lt;p&gt;At least, as they say, that&amp;#8217;s what is &lt;em&gt;supposed to&lt;/em&gt; happen. In these cases, more so than most, defer to common sense, good judgement and experience.&lt;/p&gt;

&lt;h1&gt;TL;DR Checklist&lt;/h1&gt;

&lt;ul&gt;&lt;li&gt;&lt;code&gt;origin/master&lt;/code&gt; &lt;strong&gt;never gets direct commits&lt;/strong&gt;. Ever. By anyone.&lt;/li&gt;
&lt;li&gt;We are not using git-flow. We will not be using git-flow. No one should use git-flow.&lt;/li&gt;
&lt;li&gt;New work branches (usually) start at &lt;code&gt;origin/master&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Your branch has a meaningful, &lt;strong&gt;descriptive&lt;/strong&gt; name (As in &lt;em&gt;update-redis-library&lt;/em&gt; or &lt;em&gt;fix-zmq-deadlock&lt;/em&gt;, &lt;strong&gt;not&lt;/strong&gt; &lt;em&gt;x-work&lt;/em&gt;, &lt;strong&gt;not freaking ever&lt;/strong&gt; &lt;em&gt;develop&lt;/em&gt;, &lt;strong&gt;not&lt;/strong&gt; &lt;em&gt;yourname-somework&lt;/em&gt;)&lt;/li&gt;
&lt;li&gt;Your work stays in your branch&lt;/li&gt;
&lt;li&gt;Your branch stays rebased to the head you started from&lt;/li&gt;
&lt;li&gt;Pull request when you&amp;#8217;re ready for review&lt;/li&gt;
&lt;li&gt;:sparkles: comment on your pull request when tests pass&lt;/li&gt;
&lt;li&gt;Someone else will merge it when they&amp;#8217;re happy with it, find that someone if you&amp;#8217;re not popular enough or its urgent&lt;/li&gt;
&lt;li&gt;You break it, you fix it (tests, rebase, etc) so try to keep sharp things away from people&lt;/li&gt;
&lt;/ul&gt;</description><link>http://sshrkv.tumblr.com/post/21242391999</link><guid>http://sshrkv.tumblr.com/post/21242391999</guid><pubDate>Mon, 16 Apr 2012 21:06:06 -0400</pubDate><category>git</category><category>github</category><category>jenkins</category><category>ci</category><category>development</category><category>work</category><category>guide</category><category>opinion</category></item><item><title>Photo</title><description>&lt;img src="http://25.media.tumblr.com/tumblr_lts4rpAvoj1r5y7szo1_250.gif"/&gt;&lt;br/&gt; &lt;br/&gt;&lt;img src="http://25.media.tumblr.com/tumblr_lts4rpAvoj1r5y7szo2_250.gif"/&gt;&lt;br/&gt; &lt;br/&gt;&lt;img src="http://25.media.tumblr.com/tumblr_lts4rpAvoj1r5y7szo3_250.gif"/&gt;&lt;br/&gt; &lt;br/&gt;&lt;img src="http://24.media.tumblr.com/tumblr_lts4rpAvoj1r5y7szo4_250.gif"/&gt;&lt;br/&gt; &lt;br/&gt;</description><link>http://sshrkv.tumblr.com/post/19836722394</link><guid>http://sshrkv.tumblr.com/post/19836722394</guid><pubDate>Sat, 24 Mar 2012 11:36:43 -0400</pubDate></item><item><title>Summary of Antiques Roadshow: UK</title><description>&lt;p&gt;And so it spoken hereinwithsuchthat in which there was such that as well the process herein follows is described within which such as much with respect to the following as is described thereafter henceforth ignoring here forth the following colon and subsequent newline, in so much that one may or may not be plural and the other must remain singular:&lt;/p&gt;

&lt;p&gt;First off, this appears to be some sort of retarded ass holiday special. Too many of those if you ask me. I&amp;#8217;m watching the intro, which is pretty much a summary of an old car driving past people with other old crap with a painting stuck into the too-small-for-it back seat. It transitions to black and white footage of a child, or now, children unwrapping christmas presents with narration. This serves as a setup to the annoying narrator in a horrible sweater showing off one of her pointless bears of a useless childhood to try to convince you that other people&amp;#8217;s garbage can, indeed, be somehow overpriced treasure.&lt;/p&gt;

&lt;p&gt;They&amp;#8217;re not even pausing on items, just wandering around and showing shiny things that people previously owned. If I may opine, the entire point of the show would appear the juxtaposition of old junk with sudden wealth, and this show so far leaves out the entire second part of this tried and true formula.&lt;/p&gt;

&lt;p&gt;Oh, back to the wood paneled room with a tree and an annoying narrator. Clip shows mean you care, set up the footage!&lt;/p&gt;

&lt;p&gt;Maybe, just maybe this time they will actually walk through an entire presentation for an item rather than panning around and cutting people off. Nope. They absolutely inject the narrator into every single discussion and splicing content together to create a narrative that can&amp;#8217;t even be slightly cared about. Even as someone who would otherwise be attracted to the antiques presented, this show serves more to, if you forgive the language, jerk itself off for no reason other than the ability to do so.&lt;/p&gt;

&lt;p&gt;Oh! Great scott! A few thousand pounds, the first price named for arbitrary jewelry. It&amp;#8217;s some long-lost jewelry, apparently. This is important to the old dude they earlier presented as import. The first time they&amp;#8217;ve actually stopped on an item, and declared it worth in the five digit range. Obviously something of that nature warrants an interview with anyone and everyone involved. You want to be on what the other side of the couch holds? That&amp;#8217;s right, a freaking christmas tree opposite the interviewer in the annoying sweater.&lt;/p&gt;

&lt;p&gt;Onwards to the auction of stupid jewelry. It&amp;#8217;s Lot 150, if you&amp;#8217;re ever curious. The auction is supposed to show that the money that was quoted by the professional was far too small. It will sell for thirty-one thousand British. Not bad for an old chunk of metal. The old lady that owned is pretty pleased, and they much comment on the fact. Though, the setting moved from the large wood-panneled room into something resembling more of a library setting. The number of trees that are scattered throughout that house must generate a mess.&lt;/p&gt;

&lt;p&gt;So the expert, during the interview I&amp;#8217;ve been complaining through, is explaining how terribly wrong he was. Apparently the ten grand he pulled out initially was the largest amount he was able to come up with at the time, but his explanation for the 31K figure was &amp;#8220;well, duh, obviously, it&amp;#8217;s rare, shut up.&amp;#8221;&lt;/p&gt;

&lt;p&gt;Oh my fucking god. They are now making terrible puns around things. I&amp;#8217;m actually suffering as I watch this, but I must soldier on.&lt;/p&gt;

&lt;p&gt;The clip takes to a silver bull. They&amp;#8217;re some sort of silver cups in the shape of a bull&amp;#8217;s head. I have to admit, I don&amp;#8217;t hate it. And if I could use them rather than just have them sit around for no reason, I would own them. 1869 was the year on it. And there are 12 in a set. Bulls are the rarest, he claims. Interesting right?&lt;/p&gt;

&lt;p&gt;Oh, burn. The lady with the cups doesn&amp;#8217;t even own them. So when they become incredibly valuable, she&amp;#8217;s screwed. Let&amp;#8217;s wait for the price. 150K, british, for the lot. Stupid bitch gets nothing and now has to know that she has to drag that much value around town for no reason. Way to go, guys, hope you can buy insurance on the go.&lt;/p&gt;

&lt;p&gt;Oh come the fuck on, this is dumber than hell. It&amp;#8217;s a train set. I don&amp;#8217;t want to hear old people complain about toys and how awesome it is that it&amp;#8217;s still around. They made it out of Tin, brass, and a few wood accents. It&amp;#8217;s a freaking toy and they&amp;#8217;re going to be talking about how awesome it was that it was ever made.&lt;/p&gt;

&lt;p&gt;Now it&amp;#8217;s German. Good job guys, you found a German toy trains. Even their children are trained to run trains from birth. Apperantly no one even wants it, and the only reason it has value is because only stupid people want them and they are rich. 50K for insurance. Good one. It&amp;#8217;s a fucking train.&lt;/p&gt;

&lt;p&gt;And another jump! A field with a castle in the background, and they&amp;#8217;re staring down a rolex watch. No one cares about it. I care so little, I&amp;#8217;m going to take this time to just go ahead and pee for no freaking reason. And you get to know nothing about the rolex. Consider, though, that if you&amp;#8217;ve even read this far down you have serious problems. This is pretty idle to produce, and I assure you that I&amp;#8217;ve only read it with a buffer of around three words around the cursor. The mere act of consuming this content, in full or even in significant part can be very well considered indicative of some sort of mental failure.&lt;/p&gt;

&lt;p&gt;I also took the time to eat pizza. There were some watches, then a 10K painting, and we&amp;#8217;re back to fucking toys. This show is so utterly useless if their idea of a good antique time is showing off a bunch of useless fucking toys. This is is an ugly ass wooden train and it looks like a fucking sex toy. SO fucking retarded.
Let&amp;#8217;s see what two blocks of wood coming together, and it&amp;#8217;s either 20 or 5K, because no one has any idea and telling someone that they have crap is apparently fucking useless.&lt;/p&gt;

&lt;p&gt;Are you kidding me? They&amp;#8217;re talking with the irritating narrator in the christmas chamber showing off fucking christmas cards from the olden days. I can&amp;#8217;t believe people actually give even a third of a shit about things like that. That was obviously a lead-in to an &amp;#8220;offsite&amp;#8221; as I will term it to look at more stupid fucking christmas cards. The first magic of innovation was a pop-up card of a church with a dude in a window. Truly inspirational.&lt;/p&gt;

&lt;p&gt;This christmas thing is being ground into the ground. And now it&amp;#8217;s basically the American&amp;#8217;s fault for making christmas red and stupid shiny. They have this tiny little icon-looking picture of santa creeping on a kid. It&amp;#8217;s owned by an ugly ass lady that&amp;#8217;s fat, and it&amp;#8217;s worth another ten grand.&lt;/p&gt;

&lt;p&gt;There&amp;#8217;s going to be another hour or so of this show, so I hope that you&amp;#8217;re super pumped about the remainder. I might start considering easing off the livebloging of the entire program so that you can recreate a proper image in your mind&amp;#8217;s eye and instead focus on just mentioning things on occasion and padding the remainder with boundless bitching. I can provide complaints in spades, and I don&amp;#8217;t think I even need subject matter. I could just endlessly bitch about one thing then bitch about it in circles based on the earlier bitching.&lt;/p&gt;

&lt;p&gt;BOXES! It&amp;#8217;s an old man with a bunch of fucking gold boxes, the first one being worth at least five fucking grand. So he has a pile of fucking boxes worth thousands a fucking pounds a pop. Russian cigarette case? Twenty fucking grand. BRITISH. The total, apparently, is fifty to sixty. That&amp;#8217;s pretty fucking nice, and he sold some of them and made 55K. I would keep some, I figure if they&amp;#8217;re that old and still in one piece, they must work pretty well.&lt;/p&gt;

&lt;p&gt;Now we&amp;#8217;re on to the obligatory vase. It&amp;#8217;s pretty pointless, and I guess kinda big. The dude claims it&amp;#8217;s 200 years old, the appraiser is going to be like &amp;#8220;no, older&amp;#8221; I guess. We&amp;#8217;ll see what he says about it. I&amp;#8217;m not even sure if I&amp;#8217;m going to pay enough attention for it to even matter. He said a year, but that sounds like math.&lt;/p&gt;

&lt;p&gt;Oh, a thousand. Maybe the math even wasn&amp;#8217;t hard. It was just garbage. The price tag!? 10-15. It seems they just like that range. &amp;#8220;Oh, that&amp;#8217;s old, how about 10K, get the fuck out of here let&amp;#8217;s look at some fucking christmas cards!&amp;#8221; They&amp;#8217;re going to take it to auction.&lt;/p&gt;

&lt;p&gt;More boxes, with some mail in it from 1903. A cup with some crap. They&amp;#8217;re cups that are royal or something. Mass produced garbage, I guess. Hopefully it&amp;#8217;s cheap, yes, it&amp;#8217;s cheap according to them, but the wrapping was worth about four hundred.&lt;/p&gt;

&lt;p&gt;Guitar. Potentially played by Bob Marley. This is starting to sound more and more like ebay. And now we&amp;#8217;re pricing on speculation. That&amp;#8217;s even better. We&amp;#8217;re quickly approaching zero content for the time consumption.&lt;/p&gt;

&lt;p&gt;What do you think is next? More boxes? Yep. Boxes. They&amp;#8217;re going to probably boxes that are made of money. BUT. They are probably fake. Are they fake? Yes, they&amp;#8217;re fake!? Let&amp;#8217;s find out. He paid many many money for them, thousands, apparently, but they&amp;#8217;re fake. Suck it bro! Oh, damn, he got a refund. That&amp;#8217;s pretty unfortunate when I was hoping to see someone actually learning a lesson. Let&amp;#8217;s follow this up with a speech from the dumbs narrator.&lt;/p&gt;

&lt;p&gt;I&amp;#8217;m going to skip this section, because it&amp;#8217;s far more than boring and I think the time for the next few minutes might be better spent doing anything at all, maybe even just drooling.&lt;/p&gt;

&lt;p&gt;I&amp;#8217;m going to cut this short. It&amp;#8217;s an antique show, and a christmas special at that. It&amp;#8217;s dumb, and no one really cares about it. I&amp;#8217;ve chosen to poop. Good day.&lt;/p&gt;</description><link>http://sshrkv.tumblr.com/post/19629160428</link><guid>http://sshrkv.tumblr.com/post/19629160428</guid><pubDate>Tue, 20 Mar 2012 12:07:08 -0400</pubDate><category>bullshit</category><category>drivel</category><category>garbage</category><category>trash</category></item><item><title>roxa:

dannyundersee:

flamebelladonna:

thegoodshiprieru:

marie...</title><description>&lt;img src="http://25.media.tumblr.com/tumblr_lzuav6ED2n1r6aw1so1_500.jpg"/&gt;&lt;br/&gt; &lt;br/&gt;&lt;img src="http://25.media.tumblr.com/tumblr_lzuav6ED2n1r6aw1so2_500.jpg"/&gt;&lt;br/&gt; &lt;br/&gt;&lt;img src="http://25.media.tumblr.com/tumblr_lzuav6ED2n1r6aw1so3_500.jpg"/&gt;&lt;br/&gt; &lt;br/&gt;&lt;img src="http://25.media.tumblr.com/tumblr_lzuav6ED2n1r6aw1so4_400.jpg"/&gt;&lt;br/&gt; &lt;br/&gt;&lt;p&gt;&lt;a href="http://roxa.tumblr.com/post/18650152095/dannyundersee-flamebelladonna" class="tumblr_blog"&gt;roxa&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;&lt;a class="tumblr_blog" href="http://dannyundersee.tumblr.com/post/18425359861/flamebelladonna-thegoodshiprieru"&gt;dannyundersee&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a class="tumblr_blog" href="http://flamebelladonna.tumblr.com/post/18395863366/thegoodshiprieru-marielikestodraw"&gt;flamebelladonna&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a class="tumblr_blog" href="http://thegoodshiprieru.tumblr.com/post/18393725659/marielikestodraw-beautifultimepieces-these"&gt;thegoodshiprieru&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a class="tumblr_blog" href="http://marielikestodraw.tumblr.com/post/18391290651/beautifultimepieces-these-are-clocks-that-knit"&gt;marielikestodraw&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a class="tumblr_blog" href="http://beautifultimepieces.tumblr.com/post/18167597060/these-are-clocks-that-knit-clocks-that-knit-they"&gt;beautifultimepieces&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;These are clocks that knit. &lt;em&gt;Clocks that knit. &lt;/em&gt;They knit 24 hours a day for 365 days and every year you get a new scarf to mark the passing of time.&lt;/p&gt;
&lt;p&gt;But seriously: &lt;em&gt;Clocks that knit.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_m02ixg0SUY1qgok2l.gif"/&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_m02l0esK9v1qh0dxn.jpg"/&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;You have no idea what I would do for this.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;what&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;What a fucking cool idea! Holy shit.&lt;/p&gt;&lt;/blockquote&gt;</description><link>http://sshrkv.tumblr.com/post/18667462029</link><guid>http://sshrkv.tumblr.com/post/18667462029</guid><pubDate>Sat, 03 Mar 2012 11:40:05 -0500</pubDate></item><item><title>thisismyinfinityplusone:


Dude that first one.  I lol’d...</title><description>&lt;img src="http://25.media.tumblr.com/tumblr_lz2kmxDZAy1qde2f5o1_500.jpg"/&gt;&lt;br/&gt; &lt;br/&gt;&lt;img src="http://25.media.tumblr.com/tumblr_lz2kmxDZAy1qde2f5o2_500.jpg"/&gt;&lt;br/&gt; &lt;br/&gt;&lt;img src="http://25.media.tumblr.com/tumblr_lz2kmxDZAy1qde2f5o3_500.jpg"/&gt;&lt;br/&gt; &lt;br/&gt;&lt;img src="http://24.media.tumblr.com/tumblr_lz2kmxDZAy1qde2f5o4_500.jpg"/&gt;&lt;br/&gt; &lt;br/&gt;&lt;img src="http://24.media.tumblr.com/tumblr_lz2kmxDZAy1qde2f5o5_500.jpg"/&gt;&lt;br/&gt; &lt;br/&gt;&lt;img src="http://25.media.tumblr.com/tumblr_lz2kmxDZAy1qde2f5o6_500.jpg"/&gt;&lt;br/&gt; &lt;br/&gt;&lt;img src="http://25.media.tumblr.com/tumblr_lz2kmxDZAy1qde2f5o7_500.jpg"/&gt;&lt;br/&gt; &lt;br/&gt;&lt;img src="http://25.media.tumblr.com/tumblr_lz2kmxDZAy1qde2f5o8_500.jpg"/&gt;&lt;br/&gt; &lt;br/&gt;&lt;img src="http://25.media.tumblr.com/tumblr_lz2kmxDZAy1qde2f5o9_500.jpg"/&gt;&lt;br/&gt; &lt;br/&gt;&lt;img src="http://24.media.tumblr.com/tumblr_lz2kmxDZAy1qde2f5o10_500.jpg"/&gt;&lt;br/&gt; &lt;br/&gt;&lt;p&gt;&lt;a class="tumblr_blog" href="http://thisismyinfinityplusone.tumblr.com/post/18198682479/dude-that-first-one-i-lold-forever"&gt;thisismyinfinityplusone&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Dude that first one.  I lol’d forever.&lt;/p&gt;
&lt;/blockquote&gt;</description><link>http://sshrkv.tumblr.com/post/18232757013</link><guid>http://sshrkv.tumblr.com/post/18232757013</guid><pubDate>Fri, 24 Feb 2012 23:46:44 -0500</pubDate></item><item><title>My, and I assume other 0-day orders of my book appear to have...</title><description>&lt;img src="http://24.media.tumblr.com/tumblr_lz74d3StL41r1c5mjo1_500.jpg"/&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;My, and I assume other 0-day orders of &lt;a href="http://bit.ly/the-definitive-guide"&gt;my book&lt;/a&gt; appear to have arrived.&lt;/p&gt;

&lt;p&gt;Where the hell is yours?&lt;/p&gt;</description><link>http://sshrkv.tumblr.com/post/17385906302</link><guid>http://sshrkv.tumblr.com/post/17385906302</guid><pubDate>Fri, 10 Feb 2012 16:15:03 -0500</pubDate><category>buy</category><category>book</category></item></channel></rss>
