<?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/"
   
	 xmlns:podcast='http://ipodder.sourceforge.net/docs/podcast.html'
>
<channel>
    <title>Lot 49: Greg Beaver's blog - Computing</title>
    <link>http://greg.chiaraquartet.net/</link>
    <description>Music, Computers, and all things Greg Beaver</description>
    <dc:language>en</dc:language>
    <generator>Serendipity 1.4.1 - http://www.s9y.org/</generator>
    
    

<item>
    <title>PHP Advent, xUnit testing with phpt</title>
    <link>http://greg.chiaraquartet.net/archives/207-PHP-Advent,-xUnit-testing-with-phpt.html</link>
            <category>PHP</category>
    
    <comments>http://greg.chiaraquartet.net/archives/207-PHP-Advent,-xUnit-testing-with-phpt.html#comments</comments>
    <wfw:comment>http://greg.chiaraquartet.net/wfwcomment.php?cid=207</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://greg.chiaraquartet.net/rss.php?version=2.0&amp;type=comments&amp;cid=207</wfw:commentRss>
    

    <author>nospam@example.com (Greg Beaver)</author>
    <content:encoded>
    &lt;p&gt;Yesterday, the article I wrote for PHP Advent went live at &lt;a href=&quot;http://greg.chiaraquartet.net/exit.php?url_id=711&amp;amp;entry_id=207&quot; title=&quot;http://phpadvent.org/2009/testing-with-phpt-and-xunit-by-greg-beaver&quot;  onmouseover=&quot;window.status=&#039;http://phpadvent.org/2009/testing-with-phpt-and-xunit-by-greg-beaver&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;&gt;http://phpadvent.org/2009/testing-with-phpt-and-xunit-by-greg-beaver&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This is a simple, and potentially controversial article about what makes a good testing framework, and an alternative to PHPUnit for PHP users.&amp;#160; If you have any feedback, feel free to post comments here. &lt;br /&gt;&lt;/p&gt; 
    </content:encoded>

    <pubDate>Thu, 10 Dec 2009 11:13:00 -0700</pubDate>
    <guid isPermaLink="false">http://greg.chiaraquartet.net/archives/207-guid.html</guid>
    
</item>
<item>
    <title>How to put the FAIL in open source</title>
    <link>http://greg.chiaraquartet.net/archives/206-How-to-put-the-FAIL-in-open-source.html</link>
            <category>PHP</category>
    
    <comments>http://greg.chiaraquartet.net/archives/206-How-to-put-the-FAIL-in-open-source.html#comments</comments>
    <wfw:comment>http://greg.chiaraquartet.net/wfwcomment.php?cid=206</wfw:comment>

    <slash:comments>22</slash:comments>
    <wfw:commentRss>http://greg.chiaraquartet.net/rss.php?version=2.0&amp;type=comments&amp;cid=206</wfw:commentRss>
    

    <author>nospam@example.com (Greg Beaver)</author>
    <content:encoded>
    &lt;p&gt;There has been a bit of buzz about the new PHP standards working group (self-named) that has started work on a real cross-framework standard for the naming of classes and namespaces in PHP.&amp;#160; The idea is a wonderful one, and at first things looked like they were nothing but good.&amp;#160; A group of framework developers met at php|tek, whipped up a quick draft, and after returning home, started a new mailing list, &lt;a href=&quot;http://greg.chiaraquartet.net/exit.php?url_id=706&amp;amp;entry_id=206&quot; title=&quot;http://news.php.net/php.standards&quot;  onmouseover=&quot;window.status=&#039;http://news.php.net/php.standards&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;&gt;http://news.php.net/php.standards&lt;/a&gt; to discuss finalizing the draft discussed at php|tek.&lt;/p&gt; 
&lt;p&gt;At this point, signs of trouble began to crop up, and the good intentions began to result in a chill on the openness with suggestions of &lt;a href=&quot;http://greg.chiaraquartet.net/exit.php?url_id=707&amp;amp;entry_id=206&quot; title=&quot;http://news.php.net/php.standards/19&quot;  onmouseover=&quot;window.status=&#039;http://news.php.net/php.standards/19&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;&gt;reducing input through moderation&lt;/a&gt; and discussions of who was a &amp;quot;member&amp;quot; of the standards group.&amp;#160; None other than Rasmus made a &lt;a href=&quot;http://greg.chiaraquartet.net/exit.php?url_id=708&amp;amp;entry_id=206&quot; title=&quot;http://news.php.net/php.standards/29&quot;  onmouseover=&quot;window.status=&#039;http://news.php.net/php.standards/29&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;&gt;plea for more openness&lt;/a&gt;, which was answered by a resounding &amp;quot;no thanks&amp;quot; with the creation of the moderated &lt;a href=&quot;http://greg.chiaraquartet.net/exit.php?url_id=709&amp;amp;entry_id=206&quot; title=&quot;http://groups.google.com/group/php-standards&quot;  onmouseover=&quot;window.status=&#039;http://groups.google.com/group/php-standards&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;&gt;php-standards group&lt;/a&gt; at groups.google.com.&lt;/p&gt; 
&lt;p&gt;Since then, I have made several pleas, off-list and some on, to open the discussion and move things back to the way open source and specifically PHP works.&amp;#160; The reasoning is simple: open source thrives on contributions from all levels of hierarchy, not just a chosen few people who have developed prestige and karma by working on large-scale popular frameworks.&amp;#160; You don&#039;t have to take my word for it.&amp;#160; Immediately after the creation of the list, many non-members found immediate flaws in the standard, some of which were fixed, and many which were ignored and are now causing trouble on the moderated list.&amp;#160; This, ironically, is what led to the moderated list.&amp;#160; All I can conclude is that the people who came up with the standard actually are actively seeking a way to avoid valid input.&amp;#160; Harsh?&amp;#160; Perhaps.&amp;#160; Let&#039;s take a look at a recent thread:&lt;br /&gt;&lt;/p&gt; 
&lt;p&gt;&lt;a href=&quot;http://greg.chiaraquartet.net/exit.php?url_id=710&amp;amp;entry_id=206&quot; title=&quot;http://groups.google.com/group/php-standards/browse_thread/thread/5b85ca398ba90289&quot;  onmouseover=&quot;window.status=&#039;http://groups.google.com/group/php-standards/browse_thread/thread/5b85ca398ba90289&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;&gt;http://groups.google.com/group/php-standards/browse_thread/thread/5b85ca398ba90289&lt;/a&gt; epitomizes the closed nature of the standard.&amp;#160; I find it appalling.&lt;/p&gt;
&lt;p&gt;If you feel strongly that we need a standard, and want one that will actually be useful, you need to contact the people in the projects and demand that they open the process, or it will not happen, and the standard that they come up with will be hobbled by the lack of openness.&amp;#160; Nothing is worse than a standard that lacks a mandate and the legitimacy of being both open and well thought-out.&amp;#160; Make your voice heard!&lt;br /&gt;&lt;/p&gt; 
    </content:encoded>

    <pubDate>Tue, 17 Nov 2009 07:44:21 -0700</pubDate>
    <guid isPermaLink="false">http://greg.chiaraquartet.net/archives/206-guid.html</guid>
    
</item>
<item>
    <title>How to manage all that noise?  Where PHP development and chamber music rehearsal meet</title>
    <link>http://greg.chiaraquartet.net/archives/201-How-to-manage-all-that-noise-Where-PHP-development-and-chamber-music-rehearsal-meet.html</link>
            <category>Music</category>
            <category>PHP</category>
    
    <comments>http://greg.chiaraquartet.net/archives/201-How-to-manage-all-that-noise-Where-PHP-development-and-chamber-music-rehearsal-meet.html#comments</comments>
    <wfw:comment>http://greg.chiaraquartet.net/wfwcomment.php?cid=201</wfw:comment>

    <slash:comments>2</slash:comments>
    <wfw:commentRss>http://greg.chiaraquartet.net/rss.php?version=2.0&amp;type=comments&amp;cid=201</wfw:commentRss>
    

    <author>nospam@example.com (Greg Beaver)</author>
    <content:encoded>
    
&lt;p&gt;Lately, there have been many well-intentioned but I would contend misguided ideas proposed to handle noise on public programmer mailing lists.  The premise is that in fact there are very important messages being drowned out in a chorus of irrelevant messages from ill-informed developers.  Warnings of inefficiencies have been tossed about quite a bit as the curse of &amp;quot;bike shedding.&amp;quot;&lt;/p&gt;&lt;p&gt;To understand what they mean by &amp;quot;bike shedding,&amp;quot; one must know the bike shed parable.  Once upon a time, a group of people got together to build a nuclear reactor to power the city.  Everyone in the town said &amp;quot;great, we need more power,&amp;quot; and so they got to work designing the plant.  Everything was going great, the design of the reactor sailed by until one day, one of the citizens said &amp;quot;hey, let&#039;s build a bike shed for the workers so they don&#039;t have to come to work in cars and can get exercise.&amp;quot;  Everyone agreed until an argument broke out over whether to paint the shed blue or red.  Eventually, the whole process broke down, and the plant was never built because they couldn&#039;t choose a color to paint the bike shed.  The moral of the story: everyone agrees on the complex important things, but the process breaks down over arguments about irrelevant details.&lt;/p&gt;&lt;p&gt;I think we can all agree that this is a tragic parable, illustrating what happens when the process for decision-making breaks down.&lt;/p&gt;&lt;p&gt;When there is a problem of signal-to-noise ratio on a mailing list, the problem has to do with the process for accepting public input, I completely agree with this.  However, I am troubled by the implication that having unmoderated mailing lists is the intrinsic problem with open source that must be solved.  There is a crucial balance between rewarding quality and being open to the outsider that is the life blood of open source.  You could even think of it as the &amp;quot;affirmative action&amp;quot; of the programming world: we recognize that amateur programmers who do not come from the establishment of the temples of programming in academic computer science departments or even computing careers, may have ideas that are better than the most learned highest karma achiever.&lt;/p&gt;&lt;p&gt;For my musician reader: Open source thrives on meritocracy: the idea that those who can do junk have more influence than those who can&#039;t do as much junk.  Karma is the thing with which these individuals are rewarded.  Only those with karma are able to actually make changes to the source code.  It doesn&#039;t matter who you are, or what your background is, if you demonstrate good coding and community, you get karma.&lt;/p&gt;&lt;p&gt;String quartet rehearsal is similar, the best ideas get more weight regardless of whether the person who has them is playing the melody.&lt;/p&gt;&lt;p&gt;Why am I talking about string quartet rehearsal in a post about moderated programmer mailing lists?  I come from a profession (professional chamber music) where &amp;quot;karma&amp;quot; is a fluid object, and unlike the programming world tends to break down when we attempt to nail it down.  My string quartet has found that rather than try to decide who will be &amp;quot;the decider&amp;quot; for tough decisions, it&#039;s not just friendlier, but is also far more efficient to devote our individual energies to two essential things:&lt;/p&gt;&lt;p /&gt;&lt;ol&gt;&lt;li&gt;always try to find the bigger picture&lt;/li&gt;&lt;li&gt;always try to understand and respect everyone else&#039;s crackpot stupid ideas&lt;/li&gt;&lt;/ol&gt;&lt;p /&gt;&lt;p&gt;Sometimes they are crackpot, but most of the time, the reason they just seemed crackpot because they were outside the boundaries of our collective imaginations.&lt;/p&gt;&lt;p&gt;An example: in our first years together, we occasionally would get into endless arguments in my quartet about whether to play a particular musical section faster or slower (PHP developers: think endless namespace separator arguments).  After a long time of arguing about this, it usually turned out that we were asking the wrong question, until one day we would find the right question, which was something like &amp;quot;how long are the phrases?&amp;quot; (PHP developers: the right question turned out to be &amp;quot;how do we solve the ambiguity between static methods and namespaced functions?&amp;quot;).  After finding the right question, we stopped arguing nearly as much, and the music sounded much better after we all re-adjusted our thinking.&lt;/p&gt;&lt;p&gt;This illustrates an important distinction: the question of how fast to play was not an irrelevant &amp;quot;bike shedding&amp;quot; detail, it was a crucial part of the solution.  We still had to choose a speed to play, just as the nuclear power plant people still would need a place to put their bikes.  By changing the question from &amp;quot;How fast?&amp;quot; to &amp;quot;How long is the phrase?&amp;quot; we were actually solving the question of what color to paint the bike shed at the same time we solved the question of how to design access to the nuclear reactor, not ignoring it.&lt;/p&gt;&lt;p&gt;The best solution is for those with the most karma to use this power to redirect unfruitful arguments towards larger questions that can lead to a more natural solution to the problem, not to limit external input and even conflict.&lt;/p&gt;&lt;p&gt;Perhaps the principal designers of the ill-fated hypothetical nuclear power plant would have done better to instead suggest that the bike shed be integrated into the reactor building.  This would protect the bikes from the elements, and also require any bike thieves to go through security to get to the bikes - and eliminated the question of what color to paint the shed entirely without ignoring it.&lt;/p&gt;&lt;p&gt;It takes hard work and more than a little gut-wrenching conflict to resolve a truly important, difficult problem, and I for one, am willing to tolerate a little noise to find that gem which would otherwise be missed.&lt;/p&gt; 
    </content:encoded>

    <pubDate>Sun, 28 Jun 2009 17:54:34 -0700</pubDate>
    <guid isPermaLink="false">http://greg.chiaraquartet.net/archives/201-guid.html</guid>
    
