<?xml version='1.0' encoding='UTF-8'?><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/" xmlns:blogger="http://schemas.google.com/blogger/2008" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" version="2.0"><channel><atom:id>tag:blogger.com,1999:blog-6188174695458425487</atom:id><lastBuildDate>Sun, 28 Sep 2025 15:08:02 +0000</lastBuildDate><category>php</category><category>MongoDB</category><category>conferences</category><category>documentation</category><category>launchpad</category><category>phongo</category><category>phpreleases</category><category>ppa</category><category>streams</category><category>ODS</category><category>ORM</category><category>PHP.next</category><category>PHP5.3</category><category>PHP5.4</category><category>PHP5.next</category><category>code review</category><category>docbook</category><category>error</category><category>google</category><category>google reader</category><category>hack</category><category>married</category><category>mongo-php-transistor</category><category>ninja</category><category>notifications</category><category>pecl</category><category>phd</category><category>phpweb</category><category>profiling</category><category>progressbar</category><category>redesign</category><category>release feed</category><category>releases</category><category>stats</category><category>tableless</category><category>transistor</category><category>twoyears</category><category>ubuntu</category><category>unix manual pages</category><category>useless</category><category>vim</category><category>wtfm</category><title>bjori doesn&#39;t blog</title><description>I generally try to fix things that are broken. Or at least make them slightly less broken. Sometimes I unfix things that are unbroken.</description><link>http://bjori.blogspot.com/</link><managingEditor>noreply@blogger.com (bjori)</managingEditor><generator>Blogger</generator><openSearch:totalResults>18</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6188174695458425487.post-2101205223254459745</guid><pubDate>Thu, 23 Apr 2015 17:12:00 +0000</pubDate><atom:updated>2015-04-23T10:12:15.558-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">mongo-php-transistor</category><category domain="http://www.blogger.com/atom/ns#">MongoDB</category><category domain="http://www.blogger.com/atom/ns#">ODS</category><category domain="http://www.blogger.com/atom/ns#">ORM</category><category domain="http://www.blogger.com/atom/ns#">phongo</category><category domain="http://www.blogger.com/atom/ns#">transistor</category><title>The Frills</title><description>I don&#39;t like &lt;a href=&quot;https://en.wikipedia.org/wiki/Object-relational_mapping&quot; target=&quot;_blank&quot;&gt;ORMs&lt;/a&gt;. I really don&#39;t. It&#39;s not just because all of the ORM frameworks I&#39;ve seen make mockery out of performance needs, but they also tend to be extremely over-engineered, which makes me want to cry. I&#39;d wager that most people using ORMs are actually solving the wrong problem with the wrong solution, simply because there wasn&#39;t a better alternative for their data-modeling needs and the benefits of adopting an ORM outweighed its inherent problems.&lt;br&gt;&lt;br&gt;

It&#39;s like driving a gasoline-hungry car. You say that you care about its MPG rating, but you are still wasting a lot of gas without ever looking back. It is just a cost of living. Or insurance: You know you can save 15% or more... but you don&#39;t. You&#39;ve accepted that bi-annual rip-off as cost of living.&lt;br&gt;&lt;br&gt;

Just like using an ORM, you have accepted the pain as cost of living. Well, I don&#39;t :)&lt;br&gt;&lt;br&gt;


&lt;h4&gt;ODS - Object&lt;-&gt;Document Serializer&lt;/h4&gt;


The &lt;a href=&quot;http://bjori.blogspot.com/2015/04/next-gen-mongodb-driver.html&quot;&gt;new MongoDB PHP driver&lt;/a&gt; includes an experimental ODS interface (&lt;a href=&quot;http://php.net/BSON\Persistable&quot;&gt;BSON\Persistable&lt;/a&gt;) that allows you to automatically store your object as documents in MongoDB the way you see fit. And the best part? When you retrieve the document from MongoDB, the driver will know which class it represented and can reconstruct the object (again, the way you see fit).&lt;br&gt;&lt;br&gt;

All you have to do is implement the two methods of the BSON\Persistable interface:
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://php.net/bson\serializable.bsonserialize&quot;&gt;bsonSerialize()&lt;/a&gt; which returns an array to store as a BSON document&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://php.net/bson\unserializable.bsonunserialize&quot;&gt;bsonUnserialize($array)&lt;/a&gt; which receives a BSON document just like the one returned by the serialize method&lt;/li&gt;
&lt;/ul&gt;

&lt;br&gt;
That&#39;s it! There is no special way of querying by type, parent object, or any of those weird things that ORMs have introduced to work around storing objects or documents in databases. Your document is your object. Your relations are your relations.&lt;br&gt;&lt;br&gt;

If you would like to build on top of this functionality, it&#39;s trivial to implement &lt;a href=&quot;https://github.com/bjori/mongo-php-transistor&quot;&gt;a trait that implements both methods and provides basic change tracking&lt;/a&gt;. At that point, we are entering ORM and ODM territory and are going beyond what we should ask from an extension. All we want from an extension is performance, and simplicity.&lt;br&gt;&lt;br&gt;</description><link>http://bjori.blogspot.com/2015/04/the-frills.html</link><author>noreply@blogger.com (bjori)</author><thr:total>0</thr:total><georss:featurename>Palo Alto, CA, USA</georss:featurename><georss:point>37.4418834 -122.14301949999998</georss:point><georss:box>37.2399894 -122.46574299999997 37.643777400000005 -121.82029599999998</georss:box></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6188174695458425487.post-1539677491714181592</guid><pubDate>Tue, 14 Apr 2015 13:00:00 +0000</pubDate><atom:updated>2015-04-14T07:13:33.458-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">MongoDB</category><category domain="http://www.blogger.com/atom/ns#">pecl</category><category domain="http://www.blogger.com/atom/ns#">phongo</category><title>Next Generation MongoDB Driver for PHP!</title><description>For the past few months I&#39;ve been working on a &quot;next-gen&quot; MongoDB driver for PHP -- codename &quot;&lt;a href=&quot;https://github.com/bjori/phongo&quot; target=&quot;_blank&quot;&gt;phongo&lt;/a&gt;&quot;.&lt;br&gt;
The aim was to build a new PHP extension ontop of the mongoc and libbson libraries to reduce maintenance of the extension itself and focus more on providing the ecosystem with improved support and libraries.&lt;br&gt;&lt;br&gt;

The new driver is available on &lt;a href=&quot;https://pecl.php.net/package/mongodb&quot; target=&quot;_blank&quot;&gt;PECL (called &quot;mongodb&quot;, surprisingly enough)&lt;/a&gt;. It doesn&#39;t include any of the bells and whistles found in the previous &quot;mongo&quot; driver. It doesn&#39;t include any `group` or `count` command helpers, and you won&#39;t find any Collection or Database objects; however, it really doesn&#39;t need any of these things.&lt;br&gt;&lt;br&gt;

All it has is simplicity. You can &lt;a href=&quot;http://php.net/mongodb-driver-manager.executecommand&quot; target=&quot;_blank&quot;&gt;execute a command&lt;/a&gt; of your choosing. You can &lt;a href=&quot;http://php.net/mongodb-driver-manager.executequery&quot; target=&quot;_blank&quot;&gt;execute a query&lt;/a&gt;. You can &lt;a href=&quot;http://php.net/mongodb-driver-manager.executewritebulk&quot; target=&quot;_blank&quot;&gt;execute a write&lt;/a&gt;. That&#39;s really it (as with everything, there are certain exceptions). Oh, it is also very, very fast.&lt;br&gt;&lt;br&gt;


&lt;h4&gt;What&#39;s the Point?&lt;/h4&gt;

Most developers interact with databases these days through their preferred framework abstraction layer. That layer often has its own way of providing the bells and whistles irrespective of the driver&#39;s functionality -- it seldom matters what helper methods the driver offers, since these libraries can call MongoDB::command() directly. Besides, upgrading the driver just to get a new command helper, which is easily implemented in userland PHP, is just weird.&lt;br&gt;&lt;br&gt;

For our new &quot;mongodb&quot; extension, the driver only implements the most essential features for interacting with a MongoDB server:
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/mongodb/specifications/blob/master/source/server-discovery-and-monitoring/server-discovery-and-monitoring.rst&quot; target=&quot;_blank&quot;&gt;Server Discovery and Monitoring&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Automatic &lt;a href=&quot;https://github.com/mongodb/specifications/blob/master/source/server-selection/server-selection.rst&quot; target=&quot;_blank&quot;&gt;Server Selection&lt;/a&gt; (with &lt;a href=&quot;http://php.net/mongodb-driver-manager.selectserver&quot; target=&quot;_blank&quot;&gt;manual selection possible&lt;/a&gt;) using &lt;a href=&quot;http://php.net/mongodb-driver-readpreference&quot; target=&quot;_blank&quot;&gt;Read Preferences&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;BSON [en|de]coding (&lt;a href=&quot;http://php.net/ref.bson&quot; target=&quot;_blank&quot;&gt;to/from extended JSON&lt;/a&gt;, too)&lt;/li&gt;
&lt;li&gt;Implementing the &lt;a href=&quot;http://docs.mongodb.org/meta-driver/latest/legacy/mongodb-wire-protocol/&quot; target=&quot;_blank&quot;&gt;MongoDB wire protocol&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;br&gt;


&lt;h4&gt;Again, What&#39;s the Point?&lt;/h4&gt;

Well, now we can provide you with a stable driver that really shouldn&#39;t change all that much, which means less extension upgrades.&lt;br&gt;&lt;br&gt;

Furthermore, it should be faster. The legacy driver, which dates back five years, had unfortunate design quirks that couldn&#39;t be fully resolved without a costly rewrite (e.g. the way MongoGridFS invokes MongoCollection methods internally). Creating a brand new, no-frills&lt;sup&gt;&lt;a href=&quot;#note-1&quot; id=&quot;back-note-1&quot;&gt;[1]&lt;/a&gt;&lt;/sup&gt;, and simple to use driver gives us a fresh starting point for the next five years.&lt;br&gt;&lt;br&gt;


&lt;h4&gt;MongoDB PHP Libraries&lt;/h4&gt;

Of course, we aren&#39;t planning on leaving our users out to dry. Whether or not your framework of choice offers an amazing MongoDB abstraction layer, we do want to make it easy, simple, and natural for you to develop applications with MongoDB.&lt;br&gt;&lt;br&gt;

To that end, we are writing a &lt;a href=&quot;https://github.com/10gen-labs/mongo-php-library-prototype&quot; target=&quot;_blank&quot;&gt;PHP library&lt;/a&gt; on top of this new extension, which will have all of the frills, bells, and whistles you might expect. It implements the &quot;&lt;a href=&quot;https://github.com/mongodb/specifications/blob/master/source/crud/crud.rst&quot; target=&quot;_blank&quot;&gt;Standard MongoDB Driver CRUD API&lt;/a&gt;&quot; (among others) and we&#39;ll continue roll in new features into this library as needed. And because this library will be implemented in PHP, we expect to iterate on new features much more quickly than we were able to do with the legacy driver.&lt;br&gt;&lt;br&gt;

This won&#39;t be the only library we will be writing. There are also plans to develop a library to deal with MongoDB administrative tasks (e.g. creating users, reconfiguring wiredTiger nodes, tailing oplogs) and develop tools to introspect MongoDB clusters.&lt;br&gt;&lt;br&gt;


&lt;h4&gt;What do you think?&lt;/h4&gt;
The biggest question at this point is: &quot;what else?&quot; What is missing? What are the other pain points you&#39;ve experienced as a MongoDB developer, that the driver or a library can help with?&lt;br&gt;

We would love to &lt;a href=&quot;https://jira.mongodb.org/secure/CreateIssue.jspa?pid=12484&amp;amp;issuetype=6&quot;&gt;hear your feedback&lt;/a&gt;! Check out the projects on GitHub (&lt;a href=&quot;https://github.com/10gen-labs/mongo-php-driver-prototype&quot;&gt;driver&lt;/a&gt;, &lt;a href=&quot;https://github.com/10gen-labs/mongo-php-library-prototype&quot;&gt;library&lt;/a&gt;), and let us know what you think.&lt;br&gt;&lt;br&gt;


