<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/atom10full.xsl" type="text/xsl" media="screen"?><?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/itemcontent.css" type="text/css" media="screen"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" xml:lang="en-US">
  <title>synatic|blog - Home</title>
  <id>tag:blog.synatic.net,2008:mephisto/</id>
  <generator version="0.8.0" uri="http://mephistoblog.com">Mephisto Drax</generator>
  
  <link href="http://blog.synatic.net/" rel="alternate" type="text/html" />
  <updated>2008-08-08T08:48:56Z</updated>
  <link rel="self" href="http://feeds.feedburner.com/synatic_net" type="application/atom+xml" /><entry xml:base="http://blog.synatic.net/">
    <author>
      <name>benedikt</name>
    </author>
    <id>tag:blog.synatic.net,2008-08-08:1551</id>
    <published>2008-08-08T08:48:00Z</published>
    <updated>2008-08-08T08:48:56Z</updated>
    <category term="Articles" />
    <category term="Linux" />
    <category term="Ruby" />
    <category term="Ruby on Rails" />
    <link href="http://feeds.feedburner.com/~r/synatic_net/~3/359254409/howto-phusion-passenger-aka-mod_rails-for-apache" rel="alternate" type="text/html" />
    <title>HowTo: Phusion Passenger aka mod_rails for Apache</title>
<content type="html">
            &lt;p&gt;Yesterday I decided to give &lt;a href="http://www.modrails.com"&gt;Phusion Passenger aka mod_rails&lt;/a&gt; a try and installed it. It was dead simple to set it up and to deploy rails applications with it. I’m now using it for several “small” applications, for which the whole overhead of setting up a cluster of mongrels and a proxy doesn’t seem to be adequate. I’ll give you a short summary on how to install mod_rails for apache2 on Debian Etch.&lt;/p&gt;


	&lt;p&gt;First, install the passenger gem using &lt;a href="http://www.rubygems.org/"&gt;RubyGems&lt;/a&gt; (if you don’t have Ruby and RubyGems running on your server, install them first – of course):&lt;/p&gt;


&lt;pre class="twilight"&gt;&lt;span class="line-numbers"&gt;   1 &lt;/span&gt; gem install passenger
&lt;/pre&gt;

	&lt;p&gt;Afterwards, run the passenger apache2 module installer using this command:&lt;/p&gt;


&lt;pre class="twilight"&gt;&lt;span class="line-numbers"&gt;   1 &lt;/span&gt; passenger-install-apache2-module
&lt;/pre&gt;

	&lt;p&gt;It’ll check for the required software to install the module, compile it and copy it to the correct folders. If some software is missing install it using &lt;code&gt;aptitude&lt;/code&gt; (ie. &lt;code&gt;aptitude install g++&lt;/code&gt; if you’re missing the &lt;span class="caps"&gt;GNU C&lt;/span&gt;++ Compiler).&lt;/p&gt;


	&lt;p&gt;Next, create two new files in the &lt;code&gt;/etc/apache2/mods-available&lt;/code&gt; directory. One called &lt;code&gt;mod_rails.load&lt;/code&gt;:&lt;/p&gt;


&lt;pre class="twilight"&gt;&lt;span class="line-numbers"&gt;   1 &lt;/span&gt; &lt;span class="SupportConstant"&gt;LoadModule&lt;/span&gt; passenger_module /usr/lib/ruby/gems/1.8/gems/passenger-2.0.2/ext/apache2/mod_passenger.so
&lt;/pre&gt;

	&lt;p&gt;... and the other one called &lt;code&gt;mod_rails.conf&lt;/code&gt;:&lt;/p&gt;


&lt;pre class="twilight"&gt;&lt;span class="line-numbers"&gt;   1 &lt;/span&gt; PassengerRoot /usr/lib/ruby/gems/1.8/gems/passenger-2.0.2
&lt;span class="line-numbers"&gt;   2 &lt;/span&gt; PassengerRuby /usr/bin/ruby1.8
&lt;/pre&gt;

	&lt;p&gt;Now you can enable the module using &lt;code&gt;a2enmod&lt;/code&gt; and restart apache.&lt;/p&gt;


&lt;pre class="twilight"&gt;&lt;span class="line-numbers"&gt;   1 &lt;/span&gt; a2enmod mod_rails
&lt;span class="line-numbers"&gt;   2 &lt;/span&gt; apache2ctl restart
&lt;/pre&gt;

	&lt;p&gt;That’s it! Now simply deploy your rails application, just make sure apache’s document root is pointing to your applications &lt;code&gt;public&lt;/code&gt; folder. Passenger will automatically detect your rails application and start up processes as needed. You can check it’s status and stats using the &lt;code&gt;passenger-status&lt;/code&gt; and &lt;code&gt;passenger-memory-stats&lt;/code&gt; commands. For more details on mod_rails, take a look at it’s &lt;a href="http://modrails.com/documentation.html"&gt;documentation&lt;/a&gt;.&lt;/p&gt;
          &lt;img src="http://feeds.feedburner.com/~r/synatic_net/~4/359254409" height="1" width="1"/&gt;</content>  <feedburner:origLink>http://blog.synatic.net/2008/8/8/howto-phusion-passenger-aka-mod_rails-for-apache</feedburner:origLink></entry>
  <entry xml:base="http://blog.synatic.net/">
    <author>
      <name>benedikt</name>
    </author>
    <id>tag:blog.synatic.net,2008-08-04:1514</id>
    <published>2008-08-04T20:28:00Z</published>
    <updated>2008-08-15T09:26:53Z</updated>
    <category term="Articles" />
    <category term="Ruby" />
    <category term="Ruby on Rails" />
    <link href="http://feeds.feedburner.com/~r/synatic_net/~3/355677736/my-day-to-day-resources-on-ruby-and-rails" rel="alternate" type="text/html" />
    <title>My day-to-day resources on Ruby and Rails</title>
<content type="html">
            &lt;h2&gt;News&lt;/h2&gt;
