<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">

    <title>Matt Read, Notes?</title>
    <link href="http://mattread.org/atom.xml" rel="self"/>
    <link href="http://mattread.org/"/>
    <updated>2010-09-26T20:52:46-07:00</updated>
    <id>http://mattread.com</id>
    <author>
        <name>Matt Read</name>
        <email>matt@mattread.com</email>
    </author>

    
    <entry>
        <title>Ephyboy, The Epiphany Tomboy Extension</title>
        <link href="http://mattread.org/notes/ephyboy-extension.html"/>
        <updated>2010-09-10T00:00:00-07:00</updated>
        <id>http://mattread.org./notes/ephyboy-extension</id>
        <content type="html">&lt;p&gt;Back in the day when I used to use &lt;a href='http://getfirefox.com'&gt;Firefox&lt;/a&gt;, I fell in love with the &lt;a href='https://addons.mozilla.org/en-US/firefox/addon/8276/'&gt;Tomfox extension&lt;/a&gt;. It allowed you to create a new &lt;a href='http://projects.gnome.org/tomboy/'&gt;Tomboy&lt;/a&gt; note using the currently selected text of the webpage you were browsing, using the title for the title of the note and referencing the url as the source. This was great for me to document all the code and Linux commands I&amp;#8217;d find scattered around the net.&lt;/p&gt;

&lt;p&gt;Eventually, though, I got tired of Firefox, especially it&amp;#8217;s load times, and switched to &lt;a href='http://www.chromium.org/'&gt;Chromium&lt;/a&gt;. You guessed it, Chromium sucked too. So back to &lt;a href='http://projects.gnome.org/epiphany/'&gt;Epiphany&lt;/a&gt; I went, and with the 2.30 version it is really quite a nice little browser.&lt;/p&gt;

&lt;p&gt;Epiphany extensions are now done with &lt;a href='http://live.gnome.org/Seed'&gt;Seed&lt;/a&gt;, the GTK javascript bindings, making it really easy to write new extensions. Plus, it has almost a complete GTK implementation via GObject Introspection. So getting my tomboy note maker dohicky back was really not that hard &amp;#8211; aside from the lack of documentation. And thus, &lt;a href='http://github.com/MattRead/Ephyboy'&gt;Ephyboy&lt;/a&gt; is born; It&amp;#8217;s really quite simple:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href='http://github.com/MattRead/Ephyboy/downloads'&gt;Download&lt;/a&gt; the tarball, or zip.&lt;/li&gt;

&lt;li&gt;&lt;a href='http://github.com/MattRead/Ephyboy/wiki'&gt;Install&lt;/a&gt; the extension.&lt;/li&gt;

&lt;li&gt;Enable the extension (&lt;em&gt;no restart required!&lt;/em&gt;).&lt;/li&gt;

&lt;li&gt;Select some text to add in your note.&lt;/li&gt;

&lt;li&gt;Hit &lt;code&gt;CTRL+Shift+B&lt;/code&gt;; Or, add the Tomboy Note button to the toolbar and click the button.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The extension will then create your note and open your note in &lt;a href='http://projects.gnome.org/tomboy/'&gt;Tomboy&lt;/a&gt; for review and/or further editing.&lt;/p&gt;

&lt;p&gt;There is one thing to note. The extension works by making a DBus call to Tomboy to create the note so you have to have Tomboy open and connected to the bus for this to work. Usually not a problem as I have Tomboy start on log in.&lt;/p&gt;</content>
    </entry>
    
    <entry>
        <title>Add a Menu and Toolbar Item to Epiphany</title>
        <link href="http://mattread.org/snippets/add-menu-toolbar-item-epiphany.html"/>
        <updated>2010-09-10T00:00:00-07:00</updated>
        <id>http://mattread.org./snippets/add-menu-toolbar-item-epiphany</id>
        <content type="html">&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='javascript'&gt;&lt;span class='c1'&gt;// create the tomboy icon&lt;/span&gt;
&lt;span class='kd'&gt;var&lt;/span&gt; &lt;span class='nx'&gt;f&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='k'&gt;new&lt;/span&gt; &lt;span class='nx'&gt;Gtk&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;IconFactory&lt;/span&gt;&lt;span class='p'&gt;();&lt;/span&gt;
&lt;span class='nx'&gt;f&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;add&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;tomboy&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='k'&gt;new&lt;/span&gt; &lt;span class='nx'&gt;Gtk&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;IconSet&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;from_pixbuf&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;
      &lt;span class='k'&gt;new&lt;/span&gt; &lt;span class='nx'&gt;GdkPixbuf&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;Pixbuf&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;from_file&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;icon.svg&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
&lt;span class='p'&gt;));&lt;/span&gt;
&lt;span class='nx'&gt;f&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;add_default&lt;/span&gt;&lt;span class='p'&gt;();&lt;/span&gt;

&lt;span class='c1'&gt;// Create the action and group to add to menubar&lt;/span&gt;
&lt;span class='kd'&gt;var&lt;/span&gt; &lt;span class='nx'&gt;action&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='k'&gt;new&lt;/span&gt; &lt;span class='nx'&gt;Gtk&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;Action&lt;/span&gt;&lt;span class='p'&gt;({&lt;/span&gt;
    &lt;span class='nx'&gt;name&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;TomboyNote&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;
    &lt;span class='nx'&gt;label&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;_Tomboy Note&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;
    &lt;span class='nx'&gt;tooltip&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;Create a Tomboy note from selection&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;
    &lt;span class='nx'&gt;stock_id&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;tomboy&amp;#39;&lt;/span&gt;
&lt;span class='p'&gt;});&lt;/span&gt;
&lt;span class='nx'&gt;action&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;signal&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;activate&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;connect&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nx'&gt;create_tomboy_note&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='nb'&gt;window&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
&lt;span class='kd'&gt;var&lt;/span&gt; &lt;span class='nx'&gt;group&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='k'&gt;new&lt;/span&gt; &lt;span class='nx'&gt;Gtk&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;ActionGroup&lt;/span&gt;&lt;span class='p'&gt;({&lt;/span&gt;&lt;span class='nx'&gt;name&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;TomboyNoteActionGroup&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;});&lt;/span&gt;
&lt;span class='nx'&gt;group&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;add_action&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nx'&gt;action&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;

&lt;span class='kd'&gt;var&lt;/span&gt; &lt;span class='nx'&gt;ui_manager&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='nb'&gt;window&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;get_ui_manager&lt;/span&gt;&lt;span class='p'&gt;();&lt;/span&gt;
&lt;span class='nx'&gt;ui_manager&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;insert_action_group&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nx'&gt;group&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='mi'&gt;0&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
&lt;span class='kd'&gt;var&lt;/span&gt; &lt;span class='nx'&gt;merge_id&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='nx'&gt;ui_manager&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;new_merge_id&lt;/span&gt;&lt;span class='p'&gt;();&lt;/span&gt;
&lt;span class='nx'&gt;ui_manager&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;add_ui&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nx'&gt;merge_id&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;/menubar/ToolsMenu&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;TomboyNoteMenu&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;
                  &lt;span class='s2'&gt;&amp;quot;TomboyNote&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='nx'&gt;Gtk&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;UIManagerItemType&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;MENUITEM&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='kc'&gt;false&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;

