<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;D04ERH44eSp7ImA9WxBUEEQ.&quot;"><id>tag:blogger.com,1999:blog-8250692328889064135</id><updated>2010-02-25T03:05:05.031-08:00</updated><title>Whirix Technical Blog</title><subtitle type="html">Technology and process fine points, notes and thoughts. Public blog of Whirix web development company from Barnaul, Russia.</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://blog.whirix.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://blog.whirix.com/" /><author><name>Yuri Subach</name><uri>http://www.blogger.com/profile/13921139305938491792</uri><email>noreply@blogger.com</email></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>21</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/WhirixTechnicalBlog" /><feedburner:info uri="whirixtechnicalblog" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry gd:etag="W/&quot;A0MNQHY7fSp7ImA9WxJVEkk.&quot;"><id>tag:blogger.com,1999:blog-8250692328889064135.post-1460119901679164313</id><published>2009-06-28T21:14:00.000-07:00</published><updated>2009-06-28T21:24:51.805-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-06-28T21:24:51.805-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="ie" /><category scheme="http://www.blogger.com/atom/ns#" term="css" /><title>Cross browser Horizontal Rule (hr-tag)</title><content type="html">What:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;hr {&lt;br /&gt;  background:#d0d0d0;&lt;br /&gt;  color:#d0d0d0;&lt;br /&gt;  margin:15px 0;&lt;br /&gt;  height:1px;&lt;br /&gt;  border:none;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Why:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;because Chrome creates some borders&lt;/li&gt;&lt;li&gt;because FireFox set color from css &lt;span style="font-style: italic;"&gt;background&lt;/span&gt; value&lt;/li&gt;&lt;li&gt;but IE set color from css &lt;span style="font-style: italic;"&gt;color&lt;/span&gt; value&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8250692328889064135-1460119901679164313?l=blog.whirix.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.whirix.com/feeds/1460119901679164313/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=8250692328889064135&amp;postID=1460119901679164313" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8250692328889064135/posts/default/1460119901679164313?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8250692328889064135/posts/default/1460119901679164313?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/WhirixTechnicalBlog/~3/yI1jhqRdazY/cross-browser-horizontal-rule-hr-tag.html" title="Cross browser Horizontal Rule (hr-tag)" /><author><name>Vyacheslav Iutin</name><uri>http://www.blogger.com/profile/15111946323963571963</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="02625353426409893630" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.whirix.com/2009/06/cross-browser-horizontal-rule-hr-tag.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkUGRn4zcCp7ImA9WxJWE0w.&quot;"><id>tag:blogger.com,1999:blog-8250692328889064135.post-8255493661569287290</id><published>2009-06-18T01:57:00.000-07:00</published><updated>2009-06-18T02:43:47.088-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-06-18T02:43:47.088-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="kb" /><category scheme="http://www.blogger.com/atom/ns#" term="iphone" /><category scheme="http://www.blogger.com/atom/ns#" term="macosx" /><title>Installation of Mac OS X and iPhone SDK to Intel PC</title><content type="html">This is a very quick note about installing of Mac OS X and iPhone SDK to my Intel PC.&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Install Kalyway 10.5.2, follow &lt;a href="http://wiki.osx86project.org/wiki/index.php/Installation_Guides/Kalyway_DualBoot_10.5.2"&gt;this detailed guide&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Upgrade to version 10.5.3 required by iPhone SDK 2.2, for details see &lt;a href="http://www.insanelymac.com/forum/lofiversion/index.php/t152801.html"&gt;forum topic on insanelymac.com&lt;/a&gt; (Upgrading to 10.5.3 part)&lt;/li&gt;&lt;li&gt;Install &lt;a href="http://nvinject.free.fr/"&gt;NVinject extensions&lt;/a&gt; if you have NVidia card (like me) to enable high screen resolutions&lt;/li&gt;&lt;li&gt;Install iPhone SDK (can be taken from Apple's web site)&lt;/li&gt;&lt;/ol&gt;Have fun!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8250692328889064135-8255493661569287290?l=blog.whirix.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.whirix.com/feeds/8255493661569287290/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=8250692328889064135&amp;postID=8255493661569287290" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8250692328889064135/posts/default/8255493661569287290?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8250692328889064135/posts/default/8255493661569287290?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/WhirixTechnicalBlog/~3/kJjTfhaAjA8/installation-of-mac-os-x-and-iphone-sdk.html" title="Installation of Mac OS X and iPhone SDK to Intel PC" /><author><name>Yuri Subach</name><uri>http://www.blogger.com/profile/13921139305938491792</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="07862698757592030816" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.whirix.com/2009/06/installation-of-mac-os-x-and-iphone-sdk.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkYFQXszfCp7ImA9WxVRFU4.&quot;"><id>tag:blogger.com,1999:blog-8250692328889064135.post-4601152595751855612</id><published>2009-01-21T01:09:00.000-08:00</published><updated>2009-01-21T01:28:30.584-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-01-21T01:28:30.584-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="linux" /><category scheme="http://www.blogger.com/atom/ns#" term="flash" /><title>swfmill compilation problem</title><content type="html">You can get compilation error when compile swfmill (&lt;a href="http://www.swfmill.org/"&gt;http://www.swfmill.org&lt;/a&gt;) with GCC-4.3.x or higher. Mostly it will look like:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;swft_css.cpp:197: error: 'strcmp' was not declared in this scope&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The reason is GCC-developers have split some header files. So some functions &lt;span style="font-family:courier new;"&gt;&lt;/span&gt;are in other header files now. More about it is here: &lt;a href="http://gcc.gnu.org/gcc-4.3/porting_to.html"&gt;http://gcc.gnu.org/gcc-4.3/porting_to.html&lt;/a&gt; (see section header &lt;span style="font-style: italic;"&gt;Header dependency cleanup&lt;/span&gt;).&lt;br /&gt;&lt;br /&gt;To resolve the problem open file src/swft/swft_css.cpp in an editor and add the line in the top of the file:&lt;br /&gt;&lt;br /&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;#include &amp;lt;cstring&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The same problem also exists for file src/swft/swft_import_mp3.cpp and the solution is the same.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8250692328889064135-4601152595751855612?l=blog.whirix.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.whirix.com/feeds/4601152595751855612/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=8250692328889064135&amp;postID=4601152595751855612" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8250692328889064135/posts/default/4601152595751855612?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8250692328889064135/posts/default/4601152595751855612?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/WhirixTechnicalBlog/~3/jySLXHAalgk/swfmill-compilation-problem.html" title="swfmill compilation problem" /><author><name>Vyacheslav Iutin</name><uri>http://www.blogger.com/profile/15111946323963571963</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="02625353426409893630" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.whirix.com/2009/01/swfmill-compilation-problem.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUcGRX84eSp7ImA9WxVSFUU.&quot;"><id>tag:blogger.com,1999:blog-8250692328889064135.post-1370578912720792619</id><published>2008-12-05T04:15:00.000-08:00</published><updated>2009-01-10T02:23:44.131-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-01-10T02:23:44.131-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="kb" /><category scheme="http://www.blogger.com/atom/ns#" term="php" /><title>How to make native SQL queries in Doctrine ORM</title><content type="html">&lt;p&gt;Sometimes you have situation which require writing of native SQL query in project fully based on Doctrine ORM. Doing DQL queries is very easy, but simple SQL queries maybe difficult to execute because you have to reuse database connection opened inside Doctrine.&lt;/p&gt;Example given below is easy to understand and use in your project(s). Enjoy!&lt;br /&gt;&lt;pre&gt;// get Doctrine_Connection object&lt;br /&gt;$con = Doctrine_Manager::getInstance()-&gt;connection();&lt;br /&gt;// execute SQL query, receive Doctrine_Connection_Statement&lt;br /&gt;$st = $con-&gt;execute("...............");&lt;br /&gt;// fetch query result&lt;br /&gt;$result = $st-&gt;fetchAll();&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8250692328889064135-1370578912720792619?l=blog.whirix.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.whirix.com/feeds/1370578912720792619/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=8250692328889064135&amp;postID=1370578912720792619" title="4 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8250692328889064135/posts/default/1370578912720792619?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8250692328889064135/posts/default/1370578912720792619?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/WhirixTechnicalBlog/~3/xgc-prKiJNk/how-to-make-native-sql-queries-in.html" title="How to make native SQL queries in Doctrine ORM" /><author><name>Yuri Subach</name><uri>http://www.blogger.com/profile/13921139305938491792</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="07862698757592030816" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">4</thr:total><feedburner:origLink>http://blog.whirix.com/2008/12/how-to-make-native-sql-queries-in.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUYASHs7cSp7ImA9WxRVFko.&quot;"><id>tag:blogger.com,1999:blog-8250692328889064135.post-8157055065954392394</id><published>2008-11-14T06:15:00.000-08:00</published><updated>2008-11-14T06:32:29.509-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-11-14T06:32:29.509-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="kb" /><category scheme="http://www.blogger.com/atom/ns#" term="ie" /><category scheme="http://www.blogger.com/atom/ns#" term="ie6" /><category scheme="http://www.blogger.com/atom/ns#" term="ie7" /><category scheme="http://www.blogger.com/atom/ns#" term="css" /><title>Cross browser min-height (IE6 and others)</title><content type="html">&lt;p&gt;IE6 ignores CSS 'min-height' property. Fortunately it works with 'height' property exactly like other modern browsers with 'min-height'. That's why there is a possibility to write cross browser CSS, here it is:&lt;br /&gt;&lt;/p&gt;&lt;pre&gt;min-height: 100px;&lt;br /&gt;height: auto !important;&lt;br /&gt;height: 100px;&lt;br /&gt;&lt;/pre&gt;Three lines instead of one, but it works excellent in all major browsers including IE6. Modern browsers accept 'min-height', then second line set 'height' to be automatic because there is !important keyword, which makes third line ignored. Now IE6: it ignores first line, then make height automatic but due to IE6 bug it also ignores !important keyword. That's why third line overwrites automatic height property and IE6 shows desired result.&lt;br /&gt;&lt;br /&gt;This technique is actually well known by many web developers and very effective as you see. So I hope this help someone to save valuable time, and it's worth to place this post as part of blog knowledge base.&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8250692328889064135-8157055065954392394?l=blog.whirix.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.whirix.com/feeds/8157055065954392394/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=8250692328889064135&amp;postID=8157055065954392394" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8250692328889064135/posts/default/8157055065954392394?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8250692328889064135/posts/default/8157055065954392394?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/WhirixTechnicalBlog/~3/p0HIuN2YCTs/cross-browser-min-height-ie6-and-others.html" title="Cross browser min-height (IE6 and others)" /><author><name>Yuri Subach</name><uri>http://www.blogger.com/profile/13921139305938491792</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="07862698757592030816" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://blog.whirix.com/2008/11/cross-browser-min-height-ie6-and-others.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CE8AQH0-cSp7ImA9WxdTGUk.&quot;"><id>tag:blogger.com,1999:blog-8250692328889064135.post-3491443579901266288</id><published>2008-05-16T05:52:00.000-07:00</published><updated>2008-05-16T06:00:41.359-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-05-16T06:00:41.359-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="kb" /><category scheme="http://www.blogger.com/atom/ns#" term="linux" /><category scheme="http://www.blogger.com/atom/ns#" term="shell" /><title>Logging in Shell Scripts</title><content type="html">This post describe two methods of setting up logger when doing shell scripts. First method is useful when your script has permission to write in system log.&lt;br /&gt;&lt;pre&gt;# setup&lt;br /&gt;log='logger -t logger-id'&lt;br /&gt;# usage&lt;br /&gt;$log "log message..."&lt;br /&gt;&lt;/pre&gt;Second method use redirect of standard output to your log file.&lt;br /&gt;&lt;pre&gt;# setup&lt;br /&gt;function log() {&lt;br /&gt;   echo "`date +'%Y-%m-%d %H:%M:%S'` [$$] $1" &gt;&gt; script.log&lt;br /&gt;}&lt;br /&gt;# usage&lt;br /&gt;log "log message..."&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8250692328889064135-3491443579901266288?l=blog.whirix.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.whirix.com/feeds/3491443579901266288/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=8250692328889064135&amp;postID=3491443579901266288" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8250692328889064135/posts/default/3491443579901266288?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8250692328889064135/posts/default/3491443579901266288?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/WhirixTechnicalBlog/~3/aIL7UnMOY1A/logging-in-shell-scripts.html" title="Logging in Shell Scripts" /><author><name>Yuri Subach</name><uri>http://www.blogger.com/profile/13921139305938491792</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="07862698757592030816" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.whirix.com/2008/05/logging-in-shell-scripts.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkIESXk5eSp7ImA9WxdSE04.&quot;"><id>tag:blogger.com,1999:blog-8250692328889064135.post-4572766195938485925</id><published>2008-05-16T05:41:00.000-07:00</published><updated>2008-05-20T19:55:08.721-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-05-20T19:55:08.721-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="kb" /><category scheme="http://www.blogger.com/atom/ns#" term="AJAX" /><category scheme="http://www.blogger.com/atom/ns#" term="TinyMCE" /><title>Dynamic TinyMCE / TinyMCE and AJAX</title><content type="html">Quick note about adding and removing TinyMCE editor when working with AJAX style pages. Standard initialization &lt;span style="font-style: italic;"&gt;tinyMCE.init()&lt;/span&gt; is not accepatable but we can use another function to add/remove editor dynamically.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;// add editor&lt;br /&gt;tinyMCE.execCommand("mceAddControl", true, elementId);&lt;br /&gt;&lt;br /&gt;// remove editor&lt;br /&gt;tinyMCE.execCommand("mceRemoveControl", true, elementId);&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8250692328889064135-4572766195938485925?l=blog.whirix.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.whirix.com/feeds/4572766195938485925/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=8250692328889064135&amp;postID=4572766195938485925" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8250692328889064135/posts/default/4572766195938485925?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8250692328889064135/posts/default/4572766195938485925?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/WhirixTechnicalBlog/~3/FvnzZOmeNm0/dynamic-tinymce-tinymce-and-ajax.html" title="Dynamic TinyMCE / TinyMCE and AJAX" /><author><name>Yuri Subach</name><uri>http://www.blogger.com/profile/13921139305938491792</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="07862698757592030816" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.whirix.com/2008/05/dynamic-tinymce-tinymce-and-ajax.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0MCQn0-eCp7ImA9WxdTGUk.&quot;"><id>tag:blogger.com,1999:blog-8250692328889064135.post-2412374714322421533</id><published>2008-05-16T05:32:00.000-07:00</published><updated>2008-05-16T05:37:43.350-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-05-16T05:37:43.350-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="kb" /><category scheme="http://www.blogger.com/atom/ns#" term="AJAX" /><category scheme="http://www.blogger.com/atom/ns#" term="safari" /><title>Problem with AJAX upload in Safari</title><content type="html">There is good example which shows how to make &lt;a href="http://www.webtoolkit.info/ajax-file-upload.html"&gt;AJAX style upload via hidden IFRAME&lt;/a&gt;. But Safari and Konqueror browsers open new window. This happen because of CSS property &lt;span style="font-style: italic;"&gt;display: none;&lt;/span&gt; used to hide IFRAME.&lt;br /&gt;&lt;br /&gt;Just remove this property and use different method of hiding - move IFRAME object outside of your window:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;left:-100px;&lt;br /&gt;top:-100px;&lt;br /&gt;width:1px;&lt;br /&gt;height:1px;&lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8250692328889064135-2412374714322421533?l=blog.whirix.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.whirix.com/feeds/2412374714322421533/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=8250692328889064135&amp;postID=2412374714322421533" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8250692328889064135/posts/default/2412374714322421533?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8250692328889064135/posts/default/2412374714322421533?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/WhirixTechnicalBlog/~3/-zZizutDFYQ/problem-with-ajax-upload-in-safari.html" title="Problem with AJAX upload in Safari" /><author><name>Yuri Subach</name><uri>http://www.blogger.com/profile/13921139305938491792</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="07862698757592030816" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.whirix.com/2008/05/problem-with-ajax-upload-in-safari.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0AEQX4yfyp7ImA9WxNaGEw.&quot;"><id>tag:blogger.com,1999:blog-8250692328889064135.post-6633817054424536085</id><published>2008-05-14T21:34:00.000-07:00</published><updated>2009-12-02T21:55:00.097-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-12-02T21:55:00.097-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="kb" /><category scheme="http://www.blogger.com/atom/ns#" term="download" /><category scheme="http://www.blogger.com/atom/ns#" term="ie" /><category scheme="http://www.blogger.com/atom/ns#" term="ie6" /><category scheme="http://www.blogger.com/atom/ns#" term="ie7" /><title>How to force download file in IE</title><content type="html">IE open files inside itself by default, if it knows the file type, for example: images, word documents. To make it download instead of open file, you need to send additional HTTP header in response: &lt;span style="font-style: italic;"&gt;Content-disposition: attachment; filename=my_file.ico&lt;/span&gt; Additionally you need to send some headers to prevent caching of content in browser.&lt;br /&gt;&lt;br /&gt;Short example for PHP:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;$fp = fopen($icoFile, 'r');&lt;br /&gt;&lt;br /&gt;// cache control headers&lt;br /&gt;header("Pragma: public");&lt;br /&gt;header("Expires: 0"); // set expiration time&lt;br /&gt;header("Cache-Control: must-revalidate, post-check=0, pre-check=0");&lt;br /&gt;// send the right headers&lt;br /&gt;header("Content-Type: text/plain");&lt;br /&gt;header("Content-Length: " . filesize($icoFile));&lt;br /&gt;header("Content-disposition: attachment; filename=" . basename($icoFile));&lt;br /&gt;&lt;br /&gt;fpassthru($fp);&lt;br /&gt;fclose($fp);&lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8250692328889064135-6633817054424536085?l=blog.whirix.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.whirix.com/feeds/6633817054424536085/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=8250692328889064135&amp;postID=6633817054424536085" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8250692328889064135/posts/default/6633817054424536085?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8250692328889064135/posts/default/6633817054424536085?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/WhirixTechnicalBlog/~3/uw32IGO_bOg/how-to-force-download-file-in-ie.html" title="How to force download file in IE" /><author><name>Yuri Subach</name><uri>http://www.blogger.com/profile/13921139305938491792</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="07862698757592030816" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.whirix.com/2008/05/how-to-force-download-file-in-ie.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D08DRngzeSp7ImA9WxdTGE8.&quot;"><id>tag:blogger.com,1999:blog-8250692328889064135.post-1039007389463702700</id><published>2008-05-14T21:25:00.000-07:00</published><updated>2008-05-14T21:31:17.681-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-05-14T21:31:17.681-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="kb" /><category scheme="http://www.blogger.com/atom/ns#" term="ampm" /><category scheme="http://www.blogger.com/atom/ns#" term="time" /><title>Mapping 12 hours time format (am/pm) in 24 hours</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_NGjPI4eoxZk/SCu8YIlbHVI/AAAAAAAAAAY/td6ShDAJIQg/s1600-h/kb:am_pm_24.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_NGjPI4eoxZk/SCu8YIlbHVI/AAAAAAAAAAY/td6ShDAJIQg/s400/kb:am_pm_24.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5200457317536701778" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8250692328889064135-1039007389463702700?l=blog.whirix.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.whirix.com/feeds/1039007389463702700/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=8250692328889064135&amp;postID=1039007389463702700" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8250692328889064135/posts/default/1039007389463702700?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8250692328889064135/posts/default/1039007389463702700?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/WhirixTechnicalBlog/~3/vmyk6LpRdDs/mapping-12-hours-time-format-ampm-in-24.html" title="Mapping 12 hours time format (am/pm) in 24 hours" /><author><name>Yuri Subach</name><uri>http://www.blogger.com/profile/13921139305938491792</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="07862698757592030816" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_NGjPI4eoxZk/SCu8YIlbHVI/AAAAAAAAAAY/td6ShDAJIQg/s72-c/kb:am_pm_24.jpg" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.whirix.com/2008/05/mapping-12-hours-time-format-ampm-in-24.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Dk8NR3c-cSp7ImA9WxdTGE8.&quot;"><id>tag:blogger.com,1999:blog-8250692328889064135.post-3585088287085164010</id><published>2008-05-14T21:06:00.000-07:00</published><updated>2008-05-14T21:14:56.959-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-05-14T21:14:56.959-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="kb" /><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="ssl" /><title>Java SSLHandshakeException</title><content type="html">Sometime you get SSLHandshakeException in Java when sending HTTPS requests. Most likely your JVM can not verify SSL certificate because it was given by unknown authority. You can install this authority public key, first &lt;a href="http://hecker.org/mozilla/ca-certificate-list"&gt;download it here&lt;/a&gt;. Now install it in your keystore, for example:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;x29:~ # /opt/jdk/bin/keytool -keystore /opt/jdk/jre/lib/security/cacerts -import -alias usertrust -file /home/yura/UTN-USERFirst-Hardware.crt -trustcacerts&lt;br /&gt;Enter keystore password:  changeit&lt;br /&gt;Owner: CN=UTN-USERFirst-Hardware, OU=http://www.usertrust.com, O=The USERTRUST Network, L=Salt Lake City, ST=UT, C=US&lt;br /&gt;Issuer: CN=UTN-USERFirst-Hardware, OU=http://www.usertrust.com, O=The USERTRUST Network, L=Salt Lake City, ST=UT, C=US&lt;br /&gt;Serial number: 44be0c8b500024b411d3362afe650afd&lt;br /&gt;Valid from: Sat Jul 10 01:10:42 NOVST 1999 until: Wed Jul 10 01:19:22 NOVST 2019&lt;br /&gt;Certificate fingerprints:&lt;br /&gt;         MD5:  4C:56:41:E5:0D:BB:2B:E8:CA:A3:ED:18:08:AD:43:39&lt;br /&gt;         SHA1: 04:83:ED:33:99:AC:36:08:05:87:22:ED:BC:5E:46:00:E3:BE:F9:D7&lt;br /&gt;Trust this certificate? [no]:  yes&lt;br /&gt;Certificate was added to keystore&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Check &lt;a href="http://www.webapper.net/index.cfm/2007/2/9/Troubleshooting-javaxnetsslSSLHandshakeException"&gt;webapper.net blog&lt;/a&gt; for additional details.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8250692328889064135-3585088287085164010?l=blog.whirix.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.whirix.com/feeds/3585088287085164010/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=8250692328889064135&amp;postID=3585088287085164010" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8250692328889064135/posts/default/3585088287085164010?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8250692328889064135/posts/default/3585088287085164010?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/WhirixTechnicalBlog/~3/wjr4zihvhLM/java-sslhandshakeexception.html" title="Java SSLHandshakeException" /><author><name>Yuri Subach</name><uri>http://www.blogger.com/profile/13921139305938491792</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="07862698757592030816" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.whirix.com/2008/05/java-sslhandshakeexception.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEMERHo9eSp7ImA9WxdTGE8.&quot;"><id>tag:blogger.com,1999:blog-8250692328889064135.post-7688488167416748960</id><published>2008-05-14T20:23:00.000-07:00</published><updated>2008-05-14T20:33:25.461-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-05-14T20:33:25.461-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="kb" /><category scheme="http://www.blogger.com/atom/ns#" term="render web site" /><category scheme="http://www.blogger.com/atom/ns#" term="safari" /><title>How to check web site in Safari (Mac OS) and other browsers</title><content type="html">There is a couple of nice web services which render your web site in different browsers and return simple image. It's not ideal testing method but better than nothing :)&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.danvine.com/icapture/"&gt;http://www.danvine.com/icapture/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://browsershots.org/"&gt;http://browsershots.org/&lt;/a&gt; (has several minutes delay)&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8250692328889064135-7688488167416748960?l=blog.whirix.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.whirix.com/feeds/7688488167416748960/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=8250692328889064135&amp;postID=7688488167416748960" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8250692328889064135/posts/default/7688488167416748960?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8250692328889064135/posts/default/7688488167416748960?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/WhirixTechnicalBlog/~3/b71NjJ1vLvc/how-to-check-web-site-in-safari-mac-os.html" title="How to check web site in Safari (Mac OS) and other browsers" /><author><name>Yuri Subach</name><uri>http://www.blogger.com/profile/13921139305938491792</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="07862698757592030816" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.whirix.com/2008/05/how-to-check-web-site-in-safari-mac-os.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C08ESXo4eyp7ImA9WxdTGE8.&quot;"><id>tag:blogger.com,1999:blog-8250692328889064135.post-3663848503771180625</id><published>2008-05-14T20:20:00.000-07:00</published><updated>2008-05-14T20:23:28.433-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-05-14T20:23:28.433-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="kb" /><category scheme="http://www.blogger.com/atom/ns#" term="linux" /><category scheme="http://www.blogger.com/atom/ns#" term="ssh" /><title>SSH public key authentication</title><content type="html">&lt;span style="font-style: italic;"&gt;Continue knowledgebase posts...&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;There are two great articles describing process of configuring SSH public key authentication: &lt;a href="http://www.opennet.ru/base/sec/ssh_pubkey_auth.txt.html"&gt;in Russian&lt;/a&gt; and &lt;a href="http://sial.org/howto/openssh/publickey-auth/"&gt;in English&lt;/a&gt;.&lt;a href="http://info.whx/kb:ssh" class="wikilink1" title="kb:ssh"&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8250692328889064135-3663848503771180625?l=blog.whirix.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.whirix.com/feeds/3663848503771180625/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=8250692328889064135&amp;postID=3663848503771180625" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8250692328889064135/posts/default/3663848503771180625?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8250692328889064135/posts/default/3663848503771180625?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/WhirixTechnicalBlog/~3/RINRXBDpLNo/ssh-public-key-authentication.html" title="SSH public key authentication" /><author><name>Yuri Subach</name><uri>http://www.blogger.com/profile/13921139305938491792</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="07862698757592030816" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.whirix.com/2008/05/ssh-public-key-authentication.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEcDR389eip7ImA9WxdRFEU.&quot;"><id>tag:blogger.com,1999:blog-8250692328889064135.post-7465809974949374465</id><published>2008-04-16T00:11:00.000-07:00</published><updated>2008-06-03T01:34:36.162-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-06-03T01:34:36.162-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="kb" /><category scheme="http://www.blogger.com/atom/ns#" term="ie6" /><category scheme="http://www.blogger.com/atom/ns#" term="ie7" /><title>Install IE6 and IE7 together</title><content type="html">See &lt;a href="http://tredosoft.com/IE7_standalone"&gt;this article&lt;/a&gt; if you want to use IE6 and IE7 together on one Windows machine.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8250692328889064135-7465809974949374465?l=blog.whirix.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.whirix.com/feeds/7465809974949374465/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=8250692328889064135&amp;postID=7465809974949374465" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8250692328889064135/posts/default/7465809974949374465?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8250692328889064135/posts/default/7465809974949374465?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/WhirixTechnicalBlog/~3/7Oi3wvewvOg/install-ie6-and-ie7-together.html" title="Install IE6 and IE7 together" /><author><name>Yuri Subach</name><uri>http://www.blogger.com/profile/13921139305938491792</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="07862698757592030816" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.whirix.com/2008/04/install-ie6-and-ie7-together.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0QBRns6eSp7ImA9WxZbE04.&quot;"><id>tag:blogger.com,1999:blog-8250692328889064135.post-4535060053204732711</id><published>2008-04-15T23:35:00.000-07:00</published><updated>2008-04-16T00:35:57.511-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-04-16T00:35:57.511-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="kb" /><category scheme="http://www.blogger.com/atom/ns#" term="css" /><title>CSS best practices</title><content type="html">&lt;div style="text-align: left;"&gt;&lt;span style="font-style: italic;"&gt;This is first knowledgebase-style post. We are trying to use our technical blog like knowledgebase (kb) platform.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;span style="font-style: italic;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;Some CSS best practices and suggestions&lt;br /&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://jigsaw.w3.org/css-validator/"&gt;Validate CSS&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Use &lt;a href="http://home.no.net/junjun/html/shorthand.html"&gt;Shorthand CSS&lt;/a&gt; if possible&lt;/li&gt;&lt;li&gt;Do not create empty CSS styles&lt;/li&gt;&lt;li&gt;CSS YahooUI classes maybe useful: &lt;a href="http://developer.yahoo.com/yui/reset/"&gt;Reset&lt;/a&gt;, &lt;a href="http://developer.yahoo.com/yui/fonts/"&gt;Fonts&lt;/a&gt;, &lt;a href="http://developer.yahoo.com/yui/grids/"&gt;Grids&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.alistapart.com/articles/sprites"&gt;CSS Sprites&lt;/a&gt; allows to combine several small images into one map, &lt;a href="http://spritegen.website-performance.org/"&gt;generator&lt;/a&gt; can help sometimes&lt;br /&gt;&lt;/li&gt;&lt;li&gt;How to make &lt;a href="http://www.alistapart.com/articles/taminglists/"&gt;nice menus&lt;/a&gt; from &amp;lt;ul&amp;gt; and &amp;lt;li&amp;gt;&lt;/li&gt;&lt;li&gt;Great instruction which explain &lt;a href="http://www.barelyfitz.com/screencast/html-training/css/positioning/"&gt;CSS Positioning&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Nice article about &lt;a href="http://xhtml.ru/2005/10/18/footer-stick/"&gt;putting footer in bottom of the browser with CSS&lt;/a&gt; (Russian language)&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8250692328889064135-4535060053204732711?l=blog.whirix.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.whirix.com/feeds/4535060053204732711/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=8250692328889064135&amp;postID=4535060053204732711" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8250692328889064135/posts/default/4535060053204732711?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8250692328889064135/posts/default/4535060053204732711?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/WhirixTechnicalBlog/~3/bc4FvsUJdcI/css-best-practices.html" title="CSS best practices" /><author><name>Yuri Subach</name><uri>http://www.blogger.com/profile/13921139305938491792</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="07862698757592030816" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.whirix.com/2008/04/css-best-practices.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkECQ3g_cSp7ImA9WB5XFko.&quot;"><id>tag:blogger.com,1999:blog-8250692328889064135.post-6688905671717391564</id><published>2007-07-17T06:09:00.000-07:00</published><updated>2007-07-17T06:24:22.649-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2007-07-17T06:24:22.649-07:00</app:edited><title>The Development Process We Persistently Build</title><content type="html">We have spent some time to draw the process we want to work with. And we do. Because the approach gives a good and reliable way to do the right things. Yes, we like lean development and we learn it every day. Everyday we think how to apply the lean principles to the Whirix company. Actually the only reason we do that is it makes our customers happy.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_tf76FoEgHqo/RpzAOVWnaoI/AAAAAAAAAAk/guC3rIk_IJw/s1600-h/agile.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_tf76FoEgHqo/RpzAOVWnaoI/AAAAAAAAAAk/guC3rIk_IJw/s400/agile.png" alt="" id="BLOGGER_PHOTO_ID_5088153031504521858" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8250692328889064135-6688905671717391564?l=blog.whirix.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.whirix.com/feeds/6688905671717391564/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=8250692328889064135&amp;postID=6688905671717391564" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8250692328889064135/posts/default/6688905671717391564?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8250692328889064135/posts/default/6688905671717391564?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/WhirixTechnicalBlog/~3/UWpAOiaI-Og/development-process-we-persistently.html" title="The Development Process We Persistently Build" /><author><name>Vyacheslav Iutin</name><uri>http://www.blogger.com/profile/15111946323963571963</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="02625353426409893630" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_tf76FoEgHqo/RpzAOVWnaoI/AAAAAAAAAAk/guC3rIk_IJw/s72-c/agile.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.whirix.com/2007/07/development-process-we-persistently.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEQFRHs7cCp7ImA9WB5QGUo.&quot;"><id>tag:blogger.com,1999:blog-8250692328889064135.post-3626396056877564572</id><published>2007-07-04T06:36:00.000-07:00</published><updated>2007-07-09T02:11:55.508-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2007-07-09T02:11:55.508-07:00</app:edited><title>Create customized repeat playlist in Red5</title><content type="html">`Red5 server` is good alternative for FMS in some projects. For example you want to add audio streaming to your web site to play recorded MP3 files organized in playlists. This is like personal radio station. Good feature for such radio station is repeat playlists that play your songs one by one, and after last return to first.&lt;br /&gt;&lt;br /&gt;Problem with Red5 default playlist implementation raise when you want to implement such thing. Unfortunately it never goes to second item of your list, it always play first item. Thanks to Red5 authors, they have added great feature to playlist implementation, this is `IPlaylistController` You just need your own controller implementation attached to playlist.&lt;br /&gt;&lt;br /&gt;Controller source code:&lt;br /&gt;&lt;pre&gt;import org.red5.server.api.stream.IPlaylist;&lt;br /&gt;import org.red5.server.api.stream.IPlaylistController;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;* Playlist controller that cycle items in the&lt;br /&gt;* following order: 1,2,3, 1,2,3, ...&lt;br /&gt;*/&lt;br /&gt;public class LongRepeatController implements IPlaylistController {&lt;br /&gt;/** {@inheritDoc} */&lt;br /&gt;public int nextItem(IPlaylist playlist, int itemIndex) {&lt;br /&gt; return new ControllerImpl(playlist.getItemSize(), itemIndex).next();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/** {@inheritDoc} */&lt;br /&gt;public int previousItem(IPlaylist playlist, int itemIndex) {&lt;br /&gt; return new ControllerImpl(playlist.getItemSize(), itemIndex).previous();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt; * Controller implementation subclass.&lt;br /&gt; * Logic isolated here for easy testing.&lt;br /&gt; */&lt;br /&gt;protected class ControllerImpl {&lt;br /&gt; /** Total list size */&lt;br /&gt; protected int size;&lt;br /&gt;&lt;br /&gt; /** Current item index */&lt;br /&gt; protected int current;&lt;br /&gt;&lt;br /&gt; /**&lt;br /&gt;  * C-tor&lt;br /&gt;  */&lt;br /&gt; public ControllerImpl(int size, int current) {&lt;br /&gt;  this.size = size;&lt;br /&gt;  this.current = current;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; /**&lt;br /&gt;  * @return Next play item&lt;br /&gt;  */&lt;br /&gt; public int next() {&lt;br /&gt;  if (current&amp;lt;0 || current&amp;gt;=size) {&lt;br /&gt;   return -1;&lt;br /&gt;  }&lt;br /&gt;  if (current==(size-1)) {&lt;br /&gt;   return 0;&lt;br /&gt;  } else {&lt;br /&gt;   return (current + 1);&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; /**&lt;br /&gt;  * @return Previous play item&lt;br /&gt;  */&lt;br /&gt; public int previous() {&lt;br /&gt;  if (current&amp;lt;0 || current&amp;gt;=size) {&lt;br /&gt;   return -1;&lt;br /&gt;  }&lt;br /&gt;  if (current==0) {&lt;br /&gt;   return (size-1);&lt;br /&gt;  } else {&lt;br /&gt;   return (current - 1);&lt;br /&gt;  }&lt;br /&gt; } &lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;Simple unit test for this simple class ;-)&lt;br /&gt;&lt;pre&gt;import junit.framework.TestCase;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;* Test for long repeat playlist&lt;br /&gt;*/&lt;br /&gt;public class LongRepeatControllerTest extends TestCase {&lt;br /&gt;/** Testing wrapper */&lt;br /&gt;protected class LongRepeatControllerTester extends LongRepeatController {&lt;br /&gt; public int next(int size, int cur) {&lt;br /&gt;  return new ControllerImpl(size, cur).next();&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public int previous(int size, int cur) {&lt;br /&gt;  return new ControllerImpl(size, cur).previous();&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/** Test for next */&lt;br /&gt;public void testNext() {&lt;br /&gt; LongRepeatControllerTester tester = new LongRepeatControllerTester();&lt;br /&gt; assertEquals(-1, tester.next(5, -2));&lt;br /&gt; assertEquals(1, tester.next(5, 0));&lt;br /&gt; assertEquals(3, tester.next(5, 2));&lt;br /&gt; assertEquals(0, tester.next(5, 4));&lt;br /&gt; assertEquals(-1, tester.next(5, 6));&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/** Test for previous */&lt;br /&gt;public void testPrevious() {&lt;br /&gt; LongRepeatControllerTester tester = new LongRepeatControllerTester();&lt;br /&gt; assertEquals(-1, tester.previous(5, -2));&lt;br /&gt; assertEquals(-1, tester.previous(5, 5));&lt;br /&gt; assertEquals(2, tester.previous(5, 3));&lt;br /&gt; assertEquals(0, tester.previous(5, 1));&lt;br /&gt; assertEquals(4, tester.previous(5, 0));&lt;br /&gt;}&lt;br /&gt;}&lt;/pre&gt;Now just attach new controller to playlist (server stream) object:&lt;br /&gt;&lt;pre&gt;serverStream.setRepeat(true);&lt;br /&gt;serverStream.setPlaylistController(new LongRepeatController());&lt;br /&gt;&lt;/pre&gt;That's it!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8250692328889064135-3626396056877564572?l=blog.whirix.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.whirix.com/feeds/3626396056877564572/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=8250692328889064135&amp;postID=3626396056877564572" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8250692328889064135/posts/default/3626396056877564572?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8250692328889064135/posts/default/3626396056877564572?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/WhirixTechnicalBlog/~3/Orj4-EVpOoE/create-customized-repeat-playlist-in.html" title="Create customized repeat playlist in Red5" /><author><name>Yuri Subach</name><uri>http://www.blogger.com/profile/13921139305938491792</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="07862698757592030816" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.whirix.com/2007/07/create-customized-repeat-playlist-in.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEINSHY6eSp7ImA9WB5TEE0.&quot;"><id>tag:blogger.com,1999:blog-8250692328889064135.post-988388348686696246</id><published>2007-05-24T03:24:00.000-07:00</published><updated>2007-05-24T03:29:59.811-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2007-05-24T03:29:59.811-07:00</app:edited><title>Screenshots of Web Pages</title><content type="html">&lt;div class="level1"&gt;&lt;div class="level1"&gt;&lt;div class="level1"&gt;  &lt;p&gt; It is not a problem to make a screenshots of web pages if you have running firefox on your desktop. But if you can’t start X11 (X.org), it is not so trivial. So the post is about how to create screenshots of web pages via firefox without X11 (X.org) server. &lt;/p&gt;  &lt;p&gt;Unfortunately Firefox can’t work without a display it can connect to. Fortunately there are standard tools which allow to create the necessary environment without starting of X11 (X.org) server. Xvfb tool must be installed. &lt;/p&gt;  &lt;p&gt;First of all extract the Firefox to some folder and start it in order to allow it to create profile in your home directory. Right now you need Xvfb. &lt;/p&gt; &lt;pre class="code bash"&gt;$&gt; Xvfb -ac -screen :&lt;span class="nu0"&gt;0&lt;/span&gt; 1024x768x16 &lt;span class="nu0"&gt;2&lt;/span&gt;&gt;&amp;&lt;span class="nu0"&gt;1&lt;/span&gt; &gt; /dev/null &amp;amp;&lt;br /&gt;$&gt; firefox&lt;/pre&gt; &lt;p&gt; Now you can terminate Firefox with &lt;em&gt;Ctrl-C&lt;/em&gt; and continue the setup. We need a minimal Firefox application panels to make a good screenshots. Thus the Firefox have to be started in a full screen mode. The extension Autohide is very useful here. Just install it: &lt;/p&gt; &lt;pre class="code bash"&gt;$&gt; firefox -install-global-extension autohide.xpi&lt;/pre&gt; &lt;p&gt; This command does not need X11 environment and will be successful. After the installation firefox will understand new command line option &lt;code&gt;-fullscreen&lt;/code&gt;. &lt;/p&gt;  &lt;p&gt; Also Firefox noises with various popups: yellow bar with prompt for plugin install, confirmation for previous session restoring, etc. The following setup strings disable most of them: &lt;/p&gt; &lt;pre class="code javascript"&gt;user_pref&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="st0"&gt;"browser.sessionstore.enabled"&lt;/span&gt;, &lt;span class="kw2"&gt;false&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;;&lt;br /&gt;user_pref&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="st0"&gt;"browser.sessionstore.resume_from_crash"&lt;/span&gt;, &lt;span class="kw2"&gt;false&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;;&lt;br /&gt;user_pref&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="st0"&gt;"browser.startup.page"&lt;/span&gt;, &lt;span class="nu0"&gt;0&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;;&lt;br /&gt;user_pref&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="st0"&gt;"plugin.default_plugin_disabled"&lt;/span&gt;, &lt;span class="kw2"&gt;false&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;;&lt;br /&gt;user_pref&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="st0"&gt;"privacy.popups.disable_from_plugins"&lt;/span&gt;, &lt;span class="nu0"&gt;3&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;;&lt;br /&gt;user_pref&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="st0"&gt;"alerts.totalOpenTime"&lt;/span&gt;, &lt;span class="nu0"&gt;1&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;;&lt;br /&gt;user_pref&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="st0"&gt;"security.enable_ssl2"&lt;/span&gt;, &lt;span class="kw2"&gt;false&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;;&lt;br /&gt;user_pref&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="st0"&gt;"security.enable_ssl3"&lt;/span&gt;, &lt;span class="kw2"&gt;false&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt;;&lt;/pre&gt; &lt;p&gt;  The strings have to be placed in the file &lt;code&gt;~/.mozilla/firefox&lt;em&gt;/XXXXX.nameofprofile&lt;/em&gt;/prefs.js&lt;/code&gt; Please see the site &lt;a href="http://kb.mozillazine.org/Knowledge_Base" class="urlextern" title="http://kb.mozillazine.org/Knowledge_Base" rel="nofollow"&gt;http://kb.mozillazine.org/Knowledge_Base&lt;/a&gt; for explanation of all this options. The topic is not about it. &lt;/p&gt;  &lt;p&gt; If the Firefox and Xvfb are installed you can try to make a screenshot.  &lt;/p&gt; &lt;pre class="code bash"&gt;&lt;span class="re3"&gt;# first of all we have to start Xvfb &lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="kw1"&gt;if&lt;/span&gt; not started yet&lt;span class="br0"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;$&gt; Xvfb -ac -screen :&lt;span class="nu0"&gt;0&lt;/span&gt; 1024x768x16 &lt;span class="nu0"&gt;2&lt;/span&gt;&gt;&amp;&lt;span class="nu0"&gt;1&lt;/span&gt; &gt; /dev/null &amp;amp;&lt;br /&gt;&lt;br /&gt;$&gt; firefox --&lt;span class="re2"&gt;display=&lt;/span&gt;:&lt;span class="nu0"&gt;0&lt;/span&gt; http://www.google.com/ \&lt;br /&gt;  -silent -nosplash -fullscreen &lt;span class="nu0"&gt;2&lt;/span&gt;&gt;&amp;&lt;span class="nu0"&gt;1&lt;/span&gt; &gt; /dev/null&lt;br /&gt;&lt;br /&gt;&lt;span class="re3"&gt;# dump X screen to file&lt;br /&gt;&lt;/span&gt;$&gt; xwd -root -out -display :&lt;span class="nu0"&gt;0&lt;/span&gt; screen.xwd&lt;br /&gt;&lt;br /&gt;&lt;span class="re3"&gt;# convert dump file to some usual format&lt;br /&gt;&lt;/span&gt;&lt;span class="re3"&gt;# and crop possible scrollers of Firefox&lt;br /&gt;&lt;/span&gt;$&gt; convert screen.xwd -crop 1005x768 screen.png&lt;br /&gt;&lt;br /&gt;&lt;span class="re3"&gt;# care about closing of Xvfb and firefox&lt;br /&gt;&lt;/span&gt;$&gt; &lt;span class="kw3"&gt;kill&lt;/span&gt; `pidof firefox`&lt;br /&gt;$&gt; &lt;span class="kw3"&gt;kill&lt;/span&gt; `pidof Xvfb`&lt;/pre&gt; &lt;p&gt; The same, for explanation of what is &lt;code&gt;Xvfb&lt;/code&gt;, &lt;code&gt;xwd&lt;/code&gt;, &lt;code&gt;convert&lt;/code&gt;, &lt;code&gt;pidof&lt;/code&gt; and &lt;code&gt;kill&lt;/code&gt; tools please see the corresponding man pages, since it is not a subject of this topic.  &lt;/p&gt;  &lt;/div&gt;      &lt;!-- wikipage stop --&gt;       &lt;div class="clearer"&gt; &lt;/div&gt;&lt;span class="nu0"&gt;&lt;span class="re2"&gt;&lt;span class="kw3"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8250692328889064135-988388348686696246?l=blog.whirix.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.whirix.com/feeds/988388348686696246/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=8250692328889064135&amp;postID=988388348686696246" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8250692328889064135/posts/default/988388348686696246?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8250692328889064135/posts/default/988388348686696246?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/WhirixTechnicalBlog/~3/Q-XrE7YDFko/screenshots-of-web-pages.html" title="Screenshots of Web Pages" /><author><name>Vyacheslav Iutin</name><uri>http://www.blogger.com/profile/15111946323963571963</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="02625353426409893630" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://blog.whirix.com/2007/05/screenshots-of-web-pages.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUENQ3Y7eip7ImA9WB5SEEw.&quot;"><id>tag:blogger.com,1999:blog-8250692328889064135.post-4702595164356111270</id><published>2007-05-17T03:14:00.000-07:00</published><updated>2007-06-04T20:21:32.802-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2007-06-04T20:21:32.802-07:00</app:edited><title>FFmpeg Compilation</title><content type="html">&lt;div class="level1"&gt;&lt;div class="level1"&gt;&lt;div class="level1"&gt;&lt;div class="level1"&gt;&lt;div class="level1"&gt;  &lt;p&gt;  How to compile ffmpeg with all almost all possible codecs. &lt;/p&gt;  &lt;p&gt; &lt;strong&gt;Library Versions&lt;/strong&gt;  &lt;/p&gt; &lt;ul&gt;&lt;li class="level1"&gt;&lt;div class="li"&gt; a52dec-0.7.4.tar.gz&lt;/div&gt; &lt;/li&gt;&lt;li class="level1"&gt;&lt;div class="li"&gt; amrnb-6.1.0.3.tar.bz2&lt;/div&gt; &lt;/li&gt;&lt;li class="level1"&gt;&lt;div class="li"&gt; amrwb-7.0.0.0.tar.bz2&lt;/div&gt; &lt;/li&gt;&lt;li class="level1"&gt;&lt;div class="li"&gt; faac-1.24.tar.gz&lt;/div&gt; &lt;/li&gt;&lt;li class="level1"&gt;&lt;div class="li"&gt; faad2-2.0.tar.gz&lt;/div&gt; &lt;/li&gt;&lt;li class="level1"&gt;&lt;div class="li"&gt; lame-3.97.tar.gz&lt;/div&gt; &lt;/li&gt;&lt;li class="level1"&gt;&lt;div class="li"&gt; libogg-1.1.3.tar.gz&lt;/div&gt; &lt;/li&gt;&lt;li class="level1"&gt;&lt;div class="li"&gt; libvorbis-1.1.2.tar.gz&lt;/div&gt; &lt;/li&gt;&lt;li class="level1"&gt;&lt;div class="li"&gt; libtheora-mmx-1.0alpha5.zip&lt;/div&gt; &lt;/li&gt;&lt;li class="level1"&gt;&lt;div class="li"&gt; x264-snapshot-20070515-2245.tar.bz2 (with yasm-0.6.0.tar.gz )&lt;/div&gt; &lt;/li&gt;&lt;li class="level1"&gt;&lt;div class="li"&gt; xvidcore-1.1.2.tar.bz2&lt;/div&gt; &lt;/li&gt;&lt;li class="level1"&gt;&lt;div class="li"&gt; ffmpeg-checkout-snapshot.tar.bz2 (snapshort from 2007-05-09)&lt;/div&gt; &lt;/li&gt;&lt;/ul&gt;  &lt;p&gt; Actually the latest versions of all the libraries was got. Excluding faad and faac. The given pair is the only combination which I was able to compile and make work with ffmpeg. &lt;/p&gt;  &lt;p&gt;  &lt;strong&gt;Compilation Process&lt;/strong&gt; &lt;/p&gt;  &lt;p&gt; Suggestion: it is very useful to start &lt;code&gt;ldconfig&lt;/code&gt; after every library compilation.  &lt;/p&gt; &lt;ul&gt;&lt;li class="level1"&gt;&lt;div class="li"&gt; faad2 must be compiled (with option &lt;em&gt;-&lt;/em&gt;&lt;em&gt;-with-mp4v2&lt;/em&gt;) before &lt;strong&gt;faac&lt;/strong&gt;&lt;/div&gt; &lt;ul&gt;&lt;li class="level2"&gt;&lt;div class="li"&gt; Possible problem 1: when doing make it fails with error about &lt;em&gt;missing separator&lt;/em&gt;. Fix: remove the target &lt;em&gt;rpm&lt;/em&gt; at the bottom of &lt;code&gt;Makefile&lt;/code&gt;, after editing the bottom of the file must look like that: &lt;pre class="code"&gt;...&lt;br /&gt;# Tell versions [3.59,3.63) of GNU make to not export all variables.&lt;br /&gt;# Otherwise a system limit (for SysV at least) may be exceeded.&lt;br /&gt;.NOEXPORT:&lt;br /&gt;&lt;/pre&gt; &lt;/div&gt; &lt;/li&gt;&lt;li class="level2"&gt;&lt;div class="li"&gt; Possible problem 2: &lt;em&gt;invalid initializer for virtual method&lt;/em&gt; when compiling. Fix: in files &lt;code&gt;mp4property.h&lt;/code&gt; and &lt;code&gt;rtphint.h&lt;/code&gt; fix all virtual methods defined with NULL. Example: &lt;pre class="code cpp"&gt;&lt;span class="kw2"&gt;virtual&lt;/span&gt; &lt;span class="kw4"&gt;void&lt;/span&gt; SetCount&lt;span class="br0"&gt;(&lt;/span&gt;u_int32_t count&lt;span class="br0"&gt;)&lt;/span&gt; = &lt;span class="kw2"&gt;NULL&lt;/span&gt;;&lt;/pre&gt; &lt;p&gt;  replace to  &lt;/p&gt; &lt;pre class="code cpp"&gt;&lt;span class="kw2"&gt;virtual&lt;/span&gt; &lt;span class="kw4"&gt;void&lt;/span&gt; SetCount&lt;span class="br0"&gt;(&lt;/span&gt;u_int32_t count&lt;span class="br0"&gt;)&lt;/span&gt; = &lt;span class="nu0"&gt;0&lt;/span&gt;;&lt;/pre&gt; &lt;p&gt;  There are several methods in the files defines in such style, fix them all. &lt;/p&gt; &lt;/div&gt; &lt;/li&gt;&lt;/ul&gt; &lt;/li&gt;&lt;li class="level1"&gt;&lt;div class="li"&gt; faac ensure that it’ll be build with mp4v2 from compiled &lt;strong&gt;faad&lt;/strong&gt;. After configuration complete, check: &lt;pre class="code bash"&gt;cat config.log | grep &lt;span class="st0"&gt;'with MP4'&lt;/span&gt;&lt;/pre&gt; &lt;p&gt;  it must found string &lt;code&gt;*** Building with MP4 support ***&lt;/code&gt; &lt;/p&gt; &lt;/div&gt; &lt;/li&gt;&lt;li class="level1"&gt;&lt;div class="li"&gt; libogg must be compiled before &lt;strong&gt;vorbis&lt;/strong&gt;, ensure that vorbis config found libogg&lt;/div&gt; &lt;/li&gt;&lt;li class="level1"&gt;&lt;div class="li"&gt; libtheora-mmx must be compiled after &lt;strong&gt;libogg&lt;/strong&gt; and &lt;strong&gt;vorbis&lt;/strong&gt;&lt;/div&gt; &lt;/li&gt;&lt;li class="level1"&gt;&lt;div class="li"&gt; x264 must be compiled with &lt;em&gt;-&lt;/em&gt;&lt;em&gt;-enable-shared&lt;/em&gt;&lt;/div&gt; &lt;/li&gt;&lt;li class="level1"&gt;&lt;div class="li"&gt; ffmpeg&lt;pre class="code bash"&gt;./configure --enable-shared --enable-libfaad \&lt;br /&gt;--enable-libfaadbin --enable-libfaac \&lt;br /&gt;--enable-libvorbis --enable-libogg \&lt;br /&gt;--enable-libtheora --enable-xvid \&lt;br /&gt;--enable-libmp3lame --enable-liba52 \&lt;br /&gt;--enable-liba52bin --enable-libamr-nb \&lt;br /&gt;--enable-libamr-wb --enable-gpl --enable-x264&lt;/pre&gt;&lt;/div&gt; &lt;/li&gt;&lt;li class="level1"&gt;&lt;div class="li"&gt; a52 it is not a mistake that the library is listed after ffmpeg. &lt;/div&gt; &lt;ul&gt;&lt;li class="level2"&gt;&lt;div class="li"&gt; Possible problem: If I configure a52 with the flag &lt;em&gt;-&lt;/em&gt;&lt;em&gt;-enable-shared&lt;/em&gt; before ffmpeg compilation, then the ffmpeg compilation failed. If I do not recompile a52 after, ffmpeg can’t open shared a52 library because it is compiled as static by default. The way I was able to make it work:&lt;/div&gt; &lt;ol&gt;&lt;li class="level3"&gt;&lt;div class="li"&gt; compile a52 without flags and install&lt;/div&gt; &lt;/li&gt;&lt;li class="level3"&gt;&lt;div class="li"&gt; compile and install ffmpeg (see above)&lt;/div&gt; &lt;/li&gt;&lt;li class="level3"&gt;&lt;div class="li"&gt; AGAIN configure a52 with flag &lt;em&gt;-&lt;/em&gt;&lt;em&gt;-enable-shared&lt;/em&gt;, compile and install&lt;/div&gt; &lt;/li&gt;&lt;/ol&gt; &lt;/li&gt;&lt;/ul&gt; &lt;/li&gt;&lt;/ul&gt;  &lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8250692328889064135-4702595164356111270?l=blog.whirix.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.whirix.com/feeds/4702595164356111270/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=8250692328889064135&amp;postID=4702595164356111270" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8250692328889064135/posts/default/4702595164356111270?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8250692328889064135/posts/default/4702595164356111270?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/WhirixTechnicalBlog/~3/mZdTsAYpFlo/ffmpeg-compilation.html" title="FFmpeg Compilation" /><author><name>Vyacheslav Iutin</name><uri>http://www.blogger.com/profile/15111946323963571963</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="02625353426409893630" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.whirix.com/2007/05/ffmpeg-compilation.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkYASXY5fyp7ImA9WBFbEko.&quot;"><id>tag:blogger.com,1999:blog-8250692328889064135.post-2219031621368804584</id><published>2007-05-03T20:04:00.000-07:00</published><updated>2007-05-04T04:29:08.827-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2007-05-04T04:29:08.827-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="AJAX" /><title>Safari Ajax Problem</title><content type="html">&lt;span style="font-style: italic;"&gt;Ajax (or AJAX)&lt;/span&gt; is shorthand for "Asynchronous JavaScript and XML". It's clear that this technology imply asynchronous communication, but &lt;span style="font-style: italic;"&gt;XmlHttpRequest&lt;/span&gt; object can do synchronized calls to server. Avoid this practice because it's not working in &lt;span style="font-style: italic;"&gt;Safari&lt;/span&gt; browser.&lt;br /&gt;&lt;br /&gt;We have used &lt;span style="font-style: italic;"&gt;phpRequest&lt;/span&gt; class for such calls (&lt;a href="http://www.phphacks.com/content/view/52/33/"&gt;http://www.phphacks.com/content/view/52/33/&lt;/a&gt;). It has &lt;span style="font-style: italic;"&gt;execute()&lt;/span&gt; method which sends request to server, wait for response, and return it as result. Example of the code:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt; var httpReq = new phpRequest('myScript.php');&lt;br /&gt; var resp = httpReq.execute();&lt;br /&gt; // do something with resp...&lt;br /&gt; alert(resp);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;This approach is not works in &lt;span style="font-style: italic;"&gt;Safari&lt;/span&gt; browser (not sure about version number). Small refactoring of this code and new method &lt;span style="font-style: italic;"&gt;executeWithCallback()&lt;/span&gt; makes everyone happy :-)&lt;br /&gt;&lt;pre&gt;&lt;br /&gt; var httpReq = new phpRequest('myScript.php');&lt;br /&gt; var cb = function(resp) {&lt;br /&gt;     // do something with resp...&lt;br /&gt;     alert(resp);&lt;br /&gt; };&lt;br /&gt; httpReq.executeWithCallback(cb);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Code for &lt;span style="font-style: italic;"&gt;executeWithCallback()&lt;/span&gt; is trivial I suppose. So, make your code really asynchronous to make it robust and avoid problems like this. Good example is SAJAX library: &lt;a href="http://www.modernmethod.com/sajax"&gt;http://www.modernmethod.com/sajax&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8250692328889064135-2219031621368804584?l=blog.whirix.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.whirix.com/feeds/2219031621368804584/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=8250692328889064135&amp;postID=2219031621368804584" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8250692328889064135/posts/default/2219031621368804584?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8250692328889064135/posts/default/2219031621368804584?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/WhirixTechnicalBlog/~3/R1wO5jvdc1Y/safari-ajax-problem.html" title="Safari Ajax Problem" /><author><name>Yuri Subach</name><uri>http://www.blogger.com/profile/13921139305938491792</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="07862698757592030816" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.whirix.com/2007/05/safari-ajax-problem.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUIAR3k4fCp7ImA9WBFbE0k.&quot;"><id>tag:blogger.com,1999:blog-8250692328889064135.post-997299114625640482</id><published>2007-04-24T05:50:00.000-07:00</published><updated>2007-05-04T23:45:46.734-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2007-05-04T23:45:46.734-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="TDD" /><title>JsUnit integration</title><content type="html">Today we tried to integrate &lt;a href="http://www.jsunit.net/"&gt;JsUnit&lt;/a&gt;. One of issues was how to execute JavaScript tests within other unit tests (&lt;a href="http://phpunit.de/"&gt;PHPUnit&lt;/a&gt; of version 2).&lt;br /&gt;&lt;br /&gt;The tests must be easy to execute, but at first sight it looks like you should insert urls to your tests in JsUnit runner and click Run button every time to look at test results. Fortunately JsUnit understands query strings: &lt;span style="font-style: italic;"&gt;testPage&lt;/span&gt; and &lt;span style="font-style: italic;"&gt;autoRun&lt;/span&gt;. It makes life much better...&lt;br /&gt;&lt;br /&gt;The first attempt was calling JsUnit runner via iframe in the test result page. It was unsuccessful because the runner uses some top elements from the page. And if the page is displayed in the iframe then the elements are got from PHPUnit test page result, not from runner's page itself. So the attempt was failed.&lt;br /&gt;&lt;br /&gt;The next thought was to open test pages in JavaScript popup windows. We have done the following: install the JsUnit into &lt;span style="font-weight: bold;"&gt;tests/js/jsunit&lt;/span&gt; folder and create a &lt;span style="font-weight: bold;"&gt;tests/JavaScriptTest.php&lt;/span&gt; file with the test method:&lt;br /&gt;&lt;pre&gt;&lt;span style="font-size:100%;"&gt;function testJavaScript() {&lt;br /&gt; $jsTestPath =  $_SERVER["SERVER_NAME"] .&lt;/span&gt;&lt;span style="font-size:100%;"&gt;    &lt;/span&gt;&lt;span style="font-size:100%;"&gt;   &lt;br /&gt;   &lt;/span&gt;&lt;span style="font-size:100%;"&gt;dirname($_SERVER["SCRIPT_NAME"]) . '/js';&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;  &lt;/span&gt;&lt;span style="font-size:100%;"&gt;$tests = array();&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;  &lt;/span&gt;&lt;span style="font-size:100%;"&gt;foreach (glob("js/*.html") as $filename) {&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;   &lt;/span&gt;&lt;span style="font-size:100%;"&gt;$tests[] = basename($filename);&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;  &lt;/span&gt;&lt;span style="font-size:100%;"&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;  &lt;/span&gt;&lt;span style="font-size:100%;"&gt;echo "&amp;lt;script language='JavaScript'&amp;gt;\n";&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;  &lt;/span&gt;&lt;span style="font-size:100%;"&gt;foreach ($tests as $test) {&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;  &lt;/span&gt;&lt;span style="font-size:100%;"&gt;  &lt;/span&gt;&lt;span style="font-size:100%;"&gt;$fullPath = "http://{$jsTestPath}" .&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;    &lt;/span&gt;&lt;span style="font-family: mon;"&gt;  &lt;/span&gt;&lt;span style="font-size:100%;"&gt;"/jsunit/testRunner.html?testPage=" .&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;    &lt;/span&gt;&lt;span style="font-size:100%;"&gt;  &lt;/span&gt;&lt;span style="font-size:100%;"&gt;"{$jsTestPath}/{$test}&amp;autoRun=true";&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;  &lt;/span&gt;&lt;span style="font-size:100%;"&gt;  &lt;/span&gt;&lt;span style="font-size:100%;"&gt;echo "window.open('{$fullPath}', '{$test}', " .&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;    &lt;/span&gt;&lt;span style="font-size:100%;"&gt;  &lt;/span&gt;&lt;span style="font-size:100%;"&gt;"'location=1,status=1,scrollbars=1,width=950,height=500');\n";&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;  &lt;/span&gt;&lt;span style="font-size:100%;"&gt;}&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;  &lt;/span&gt;&lt;span style="font-size:100%;"&gt;echo "&amp;lt;/script&amp;gt;\n";&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;It just scans for test pages in &lt;span style="font-weight: bold;"&gt;tests/js&lt;/span&gt; folder and generate JavaScript for opening them in a separate popups. We found it is very useful. Every time you run your test suites it execute JavaScript tests too. If a test is failed you can fix the code and run the failed test page until success without restarting of server side tests.&lt;br /&gt;&lt;br /&gt;It is rather hard to say how to use JsUnit for testing AJAX stuffs or for visual (DOM) manipulations. Because it requires to create rather expansive environment. But if you have pure calculation JavaScript methods (for example something like hex2rgb color convertion, etc) then it could add a lot of stability to your project.&lt;br /&gt;&lt;br /&gt;Other note is the JavaScriptTest should not be executed from your &lt;a href="http://cruisecontrol.sourceforge.net/"&gt;Cruise Control&lt;/a&gt; system (in case you don't use &lt;a href="http://www.jsunit.net/documentation/serverOverview.html"&gt;JsUnit server&lt;/a&gt; of course).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8250692328889064135-997299114625640482?l=blog.whirix.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.whirix.com/feeds/997299114625640482/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=8250692328889064135&amp;postID=997299114625640482" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8250692328889064135/posts/default/997299114625640482?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8250692328889064135/posts/default/997299114625640482?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/WhirixTechnicalBlog/~3/jMVPNlnGsfc/jsunit-integration.html" title="JsUnit integration" /><author><name>Vyacheslav Iutin</name><uri>http://www.blogger.com/profile/15111946323963571963</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="02625353426409893630" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.whirix.com/2007/04/jsunit-integration.html</feedburner:origLink></entry></feed>