&lt;a href=&quot;#back-note-1&quot; id=&quot;note-1&quot;&gt;&lt;sup&gt;[1]&lt;/sup&gt;&lt;/a&gt; Well.. Almost. There is one &lt;i&gt;frilled&lt;/i&gt; feature I&#39;m excited about -- we&#39;ll cover that later.&lt;br /&gt;</description><link>http://bjori.blogspot.com/2015/04/next-gen-mongodb-driver.html</link><author>noreply@blogger.com (bjori)</author><thr:total>0</thr:total><georss:featurename>Sunnyvale, CA, USA</georss:featurename><georss:point>37.36883 -122.0363496</georss:point><georss:box>37.166974 -122.35907309999999 37.570686 -121.7136261</georss:box></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6188174695458425487.post-7512258807153844309</guid><pubDate>Mon, 13 Apr 2015 18:02:00 +0000</pubDate><atom:updated>2015-04-13T11:10:16.198-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">MongoDB</category><category domain="http://www.blogger.com/atom/ns#">tableless</category><title>Going tableless</title><description>&lt;a href=&quot;https://en.wikipedia.org/wiki/Tableless_web_design&quot; target=&quot;_blank&quot;&gt;Tableless html&lt;/a&gt; was all the rage a decade ago -- for a good reason.&lt;br /&gt;
One of the advantages was maintainability of the markup -- especially in a deeply nested table layout.&lt;br /&gt;
&lt;br /&gt;
It also turned out, the table layout didn&#39;t actually fit the way we wanted to present the data. The rigid structure it enforced wasn&#39;t what we were after - and it also limited the freedom designers had to push forward and create next generation website and application layouts.&lt;br /&gt;
&lt;br /&gt;
In the beginning though, it really was the only way to get stuff done -- and the best tool for the job. It was fun while it lasted -- but we are over it now.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Today -- we are entering a similar situation -- in databases, of all places.&lt;br /&gt;
Tableless databases are becoming all the rage today -- for a good reason.&lt;br /&gt;
One of the advantages of going tableless db is maintainability of the data -- especially with deeply nested data.&lt;br /&gt;
&lt;br /&gt;
It turns out, the table schema doesn&#39;t fit the way we want to work with or present data. The rigid structure it enforces isn&#39;t what we are after either - and it also limits the freedom application designers have to push forward and create next generation websites and applications.&lt;br /&gt;
&lt;br /&gt;
In the beginning though, it really was the only way to get stuff done -- and the best tool for the job. It was fun while it lasted -- but we are over it now.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;</description><link>http://bjori.blogspot.com/2015/04/going-tableless.html</link><author>noreply@blogger.com (bjori)</author><thr:total>3</thr:total><georss:featurename>Palo Alto, CA, USA</georss:featurename><georss:point>37.4418834 -122.14301949999998</georss:point><georss:box>37.2399894 -122.46574299999997 37.643777400000005 -121.82029599999998</georss:box></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6188174695458425487.post-5137072504369453916</guid><pubDate>Fri, 23 May 2014 18:05:00 +0000</pubDate><atom:updated>2014-05-27T08:41:59.993-07:00</atom:updated><title>I have a dream</title><description>&lt;blockquote&gt;
I am happy to join with you today in what will go down in history as the greatest demonstration for freedom in the history of our &lt;strike&gt;nation&lt;/strike&gt; project.&lt;/blockquote&gt;
&lt;br /&gt;
Today we will revolutionize PHP.&lt;br /&gt;
- We will make it easier to upgrade the things you care about[1].&lt;br /&gt;
- We will make it easier to &lt;i&gt;not&lt;/i&gt; upgrade things you don&#39;t want to upgrade[2].&lt;br /&gt;
- We will make it easier to distribute your extensions[3].&lt;br /&gt;
- We will make it easier to release according to your own schedule[4].&lt;br /&gt;
- We will make it easier to add functionality[5].&lt;br /&gt;
- We will make it easier to work.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ok, &lt;i&gt;today&lt;/i&gt; is a white lie here maybe... I haven&#39;t actually implemented this, but bear with me here for a second.&lt;br /&gt;
&lt;br /&gt;
- Wouldn&#39;t it be great if PHP would just be language/syntax things?&lt;br /&gt;
- Wouldn&#39;t it be great if you could upgrade an extension you use independently from anything else?&lt;br /&gt;
- Wouldn&#39;t it be great if you could get your hands on the new intl/mysqlnd/MongoDB/curl/whatever features without needing to upgrade PHP and everything else?&lt;br /&gt;
- Wouldn&#39;t it be great if you could get your hands on new PHP syntax without needing to upgrade intl/mysqlnd/MongoDB/curl/whatever?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;
What the hell are you talking about?&lt;/h4&gt;
The PEAR package manager is dying. It has been dying for a while.&lt;br /&gt;
Thats not a bad thing, or even sad, it is actually a very good thing.&lt;br /&gt;
It has served its purpose and its time to die and let the next thing take over, like dependency managers.&lt;br /&gt;
&lt;br /&gt;
This however leaves PHP extensions in an unfortunate situation. They rely on the PEAR packaging manager, and there currently isn&#39;t any alternative.&lt;br /&gt;
&lt;br /&gt;
Recently, during the process of making &lt;a href=&quot;http://news.php.net/php.pecl.dev/11047&quot; target=&quot;_blank&quot;&gt;Windows binaries for PECL extensions&lt;/a&gt; available again (e.g. pecl4win, which &lt;a href=&quot;http://www.php.net/archive/2008.php#id2008-12-10-1&quot; target=&quot;_blank&quot;&gt;died in 2008&lt;/a&gt;) the issue of licensing came up - some licenses (including the PHP license which many/most PECL extension are licensed under) requires certain paragraphs to be &lt;i&gt;reproduced&lt;/i&gt; (generally simply including the LICENSE file).. making &lt;a href=&quot;http://news.php.net/php.pecl.dev/11245&quot; target=&quot;_blank&quot;&gt;distributing binaries a problem&lt;/a&gt;.&lt;br /&gt;
Detecting what is a license file became a problem since the packaging manager cannot mark a file(s) as the license.. Adding that functionality is trivial, but there is a problem.&lt;br /&gt;
There hasn&#39;t been a release of the &lt;a href=&quot;http://pear.php.net/package/PEAR&quot; target=&quot;_blank&quot;&gt;packaging manager since 2011&lt;/a&gt;, and a similar change (&lt;a href=&quot;http://markmail.org/message/ut24ahcbbu57ln5i&quot; target=&quot;_blank&quot;&gt;adding unix manual pages detection&lt;/a&gt;) took 2 years to be merged (and still isn&#39;t released!) - but there most likely won&#39;t be any release in the near future anyway... And we are stuck.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;
Now we have the chance to make it right!&lt;/h4&gt;
I would like to create the new &quot;pecl install&quot; tool, a new extension manager -- a PHP manager.&lt;br /&gt;
A way for you to decide what you want to upgrade - do you want bugfixes or new features at the language level, or is there just one specific bugfix or a feature you need from a specific functionality (i.e. extension)?&lt;br /&gt;
&lt;br /&gt;
This tool would effectively only install PHP - the language - not any &quot;default extensions&quot;. Then its up to you to decide what you want or need for your project.&lt;br /&gt;
You&#39;ll get the language version you decide, and you can upgrade the extension set independently of what language version you want to use.&lt;br /&gt;
&lt;br /&gt;
Currently, if you download PHP from source and compile it with its &quot;default extension set&quot; you&#39;ll get all sorts of extensions that may or may not be useful to you. If you then install PHP on Windows you get a different set of enabled by default extensions. God bless if you install PHP on a Linux distribution from their packaging repositories, you&#39;ll get whatever they decide is best for you.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;
What about my hosting situation?&lt;/h4&gt;
Whatever extensions are available won&#39;t change (random set of extensions on shared hosting, some management panel to enable/disable on dedicated hosting), but what version (features/bugfixes) these extensions are will most likely be improved in the dedicated hosting scenario as you&#39;d be able to pick &quot;new features&quot; vs &quot;old and stable, bugfixes&quot;.&lt;br /&gt;
&lt;br /&gt;
In the case you actually have control, you&#39;ll be able to &quot;pecl/apt-get/yum install/upgrade&quot; based on your preferences - latest features, or bugfixes only.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;
When will this be available?&lt;/h4&gt;
There seems to be a great momentum on internals@ these days for making a lot of internal changes which will require a new major version of PHP. This is a perfect time to introduce a new PHP extension manager into the mix. Let PEAR and 5.x stay as-is, while the next major release of PHP that will dominate the next decade or so get an improved tool to deal with this.&lt;br /&gt;
The focus needs to be for the future, and once we have something solid.. We could think about adding support for the current extension system, although that should be a secondary goal - we need something for tomorrow, not yesterday.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h4&gt;
-Hannes&lt;/h4&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
[1] New functionality or security update&lt;br /&gt;
[2] Backwards compatibility breaking releases&lt;br /&gt;
[3] No centralized management&lt;br /&gt;
[4] No need to wait for PHP releases, or work overtime to make it in time for release&lt;br /&gt;
[5] No PHP version restrictions&lt;br /&gt;
&lt;br /&gt;</description><link>http://bjori.blogspot.com/2014/05/i-have-dream.html</link><author>noreply@blogger.com (bjori)</author><thr:total>1</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6188174695458425487.post-5908332893565367983</guid><pubDate>Wed, 18 Sep 2013 11:30:00 +0000</pubDate><atom:updated>2013-09-18T04:30:01.472-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">MongoDB</category><category domain="http://www.blogger.com/atom/ns#">php</category><category domain="http://www.blogger.com/atom/ns#">profiling</category><category domain="http://www.blogger.com/atom/ns#">streams</category><title>Query logging and profiling in MongoDB</title><description>In my &lt;a href=&quot;http://bjori.blogspot.com/2013/09/php-stream-notifications-mongodb.html&quot;&gt;previous blog post&lt;/a&gt; I mentioned that the &lt;a href=&quot;https://jira.mongodb.org/browse/PHP/fixforversion/12438&quot;&gt;1.5.0 release&lt;/a&gt; of the &lt;a href=&quot;http://php.net/mongo&quot;&gt;MongoDB driver for PHP&lt;/a&gt; has &lt;a href=&quot;https://github.com/mongodb/mongo-php-driver/pull/519&quot;&gt;improved notification support&lt;/a&gt; using the &lt;a href=&quot;http://php.net/context.params&quot;&gt;PHP Notification API&lt;/a&gt;, and showed off a fairly useless (but fun) progress bar.&lt;br /&gt;
Now its time for a little bit more practical examples using this system: Query logging and profiling.&lt;br /&gt;
&lt;br /&gt;
Those of you who clicked through to the github Pull Request may have noticed the long long description of the API and noticed all the different &quot;&lt;code&gt;MONGO_STREAM_NOTIFY_LOG_xxx&lt;/code&gt;&quot; constants it included..&lt;br /&gt;
&lt;br /&gt;
When instantiating &lt;a href=&quot;http://php.net/mongoclient&quot;&gt;MongoClient&lt;/a&gt; you can pass in &quot;&lt;a href=&quot;http://php.net/mongoclient.construct&quot;&gt;Driver Options&lt;/a&gt;&quot; using the 3rd argument. Currently there is only one available Driver Option: &quot;&lt;code&gt;context&lt;/code&gt;&quot;.&lt;br /&gt;
&lt;br /&gt;
The&amp;nbsp;&lt;code&gt;context&lt;/code&gt;&amp;nbsp;key takes a &lt;a href=&quot;http://php.net/context&quot;&gt;Stream Context&lt;/a&gt;, and is assigned to all of the underlaying connections the driver creates - which means you can set any of the &lt;a href=&quot;http://php.net/context.socket&quot;&gt;Socket Context&lt;/a&gt;&amp;nbsp;and &lt;a href=&quot;http://php.net/context.ssl&quot;&gt;SSL Context&lt;/a&gt;&amp;nbsp;options and it will Just Work (maaan.. that saved me a ton of work.. Not needing to implement any of the SSL things myself!).&lt;br /&gt;
Since its just a normal Stream Context, the lesser known &lt;a href=&quot;http://php.net/context.params&quot;&gt;Context Parameters&lt;/a&gt; will also Just Work, but what does that mean?&lt;br /&gt;
&lt;br /&gt;
Well, PHP has a trivial notifications system when operating on streams. The out-of-the-box support is (incremental) progress updates when reading and writing to streams, which I covered in my previous blog post. The MongoDB driver however extends this support with a lot of other things.&lt;br /&gt;
&lt;br /&gt;
Keep in mind I haven&#39;t documented any of this just yet as its all still experimental.&lt;br /&gt;
&lt;br /&gt;
OK. Lets check this out.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-size: small;&quot;&gt;(The &lt;a href=&quot;https://gist.github.com/bjori/6586633&quot;&gt;entire script is available as a Gist&lt;/a&gt; on Github).&lt;/span&gt;&lt;br /&gt;
&lt;pre class=&quot;brush:php;&quot;&gt;&amp;lt;?php
class MyStreamNotifications {
    public $reqs = array();


    /* Our callback function
     * The prototype is define by the PHP Stream Notification system:
     * http://php.net/stream_notification_callback
     */
    function update($notification_code, $severity, $message, $message_code, $bytes_transferred, $bytes_max) {
        switch($notification_code) {
            /* For now, lets focus on the TYPE_LOG, and ignore the others */
            case MONGO_STREAM_NOTIFY_TYPE_LOG:
                /* This notification only uses two arguments, so we can ignore the rest */
                return $this-&amp;gt;logMessage($message_code, $message);

            default:
        }
    }

    /* Our logging function
     * The $code describes the operation being executed,
     * and $message is a json serialized array, packed with information
     * Note: If ext/json is not available, $message with be PHP serialize()d instead
     */
    function logMessage($code, $message) {
        $data = json_decode($message, true);

        switch($code) {
            /* Write operations are a one way street in MongoDB, so these don&#39;t end with a
             * MONGO_STREAM_NOTIFY_LOG_RESPONSE_HEADER.
             * When using WriteConcern (defaults to 1), and additional query (command) is
             * sent to check for errors, called getLastError*/
            case MONGO_STREAM_NOTIFY_LOG_INSERT:
            case MONGO_STREAM_NOTIFY_LOG_UPDATE:
            case MONGO_STREAM_NOTIFY_LOG_DELETE:
            case MONGO_STREAM_NOTIFY_LOG_GETMORE:
            case MONGO_STREAM_NOTIFY_LOG_KILLCURSOR:
            case MONGO_STREAM_NOTIFY_LOG_BATCHINSERT:
                /* We only care about the query and response headers, for now */
                break;

            /* We´ve got a query */
            case MONGO_STREAM_NOTIFY_LOG_QUERY:
                /* Retrieve the Wire protocol Request ID, so we can match it with the
                 * Response headers once the query as executed */
                $reqid = $data[&quot;server&quot;][&quot;request_id&quot;];

                /* Log all the metadata we have about the query, and add the start time */
                $this-&amp;gt;reqs[$reqid] = $data;
                $this-&amp;gt;reqs[$reqid][&quot;start&quot;] = microtime(true);
            break;

            /* The query has executed on the server, and now we are reading the
             * response headers */
            case MONGO_STREAM_NOTIFY_LOG_RESPONSE_HEADER:
                // Get the Request ID this respose is for
                $id = $data[&quot;server&quot;][&quot;request_id&quot;];

                /* The driver runs some commands internally, such as isMaster() to
                 * sanitycheck the connection to the server, these commands currently
                 * don&#39;t trigger the notification system - that may/will change in the
                 * future though */
                if (!isset($this-&amp;gt;reqs[$id])) {
                    return;
                }

                // Fetch the request info
                $req = $this-&amp;gt;reqs[$id];
                // End the timer
                $end = microtime(true);

                // Add the ending time, and how long it took
                $req[&quot;ended&quot;] = $end;
                $req[&quot;total&quot;] = $end - $req[&quot;start&quot;];

                $this-&amp;gt;reqs[$id] = $req;
            break;

            default:
                // Unknown log message code, ignore
        }
    }

    function getRequests() {
        return $this-&amp;gt;reqs;
    }
}
&lt;/pre&gt;
Thats a good chunk of code, just to profile queries.. But bare with me for a moment.&lt;br /&gt;
&lt;br /&gt;
There is a lot of things happening right there, but hopefully the inline comments make sense of it all.&lt;br /&gt;
The &lt;strong&gt;update()&lt;/strong&gt; method is the actual callback function (which we will be registering a little later).&lt;br /&gt;
It has a lot of arguments, and the $bytes_transferred and $bytes_max aren&#39;t even relevant in most scenarios, but ohhwell. Nothing we can do about that as this is the interface PHP provides us with.&lt;br /&gt;
&lt;br /&gt;
The $notification_code is the &quot;main argument&quot; in the callback function, it tells us what sort of notification it is, and there are a handful of different notifications that can happen.&lt;br /&gt;
Each notification then has its own set of &quot;$message_code&quot;, in this case, one of the &lt;strong&gt;MONGO_STREAM_NOTIFY_LOG_xxx&lt;/strong&gt; constants.&lt;br /&gt;
Since we are only interested in logging and profiling the queries we ignore all the different &lt;strong&gt;MONGO_STREAM_NOTIFY_LOG_xxx&lt;/strong&gt; (they are only there for completeness - in case you want to extend the example and experiment with them later), and only catch the &lt;strong&gt;MONGO_STREAM_NOTIFY_LOG_QUERY&lt;/strong&gt; and &lt;strong&gt;MONGO_STREAM_NOTIFY_LOG_RESPONSE_HEADER&lt;/strong&gt;.
&lt;br /&gt;
&lt;br /&gt;
Moving on..
&lt;br /&gt;
&lt;pre class=&quot;brush:php;&quot;&gt;/* Some Helper Functions */

/* Split a Server Hash to extract the server name from it */
function getServerName($hash) {
    list($server, $replicaset, $dbname, $pid) = explode(&quot;;&quot;, $hash);

    return $server;
}

/* Resolve the server type to a readable string */
function getServerType($type) {
    switch($type) {
        // FIXME: Do we not export these as constants?
        case 0x01: return &quot;STANDALONE&quot;;
        case 0x02: return &quot;PRIMARY&quot;;
        case 0x04: return &quot;SECONDARY&quot;;
        case 0x10: return &quot;MONGOS&quot;;
    }
}

/* Resolve Cursor (Query) Options to something meaningful */
function getCursorOptions($opts) {
    // FIXME: Do we not export these as constants?
    if (($opts &amp;amp; 0x04) == 0x04) {
        return &quot;slaveOkay&quot;;
    }
    return &quot;Primary Only&quot;;
}
&lt;/pre&gt;
Here we define some helper functions, and actually few FIXMEs for myself so you don&#39;t have to remember these magic numbers :)&lt;br /&gt;
Other then that, nothing really important.&lt;br /&gt;
Next up, boilerplate setting to connect to a ReplicaSet.
&lt;br /&gt;
&lt;pre class=&quot;brush:php;&quot;&gt;/* Boilerplate stuff to setup a ReplicaSet connection */
// My replicaset seed list
$seeds = &quot;toddler.local:30200,toddler.local:30201&quot;;

// MongoDB Connection options
$moptions = array(
    // Don&#39;t wait to long on servers that are down
    &quot;connectTimeoutMS&quot; =&amp;gt; 300,
    // Read from secondaries, if available
    &quot;readPreference&quot; =&amp;gt; MongoClient::RP_SECONDARY_PREFERRED,
    // My local ReplicaSet name
    &quot;replicaSet&quot; =&amp;gt; &quot;REPLICASET&quot;,
    // Don&#39;t wait more then a second to confirm Replication
    &quot;wTimeoutMS&quot; =&amp;gt; 1000,
);
&lt;/pre&gt;
Again, that wasn&#39;t fun... Lets take a look at some fun things next!
&lt;br /&gt;
&lt;pre class=&quot;brush:php;&quot;&gt;/* Registering a stream context! This is the fun part! */

// Create an instance of our callback object
$mn = new MyStreamNotifications;

// No Stream Context Options, for now
$coptions = array();
// Configure the Notification Stream Context Parameter to call MyStreamNotifications-&amp;gt;update()
$cparams  = array(&quot;notification&quot; =&amp;gt; array($mn, &quot;update&quot;));

// Create the Stream Context
$ctx = stream_context_create($coptions, $cparams);

$doptions = array(&quot;context&quot; =&amp;gt; $ctx);


// Instanciate a MongoClient with all our options
$mc = new MongoClient($seeds, $moptions, $doptions);
&lt;/pre&gt;
If you have never played around with &lt;a href=&quot;http://php.net/context&quot;&gt;PHP Stream Contexts&lt;/a&gt;, this may look a bit alien..&lt;br /&gt;
The &lt;a href=&quot;http://php.net/stream_context_create&quot;&gt;stream_context_create()&lt;/a&gt; function takes two arguments, context options and parameters.&lt;br /&gt;
There is a very subtle difference between those two, and we do support both (yes yes, not documented.. :) still highly experimental), but for now, we are using the notification parameter.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Now that we have setup everything we need and have connected to MongoDB, configured just the way we like it, its time to run few commands and queries to check this thing out
&lt;br /&gt;
&lt;pre class=&quot;brush:php;&quot;&gt;// Query the example collection in the test database
// you should probably change this to something meaningful
$collection = $mc-&amp;gt;selectCollection(&quot;test&quot;, &quot;example&quot;);