&lt;span class='c1'&gt;// store everything so we can remove it on detach&lt;/span&gt;
&lt;span class='nb'&gt;window&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;_tomboy_menu&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
    &lt;span class='nx'&gt;ui_manager&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='nx'&gt;ui_manager&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;
    &lt;span class='nx'&gt;merge_id&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='nx'&gt;merge_id&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;
    &lt;span class='nx'&gt;action&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='nx'&gt;action&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;
    &lt;span class='nx'&gt;group&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='nx'&gt;group&lt;/span&gt;
&lt;span class='p'&gt;};&lt;/span&gt;

&lt;span class='kd'&gt;var&lt;/span&gt; &lt;span class='nx'&gt;model&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='nx'&gt;Epiphany&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;EphyShell&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;get_default&lt;/span&gt;&lt;span class='p'&gt;().&lt;/span&gt;&lt;span class='nx'&gt;get_toolbars_model&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='kc'&gt;false&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
&lt;span class='nx'&gt;model&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;set_name_flags&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;TomboyNote&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='mi'&gt;4&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt; &lt;span class='c1'&gt;// EGG_TB_MODEL_NAME_KNOWN&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;</content>
    </entry>
    
    <entry>
        <title>Javascript Prototype Behaviour in PHP</title>
        <link href="http://mattread.org/notes/javascript-prototype-behaviour-in-php.html"/>
        <updated>2010-09-09T00:00:00-07:00</updated>
        <id>http://mattread.org./notes/javascript-prototype-behaviour-in-php</id>
        <content type="html">&lt;p&gt;One of the &amp;#8220;neat&amp;#8221; things in Javascript is you are able to dynamically add or change methods of a class and automatically update every instance of that class. Some of the things I usually find useful are adding to the String class, like so:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='javascript'&gt;&lt;span class='nb'&gt;String&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;prototype&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;htmlSpecialChars&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='kd'&gt;function&lt;/span&gt;&lt;span class='p'&gt;()&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
    &lt;span class='k'&gt;return&lt;/span&gt; &lt;span class='k'&gt;this&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;replace&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='sr'&gt;/\&amp;lt;/g&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;&amp;amp;#060;&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;).&lt;/span&gt;&lt;span class='nx'&gt;replace&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='sr'&gt;/\&amp;gt;/g&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;&amp;amp;#062;&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
&lt;span class='p'&gt;}&lt;/span&gt;
&lt;span class='nb'&gt;String&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;prototype&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;trim&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='kd'&gt;function&lt;/span&gt;&lt;span class='p'&gt;()&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
    &lt;span class='k'&gt;return&lt;/span&gt; &lt;span class='k'&gt;this&lt;/span&gt;&lt;span class='p'&gt;.&lt;/span&gt;&lt;span class='nx'&gt;replace&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='sr'&gt;/^\s+|\s+$/g&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
&lt;span class='p'&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Obviously we cannot do this in PHP, and why would we, right? However we can emulate this behaviour to a certain extent using my &amp;#8220;neat&amp;#8221; little &lt;a href='http://mattread.org/snippets/php/php-prototype-class.html'&gt;Prototype&lt;/a&gt; class. With this Prototype class we can dynamically add properties and methods to any class, and they will be inherited by all instances of that class. Let&amp;#8217;s look at the following &amp;#8220;normal&amp;#8221; PHP code.&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='php5'&gt;&lt;span class='cp'&gt;&amp;lt;?php&lt;/span&gt;

&lt;span class='k'&gt;class&lt;/span&gt; &lt;span class='nc'&gt;Person&lt;/span&gt; &lt;span class='k'&gt;extends&lt;/span&gt; &lt;span class='nx'&gt;Prototype&lt;/span&gt;
&lt;span class='p'&gt;{&lt;/span&gt;
    &lt;span class='k'&gt;public&lt;/span&gt; &lt;span class='nv'&gt;$name&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
    &lt;span class='k'&gt;public&lt;/span&gt; &lt;span class='nv'&gt;$gender&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;

    &lt;span class='k'&gt;public&lt;/span&gt; &lt;span class='k'&gt;function&lt;/span&gt; &lt;span class='nf'&gt;gender&lt;/span&gt;&lt;span class='p'&gt;()&lt;/span&gt;
    &lt;span class='p'&gt;{&lt;/span&gt;
        &lt;span class='nb'&gt;printf&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;%s is %s&lt;/span&gt;&lt;span class='se'&gt;\n&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='nv'&gt;$this&lt;/span&gt;&lt;span class='o'&gt;-&amp;gt;&lt;/span&gt;&lt;span class='na'&gt;name&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='nv'&gt;$this&lt;/span&gt;&lt;span class='o'&gt;-&amp;gt;&lt;/span&gt;&lt;span class='na'&gt;gender&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
    &lt;span class='p'&gt;}&lt;/span&gt;
&lt;span class='p'&gt;}&lt;/span&gt;

&lt;span class='nv'&gt;$matt&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='k'&gt;new&lt;/span&gt; &lt;span class='nx'&gt;Person&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
&lt;span class='nv'&gt;$matt&lt;/span&gt;&lt;span class='o'&gt;-&amp;gt;&lt;/span&gt;&lt;span class='na'&gt;name&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;Matt&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
&lt;span class='nv'&gt;$matt&lt;/span&gt;&lt;span class='o'&gt;-&amp;gt;&lt;/span&gt;&lt;span class='na'&gt;gender&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;male&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
&lt;span class='nv'&gt;$matt&lt;/span&gt;&lt;span class='o'&gt;-&amp;gt;&lt;/span&gt;&lt;span class='na'&gt;gender&lt;/span&gt;&lt;span class='p'&gt;();&lt;/span&gt;

&lt;span class='c1'&gt;// Matt is male&lt;/span&gt;

&lt;span class='cp'&gt;?&amp;gt;&lt;/span&gt;&lt;span class='x' /&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Now, there is nothing magical or out-of-the-ordinary going on here. We just instantiate the Person class and setup some properties. Calling the &lt;code class='highlight php'&gt;gender()&lt;/code&gt; method outputs a nice little string for us.&lt;/p&gt;

&lt;p&gt;However, you see that the Person class is actually a child of the Prototype class. This will allow us to do some of that &amp;#8220;neat&amp;#8221; Javascript stuff. Using Prototype, let us expand the Person class to add an &lt;code&gt;$age&lt;/code&gt; property and an &lt;code&gt;age()&lt;/code&gt; method to output a nice string. Like so:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='php5'&gt;&lt;span class='cp'&gt;&amp;lt;?php&lt;/span&gt;