</item>
<item>
    <title>code coverage reporting using PEAR, PEAR2, phar, and sqlite3</title>
    <link>http://greg.chiaraquartet.net/archives/200-code-coverage-reporting-using-PEAR,-PEAR2,-phar,-and-sqlite3.html</link>
            <category>PHP</category>
    
    <comments>http://greg.chiaraquartet.net/archives/200-code-coverage-reporting-using-PEAR,-PEAR2,-phar,-and-sqlite3.html#comments</comments>
    <wfw:comment>http://greg.chiaraquartet.net/wfwcomment.php?cid=200</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://greg.chiaraquartet.net/rss.php?version=2.0&amp;type=comments&amp;cid=200</wfw:commentRss>
    

    <author>nospam@example.com (Greg Beaver)</author>
    <content:encoded>
    
&lt;p&gt;I&#039;ve recently become enmeshed in developing Pyrus, PEAR&#039;s next generation installer (code coverage is moving up, 20% more coverage than my last blog post).  This blog post details my journey in making the process of verifying the correctness of the development via testing and code coverage smoother, exponentially faster and more robust as a result.&lt;/p&gt;&lt;p&gt;One of the problems I found when designing the new code for PEAR 1.4.0 (back in the day) was that it was very difficult to determine whether changes would break things.  The main problem revolves around the colossal size of the test suite.  Because of the complexity of some of the tests (they must download files from a fake internet and then install them into a fake registry and then verify it actually works), the suite takes between 15 and 35 minutes to run, depending on your hardware configuration and PHP version.&lt;/p&gt;&lt;p&gt;This is a real problem when trying to develop with any kind of flow.  If, after every change, one needs to sit through 35 minutes of tests, one will never develop anything of substance.  Thus, typically I ran a subset of the tests, develop quickly, and then do a run of the entire test suite to make sure there are no unintended breaks in the other code.  In addition, I had to simply assume that new tests I design actually execute the code in question, as it is not always possible to verify this directly in a passing or failing test.&lt;/p&gt;&lt;p&gt;The obvious solution here is to generate a code coverage report and go by that.  This, however, still does not fix the problem of accidentally not running tests that are affected by a change, and generating a code coverage report for the entire project is even more time consuming.&lt;/p&gt;&lt;p&gt;What to do?&lt;/p&gt;&lt;p&gt;There are a couple of solutions.  One is to set up a continuous integration server, and simply do minimal testing at home, and then commit-and-hope, fixing issues as they appear.  Although this is a process that is used at php.net very successfully (see &lt;a href=&quot;http://greg.chiaraquartet.net/exit.php?url_id=690&amp;amp;entry_id=200&quot; title=&quot;http://gcov.php.net&quot;  onmouseover=&quot;window.status=&#039;http://gcov.php.net&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;&gt;gcov.php.net&lt;/a&gt;), it doesn&#039;t fit my needs: I need to know right away whether I am testing the code I intend to test, and whether I am breaking anything else.&lt;/p&gt;&lt;p&gt;The solution I am toying with is a step beyond what &lt;a href=&quot;http://greg.chiaraquartet.net/exit.php?url_id=691&amp;amp;entry_id=200&quot; title=&quot;http://www.phpunit.de&quot;  onmouseover=&quot;window.status=&#039;http://www.phpunit.de&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;&gt;PHPUnit&lt;/a&gt; has to offer currently (yes I am aware of other testing frameworks, for all of you doubters out there, and have nothing against them except that I personally find my development to be more lithe with the &lt;a href=&quot;http://greg.chiaraquartet.net/exit.php?url_id=692&amp;amp;entry_id=200&quot; title=&quot;http://qa.php.net/write-test.php&quot;  onmouseover=&quot;window.status=&#039;http://qa.php.net/write-test.php&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;&gt;phpt&lt;/a&gt; test style).  PHPUnit offers &lt;a href=&quot;http://greg.chiaraquartet.net/exit.php?url_id=693&amp;amp;entry_id=200&quot; title=&quot;http://www.phpunit.de/manual/3.4/en/code-coverage-analysis.html&quot;  onmouseover=&quot;window.status=&#039;http://www.phpunit.de/manual/3.4/en/code-coverage-analysis.html&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;&gt;xdebug code coverage reports&lt;/a&gt;, and an option to do some fancy logging, to xml and to a database.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://greg.chiaraquartet.net/exit.php?url_id=694&amp;amp;entry_id=200&quot; title=&quot;http://pear.php.net/PEAR&quot;  onmouseover=&quot;window.status=&#039;http://pear.php.net/PEAR&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;&gt;PEAR&lt;/a&gt;&#039;s run-tests command offers xdebug code coverage raw data, saved as a &lt;a href=&quot;http://greg.chiaraquartet.net/exit.php?url_id=695&amp;amp;entry_id=200&quot; title=&quot;http://php.net/var_export&quot;  onmouseover=&quot;window.status=&#039;http://php.net/var_export&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;&gt;var_export&lt;/a&gt;()ed array, but no reporting.  PHP&#039;s buit-in run-tests.php runner for phpt tests does not offer xdebug code coverage at all.&lt;/p&gt;&lt;p&gt;Neither of these solves the problems I mentioned above.  What I dream of is a program that can automatically determine what files - test suites or code - have been modified, and automatically run tests that are affected by the changes, and then create a coverage report that I can view instantly.&lt;/p&gt;&lt;p&gt;Well, the dream is now a reality.  Using a combination of the old and new, it is now possible to do near-instantaneous super-targeted test execution and instant code coverage reporting.&lt;/p&gt;&lt;p&gt;There are 4 simple steps and 1 bigger step involved in making this a reality:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;install PHP 5.3 or newer from either the recent RC2 (or stable release, if you&#039;re reading this in the future) or from CVS&lt;/li&gt;&lt;li&gt;install PEAR 1.8.0 or newer&lt;/li&gt;&lt;li&gt;svn checkout http://svn.pear.php.net/PEAR2/all&lt;/li&gt;&lt;li&gt;copy all/Pyrus_Developer/src/Pyrus/Developer/CoverageAnalyzer/pear2coverage.phar.php to a web directory&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Once you have done these four, you need to grab test-modified.php from &lt;a href=&quot;http://greg.chiaraquartet.net/exit.php?url_id=696&amp;amp;entry_id=200&quot; title=&quot;http://cvs.php.net/viewvc.cgi/pear-core/test-modified.php?view=co&amp;amp;revision=1.4&amp;amp;content-type=text%2Fplain&quot;  onmouseover=&quot;window.status=&#039;http://cvs.php.net/viewvc.cgi/pear-core/test-modified.php?view=co&amp;amp;revision=1.4&amp;amp;content-type=text%2Fplain&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;&gt;http://cvs.php.net/viewvc.cgi/pear-core/test-modified.php?view=co&amp;amp;revision=1.4&amp;amp;content-type=text%2Fplain&lt;/a&gt; and change the paths for $codepath and $testpath to point at the project you are testing.&lt;/p&gt;&lt;p&gt;Next, run test-modified.php --norender.  This will run the phpt tests, and create a pear2coverage.db sqlite3 database in the tests directory.&lt;/p&gt;&lt;p&gt;Finally, browse to pear2coverage.phar.php in your browser, enter the /full/path/to/pear2coverage.db and voila - a fully working instant coverage report.&lt;/p&gt;&lt;p&gt;This setup is the most involved part.  As you develop, when you&#039;re ready to run tests, simply re-run php test-modified.php --norender, and the tests will be re-run, re-processed, and you will have a full coverage report available within about a minute&#039;s time.&lt;/p&gt;&lt;p&gt;I&#039;ve been using this to develop Pyrus (located in your all checkout at all/Pyrus), and it&#039;s been great.&lt;/p&gt;&lt;p&gt;I have plans to examine the feasibility of processing the XML files that PHPUnit outputs, as this would allow generating coverage reports from phpunit-based tests as well.  Unfortunately, I&#039;m not sure the database format PHPUnit supports is simple enough to work for my needs, as it has much more detail (such as which classes/methods are declared in files), in order to support more abstract coverage reporting.  Thus, I&#039;m not likely to add support for that into this coverage reporter, unless I can be convinced otherwise.&lt;/p&gt;&lt;p&gt;This also demonstrates the phar extension&#039;s power.  The web application is entirely contained within a phar archive, but web requests can be made for individual files directly, thus the generated html requests a .css file from within the phar, and it is served up by ext/phar with the correct mime type without any additional programming.&lt;/p&gt;&lt;p&gt;It&#039;s an exciting time to be developing in PHP, if you ask me.&lt;/p&gt;&lt;br /&gt;&lt;p /&gt; 
    </content:encoded>

    <pubDate>Mon, 13 Apr 2009 17:10:53 -0700</pubDate>
    <guid isPermaLink="false">http://greg.chiaraquartet.net/archives/200-guid.html</guid>
    
