<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/rss2full.xsl" type="text/xsl" media="screen"?><?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/itemcontent.css" type="text/css" media="screen"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>NeXt</title>
	
	<link>http://next.pixeldepo.com</link>
	<description>Нещо някакво такова, блога на Радослав Станков</description>
	<pubDate>Mon, 01 Dec 2008 11:20:18 +0000</pubDate>
	<generator>http://wordpress.org/?v=abc</generator>
	<language>en</language>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/pixeldepo/SoMF" type="application/rss+xml" /><item>
		<title>Как си изградих конфигурационната система за Control Depo 3</title>
		<link>http://feeds.feedburner.com/~r/pixeldepo/SoMF/~3/471203803/</link>
		<comments>http://next.pixeldepo.com/2008/12/01/%d0%ba%d0%b0%d0%ba-%d1%81%d0%b8-%d0%b8%d0%b7%d0%b3%d1%80%d0%b0%d0%b4%d0%b8%d1%85-%d0%ba%d0%be%d0%bd%d1%84%d0%b8%d0%b3%d1%83%d1%80%d0%b0%d1%86%d0%b8%d0%be%d0%bd%d0%bd%d0%b0%d1%82%d0%b0-%d1%81%d0%b8/#comments</comments>
		<pubDate>Mon, 01 Dec 2008 08:05:00 +0000</pubDate>
		<dc:creator>Radoslav Stankov</dc:creator>
		
		<category><![CDATA[Coding]]></category>

		<category><![CDATA[Learn]]></category>

		<category><![CDATA[PHP]]></category>

		<category><![CDATA[Control Depo]]></category>

		<category><![CDATA[inside look]]></category>

		<category><![CDATA[Pixeldepo]]></category>

		<category><![CDATA[tip]]></category>

		<guid isPermaLink="false">http://next.pixeldepo.com/?p=672</guid>
		<description><![CDATA[Работейки по новата ми CMS система - Control Depo 3 ми се наложи да имам малко по advanced конфигурационен файл, така че за в бъдеще да ми е по-лесно да се наместват различните части на системата. Преди ползвах стандартното за едно PHP приложение - един файл config.php:


// start config
$_CONFIG = array();

// database
$_CONFIG[&#039;db_host&#039;] = &#039;localhost&#039;;
$_CONFIG[&#039;db_name&#039;] = [...]]]></description>
			<content:encoded><![CDATA[<p>Работейки по новата ми CMS система - <a title="Pixel Depo Studio :: Products &amp; Services :: CMS Control Depo" href="http://www.pixeldepo.com/index.php/en/info/Control_Depo" target="_blank">Control Depo 3</a> ми се наложи да имам малко по advanced конфигурационен файл, така че за в бъдеще да ми е по-лесно да се наместват различните части на системата. Преди ползвах стандартното за едно PHP приложение - един файл config.php:</p>
<pre name="code" class="php">

// start config
$_CONFIG = array();

// database
$_CONFIG[&#039;db_host&#039;] = &#039;localhost&#039;;
$_CONFIG[&#039;db_name&#039;] = &#039;project&#039;;
$_CONFIG[&#039;db_user&#039;] = &#039;root&#039;;
$_CONFIG[&#039;db_pass&#039;] = &#039;password&#039;;

// languages
$_CONFIG[&#039;default_language&#039;] = &#039;bg&#039;;
$_CONFIG[&#039;laguages&#039;] = array(&#039;bg&#039; =&gt; 1, &#039;en&#039; =&gt; 2, /* ... */);

// session
$_CONFIG[&#039;session_salt&#039;] = &#039;SD23aeda&#039;;
$_CONFIG[&#039;session_expire&#039;] = 4*60*60;
// ... и така много много реда код
</pre>
<p>После тази глобална променлива( $_CONFIG) когато ми трябва се вика със <a title="PHP: Variable scope - Manual" href="http://bg2.php.net/global" target="_blank">global</a> и се ползва. Обаче от една страна че не е много красиво така написано, но от друга и това с global просто прави кода малко разхвърлян(на английски имат страхотна дума за това - messy) .</p>
<p>Това което ми трябваше основно е може да имам няколко enviroment конфигурационни файла подобно на <a title="Ruby on Rails" href="http://www.rubyonrails.org/" target="_blank">Rails</a>. Другото важно нещо беше да се побира в един екран, така че да не се налага да скролирам и да мога с един поглед да виждам всичко което ми трябва. И естествено да не е много сложно и да работи достатъчно бързо.</p>
<p>Първо погледнах <a title="Zend Framework: Documentation - Zend_Config" href="http://framework.zend.com/manual/en/zend.config.html" target="_blank">Zend_Config</a>, защо все пак са component-based-framework и може директно да видя как работи конфигурационната им система. И общо взето това което видях не ми хареса въобще. Много ми напомня на <a title="LEGOs, Play-Doh, and Programming November 09" href="http://weblog.jamisbuck.org/2008/11/9/legos-play-doh-and-programming" target="_blank">LEGOs, Play-Doh, and Programming</a> от <a title="Jamis Buck weblog" href="http://weblog.jamisbuck.org/" target="_blank">Jamis Buck</a>, за която бях писал преди <a title="Няколко интересни неща | NeXt" href="http://next.pixeldepo.com/2008/11/14/%D0%BD%D1%8F%D0%BA%D0%BE%D0%BB%D0%BA%D0%BE-%D0%B8%D0%BD%D1%82%D0%B5%D1%80%D0%B5%D1%81%D0%BD%D0%B8-%D0%BD%D0%B5%D1%89%D0%B0/" target="_blank">време</a>(даже има я <a title="Confreaks: RubyConf 2008 - Recovering from Enterprise" href="http://rubyconf2008.confreaks.com/recovering-from-enterprise.html" target="_blank">качена</a> на видео в <a title="confreaks" href="http://www.confreaks.com/" target="_blank">confreaks</a> заедно с цялото <a title="Confreaks: RubyConf 2008" href="http://rubyconf2008.confreaks.com/" target="_blank">rubyconf 2008</a>).<br />
От една страна колко пъти ще искам да ползвам XML и INI за конфигурация?! От една страна php си има <a title="PHP Array" href="http://bg2.php.net/manual/en/language.operators.array.php" target="_blank">array()</a>, с която идеално може да се запишат всички неща който ни трябват и да са достатъчно четими. От друга самото четене на огромен xml/ini/yml/&#8230; файл отнема време и ресурси и са доста по-бавни от прост php код.</p>
<p>Добре че поне тук от Zend са сложили подразбиране да се ползва само php масив. Но от тук дойде 2рото ми учудване. Това а именно самата работа на имплементация на  <a title="Zend Framework: Documentation - Zend_Config" href="http://framework.zend.com/manual/en/zend.config.html" target="_blank">Zend_Config</a>. Идеята е доста проста подава се масив, който се обгръща(wrap) от Zend_Config обект и след това се работи само със Zend_Config обект. Пример:</p>
<pre name="code" class="php">

// Create the object-oriented wrapper upon the configuration data
$config = new Zend_Config(array(
    &#039;webhost&#039;  =&gt; &#039;www.example.com&#039;,
    &#039;database&#039; =&gt; array(
        &#039;adapter&#039;   =&gt; &#039;pdo_mysql&#039;,
        &#039;params&#039;    =&gt; array(
            &#039;host&#039;      =&gt; &#039;db.example.com&#039;,
            &#039;username&#039;  =&gt; &#039;dbuser&#039;,
            &#039;password&#039;  =&gt; &#039;secret&#039;,
            &#039;dbname&#039;    =&gt; &#039;mydatabase&#039;
        )
    )
));

// Print a configuration datum (results in &#039;www.example.com&#039;)
echo $config-&gt;webhost;

// Use the configuration data to connect to the database
$db = Zend_Db::factory($config-&gt;database-&gt;adapter,
$config-&gt;database-&gt;params-&gt;toArray());

// Alternative usage: simply pass the Zend_Config object.
// The Zend_Db factory knows how to interpret it.
$db = Zend_Db::factory($config-&gt;database);
</pre>
<p>Идеята като цяло е много хубава,  и при добро желание може човек да си направи основната част класовете му приемат Zend_Config обекти. Но има едно НО и то доста голямо. Защо ние е това? Единствения плюс който се сетих е че може да се направи <a title="Immutable object - Wikipedia, the free encyclopedia" href="http://en.wikipedia.org/wiki/Immutable_object" target="_blank">immutable</a> config обект. Но за сметка на това ще има доста излишен код и много памет за съхраниението на Zend_Config обекти и техните атрибути. А и колкото и да обичам __set/__get магиите тук ми се виждат напълно излишни защото както в примера:</p>
<pre name="code" class="php">

$config-&gt;database-&gt;params-&gt;toArray()
// Това би представлявало нещо такова като backtrace
$config-&gt;__get(&#039;database&#039;)   // магически се търси атрибута &#039;database&#039;
$config-&gt;_data[&#039;database&#039;]   // това което се връща тук пак е Zend_Config обект, който ще го нарека $object
$object-&gt;__get(&#039;params&#039;)     // пак същото за
$object-&gt;_data[&#039;params&#039;]     // друг $object
$object-&gt;toArray();          // автоматично всеки Zend_Config обект, който се стрещне му се вика Zend_Config::toArray()
$object-&gt;_data               // това за което ни трябва
</pre>
<p>Zend_Config си има и своите плюсове(immutable, секции, default стойности) и може за някое наистина &#8220;enterprise&#8221; приложение с много разчленена конфигурация (и много стабилен и мощен сървър <img src='http://next.pixeldepo.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> ) да върши работа. Но не е за мен и аз си предпочитам &#8220;голите&#8221; <a title="PHP Array" href="http://bg2.php.net/manual/en/language.operators.array.php" target="_blank">array()</a>. Все пак</p>
<blockquote><p>No code is faster than no code</p>
<p style="text-align: right;">- някъде го чух това.</p>
</blockquote>
<p>Така че какво реших ? Ами в предишния ми пост - <a title="PHP tips - include и return | NeXt" href="http://next.pixeldepo.com/2008/11/30/php-tips-include-%D0%B8-return/" target="_blank">PHP tips - include и return</a>, описах метода за връщане на стойности от php файл и реших него да ползвам плюс малко правила и подрежанки. Сега имам следните файлове:</p>
<ul>
<li>/config/config.php - тук ще е основната конфигурация</li>
<li>/config/enviroment/ - в тази папка ще се съдържат конфигурационните файлове за различните среди за работа, като стандартно имам 3 вида среди</li>
<li>/config/enviroment/development.php</li>
<li>/config/enviroment/test.php</li>
<li>/config/enviroment/production.php</li>
<li>/config/mailer.php - тук ще има конфигурация за mail системата, тя е изнесена в отделен файл, защото тук няма само да се връщат config данни, а и ще се вързва към <a title="Simple Mail Transfer Protocol - Wikipedia, the free encyclopedia" href="http://en.wikipedia.org/wiki/Simple_Mail_Transfer_Protocol" target="_blank">smtp</a> сървър  (ако трябва), ще се настройват достъпи и други подобни неща. За разлика от другите конфигурационни файлове mailer.php се вика само когато се налага да се изпращат писма не по-рано.</li>
<li>/config/routes.php - това са настройките ми за различните пътища, подобно на <a title="Ruby on Rails" href="http://www.rubyonrails.org/" target="_blank">Rails</a> (пак)</li>
</ul>
<p>Това са различните конфигурационни файлове (поне за сега).</p>
<pre name="code" class="php">

return array(
    &#039;database&#039;  =&gt; array(
        &#039;engine&#039;    =&gt; &#039;mysql&#039;,
        &#039;host&#039;      =&gt; &#039;localhost&#039;,
        &#039;name&#039;      =&gt; &#039;project&#039;,
        &#039;user&#039;      =&gt; &#039;root&#039;,
        &#039;pass&#039;      =&gt; &#039;password&#039;
    ),
    &#039;i18n&#039;      =&gt; array(
        &#039;default&#039;   =&gt; &#039;bg&#039;,
        &#039;languages&#039; =&gt; array(&#039;bg&#039; =&gt; 1, &#039;en&#039; =&gt; 2, /* ... */)
    ),
    &#039;session&#039;   =&gt; array(
        &#039;engine&#039;    =&gt; &#039;cookie&#039;,
        &#039;salt&#039;      =&gt; &#039;vW34Aaasa&#039;,
        &#039;expire&#039;    =&gt; 4*60*60
    ), // на последния ред имам , защото при добавяне на нов ред да не ми се налага да я слагам
    // а и SVN/Git ще го сметне като изтрит ред и после добавен ред
    // ... още конфигурация ...
);
// /config/enviroment/development.php - примерно
return array(
    &#039;database&#039;  =&gt; array(
        &#039;engine&#039;    =&gt; &#039;mysql&#039;,
        &#039;host&#039;      =&gt; &#039;localhost&#039;,
        &#039;user&#039;      =&gt; &#039;root&#039;,
        &#039;pass&#039;      =&gt; &#039;&#039;,
        &#039;name&#039;      =&gt; &#039;project_dev&#039;
    ),
    &#039;smarty&#039;    =&gt; array(
        &#039;compile_check&#039;     =&gt; true,
        &#039;force_compile&#039;     =&gt; false,
        &#039;debugging&#039;         =&gt; false,
        &#039;caching&#039;           =&gt; false,
        &#039;cache_lifetime&#039;    =&gt; 0
    ),
    &#039;logging&#039;           =&gt; true,
    &#039;display_errors&#039;    =&gt; 1,
);
</pre>
<p>А в bootstrap-а имам просто това</p>
<pre name="code" class="php">

// ENVIROMENT е просто константа в която казва в кой режим на работа е приложението
$_CONFIG = array_merge_recursive(include($_CFGDIR . &#039;/config.php&#039;), include($_CFGDIR . &#039;/enviroments/&#039; . ENVIROMENT . &#039;.php&#039;));

// ... код ...
// общо взето извличам всичко което ми трябва от $_CONFIG и го разпределям по обекти
// така че да не ми трябва повече $_CONFIG
// ... код ...

unset($_CONFIG /* заедно с още няколко вече не потребни ми променливи */);
</pre>
<p>Това решение ми се вижда най-елегантно, в моя случай. Може и да не може да се нарече &#8220;система&#8221; но е достатъчно надежно и ефективно да ми свърши работа. Все пак съм фен на <a title="Convention over configuration - Wikipedia, the free encyclopedia" href="http://en.wikipedia.org/wiki/Convention_over_Configuration" target="_blank">Convention over configuration</a> И ако ми се наложи да имам подобен на Zend_Config обект, с които да работя мисля да не променям основните неща, а просто този обект да използва <a title="SPL-StandardPHPLibrary: ArrayAccess Interface Reference" href="http://www.php.net/~helly/php/ext/spl/interfaceArrayAccess.html" target="_blank">ArrayAccess</a>, но за това друг път, че сега май малко по-дълго стана от плануваното.</p>
<p>Надявам се някой да намери този пост полезен и ако съвети и идеи ще се радвам да ги чуя <img src='http://next.pixeldepo.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .</p>
]]></content:encoded>
			<wfw:commentRss>http://next.pixeldepo.com/2008/12/01/%d0%ba%d0%b0%d0%ba-%d1%81%d0%b8-%d0%b8%d0%b7%d0%b3%d1%80%d0%b0%d0%b4%d0%b8%d1%85-%d0%ba%d0%be%d0%bd%d1%84%d0%b8%d0%b3%d1%83%d1%80%d0%b0%d1%86%d0%b8%d0%be%d0%bd%d0%bd%d0%b0%d1%82%d0%b0-%d1%81%d0%b8/feed/</wfw:commentRss>
		<feedburner:origLink>http://next.pixeldepo.com/2008/12/01/%d0%ba%d0%b0%d0%ba-%d1%81%d0%b8-%d0%b8%d0%b7%d0%b3%d1%80%d0%b0%d0%b4%d0%b8%d1%85-%d0%ba%d0%be%d0%bd%d1%84%d0%b8%d0%b3%d1%83%d1%80%d0%b0%d1%86%d0%b8%d0%be%d0%bd%d0%bd%d0%b0%d1%82%d0%b0-%d1%81%d0%b8/</feedburner:origLink></item>
		<item>
		<title>PHP tips - include и return</title>
		<link>http://feeds.feedburner.com/~r/pixeldepo/SoMF/~3/470597454/</link>
		<comments>http://next.pixeldepo.com/2008/11/30/php-tips-include-%d0%b8-return/#comments</comments>
		<pubDate>Sun, 30 Nov 2008 20:52:13 +0000</pubDate>
		<dc:creator>Radoslav Stankov</dc:creator>
		
		<category><![CDATA[Coding]]></category>

		<category><![CDATA[Learn]]></category>

		<category><![CDATA[PHP]]></category>

		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://next.pixeldepo.com/?p=668</guid>
		<description><![CDATA[Изненадващо е колко много хора не знаят, че в PHP файловете може да връщат резултат с return, който може да бъде прочетен с include / require. Даже го има и в документацията на PHP, eто пример:


// file1.php
return array(&#039;key&#039; =&#62; &#039;value&#039;);

// file2.php
$arr = include &#039;file1.php&#039;;

echo $arr[&#039;key&#039;];

// резултат: value

Като тук вместо include, може да се използва require [...]]]></description>
			<content:encoded><![CDATA[<p>Изненадващо е колко много хора не знаят, че в PHP файловете може да връщат резултат с return, който може да бъде прочетен с include / require. Даже го има и в <a title="PHP: include - Manual" href="http://bg2.php.net/manual/en/function.include.php" target="_blank">документацията</a> на PHP, eто пример:</p>
<pre name="code" class="php">

// file1.php
return array(&#039;key&#039; =&gt; &#039;value&#039;);

// file2.php
$arr = include &#039;file1.php&#039;;

echo $arr[&#039;key&#039;];

// резултат: value
</pre>
<p>Като тук вместо include, може да се използва require (единствената разлика между двете е грешката, която възниква при проблем с отварянето на файла). Но аз лично предпочитам да използва include само когато php скрипта връща резултат, a require когато добавям нещо.</p>
<p>Тук трябва да се обърне внимание на 2 неща:</p>
<ol>
<li>require_once / include_once ако има return връщат стойност само първия път в който са извикани, а после нищо не връщат. Но те по принцип е добре да се избягват, особено ако се връща резултат</li>
<li>всяка променлива / функция / клас / &#8230; която е била декларирана във include файла (file1.php в примера) си остава записана и достъпна. Така че ако в file1 се декларира $name = &#8216;Radoslav&#8217;; например във file2.php, $name ще е пак &#8216;Radoslav&#8217;. Затова е добре да се <a title="PHP: unset - Manual" href="http://bg2.php.net/unset" target="_blank">unset</a> -ват всички ненужни глобални променливи, които не са нужни</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://next.pixeldepo.com/2008/11/30/php-tips-include-%d0%b8-return/feed/</wfw:commentRss>
		<feedburner:origLink>http://next.pixeldepo.com/2008/11/30/php-tips-include-%d0%b8-return/</feedburner:origLink></item>
		<item>
		<title>ControlDepo 3 Widgets - Behaviors Част II</title>
		<link>http://feeds.feedburner.com/~r/pixeldepo/SoMF/~3/454305824/</link>
		<comments>http://next.pixeldepo.com/2008/11/15/controldepo-3-widgets-behaviors-%d1%87%d0%b0%d1%81%d1%82-ii/#comments</comments>
		<pubDate>Sat, 15 Nov 2008 20:44:57 +0000</pubDate>
		<dc:creator>Radoslav Stankov</dc:creator>
		
		<category><![CDATA[Control Depo]]></category>

		<category><![CDATA[Javascript]]></category>

		<guid isPermaLink="false">http://next.pixeldepo.com/?p=625</guid>
		<description><![CDATA[Това е втория пост за ControlDepo 3 Widgets - Behaviors (по план имам още един  ).
Преди време ми се наложи да &#8220;освежавам&#8221; един стар проект използващ една от първите версии на CD3.Behaviors. Тази стара версия имаше само нормален селектор &#124; event-селектори. Там забелязах че много често ползвам pattern (това ако някой на български ми [...]]]></description>
			<content:encoded><![CDATA[<p>Това е втория пост за <a title="Controldepo 3 Widgets" href="http://github.com/RStankov/controldepo-3-widgets" target="_blank">ControlDepo 3 Widgets</a> - <a title="ControlDepo 3 Widgets - Behaviors" href="http://github.com/RStankov/controldepo-3-widgets/tree/master/src/behaviors.js" target="_blank">Behaviors</a> (по план имам още един <img src='http://next.pixeldepo.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> ).</p>
<p>Преди време ми се наложи да &#8220;освежавам&#8221; един стар проект използващ една от първите версии на CD3.Behaviors. Тази стара версия имаше само <a href="../2008/10/03/controldepo-3-widgets-behaviors-%d1%87%d0%b0%d1%81%d1%82-i/#selector">нормален селектор</a> | <a href="../2008/10/03/controldepo-3-widgets-behaviors-%d1%87%d0%b0%d1%81%d1%82-i/#event-selector">event-селектори</a>. Там забелязах че много често ползвам pattern (това ако някой на български ми го каже как е, ще съм много благодарен) а именно:</p>
<pre name="code" class="javascript">

CD3.Behavoirs({
	&#039;#container&#039;: function(contaner){
		contener.select(&#039;a&#039;).invoke(&#039;click&#039;, doSomeAction);
		contaner.select(&#039;a&#039;).invoke(&#039;mouseover&#039;, doSomeOtherAction);
		// .. и така си избирам всичките под елементи на #container и да им добавям event handler
	}
});
</pre>
<p>Това е примерен код за простичка javascript галерия, която има два бутона предишна / следваща картинка както и списък с thumbnail-и от който пак може да се покаже голямата снимка.  selectImage просто от a таг взема href атрибута и го показва като снимка с ефект и т.н, но то не е важното в случая.</p>
<pre name="code" class="javascript">

CD3.Behaviors({
	// code
	&#039;#gallery&#039;: function(){
		// при натискане на стрелката за предишна снимка да ...
		this.down(&#039;a.prev&#039;).observe(&#039;click&#039;, function(){
			var thumbs	 = $(&#039;thumbs&#039;),
				selected = thumbs.down(&#039;a.selected&#039;);

			// покажи или предишнина или послената снимка
			selectImage(((selected &amp;amp;amp;amp;amp;&amp;amp;amp;amp;amp; selected.up(&#039;li&#039;).previous(&#039;li&#039;)) || thumbs.select(&#039;li&#039;).last()).down(&#039;a&#039;));
		});

		// при натискане на стрелката за следваща снимка да ...
		this.down(&#039;a.next&#039;).observe(&#039;click&#039;, function(){
			var thumbs	 = $(&#039;thumbs&#039;),
				selected = thumbs.down(&#039;a.selected&#039;);

			// покажи следващата или първата снимка
			selectImage(((selected &amp;amp;amp;amp;amp;&amp;amp;amp;amp;amp; selected.up(&#039;li&#039;).next(&#039;li&#039;)) || thumbs.select(&#039;li&#039;).first()).down(&#039;a&#039;));
		});

		// тук правя много прост event delegation
		// избирам натиснатия a таг и викам selectImage с него
		$(&#039;thumbs&#039;).observe(&#039;click&#039;, function(e){
			e.stop();
			var a = e.findElement(&#039;a&#039;);
			if (a) selectImage(a);
		});
	}
	// code
});
</pre>
<p>Естествено някой от случаите могат да бъдат избегнати с  <a href="../2008/10/03/controldepo-3-widgets-behaviors-%d1%87%d0%b0%d1%81%d1%82-i/#event-delegation">event-delegation</a> | <a href="../2008/10/03/controldepo-3-widgets-behaviors-%d1%87%d0%b0%d1%81%d1%82-i/#class-init">инстанциране на класове</a>, но  ми дойде друга, по-добра (според мен) идея. Добавих нов метод към <a href="../2008/10/03/controldepo-3-widgets-behaviors-%d1%87%d0%b0%d1%81%d1%82-i/#class-init">CD3.Behavoirs</a> - when. CD3.Behavios.when приема 2 параметъра 1вия е selector, а другия е hash object с behavoirs. Идеята се намерят елементи отговарящи на подадения селектор, се добавят и съответните behavoirs. Единственото по особеност тук е че selector-ите на behavoir-ите не се търсят в контекста на document а в контекста на елемента на който отговаря selectora подаден като първи аргумент.</p>
<p>И така със CD3.Behavios.when примера със новинарската джаджа изглежда така:</p>
<pre name="code" class="javascript">

// ако съществува елементи #galley
// добави слените behaviors от контекста на #gallery
CD3.Behaviors.when(&#039;#gallery&#039;, {
	// при натискане на стрелката за предишна снимка да ...
	&#039;a.prev:click&#039;: function(){
		var thumbs	 = $(&#039;thumbs&#039;),
			selected = thumbs.down(&#039;a.selected&#039;);

		// покажи или предишнина или послената снимка
		selectImage(((selected &amp;amp;amp;amp;amp;&amp;amp;amp;amp;amp; selected.up(&#039;li&#039;).previous(&#039;li&#039;)) || thumbs.select(&#039;li&#039;).last()).down(&#039;a&#039;));
	},
	// при натискане на стрелката за следваща снимка да ...
	&#039;a.next:click&#039;: function(){
		var thumbs	 = $(&#039;thumbs&#039;),
			selected = thumbs.down(&#039;a.selected&#039;);

		// покажи следващата или първата снимка
		selectImage(((selected &amp;amp;amp;amp;amp;&amp;amp;amp;amp;amp; selected.up(&#039;li&#039;).next(&#039;li&#039;)) || thumbs.select(&#039;li&#039;).first()).down(&#039;a&#039;));
	},
	// избирам натиснатия a таг и викам selectImage с него
	&#039;thumbs:click&#039;: {
		a: function(е){
			е.stop();
			selectImage(this);
		}
	}
});
</pre>
<p>Както се вижда кода е почти същия но сега изглежда доста по-добре и по-четим. В последните ми няколко по-натоварени с javascript проекти си структурирам джаджите в отделни извиквания на when и нещата изглеждат доста добре.</p>
]]></content:encoded>
			<wfw:commentRss>http://next.pixeldepo.com/2008/11/15/controldepo-3-widgets-behaviors-%d1%87%d0%b0%d1%81%d1%82-ii/feed/</wfw:commentRss>
		<feedburner:origLink>http://next.pixeldepo.com/2008/11/15/controldepo-3-widgets-behaviors-%d1%87%d0%b0%d1%81%d1%82-ii/</feedburner:origLink></item>
		<item>
		<title>Няколко интересни неща</title>
		<link>http://feeds.feedburner.com/~r/pixeldepo/SoMF/~3/453214146/</link>
		<comments>http://next.pixeldepo.com/2008/11/14/%d0%bd%d1%8f%d0%ba%d0%be%d0%bb%d0%ba%d0%be-%d0%b8%d0%bd%d1%82%d0%b5%d1%80%d0%b5%d1%81%d0%bd%d0%b8-%d0%bd%d0%b5%d1%89%d0%b0/#comments</comments>
		<pubDate>Fri, 14 Nov 2008 18:31:55 +0000</pubDate>
		<dc:creator>Radoslav Stankov</dc:creator>
		
		<category><![CDATA[Internet]]></category>

		<category><![CDATA[интересно]]></category>

		<category><![CDATA[петък]]></category>

		<guid isPermaLink="false">http://next.pixeldepo.com/?p=632</guid>
		<description><![CDATA[Месец Ноември е може би най-омразния ми месец в годината, винаги в този месец ми се струпват страшно много неща на главата и времето все не стига.  Като нагледно доказателство за недостига ми на време е, че този месец нямам нито един пост ! Така, че намерих днес малко време след тежката седмица и реших [...]]]></description>
			<content:encoded><![CDATA[<p>Месец Ноември е може би най-омразния ми месец в годината, винаги в този месец ми се струпват страшно много неща на главата и времето все не стига.  Като нагледно доказателство за недостига ми на време е, че този месец нямам нито един пост ! Така, че намерих днес малко време след тежката седмица и реших да напиша за няколко неща който мернах през седмицата.</p>
<p><strong>Петък, 7ми Ноември 2008</strong>: <a title="Worst. Bug. Ever." href="http://blogs.zdnet.com/Burnette/?p=680" target="_blank">ZDNet: Worst. Bug. Ever.</a></p>
<blockquote><p>Save anything you’re working on (this will reboot your phone!), open the keyboard tray on your G1, ignore anything you see on the screen, and type these 8 keystrokes: &lt;return&gt;-r-e-b-o-o-t-&lt;return&gt;. Poof, your phone will reboot.</p></blockquote>
<p>Доста страшно, нали?! Въпреки, че след една <a title="Audio From Black Hat USA 2008 | GNUCITIZEN" href="http://www.gnucitizen.org/blog/audio-from-black-hat-usa-2008/" target="_blank">презентация на Black Hat 2008</a>, която слушах през GNUCITIZEN, вече очаквам всичко.</p>
<p><strong>Неделя, 9ти </strong><strong>Ноември 2008</strong>: <a title="LEGOs, Play-Doh, and Programming November 09" href="http://weblog.jamisbuck.org/2008/11/9/legos-play-doh-and-programming" target="_blank">LEGOs, Play-Doh, and Programming</a></p>
<p>Чакайки да качат някъде видео от <a title="RubyCOnf 2008" href="http://rubyconf.org/" target="_blank">RubyConf 2008</a> с удоволствие прочетох поста на <a title="Jamis Buck weblog" href="http://weblog.jamisbuck.org/" target="_blank">Jamis Buck</a>, в който той по много интересен начин оплита Lego (едни от любимите ми играчки когато бях малък), <a title="Play-Doh" href="http://www.hasbro.com/playdoh/" target="_blank">Play-Doh</a> (никаква идея си нямах какво е), JAVA, Ruby (една от любимите ми играчки сега <img src='http://next.pixeldepo.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> ), <a title="Dependency Injection" href="http://en.wikipedia.org/wiki/Dependency_injection" target="_blank">Dependency Injection</a> и други. Наистина страхотен пост, няма търпение да го гледам като качат RubyConf 2008.<br />
<em>поне за сега може да се види само <a title="Rails Envi: Rubyconf 2008 in 90 Seconds" href="http://vimeo.com/2205956?pg=embed&amp;sec=2205956">Rubyconf 2008 in 90 Seconds</a></em></p>
<p><strong>Вторник, 11</strong><strong>ти </strong><strong>Ноември 2008</strong></p>
<p><a title="The New Yahoo! Front Page and YUI 3.0" href="http://yuiblog.com/blog/2008/11/11/frontpage-and-yui3/" target="_blank">The New Yahoo! Front Page and YUI 3.0</a></p>
<p style="text-align: center;"><img class="aligncenter" src="http://next.pixeldepo.com/wp-content/uploads/2008/11/metro.jpg" alt="Новия дизайн на yahoo" /></p>
<p>Изглежда доста по-добре от сегашната версия и дано скоро да го пуснат в употреба. Много е добре че компания като Yahoo решава тотално да сменя дизайна си. Въпреки че и Yahoo явно са на такава вълна като се има предвид промяната на <a title="del.icio.us" href="http://del.icio.us/rstankov" target="_blank">Del.icio.us</a>, който сега изглежда по-добре от всякога.<br />
В самия пост има още информация относно промяната.</p>
<p><a title="Say hello to Gmail voice and video chat" href="http://gmailblog.blogspot.com/2008/11/say-hello-to-gmail-voice-and-video-chat.html" target="_blank">Say hello to Gmail voice and video chat</a></p>
<p>Google не изостанаха от Yahoo и още същия ден публикуваха, че вече Gmail има и видео чат. Което е наистина страхотно, най-сетне ще може тотално да занемаря skype.<br />
Напоследък се забелязват доста ново въведения в Gmail, та нали все още е в Beta <img src='http://next.pixeldepo.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> . Това което е интересното в случая е че по-голямата част от новостите са под формите на plugin-и, като това ми напомня малко нa FaceBook -а платформата. Въпреки че все още не може ( до колкото знам ) хора извън google да пишат добавки за него, освен през <a title="Greasemonkey" href="https://addons.mozilla.org/firefox/addon/748" target="_blank">Greasemonkey</a>, но и това ще стане сигурно.</p>
<p><strong>Сряда, 12</strong><strong>ти </strong><strong>Ноември 2008</strong></p>
<p><a title="Why did Microsoft wait 7 years to fix SMBRelay attack flaw? | Zero Day | ZDNet.com " href="http://blogs.zdnet.com/security/?p=2165" target="_blank">Why did Microsoft wait 7 years to fix SMBRelay attack flaw?</a></p>
<p>Защо ли са чакали толкова ? Незнам. Просто това ми припомни че в университета имаше преди 1-2 седмици имаше презентация на Microsoft, на която не можах да присъствам. Най-интересното нещо, от нея обаче било че всеки присъствал получавал <a title="Stress ball" href="http://en.wikipedia.org/wiki/Stress_ball" target="_blank">Stress ball</a>, като подарък. И после ми казват че Microsoft не се грижат за своите клиенти <img src='http://next.pixeldepo.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> .<br />
<em>тези Stress ball-и се оказали доста нежни, един познат .NET програмист вече тотално е унищожил своята</em></p>
<p><a title="Slashdot | Lego Loses Its Unique Right To Make Lego Blocks" href="http://entertainment.slashdot.org/article.pl?sid=08/11/12/1534206" target="_blank">Slashdot: Lego Loses Its Unique Right To Make Lego Blocks</a><br />
Това е просто възмутително, все едно да може друга фирма освен Apple да прави iPhone-и ?! На къде отива света :(  Е може и да има положителни неща, от това но някак си няма да е същото, не че съм си играл с Lego в поселените 7-8 години, но&#8230;</p>
<p><a title="My talk at the Business Innovation Factory 4 Conference" href="http://www.37signals.com/svn/posts/1394-my-talk-at-the-business-innovation-factory-4-conference" target="_blank">Signal vs Noise: My talk at the Business Innovation Factory 4 Conference</a></p>
<p>Видео от лекцията на Jason Fried в <a title="Business Innovation Factory" href="http://businessinnovationfactory.com/" target="_blank">Business Innovation Factory</a>, общо взето нищо ново не казва, ако сте гледали 2-3 предишни негови появи, няма да ви изненада много. Това което е по-интересно в случая са <a title="Business Innovation Factory | BIF-4 Collaborative Innovation Summit" href="http://www.businessinnovationfactory.com/innovationstorystudio/bif4.php" target="_blank">другите лекции от Business Innovation Factory</a>.<br />
Направи ми и впечатления част от коментарите, относно Jason Fried и начина му на изразяване, особено частта със &#8220;лошите&#8221; думи, както ги наричат.</p>
<blockquote><p>The whole &#8220;language for emphasis&#8221; things is dead. Now it just reeks of arrogance. &#8220;I’m so important, I don’t care who I offend. If you don’t like it, go away, I don’t need you.&#8221;</p></blockquote>
<p> <img src='http://next.pixeldepo.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> Доста забавни коментари имаше. Въпреки, че според мен малко преувеличават и май някои хора си търсят само с какво да се заядат.</p>
<p><a title="Paulo Coelho on Plurk!" href="http://amix.dk/blog/viewEntry/19364" target="_blank">Paulo Coelho on Plurk!</a></p>
<p><a title="Plurk" href="http://www.plurk.com/" target="_blank"><img src="http://next.pixeldepo.com/wp-content/uploads/2008/11/plurk.jpg" alt="Plurk" width="218" height="134" align="left" /></a></p>
<p style="text-align: left;">Колко е хубаво да видиш, че все повече хора са в социалните мрежи, и че можеш само с едно натискане да ги сложиш като приятели <img src='http://next.pixeldepo.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> А и една такава известна личност доста ще помогне на <a title="Plurk" href="http://www.plurk.com/" target="_blank">Plurk</a>, да се бори успешно с Twitter само едно добро публично api и трябва.</p>
]]></content:encoded>
			<wfw:commentRss>http://next.pixeldepo.com/2008/11/14/%d0%bd%d1%8f%d0%ba%d0%be%d0%bb%d0%ba%d0%be-%d0%b8%d0%bd%d1%82%d0%b5%d1%80%d0%b5%d1%81%d0%bd%d0%b8-%d0%bd%d0%b5%d1%89%d0%b0/feed/</wfw:commentRss>
		<feedburner:origLink>http://next.pixeldepo.com/2008/11/14/%d0%bd%d1%8f%d0%ba%d0%be%d0%bb%d0%ba%d0%be-%d0%b8%d0%bd%d1%82%d0%b5%d1%80%d0%b5%d1%81%d0%bd%d0%b8-%d0%bd%d0%b5%d1%89%d0%b0/</feedburner:origLink></item>
		<item>
		<title>Какво може да се купи с 30 милиона</title>
		<link>http://feeds.feedburner.com/~r/pixeldepo/SoMF/~3/436837713/</link>
		<comments>http://next.pixeldepo.com/2008/10/30/%d0%ba%d0%b0%d0%ba%d0%b2%d0%be-%d0%bc%d0%be%d0%b6%d0%b5-%d0%b4%d0%b0-%d1%81%d0%b5-%d0%ba%d1%83%d0%bf%d0%b8%d1%88-%d1%81%d1%8a%d1%81-30-%d0%bc%d0%b8%d0%bb%d0%b8%d0%be%d0%bd%d0%b0/#comments</comments>
		<pubDate>Thu, 30 Oct 2008 11:30:22 +0000</pubDate>
		<dc:creator>Radoslav Stankov</dc:creator>
		
		<category><![CDATA[Football]]></category>

		<guid isPermaLink="false">http://next.pixeldepo.com/?p=627</guid>
		<description><![CDATA[&#8216;
Няма такъв финт  Но за мен номер едно изпълнение на Бербатов, все още си е този гол срещу Рома в Шампионската лига:

]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=8,0,0,0" width="450" height="403"><param name="movie" value="http://i47.vbox7.com/player/ext.swf?vid=917a5f55"><param name="quality" value="high"><embed src="http://i47.vbox7.com/player/ext.swf?vid=917a5f55" quality="high" pluginspage="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" width="450" height="403"></embed></object>&#8216;</p>
<p>Няма такъв финт <img src='http://next.pixeldepo.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> Но за мен номер едно изпълнение на Бербатов, все още си е този гол срещу Рома в Шампионската лига:</p>
<p style="text-align: center;"><object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=8,0,0,0" width="450" height="403"><param name="movie" value="http://i47.vbox7.com/player/ext.swf?vid=a6ad2559"><param name="quality" value="high"><embed src="http://i47.vbox7.com/player/ext.swf?vid=a6ad2559" quality="high" pluginspage="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" width="450" height="403"></embed></object></p>
]]></content:encoded>
			<wfw:commentRss>http://next.pixeldepo.com/2008/10/30/%d0%ba%d0%b0%d0%ba%d0%b2%d0%be-%d0%bc%d0%be%d0%b6%d0%b5-%d0%b4%d0%b0-%d1%81%d0%b5-%d0%ba%d1%83%d0%bf%d0%b8%d1%88-%d1%81%d1%8a%d1%81-30-%d0%bc%d0%b8%d0%bb%d0%b8%d0%be%d0%bd%d0%b0/feed/</wfw:commentRss>
		<feedburner:origLink>http://next.pixeldepo.com/2008/10/30/%d0%ba%d0%b0%d0%ba%d0%b2%d0%be-%d0%bc%d0%be%d0%b6%d0%b5-%d0%b4%d0%b0-%d1%81%d0%b5-%d0%ba%d1%83%d0%bf%d0%b8%d1%88-%d1%81%d1%8a%d1%81-30-%d0%bc%d0%b8%d0%bb%d0%b8%d0%be%d0%bd%d0%b0/</feedburner:origLink></item>
		<item>
		<title>Видео за футболнитите съдии … или нещо друго</title>
		<link>http://feeds.feedburner.com/~r/pixeldepo/SoMF/~3/429986086/</link>
		<comments>http://next.pixeldepo.com/2008/10/23/%d0%b2%d0%b8%d0%b4%d0%b5%d0%be-%d0%b7%d0%b0-%d1%84%d1%83%d1%82%d0%b1%d0%be%d0%bb%d0%bd%d0%b8%d1%82%d0%b8%d1%82%d0%b5-%d1%81%d1%8a%d0%b4%d0%b8%d0%b8-%d0%b8%d0%bb%d0%b8-%d0%bd%d0%b5%d1%89%d0%be/#comments</comments>
		<pubDate>Thu, 23 Oct 2008 20:08:57 +0000</pubDate>
		<dc:creator>Radoslav Stankov</dc:creator>
		
		<category><![CDATA[Football]]></category>

		<guid isPermaLink="false">http://next.pixeldepo.com/?p=620</guid>
		<description><![CDATA[Преди 1-2 дни видях това в Gong.bg, свързани със съдийството и модерните технологии:
„ЯСТРЕБОВО ОКО“ И ВИДЕО ЗА ФУТБОЛНИТЕ СЪДИИ
Аз винаги съм имал малко по-особеност мнение по този въпрос. Общо взето всичко което съм чувал и чел като предложения за въвеждането на повторенията при спорни ситуации е следното: Да може капитана ( или треньора) на даден [...]]]></description>
			<content:encoded><![CDATA[<p>Преди 1-2 дни видях това в Gong.bg, свързани със съдийството и модерните технологии:</p>
<p style="text-align: center;"><a title="Гонг : Gong : „Ястребово око“ и видео за футболните съдии" href="http://gong.bg/view_article.php?article_id=59443" target="_blank">„ЯСТРЕБОВО ОКО“ И ВИДЕО ЗА ФУТБОЛНИТЕ СЪДИИ</a></p>
<p>Аз винаги съм имал малко по-особеност мнение по този въпрос. Общо взето всичко което съм чувал и чел като предложения за въвеждането на повторенията при спорни ситуации е следното: Да може капитана ( или треньора) на даден отбор да изисква до 3 повторения в мач, за да не се накъсва играта.</p>
<p>Моята идея е много по-проста - освен 3мата полеви съдии (главния и двамата странични), да има още двама съдии, които да седят при пултовете и да следят  целия мач и да си гледат повторения и други. Тези двама съдии да имат телеком връзка с главния и той да може да се съветва със тях. Тогава няма да се налага да има дълги паузи докато се гледа ситуацията и ще ограничи грешките до минимум. Гледането на повторения ще остане в &#8220;сянка&#8221; и няма да се натрапва в играта.</p>
<p>Това е моята идея, тя може да се по оформи още малко, да се изястнят 1-2-3 подробности. Но като цяло ми се вижда достатъчно разумна и същевременно лесна за прилагане идея. Но &#8230; този пост ще остане глас в пустиня.</p>
]]></content:encoded>
			<wfw:commentRss>http://next.pixeldepo.com/2008/10/23/%d0%b2%d0%b8%d0%b4%d0%b5%d0%be-%d0%b7%d0%b0-%d1%84%d1%83%d1%82%d0%b1%d0%be%d0%bb%d0%bd%d0%b8%d1%82%d0%b8%d1%82%d0%b5-%d1%81%d1%8a%d0%b4%d0%b8%d0%b8-%d0%b8%d0%bb%d0%b8-%d0%bd%d0%b5%d1%89%d0%be/feed/</wfw:commentRss>
		<feedburner:origLink>http://next.pixeldepo.com/2008/10/23/%d0%b2%d0%b8%d0%b4%d0%b5%d0%be-%d0%b7%d0%b0-%d1%84%d1%83%d1%82%d0%b1%d0%be%d0%bb%d0%bd%d0%b8%d1%82%d0%b8%d1%82%d0%b5-%d1%81%d1%8a%d0%b4%d0%b8%d0%b8-%d0%b8%d0%bb%d0%b8-%d0%bd%d0%b5%d1%89%d0%be/</feedburner:origLink></item>
		<item>
		<title>Цитати</title>
		<link>http://feeds.feedburner.com/~r/pixeldepo/SoMF/~3/423800669/</link>
		<comments>http://next.pixeldepo.com/2008/10/17/%d1%86%d0%b8%d1%82%d0%b0%d1%82%d0%b8/#comments</comments>
		<pubDate>Fri, 17 Oct 2008 15:21:37 +0000</pubDate>
		<dc:creator>Radoslav Stankov</dc:creator>
		
		<category><![CDATA[Fun]]></category>

		<category><![CDATA[петък]]></category>

		<guid isPermaLink="false">http://next.pixeldepo.com/?p=616</guid>
		<description><![CDATA[Изтъркаля се още една седмица. Днес успях най-сетне да си почистя feed rider-а и видях нещо доста интересно:
Favorite Programming Quotes 2008 
И се сетих, че и аз имам едно файлче &#8220;qoutes.txt&#8221; в което събирам интересни цитати и други подобни, ето и някои от тях ( тези, които са на Английски не съм ги превеждал, зада [...]]]></description>
			<content:encoded><![CDATA[<p>Изтъркаля се още една седмица. Днес успях най-сетне да си почистя feed rider-а и видях нещо доста интересно:</p>
<p style="text-align: center;"><strong><a title="Favorite Programming Quotes 2008 " href="http://www.juixe.com/techknow/index.php/2008/09/23/favorite-programming-quotes-2008/" target="_blank">Favorite Programming Quotes 2008 </a></strong></p>
<p>И се сетих, че и аз имам едно файлче &#8220;qoutes.txt&#8221; в което събирам интересни цитати и други подобни, ето и някои от тях ( тези, които са на Английски не съм ги превеждал, зада не се загуби смисъла им):</p>
<blockquote><p>I didn&#8217;t fail ten thousand times. I successfully eliminated, ten thousand times, materials and combinations which wouldn&#8217;t work.</p>
<p>I never perfected an invention that I did not think about in terms of the service it might give others.</p>
<p>I am more of a sponge than an inventor. I absorb ideas from every source. My principal business is giving commercial value to the brilliant but misdirected ideas of others</p>
<p>Time is really the only capital that any human being has, and the one thing that he can&#8217;t afford to lose.</p>
<p>I find out what the world needs. Then I go ahead and try to invent it.</p>
<p>I have more respect for the fellow with a single idea who gets there than for the fellow with a thousand ideas who does nothing.</p>
<p>Many of life&#8217;s failures are people who did not realize how close they were to success when they gave up.</p>
<p style="text-align: right;">- Thomas Edison</p>
</blockquote>
<blockquote><p>Единственото ново на света е историята, която не знаеш</p>
<p style="text-align: right;">- Хари Труман</p>
</blockquote>
<blockquote><p>In my experience, one of the most significant problems in software development is assuming. If you assume a method will passed the right parameter value, the method will fail.</p>
<p style="text-align: right;">– Paul M. Duvall, Continuous Integration</p>
</blockquote>
<blockquote><p>Programming languages are like girlfriends: The new one is better because *you* are better.</p>
<p style="text-align: right;">– Derek Sivers, 7 reasons I switched back to PHP after 2 years on Rails</p>
</blockquote>
<blockquote><p>The sooner we start coding fewer frameworks and more programs the sooner we&#8217;ll become better programmers.</p>
<p style="text-align: right;">– Warped Java Guy, Elementary Java Solutions</p>
</blockquote>
<blockquote><p>Starting a startup is hard, but having a 9 to 5 job is hard too, and in some ways a worse kind of hard.</p>
<p>In essence, let the market design the product.</p>
<p>A startup now can be just a pair of 22 year old guys. A company like that can move much more easily than one with 10 people, half of whom have kids.</p>
<p>Startups almost never get it right the first time. Much more commonly you launch something, and no one cares. Don&#8217;t assume when this happens that you&#8217;ve failed. That&#8217;s normal for<br />
startups. But don&#8217;t sit around doing nothing. Iterate.</p>
<p style="text-align: right;">– Paul Graham, How Not to Die</p>
</blockquote>
<blockquote><p>The key to performance is elegance, not battalions of special cases.</p>
<p style="text-align: right;">– Jon Bentley and Doug McIlroy</p>
</blockquote>
<blockquote><p>You&#8217;ll spend far more time babysitting old technologies than implementing new ones.</p>
<p style="text-align: right;">– Jason Hiner, IT Dirty Secrets</p>
</blockquote>
<blockquote><p>To Iterate is Human, to Recurse, Divine.</p>
<p style="text-align: right;">– James O. Coplien</p>
</blockquote>
<blockquote><p>No one hates software more than software developers.</p>
<p style="text-align: right;">– Jeff Atwood, Hanselminutes Podcast 74</p>
</blockquote>
<blockquote><p>I was a C++ programmer before I started designing Ruby. I programmed in C++ exclusively for two or three years. And after two years of C++ programming, it still surprised me.</p>
<p style="text-align: right;">– Matz, The Philosophy of Ruby</p>
</blockquote>
<blockquote><p>Good architecture is necessary to give programs enough structure to be able to grow large without collapsing into a puddle of confusion.</p>
<p>Programming is difficult. At its core, it is about managing complexity. Computer programs are the most complex things that humans make. Quality is illusive and elusive.</p>
<p>Code reuse is the Holy Grail of Software Engineering.</p>
<p>Most programming languages contain good parts and bad parts. I discovered that I could be better programmer by using only the good parts and avoiding the bad parts.</p>
<p>It turns out that strong typing does not eliminate the need for careful testing. And I have found in my work that the sorts of errors that strong type checking finds are no the errors I<br />
worry about.</p>
<p>Obsolete comments are worse than no comments.</p>
<p>Software is usually expected to be modified over the course of its productive life. The process of converting one correct program into a different correct program is extremely challenging.</p>
<p>Features have a specification cost, a design cost, and a development cost. There is a testing cost and a reliability cost. … Features have a documentation cost. Every feature adds pages to the manual increasing training costs.</p>
<p>Surprisingly, facts have very little to do with web development.</p>
<p>The structure of software systems tend to reflect the structure of the organization that produce them.</p>
<p style="text-align: right;">– Douglas Crockford, The Elements of JavaScript Style</p>
</blockquote>
<blockquote><p>The definition of Hell is working with dates in Java, JDBC, and Oracle. Every single one of them screw it up.</p>
<p style="text-align: right;">– Dick Wall, ommunityOne 2007: Lunch with the Java Posse</p>
</blockquote>
<blockquote><p>Suppose you went back to Ada Lovelace and asked her the difference between a script and a program. She&#8217;d probably look at you funny, then say something like: Well, a script is what you give the actors, but a program is what you give the audience.</p>
<p style="text-align: right;">– Larry Wall, Programming is Hard, Let&#8217;s Go Scripting…</p>
</blockquote>
<blockquote><p>I went to school to learn how to program software applications, which inevitably have bug defects. There was no course at my university on testing, debugging, profiling, or optimization. These things you have to learn on your own, usually in a tight deadline.</p>
<p>To most Java developers, Ruby/Rails is like a mistress. Ruby/Rails is young, new, and exciting; but eventually we go back to old faithful, dependable, and employable Java with some new tricks and idioms and we are the better programmer for it.</p>
<p>You might as well pay your customers 50K because they are just your QA.</p>
<p style="text-align: right;">– Juixe TechKnow</p>
</blockquote>
<blockquote><p>For a sucessful technology, honesty must take precedence over public relations for nature cannot be fooled.</p>
<p style="text-align: right;">- Richard Feynman</p>
</blockquote>
<blockquote><p>Before software can be reusable it first has to be usable.</p>
<p style="text-align: right;">- Ralph Johnson</p>
</blockquote>
<blockquote><p>Computers are good at following instructions, but not at reading your mind.</p>
<p style="text-align: right;">-Donald Knuth</p>
</blockquote>
<blockquote><p>If debugging is the process of removing bugs, then programming must be the process of putting them in.</p>
<p style="text-align: right;">- Edsger W. Dijkstra</p>
</blockquote>
<blockquote><p>Measuring programming progress by lines of code is like measuring aircraft building progress by weight.</p>
<p style="text-align: right;">- Bill Gates</p>
</blockquote>
<blockquote><p>And the users exclaimed with a laugh and a taunt: “It&#8217;s just what we asked for but not what we want.”</p>
<p>There are 10 kinds of people in this world….Those who understand binary and those who don&#8217;t.</p>
<p>Software and cathedrals are much the same - first we build them, then we pray.</p>
<p>Real Programmers don&#8217;t need comments—the code is obvious.</p>
<p style="text-align: right;">- [Неизвестен автор]</p>
</blockquote>
]]></content:encoded>
			<wfw:commentRss>http://next.pixeldepo.com/2008/10/17/%d1%86%d0%b8%d1%82%d0%b0%d1%82%d0%b8/feed/</wfw:commentRss>
		<feedburner:origLink>http://next.pixeldepo.com/2008/10/17/%d1%86%d0%b8%d1%82%d0%b0%d1%82%d0%b8/</feedburner:origLink></item>
		<item>
		<title>Announcements, Releases</title>
		<link>http://feeds.feedburner.com/~r/pixeldepo/SoMF/~3/423486242/</link>
		<comments>http://next.pixeldepo.com/2008/10/16/announcements-releases/#comments</comments>
		<pubDate>Thu, 16 Oct 2008 15:59:30 +0000</pubDate>
		<dc:creator>Radoslav Stankov</dc:creator>
		
		<category><![CDATA[Apple]]></category>

		<category><![CDATA[flash]]></category>

		<category><![CDATA[ria]]></category>

		<category><![CDATA[adobe]]></category>

		<category><![CDATA[Microsoft]]></category>

		<guid isPermaLink="false">http://next.pixeldepo.com/?p=594</guid>
		<description><![CDATA[Тези дни бях претрупан от работа, имах 2 deadline-а, семестъра в университета е в разгара си, просто страшна работа. И за това не съм писал от 4ти.
Днес малко се по освободих, предадох проектите, преборих се, до колкото мога с нашата образователна система. Но за малко да пропусна 3 важни събития: Adobe Flash Player 10, Новата [...]]]></description>
			<content:encoded><![CDATA[<p>Тези дни бях претрупан от работа, имах 2 deadline-а, семестъра в университета е в разгара си, просто страшна работа. И за това не съм писал от 4ти.</p>
<p style="text-align: left;">Днес малко се по освободих, предадох проектите, преборих се, до колкото мога с нашата образователна система. Но за малко да пропусна 3 важни събития: <a title="Adobe Flash Player 10" href="http://www.adobe.com/shockwave/download/download.cgi?P1_Prod_Version=ShockwaveFlash" target="_blank">Adobe Flash Player 10</a>, Новата серия <a title="Apple - MacBook Pro" href="http://www.apple.com/macbookpro/" target="_blank">MacBook</a>-ци на Apple и <a title="Microsoft Silverlight" href="http://silverlight.net/" target="_blank">Silverlight 2</a> (то 1 имаше ли ?!, шегувам се). То може и още важни неща да има (в Google Readera ми в момента има точно 290 не прочетени неща, като преди това поне 100-200 ги зачекнах направо). Но тези 3те доста ме впечатлиха.</p>
<p style="text-align: left; margin: 40px 0 40px 0;"><img src="http://next.pixeldepo.com/wp-content/uploads/2008/10/flash_cs3_logo.jpg" alt="flash_cs3_logo" align="right" />От доста време чакам Flash 10. Вече има native 3D, което значи че доста по-лесно от преди може да се преминава от 2D в 3D обект. И тъй като Adobe работиха и със доста от създателите на Flash 3D фраймуроци, резултатите са ясни - по-бързо и ефективни 3D-та. Друго ново е възможността да се записват файлове през флаша, което очаквам да стане източник на поне 3-4 security holes. Също има вече нов Text rendering engine. Много се надявам че flash player 10 до Коледа ще е покрил 85-90-95% flash потребителите, зада можем да се възползваме от цялата нова функционалност на flash 10. Adobe AIR още при следващият update ще мине на flash 10. Пълния списък с промените, добавките и bug fix-овете може да се види <a title="Adobe Flash Player 10 Release notes" href="http://www.adobe.com/support/documentation/en/flashplayer/10/Flash_Player_10_Release_Notes.pdf" target="_blank">тук</a>. Има го и на китайски, но на мен за сега ми стига само краткото review от <a title="SitePoint Blogs &amp;raquo; Adobe Releases Flash 10 Player" href="http://www.sitepoint.com/blogs/2008/10/15/adobe-releases-flash-10-player/" target="_blank">SitePoint</a>.</p>
<p><br style="clear: both;" /><br />
<img style="margin-right: 30px" src="http://next.pixeldepo.com/wp-content/uploads/2008/10/silverlight.jpg" alt="silverlight" align="left" /><a title="SitePoint Blogs &amp;raquo; Adobe Releases Flash 10 Player" href="http://www.sitepoint.com/blogs/2008/10/15/adobe-releases-flash-10-player/" target="_blank">Там</a> имаше много интересен коментар от <a href="http://www.sitepoint.com/blogs/2008/10/15/adobe-releases-flash-10-player/#comment-809745" target="_blank"><em>Lee,</em></a> който ме накара да се посмея малко <img src='http://next.pixeldepo.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> . Но и да погледна малко към <a title="Microsoft Silverlight" href="http://silverlight.net/" target="_blank">Silverlight 2</a>, единствения уж конкурент на Flash ( <a href="http://www.sun.com/software/javafx/" target="_blank">JavaFx</a> не го смятам още за нещо сериозен конкурент). Не че някои ден смятам да правя нещо на SilveLight, но знае ли човек. А там имаме:</p>
<ul style="text-align: left;">
<li><strong>Text rendering engine</strong></li>
<li><strong>Control Pack</strong> - нови компоненти  TextBox, ComboBox, StackPanel, Grid, Panel, ScrollViewer, Calendar, DatePicker &#8230; всичко стандартно</li>
<li><strong>.NET Framework</strong> - още повече интеграция с .NET</li>
<li><strong>Deep Zoom</strong></li>
</ul>
<p><em>&#8230; и други</em>, не ги <span style="text-decoration: line-through;">намерих</span> търсих в списък.</p>
<p><br style="clear: both;" /><br />
Вчера освен RIA технологиите, Apple също показаха че не спят и че ще имаме стабилни машини на които да подкарваме Flash приложенията ( Silverlight го нямам даже инсталиран ), а именно новия <a title="Apple - MacBook Pro" href="http://www.apple.com/macbookpro/" target="_blank">MacBookPro</a>:</p>
<p style="text-align: center;"><a title="Apple - MacBook Pro" href="http://www.apple.com/macbookpro/" target="_blank"><img class="aligncenter" src="http://next.pixeldepo.com/wp-content/uploads/2008/10/overview-hero.jpg" alt="" /></a></p>
<p>Тъкмо си мислех, че Apple няма как да го направят още по красив <img src='http://next.pixeldepo.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> Въпреки че като го гледам няма как да не се сетя за тази статия в Signal vs Noise:</p>
<p><a title="How Apple's small things influence their big things - (37signals)" href="http://www.37signals.com/svn/posts/565-how-apples-small-things-influence-their-big-things" target="_blank">How Apple&#8217;s small things influence their big things - (37signals)</a></p>
<p>На официялния сайт на <a title="Apple" href="http://www.apple.com/" target="_blank">Apple</a> може да видите видео от <a title="Apple - October 2008 Special Event" href="http://www.apple.com/quicktime/qtv/specialevent1008/" target="_blank">представянето</a> и малко <a title="Apple - The new MacBook - Video" href="http://www.apple.com/macbook/the-new-macbook/" target="_blank">клипче</a> за това как се произвеждат MacBook-сите.</p>
<p>п.п. Не си бях и поглеждал пощата от 4-5 дни и сега видях 2 писма дошли едно след друго:<br />
<img src="http://next.pixeldepo.com/wp-content/uploads/2008/10/https-_mailgooglecom_mail_-ui2viewbspver1qygpcgurkovy.png" alt="" /></p>
<p> <img src='http://next.pixeldepo.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> кои да избера ?! &#8230;. то е ясно.</p>
]]></content:encoded>
			<wfw:commentRss>http://next.pixeldepo.com/2008/10/16/announcements-releases/feed/</wfw:commentRss>
		<feedburner:origLink>http://next.pixeldepo.com/2008/10/16/announcements-releases/</feedburner:origLink></item>
		<item>
		<title>Малко JavaScript refactoring</title>
		<link>http://feeds.feedburner.com/~r/pixeldepo/SoMF/~3/423486243/</link>
		<comments>http://next.pixeldepo.com/2008/10/04/%d0%bc%d0%b0%d0%bb%d0%ba%d0%be-javascript-refactoring/#comments</comments>
		<pubDate>Sat, 04 Oct 2008 14:34:56 +0000</pubDate>
		<dc:creator>Radoslav Stankov</dc:creator>
		
		<category><![CDATA[Coding]]></category>

		<category><![CDATA[Control Depo]]></category>

		<category><![CDATA[Javascript]]></category>

		<category><![CDATA[Prototype]]></category>

		<guid isPermaLink="false">http://next.pixeldepo.com/?p=590</guid>
		<description><![CDATA[Днес имах малко свободно време и реших да погледна малко един проект, и по-точно javascript честа от него. И се спрях на един простичък Tab панел, нищо особено, но нещо не ми хареса как изглеждаше JavaScipt-а. HTML изглежда така:


&#60;div class=&#34;tab-panel&#34;&#62;
	&#60;ul class=&#34;tab-header&#34;&#62;
		&#60;li class=&#34;selected&#34;&#62;tab 1&#60;/li&#62;
		&#60;li&#62;tab 2&#60;/li&#62;
		&#60;li&#62;tab 3&#60;/li&#62;
	&#60;/ul&#62;
	&#60;div class=&#34;tab-content&#34;&#62;tab 1 content&#60;/div&#62;
	&#60;div class=&#34;tab-content&#34; style=&#34;display: none;&#34;&#62;tab 2 content&#60;/div&#62;
	&#60;div class=&#34;tab-content&#34; style=&#34;display: [...]]]></description>
			<content:encoded><![CDATA[<p>Днес имах малко свободно време и реших да погледна малко един проект, и по-точно javascript честа от него. И се спрях на един простичък Tab панел, нищо особено, но нещо не ми хареса как изглеждаше JavaScipt-а. HTML изглежда така:</p>
<pre name="code" class="html">

&lt;div class=&quot;tab-panel&quot;&gt;
	&lt;ul class=&quot;tab-header&quot;&gt;
		&lt;li class=&quot;selected&quot;&gt;tab 1&lt;/li&gt;
		&lt;li&gt;tab 2&lt;/li&gt;
		&lt;li&gt;tab 3&lt;/li&gt;
	&lt;/ul&gt;
	&lt;div class=&quot;tab-content&quot;&gt;tab 1 content&lt;/div&gt;
	&lt;div class=&quot;tab-content&quot; style=&quot;display: none;&quot;&gt;tab 2 content&lt;/div&gt;
	&lt;div class=&quot;tab-content&quot; style=&quot;display: none;&quot;&gt;tab 3 content&lt;/div&gt;
&lt;/div&gt;
</pre>
<p>За да направя това таб панел използвах просто тази функция:</p>
<pre name="code" class="javascript">

function tabulize(panel){
	// слагам div.tab-content вместо .tab-content,
	// защото когато селектора има само клас селектира всички елементи и ги проверява,
	// а ако се сложи div.tab-content се селектират се всички div-ове и те се проверяват,
	// което е по-бързо
	var elements	= panel.select(&#039;div.tab-content&#039;),
		buttons		= panel.down(&#039;ul&#039;).select(&#039;li&#039;);

	// дефинирам тази функция тук,
	// защото искам да имам достъп до elements, buttons
	function activate(item, key){
		// тук 1во се маха клас selected от всички бутони,
		// и се скриват всичките div.tab-content
		buttons.invoke(&#039;removeClassName&#039;, &#039;selected&#039;);
		elements.invoke(&#039;hide&#039;);

		// после се показва избрания елемент и се слага клас selected на избрания бутон
		elements[key].show();
		item.addClassName(&#039;selected&#039;);
	}

	// на всеки бутон се добавя eventhandler за click,
	// който ще подава на activate избрания елемент и неговия номер във buttons масива
	buttons.each(function(item, key){
		item.observe(&#039;click&#039;, activate.curry(item, key));
	});
}
</pre>
<p>Това е доста простичко, но и трудно за промени като динамично добавяне на съдържание, ефекти и други. Затова реших да го направя малко по-OOП, като запазя основните идеи:</p>
<pre name="code" class="javascript">

var TabPanel = Class.create({
	// това е конструктора
	initialize: function(panel){
		panel = $(panel);
		// избираме отново elements и buttons, но ги записваме като инстанс променливи
		this.elements = panel.select(&#039;div.tab-content&#039;);
		this.buttons = panel.down(&#039;ul&#039;).select(&#039;li&#039;).each(function(){
			// единствената разлика е че active не е private функция и инстанс метод
			// и за това тук ползваме bind, а не curry
			item.observe(&#039;click&#039;, this.activate.bind(this, item, key);
		}.bind(this));
	},
	// active, вече е метод и само &quot;this.&quot; e разликата
	activate: function(item, key){
		this.buttons.invoke(&#039;removeClassName&#039;, &#039;selected&#039;);
		this.elements.invoke(&#039;hide&#039;);
		this.elements[key].show();
		item.addClassName(&#039;selected&#039;);
	}
});
</pre>
<p>Сега става малко по-тежко, но и доста по-extendable и податливо на бъдещи промени. Но тук видях нещо, което пак не ми се хареса е че колкото таб бутони имам толкова пъти и в двете версии викам observe и реших да видя как ще изглежда това, като добавим малко event-delegation, за което трябваха само две промени:</p>
<pre name="code" class="javascript">

var TabPanel = Class.create({
	initialize: function(panel){
		panel			= $(panel);
		this.elements	= panel.select(&#039;div.tab-content&#039;);
		this.buttons	= panel.down(&#039;ul&#039;).select(&#039;li&#039;);
		// първо променяме тук
		// слагаме click eventhandler на ul (списъка с бутоните)
		// вътре проверяваме дали li елемента, който сме натиснали (ако има такъв)
		// е във масива с бутоните, ако е така активираме табулацията с този номер
		panel.down(&#039;ul&#039;).observe(&#039;click&#039;, function(e){
			var key = this.buttons.indexOf(e.findElement(&#039;li&#039;));
			if (key != -1) this.activate(key);
		}.bind(this));
	},
	// второто нещо което променяме е тук
	// махаме item параметъра, и на го заменяме с this.buttons[key]
	activate: function(key){
		this.buttons.invoke(&#039;removeClassName&#039;, &#039;selected&#039;);
		this.buttons[key].addClassName(&#039;selected&#039;);
		this.elements.invoke(&#039;hide&#039;);
		this.elements[key].show();
	}
});
</pre>
<p>И поне на този етап съм доволен, при нужда мога да добавя destroy, addTab и други неща <img src='http://next.pixeldepo.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> А как инстансирам TabPanel-а ? Ами със <a title="ControlDepo 3 Widgets - Behaviors Част I" href="http://next.pixeldepo.com/2008/10/03/controldepo-3-widgets-behaviors-%D1%87%D0%B0%D1%81%D1%82-i/" target="_blank">CD3.Behaviors</a>:</p>
<pre name="code" class="javascript">

CD3.Behaviors({
	&#039;div.tab-panel&#039;: TabPanel
});
</pre>
]]></content:encoded>
			<wfw:commentRss>http://next.pixeldepo.com/2008/10/04/%d0%bc%d0%b0%d0%bb%d0%ba%d0%be-javascript-refactoring/feed/</wfw:commentRss>
		<feedburner:origLink>http://next.pixeldepo.com/2008/10/04/%d0%bc%d0%b0%d0%bb%d0%ba%d0%be-javascript-refactoring/</feedburner:origLink></item>
		<item>
		<title>50 важни момента от историята на Интернет</title>
		<link>http://feeds.feedburner.com/~r/pixeldepo/SoMF/~3/423486244/</link>
		<comments>http://next.pixeldepo.com/2008/10/03/50-%d0%b2%d0%b0%d0%b6%d0%bd%d0%b8-%d0%bc%d0%be%d0%bc%d0%b5%d0%bd%d1%82%d0%b0-%d0%be%d1%82-%d0%b8%d1%81%d1%82%d0%be%d1%80%d0%b8%d1%8f%d1%82%d0%b0-%d0%bd%d0%b0-%d0%b8%d0%bd%d1%82%d0%b5%d1%80%d0%bd%d0%b5/#comments</comments>
		<pubDate>Fri, 03 Oct 2008 16:45:49 +0000</pubDate>
		<dc:creator>Radoslav Stankov</dc:creator>
		
		<category><![CDATA[Internet]]></category>

		<category><![CDATA[Web]]></category>

		<category><![CDATA[History]]></category>

		<guid isPermaLink="false">http://next.pixeldepo.com/?p=586</guid>
		<description><![CDATA[Много обичам историята, като дисциплина. Затова днес бях много доволен като видях тази статия в Builder AU:
50 significant moments from internet history

Ако на някой се интересува от тази тема бих препоръчал и тази поредица: Download: The True Story of the Internet.
]]></description>
			<content:encoded><![CDATA[<p>Много обичам историята, като дисциплина. Затова днес бях много доволен като видях тази статия в <a title="Builder AU - By developers for developers" href="http://www.builderau.com.au/" target="_blank">Builder AU</a>:</p>
<p style="text-align: center;"><strong><a title="50 significant moments from internet history - Program - Web Technologies -  Builder AU" href="http://www.builderau.com.au/program/web/soa/50-significant-moments-from-internet-history/0,339024632,339292301,00.htm" target="_blank">50 significant moments from internet history</a></strong><br />
<a title="50 significant moments from internet history - Program - Web Technologies -  Builder AU" href="http://www.builderau.com.au/program/web/soa/50-significant-moments-from-internet-history/0,339024632,339292301,00.htm" target="_blank"><img class="size-medium wp-image-587 aligncenter" title="beginning" src="http://next.pixeldepo.com/wp-content/uploads/2008/10/beginning.jpg" alt="" /></a></p>
<p>Ако на някой се интересува от тази тема бих препоръчал и тази поредица: <a title="Download: The True Story of the Internet" rel="bookmark" href="http://next.pixeldepo.com/2008/08/12/download-the-true-story-of-the-internet/" target="_blank">Download: The True Story of the Internet</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://next.pixeldepo.com/2008/10/03/50-%d0%b2%d0%b0%d0%b6%d0%bd%d0%b8-%d0%bc%d0%be%d0%bc%d0%b5%d0%bd%d1%82%d0%b0-%d0%be%d1%82-%d0%b8%d1%81%d1%82%d0%be%d1%80%d0%b8%d1%8f%d1%82%d0%b0-%d0%bd%d0%b0-%d0%b8%d0%bd%d1%82%d0%b5%d1%80%d0%bd%d0%b5/feed/</wfw:commentRss>
		<feedburner:origLink>http://next.pixeldepo.com/2008/10/03/50-%d0%b2%d0%b0%d0%b6%d0%bd%d0%b8-%d0%bc%d0%be%d0%bc%d0%b5%d0%bd%d1%82%d0%b0-%d0%be%d1%82-%d0%b8%d1%81%d1%82%d0%be%d1%80%d0%b8%d1%8f%d1%82%d0%b0-%d0%bd%d0%b0-%d0%b8%d0%bd%d1%82%d0%b5%d1%80%d0%bd%d0%b5/</feedburner:origLink></item>
	</channel>
</rss>