&lt;span class='nx'&gt;Person&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='na'&gt;add_property&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;age&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
&lt;span class='nx'&gt;Person&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='na'&gt;add_method&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;age&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;printf(&amp;quot;%s is a %d year old %s\n&amp;quot;, $this-&amp;gt;name, $this-&amp;gt;age, $this-&amp;gt;gender);&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;

&lt;span class='nv'&gt;$matt&lt;/span&gt;&lt;span class='o'&gt;-&amp;gt;&lt;/span&gt;&lt;span class='na'&gt;age&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='m'&gt;28&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
&lt;span class='nv'&gt;$matt&lt;/span&gt;&lt;span class='o'&gt;-&amp;gt;&lt;/span&gt;&lt;span class='na'&gt;age&lt;/span&gt;&lt;span class='p'&gt;();&lt;/span&gt;

&lt;span class='c1'&gt;// Matt is a 28 year old male&lt;/span&gt;

&lt;span class='cp'&gt;?&amp;gt;&lt;/span&gt;&lt;span class='x' /&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Now all instances of Person inherit the &lt;code&gt;$age&lt;/code&gt; property and &lt;code&gt;age()&lt;/code&gt; method. So we can create a new Person, Susie, and this object will now have the age stuff.&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='php5'&gt;&lt;span class='cp'&gt;&amp;lt;?php&lt;/span&gt;

&lt;span class='nv'&gt;$susie&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='k'&gt;new&lt;/span&gt; &lt;span class='nx'&gt;Person&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
&lt;span class='nv'&gt;$susie&lt;/span&gt;&lt;span class='o'&gt;-&amp;gt;&lt;/span&gt;&lt;span class='na'&gt;name&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;Susie&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
&lt;span class='nv'&gt;$susie&lt;/span&gt;&lt;span class='o'&gt;-&amp;gt;&lt;/span&gt;&lt;span class='na'&gt;gender&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;female&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
&lt;span class='nv'&gt;$susie&lt;/span&gt;&lt;span class='o'&gt;-&amp;gt;&lt;/span&gt;&lt;span class='na'&gt;age&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='m'&gt;21&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
&lt;span class='nv'&gt;$susie&lt;/span&gt;&lt;span class='o'&gt;-&amp;gt;&lt;/span&gt;&lt;span class='na'&gt;age&lt;/span&gt;&lt;span class='p'&gt;();&lt;/span&gt;

&lt;span class='c1'&gt;// Susie is a 21 year old female&lt;/span&gt;

&lt;span class='cp'&gt;?&amp;gt;&lt;/span&gt;&lt;span class='x' /&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;One limitation of the Prototype class though, is you cannot overload a current method. So the following code, that attempts to overload the &lt;code class='highlight php'&gt;gender()&lt;/code&gt; method, will not work.&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='php5'&gt;&lt;span class='cp'&gt;&amp;lt;?php&lt;/span&gt;

&lt;span class='nx'&gt;Person&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='na'&gt;add_method&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;gender&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;printf(&amp;quot;%s is a %d year old %s\n&amp;quot;, $this-&amp;gt;name, $this-&amp;gt;age, $this-&amp;gt;gender);&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;

&lt;span class='nv'&gt;$matt&lt;/span&gt;&lt;span class='o'&gt;-&amp;gt;&lt;/span&gt;&lt;span class='na'&gt;gender&lt;/span&gt;&lt;span class='p'&gt;();&lt;/span&gt;

&lt;span class='c1'&gt;// Matt is male&lt;/span&gt;

&lt;span class='cp'&gt;?&amp;gt;&lt;/span&gt;&lt;span class='x' /&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;There are also many, many, many other problems with this Prototype class. Some of which are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The &amp;#8216;$this&amp;#8217; keyword is reserved, so it actually does a string replace and uses &amp;#8216;$self&amp;#8217; instead.&lt;/li&gt;

&lt;li&gt;You cannot access/add new methods or properties statically (until PHP 5.3 with &lt;code&gt;__callStatic()&lt;/code&gt;).&lt;/li&gt;

&lt;li&gt;It uses &lt;code&gt;create_function&lt;/code&gt;, so every &amp;#8220;method&amp;#8221; is actually defined in the global namespace.&lt;/li&gt;

&lt;li&gt;Iteration does not work, although it could possibly be done with Iterator, Countable, et al.&lt;/li&gt;

&lt;li&gt;You cannot reference static variables/methods in your add method.&lt;/li&gt;

&lt;li&gt;You cannot share methods between classes.&lt;/li&gt;

&lt;li&gt;And so on and so forth&amp;#8230;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This class was just an experiment to see if it was at all possible to implement something like Javascript&amp;#8217;s prototype behaviour in PHP with out using the &lt;a href='http://pecl.php.net/package/runkit'&gt;Runkit PECL extension&lt;/a&gt;. I had no intention of actually making this usable in production, for many reasons; Although it was fun.&lt;/p&gt;</content>
    </entry>
    
    <entry>
        <title>PHP Prototype Class</title>
        <link href="http://mattread.org/snippets/php-prototype-class.html"/>
        <updated>2010-09-08T00:00:00-07:00</updated>
        <id>http://mattread.org./snippets/php-prototype-class</id>
        <content type="html">&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='php'&gt;&lt;span class='cp'&gt;&amp;lt;?php&lt;/span&gt;