</item>
<item>
    <title>Pyrus, PEAR2 and web code coverage report for phpt-based tests</title>
    <link>http://greg.chiaraquartet.net/archives/199-Pyrus,-PEAR2-and-web-code-coverage-report-for-phpt-based-tests.html</link>
            <category>PEAR</category>
    
    <comments>http://greg.chiaraquartet.net/archives/199-Pyrus,-PEAR2-and-web-code-coverage-report-for-phpt-based-tests.html#comments</comments>
    <wfw:comment>http://greg.chiaraquartet.net/wfwcomment.php?cid=199</wfw:comment>

    <slash:comments>6</slash:comments>
    <wfw:commentRss>http://greg.chiaraquartet.net/rss.php?version=2.0&amp;type=comments&amp;cid=199</wfw:commentRss>
    

    <author>nospam@example.com (Greg Beaver)</author>
    <content:encoded>
    
&lt;p&gt;It&#039;s been a while since I reported on any of my PHP activities, and this update is long overdue.  I must apologize to Davey for not doing my 7 things, and to all of the facebook people for whom I didn&#039;t write 25 things.  I am somehow not at all motivated to do this...&lt;/p&gt;&lt;p&gt;In any case, now that work on ext/phar has shifted primarily to maintenance mode, and namespaces are finally ancient history, I&#039;ve shifted all of my coding energy to getting Pyrus, PEAR&#039;s next-generation installer, ready to ship.  Pyrus is basically the PEAR installer completely redesigned for PHP 5.3, and it takes advantage of as many of PHP&#039;s new bells and whistles as makes sense.  Some of the exciting features:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Full support for .tar, .tgz, .tbz, .zip, and .phar archive formats out of the box, complete with signing via md5, sha1, sha256, sha512, or asymmetric true signature via openssl signature (all from ext/phar, which is built into PHP 5.3)&lt;/li&gt;&lt;li&gt;primary registry is SQLite3-based, which is much more robust, and can be relocated very easily, plus support for XML file-based registry as well as PEAR 1.x&#039;s serialize-based registry&lt;/li&gt;&lt;li&gt;redundant registries means ability to reconstruct a corrupted install&lt;/li&gt;&lt;li&gt;configuration is stored with the installed files, no more hunting down errant config files, user preferences are stored in home directory or equivalent&lt;/li&gt;&lt;li&gt;for developers: easy generation of package.xml straight from source code checkout&lt;/li&gt;&lt;li&gt;also for developer: easy generation of channel REST files directly from release tarball, no need to install a package (like the old Chiara_PEAR_Server) or even run PHP on the channel web server.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;There are many other great features for users who would like to extend Pyrus, including a seamless API for accessing package.xml which is identical regardless of whether the package.xml is from an .xml file, an archive, or an installed package&#039;s registry.&lt;/p&gt;&lt;p&gt;Of course, all of these features only matter if they work, and to move along that path, I&#039;ve been spending my time unit testing up a storm.  Using the run-tests command of the old PEAR installer, I&#039;m writing and refining tests.  With the addition of xdebug code coverage (pear run-tests -rx does the trick), it is possible to see where stuff is being executed.  Unfortunately, I don&#039;t like the existing reporting tools (call me a snob), so I whipped up a very simple coverage analyzer and popped it into the subversion where all of PEAR2 is stored.&lt;/p&gt;&lt;p&gt;When I say simple, I mean here is the script for generating the source (&lt;a href=&quot;http://greg.chiaraquartet.net/exit.php?url_id=679&amp;amp;entry_id=199&quot; title=&quot;http://svn.pear.php.net/wsvn/PEARSVN/Pyrus_Developer/src/Pyrus/Developer/CoverageAnalyzer/?rev=0&amp;amp;sc=0&quot;  onmouseover=&quot;window.status=&#039;http://svn.pear.php.net/wsvn/PEARSVN/Pyrus_Developer/src/Pyrus/Developer/CoverageAnalyzer/?rev=0&amp;amp;sc=0&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;&gt;svn link&lt;/a&gt;):&lt;/p&gt;&lt;p&gt;&lt;div class=&quot;php&quot; style=&quot;text-align: left&quot;&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;lt;?php&lt;/span&gt;&lt;br /&gt;namespace &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;function&lt;/span&gt; __autoload&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;$c&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;&amp;#160; &amp;#160; &lt;span style=&quot;color: #0000ff;&quot;&gt;$c&lt;/span&gt; = &lt;a href=&quot;http://www.php.net/str_replace&quot;&gt;&lt;span style=&quot;color: #000066;&quot;&gt;str_replace&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&#039;PEAR2&lt;span style=&quot;color: #000099; font-weight: bold;&quot;&gt;\P&lt;/span&gt;yrus&lt;span style=&quot;color: #000099; font-weight: bold;&quot;&gt;\D&lt;/span&gt;eveloper&lt;span style=&quot;color: #000099; font-weight: bold;&quot;&gt;\C&lt;/span&gt;overageAnalyzer&lt;span style=&quot;color: #000099; font-weight: bold;&quot;&gt;\\&lt;/span&gt;&#039;&lt;/span&gt;, &lt;span style=&quot;color: #ff0000;&quot;&gt;&#039;&#039;&lt;/span&gt;, &lt;span style=&quot;color: #0000ff;&quot;&gt;$c&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;&amp;#160; &amp;#160; &lt;span style=&quot;color: #b1b100;&quot;&gt;include&lt;/span&gt; __DIR__ . &lt;span style=&quot;color: #ff0000;&quot;&gt;&#039;/&#039;&lt;/span&gt; . &lt;span style=&quot;color: #0000ff;&quot;&gt;$c&lt;/span&gt; . &lt;span style=&quot;color: #ff0000;&quot;&gt;&#039;.php&#039;&lt;/span&gt;;&lt;br /&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;namespace PEAR2\Pyrus\Developer\CoverageAnalyzer &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;&amp;#160; &amp;#160; &lt;span style=&quot;color: #0000ff;&quot;&gt;$a&lt;/span&gt; = &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;new&lt;/span&gt; Aggregator&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;a href=&quot;http://www.php.net/realpath&quot;&gt;&lt;span style=&quot;color: #000066;&quot;&gt;realpath&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&#039;../../../../../Pyrus/tests&#039;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;, &lt;a href=&quot;http://www.php.net/realpath&quot;&gt;&lt;span style=&quot;color: #000066;&quot;&gt;realpath&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&#039;../../../../../Pyrus/src&#039;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;&amp;#160; &amp;#160; &lt;span style=&quot;color: #b1b100;&quot;&gt;if&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;a href=&quot;http://www.php.net/file_exists&quot;&gt;&lt;span style=&quot;color: #000066;&quot;&gt;file_exists&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;__DIR__ . &lt;span style=&quot;color: #ff0000;&quot;&gt;&#039;/test&#039;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;span style=&quot;color: #b1b100;&quot;&gt;foreach&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;new&lt;/span&gt; DirectoryIterator&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;__DIR__ . &lt;span style=&quot;color: #ff0000;&quot;&gt;&#039;/test&#039;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #b1b100;&quot;&gt;as&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;$file&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;span style=&quot;color: #b1b100;&quot;&gt;if&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;$file&lt;/span&gt;-&amp;gt;&lt;span style=&quot;color: #006600;&quot;&gt;isDot&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #b1b100;&quot;&gt;continue&lt;/span&gt;;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;a href=&quot;http://www.php.net/unlink&quot;&gt;&lt;span style=&quot;color: #000066;&quot;&gt;unlink&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;$file&lt;/span&gt;-&amp;gt;&lt;span style=&quot;color: #006600;&quot;&gt;getPathName&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;&amp;#160; &amp;#160; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt; &lt;span style=&quot;color: #b1b100;&quot;&gt;else&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;a href=&quot;http://www.php.net/mkdir&quot;&gt;&lt;span style=&quot;color: #000066;&quot;&gt;mkdir&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;__DIR__ . &lt;span style=&quot;color: #ff0000;&quot;&gt;&#039;/test&#039;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;&amp;#160; &amp;#160; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;&amp;#160; &amp;#160; &lt;span style=&quot;color: #0000ff;&quot;&gt;$a&lt;/span&gt;-&amp;gt;&lt;span style=&quot;color: #006600;&quot;&gt;render&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;__DIR__ . &lt;span style=&quot;color: #ff0000;&quot;&gt;&#039;/test&#039;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;?&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/p&gt;&lt;p&gt;Highlighting is a little wonky because this is PHP 5.3+ code, but my blog is running 5.2.&lt;/p&gt;&lt;p&gt;The output is at &lt;a href=&quot;http://greg.chiaraquartet.net/exit.php?url_id=685&amp;amp;entry_id=199&quot; title=&quot;http://pear.php.net/~greg/coverage/&quot;  onmouseover=&quot;window.status=&#039;http://pear.php.net/~greg/coverage/&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;&gt;http://pear.php.net/~greg/coverage/&lt;/a&gt;.  This is a dumbed-down version of &lt;a href=&quot;http://greg.chiaraquartet.net/exit.php?url_id=686&amp;amp;entry_id=199&quot; title=&quot;http://gcov.php.net&quot;  onmouseover=&quot;window.status=&#039;http://gcov.php.net&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;&gt;gcov.php.net&lt;/a&gt;, which I found extraordinarily helpful when writing the unit tests for ext/phar, but unlike gcov, there are some fantastically helpful features.  The short list:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;summary of all executed files and their coverage&lt;/li&gt;&lt;li&gt;project coverage (lines executed, lines covered, and the percentage of covered code)&lt;/li&gt;&lt;li&gt;annotated source showing the lines covered with hyperlinks to lists of tests that cover each line&lt;/li&gt;&lt;li&gt;this one excites me: per-test code coverage.&lt;/li&gt;&lt;/ol&gt;For instance, &lt;a href=&quot;http://greg.chiaraquartet.net/exit.php?url_id=687&amp;amp;entry_id=199&quot; title=&quot;http://pear.php.net/~greg/coverage/line-660-cov-@Pyrus@PackageFile@v2.php.html&quot;  onmouseover=&quot;window.status=&#039;http://pear.php.net/~greg/coverage/line-660-cov-@Pyrus@PackageFile@v2.php.html&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;&gt;this report&lt;/a&gt; shows the tests that execute line 660 of PackageFile/v2.php, &lt;a href=&quot;http://greg.chiaraquartet.net/exit.php?url_id=688&amp;amp;entry_id=199&quot; title=&quot;http://pear.php.net/~greg/coverage/test-@PackageFile_v2@basic@file.phpt.html&quot;  onmouseover=&quot;window.status=&#039;http://pear.php.net/~greg/coverage/test-@PackageFile_v2@basic@file.phpt.html&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;&gt;next this report&lt;/a&gt; shows the files that the PackageFile_v2/basic/file.phpt test actually executes with their proportional coverage, and &lt;a href=&quot;http://greg.chiaraquartet.net/exit.php?url_id=689&amp;amp;entry_id=199&quot; title=&quot;http://pear.php.net/~greg/coverage/cov-test--@Pyrus@PackageFile@v2.php.html&quot;  onmouseover=&quot;window.status=&#039;http://pear.php.net/~greg/coverage/cov-test--@Pyrus@PackageFile@v2.php.html&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;&gt;finally this report&lt;/a&gt; shows &lt;p&gt;the lines in PackageFile/v2.php that are executed by the file.phpt test.&lt;/p&gt;&lt;p&gt;This last part is extremely useful to me, I have already used it to determine when a test is not executing the lines I expect it should be, and to fix problems such as using isset() instead of array_key_exists(), which would otherwise be very difficult to track down.&lt;/p&gt;&lt;p&gt;As you can also see, only 30% of the source to Pyrus is covered by the current tests, and so there is a long ways to go to full coverage.  If any of this work interests you, feel free to contribute, PEAR2 has a much lower barrier to entry than PEAR, and as you can see, we need all the help we can get to bring this baby off the ground.&lt;/p&gt; 
    </content:encoded>

    <pubDate>Sat, 14 Feb 2009 15:55:29 -0700</pubDate>
    <guid isPermaLink="false">http://greg.chiaraquartet.net/archives/199-guid.html</guid>
    
