<?xml version="1.0" encoding="utf-8" ?>

<rss version="2.0" 
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
   xmlns:admin="http://webns.net/mvcb/"
   xmlns:dc="http://purl.org/dc/elements/1.1/"
   xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
   xmlns:wfw="http://wellformedweb.org/CommentAPI/"
   xmlns:content="http://purl.org/rss/1.0/modules/content/"
   >
<channel>
    <title>The cnb experience</title>
    <link>http://cnb.se/</link>
    <description>Just like Jimi Hendrix, but a little more high-tech</description>
    <dc:language>en</dc:language>
    <generator>Serendipity 1.3.1 - http://www.s9y.org/</generator>
    <pubDate>Sat, 19 Sep 2009 18:58:14 GMT</pubDate>

    <image>
        <url>http://cnb.se/templates/default/img/s9y_banner_small.png</url>
        <title>RSS: The cnb experience - Just like Jimi Hendrix, but a little more high-tech</title>
        <link>http://cnb.se/</link>
        <width>100</width>
        <height>21</height>
    </image>

<item>
    <title>New Gallery</title>
    <link>http://cnb.se/archives/11-New-Gallery.html</link>
            <category>Photography</category>
    
    <comments>http://cnb.se/archives/11-New-Gallery.html#comments</comments>
    <wfw:comment>http://cnb.se/wfwcomment.php?cid=11</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://cnb.se/rss.php?version=2.0&amp;type=comments&amp;cid=11</wfw:commentRss>
    

    <author>nospam@example.com (Anders Hellstrom)</author>
    <content:encoded>
    I&#039;ve finally gotten around to setting up a gallery for my photos again.&lt;br /&gt;
&lt;br /&gt;
There are several reasons why it&#039;s taken me such a long time. One reason has of course been the fact that I&#039;ve had a bit of a dry spell in my photography interest during 2008. But mostly it&#039;s been more technical. I&#039;m not too fond of having all my photos in the hands of a third party service, so that&#039;s never been an option. And for some reason all the off the shelf galleries have gotten such bloated and intrusive designs lately. Or have seriously dated designs instead. Or are bloatware under the hood. Then there are the ones which are just far too basic.&lt;br /&gt;
&lt;br /&gt;
When it all comes down to it, I ended up reinventing the wheel and hacked up a quick little gallery which you can find at &lt;a href=&quot;http://gallery.cnb.se/&quot; title=&quot;http://gallery.cnb.se/&quot;&gt;http://gallery.cnb.se/&lt;/a&gt;. It relies heavily on javascript and isn&#039;t well-tested, so use at your own risk. &lt;img src=&quot;http://cnb.se/templates/default/img/emoticons/smile.png&quot; alt=&quot;:-)&quot; style=&quot;display: inline; vertical-align: bottom;&quot; class=&quot;emoticon&quot; /&gt;&lt;br /&gt;
&lt;br /&gt;
As you can see from the latest shoots, I&#039;ve been much more active recently, and I&#039;m hoping it will stay that way (though perhaps with a few more days between shoots than the past week) in the future. I&#039;ve recently invested in a &lt;a href=&quot;http://www.usa.canon.com/consumer/controller?act=ModelInfoAct&amp;fcategoryid=141&amp;modelid=14998&quot; title=&quot;Canon Speedlite 580EX II&quot;&gt;Canon Speedlite 580EX II&lt;/a&gt; flash, so I&#039;m exploring a whole new area in photography for me as I&#039;ve previously always avoided using flash. Now I&#039;m considering buying one or two more instead with a wireless flash setup. Could make for some nice lighting.&lt;br /&gt;
&lt;br /&gt;
Also, keep an eye out for more additions to the gallery from shoots in the past couple of years. I will add old photos as I come across them. 
    </content:encoded>

    <pubDate>Sat, 19 Sep 2009 20:58:14 +0200</pubDate>
    <guid isPermaLink="false">http://cnb.se/archives/11-guid.html</guid>
    