&lt;p&gt;I try to keep up with Ruby and Ruby on Rails, even if I’m not working with one of them at the moment. These are the three feeds helping me to get the latest news:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://planetrubyonrails.com"&gt;&lt;img src="http://blog.synatic.net/assets/2008/8/4/planetrubyonrails.png" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;PlanetRubyOnRails.com, not to be mixed up with PlanetRubyOnRails.&lt;strong&gt;org&lt;/strong&gt;, is a simple feed aggregator with a set of quite informative blogs. Including the official &lt;a href="http://blog.rubyonrails.com"&gt;Riding Rails&lt;/a&gt; Blog, &lt;a href="http://www.rubyinside.com"&gt;Ruby Inside&lt;/a&gt;, and &lt;a href="http://www.infoq.com"&gt;InfoQ&lt;/a&gt;. Unfortunately it doesn’t provide an &lt;span class="caps"&gt;RSS&lt;/span&gt;-Feed anymore, but thanks to &lt;a href="http://feed43.com/"&gt;Feed43&lt;/a&gt; it’s easy to build one on your own.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://railsenvy.com"&gt;&lt;img src="http://blog.synatic.net/assets/2008/8/4/rails_envy_logo.gif" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Every Wednesday Gregg Pollack and Jason Seifer of &lt;a href="http://www.railsenvy.com"&gt;Rails Envy&lt;/a&gt; publish their Rails Envy Podcast, covering last week’s most important topics in the Ruby and Rails community. They’re giving a short summary for every topic, together with a link in their &lt;em&gt;shownotes&lt;/em&gt; and usually are fooling around. The podcast’s length is usually between 10 to 15 minutes.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://planet.rubyonrails-ug.de/"&gt;&lt;strong&gt;RubyOnRails-Ug Planet&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Just like PlanetRubyOnRails, the planet of the german ruby on rails usergroup is a feed aggregator, except it includes blogs of members of the german Ruby on Rails community. (Yes, mine too …) Its far from being as active as the international one, but usually includes interesting posts.&lt;/p&gt;
&lt;h2&gt;Documentation&lt;/h2&gt;
&lt;p&gt;When I’m working on Ruby and Ruby on Rails code, I use there resources to quickly look up documentation:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://ruby-doc.org/"&gt;&lt;img src="http://blog.synatic.net/assets/2008/8/4/rubydoc.png" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Ruby-Doc.org provides the documentation for both Ruby’s &lt;a href="http://ruby-doc.org/core"&gt;Core&lt;/a&gt; and &lt;a href="http://ruby-doc.org/stdlib"&gt;Stdlib&lt;/a&gt;. The documentation is in the default RDoc format, so I usually end up hitting [Strg]+[F] and using my browsers search function to quickly get to the relevant sections.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://api.rubyonrails.com/"&gt;&lt;strong&gt;api.rubyonrails.com&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;What Ruby-Doc.org is for ruby, &lt;a href="http://api.rubyonrails.com/"&gt;api.rubyonrails.com&lt;/a&gt; is for rails. It’s the standard rails documentation in the default RDoc format. As with Ruby-Doc.org I use my browsers search to quickly find what I’m looking for.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://rails-doc.org/"&gt;&lt;img src="http://blog.synatic.net/assets/2008/8/4/rails-doc.png" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Rails-Doc.org is a quite new site providing the full rails documentation. Unlike the default &lt;span class="caps"&gt;API&lt;/span&gt; documentation site (see above) it also includes documentation of older rails versions. Additionally it has a nice search engine, and adds the ability to post notes. There are other sites providing similar functionality for the rails documentation, but somehow Rails-Doc.org just feels right and I’m using more and more.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Gem Server&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Did you know the fabulous &lt;a href="http://www.rubygems.org/"&gt;RubyGem-Tools&lt;/a&gt; provide a server including the documentation for all your installed gems? Simple run &lt;code&gt;gem server&lt;/code&gt; on the console, fire up your browser and navigate to http://localhost:8808. Okay, it’s just the standard RDoc documentation for each gem, without any fancy search or anything … but who cares if you’re somewhere in the middle of nowhere with no internet connection? :-)&lt;/p&gt;
&lt;h2&gt;Other&lt;/h2&gt;
&lt;p&gt;&lt;a href="http://www.railscasts.com/"&gt;&lt;img src="http://blog.synatic.net/assets/2008/8/4/railscasts.png" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Last but definitely not least, are the RailsCasts by Ryan Bates. Every Monday he publishes a approx. 5 to 10 minute screencast on a variety of topics related to rails development. If you haven’t seen one of them yet, don’t hesitate any longer. Ryan’s explanations are concise and based on practical examples.&lt;/p&gt;
&lt;p&gt;What are your resources on Ruby / Rails? Which blogs are you reading to stay up-to-date? Which documentation are you using? I’m interested in your comments (there are way to few anyways … ;-))!&lt;/p&gt;
&lt;h2&gt;Update (Aug 15.)&lt;/h2&gt;
&lt;p&gt;&lt;a href="http://blog.nodeta.fi/"&gt;Nodeta&lt;/a&gt;, creators of Rails-Doc.org, released &lt;a href="http://www.apidock.com/"&gt;APIdock&lt;/a&gt; yesterday. APIdock extends the Rails-Doc.org concept to multiple projects. Currently Rails, Ruby and RSpec are included.&lt;/p&gt;
          &lt;img src="http://feeds.feedburner.com/~r/synatic_net/~4/355677736" height="1" width="1"/&gt;</content>  <feedburner:origLink>http://blog.synatic.net/2008/8/4/my-day-to-day-resources-on-ruby-and-rails</feedburner:origLink></entry>
  <entry xml:base="http://blog.synatic.net/">
    <author>
      <name>benedikt</name>
    </author>
    <id>tag:blog.synatic.net,2008-07-24:1469</id>
    <published>2008-07-24T09:57:00Z</published>
    <updated>2008-07-31T07:52:17Z</updated>
    <category term="Javascript" />
    <link href="http://feeds.feedburner.com/~r/synatic_net/~3/344458102/script-aculo-us-should-have-effect-emerge" rel="alternate" type="text/html" />
    <title>Script.aculo.us should have Effect.Emerge</title>
<content type="html">
            &lt;p&gt;&lt;a href="http://script.aculo.us"&gt;Script.aculo.us&lt;/a&gt; includes a nice effect called &lt;a href="http://github.com/madrobby/scriptaculous/wikis/effect-dropout"&gt;&lt;code&gt;Effect.DropOut&lt;/code&gt;&lt;/a&gt;, which let’s the element fall in an “invisible trap” underneath. Surprisingly there isn’t an opposite effect. Calling &lt;code&gt;Effect.DropOut&lt;/code&gt; with &lt;code&gt;Effect.Transitions.reverse&lt;/code&gt; as transition, doesn’t work either. So what to do? &lt;code&gt;Effect.Emerge&lt;/code&gt; to the rescue!&lt;/p&gt;


&lt;pre class="twilight"&gt;&lt;span class="line-numbers"&gt;   1 &lt;/span&gt; 
&lt;span class="line-numbers"&gt;   2 &lt;/span&gt; &lt;span class="Support"&gt;Effect&lt;/span&gt;.&lt;span class="Entity"&gt;Emerge&lt;/span&gt; &lt;span class="Keyword"&gt;=&lt;/span&gt; &lt;span class="Entity"&gt;function&lt;/span&gt;(element) {
&lt;span class="line-numbers"&gt;   3 &lt;/span&gt;   element &lt;span class="Keyword"&gt;=&lt;/span&gt; $(element);
&lt;span class="line-numbers"&gt;   4 &lt;/span&gt;   var oldStyle &lt;span class="Keyword"&gt;=&lt;/span&gt; {
&lt;span class="line-numbers"&gt;   5 &lt;/span&gt;     top: element.&lt;span class="Entity"&gt;getStyle&lt;/span&gt;(&lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;top&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;),
&lt;span class="line-numbers"&gt;   6 &lt;/span&gt;     left: element.&lt;span class="Entity"&gt;getStyle&lt;/span&gt;(&lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;left&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;) };
&lt;span class="line-numbers"&gt;   7 &lt;/span&gt;   var position &lt;span class="Keyword"&gt;=&lt;/span&gt; element.&lt;span class="Entity"&gt;positionedOffset&lt;/span&gt;();
&lt;span class="line-numbers"&gt;   8 &lt;/span&gt;   &lt;span class="Keyword"&gt;return&lt;/span&gt; &lt;span class="Keyword"&gt;new&lt;/span&gt; &lt;span class="Support"&gt;Effect&lt;/span&gt;.&lt;span class="Entity"&gt;Parallel&lt;/span&gt;(
&lt;span class="line-numbers"&gt;   9 &lt;/span&gt;     [ &lt;span class="Keyword"&gt;new&lt;/span&gt; &lt;span class="Support"&gt;Effect&lt;/span&gt;.&lt;span class="Entity"&gt;Move&lt;/span&gt;(element, {x: &lt;span class="Constant"&gt;0&lt;/span&gt;, y: &lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Constant"&gt;100&lt;/span&gt;, sync: &lt;span class="Constant"&gt;true&lt;/span&gt; }), 
&lt;span class="line-numbers"&gt;  10 &lt;/span&gt;       &lt;span class="Keyword"&gt;new&lt;/span&gt; &lt;span class="Support"&gt;Effect&lt;/span&gt;.&lt;span class="Entity"&gt;Opacity&lt;/span&gt;(element, { sync: &lt;span class="Constant"&gt;true&lt;/span&gt;, from: &lt;span class="Constant"&gt;0.0&lt;/span&gt;, to: &lt;span class="Constant"&gt;1.0&lt;/span&gt; }) ],
&lt;span class="line-numbers"&gt;  11 &lt;/span&gt;     &lt;span class="Support"&gt;Object&lt;/span&gt;.&lt;span class="Entity"&gt;extend&lt;/span&gt;(
&lt;span class="line-numbers"&gt;  12 &lt;/span&gt;       { duration: &lt;span class="Constant"&gt;0.5&lt;/span&gt;,
&lt;span class="line-numbers"&gt;  13 &lt;/span&gt;         beforeSetup: &lt;span class="Entity"&gt;function&lt;/span&gt;(effect) {
&lt;span class="line-numbers"&gt;  14 &lt;/span&gt;           effect.&lt;span class="Entity"&gt;effects&lt;/span&gt;[&lt;span class="Constant"&gt;0&lt;/span&gt;].&lt;span class="Entity"&gt;element&lt;/span&gt;.&lt;span class="Entity"&gt;show&lt;/span&gt;().&lt;span class="Entity"&gt;makePositioned&lt;/span&gt;().&lt;span class="Entity"&gt;setStyle&lt;/span&gt;( { top: (position.&lt;span class="Entity"&gt;top&lt;/span&gt; &lt;span class="Keyword"&gt;+&lt;/span&gt; &lt;span class="Constant"&gt;100&lt;/span&gt;) &lt;span class="Keyword"&gt;+&lt;/span&gt; &lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;px&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt; }); 
&lt;span class="line-numbers"&gt;  15 &lt;/span&gt;         },
&lt;span class="line-numbers"&gt;  16 &lt;/span&gt;         afterFinishInternal: &lt;span class="Entity"&gt;function&lt;/span&gt;(effect) {
&lt;span class="line-numbers"&gt;  17 &lt;/span&gt;           effect.&lt;span class="Entity"&gt;effects&lt;/span&gt;[&lt;span class="Constant"&gt;0&lt;/span&gt;].&lt;span class="Entity"&gt;element&lt;/span&gt;.&lt;span class="Entity"&gt;undoPositioned&lt;/span&gt;().&lt;span class="Entity"&gt;setStyle&lt;/span&gt;(oldStyle);
&lt;span class="line-numbers"&gt;  18 &lt;/span&gt;         } 
&lt;span class="line-numbers"&gt;  19 &lt;/span&gt;       }, arguments[&lt;span class="Constant"&gt;1&lt;/span&gt;] &lt;span class="Keyword"&gt;||&lt;/span&gt; { }));
&lt;span class="line-numbers"&gt;  20 &lt;/span&gt; };
&lt;/pre&gt;

	&lt;p&gt;Basically it’s just a modified version of &lt;code&gt;Effect.DropOut&lt;/code&gt; to reverse the effect. Try it in compination with &lt;a href="http://github.com/madrobby/scriptaculous/wikis/effect-multiple"&gt;&lt;code&gt;Effect.multiple&lt;/code&gt;&lt;/a&gt; ... :-)&lt;/p&gt;
          &lt;img src="http://feeds.feedburner.com/~r/synatic_net/~4/344458102" height="1" width="1"/&gt;</content>  <feedburner:origLink>http://blog.synatic.net/2008/7/24/script-aculo-us-should-have-effect-emerge</feedburner:origLink></entry>
  <entry xml:base="http://blog.synatic.net/">
    <author>
      <name>benedikt</name>
    </author>
    <id>tag:blog.synatic.net,2008-07-02:1335</id>
    <published>2008-07-02T12:01:00Z</published>
    <updated>2008-07-02T12:02:48Z</updated>
    <category term="Other" />
    <link href="http://feeds.feedburner.com/~r/synatic_net/~3/324844360/so-i-gave-a-talk" rel="alternate" type="text/html" />
    <title>So I gave a talk ... </title>
<content type="html">
            &lt;p&gt;... and messed it up.&lt;/p&gt;


	&lt;p&gt;Last week I’ve been giving a talk (in german) about the project I did during my internship at the Human Computer Interaction Research Center at the university of applied sciences Fulda. This was the first talk I gave (not counting those I had to do in school and for university) and of course it ended up a little awkward. I didn’t intend to do a live demo at the end but somehow I changed my mind during the presentation. Of course nothing worked like expected … ;-) Lessons learned for next time. If you’d like to see the disaster yourself there is &lt;a href="http://milabor.informatik.hs-fulda.de/videos/incoming/ElearningSymposium/deicke.html"&gt;a video available.&lt;/a&gt;&lt;/p&gt;


	&lt;p&gt;&lt;a href="http://milabor.informatik.hs-fulda.de/videos/incoming/ElearningSymposium/deicke.html"&gt;&lt;img src="http://blog.synatic.net/assets/2008/7/2/deicke.jpg" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;
          &lt;img src="http://feeds.feedburner.com/~r/synatic_net/~4/324844360" height="1" width="1"/&gt;</content>  <feedburner:origLink>http://blog.synatic.net/2008/7/2/so-i-gave-a-talk</feedburner:origLink></entry>
  <entry xml:base="http://blog.synatic.net/">
    <author>
      <name>benedikt</name>
    </author>
    <id>tag:blog.synatic.net,2008-05-19:1296</id>
    <published>2008-05-19T09:01:00Z</published>
    <updated>2008-05-19T09:12:18Z</updated>
    <category term="Other" />
    <link href="http://feeds.feedburner.com/~r/synatic_net/~3/293359217/i-love-tex" rel="alternate" type="text/html" />
    <title>I love TeX</title>