&lt;span class='k'&gt;class&lt;/span&gt; &lt;span class='nc'&gt;Prototype&lt;/span&gt;
&lt;span class='p'&gt;{&lt;/span&gt;
    &lt;span class='k'&gt;protected&lt;/span&gt; &lt;span class='k'&gt;static&lt;/span&gt; &lt;span class='nv'&gt;$prototype_methods&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='k'&gt;array&lt;/span&gt;&lt;span class='p'&gt;();&lt;/span&gt;
    &lt;span class='k'&gt;protected&lt;/span&gt; &lt;span class='k'&gt;static&lt;/span&gt; &lt;span class='nv'&gt;$prototype_properties&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='k'&gt;array&lt;/span&gt;&lt;span class='p'&gt;();&lt;/span&gt;

    &lt;span class='k'&gt;protected&lt;/span&gt; &lt;span class='nv'&gt;$prototype_obj_properties&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='k'&gt;array&lt;/span&gt;&lt;span class='p'&gt;();&lt;/span&gt;

    &lt;span class='k'&gt;public&lt;/span&gt; &lt;span class='k'&gt;static&lt;/span&gt; &lt;span class='k'&gt;function&lt;/span&gt; &lt;span class='nf'&gt;add_method&lt;/span&gt;&lt;span class='p'&gt;()&lt;/span&gt;
    &lt;span class='p'&gt;{&lt;/span&gt;
        &lt;span class='nv'&gt;$args&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='nb'&gt;func_get_args&lt;/span&gt;&lt;span class='p'&gt;();&lt;/span&gt;
        &lt;span class='nv'&gt;$method&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='nb'&gt;array_shift&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt; &lt;span class='nv'&gt;$args&lt;/span&gt; &lt;span class='p'&gt;);&lt;/span&gt;
        &lt;span class='nv'&gt;$callback&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='nb'&gt;str_replace&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;$this&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;$self&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='nb'&gt;array_pop&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt; &lt;span class='nv'&gt;$args&lt;/span&gt; &lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;);&lt;/span&gt;
        &lt;span class='nb'&gt;array_push&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt; &lt;span class='nv'&gt;$args&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;$self&amp;#39;&lt;/span&gt; &lt;span class='p'&gt;);&lt;/span&gt;
        &lt;span class='nv'&gt;$args&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='nb'&gt;implode&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;,&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='nv'&gt;$args&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;

        &lt;span class='nx'&gt;self&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='nv'&gt;$prototype_methods&lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;$method&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='nb'&gt;create_function&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt; &lt;span class='nv'&gt;$args&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='nv'&gt;$callback&lt;/span&gt; &lt;span class='p'&gt;);&lt;/span&gt;
    &lt;span class='p'&gt;}&lt;/span&gt;

    &lt;span class='k'&gt;public&lt;/span&gt; &lt;span class='k'&gt;static&lt;/span&gt; &lt;span class='k'&gt;function&lt;/span&gt; &lt;span class='nf'&gt;add_property&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt; &lt;span class='nv'&gt;$name&lt;/span&gt; &lt;span class='p'&gt;)&lt;/span&gt;
    &lt;span class='p'&gt;{&lt;/span&gt;
        &lt;span class='nx'&gt;self&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='nv'&gt;$prototype_properties&lt;/span&gt;&lt;span class='p'&gt;[]&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='nv'&gt;$name&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
    &lt;span class='p'&gt;}&lt;/span&gt;

    &lt;span class='k'&gt;public&lt;/span&gt; &lt;span class='k'&gt;function&lt;/span&gt; &lt;span class='nf'&gt;__construct&lt;/span&gt;&lt;span class='p'&gt;()&lt;/span&gt;
    &lt;span class='p'&gt;{&lt;/span&gt;
        &lt;span class='k'&gt;if&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt; &lt;span class='nx'&gt;self&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='nv'&gt;$prototype_properties&lt;/span&gt; &lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
            &lt;span class='nv'&gt;$this&lt;/span&gt;&lt;span class='o'&gt;-&amp;gt;&lt;/span&gt;&lt;span class='na'&gt;prototype_obj_properties&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='nb'&gt;array_combine&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;
                &lt;span class='nx'&gt;self&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='nv'&gt;$prototype_properties&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;
                &lt;span class='nb'&gt;array_fill&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt; &lt;span class='m'&gt;0&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='nb'&gt;count&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nx'&gt;self&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='nv'&gt;$prototype_properties&lt;/span&gt;&lt;span class='p'&gt;),&lt;/span&gt; &lt;span class='k'&gt;null&lt;/span&gt; &lt;span class='p'&gt;)&lt;/span&gt;
                &lt;span class='p'&gt;);&lt;/span&gt;
        &lt;span class='p'&gt;}&lt;/span&gt;
    &lt;span class='p'&gt;}&lt;/span&gt;

    &lt;span class='k'&gt;public&lt;/span&gt; &lt;span class='k'&gt;function&lt;/span&gt; &lt;span class='nf'&gt;__call&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt; &lt;span class='nv'&gt;$method&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='nv'&gt;$args&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='k'&gt;array&lt;/span&gt;&lt;span class='p'&gt;()&lt;/span&gt; &lt;span class='p'&gt;)&lt;/span&gt;
    &lt;span class='p'&gt;{&lt;/span&gt;
        &lt;span class='k'&gt;if&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt; &lt;span class='nb'&gt;isset&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt; &lt;span class='nx'&gt;self&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='nv'&gt;$prototype_methods&lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;$method&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt; &lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
            &lt;span class='nb'&gt;array_push&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt; &lt;span class='nv'&gt;$args&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='nv'&gt;$this&lt;/span&gt; &lt;span class='p'&gt;);&lt;/span&gt;
            &lt;span class='k'&gt;return&lt;/span&gt; &lt;span class='nb'&gt;call_user_func_array&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt; &lt;span class='nx'&gt;self&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='nv'&gt;$prototype_methods&lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;$method&lt;/span&gt;&lt;span class='p'&gt;],&lt;/span&gt; &lt;span class='nv'&gt;$args&lt;/span&gt; &lt;span class='p'&gt;);&lt;/span&gt;
        &lt;span class='p'&gt;}&lt;/span&gt;
    &lt;span class='p'&gt;}&lt;/span&gt;

    &lt;span class='k'&gt;public&lt;/span&gt; &lt;span class='k'&gt;function&lt;/span&gt; &lt;span class='nf'&gt;__get&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt; &lt;span class='nv'&gt;$name&lt;/span&gt; &lt;span class='p'&gt;)&lt;/span&gt;
    &lt;span class='p'&gt;{&lt;/span&gt;
        &lt;span class='k'&gt;if&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt; &lt;span class='nb'&gt;in_array&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt; &lt;span class='nv'&gt;$name&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='nx'&gt;self&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='nv'&gt;$prototype_properties&lt;/span&gt; &lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
            &lt;span class='k'&gt;return&lt;/span&gt; &lt;span class='nb'&gt;isset&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt; &lt;span class='nv'&gt;$this&lt;/span&gt;&lt;span class='o'&gt;-&amp;gt;&lt;/span&gt;&lt;span class='na'&gt;prototype_obj_properties&lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;$name&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt; &lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='o'&gt;?&lt;/span&gt;
                   &lt;span class='nv'&gt;$this&lt;/span&gt;&lt;span class='o'&gt;-&amp;gt;&lt;/span&gt;&lt;span class='na'&gt;prototype_obj_properties&lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;$name&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt; &lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='k'&gt;null&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
        &lt;span class='p'&gt;}&lt;/span&gt;
        &lt;span class='k'&gt;else&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
            &lt;span class='k'&gt;return&lt;/span&gt; &lt;span class='k'&gt;null&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
        &lt;span class='p'&gt;}&lt;/span&gt;
    &lt;span class='p'&gt;}&lt;/span&gt;

    &lt;span class='k'&gt;public&lt;/span&gt; &lt;span class='k'&gt;function&lt;/span&gt; &lt;span class='nf'&gt;__set&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt; &lt;span class='nv'&gt;$name&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='nv'&gt;$value&lt;/span&gt; &lt;span class='p'&gt;)&lt;/span&gt;
    &lt;span class='p'&gt;{&lt;/span&gt;
        &lt;span class='k'&gt;if&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt; &lt;span class='nb'&gt;in_array&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt; &lt;span class='nv'&gt;$name&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='nx'&gt;self&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='nv'&gt;$prototype_properties&lt;/span&gt; &lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
            &lt;span class='k'&gt;return&lt;/span&gt; &lt;span class='nv'&gt;$this&lt;/span&gt;&lt;span class='o'&gt;-&amp;gt;&lt;/span&gt;&lt;span class='na'&gt;prototype_obj_properties&lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;$name&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='nv'&gt;$value&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
        &lt;span class='p'&gt;}&lt;/span&gt;
        &lt;span class='k'&gt;else&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
            &lt;span class='k'&gt;return&lt;/span&gt; &lt;span class='k'&gt;null&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
        &lt;span class='p'&gt;}&lt;/span&gt;
    &lt;span class='p'&gt;}&lt;/span&gt;

    &lt;span class='k'&gt;public&lt;/span&gt; &lt;span class='k'&gt;function&lt;/span&gt; &lt;span class='nf'&gt;__isset&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt; &lt;span class='nv'&gt;$name&lt;/span&gt; &lt;span class='p'&gt;)&lt;/span&gt;
    &lt;span class='p'&gt;{&lt;/span&gt;
        &lt;span class='k'&gt;return&lt;/span&gt; &lt;span class='nb'&gt;isset&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt; &lt;span class='nv'&gt;$this&lt;/span&gt;&lt;span class='o'&gt;-&amp;gt;&lt;/span&gt;&lt;span class='na'&gt;prototype_obj_properties&lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;$name&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt; &lt;span class='p'&gt;);&lt;/span&gt;
    &lt;span class='p'&gt;}&lt;/span&gt;

    &lt;span class='k'&gt;public&lt;/span&gt; &lt;span class='k'&gt;function&lt;/span&gt; &lt;span class='nf'&gt;__unset&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt; &lt;span class='nv'&gt;$name&lt;/span&gt; &lt;span class='p'&gt;)&lt;/span&gt;
    &lt;span class='p'&gt;{&lt;/span&gt;
        &lt;span class='nb'&gt;unset&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt; &lt;span class='nv'&gt;$this&lt;/span&gt;&lt;span class='o'&gt;-&amp;gt;&lt;/span&gt;&lt;span class='na'&gt;prototype_obj_properties&lt;/span&gt;&lt;span class='p'&gt;[&lt;/span&gt;&lt;span class='nv'&gt;$name&lt;/span&gt;&lt;span class='p'&gt;]&lt;/span&gt; &lt;span class='p'&gt;);&lt;/span&gt;
    &lt;span class='p'&gt;}&lt;/span&gt;
