<?xml version="1.0" encoding="UTF-8"?>
<!-- generator="wordpress/2.0.7" -->
<rss version="2.0" 
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	>

<channel>
	<title>ChoJin's Quarter</title>
	<link>http://www.qualifilms.com/blog</link>
	<description>Computer Sciences, Cooking, Photography and Filmmaking...</description>
	<pubDate>Sun, 06 Sep 2009 22:09:29 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.0.7</generator>
	<language>en</language>
			<item>
		<title>Ruby and Web Scraping/Automation</title>
		<link>http://www.qualifilms.com/blog/computer-science/2009/09/ruby-and-web-scrapingautomation/</link>
		<comments>http://www.qualifilms.com/blog/computer-science/2009/09/ruby-and-web-scrapingautomation/#comments</comments>
		<pubDate>Sun, 06 Sep 2009 22:08:08 +0000</pubDate>
		<dc:creator>ChoJin</dc:creator>
		
		<category>Computer Science</category>

		<category>Hacking</category>

	<!-- AutoMeta Start -->
	<category>ruby</category>
	<category>mechanize</category>
	<category>automation</category>
	<category>scraping</category>
	<category>https</category>
	<category>http</category>
	<category>webpage</category>
	<!-- AutoMeta End -->
	
		<guid isPermaLink="false">http://www.qualifilms.com/blog/computer-science/2009/09/ruby-and-web-scrapingautomation/</guid>
		<description><![CDATA[Sometimes you encounter a web task that is soooo boring you'd wish you had robot doing it for you. I encountered a few of those during this summer so I figured out it was time to acquire some Web Scraping and Automation Ninja skillz.
Turned out it's fairly easy, thanks to very useful libraries made for [...]]]></description>
			<content:encoded><![CDATA[<p>Sometimes you encounter a web task that is soooo boring you'd wish you had robot doing it for you. I encountered a few of those during this summer so I figured out it was time to acquire some Web Scraping and Automation Ninja skillz.</p>
<p>Turned out it's fairly easy, thanks to very useful libraries made for this very same reason. I'm therefore going to give you a quick overview of its simplicity, show you how much you can achieve with only a few lines of code and I'll conclude this blog post with a real-world script example proving med' school students should learn programming <img src='http://www.qualifilms.com/blog/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /><br />
<a id="more-118"></a></p>
<h4 class="articletitle">Ruby and Mechanize to the rescue</h4>
<p>Nowadays, when it comes to scripts I would suggest two languages: Ruby or Python. They are so powerful and so convenient, it's very hard to argue for anything else unless you have strong constraints.</p>
<p>Ruby or Python?<br />
It's mostly a matter of taste, and my heart leans toward Ruby for various reasons (that I won't develop here to prevent from an epic troll), hence the use of Ruby here. In the Ruby land, I found two libraries to be quite valuable for web scraping, automation and pentesting : Mechanize and WWMD.</p>
<p>In this post, I'm going to illustrate Mechanize, WWMD will be used in a later post. With Mechanize it's fairly easy to connect to an HTTP or HTTPS web page, retrieve its content, parse it, fill some forms, click a button or all these kind of things.</p>
<h4 class="articletitle">A basic introduction to Mechanize</h4>
<p>For example, let's say you have a HTTPS web page, with a form named "connexion", a text field for the user and pass information and a button to login. You could use the following code to authenticate:</p>
<div class="igBar"><span id="lruby-7"><a href="#" onclick="javascript:showPlainTxt('ruby-7'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite">
<div id="ruby-7">
<div class="ruby">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">agent = WWW::Mechanize.<span style="color:#9900CC;">new</span> <span style="color:#006600; font-weight:bold;">&#123;</span> |agent|</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; agent.<span style="color:#9900CC;">user_agent_alias</span> = 'Mac FireFox'</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#006600; font-weight:bold;">&#125;</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">page = agent.<span style="color:#9900CC;">get</span><span style="color:#006600; font-weight:bold;">&#40;</span>'https://www.<span style="color:#9900CC;">example</span>.<span style="color:#9900CC;">com</span>/'<span style="color:#006600; font-weight:bold;">&#41;</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">connform = page.<span style="color:#9900CC;">form</span><span style="color:#006600; font-weight:bold;">&#40;</span>'connexion'<span style="color:#006600; font-weight:bold;">&#41;</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">connform.<span style="color:#9900CC;">user</span> = <span style="color:#996600;">"user1"</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">connform.<span style="color:#9900CC;">pass</span> = <span style="color:#996600;">"pass1"</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">page = agent.<span style="color:#9900CC;">submit</span><span style="color:#006600; font-weight:bold;">&#40;</span>connform, connform.<span style="color:#9900CC;">buttons</span>.<span style="color:#9900CC;">first</span><span style="color:#006600; font-weight:bold;">&#41;</span> </div>
</li>
</ol>
</div>
</div>
</div>
<p></p>
<p>Easy enough, isn't it?</p>
<p>Mechanize has a lot of syntaxic sugar, for example if the form has multiple buttons with assigned names you could do:</p>
<div class="igBar"><span id="lruby-8"><a href="#" onclick="javascript:showPlainTxt('ruby-8'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite">
<div id="ruby-8">
<div class="ruby">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">connform.<span style="color:#9900CC;">button_with</span><span style="color:#006600; font-weight:bold;">&#40;</span>:name =&gt; 'login'<span style="color:#006600; font-weight:bold;">&#41;</span> </div>
</li>
</ol>
</div>
</div>
</div>
<p></p>
<p>the "_with" sugar applies to pretty much anything the page object contains, such as links, forms, buttons etc.</p>
<p>With Mechanize it's as easy to check a radiobox or select an option from a selection list:</p>
<div class="igBar"><span id="lruby-9"><a href="#" onclick="javascript:showPlainTxt('ruby-9'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite">
<div id="ruby-9">
<div class="ruby">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">form.<span style="color:#9900CC;">radiobuttons_with</span><span style="color:#006600; font-weight:bold;">&#40;</span>:name =&gt; 'box'<span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">first</span>.<span style="color:#9900CC;">check</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">form.<span style="color:#9900CC;">field_with</span><span style="color:#006600; font-weight:bold;">&#40;</span>:name =&gt; 'list'<span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">options</span><span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006666;color:#800000;">0</span><span style="color:#006600; font-weight:bold;">&#93;</span>.<span style="color:#CC0066; font-weight:bold;">select</span> </div>
</li>
</ol>
</div>
</div>
</div>
<p></p>
<p>Or 'clicking' on a link:</p>
<div class="igBar"><span id="lruby-10"><a href="#" onclick="javascript:showPlainTxt('ruby-10'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite">
<div id="ruby-10">
<div class="ruby">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">agent.<span style="color:#9900CC;">click</span> page.<span style="color:#9900CC;">link_with</span><span style="color:#006600; font-weight:bold;">&#40;</span>:text =&gt; 'News'<span style="color:#006600; font-weight:bold;">&#41;</span> </div>
</li>
</ol>
</div>
</div>
</div>
<p></p>
<p>Mechanize also supports standard xpath scraping, so let's say you want to find a bold text in a paragraph inside a div with an id='foo':</p>
<div class="igBar"><span id="lruby-11"><a href="#" onclick="javascript:showPlainTxt('ruby-11'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite">
<div id="ruby-11">
<div class="ruby">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">value = page.<span style="color:#9900CC;">search</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">"//div[@id='foo']/p/b"</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">text</span> </div>
</li>
</ol>
</div>
</div>
</div>
<p></p>
<p>You got the idea, everything is fairly straight forward and I strongly urge you to read Mechanize's documentation and a general xpath guideline.</p>
<h4 class="articletitle">A real world example</h4>
<p>In a later post, I'll show you how to apply these principle to implement a game bot/trainer, but for this small introduction, let's take a simple example.</p>
<p>At my school, the first year students have to choose a schedule (among 8 of them) at the beginning of the year. Some of them are more popular than others, and only a few places are released for each schedule at random hours every day. Because of this, you have at any given time approx. 100 students frenetically pressing the 'F5' key to try to catch a spot in the popular schedules (yeah, first year of med' school students are under high pressure and become robots <img src='http://www.qualifilms.com/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  ). When places are added, they are all gone in approx. 2s or less, so you need either of the following features to secure a spot:</p>
<ul>
<li>Being Lucky</li>
<li>Being patient</li>
<li>Being a robot in front of your computer 24/7</li>
<li>Having Ninja speed and skills</li>
<li>All of the above</li>
</ul>
<p>Or... You can yet prove again than brain 0wn$ muscles and learn Ruby programming <img src='http://www.qualifilms.com/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>The following script is fairly simple and should be a good example of multiple features of Mechanize. It basically authenticates with a chosen user credential to the website, then try to select a given schedule. If it fails, it sleeps 1s (remember places are all gone in less than 2s for the popular ones...), and try again.</p>
<p>When a schedule is available, the script still has to choose a sub-group. So it enters the Ninja auto-fire mode, and quickly tries all groups available from the select list in the form. As soon as it succeeds, it validates the choice and stop. You also have a few sanity checks in the script to prevent from wrongly selecting a schedule/group in case of failing attempt from the server to fool automation...</p>
<p>I introduced a few bugs on purpose in this script to prevent script kiddies from my school to re-use it as is, insofar as it is given here solely to illustrate the subject matter. I'm making a wild guess that if one of them is smart enough to figure out how to install the ruby environment and dependencies, fix the bugs I introduced and run it successfully, he would probably be skilled enough to write it himself. So no real harm is done <img src='http://www.qualifilms.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Here is the script (with anti-script kiddies bugs), I hope it will be self-documented enough to understand it. Drop me a comment otherwise.</p>
<div class="igBar"><span id="lruby-12"><a href="#" onclick="javascript:showPlainTxt('ruby-12'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite">
<div id="ruby-12">
<div class="ruby">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#008000; font-style:italic;">#! /usr/bin/env ruby</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#CC0066; font-weight:bold;">require</span> 'rubygems'</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#CC0066; font-weight:bold;">require</span> 'pp'</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#CC0066; font-weight:bold;">require</span> 'mechanize'</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#9966CC; font-weight:bold;">def</span> print_curchoice<span style="color:#006600; font-weight:bold;">&#40;</span>agent, link<span style="color:#006600; font-weight:bold;">&#41;</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; page = agent.<span style="color:#9900CC;">click</span> link</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; curchoice = page.<span style="color:#9900CC;">search</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">"//div[@id='page']/p/b"</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">text</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; <span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">"Current choice: #{curchoice}"</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#9966CC; font-weight:bold;">end</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#9966CC; font-weight:bold;">def</span> select_sp<span style="color:#006600; font-weight:bold;">&#40;</span>agent, link, sp<span style="color:#006600; font-weight:bold;">&#41;</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; page = agent.<span style="color:#9900CC;">click</span> link</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; form = page.<span style="color:#9900CC;">forms</span>.<span style="color:#9900CC;">first</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; form.<span style="color:#9900CC;">section</span> = <span style="color:#996600;">"SP#{sp}"</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; <span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">"Selecting SP#{sp}..."</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; page = agent.<span style="color:#9900CC;">submit</span><span style="color:#006600; font-weight:bold;">&#40;</span>form, form.<span style="color:#9900CC;">buttons</span>.<span style="color:#9900CC;">first</span><span style="color:#006600; font-weight:bold;">&#41;</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; error = page.<span style="color:#9900CC;">search</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">"//div[@id='page']/p[@class='erreur']"</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">first</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; <span style="color:#0000FF; font-weight:bold;">return</span> <span style="color:#0000FF; font-weight:bold;">false</span> <span style="color:#9966CC; font-weight:bold;">unless</span> error</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; form = page.<span style="color:#9900CC;">forms</span>.<span style="color:#9900CC;">first</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; <span style="color:#008000; font-style:italic;"># Iterate through the group until we can find a successful one</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; <span style="color:#9966CC; font-weight:bold;">for</span> option <span style="color:#9966CC; font-weight:bold;">in</span> form.<span style="color:#9900CC;">field_with</span><span style="color:#006600; font-weight:bold;">&#40;</span>:name =&gt; 'group'<span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">options</span> <span style="color:#9966CC; font-weight:bold;">do</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; option.<span style="color:#CC0066; font-weight:bold;">select</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; grp = form.<span style="color:#9900CC;">groupe</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; <span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">"Selecting group #{grp}..."</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; result = agent.<span style="color:#9900CC;">submit</span><span style="color:#006600; font-weight:bold;">&#40;</span>form, form.<span style="color:#9900CC;">buttons</span>.<span style="color:#9900CC;">first</span><span style="color:#006600; font-weight:bold;">&#41;</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; section = result.<span style="color:#9900CC;">search</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">"//div[@id='egap']/p/b"</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">text</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; <span style="color:#008000; font-style:italic;"># Sanity check, just in case...</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; <span style="color:#9966CC; font-weight:bold;">unless</span> section &amp;&amp; section == <span style="color:#996600;">"SP#{sp}#{grp}"</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp; <span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">"Ooops..."</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp; <span style="color:#9966CC; font-weight:bold;">next</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; <span style="color:#9966CC; font-weight:bold;">end</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; <span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">"Validation..."</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; result = agent.<span style="color:#9900CC;">submit</span><span style="color:#006600; font-weight:bold;">&#40;</span>result.<span style="color:#9900CC;">forms</span>.<span style="color:#9900CC;">first</span>, result.<span style="color:#9900CC;">forms</span>.<span style="color:#9900CC;">first</span>.<span style="color:#9900CC;">button_with</span><span style="color:#006600; font-weight:bold;">&#40;</span>'bdeclare'<span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#41;</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; msg = result.<span style="color:#9900CC;">search</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">"//div[@id='page']/p[@class='msg']"</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">text</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; <span style="color:#9966CC; font-weight:bold;">unless</span> msg &amp;&amp; msg == <span style="color:#996600;">"Votre inscription au groupe SP#{sp}#{grp} a été enregistrée."</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp; <span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">"Ooops..."</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp; <span style="color:#9966CC; font-weight:bold;">next</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; <span style="color:#9966CC; font-weight:bold;">end</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; <span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">"Epic Win! <img src='http://www.qualifilms.com/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> "</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; <span style="color:#0000FF; font-weight:bold;">return</span> <span style="color:#0000FF; font-weight:bold;">true</span>&nbsp; &nbsp; </div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; <span style="color:#9966CC; font-weight:bold;">end</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; <span style="color:#0000FF; font-weight:bold;">return</span> <span style="color:#0000FF; font-weight:bold;">false</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#9966CC; font-weight:bold;">end</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#9966CC; font-weight:bold;">if</span> ARGV.<span style="color:#9900CC;">size</span> != <span style="color:#006666;color:#800000;">3</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; <span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">"========================="</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; <span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">"SPSelect by ChoJin © 2009"</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; <span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">"========================="</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; <span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">"./spselect.rb &lt;login&gt; &lt;password&gt; &lt;SP number&gt;"</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; <span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">"example: to register to the section SP1 with username 'user1' and password 'pass1':"</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; <span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">"./spselect.rb user1 pass1 1"</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; <span style="color:#CC0066; font-weight:bold;">exit</span> <span style="color:#006666;color:#800000;">1</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#9966CC; font-weight:bold;">end</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">agent = WWW::Mechanize.<span style="color:#9900CC;">new</span> <span style="color:#006600; font-weight:bold;">&#123;</span> |agent|</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; agent.<span style="color:#9900CC;">user_agent_alias</span> = 'Mac FireFox'</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#006600; font-weight:bold;">&#125;</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">page = agent.<span style="color:#9900CC;">get</span><span style="color:#006600; font-weight:bold;">&#40;</span>'https://www.<span style="color:#9900CC;">biomedicale</span>.<span style="color:#9900CC;">univ</span>-paris5.<span style="color:#9900CC;">fr</span>/scola/scola/'<span style="color:#006600; font-weight:bold;">&#41;</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">connform = page.<span style="color:#9900CC;">form</span><span style="color:#006600; font-weight:bold;">&#40;</span>'connexion'<span style="color:#006600; font-weight:bold;">&#41;</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">connform.<span style="color:#9900CC;">user</span> = ARGV<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006666;color:#800000;">0</span><span style="color:#006600; font-weight:bold;">&#93;</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">connform.<span style="color:#9900CC;">pass</span> = ARGV<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006666;color:#800000;">1</span><span style="color:#006600; font-weight:bold;">&#93;</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">page = agent.<span style="color:#9900CC;">submit</span><span style="color:#006600; font-weight:bold;">&#40;</span>connform, connform.<span style="color:#9900CC;">buttons</span>.<span style="color:#9900CC;">first</span><span style="color:#006600; font-weight:bold;">&#41;</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">link_choice = page.<span style="color:#9900CC;">link_with</span><span style="color:#006600; font-weight:bold;">&#40;</span>:text =&gt; 'Choix semestre <span style="color:#006666;color:#800000;">1</span>'<span style="color:#006600; font-weight:bold;">&#41;</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">link_cur_choice = page.<span style="color:#9900CC;">link_with</span><span style="color:#006600; font-weight:bold;">&#40;</span>:text =&gt; 'Mon groupe semestre <span style="color:#006666;color:#800000;">1</span>'<span style="color:#006600; font-weight:bold;">&#41;</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">print_curchoice<span style="color:#006600; font-weight:bold;">&#40;</span>agent, link_cur_choice<span style="color:#006600; font-weight:bold;">&#41;</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#9966CC; font-weight:bold;">while</span> <span style="color:#0000FF; font-weight:bold;">true</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; ret = select_sp<span style="color:#006600; font-weight:bold;">&#40;</span>agent, link_choice, <span style="color:#006666;color:#800000;">8</span><span style="color:#006600; font-weight:bold;">&#41;</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; <span style="color:#9966CC; font-weight:bold;">break</span> <span style="color:#9966CC; font-weight:bold;">if</span> ret == <span style="color:#0000FF; font-weight:bold;">true</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; <span style="color:#CC0066; font-weight:bold;">sleep</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006666;color:#800000;">1</span><span style="color:#006600; font-weight:bold;">&#41;</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#9966CC; font-weight:bold;">end</span> </div>
</li>
</ol>
</div>
</div>
</div>
<p></p>
<p>That's all folks!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.qualifilms.com/blog/computer-science/2009/09/ruby-and-web-scrapingautomation/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Kinesis&#8217;s Customer Service</title>
		<link>http://www.qualifilms.com/blog/computer-science/2009/09/kinesiss-customer-service/</link>
		<comments>http://www.qualifilms.com/blog/computer-science/2009/09/kinesiss-customer-service/#comments</comments>
		<pubDate>Sun, 06 Sep 2009 14:55:21 +0000</pubDate>
		<dc:creator>ChoJin</dc:creator>
		
		<category>Computer Science</category>

		<category>General</category>

		<category>Hacking</category>

		<category>My Life</category>

	<!-- AutoMeta Start -->
	<category>keyboard</category>
	<category>switches</category>
	<category>kinesis</category>
	<category>ergonomic</category>
	<category>customer</category>
	<category>replace</category>
	<category>dvorak</category>
	<category>contoured</category>
	<!-- AutoMeta End -->
	
		<guid isPermaLink="false">http://www.qualifilms.com/blog/computer-science/2009/09/kinesiss-customer-service/</guid>
		<description><![CDATA[
Couple of years ago I bought a Contoured Kinesis Keyboard due to a carpal tunnel syndrome (or at least my thumb was starting to feel numb on a regular basis).
I can't tell you, in spite of its very strange look, how wonderful this keyboard is. Not only it solved my pain/sensation issues, but it's really [...]]]></description>
			<content:encoded><![CDATA[<div class="leftdoublemargin"><a href="http://www.qualifilms.com/blog/wp-content/uploads/2009/09/img_0025.JPG"><img class="illustration" id="image114" src="http://www.qualifilms.com/blog/wp-content/uploads/2009/09/img_0025.thumbnail.JPG" alt="Contoured Kinesis Keyboard" /></a></div>
<p>Couple of years ago I bought a <a target="_blank" href="http://www.kinesis-ergo.com/contoured.htm">Contoured Kinesis Keyboard</a> due to a carpal tunnel syndrome (or at least my thumb was starting to feel numb on a regular basis).</p>
<p>I can't tell you, in spite of its very strange look, how wonderful this keyboard is. Not only it solved my pain/sensation issues, but it's really a very comfortable keyboard. Most people would expect it very hard to get used to it (or switch to normal keyboard afterward), but it couldn't be farther from the truth. It only took about a week to get used to it, and after 2 weeks I was even typing faster than before. After a month or so, I even decided to switch to dvorak mapping to further deepen the ergonomic experience. Since then (so roughly 6 years now), I've been writing with a dvorak mapping on this very same keyboard (maybe I should replace the pads btw...). If you want a great keyboard, I strongly recommend this one.</p>
<div class="rightdoublemargin"><a href="http://www.qualifilms.com/blog/wp-content/uploads/2009/09/img_0022.JPG"><img class="illustration" id="image116" src="http://www.qualifilms.com/blog/wp-content/uploads/2009/09/img_0022.thumbnail.JPG" alt="Kinesis Keyboard - Main board" /></a></div>
<p>But 2 years ago or so, two keys started to behave strangely. Not working or getting stuck (the alt/option and command keys on my left thumb). So I opened my keyboard, and the key switches, and quickly realized the best would just be to replace the key switches. Reading from the constructor's specs I could see they were selling different models/versions with slight dimension variations.</p>
<div class="leftdoublemargin"><a href="http://www.qualifilms.com/blog/wp-content/uploads/2009/09/img_0021.JPG"><img class="illustration" id="image115" src="http://www.qualifilms.com/blog/wp-content/uploads/2009/09/img_0021.thumbnail.JPG" alt="Kinesis Keyboard - Main board close-up" /></a></div>
<p>Thus, I emailed Kinesis to ask them for the exact key switch references, figuring I could just replace them myself since the soldering skills involved were not too high ^^ (and my warranty had expired). Someone promptly answered me, asking me whether or not I was sure it was just a key switch issue. And finally, to my surprise, I was astonished couple of days later to receive by mail, <strong>free of charge</strong> (no cost at all, not even shipping), without even asking for it (I was just asking for the technical references so I could order some from the constructor) three key switches. <strong>That</strong> is what I would call a great customer service experience <img src='http://www.qualifilms.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<div class="rightdoublemargin"><a href="http://www.qualifilms.com/blog/wp-content/uploads/2009/09/img_0023.JPG"><img class="illustration" id="image117" src="http://www.qualifilms.com/blog/wp-content/uploads/2009/09/img_0023.thumbnail.JPG" alt="Kinesis Keyboard - USB board" /></a></div>
<p>I'm only talking about it now, because it actually took me 2 years to get my motivation together to actually use them and repair my keyboard (I was using a workaround involving hard-pressing the key, or punching it when stuck <img src='http://www.qualifilms.com/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  ). So anyway, prop' to Kinesis for its great customer service!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.qualifilms.com/blog/computer-science/2009/09/kinesiss-customer-service/feed/</wfw:commentRss>
		</item>
		<item>
		<title>First Stitches in the OR!</title>
		<link>http://www.qualifilms.com/blog/general/2009/07/first-stitches-in-the-or/</link>
		<comments>http://www.qualifilms.com/blog/general/2009/07/first-stitches-in-the-or/#comments</comments>
		<pubDate>Thu, 23 Jul 2009 19:10:41 +0000</pubDate>
		<dc:creator>ChoJin</dc:creator>
		
		<category>General</category>

		<category>Medicine</category>

		<category>My Life</category>

	<!-- AutoMeta Start -->
	<category>stitches</category>
	<category>pediatric</category>
	<category>surgery</category>
	<!-- AutoMeta End -->
	
		<guid isPermaLink="false">http://www.qualifilms.com/blog/general/2009/07/first-stitches-in-the-or/</guid>
		<description><![CDATA[Just a small post to remember forever that today was the day I did my first stitches in the OR (in pediatric surgery)  
It probably sounds stupid from an outside point of view, and I'll probably feel the same in a couple of years, but right now I'm just happy I finally got to [...]]]></description>
			<content:encoded><![CDATA[<p>Just a small post to remember forever that today was the day I did my first stitches in the OR (in pediatric surgery) <img src='http://www.qualifilms.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>It probably sounds stupid from an outside point of view, and I'll probably feel the same in a couple of years, but right now I'm just happy I finally got to do it.</p>
<p>Baby steps, baby steps... but it was worth working toward them.
</p>
]]></content:encoded>
			<wfw:commentRss>http://www.qualifilms.com/blog/general/2009/07/first-stitches-in-the-or/feed/</wfw:commentRss>
		</item>
		<item>
		<title>On Influenza A</title>
		<link>http://www.qualifilms.com/blog/computer-science/2009/06/on-influenza-a/</link>
		<comments>http://www.qualifilms.com/blog/computer-science/2009/06/on-influenza-a/#comments</comments>
		<pubDate>Sun, 21 Jun 2009 16:02:14 +0000</pubDate>
		<dc:creator>ChoJin</dc:creator>
		
		<category>Computer Science</category>

		<category>Reversing</category>

		<category>Hacking</category>

		<category>Medicine</category>

	<!-- AutoMeta Start -->
	<category>influenza</category>
	<category>bunnie</category>
	<category>sciences</category>
	<category>book</category>
	<category>computer</category>
	<category>biology</category>
	<category>article</category>
	<category>24c3</category>
	<category>reverse</category>
	<category>engineering</category>
	<category>reverse</category>
	<category>engineer</category>
	<category>xbox</category>
	<category>hacking</category>
	<!-- AutoMeta End -->
	
		<guid isPermaLink="false">http://www.qualifilms.com/blog/computer-science/2009/06/on-influenza-a/</guid>
		<description><![CDATA[Just a small post to point to an article bunnie [1] wrote about the virus Influenza A : On Influenza A by bunnie.
This article should be of interest for people with a background in computer sciences but little knowledge in biology. It offers some funny/interesting computer sciences comparisons which should be of pedagogic interests for [...]]]></description>
			<content:encoded><![CDATA[<p>Just a small post to point to an article bunnie [1] wrote about the virus Influenza A : <a target="_blank" href="http://www.bunniestudios.com/blog/?p=353">On Influenza A by bunnie</a>.</p>
<p>This article should be of interest for people with a background in computer sciences but little knowledge in biology. It offers some funny/interesting computer sciences comparisons which should be of pedagogic interests for computer savvy people.</p>
<p>By the way, if you like it, I strongly urge you to watch the following video from the 24th CCC Congress:<br />
<a target="_blank" href="http://chaosradio.ccc.de/24c3_m4v_2329.html">Programming DNA - A 2-bit language for engineering biology</a></p>
<p>[1] for those who don't know, bunnie is an amazing reverse engineer and hardware designer. Among other things, he's the first hacker who managed to break the XBox's security, as told in his book "Hacking the XBox", which is still, up to this day, one of my favorite computer sciences book. I could not emphasize enough about how you really should read it.
</p>
]]></content:encoded>
			<wfw:commentRss>http://www.qualifilms.com/blog/computer-science/2009/06/on-influenza-a/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Back to Basics: Reverse Engineering of a Non-Standard Magstripe &#8212; Part One</title>
		<link>http://www.qualifilms.com/blog/computer-science/2009/06/back-to-basics-reverse-engineering-of-a-non-standard-magstripe-part-one/</link>
		<comments>http://www.qualifilms.com/blog/computer-science/2009/06/back-to-basics-reverse-engineering-of-a-non-standard-magstripe-part-one/#comments</comments>
		<pubDate>Wed, 17 Jun 2009 00:31:45 +0000</pubDate>
		<dc:creator>ChoJin</dc:creator>
		
		<category>Computer Science</category>

		<category>Reversing</category>

		<category>Hacking</category>

	<!-- AutoMeta Start -->
	<category>encoding</category>
	<category>scheme</category>
	<category>photocopier</category>
	<category>cards</category>
	<category>card</category>
	<category>standard</category>
	<category>magnetic</category>
	<category>stripe</category>
	<category>non standard</category>
	<category>non</category>
	<category>standard</category>
	<category>reverse</category>
	<category>engineering</category>
	<category>f2f</category>
	<category>Aiken</category>
	<category>Biphase</category>
	<category>Modulation</category>
	<category>magstripe</category>
	<!-- AutoMeta End -->
	
		<guid isPermaLink="false">http://www.qualifilms.com/blog/computer-science/2009/06/back-to-basics-reverse-engineering-of-a-non-standard-magstripe-part-one/</guid>
		<description><![CDATA[Hello,
I think it's time I go back to basics and post something a little bit technical on this blog, which was the original intent of this blog anyway, should I remind everyone  .
So we're going to talk about magnetic cards. We all have at least half a dozen of them, if not more, and [...]]]></description>
			<content:encoded><![CDATA[<p>Hello,</p>
<p>I think it's time I go back to basics and post something a little bit technical on this blog, which was the original intent of this blog anyway, should I remind everyone <img src='http://www.qualifilms.com/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> .</p>
<p>So we're going to talk about magnetic cards. We all have at least half a dozen of them, if not more, and although this technology is probably as old as the dinosaurs, for most people, how to read, how to write and what those cards contain still remain a mystery.</p>
<p>Pretty much everything has already been written about magnetic stripes, I will therefore focus this article on a well-used photocopier card, which has the interesting feature of using a non-standard protocol to prevent from tempering and counterfeiting.</p>
<p><a id="more-97"></a></p>
<h4 class="articletitle">Disclaimer</h4>
<p>Let's be clear right from the beginning.</p>
<p>I won't give away the brand of this photocopier card, nor will I disclose the hardware used to properly read or make such cards (so don't bother asking). I'm only writing this article because I feel there is a lack of information about non-standard magstripe and copy/tempering protection schemes in this (magnetic <img src='http://www.qualifilms.com/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  ) field. This article is not about breaking the law, it's about knowledge and inner curiosity. I strongly urge you to avoid ending up in jail just because you wanted to save a few cents from a photocopier machine...</p>
<p>I warned you, and I will not be held responsible for your actions, should you decide to use this knowledge badly.</p>
<p>After this over-dramatic disclaimer, let's move on with the real article <img src='http://www.qualifilms.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<h4 class="articletitle">Introduction</h4>
<p>I won't go into the details about all the existing standards and so on. I'd suggest you read the very well known Count Zero's <a target="_blank" href="http://www.phrack.com/issues.html?issue=37&#038;id=6#article">Card-O-Rama</a> article from Phrack magazine about this subject matter. I will only write a quick summary about the standard modulation technique used on magstripes and then move on to talk about our photocopier card.</p>
<h4 class="articletitle">Generalities</h4>
<p>Ok so, to make things simple, you can see a magnetic stripe as a sequence of tiny North and South oriented magnetics. When read through a solenoid, the induced current created by a given sequence of North and South polarities generates a square analog signal (yes, it's not that simple in reality, but it's good enough for our purpose). </p>
<p><center><br />
<img id="image99" src="http://www.qualifilms.com/blog/wp-content/uploads/2009/06/square_sig.png" alt="Square Signal" /><br />
</center></p>
<p>As we will se through an example later, this square signal is then interpreted as a sequence of binary data (0 and 1) given the modulation scheme used. At this point, bits are usually grouped as chunk of 5 (BCD encoding) or 7 (ALPHA encoding) bit and interpreted using simple look-up tables.</p>
<p>As an example here is the BCD encoding table we'll be using later on:</p>
<p><center></p>
<table class="simpletable">
<tr>
<th colspan="4">Data Bits</th>
<th>Parity</th>
<th colspan="2"></th>
</tr>
<tr>
<th>b1</th>
<th>b2</th>
<th>b3</th>
<th>b4</th>
<th>b5</th>
<th>Character</th>
<th>Function</th>
</tr>
<tr>
<th>0</th>
<th>0</th>
<th>0</th>
<th>0</th>
<th>1</th>
<td>0 (0h)</td>
<td>Data</td>
</tr>
<tr>
<th>1</th>
<th>0</td>
<th>0</th>
<th>0</th>
<th>0</th>
<td>1 (1h)</td>
<td>"</td>
</tr>
<tr>
<th>0</th>
<th>1</th>
<th>0</th>
<th>0</th>
<th>0</th>
<td>2 (2h)</td>
<td>"</td>
</tr>
<tr>
<th>1</th>
<th>1</th>
<th>0</th>
<th>0</th>
<th>1</th>
<td>3 (3h)</td>
<td>"</td>
</tr>
<tr>
<th>0</th>
<th>0</th>
<th>1</th>
<th>0</th>
<th>0</th>
<td>4 (4h)</td>
<td>"</td>
</tr>
<tr>
<th>1</th>
<th>0</th>
<th>1</th>
<th>0</th>
<th>1</th>
<td>5 (5h)</td>
<td>"</td>
</tr>
<tr>
<th>0</th>
<th>1</th>
<th>1</th>
<th>0</th>
<th>1</th>
<td>6 (6h)</td>
<td>"</td>
</tr>
<tr>
<th>1</th>
<th>1</th>
<th>1</th>
<th>0</th>
<th>0</th>
<td>7 (7h)</td>
<td>"</td>
</tr>
<tr>
<th>0</th>
<th>0</th>
<th>0</th>
<th>1</th>
<th>0</th>
<td>8 (8h)</td>
<td>"</td>
</tr>
<tr>
<th>1</th>
<th>0</th>
<th>0</th>
<th>1</th>
<th>1</th>
<td>9 (9h)</td>
<td>"</td>
</tr>
<tr>
<th>0</th>
<th>1</th>
<th>0</th>
<th>1</th>
<th>1</th>
<td>: (Ah)</td>
<td>Control</td>
</tr>
<tr>
<th>1</th>
<th>1</th>
<th>0</th>
<th>1</th>
<th>0</th>
<td>; (Bh)</td>
<td>Start Sentinel</td>
</tr>
<tr>
<th>0</th>
<th>0</th>
<th>1</th>
<th>1</th>
<th>1</th>
<td>< (Ch)</td>
<td>Control</td>
</tr>
<tr>
<th>1</th>
<th>0</th>
<th>1</th>
<th>1</th>
<th>0</th>
<td>= (Dh)</td>
<td>Field Separator</td>
</tr>
<tr>
<th>0</th>
<th>1</th>
<th>1</th>
<th>1</th>
<th>0</th>
<td>> (Eh)</td>
<td>Control</td>
</tr>
<tr>
<th>1</th>
<th>1</th>
<th>1</th>
<th>1</th>
<th>1</th>
<td>? (Fh)</td>
<td>End Sentinel</td>
</tr>
</table>
<p></center></p>
<h4 class="articletitle">Aiken Biphase Modulation</h4>
<p>Now let's focus on how the square analog signal is converted to a sequence of binary data. On standard cards, the scheme used is called Aiken Biphase Modulation, or BMC encoding or often F2F (frequency/double frequency) as well.</p>
<p>In this simple encoding scheme, bit "1" are encoded using twice the frequency than bit "0". A picture is worth thousand words:</p>
<p><center><br />
<img id="image100" src="http://www.qualifilms.com/blog/wp-content/uploads/2009/06/square_sig0.png" alt="Square Signal - Bit 0" /><br />
</center></p>
<p><center><br />
<img id="image101" src="http://www.qualifilms.com/blog/wp-content/uploads/2009/06/square_sig1.png" alt="Square Signal - Bit 1" /><br />
</center></p>
<p>As said earlier, let's take a simple example, a sequence of 5 bit, and let's see how we can visually decode it step by step (assuming the encoding scheme is indeed F2F).</p>
<p><center><br />
<img id="image102" src="http://www.qualifilms.com/blog/wp-content/uploads/2009/06/bcd.png" alt="BCD" /><br />
</center></p>
<p>To ease the understanding of the encoding, and emphasize how "0" and "1" are encoded using frequency variations, we're going to highlight each bit separately.<br />
The first bit (b1):</p>
<p><center><br />
<img id="image103" src="http://www.qualifilms.com/blog/wp-content/uploads/2009/06/bcd_bit0.png" alt="BCD - Bit 1" /><br />
</center></p>
<p>As you can see, a bit begins with a phase shift, no matter what the original phase is, and since we are here encoding a bit "1", the phase shifts again in the middle of the clock cycle.<br />
The 2nd bit (b2) is quite the same since we are encoding a bit "1" again:</p>
<p><center><br />
<img id="image104" src="http://www.qualifilms.com/blog/wp-content/uploads/2009/06/bcd_bit1.png" alt="BCD - Bit 2" /><br />
</center></p>
<p>A phase shift to begin the bit, and another one in the middle of the clock cycle. With the 3rd bit (b3), you should begin to understand the process. We are here encoding a bit "0":</p>
<p><center><br />
<img id="image105" src="http://www.qualifilms.com/blog/wp-content/uploads/2009/06/bcd_bit2.png" alt="BCD - Bit 3" /><br />
</center></p>
<p>Again, the bit begins with a phase shift, but since we are encoding a bit "0", we <b>don't</b> shift the phase again during the clock cycle. That's basically how we know, and the reader knows, the bit should be interpreted as a "0" and not a "1".<br />
The 4th bit (b4) is a "1" again:</p>
<p><center><br />
<img id="image106" src="http://www.qualifilms.com/blog/wp-content/uploads/2009/06/bcd_bit3.png" alt="BCD - Bit 4" /><br />
</center></p>
<p>And finally the 5th bit (b5), a "0":</p>
<p><center><br />
<img id="image107" src="http://www.qualifilms.com/blog/wp-content/uploads/2009/06/bcd_bit4.png" alt="BCD - Bit 5" /><br />
</center></p>
<p>As you see it's fairly easy to understand, but you have to pay attention to when a bit begins and ends. This will become very important when we'll analyze the non-standard encoding scheme used by our photocopier card.</p>
<p>You may wonder how the decoder knows how long is a "clock cycle", its time base. The answer is easy : we usually have a very long sequence of a constant square signal at the beginning of the magnetic stripe, interpreted as "0"s, and which therefore gives the decoder a time reference for further decoding.</p>
<p>Since we're on our way to decode this signal, we could now go all the way. Assuming the card is using a BCD (5bit chunks) encoding scheme, and using the look-up table given earlier, this give us:</p>
<p><center><br />
<img id="image108" src="http://www.qualifilms.com/blog/wp-content/uploads/2009/06/bcd_char.png" alt="BCD - Char" /><br />
</center></p>
<p>"11010" decodes as the char ";", which is for standard magnetic stripe cards, what we call a "start sentinel", i.e. a char which announces the beginning of the real data. As you can also see in the look-up table, only the first 4 bits are really used, the 5th one is a parity bit. This means the 5th bit is set such as we always have an odd number of bit "1" in a char. This is used as a consistency check in standard encoding schemes, to double-check whether or not the decoding is corrupted.</p>
<h4 class="articletitle">Exercise to the reader</h4>
<p>To conclude with this common standard encoding, and as an small exercise, you could try to decode this signal (assuming a F2F analog encoding scheme, and a BCD digital encoding scheme):</p>
<p><center><br />
<img id="image110" src="http://www.qualifilms.com/blog/wp-content/uploads/2009/06/bcd_char2_blank.png" alt="BCD - Char2" /><br />
</center></p>
<p><center><br />
<b>End of part one. The next part will finally focus on our mysterious photocopier card.<br />
Stay Tuned! <img src='http://www.qualifilms.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </b><br />
</center></p>
]]></content:encoded>
			<wfw:commentRss>http://www.qualifilms.com/blog/computer-science/2009/06/back-to-basics-reverse-engineering-of-a-non-standard-magstripe-part-one/feed/</wfw:commentRss>
		</item>
		<item>
		<title>End of Act I Scene 2</title>
		<link>http://www.qualifilms.com/blog/computer-science/2009/06/end-of-act-i-scene-2/</link>
		<comments>http://www.qualifilms.com/blog/computer-science/2009/06/end-of-act-i-scene-2/#comments</comments>
		<pubDate>Wed, 10 Jun 2009 13:11:30 +0000</pubDate>
		<dc:creator>ChoJin</dc:creator>
		
		<category>Computer Science</category>

		<category>General</category>

		<category>Medicine</category>

		<category>My Life</category>

	<!-- AutoMeta Start -->
	<category>européenne</category>
	<category>ingénierie</category>
	<category>thesis</category>
	<category>drop</category>
	<category>master</category>
	<category>parties</category>
	<category>crazy</category>
	<category>year</category>
	<!-- AutoMeta End -->
	
		<guid isPermaLink="false">http://www.qualifilms.com/blog/computer-science/2009/06/end-of-act-i-scene-2/</guid>
		<description><![CDATA[That's it, my 2nd year of med' school just finished, the 3rd year will begin this coming September.
I didn't have much time during this year to give any updates to those who still cares, so here is a small overview of this past few months:

I've been busy helping the association which mentors first year students
As [...]]]></description>
			<content:encoded><![CDATA[<p>That's it, my 2nd year of med' school just finished, the 3rd year will begin this coming September.</p>
<p>I didn't have much time during this year to give any updates to those who still cares, so here is a small overview of this past few months:</p>
<ul>
<li>I've been busy helping the association which mentors first year students</li>
<li>As said earlier, I indeed implemented a Simple Quiz Recognition Tool (using some morphological mathematics), named... SQRT <img src='http://www.qualifilms.com/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  to process all the first year students' training exams, compute grades and generate ranking, histograms and so on... It uses C++ and Ruby on Rails, but I'll tell you more about it later.</li>
<li>I've almost completed my Master in Medical Ethic Research as well (the only thing left is my master thesis oral presentation on June 16th). My Master thesis title is (sorry in french) "Ingénierie, Médecine et Éthique -- Introduction aux régulations des appareils médicaux aux États-Unis et en Union Européenne". If you're crazy enough to read it, drop me an email and I'll send you the pdf.</li>
<li>Of course, I've learnt medical stuff, I went to a couple of Hospital for my internships... Which is cool. I still love it, and I don't regret my decision a bit, but I do miss film making very much along with all my friends still in California as well...</li>
<li>And the new "me" went to a few crazy med school parties, bars and so on... (sorry I can't speak about those parties, they are R rated <img src='http://www.qualifilms.com/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  ). New friends coming, old ones gone... Life as bitchy as it can as usual...</li>
</ul>
<p>Otherwise, nothing much to say. There are a lot of things I wanted to do but couldn't, mostly because of time constraints, such as working on a humanitarian project, doing some photo shoots... and unfortunately I also had to drop from my sign language class... Well, maybe next year... We'll see <img src='http://www.qualifilms.com/blog/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> </p>
<p>That's it ! Next posts will be about computer stuff, you'll see, my dark side is coming back, it should be fun <img src='http://www.qualifilms.com/blog/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.qualifilms.com/blog/computer-science/2009/06/end-of-act-i-scene-2/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Back to School</title>
		<link>http://www.qualifilms.com/blog/general/2008/09/back-to-school/</link>
		<comments>http://www.qualifilms.com/blog/general/2008/09/back-to-school/#comments</comments>
		<pubDate>Sun, 14 Sep 2008 21:36:52 +0000</pubDate>
		<dc:creator>ChoJin</dc:creator>
		
		<category>General</category>

		<category>Medicine</category>

		<category>My Life</category>

	<!-- AutoMeta Start -->
	<category>quiz</category>
	<category>OCR</category>
	<category>plaster</category>
	<category>surgery</category>
	<category>surgeries</category>
	<category>internship</category>
	<category>hospital</category>
	<!-- AutoMeta End -->
	
		<guid isPermaLink="false">http://www.qualifilms.com/blog/general/2008/09/back-to-school/</guid>
		<description><![CDATA[Small update.
My vacations are coming to an end. The internship was a blast.



There's nothing like learning how to cut the plaster with a saw on yourself...
I went to the OR a couple of times for some crazy surgeries (even an 8h surgery! I almost had an orgasm   )
And I even managed to recycle [...]]]></description>
			<content:encoded><![CDATA[<p>Small update.</p>
<p>My vacations are coming to an end. The internship was a blast.</p>
<div class="leftdoublemargin">
<a target="_blank" href="http://www.qualifilms.com/blog/wp-content/uploads/2008/09/img_0018.png"><img id="image95" src="http://www.qualifilms.com/blog/wp-content/uploads/2008/09/img_0018.thumbnail.png" class="illustration" alt="Cutting some plater..." /></a>
</div>
<p>There's nothing like learning how to cut the plaster with a saw on yourself...</p>
<p>I went to the OR a couple of times for some crazy surgeries (even an 8h surgery! I almost had an orgasm <img src='http://www.qualifilms.com/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  )</p>
<p>And I even managed to recycle my old magician skills making animals with balloons for the kids at the hospital.<br />
It was truly a blast. I loved every single minute of it (yeah, even when I had to clean some Poop <img src='http://www.qualifilms.com/blog/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> )</p>
<div class="rightdoublemargin">
<a target="_blank" href="http://www.qualifilms.com/blog/wp-content/uploads/2008/09/img_0020_small.png"><img id="image96" src="http://www.qualifilms.com/blog/wp-content/uploads/2008/09/img_0020_small.thumbnail.png" class="illustration" alt="In the OR" /></a>
</div>
<p>Otherwise, not much to say, except we (the tutoring association at my med' school) are preparing the back-to-school season for the first year students. I'm implementing a quiz OCR system for it, because complete solutions are around 10k euros! Can you believe that?! WTF seriously... And finally I've been accepted to the Master of Biomedical Ethic course (which I would be doing at the same time than my 2nd medical year).</p>
<p>That's pretty much it, enough of my life... Next time I'll try to post a few technical posts again. Maybe about some reverse engineering work I'm currently doing, or about the quiz OCR system... We'll see. Or, as Pierre pointed out, I should probably post again some stuff about cooking <img src='http://www.qualifilms.com/blog/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.qualifilms.com/blog/general/2008/09/back-to-school/feed/</wfw:commentRss>
		</item>
		<item>
		<title>First Medical Internship</title>
		<link>http://www.qualifilms.com/blog/general/2008/07/first-medical-internship/</link>
		<comments>http://www.qualifilms.com/blog/general/2008/07/first-medical-internship/#comments</comments>
		<pubDate>Thu, 03 Jul 2008 20:12:18 +0000</pubDate>
		<dc:creator>ChoJin</dc:creator>
		
		<category>General</category>

		<category>Medicine</category>

		<category>My Life</category>

	<!-- AutoMeta Start -->
	<category>internship</category>
	<category>surgery</category>
	<category>dental</category>
	<category>medicine</category>
	<category>pediatric</category>
	<!-- AutoMeta End -->
	
		<guid isPermaLink="false">http://www.qualifilms.com/blog/general/2008/07/first-medical-internship/</guid>
		<description><![CDATA[Today was the day, the day they called us one by one to ask us whether we wanted to do medicine, dental... Then we had to choose our first 3 week internship. 
I'm happy to report my first internship will start next Monday and I managed to get pediatric surgery.
Wish me luck not to kill [...]]]></description>
			<content:encoded><![CDATA[<p>Today was the day, the day they called us one by one to ask us whether we wanted to do medicine, dental... Then we had to choose our first 3 week internship. </p>
<p>I'm happy to report my first internship will start next Monday and I managed to get pediatric surgery.</p>
<p>Wish me luck not to kill someone or along those lines <img src='http://www.qualifilms.com/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.qualifilms.com/blog/general/2008/07/first-medical-internship/feed/</wfw:commentRss>
		</item>
		<item>
		<title>ChoJin, MD</title>
		<link>http://www.qualifilms.com/blog/general/2008/06/chojin-md/</link>
		<comments>http://www.qualifilms.com/blog/general/2008/06/chojin-md/#comments</comments>
		<pubDate>Sat, 28 Jun 2008 09:01:42 +0000</pubDate>
		<dc:creator>ChoJin</dc:creator>
		
		<category>General</category>

		<category>Medicine</category>

		<category>My Life</category>

	<!-- AutoMeta Start -->
	<category>Paris</category>
	<category>Descartes</category>
	<category>school</category>
	<category>PCEM1</category>
	<category>P1</category>
	<category>results</category>
	<!-- AutoMeta End -->
	
		<guid isPermaLink="false">http://www.qualifilms.com/blog/general/2008/06/chojin-md/</guid>
		<description><![CDATA[I'm lacking words to express myself, it's almost surreal...
So much happened in my life in the past few years, especially this past year. I took a chance and gambled my life with a great deal of uncertainties and doubts. Was I crazy? Did I really want too much? And after all.. Wasn't my brain too [...]]]></description>
			<content:encoded><![CDATA[<p>I'm lacking words to express myself, it's almost surreal...</p>
<p>So much happened in my life in the past few years, especially this past year. I took a chance and gambled my life with a great deal of uncertainties and doubts. Was I crazy? Did I really want too much? And after all.. Wasn't my brain too old already to be up for the challenge?</p>
<p>I got the results yesterday, and I still can't believe the results... but I passed. Among approx. 2400 people with 377 places for the medical field my final rank is 102nd which means I passed, and with a large margin. Hopefully this will enable me to get the internship I want this summer, I'll know on Thursday.</p>
<p>Some say you see the movie of your life just before you die. The same happened to me yesterday, except I think it was my re-birth. Sorry for the cliché and for lacking words to describe it right now, but I just wanted to thanks my friends for their support and I'm relieved I didn't have to disappoint them.</p>
<p>I'm very happy to say that Pauline passed too, but sadly, a lot of my other friends didn't make it, which gives to this "victory" a really bitter flavor...</p>
<p>Anyway, here are my final results:</p>
<p>First Semester:</p>
<ul>
<li>Anatomy: 17.1 / 20 (weight: 1)</li>
<li>Biology: 10.9 / 20 (weight: 2.6)</li>
<li>Chemistry: 13.6 / 20 (weight: 2.3)</li>
<li>Physics: 15.9 / 20 (weight: 2.3)</li>
<li>Average Grade: 13.816</li>
<li>Rank: 252</li>
</ul>
<p>Second Semester:</p>
<ul>
<li>Biochemistry: 15.6 / 20 (weight: 2.6)</li>
<li>Biophysics: 14.7 / 20 (weight: 2.1)</li>
<li>Histology/Embryology: 12.5 / 20 (weight: 2.1)</li>
<li>Physiology: 15 / 20 (weight: 1)</li>
<li>SHS (Ethics, Philosophy, Sociology...): 18.5 / 20 (weight: 4)</li>
</ul>
<p>Final average grade: 15 / 20<br />
Final rank: 102<br />
Numerous Clausus: 377 (for approx. 2400 candidates)</p>
<p>After "House, MD" ("Dr. House" in France), soon we should have "ChoJin, MD" <img src='http://www.qualifilms.com/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />
</p>
]]></content:encoded>
			<wfw:commentRss>http://www.qualifilms.com/blog/general/2008/06/chojin-md/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Steadicam tests for Asdin/X-otik</title>
		<link>http://www.qualifilms.com/blog/cinema/film-making/2008/06/steadicam-tests-for-asdinx-otik/</link>
		<comments>http://www.qualifilms.com/blog/cinema/film-making/2008/06/steadicam-tests-for-asdinx-otik/#comments</comments>
		<pubDate>Fri, 20 Jun 2008 20:55:44 +0000</pubDate>
		<dc:creator>ChoJin</dc:creator>
		
		<category>Film-Making</category>

		<category>General</category>

		<category>Cinema</category>

		<category>My Life</category>

	<!-- AutoMeta Start -->
	<category>tests</category>
	<category>steadicam</category>
	<category>adrone</category>
	<category>asdin</category>
	<category>sony</category>
	<category>music</category>
	<category>camera</category>
	<category>flyer</category>
	<!-- AutoMeta End -->
	
		<guid isPermaLink="false">http://www.qualifilms.com/blog/cinema/film-making/2008/06/steadicam-tests-for-asdinx-otik/</guid>
		<description><![CDATA[Just some random steadicam tests using my Flyer and Asdin's Sony camera. I'll probably help him shooting the next Adrone's music video. We'll see...
We can see Asdin giving a try with the steadicam near the end of the video  


PS: Yes I know I should add weights to the sony camera, but I didn't [...]]]></description>
			<content:encoded><![CDATA[<p>Just some random steadicam tests using my Flyer and Asdin's Sony camera. I'll probably help him shooting the next <a target="_blank" href="http://www.myspace.com/ADRONE972">Adrone</a>'s music video. We'll see...</p>
<p>We can see Asdin giving a try with the steadicam near the end of the video <img src='http://www.qualifilms.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><object width="425" height="344">
<param name="movie" value="http://www.youtube.com/v/nCJkR0OADN4&#038;hl=en"></param><embed src="http://www.youtube.com/v/nCJkR0OADN4&#038;hl=en" type="application/x-shockwave-flash" width="425" height="344"></embed></object></p>
<p>PS: Yes I know I should add weights to the sony camera, but I didn't have anything to do so
</p>
]]></content:encoded>
			<wfw:commentRss>http://www.qualifilms.com/blog/cinema/film-making/2008/06/steadicam-tests-for-asdinx-otik/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