<content type="html">
            &lt;p&gt;I got my thesis’ topic last week and will start to write it within the next few days. I decided to write it using TeX as all my attempts to write large documents in OpenOffice.org caused very bad headaches. The TeX approach fits my needs much better and I can use &lt;span class="caps"&gt;GIT&lt;/span&gt; much more effectively to manage the changes to the documents. With TeX I could even apply patches to the document … how cool is that? :-) Just imagine sending the document to someone else for proofreading and getting back a patch that can be instantly applied without having to search every passage that had misspelled words in it. Maybe I’ll post some links that helped me getting into all the TeX stuff in the near future.&lt;/p&gt;
          &lt;img src="http://feeds.feedburner.com/~r/synatic_net/~4/293359217" height="1" width="1"/&gt;</content>  <feedburner:origLink>http://blog.synatic.net/2008/5/19/i-love-tex</feedburner:origLink></entry>
  <entry xml:base="http://blog.synatic.net/">
    <author>
      <name>benedikt</name>
    </author>
    <id>tag:blog.synatic.net,2008-04-15:1281</id>
    <published>2008-04-15T17:25:00Z</published>
    <updated>2008-04-15T17:30:52Z</updated>
    <category term="Other" />
    <link href="http://feeds.feedburner.com/~r/synatic_net/~3/270857324/redesigned" rel="alternate" type="text/html" />
    <title>Redesigned</title>
<content type="html">
            &lt;p&gt;During the last week I built a new design for both the blog and the website. The website isn’t finished yet but today I decided to update the blog’s design. 
I hope you like it as much as I do.&lt;/p&gt;


	&lt;p&gt;Additionally I updated the underlaying &lt;a href="http://www.mephistoblog.com/"&gt;Mephisto Blog&lt;/a&gt; and added &lt;a href="http://www.artweb-design.de/"&gt;Sven Fuchs’&lt;/a&gt; &lt;a href="http://www.artweb-design.de/projects/mephisto-plugin-paged-article-lists"&gt;Paged Article Lists Plugin.&lt;/a&gt;&lt;/p&gt;
          &lt;img src="http://feeds.feedburner.com/~r/synatic_net/~4/270857324" height="1" width="1"/&gt;</content>  <feedburner:origLink>http://blog.synatic.net/2008/4/15/redesigned</feedburner:origLink></entry>
  <entry xml:base="http://blog.synatic.net/">
    <author>
      <name>benedikt</name>
    </author>
    <id>tag:blog.synatic.net,2008-04-10:1278</id>
    <published>2008-04-10T07:47:00Z</published>
    <updated>2008-04-10T14:20:55Z</updated>
    <category term="Agile Development" />
    <category term="Articles" />
    <category term="Linux" />
    <category term="Ruby" />
    <category term="Ruby on Rails" />
    <link href="http://feeds.feedburner.com/~r/synatic_net/~3/270132737/using-rspactor-with-linux" rel="alternate" type="text/html" />
    <title>Using RSpactor with Linux</title>
<content type="html">
            &lt;p&gt;&lt;a href="http://rubyphunk.com/"&gt;Andreas Wolff&lt;/a&gt; recently released &lt;a href="http://rubyphunk.com/2008/3/11/hello-world-introducing-rspactor"&gt;RSpactor,&lt;/a&gt; a (up to now) command line tool similar to &lt;a href="http://www.zenspider.com/ZSS/Products/ZenTest/"&gt;autotest.&lt;/a&gt; Nevertheless it differs from autotest in two points. First it’s focused on &lt;a href="http://rspec.info/"&gt;RSpec&lt;/a&gt; and secondly it’s using Mac OS’ FSEvents to monitor file changes. According to this it only runs on Mac OS. 
To get it running on Linux you’ll have to change RSpactor’s Listener class to use Linux’ equivalent to FSEvents called &lt;a href="http://en.wikipedia.org/wiki/Inotify"&gt;inotify.&lt;/a&gt; Luckily there’s a gem called &lt;a href="http://rubyforge.org/projects/rinotify/"&gt;RInotify&lt;/a&gt; which introduces a simple class to access the inotify events within ruby. I rewrote the Listeners class yesterday to get it running on my Linux notebook:&lt;/p&gt;