&lt;span class='p'&gt;}&lt;/span&gt;


&lt;span class='cp'&gt;?&amp;gt;&lt;/span&gt;&lt;span class='x' /&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;</content>
    </entry>
    
    <entry>
        <title>Persistent Static Variables</title>
        <link href="http://mattread.org/notes/peristent-static-variables.html"/>
        <updated>2010-09-02T00:00:00-07:00</updated>
        <id>http://mattread.org./notes/peristent-static-variables</id>
        <content type="html">&lt;p&gt;Wait, What? Yeah that&amp;#8217;s what I thought too. Still no Idea what I&amp;#8217;m talking about? Well, let&amp;#8217;s take a look at the following code. Let&amp;#8217;s call it &amp;#8220;fred&amp;#8221;.&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='php5'&gt;&lt;span class='cp'&gt;&amp;lt;?php&lt;/span&gt;

&lt;span class='k'&gt;class&lt;/span&gt; &lt;span class='nc'&gt;foo&lt;/span&gt;
&lt;span class='p'&gt;{&lt;/span&gt;
    &lt;span class='k'&gt;function&lt;/span&gt; &lt;span class='nf'&gt;bar&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt; &lt;span class='nv'&gt;$b&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='m'&gt;0&lt;/span&gt; &lt;span class='p'&gt;)&lt;/span&gt;
    &lt;span class='p'&gt;{&lt;/span&gt;
        &lt;span class='k'&gt;static&lt;/span&gt; &lt;span class='nv'&gt;$a&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='m'&gt;0&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
        &lt;span class='k'&gt;if&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt; &lt;span class='nv'&gt;$b&lt;/span&gt; &lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;
            &lt;span class='nv'&gt;$a&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='nv'&gt;$b&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
        &lt;span class='p'&gt;}&lt;/span&gt;
         &lt;span class='k'&gt;echo&lt;/span&gt; &lt;span class='nv'&gt;$a&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
    &lt;span class='p'&gt;}&lt;/span&gt;
&lt;span class='p'&gt;}&lt;/span&gt;

&lt;span class='nv'&gt;$faz&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='k'&gt;new&lt;/span&gt; &lt;span class='nx'&gt;foo&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
&lt;span class='nv'&gt;$faz&lt;/span&gt;&lt;span class='o'&gt;-&amp;gt;&lt;/span&gt;&lt;span class='na'&gt;bar&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='m'&gt;3&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
&lt;span class='nv'&gt;$baz&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='k'&gt;new&lt;/span&gt; &lt;span class='nx'&gt;foo&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt;
&lt;span class='nv'&gt;$baz&lt;/span&gt;&lt;span class='o'&gt;-&amp;gt;&lt;/span&gt;&lt;span class='na'&gt;bar&lt;/span&gt;&lt;span class='p'&gt;();&lt;/span&gt;
&lt;span class='nx'&gt;foo&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='na'&gt;bar&lt;/span&gt;&lt;span class='p'&gt;();&lt;/span&gt;
&lt;span class='nx'&gt;foo&lt;/span&gt;&lt;span class='o'&gt;:&lt;/span&gt;&lt;span class='nx'&gt;bar&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='m'&gt;1&lt;/span&gt;&lt;span class='p'&gt;);&lt;/span&gt;
&lt;span class='nv'&gt;$faz&lt;/span&gt;&lt;span class='o'&gt;-&amp;gt;&lt;/span&gt;&lt;span class='na'&gt;bar&lt;/span&gt;&lt;span class='p'&gt;();&lt;/span&gt;

&lt;span class='cp'&gt;?&amp;gt;&lt;/span&gt;&lt;span class='x' /&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;The code above, named &amp;#8220;fred&amp;#8221;, basically creates a static variable &lt;code&gt;$a&lt;/code&gt; inside the function &lt;code&gt;foo()&lt;/code&gt;. When you call &lt;code&gt;foo(0)&lt;/code&gt; it outputs the value of &lt;code&gt;$a&lt;/code&gt;. When you call &lt;code&gt;foo(&amp;#39;x&amp;#39;)&lt;/code&gt; , where x can be anything, it updates the value of &lt;code&gt;$a&lt;/code&gt; with &lt;code&gt;&amp;#39;x&amp;#39;&lt;/code&gt;, and outputs the new result.&lt;/p&gt;