</item>
<item>
    <title>Music, PEAR, phar, namespaces and Macs.  Oh my!</title>
    <link>http://greg.chiaraquartet.net/archives/198-Music,-PEAR,-phar,-namespaces-and-Macs.-Oh-my!.html</link>
            <category>Chiara Quartet</category>
            <category>Mac Development</category>
            <category>Music</category>
            <category>PEAR</category>
            <category>PHP</category>
    
    <comments>http://greg.chiaraquartet.net/archives/198-Music,-PEAR,-phar,-namespaces-and-Macs.-Oh-my!.html#comments</comments>
    <wfw:comment>http://greg.chiaraquartet.net/wfwcomment.php?cid=198</wfw:comment>

    <slash:comments>4</slash:comments>
    <wfw:commentRss>http://greg.chiaraquartet.net/rss.php?version=2.0&amp;type=comments&amp;cid=198</wfw:commentRss>
    

    <author>nospam@example.com (Greg Beaver)</author>
    <content:encoded>
    
&lt;p&gt;Why the tri-partite title?  I&#039;ve been silent for a while on the blog, but the title sums up my life for the past several months.  What have I been doing?  Aside from some crazy music work learning a
blisteringly difficult Elliot Carter String Quartet No. 4 as well as
Steve Reich&#039;s Different Trains, Bartok&#039;s 6th Quartet, bringing back
Korngold 3rd Quartet, learning Carter&#039;s Figment for solo cello, and
performing Bach&#039;s 5th Suite for Unaccompanied Cello for the first time,
I&#039;ve also been pretty active in coding.  I acquired a new Macbook Pro with &lt;a href=&quot;http://greg.chiaraquartet.net/exit.php?url_id=662&amp;amp;entry_id=198&quot; title=&quot;http://www.vmware.com/products/fusion/&quot;  onmouseover=&quot;window.status=&#039;http://www.vmware.com/products/fusion/&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;&gt;VMWare Fusion&lt;/a&gt; running Windows XP and Ubuntu, and it has made development super-easy.  I also put in a significant effort on the phone getting &lt;a href=&quot;http://greg.chiaraquartet.net/exit.php?url_id=663&amp;amp;entry_id=198&quot; title=&quot;http://www.barackobama.com/&quot;  onmouseover=&quot;window.status=&#039;http://www.barackobama.com/&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;&gt;Barack&lt;/a&gt; his electoral vote in the Omaha area, which seems to have paid off.  So, here&#039;s the long version of what I&#039;ve been doing.&lt;/p&gt;&lt;h3&gt;Music and Macs&lt;/h3&gt;&lt;h4&gt;first the music&lt;/h4&gt;&lt;p&gt;The past month has seen my time consumed learning &lt;a href=&quot;http://greg.chiaraquartet.net/exit.php?url_id=678&amp;amp;entry_id=198&quot; title=&quot;http://www.boosey.com/pages/cr/catalogue/cat_detail.asp?musicid=3563&quot;  onmouseover=&quot;window.status=&#039;http://www.boosey.com/pages/cr/catalogue/cat_detail.asp?musicid=3563&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;&gt;Elliot Carter&#039;s 4th String Quartet&lt;/a&gt; for the &lt;a href=&quot;http://greg.chiaraquartet.net/exit.php?url_id=665&amp;amp;entry_id=198&quot; title=&quot;http://www.scena.org/blog/newswire/2008/10/nec-celebrates-elliott-carter-100th.html&quot;  onmouseover=&quot;window.status=&#039;http://www.scena.org/blog/newswire/2008/10/nec-celebrates-elliott-carter-100th.html&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;&gt;100th birthday thing&lt;/a&gt; in Boston.  Although I have not learned the others, a few veterans have reported that it is the most difficult.  I certainly found it to be the most difficult thing I&#039;ve ever learned by a long shot.  It took me almost 15 hours of work to be able to play the first page (only 15 measures of music) at 3/4 of the printed tempo, and the piece is 35 pages in the cello part.  To contrast, page 35 of the 10 Celebrated Mozart Quartet cello part is the third movement of &lt;b&gt;6th&lt;/b&gt; string quartet in the book.  Carter 4th&#039;s cello part is as long as 6 Mozart quartet cello parts.  However, it is shorter than some of the 4 page Mozart quartets, because it is frickin fast and there are lots and lots of notes.  It is the most holy s*** hard piece I&#039;ve ever learned, and for a while, I was scared it just wasn&#039;t going to be possible.&lt;/p&gt;&lt;p&gt;In addition, one of Carter&#039;s big compositional inventions is the &lt;i&gt;metric modulation&lt;/i&gt; in which a tempo change has a distinct rhythmic relationship.  He uses some pretty normal ones in the first movement (the 16th note becomes the new triplet), but the other movements have fun ones such as the 16th note becoming the new septuplet.  Because most of my part is written in septuplets, this can be difficult to do.  Speeding up septuplets so that you fit 7 into what used to be the space of 6 septuplets is not an easy thing to learn at all.&lt;/p&gt;&lt;h4&gt;...then the mac&lt;/h4&gt;&lt;p&gt;...unless you have a metronome that can do the metric modulation.  We had been using a web-based metronome to plug into our studio&#039;s stereo to rehearse, because it had a more pleasing beat than any of our metronomes have, and it occurred to me that I could probably pretty easily write a metronome that is capable of doing metric modulations on my new Macbook Pro.&lt;/p&gt;&lt;p&gt;So, I took it upon myself to learn &lt;a href=&quot;http://greg.chiaraquartet.net/exit.php?url_id=666&amp;amp;entry_id=198&quot; title=&quot;http://developer.apple.com/documentation/Cocoa/Conceptual/ObjectiveC/Introduction/chapter_1_section_1.html&quot;  onmouseover=&quot;window.status=&#039;http://developer.apple.com/documentation/Cocoa/Conceptual/ObjectiveC/Introduction/chapter_1_section_1.html&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;&gt;Objective-C&lt;/a&gt; and the &lt;a href=&quot;http://greg.chiaraquartet.net/exit.php?url_id=667&amp;amp;entry_id=198&quot; title=&quot;http://developer.apple.com/cocoa/&quot;  onmouseover=&quot;window.status=&#039;http://developer.apple.com/cocoa/&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;&gt;Cocoa framework&lt;/a&gt; in Xcode to write a metronome.  It took me just over a day to learn Objective-C; it&#039;s very easy for a C coder to pick up, and the syntax is pretty simple.  Learning Cocoa fully took quite a bit longer, but after 3 days I had a working metronome that could do metric modulations (&lt;a href=&quot;http://greg.chiaraquartet.net/exit.php?url_id=668&amp;amp;entry_id=198&quot; title=&quot;http://chiaraquartet.net/ChiaraMetronome1.0.0.dmg&quot;  onmouseover=&quot;window.status=&#039;http://chiaraquartet.net/ChiaraMetronome1.0.0.dmg&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;&gt;http://chiaraquartet.net/ChiaraMetronome1.0.0.dmg&lt;/a&gt;).  It had several flaws, not the least of which was the inability to insert a measure group, no way to save your work, and some odd behavior on the first beat (sometimes it is late and fast).&lt;/p&gt;&lt;p&gt;After a few more days of digging, I had figured out most of the quirks (and discovered bindings and Core Data, which simplified things) and had the interface greatly simplifed (&lt;a href=&quot;http://greg.chiaraquartet.net/exit.php?url_id=669&amp;amp;entry_id=198&quot; title=&quot;http://chiaraquartet.net/ChiaraMetronome1.2.2.dmg&quot;  onmouseover=&quot;window.status=&#039;http://chiaraquartet.net/ChiaraMetronome1.2.2.dmg&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;&gt;http://chiaraquartet.net/ChiaraMetronome1.2.2.dmg&lt;/a&gt;).  I added the ability to start at any measure in the piece, and to have lead-in measures (which allow you to start the metronome, sit down, find the beat, and then start playing).&lt;/p&gt;&lt;p&gt;Then, I discovered document-based Core Data, which allowed saving files, resulting in the next generation (&lt;a href=&quot;http://greg.chiaraquartet.net/exit.php?url_id=670&amp;amp;entry_id=198&quot; title=&quot;http://chiaraquartet.net/ChiaraMetronome2.0.0.dmg&quot;  onmouseover=&quot;window.status=&#039;http://chiaraquartet.net/ChiaraMetronome2.0.0.dmg&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;&gt;http://chiaraquartet.net/ChiaraMetronome2.0.0.dmg&lt;/a&gt;).&lt;/p&gt;&lt;p&gt;Finally, not to leave an unturned stone, I added the final features, the ability to specify whether a beat is accented, beated or silent, which allows implementation of uneven compound meters (like 5/8), and the ability to accelerate or decelerate tempo, and we have the final version &lt;a href=&quot;http://greg.chiaraquartet.net/exit.php?url_id=671&amp;amp;entry_id=198&quot; title=&quot;http://chiaraquartet.net/ChiaraMetronome3.0.0.dmg&quot;  onmouseover=&quot;window.status=&#039;http://chiaraquartet.net/ChiaraMetronome3.0.0.dmg&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;&gt;http://chiaraquartet.net/ChiaraMetronome3.0.0.dmg&lt;/a&gt;.  This version contains 3 sample metronomes, the complete Elliot Carter 4th quartet we used to practice the tempo changes, a sample demonstrating accelerando/ritardando, and a sample demonstrating how the metronome can be used to practice complex polyrhythms like 6 against 7.&lt;/p&gt;&lt;p&gt;In my potentially humble opinion, the metronome is my crowning glory as a programmer, it is incredible for learning complex tempo relationships for composers like Carter and Bartok who call for it.  It&#039;s also important to note that this metronome should &lt;b&gt;NEVER&lt;/b&gt; be used for learning music by composers such as Brahms or Mozart.  If I hear of anyone using it for that, I will hunt you down and make you listen to Beethoven 9 with your eyelids peeled back watching &lt;a href=&quot;http://greg.chiaraquartet.net/exit.php?url_id=672&amp;amp;entry_id=198&quot; title=&quot;http://www.youtube.com/watch?v=kiaLOzP1lCA&quot;  onmouseover=&quot;window.status=&#039;http://www.youtube.com/watch?v=kiaLOzP1lCA&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;&gt;Teletubbies&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Short feature list:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;free, released as a beta with no implied license or warranty.  I still own the copyright, so you can&#039;t use it in your own programming projects or sell it without infringing on the copyright.  You can use it for your own practicing, and I will eventually release the source under an open-source friendly license once I have time to research the options.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Please send me any metronome files you create, I&#039;ll start a public repository that people can download them from&lt;/b&gt;&lt;/li&gt;&lt;li&gt;requires Mac OS X Leopard (version 10.5.0) or newer&lt;/li&gt;&lt;li&gt;universal binary&lt;/li&gt;&lt;li&gt;relative tempo slider can be used to practice under tempo and click up the metronome, preserving tempo relationships at tempo changes&lt;/li&gt;&lt;li&gt;ability to program in endless tempo (0 bars) or a limited number of bars of a tempo&lt;/li&gt;&lt;li&gt;ability to do compound meters, both even and uneven&lt;/li&gt;&lt;li&gt;ability to do accelerando/ritardando, including ones that cross tempo group boundaries using the tempo calculator&lt;/li&gt;&lt;li&gt;ability to start and end accelerando/ritardando mid-bar.  No support for mid-beat start/stop, but this can be simulated by doubling the number of beats and making the mid-beats silent.  For example: instead of 4 beats at 60 bpm, choose 8 beats, and make 2,4,6 and 8 silent, with double the tempo, 120 bpm, then start the accel on beat 4 to start on the and of 2.&lt;/li&gt;&lt;li&gt;complete undo/redo support&lt;/li&gt;&lt;li&gt;ability to split up a tempo group, insert a new tempo group, or copy a set of tempo groups and paste them (copy button)&lt;/li&gt;&lt;li&gt;ability to play only a limited set of tempo groups, simply shift-click or command-click the tempo groups.  This can be used, for instance, to skip a repeat in practicing.&lt;/li&gt;&lt;li&gt;ability to accent all downbeats with a simple click.&lt;/li&gt;&lt;li&gt;start at any bar in the piece.&lt;/li&gt;&lt;li&gt;lead-in bars to help prepare tempo prior to playing.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;PEAR&lt;/h3&gt;&lt;p&gt;Today, I upgrade &lt;a href=&quot;http://greg.chiaraquartet.net/exit.php?url_id=673&amp;amp;entry_id=198&quot; title=&quot;http://pear.chiaraquartet.net&quot;  onmouseover=&quot;window.status=&#039;http://pear.chiaraquartet.net&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;&gt;pear.chiaraquartet.net&lt;/a&gt; to the latest version, 0.19.0, which Brett Bieber has been working hard to perfect.  The look is a bit cleaner, and I also replaced the defunct Crtx_Frontend_Chiara (or whatever it was called) with the newly minted Chiara_Pear_Server_Frontend_Web which is a direct port over of the old frontend with bugfixes and visual tweaks.&lt;/p&gt;&lt;h3&gt;PEAR and phar&lt;/h3&gt;&lt;p&gt;A high priority for PEAR is minting its next-generation installer, &lt;a href=&quot;http://greg.chiaraquartet.net/exit.php?url_id=674&amp;amp;entry_id=198&quot; title=&quot;http://svn.pear.php.net/wsvn/PEARSVN/Pyrus/?rev=0&amp;amp;sc=0&quot;  onmouseover=&quot;window.status=&#039;http://svn.pear.php.net/wsvn/PEARSVN/Pyrus/?rev=0&amp;amp;sc=0&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;&gt;Pyrus&lt;/a&gt;.  Pyrus is based on PHP 5.3+, and thus I expended a tremendous amount of energy on the new &lt;a href=&quot;http://greg.chiaraquartet.net/exit.php?url_id=675&amp;amp;entry_id=198&quot; title=&quot;http://php.net/phar&quot;  onmouseover=&quot;window.status=&#039;http://php.net/phar&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;&gt;phar&lt;/a&gt; extension,which will be enabled by default in PHP 5.3.  The phar extension provides several must-have features for Pyrus:&lt;/p&gt;&lt;p /&gt;&lt;ol&gt;&lt;li&gt;ability to run out-of-the-box applications without installing or extracting them (a la Java&#039;s jar) in zip, tar or native phar file format&lt;/li&gt;&lt;li&gt;ability to create data archives in tar or zip format and convert between them&lt;/li&gt;&lt;li&gt;ability to automatically handle oddities of running an application inside an uncompressed file&lt;/li&gt;&lt;li&gt;web-based applications without extraction&lt;/li&gt;&lt;/ol&gt;&lt;p /&gt;&lt;p&gt;I&#039;m very pleased this will be built into PHP 5.3, it cuts out oodles of code from Pyrus, and will significantly affect both its performance and memory footprint.&lt;/p&gt;&lt;h3&gt;PEAR and namespaces. Oh MY!&lt;/h3&gt;&lt;p&gt;Also important for PEAR2 is making it easier to work with the names, so I&#039;ve been fighting in &lt;a href=&quot;http://greg.chiaraquartet.net/exit.php?url_id=676&amp;amp;entry_id=198&quot; title=&quot;http://www.google.com/search?q=php+namespace+separator&quot;  onmouseover=&quot;window.status=&#039;http://www.google.com/search?q=php+namespace+separator&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;&gt;the namespace wars&lt;/a&gt;.  For a while there, it was looking like namespaces would go the way they had in the PHP 5 beta cycle: to the trash can.  With a little bit of work, we found a solution no one is 100% happy with, but having tried out several possibilities, I must say the solution we chose is something we can be proud of.  There have been many complainers, but the irony I have seen is that most assert they never planned to use namespaces in the first place, which begs the question: why flap your trap if you have no plan to use the thing?  In any case, you know where I stand on the issue.  I wrote &lt;a href=&quot;http://greg.chiaraquartet.net/exit.php?url_id=677&amp;amp;entry_id=198&quot; title=&quot;http://php.net/namespaces&quot;  onmouseover=&quot;window.status=&#039;http://php.net/namespaces&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;&gt;the new manual&lt;/a&gt; as well as the first draft of the patch that made it possible to end the bickering on internals.  A big thanks to Dmitry Stogov and Stanislav Malyshev for their patience, and especially persistence in working out the solution.  Also thanks to many others who fielded opinions on-list, on IRC, and through private email.  Anyone who contributed a real concern rationally and sometimes forcefully deserves credit for the final implementation, and time will prove that it is a very good one for those who need it.&lt;/p&gt;&lt;p&gt;I am, of course, referring to the now infamous decision to use the backslash (\) as the namespace separator in PHP&#039;s implementation of namespaces.  I won&#039;t go into the rationale, except to say that PHP, unlike other languages, implements a very loose autoload implementation, which makes it impossible to do the most common solution to resolving a name conflict between a static method and a namespaced function - disallow that.  In other words, it&#039;s not possible to detect the conflict unless autoload is called on every potential namespaced function call, which introduces a potentially exponential hidden performance loss.  As Stanislav so eloquently put it, name conflicts have not caused major websites to go down, but performance issues have.  Thus, anything that calls autoload where it may be unnecessary is an unacceptable solution, and the only way to safely handle the ambiguity is to eliminate it.&lt;/p&gt;&lt;p&gt;That is what using the backslash does, because the syntax is different between a namespaced function call and a static method.  Complain or ridicule if you&#039;d like, the rest of us will simply shut up and code.&lt;/p&gt;&lt;p&gt;This decision has several other benefits too, including the ability to audit someone else&#039;s code and figure out what you should grep for, a namespace or a class name.  This also translates into better autocomplete in future IDEs, and so on.&lt;/p&gt;&lt;h3&gt;Wrap up&lt;/h3&gt;&lt;p&gt;So, it&#039;s been a long blog post, but a lot has happened in the past several months, and it&#039;s time to get cracking on the future.  More will follow as time allows.&lt;/p&gt;
 
    </content:encoded>

    <pubDate>Tue, 09 Dec 2008 21:00:17 -0700</pubDate>
    <guid isPermaLink="false">http://greg.chiaraquartet.net/archives/198-guid.html</guid>
    