&lt;pre class="twilight"&gt;&lt;span class="line-numbers"&gt;   1 &lt;/span&gt; &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt; inotify_listener.rb&lt;/span&gt;
&lt;span class="line-numbers"&gt;   2 &lt;/span&gt; 
&lt;span class="line-numbers"&gt;   3 &lt;/span&gt; &lt;span class="Keyword"&gt;class&lt;/span&gt; &lt;span class="Entity"&gt;Listener&lt;/span&gt;
&lt;span class="line-numbers"&gt;   4 &lt;/span&gt; 
&lt;span class="line-numbers"&gt;   5 &lt;/span&gt;   &lt;span class="Keyword"&gt;def&lt;/span&gt; &lt;span class="Entity"&gt;initialize&lt;/span&gt;(&lt;span class="Variable"&gt;&lt;span class="Keyword"&gt;&amp;amp;&lt;/span&gt;block&lt;/span&gt;)
&lt;span class="line-numbers"&gt;   6 &lt;/span&gt;     &lt;span class="Keyword"&gt;require&lt;/span&gt; &lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;rinotify&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;   7 &lt;/span&gt;     &lt;span class="Keyword"&gt;begin&lt;/span&gt;
&lt;span class="line-numbers"&gt;   8 &lt;/span&gt;       &lt;span class="Variable"&gt;&lt;span class="Variable"&gt;@&lt;/span&gt;spec_run_time&lt;/span&gt; &lt;span class="Keyword"&gt;=&lt;/span&gt; &lt;span class="Support"&gt;Time&lt;/span&gt;.&lt;span class="Entity"&gt;now&lt;/span&gt;
&lt;span class="line-numbers"&gt;   9 &lt;/span&gt;       &lt;span class="Variable"&gt;&lt;span class="Variable"&gt;@&lt;/span&gt;watching&lt;/span&gt;      &lt;span class="Keyword"&gt;=&lt;/span&gt; {}
&lt;span class="line-numbers"&gt;  10 &lt;/span&gt; 
&lt;span class="line-numbers"&gt;  11 &lt;/span&gt;       notify &lt;span class="Keyword"&gt;=&lt;/span&gt; &lt;span class="Variable"&gt;RInotify&lt;/span&gt;.&lt;span class="Entity"&gt;new&lt;/span&gt;
&lt;span class="line-numbers"&gt;  12 &lt;/span&gt;       &lt;span class="Support"&gt;Dir&lt;/span&gt;.&lt;span class="Entity"&gt;glob&lt;/span&gt;(&lt;span class="Support"&gt;File&lt;/span&gt;.&lt;span class="Entity"&gt;join&lt;/span&gt;(&lt;span class="Support"&gt;Dir&lt;/span&gt;.&lt;span class="Entity"&gt;pwd&lt;/span&gt;, &lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;**&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;)).&lt;span class="Entity"&gt;each&lt;/span&gt; &lt;span class="Keyword"&gt;do &lt;/span&gt;|&lt;span class="Variable"&gt;dir&lt;/span&gt;|
&lt;span class="line-numbers"&gt;  13 &lt;/span&gt;         watch_desc &lt;span class="Keyword"&gt;=&lt;/span&gt; notify.&lt;span class="Entity"&gt;add_watch&lt;/span&gt;(dir, &lt;span class="Variable"&gt;RInotify&lt;/span&gt;::&lt;span class="Entity"&gt;MODIFY&lt;/span&gt; &lt;span class="Keyword"&gt;|&lt;/span&gt; &lt;span class="Variable"&gt;RInotify&lt;/span&gt;::&lt;span class="Entity"&gt;CREATE&lt;/span&gt; &lt;span class="Keyword"&gt;|&lt;/span&gt; &lt;span class="Variable"&gt;RInotify&lt;/span&gt;::&lt;span class="Entity"&gt;DELETE&lt;/span&gt;)
&lt;span class="line-numbers"&gt;  14 &lt;/span&gt;         &lt;span class="Variable"&gt;&lt;span class="Variable"&gt;@&lt;/span&gt;watching&lt;/span&gt;[watch_desc] &lt;span class="Keyword"&gt;=&lt;/span&gt; dir
&lt;span class="line-numbers"&gt;  15 &lt;/span&gt;       &lt;span class="Keyword"&gt;end&lt;/span&gt;
&lt;span class="line-numbers"&gt;  16 &lt;/span&gt; 
&lt;span class="line-numbers"&gt;  17 &lt;/span&gt;       &lt;span class="Keyword"&gt;while&lt;/span&gt; &lt;span class="Constant"&gt;true&lt;/span&gt; &lt;span class="Keyword"&gt;do&lt;/span&gt;
&lt;span class="line-numbers"&gt;  18 &lt;/span&gt;         changed_files &lt;span class="Keyword"&gt;=&lt;/span&gt; []
&lt;span class="line-numbers"&gt;  19 &lt;/span&gt;         notify.&lt;span class="Entity"&gt;each_event&lt;/span&gt; &lt;span class="Keyword"&gt;do &lt;/span&gt;|&lt;span class="Variable"&gt;event&lt;/span&gt;|
&lt;span class="line-numbers"&gt;  20 &lt;/span&gt;           changed_files &lt;span class="Keyword"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="Entity"&gt;build_path_from_event&lt;/span&gt;(event)
&lt;span class="line-numbers"&gt;  21 &lt;/span&gt;         &lt;span class="Keyword"&gt;end&lt;/span&gt;
&lt;span class="line-numbers"&gt;  22 &lt;/span&gt;         changed_files.&lt;span class="Entity"&gt;uniq!&lt;/span&gt;
&lt;span class="line-numbers"&gt;  23 &lt;/span&gt;         &lt;span class="Keyword"&gt;unless&lt;/span&gt; changed_files.&lt;span class="Entity"&gt;empty?&lt;/span&gt;
&lt;span class="line-numbers"&gt;  24 &lt;/span&gt;           &lt;span class="Variable"&gt;&lt;span class="Variable"&gt;@&lt;/span&gt;spec_run_time&lt;/span&gt; &lt;span class="Keyword"&gt;=&lt;/span&gt; &lt;span class="Support"&gt;Time&lt;/span&gt;.&lt;span class="Entity"&gt;now&lt;/span&gt;
&lt;span class="line-numbers"&gt;  25 &lt;/span&gt;           &lt;span class="Keyword"&gt;yield&lt;/span&gt; changed_files
&lt;span class="line-numbers"&gt;  26 &lt;/span&gt;         &lt;span class="Keyword"&gt;end&lt;/span&gt;
&lt;span class="line-numbers"&gt;  27 &lt;/span&gt;         &lt;span class="Entity"&gt;sleep&lt;/span&gt;(&lt;span class="Constant"&gt;5&lt;/span&gt;)
&lt;span class="line-numbers"&gt;  28 &lt;/span&gt;       &lt;span class="Keyword"&gt;end&lt;/span&gt;
&lt;span class="line-numbers"&gt;  29 &lt;/span&gt;     &lt;span class="Keyword"&gt;rescue&lt;/span&gt; &lt;span class="Variable"&gt;Interrupt&lt;/span&gt;
&lt;span class="line-numbers"&gt;  30 &lt;/span&gt;       &lt;span class="Variable"&gt;&lt;span class="Variable"&gt;@&lt;/span&gt;watching&lt;/span&gt;.&lt;span class="Entity"&gt;each_key&lt;/span&gt; { |&lt;span class="Variable"&gt;key&lt;/span&gt;| notify.&lt;span class="Entity"&gt;rm_watch&lt;/span&gt;(key) }
&lt;span class="line-numbers"&gt;  31 &lt;/span&gt;     &lt;span class="Keyword"&gt;end&lt;/span&gt;
&lt;span class="line-numbers"&gt;  32 &lt;/span&gt;   &lt;span class="Keyword"&gt;end&lt;/span&gt;
&lt;span class="line-numbers"&gt;  33 &lt;/span&gt; 
&lt;span class="line-numbers"&gt;  34 &lt;/span&gt;   &lt;span class="Keyword"&gt;def&lt;/span&gt; &lt;span class="Entity"&gt;build_path_from_event&lt;/span&gt;(&lt;span class="Variable"&gt;event&lt;/span&gt;)
&lt;span class="line-numbers"&gt;  35 &lt;/span&gt;     &lt;span class="Support"&gt;File&lt;/span&gt;.&lt;span class="Entity"&gt;join&lt;/span&gt;(&lt;span class="Variable"&gt;&lt;span class="Variable"&gt;@&lt;/span&gt;watching&lt;/span&gt;[event.&lt;span class="Entity"&gt;watch_descriptor&lt;/span&gt;], event.&lt;span class="Entity"&gt;name&lt;/span&gt; &lt;span class="Keyword"&gt;||&lt;/span&gt; &lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;)
&lt;span class="line-numbers"&gt;  36 &lt;/span&gt;   &lt;span class="Keyword"&gt;end&lt;/span&gt;
&lt;span class="line-numbers"&gt;  37 &lt;/span&gt; 
&lt;span class="line-numbers"&gt;  38 &lt;/span&gt; &lt;span class="Keyword"&gt;end&lt;/span&gt;
&lt;/pre&gt;

	&lt;p&gt;To get it running you simply have to install the RInotify gem and change one line in bin/rspactor:&lt;/p&gt;