</item>
<item>
    <title>New ULUG website</title>
    <link>http://cnb.se/archives/10-New-ULUG-website.html</link>
            <category>ULUG</category>
    
    <comments>http://cnb.se/archives/10-New-ULUG-website.html#comments</comments>
    <wfw:comment>http://cnb.se/wfwcomment.php?cid=10</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://cnb.se/rss.php?version=2.0&amp;type=comments&amp;cid=10</wfw:commentRss>
    

    <author>nospam@example.com (Anders Hellstrom)</author>
    <content:encoded>
    A couple of weeks ago, we launched the &lt;a href=&quot;http://www.ulug.org/&quot;&gt;new ULUG website&lt;/a&gt; based on &lt;a href=&quot;http://trac.lekplatsen.eu/&quot;&gt;FöreningsCMS&lt;/a&gt; which uses my TemporalData class. &lt;a href=&quot;http://www.ulug.org/&quot;&gt;Check it out!&lt;/a&gt; And don&#039;t forget to stop by Café Linné tonight after 18:00 if you&#039;re in the area &lt;img src=&quot;http://cnb.se/templates/default/img/emoticons/smile.png&quot; alt=&quot;:-)&quot; style=&quot;display: inline; vertical-align: bottom;&quot; class=&quot;emoticon&quot; /&gt; 
    </content:encoded>

    <pubDate>Tue, 18 Aug 2009 10:14:26 +0200</pubDate>
    <guid isPermaLink="false">http://cnb.se/archives/10-guid.html</guid>
    
</item>
<item>
    <title>Abstract classes and static methods</title>
    <link>http://cnb.se/archives/9-Abstract-classes-and-static-methods.html</link>
            <category>PHP</category>
    
    <comments>http://cnb.se/archives/9-Abstract-classes-and-static-methods.html#comments</comments>
    <wfw:comment>http://cnb.se/wfwcomment.php?cid=9</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://cnb.se/rss.php?version=2.0&amp;type=comments&amp;cid=9</wfw:commentRss>
    

    <author>nospam@example.com (Anders Hellstrom)</author>
    <content:encoded>
    Working on my TemporalData class, i realized that it should be an &lt;a href=&quot;http://php.net/oop5.abstract&quot;&gt;abstract class&lt;/a&gt;. It&#039;s the way I intended to use it all along, but I somehow forgot that PHP now supports abstract classes and didn&#039;t define it as such.&lt;br /&gt;
&lt;br /&gt;
The TemporalData class has a couple of &lt;a href=&quot;http://php.net/oop5.static&quot;&gt;static methods&lt;/a&gt; used for selecting objects from the database, and I use &lt;a href=&quot;http://php.net/oop5.late-static-bindings&quot;&gt;late static bindings&lt;/a&gt; (a php 5.3 feature) to figure out which class the call came through and in turn which table to query. If you were to call one of those methods directly on TemporalData it wouldn&#039;t have any way of knowing which table to query, so I used this code to block such calls:&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;php geshi&quot; style=&quot;text-align: left&quot;&gt;&lt;ol&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #000088;&quot;&gt;$class&lt;/span&gt; &lt;span style=&quot;color: #339933;&quot;&gt;=&lt;/span&gt; get_called_class&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #b1b100;&quot;&gt;if&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #000088;&quot;&gt;$class&lt;/span&gt; &lt;span style=&quot;color: #339933;&quot;&gt;==&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;&#039;TemporalData&#039;&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;&amp;#123;&lt;/span&gt; &lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;#160; throw &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;new&lt;/span&gt; Exception&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;quot;TemporalData::open() can not be called directly, only through its subclasses.&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
I thought I could get rid of this check now that I defined the class to be abstract. Turns out this isn&#039;t the case:&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;php geshi&quot; style=&quot;text-align: left&quot;&gt;&lt;ol&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;abstract &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;class&lt;/span&gt; A &lt;span style=&quot;color: #009900;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;#160; &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;public&lt;/span&gt; &lt;a href=&quot;http://www.php.net/static&quot;&gt;&lt;span style=&quot;color: #990000;&quot;&gt;static&lt;/span&gt;&lt;/a&gt; &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;function&lt;/span&gt; foo&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;&amp;#123;&lt;/span&gt; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;#160; &amp;#160; &lt;a href=&quot;http://www.php.net/echo&quot;&gt;&lt;span style=&quot;color: #990000;&quot;&gt;echo&lt;/span&gt;&lt;/a&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;quot;I&#039;m in your foo(), eating your bar!&lt;span style=&quot;color: #000099; font-weight: bold;&quot;&gt;\n&lt;/span&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;#160; &lt;span style=&quot;color: #009900;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;#160;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;A&lt;span style=&quot;color: #339933;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #004000;&quot;&gt;foo&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
Output:&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;text geshi&quot; style=&quot;text-align: left&quot;&gt;&lt;ol&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;I&#039;m in your foo(), eating your bar!&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
Tested with php 5.2.6 and 5.3.0beta1. 
    </content:encoded>

    <pubDate>Sun, 29 Mar 2009 19:52:51 +0200</pubDate>
    <guid isPermaLink="false">http://cnb.se/archives/9-guid.html</guid>
    