&lt;p&gt;Now, what would expect &amp;#8220;fred&amp;#8221; to output? If your like me, then you are completely wrong. &amp;#8220;fred&amp;#8221; will actually output the following code.&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='php5'&gt;&lt;span class='cp'&gt;&amp;lt;?php&lt;/span&gt;

&lt;span class='cm'&gt;/*&lt;/span&gt;
&lt;span class='cm'&gt;Actual Outputs:&lt;/span&gt;
&lt;span class='cm'&gt;$faz-&amp;gt;bar(3);   ==&amp;gt; 3&lt;/span&gt;
&lt;span class='cm'&gt;$baz-&amp;gt;bar();    ==&amp;gt; 3&lt;/span&gt;
&lt;span class='cm'&gt;foo::bar();     ==&amp;gt; 3&lt;/span&gt;
&lt;span class='cm'&gt;foo:bar(1);     ==&amp;gt; 1&lt;/span&gt;
&lt;span class='cm'&gt;$faz-&amp;gt;bar();    ==&amp;gt; 1&lt;/span&gt;

&lt;span class='cm'&gt;Expected outputs:&lt;/span&gt;
&lt;span class='cm'&gt;$faz-&amp;gt;bar(3);   ==&amp;gt; 3&lt;/span&gt;
&lt;span class='cm'&gt;$baz-&amp;gt;bar();    ==&amp;gt; 0&lt;/span&gt;
&lt;span class='cm'&gt;foo::bar();     ==&amp;gt; 0&lt;/span&gt;
&lt;span class='cm'&gt;foo:bar(1);     ==&amp;gt; 1&lt;/span&gt;
&lt;span class='cm'&gt;$faz-&amp;gt;bar();    ==&amp;gt; 3&lt;/span&gt;
&lt;span class='cm'&gt;*/&lt;/span&gt;

&lt;span class='cp'&gt;?&amp;gt;&lt;/span&gt;&lt;span class='x' /&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Yes, that&amp;#8217;s what I said at the start, &amp;#8220;Persistent Static Variables Across Instances&amp;#8221;. The static variable &lt;code&gt;$a&lt;/code&gt; actually persists across the two instances of foo that &amp;#8220;fred&amp;#8221; created, and even into the static method call. This was completely unexpected, at least by me.&lt;/p&gt;</content>
    </entry>
    
    <entry>
        <title>Why Playoff Hockey is Better Than Sex</title>
        <link href="http://mattread.org/notes/why-playoff-hockey-is-better-than-sex.html"/>
        <updated>2010-08-06T00:00:00-07:00</updated>
        <id>http://mattread.org./notes/why-playoff-hockey-is-better-than-sex</id>
        <content type="html">&lt;p&gt;I always knew Hockey was important, just never realized how important; It&amp;#8217;s better than sex!&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;It&amp;#8217;s legal to play hockey professionally.&lt;/li&gt;

&lt;li&gt;The puck is always hard.&lt;/li&gt;

&lt;li&gt;Protective equipment is reusable and you don&amp;#8217;t even have to wash it.&lt;/li&gt;

&lt;li&gt;It lasts a full hour.&lt;/li&gt;

&lt;li&gt;You know you&amp;#8217;re finished when the buzzer sounds.&lt;/li&gt;

&lt;li&gt;Your parents cheer when you score.&lt;/li&gt;

&lt;li&gt;Periods only last 20 minutes.&lt;/li&gt;

&lt;li&gt;You can count on it at least twice a week.&lt;/li&gt;

&lt;li&gt;You can tell your friends about it afterwards.&lt;/li&gt;

&lt;li&gt;A two-on-one or three-on-one is not uncommon.&lt;/li&gt;
&lt;/ol&gt;</content>
    </entry>
    
    <entry>
        <title>Privacy Policy</title>
        <link href="http://mattread.org/about/privacy.html"/>
        <updated>2010-08-01T00:00:00-07:00</updated>
        <id>http://mattread.org./about/privacy</id>
        <content type="html">&lt;p&gt;I promise not to disclose your private information to any third party except if required to do so by law, or in the good faith belief that such action is necessary to comply with legal process, respond to claims, or to protect the rights, property or safety of Matt Read, Notes? users or the public. I take all reasonable care in handling your personal information to ensure its security both offline and online.&lt;/p&gt;

&lt;p&gt;I reserve the right to amend this privacy policy without notice and without consultation.&lt;/p&gt;

&lt;h2 id='types_of_information_i_collect'&gt;Types of Information I Collect&lt;/h2&gt;

&lt;p&gt;You are free to browse Matt Read, Notes? without submitting any personal information at all. Your IP address (your current Internet address) is stored in the server logs at the time of your visit, as it is on all web sites. I do not collect any personal information (such as a name, address or e-mail address) when you visit the site unless you register to the site or provied the information when leaving a comment.&lt;/p&gt;

&lt;h2 id='postings_comments_on_articles'&gt;Postings Comments on Articles&lt;/h2&gt;

&lt;p&gt;It is important remember that when you provide personal information (e.g., last name, address, phone number) in a online posting that that information is visible to anyone, and may be used by someone in a manner unintended by you. For that reason, I discourage you from posting any personal information on this or any website in comments or otherwise.&lt;/p&gt;

&lt;h2 id='cookies'&gt;Cookies&lt;/h2&gt;