</item>
<item>
    <title>pear.chiaraquartet.net back online</title>
    <link>http://greg.chiaraquartet.net/archives/196-pear.chiaraquartet.net-back-online.html</link>
            <category>PEAR</category>
    
    <comments>http://greg.chiaraquartet.net/archives/196-pear.chiaraquartet.net-back-online.html#comments</comments>
    <wfw:comment>http://greg.chiaraquartet.net/wfwcomment.php?cid=196</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://greg.chiaraquartet.net/rss.php?version=2.0&amp;type=comments&amp;cid=196</wfw:commentRss>
    

    <author>nospam@example.com (Greg Beaver)</author>
    <content:encoded>
    For those of you who were wondering where pear.chiaraquartet.net went, we suffered the same fate as Josh Eichorn&#039;s blog and other sites, but all has been restored.
 
    </content:encoded>

    <pubDate>Tue, 04 Nov 2008 22:41:59 -0700</pubDate>
    <guid isPermaLink="false">http://greg.chiaraquartet.net/archives/196-guid.html</guid>
    
</item>
<item>
    <title>Macbook Pro lives up to expectations</title>
    <link>http://greg.chiaraquartet.net/archives/194-Macbook-Pro-lives-up-to-expectations.html</link>
            <category>PHP</category>
    
    <comments>http://greg.chiaraquartet.net/archives/194-Macbook-Pro-lives-up-to-expectations.html#comments</comments>
    <wfw:comment>http://greg.chiaraquartet.net/wfwcomment.php?cid=194</wfw:comment>

    <slash:comments>5</slash:comments>
    <wfw:commentRss>http://greg.chiaraquartet.net/rss.php?version=2.0&amp;type=comments&amp;cid=194</wfw:commentRss>
    

    <author>nospam@example.com (Greg Beaver)</author>
    <content:encoded>
    