&lt;pre class="twilight"&gt;&lt;span class="line-numbers"&gt;   1 &lt;/span&gt; &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt; from&lt;/span&gt;
&lt;span class="line-numbers"&gt;   2 &lt;/span&gt; &lt;span class="Keyword"&gt;require&lt;/span&gt; &lt;span class="Support"&gt;File&lt;/span&gt;.&lt;span class="Entity"&gt;join&lt;/span&gt;(&lt;span class="Support"&gt;File&lt;/span&gt;.&lt;span class="Entity"&gt;dirname&lt;/span&gt;(&lt;span class="Variable"&gt;__FILE__&lt;/span&gt;), &lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;..&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;, &lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;lib&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;, &lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;listener&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;)
&lt;span class="line-numbers"&gt;   3 &lt;/span&gt; &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt; to&lt;/span&gt;
&lt;span class="line-numbers"&gt;   4 &lt;/span&gt; &lt;span class="Keyword"&gt;require&lt;/span&gt; &lt;span class="Support"&gt;File&lt;/span&gt;.&lt;span class="Entity"&gt;join&lt;/span&gt;(&lt;span class="Support"&gt;File&lt;/span&gt;.&lt;span class="Entity"&gt;dirname&lt;/span&gt;(&lt;span class="Variable"&gt;__FILE__&lt;/span&gt;), &lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;..&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;, &lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;lib&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;, &lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;inotify_listener&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;)
&lt;/pre&gt;

	&lt;p&gt;That’s it! RSpactor should be running on Linux now and consuming much less &lt;span class="caps"&gt;CPU&lt;/span&gt; than autotest.&lt;/p&gt;


	&lt;p&gt;(You might also want to change the &lt;code&gt;system()&lt;/code&gt;-call in lib/resulting.rb as it’s currently using growl to notify you about the test results.)&lt;/p&gt;
          &lt;img src="http://feeds.feedburner.com/~r/synatic_net/~4/270132737" height="1" width="1"/&gt;</content>  <feedburner:origLink>http://blog.synatic.net/2008/4/10/using-rspactor-with-linux</feedburner:origLink></entry>
  <entry xml:base="http://blog.synatic.net/">
    <author>
      <name>benedikt</name>
    </author>
    <id>tag:blog.synatic.net,2008-03-29:1273</id>
    <published>2008-03-29T11:35:00Z</published>
    <updated>2008-12-07T15:30:02Z</updated>
    <category term="Articles" />
    <category term="Linux" />
    <category term="keychain" />
    <category term="ssh" />
    <category term="ssh-agent" />
    <category term="ssh-keygen" />
    <link href="http://feeds.feedburner.com/~r/synatic_net/~3/270132738/easy-ssh-authentication-with-keychain" rel="alternate" type="text/html" />
    <title>Easy SSH authentication with keychain</title>
<content type="html">
            &lt;p&gt;Typing &lt;span class="caps"&gt;SSH&lt;/span&gt; passwords again and again can be a real pain. For example: Lately I started to use &lt;a href="http://www.capify.org/"&gt;Capistrano&lt;/a&gt; to deploy my rails applications.  If I want to set up the maintenance-page on the server I’ll type &lt;code&gt;cap deploy:web:disable&lt;/code&gt; which of course prompts me for the &lt;span class="caps"&gt;SSH&lt;/span&gt; password. Then I want to deploy my application with &lt;code&gt;cap deploy&lt;/code&gt; and again will be prompted for the password. Finally I have to &lt;code&gt;cap deploy:web:enable&lt;/code&gt; to remove the maintenance page which – as mindful readers might have guessed already – prompts for the password. This was just one reason for me to set up &lt;span class="caps"&gt;SSH&lt;/span&gt; authentication keys. At first I was a little worried that setting it up might be a bit complicated. Luckily I was disabused. If you want to switch to key based authentication too follow these simple steps:&lt;/p&gt;
&lt;h2&gt;Key generation&lt;/h2&gt;
&lt;p&gt;The first thing you need is – of course – a pair of keys: your private key and the associated public key. To generate both fire up our favorite shell (for me it’s &lt;code&gt;bash&lt;/code&gt;) and type:&lt;/p&gt;
&lt;pre class="twilight"&gt;&lt;span class="line-numbers"&gt;   1 &lt;/span&gt; ssh-keygen
&lt;/pre&gt;&lt;p&gt;This will generate both keys and ask you where to store it. Usually the default would be something like &lt;code&gt;~/.ssh/id_rsa&lt;/code&gt;. Simply accept the default by pressing return. Next you’ll have to enter a password for your key and confirm it. Afterwards you’ve to tell the server to accept your key on authentication. Do so by uploading the public key to the server.&lt;/p&gt;
&lt;pre class="twilight"&gt;&lt;span class="line-numbers"&gt;   1 &lt;/span&gt; scp &lt;span class="Keyword"&gt;~&lt;/span&gt;/.ssh/id_rsa.pub yourserver.com:&lt;span class="Keyword"&gt;~&lt;/span&gt;/.ssh/authenticated_keys2
&lt;/pre&gt;&lt;p&gt;If you want to add multiple keys, be sure to append it to the &lt;code&gt;authenticated_keys2&lt;/code&gt; file and don’t overwrite it.&lt;/p&gt;
&lt;h2&gt;First login&lt;/h2&gt;
&lt;p&gt;That’s all you have to do to switch to key based &lt;span class="caps"&gt;SSH&lt;/span&gt; authentication. Try to log in as usual by typing:&lt;/p&gt;
&lt;pre class="twilight"&gt;&lt;span class="line-numbers"&gt;   1 &lt;/span&gt; ssh yourserver.com
&lt;/pre&gt;&lt;p&gt;This will prompt you for your key’s password and log you in to your server afterwards. “But wait! I’m still having to type my password every time I want to log in!” you shout, and you’re right – up to now. What you need to do is running &lt;code&gt;ssh-agent&lt;/code&gt;, adding your key and typing your password. &lt;code&gt;ssh-agent&lt;/code&gt; will then ask for the password and store it until you shut it down. You’ll have to do this everytime you open up a new shell or put the commands into your i.e. &lt;code&gt;~/.bash_profile&lt;/code&gt;. Quite comfortable but we can do better.&lt;/p&gt;
&lt;h2&gt;Keychain&lt;/h2&gt;
&lt;p&gt;There is a nice little tool called &lt;code&gt;keychain&lt;/code&gt; that will smooth the process a little for you. It’s originally developed by the &lt;a href="http://www.gentoo.org/"&gt;Gentoo&lt;/a&gt; people but it’s available on other linux distributions (as well as Mac OS X), too. Simply install it by typing your system’s equivalent to&lt;/p&gt;
&lt;pre class="twilight"&gt;&lt;span class="line-numbers"&gt;   1 &lt;/span&gt; &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt; Gentoo&lt;/span&gt;
&lt;span class="line-numbers"&gt;   2 &lt;/span&gt; emerge keychain
&lt;span class="line-numbers"&gt;   3 &lt;/span&gt; &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt; Debian&lt;/span&gt;
&lt;span class="line-numbers"&gt;   4 &lt;/span&gt; aptitude install keychain
&lt;/pre&gt;&lt;p&gt;and it’ll be available in no time. To set it up you need to put these two lines in our &lt;code&gt;~/.bash_profile&lt;/code&gt;:&lt;/p&gt;
&lt;pre class="twilight"&gt;&lt;span class="line-numbers"&gt;   1 &lt;/span&gt; keychain &lt;span class="Keyword"&gt;~&lt;/span&gt;/.ssh/id_rsa
&lt;span class="line-numbers"&gt;   2 &lt;/span&gt; source &lt;span class="Keyword"&gt;~&lt;/span&gt;/.keychain/&lt;span class="Variable"&gt;&lt;span class="Variable"&gt;$&lt;/span&gt;HOSTNAME&lt;/span&gt;-sh
&lt;/pre&gt;&lt;p&gt;That’s it. The first time you open up a shell  &lt;code&gt;keychain&lt;/code&gt; will start &lt;code&gt;ssh-agent&lt;/code&gt;, prompt you for your keys password and remember the running &lt;code&gt;ssh-agent&lt;/code&gt; for all new shells. On your next &lt;span class="caps"&gt;SSH&lt;/span&gt; authentication no more password typing is required. Wasn’t complicated at all, was it?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; Thanks to &lt;a href="http://www.michael-kolb.co.uk/"&gt;Michael&lt;/a&gt; for pointing out that the public key file is named &lt;code&gt;id_rsa.pub&lt;/code&gt; instead of &lt;code&gt;id_rsa&lt;/code&gt;. Fixed it.&lt;/p&gt;
          &lt;img src="http://feeds.feedburner.com/~r/synatic_net/~4/270132738" height="1" width="1"/&gt;</content>  <feedburner:origLink>http://blog.synatic.net/2008/3/29/easy-ssh-authentication-with-keychain</feedburner:origLink></entry>
  <entry xml:base="http://blog.synatic.net/">
    <author>
      <name>benedikt</name>
    </author>
    <id>tag:blog.synatic.net,2008-02-28:1262</id>
    <published>2008-02-28T16:08:00Z</published>
    <updated>2008-02-28T16:09:01Z</updated>
    <category term="Other" />
    <link href="http://feeds.feedburner.com/~r/synatic_net/~3/270132739/european-passion-play-2008" rel="alternate" type="text/html" />
    <title>European Passion Play 2008</title>
