<?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:georss='http://www.georss.org/georss' version='2.0'><channel><atom:id>tag:blogger.com,1999:blog-2486628695333694074</atom:id><lastBuildDate>Wed, 18 Mar 2009 00:49:03 +0000</lastBuildDate><title>staying neutral</title><description></description><link>http://blog.somabo.de/blogger.html</link><managingEditor>noreply@blogger.com (helly)</managingEditor><generator>Blogger</generator><openSearch:totalResults>16</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-2486628695333694074.post-747334854806114290</guid><pubDate>Wed, 11 Mar 2009 01:03:00 +0000</pubDate><atom:updated>2009-03-11T02:17:29.472+01:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>PHP</category><title>PHP, Help from Companies &amp; Licenses</title><description>Having been at a &lt;a href="http://conf.phpquebec.com/"&gt;Conference&lt;/a&gt; a few days ago, I was reminded of something. I have several times been asked how companies can help &lt;a href="http://php.net/"&gt;PHP&lt;/a&gt;. And my typical answer is about &lt;a href="http://qa.php.net/howtohelp.php"&gt;contributing tests&lt;/a&gt; and making sure PHP runs under or with their products, be that operating systems, databases or other back ends; or tools in any way. However I just updated the PHP Version info in a few hundred source files from 'PHP Version 5' to 'PHP Versoin 6'. And I also found that the &lt;a href="http://cvs.php.net/viewvc.cgi/php-src/LICENSE?view=markup"&gt;License file&lt;/a&gt; lacked an update to 2009. And at this point you might already guess what the addition to my typical answer is. Why can &lt;a href="http://zend.com/"&gt;Zend&lt;/a&gt; not simply change the license of the Zend Engine to PHP License?&lt;br /&gt;&lt;br /&gt;Why do we want this?&lt;br /&gt;&lt;br /&gt;Becasue it creates issues with using PHP. And we do not even inform people about it, because we are &lt;a href="http://php.net/license/"&gt;silent&lt;/a&gt; about this fact.&lt;br /&gt;&lt;br /&gt;So is there a reason why this has not happened already long ago?&lt;br /&gt;&lt;br /&gt;Some people claim it is because of ownership. So one question actually is who owns the code. And being a friend of numbers and cryptic shell code, here is some data:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:Courier;"&gt;&lt;pre&gt;$&amp;gt; cvs annotate Zend 2&amp;gt;/dev/null |&lt;/span&gt;&lt;span style="font-family:Courier;"&gt;&lt;br /&gt;   grep -v '(changelo ' |&lt;/span&gt; &lt;span style="font-family:Courier;"&gt;   awk '/[0-9.]*.*\(/ {&lt;/span&gt;&lt;span style="font-family:Courier;"&gt;&lt;br /&gt;     L++&lt;/span&gt;&lt;span style="font-family:Courier;"&gt;&lt;br /&gt;     C[substr($2,2)]++&lt;/span&gt;&lt;span style="font-family:Courier;"&gt;&lt;br /&gt;   }&lt;br /&gt;   END {&lt;br /&gt;     for(n in C) {&lt;br /&gt;       printf "%5d %4.1f%% %s\n", C[n], C[n] * 100 / L, n&lt;br /&gt;     }&lt;br /&gt;   }' |&lt;/span&gt;&lt;span style="font-family:Courier;"&gt;&lt;br /&gt;   sort -r&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:Courier;"&gt;36863 25.6% dmitry&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier;"&gt;29428 20.4% andi&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier;"&gt;15323 10.6% tony2001&lt;br /&gt;&lt;/span&gt; &lt;span style="font-family:Courier;"&gt;9541  6.6% stas&lt;/span&gt;&lt;br /&gt; &lt;span style="font-family:Courier;"&gt;6894  4.8% andrei&lt;br /&gt;&lt;/span&gt; &lt;span style="font-family:Courier;"&gt;6665  4.6% zeev&lt;br /&gt;&lt;/span&gt; &lt;span style="font-family:Courier;"&gt;6504  4.5% felipe&lt;br /&gt;&lt;/span&gt; &lt;span style="font-family:Courier;"&gt;5711  4.0% helly&lt;br /&gt;&lt;/span&gt; &lt;span style="font-family:Courier;"&gt;5381  3.7% scottmac&lt;br /&gt;&lt;/span&gt; &lt;span style="font-family:Courier;"&gt;5341  3.7% sebastia&lt;br /&gt;&lt;/span&gt; &lt;span style="font-family:Courier;"&gt;2760  1.9% iliaa&lt;br /&gt;&lt;/span&gt; &lt;span style="font-family:Courier;"&gt;2607  1.8% nlopess&lt;br /&gt;&lt;/span&gt; &lt;span style="font-family:Courier;"&gt;1731  1.2% derick&lt;br /&gt;&lt;/span&gt; &lt;span style="font-family:Courier;"&gt;1550  1.1% sniper&lt;br /&gt;&lt;/span&gt; &lt;span style="font-family:Courier;"&gt;1108  0.8% kraghuba&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;I skipped changelog and everyone who contributed less than 1000 lines got stripped manually (which makes it 15 lines).&lt;br /&gt;&lt;br /&gt;Does that mean Zend owns the engine? In terms of the License they do. In terms of contribution I do not. Simply because other people like me contributed does not mean we share ownership. Not even if there wasn't a single line written by Zend employees left. So is the other way round true, and Zend owns the engine because employees have written the engine? Also not, because we do not know whether they did it in their spare time or were paid for it. So why does Zend own the engine? Simply put, the License file says so.&lt;br /&gt;&lt;br /&gt;And there is another area that uses an arbitrary License. The &lt;a href="http://cvs.php.net/viewvc.cgi/TSRM/"&gt;TSRM library&lt;/a&gt;. Here is the data (again top 15 lines only):&lt;span style="font-family:Courier;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;957 21.5% andi&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier;"&gt;804 18.0% zeev&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:Courier;"&gt;785 17.6% dmitry&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:Courier;"&gt;402  9.0% dbeu&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:Courier;"&gt;384  8.6% sascha&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:Courier;"&gt;242  5.4% sebastia&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:Courier;"&gt;167  3.7% rvenkat&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier;"&gt;136  3.1% tony2001&lt;br /&gt;&lt;/span&gt; &lt;span style="font-family:Courier;"&gt;99  2.2% wez&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:Courier;"&gt; 65  1.5% dreid&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:Courier;"&gt; 63  1.4% iliaa&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:Courier;"&gt; 53  1.2% stig&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier;"&gt; 53  1.2% helly&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier;"&gt; 50  1.1% sniper&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:Courier;"&gt; 28  0.6% sesser&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The fun is that hardly anyone but Windows users need this library. Yet it interferes with using PHP in the same way the Zend License does. Simply because it is an arbitrary License.&lt;br /&gt;&lt;div class="flockcredit" style="text-align: right; color: rgb(204, 204, 204); font-size: x-small;"&gt;Blogged with the &lt;a href="http://www.flock.com/blogged-with-flock" style="color: rgb(153, 153, 153); font-weight: bold;" target="_new" title="Flock Browser"&gt;Flock Browser&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='http://res1.blogblog.com/tracker/2486628695333694074-747334854806114290?l=blog.somabo.de%2Fblogger.html'/&gt;&lt;/div&gt;</description><link>http://blog.somabo.de/2009/03/php-help-from-companies-licenses.html</link><author>noreply@blogger.com (helly)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>2</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-2486628695333694074.post-8965169093237695338</guid><pubDate>Sun, 08 Mar 2009 04:42:00 +0000</pubDate><atom:updated>2009-03-09T23:34:07.412+01:00</atom:updated><title>New York, Part II</title><description>I was really happy after arriving at the apartment building, that for the coming week I got a very nice apartment in the Chelsea area. There is a Whole Food market just at the opposite corner. And also a lot of restaurants and bars. So, being hungry but not too much after the Sugar Shack, or should I say Sock, I set out for something smaller. Usually one would find that hopeless, since in USA people seem to always confuse Quality and Quantity. But heck I found a place called &lt;a href="http://brgr.us/"&gt;brgr&lt;/a&gt; on 7th Avenue between 26th and 27th street. I somehow got the feeling that they wrote the name that way, to hint that they actually would not hold size over everything else. Inside I found myself corrected, not only did they obviously care not so much for size, but they really seemed to care about quality. Heck they even get their pattys made from grass fed cows. Yeah, we live in such a perverted world that most beef you eat comes from cows that eat other animals and a bunch of chemicals for drinks. Originally I planned to have a &lt;a href="http://www.jambajuice.com/"&gt;Jamba Juice&lt;/a&gt;, which I happily also found next to the apartment building, but then brgr offered a Blueberry - &lt;a href="http://en.wikipedia.org/wiki/Pomegranade"&gt;Pomegranate &lt;/a&gt;Milkshake. Hmmmm, delicous.&lt;br /&gt;  &lt;div class="flockcredit" style="text-align: right; color: #CCC; font-size: x-small;"&gt;Blogged with the &lt;a href="http://www.flock.com/blogged-with-flock" style="color: #999; font-weight: bold;" target="_new" title="Flock Browser"&gt;Flock Browser&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='http://res1.blogblog.com/tracker/2486628695333694074-8965169093237695338?l=blog.somabo.de%2Fblogger.html'/&gt;&lt;/div&gt;</description><link>http://blog.somabo.de/2009/03/new-york-part-ii.html</link><author>noreply@blogger.com (helly)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-2486628695333694074.post-1461978096300811011</guid><pubDate>Sun, 08 Mar 2009 04:26:00 +0000</pubDate><atom:updated>2009-03-10T02:27:45.427+01:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>PHP</category><title>PHP Quebec 2009</title><description>Unfortunately this year I could not go snowboarding before &lt;a href="http://conf.phpquebec.com/"&gt;PHP Quebec 2009 Conference&lt;/a&gt; because of my work schedule. So I flew from NYC to Montreal only on Tuesday afternoon. The conference yet again changed the Hotel and was this year held in the &lt;a href="http://www1.hilton.com/en_US/hi/hotel/YULBHHF-Hilton-Montreal-Bonaventure-Quebec/index.do"&gt;Hilton Montreal Bonaventure&lt;/a&gt;. Personally I liked the &lt;a href="http://www.sofitel.com/gb/hotel-3646-sofitel-montreal-golden-mile/index.shtml"&gt;Sofitel&lt;/a&gt; better as a hotel, but for the conference the new hotel is definitively a better choice. We had more rooms, generally more space and - a working WIFI. Probably the first conference with a working WIFI. Thanks Anna, Sylvain and Yann. The conference itself was good as always and we had a lot of fun during the evenings - of course. I gave two planned talks and I had to jump in for my dear friend &lt;a title="Sara" href="http://blog.libssh2.org/" id="zjs:"&gt;Sara&lt;/a&gt;, who could not come herself because she &lt;a title="got sick" href="http://blog.libssh2.org/index.php?/archives/129-Oh,-Im-sorry,-I-didnt-see-you-there....html" id="izxk"&gt;got sick&lt;/a&gt; right before the conference. Luckily my friend &lt;a title="Johannes" href="http://schlueters.de/blog/" id="msk6"&gt;Johannes&lt;/a&gt; agreed to join me for the jump in on the extension writing talk. And we really both enjoyed the Worst PHP Practice talk, for which actually my wife Caitlin had the idea - thanks for that (and many other things). The &lt;a href="http://talks.somabo.de/"&gt;talks are online&lt;/a&gt;:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://talks.somabo.de/200903_montreal_oop.pdf"&gt;Objects for the Masses&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://talks.somabo.de/200903_montreal_php_extension_writing.pdf"&gt;PHP Extension Writing&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://talks.somabo.de/200903_montreal_worst_practice.pdf"&gt;&lt;span class="title"&gt;Worst PHP Practice&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span dir="ltr" id=":1kp"&gt;Other talks were luckily not too much about PHP 5.3. Instead it turns out that people are interested in the current stable platform PHP 5.2 and are willing to get us core developers more time to get the new features, most notably &lt;/span&gt;&lt;span dir="ltr" id=":1kp"&gt;&lt;a title="closures" href="http://wiki.php.net/rfc/closures" id="svzq"&gt;closures&lt;/a&gt; ,&lt;/span&gt;&lt;span dir="ltr" id=":1kp"&gt; &lt;a title="namespaces" href="http://php.net/manual/language.namespaces.php" id="n1n8"&gt;namespaces&lt;/a&gt; and&lt;/span&gt;&lt;span dir="ltr" id=":1kp"&gt; &lt;a title="Phar" href="http://talks.somabo.de/20080917.pdf" id="ffk7"&gt;Phar&lt;/a&gt; &lt;/span&gt;&lt;span dir="ltr" id=":1kp"&gt;done right (to name a few I contributed to). If you are still interested in more about PHP 5.3, check out &lt;/span&gt;&lt;span dir="ltr" id=":1kp"&gt; &lt;a title="Johannes' talk" href="http://conf.phpquebec.com/slides/2009/php5.3-phpquebec_2009.pdf" id="qm2i"&gt;Johannes' talk&lt;/a&gt; &lt;/span&gt;&lt;span dir="ltr" id=":1kp"&gt;. Something else of interest; I was happy to hear and see that other presenters used Google &lt;a title="Chart API" href="http://chart.apis.google.com/" id="uj0t"&gt;Chart API&lt;/a&gt; in &lt;a title="their talks" href="http://conf.phpquebec.com/slides/2009/Top%2010%20Ways%20to%20Maximize-ROI-from-PHP-Projects-phpquebec_2009.pdf" id="i-p6"&gt;their talks&lt;/a&gt;  for examples.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;At the last night of the conference we went to &lt;a href="http://www.lespierrots.com/"&gt;Le Deux Pierrots&lt;/a&gt;. And of course we finished the conference week with a visit to &lt;a href="http://www.bonjourquebec.com/qc-en/attractions-directory/sugar-shack/sucrerie-de-la-montagne_1185876.html"&gt;Sucrerie de la Montagne&lt;/a&gt;. And believe it or not, we poured sugar syrup onto soup and coffee as well as over mashed potatoes, meet - and - sugar pie. Finally in the afternoon I had to leave to the airport - learning from last years stress with getting the plane, this year I booked a later flight.&lt;br /&gt; &lt;div class="flockcredit" style="text-align: right; color: rgb(204, 204, 204); font-size: x-small;"&gt;Blogged with the &lt;a href="http://www.flock.com/blogged-with-flock" style="color: rgb(153, 153, 153); font-weight: bold;" target="_new" title="Flock Browser"&gt;Flock Browser&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='http://res1.blogblog.com/tracker/2486628695333694074-1461978096300811011?l=blog.somabo.de%2Fblogger.html'/&gt;&lt;/div&gt;</description><link>http://blog.somabo.de/2009/03/php-quebec-2009.html</link><author>noreply@blogger.com (helly)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-2486628695333694074.post-1499212805672928876</guid><pubDate>Sun, 08 Mar 2009 03:38:00 +0000</pubDate><atom:updated>2009-03-08T04:38:39.240+01:00</atom:updated><title>New York, Part I</title><description>I spent last week in New York City but was not so happy because of the apartment I got. It used direct steam heat with an outlet for every radiator. And of course my room also had an opening to the outside for the cooling device. So I got a combination of very dry hot air and very dry cold air into my micro room - so large, it barely had space for the bed. So I ended up with three days of nose bleeding. But I had to work far far too much anyway, so I did not see much of the apartment anyway. The neighborhood was o.k. Actually quite close to central park. But as it was cold I didn't make use of that. There was also a good breakfast place, with really nice bread. Anyway, hopefully next weeks stay will be better.&lt;br /&gt;  &lt;div class="flockcredit" style="text-align: right; color: #CCC; font-size: x-small;"&gt;Blogged with the &lt;a href="http://www.flock.com/blogged-with-flock" style="color: #999; font-weight: bold;" target="_new" title="Flock Browser"&gt;Flock Browser&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='http://res1.blogblog.com/tracker/2486628695333694074-1499212805672928876?l=blog.somabo.de%2Fblogger.html'/&gt;&lt;/div&gt;</description><link>http://blog.somabo.de/2009/03/new-york-part-i.html</link><author>noreply@blogger.com (helly)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-2486628695333694074.post-5348914175288475594</guid><pubDate>Sun, 04 Jan 2009 13:27:00 +0000</pubDate><atom:updated>2009-01-04T14:33:35.517+01:00</atom:updated><title>Seven Things About Me - Tagged by Andi</title><description>So my friend &lt;a href="http://andigutmans.blogspot.com/2009/01/seven-things-about-me-tagged-by-marco.html"&gt;Andi&lt;/a&gt; tagged me and here are my seven confessions.&lt;br /&gt;&lt;br /&gt;1) I really love coffee. I always have, and luckily I work for a company that has extremely decent coffee and coffee equipment - at least in the office I was hired into. So I don't possess a real coffee machine other than the &lt;a href="http://www.senseo.com/en"&gt;Senseo&lt;/a&gt;, one I got from my parents so that they can get coffee on a visit.&lt;br /&gt;&lt;br /&gt;2) Just like Andi, I also have an issue with shaving. And just like him, neither Army nor Wife turned me into a responsible daily shaver. We'll see if our son Felix Alexander, whom we expect in May, will convince me to change my unruly ways.&lt;br /&gt;&lt;br /&gt;3) Speaking of the Army. I was a tank commander and got to be the first Lieutenant to be named in a brigade meeting to conclude a several day training, for having parked my tank in the mud. That alone was not so much of an accomplishment, but having performed my duties while taking about a day to get the tank out under supervision of every high-ranked officer in the area was.&lt;br /&gt;&lt;br /&gt;4) I have always done lots of sports of all kinds. I even became a licensed trainer during my university time and gave fitness and aqua fitness classes. For some time I did up to 20 hours of sports per week including Aerobics and Step Aerobics, and I even performed in a few shows. I ran a marathon but nowadays limit myself to snowboarding and inline skating. Probably because I spend too much time on &lt;a href="http://www.ohloh.net/accounts/helly"&gt;Open Source&lt;/a&gt;. And working for a company where internally everything is like Open Source does not help either.&lt;br /&gt;&lt;br /&gt;5) My university, having several professors directly connected to &lt;a href="http://en.wikipedia.org/wiki/CERN"&gt;CERN&lt;/a&gt;, was one of the first to participate in the Internet. So I became interested and trained my colleagues to some success. So much success, in fact, that I had to write a web server myself so that the company could ship the now HTML documentation to their clients, which did not have the slightest clue what this was all about nor had heard of a webserver at all.&lt;br /&gt;&lt;br /&gt;6) I once got a call from my very good friend, Rainer, while sitting at breakfast with all my friends, saying, "hey pour me a coffee, I'll grab you in a minute." After the coffee, we drove to a company run by friends and I was asked to say &lt;span style="font-style: italic;"&gt;yes&lt;/span&gt; to everything. Apparently a major German television channel had problems with one of their internet apps. So we spent Saturday morning to Monday morning trying to fix it. Well, I said "it's not fixable but can be redesigned" and so I did. After 2 days without sleep, I took a nap before teaching an aqua fitness class that evening. Coming back into the office afterwards, I ran into a meeting and hearing 'Money doesn't matter', I sat down, listened and became a freelancer that week. &lt;br /&gt;&lt;br /&gt;7) I lost weeks and weeks of my university time playing Ultimate Underworld IV. Having killed the dude that can repair the sword that is the only weapon to kill the last opponent, I couldn't even finish it. That's why I do not play video games.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;And here are the rules I'm supposed to pass on to the following bloggers:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Link your original tagger(s), and list these rules on your blog.&lt;/li&gt;&lt;li&gt;Share seven facts about yourself in the post - some random, some weird.&lt;/li&gt;&lt;li&gt;Tag seven people at the end of your post by leaving their names and the links to their blogs.&lt;/li&gt;&lt;li&gt;Let them know they've been tagged by leaving a comment on their blogs and/or Twitter.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;And as for chaining, in no particularly significant order:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://pooteeweet.org/"&gt;Lukas Kahwe Smith&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://schlueters.de/blog/"&gt;Johannes Schlüter&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.wormus.com/aaron/"&gt;Aaron Wormus&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.colder.ch/"&gt;Etienne Kneuss&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.ylarrivee.com/"&gt;Yann Larrivée&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.cdatazone.org/"&gt;Rob Richards&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://kathyahn.com/"&gt;Kathy Ahn&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='http://res1.blogblog.com/tracker/2486628695333694074-5348914175288475594?l=blog.somabo.de%2Fblogger.html'/&gt;&lt;/div&gt;</description><link>http://blog.somabo.de/2009/01/seven-things-about-me-tagged-by-andi.html</link><author>noreply@blogger.com (helly)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>3</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-2486628695333694074.post-3479071041039920164</guid><pubDate>Sun, 18 May 2008 16:27:00 +0000</pubDate><atom:updated>2008-05-20T10:04:42.163+02:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>Photography</category><title>The D3 arrived. Part III: Software, DXO sucks</title><description>Before I bought my &lt;a href="http://nikonusa.com/Find-Your-Nikon/ProductDetail.page?pid=25235"&gt;Nikon D200&lt;/a&gt; I was using &lt;a href="http://store.acdsee.com/store/acd/en_US/DisplayProductDetailsPage/productID.78701700"&gt;ACDSee&lt;/a&gt; and &lt;a href="http://www.corel.com/servlet/Satellite/us/en/Product/1184951547051"&gt;Paint Shop Pro&lt;/a&gt; for corrections from pictures taken with my point-and-shoot pocket cameras. However I used both pretty rarely only. So when I bought the D200 I asked several of my friends what software to use to do RAW to JPEG conversion. Many of them suggested I have a look at DXO. And in fact DXO is awesome in theory and also—if you can get it to work and happen to own the correct lenses—in practice. Unfortunately it is kind of impossible to use the software. Its user interface is the worst piece of crap I have ever seen until then. I hoped the update to the newest version would make it any better. But guess what, it became even more unstable and useless. Well the results, if you get any, are still awesome, yet kind of impossible to get. Especially with the &lt;a href="http://nikonusa.com/Find-Your-Nikon/ProductDetail.page?pid=25434"&gt;Nikon D3&lt;/a&gt;. It detects the camera and lens and still refuses to do anything with the images. And before you wonder, there is no way whatsoever to make DXO work on Windows 64. They think that they produced such a holy grail of software that copy protection goes over everything. And people like them wonder why their software gets cracked... Enough anyway, DXO is gone.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/helly25/2482501691/" title="MBO_0206_LTR.jpg by mboerger, on Flickr"&gt;&lt;img src="http://farm3.static.flickr.com/2210/2482501691_31138f0ff1_m.jpg" alt="MBO_0206_LTR.jpg" border="0" height="160" width="240" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;So I decided on trying the demo software that Nikon ships with the D3. Demo? Yes, that's right. You just got a damn expensive camera and Nikon didn't even bother to give you a piece of software that allows you to make use of the camera's RAW format. But, well, that is no loss because Nikon managed to produce a piece of crap that is impossible to use. Right, Nikon Capture NX comes with a user interface that is indeed worse than DXO—and I thought that would be impossible.&lt;br /&gt;&lt;br /&gt;So I tried ACDSee pro and after the update that makes it able to handle newer RAW formats, the batch processor works fast and produces nice color and exposure corrections. Unfortunately, you won't get the nice lens/camera combination fix-up that DXO would provide. All in all, ACDSee is a very nice and fast organizing and viewing software that also allows a wide variety of corrections. And the user interface is pretty nice as well. Well done. Even after about ten years of using ACDSee I still use it. And today I actually use it more than ever before. One thing I use this for is red-eye corrections. The others are the mentioned batch converter and I also like the crop feature. Last but not least, I have always used it for image rotation, a thing ACDSee used to be famous for.&lt;br /&gt;&lt;br /&gt;Next step, there must be something that allows for more corrections. So I tried Adobe &lt;a href="http://www.adobe.com/products/photoshoplightroom/?promoid=BONSV"&gt;Lightroom&lt;/a&gt; 2.0 &lt;a href="http://labs.adobe.com/technologies/lightroom/"&gt;beta&lt;/a&gt;. And again a nice very easy to use user interface. It also supports importing much more to my likings. So when you connect the camera you get an import dialog that allows to import by date shot. Something I really like: organizing by set. And if there are more sets on a day, then you simply select by picture and import into different folders. The next thing is the browser which is as fast as the one from ACDSee just not so powerful. I chose the importer of Lightroom, which automatically applies some EXIF tagging, to mark all my picture as my pictures—yes, the D3 does not allow this. All I am missing here is lens detection from EXIF information and turning that into tags. For that, I have some perl/php scripts but am usually to lazy to use them. After importing the images you can apply corrections. You can copy corrections applied to one picture to other ones and it actually works. When done with corrections, the images can be converted in a batch processor while the application still works! And if you put more pictures up for conversion, Lightroom simply adds these pictures to the stack of the batch processor. And by the way, Lightroom has a nice black&amp;amp;white conversion.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/helly25/2465162452/" title="MBO_0066.jpg by mboerger, on Flickr"&gt;&lt;img src="http://farm3.static.flickr.com/2335/2465162452_fede2ac321_m.jpg" alt="MBO_0066.jpg" border="0" height="160" width="240" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The third software I use is Paint Shop Pro. Several years ago I started using this software to do pixel corrections or to generate small images for web sites. In the meantime the software specializes more and more as a photography solution. It too has a usable browser and a bunch of filters. I used it, for instance, to cut pictures free—as in, make the background transparent.&lt;br /&gt;&lt;br /&gt;My current work flow is as follows. I import images from the camera using Lightroom. I do so by set into a directory. The directory name is the date in YYYYMMDD format followed by a set description. I then use Lightroom to do color and exposure corrections as well as cropping. Alternatively I use ACDSEE to do full automatic conversion to JPEG. Sometimes I do so to speed the process up. In general, I prefer to apply as few corrections as possible. That is, I try to do nice shots in RAW with automatic WB. I select pictures for upload in several ways. First, I sometimes delete already in the camera, then I delete already before conversion to JPEG. Both ACDSee and Lightroom are fast enough to allow for browsing and deletion using only RAW. When ending up with lots of pictures in a set with several being more or less the same, I use the rating support of either software for selection. Once conversion to JPEG is done, I select once more. This time, however, I only delete the JPEGs, keeping the RAW images. The last step is uploading. For this I use &lt;a href="http://www.flock.com/"&gt;Flock's&lt;/a&gt; built-in uploader to flickr.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/helly25/2478282558/" title="MBO_0159_ACD.JPG by mboerger, on Flickr"&gt;&lt;img src="http://farm3.static.flickr.com/2233/2478282558_bb72af2af2_m.jpg" alt="MBO_0159_ACD.JPG" border="0" height="240" width="160" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The reason for using flickr is simple. It was working for me prior to anything else by the time my D200 made me constantly run out of space on my own server. Today I would definitively use &lt;a href="http://www.panoramio.com/"&gt;Panoramio&lt;/a&gt; instead. And the reason for that is simple too. It has a very nice integration with &lt;a href="http://maps.google.com/"&gt;maps.google.com&lt;/a&gt; (check out the new '&lt;a href="http://maps.google.com/support/bin/answer.py?answer=68476#more"&gt;More...&lt;/a&gt;' button) and they are way better than Yahoo maps.&lt;br /&gt;&lt;br /&gt;Conclusion. ACDSee, Lightroom and PaintShopPro all have a usable user interface, especially the former two. Once Lightroom 2 gets released I will buy it, probably bundled with PhotoShop. I haven't used that in a long time. But the combination sounds like a very good idea. And hopefully it is better than having to switch to something completely different like PaintShopPro. I tried a bunch of uploader tools, but the only one that works for me is Flock.&lt;br /&gt;&lt;br /&gt;Final note. DXO in theory is an awesome tool. But it is in fact completely useless crap, it does not work, the support is unbelievable ridiculous incompetent and updates and upgrades seem to make it worse.&lt;div class="flockcredit" style="text-align: right; color: rgb(204, 204, 204); font-size: x-small;"&gt;Blogged with the &lt;a href="http://www.flock.com/blogged-with-flock" style="color: rgb(153, 153, 153); font-weight: bold;" target="_new" title="Flock Browser"&gt;Flock Browser&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='http://res1.blogblog.com/tracker/2486628695333694074-3479071041039920164?l=blog.somabo.de%2Fblogger.html'/&gt;&lt;/div&gt;</description><link>http://blog.somabo.de/2008/05/d3-arrived-part-iii-software-dxo-sucks.html</link><author>noreply@blogger.com (helly)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-2486628695333694074.post-85685604134924333</guid><pubDate>Mon, 12 May 2008 10:40:00 +0000</pubDate><atom:updated>2008-05-12T12:40:22.172+02:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>Photography</category><title>The D3 arrived. Part II: Pros and cons</title><description>Unpacking the box—and being happy! The &lt;a href="http://nikonusa.com/Find-Your-Nikon/Product/Digital-SLR/25434/D3.html"&gt;&lt;span style="font-weight: bold;"&gt;Nikon D3&lt;/span&gt;&lt;/a&gt; is just an unbelieveable camera—or toy for that matter. Anyway it just feels right. A bit heavy maybe but, well.&lt;br /&gt;&lt;br /&gt;Most things feel just as they should be and there is hardly anything wrong with the camera. So I spend a few days shooting, collecting all the things I do not like. Here goes:&lt;br /&gt;&lt;br /&gt;1) First of all, Nikon obviously tried to give the &lt;a href="http://nikonusa.com/Find-Your-Nikon/Product/Digital-SLR/25434/D3.html"&gt;D3&lt;/a&gt; a superior strap compared to the &lt;a href="http://nikonusa.com/Find-Your-Nikon/Product/Digital-SLR/25235/D200.html"&gt;D200&lt;/a&gt; or the &lt;a href="http://nikonusa.com/Find-Your-Nikon/Product/Digital-SLR/25432/D300.html"&gt;D300&lt;/a&gt;. To me it is just too broad; the old one was much better. So the first thing after buying the &lt;a href="http://blog.somabo.de/2008/05/d3-arrived-part-i-now-i-need-new-lens.html"&gt;Nikkor 24-120/VR&lt;/a&gt; was a new strap!&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/helly25/2477427819/"&gt;&lt;img src="http://farm4.static.flickr.com/3256/2477427819_014c08ecab_m.jpg" alt="Grandhotel Giessbach and Giessbach waterfall shot with Nikkor 24-120/VR" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;2) I even read the book (aka manual)—but Nikon indeed removed my favorite pre-shutter mirror-flipping mode. Of course, the D3 has a mode where you can flip the mirror with first pushing on the shutter release button and then taking the shot with a second push. But what about the nice mode where you just press once and the camera waits a split of a second? It is an awesome feature, it usually gave me one additional stop.&lt;br /&gt;&lt;br /&gt;3) Nikon still refuses to care for its customers. I mean you can now add some crappy signing to the pictures. But hey, I still cannot claim the camera to be mine. That's unbelievable. The &lt;a href="http://exif.org/"&gt;EXIF&lt;/a&gt; standard has both author and copyright tag (though sadly combined in one tag). And of course the camera does not ask me to point it to my PGP or whatever key. Without that what is the signing good for? I guess it makes people that have no clue feel better. For all the rest, this is useless becasue you can always get rid of this signing, post-process the picture and re-create it. And of course this includes changing the author and copyright info some software adds for you. &lt;a href="http://www.photokina-cologne.com/"&gt;Photokina&lt;/a&gt; is ahead, if I have time for it I will once again ask about this insanity.&lt;br /&gt;&lt;br /&gt;4) There is no ISO setting below 100, not even with stupid filtering in the camera. Not that I personally will ever miss it though.&lt;br /&gt;&lt;br /&gt;5) The HDMI output is pretty poor. On preview it uses the thumbnails, in other words it has very low resolution and the output simply looks crappy. Hey, I have a 46" screen and I would expect that people buying a D3 and use the HDMI would use nothing smaller. Now it gets a bit better when changing to a slide show.  However there is no 1080p mode and the 720p mode looks in my opinion a tad bit better than the 1080i mode. Either way, not worth buying an HDMI cable. This said, it does not really matter that the camera allows neither 1920x1080 nor 3840x2160 resolution.&lt;br /&gt;&lt;br /&gt;6) When doing a firmware update, you have to upload the firmware files separately to exactly one CF card. When using both CFs, the camera simply refuses to accept any firmware file and when finding both it always selects the same one. At least the order in which you do the update does not matter. Well so far it does not.&lt;br /&gt;&lt;br /&gt;7) Once again the focus points are all around the center of the sensor. They only spread so much that you get about one focus point per golden cut. Meaning one probably uses about 9 focus points. As a tip for Nikon, if the corner focus points are used extremely often, then that is probably based on the fact that people are missing points closer to the edges.&lt;br /&gt;&lt;br /&gt;8) The function button still cannot do everything. And of course it cannot do pre-shutter mirror-flipping. Simply becasue the mode is gone (see 2).&lt;br /&gt;&lt;br /&gt;9) The camera does not allow to add a 'normal playback' mode as Caitlin called it. Meaning you cannot set the camera to show some information while having at least one screen without any data (over-exposure areas, focus points, etc.).&lt;br /&gt;&lt;br /&gt;10) The view finder is really awesome. But the rubber, the eyepiece you put, well, to your eye, is simply bad. So the next things I ordered was a &lt;a href="http://nikonusa.com/Find-Your-Nikon/Photography-Accessories/Eyepieces/4793/DK-17M-Magnifying-Eyepiece.html"&gt;DK-17M&lt;/a&gt; and a &lt;a href="http://nikonusa.com/Find-Your-Nikon/Photography-Accessories/Eyepieces/4787/DK-19-Rubber-Eyecup.html"&gt;DK-19&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Now all of the above are really minor complaints. And there is a hell lot of good things to mention. Just to mention a few highlights:&lt;br /&gt;&lt;br /&gt;1) The result at ISO 1600 is simply great! Yes, this is why I bought the camera. And it makes me really happy. And just as many other people said before, simply keep the D3 at ISO 1600 at all time, unless you have to use lower ISO because of aperture constrains.&lt;br /&gt;&lt;br /&gt;2) The &lt;a href="http://nikonusa.com/Find-Your-Nikon/Product/Camera-Lenses/1902/AF-NIKKOR-50mm-f/1.4D.html"&gt;Nikkor 50/1.4D&lt;/a&gt; is finally usable.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/helly25/2464284683/"&gt;&lt;img src="http://farm4.static.flickr.com/3257/2464284683_497aa42e68_m.jpg" alt="Pasta shot taken with Nikon 50/1.4" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;But it still is a lens that I have to replace. Now, Sigma just announced the new &lt;a href="http://sigmaphoto.com/lenses/lenses_all_details.asp?id=3354&amp;amp;navigator=17"&gt;50mm F1.4 EX DG HSM&lt;/a&gt; which could be an alternative as well as the &lt;a href="http://www.zeiss.com/C12567A8003B58B9/ContentsWWWIntern/588D7115824E6AA9C125711B005DDD76#4"&gt;Zeiss Planar T* 1.4/50&lt;/a&gt;. But maybe the answer is the &lt;a href="http://nikonusa.com/Find-Your-Nikon/Product/Camera-Lenses/1933/AF-NIKKOR-85mm-f/1.4D-IF.html"&gt;Nikkor 85/1.4D&lt;/a&gt; or the &lt;a href="http://www.zeiss.com/C12567A8003B58B9/ContentsWWWIntern/6FEA3760FF055EB0C125711B005F3349#5"&gt;Zeiss Planar T* 1.4/85&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;3) The view finder is just amazing. Bright and large! And even I can do manual focusing now! This makes operating my Lensbaby much easier.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/helly25/2483327380/"&gt;&lt;img src="http://farm3.static.flickr.com/2272/2483327380_703525db06_m.jpg" alt="Optimis Maximus keyboard shot with Lensbaby 3G" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;4) The display is insanely bright. So bright that I usually turn it down to -3 or -2 setting, where the range is -3 to +3.&lt;br /&gt;&lt;br /&gt;5) The camera shows all necessary information on its displays. That includes showing the ISO setting on the additional display below the main display, making it, even for me, hard to forget fixing the ISO. The two additional LCDs also show which CF slot holds a CF card and which of the two are in use.&lt;br /&gt;&lt;br /&gt;6) The camera shows the lightmeter vertically right to the picture in the viewer. This is much better than in the D200 where it is below the picture. It also allows the camera to display more information which I really appreciate.&lt;br /&gt;&lt;br /&gt;7) The portrait shutter release can be locked. So it does not matter where you place the right hand for landscape shots.&lt;br /&gt;&lt;br /&gt;8) The D200 had a 'last used' settings tab. Now the D3 has a favorites tab which is fully customizable. I use both and like the new version much better as my favorite entries don't get shifted around just because I used them.&lt;br /&gt;&lt;br /&gt;9) The D3 usually does not need a flash. And thus it has none integrated. The &lt;a href="http://nikonusa.com/Find-Your-Nikon/Product/Flashes/4801/SB-800-AF-Speedlight-.html"&gt;SB-800&lt;/a&gt; can be mounted and works just great. The only sad thing is that the D3 also has no integrated flash remote control either. This speaks for a &lt;a href="http://nikonusa.com/Find-Your-Nikon/Product/Flashes/4794/SU-800-Wireless-Speedlight-Commander.html"&gt;SU-800 Wireless Speedlight Commander&lt;/a&gt; which is part of the &lt;a href="http://nikonusa.com/Find-Your-Nikon/Product/Flashes/4804/R1-Wireless-Close-Up-Speedlight-System.html"&gt;R1 Wireless Close-Up Seedlight System&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;10) The &lt;a href="http://nikonusa.com/Find-Your-Nikon/Product/Camera-Lenses/2160/AF-S-VR-Micro-NIKKOR-105mm-f/2.8G-IF-ED.html"&gt;Nikkor 105/2.8/VR&lt;/a&gt; suddenly got a much nicer range and even serves as a very good portrait lens now.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://flickr.com/photos/helly25/2482356751/in/set-72157604998975285/"&gt;&lt;img src="http://farm4.static.flickr.com/3100/2482356751_0f3d024940_m.jpg" alt="Marcus with black hat shot with Nikkor 105/2.8/VR" border="0" /&gt;&lt;/a&gt;&amp;nbsp;&lt;a href="http://flickr.com/photos/helly25/2483176278/in/set-72157604998975285/"&gt;&lt;img src="http://farm3.static.flickr.com/2177/2483176278_35d58628f1_m.jpg" alt="Marcus with red hat shot with Nikkor 105/2.8/VR" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The pro list could be extended a lot. But actually there was not so much to improve when coming from a D200.&lt;div class="flockcredit" style="text-align: right; color: #CCC; font-size: x-small;"&gt;Blogged with the &lt;a href="http://www.flock.com/blogged-with-flock" style="color: #999; font-weight: bold;" target="_new" title="Flock Browser"&gt;Flock Browser&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='http://res1.blogblog.com/tracker/2486628695333694074-85685604134924333?l=blog.somabo.de%2Fblogger.html'/&gt;&lt;/div&gt;</description><link>http://blog.somabo.de/2008/05/d3-arrived-part-ii-pros-and-cons.html</link><author>noreply@blogger.com (helly)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-2486628695333694074.post-4600528286752931593</guid><pubDate>Sun, 11 May 2008 20:42:00 +0000</pubDate><atom:updated>2008-05-11T23:23:48.194+02:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>Photography</category><title>The D3 arrived. Part I: Now I need a new lens</title><description>The camera change from &lt;b&gt;&lt;a href="http://nikonusa.com/Find-Your-Nikon/Product/Digital-SLR/25235/D200.html"&gt;Nikon D200&lt;/a&gt;&lt;/b&gt; to &lt;b&gt;&lt;a href="http://nikonusa.com/Find-Your-Nikon/Product/Digital-SLR/25434/D3.html"&gt;Nikon D3&lt;/a&gt;&lt;/b&gt; with its sensor size change from APS-C aka DX to full frame aka FX unfortunately made the purchase of a new all rounder lens imminent. And so I switched from '&lt;a href="http://nikonusa.com/Find-Your-Nikon/Product/Camera-Lenses/2159/AF-S-DX-VR-Zoom-NIKKOR-18-200mm-f/3.5-5.6G-IF-ED.html"&gt;AF-S DX VR Zoom-NIKKOR 18-200mm f/3.5-5.6G IF-ED&lt;/a&gt;' to '&lt;a href="http://nikonusa.com/Find-Your-Nikon/Product/Camera-Lenses/2145/AF-S-VR-Zoom-NIKKOR-24-120mm-f/3.5-5.6G-IF-ED.html"&gt;AF-S VR Zoom-NIKKOR 24-120mm f/3.5-5.6G IF-ED&lt;/a&gt;'.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://flickr.com/photos/helly25/2483771774/"&gt;&lt;img src="http://farm4.static.flickr.com/3190/2483771774_4c97a01d0b.jpg" style="" title="Nikon 18-200/VR and Nikon 24-120/VR" alt="Nikon 18-200/VR and Nikon 24-120/VR" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The &lt;a href="http://flickr.com/photos/helly25/2483771774/"&gt;picture&lt;/a&gt; was shot using the '&lt;a href="http://nikonusa.com/Find-Your-Nikon/Product/Camera-Lenses/2160/AF-S-VR-Micro-NIKKOR-105mm-f/2.8G-IF-ED.html"&gt;AF-S VR Micro-NIKKOR 105mm f/2.8G IF-ED&lt;/a&gt;' on the D3 and post-processed with Adobe Lightroom 2.0 beta and Corel Paint Shop Pro XI.&lt;br /&gt;&lt;br /&gt;Both lenses have a UV filter mounted. The 18-200/VR has a B&amp;amp;W filter while the 24-120/VR has a Hoya filter. Both lenses come with VR and share the same aperture range, that is f/3.5 to f/5.6. Also the wide range is very compareable as the 18mm on the DX camera turns into 27mm on 36mm film, while the 24mm are already correct in terms of 36mm film equivalent, when mounted on the D3.&lt;br /&gt;&lt;br /&gt;The unfortunate difference is the telephoto range. Here the 200mm DX format turns into 300mm on 36mm film. And that is way more than the 120mm of the FX lens.&lt;br /&gt;&lt;br /&gt;Interestingly, the switch does not come with a handling difference - at least not in lens handling. Both lenses nearly look identical and share a more or less identical housing. But as to be expected, the 18-200 goes out much more than the 24-120 does. Sharpness-wise it appears both lenses deliver the same quality. Meaning they do a great everyday job but do not take very sharp pictures. Since even the flowers of both lenses are nearly identical, I had to check the internet to figure out which one belongs on which lens. The HB-35 has broader fins and belongs on the 18-200. The 24-120 is a tad bit wider, so it takes the HB-25 with its smaller fins.&lt;br /&gt;&lt;br /&gt;I actually bought the camera and lens in Switzerland where prices are insanely high - though yet much lower than for instance in Germany. So I spent some time searching for shops with reasonable prices. I found &lt;a href="http://digitec.ch/"&gt;digitec&lt;/a&gt; in Zürich and ars-imago in Zug, which was not too far away and unlike &lt;a href="http://digitec.ch/"&gt;digitec,&lt;/a&gt; where I bought the camera, had the lens in stock.&lt;br /&gt;&lt;br /&gt;I had to go twice to digitec because the first time they figured they could not get enough money from my ATM cards. It turned out that my two German ones only allow higher charges in Germany - or they just don't care so that you pay with Credit Card. For that however they happily charge 2.75% extra. That is absolutely ridiculous and of course unacceptable. So I came back the next day after visiting my bank in the morning. And believe me, it really feels strange running around with 6k in cash.&lt;br /&gt;&lt;br /&gt;When I decided for the lens and found ars-imago I chose them for one reason. It was the cheapest place with the lens in stock that was reachable by car. There was one shop where I could have ordered the lens on-line. Including charges for shipping I would have paid the same, well there also is the credit card insanity. So I either would have had to wait longer or pay this unbelievable special Swiss insanity extra charge. So I happily drove to Zug after reading that there was the last lens of its kind waiting for me to be picked up. However when I arrived they told me with the typical Swiss smile, that my lens was sold half an hour ago. That means that those idiots sold my lens just after they sent me the confirmation that I can pick up the lens on the same day. They assured me the lens would come next business day which was two days later. So I lost one day for experimenting - dammit! The least thing one would expect now - of course - is that they would give a bit of a rebate for making me drive twice. But nothing - that's Switzerland. Lesson learned, never buy anything from ars-imago again.&lt;div class="flockcredit" style="text-align: right; color: rgb(204, 204, 204); font-size: x-small;"&gt;Blogged with the &lt;a href="http://www.flock.com/blogged-with-flock" style="color: rgb(153, 153, 153); font-weight: bold;" target="_new" title="Flock Browser"&gt;Flock Browser&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='http://res1.blogblog.com/tracker/2486628695333694074-4600528286752931593?l=blog.somabo.de%2Fblogger.html'/&gt;&lt;/div&gt;</description><link>http://blog.somabo.de/2008/05/d3-arrived-part-i-now-i-need-new-lens.html</link><author>noreply@blogger.com (helly)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-2486628695333694074.post-3058887276675717801</guid><pubDate>Sun, 06 Apr 2008 16:54:00 +0000</pubDate><atom:updated>2008-04-06T18:54:59.132+02:00</atom:updated><title>Optimus Maximus finally arrived</title><description>Sooooo, the &lt;a href="http://www.artlebedev.com/everything/optimus/" rel="nofollow"&gt;Optimus Maximus&lt;/a&gt; finally arrived and works.&lt;br /&gt;&lt;br /&gt;The keys are a bit large, so it probably takes a bit of time to get used to the new keyboard. But for all my online friends - at least the space key works. What I do not like so much so far, is that the keys actually make some noise while typing.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/helly25/2393150168/" title="DSC_2887_DXO_RAW.jpg by mboerger, on Flickr"&gt;&lt;img src="http://farm4.static.flickr.com/3216/2393150168_a11f809b48.jpg" alt="DSC_2887_DXO_RAW.jpg" height="334" width="500" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The Software however is in a very early stage and does not allow what I want. Well, it was the same with the Mini Three in the first months, so we'll see. What I am missing is the ability to put German Umlauts with some alt/Ctrl/Shift combination on the US keyboard layout.&lt;br /&gt;   &lt;div class="flockcredit" style="text-align: right; color: #CCC; font-size: x-small;"&gt;Blogged with the &lt;a href="http://www.flock.com/blogged-with-flock" style="color: #999; font-weight: bold;" target="_new" title="Flock Browser"&gt;Flock Browser&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='http://res1.blogblog.com/tracker/2486628695333694074-3058887276675717801?l=blog.somabo.de%2Fblogger.html'/&gt;&lt;/div&gt;</description><link>http://blog.somabo.de/2008/04/optimus-maximus-finally-arrived.html</link><author>noreply@blogger.com (helly)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-2486628695333694074.post-7348930786832980162</guid><pubDate>Wed, 19 Mar 2008 23:23:00 +0000</pubDate><atom:updated>2008-03-20T00:23:09.120+01:00</atom:updated><title>PHP once again to participate in GSoC</title><description>I am very happy that this year &lt;a href="http://php.net"&gt;PHP&lt;/a&gt; once again got selected as a mentoring project in the &lt;a href="http://code.google.com/soc/2008/"&gt;Google Summer of Code Program&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The PHP team already put up a list of &lt;a href="http://wiki.php.net/gsoc/2008"&gt;ideas&lt;/a&gt; that students could pick up. Of course students are also more than welcome to propose their own ideas. Either way student applications start on Monday, March 24th. More information on the GSoC program can be found &lt;a href="http://code.google.com/opensource/gsoc/2008/faqs.html"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I am looking forward to a fruitful summer 2008 for the PHP project.&lt;br /&gt;&lt;br /&gt;  &lt;div class="flockcredit" style="text-align: right; color: #CCC; font-size: x-small;"&gt;Blogged with the &lt;a href="http://www.flock.com/blogged-with-flock" style="color: #999; font-weight: bold;" target="_new" title="Flock Browser"&gt;Flock Browser&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='http://res1.blogblog.com/tracker/2486628695333694074-7348930786832980162?l=blog.somabo.de%2Fblogger.html'/&gt;&lt;/div&gt;</description><link>http://blog.somabo.de/2008/03/php-once-again-to-participate-in-gsoc.html</link><author>noreply@blogger.com (helly)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-2486628695333694074.post-1040854719571876794</guid><pubDate>Thu, 14 Feb 2008 23:29:00 +0000</pubDate><atom:updated>2008-02-15T00:33:44.428+01:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>PHP</category><category domain='http://www.blogger.com/atom/ns#'>RE2C</category><title>PHP on RE2C</title><description>Finally.&lt;br /&gt;&lt;br /&gt;After years on working on &lt;a href="http://re2c.org/"&gt;RE2C&lt;/a&gt; to make it stable and ready to replace flex-based scanners, work on replacing &lt;a href="http://php.net/"&gt;PHP&lt;/a&gt;'s flex-based scanner with a &lt;a href="http://re2c.org/"&gt;RE2C&lt;/a&gt;-based one has begun. Actually the work was started by &lt;a href="http://web.ist.utl.pt/nuno.lopes/"&gt;Nuno Lopes&lt;/a&gt; and &lt;a href="http://macvicar.net/"&gt;Scott MacVicar&lt;/a&gt; on 14th of February 2008, after I happily informed them that I considered &lt;a href="http://re2c.org/"&gt;RE2C&lt;/a&gt; ready for this task. I joined the work a day later, contributed a few ideas and helped with minor &lt;a href="http://re2c.org/"&gt;RE2C&lt;/a&gt; improvements. Today on the 15th of February we can already run &lt;span style="font-style: italic;"&gt;make test&lt;/span&gt; and get over 98% PASS.&lt;br /&gt;&lt;br /&gt;This encouraged me to spend a bit more time on &lt;a href="http://re2c.org/"&gt;RE2C&lt;/a&gt; and release 0.13.2, which you can download &lt;a href="https://sourceforge.net/project/showfiles.php?group_id=96864"&gt;here&lt;/a&gt; (sorry but it is on sourceforge).&lt;br /&gt;&lt;br /&gt;Thanks to &lt;a href="http://macvicar.net/"&gt;Scott&lt;/a&gt;, we also have a &lt;a href="http://subversion.tigris.org/"&gt;subversion&lt;/a&gt; and &lt;a href="http://trac.edgewall.org/"&gt;Trac&lt;/a&gt; setup &lt;a href="http://trac.macvicar.net/php-re2c/"&gt;here&lt;/a&gt;, where you can follow our development. If you want to experiment yourself, or even help in our efforts, then you can checkout from svn://whisky.macvicar.net/php-re2c.&lt;p style="text-align: right; font-size: 8px;"&gt;Blogged with &lt;a href="http://www.flock.com/blogged-with-flock" title="Flock" target="_new"&gt;Flock&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='http://res1.blogblog.com/tracker/2486628695333694074-1040854719571876794?l=blog.somabo.de%2Fblogger.html'/&gt;&lt;/div&gt;</description><link>http://blog.somabo.de/2008/02/php-on-re2c.html</link><author>noreply@blogger.com (helly)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>5</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-2486628695333694074.post-6300730574000494911</guid><pubDate>Wed, 13 Feb 2008 22:03:00 +0000</pubDate><atom:updated>2008-02-13T23:07:22.366+01:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>PHP</category><title>Whether to INI or not</title><description>So I've had enough of different PHP versions compiled in different modes (ZTS or DEGBUG) and having to change the php.ini file every now and then on my dev machines. So I added conditional INI support:&lt;br /&gt;&lt;br /&gt;&lt;div  style="margin-left: 40px;font-family:Lucida Grande;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;[IF &lt;span style="color: rgb(0, 153, 0);"&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;(&lt;/span&gt;ZEND_DEBUG_BUILD &lt;span style="color: rgb(255, 0, 0);"&gt;==&lt;/span&gt; true&lt;span style="color: rgb(255, 0, 0);"&gt;) &amp;amp;&amp;amp; (&lt;/span&gt;ZEND_THREAD_SAFE &lt;span style="color: rgb(255, 0, 0);"&gt;==&lt;/span&gt; true&lt;span style="color: rgb(255, 0, 0);"&gt;)&lt;/span&gt;&lt;/span&gt;]&lt;/span&gt;&lt;br /&gt;zend_extension_debug_ts=/usr/src/${PHP_BRANCH}/xdebug.so&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;[ELSEIF &lt;span style="color: rgb(0, 153, 0);"&gt;ZEND_DEBUG_BUILD &lt;span style="color: rgb(255, 0, 0);"&gt;==&lt;/span&gt; true&lt;/span&gt;]&lt;/span&gt;&lt;br /&gt;zend_extension_debug=/usr/src/${PHP_BRANCH}/xdebug.so&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;[ELSEIF &lt;span style="color: rgb(0, 153, 0);"&gt;ZEND_THREAD_SAFE &lt;span style="color: rgb(255, 0, 0);"&gt;==&lt;/span&gt; true&lt;/span&gt;]&lt;/span&gt;&lt;br /&gt;zend_extension_ts=/usr/src/${PHP_BRANCH}/xdebug.so&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;[ELSE]&lt;/span&gt;&lt;br /&gt;zend_extension=/usr/src/${PHP_BRANCH}/modules/xdebug.so&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;[ENDIF]&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;I used square brackets for the conditionals, as it seemed the way that comes with the least potential for INI handling. This is because right now we ignore section names anyway.&lt;br /&gt;&lt;br /&gt;The &lt;a href="http://www.php.net/%7Ehelly/ze2-ini-conditionals-20080213.diff.txt"&gt;patch can be downloaded here&lt;/a&gt; and allows for the following:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;String comparison using operators &lt;span style="color: rgb(255, 0, 0);"&gt;===&lt;/span&gt; and &lt;span style="color: rgb(255, 0, 0);"&gt;!==&lt;/span&gt;.&lt;/li&gt;&lt;li&gt;All other operators convert left and right operands to integers first, just as INI handling would do for value evaluation.&lt;/li&gt;&lt;li&gt;Support for operators &lt;span style="color: rgb(255, 0, 0);"&gt;&amp;lt;&lt;/span&gt;, &lt;span style="color: rgb(255, 0, 0);"&gt;&amp;lt;=&lt;/span&gt;, &lt;span style="color: rgb(255, 0, 0);"&gt;&amp;gt;&lt;/span&gt;, &lt;span style="color: rgb(255, 0, 0);"&gt;&amp;gt;=&lt;/span&gt;, &lt;span style="color: rgb(255, 0, 0);"&gt;==&lt;/span&gt;, &lt;span style="color: rgb(255, 0, 0);"&gt;!=&lt;/span&gt;, &lt;span style="color: rgb(255, 0, 0);"&gt;&amp;amp;&amp;amp;&lt;/span&gt; and &lt;span style="color: rgb(255, 0, 0);"&gt;||&lt;/span&gt;.&lt;/li&gt;&lt;li&gt;Braces can be used to force an evaluation order.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;No support for unary operator ! or ternary operator ?:.&lt;/li&gt;&lt;li&gt;No support for functions.&lt;/li&gt;&lt;li&gt;No direct boolean evaluation, that is operators are required.&lt;/li&gt;&lt;li&gt;Conditions can be nested.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;If you are interested in this stuff, you can either comment on this blog entry or follow the discussion on internals@php.net &lt;a href="http://marc.info/?l=php-internals&amp;amp;m=120256773015668&amp;amp;w=2"&gt;here&lt;/a&gt;.&lt;p style="text-align: right; font-size: 8px;"&gt;Blogged with &lt;a href="http://www.flock.com/blogged-with-flock" title="Flock" target="_new"&gt;Flock&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='http://res1.blogblog.com/tracker/2486628695333694074-6300730574000494911?l=blog.somabo.de%2Fblogger.html'/&gt;&lt;/div&gt;</description><link>http://blog.somabo.de/2008/02/whether-to-ini-or-not.html</link><author>noreply@blogger.com (helly)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-2486628695333694074.post-4646190371264075786</guid><pubDate>Fri, 01 Feb 2008 20:25:00 +0000</pubDate><atom:updated>2008-02-01T22:38:00.496+01:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>PHP</category><title>We want PDO! Don't we?</title><description>So after the &lt;a href="http://blog.somabo.de/2008/01/pdo-to-turn-php-into-closed-software.html"&gt;initial uproar&lt;/a&gt; on last week's attempts to put parts of &lt;a href="http://php.net/"&gt;PHP&lt;/a&gt; development under the terms of a CLA (&lt;a href="http://marc.info/?l=php-internals&amp;amp;m=120151551023913&amp;amp;w=2"&gt;read proposal here&lt;/a&gt;), a bunch of us actually spent some time in finding solutions for one way or the other. I don't want to bother you with more details on the why.&lt;br /&gt;&lt;br /&gt;But, one thing for certain, &lt;span style="font-weight: bold;"&gt;we want &lt;a href="http://pecl.php.net/package/PDO"&gt;PDO&lt;/a&gt;&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;As the reasoning, this was discussed enough, so I'll jump directly to my ideas for a solution.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Develop a PECL CLA that can optionally be used for &lt;a href="http://pecl.php.net/"&gt;PECL&lt;/a&gt; projects.&lt;/li&gt;&lt;li&gt;If necessary, adapt the &lt;a href="http://cvs.php.net/viewvc.cgi/php-src/LICENSE?view=co"&gt;PHP License&lt;/a&gt;, so that it works nicely together with the CLA.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;The projects that want a CLA can choose between the PHP License or LGPL.&lt;/li&gt;&lt;li&gt;Change the PECL web site so that projects can opt-in to using the CLA.&lt;/li&gt;&lt;li&gt;Arrange it so that projects cannot drop the CLA flag.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Add a user/CLA/project table to the PHP user database, and use this in CVS ACLs.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Create a new CVS module php-default.&lt;/li&gt;&lt;li&gt;Move all extensions that can be disabled and are not required for others to PECL.&lt;/li&gt;&lt;li&gt;Link everything under php-src plus a default selection of extensions to php-default.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Let us once and for all ban CLAs from php-src aka PHP core&lt;/span&gt;.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Start developing PDO as part of CVS module php-src.&lt;/li&gt;&lt;/ul&gt;Sorry for not writing this earlier. So how does this idea sound? Check out answers to the mail &lt;a href="http://marc.info/?l=php-internals&amp;amp;m=120189777221917"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The Borg Queen to Kathryn Janeway: '&lt;span style="font-style: italic;"&gt;Do as all pragmatists do, compromise&lt;/span&gt;'. And it is no secret that I am a pragmatist.&lt;br /&gt; &lt;p style="text-align: right; font-size: 8px;"&gt;Blogged with &lt;a href="http://www.flock.com/blogged-with-flock" title="Flock" target="_new"&gt;Flock&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='http://res1.blogblog.com/tracker/2486628695333694074-4646190371264075786?l=blog.somabo.de%2Fblogger.html'/&gt;&lt;/div&gt;</description><link>http://blog.somabo.de/2008/02/we-want-pdo-don-we.html</link><author>noreply@blogger.com (helly)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>1</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-2486628695333694074.post-7248572610506333500</guid><pubDate>Tue, 29 Jan 2008 22:01:00 +0000</pubDate><atom:updated>2008-01-29T23:01:21.224+01:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>PHP</category><title>PDO to turn PHP into closed software development?</title><description>These are &lt;b&gt;my very private thoughts&lt;/b&gt; on what is going on with &lt;a href="http://pecl.php.net/package/PDO"&gt;PDO&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;First of all, having decent database support is becoming more and more important to &lt;a href="http://php.net/"&gt;PHP&lt;/a&gt; because there is hardly any PHP application left that does not have some kind of database backend. And for that exact reason, a few people started PDO some time ago.&lt;br /&gt;&lt;br /&gt;Technically speaking, right now we are on the second PDO version - well starting to count unix-like from version 0.&lt;br /&gt;&lt;br /&gt;The initial PDO developed by Sterling Hughes and me never made it into &lt;a href="http://php.net/"&gt;PHP&lt;/a&gt;. It was, however, the base for the initial version we later put into PHP, as it proved that our main design goals worked: unified API through a base class with different database back-ends connected through drivers, where drivers are separate extensions that sit on top of the main PDO extension. After some discussions at conferences - such as the &lt;a href="http://phpconference.com/"&gt;International PHP Conference&lt;/a&gt; and &lt;a href="http://www.linuxtag.org/"&gt;LinuxTag&lt;/a&gt; - it was &lt;a href="http://netevil.org/"&gt;Wez Furlong&lt;/a&gt; who came up with the initial implementation of PDO version 1. It had a nicely worked-out callback infrastructure that could support a bunch of database backends. And, indeed, we got a few of those in short time.&lt;br /&gt;&lt;br /&gt;So what we have right now is a more or less working PDO that suffers from the following:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Some databases have &lt;b&gt;suboptimal drivers&lt;/b&gt; (often slower than native extensions).&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;No support from database vendors&lt;/b&gt; to help improve drivers (for various reasons).&lt;/li&gt;&lt;br /&gt;&lt;li&gt;A &lt;b&gt;maintainance nightmare&lt;/b&gt;, where PDO in different PHP branches is completely out of synch.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;Limited functionality&lt;/b&gt; in PDO (like missing metadata support).&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;Missing developers&lt;b&gt; for the main PDO extension.&lt;/b&gt;&lt;/b&gt;&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;i&gt;So the main questions are: how do we &lt;b&gt;attract more developers&lt;/b&gt; to PDO, and how do we &lt;b&gt;improve PDO&lt;/b&gt;? And all this to boot without scaring away current developers.&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Now thanks to Wez for the &lt;a href="http://www.php.net/%7Ewez/pdo/pdo-spec.html"&gt;PDO 1 specification&lt;/a&gt; effort and talking to a bunch of database vendors, trying to integrate them into PDO development. Because only with a good documentation can we make any progress whatsoever, be it a full rewrite or just continuous development. Btw, my thanks also go to the &lt;a href="http://php.net/manual/en/preface.php#contributors"&gt;countless people&lt;/a&gt; that wrote the &lt;a href="http://php.net/pdo"&gt;PDO documentation&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;However, I completely disagree with the way in which PDO 2 was started. The main reason is that throughout the preparation phase not a single developer had any clue whatsoever of what was going on - not even that something was going on at all! If that is not the case, then obviously those who did know were under some kind of NDA. It actually appears that there is a PDO development mailing list, which I was not aware of until two days ago (for PDO 0 we used my private mail server). And even if I had been aware of it, it still would not have been the &lt;i&gt;PHP way&lt;/i&gt; of doing things - where the &lt;i&gt;PHP way&lt;/i&gt; is doing development openly, or at least openly after a short startup time. Either way, to most people who read the announcement of a CLA in the &lt;a href="http://cvs.php.net/viewvc.cgi/CVSROOT/avail?view=markup"&gt;PHP ACLs&lt;/a&gt; some time ago and the PDO 2 development proposal recently, this is a clear indication that the upcoming PDO version won't be open source. Because open means open and the PHP community in particular has always been especially open. Even though, as we recently discussed again, we might have a reason to slow down traffic on internals@, in general we all profited from our openness.&lt;br /&gt;&lt;br /&gt;From my very own perspective, I do not see any reason to change the ways in which we are dealing with things. That includes, first of all, that we discuss things openly. And second of all, that we have everything that is in PHP core under the &lt;a href="http://cvs.php.net/viewvc.cgi/php-src/LICENSE?view=co"&gt;PHP License&lt;/a&gt; - apart from bundled libraries, including the Zend engine and TSRM, of course. We btw discussed some time ago that everything in core in fact should be under the PHP License. And so far we do not have a single exception. Instead, we are continuing to replace parts of PHP that have a different license with our own rewrites/re-implementations. If we were to change the way PHP core components are developed or licensed, we would not only scare people away, but would also run the risk of this getting completely out of control.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;But when we do not change anything, we do not make any progress. So let's all rethink that.&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;So we need a better PDO core and better PDO drivers. And that means we need to come up with a better callback infrastructure between main PDO and its various drivers. And that requires some insight in the actual databases, where there are two problems. First, some vendors would only be willing to give us PHP developers insight if we or our companies signed a &lt;a href="http://en.wikipedia.org/wiki/Non-disclosure_agreement"&gt;NDA&lt;/a&gt;. And second, the vendors do not usually talk about their internals unless they absolutely have to. And if they do, then this traditionally would be done under a NDA as well. But open source development and NDAs do not really mix. So the NDA way is out.&lt;br /&gt;&lt;br /&gt;Now something between completely open and completely closed is (and the &lt;a href="http://apache.org/"&gt;Apache Software Foundation&lt;/a&gt; does this with quite some success) to use &lt;a href="http://en.wikipedia.org/wiki/Contributor_License_Agreement"&gt;CLA&lt;/a&gt;s.&lt;br /&gt;&lt;br /&gt;Since I am absolutely against any change of PHP core development because any change might spread out to larger parts of PHP development, let's only deal with PDO here.&lt;br /&gt;&lt;br /&gt;That said, PDO main belongs in PHP core, which means that it has to be done under the PHP License which is pretty much incompatible with a CLA. But we can still develop PDO drivers in &lt;a href="http://pecl.php.net/"&gt;PECL&lt;/a&gt;. And there we can even allow different licenses, at least as long as they are compatible to our OSI approved license. Actually, we already have PECL extensions where people can only contribute after agreeing to some special terms.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;At this point we could live happily ever after - if only there weren't the issue of developing a high-performing callback infrastructure. Oh, and we still would need to find people to work on PDO main.&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;So how do we come up with working specs and people who can contribute?&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Right now, we have &lt;a href="http://php.net/credits.php"&gt;people contributing to PHP&lt;/a&gt; on a regular basis from companies like &lt;a href="http://google.com/"&gt;Google&lt;/a&gt;, &lt;a href="http://ibm.com/"&gt;IBM&lt;/a&gt;, &lt;a href="http://mysql.com/"&gt;MySQL&lt;/a&gt;, &lt;a href="http://oracle.com/"&gt;Oracle&lt;/a&gt;, &lt;a href="http://yahoo.com/"&gt;Yahoo&lt;/a&gt;, &lt;a href="http://zend.com/"&gt;Zend&lt;/a&gt; and a bunch of various others - be it large companies, database companies for the PDO matters, established open source companies, or small private companies to freelancers like you and I once were.&lt;br /&gt;&lt;br /&gt;Clearly companies can find ways to work on open source without CLAs. And if any company has a problem discussing the protocol of callbacks without having everyone else first sign a CLA, then I can only say that it is their very own problem and potential market disadvantage. Pretty polemic answer, sure. But PHP has gained a lot of momentum in the previous few years and we, the PHP contributors, have accomplished that with a hell lot of effort. Private efforts for the most (and some paid efforts as well). Each and every one of us. So I do not feel the slightest temptation whatsoever, to give even the tiniest piece to any closed company. Plus having to sign a CLA might not be possible to all people working on PDO so far. And with that in mind, I would rather live with having an imperfect callback infrastructure in PDO than losing a list of respected open source contributors.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Sorry to say this, but I do not want a CLA in any part of PHP core.&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;That of course means that we still have to talk to database vendors. And, guess what, we probably welcome any kind of contribution. Just as we have always gladly accepted any kind of contribution. And maybe the actual problem is starting up a discourse with the vendors. Maybe the problem here is that there is currently no PHP entity. The only thing close to a PHP entity is the so-called PHP Group. But other than having a mail address that goes to some people mentioned on the credits page, the PHP Group does not appear to be doing much of anything. So maybe what we really need to do is fix this situation and recreate the PHP Group. Restart it with people that actually work on PHP and know the internals. Maybe just like &lt;a href="http://pear.php.net/group/"&gt;PEAR&lt;/a&gt; Group by voting; maybe like the Apache Software Foundation; maybe in a completely different way.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Parting words&lt;/span&gt;: &lt;span style="font-style: italic;"&gt;If you are wondering what PDO 2 is, well so am I. And how is this open source development?&lt;/span&gt;&lt;p style="text-align: right; font-size: 8px"&gt;Blogged with &lt;a href="http://www.flock.com/blogged-with-flock" title="Flock" target="_new"&gt;Flock&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='http://res1.blogblog.com/tracker/2486628695333694074-7248572610506333500?l=blog.somabo.de%2Fblogger.html'/&gt;&lt;/div&gt;</description><link>http://blog.somabo.de/2008/01/pdo-to-turn-php-into-closed-software.html</link><author>noreply@blogger.com (helly)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>8</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-2486628695333694074.post-1919760923277135636</guid><pubDate>Sun, 27 Jan 2008 20:21:00 +0000</pubDate><atom:updated>2008-01-27T21:21:26.065+01:00</atom:updated><category domain='http://www.blogger.com/atom/ns#'>PHP</category><title>MultipleIterator for PHP</title><description>Quite some time ago, there was the idea of a &lt;a href="http://cvs.php.net/viewvc.cgi/php-src/ext/spl/examples/dualiterator.inc?revision=HEAD&amp;amp;view=markup"&gt;DualIterator&lt;/a&gt; for &lt;a href="http://php.net"&gt;PHP&lt;/a&gt;'s &lt;a href="http://php.net/%7Ehelly"&gt;SPL&lt;/a&gt; extension.&lt;br /&gt;&lt;br /&gt;But right after providing it, I had to learn that allowing two sub Iterators only is too limiting. So when I got asked by &lt;a href="http://schlueters.de/"&gt;Johannes&lt;/a&gt; what open TODOs I have left for &lt;a href="http://wiki.pooteeweet.org/PhP53"&gt;upcoming PHP 5.3&lt;/a&gt;, I thought of it again. He even offered me a PHP implementation of his own. And he did not hesitate to tell me that he would rather see it use SplObjectStorage to store sub Iterators, rather than the Array he used. As he also allowed associative information to be stored along with sub Iterators, I sat down today to add this feature in &lt;a href="http://cvs.php.net/viewvc.cgi/php-src/ext/spl/internal/splobjectstorage.inc?revision=HEAD&amp;amp;view=markup"&gt;SplObjectStorage&lt;/a&gt;. Having added that, I came up with the below implementation. Now, if anyone is interested, then please help in testing this out. If you do so, please put your tests in &lt;a href="http://qa.php.net/write-test.php"&gt;phpt format&lt;/a&gt; and send me your tests.&lt;br /&gt;   &lt;code&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;&amp;lt;?php&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 153, 0);"&gt;/**&amp;nbsp;@file&amp;nbsp;appenditerator.inc&lt;br /&gt;&amp;nbsp;*&amp;nbsp;@ingroup&amp;nbsp;SPL&lt;br /&gt;&amp;nbsp;*&amp;nbsp;@brief&amp;nbsp;class&amp;nbsp;MultipleIterator&lt;br /&gt;&amp;nbsp;*&amp;nbsp;@author&amp;nbsp;&amp;nbsp;Johannes&amp;nbsp;Schlueter&lt;br /&gt;&amp;nbsp;*&amp;nbsp;@author&amp;nbsp;&amp;nbsp;Marcus&amp;nbsp;Boerger&lt;br /&gt;&amp;nbsp;*&amp;nbsp;@date&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;2003&amp;nbsp;-&amp;nbsp;2008&lt;br /&gt;&amp;nbsp;*&lt;br /&gt;&amp;nbsp;*&amp;nbsp;SPL&amp;nbsp;-&amp;nbsp;Standard&amp;nbsp;PHP&amp;nbsp;Library&lt;br /&gt;&amp;nbsp;*/&lt;br /&gt;&lt;br /&gt;/**&amp;nbsp;@ingroup&amp;nbsp;SPL&lt;br /&gt;&amp;nbsp;*&amp;nbsp;@brief&amp;nbsp;&amp;nbsp;&amp;nbsp;Iterator&amp;nbsp;that&amp;nbsp;iterates&amp;nbsp;over&amp;nbsp;several&amp;nbsp;iterators&amp;nbsp;one&amp;nbsp;after&amp;nbsp;the&amp;nbsp;other&lt;br /&gt;&amp;nbsp;*&amp;nbsp;@author&amp;nbsp;&amp;nbsp;Johannes&amp;nbsp;Schlueter&lt;br /&gt;&amp;nbsp;*&amp;nbsp;@author&amp;nbsp;&amp;nbsp;Marcus&amp;nbsp;Boerger&lt;br /&gt;&amp;nbsp;*&amp;nbsp;@version&amp;nbsp;1.0&lt;br /&gt;&amp;nbsp;*&amp;nbsp;@since&amp;nbsp;PHP&amp;nbsp;5.3&lt;br /&gt;&amp;nbsp;*/&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;class&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;MultipleIterator&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;implements&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;Iterator&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(255, 153, 0);"&gt;/**&amp;nbsp;Inner&amp;nbsp;Iterators&amp;nbsp;*/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;private&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;$iterators&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(255, 153, 0);"&gt;/**&amp;nbsp;Flags:&amp;nbsp;const&amp;nbsp;MIT_*&amp;nbsp;*/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;private&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;$flags&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(255, 153, 0);"&gt;/**&amp;nbsp;do&amp;nbsp;not&amp;nbsp;require&amp;nbsp;all&amp;nbsp;sub&amp;nbsp;iterators&amp;nbsp;to&amp;nbsp;be&amp;nbsp;valid&amp;nbsp;in&amp;nbsp;iteration&amp;nbsp;*/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;const&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;MIT_NEED_ANY&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;0&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(255, 153, 0);"&gt;/**&amp;nbsp;require&amp;nbsp;all&amp;nbsp;sub&amp;nbsp;iterators&amp;nbsp;to&amp;nbsp;be&amp;nbsp;valid&amp;nbsp;in&amp;nbsp;iteration&amp;nbsp;*/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;const&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;MIT_NEED_ALL&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;1&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(255, 153, 0);"&gt;/**&amp;nbsp;keys&amp;nbsp;are&amp;nbsp;created&amp;nbsp;from&amp;nbsp;sub&amp;nbsp;iterators&amp;nbsp;position&amp;nbsp;*/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;const&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;MIT_KEYS_NUMERIC&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;0&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(255, 153, 0);"&gt;/**&amp;nbsp;keys&amp;nbsp;are&amp;nbsp;created&amp;nbsp;from&amp;nbsp;sub&amp;nbsp;iterators&amp;nbsp;associated&amp;nbsp;infromation&amp;nbsp;*/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;const&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;MIT_KEYS_ASSOC&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;2&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(255, 153, 0);"&gt;/**&amp;nbsp;Construct&amp;nbsp;a&amp;nbsp;new&amp;nbsp;empty&amp;nbsp;MultipleIterator&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;@param&amp;nbsp;flags&amp;nbsp;MIT_*&amp;nbsp;flags&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;public&amp;nbsp;function&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;__construct&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;$flags&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;self&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;::&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;MIT_NEED_ALL&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;|&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;self&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;::&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;MIT_KEYS_NUMERIC&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;$this&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;iterators&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;=&amp;nbsp;new&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;SplObjectStorage&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;$this&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;flags&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;$flags&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(255, 153, 0);"&gt;/**&amp;nbsp;@return&amp;nbsp;current&amp;nbsp;flags&amp;nbsp;MIT_*&amp;nbsp;*/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;public&amp;nbsp;function&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;getFlags&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;$this&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;flags&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(255, 153, 0);"&gt;/**&amp;nbsp;@param&amp;nbsp;$flags&amp;nbsp;new&amp;nbsp;flags.&amp;nbsp;*/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;public&amp;nbsp;function&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;setFlags&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;$flags&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;$this&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;flags&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;$flags&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(255, 153, 0);"&gt;/**&amp;nbsp;@param&amp;nbsp;$iter&amp;nbsp;new&amp;nbsp;Iterator&amp;nbsp;to&amp;nbsp;attach.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;@param&amp;nbsp;$inf&amp;nbsp;associative&amp;nbsp;info&amp;nbsp;forIteraotr,&amp;nbsp;must&amp;nbsp;be&amp;nbsp;NULL,&amp;nbsp;integer&amp;nbsp;or&amp;nbsp;string&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;@throws&amp;nbsp;IllegalValueException&amp;nbsp;if&amp;nbsp;a&amp;nbsp;inf&amp;nbsp;is&amp;nbsp;none&amp;nbsp;of&amp;nbsp;NULL,&amp;nbsp;integer&amp;nbsp;or&amp;nbsp;string&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;@throws&amp;nbsp;IllegalValueException&amp;nbsp;if&amp;nbsp;a&amp;nbsp;inf&amp;nbsp;is&amp;nbsp;already&amp;nbsp;an&amp;nbsp;associated&amp;nbsp;info&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;public&amp;nbsp;function&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;attachIterator&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;Iterator&amp;nbsp;$iter&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;$inf&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;NULL&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(!&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;is_null&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;$inf&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(!&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;is_int&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;$inf&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;)&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;!&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;is_string&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;$inf&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;throw&amp;nbsp;new&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;IllegalValueException&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(204, 0, 0);"&gt;'Inf&amp;nbsp;must&amp;nbsp;be&amp;nbsp;NULL,&amp;nbsp;integer&amp;nbsp;or&amp;nbsp;string'&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;foreach(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;$this&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;iterators&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;as&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;$iter&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;$inf&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;==&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;$this&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;iterators&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;getInfo&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;())&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;throw&amp;nbsp;new&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;IllegalValueException&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(204, 0, 0);"&gt;'Key&amp;nbsp;duplication&amp;nbsp;error'&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;$this&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;iterators&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;attach&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;$iter&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;$inf&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(255, 153, 0);"&gt;/**&amp;nbsp;@param&amp;nbsp;$iter&amp;nbsp;attached&amp;nbsp;Iterator&amp;nbsp;that&amp;nbsp;should&amp;nbsp;be&amp;nbsp;detached.&amp;nbsp;*/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;public&amp;nbsp;function&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;detachIterator&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;Iterator&amp;nbsp;$iter&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;$this&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;iterators&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;detach&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;$iter&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(255, 153, 0);"&gt;/**&amp;nbsp;@param&amp;nbsp;$iter&amp;nbsp;Iterator&amp;nbsp;to&amp;nbsp;check&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;@return&amp;nbsp;whether&amp;nbsp;$iter&amp;nbsp;is&amp;nbsp;attached&amp;nbsp;or&amp;nbsp;not&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;public&amp;nbsp;function&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;containsIterator&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;Iterator&amp;nbsp;$iter&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;$this&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;iterator&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;contains&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;$iter&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(255, 153, 0);"&gt;/**&amp;nbsp;@return&amp;nbsp;number&amp;nbsp;of&amp;nbsp;attached&amp;nbsp;Iterator&amp;nbsp;instances.&amp;nbsp;*/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;public&amp;nbsp;function&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;countIterators&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;$this&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;iterators&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;count&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(255, 153, 0);"&gt;/**&amp;nbsp;Rewind&amp;nbsp;all&amp;nbsp;attached&amp;nbsp;Iterator&amp;nbsp;instances.&amp;nbsp;*/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;public&amp;nbsp;function&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;rewind&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;foreach(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;$this&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;iterators&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;as&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;$iter&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;$iter&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;rewind&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(255, 153, 0);"&gt;/**&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;@return&amp;nbsp;whether&amp;nbsp;all&amp;nbsp;or&amp;nbsp;one&amp;nbsp;sub&amp;nbsp;iterator&amp;nbsp;is&amp;nbsp;valid&amp;nbsp;depending&amp;nbsp;on&amp;nbsp;flags.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;In&amp;nbsp;mode&amp;nbsp;MIT_NEED_ALL&amp;nbsp;we&amp;nbsp;expect&amp;nbsp;all&amp;nbsp;sub&amp;nbsp;iterators&amp;nbsp;to&amp;nbsp;be&amp;nbsp;valid&amp;nbsp;and&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;return&amp;nbsp;flase&amp;nbsp;on&amp;nbsp;the&amp;nbsp;first&amp;nbsp;non&amp;nbsp;valid&amp;nbsp;one.&amp;nbsp;If&amp;nbsp;that&amp;nbsp;flag&amp;nbsp;is&amp;nbsp;not&amp;nbsp;set&amp;nbsp;we&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;return&amp;nbsp;true&amp;nbsp;on&amp;nbsp;the&amp;nbsp;first&amp;nbsp;valid&amp;nbsp;sub&amp;nbsp;iterator&amp;nbsp;found.&amp;nbsp;If&amp;nbsp;no&amp;nbsp;Iterator&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;is&amp;nbsp;attached,&amp;nbsp;we&amp;nbsp;always&amp;nbsp;return&amp;nbsp;false.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;public&amp;nbsp;function&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;valid&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(!&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;sizeof&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;$this&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;iterators&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;))&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;false&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(255, 153, 0);"&gt;//&amp;nbsp;The&amp;nbsp;following&amp;nbsp;code&amp;nbsp;is&amp;nbsp;an&amp;nbsp;optimized&amp;nbsp;version&amp;nbsp;that&amp;nbsp;executes&amp;nbsp;as&amp;nbsp;few&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;valid()&amp;nbsp;calls&amp;nbsp;as&amp;nbsp;necessary&amp;nbsp;and&amp;nbsp;that&amp;nbsp;only&amp;nbsp;checks&amp;nbsp;the&amp;nbsp;flags&amp;nbsp;once.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;$expect&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;$this&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;flags&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;&amp;amp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;self&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;::&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;MIT_NEED_ALL&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;?&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;true&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;:&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;false&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;foreach(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;$this&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;iterators&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;as&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;$iter&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;$expect&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;!=&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;$iter&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;valid&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;())&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;!&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;$expect&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;$expect&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(255, 153, 0);"&gt;/**&amp;nbsp;Move&amp;nbsp;all&amp;nbsp;attached&amp;nbsp;Iterator&amp;nbsp;instances&amp;nbsp;forward.&amp;nbsp;That&amp;nbsp;is&amp;nbsp;invoke&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;their&amp;nbsp;next()&amp;nbsp;method&amp;nbsp;regardless&amp;nbsp;of&amp;nbsp;their&amp;nbsp;state.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;public&amp;nbsp;function&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;next&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;foreach(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;$this&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;iterators&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;as&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;$iter&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;$iter&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;next&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(255, 153, 0);"&gt;/**&amp;nbsp;@return&amp;nbsp;false&amp;nbsp;if&amp;nbsp;no&amp;nbsp;sub&amp;nbsp;Iterator&amp;nbsp;is&amp;nbsp;attached&amp;nbsp;and&amp;nbsp;an&amp;nbsp;array&amp;nbsp;of&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;all&amp;nbsp;registered&amp;nbsp;Iterator&amp;nbsp;instances&amp;nbsp;current()&amp;nbsp;result.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;@throws&amp;nbsp;RuntimeException&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;mode&amp;nbsp;MIT_NEED_ALL&amp;nbsp;is&amp;nbsp;set&amp;nbsp;and&amp;nbsp;at&amp;nbsp;least&amp;nbsp;one&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;attached&amp;nbsp;Iterator&amp;nbsp;is&amp;nbsp;not&amp;nbsp;valid().&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;@throws&amp;nbsp;IllegalValueException&amp;nbsp;if&amp;nbsp;a&amp;nbsp;key&amp;nbsp;is&amp;nbsp;NULL&amp;nbsp;and&amp;nbsp;MIT_KEYS_ASSOC&amp;nbsp;is&amp;nbsp;set.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;public&amp;nbsp;function&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;current&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(!&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;sizeof&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;$this&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;iterators&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;false&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;$retval&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;=&amp;nbsp;array();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;foreach(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;$this&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;iterators&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;as&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;$iter&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;$it&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;valid&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;())&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;$this&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;flags&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;&amp;amp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;self&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;::&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;MIT_KEYS_ASSOC&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;$key&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;$this&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;iterators&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;getInfo&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;is_null&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;$key&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;throw&amp;nbsp;new&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;IllegalValueException&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(204, 0, 0);"&gt;'Sub-Iterator&amp;nbsp;is&amp;nbsp;associated&amp;nbsp;with&amp;nbsp;NULL'&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;$retval&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;[&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;$key&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;]&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;$iter&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;current&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;$retval&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;[]&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;$iter&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;current&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else&amp;nbsp;if&amp;nbsp;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;$this&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;flags&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;&amp;amp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;self&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;::&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;MIT_NEED_ALL&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;throw&amp;nbsp;new&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;RuntimeException&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(204, 0, 0);"&gt;'Called&amp;nbsp;current()&amp;nbsp;with&amp;nbsp;non&amp;nbsp;valid&amp;nbsp;sub&amp;nbsp;iterator'&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;$retval&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;[]&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;NULL&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;$retval&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(255, 153, 0);"&gt;/**&amp;nbsp;@return&amp;nbsp;false&amp;nbsp;if&amp;nbsp;no&amp;nbsp;sub&amp;nbsp;Iterator&amp;nbsp;is&amp;nbsp;attached&amp;nbsp;and&amp;nbsp;an&amp;nbsp;array&amp;nbsp;of&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;all&amp;nbsp;registered&amp;nbsp;Iterator&amp;nbsp;instances&amp;nbsp;key()&amp;nbsp;result.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;@throws&amp;nbsp;LogicException&amp;nbsp;if&amp;nbsp;mode&amp;nbsp;MIT_NEED_ALL&amp;nbsp;is&amp;nbsp;set&amp;nbsp;and&amp;nbsp;at&amp;nbsp;least&amp;nbsp;one&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;attached&amp;nbsp;Iterator&amp;nbsp;is&amp;nbsp;not&amp;nbsp;valid().&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;public&amp;nbsp;function&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;key&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(!&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;sizeof&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;$this&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;iterators&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;false&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;$retval&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;=&amp;nbsp;array();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;foreach(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;$this&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;iterators&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;as&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;$iter&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;$it&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;valid&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;())&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;$retval&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;[]&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;$iter&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;key&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else&amp;nbsp;if&amp;nbsp;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;$this&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;flags&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;&amp;amp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;self&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;::&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;MIT_NEED_ALL&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;throw&amp;nbsp;new&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;LogicException&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(204, 0, 0);"&gt;'Called&amp;nbsp;key()&amp;nbsp;with&amp;nbsp;non&amp;nbsp;valid&amp;nbsp;sub&amp;nbsp;iterator'&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;$retval&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;[]&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;NULL&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 204);"&gt;$retval&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/code&gt;&lt;p style="text-align: right; font-size: 8px"&gt;Blogged with &lt;a href="http://www.flock.com/blogged-with-flock" title="Flock" target="_new"&gt;Flock&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='http://res1.blogblog.com/tracker/2486628695333694074-1919760923277135636?l=blog.somabo.de%2Fblogger.html'/&gt;&lt;/div&gt;</description><link>http://blog.somabo.de/2008/01/multipleiterator-for-php.html</link><author>noreply@blogger.com (helly)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-2486628695333694074.post-4881386290250507838</guid><pubDate>Sat, 26 Jan 2008 11:44:00 +0000</pubDate><atom:updated>2008-01-26T14:02:31.883+01:00</atom:updated><title>Flow to be renamed Flaw?</title><description>After moving to Switzerland, I decided it is time to replace the more than 10-year-old soft snowboard, bindings, and boots set with something new. Even though my brother and I never had any issues whatsoever, the stuff simply got old and worn out. Having spent the weekend before at the 2007 &lt;a href="http://vancouver.php.net/"&gt;Vancouver PHP&lt;/a&gt; conference at Whistler Mountain, where I had an awesome board, I had quite an idea of what I wanted. So I asked friends for a good boarder shop and ended up in the &lt;a href="http://snowboardgarage.ch/"&gt;Snowboard Garage&lt;/a&gt;. They really had a clue of what they were selling and happened to not only be a &lt;a href="http://flow.com/"&gt;Flow&lt;/a&gt; dealer, but also have one last &lt;a href="http://ridesnowboards.com/"&gt;Ride&lt;/a&gt; &lt;a href="http://www.flickr.com/photos/helly25/2205843643/"&gt;Timeless board&lt;/a&gt;. Last but not least, I bought pretty damn good &lt;a href="http://www.salomonsnowboard.com/ch/products/MALAMUTE-2-419204.html"&gt;Salomon Malamute boots&lt;/a&gt;. So Caitlin and I went happily snowboarding. But after 2.5 days my brand new &lt;a href="http://usa.flow.com/bindings/men/nxt-fs.html"&gt;Flow NXT FS&lt;/a&gt; bindings got broken already. &lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.flickr.com/photos/helly25/2205779143/"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px;" src="http://farm3.static.flickr.com/2172/2205779143_3bc924a775_m.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Very disappointed, I looked up the designs of the current Flow bindings and found out that they are either cheap plastic crap or have the same design flaw. That is, the high-back consists of three parts. An outer plastic part that holds the closing device. A middle part that is made of aluminum and is connected to the base plate - but to save material is not made high enough. Actually it is just high enough to offer space for two holes through which two screws connect all three parts. Then the inner part is the actual high-back that supports the boot.&lt;br /&gt;&lt;br /&gt;Now obviously on the first time I required some support from the bindings (by taking a free ride slope) the whole construction just broke. What happened was that the nut holding the screw just got torn apart. WOW, even I who only spent one semester in mechanical design know this basic rule: the nut must be stronger than the screw. Because one can replace a screw but not the nut. Actually, what the hell, this happened on the third day and I was still carefully driving so to adjust myself to the new equipment? And it is not cheap stuff at all!&lt;br /&gt;&lt;br /&gt;O.k., back to the shop and discussing options. Well as said, I looked up the designs and it turns out only the Flow Team binding is able to give some support without having that design flaw. So I had to pay the difference which actually meant that I had to pay the same amount I spent for the other crap in the first place (hey, Flow, I have to work for money, you know?).&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.flickr.com/photos/helly25/2205799723/"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px;" src="http://farm3.static.flickr.com/2051/2205799723_316ee98cfa_m.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;After one week, the new bindings finally arrived and we went again, just  to notice the next design flaw: the metal strap that connects the high-back is not fully covered by plastic, so it scratches against the plastic strap that holds the boots on the top. WOW! So this binding will eventually last for a year. Idiots. So I just call you &lt;span style="font-style: italic;"&gt;Flaw&lt;/span&gt; now - and of course no longer suggest your crap to anyone!&lt;br /&gt;&lt;br /&gt;Unfortunately there is nothing that can replace a &lt;span style="font-style: italic;"&gt;Flaw&lt;/span&gt; binding, so I guess I simply&lt;br /&gt;stay with the crap. Why can't the bindings be as they used to be. Just have an awesome quality like the Ride board, the Salomon boots or the also brand new &lt;a href="http://www.kjus.com/"&gt;kjus&lt;/a&gt; jacket.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='http://res1.blogblog.com/tracker/2486628695333694074-4881386290250507838?l=blog.somabo.de%2Fblogger.html'/&gt;&lt;/div&gt;</description><link>http://blog.somabo.de/2008/01/flow-to-be-renamed-flaw.html</link><author>noreply@blogger.com (helly)</author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></item></channel></rss>