<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Davey Shafik &#187; php</title>
	<atom:link href="http://daveyshafik.com/archives/tag/php/feed" rel="self" type="application/rss+xml" />
	<link>http://daveyshafik.com</link>
	<description>As close to my brain as you can safely get...</description>
	<lastBuildDate>Tue, 02 Feb 2010 05:48:39 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Netbeans for PHP: Continues to Impress</title>
		<link>http://daveyshafik.com/archives/743-netbeans-for-php-continues-to-impress.html</link>
		<comments>http://daveyshafik.com/archives/743-netbeans-for-php-continues-to-impress.html#comments</comments>
		<pubDate>Tue, 02 Feb 2010 05:48:39 +0000</pubDate>
		<dc:creator>Davey Shafik</dc:creator>
				<category><![CDATA[tagged]]></category>
		<category><![CDATA[eclipse]]></category>
		<category><![CDATA[ide]]></category>
		<category><![CDATA[netbeans]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[zend]]></category>
		<category><![CDATA[zend studio]]></category>
		<category><![CDATA[zend studio 5.5]]></category>
		<category><![CDATA[zend studio migration]]></category>

		<guid isPermaLink="false">http://daveyshafik.com/?p=743</guid>
		<description><![CDATA[<p>It seems that I don&#8217;t blog much unless IDE&#8217;s are concerned; there is a good reason for this: IDEs are an integral part of my development process and when they suck, development sucks.</p>
<h4>The story so far:</h4>
<ul>
<li>Boy meets ZDE 2.5</li>
<li>ZDE grows up to 5.5</li>
<li>ZDE gets replaced by new eclipse-based ZSfE/PDT</li>
<li>ZDE keeps going, until one day, Boy upgrades OSX</li>
<li>Boy hacks OSX, but ZDE is running on a donut</li>
<li>OSX update kills ZDE for good</li>
<li>Boy</li></ul><p>…</p>]]></description>
			<content:encoded><![CDATA[<p>It seems that I don&#8217;t blog much unless IDE&#8217;s are concerned; there is a good reason for this: IDEs are an integral part of my development process and when they suck, development sucks.</p>
<h4>The story so far:</h4>
<ul>
<li>Boy meets ZDE 2.5</li>
<li>ZDE grows up to 5.5</li>
<li>ZDE gets replaced by new eclipse-based ZSfE/PDT</li>
<li>ZDE keeps going, until one day, Boy upgrades OSX</li>
<li>Boy hacks OSX, but ZDE is running on a donut</li>
<li>OSX update kills ZDE for good</li>
<li>Boy cries</li>
<li>Boy finds Netbeans</li>
</ul>
<p>This is the continuation of that story. In <a href="http://daveyshafik.com/archives/494-netbeans-the-other-open-source-ide-platform.html">the last installment</a> Netbeans 6.7 was a nightly build, it had gotten it&#8217;s OSX look and feel, and it was starting to get it&#8217;s remote debugging up and running. </p>
<p>Now, 6.8 has been out for almost 2 months, and things are really starting to gather steam. With the death of ZDE5.5 finally a reality, and PHP 5.3 code starting to become part of my work-day, I finally jumped 100% to Netbeans.</p>
<p>And let me tell you, Netbeans 6.8 is nothing short of amazing. Debugging with xdebug is now almost as easy as ZDE, it works instantly on 90% of my remote machines, but I have 1 cluster for which Netbeans simply *cannot* find the local source file, making it impossible to debug. </p>
<p>Watches, breakpoints (though, I haven&#8217;t figured out conditional breakpoints, if they are there), callstack and local variables work as you would expect (though watches/variables sometimes refuse to populate larger vars, I think this is xdebug config related). In addition, Netbeans supports arbitrary breakpoint groupings; these can be enabled and disabled as a group — very neat.</p>
<p>In addition, it has path mapping to help with remote/local file correlation; so it can find the local file to show the source during debugging — this stops the problem ZDE has where two files have the same <code>basename()</code> and it&#8217;s unable to choose the correct one.</p>
<p>However, a fully functional debugger is a <strong>minimum</strong> requirement. Netbeans 6.8 also has great support for PHP 5.3 (though it has <a href="https://netbeans.org/bugzilla/show_bug.cgi?id=178043">some syntax support bugs</a>), again another <strong>minimum</strong>.</p>
<p>So where does Netbeans shine? The single biggest answer to that, is PHPUnit support. Netbeans lets you specify your test folder, and abstracts it out of the project, so your tests are separated visually; this is a great minor addition. In addition, Netbeans can generate unit tests (this utilizes phpunit&#8217;s built-in functionality), and has a great UI for running tests.</p>
<p>You can run a single unit test by simply right clicking on the test and choosing Run, or you can test a whole project by right clicking on the project and choosing Test. Doing this will bring up the Test Results pane:</p>
<p><a href="http://daveyshafik.com/wp-content/uploads/2010/02/unittest-ui.png" rel="lightbox[743]"><img src="http://daveyshafik.com/wp-content/uploads/2010/02/unittest-ui-300x48.png" alt="" title="Netbeans Test Results UI" width="300" height="48" class="aligncenter size-medium wp-image-747" /></a></p>
<p>As you can see, it shows the number of tests, the test suite, and it&#8217;s test status; this can then be expanded to show individual test methods. </p>
<p>Further to this, you can have Netbeans capture code coverage information, if you have the xdebug extension installed locally. This then manifests visually in two ways; the first, is a summary:</p>
<p><a href="http://daveyshafik.com/wp-content/uploads/2010/02/code-coverage.png" rel="lightbox[743]"><img src="http://daveyshafik.com/wp-content/uploads/2010/02/code-coverage-300x99.png" alt="" title="Netbeans Code Coverage Summary" width="300" height="99" class="aligncenter size-medium wp-image-748" /></a></p>
<p>The second, more impressive/useful way, is visually within each file:</p>
<p><a href="http://daveyshafik.com/wp-content/uploads/2010/02/code-coverage-file.png" rel="lightbox[743]"><img src="http://daveyshafik.com/wp-content/uploads/2010/02/code-coverage-file-300x90.png" alt="" title="Netbeans Code Coverage Inline" width="300" height="90" class="aligncenter size-medium wp-image-749" /></a></p>
<p>You will also notice that this adds a set of buttons below the code, which can be used to run the test for just the current file (based on the typical phpunit file/test naming structure, I assume) and to re-run the entire test suite.</p>
<p>To me, this integration is phenomenal, and is changing the way I work. This is a great example of an IDE conforming to your workflow, and proving new ways to do things; rather than fighting you and requiring you to change to it&#8217;s needs and ideals.</p>
<p>Other things of note, Netbeans 6.8 has Symfony project integration, and 6.9 is including Zend Framework integration, if those things appeal to you — I have yet to play with either, so can&#8217;t comment on their usefulness.</p>
<p>I can, without doubt, confidently say, that despite the few bugs, and some still immature minor things, Netbeans is my recommendation for an IDE.</p>
<p><a href="http://netbeans.org">Go grab Netbeans today</a>.</p>
<p>- Davey</p>
]]></content:encoded>
			<wfw:commentRss>http://daveyshafik.com/archives/743-netbeans-for-php-continues-to-impress.html/feed</wfw:commentRss>
		<slash:comments>37</slash:comments>
		</item>
		<item>
		<title>Fixing ZDE 5.5 in Snow Leopard</title>
		<link>http://daveyshafik.com/archives/721-fixing-zde-5-5-in-snow-leopard.html</link>
		<comments>http://daveyshafik.com/archives/721-fixing-zde-5-5-in-snow-leopard.html#comments</comments>
		<pubDate>Mon, 31 Aug 2009 03:01:50 +0000</pubDate>
		<dc:creator>Davey Shafik</dc:creator>
				<category><![CDATA[tagged]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[snow leopard]]></category>
		<category><![CDATA[zde]]></category>
		<category><![CDATA[zde 5.5]]></category>
		<category><![CDATA[zend studio]]></category>
		<category><![CDATA[zend studio 5.5]]></category>

		<guid isPermaLink="false">http://daveyshafik.com/?p=721</guid>
		<description><![CDATA[<p>If you are still using Zend Studio 5.5, and recently upgrade to Snow Leopard, you will have spotted pretty quickly there is a pretty severe display bug when selecting text.</p>
<p>The reason for this, is that Snow Leopard only ships with Java 1.6 and 1.3 (wtf?)</p>
<pre class="brush: sh">
$ ls -al
total 47
drwxr-xr-x  12 root   wheel  408 Aug 30 22:08 .
drwxr-xr-x  11 root   wheel  374 Aug 29 10:27 ..
lrwxr-xr-x   1 root   wheel    5 Aug 29 10:26</pre><p>…</p>]]></description>
			<content:encoded><![CDATA[<p>If you are still using Zend Studio 5.5, and recently upgrade to Snow Leopard, you will have spotted pretty quickly there is a pretty severe display bug when selecting text.</p>
<p>The reason for this, is that Snow Leopard only ships with Java 1.6 and 1.3 (wtf?)</p>
<pre class="brush: sh">
$ ls -al
total 47
drwxr-xr-x  12 root   wheel  408 Aug 30 22:08 .
drwxr-xr-x  11 root   wheel  374 Aug 29 10:27 ..
lrwxr-xr-x   1 root   wheel    5 Aug 29 10:26 1.3 → 1.3.1
drwxr-xr-x   3 root   wheel  102 Jul 20 19:35 1.3.1
lrwxr-xr-x   1 root   wheel   10 Aug 29 10:26 1.5 → CurrentJDK
lrwxr-xr-x   1 root   wheel   10 Aug 29 10:26 1.5.0 → CurrentJDK
lrwxr-xr-x   1 root   wheel    5 Aug 29 10:26 1.6 → 1.6.0
drwxr-xr-x   7 root   wheel  238 Aug 29 10:26 1.6.0
drwxr-xr-x   8 root   wheel  272 Aug 29 10:27 A
lrwxr-xr-x   1 root   wheel    1 Aug 29 10:27 Current → A
lrwxr-xr-x   1 root   wheel    3 Aug 29 10:26 CurrentJDK → 1.6
</pre>
<p>As you can see, except for the 1.3 JDK, everything else symlinks to 1.6.0. Now, ZDE will not run with 1.3, and is broken in 1.6, so how do you fix this?</p>
<p>The answer, can be found here: <a href="http://wiki.oneswarm.org/index.php/OS_X_10.6_Snow_Leopard">http://wiki.oneswarm.org/index.php/OS_X_10.6_Snow_Leopard</a></p>
<p>I am replicating it here, as it looks like it&#8217;ll be a temporary problem for them and is likely to disappear.</p>
<p><strong>Update (9/13/2009):</strong> See <a href="http://chxor.chxo.com/post/183013153/installing-java-1-5-on-snow-leopard">this post</a> for details on getting the Java 1.5 binaries from Apple themselves.</p>
<p>It essentially comes down to this: Grab the Java 1.5 JDK from Leopard (original) and then tell OSX to use the 32bit version by default.</p>
<p>This is all done through the Terminal.</p>
<p>So, first, grab the 1.5.0 leopard tarball and unpack (if the link below stops working, <a href="/contact-me">contact me</a> for a mirror):</p>
<pre class="brush: plain">
cd /tmp/
wget http://www.cs.washington.edu/homes/isdal/snow_leopard_workaround/java.1.5.0-leopard.tar.gz
tar -xvzf java.1.5.0-leopard.tar.gz
</pre>
<p>Next, move the folder to the standard JVM location on OSX (this will require your user password):</p>
<pre class="brush: sh">
sudo mv 1.5.0 /System/Library/Frameworks/JavaVM.framework/Versions/1.5.0-leopard
</pre>
<p>Then remove the current 1.5.0 symlink and point a new one to our new <code>1.5.0-leopard</code> directory.</p>
<pre class="brush: sh">
cd /System/Library/Frameworks/JavaVM.framework/Versions/
sudo rm 1.5.0
sudo ln -s 1.5.0-leopard 1.5.0
</pre>
<p>Next (and this isn&#8217;t in the original document), set permissions:</p>
<pre class="brush: sh">
sudo chown -R root:wheel ./1.5.0-leopard
</pre>
<p>Finally, open up the <code>Java Preferences</code> app in <code>/Applications/Utilities</code>, and in the Java Applications section, drag the &#8220;J2S2 5.0        32bit&#8221; version to the top.</p>
<p>After doing all this, restart ZDE and the selection bug is gone!</p>
<p>- Davey</p>
]]></content:encoded>
			<wfw:commentRss>http://daveyshafik.com/archives/721-fixing-zde-5-5-in-snow-leopard.html/feed</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
		<item>
		<title>ZDE 5.5 On OSX</title>
		<link>http://daveyshafik.com/archives/717-zde-5-5-on-osx.html</link>
		<comments>http://daveyshafik.com/archives/717-zde-5-5-on-osx.html#comments</comments>
		<pubDate>Fri, 28 Aug 2009 17:06:52 +0000</pubDate>
		<dc:creator>Davey Shafik</dc:creator>
				<category><![CDATA[tagged]]></category>
		<category><![CDATA[crashes]]></category>
		<category><![CDATA[fix]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[jre]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[zde]]></category>
		<category><![CDATA[zde 5.5]]></category>
		<category><![CDATA[zend]]></category>
		<category><![CDATA[zend studio]]></category>

		<guid isPermaLink="false">http://daveyshafik.com/?p=717</guid>
		<description><![CDATA[<p>Even though I am in the process of trying to replace it, Zend Studio 5.5 is still my day-to-day IDE for development. However, on OSX Leopard, it has seemed for a while, like the app was decaying — growing progressively crashier the more I used it. Literally, to the point where I could use it.</p>
<p>I think, however, I have solved the issue.</p>
<p>Simply edit <code>/Applications/Zend/ZendStudio-5.5.1/bin/runStudio_mac.sh</code> and make the following change:</p>
<pre class="brush: sh">
java -Xms16m -Xmx256m -cp ZendIDE.jar:MRJToolkitStubs.zip:sftp.jar:axis.jar:commons-discovery-0.2.jar:commons-logging-1.0.4.jar:javaxzombie.jar:jaxrpc.jar:saaj.jar:wsdl4j-1.5.1.jar:jhall.jar:../docs/help.zip com.zend.ide.desktop.Main
</pre><p>…</p>]]></description>
			<content:encoded><![CDATA[<p>Even though I am in the process of trying to replace it, Zend Studio 5.5 is still my day-to-day IDE for development. However, on OSX Leopard, it has seemed for a while, like the app was decaying — growing progressively crashier the more I used it. Literally, to the point where I could use it.</p>
<p>I think, however, I have solved the issue.</p>
<p>Simply edit <code>/Applications/Zend/ZendStudio-5.5.1/bin/runStudio_mac.sh</code> and make the following change:</p>
<pre class="brush: sh">
java -Xms16m -Xmx256m -cp ZendIDE.jar:MRJToolkitStubs.zip:sftp.jar:axis.jar:commons-discovery-0.2.jar:commons-logging-1.0.4.jar:javaxzombie.jar:jaxrpc.jar:saaj.jar:wsdl4j-1.5.1.jar:jhall.jar:../docs/help.zip com.zend.ide.desktop.Main
</pre>
<p>becomes:</p>
<pre class="brush: sh">
/System/Library/Frameworks/JavaVM.framework/Versions/1.5/Home/bin/java -Xms16m -Xmx256m -cp ZendIDE.jar:MRJToolkitStubs.zip:sftp.jar:axis.jar:commons-discovery-0.2.jar:commons-logging-1.0.4.jar:javaxzombie.jar:jaxrpc.jar:saaj.jar:wsdl4j-1.5.1.jar:jhall.jar:../docs/help.zip com.zend.ide.desktop.Main
</pre>
<p>This just explicitly makes it use JVM 1.5, which is, after all, what it was built for.</p>
<p>Once I did this, it became snappy again, and seems to be far less crash-prone, hurrah!</p>
<p>- Davey</p>
]]></content:encoded>
			<wfw:commentRss>http://daveyshafik.com/archives/717-zde-5-5-on-osx.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>ext/dom and libxml2 charset and entities behaviors</title>
		<link>http://daveyshafik.com/archives/705-extdom-and-libxml2-charset-and-entities-behaviors.html</link>
		<comments>http://daveyshafik.com/archives/705-extdom-and-libxml2-charset-and-entities-behaviors.html#comments</comments>
		<pubDate>Mon, 10 Aug 2009 16:02:04 +0000</pubDate>
		<dc:creator>Davey Shafik</dc:creator>
				<category><![CDATA[tagged]]></category>
		<category><![CDATA[charset]]></category>
		<category><![CDATA[dom]]></category>
		<category><![CDATA[encoding]]></category>
		<category><![CDATA[entities]]></category>
		<category><![CDATA[ext/dom]]></category>
		<category><![CDATA[libxml2]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[xml]]></category>

		<guid isPermaLink="false">http://daveyshafik.com/?p=705</guid>
		<description><![CDATA[<p>In case you are unaware, there is [as of PHP 5.1.0] a second argument to the <code>DomDocument->SaveXML()</code> method.</p>
<p>This argument currently only supports one value which is the constant <code>LIBXML_NOEMPTYTAGS</code>. This option makes sure that you do not end up with <code>&#60;tag /&#62;</code>  but instead, <code>&#60;tag&#62;&#60;/tag&#62;</code>. This can make things easier if you need more predictable text to perform other changes on later.</p>
<p>However, in playing around with the option, I noticed that my markup changed somewhat significantly in size…</p>]]></description>
			<content:encoded><![CDATA[<p>In case you are unaware, there is [as of PHP 5.1.0] a second argument to the <code>DomDocument->SaveXML()</code> method.</p>
<p>This argument currently only supports one value which is the constant <code>LIBXML_NOEMPTYTAGS</code>. This option makes sure that you do not end up with <code>&lt;tag /&gt;</code>  but instead, <code>&lt;tag&gt;&lt;/tag&gt;</code>. This can make things easier if you need more predictable text to perform other changes on later.</p>
<p>However, in playing around with the option, I noticed that my markup changed somewhat significantly in size (it&#8217;s a large document). Some further playing yields that the following six uses of <code>DomDocument->SaveXML()</code>  yield different results:</p>
<p><code>&amp;#xA0;</code> is a non-breaking space character (in HTML <code>&amp;nbsp;</code>). ext/dom Defaults to UTF-8</p>
<pre class="brush: php">
&lt;?php
$dom = DOMDocument::loadXML(&quot;&lt;xml&gt;&lt;test /&gt;&amp;#xA0;&lt;/xml&gt;&quot;);

echo   $dom-&gt;saveXML();
/*
Default behavior, entities stay as entities, no encoding added to the XML prolog
&lt;?xml version=&quot;1.0&quot;?&gt;
&lt;xml&gt;&lt;test/&gt;&amp;#xA0;&lt;/xml&gt;
*/

echo $dom-&gt;saveXML($dom-&gt;documentElement);
/*
Entities are transformed to output charset, no XML prolog
&lt;xml&gt;&lt;test/&gt;[nbsp char]&lt;/xml&gt;
*/

echo $dom-&gt;saveXML($dom);
/*
Entities are transformed to output charset, encoding added to the XML prolog
&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;xml&gt;&lt;test/&gt;[nbsp char]&lt;/xml&gt;
*/

echo $dom-&gt;saveXML($dom-&gt;documentElement, LIBXML_NOEMPTYTAG);
/*
Entities are transformed to output charset, no XML prolog, tags expanded
&lt;xml&gt;&lt;test&gt;&lt;/test&gt;[nbsp char]&lt;/xml&gt;
*/

echo $dom-&gt;saveXML($dom, LIBXML_NOEMPTYTAG);
/*
Entities are transformed to output charset, encoding added to the XML prolog, tags expanded
&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;xml&gt;&lt;test&gt;&lt;/test&gt;[nbsp char]&lt;/xml&gt;
*/

echo $dom-&gt;saveXML(null, LIBXML_NOEMPTYTAG);
/*
Entities stay as entities, no encoding added to the XML prolog, tags expanded
&lt;?xml version=&quot;1.0&quot;?&gt;
&lt;xml&gt;&lt;test&gt;&lt;/test&gt;&amp;#xA0;&lt;/xml&gt;
*/
?&gt;
</pre>
<p>Just something to keep in mind next time you&#8217;re fooling around with the DOM.</p>
<p>- Davey</p>
]]></content:encoded>
			<wfw:commentRss>http://daveyshafik.com/archives/705-extdom-and-libxml2-charset-and-entities-behaviors.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Karma-Based Mailing Lists (or: how to automate a meritocracy)</title>
		<link>http://daveyshafik.com/archives/686-karma-based-mailing-lists-or-how-to-automate-a-meritocracy.html</link>
		<comments>http://daveyshafik.com/archives/686-karma-based-mailing-lists-or-how-to-automate-a-meritocracy.html#comments</comments>
		<pubDate>Sun, 28 Jun 2009 21:08:58 +0000</pubDate>
		<dc:creator>Davey Shafik</dc:creator>
				<category><![CDATA[tagged]]></category>
		<category><![CDATA[karma]]></category>
		<category><![CDATA[mailing lists]]></category>
		<category><![CDATA[meritocracy]]></category>
		<category><![CDATA[open source]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://daveyshafik.com/?p=686</guid>
		<description><![CDATA[<h3>Defining the Problem</h3>
<p>The problem with mailing lists is that they are a free for all, it doesn&#8217;t matter who posts, everybody at every level gets to see the post.</p>
<p>In the real world, communications pass through a hierarchy of people, escalating as necessary, passing from person to person up the chain.</p>
<p>This means that, given enough time, any mailing list starts to have a large noise:signal ratio, at least for any given person&#8217;s take on the list;<br />
they…</p>]]></description>
			<content:encoded><![CDATA[<h3>Defining the Problem</h3>
<p>The problem with mailing lists is that they are a free for all, it doesn&#8217;t matter who posts, everybody at every level gets to see the post.</p>
<p>In the real world, communications pass through a hierarchy of people, escalating as necessary, passing from person to person up the chain.</p>
<p>This means that, given enough time, any mailing list starts to have a large noise:signal ratio, at least for any given person&#8217;s take on the list;<br />
they want to read what they want to read, and don&#8217;t need to be distracted ignoring the stuff they don&#8217;t want to read.</p>
<h3>Solving the Problem</h3>
<p>There is an unspoken — some what hap-hazard — hierarchy among the community, which with some thought, I believe, could be defined, refined<br />
and utilized to our advantage. As an example:</p>
<pre>
  - Active internals contributors with access to internals CVS (contributions of code and useful discussions)
  \
   - Active internals contributors without access to internals CVS (patch submitters, useful discussions)
   - Inactive internals contributors with access to internals CVS (previous contributions of code and useful discussions)
     \
      - Active non-internals, PHP contributions (docs, phpweb, PEAR)
      - Active community leaders
      - Active project leaders
      - Active linux distro maintainers
       \
        - General Users with a high understanding
          \
           - Genernal users with little understanding (newbies)
</pre>
<p>If we take each of these, and assign them a number:</p>
<pre>
L1  - Active internals contributors with access to internals CVS (contributions of code and useful discussions)
    \
L2   - Active internals contributiors without access to internals CVS (patch submitters, useful discussions)
L2   - Inactive internals contributors with access to internals CVS (previous contributions of code and useful discussions)
       \
L3      - Active non-internals, PHP contributions (docs, phpweb, PEAR)
L3      - Active community leaders
L3      - Active project leaders
L3      - Active linux distro maintainers
         \
L4        - General Users with a high understand
            \
L5           - Genernal users with little understanding (newbies)
</pre>
<p>Now, what if, at any level, you could only see (by default) 1 level below you (and all levels above you). For example: L1 can see L2, L2 can see L3 etc.</p>
<p>This immediately means that you only see stuff that might be relevant to you; however, as a community, we then lose the ability for newcomers to contribute good ideas; because they would start out with zero karma. To help solve this issue, we adjust karma based on responses:</p>
<h4>Scenario</h4>
<ul>
<li>A L3 user posts something of interest</li>
<li>A L2 user see&#8217;s the post and replies, the reply is L2
<ul>
<li>This bumps the original post up to L2 as well</li>
</ul>
</li>
<li>
        A L1 see&#8217;s the post now, and can then participate in the discussion if they choose
    </li>
</ul>
<p>In this case, <strong>only</strong> the thread in question is bumped up, however given enough L2/L1 (weighted) direct responses over different threads, a L3 user can gain karma and eventually become a L2 user (and obviously this applies to anyone moving up the chain)</p>
<p>In this way, threads (and by this mechanism, users also) can organically make their way up the tree as they gain traction, are discussed at each level and moved up.</p>
<p>I believe it would be possible to have a &#8221;&#8217;single&#8221;&#8217; mailing list that could span everything from internals right down to php-general, but this is probably not desired! It would however allow the users of any list to, regardless of their experience in the tree, contribute without weighing down the list.</p>
<h4>Features</h4>
<ul>
<li>Karma tree seeded by current &#8220;social&#8221; climate
<ul>
<li>based on CVS access level, activity in a sliding timescale, community contributions etc</li>
<li>Some manual work will be needed on this</li>
</ul>
</li>
<li>Weighted responses, a L2 responding to a L3, will move it to L2, but 3 L2&#8217;s or 1 L2 and 1 L1 responding would move it to L1, for example.</li>
<li>Adjustable threshold. Perhaps some magnanimous internals contributor likes to help out newbies, he can choose to see the whole tree, or perhaps just 3 levels down</li>
<li>Championing — it should be possible for a user to champion someone to quickly move them up the ladder, for example a L2 can bring a L5 up to L3, so their peers can see stuff, this is bringing the <strong>user</strong> up, not the <strong>thread</strong></li>
<li>Continued tweaking of karma based on CVS access and contributions</li>
<li>Personal filters, you can add users (of any level) from whom you would like to see threads, helping the movement of stuff up the tree, skipping levels</li>
</ul>
<p>In this way, we can, in some ways, automate the karma, and in someways advance it through our own choices; creating a hierarchy based on merit and trust.</p>
<h3>Final Thoughts</h3>
<ul>
<li>Some smart filtering, so that &#8220;You&#8217;re an idiot&#8221; responses don&#8217;t elevate a thread would be good
<ul>
<li>That, or just handle it biologically — Don&#8217;t respond to people in negative ways</li>
</ul>
</li>
<li>Implementing this as a ML (in terms of interaction) is likely the only way to get some of the higher internals folks using it, a web interface [for the messages] just won&#8217;t fly</li>
<li>Personal filters would be handled at master.php.net or maybe a new web interface for this</li>
</ul>
<p>Now, obviously, this is a huge undertaking; certainly not one any single person could complete on their own&#8230; but it&#8217;s food for thought.</p>
<p>- Davey</p>
]]></content:encoded>
			<wfw:commentRss>http://daveyshafik.com/archives/686-karma-based-mailing-lists-or-how-to-automate-a-meritocracy.html/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Making the case for PHP</title>
		<link>http://daveyshafik.com/archives/640-making-the-case-for-php.html</link>
		<comments>http://daveyshafik.com/archives/640-making-the-case-for-php.html#comments</comments>
		<pubDate>Sat, 06 Jun 2009 01:54:46 +0000</pubDate>
		<dc:creator>Davey Shafik</dc:creator>
				<category><![CDATA[tagged]]></category>
		<category><![CDATA[.net]]></category>
		<category><![CDATA[business]]></category>
		<category><![CDATA[environment]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[lamp]]></category>
		<category><![CDATA[language]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[projects]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://daveyshafik.com/?p=640</guid>
		<description><![CDATA[<p>One of the biggest decisions you can make for any project is the environment it which the project will be written.</p>
<p>Most developers mistake the word environment for the word &#8220;technology&#8221; or &#8220;software&#8221;. For example, you develop in a &#8220;JSP environment&#8221;, or a &#8220;LAMP environment&#8221;. This is a crucial mistake that is made time and time again, and unfortunately, it hurts companies because the decision makers either make the same mistake, or they listen to those making the mistake.</p>
<p>I&#8217;ve…</p>]]></description>
			<content:encoded><![CDATA[<p>One of the biggest decisions you can make for any project is the environment it which the project will be written.</p>
<p>Most developers mistake the word environment for the word &#8220;technology&#8221; or &#8220;software&#8221;. For example, you develop in a &#8220;JSP environment&#8221;, or a &#8220;LAMP environment&#8221;. This is a crucial mistake that is made time and time again, and unfortunately, it hurts companies because the decision makers either make the same mistake, or they listen to those making the mistake.</p>
<p>I&#8217;ve said numerous times, that you can use any language to do anything. Yes, there are practical limits, using C to write a dynamic website isn&#8217;t a great idea, nor is using PHP for password cracking. Each language has it&#8217;s own strengths and weaknesses; good developers however, know what these are and work with their strengths and work around their weaknesses. This post isn&#8217;t going to focus much on languages; I figure everybody reading has already chosen PHP and knows why.</p>
<p>What I will say is this: Ruby, Python, PHP, Perl, Java and .NET all bring the same capabilities to the table (some things are easier in some, and some more difficult in others). You can create any solution you want in each of these languages, in an efficient, well thought out, well developed way. Yahoo! could be written in Python. How do we know this? because Google uses it. Microsoft uses .NET for it&#8217;s web presence, and while you might not like to use it, it still stands up to more stress than most of the websites on the internet.</p>
<p>With this in mind, I then would say that the language capabilities themselves, are the <strong>least</strong> important factor in choosing your environment.</p>
<p>This then brings me neatly to what else that environment encompasses. These, to me, fall into three categories. People, knowledge and penetration.</p>
<h3>Access to People</h3>
<p>To put it bluntly, if you can&#8217;t find the people to write your code, you&#8217;re screwed. While you may know what you&#8217;re doing, and you have enough people now: your team will <em>need</em> to grow. If you can&#8217;t find people around you to hire, then what? </p>
<p>There are estimates that for every 100 PHP developers, there are 42 Perl developers, there are 12 Python developers and 4 Ruby developers. (see: <a href="http://www.odinjobs.com/blogs/careers/entry/how_many_perl_php_python">here</a>)</p>
<p>Some will say that this is because there is a lot of <strong>bad</strong> PHP developers. I will agree to a point, but that point is that there are just so damn many, that there are still more <strong>great</strong> developers to pick from than with other languages.</p>
<h3>Access to Knowledge</h3>
<p>While this one is more subjective, I believe that the sheer number of PHP developers generate far more useful knowledge from which to learn, cherry pick ideas and utilize them. Add to that the extensive number of books, and our excellent php|architect magazine; as well as the training and teachings provided by MTA, Zend and ibuildings, we have more going for us than most every other language with, I think, the exception of Java in terms of professionally backed learning.</p>
<h3>Market Penetration</h3>
<p>Simply put, the availability of PHP as a platform is there from the cheapest virtualhost, to the most expensive dedicated systems. It has gained wide acceptance from smaller companies, because it is cheap and reliable, and from enterprise companies such as IBM, Oracle and even Microsoft because they see that the ability is there for PHP to operate in that space and a huge number of developers willing to make that happen.</p>
<h3>Conclusion</h3>
<p>No other language can claim this trifecta, sure, there are a lot of .NET and Java developers, but a lot that goes on happens behind closed doors in big enterprises, and the knowledge is not shared. And while this isn&#8217;t true of Python, or Ruby, they lack in numbers and knowledge comparatively. This is why I choose PHP.</p>
<p>- Davey</p>
]]></content:encoded>
			<wfw:commentRss>http://daveyshafik.com/archives/640-making-the-case-for-php.html/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Debugging PDO Prepared Statements</title>
		<link>http://daveyshafik.com/archives/605-debugging-pdo-prepared-statements.html</link>
		<comments>http://daveyshafik.com/archives/605-debugging-pdo-prepared-statements.html#comments</comments>
		<pubDate>Sat, 16 May 2009 17:02:28 +0000</pubDate>
		<dc:creator>Davey Shafik</dc:creator>
				<category><![CDATA[tagged]]></category>
		<category><![CDATA[database]]></category>
		<category><![CDATA[databases]]></category>
		<category><![CDATA[debug]]></category>
		<category><![CDATA[debugging]]></category>
		<category><![CDATA[pdo]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[prepared queries]]></category>
		<category><![CDATA[prepared statements]]></category>
		<category><![CDATA[rdbms]]></category>
		<category><![CDATA[sql]]></category>

		<guid isPermaLink="false">http://pixelated-dreams.com/?p=605</guid>
		<description><![CDATA[<p>Something that has always bugged me about using prepared statements, is that you can really only get the query sent to the database by catching it in the logs.</p>
<p>Today, a friend asking me if it was possible to get a prepared statement back from PDO with the values placeholders replaced, finally caught me in a moment where I could do something about it.</p>
<p>I wrote a thin PDO wrapper class that will [imperfectly, I'm sure] return the completed query.…</p>]]></description>
			<content:encoded><![CDATA[<p>Something that has always bugged me about using prepared statements, is that you can really only get the query sent to the database by catching it in the logs.</p>
<p>Today, a friend asking me if it was possible to get a prepared statement back from PDO with the values placeholders replaced, finally caught me in a moment where I could do something about it.</p>
<p>I wrote a thin PDO wrapper class that will [imperfectly, I'm sure] return the completed query.</p>
<p>It supports bound parameters, values and the array key-&gt;value methods of passing in values to prepared queries. You can see the code and examples below:</p>
<pre class="brush: php">
&lt;?php
class PDOTester extends PDO {
	public function __construct($dsn, $username = null, $password = null, $driver_options = array())
	{
		parent::__construct($dsn, $username, $password, $driver_options);
		$this-&gt;setAttribute(PDO::ATTR_STATEMENT_CLASS, array(&#039;PDOStatementTester&#039;, array($this)));
	}
}

class PDOStatementTester extends PDOStatement {
	const NO_MAX_LENGTH = -1;

	protected $connection;
	protected $bound_params = array();

	protected function __construct(PDO $connection)
	{
		$this-&gt;connection = $connection;
	}

	public function bindParam($paramno, &amp;$param, $type = PDO::PARAM_STR, $maxlen = null, $driverdata = null)
	{
		$this-&gt;bound_params[$paramno] = array(
			&#039;value&#039; =&gt; &amp;$param,
			&#039;type&#039; =&gt; $type,
			&#039;maxlen&#039; =&gt; (is_null($maxlen)) ? self::NO_MAX_LENGTH : $maxlen,
			// ignore driver data
		);

		$result = parent::bindParam($paramno, $param, $type, $maxlen, $driverdata);
	}

	public function bindValue($parameter, $value, $data_type = PDO::PARAM_STR)
	{
		$this-&gt;bound_params[$parameter] = array(
			&#039;value&#039; =&gt; $value,
			&#039;type&#039; =&gt; $data_type,
			&#039;maxlen&#039; =&gt; self::NO_MAX_LENGTH
		);
		parent::bindValue($parameter, $value, $data_type);
	}

	public function getSQL($values = array())
	{
		$sql = $this-&gt;queryString;

		if (sizeof($values) &gt; 0) {
			foreach ($values as $key =&gt; $value) {
				$sql = str_replace($key, $this-&gt;connection-&gt;quote($value), $sql);
			}
		}

		if (sizeof($this-&gt;bound_params)) {
			foreach ($this-&gt;bound_params as $key =&gt; $param) {
				$value = $param[&#039;value&#039;];
				if (!is_null($param[&#039;type&#039;])) {
					$value = self::cast($value, $param[&#039;type&#039;]);
				}
				if ($param[&#039;maxlen&#039;] &amp;&amp; $param[&#039;maxlen&#039;] != self::NO_MAX_LENGTH) {
					$value = self::truncate($value, $param[&#039;maxlen&#039;]);
				}
				if (!is_null($value)) {
					$sql = str_replace($key, $this-&gt;connection-&gt;quote($value), $sql);
				} else {
					$sql = str_replace($key, &#039;NULL&#039;, $sql);
				}
			}
		}
		return $sql;
	}

	static protected function cast($value, $type)
	{
		switch ($type) {
			case PDO::PARAM_BOOL:
				return (bool) $value;
				break;
			case PDO::PARAM_NULL:
				return null;
				break;
			case PDO::PARAM_INT:
				return (int) $value;
			case PDO::PARAM_STR:
			default:
				return $value;
		}
	}

	static protected function truncate($value, $length)
	{
		return substr($value, 0, $length);
	}
}

$pdo = new PDOTester(&#039;sqlite::memory:&#039;);
$pdo-&gt;query(&#039;CREATE TABLE foo (bar TEXT, baz TEXT, num NUMERIC, empty TEXT)&#039;);
$query = $pdo-&gt;prepare(&#039;SELECT * FROM foo WHERE bar = :bar AND baz = :baz&#039;);

// Test with passed in array
echo $query-&gt;getSQL(array(&#039;:bar&#039; =&gt; &#039;foo&#039;, &#039;:baz&#039; =&gt; &#039;bat&#039;)) . PHP_EOL;

$query = $pdo-&gt;prepare(&#039;SELECT * FROM foo WHERE bar = :bar AND baz = :baz AND num = :num AND empty=:empty&#039;);

// Test with bound params and values
$bar = &#039;bar&#039;;
$baz = &#039;baz&#039;;
$num = &#039;0.1&#039;;
$empty = &#039;empty!!&#039;;

// Bind Param
$query-&gt;bindParam(&#039;:bar&#039;, $bar);

// Bind Value
$query-&gt;bindValue(&#039;:baz&#039;, $baz);

// Bind With types
$query-&gt;bindParam(&#039;:num&#039;, $num, PDO::PARAM_INT);
$query-&gt;bindParam(&#039;:empty&#039;, $empty, PDO::PARAM_NULL);

echo $query-&gt;getSQL() . PHP_EOL;

// Change the vars
$bar = &#039;foo&#039;;
$baz = &#039;bat&#039;;
$num = &#039;2.6&#039;;
$empty = &#039;blah!&#039;;

echo $query-&gt;getSQL() . PHP_EOL;

// Bind with length
$query-&gt;bindParam(&#039;:bar&#039;, $bar, PDO::PARAM_STR, 2);

echo $query-&gt;getSQL() . PHP_EOL;
?&gt;
</pre>
<p>This results in the following output:</p>
<pre class="brush: sql">
SELECT * FROM foo WHERE bar = &#039;foo&#039; AND baz = &#039;bat&#039;
SELECT * FROM foo WHERE bar = &#039;bar&#039; AND baz = &#039;baz&#039; AND num = &#039;0&#039; AND empty=NULL
SELECT * FROM foo WHERE bar = &#039;foo&#039; AND baz = &#039;baz&#039; AND num = &#039;2&#039; AND empty=NULL
SELECT * FROM foo WHERE bar = &#039;fo&#039; AND baz = &#039;baz&#039; AND num = &#039;2&#039; AND empty=NULL
</pre>
<p>Hopefully, this will help you get a somewhat better idea of what&#8217;s going on <img src='http://daveyshafik.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>- Davey</p>
]]></content:encoded>
			<wfw:commentRss>http://daveyshafik.com/archives/605-debugging-pdo-prepared-statements.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Cube°n for NetBeans on OSX (and others)</title>
		<link>http://daveyshafik.com/archives/582-cube%c2%b0n-for-netbeans-on-osx-and-others.html</link>
		<comments>http://daveyshafik.com/archives/582-cube%c2%b0n-for-netbeans-on-osx-and-others.html#comments</comments>
		<pubDate>Fri, 01 May 2009 15:08:42 +0000</pubDate>
		<dc:creator>Davey Shafik</dc:creator>
				<category><![CDATA[tagged]]></category>
		<category><![CDATA[cubeon]]></category>
		<category><![CDATA[cube°n]]></category>
		<category><![CDATA[ide]]></category>
		<category><![CDATA[integration]]></category>
		<category><![CDATA[netbeans]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[task management]]></category>
		<category><![CDATA[trac]]></category>

		<guid isPermaLink="false">http://pixelated-dreams.com/?p=582</guid>
		<description><![CDATA[<p>One of the things I&#8217;ve been most excited about with NetBeans, is the prospect of hooking it into <a href="http://trac.edgewall.org/" target="_blank">Trac</a> using <a href="http://code.google.com/p/cubeon/" target="_blank">Cube°n</a>. Now, I should note that I didn&#8217;t even think about doing this till I ran across Mylar for Eclipse.  So, I went ahead and downloaded Cube°n, and installed it using the NetBeans plugins workflow:</p>
<p><a href="http://pixelated-dreams.com/wp-content/uploads/2009/05/picture-9.png" rel="lightbox[582]"><img class="alignleft" title="Adding Downloaded Plugins to Netbeans" src="http://pixelated-dreams.com/wp-content/uploads/2009/05/picture-9-300x191.png" alt="Adding Downloaded Plugins to Netbeans" width="300" height="191" /></a> Simply download and unpack <a href="http://code.google.com/p/cubeon/downloads/list?can=3&#38;q=&#38;colspec=Filename+Summary+Uploaded+Size+DownloadCount">the ZIP file (2.7MB)</a> and then in NetBeans, choose <span style="font-family: 'courier new', courier;">Tools » Plugins</span>, click the…</p>]]></description>
			<content:encoded><![CDATA[<p>One of the things I&#8217;ve been most excited about with NetBeans, is the prospect of hooking it into <a href="http://trac.edgewall.org/" target="_blank">Trac</a> using <a href="http://code.google.com/p/cubeon/" target="_blank">Cube°n</a>. Now, I should note that I didn&#8217;t even think about doing this till I ran across Mylar for Eclipse.  So, I went ahead and downloaded Cube°n, and installed it using the NetBeans plugins workflow:</p>
<p><a href="http://pixelated-dreams.com/wp-content/uploads/2009/05/picture-9.png" rel="lightbox[582]"><img class="alignleft" title="Adding Downloaded Plugins to Netbeans" src="http://pixelated-dreams.com/wp-content/uploads/2009/05/picture-9-300x191.png" alt="Adding Downloaded Plugins to Netbeans" width="300" height="191" /></a> Simply download and unpack <a href="http://code.google.com/p/cubeon/downloads/list?can=3&amp;q=&amp;colspec=Filename+Summary+Uploaded+Size+DownloadCount">the ZIP file (2.7MB)</a> and then in NetBeans, choose <span style="font-family: 'courier new', courier;">Tools » Plugins</span>, click the <span style="font-family: 'courier new', courier;">Downloads</span> tab, and then <span style="font-family: 'courier new', courier;">Add Plugins&#8230; </span></p>
<p> In the file picker, just <span style="font-family: 'courier new', courier;">select all</span>, and click <span style="font-family: 'courier new', courier;">Open</span>. Next, click <span style="font-family: 'courier new', courier;">Install</span></p>
<p> In a world where everything &#8220;Just Works&#8221;, that would be it. But unfortunately, on OSX, it&#8217;s sometimes not. While the plugin appears to function fine, when you to make it grab tickets, you will get a wonderful uncaught exception dialog.</p>
<p> By default, OS X Leopard does not have the Java 6 (1.6) environment, so check if you have it. You can do so by looking to see if you have <span style="font-family: 'courier new';">/System/Library/Frameworks/JavaVM.framework/Versions/1.6</span>, if not you will need to grab Apples Java for Mac OS X <a href="http://www.apple.com/downloads/macosx/apple/application_updates/javaformacosx105update1.html" target="_blank">Update 1 (57MB)</a>, <a href="http://www.apple.com/downloads/macosx/apple/application_updates/javaformacosx105update2.html" target="_blank">Update 2 (136.4MB)</a> and <a href="http://www.apple.com/downloads/macosx/apple/application_updates/javaformacosx105update3.html" target="_blank">Update 3 (3MB)</a> </p>
<p> Finally, even if you have Java 1.6, you will <em>probably</em> need to modify your NetBeans config to use it. This can be found in <span style="font-family: 'courier new', courier;">/Applications/NetBeans/NetBeans$ver.app/Contents/Resources/NetBeans/etc/netbeans.conf</span>.</p>
<p> </p>
<p>Open up this file, and look for: </p>
<p><span style="font-family: 'courier new', courier;">netbeans_jdkhome=/System/Library/Frameworks/JavaVM.framework/Versions/1.5/Home</span></p>
<p>And change it to:</p>
<p><span style="font-family: 'courier new', courier;">netbeans_jdkhome=/System/Library/Frameworks/JavaVM.framework/Versions/1.6/Home</span></p>
<p>Once this is done, just re-start NetBeans.</p>
<p><a href="http://pixelated-dreams.com/wp-content/uploads/2009/05/picture-10.png" rel="lightbox[582]"><img class="alignright" title="Add New Repository » Trac Repository » Trac Repository Settings" src="http://pixelated-dreams.com/wp-content/uploads/2009/05/picture-10-295x300.png" alt="Add New Repository » Trac Repository » Trac Repository Settings" width="295" height="300" /></a></p>
<p>Next, go to <span style="font-family: 'courier new', courier;">Window » Cube°n » Task Repositories</span>, and a new pane will appear in the bottom left under your Project/Files/Services pane. <span style="font-family: 'courier new', courier;">Right click</span> in the new pane and choose <span style="font-family: 'courier new', courier;">New Ta<span style="font-family: Georgia;"><span style="font-family: 'courier new', courier;">sk Repository</span>; choose <span style="font-family: 'courier new', courier;">Trac Repository</span> and give it an Alias (a name), and the rest of the information it needs.</span></span></p>
<p>Choose <span style="font-family: 'courier new', courier;">Validate Connection</span> and then <span style="font-family: 'courier new', courier;">Finish</span>. If you encounter an SSL error, see <a href="http://code.google.com/p/cubeon/wiki/FAQ_SSL" target="_blank">the Cube°n FAQ.</a></p>
<p>Finally, you can add queries to grab whatever collection of tickets you would like. You use the <a href="http://trac.edgewall.org/wiki/TracQuery#QueryLanguage" target="_blank">TracLinks query syntax</a> which means you can create complex filters.</p>
<p>I have a filter for My Active Tickets, &#8220;<span style="font-family: 'courier new', courier;">owner=USERNAME&amp;status!=closed|testing</span>&#8221; and one for each milestone so I can see and accept tickets that are not mine, &#8220;<span style="font-family: 'courier new', courier;">milestone~=iris&amp;owner!=USERNAME&amp;status!=closed|testing&#8221;</span></p>
<h3>Working with Tasks</h3>
<p><a href="http://pixelated-dreams.com/wp-content/uploads/2009/05/picture-12.png" rel="lightbox[582]"><img class="alignleft size-medium wp-image-597" title="Activate a Task to start creating it's Context" src="http://pixelated-dreams.com/wp-content/uploads/2009/05/picture-12-300x81.png" alt="Activate a Task to start creating it's Context" width="300" height="81" /></a></p>
<p>One of the biggest benefits of working with Cube°n [and Mylar] is the ability to associate a context with them; that is your open files, and other related tickets. To do this, simply click the Activate button. Once this is done, any currently open files are automatically associated with the ticket&#8230; or at least they would be if you were using Java. *sigh*</p>
<p>Still, it&#8217;s a start. Hopefully the guys at Cube°n will fix this oversight soon enough, and us lowly PHP developers will get in on the fun.</p>
<p>They are already working on some neat features, such as allowing you to commit to RCS using the task context (i.e. close a task, and commit all associated files), as well as associating debugger breakpoints and watches with the task; allowing you to make those task specific, even when two separate issues touch the same files. Both of these features would be great, making sure you don&#8217;t forget to commit a related file, and imagine being able to go back to a task 6 months later because a related issue has come up and having all your original files and debugging settings immediately available.</p>
<p>- Davey</p>
]]></content:encoded>
			<wfw:commentRss>http://daveyshafik.com/archives/582-cube%c2%b0n-for-netbeans-on-osx-and-others.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Detailed IDE Reviews: How do you want to do this?</title>
		<link>http://daveyshafik.com/archives/557-detailed-ide-reviews.html</link>
		<comments>http://daveyshafik.com/archives/557-detailed-ide-reviews.html#comments</comments>
		<pubDate>Tue, 17 Mar 2009 00:18:08 +0000</pubDate>
		<dc:creator>Davey Shafik</dc:creator>
				<category><![CDATA[tagged]]></category>
		<category><![CDATA[eclipse]]></category>
		<category><![CDATA[ide]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[komodo]]></category>
		<category><![CDATA[netbeans]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[xul]]></category>
		<category><![CDATA[zend studio]]></category>

		<guid isPermaLink="false">http://pixelated-dreams.com/?p=557</guid>
		<description><![CDATA[<p>So, dear readers, I&#8217;m doing the IDE reviews for all of you guys and there&#8217;s two ways I can proceed:</p>
<p>I can take each of the requirements and do a single post per requirement with a writeup about it in detail for each of the 4 IDEs — then I was thinking for each new IDE I try, I can hit those same points. <strong>Or</strong> I can write up specifically on a single editor at a time, covering all of…</p>]]></description>
			<content:encoded><![CDATA[<p>So, dear readers, I&#8217;m doing the IDE reviews for all of you guys and there&#8217;s two ways I can proceed:</p>
<p>I can take each of the requirements and do a single post per requirement with a writeup about it in detail for each of the 4 IDEs — then I was thinking for each new IDE I try, I can hit those same points. <strong>Or</strong> I can write up specifically on a single editor at a time, covering all of the requirements and I will also then review anything else about the editor etc.</p>
<p>I&#8217;d like to do a single post on the cross-platform technologies in play (Java Vs XUL) and on the Eclipse and Netbeans platforms (outside of any PHP plugins), but these fall outside of the scope of the original intention of reviewing the IDEs.</p>
<p>There are several incarnations of Eclipse I would like to review: Zend Studio for Eclipse, Aptana and PHPEclipse, I think perhaps I need a comparison table for Eclipse solutions on their own <img src='http://daveyshafik.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Thoughts?</p>
<p>- Davey</p>
]]></content:encoded>
			<wfw:commentRss>http://daveyshafik.com/archives/557-detailed-ide-reviews.html/feed</wfw:commentRss>
		<slash:comments>19</slash:comments>
		</item>
		<item>
		<title>IDE Comparison</title>
		<link>http://daveyshafik.com/archives/548-ide-comparison.html</link>
		<comments>http://daveyshafik.com/archives/548-ide-comparison.html#comments</comments>
		<pubDate>Sun, 15 Mar 2009 13:52:48 +0000</pubDate>
		<dc:creator>Davey Shafik</dc:creator>
				<category><![CDATA[tagged]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[eclipse]]></category>
		<category><![CDATA[ide]]></category>
		<category><![CDATA[komodo]]></category>
		<category><![CDATA[netbeans]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[zend studio]]></category>

		<guid isPermaLink="false">http://pixelated-dreams.com/?p=548</guid>
		<description><![CDATA[<p>So it seems that some people want to know my opinions on different IDEs that I have tried in my quest to find a good upgrade path from Zend Studio 5.5  — as such, I have created a new page with an overview of my requirements, and a table comparing the various IDEs I have tried.</p>
<p><a href="http://pixelated-dreams.com/ide">Check out the IDE Comparison</a></p>
<p>I plan to follow up the page with in-depth posts on each requirement and how each IDE matches up.…</p>]]></description>
			<content:encoded><![CDATA[<p>So it seems that some people want to know my opinions on different IDEs that I have tried in my quest to find a good upgrade path from Zend Studio 5.5  — as such, I have created a new page with an overview of my requirements, and a table comparing the various IDEs I have tried.</p>
<p><a href="http://pixelated-dreams.com/ide">Check out the IDE Comparison</a></p>
<p>I plan to follow up the page with in-depth posts on each requirement and how each IDE matches up. Furthermore, any new IDEs I try will get a write-up on each of the requirements. Look for these in the coming weeks and months <img src='http://daveyshafik.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>- Davey</p>
<p><strong>Update: </strong>surprisingly, it took over 2hrs to get an e-mail telling me that VIM was the perfect IDE; I expected it far sooner. VIM might be the perfect IDE for some, but not for me. Though I do use it daily as a text editor on remote systems and like it for that purpose. Also, it&#8217;s great for editing <a href="http://xdebug.org">xdebug</a> human-readable traces thanks to <a href="http://derickrethans.nl/">Derick Rethans</a> vim syntax file.</p>
]]></content:encoded>
			<wfw:commentRss>http://daveyshafik.com/archives/548-ide-comparison.html/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>