<content type="html">
            &lt;p&gt;I’ve had a great weekend again, seeing &lt;a href="http://www.nightwish.com/"&gt;Nightwish&lt;/a&gt; doing two amazing shows. First one on saturday in Leipzig, the second one in Frankfurt on monday. I took several pictures and uploaded a selection of them to the &lt;a href="http://www.nightwish.com/gallery/"&gt;Nightwish.com Gallery:&lt;/a&gt;&lt;/p&gt;


	&lt;ul&gt;
	&lt;li&gt;&lt;a href="http://www.nightwish.com/gallery/thumbnails.php?album=148"&gt;Photos of the Leipzig show on saturday&lt;/a&gt;&lt;/li&gt;
		&lt;li&gt;&lt;a href="http://www.nightwish.com/gallery/thumbnails.php?album=150"&gt;Photos of the Frankfurt show on monday&lt;/a&gt;&lt;/li&gt;
	&lt;/ul&gt;


	&lt;p&gt;To give you an idea, here are some of the best ones:&lt;/p&gt;


	&lt;p&gt;&lt;a href="http://blog.synatic.net/assets/2008/2/28/epp_2008_1_full.jpg"&gt;&lt;img src="http://blog.synatic.net/assets/2008/2/28/epp_2008_1.jpg" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;


	&lt;p&gt;&lt;a href="http://blog.synatic.net/assets/2008/2/28/epp_2008_2_full.jpg"&gt;&lt;img src="http://blog.synatic.net/assets/2008/2/28/epp_2008_2.jpg" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;


	&lt;p&gt;&lt;a href="http://blog.synatic.net/assets/2008/2/28/epp_2008_3_full.jpg"&gt;&lt;img src="http://blog.synatic.net/assets/2008/2/28/epp_2008_3.jpg" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;


	&lt;p&gt;&lt;a href="http://blog.synatic.net/assets/2008/2/28/epp_2008_4_full.jpg"&gt;&lt;img src="http://blog.synatic.net/assets/2008/2/28/epp_2008_4.jpg" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;


	&lt;p&gt;&lt;a href="http://blog.synatic.net/assets/2008/2/28/epp_2008_5_full.jpg"&gt;&lt;img src="http://blog.synatic.net/assets/2008/2/28/epp_2008_5.jpg" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;
          &lt;img src="http://feeds.feedburner.com/~r/synatic_net/~4/270132739" height="1" width="1"/&gt;</content>  <feedburner:origLink>http://blog.synatic.net/2008/2/28/european-passion-play-2008</feedburner:origLink></entry>
  <entry xml:base="http://blog.synatic.net/">
    <author>
      <name>benedikt</name>
    </author>
    <id>tag:blog.synatic.net,2008-02-19:1259</id>
    <published>2008-02-19T13:37:00Z</published>
    <updated>2008-02-19T13:44:18Z</updated>
    <category term="Other" />
    <link href="http://feeds.feedburner.com/~r/synatic_net/~3/270132740/web-screendesigner-needed" rel="alternate" type="text/html" />
    <title>Web-/Screendesigner needed!</title>
<content type="html">
            &lt;p&gt;I’m a total moron when it comes to web- and screendesign. I totally lost the ability to build visually appealing websites (or maybe my demands just grow) over the last few years. Unfortunately a good looking design is a must for every website or -application. I’ve some ideas in mind that I’d like to realize. To do so &lt;strong&gt;I definitely need help&lt;/strong&gt;! As a result I’m looking for a&lt;/p&gt;


	&lt;p&gt;&lt;strong&gt;Web-/Screendesigner&lt;/strong&gt;&lt;/p&gt;


	&lt;p&gt;for cooperation on these (and maybe even more) projects. Knowledge of (x)html, css, and javascript is a plus but not necessarily required. So, if you’re experienced in designing websites &lt;em&gt;please&lt;/em&gt; contact me by mail using &lt;code&gt;benedikt at synatic dot net&lt;/code&gt; or comment below.&lt;/p&gt;


	&lt;p&gt;I’m looking forward to your message! :-)&lt;/p&gt;


	&lt;p&gt;Thanks!&lt;/p&gt;
          &lt;img src="http://feeds.feedburner.com/~r/synatic_net/~4/270132740" height="1" width="1"/&gt;</content>  <feedburner:origLink>http://blog.synatic.net/2008/2/19/web-screendesigner-needed</feedburner:origLink></entry>
  <entry xml:base="http://blog.synatic.net/">
    <author>
      <name>benedikt</name>
    </author>
    <id>tag:blog.synatic.net,2008-02-15:1257</id>
    <published>2008-02-15T18:42:00Z</published>
    <updated>2008-02-15T18:48:55Z</updated>
    <category term="Other" />
    <link href="http://feeds.feedburner.com/~r/synatic_net/~3/270132741/mplayer-patented-technology-joke" rel="alternate" type="text/html" />
    <title>Mplayer patented technology joke</title>
<content type="html">
            &lt;p&gt;I just played a mms-stream using &lt;a href="http://www.mplayerhq.hu/"&gt;mplayer&lt;/a&gt; in the console. After it was done I read this in the console:&lt;/p&gt;


&lt;code&gt;Everything done. Thank you for downloading a media file containing proprietary and patented technology.&lt;/code&gt;

	&lt;p&gt;(Looks like this is my shortest blog entry ever … ;-))&lt;/p&gt;
          &lt;img src="http://feeds.feedburner.com/~r/synatic_net/~4/270132741" height="1" width="1"/&gt;</content>  <feedburner:origLink>http://blog.synatic.net/2008/2/15/mplayer-patented-technology-joke</feedburner:origLink></entry>
  <entry xml:base="http://blog.synatic.net/">
    <author>
      <name>benedikt</name>
    </author>
    <id>tag:blog.synatic.net,2008-02-14:1256</id>
    <published>2008-02-14T13:14:00Z</published>
    <updated>2008-02-14T13:26:07Z</updated>
    <category term="Articles" />
    <category term="Javascript" />
    <category term="checkbox" />
    <category term="forms" />
    <category term="jason long" />
    <category term="javascript" />
    <category term="menu" />
    <category term="prototype" />
    <category term="tutorial" />
    <category term="vitamin" />
    <category term="widgets" />
    <link href="http://feeds.feedburner.com/~r/synatic_net/~3/270132742/extended-forms-with-widgets" rel="alternate" type="text/html" />
    <title>Extended: Forms with widgets</title>
<content type="html">
            &lt;p&gt;&lt;a href="http://www.thinkvitamin.com/features/css/streamline-your-forms-with-widgets"&gt;&lt;img src="http://blog.synatic.net/assets/2008/2/14/vitamin.png" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;


	&lt;p&gt;There is a &lt;a href="http://www.thinkvitamin.com/features/css/streamline-your-forms-with-widgets"&gt;great article&lt;/a&gt; by &lt;a href="http://www.thinkvitamin.com/advisors/jason_long.php"&gt;Jason Long&lt;/a&gt; on &lt;a href="http://www.thinkvitamin.org/"&gt;Vitamin&lt;/a&gt; called &lt;a href="http://www.thinkvitamin.com/features/css/streamline-your-forms-with-widgets"&gt;‘Streamline your forms with widgets’.&lt;/a&gt; In his article Jason Long describes a nice looking way to clean up a lot of checkboxes into multiple dropdown widgets. What I really liked was the idea to have some summary about the selected items next to the title of the dropdown widgets. Unfortunately he didn’t implement the updating function but just mentioned it as a possible extension. In addition he pointed out that “Any Fuel” would be much easier to read than “Fuel (Gasoline, Diesel, Alternative)”. As I was in the right mood for some Javascript I implemented the missing functionality.&lt;/p&gt;


	&lt;p&gt;At first I added four little lines to the top of the &lt;code&gt;toggleDropdown()&lt;/code&gt; function. This little snippet checks weather the panel is currently visible (so the function was toggled to hide the panel again) and calls the &lt;code&gt;updateTitle()&lt;/code&gt; function.&lt;/p&gt;