&lt;p&gt;Well, it&#039;s been a long and practically empty summer for me in terms of coding, what with hardly any internet access and even less time.  I did manage to have time to improve the scheduling program I wrote for &lt;a href=&quot;http://greg.chiaraquartet.net/exit.php?url_id=658&amp;amp;entry_id=194&quot; title=&quot;http://www.greenwoodmusiccamp.org&quot;  onmouseover=&quot;window.status=&#039;http://www.greenwoodmusiccamp.org&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;&gt;Greenwood Music Camp&lt;/a&gt; where we are in residence, but that was it.&lt;/p&gt;&lt;p&gt;Now, a new leaf has been turned over.  The &lt;a href=&quot;http://greg.chiaraquartet.net/exit.php?url_id=659&amp;amp;entry_id=194&quot; title=&quot;http://www.chiaraquartet.net&quot;  onmouseover=&quot;window.status=&#039;http://www.chiaraquartet.net&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;&gt;Chiara Quartet&lt;/a&gt; has a residency at the &lt;a href=&quot;http://greg.chiaraquartet.net/exit.php?url_id=660&amp;amp;entry_id=194&quot; title=&quot;http://www.unl.edu/music&quot;  onmouseover=&quot;window.status=&#039;http://www.unl.edu/music&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;&gt;University of Nebraska-Lincoln&lt;/a&gt; that began in 2005 for a 3-year term.  Much to our delight, the residency was renewed for another three years, and converted into a permanent residency.  None of this has much to do with programming, but a perk of this job is that every 3 years, we get a new computer to replace the old one.  This cycle, I requested a Macbook Pro, my first Mac, as I have been using a PC for years.&lt;/p&gt;&lt;p&gt;I had the tech peoples set up &lt;a href=&quot;http://greg.chiaraquartet.net/exit.php?url_id=661&amp;amp;entry_id=194&quot; title=&quot;http://www.vmware.com/products/fusion/&quot;  onmouseover=&quot;window.status=&#039;http://www.vmware.com/products/fusion/&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;&gt;VMWare Fusion&lt;/a&gt; for me, and so I am currently running Mac OS X, Ubuntu Linux, and Windows XP simultaneously with noticeable performance gain over any previous computer I have owned, including my custom 64-bit Kubuntu desktop.  The screen is beautiful (15 inch Matte) and speakers far superior to other Macs I&#039;ve heard as well as the Toshiba laptop I will soon return.  I was able to very quickly set up a working PHP 5.3 with xdebug and Komodo in Mac and linux, and almost have the windows side compilation of PHP working, which will greatly accelerate my development.  The ability to share changes with the shared folders between all 3 boxes will be a tremendous boon to my development, this will be fantastic.&lt;/p&gt;&lt;p&gt;It feels good to drop Windows as the native platform too, it&#039;s been a long time coming.&lt;/p&gt;
 
    </content:encoded>

    <pubDate>Thu, 14 Aug 2008 15:35:30 -0700</pubDate>
    <guid isPermaLink="false">http://greg.chiaraquartet.net/archives/194-guid.html</guid>
    
</item>
<item>
    <title>PHP namespaces become much better (Derick take note)</title>
    <link>http://greg.chiaraquartet.net/archives/193-PHP-namespaces-become-much-better-Derick-take-note.html</link>
            <category>PHP</category>
    
    <comments>http://greg.chiaraquartet.net/archives/193-PHP-namespaces-become-much-better-Derick-take-note.html#comments</comments>
    <wfw:comment>http://greg.chiaraquartet.net/wfwcomment.php?cid=193</wfw:comment>

    <slash:comments>4</slash:comments>
    <wfw:commentRss>http://greg.chiaraquartet.net/rss.php?version=2.0&amp;type=comments&amp;cid=193</wfw:commentRss>
    

    <author>nospam@example.com (Greg Beaver)</author>
    <content:encoded>
    &lt;p&gt;Recently noted by Derick Rethans in &lt;a href=&quot;http://greg.chiaraquartet.net/exit.php?url_id=655&amp;amp;entry_id=193&quot; title=&quot;http://www.derickrethans.nl/namespaces_in_php.php&quot;  onmouseover=&quot;window.status=&#039;http://www.derickrethans.nl/namespaces_in_php.php&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;&gt;an informative blog post&lt;/a&gt;, there is (now was) a problem in the implementation of namespaces in the soon-to-be-released PHP 5.3.  I quote:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;
Take for example this code:
		&lt;/p&gt;&lt;p class=&quot;pre-blurp&quot;&gt;&lt;font face=&quot;courier new,courier,monospace&quot;&gt;&amp;lt;?php&lt;br /&gt;use PEAR::Date::Interval as Interval;&lt;br /&gt;?&amp;gt;
&lt;/font&gt;&lt;/p&gt;&lt;font face=&quot;courier new,courier,monospace&quot;&gt;
&lt;/font&gt;In PHP 5.3 this would alias the class Interval in the namespace
PEAR::Date to the class Interval. For now, this code would work just
fine. However, if PHP would introduce a class &amp;quot;Interval&amp;quot; at
some point in the future (and PHP can do this as it &lt;a href=&quot;http://greg.chiaraquartet.net/exit.php?url=aHR0cDovL3d3dy5waHAubmV0L21hbnVhbC9lbi91c2VybGFuZG5hbWluZy5ydWxlcy5waHA=&amp;amp;entry_id=193&quot; title=&quot;http://www.php.net/manual/en/userlandnaming.rules.php&quot;  onmouseover=&quot;window.status=&#039;http://www.php.net/manual/en/userlandnaming.rules.php&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;&gt;owns the
global namespace&lt;/a&gt;) then the above code would suddenly stop working.&lt;/blockquote&gt;&lt;p&gt;This morning, I realized that this would be very easy to fix, and posted a patch to internals@ with a brief explanation.  Dmitry committed a fix to &lt;a href=&quot;http://greg.chiaraquartet.net/exit.php?url_id=656&amp;amp;entry_id=193&quot; title=&quot;http://news.php.net/php.zend-engine.cvs/6808&quot;  onmouseover=&quot;window.status=&#039;http://news.php.net/php.zend-engine.cvs/6808&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;&gt;PHP_5_3&lt;/a&gt; and &lt;a href=&quot;http://greg.chiaraquartet.net/exit.php?url_id=657&amp;amp;entry_id=193&quot; title=&quot;http://news.php.net/php.zend-engine.cvs/6809&quot;  onmouseover=&quot;window.status=&#039;http://news.php.net/php.zend-engine.cvs/6809&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;&gt;HEAD&lt;/a&gt; very quickly.  The issue raised by Derick is now obsolete, making namespaces not just more useful, but even more powerful than they were.&lt;/p&gt;&lt;p&gt;For instance, it is possible to &amp;quot;override&amp;quot; an internal class, perhaps to add missing functionality that will be present in a future release or fix a bug:&lt;/p&gt;&lt;p&gt;mydate.php:&lt;br /&gt;&lt;font face=&quot;courier new,courier,monospace&quot;&gt;&amp;lt;?php&lt;br /&gt;namespace Foo;&lt;br /&gt;class DateTime extends ::DateTime&lt;br /&gt;{&lt;br /&gt;// methods here&lt;br /&gt;}&lt;br /&gt;?&amp;gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&amp;lt;?php&lt;br /&gt;include &#039;mydate.php&#039;;&lt;br /&gt;use Foo::DateTime; // this essentially overrides internal DateTime class in the current script&lt;br /&gt;$a = new DateTime(&#039;2006-05-04&#039;);&lt;br /&gt;?&amp;gt;&lt;/p&gt;&lt;p&gt;Those who were lamenting the implementation of namespaces in PHP should take note: if you have a solution to make them better, the turnaround time between proposal to the list and commit can be on the order of a few hours if the idea clearly solves a major problem.&lt;/p&gt; 
    </content:encoded>

    <pubDate>Fri, 20 Jun 2008 23:33:08 -0700</pubDate>
    <guid isPermaLink="false">http://greg.chiaraquartet.net/archives/193-guid.html</guid>
    
</item>
<item>
    <title>php|tek PEAR/phar/Pyrus talk slides</title>
    <link>http://greg.chiaraquartet.net/archives/192-phptek-PEARpharPyrus-talk-slides.html</link>
            <category>PHP</category>
    
    <comments>http://greg.chiaraquartet.net/archives/192-phptek-PEARpharPyrus-talk-slides.html#comments</comments>
    <wfw:comment>http://greg.chiaraquartet.net/wfwcomment.php?cid=192</wfw:comment>

    <slash:comments>3</slash:comments>
    <wfw:commentRss>http://greg.chiaraquartet.net/rss.php?version=2.0&amp;type=comments&amp;cid=192</wfw:commentRss>
    

    <author>nospam@example.com (Greg Beaver)</author>
    <content:encoded>
    I&#039;ve had a few slide requests, so here is a link to the pdf of my slides that Sean Coates put up on the phparch site&lt;p&gt;&lt;a href=&quot;http://greg.chiaraquartet.net/exit.php?url_id=654&amp;amp;entry_id=192&quot; title=&quot;http://tek.phparch.com/mats/slides/greg_beaver-pear_phar.pdf&quot;  onmouseover=&quot;window.status=&#039;http://tek.phparch.com/mats/slides/greg_beaver-pear_phar.pdf&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;&gt;http://tek.phparch.com/mats/slides/greg_beaver-pear_phar.pdf&lt;/a&gt;&lt;/p&gt; 
    </content:encoded>

    <pubDate>Thu, 29 May 2008 09:46:43 -0700</pubDate>
    <guid isPermaLink="false">http://greg.chiaraquartet.net/archives/192-guid.html</guid>
    
</item>
<item>
    <title>phar is near at php|tek</title>
    <link>http://greg.chiaraquartet.net/archives/190-phar-is-near-at-phptek.html</link>
            <category>PHP</category>
    
    <comments>http://greg.chiaraquartet.net/archives/190-phar-is-near-at-phptek.html#comments</comments>
    <wfw:comment>http://greg.chiaraquartet.net/wfwcomment.php?cid=190</wfw:comment>

    <slash:comments>1</slash:comments>
    <wfw:commentRss>http://greg.chiaraquartet.net/rss.php?version=2.0&amp;type=comments&amp;cid=190</wfw:commentRss>
    

    <author>nospam@example.com (Greg Beaver)</author>
    <content:encoded>
    &lt;p&gt;OK, so my selection of puns is not exactly &amp;quot;funny&amp;quot; per se, but it is true: php|tek is all about phar and variant spellings of the 4 letter word, such as &amp;quot;pear&amp;quot;.  If you&#039;re in the audience for my talk about smart PHP application deployment using phar, PEAR and Pyrus, come say hello, I&#039;m looking forward to meeting just about everyone I&#039;ve argu^H^H^Hconversed with over the years, and of course you can also check out a copy of my book, I&#039;ll stuff a few into the luggage.  In other news, phar is tentatively enabled by default in PHP 5.3, marking the exciting next phase in all of the back-breaking work that has gone into it.  Check out the complete manual at &lt;a href=&quot;http://greg.chiaraquartet.net/exit.php?url_id=653&amp;amp;entry_id=190&quot; title=&quot;http://php.net/phar&quot;  onmouseover=&quot;window.status=&#039;http://php.net/phar&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;&gt;http://php.net/phar.&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Although I perform all the time as part of my day job as cellist of the Chiara Quartet, this will be a very different kind of performing experience and I&#039;m looking forward to the challenge of revealing the true dynamism and excitement that I see in app deployment stuff I&#039;ve been working on the past several years.&lt;/p&gt;&lt;p&gt;See you in Chicago!&lt;/p&gt; 
    </content:encoded>

    <pubDate>Mon, 19 May 2008 22:33:38 -0700</pubDate>
    <guid isPermaLink="false">http://greg.chiaraquartet.net/archives/190-guid.html</guid>
    