</item>
<item>
    <title>Temporal Databases</title>
    <link>http://cnb.se/archives/8-Temporal-Databases.html</link>
            <category>PHP</category>
            <category>PostgreSQL</category>
            <category>ULUG</category>
    
    <comments>http://cnb.se/archives/8-Temporal-Databases.html#comments</comments>
    <wfw:comment>http://cnb.se/wfwcomment.php?cid=8</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://cnb.se/rss.php?version=2.0&amp;type=comments&amp;cid=8</wfw:commentRss>
    

    <author>nospam@example.com (Anders Hellstrom)</author>
    <content:encoded>
    I was talking to &lt;a href=&quot;http://blog.cgeek.net/&quot;&gt;Johan&lt;/a&gt; some time ago and he mentioned working on &lt;a href=&quot;http://en.wikipedia.org/wiki/Temporal_database&quot;&gt;Temporal Databases&lt;/a&gt;. At the time it sounded interesting, but I didn&#039;t give it much more thought. Lately I&#039;ve started thinking more about it, and it&#039;s such a simple yet ingenious concept. Instead of deleting or modifying data you&#039;ll mark the old data as invalid and insert the new valid data. Of course, in a true temporal database, this is largely transparent to the application. It&#039;s useful in pretty much any context. Of course there are exceptions, where it&#039;s just unneeded overhead, but usually there&#039;s no reason to not keep historic data around. Especially these days when disk space is so cheap. (BTW, did you see the new &lt;a href=&quot;http://wdc.com/en/products/products.asp?driveid=576&quot;&gt;2 TB 3.5&quot; disk from Western Digital&lt;/a&gt;?)&lt;br /&gt;