&lt;pre class="twilight"&gt;&lt;span class="line-numbers"&gt;   1 &lt;/span&gt; &lt;span class="Storage"&gt;function&lt;/span&gt; &lt;span class="Entity"&gt;toggleDropdown&lt;/span&gt;(&lt;span class="Variable"&gt;panel&lt;/span&gt;) 
&lt;span class="line-numbers"&gt;   2 &lt;/span&gt; {
&lt;span class="line-numbers"&gt;   3 &lt;/span&gt;   panel &lt;span class="Keyword"&gt;=&lt;/span&gt; &lt;span class="Keyword"&gt;$&lt;/span&gt;(panel);
&lt;span class="line-numbers"&gt;   4 &lt;/span&gt;   &lt;span class="Keyword"&gt;if&lt;/span&gt;(panel.visible()) {
&lt;span class="line-numbers"&gt;   5 &lt;/span&gt;     updateTitle(panel);
&lt;span class="line-numbers"&gt;   6 &lt;/span&gt;   }
&lt;span class="line-numbers"&gt;   7 &lt;/span&gt; 
&lt;span class="line-numbers"&gt;   8 &lt;/span&gt;   &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;//&lt;/span&gt; toggle the requested one&lt;/span&gt;
&lt;span class="line-numbers"&gt;   9 &lt;/span&gt;   Element.toggle(panel);
&lt;span class="line-numbers"&gt;  10 &lt;/span&gt;      
&lt;span class="line-numbers"&gt;  11 &lt;/span&gt;   &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;//&lt;/span&gt; then hide all of the others so that only&lt;/span&gt;
&lt;span class="line-numbers"&gt;  12 &lt;/span&gt;   &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;//&lt;/span&gt; one (at most) is open at a time&lt;/span&gt;
&lt;span class="line-numbers"&gt;  13 &lt;/span&gt;   &lt;span class="Keyword"&gt;$&lt;/span&gt;&lt;span class="Keyword"&gt;$&lt;/span&gt;(&lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;body .dd_option_panel&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;).each(&lt;span class="Storage"&gt;function&lt;/span&gt;(node){
&lt;span class="line-numbers"&gt;  14 &lt;/span&gt;     &lt;span class="Keyword"&gt;if&lt;/span&gt; (node &lt;span class="Keyword"&gt;!&lt;/span&gt;&lt;span class="Keyword"&gt;=&lt;/span&gt; &lt;span class="Keyword"&gt;$&lt;/span&gt;(panel)) {
&lt;span class="line-numbers"&gt;  15 &lt;/span&gt;       Element.hide(node);
&lt;span class="line-numbers"&gt;  16 &lt;/span&gt;     }
&lt;span class="line-numbers"&gt;  17 &lt;/span&gt;   });  
&lt;span class="line-numbers"&gt;  18 &lt;/span&gt; }
&lt;/pre&gt;

	&lt;p&gt;To do the actual updating of the title I used &lt;a href="http://www.prototypejs.org/"&gt;Prototype’s&lt;/a&gt; nifty little &lt;span class="caps"&gt;DOM&lt;/span&gt; traversal toolkit. It provides methods such as &lt;a href="http://prototypejs.org/api/element/select"&gt;&lt;code&gt;Element#select()&lt;/code&gt;&lt;/a&gt;, &lt;a href="http://prototypejs.org/api/element/up"&gt;&lt;code&gt;Element#up()&lt;/code&gt;&lt;/a&gt;, &lt;a href="http://prototypejs.org/api/element/down"&gt;&lt;code&gt;Element#down()&lt;/code&gt;&lt;/a&gt;, &lt;a href="http://prototypejs.org/api/element/previous"&gt;&lt;code&gt;Element#previous()&lt;/code&gt;&lt;/a&gt; and &lt;a href="http://prototypejs.org/api/element/next"&gt;&lt;code&gt;Element#next()&lt;/code&gt;.&lt;/a&gt; All of can be supplied with a selector, similar to those in &lt;span class="caps"&gt;CSS&lt;/span&gt;.&lt;/p&gt;


	&lt;p&gt;First I select all child elements of type “input” and check their value. If the value matches “on” the checkbox is selected and I travel down to the next “label”-element to push it’s content into an array. Afterwards I check the size of this array and decide how to change the title. If none of the checkboxes are selected I add “No ” to the title and don’t display the list of the selected values. Accordingly if all are selected I prepend “Any ”. Otherwise I leave the title as it is and update the list behind it by joining the elements of the array into a string. To prevent titles such as “Any Any No Any Fuel” I clean up the title by removing either Any or No in front of the title using &lt;a href="http://prototypejs.org/api/string/gsub"&gt;&lt;code&gt;String#gsub()&lt;/code&gt;.&lt;/a&gt;&lt;/p&gt;


&lt;pre class="twilight"&gt;&lt;span class="line-numbers"&gt;   1 &lt;/span&gt; &lt;span class="Storage"&gt;function&lt;/span&gt; &lt;span class="Entity"&gt;updateTitle&lt;/span&gt;(&lt;span class="Variable"&gt;panel&lt;/span&gt;)
&lt;span class="line-numbers"&gt;   2 &lt;/span&gt; {
&lt;span class="line-numbers"&gt;   3 &lt;/span&gt;   selected &lt;span class="Keyword"&gt;=&lt;/span&gt; &lt;span class="Keyword"&gt;new&lt;/span&gt; &lt;span class="Entity"&gt;Array&lt;/span&gt;();
&lt;span class="line-numbers"&gt;   4 &lt;/span&gt;   panel.&lt;span class="SupportFunction"&gt;select&lt;/span&gt;(&lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;input&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;).each(&lt;span class="Storage"&gt;function&lt;/span&gt;(box){
&lt;span class="line-numbers"&gt;   5 &lt;/span&gt;     &lt;span class="Keyword"&gt;if&lt;/span&gt;(box.getValue() &lt;span class="Keyword"&gt;==&lt;/span&gt; &lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;on&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;) {
&lt;span class="line-numbers"&gt;   6 &lt;/span&gt;       selected.&lt;span class="SupportFunction"&gt;push&lt;/span&gt;(box.&lt;span class="SupportConstant"&gt;next&lt;/span&gt;(&lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;label&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;).innerHTML);
&lt;span class="line-numbers"&gt;   7 &lt;/span&gt;     }
&lt;span class="line-numbers"&gt;   8 &lt;/span&gt;   });
&lt;span class="line-numbers"&gt;   9 &lt;/span&gt;      
&lt;span class="line-numbers"&gt;  10 &lt;/span&gt;   inner &lt;span class="Keyword"&gt;=&lt;/span&gt; panel.&lt;span class="SupportConstant"&gt;previous&lt;/span&gt;(&lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;.inner&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;);
&lt;span class="line-numbers"&gt;  11 &lt;/span&gt;   title &lt;span class="Keyword"&gt;=&lt;/span&gt; inner.innerHTML.gsub(&lt;span class="StringRegexp"&gt;&lt;span class="StringRegexp"&gt;/&lt;/span&gt;^([Any|No])&lt;span class="StringRegexp"&gt;/&lt;/span&gt;&lt;/span&gt;, &lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;);
&lt;span class="line-numbers"&gt;  12 &lt;/span&gt;   
&lt;span class="line-numbers"&gt;  13 &lt;/span&gt;   &lt;span class="Keyword"&gt;if&lt;/span&gt;(selected.&lt;span class="SupportConstant"&gt;length&lt;/span&gt; &lt;span class="Keyword"&gt;==&lt;/span&gt; &lt;span class="Constant"&gt;0&lt;/span&gt;) {
&lt;span class="line-numbers"&gt;  14 &lt;/span&gt;     inner.update(&lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;No &lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt; &lt;span class="Keyword"&gt;+&lt;/span&gt; title);
&lt;span class="line-numbers"&gt;  15 &lt;/span&gt;     inner.down(&lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;.light&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;).update(&lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;);
&lt;span class="line-numbers"&gt;  16 &lt;/span&gt;   } &lt;span class="Keyword"&gt;else&lt;/span&gt; &lt;span class="Keyword"&gt;if&lt;/span&gt;(selected.&lt;span class="SupportConstant"&gt;length&lt;/span&gt; &lt;span class="Keyword"&gt;==&lt;/span&gt; panel.&lt;span class="SupportFunction"&gt;select&lt;/span&gt;(&lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;label&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;).&lt;span class="SupportConstant"&gt;length&lt;/span&gt;) {
&lt;span class="line-numbers"&gt;  17 &lt;/span&gt;     inner.update(&lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;Any &lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt; &lt;span class="Keyword"&gt;+&lt;/span&gt; title);
&lt;span class="line-numbers"&gt;  18 &lt;/span&gt;     inner.down(&lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;.light&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;).update(&lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;);
&lt;span class="line-numbers"&gt;  19 &lt;/span&gt;   } &lt;span class="Keyword"&gt;else&lt;/span&gt; {
&lt;span class="line-numbers"&gt;  20 &lt;/span&gt;     inner.update(title);
&lt;span class="line-numbers"&gt;  21 &lt;/span&gt;     inner.down(&lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;.light&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;).update(&lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;(&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt; &lt;span class="Keyword"&gt;+&lt;/span&gt; selected.&lt;span class="SupportFunction"&gt;join&lt;/span&gt;(&lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;, &lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;) &lt;span class="Keyword"&gt;+&lt;/span&gt; &lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;)&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;);
&lt;span class="line-numbers"&gt;  22 &lt;/span&gt;   }
&lt;span class="line-numbers"&gt;  23 &lt;/span&gt; }
&lt;/pre&gt;

	&lt;p&gt;In order to get correct titles right from the beginning I update all titles after the page loaded.&lt;/p&gt;


