<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	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:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>stinger&#039;s thoughts &#187; Web Development</title>
	<atom:link href="http://www.sthoughts.com/category/web-development/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.sthoughts.com</link>
	<description>a place that bites better</description>
	<lastBuildDate>Fri, 09 Apr 2010 14:16:50 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Masonry for Prototype JS</title>
		<link>http://www.sthoughts.com/2010/02/11/masonry-for-prototypejs/</link>
		<comments>http://www.sthoughts.com/2010/02/11/masonry-for-prototypejs/#comments</comments>
		<pubDate>Thu, 11 Feb 2010 15:00:20 +0000</pubDate>
		<dc:creator>stinger</dc:creator>
				<category><![CDATA[Web Development]]></category>

		<guid isPermaLink="false">http://www.sthoughts.com/?p=582</guid>
		<description><![CDATA[<div class="serendipity_center"><a href="http://www.sthoughts.com/prototype-masonry/"><img src="http://www.sthoughts.com/uploads/masonry.jpg" alt="Prototype Masonry in action" title="Prototype Masonry in action" width="470" height="265"  /></a></div>
<p>За един от проектите си имах нужда от layout manager, който да разполага обекти в определено пространство с възможно най-малка загуба на място. Решението беше да си отделя един ден и да <strong>port-на jQuery Masonry към Prototype framework</strong>. Еквивалент на първото демо от сайта на David можете да намерите на <a href="http://www.sthoughts.com/prototype-masonry/"><strong>Masonry Prototype</strong></a> страницата. От нея можете и да свалите и plugin-а, в случай че ви трябва.</p>]]></description>
			<content:encoded><![CDATA[<div class="serendipity_center"><a href="http://www.sthoughts.com/prototype-masonry/"><img src="http://www.sthoughts.com/uploads/masonry.jpg" alt="Prototype Masonry in action" title="Prototype Masonry in action" width="470" height="265"  /></a></div>
<p><a href="http://www.prototypejs.org" target="_blank">Prototype JS</a> е страхотна библиотека за работа с JavaScript, документирана перфектно и с богата селекция от ефекти, благодарение на <a href="http://script.aculo.us/" target="_blank">script.aculo.us</a>.</p>
<p>За един от проектите си имах нужда от layout manager, който да разполага обекти в определено пространство с възможно най-малка загуба на място. Търсейки такова решение разбрах две неща: първо, читав <strong>layout manager за Prototype JS</strong> няма и , второ, има готово решение на търсения от мен алгоритъм в лицето на отличния <a href="http://desandro.com/resources/jquery-masonry">jQuery Masonry на David DeSandro</a>.</p>
<p>Проблемът в моя случай беше, че за този проект ползвах Prototype и jQuery-плъгина не ме устройваше. Решението беше да си отделя един ден и да <strong>port-на jQuery Masonry към Prototype framework</strong>. Еквивалент на първото демо от сайта на David можете да намерите на <a href="http://www.sthoughts.com/prototype-masonry/"><strong>Masonry Prototype</strong></a> страницата. От нея можете и да свалите и plugin-а, в случай че ви трябва. </p>
<p>Prototype версията напълно покрива basic демото, както и това с блога, за Infinite Scroll Example-a пича ползва third-party jQuery plugin, затова не съм го тествал&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sthoughts.com/2010/02/11/masonry-for-prototypejs/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Drupalized</title>
		<link>http://www.sthoughts.com/2010/01/27/drupalized/</link>
		<comments>http://www.sthoughts.com/2010/01/27/drupalized/#comments</comments>
		<pubDate>Wed, 27 Jan 2010 17:01:08 +0000</pubDate>
		<dc:creator>stinger</dc:creator>
				<category><![CDATA[Web Development]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[web 2.o]]></category>

		<guid isPermaLink="false">http://www.sthoughts.com/?p=575</guid>
		<description><![CDATA[<div class="serendipity_center"><a href="http://www.drupal.org" target="_blank"><img src="http://www.sthoughts.com/uploads/druplicon.png" alt="The Drupal Logo" title="The Drupal Logo" width="140" height="160" /></a></div>

<p>Всички, които следим малко по-внимателно web-а през последните няколко месеца, нямаше как да не забележим нарастващата вълна от Drupal-базирани сайтове. За добро или лошо, бизнесът с open source, особено извън татковината, винаги е имал нужда от солидна доза аргументация.</p>

<p>Със сигурност една от най-важните причини Drupal да започне такава сериозна експанзия, че чак <a href="http://news.cnet.com/8301-13505_3-10415678-16.html" target="_blank">Microsoft да започнат кампания против него в Google AdWords</a> е <a href="http://www.whitehouse.gov/" target="_blank">http://www.whitehouse.gov/</a>. От това по-добра реклама - здраве му кажи.</p>]]></description>
			<content:encoded><![CDATA[<div class="serendipity_center"><a href="http://www.drupal.org" target="_blank"><img src="http://www.sthoughts.com/uploads/druplicon.png" alt="The Drupal Logo" title="The Drupal Logo" width="140" height="160" /></a></div>
<p>Всички, които следим малко по-внимателно web-а през последните няколко месеца, нямаше как да не забележим нарастващата вълна от Drupal-базирани сайтове. За добро или лошо, бизнесът с open source, особено извън татковината, винаги е имал нужда от солидна доза аргументация.</p>
<p>Със сигурност една от най-важните причини Drupal да започне такава сериозна експанзия, че чак <a href="http://news.cnet.com/8301-13505_3-10415678-16.html" target="_blank">Microsoft да започнат кампания против него в Google AdWords</a> е <a href="http://www.whitehouse.gov/" target="_blank">http://www.whitehouse.gov/</a>. От това по-добра реклама &#8211; здраве му кажи.</p>
<p>За самият Drupal са ми малко думите &#8211; страхотен, повтарям страхотен Content Management System, който е в състояние да сложи в малкия си джоб дузина комерсиални конкуренти. С изчерпателната си документация, и огромната общност от разработчици зад гърба си, Drupal със сигурност е в пъти по-добро решение от всякаквите самоделки, налични като &#8220;решения&#8221; в повечето от родните ни web компании.</p>
<p>Всъщност, сега се сещам за една молба към web разработчиците: ако имате задачка пред себе си и не сте с много умения в писането на PHP код, дайте един шанс на Drupal, ще спестите адски много време на хората, които ще fix-ват грешките ви по-късно. В случай, че имате опит и още не сте преминали на утвърдени практики като MVC (<a href="http://framework.zend.com/" target="_blank">Zend Framework</a>, <a href="http://codeigniter.com/" target="_blank">CodeIgniter</a> или <a href="http://www.symfony-project.org/" target="_blank">Symphony</a>) &#8211; направете го, няма да съжалявате.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sthoughts.com/2010/01/27/drupalized/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Next-gen Flash development?</title>
		<link>http://www.sthoughts.com/2009/06/01/next-gen-flash-development/</link>
		<comments>http://www.sthoughts.com/2009/06/01/next-gen-flash-development/#comments</comments>
		<pubDate>Mon, 01 Jun 2009 08:40:45 +0000</pubDate>
		<dc:creator>stinger</dc:creator>
				<category><![CDATA[Web Development]]></category>
		<category><![CDATA[adobe]]></category>
		<category><![CDATA[flash]]></category>
		<category><![CDATA[flex]]></category>

		<guid isPermaLink="false">http://www.sthoughts.com/?p=561</guid>
		<description><![CDATA[<div class="serendipity_center"><img src="http://www.sthoughts.com/uploads/fc.jpg" alt="Adobe Flash Catalyst" title="Adobe Flash Catalyst" width="470" height="250" class="aligncenter size-full wp-image-563" /></div>

<p>Не е истина какво прави конкуренцията - след като Microsoft добутаха H264/AAC в Silverlight 3, както и smooth streaming, пуснаха и някакъв 3D support, и в един момент Adobe започнаха да изглеждат леко смешни с 10-тата версия на Flash Player, която (спорно) май остана само с по-добрия рендеринг на шрифтовете и междуплатформената си поддръжка. И, според мен, ако е имало нещо, което отново да върне Adobe там, където им е мястото, то това е само и единствено Flex-платформата. Ясно е, че в областта на дизайна Adobe са ненадминати. Също толкова ясно е, че Microsoft са напред в областта на development-a.</p>]]></description>
			<content:encoded><![CDATA[<div class="serendipity_center"><img src="http://www.sthoughts.com/uploads/fc.jpg" alt="Adobe Flash Catalyst" title="Adobe Flash Catalyst" width="470" height="250" class="aligncenter size-full wp-image-563" /></div>
<p>Не е истина какво прави конкуренцията &#8211; след като Microsoft добутаха H264/AAC в Silverlight 3, както и smooth streaming, пуснаха и някакъв 3D support, и в един момент Adobe започнаха да изглеждат леко смешни с 10-тата версия на Flash Player, която (спорно) май остана само с по-добрия рендеринг на шрифтовете и междуплатформената си поддръжка. И, според мен, ако е имало нещо, което отново да върне Adobe там, където им е мястото, то това е само и единствено Flex-платформата. Ясно е, че в областта на дизайна Adobe са ненадминати. Също толкова ясно е, че Microsoft са напред в областта на development-a.</p>
<p>За да надделее, някой от двата &#8220;претендента&#8221; трябва да стъпи в областта на популярност на другия. Аз лично, освен че съм супер пристрастен по ред причини, с чиста съвест ще заложа на Adobe. Първо, защото MS така и не успяха да направят читав дизайнерски инструмент вече повече от 20 години и с всеки наченат и захвърлен експеримент в тази насока търпят само критики. Второ, защото Adobe знаят как да поддържат общност, и се опитват да се вслушват в гласа на потребителската си база. От години следя <a href="http://labs.adobe.com" target="_blank">http://labs.adobe.com</a> не само заради интересните неща там, но и заради възможността да видиш зараждането на технология и дискусиите по оформянето й.</p>
<p>Преди около година и нещо, когато започнаха първите дискусии по Flex 4 имаше сериозна дискусия накъде да се фокусира следващата версия. Контроли вече имаше (за разлика от Silverlight), имаше и горе-долу ясна концепция за типа RIA които ще бъдат разработвани и тогавашният модел работеше някак си. Не мога да кажа успешно, но поне беше форма на development която вършеше работа за поставянето на основата. После се появи някакъв чешит, който бил бачкал в Microsoft и даде идеята да се напише инструмент, който да помогне на дизайнерите да влязат по-надълбоко във Flex. Последиците от това днес са налични като версия beta на продукта <a href="http://labs.adobe.com/technologies/flashcatalyst/" target="_blank">Adobe Flash Catalyst</a>. Базиран на Eclipse, Flash Catalyst поне от <a href="http://tv.adobe.com/#vi+f1532v1001" target="_blank">видеото, налично на сайта на Adobe</a> ме кара да мисля за напълно нов подход към Flash разработката. А факта, че нещото, което преди носеше името Flash Builder вече се казва <a href="http://labs.adobe.com/technologies/flashbuilder4/" target="_blank">Adobe Flash Builder</a> само потвърждава мнението ми.</p>
<p>Излиза, че Adobe са стъпили на солидна среда за разработка, каквато е Eclipse и с типичната си находчивост изглежда ще успеят отново да бутнат Flash технологията с една стъпка напред, Което е екстра, аз лично, колкото и да мразя банерите се кефя неистово на нещата в The FWA.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sthoughts.com/2009/06/01/next-gen-flash-development/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mandate</title>
		<link>http://www.sthoughts.com/2009/04/22/mandate/</link>
		<comments>http://www.sthoughts.com/2009/04/22/mandate/#comments</comments>
		<pubDate>Wed, 22 Apr 2009 12:31:27 +0000</pubDate>
		<dc:creator>stinger</dc:creator>
				<category><![CDATA[Web Development]]></category>
		<category><![CDATA[drupal]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[Portfolio]]></category>
		<category><![CDATA[web-2.0]]></category>

		<guid isPermaLink="false">http://www.sthoughts.com/?p=559</guid>
		<description><![CDATA[<div class="serendipity_center"><a href="http://www.yourmandate.com"><img src="http://www.sthoughts.com/uploads/mandate.jpg" alt="Mandate" /></a></div>

<p>Последният месец при мен мина изцяло в разработка на сайта, който можете да видите, щраквайки върху линка по-горе. По-доволен няма как да съм, понеже това е първият PHP проект, в който не ползвам собствените си модули за администрация на съдържание, а вместо тях се спрях на един проект с отворен код, който ме интересува от известно време насам - <a href="http://www.drupal.org" target="_blank">Drupal</a></p>]]></description>
			<content:encoded><![CDATA[<div class="serendipity_center"><a href="http://www.yourmandate.com"><img src="http://www.sthoughts.com/uploads/mandate.jpg" alt="Mandate" /></a></div>
<p>Последният месец при мен мина изцяло в разработка на сайта, който можете да видите, щраквайки върху линка по-горе. По-доволен няма как да съм, понеже това е първият PHP проект, в който не ползвам собствените си модули за администрация на съдържание, а вместо тях се спрях на един проект с отворен код, който ме интересува от известно време насам &#8211; <a href="http://www.drupal.org" target="_blank">Drupal</a></p>
<p>Всъщност, това, което е по-интересно е, че реално проблемите с разработката на сайта бяха доста по-малко от колкото очаквах. Единствената реална трудност беше мигрирането на съдържанието от стария блог на клиента (базиран на <a href="http://www.wordpress.org" target="_blank">WordPress</a>) към собствената блог-система на Dupal, но наличният <a href="http://drupal.org/project/wordpress_import" target="_blank">модул за импорт на съдържанието от WP</a> работи отлично.</p>
<p>Дребни проблеми можете да имате само, ако import-вате огромно количество съдържание, и те са свързани не толкова с Drupal, колкото с time limit ограничението за изпълнение на PHP скриптове в Apache. Иначе CMS-ът е с отлична документация и архитектура и съм сигурен, че Mandate няма да са единственият случай, в който работя с него. Писането на custom модули е максимално улеснено и не помня кога за последно съм се радвал като малко дете на резултатите от работа с тривиални операции.</p>
<p>Освен това имах и малко време да помисля над система за заместване на шрфитове, подобна на <a href="http://www.mikeindustries.com/blog/sifr/" target="_blank">sIFR</a>, но с по-малко баласт, и резултата определено ме обнадеждава &#8211; с малко помощ от jQuery системата използва един 14k <code>.swf</code> файл за всички заглавия и подзаглавия в сайта.</p>
<p>Иначе обичайните благодарности за всички замесени са задължителни, а резултатът, поне на мен, ми харесва доста.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sthoughts.com/2009/04/22/mandate/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Sitecore: Proxying MediaItem</title>
		<link>http://www.sthoughts.com/2009/02/17/sitecore-proxying-mediaitem/</link>
		<comments>http://www.sthoughts.com/2009/02/17/sitecore-proxying-mediaitem/#comments</comments>
		<pubDate>Tue, 17 Feb 2009 11:45:56 +0000</pubDate>
		<dc:creator>stinger</dc:creator>
				<category><![CDATA[Web Development]]></category>
		<category><![CDATA[.net]]></category>
		<category><![CDATA[sitecore]]></category>

		<guid isPermaLink="false">http://www.sthoughts.com/?p=554</guid>
		<description><![CDATA[<div class="serendipity_center"><img src="http://www.sthoughts.com/uploads/sitecore.jpg" alt="Sitecore" /></div>
<p>За един от проектите наскоро имахме интересен казус - част от upload-натите файлове в Media Library-то на Sitecore трябваше да са достъпни за сваляне само от регистрирани потребители. Неприятното беше, че всъщност съдържанието на всеки от Item-ите в Media Library вече е достъпно чрез proxy, и едно от решенията беше писане на разширение за pipeline обектите. Другото решение беше написване на собствено proxy, което със сигурност ми харесва повече.</p>]]></description>
			<content:encoded><![CDATA[<div class="serendipity_center"><img src="http://www.sthoughts.com/uploads/sitecore.jpg" alt="Sitecore" /></div>
<p>За един от проектите наскоро имахме интересен казус &#8211; част от upload-натите файлове в Media Library-то на Sitecore трябваше да са достъпни за сваляне само от регистрирани потребители. Неприятното беше, че всъщност съдържанието на всеки от Item-ите в Media Library вече е достъпно чрез proxy, и едно от решенията беше писане на разширение за pipeline обектите. Другото решение беше написване на собствено proxy, което със сигурност ми харесва повече.</p>
<p>Подчертавам дебело, че това е първият ми ASP.NET модул изобщо, така че бъдете снизходителни. Решението (с махнати подробностите по проверка на достъпа) изглежда така:</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;">Response.<span style="color: #0000FF;">Clear</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
Sitecore.<span style="color: #0000FF;">Data</span>.<span style="color: #0000FF;">Database</span> database <span style="color: #008000;">=</span>
Sitecore.<span style="color: #0000FF;">Configuration</span>.<span style="color: #0000FF;">Factory</span>.<span style="color: #0000FF;">GetDatabase</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;master&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
Sitecore.<span style="color: #0000FF;">Data</span>.<span style="color: #0000FF;">Items</span>.<span style="color: #0000FF;">MediaItem</span> MediaFile <span style="color: #008000;">=</span> 
database.<span style="color: #0000FF;">GetItem</span><span style="color: #000000;">&#40;</span>ItemID<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
Stream fileStream <span style="color: #008000;">=</span> MediaFile.<span style="color: #0000FF;">GetMediaStream</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
Response.<span style="color: #0000FF;">ContentType</span> <span style="color: #008000;">=</span> MediaFile.<span style="color: #0000FF;">MimeType</span><span style="color: #008000;">;</span>
Response.<span style="color: #0000FF;">AppendHeader</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;Content-Length&quot;</span>, 
fileStream.<span style="color: #0000FF;">Length</span>.<span style="color: #0000FF;">ToString</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
Response.<span style="color: #0000FF;">AppendHeader</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;Content-Disposition&quot;</span>, 
<span style="color: #666666;">&quot;attachment; filename=&quot;</span><span style="color: #008000;">+</span>MediaFile.<span style="color: #0000FF;">Name</span><span style="color: #008000;">+</span><span style="color: #666666;">&quot;.&quot;</span><span style="color: #008000;">+</span>MediaFile.<span style="color: #0000FF;">Extension</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
<span style="color: #FF0000;">byte</span><span style="color: #000000;">&#91;</span><span style="color: #000000;">&#93;</span> fileContent <span style="color: #008000;">=</span> BufferStream<span style="color: #000000;">&#40;</span>fileStream,<span style="color: #FF0000;">0</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
Response.<span style="color: #0000FF;">BinaryWrite</span><span style="color: #000000;">&#40;</span>fileContent<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span></pre></div></div>

<p><code>BufferSream</code> е собствен метод, който load-ва съдържанието на MediaStream-а преди да го представи на потребителя. Ето и какво представлява, всъщност:</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #0600FF;">public</span> <span style="color: #0600FF;">static</span> <span style="color: #FF0000;">byte</span><span style="color: #000000;">&#91;</span><span style="color: #000000;">&#93;</span> BufferStream<span style="color: #000000;">&#40;</span>Stream stream,<span style="color: #FF0000;">int</span> initialLength<span style="color: #000000;">&#41;</span>
<span style="color: #000000;">&#123;</span>
  <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>initialLength <span style="color: #008000;">&amp;</span>lt<span style="color: #008000;">;</span> <span style="color: #FF0000;">1</span><span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#123;</span> initialLength <span style="color: #008000;">=</span> <span style="color: #FF0000;">32768</span><span style="color: #008000;">;</span> <span style="color: #000000;">&#125;</span>
  <span style="color: #FF0000;">byte</span><span style="color: #000000;">&#91;</span><span style="color: #000000;">&#93;</span> buffer <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> <span style="color: #FF0000;">byte</span><span style="color: #000000;">&#91;</span>initialLength<span style="color: #000000;">&#93;</span><span style="color: #008000;">;</span>
  <span style="color: #FF0000;">int</span> read<span style="color: #008000;">=</span><span style="color: #FF0000;">0</span><span style="color: #008000;">;</span>
  <span style="color: #FF0000;">int</span> chunk<span style="color: #008000;">;</span>
  <span style="color: #0600FF;">while</span> <span style="color: #000000;">&#40;</span><span style="color: #000000;">&#40;</span>chunk <span style="color: #008000;">=</span> stream.<span style="color: #0000FF;">Read</span><span style="color: #000000;">&#40;</span>buffer,read,buffer.<span style="color: #0000FF;">Length</span><span style="color: #008000;">-</span>read<span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">&gt;</span><span style="color: #FF0000;">0</span><span style="color: #000000;">&#41;</span>
  <span style="color: #000000;">&#123;</span>
    read <span style="color: #008000;">+=</span> chunk<span style="color: #008000;">;</span>
    <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>read <span style="color: #008000;">==</span> buffer.<span style="color: #0000FF;">Length</span><span style="color: #000000;">&#41;</span>
    <span style="color: #000000;">&#123;</span>
      <span style="color: #FF0000;">int</span> nextByte <span style="color: #008000;">=</span> stream.<span style="color: #0000FF;">ReadByte</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
      <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>nextByte<span style="color: #008000;">==-</span><span style="color: #FF0000;">1</span><span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#123;</span> <span style="color: #0600FF;">return</span> buffer<span style="color: #008000;">;</span> <span style="color: #000000;">&#125;</span>
      <span style="color: #FF0000;">byte</span><span style="color: #000000;">&#91;</span><span style="color: #000000;">&#93;</span> newBuffer <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> <span style="color: #FF0000;">byte</span><span style="color: #000000;">&#91;</span>buffer.<span style="color: #0000FF;">Length</span><span style="color: #008000;">*</span><span style="color: #FF0000;">2</span><span style="color: #000000;">&#93;</span><span style="color: #008000;">;</span>
      Array.<span style="color: #0000FF;">Copy</span><span style="color: #000000;">&#40;</span>buffer, newBuffer, buffer.<span style="color: #0000FF;">Length</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
      newBuffer<span style="color: #000000;">&#91;</span>read<span style="color: #000000;">&#93;</span><span style="color: #008000;">=</span><span style="color: #000000;">&#40;</span><span style="color: #FF0000;">byte</span><span style="color: #000000;">&#41;</span>nextByte<span style="color: #008000;">;</span>
      buffer <span style="color: #008000;">=</span> newBuffer<span style="color: #008000;">;</span>
      read<span style="color: #008000;">++;</span>
    <span style="color: #000000;">&#125;</span>
  <span style="color: #000000;">&#125;</span>
  <span style="color: #FF0000;">byte</span><span style="color: #000000;">&#91;</span><span style="color: #000000;">&#93;</span> ret <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> <span style="color: #FF0000;">byte</span><span style="color: #000000;">&#91;</span>read<span style="color: #000000;">&#93;</span><span style="color: #008000;">;</span>
  Array.<span style="color: #0000FF;">Copy</span><span style="color: #000000;">&#40;</span>buffer, ret, read<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
  <span style="color: #0600FF;">return</span> ret<span style="color: #008000;">;</span>
<span style="color: #000000;">&#125;</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://www.sthoughts.com/2009/02/17/sitecore-proxying-mediaitem/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>sthoughts adds mobile support</title>
		<link>http://www.sthoughts.com/2009/01/20/sthoughts-adds-mobile-support/</link>
		<comments>http://www.sthoughts.com/2009/01/20/sthoughts-adds-mobile-support/#comments</comments>
		<pubDate>Tue, 20 Jan 2009 19:22:02 +0000</pubDate>
		<dc:creator>stinger</dc:creator>
				<category><![CDATA[Web Development]]></category>
		<category><![CDATA[mobile]]></category>
		<category><![CDATA[sthoughts]]></category>

		<guid isPermaLink="false">http://www.sthoughts.com/?p=549</guid>
		<description><![CDATA[<div class="serendipity_center"><img src="http://www.sthoughts.com/uploads/sth_mobile01.jpg" alt="sthoughts mobile version - home page" /></div>

<p>Е, време беше и аз да се включа в модата с преправянето на сайтове за мобилни телефони, и в този ред на мисли едва ли щях да имам по-добро опитно поле от блога си. В крайна сметка редизайна, заедно с имплементацията, отне по-малко от ден, а тестовете успешно минаха мобилната версия на Internet Explorer, webkit-базираният Iris и, разбира се, Opera Mobile. Търси се тестер с iPhone, който само да потвърди дали сайта изглежда като на screenshot-ите.</p>]]></description>
			<content:encoded><![CDATA[<div class="serendipity_center"><img src="http://www.sthoughts.com/uploads/sth_mobile01.jpg" alt="sthoughts mobile version - home page" /></div>
<p>Е, време беше и аз да се включа в модата с преправянето на сайтове за мобилни телефони, и в този ред на мисли едва ли щях да имам по-добро опитно поле от блога си. В крайна сметка редизайна, заедно с имплементацията, отне по-малко от ден, а тестовете успешно минаха мобилната версия на Internet Explorer, webkit-базираният Iris и, разбира се, Opera Mobile. Търси се тестер с iPhone, който само да потвърди дали сайта изглежда като на screenshot-ите.</p>
<div class="serendipity_center"><img src="http://www.sthoughts.com/uploads/sth_mobile02.jpg" alt="sthoughts mobile version - article" /></div>
<p>Иначе да взема да похваля поне веднъж Microsoft &#8211; мобилната им версия на Windows е доста по-обмислена от desktop еквивалента си и с малко GNU софтуер почти става за ползване. Естествено, има и мизерии &#8211; за да спра приложение трябва да цъкам през 5 менюта, ама Task Manager-и за Windows Mobile дал господ&#8230;</p>
<p>При писането на мобилната версия на сайта гледах максимално да се придържам до стандартния й еквивалент като цветова схема, изхвърлих ненужни неща като архивите по месеци, запазих линковете към архивите по категории и добавих опция за преход към стандартната версия (за тези, който ползват Opera Mobile). Разстоянието между заглавията на отделните постове нарочно е оставено по-голямо &#8211; открих, че така по-малко се объркваш при целене на линковете с пръсти вместо със stylus-a.</p>
<p>Надявам се цялото упражнение да се окаже ползено. За предложения или критики &#8211; използвайте коментарите&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sthoughts.com/2009/01/20/sthoughts-adds-mobile-support/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>jQuery 1.3</title>
		<link>http://www.sthoughts.com/2009/01/15/jquery-13/</link>
		<comments>http://www.sthoughts.com/2009/01/15/jquery-13/#comments</comments>
		<pubDate>Thu, 15 Jan 2009 08:54:28 +0000</pubDate>
		<dc:creator>stinger</dc:creator>
				<category><![CDATA[Web Development]]></category>

		<guid isPermaLink="false">http://www.sthoughts.com/?p=547</guid>
		<description><![CDATA[<div class="serendipity_center"><img src="http://www.sthoughts.com/uploads/jquery.jpg" alt="jQuery 1.3 is released" /></div>
<p>Вчера, точно на 3 годишнината от създаването си, <a href="http://jquery.com/" target="_blank">проекта jQuery</a> официално обяви появата на новата версия на популярната си JavaScript библиотека. Вероятно изобщо нямаше да съм толкова въодушевен, ако все още ползвах комбинацията <a href="http://prototypejs.org/" target="_blank">Prototype</a> + <a href="http://script.aculo.us/" target="_blank">Scriptaculous</a> и бях прочел <a href="http://docs.jquery.com/Release:jQuery_1.3" target="_blank">тези Release Notes</a> - подобрение на производителността в почти всяка област на цената на 18k (minified).</p>]]></description>
			<content:encoded><![CDATA[<div class="serendipity_center"><img src="http://www.sthoughts.com/uploads/jquery.jpg" alt="jQuery 1.3 is released" /></div>
<p>Вчера, точно на 3 годишнината от създаването си, <a href="http://jquery.com/" target="_blank">проекта jQuery</a> официално обяви появата на новата версия на популярната си JavaScript библиотека. Вероятно изобщо нямаше да съм толкова въодушевен, ако все още ползвах комбинацията <a href="http://prototypejs.org/" target="_blank">Prototype</a> + <a href="http://script.aculo.us/" target="_blank">Scriptaculous</a> и бях прочел <a href="http://docs.jquery.com/Release:jQuery_1.3" target="_blank">тези Release Notes</a> &#8211; подобрение на производителността в почти всяка област на цената на 18k (minified).</p>
<p>Не че Prototype е лоша библиотека &#8211; дори напротив, но 126k са си тежест при първоначално зареждане. Освен това съм забелязал, че с jQuery дори custom скриптовете и plugin-ите се получават по-компактни като код. Единственият проблем досега беше липсата на event delegation, но с появата на 1.3 и този проблем отпадна. И като капак на всичко &#8211; изцяло новата система за селектиране, <a href="http://sizzlejs.com/" target="_blank">Sizzle</a>, освен малка (само 3k, minified) е и уникално бърза. </p>
<p>Хубавинките не свършват дотук и от jQuery твърдят:</p>
<blockquote><p>Right now we&#8217;re working with Prototype, Dojo, Yahoo UI, MochiKit, and TinyMCE (and many others) on Sizzle, honing it to perfection. </p></blockquote>
<p>Това, при положение че не остане само на хартия, означава, че на разработчиците няма да им се налага да се нагаждат към всяко API, поне по отношение на селекторите.</p>
<p>Разбира се, като при всяка нова версия ще трябва да измине малко време преди по-сериозните plugin-и да излязат с официална поддръжка на 1.3, но поне от това което тествах в офиса, миграцията няма да е толкова трудна. Пък и пренаписването на разни неща с цел подобряване на производителността винаги си е струвало усилията <img src='http://www.sthoughts.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>P. S.: Можете да link-вате директно 1.3 версията от Google-сървърите за да свалите още повече времето за зареждане. Намира се тук:</p>
<pre>http://ajax.googleapis.com/ajax/libs/jquery/1.3/jquery.min.js</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.sthoughts.com/2009/01/15/jquery-13/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Ubiquity</title>
		<link>http://www.sthoughts.com/2009/01/14/ubiquity/</link>
		<comments>http://www.sthoughts.com/2009/01/14/ubiquity/#comments</comments>
		<pubDate>Wed, 14 Jan 2009 10:04:05 +0000</pubDate>
		<dc:creator>stinger</dc:creator>
				<category><![CDATA[Web Development]]></category>

		<guid isPermaLink="false">http://www.sthoughts.com/?p=543</guid>
		<description><![CDATA[<object width="470" height="351"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=1561578&#38;server=vimeo.com&#38;show_title=1&#38;show_byline=1&#38;show_portrait=0&#38;color=00ADEF&#38;fullscreen=1" /><embed src="http://vimeo.com/moogaloop.swf?clip_id=1561578&#38;server=vimeo.com&#38;show_title=1&#38;show_byline=1&#38;show_portrait=0&#38;color=00ADEF&#38;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="471" height="351"></embed></object>

<p>Пичовете в Mozilla Labs изглежда вършат доста работа в последните месеци и резултатите не закъсняват. <a href="http://labs.mozilla.com/projects/ubiquity/" target="_blank">Ubiquity for Firefox</a> е убийствено як plug-in, с помощта на който престоят в Internet се превръща в още по-приятно изживяване. Ако още не сте гледали видеото над този текст - направете го, няма да съжалявате.</p>]]></description>
			<content:encoded><![CDATA[<p><object width="470" height="351"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=1561578&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=00ADEF&amp;fullscreen=1" /><embed src="http://vimeo.com/moogaloop.swf?clip_id=1561578&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=00ADEF&amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="471" height="351"></embed></object></p>
<p>Пичовете в Mozilla Labs изглежда вършат доста работа в последните месеци и резултатите не закъсняват. <a href="http://labs.mozilla.com/projects/ubiquity/" target="_blank">Ubiquity for Firefox</a> е убийствено як plug-in, с помощта на който престоят в Internet се превръща в още по-приятно изживяване. Ако още не сте гледали видеото над този текст &#8211; направете го, няма да съжалявате.</p>
<p>Хубавото на цялата далаверка е, че е разширяема, а пък и всеки с малко познания по CSS може да създаде нов или да преправи някой от съществуващите skin-ове. Комадите използват чист AJAX за връзка със сайтовете и, ако developer-ите са толкова въодушевени от Ubiquity колкото съм и аз, е въпрос на време да видим команди за интеграция с <a href="http://www.facebook.com/" target="_blank">Facebook</a>, или още по-интензивно използване на <a href="http://pipes.yahoo.com/" target="_blank">Yahoo Pipes</a>, например.</p>
<p>Съществуващите команди дори сега ми спестяват огромно количество време при проверка на детайлите по разни API-та, така че за мен този инструмент върши повече от чудесна работа. Блогвам го, защото не вярвам да има developer, който да не иска документацията на <a href="https://wiki.mozilla.org/Labs/Ubiquity/Commands_In_The_Wild#PHP" target="_blank">PHP</a>, <a href="https://wiki.mozilla.org/Labs/Ubiquity/Commands_In_The_Wild#Rails" target="_blank">Rails</a> или <a href="https://wiki.mozilla.org/Labs/Ubiquity/Commands_In_The_Wild#jQuery" target="_blank">jQuery</a> да му е &#8220;на един select разстояние&#8221;&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sthoughts.com/2009/01/14/ubiquity/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Sitecore and SWFObject</title>
		<link>http://www.sthoughts.com/2008/11/17/sitecore-and-swfobject/</link>
		<comments>http://www.sthoughts.com/2008/11/17/sitecore-and-swfobject/#comments</comments>
		<pubDate>Mon, 17 Nov 2008 09:45:59 +0000</pubDate>
		<dc:creator>stinger</dc:creator>
				<category><![CDATA[Web Development]]></category>
		<category><![CDATA[sitecore]]></category>
		<category><![CDATA[tips]]></category>
		<category><![CDATA[xml]]></category>
		<category><![CDATA[xsl]]></category>

		<guid isPermaLink="false">http://www.sthoughts.com/?p=463</guid>
		<description><![CDATA[<div class="serendipity_center"><img src="http://www.sthoughts.com/uploads/sitecore.jpg" alt="sitecore" /></div>
<p>Продължавам на вълна <a href="http://www.sitecore.net/">Sitecore</a>. За един от проектите си имам нужда от flash replacement за някои от заглавията в страниците. За да не се получи объркване от използването на <a href="http://www.mikeindustries.com/blog/sifr/" target="_blank">sIFR</a>, решихме да използваме custom система за замяна на текста. За embedding на flash се спрях на <a href="http://code.google.com/p/swfobject/" target="_blank">SWFObject 2</a> - много лека и полезна библиотека, доста по-елегантна от <a href="http://www.adobe.com/go/7c29e252">метода на Adobe</a>.</p>]]></description>
			<content:encoded><![CDATA[<div class="serendipity_center"><img src="http://www.sthoughts.com/uploads/sitecore.jpg" alt="sitecore" /></div>
<p>Продължавам на вълна <a href="http://www.sitecore.net/">Sitecore</a>. За един от проектите си имам нужда от flash replacement за някои от заглавията в страниците. За да не се получи объркване от използването на <a href="http://www.mikeindustries.com/blog/sifr/" target="_blank">sIFR</a>, решихме да използваме custom система за замяна на текста. За embedding на flash се спрях на <a href="http://code.google.com/p/swfobject/" target="_blank">SWFObject 2</a> &#8211; много лека и полезна библиотека, доста по-елегантна от <a href="http://www.adobe.com/go/7c29e252">метода на Adobe</a>.</p>
<p>Проблемът дойде от комуникацията между Flash и приложението &#8211; знаем, че flashVars използва формат, подобен на query string в браузърите &#8211; всяка двойка променлива-стойност е разделена със знак амперсанд. SWFObject 2 позволява известна гъвкавост, позволявайки да кодирате <code>flashVars</code> като JavaScript object, но в процеса на embed-ване на flash-клипчето въпросния обект се кодира до познатия ни query string формат, което прави проблемно използването на амперсанд като част от стойността на дадена променлива &#8211; например ако искаме да предадем string от сорта на <code>Terms &#38; Conditions</code> с flashVars ще трябва да кодираме амперсанд-а в URI формат, където ще изглежда като <code>Terms %26 Conditions</code>.</p>
<p>За да направя това директно в rendering-a, използвах custom XSL template. Ето как изглежда той, мисля че ще е полезен на всеки, който се сблъсква с подобен проблем:</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;xsl:template</span> <span style="color: #000066;">match</span>=<span style="color: #ff0000;">&quot;*&quot;</span> <span style="color: #000066;">mode</span>=<span style="color: #ff0000;">&quot;main&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;xsl:variable</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;flashEscapedTitle&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;xsl:call-template</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;flashEscape&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
      <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;xsl:with-param</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;text&quot;</span> <span style="color: #000066;">select</span>=<span style="color: #ff0000;">&quot;sc:fld('title',.)&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/xsl:call-template<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/xsl:variable<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;xsl:value-of</span> <span style="color: #000066;">select</span>=<span style="color: #ff0000;">&quot;$flashEscapedTitle&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/xsl:template<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
&nbsp;
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;xsl:template</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;flashEscape&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;xsl:param</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;text&quot;</span> <span style="color: #000066;">select</span>=<span style="color: #ff0000;">&quot;.&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;xsl:choose<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;xsl:when</span> <span style="color: #000066;">test</span>=<span style="color: #ff0000;">&quot;contains($text, '&amp;#38;')&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
      <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;xsl:value-of</span></span>
<span style="color: #009900;">      <span style="color: #000066;">select</span>=<span style="color: #ff0000;">&quot;substring-before($text, '&amp;#38;')&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span><span style="color: #808080; font-style: italic;">&lt;!--</span>
<span style="color: #808080; font-style: italic;">      --&gt;</span>%26<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;xsl:call-template</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;flashEscape&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
      <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;xsl:with-param</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;text&quot;</span></span>
<span style="color: #009900;">      <span style="color: #000066;">select</span>=<span style="color: #ff0000;">&quot;substring-after($text,'&amp;#38;')&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
      <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/xsl:call-template<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/xsl:when<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;xsl:otherwise<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
      <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;xsl:value-of</span> <span style="color: #000066;">select</span>=<span style="color: #ff0000;">&quot;$text&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/xsl:otherwise<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/xsl:choose<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/xsl:template<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://www.sthoughts.com/2008/11/17/sitecore-and-swfobject/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Sitecore XSL pagination</title>
		<link>http://www.sthoughts.com/2008/11/14/sitecore-xsl-pagination/</link>
		<comments>http://www.sthoughts.com/2008/11/14/sitecore-xsl-pagination/#comments</comments>
		<pubDate>Fri, 14 Nov 2008 09:46:54 +0000</pubDate>
		<dc:creator>stinger</dc:creator>
				<category><![CDATA[Web Development]]></category>
		<category><![CDATA[pagination]]></category>
		<category><![CDATA[sitecore]]></category>
		<category><![CDATA[xml]]></category>
		<category><![CDATA[xsl]]></category>

		<guid isPermaLink="false">http://www.sthoughts.com/?p=441</guid>
		<description><![CDATA[<div class="serendipity_center"><img src="http://www.sthoughts.com/uploads/sitecore.jpg" alt="Sitecore" /></div>

<p>Някъде в средата на август имах възможност да посетя Лондон - град за който бях чувал все хубави неща. Вярно, престоят ми беше прекалено кратък - само 4 дни, при това служебно - но не съжалявам за нито един момент прекаран там. Този пост, обаче, не е за Лондон, а за причината да бъда там всъщност - трябваше да посетя курс за сертифициране като Sitecore Developer (Level 1). Та да се похваля - от близо 2 месеца съм сертифициран Sitecore Developer :)</p>

<p><a href="http://www.sitecore.net/" target="_blank">Sitecore</a> e .NET базирано enterprise CMS решение от което всеки developer има какво да научи. За съжаление 2-та дена (толкова трае курса, заедно с изпита след това), макар и интензивно наситени с лекции и практически упражнения могат да дадат на всеки начинаещ само повърхностен поглед върху системата. Преди въпросния курс бях писал съвсем малко C# и се чувствах като тотален новак. Слава богу, основната част от работата с CMS-a се състои в работа с XSL като основен език за Rendering-ите и малко ASP за Layout-a и се учи бързо.</p>]]></description>
			<content:encoded><![CDATA[<div class="serendipity_center"><img src="http://www.sthoughts.com/uploads/sitecore.jpg" alt="Sitecore" /></div>
<p>Някъде в средата на август имах възможност да посетя Лондон &#8211; град за който бях чувал все хубави неща. Вярно, престоят ми беше прекалено кратък &#8211; само 4 дни, при това служебно &#8211; но не съжалявам за нито един момент прекаран там. Този пост, обаче, не е за Лондон, а за причината да бъда там всъщност &#8211; трябваше да посетя курс за сертифициране като Sitecore Developer (Level 1). Та да се похваля &#8211; от близо 2 месеца съм сертифициран Sitecore Developer <img src='http://www.sthoughts.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><a href="http://www.sitecore.net/" target="_blank">Sitecore</a> e .NET базирано enterprise CMS решение от което всеки developer има какво да научи. За съжаление 2-та дена (толкова трае курса, заедно с изпита след това), макар и интензивно наситени с лекции и практически упражнения могат да дадат на всеки начинаещ само повърхностен поглед върху системата. Преди въпросния курс бях писал съвсем малко C# и се чувствах като тотален новак. Слава богу, основната част от работата с CMS-a се състои в работа с XSL като основен език за Rendering-ите и малко ASP.NET за Layout-a и се учи бързо.</p>
<p>Вчера се сблъсках с един дребен проблем, част от всеки динамичен сайт &#8211; странирането на резултатите. Решението реших да прехвърля върху XSL, вместо <a href="http://sdn5.sitecore.net/Articles/XSL/Using%20XSL%20Extension%20Objects/Creating%20Sitecore%20XSL%20Extension%20Function.aspx" target="_blank">да пиша Extension</a>, и изглежда не съм сбъркал, понеже не губя почти нищо от гледна точка на производителност. Да, Extension-a ще е по-бърз, най-малкото защото ще е компилиран до .dll, но така или иначе XSL сравняването с position() се случва при кеширан XML и е достатъчно оптимизирано в parser-а.</p>
<p>В .aspx файла сложих следното:</p>

<div class="wp_syntax"><div class="code"><pre class="asp" style="font-family:monospace;"><span style="color: #006600; font-weight: bold;">&lt;</span>script type<span style="color: #006600; font-weight: bold;">=</span><span style="color: #cc0000;">&quot;cs&quot;</span> runat<span style="color: #006600; font-weight: bold;">=</span><span style="color: #cc0000;">&quot;server&quot;</span><span style="color: #006600; font-weight: bold;">&gt;</span>
void Page_Load<span style="color: #006600; font-weight:bold;">&#40;</span>object sender, System.<span style="color: #9900cc;">EventArgs</span> e<span style="color: #006600; font-weight:bold;">&#41;</span> 
<span style="color: #006600; font-weight:bold;">&#123;</span>
  <span style="color: #990099; font-weight: bold;">int</span> Page <span style="color: #006600; font-weight: bold;">=</span> <span style="color: #800000;">0</span><span style="color: #006600; font-weight: bold;">;</span>
  <span style="color: #990099; font-weight: bold;">if</span> <span style="color: #006600; font-weight:bold;">&#40;</span><span style="color: #990099; font-weight: bold;">Request</span><span style="color: #006600; font-weight:bold;">&#91;</span><span style="color: #cc0000;">&quot;page&quot;</span><span style="color: #006600; font-weight:bold;">&#93;</span> <span style="color: #006600; font-weight: bold;">!=</span> <span style="color: #0000ff; font-weight: bold;">null</span> <span style="color: #006600; font-weight: bold;">&amp;&amp;</span> <span style="color: #990099; font-weight: bold;">Request</span><span style="color: #006600; font-weight:bold;">&#91;</span><span style="color: #cc0000;">&quot;page&quot;</span><span style="color: #006600; font-weight:bold;">&#93;</span>.<span style="color: #9900cc;">Length</span> <span style="color: #006600; font-weight: bold;">!=</span> <span style="color: #800000;">0</span><span style="color: #006600; font-weight:bold;">&#41;</span>
  <span style="color: #006600; font-weight:bold;">&#123;</span>
    bool success <span style="color: #006600; font-weight: bold;">=</span> 
    Int32.<span style="color: #9900cc;">TryParse</span><span style="color: #006600; font-weight:bold;">&#40;</span><span style="color: #990099; font-weight: bold;">Request</span><span style="color: #006600; font-weight:bold;">&#91;</span><span style="color: #cc0000;">&quot;page&quot;</span><span style="color: #006600; font-weight:bold;">&#93;</span>.<span style="color: #9900cc;">ToString</span><span style="color: #006600; font-weight:bold;">&#40;</span><span style="color: #006600; font-weight:bold;">&#41;</span>, out Page<span style="color: #006600; font-weight:bold;">&#41;</span><span style="color: #006600; font-weight: bold;">;</span>
    <span style="color: #990099; font-weight: bold;">if</span> <span style="color: #006600; font-weight:bold;">&#40;</span>success <span style="color: #006600; font-weight: bold;">!=</span> <span style="color: #0000ff; font-weight: bold;">true</span><span style="color: #006600; font-weight:bold;">&#41;</span>
    <span style="color: #006600; font-weight:bold;">&#123;</span>
      Page <span style="color: #006600; font-weight: bold;">=</span> <span style="color: #800000;">0</span><span style="color: #006600; font-weight: bold;">;</span>
    <span style="color: #006600; font-weight:bold;">&#125;</span>
  <span style="color: #006600; font-weight:bold;">&#125;</span>
  ArticlesPagination.<span style="color: #9900cc;">Parameters</span><span style="color: #006600; font-weight: bold;">=</span><span style="color: #cc0000;">&quot;page=&quot;</span>+Page.<span style="color: #9900cc;">ToString</span><span style="color: #006600; font-weight:bold;">&#40;</span><span style="color: #006600; font-weight:bold;">&#41;</span><span style="color: #006600; font-weight: bold;">;</span>
<span style="color: #006600; font-weight:bold;">&#125;</span> 
<span style="color: #006600; font-weight: bold;">&lt;/</span>script<span style="color: #006600; font-weight: bold;">&gt;</span></pre></div></div>

<p>Rendering-a за pagination-a изглежда така в .aspx Layout-а:</p>

<div class="wp_syntax"><div class="code"><pre class="asp" style="font-family:monospace;"><span style="color: #006600; font-weight: bold;">&lt;</span>div <span style="color: #0000ff; font-weight: bold;">class</span><span style="color: #006600; font-weight: bold;">=</span><span style="color: #cc0000;">&quot;paging&quot;</span><span style="color: #006600; font-weight: bold;">&gt;</span>
    <span style="color: #006600; font-weight: bold;">&lt;</span>sc<span style="color: #006600; font-weight: bold;">:</span>XslFile runat<span style="color: #006600; font-weight: bold;">=</span><span style="color: #cc0000;">&quot;server&quot;</span>
    renderingid<span style="color: #006600; font-weight: bold;">=</span><span style="color: #cc0000;">&quot;{the-rendering-id}&quot;</span>
    path<span style="color: #006600; font-weight: bold;">=</span><span style="color: #cc0000;">&quot;/xsl/ArticlesPagination.xslt&quot;</span> id<span style="color: #006600; font-weight: bold;">=</span><span style="color: #cc0000;">&quot;ArticlesPagination&quot;</span><span style="color: #006600; font-weight: bold;">&gt;</span>
    <span style="color: #006600; font-weight: bold;">&lt;/</span>sc<span style="color: #006600; font-weight: bold;">:</span>XslFile<span style="color: #006600; font-weight: bold;">&gt;</span>
<span style="color: #006600; font-weight: bold;">&lt;/</span>div<span style="color: #006600; font-weight: bold;">&gt;</span></pre></div></div>

<p>ArticlesPagination.xsl съдържа следното (пропуснал съм служебните декларации за namespace, както и някои променливи, които нямат отношение към странирането):</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;xsl:template</span> <span style="color: #000066;">match</span>=<span style="color: #ff0000;">&quot;*&quot;</span> <span style="color: #000066;">mode</span>=<span style="color: #ff0000;">&quot;main&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;xsl:variable</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;total&quot;</span></span>
<span style="color: #009900;"><span style="color: #000066;">select</span>=<span style="color: #ff0000;">&quot;count($sc_currentitem/item[@template='article'])-1&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;xsl:variable</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;per_page&quot;</span> <span style="color: #000066;">select</span>=<span style="color: #ff0000;">&quot;3&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;xsl:variable</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;pages&quot;</span></span>
<span style="color: #009900;"><span style="color: #000066;">select</span>=<span style="color: #ff0000;">&quot;ceiling($total div $per_page)&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;xsl:variable</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;start&quot;</span> <span style="color: #000066;">select</span>=<span style="color: #ff0000;">&quot;($page * $per_page)+1&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;xsl:variable</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;end&quot;</span> <span style="color: #000066;">select</span>=<span style="color: #ff0000;">&quot;($start + $per_page)+1&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;xsl:variable</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;path&quot;</span> <span style="color: #000066;">select</span>=<span style="color: #ff0000;">&quot;sc:path(.)&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;xsl:choose<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;xsl:when</span> <span style="color: #000066;">test</span>=<span style="color: #ff0000;">&quot;number($page)-1 &amp;gt;= 0&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;a</span> <span style="color: #000066;">class</span>=<span style="color: #ff0000;">&quot;prev&quot;</span> <span style="color: #000066;">href</span>=<span style="color: #ff0000;">&quot;{$path}?page={number($page)-1}&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
    Previous<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/a<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/xsl:when<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;xsl:otherwise<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #808080; font-style: italic;">&lt;!-- display something else --&gt;</span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/xsl:otherwise<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/xsl:choose<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;xsl:choose<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;xsl:when</span> <span style="color: #000066;">test</span>=<span style="color: #ff0000;">&quot;number($pages) = 1&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;span<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>Page<span style="color: #ddbb00;">&amp;#160;</span><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;strong<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;xsl:value-of</span> <span style="color: #000066;">select</span>=<span style="color: #ff0000;">&quot;number($page)+1&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span><span style="color: #ddbb00;">&amp;#160;</span>of<span style="color: #ddbb00;">&amp;#160;</span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;xsl:value-of</span> <span style="color: #000066;">select</span>=<span style="color: #ff0000;">&quot;number($pages)&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span><span style="color: #000000; font-weight: bold;">&lt;/strong<span style="color: #000000; font-weight: bold;">&gt;</span></span><span style="color: #000000; font-weight: bold;">&lt;/span<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/xsl:when<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;xsl:otherwise<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;xsl:call-template</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;loopPages&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
      <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;xsl:with-param</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;goUntil&quot;</span> <span style="color: #000066;">select</span>=<span style="color: #ff0000;">&quot;$pages&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
      <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;xsl:with-param</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;currentPage&quot;</span></span>
<span style="color: #009900;">      <span style="color: #000066;">select</span>=<span style="color: #ff0000;">&quot;number($page)+1&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
      <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;xsl:with-param</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;startAt&quot;</span> <span style="color: #000066;">select</span>=<span style="color: #ff0000;">&quot;1&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
      <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;xsl:with-param</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;path&quot;</span> <span style="color: #000066;">select</span>=<span style="color: #ff0000;">&quot;$path&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/xsl:call-template<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/xsl:otherwise<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/xsl:choose<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;xsl:choose<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;xsl:when</span> <span style="color: #000066;">test</span>=<span style="color: #ff0000;">&quot;number($page)+1 &amp;lt; number($pages)&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;a</span> <span style="color: #000066;">class</span>=<span style="color: #ff0000;">&quot;next&quot;</span> <span style="color: #000066;">href</span>=<span style="color: #ff0000;">&quot;{$path}?page={number($page)+1}&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
    Next<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/a<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/xsl:when<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;xsl:otherwise<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #808080; font-style: italic;">&lt;!-- display something else --&gt;</span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/xsl:otherwise<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/xsl:choose<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/xsl:template<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
&nbsp;
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;xsl:template</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;loopPages&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;xsl:param</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;startAt&quot;</span> <span style="color: #000066;">select</span>=<span style="color: #ff0000;">&quot;0&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;xsl:param</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;goUntil&quot;</span> <span style="color: #000066;">select</span>=<span style="color: #ff0000;">&quot;0&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;xsl:param</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;currentPage&quot;</span> <span style="color: #000066;">select</span>=<span style="color: #ff0000;">&quot;0&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;xsl:param</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;path&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
&nbsp;
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;xsl:if</span> <span style="color: #000066;">test</span>=<span style="color: #ff0000;">&quot;number($startAt) &amp;lt; number($goUntil)+1&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;xsl:choose<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
      <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;xsl:when</span> <span style="color: #000066;">test</span>=<span style="color: #ff0000;">&quot;number($startAt) = number($currentPage)&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;a</span> <span style="color: #000066;">class</span>=<span style="color: #ff0000;">&quot;current-page&quot;</span></span>
<span style="color: #009900;">        <span style="color: #000066;">href</span>=<span style="color: #ff0000;">&quot;{$path}?page={number($currentPage)-1}&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;xsl:value-of</span> <span style="color: #000066;">select</span>=<span style="color: #ff0000;">&quot;$startAt&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span><span style="color: #000000; font-weight: bold;">&lt;/a<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
      <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/xsl:when<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
      <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;xsl:otherwise<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;a</span> <span style="color: #000066;">href</span>=<span style="color: #ff0000;">&quot;{$path}?page={number($startAt)-1}&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;xsl:value-of</span> <span style="color: #000066;">select</span>=<span style="color: #ff0000;">&quot;$startAt&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span><span style="color: #000000; font-weight: bold;">&lt;/a<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
      <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/xsl:otherwise<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/xsl:choose<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;xsl:call-template</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;loopPages&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
      <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;xsl:with-param</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;startAt&quot;</span> <span style="color: #000066;">select</span>=<span style="color: #ff0000;">&quot;$startAt + 1&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
      <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;xsl:with-param</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;goUntil&quot;</span> <span style="color: #000066;">select</span>=<span style="color: #ff0000;">&quot;$goUntil&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
      <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;xsl:with-param</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;currentPage&quot;</span> <span style="color: #000066;">select</span>=<span style="color: #ff0000;">&quot;$currentPage&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
      <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;xsl:with-param</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;path&quot;</span> <span style="color: #000066;">select</span>=<span style="color: #ff0000;">&quot;$path&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/xsl:call-template<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/xsl:if<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/xsl:template<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://www.sthoughts.com/2008/11/14/sitecore-xsl-pagination/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Rails: A find tip</title>
		<link>http://www.sthoughts.com/2008/07/29/rails-a-find-tip/</link>
		<comments>http://www.sthoughts.com/2008/07/29/rails-a-find-tip/#comments</comments>
		<pubDate>Tue, 29 Jul 2008 10:00:35 +0000</pubDate>
		<dc:creator>stinger</dc:creator>
				<category><![CDATA[Web Development]]></category>
		<category><![CDATA[find]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[tip]]></category>

		<guid isPermaLink="false">http://www.sthoughts.com/?p=382</guid>
		<description><![CDATA[<p><img src="http://www.sthoughts.com/uploads/rails.png" alt="" style="float: right; padding-left: 10px; margin-top: 5px;">Търсенето за записи в база данни вероятно е първото нещо, което сте научили след като сте минали през процеса "Как да инсталирам Rails на моята машина?". И понеже като повечето неща в този framework и търсенето е направено достатъчно интуитивно - няма начин да сте срещнали някакви неудобства.</p>]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.sthoughts.com/uploads/rails.png" alt="" style="float: right; padding-left: 10px; margin-top: 5px;">Търсенето за записи в база данни вероятно е първото нещо, което сте научили след като сте минали през процеса &#8220;Как да инсталирам Rails на моята машина?&#8221;. И понеже като повечето неща в този framework и търсенето е направено достатъчно интуитивно &#8211; няма начин да сте срещнали някакви неудобства.</p>
<p>Нека обаче вземем за пример следната табилца:</p>
<pre>mysql> DESCRIBE posts;
+------------+--------------+------+-----+---------+-------------+
| Field      | Type         | Null | Key | Default | Extra       |
+------------+--------------+------+-----+---------+-------------+
| id         | int(11)      | NO   | PRI | NULL    | auto_inc... |
| title      | varchar(255) | YES  |     | NULL    |             |
| body       | text         | YES  |     | NULL    |             |
| published  | tinyint(1)   | YES  |     | NULL    |             |
| created_at | datetime     | YES  |     | NULL    |             |
| updated_at | datetime     | YES  |     | NULL    |             |
+------------+--------------+------+-----+---------+-------------+
6 rows in set (0.00 sec)</pre>
<p>Стандартно форматът за търсене на първият запис в таблицата Posts, който има заглавие, съвпадащо с &#8220;rails&#8221; би трябвало да изглежда по този начин:</p>

<div class="wp_syntax"><div class="code"><pre class="rails" style="font-family:monospace;"><span style="color:#0066ff; font-weight:bold;">@condition</span> = <span style="color:#996600;">&quot;rails&quot;</span>
<span style="color:#0066ff; font-weight:bold;">@post</span> = Post.<span style="color:#9900CC;">find</span> <span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:first</span>,
        <span style="color:#ff3333; font-weight:bold;">:conditions</span><span style="color:#006600; font-weight:bold;">=&gt;</span><span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">&quot;title LIKE ?&quot;</span>, <span style="color:#996600;">&quot;%#{@condition}%&quot;</span><span style="color:#006600; font-weight:bold;">&#93;</span>
<span style="color:#006600; font-weight:bold;">&#41;</span></pre></div></div>

<p>Това е перфектен вариант когато търсите срещане за даден стринг само в определена колона от БД. Ако обаче искате да намерите първият записи в таблицата Posts, който съдържа &#8220;rails&#8221; и в заглавието и в тялото си, ще трябва да модифицирате горният пример по следния начин:</p>

<div class="wp_syntax"><div class="code"><pre class="rails" style="font-family:monospace;"><span style="color:#0066ff; font-weight:bold;">@condition</span> = <span style="color:#996600;">&quot;rails&quot;</span>
<span style="color:#0066ff; font-weight:bold;">@post</span> = Post.<span style="color:#9900CC;">find</span> <span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:first</span>,
        <span style="color:#ff3333; font-weight:bold;">:conditions</span><span style="color:#006600; font-weight:bold;">=&gt;</span><span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">&quot;title LIKE ? AND body LIKE ?&quot;</span>,
        <span style="color:#996600;">&quot;%#{@condition}%&quot;</span>, <span style="color:#996600;">&quot;%#{@condition}%&quot;</span><span style="color:#006600; font-weight:bold;">&#93;</span>
<span style="color:#006600; font-weight:bold;">&#41;</span></pre></div></div>

<p>Работещо, но грозно решение, което ме накара да поровя малко из документацията. В крайна сметка стигнах до следното, поне според мен, много по-красиво и практично справяне с проблема:</p>

<div class="wp_syntax"><div class="code"><pre class="rails" style="font-family:monospace;"><span style="color:#0066ff; font-weight:bold;">@condition</span> = <span style="color:#996600;">&quot;rails&quot;</span>
<span style="color:#0066ff; font-weight:bold;">@post</span> = Post.<span style="color:#9900CC;">find</span> <span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:first</span>,
        <span style="color:#ff3333; font-weight:bold;">:conditions</span><span style="color:#006600; font-weight:bold;">=&gt;</span><span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">&quot;title LIKE :what AND body LIKE :what&quot;</span>,
        <span style="color:#006600; font-weight:bold;">&#123;</span>:what<span style="color:#006600; font-weight:bold;">=&gt;</span><span style="color:#996600;">&quot;%#{@condition}%&quot;</span><span style="color:#006600; font-weight:bold;">&#125;</span><span style="color:#006600; font-weight:bold;">&#93;</span>
<span style="color:#006600; font-weight:bold;">&#41;</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://www.sthoughts.com/2008/07/29/rails-a-find-tip/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Rails: Send a file to user</title>
		<link>http://www.sthoughts.com/2008/05/09/rails-send-file-to-user/</link>
		<comments>http://www.sthoughts.com/2008/05/09/rails-send-file-to-user/#comments</comments>
		<pubDate>Fri, 09 May 2008 11:22:48 +0000</pubDate>
		<dc:creator>stinger</dc:creator>
				<category><![CDATA[Web Development]]></category>
		<category><![CDATA[favorites]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[tips]]></category>

		<guid isPermaLink="false">http://www.sthoughts.com/?p=377</guid>
		<description><![CDATA[<p><img src="http://www.sthoughts.com/uploads/rails.png" alt="" style="float: right; padding-left: 10px; margin-top: 5px;">Изпращането на файл към потребителя е доста тривиална задача, и начинът по който можете да я постигнете с Rails е относително лесен - основната функция за целта е <code>send_file</code>, която, според документацията би трябвало да прави следното:</p>

<blockquote>Sends the file by streaming it 4096 bytes at a time. This way the whole file doesn‘t need to be read into memory at once. This makes it feasible to send even large files</blockquote>

<p>Да, ама не. Ако ползвате mongrel (което правят 90% от rails developer-ите), файлът изобщо не се разбива на парчета от по 4096 bytes, а се качва целия в паметта.</p>]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.sthoughts.com/uploads/rails.png" alt="" style="float: right; padding-left: 10px; margin-top: 5px;">Изпращането на файл към потребителя е доста тривиална задача, и начинът по който можете да я постигнете с Rails е относително лесен &#8211; основната функция за целта е <code>send_file</code>, която, според документацията би трябвало да прави следното:</p>
<blockquote><p>Sends the file by streaming it 4096 bytes at a time. This way the whole file doesn‘t need to be read into memory at once. This makes it feasible to send even large files</p></blockquote>
<p>Да, ама не. Ако ползвате mongrel (което правят 90% от rails developer-ите), файлът изобщо не се разбива на парчета от по 4096 bytes, а се качва целия в паметта.</p>
<p>Алтернтивен вариант е да използвате опцията <code>send_data</code>, но пък тя изисква buffer с данни, за да изпълни нормално работата си. Ето пример как можете да изпратите файл с помощта на <code>send_data</code>:</p>

<div class="wp_syntax"><div class="code"><pre class="rails" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">def</span> download
  <span style="color:#5A0A0A; font-weight:bold;">send_data</span> <span style="color:#CC00FF; font-weight:bold;">IO</span>.<span style="color:#9900CC;">read</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">'path/to.file'</span><span style="color:#006600; font-weight:bold;">&#41;</span>, <span style="color:#ff3333; font-weight:bold;">:filename</span><span style="color:#006600; font-weight:bold;">=&gt;</span><span style="color:#996600;">'somename.ext'</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>Третият, и поне според мен най-чист, метод е да оставите цялата работа по връщането на файловете на web-сървъра, който ползвате като frontend.</p>
<p>В случай, че ползвате Apache или Lighttpd, методът за изпращане на файл до потребителя ще трябва да изглежда така:</p>

<div class="wp_syntax"><div class="code"><pre class="rails" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">def</span> download
  response.<span style="color:#9900CC;">headers</span><span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">'X-Sendfile'</span><span style="color:#006600; font-weight:bold;">&#93;</span> = <span style="color:#996600;">'path/to.file'</span>;
  <span style="color:#5A0A0A; font-weight:bold;">render</span> <span style="color:#ff3333; font-weight:bold;">:nothing</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#0000FF; font-weight:bold;">true</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>Ако изборът ви е паднал върху Nginx &#8211; ето вариант на метода, с който ще постигнете същото:</p>

<div class="wp_syntax"><div class="code"><pre class="rails" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">def</span> download
  response.<span style="color:#9900CC;">headers</span><span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">'X-Accel-Redirect'</span><span style="color:#006600; font-weight:bold;">&#93;</span> = <span style="color:#996600;">'path/to.file'</span>;
  <span style="color:#5A0A0A; font-weight:bold;">render</span> <span style="color:#ff3333; font-weight:bold;">:nothing</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#0000FF; font-weight:bold;">true</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>При мен download URL-a не работеше по подразбиране, връщайки <code>ActiveRecord::RecordNotFound</code>, защото контролера който ползвах отразяваше REST ресурс. За да го накарам да работи във файла <code>/config/routes.rb</code> се наложи да заменя следния ред:</p>

<div class="wp_syntax"><div class="code"><pre class="rails" style="font-family:monospace;">map.<span style="color:#9900CC;">resources</span> <span style="color:#ff3333; font-weight:bold;">:download_demo</span></pre></div></div>

<p>със следното:</p>

<div class="wp_syntax"><div class="code"><pre class="rails" style="font-family:monospace;">map.<span style="color:#9900CC;">resources</span> <span style="color:#ff3333; font-weight:bold;">:download_demo</span>, <span style="color:#ff3333; font-weight:bold;">:collection</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#006600; font-weight:bold;">&#123;</span>:download <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#ff3333; font-weight:bold;">:get</span><span style="color:#006600; font-weight:bold;">&#125;</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://www.sthoughts.com/2008/05/09/rails-send-file-to-user/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Linux gets some AIR</title>
		<link>http://www.sthoughts.com/2008/04/03/linux-gets-some-air/</link>
		<comments>http://www.sthoughts.com/2008/04/03/linux-gets-some-air/#comments</comments>
		<pubDate>Thu, 03 Apr 2008 15:23:18 +0000</pubDate>
		<dc:creator>stinger</dc:creator>
				<category><![CDATA[Linux/UNIX]]></category>
		<category><![CDATA[Web Development]]></category>
		<category><![CDATA[adobe]]></category>
		<category><![CDATA[air]]></category>
		<category><![CDATA[flex]]></category>
		<category><![CDATA[linux]]></category>

		<guid isPermaLink="false">http://www.sthoughts.com/?p=372</guid>
		<description><![CDATA[<div class="serendipity_center"><img src="http://www.sthoughts.com/uploads/air_icon.jpeg" alt="Adobe AIR" /></div>

<p>С появата на Flex 3, потребителите на GNU/Linux се докоснаха до света на RIA, поне според начина по който виждат нещата хората от Adobe. Една досадна подробност беше отсъствието на AIR (Adobe Integrated Runtime), което ограничаваше Flex-потребителите само до web-базирани разработки. Макар и alpha версия, AIR вече е наличен от сайта <a href="http://labs.adobe.com/downloads/air_linux.html" target="_blank">labs.adobe.com</a> и за Linux, след като преди месец дебютира на Windows и Mac OS.</p>]]></description>
			<content:encoded><![CDATA[<div class="serendipity_center"><img src="http://www.sthoughts.com/uploads/air_icon.jpeg" alt="Adobe AIR" /></div>
<p>С появата на Flex 3, потребителите на GNU/Linux се докоснаха до света на RIA, поне според начина по който виждат нещата хората от Adobe. Една досадна подробност беше отсъствието на AIR (Adobe Integrated Runtime), което ограничаваше Flex-потребителите само до web-базирани разработки. Макар и alpha версия, AIR вече е наличен от сайта <a href="http://labs.adobe.com/downloads/air_linux.html" target="_blank">labs.adobe.com</a> и за Linux, след като преди месец дебютира на платформите Windows и Mac OS.</p>
<p>Въпреки, че е все още alpha стадий, runtime-а предлага доста добри възможности, лесна инсталация и солидна документация, а липсващата функционалност ще бъде добавена в следващите няколко месеца. Приложения, написани за AIR вече се намират на много места из мрежата, а възможността освен Flex за създаване на приложения да се използва и HTML/JavaScript дава на framework-a отлична гъвкавост.</p>
<p>Изглежда, битката с Microsoft е накарала мениджмънта на Adobe да вземе някои доста интересни решения. Редом с обявяването на alpha-та, от press release-а на фирмата обявиха <a href="http://opensource.adobe.com/wiki/display/site/2008/03/31/Adobe+joins+the+Linux+Foundation" target="_blank">присъединяване към Linux Foundation</a>, а като капак на всичко части от продукта LifeCycle бяха пуснати като Open Source под името <a href="http://opensource.adobe.com/wiki/display/blazeds/BlazeDS" target="_blank">BlazeDS</a>. Междувременно <a href="http://labs.adobe.com/technologies/flex/flexbuilder_linux/" target="_blank">Flex Builder за Linux</a> стигна до версия Alpha 3, осигурявайки поддръжка на AIR, a според главния софтуерен архитект на Cold Fusion, продукта ще последва съдбата на Flex, отваряйки кода си.</p>
<p>Хубаво нещо е конкуренцията, особено когато от цялата работа печеливш се оказва крайният потребител <img src='http://www.sthoughts.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.sthoughts.com/2008/04/03/linux-gets-some-air/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Adobe Flex 3</title>
		<link>http://www.sthoughts.com/2008/02/29/adobe-flex-3/</link>
		<comments>http://www.sthoughts.com/2008/02/29/adobe-flex-3/#comments</comments>
		<pubDate>Fri, 29 Feb 2008 12:03:09 +0000</pubDate>
		<dc:creator>stinger</dc:creator>
				<category><![CDATA[Web Development]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[flash]]></category>
		<category><![CDATA[flex]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[web-2.0]]></category>

		<guid isPermaLink="false">http://www.sthoughts.com/?p=369</guid>
		<description><![CDATA[<div class="serendipity_center"><a href="http://www.adobe.com/products/flex/" target="_blank"><img src="http://www.sthoughts.com/uploads/flex3.jpg" alt="Adobe Flex 3 logo" /></a></div>

<p>Една добра новина от последната седмица е официалната поява на финалната версия на RIA SDK-то на Adobe, Flex. След 3 beta-версии, Flex излиза официално под Mozilla Public Licence, макар че отделни части (като патентованите Adobe® Flash® Player, Adobe® AIR™ и разни технологии от сорта на на encoding на шрифтовете) са налични чрез Adobe Flex SDK license.</p>]]></description>
			<content:encoded><![CDATA[<p>Една добра новина от последната седмица е официалната поява на финалната версия на RIA SDK-то на Adobe, Flex. След 3 beta-версии, Flex излиза официално под Mozilla Public Licence, макар че отделни части (като патентованите Adobe® Flash® Player, Adobe® AIR™ и разни технологии от сорта на на encoding на шрифтовете) са налични чрез Adobe Flex SDK license.</p>
<div class="serendipity_center"><a href="http://www.adobe.com/products/flex/" target="_blank"><img src="http://www.sthoughts.com/uploads/flex3.jpg" alt="Adobe Flex 3 logo" /></a></div>
<p>Встрани от подробностите около патентите, Adobe са свършили повече от чудесна работа по SDK-то и, както изглежда, хвърлят големи усилия за налагането му на пазара. Алтернативи, разбира се, има и като най-сериозен конкурент на Flex се очертава технологията Silverlight на Microsoft, която, благодарение на Windows Update вече е част от доста клиентски PC-та. Flash Player (на който е базирано SDK-то), обаче, е утвърден от години, има солидна база потребители и като технология намира все повече поддръжници от страна на дизайнерите, а благодарение на Flex &#8211; и от страна на разработчиците.</p>
<p>Новостите са много, повечето от тях са добре дошли и като цяло платформата започва да придобива зрялост, а с интегрирането на технологията Adobe® AIR™ се очаква Flex да намери място и сред средите за разработка на standalone приложения. Като че ли един от най-сериозните проблеми на Flash Player беше липсата на синхронизацията между адресното пространство на Flash Player и това на web-браузърите &#8211; т.е. можехте да заредите цял Flash-базиран сайт, но нямаше възможност да bookmark-нете точно определена част от сайта (поне не без допълнителни библиотеки). От версия 3, Flex вече предлага опция, наречена <a href="http://labs.adobe.com/wiki/index.php/Flex_3:Feature_Introductions:_Deep_Linking" target="_blank">Deep Linking</a>, благодарение на която този проблем може да бъде решен. Макар за момента да липсва добра интеграция с Opera, въпрос на време е разработчиците на браузъра да ликвидират проблема.</p>
<p>От технологична гледна точка, Persistent Framework Caching е може би най-ценната новост във Flex 3 и благодарение на поддръжката на runtime-shared-libraries вече е възможно сериозно намаляване на размера на приложенията. Освен това сред новостите има и &#8220;жива&#8221; поддръжка на локализации, интеграция с JavaScript/AJAX, дребни допълнения към компонентите и бог знае още колко неща, които не са видими от пръв поглед.</p>
<p>Дано framework-a намери подобаващ прием, Google вече заложиха на него за някои компоненти в Analytics, а в <a href="http://flex.org/showcase/">showcase-a на Flex.org</a> могат да се намерят интересни решения, които, поне според мен, обещават интересно развитие на web-a в бъдеще&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sthoughts.com/2008/02/29/adobe-flex-3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>So fuckin&#8217; bad</title>
		<link>http://www.sthoughts.com/2008/01/16/so-fuckin-bad/</link>
		<comments>http://www.sthoughts.com/2008/01/16/so-fuckin-bad/#comments</comments>
		<pubDate>Wed, 16 Jan 2008 15:02:50 +0000</pubDate>
		<dc:creator>stinger</dc:creator>
				<category><![CDATA[Web Development]]></category>

		<guid isPermaLink="false">http://www.sthoughts.com/?p=362</guid>
		<description><![CDATA[<p>Новият дизайн на порталният сайт Гювеч.bg с чиста съвест могат да определя като поредния случай, в който преправянето на визията на сайт в българското пространство дърпа стремглаво към посредствеността, дори и по-зле. Странно е, че след като и dir.bg и data.bg претърпяха не редизайн, а по-скоро de-face, назад от модата не останаха и netinfo, които решиха да попрецакат вероятно най-популярния си сайт.</p>

<p>В никакъв случай 696-те грешки при валидиране на началната страница (в момента на писане на постинга) не са основният критерий за оформяне на мнението ми. Сайтът е сред фаворитите ми, "минавам" през него поне вднъж дневно и го използвам като източник на доста полезна информация, така че предполагам реакцията ми следва да се приема по-скоро като фенска, отколкото професионална.</p>]]></description>
			<content:encoded><![CDATA[<p>Новият дизайн на порталният сайт Гювеч.bg с чиста съвест могат да определя като поредния случай, в който преправянето на визията на сайт в българското пространство дърпа стремглаво към посредствеността, дори и по-зле. Странно е, че след като и dir.bg и data.bg претърпяха не редизайн, а по-скоро de-face, назад от модата не останаха и netinfo, които решиха да попрецакат вероятно най-популярния си сайт.</p>
<p>В никакъв случай 696-те грешки при валидиране на началната страница (в момента на писане на постинга) не са основният критерий за оформяне на мнението ми. Сайтът е сред фаворитите ми, &#8220;минавам&#8221; през него поне вднъж дневно и го използвам като източник на доста полезна информация, така че предполагам реакцията ми следва да се приема по-скоро като фенска, отколкото професионална.</p>
<p>Въпреки това очевадните грешки няма как да минат незабелязано. Комбинацията сиво/бяло/зелено може и да е сполучлива, но резултатът в случая е нагледен пример как, залагайки на успешна формула, можеш да получиш кофти резултат. Като цяло от несполучливия дизайн единствената &#8220;полза&#8221; е, че шарените банери се натрапват отвратително много за сметка на съдържанието. Не че и в предишния дизайн нямаше недомислици, но загубата на място определено беше в пъти по-малка. В новият дизайн вероятно дизайнерите са имали предвид типографските правила за whitespace, но добрата идея няма нищо общо с крайния резултат.</p>
<p>Нямам нищо против иновациите, но смяната на визията с лош заместител по правило е един от най-бързите начини да загубиш потребителска база. За съжаление нямам достъп до старият му вариант, иначе съм любопитен да разбера дали и колко точно трафик е спестен, благодарение на нововъведенията. И за да не излезе поста много хейтърски &#8211; в цялото начинание все пак има и нещо позитивно &#8211; използването на изцяло CSS-базиран layout винаги е добра идея и с повечко писане някои от недостатъците могат да бъдат премахнати, без да се налага пипане по кода.</p>
<p>Надявам се само да не съм единствения, който не е доволен от новият дизайн, иначе ще трябва да започна да се притеснявам&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sthoughts.com/2008/01/16/so-fuckin-bad/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
