<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-9075525480713027828</id><updated>2011-11-23T20:27:45.400Z</updated><category term='ruby'/><category term='standards'/><category term='javascript'/><category term='software'/><category term='gems'/><category term='web'/><category term='best practice'/><category term='rails'/><title type='text'>Orban Botond's Blog</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://orbanbotond.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9075525480713027828/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://orbanbotond.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Orban Botond</name><uri>http://www.blogger.com/profile/15174135306127563444</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>17</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-9075525480713027828.post-7618922457773600875</id><published>2011-10-06T17:04:00.007+01:00</published><updated>2011-10-06T20:37:27.792+01:00</updated><title type='text'>Normalize you DB</title><content type='html'>&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;Hi everyone,&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In the last couple of days I had the opportunity to normalize a DB. :) &lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Let me show you a screenshot about a single table:&lt;/div&gt;&lt;div&gt;&lt;img src="http://4.bp.blogspot.com/-LIaIqyNfUAw/To38xwJNgDI/AAAAAAAADdI/MMTR7kEGrMI/s320/Rows.png" style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 209px;" border="0" alt="" id="BLOGGER_PHOTO_ID_5660458238341906482" /&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;As you see a lot of data is repeated across the rows. Therefore, I had some bad thoughts about those who let the DB become like this in the beginning. I didn't wanted to do it. As the moments were passing away I let the challenge to excite me. At the end I did it.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Before doing anything the total number of rows in the db was above 100000 and the size of the table was 10,5 MBytes.&lt;/div&gt;&lt;div&gt;My first step was to extract the name of the components into another table and reference them.&lt;/div&gt;&lt;div&gt;This way the size of the table decreased to 8.5 MBytes. And the new table size was 1.5 Mbyte. I earned 0.5 Mbyte, not too much, but the database was much more cleaner.&lt;/div&gt;&lt;div&gt;My second step was to transform the check/change data represented by a string into their numerical representations, this way enabling the database to be internationalized. By doing this the table size decrease to 6.2 MBytes. That means 72% of its original size and the data can be internationalized and we have all the benefits of a normalized DB schema (that means no update problems and a joy to work with).&lt;/div&gt;&lt;div&gt;&lt;img src="http://1.bp.blogspot.com/-PuXlsDBe4HI/To4CGaT3qdI/AAAAAAAADdQ/gw41BfemGb0/s320/After.png" style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 35px;" border="0" alt="" id="BLOGGER_PHOTO_ID_5660464090816424402" /&gt;&lt;/div&gt;&lt;div&gt;I also measured the speed of joins operations. Because of the normalization the same data retrieval was increased by 3 times. I put an index onto foreign keys. And the speed was just like before. :)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9075525480713027828-7618922457773600875?l=orbanbotond.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9075525480713027828/posts/default/7618922457773600875'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9075525480713027828/posts/default/7618922457773600875'/><link rel='alternate' type='text/html' href='http://orbanbotond.blogspot.com/2011/10/normalize-you-db.html' title='Normalize you DB'/><author><name>Orban Botond</name><uri>http://www.blogger.com/profile/15174135306127563444</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-LIaIqyNfUAw/To38xwJNgDI/AAAAAAAADdI/MMTR7kEGrMI/s72-c/Rows.png' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-9075525480713027828.post-21025209826316445</id><published>2011-10-06T10:52:00.006+01:00</published><updated>2011-10-06T18:19:24.009+01:00</updated><title type='text'>Design your User Interface</title><content type='html'>Hello everybody,&lt;br /&gt;&lt;br /&gt;I have just finished the book "&lt;a href="http://www.amazon.com/Design-Everyday-Things-Donald-Norman/dp/0385267746"&gt;The Design Of Everyday Things&lt;/a&gt;".&lt;br /&gt;It's a great book written by Donald Norman. The guy who wrote "&lt;a href="http://www.amazon.com/Invisible-Computer-Products-Information-Appliances/dp/0262640414/ref=sr_1_1?s=books&amp;amp;ie=UTF8&amp;amp;qid=1317915639&amp;amp;sr=1-1"&gt;The invisible computer&lt;/a&gt;", who worked for the Apple Computer's Advanced Technology Group.&lt;br /&gt;&lt;br /&gt;In this book he talks about many-many interesting things:&lt;br /&gt;-The constraints and strength of our short term &amp;amp; long term memory.&lt;br /&gt;-The slips and mistakes our brain makes, while we do things.&lt;br /&gt;-How can we make use of our cultural knowledge and knowledge in the world while design.&lt;br /&gt;-The importance of natural mapping between controls and our actions.&lt;br /&gt;-Interpretation of a system state, and our mental model about the system.&lt;br /&gt;-The (missing) evolution of product line. The evaluation of the already selled products and the importance of debriefing then evolving the product to a better one.&lt;br /&gt;&lt;br /&gt;He also describes how primitive were the computers at time of writing. &lt;div&gt;And he gives us some hints how he imagines the mobile phones should easy our everyday tasks. I had the impression the he was envisioning the nowadays iPhones. He also describes how a graphical user interface would help us to be more effective with the computer interaction. I often had the feeling that he was describing a vision which is very similar about nowadays iPads, iPhones or Microsoft Surface.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I was also symphatizing with him because I remember times when I needed to setup my Mouse and CD driver in the config.sys in order to use those devices. Nowadays everything is much more easier. Especially that, I am a Macintosh user I can spend my time focusing on relevant tasks, without even realizing that I am working.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I finished the book yesterday. After I put the book back onto my shelf I started to browse the new Apple products... They are just amazing. I was especially amazed by the new &lt;a href="http://www.apple.com/iphone/features/#siri"&gt;Siri&lt;/a&gt; feature in the iPhone. It remembers me to the "Computer" from Startreak. It is a good example that if we can imagine something then we can sooner or later achieve it. Another feature I imagined even myself and waited a lot is the iCloud. I tried the beta version by downloading Ethics from Aristotle on my Macbook and the book instantly appeared on my iphone too. :) Definetely it enhances our usability experience.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The next day, other news were expecting me. Sad news. The founder and main dreamer, envisioner and technology pioneer Steve Jobs died. So good journey Steve and rest in peace.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9075525480713027828-21025209826316445?l=orbanbotond.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9075525480713027828/posts/default/21025209826316445'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9075525480713027828/posts/default/21025209826316445'/><link rel='alternate' type='text/html' href='http://orbanbotond.blogspot.com/2011/10/design-your-user-interface.html' title='Design your User Interface'/><author><name>Orban Botond</name><uri>http://www.blogger.com/profile/15174135306127563444</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-9075525480713027828.post-2682921010501309774</id><published>2011-07-18T21:14:00.007+01:00</published><updated>2011-09-23T17:36:05.074+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rails'/><title type='text'>sqlite log filtering</title><content type='html'>Hi,&lt;br /&gt;&lt;br /&gt;Presumably a lot of you are developing rails applications using sqlite.&lt;br /&gt;In this case the log is spamed by some pesky sql statements every time our app accesses the db.&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;&lt;pre class="" style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;br /&gt; SQL (0.6ms)   SELECT name&lt;br /&gt; FROM sqlite_master&lt;br /&gt; WHERE type = 'table' AND NOT name = 'sqlite_sequence'&lt;br /&gt;  SQL (0.6ms)   SELECT name&lt;br /&gt; FROM sqlite_master&lt;br /&gt; WHERE type = 'table' AND NOT name = 'sqlite_sequence'&lt;br /&gt;... &lt;br /&gt; SQL (0.6ms)   SELECT name&lt;br /&gt; FROM sqlite_master&lt;br /&gt; WHERE type = 'table' AND NOT name = 'sqlite_sequence'&lt;br /&gt;  SQL (0.6ms)   SELECT name&lt;br /&gt; FROM sqlite_master&lt;br /&gt; WHERE type = 'table' AND NOT name = 'sqlite_sequence'&lt;br /&gt;...&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;These messages bother me because they have nothing to do with my application logic, they are only needed by the sqlite driver to access the db structure.&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;Therefore I developed a small ruby gem called &lt;a href='https://rubygems.org/gems/sqlite_log_filter'&gt;sqlite_log_filter&lt;/a&gt; which filters these messages out. The source can be found on &lt;a href="https://github.com/orbanbotond/sqlite_log_filter"&gt;github&lt;/a&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;All you need to do is to put it in your gemfile&lt;br /&gt;&lt;pre class="brush: ruby" style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;br /&gt;gem 'sqlite_log_filter'&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Then bundle it&lt;br /&gt;&lt;pre class="brush: ruby" style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;br /&gt;bundle install&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Hopefully it helps :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9075525480713027828-2682921010501309774?l=orbanbotond.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9075525480713027828/posts/default/2682921010501309774'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9075525480713027828/posts/default/2682921010501309774'/><link rel='alternate' type='text/html' href='http://orbanbotond.blogspot.com/2011/07/sqlite-log-filtering.html' title='sqlite log filtering'/><author><name>Orban Botond</name><uri>http://www.blogger.com/profile/15174135306127563444</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-9075525480713027828.post-1561975779053382532</id><published>2011-06-21T21:53:00.007+01:00</published><updated>2011-09-23T18:13:08.035+01:00</updated><title type='text'>Test (Behaviour) Driven Development</title><content type='html'>Recently I saw a pretty nice post:&lt;br /&gt;&lt;p&gt;"If you see anyone pushing code to Rails without tests, ping me and I will gladly revert. In 2011, this should be unacceptable."&lt;/p&gt;&lt;br /&gt;&lt;p&gt;I remember times when I had a project which was developed test driven at my former place of work. Of course the Test Driven initiator was me, and by time the teammates embraced the methodology and it managed to be a very successful project.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;The most exciting thing was that I never had to debug; the tests always showed me the exact the location of the problem -if there was any.&lt;br /&gt;Another almost unbelievable fact was that days before releases we didn't have any unfinished tasks. We were down on the streets having a Budweiser or limonade and we were chatting. What I mean here is that the test batteries saved us so much time that we never had to work overtime. We were just shipping the product confidently days before the planned release. I also remember some sales meetings where this project was showed to the customers as a success story. I also remember one of the questions one customer asked: "Then why don't you write software this way every time?" and the answer was "Because some customers simply dictate to not write any test at all..." Well everyone in the meeting laughed. But we all knew that this decision would cause any customer to throw out hundreds of thousand of dollars and hundreds of hours of overtime for the developers without mentioning the moral downgrade for every involved party. Maybe we were laughing at that unintelligent stereotype.&lt;br /&gt;I also remember one important fact while writing this. In the initial project schedule the testing time wasn't calculated. We simply adopted the test first and then the benefits showed themself over and over again. We couldn't run out of the schedule... :) Almost unbelievable but it was true. &lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;After the project has been finished I have tried to introduce this methodology in as many projects as I could. Unfortunately there were some projects where the mass was so frozen that my attempts were totally ignored. Sometimes the reason for ignorance was simply the lack of infrastructure. Fortunately the infrastructure is not a problem in Ruby on Rails. The community is also mostly test-centered.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;I cannot emphasize enough for every developer in any domain to embrace this Test First thinking. There are so many benefits of it that many books have been written about it. And who knows, maybe you who will embrace this approach, will have some similar success story to tell the world&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9075525480713027828-1561975779053382532?l=orbanbotond.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9075525480713027828/posts/default/1561975779053382532'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9075525480713027828/posts/default/1561975779053382532'/><link rel='alternate' type='text/html' href='http://orbanbotond.blogspot.com/2011/06/test-behaviour-driven-development.html' title='Test (Behaviour) Driven Development'/><author><name>Orban Botond</name><uri>http://www.blogger.com/profile/15174135306127563444</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-9075525480713027828.post-1180828731969160664</id><published>2011-06-20T13:18:00.012+01:00</published><updated>2011-09-23T18:24:10.651+01:00</updated><title type='text'>autotest, zentest, autotest-rails, autotest-rails-pure: which gems to choose?</title><content type='html'>&lt;p&gt;It was a little bit confusing for me which "autotest like" gems to choose when I want to autotest my rails application.&lt;br /&gt;Well... There are some alternatives depending which testing framework I choose &lt;a href="http://rspec.info/"&gt;rspec&lt;/a&gt; or &lt;a href="http://ruby-doc.org/stdlib/libdoc/test/unit/rdoc/classes/Test/Unit.html"&gt;Test::Unit&lt;/a&gt;, also there are alternatives if I want to generate the tests for my controller actions automatically with zentest or I just want to write them in some other way.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;Zentest was the first tool in this domain with a lot of features. Then &lt;a href="http://rubygems.org/gems/autotest-standalone"&gt;autotest-standalone&lt;/a&gt; was factored out from it. There is also an empty gem called &lt;a href="http://rubygems.org/gems/autotest"&gt;Autotest&lt;/a&gt; which  is dependent on Zentest.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Because the main idea is to simply map the lib and test directories, in order to test rails application we need to tell the rails specific mappings. This is done by the &lt;a href=""&gt;autotest-rails&lt;/a&gt; and &lt;a href=""&gt;rspec-rails&lt;/a&gt; and &lt;a href=""&gt;autotest-rails-pure&lt;/a&gt; gems. So let's walk through each of the alternatives&lt;/p&gt;&lt;br /&gt;&lt;h2&gt;Test::Unit&lt;/h2&gt;&lt;br /&gt;&lt;p&gt;In this case the rails specific mappings are done by the &lt;a href="http://rubygems.org/gems/autotest-rails-pure"&gt;autotest-rails-pure&lt;/a&gt; or &lt;a href="http://rubygems.org/gems/autotest-rails"&gt;autotest-rails&lt;/a&gt; gems.&lt;br /&gt;The code excerpt which makes the mapping for the controllers is:&lt;br /&gt;&lt;pre class="brush: ruby" style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;br /&gt;    add_mapping %r%^app/controllers/application_controller\.rb$% do &amp;#124;_, m&amp;#124;&lt;br /&gt;      files_matching %r%^test/(controllers&amp;#124;views&amp;#124;functional)/.*_test\.rb$%&lt;br /&gt;    end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;For the core autotest we can use  the &lt;a href="http://rubygems.org/gems/autotest-standalone"&gt;autotest-standalone&lt;/a&gt; or the feature rich old Zentest.&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Rspec&lt;/h2&gt;&lt;br /&gt;&lt;p&gt;The rails specific mapping is done by the &lt;a href="https://github.com/rspec/rspec-rails"&gt;rspec-rails&lt;/a&gt; in case we opt for using rspec&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;Here is an excerpt wich does the mapping for the controllers:&lt;br /&gt;&lt;pre class="brush: ruby" style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;    add_mapping(%r%^app/controllers/(.*)\.rb$%) { &amp;#124;_, m&amp;#124;&lt;br /&gt;      if m[1] == &amp;quot;application&amp;quot;&lt;br /&gt;        files_matching %r%^spec/controllers/.*_spec\.rb$%&lt;br /&gt;      else&lt;br /&gt;        [&amp;quot;spec/controllers/#{m[1]}_spec.rb&amp;quot;]&lt;br /&gt;      end&lt;br /&gt;    }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;So there are a plenty of alternatives we can choose from and it is good to know which opportunities are available. We have all we need :) &lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9075525480713027828-1180828731969160664?l=orbanbotond.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9075525480713027828/posts/default/1180828731969160664'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9075525480713027828/posts/default/1180828731969160664'/><link rel='alternate' type='text/html' href='http://orbanbotond.blogspot.com/2011/06/autotest-zentest-autotest-rails.html' title='autotest, zentest, autotest-rails, autotest-rails-pure: which gems to choose?'/><author><name>Orban Botond</name><uri>http://www.blogger.com/profile/15174135306127563444</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-9075525480713027828.post-4109633422734109703</id><published>2011-06-11T12:49:00.019+01:00</published><updated>2011-09-23T18:24:56.737+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='rails'/><category scheme='http://www.blogger.com/atom/ns#' term='gems'/><title type='text'>Making the Factory Girl to support Paperclip</title><content type='html'>Hi Rubysts,&lt;br /&gt;&lt;br /&gt;&lt;a href="https://github.com/thoughtbot/paperclip"&gt;Paperclip&lt;/a&gt; and &lt;a href="https://github.com/thoughtbot/factory_girl_rails"&gt;Factory Girl Rails&lt;/a&gt; both of them are my loved gems.&lt;br /&gt;Unfortunately Factory Girl Rails can't create the model if the model had been Papercliped. Well at least not in Rails 3.0.7. But the good news is that it can be solved by adding a few lines of Ruby code to our factory.&lt;br /&gt;&lt;br /&gt;This is my model:&lt;br /&gt;&lt;pre class="brush: ruby" style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;br /&gt;class Club &amp;lt; ActiveRecord::Base&lt;br /&gt;  has_many :dancers&lt;br /&gt;  has_attached_file :photo, :styles =&amp;gt; { :medium =&amp;gt; &amp;quot;300x300&amp;gt;&amp;quot;, :thumb =&amp;gt; &amp;quot;100x100&amp;gt;&amp;quot; }&lt;br /&gt;  validates_attachment_presence :photo&lt;br /&gt;  validates_attachment_size :photo, :less_than =&amp;gt; 1.megabytes&lt;br /&gt;end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;So in order to use the factory with ease we need to tell our factory to upload some pictures into our model.&lt;br /&gt;Therefore let me show you an example how to write the factory which makes the two gems to co-work:&lt;br /&gt;&lt;pre class="brush: ruby" style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;br /&gt;include ActionDispatch::TestProcess&lt;br /&gt;&lt;br /&gt;class Club&lt;br /&gt;  attr_accessor :photo_file_name&lt;br /&gt;  attr_accessor :photo_file_size&lt;br /&gt;  has_attached_file :photo, :styles =&amp;gt; { :medium =&amp;gt; &amp;quot;300x300&amp;gt;&amp;quot;, :thumb =&amp;gt; &amp;quot;100x100&amp;gt;&amp;quot; },&lt;br /&gt;                    :url  =&amp;gt; &amp;quot;/test_can_be_deleted/:attachment/:id/:style/:filename&amp;quot;,&lt;br /&gt;                    :path =&amp;gt; &amp;quot;:rails_root/public/test_can_be_deleted/:attachment/:id/:style/:filename&amp;quot;&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;Factory.define :club do &amp;#124;c&amp;#124;&lt;br /&gt;  c.title 'Limpex'&lt;br /&gt;  c.sefurl 'Limpasm'&lt;br /&gt;  c.name  'Limpasm'&lt;br /&gt;  c.metadescription 'good etc'&lt;br /&gt;  c.content '&amp;lt;p&amp;gt; a good place&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;the icecream is prety damn good&amp;lt;/p&amp;gt;'&lt;br /&gt;  c.state 0&lt;br /&gt;  c.city 'Gheorgheni'&lt;br /&gt;  c.email 'some@somplexx.com'&lt;br /&gt;  c.photo   { fixture_file_upload( 'spec/factories/test.png', 'image/png') }&lt;br /&gt;end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;As you can observe I have just reopened my model and have redefined the paperclip attachment to point to a different path in order to store the dev and test mode attachments in different places.&lt;br /&gt;&lt;br /&gt;That's it. :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9075525480713027828-4109633422734109703?l=orbanbotond.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9075525480713027828/posts/default/4109633422734109703'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9075525480713027828/posts/default/4109633422734109703'/><link rel='alternate' type='text/html' href='http://orbanbotond.blogspot.com/2011/06/making-factory-girl-to-support.html' title='Making the Factory Girl to support Paperclip'/><author><name>Orban Botond</name><uri>http://www.blogger.com/profile/15174135306127563444</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-9075525480713027828.post-675912488668825324</id><published>2011-01-26T22:14:00.005Z</published><updated>2011-09-23T18:31:29.526+01:00</updated><title type='text'>The missing event when the mouse stays in a place</title><content type='html'>Hello everybody,&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I just released a &lt;a href="http://jquery.com"&gt;jquery&lt;/a&gt; plugin which detects if the mouse stays in a place for more than the specified period of millisecs.&lt;/div&gt;&lt;div&gt;I was missing this functionality and I also needed more than twice and :) I needed also in the past so finally I decided to extract as a reusable plugin.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;You can download it from here:&lt;/div&gt;&lt;div&gt;&lt;a href="https://github.com/orbanbotond/mouseStay"&gt;https://github.com/orbanbotond/mouseStay&lt;/a&gt;&lt;/div&gt;&lt;div&gt;or here:&lt;/div&gt;&lt;div&gt;&lt;a href="http://plugins.jquery.com/project/mousestay"&gt;http://plugins.jquery.com/project/mousestay&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;It is easy to use as any other jquery thing. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Enjoy :)&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9075525480713027828-675912488668825324?l=orbanbotond.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9075525480713027828/posts/default/675912488668825324'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9075525480713027828/posts/default/675912488668825324'/><link rel='alternate' type='text/html' href='http://orbanbotond.blogspot.com/2011/01/missing-event-when-mouse-stays-in-place.html' title='The missing event when the mouse stays in a place'/><author><name>Orban Botond</name><uri>http://www.blogger.com/profile/15174135306127563444</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-9075525480713027828.post-6828090249396559239</id><published>2010-10-17T10:10:00.017+01:00</published><updated>2011-09-23T18:37:31.466+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='rails'/><title type='text'>Unobtrusive In PlaceEditor for Rails3</title><content type='html'>Hello everyone,&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;It's been one and half month since Rails3 came out and  it evolvolved a lot if we compare it to Rails2. This direction of  evolution makes me happy.&lt;/div&gt;&lt;div&gt;The topic I want to write about is related to the &lt;a href="http://rubyonrails.org/"&gt;Rails3&lt;/a&gt; way of unobtrusive Javascript. To be more specific I want to show you a way  how to make the &lt;a href="http://wiki.github.com/madrobby/scriptaculous/ajax-inplaceeditor"&gt;scriptaculous&lt;/a&gt;' in place editor unobtrusive. &lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="white-space: normal; "&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;The idea: wouldn't it be nice if by adding some extra attributes to some html tag the displayed entity fields would become spontaneously editable?&lt;/div&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&amp;lt;p id="&amp;lt;%= project.id %&amp;gt;_project_content"&lt;br /&gt;  data-in-place-editable="true"&lt;br /&gt;  data-entity="project"&lt;br /&gt;  data-field="content"&lt;br /&gt;  &amp;gt;&amp;lt;%= project.content %&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;div&gt;I think it definitely would. &lt;/div&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So let's start with it.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;Let's suppose that we have a restfull resource called &lt;b&gt;project&lt;/b&gt; and we want an in place editor in our view which is bind to the update method of our &lt;b&gt;ProjectsController&lt;/b&gt;.&lt;/div&gt;&lt;div&gt;First thing you need to do is to check out the &lt;a href="http://github.com/orbanbotond/Fast-In-Place-Editor."&gt;http://github.com/orbanbotond/Fast-In-Place-Editor.&lt;/a&gt; into your public/javascript directory of your project.&lt;/div&gt;&lt;div&gt;This file contains the generic repetitive mundane line's of code which would otherwise been repeated field by field in your view.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;In your layout file you need to include this javascript:&lt;/div&gt;&lt;code&gt;&lt;br /&gt;&amp;lt;%= javascript_include_tag "myextensions/fast_in_place_editor.js" %&amp;gt;&lt;/code&gt;&lt;br /&gt;&lt;div&gt;&lt;div&gt;    &lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;In your view add some extra attributes to the tag which displays your entity's fields. Let's say this is how you were displaying the content of a project: &lt;/div&gt;&lt;code&gt;&lt;br /&gt;&amp;lt;p id="&amp;lt;%= project.id %&amp;gt;_project_content"&amp;gt;&amp;lt;%= project.content %&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;div&gt; &lt;/div&gt;&lt;div&gt;In order to make the content in place editable do this:&lt;/div&gt;&lt;code&gt;&lt;br /&gt;&amp;lt;p id="&amp;lt;%= project.id %&amp;gt;_project_content"&lt;br /&gt;  data-in-place-editable="true"&lt;br /&gt;  data-entity="project"&lt;br /&gt;  data-field="content"&lt;br /&gt;  data-url="&amp;lt;%= project_path(project, :authenticity_token =&amp;gt; form_authenticity_token) %&amp;gt;"&lt;br /&gt;  data-cols="60"&lt;br /&gt;  data-rows="6"&lt;br /&gt;  &amp;gt;&amp;lt;%= project.content %&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;div&gt;And that's all you need to do.&lt;/div&gt;&lt;div&gt;Enjoy :)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9075525480713027828-6828090249396559239?l=orbanbotond.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9075525480713027828/posts/default/6828090249396559239'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9075525480713027828/posts/default/6828090249396559239'/><link rel='alternate' type='text/html' href='http://orbanbotond.blogspot.com/2010/10/unobtrusive-in-placeeditor-for-rails3.html' title='Unobtrusive In PlaceEditor for Rails3'/><author><name>Orban Botond</name><uri>http://www.blogger.com/profile/15174135306127563444</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-9075525480713027828.post-1657780614274177625</id><published>2009-12-06T21:45:00.022Z</published><updated>2011-09-23T19:07:08.570+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rails'/><title type='text'>A Click Heat Map plugin for ruby on rails applications</title><content type='html'>Hi Rubysts,&lt;br /&gt;&lt;br /&gt;I've just finished my &lt;a href="http://github.com/orbanbotond/click_heat_map"&gt;&lt;span style="font-weight: bold;"&gt;first contribution&lt;/span&gt;&lt;/a&gt; to the Ruby on Rails community this evening.&lt;br /&gt;This contribution is actually the repackaging of &lt;a href="http://blog.codynamix.com/2009/04/21/cannoli-a-ruby-on-rails-click-heatmaps-generator/"&gt; the click heat map generator&lt;/a&gt; included within &lt;a href="http://github.com/rosario/cannoli"&gt;cannoli&lt;/a&gt; into an easy-to-install and deploy &lt;a href="http://wiki.github.com/orbanbotond/click_heat_map"&gt;ruby on rails plugin.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;If you take a look at cannoli you observe that it is based on ruwa web analytic ruby on rails app. I didn't need all of these together.&lt;br /&gt;So... Did I manage to do something better? I believe that it is only rarely the case for something to be in every aspects better  than something different. In this particular case I would say that I have made a piece of ruby on rails building block which is less than cannoli but it can be extremely easily incorporated in your Rails ( &gt;2.3.2 ) application.&lt;br /&gt;&lt;br /&gt;It has it's own requirements:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;you need Rmagick installed&lt;/li&gt;&lt;li&gt;you must have Rails 2.3.2&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Maybe you want to improve your sites web usability.&lt;br /&gt;In order to install the plugin:&lt;ul&gt;&lt;li style="font-family:courier new;"&gt;&lt;pre&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:courier new;"&gt;./script/plugin install git://github.com/orbanbotond/click_heat_map.git&lt;/span&gt;&lt;span style="font-family:Georgia,serif;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/li&gt;&lt;/ul&gt;From the click_heat_map plugin directory (not from rails root)&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;pre&gt;&lt;span style="font-family:courier new;"&gt;rake db:migrate:click_heat_map&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/li&gt;&lt;/ul&gt;Then you need to put and adapt this code into your templates:&lt;blockquote&gt;&lt;div class="line" id="LC22"&gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC23"&gt;&lt;span style="font-size:85%;"&gt;    &lt; src="'/javascripts/overlay.js'" type="'text/javascript'"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC24"&gt;&lt;span style="font-size:85%;"&gt;  &lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC25"&gt;&lt;span style="font-size:85%;"&gt;    &lt; src="'/javascripts/clickmap.js'" type="'text/javascript'"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC26"&gt;&lt;span style="font-size:85%;"&gt;  &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;put this html code into your templates you want to measure:&lt;/div&gt;&lt;/blockquote&gt;&lt;div class="line" id="LC26"&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;span style="font-size:100%;"&gt;&lt; id="prova" style="margin:auto;width:800px;height:1px;"&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;br /&gt;And finally, you reached the point where you want to deploy your rails app using capistrano.&lt;br /&gt;Maybe you ask yourself how capistrano knows how to migrate your plugin to the remote server.&lt;br /&gt;Well...&lt;br /&gt;In my case I put the installed plugin under version control and Capistrano just copied to the remote server.&lt;br /&gt;I also created a file named&lt;br /&gt;&lt;span style="font-size:85%;"&gt;20091130000000_create_heat_map_clicks.rb:&lt;/span&gt;&lt;blockquote&gt;&lt;span style="font-size:85%;"&gt;require 'vendor/plugins/click_heat_map/lib/db/migrate/20091130000000_create_heat_map_clicks.rb'&lt;/span&gt;&lt;br /&gt;&lt;/blockquote&gt;This way capistrano creates the tables needed by the plugin on the remote server by running "&lt;span style="font-size:100%;"&gt;cap deploy:migrations&lt;/span&gt;".&lt;br /&gt;&lt;br /&gt;Finally the result makes me happy :)&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_try_go5RuEY/SxxHiTIhlNI/AAAAAAAADB4/hRTj_Jhzq6U/s1600-h/Screen+shot+2009-12-07+at+1.08.21+AM.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 384px; height: 238px;" src="http://1.bp.blogspot.com/_try_go5RuEY/SxxHiTIhlNI/AAAAAAAADB4/hRTj_Jhzq6U/s320/Screen+shot+2009-12-07+at+1.08.21+AM.png" alt="" id="BLOGGER_PHOTO_ID_5412279506769646802" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9075525480713027828-1657780614274177625?l=orbanbotond.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9075525480713027828/posts/default/1657780614274177625'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9075525480713027828/posts/default/1657780614274177625'/><link rel='alternate' type='text/html' href='http://orbanbotond.blogspot.com/2009/12/click-heat-map-plugin-for-ruby-on-rails.html' title='A Click Heat Map plugin for ruby on rails applications'/><author><name>Orban Botond</name><uri>http://www.blogger.com/profile/15174135306127563444</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_try_go5RuEY/SxxHiTIhlNI/AAAAAAAADB4/hRTj_Jhzq6U/s72-c/Screen+shot+2009-12-07+at+1.08.21+AM.png' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-9075525480713027828.post-1110259973104966198</id><published>2009-11-04T15:37:00.008Z</published><updated>2011-09-23T19:13:28.480+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><title type='text'>A quick fix for swfir and prototype incompatibility</title><content type='html'>&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;Hi,&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Some of you might know about a small and smart library called &lt;b&gt;&lt;a href="http://www.swfir.com/"&gt;swfir&lt;/a&gt;&lt;/b&gt;. This library intends to extend some of the limitations of classic html images. It can rotate the images and it can draw some fancy borders and fancy shadows around the borders and so on. I like the library despite the fact that it's not perfect. It's not compatible with &lt;a href="http://www.prototypejs.org/api"&gt;prototype&lt;/a&gt;. :(&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Here is a small patch that I posted to the authors and hopefully a new release will come out which will support prototype :)&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Untill then you can use the patch from here:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size:small;"&gt;@@ -569,7 +569,11 @@&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size:small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size:small;"&gt;    &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size:small;"&gt;Flash Vars&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size:small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size:small;"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size:small;"&gt;*/&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size:small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size:small;"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size:small;"&gt;var varString = "";&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size:small;"&gt;-&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size:small;"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size:small;"&gt;for(va&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size:small;"&gt;r key in this.params){ varString += ("&amp;amp;"+key+'='+ this.params[key]); }&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size:small;"&gt;+&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size:small;"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size:small;"&gt;for(var key in this.params){&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size:small;"&gt;+&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size:small;"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size:small;"&gt;  if("function" != typeof(this.params[key])){&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size:small;"&gt;+  &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size:small;"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size:small;"&gt;  varString += ("&amp;amp;"+key+'='+ this.params[key]);  &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size:small;"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size:small;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size:small;"&gt;+  &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size:small;"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size:small;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size:small;"&gt;+&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size:small;"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size:small;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt; &lt;span class="Apple-tab-span" style="white-space:pre"&gt;   &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;Rendering before:&lt;/div&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 283px; height: 320px;" src="http://4.bp.blogspot.com/_try_go5RuEY/SvGj2rsOoZI/AAAAAAAADAw/aHZTIFSjya8/s320/Before.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5400277588030431634" /&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Rendering after:&lt;/div&gt;&lt;div&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 282px; height: 320px;" src="http://4.bp.blogspot.com/_try_go5RuEY/SvGkGdhXI1I/AAAAAAAADA4/xkGwAnWQfhg/s320/After.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5400277859104662354" /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9075525480713027828-1110259973104966198?l=orbanbotond.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9075525480713027828/posts/default/1110259973104966198'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9075525480713027828/posts/default/1110259973104966198'/><link rel='alternate' type='text/html' href='http://orbanbotond.blogspot.com/2009/11/quick-fix-for-swfir-and-prototype.html' title='A quick fix for swfir and prototype incompatibility'/><author><name>Orban Botond</name><uri>http://www.blogger.com/profile/15174135306127563444</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_try_go5RuEY/SvGj2rsOoZI/AAAAAAAADAw/aHZTIFSjya8/s72-c/Before.png' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-9075525480713027828.post-9071182957332560784</id><published>2008-09-10T00:19:00.012+01:00</published><updated>2011-09-25T19:48:58.440+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='best practice'/><title type='text'>Subversion 1.5.2</title><content type='html'>Hi all,&lt;br /&gt;&lt;br /&gt;It's a long time I haven't written about anything.&lt;br /&gt;&lt;br /&gt;Yesterday I reinstalled the latest (1.5.2) svn onto my leopard. It was a challenge for me to install from source into the right place: /usr/bin;/usr/lib. This way I have only one svn on my machine the latest (actually the best) one :).&lt;br /&gt;&lt;br /&gt;There is a new &lt;a href="http://subversion.tigris.org/svn_1.5_releasenotes.html#merge-tracking"&gt;feature&lt;/a&gt; I have wait a lot. It makes software development easier when I want to try something unusual on another branch, and finally want to reintegrate into my trunk.&lt;br /&gt;It is much easier to handle than the old method for merging:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;&lt;blockquote&gt;&lt;span style="font-weight: bold;"&gt;svn merge --reintegrate http://tralalala/branches/3&lt;/span&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;/span&gt;Here are the steps needed to install it:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Download the sources &lt;a href="http://subversion.tigris.org/downloads/subversion-1.5.2.tar.gz"&gt;svn&lt;/a&gt; and &lt;a href="http://subversion.tigris.org/downloads/subversion-deps-1.5.2.tar.gz"&gt;svn-dep&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;/configure CFLAGS='-arch x86_64' APXSLDFLAGS='-arch x86_64' --with-ssl --with-sasl=/usr/lib --prefix=/usr &gt;c.out&lt;/li&gt;&lt;li&gt;make&lt;/li&gt;&lt;li&gt;make check (this is optionally, however I like to see all the tests passed :))&lt;br /&gt;&lt;/li&gt;&lt;li&gt;sudo make install&lt;/li&gt;&lt;/ul&gt;I installed with neon because I wanted to add http repository access. Here are the steps which need to be performed right after download if you want to compile with neon:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Move neon from svn-dep into the unpacked svn directory. This way even neon will be compiled and installed with svn.&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/9075525480713027828-9071182957332560784?l=orbanbotond.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://orbanbotond.blogspot.com/feeds/9071182957332560784/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9075525480713027828&amp;postID=9071182957332560784' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9075525480713027828/posts/default/9071182957332560784'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9075525480713027828/posts/default/9071182957332560784'/><link rel='alternate' type='text/html' href='http://orbanbotond.blogspot.com/2008/09/hi-all-its-long-time-i-havent-written.html' title='Subversion 1.5.2'/><author><name>Orban Botond</name><uri>http://www.blogger.com/profile/15174135306127563444</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9075525480713027828.post-5367627361431570609</id><published>2008-02-13T09:54:00.035Z</published><updated>2011-09-25T19:50:35.429+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><title type='text'>Upload progress bar by streaming JSON</title><content type='html'>Have you ever dealt with the problem of making an upload progress bar?&lt;div&gt;&lt;div&gt;If you did, then it's time to continue reading.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I wanted to make one using javascript.&lt;/div&gt;&lt;div&gt;Basically, there are two alternatives:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;The simpler one is to make periodic ajax requests to a url. That url must return the received_size/ total_size pair. All you need to do is to update your progress bar in the browser. This solution works in all those browsers which support AJAX. The disadvantage is that the browser will usually receive the (received_size/totoal_size) data pair delayed. So the progress bar won't show you the real progress.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;The second option would be to use streaming. Instead of periodically polling the server, we should make one single request, and the server would stream the receive_size/total_pair data back to the browser.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;I like this streaming alternative much more because it gives you a better UI experience.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Let me give you some hints on the streaming alternative.&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;The simplest and the secure way is to stream sequences of '&amp;lt;&lt;span class="Apple-style-span" style=" ;font-family:'courier new';"&gt;script type='text/javascript'&amp;gt;updateProgressBar(total, received)&amp;lt;/script&amp;gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family:'times new roman';"&gt;' back to the browser.&lt;/span&gt;&lt;span class="Apple-style-span" style=" ;font-family:'times new roman';"&gt; The returned javascript will be automatically executed in IE 6.0, Firefox, Safari and Opera. You can find a solution for this at &lt;a href="http://four.livejournal.com/747302.html"&gt;Ry Dahl's&lt;/a&gt; article. However it works in a lot of browsers it's not the most elegant solution because you need to hardcode &lt;/span&gt;&lt;span class="Apple-style-span" style=" ;font-family:'times new roman';"&gt;&lt;span class="Apple-style-span" style=" ;font-family:'courier new';"&gt;updateProgressBar&lt;/span&gt; in the server configuration file. &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family:'times new roman';"&gt;A little bit more elegant solution is to stream JSON expression like &lt;span class="Apple-style-span" style="font-family:'courier new';"&gt;{"total_size": 10, "received_size": 0};  {"total_size": 10, "received_size": 1};  {"total_size": 10, "received_size": 2}; ... &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span class="Apple-style-span" style=" ;font-family:'times new roman';"&gt;If you are streaming JSON expressions you need to write a javascript function which updates the progress bar according to the last JSON slice.&lt;/span&gt; &lt;span class="Apple-style-span" style=" ;font-family:'times new roman';"&gt;You can do this using &lt;a href="http://s3.amazonaws.com/four.livejournal/ajax_pull-0.1.zip"&gt;this javascript&lt;/a&gt; utility. This script periodically checks the received content and calls your &lt;span class="Apple-style-span" style=" ;font-family:'courier new';"&gt;updateProgressBar&lt;/span&gt; function passing the last received JSON slice to it. Unfortunately this script doesn't works with the &lt;a href="http://www.prototypejs.org/"&gt;latest prototype&lt;/a&gt; library.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style=" ;font-family:'times new roman';"&gt;The shortest and the most elegant alternative is to use the "&lt;/span&gt;&lt;span class="Apple-style-span" style=" ;font-family:'courier new';"&gt;&lt;a href="http://www.prototypejs.org/api/ajax/options"&gt;onInteractive&lt;/a&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style=" ;font-family:'times new roman';"&gt;" AJAX callback function. By using this callback we don't need to periodically check the response. It is called every time when new data arrives to the browser.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family:'times new roman';"&gt;Look at this beautifull code:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family:'times new roman';"&gt;&lt;span class="Apple-style-span" style="font-size:small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size:small;"&gt; new Ajax.Request('/upload/progress', {&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size:small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size:small;"&gt;pos :0,&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size:small;"&gt;    onInteractive: function(obj) {&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size:small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size:small;"&gt;    var slice = obj['responseText'].slice(this.pos)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size:small;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size:small;"&gt;var jsonFormat = slice.substring(0,slice.length - 2);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size:small;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size:small;"&gt;var json = jsonFormat.evalJSON();&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size:small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size:small;"&gt;  &lt;/span&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="font-size:small;"&gt;updataProgressBar(&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="font-size:small;"&gt;json.totalSize, json.receivedSize);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size:small;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size:small;"&gt;this.pos = obj['responseText'].length + 1;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;span class="Apple-style-span" style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size:small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size:small;"&gt;},&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family:'times new roman';"&gt;&lt;span class="Apple-style-span" style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size:small;"&gt;  });&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family:'times new roman';"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family:'times new roman';"&gt;Unfortunately this callback doesn't work in Opera neither in IE.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family:'times new roman';"&gt;And I didn't find any w3 recommendation for enforcing the browsers to implement it. :(&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family:'times new roman';"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family:'times new roman';"&gt;Let me summarize the opportunities and how are they supported on different browsers:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family:'times new roman';"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family:'times new roman';"&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family:'times new roman';"&gt;&lt;/span&gt;&lt;/div&gt;&lt;table width="100%" border="1" style="color:rgb(230,230,230); background-color:rgb(230,230,230);"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;th&gt;&lt;/th&gt;&lt;th&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 51);"&gt;Opera latest&lt;/span&gt;&lt;/th&gt;&lt;th&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 51);"&gt;Firefox 2.0.0.2&lt;/span&gt;&lt;/th&gt;&lt;th&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 51);"&gt;Webkit&lt;/span&gt;&lt;/th&gt;&lt;th&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 51);"&gt;Safari&lt;/span&gt;&lt;/th&gt;&lt;th&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 51);"&gt;IE 6&lt;/span&gt;&lt;/th&gt;&lt;th&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 51);"&gt;IE 7&lt;/span&gt;&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 51);"&gt;Periodic Ajax calls&lt;/span&gt;&lt;/th&gt;&lt;td&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 51);"&gt;ok&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 51);"&gt;ok&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 51);"&gt;ok&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 51);"&gt;ok&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 51);"&gt;ok&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 51);"&gt;ok&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 51);"&gt;Streaming &amp;lt;script&amp;gt; tags&lt;/span&gt;&lt;/th&gt;&lt;td&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 51);"&gt;ok&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 51);"&gt;ok&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 51);"&gt;ok&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 51);"&gt;ok&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 51);"&gt;ok&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 51);"&gt;ok&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 51);"&gt;Streaming JSON, using Ry's javascript&lt;/span&gt;&lt;/th&gt;&lt;td&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 51);"&gt;ok&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 51);"&gt;ok&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 51);"&gt;ok&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 51);"&gt;ok&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 51);"&gt;not working&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 51);"&gt;not working&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 51);"&gt;Streaming JSON, using onInteraction&lt;/span&gt;&lt;/th&gt;&lt;td&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 51);"&gt;not working&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 51);"&gt;ok&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 51);"&gt;ok&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 51);"&gt;not working&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 51);"&gt;not working&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 51);"&gt;not working&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family:'times new roman';"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family:'times new roman';"&gt;So I need to keep up hacking till AJAX standard is born and implemented... :))&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9075525480713027828-5367627361431570609?l=orbanbotond.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9075525480713027828/posts/default/5367627361431570609'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9075525480713027828/posts/default/5367627361431570609'/><link rel='alternate' type='text/html' href='http://orbanbotond.blogspot.com/2008/02/upload-progress-bar-by-streaming-json.html' title='Upload progress bar by streaming JSON'/><author><name>Orban Botond</name><uri>http://www.blogger.com/profile/15174135306127563444</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-9075525480713027828.post-6322340648843981804</id><published>2008-02-02T21:36:00.001Z</published><updated>2011-09-25T19:55:10.167+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='software'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><title type='text'>Social Networking Softwares</title><content type='html'>&lt;div style="text-align: justify;"&gt;I received an invitation to a "social network" software from India not long time ago.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;I always subcribe to these software at least to check what are they capable of. I also like to observe the Darwinian evolution of software.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;This software made me upset right in the first turn. It didn't harvest my relationships organically like &lt;a href="http://www.facebook.com/"&gt;FACEBOOK&lt;/a&gt; but it wanted to record my relationships using my Gmail contacts by borrowing my Gmail password. I didn't have any other choice if I wanted to see the web-app running, however borrowing my Gmail password was very suspicious to me. In the next step it enlisted all my Gmail contacts. There was a tiny checkbox to send the invitation to all of them or not. I didn't want to invite anybody to this social network, all I wanted to do is to check what it offers. Therefore I've unchecked the checkbox and went to the next page. Well... The service didn't offer me any excepcionally good quality. It was nothing to learn. So it didn't worth borrowing my precious Gmail password. For the sake of security I changed my Gmail password promptly.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;I was surprized when many of my friends sent me a message in the next few days that they don't want to subscribe to this at all, nevertheless I unchecked the invitation checkbox. There were some of them who thought that this software is a &lt;span class="Apple-style-span" style="font-weight: bold;"&gt;VIRUS&lt;/span&gt;. Well I've &lt;span class="Apple-style-span" style="font-weight: bold;"&gt;unregistered&lt;/span&gt; myself from this "social networking" &lt;span class="Apple-style-span" style="font-weight: bold;"&gt;immediately&lt;/span&gt;. &lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Well... This happens when a software harvests its users in an agressive manner rather than adapting the strategy to grow organically. The problem with it is that even sometimes even those people will be harvested who are not even my friends (I send them only one or two email messages in my whole life). So my "social network" will contain some foreign people to.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;This precious information is now free and available for everyone, thanks to these softwares. But sometimes they also contain false relationships :)&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9075525480713027828-6322340648843981804?l=orbanbotond.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9075525480713027828/posts/default/6322340648843981804'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9075525480713027828/posts/default/6322340648843981804'/><link rel='alternate' type='text/html' href='http://orbanbotond.blogspot.com/2008/02/social-networking-softwares.html' title='Social Networking Softwares'/><author><name>Orban Botond</name><uri>http://www.blogger.com/profile/15174135306127563444</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-9075525480713027828.post-9000509558508240983</id><published>2008-01-17T22:11:00.002Z</published><updated>2011-09-25T19:58:00.032+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rails'/><title type='text'>Ruby on Rails productivity</title><content type='html'>I was always amazed by the productivity of &lt;a href="http://www.ruby-lang.org/en/"&gt;ruby&lt;/a&gt; language. Specially by the development infrastructure of rails. I wanted to check it and specially to measure it.&lt;div&gt;&lt;br /&gt;&lt;div&gt;Therefore, I decided to implement something which was already implemented in other languages before using other infrastructure. This happens in our industry very rarely.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I started to implement the payroll system described in the book &lt;a href="http://www.amazon.com/Software-Development-Principles-Patterns-Practices/dp/0135974445"&gt;Agile Software Development&lt;/a&gt;. Originally the payroll system was written in C++ and consist of about 3300 LOC. I implemented the first iteration in ruby writing only 383 LOC including even the test code. I was very surprised. :)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;And why did I use &lt;a href="http://www.rubyonrails.org/"&gt;rails&lt;/a&gt;? Ruby would have been enough.&lt;/div&gt;&lt;div&gt;Simply because it has a very effective development environment.&lt;/div&gt;&lt;div&gt;I used migrate files for creating the relational DB, fixtures for setting up the preconditions for testing, &lt;a href="http://www.zenspider.com/ZSS/Products/ZenTest/"&gt;zentest&lt;/a&gt; as devil's advocate, and rake for a lot.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;What about the benefits:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;it was fun, easy, and very interactive&lt;/li&gt;&lt;li&gt;I've got fast feedback from zentest&lt;/li&gt;&lt;li&gt;all the O/R mapping was already done&lt;/li&gt;&lt;li&gt;learned a lot along the journey&lt;/li&gt;&lt;li&gt;During the development I was happiest ever&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Keep smiling :)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9075525480713027828-9000509558508240983?l=orbanbotond.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9075525480713027828/posts/default/9000509558508240983'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9075525480713027828/posts/default/9000509558508240983'/><link rel='alternate' type='text/html' href='http://orbanbotond.blogspot.com/2008/01/ruby-on-rails-productivity.html' title='Ruby on Rails productivity'/><author><name>Orban Botond</name><uri>http://www.blogger.com/profile/15174135306127563444</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-9075525480713027828.post-4632781819921244062</id><published>2008-01-12T17:12:00.001Z</published><updated>2011-09-25T20:01:19.417+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='standards'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><title type='text'>World of Standards</title><content type='html'>&lt;div&gt;I saw an interesting post in &lt;a href="http://www.google.com/reader"&gt;my feed reader&lt;/a&gt; today about the fact that the IE8 passes the &lt;a href="http://www.webstandards.org/files/acid2/test.html"&gt;Acid2&lt;/a&gt; test.&lt;/div&gt;&lt;div&gt;I ran the test myself immediately using my installed browsers. I was surprised that firefox didn't pass the test but I was very happy that Safari and Webkit both passed.&lt;/div&gt;&lt;div&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_try_go5RuEY/R4lJPFgDP1I/AAAAAAAAB6A/uv66jtDDyII/s200/Acid2.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5154731772025716562" /&gt;&lt;/div&gt;&lt;div&gt; &lt;/div&gt;&lt;div&gt; &lt;/div&gt;&lt;div&gt; &lt;/div&gt;&lt;div&gt; &lt;/div&gt;&lt;div&gt;The whole test is &lt;span class="Apple-style-span" style="font-weight: bold;"&gt;just about&lt;/span&gt; displaying a simple smily face correctly, isn't it?&lt;/div&gt;&lt;div&gt;Taking a closer look what is &lt;a href="http://www.webstandards.org/action/acid2/guide/"&gt;inside&lt;/a&gt; the test I was surprised how many small details are tested.&lt;/div&gt;&lt;div&gt;They also test some seldom used great css features like the &lt;a href="http://www.w3.org/TR/CSS21/generate.html"&gt;generated content,&lt;/a&gt; &lt;a href="http://www.w3.org/TR/CSS21/tables.html"&gt;css tables&lt;/a&gt;, &lt;a href="http://www.w3.org/TR/CSS21/selector.html#child-selectors"&gt;child selectors&lt;/a&gt;to name just a few one.&lt;/div&gt;&lt;div&gt;The guys there simply made a brilliant job for the web community.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I am anxious to try the next Acid test. :)&lt;/div&gt;&lt;div&gt; &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9075525480713027828-4632781819921244062?l=orbanbotond.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9075525480713027828/posts/default/4632781819921244062'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9075525480713027828/posts/default/4632781819921244062'/><link rel='alternate' type='text/html' href='http://orbanbotond.blogspot.com/2008/01/world-of-standards.html' title='World of Standards'/><author><name>Orban Botond</name><uri>http://www.blogger.com/profile/15174135306127563444</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_try_go5RuEY/R4lJPFgDP1I/AAAAAAAAB6A/uv66jtDDyII/s72-c/Acid2.jpg' height='72' width='72'/></entry><entry><id>tag:blogger.com,1999:blog-9075525480713027828.post-8828990177734319514</id><published>2007-12-15T11:41:00.002Z</published><updated>2011-09-25T20:03:26.019+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='best practice'/><title type='text'>Webapplication testing like  a Lego story</title><content type='html'>&lt;div style="text-align: justify;"&gt;Once I have got the chance to challenge the joys and woes of testing a Webapplication.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="text-align: justify;"&gt;I started the whole thing trying out &lt;a href="http://httpunit.sourceforge.net/"&gt;HttpUnit&lt;/a&gt;/&lt;a href="http://htmlunit.sourceforge.net/"&gt;HtmlUnit&lt;/a&gt; and &lt;a href="http://www.openqa.org/selenium/"&gt;Selenium&lt;/a&gt; to experience which one is better for me.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;I decided to use Selenium because it uses a real browser for clicking throughout the UI, therefore if the UI works driven by tests it will work in the hands of human users too.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;I used the &lt;a href="http://www.openqa.org/selenium-ide/"&gt;Selenium IDE&lt;/a&gt; to create my initial test cases and I saved them as Java test cases. Later as the number of &lt;a href="http://www.junit.org/"&gt;test cases&lt;/a&gt; increased the same Selenium IDE generated java code appeared across several test cases. I &lt;a href="http://www.refactoring.com/"&gt;refactored&lt;/a&gt; those repeating code until I had &lt;a href="http://en.wikipedia.org/wiki/Don't_repeat_yourself"&gt;only one&lt;/a&gt; helper method for handling the UI elements. From then on writing test cases was like playing Lego in my childhood, except that instead of using the Lego brick I used the methods in my helpers. The number of test cases has grown to a few hundred in one month. Well, playing Lego becomes boring after a certain amount of time. &lt;/div&gt;&lt;div style="text-align: justify;"&gt;Fortunately I faced another challenge.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;I needed to check if handling the mandatory fields, on forms works or not. Therefore I started to play with my lego set again. After writing the second test case I saw that they are almost identical. Hm... I decided to build a generic machine for testing those forms. In two weeks the machine was up and running and every form was well tested (around 300 cases).&lt;/div&gt;&lt;div style="text-align: justify;"&gt;In the meantime the way how the requirements were defined for the mandatory fields had changed from text based sentences into a big matrix. Usually changing letters in matrixes are much more easier than rewriting whole sentences right? So the requirements/matrix changed on every two-three days. All I needed to do was to change one or more letters from "r" to "m" in my test case to support those changes. Yes, my machine was data driven. Not to bad from a Lego system. :)&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;That was the funny part for a developer like me who was asked to test a web ui.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;The whole thing was still under development and fine tuning. Therefore, I wanted to put those tests to check the ui every day automatically. The machine which was given to me for daily regression testing was  running linux. It was placed somewhere maybe without a monitor and a keyboard.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Well, my idea was to test it under firefox but I was constrained to use only the text console. Hm... How those two fit together. Fortunately I got a hint from a friend to use a virtual display.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;I used the &lt;a href="http://en.wikipedia.org/wiki/Xvfb"&gt;Xvfb&lt;/a&gt; for the virtual display.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;In this way the cron job could launch the test cases which could open a running fully functional firefox and the webapplication was tested every day. :)&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Well, in the beginning I &lt;span class="Apple-style-span" style="font-weight: bold;"&gt;did't&lt;/span&gt; want to do all this "&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;testing&lt;/span&gt;", but during the journey I gained a lot of experience and I say it &lt;span class="Apple-style-span" style="font-weight: bold;"&gt;worth playing&lt;/span&gt; all this Lego like game. :)&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9075525480713027828-8828990177734319514?l=orbanbotond.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9075525480713027828/posts/default/8828990177734319514'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9075525480713027828/posts/default/8828990177734319514'/><link rel='alternate' type='text/html' href='http://orbanbotond.blogspot.com/2007/12/webapplication-testing-like-lego-story.html' title='Webapplication testing like  a Lego story'/><author><name>Orban Botond</name><uri>http://www.blogger.com/profile/15174135306127563444</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-9075525480713027828.post-3211594371121520236</id><published>2007-11-14T23:30:00.002Z</published><updated>2011-09-25T20:04:23.143+01:00</updated><title type='text'>Introduction</title><content type='html'>Hello everybody&lt;div&gt; &lt;/div&gt;&lt;div&gt;I am a Software Engineer with over 5 years of experience.&lt;/div&gt;&lt;div&gt;At this moment of writing this blog I am employed by a &lt;span class="Apple-style-span" style="font-size:large;"&gt;big&lt;/span&gt; software engineering company in Eastern Europe.&lt;/div&gt;&lt;div&gt;I have created this blog with the purpose of sharing ideas about software development, technologies and tools.&lt;/div&gt;&lt;div&gt;Hopefully this will connect me to other professionals around the globe and there will be a place for constructive debates.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9075525480713027828-3211594371121520236?l=orbanbotond.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://orbanbotond.blogspot.com/feeds/3211594371121520236/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9075525480713027828&amp;postID=3211594371121520236' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9075525480713027828/posts/default/3211594371121520236'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9075525480713027828/posts/default/3211594371121520236'/><link rel='alternate' type='text/html' href='http://orbanbotond.blogspot.com/2007/11/introduction.html' title='Introduction'/><author><name>Orban Botond</name><uri>http://www.blogger.com/profile/15174135306127563444</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
