tag:blogger.com,1999:blog-197202162009-06-23T02:23:11.250+03:00Svilen Spasov's Dev CornerSvilen Spasovhttp://www.blogger.com/profile/13024634252981285729noreply@blogger.comBlogger40125tag:blogger.com,1999:blog-19720216.post-81045070770382988882009-06-04T01:47:00.009+03:002009-06-05T14:04:30.755+03:00XHProf 0.9.2 is out and ready for Mac OS X<div>Version <a href="http://pecl.php.net/package/xhprof/0.9.2">0.9.2</a> of Facebook's <a href="http://pecl.php.net/package/xhprof/0.9.2">XHProf</a> PHP module is out!<br /></div><div><br /></div><div>Thanks to Kannan from Facebook's dev team <a href="http://blog.svilen.com/2009/05/facebooks-xhprof-php-module-patch-for.html">the patch for OS X</a> is now a part of the official release.<br /></div><div><br /></div><div>Go get it Mac users! It compiles on OS X perfectly.</div><div><br /></div><div>Two weeks ago I <a href="http://blog.svilen.com/2009/05/facebooks-xhprof-php-module-patch-for.html">wrote</a> that I've made a patch for version 0.9.1 to build under OS X.</div><div>Then I decided to post a request on XHProf's bug track and supply the patch there.</div><div>Kannan (leader of the project) answered and we collaborated in the next week for applying the patch in the next official release of XHProf.<br /></div><div><br /></div><div>You can read more about the whole story on <a href="http://pecl.php.net/bugs/bug.php?id=16544">PECL</a>.</div><div><br /></div><div>Thank you, Kannan, for your time and efforts!</div><div><br /></div><div>I am glad that version 0.9.2 has a port for Mac OS X and I was able to help for that.</div><div class="blogger-post-footer">Atom Feeds <a href="http://blog.svilen.com/atom.xml">http://blog.svilen.com/atom.xml</a><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19720216-8104507077038298888?l=blog.svilen.com'/></div>Svilen Spasovhttp://www.blogger.com/profile/13024634252981285729noreply@blogger.com0tag:blogger.com,1999:blog-19720216.post-87558004614540520232009-05-17T23:33:00.018+03:002009-06-05T14:02:28.876+03:00Facebook's XHProf PHP module patch for Mac OS X Leopard Build<div>*) note (05 Jun 2009): Thanks to Kannan from Facebook dev team the patch is now available as part of the official <a href="http://pecl.php.net/package/xhprof/0.9.2">0.9.2 release</a>. You can download <a href="http://pecl.php.net/package/xhprof/0.9.2">it</a> from <a href="http://pecl.php.net/package/xhprof/0.9.2">PECL</a>.</div><div><br /></div><div><a href="http://www.svilen.com/xhprof-0.9.1_patch_macosx_leopard.tar.gz">Download</a> full patched XHProf 0.9.1 for MAC OS X Leopard</div><div>or <a href="http://www.svilen.com/xhprof_0.9.1_patch_build_macosx_leopard.diff">get the patch file only</a>.</div><div>Bug submitted on <a href="http://pecl.php.net/bugs/bug.php?id=16544">PECL.</a></div><div><br /></div><div>Full story</div><div>-----------</div><div><br /></div>Yesterday (15 May 2009) I ran into <a href="http://developers.facebook.com/xhprof/">XHProf</a> module made by Facebook and published open source in March 2009.<div>Right after I read about its great features I was sure I had to try it and eventually put it on production servers. I was looking for such kind of PHP profiler with stats since 2005 when I found <a href="http://www.xdebug.org/">XDebug</a>, which is really cool while developing but I wouldn't put it on a live server with high load like <a href="http://www.tupalka.com/">Tupalka.com</a>'s.</div><div><br /></div><div>Eventually later that day our server hosting <a href="http://www.tupalka.com/">Tupalka.com</a> was hit by a huge traffic and it was very loaded from time to time when the <a href="http://eaccelerator.net/">eAccelerator</a> caches expires and most of the heavy mysql queries have to be ran once per 15 mins. That force me to try the XHProf.</div><div>Yup, I am sure that the problem was in the queries then why I was going for the XHProf? Good question. Curiosity.</div><div><br /></div><div>These very moments are the once that push me to find and try different and new tools for optimization of web application/web sites.</div><div>So I was desparate to put <a href="http://pecl.php.net/package/xhprof">XHProf</a> on the production server at that moment, but I wanted just to take a look at it on my laptop for 30minutes before going live.</div><div><br /></div><div>And here starts my real story with <a href="http://pecl.php.net/package/xhprof">XHProf</a>.</div><div><br /></div><div>I downloaded latest PHP 5.2.9 and copied XHProf/extension folder to php_source/ext, ran:</div><div>#rm ./configure; ./buildconf --force; ./configure --prefix=/usr/local/php --with-xhprof; make</div><div><br /></div><div>and ... it did not compile. The make exited with:</div><div><br /></div><div><div>php_source/ext/xhprof/xhprof.c:202: error: syntax error before 'cpu_set_t'</div><div>php_source/ext/xhprof/xhprof.c:202: warning: no semicolon at end of struct or union</div><div>php_source/ext/xhprof/xhprof.c:213: error: syntax error before '}' token</div><div>php_source/ext/xhprof/xhprof.c:213: warning: data definition has no type or storage class</div><div>php_source/ext/xhprof/xhprof.c:222: error: syntax error before 'hp_globals'</div><div>php_source/ext/xhprof/xhprof.c:222: warning: data definition has no type or storage class</div><div><br /></div><div>"Ooohh, gush" I thought and I opened xhprof.c</div><div>It's kinda miss-reading the docs on my side, cause I opened then and saw:</div><div><br /></div><div>"Note: A windows port hasn't been implemented yet. We have tested xhprof on Linux/FreeBSD so far.</div><div><br /></div><div>Note: XHProf uses the RDTSC instruction (time stamp counter) to implement a really low overhead timer for elapsed time. So at the moment xhprof only works on x86 architecture. Also, since RDTSC values may not be synchronized across CPUs, xhprof binds the program to a single CPU during the profiling period."</div><div><br /></div><div>Ahh, they haven't tested the module on MAC OS X. And why should they? All of their servers run on Linux or FreeBSD. It's clear.</div><div><br /></div><div>Ok, now I have to look and see if I can patch it.</div><div>(Oh, I forgot to tell that meanwhile I decided to change eAccelerator's cache expire on the loaded server to 2 hours, so load problem was resolved for a day or two and I had time to look at the XHProf)</div><div><br /></div><div>Clearly XHProf documentation says that the module has to be bind to a single CPU and I knew that the "Thread Affinity" is implemented in a little bit different way in MAC OS X than in Linux or FreeBSD. Maybe that was the problem?</div><div>Yup, it is. Facebook team have made a patch for the affinity function in FreeBSD, but that's it. Now I have to add a similar solution for OS X.</div><div><br /></div><div>I started to read more about thread affinity in Leopard and I found <a href="http://developer.apple.com/releasenotes/Performance/RN-AffinityAPI/">this document</a>, which explains Apple's affinity API. Then after reading again and again, looking for some code snippets over the net I got the solution:</div><div><br /></div><div>on line 30 to 49 replace with this:<br /></div><div><br /></div><div><div><div>#ifdef __FreeBSD__</div><div># if __FreeBSD_version >= 700110</div><div># include <sys/resource.h></sys/resource.h></div><div># include <sys/cpuset.h></sys/cpuset.h></div><div># define cpu_set_t cpuset_t</div><div>#<span class="Apple-tab-span" style="white-space:pre"> </span>define SET_AFFINITY(pid, size, mask)<span class="Apple-tab-span" style="white-space:pre"> </span>\</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>cpuset_setaffinity(CPU_LEVEL_WHICH, CPU_WHICH_TID, -1, size, mask)</div><div>#<span class="Apple-tab-span" style="white-space:pre"> </span>define GET_AFFINITY(pid, size, mask)<span class="Apple-tab-span" style="white-space:pre"> </span>\</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>cpuset_getaffinity(CPU_LEVEL_WHICH, CPU_WHICH_TID, -1, size, mask)</div><div># else</div><div># error "This version of FreeBSD does not support cpusets"</div><div># endif /* __FreeBSD_version */</div><div>#elif __APPLE__</div><div>#<span class="Apple-tab-span" style="white-space:pre"> </span>include <mach/thread_policy.h></mach/thread_policy.h></div><div>#<span class="Apple-tab-span" style="white-space:pre"> </span>define cpu_set_t thread_affinity_policy_data_t</div><div>#<span class="Apple-tab-span" style="white-space:pre"> </span>define CPU_SET(cpu_id, new_mask) \</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>*new_mask.affinity_tag = (cpu_id + 1)</div><div>#<span class="Apple-tab-span" style="white-space:pre"> </span>define CPU_ZERO(new_mask) \</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>*new_mask.affinity_tag == THREAD_AFFINITY_TAG_NULL</div><div># define SET_AFFINITY(pid, size, mask)<span class="Apple-tab-span" style="white-space:pre"> </span>\</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>thread_policy_set(mach_thread_self(), THREAD_AFFINITY_POLICY, mask, THREAD_AFFINITY_POLICY_COUNT)</div><div># define GET_AFFINITY(pid, size, mask)<span class="Apple-tab-span" style="white-space:pre"> </span>\</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>thread_policy_get(mach_thread_self(), THREAD_AFFINITY_POLICY, mask, THREAD_AFFINITY_POLICY_COUNT)</div><div>#else</div><div>/* To enable CPU_ZERO and CPU_SET, etc. */</div><div># define __USE_GNU</div><div>/* For sched_getaffinity, sched_setaffinity */</div><div># include <sched.h></sched.h></div><div># define SET_AFFINITY(pid, size, mask)<span class="Apple-tab-span" style="white-space:pre"> </span>sched_setaffinity(0, size, mask)</div><div># define GET_AFFINITY(pid, size, mask)<span class="Apple-tab-span" style="white-space:pre"> </span>sched_getaffinity(0, size, mask)</div><div>#endif /* __FreeBSD__ */</div></div><div><br /></div><div><br /></div><div><div>and on line 375 to 378 replace with:</div><div>#ifndef __APPLE__</div><div> if (GET_AFFINITY(0, sizeof(cpu_set_t), &hp_globals.prev_mask) <></div><div> perror("getaffinity");</div><div> return FAILURE;</div><div> }</div><div>#endif</div><div><br /></div></div><div>You can <a href="http://www.svilen.com/xhprof-0.9.1_patch_macosx_leopard.tar.gz">download</a> whole the patched version of <a href="http://www.svilen.com/xhprof-0.9.1_patch_macosx_leopard.tar.gz">XHProf 0.9.1 from here</a>.</div><div>Or get only the <a href="http://www.svilen.com/xhprof_0.9.1_patch_build_macosx_leopard.diff">diff patch</a>.</div><div><br /></div><div>After successful compile and run I think it works - sharing the same L2 cache for a given thread when running on multiple cores, but NOT on different CPUs!</div><div>At least you can compile and see what's this module and implement it into your project. Then on the live server running Linux/FreeBSD you will definitely have correct data comming from XHProf.</div><div><br /></div><div>If you find some errors or mistakes please let me know.</div><div>I also submitted a bug on the topic on <a href="http://pecl.php.net/bugs/bug.php?id=16544">PECL.</a></div><div><br /></div><div>Thanks in advance for your oppinion and suggestions.</div></div></div><div class="blogger-post-footer">Atom Feeds <a href="http://blog.svilen.com/atom.xml">http://blog.svilen.com/atom.xml</a><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19720216-8755800461454052023?l=blog.svilen.com'/></div>Svilen Spasovhttp://www.blogger.com/profile/13024634252981285729noreply@blogger.com0tag:blogger.com,1999:blog-19720216.post-82327450602573334762009-05-13T15:44:00.004+03:002009-05-13T16:01:55.643+03:00Tupalka.com (aka databg.svilen.com)Few weeks ago we launched new design of Tupalka.com along with new features and the whole core rewritten and moved to <a href="http://sourceforge.net/projects/simplephpframew">SFrameWork</a>.<br /><br /><a href="http://sourceforge.net/projects/simplephpframew">SFrameWork</a> is my own PHP framework born in 2006 (some internal classes date from 2005). It is fully MVC and I am thinking of publishing a <a href="http://sourceforge.net/projects/simplephpframew">open source project at SorceFourge</a>. Some of you may find it useful.<br /><br />Some of the new key features of <a href="http://www.tupalka.com/">Tupalka.com</a><br /><br />- Implemented <a href="http://sphinxsearch.com/">Sphinx search engine</a> (it's very very fast and efficient compared to MySQL build-in fulltext index)<br />- New design<br />- New statistics: most popular searches, most recent searches, random seaches<br />- Added new data sources dir.bg, youtube.com along with the old rock solid one - data.bg<br />- Truly enabled cyrillic support for search queries<br />- Sort by list columns (just click on column name, e.g. filename, filesize, date)<br />- Categories trasferred to tabs<br /><br />I hope these will help you for better experience while using <a href="http://www.tupalka.com/">Tupalka.com</a><br /><br />And I would like to thank to all the people involved in some way in this new release of <a href="http://www.tupalka.com/">Tupalka.com</a> - Georgi, <a href="http://genchopencho.blogspot.com/">Evgeni</a>, Nikolay, Marian, Dimitar (Co-founder and owner of the domain name)<div class="blogger-post-footer">Atom Feeds <a href="http://blog.svilen.com/atom.xml">http://blog.svilen.com/atom.xml</a><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19720216-8232745060257333476?l=blog.svilen.com'/></div>Svilen Spasovhttp://www.blogger.com/profile/13024634252981285729noreply@blogger.com0tag:blogger.com,1999:blog-19720216.post-14396847045820060682009-05-06T20:19:00.007+03:002009-05-11T19:46:43.923+03:00Lighttpd the Book<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.packtpub.com/lighttpd#ebook/book/mid/110509snfihq"><img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 86px; height: 106px;" src="http://www.svilen.com/lighttpd.jpg" border="0" alt="" /></a><div>Following my post <a href="http://blog.svilen.com/2009/04/using-modnegotiation-with-lighttpd.html">"Using mod_negotiation with Lighttpd"</a> from April 23, 2009 </div><div>I received a nice email from Packt Publishing who has published a new book about Lighttpd (<a href="http://www.packtpub.com/lighttpd#ebook/book/mid/110509snfihq">"Lighttpd" written by Andre Bogus</a>) asking me to review it.</div><div><br /></div><div>I said - "ok, I will be glad to read your book."</div><div><br /></div><div>And the story goes on...</div><div><br /></div><div>Fortunately, I was nicely surprised that it deeply describes not only the Lighty 1.4.x, but the author has focused on 1.5.0, too. As some of you may know there are a lot of improvements in Lighttpd v.1.5.0, a lot of re-coded stuff, my beloved mod_uploadprogress was added again, etc., which is very essential in production servers.</div><div><br /></div><div>Good. Now let's read on.</div><div><br /></div><div>What's the first question come into your mind?</div><div>Maybe - Why Lighttpd? Huh?</div><div><br /></div><div>Simple - cause it's fast, light, flexible and FREE. :)</div><div>Just look at the <a href="http://www.packtpub.com/files/lighttpd-sample-chapter-chapter-10-migration-from-apache.pdf">sample chapter</a> of <a href="http://www.packtpub.com/lighttpd#ebook/book/mid/110509snfihq">the book</a> and you will see what I am talking about.</div><div><br /></div><div>First few chapters are standard:</div><div>Introduction, Configuring & Compiling (I must say that it's very very well explained even for a beginner in UNIX systems), Virtual Hosts, CGI ...</div><div>oh wait - CGI? Isn't it slow?</div><div>Heh, yup CGI is a bit slow, but FastCGI is really fast! That's the key thing here - a whole chapter about FastCGI & SCGI support and how you should use it and configure in production environment.</div><div><br /></div><div>Next is - "Optimizing Lighttpd".</div><div>Believe or not this is one of the most important things Andre (the author) has written about in <a href="http://www.packtpub.com/lighttpd#ebook/book/mid/110509snfihq">his book</a>. </div><div>How we can test our Lighttpd setup under stress with http_load (which I use, too) and how we can make some optimizations.</div><div>For example a simple <a href="http://redmine.lighttpd.net/wiki/lighttpd/Docs:ModMagnet">mod_magnet</a> caching script can deal easily with lots of load. And of course - mesuring system load is very handy here.</div><div><br /></div><div>Are you Migrating from Apache?</div><div>Ok, then look at chapter 10 when you have a chance or <a href="http://www.packtpub.com/files/lighttpd-sample-chapter-chapter-10-migration-from-apache.pdf">here</a>.</div><div><br /></div><div>And now my favourite - "Using Lua with Lighttpd" (of course it means "using mod_magnet in Lighttpd").</div><div>This is one of the powers of Lighty where it leaves in the dust the good old Apache.</div><div>Lua is lightweight, embeddable language nevertheless it is very powerful. Combined with a lightweight and poweful webserver makes the unstoppable "killing" machine for huge amounts of web traffic.</div><div>Learn how to manipulate URLs, requested file names, caches, how to simulate Apache'с modules, etc.<br /></div><div>This is a MUST READ topic!</div><div><br /></div><div>And finally "Writing custom modules/plugins for the Lighttpd API" is for you C lovers.</div><div>Yes, that's right. A simple explanation how you can write a strong, stable module for Lighty in C.</div><div>It's pretty simple, although keep in mind this quote taken from the book:</div><div><br /></div><div>"Do not write a module where a mod_magnetscript will do </div><div>A mod_magnetscript is usually smaller and much easier to write. The </div><div>higher level of abstraction leaves less chances of making mistakes. C, </div><div>unlike Lua, leaves the memory handling to the programmer. Also the </div><div>standard string-handling functions open security holes when used </div><div>improperly. Even if we are hell-bent on writing a module, it makes sense </div><div>to write a prototype mod_magnetscript first, presuming, of course, that </div><div>the function is possible to implement in Lua."</div><div><br /></div><div><br /></div><div>I cannot say anything else but Congratulations to Andre Bogus and Packt Publishing for this great <a href="http://www.packtpub.com/lighttpd#ebook/book/mid/110509snfihq">book</a>!</div><div><br /></div><div>I recommend you to read it if you're going to deal with heavy load and big websites with lots of users. Also newbies can learn how to test their websites/web application and configure/compile a webserver by themselves. </div><div><br /></div><div><a href="http://www.packtpub.com/lighttpd#ebook/book/mid/110509snfihq">Go get it!</a><span class="Apple-style-span" style="color: rgb(85, 26, 139); text-decoration: underline;"><br /></span></div><div class="blogger-post-footer">Atom Feeds <a href="http://blog.svilen.com/atom.xml">http://blog.svilen.com/atom.xml</a><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19720216-1439684704582006068?l=blog.svilen.com'/></div>Svilen Spasovhttp://www.blogger.com/profile/13024634252981285729noreply@blogger.com0tag:blogger.com,1999:blog-19720216.post-46491087977438477232009-04-23T12:20:00.002+03:002009-04-23T12:38:26.272+03:00Using mod_negotiation with LighttpdYesterday we finally decided to switch our web servers to <a href="http://opensu.se/~darix/lighttpd/">Lighttpd 1.5.0</a><div>Everything went fine on the test environments until I ran into a problem with Lighty and Apache's <a href="http://httpd.apache.org/docs/1.3/mod/mod_negotiation.html">mod_negotiation</a> that we are using on some websites.</div><div>It turned out that there is no easy solution for a technique like mod_negotiation in Lighttpd, but fortunately Lighty has one very powerful module called <a href="http://redmine.lighttpd.net/wiki/lighttpd/Docs:ModMagnet">Mod_Magnet</a>.</div><div><br /></div><div>With <a href="http://redmine.lighttpd.net/wiki/lighttpd/Docs:ModMagnet">Mod_Magnet</a> you actually can write your our <a href="http://www.lua.org/">LUA</a> scripts for use with Lighttpd.</div><div>I was eager to try it. And <a href="http://www.svilen.com/lighttpd-multiviews-to-php+rewrite.lua">here</a> it comes my first LUA script emulating <a href="http://httpd.apache.org/docs/1.3/mod/mod_negotiation.html">mod_negotiation</a> and rewriting to a predefined file if nothing was found while "negotiating".</div><div><br /></div><div>Use it like this:</div><div><br /></div><div><div># set document root for domains</div><div>$HTTP["host"] =~ "^(.*)(domain\.com)$" {</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>magnet.attract-physical-path-to = ( "/usr/local/lighttpd/etc/lighttpd-multiviews-to-php+rewrite.lua" ) # multiviews module</div><div>}</div><div><br /></div><div>To compile Lighty with <a href="http://www.lua.org/">LUA</a> support use:</div><div>./configure --prefix=/usr/local/lighttpd --with-lua<br /></div><div><br /></div><div>but before that you should install LUA 5.1</div><div><br /></div></div><div class="blogger-post-footer">Atom Feeds <a href="http://blog.svilen.com/atom.xml">http://blog.svilen.com/atom.xml</a><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19720216-4649108797743847723?l=blog.svilen.com'/></div>Svilen Spasovhttp://www.blogger.com/profile/13024634252981285729noreply@blogger.com0tag:blogger.com,1999:blog-19720216.post-63229989957517336542009-04-18T10:38:00.008+03:002009-04-18T11:32:19.186+03:00Bulding Lighttpd 1.5.0 r2914 on MAC OS X Leopard<div>I haven't blogger for almost a year and it's time to start sharing my experience from the past months again.</div><div><br /></div><div>Last week I went into trouble trying to build/compile <a href="http://opensu.se/~darix/lighttpd/">Lighttpd 1.5.0</a> (latest prerelease r2914) on Mac OS X for test purposes.</div><div>One of the major features of Lighty 1.5.0 is the <a href="http://redmine.lighttpd.net/wiki/lighttpd/Docs:ModUploadProgress">mod_uploadprogress</a>, but unfortunately it is avaialable only in 1.5.0 version for now. So I was desparate to build it. :) (see mod_uploadprogress in action <a href="http://upload.lighttpd.net/index.html">here</a>)</div><div><br /></div><div>What happened. After downloading the r2914 I ran the configure script with:</div><div>./configure --with-zlib --with-bzip2 --prefix=/usr/local/lighttpd --with-lua --sysconfdir=/usr/local/lighttpd/etc<br /></div><div><br /></div><div>(oh, yeah I wanted mod_magnet, too, to emulate Apache's mod_negotiation, so I added --with-lua)</div><div><br /></div><div>All went ok with the configure, but then the make exits with:</div><div><br /></div><div>Undefined symbols:</div><div> "_network_get_backends", referenced from:</div><div> _mod_status_handle_server_config in mod_status.o</div><div> "_network_get_backend_info_by_type", referenced from:</div><div> _mod_status_handle_server_config in mod_status.o</div><div>ld: symbol(s) not found</div><div>collect2: ld returned 1 exit status</div><div>make[4]: *** [mod_status.la] Error 1</div><div>make[3]: *** [all-recursive] Error 1</div><div>make[2]: *** [all] Error 2</div><div>make[1]: *** [all-recursive] Error 1</div><div>make: *** [all] Error 2</div><div><br /></div><div><br /></div><div>Ok, so now what? :) Of course, googling, googling and finally I got it! Hurray! :)</div><div>A <a href="http://redmine.lighttpd.net/attachments/427/0001-fix-build-on-mac-os-x.patch">patch</a> was released on 07/08/2008 (download it directly from <a href="http://redmine.lighttpd.net/attachments/download/427/0001-fix-build-on-mac-os-x.patch">here</a>), but why it is not applied in the official prerelease? Hm.. I hope the guys from Lighttpd's team will fix this in future.</div><div><br /></div><div>Building Lighttpd 1.5.0 r2419 and later with applied patch for Mac OS X platform:</div><div>(directions for users that are not so much into command line tools)</div><div><br /></div><div>1) <a href="http://developer.apple.com/technology/xcode.html">Download</a> and install XCode (if you already have it skip this step)</div><div>2) <a href="http://opensu.se/~darix/lighttpd/">Download Lighttpd 1.5.0 latest prerelease</a></div><div>3) Extract Lighty</div><div>4) <a href="http://redmine.lighttpd.net/attachments/download/427/0001-fix-build-on-mac-os-x.patch">Download patch</a> and copy it to Lighty's folder</div><div>5) Run following commands inside Lighty's folder to apply the patch:</div><div><div><br /></div><div>patch -p1 < 0001-fix-build-on-mac-os-x.patch<div>aclocal</div><div>autoheader</div><div>glibtoolize --automake --force</div><div>automake --add-missing --force</div><div>autoconf</div><div><br /></div><div>6) Configure Lighty with:</div><div>./configure --with-zlib --with-bzip2 --prefix=/usr/local/lighttpd<br /></div><div><br /></div><div>if you need mod_magnet install LUA 5.1 with fink (command: sudo fink install lua51) and configure with:</div><div>./configure --with-zlib --with-bzip2 --prefix=/usr/local/lighttpd --with-lua --sysconfdir=/usr/local/lighttpd/etc<br /></div></div></div><div><br /></div><div>7) Build Lighty:</div><div>make</div><div><br /></div><div>8) Install Lighty:</div><div>sudo make install</div><div><br /></div><div>9) Now you have Lighttpd 1.5.0 installed into /usr/local/lighttpd</div><div>10) Enjoy!</div><div class="blogger-post-footer">Atom Feeds <a href="http://blog.svilen.com/atom.xml">http://blog.svilen.com/atom.xml</a><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19720216-6322998995751733654?l=blog.svilen.com'/></div>Svilen Spasovhttp://www.blogger.com/profile/13024634252981285729noreply@blogger.com0tag:blogger.com,1999:blog-19720216.post-61599648288580169322008-06-13T14:45:00.002+03:002008-06-13T15:01:48.754+03:00In an absolute worldIt's the first and last time I am playing blogger games ever and it's because <a href="http://vsepomniche.blogspot.com/2008/06/in-absolute-world.html">Petya</a> challenged me.<div><br /></div><div>Hmm... let me see what should an absolute world be.</div><div><br /></div><div>- only MAC computers available</div><div>- no managers/team leaders with unworkable requests all the time</div><div>- women with no timeframe restrictions for having sex</div><div>- free Mazda RX-8 with a full tank on every corder</div><div>- unrestricted joint and coffee shops (Deen Haag's affect ... )</div><div><br /></div><div>And now it's my turn - <a href="http://genchopencho.blogspot.com/">Evgeni</a>,<a href="http://suncreation.org/gamar/"> Genadi</a> show me your worlds. :)</div><div class="blogger-post-footer">Atom Feeds <a href="http://blog.svilen.com/atom.xml">http://blog.svilen.com/atom.xml</a><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19720216-6159964828858016932?l=blog.svilen.com'/></div>Svilen Spasovhttp://www.blogger.com/profile/13024634252981285729noreply@blogger.com0tag:blogger.com,1999:blog-19720216.post-71009771688571204232008-05-15T11:40:00.004+03:002008-05-15T12:18:12.771+03:00SWFUpload & SessionsHave you tried <a href="http://www.swfupload.org/">SWFUpload</a>?<div>It's cool flash uploader which is ideal for uploading big files (over 5-10MB) and having visual status about how much it's left.</div><div><br /></div><div>Everything seems fine from the demos, etc. but! Yeah there is one clause that I figured out by myself while trying to use the tool in Drupal.</div><div>If you want to use the <a href="http://www.swfupload.org/">SWFUpload</a> in restricted areas with scripts that require sessions (e.g. cookie sessions) you will fall into the hole.</div><div>For solving the issue add session read from $_GET also cause under Safari/Firefox/MAC OS X; Firefox/Linux the <a href="http://www.swfupload.org/">SWFUploader</a> won't pass any cookies the the "upload.php" script.</div><div><br /></div><div>Example solution for drupal:</div><div><br /></div><div><div>if (isset($_GET['fmauthsessid']) {</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>if ($_GET['fmauthsessid']) {</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>$_COOKIE[session_name()] = $_GET['fmauthsessid'];</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>$key = $_GET['fmauthsessid'];</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>}</div><div>}</div><div>else {</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>if (!isset($_COOKIE[session_name()])) {</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>$user = drupal_anonymous_user();</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>return '';</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>}</div><div>}</div><div><br /></div></div><div><div>Put this in the beginning of sess_read() in includes/session.inc</div><div><br /></div><div>More experience lessons will be comming these days.</div></div><div><br /></div><div class="blogger-post-footer">Atom Feeds <a href="http://blog.svilen.com/atom.xml">http://blog.svilen.com/atom.xml</a><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19720216-7100977168857120423?l=blog.svilen.com'/></div>Svilen Spasovhttp://www.blogger.com/profile/13024634252981285729noreply@blogger.com0tag:blogger.com,1999:blog-19720216.post-30254907985730221032008-03-12T13:42:00.004+02:002008-03-14T16:44:48.425+02:00Wanna send email to Hotmail.com from PHP mail()? SUX...Hello everyone,<div><br /></div><div>I know you've noticed that I am not quite often blogging, but I am and will try to post interesting tech stuff here.</div><div><br /></div><div>Today's topic: Sending email to Hotmail account from PHP.</div><div><br /></div><div>Sounds easy. Some of will say "just use PHP's mail() function with correct headers". Yeah, but not. :)</div><div>I read almost all posts on this topic around the net with no success. So finally I started trying and trying ... after the 5th or 6th hour (God bless I started in the morning of the day else I would probably throw my MacBook out of the window) I managed to send emails to Hotmail successfully!</div><div><br /></div><div>Hints:</div><div>1) Do NOT put any "a href" tags in the email</div><div>2) Put ONLY email address in the TO: and FROM: headers of the email</div><div>If you do one of the above your email won't even be in the Junk!</div><div>3) Do NOT send email from address like: no_reply@domain.com or noreply@domain.com</div><div>or it will go to Junk! folders in Hotmail accounts</div><div><br /></div><div>That's it! Enjoy! :)</div><div><br /></div><div>Ouh, I forgot to mention that I wanted to send HTML emails. ;-)</div><div class="blogger-post-footer">Atom Feeds <a href="http://blog.svilen.com/atom.xml">http://blog.svilen.com/atom.xml</a><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19720216-3025490798573022103?l=blog.svilen.com'/></div>Svilen Spasovhttp://www.blogger.com/profile/13024634252981285729noreply@blogger.com2tag:blogger.com,1999:blog-19720216.post-57472809947046807162008-01-11T12:44:00.000+02:002008-01-11T13:04:45.246+02:00Looking for Dedicated Hosting Provider?As many of you may know I do use dedicated server for 3 years by now. I started with <a href="http://www.meganetserve.com/">MegaNetServe</a> and I was satisfied till the previous year (2007) when they started to have frequently network downtimes with no reason or at least they didn't gave one.<div><br /></div><div>Now I moved to <a href="http://www.aplus.net/">Aplus</a> and I can strongly recommend you them. Becides a value dedicated server you can get Plesk Control Panel with licence for 30 domains for no additional costs, which is great!</div><div>Plesk can save you a lot of time configuring the whole machine's services.</div><div><br /></div><div>No, I haven't experienced a long term partnership with them by guys from <a href="http://www.mysqlperformanceblog.com/">MySQL Performance Blog</a> are very pleased with Aplus for years.</div><div><br /></div><div>Try them - <a href="http://www.aplus.net/">www.aplus.net</a>! ;-)</div><div><br /></div><div>You will thank me later. :)</div><div class="blogger-post-footer">Atom Feeds <a href="http://blog.svilen.com/atom.xml">http://blog.svilen.com/atom.xml</a><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19720216-5747280994704680716?l=blog.svilen.com'/></div>Svilen Spasovhttp://www.blogger.com/profile/13024634252981285729noreply@blogger.com0tag:blogger.com,1999:blog-19720216.post-11197073842772501742007-12-20T10:28:00.000+02:002007-12-20T10:30:06.526+02:00Why not Microsoft?It's simple. Because of <a href="http://www.techcrunch.com/2007/12/19/microsofts-car-product-in-the-wild/">this</a>. :))<div><br /></div><div>Very nice M$ car indeed.</div><div class="blogger-post-footer">Atom Feeds <a href="http://blog.svilen.com/atom.xml">http://blog.svilen.com/atom.xml</a><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19720216-1119707384277250174?l=blog.svilen.com'/></div>Svilen Spasovhttp://www.blogger.com/profile/13024634252981285729noreply@blogger.com0tag:blogger.com,1999:blog-19720216.post-75918513677276622502007-11-20T20:02:00.000+02:002007-11-20T20:18:32.155+02:00PHP adviceAs a PHP developer some of the important things in my work are tools. Yeah, tools read more about them <a href="http://onemonthapp.com/archives/2007/10/21/20-tools-for-web-application-development">here</a>.<div><br /></div><div>Then you might want to take a look at these <a href="http://reinholdweber.com/?p=3">PHP optimization tips</a>. Believe me you won't regret. :)</div><div class="blogger-post-footer">Atom Feeds <a href="http://blog.svilen.com/atom.xml">http://blog.svilen.com/atom.xml</a><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19720216-7591851367727662250?l=blog.svilen.com'/></div>Svilen Spasovhttp://www.blogger.com/profile/13024634252981285729noreply@blogger.com0tag:blogger.com,1999:blog-19720216.post-1862106007984476512007-11-14T02:47:00.000+02:002007-11-14T03:10:32.494+02:00How to play .flac files in iTunesEverybody that knows me personally is aware that I am an Apple fan, expecially <a href="http://www.apple.com/macosx/">Mac OS X</a> one.<div>I bought my first Mac laptop 2 years ago and an year ago I had a need to play <a href="http://flac.sourceforge.net/">FLAC</a> music files on my laptop.</div><div>Yes it was possible, but as much as I searched for a good <a href="http://www.apple.com/macosx/">OS X</a> music player I couldn't find one better than <a href="http://www.apple.com/itunes/download/">iTunes</a>. That's why I needed <a href="http://www.apple.com/itunes/download/">iTunes</a> to play <a href="http://flac.sourceforge.net/">FLAC</a> files.</div><div><br /></div><div>Finally I found it! :) Although Apple are not going to make it cause they want us to use their <a href="http://en.wikipedia.org/wiki/Apple_Lossless">ALAC</a> format.</div><div><br /></div><div>So here's how you can make it work for you:</div><div><br /></div><div>1. Exit all iTunes and Quicktime applications</div><div>2. Download <a href="http://downloads.xiph.org/releases/xiph-qt/">xiph-qt-0.1.8.dmg</a>, <a href="http://people.xiph.org/~arek/flac_import/">flac_import_0.5b1_p0.1.dmg</a>, <a href="http://people.xiph.org/~arek/flac_import/">set-OggS-0.1.dmg</a></div><div>3. Drag <span class="Apple-style-span" style="font-style: italic;">XiphQT.component</span> (xiph-qt-0.1.8.dmg) to <span class="Apple-style-span" style="font-style: italic;">/Library/Components/</span></div><div>4. Drag <span class="Apple-style-span" style="font-style: italic;">FLACImport.component</span> (flac_import_0.5b1_p0.1.dmg) to <span class="Apple-style-span" style="font-style: italic;">/Library/QuickTime/</span></div><div>5. Drag <span class="Apple-style-span" style="font-style: italic;">Clear OggS.app</span> and <span class="Apple-style-span" style="font-style: italic;">Set OggS.app</span> (set-OggS-0.1.dmg) to your <span class="Apple-style-span" style="font-style: italic;">Applications</span> folder</div><div>6. Drag you FLAC files and drop them on <span class="Apple-style-span" style="font-style: italic;">Set OggS.app. </span>A window will popup to show that all FLAC files have been "converted".</div><div>7. Add your "converted" FLAC files to you iTunes</div><div>8. Enjoy! :)</div><div><br /></div><div>Hope it will work for you, too. :)</div><div class="blogger-post-footer">Atom Feeds <a href="http://blog.svilen.com/atom.xml">http://blog.svilen.com/atom.xml</a><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19720216-186210600798447651?l=blog.svilen.com'/></div>Svilen Spasovhttp://www.blogger.com/profile/13024634252981285729noreply@blogger.com3tag:blogger.com,1999:blog-19720216.post-70528904453553082342007-10-29T17:27:00.000+02:002007-11-13T03:31:56.669+02:00The End of PHP4While thinking of installing a new PHP5 on a one of my new Windows servers (don't ask why Windows :) I went through the <a href="http://www.php.net/">php.net</a>'s announcements "PHP 4 end of life announcement".<div>Zend Team will shut down PHP4's development - Finally! :)</div><div><br /></div><div>Now I hope all hosting provider out there will switch their f*****g server to PHP5 and we all will bless them for this. :)</div><div><br /></div><div>Go ahead!</div><div class="blogger-post-footer">Atom Feeds <a href="http://blog.svilen.com/atom.xml">http://blog.svilen.com/atom.xml</a><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19720216-7052890445355308234?l=blog.svilen.com'/></div>Svilen Spasovhttp://www.blogger.com/profile/13024634252981285729noreply@blogger.com2tag:blogger.com,1999:blog-19720216.post-84734175536180102362007-10-05T22:04:00.000+03:002007-10-05T22:06:21.788+03:00За Б. Шопов :)<u>Да започваме да</u>, <a href="http://spisanie.cc/nb/?cat=27" title="яицазимитпо лъгуг">яицазимитпо лъгуг</a>, <u>говорим на</u>,<a href="http://spisanie.cc/nb/?cat=27" title="яицазимитпо лъгуг">яицазимитпо лъгуг</a>, <u>марсиански</u>. <a href="http://spisanie.cc/nb/?cat=27" title="яицазимитпо лъгуг">яицазимитпо лъгуг</a>, <u>край.</u><div class="blogger-post-footer">Atom Feeds <a href="http://blog.svilen.com/atom.xml">http://blog.svilen.com/atom.xml</a><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19720216-8473417553618010236?l=blog.svilen.com'/></div>Svilen Spasovhttp://www.blogger.com/profile/13024634252981285729noreply@blogger.com0tag:blogger.com,1999:blog-19720216.post-47254627219412870692007-08-03T15:30:00.000+03:002007-08-03T15:42:33.982+03:00MySQL on roadAs I am on the MySQL topic these days I found (why I wasn't already...?!?) this <a href="http://www.mysqlperformanceblog.com">mysql performance blog</a>.<div><br /></div><div>Once again I convinced myself that using MySQL in all kind of projects is good choice ... and read this <a href="http://www.mysqlperformanceblog.com/2006/10/16/should-mysql-and-web-server-share-the-same-box/">post</a>. It is clear that using different servers for different services, e.g. separate Web server from MySQL server, is a very very good decision and we will work on this for <a href="http://databg.svilen.com">databg.svilen.com</a>. Plus installing and using <a href="http://www.sphinxsearch.com/">Sphinx</a> full-text search engine.</div><div><br /></div><div>Wish me luck. :)</div><div class="blogger-post-footer">Atom Feeds <a href="http://blog.svilen.com/atom.xml">http://blog.svilen.com/atom.xml</a><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19720216-4725462721941287069?l=blog.svilen.com'/></div>Svilen Spasovhttp://www.blogger.com/profile/13024634252981285729noreply@blogger.com0tag:blogger.com,1999:blog-19720216.post-20307918258292542252007-07-26T00:52:00.001+03:002007-07-26T00:52:41.100+03:00Back To MySQLAs I am working very hard this summer I decided to blog more from now on...<br /><br />So while moving to the latest project I have in my task list I decided to code it back with MySQL as backend DB. I started converting all PostgreSQL tables/data and it turned out that it was a simple task. Time consuming but simple and I convinced myself one more time that simple is better e.g. MySQL is better. :)<br /><br />What do you think?<div class="blogger-post-footer">Atom Feeds <a href="http://blog.svilen.com/atom.xml">http://blog.svilen.com/atom.xml</a><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19720216-2030791825829254225?l=blog.svilen.com'/></div>Svilen Spasovhttp://www.blogger.com/profile/13024634252981285729noreply@blogger.com2tag:blogger.com,1999:blog-19720216.post-1172055632856837642007-02-21T12:58:00.000+02:002007-02-21T13:00:32.920+02:00Jobs vs. GatesRecently I bought a new MacBook. It's incredible. I admire Apple how they make their products. Those guys have thought almost of everything that man can want from their new notebook. :)<br /><br />It has a remote control, too. So very much cool. :) I will post some photos tomorrow or so, but before that look at this funny video about Bill Gates & Steve Jobs :).<br /><br />http://www.youtube.com/watch?v=qHO8l-Bd1O4<div class="blogger-post-footer">Atom Feeds <a href="http://blog.svilen.com/atom.xml">http://blog.svilen.com/atom.xml</a><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19720216-117205563285683764?l=blog.svilen.com'/></div>Svilen Spasovhttp://www.blogger.com/profile/13024634252981285729noreply@blogger.com2tag:blogger.com,1999:blog-19720216.post-1168533849239615542007-01-11T18:39:00.000+02:002007-01-11T18:44:09.296+02:00PHP & XMLHave you ever tried using XML in your PHP applications?<br /><br />It's not so easy task using PHP4. I definitely understood that yesterday when I tried to use the PHP's internal XML parser.<br />Why TF (The Fuck) it doesn't returns a multi-dimentional array build on the XML's data?<br />Insted of this PHP's XML parser returns an one-level array with all the tags. Gosh that's awful. :)<br /><br />Finally I have to made my own class to handle XML files. I'm sick of sucking PHP software. :)<div class="blogger-post-footer">Atom Feeds <a href="http://blog.svilen.com/atom.xml">http://blog.svilen.com/atom.xml</a><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19720216-116853384923961554?l=blog.svilen.com'/></div>Svilen Spasovhttp://www.blogger.com/profile/13024634252981285729noreply@blogger.com2tag:blogger.com,1999:blog-19720216.post-1168020795152520692007-01-05T20:06:00.000+02:002007-01-05T20:15:52.076+02:00CC FraudFinally, it catched me, too. :)<br /><br />Yesterday while I was checking my online bank account I found out that there were some transactions from Microsoft Adcenter, which weren't mine!<br /><br />Oh, god! Microsoft?<br /><br />I've immediately called Microsoft Adcenter's Support and they admitted they fault.<br />"What the fuck?" will say one of my colleague. Is Microsoft credit card verification system so bad?<br />Or they don't have such at all. :) I guess it's the second reason.<br /><br />At least how can someone use my credit card and they hadn't check him by phone before making a charge to the credit card.<br />Bad, bad for them.<br /><br />Hope Google's Anti-Fraud System is better. I'm using Adwords. :)<div class="blogger-post-footer">Atom Feeds <a href="http://blog.svilen.com/atom.xml">http://blog.svilen.com/atom.xml</a><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19720216-116802079515252069?l=blog.svilen.com'/></div>Svilen Spasovhttp://www.blogger.com/profile/13024634252981285729noreply@blogger.com0tag:blogger.com,1999:blog-19720216.post-1163469517078540882006-11-14T03:52:00.000+02:002006-11-14T03:58:37.096+02:00Freelance ProjectsSo working as a freelancer is not so ugly. :)<br />Finally I have enough free time for my friends and family.<br /><br />These days I had to add new MSSQL db layer to my framework. All went fine and I did it in no time.<br />hm... wasn't thinking that using my frame will save me so much time.<br /><br />Tomorrow I am going to code some project for google adwords api. Should be interesting. ;-)<div class="blogger-post-footer">Atom Feeds <a href="http://blog.svilen.com/atom.xml">http://blog.svilen.com/atom.xml</a><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19720216-116346951707854088?l=blog.svilen.com'/></div>Svilen Spasovhttp://www.blogger.com/profile/13024634252981285729noreply@blogger.com1tag:blogger.com,1999:blog-19720216.post-1161767358144626382006-10-25T12:02:00.000+03:002006-10-25T12:09:18.156+03:00My FrameworkAs I decided to leave my ex-company I started to freelance.<br />Now I'm working on my own framework. I tried Zend's framework, but unfortunately it work only on PHP5 platforms and PDO enabled modules for DB access.<br /><br />I need something universal. Some of the projects are hosted on PHP4 platforms that's why I can't use those different PHP5 frameworks that have come up these months.<br /><br />Anyway, I always prefer to use my own code. :)<div class="blogger-post-footer">Atom Feeds <a href="http://blog.svilen.com/atom.xml">http://blog.svilen.com/atom.xml</a><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19720216-116176735814462638?l=blog.svilen.com'/></div>Svilen Spasovhttp://www.blogger.com/profile/13024634252981285729noreply@blogger.com0tag:blogger.com,1999:blog-19720216.post-1156263790155595772006-08-22T18:09:00.000+03:002006-08-22T19:23:10.230+03:00work on new payment systemI am working on a new payment system for my current company.<br />It should work with multiple payment gateways (e.g. Worldpay, Paypal) and be easily extensible.<br /><br />Till now I've coded a couple of PHP classes and all seems fine, although there are some hindrances.<br /><br />Hope I will release it soon :)<div class="blogger-post-footer">Atom Feeds <a href="http://blog.svilen.com/atom.xml">http://blog.svilen.com/atom.xml</a><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19720216-115626379015559577?l=blog.svilen.com'/></div>Svilen Spasovhttp://www.blogger.com/profile/13024634252981285729noreply@blogger.com0tag:blogger.com,1999:blog-19720216.post-1156259042881464012006-08-22T17:59:00.000+03:002006-08-22T18:04:02.916+03:00http://databg.svilen.com fully automatedAfter moving http://databg.svilen.com to a new server, collocated in Bulgaria, I started coding the automated crawl and update scripts.<br /><br />Finally all is done and set. Now this search engine is working all alone, without any support from me. :)<br /><br />Hope users will like it more and more since the database will be fully updated once a week.<div class="blogger-post-footer">Atom Feeds <a href="http://blog.svilen.com/atom.xml">http://blog.svilen.com/atom.xml</a><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19720216-115625904288146401?l=blog.svilen.com'/></div>Svilen Spasovhttp://www.blogger.com/profile/13024634252981285729noreply@blogger.com0tag:blogger.com,1999:blog-19720216.post-1155553331187904552006-08-14T13:33:00.000+03:002006-08-14T14:02:11.210+03:00Lucene SearchZend Framework has one great module called Zend Search Lucene, which I'm going to try for a new project :) :<br /><br />"Zend_Search_Lucene is a general purpose text search engine written entirely in PHP 5. Since it stores its index on the filesystem and does not require a database server, it can add search capabilities to almost any PHP-driven website. Zend_Search_Lucene supports the following features:<br /><br />Ranked searching - best results returned first<br /><br />Many powerful query types: phrase queries, wildcard queries, proximity queries, range queries and more [5]<br /><br />Search by specific field (e.g., title, author, contents)"<div class="blogger-post-footer">Atom Feeds <a href="http://blog.svilen.com/atom.xml">http://blog.svilen.com/atom.xml</a><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19720216-115555333118790455?l=blog.svilen.com'/></div>Svilen Spasovhttp://www.blogger.com/profile/13024634252981285729noreply@blogger.com0