<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/rss2full.xsl" type="text/xsl" media="screen"?><?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/itemcontent.css" type="text/css" media="screen"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0" xml:base="http://www.alexatnet.com">
<channel>
 <title>Alex @ Net</title>
 <link>http://www.alexatnet.com</link>
 <description />
 <language>en</language>
<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/AlexAtNet" type="application/rss+xml" /><feedburner:browserFriendly>This is an XML content feed. It is intended to be viewed in a newsreader or syndicated to another site, subject to copyright and fair use.</feedburner:browserFriendly><item>
 <title>Sample debug session with Google Chrome JavaScript debuger</title>
 <link>http://www.alexatnet.com/node/180</link>
 <description>&lt;p&gt;&lt;em&gt;This article will show you how to useJavaScript debugger in Google Chrome browser.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;!--break--&gt;&lt;/p&gt;
&lt;p&gt;After a couple weeks of using &lt;a href="http://www.google.com/chrome"&gt;Chrome&lt;/a&gt; as my primary browser I consider it wonderful. It is not as feature-rich as FireFox with plugins but it is excellent for regular browsing. The thing I've missed the much is JavaScript debugger so I've decided that this time I will dig through the command line Chrome debugger.&lt;/p&gt;
&lt;p&gt;At the first, let's talk a little about how we debug. In most of the systems developers debug code by setting breakpoints and review&lt;br /&gt;
variable values in the breakpoints and use step-by-step debugging, e.g. executing instructions line by line and review how the variables&lt;br /&gt;
are changed. Google Chrome debugger supports these features but instead of user-friendly GUI it provides developers with command-line like&lt;br /&gt;
debugger.&lt;/p&gt;
&lt;p&gt;Let's start from the sample page with a bit of JavaScript:&lt;/p&gt;
&lt;pre&gt;
&amp;lt;html&gt;
&amp;lt;head&amp;gt;
&amp;lt;title&amp;gt;Sample debug page&amp;lt;/title&amp;gt;
&amp;lt;script type="text/javascript"&amp;gt;
function test(msg) {
  var message = createMessage(msg);
  alert(message);
}
function createMessage(text) {
  var result = getTime()
  result += '\n' + text;
  return result;
}
function getTime() {
  return new Date().toDateString();
}
&amp;lt;/script&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;button onclick="test('Yes!');"&amp;gt;Debug me&amp;lt;/button&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/pre&gt;&lt;p&gt;Then open this page in the browser, press &lt;strong&gt;Alt-`&lt;/strong&gt; (` usually the key before 1 on the first line on&lt;br /&gt;
the keyboard) to open JavaScript debugger and &lt;strong&gt;Ctrl+U&lt;/strong&gt; to view the source (pressing &lt;strong&gt;Alt-`&lt;/strong&gt; in source view will attach the debugger to the source view window, not to the page we want to debug). Type &lt;code&gt;help&lt;/code&gt; in debugger prompt and most likelly your will have something similar to the picture below on your screen:&lt;/p&gt;
&lt;div style="width: 451px; margin: 0 auto;"&gt;&lt;img src="http://www.alexatnet.com/files/chrome-js-debugger.png" /&gt;&lt;/div&gt;
&lt;p&gt;In this mode you can execute the following commands: &lt;code&gt;break&lt;/code&gt;, &lt;code&gt;break_info&lt;/code&gt;, &lt;code&gt;clear&lt;/code&gt;, &lt;code&gt;help&lt;/code&gt;, &lt;code&gt;print&lt;/code&gt;, and &lt;code&gt;scripts&lt;/code&gt;.&lt;/p&gt;
&lt;dl&gt;
&lt;dt&gt;&lt;code&gt;break [location] &amp;lt;condition&amp;gt;&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;set breakpoint&lt;/dd&gt;
&lt;dt&gt;&lt;code&gt;break_info &amp;lt;breakpoint #&amp;gt;&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;view breakpoint information&lt;/dd&gt;
&lt;dt&gt;&lt;code&gt;clear &amp;lt;breakpoint #&amp;gt;&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;delete breakpoint&lt;/dd&gt;
&lt;dt&gt;&lt;code&gt;help [command]&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;show help for command&lt;/dd&gt;
&lt;dt&gt;&lt;code&gt;print &amp;lt;expression&amp;gt;&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;evaluate expression and print the result&lt;/dd&gt;
&lt;dt&gt;&lt;code&gt;scripts&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;shows all scripts debugger can work with&lt;/dd&gt;
&lt;/dl&gt;
&lt;p&gt;First, let's see what we can debug on the sample page by typing "scripts" command:&lt;/p&gt;
&lt;pre&gt;&lt;span style="color: #a0a0a0"&gt;$&lt;/span&gt; &lt;strong&gt;scripts&lt;/strong&gt;
[unnamed] (source:"")
[unnamed] (source:"")
&lt;a href="///C:/Test.html" title="///C:/Test.html"&gt;file:///C:/Test.html&lt;/a&gt; (lines 3-15)
[unnamed] (source:"void(0)")&lt;/pre&gt;&lt;p&gt;It seems that first two and last lines exists for even an empty document to what we can debug is between them: &lt;a href="///C:/Test.html" title="///C:/Test.html"&gt;file:///C:/Test.html&lt;/a&gt; (lines 3-15)&lt;/p&gt;
&lt;p&gt;Let's set out first breakpoint. For this we need to call the break command and its syntax is&lt;/p&gt;
&lt;pre&gt;&lt;span style="color: #a0a0a0"&gt;$&lt;/span&gt; &lt;strong&gt;help break&lt;/strong&gt;
usage: break [location] &amp;lt;condition&amp;gt;
location is one of &amp;lt;function&amp;gt; | &amp;lt;script:function&amp;gt; |
&amp;lt;script:line&amp;gt; | &amp;lt;script:line:pos&amp;gt;&lt;/pre&gt;&lt;p&gt;So if we want to set breakpoint on "var message = createMessage(msg);" line we can use:&lt;/p&gt;
&lt;pre&gt;&lt;span style="color: #a0a0a0"&gt;$&lt;/span&gt; &lt;strong&gt;break file:///C:/Test.html:6&lt;/strong&gt;
set breakpoint #1&lt;/pre&gt;&lt;p&gt;and to check the current status of the breakpoint:&lt;/p&gt;
&lt;pre&gt;&lt;span style="color: #a0a0a0"&gt;$&lt;/span&gt; &lt;strong&gt;break_info 1&lt;/strong&gt;
id=1, hit_count=0, type=script, target=file:///C:/Test.html, line=5&lt;/pre&gt;&lt;p&gt;Now click on the button, the debugger will output the follwing:&lt;/p&gt;
&lt;pre&gt;paused at breakpoint 1: test(msg=Yes!), &lt;a href="///C:/Test.html" title="///C:/Test.html"&gt;file:///C:/Test.html&lt;/a&gt;
6:   var message = createMessage(msg);&lt;/pre&gt;&lt;p&gt;Let's print breakpoint information and see what is changed:&lt;/p&gt;
&lt;pre&gt;&lt;span style="color: #a0a0a0"&gt;$&lt;/span&gt; &lt;strong&gt;break_info 1&lt;/strong&gt;
id=1, hit_count=1, type=script, target=file:///C:/Test.html, line=5&lt;/pre&gt;&lt;p&gt;and type "help" to review what we can do when the script is paused:&lt;/p&gt;
&lt;pre&gt;&lt;span style="color: #a0a0a0"&gt;$&lt;/span&gt; &lt;strong&gt;help&lt;/strong&gt;
Status: page is paused
Available commands:
   args
   break [location] &amp;lt;condition&amp;gt;
   break_info [breakpoint #]
   backtrace [from frame #] [to frame #]
   clear &amp;lt;breakpoint #&amp;gt;
   continue
   frame &amp;lt;frame #&amp;gt;
   help [command]
   locals
   next
   print &amp;lt;expression&amp;gt;
   scripts
   source [from line] | [&amp;lt;from line&amp;gt; &amp;lt;num lines&amp;gt;]
   step
   stepout&lt;/pre&gt;&lt;p&gt;The set of commands is expanded by adding several new commands: args, backtrace, continue, frame, locals, next, source, step, and stepout.&lt;/p&gt;
&lt;p&gt;args displays the parameters the current function is called with.&lt;/p&gt;
&lt;pre&gt;&lt;span style="color: #a0a0a0"&gt;$&lt;/span&gt; &lt;strong&gt;args&lt;/strong&gt;
msg = "Yes!"&lt;/pre&gt;&lt;p&gt;backtrace shows function call stack and you can move between contexts using frame command:&lt;/p&gt;
&lt;pre&gt;&lt;span style="color: #a0a0a0"&gt;$&lt;/span&gt; &lt;strong&gt;backtrace&lt;/strong&gt;
Frames #0 to #1 of 2:
#00 test(msg=Yes!) &lt;a href="///C:/Test.html" title="///C:/Test.html"&gt;file:///C:/Test.html&lt;/a&gt; line 6 column 17 (position 39)
#01 #&amp;lt;an HTMLButtonElement&amp;gt;.onclick(evt=#&amp;lt;a MouseEvent&amp;gt;)
    &lt;a href="///C:/Test.html" title="///C:/Test.html"&gt;file:///C:/Test.html&lt;/a&gt; line 20 column 9 (position 143)&lt;/pre&gt;&lt;p&gt;Moving to previous frame:&lt;/p&gt;
&lt;pre&gt;&lt;span style="color: #a0a0a0"&gt;$&lt;/span&gt; &lt;strong&gt;frame 1&lt;/strong&gt;
#1 onclick, &lt;a href="///C:/Test.html" title="///C:/Test.html"&gt;file:///C:/Test.html&lt;/a&gt;
15:         test('Yes!');&lt;/pre&gt;&lt;p&gt;Review the arguments:&lt;/p&gt;
&lt;pre&gt;&lt;span style="color: #a0a0a0"&gt;$&lt;/span&gt; &lt;strong&gt;args&lt;/strong&gt;
evt = #&amp;lt;a MouseEvent&amp;gt;&lt;/pre&gt;&lt;p&gt;Print event argument:&lt;/p&gt;
&lt;pre&gt;&lt;span style="color: #a0a0a0"&gt;$&lt;/span&gt; &lt;strong&gt;print evt&lt;/strong&gt;
#&amp;lt;a MouseEvent&amp;gt;&lt;/pre&gt;&lt;p&gt;Back to our breakpoint:&lt;/p&gt;
&lt;pre&gt;&lt;span style="color: #a0a0a0"&gt;$&lt;/span&gt; &lt;strong&gt;frame 0&lt;/strong&gt;&lt;/pre&gt;&lt;p&gt;Print all local variables:&lt;/p&gt;
&lt;pre&gt;&lt;span style="color: #a0a0a0"&gt;$&lt;/span&gt; &lt;strong&gt;locals&lt;/strong&gt;
message = undefined&lt;/pre&gt;&lt;p&gt;Display source code of the script, 6 lines from line 3rd line:&lt;/p&gt;
&lt;pre&gt;&lt;span style="color: #a0a0a0"&gt;$&lt;/span&gt; &lt;strong&gt;source 3 6&lt;/strong&gt;
 4: 
 5: function test(msg) {
 6:   var message = createMessage(msg);
 7:   alert(message);
 8: }&lt;/pre&gt;&lt;dl&gt;
&lt;dt&gt;&lt;code&gt;next&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;Executes the current statement and moves instruction pointer to the next instruction in the current function. Visual Studio equivalent: step.&lt;/dd&gt;
&lt;dt&gt;&lt;code&gt;step&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;Similar to next, except instead of moving over instructions on the current function it moves the debugger into&lt;br /&gt;
the called functions. Visual Studio equivalent: step into.&lt;/dd&gt;
&lt;dt&gt;&lt;code&gt;stepout&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;Executes all commands in the current function and stops after function returns the value. Visual Studio equivalent: step out.&lt;/dd&gt;
&lt;dt&gt;&lt;code&gt;continue&lt;/code&gt;&lt;/dt&gt;
&lt;dd&gt;Executes all commands till the next breakpoint.&lt;/dd&gt;
&lt;/dl&gt;
&lt;p&gt;Let's investigate how out code works by executing next command several times and reviewing variables:&lt;/p&gt;
&lt;pre&gt;&lt;span style="color: #a0a0a0"&gt;$&lt;/span&gt; &lt;strong&gt;step&lt;/strong&gt;
createMessage(text=Yes!), &lt;a href="///C:/Test.html" title="///C:/Test.html"&gt;file:///C:/Test.html&lt;/a&gt;
10:   var result = getTime()&lt;/pre&gt;&lt;pre&gt;&lt;span style="color: #a0a0a0"&gt;$&lt;/span&gt; &lt;strong&gt;step&lt;/strong&gt;
getTime(), &lt;a href="///C:/Test.html" title="///C:/Test.html"&gt;file:///C:/Test.html&lt;/a&gt;
15:   return new Date().toDateString();&lt;/pre&gt;&lt;pre&gt;&lt;span style="color: #a0a0a0"&gt;$&lt;/span&gt; &lt;strong&gt;step&lt;/strong&gt;
new Date(year=undefined, month=undefined, date=undefined, hours=undefined,
minutes=undefined, seconds=undefined, ms=undefined), [no source]&lt;/pre&gt;&lt;pre&gt;&lt;span style="color: #a0a0a0"&gt;$&lt;/span&gt; &lt;strong&gt;step&lt;/strong&gt;
getTime(), &lt;a href="///C:/Test.html" title="///C:/Test.html"&gt;file:///C:/Test.html&lt;/a&gt;
15:   return new Date().toDateString();&lt;/pre&gt;&lt;pre&gt;&lt;span style="color: #a0a0a0"&gt;$&lt;/span&gt; &lt;strong&gt;step&lt;/strong&gt;
15:   return new Date().toDateString();&lt;/pre&gt;&lt;pre&gt;&lt;span style="color: #a0a0a0"&gt;$&lt;/span&gt; &lt;strong&gt;step&lt;/strong&gt;
createMessage(text=Yes!), &lt;a href="///C:/Test.html" title="///C:/Test.html"&gt;file:///C:/Test.html&lt;/a&gt;
12:   return result;&lt;/pre&gt;&lt;pre&gt;&lt;span style="color: #a0a0a0"&gt;$&lt;/span&gt; &lt;strong&gt;locals&lt;/strong&gt;
result = "Sat Sep 27 2008\nYes!"&lt;/pre&gt;&lt;pre&gt;&lt;span style="color: #a0a0a0"&gt;$&lt;/span&gt; &lt;strong&gt;source&lt;/strong&gt;
 7:   alert(message);
 8: }
 9: function createMessage(text) {
10:   var result = getTime()
11:   result += '\n' + text;
&amp;gt;&amp;gt;&amp;gt;&amp;gt;  return result;
13: }
14: function getTime() {
15:   return new Date().toDateString();
16: }&lt;/pre&gt;&lt;pre&gt;&lt;span style="color: #a0a0a0"&gt;$&lt;/span&gt; &lt;strong&gt;print result&lt;/strong&gt;
Sat Sep 27 2008
Yes!&lt;/pre&gt;&lt;pre&gt;&lt;span style="color: #a0a0a0"&gt;$&lt;/span&gt; &lt;strong&gt;print result.length&lt;/strong&gt;
20&lt;/pre&gt;&lt;pre&gt;&lt;span style="color: #a0a0a0"&gt;$&lt;/span&gt; &lt;strong&gt;stepout&lt;/strong&gt;
test(msg=Yes!), &lt;a href="///C:/Test.html" title="///C:/Test.html"&gt;file:///C:/Test.html&lt;/a&gt;
7:   alert(message);&lt;/pre&gt;&lt;pre&gt;&lt;span style="color: #a0a0a0"&gt;$&lt;/span&gt; &lt;strong&gt;source&lt;/strong&gt;
 4: 
 5: function test(msg) {
 6:   var message = createMessage(msg);
&amp;gt;&amp;gt;&amp;gt;&amp;gt;  alert(message);
 8: }
 9: function createMessage(text) {
10:   var result = getTime()
11:   result += '\n' + text;
12:   return result;&lt;/pre&gt;&lt;pre&gt;&lt;span style="color: #a0a0a0"&gt;$&lt;/span&gt; &lt;strong&gt;step&lt;/strong&gt;
}&lt;/pre&gt;&lt;p&gt;Now the message box should be displayed.&lt;/p&gt;
&lt;pre&gt;&lt;span style="color: #a0a0a0"&gt;$&lt;/span&gt; &lt;strong&gt;continue&lt;/strong&gt;&lt;/pre&gt;&lt;p&gt;&lt;code&gt;continue&lt;/code&gt; do not output anything.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/AlexAtNet?a=arLgL"&gt;&lt;img src="http://feeds.feedburner.com/~f/AlexAtNet?i=arLgL" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AlexAtNet?a=Ul4ml"&gt;&lt;img src="http://feeds.feedburner.com/~f/AlexAtNet?i=Ul4ml" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AlexAtNet?a=7rSkl"&gt;&lt;img src="http://feeds.feedburner.com/~f/AlexAtNet?i=7rSkl" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AlexAtNet?a=DvuAL"&gt;&lt;img src="http://feeds.feedburner.com/~f/AlexAtNet?i=DvuAL" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
 <comments>http://www.alexatnet.com/node/180#comments</comments>
 <category domain="http://www.alexatnet.com/taxonomy/term/38">Google Chrome</category>
 <category domain="http://www.alexatnet.com/taxonomy/term/4">javascript</category>
 <enclosure url="http://www.alexatnet.com/files/chrome-js-debugger.png" length="44921" type="image/png" />
 <pubDate>Sat, 27 Sep 2008 16:33:37 +0000</pubDate>
 <dc:creator>Alex</dc:creator>
 <guid isPermaLink="false">180 at http://www.alexatnet.com</guid>
</item>
<item>
 <title>Small hint for PDT, use autocomplete in /* @var */type hint.</title>
 <link>http://www.alexatnet.com/node/179</link>
 <description>&lt;p&gt;@var variable type hint is very useful, but adding it a little bit complex: usually you need to type the class name or copy/paste it from somewhere:&lt;/p&gt;
&lt;p&gt;/* @var $controller Zend_Controller_Front */&lt;/p&gt;
&lt;p&gt;But with Eclipse PDT templates you can simplify this and add an autocomplete for variable name and class name:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.alexatnet.com/files/var-autocomplete-example_0.png" /&gt;&lt;br /&gt;
&amp;lt;!--break--&gt;&lt;br /&gt;
To add this template open Window menu, select Preferences and then navigate to PHP/Templates section in the tree. Then click "New..." button and fill the fields correspondingly:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.alexatnet.com/files/var-autocomplete-settings_0.png" /&gt;&lt;/p&gt;
&lt;p&gt;After that, in the code view type "var" and press Ctrl+Space. Select "var - Variable type hint" in the list and continue by selecting or typing variable name and class name as shown on the video below:&lt;/p&gt;
&lt;object width="425" height="350"&gt; &lt;param name="movie" value="http://www.youtube.com/v/60HG0KaRLMo" /&gt;  &lt;embed src="http://www.youtube.com/v/60HG0KaRLMo" type="application/x-shockwave-flash" width="425" height="350"&gt; &lt;/embed&gt; &lt;/object&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/AlexAtNet?a=TY5kL"&gt;&lt;img src="http://feeds.feedburner.com/~f/AlexAtNet?i=TY5kL" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AlexAtNet?a=a90wl"&gt;&lt;img src="http://feeds.feedburner.com/~f/AlexAtNet?i=a90wl" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AlexAtNet?a=eZZel"&gt;&lt;img src="http://feeds.feedburner.com/~f/AlexAtNet?i=eZZel" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AlexAtNet?a=lWoPL"&gt;&lt;img src="http://feeds.feedburner.com/~f/AlexAtNet?i=lWoPL" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
 <comments>http://www.alexatnet.com/node/179#comments</comments>
 <category domain="http://www.alexatnet.com/taxonomy/term/37">PDT</category>
 <category domain="http://www.alexatnet.com/taxonomy/term/6">PHP</category>
 <enclosure url="http://www.alexatnet.com/files/var-autocomplete-settings_0.png" length="11333" type="image/png" />
 <pubDate>Mon, 22 Sep 2008 21:33:34 +0000</pubDate>
 <dc:creator>Alex</dc:creator>
 <guid isPermaLink="false">179 at http://www.alexatnet.com</guid>
</item>
<item>
 <title>PHP IDE with autocomplete for class properties</title>
 <link>http://www.alexatnet.com/node/177</link>
 <description>&lt;p&gt;Happy dreams of PHP developers come true. Yesterday I received a letter from Eclipse PDT bugzilla with notification that &lt;a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=183352"&gt;my proposition&lt;/a&gt; about autocomplete for properties that submitted more than a year ago is &lt;a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=183352#c10"&gt;implemented in PDT 2.0  nightly builds&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.alexatnet.com/files/pdt-property-autocomplete.png" /&gt;&lt;br /&gt;
&amp;lt;!--break--&gt;&lt;br /&gt;
To test it you need to download Eclipse and several packages as described on &lt;a href="http://download.eclipse.org/tools/pdt/downloads/"&gt;PDT download&lt;/a&gt; page.&lt;/p&gt;
&lt;p&gt;Property description is not supported yet, e.g. the property description is not displayed in property autocomplete hint as you may see on the screenshot.&lt;/p&gt;
&lt;p&gt;Many thanks to the Eclipse, PDT and Zend teams for helping us in coding our cool ideas!&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/AlexAtNet?a=zDTCL"&gt;&lt;img src="http://feeds.feedburner.com/~f/AlexAtNet?i=zDTCL" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AlexAtNet?a=iofQl"&gt;&lt;img src="http://feeds.feedburner.com/~f/AlexAtNet?i=iofQl" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AlexAtNet?a=fXh0l"&gt;&lt;img src="http://feeds.feedburner.com/~f/AlexAtNet?i=fXh0l" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AlexAtNet?a=2sjjL"&gt;&lt;img src="http://feeds.feedburner.com/~f/AlexAtNet?i=2sjjL" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
 <comments>http://www.alexatnet.com/node/177#comments</comments>
 <category domain="http://www.alexatnet.com/taxonomy/term/6">PHP</category>
 <enclosure url="http://www.alexatnet.com/files/pdt-property-autocomplete.png" length="15723" type="image/png" />
 <pubDate>Sat, 13 Sep 2008 12:45:30 +0000</pubDate>
 <dc:creator>Alex</dc:creator>
 <guid isPermaLink="false">177 at http://www.alexatnet.com</guid>
</item>
<item>
 <title>JDK 6u10 silent install/uninstall</title>
 <link>http://www.alexatnet.com/node/176</link>
 <description>&lt;p&gt;From time to time Sun changes the way on how JDK can be installed silently, without user interaction. I've noticed that in the 6u10 update the silent install method is different from 6u7 so here is two command lines for installing and uninstalling JDK from command line:&lt;/p&gt;
&lt;p&gt;Install:&lt;br /&gt;
C:\&amp;gt; C:\jdk-6u10-rc-bin-b28-windows-amd64-21_jul_2008.exe /s /v/qn&lt;/p&gt;
&lt;p&gt;Install to specific folder and specify additional parameters:&lt;br /&gt;
C:\&amp;gt; C:\jdk-6u10-rc-bin-b28-windows-amd64-21_jul_2008.exe /s /v"/qn INSTALLDIR="""C:\path to folder\Java""" IEXPLORER=1 MOZILLA=1 REBOOT=Suppress ADDLOCAL=ALL"&lt;/p&gt;
&lt;p&gt;Uninstall:&lt;br /&gt;
C:\&amp;gt; msiexec.exe /qn /x {64A3A4F4-B792-11D6-A78A-00B0D0160100}&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/AlexAtNet?a=jiGkL"&gt;&lt;img src="http://feeds.feedburner.com/~f/AlexAtNet?i=jiGkL" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AlexAtNet?a=Dd9nl"&gt;&lt;img src="http://feeds.feedburner.com/~f/AlexAtNet?i=Dd9nl" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AlexAtNet?a=zm94l"&gt;&lt;img src="http://feeds.feedburner.com/~f/AlexAtNet?i=zm94l" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AlexAtNet?a=CWxFL"&gt;&lt;img src="http://feeds.feedburner.com/~f/AlexAtNet?i=CWxFL" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
 <comments>http://www.alexatnet.com/node/176#comments</comments>
 <category domain="http://www.alexatnet.com/taxonomy/term/16">java</category>
 <pubDate>Mon, 08 Sep 2008 09:33:29 +0000</pubDate>
 <dc:creator>Alex</dc:creator>
 <guid isPermaLink="false">176 at http://www.alexatnet.com</guid>
</item>
<item>
 <title>Help Andrii Nikitin’s son - MySQL support engineer asks for help</title>
 <link>http://www.alexatnet.com/node/169</link>
 <description>&lt;p&gt;Andrii Nikitin is one of the MySQL support engineers located in Ukraine has asked for help. His son Ivan, who is 2 1/2, is in need of a bone marrow transplant operation.&lt;/p&gt;
&lt;p&gt;More details:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.mysql.com/about/help-ivan.html"&gt;http://www.mysql.com/about/help-ivan.html&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://www.phpcult.com/blog/andrii-nikitis-son-needs-our-help/"&gt;http://www.phpcult.com/blog/andrii-nikitis-son-needs-our-help/&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://www.google.com/search?q=%22Andrii+Nikitin%22+Ivan+MySQL"&gt;http://www.google.com/search?q=%22Andrii+Nikitin%22+Ivan+MySQL&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Even the small amount can help.&lt;/p&gt;
&lt;p&gt;I've created the banner, maybe you can add and link to that page:&lt;br /&gt;
&lt;a href="http://www.mysql.com/about/help-ivan.html"&gt;http://www.mysql.com/about/help-ivan.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.mysql.com/about/help-ivan.html"&gt;&lt;img src="http://www.alexatnet.com/files/Andrii.Nikitin.donate.png" /&gt;&lt;/a&gt;&lt;br /&gt;
&amp;lt;!--break--&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/AlexAtNet?a=GEB11J"&gt;&lt;img src="http://feeds.feedburner.com/~f/AlexAtNet?i=GEB11J" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AlexAtNet?a=ByrxLj"&gt;&lt;img src="http://feeds.feedburner.com/~f/AlexAtNet?i=ByrxLj" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AlexAtNet?a=GOemKj"&gt;&lt;img src="http://feeds.feedburner.com/~f/AlexAtNet?i=GOemKj" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AlexAtNet?a=KJn45J"&gt;&lt;img src="http://feeds.feedburner.com/~f/AlexAtNet?i=KJn45J" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
 <comments>http://www.alexatnet.com/node/169#comments</comments>
 <enclosure url="http://www.alexatnet.com/files/Andrii.Nikitin.donate.png" length="9237" type="image/png" />
 <pubDate>Mon, 14 Jul 2008 21:04:40 +0000</pubDate>
 <dc:creator>Alex</dc:creator>
 <guid isPermaLink="false">169 at http://www.alexatnet.com</guid>
</item>
<item>
 <title>Example of Canvas 3D drawing in 2D context.</title>
 <link>http://www.alexatnet.com/node/168</link>
 <description>Just to make some fun at weekend: a nice animation that was created with CANVAS tag and JavaScript. Just view source to investigate how it is created. Will post a source with a little more details soon.
&lt;!--break--&gt;
&lt;script type="text/javascript"&gt;

var Icosahedron = function () {

	function createMatrix() {
		return [
			[0.0, 0.0, 0.0, 0.0],
			[0.0, 0.0, 0.0, 0.0],
			[0.0, 0.0, 0.0, 0.0],
			[0.0, 0.0, 0.0, 0.0]
		];
	}

	var fi = 0.0, psi = 0.0;

	var x0 = 0, y0 = 0, f = 0, turnX = 0, turnY = 0, turnZ = 0;

	var d = createMatrix(), t = createMatrix(), rx = createMatrix(), ry = createMatrix(), rz = createMatrix();

	// matrix with icosahedron vertices
	var matrix;

	// buffer for calculation
	var matrix2 = [
		[0.0, 0.0, 0.0, 0.0], //  0
		[0.0, 0.0, 0.0, 0.0], //  1
		[0.0, 0.0, 0.0, 0.0], //  2
		[0.0, 0.0, 0.0, 0.0], //  3
		[0.0, 0.0, 0.0, 0.0], //  4
		[0.0, 0.0, 0.0, 0.0], //  5
		[0.0, 0.0, 0.0, 0.0], //  6
		[0.0, 0.0, 0.0, 0.0], //  7
		[0.0, 0.0, 0.0, 0.0], //  8
		[0.0, 0.0, 0.0, 0.0], //  9
		[0.0, 0.0, 0.0, 0.0], // 10
		[0.0, 0.0, 0.0, 0.0]  // 11
	];

	// currently rendered side
	var side = [[0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0]];
	var sides;
	var a = 0.0, b = 0.0, c = 0.0, lambda = 0.0, mu = 0.0, teta = 0.0;
	var canvasWidth = 400;
	var canvasHeight = 400;


	/**
	 * Multiply matrix and someMartix, put result to matrix2 and swap pointers.
	 *
	 * @param someMatrix Matrix
	 * @return IcosMatrix
	 */
	function multiplyBy(someMatrix) {
		for (var i = 0; i &lt; 12; i++) {
			for (var j = 0; j &lt; 4; j++) {
				var value = 0.0;
				for (var p = 0; p &lt; 4; p++)
					value += + matrix[i][p] * someMatrix[p][j];
				matrix2[i][j] = value;
			}
		}
		var tmp = matrix;
		matrix = matrix2;
		matrix2 = tmp;
	}

	function setTransformationMatrixes() {

		var TrackBar1 = {Position : 2};
		var TrackBar2 = {Position : 2};
		var TrackBar3 = {Position : 2};

		var gamma = Math.PI * TrackBar3.Position / 180;
		var alpha = Math.PI * TrackBar1.Position / 180;
		var beta = Math.PI * TrackBar2.Position / 180;

		d = [
			[  a, 0.0, 0.0, 0.0],
			[0.0,   b, 0.0, 0.0],
			[0.0, 0.0,   c, 0.0],
			[0.0, 0.0, 0.0, 1.0]
		];

		t = [
			[     1, 0.0,  0.0, 0.0],
			[   0.0,   1,  0.0, 0.0],
			[   0.0, 0.0,    1, 0.0],
			[lambda,  mu, teta, 1.0]
		];

		rx = [
			[  1,              0.0,             0.0, 0.0],
			[0.0,  Math.cos(alpha), Math.sin(alpha), 0.0],
			[0.0, -Math.sin(alpha), Math.cos(alpha), 0.0],
			[0.0,              0.0,             0.0, 1.0]
		];

		ry = [
			[Math.cos(beta), 0.0, -Math.sin(beta), 0.0],
			[           0.0, 1.0,             0.0, 0.0],
			[Math.sin(beta), 0.0,  Math.cos(beta), 0.0],
			[           0.0, 0.0,             0.0, 1.0]
		];

		rz = [
			[ Math.cos(gamma), Math.sin(gamma), 0.0, 0.0],
			[-Math.sin(gamma), Math.cos(gamma), 0.0, 0.0],
			[             0.0,             0.0, 1.0, 0.0],
			[             0.0,             0.0, 0.0, 1.0]
		];
	}

	function defineMatrix() {

		setTransformationMatrixes();

		// icosahedron (http://en.wikipedia.org/wiki/Icosahedron)
		//
		//     11
		//  6 7 8 9 10
		// 1 2 3 4 5
		//     0          x
		//  z
		//     y
		//
		// top: (0; 0; 0)
		// bottom: (0; -5,71; 0)

		//   vertices
		matrix = [
			[  0.000,  0.000,  0.000, 1.000], //  0
			[  2.550, -1.580,  0.000, 1.000], //  1
			[  0.788, -1.580,  2.425, 1.000], //  2
			[ -2.060, -1.580,  1.500, 1.000], //  3
			[ -2.060, -1.580, -1.500, 1.000], //  4
			[  0.788, -1.580, -2.425, 1.000], //  5
			[  2.060, -4.130,  1.500, 1.000], //  6
			[ -0.788, -4.130,  2.425, 1.000], //  7
			[ -2.550, -4.130,  0.000, 1.000], //  8
			[ -0.788, -4.130, -2.425, 1.000], //  9
			[  2.060, -4.130, -1.500, 1.000], // 10
			[  0.000, -5.710,  0.000, 1.000]  // 11
		];
		// move on 2.855 y axis
		for (var i = 0; i &lt; 12; i++) {
			matrix[i][1] += 2.855;
		}

		//   faces, each face is defied by specifying three edges from 
		//     matrix table.
		sides = [
			[ 0,  1,  2], [ 0,  2,  3], [ 0,  3,  4], [ 0,  4,  5],
			[ 0,  5,  1], [10,  6,  1], [ 2,  1,  6], [ 2,  6,  7],
			[ 3,  2,  7], [ 3,  7,  8], [ 4,  3,  8], [ 4,  8,  9],
			[ 5,  4,  9], [10,  5,  9], [ 1,  5, 10], [11,  7,  6],
			[11,  6, 10], [11,  8,  7], [11,  9,  8], [11, 10,  9]
		];
	}

	/**
	 * @param side Side
	 * @parm ctx 2DCanvasContext
	 */
	function drawSide(ctx) {
		var multiplier = 40;
		var ix = 0, iy = 0, color = 0;
		var z = ((side[0][0] - side[1][0]) * (side[0][1] - side[2][1])
			- (side[0][1] - side[1][1]) * (side[0][0] - side[2][0]));
		if (z &lt;= 0) return;
		ctx.beginPath();
		ctx.fillStyle = 'rgb(1, ' + (Math.round(z*12) + 140) + ', 140)';
		ctx.moveTo(Math.round(side[2][0] * multiplier) + x0, Math.round(side[2][1] * multiplier) + y0);
		for (var i = 0; i &lt; 3; i++)
			ctx.lineTo(Math.round(side[i][0] * multiplier) + x0, Math.round(side[i][1] * multiplier + y0));
		ctx.fill();
	}

	defineMatrix();
	return {
		'rotateX' : function () { multiplyBy(rx); },
		'rotateY' : function () { multiplyBy(ry); },
		'rotateZ' : function () { multiplyBy(rz); },
		'draw' : function (ctx) {
			ctx.fillStyle = 'rgb(255, 255, 255)';
			ctx.fillRect(0, 0, canvasWidth, canvasHeight);

			x0 = Math.round(canvasWidth / 2);
			y0 = Math.round(canvasHeight / 2);

			// for each face
			for (var i = 0; i &lt; 20; i++) {
				// create side
				for (var j = 0; j &lt; 3; j++)
					side[j] = matrix[sides[i][j]];
				// and draw it
				drawSide(ctx);
			}
		}
	}
};

window.onload = function () {
	var canvas = document.getElementById('canvas');
	if (canvas.getContext) {
		var ctx = document.getElementById('canvas').getContext("2d");
		var icosahedron = new Icosahedron();
		setInterval(function () {
			icosahedron.rotateX();
			icosahedron.rotateY();
			icosahedron.rotateZ();
			icosahedron.draw(ctx);
		}, 35);
	} else {
		document.getElementById('canvas-container').innerHTML = 'You browser does not support CANVAS object.'
			+ ' Consider to download and instal FireFox browser and rediscover the Web.';
	}
};
&lt;/script&gt;
&lt;div id="canvas-container" style="width: 420px; height: 420px; margin: 3em auto 3em auto; border: 1px solid #dddddd; background-image: url('/files/Icosahedron.demo_.png');"&gt;
&lt;canvas id="canvas" width="400" height="400"&gt;&lt;/canvas&gt;
&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/AlexAtNet?a=0BIxQJ"&gt;&lt;img src="http://feeds.feedburner.com/~f/AlexAtNet?i=0BIxQJ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AlexAtNet?a=Ctbh8j"&gt;&lt;img src="http://feeds.feedburner.com/~f/AlexAtNet?i=Ctbh8j" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AlexAtNet?a=1StfFj"&gt;&lt;img src="http://feeds.feedburner.com/~f/AlexAtNet?i=1StfFj" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AlexAtNet?a=h6FxvJ"&gt;&lt;img src="http://feeds.feedburner.com/~f/AlexAtNet?i=h6FxvJ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
 <comments>http://www.alexatnet.com/node/168#comments</comments>
 <category domain="http://www.alexatnet.com/taxonomy/term/4">javascript</category>
 <enclosure url="http://www.alexatnet.com/files/Icosahedron.demo_.png" length="14834" type="image/png" />
 <pubDate>Sat, 12 Jul 2008 18:15:24 +0000</pubDate>
 <dc:creator>Alex</dc:creator>
 <guid isPermaLink="false">168 at http://www.alexatnet.com</guid>
</item>
<item>
 <title>JavaScript language - current state</title>
 <link>http://www.alexatnet.com/node/164</link>
 <description>&lt;p&gt;JavaScript is a trademark of Sun Microsystems and it was used for technology implemented by Netscape Communications and introduced in the Netscape Communicator Web browser in December 1995.&lt;/p&gt;
&lt;p&gt;The first JavaScript language specification, described in ECMA-262 standard, was adopted by the ECMA General Assembly of June 1997 and the “ECMAScript” name means this standard. There are three editions of this standard, known as ES1, ES2 and ES3, and fourth edition is currently under development. The fourth edition is known as JavaScript 2 or ES4 and it describes several very important language enhancements such as classes, packages and namespaces and other features that aid developers in their work. ES4 is expected to be finished by October 2008.&lt;/p&gt;
&lt;p&gt;The widely used JavaScript implementation that is closest to ES4 is ActionScript language, which is part of Adobe Flash platforms. In November 2006 Adobe donated 135,000 lines of code of its ActionScript Virtual Machine (AVM) to the Mozilla project. So, Mozilla FireFox 4 may be the first browser that will have ES4.&lt;/p&gt;
&lt;p&gt;Another known partial ES4 implementation is JScript.NET, but there is no information on when Microsoft add its support into browser.&lt;/p&gt;
&lt;p&gt;Safari and Opera support ES2 and ES3 and there is no official information on when they will support ES4.&lt;/p&gt;
&lt;p&gt;See also:&lt;br /&gt;
&lt;a href="http://en.wikipedia.org/wiki/JavaScript"&gt;http://en.wikipedia.org/wiki/JavaScript&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://en.wikipedia.org/wiki/Ecmascript"&gt;http://en.wikipedia.org/wiki/Ecmascript&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://en.wikipedia.org/wiki/ActionScript"&gt;http://en.wikipedia.org/wiki/ActionScript&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://en.wikipedia.org/wiki/Tamarin_(JIT)"&gt;http://en.wikipedia.org/wiki/Tamarin_(JIT)&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/AlexAtNet?a=Eu2XkI"&gt;&lt;img src="http://feeds.feedburner.com/~f/AlexAtNet?i=Eu2XkI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AlexAtNet?a=6IMUAi"&gt;&lt;img src="http://feeds.feedburner.com/~f/AlexAtNet?i=6IMUAi" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AlexAtNet?a=ntilQi"&gt;&lt;img src="http://feeds.feedburner.com/~f/AlexAtNet?i=ntilQi" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AlexAtNet?a=PTD79I"&gt;&lt;img src="http://feeds.feedburner.com/~f/AlexAtNet?i=PTD79I" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
 <comments>http://www.alexatnet.com/node/164#comments</comments>
 <category domain="http://www.alexatnet.com/taxonomy/term/4">javascript</category>
 <pubDate>Sun, 29 Jun 2008 00:42:06 +0000</pubDate>
 <dc:creator>Alex</dc:creator>
 <guid isPermaLink="false">164 at http://www.alexatnet.com</guid>
</item>
<item>
 <title>FireFox market share</title>
 <link>http://www.alexatnet.com/node/159</link>
 <description>&lt;p&gt;New release of FireFox have inspired a lot of FireFox-related news and predictions. While I'm quite sceptical about the prediction made by Shayne Tilley about &lt;a href="http://www.sitepoint.com/blogs/2008/06/19/internet-explorer-extinct-by-2013/"&gt;IE disappearing in 2013&lt;/a&gt; it is interesting to see how many Alex@Net visitors use IE and FireFox during last year. What I can say... Viva FireFox!&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.alexatnet.com/files/alexatnet.browsers.ie_.firefox.2008.png" /&gt;&lt;br /&gt;
&amp;lt;!--break--&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/AlexAtNet?a=cUFUII"&gt;&lt;img src="http://feeds.feedburner.com/~f/AlexAtNet?i=cUFUII" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AlexAtNet?a=qdiTWi"&gt;&lt;img src="http://feeds.feedburner.com/~f/AlexAtNet?i=qdiTWi" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AlexAtNet?a=1j6pGi"&gt;&lt;img src="http://feeds.feedburner.com/~f/AlexAtNet?i=1j6pGi" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AlexAtNet?a=gzTUGI"&gt;&lt;img src="http://feeds.feedburner.com/~f/AlexAtNet?i=gzTUGI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
 <comments>http://www.alexatnet.com/node/159#comments</comments>
 <category domain="http://www.alexatnet.com/taxonomy/term/32">FireFox</category>
 <enclosure url="http://www.alexatnet.com/files/alexatnet.browsers.ie_.firefox.2008.png" length="18073" type="image/png" />
 <pubDate>Thu, 19 Jun 2008 10:59:53 +0000</pubDate>
 <dc:creator>Alex</dc:creator>
 <guid isPermaLink="false">159 at http://www.alexatnet.com</guid>
</item>
<item>
 <title>FireFox 3 questions and answers</title>
 <link>http://www.alexatnet.com/node/156</link>
 <description>&lt;p&gt;FireFox 3 is great but there are a few minor issues that are frequently asked:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Where is FireBug?&lt;/li&gt;
&lt;li&gt;How to run different versions of FireFox in the same time?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Answers are below.&lt;/p&gt;
&lt;p&gt;1. Where is FireBug?&lt;/p&gt;
&lt;p&gt;FireBug was updated to the version 1.2, which is FireFox 3 compatible. Just delete old one and install this: &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/1843"&gt;Firebug 1.2.0b3&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;2. How to run different versions of FireFox in the same time?&lt;/p&gt;
&lt;p&gt;Install FireFox to the "C:\Program Files\Mozilla FireFox 3" folder and follow this article: &lt;a href="http://support.mozilla.com/en-US/kb/Running+different+versions+of+Firefox+at+the+same+time"&gt;Running different versions of Firefox at the same time&lt;/a&gt;.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/AlexAtNet?a=V0k0yI"&gt;&lt;img src="http://feeds.feedburner.com/~f/AlexAtNet?i=V0k0yI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AlexAtNet?a=08CJVi"&gt;&lt;img src="http://feeds.feedburner.com/~f/AlexAtNet?i=08CJVi" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AlexAtNet?a=cuK41i"&gt;&lt;img src="http://feeds.feedburner.com/~f/AlexAtNet?i=cuK41i" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AlexAtNet?a=AHla6I"&gt;&lt;img src="http://feeds.feedburner.com/~f/AlexAtNet?i=AHla6I" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
 <comments>http://www.alexatnet.com/node/156#comments</comments>
 <category domain="http://www.alexatnet.com/taxonomy/term/32">FireFox</category>
 <pubDate>Wed, 18 Jun 2008 21:54:27 +0000</pubDate>
 <dc:creator>Alex</dc:creator>
 <guid isPermaLink="false">156 at http://www.alexatnet.com</guid>
</item>
<item>
 <title>Cross-browser image rotation with JavaScript and CSS</title>
 <link>http://www.alexatnet.com/node/152</link>
 <description>&lt;p&gt;Here is a cross-browser implementation of image rotation. The code uses IE filters and Mozilla/Opera/Safari Canvas object:&lt;/p&gt;
&lt;p&gt;&amp;lt;!--break--&gt;&lt;/p&gt;
&lt;script type="text/javascript"&gt;

(function (element, event, handler) {
	if (element.addEventListener)
		element.addEventListener(event, handler, false);
	else if (element.attachEvent)
		element.attachEvent('on' + event, handler);
	else
		element['on' + event] = handler;
})(window, 'load', function () {
	document.img = (function (id, src, width, height) {
		var _element = document.getElementById(id);
		var _canvas = document.createElement('canvas');
		if (_canvas.getContext) {
			// Opera/Safari/FireFox code:
			_element.appendChild(_canvas);
			_canvas.setAttribute('width', width);
			_canvas.setAttribute('height', height);
			var _center = { 'x' : Math.round(width / 2), 'y' : Math.round(height / 2) };
			var _ctx = _canvas.getContext('2d');
			var _img = new Image();
			_img.onload = function () {
				_ctx.translate(_center.x, _center.y);
				_ctx.drawImage(_img, -1 * _center.x, -1 * _center.y);
			};
			_img.src = src;
			return {
				'rotateCW' : function () {
					_ctx.rotate(Math.PI/2);
					_ctx.drawImage(_img, -1 * _center.x, -1 * _center.y);
				},
				'rotateCCW' : function () {
					_ctx.rotate(-Math.PI/2);
					_ctx.drawImage(_img, -1 * _center.x, -1 * _center.y);
				}
			};
		}
		// IE code:
		var _rotation = 0;
		var _filter = 'progid:DXImageTransform.Microsoft.BasicImage(rotation={0})';
		_element.style.width = width + 'px';
		_element.style.height = height + 'px';
		_element.style.background = 'url(\'' + src + '\')';
		_element.style.backgroundPosition = 'center center';
		_element.style.backgroundRepeat = 'no-repeat';
		return {
			'rotateCW' : function () {
				_rotation = (_rotation + 1) % 4;
				_element.style.filter = _filter.replace('{0}', _rotation);
			},
			'rotateCCW' : function () {
				_rotation = (4 + _rotation - 1) % 4;
				_element.style.filter = _filter.replace('{0}', _rotation);
			}
		};
	})('image', '/files/n152.sample.png', 150, 150);
});
&lt;/script&gt;&lt;p&gt;&lt;button onclick="document.img.rotateCCW()" style="font-family: arial;"&gt;&amp;#8592;&lt;/button&gt;&amp;nbsp;&lt;br /&gt;
&lt;button onclick="document.img.rotateCW()" style="font-family: arial;"&gt;&amp;#8594;&lt;/button&gt;&lt;/p&gt;
&lt;div id="image" style="margin: 1em;"&gt;&lt;/div&gt;
&lt;p&gt;The source code:&lt;/p&gt;
&lt;pre&gt;
&amp;lt;script type="text/javascript"&amp;gt;

(function (element, event, handler) {
 if (element.addEventListener)
  element.addEventListener(event, handler, false);
 else if (element.attachEvent)
  element.attachEvent('on' + event, handler);
 else
  element['on' + event] = handler;
})(window, 'load', function () {
 document.img = (function (id, src, width, height) {
  var _element = document.getElementById(id);
  var _canvas = document.createElement('canvas');
  if (_canvas.getContext) {
   // Opera/Safari/FireFox code:
   _element.appendChild(_canvas);
   _canvas.setAttribute('width', width);
   _canvas.setAttribute('height', height);
   var _center = { 'x' : Math.round(width / 2), 'y' : Math.round(height / 2) };
   var _ctx = _canvas.getContext('2d');
   var _img = new Image();
   _img.onload = function () {
    _ctx.translate(_center.x, _center.y);
    _ctx.drawImage(_img, -1 * _center.x, -1 * _center.y);
   };
   _img.src = src;
   return {
    'rotateCW' : function () {
     _ctx.rotate(Math.PI/2);
     _ctx.drawImage(_img, -1 * _center.x, -1 * _center.y);
    },
    'rotateCCW' : function () {
     _ctx.rotate(-Math.PI/2);
     _ctx.drawImage(_img, -1 * _center.x, -1 * _center.y);
    }
   };
  }
  // IE code:
  var _rotation = 0;
  var _filter = 'progid:DXImageTransform.Microsoft.BasicImage(rotation={0})';
  _element.style.width = width + 'px';
  _element.style.height = height + 'px';
  _element.style.background = 'url(\'' + src + '\')';
  _element.style.backgroundPosition = 'center center';
  _element.style.backgroundRepeat = 'no-repeat';
  return {
   'rotateCW' : function () {
    _rotation = (_rotation + 1) % 4;
    _element.style.filter = _filter.replace('{0}', _rotation);
   },
   'rotateCCW' : function () {
    _rotation = (4 + _rotation - 1) % 4;
    _element.style.filter = _filter.replace('{0}', _rotation);
   }
  };
 })('image', '/files/n152.sample.png', 150, 150);
});
&amp;lt;/script&amp;gt;
&amp;lt;button onclick="document.img.rotateCCW()" style="font-family: arial;"&amp;gt;&amp;amp;#8592;&amp;lt;/button&amp;gt;&amp;amp;nbsp;
&amp;lt;button onclick="document.img.rotateCW()" style="font-family: arial;"&amp;gt;&amp;amp;#8594;&amp;lt;/button&amp;gt;
&amp;lt;div id="image" style="margin: 1em;"&amp;gt;&amp;lt;/div&amp;gt;
&lt;/pre&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/AlexAtNet?a=mhGKJI"&gt;&lt;img src="http://feeds.feedburner.com/~f/AlexAtNet?i=mhGKJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AlexAtNet?a=8ejGNi"&gt;&lt;img src="http://feeds.feedburner.com/~f/AlexAtNet?i=8ejGNi" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AlexAtNet?a=qys9ui"&gt;&lt;img src="http://feeds.feedburner.com/~f/AlexAtNet?i=qys9ui" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/AlexAtNet?a=UI20PI"&gt;&lt;img src="http://feeds.feedburner.com/~f/AlexAtNet?i=UI20PI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
 <comments>http://www.alexatnet.com/node/152#comments</comments>
 <category domain="http://www.alexatnet.com/taxonomy/term/36">CSS</category>
 <category domain="http://www.alexatnet.com/taxonomy/term/4">javascript</category>
 <enclosure url="http://www.alexatnet.com/files/n152.sample.png" length="33683" type="image/png" />
 <pubDate>Tue, 17 Jun 2008 08:59:27 +0000</pubDate>
 <dc:creator>Alex</dc:creator>
 <guid isPermaLink="false">152 at http://www.alexatnet.com</guid>
</item>
</channel>
</rss>