&lt;pre class="twilight"&gt;&lt;span class="line-numbers"&gt;   1 &lt;/span&gt; Event.observe(&lt;span class="Support"&gt;window&lt;/span&gt;, &lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;load&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;, &lt;span class="Storage"&gt;function&lt;/span&gt;(&lt;span class="Support"&gt;event&lt;/span&gt;) {
&lt;span class="line-numbers"&gt;   2 &lt;/span&gt;   &lt;span class="Keyword"&gt;$&lt;/span&gt;&lt;span class="Keyword"&gt;$&lt;/span&gt;(&lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;body .dd_option_panel&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;).each(&lt;span class="Storage"&gt;function&lt;/span&gt;(panel) {
&lt;span class="line-numbers"&gt;   3 &lt;/span&gt;     updateTitle(panel);
&lt;span class="line-numbers"&gt;   4 &lt;/span&gt;   });
&lt;span class="line-numbers"&gt;   5 &lt;/span&gt; });
&lt;/pre&gt;

	&lt;p&gt;That’s it! &lt;a href="http://blog.synatic.net/assets/2008/2/14/demo.html"&gt;&lt;strong&gt;Click here to see the changed example.&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;


	&lt;p&gt;Of course all the credits for the original implementation, graphics, and idea go to &lt;a href="http://www.thinkvitamin.com/advisors/jason_long.php"&gt;Jason Long.&lt;/a&gt;&lt;/p&gt;
          &lt;img src="http://feeds.feedburner.com/~r/synatic_net/~4/270132742" height="1" width="1"/&gt;</content>  <feedburner:origLink>http://blog.synatic.net/2008/2/14/extended-forms-with-widgets</feedburner:origLink></entry>
  <entry xml:base="http://blog.synatic.net/">
    <author>
      <name>benedikt</name>
    </author>
    <id>tag:blog.synatic.net,2008-02-13:1255</id>
    <published>2008-02-13T09:02:00Z</published>
    <updated>2008-02-13T09:04:05Z</updated>
    <category term="Processing" />
    <category term="angelica" />
    <category term="audiovis" />
    <category term="processing" />
    <link href="http://feeds.feedburner.com/~r/synatic_net/~3/270132743/angelica-sourcecode" rel="alternate" type="text/html" />
    <title>Angelica sourcecode</title>
<content type="html">
            &lt;p&gt;It took a little longer, but finally here’s the sourcecode for &lt;a href="/2008/1/25/processing-angelica"&gt;Angelica.&lt;/a&gt;&lt;/p&gt;


	&lt;p&gt;&lt;a href="/assets/2008/2/13/AudioVis.tar.gz"&gt;&lt;strong&gt;Download AudioVis.tar.gz (302,4 KB)&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;


	&lt;p&gt;If you want to include lyrics, the file must contain data in this format:&lt;/p&gt;


&lt;pre class="twilight"&gt;&lt;span class="line-numbers"&gt;   1 &lt;/span&gt; [00:31.09] Finally the hills are without eyes
&lt;span class="line-numbers"&gt;   2 &lt;/span&gt; [00:34.50] They are tired of painting a dead man's face red
&lt;span class="line-numbers"&gt;   3 &lt;/span&gt; [00:40.01] With their own blood
&lt;span class="line-numbers"&gt;   4 &lt;/span&gt; [00:44.31] They used to love having so much to lose
&lt;span class="line-numbers"&gt;   5 &lt;/span&gt; [00:49.92] Blink your eyes just once and see everything in ruins 
&lt;/pre&gt;

	&lt;p&gt;To encode the images into video I used &lt;a href="http://www.mplayerhq.hu/"&gt;mencoder&lt;/a&gt; with these parameters:&lt;/p&gt;


&lt;pre class="twilight"&gt;&lt;span class="line-numbers"&gt;   1 &lt;/span&gt; /usr/bin/mencoder &lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;mf://out/*.png&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; -mf fps=25 -audiofile data/audio.mp3 &lt;span class="Constant"&gt;\&lt;/span&gt;
&lt;span class="line-numbers"&gt;   2 &lt;/span&gt; -o video.avi -oac copy -ovc lavc &lt;span class="Constant"&gt;\&lt;/span&gt;
&lt;span class="line-numbers"&gt;   3 &lt;/span&gt; -lavcopts vcodec=mpeg4:vbitrate=16000:mbd=2:trell=yes:v4mv=yes
&lt;/pre&gt;

	&lt;p&gt;Feel free to use, change and criticize the code. It’s far from being perfect. ;-)&lt;/p&gt;


	&lt;p&gt;I’m looking forward to your comments.&lt;/p&gt;
          &lt;img src="http://feeds.feedburner.com/~r/synatic_net/~4/270132743" height="1" width="1"/&gt;</content>  <feedburner:origLink>http://blog.synatic.net/2008/2/13/angelica-sourcecode</feedburner:origLink></entry>
  <entry xml:base="http://blog.synatic.net/">
    <author>
      <name>benedikt</name>
    </author>
    <id>tag:blog.synatic.net,2008-01-25:1187</id>
    <published>2008-01-25T08:30:00Z</published>
    <updated>2008-01-25T09:01:25Z</updated>
    <category term="Processing" />
    <category term="processing.org animation video music lamb" />
    <link href="http://feeds.feedburner.com/~r/synatic_net/~3/270132744/processing-angelica" rel="alternate" type="text/html" />
    <title>Processing Angelica</title>
<content type="html">
            &amp;lt;object height="385" width="480"&gt;    &amp;lt;param /&gt;    &amp;lt;param /&gt;    &amp;lt;param /&gt;    &amp;lt;param /&gt;&amp;lt;/object&gt;

	&lt;p&gt;This is the first processing sketch using audio visualization I built. It was created as a final project for a Processing course at the &lt;a href="http://www.hs-fulda.de/"&gt;University of Applied Sciences Fulda.&lt;/a&gt; As one might guess, it was inspired by the amazing works of &lt;a href="http://www.flight404.com/"&gt;flight404.&lt;/a&gt; All frames have been rendered into pngs and encoded to video, using &lt;a href="http://www.mplayerhq.hu/"&gt;mencoder,&lt;/a&gt; later. Music is Lamb – Angelica. Made with &lt;a href="http://www.processing.org/"&gt;Processing.&lt;/a&gt;&lt;/p&gt;


	&lt;p&gt;I’ll upload the sources later and maybe write a short tutorial about it …&lt;/p&gt;
          &lt;img src="http://feeds.feedburner.com/~r/synatic_net/~4/270132744" height="1" width="1"/&gt;</content>  <feedburner:origLink>http://blog.synatic.net/2008/1/25/processing-angelica</feedburner:origLink></entry>
  <entry xml:base="http://blog.synatic.net/">
    <author>
      <name>benedikt</name>
    </author>
    <id>tag:blog.synatic.net,2008-01-14:1145</id>
    <published>2008-01-14T09:41:00Z</published>
    <updated>2008-01-14T11:13:51Z</updated>
    <category term="Processing" />
    <category term="fuzzy" />
    <category term="jetz" />
    <category term="processing" />
    <link href="http://feeds.feedburner.com/~r/synatic_net/~3/270132745/fuzzy-controlled-jet-with-processing" rel="alternate" type="text/html" />
    <title>Fuzzy-controlled jet with Processing</title>
<content type="html">
            &lt;p&gt;This one started as an homework for university but I really started to like it. The original task was to built a fuzzy controller using &lt;a href="http://de.wikipedia.org/wiki/MATLAB"&gt;Matlab&lt;/a&gt; in groups of 2 or 3 students. I joined &lt;a href="http://blog.benholio.de/"&gt;Benjamin&lt;/a&gt; and another fellow student to create a simple fuzzy controller for flying a plane in a given height above the ground. To make things a little more complex we also considered head wind. As all of us three didn’t like the quite abstract results of our controller in Matlab, we decided to implement a small simulation in &lt;a href="http://www.processing.org/"&gt;processing.&lt;/a&gt; We used &lt;a href="http://people.clarkson.edu/~esazonov/FuzzyEngine.htm"&gt;Edward Saznov’s open source fuzzy inference engine for Java&lt;/a&gt; and integrated it into processing. Surprisingly everything worked quite well from the beginning. Although we had some small issues we were able to build a nice looking and functional simulation using the controller we designed. The resulting applet runs perfectly in the browser and as an application. (I love processing’s export-feature.) Check out the sketch by clicking on the picture below.&lt;/p&gt;


	&lt;p&gt;&lt;a href="http://benedikt.synatic.net/fuzzy/"&gt;&lt;img src="http://blog.synatic.net/assets/2008/1/14/fuzzy.png" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;


	&lt;p&gt;Here are the controls you might need :-)&lt;/p&gt;


	&lt;table&gt;
		&lt;tr&gt;
			&lt;td&gt; R &lt;/td&gt;
			&lt;td&gt; Reset the terrain&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td&gt; Space &lt;/td&gt;
			&lt;td&gt; Start / Stop simulatoin &lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td&gt; Arrow up / down &lt;/td&gt;
			&lt;td&gt; Change wind angle &lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td&gt; Arrow left &lt;/td&gt;
			&lt;td&gt; Increase wind power &lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td&gt; Arrow right &lt;/td&gt;
			&lt;td&gt; Reduce wind power &lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td&gt; Click &lt;/td&gt;
			&lt;td&gt; Set position of the plane &lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td&gt; Dragging the mouse &lt;/td&gt;
			&lt;td&gt; Draw terrain &lt;/td&gt;
		&lt;/tr&gt;
	&lt;/table&gt;




	&lt;p&gt;We decided to release the source code of this. It still could need some refactoring, but it’s working and deadline was today, so feel free to experiment with it (or even improve it) and sent us some comments!&lt;/p&gt;
          &lt;img src="http://feeds.feedburner.com/~r/synatic_net/~4/270132745" height="1" width="1"/&gt;</content>  <feedburner:origLink>http://blog.synatic.net/2008/1/14/fuzzy-controlled-jet-with-processing</feedburner:origLink></entry>
</feed>