&lt;p&gt;The software runing this site uses browser cookies to keep track of which messages you have read, and other information about your session. Cookies are small pieces of text that are stored on your hard drive between visits. These cookies do not collect, store or maintain any private, personally identifiable information. You do not have to accept these cookies to visit or use the site (although turning cookies off will impair the site&amp;#8217;s functionality), and you can choose to refuse the cookies, delete the cookies from your hard drive or turn off cookies at any time by updating your user profile preferences.&lt;/p&gt;

&lt;h2 id='questions_and_concerns'&gt;Questions And Concerns&lt;/h2&gt;

&lt;p&gt;If you have any concerns or questions about any aspect of this policy, please feel free to &lt;a href='/about/about.html#contact'&gt;contact me&lt;/a&gt;. Please use the Subject &amp;#8220;Privacy Policy&amp;#8221; or similar.&lt;/p&gt;</content>
    </entry>
    
    <entry>
        <title>GnuPG Public Key</title>
        <link href="http://mattread.org/about/gpg.html"/>
        <updated>2010-08-01T00:00:00-07:00</updated>
        <id>http://mattread.org./about/gpg</id>
        <content type="html">&lt;p&gt;I prefer to receive mail that is encrypted, or at the very least, digitally signed. You can learn more about crypto and email at The &lt;a href='http://www.gnupg.org/'&gt;GNUPG website&lt;/a&gt;, or at the &lt;a href='http://www.redhat.com/docs/manuals/linux/RHL-7.3-Manual/custom-guide/ch-gnupg.html'&gt;Red Hat GnuPG page&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Key id: &lt;strong&gt;0676CEF9&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG v1.4.9 (GNU/Linux)

mQFCBEsSFuQRAwCaQIDOhLVg1lURTv9DCIq9UY3IlLEH0F1Fm3WOwego6+eZ0SJR
iSNtEjHeTRJl0Vc3/TxiIlmtyjq0N5oYiAwjMBUhwDJobS6tQ4EOECXgCtNzv+ss
iZTQ+7N8xAbYV9cAoLFx/17qDxnKr5QM66kf3FwPRd+ZAwCR6cLSYRBP0GSHoewr
quaBlLNWy29xw1NqU6e5f/4Crv6orvjdoTwCnlgbELPy02c9nHQ1ZlwGzvDJX1Dv
oOxmfluWW2iNgONiVpJeDzYhrIVm7b0pS88zA1k3JhaM5ioC/jUodW6hlz84jQps
jOga6HSw2DBh2cdgilCI+Yy3RNmriBQoRxTy1Ir1D14mkK0wwjYLrqULKXko/LkD
YAdcE4l/0XVzbDlac8My/9dkQtALn+r8fKVRIopxGceV43s617QdTWF0dCBSZWFk
IDxtYXR0QG1hdHRyZWFkLmNvbT6IYAQTEQIAIAUCSxIW5AIbAwYLCQgHAwIEFQII
AwQWAgMBAh4BAheAAAoJENQE0sAGds75hiIAoI+tG6R68i8qWH6V8m06Pq1rMIhN
AJ9tD3ECjCCxiPJIvXzqONJQQfW8yrjNBEsSFuQQAwCTVf+n1LngoVLnxeGtCrkv
LDkS4kXFI7MSuScSlTU0yGMxcuY5GkuL/ZqBLuCnLNrZh6i2nYyshzSIAwYAK/k+
iMaIhTPdsrCSUHw763woSJuWMifE3fb623+4bPNzMecAAwUC/3v/2Z2sWgeKhymE
EW0AKaI8IfO6U0CKO9w4l8dFTT0AqqjzQ/uvSM6AWZBIN6EC+z4opgR09YG8uzRN
0wwBILK694umErNo7ISIs4J+c8yDiLMb28Fc06vMsWwu66+/aYhJBBgRAgAJBQJL
EhbkAhsMAAoJENQE0sAGds75TX0An0qUjGBTNneeiFw1OSEh6NuNHaEgAJ9Rq9n/
kVO4+KX+bsNFdVhWG2gHKw==
=x4lQ
-----END PGP PUBLIC KEY BLOCK-----&lt;/code&gt;&lt;/pre&gt;</content>
    </entry>
    
    <entry>
        <title>Copyright Information</title>
        <link href="http://mattread.org/about/copyright.html"/>
        <updated>2010-08-01T00:00:00-07:00</updated>
        <id>http://mattread.org./about/copyright</id>
        <content type="html">&lt;p&gt;All written content of this site is licensed under a &lt;a href='http://creativecommons.org/licenses/by-sa/2.5/ca/'&gt;Creative Commons Attribution-ShareAlike 2.5 License&lt;/a&gt;, except for images. All images are copyright to their respective owners; namely me, Matt Read.&lt;/p&gt;</content>
    </entry>
    
    <entry>
        <title>Accessibility Statement</title>
        <link href="http://mattread.org/about/accessibility.html"/>
        <updated>2010-08-01T00:00:00-07:00</updated>
        <id>http://mattread.org./about/accessibility</id>
        <content type="html">&lt;p&gt;This is the official accessibility statement for Matt Read, Notes?. If you have any questions or comments, feel free to &lt;a href='/about/about.html#contact'&gt;contact me&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id='access_keys'&gt;Access keys&lt;/h2&gt;

&lt;p&gt;Most browsers support jumping to specific links by typing keys defined on the web site. On Windows, you can press &lt;kbd&gt;ALT&lt;/kbd&gt; + an access key; on Macintosh, you can press &lt;kbd&gt;Control&lt;/kbd&gt; + an access key. All pages on this site define the following access keys:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Access key &lt;kbd&gt;1&lt;/kbd&gt; - Home page&lt;/li&gt;

&lt;li&gt;Access key &lt;kbd&gt;2&lt;/kbd&gt; - Skip to Main Content&lt;/li&gt;

&lt;li&gt;Access key &lt;kbd&gt;3&lt;/kbd&gt; - Archives&lt;/li&gt;

&lt;li&gt;Access key &lt;kbd&gt;5&lt;/kbd&gt; - Skip to Main Navigation&lt;/li&gt;

&lt;li&gt;Access key &lt;kbd&gt;7&lt;/kbd&gt; - Copyright Statement&lt;/li&gt;

&lt;li&gt;Access key &lt;kbd&gt;9&lt;/kbd&gt; - Privacy Policy&lt;/li&gt;

&lt;li&gt;Access key &lt;kbd&gt;0&lt;/kbd&gt; - Accessibility statement&lt;/li&gt;

&lt;li&gt;Access key &lt;kbd&gt;u&lt;/kbd&gt; - About Page&lt;/li&gt;

&lt;li&gt;Access key &lt;kbd&gt;s&lt;/kbd&gt; - Syndication Feed&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id='standards_compliance'&gt;Standards compliance&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;All pages on this site is &lt;acronym title='Web Content Accessibility Guidelines'&gt;WCAG&lt;/acronym&gt; &lt;acronym title='triple A'&gt;AAA&lt;/acronym&gt; approved, complying wih &lt;a href='http://www.w3.org/TR/WAI-WEBCONTENT/full-checklist.html'&gt;all priority 1, 2, and 3 guidelines&lt;/a&gt; of the &lt;a href='http://www.w3.org/TR/WCAG10/'&gt;&lt;acronym title='World Wide Web Consortium'&gt;W3C&lt;/acronym&gt; Web Content Accessibility Guidelines&lt;/a&gt;. Again, this is a judgement call; many guidelines are intentionally vague and can not be tested automatically. I have reviewed all the guidelines and believe that all these pages are in compliance.&lt;/li&gt;

&lt;li&gt;All pages on this site are &lt;a href='http://bobby.watchfire.com/'&gt;Section 508 approved&lt;/a&gt;, complying with all of the &lt;acronym title='United States'&gt;U.S.&lt;/acronym&gt; Federal Government &lt;a href='http://www.section508.gov/'&gt;Section 508 Guidelines&lt;/a&gt;. Again, a judgement call. I have reviewed all the guidelines and believe that all these pages are in compliance.&lt;/li&gt;

&lt;li&gt;All pages on this site &lt;a href='http://validator.w3.org/'&gt;validate as &lt;acronym title='hypertext markup language'&gt;HTML&lt;/acronym&gt; 5&lt;/a&gt;. This is not a judgement call; a program can determine with 100% accuracy whether a page is valid XHTML. For example, &lt;a href='http://validator.w3.org/check?uri=http%3A%2F%2Fmattread.com%2F'&gt;check the home page for XHTML validity&lt;/a&gt;.&lt;/li&gt;

&lt;li&gt;All pages on this site use structured semantic markup. H1 tags are used for the site title, H2 tags are used for main titles, and H3 tags for subtitles. For example, on this page, JAWS users can skip to the next section within the accessibility statement by pressing &lt;kbd&gt;ALT+INSERT+3&lt;/kbd&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id='navigation_aids'&gt;Navigation aids&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;All pages have &lt;tt&gt;rel=previous, next,&lt;/tt&gt; and &lt;tt&gt;home&lt;/tt&gt; links to aid navigation in text-only browsers. Netscape 6 and Mozilla users can also take advantage of this feature by selecting the View menu, Show/Hide, Site Navigation Bar, Show Only As Needed (or Show Always).&lt;/li&gt;

&lt;li&gt;The home page and all archive pages include a search box (access key 4). Advanced search options are currently unavailable.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id='links'&gt;Links&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Many links have title attributes which describe the link in greater detail, unless the text of the link already fully describes the target (such as the headline of an article).&lt;/li&gt;

&lt;li&gt;Links are written to make sense out of context.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id='images'&gt;Images&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;All content images used in this site include descriptive &lt;code&gt;ALT&lt;/code&gt; attributes. Purely decorative graphics include null &lt;code&gt;ALT&lt;/code&gt; attributes.&lt;/li&gt;

&lt;li&gt;Complex images include &lt;acronym title='long description'&gt;LONGDESC&lt;/acronym&gt; attributes or inline descriptions to explain the significance of each image to non-visual readers.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id='visual_design'&gt;Visual design&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;This site uses cascading style sheets for visual layout.&lt;/li&gt;

&lt;li&gt;This site uses only relative font sizes, compatible with the user-specified &amp;#8220;text size&amp;#8221; option in visual browsers.&lt;/li&gt;

&lt;li&gt;If your browser or browsing device does not support stylesheets at all, the content of each page is still readable.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id='content_rating'&gt;Content Rating&lt;/h2&gt;

&lt;p&gt;This site is &lt;a href='http://www.safesurf.com/inspect/search_url.cfm?URL1=http://www.mattread.com/' title='Adult Supervision Recommended'&gt;SafeSurf Rated&lt;/a&gt; as &amp;#8220;Adult Supervision Recommended&amp;#8221;. This rating is a judgement call on my part, and to the best of my knowledge is accurate and complies with the &lt;a href='http://www.safesurf.com/'&gt;SafeSurf&lt;/a&gt; End User License Agreement.&lt;/p&gt;</content>
    </entry>
    
    <entry>
        <title>About This, That, and Me</title>
        <link href="http://mattread.org/about/about.html"/>
        <updated>2010-08-01T00:00:00-07:00</updated>
        <id>http://mattread.org./about/about</id>
        <content type="html">&lt;p&gt;&lt;img src='/images/BigJibby.jpg' alt='Alt text' style='float:right' /&gt; I&amp;#8217;m Matt Read, a 29 year old male from Ottawa, Canada. That&amp;#8217;s the capital of Canada for all you who don&amp;#8217;t know that already. I enjoy skateboarding, playing hockey and soccer, and working on my website.&lt;/p&gt;

&lt;p&gt;My favourite TV show of all time is MacGyver, and Good Will Hunting is my favorite movie. I program in PHP, MySQL, Javascript, and Bash Scripting, and I love playing with Python. I&amp;#8217;m a bit pedantic about producing &lt;strong&gt;semantic&lt;/strong&gt; &lt;abbr title='Hypertext Markup Language'&gt;HTML&lt;/abbr&gt; (and no, valid does not mean semantic).&lt;/p&gt;

&lt;h2 id='site'&gt;About This Site&lt;/h2&gt;

&lt;p&gt;This site is my personal website since June 2003. This site is powered by &lt;abbr title='Hypertext Markup Language'&gt;HTML&lt;/abbr&gt;. It contains my (almost) daily web log about my life and stuff I find on the Internet. For more information and help in browsing this site, visit the links below.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href='/about/faq.html'&gt;Frequently Asked Questions&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='/about/accessibility.html'&gt;Accessibility Statement&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='/about/privacy.html'&gt;Privacy Policy&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='/about/copyright.html'&gt;Copyright Information&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id='contact'&gt;Contact Matt&lt;/h2&gt;

&lt;p&gt;You can contact me by any of the below mentioned ways. Feel free to email me, but please use my &lt;a href='/gpg.html'&gt;GnuPG Public Key&lt;/a&gt;. Also feel free to IM me at any time, I&amp;#8217;m always on Google Talk.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Email: &lt;a href='mailto:matt@mattread.com'&gt;&amp;#109;&amp;#097;&amp;#116;&amp;#116;&amp;#064;&amp;#109;&amp;#097;&amp;#116;&amp;#116;&amp;#114;&amp;#101;&amp;#097;&amp;#100;&amp;#046;&amp;#099;&amp;#111;&amp;#109;&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;Jabber/Google Talk: matt@mattread.com&lt;/li&gt;

&lt;li&gt;&lt;abbr title='America On-Line'&gt;AOL&lt;/abbr&gt; IM: MattRead67&lt;/li&gt;

&lt;li&gt;Skype: MattRRead&lt;/li&gt;

&lt;li&gt;&lt;abbr title='Internet Relay Chat'&gt;IRC&lt;/abbr&gt;: #linuxoutlaws, #swhack, and #habari as nick BigJibby on the &lt;a href='http://freenode.net'&gt;freenode&lt;/a&gt; network&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id='other_sites_of_mine'&gt;Other Sites of Mine&lt;/h2&gt;

&lt;p&gt;I have a few sites scattered around the net. Here&amp;#8217;s a short list.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href='http://dropoid.com'&gt;Dropoid&lt;/a&gt; - An easy to use dropbox, with an upload limit of 42MB!&lt;/li&gt;

&lt;li&gt;&lt;a href='http://drunkenmonkey.org'&gt;Drunken Monkey Labs&lt;/a&gt; - My coding and development playground.&lt;/li&gt;

&lt;li&gt;&lt;a href='http://http://github.com/MattRead'&gt;Matt Read, Git&lt;/a&gt; - My GitHub repos.&lt;/li&gt;
&lt;/ul&gt;</content>
    </entry>
    

</feed>