// Random search criteria, you should change this to something meaningful
$criteria = array(&quot;search&quot; =&amp;gt; &quot;criteria&quot;);
// Add some sorting &amp;amp; limit for the fun of it
$cursor = $collection-&amp;gt;find($criteria)-&amp;gt;skip(13)-&amp;gt;limit(5)-&amp;gt;sort(array(&quot;_id&quot; =&amp;gt; 1));

// Count on a secondary (we constructed the MongoClient with SECONDARY_PREFERRED)
$count = $cursor-&amp;gt;count();
echo &quot;We have $count results in total\n&quot;;

// Fetch the data from a primary
$cursor-&amp;gt;setReadPreference(MongoClient::RP_PRIMARY);

/* The query isn&#39;t execute until we start iterating over it.. */
foreach($cursor as $doc) {
}
&lt;/pre&gt;
When you are trying this out for yourself, make sure you have establish a connection to your MongoDB instance (modifying the $seeds and $moptions[&quot;replicaSet&quot;] variables up there), and modify the database+collection name, along with the query criteria.&lt;br /&gt;
&lt;br /&gt;
Now that we have executed some things, our $mn-&amp;gt;reqs array has now some interesting info its time to print out
&lt;br /&gt;
&lt;pre class=&quot;brush:php;&quot;&gt;// Fetch our requests from our logger
$reqs = $mn-&amp;gt;getRequests();
foreach($reqs as $request) {
    printf(&quot;Hit %s (which is a %s, I asked for %s) with:\n%s\n&quot;,
        getServerName($request[&quot;server&quot;][&quot;hash&quot;]),
        getServerType($request[&quot;server&quot;][&quot;type&quot;]),
        getCursorOptions($request[&quot;info&quot;][&quot;options&quot;]),
        json_encode($request[&quot;query&quot;], JSON_PRETTY_PRINT)
    );
    printf(&quot;Skipping the first %d matches, limiting the results to %d documents..\n&quot;,
        $request[&quot;info&quot;][&quot;skip&quot;],
        $request[&quot;info&quot;][&quot;limit&quot;]
    );
    printf(&quot;Server execution time+network latency: %.8f sec\n\n&quot;, $request[&quot;total&quot;]);
}
&lt;/pre&gt;
Putting it all together, and running the script should then print out something like:
&lt;br /&gt;
&lt;pre class=&quot;brush:plain;&quot;&gt;We have 205 results in total
Hit localhost:30201 (which is a SECONDARY, I asked for slaveOkay) with:
{
    &quot;count&quot;: &quot;example&quot;,
    &quot;query&quot;: {
        &quot;search&quot;: &quot;criteria&quot;
    }
}
Skipping the first 0 matches, limiting the results to -1 documents..
Server execution time+network latency: 0.00042319 sec

