<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-6953715153391627348</id><updated>2011-11-28T01:46:45.695+02:00</updated><category term='SQL'/><category term='PBX'/><category term='javascript'/><category term='WAA'/><category term='blogspot'/><category term='AJAX'/><category term='Zend Framework'/><category term='Zend_Db'/><category term='rfc'/><category term='web development'/><category term='bug tracking'/><category term='http'/><category term='Apple'/><category term='Oracle'/><category term='Leopard'/><category term='OS X'/><category term='IVR'/><category term='pdt'/><category term='tuning'/><category term='Zend_XmlRpc'/><category term='performance'/><category term='eclipse'/><category term='Apache'/><category term='web server'/><category term='Zend_Log'/><category term='trafic.ro'/><category term='backup'/><category term='Time Machine'/><category term='web analytics'/><category term='rfc 2616'/><category term='CSS'/><category term='php'/><category term='Zend Platform'/><category term='Asterisk'/><category term='mem_get_usage'/><category term='geek'/><category term='text indexing'/><category term='simplexml'/><category term='iPhone'/><category term='SEO'/><category term='domdocument'/><category term='status code'/><category term='XML-RPC'/><category term='Zend Studio for Eclipse'/><category term='smarty'/><category term='telephony'/><category term='HTML'/><category term='O&apos;Reilly Media'/><category term='memcached'/><category term='project management'/><category term='SVN'/><title type='text'>302 Found</title><subtitle type='html'>SQL/PHP/HTML/CSS/JS bits and pieces...</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://302-found.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6953715153391627348/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://302-found.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Sorin Stoiana</name><uri>http://www.blogger.com/profile/10069964159494795978</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>24</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-6953715153391627348.post-6149069900342903943</id><published>2009-10-01T15:33:00.003+03:00</published><updated>2009-10-01T15:48:43.101+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='web development'/><category scheme='http://www.blogger.com/atom/ns#' term='telephony'/><category scheme='http://www.blogger.com/atom/ns#' term='IVR'/><category scheme='http://www.blogger.com/atom/ns#' term='iPhone'/><category scheme='http://www.blogger.com/atom/ns#' term='Asterisk'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><category scheme='http://www.blogger.com/atom/ns#' term='PBX'/><title type='text'>iPhone DTMF woes</title><content type='html'>Unfortunately, every other day is equal to another iPhone horror story for me. Developing an &lt;a href="http://www.asterisk.org/"&gt;Asterisk&lt;/a&gt; &lt;a href="http://en.wikipedia.org/wiki/Interactive_voice_response"&gt;IVR (Interactive Voice Response)&lt;/a&gt; system means interpreting &lt;a href="http://en.wikipedia.org/wiki/Dual-tone_multi-frequency"&gt;DTMF&lt;/a&gt; tones from a wide range of devices. Now, if one of them happens to be an &lt;a href="http://www.apple.com/iphone/"&gt;iPhone&lt;/a&gt;...&lt;span class="fullpost"&gt; then all hell breaks loose. &lt;br /&gt;&lt;br /&gt;While testing, we weren't exactly sure why the keypad input from one of our phones was always garbled. After a few minutes of testing and testing, we figured it must be a phone problem. And it was. The phone in question is (of course) an Apple iPhone 3G. *My* iPhone 3G.&lt;br /&gt;&lt;br /&gt;Digging through the &lt;a href="http://discussions.apple.com/message.jspa?messageID=6856277"&gt;apple support forums&lt;/a&gt;, this is what came up: the iPhone only knows how to send "long" DTMF tones. Because phone line quality is lousy by default, line noise and interruptions cause these long tones to sometimes (almost always) get broken into two or more "short" tones. Hence, the keypad input nightmare begins. &lt;br /&gt;&lt;br /&gt;Empirically we discovered that turning off the 3G service on the iPhone alleviates the problem, but it's not guaranteed to work, and it's not documented anywhere. &lt;br /&gt;&lt;br /&gt;Did I mention I have a love-hate relationship with my iPhone?&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6953715153391627348-6149069900342903943?l=302-found.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://302-found.blogspot.com/feeds/6149069900342903943/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6953715153391627348&amp;postID=6149069900342903943' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6953715153391627348/posts/default/6149069900342903943'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6953715153391627348/posts/default/6149069900342903943'/><link rel='alternate' type='text/html' href='http://302-found.blogspot.com/2009/10/iphone-dtmf-woes.html' title='iPhone DTMF woes'/><author><name>Sorin Stoiana</name><uri>http://www.blogger.com/profile/10069964159494795978</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6953715153391627348.post-7432774479481734359</id><published>2009-09-30T15:44:00.002+03:00</published><updated>2009-09-30T15:48:25.251+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='project management'/><category scheme='http://www.blogger.com/atom/ns#' term='bug tracking'/><title type='text'>Fogbugz &gt; Redmine</title><content type='html'>Fogbugz is orders of magnitude better than Redmine. Period. Also a lot more expensive. But it's worth every penny. &lt;br /&gt;&lt;br /&gt;Just needed to say that. &lt;br /&gt;&lt;br /&gt;Oh, and if you're a startup or a student, you should try their &lt;a href="http://www.fogcreek.com/FogBugz/StudentAndStartup.html"&gt;Fogbugz Student and Startup Edition&lt;/a&gt; (DUH).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6953715153391627348-7432774479481734359?l=302-found.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://302-found.blogspot.com/feeds/7432774479481734359/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6953715153391627348&amp;postID=7432774479481734359' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6953715153391627348/posts/default/7432774479481734359'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6953715153391627348/posts/default/7432774479481734359'/><link rel='alternate' type='text/html' href='http://302-found.blogspot.com/2009/09/fogbugz-redmine.html' title='Fogbugz &gt; Redmine'/><author><name>Sorin Stoiana</name><uri>http://www.blogger.com/profile/10069964159494795978</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6953715153391627348.post-4596424075215071541</id><published>2009-03-30T23:46:00.000+03:00</published><updated>2009-03-31T17:01:58.950+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='http'/><category scheme='http://www.blogger.com/atom/ns#' term='web server'/><category scheme='http://www.blogger.com/atom/ns#' term='web analytics'/><category scheme='http://www.blogger.com/atom/ns#' term='SEO'/><category scheme='http://www.blogger.com/atom/ns#' term='Apache'/><title type='text'>Redirect Non-www Domain to www for Better SEO</title><content type='html'>Search engines consider http://domain.com and http://www.domain.com different websites. As a result, you are effectively splitting the potential benefit of valuable link popularity, as well as risking to be penalized by Google for duplicate content.&lt;br /&gt;&lt;br /&gt;Using a permanent redirect you can effectively consolidate all of your link popularity to a single URL. &lt;br /&gt;&lt;span class="fullpost"&gt;This Search Engine Optimization will serve to increase your website's chances of obtaining and maintaining top rankings.&lt;br /&gt;&lt;br /&gt;First of all, you need to decide which version you intend to keep: the "www" or "non-www" URL for your website. Depending on which version you intend to keep, you need to use the following code in your Apache configuration files:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Redirect domain.com to www.domain.com&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;code&gt;RewriteEngine On&lt;br /&gt;RewriteBase /&lt;br /&gt;RewriteCond %{HTTP_HOST} !^www.domain.com$ [NC]&lt;br /&gt;RewriteRule ^(.*)$ http://www.domain.com/$1 [L,R=301]&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Redirect www.domain.com to domain.com&lt;br /&gt;&lt;br /&gt;&lt;code&gt;RewriteEngine On&lt;br /&gt;RewriteBase /&lt;br /&gt;RewriteCond %{HTTP_HOST} !^domain.com$ [NC]&lt;br /&gt;RewriteRule ^(.*)$ http://domain.com/$1 [L,R=301]&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;Some hosting providers are more permissive than others. If you have access to your httpd.conf file, you can insert the code there. If not, you can always use the .htaccess file in your site's document root. See the post&lt;br /&gt;&lt;a href="http://302-found.blogspot.com/2009/03/disable-directory-listing-apache.html"&gt;How to Disable Directory Listing/Browsing in Apache Web Server&lt;/a&gt; for more details.&lt;br /&gt;&lt;br /&gt;Also, you need to ensure that your hosting provider has the Apache Rewrite Module turned on; this is a definite requirement for this fix to work. You can enable the Rewrite Module using the following line in the configuration files:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;LoadModule rewrite_module modules/mod_rewrite.so&lt;/code&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6953715153391627348-4596424075215071541?l=302-found.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://302-found.blogspot.com/feeds/4596424075215071541/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6953715153391627348&amp;postID=4596424075215071541' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6953715153391627348/posts/default/4596424075215071541'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6953715153391627348/posts/default/4596424075215071541'/><link rel='alternate' type='text/html' href='http://302-found.blogspot.com/2009/03/redirect-www-domain-seo.html' title='Redirect Non-www Domain to www for Better SEO'/><author><name>Sorin Stoiana</name><uri>http://www.blogger.com/profile/10069964159494795978</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6953715153391627348.post-4474838562324363822</id><published>2009-03-21T21:43:00.004+02:00</published><updated>2009-03-21T21:44:46.595+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='http'/><category scheme='http://www.blogger.com/atom/ns#' term='web server'/><category scheme='http://www.blogger.com/atom/ns#' term='Apache'/><title type='text'>How to Disable Directory Listing/Browsing in Apache Web Server</title><content type='html'>Apache's Web Server, &lt;a href="http://httpd.apache.org/"&gt;HTTPD&lt;/a&gt;, is arguably the most popular choice for a website, with more than 66% of the busiest websites using it (according to Netcraft's &lt;a href="http://news.netcraft.com/archives/2009/03/15/march_2009_web_server_survey.html"&gt;March 2009 Web Server Survey&lt;/a&gt;). By default, it comes configured with the Directory Listing option enabled. This option allows users to see all the files and sub-directories under a particular directory when index files set by &lt;code&gt;&lt;a href="http://httpd.apache.org/docs/2.0/mod/mod_dir.html#directoryindex"&gt;DirectoryIndex&lt;/a&gt;&lt;/code&gt; (&lt;em&gt;e.g.&lt;/em&gt;, &lt;code&gt;index.html&lt;/code&gt;, &lt;code&gt;index.php&lt;/code&gt; etc.) are not found in that directory.&lt;br /&gt;This is not advisable on a production website, because it may expose sensitive information to prying eyes. Moreover, if you do not define entries in &lt;code&gt;&lt;a href="http://www.robotstxt.org/robotstxt.html"&gt;robots.txt&lt;/a&gt;&lt;/code&gt; properly, search engines can reach and index these directories. Therefore, it is necesary to make these directories invisible in order to protect your data from being compromised.&lt;br /&gt;&lt;br /&gt;How can we disable the Directory Listing in Apache Server?&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;There are two ways to achieve this:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;You can do this with an &lt;code&gt;&lt;a href="http://httpd.apache.org/docs/2.0/mod/core.html#options"&gt;Options&lt;/a&gt;&lt;/code&gt; directive inside a &lt;code&gt;&lt;a href="http://httpd.apache.org/docs/2.0/mod/core.html#directory"&gt;&amp;lt;Directory&amp;gt;&lt;/directory&gt;&lt;/a&gt;&lt;/code&gt; tag. Either remove the &lt;code&gt;Indexes&lt;/code&gt; option from the line that begins with &lt;code&gt;&lt;a href="http://httpd.apache.org/docs/2.0/mod/core.html#options"&gt;Options&lt;/a&gt;&lt;/code&gt; if it’s there, or change &lt;code&gt;Indexes&lt;/code&gt; to &lt;code&gt;-Indexes&lt;/code&gt;.&lt;br /&gt;&lt;pre&gt;&amp;lt;Directory "/www"&amp;gt;&lt;br /&gt;Options &lt;span style="text-decoration: line-through;"&gt;Indexes&lt;/span&gt; FollowSymLinks&lt;br /&gt;&amp;lt;/Directory&amp;gt;&lt;/pre&gt; The only disadvantage with this method is that you need to have access the Apache configuration file, &lt;code&gt;&lt;a href="http://httpd.apache.org/docs/2.0/configuring.html"&gt;httpd.conf&lt;/a&gt;&lt;/code&gt;.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Since most shared hosting companies don't allow this, you might not be able to use the previous method. You can, however, obtain the same effect as method 1 by using the &lt;code&gt;&lt;a href="http://httpd.apache.org/docs/2.0/mod/core.html#accessfilename"&gt;.htaccess&lt;/a&gt;&lt;/code&gt; file: open the &lt;code&gt;&lt;a href="http://httpd.apache.org/docs/2.0/mod/core.html#accessfilename"&gt;.htaccess&lt;/a&gt;&lt;/code&gt; file (create a new one if it’s not there) under the target directory, look for &lt;code&gt;Options Indexes&lt;/code&gt;. If &lt;code&gt;Options Indexes&lt;/code&gt; exists, modify it to &lt;code&gt;Options -Indexes&lt;/code&gt;, or else add &lt;code&gt;Options -Indexes&lt;/code&gt; as a new line.&lt;br /&gt;&lt;br /&gt;This method requires the &lt;code&gt;&lt;a href="http://httpd.apache.org/docs/2.0/mod/core.html#allowoverride"&gt;AllowOverride&lt;/a&gt;&lt;/code&gt; directive be set to "Options" or "All" for the target directory. When this directive is set to "None", then &lt;code&gt;&lt;a href="http://httpd.apache.org/docs/2.0/mod/core.html#accessfilename"&gt;.htaccess&lt;/a&gt;&lt;/code&gt; files are completely ignored. In this case, the server will not even attempt to read &lt;code&gt;&lt;a href="http://httpd.apache.org/docs/2.0/mod/core.html#accessfilename"&gt;.htaccess&lt;/a&gt;&lt;/code&gt; files in the filesystem.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;Remember to restart your Apache Web Server, and the Directory Listing feature should be disabled by now.&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6953715153391627348-4474838562324363822?l=302-found.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://302-found.blogspot.com/feeds/4474838562324363822/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6953715153391627348&amp;postID=4474838562324363822' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6953715153391627348/posts/default/4474838562324363822'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6953715153391627348/posts/default/4474838562324363822'/><link rel='alternate' type='text/html' href='http://302-found.blogspot.com/2009/03/disable-directory-listing-apache.html' title='How to Disable Directory Listing/Browsing in Apache Web Server'/><author><name>Sorin Stoiana</name><uri>http://www.blogger.com/profile/10069964159494795978</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6953715153391627348.post-4817447610582773326</id><published>2009-03-15T22:30:00.009+02:00</published><updated>2009-03-16T17:12:35.725+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Zend Studio for Eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='OS X'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><category scheme='http://www.blogger.com/atom/ns#' term='Apple'/><category scheme='http://www.blogger.com/atom/ns#' term='Leopard'/><title type='text'>Zend Studio for Eclipse 6.1.1 for Mac OS X - problems &amp; solutions</title><content type='html'>I recently reinstalled Leopard on my laptop, not because of an OS problem, but because my hard-drive quit on me. This was the perfect opportunity for me to try out version 6.1.1 of Zend's IDE. This, and the fact that version 6.1.0 that I used before was not available anymore. &lt;br /&gt;To my displeasure, I was confronted with a handful of problems with this version of the IDE. &lt;span class="fullpost"&gt;&lt;br /&gt;After enthusiastically downloading and installing the ~300 MB package (shame on you, Zend, for not providing links for the older versions of your products), I was greeted by a not-so-familiar face. All of the fonts looked really messed up, large and clunky. This was annoying for a number of reasons. First off, the larger fonts used up a large amount of real-estate on my 13" display. More importantly, it was plain ugly :(&lt;br /&gt;I took to the Preferences dialog to try and modify the fonts, but to no avail: there were parts of the interface that stubbornly refused to comply with my settings. Thinking that maybe there was a problem with my Java installation, I downloaded and installed Eclipse, and noticed that it was NOT affected by the font problem. After a couple of hours of comparing Eclipse and ZSE configuration files, I discovered the cause. The line &lt;pre&gt;-Dorg.eclipse.swt.internal.carbon.smallFonts&lt;/pre&gt; was missing from /Applications/Zend/Zend Studio for Eclipse - 6.1.1/ZendStudio.app:MacOS/ZendStudio.ini&lt;br /&gt;&lt;br /&gt;The same comparison helped me figure out how to change the ugly low resolution icon that appeared for ZSE when pressing switching apps by using ⌘+Tab. Adding the line &lt;pre&gt;-Xdock:icon=../Resources/mac.icns&lt;/pre&gt;to the same file as above made OS X use the high res version of the icon.&lt;br /&gt;&lt;br /&gt;The next problem reared it's ugly head when I tried updating ZSE. Whatever options I'd chose when trying to install new features or update, the following message would appear in the Search Results dialog:&lt;br /&gt;&lt;pre&gt;RSE Feature Patch (3.0.2.v20090119-1307w311_122_) requires feature "org.eclipse.rse (3.0.2.v200812041720-7H3788qfeqHMeUOEQ2IKjVLIiQ8)".&lt;/pre&gt;  &lt;br /&gt;Fortunately, the solution to this problem was easily discovered on Zend's site in a &lt;a href="http://www.zend.com/en/support/knowledgebase.php?kbid=356&amp;view_only=1"&gt;Knowledge Base article&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;In spite of all these minor problems, ZSE still is, in my opinion, the best PHP IDE out there. However, Zend should take a little more care when packaging new releases of their products. &lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6953715153391627348-4817447610582773326?l=302-found.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://302-found.blogspot.com/feeds/4817447610582773326/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6953715153391627348&amp;postID=4817447610582773326' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6953715153391627348/posts/default/4817447610582773326'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6953715153391627348/posts/default/4817447610582773326'/><link rel='alternate' type='text/html' href='http://302-found.blogspot.com/2009/03/zend-studio-for-eclipse-611-os-x.html' title='Zend Studio for Eclipse 6.1.1 for Mac OS X - problems &amp; solutions'/><author><name>Sorin Stoiana</name><uri>http://www.blogger.com/profile/10069964159494795978</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6953715153391627348.post-4132722551612434417</id><published>2009-02-12T16:14:00.003+02:00</published><updated>2009-02-22T04:25:25.892+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='web analytics'/><category scheme='http://www.blogger.com/atom/ns#' term='AJAX'/><category scheme='http://www.blogger.com/atom/ns#' term='trafic.ro'/><category scheme='http://www.blogger.com/atom/ns#' term='CSS'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><category scheme='http://www.blogger.com/atom/ns#' term='HTML'/><title type='text'>My favorite project gets a new face</title><content type='html'>After almost three months of non-stop work and a lot of interesting technical challenges, &lt;a href="http://www.trafic.ro/"&gt;trafic.ro&lt;/a&gt; got a major redesign. But it's not all about the looks. The interface is cleaner and a lot of functionality has been updated to provide better usability.&lt;br /&gt;And, judging from the initial feedback from our users, the new AJAX user interface for ranking system is a BIG hit!&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Launched in September 2000, trafic.ro is the audience monitoring and website ranking tool used by most Romanian websites.&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;Check it out for yourself!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6953715153391627348-4132722551612434417?l=302-found.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://302-found.blogspot.com/feeds/4132722551612434417/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6953715153391627348&amp;postID=4132722551612434417' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6953715153391627348/posts/default/4132722551612434417'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6953715153391627348/posts/default/4132722551612434417'/><link rel='alternate' type='text/html' href='http://302-found.blogspot.com/2009/02/my-favorite-project-gets-new-face.html' title='My favorite project gets a new face'/><author><name>Sorin Stoiana</name><uri>http://www.blogger.com/profile/10069964159494795978</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6953715153391627348.post-740033068054466460</id><published>2009-01-17T04:06:00.001+02:00</published><updated>2009-02-22T04:12:46.664+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='web analytics'/><category scheme='http://www.blogger.com/atom/ns#' term='WAA'/><category scheme='http://www.blogger.com/atom/ns#' term='geek'/><title type='text'>Back!</title><content type='html'>It's been a long time since I've been here!&lt;br /&gt;Good news is that starting January 15th I'm a &lt;a href="http://www.webanalyticsassociation.org/"&gt;WAA Professional member&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6953715153391627348-740033068054466460?l=302-found.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://302-found.blogspot.com/feeds/740033068054466460/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6953715153391627348&amp;postID=740033068054466460' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6953715153391627348/posts/default/740033068054466460'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6953715153391627348/posts/default/740033068054466460'/><link rel='alternate' type='text/html' href='http://302-found.blogspot.com/2009/01/back.html' title='Back!'/><author><name>Sorin Stoiana</name><uri>http://www.blogger.com/profile/10069964159494795978</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6953715153391627348.post-8500878614150093864</id><published>2008-06-24T11:29:00.004+03:00</published><updated>2008-06-24T11:34:22.451+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='blogspot'/><title type='text'>Selective Expandable Post Summaries</title><content type='html'>I added Selective Expandable Post Summaries to my Blogger template today (the "Read more..." link you see on some larger posts in my list). This was a fairly simple exercise, thanks to &lt;a href="http://bloggermagz.blogspot.com/2007/09/selective-expandable-post-summaries.html"&gt;an excellent article&lt;/a&gt; in &lt;a href="http://bloggermagz.blogspot.com/"&gt;Blogger Magz&lt;/a&gt;. The trick is to use Blogger's conditional tags, and a little javascript magic.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6953715153391627348-8500878614150093864?l=302-found.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://302-found.blogspot.com/feeds/8500878614150093864/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6953715153391627348&amp;postID=8500878614150093864' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6953715153391627348/posts/default/8500878614150093864'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6953715153391627348/posts/default/8500878614150093864'/><link rel='alternate' type='text/html' href='http://302-found.blogspot.com/2008/06/i-added-selective-expandable-post.html' title='Selective Expandable Post Summaries'/><author><name>Sorin Stoiana</name><uri>http://www.blogger.com/profile/10069964159494795978</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6953715153391627348.post-3576116154725742462</id><published>2008-06-19T14:56:00.009+03:00</published><updated>2008-06-24T10:53:48.353+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CSS'/><category scheme='http://www.blogger.com/atom/ns#' term='HTML'/><title type='text'>Cross-browser HTML/CSS and browser snapshots</title><content type='html'>Even in this day of mature standards and strict implementation guidelines, having your web page look the same across the wide variety of browsers and operating systems available is still proving to be a major challenge for web designers and programmers alike.&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;In order to overcome the differences between browsers, webmasters usually have virtual machines with one or more different operating systems installed, each loaded with specific browsers. Dedicated design companies often keep "browser farms": racks of physical machines whose sole purpose is to provide different browsing environments. Each machine is accessible using VNC or Remote Desktop, and as such, every developer in the company can use the "browser farm" to check his designs. Such solutions demand significant hardware resources, not to mention the amount of time required to set up and manage the virtual or physical machines used for cross-browser checks.&lt;br /&gt;&lt;br /&gt;A different approach to the problem is using a dedicated web service for capturing screenshots of websites of your choice.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/___998EUH0pM/SFpTVAiXXVI/AAAAAAAAAFA/3TIDfLwptkE/s1600-h/Picture+1.png"&gt;&lt;img style="cursor: pointer;" src="http://bp3.blogger.com/___998EUH0pM/SFpTVAiXXVI/AAAAAAAAAFA/3TIDfLwptkE/s400/Picture+1.png" alt="" id="BLOGGER_PHOTO_ID_5213571139021266258" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.browsershots.org/"&gt;http://www.browsershots.org/&lt;/a&gt; is a free open-source project, invented and implemented by Johann C. Rocholl. Public beta test for the site started in February 2005 and the first public release was in March 2005.&lt;br /&gt;&lt;br /&gt;The central idea behind browsershots.org the same that drives other community projects, like seti@home or folding@home. From the website's FAQ:&lt;br /&gt;&lt;blockquote&gt;This is the one feature that sets this project apart from similar online services. The screenshots are made on distributed computers that are run by volunteers. You can see a list of &lt;a href="http://browsershots.org/factories/"&gt;active screenshot factories&lt;/a&gt;. Most of these are normal desktop machines with domestic broadband internet. Distributed community processing ensures O/S and browser diversity, but it makes quality assurance much harder.&lt;/blockquote&gt;Although the service is free, there is also a priority service, which you can have access to for 10€ ($15) per month. This means that your URLs don't have to wait in the job queue, they will be processed before all other requests. You will usually get 10 to 20 screenshots within 1 to 3 minutes.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/___998EUH0pM/SFpWpTifnZI/AAAAAAAAAFI/otnWXFg74Oc/s1600-h/Picture+2.png"&gt;&lt;img style="cursor: pointer;" src="http://bp0.blogger.com/___998EUH0pM/SFpWpTifnZI/AAAAAAAAAFI/otnWXFg74Oc/s400/Picture+2.png" alt="" id="BLOGGER_PHOTO_ID_5213574786254347666" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;http://www.browsercam.com/ is another browser snapshot website. They offer their bank of testing machines remotely to test your website.        &lt;br /&gt;&lt;blockquote&gt;BrowserCam's Screen Capture Service lets you submit single or                multiple URL's, choose the browsers and operating systems you want                to see, and screen captures of your webpage are loaded in the different                browsers and operating systems you selected.&lt;br /&gt;          You may take an unlimited number of our traditional single-frame                screen captures during your subscription period.  Our screen capture                service also offers Full Page Captures, which will take a full length                screen capture up to 8 pages long.&lt;br /&gt;&lt;/blockquote&gt;One interesting feature they offer as an extra is the ability to check the way web pages display on mobile devices. Only Blackberry, Windows Mobile 5.0, Opera 8.65 at the moment, but they have plans for Windows Mobile 6.0 as well as a few different platforms. If you're designing with mobile users in mind, BrowserCam is definitely worth a try.&lt;br /&gt;&lt;br /&gt;Their services cost $39.95 per month for standard web capture, and $59.95 per month if you also require mobile web browser snapshots. They also offer a free trial, which includes 24 hours of free usage of the screen capture service or a maximum of 200 screen captures.&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6953715153391627348-3576116154725742462?l=302-found.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://302-found.blogspot.com/feeds/3576116154725742462/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6953715153391627348&amp;postID=3576116154725742462' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6953715153391627348/posts/default/3576116154725742462'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6953715153391627348/posts/default/3576116154725742462'/><link rel='alternate' type='text/html' href='http://302-found.blogspot.com/2008/06/cross-browser-htmlcss-and-browser.html' title='Cross-browser HTML/CSS and browser snapshots'/><author><name>Sorin Stoiana</name><uri>http://www.blogger.com/profile/10069964159494795978</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp3.blogger.com/___998EUH0pM/SFpTVAiXXVI/AAAAAAAAAFA/3TIDfLwptkE/s72-c/Picture+1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6953715153391627348.post-4737318611592724234</id><published>2008-02-27T19:34:00.001+02:00</published><updated>2008-02-27T19:35:19.660+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='php'/><category scheme='http://www.blogger.com/atom/ns#' term='geek'/><title type='text'>Yay for me!</title><content type='html'>It's official! I'm a &lt;a href="http://www.zend.com/store/education/certification/authenticate.php?ClientCandidateID=ZEND006837&amp;amp;RegistrationID=224354410"&gt;Zend Certified Engineer&lt;/a&gt;!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6953715153391627348-4737318611592724234?l=302-found.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://302-found.blogspot.com/feeds/4737318611592724234/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6953715153391627348&amp;postID=4737318611592724234' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6953715153391627348/posts/default/4737318611592724234'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6953715153391627348/posts/default/4737318611592724234'/><link rel='alternate' type='text/html' href='http://302-found.blogspot.com/2008/02/yay-for-me.html' title='Yay for me!'/><author><name>Sorin Stoiana</name><uri>http://www.blogger.com/profile/10069964159494795978</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6953715153391627348.post-8104292585948295016</id><published>2008-02-12T16:37:00.000+02:00</published><updated>2008-02-12T16:41:52.290+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='geek'/><title type='text'>REAL programmers use butterflies</title><content type='html'>nano? real programmers use &lt;span style="font-style: italic;"&gt;emacs&lt;/span&gt;&lt;br /&gt;Hey, REAL programmers use &lt;span style="font-style: italic;"&gt;vim&lt;/span&gt;&lt;br /&gt;Well, REAL programmers use &lt;span style="font-style: italic;"&gt;ed&lt;/span&gt;&lt;br /&gt;No, real programmers use &lt;span style="font-style: italic;"&gt;cat&lt;/span&gt;&lt;br /&gt;REAL programmers use a magnetized needle and a steady hand&lt;br /&gt;Excuse me, but REAL programmers use &lt;span style="font-style: italic; font-weight: bold;"&gt;butterflies&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://xkcd.com/378/"&gt;Real Programmers&lt;/a&gt; via &lt;a href="http://xkcd.com/"&gt;xkcd&lt;/a&gt;  - A webcomic of romance, sarcasm, math, and language.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6953715153391627348-8104292585948295016?l=302-found.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://302-found.blogspot.com/feeds/8104292585948295016/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6953715153391627348&amp;postID=8104292585948295016' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6953715153391627348/posts/default/8104292585948295016'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6953715153391627348/posts/default/8104292585948295016'/><link rel='alternate' type='text/html' href='http://302-found.blogspot.com/2008/02/real-programmers-use-butterflies.html' title='REAL programmers use butterflies'/><author><name>Sorin Stoiana</name><uri>http://www.blogger.com/profile/10069964159494795978</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6953715153391627348.post-5972303226916086181</id><published>2008-02-05T09:19:00.001+02:00</published><updated>2008-06-24T11:20:46.959+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Zend Framework'/><category scheme='http://www.blogger.com/atom/ns#' term='performance'/><category scheme='http://www.blogger.com/atom/ns#' term='tuning'/><category scheme='http://www.blogger.com/atom/ns#' term='Zend_Db'/><category scheme='http://www.blogger.com/atom/ns#' term='Oracle'/><title type='text'>Oracle Zend_Db performance improvement</title><content type='html'>The fun part about Zend_Db is that it gives you a consistent interface to the database across a wide range of RDBMS and applications. The not-so-fun part is that this power comes at a price, and that price is performance. &lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;Suppose you have this piece of php code:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;$query = "&lt;br /&gt;        SELECT * &lt;br /&gt;        FROM source_table&lt;br /&gt;        WHERE source_table.id = :id&lt;br /&gt;";&lt;br /&gt;for($i=0;$i&lt;1000;$i++)&lt;br /&gt;{&lt;br /&gt;    $bind = array( ':id' =&gt; $i );&lt;br /&gt;    $results = $db-&gt;fetchAll( $query, $bind );&lt;br /&gt;&lt;br /&gt;    //do smth with the results&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;What about it? you say... Well, it's nice, clean, and also inefficient. Let's take a look at Zend_Db_Adapter_Abstract::query() (which is called from the fetchAll() method)&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;     public function query($sql, $bind = array())&lt;br /&gt;    {&lt;br /&gt;        // connect to the database if needed&lt;br /&gt;        $this-&gt;_connect();&lt;br /&gt;&lt;br /&gt;        // is the $sql a Zend_Db_Select object?&lt;br /&gt;        if ($sql instanceof Zend_Db_Select) {&lt;br /&gt;            $sql = $sql-&gt;__toString();&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        // make sure $bind to an array;&lt;br /&gt;        // don't use (array) typecasting because&lt;br /&gt;        // because $bind may be a Zend_Db_Expr object&lt;br /&gt;        if (!is_array($bind)) {&lt;br /&gt;            $bind = array($bind);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;b&gt;// prepare and execute the statement with profiling&lt;br /&gt;        $stmt = $this-&gt;prepare($sql);&lt;br /&gt;        $stmt-&gt;execute($bind);&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;        // return the results embedded in the prepared statement object&lt;br /&gt;        $stmt-&gt;setFetchMode($this-&gt;_fetchMode);&lt;br /&gt;        return $stmt;&lt;br /&gt;    }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;As you can see, our query is prepared every time we call Zend_Db_Adapter_Oracle::query(). What's the point of doing that, since we're doing the same query 1000s of times?&lt;br /&gt;Here's the improved version:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;$query = "&lt;br /&gt;        SELECT * &lt;br /&gt;        FROM source_table&lt;br /&gt;        WHERE source_table.id = :id&lt;br /&gt;";&lt;br /&gt;$stmt = $db-&gt;prepare($query);&lt;br /&gt;&lt;br /&gt;for($i=0;$i&lt;1000;$i++)&lt;br /&gt;{&lt;br /&gt;    $bind = array( ':id' =&gt; $i );&lt;br /&gt;    $stmt-&gt;execute( $bind );&lt;br /&gt;    $results = $stmt-&gt;fetchAll( $db-&gt;getFetchMode() );&lt;br /&gt;&lt;br /&gt;    //do smth with the results&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;There you go! Instant performance improvement, with minimal code modifications.&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6953715153391627348-5972303226916086181?l=302-found.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://302-found.blogspot.com/feeds/5972303226916086181/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6953715153391627348&amp;postID=5972303226916086181' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6953715153391627348/posts/default/5972303226916086181'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6953715153391627348/posts/default/5972303226916086181'/><link rel='alternate' type='text/html' href='http://302-found.blogspot.com/2008/02/oracle-zenddb-performance-improvement.html' title='Oracle Zend_Db performance improvement'/><author><name>Sorin Stoiana</name><uri>http://www.blogger.com/profile/10069964159494795978</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6953715153391627348.post-5422086856997185368</id><published>2008-02-05T02:18:00.001+02:00</published><updated>2008-06-24T11:26:25.741+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='text indexing'/><category scheme='http://www.blogger.com/atom/ns#' term='Oracle'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL'/><title type='text'>Oracle Text Indexing</title><content type='html'>Oracle Text, previously know as interMedia Text and ConText, is an extensive full text indexing technology allowing you to efficiently query free text and produce document classification applications.&lt;br /&gt;&lt;br /&gt;During one of my recent assignments, I stumbled upon some pretty nasty piece of SQL:&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;SELECT *&lt;br /&gt;FROM source_table&lt;br /&gt;WHERE&lt;br /&gt;(&lt;br /&gt;regexp_like(UPPER(column_one),  '.*(^|[^a-zA-Z0-9])'||:elem||'+($|[^a-zA-Z0-9]).*')&lt;br /&gt;OR regexp_like(UPPER(column_two),  '.*(^|[^a-zA-Z0-9])'||:elem||'+($|[^a-zA-Z0-9]).*')&lt;br /&gt;OR regexp_like(UPPER(column_three),'.*(^|[^a-zA-Z0-9])'||:elem||'+($|[^a-zA-Z0-9]).*')&lt;br /&gt;OR regexp_like(UPPER(column_four), '.*(^|[^a-zA-Z0-9])'||:elem||'+($|[^a-zA-Z0-9]).*')&lt;br /&gt;)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Ouch! Somebody wanted to find the rows from source_table that had the :elem bind variable as a whole word in any one of the four columns in our query.&lt;br /&gt;&lt;br /&gt;This is a typical application for &lt;a href="http://download-uk.oracle.com/docs/cd/B19306_01/text.102/b14218/cdatadic.htm"&gt;Oracle Text Indexing&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;So we create the indexes:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;CREATE INDEX source_table_cat_idx_one&lt;br /&gt;ON source_table(column_one)&lt;br /&gt;INDEXTYPE IS ctxsys.context;&lt;br /&gt;&lt;br /&gt;CREATE INDEX source_table_cat_idx_two&lt;br /&gt;ON source_table(column_two)&lt;br /&gt;INDEXTYPE IS ctxsys.context;&lt;br /&gt;&lt;br /&gt;CREATE INDEX source_table_cat_idx_three&lt;br /&gt;ON source_table(column_three)&lt;br /&gt;INDEXTYPE IS ctxsys.context;&lt;br /&gt;&lt;br /&gt;CREATE INDEX source_table_cat_idx_four&lt;br /&gt;ON source_table(column_four)&lt;br /&gt;INDEXTYPE IS ctxsys.context;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;and then rewrite the query:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;SELECT *&lt;br /&gt;FROM source_table&lt;br /&gt;WHERE&lt;br /&gt;CONTAINS(column_one,   '{:elem}', 1) &gt;0&lt;br /&gt;OR CONTAINS(column_two,   '{:elem}', 2) &gt;0&lt;br /&gt;OR CONTAINS(column_three, '{:elem}', 3) &gt;0&lt;br /&gt;OR CONTAINS(column_four,  '{:elem}', 4) &gt;0&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Still not good enough. This is where a cool little feature of Oracle Text Indexing comes handy: &lt;a href="http://download.oracle.com/docs/cd/B28359_01/text.111/b28304/cdatadic.htm#i1006307"&gt;Datastores&lt;/a&gt;, or, more exactly, one particular type of datastore: &lt;a href="http://download-uk.oracle.com/docs/cd/B19306_01/text.102/b14218/cdatadic.htm#i1006391"&gt;MULTI_COLUMN_DATASTORE&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Here's how it works: in order to create one index for all the four columns we need to search in, we have to create a MULTI_COLUMN_DATASTORE preference:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;ctx_ddl.create_preference('my_multi', 'MULTI_COLUMN_DATASTORE');&lt;br /&gt;ctx_ddl.set_attribute('my_multi', 'columns', 'column_one, column_two, column_three, column_four');&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;This enables us to create the index like this:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;CREATE INDEX source_table_cat_idx_one&lt;br /&gt;ON source_table(column_one)&lt;br /&gt;INDEXTYPE IS ctxsys.context&lt;br /&gt;PARAMETERS ( 'datastore my_multi' )&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;So our query will be as simple as:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;SELECT *&lt;br /&gt;FROM source_table&lt;br /&gt;WHERE&lt;br /&gt;CONTAINS(column_one,   '{||:elem||'}', 1) &gt;0&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Upon examining the query EXPLAIN PLAN, you'll immediately notice that the whole search is done using the index we've just created. Another advantage of this type of queries is the fact that it enables us to use &lt;a href="http://download-uk.oracle.com/docs/cd/B19306_01/text.102/b14218/cqoper.htm"&gt;CONTAINS query operators&lt;/a&gt;, and thus make implementing a site-wide search a piece of cake.&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6953715153391627348-5422086856997185368?l=302-found.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://302-found.blogspot.com/feeds/5422086856997185368/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6953715153391627348&amp;postID=5422086856997185368' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6953715153391627348/posts/default/5422086856997185368'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6953715153391627348/posts/default/5422086856997185368'/><link rel='alternate' type='text/html' href='http://302-found.blogspot.com/2008/02/oracle-text-indexing.html' title='Oracle Text Indexing'/><author><name>Sorin Stoiana</name><uri>http://www.blogger.com/profile/10069964159494795978</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6953715153391627348.post-6945176651168523413</id><published>2008-01-22T23:56:00.000+02:00</published><updated>2008-01-23T01:20:12.637+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Zend Framework'/><category scheme='http://www.blogger.com/atom/ns#' term='Zend Platform'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><title type='text'>Zend launches Zend Platform 3.6</title><content type='html'>From Zend's &lt;a href="http://www.zend.com/en/company/news/press/zend-technologies-updates-zend-platform-with-comprehensive-new-capabilities-to-improve-manageability-performance-and-reliability-of-php-web-applications"&gt;press release&lt;/a&gt;:&lt;br /&gt;&lt;blockquote&gt;Zend Technologies, the PHP Company, today announced the general availability of version 3.6 of Zend Platform™, the industry leading PHP web application server. Zend Platform 3.6 significantly expands the breadth and depth of its manageability, performance and clustering support for PHP, enabling organizations to better guarantee that their business critical web applications will meet end user’s quality, availability and response time expectations.&lt;/blockquote&gt;New features in a nutshell:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;new caching options (in-memory caching, url-based caching, cache namespaces, client-side caching)&lt;/li&gt;&lt;li&gt;improved download server functionality&lt;/li&gt;&lt;li&gt;reproduce events on development server&lt;/li&gt;&lt;li&gt;event reporting options (e-mail, SNMP, XML, etc.)&lt;/li&gt;&lt;/ul&gt;I'm looking forward to playing around with it, especially the url-based caching (Zend Framework, anyone? :P), as well as the e-mail and SNMP reporting. God knows I know of a few websites that would use the performance and reliability boost Zend Platform provides.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6953715153391627348-6945176651168523413?l=302-found.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://302-found.blogspot.com/feeds/6945176651168523413/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6953715153391627348&amp;postID=6945176651168523413' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6953715153391627348/posts/default/6945176651168523413'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6953715153391627348/posts/default/6945176651168523413'/><link rel='alternate' type='text/html' href='http://302-found.blogspot.com/2008/01/zend-launches-zend-platform-36.html' title='Zend launches Zend Platform 3.6'/><author><name>Sorin Stoiana</name><uri>http://www.blogger.com/profile/10069964159494795978</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6953715153391627348.post-3359533751792724802</id><published>2008-01-21T15:58:00.003+02:00</published><updated>2008-06-24T11:23:25.858+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Zend Framework'/><category scheme='http://www.blogger.com/atom/ns#' term='Zend_Log'/><category scheme='http://www.blogger.com/atom/ns#' term='mem_get_usage'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><title type='text'>custom Zend_Log_Formatter to display memory_get_usage( )</title><content type='html'>I wrote a simple Zend_Log_Formatter implementation that adds the current memory usage to the output. &lt;br /&gt;&lt;br /&gt;Source code after the break. &lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;?php&lt;br /&gt;/**&lt;br /&gt; * Zend_Log_Formatter_Simple&lt;br /&gt; */&lt;br /&gt;require_once 'Zend/Log/Formatter/Simple.php';&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt; * Zend_Log_Formatter class to show mem_usage in log messages&lt;br /&gt; *&lt;br /&gt; */&lt;br /&gt;class My_Log_Formatter_Simple_Memusage extends Zend_Log_Formatter_Simple&lt;br /&gt;{&lt;br /&gt; /**&lt;br /&gt;     * Class constructor&lt;br /&gt;     *&lt;br /&gt;     * @param  null|string  $format  Format specifier for log messages&lt;br /&gt;     * @throws Zend_Log_Exception&lt;br /&gt;     */&lt;br /&gt;    public function __construct($format = null)&lt;br /&gt;    {&lt;br /&gt;     if ($format === null) {&lt;br /&gt;            $format = '%timestamp% mem_usage=(%mem_get_usage%) %priorityName% (%priority%): %message%' . PHP_EOL;&lt;br /&gt;        }&lt;br /&gt;        &lt;br /&gt;        parent::__construct( $format );&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    /**&lt;br /&gt;     * Formats data into a single line to be written by the writer.&lt;br /&gt;     *&lt;br /&gt;     * @param  array    $event    event data&lt;br /&gt;     * @return string             formatted line to write to the log&lt;br /&gt;     */&lt;br /&gt;    public function format($event)&lt;br /&gt;    {&lt;br /&gt;     $event['mem_get_usage'] = memory_get_usage( );&lt;br /&gt;     &lt;br /&gt;     return parent::format( $event );&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6953715153391627348-3359533751792724802?l=302-found.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://302-found.blogspot.com/feeds/3359533751792724802/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6953715153391627348&amp;postID=3359533751792724802' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6953715153391627348/posts/default/3359533751792724802'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6953715153391627348/posts/default/3359533751792724802'/><link rel='alternate' type='text/html' href='http://302-found.blogspot.com/2008/01/custom-zendlogformatter-to-display.html' title='custom Zend_Log_Formatter to display memory_get_usage( )'/><author><name>Sorin Stoiana</name><uri>http://www.blogger.com/profile/10069964159494795978</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6953715153391627348.post-8595969208268315347</id><published>2008-01-09T12:51:00.001+02:00</published><updated>2008-06-24T11:28:12.823+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Zend Framework'/><category scheme='http://www.blogger.com/atom/ns#' term='Zend_XmlRpc'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><category scheme='http://www.blogger.com/atom/ns#' term='XML-RPC'/><title type='text'>XML-RPC system.multicall method</title><content type='html'>One of &lt;a href="http://www.xmlrpc.com/"&gt;XML-RPC&lt;/a&gt;'s default methods is &lt;span style="font-style: italic;"&gt;system.multicall()&lt;/span&gt;. This allows the client to boxcar multiple RPC calls in one request. See &lt;a href="http://www.xmlrpc.com/discuss/msgReader$1208"&gt;http://www.xmlrpc.com/discuss/msgReader$1208&lt;/a&gt; for details.&lt;br /&gt;&lt;br /&gt;Implementation using &lt;a href="http://framework.zend.com/manual/en/zend.xmlrpc.html"&gt;Zend_XmlRpc&lt;/a&gt; is very straight-forward. &lt;span class="fullpost"&gt;For once, &lt;a href="http://framework.zend.com/manual/en/zend.xmlrpc.server.html"&gt;Zend_XmlRpc_Server&lt;/a&gt; already implements this method. On the client side, calling the &lt;span style="font-style: italic;"&gt;system.multicall()&lt;/span&gt; method is done like this:&lt;br /&gt;&lt;pre&gt;$client = new Zend_XmlRpc_Client('http://path.to/xmlrpc/server');&lt;br /&gt;$client-&gt;getHttpClient()-&gt;setConfig(&lt;br /&gt;                      array(&lt;br /&gt;                              'timeout'      =&gt; 30&lt;br /&gt;                           )&lt;br /&gt;                        );&lt;br /&gt;&lt;br /&gt;$server = $client-&gt;getProxy();&lt;br /&gt;&lt;br /&gt;$response = $client-&gt;call(&lt;br /&gt;    &lt;strong&gt;'system.multicall'&lt;/strong&gt;,&lt;br /&gt;    array(&lt;br /&gt;          array(&lt;br /&gt;             array(&lt;br /&gt;                   'methodName'   =&gt; 'setConfig',&lt;br /&gt;                   'params'      =&gt; array('config')&lt;br /&gt;                ),&lt;br /&gt;              array(&lt;br /&gt;                   'methodName'   =&gt; 'getConfig',&lt;br /&gt;                   'params'      =&gt; array()&lt;br /&gt;                ),&lt;br /&gt;             array(&lt;br /&gt;                   'methodName'   =&gt; 'getOtherData',&lt;br /&gt;                   'params'      =&gt; array($sites)&lt;br /&gt;                )&lt;br /&gt;          )&lt;br /&gt;       )&lt;br /&gt; );&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6953715153391627348-8595969208268315347?l=302-found.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://302-found.blogspot.com/feeds/8595969208268315347/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6953715153391627348&amp;postID=8595969208268315347' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6953715153391627348/posts/default/8595969208268315347'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6953715153391627348/posts/default/8595969208268315347'/><link rel='alternate' type='text/html' href='http://302-found.blogspot.com/2008/01/xml-rpc-systemmulticall-method.html' title='XML-RPC system.multicall method'/><author><name>Sorin Stoiana</name><uri>http://www.blogger.com/profile/10069964159494795978</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6953715153391627348.post-5459721707635345549</id><published>2007-12-05T12:46:00.000+02:00</published><updated>2007-12-05T15:57:49.319+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='geek'/><title type='text'>Which Programming Lanuguage Are You?</title><content type='html'>&lt;a href="http://www.bbspot.com/News/2006/08/language_quiz.php"&gt;&lt;img src="http://www.bbspot.com/Images/News_Features/2006/08/language/javascript.jpg" alt="You are javascript. People often think you are somebody else.  You tend to be annoying to most people, but it's not your fault.  You jsut get used." border="0" height="90" width="300" /&gt;&lt;br /&gt;Which Programming Language are You?&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6953715153391627348-5459721707635345549?l=302-found.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://302-found.blogspot.com/feeds/5459721707635345549/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6953715153391627348&amp;postID=5459721707635345549' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6953715153391627348/posts/default/5459721707635345549'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6953715153391627348/posts/default/5459721707635345549'/><link rel='alternate' type='text/html' href='http://302-found.blogspot.com/2007/12/which-programming-lanuguage-are-you.html' title='Which Programming Lanuguage Are You?'/><author><name>Sorin Stoiana</name><uri>http://www.blogger.com/profile/10069964159494795978</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6953715153391627348.post-5848217585650801076</id><published>2007-12-03T17:27:00.000+02:00</published><updated>2007-12-03T17:32:30.798+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='O&apos;Reilly Media'/><category scheme='http://www.blogger.com/atom/ns#' term='SVN'/><title type='text'>Version Control with Subversion</title><content type='html'>I've received many questions about SVN in the past, and I've had many questions of my own. Most of those questions have found their answer in &lt;a href="http://www.oreilly.com/catalog/0596004486/"&gt;O'Reilly Media&lt;/a&gt;'s book &lt;a href="http://svnbook.red-bean.com/"&gt;Version Control with Subversion&lt;/a&gt;. This book is THE source of information about CollabNet's excellent open source version control system.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6953715153391627348-5848217585650801076?l=302-found.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://302-found.blogspot.com/feeds/5848217585650801076/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6953715153391627348&amp;postID=5848217585650801076' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6953715153391627348/posts/default/5848217585650801076'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6953715153391627348/posts/default/5848217585650801076'/><link rel='alternate' type='text/html' href='http://302-found.blogspot.com/2007/12/version-control-with-subversion.html' title='Version Control with Subversion'/><author><name>Sorin Stoiana</name><uri>http://www.blogger.com/profile/10069964159494795978</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6953715153391627348.post-4346798537535601431</id><published>2007-12-03T09:40:00.000+02:00</published><updated>2007-12-03T17:35:30.911+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='backup'/><category scheme='http://www.blogger.com/atom/ns#' term='Time Machine'/><category scheme='http://www.blogger.com/atom/ns#' term='Apple'/><category scheme='http://www.blogger.com/atom/ns#' term='Leopard'/><title type='text'>Leopard's Time Machine</title><content type='html'>I've had a looong weekend to recharge my batteries, so I thought I'd give Apple Leopard's Time Machine a try. It looked really simple, and quite promising, to be honest. The interface was a blast to use and the snapshots were really fast and transparent. However, the thing works best for managing simple document backups rather than whole system level restore points. Having your system display "Library is a system folder and cannot be deleted or moved" when trying to restore to a past snapshot is pretty disappointing.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6953715153391627348-4346798537535601431?l=302-found.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://302-found.blogspot.com/feeds/4346798537535601431/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6953715153391627348&amp;postID=4346798537535601431' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6953715153391627348/posts/default/4346798537535601431'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6953715153391627348/posts/default/4346798537535601431'/><link rel='alternate' type='text/html' href='http://302-found.blogspot.com/2007/12/leopards-time-machine.html' title='Leopard&apos;s Time Machine'/><author><name>Sorin Stoiana</name><uri>http://www.blogger.com/profile/10069964159494795978</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6953715153391627348.post-9187243887010703347</id><published>2007-11-28T17:18:00.000+02:00</published><updated>2007-11-28T17:24:51.309+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Zend Framework'/><category scheme='http://www.blogger.com/atom/ns#' term='memcached'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><title type='text'>Zend_Cache and memcached</title><content type='html'>Well, it seems that Zend_Cache &lt;a href="http://framework.zend.com/manual/en/zend.cache.backends.html#zend.cache.backends.memcached"&gt;supports&lt;/a&gt; &lt;a href="http://www.danga.com/memcached/"&gt;memcached&lt;/a&gt;. Not a bad thing, considering &lt;a href="http://www.danga.com/memcached/users.bml"&gt;who's using&lt;/a&gt; memcached these days. Look forward to using it in the future.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6953715153391627348-9187243887010703347?l=302-found.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://302-found.blogspot.com/feeds/9187243887010703347/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6953715153391627348&amp;postID=9187243887010703347' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6953715153391627348/posts/default/9187243887010703347'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6953715153391627348/posts/default/9187243887010703347'/><link rel='alternate' type='text/html' href='http://302-found.blogspot.com/2007/11/zendcache-and-memcached.html' title='Zend_Cache and memcached'/><author><name>Sorin Stoiana</name><uri>http://www.blogger.com/profile/10069964159494795978</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6953715153391627348.post-109951373811292453</id><published>2007-11-27T18:17:00.000+02:00</published><updated>2007-11-27T18:18:36.901+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='geek'/><title type='text'>$this-&gt;isGeek();</title><content type='html'>&lt;a href="http://www.justsayhi.com/bb/geek" style="background: transparent url(http://assets.justsayhi.com/badges/216/230/geek_badge1_green.6tiwgnwwgm.jpg) no-repeat scroll 0% 50%; text-decoration: none; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; display: block; width: 268px; height: 82px;"&gt;&lt;span style="display: block; padding-left: 125px; padding-top: 28px; color: rgb(0, 0, 0);font-family:Arial;font-size:22;"  &gt;80% Geek&lt;/span&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6953715153391627348-109951373811292453?l=302-found.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://302-found.blogspot.com/feeds/109951373811292453/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6953715153391627348&amp;postID=109951373811292453' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6953715153391627348/posts/default/109951373811292453'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6953715153391627348/posts/default/109951373811292453'/><link rel='alternate' type='text/html' href='http://302-found.blogspot.com/2007/11/this-isgeek.html' title='$this-&gt;isGeek();'/><author><name>Sorin Stoiana</name><uri>http://www.blogger.com/profile/10069964159494795978</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6953715153391627348.post-7298380077037980729</id><published>2007-11-27T16:02:00.000+02:00</published><updated>2007-11-27T16:23:32.492+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='smarty'/><category scheme='http://www.blogger.com/atom/ns#' term='pdt'/><title type='text'>smartypdt</title><content type='html'>&lt;a href="http://code.google.com/p/smartypdt/"&gt;http://code.google.com/p/smartypdt/&lt;/a&gt; Eclipse plugin for Smarty. 'nuff said!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6953715153391627348-7298380077037980729?l=302-found.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://302-found.blogspot.com/feeds/7298380077037980729/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6953715153391627348&amp;postID=7298380077037980729' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6953715153391627348/posts/default/7298380077037980729'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6953715153391627348/posts/default/7298380077037980729'/><link rel='alternate' type='text/html' href='http://302-found.blogspot.com/2007/11/smartypdt.html' title='smartypdt'/><author><name>Sorin Stoiana</name><uri>http://www.blogger.com/profile/10069964159494795978</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6953715153391627348.post-8699470122031850629</id><published>2007-11-27T15:26:00.000+02:00</published><updated>2008-02-05T02:11:55.946+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='domdocument'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><category scheme='http://www.blogger.com/atom/ns#' term='simplexml'/><title type='text'>simple SimpleXML</title><content type='html'>Well, i've done some simple XML stuff in PHP with (DUH) SimpleXML, and, being somewhat dissapointed with it's default asXML() output, wrote this little tid-bit of code to pretty up the output.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;/**&lt;br /&gt;* write XML contents to file&lt;br /&gt;*&lt;br /&gt;* @param SimpleXMLElement $xml         SimpleXML object&lt;br /&gt;* @param string           $filename    name of file to write output to&lt;br /&gt;*/&lt;br /&gt;public function saveXMLFormatted( $xml, $filename )&lt;br /&gt;{&lt;br /&gt;  // write data to file&lt;br /&gt;  // use DOMDocument-&gt;saveXML instead of SimpleXML-&gt;asXML because we want pretty formatting&lt;br /&gt;  $doc = new DOMDocument('1.0');&lt;br /&gt;&lt;br /&gt;  $doc-&gt;preserveWhiteSpace = false;&lt;br /&gt;  $doc-&gt;loadXML( $xml-&gt;asXML());&lt;br /&gt;  $doc-&gt;formatOutput = true;&lt;br /&gt;&lt;br /&gt;  file_put_contents( $filename, $doc-&gt;saveXML());&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;Also, some people have complained that SimpleXML does not allow the deletion of nodes from the XML structure. That's not true, deleting a node is as simple as&lt;br /&gt;&lt;pre&gt;unset($xml-&gt;node-&gt;child);&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6953715153391627348-8699470122031850629?l=302-found.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://302-found.blogspot.com/feeds/8699470122031850629/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6953715153391627348&amp;postID=8699470122031850629' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6953715153391627348/posts/default/8699470122031850629'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6953715153391627348/posts/default/8699470122031850629'/><link rel='alternate' type='text/html' href='http://302-found.blogspot.com/2007/11/simple-simplexml.html' title='simple SimpleXML'/><author><name>Sorin Stoiana</name><uri>http://www.blogger.com/profile/10069964159494795978</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6953715153391627348.post-2449632718645177998</id><published>2007-11-27T15:24:00.000+02:00</published><updated>2007-11-27T16:08:37.487+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='status code'/><category scheme='http://www.blogger.com/atom/ns#' term='http'/><category scheme='http://www.blogger.com/atom/ns#' term='rfc'/><category scheme='http://www.blogger.com/atom/ns#' term='rfc 2616'/><title type='text'>HTTP/1.1: Status Code Definitions</title><content type='html'>&lt;a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.3.3"&gt;http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.3.3&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6953715153391627348-2449632718645177998?l=302-found.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://302-found.blogspot.com/feeds/2449632718645177998/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6953715153391627348&amp;postID=2449632718645177998' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6953715153391627348/posts/default/2449632718645177998'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6953715153391627348/posts/default/2449632718645177998'/><link rel='alternate' type='text/html' href='http://302-found.blogspot.com/2007/11/http11-status-code-definitions.html' title='HTTP/1.1: Status Code Definitions'/><author><name>Sorin Stoiana</name><uri>http://www.blogger.com/profile/10069964159494795978</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