</item>
<item>
    <title>behold pecl/phar and mighty PHP 5.3, also php|arch and php|tek</title>
    <link>http://greg.chiaraquartet.net/archives/189-behold-peclphar-and-mighty-PHP-5.3,-also-phparch-and-phptek.html</link>
            <category>PHP</category>
    
    <comments>http://greg.chiaraquartet.net/archives/189-behold-peclphar-and-mighty-PHP-5.3,-also-phparch-and-phptek.html#comments</comments>
    <wfw:comment>http://greg.chiaraquartet.net/wfwcomment.php?cid=189</wfw:comment>

    <slash:comments>6</slash:comments>
    <wfw:commentRss>http://greg.chiaraquartet.net/rss.php?version=2.0&amp;type=comments&amp;cid=189</wfw:commentRss>
    

    <author>nospam@example.com (Greg Beaver)</author>
    <content:encoded>
    
&lt;p&gt;I&#039;ve been a bit busy, my last PHP post was in October (!) but I do have very good news.  Following on the heels of my first php|arch article about the Phar extension in the January issue (&lt;a href=&quot;http://greg.chiaraquartet.net/exit.php?url_id=646&amp;amp;entry_id=189&quot; title=&quot;http://phparch.com/c/magazine/issue/65&quot;  onmouseover=&quot;window.status=&#039;http://phparch.com/c/magazine/issue/65&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;&gt;http://phparch.com/c/magazine/issue/65&lt;/a&gt;), I&#039;ve been extremely hard at work on perfecting this extension.  As a testament to the strength and excitement surrounding the upcoming 2.0 release of the phar extension, my editor at php|arch became a developer on the phar extension after reading and working on the article (hi Steph).&lt;/p&gt;&lt;p&gt;Today, I released &lt;a href=&quot;http://greg.chiaraquartet.net/exit.php?url_id=647&amp;amp;entry_id=189&quot; title=&quot;http://pecl.php.net/package/phar/2.0.0a1&quot;  onmouseover=&quot;window.status=&#039;http://pecl.php.net/package/phar/2.0.0a1&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;&gt;phar version 2.0.0a1&lt;/a&gt;, the first release of the newly upgraded extension.  This extension is a wholly different animal from the last release, 1.2.3.  While maintaining BC with the 1.2.x version of pecl/phar, this version adds unimaginable new facilities.  The phar extension has transformed from something of a sideshow to a major player, and is being actively considered for inclusion in the core of PHP 5.3.  Major new features in phar 2.0:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Phar now supports tar and zip archives with the same API that is supports phar archives.  Think of phar as something like the PDO of archive file formats.  All phar archives must contain &amp;quot;.phar&amp;quot; in the filename to be executed&lt;/li&gt;&lt;li&gt;Phar has a front controller for web applications that fully handles MIME types, supports mod_rewrite-like functionality with far more flexibility (a php callback is passed the url, it returns the actual file to load) and also the ability to deny access to portions of the phar that are not web-accessible (like library PHP code)&lt;/li&gt;&lt;li&gt;Phar fully solves the problems with current directory and code loading/file loading that plague all other stream wrappers like PHP_Archive and PHK.  This allows running complex applications like phpMyAdmin with no code modification directly from the original .tgz after a rename and the addition of a 20-line stub&lt;/li&gt;&lt;li&gt;Phar supports phar:// stream wrappers in include_path for PHP 5.2+, so your require_once-based applications can be pharred up without code modification&lt;/li&gt;&lt;li&gt;Phar supports creation and modification of data-only tar and zip archives (no executable phar stub) via the PharData class.  Now you can use phar to create and even convert between file formats.  Unlike the zip extension, phar supports bzip2 compression of files, and has no arbitrary limit on open file handles.  Unlike the archive extension in pecl, phar fully supports windows, and is the first PHP extension to deliver read/write support for tar archives on both unix and windows.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;In other words, phar 2.0 is the &amp;quot;holy crap&amp;quot; release of phar.  The manual (which is currently almost fully updated to the API, but not yet rebuilt) is at &lt;a href=&quot;http://greg.chiaraquartet.net/exit.php?url_id=648&amp;amp;entry_id=189&quot; title=&quot;http://www.php.net/phar&quot;  onmouseover=&quot;window.status=&#039;http://www.php.net/phar&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;&gt;http://www.php.net/phar&lt;/a&gt;.  Another way to get to know phar is through the unit tests, which are included in the pecl tarball.&lt;/p&gt;&lt;p&gt;The current release can be downloaded from &lt;a href=&quot;http://greg.chiaraquartet.net/exit.php?url_id=649&amp;amp;entry_id=189&quot; title=&quot;http://pecl.php.net/get/phar-2.0.0a1.tgz&quot;  onmouseover=&quot;window.status=&#039;http://pecl.php.net/get/phar-2.0.0a1.tgz&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;&gt;http://pecl.php.net/get/phar-2.0.0a1.tgz&lt;/a&gt; or installed via &lt;font face=&quot;courier new,courier,monospace&quot;&gt;pecl install phar&lt;/font&gt; and windows dll can be downloaded from &lt;a href=&quot;http://greg.chiaraquartet.net/exit.php?url_id=650&amp;amp;entry_id=189&quot; title=&quot;http://pecl4win.php.net/ext.php/php_phar.dll&quot;  onmouseover=&quot;window.status=&#039;http://pecl4win.php.net/ext.php/php_phar.dll&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;&gt;http://pecl4win.php.net/ext.php/php_phar.dll&lt;/a&gt; although it looks like building is having a few hiccups lately.&lt;/p&gt;&lt;p&gt;There are a few known issues to be worked out.  One is compatibility with xdebug, which is a trivial problem involving extension load order.  Once we work this out, xdebug will support stepping through the source of files within a phar archive in your IDE, a killer feature for those who need to debug things.  In PHP 5.3, phar requires a small patch to support the phar stream wrapper in include_path.&lt;/p&gt;&lt;p&gt;...This brings me to PHP 5.3.  I&#039;ve been working hard with Dmitry Stogov, Marcus Boerger (the other phar lead) and a few other list contributors to perfect a patch that will bring stream wrapper support to include_path.  This will mean that you can write a userspace stream wrapper, put its url in your include_path and start using it with relative includes such as what PEAR uses to load its code.  This powerful feature will allow you to write your code in one way, and run it from several different locations.  Expect to see this feature committed in the next week or so, barring major problems.&lt;/p&gt;&lt;p&gt;Lastly, I&#039;m happy to announce that I will be a speaker at this year&#039;s php|tek conference in Chicago.  It is the first time I&#039;ve been able to pull myself away from a crazy-busy quartet schedule to attend a conference, and I look forward very much to meeting as many of you as possible while there.  My talk will be on smart PHP application deployment, and covers PEAR, Phar, and the new Pyrus installer for PEAR2 (&lt;a href=&quot;http://greg.chiaraquartet.net/exit.php?url_id=651&amp;amp;entry_id=189&quot; title=&quot;http://tek.phparch.com/c/schedule/talk/d2s6/1&quot;  onmouseover=&quot;window.status=&#039;http://tek.phparch.com/c/schedule/talk/d2s6/1&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;&gt;http://tek.phparch.com/c/schedule/talk/d2s6/1&lt;/a&gt;).  Unfortunately, the talk is at the same as Josh Eichorn&#039;s talk on PEAR2 (&lt;a href=&quot;http://greg.chiaraquartet.net/exit.php?url_id=652&amp;amp;entry_id=189&quot; title=&quot;http://tek.phparch.com/c/schedule/talk/d2s6/0&quot;  onmouseover=&quot;window.status=&#039;http://tek.phparch.com/c/schedule/talk/d2s6/0&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;&gt;http://tek.phparch.com/c/schedule/talk/d2s6/0&lt;/a&gt;), so we may need to work out some way to shuttle folks back and forth, we&#039;ll have to see &lt;img src=&quot;http://greg.chiaraquartet.net/templates/default/img/emoticons/smile.png&quot; alt=&quot;:-)&quot; style=&quot;display: inline; vertical-align: bottom;&quot; class=&quot;emoticon&quot; /&gt;.&lt;/p&gt;&lt;p&gt;Progress of the highest order is being made here, expect to hear more about the goings-on behind phar and PEAR2 as time permits.&lt;/p&gt; 
    </content:encoded>

    <pubDate>Wed, 26 Mar 2008 15:58:57 -0700</pubDate>
    <guid isPermaLink="false">http://greg.chiaraquartet.net/archives/189-guid.html</guid>
    
</item>
<item>
    <title>Microsoft and the .NET saga</title>
    <link>http://greg.chiaraquartet.net/archives/185-Microsoft-and-the-.NET-saga.html</link>
            <category>PHP</category>
    
    <comments>http://greg.chiaraquartet.net/archives/185-Microsoft-and-the-.NET-saga.html#comments</comments>
    <wfw:comment>http://greg.chiaraquartet.net/wfwcomment.php?cid=185</wfw:comment>

    <slash:comments>5</slash:comments>
    <wfw:commentRss>http://greg.chiaraquartet.net/rss.php?version=2.0&amp;type=comments&amp;cid=185</wfw:commentRss>
    

    <author>nospam@example.com (Greg Beaver)</author>
    <content:encoded>
    
&lt;p&gt;So for the past half year or so, I have been trying on and off to install security updates for Microsoft .NET 1.1 and 2.0.  Each time, it hadn&#039;t worked.  I&#039;ve now disabled automatic updates because they always fail on these two old updates.&lt;/p&gt;&lt;p&gt;Today, I thought maybe I would take a real crack at fixing this issue, and so did an extensive google search for any information on installing/uninstalling/repairing a .NET installation.  There is, not surprisingly, a huge number of problems that people have experienced, this being a Microsoft component.  I finally found a page on the Microsoft site that displays instructions on repairing .NET.&lt;/p&gt;&lt;p&gt;Unfortunately, none of the instructions work.  I tried to uninstall the component, and it tells me source files are not available.  I try re-installing from source, and it tells me that I can&#039;t install.  I try manually deleting and it tells me the file is in use (yes, I&#039;ve disabled anti-virus).  Because this is an MS Windows machine, it&#039;s virtually impossible to tell which file is using the .NET stuff.&lt;/p&gt;&lt;p&gt;Basically, I&#039;m not allowed to do anything productive with the Microsoft stuff on this computer.  This incidentally also means I can&#039;t install VS 2005 because it needs a working .NET installation, so I can&#039;t debug my pecl extensions on Windows.  My next computer is going to be a MacBook Pro, and I&#039;m never looking back.&lt;/p&gt; 
    </content:encoded>

    <pubDate>Mon, 29 Oct 2007 13:23:55 -0700</pubDate>
    <guid isPermaLink="false">http://greg.chiaraquartet.net/archives/185-guid.html</guid>
    