Hit localhost:30200 (which is a PRIMARY, I asked for Primary Only) with:
{
    &quot;$query&quot;: {
        &quot;search&quot;: &quot;criteria&quot;
    },
    &quot;$orderby&quot;: {
        &quot;_id&quot;: 1
    }
}
Skipping the first 13 matches, limiting the results to 5 documents..
Server execution time+network latency: 0.00045013 sec
&lt;/pre&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
You may want to var_dump() the $request variable to see what other fun things it contains to play with, hopefully I&#39;ll have it all properly documented by the time we release 1.5.0 version of the driver.&lt;br /&gt;
As you can see, the driver needs to massage the query a little bit to add things like orderby clauses, where as &quot;skip&quot; and &quot;limit&quot; are part of the &lt;a href=&quot;http://docs.mongodb.org/meta-driver/latest/legacy/mongodb-wire-protocol/&quot;&gt;wire protocol&lt;/a&gt; and therefore not part of the actual query syntax.&lt;br /&gt;
If you have the&amp;nbsp;&lt;a href=&quot;http://docs.mongodb.org/manual/tutorial/manage-the-database-profiler/&quot;&gt;MongoDB profiler&lt;/a&gt;&amp;nbsp;enabled, you could then lookup how long the query execution took on the server, subtract the time we got and you have the time it took us to read and write over the network.&lt;br /&gt;
&lt;br /&gt;
Another related feature is the&amp;nbsp;&lt;a href=&quot;http://docs.mongodb.org/manual/reference/operator/comment/&quot;&gt;$comment&lt;/a&gt; operator that &quot;tags&quot; a query, so its easier to spot in the profiler. You could use this to for example group your queries (&quot;person model&quot;, &quot;retrieving comments&quot;, &quot;product query&quot;, ...).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Although this is a good chunk of code, I hope it will be useful, especially for applications that require thorough auditing of its queries. This should also be easily integrable into most &quot;Profiler/Developer toolbar&quot; that the various frameworks provide.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Since this is all still highly experimental, there is still time to change some things, so I wonder.. what do you think?&lt;br /&gt;
&lt;br /&gt;
-Hannes
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;</description><link>http://bjori.blogspot.com/2013/09/query-logging-and-profiling-in-mongodb.html</link><author>noreply@blogger.com (bjori)</author><thr:total>0</thr:total><georss:featurename>Palo Alto, CA, USA</georss:featurename><georss:point>37.4418834 -122.14301949999998</georss:point><georss:box>37.239989900000005 -122.46574299999997 37.6437769 -121.82029599999998</georss:box></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6188174695458425487.post-6988926601954814958</guid><pubDate>Tue, 17 Sep 2013 10:00:00 +0000</pubDate><atom:updated>2013-09-17T03:00:10.668-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">MongoDB</category><category domain="http://www.blogger.com/atom/ns#">notifications</category><category domain="http://www.blogger.com/atom/ns#">progressbar</category><category domain="http://www.blogger.com/atom/ns#">streams</category><title>PHP Stream Notifications ❤ MongoDB</title><description>PHP Streams have several pretty nifty features that most people don&#39;t really know about; &lt;a href=&quot;http://php.net/class.php-user-filter&quot;&gt;Filters&lt;/a&gt;, &lt;a href=&quot;http://php.net/class.streamwrapper&quot;&gt;Wrappers&lt;/a&gt;, &lt;a href=&quot;http://php.net/context&quot;&gt;Context&lt;/a&gt;, and &lt;a href=&quot;http://php.net/context.params&quot;&gt;Notifications&lt;/a&gt;. Documenting these is a bit difficult, and getting the user to discover these features is even more problematic, as these things usually live outside of the normal path (function reference).&lt;br /&gt;
Maybe I&#39;ll blog about these things in the future, but for now I want to talk about the &lt;a href=&quot;http://php.net/stream-notification-callback&quot;&gt;Stream (context) Notifications&lt;/a&gt;&amp;nbsp;- or more specifically; Stream Notifications in the MongoDB extension for PHP.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The Stream Notifications are essentially pretty simple: when a stream does something, it notifies something (a callback function) that it did something (notification codes, importance, message code, ..).&lt;br /&gt;
Since this feature is a little neglected and people don&#39;t seem to know about it, this &quot;something happened&quot; isn&#39;t really a lot of things. When PHP reads from the http stream it will tell you if it came across a &quot;&lt;a href=&quot;http://php.net/stream.constants#constant.stream-notify-redirected&quot;&gt;redirect header&lt;/a&gt;&quot;,&amp;nbsp;&quot;&lt;a href=&quot;http://php.net/stream.constants#constant.stream-notify-mime-type-is&quot;&gt;mime-type&lt;/a&gt;&quot;, and, when available, the &lt;a href=&quot;http://php.net/stream.constants#constant.stream-notify-file-size-is&quot;&gt;content size&lt;/a&gt;. Simple things.&lt;br /&gt;
This is actually pretty powerful and allows you to do some work, even when file_get_contents() a large large file, so it doesn&#39;t have to be a blocking operation anymore.&lt;br /&gt;
An example of a simple, yet pretty cool, script would be a wget/curl style &lt;a href=&quot;http://php.net/function.stream-notification-callback#stream-notification-callback.example.download&quot;&gt;download application with a progress bar&lt;/a&gt;&amp;nbsp;(we actually &lt;a href=&quot;http://git.php.net/?p=php-src.git;a=blob;f=pear/fetch.php;h=01d223392e48d54997dcb841e0a50db48ba16bd0;hb=HEAD&quot;&gt;use that example&lt;/a&gt; to download pear things when &lt;a href=&quot;http://git.php.net/?p=php-src.git;a=blob;f=pear/Makefile.frag;h=00bacae2df60c335dd5c877cc60dbcf1e53a7c6c;hb=HEAD#l27&quot;&gt;you install PHP&lt;/a&gt; and don&#39;t have &lt;a href=&quot;http://www.gnu.org/software/wget/&quot;&gt;wget&lt;/a&gt; or &lt;a href=&quot;http://www.freebsd.org/cgi/man.cgi?query=fetch&amp;amp;sektion=1&quot;&gt;fetch&lt;/a&gt;).&lt;br /&gt;
&lt;br /&gt;
Enter MongoDB for PHP.&lt;br /&gt;
As of &lt;a href=&quot;http://pecl.php.net/package/mongo/1.4.0&quot;&gt;pecl/mongo 1.4.0&lt;/a&gt; we have switched out our homegrown sockets library in favor of using the native PHP streams. This gives us several advantages, such as greater portability, automatic support for SSL, and memory reporting is now more inline with reality, as everything is mapped using the PHP allocation functions.&lt;br /&gt;
&lt;br /&gt;
Now, since we are using the PHP streams.. a pretty cool thing happens: We can now play around with the notification API and Stream Contexts.&lt;br /&gt;
A highly &lt;a href=&quot;https://github.com/mongodb/mongo-php-driver/pull/349&quot;&gt;experimental (undocumented) API&lt;/a&gt; was included in the 1.4.0 release, and now as we are prepping for 1.5.0, &lt;a href=&quot;https://github.com/mongodb/mongo-php-driver/pull/519&quot;&gt;I&#39;ve spent more time on it&lt;/a&gt;, adding things that are &quot;useless, until you play with it&quot;.. Such as progress reporting for read/write.. Wait what?&lt;br /&gt;
&lt;br /&gt;
Yeah. OMG LOL For realz.&lt;br /&gt;
I created a little example, called &lt;a href=&quot;https://gist.github.com/bjori/654d92aad62b19162b88/raw/3bdac837544477632964147345c77f8d84810ee2/spindle.php&quot;&gt;spindle.php&lt;/a&gt;, which queries the &lt;a href=&quot;http://mongodb-enron-email.s3-website-us-east-1.amazonaws.com/&quot;&gt;enron dataset&lt;/a&gt;, and&lt;a href=&quot;https://gist.github.com/bjori/654d92aad62b19162b88/raw/dc3c47432ed5826fff0ce4d5cdb49185af2e5466/Output&quot;&gt; prints out a progress bar for all socket read and writes&lt;/a&gt;, along with meta information like the actual command and query being sent - and even some information about the actual &lt;a href=&quot;http://docs.mongodb.org/meta-driver/latest/legacy/mongodb-wire-protocol/&quot;&gt;wireprotocol operation&lt;/a&gt;, in case you are interested. Writing the queries and reading the data is too fast on my laptop so I had to add usleep() into the code to see the progressbar spinning.. but its still fun.&lt;br /&gt;
&lt;br /&gt;
I can&#39;t really think of a real practical use case for reporting socket read/write progress updates.. But its there. Hopefully someone can come up with some cool things using it :)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Note: The &lt;a href=&quot;https://github.com/mongodb/mongo-php-driver/pull/519&quot;&gt;Pull Request&lt;/a&gt;&amp;nbsp;hasn&#39;t been merged yet, and the API is still considered as experimental, so you&#39;ll have to use my&amp;nbsp;&lt;a href=&quot;https://github.com/bjori/mongo-php-driver/tree/improved-notify-support&quot;&gt;improved-notify-support&lt;/a&gt; branch for now if you want to play with it.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Progress reporting obviously isn&#39;t the only thing the new Notification API does, I&#39;ll blog about the more practical notifications later :)&lt;br /&gt;
&lt;br /&gt;
-Hannes&lt;br /&gt;
&lt;br /&gt;</description><link>http://bjori.blogspot.com/2013/09/php-stream-notifications-mongodb.html</link><author>noreply@blogger.com (bjori)</author><thr:total>5</thr:total><georss:featurename>Palo Alto, CA, USA</georss:featurename><georss:point>37.4418834 -122.14301949999998</georss:point><georss:box>37.239989900000005 -122.46574299999997 37.6437769 -121.82029599999998</georss:box></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6188174695458425487.post-2776000834518916998</guid><pubDate>Fri, 06 Sep 2013 11:00:00 +0000</pubDate><atom:updated>2013-09-06T04:00:02.733-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">docbook</category><category domain="http://www.blogger.com/atom/ns#">phd</category><category domain="http://www.blogger.com/atom/ns#">php</category><category domain="http://www.blogger.com/atom/ns#">phpweb</category><category domain="http://www.blogger.com/atom/ns#">redesign</category><category domain="http://www.blogger.com/atom/ns#">wtfm</category><title>New PHP.net designs floating around</title><description>&lt;a href=&quot;http://php.markmail.org/message/gyps4w5657s6fei5&quot;&gt;Since 2008&lt;/a&gt; there have been numerous efforts to create a new design for www.php.net, all of which have failed - so far.&lt;br /&gt;
We&#39;ve never come as close as two years ago, when the &lt;a href=&quot;http://php.markmail.org/thread/ind2bddwph7aaem4&quot;&gt;&quot;beta mode&quot;&lt;/a&gt;&amp;nbsp;option was added to our website, but we never really got around to finish it.&lt;br /&gt;
The &lt;a href=&quot;https://plus.google.com/109197437915281611089/posts/D78CEUMVJHX&quot;&gt;&quot;beta design&quot;&lt;/a&gt; has even received a lot of makeover compared to what is &lt;a href=&quot;http://prototype.php.net/&quot;&gt;&quot;beta mode&quot; now&lt;/a&gt;.&lt;br /&gt;
To make things a little bit more awesome, there is also a new &lt;a href=&quot;http://markmail.org/message/ddi7vkpsbnlqlixo&quot;&gt;branch called &quot;responsive&quot;&lt;/a&gt;&amp;nbsp;which has a &lt;a href=&quot;http://php.adamharvey.name/&quot;&gt;lot of changes in it too&lt;/a&gt;, especially for &lt;a href=&quot;http://php.adamharvey.name/manual/en/function.strpos.php&quot;&gt;manual pages&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Hopefully, one day, we&#39;ll actually finish one of these and flip the switch forever.&lt;br /&gt;
&lt;br /&gt;
In the meanwhile, I&#39;m working on &lt;a href=&quot;http://markmail.org/message/savqyv5rbh66beh3&quot;&gt;retiring my little baby&lt;/a&gt;, &lt;a href=&quot;http://doc.php.net/phd/&quot;&gt;PhD&lt;/a&gt;, as I want to encourage more people to get involved with the overall project, especially the neglected parts like documentations.&lt;br /&gt;
It doesn&#39;t help anyone to be greeted with a &quot;ohh, btw, you have to have a doctorate to be able to work on the docs&quot; like &quot;almost&quot; is the case with &lt;a href=&quot;http://markmail.org/message/4mluqwhso3jwabw5&quot;&gt;our usage of Docbook&lt;/a&gt;&amp;nbsp;- not to mention the fact &lt;a href=&quot;http://www.docbook.org/&quot;&gt;DocBook&lt;/a&gt; isn&#39;t exactly the easiest markup format to learn.&lt;br /&gt;
&lt;br /&gt;
I&#39;ve been a huge advocate of highly semantic markup, and never dreamed that I would want to get rid of Docbook for our documentation.. But now I finally understand.&lt;br /&gt;
It must be &lt;a href=&quot;http://producingoss.com/en/getting-started.html#documentation&quot;&gt;*simple* to contribute&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Although I have &lt;a href=&quot;http://bjori.blogspot.com/2007/10/phd-php-based-docbook-renderer-rc1.html&quot;&gt;optimised our tooling&lt;/a&gt;&amp;nbsp;from taking over a week down to roughly 3minutes, it still isn&#39;t good enough. It needs to &lt;b&gt;instant.&lt;/b&gt;&amp;nbsp;And we can&#39;t reach that point with out current markup. We need to change. Make it simpler. Attract new people. Make it fun to contribute and help out.&lt;br /&gt;
&lt;br /&gt;
To that end I&#39;ve started working on a tool I call &lt;abbr title=&quot;Write the Fudging Manual&quot;&gt;&quot;WTFM&quot;&lt;/abbr&gt;, which is a Markdownish renderer..&lt;br /&gt;
The goal is to keep some of our smart trickery and simplifications we do in Docbook, just without that massive amount of markup and confusion. There shouldn&#39;t be any need to &quot;learn a new format&quot;. Just write the docs, click save and you see it rendered instantly. No weirdo wiki markup noone understands, or hundreds of rules to obey.&lt;br /&gt;
&lt;abbr title=&quot;Write the Fudging Manual&quot;&gt;&lt;br /&gt;&lt;/abbr&gt;
I haven&#39;t exactly finalised the tool, or the actual &quot;non-format format&quot; yet, but the current (pre-alpha has-a-lot-of-bugs) &lt;a href=&quot;http://www.php.net/~hannes/wtfm.php?function.strpos.md&quot;&gt;proof-of-concept is running&lt;/a&gt; - and to stay true to our &quot;lets make a new design&quot; goals.. It has completely different markup rendering, so I had to create a new CSS for :)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
What is your favorite layout so far? You think you can help us finish any of these?&lt;br /&gt;
Shamefully enough, getting the website running locally is a huge pain in the ***, &lt;a href=&quot;https://wiki.php.net/web/mirror&quot;&gt;but these instructions should take away most of the pain&lt;/a&gt;...&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;mailto:php-webmaster@lists.php.net?subject=I%20want%20to%20contribute!&quot;&gt;Hope to hear from you&lt;/a&gt;!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-Hannes&lt;br /&gt;
&lt;br /&gt;</description><link>http://bjori.blogspot.com/2013/09/new-phpnet-designs-floating-around.html</link><author>noreply@blogger.com (bjori)</author><thr:total>6</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6188174695458425487.post-2905938872049448521</guid><pubDate>Fri, 06 Sep 2013 04:12:00 +0000</pubDate><atom:updated>2013-09-05T21:12:50.306-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">married</category><category domain="http://www.blogger.com/atom/ns#">ninja</category><category domain="http://www.blogger.com/atom/ns#">twoyears</category><title>A lot of things happen in two years..</title><description>Turns out; The title of the blog is completely true.. I really really don&#39;t blog :)&lt;br /&gt;
Since my last blog entry, just over 2 years ago, I..&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Left my job at &lt;a href=&quot;http://redpill-linpro.com/&quot;&gt;Redpill Linpro&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Moved from Oslo to London&lt;/li&gt;
&lt;li&gt;Joined &lt;a href=&quot;http://www.mongodb.com/profile/hannes-magnusson&quot;&gt;10gen (now MongoDB)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Moved to San Francisco&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://twitter.com/bjori/status/347876223390732290/photo/1/large&quot;&gt;Got married&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Moved to Menlo Park&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
..and now I&#39;m expecting a female ninja early next year..&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
That is a good chunk of life changing events crammed into only ~2 years :)&lt;br /&gt;
Thats it for now though.. Mainly just wanted to see if this thing still worked.&lt;br /&gt;
&lt;br /&gt;
-Hannes&lt;br /&gt;
&lt;br /&gt;</description><link>http://bjori.blogspot.com/2013/09/a-lot-of-things-happen-in-two-years.html</link><author>noreply@blogger.com (bjori)</author><thr:total>0</thr:total><georss:featurename>Palo Alto, CA, USA</georss:featurename><georss:point>37.4418834 -122.14301949999998</georss:point><georss:box>37.239989900000005 -122.46574299999997 37.6437769 -121.82029599999998</georss:box></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6188174695458425487.post-6566963692007349423</guid><pubDate>Thu, 28 Apr 2011 11:23:00 +0000</pubDate><atom:updated>2011-04-28T04:23:00.352-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">launchpad</category><category domain="http://www.blogger.com/atom/ns#">PHP.next</category><category domain="http://www.blogger.com/atom/ns#">PHP5.4</category><category domain="http://www.blogger.com/atom/ns#">PHP5.next</category><category domain="http://www.blogger.com/atom/ns#">phpreleases</category><category domain="http://www.blogger.com/atom/ns#">ppa</category><title>There is an app^Wppa for that</title><description>Want to try out PHP5.next (PHP5.4?) on Ubuntu?&lt;br /&gt;
After the death of PHP6.0 a while ago, development of PHP.next (PHP5.4 probably?) has been going on.&lt;br /&gt;
There are a lot of cool features there try out - like &lt;a href=&quot;https://wiki.php.net/rfc/horizontalreuse&quot;&gt;traits&lt;/a&gt;, &lt;a href=&quot;https://wiki.php.net/rfc/typecheckingparseronly?s[]=scalar&amp;amp;s[]=type&amp;amp;s[]=hint&quot;&gt;scalar type hint&lt;/a&gt;, and sh**loads of &lt;a href=&quot;http://svn.php.net/repository/php/php-src/trunk/NEWS&quot;&gt;smaller features&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
There is still no public &quot;development preview&quot; or alpha release, but that doesn&#39;t mean we can&#39;t play around with it, report bugs, ensuring our apps still properly work with it etc etc etc.&lt;br /&gt;
It is however a bit annoying needing to &quot;go old-school&quot; and fetch a snapshot and build it yourself though.&lt;br /&gt;
&lt;br /&gt;
When I was playing &lt;a href=&quot;http://bjori.blogspot.com/2011/04/up2date-php53-packages-for-ubuntu.html&quot;&gt;with launchpad the other day&lt;/a&gt; I figured.. why not provide a daily build of PHP trunk/ (PHP.next, PHP5.4 or whatever you want to call it)?&lt;br /&gt;
&lt;br /&gt;
Launchpad isn&#39;t all to happy with git, and doesn&#39;t support mirroring git branches, so a fork of the &lt;a href=&quot;https://github.com/bjori/php5-vanilla-ubuntu&quot;&gt;php5-vanilla-ubuntu repo&lt;/a&gt;&amp;nbsp;to &lt;a href=&quot;https://github.com/bjori/php5-next-vanilla-ubuntu&quot;&gt;php5-next-vanilla-ubuntu&lt;/a&gt; was needed as some of the patches there don&#39;t apply to trunk/. But that was about it.&lt;br /&gt;
&lt;br /&gt;
So, want to try out PHP5.4 daily builds? Checkout the &lt;a href=&quot;https://launchpad.net/~bjori/+archive/php5-daily&quot;&gt;PHP5.4-daily PPA&lt;/a&gt; on launchpad!&lt;br /&gt;
&lt;br /&gt;
Play around with the new features, provide feedback to the &lt;a href=&quot;mailto:internals@lists.php.net&quot;&gt;PHP development mailinglist&lt;/a&gt;, and make sure your application if forward compatible with it today.</description><link>http://bjori.blogspot.com/2011/04/there-is-appwppa-for-that.html</link><author>noreply@blogger.com (bjori)</author><thr:total>1</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6188174695458425487.post-3843876427562442005</guid><pubDate>Sun, 17 Apr 2011 11:22:00 +0000</pubDate><atom:updated>2011-04-17T04:22:30.624-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">launchpad</category><category domain="http://www.blogger.com/atom/ns#">php</category><category domain="http://www.blogger.com/atom/ns#">PHP5.3</category><category domain="http://www.blogger.com/atom/ns#">ppa</category><category domain="http://www.blogger.com/atom/ns#">ubuntu</category><title>up2date PHP5.3 packages for Ubuntu</title><description>Most Linux distributions have a policy of not being to up to date with upstream releases of software, mostly for good reasons.&amp;nbsp;This however is extremely painful for developers, as it means they often need to use really outdated version, containing all sorts of bugs - and even missing features.&lt;br /&gt;
&lt;br /&gt;
This has been pissing me off for quite some time, so I have been running my own PHP builds for a while - but when it comes to deploying the apps... the sysadmins obviously start complaining that they have to invest a lot more work into maintaining the servers then they otherwise would have to.&lt;br /&gt;
So.. What can we do about that?&amp;nbsp;&lt;a href=&quot;https://launchpad.net/&quot;&gt;Launchpad&lt;/a&gt; to the rescue!&lt;br /&gt;
&lt;br /&gt;
Launchpad makes it really easy to provide your own custom packages, and even has a vast build farm to build packages automatically for different architectures and different Ubuntu releases. The only down side is it doesn&#39;t build rpm packages.. Thats fine by me, but that would be really useful for those wishing to deploy on a RedHat based distro.&lt;br /&gt;
&lt;br /&gt;
After hunting down the debian PHP packaging repo, I forked it onto github (as &lt;a href=&quot;https://github.com/bjori/php5-vanilla-ubuntu&quot;&gt;php5-vanilla-ubuntu&lt;/a&gt;) and started ripping out some of their weird patches and enabled mysqlnd, but otherwise keeping their package splitting and the things you would expect from a debian package.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
What does this mean?&lt;br /&gt;
- Well, if you are looking for up2date PHP packages (currently PHP5.3.6) to work with, checkout the &lt;a href=&quot;https://launchpad.net/~bjori/+archive/php5&quot;&gt;PHP5.3 PPA on launchpad&lt;/a&gt; :)&lt;br /&gt;
This PPA works just fine as a drop-in-replacement for the default Ubuntu packages, and provides builds for Lucid and Maverick (there are some changes in Natty I need to look into..).&lt;br /&gt;
&lt;br /&gt;
I have been running these packages for some time now, but if you notice any issues - please let me know :)</description><link>http://bjori.blogspot.com/2011/04/up2date-php53-packages-for-ubuntu.html</link><author>noreply@blogger.com (bjori)</author><thr:total>21</thr:total><georss:featurename>Oslo, Norway</georss:featurename><georss:point>59.9138688 10.752245399999993</georss:point><georss:box>59.8296888 10.589697899999992 59.998048800000007 10.914792899999993</georss:box></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6188174695458425487.post-7642776125228422920</guid><pubDate>Fri, 24 Dec 2010 09:35:00 +0000</pubDate><atom:updated>2010-12-24T01:44:04.909-08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">code review</category><category domain="http://www.blogger.com/atom/ns#">hack</category><category domain="http://www.blogger.com/atom/ns#">php</category><title>The PHP project and Code Review</title><description>Reading code is not only fun, its also a great way to exercise your brain - not to mention a fantastic way to discover new ways to solve problems. At &lt;a href=&quot;http://www.redpill-linpro.com/&quot;&gt;work&lt;/a&gt;&amp;nbsp;(&lt;a href=&quot;http://www.redpill-linpro.com/Grow-with-us/Who-are-we-looking-for/PHP-geek-nerd-or-expert&quot;&gt;we are hiring btw&lt;/a&gt;!), for example, I read pretty much every single commit (and merge requests, for that matter) - and I&#39;m subscribed to several different OSS commit lists. I can&#39;t say I read every commit to PHP, I focus on the areas I care about, but I do skim over the rest - if only just to see when new features are added.&lt;br /&gt;
&lt;br /&gt;
The PHP project has a good chunk of &lt;a href=&quot;http://php.net/mailinglists&quot;&gt;mailinglists&lt;/a&gt;, everything from support lists, developer discussions, QA, and so on. Every commit to our SVN is&amp;nbsp;automatically posted to the relevant commit mailinglist(s).&lt;br /&gt;
The main commit lists are;&lt;br /&gt;
&amp;nbsp;- PHP (php-cvs@lists.php.net,&amp;nbsp;&lt;a href=&quot;http://news.php.net/php.cvs&quot;&gt;http://news.php.net/php.cvs&lt;/a&gt;)&lt;br /&gt;
&amp;nbsp;- PHP Documentation (doc-cvs@lists.php.net, &lt;a href=&quot;http://news.php.net/php.doc.cvs&quot;&gt;http://news.php.net/php.doc.cvs&lt;/a&gt;)&lt;br /&gt;
&amp;nbsp;- PHP-GTK (phpgtk-cvs@lists.php.net,&amp;nbsp;&lt;a href=&quot;http://news.php.net/php.gtk.cvs&quot;&gt;http://news.php.net/php.gtk.cvs&lt;/a&gt;)&lt;br /&gt;
&amp;nbsp;- PEAR (pear-cvs@lists.php.net, &lt;a href=&quot;http://news.php.net/php.pear.cvs&quot;&gt;http://news.php.net/php.pear.cvs&lt;/a&gt;)&lt;br /&gt;
&amp;nbsp;- PECL (pecl-cvs@lists.php.net, &lt;a href=&quot;http://news.php.net/php.pecl.cvs&quot;&gt;http://news.php.net/php.pecl.cvs&lt;/a&gt;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Then we have specific lists for each &lt;a href=&quot;http://doc.php.net/php/dochowto/chapter-maillist.php&quot;&gt;translation of the docs&lt;/a&gt;, all the &lt;a href=&quot;http://news.php.net/php.webmaster&quot;&gt;websites&lt;/a&gt;, PEAR docs and so on.&lt;br /&gt;
The great thing about these commit lists is that *anyone* can &lt;a href=&quot;http://php.net/mailinglists&quot;&gt;subscribe to them&lt;/a&gt;, and quite a lot of people actually are.&lt;br /&gt;
For example, there are over 200 people registered to the PHP commit list, and over 100 people on the documentation commit list alone. That is ca 25% of the people that are subscribed to their discussion counterparts.&lt;br /&gt;
Granted that most of the subscribers do not actively review the commits, I guesstimate there is still a sizable percentage of them that do.&lt;br /&gt;
&lt;br /&gt;
Just the simple fact that I know people will be reading through my commits makes me think about what I am doing a bit more; &quot;Is this really needed?&quot;, &quot;Is there be a better way solving this?&quot;, &quot;Could it potentially break other things?&quot;, &quot;Is this actually correct?&quot;..&lt;br /&gt;
The people who review the commits often don&#39;t seem like the friendliest people in the world.. If there are issues with the commit; You will be told. No doubt about it. And you will feel like an idiot, for few minutes, for not having caught it yourself - and promise yourself to review your commits better in the future. Learning from your mistakes. I love it. Mission accomplished.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Last year I &lt;a href=&quot;http://news.php.net/php.cvs/60427&quot;&gt;updated the credit list&lt;/a&gt;, printed out by &lt;a href=&quot;http://php.net/phpinfo&quot;&gt;phpinfo()&lt;/a&gt; &amp;amp; &lt;a href=&quot;http://php.net/phpcredits&quot;&gt;phpcredits()&lt;/a&gt;, for the people maintaining our websites, with the commit message &quot;Throw some credit around&quot; (yes, the typo and incorrect colspan in the commit was caught and fixed).&lt;br /&gt;
&lt;br /&gt;
Fast forward 15months, to last Friday. Another &lt;a href=&quot;http://news.php.net/php.cvs/64154&quot;&gt;commit from me&lt;/a&gt; to PHP trunk with the commit message &quot;Throw some credit around&quot;, and then to&amp;nbsp;&lt;a href=&quot;http://news.php.net/php.cvs/64155&quot;&gt;PHP 5.3 a minute later&lt;/a&gt; with the same commit message.&lt;br /&gt;
Less then 10minutes after the commit I had received 2 emails asking me &quot;WTF?&quot; - and a poke on IRC.&lt;br /&gt;
I had no idea what those guys were talking about. None what soever. I had not committed anything to any PHP project for several days. Nothing. Not even a typo fix.&lt;br /&gt;
&lt;br /&gt;
Turns out that someone in Asia had somehow managed to get his/hers hands on my PHP.net account credentials.&lt;br /&gt;
Interestingly enough the commit doesn&#39;t introduce any security holes, bugs, or anything at all really. It just adds &quot;Wolegequ Gelivable&quot; to the credit list (whatever that means).&lt;br /&gt;
&lt;br /&gt;
Its not a great feeling to have your account hacked into, but I do wonder what the intentions were.. Maybe just an credentials check, which was supposed to be followed by evil commits if noone had spotted the first one? The&amp;nbsp;Chinese&amp;nbsp;government&amp;nbsp;trying to introduce security holes so they can break into PHP websites? &lt;br /&gt;
&lt;br /&gt;
In any case. It took less then 10minutes for 3 people to catch it, that is pretty cool.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-Hannes&lt;br /&gt;
&lt;br /&gt;
p.s. Last year, one of my new year&#39;s resolutions was to &quot;blog once a month&quot;. My last blogpost was in January.&lt;br /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;</description><link>http://bjori.blogspot.com/2010/12/php-project-and-code-review.html</link><author>noreply@blogger.com (bjori)</author><thr:total>5</thr:total><georss:featurename>Halden, Norway</georss:featurename><georss:point>59.1328252 11.3874772</georss:point><georss:box>59.1218162 11.3582947 59.1438342 11.416659699999999</georss:box></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6188174695458425487.post-3131055622725635217</guid><pubDate>Tue, 05 Jan 2010 08:45:00 +0000</pubDate><atom:updated>2010-01-05T00:49:07.651-08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">documentation</category><category domain="http://www.blogger.com/atom/ns#">php</category><category domain="http://www.blogger.com/atom/ns#">unix manual pages</category><category domain="http://www.blogger.com/atom/ns#">vim</category><title>Unix manual pages for PHP functions</title><description>Did you know that unix manual pages for PHP functions and methods existed?&lt;br /&gt;
&lt;br /&gt;
For a while I had vim configured to run reflection when I hit &quot;&lt;a href=&quot;http://vimdoc.sourceforge.net/htmldoc/various.html#K&quot;&gt;K&lt;/a&gt;&quot;, but after the PHP documentation team released unix manual pages for PHP I now get the manual page in all its glory; function description, parameter descriptions, return values, examples, notes, see also and everything you are used to see from the online manual.&lt;br /&gt;
Its awesome.&lt;br /&gt;
&lt;br /&gt;
As many PHP functions use &quot;standard names&quot; the documentation team decided to not install the manual in the standard man directory.&lt;br /&gt;
When you install the unix manual package you get a little shell script (called &quot;pman&quot;) which runs the normal &quot;man&quot; command for you, and sets the manual directory to wherever you installed the package.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
To install the PHP manual as unix manual pages:&lt;br /&gt;
&lt;code&gt;&lt;br /&gt;
$ pear install doc.php.net/pman&lt;br /&gt;
&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
If you are running very old pear version you need to &quot;discover&quot; the doc.php.net channel first:&lt;br /&gt;
&lt;code&gt;&lt;br /&gt;
$ pear channel-discover doc.php.net&lt;br /&gt;
&lt;/code&gt;&lt;br /&gt;
And then run the command above.&lt;br /&gt;
&lt;br /&gt;
The manual will install into whichever directory you have specified as the &quot;doc_dir&quot; in the pear configuration, and the &quot;pman&quot; script into &quot;bin_dir&quot;.&lt;br /&gt;
By default I believe pear sets the &quot;bin_dir&quot; to something that is already in your $PATH so you should be able to execute &quot;pman strpos&quot; now.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In VIM you need to update the &quot;&lt;a href=&quot;http://vimdoc.sourceforge.net/htmldoc/options.html#&#39;keywordprg&#39;&quot;&gt;keywordprg&lt;/a&gt;&quot; config (or add it, if it doesn&#39;t exists already) to &quot;pman&quot;:&lt;br /&gt;
&lt;code&gt;&lt;br /&gt;
set keywordprg=pman&lt;br /&gt;
&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
Now open up a .php file, place your cursor over some PHP function and hit &quot;&lt;a href=&quot;http://vimdoc.sourceforge.net/htmldoc/various.html#K&quot;&gt;K&lt;/a&gt;&quot;, you should get the manual page for that function \o/.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Unfortunately &lt;a href=&quot;http://www.symfony-project.org/&quot;&gt;Symfony&lt;/a&gt;, &lt;a href=&quot;http://framework.zend.com/&quot;&gt;Zend Framework&lt;/a&gt;, &lt;a href=&quot;http://www.doctrine-project.org/&quot;&gt;Doctrine&lt;/a&gt;, and other frameworks/libraries/.. do not distribute unix manual pages yet so I use the &lt;a href=&quot;http://vim-taglist.sourceforge.net/&quot;&gt;Taglist plugin&lt;/a&gt; to jump to the code.&lt;br /&gt;
&lt;br /&gt;
Looking forward to when these frameworks start producing unix manual pages, so much easier to read :D&lt;br /&gt;
&lt;br /&gt;
-Hannes</description><link>http://bjori.blogspot.com/2010/01/unix-manual-pages-for-php-functions.html</link><author>noreply@blogger.com (bjori)</author><thr:total>29</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6188174695458425487.post-7134651312110565385</guid><pubDate>Mon, 10 Aug 2009 18:15:00 +0000</pubDate><atom:updated>2009-08-10T12:13:35.638-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">php</category><category domain="http://www.blogger.com/atom/ns#">phpreleases</category><category domain="http://www.blogger.com/atom/ns#">stats</category><category domain="http://www.blogger.com/atom/ns#">useless</category><title>Most PHP releases in August!</title><description>&lt;p&gt;Since &lt;a href=&quot;http://www.php.net/releases/#v3&quot;&gt;PHP 3.0.18 (released October 2000)&lt;/a&gt; (no, &lt;a href=&quot;http://php.net/&quot;&gt;php.net&lt;/a&gt; doesn&#39;t keep &lt;a href=&quot;http://php.net/releases&quot;&gt;release records&lt;/a&gt; before that for some reason) 60 PHP releases have been made. August and May are the most common months for PHP releases, with 9 releases each.&lt;/p&gt;PHP5.3.1 and PHP5.2.11 are in the works these days.. Judging by the August release &lt;i&gt;&quot;frenzy&quot;&lt;/i&gt; I bet both will be out by the end of the month!&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Other useless stats?&lt;/p&gt;&lt;ul&gt;&lt;li&gt;26 PHP releases have been on Thursdays&lt;/li&gt;&lt;li&gt;1 On Saturday&lt;/li&gt;&lt;li&gt;There have only been 2 releases in 2009 so far&lt;/li&gt;&lt;li&gt;2004 had 10 releases&lt;/li&gt;&lt;li&gt;January, April and October have only had 3 releases (each)&lt;/li&gt;&lt;li&gt;There has never been a release on Sunday&lt;/li&gt;&lt;li&gt;The  89th, 121st, 122nd, 194th, 228th, 241st and the 349th day of the year have had 2 releases each&lt;/li&gt;&lt;li&gt;The 3rd day of the month is most likely to be a release day, with total of 6 releases&lt;/li&gt;&lt;li&gt;The 9th, 16th, 18th and 21st (of any month) have never been release days...&lt;/li&gt;&lt;li&gt;The 18th week of the year is most likely to have an release, whole 8 releases have been made in that week!&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;Want more?&lt;code&gt;&lt;br /&gt;php -r &#39;&lt;br /&gt;&lt;code&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;&lt;span style=&quot;color: rgb(0, 119, 0);&quot;&gt;function &lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 187);&quot;&gt;fetch&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 119, 0);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 187);&quot;&gt;$arg&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 119, 0);&quot;&gt;) {&lt;br /&gt;  static &lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 187);&quot;&gt;$mirror &lt;/span&gt;&lt;span style=&quot;color: rgb(0, 119, 0);&quot;&gt;= &lt;/span&gt;&lt;span style=&quot;color: rgb(221, 0, 0);&quot;&gt;&quot;http://no2.php.net/releases/index.php&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 119, 0);&quot;&gt;;&lt;br /&gt;  return &lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 187);&quot;&gt;unserialize&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 119, 0);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 187);&quot;&gt;file_get_contents&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 119, 0);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: rgb(221, 0, 0);&quot;&gt;&quot;$mirror?$arg&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 119, 0);&quot;&gt;));&lt;br /&gt;}&lt;br /&gt;foreach(&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 187);&quot;&gt;fetch&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 119, 0);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: rgb(221, 0, 0);&quot;&gt;&quot;serialize=1&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 119, 0);&quot;&gt;) as &lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 187);&quot;&gt;$major &lt;/span&gt;&lt;span style=&quot;color: rgb(0, 119, 0);&quot;&gt;=&gt; &lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 187);&quot;&gt;$unused&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 119, 0);&quot;&gt;) {&lt;br /&gt;  foreach(&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 187);&quot;&gt;fetch&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 119, 0);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: rgb(221, 0, 0);&quot;&gt;&quot;serialize=1&amp;amp;max=-1&amp;amp;version=$major&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 119, 0);&quot;&gt;) as &lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 187);&quot;&gt;$version &lt;/span&gt;&lt;span style=&quot;color: rgb(0, 119, 0);&quot;&gt;=&gt; &lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 187);&quot;&gt;$data&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 119, 0);&quot;&gt;) {&lt;br /&gt;      echo &lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 187);&quot;&gt;$version&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 119, 0);&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: rgb(221, 0, 0);&quot;&gt;&quot; - &quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 119, 0);&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 187);&quot;&gt;$data&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 119, 0);&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: rgb(221, 0, 0);&quot;&gt;&quot;date&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 119, 0);&quot;&gt;], &lt;/span&gt;&lt;span style=&quot;color: rgb(221, 0, 0);&quot;&gt;&quot;\n&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 119, 0);&quot;&gt;;&lt;br /&gt;             &lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 187);&quot;&gt;$foo&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 119, 0);&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 187);&quot;&gt;date&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 119, 0);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: rgb(221, 0, 0);&quot;&gt;&quot;l&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 119, 0);&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 187);&quot;&gt;strtotime&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 119, 0);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 187);&quot;&gt;$data&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 119, 0);&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: rgb(221, 0, 0);&quot;&gt;&quot;date&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 119, 0);&quot;&gt;]))]++;&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 187);&quot;&gt;arsort&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 119, 0);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 187);&quot;&gt;$foo&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 119, 0);&quot;&gt;); &lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 187);&quot;&gt;print_r&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 119, 0);&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 187);&quot;&gt;$foo&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 119, 0);&quot;&gt;);&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&#39;&lt;br /&gt;&lt;/code&gt;</description><link>http://bjori.blogspot.com/2009/08/most-php-releases-in-august.html</link><author>noreply@blogger.com (bjori)</author><thr:total>5</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6188174695458425487.post-4850526162102434140</guid><pubDate>Fri, 01 Aug 2008 23:17:00 +0000</pubDate><atom:updated>2008-08-01T16:54:45.227-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">error</category><category domain="http://www.blogger.com/atom/ns#">google</category><category domain="http://www.blogger.com/atom/ns#">google reader</category><title>Google breaking up with me?</title><description>Dear Google.&lt;br /&gt;&lt;br /&gt;There is a reason why my browser does not send out request for Norwegian content. That reason is the same reason why I change all my language profiles to English. Even though I live in Norway please respect my wishes and stop serving me Norwegian content.&lt;br /&gt;&lt;br /&gt;Earlier today I got this usually weird message from Google Reader saying &quot;There is an update available for Google Reader click _here_ to refresh&quot; (or something along those lines). I have no clue what that means, but I get that message regularly. I always click &quot;here&quot; and never notice any changes.&lt;br /&gt;I suspect this is Google Gears (yes, it will always be called &quot;Google Gears&quot;) that is updating the content, but what is the &quot;Go offline&quot; button then for? Clicking that button fetches my unread items and &quot;disconnects&quot; so I can read my feeds on the train.&lt;br /&gt;&lt;br /&gt;Related note: I am pretty sure Google Gears swallows some of my still-unread-items when going online again. Very annoying as I explicitly check the &quot;Keep unread&quot; box so I can read the posts later on in a more friendly environment.&lt;br /&gt;&lt;br /&gt;Back to the point. After clicking &quot;here&quot; earlier today Google Reader decided to change my profile settings to say &quot;Norwegian&quot; and displays everything in Norwegian, removing the offline feature and &quot;Friends shared items&quot;.&lt;br /&gt;&lt;br /&gt;After changing my profile settings again to English only the settings dialog is in English. The rest of Google Reader is still in Norwegian with missing features I use regularly.&lt;br /&gt;To make things worse, clicking &quot;Logg ut&quot; does not work. Simply throws &quot;Beklager, det oppstod en feil. Prøv igjen om noen sekunder.&quot; back at me. No matter how long I wait or how often I try.&lt;br /&gt;&lt;br /&gt;Going into my profile settings again, and change the language to Norwegian gives me back the offline feature and &quot;Friends shared items&quot; - and some random things in English. Apparently I can log off now, which is a appreciated.&lt;br /&gt;&lt;br /&gt;While writing this entry on blogger.com &quot;Autosave failed&quot; has been blinking for most of the time, and now a big fat red line showing &quot;ERROR&quot; below the &quot;Title&quot; textbox is showing.&lt;br /&gt;&lt;br /&gt;Dear Google, do you not like me anymore? I thought we were friends and shared something special. If you are breaking up with me I&#39;d like to hear it straight up. Not randomly throwing errors at me for several months. I do understand your feelings though. After growing up together for so long we have finally reached the the tipping point, and started to grow apart the past months. You not caring anymore about the products I used to love, and me moving on to greener pastures.&lt;br /&gt;&lt;br /&gt;We had a good run you and I. But I guess all good things come to an end at some point.&lt;br /&gt;&lt;br /&gt;Love,&lt;br /&gt; Hannes</description><link>http://bjori.blogspot.com/2008/08/google-breaking-up-with-me.html</link><author>noreply@blogger.com (bjori)</author><thr:total>1</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6188174695458425487.post-6483485714256931902</guid><pubDate>Sun, 14 Oct 2007 15:40:00 +0000</pubDate><atom:updated>2007-10-14T10:27:57.553-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">documentation</category><category domain="http://www.blogger.com/atom/ns#">php</category><title>8 reasons why you should *not* write for the php.net manual</title><description>&lt;p&gt;8 reasons why you should &lt;strong&gt;*not*&lt;/strong&gt; write for the &lt;a href=&quot;http://php.net/manual/&quot;&gt;php.net manual&lt;/a&gt;:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;You get more page hits by publishing your work on your blog&lt;/li&gt;&lt;li&gt;You get a free pass to conferences by converting your work into presentation&lt;/li&gt;&lt;li&gt;You get paid to submit your work to magazines &amp;amp; commercial websites&lt;/li&gt;&lt;li&gt;You get a &quot;trading card&quot; and considered a star&lt;/li&gt;&lt;li&gt;The community will know your name&lt;/li&gt;&lt;li&gt;You can flame the documentations without needing to do anything about it&lt;br /&gt;&lt;/li&gt;&lt;li&gt;You can copy&amp;amp;paste parts from the manual and sell it (see point#3)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;You can license your work to forbid any commercial use or further improvements&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;p&gt;:)&lt;/p&gt;</description><link>http://bjori.blogspot.com/2007/10/8-reasons-why-you-should-not-write-for.html</link><author>noreply@blogger.com (bjori)</author><thr:total>8</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6188174695458425487.post-4073279885910162082</guid><pubDate>Tue, 02 Oct 2007 09:46:00 +0000</pubDate><atom:updated>2007-10-02T05:50:28.345-07:00</atom:updated><title>PhD: The [PH]P based [D]ocbook renderer RC1 released</title><description>&lt;div style=&quot;font-size: 12px;&quot;&gt;&lt;br /&gt;&lt;p&gt;Quick note; We released PhD0.1RC1 today \o/&lt;/p&gt;&lt;p&gt;Building the php.net documentations has never been as easy or as fast.&lt;/p&gt;&lt;p style=&quot;font-size: 10px;&quot;&gt;Note: You&#39;ll need 200M free diskspace (90M for the phpdoc XML sources and 110M for the generated html/php files).&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Fetching the phpdoc sources:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;bjori@lindsay:~$ cvs -d:pserver:cvsread@cvs.php.net/repository co phpdoc&lt;br /&gt;cvs checkout: Updating phpdoc&lt;br /&gt;U phpdoc/.cvsignore&lt;br /&gt;U phpdoc/LICENSE&lt;br /&gt;U phpdoc/Makefile.in&lt;br /&gt;[snip]&lt;br /&gt;&lt;/code&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Configure and test the XML&lt;br /&gt;&lt;code&gt;&lt;br /&gt;bjori@lindsay:~$ cd phpdoc/&lt;br /&gt;bjori@lindsay:~/phpdoc$ php configure.php&lt;br /&gt;configure.php: $Id: configure.php,v 1.7 2007/10/02 12:03:16 bjori Exp $&lt;br /&gt;PHP version: 5.3.0-dev&lt;br /&gt;[snip]&lt;br /&gt;* No missing ids found&lt;br /&gt;All good.&lt;br /&gt;All you have to do now is run &#39;phd /home/bjori/phpdoc&#39;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Installing and rendering the php.net documentation&lt;br /&gt;&lt;code&gt;&lt;br /&gt;bjori@lindsay:~/phpdoc$ cd ..&lt;br /&gt;bjori@lindsay:~$ pear install http://doc.php.net/phd/PhD-0.1RC1.tgz&lt;br /&gt;downloading PhD-0.1RC1.tgz ...&lt;br /&gt;Starting to download PhD-0.1RC1.tgz (19,683 bytes)&lt;br /&gt;.......done: 19,683 bytes&lt;br /&gt;install ok: channel://__uri/PhD-0.1RC1&lt;br /&gt;bjori@lindsay:~$ mkdir build&lt;br /&gt;bjori@lindsay:~$ cd build/&lt;br /&gt;bjori@lindsay:~/build$ time phd /home/bjori/phpdoc&lt;br /&gt;Creating php/toc/manual.inc...&lt;br /&gt;Creating php/toc/introduction.inc...&lt;br /&gt;Creating php/toc/getting-started.inc...&lt;br /&gt;[snip]&lt;br /&gt;Creating php/toc/userlandnaming.inc...&lt;br /&gt;Creating php/toc/about.inc...&lt;br /&gt;Creating php/toc/opl.license.inc...&lt;br /&gt;&lt;br /&gt;real    1m40.448s&lt;br /&gt;user    1m20.309s&lt;br /&gt;sys     0m6.420s&lt;br /&gt;bjori@lindsay:~/build$ ls -l&lt;br /&gt;total 26M&lt;br /&gt;-rw-r--r-- 1 bjori users  26M 10-02 12:28 bightml.html&lt;br /&gt;drwxr-xr-x 2 bjori users 364K 10-02 12:28 html/&lt;br /&gt;drwxr-xr-x 3 bjori users 336K 10-02 12:28 php/&lt;br /&gt;bjori@lindsay:~/build$ ls php | wc -l&lt;br /&gt;6288&lt;br /&gt;&lt;/code&gt;&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;p&gt;Thats right. It takes &lt;b&gt;less&lt;/b&gt; than 2 minutes (on my two years old Precision M70 laptop) to render the entire php.net documentations in three formats.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;To celebrate the release we have registered a new &quot;special&quot; mirror, &lt;a href=&quot;http://docs.php.net/manual&quot;&gt;docs.php.net&lt;/a&gt;,&lt;br /&gt;which is running these experimental builds of PhD, and would like to request&lt;br /&gt;that people take a quick look at it before we start pushing these builds out&lt;br /&gt;to the rest of the mirrors.&lt;br /&gt;&lt;br /&gt;There is currently no known bug in these builds so if you find one then&lt;br /&gt;please file a &lt;a href=&quot;http://bugs.php.net&quot;&gt;bug report&lt;/a&gt; or at least let us know about it.&lt;br /&gt;I don&#39;t care how small or major the bug is, a missing whitespace or a&lt;br /&gt;whole page missing, let us know if you find anything.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;-Hannes&lt;/p&gt;&lt;br /&gt;&lt;/div&gt;</description><link>http://bjori.blogspot.com/2007/10/phd-php-based-docbook-renderer-rc1.html</link><author>noreply@blogger.com (bjori)</author><thr:total>12</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6188174695458425487.post-3623933323191842107</guid><pubDate>Sun, 18 Feb 2007 18:52:00 +0000</pubDate><atom:updated>2007-02-19T10:24:00.089-08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">conferences</category><category domain="http://www.blogger.com/atom/ns#">php</category><category domain="http://www.blogger.com/atom/ns#">release feed</category><category domain="http://www.blogger.com/atom/ns#">releases</category><title>&quot;Latest releases&quot; box and &quot;conference teaser&quot;</title><description>&lt;div style=&quot;text-align: justify; font-family: verdana; font-size: 90%;&quot;&gt;&lt;strong&gt;Update&lt;/strong&gt; (February 19th): Thanks to &lt;a href=&quot;http://osiris.sund.ac.uk/~ca3sfo/&quot;&gt;Steph&lt;/a&gt; this should look fine in our favorite browser, IE6, now.&lt;/div&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify; font-family: verdana; font-size: 85%;&quot;&gt;I &lt;a href=&quot;http://news.php.net/php.mirrors/34351&quot;&gt;committed&lt;/a&gt; the &lt;a href=&quot;http://news.php.net/php.mirrors/34286&quot;&gt;conference teaser&lt;/a&gt; patch few hours ago, and as usual it only took about an hour for it to go &lt;a href=&quot;http://php.net/&quot;&gt;live&lt;/a&gt;. I really think its a nice compromise, looks nice there above the news entrys and isn&#39;t that intrusive.&lt;br /&gt;&lt;br /&gt;Anyway. I also &lt;a href=&quot;http://news.php.net/php.mirrors/34354&quot;&gt;committed&lt;/a&gt; &quot;latest releases&quot; box on the right, above the &quot;event section&quot;.&lt;br /&gt;&lt;a href=&quot;http://news.php.net/php.internals/28026&quot;&gt;The idea&lt;/a&gt; is to list the latest, stable, releases there - and when we are in RC phase then list them in a &lt;a href=&quot;http://home.oslo.nith.no/%7Emaghan/releases-colored2.png&quot;&gt;box below it&lt;/a&gt;. The links will be to &lt;a href=&quot;http://qa.php.net/&quot;&gt;qa.php.net&lt;/a&gt; where a &quot;big fat warning box&quot; will welcome the user and &lt;a href=&quot;http://news.php.net/php.internals/28058&quot;&gt;explain what a &quot;release candidate&quot;&lt;/a&gt; really is.&lt;br /&gt;Release Candidates will now get more exposure and, hopefully, get more testing - benefiting all of us.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Speaking of &#39;latest releases&#39;, I&#39;ve seen lot of code parsing &lt;a href=&quot;http://php.net/&quot;&gt;the frontpage&lt;/a&gt;, &lt;a href=&quot;http://php.net/downloads.php&quot;&gt;the download page&lt;/a&gt;, &lt;a href=&quot;http://news.php.net/php.announce&quot;&gt;the php-announce&lt;/a&gt; mailing list, heck, even cvs log in order to get the latest release info.&lt;br /&gt;Since I moved the &#39;current releases&#39; info into &quot;a giant&quot; includable array, living in &lt;a href=&quot;http://cvs.php.net/viewvc.cgi/phpweb/include/version.inc&quot;&gt;include/version.inc&lt;/a&gt;, we can now provide a simple XML feed (or whatever) for you to parse to get the latest release info simpler and more accurately...&lt;br /&gt;&lt;br /&gt;What do you think? Is it worth it? What kind of format would you want it in?...&lt;br /&gt;Send me a mail (private or to the &lt;a href=&quot;http://php.net/contact.php&quot;&gt;webmaster@ mailing list&lt;/a&gt;), add a comment, blog about it, scream loudly (hoping we hear you) or whatever. If the idea interest you, its your chance to get heard!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;</description><link>http://bjori.blogspot.com/2007/02/latest-releases-box-and-conference.html</link><author>noreply@blogger.com (bjori)</author><thr:total>7</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6188174695458425487.post-8782379045201534454</guid><pubDate>Mon, 12 Feb 2007 16:55:00 +0000</pubDate><atom:updated>2007-02-12T08:17:44.691-08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">conferences</category><category domain="http://www.blogger.com/atom/ns#">php</category><title>PHP.net frontpage changes</title><description>&lt;p&gt;&lt;span style=&quot;;font-family:verdana;font-size:85%;&quot;  &gt;As many of you know I changed the &lt;a href=&quot;http://php.net/&quot;&gt;frontpage of php.net&lt;/a&gt; recently by &lt;a href=&quot;http://news.php.net/php.mirrors/34119&quot;&gt;moving conference announcements and call for papers&lt;/a&gt; to its &lt;a href=&quot;http://php.net/conferences/&quot;&gt;own dedicated page&lt;/a&gt; in a desperate attempt to regain the control of our frontpage.&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;span style=&quot;;font-family:verdana;font-size:85%;&quot;  &gt;&lt;q&gt;WTF?!&lt;/q&gt; came up among &lt;a href=&quot;http://news.php.net/php.mirrors/34149&quot;&gt;conference planners&lt;/a&gt; which didn&#39;t like the changes &lt;strong&gt;at all&lt;/strong&gt;. Heck, why should they? They lost an important, free, ads on a &lt;strong&gt;very&lt;/strong&gt; popular page on the web. The flip side: they have now &lt;a href=&quot;http://php.net/conferences/&quot;&gt;their own page&lt;/a&gt; free of any &lt;a href=&quot;http://php.net/#4&quot;&gt;distractions&lt;/a&gt; and &lt;a href=&quot;http://php.net/#2&quot;&gt;irritations&lt;/a&gt; around their advertisements.&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;span style=&quot;;font-family:verdana;font-size:85%;&quot;  &gt;&lt;q&gt;Regain control?&lt;/q&gt; Yes. Conference planers have treated &lt;a href=&quot;http://php.net/&quot;&gt;php.net frontpage&lt;/a&gt; as their private commercial ground for long enough. It was time for the &lt;a href=&quot;http://php.net/credits.php&quot;&gt;php.net &quot;staff&quot;&lt;/a&gt; to take control of the frontpage back and publish php.net &lt;a href=&quot;http://php.net/#2&quot;&gt;relevant&lt;/a&gt; &lt;a href=&quot;http://php.net/#4&quot;&gt;news&lt;/a&gt;.&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;span style=&quot;;font-family:verdana;font-size:85%;&quot;  &gt;&lt;q&gt;This is a community effort, you are no king.&lt;/q&gt; Good point. I am no king. But enough is enough. Flooding the frontpage with conference announcements and call for papers had to stop. It was so overwhelming that there was no point for us to post real news about what was going on with php.net. 24 hours after an &lt;a href=&quot;http://news.php.net/php.mirrors/33208&quot;&gt;important PHP release&lt;/a&gt; a &lt;a href=&quot;http://news.php.net/php.mirrors/33221&quot;&gt;call for papers was committed above it&lt;/a&gt;, making the release &quot;old news&quot;. Within a week of &lt;a href=&quot;http://news.php.net/php.mirrors/34067&quot;&gt;phpdoc major update&lt;/a&gt; there was a &lt;a href=&quot;http://news.php.net/php.mirrors/34113&quot;&gt;new conference announcement&lt;/a&gt; posted. This is ridiculous. I kicked around on IRC the idea of dedicated conference page and immediately got praised for it. Everyone (online and awake) agreed. Few hours later in a frustration caused by all those announcements I &lt;a href=&quot;http://news.php.net/php.mirrors/34118&quot;&gt;cleaned the frontpage up&lt;/a&gt;, moving old stuff into the &lt;a href=&quot;http://php.net/archive/&quot;&gt;archives&lt;/a&gt; and then &lt;a href=&quot;http://news.php.net/php.mirrors/34119&quot;&gt;added&lt;/a&gt; the &lt;a href=&quot;http://php.net/conferences&quot;&gt;conference page&lt;/a&gt;. Few days later I then added a &lt;a href=&quot;http://php.net/conferences/news.rss&quot;&gt;dedicated feed&lt;/a&gt; for the announcements.&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;span style=&quot;;font-family:verdana;font-size:85%;&quot;  &gt;Now that things are starting to cool off I &lt;a href=&quot;http://news.php.net/php.mirrors/34255&quot;&gt;posted a patch&lt;/a&gt; for &lt;a href=&quot;http://home.oslo.nith.no/%7Emaghan/confs.rss2.png&quot;&gt;a conference teaser&lt;/a&gt; on the frontpage. I&#39;ve learned my lesson. There is no way in hell I will commit without a notice.&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;span style=&quot;;font-family:verdana;font-size:85%;&quot;  &gt;Just to be clear. I &lt;strong&gt;do&lt;/strong&gt; think PHP conferences are important, but they are &lt;strong&gt;not&lt;/strong&gt; as important as what the php.net team is doing. They are however important enough to be on php.net, just not cluttering and making fun of php.net efforts.&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;span style=&quot;;font-family:verdana;font-size:85%;&quot;  &gt;Seeing post like the one from &lt;a href=&quot;http://devzone.zend.com/member/profile/id/86&quot;&gt;Cal Evans&lt;/a&gt;, &lt;q&gt;&lt;a href=&quot;http://devzone.zend.com/node/view/id/1670&quot;&gt;Extra! Extra! Get Your Conference News Here!&lt;/a&gt;&lt;/q&gt;, is kinda funny. I had a hard time finding those feeds, in fact I can only see them in that blog entry.. and his &lt;q&gt;&lt;a href=&quot;http://news.php.net/php.mirrors/34149&quot;&gt;php.net has had a change of policy&lt;/a&gt;&lt;/q&gt; link points to a post by conference planer.. Heh? Even funnier is the the fact I can&#39;t see any indication on importance of conferences on &lt;a href=&quot;http://devzone.zend.com/&quot;&gt;Zends Developer Zone&lt;/a&gt; at all. &lt;strong&gt;*sigh*&lt;/strong&gt; That&#39;s the spirit Cal! Kick my nuts and send out fancy statements without anything to back it up.&lt;br /&gt;&lt;br /&gt;Cal: I&#39;ll avenge my nuts in &lt;a href=&quot;http://phpconference.co.uk/&quot;&gt;London&lt;/a&gt;... ;)&lt;/span&gt;&lt;/p&gt;</description><link>http://bjori.blogspot.com/2007/02/phpnet-frontpage-changes_9034.html</link><author>noreply@blogger.com (bjori)</author><thr:total>4</thr:total></item></channel></rss>