&lt;br /&gt;
Many applications (though far from all or even most) keep logs over when things change, so if there is some problem you can backtrack through the logs and if you ware lucky see what changed, and if you are even more lucky you might even be able to see what or who caused the change, and why. The data most likely isn&#039;t machine readable any more though, and it takes a lot of manual labour to figure out the history of any given object.&lt;br /&gt;
&lt;br /&gt;
Temporal Database solve this at the database layer, and can be implemented in an existing SQL database using a couple of views, triggers, rules and PLSQL functions. What you need is a couple of extra columns. A &lt;em&gt;start&lt;/em&gt; column that marks the first moment in time when the record became valid, and an &lt;em&gt;end&lt;/em&gt; column that marks when the record became invalid.&lt;br /&gt;
&lt;br /&gt;
The &lt;em&gt;start&lt;/em&gt; column is always set and defaults to &lt;em&gt;current_time&lt;/em&gt;. The &lt;em&gt;end&lt;/em&gt; column can be &lt;em&gt;null&lt;/em&gt; though, as would be the case when you first insert a new record in the database. When you do an UPDATE a trigger catches your query and changes it into two queries: The existing row only gets one row changed, the &lt;em&gt;end&lt;/em&gt; column, which is set to &lt;em&gt;current_time&lt;/em&gt; - then a new row is inserted with all the data from the existing row, after your changes have been applied, and &lt;em&gt;start&lt;/em&gt; set to &lt;em&gt;current_time&lt;/em&gt; and &lt;em&gt;end&lt;/em&gt; set to &lt;em&gt;null&lt;/em&gt;. The procedure for a DELETE is a bit more simple. A rule is created that traps the DELETE statement and replaces it with an UPDATE that sets &lt;em&gt;end&lt;/em&gt; to &lt;em&gt;current_time&lt;/em&gt;.&lt;br /&gt;
&lt;br /&gt;
Another thing you&#039;ll need to keep this logic completely contained in the database is a view for the currently valid data in the table, which simply selects all the rows where &lt;em&gt;end&lt;/em&gt; is &lt;em&gt;null&lt;/em&gt;. To make things even more transparent you could probably add some rules and triggers to this view which acts on the real table, and then only use this view for everything in the application, though I have yet to try this out.&lt;br /&gt;
&lt;br /&gt;
The above setup is pretty sweet since everything happens automatically. It does have a couple of drawbacks though.&lt;br /&gt;
&lt;ul&gt;&lt;br /&gt;
&lt;li&gt;You have to manually set up all the views, triggers, rules and functions for each and every table.&lt;/li&gt;&lt;br /&gt;
&lt;li&gt;When you make changes to your tables, you will need to make the corresponding changes in the views etc.&lt;/li&gt;&lt;br /&gt;
&lt;li&gt;If you ever need to purge historic data things get complicated.&lt;/li&gt;&lt;br /&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;br /&gt;
The last point is something I personally like. I wouldn&#039;t want it to be easy to permanently delete data from a database set up this way. It&#039;s however a very important point here in Sweden when dealing with information about living persons since &quot;&lt;a href=&quot;http://www.datainspektionen.se/lagar-och-regler/personuppgiftslagen/&quot;&gt;Personuppgiftslagen&lt;/a&gt;&quot; (&quot;The Personal Data Act&quot;) applies. One paragraph of the law states that personal information may not be stored longer than necessary. This is obviously an issue if the database system intercepts any DELETE statements and blocks them. One way of working around this would be to disable the delete rule while removing the old data, which could probably be implemented as a PLSQL function. However, there are probably other parts of the law that applies too, e.g. keeping historic records of a persons addresses as they move around may be storing too much information. It&#039;d be interesting to have a lawyer look at that.&lt;br /&gt;
&lt;br /&gt;
While the advantages in keeping all the temporal logic inside the database are numerous I&#039;m considering the alternative of implementing it all in the application layer. Since I started looking at temporal databases I&#039;ve experimented with both versions, and I&#039;m torn between them, and I think that will always be the case.&lt;br /&gt;
&lt;br /&gt;
I&#039;m currently working on a new member database for &lt;a href=&quot;http://www.ulug.org/&quot;&gt;ULUG&lt;/a&gt; (speaking of which, our &lt;a href=&quot;http://cnb.se/archives/6-Life-in-ULUG.html&quot;&gt;last meeting&lt;/a&gt; was a great success, with twice as many attending as the meeting before!) which will employ the temporal database concepts, and I&#039;ve decided to go with the application layer approach, and I&#039;ll be extending the concept a bit. I&#039;ve added two columns for &lt;em&gt;editor&lt;/em&gt; and &lt;em&gt;logmessage&lt;/em&gt;. The &lt;em&gt;editor&lt;/em&gt; column will contain the user id of the person who performed the last record update, and the &lt;em&gt;logmessage&lt;/em&gt; will allow the editor to comment on his changes for future reference. It can also be used to specify things automatically, such as &quot;User changed their password&quot;. I&#039;ve also added a column named &lt;em&gt;revision&lt;/em&gt;. With every record update it will be incremented by one. This will make it easier to refer to a specific update of an object, for example &quot;User ID 1, revision 5&quot; instead of &quot;User ID 1, as it looked at 2007-04-06 15:45:32&quot;. I also decided to use this in combination with the record ID as the primary key, instead of a more complex key using the &lt;em&gt;start&lt;/em&gt; and &lt;em&gt;end&lt;/em&gt; timestamp columns.&lt;br /&gt;
&lt;br /&gt;
Every page in the system displaying data that come from a temporal source will automatically display a small clock that when clicked allows the user to pick a date and time and show the object as it looked at that point in time. When an old revision is being displayed, the background will change and a warning text will appear at the top of the page to make it clear without a doubt that this data is no longer valid. There should also be some kind of way to show a log of all the revisions of an object, though I&#039;m not completely done with the thought process on the specifics of this feature.&lt;br /&gt;
&lt;br /&gt;
My goal is to implement the temporal aspects of this as a special class that holds all the temporal logic. Any other objects, e.g. Member, WikiPage, etc, should be able to inherit from this object and automatically get the benefits of temporal data without having to manually add the extra code as would be the case when it is implemented in the database layer. The only thing needed are the extra columns in their respective table.&lt;br /&gt;
&lt;br /&gt;
If I can get that to work nicely I&#039;m sure I&#039;ll end up using the application layer approach much more than the database layer approach. The drawback of course is that an application error could potentially erase data, but that&#039;s a problem with regular databases as well and I&#039;ve managed to avoid any such bugs in my code so far. And if the worst case would happen, that&#039;s where my point-in-time-recovery backup system enters the picture! 
    </content:encoded>

    <pubDate>Sat, 14 Mar 2009 17:23:13 +0100</pubDate>
    <guid isPermaLink="false">http://cnb.se/archives/8-guid.html</guid>
    
</item>
<item>
    <title>PHP OOP Bug</title>
    <link>http://cnb.se/archives/7-PHP-OOP-Bug.html</link>
            <category>PHP</category>
    
    <comments>http://cnb.se/archives/7-PHP-OOP-Bug.html#comments</comments>
    <wfw:comment>http://cnb.se/wfwcomment.php?cid=7</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://cnb.se/rss.php?version=2.0&amp;type=comments&amp;cid=7</wfw:commentRss>
    

    <author>nospam@example.com (Anders Hellstrom)</author>
    <content:encoded>
    While working on a project this morning I discovered what appears to be a bug in PHP when dealing with objects and calling functions statically. I was calling a static function of a class from within an object of a different class. However, I had forgotten the name of the function I needed to call and ended up calling the wrong function. And even though the function I called wasn&#039;t declared as static I didn&#039;t get any error. Instead $this in the function ended up referring to the calling object.&lt;br /&gt;
