<?xml version="1.0" encoding="UTF-8"?>
<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/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>existence, refactored &#187; Software Engineering</title>
	<atom:link href="http://blog.bryanbibat.net/category/daily-entry/software-engineering-daily-entry/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.bryanbibat.net</link>
	<description>With kindness comes naïveté. Courage becomes foolhardiness. And dedication has no reward.</description>
	<lastBuildDate>Thu, 17 May 2012 13:53:52 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>Pangkaraniwang Developer &#8211; matuto ng Computer Science at Programming</title>
		<link>http://blog.bryanbibat.net/2012/05/17/pangkaraniwang-developer-matuto-ng-computer-science-at-programming/</link>
		<comments>http://blog.bryanbibat.net/2012/05/17/pangkaraniwang-developer-matuto-ng-computer-science-at-programming/#comments</comments>
		<pubDate>Thu, 17 May 2012 13:42:26 +0000</pubDate>
		<dc:creator>Bry</dc:creator>
				<category><![CDATA[Brain Dumps]]></category>
		<category><![CDATA[Site News]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[Software Engineering]]></category>
		<category><![CDATA[Training]]></category>
		<category><![CDATA[fundamentals]]></category>
		<category><![CDATA[pangkaraniwang developer]]></category>
		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://blog.bryanbibat.net/?p=1601</guid>
		<description><![CDATA[&#8220;Turuan ang sinumang Pilipino na gustong matuto ng Programming o Computer Science.&#8221; If there&#8217;s a tagline for my current project, Pangkaraniwang Developer, that would be it. No need for a lengthy blog post, just head over to the About page and learn why I&#8217;m doing this. Donations are always welcome. LOL]]></description>
			<content:encoded><![CDATA[<p><a href="http://pd.bryanbibat.net" title="pangkaraniwang developer"><img src="http://images.bryanbibat.net/pd.png" class="aligncenter" /></a></p>
<p><em>&#8220;Turuan ang sinumang Pilipino na gustong matuto ng Programming o Computer Science.&#8221;</em></p>
<p>If there&#8217;s a tagline for my current project, <a href="http://pd.bryanbibat.net" title="pangkaraniwang developer">Pangkaraniwang Developer</a>, that would be it.</p>
<p>No need for a lengthy blog post, just head over to the <a href="http://pd.bryanbibat.net/about">About</a> page and learn why I&#8217;m doing this. </p>
<p>Donations are always welcome. LOL</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.bryanbibat.net/2012/05/17/pangkaraniwang-developer-matuto-ng-computer-science-at-programming/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>How to prepare for a Technical Interview</title>
		<link>http://blog.bryanbibat.net/2012/04/14/how-to-prepare-for-a-technical-interview/</link>
		<comments>http://blog.bryanbibat.net/2012/04/14/how-to-prepare-for-a-technical-interview/#comments</comments>
		<pubDate>Sat, 14 Apr 2012 11:06:18 +0000</pubDate>
		<dc:creator>Bry</dc:creator>
				<category><![CDATA[Brain Dumps]]></category>
		<category><![CDATA[Software Engineering]]></category>
		<category><![CDATA[Training]]></category>
		<category><![CDATA[fundamentals]]></category>
		<category><![CDATA[interviewing]]></category>
		<category><![CDATA[Object Oriented]]></category>
		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://blog.bryanbibat.net/?p=1575</guid>
		<description><![CDATA[With April being the graduation month here in the Philippines, you&#8217;ll be seeing fresh graduates in various forums and discussion groups looking for advice on how to pass technical interviews. Here&#8217;s one posted over at the PHP Users Group forum earlier today: Can you help me with this? I&#8217;m going to take a technical written [...]]]></description>
			<content:encoded><![CDATA[<p>With April being the graduation month here in the Philippines, you&#8217;ll be seeing fresh graduates in various forums and discussion groups looking for advice on how to pass technical interviews. Here&#8217;s one posted over at the PHP Users Group forum earlier today:</p>
<blockquote><p>Can you help me with this? I&#8217;m going to take a technical written exam for a job i&#8217;m applying. Here is the list of what are expected on the exam:<br />
-Basic Programming<br />
-OOP<br />
-recursive programming and variables in programming<br />
-? statement<br />
-conditional statements<br />
-loop statements<br />
-flowcharting<br />
-pseudocodes (strings,odd/even)<br />
Can you guys give me tips and heads up on where to focus and what to expect on the exam? The exam will be next week and I want to be prepared for it. Thanks in advance.</p>
<p>PS: Hindi ko alam kung anong programming language ung eexam. (<em>I don&#8217;t know what programming language will be used in the test</em>)</p></blockquote>
<p>Whenever I see these type of questions, the first thing I do is give a <a href="https://www.google.com/search?q=look+of+disapproval" title="look of disapproval">ಠ_ಠ</a> to my monitor. The listed coverage above is so basic that every 2<sup>nd</sup> year college student should have no problem with it.</p>
<p>It&#8217;s like a carpenter asking what tool to focus on when applying for a carpenter position: screwdrivers, hammers, saws, or measuring tape? Yes, it&#8217;s <em>that</em> basic.</p>
<p>Unhelpful snarkiness aside, what advice would I give to these fresh grads?</p>
<p><span id="more-1575"></span>There only need to do two things:</p>
<p><strong>1. Relearn the basics</strong></p>
<p>If you&#8217;re not confident about the things listed above once you&#8217;ve graduated college, it may mean that you don&#8217;t have a good foundation with the <a href="http://blog.bryanbibat.net/tag/fundamentals/">fundamentals</a> yet. So the best advice I could give for that problem would be to <em>forget everything you know and start over using the following books</em>:</p>
<ul>
<li><a href="http://pine.fm/LearnToProgram/">Learn to Program</a> by Chris Pine</li>
<li><a href="http://learnpythonthehardway.org/book/">Learn Python the Hard Way</a> by Zed Shaw</li>
<li><a href="http://www.greenteapress.com/thinkpython/thinkpython.html">Think Python</a> or <a href="http://www.greenteapress.com/thinkapjava/">Think Java</a> by Allen Downey</li>
<li><a href="http://mitpress.mit.edu/sicp/">Structure and Interpretation of Computer Programs</a> by Harold Abelson and Gerald Sussman (<em>optional, if you want to double your starting salary. LOL</em>)
</ul>
<p>When reading these books, you may find out how outdated or incomplete your college courses were back when you were taught programming. This is normal, and is an important part of the (re)learning process.</p>
<p>While you are reading these books, you may do the second advice at the same time:</p>
<p><strong>2. Practice. Practice. PRACTICE!!!!</strong></p>
<p>Apart from lack of fundamentals, the other reason you might not be that confident in going into a technical interview is the lack of coding practice &#8212; you should&#8217;ve encountered all of the things above had you coded thousands of lines of code before graduating.</p>
<p>So practice! Go to <a href="http://projecteuler.net/">Project Euler</a> and try to solve the problems! Go to <a href="http://www.topcoder.com/">Top Coder</a> and do the same with the High School competitions!</p>
<p>Find algorithms and try to implement them! Start with simple ones like the <a href="http://en.wikipedia.org/wiki/Sieve_of_Eratosthenes">Sieve of Erasthosenes</a> and <a href="http://en.wikipedia.org/wiki/Conway%27s_Game_of_Life">Conway&#8217;s Game of Life</a>, then move on to progressively harder ones like <a href="http://en.wikipedia.org/wiki/Quicksort">Quicksort</a> and <a href="http://en.wikipedia.org/wiki/Dijkstra%27s_algorithm">Dijkstra&#8217;s Algorithm</a>.</p>
<p>Also, don&#8217;t be content with just writing code; make an effort to <strong>read code</strong>. Good programmers are like good novelists; they read a lot more code than they write so they know what looks right and what looks wrong.</p>
<p>In other words, if you can&#8217;t figure out how to code something, just search for sample code on the internet and study them.</p>
<p>&#8212;</p>
<p>Just to wrap things up, I&#8217;ll be commenting on the items in the &#8220;technical interview coverage&#8221; listed at the start of this post.</p>
<blockquote><p>-Basic Programming<br />
&#8230;<br />
-&#8230;variables in programming<br />
-conditional statements<br />
-loop statements</p></blockquote>
<p>If you&#8217;re not familiar with these after a CS/IT course in college, I really question the quality of your education.</p>
<blockquote><p>-? statement</p></blockquote>
<p>It&#8217;s the <a href="http://en.wikipedia.org/wiki/%3F:">conditional operator</a>, used for writing if-then-else statements in shorthand. </p>
<p>Technically speaking, you really don&#8217;t need to use this (and in turn, don&#8217;t really need to know this) but there are a lot of cases where the shorter form makes code much easier to read. (And there are a lot of cases where it makes code really <em>hard</em> to read, but that&#8217;s another story.)</p>
<blockquote><p>-recursive programming &#8230;</p></blockquote>
<p><a href="http://en.wikipedia.org/wiki/Recursion_%28computer_science%29">This is recursion.</a> There are two types of interviews that use recursion:</p>
<ul>
<li>The bullshit type that makes you use recursion for tasks that can be done with simple loops like <a href="http://en.wikipedia.org/wiki/Recursion_%28computer_science%29#Factorial">factorial</a> and <a href="http://en.wikipedia.org/wiki/Recursion_%28computer_science%29#Fibonacci">fibonacci sequence</a>. If you know what loops are (and you should) and what recursion is, this shouldn&#8217;t be hard for you.
<p>Why do I find it bullshit? Because any programmer worth his/her salt knows how bad <a href="http://en.wikipedia.org/wiki/Tail_call">tail recursion</a> can be in certain languages.</p>
<p>If a decent technical interviewer would ask me this question, I&#8217;d expect a follow up question on how to eliminate the tail call.</li>
<li>The good type of interview that really requires recursion i.e. the ones that require stacks and backtracking. For example:<br />
<blockquote><p>Given a string of characters, find the longest palindrome within the string.</p></blockquote>
<p>These problems may be harder, but they&#8217;re very much doable if you practiced the way suggested above.
</li>
</ul>
<blockquote><p>-flowcharting</p></blockquote>
<p>As I&#8217;ve mentioned in <a href="www.twitter.com/bry_bibat/status/190804146885103617">last night&#8217;s tweet</a>, flowcharts are cute but useless. Anything less than <a href="http://en.wikipedia.org/wiki/Data_flow_diagram">Data Flow Diagrams</a> or <a href="http://en.wikipedia.org/wiki/Unified_Modeling_Language">UML</a> Diagrams can be better written as pseudocode.</p>
<blockquote><p>-pseudocodes (strings,odd/even)</p></blockquote>
<p>Which brings us to this one. <a href="http://en.wikipedia.org/wiki/Pseudocode">Pseudocode</a> has nothing to do with &#8220;strings,odd/even&#8221;. My guess is that this just wants the applicant to be comfortable with writing pseudocode that deals with strings. (and numbers?)</p>
<blockquote><p>-OOP</p></blockquote>
<p>Now here&#8217;s the hard part. Even I didn&#8217;t have good OOP knowledge even after graduating from college.</p>
<p>Fortunately, the books listed above have decent chapters on OOP so just read up on the topic and practice.</p>
<p>And finally:</p>
<blockquote><p>PS: Hindi ko alam kung anong programming language ung eexam. (<em>I don&#8217;t know what programming language will be used in the test</em>)</p></blockquote>
<p>This means the test is language agnostic and you will be coding in pseudocode. Just use the language you&#8217;re most familiar with.</p>
<p>If the interviewer berates you for syntax errors on code written on a whiteboard or a piece of paper, you probably won&#8217;t want to work in such a company. Trust me.</p>
<p>&#8211;</p>
<p>In closing, most technical interviews are just there to weed out applicants who pose as developers but can&#8217;t really write a line of code. So if you <em>really</em> know how to code, you shouldn&#8217;t have a problem with them.</p>
<p>And if you do fail, just take it as a sign that you need to practice harder. Unlike in other fields, a few months of practice in programming will actually help you get better jobs.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.bryanbibat.net/2012/04/14/how-to-prepare-for-a-technical-interview/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Other languages you should learn</title>
		<link>http://blog.bryanbibat.net/2012/03/28/other-languages-you-should-learn/</link>
		<comments>http://blog.bryanbibat.net/2012/03/28/other-languages-you-should-learn/#comments</comments>
		<pubDate>Tue, 27 Mar 2012 20:24:26 +0000</pubDate>
		<dc:creator>Bry</dc:creator>
				<category><![CDATA[Brain Dumps]]></category>
		<category><![CDATA[Follow-Up]]></category>
		<category><![CDATA[Software Engineering]]></category>

		<guid isPermaLink="false">http://blog.bryanbibat.net/?p=1564</guid>
		<description><![CDATA[At first glance, this tweet in response to my previous post looks like a simple joke. But it&#8217;s actually true the more you think about it. Understanding body language is important because software engineering is more about dealing with people than with software itself: almost all failed software projects are due to people problems (e.g. [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://images.bryanbibat.net/body_language.png" alt="body language" class="aligncenter" /></p>
<p>At first glance, this tweet in response to my <a href="http://blog.bryanbibat.net/2012/03/20/what-programming-language-should-i-learn/">previous post</a> looks like a simple joke. But it&#8217;s actually true the more you think about it.</p>
<p>Understanding <strong>body language</strong> is important because <a href="http://blog.bryanbibat.net/category/brain-dump/software-engineering-daily-entry/">software engineering</a> is more about dealing with people than with software itself: almost all failed software projects are due to people problems (e.g. management and client problems) instead of technology problems.</p>
<p>Here are some cases where knowing body language can make a difference:</p>
<ul>
<li><em>A client asks for too many features under an impossible deadline</em> &#8211; by gauging the client&#8217;s behavior, you can determine if she&#8217;s basically bluffing (to which you negotiate a compromise by reducing the scope) or if she&#8217;s really that stupid/sadistic (to which you drop the client for better ones).</li>
<li><em>A developer puts in too many hours into overtime</em> &#8211; depending on the dev&#8217;s behavior, a good manager would determine if that dev is simply temporarily getting brownie points for a promotion or upcoming long vacation. On the other hand, it may also mean that that dev is incompetent to the point that he needs more hours to fix his crappy code. At the worst case, it may also mean that that dev is already at <a href="blog.bryanbibat.net/2009/06/05/burnout">stage 2 &#8211; 3 of going into burnout</a>.
</ul>
<p>Another non-technical language you need to learn is <strong>Basic English</strong>.</p>
<p>Go ahead, laugh. But then recall the last time you&#8217;ve seen a &#8220;<a href="https://www.google.com/search?q=plz+send+me+teh+codez">plz send me teh codez</a>&#8221; post in a public forum or a job posting full of misspellings and grammatical errors (a big <em>warning sign</em>) and you&#8217;ll quickly realize how important it is to have a good grasp of the English language.</p>
<p>Lack of proper written English skills is a somewhat widespread problem in the current generation, with the prevalence of text-speak and the fact that a lot of young people don&#8217;t join international community websites/forums/mailing lists/chat rooms. This can be a problem when they enter the corporate world, where semi-formal English is the lingua franca: I&#8217;ve even heard of stories of project managers re-writing some of the team members mail before sending them to their foreign counterparts because of their poor English.</p>
<p>Note that your English doesn&#8217;t need to be at the level of essayists or other professional writers. In fact, simple, direct to the point (but at the same time, polite) messages is much more effective at communicating to clients or team members when compared to long-winded messages full of highfaluting words. Doubly so when dealing with clients whose primary language isn&#8217;t English.</p>
<p>To wrap things up, I just realized that I wrote about a similar topic <a href="http://blog.bryanbibat.net/2009/09/19/t-shaped-people/">a few years ago</a>. You don&#8217;t need to click that link, as the tl;dr is just the same thing I&#8217;ve been saying all the time: <em>developers need to learn more than just coding</em>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.bryanbibat.net/2012/03/28/other-languages-you-should-learn/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>What programming language should I learn?</title>
		<link>http://blog.bryanbibat.net/2012/03/20/what-programming-language-should-i-learn/</link>
		<comments>http://blog.bryanbibat.net/2012/03/20/what-programming-language-should-i-learn/#comments</comments>
		<pubDate>Tue, 20 Mar 2012 11:28:35 +0000</pubDate>
		<dc:creator>Bry</dc:creator>
				<category><![CDATA[Brain Dumps]]></category>
		<category><![CDATA[Software Engineering]]></category>
		<category><![CDATA[Training]]></category>
		<category><![CDATA[career]]></category>
		<category><![CDATA[fundamentals]]></category>
		<category><![CDATA[programming languages]]></category>
		<category><![CDATA[public talk]]></category>

		<guid isPermaLink="false">http://blog.bryanbibat.net/?p=1556</guid>
		<description><![CDATA[I got to talk for DevCon again last Saturday at STI Makati. Instead of preparing a new talk, I just rehashed an old talk to save time. The new talk is also over at Slideshare. Anyway, the point of this post is to answer a question posed to me by a student in the Q&#038;A [...]]]></description>
			<content:encoded><![CDATA[<p>I got to talk for DevCon again last Saturday at STI Makati. Instead of preparing a new talk, I just rehashed an <a href="http://www.slideshare.net/bryanbibat/latest-trends-in-open-source-web-technologies">old talk</a> to save time. The new talk is also over at <a href="http://www.slideshare.net/bryanbibat/latest-trends-in-web-technologies">Slideshare</a>.</p>
<p>Anyway, the point of this post is to answer a question posed to me by a student in the Q&#038;A portion of the talk:</p>
<blockquote><p><em>Anong programming language ang dapat naming pag-aralan?</em><br />
(What programming language should we learn?)</p></blockquote>
<p>Here&#8217;s a question I wouldn&#8217;t want to hear answered by someone else (i.e. someone who&#8217;s also invited to talk to students). The question itself may seem simple, but unless you&#8217;ve seen how the industry works as a whole, you&#8217;ll probably give a wrong answer.</p>
<p>The traditional answer I don&#8217;t want to hear is to give a suggested list of languages based on market demand. </p>
<p>Simply put, this is bullshit. This is the same sort of bullshit that pressures our youth to take nursing courses even though they&#8217;re just in it for the money, money that they probably won&#8217;t get due to the eventual over-supply of nurses.</p>
<p>So for the student&#8217;s question, I gave two answers:</p>
<p><strong>Programming language and platform choice doesn&#8217;t matter, because for the most part it&#8217;s a business decision.</strong></p>
<p>Yes, I&#8217;m talking about <a href="http://blog.bryanbibat.net/2009/04/26/zed-shaw-the-acl-is-dead/">steaks and strippers</a>. In a large company, you may be initially hired to work on a single language, but eventually there will be a time where the company will make a business decision to shift technologies, whether due to market pressure or due to a new client. If you focus too much on a language, you will not be prepared for the change and you may end up getting fired or demoted.</p>
<p>In smaller companies or in a freelance setting, language still doesn&#8217;t matter, though for another reason: the client will not care about the language as long as you deliver the product.</p>
<p>This leads to the other answer:</p>
<p><strong>Focus on the fundamentals, not on the language/platform.</strong></p>
<p>A common mistake among fresh grads is that they&#8217;re confident they know language A or platform B because they were able to make their school projects or theses while at the same time not having their <a href="http://blog.bryanbibat.net/tag/fundamentals/">fundamentals</a> down pat. Not only does this make them inflexible in terms of learning new languages, it also makes their work brittle and sloppy.</p>
<p>In other words, a student who has 4 years of school &#8220;experience&#8221; in Java is nothing compared to a developer who just had learned Java a month ago but has solid fundamentals in OOP.</p>
<p>You might say &#8220;Screw learning, I&#8217;m just in this for the money!&#8221;. But the fact is, there&#8217;s this thing called the <a href="http://www.paulgraham.com/pypar.html">Python Paradox</a>: developers who are passionate enough to learn more than their peers often end up in higher-earning and less-stressful jobs.</p>
<p><strong>Bottom line:</strong> There is no &#8220;best&#8221; language that you need to learn in order to earn a lot of money. However, if you have good fundamentals, learning the language and platform that the market needs will be much easier for you.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.bryanbibat.net/2012/03/20/what-programming-language-should-i-learn/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Web Developer Interview Questions</title>
		<link>http://blog.bryanbibat.net/2011/03/10/web-developer-interview-questions/</link>
		<comments>http://blog.bryanbibat.net/2011/03/10/web-developer-interview-questions/#comments</comments>
		<pubDate>Thu, 10 Mar 2011 12:33:52 +0000</pubDate>
		<dc:creator>Bry</dc:creator>
				<category><![CDATA[Brain Dumps]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[Software Engineering]]></category>
		<category><![CDATA[Training]]></category>
		<category><![CDATA[Ajax]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[OOP]]></category>
		<category><![CDATA[SQL]]></category>

		<guid isPermaLink="false">http://blog.bryanbibat.net/?p=1261</guid>
		<description><![CDATA[Earlier this week, I had to interview a bunch of applicants for a web developer role. The idea is to filter out those who aren&#8217;t really experienced as the job asks for people with at least 6 months of experience. Anyway, below is the test I gave them. I don&#8217;t feel like giving something like [...]]]></description>
			<content:encoded><![CDATA[<p>Earlier this week, I had to interview a bunch of applicants for a web developer role. The idea is to filter out those who aren&#8217;t really experienced as the job asks for people with at least 6 months of experience.</p>
<p>Anyway, below is the test I gave them. I don&#8217;t feel like giving something like it again in the future (it&#8217;s pretty crappy IMHO) so I think it would be a good idea to share it instead of just throwing it away.</p>
<blockquote><p>Determine whether the statements below are true or false. <strong>Be prepared to explain your answer.</strong></p>
<ol>
<li>A primary key can be composed of multiple columns.</li>
<li>When you have two tables in a parent-child relationship (i.e. one table has a foreign key referring to the other table) deleting a parent record will delete all child records of that record.</li>
<li>Escaping special characters is the best way to avoid SQL injection.</li>
<li>You can undo <code>UPDATE</code> and <code>DELETE</code> changes to the database.</li>
<li>The <code>VARCHAR</code> data type can be used to save space when used over <code>CHAR</code>.</li>
<li>When using an RDBMS, normalization must be done for all tables.</li>
<li>Indexes speed up database actions.</li>
<li>Foreign keys are usually indexed.</li>
<li>Many-to-many relationships are implemented via junction/join tables.</li>
<li>Some HTML elements have been deprecated in favor of CSS.</li>
<li>The <code>&lt;strong&gt;</code> element can be used interchangeably with the <code>&lt;b&gt;</code> element.</li>
<li>Under strict XHTML rules, <code>&lt;br&gt;</code> is not a valid usage of the line break element.</li>
<li>The <code>href</code> attribute of the anchor element only accepts relative and absolute links.</li>
<li>The <code>image</code> tag is a block element.</li>
<li>When a form is submitted, the submitted data is derived from only the <code>input</code> elements inside the <code>form</code>.</li>
<li>Multiple elements can have the same <code>id</code> attribute.</li>
<li>Web servers serve content at port 443.</li>
<li>A web server can identify if a client has visited the website before.</li>
<li><code>POST</code> is idempotent.</li>
<li>A browser redirect can be initiated by a response with an empty body.</li>
<li>In JavaScript, the <code>var</code> keyword is optional when declaring variables so it can be omitted in all cases.</li>
<li>You must specify a function name when declaring JavaScript functions.</li>
<li>Ajax will prevent you from performing other actions until the Ajax action is completed.</li>
<li>You are limited to using XML in Ajax.</li>
<li>You cannot change the values of a class variable.</li>
<li>Constructors are instance methods.</li>
<li>Polymorphism refers to the ability to define functions to have different behaviors depending on the passed arguments.</li>
<li>High cohesion and loose coupling can improve coding speed.</li>
<li>You can combine the features of two classes via inheritance.</li>
<li>Encapsulation is primarily used for security reasons.</li>
</ol>
</blockquote>
<p>Answers below the cut. </p>
<p><span id="more-1261"></span>&#8211;</p>
<p>Any decent web developer would see why I&#8217;m not too comfortable with this test: <em>most of the items are trick questions</em>. The fun part here is that I did that not because I want to boost my ego like many <a href="http://blog.bryanbibat.net/2009/06/16/technical-interviews-and-regular-expressions/">complicated/puzzle questions</a> (secretly) do for the interviewers, but because I specifically wanted to test the applicants&#8217; levels using the <strong><a href="http://blog.bryanbibat.net/2009/05/16/dreyfus-model-of-skill-acquisition/">Dreyfus model</a></strong>. </p>
<p>I don&#8217;t need Novices, I needed Advanced Beginners to Competent applicants, thus the &#8220;<em>Be prepared to explain your answer</em>&#8220;. These questions were designed to be <em>too hard</em> for novices while being <em>too eas</em>y for competent developers.</p>
<p>With little luck, Novices can ace this exam. But ask them &#8220;Why?&#8221; and they&#8217;re sure to falter. Ask an Advanced Beginner the same question and they might answer &#8220;I tried using it the other way before, it didn&#8217;t work&#8221;. Ask a Competent developer and you&#8217;ll get &#8220;Actually the answer can go either way, if you have this or that constraint&#8221;. (Ask an Expert and you&#8217;ll get something like <a href="http://i.imgur.com/b7Qqo.png">this</a>.)</p>
<p>Anyway, here are the answers. Scoring is simple: answer like a Competent developer and I&#8217;ll give you a pass, answer like a Novice and I&#8217;ll fail you.</p>
<p><strong>A primary key can be composed of multiple columns.</strong></p>
<p>TRUE</p>
<p>As many people consider the definition of a Primary Key as a &#8220;single column that uniquely identifies rows&#8221;, even advanced beginners might consider this false as it violates that &#8220;single column&#8221; definition.</p>
<p>Unfortunately for them, you can have <a href="http://en.wikipedia.org/wiki/Primary_key">primary keys</a> that use multiple columns. Typically they&#8217;re called <a href="http://en.wikipedia.org/wiki/Compound_key">Compound Keys</a>.</p>
<p><strong>When you have two tables in a parent-child relationship (i.e. one table has a foreign key referring to the other table) deleting a parent record will delete all child records of that record.</strong></p>
<p>DEPENDS</p>
<p>When you define a <a href="http://en.wikipedia.org/wiki/Foreign_key">foreign key</a>, you can choose to define the <a href="http://en.wikipedia.org/wiki/Foreign_key#Referential_Actions">referential action</a> to be done upon deletion of the parent record. You can delete the child records, set the foreign key to NULL, or even do no action at all.</p>
<p><strong>Escaping special characters is the best way to avoid SQL injection.</strong></p>
<p>FALSE</p>
<p>While I&#8217;m happy to report that most of the applicants knew about SQL injection, none of them were able to answer this correctly. The best solution is to use a parameterized interface as suggested by <a href="http://www.owasp.org/index.php/Top_10_2010-A1">OWASP</a>:</p>
<blockquote><p>Preventing injection requires keeping untrusted data separate from commands and queries.</p>
<ol>
<li>The preferred option is to use a safe API which avoids the use of the interpreter entirely or provides a parameterized interface. Beware of APIs, such as stored procedures, that appear parameterized, but may still allow injection under the hood.</li>
</ol>
</blockquote>
<p>Escaping special characters is obviously #2.</p>
<p><strong>You can undo <code>UPDATE</code> and <code>DELETE</code> changes to the database.</strong></p>
<p>DEPENDS</p>
<p>You can rollback those actions while inside a <a href="http://en.wikipedia.org/wiki/SQL#Transaction_controls">Transaction</a>, but in most cases, no, you can&#8217;t undo them. Hope you made backups.</p>
<p><strong>The <code>VARCHAR</code> data type can be used to save space when used over <code>CHAR</code>.</strong></p>
<p>TRUE</p>
<p>Another surprising discovery: not a lot of people are familiar with <a href="http://en.wikipedia.org/wiki/SQL#Data_types">SQL data types</a>. I assume that they don&#8217;t care whether they&#8217;re using VARCHAR or CHAR when storing strings.</p>
<p>At any rate, this should be true due to VARCHAR&#8217;s variable-width nature as opposed to CHAR&#8217;s fixed-width, though not for all cases.</p>
<p><strong>When using an RDBMS, normalization must be done for all tables.</strong></p>
<p>FALSE.</p>
<p>There are cases where <a href="http://en.wikipedia.org/wiki/Denormalization">denormalization</a> is favored over normalization. </p>
<p>Quick note: when an applicant can properly explain what normalization is in practical terms, you&#8217;ve got yourself a Competent developer.</p>
<p><strong>Indexes speed up database actions.</strong></p>
<p>DEPENDS</p>
<p><a href="http://en.wikipedia.org/wiki/Index_(database)">Indexes</a> can speed up SELECT operations, but they will slow down INSERT, UPDATE, and DELETE operations.</p>
<p><strong>Foreign keys are usually indexed.</strong></p>
<p>TRUE</p>
<p>FKs are usually indexed to speed up child record retrieval. They aren&#8217;t required, though.</p>
<p><strong>Many-to-many relationships are implemented via junction/join tables.</strong></p>
<p>TRUE</p>
<p>When people read &#8220;join table&#8221; they think of SQL JOINs. Too bad what I&#8217;m after is <a href="http://en.wikipedia.org/wiki/Junction_table">Junction Table</a>.</p>
<p>The sad part is that <a href="http://en.wikipedia.org/wiki/Many-to-many_(data_model)">many-to-many</a> is a pretty common entity relationship, even more common than one-to-one. </p>
<p><strong>Some HTML elements have been deprecated in favor of CSS.</strong></p>
<p>TRUE</p>
<p>Many elements were <a href="http://www.w3.org/TR/html401/appendix/changes.html#h-A.3.1.2">deprecated</a> upon moving to HTML 4 because they deal with appearance and layout. All of them can be easily implemented in CSS.</p>
<p><strong>The <code>&lt;strong&gt;</code> element can be used interchangeably with the <code>&lt;b&gt;</code> element.</strong></p>
<p>DEPENDS</p>
<p>If we&#8217;re talking about typical browser behavior, yes, both tags turn text into boldface.</p>
<p>But when it comes down to usage, one provides semantics (i.e. meaning) while the other tells the browser how the enclosed text looks like. It would not be unusual for a designer to set the <code>&lt;strong&gt;</code> tag to make the text italicized, in bold face, and a few pixels larger than normal text.</p>
<p><strong>Under strict XHTML rules, <code>&lt;br&gt;</code> is not a valid usage of the line break element.</strong></p>
<p>DEPENDS</p>
<p>XHTML requires empty elements to either have an end tag or the start tag must end with <code>/&gt;</code>.</p>
<p><code>&lt;br&gt;</code> is still valid as long as it is immediately closed by <code>&lt;/br&gt;</code>. However, it may give <a href="http://www.w3.org/TR/xhtml1/#C_2">uncertain results</a> in user agents.</p>
<p><strong>The <code>href</code> attribute of the anchor element only accepts relative and absolute links.</strong></p>
<p>Okay so this is a trick question. I didn&#8217;t specify if the &#8220;link&#8221; is a general URI (which would allow <code>mailto:</code> and <code>javascript:</code>) or just HTTP URI.  I just wanted to know if the applicant knows enough about the anchor tag and links and I think this question did its job well.</p>
<p><strong>The <code>image</code> tag is a block element.</strong></p>
<p>FALSE</p>
<p>A tricky question, but one that would immediately tell me if the applicant has an idea about <a href="http://www.w3.org/TR/html401/struct/global.html#h-7.5.3">block-level and inline elements</a>. </p>
<p>The <code>img</code> tag is inline (sorry, couldn&#8217;t find a good reference. Gecko and Webkit treat it as inline, though), but most designers set its <code>display</code> option to block.</p>
<p><strong>When a form is submitted, the submitted data is derived from only the <code>input</code> elements inside the <code>form</code>.</strong></p>
<p>FALSE</p>
<p>Yet another trick question. I&#8217;m checking if the applicant whether he/she has tried putting <code>input</code> elements outside the <code>form</code> since it&#8217;s a sign of being an Advanced Beginner.</p>
<p>Anyway, this is false simply because the <code>textarea</code> and <code>select</code> elements will also determine the data submitted by the form.</p>
<p><strong>Multiple elements can have the same <code>id</code> attribute.</strong></p>
<p>DEPENDS</p>
<p>You can define multiple elements with the same <code>id</code> attribute, but it won&#8217;t validate in most HTML validators. It will also screw up your DOM <code>document.getElementById()</code> calls.</p>
<p>If you find yourself using the same <a href="http://www.w3.org/TR/CSS2/selector.html#id-selectors">id</a> on multiple elements for styling reasons, it&#8217;s a sign to use <a href="http://www.w3.org/TR/CSS2/selector.html#class-html"><code>class</code></a> selectors instead. </p>
<p><strong>Web servers serve content at port 443.</strong></p>
<p>DEPENDS</p>
<p>Many web applications will serve content at port 443 for login and other secure transactions because it&#8217;s the default <a href="http://en.wikipedia.org/wiki/HTTP_Secure">HTTPS</a> port. However in most cases, websites use the default <a href="http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol">HTTP</a> port: port 80.</p>
<p>I am honestly surprised how many web developers aren&#8217;t familiar with the concept of <a href="http://en.wikipedia.org/wiki/Port_number">port numbers</a>.</p>
<p><strong>A web server can identify if a client has visited the website before.</strong></p>
<p>DEPENDS</p>
<p>Yet another trick question to bait the higher skilled applicants.</p>
<p>A Competent developer would be quick to point out that HTTP is a <a href="http://en.wikipedia.org/wiki/HTTP#HTTP_session_state">stateless protocol</a>. That is, servers are supposed to forget about previous HTTP transactions.</p>
<p>But as we all know, web servers can determine if a client has visited before, whether the server level (server logs) or at the application level (cookies, session).</p>
<p><strong><code>POST</code> is idempotent.</strong></p>
<p>FALSE</p>
<p>This is the second most difficult question in the test as most developers aren&#8217;t fully aware of concepts like <a href="http://en.wikipedia.org/wiki/HTTP#Request_methods">HTTP verbs</a> and <a href="http://en.wikipedia.org/wiki/Idempotent#Computer_science_meaning">idempotency</a>.</p>
<p>POST is not idempotent as it produces side effects. This is why sometimes when you refresh a non-responding page, the browser will prompt you whether to submit the data again to prevent you from submitting the data twice, something that might produce unwanted side effects (e.g. getting billed twice).</p>
<p><strong>A browser redirect can be initiated by a response with an empty body.</strong></p>
<p>TRUE</p>
<p>A Competent web developer should be aware of the Request-Response cycle in HTTP and should have implemented a browser redirect at least once in his/her career. Typically this would be done via <a href="http://en.wikipedia.org/wiki/HTTP_302">HTTP status code 302</a> with an empty response body, as the target location is defined in the <code>Location</code> response header.</p>
<p><strong>In JavaScript, the <code>var</code> keyword is optional when declaring variables so it can be omitted in all cases.</strong></p>
<p>FALSE</p>
<p>All <a href="http://en.wikipedia.org/wiki/JavaScript_syntax#Variables">JavaScript variables</a> not declared using <code>var</code> are considered global variables. And we don&#8217;t want a crapload of global variables running around the place, right?</p>
<p><strong>You must specify a function name when declaring JavaScript functions.</strong></p>
<p>FALSE</p>
<p>JavaScript is a <a href="http://en.wikipedia.org/wiki/JavaScript#Functional">functional</a> language. It supports declaring functions without function names. </p>
<p><a href="http://jquery.com/">jQuery</a> developers would be familiar with this fact due to the frequent use of closures in the said framework.</p>
<p><strong>Ajax will prevent you from performing other actions until the Ajax action is completed.</strong></p>
<p>FALSE</p>
<p>Ajax, as the original name implies (Asynchronous JavaScript and XML), is asynchronous. There are ways to make it behave synchronously, though.</p>
<p><strong>You are limited to using XML in Ajax.</strong></p>
<p>FALSE</p>
<p>Even though the name implies that you should use XML in Ajax, most current implementations don&#8217;t use XML due to its bloated nature. For example, Facebook uses <a href="http://en.wikipedia.org/wiki/JSON">JSON</a> in their <a href="http://developers.facebook.com/docs/reference/api/">Graph API</a>.</p>
<p><strong>You cannot change the values of a class variable.</strong></p>
<p>FALSE</p>
<p><a href="http://en.wikipedia.org/wiki/Class_variable">Class variables</a> are just like any variables, they can be modified unless declared as constant. </p>
<p>Of course, I still had to make the applicant explain what class variables and <a href="http://en.wikipedia.org/wiki/Instance_variable">instance variables</a> are to check their overall skill level.</p>
<p><strong>Constructors are instance methods.</strong></p>
<p>TRUE</p>
<p><a href="http://en.wikipedia.org/wiki/Constructor_(object-oriented_programming)">Constructors</a> act upon instances of the class, and as such, can be considered as instance methods.</p>
<p>What I&#8217;d love to see is for someone to argue that they are <a href="http://en.wikipedia.org/wiki/Method_(computer_programming)#Static_methods">class methods</a>. Knowing the difference between instance and class methods can turn an Advanced Beginner to a Competent developer in my book.</p>
<p><strong>Polymorphism refers to the ability to define functions to have different behaviors depending on the passed arguments.</strong></p>
<p>FALSE</p>
<p>The one described above is <a href="http://en.wikipedia.org/wiki/Function_overloading">function overloading</a>. <a href="http://en.wikipedia.org/wiki/Polymorphism_in_object-oriented_programming">Polymorphism</a> is a different concept altogether.</p>
<p>It&#8217;s another trick question, as most Novices would not know the difference between the two (or even know how to properly use polymorphism).</p>
<p><strong>High cohesion and loose coupling can improve coding speed.</strong></p>
<p>DEPENDS</p>
<p>Arguably the most difficult question in the test. Only Competent developers would take time to study enough material on OOP to be familiar with <a href="http://en.wikipedia.org/wiki/Cohesion_(computer_science)">cohesion</a> and <a href="http://en.wikipedia.org/wiki/Coupling_(computer_science)">coupling</a>.</p>
<p>Anyway, the answer depends on the definition of &#8220;coding speed&#8221;. If it talks about coding from scratch, high cohesion and loose coupling would slow down coding as it requires the generation of more classes than would the opposite approach. If it talks about overall coding time, which includes addition of new features and maintenance, then yes, it will improve coding speed due to the isolation of changes preventing more bugs from creeping into the system.</p>
<p><strong>You can combine the features of two classes via inheritance.</strong></p>
<p>DEPENDS</p>
<p>Technically, <a href="http://en.wikipedia.org/wiki/Inheritance_(object-oriented_programming)">inheritance</a> can combine the features from a parent class with the features of the new subclass. </p>
<p>But if you have two different classes that you need to combine, say a <code>Car</code> class and a <code>Person</code> class, it would not be good to let the <code>Person</code> class inherit the <code>Car</code> class as it would violate the <a href="http://en.wikipedia.org/wiki/Liskov_substitution_principle">Liskov substitution principle</a>. In those cases, it&#8217;s better to use <a href="http://en.wikipedia.org/wiki/Object_composition#Aggregation">aggregation</a> instead of inheritance.</p>
<p><strong>Encapsulation is primarily used for security reasons.</strong></p>
<p>DEBATABLE</p>
<p>While it is true that hiding the internals of a class is one of the reasons why <a href="http://en.wikipedia.org/wiki/Encapsulation_(object-oriented_programming)">encapsulation</a> is used (e.g. preventing other classes from messing with variables that might screw up the application), one could argue that, on a larger scale, encapsulation&#8217;s enforcement of contracts between objects is more important.</p>
<p>&#8211;</p>
<p>And there you have it, 30 questions with no definite answers. Don&#8217;t even bother using this as a reviewer when applying for a job in a local IT company; I&#8217;ll bet 99% of companies won&#8217;t even bother with this type of (hard-to-check) exam.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.bryanbibat.net/2011/03/10/web-developer-interview-questions/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Starting a &#8220;professional&#8221; Rails app with Haml, Rspec, Devise, and Web App Theme</title>
		<link>http://blog.bryanbibat.net/2011/01/03/starting-a-professional-rails-app-with-haml-rspec-devise-and-web-app-theme/</link>
		<comments>http://blog.bryanbibat.net/2011/01/03/starting-a-professional-rails-app-with-haml-rspec-devise-and-web-app-theme/#comments</comments>
		<pubDate>Mon, 03 Jan 2011 15:44:52 +0000</pubDate>
		<dc:creator>Bry</dc:creator>
				<category><![CDATA[Brain Dumps]]></category>
		<category><![CDATA[Software Engineering]]></category>
		<category><![CDATA[Devise]]></category>
		<category><![CDATA[Haml]]></category>
		<category><![CDATA[Rspec]]></category>
		<category><![CDATA[Ruby on Rails]]></category>
		<category><![CDATA[tutorial]]></category>
		<category><![CDATA[web-app-theme]]></category>
		<category><![CDATA[will_paginate]]></category>

		<guid isPermaLink="false">http://blog.bryanbibat.net/?p=1179</guid>
		<description><![CDATA[Update: Tutorial for Rails 3.1 here! Every Rails developer knows how to create a Rails app. It&#8217;s easy as rails new APP-NAME-HERE But how many know how to create an app from scratch that looks good enough to sell to clients i.e. with slick design, authentication, authorization, and all that? Sure, there are tutorials out [...]]]></description>
			<content:encoded><![CDATA[<p><em><strong>Update:</strong> Tutorial for Rails 3.1 <a href="http://blog.bryanbibat.net/2011/09/24/starting-a-professional-rails-3-1-app-with-web-app-theme-devise-and-kaminari/">here</a>!</em></p>
<p><a href="http://www.bryanbibat.net/images/web-app-theme05.png"><img src="http://www.bryanbibat.net/images/web-app-theme05_thumb.png" alt="crud screen" class="aligncenter"></a></p>
<p>Every Rails developer knows how to create a Rails app. It&#8217;s easy as</p>
<blockquote><p>rails new APP-NAME-HERE</p></blockquote>
<p>But how many know how to create an app from scratch that looks good enough to sell to clients i.e. with slick design, authentication, authorization, and all that? Sure, there are tutorials out there that cover those components, but most of them cover them only in isolation from each other. A quick tutorial containing multiple components at a time would be a valuable resource to anyone planning to start a new app.</p>
<p>As the resident dilettante in these parts, I&#8217;ve decided to create such a tutorial based on a recent demo I made for a prospective client. </p>
<p>This post will discuss how to create a Rails 3 application that looks good enough to sell to clients (of course, YMMV) while still having components found in &#8220;professional&#8221; apps. This tutorial will cover the following:</p>
<ul>
<li>Andrea Franz&#8217;s <a href="https://github.com/pilu/web-app-theme">web-app-theme</a> <a href="http://rubygems.org/gems/web-app-theme">gem</a> &#8211; I only recently found out about this theme generator gem. Had I discovered this sooner, I might not have made &#8220;I hate web design&#8221; a catchphrase. Basically this gem generates themes for your web app (hence the name). The demo and the list of available themes can be found <a href="http://pilu.github.com/web-app-theme/">on this page</a>. The main downside to this gem is the lack of tutorials on the net about it. Hopefully this post will give people an idea what to expect with the gem.</li>
<li><a href="https://github.com/plataformatec/devise">Devise</a> &#8211; our authentication module. <a href="https://github.com/binarylogic/authlogic">Authlogic</a>&#8216;s fine, but I find Devise&#8217;s approach less obtrusive.</li>
<li><a href="http://haml-lang.com/">Haml</a> &#8211; replaces Erb. Not perfect (e.g. screws up with inline a tags) but the drastic decrease in code makes passing it up difficult.</li>
<li><a href="http://rspec.info/rails/">Rspec</a> &#8211; replaces Test::Unit. <strong>Only setup will be covered in this post</strong>, actual usage is left to the reader.</li>
<li><a href="https://github.com/mislav/will_paginate/wiki/">will_paginate</a> &#8211; gem for pagination. Everybody uses it, so what the hell&#8230;</li>
</ul>
<p>Rest of the tutorial is below the cut.</p>
<p><span id="more-1179"></span>Let&#8217;s start by creating our new app with no testing framework and with MySQL as the database:</p>
<p><code>$ rails new pro-template-app -d mysql -T</code></p>
<p>Now would be a good time to edit the <code>.gitignore</code> file to exclude files you don&#8217;t want to add to Git. Rails 3 already provides some good defaults, but if you want more possible entries there are samples available over at <a href="https://github.com/github/gitignore">Github</a>.</p>
<p>Once done, it&#8217;s time to make the initial commit.</p>
<p><code>$ git init<br />
$ git add .<br />
$ git commit -am "initial commit"</code></p>
<h3>Setup Gemfile</h3>
<p>Now is time to add the needed gems to <code>Gemfile</code>.</p>
<pre class="brush: ruby; title: ; notranslate">source 'http://rubygems.org'

gem 'rails', '3.0.3'
gem 'mysql2'
gem 'haml'
gem 'will_paginate', '3.0.pre2'
gem 'devise'

group :development, :test do
  gem 'capybara'
  gem 'rspec-rails'
  gem 'haml-rails'
  gem 'hpricot'
  gem 'ruby_parser'
  gem 'web-app-theme'
end</pre>
<p>I&#8217;ve already explained most of the gems above at the beginning of this post. The only thing worth noting would be the odd version of <code>will_paginate</code> (no &#8220;release&#8221; version is ready yet for Rails 3) and the addition of <code>hpricot</code> and <code>ruby_parser</code>, both of which are needed by both <code>devise</code> and <code>web-app-theme</code> to generate haml files.</p>
<p>Run &#8220;<code>bundle install</code>&#8221; to install the gems. After the gems are installed, all of our generators will now use Rspec instead of Test::Unit, and it can now generate Haml instead of Erb.</p>
<h3>Generate home page</h3>
<p>Let&#8217;s try out our app first by creating a new root page to replace the default.</p>
<p><code>$ rails g controller home index<br />
&nbsp;<br />
$ rm public/index.html</code></p>
<p>Then edit the <code><a href="https://github.com/bryanbibat/pro-template-app/commit/e262d32c7590f054b71a3df806022c94b1c1139d#diff-3">config/routes.rb</a></code>:</p>
<pre class="brush: ruby; title: ; notranslate">ProTemplateApp::Application.routes.draw do
  root :to =&gt; &quot;home#index&quot;
end</pre>
<p>Before starting the app, don&#8217;t forget to create the database:</p>
<p><code>$ rake db:create</code></p>
<p>Start the server.</p>
<p><a href="http://www.bryanbibat.net/images/web-app-theme00.png"><img src="http://www.bryanbibat.net/images/web-app-theme00_thumb.png" alt="initial root page" class="aligncenter"></a></p>
<h3>Generate theme with web-app-theme</h3>
<p>Here comes the fun part.</p>
<p><code>$ rails g web_app_theme:theme --theme="drastic-dark" --engine=haml --app-name="My Latest Web App"</code></p>
<p>This will generate the layout files using the &#8220;<a href="http://pilu.github.com/web-app-theme/#themes/drastic-dark">Drastic Dark</a>&#8221; theme in haml whose title would be &#8220;My Latest Web App&#8221;.</p>
<p>Delete the default layout generated for the rails app:</p>
<p><code>$ rm app/views/layouts/application.html.erb</code></p>
<p>then refresh the page.</p>
<p><a href="http://www.bryanbibat.net/images/web-app-theme01.png"><img src="http://www.bryanbibat.net/images/web-app-theme01_thumb.png" alt="themed root page" class="aligncenter"></a></p>
<p>It looks good, but it&#8217;s a little bit off when compared to the sample page. We still need to tweak the pages a bit. Look <a href="https://github.com/bryanbibat/pro-template-app/commit/25a90d03778efc9bf98c7b146dbd3ad5b485415d#diff-0">here</a> and <a href="https://github.com/bryanbibat/pro-template-app/commit/25a90d03778efc9bf98c7b146dbd3ad5b485415d#L2R23">here</a> for the changes to the page and layout respectively.</p>
<p><a href="http://www.bryanbibat.net/images/web-app-theme02.png"><img src="http://www.bryanbibat.net/images/web-app-theme02_thumb.png" alt="fixed home page" class="aligncenter"></a></p>
<p><strong><em>Jan 10 update</em></strong>: <a href="http://twitter.com/gravityblast/status/23762081501159424">Andrea Franz also mentioned</a> that you could use the option <code>--themed-type=text</code> for this step to generate a text template which you could manipulate as needed. </p>
<p>Note that the file created would be <code>show.html.haml</code> so unless you decided to treat the home controller as a resource (i.e. use <code>show</code> instead of <code>index</code> as the default page), you will have to rename/overwrite the said files.</p>
<p><code>$ rails g web_app_theme:themed home --themed-type=text --engine=haml<br />
&nbsp;<br />
$ mv app/views/home/show.html.haml app/views/home/index.html.haml</code></p>
<h3>Add Devise authentication</h3>
<p>Let&#8217;s install Devise and create our User model in the process.</p>
<p><code>$ rails g devise:install<br />
&nbsp;<br />
$ rails g devise user</code></p>
<p>We also need to customize the login screen so we&#8217;ll generate the Devise views.</p>
<p><code>rails g devise:views -e haml</code></p>
<p>Now we need to tweak the UI to use the web-app-theme. First, let&#8217;s generate the sign in layout:</p>
<p><code>$ rails g web_app_theme:theme sign --layout-type=sign --theme="drastic-dark" --engine=haml --app-name="My Latest Web App"</code></p>
<p>Then let&#8217;s add the following files to the <a href="https://github.com/bryanbibat/pro-template-app/commit/994d265b0d67d60acd9fc2c0d2aeb420117bb4fe#diff-2"><code>config/application.rb</code></a> file to change the layout for signing in:</p>
<pre class="brush: ruby; title: ; notranslate">    config.to_prepare do
      Devise::SessionsController.layout &quot;sign&quot;
    end</pre>
<p>After that comes the tedious part of having to modify the Devise <code>app/views/devise/sessions/new.html.haml</code> file to match the one expected by web-app-theme. Fortunately for you, you could just copy-paste what I did <a href="https://github.com/bryanbibat/pro-template-app/commit/994d265b0d67d60acd9fc2c0d2aeb420117bb4fe#diff-0">here</a>.</p>
<p>Restart the server, run <code>rake db:migrate</code>, and try going to the login site (<code>/users/sign_in</code>).</p>
<p><a href="http://www.bryanbibat.net/images/web-app-theme03.png"><img src="http://www.bryanbibat.net/images/web-app-theme03_thumb.png" alt="login page" class="aligncenter"></a></p>
<h3>Finishing touches to Devise</h3>
<p>Let&#8217;s do some finishing touches to the UI. </p>
<p>First, <a href="https://github.com/bryanbibat/pro-template-app/commit/bf9f22850b1af99508dcc1edde9330ed00911f31#diff-1">modify the layout</a> such that the logout button actually works. Then <a href="https://github.com/bryanbibat/pro-template-app/commit/bf9f22850b1af99508dcc1edde9330ed00911f31#diff-2">modify the CSS</a> to use the Rails 3 standard &#8220;alert&#8221; flash message instead of &#8220;error&#8221;.</p>
<p>Now to test if Devise really works. Add the <a href="https://github.com/bryanbibat/pro-template-app/commit/bf9f22850b1af99508dcc1edde9330ed00911f31#diff-0"><code>before_filter :authenticate_user!</code> to <code>home_controller.rb</code></a> to kick us out to the login screen if we&#8217;re not logged in.</p>
<p><a href="http://www.bryanbibat.net/images/web-app-theme04.png"><img src="http://www.bryanbibat.net/images/web-app-theme04_thumb.png" alt="login error" class="aligncenter"></a></p>
<p>Create a test user via the rails console. </p>
<p><code>$ rails c</code></p>
<pre class="brush: ruby; title: ; notranslate">User.create :email =&gt; &quot;test@example.com&quot;, :password =&gt; &quot;123456&quot;, :password_confirmation =&gt; &quot;123456&quot;</pre>
<p>You should now be able to login and logout.</p>
<p><a href="http://www.bryanbibat.net/images/web-app-theme07.png"><img src="http://www.bryanbibat.net/images/web-app-theme07_thumb.png" alt="login success" class="aligncenter"></a></p>
<h3>Theming a CRUD module</h3>
<p>Now let&#8217;s show how to add the web-app-theme to a new CRUD module. To simplify things, we&#8217;ll use the ultra-<strike>stupid</strike>simple blog demo.</p>
<p><code>$ rails g scaffold blog_entry subject:string content:text publish_at:datetime<br />
...<br />
$ rake db:migrate</code></p>
<p>Overwrite the generated files by running web-app-theme&#8217;s generator:</p>
<p><code>$ rails g web_app_theme:themed blog_entries --will-paginate --engine=haml</code></p>
<p>Since we&#8217;re using <code>will_paginate</code>, we need to <a href="https://github.com/bryanbibat/pro-template-app/commit/492c9538b9a5b15e0ffe962ae01e06316072283a#diff-0">modify the controller accordingly</a>. We also need to <a href="https://github.com/bryanbibat/pro-template-app/commit/492c9538b9a5b15e0ffe962ae01e06316072283a#diff-7">modify the layout</a> to take into account the new module. </p>
<p><a href="http://www.bryanbibat.net/images/web-app-theme05.png"><img src="http://www.bryanbibat.net/images/web-app-theme05_thumb.png" alt="crud screen" class="aligncenter"></a></p>
<p>After that, you can still do <a href="https://github.com/bryanbibat/pro-template-app/commit/c5e0d61d0a5673002facb8c0ff0fd1ae9d850a38#diff-1">a couple of minor tweaks</a> to the pages to deal with their &#8220;auto-generated&#8221; jagged edges. Then you can also apply the <a href="https://github.com/bryanbibat/pro-template-app/commit/492c9538b9a5b15e0ffe962ae01e06316072283a#diff-8">error message fix</a> and <a href="https://github.com/bryanbibat/pro-template-app/commit/c5e0d61d0a5673002facb8c0ff0fd1ae9d850a38#diff-0">test it</a> with the screens.</p>
<p><a href="http://www.bryanbibat.net/images/web-app-theme06.png"><img src="http://www.bryanbibat.net/images/web-app-theme06_thumb.png" alt="fixed crud" class="aligncenter"></a></p>
<h3>And after that&#8230;</h3>
<p>The rest is up to the reader. Here are some gems that you might want to look at for your application, though:</p>
<ul>
<li><a href="http://rubygems.org/gems/cancan">Cancan</a> &#8211; clients usually have roles in their apps. If you have more than 3 roles, I suggest you use this gem to manage user rights.</li>
<li><a href="http://rubygems.org/gems/delocalize">Delocalize</a> &#8211; add this gem unless you want to manually handle your clients entering 10,000.00, saving it as 10000.00 in the database instead of 10. Also works on dates.</li>
<li><a href="http://rubygems.org/gems/spreadsheet">Spreadsheet</a> &#8211; web apps usually have a Batch Job and Reports component. While I&#8217;ve gone by with using the &#8220;runner + cron&#8221; for batch jobs, clients don&#8217;t really find CSV reports appealing. This gem allows you to generate Excel reports for them.</li>
<li><a href="https://github.com/capistrano/capistrano/wiki">Capistrano</a> &#8211; for deployment. This gem warrants its own tutorial.</li>
</ul>
<p>And that&#8217;s it. The complete code generated above can be found at <a href="https://github.com/bryanbibat/pro-template-app">Github</a>.</p>
<p><strong>Follow up:</strong> Steps to style the sign up page <a href="http://blog.bryanbibat.net/2011/03/28/follow-up-styling-the-sign-up-form-in-web-app-theme/">here</a>.</p>
<p><strong>Follow up 2:</strong> As pointed out by Andrew below, Devise has removed HAML support. Now you must generate views as erb via</p>
<p><code>$ rails g devise:views -e erb</code></p>
<p>And use <code>html2haml</code> manually on the records e.g.</p>
<p><code>$ html2haml app/views/devise/sessions/new.html.erb app/views/devise/sessions/new.html.haml</code></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.bryanbibat.net/2011/01/03/starting-a-professional-rails-app-with-haml-rspec-devise-and-web-app-theme/feed/</wfw:commentRss>
		<slash:comments>28</slash:comments>
		</item>
		<item>
		<title>RailsFTW v0.4 released</title>
		<link>http://blog.bryanbibat.net/2010/12/27/railsftw-v0-4-released/</link>
		<comments>http://blog.bryanbibat.net/2010/12/27/railsftw-v0-4-released/#comments</comments>
		<pubDate>Sun, 26 Dec 2010 19:53:01 +0000</pubDate>
		<dc:creator>Bry</dc:creator>
				<category><![CDATA[Brain Dumps]]></category>
		<category><![CDATA[Follow-Up]]></category>
		<category><![CDATA[Software Engineering]]></category>
		<category><![CDATA[MariaDB]]></category>
		<category><![CDATA[mysql2]]></category>
		<category><![CDATA[RailsFTW]]></category>
		<category><![CDATA[Ruby on Rails]]></category>
		<category><![CDATA[Ruby1.9.2-p136]]></category>

		<guid isPermaLink="false">http://blog.bryanbibat.net/?p=1166</guid>
		<description><![CDATA[Following the release of Ruby1.9.2-p136 source and RubyInstaller, I&#8217;ve taken time to update RailsFTW accordingly. Head on over to http://railsftw.bryanbibat.net/ for the latest installer. Aside from updating the patch level, I&#8217;ve also taken time to figure out how to build the mysql2 gem using MariaDB instead of MySQL. Less chance of lawsuits = more fun [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://railsftw.bryanbibat.net"><img src="http://www.bryanbibat.net/images/railsftw.png" class="aligncenter" alt="Rails FTW" /></a></p>
<p>Following the release of Ruby1.9.2-p136 <a href="http://www.ruby-lang.org/en/news/2010/12/25/ruby-1-9-2-p136-is-released/">source</a> and <a href="http://rubyinstaller.org/news/2010/12/25/rubyinstaller-1-9-2-p136-released/">RubyInstaller</a>, I&#8217;ve taken time to update RailsFTW accordingly. Head on over to <a href="http://railsftw.bryanbibat.net/"><strong>http://railsftw.bryanbibat.net/</strong></a> for the latest installer.</p>
<p>Aside from updating the patch level, I&#8217;ve also taken time to figure out how to build the mysql2 gem using MariaDB instead of MySQL. Less chance of lawsuits = more fun for us.</p>
<p>As a bonus, here&#8217;s a screenshot of RailsFTW showing HAML, rspec, and Capybara working properly on Windows:</p>
<p><img src="http://www.bryanbibat.net/images/rspec-haml.png" class="aligncenter" alt="ANSICON FTW" /></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.bryanbibat.net/2010/12/27/railsftw-v0-4-released/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>I&#8217;ll do it once I get [insert awesome hardware/software here]!</title>
		<link>http://blog.bryanbibat.net/2010/12/25/ill-do-it-once-i-get-insert-awesome-hardwaresoftware-here/</link>
		<comments>http://blog.bryanbibat.net/2010/12/25/ill-do-it-once-i-get-insert-awesome-hardwaresoftware-here/#comments</comments>
		<pubDate>Sat, 25 Dec 2010 06:34:13 +0000</pubDate>
		<dc:creator>Bry</dc:creator>
				<category><![CDATA[Brain Dumps]]></category>
		<category><![CDATA[Software Engineering]]></category>
		<category><![CDATA[Training]]></category>
		<category><![CDATA[fundamentals]]></category>

		<guid isPermaLink="false">http://blog.bryanbibat.net/?p=1156</guid>
		<description><![CDATA[In our age of rampant consumerism, it&#8217;s easy to fall into the trap of believing that you could only achieve great things only with the best equipment available. There are two unfortunate side effects to this mentality: People who can&#8217;t get those equipment are discouraged from even trying out that field, and People who can [...]]]></description>
			<content:encoded><![CDATA[<p>In our age of rampant consumerism, it&#8217;s easy to fall into the trap of believing that you could only achieve great things only with the best equipment available. </p>
<p>There are two unfortunate side effects to this mentality:</p>
<ol>
<li>People who can&#8217;t get those equipment are discouraged from even trying out that field, and</li>
<li>People who can get those equipment think they&#8217;re a lot better than they actually are.</li>
</ol>
<p>But the reality is you don&#8217;t need to shell out tons of cash to be good at what you want to do. Ask any expert from any field, from the arts, to scientific fields, to sports, and they will all tell you one thing: focus on the basics.</p>
<p>Here&#8217;s what <a href="http://www.youtube.com/user/freddiew">Freddie Wong</a> (maker of famous After Effects heavy videos like <a href="http://www.youtube.com/watch?v=031Dshcnso4">Flower Warfare</a> and <a href="http://www.youtube.com/watch?v=NKogQf9ooR8">Time Crisis</a>) has to say about this:</p>
<p><object width="560" height="340"><param name="movie" value="http://www.youtube.com/v/e4qmHiTchJA?fs=1&amp;hl=en_US"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/e4qmHiTchJA?fs=1&amp;hl=en_US" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="560" height="340"></embed></object></p>
<p><span id="more-1156"></span>The same sentiments can be found on the legendary &#8220;newbie artist talks about how Photoshop and getting a pen tablet will improve his skill in a forum filled with industry professionals&#8221; <a href="http://www.conceptart.org/forums/showthread.php?t=24872">Insect Battle thread</a> at ConceptArt:</p>
<blockquote><blockquote>thanks for all the feedback&#8230; It has been good to get some constructive critisim. Ive been redrawing the fight scene so that they are more engaged/detailed I will post this in the sketches forum when I have worked on it further..</p>
<p>Im well aware that Im at the bottom of a big ladder.. this is only my 4th attempt at rendering lineart&#8230; so be nice,</p>
<p>There&#8217;s definitely more to be learnt&#8230; Also, the quality will improve once I can get hold of a tablet!!!</p></blockquote>
<p>KID DO YOU FREAKING SPEAK ENGLISH?</p>
<p>get the FUCK away from photoshop</p>
<p>NO TABLET FOR YOU, seriously you are damaging yourself with photoshop. STAY AWAY FROM IT. get a pencil and some newsprint, the cheapest crappiesnt stuff you can find, the backs of envelopes, napkins anything. GET AWAY FROM DIGITAL, render stuff with a pencil. PENCIL goddamit, PS is only hurting you. Why dont you listen. Some of the people that have replied to your threads are some o the biggest pros in the industry ok, they know what there talking about and obviously know alot more then you. Ask em and they will tell you to go with a pencil and paper. Dont buy a tablet, get a scanner then start drawing by hand. To be really honest you dont have the faintest clue what your doing, and these people are trying to help you, LISTEN TO THEM!!</p>
<p>Dont try and render line art in photoshop, when you cant even do the line art. Learn to do the lines first. The learn about Value and Light. ANATOMY IS A MUST. Then practice your pencil rendering. Then start teaching yourself stuff about colour, get some traditional paints and see what happens when you mix them, see how they react, look at the old masters, once you got that down along with everything else ken mentioned. THEN AND ONLY THEN START GOING DIGITAL.</p></blockquote>
<p>So what does this have to do with software development? Well, I hear the same stuff over and over from aspiring developers:</p>
<ul>
<li>I want to learn programming, but I&#8217;ll just wait until college to start.</li>
<li>I want to earn money from making software, but I&#8217;ll just wait until I get a job so I could get the training and hardware to make profitable software.</li>
<li>I want to learn how to do Ruby on Rails, but I&#8217;ll just wait until I get a MacBook because everyone in the industry uses a Mac for development.</li>
</ul>
<p>People need to stop having this mentality. This is the 21st century &#8212; you can get a lot of stuff (legally) for cheaper or even for free. Tutorials like <a href="http://www.greenteapress.com/thinkpython/thinkpython.html">Think Python</a> are available and accessible even to high school level students. There are free <a href="http://lifehacker.com/5714966/five-best-virtual-machine-applications">virtualization software</a> and allows you to run Linux on whatever OS you&#8217;re using to give you an &#8220;industry-level&#8221; software development platform.</p>
<p>I learned how to program BASIC in 4th grade with only a programming book, pen, paper, and a bit of imagination (long story, don&#8217;t ask). Aspiring developers have no excuse not to learn programming basics, considering that they already have a <a href="http://en.wikipedia.org/wiki/JavaScript">functional, object oriented, dynamic scripting language</a> in the browser they use for checking Facebook.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.bryanbibat.net/2010/12/25/ill-do-it-once-i-get-insert-awesome-hardwaresoftware-here/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Programming Fonts</title>
		<link>http://blog.bryanbibat.net/2010/12/13/programming-fonts/</link>
		<comments>http://blog.bryanbibat.net/2010/12/13/programming-fonts/#comments</comments>
		<pubDate>Mon, 13 Dec 2010 09:01:58 +0000</pubDate>
		<dc:creator>Bry</dc:creator>
				<category><![CDATA[Brain Dumps]]></category>
		<category><![CDATA[Software Engineering]]></category>
		<category><![CDATA[coding]]></category>
		<category><![CDATA[fonts]]></category>

		<guid isPermaLink="false">http://blog.bryanbibat.net/?p=1147</guid>
		<description><![CDATA[Aside from revision control and coding standards, college students aren&#8217;t exposed to another important part of software development, namely, the significance behind the choice of programming font. Okay, so the choice of font isn&#8217;t really that important. But it&#8217;s still worth considering when you take into account that you&#8217;re going to get noticeable benefits for [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.bryanbibat.net/images/courier_new_vs_consolas.png" alt="Courier New vs Consolas" class="aligncenter" /></p>
<p>Aside from <a href="http://blog.bryanbibat.net/tag/revision-control/">revision control</a> and <a href="http://blog.bryanbibat.net/2009/09/03/code-conventions/">coding standards</a>, college students aren&#8217;t exposed to another important part of software development, namely, the significance behind the choice of programming font.</p>
<p>Okay, so the choice of font isn&#8217;t really that important. But it&#8217;s still worth considering when you take into account that you&#8217;re going to get noticeable benefits for such a small investment.</p>
<p><span id="more-1147"></span>The most logical reason why you&#8217;d want to choose a good programming font is to make coding easier. Good programming fonts are monospaced, making it much more easier to find out whether you&#8217;re following coding standards or not (e.g. indention, character limit per line). Good programming fonts should allow you to differentiate between &#8220;I&#8221; and &#8220;1&#8243; and &#8220;l&#8221;, and &#8220;0&#8243; and &#8220;O&#8221;, a common source of errors that can sometimes slip under the compiler&#8217;s radar.</p>
<p>In the picture above, on the left is Courier New, the default font for most text editors and IDEs on Windows. We could see here how close its &#8220;l&#8221; is to &#8220;1&#8243;; an inexperienced programmer would think that the first variable&#8217;s value is 54,321 while in reality it&#8217;s just 5,432 with the trailing &#8220;l&#8221; defining it as a long integer in Java.</p>
<p>On the other hand, the example on the right is in <a href="http://www.microsoft.com/downloads/en/details.aspx?familyid=22e69ae4-7e40-4807-8a86-b3d36fab68d3&#038;displaylang=en">Consolas</a>. It&#8217;s much easier to see the difference between &#8220;l&#8221; and &#8220;1&#8243; in this font.</p>
<p>Another benefit to choosing a good font for programming is that they can affect your mood. You may think it&#8217;s illogical for appearance to affect one&#8217;s coding productivity, but just ask any developer who loves their MacBook Pro and you&#8217;ll get a passionate speech on how their <strike>toy</strike> development tool has increased their productivity substantially. </p>
<p>People like me choose clean, anti-alias friendly fonts like Consolas because clean looking code makes me feel compelled to write <a href="http://blog.bryanbibat.net/2009/08/25/refactoring/">cleaner code</a> so as not to ruin its &#8220;beauty&#8221;. Other people choose bitmapped fonts like <a href="http://www.proggyfonts.com/">Proggy</a> to make them feel like they&#8217;re really hacking away at code.</p>
<p>&#8211;</p>
<p>There are a lot of discussions on the net about which programming font. Most of them typically end up linking to <a href="http://www.codinghorror.com/blog/2007/10/revisiting-programming-fonts.html">this Coding Horror post</a> or <a href="http://stackoverflow.com/questions/485174/programming-fonts">this StackOverflow poll</a>. Anyway, here are the programming fonts I&#8217;ve used over the years:</p>
<p><img src="http://www.bryanbibat.net/images/200px-ConsolasSP.svg.png" alt="Consolas" class="aligncenter" /></p>
<p>My main PC runs on Windows 7 so Consolas is a no-brainer. Not only does it come with the OS (so no extra download is needed), it&#8217;s also clean and works well with Windows&#8217; <a href="http://en.wikipedia.org/wiki/ClearType">ClearType</a> technology. </p>
<p><img src="http://www.bryanbibat.net/images/200px-AndaleMono.svg.png" alt="Andalé Mono" class="aligncenter" /></p>
<p>Back when I was still into J2EE development, my development machine ran Windows 2000. It didn&#8217;t have ClearType so Consolas was out of the picture. Instead, I used <a href="http://en.wikipedia.org/wiki/Andal%C3%A9_Mono">Andalé Mono</a> which still looked good on LCDs even without ClearType.</p>
<p><img src="http://www.bryanbibat.net/images/200px-Inconsolata.svg.png" alt="Inconsolata" class="aligncenter" /></p>
<p>When I have to develop in Ubuntu, I just fire up Synaptic and look for <a href="http://www.levien.com/type/myfonts/inconsolata.html">Inconsolata</a>, a font is inspired by Consolas. </p>
<p>&#8211;</p>
<p>tl;dr: Courier New = Bad. Experiment with fonts that look good on your machine.</p>
<p>(font samples taken from Wikipedia)</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.bryanbibat.net/2010/12/13/programming-fonts/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>My Talk on Ruby/Rails</title>
		<link>http://blog.bryanbibat.net/2010/11/24/my-talk-on-rubyrails/</link>
		<comments>http://blog.bryanbibat.net/2010/11/24/my-talk-on-rubyrails/#comments</comments>
		<pubDate>Wed, 24 Nov 2010 14:55:59 +0000</pubDate>
		<dc:creator>Bry</dc:creator>
				<category><![CDATA[Brain Dumps]]></category>
		<category><![CDATA[Software Engineering]]></category>
		<category><![CDATA[DevCon PH]]></category>
		<category><![CDATA[presentation]]></category>
		<category><![CDATA[public talk]]></category>
		<category><![CDATA[RailsFTW]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Ruby on Rails]]></category>

		<guid isPermaLink="false">http://blog.bryanbibat.net/?p=1132</guid>
		<description><![CDATA[Went to talk about Ruby and Ruby on Rails last Tuesday at the mini-DevCon at University of Perpetual Help System – DALTA. That&#8217;s the 4th public talk for this year (4.5th if you count the RailsFTW plugging last month). No &#8220;transcript&#8221; here, though. Just imagine me giving the presentation in front of college students right [...]]]></description>
			<content:encoded><![CDATA[<p>Went to talk about Ruby and Ruby on Rails last Tuesday at the mini-<a href="http://www.devcon.ph/">DevCon</a> at University of Perpetual Help System – DALTA. That&#8217;s the 4th public talk for this year (4.5th if you count the RailsFTW plugging last month).</p>
<p>No &#8220;transcript&#8221; here, though. Just imagine me giving the presentation in front of college students right after I make a class roster app in front of them in under 5 minutes, installation to demo. And yeah, Microsoft is the sponsor I was referring to in the talk.</p>
<div class="prezi-player">
<style type="text/css" media="screen">.prezi-player { width: 550px; } .prezi-player-links { text-align: center; }</style>
<p><object id="prezi_7brbcmsbodq_" name="prezi_7brbcmsbodq_" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="550" height="450"><param name="movie" value="http://prezi.com/bin/preziloader.swf"/><param name="allowfullscreen" value="true"/><param name="allowscriptaccess" value="always"/><param name="bgcolor" value="#ffffff"/><param name="flashvars" value="prezi_id=7brbcmsbodq_&amp;lock_to_path=0&amp;color=ffffff&amp;autoplay=no&amp;autohide_ctrls=0"/><embed id="preziEmbed_7brbcmsbodq_" name="preziEmbed_7brbcmsbodq_" src="http://prezi.com/bin/preziloader.swf" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="550" height="450" bgcolor="#ffffff" flashvars="prezi_id=7brbcmsbodq_&amp;lock_to_path=0&amp;color=ffffff&amp;autoplay=no&amp;autohide_ctrls=0"></embed></object>
<div class="prezi-player-links">
<p><a title="Short presentation for DevCon" href="http://prezi.com/7brbcmsbodq_/ruby-on-rails/">Ruby on Rails</a> on <a href="http://prezi.com">Prezi</a></p>
</div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.bryanbibat.net/2010/11/24/my-talk-on-rubyrails/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