</item>
<item>
    <title>Working towards Pyrus and PEAR2, check it out or miss out</title>
    <link>http://greg.chiaraquartet.net/archives/184-Working-towards-Pyrus-and-PEAR2,-check-it-out-or-miss-out.html</link>
            <category>PEAR</category>
    
    <comments>http://greg.chiaraquartet.net/archives/184-Working-towards-Pyrus-and-PEAR2,-check-it-out-or-miss-out.html#comments</comments>
    <wfw:comment>http://greg.chiaraquartet.net/wfwcomment.php?cid=184</wfw:comment>

    <slash:comments>6</slash:comments>
    <wfw:commentRss>http://greg.chiaraquartet.net/rss.php?version=2.0&amp;type=comments&amp;cid=184</wfw:commentRss>
    

    <author>nospam@example.com (Greg Beaver)</author>
    <content:encoded>
    &lt;p&gt;Hello all.  It&#039;s been a very busy time for me, what with suddenly having a full gaggle of new cello students to teach at &lt;a href=&quot;http://greg.chiaraquartet.net/exit.php?url_id=622&amp;amp;entry_id=184&quot; title=&quot;http://www.unl.edu/music&quot;  onmouseover=&quot;window.status=&#039;http://www.unl.edu/music&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;&gt;UNL&lt;/a&gt; as well as a fully loaded performance schedule for &lt;a href=&quot;http://greg.chiaraquartet.net/exit.php?url_id=623&amp;amp;entry_id=184&quot; title=&quot;http://www.chiaraquartet.net&quot;  onmouseover=&quot;window.status=&#039;http://www.chiaraquartet.net&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;&gt;the quartet&lt;/a&gt;, but I have been finding time to code.  My priority has been the &lt;a href=&quot;http://greg.chiaraquartet.net/exit.php?url_id=624&amp;amp;entry_id=184&quot; title=&quot;http://wiki.pear.php.net/index.php/PEAR2_Standards&quot;  onmouseover=&quot;window.status=&#039;http://wiki.pear.php.net/index.php/PEAR2_Standards&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;&gt;push towards PEAR2&lt;/a&gt;, which means that in addition to attempting to mediate the discussions of what should change from PEAR to PEAR2, I&#039;m churning out code to turn its installer, &lt;a href=&quot;http://greg.chiaraquartet.net/exit.php?url_id=625&amp;amp;entry_id=184&quot; title=&quot;http://svn.pear.php.net/PEAR2/Pyrus&quot;  onmouseover=&quot;window.status=&#039;http://svn.pear.php.net/PEAR2/Pyrus&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;&gt;Pyrus&lt;/a&gt;, from vaporware into actual code.&lt;/p&gt;&lt;p&gt;Along these lines, there has been significant progress.  The code has been developed on PHP 5.2, but will most likely target PHP 5.3 with the introduction of namespaces.  Pyrus completely revamps the way things are done.  By using &lt;a href=&quot;http://greg.chiaraquartet.net/exit.php?url_id=626&amp;amp;entry_id=184&quot; title=&quot;http://php.net/spl&quot;  onmouseover=&quot;window.status=&#039;http://php.net/spl&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;&gt;SPL&lt;/a&gt; as well as extensions like &lt;a href=&quot;http://greg.chiaraquartet.net/exit.php?url_id=627&amp;amp;entry_id=184&quot; title=&quot;http://php.net/xmlreader&quot;  onmouseover=&quot;window.status=&#039;http://php.net/xmlreader&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;&gt;XMLReader&lt;/a&gt; and &lt;a href=&quot;http://greg.chiaraquartet.net/exit.php?url_id=628&amp;amp;entry_id=184&quot; title=&quot;http://php.net/xmlwriter&quot;  onmouseover=&quot;window.status=&#039;http://php.net/xmlwriter&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;&gt;XMLWriter&lt;/a&gt;, Pyrus manages to pack in far more features inside the code while literally cutting thousands of lines of code.  The biggest loser has been the package.xml handling code.  More than 2500 lines of code have gone byebye, but the API for reading from and creating package.xml is now as intuitive or more intuitive than simplexml.&lt;/p&gt;&lt;p&gt;In addition, using interfaces, a few design patterns and some clever iterators, adding support for a customized packaging solution is a matter of creating a &lt;a href=&quot;http://greg.chiaraquartet.net/exit.php?url_id=629&amp;amp;entry_id=184&quot; title=&quot;http://svn.pear.php.net/wsvn/PEARSVN/Pyrus/trunk/src/Package/ICreator.php?op=file&amp;amp;rev=0&amp;amp;sc=0&quot;  onmouseover=&quot;window.status=&#039;http://svn.pear.php.net/wsvn/PEARSVN/Pyrus/trunk/src/Package/ICreator.php?op=file&amp;amp;rev=0&amp;amp;sc=0&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;&gt;class with a few lines of code&lt;/a&gt; that accepts file contents and where to save them.  Pyrus does &lt;a href=&quot;http://greg.chiaraquartet.net/exit.php?url_id=630&amp;amp;entry_id=184&quot; title=&quot;http://svn.pear.php.net/wsvn/PEARSVN/Pyrus/trunk/src/Package/Creator.php?op=file&amp;amp;rev=0&amp;amp;sc=0&quot;  onmouseover=&quot;window.status=&#039;http://svn.pear.php.net/wsvn/PEARSVN/Pyrus/trunk/src/Package/Creator.php?op=file&amp;amp;rev=0&amp;amp;sc=0&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;&gt;the hard work&lt;/a&gt; of constructing the relative path of files within the archive and pre-processing their contents using file tasks.&lt;/p&gt;&lt;p&gt;The code is simple enough that I wrote &lt;a href=&quot;http://greg.chiaraquartet.net/exit.php?url_id=631&amp;amp;entry_id=184&quot; title=&quot;http://svn.pear.php.net/wsvn/PEARSVN/sandbox/SimpleChannelServer/src/?rev=0&amp;amp;sc=0&quot;  onmouseover=&quot;window.status=&#039;http://svn.pear.php.net/wsvn/PEARSVN/sandbox/SimpleChannelServer/src/?rev=0&amp;amp;sc=0&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;&gt;a simple channel server&lt;/a&gt; with no dependencies except for Pyrus in less than 6 hours (just finished the initial work when my battery ran out today) that allows small channels to work without needing a database or even PHP on the channel server, as all the REST files and releases can be generated and then uploaded from a dev server.&lt;/p&gt;&lt;p&gt;In short, it&#039;s an exciting time to be involved in &lt;a href=&quot;http://greg.chiaraquartet.net/exit.php?url_id=632&amp;amp;entry_id=184&quot; title=&quot;http://pear.php.net&quot;  onmouseover=&quot;window.status=&#039;http://pear.php.net&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;&gt;PEAR&lt;/a&gt;.  If you&#039;ve been ignoring PEAR, perhaps it is time to take another look?&lt;/p&gt;&lt;p&gt;&lt;/p&gt; 
    </content:encoded>

    <pubDate>Sat, 22 Sep 2007 22:25:26 -0700</pubDate>
    <guid isPermaLink="false">http://greg.chiaraquartet.net/archives/184-guid.html</guid>
    
</item>
<item>
    <title>phar gets a major speed boost with version 1.2.1</title>
    <link>http://greg.chiaraquartet.net/archives/182-phar-gets-a-major-speed-boost-with-version-1.2.1.html</link>
            <category>PHP</category>
    
    <comments>http://greg.chiaraquartet.net/archives/182-phar-gets-a-major-speed-boost-with-version-1.2.1.html#comments</comments>
    <wfw:comment>http://greg.chiaraquartet.net/wfwcomment.php?cid=182</wfw:comment>

    <slash:comments>3</slash:comments>
    <wfw:commentRss>http://greg.chiaraquartet.net/rss.php?version=2.0&amp;type=comments&amp;cid=182</wfw:commentRss>
    

    <author>nospam@example.com (Greg Beaver)</author>
    <content:encoded>
    
&lt;p&gt;A few minutes ago, I released &lt;a href=&quot;http://greg.chiaraquartet.net/exit.php?url_id=607&amp;amp;entry_id=182&quot; title=&quot;http://pecl.php.net/package/phar&quot;  onmouseover=&quot;window.status=&#039;http://pecl.php.net/package/phar&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;&gt;phar&lt;/a&gt; version 1.2.1.  phar is a PHP extension that allows the creation of complete filesystems within a single physical file.  In addition, a bootstrap stub written in PHP can be used to run a phar archive as if it were an executable file or shell script.  Documentation on its usage and how to create phars is at &lt;a href=&quot;http://greg.chiaraquartet.net/exit.php?url_id=608&amp;amp;entry_id=182&quot; title=&quot;http://php.net/phar&quot;  onmouseover=&quot;window.status=&#039;http://php.net/phar&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;&gt;http://php.net/phar&lt;/a&gt; in the PHP manual.&lt;/p&gt;&lt;p&gt;This version of phar fixes a number of issues as documented in my last blog post, as well as a quite few issues that Marcus fixed in relation to setting the bootstrap stub, using phar&#039;s phar.extract_list INI parameter with an apache module and others (full list &lt;a href=&quot;http://greg.chiaraquartet.net/exit.php?url_id=609&amp;amp;entry_id=182&quot; title=&quot;http://pecl.php.net/package-changelog.php?package=phar&amp;amp;release=1.2.1&quot;  onmouseover=&quot;window.status=&#039;http://pecl.php.net/package-changelog.php?package=phar&amp;amp;release=1.2.1&#039;;return true;&quot; onmouseout=&quot;window.status=&#039;&#039;;return true;&quot;&gt;here&lt;/a&gt;).&lt;/p&gt;&lt;p&gt;In addition, I ran callgrind on the thing and found a few places it could use some trimming of the fat, and was able to cut down the number of stream operations by a factor of 2x when using phar in the most common use case, reading uncompressed files.  In addition, I cut another 2x for phars that have an MD5 or SHA1 signature.&lt;/p&gt;&lt;p&gt;This is quite a good release, looking forward to hearing your stories of using it.&lt;/p&gt;
 
    </content:encoded>

    <pubDate>Wed, 29 Aug 2007 21:15:23 -0700</pubDate>
    <guid isPermaLink="false">http://greg.chiaraquartet.net/archives/182-guid.html</guid>
    
</item>

</channel>
</rss>