&lt;br /&gt;
Here&#039;s a short example:&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;php geshi&quot; style=&quot;text-align: left&quot;&gt;&lt;ol&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;class&lt;/span&gt; A &lt;span style=&quot;color: #009900;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;#160; &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;private&lt;/span&gt; &lt;span style=&quot;color: #000088;&quot;&gt;$variable&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;#160;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;#160; &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;function&lt;/span&gt; foo&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;#160; &amp;#160; &lt;span style=&quot;color: #000088;&quot;&gt;$this&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #004000;&quot;&gt;variable&lt;/span&gt; &lt;span style=&quot;color: #339933;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;&#039;Hello B!&#039;&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;#160; &lt;span style=&quot;color: #009900;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;#160;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;class&lt;/span&gt; B &lt;span style=&quot;color: #009900;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;#160; &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;function&lt;/span&gt; bar&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;#160; &amp;#160; A&lt;span style=&quot;color: #339933;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #004000;&quot;&gt;foo&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;#160; &lt;span style=&quot;color: #009900;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;#160;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #000088;&quot;&gt;$myB&lt;/span&gt; &lt;span style=&quot;color: #339933;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;new&lt;/span&gt; B&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;a href=&quot;http://www.php.net/print_r&quot;&gt;&lt;span style=&quot;color: #990000;&quot;&gt;print_r&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #000088;&quot;&gt;$myB&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;#160;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #000088;&quot;&gt;$myB&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #004000;&quot;&gt;bar&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;a href=&quot;http://www.php.net/print_r&quot;&gt;&lt;span style=&quot;color: #990000;&quot;&gt;print_r&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #000088;&quot;&gt;$myB&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
And the output:&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;text geshi&quot; style=&quot;text-align: left&quot;&gt;&lt;ol&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;B Object&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;(&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;)&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;B Object&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;(&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;#160; &amp;#160; [variable] =&amp;gt; Hello B!&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;)&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Update:&lt;br /&gt;
I&#039;ve only tried this in version 5.2.6 so far. I suppose it might be the intended behavior but it seems rather odd to me. Though come to think of it, you don&#039;t get any errors when calling a non-static function statically from global scope when the function never use $this. In my opinion, these situations should cause a fatal error. 
    </content:encoded>

    <pubDate>Mon, 09 Mar 2009 09:50:10 +0100</pubDate>
    <guid isPermaLink="false">http://cnb.se/archives/7-guid.html</guid>
    
</item>
<item>
    <title>Life in ULUG</title>
    <link>http://cnb.se/archives/6-Life-in-ULUG.html</link>
            <category>Generic</category>
            <category>Linux</category>
            <category>ULUG</category>
    
    <comments>http://cnb.se/archives/6-Life-in-ULUG.html#comments</comments>
    <wfw:comment>http://cnb.se/wfwcomment.php?cid=6</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://cnb.se/rss.php?version=2.0&amp;type=comments&amp;cid=6</wfw:commentRss>
    

    <author>nospam@example.com (Anders Hellstrom)</author>
    <content:encoded>
    We finally have some new life and energy in ULUG. Two weeks ago we had another meeting with a rather small turnout. However, this sparked some online activity among other people who didn&#039;t make the meeting. And one of the attendees took it upon himself to finally fix our &lt;a href=&quot;http://www.ulug.org/&quot;&gt;website&lt;/a&gt;. For a far too long there&#039;s been nothing there except a message apologizing for the lack of a website, but no more!&lt;br /&gt;
&lt;br /&gt;
We&#039;re having another meeting on Tuesday (10th of March), and I&#039;m hopeful that we&#039;ll see at least one or two new faces as well as some regulars. It&#039;s in the same place as usual, upstairs at &lt;a href=&quot;http://www.hitta.se/ViewDetailsPink.aspx?Vkiid=SS7qN1BnGQjlYgiMzmghsw%253d%253d&quot;&gt;Café Linné&lt;/a&gt;.&lt;br /&gt;
 
    </content:encoded>

    <pubDate>Sat, 07 Mar 2009 10:53:10 +0100</pubDate>
    <guid isPermaLink="false">http://cnb.se/archives/6-guid.html</guid>
    
</item>
<item>
    <title>ULUG meeting</title>
    <link>http://cnb.se/archives/3-ULUG-meeting.html</link>
            <category>Generic</category>
            <category>Linux</category>
            <category>ULUG</category>
    
    <comments>http://cnb.se/archives/3-ULUG-meeting.html#comments</comments>
    <wfw:comment>http://cnb.se/wfwcomment.php?cid=3</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://cnb.se/rss.php?version=2.0&amp;type=comments&amp;cid=3</wfw:commentRss>
    

    <author>nospam@example.com (Anders Hellstrom)</author>
    <content:encoded>
    Uppsala Linux User Group is having a meeting on Tuesday November 11th at Café Linné. If you&#039;re in the neighborhood around 6 pm, feel free to drop by. You&#039;ll find us upstairs. 
    </content:encoded>

    <pubDate>Sun, 02 Nov 2008 10:21:05 +0100</pubDate>
    <guid isPermaLink="false">http://cnb.se/archives/3-guid.html</guid>
    
</item>
<item>
    <title>Customized Workflows in Trac</title>
    <link>http://cnb.se/archives/2-Customized-Workflows-in-Trac.html</link>
            <category>Computers</category>
            <category>Trac</category>
    
    <comments>http://cnb.se/archives/2-Customized-Workflows-in-Trac.html#comments</comments>
    <wfw:comment>http://cnb.se/wfwcomment.php?cid=2</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://cnb.se/rss.php?version=2.0&amp;type=comments&amp;cid=2</wfw:commentRss>
    

    <author>nospam@example.com (Anders Hellstrom)</author>
    <content:encoded>
    As promised in the previous post, here is a little update on what I&#039;ve been doing with customized workflows in Trac. I&#039;ve only recently convinced everybody at work to move over to Trac, so we&#039;re still in the process of streamlining everything. It wasn&#039;t a hard sell, the last couple of projects have been set up with a shared document in Google docs, where they&#039;ve had a hard time telling which &quot;tickets&quot; have been started, finished, or are even supposed to be included in the current milestone. However, as they have started using Trac in a more serious manner, and now even letting customers into the system, I&#039;ve gotten a couple of customization requests.&lt;br /&gt;
&lt;br /&gt;
For example, just because a feature is implemented or a bug is fixed, the ticket is not considered ready to be closed. It&#039;s only closed once the code has been deployed to the production server. From the get go we tried to work around this, since in Trac a ticket is either open or closed. By having different resolutions and reopening the ticket and then closing it again with a new resolution, we were able to almost get what we wanted. However this does not look good in many places around Trac, for example in the timeline, and when the customer sees the ticket as closed, they expect it to be live on the production server as well.&lt;br /&gt;
&lt;br /&gt;
Thankfully Trac 0.11 introduces a new feature which solves this completely for us - &lt;a href=&quot;http://trac.edgewall.org/wiki/TracWorkflow&quot;&gt;Customizable Workflows&lt;/a&gt;. It&#039;s an amazingly powerful yet simple to use feature and I got a sample setup up and running surprisingly quickly. The showworkflow command line tool that ships with Trac now was extremely helpful and made it even easier to see that you set things up the way you planned without requiring extensive testing when you make modifications. It simply takes your configuration file and generates, using graphviz, a flowchart of your workflow:&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;serendipity_imageComment_center&quot; style=&quot;width: 230px&quot;&gt;&lt;div class=&quot;serendipity_imageComment_img&quot;&gt;&lt;!-- s9ymdb:3 --&gt;&lt;a  class=&#039;serendipity_image_link&#039;  rel=&#039;lightbox&#039; href=&#039;http://cnb.se/uploads/Charts/default-trac-workflow.png&#039;&gt;&lt;img class=&quot;serendipity_image_center&quot; width=&quot;110&quot; height=&quot;107&quot;  src=&quot;http://cnb.se/uploads/Charts/default-trac-workflow.serendipityThumb.png&quot; alt=&quot;&quot; /&gt;&lt;/a&gt; &lt;!-- s9ymdb:4 --&gt;&lt;a  class=&#039;serendipity_image_link&#039;  rel=&#039;lightbox&#039; href=&#039;http://cnb.se/uploads/Charts/sample-trac-workflow.png&#039;&gt;&lt;img class=&quot;serendipity_image_center&quot; width=&quot;110&quot; height=&quot;80&quot;  src=&quot;http://cnb.se/uploads/Charts/sample-trac-workflow.serendipityThumb.png&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;serendipity_imageComment_txt&quot;&gt;Default and Sample trac workflows&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
As you can see when comparing the default and my sample workflows above, we&#039;ve added a couple of extra steps in between the accepted and closed states. Once you&#039;ve accepted a ticket it cannot be closed, the only possible actions are to either reassign it or to submit it for review by the project manager. When you submit it for review, it ends up in a new Status called validation. While in this state, the manager can choose whether to let it pass the review or to reopen the ticket and send it back to the developer.&lt;br /&gt;
&lt;br /&gt;
Once it has passed the review it ends up in yet another new Status - ready_for_deployment. From this state the developers can choose to either deploy the new code to the shared development server and demo it to the customer, or directly deploy it to the production server. It&#039;s also still possible to reopen the ticket from this point. If they however deploy it to the development server the ticket ends up in yet another new status called deployed_dev. Only when a deployment on the production server is completed the ticket will be closed. This can be performed either from the ready_for_deployment status, or from the deployed_dev status.&lt;br /&gt;
&lt;br /&gt;
While we haven&#039;t put this new workflow to the test yet, I&#039;m certain it will work much better than the previous system with different resolutions. Since I find this feature to be well-documented I don&#039;t see any need to repeat the steps needed here, however I will post the [ticket-workflow] section from my trac.ini here for your reference:&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;ini geshi&quot; style=&quot;text-align: left&quot;&gt;&lt;ol&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #000066; font-weight:bold;&quot;&gt;&lt;span style=&quot;&quot;&gt;&amp;#91;&lt;/span&gt;ticket-workflow&lt;span style=&quot;&quot;&gt;&amp;#93;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #000099;&quot;&gt;accept&lt;/span&gt; &lt;span style=&quot;color: #000066; font-weight:bold;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #660066;&quot;&gt; new,assigned,accepted,reopened -&amp;gt; accepted&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #000099;&quot;&gt;accept.operations&lt;/span&gt; &lt;span style=&quot;color: #000066; font-weight:bold;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #660066;&quot;&gt; set_owner_to_self&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #000099;&quot;&gt;accept.permissions&lt;/span&gt; &lt;span style=&quot;color: #000066; font-weight:bold;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #660066;&quot;&gt; TICKET_MODIFY &amp;#160; &lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #000099;&quot;&gt;leave&lt;/span&gt; &lt;span style=&quot;color: #000066; font-weight:bold;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #660066;&quot;&gt; * -&amp;gt; *&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #000099;&quot;&gt;leave.default&lt;/span&gt; &lt;span style=&quot;color: #000066; font-weight:bold;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #660066;&quot;&gt; 1&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #000099;&quot;&gt;leave.operations&lt;/span&gt; &lt;span style=&quot;color: #000066; font-weight:bold;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #660066;&quot;&gt; leave_status&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #000099;&quot;&gt;reassign&lt;/span&gt; &lt;span style=&quot;color: #000066; font-weight:bold;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #660066;&quot;&gt; new,assigned,accepted,reopened -&amp;gt; assigned&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #000099;&quot;&gt;reassign.operations&lt;/span&gt; &lt;span style=&quot;color: #000066; font-weight:bold;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #660066;&quot;&gt; set_owner&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #000099;&quot;&gt;reassign.permissions&lt;/span&gt; &lt;span style=&quot;color: #000066; font-weight:bold;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #660066;&quot;&gt; TICKET_MODIFY&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #000099;&quot;&gt;reopen&lt;/span&gt; &lt;span style=&quot;color: #000066; font-weight:bold;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #660066;&quot;&gt; closed,deployed_dev,ready_for_deployment -&amp;gt; reopened&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #000099;&quot;&gt;reopen.operations&lt;/span&gt; &lt;span style=&quot;color: #000066; font-weight:bold;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #660066;&quot;&gt; del_resolution&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #000099;&quot;&gt;reopen.permissions&lt;/span&gt; &lt;span style=&quot;color: #000066; font-weight:bold;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #660066;&quot;&gt; TICKET_CREATE&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #000099;&quot;&gt;resolve&lt;/span&gt; &lt;span style=&quot;color: #000066; font-weight:bold;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #660066;&quot;&gt; new,assigned,accepted,reopened -&amp;gt; closed&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #000099;&quot;&gt;resolve.operations&lt;/span&gt; &lt;span style=&quot;color: #000066; font-weight:bold;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #660066;&quot;&gt; set_resolution&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #000099;&quot;&gt;resolve.permissions&lt;/span&gt; &lt;span style=&quot;color: #000066; font-weight:bold;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #660066;&quot;&gt; TICKET_MODIFY&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #000099;&quot;&gt;review&lt;/span&gt; &lt;span style=&quot;color: #000066; font-weight:bold;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #660066;&quot;&gt; accepted -&amp;gt; validation&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #000099;&quot;&gt;review.name&lt;/span&gt; &lt;span style=&quot;color: #000066; font-weight:bold;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #660066;&quot;&gt; Submit for Review&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #000099;&quot;&gt;review.permissions&lt;/span&gt; &lt;span style=&quot;color: #000066; font-weight:bold;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #660066;&quot;&gt; TICKET_MODIFY&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #000099;&quot;&gt;reject&lt;/span&gt; &lt;span style=&quot;color: #000066; font-weight:bold;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #660066;&quot;&gt; validation -&amp;gt; reopened&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #000099;&quot;&gt;reject.name&lt;/span&gt; &lt;span style=&quot;color: #000066; font-weight:bold;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #660066;&quot;&gt; Failed Review, return to developer&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #000099;&quot;&gt;pass&lt;/span&gt; &lt;span style=&quot;color: #000066; font-weight:bold;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #660066;&quot;&gt; validation -&amp;gt; ready_for_deployment&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #000099;&quot;&gt;pass.name&lt;/span&gt; &lt;span style=&quot;color: #000066; font-weight:bold;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #660066;&quot;&gt; Passes Review&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #000099;&quot;&gt;pass.permissions&lt;/span&gt; &lt;span style=&quot;color: #000066; font-weight:bold;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #660066;&quot;&gt; TICKET_MODIFY&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #000099;&quot;&gt;deploy_dev&lt;/span&gt; &lt;span style=&quot;color: #000066; font-weight:bold;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #660066;&quot;&gt; ready_for_deployment -&amp;gt; deployed_dev&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #000099;&quot;&gt;deploy_dev.name&lt;/span&gt; &lt;span style=&quot;color: #000066; font-weight:bold;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #660066;&quot;&gt; Deployed to Development server &lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #000099;&quot;&gt;deploy_dev.permissions&lt;/span&gt; &lt;span style=&quot;color: #000066; font-weight:bold;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #660066;&quot;&gt; TICKET_MODIFY&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #000099;&quot;&gt;deploy_live&lt;/span&gt; &lt;span style=&quot;color: #000066; font-weight:bold;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #660066;&quot;&gt; ready_for_deployment,deployed_dev -&amp;gt; closed&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #000099;&quot;&gt;deploy_live.name&lt;/span&gt; &lt;span style=&quot;color: #000066; font-weight:bold;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #660066;&quot;&gt; Deployed to Production server&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #000099;&quot;&gt;deploy_live.permissions&lt;/span&gt; &lt;span style=&quot;color: #000066; font-weight:bold;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #660066;&quot;&gt; TICKET_MODIFY&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #000099;&quot;&gt;deploy_live.operations&lt;/span&gt; &lt;span style=&quot;color: #000066; font-weight:bold;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #660066;&quot;&gt; set_resolution&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #000099;&quot;&gt;deploy_live.set_resolution&lt;/span&gt; &lt;span style=&quot;color: #000066; font-weight:bold;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #660066;&quot;&gt; fixed&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
Things I have planned for the future is customizing the permissions so that indeed only the manager can say a ticket has passed the review (With the configuration above, any developer can do it since they all have the TICKET_MODIFY permission) as well as modifying the milestone status page to account for the new states.&lt;br /&gt;
&lt;br /&gt;
 
    </content:encoded>

    <pubDate>Sat, 01 Nov 2008 12:15:00 +0100</pubDate>
    <guid isPermaLink="false">http://cnb.se/archives/2-guid.html</guid>
    
</item>
<item>
    <title>Welcome back!</title>
    <link>http://cnb.se/archives/1-Welcome-back!.html</link>
            <category>Generic</category>
    
    <comments>http://cnb.se/archives/1-Welcome-back!.html#comments</comments>
    <wfw:comment>http://cnb.se/wfwcomment.php?cid=1</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://cnb.se/rss.php?version=2.0&amp;type=comments&amp;cid=1</wfw:commentRss>
    

    <author>nospam@example.com (Anders Hellstrom)</author>
    <content:encoded>
    I have finally decided to start up my blog again. I&#039;ve decided to promote it to cnb.se instead of blog.cnb.se where it used to live. If I ever have any useful non-blog content I&#039;d like to put up here, I&#039;m certain a subdirectory will suffice!&lt;br /&gt;
&lt;br /&gt;
Considering the both interesting and hateful things I stumble across at work these days, I&#039;m hoping this time there will be more frequent updates and certainly more interesting posts. For instance, recently I&#039;ve been busy setting up a customized workflow in Trac for our developers, and in a personal project we&#039;re trying out DAO - Database Access Objects.&lt;br /&gt;
&lt;br /&gt;
Stay tuned for the next and future updates where I&#039;ll talk more about those topics and more!&lt;br /&gt;
&lt;br /&gt;
 
    </content:encoded>

    <pubDate>Fri, 31 Oct 2008 20:29:47 +0100</pubDate>
    <guid isPermaLink="false">http://cnb.se/archives/1-guid.html</guid>
    
</item>

</channel>
</rss>