<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"><channel><atom:link rel="hub" href="http://tumblr.superfeedr.com/" xmlns:atom="http://www.w3.org/2005/Atom"/><description>

  var _gaq = _gaq || [];
  _gaq.push([‘_setAccount’, ‘UA-731001-12’]);
  _gaq.push([‘_trackPageview’]);

  (function() {
    var ga = document.createElement(‘script’); ga.type = ‘text/javascript’; ga.async = true;
    ga.src = (‘https:’ == document.location.protocol ? ‘https://ssl’ : ‘http://www’) + ‘.google-analytics.com/ga.js’;
    var s = document.getElementsByTagName(‘script’)[0]; s.parentNode.insertBefore(ga, s);
  })();</description><title>elephpant on rails</title><generator>Tumblr (3.0; @sobstel)</generator><link>http://logs.sobstel.org/</link><item><title>Doctrine\Common\Cache\CacheProvider performance-aware adapter</title><description>&lt;p&gt;In &lt;a href="https://github.com/doctrine/common"&gt;doctrine/common&lt;/a&gt; project, with introduction of cache auto-prefix support (called namespaces by Doctrine guys, but it has nothing to do with PHP namespaces), unfortunately there appeared quite serious performance issue. Every single cache call always resulted in 2 additional cache storage calls due to checks for prefix (cache namespace). Quite a big overhead, imagine your memcached instance is called like this. And it just shows that object-oriented programming itself cannot save you from many headaches. Common interface and clean API are just not everything, and it&amp;#8217;s soooo easy to get carried away. Anyway, &lt;a&gt;patch has been already provided&lt;/a&gt;, but if you&amp;#8217;re using older version or you don&amp;#8217;t need namespaces support at all, here&amp;#8217;s quick workaround.&lt;/p&gt;
&lt;p&gt;&lt;br/&gt;&lt;script src="https://gist.github.com/2686852.js?file=DoctrineCacheAdapter.php" type="text/javascript"&gt;&lt;/script&gt;&lt;/p&gt;</description><link>http://logs.sobstel.org/post/22959646208</link><guid>http://logs.sobstel.org/post/22959646208</guid><pubDate>Sun, 13 May 2012 10:16:00 +0200</pubDate><category>php</category><category>doctrine</category></item><item><title>MySQL: BLOB vs TEXT</title><description>&lt;p&gt;The only difference between the BLOB and TEXT types is that:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;BLOB types store binary data with no collation or character set,&lt;/li&gt;
&lt;li&gt;TEXT types have a character set and collation,&lt;/li&gt;
&lt;/ul&gt;</description><link>http://logs.sobstel.org/post/22314471501</link><guid>http://logs.sobstel.org/post/22314471501</guid><pubDate>Thu, 03 May 2012 12:21:00 +0200</pubDate><category>mysql</category></item><item><title>PHP: Call to undefined method on tr_TR locale</title><description>&lt;p&gt;It&amp;#8217;s one of weirdest errors in PHP - if not the weirdest - I&amp;#8217;ve ever seen. If you set your locale to tr_TR, suddenly some classes or methods names are not available anymore. Really.&lt;/p&gt;
&lt;p&gt;Following code:&lt;/p&gt;
&lt;pre&gt;&amp;lt;?php
setlocale(LC_ALL, 'tr_TR');
class SomeClass {}
$r = new ReflectionClass('SomeClass');
$r-&amp;gt;newInstanceArgs(array());
&lt;/pre&gt;
&lt;p&gt;results in &lt;code&gt;Fatal error: Call to undefined method ReflectionClass::newInstanceArgs()&lt;/code&gt; error.&lt;/p&gt;
&lt;p&gt;After quick research it turned out that it&amp;#8217;s actually known bug, yet still not fixed since 2002! See &lt;a href="https://bugs.php.net/bug.php?id=18556"&gt;#18556&lt;/a&gt;. In short, PHP simply uses internal &lt;code&gt;tolower()&lt;/code&gt; function, which is locale-aware, but in Turkish there are some specific rules for I (undotted ı is the lowercase of I, and the dotted İ is the uppercase of i). So if you have class name of method name having upper I (&lt;code&gt;newInstanceArgs, Image&lt;/code&gt;, etc), you&amp;#8217;re affected.&lt;/p&gt;
&lt;p&gt;The only workaround for now seems to be setting &lt;code&gt;LC_CTYPE&lt;/code&gt; to some working locale, eg. &lt;code&gt;setlocale(LC_ALL, 'tr_TR'); setlocale(LC_CTYPE, 'en_US');&lt;/code&gt;.&lt;/p&gt;</description><link>http://logs.sobstel.org/post/21396574099</link><guid>http://logs.sobstel.org/post/21396574099</guid><pubDate>Thu, 19 Apr 2012 23:05:05 +0200</pubDate><category>php</category></item><item><title>Sublime Text 2: sync project side bar with active file</title><description>&lt;p&gt;It is simple like adding tiny plugin:&lt;/p&gt;
&lt;pre&gt;import sublime
import sublime_plugin

class SideBarListener(sublime_plugin.EventListener):
    
    def on_activated(self, view):
        view.window().run_command('reveal_in_side_bar')
&lt;/pre&gt;
&lt;p&gt;Plugin: &lt;a href="https://github.com/sobstel/SyncedSideBar"&gt;&lt;a href="https://github.com/sobstel/SyncedSideBar"&gt;https://github.com/sobstel/SyncedSideBar&lt;/a&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Actual author: &lt;a href="http://www.sublimetext.com/forum/viewtopic.php?f=2&amp;amp;t=4080#p19213"&gt;&lt;a href="http://www.sublimetext.com/for....#p19213"&gt;http://www.sublimetext.com/for&amp;#8230;.#p19213&lt;/a&gt;&lt;/a&gt;&lt;/p&gt;</description><link>http://logs.sobstel.org/post/16840019171</link><guid>http://logs.sobstel.org/post/16840019171</guid><pubDate>Tue, 31 Jan 2012 23:58:09 +0100</pubDate><category>sublime text 2</category></item><item><title>Internet Explorer under Linux or Mac OS X</title><description>&lt;p&gt;&lt;ul&gt;&lt;li&gt;Download and install &lt;a href="https://www.virtualbox.org/wiki/Downloads"&gt;VirtualBox&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;Download Internet Explorer
&lt;ul&gt;&lt;li&gt;&lt;code&gt;curl -s &lt;a href="https://raw.github.com/xdissent/ievms/master/ievms.sh"&gt;https://raw.github.com/xdissent/ievms/master/ievms.sh&lt;/a&gt; | bash&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;or &lt;code&gt;curl -s &lt;a href="https://raw.github.com/xdissent/ievms/master/ievms.sh"&gt;https://raw.github.com/xdissent/ievms/master/ievms.sh&lt;/a&gt; | IEVMS_VERSIONS="9" bash&lt;/code&gt; (IE9 only)&lt;/li&gt;
&lt;li&gt;or &lt;code&gt;curl -s &lt;a href="https://raw.github.com/xdissent/ievms/master/ievms.sh"&gt;https://raw.github.com/xdissent/ievms/master/ievms.sh&lt;/a&gt; | IEVMS_VERSIONS="8" bash&lt;/code&gt; (IE8 only)&lt;/li&gt;
&lt;li&gt;or &lt;code&gt;curl -s &lt;a href="https://raw.github.com/xdissent/ievms/master/ievms.sh"&gt;https://raw.github.com/xdissent/ievms/master/ievms.sh&lt;/a&gt; | IEVMS_VERSIONS="7" bash&lt;/code&gt; (IE7 only)&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;Adjust RAM settings as it&amp;#8217;s only 256MB by default (I&amp;#8217;ve used 1GB for each on box with 8GB RAM and 768MB for each on box with 4GB RAM).&lt;/li&gt;
&lt;li&gt;Run virtual machine and log in to Windows as Administrator (password: Password1).&lt;/li&gt;
&lt;li&gt;Execute &lt;code&gt;slmgr –rearm&lt;/code&gt; from terminal (to run terminal just type &lt;code&gt;cmd&lt;/code&gt; into start menu input).&lt;/li&gt;
&lt;li&gt;Add your hosts to &lt;code&gt;C:\Windows\System32\drivers\etc\hosts&lt;/code&gt; file, eg. &lt;code&gt;10.0.2.2 my-super-site.local&lt;/code&gt; (10.0.2.2 is your host&amp;#8217;s localhost).&lt;/li&gt;
&lt;li&gt;Install VirtualBox guest additions.&lt;/li&gt;
&lt;li&gt;Shutdown and make a snapshot, so you can use it as a starting point if the trial period expires (it&amp;#8217;s not illegal, even Microsoft themselves tell us to do it this way, which is understandable as it&amp;#8217;s all about adjusting our websites to work on their faulty browsers).&lt;/li&gt;
&lt;/ul&gt;&lt;/p&gt;</description><link>http://logs.sobstel.org/post/15624233120</link><guid>http://logs.sobstel.org/post/15624233120</guid><pubDate>Tue, 10 Jan 2012 18:31:00 +0100</pubDate><category>linux</category><category>mac os x</category><category>internet explorer</category></item><item><title>Javascript lazy loading with dependencies</title><description>&lt;p&gt;Here it is, yet another javascript lazy loader. Sadly, none of existing ones has been solving my problem and I was even using great  &lt;a href="http://github.com/ded/script.js"&gt;$script.js&lt;/a&gt; for some time, but eventually written new one.&lt;/p&gt;
&lt;p&gt;Why?&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;extremely lightweight (less than 0.5KB gzipped)&lt;/li&gt;
&lt;li&gt;lazy (on-demand) loading&lt;/li&gt;
&lt;li&gt;support for google.load out of the box&lt;/li&gt;
&lt;li&gt;any code (not only loaders) can be executed &lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Link: &lt;a href="https://github.com/sobstel/scru.js"&gt;&lt;a href="https://github.com/sobstel/scru.js"&gt;https://github.com/sobstel/scru.js&lt;/a&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Sample usage:&lt;/p&gt;
&lt;p&gt;// Adding to queue:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;$scru.queue('google:jsapi', $scru.fn.async_load('http://www.google.com/jsapi'));&lt;/code&gt;&lt;br/&gt;&lt;code&gt;$scru.queue('google:visualization', $scru.fn.google_load('visualization', '1', {packages:['corechart']}), ['google:jsapi']);&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;// Somewhere in some script (called only when needed)&lt;/p&gt;
&lt;p&gt;&lt;code&gt;$scru.execute(drawChart, ['google:visualization']);&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;All jsapi, visualization js are loaded only when &amp;#8220;execute&amp;#8221; is called.&lt;/p&gt;</description><link>http://logs.sobstel.org/post/14685730093</link><guid>http://logs.sobstel.org/post/14685730093</guid><pubDate>Fri, 23 Dec 2011 22:05:58 +0100</pubDate><category>javascript</category></item><item><title>Call class method via instance in Ruby</title><description>&lt;p&gt;
&lt;script src="https://gist.github.com/1367629.js?file=call_class_methods_via_instance.rb"&gt;&lt;/script&gt;&lt;/p&gt;</description><link>http://logs.sobstel.org/post/12840132792</link><guid>http://logs.sobstel.org/post/12840132792</guid><pubDate>Tue, 15 Nov 2011 18:10:18 +0100</pubDate><category>ruby</category></item><item><title>CSS Image</title><description>&lt;p&gt;Using &lt;a href="http://en.wikipedia.org/wiki/Data_URI_scheme"&gt;Data URI scheme&lt;/a&gt; you can embed images directly in HTML or CSS. It can be useful for two things:&lt;/p&gt;
&lt;ol&gt;&lt;li&gt;To save on requests to image files (images are loaded and cached only in one single request together with CSS file).&lt;/li&gt;
&lt;li&gt;To embed images in HTML emails and bypass filters that normally would prevent them from displaying.&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;You can encode string with &lt;code&gt;Base64.encode64&lt;/code&gt; (Ruby) or &lt;code&gt;base64_encode&lt;/code&gt; (PHP).&lt;/p&gt;
&lt;p&gt;&lt;code&gt; &amp;lt;?php&lt;br/&gt; $image = base64_encode(file_get_contents('image.jpg'));&lt;br/&gt; echo '&amp;lt;img src="data:image/png;base64,'.$image.'/&amp;gt;';&lt;br/&gt; ?&amp;gt;&lt;br/&gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="data:image/png;base64,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"/&gt;&lt;/p&gt;&lt;p&gt;See the output by inspecting source tag for the image.&lt;/p&gt;</description><link>http://logs.sobstel.org/post/12750165627</link><guid>http://logs.sobstel.org/post/12750165627</guid><pubDate>Sun, 13 Nov 2011 20:43:00 +0100</pubDate><category>css</category><category>htmlemail</category></item><item><title>Codility sample demo test</title><description>&lt;p&gt;I have taken &lt;a href="http://codility.com/"&gt;Codility&lt;/a&gt; &lt;a href="http://codility.com/demo/take-sample-test/"&gt;sample demo test&lt;/a&gt; at last. I was delaying this memorable moment for a few months, probably for fear that it could somehow turn out Im not that good as I think I am, which is surely the case for most developers. So I did the test and I&amp;#8217;m going to take more tests there as it&amp;#8217;s quite good fun. And here are my solutions for &lt;a href="http://codility.com/demo/take-sample-test/"&gt;sample demo test&lt;/a&gt; below, both in PHP and Ruby.&lt;/p&gt;
&lt;p&gt;
&lt;script src="https://gist.github.com/1313729.js?file=codility_demo_test.php"&gt;&lt;/script&gt;&lt;/p&gt;
&lt;p&gt;
&lt;script src="https://gist.github.com/1313873.js?file=codility_demo_test.rb"&gt;&lt;/script&gt;&lt;/p&gt;</description><link>http://logs.sobstel.org/post/11915307388</link><guid>http://logs.sobstel.org/post/11915307388</guid><pubDate>Tue, 25 Oct 2011 21:13:00 +0200</pubDate><category>php</category><category>ruby</category><category>codility</category></item><item><title>Devise: find by username OR e-mail</title><description>&lt;p&gt;&lt;script src="https://gist.github.com/1249314.js?file=devise.find_by_username_or_email.rb"&gt;&lt;/script&gt;&lt;/p&gt;</description><link>http://logs.sobstel.org/post/10778932112</link><guid>http://logs.sobstel.org/post/10778932112</guid><pubDate>Wed, 28 Sep 2011 23:32:01 +0200</pubDate><category>ruby</category><category>devise</category><category>rails</category></item><item><title>PHP date conversions between timezones</title><description>&lt;p&gt;In PHP 5.x line dates are handled properly (thanks to Derick Rethans). Even &lt;a href="http://php.net/ChangeLog-5.php#5.3.0"&gt;in PHP 5.3 we have loads of nice date/time improvements&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;One of nice things is posibility to convert dates between timezones easily.&lt;/p&gt;
&lt;p&gt;
&lt;script src="https://gist.github.com/1206722.js?file=datetime_timezones.php"&gt;&lt;/script&gt;&lt;/p&gt;</description><link>http://logs.sobstel.org/post/9998363665</link><guid>http://logs.sobstel.org/post/9998363665</guid><pubDate>Fri, 09 Sep 2011 18:59:00 +0200</pubDate><category>php</category></item><item><title>DISTINCT vs GROUP BY</title><description>&lt;p&gt;Although it may seem so, they do NOT do exactly same thing.&lt;/p&gt;
&lt;p&gt;While &lt;code&gt;GROUP BY&lt;/code&gt; groups results only by those columns that are explicitly listed after the clause, &lt;code&gt;DISTINCT&lt;/code&gt; groups results by ALL columns that are present in &lt;code&gt;SELECT&lt;/code&gt; statement (and not only by the one it precedes).&lt;/p&gt;
&lt;p&gt;So following queries&lt;/p&gt;
&lt;p&gt;&lt;code&gt;SELECT DISTINCT article_id FROM article_authors&lt;/code&gt;&lt;br/&gt;&lt;code&gt;SELECT article_id FROM article_authors GROUP BY article_id&lt;/code&gt;&lt;br/&gt; return same results,&lt;/p&gt;
&lt;p&gt;but&lt;/p&gt;
&lt;p&gt;&lt;code&gt;SELECT DISTINCT article_id, author_id FROM article_authors&lt;/code&gt;&lt;br/&gt;&lt;code&gt;SELECT article_id FROM article_authors GROUP BY article_id&lt;/code&gt;&lt;br/&gt;return different results,&lt;/p&gt;
&lt;p&gt;though&lt;/p&gt;
&lt;p&gt;&lt;code&gt;SELECT DISTINCT article_id, author_id FROM article_authors&lt;/code&gt;&lt;br/&gt;&lt;code&gt;SELECT article_id FROM article_authors GROUP BY article_id, author_id&lt;/code&gt;&lt;br/&gt;again return same results.&lt;/p&gt;
&lt;p&gt;As a sidenote, with &lt;code&gt;GROUP BY&lt;/code&gt; you have &lt;code&gt;HAVING&lt;/code&gt; clause by your hand as well.&lt;/p&gt;</description><link>http://logs.sobstel.org/post/9582520897</link><guid>http://logs.sobstel.org/post/9582520897</guid><pubDate>Tue, 30 Aug 2011 12:00:00 +0200</pubDate><category>mysql</category><category>sql</category></item><item><title>Avoid temporary table when using MySQL's ORDER BY</title><description>&lt;p&gt;&lt;em&gt;If there is an &lt;code&gt;ORDER BY&lt;/code&gt; clause and a different &lt;code&gt;GROUP BY&lt;/code&gt; clause, or if the &lt;code&gt;ORDER BY&lt;/code&gt; or &lt;code&gt;GROUP BY&lt;/code&gt; contains columns from tables other than the first table in the join queue, a temporary table is created.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;If all columns in &lt;code&gt;ORDER BY&lt;/code&gt; and &lt;code&gt;GROUP BY&lt;/code&gt; clauses come from the same table, that table is preferred first when joining.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;More tips like this in manual&amp;#8217;s &lt;a href="http://dev.mysql.com/doc/refman/5.1/en/where-optimizations.html"&gt;WHERE Clause Optimization&lt;/a&gt;.&lt;/p&gt;</description><link>http://logs.sobstel.org/post/8994210098</link><guid>http://logs.sobstel.org/post/8994210098</guid><pubDate>Tue, 16 Aug 2011 14:33:00 +0200</pubDate><category>mysql</category></item><item><title>MySQL "Using index" in EXPLAIN's extra column</title><description>&lt;p&gt;When you see &lt;code&gt;Using Index&lt;/code&gt; showing up in &lt;code&gt;Extra&lt;/code&gt; column of &lt;code&gt;EXPLAIN&lt;/code&gt; output, it means &lt;strong&gt;a covering index&lt;/strong&gt; is used, it is MySQL is able to locate every field for a given table within an index without lookups to table itself.&lt;/p&gt;
&lt;p&gt;It&amp;#8217;s simply another reason to re-consider using asterisks (&lt;code&gt;*&lt;/code&gt;) in &lt;code&gt;SELECT&lt;/code&gt; statements.&lt;/p&gt;
&lt;p&gt;Simplest example:&lt;/p&gt;
&lt;pre&gt;mysql&amp;gt; EXPLAIN SELECT * FROM people;
+----+-------------+--------+------+-...-+-------+
| id | select_type | table  | type | ... | Extra |
+----+-------------+--------+------+-...-+-------|
|  1 | SIMPLE      | people | ALL  | ... |       |
+----+-------------+--------+------+-...-|-------+

mysql&amp;gt; EXPLAIN SELECT people_id FROM people;
+----+-------------+--------+-------+-...-+-------------+
| id | select_type | table  | type  | ... | Extra       |
+----+-------------+--------+-------+-...-+-------------|
|  1 | SIMPLE      | people | index | ... | Using index |
+----+-------------+--------+-------+-...-|-------------+
&lt;/pre&gt;
&lt;p&gt;It can be also very handy when using joins, and don&amp;#8217;t really need data from one (or more) of joined columns.&lt;/p&gt;
&lt;p&gt;For me more stuff like this see Jay Pipes &amp;#8220;Target Practice: A Workshop in Tuning MySQL Queries&amp;#8221; (OSCON 2007).&lt;/p&gt;</description><link>http://logs.sobstel.org/post/8660548470</link><guid>http://logs.sobstel.org/post/8660548470</guid><pubDate>Tue, 09 Aug 2011 00:01:00 +0200</pubDate><category>mysql</category></item><item><title>Regexp: string followed by and preceded by</title><description>&lt;p&gt;Regular expressions are full of features (who can learn it all? or read off and understand a few days after it was written?). One of them is possibility to check if desired match is followed or preceded by given pattern.&lt;/p&gt;
&lt;p&gt;
&lt;script src="https://gist.github.com/1042677.js?file=regex_look_ahead_and_behind.rb"&gt;&lt;/script&gt;&lt;/p&gt;
&lt;p&gt;It works also in PHP.&lt;/p&gt;</description><link>http://logs.sobstel.org/post/6827431057</link><guid>http://logs.sobstel.org/post/6827431057</guid><pubDate>Thu, 23 Jun 2011 17:00:00 +0200</pubDate><category>regexp</category><category>ruby</category><category>php</category></item><item><title>JavaScript inspect/dump made easy</title><description>&lt;p&gt;Was ever looking for JavaScript equivalent of PHP&amp;#8217;s &lt;code&gt;var_dump()&lt;/code&gt; or Ruby&amp;#8217;s &lt;code&gt;inspect&lt;/code&gt; (or &lt;code&gt;p&lt;/code&gt; or &lt;code&gt;pp&lt;/code&gt; or &lt;code&gt;y&lt;/code&gt; or&amp;#8230; etc)?&lt;/p&gt;
&lt;p&gt;Forget it! You have it by your hand available in Chrome developer tools and Firefox&amp;#8217;s firebug. Just type it into console and you get beautifuly browseable dump.&lt;/p&gt;
&lt;p&gt;Chrome:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_lmhg9jyNHb1qfq7vx.jpg"/&gt;&lt;/p&gt;
&lt;p&gt;Firefox:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_lmhg9rwdfN1qfq7vx.jpg"/&gt;&lt;/p&gt;</description><link>http://logs.sobstel.org/post/6325168789</link><guid>http://logs.sobstel.org/post/6325168789</guid><pubDate>Wed, 08 Jun 2011 19:55:51 +0200</pubDate><category>javascript</category></item><item><title>PDO: grouping results to indexed associative array</title><description>&lt;p&gt;Ever wondered how to group database results by first column in PHP? It&amp;#8217;s pretty simple with PDO.&lt;/p&gt;
&lt;p&gt;
&lt;script src="https://gist.github.com/1001068.js?file=pdo_group_results.php"&gt;&lt;/script&gt;&lt;/p&gt;</description><link>http://logs.sobstel.org/post/6043708447</link><guid>http://logs.sobstel.org/post/6043708447</guid><pubDate>Tue, 31 May 2011 21:08:15 +0200</pubDate><category>php</category><category>pdo</category></item><item><title>PHP: accessing private members of objects of same type</title><description>&lt;p&gt;From PHP manual: &lt;em&gt;Objects of the same type will have access to each others private and protected members even though they are not the same instances.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;And example from the manual:&lt;/p&gt;
&lt;p&gt;
&lt;script src="https://gist.github.com/976185.js?file=accessing_private.php"&gt;&lt;/script&gt;&lt;/p&gt;</description><link>http://logs.sobstel.org/post/5572126972</link><guid>http://logs.sobstel.org/post/5572126972</guid><pubDate>Tue, 17 May 2011 11:14:30 +0200</pubDate><category>php</category></item><item><title>PHP new ternary operator gotcha</title><description>&lt;p&gt;
&lt;script src="https://gist.github.com/969179.js?file=ternary_operator_gotcha.php"&gt;&lt;/script&gt;&lt;/p&gt;</description><link>http://logs.sobstel.org/post/5426145475</link><guid>http://logs.sobstel.org/post/5426145475</guid><pubDate>Thu, 12 May 2011 20:46:08 +0200</pubDate><category>php</category></item><item><title>MySQL fast data load</title><description>&lt;p&gt;
&lt;script src="https://gist.github.com/961414.js?file=mysql_fast_load.sql"&gt;&lt;/script&gt;&lt;/p&gt;</description><link>http://logs.sobstel.org/post/5305334171</link><guid>http://logs.sobstel.org/post/5305334171</guid><pubDate>Sun, 08 May 2011 17:00:27 +0200</pubDate><category>mysql</category></item></channel></rss>

