<?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:thr="http://purl.org/syndication/thread/1.0" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;CU4FQn89cCp7ImA9WhRWFko.&quot;"><id>tag:blogger.com,1999:blog-7795849673717145049</id><updated>2012-01-04T11:45:13.168+01:00</updated><category term="ruby" /><category term="openid" /><category term="cvs" /><category term="ant" /><category term="minification" /><category term="continuous integration" /><category term="tools" /><category term="javascript" /><category term="tex" /><category term="java" /><category term="patterns" /><category term="aop" /><category term="maven" /><category term="knihy" /><category term="knuth" /><category term="django" /><category term="yui-compressor" /><category term="blog" /><category term="jsloader" /><category term="petition" /><category term="jquery" /><category term="diigo" /><category term="appengine" /><category term="git" /><category term="build" /><category term="python" /><category term="continuum" /><category term="optimization" /><category term="microsoft" /><category term="fun" /><category term="extjs" /><category term="yui-compressor-ant-task" /><category term="ohcount" /><category term="prototype" /><category term="google" /><category term="citaty" /><title type="text">java*Flight</title><subtitle type="html">What I think is worth writing about during my flight through the world of Java, J2EE and Javascript.</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://javaflight.blogspot.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://javaflight.blogspot.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/7795849673717145049/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>Viktor Lieskovsky</name><uri>http://www.blogger.com/profile/17533444030037615808</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://s3.amazonaws.com/twitter_production/profile_images/37693262/n0ha_normal.png" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>28</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/javaflight" /><feedburner:info uri="javaflight" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><geo:lat>48.150004</geo:lat><geo:long>17.147899</geo:long><entry gd:etag="W/&quot;DEEBR3o_eip7ImA9WxZaEkg.&quot;"><id>tag:blogger.com,1999:blog-7795849673717145049.post-4867129988472626160</id><published>2008-04-27T02:35:00.002+02:00</published><updated>2008-04-27T02:37:36.442+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-04-27T02:37:36.442+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="tex" /><category scheme="http://www.blogger.com/atom/ns#" term="citaty" /><category scheme="http://www.blogger.com/atom/ns#" term="knuth" /><title>Citat IV</title><content type="html">&lt;ul class="diigo-linkroll"&gt;&lt;br /&gt;    &lt;li&gt;&lt;p class="diigo-link"&gt;&lt;a href="http://tech.slashdot.org/article.pl?sid=08/04/26/1627248&amp;amp;from=rss"&gt;Slashdot | Donald Knuth Rips On Unit Tests and More&lt;/a&gt;&lt;span class="diigo-link-opts"&gt;&lt;br /&gt;&lt;br /&gt;    &lt;/span&gt;&lt;/p&gt;&lt;br /&gt;    &lt;div class="content"&gt;&amp;quot;The prize was not US$1000. it started out very small. Knuth did indeed pay out, and indeed doubled it, several times. From wikipedia: &amp;quot;The award per bug started at $2.56 (one &amp;quot;hexadecimal dollar&amp;quot;[24]) and doubled every year until it was frozen at its current value of $327.68. This has not made Knuth poor, however, as there have been very few bugs claimed. In addition, people have been known to frame a check proving they found a bug in TeX instead of cashing it.&amp;quot;&lt;/div&gt;&lt;br /&gt;    &lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7795849673717145049-4867129988472626160?l=javaflight.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/javaflight?a=ug32UPvHFnQ:i87zTZE5MYQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/javaflight?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/javaflight?a=ug32UPvHFnQ:i87zTZE5MYQ:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/javaflight?i=ug32UPvHFnQ:i87zTZE5MYQ:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/javaflight/~4/ug32UPvHFnQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://javaflight.blogspot.com/feeds/4867129988472626160/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=7795849673717145049&amp;postID=4867129988472626160" title="5 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7795849673717145049/posts/default/4867129988472626160?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7795849673717145049/posts/default/4867129988472626160?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/javaflight/~3/ug32UPvHFnQ/citat-iv.html" title="Citat IV" /><author><name>Viktor Lieskovsky</name><uri>http://www.blogger.com/profile/17533444030037615808</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://s3.amazonaws.com/twitter_production/profile_images/37693262/n0ha_normal.png" /></author><thr:total>5</thr:total><feedburner:origLink>http://javaflight.blogspot.com/2008/04/citat-iv.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DU8DRH87eip7ImA9WxZbFkU.&quot;"><id>tag:blogger.com,1999:blog-7795849673717145049.post-3395350627324743566</id><published>2008-04-20T08:57:00.005+02:00</published><updated>2008-04-20T12:37:55.102+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-04-20T12:37:55.102+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="javascript" /><category scheme="http://www.blogger.com/atom/ns#" term="blog" /><category scheme="http://www.blogger.com/atom/ns#" term="tools" /><category scheme="http://www.blogger.com/atom/ns#" term="jsloader" /><category scheme="http://www.blogger.com/atom/ns#" term="git" /><title>Blogspot customization and tools</title><content type="html">It has been more then 8 months, since I published my &lt;a hreflang="sk" href="http://javaflight.blogspot.com/2007/08/javascriptove-kusky.html"&gt;first post&lt;/a&gt; here. During that time, I've made some changes to how things work here on my blog, added some widgets, and changed layout. I want to summarize all of the changes, so anybody can replicate them on any other blogspot blog. In addition, I will publish my template to the open, as a source of examples.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;JavaScript&lt;/h4&gt;The first major hurdle to overcome is how to get JavaScript frameworks on your blog. You cannot just copy the files you need over to the server. There are several solutions:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;source the needed library from a CDN: 'big' JavaScript libraries like YUI are &lt;a href="http://developer.yahoo.com/yui/articles/hosting/"&gt;hosted on CDN&lt;/a&gt; networks, so you don't need them locally.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;use &lt;a hreflang="sk" href="http://javaflight.blogspot.com/2007/10/publikovanie-kdu-s-pomocou-google-code.html"&gt;JSLoader&lt;/a&gt;: dynamically download the needed libraries from &lt;a href="http://vps.jsloader.com/"&gt;JSLoader's web&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;h5&gt;Colored syntax&lt;/h5&gt;With JavaScript libraries on-board, we can add some functionality. One of the first things I needed was code syntax highlighting. I'm using &lt;a href="http://code.google.com/p/google-code-prettify/"&gt;google-code-prettify&lt;/a&gt;, and it works quite well. &lt;a hreflang="sk" href="http://javaflight.blogspot.com/2007/10/publikovanie-kdu-s-pomocou-google-code.html"&gt;Here&lt;/a&gt; is a brief description.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Widgets&lt;/h4&gt;&lt;h5&gt;Ohloh.net metrics&lt;/h5&gt;&lt;br /&gt;If you're a developer, or just a fan of some open-source project, great way to link to it is an ohloh widget. You can choose from a &lt;a href="http://www.ohloh.net/projects/11702/widgets"&gt;variety of options&lt;/a&gt;.&lt;h5&gt;Google Reader&lt;/h5&gt;Another nice addition if you use Google Reader, is a feed of your &lt;a href="http://www.google.com/support/reader/bin/answer.py?answer=69995&amp;topic=12017"&gt;shared links&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Tools&lt;/h4&gt;&lt;h5&gt;Google Analytics&lt;/h5&gt;A great &lt;a href="http://www.google.com/analytics/"&gt;free service to measure&lt;/a&gt; the number of visitors that read your blog, see the trends, or know the most used google keywords people used to get to your blog. Only one negative point: it uses Flash to render the graphs.&lt;br /&gt;&lt;h5&gt;Feedburner&lt;/h5&gt;Your RSS feed can be measured in much the same way as your site. Just burn the feed with &lt;a href="http://www.feedburner.com/"&gt;feedburner&lt;/a&gt;, and get lots of interesting stats on your RSS feed usage. In addition, you can use feedburner to show number of comments your post has, add ads, or embed amazon affiliate codes automatically.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Layout and styles&lt;/h4&gt;&lt;h5&gt;Wide layout&lt;/h5&gt;From the very start, I felt that the space for the posts is too narrow. I used to trim the code examples I was publishing in various ways, until I decided that the layout must be widened. I am not very good at CSS, so I just googled and applied a &lt;a href="http://stefans-place.blogspot.com/2007/01/blogger-thisaway-template-width-change.html"&gt;ready-made solution&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;h5&gt;Multi-language content&lt;/h5&gt;&lt;br /&gt;As I publish content in two languages, I wanted to distinguish links to Slovak and English content. Using standard hreflang attribute on links, and some CSS, it turned out to be quite easy. First, the anchor has to include the target page language:&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;/* include hreflang attribute */&lt;br /&gt;&amp;lt;a hreflang="en" href="http://www.google.com/"&amp;gt;Google&amp;lt;/a&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;And in the template, include this easy CSS fragment:&lt;br /&gt;&lt;pre class="prettyprint"&gt;/* include a url for a flag for every used language */&lt;br /&gt;[hreflang=en]:after { &lt;br /&gt;  content: URL(uk-flag.gif); &lt;br /&gt;  margin-left: 5px;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Detailed description can be found &lt;a href="http://jedisthlm.com/2005/04/06/language-ang-html/"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Template Source&lt;/h4&gt;As promised, here is my &lt;a href="http://github.com/n0ha/blogspot-template/tree/master"&gt;customized template&lt;/a&gt; on github. I will push further changes to this repository as well.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7795849673717145049-3395350627324743566?l=javaflight.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/javaflight?a=GGZDxZZbGLU:6IY8wsuORGA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/javaflight?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/javaflight?a=GGZDxZZbGLU:6IY8wsuORGA:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/javaflight?i=GGZDxZZbGLU:6IY8wsuORGA:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/javaflight/~4/GGZDxZZbGLU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://javaflight.blogspot.com/feeds/3395350627324743566/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=7795849673717145049&amp;postID=3395350627324743566" title="4 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7795849673717145049/posts/default/3395350627324743566?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7795849673717145049/posts/default/3395350627324743566?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/javaflight/~3/GGZDxZZbGLU/blogspot-customization-and-tools.html" title="Blogspot customization and tools" /><author><name>Viktor Lieskovsky</name><uri>http://www.blogger.com/profile/17533444030037615808</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://s3.amazonaws.com/twitter_production/profile_images/37693262/n0ha_normal.png" /></author><thr:total>4</thr:total><feedburner:origLink>http://javaflight.blogspot.com/2008/04/blogspot-customization-and-tools.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUcDSXw-cCp7ImA9WxZbEUo.&quot;"><id>tag:blogger.com,1999:blog-7795849673717145049.post-7248187861341172003</id><published>2008-04-14T12:51:00.006+02:00</published><updated>2008-04-14T14:44:38.258+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-04-14T14:44:38.258+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="fun" /><category scheme="http://www.blogger.com/atom/ns#" term="diigo" /><title>How to get really social</title><content type="html">I have decided to start sharing my bookmarks. I already share some of them via Google Reader, but there are other links I would like to share, not only from my RSS channels. I was recommended to try &lt;a href="http://www.diigo.com/"&gt;Diigo&lt;/a&gt;, and it looked quite good, so I created an account there.&lt;br /&gt;&lt;br /&gt;I was asked for all the usual stuff to set up my profile, and then, I was able to import my contacts from gmail to look whether somebody I know is already on Diigo. Success! Your 2 contacts are already on Diigo, click here to make them friends! I confirmed that, and then...I realized what have I done. I have 240 contacts in gmail, lots of them are nonexistent or old addresses, some of them are mailing lists, and there are also lots of people I don't know :) Diigo was sooo kind and helpful, and helped me to become really, really social, by letting all the contacts pre-checked, so it sent them my kind invitation to Join My Network. Not only those it could find already on Diigo, all of them :)&lt;br /&gt;&lt;br /&gt;Today, I already received about 40 emails, lots of them from various mailing-lists robots. Up until now, I have 4 people as friends on Diigo, who have registered only because of my invitation email. Two people I haven't heard from for years have sent me an "how do you do" email.&lt;br /&gt;&lt;br /&gt;Well, not a tragedy at all, it ended up quite nice, except for some conferences where people think I'm crazy, or a spamer, or both :) Thank you Diigo :)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Come Join My Network.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7795849673717145049-7248187861341172003?l=javaflight.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/javaflight?a=MZSNEBMr_ec:yr3RDK77ZMQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/javaflight?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/javaflight?a=MZSNEBMr_ec:yr3RDK77ZMQ:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/javaflight?i=MZSNEBMr_ec:yr3RDK77ZMQ:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/javaflight/~4/MZSNEBMr_ec" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://javaflight.blogspot.com/feeds/7248187861341172003/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=7795849673717145049&amp;postID=7248187861341172003" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7795849673717145049/posts/default/7248187861341172003?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7795849673717145049/posts/default/7248187861341172003?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/javaflight/~3/MZSNEBMr_ec/how-to-get-really-social.html" title="How to get really social" /><author><name>Viktor Lieskovsky</name><uri>http://www.blogger.com/profile/17533444030037615808</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://s3.amazonaws.com/twitter_production/profile_images/37693262/n0ha_normal.png" /></author><thr:total>0</thr:total><feedburner:origLink>http://javaflight.blogspot.com/2008/04/how-to-get-really-social.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0UDRX08fSp7ImA9WxRbGEQ.&quot;"><id>tag:blogger.com,1999:blog-7795849673717145049.post-1427781006133127945</id><published>2008-04-12T01:58:00.007+02:00</published><updated>2008-12-10T09:54:34.375+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-12-10T09:54:34.375+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="tools" /><category scheme="http://www.blogger.com/atom/ns#" term="django" /><category scheme="http://www.blogger.com/atom/ns#" term="python" /><category scheme="http://www.blogger.com/atom/ns#" term="google" /><category scheme="http://www.blogger.com/atom/ns#" term="appengine" /><title>Google AppEngine and the tutorial code</title><content type="html">Google has created yet another amazing service: &lt;a href="http://code.google.com/appengine/"&gt;Google App Engine&lt;/a&gt;. It's currently in a limited beta, so hurry up to &lt;a href="http://appengine.google.com/"&gt;get an invite&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;App Engine is a web application runtime built on Google's massive geo-distributed infrastructure. It's an application hosting service designed to help you with all the boring stuff you need to go through when preparing for a deployment of a web application: setting up the hardware boxes, setting up the servers, configuring the database, ensuring security, etc. It's goal is to ease the pain for the average developer to publish even the smallest of apps, without worrying how to scale when it's needed because of the app's popularity.&lt;br /&gt;&lt;br /&gt;The language of choice used to create web applications is &lt;a href="http://python.org/"&gt;Python&lt;/a&gt;, and you can use any Python web application framework compatible with the &lt;a href="http://www.python.org/dev/peps/pep-0333/"&gt;WSGI&lt;/a&gt; standard to construct your app. Nevertheless, Google also provides its own easy web framework, called simply 'webapp'. Webapp's data modeling interface is based on &lt;a href="http://www.djangoproject.com/"&gt;Django's&lt;/a&gt;, and the templating engine is right from Django, so that should make all the Djangoers out there quite happy, and also should make porting of Django apps to App Engine quite easy. I say 'should', because I haven't tried yet; all I tried was the nice and easy &lt;a href="http://code.google.com/appengine/docs/gettingstarted/"&gt;tutorial&lt;/a&gt; Google provides.&lt;br /&gt;&lt;br /&gt;The development of your application is done completely locally. You can download an &lt;a href="http://code.google.com/appengine/downloads.html"&gt;SDK&lt;/a&gt; that simulates all the services provided to your application by the real runtime, including authentication, data store, and web server, to help you to develop and test your application. It's actually very usable, and comfortable, just like most things in Python ;-)&lt;br /&gt;&lt;br /&gt;Also, there's another significant part of App Engine: the administration console provided to help you to monitor and administer deployed applications. Here's how it looks:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_MVu_-cF3bbE/SAAAK1Qxz5I/AAAAAAAAAJM/RqcgkIJz1jY/s1600-h/google-appengine-console.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_MVu_-cF3bbE/SAAAK1Qxz5I/AAAAAAAAAJM/RqcgkIJz1jY/s320/google-appengine-console.png" alt="" id="BLOGGER_PHOTO_ID_5188146956826955666" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;All in all, it's an interesting service, and it's going to be even more interesting as soon as other supported languages start to appear. I recommend taking a look at the &lt;a href="http://code.google.com/appengine/docs/"&gt;documentation&lt;/a&gt;. If you do, and you're lazy to go through the whole tutorial :), I have uploaded the resulting code to &lt;a href="http://github.com/n0ha/google-appengine-tutorial/tree/master"&gt;github&lt;/a&gt;. The application is deployed here: &lt;a href="http://my-private-playground.appspot.com/"&gt;http://my-private-playground.appspot.com/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7795849673717145049-1427781006133127945?l=javaflight.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/javaflight?a=k3m9LQLA8ko:JFtk_IQzgFQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/javaflight?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/javaflight?a=k3m9LQLA8ko:JFtk_IQzgFQ:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/javaflight?i=k3m9LQLA8ko:JFtk_IQzgFQ:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/javaflight/~4/k3m9LQLA8ko" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://javaflight.blogspot.com/feeds/1427781006133127945/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=7795849673717145049&amp;postID=1427781006133127945" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7795849673717145049/posts/default/1427781006133127945?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7795849673717145049/posts/default/1427781006133127945?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/javaflight/~3/k3m9LQLA8ko/google-appengine-and-tutorial-code.html" title="Google AppEngine and the tutorial code" /><author><name>Viktor Lieskovsky</name><uri>http://www.blogger.com/profile/17533444030037615808</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://s3.amazonaws.com/twitter_production/profile_images/37693262/n0ha_normal.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_MVu_-cF3bbE/SAAAK1Qxz5I/AAAAAAAAAJM/RqcgkIJz1jY/s72-c/google-appengine-console.png" height="72" width="72" /><thr:total>1</thr:total><feedburner:origLink>http://javaflight.blogspot.com/2008/04/google-appengine-and-tutorial-code.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUUHQH89fip7ImA9WxZWGUw.&quot;"><id>tag:blogger.com,1999:blog-7795849673717145049.post-4698903395107524987</id><published>2008-03-19T08:48:00.003+01:00</published><updated>2008-03-19T08:53:51.166+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-03-19T08:53:51.166+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="petition" /><title>Support Bruce Perens</title><content type="html">&lt;a href="http://en.wikipedia.org/wiki/Bruce_Perens"&gt;Bruce Perens&lt;/a&gt;, the legendary icon of Open Source and Free Software, and co-founder of &lt;a href="http://opensource.org/"&gt;OSI&lt;/a&gt;, is running for a membership in the &lt;a href="http://opensource.org/board"&gt;OSI board&lt;/a&gt;. You can support him by signing the &lt;a href="http://techp.org/p/7"&gt;petition&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7795849673717145049-4698903395107524987?l=javaflight.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/javaflight?a=nP-JAxvVGSM:fWD4ceFmNOo:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/javaflight?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/javaflight?a=nP-JAxvVGSM:fWD4ceFmNOo:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/javaflight?i=nP-JAxvVGSM:fWD4ceFmNOo:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/javaflight/~4/nP-JAxvVGSM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://javaflight.blogspot.com/feeds/4698903395107524987/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=7795849673717145049&amp;postID=4698903395107524987" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7795849673717145049/posts/default/4698903395107524987?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7795849673717145049/posts/default/4698903395107524987?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/javaflight/~3/nP-JAxvVGSM/support-bruce-perens.html" title="Support Bruce Perens" /><author><name>Viktor Lieskovsky</name><uri>http://www.blogger.com/profile/17533444030037615808</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://s3.amazonaws.com/twitter_production/profile_images/37693262/n0ha_normal.png" /></author><thr:total>0</thr:total><feedburner:origLink>http://javaflight.blogspot.com/2008/03/support-bruce-perens.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkYNSHk4cCp7ImA9WxZRFUo.&quot;"><id>tag:blogger.com,1999:blog-7795849673717145049.post-8126680916477580737</id><published>2008-02-09T14:36:00.000+01:00</published><updated>2008-02-09T16:16:39.738+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-02-09T16:16:39.738+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="ruby" /><category scheme="http://www.blogger.com/atom/ns#" term="tools" /><category scheme="http://www.blogger.com/atom/ns#" term="ohcount" /><category scheme="http://www.blogger.com/atom/ns#" term="yui-compressor-ant-task" /><title>Ohcount released as open-source</title><content type="html">&lt;a href="http://www.ohloh.net/"&gt;Ohloh.net&lt;/a&gt;, great site with statistics on open-source projects, &lt;a href="http://www.ohloh.net/pages/101"&gt;released&lt;/a&gt; the ohcount tool as open-source. Ohcount is a ruby script with C++ extensions, capable of recognizing and counting the number of lines of code in your project. Its usage and installation are pretty easy: &lt;a href="http://labs.ohloh.net/ohcount/wiki/"&gt;take a peek here&lt;/a&gt;, and you can start playing with it on your own. Here is an example of stats produced by ohcount for my &lt;a href="http://javaflight.blogspot.com/2008/01/introducing-yui-compressor-ant-task.html"&gt;yui-compressor-ant-task&lt;/a&gt; mini project:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;n0ha@n0ha:~$ ohcount ~/code/javaflight-code/yui-compressor-ant-task/&lt;br /&gt;Examining 35 file(s)&lt;br /&gt;                          Ohloh Line Count Summary&lt;br /&gt;&lt;br /&gt;Language        Files       Code    Comment  Comment %      Blank      Total&lt;br /&gt;--------------  -----  ---------  ---------  ---------  ---------  ---------&lt;br /&gt;html               18       3080        115       3.6%        426       3621&lt;br /&gt;java                3        224         85      27.5%         65        374&lt;br /&gt;javascript         15        205         28      12.0%          0        233&lt;br /&gt;xml                 1         56          0       0.0%          8         64&lt;br /&gt;css                 1         14          7      33.3%          8         29&lt;br /&gt;--------------  -----  ---------  ---------  ---------  ---------  ---------&lt;br /&gt;Total              23       3579        235       6.2%        507       4321&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Looks like I've got more of an html project than a Java project :) The html numbers are of course the generated Javadocs.&lt;br /&gt;&lt;br /&gt;Ohcount recognizes languages by file extensions. For every language it recognizes, it knows how to distinguish between code and comments. That can be a useful statistics, especially for large projects.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7795849673717145049-8126680916477580737?l=javaflight.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/javaflight?a=S_Yp1m4LUEc:L2NHcGkNa-g:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/javaflight?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/javaflight?a=S_Yp1m4LUEc:L2NHcGkNa-g:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/javaflight?i=S_Yp1m4LUEc:L2NHcGkNa-g:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/javaflight/~4/S_Yp1m4LUEc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://javaflight.blogspot.com/feeds/8126680916477580737/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=7795849673717145049&amp;postID=8126680916477580737" title="11 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7795849673717145049/posts/default/8126680916477580737?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7795849673717145049/posts/default/8126680916477580737?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/javaflight/~3/S_Yp1m4LUEc/ohcount-released-as-open-source.html" title="Ohcount released as open-source" /><author><name>Viktor Lieskovsky</name><uri>http://www.blogger.com/profile/17533444030037615808</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://s3.amazonaws.com/twitter_production/profile_images/37693262/n0ha_normal.png" /></author><thr:total>11</thr:total><feedburner:origLink>http://javaflight.blogspot.com/2008/02/ohcount-released-as-open-source.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0IEQXc8eip7ImA9WxZbEUo.&quot;"><id>tag:blogger.com,1999:blog-7795849673717145049.post-7078302991268806442</id><published>2008-02-03T16:55:00.001+01:00</published><updated>2008-04-14T13:11:40.972+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-04-14T13:11:40.972+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="javascript" /><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="fun" /><title>Java vs JavaScript</title><content type="html">Funny insight from &lt;a href="http://almaer.com/blog/rotating-java-and-javascript-on-the-server"&gt;Dion Almaer&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7795849673717145049-7078302991268806442?l=javaflight.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/javaflight?a=c93i4fjHGkU:wZiezk53Tvs:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/javaflight?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/javaflight?a=c93i4fjHGkU:wZiezk53Tvs:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/javaflight?i=c93i4fjHGkU:wZiezk53Tvs:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/javaflight/~4/c93i4fjHGkU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://javaflight.blogspot.com/feeds/7078302991268806442/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=7795849673717145049&amp;postID=7078302991268806442" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7795849673717145049/posts/default/7078302991268806442?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7795849673717145049/posts/default/7078302991268806442?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/javaflight/~3/c93i4fjHGkU/java-vs-javascript.html" title="Java vs JavaScript" /><author><name>Viktor Lieskovsky</name><uri>http://www.blogger.com/profile/17533444030037615808</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://s3.amazonaws.com/twitter_production/profile_images/37693262/n0ha_normal.png" /></author><thr:total>3</thr:total><feedburner:origLink>http://javaflight.blogspot.com/2008/02/java-vs-javascript.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEQNRX4yeCp7ImA9WxZSFkg.&quot;"><id>tag:blogger.com,1999:blog-7795849673717145049.post-7545984251247799530</id><published>2008-01-29T18:40:00.000+01:00</published><updated>2008-01-30T02:26:34.090+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-01-30T02:26:34.090+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="tools" /><category scheme="http://www.blogger.com/atom/ns#" term="python" /><category scheme="http://www.blogger.com/atom/ns#" term="cvs" /><title>Better 'cvs status'</title><content type="html">A friend of mine was complaining that the output given by 'cvs status' command is not human-readable, because it shows also files that were not modified. Given a project with thousands of files, it really is not helpful at all.&lt;br /&gt;&lt;br /&gt;I have created a little python script to parse the output of 'cvs status' and show only out-of-sync files in a CVS working dir. I may have probably missed some cvs status parameter to do just this, but hacking on this little script was much more fun then reading the CVS man page :)&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;How to use it&lt;/h4&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Get the script via &lt;a href="http://javaflight-code.googlecode.com/svn/trunk/cvs-status/cvs-status.py"&gt;HTTP&lt;/a&gt; or &lt;a href="http://code.google.com/p/javaflight-code/source"&gt;SVN&lt;/a&gt; and put it somewhere in PATH&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Make the script executable: &lt;span style="font-weight: bold;font-family:courier new;" &gt;# chmod u+x cvs-status.py&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Go to a CVS working dir &lt;span style="font-family: courier new; font-weight: bold;"&gt;# cd ~/code&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Make sure you are logged in to CVS: &lt;span style="font-weight: bold;font-family:courier new;" &gt;# cvs login&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Run it: &lt;span style="font-weight: bold;"&gt;# cvs-status.py&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;Here is some example output (with shortened lines):&lt;pre&gt;&lt;br /&gt;user@one ~/code&lt;br /&gt;$ cvs-status.py&lt;br /&gt;File: .cvsignore     Status: Locally Modified&lt;br /&gt;File: .project       Status: Locally Modified&lt;br /&gt;File: main.html      Status: Needs Patch&lt;br /&gt;&lt;br /&gt;There are 3 out-of-sync files in your working tree.&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Enjoy.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7795849673717145049-7545984251247799530?l=javaflight.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/javaflight?a=sOFOU5_DUCs:Cq4-b527uR4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/javaflight?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/javaflight?a=sOFOU5_DUCs:Cq4-b527uR4:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/javaflight?i=sOFOU5_DUCs:Cq4-b527uR4:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/javaflight/~4/sOFOU5_DUCs" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://javaflight.blogspot.com/feeds/7545984251247799530/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=7795849673717145049&amp;postID=7545984251247799530" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7795849673717145049/posts/default/7545984251247799530?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7795849673717145049/posts/default/7545984251247799530?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/javaflight/~3/sOFOU5_DUCs/better-cvs-status.html" title="Better 'cvs status'" /><author><name>Viktor Lieskovsky</name><uri>http://www.blogger.com/profile/17533444030037615808</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://s3.amazonaws.com/twitter_production/profile_images/37693262/n0ha_normal.png" /></author><thr:total>0</thr:total><feedburner:origLink>http://javaflight.blogspot.com/2008/01/better-cvs-status.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A04CRH0zcSp7ImA9WxVaEUo.&quot;"><id>tag:blogger.com,1999:blog-7795849673717145049.post-4322610945160273212</id><published>2008-01-26T10:40:00.002+01:00</published><updated>2009-04-08T10:39:25.389+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-04-08T10:39:25.389+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="javascript" /><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="tools" /><category scheme="http://www.blogger.com/atom/ns#" term="minification" /><category scheme="http://www.blogger.com/atom/ns#" term="ant" /><category scheme="http://www.blogger.com/atom/ns#" term="yui-compressor-ant-task" /><category scheme="http://www.blogger.com/atom/ns#" term="yui-compressor" /><title>Introducing YUI-Compressor Ant task</title><content type="html">&lt;span style="font-weight:bold;"&gt;UPDATE April 08, 2009: There's a new version of the ant task: yui-compressor-ant-task-0.4, thanks to &lt;a href="http://github.com/brianjriddle"&gt;Brian Riddle&lt;/a&gt;, available here: &lt;a href="http://code.google.com/p/javaflight-code/downloads/list"&gt;http://code.google.com/p/javaflight-code/downloads/list&lt;/a&gt;. It will work correctly with YUI-Compressor 2.4.2&lt;br /&gt;&lt;br /&gt;Also, the source code is now primarily hosted on GitHub &lt;a href="http://github.com/n0ha/yui-compressor-ant-task/tree/master"&gt;(link to source)&lt;/a&gt;, the SVN version on Google Code is now obsolete and will be deleted very soon.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;UPDATE February 13, 2009: There's a new version of the ant task available here: &lt;a href="http://code.google.com/p/javaflight-code/downloads/list"&gt;http://code.google.com/p/javaflight-code/downloads/list&lt;/a&gt;. It will work correctly with YUI-Compressor 2.3.5&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Slovenská verzia tohoto článku &lt;a href="http://javaflight.blogspot.com/2008/01/predstavenie-yui-compressor-ant-task.html"&gt;je tu&lt;/a&gt;.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://developer.yahoo.com/yui/compressor/"&gt;YUI-Compressor&lt;/a&gt; is a JavaScript code minification tool. Minification is a process of removing all unneeded whitespace characters, while preserving the meaning of the code for a browser (or other JS interpreter). In this way, up to 40 percent of bandwidth can be saved. It could appear, that in the time of broadband connections, it is useless to save the bandwidth, but it is not ;-) The size of web 2.0 frameworks can rise to hundreds of kB's, or even more.&lt;br /&gt;&lt;br /&gt;In order to use minification in ant builds, I have created an &lt;a href="http://code.google.com/p/javaflight-code/"&gt;ant task for YUI-Compressor&lt;/a&gt;. I had used it on a project I was working on, and up until now, everything seems to work normal ;-)&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Installation&lt;/h4&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;You will need YUI-Compressor: from &lt;a href="http://javaflight-code.googlecode.com/svn/trunk/yui-compressor-ant-task/lib/"&gt;my project&lt;/a&gt;, or &lt;a href="http://www.julienlecomte.net/yuicompressor/yuicompressor-2.1.2.zip"&gt;directly from the source&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;You will need the ant task jar: version &lt;a href="http://javaflight-code.googlecode.com/files/yui-compressor-ant-task-0.2-alpha1.jar"&gt;0.2-alpha1&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Finally, all those jars need to be put to a directory reachable from ant&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;h4&gt;Buildfile usage&lt;/h4&gt;First, we need to set the paths and classpath:&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;/* ${libs} is path to the downloaded jars */&lt;br /&gt;&amp;lt;property &lt;br /&gt;    name="yui-compressor.jar" &lt;br /&gt;    location="${libs}/yuicompressor-2.1.2.jar" /&amp;gt;&lt;br /&gt;&amp;lt;property &lt;br /&gt;    name="yui-compressor-ant-task.jar" &lt;br /&gt;    location="${libs}/yui-compressor-ant-task-0.2-alpha1.jar" /&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;path id="task.classpath"&amp;gt;&lt;br /&gt;  &amp;lt;pathelement location="${yui-compressor.jar}" /&amp;gt;&lt;br /&gt;  &amp;lt;pathelement location="${yui-compressor-ant-task.jar}" /&amp;gt;&lt;br /&gt;&amp;lt;/path&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Define a new task:&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;/* yui-compressor task definition */&lt;br /&gt;&amp;lt;taskdef &lt;br /&gt;    name="yui-compressor" &lt;br /&gt;    classname="net.noha.tools.ant.yuicompressor.tasks.YuiCompressorTask"&amp;gt;&lt;br /&gt;  &lt;br /&gt;  &amp;lt;classpath refid="task.classpath"&amp;gt;&lt;br /&gt;&amp;lt;/taskdef&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Concatenate all the JS files to one, before the minification (optional):&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;/* concatenation */&lt;br /&gt;&amp;lt;echo message="Building ${my-ajax-lib.file}" /&amp;gt;&lt;br /&gt;&amp;lt;concat destfile="${my-ajax-lib.file}" force="no"&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;!-- Order in which these files are concatenated _IS_ IMPORTANT! --&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;!-- AJAX related tools --&amp;gt;&lt;br /&gt;  &amp;lt;fileset dir="${src.dir}" includes="**/ajax/utils.js" /&amp;gt;&lt;br /&gt;  &amp;lt;fileset dir="${src.dir}" includes="**/ajax/request.js" /&amp;gt;&lt;br /&gt;&amp;lt;/concat&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;And finally, invoke the yui-compressor:&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;/* invoke compressor */&lt;br /&gt;&amp;lt;yui-compressor &lt;br /&gt;    warn="false" &lt;br /&gt;    munge="true" &lt;br /&gt;    suffix=".js" &lt;br /&gt;    preserveallsemicolons="false" &lt;br /&gt;    fromdir="${output.build.dir}" &lt;br /&gt;    todir="${output.dist.dir}"&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;include name="${my-ajax-lib.file}" /&amp;gt;&lt;br /&gt;&amp;lt;/yui-compressor&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Future&lt;/h4&gt;YUI-Compressor is capable of CSS file minification as well. This functionality is already included in the 0.2-alpha1, but it will need some more love. After finishing this part, I will try to write a bit of documentation, a tutorial, and some examples.&lt;br /&gt;&lt;br /&gt;All the code is released under an open license, so feel free to hack on it. I will be happy to get any help with this.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7795849673717145049-4322610945160273212?l=javaflight.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/javaflight?a=cYBNnhijm4c:gID_3VIQnkc:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/javaflight?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/javaflight?a=cYBNnhijm4c:gID_3VIQnkc:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/javaflight?i=cYBNnhijm4c:gID_3VIQnkc:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/javaflight/~4/cYBNnhijm4c" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://javaflight.blogspot.com/feeds/4322610945160273212/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=7795849673717145049&amp;postID=4322610945160273212" title="27 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7795849673717145049/posts/default/4322610945160273212?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7795849673717145049/posts/default/4322610945160273212?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/javaflight/~3/cYBNnhijm4c/introducing-yui-compressor-ant-task.html" title="Introducing YUI-Compressor Ant task" /><author><name>Viktor Lieskovsky</name><uri>http://www.blogger.com/profile/17533444030037615808</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://s3.amazonaws.com/twitter_production/profile_images/37693262/n0ha_normal.png" /></author><thr:total>27</thr:total><feedburner:origLink>http://javaflight.blogspot.com/2008/01/introducing-yui-compressor-ant-task.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkcMSHw5fip7ImA9WxZbFkU.&quot;"><id>tag:blogger.com,1999:blog-7795849673717145049.post-3706821370419865490</id><published>2008-01-26T10:06:00.001+01:00</published><updated>2008-04-20T11:34:49.226+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-04-20T11:34:49.226+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="javascript" /><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="tools" /><category scheme="http://www.blogger.com/atom/ns#" term="minification" /><category scheme="http://www.blogger.com/atom/ns#" term="ant" /><category scheme="http://www.blogger.com/atom/ns#" term="yui-compressor-ant-task" /><category scheme="http://www.blogger.com/atom/ns#" term="yui-compressor" /><title>Predstavenie YUI-Compressor Ant task</title><content type="html">&lt;span style="font-style:italic;"&gt;English version of this post can be found &lt;a href="http://javaflight.blogspot.com/2008/01/introducing-yui-compressor-ant-task.html"&gt;here&lt;/a&gt;.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a hreflang="en" href="http://developer.yahoo.com/yui/compressor/"&gt;YUI-Compressor&lt;/a&gt; je nástroj na minifikovanie JavaScriptového kódu. Minifikácia je proces, pri ktorom sa z JS odstránia všetky nepotrebné biele znaky, pri čom význam kódu pre browser (alebo iný interpreter) zostane rovnaký. Takýmto spôsobom sa dá ušetriť veľa prenášaných dát, často okolo 40 a viac percent. Mohlo by sa zdať že pri dnešných broadband pripojeniach je zbytočné šetriť prenášané dáta, ale nie je :-) Veľkosť web 2.0 JS frameworkov sa už počíta v stovkách kB, často i v MB.&lt;br /&gt;&lt;br /&gt;Pre jednoduchšie použitie v antovských buildoch som napísal &lt;a href="http://code.google.com/p/javaflight-code/"&gt;antovský task&lt;/a&gt;. Úspešne som ho využil v jednom projekte na ktorom som pracoval, a zatiaľ všetko funguje v poriadku ;-)&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Inštalácia&lt;/h4&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Potrebujete YUI-Compressor: z &lt;a href="http://javaflight-code.googlecode.com/svn/trunk/yui-compressor-ant-task/lib/"&gt;môjho projektu&lt;/a&gt;, alebo &lt;a href="http://www.julienlecomte.net/yuicompressor/yuicompressor-2.1.2.zip"&gt;priamo od zdroja&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Potrebujete ant task jar: verzia &lt;a href="http://javaflight-code.googlecode.com/files/yui-compressor-ant-task-0.2-alpha1.jar"&gt;0.2-alpha1&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Nakoniec treba umiestniť všetky jarka niekam, odkiaľ budú prístupné antu&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;h4&gt;Použitie v buildfile&lt;/h4&gt;Najprv treba nastaviť cesty a classpath:&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;/* ${libs} je cesta ku vsetkym stiahnutym jarkam */&lt;br /&gt;&amp;lt;property &lt;br /&gt;    name="yui-compressor.jar" &lt;br /&gt;    location="${libs}/yuicompressor-2.1.2.jar" /&amp;gt;&lt;br /&gt;&amp;lt;property &lt;br /&gt;    name="yui-compressor-ant-task.jar" &lt;br /&gt;    location="${libs}/yui-compressor-ant-task-0.2-alpha1.jar" /&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;path id="task.classpath"&amp;gt;&lt;br /&gt;  &amp;lt;pathelement location="${yui-compressor.jar}" /&amp;gt;&lt;br /&gt;  &amp;lt;pathelement location="${yui-compressor-ant-task.jar}" /&amp;gt;&lt;br /&gt;&amp;lt;/path&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Definovať nový task:&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;/* definovanie noveho tasku */&lt;br /&gt;&amp;lt;taskdef &lt;br /&gt;    name="yui-compressor" &lt;br /&gt;    classname="net.noha.tools.ant.yuicompressor.tasks.YuiCompressorTask"&amp;gt;&lt;br /&gt;  &lt;br /&gt;  &amp;lt;classpath refid="task.classpath"&amp;gt;&lt;br /&gt;&amp;lt;/taskdef&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Pred minifikáciou zbaliť všetky JS súbory do jedného (optional):&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;/* concatenation */&lt;br /&gt;&amp;lt;echo message="Building ${my-ajax-lib.file}" /&amp;gt;&lt;br /&gt;&amp;lt;concat destfile="${my-ajax-lib.file}" force="no"&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;!-- Order in which these files are concatenated _IS_ IMPORTANT! --&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;!-- AJAX related tools --&amp;gt;&lt;br /&gt;  &amp;lt;fileset dir="${src.dir}" includes="**/ajax/utils.js" /&amp;gt;&lt;br /&gt;  &amp;lt;fileset dir="${src.dir}" includes="**/ajax/request.js" /&amp;gt;&lt;br /&gt;&amp;lt;/concat&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;A nakoniec zavolať compressor:&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;/* volanie compressora */&lt;br /&gt;&amp;lt;yui-compressor &lt;br /&gt;    warn="false" &lt;br /&gt;    munge="true" &lt;br /&gt;    suffix=".js" &lt;br /&gt;    preserveallsemicolons="false" &lt;br /&gt;    fromdir="${output.build.dir}" &lt;br /&gt;    todir="${output.dist.dir}"&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;include name="${my-ajax-lib.file}" /&amp;gt;&lt;br /&gt;&amp;lt;/yui-compressor&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Budúcnosť&lt;/h4&gt;YUI-Compressor dokáže minifikovať aj CSS súbory. Táto funkcionalita je už vo verzii 0.2-alpha1 tiež zahrnutá, chce to ale ešte trochu doladiť. Po dokončení tejto funkcionality by som rád napísal trochu dokumentácie, nejaký tutoriál a zopár príkladov.&lt;br /&gt;&lt;br /&gt;Všetok kód je pod otvorenou licenciou na googlecode, takže vám nič nebráni začať hackovať a vylepšovať ho, veľmi rád prijmem akúkoľvek pomoc.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7795849673717145049-3706821370419865490?l=javaflight.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/javaflight?a=fXWgfqOFibY:i-Z5aJMa7JQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/javaflight?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/javaflight?a=fXWgfqOFibY:i-Z5aJMa7JQ:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/javaflight?i=fXWgfqOFibY:i-Z5aJMa7JQ:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/javaflight/~4/fXWgfqOFibY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://javaflight.blogspot.com/feeds/3706821370419865490/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=7795849673717145049&amp;postID=3706821370419865490" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7795849673717145049/posts/default/3706821370419865490?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7795849673717145049/posts/default/3706821370419865490?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/javaflight/~3/fXWgfqOFibY/predstavenie-yui-compressor-ant-task.html" title="Predstavenie YUI-Compressor Ant task" /><author><name>Viktor Lieskovsky</name><uri>http://www.blogger.com/profile/17533444030037615808</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://s3.amazonaws.com/twitter_production/profile_images/37693262/n0ha_normal.png" /></author><thr:total>0</thr:total><feedburner:origLink>http://javaflight.blogspot.com/2008/01/predstavenie-yui-compressor-ant-task.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0UDRXg-fyp7ImA9WxRbGEQ.&quot;"><id>tag:blogger.com,1999:blog-7795849673717145049.post-3508207161294911879</id><published>2008-01-21T23:29:00.001+01:00</published><updated>2008-12-10T09:54:34.657+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-12-10T09:54:34.657+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="openid" /><title>OpenID a Blogger.com</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_MVu_-cF3bbE/R5UixJ2J4VI/AAAAAAAAAHk/1_uHZAOa2UQ/s1600-h/openid-logo-square.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://1.bp.blogspot.com/_MVu_-cF3bbE/R5UixJ2J4VI/AAAAAAAAAHk/1_uHZAOa2UQ/s320/openid-logo-square.png" alt="" id="BLOGGER_PHOTO_ID_5158067176074764626" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Blogger.com je od minulého týždňa &lt;a href="http://openid.net/"&gt;OpenID&lt;/a&gt; identity provider. Čo to znamená? Podľa &lt;a href="http://bloggerindraft.blogspot.com/2008/01/new-feature-blogger-as-openid-provider.html"&gt;tohoto krátkeho návodu&lt;/a&gt; môžete začat používať svoju *.blogspot.com doménu ako svoju OpenID identitu.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Tradičný spôsob prihlasovania&lt;/h4&gt;OpenID mení tradičný spôsob prihlasovania na web. Doterajší systém je priamočiary: na webe kde sa chcete prihlásiť vyplníte formulár, kde zadáte svoje meno a heslo ktoré ste si predtým zaregistrovali. Na každom webe kde ste zaregistrovaný máte meno a heslo, ktoré nijak nesúvisí s ostatnými webmi kde ste zaregistrovaný. Vaša online identita je tak roztrúsená po desiatkach rôznych webov, a vy (alebo váš browser) si musíte pamätať všetky kombinácie web -- prihlasovacie údaje.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;"The OpenID Way"&lt;/h4&gt;Pri OpenID je prihlasovanie na web ktorý podporuje OpenID identitu odlišné. Na takomto webe, nazvime si ho 'dôverujúca strana' (relying party) nájdete formulár, kde napíšete URL svojej OpenID identity. Moja je javaflight.blogspot.com. Web na ktorý sa prihlasujete môže vašu identitu overiť dvoma spôsobmi, závisí to len na miere podpory OpenID špecifikácií. Opíšem tu len ten jednoduchší spôsob: &lt;span style="font-family:courier new;"&gt;checkid_setup&lt;/span&gt;. Po zadaní OpenID identity URL vás dôverujúci web presmeruje na prihlasovací formulár vášho OpenID poskytovateľa (v mojom pripade Blogger.com) kde normálnym spôsobom vyplníte svoje meno a heslo, ktoré máte u vášho poskytovateľa zaregistrované (v mojom prípade.... snáď tu nečakáte moje naozajstné heslo ;-) ). Váš OpenID provider sa vás potom opýta, či dôverujete webu kde sa chcete prihlásiť, teda dôverujúcej strane, tej na ktorej ste zadali svoje OpenID URL, a či chcete overiť svoju identitu. Ak áno, ste presmerovaný naspäť na web dôverujúcej strany a ste prihlásený. Celkom milé. Treba si pamätať len jedno meno a heslo, a svoje OpenID identity URL.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Vlastná doména ako OpenID identity URL: Delegovanie&lt;/h4&gt;Na to aby ste používali vlastnú doménu ako svoje OpenID URL stačí veľmi málo, delegovať autentikáciu z vášho webu na vybraného poskytovateľa. Do HTML hlavičky na indexe vašej domény stačí pridať odkaz na vášho OpenID poskytovateľa, teda webu ktorý vie overiť vašu identitu a komunikovať ju ďalej dôverujúcim stranám.&lt;br /&gt;&lt;br /&gt;Ako openid.server uvediete server poskytovateľa. Ako openid.delegate uvediete vaše OpenID identity URL:&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;/* URL OpenID poskytovatela */&lt;br /&gt;&amp;lt;link rel="openid.server" &lt;br /&gt;href="http://draft.blogger.com/openid-server.g" /&amp;gt;&lt;br /&gt;/* OpenID identity URL */&lt;br /&gt;&amp;lt;link rel="openid.delegate"&lt;br /&gt;href="http://javaflight.blogspot.com/" /&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Takýmto spôsobom je možné byť nezávislý na OpenID poskytovateľoch. Ak poskytovateľ ktorého používate z nejakého dôvodu prestane fungovať, alebo ho chcete zmeniť, jednoducho zmeníte hodnotu openid.server na vašom webe, a dôverujúce strany sa budú pýtať iného poskytovateľa. Vám zostane vaše OpenID identity URL, a všetci budú spokojní :-)&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Ďaľšie možnosti&lt;/h4&gt;Na vašom webe je možné mať rovno vlastného OpenID providera. Je to relatívne jednoduché s pomocou &lt;a href="http://siege.org/projects/phpMyID/"&gt;phpMyID&lt;/a&gt;, je to ale vyšší level oproti jednoduchému delegovaniu. Použitie phpMyID, a ďaľšie veci &lt;a href="http://intertwingly.net/blog/2007/01/03/OpenID-for-non-SuperUsers"&gt;výborne popisuje Sam Ruby&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Zdroje&lt;/h4&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://intertwingly.net/blog/2007/01/03/OpenID-for-non-SuperUsers"&gt;Sam Ruby: OpenID for non-superusers&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://openid.net/"&gt;OpenID.net&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/OpenID"&gt;Wikipedia&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://simonwillison.net/tags/openid/"&gt;Simon Willison o OpenID&lt;/a&gt;&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/7795849673717145049-3508207161294911879?l=javaflight.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/javaflight?a=zBijudd4dtU:WZD1W4W2yX4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/javaflight?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/javaflight?a=zBijudd4dtU:WZD1W4W2yX4:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/javaflight?i=zBijudd4dtU:WZD1W4W2yX4:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/javaflight/~4/zBijudd4dtU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://javaflight.blogspot.com/feeds/3508207161294911879/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=7795849673717145049&amp;postID=3508207161294911879" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7795849673717145049/posts/default/3508207161294911879?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7795849673717145049/posts/default/3508207161294911879?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/javaflight/~3/zBijudd4dtU/openid-blogger.html" title="OpenID a Blogger.com" /><author><name>Viktor Lieskovsky</name><uri>http://www.blogger.com/profile/17533444030037615808</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://s3.amazonaws.com/twitter_production/profile_images/37693262/n0ha_normal.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_MVu_-cF3bbE/R5UixJ2J4VI/AAAAAAAAAHk/1_uHZAOa2UQ/s72-c/openid-logo-square.png" height="72" width="72" /><thr:total>2</thr:total><feedburner:origLink>http://javaflight.blogspot.com/2008/01/openid-blogger.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkQNSH09eCp7ImA9WxZTGE8.&quot;"><id>tag:blogger.com,1999:blog-7795849673717145049.post-4248443381047989159</id><published>2008-01-20T10:13:00.000+01:00</published><updated>2008-01-20T11:19:59.360+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-01-20T11:19:59.360+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="knihy" /><title>Kniha: Managing Humans</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.amazon.com/gp/product/159059844X?ie=UTF8&amp;amp;tag=javafligh-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=159059844X"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 107px; height: 160px;" src="http://ecx.images-amazon.com/images/I/21yh7iHjoQL._AA_SL160_.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;img src="http://www.assoc-amazon.com/e/ir?t=javafligh-20&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=159059844X" alt="" style="border: medium none  ! important; margin: 0px ! important;" border="0" height="1" width="1" /&gt;Na &lt;a href="http://www.amazon.com/gp/product/159059844X?ie=UTF8&amp;amp;tag=javafligh-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=159059844X"&gt;túto knihu&lt;/a&gt; som narazil pri čítaní blogu z ktorého vychádza: &lt;a href="http://www.randsinrepose.com/"&gt;Rands in Repose&lt;/a&gt;. Keď som ho prvýkrát objavil, strávil som nad ním niekoľko hodín, a veľa sa nasmial: nie je to žiadna manažérska príručka, ani nič podobné (také niečo by som ani nečítal).&lt;br /&gt;&lt;br /&gt;Rozoznáte &lt;a href="http://www.randsinrepose.com/archives/2006/11/17/meeting_creatures.html"&gt;Meeting Creatures&lt;/a&gt;? Alebo &lt;a href="http://www.randsinrepose.com/archives/2003/08/05/incrementalists_completionists.html"&gt;Completionists od Incrementalists&lt;/a&gt;? &lt;a href="http://www.randsinrepose.com/archives/2005/02/20/organics_and_mechanics.html"&gt;Organics od Mechanics&lt;/a&gt;? Viete či máte &lt;a href="http://www.randsinrepose.com/archives/2003/07/10/nadd.html"&gt;NADD&lt;/a&gt;? Nie? Tak túto knihu vyložene potrebujete ;-)&lt;br /&gt;&lt;br /&gt;Rands opisuje bežný život v bežnom svete developera/engineering managera a ukazuje veci, ktoré su po prečítaní zjavné. To znie jednoducho, ale nie je. Až po prečítaní a aplikovaní na môj kúsok sveta si začínam uvedomovať, že mnoho z tých vecí som vnímal, ale nikdy by som ich tak systematicky nepopísal. Okrem toho dokáže podať tieto opisy tak, že sa ich nedá nezapamätať.&lt;br /&gt;&lt;br /&gt;Kniha je rozdelená na tri časti, Management, Procesy a You, a v jednotlivých esejách začnete postupne chápať že aj manažéri sú ľudia, ako rozmýšľajú a čo sa snažia dosiahnuť, ako fungujú bežné vnútrofiremné procesy, a nakoniec snáď aj niečo o sebe. Pre bežného developera je hlavne to spojenie manažér -- človek dosť nečakané ;-)&lt;br /&gt;&lt;br /&gt;Neoceniteľné sú popisy interview procesu a zvieratiek s ktorými sa stretnete počas neho. Rady ako napísať svoje CV. Jednoducho, je nabitá informáciami ktoré sa vám skôr či neskôr budú určite hodiť.&lt;br /&gt;&lt;br /&gt;Keď som aplikoval radu ako reportovať mojej nadriadenej, ktorá je typický Mechanic, mal som zrazu pocit viťazstva. Fungovalo to, a nič iné som ani nečakal, pretože to nie sú rady pre robotov, ale pre Humans. Nie sú to žiadne zázračné postupy v piatich krokoch ako sa stať obľúbeným, ale popisy aspektov ľudí, a ich myslenia.&lt;br /&gt;&lt;br /&gt;Ako bonus je v knihe &lt;a href="http://www.randsinrepose.com/glossary_alpha.html"&gt;Glossary&lt;/a&gt; bežných termínov, ako sú Synergy, CEO, Org Chart, alebo Manager. Neoceniteľné a trefné. A vtipné.&lt;br /&gt;&lt;br /&gt;Zhrnuté a spočítané, je to najlepšia kniha ktorú som minulý rok prečítal, a Rands má odvtedy svoje pevné miesto v mojom RSS Readri.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7795849673717145049-4248443381047989159?l=javaflight.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/javaflight?a=sR1TLCBsFzc:c6WxsKqqqJk:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/javaflight?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/javaflight?a=sR1TLCBsFzc:c6WxsKqqqJk:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/javaflight?i=sR1TLCBsFzc:c6WxsKqqqJk:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/javaflight/~4/sR1TLCBsFzc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://javaflight.blogspot.com/feeds/4248443381047989159/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=7795849673717145049&amp;postID=4248443381047989159" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7795849673717145049/posts/default/4248443381047989159?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7795849673717145049/posts/default/4248443381047989159?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/javaflight/~3/sR1TLCBsFzc/kniha-managing-humans.html" title="Kniha: Managing Humans" /><author><name>Viktor Lieskovsky</name><uri>http://www.blogger.com/profile/17533444030037615808</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://s3.amazonaws.com/twitter_production/profile_images/37693262/n0ha_normal.png" /></author><thr:total>3</thr:total><feedburner:origLink>http://javaflight.blogspot.com/2008/01/kniha-managing-humans.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkMHQ3k8eCp7ImA9WB9aGEw.&quot;"><id>tag:blogger.com,1999:blog-7795849673717145049.post-2302333155779363054</id><published>2008-01-08T19:50:00.000+01:00</published><updated>2008-01-08T19:53:52.770+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-01-08T19:53:52.770+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="citaty" /><title>Citát III</title><content type="html">"I spent my entire childhood waiting to grow into an adult partially so I could afford to buy myself all the crap my parents wouldn't buy me when I was a kid."&lt;br /&gt;&lt;br /&gt;-- Jeff Atwood @ &lt;a href="http://www.codinghorror.com/blog/archives/001010.html"&gt;http://www.codinghorror.com/blog/archives/001010.html&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7795849673717145049-2302333155779363054?l=javaflight.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/javaflight?a=xGeEawxEAV4:GCavpCLogZs:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/javaflight?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/javaflight?a=xGeEawxEAV4:GCavpCLogZs:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/javaflight?i=xGeEawxEAV4:GCavpCLogZs:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/javaflight/~4/xGeEawxEAV4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://javaflight.blogspot.com/feeds/2302333155779363054/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=7795849673717145049&amp;postID=2302333155779363054" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7795849673717145049/posts/default/2302333155779363054?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7795849673717145049/posts/default/2302333155779363054?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/javaflight/~3/xGeEawxEAV4/citt-iii.html" title="Citát III" /><author><name>Viktor Lieskovsky</name><uri>http://www.blogger.com/profile/17533444030037615808</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://s3.amazonaws.com/twitter_production/profile_images/37693262/n0ha_normal.png" /></author><thr:total>0</thr:total><feedburner:origLink>http://javaflight.blogspot.com/2008/01/citt-iii.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkMNQXo4eCp7ImA9WxZTGUg.&quot;"><id>tag:blogger.com,1999:blog-7795849673717145049.post-3932884858364274946</id><published>2008-01-06T15:55:00.000+01:00</published><updated>2008-01-21T22:21:30.430+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-01-21T22:21:30.430+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="python" /><title>Parsovanie dátumu v Pythone</title><content type="html">V pythonovskom manuáli som našiel na prvý pohľad jednoduchý idiom na &lt;a href="http://docs.python.org/lib/node85.html"&gt;parsovanie textovej reprezentácie dátumu&lt;/a&gt;. Vyzerá takto:&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;&gt;&gt;&gt; s = "10/11/2007 01:53"&lt;br /&gt;&gt;&gt;&gt; from datetime import datetime&lt;br /&gt;&gt;&gt;&gt; from time import strptime&lt;br /&gt;&gt;&gt;&gt; datetime(*strptime(s, "%d/%m/%Y %H:%M")[0:5])&lt;br /&gt;datetime.datetime(2007, 11, 10, 1, 53)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Prvé tri riadky sú jasné, zaujímavý je ten štvrtý. Funkcia &lt;span style="font-style:italic;"&gt;strptime&lt;/span&gt; naparsuje dátum v textovej podobe podľa určeného formátu.  Výsledok potom vráti v podobe &lt;a href="http://docs.python.org/lib/typesseq.html"&gt;&lt;span style="font-style:italic;"&gt;tuple&lt;/span&gt;&lt;/a&gt;. &lt;a href="http://docs.python.org/lib/datetime-datetime.html"&gt;&lt;span style="font-style:italic;"&gt;datetime&lt;/span&gt;&lt;/a&gt; ale neberie ako argument tuple, ale jednotlivé int hodnoty. Znak hviezdičky (asterisk) pred argumentom spôsobí rozloženie vrátenej tuple na jednotlivé int hodnoty, a predanie do funkcie ako jednotlivé parametre. Je to ekvivalentné tomuto zápisu:&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;&gt;&gt;&gt; parsed_time = strptime(s, "%d/%m/%Y %H:%M")[0:5]&lt;br /&gt;&gt;&gt;&gt; parsed_time&lt;br /&gt;(2007, 11, 10, 1, 53)&lt;br /&gt;&gt;&gt;&gt; datetime(parsed_time[0], parsed_time[1], parsed_time[2],&lt;br /&gt;... parsed_time[3], parsed_time[4])&lt;br /&gt;datetime.datetime(2007, 11, 10, 1, 53)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Podobne je v Pythone možné do funkcie poslať &lt;a href="http://gulopine.gamemusic.org/2007/nov/22/dynamic-functions/"&gt;keyword argumenty pomocou dvoch hviezdičiek&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;Poslednou nejasnosťou je ešte [0:5] na konci. Je to slice vrátenej tuple, pretože len prvých 5 vrátených hodnôt berieme do uváhy.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7795849673717145049-3932884858364274946?l=javaflight.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/javaflight?a=L460_6wSSzU:JhAO_QITqzs:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/javaflight?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/javaflight?a=L460_6wSSzU:JhAO_QITqzs:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/javaflight?i=L460_6wSSzU:JhAO_QITqzs:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/javaflight/~4/L460_6wSSzU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://javaflight.blogspot.com/feeds/3932884858364274946/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=7795849673717145049&amp;postID=3932884858364274946" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7795849673717145049/posts/default/3932884858364274946?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7795849673717145049/posts/default/3932884858364274946?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/javaflight/~3/L460_6wSSzU/parsovanie-dtumu-v-pythone.html" title="Parsovanie dátumu v Pythone" /><author><name>Viktor Lieskovsky</name><uri>http://www.blogger.com/profile/17533444030037615808</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://s3.amazonaws.com/twitter_production/profile_images/37693262/n0ha_normal.png" /></author><thr:total>0</thr:total><feedburner:origLink>http://javaflight.blogspot.com/2008/01/parsovanie-dtumu-v-pythone.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C04DR3o7eip7ImA9WB9WGEo.&quot;"><id>tag:blogger.com,1999:blog-7795849673717145049.post-6103259466339640383</id><published>2007-11-24T03:25:00.000+01:00</published><updated>2007-11-24T03:39:36.402+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2007-11-24T03:39:36.402+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="build" /><title>Build proces a cesta do pekla</title><content type="html">Po vyše roku skúseností s vývojom softvéru v jednej nemenovanej veľkej slovenskej banke, som získal neodbytný pocit. Pocit, a neskôr pevné presvedčenie, že používať Eclipse na buildovanie veľkej 'enterprise' aplikácie je šialenstvo.&lt;br /&gt;&lt;br /&gt;Buildovací proces, ku ktorému neexistuje dokumentácia, iba roztrúsená kmeňová pamäť tímu je istá cesta do pekla. S príchodom každého nového člena tímu ktorý by rád začal vyvíjať sa opakuje ten istý cirkus. Pomocou niekoľkých len v náznakoch popísaných inštrukcií sa snaží dať dokopy lokálne prostredie. Naráža na rôzne prekážky. Členovia tímu, ktorí majú dosť vlastných problémov sa mu popri svojej práci v rámci svojich možností snažia pomôcť. Nie vždy to samozrejme funguje.&lt;br /&gt;&lt;br /&gt;Priemerný čas rozbehania prostredia je podľa môjho odhadu okolo 2 dní.&lt;br /&gt;&lt;br /&gt;Potom sa začne vyvíjať. Commity krásne pribúdajú. Príde čas posunúť sa k testovaniu. A prichádzajú daľšie problémy. Kedže jediný spôsob ako aplikáciu vybuildovať je Eclipse, a Eclipse môže (a je!) nastavený u každého trošíčku odlišne, niekedy aplikácia nejde vybuildovať, alebo niektoré veci nefungujú.&lt;br /&gt;&lt;br /&gt;Začal som sa už cítiť divne že ma trápia podobné veci, a považujem podobné problémy za absurdné. Naštastie som dnes čítal &lt;a href="http://www.hacknot.info/hacknot/action/showEntry?eid=97"&gt;dve&lt;/a&gt; &lt;a href="http://www.codinghorror.com/blog/archives/000988.html"&gt;eseje&lt;/a&gt; pri ktorých som sa smial cez slzy, a už sa cítim lepšie :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7795849673717145049-6103259466339640383?l=javaflight.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/javaflight?a=72Fd4eJ7eI4:xL-xnCJhLyY:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/javaflight?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/javaflight?a=72Fd4eJ7eI4:xL-xnCJhLyY:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/javaflight?i=72Fd4eJ7eI4:xL-xnCJhLyY:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/javaflight/~4/72Fd4eJ7eI4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://javaflight.blogspot.com/feeds/6103259466339640383/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=7795849673717145049&amp;postID=6103259466339640383" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7795849673717145049/posts/default/6103259466339640383?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7795849673717145049/posts/default/6103259466339640383?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/javaflight/~3/72Fd4eJ7eI4/build-proces-cesta-do-pekla.html" title="Build proces a cesta do pekla" /><author><name>Viktor Lieskovsky</name><uri>http://www.blogger.com/profile/17533444030037615808</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://s3.amazonaws.com/twitter_production/profile_images/37693262/n0ha_normal.png" /></author><thr:total>0</thr:total><feedburner:origLink>http://javaflight.blogspot.com/2007/11/build-proces-cesta-do-pekla.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D08HRHo8fSp7ImA9WB9XEEg.&quot;"><id>tag:blogger.com,1999:blog-7795849673717145049.post-518705087571886099</id><published>2007-11-03T02:47:00.000+01:00</published><updated>2007-11-03T03:10:35.475+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2007-11-03T03:10:35.475+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="tools" /><category scheme="http://www.blogger.com/atom/ns#" term="git" /><title>Git bookmarklet</title><content type="html">Rýchle vyhľadanie aktuálnej &lt;a href="http://git.or.cz/"&gt;Git&lt;/a&gt; manuálovej stránky: Drag &amp; dropnite tento link na                                                                                             svoj bookmark toolbar:&lt;br /&gt;&lt;br /&gt;&lt;a href="javascript:p=prompt('man git');if(p) { p=p.replace(/\./g, '/');p=(p.substr(0,4)==='git-')?p:'git-'+p;window.location='http://www.kernel.org/pub/software/scm/git/docs/'+p.toLowerCase()+'.html'}"&gt;man git&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Po kliku napíšte &lt;b&gt;git-rebase&lt;/b&gt;, alebo iba &lt;b&gt;rebase&lt;/b&gt; a zobrazí sa man stránka.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7795849673717145049-518705087571886099?l=javaflight.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/javaflight?a=GJBaW8e5BnA:9GF8AdXe0F8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/javaflight?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/javaflight?a=GJBaW8e5BnA:9GF8AdXe0F8:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/javaflight?i=GJBaW8e5BnA:9GF8AdXe0F8:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/javaflight/~4/GJBaW8e5BnA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://javaflight.blogspot.com/feeds/518705087571886099/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=7795849673717145049&amp;postID=518705087571886099" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7795849673717145049/posts/default/518705087571886099?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7795849673717145049/posts/default/518705087571886099?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/javaflight/~3/GJBaW8e5BnA/git-bookmarklet.html" title="Git bookmarklet" /><author><name>Viktor Lieskovsky</name><uri>http://www.blogger.com/profile/17533444030037615808</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://s3.amazonaws.com/twitter_production/profile_images/37693262/n0ha_normal.png" /></author><thr:total>0</thr:total><feedburner:origLink>http://javaflight.blogspot.com/2007/11/git-bookmarklet.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkIAQnY_eCp7ImA9WB9QGUs.&quot;"><id>tag:blogger.com,1999:blog-7795849673717145049.post-6581170638026340666</id><published>2007-11-02T00:10:00.000+01:00</published><updated>2007-11-02T00:42:23.840+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2007-11-02T00:42:23.840+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="javascript" /><category scheme="http://www.blogger.com/atom/ns#" term="microsoft" /><title>Rozdiely v JavaScripte medzi browsermi</title><content type="html">Peklo zmrzlo, a Microsoft hneď na to publikoval dokument &lt;a href="http://wiki.ecmascript.org/lib/exe/fetch.php?id=resources%3Aresources&amp;cache=cache&amp;media=resources:jscriptdeviationsfromes3.pdf"&gt;JScript Deviations from ES3&lt;/a&gt; kde sa detailne rozoberajú rozdiely medzi implementáciami JavaScriptu v jednotlivých browseroch. V 87-stranovom dokumente sa bod po bode rozoberajú odlišnosti implementácií od &lt;a href="http://www.ecma-international.org/publications/standards/Ecma-262.htm"&gt;ECMAScript 3 špecifikácie&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://blogs.msdn.com/jscript/archive/2007/10/29/ecmascript-3-and-beyond.aspx"&gt;Komentár od JScript teamu&lt;/a&gt; by bol ešte pred pár rokmi nemysliteľný, a aj dnes je dosť prekvapivý:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;We in the JScript team are looking into where various browser based implementations diverge, where our engine is incorrect in its interpretation of the specification, what if any de facto compatibility conventions have been reached, and the value of codifying such conventions into the standard. We’ve published the first draft of JScript Deviations from ES3 as a starting point.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Zdá sa že vo svete JavaScriptu svitá na lepšie časy. Dúfajme :-)&lt;br /&gt;&lt;br /&gt;V dokumente sú podrobne rozobraté nielen odlišné implementácie špecifikácie, ale aj proprietárne veci ktoré su v JScripte. Zo zaujímavejších vecí sú to napríklad debugger statement, conditional compilation (ani som netušil že niečo také existuje), alebo dynamic scoping.&lt;br /&gt;&lt;br /&gt;Veľmi zaujímavé čítanie.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7795849673717145049-6581170638026340666?l=javaflight.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/javaflight?a=pd1ppl66Tp8:oPLNQL032g8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/javaflight?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/javaflight?a=pd1ppl66Tp8:oPLNQL032g8:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/javaflight?i=pd1ppl66Tp8:oPLNQL032g8:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/javaflight/~4/pd1ppl66Tp8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://javaflight.blogspot.com/feeds/6581170638026340666/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=7795849673717145049&amp;postID=6581170638026340666" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7795849673717145049/posts/default/6581170638026340666?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7795849673717145049/posts/default/6581170638026340666?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/javaflight/~3/pd1ppl66Tp8/rozdiely-v-javascripte-medzi-browsermi.html" title="Rozdiely v JavaScripte medzi browsermi" /><author><name>Viktor Lieskovsky</name><uri>http://www.blogger.com/profile/17533444030037615808</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://s3.amazonaws.com/twitter_production/profile_images/37693262/n0ha_normal.png" /></author><thr:total>0</thr:total><feedburner:origLink>http://javaflight.blogspot.com/2007/11/rozdiely-v-javascripte-medzi-browsermi.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkEARXs4cSp7ImA9WB9QGUs.&quot;"><id>tag:blogger.com,1999:blog-7795849673717145049.post-2450807697202682824</id><published>2007-10-30T22:33:00.000+01:00</published><updated>2007-11-02T00:44:04.539+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2007-11-02T00:44:04.539+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="citaty" /><title>Citat II</title><content type="html">That's why I use windows. So I don't have to wonder who the culprit is ;)&lt;br /&gt;&lt;br /&gt;-- Killjoy_NL @ &lt;a href="http://hardware.slashdot.org/comments.pl?sid=344745&amp;cid=21174267"&gt;slashdot comment&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7795849673717145049-2450807697202682824?l=javaflight.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/javaflight?a=ih47RZ5B-bA:aid9a7A7bQc:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/javaflight?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/javaflight?a=ih47RZ5B-bA:aid9a7A7bQc:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/javaflight?i=ih47RZ5B-bA:aid9a7A7bQc:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/javaflight/~4/ih47RZ5B-bA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://javaflight.blogspot.com/feeds/2450807697202682824/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=7795849673717145049&amp;postID=2450807697202682824" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7795849673717145049/posts/default/2450807697202682824?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7795849673717145049/posts/default/2450807697202682824?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/javaflight/~3/ih47RZ5B-bA/citat-ii.html" title="Citat II" /><author><name>Viktor Lieskovsky</name><uri>http://www.blogger.com/profile/17533444030037615808</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://s3.amazonaws.com/twitter_production/profile_images/37693262/n0ha_normal.png" /></author><thr:total>0</thr:total><feedburner:origLink>http://javaflight.blogspot.com/2007/10/citat-ii.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CE4ESH05eyp7ImA9WB9QFUU.&quot;"><id>tag:blogger.com,1999:blog-7795849673717145049.post-2436744967924741215</id><published>2007-10-28T12:43:00.000+01:00</published><updated>2007-10-28T15:48:29.323+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2007-10-28T15:48:29.323+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="javascript" /><category scheme="http://www.blogger.com/atom/ns#" term="jquery" /><category scheme="http://www.blogger.com/atom/ns#" term="optimization" /><category scheme="http://www.blogger.com/atom/ns#" term="aop" /><title>jQuery AOP plugin a meranie výkonnosti</title><content type="html">&lt;a href="http://en.wikipedia.org/wiki/Aspect-oriented_programming"&gt;AOP (Aspektovo Orientované Programovanie)&lt;/a&gt; je relatívne nový prístup k štruktúrovaniu kódu. Začína byť pomerne dosť rozšírené v Jave, vďaka &lt;a href="http://www.eclipse.org/aspectj/"&gt;AspectJ&lt;/a&gt; a &lt;a href="http://www.springframework.org/"&gt;Spring&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;AOP sa zaujíma sa o jasné oddelenie niečoho, čo nazýva &lt;a href="http://en.wikipedia.org/wiki/Cross-cutting_concern"&gt;cross-cutting concerns&lt;/a&gt;, alebo naprieč-zasahujúce záujmy (uff, aký je oficiálny preklad? tento je hrozný). Cross-cutting concern je opakujúca sa časť kódu, ktorá sa vyskytuje v rôznych podobách na viacerých miestach. Typickými predstaviteľmi sú logovanie, security a profiling. Profilovanie je to čo ma teraz zaujíma, tak sa prizrime bližšie.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;jQuery AOP&lt;/h4&gt;&lt;br /&gt;Tento &lt;a href="http://code.google.com/p/jquery-aop/"&gt;jQuery plugin&lt;/a&gt; veľmi priamočiaro a jednoducho implementuje vytváranie a weaving aspektov do public metód a funkcií. Podporuje &lt;b&gt;before&lt;/b&gt;, &lt;b&gt;after&lt;/b&gt; a &lt;b&gt;around&lt;/b&gt; advice, a vytvorený aspekt má metódu unweave, ktorou sa advice odstráni.&lt;br /&gt;&lt;br /&gt;&lt;pre class='prettyprint'&gt;&lt;br /&gt;/* vytvorenie aspektu */&lt;br /&gt;var aspect = jQuery.aop.before( {target: String, method: 'indexOf'}, &lt;br /&gt;  function(searchValue, fromIndex) { &lt;br /&gt;    alert('Calling String.indexOf with ' + searchValue + ', ' + fromIndex);&lt;br /&gt;  }&lt;br /&gt;);&lt;br /&gt;&lt;br /&gt;/* vyvola alert */&lt;br /&gt;'test it'.indexOf('i');&lt;br /&gt;&lt;br /&gt;/* odstranenie advice */&lt;br /&gt;aspect.unweave();&lt;br /&gt;&lt;br /&gt;/* nevyvola alert */&lt;br /&gt;'test it again'.indexOf('i');&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Rozšírenie pre profilovanie&lt;/h4&gt;&lt;br /&gt;Advice typu around sa spúšťa pred aj po spustení cieľovej funkcie, preto je ideálnym kandidátom na implementáciu logovania dľžky trvania funkcie. Použil som na to funkciu, ktorá si pamätá počet zavolaní funkcie, a čas všetkých zavolaní spolu. Tu je:&lt;br /&gt;&lt;br /&gt;&lt;pre class='prettyprint'&gt;&lt;br /&gt;profile : function(pointcut) {&lt;br /&gt;  return weave( pointcut, { type:'around', value: function() {&lt;br /&gt;    var advice = function(invocation) {&lt;br /&gt;      &lt;br /&gt;      var timeStart = new Date();&lt;br /&gt;      var result = invocation.proceed(); &lt;br /&gt;      var timeEnd = new Date();&lt;br /&gt;&lt;br /&gt;      advice.callCount += 1;&lt;br /&gt;      advice.totalTime += timeEnd.getTime() - timeStart.getTime();&lt;br /&gt;&lt;br /&gt;      return result;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    advice.callCount = 0;&lt;br /&gt;    advice.totalTime = 0;&lt;br /&gt;    return advice;&lt;br /&gt;  }()});&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Ako advice funkcia je tu funkcia ktorá vracia funkciu. Joj, trošku zložité :-). Je to dôležité, pretože ako advice musí byť použitá funkcia, chceme jej ale nainicializovať public atribúty, a takto je to podľa mňa najčitateľnejšie.&lt;br /&gt;&lt;br /&gt;Ok, máme advice, je na správanom mieste, ale ako dostaneme výsledky? Každý vytvorený aspekt má už metódu unweave na svoje odstránenie, pridal som mu teda aj metódu finishProfiling, ktorá nám vráti naakumulované výsledky:&lt;br /&gt;&lt;br /&gt;&lt;pre class='prettyprint'&gt;&lt;br /&gt;aspect.finishProfiling = function() {&lt;br /&gt;  if (!advice.value.callCount) {&lt;br /&gt;    return null;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  var result = 'totalTime [ms]: ' + advice.value.totalTime;&lt;br /&gt;  result += ' callCount: ' + advice.value.callCount;&lt;br /&gt;  result += ' avgTime [ms]: ' + advice.value.totalTime / advice.value.callCount;&lt;br /&gt;&lt;br /&gt;  advice.value.callCount = advice.value.totalTime = 0;&lt;br /&gt;  return result;&lt;br /&gt;};&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Táto metóda nielen vráti výsledky, ale aj vynuluje počítadlá. S týmto sa dá samozrejme vyhrať, môže a nemusí ich nulovať, výsledky sa môžu vracať inak, mne ale úplne stačila táto jednoduchá implementácia.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Použitie&lt;/h4&gt;&lt;br /&gt;Zistil som, že potom čo som obalil rôzne metódy, a celé inštancie do aspektov, potreboval som selektívne zisťovať ich výsledky. Najjednoduchšie by to bolo na klávesovú skratku. Kedže s jQuery  nie som až taký kamarát, musel pomôcť ExtJS. Implementácia by mohla vyzerať takto:&lt;br /&gt;&lt;br /&gt;&lt;pre class='prettyprint'&gt;&lt;br /&gt;var aspects = $H();&lt;br /&gt;aspects.merge({&lt;br /&gt;  'String.indexOf': jQuery.aop.profile({target: String, method: 'indexOf'}),&lt;br /&gt;  'Array.splice': jQuery.aop.profile({target: Array, method: 'splice'})&lt;br /&gt;});&lt;br /&gt;&lt;br /&gt;/* profilingove informacie: Ctrl+Shift+PgUp */&lt;br /&gt;Ext.get(document).on('keydown', function(e) {&lt;br /&gt;  if (e.ctrlKey &amp;&amp; e.shiftKey &amp;&amp; e.getKey() == e.PAGEUP) {&lt;br /&gt;    console.log('==============');&lt;br /&gt;    aspects.each(function(pair) {&lt;br /&gt;      var profilingInfo = pair.value.finishProfiling();&lt;br /&gt;      if (profilingInfo) {&lt;br /&gt;        console.log(pair.key + ': ' + profilingInfo);&lt;br /&gt;      }&lt;br /&gt;    });&lt;br /&gt;  }&lt;br /&gt;});&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Áno, áno, je to mix jQuery, Prototype a ExtJS, nič moc ;-).&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Čo ďalej&lt;/h4&gt;&lt;br /&gt;Pokúsim sa ten kód nejak upratať, a navrhnúť ho pôvodnému autorovi jQuery AOP. Tiež by sa hodila nejaká dokumentácia, prípadne funkčný príklad, o ktorý sa tiež pokúsim.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7795849673717145049-2436744967924741215?l=javaflight.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/javaflight?a=OInXEu96vAw:nHyFFFlLkCM:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/javaflight?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/javaflight?a=OInXEu96vAw:nHyFFFlLkCM:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/javaflight?i=OInXEu96vAw:nHyFFFlLkCM:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/javaflight/~4/OInXEu96vAw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://javaflight.blogspot.com/feeds/2436744967924741215/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=7795849673717145049&amp;postID=2436744967924741215" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7795849673717145049/posts/default/2436744967924741215?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7795849673717145049/posts/default/2436744967924741215?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/javaflight/~3/OInXEu96vAw/jquery-aop-plugin-meranie-vkonnosti.html" title="jQuery AOP plugin a meranie výkonnosti" /><author><name>Viktor Lieskovsky</name><uri>http://www.blogger.com/profile/17533444030037615808</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://s3.amazonaws.com/twitter_production/profile_images/37693262/n0ha_normal.png" /></author><thr:total>0</thr:total><feedburner:origLink>http://javaflight.blogspot.com/2007/10/jquery-aop-plugin-meranie-vkonnosti.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUUNQHs9fip7ImA9WB9QFUU.&quot;"><id>tag:blogger.com,1999:blog-7795849673717145049.post-6514825431051555109</id><published>2007-10-24T22:43:00.000+02:00</published><updated>2007-10-28T15:54:51.566+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2007-10-28T15:54:51.566+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="javascript" /><category scheme="http://www.blogger.com/atom/ns#" term="tools" /><category scheme="http://www.blogger.com/atom/ns#" term="jsloader" /><category scheme="http://www.blogger.com/atom/ns#" term="prototype" /><title>Publikovanie kódu s pomocou google-code-prettify a JSLoader</title><content type="html">Publikovanie kódu na blogu, alebo v dokumentácii môže byť menšia nočná mora. Kód je ťažko čitateľný, pokiaľ nie je farebne zvýraznený, to ale bežne dokáže iba editor. Ako na zvýraznenie v HTML, a v momente kedy sa nedá nič inštalovať na server? Veľmi jednoduchým a funkčným riešením su dve JS libky, &lt;a href="http://code.google.com/p/google-code-prettify/"&gt;google-code-prettify&lt;/a&gt; a &lt;a href="http://www.jsloader.com/"&gt;JSLoader&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;google-code-prettify&lt;/h4&gt;&lt;br /&gt;Malá (iba necelých 10kB v minifikovanej podobe) hračka, ktorá má len jednu funkciu: Zobrať obsah elementu &amp;lt;pre&amp;gt; a farebne zvýrazniť kód v ňom. Jazyk ktorý zvýrazňuje sa nikde nenastavuje, prettify si ho tipne sama. Medzi podporované jazyky patria C, Java, Python, Bash, SQL, HTML, XML, CSS, Javascript, a Makefiles, čiastočne aj Ruby, PHP, Awk a Perl. Dosť slušné. To, ktoré elementy chceme zvýrazniť sa dáva libke na známosť klasickým &lt;a href="http://en.wikipedia.org/wiki/Unobtrusive_JavaScript"&gt;Unobtrusive Scripting&lt;/a&gt; spôsobom -- CSS triedou. Viac v &lt;a href="http://google-code-prettify.googlecode.com/svn/trunk/README.html"&gt;README&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;JSLoader&lt;/h4&gt;&lt;br /&gt;Ok, zvýraznenie by bolo, ale ako loadnut prettify, ak jej distribúciu nemôžeme umiestniť na server? JSLoader to the rescue. &lt;a href="http://www.jsloader.com/"&gt;JSLoader&lt;/a&gt; je JS knižnica ktorá dokáže do aktuálnej HTML stránky vložiť niektorú z podporovaných JS libraries. Zatiaľ je podporovaných &lt;a href="http://www.jsloader.com/twiki/bin/view/JSLoader/WebHome#What_modules_can_I_load_in_JSLoa"&gt;niekoľko najznámejších&lt;/a&gt;, časom budú určite pribúdať ďaľšie. Zdrojom odkiaľ sú liby sťahované je zatiaľ server jsloader.com, uvidíme ako dlho to vydrží, a či to neprevezme na seba nejaká &lt;a href="http://en.wikipedia.org/wiki/Content_Delivery_Network"&gt;CDN&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;JSLoader &lt;a href="http://www.jsloader.com/twiki/bin/view/JSLoader/HowItWorks"&gt;funguje&lt;/a&gt; na viac menej jednoduchom princípe vytváranie script tagov v dokumente, jej hlavná výhoda ale je že 'pozná' jednotlivé liby a frameworky, a vy sa tak nemusíte naťahovať s ich inštaláciou, JSLoader vie čo potrebujú.&lt;br /&gt;&lt;br /&gt;Príklad použitia pre google-code-prettify (obšlahnutý z homepage JSLoadera):&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;/* najprv samotny loader */&lt;br /&gt;&amp;lt;script src="http://vps.jsloader.com/assets/jsloader.js" /&amp;gt;&lt;br /&gt;&lt;br /&gt;/* v jednom script bloku prettify a jej zavislost: prototype */&lt;br /&gt;JSLoader.load("ria","prototype","1.5.1");&lt;br /&gt;JSLoader.load("ria","prettify","1.0");&lt;br /&gt;&lt;br /&gt;/* v dalsom bloku naviazanie na load DOM */&lt;br /&gt;Event.observe(window,"load",prettyPrint);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Niet ďalej čo riešiť, kód uzavretý v pre tagoch bude odteraz really pretty, ako je možno vidieť na príkladoch priamo v tomto zápise :-) Takže, happy code publishing..&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Update 28.10.2007 15:50&lt;/b&gt;&lt;br /&gt;Editor blogpostov tu na Blogger.com odstráni z textu oddeľovače riadkov, a zamení ich za &amp;lt;br /&amp;gt;. Ak kdekoľvek v kóde ktoý chcem zvýrazniť použijem riadkový komentár //, prettify potom považuje celý zbytok príkladu za komentár, pretože je všetko v jednom riadku. Ak sa použijú /* blokové komentáre, */ všetko funguje tak ako má.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7795849673717145049-6514825431051555109?l=javaflight.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/javaflight?a=JPe1TGsjInY:lX4qzRhB9do:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/javaflight?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/javaflight?a=JPe1TGsjInY:lX4qzRhB9do:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/javaflight?i=JPe1TGsjInY:lX4qzRhB9do:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/javaflight/~4/JPe1TGsjInY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://javaflight.blogspot.com/feeds/6514825431051555109/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=7795849673717145049&amp;postID=6514825431051555109" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7795849673717145049/posts/default/6514825431051555109?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7795849673717145049/posts/default/6514825431051555109?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/javaflight/~3/JPe1TGsjInY/publikovanie-kdu-s-pomocou-google-code.html" title="Publikovanie kódu s pomocou google-code-prettify a JSLoader" /><author><name>Viktor Lieskovsky</name><uri>http://www.blogger.com/profile/17533444030037615808</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://s3.amazonaws.com/twitter_production/profile_images/37693262/n0ha_normal.png" /></author><thr:total>0</thr:total><feedburner:origLink>http://javaflight.blogspot.com/2007/10/publikovanie-kdu-s-pomocou-google-code.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEQMRn89cCp7ImA9WB9QFEU.&quot;"><id>tag:blogger.com,1999:blog-7795849673717145049.post-1400951755078311110</id><published>2007-10-12T21:05:00.001+02:00</published><updated>2007-10-27T12:53:07.168+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2007-10-27T12:53:07.168+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="javascript" /><category scheme="http://www.blogger.com/atom/ns#" term="prototype" /><category scheme="http://www.blogger.com/atom/ns#" term="optimization" /><title>Rýchle porovnanie Number.times a for-loop</title><content type="html">Pomerne často používam vo svojom kóde funkcie ako &lt;a href="http://prototypejs.org/api/number/times"&gt;Number.times&lt;/a&gt; a &lt;a href="http://prototypejs.org/api/array/each"&gt;Array.each&lt;/a&gt; z &lt;a href="http://prototypejs.org/"&gt;Prototype&lt;/a&gt;. Keďže posledné týždne máme určité obavy či náš aktuálny projekt je dostatočne rýchly, zamýšlal som sa aj nad tým, či používanie takýchto syntactic sugar 'udělátek' nemôže byť zdrojom 'pomalosti' našej aplikácie.&lt;br /&gt;&lt;br /&gt;Zamýšlanie sa je pekná vec, ale omnoho užitočnejšie ako hádať je v programovaní urobiť experiment, a preto som sa rozhodol rýchlo (a nepresne) porovnať výkonnosť dvoch prístupov k for-loop. Prvý, nazvime ho vyzývateľ, je funkcia &lt;span style="font-weight:bold;"&gt;Number.times&lt;/span&gt;, ktorá odkukáva Ruby štýl, druhý, šampión, je klasický &lt;span style="font-weight:bold;"&gt;for cyklus&lt;/span&gt;. Aby to nebolo až také nudné, zabalil som for-cyklus do API podobného Number.times.&lt;br /&gt;&lt;br /&gt;Pozrime sa na kód:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="color: rgb(68, 68, 68);"&gt;// wrapper API for the for-loop&lt;/span&gt;&lt;br /&gt;Number.&lt;span style="color: rgb(32, 64, 160);"&gt;&lt;strong&gt;prototype&lt;/strong&gt;&lt;/span&gt;.excercisesInTheMorning &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; function(whatExcercise) &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;  &lt;strong&gt;var&lt;/strong&gt; howMany &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; &lt;strong&gt;this&lt;/strong&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;strong&gt;for&lt;/strong&gt; (&lt;strong&gt;var&lt;/strong&gt; i &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;0&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt; i &lt;span style="color: rgb(68, 68, 255);"&gt;&amp;lt;&lt;/span&gt; howMany&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt; i++) &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;    whatExcercise.call(&lt;strong&gt;this&lt;/strong&gt;, i)&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(68, 68, 68);"&gt;// the contestants&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;var&lt;/strong&gt; SimpleForLoop &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; function(i) &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;  (i).excercisesInTheMorning(function(n) &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: rgb(68, 68, 68);"&gt;// empty loop&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;);&lt;br /&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;var&lt;/strong&gt; PrototypeRubyStyle &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; function(i) &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;  (i).times(function(n) &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: rgb(68, 68, 68);"&gt;// empty loop&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;);&lt;br /&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(68, 68, 68);"&gt;// the referee&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;var&lt;/strong&gt; bench &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; function(n, fn, &lt;span style="color: rgb(32, 64, 160);"&gt;&lt;strong&gt;name&lt;/strong&gt;&lt;/span&gt;) &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;  console.&lt;span style="color: rgb(165, 42, 42);"&gt;&lt;strong&gt;log&lt;/strong&gt;&lt;/span&gt;(&lt;span style="color: rgb(0, 128, 0);"&gt;'---- '&lt;/span&gt; + &lt;span style="color: rgb(32, 64, 160);"&gt;&lt;strong&gt;name&lt;/strong&gt;&lt;/span&gt; + &lt;span style="color: rgb(0, 128, 0);"&gt;': '&lt;/span&gt; + n + &lt;span style="color: rgb(0, 128, 0);"&gt;' times ----'&lt;/span&gt;)&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;strong&gt;var&lt;/strong&gt; startTime &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; &lt;strong&gt;new&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;&lt;strong&gt;Date&lt;/strong&gt;&lt;/span&gt;()&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;  console.&lt;span style="color: rgb(165, 42, 42);"&gt;&lt;strong&gt;log&lt;/strong&gt;&lt;/span&gt;(&lt;span style="color: rgb(0, 128, 0);"&gt;'start: '&lt;/span&gt; + startTime.&lt;span style="color: rgb(165, 42, 42);"&gt;&lt;strong&gt;getTime&lt;/strong&gt;&lt;/span&gt;())&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;  fn.call(&lt;strong&gt;this&lt;/strong&gt;, n)&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;  &lt;strong&gt;var&lt;/strong&gt; endTime &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; &lt;strong&gt;new&lt;/strong&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;&lt;strong&gt;Date&lt;/strong&gt;&lt;/span&gt;()&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;  console.&lt;span style="color: rgb(165, 42, 42);"&gt;&lt;strong&gt;log&lt;/strong&gt;&lt;/span&gt;(&lt;span style="color: rgb(0, 128, 0);"&gt;'finish: '&lt;/span&gt; + endTime.&lt;span style="color: rgb(165, 42, 42);"&gt;&lt;strong&gt;getTime&lt;/strong&gt;&lt;/span&gt;())&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;strong&gt;var&lt;/strong&gt; diff &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; (endTime.&lt;span style="color: rgb(165, 42, 42);"&gt;&lt;strong&gt;getTime&lt;/strong&gt;&lt;/span&gt;() - startTime.&lt;span style="color: rgb(165, 42, 42);"&gt;&lt;strong&gt;getTime&lt;/strong&gt;&lt;/span&gt;())&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;  console.&lt;span style="color: rgb(165, 42, 42);"&gt;&lt;strong&gt;log&lt;/strong&gt;&lt;/span&gt;(&lt;span style="color: rgb(0, 128, 0);"&gt;'total [ms]: '&lt;/span&gt; + diff)&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;strong&gt;return&lt;/strong&gt; diff&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(68, 68, 68);"&gt;// let the match begin..&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;var&lt;/strong&gt; p &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; bench(&lt;span style="color: rgb(255, 0, 0);"&gt;1000000&lt;/span&gt;, PrototypeRubyStyle, &lt;span style="color: rgb(0, 128, 0);"&gt;'PrototypeRubyStyle'&lt;/span&gt;)&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;var&lt;/strong&gt; s &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; bench(&lt;span style="color: rgb(255, 0, 0);"&gt;1000000&lt;/span&gt;, SimpleForLoop, &lt;span style="color: rgb(0, 128, 0);"&gt;'SimpleForLoop'&lt;/span&gt;)&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;console.&lt;span style="color: rgb(165, 42, 42);"&gt;&lt;strong&gt;log&lt;/strong&gt;&lt;/span&gt;(&lt;span style="color: rgb(32, 64, 160);"&gt;&lt;strong&gt;Math&lt;/strong&gt;&lt;/span&gt;.&lt;span style="color: rgb(165, 42, 42);"&gt;&lt;strong&gt;floor&lt;/strong&gt;&lt;/span&gt;(p &lt;span style="color: rgb(68, 68, 255);"&gt;/&lt;/span&gt; s).&lt;span style="color: rgb(165, 42, 42);"&gt;&lt;strong&gt;toString&lt;/strong&gt;&lt;/span&gt;() + &lt;span style="color: rgb(0, 128, 0);"&gt;'x faster'&lt;/span&gt;)&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Pomerne jednoduchá a bezduchá implementácia :-) Čo ste vlastne čakali?&lt;br /&gt;&lt;br /&gt;Skúsme výsledky:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;---- PrototypeRubyStyle: 1000000 times ----&lt;br /&gt;start: 1192215759640&lt;br /&gt;finish: 1192215775171&lt;br /&gt;total [ms]: 15531&lt;br /&gt;---- SimpleForLoop: 1000000 times ----&lt;br /&gt;start: 1192215775171&lt;br /&gt;finish: 1192215778437&lt;br /&gt;total [ms]: 3266&lt;br /&gt;4x faster&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Na mojom notebooku (1.87GHz single-core) vo Firefoxe 2.0.0.7 na Ubuntu 7.10 skončilo 1.000.000 opakovaní for-loop približne 4x rýchlejšie ako Number.times. Ten rozdiel je dosť veľký, treba si ale uvedomiť ze šlo o poriadne veľa opakovaní, čo sa v bežnej aplikácii asi tak často nevyskytne. Štvornásobný rozdiel bol pomerne konštantný, a udržiaval sa pri počte opakovaní od 10.000 až po 1.000.000.&lt;br /&gt;&lt;br /&gt;Záver teda je, že ak je vaša aplikácia pomalá, prepisovanie Number.times na for-loop ju asi z biedy nevytrhne. Zopár dobre mierených console.time a console.timeEnd ale môže vašu pozornosť upriamiť na miesta ktoré trvajú prekvapivo dlho, a ktoré možno prepísať efektívnejšie, alebo odaliť chyby (Ako mne dnes, keď som našiel dve hlúpe chyby pri porovnávaní Date v implementácii cache. Ich odstránenie zrýchlilo pomalé okno na polovicu času.)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7795849673717145049-1400951755078311110?l=javaflight.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/javaflight?a=rxLva5o2ZQE:_lYaQYbxCX8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/javaflight?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/javaflight?a=rxLva5o2ZQE:_lYaQYbxCX8:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/javaflight?i=rxLva5o2ZQE:_lYaQYbxCX8:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/javaflight/~4/rxLva5o2ZQE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://javaflight.blogspot.com/feeds/1400951755078311110/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=7795849673717145049&amp;postID=1400951755078311110" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7795849673717145049/posts/default/1400951755078311110?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7795849673717145049/posts/default/1400951755078311110?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/javaflight/~3/rxLva5o2ZQE/rchle-porovnanie-numbertimes-for-loop.html" title="Rýchle porovnanie Number.times a for-loop" /><author><name>Viktor Lieskovsky</name><uri>http://www.blogger.com/profile/17533444030037615808</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://s3.amazonaws.com/twitter_production/profile_images/37693262/n0ha_normal.png" /></author><thr:total>0</thr:total><feedburner:origLink>http://javaflight.blogspot.com/2007/10/rchle-porovnanie-numbertimes-for-loop.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkMCQHcycCp7ImA9WB9QEEQ.&quot;"><id>tag:blogger.com,1999:blog-7795849673717145049.post-4596346041387984802</id><published>2007-10-07T12:02:00.000+02:00</published><updated>2007-10-23T00:01:01.998+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2007-10-23T00:01:01.998+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="python" /><category scheme="http://www.blogger.com/atom/ns#" term="optimization" /><title>Optimalizacia do mrtva</title><content type="html">&lt;a href="http://effbot.org/zone/wide-finder.htm"&gt;Pekne Python triky&lt;/a&gt; pri zrychlovani spracovavania logov na multi-core. [&lt;a href="http://simonwillison.net/2007/Oct/7/"&gt;via&lt;/a&gt;]&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7795849673717145049-4596346041387984802?l=javaflight.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/javaflight?a=9H6MqJODikw:TZYHnk69I2k:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/javaflight?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/javaflight?a=9H6MqJODikw:TZYHnk69I2k:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/javaflight?i=9H6MqJODikw:TZYHnk69I2k:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/javaflight/~4/9H6MqJODikw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://javaflight.blogspot.com/feeds/4596346041387984802/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=7795849673717145049&amp;postID=4596346041387984802" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7795849673717145049/posts/default/4596346041387984802?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7795849673717145049/posts/default/4596346041387984802?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/javaflight/~3/9H6MqJODikw/optimalizacia-do-mrtva.html" title="Optimalizacia do mrtva" /><author><name>Viktor Lieskovsky</name><uri>http://www.blogger.com/profile/17533444030037615808</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://s3.amazonaws.com/twitter_production/profile_images/37693262/n0ha_normal.png" /></author><thr:total>0</thr:total><feedburner:origLink>http://javaflight.blogspot.com/2007/10/optimalizacia-do-mrtva.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkEGRn07cSp7ImA9WB9SGUs.&quot;"><id>tag:blogger.com,1999:blog-7795849673717145049.post-2752106466399692874</id><published>2007-10-03T16:52:00.000+02:00</published><updated>2007-10-09T23:17:07.309+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2007-10-09T23:17:07.309+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="javascript" /><title>Obidenie problemu ciarky navyse</title><content type="html">Pri pouzivani napr. &lt;a href="http://yuiblog.com/blog/2007/06/12/module-pattern/"&gt;Module Patternu&lt;/a&gt; v JS casto narazam na jednoduchu chybu s ciarkou navyse, ktora sa ale obcas velmi tazko odhaluje.&lt;br /&gt;&lt;br /&gt;Priklad:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt; &lt;font color="#444444"&gt;// singleton podla Module Pattern&lt;/font&gt;&lt;br /&gt; &lt;strong&gt;var&lt;/strong&gt; test &lt;font color="4444FF"&gt;=&lt;/font&gt; function() &lt;font color="4444FF"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/font&gt;&lt;br /&gt; &lt;br /&gt;   &lt;strong&gt;var&lt;/strong&gt; privateVar &lt;font color="4444FF"&gt;=&lt;/font&gt; &lt;font color="#008000"&gt;'private'&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br /&gt; &lt;br /&gt;   &lt;strong&gt;return&lt;/strong&gt; &lt;font color="4444FF"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/font&gt;&lt;br /&gt; &lt;br /&gt;     publicVar: &lt;font color="#008000"&gt;'public'&lt;/font&gt;,&lt;br /&gt; &lt;br /&gt;     publicMethod: function() &lt;font color="4444FF"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/font&gt;&lt;br /&gt;       &lt;font color="a52a2a"&gt;&lt;strong&gt;alert&lt;/strong&gt;&lt;/font&gt;(publicVar)&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br /&gt;     &lt;font color="4444FF"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/font&gt;,&lt;br /&gt;     &lt;br /&gt;     &lt;font color="#444444"&gt;/*&lt;br /&gt;     anotherPublicMethod: function() {&lt;br /&gt;       alert(privateVar);&lt;br /&gt;     }&lt;br /&gt;     */&lt;/font&gt;&lt;br /&gt; &lt;br /&gt;   &lt;font color="4444FF"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/font&gt;&lt;br /&gt; &lt;font color="4444FF"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/font&gt;()&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Ak odkomentujeme public metodu 'anotherPublicMethod', kod bude fungovat, ak ju zakomentujeme, kod v IE padne na chybe syntaxe. Kde je problem? Skusme jednoduchsi priklad:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt; &lt;strong&gt;var&lt;/strong&gt; o &lt;font color="4444FF"&gt;=&lt;/font&gt; &lt;font color="4444FF"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/font&gt;&lt;br /&gt;   &lt;font color="#008000"&gt;'first'&lt;/font&gt;: &lt;font color="#008000"&gt;'needs comma'&lt;/font&gt;,&lt;br /&gt;   &lt;font color="#008000"&gt;'second'&lt;/font&gt;: &lt;font color="#008000"&gt;'MUST NOT have comma'&lt;/font&gt;&lt;br /&gt; &lt;font color="4444FF"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/font&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Posledny clen objektu pri zapise pomocou &lt;a href="http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Guide:Literals#Object_Literals"&gt;object literal&lt;/a&gt; nesmie byt oddeleny ciarkou. Tato chyba sa prejavuje iba v Internet Exploreri, ktory je samozrejme vyrazne nepriatelsky voci vyvojarovi, co ma za nasledok to spominane obtiazne hladanie tejto chyby. Jednoduche riesenie je automaticky pridat na koniec triedy prazdny clen bez ciarky, ktory tam bude vzdy. Ostatne metody a atributy samozrejme budu s ciarkou.&lt;br /&gt;&lt;br /&gt;Prvy priklad z workaroundom:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt; &lt;font color="#444444"&gt;// singleton podla Module Pattern&lt;/font&gt;&lt;br /&gt; &lt;strong&gt;var&lt;/strong&gt; test &lt;font color="4444FF"&gt;=&lt;/font&gt; function() &lt;font color="4444FF"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/font&gt;&lt;br /&gt; &lt;br /&gt;   &lt;strong&gt;var&lt;/strong&gt; privateVar &lt;font color="4444FF"&gt;=&lt;/font&gt; &lt;font color="#008000"&gt;'private'&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br /&gt; &lt;br /&gt;   &lt;strong&gt;return&lt;/strong&gt; &lt;font color="4444FF"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/font&gt;&lt;br /&gt; &lt;br /&gt;     publicVar: &lt;font color="#008000"&gt;'public'&lt;/font&gt;,&lt;br /&gt; &lt;br /&gt;     publicMethod: function() &lt;font color="4444FF"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/font&gt;&lt;br /&gt;       &lt;font color="a52a2a"&gt;&lt;strong&gt;alert&lt;/strong&gt;&lt;/font&gt;(publicVar)&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;br /&gt;     &lt;font color="4444FF"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/font&gt;,&lt;br /&gt;     &lt;br /&gt;     &lt;font color="#444444"&gt;/*&lt;br /&gt;     anotherPublicMethod: function() {&lt;br /&gt;       alert(privateVar);&lt;br /&gt;     },&lt;br /&gt;     */&lt;/font&gt;&lt;br /&gt; &lt;br /&gt;     EOF: null&lt;br /&gt;   &lt;font color="4444FF"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/font&gt;&lt;br /&gt; &lt;font color="4444FF"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/font&gt;()&lt;font color="4444FF"&gt;;&lt;/font&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Je to jednoduchy a citatelny idiom na ktory sa da relativne lahko zvyknut.&lt;br /&gt;&lt;a href="http://yuiblog.com/blog/2007/06/12/module-pattern/#comment-139971"&gt;(via)&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7795849673717145049-2752106466399692874?l=javaflight.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/javaflight?a=1rIBR57JImM:XLg6kiRnNE4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/javaflight?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/javaflight?a=1rIBR57JImM:XLg6kiRnNE4:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/javaflight?i=1rIBR57JImM:XLg6kiRnNE4:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/javaflight/~4/1rIBR57JImM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://javaflight.blogspot.com/feeds/2752106466399692874/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=7795849673717145049&amp;postID=2752106466399692874" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7795849673717145049/posts/default/2752106466399692874?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7795849673717145049/posts/default/2752106466399692874?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/javaflight/~3/1rIBR57JImM/obidenie-problemu-ciarky-navyse.html" title="Obidenie problemu ciarky navyse" /><author><name>Viktor Lieskovsky</name><uri>http://www.blogger.com/profile/17533444030037615808</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://s3.amazonaws.com/twitter_production/profile_images/37693262/n0ha_normal.png" /></author><thr:total>0</thr:total><feedburner:origLink>http://javaflight.blogspot.com/2007/10/obidenie-problemu-ciarky-navyse.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUIFR3Y6cCp7ImA9WB9SEEs.&quot;"><id>tag:blogger.com,1999:blog-7795849673717145049.post-7262095872083857245</id><published>2007-09-29T12:39:00.000+02:00</published><updated>2007-09-29T12:58:36.818+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2007-09-29T12:58:36.818+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="javascript" /><category scheme="http://www.blogger.com/atom/ns#" term="extjs" /><title>Ext 2.0 alpha1</title><content type="html">Vysla &lt;a href="http://extjs.com/blog/2007/09/28/ext-20-alpha-release/"&gt;prva alpha verzie 2.0&lt;/a&gt; JS frameworku ExtJS. Tato verzia pridava najma &lt;a href="http://extjs.com/deploy/ext-2.0-alpha1/examples/"&gt;vylepsenia komponentov&lt;/a&gt; ako scrollovatelne taby, groupovanie v gride, podporu stlpcov pre strom, a ine.&lt;br /&gt;&lt;br /&gt;Velmi sa zlepsilo &lt;a href="http://extjs.com/deploy/ext-2.0-alpha1/docs/"&gt;dokumentacne centrum&lt;/a&gt;, ktore je omnoho pouzitelnejsie. Jednotlive stranky sa otvaraju v taboch, pribudlo filtrovanie stromu ala Eclipse, a (konecne) permalinky.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7795849673717145049-7262095872083857245?l=javaflight.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/javaflight?a=sZ0kZ3kMhtM:OQSi5Uq963s:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/javaflight?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/javaflight?a=sZ0kZ3kMhtM:OQSi5Uq963s:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/javaflight?i=sZ0kZ3kMhtM:OQSi5Uq963s:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/javaflight/~4/sZ0kZ3kMhtM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://javaflight.blogspot.com/feeds/7262095872083857245/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=7795849673717145049&amp;postID=7262095872083857245" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7795849673717145049/posts/default/7262095872083857245?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7795849673717145049/posts/default/7262095872083857245?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/javaflight/~3/sZ0kZ3kMhtM/ext-20-alpha1.html" title="Ext 2.0 alpha1" /><author><name>Viktor Lieskovsky</name><uri>http://www.blogger.com/profile/17533444030037615808</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://s3.amazonaws.com/twitter_production/profile_images/37693262/n0ha_normal.png" /></author><thr:total>1</thr:total><feedburner:origLink>http://javaflight.blogspot.com/2007/09/ext-20-alpha1.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CU8BQXk7eyp7ImA9WB9SFU8.&quot;"><id>tag:blogger.com,1999:blog-7795849673717145049.post-7257638782084315559</id><published>2007-09-25T19:32:00.000+02:00</published><updated>2007-10-04T20:50:50.703+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2007-10-04T20:50:50.703+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="continuum" /><category scheme="http://www.blogger.com/atom/ns#" term="knihy" /><category scheme="http://www.blogger.com/atom/ns#" term="build" /><category scheme="http://www.blogger.com/atom/ns#" term="maven" /><category scheme="http://www.blogger.com/atom/ns#" term="continuous integration" /><title>Better Builds With Maven</title><content type="html">Firma &lt;a href="http://www.devzuz.com/web/guest/home"&gt;DevZuz&lt;/a&gt; ponuka knihu &lt;a href="http://www.devzuz.com/c/document_library/get_file?folderId=8&amp;name=DLFE-52.pdf"&gt;Better Builds With Maven&lt;/a&gt; od autorov &lt;a href="http://maven.apache.org/"&gt;Maven2&lt;/a&gt; zadarmo. &lt;br /&gt;&lt;br /&gt;Ak nestaci &lt;a href="http://maven.apache.org/"&gt;Maven&lt;/a&gt; na build, &lt;a href="http://www.devzuz.com/web/guest/home"&gt;DevZuz&lt;/a&gt; ponuka integrovane open-source riesenie pre build, continuous integration, dependency management a reporting: &lt;a href="http://www.devzuz.com/web/guest/products/maestro"&gt;DevZuz Maestro&lt;/a&gt; (predtym Mergere Maestro). Maestro obsahuje okrem Maven 2 &lt;a href="http://en.wikipedia.org/wiki/Continuous_integration"&gt;CI&lt;/a&gt; nastroj &lt;a href="http://maven.apache.org/continuum/"&gt;Continuum&lt;/a&gt; a repository manager &lt;a href="http://maven.apache.org/archiva/"&gt;Maven Archiva&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7795849673717145049-7257638782084315559?l=javaflight.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/javaflight?a=lWgO0gGoLBY:rfFXJJCZ9yw:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/javaflight?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/javaflight?a=lWgO0gGoLBY:rfFXJJCZ9yw:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/javaflight?i=lWgO0gGoLBY:rfFXJJCZ9yw:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/javaflight/~4/lWgO0gGoLBY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://javaflight.blogspot.com/feeds/7257638782084315559/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=7795849673717145049&amp;postID=7257638782084315559" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7795849673717145049/posts/default/7257638782084315559?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7795849673717145049/posts/default/7257638782084315559?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/javaflight/~3/lWgO0gGoLBY/better-builds-with-maven.html" title="Better Builds With Maven" /><author><name>Viktor Lieskovsky</name><uri>http://www.blogger.com/profile/17533444030037615808</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://s3.amazonaws.com/twitter_production/profile_images/37693262/n0ha_normal.png" /></author><thr:total>0</thr:total><feedburner:origLink>http://javaflight.blogspot.com/2007/09/better-builds-with-maven.html</feedburner:origLink></entry></feed>

