<?xml version='1.0' encoding='utf-8' ?>
<feed xml:lang='en-US' xmlns='http://www.w3.org/2005/Atom'>
  <id>http://www.simulacre.org/</id>
  <title>Simulacre.org</title>
  <updated>2012-02-12T00:00:00Z</updated>
  <link href='http://www.simulacre.org/feed/index.xml' rel='self' type='application/atom+xml' />
  <link href='http://www.simulacre.org/' rel='alternate' type='text/html' />
  <entry>
    <id>http://www.simulacre.org/unblocking-readline-in-eventmachine/</id>
    <title>Unblocking the Keyboard and Readline in EventMachine</title>
    <updated>2012-02-12T00:00:00Z</updated>
    <link href='http://www.simulacre.org/unblocking-readline-in-eventmachine/' rel='alternate' type='text/html' />
    <summary>
      Reading from the keyboard without blocking under EventMachine is pretty
            simple. Just use the builtin EM.open_keyboard and give it a connection
            handler. 
            
            The Code Snippits Wiki for EventMachine gives an easy to follow example:
            
            require 'eventmachine'
            
            module MyKeyboardHandler
              def receive_data keystrokes
                puts "I received the following data from the keyboard: #{keystrokes}"
              end
            end
            
            EM.run {
               EM.open_keyboard(MyKeyboardHandler)
            }
            
            1
            2
            3
            4
            5
            6
            7
            8
            9
            10
            11
            
            require 'eventmachine'
            
            module MyKeyboardHandler
              def receive_data keystrokes
                puts "I received the following data from the keyboard: #{keystrokes}"
              end
            end
            
            EM.run {
               EM.open_keyboard(MyKeyboardHandler)
            }
            
            
            
            If we want niceties like tab-completion, history, emacs edit mode, etc.,. you're out of luck. Normally you'd just use......
    </summary>
    <content type='html'>
      &lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD HTML 4.0 Transitional//EN&quot; &quot;http://www.w3.org/TR/REC-html40/loose.dtd&quot;&gt;
            &lt;html&gt;&lt;body&gt;
            &lt;p&gt;Reading from the keyboard without blocking under EventMachine is pretty
            simple. Just use the builtin &lt;em&gt;EM.open_keyboard&lt;/em&gt; and give it a connection
            handler. &lt;/p&gt;
            
            &lt;p&gt;The &lt;a href=&quot;https://github.com/eventmachine/eventmachine/wiki/Code-Snippets&quot;&gt;Code Snippits Wiki&lt;/a&gt; for EventMachine gives an easy to follow example:&lt;/p&gt;
            
            &lt;noscript&gt;require 'eventmachine'
            
            module MyKeyboardHandler
              def receive_data keystrokes
                puts &quot;I received the following data from the keyboard: #{keystrokes}&quot;
              end
            end
            
            EM.run {
               EM.open_keyboard(MyKeyboardHandler)
            }
            &lt;/noscript&gt;
            &lt;div class=&quot;highlight&quot;&gt;&lt;table&gt;&lt;tr&gt;
            &lt;td class=&quot;gutter&quot;&gt;&lt;pre class=&quot;line-numbers&quot;&gt;&lt;span class=&quot;line-number&quot;&gt;1&lt;/span&gt;
            &lt;span class=&quot;line-number&quot;&gt;2&lt;/span&gt;
            &lt;span class=&quot;line-number&quot;&gt;3&lt;/span&gt;
            &lt;span class=&quot;line-number&quot;&gt;4&lt;/span&gt;
            &lt;span class=&quot;line-number&quot;&gt;5&lt;/span&gt;
            &lt;span class=&quot;line-number&quot;&gt;6&lt;/span&gt;
            &lt;span class=&quot;line-number&quot;&gt;7&lt;/span&gt;
            &lt;span class=&quot;line-number&quot;&gt;8&lt;/span&gt;
            &lt;span class=&quot;line-number&quot;&gt;9&lt;/span&gt;
            &lt;span class=&quot;line-number&quot;&gt;10&lt;/span&gt;
            &lt;span class=&quot;line-number&quot;&gt;11&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
            &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb&quot;&gt;require&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'eventmachine'&lt;/span&gt;
            &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;
            &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;k&quot;&gt;module&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;MyKeyboardHandler&lt;/span&gt;
            &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;  &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;receive_data&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;keystrokes&lt;/span&gt;
            &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;    &lt;span class=&quot;nb&quot;&gt;puts&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;I received the following data from the keyboard: &lt;/span&gt;&lt;span class=&quot;si&quot;&gt;#{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;keystrokes&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;
            &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;  &lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
            &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
            &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;
            &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;no&quot;&gt;EM&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;run&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
            &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;   &lt;span class=&quot;no&quot;&gt;EM&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;open_keyboard&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;MyKeyboardHandler&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
            &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
            &lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
            &lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;
            
            &lt;p&gt;If we want niceties like tab-completion, history, emacs edit mode, etc.,. you're out of luck. Normally you'd just use &lt;a href=&quot;http://bogojoker.com/readline/&quot;&gt;readline&lt;/a&gt;, but it will block. Maybe that's a good thing. Maybe you want the world to stop when asking the human questions. In some situations you don't want to stop the reactor loop though.&lt;/p&gt;
            
            &lt;p&gt;The best solution I've come up with is to replace $stdin with an EventMachine keyboard connection and use &lt;a href=&quot;https://github.com/luislavena/rb-readline&quot;&gt;RbReadline&lt;/a&gt;.&lt;/p&gt;
            
            &lt;div&gt;
            &lt;script src=&quot;https://gist.github.com/1806481.js?file=nb-keyboard.rb&quot;&gt;&lt;/script&gt;&lt;noscript&gt;&lt;pre&gt;&lt;code class=&quot;gist&quot;&gt;# doesn't work with Stdlib Readline
            require 'rb-readline'
            
            require 'fiber'
            require 'eventmachine'
            
            module NbKeyboard
              def post_init
                @ostdin = $stdin
                $stdin  = self
                @buffer = &quot;&quot;
              end
            
              def receive_data(d)
                @buffer &lt;&lt; d
                @waiting &amp;&amp; @waiting[:cnt] &lt;= @buffer.length &amp;&amp; @waiting[:fiber].resume
              end
            
              def read(cnt)
                if @buffer.length &lt; cnt
                  @waiting = {:cnt =&gt; cnt, :fiber =&gt; Fiber.current}
                  Fiber.yield
                end
                data, @buffer = @buffer[0...cnt], @buffer[cnt..-1]
                data
              end
            
              def unbind
                $stdin = @ostdin
              end
            
              def method_missing(meth, *args, &amp;blk)
                @ostdin.send(meth, *args, &amp;blk)
              end
            end&lt;/code&gt;&lt;/pre&gt;&lt;/noscript&gt;
            &lt;/div&gt;
            
            &lt;p&gt;RbReadline defaults to using $stdin for input, so when the NbKeyboard
            starts it makes $stdin point to itself. When RbReadline calls &lt;em&gt;#read(1)&lt;/em&gt;
            on $stdin, NbKeyboard gives it back one character if it's available.
            Otherwise it pauses the current Fiber until the human types something
            in.&lt;/p&gt;
            
            &lt;p&gt;The Stlib Readline isn't supported because I haven't found a good way to
            get it to read from NbKeyboard rather than STDIN.&lt;/p&gt;
            
            &lt;p&gt;To verify that this works just run the demo:
            &lt;/p&gt;
            &lt;div&gt;
            &lt;script src=&quot;https://gist.github.com/1806481.js?file=demo.rb&quot;&gt;&lt;/script&gt;&lt;noscript&gt;&lt;pre&gt;&lt;code class=&quot;gist&quot;&gt;#!/usr/bin/env ruby -wW1
            require File.expand&lt;em&gt;path(&quot;../nb-keyboard&quot;, _&lt;/em&gt;FILE__)
            
            &lt;p&gt;EM.run {
              spinner = EventMachine::PeriodicTimer.new(0.5) do
                $stderr.print &quot;.&quot;
              end&lt;/p&gt;
            
            &lt;p&gt;Fiber.new {
                EM.open_keyboard(NbKeyboard) do |kb|
                  inp = Readline.readline(&quot;enter something &quot;)
                  $stderr.puts &quot;you entered: #{inp.inspect}&quot;
                  EM::Timer.new(0.75) { EM.stop }
                end
              }.resume
            }&lt;/p&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/noscript&gt;
            &lt;/div&gt;
            
            &lt;noscript&gt;caleb@kiff % ruby demo.rb
            enter something ........ab.cd.ef.g.h.k.li..
            you entered: &quot;abcdefghkli&quot;
            ..
            caleb@kiff % 
            &lt;/noscript&gt;
            &lt;pre&gt;&lt;code&gt;caleb@kiff % ruby demo.rb
            enter something ........ab.cd.ef.g.h.k.li..
            you entered: &quot;abcdefghkli&quot;
            ..
            caleb@kiff % 
            &lt;/code&gt;&lt;/pre&gt;
            
            &lt;h2&gt;STDIN Blocking Note&lt;/h2&gt;
            
            &lt;p&gt;Normally calling STDIN.read_nonblock(1) or STDIN.read(1) will not
            return until the user hits enter. The RbReadline and even standard
            Readline reset the terminal to not wait for the enter key to be pressed.&lt;/p&gt;
            
            &lt;p&gt;If you use EM.open_keyboard without RbReadline attached to it, your
            keyboard handler will not receive data until the user presses enter. You
            can get around that by using the stty program, or the rb-termios gem to
            reconfigure the terminal manually. &lt;/p&gt;
            &lt;/body&gt;&lt;/html&gt;
    </content>
  </entry>
  <entry>
    <id>http://www.simulacre.org/pry-remote-em/</id>
    <title>Pry Remote for EventMachine</title>
    <updated>2012-01-29T00:00:00Z</updated>
    <link href='http://www.simulacre.org/pry-remote-em/' rel='alternate' type='text/html' />
    <summary>
      PryRemoteEm enables you to
              start instances of Pry in a running
              EventMachine program and connect to
              those Pry instances over a network or the Internet. Once connected you
              can interact with the internal state of the program.
              
              It's based off of Mon-Ouie's pry-remote for DRb.
              
              It adds user authentication and SSL support along with tab-completion
              and paging. It's compatble with MRI 1.9, or any other VM with support
              for Fibers and EventMachine.
              
              It's up on Github, so fork
              away.
              
              Installation
              
              gem install pry-remote-em
              
              1
              
              gem install pry-remote-em
              
              
              
              Usage
              
              require 'pry-remote-em/server'
              
              class Foo
                def initialize(x, y)
                  binding.remote_pry_em
                end
              end
              
              EM.run { Foo.new 10, 20 } 
              
              1
              2
              3
              4
              5
              6
              7
              8
              9
              
              require 'pry-remote-em/server'
              
              class Foo
                def initialize(x, y)
                 ......
    </summary>
    <content type='html'>
      &lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD HTML 4.0 Transitional//EN&quot; &quot;http://www.w3.org/TR/REC-html40/loose.dtd&quot;&gt;
              &lt;html&gt;&lt;body&gt;
              &lt;p&gt;&lt;a href=&quot;https://rubygems.org/gems/pry-remote-em&quot;&gt;PryRemoteEm&lt;/a&gt; enables you to
              start instances of Pry in a running
              &lt;a href=&quot;http://rubyeventmachine.com/&quot;&gt;EventMachine&lt;/a&gt; program and connect to
              those Pry instances over a network or the Internet. Once connected you
              can interact with the internal state of the program.&lt;/p&gt;
              
              &lt;p&gt;It's based off of &lt;a href=&quot;https://github.com/Mon-Ouie&quot;&gt;Mon-Ouie's&lt;/a&gt; &lt;a href=&quot;https://github.com/Mon-Ouie/pry-remote&quot;&gt;pry-remote&lt;/a&gt; for DRb.&lt;/p&gt;
              
              &lt;p&gt;It adds user authentication and SSL support along with tab-completion
              and paging. It's compatble with MRI 1.9, or any other VM with support
              for Fibers and EventMachine.&lt;/p&gt;
              
              &lt;p&gt;It's up on &lt;a href=&quot;https://github.com/simulacre/pry-remote-em&quot;&gt;Github&lt;/a&gt;, so fork
              away.&lt;/p&gt;
              
              &lt;h2&gt;Installation&lt;/h2&gt;
              
              &lt;noscript&gt;gem install pry-remote-em
              &lt;/noscript&gt;
              &lt;div class=&quot;highlight&quot;&gt;&lt;table&gt;&lt;tr&gt;
              &lt;td class=&quot;gutter&quot;&gt;&lt;pre class=&quot;line-numbers&quot;&gt;&lt;span class=&quot;line-number&quot;&gt;1&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
              &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;code class=&quot;bash&quot;&gt;&lt;span class=&quot;line&quot;&gt;gem install pry-remote-em
              &lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
              &lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;
              
              &lt;h2&gt;Usage&lt;/h2&gt;
              
              &lt;noscript&gt;require 'pry-remote-em/server'
              
              class Foo
                def initialize(x, y)
                  binding.remote_pry_em
                end
              end
              
              EM.run { Foo.new 10, 20 } 
              &lt;/noscript&gt;
              &lt;div class=&quot;highlight&quot;&gt;&lt;table&gt;&lt;tr&gt;
              &lt;td class=&quot;gutter&quot;&gt;&lt;pre class=&quot;line-numbers&quot;&gt;&lt;span class=&quot;line-number&quot;&gt;1&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;2&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;3&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;4&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;5&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;6&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;7&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;8&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;9&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
              &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb&quot;&gt;require&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'pry-remote-em/server'&lt;/span&gt;
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Foo&lt;/span&gt;
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;  &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;initialize&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;    &lt;span class=&quot;nb&quot;&gt;binding&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;remote_pry_em&lt;/span&gt;
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;  &lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;no&quot;&gt;EM&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;run&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;Foo&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;20&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
              &lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
              &lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;
              
              &lt;p&gt;Running it will print out a message telling you Pry is waiting for a
              program to connect itself to it:&lt;/p&gt;
              
              &lt;noscript&gt;[pry-remote-em] listening for connections on pryem://localhost:6462/
              &lt;/noscript&gt;
              &lt;pre&gt;&lt;code&gt;[pry-remote-em] listening for connections on pryem://localhost:6462/
              &lt;/code&gt;&lt;/pre&gt;
              
              &lt;p&gt;You can then connect to the pry session using &lt;em&gt;pry-remote-em&lt;/em&gt;:&lt;/p&gt;
              
              &lt;noscript&gt;$ pry-remote-em 
              [pry-remote-em] client connected to pryem://127.0.0.1:6462/
              [pry-remote-em] remote is PryRemoteEm 0.4.0 pryem
              [1] pry(#&lt;foo&gt;)&gt; stat 
              
              Method Information:
              --
              Name: initialize
              Owner: Foo
              Visibility: private
              Type: Bound
              Arity: 2
              Method Signature: initialize(x, y)
              Source Location: (irb):5
              
              [2] pry(#&lt;foo&gt;)&gt; self
              =&gt; #
              
              [3] pry(#&lt;foo&gt;)&gt; ls
              locals: _  _dir_  _ex_  _file_  _in_  _out_  _pry_  x  y
              [4] pry(#&lt;foo&gt;)&gt; x
              =&gt; 10
              
              [5] pry(#&lt;foo&gt;)&gt; x = 12
              =&gt; 12
              
              [6] pry(#&lt;foo&gt;)&gt; exit
              [pry-remote-em] session terminated
              
              $ pry-remote-em
              [pry-remote-em] client connected to pryem://127.0.0.1:6462/
              [pry-remote-em] remote is PryRemoteEm 0.4.0 pryem
              [1] pry(#&lt;foo&gt;)&gt; x
              =&gt; 12
              
              [2] pry(#&lt;foo&gt;)&gt; exit
              [pry-remote-em] session terminated
              &lt;/foo&gt;&lt;/foo&gt;&lt;/foo&gt;&lt;/foo&gt;&lt;/foo&gt;&lt;/foo&gt;0x007fef1b22ac10&gt;&lt;/foo&gt;&lt;/foo&gt;
              &lt;/noscript&gt;
              &lt;div class=&quot;highlight&quot;&gt;&lt;table&gt;&lt;tr&gt;
              &lt;td class=&quot;gutter&quot;&gt;&lt;pre class=&quot;line-numbers&quot;&gt;&lt;span class=&quot;line-number&quot;&gt;1&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;2&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;3&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;4&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;5&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;6&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;7&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;8&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;9&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;10&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;11&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;12&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;13&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;14&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;15&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;16&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;17&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;18&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;19&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;20&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;21&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;22&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;23&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;24&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;25&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;26&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;27&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;28&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;29&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;30&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;31&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;32&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;33&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;34&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;35&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;36&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;37&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
              &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;err&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pry&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;remote&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;em&lt;/span&gt;
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;pry&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;remote&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;em&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;client&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;connected&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;to&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pryem&lt;/span&gt;&lt;span class=&quot;ss&quot;&gt;:/&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;127&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;6462&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;pry&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;remote&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;em&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;remote&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;is&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;PryRemoteEm&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pryem&lt;/span&gt;
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pry&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;c1&quot;&gt;#&lt;Foo&gt;)&gt; stat &lt;/span&gt;
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;no&quot;&gt;Method&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;Information&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;o&quot;&gt;--&lt;/span&gt;
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;no&quot;&gt;Name&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kp&quot;&gt;initialize&lt;/span&gt;
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;no&quot;&gt;Owner&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;Foo&lt;/span&gt;
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;no&quot;&gt;Visibility&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kp&quot;&gt;private&lt;/span&gt;
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;no&quot;&gt;Type&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;Bound&lt;/span&gt;
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;no&quot;&gt;Arity&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;no&quot;&gt;Method&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;Signature&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kp&quot;&gt;initialize&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;no&quot;&gt;Source&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;Location&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;irb&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt;
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pry&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;c1&quot;&gt;#&lt;Foo&gt;)&gt; self&lt;/span&gt;
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;o&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;#&lt;Foo:0x007fef1b22ac10&gt;&lt;/span&gt;
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pry&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;c1&quot;&gt;#&lt;Foo&gt;)&gt; ls&lt;/span&gt;
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;n&quot;&gt;locals&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;_&lt;/span&gt;  &lt;span class=&quot;n&quot;&gt;_dir_&lt;/span&gt;  &lt;span class=&quot;n&quot;&gt;_ex_&lt;/span&gt;  &lt;span class=&quot;n&quot;&gt;_file_&lt;/span&gt;  &lt;span class=&quot;n&quot;&gt;_in_&lt;/span&gt;  &lt;span class=&quot;n&quot;&gt;_out_&lt;/span&gt;  &lt;span class=&quot;n&quot;&gt;_pry_&lt;/span&gt;  &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;  &lt;span class=&quot;n&quot;&gt;y&lt;/span&gt;
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pry&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;c1&quot;&gt;#&lt;Foo&gt;)&gt; x&lt;/span&gt;
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;o&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pry&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;c1&quot;&gt;#&lt;Foo&gt;)&gt; x = 12&lt;/span&gt;
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;o&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;12&lt;/span&gt;
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;6&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pry&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;c1&quot;&gt;#&lt;Foo&gt;)&gt; exit&lt;/span&gt;
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;pry&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;remote&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;em&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;session&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;terminated&lt;/span&gt;
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;err&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pry&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;remote&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;em&lt;/span&gt;
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;pry&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;remote&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;em&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;client&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;connected&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;to&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pryem&lt;/span&gt;&lt;span class=&quot;ss&quot;&gt;:/&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;127&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;6462&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;pry&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;remote&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;em&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;remote&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;is&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;PryRemoteEm&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pryem&lt;/span&gt;
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pry&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;c1&quot;&gt;#&lt;Foo&gt;)&gt; x&lt;/span&gt;
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;o&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;12&lt;/span&gt;
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pry&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;c1&quot;&gt;#&lt;Foo&gt;)&gt; exit&lt;/span&gt;
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;pry&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;remote&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;em&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;session&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;terminated&lt;/span&gt;
              &lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
              &lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;
              
              &lt;h2&gt;Features&lt;/h2&gt;
              
              &lt;h3&gt;Multiple Servers&lt;/h3&gt;
              
              &lt;p&gt;It's easy to run more than one PryRemoteEm service on a single machine,
              or even in the same process. When you start the service via
              &lt;em&gt;#remote&lt;em&gt;pry&lt;/em&gt;em&lt;/em&gt;, just specify &lt;em&gt;:auto&lt;/em&gt; as the port to use. The service
              will automatically take the next free port from 6462.&lt;/p&gt;
              
              &lt;noscript&gt;require &quot;pry-remote-em/server&quot;
              
              os     = ObjectSpace.each_object
              expose = []
              while expose.length &lt;/noscript&gt;
              &lt;div class=&quot;highlight&quot;&gt;&lt;table&gt;&lt;tr&gt;
              &lt;td class=&quot;gutter&quot;&gt;&lt;pre class=&quot;line-numbers&quot;&gt;&lt;span class=&quot;line-number&quot;&gt;1&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;2&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;3&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;4&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;5&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;6&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;7&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;8&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;9&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;10&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;11&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;12&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
              &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb&quot;&gt;require&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;pry-remote-em/server&quot;&lt;/span&gt;
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;n&quot;&gt;os&lt;/span&gt;     &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;ObjectSpace&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;each_object&lt;/span&gt;
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;n&quot;&gt;expose&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[]&lt;/span&gt;
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;k&quot;&gt;while&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;expose&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;length&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&lt;&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt;
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;  &lt;span class=&quot;n&quot;&gt;o&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;os&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;next&lt;/span&gt;
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;  &lt;span class=&quot;n&quot;&gt;expose&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;push&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;unless&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;frozen?&lt;/span&gt;
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;no&quot;&gt;EM&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;run&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;  &lt;span class=&quot;n&quot;&gt;expose&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;each&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;remote_pry_em&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'localhost'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:auto&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
              &lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
              &lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;
              
              &lt;noscript&gt;$ ruby test/auto-demo.rb
              [pry-remote-em] listening for connections on pryem://localhost:6462/
              [pry-remote-em] listening for connections on pryem://localhost:6463/
              [pry-remote-em] listening for connections on pryem://localhost:6464/
              [pry-remote-em] listening for connections on pryem://localhost:6465/
              [pry-remote-em] listening for connections on pryem://localhost:6466/
              &lt;/noscript&gt;
              &lt;pre&gt;&lt;code&gt;$ ruby test/auto-demo.rb
              [pry-remote-em] listening for connections on pryem://localhost:6462/
              [pry-remote-em] listening for connections on pryem://localhost:6463/
              [pry-remote-em] listening for connections on pryem://localhost:6464/
              [pry-remote-em] listening for connections on pryem://localhost:6465/
              [pry-remote-em] listening for connections on pryem://localhost:6466/
              &lt;/code&gt;&lt;/pre&gt;
              
              &lt;noscript&gt;$ pry-remote-em
              [pry-remote-em] client connected to pryem://127.0.0.1:6462/
              [pry-remote-em] remote is PryRemoteEm 0.4.0 pryem
              [1] pry(&quot;pretty_print&quot;)&gt; 
              
              $ pry-remote-em  pryem://127.0.0.1:6463/
              [pry-remote-em] client connected to pryem://127.0.0.1:6463/
              [pry-remote-em] remote is PryRemoteEm 0.4.0 pryem
              [1] pry(&quot;pack&quot;)&gt; 
              
              $ pry-remote-em  pryem://127.0.0.1:6464/
              [pry-remote-em] client connected to pryem://127.0.0.1:6464/
              [pry-remote-em] remote is PryRemoteEm 0.4.0 pryem
              [1] pry(&quot;to_json&quot;)&gt;
              
              $ pry-remote-em  pryem://127.0.0.1:6465/
              [pry-remote-em] client connected to pryem://127.0.0.1:6465/
              [pry-remote-em] remote is PryRemoteEm 0.4.0 pryem
              [1] pry(&quot;to_json&quot;)&gt; 
              
              $ pry-remote-em  pryem://127.0.0.1:6466/
              [pry-remote-em] client connected to pryem://127.0.0.1:6466/
              [pry-remote-em] remote is PryRemoteEm 0.4.0 pryem
              [1] pry(#&lt;:instructionsequence&gt;)&gt; 
              &lt;/:instructionsequence&gt;
              &lt;/noscript&gt;
              &lt;div class=&quot;highlight&quot;&gt;&lt;table&gt;&lt;tr&gt;
              &lt;td class=&quot;gutter&quot;&gt;&lt;pre class=&quot;line-numbers&quot;&gt;&lt;span class=&quot;line-number&quot;&gt;1&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;2&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;3&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;4&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;5&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;6&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;7&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;8&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;9&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;10&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;11&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;12&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;13&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;14&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;15&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;16&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;17&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;18&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;19&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;20&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;21&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;22&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;23&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;24&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
              &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;code class=&quot;bash&quot;&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;pry-remote-em
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;pry-remote-em&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; client connected to pryem://127.0.0.1:6462/
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;pry-remote-em&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; remote is PryRemoteEm 0.4.0 pryem
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;1&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; pry&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;pretty_print&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;&gt;
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;pry-remote-em  pryem://127.0.0.1:6463/
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;pry-remote-em&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; client connected to pryem://127.0.0.1:6463/
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;pry-remote-em&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; remote is PryRemoteEm 0.4.0 pryem
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;1&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; pry&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;pack&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;&gt;
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;pry-remote-em  pryem://127.0.0.1:6464/
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;pry-remote-em&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; client connected to pryem://127.0.0.1:6464/
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;pry-remote-em&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; remote is PryRemoteEm 0.4.0 pryem
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;1&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; pry&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;to_json&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;&gt;
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;pry-remote-em  pryem://127.0.0.1:6465/
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;pry-remote-em&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; client connected to pryem://127.0.0.1:6465/
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;pry-remote-em&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; remote is PryRemoteEm 0.4.0 pryem
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;1&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; pry&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;to_json&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;&gt;
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;pry-remote-em  pryem://127.0.0.1:6466/
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;pry-remote-em&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; client connected to pryem://127.0.0.1:6466/
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;pry-remote-em&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; remote is PryRemoteEm 0.4.0 pryem
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;1&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; pry&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;c&quot;&gt;#&lt;RubyVM::InstructionSequence&gt;)&gt; &lt;/span&gt;
              &lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
              &lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;
              
              &lt;h3&gt;TLS Encryption&lt;/h3&gt;
              
              &lt;p&gt;When creating a server pass the :tls =&gt; true option to enable TLS. &lt;/p&gt;
              
              &lt;noscript&gt;obj.remote_pry_em('localhost', :auto, :tls =&gt; true)
              &lt;/noscript&gt;
              &lt;div class=&quot;highlight&quot;&gt;&lt;table&gt;&lt;tr&gt;
              &lt;td class=&quot;gutter&quot;&gt;&lt;pre class=&quot;line-numbers&quot;&gt;&lt;span class=&quot;line-number&quot;&gt;1&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
              &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;n&quot;&gt;obj&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;remote_pry_em&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'localhost'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:auto&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:tls&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;kp&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
              &lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
              &lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;
              
              &lt;p&gt;If you pass a Hash it will be used to configure the internal TLS handler. &lt;/p&gt;
              
              &lt;noscript&gt;obj.remote_pry_em('localhost', :auto, :tls =&gt; {:private_key_file =&gt; '/tmp/server.key'})
              &lt;/noscript&gt;
              &lt;div class=&quot;highlight&quot;&gt;&lt;table&gt;&lt;tr&gt;
              &lt;td class=&quot;gutter&quot;&gt;&lt;pre class=&quot;line-numbers&quot;&gt;&lt;span class=&quot;line-number&quot;&gt;1&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
              &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;n&quot;&gt;obj&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;remote_pry_em&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'localhost'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:auto&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:tls&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;ss&quot;&gt;:private_key_file&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'/tmp/server.key'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;})&lt;/span&gt;
              &lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
              &lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;
              
              &lt;p&gt;See &lt;a href=&quot;http://eventmachine.rubyforge.org/EventMachine/Connection.html#M000296&quot;&gt;EventMachine::Connection#start_tls&lt;/a&gt; for the available options.&lt;/p&gt;
              
              &lt;p&gt;When the command line client connects to a TLS enabled server it will
              automatically use TLS mode even if the user didn't request it.&lt;/p&gt;
              
              &lt;noscript&gt;$ pry-remote-em pryem://localhost:6462/
              [pry-remote-em] client connected to pryem://127.0.0.1:6462/
              [pry-remote-em] remote is PryRemoteEm 0.4.0 pryems
              [pry-remote-em] negotiating TLS
              [pry-remote-em] TLS connection established
              [1] pry(#&lt;hash&gt;)&gt; 
              &lt;/hash&gt;
              &lt;/noscript&gt;
              &lt;div class=&quot;highlight&quot;&gt;&lt;table&gt;&lt;tr&gt;
              &lt;td class=&quot;gutter&quot;&gt;&lt;pre class=&quot;line-numbers&quot;&gt;&lt;span class=&quot;line-number&quot;&gt;1&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;2&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;3&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;4&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;5&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;6&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
              &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;code class=&quot;bash&quot;&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;pry-remote-em pryem://localhost:6462/
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;pry-remote-em&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; client connected to pryem://127.0.0.1:6462/
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;pry-remote-em&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; remote is PryRemoteEm 0.4.0 pryems
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;pry-remote-em&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; negotiating TLS
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;pry-remote-em&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; TLS connection established
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;1&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; pry&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;c&quot;&gt;#&lt;Hash&gt;)&gt; &lt;/span&gt;
              &lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
              &lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;
              
              &lt;p&gt;To always require a TLS connection give pry-remote-em a pryem&lt;em&gt;s&lt;/em&gt; URL. If
              the server doesn't support TLS the connection will be terminated.&lt;/p&gt;
              
              &lt;noscript&gt;$ pry-remote-em pryems://localhost:6468/
              [pry-remote-em] client connected to pryem://127.0.0.1:6468/
              [pry-remote-em] remote is PryRemoteEm 0.4.0 pryem
              [pry-remote-em] connection failed
              [pry-remote-em] server doesn't support required scheme &quot;pryems&quot;
              [pry-remote-em] session terminated
              &lt;/noscript&gt;
              &lt;div class=&quot;highlight&quot;&gt;&lt;table&gt;&lt;tr&gt;
              &lt;td class=&quot;gutter&quot;&gt;&lt;pre class=&quot;line-numbers&quot;&gt;&lt;span class=&quot;line-number&quot;&gt;1&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;2&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;3&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;4&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;5&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;6&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
              &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;code class=&quot;bash&quot;&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;pry-remote-em pryems://localhost:6468/
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;pry-remote-em&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; client connected to pryem://127.0.0.1:6468/
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;pry-remote-em&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; remote is PryRemoteEm 0.4.0 pryem
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;pry-remote-em&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; connection failed
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;pry-remote-em&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; server doesn&lt;span class=&quot;err&quot;&gt;'&lt;/span&gt;t support required scheme &lt;span class=&quot;s2&quot;&gt;&quot;pryems&quot;&lt;/span&gt;
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;pry-remote-em&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; session terminated
              &lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
              &lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;
              
              &lt;h3&gt;User Authentication&lt;/h3&gt;
              
              &lt;h4&gt;Server&lt;/h4&gt;
              
              &lt;p&gt;If the service is started with the :auth option it will require all
              clients to authenticate on connect. The :auth option can be a Hash, proc
              or any object that responds to #call.&lt;/p&gt;
              
              &lt;h5&gt;Auth with a Hash&lt;/h5&gt;
              
              &lt;noscript&gt;auth_hash = {'caleb' =&gt; 'crane', 'john' =&gt; 'lowski'}
              obj       = {:encoding =&gt; __ENCODING__, :weather =&gt; :cloudy}
              EM.run{
                obj.remote_pry_em('localhost', :auto, :tls =&gt; true, :auth =&gt; auth_hash)
              }
              &lt;/noscript&gt;
              &lt;div class=&quot;highlight&quot;&gt;&lt;table&gt;&lt;tr&gt;
              &lt;td class=&quot;gutter&quot;&gt;&lt;pre class=&quot;line-numbers&quot;&gt;&lt;span class=&quot;line-number&quot;&gt;1&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;2&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;3&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;4&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;5&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
              &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;n&quot;&gt;auth_hash&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'caleb'&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'crane'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'john'&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'lowski'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;n&quot;&gt;obj&lt;/span&gt;       &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;ss&quot;&gt;:encoding&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;__ENCODING__&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:weather&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:cloudy&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;no&quot;&gt;EM&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;run&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;  &lt;span class=&quot;n&quot;&gt;obj&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;remote_pry_em&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'localhost'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:auto&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:tls&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;kp&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:auth&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;auth_hash&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
              &lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
              &lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;
              
              &lt;h5&gt;Auth with a lambda&lt;/h5&gt;
              
              &lt;noscript&gt;require 'net/ldap'
              ldap_anon = lambda do |user, pass|
                ldap = Net::LDAP.new :host =&gt; &quot;10.0.0.1&quot;, :port =&gt; 389, :auth =&gt; {:method =&gt; :simple, :username =&gt; user, :password =&gt; pass}
                ldap.bind
              end
              obj       = {:encoding =&gt; __ENCODING__, :weather =&gt; :cloudy}
              EM.run{
                obj.remote_pry_em('localhost', :auto, :tls =&gt; true, :auth =&gt; ldap_anon)
              }
              &lt;/noscript&gt;
              &lt;div class=&quot;highlight&quot;&gt;&lt;table&gt;&lt;tr&gt;
              &lt;td class=&quot;gutter&quot;&gt;&lt;pre class=&quot;line-numbers&quot;&gt;&lt;span class=&quot;line-number&quot;&gt;1&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;2&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;3&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;4&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;5&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;6&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;7&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;8&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;9&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
              &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb&quot;&gt;require&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'net/ldap'&lt;/span&gt;
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;n&quot;&gt;ldap_anon&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;lambda&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;do&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;user&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pass&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;  &lt;span class=&quot;n&quot;&gt;ldap&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;Net&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;LDAP&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:host&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;10.0.0.1&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:port&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;389&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:auth&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;ss&quot;&gt;:method&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:simple&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:username&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;user&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:password&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pass&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;  &lt;span class=&quot;n&quot;&gt;ldap&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;bind&lt;/span&gt;
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;n&quot;&gt;obj&lt;/span&gt;       &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;ss&quot;&gt;:encoding&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;__ENCODING__&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:weather&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:cloudy&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;no&quot;&gt;EM&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;run&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;  &lt;span class=&quot;n&quot;&gt;obj&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;remote_pry_em&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'localhost'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:auto&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:tls&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;kp&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:auth&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ldap_anon&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
              &lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
              &lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;
              
              &lt;h5&gt;Auth with an object&lt;/h5&gt;
              
              &lt;noscript&gt;class Authenticator
                def initialize(db)
                  @db = db
                end
                def call(user, pass)
                  @db[user] &amp;&amp; @db[user] == pass
                end
              end
              
              obj       = {:encoding =&gt; __ENCODING__, :weather =&gt; :cloudy}
              EM.run{
                obj.remote_pry_em('localhost', :auto, :tls =&gt; true, :auth =&gt; Authenticator.new(auth_hash))
              }
              &lt;/noscript&gt;
              &lt;div class=&quot;highlight&quot;&gt;&lt;table&gt;&lt;tr&gt;
              &lt;td class=&quot;gutter&quot;&gt;&lt;pre class=&quot;line-numbers&quot;&gt;&lt;span class=&quot;line-number&quot;&gt;1&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;2&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;3&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;4&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;5&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;6&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;7&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;8&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;9&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;10&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;11&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;12&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;13&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
              &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Authenticator&lt;/span&gt;
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;  &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;initialize&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;db&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;    &lt;span class=&quot;vi&quot;&gt;@db&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;db&lt;/span&gt;
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;  &lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;  &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;call&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;user&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pass&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;    &lt;span class=&quot;vi&quot;&gt;@db&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;user&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;&amp;&lt;/span&gt; &lt;span class=&quot;vi&quot;&gt;@db&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;user&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pass&lt;/span&gt;
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;  &lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;n&quot;&gt;obj&lt;/span&gt;       &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;ss&quot;&gt;:encoding&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;__ENCODING__&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:weather&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:cloudy&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;no&quot;&gt;EM&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;run&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;  &lt;span class=&quot;n&quot;&gt;obj&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;remote_pry_em&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'localhost'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:auto&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:tls&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;kp&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:auth&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;Authenticator&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;new&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;auth_hash&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
              &lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
              &lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;
              
              &lt;h4&gt;Client&lt;/h4&gt;
              
              &lt;p&gt;The included command line client &lt;em&gt;pry-remote-em&lt;/em&gt; can take a username
              and/or password as part of the url argument. If either a username or
              password is not supplied, but required, by the server, it will prompt for
              them.&lt;/p&gt;
              
              &lt;noscript&gt;$ pry-remote-em pryems://localhost:6464/
              [pry-remote-em] client connected to pryem://127.0.0.1:6464/
              [pry-remote-em] remote is PryRemoteEm 0.4.0 pryems
              [pry-remote-em] negotiating TLS
              [pry-remote-em] TLS connection established
              user: caleb
              caleb's password: *****
              [1] pry(#&lt;hash&gt;)&gt; 
              &lt;/hash&gt;
              &lt;/noscript&gt;
              &lt;div class=&quot;highlight&quot;&gt;&lt;table&gt;&lt;tr&gt;
              &lt;td class=&quot;gutter&quot;&gt;&lt;pre class=&quot;line-numbers&quot;&gt;&lt;span class=&quot;line-number&quot;&gt;1&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;2&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;3&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;4&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;5&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;6&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;7&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;8&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
              &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;code class=&quot;bash&quot;&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;pry-remote-em pryems://localhost:6464/
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;pry-remote-em&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; client connected to pryem://127.0.0.1:6464/
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;pry-remote-em&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; remote is PryRemoteEm 0.4.0 pryems
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;pry-remote-em&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; negotiating TLS
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;pry-remote-em&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; TLS connection established
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;user: caleb
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;caleb&lt;span class=&quot;err&quot;&gt;'&lt;/span&gt;s password: *****
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;1&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; pry&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;c&quot;&gt;#&lt;Hash&gt;)&gt; &lt;/span&gt;
              &lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
              &lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;
              
              &lt;noscript&gt;$ pry-remote-em pryems://caleb@localhost:6464
              [pry-remote-em] client connected to pryem://127.0.0.1:6464/
              [pry-remote-em] remote is PryRemoteEm 0.4.0 pryems
              [pry-remote-em] negotiating TLS
              [pry-remote-em] TLS connection established
              caleb's password: *****
              [1] pry(#&lt;hash&gt;)&gt; 
              &lt;/hash&gt;
              &lt;/noscript&gt;
              &lt;div class=&quot;highlight&quot;&gt;&lt;table&gt;&lt;tr&gt;
              &lt;td class=&quot;gutter&quot;&gt;&lt;pre class=&quot;line-numbers&quot;&gt;&lt;span class=&quot;line-number&quot;&gt;1&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;2&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;3&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;4&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;5&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;6&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;7&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
              &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;code class=&quot;bash&quot;&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;pry-remote-em pryems://caleb@localhost:6464
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;pry-remote-em&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; client connected to pryem://127.0.0.1:6464/
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;pry-remote-em&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; remote is PryRemoteEm 0.4.0 pryems
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;pry-remote-em&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; negotiating TLS
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;pry-remote-em&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; TLS connection established
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;caleb&lt;span class=&quot;err&quot;&gt;'&lt;/span&gt;s password: *****
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;1&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; pry&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;c&quot;&gt;#&lt;Hash&gt;)&gt; &lt;/span&gt;
              &lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
              &lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;
              
              &lt;noscript&gt;$ pry-remote-em pryems://caleb:crane@localhost:6464
              [pry-remote-em] client connected to pryem://127.0.0.1:6464/
              [pry-remote-em] remote is PryRemoteEm 0.4.0 pryems
              [pry-remote-em] negotiating TLS
              [pry-remote-em] TLS connection established
              [1] pry(#&lt;hash&gt;)&gt; 
              &lt;/hash&gt;
              &lt;/noscript&gt;
              &lt;div class=&quot;highlight&quot;&gt;&lt;table&gt;&lt;tr&gt;
              &lt;td class=&quot;gutter&quot;&gt;&lt;pre class=&quot;line-numbers&quot;&gt;&lt;span class=&quot;line-number&quot;&gt;1&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;2&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;3&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;4&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;5&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;6&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
              &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;code class=&quot;bash&quot;&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;pry-remote-em pryems://caleb:crane@localhost:6464
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;pry-remote-em&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; client connected to pryem://127.0.0.1:6464/
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;pry-remote-em&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; remote is PryRemoteEm 0.4.0 pryems
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;pry-remote-em&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; negotiating TLS
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;pry-remote-em&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; TLS connection established
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;1&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; pry&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;c&quot;&gt;#&lt;Hash&gt;)&gt; &lt;/span&gt;
              &lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
              &lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;
              
              &lt;h3&gt;Tab Completion&lt;/h3&gt;
              
              &lt;p&gt;Tab completion candidates will be retrieved from the server and
              presented on the client side.&lt;/p&gt;
              
              &lt;noscript&gt;$ bin/pry-remote-em pryems:///
              [pry-remote-em] client connected to pryem://127.0.0.1:6462/
              [pry-remote-em] remote is PryRemoteEm 0.2.0 pryems
              [1] pry(#&lt;hash&gt;)&gt; key (^TAB ^TAB)
              key   key?  keys  
              [1] pry(#&lt;hash&gt;)&gt; keys
              =&gt; [:encoding]
              &lt;/hash&gt;&lt;/hash&gt;
              &lt;/noscript&gt;
              &lt;div class=&quot;highlight&quot;&gt;&lt;table&gt;&lt;tr&gt;
              &lt;td class=&quot;gutter&quot;&gt;&lt;pre class=&quot;line-numbers&quot;&gt;&lt;span class=&quot;line-number&quot;&gt;1&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;2&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;3&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;4&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;5&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;6&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;7&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
              &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;code class=&quot;bash&quot;&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;bin/pry-remote-em pryems:///
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;pry-remote-em&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; client connected to pryem://127.0.0.1:6462/
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;pry-remote-em&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; remote is PryRemoteEm 0.2.0 pryems
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;1&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; pry&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;c&quot;&gt;#&lt;Hash&gt;)&gt; key (^TAB ^TAB)&lt;/span&gt;
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;key   key?  keys
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;1&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; pry&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;c&quot;&gt;#&lt;Hash&gt;)&gt; keys&lt;/span&gt;
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&gt; &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;:encoding&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;
              &lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
              &lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;
              
              &lt;h3&gt;Paging&lt;/h3&gt;
              
              &lt;p&gt;The standard Pry pager is supported through the included client.&lt;/p&gt;
              
              &lt;noscript&gt;[1] pry(#&lt;hash&gt;)&gt; ENV
              =&gt; {&quot;COMMAND_MODE&quot;=&gt;&quot;unix2003&quot;,
               &quot;DISPLAY&quot;=&gt;&quot;/tmp/launch-0EGhJW/org.x:0&quot;,
               &quot;EDITOR&quot;=&gt;&quot;mvim -f --nomru -c \&quot;au VimLeave * !open -a Terminal\&quot;&quot;,
               &quot;GEM_HOME&quot;=&gt;&quot;/Users/caleb/.rvm/gems/ruby-1.9.2-p290&quot;,
               &quot;GEM_PATH&quot;=&gt;
                &quot;/Users/caleb/.rvm/gems/ruby-1.9.2-p290:/Users/caleb/.rvm/gems/ruby-1.9.2-p290@global&quot;,
               &quot;GREP_COLOR&quot;=&gt;&quot;1;32&quot;,
               &quot;GREP_OPTIONS&quot;=&gt;&quot;--color=auto&quot;,
               &quot;HOME&quot;=&gt;&quot;/Users/caleb&quot;,
               &quot;IRBRC&quot;=&gt;&quot;/Users/caleb/.rvm/rubies/ruby-1.9.2-p290/.irbrc&quot;,
               &quot;LC_CTYPE&quot;=&gt;&quot;&quot;,
               &quot;LOGNAME&quot;=&gt;&quot;caleb&quot;,
               &quot;LSCOLORS&quot;=&gt;&quot;Gxfxcxdxbxegedabagacad&quot;,
              :
              &lt;/hash&gt;
              &lt;/noscript&gt;
              &lt;div class=&quot;highlight&quot;&gt;&lt;table&gt;&lt;tr&gt;
              &lt;td class=&quot;gutter&quot;&gt;&lt;pre class=&quot;line-numbers&quot;&gt;&lt;span class=&quot;line-number&quot;&gt;1&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;2&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;3&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;4&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;5&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;6&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;7&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;8&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;9&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;10&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;11&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;12&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;13&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;14&lt;/span&gt;
              &lt;span class=&quot;line-number&quot;&gt;15&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
              &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pry&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;c1&quot;&gt;#&lt;Hash&gt;)&gt; ENV&lt;/span&gt;
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;o&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;COMMAND_MODE&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&gt;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;unix2003&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt; &lt;span class=&quot;s2&quot;&gt;&quot;DISPLAY&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&gt;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;/tmp/launch-0EGhJW/org.x:0&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt; &lt;span class=&quot;s2&quot;&gt;&quot;EDITOR&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&gt;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;mvim -f --nomru -c &lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;au VimLeave * !open -a Terminal&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt; &lt;span class=&quot;s2&quot;&gt;&quot;GEM_HOME&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&gt;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;/Users/caleb/.rvm/gems/ruby-1.9.2-p290&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt; &lt;span class=&quot;s2&quot;&gt;&quot;GEM_PATH&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&gt;&lt;/span&gt;
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;  &lt;span class=&quot;s2&quot;&gt;&quot;/Users/caleb/.rvm/gems/ruby-1.9.2-p290:/Users/caleb/.rvm/gems/ruby-1.9.2-p290@global&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt; &lt;span class=&quot;s2&quot;&gt;&quot;GREP_COLOR&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&gt;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;1;32&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt; &lt;span class=&quot;s2&quot;&gt;&quot;GREP_OPTIONS&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&gt;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;--color=auto&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt; &lt;span class=&quot;s2&quot;&gt;&quot;HOME&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&gt;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;/Users/caleb&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt; &lt;span class=&quot;s2&quot;&gt;&quot;IRBRC&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&gt;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;/Users/caleb/.rvm/rubies/ruby-1.9.2-p290/.irbrc&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt; &lt;span class=&quot;s2&quot;&gt;&quot;LC_CTYPE&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&gt;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt; &lt;span class=&quot;s2&quot;&gt;&quot;LOGNAME&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&gt;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;caleb&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt; &lt;span class=&quot;s2&quot;&gt;&quot;LSCOLORS&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&gt;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;Gxfxcxdxbxegedabagacad&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
              &lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
              &lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;
              
              &lt;h2&gt;Missing Features&lt;/h2&gt;
              
              &lt;ul&gt;
              &lt;li&gt;AutoDiscovery/Broker &lt;a href=&quot;https://github.com/simulacre/pry-remote-em/issues/11&quot;&gt;ticket&lt;/a&gt;
              &lt;/li&gt;
              &lt;li&gt;HTTP Transport &lt;a href=&quot;https://github.com/simulacre/pry-remote-em/issues/12&quot;&gt;ticket&lt;/a&gt;
              &lt;/li&gt;
              &lt;li&gt;Shell Commands &lt;a href=&quot;https://github.com/simulacre/pry-remote-em/issues/15&quot;&gt;ticket&lt;/a&gt;
              &lt;/li&gt;
              &lt;li&gt;Vi mode editing - RbReadline doesn't support vi edit mode. I'm looking into contributing it. PryRemoteEm uses rb-readline because the STLIB version doesn't play nice with Fibers.&lt;/li&gt;
              &lt;li&gt;Ssh key based authentication&lt;/li&gt;
              &lt;/ul&gt;
              &lt;h2&gt;Issues&lt;/h2&gt;
              
              &lt;p&gt;Please post any bug reports or feature requests on &lt;a href=&quot;https://github.com/simulacre/pry-remote-em/issues&quot;&gt;Github&lt;/a&gt;&lt;/p&gt;
              
              &lt;h2&gt;Copyright&lt;/h2&gt;
              
              &lt;pre&gt;
              Copyright (c) 2012 Caleb Crane
              
              Permission is hereby granted, free of charge, to any person obtaining
              a copy of this software and associated documentation files (the
              &quot;Software&quot;), to deal in the Software without restriction, including
              without limitation the rights to use, copy, modify, merge, publish,
              distribute, sublicense, and/or sell copies of the Software, and to
              permit persons to whom the Software is furnished to do so, subject to
              the following conditions:
              
              The above copyright notice and this permission notice shall be 
              included in all copies or substantial portions of the Software.
              
              THE SOFTWARE IS PROVIDED &quot;AS IS&quot;, WITHOUT WARRANTY OF ANY KIND,
              EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
              MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
              NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
              LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
              OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
              WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.&lt;/pre&gt;
              &lt;/body&gt;&lt;/html&gt;
    </content>
  </entry>
  <entry>
    <id>http://www.simulacre.org/making-gnu-screen-remember-splits/</id>
    <title>Making GNU Screen Remember Splits</title>
    <updated>2012-01-11T00:00:00Z</updated>
    <link href='http://www.simulacre.org/making-gnu-screen-remember-splits/' rel='alternate' type='text/html' />
    <summary>
      GNU Screen is a great terminal
                multiplexer or simple window manager for CLI interfaces. Newer versions
                support spliting a single terminal window both horizontally and
                vertically. Each split window can run its own independent shell.
                
                
                
                Screen also allows you to start programs detach from Screen, logout
                and later reattach to the same Screen after logging in again. Once
                reattached the programs will be safely where they were left.
                
                Unfortunately whenever you detach from a Screen session, any split
                windows you setup in that session will be lost. The shells and programs
                running in the windows will be fine. You can get them back by recreating
                the split windows and connecting......
    </summary>
    <content type='html'>
      &lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD HTML 4.0 Transitional//EN&quot; &quot;http://www.w3.org/TR/REC-html40/loose.dtd&quot;&gt;
                &lt;html&gt;&lt;body&gt;
                &lt;p&gt;&lt;a href=&quot;http://www.gnu.org/software/screen/&quot;&gt;GNU Screen&lt;/a&gt; is a great terminal
                multiplexer or simple window manager for CLI interfaces. Newer versions
                support spliting a single terminal window both horizontally and
                vertically. Each split window can run its own independent shell.&lt;/p&gt;
                
                &lt;p&gt;&lt;img alt=&quot;GNU Screen - terminal multiplexer&quot; src=&quot;http://www.simulacre.org/images/blog/making-gnu-screen-remember-splits.png&quot; style=&quot;float:left; margin: 0.2em 0.75em 0 0&quot;&gt;&lt;/p&gt;
                
                &lt;p&gt;Screen also allows you to start programs detach from Screen, logout
                and later reattach to the same Screen after logging in again. Once
                reattached the programs will be safely where they were left.&lt;/p&gt;
                
                &lt;p&gt;Unfortunately whenever you detach from a Screen session, any split
                windows you setup in that session will be lost. The shells and programs
                running in the windows will be fine. You can get them back by recreating
                the split windows and connecting each one to a running shell.&lt;/p&gt;
                
                &lt;p&gt;That's a real pain though. Future versions of GNU Screen may remember
                the split window layouts after reattaching. Until then the only solution
                is to use a nested screen session.&lt;/p&gt;
                
                &lt;p&gt;Start one Screen session. Then immediately start a second session. Next
                reconfigure the escape sequence of the outer session to be &lt;em&gt;Ctrl-o&lt;/em&gt;. Now
                use the standard escape sequence (&lt;em&gt;Ctrl-a&lt;/em&gt;) to control the second - inner
                - session. When you're ready to detach use &lt;em&gt;Ctrl-o d&lt;/em&gt; instead of &lt;em&gt;Ctrl-a
                  d&lt;/em&gt;. You can safely log out of the terminal now. When you want to get
                back just reattach to the first session.&lt;/p&gt;
                
                &lt;h2&gt;Example&lt;/h2&gt;
                
                &lt;noscript&gt;# start one Screen session
                $ screen -S outer
                # start another Screen session in the first session
                $ screen -S inner
                # reconfigure the control key for the outer Screen
                C-a :escape ^Oo
                
                # start top in the inner Screen
                $ top
                # split the inner Screen and run vmstat in it
                C-a S
                C-a TAB
                C-a C
                $ vmstat 2
                
                # detach from the outer Screen
                C-o d
                
                # you can logout now
                
                # when ready, reattach to your Screen session
                $ screen -ls
                There are screens on:
                    15615.outer (Detached)
                    15692.inner (Attached)
                
                $ screen -r outer
                &lt;/noscript&gt;
                &lt;div class=&quot;highlight&quot;&gt;&lt;table&gt;&lt;tr&gt;
                &lt;td class=&quot;gutter&quot;&gt;&lt;pre class=&quot;line-numbers&quot;&gt;&lt;span class=&quot;line-number&quot;&gt;1&lt;/span&gt;
                &lt;span class=&quot;line-number&quot;&gt;2&lt;/span&gt;
                &lt;span class=&quot;line-number&quot;&gt;3&lt;/span&gt;
                &lt;span class=&quot;line-number&quot;&gt;4&lt;/span&gt;
                &lt;span class=&quot;line-number&quot;&gt;5&lt;/span&gt;
                &lt;span class=&quot;line-number&quot;&gt;6&lt;/span&gt;
                &lt;span class=&quot;line-number&quot;&gt;7&lt;/span&gt;
                &lt;span class=&quot;line-number&quot;&gt;8&lt;/span&gt;
                &lt;span class=&quot;line-number&quot;&gt;9&lt;/span&gt;
                &lt;span class=&quot;line-number&quot;&gt;10&lt;/span&gt;
                &lt;span class=&quot;line-number&quot;&gt;11&lt;/span&gt;
                &lt;span class=&quot;line-number&quot;&gt;12&lt;/span&gt;
                &lt;span class=&quot;line-number&quot;&gt;13&lt;/span&gt;
                &lt;span class=&quot;line-number&quot;&gt;14&lt;/span&gt;
                &lt;span class=&quot;line-number&quot;&gt;15&lt;/span&gt;
                &lt;span class=&quot;line-number&quot;&gt;16&lt;/span&gt;
                &lt;span class=&quot;line-number&quot;&gt;17&lt;/span&gt;
                &lt;span class=&quot;line-number&quot;&gt;18&lt;/span&gt;
                &lt;span class=&quot;line-number&quot;&gt;19&lt;/span&gt;
                &lt;span class=&quot;line-number&quot;&gt;20&lt;/span&gt;
                &lt;span class=&quot;line-number&quot;&gt;21&lt;/span&gt;
                &lt;span class=&quot;line-number&quot;&gt;22&lt;/span&gt;
                &lt;span class=&quot;line-number&quot;&gt;23&lt;/span&gt;
                &lt;span class=&quot;line-number&quot;&gt;24&lt;/span&gt;
                &lt;span class=&quot;line-number&quot;&gt;25&lt;/span&gt;
                &lt;span class=&quot;line-number&quot;&gt;26&lt;/span&gt;
                &lt;span class=&quot;line-number&quot;&gt;27&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
                &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;code class=&quot;bash&quot;&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;c&quot;&gt;# start one Screen session&lt;/span&gt;
                &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;screen -S outer
                &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;c&quot;&gt;# start another Screen session in the first session&lt;/span&gt;
                &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;screen -S inner
                &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;c&quot;&gt;# reconfigure the control key for the outer Screen&lt;/span&gt;
                &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;C-a :escape ^Oo
                &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;
                &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;c&quot;&gt;# start top in the inner Screen&lt;/span&gt;
                &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;top
                &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;c&quot;&gt;# split the inner Screen and run vmstat in it&lt;/span&gt;
                &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;C-a S
                &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;C-a TAB
                &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;C-a C
                &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;vmstat 2
                &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;
                &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;c&quot;&gt;# detach from the outer Screen&lt;/span&gt;
                &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;C-o d
                &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;
                &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;c&quot;&gt;# you can logout now&lt;/span&gt;
                &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;
                &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;c&quot;&gt;# when ready, reattach to your Screen session&lt;/span&gt;
                &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;screen -ls
                &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;There are screens on:
                &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;    15615.outer &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;Detached&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
                &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;    15692.inner &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;Attached&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
                &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;
                &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;screen -r outer
                &lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
                &lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;
                
                &lt;h2&gt;Alternate ~/.screenrc&lt;/h2&gt;
                
                &lt;p&gt;It's worth creating an alternate screenrc file with the escape
                keybinding for the outer screen session. Then whenever you start the
                outer session just point it at the alternate configuration file.&lt;/p&gt;
                
                &lt;noscript&gt;$ cat ~/.screenrc.outer
                escape ^Oo
                $ screen -S outer -c ~/.screenrc.outer screen -S inner 
                &lt;/noscript&gt;
                &lt;div class=&quot;highlight&quot;&gt;&lt;table&gt;&lt;tr&gt;
                &lt;td class=&quot;gutter&quot;&gt;&lt;pre class=&quot;line-numbers&quot;&gt;&lt;span class=&quot;line-number&quot;&gt;1&lt;/span&gt;
                &lt;span class=&quot;line-number&quot;&gt;2&lt;/span&gt;
                &lt;span class=&quot;line-number&quot;&gt;3&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
                &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;code class=&quot;bash&quot;&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;cat ~/.screenrc.outer
                &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;escape ^Oo
                &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;screen -S outer -c ~/.screenrc.outer screen -S inner
                &lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
                &lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;
                
                &lt;h2&gt;References&lt;/h2&gt;
                
                &lt;ul&gt;
                &lt;li&gt;&lt;a href=&quot;http://aperiodic.net/screen/quick_reference&quot;&gt;http://aperiodic.net/screen/quick_reference&lt;/a&gt;&lt;/li&gt;
                &lt;li&gt;&lt;a href=&quot;http://aperiodic.net/screen/faq#when_i_split_the_display_and_then_detach_screen_forgets_the_split&quot;&gt;http://aperiodic.net/screen/faq#when_i_split_the_display_and_then_detach_screen_forgets_the_split&lt;/a&gt;&lt;/li&gt;
                &lt;/ul&gt;
                &lt;/body&gt;&lt;/html&gt;
    </content>
  </entry>
  <entry>
    <id>http://www.simulacre.org/em-ssh/</id>
    <title>Ssh Adapter for EventMachine</title>
    <updated>2012-01-04T00:00:00Z</updated>
    <link href='http://www.simulacre.org/em-ssh/' rel='alternate' type='text/html' />
    <summary>
      Em-ssh is a net-ssh adapter for EventMachine. For the most part you can take any net-ssh code you have and run it in the EventMachine reactor.
                  
                  Em-ssh is not associated with the Jamis Buck's net-ssh library. Please report any bugs with em-ssh to https://github.com/simulacre/em-ssh/issues
                  
                  The code is on Github. The documentation is on rubydoc.
                  
                  Installation
                  
                  gem install em-ssh
                  
                  1
                  
                  gem install em-ssh
                  
                  
                  
                  Synopsis
                  
                  EM.run do
                    EM::Ssh.start(host, user, :password =&gt; password) do |ssh|
                      # capture all stderr and stdout output from a remote process
                      ssh.exec!('uname -a').tap {|r| puts "\nuname: #{r}"}
                  
                      # capture only stdout matching a particular pattern
                   ......
    </summary>
    <content type='html'>
      &lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD HTML 4.0 Transitional//EN&quot; &quot;http://www.w3.org/TR/REC-html40/loose.dtd&quot;&gt;
                  &lt;html&gt;&lt;body&gt;
                  &lt;p&gt;Em-ssh is a net-ssh adapter for EventMachine. For the most part you can take any net-ssh code you have and run it in the EventMachine reactor.&lt;/p&gt;
                  
                  &lt;p&gt;Em-ssh is not associated with the Jamis Buck's &lt;a href=&quot;http://net-ssh.github.com/&quot;&gt;net-ssh&lt;/a&gt; library. Please report any bugs with em-ssh to &lt;a href=&quot;https://github.com/simulacre/em-ssh/issues&quot;&gt;https://github.com/simulacre/em-ssh/issues&lt;/a&gt;&lt;/p&gt;
                  
                  &lt;p&gt;The code is on &lt;a href=&quot;http://github.com/simulacre/em-ssh/&quot;&gt;Github&lt;/a&gt;. The &lt;a href=&quot;http://rubydoc.info/gems/em-ssh/0.1.0/frames&quot;&gt;documentation&lt;/a&gt; is on rubydoc.&lt;/p&gt;
                  
                  &lt;h2&gt;Installation&lt;/h2&gt;
                  
                  &lt;noscript&gt;gem install em-ssh
                  &lt;/noscript&gt;
                  &lt;div class=&quot;highlight&quot;&gt;&lt;table&gt;&lt;tr&gt;
                  &lt;td class=&quot;gutter&quot;&gt;&lt;pre class=&quot;line-numbers&quot;&gt;&lt;span class=&quot;line-number&quot;&gt;1&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
                  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;code class=&quot;bash&quot;&gt;&lt;span class=&quot;line&quot;&gt;gem install em-ssh
                  &lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
                  &lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;
                  
                  &lt;h2&gt;Synopsis&lt;/h2&gt;
                  
                  &lt;noscript&gt;EM.run do
                    EM::Ssh.start(host, user, :password =&gt; password) do |ssh|
                      # capture all stderr and stdout output from a remote process
                      ssh.exec!('uname -a').tap {|r| puts &quot;\nuname: #{r}&quot;}
                  
                      # capture only stdout matching a particular pattern
                      stdout = &quot;&quot;
                      ssh.exec!(&quot;ls -l /home&quot;) do |channel, stream, data|
                        stdout &lt;/noscript&gt;
                  &lt;div class=&quot;highlight&quot;&gt;&lt;table&gt;&lt;tr&gt;
                  &lt;td class=&quot;gutter&quot;&gt;&lt;pre class=&quot;line-numbers&quot;&gt;&lt;span class=&quot;line-number&quot;&gt;1&lt;/span&gt;
                  &lt;span class=&quot;line-number&quot;&gt;2&lt;/span&gt;
                  &lt;span class=&quot;line-number&quot;&gt;3&lt;/span&gt;
                  &lt;span class=&quot;line-number&quot;&gt;4&lt;/span&gt;
                  &lt;span class=&quot;line-number&quot;&gt;5&lt;/span&gt;
                  &lt;span class=&quot;line-number&quot;&gt;6&lt;/span&gt;
                  &lt;span class=&quot;line-number&quot;&gt;7&lt;/span&gt;
                  &lt;span class=&quot;line-number&quot;&gt;8&lt;/span&gt;
                  &lt;span class=&quot;line-number&quot;&gt;9&lt;/span&gt;
                  &lt;span class=&quot;line-number&quot;&gt;10&lt;/span&gt;
                  &lt;span class=&quot;line-number&quot;&gt;11&lt;/span&gt;
                  &lt;span class=&quot;line-number&quot;&gt;12&lt;/span&gt;
                  &lt;span class=&quot;line-number&quot;&gt;13&lt;/span&gt;
                  &lt;span class=&quot;line-number&quot;&gt;14&lt;/span&gt;
                  &lt;span class=&quot;line-number&quot;&gt;15&lt;/span&gt;
                  &lt;span class=&quot;line-number&quot;&gt;16&lt;/span&gt;
                  &lt;span class=&quot;line-number&quot;&gt;17&lt;/span&gt;
                  &lt;span class=&quot;line-number&quot;&gt;18&lt;/span&gt;
                  &lt;span class=&quot;line-number&quot;&gt;19&lt;/span&gt;
                  &lt;span class=&quot;line-number&quot;&gt;20&lt;/span&gt;
                  &lt;span class=&quot;line-number&quot;&gt;21&lt;/span&gt;
                  &lt;span class=&quot;line-number&quot;&gt;22&lt;/span&gt;
                  &lt;span class=&quot;line-number&quot;&gt;23&lt;/span&gt;
                  &lt;span class=&quot;line-number&quot;&gt;24&lt;/span&gt;
                  &lt;span class=&quot;line-number&quot;&gt;25&lt;/span&gt;
                  &lt;span class=&quot;line-number&quot;&gt;26&lt;/span&gt;
                  &lt;span class=&quot;line-number&quot;&gt;27&lt;/span&gt;
                  &lt;span class=&quot;line-number&quot;&gt;28&lt;/span&gt;
                  &lt;span class=&quot;line-number&quot;&gt;29&lt;/span&gt;
                  &lt;span class=&quot;line-number&quot;&gt;30&lt;/span&gt;
                  &lt;span class=&quot;line-number&quot;&gt;31&lt;/span&gt;
                  &lt;span class=&quot;line-number&quot;&gt;32&lt;/span&gt;
                  &lt;span class=&quot;line-number&quot;&gt;33&lt;/span&gt;
                  &lt;span class=&quot;line-number&quot;&gt;34&lt;/span&gt;
                  &lt;span class=&quot;line-number&quot;&gt;35&lt;/span&gt;
                  &lt;span class=&quot;line-number&quot;&gt;36&lt;/span&gt;
                  &lt;span class=&quot;line-number&quot;&gt;37&lt;/span&gt;
                  &lt;span class=&quot;line-number&quot;&gt;38&lt;/span&gt;
                  &lt;span class=&quot;line-number&quot;&gt;39&lt;/span&gt;
                  &lt;span class=&quot;line-number&quot;&gt;40&lt;/span&gt;
                  &lt;span class=&quot;line-number&quot;&gt;41&lt;/span&gt;
                  &lt;span class=&quot;line-number&quot;&gt;42&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
                  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;no&quot;&gt;EM&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;run&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;do&lt;/span&gt;
                  &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;  &lt;span class=&quot;no&quot;&gt;EM&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;Ssh&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;start&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;host&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;user&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:password&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;password&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;do&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ssh&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;
                  &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;    &lt;span class=&quot;c1&quot;&gt;# capture all stderr and stdout output from a remote process&lt;/span&gt;
                  &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;    &lt;span class=&quot;n&quot;&gt;ssh&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;exec!&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'uname -a'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;tap&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;puts&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;uname: &lt;/span&gt;&lt;span class=&quot;si&quot;&gt;#{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
                  &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;
                  &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;    &lt;span class=&quot;c1&quot;&gt;# capture only stdout matching a particular pattern&lt;/span&gt;
                  &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;    &lt;span class=&quot;n&quot;&gt;stdout&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&quot;&lt;/span&gt;
                  &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;    &lt;span class=&quot;n&quot;&gt;ssh&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;exec!&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;ls -l /home&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;do&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;channel&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;stream&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;
                  &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;      &lt;span class=&quot;n&quot;&gt;stdout&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&lt;&lt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;data&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;stream&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;ss&quot;&gt;:stdout&lt;/span&gt;
                  &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;    &lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
                  &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;    &lt;span class=&quot;nb&quot;&gt;puts&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;#{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;stdout&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;
                  &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;
                  &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;    &lt;span class=&quot;c1&quot;&gt;# run multiple processes in parallel to completion&lt;/span&gt;
                  &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;    &lt;span class=&quot;n&quot;&gt;ssh&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;exec&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'ping -c 1 www.google.com'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
                  &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;    &lt;span class=&quot;n&quot;&gt;ssh&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;exec&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'ping -c 1 www.yahoo.com'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
                  &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;    &lt;span class=&quot;n&quot;&gt;ssh&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;exec&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'ping -c 1 www.rakuten.co.jp'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
                  &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;
                  &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;    &lt;span class=&quot;c1&quot;&gt;#open a new channel and configure a minimal set of callbacks, then wait for the channel to finishes (closees).&lt;/span&gt;
                  &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;    &lt;span class=&quot;n&quot;&gt;channel&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ssh&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;open_channel&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;do&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ch&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;
                  &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;      &lt;span class=&quot;n&quot;&gt;ch&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;exec&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;/usr/local/bin/ruby /path/to/file.rb&quot;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;do&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ch&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;success&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;
                  &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;        &lt;span class=&quot;k&quot;&gt;raise&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;could not execute command&quot;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;unless&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;success&lt;/span&gt;
                  &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;
                  &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;        &lt;span class=&quot;c1&quot;&gt;# &quot;on_data&quot; is called when the process writes something to stdout&lt;/span&gt;
                  &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;        &lt;span class=&quot;n&quot;&gt;ch&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;on_data&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;do&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;
                  &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;          &lt;span class=&quot;vg&quot;&gt;$stdout&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;print&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;
                  &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;        &lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
                  &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;
                  &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;        &lt;span class=&quot;c1&quot;&gt;# &quot;on_extended_data&quot; is called when the process writes something to stderr&lt;/span&gt;
                  &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;        &lt;span class=&quot;n&quot;&gt;ch&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;on_extended_data&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;do&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;
                  &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;          &lt;span class=&quot;vg&quot;&gt;$stderr&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;print&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;
                  &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;        &lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
                  &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;
                  &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;        &lt;span class=&quot;n&quot;&gt;ch&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;on_close&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;puts&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;done!&quot;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
                  &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;      &lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
                  &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;    &lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
                  &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;
                  &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;    &lt;span class=&quot;n&quot;&gt;channel&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;wait&lt;/span&gt;
                  &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;
                  &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;    &lt;span class=&quot;n&quot;&gt;ssh&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;close&lt;/span&gt;
                  &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;    &lt;span class=&quot;no&quot;&gt;EM&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;stop&lt;/span&gt;
                  &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;  &lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
                  &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
                  &lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
                  &lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;
                  
                  &lt;p&gt;See &lt;a href=&quot;http://net-ssh.github.com/ssh/v2/api/index.html&quot;&gt;http://net-ssh.github.com/ssh/v2/api/index.html&lt;/a&gt;&lt;/p&gt;
                  
                  &lt;h2&gt;Shell&lt;/h2&gt;
                  
                  &lt;p&gt;Em-ssh provides an expect-like shell abstraction layer on top of net-ssh in EM::Ssh::Shell&lt;/p&gt;
                  
                  &lt;h3&gt;Example&lt;/h3&gt;
                  
                  &lt;noscript&gt;require 'em-ssh/shell'
                  EM.run {
                    EM::Ssh::Shell.new(host, 'caleb', &quot;&quot;) do |shell|
                      shell.should be_a(EventMachine::Ssh::Shell)
                      shell.wait_for(']$')
                      shell.send_and_wait('uname -a', ']$')
                      shell.wait_for(']$')
                      shell.send_and_wait('/sbin/ifconfig -a', ']$')
                      timer.cancel
                      EM.stop
                    end
                  }
                  &lt;/noscript&gt;
                  &lt;div class=&quot;highlight&quot;&gt;&lt;table&gt;&lt;tr&gt;
                  &lt;td class=&quot;gutter&quot;&gt;&lt;pre class=&quot;line-numbers&quot;&gt;&lt;span class=&quot;line-number&quot;&gt;1&lt;/span&gt;
                  &lt;span class=&quot;line-number&quot;&gt;2&lt;/span&gt;
                  &lt;span class=&quot;line-number&quot;&gt;3&lt;/span&gt;
                  &lt;span class=&quot;line-number&quot;&gt;4&lt;/span&gt;
                  &lt;span class=&quot;line-number&quot;&gt;5&lt;/span&gt;
                  &lt;span class=&quot;line-number&quot;&gt;6&lt;/span&gt;
                  &lt;span class=&quot;line-number&quot;&gt;7&lt;/span&gt;
                  &lt;span class=&quot;line-number&quot;&gt;8&lt;/span&gt;
                  &lt;span class=&quot;line-number&quot;&gt;9&lt;/span&gt;
                  &lt;span class=&quot;line-number&quot;&gt;10&lt;/span&gt;
                  &lt;span class=&quot;line-number&quot;&gt;11&lt;/span&gt;
                  &lt;span class=&quot;line-number&quot;&gt;12&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
                  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb&quot;&gt;require&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'em-ssh/shell'&lt;/span&gt;
                  &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;no&quot;&gt;EM&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;run&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
                  &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;  &lt;span class=&quot;no&quot;&gt;EM&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;Ssh&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;Shell&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;new&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;host&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'caleb'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;do&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;shell&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;
                  &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;    &lt;span class=&quot;n&quot;&gt;shell&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;should&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;be_a&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;EventMachine&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;Ssh&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;Shell&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
                  &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;    &lt;span class=&quot;n&quot;&gt;shell&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;wait_for&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;']$'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
                  &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;    &lt;span class=&quot;n&quot;&gt;shell&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;send_and_wait&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'uname -a'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;']$'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
                  &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;    &lt;span class=&quot;n&quot;&gt;shell&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;wait_for&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;']$'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
                  &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;    &lt;span class=&quot;n&quot;&gt;shell&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;send_and_wait&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'/sbin/ifconfig -a'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;']$'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
                  &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;    &lt;span class=&quot;n&quot;&gt;timer&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cancel&lt;/span&gt;
                  &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;    &lt;span class=&quot;no&quot;&gt;EM&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;stop&lt;/span&gt;
                  &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;  &lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;
                  &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
                  &lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
                  &lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;
                  
                  &lt;h3&gt;Synchrony Example&lt;/h3&gt;
                  
                  &lt;noscript&gt;require 'em-ssh/shell'
                  EM.run {
                    Fiber.new {
                      shell = EM::Ssh::Shell.new(host, 'caleb', '')
                      shell.wait_for(']$')
                      shell.send_and_wait('sudo su -', 'password for caleb: ')
                      shell.send_and_wait('password', ']$')
                      output = shell.send_and_wait('/etc/init.d/openvpn restart', ']$')
                      # ...
                      shell.send_and_wait('exit', ']$')
                      shell.send_data('exit')
                    }.resume
                  }
                  &lt;/noscript&gt;
                  &lt;div class=&quot;highlight&quot;&gt;&lt;table&gt;&lt;tr&gt;
                  &lt;td class=&quot;gutter&quot;&gt;&lt;pre class=&quot;line-numbers&quot;&gt;&lt;span class=&quot;line-number&quot;&gt;1&lt;/span&gt;
                  &lt;span class=&quot;line-number&quot;&gt;2&lt;/span&gt;
                  &lt;span class=&quot;line-number&quot;&gt;3&lt;/span&gt;
                  &lt;span class=&quot;line-number&quot;&gt;4&lt;/span&gt;
                  &lt;span class=&quot;line-number&quot;&gt;5&lt;/span&gt;
                  &lt;span class=&quot;line-number&quot;&gt;6&lt;/span&gt;
                  &lt;span class=&quot;line-number&quot;&gt;7&lt;/span&gt;
                  &lt;span class=&quot;line-number&quot;&gt;8&lt;/span&gt;
                  &lt;span class=&quot;line-number&quot;&gt;9&lt;/span&gt;
                  &lt;span class=&quot;line-number&quot;&gt;10&lt;/span&gt;
                  &lt;span class=&quot;line-number&quot;&gt;11&lt;/span&gt;
                  &lt;span class=&quot;line-number&quot;&gt;12&lt;/span&gt;
                  &lt;span class=&quot;line-number&quot;&gt;13&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
                  &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb&quot;&gt;require&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'em-ssh/shell'&lt;/span&gt;
                  &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;no&quot;&gt;EM&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;run&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
                  &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;  &lt;span class=&quot;no&quot;&gt;Fiber&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
                  &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;    &lt;span class=&quot;n&quot;&gt;shell&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;EM&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;Ssh&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;Shell&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;new&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;host&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'caleb'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;''&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
                  &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;    &lt;span class=&quot;n&quot;&gt;shell&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;wait_for&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;']$'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
                  &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;    &lt;span class=&quot;n&quot;&gt;shell&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;send_and_wait&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'sudo su -'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'password for caleb: '&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
                  &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;    &lt;span class=&quot;n&quot;&gt;shell&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;send_and_wait&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'password'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;']$'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
                  &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;    &lt;span class=&quot;n&quot;&gt;output&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;shell&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;send_and_wait&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'/etc/init.d/openvpn restart'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;']$'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
                  &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;    &lt;span class=&quot;c1&quot;&gt;# ...&lt;/span&gt;
                  &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;    &lt;span class=&quot;n&quot;&gt;shell&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;send_and_wait&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'exit'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;']$'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
                  &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;    &lt;span class=&quot;n&quot;&gt;shell&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;send_data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'exit'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
                  &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;  &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;resume&lt;/span&gt;
                  &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
                  &lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
                  &lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;
                  
                  &lt;h3&gt;Other Examples&lt;/h3&gt;
                  
                  &lt;p&gt;See bin/em-ssh for an example of a basic replacement for system ssh.&lt;/p&gt;
                  
                  &lt;p&gt;See bin/em-ssh-shell for a more complex example usage of Shell.&lt;/p&gt;
                  
                  &lt;h2&gt;Copyright&lt;/h2&gt;
                  
                  &lt;pre&gt;
                  Copyright (c) 2011 Caleb Crane
                  
                  Permission is hereby granted, free of charge, to any person obtaining
                  a copy of this software and associated documentation files (the
                  &quot;Software&quot;), to deal in the Software without restriction, including
                  without limitation the rights to use, copy, modify, merge, publish,
                  distribute, sublicense, and/or sell copies of the Software, and to
                  permit persons to whom the Software is furnished to do so, subject to
                  the following conditions:
                  
                  The above copyright notice and this permission notice shall be
                  included in all copies or substantial portions of the Software.
                  
                  THE SOFTWARE IS PROVIDED &quot;AS IS&quot;, WITHOUT WARRANTY OF ANY KIND,
                  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
                  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
                  NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
                  LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
                  OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
                  WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
                  
                  
                  Portions of this software are Copyright (c) 2008 Jamis Buck&lt;/pre&gt;
                  &lt;/body&gt;&lt;/html&gt;
    </content>
  </entry>
  <entry>
    <id>http://www.simulacre.org/back-in-time-time-machine-for-ubuntu-linux/</id>
    <title>Back in Time: Time Machine for Ubuntu Linux</title>
    <updated>2010-03-07T00:00:00Z</updated>
    <link href='http://www.simulacre.org/back-in-time-time-machine-for-ubuntu-linux/' rel='alternate' type='text/html' />
    <summary>
      Back In Time is a great GUI that reproduces the most important OSX Time Machine features: simple graphical configuration and snapshot backups. The current version (0.9.26) is, unfortunately, broken if you want to back up an entire installation. There is a fix, but the developer has not released it yet. Applying the fix yourself is, fortunately, very easy.
                    
                    Follow the directions below to install Back In Time for Ubuntu and backup your entire drive.
                    
                    Install Back In Time
                    
                    Add the following line to your apt sources file (/etc/apt/sources.list)
                    
                    deb http://le-web.org/repository stable main
                    
                    1
                    
                    deb http://le-web.org/repository stable main
                    
                    
                    
                    Add the GPG key information:
                    
                    clc@lurr:~$ wget http://le-web.org/repository/le-web.key
                    clc@lurr:~$ sudo apt-key add......
    </summary>
    <content type='html'>
      &lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD HTML 4.0 Transitional//EN&quot; &quot;http://www.w3.org/TR/REC-html40/loose.dtd&quot;&gt;
                    &lt;html&gt;&lt;body&gt;
                    &lt;p&gt;&lt;a href=&quot;http://backintime.le-web.org/&quot;&gt;Back In Time&lt;/a&gt; is a great GUI that reproduces the most important OSX Time Machine features: simple graphical configuration and snapshot backups. The current version (0.9.26) is, unfortunately, broken if you want to back up an entire installation. There is a fix, but the developer has not released it yet. Applying the fix yourself is, fortunately, very easy.&lt;/p&gt;
                    
                    &lt;p&gt;Follow the directions below to install Back In Time for Ubuntu and backup your entire drive.&lt;/p&gt;
                    
                    &lt;h2&gt;Install Back In Time&lt;/h2&gt;
                    
                    &lt;p&gt;Add the following line to your apt sources file (/etc/apt/sources.list)&lt;/p&gt;
                    
                    &lt;noscript&gt;deb http://le-web.org/repository stable main
                    &lt;/noscript&gt;
                    &lt;div class=&quot;highlight&quot;&gt;&lt;table&gt;&lt;tr&gt;
                    &lt;td class=&quot;gutter&quot;&gt;&lt;pre class=&quot;line-numbers&quot;&gt;&lt;span class=&quot;line-number&quot;&gt;1&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
                    &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;code class=&quot;bash&quot;&gt;&lt;span class=&quot;line&quot;&gt;deb http://le-web.org/repository stable main
                    &lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
                    &lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;
                    
                    &lt;p&gt;Add the GPG key information:&lt;/p&gt;
                    
                    &lt;noscript&gt;clc@lurr:~$ wget http://le-web.org/repository/le-web.key
                    clc@lurr:~$ sudo apt-key add le-web.key
                    &lt;/noscript&gt;
                    &lt;div class=&quot;highlight&quot;&gt;&lt;table&gt;&lt;tr&gt;
                    &lt;td class=&quot;gutter&quot;&gt;&lt;pre class=&quot;line-numbers&quot;&gt;&lt;span class=&quot;line-number&quot;&gt;1&lt;/span&gt;
                    &lt;span class=&quot;line-number&quot;&gt;2&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
                    &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;code class=&quot;bash&quot;&gt;&lt;span class=&quot;line&quot;&gt;clc@lurr:~&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;wget http://le-web.org/repository/le-web.key
                    &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;clc@lurr:~&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;sudo apt-key add le-web.key
                    &lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
                    &lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;
                    
                    &lt;p&gt;Install the backintime application for Gnome&lt;/p&gt;
                    
                    &lt;noscript&gt;clc@lurr:~$ sudo apt-get update
                    clc@lurr:~$ sudo apt-get install backintime-common backintime-gnome
                    &lt;/noscript&gt;
                    &lt;div class=&quot;highlight&quot;&gt;&lt;table&gt;&lt;tr&gt;
                    &lt;td class=&quot;gutter&quot;&gt;&lt;pre class=&quot;line-numbers&quot;&gt;&lt;span class=&quot;line-number&quot;&gt;1&lt;/span&gt;
                    &lt;span class=&quot;line-number&quot;&gt;2&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
                    &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;code class=&quot;bash&quot;&gt;&lt;span class=&quot;line&quot;&gt;clc@lurr:~&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;sudo apt-get update
                    &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;clc@lurr:~&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;sudo apt-get install backintime-common backintime-gnome
                    &lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
                    &lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;
                    
                    &lt;p&gt;Now the default installation of Back In Time should be installed. You can stop here, but if you want to back up your entire drive starting from the root (&quot;/&quot;), you’ll need to install a patch.&lt;/p&gt;
                    
                    &lt;h2&gt;Download and install the patch&lt;/h2&gt;
                    
                    &lt;noscript&gt;clc@lurr:~$ wget http://launchpadlibrarian.net/35340108/snapshots.py.patch
                      --2010-03-07 12:28:39--  http://launchpadlibrarian.net/35340108/snapshots.py.patch
                      Resolving launchpadlibrarian.net... 91.189.89.228, 91.189.89.229
                      Connecting to launchpadlibrarian.net|91.189.89.228|:80... connected.
                      HTTP request sent, awaiting response... 200 OK
                      Length: 431 [text/plain]
                      Saving to: `snapshots.py.patch'
                    
                      100%[===================================================&gt;] 431      --.-K/s   in 0s      
                    
                      2010-03-07 12:28:40 (13.9 MB/s) - `snapshots.py.patch' saved [431/431]
                    
                    clc@lurr:~$ sudo patch /usr/share/backintime/common/snapshots.py snapshots.py.patch
                      patching file /usr/share/backintime/common/snapshots.py
                    &lt;/noscript&gt;
                    &lt;div class=&quot;highlight&quot;&gt;&lt;table&gt;&lt;tr&gt;
                    &lt;td class=&quot;gutter&quot;&gt;&lt;pre class=&quot;line-numbers&quot;&gt;&lt;span class=&quot;line-number&quot;&gt;1&lt;/span&gt;
                    &lt;span class=&quot;line-number&quot;&gt;2&lt;/span&gt;
                    &lt;span class=&quot;line-number&quot;&gt;3&lt;/span&gt;
                    &lt;span class=&quot;line-number&quot;&gt;4&lt;/span&gt;
                    &lt;span class=&quot;line-number&quot;&gt;5&lt;/span&gt;
                    &lt;span class=&quot;line-number&quot;&gt;6&lt;/span&gt;
                    &lt;span class=&quot;line-number&quot;&gt;7&lt;/span&gt;
                    &lt;span class=&quot;line-number&quot;&gt;8&lt;/span&gt;
                    &lt;span class=&quot;line-number&quot;&gt;9&lt;/span&gt;
                    &lt;span class=&quot;line-number&quot;&gt;10&lt;/span&gt;
                    &lt;span class=&quot;line-number&quot;&gt;11&lt;/span&gt;
                    &lt;span class=&quot;line-number&quot;&gt;12&lt;/span&gt;
                    &lt;span class=&quot;line-number&quot;&gt;13&lt;/span&gt;
                    &lt;span class=&quot;line-number&quot;&gt;14&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
                    &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;code class=&quot;bash&quot;&gt;&lt;span class=&quot;line&quot;&gt;clc@lurr:~&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;wget http://launchpadlibrarian.net/35340108/snapshots.py.patch
                    &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;  --2010-03-07 12:28:39--  http://launchpadlibrarian.net/35340108/snapshots.py.patch
                    &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;  Resolving launchpadlibrarian.net... 91.189.89.228, 91.189.89.229
                    &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;  Connecting to launchpadlibrarian.net|91.189.89.228|:80... connected.
                    &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;  HTTP request sent, awaiting response... 200 OK
                    &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;  Length: 431 &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;text/plain&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;
                    &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;  Saving to: &lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt;snapshots.py.patch&lt;span class=&quot;s1&quot;&gt;'&lt;/span&gt;
                    &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;
                    &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;s1&quot;&gt;  100%[===================================================&gt;] 431      --.-K/s   in 0s      &lt;/span&gt;
                    &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;
                    &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;s1&quot;&gt;  2010-03-07 12:28:40 (13.9 MB/s) - `snapshots.py.patch'&lt;/span&gt; saved &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;431/431&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;
                    &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;
                    &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;clc@lurr:~&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;sudo patch /usr/share/backintime/common/snapshots.py snapshots.py.patch
                    &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;  patching file /usr/share/backintime/common/snapshots.py
                    &lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
                    &lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;
                    
                    &lt;p&gt;Easy as pie. &lt;/p&gt;
                    
                    &lt;h2&gt;Configure Back In Time&lt;/h2&gt;
                    
                    &lt;p&gt;Launch backintime-gnome (assuming your are not using KDE) and configure it.&lt;/p&gt;
                    
                    &lt;noscript&gt;clc@lurr:~$ sudo backintime-gnome
                    &lt;/noscript&gt;
                    &lt;div class=&quot;highlight&quot;&gt;&lt;table&gt;&lt;tr&gt;
                    &lt;td class=&quot;gutter&quot;&gt;&lt;pre class=&quot;line-numbers&quot;&gt;&lt;span class=&quot;line-number&quot;&gt;1&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
                    &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;code class=&quot;bash&quot;&gt;&lt;span class=&quot;line&quot;&gt;clc@lurr:~&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;sudo backintime-gnome
                    &lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
                    &lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;
                    
                    &lt;p&gt;Configure where you want the snapshots stored and how often.&lt;/p&gt;
                    
                    &lt;p&gt;&lt;img src=&quot;http://www.simulacre.org/images/blog/backintime/general.png&quot; alt=&quot;Back In Time Settings - General&quot;&gt;&lt;/p&gt;
                    
                    &lt;p&gt;Tell backintime which directories you want to save. I’m going for my entire drive starting from the root (&quot;/&quot;). &lt;/p&gt;
                    
                    &lt;p&gt;&lt;img src=&quot;http://www.simulacre.org/images/blog/backintime/include.png&quot; alt=&quot;Back In Time Settings: Include&quot;&gt;&lt;/p&gt;
                    
                    &lt;p&gt;Make sure to tell backintime not to backup special directories as well as the directory you use to store the snapshots. Mine’s under /mnt/backup, so excluding /mnt will get the job done.&lt;/p&gt;
                    
                    &lt;p&gt;&lt;img src=&quot;http://www.simulacre.org/images/blog/backintime/exclude.png&quot; alt=&quot;Back In Time Settings: Exclude&quot;&gt;&lt;/p&gt;
                    
                    &lt;h2&gt;Running as Root&lt;/h2&gt;
                    
                    &lt;p&gt;If you want to backup your entire drive you’ll need backintime to run as root from root’s crontab. If you run backintime-gnome using sudo from the command line the config file for backintime won’t be saved in root’s .config directory though. When cron calls backintime it will look for the config and won’t find it, so you should create a link to the config file in root’s home directory.&lt;/p&gt;
                    
                    &lt;noscript&gt;clc@lurr:~$ sudo ln -s ~/.config/backintime/config /home/root/.config/backintime/config
                    &lt;/noscript&gt;
                    &lt;div class=&quot;highlight&quot;&gt;&lt;table&gt;&lt;tr&gt;
                    &lt;td class=&quot;gutter&quot;&gt;&lt;pre class=&quot;line-numbers&quot;&gt;&lt;span class=&quot;line-number&quot;&gt;1&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
                    &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;code class=&quot;bash&quot;&gt;&lt;span class=&quot;line&quot;&gt;clc@lurr:~&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;sudo ln -s ~/.config/backintime/config /home/root/.config/backintime/config
                    &lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
                    &lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;
                    
                    &lt;h2&gt;Debugging Back In Time&lt;/h2&gt;
                    
                    &lt;p&gt;By default the output from Back In Time will be logged to /var/log/syslog. If your snapshots are not being saved as you expect check the syslog log.&lt;/p&gt;
                    
                    &lt;noscript&gt;clc@lurr:~$ tail -f /var/log/syslog
                    &lt;/noscript&gt;
                    &lt;div class=&quot;highlight&quot;&gt;&lt;table&gt;&lt;tr&gt;
                    &lt;td class=&quot;gutter&quot;&gt;&lt;pre class=&quot;line-numbers&quot;&gt;&lt;span class=&quot;line-number&quot;&gt;1&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
                    &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;code class=&quot;bash&quot;&gt;&lt;span class=&quot;line&quot;&gt;clc@lurr:~&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;tail -f /var/log/syslog
                    &lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
                    &lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;
                    
                    &lt;p&gt;I was stymied me for a bit when the cron daemon didn’t seem to be actually running backintime as it should. A quick tail of /var/log/auth.log pointed out that the root account’s password was expired.&lt;/p&gt;
                    
                    &lt;noscript&gt;clc@lurr:~$ tail -f /var/log/auth.log
                    &lt;/noscript&gt;
                    &lt;div class=&quot;highlight&quot;&gt;&lt;table&gt;&lt;tr&gt;
                    &lt;td class=&quot;gutter&quot;&gt;&lt;pre class=&quot;line-numbers&quot;&gt;&lt;span class=&quot;line-number&quot;&gt;1&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
                    &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;code class=&quot;bash&quot;&gt;&lt;span class=&quot;line&quot;&gt;clc@lurr:~&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;tail -f /var/log/auth.log
                    &lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
                    &lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;
                    
                    &lt;h2&gt;Optional: Configure Dedicated Logging&lt;/h2&gt;
                    
                    &lt;p&gt;By default Back In Time will log its progress to /var/log/syslog. That of course means that every time it runs there will be changes to filesystem, therefore, every time it runs it will need to take a snapshot.&lt;/p&gt;
                    
                    &lt;p&gt;You can configure rsyslogd to push Back In Time’s logs to a dedicated file and then include that file in the exclude list.&lt;/p&gt;
                    
                    &lt;p&gt;Create and edit /etc/rsyslog.d/40-backintime.conf&lt;/p&gt;
                    
                    &lt;noscript&gt;clc@lurr:~$ vim /etc/rsyslog.d/40-backintime.conf
                    &lt;/noscript&gt;
                    &lt;div class=&quot;highlight&quot;&gt;&lt;table&gt;&lt;tr&gt;
                    &lt;td class=&quot;gutter&quot;&gt;&lt;pre class=&quot;line-numbers&quot;&gt;&lt;span class=&quot;line-number&quot;&gt;1&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
                    &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;code class=&quot;bash&quot;&gt;&lt;span class=&quot;line&quot;&gt;clc@lurr:~&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;vim /etc/rsyslog.d/40-backintime.conf
                    &lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
                    &lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;
                    
                    &lt;p&gt;Add the following lines&lt;/p&gt;
                    
                    &lt;noscript&gt;if $programname == 'backintime' then /var/log/backintime.log
                    if $programname == 'backintime' then ~
                    &lt;/noscript&gt;
                    &lt;div class=&quot;highlight&quot;&gt;&lt;table&gt;&lt;tr&gt;
                    &lt;td class=&quot;gutter&quot;&gt;&lt;pre class=&quot;line-numbers&quot;&gt;&lt;span class=&quot;line-number&quot;&gt;1&lt;/span&gt;
                    &lt;span class=&quot;line-number&quot;&gt;2&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
                    &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;code class=&quot;bash&quot;&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$programname&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'backintime'&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;then&lt;/span&gt; /var/log/backintime.log
                    &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$programname&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'backintime'&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;then&lt;/span&gt; ~
                    &lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
                    &lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;
                    
                    &lt;p&gt;Restart rsyslogd:&lt;/p&gt;
                    
                    &lt;noscript&gt;clc@lurr:~$ sudo service rsyslog restart
                    &lt;/noscript&gt;
                    &lt;div class=&quot;highlight&quot;&gt;&lt;table&gt;&lt;tr&gt;
                    &lt;td class=&quot;gutter&quot;&gt;&lt;pre class=&quot;line-numbers&quot;&gt;&lt;span class=&quot;line-number&quot;&gt;1&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
                    &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;code class=&quot;bash&quot;&gt;&lt;span class=&quot;line&quot;&gt;clc@lurr:~&lt;span class=&quot;nv&quot;&gt;$ &lt;/span&gt;sudo service rsyslog restart
                    &lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
                    &lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;
                    
                    &lt;h2&gt;Important Note&lt;/h2&gt;
                    
                    &lt;p&gt;As of today, March 7th, 2010, the public release of Back In Time &lt;a href=&quot;http://backintime.le-web.org/download/backintime/backintime-0.9.26_src.tar.gz&quot;&gt;(v0.9.26)&lt;/a&gt; has not been updated to correctly handle taking a snapshot of an entire Ubuntu installation starting from the root directory (&quot;/&quot;). The instructions above are a quick guide for how to correct the issue. Check the &lt;a href=&quot;http://backintime.le-web.org/download_page/&quot;&gt;Back In Time download page&lt;/a&gt; for the latest version of the application as the public release may have been updated.&lt;/p&gt;
                    
                    &lt;h2&gt;Further Reading&lt;/h2&gt;
                    
                    &lt;p&gt;See the &lt;a href=&quot;http://lifehacker.com/5212899/back-in-time-does-full-linux-backups-in-one-click&quot;&gt;April 15th, 2009 LifeHacker article&lt;/a&gt; for a rundown of the features of Back in Time.&lt;/p&gt;
                    &lt;/body&gt;&lt;/html&gt;
    </content>
  </entry>
  <entry>
    <id>http://www.simulacre.org/create-a-2gb-ram-disk-in-osx/</id>
    <title>Create a 2GB RAM Disk in OSX</title>
    <updated>2010-02-26T00:00:00Z</updated>
    <link href='http://www.simulacre.org/create-a-2gb-ram-disk-in-osx/' rel='alternate' type='text/html' />
    <summary>
      diskutil erasevolume HFS+ "ramdisk" `hdiutil attach -nomount ram://4194304`
                      
                      1
                      
                      diskutil erasevolume HFS+ "ramdisk" `hdiutil attach -nomount ram://4194304`
                      
                      
                      
                      The only variable is the number of sectors. Calculate it by (size in MB) * 2048......
    </summary>
    <content type='html'>
      &lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD HTML 4.0 Transitional//EN&quot; &quot;http://www.w3.org/TR/REC-html40/loose.dtd&quot;&gt;
                      &lt;html&gt;&lt;body&gt;
                      &lt;noscript&gt;diskutil erasevolume HFS+ &quot;ramdisk&quot; `hdiutil attach -nomount ram://4194304`
                      &lt;/noscript&gt;
                      &lt;div class=&quot;highlight&quot;&gt;&lt;table&gt;&lt;tr&gt;
                      &lt;td class=&quot;gutter&quot;&gt;&lt;pre class=&quot;line-numbers&quot;&gt;&lt;span class=&quot;line-number&quot;&gt;1&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
                      &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;code class=&quot;bash&quot;&gt;&lt;span class=&quot;line&quot;&gt;diskutil erasevolume HFS+ &lt;span class=&quot;s2&quot;&gt;&quot;ramdisk&quot;&lt;/span&gt; &lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt;hdiutil attach -nomount ram://4194304&lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt;
                      &lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
                      &lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;
                      
                      &lt;p&gt;The only variable is the number of sectors. Calculate it by (size in MB) * 2048&lt;/p&gt;
                      &lt;/body&gt;&lt;/html&gt;
    </content>
  </entry>
  <entry>
    <id>http://www.simulacre.org/valentine-choco/</id>
    <title>Valentine Choco</title>
    <updated>2010-02-14T00:00:00Z</updated>
    <link href='http://www.simulacre.org/valentine-choco/' rel='alternate' type='text/html' />
    <summary>
      
                          
                        
                        Yoshiko completely surprised me this Valentine’s Day with an insane Zoology Chocolate Chimpanzee and two cans of chocolate laced beer. Now I have to find a way to top her for White Day.
                        
                        
                        
                        
                          
                        
                        
                        Figuring out how to eat him without melting chocolate all over my hands and face is only slightly harder than sitting through a Japanese driver’s license renewal class.
                        
                        I guess I could cut him up with a knife, but that wouldn’t be nearly as much fun as eating him bit by bit.
                        
                         
                        ......
    </summary>
    <content type='html'>
      &lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD HTML 4.0 Transitional//EN&quot; &quot;http://www.w3.org/TR/REC-html40/loose.dtd&quot;&gt;
                        &lt;html&gt;&lt;body&gt;
                        &lt;p&gt;&lt;a href=&quot;http://farm3.static.flickr.com/4017/4356459266_43064a732f.jpg&quot;&gt;
                          &lt;img class=&quot;alignnone&quot; title=&quot;Choco Monkey Valentine's Present&quot; src=&quot;http://farm5.static.flickr.com/4017/4356459266_43064a732f_m.jpg&quot; alt=&quot;Choco Monkey&quot; width=&quot;180&quot; height=&quot;240&quot; style=&quot;float:left; margin:0 5px 10px 0&quot;&gt;&lt;/a&gt;
                        Yoshiko completely surprised me this Valentine’s Day with an insane Zoology Chocolate Chimpanzee and two cans of chocolate laced beer. Now I have to find a way to top her for &lt;a href=&quot;http://en.wikipedia.org/wiki/White_Day&quot;&gt;White Day&lt;/a&gt;.&lt;/p&gt;
                        
                        &lt;p style=&quot;clear:both;&quot;&gt;&lt;/p&gt;
                        
                        &lt;p&gt;&lt;a href=&quot;http://farm3.static.flickr.com/2804/4355713517_06582cd49f.jpg&quot;&gt;
                          &lt;img class=&quot;alignnone&quot; title=&quot;Two Monkeys&quot; src=&quot;http://farm3.static.flickr.com/2804/4355713517_06582cd49f_m.jpg&quot; alt=&quot;Me and my choco monkey&quot; width=&quot;184&quot; height=&quot;240&quot; style=&quot;float:left; margin:0 5px 10px 0&quot;&gt;&lt;/a&gt;&lt;/p&gt;
                        
                        &lt;p&gt;Figuring out how to eat him without melting chocolate all over my hands and face is only slightly harder than sitting through a Japanese driver’s license renewal class.&lt;/p&gt;
                        
                        &lt;p&gt;I guess I could cut him up with a knife, but that wouldn’t be nearly as much fun as eating him bit by bit.&lt;/p&gt;
                        
                        &lt;p style=&quot;clear:both;&quot;&gt; &lt;/p&gt;
                        &lt;/body&gt;&lt;/html&gt;
    </content>
  </entry>
  <entry>
    <id>http://www.simulacre.org/turn-li-elements-into-link/</id>
    <title>Turn LI Elements into Links</title>
    <updated>2010-02-10T00:00:00Z</updated>
    <link href='http://www.simulacre.org/turn-li-elements-into-link/' rel='alternate' type='text/html' />
    <summary>
      Horizontal menus of links look great and save space. Building them from UL elements is good practice and makes for easy CSS styline. The LI elements will often contain a link causing them to behave like buttons to trigger a page load.
                          
                          Unfortunately, if the LI elements are setup with a lot of padding there will be a lot of dead space in the button that won't trigger the button's link.
                          
                          
                          
                          You could make the entire button hot by wrapping the LI element in an anchor tag, but that wouldn't be valid: block elements should not be contained in inline elements.
                          
                          Javascript &amp;......
    </summary>
    <content type='html'>
      &lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD HTML 4.0 Transitional//EN&quot; &quot;http://www.w3.org/TR/REC-html40/loose.dtd&quot;&gt;
                          &lt;html&gt;&lt;body&gt;
                          &lt;p&gt;Horizontal menus of links &lt;a href=&quot;http://www.cssdrive.com/index.php/menudesigns/category/C20/&quot; title=&quot;horizontal menus&quot;&gt;look great&lt;/a&gt; and save space. Building them from UL elements is good practice and makes for &lt;a href=&quot;http://www.alistapart.com/articles/horizdropdowns/&quot;&gt;easy CSS styline&lt;/a&gt;. The LI elements will often contain a link causing them to behave like buttons to trigger a page load.&lt;/p&gt;
                          
                          &lt;p&gt;Unfortunately, if the LI elements are setup with a lot of padding there will be a lot of dead space in the button that won't trigger the button's link.&lt;/p&gt;
                          
                          &lt;p&gt;&lt;img src=&quot;http://c5.simulacre.org/blog/images/deadspace.png&quot; alt=&quot;LI Button Dead Space&quot;&gt;&lt;/p&gt;
                          
                          &lt;p&gt;You could make the entire button hot by wrapping the LI element in an anchor tag, but that &lt;a href=&quot;http://www.w3.org/TR/html401/struct/global.html#h-7.5.3&quot;&gt;wouldn't be valid&lt;/a&gt;: block elements should not be contained in inline elements.&lt;/p&gt;
                          
                          &lt;h3&gt;Javascript &amp; MooTools to the Rescue&lt;/h3&gt;
                          
                          &lt;p&gt;Put the anchor inside the LI element and use javascript to assign an onClick event to the LI element.&lt;/p&gt;
                          
                          &lt;noscript&gt;window.addEvent(&quot;domready&quot;, function(){
                            /** Make LIs into links if necessary. */
                            $$(&quot;.horiz-nav li&quot;).each(function(li){
                                var a = li.getFirst(&quot;a&quot;);
                                if(!a) return;
                                    li.addEvent(&quot;click&quot;, function(){
                                        window.location = a.get(&quot;href&quot;);
                                    })
                            });
                          });
                          &lt;/noscript&gt;
                          &lt;div class=&quot;highlight&quot;&gt;&lt;table&gt;&lt;tr&gt;
                          &lt;td class=&quot;gutter&quot;&gt;&lt;pre class=&quot;line-numbers&quot;&gt;&lt;span class=&quot;line-number&quot;&gt;1&lt;/span&gt;
                          &lt;span class=&quot;line-number&quot;&gt;2&lt;/span&gt;
                          &lt;span class=&quot;line-number&quot;&gt;3&lt;/span&gt;
                          &lt;span class=&quot;line-number&quot;&gt;4&lt;/span&gt;
                          &lt;span class=&quot;line-number&quot;&gt;5&lt;/span&gt;
                          &lt;span class=&quot;line-number&quot;&gt;6&lt;/span&gt;
                          &lt;span class=&quot;line-number&quot;&gt;7&lt;/span&gt;
                          &lt;span class=&quot;line-number&quot;&gt;8&lt;/span&gt;
                          &lt;span class=&quot;line-number&quot;&gt;9&lt;/span&gt;
                          &lt;span class=&quot;line-number&quot;&gt;10&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
                          &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;code class=&quot;js&quot;&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb&quot;&gt;window&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;addEvent&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;domready&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(){&lt;/span&gt;
                          &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;  &lt;span class=&quot;cm&quot;&gt;/** Make LIs into links if necessary. */&lt;/span&gt;
                          &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;  &lt;span class=&quot;nx&quot;&gt;$$&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;.horiz-nav li&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;each&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;li&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;){&lt;/span&gt;
                          &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;      &lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;a&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;li&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;getFirst&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;a&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
                          &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;      &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
                          &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;          &lt;span class=&quot;nx&quot;&gt;li&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;addEvent&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;click&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(){&lt;/span&gt;
                          &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;              &lt;span class=&quot;nb&quot;&gt;window&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;location&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;href&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
                          &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;          &lt;span class=&quot;p&quot;&gt;})&lt;/span&gt;
                          &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;  &lt;span class=&quot;p&quot;&gt;});&lt;/span&gt;
                          &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;p&quot;&gt;});&lt;/span&gt;
                          &lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
                          &lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;
                          &lt;/body&gt;&lt;/html&gt;
    </content>
  </entry>
  <entry>
    <id>http://www.simulacre.org/track-downloads-and-exits-using-google-analytics-and-mootools/</id>
    <title>Track Downloads and Exits Using Google Analytics and MooTools</title>
    <updated>2010-02-05T00:00:00Z</updated>
    <link href='http://www.simulacre.org/track-downloads-and-exits-using-google-analytics-and-mootools/' rel='alternate' type='text/html' />
    <summary>
      
                            
                            Last week I recorded 190+ medical engline terminology audio flashcards for Yoshiko and her classmates at Nihon University School of Medicine. They figured that it would be a lot easier to remember the words if they could hear a native speaker pronounce the words and phrases whenever they wanted. That's fine, but I wanted to know when they downloaded the MP3s.
                            
                            By default Google Analytics won't automatically keep track of file downloads. It's pretty darn easy to do it manually though. Just add an onClick event to the anchor that calls:
                            
                            onClick="pageTracker._trackPageview('/download/mp3s.zip');"
                            
                            1
                            
                            onClick="pageTracker._trackPageview('/download/mp3s.zip');"
                            
                            
                            
                            That's pretty easy to do. I could even attach a similar......
    </summary>
    <content type='html'>
      &lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD HTML 4.0 Transitional//EN&quot; &quot;http://www.w3.org/TR/REC-html40/loose.dtd&quot;&gt;
                            &lt;html&gt;&lt;body&gt;
                            &lt;p&gt;&lt;a href=&quot;http://mootools.net/forge/p/exitpoll&quot;&gt;&lt;img src=&quot;http://c5.simulacre.org/exitpoll/images/banner_300x150.png&quot; alt=&quot;ExitPoll&quot;&gt;&lt;/a&gt;&lt;/p&gt;
                            
                            &lt;p&gt;Last week I recorded &lt;a href=&quot;http://meditastic.simulacre.org/&quot;&gt;190+ medical engline terminology&lt;/a&gt; audio flashcards for Yoshiko and her classmates at &lt;a href=&quot;http://www.med.nihon-u.ac.jp/&quot;&gt;Nihon University School of Medicine&lt;/a&gt;. They figured that it would be a lot easier to remember the words if they could hear a native speaker pronounce the words and phrases whenever they wanted. That's fine, but I wanted to know when they downloaded the MP3s.&lt;/p&gt;
                            
                            &lt;p&gt;By default Google Analytics won't automatically keep track of file downloads. It's pretty darn easy to do it manually though. Just add an onClick event to the anchor that calls:&lt;/p&gt;
                            
                            &lt;noscript&gt;onClick=&quot;pageTracker._trackPageview('/download/mp3s.zip');&quot;
                            &lt;/noscript&gt;
                            &lt;div class=&quot;highlight&quot;&gt;&lt;table&gt;&lt;tr&gt;
                            &lt;td class=&quot;gutter&quot;&gt;&lt;pre class=&quot;line-numbers&quot;&gt;&lt;span class=&quot;line-number&quot;&gt;1&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
                            &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;code class=&quot;js&quot;&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nx&quot;&gt;onClick&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;pageTracker._trackPageview('/download/mp3s.zip');&quot;&lt;/span&gt;
                            &lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
                            &lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;
                            
                            &lt;p&gt;That's pretty easy to do. I could even attach a similar event handler to all the links that lead off of my site, e.g., Twitter, in order to see how people left my site.&lt;/p&gt;
                            
                            &lt;p&gt;So it’s simple to add an event handler to the outbound links and downloadable files that I want to track, but it’s just such a pain to remember to add the tracking code every time I add a link. It also makes it a terrible chore if I ever decide to use Googles asynchronous tracking code. I’d have to go back and change syntax for every single link.&lt;/p&gt;
                            
                            &lt;p&gt;Well, 50 lines of code later I’ve got a MooTools module, ExitPoll, that tracks every outbound, or download link on a page. It even checks for the type of Analytics that the page is using: synchronous or asynchronous. That’ll make migrating to asynchronous tracking simple.&lt;/p&gt;
                            
                            &lt;p&gt;&lt;img src=&quot;http://c5.simulacre.org/exitpoll/images/exampleData_464x215.png&quot; alt=&quot;Example Data&quot;&gt;&lt;/p&gt;
                            
                            &lt;p&gt;Anyway, you can download the &lt;a href=&quot;http://github.com/simulacre/ExitPoll/zipball/master&quot;&gt;latest version of ExitPoll&lt;/a&gt; from &lt;a href=&quot;http://github.com/simulacre/ExitPoll&quot;&gt;Github&lt;/a&gt;.&lt;/p&gt;
                            
                            &lt;p&gt;Just drop the module on your webserver, reference it, and then instantiate ExitPoll in your domready event handler.&lt;/p&gt;
                            
                            &lt;noscript&gt;
                            &lt;script src=&quot;exitpoll.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;&lt;script&gt;
                            window.addEvent(&quot;domready&quot;, function(){
                               new ExitPoll({ event : &quot;click&quot; });
                            });
                            &lt;/script&gt;
                            &lt;/noscript&gt;
                            &lt;div class=&quot;highlight&quot;&gt;&lt;table&gt;&lt;tr&gt;
                            &lt;td class=&quot;gutter&quot;&gt;&lt;pre class=&quot;line-numbers&quot;&gt;&lt;span class=&quot;line-number&quot;&gt;1&lt;/span&gt;
                            &lt;span class=&quot;line-number&quot;&gt;2&lt;/span&gt;
                            &lt;span class=&quot;line-number&quot;&gt;3&lt;/span&gt;
                            &lt;span class=&quot;line-number&quot;&gt;4&lt;/span&gt;
                            &lt;span class=&quot;line-number&quot;&gt;5&lt;/span&gt;
                            &lt;span class=&quot;line-number&quot;&gt;6&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
                            &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;code class=&quot;js&quot;&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;o&quot;&gt;&lt;&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;script&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;exitpoll.js&quot;&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;text/javascript&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&gt;&lt;&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;/script&gt;&lt;/span&gt;
                            &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;o&quot;&gt;&lt;&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;script&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&gt;&lt;/span&gt;
                            &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb&quot;&gt;window&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;addEvent&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;domready&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(){&lt;/span&gt;
                            &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;   &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;ExitPoll&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;({&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;event&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;click&quot;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;});&lt;/span&gt;
                            &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;p&quot;&gt;});&lt;/span&gt;
                            &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;o&quot;&gt;&lt;&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;/script&gt;&lt;/span&gt;
                            &lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
                            &lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;
                            
                            &lt;p&gt;Take a look at the &lt;a href=&quot;http://github.com/simulacre/ExitPoll/blob/master/README.md&quot;&gt;README&lt;/a&gt; for a full list of available options.&lt;/p&gt;
                            &lt;/body&gt;&lt;/html&gt;
    </content>
  </entry>
  <entry>
    <id>http://www.simulacre.org/setup-a-content-delivery-network-in-30-minutes/</id>
    <title>Setup a Content Delivery Network in 30 Minutes</title>
    <updated>2010-01-13T00:00:00Z</updated>
    <link href='http://www.simulacre.org/setup-a-content-delivery-network-in-30-minutes/' rel='alternate' type='text/html' />
    <summary>
      Using a Content Delivery Network will cut down on your hosting fees and improve user experience. Most CDNs are expensive. Building your own is horribly expensive and complicated. Google is cheap and easy, but in a good way.
                              
                              
                               Signup for Google App Engine 
                                 Create an app on GAE for your site. 
                              
                                 Download the GAE SDK 
                              
                                 Create a new application on your development machine 
                              
                                 Create images, css, and js directories 
                              
                                
                              application: simulacre-org
                              version: 1
                              runtime: python
                              api_version: 1
                              
                              default_expiration: "3650d 1h"
                              
                              handlers:
                              - url: /css
                                static_dir: css
                              
                              - url: /images
                                static_dir: images
                              
                              -......
    </summary>
    <content type='html'>
      &lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD HTML 4.0 Transitional//EN&quot; &quot;http://www.w3.org/TR/REC-html40/loose.dtd&quot;&gt;
                              &lt;html&gt;&lt;body&gt;
                              &lt;p&gt;Using a Content Delivery Network will cut down on your hosting fees and improve user experience. Most CDNs are expensive. Building your own is horribly expensive and complicated. Google is cheap and easy, but in a good way.&lt;/p&gt;
                              
                              &lt;ol&gt;
                              &lt;li&gt; Signup for &lt;a title=&quot;Google App Engine&quot; href=&quot;http://appengine.google.com/&quot;&gt;Google App Engine&lt;/a&gt; &lt;/li&gt;
                                &lt;li&gt; &lt;a title=&quot;Create GAE application&quot; href=&quot;http://appengine.google.com/start/createapp?&quot;&gt;Create an app&lt;/a&gt; on GAE for your site. &lt;br&gt;&lt;img src=&quot;http://dl.dropbox.com/u/2439349/blog/GAECDN/createAppCheckAvailability.png&quot;&gt;
                              &lt;/li&gt;
                                &lt;li&gt; Download the &lt;a href=&quot;http://code.google.com/appengine/downloads.html&quot;&gt;GAE SDK&lt;/a&gt; &lt;br&gt;&lt;img src=&quot;http://dl.dropbox.com/u/2439349/blog/GAECDN/downloadSDK.png&quot;&gt;
                              &lt;/li&gt;
                                &lt;li&gt; &lt;a href=&quot;http://code.google.com/appengine/downloads.html&quot;&gt;&lt;/a&gt;Create a new application on your development machine &lt;br&gt;&lt;img src=&quot;http://dl.dropbox.com/u/2439349/blog/GAECDN/createLocalApp.png&quot;&gt;
                              &lt;/li&gt;
                                &lt;li&gt; Create images, css, and js directories &lt;img src=&quot;http://dl.dropbox.com/u/2439349/blog/GAECDN/createLocalDirs.png&quot;&gt;
                              &lt;/li&gt;
                                &lt;noscript&gt;
                              application: simulacre-org
                              version: 1
                              runtime: python
                              api_version: 1
                              
                              default_expiration: &quot;3650d 1h&quot;
                              
                              handlers:
                              - url: /css
                                static_dir: css
                              
                              - url: /images
                                static_dir: images
                              
                              - url: /js
                                static_dir: js
                              &lt;/noscript&gt;
                              &lt;li&gt; Open up the app.yaml config file and create handles for the images, css, and js directories. The default_expiration tag is optional, but necessary if you want to use &lt;a title=&quot;Far-future expiration header for browser caching of static content&quot; href=&quot;http://www.askapache.com/htaccess/apache-speed-expires.html&quot;&gt;far-future expiration&lt;/a&gt; for long-term browser caching.
                              
                              &lt;div class=&quot;highlight&quot;&gt;&lt;table&gt;&lt;tr&gt;
                              &lt;td class=&quot;gutter&quot;&gt;&lt;pre class=&quot;line-numbers&quot;&gt;&lt;span class=&quot;line-number&quot;&gt;1&lt;/span&gt;
                              &lt;span class=&quot;line-number&quot;&gt;2&lt;/span&gt;
                              &lt;span class=&quot;line-number&quot;&gt;3&lt;/span&gt;
                              &lt;span class=&quot;line-number&quot;&gt;4&lt;/span&gt;
                              &lt;span class=&quot;line-number&quot;&gt;5&lt;/span&gt;
                              &lt;span class=&quot;line-number&quot;&gt;6&lt;/span&gt;
                              &lt;span class=&quot;line-number&quot;&gt;7&lt;/span&gt;
                              &lt;span class=&quot;line-number&quot;&gt;8&lt;/span&gt;
                              &lt;span class=&quot;line-number&quot;&gt;9&lt;/span&gt;
                              &lt;span class=&quot;line-number&quot;&gt;10&lt;/span&gt;
                              &lt;span class=&quot;line-number&quot;&gt;11&lt;/span&gt;
                              &lt;span class=&quot;line-number&quot;&gt;12&lt;/span&gt;
                              &lt;span class=&quot;line-number&quot;&gt;13&lt;/span&gt;
                              &lt;span class=&quot;line-number&quot;&gt;14&lt;/span&gt;
                              &lt;span class=&quot;line-number&quot;&gt;15&lt;/span&gt;
                              &lt;span class=&quot;line-number&quot;&gt;16&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
                              &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;code class=&quot;yaml&quot;&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;l-Scalar-Plain&quot;&gt;application&lt;/span&gt;&lt;span class=&quot;p-Indicator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;l-Scalar-Plain&quot;&gt;simulacre-org&lt;/span&gt;
                              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;l-Scalar-Plain&quot;&gt;version&lt;/span&gt;&lt;span class=&quot;p-Indicator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;l-Scalar-Plain&quot;&gt;1&lt;/span&gt;
                              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;l-Scalar-Plain&quot;&gt;runtime&lt;/span&gt;&lt;span class=&quot;p-Indicator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;l-Scalar-Plain&quot;&gt;python&lt;/span&gt;
                              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;l-Scalar-Plain&quot;&gt;api_version&lt;/span&gt;&lt;span class=&quot;p-Indicator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;l-Scalar-Plain&quot;&gt;1&lt;/span&gt;
                              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;
                              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;l-Scalar-Plain&quot;&gt;default_expiration&lt;/span&gt;&lt;span class=&quot;p-Indicator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;3650d&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;1h&quot;&lt;/span&gt;
                              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;
                              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;l-Scalar-Plain&quot;&gt;handlers&lt;/span&gt;&lt;span class=&quot;p-Indicator&quot;&gt;:&lt;/span&gt;
                              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;p-Indicator&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;l-Scalar-Plain&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;p-Indicator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;l-Scalar-Plain&quot;&gt;/css&lt;/span&gt;
                              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;  &lt;span class=&quot;l-Scalar-Plain&quot;&gt;static_dir&lt;/span&gt;&lt;span class=&quot;p-Indicator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;l-Scalar-Plain&quot;&gt;css&lt;/span&gt;
                              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;
                              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;p-Indicator&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;l-Scalar-Plain&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;p-Indicator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;l-Scalar-Plain&quot;&gt;/images&lt;/span&gt;
                              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;  &lt;span class=&quot;l-Scalar-Plain&quot;&gt;static_dir&lt;/span&gt;&lt;span class=&quot;p-Indicator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;l-Scalar-Plain&quot;&gt;images&lt;/span&gt;
                              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;
                              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;p-Indicator&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;l-Scalar-Plain&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;p-Indicator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;l-Scalar-Plain&quot;&gt;/js&lt;/span&gt;
                              &lt;/span&gt;&lt;span class=&quot;line&quot;&gt;  &lt;span class=&quot;l-Scalar-Plain&quot;&gt;static_dir&lt;/span&gt;&lt;span class=&quot;p-Indicator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;l-Scalar-Plain&quot;&gt;js&lt;/span&gt;
                              &lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
                              &lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;
                              
                                &lt;/li&gt;
                              &lt;li&gt; Copy all your static content into the images, css and js directories &lt;/li&gt;
                              &lt;li&gt; Deploy the app&lt;br&gt;&lt;img src=&quot;http://dl.dropbox.com/u/2439349/blog/GAECDN/deployApp.png&quot;&gt;
                              &lt;/li&gt;
                              &lt;li&gt; Change all static content references on your site to point to http://[appname].appspot.com/ &lt;/li&gt;
                              &lt;/ol&gt;
                              &lt;h3&gt;Optional, but a darn good idea – Setup a custom domain&lt;/h3&gt;
                              
                              &lt;ol&gt;
                              &lt;li&gt;Setup Google Apps for your domain if you haven't already&lt;/li&gt;
                              &lt;li&gt;Login to your hosting environment and add a &quot;static&quot; subdomain CNAME that points to ghts.google.com., e.g., &lt;em&gt;static.simualcre.org&lt;/em&gt; =&gt; ghs.google.com&lt;/li&gt;
                              &lt;li&gt;Go back to the GAE Dashboard click on Application Settings then under Domain Setup click on Add Domain ... &lt;br&gt;&lt;img src=&quot;http://dl.dropbox.com/u/2439349/blog/GAECDN/addDomain.png&quot; alt=&quot;Add Domain&quot;&gt;
                              &lt;/li&gt;
                              &lt;li&gt;Type in the name of your domain, click the add button and you'll be directed to the login for your Google Apps domain&lt;/li&gt;
                              &lt;li&gt;Accept the Terms and Conditions&lt;/li&gt;
                              &lt;li&gt;Under settings click &lt;em&gt;Add new URL&lt;/em&gt; and enter the subdomain that you setup in stp 2, e.g., &lt;em&gt;static&lt;/em&gt;
                              &lt;/li&gt;
                              &lt;li&gt;If you haven't already completed step 2, do it now then click &lt;em&gt;I've completed these steps&lt;/em&gt;
                              &lt;/li&gt;
                              &lt;li&gt;Change all static content references on your site to point to your subdomain&lt;/li&gt;
                              &lt;li&gt;You're done&lt;/li&gt;
                              &lt;/ol&gt;
                              &lt;p&gt;Setting up the custom domain is a good idea because if you ever decide to stop using Google App Engine you only need to change the CNAME for the subdomain to point to another server that has the content.&lt;/p&gt;
                              
                              &lt;h3&gt;Caveats &amp; Tools&lt;/h3&gt;
                              
                              &lt;ul&gt;
                              &lt;li&gt;While Google App Engine does host your content on multiple servers it does not appear to serve content based on the geographical location of the requester. &lt;/li&gt;
                              &lt;li&gt;Use &lt;a href=&quot;http://www.watchmouse.com/en/ping.php&quot; title=&quot;Ping server from many different geographical locations&quot;&gt;Watchmouse&lt;/a&gt; to figure out if the GAE is serving content based on the requester's geographical location.&lt;/li&gt;
                              &lt;li&gt;If you like Github give &lt;a href=&quot;http://drydrop.binaryage.com/&quot; title=&quot;Github to Google App Engine&quot;&gt;DryDrop&lt;/a&gt; a shot. It pulls your content from Github and pushes it to GAE&lt;/li&gt;
                              &lt;/ul&gt;
                              &lt;/body&gt;&lt;/html&gt;
    </content>
  </entry>
  <entry>
    <id>http://www.simulacre.org/list-of-500-look-alike-kanji/</id>
    <title>List of 500+ Look-Alike Kanji</title>
    <updated>2009-12-18T00:00:00Z</updated>
    <link href='http://www.simulacre.org/list-of-500-look-alike-kanji/' rel='alternate' type='text/html' />
    <summary>
      From the very start KanjiTastic has given you a quick way to retrieve kanji that look similar to the one that you are studying. All you have to do is click on the &#8220;Related Cards&#8221; link at the top of the card then select Similar Kanji.
                                
                                
                                
                                That&#39;s all well and good, but not all kanji have a look-alike kanji connected with them yet. To make it easier to find look-alike kanji you now have access to our list of similar kanji.
                                
                                
                                
                                We&#39;re up to 500+ plus kanji in the similar kanji list, so it&#39;s paginated and has a search box. You can enter either......
    </summary>
    <content type='html'>
      &lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD HTML 4.0 Transitional//EN&quot; &quot;http://www.w3.org/TR/REC-html40/loose.dtd&quot;&gt;
                                &lt;html&gt;&lt;body&gt;
                                &lt;p&gt;From the very start KanjiTastic has given you a quick way to retrieve kanji that look similar to the one that you are studying. All you have to do is click on the “Related Cards” link at the top of the card then select Similar Kanji.&lt;/p&gt;
                                
                                &lt;p&gt;&lt;img style=&quot;margin: 0px 20px; float: left;&quot; src=&quot;http://www.kanjitastic.com/images/blog/simKanji1b.gif&quot; alt=&quot;Click on Related Cards link to retrieve look-alike kanjis and vocabulary&quot; width=&quot;171&quot; height=&quot;133&quot;&gt;&lt;/p&gt;
                                
                                &lt;p&gt;That's all well and good, but not all kanji have a look-alike kanji connected with them yet. To make it easier to find look-alike kanji you now have access to our &lt;a href=&quot;http://www.kanjitastic.com/en/kanji/list/set/Similar_Kanji&quot;&gt;list of similar kanji&lt;/a&gt;.&lt;/p&gt;
                                
                                &lt;p&gt;&lt;img style=&quot;margin: 0 20px; float: right;&quot; src=&quot;http://www.kanjitastic.com/images/blog/simKanji0c.gif&quot; alt=&quot;List of Look-Alike and Similar Kanji&quot; width=&quot;221&quot; height=&quot;170&quot;&gt;&lt;/p&gt;
                                
                                &lt;p&gt;We're up to 500+ plus kanji in the &lt;a href=&quot;http://www.kanjitastic.com/en/kanji/list/set/Similar_Kanji&quot;&gt;similar kanji list&lt;/a&gt;, so it's paginated and has a search box. You can enter either a page number or a kanji in the search box to quickly navigate to either &lt;a href=&quot;http://www.kanjitastic.com/en/kanji/list/set/Similar_Kanji/page/5&quot;&gt;a particular page&lt;/a&gt;, or &lt;a href=&quot;http://www.kanjitastic.com/en/kanji/list/set/Similar_Kanji/index/%E6%8A%BC&quot;&gt;a particular kanji&lt;/a&gt;.&lt;/p&gt;
                                
                                &lt;p&gt;Give it a try.&lt;/p&gt;
                                
                                &lt;div class=&quot;clearfix&quot;&gt; &lt;/div&gt;
                                &lt;/body&gt;&lt;/html&gt;
    </content>
  </entry>
  <entry>
    <id>http://www.simulacre.org/twitter-cli-tools/</id>
    <title>Twitter Cli Tools</title>
    <updated>2009-12-15T00:00:00Z</updated>
    <link href='http://www.simulacre.org/twitter-cli-tools/' rel='alternate' type='text/html' />
    <summary>
      Just finished putting a little polish on a few Twitter command line tools that integrate nicely with GeekTool
                                  
                                  
                                    
                                  
                                  
                                  twitter.php : Pull your friend_timeline from twitter. You can either setup your username and password directly in the script or pass them as command line options.  Run ./twitter.php -h for a list of all the command line options.
                                  
                                  twitterSearch.php : Search twitter for specific keyword(s). Try ./twitterSearch.php -s javascript,mootools for most recent posts that contain either the word javascript, or mootools.
                                  
                                  twitterTimeline.php : Pull a specific user&#39;s timeline. I use it to monitor @ITJobsTweetUS without actually following them (they post so much that I......
    </summary>
    <content type='html'>
      &lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD HTML 4.0 Transitional//EN&quot; &quot;http://www.w3.org/TR/REC-html40/loose.dtd&quot;&gt;
                                  &lt;html&gt;&lt;body&gt;
                                  &lt;p&gt;Just finished putting a little polish on a few &lt;a href=&quot;http://dl.dropbox.com/u/2439349/TwitterCLI.zip&quot;&gt;Twitter command line tools&lt;/a&gt; that integrate nicely with GeekTool&lt;/p&gt;
                                  
                                  &lt;p&gt;&lt;a href=&quot;http://posterous.com/getfile/files.posterous.com/calebcrane/uHujR1P7Dmxxdm42ynoBDIc7gaqULauBvNesztvoRlmIbh0AJDBtlwrqMpdO/Twitter_CLI_Tools_and_GeekTool.png.scaled.1000.jpg&quot;&gt;
                                    &lt;img src=&quot;http://posterous.com/getfile/files.posterous.com/calebcrane/KvjMtmGAFScFFj2QhSUJEkohT0tymfzSf1MAgd1uyTauLfi1WBzHDsqWeI3H/Twitter_CLI_Tools_and_GeekTool.png.scaled.500.jpg&quot; alt=&quot;Twitter CLI Tools Screenshot&quot;&gt;&lt;/a&gt;&lt;/p&gt;
                                  
                                  &lt;p&gt;&lt;a href=&quot;https://github.com/simulacre/twitter-cli/blob/master/twitter.php&quot;&gt;twitter.php&lt;/a&gt; : Pull your friend_timeline from twitter. You can either setup your username and password directly in the script or pass them as command line options.  Run &lt;em&gt;./twitter.php -h&lt;/em&gt; for a list of all the command line options.&lt;/p&gt;
                                  
                                  &lt;p&gt;&lt;a href=&quot;https://github.com/simulacre/twitter-cli/blob/master/twitterSearch.php&quot;&gt;twitterSearch.php&lt;/a&gt; : Search twitter for specific keyword(s). Try &lt;em&gt;./twitterSearch.php -s&lt;/em&gt; javascript,mootools for most recent posts that contain either the word javascript, or mootools.&lt;/p&gt;
                                  
                                  &lt;p&gt;&lt;a href=&quot;https://github.com/simulacre/twitter-cli/blob/master/twitterTimeline.php&quot;&gt;twitterTimeline.php&lt;/a&gt; : Pull a specific user's timeline. I use it to monitor &lt;a href=&quot;http://twitter.com/ITJobsTweetUS&quot;&gt;@ITJobsTweetUS&lt;/a&gt; without actually following them (they post so much that I loose track of my friend's posts).&lt;/p&gt;
                                  
                                  &lt;p&gt;Anyway, all the tools integrate well with GeekTool and support a few command line switches. Just run the tool with -h to get a rundown of the options. Only twitter.php requires you to provide a username and password. They all require that you have curl installed and in your path. If you're running OSX you're fine out-of-the-box. Most Linux distros will be fine too. Oh, you'll also need to have php in, or linked from /usr/bin/&lt;/p&gt;
                                  
                                  &lt;p&gt;&lt;a href=&quot;https://github.com/simulacre/twitter-cli&quot;&gt;https://github.com/simulacre/twitter-cli&lt;/a&gt;&lt;/p&gt;
                                  &lt;/body&gt;&lt;/html&gt;
    </content>
  </entry>
</feed>
