tag:blogger.com,1999:blog-52339465379820844042024-03-05T01:27:21.049-08:00Hoang Tran's blogDo reinvent the wheels...Hoang Tranhttp://www.blogger.com/profile/08678314335089274137noreply@blogger.comBlogger23125tag:blogger.com,1999:blog-5233946537982084404.post-17194482518084017782011-06-09T04:07:00.000-07:002011-06-09T04:09:18.578-07:00Turn back to BochsAfter a few days tried to use QEMU as an emulator for studying low-level software, it turned out to me that QEMU doesn't support much for debugging. Things like step-by-step run, set break points,... is unable. Then I went back to have a try with Bochs. It's amazing that Bochs is not that hard as I've ever thought. It even provides very good debugging features. <br />
<br />
Here're some of my notes on Bochs installation and use:<br />
<div style="color: #3d85c6;"><br />
</div><div style="color: #0b5394;"> 1. Download Bochs source code at <a href="http://bochs.sourceforge.net/getcurrent.html">http://bochs.sourceforge.net/getcurrent.html</a></div><div style="color: #0b5394;"><br />
2. Extract Bochs code <br />
<span style="font-size: x-small;"><span style="font-family: "Courier New",Courier,monospace;"> $ gunzip -c bochs-version.tar.gz | tar -xvf -</span></span></div><div style="color: #0b5394;"><br />
3. Configure to use debugger<br />
<span style="font-size: x-small;"><span style="font-family: "Courier New",Courier,monospace;">$ ./configure --enable-debugger --enable-disasm</span></span></div><div style="color: #0b5394;"><br />
4. Install</div><div style="color: #0b5394; font-family: "Courier New",Courier,monospace;"><span style="font-size: x-small;"> $ make</span></div><div style="color: #0b5394;"><span style="font-size: x-small;"><span style="font-family: "Courier New",Courier,monospace;"> $ sudo make install</span></span></div><div style="color: #0b5394;"><br />
5. There an example Bochs configs file name <span style="font-size: x-small;"><span style="font-family: "Courier New",Courier,monospace;">.bochsrc</span></span> at extracted dir</div><div style="color: #0b5394;"><br />
6. Using Bochs debugger<br />
<a href="http://bochs.sourceforge.net/doc/docbook/user/internal-debugger.htm">http://bochs.sourceforge.net/doc/docbook/user/internal-debugger.htm</a>l</div>Hoang Tranhttp://www.blogger.com/profile/08678314335089274137noreply@blogger.com0tag:blogger.com,1999:blog-5233946537982084404.post-81037927543165494072011-05-29T03:42:00.000-07:002011-05-29T03:45:51.853-07:00Intel vs AT&T syntaxThere're two popular assembly syntaxes: Intel and AT&T. Intel syntax is popular in Windows world. In Linux, AT&T syntax is more popular though GAS (Gnu Assembler) supports both.<br />
<br />
The following lists some major differences of the two syntaxes:<br />
<div><br />
</div><div><ol><li><span class="Apple-style-span" style="background-color: #b6d7a8;">AT&T prefixes register with % sign</span><br />
* Intel: <br />
<span class="Apple-style-span" style="color: blue; font-family: 'Courier New', Courier, monospace; font-size: x-small;">eax, ebx, ecx,...</span><br />
* AT&T:<br />
prefix by % sign: <span class="Apple-style-span" style="color: blue; font-family: 'Courier New', Courier, monospace; font-size: x-small;">%eax, %ebx, %ecx,...</span><br />
<br />
</li>
<li><span class="Apple-style-span" style="background-color: #b6d7a8;">AT&T prefixes immediate value with $ sign, Intel is not</span><br />
* Intel: <span class="Apple-style-span" style="color: blue; font-family: 'Courier New', Courier, monospace; font-size: x-small;">10, 80h</span><br />
* AT&T: <span class="Apple-style-span" style="color: blue; font-family: 'Courier New', Courier, monospace; font-size: x-small;">$10, $0x80</span><br />
<br />
</li>
<li><span class="Apple-style-span" style="background-color: #b6d7a8;">AT&T and Intel syntax use opposite instruction operands</span><br />
* Intel: <span class="Apple-style-span" style="color: purple; font-family: 'Courier New', Courier, monospace; font-size: x-small;">mnemonic destination, source</span><span class="Apple-style-span" style="color: #274e13; font-family: 'Courier New', Courier, monospace; font-size: x-small;"> </span><br />
Ex: <span class="Apple-style-span" style="color: blue; font-family: 'Courier New', Courier, monospace; font-size: x-small;">mov eax, 100</span><br />
* AT&T: <span class="Apple-style-span" style="color: purple; font-family: 'Courier New', Courier, monospace; font-size: x-small;">mnemonic source, destination</span><br />
Ex: <span class="Apple-style-span" style="color: blue; font-family: 'Courier New', Courier, monospace; font-size: x-small;">movl $100, %eax</span><br />
<br />
</li>
<li><span class="Apple-style-span" style="background-color: #b6d7a8;">AT&T suffixes instruction to specify instruction's operand size (1 byte: <span class="Apple-style-span" style="color: blue; font-family: 'Courier New', Courier, monospace; font-size: x-small;">b</span>, 2 bytes: <span class="Apple-style-span" style="color: blue; font-family: 'Courier New', Courier, monospace; font-size: x-small;">w</span>, 4 bytes: <span class="Apple-style-span" style="color: blue; font-family: 'Courier New', Courier, monospace; font-size: x-small;">l</span>) but Intel uses directive before operands (1 byte: <span class="Apple-style-span" style="color: blue; font-family: 'Courier New', Courier, monospace; font-size: x-small;">byte ptr</span>, 2 bytes: <span class="Apple-style-span" style="color: blue; font-family: 'Courier New', Courier, monospace; font-size: x-small;">word ptr</span>, 4 bytes: <span class="Apple-style-span" style="color: blue; font-family: 'Courier New', Courier, monospace; font-size: x-small;">dword ptr</span>)</span><br />
* Intel:<br />
<span class="Apple-style-span" style="color: blue; font-family: 'Courier New', Courier, monospace; font-size: x-small;">mov al, byte ptr foo</span><br />
* AT&T:<br />
<span class="Apple-style-span" style="color: blue; font-family: 'Courier New', Courier, monospace; font-size: x-small;">movb foo, %al</span><br />
<br />
</li>
</ol></div>Hoang Tranhttp://www.blogger.com/profile/08678314335089274137noreply@blogger.com0tag:blogger.com,1999:blog-5233946537982084404.post-23440522460765027742011-05-28T03:08:00.000-07:002011-05-29T01:06:48.787-07:00Assembly LanguageAssembly can be seen as machine language but in symbols/mnemonics instead of 0s or 1s. So one can make use of any aspect of computer's power if writing programs in assembly.<br />
<br />
Assembly is specific to machine architecture. IA32 (also called x86, i386) is the most popular architecture for PC.<br />
<ol><li><b>Register</b><br />
Can be classified in 4 types:<br />
- general purpose (<span class="Apple-style-span" style="color: blue; font-family: 'Courier New', Courier, monospace; font-size: x-small;">eax, ebx, ecx, edx</span>)<br />
- pointer/index (<span class="Apple-style-span" style="color: blue; font-family: 'Courier New', Courier, monospace; font-size: x-small;">esp, ebp, esi, edi</span>)<br />
- instruction pointer (<span class="Apple-style-span" style="color: blue; font-family: 'Courier New', Courier, monospace; font-size: x-small;">eip</span>)<br />
- flags (<span class="Apple-style-span" style="color: blue; font-family: 'Courier New', Courier, monospace; font-size: x-small;">eflags</span>)<br />
<br />
These are all 32 bits. Each register contains 8-bit and 16-bit parts. Ex: <span class="Apple-style-span" style="color: blue; font-family: 'Courier New', Courier, monospace; font-size: x-small;">eax</span> (32 bits), <span class="Apple-style-span" style="color: blue; font-family: 'Courier New', Courier, monospace; font-size: x-small;">ax</span> (16 bits), <span class="Apple-style-span" style="color: blue; font-family: 'Courier New', Courier, monospace; font-size: x-small;">ah</span> (8 bits), <span class="Apple-style-span" style="color: blue; font-family: 'Courier New', Courier, monospace; font-size: x-small;">al</span> (8bits).<br />
<br />
</li>
<li><b>Instruction</b><br />
- arithmetic/logic: <span class="Apple-style-span" style="color: blue; font-family: 'Courier New', Courier, monospace; font-size: x-small;">add, sub, and, or,...</span><br />
- control: <span class="Apple-style-span" style="color: blue; font-family: 'Courier New', Courier, monospace; font-size: x-small;">jmp,..</span><br />
- data movement: <span class="Apple-style-span" style="color: blue; font-family: 'Courier New', Courier, monospace; font-size: x-small;">mov,..</span><br />
<br />
</li>
<li><b>Operand</b><br />
- <span class="Apple-style-span" style="color: blue; font-family: 'Courier New', Courier, monospace; font-size: x-small;">register</span>: operand value is contained in register<br />
- <span class="Apple-style-span" style="color: blue; font-family: 'Courier New', Courier, monospace; font-size: x-small;">immediate</span>: operand value is a constant<br />
- <span class="Apple-style-span" style="color: blue; font-family: 'Courier New', Courier, monospace; font-size: x-small;">memory</span>: operand value is in memory<br />
<br />
</li>
<li><b>Addressing mode</b><br />
Addressing mode is the way to specify a memory address.<br />
- absolute: <br />
<span class="Apple-style-span" style="color: blue; font-family: 'Courier New', Courier, monospace; font-size: x-small;">address = a value</span><br />
- register: <br />
<span class="Apple-style-span" style="color: blue; font-family: 'Courier New', Courier, monospace; font-size: x-small;">address = register content</span><br />
- displacement:<br />
<span class="Apple-style-span" style="color: blue; font-family: 'Courier New', Courier, monospace; font-size: x-small;">address = register content + a value</span><br />
- indexed:<br />
<span class="Apple-style-span" style="color: blue; font-family: 'Courier New', Courier, monospace; font-size: x-small;">address = register content + a value + another register content (index) * another value (scale)</span><br />
<br />
</li>
<li><b>Subroutine</b><br />
- subroutine is a set of instructions<br />
- parameters passed to subroutine are usually pushed on stack<br />
</li>
</ol>Hoang Tranhttp://www.blogger.com/profile/08678314335089274137noreply@blogger.com0tag:blogger.com,1999:blog-5233946537982084404.post-55368747620026297972011-05-17T08:48:00.000-07:002011-05-21T02:38:43.234-07:00Some notes on QEMUI am finding a computer emulator so that I can use to experiment some low-level softwares. There are two prominent free and open-source emulators: Bochs and QEMU. Bochs seems more popular but lacks of documentation. So I have decided to use QEMU because it's quite simple to use and well documented.<br />
<br />
<b>1. Installation</b> (on Ubuntu)<br />
<span class="Apple-style-span" style="color: blue; font-family: 'Courier New', Courier, monospace; font-size: x-small;">$ sudo apt-get install qemu</span><br />
<br />
<b>2. Start emulator</b><br />
<span class="Apple-style-span" style="color: blue; font-family: 'Courier New', Courier, monospace; font-size: x-small;">$ qemu [options] [disk_image] </span><br />
--> This means start an emulator with specified <span class="Apple-style-span" style="color: #e06666; font-family: 'Courier New', Courier, monospace; font-size: x-small;">options</span> and <span class="Apple-style-span" style="color: #e06666; font-family: 'Courier New', Courier, monospace; font-size: x-small;">disk_image</span> (usually contains OS)<br />
<br />
Ex:<br />
<span class="Apple-style-span" style="color: blue; font-family: 'Courier New', Courier, monospace; font-size: x-small;"> $ qemu linux.img</span><br />
--> Start an emulator with default options and its hard disk contains linux.img<br />
<br />
There are lots of options which specify how your emulated computer could be such as what type of its cpu, hard disk, video card, sound card,... You can get more details on each option in <a href="http://qemu.weilnetz.de/qemu-doc.html#Introduction">QEMU documentation</a>.<br />
<br />
<b>3. Monitoring</b><br />
QEMU provides a way to monitoring your emulator in which you can inspect your emulator, control it, change its devices, query its status,...<br />
<br />
You can switch back and forth between the emulator and its monitor with keystrokes: <span class="Apple-style-span" style="color: red;">Ctrl+Alt+2</span> and <span class="Apple-style-span" style="color: red;">Ctrl+Alt+1<br />
</span><br />
Some monitoring commands:<br />
<span class="Apple-style-span" style="color: #0b5394; font-family: 'Courier New', Courier, monospace; font-size: x-small;"> (qemu) help or ? [cmd] </span><br />
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"> <span class="Apple-style-span" style="color: #0b5394;">(qemu) change </span><i><span class="Apple-style-span" style="color: #e06666;">device</span></i> <i><span class="Apple-style-span" style="color: #e06666;">setting</span></i></span><br />
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"> <span class="Apple-style-span" style="color: #0b5394;">(qemu) </span><span class="option"><span class="Apple-style-span" style="color: #0b5394;">x/fmt </span><i><span class="Apple-style-span" style="color: #e06666;">addr</span></i></span></span><br />
<var><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small; font-style: normal;"> Virtual memory dump starting at addr</span></var><br />
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"><var> <span class="Apple-style-span" style="font-style: normal;"> <span class="Apple-style-span" style="color: #0b5394;"> (qemu) </span></span></var><span class="option"><span class="Apple-style-span" style="color: #0b5394;">xp/fmt </span><i><span class="Apple-style-span" style="color: #e06666;">addr</span></i></span></span><br />
<var><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small; font-style: normal;"> Physical memory dump starting at addr </span></var><br />
<span class="Apple-style-span" style="font-family: monospace;"><var> ...</var></span><br />
<br />
<span class="Apple-style-span" style="font-family: monospace;"><var><br />
</var></span>Hoang Tranhttp://www.blogger.com/profile/08678314335089274137noreply@blogger.com0tag:blogger.com,1999:blog-5233946537982084404.post-66563291334574304732011-05-16T07:48:00.000-07:002011-05-16T08:59:21.379-07:00Use helpers in controllerRails applied Restful as part of its design.<br />
<br />
To follow Restful, you should:<br />
<br />
1. Model your web app as resources<br />
2. Manipulate your app's resources through a conventional interface<br />
<br />
Ex:<br />
- if you have Product resource then urls to CRUD (Create, Edit, Update, Delete) this resource would be:<br />
<br />
<table style="width: 100%;"><thead style="background-color: #dddddd; color: blue;">
<tr> <td>Action</td> <td>Urls</td> <td>Web Method</td><td>Restful Interface</td> </tr>
</thead> <tbody>
<tr> <td>Create</td> <td>/products</td> <td>POST</td> <td>products_url</td> </tr>
<tr> <td>Edit</td> <td>/products/1/edit</td> <td>POST</td> <td>edit_product_url</td> </tr>
<tr> <td>Update</td> <td>/products</td> <td>PUT</td> <td>product_url</td> </tr>
<tr> <td>Delete</td> <td>/products</td> <td>DELETE</td> <td>product_url</td> </tr>
</tbody> </table><br />
<div>Then to get links to delete/edit a product through Restful interface, we can use <span class="Apple-style-span" style="color: blue; font-family: 'Courier New', Courier, monospace; font-size: x-small;">link_to</span> method as below:<br />
<br />
</div><div style="background-color: #cccccc; padding: 5px;"><pre>link_to <span style="color: rosybrown;">'Edit'</span>, edit_product_path(product)</pre></div><br />
<div style="background-color: #cccccc; padding: 5px;"><pre>link_to <span style="color: rosybrown;">'Remove'</span>, product_path(product), <span style="color: cadetblue;">:confirm</span> => <span style="color: rosybrown;">'Are you sure?'</span>,
<span style="color: cadetblue;"> :method</span> => <span style="color: cadetblue;">:delete</span>
</pre></div><br />
By default, you can only use above interfaces in View layer. How can we use those in Controller layer?<br />
<ul><li>In Rails 2, call through <span class="Apple-style-span" style="color: #cc0000; font-family: 'Courier New', Courier, monospace; font-size: x-small;">@template</span> variable<br />
<span class="Apple-style-span" style="color: #3d85c6; font-family: 'Courier New', Courier, monospace; font-size: x-small;">@template.link_to('Edit', edit_product_path(product))</span></li>
</ul><ul><li>In Rails 3, call through <span class="Apple-style-span" style="color: #cc0000; font-family: 'Courier New', Courier, monospace; font-size: x-small;">view_context</span> method<br />
<span class="Apple-style-span" style="color: #3d85c6; font-family: 'Courier New', Courier, monospace; font-size: x-small;">view_context.link_to('Delete', product_path(product), :confirm => 'Are you sure?', :method => :delete)</span></li>
</ul><div>References</div><div>[1] <a href="http://stackoverflow.com/questions/3300582/rails-3-template-variable-inside-controllers-is-nil">http://stackoverflow.com/questions/3300582/rails-3-template-variable-inside-controllers-is-nil</a></div><div>[2] <a href="http://railscasts.com/episodes/132-helpers-outside-views">http://railscasts.com/episodes/132-helpers-outside-views</a></div><div><br />
</div>Hoang Tranhttp://www.blogger.com/profile/08678314335089274137noreply@blogger.com1tag:blogger.com,1999:blog-5233946537982084404.post-58737938592458100742011-04-12T01:25:00.000-07:002011-05-20T21:29:50.723-07:00Code folding in EmacsCode folding is a feature to wrap or unwrap a block of code. It can help you to see an overview of your code. This is a <a href="http://emacs.wordpress.com/2007/01/16/quick-and-dirty-code-folding/">quick and simple way</a> to have that feature in Emacs. I modified it a little bit to make it more flexible as the way I want.<br />
<br />
<div style="background-color: #f9f9f9; border: 1px solid silver; margin: 0 0 1.5em; padding: 0 1em 0 1em;"><pre><span style="color: firebrick;">;; </span><span style="color: firebrick;">code folding</span></pre><pre>(<span style="color: #a020f0;">defun</span> <span style="color: blue;">toggle-selective-display</span> (level)
(interactive <span style="color: rosybrown;">"nEnter indentation level: "</span>)
(set-selective-display level)
)
(global-set-key <span style="color: rosybrown;">"\M-3"</span> 'toggle-selective-display)
</pre><pre></pre></div>So, if I have this code:<br />
<br />
<div style="background-color: #f9f9f9; border: 1px solid silver; margin: 0 0 1.5em; padding: 0 1em 0 1em;"><pre><span style="color: #a020f0;">class</span> <span style="color: forestgreen;">User</span> < <span style="color: forestgreen;">ActiveRecord</span>
has_many <span style="color: cadetblue;">:projects</span>
has_many <span style="color: cadetblue;">:assignments</span>
<span style="color: #a020f0;">def</span> <span style="color: blue;">full_name</span>
<span style="color: rosybrown;">"</span><span style="color: darkgoldenrod;">#{first_name}</span><span style="color: rosybrown;"> </span><span style="color: darkgoldenrod;">#{last_name}</span><span style="color: rosybrown;">"</span>
<span style="color: #a020f0;">end</span>
<span style="color: #a020f0;">def</span> <span style="color: blue;">show_project_names</span>
projects.each <span style="color: #a020f0;">do</span> |prj|
puts prj.name
<span style="color: #a020f0;">end</span>
<span style="color: #a020f0;">end</span>
<span style="color: #a020f0;">end</span></pre></div>then when I press Alt+3 4, all code that was indented at level 4 (4 spaces) will be wrapped as below: <br />
<br />
<div style="background-color: #f9f9f9; border: 1px solid silver; margin: 0 0 1.5em; padding: 0 1em 0 1em;"><pre><span style="color: #a020f0;">class</span> <span style="color: forestgreen;">User</span> < <span style="color: forestgreen;">ActiveRecord</span>
has_many <span style="color: cadetblue;">:projects</span>
has_many <span style="color: cadetblue;">:assignments</span>
<span style="color: #a020f0;">def</span> <span style="color: blue;">full_name</span>...
<span style="color: #a020f0;">end</span>
<span style="color: #a020f0;">def</span> <span style="color: blue;">show_project_names</span>...
<span style="color: #a020f0;">end</span>
<span style="color: #a020f0;">end</span>
</pre></div>if I press Alt+3 2, all code indented at level 2 will be wrapped:<br />
<br />
<div style="background-color: #f9f9f9; border: 1px solid silver; margin: 0 0 1.5em; padding: 0 1em 0 1em;"><pre><span style="color: #a020f0;">class</span> <span style="color: forestgreen;">User</span> < <span style="color: forestgreen;">ActiveRecord</span>... </pre><pre><span style="color: #a020f0;">end</span></pre></div>if I press Alt+3 0, wrapped code will be unwrapped again.<br />
<br />
<div style="background-color: #f9f9f9; border: 1px solid silver; margin: 0 0 1.5em; padding: 0 1em 0 1em;"><pre><span style="color: #a020f0;">class</span> <span style="color: forestgreen;">User</span> < <span style="color: forestgreen;">ActiveRecord</span>
has_many <span style="color: cadetblue;">:projects</span>
has_many <span style="color: cadetblue;">:assignments</span>
<span style="color: #a020f0;">def</span> <span style="color: blue;">full_name</span>
<span style="color: rosybrown;">"</span><span style="color: darkgoldenrod;">#{first_name}</span><span style="color: rosybrown;"> </span><span style="color: darkgoldenrod;">#{last_name}</span><span style="color: rosybrown;">"</span>
<span style="color: #a020f0;">end</span>
<span style="color: #a020f0;">def</span> <span style="color: blue;">show_project_names</span>
projects.each <span style="color: #a020f0;">do</span> |prj|
puts prj.name
<span style="color: #a020f0;">end</span>
<span style="color: #a020f0;">end</span>
<span style="color: #a020f0;">end</span></pre></div>It's quite fun, right?Hoang Tranhttp://www.blogger.com/profile/08678314335089274137noreply@blogger.com0tag:blogger.com,1999:blog-5233946537982084404.post-51345551982029611492011-03-20T02:38:00.000-07:002011-03-20T02:42:39.568-07:00A simple URL shortening algorithmShortening a URL is a convenient way to save long URL to make use of space when posting. It's especially popular on Twitter where message is limited to 140 words. Many websites provide this service such as <a href="http://tinyurl.com/">tinyurl.com</a>, <a href="http://bit.ly/">bit.ly</a>,...<br />
<br />
There some <a href="http://www.marketingformavens.com/blog/url-shortening-bitly-ruby-on-rails">gems</a> or <a href="http://nasir.wordpress.com/2009/11/26/url-shortener-gem-bitly-api-wrapper-in-ruby/">wrapper</a> to use that service in your Rails app. But the shortened URLs belong to another domain (ex: <a href="http://bit.ly/ek8Hhe">http://bit.ly/ek8Hhe</a> which belongs to <a href="http://bit.ly/">bit.ly</a>). If you want to make it belonged to your domain (ex: <a href="http://example.com/wfds7i">http://example.com/wfds7i</a>), you must implement your own URLs shortener.<br />
<br />
This is a <a href="http://blog.pilsch.com/past/2009/6/7/shorten_your_own_damn_urls/">simple way</a> to do that.<br />
<br />
Basically, the problem is:<br />
<blockquote>given a URL, how to map it to a string which has pattern XXXXXX, where X belongs to {0..9a-zA-Z}. There would be 62^6 = 56800235584 such strings. That amount is almost enough.</blockquote><div>Then the simple idea to solve that problem is:<br />
<blockquote>map the URL to an integer in 1..62^6. That number must correspond to a string in space {XXXXXX} that could be calculated by using a 10-base to 62-base conversion algorithm (you can understand easily by figuring out how to convert a decimal number to hexa number). </blockquote></div><div><br />
</div><div>Here is an implementation of mine in Ruby:<br />
<br />
</div><div style="background-color: #f9f9f9; border: 1px solid silver; margin: 0 0 1.5em; padding: 0 1em 0 1em;"><pre><span style="color: #a020f0;">class</span> <span style="color: forestgreen;">URLShortener</span>
<span style="color: forestgreen;">CHARSET</span> = <span style="color: rosybrown;">"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"</span>
<span style="color: forestgreen;">BASE</span> = 62
<span style="color: forestgreen;">CODE_LENGTH</span> = 6
<span style="color: #a020f0;">def</span> <span style="color: blue;">self.encode</span>(id)
code = <span style="color: rosybrown;">""</span>
<span style="color: #a020f0;">while</span> (id > 0) <span style="color: #a020f0;">do</span>
code = <span style="color: forestgreen;">CHARSET</span>[id % <span style="color: forestgreen;">BASE</span>].chr + code
id = id / <span style="color: forestgreen;">BASE</span>
<span style="color: #a020f0;">end</span>
(code.length > <span style="color: forestgreen;">CODE_LENGTH</span>) ? <span style="color: rosybrown;">""</span> : <span style="color: rosybrown;">"0"</span> * (<span style="color: forestgreen;">CODE_LENGTH</span> - code.length) + code
<span style="color: #a020f0;">end</span>
<span style="color: #a020f0;">def</span> <span style="color: blue;">self.decode</span>(code)
<span style="color: #a020f0;">return</span> -1 <span style="color: #a020f0;">if</span> code.length != <span style="color: forestgreen;">CODE_LENGTH</span>
id = 0
<span style="color: #a020f0;">for</span> i <span style="color: #a020f0;">in</span> 0..(<span style="color: forestgreen;">CODE_LENGTH</span>-1) <span style="color: #a020f0;">do</span>
n = <span style="color: forestgreen;">CHARSET</span>.index(code[i])
<span style="color: #a020f0;">return</span> -1 <span style="color: #a020f0;">if</span> n.nil?
id += n * (<span style="color: forestgreen;">BASE</span> ** (<span style="color: forestgreen;">CODE_LENGTH</span> - i - 1))
<span style="color: #a020f0;">end</span>
<span style="color: #a020f0;">return</span> id
<span style="color: #a020f0;">end</span>
<span style="color: #a020f0;">end</span>
</pre></div>Hoang Tranhttp://www.blogger.com/profile/08678314335089274137noreply@blogger.com1tag:blogger.com,1999:blog-5233946537982084404.post-61099831148148086412011-03-20T00:13:00.000-07:002011-06-19T23:35:11.074-07:00Making ajax formMaking an ajax form is a javascript code snippet that we see very frequently. So I've tried to write it as a pattern that could be easy to reuse when needed.<br />
<br />
<div style="background-color: #f9f9f9; border: 1px solid silver; margin: 0pt 0pt 1.5em; padding: 0pt 1em;"><pre><<span style="color: blue;">form</span> <span style="color: darkgoldenrod;">action</span>=<span style="color: rosybrown;">"do_something"</span> <span style="color: darkgoldenrod;">method</span>=<span style="color: rosybrown;">"post"</span> <span style="color: darkgoldenrod;">id</span>=<span style="color: rosybrown;">"do_something_form"</span>>
Field 1: <<span style="color: blue;">input</span> <span style="color: darkgoldenrod;">type</span>=<span style="color: rosybrown;">"text"</span> <span style="color: darkgoldenrod;">name</span>=<span style="color: rosybrown;">"field1"</span> <span style="color: darkgoldenrod;">id</span>=<span style="color: rosybrown;">"field1"</span> />
<<span style="color: blue;">br</span> />
Field 2: <<span style="color: blue;">input</span> <span style="color: darkgoldenrod;">type</span>=<span style="color: rosybrown;">"text"</span> <span style="color: darkgoldenrod;">name</span>=<span style="color: rosybrown;">"field2"</span> <span style="color: darkgoldenrod;">id</span>=<span style="color: rosybrown;">"field2"</span>/>
<<span style="color: blue;">br</span> />
<<span style="color: blue;">input</span> <span style="color: darkgoldenrod;">type</span>=<span style="color: rosybrown;">"submit"</span> <span style="color: darkgoldenrod;">value</span>=<span style="color: rosybrown;">"Submit"</span> />
</<span style="color: blue;">form</span>>
<<span style="color: blue;">script</span>>
jQuery('#do_something_form').submit(function(event){
// stop normal form submitting
event.preventDefault();
// get form's fields
var field1_val = jQuery('#field1').val(),
field2_val = jQuery('#field2').val(),
url = jQuery(this).attr('action');
// send request
jQuery.post(url, // ajax url
{
field1: field1_val,
field2: field2_val
}, // data passed to server side
function(response){ // callback
// do things with response data, ex:
alert(response[<span style="color: rosybrown;">"message"</span>]);
if (response[<span style="color: rosybrown;">"success"</span>] == true) {
// ...
}
},
<span style="color: rosybrown;">"json"</span> // response's format
);
});
</<span style="color: blue;">script</span>></pre><pre> </pre><pre><b>Then at backend:</b></pre><pre> </pre><pre><span style="color: #a020f0;">def</span> <span style="color: blue;">create</span>
<span style="color: darkgoldenrod;">@form</span> = params
<span style="color: #a020f0;">if</span> some_condition
<span style="color: darkgoldenrod;">@result</span> = {
<span style="color: cadetblue;">:success</span> => <span style="color: darkgoldenrod;">true</span>,
<span style="color: cadetblue;">:message</span> => <span style="color: rosybrown;">"Resource has been created successfully!"</span>,
<span style="color: cadetblue;">:other_data</span> => {}
}
<span style="color: #a020f0;">else</span>
<span style="color: darkgoldenrod;">@result</span> = {
<span style="color: cadetblue;">:success</span> => <span style="color: darkgoldenrod;">false</span>,
<span style="color: cadetblue;">:message</span> => <span style="color: rosybrown;">"Creation failed! Please try again!"</span>
}
<span style="color: #a020f0;">end</span>
render <span style="color: cadetblue;">:text</span> => <span style="color: darkgoldenrod;">@result</span>.to_json
<span style="color: #a020f0;">end</span>
</pre><pre></pre><pre></pre></div>Reference:<br />
<a href="http://api.jquery.com/jQuery.post/">http://api.jquery.com/jQuery.post/</a>Hoang Tranhttp://www.blogger.com/profile/08678314335089274137noreply@blogger.com0tag:blogger.com,1999:blog-5233946537982084404.post-30554394677490937152011-03-13T00:40:00.000-08:002011-03-13T08:22:54.407-07:00Tổng quan về kinh tế học #1<div class="separator" style="clear: both; text-align: center;"><br />
</div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhJUj_hPSopth_gZW4dbKIsZSL1KcdetjMWygII9BEAGyQXKUyVJ9aCIKBGQKRV8X4ag76NfVRnZNigtAojnOlZyVSyeGkD1znCPu3xuEuhGx2EHylK543L4Dwg56SaeJLwxmcU8Q60bg0/s1600/economics.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="285" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhJUj_hPSopth_gZW4dbKIsZSL1KcdetjMWygII9BEAGyQXKUyVJ9aCIKBGQKRV8X4ag76NfVRnZNigtAojnOlZyVSyeGkD1znCPu3xuEuhGx2EHylK543L4Dwg56SaeJLwxmcU8Q60bg0/s400/economics.jpg" width="400" /></a></div><br />
<br />
Nói đến <span class="Apple-style-span" style="color: blue;"><b>kinh tế</b></span> là nói đến quá trình sản xuất, trao đổi hàng hóa, của cải vật chất và tinh thần trong xã hội. Thông qua quá trình đó, con người tương tác với nhau để tạo ra của cải vật chất hay những giá trị mới, tái phân bổ chúng, phục vụ cho các nhu cầu trong cuộc sống, rồi lại lao động và lại tái tạo ra những giá trị mới khác,... Đó là tổng thể của cái gọi là nền kinh tế. Làm sao để nền kinh tế tạo ra thật nhiều giá trị? Làm sao để quá trình sản xuất và lưu thông hàng hóa hiệu quả hơn?... Đó là những vấn đề của <b><span class="Apple-style-span" style="color: blue;">kinh tế học</span></b>.<br />
<br />
Một trong những yếu tố cơ bản của nền kinh tế là thị trường và tiền tệ.<br />
<br />
Nơi hàng hóa được đem ra trao đổi, mua bán được gọi là <span class="Apple-style-span" style="color: blue;"><b>thị trường</b></span>. Vd: thị trường bất động sản, thị trường chứng khoán, chợ,...<br />
<br />
Hàng hóa có thể được trao đổi, mua bán trên thị trường dưới nhiều hình thức:<br />
- Trao đổi trực tiếp:<br />
vd: 1 trâu đổi 100 thúng lúa<br />
- Trao đổi gián tiếp (quy đổi sang một loại hàng hóa trung gian)<br />
vd: 1 trâu <-> 100 thúng lúa<br />
1 bò <-> 80 thúng lúa<br />
1 căn nhà <-> 1000 thúng lúa<br />
hoặc,<br />
1 trâu <-> 1 lượng vàng<br />
1 bò <-> 0.5 lượng vàng<br />
1 nhà <-> 100 lượng vàng<br />
<br />
Yếu tố đóng vai trò trung gian trong trao đổi hàng hóa được gọi là <span class="Apple-style-span" style="color: blue;"><b>tiền tệ</b></span>. Thời xưa, tiền tệ cũng chính là hàng hóa (lúa, vàng, bạc,...), bản thân chúng có giá trị nội tại. Khi kinh tế ngày càng phát triển, nhiều hình thức tiền tệ khác ra đời làm cho quá trình trao đổi, lưu thông hàng hóa thuận tiện, nhanh chóng hơn như tiền đồng, tiền giấy, tiền điện tử,... Tiền tệ trở về với đúng bản chất của nó: làm trung gian trong trao đổi hàng hóa, bản thân nó không có hoặc có rất ít giá trị nội tại. Vai trò trung gian, đại diện cho giá trị thực đó của tiền tệ được đảm bảo bởi nhà nước và pháp luật.Hoang Tranhttp://www.blogger.com/profile/08678314335089274137noreply@blogger.com0tag:blogger.com,1999:blog-5233946537982084404.post-77294706315927548972011-03-12T09:38:00.000-08:002011-05-20T21:42:37.399-07:00Be careful writing hooks to Rack layer (middle ware layer) in RailsI've got this error from a Rails project:<br />
<br />
<span class="Apple-style-span" style="color: blue; font-family: 'Courier New', Courier, monospace;">ERROR NoMethodError: private method `split' called for 0:Fixnum</span><br />
<span class="Apple-style-span" style="color: blue; font-family: 'Courier New', Courier, monospace;"><br />
</span><br />
<span class="Apple-style-span" style="color: blue;"><span class="Apple-style-span" style="color: black; font-family: inherit;">Following the link below gave me some clues:</span></span><br />
<span class="Apple-style-span" style="color: blue; font-family: 'Courier New', Courier, monospace;"><span class="Apple-style-span" style="color: black; font-family: 'Times New Roman';"><a href="http://rack.lighthouseapp.com/projects/22435/tickets/52-read-error-nomethoderror-private-method-split-called-for-0fixnum">http://rack.lighthouseapp.com/projects/22435/tickets/52-read-error-nomethoderror-private-method-split-called-for-0fixnum</a></span></span><br />
<br />
<div style="color: black; font-family: 'Times New Roman'; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"><br />
</div><div style="color: black; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"><span class="Apple-style-span" style="color: blue;"><span class="Apple-style-span" style="color: black; font-family: inherit;">1. something's wrong in Rack layer</span></span></div><div style="color: black; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"><span class="Apple-style-span" style="color: blue;"><span class="Apple-style-span" style="color: black; font-family: inherit;">2. someone wrote incorrect code that hooked to Rack layer </span></span></div><div style="color: black; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"><span class="Apple-style-span" style="color: blue;"><span class="Apple-style-span" style="color: black; font-family: inherit;"><br />
</span></span></div><div style="color: black; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"><span class="Apple-style-span" style="font-family: inherit;">Case #1: rarely happened</span></div><div style="color: black; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"><span class="Apple-style-span" style="color: blue;"><span class="Apple-style-span" style="color: black; font-family: inherit;">Case #2: may be </span></span></div><div style="color: black; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"><span class="Apple-style-span" style="font-family: inherit;"><br />
</span></div><div style="color: black; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"><span class="Apple-style-span" style="font-family: inherit;">I did some search and found this code in authentication module:</span></div><div style="color: blue; font-family: 'Courier New', Courier, monospace; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;">response.headers["Expires"] = 0</div><div style="color: blue; font-family: 'Courier New', Courier, monospace;"><span class="Apple-style-span" style="color: blue; font-family: 'Courier New', Courier, monospace;"><span class="Apple-style-span" style="color: black; font-family: 'Times New Roman';"><br />
</span></span></div><div style="color: blue;"><span class="Apple-style-span" style="color: blue;"><span class="Apple-style-span" style="color: black; font-family: inherit;">This must be the cause of the error. </span></span></div><div style="color: blue;"><span class="Apple-style-span" style="color: blue;"><span class="Apple-style-span" style="color: black; font-family: inherit;"><br />
</span></span></div><div style="color: blue;"><span class="Apple-style-span" style="color: blue;"><span class="Apple-style-span" style="color: black; font-family: inherit;">Though the correct code is just: </span></span></div><div style="color: blue; font-family: 'Courier New', Courier, monospace;"><span class="Apple-style-span" style="color: blue; font-family: 'Courier New', Courier, monospace;"><span class="Apple-style-span" style="color: black; font-family: 'Times New Roman';"><span class="Apple-style-span" style="color: blue; font-family: 'Courier New', Courier, monospace;">response.headers["Expires"] = "0"</span></span></span></div><div style="color: blue; font-family: 'Courier New', Courier, monospace;"><span class="Apple-style-span" style="color: blue; font-family: 'Courier New', Courier, monospace;"><span class="Apple-style-span" style="color: black; font-family: 'Times New Roman';"><br />
</span></span></div><div><span class="Apple-style-span" style="color: blue;"><span class="Apple-style-span" style="color: black; font-family: inherit;">it still took me over a day to find out and fix that bug!!! </span></span></div><div><span class="Apple-style-span" style="font-family: inherit;"><br />
</span></div><div><span class="Apple-style-span" style="font-family: inherit; font-size: large;"><b><i><span class="Apple-style-span" style="color: blue;"><span class="Apple-style-span" style="color: black;"></span></span>Simple but not simple!</i></b></span></div><div><br />
</div><div style="color: blue; font-family: 'Courier New', Courier, monospace;"><span class="Apple-style-span" style="color: blue; font-family: 'Courier New', Courier, monospace;"><span class="Apple-style-span" style="color: black; font-family: 'Times New Roman';"><br />
</span></span></div>Hoang Tranhttp://www.blogger.com/profile/08678314335089274137noreply@blogger.com1tag:blogger.com,1999:blog-5233946537982084404.post-60191324373299537952011-03-12T07:06:00.000-08:002011-03-12T22:25:59.138-08:00A case of "Broken Pipe" error in RailsHave you ever seen "Broken PIPE" error in Rails?<br />
<br />
It somehow like this:<br />
<br />
<span class="Apple-style-span" style="border-collapse: collapse; font-family: Arial, 'Liberation Sans', 'DejaVu Sans', sans-serif; font-size: 14px; line-height: 18px;"></span><br />
<pre class="default prettyprint" style="background-attachment: initial; background-clip: initial; background-color: #eeeeee; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; font-size: 14px; margin-bottom: 10px; margin-left: 0px; margin-right: 0px; margin-top: 0px; max-height: 600px; overflow-x: auto; overflow-y: auto; padding-bottom: 5px; padding-left: 5px; padding-right: 5px; padding-top: 5px; vertical-align: baseline; width: auto;"><code style="background-attachment: initial; background-clip: initial; background-color: #eeeeee; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">***</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="typ" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #2b91af; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">Exception</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="typ" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #2b91af; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">Errno</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">::</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">EPIPE </span><span class="kwd" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: darkblue; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">in</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="typ" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #2b91af; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">Passenger</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="typ" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #2b91af; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">RequestHandler</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">(</span><span class="typ" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #2b91af; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">Broken</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> pipe</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">)</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">(</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">process </span><span class="lit" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: maroon; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">22235</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">):</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">
</span><span class="kwd" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: darkblue; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">from</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">/</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">usr</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">/</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">lib</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">/</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">ruby</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">/</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">gems</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">/</span><span class="lit" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: maroon; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">1.8</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">/</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">gems</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">/</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">passenger</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">-</span><span class="lit" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: maroon; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">2.1</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">.</span><span class="lit" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: maroon; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">2</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">/</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">lib</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">/</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">phusion_passenger</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">/</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">rack</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">/</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">request_handler</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">.</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">rb</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">:</span><span class="lit" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: maroon; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">67</span><span class="pun" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">:</span><span class="kwd" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: darkblue; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">in</span><span class="pln" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: black; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;"> </span><span class="str" style="background-attachment: initial; background-clip: initial; background-color: transparent; background-image: initial; background-origin: initial; border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: maroon; font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: baseline;">`write'</span></code></pre><br />
<br />
This error seems appear when your program interacts improperly with external programs. In my case, it happened to me in a project that I used XMLRPC library to remotely communicate with some web services.<br />
<br />
My implementation for that feature is as following:<br />
- create a XMLRPC connection object<br />
- use that XMLRPC object every time calling a webservice API<br />
<br />
There some other guys had been headache with that error also:<br />
<a href="http://gaveen.owain.org/2008/04/errnoepipe-broken-pipe-mysql-error-in.html">http://gaveen.owain.org/2008/04/errnoepipe-broken-pipe-mysql-error-in.html</a><br />
<a href="http://stackoverflow.com/questions/1082166/exception-errnoepipe-in-passenger-requesthandler-broken-pipe">http://stackoverflow.com/questions/1082166/exception-errnoepipe-in-passenger-requesthandler-broken-pipe</a><br />
<a href="http://stackoverflow.com/questions/4351624/ruby-on-rails-errnoepipe-broken-pipe">http://stackoverflow.com/questions/4351624/ruby-on-rails-errnoepipe-broken-pipe</a><br />
<br />
and the reasons they found come around Passenger or Mysql.<br />
<br />
In my case, I've got the same thing even with upgrading Passenger or migrating to another web server.<br />
After a lot of retries, I've found that if I call the API very often, "Broken pipe" doesn't appear, but if I stop doing anything for a while and then call the API, it does happen. That observation led me to a guess: XMLRPC connection object may be broken after a certain amount of time (timeout). Excellently, that's exactly right! I then changed my implementation so that every time calling a webservice API, I use a newly created XMLRPC connection object instead of using the same XMLRPC connection object for every API calls.<br />
<br />
That solved my problem!<br />
<div><br />
</div>Hoang Tranhttp://www.blogger.com/profile/08678314335089274137noreply@blogger.com0tag:blogger.com,1999:blog-5233946537982084404.post-75801720970806259552011-02-22T09:08:00.000-08:002011-03-12T22:24:17.423-08:00Django Overview<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjq_LWL90krQ-wdRVLYFfg3AXAZLQ-ebjBV1Jzioa8yN4aTCYgFDyY3SgIvRc7QXW_QGGPyfsNNpTkUzQe8H_KN4WfznvCzuzKkcZ8RNY7HkAVxNooBmdQxHIhBWf6r0LdILjMHZz0eWPc/s1600/DjangoOverview.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="297" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjq_LWL90krQ-wdRVLYFfg3AXAZLQ-ebjBV1Jzioa8yN4aTCYgFDyY3SgIvRc7QXW_QGGPyfsNNpTkUzQe8H_KN4WfznvCzuzKkcZ8RNY7HkAVxNooBmdQxHIhBWf6r0LdILjMHZz0eWPc/s400/DjangoOverview.jpg" width="400" /></a></div><div class="separator" style="clear: both; text-align: center;"><br />
</div>(will add more soon...)Hoang Tranhttp://www.blogger.com/profile/08678314335089274137noreply@blogger.com0tag:blogger.com,1999:blog-5233946537982084404.post-28784984828058994482011-02-19T07:11:00.000-08:002011-03-12T22:25:07.443-08:00#1 Setup a basic Django project, I've been getting more and more interested in Django. I think why shouldn't I write a series about it. So, let's start with the basics first: how to setup Django development environment and build a basic Django project.<br />
<br />
<span class="Apple-style-span" style="color: blue;"><b>1. Setup environments</b></span><br />
<ul><li>Install Python</li>
</ul> Get Python at http://www.python.org<br />
To verify if it's already installed, at console:<br />
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"> $ python</span><br />
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"> Python 2.6.6 (r266:84292, Sep 15 2010, 15:52:39) </span><br />
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"> [GCC 4.4.5] on linux2</span><br />
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"> Type "help", "copyright", "credits" or "license" for more information.</span><br />
<ul><li>Install Django</li>
</ul> Download a Django release at http://www.djangoproject.com/download/<br />
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"> $ tar xzvf Django.tar.gz</span><br />
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"> $ cd Django</span><br />
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"> $ sudo python setup.py install </span><br />
<br />
To verfiy what's your current Django's version<br />
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"> $ python</span><br />
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"> >>> import django</span><br />
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"> >>> django.get_version()</span><br />
<br />
<span class="Apple-style-span" style="color: blue;"><b>2. Create a basic Django project </b></span><br />
<ul><li>To initialize project </li>
</ul><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"> $ django-admin.py startproject mysite</span><br />
This will create a basic Django project in mysite directory that looks as below<br />
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"> mysite/</span><br />
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"> __init__.py</span><br />
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"> manage.py</span><br />
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"> settings.py</span><br />
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"> urls.py</span><br />
<ul><li>Now run a development webserver to see if your Django site works</li>
</ul><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"> $ python manage.py runserver</span><br />
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"> Validating models...</span><br />
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"> 0 errors found.</span><br />
<br />
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"> Django version 1.0, using settings 'mysite.settings'</span><br />
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"> Development server is running at http://127.0.0.1:8000/</span><br />
<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"> Quit the server with CONTROL-C. </span><br />
<ul><li>Goto http://127.0.0.1:8000 on your Web browser, you'll see a "Welcome to Django" page. It's works!</li>
</ul>So, you have setup a very basic Django project. If you want to make more complex stuffs, you may need to use a database backend, create some models, build your site's templates, mapping urls to what will process & response the corressponding templates (Django call this "views"), add some caching mechanisms to boost performance,...Hoang Tranhttp://www.blogger.com/profile/08678314335089274137noreply@blogger.com0tag:blogger.com,1999:blog-5233946537982084404.post-38692081557616897762011-02-18T07:42:00.000-08:002011-03-12T22:25:35.978-08:00How caching works in Django<div>Last time, I had a chance joining to a Django project. Django is a web framework written by Python. Though I've invested sometime before to study Django and been amazing with it, I haven't really done anything on Django yet. So that's a good opportunity for me to increase my Django knowledge. One of my tasks at start was to study caching supports in Django. Compare to what I knew with Ruby on Rails, I found that caching in Django is very strong and especially well-organized. So, it would be useful to put some summarizations down here. </div><ol><li><b>General rule</b><br />
<br />
<div><span style="background-color: white; color: #b45f06; font-family: 'Courier New'; font-size: 12pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">given a URL, try finding that page in the cache</span><br />
<span style="background-color: white; color: #b45f06; font-family: 'Courier New'; font-size: 12pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"></span><span style="background-color: transparent; color: #274e13; font-family: 'Courier New'; font-size: 12pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">if the page is in the cache:<br class="kix-line-break" /> return the cached page</span><span style="background-color: white; color: blue; font-family: 'Courier New'; font-size: 12pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"><br class="kix-line-break" />else:<br class="kix-line-break" /> generate the page<br class="kix-line-break" /> save the generated page in the cache (for next time)<br class="kix-line-break" /> return the generated page<br />
<br />
</span><span style="background-color: transparent; color: blue; font-family: 'Courier New'; font-size: 11pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"></span></div><ol></ol></li>
<li><b>More specific</b><br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDj9z1Q1y7NGvpYPI_5EUcmCJG4-Veqvx_C-qFHA4zerxBcNxy4s4y_O1JLLv7SdC2oL4kc11GW4QQf2ajc4eId-aBC5hyphenhyphenLH-LbbpJgebH_yXxv6Zbs0mbe0RzE6XLeHPLVqJzp6zgZVg/s1600/image00.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="223" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDj9z1Q1y7NGvpYPI_5EUcmCJG4-Veqvx_C-qFHA4zerxBcNxy4s4y_O1JLLv7SdC2oL4kc11GW4QQf2ajc4eId-aBC5hyphenhyphenLH-LbbpJgebH_yXxv6Zbs0mbe0RzE6XLeHPLVqJzp6zgZVg/s400/image00.png" width="400" /></a><br />
<br />
</li>
<li><b>Advantages and disadvantages of caching backends</b><br />
<br />
<table cellpadding="0" cellspacing="0" style="border-collapse: collapse;"><tbody>
<tr> <td style="background-color: #9bbde0; border: 1px solid black;"></td> <td style="background-color: #9bbde0; border: 1px solid black;">Advantages</td> <td style="background-color: #9bbde0; border: 1px solid black;">Disadvantages</td> </tr>
<tr> <td style="background-color: #9bbde0; border: 1px solid black;">Memcached</td> <td style="border: 1px solid black;"><br />
- the fastest, most efficient type of cache available to Django<br />
- all cached data is stored directly in memory, so there’s no overhead of database or filesystem usage<br />
- cached data can be shared over multiple machines, so it’s excellent for scaling<br />
- being used by Facebook, Wikipedia,...<br />
<br />
</td> <td style="border: 1px solid black; vertical-align: top;"><br />
- cached data is stored in memory, so it will be lost if server crashes (but it’s not critical because cached data is just temporary)<br />
- need to have memcached daemon along the way</td> </tr>
<tr> <td style="background-color: #9bbde0; border: 1px solid black;">In-database cached</td> <td style="border: 1px solid black;"><br />
- cached data is persistent<br />
- could use multiple databases for caching<br />
<br />
</td> <td style="border: 1px solid black; vertical-align: top;"><br />
- setup & manage multiple caching databases would be tough</td> </tr>
<tr> <td style="background-color: #9bbde0; border: 1px solid black;">Filesystem cached</td> <td style="border: 1px solid black;"><br />
- cached data is persistent<br />
- simple to setup<br />
<br />
</td> <td style="border: 1px solid black; vertical-align: top;"><br />
- may not scale well</td></tr>
<tr> <td style="background-color: #9bbde0; border: 1px solid black;">Local-memory cached</td> <td style="border: 1px solid black;"><br />
- simple<br />
- not nescessary to have runing an external cache server as memcached</td> <td style="border: 1px solid black; vertical-align: top;"><br />
- no cross-process caching means it’s not particularly memory-efficient<br />
- probably not a good choice for production, just nice for development<br />
<br />
</td></tr>
</tbody></table><br />
</li>
<li><b>Reference</b><br />
<a href="http://docs.djangoproject.com/en/1.2/topics/cache/">http://docs.djangoproject.com/en/1.2/topics/cache/</a> </li>
</ol><div><span style="background-color: white; color: #b45f06; font-family: 'Courier New'; font-size: 12pt; font-style: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"> </span></div>Hoang Tranhttp://www.blogger.com/profile/08678314335089274137noreply@blogger.com1tag:blogger.com,1999:blog-5233946537982084404.post-13196714051302717792010-10-25T03:15:00.000-07:002011-03-12T22:26:30.276-08:00Quảng cáo trên Google<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4Uhpe6MbcikA29cSd3IIYw8JMYSwpilEqJHHPgk9xlr8T1K_ApvCx3JKyhv37eNAE3QoJvkl7v4RtbgjPCy5LJk6obas93UM-Z0ifGhrt945JwY0FnPsMYvgZCgCsuWGCgSepgoFNhSQ/s1600/seo.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4Uhpe6MbcikA29cSd3IIYw8JMYSwpilEqJHHPgk9xlr8T1K_ApvCx3JKyhv37eNAE3QoJvkl7v4RtbgjPCy5LJk6obas93UM-Z0ifGhrt945JwY0FnPsMYvgZCgCsuWGCgSepgoFNhSQ/s1600/seo.jpg" /></a></div><div style="border-collapse: collapse; font-family: arial, sans-serif; font-size: 13px; text-align: center;"><br />
</div><div style="border-collapse: collapse; font-family: arial, sans-serif; font-size: 13px;"><br />
</div><div style="border-collapse: collapse; font-family: arial, sans-serif; font-size: 13px;">Google cung cấp dịch vụ quảng cáo thông qua bộ máy tìm kiếm. </div><div style="border-collapse: collapse; font-family: arial, sans-serif; font-size: 13px;"><br />
</div><div style="border-collapse: collapse; font-family: arial, sans-serif; font-size: 13px;">Có 2 nguồn thông tin mà bộ máy tìm kiếm của Google sẽ tìm khi người dùng gõ một từ khóa: </div><div style="border-collapse: collapse; font-family: arial, sans-serif; font-size: 13px;"> - thông tin của Google (do Google tự tạo ra)</div><div style="border-collapse: collapse; font-family: arial, sans-serif; font-size: 13px;"> - thông tin có sẵn trên internet (do người khác tạo ra, như các trang web...) </div><div style="border-collapse: collapse; font-family: arial, sans-serif; font-size: 13px;"><br />
</div><div style="border-collapse: collapse; font-family: arial, sans-serif; font-size: 13px;">Kết quả tìm kiếm cũng dc hiển thị theo 2 dạng dựa vào 2 nguồn thông tin trên.</div><div style="border-collapse: collapse; font-family: arial, sans-serif; font-size: 13px;"><br />
</div><div style="border-collapse: collapse; font-family: arial, sans-serif; font-size: 13px;">Do đó, chiến lược quảng cáo trên Google cũng gồm 2 hướng:</div><div style="border-collapse: collapse; font-family: arial, sans-serif; font-size: 13px;"><br />
</div><div style="border-collapse: collapse; font-family: arial, sans-serif; font-size: 13px;"> 1. Thuê Google trực tiếp đăng quảng cáo của bạn. Google sẽ đưa thông tin của bạn vào nguồn "thông tin của Google", cái này gọi là dịch vụ Google AdWords, muốn xài cái này cần phải trả tiền, trả càng nhiều tiền thì thông tin của bạn càng dc quảng bá nhiều (tần xuất xuất hiện trên kết quả tìm kiếm trong ngày, vị trí xuất hiện,...). Cái này đòi hỏi người dùng phải có khả năng thanh toán online (Paypal, VISA card, ...) để trả tiền đăng quảng cáo cho Google. </div><div style="border-collapse: collapse; font-family: arial, sans-serif; font-size: 13px;"> Có 2 khoản cần thanh toán cho Google: </div><div style="border-collapse: collapse; font-family: arial, sans-serif; font-size: 13px;"> - Chi phí quảng cáo hằng ngày (trung bình khoảng 10$ mỗi ngày)</div><div style="border-collapse: collapse; font-family: arial, sans-serif; font-size: 13px;"> - Chi phí trả cho mỗi lần có ai đó click chuột vào quảng cáo (0.001$ ???)</div><div style="border-collapse: collapse; font-family: arial, sans-serif; font-size: 13px;"><br />
</div><div style="border-collapse: collapse; font-family: arial, sans-serif; font-size: 13px;"> Tham khảo:</div><span class="Apple-style-span" style="border-collapse: collapse; font-family: arial, sans-serif; font-size: 13px;"> </span><span class="Apple-style-span" style="border-collapse: collapse; font-family: arial, sans-serif; font-size: 13px;"><a href="http://www.youtube.com/watch?v=tx2L6EGa9DY&feature=related" style="color: #0065cc;" target="_blank">http://www.youtube.com/<wbr></wbr>watch?v=tx2L6EGa9DY&feature=<wbr></wbr>related</a></span><div style="border-collapse: collapse; font-family: arial, sans-serif; font-size: 13px;"><br />
</div><div style="border-collapse: collapse; font-family: arial, sans-serif; font-size: 13px;"> 2. Điều chỉnh thông tin của bạn (trang web) để Google dễ dàng tìm thấy (Google càng dễ tìm thấy thì trang web xuất hiện càng sớm trong kết quả tìm kiếm). Hướng này gọi là SEO (Search Engine Optimization). Hướng này đòi hỏi những điều chỉnh về mặt kĩ thuật đối với trang web của bạn sao cho thân thiện với bộ máy tìm kiếm như tối ưu hóa mã nguồn trang web, tạo nhiều liên kết từ bên ngoài tới trang web của bạn...</div><div style="border-collapse: collapse; font-family: arial, sans-serif; font-size: 13px;"><br />
</div><div><br />
</div>Hoang Tranhttp://www.blogger.com/profile/08678314335089274137noreply@blogger.com0tag:blogger.com,1999:blog-5233946537982084404.post-19535064230160461022010-09-27T02:22:00.000-07:002010-09-27T02:22:47.359-07:00Ruby code snippets<span class="Apple-style-span" style="color: blue;">1. using 'any?' to check if something in a array/hash</span><br />
<pre style="background: #000000; color: #d1d1d1; padding: 10px;"><span style="color: #9999a9;"># a = User.all</span>
a<span style="color: #d2cd86;">.</span>any? <span style="color: #b060b0;">{</span>|user| user<span style="color: #d2cd86;">.</span>name <span style="color: #d2cd86;">=</span><span style="color: #d2cd86;">=</span> <span style="color: #00c4c4;">"Hoang"</span><span style="color: #b060b0;">}</span>
</pre>Hoang Tranhttp://www.blogger.com/profile/08678314335089274137noreply@blogger.com0tag:blogger.com,1999:blog-5233946537982084404.post-27402033993413970422010-09-23T23:55:00.000-07:002011-03-12T22:27:06.806-08:00Some ways to refactoring Rails' codeOn the following, I list some ways I found to refactoring my Rails' code. This list would be added more as time's going.<br />
<br />
<b><span class="Apple-style-span" style="color: blue;">1. Method delegation</span></b><br />
Assume you have two models:<br />
<i> + User(id, name)</i><br />
<i> + Account(id, number, user_id)</i><br />
It could be described in Rails as:<br />
<br />
<div style="background-color: #222222; border: 1px dotted; color: #eeeeee; padding: 10px;"> class User < ActiveRecord::Base<br />
has_many :accounts<br />
end<br />
class Account < ActiveRecord::Base<br />
belongs_to :user<br />
end </div><br />
Then if I have an Account instance named <i><span class="Apple-style-span" style="color: purple;">account</span></i>, I could get it's user's name by: <i><span class="Apple-style-span" style="background-color: white;"><span class="Apple-style-span" style="color: purple;">account.user.name</span></span></i> or I can define an instance method in Account as follow:<br />
<br />
<div style="background-color: #222222; border: 1px dotted; color: #eeeeee; padding: 10px;"><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"> class Account < ActiveRecord::Base</div><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"> belongs_to :user</div><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"> </div><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"> def user_name</div><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"> user.name</div><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"> end</div><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"> end </div></div><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"> Then you can get account's user name by: <i><span class="Apple-style-span" style="color: purple;">account.user_name</span></i>. We can make the above code shorter by using delegation:</div><div><br />
<div style="background-color: #222222; border: 1px dotted; color: #eeeeee; padding: 10px;"><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"> class Account < ActiveRecord::Base</div><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"> belongs_to :user</div><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"> delegate :name, :to => :user, :prefix => true ## this will generate user_name methods </div><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"> end </div></div><br />
<b><span class="Apple-style-span" style="color: blue;">2. Use define_method to dynamically generate similar methods</span></b><br />
Given a model User(id, name, role) where role could be "admin", "moderator", "senior", "junior",... You can write instance methods to see whether a user is "admin", "moderator", ... as follow:<br />
<br />
<div id="way-2-left" style="background-color: #222222; border: 1px dotted; color: #eeeeee; float: left; padding: 10px; width: 35%;"><span class="Apple-style-span" style="background-color: white;"><span class="Apple-style-span" style="color: lime;">Before</span></span><br />
class User < ActiveRecord::Base<br />
ROLES = {<br />
:admin => "admin", <br />
:moderator => "moderator",<br />
:senior => "senior",<br />
:junior => "junior"}<br />
<br />
def admin?<br />
role == ROLES[:admin]<br />
end<br />
<br />
def moderator?<br />
<div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"> role == ROLES[:moderator]</div><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"> end</div><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"><br />
</div><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"> def senior?</div><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"> role == ROLES[:senior]</div><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"> end</div><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"> </div><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"> def junior?</div><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"> role == ROLES[:junior]</div><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"> end </div>end</div></div><div id="way-2-right" style="background-color: #222222; border: 1px dotted; color: #eeeeee; float: left; margin-left: 30px; padding: 10px; width: 50%;"><span class="Apple-style-span" style="color: lime;"><span class="Apple-style-span" style="background-color: white;">After</span></span><br />
class User < ActiveRecord::Base<br />
ROLES = {<br />
<div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"> :admin => "admin", </div><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"> :moderator => "moderator", </div><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"> :senior => "senior", </div><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"> :junior => "junior"} </div><div><br />
</div><div> ROLES.each_pair do |key, val| </div><div> define_method(key.to_s + "?") { role == val}</div><div> end</div>end</div>Hoang Tranhttp://www.blogger.com/profile/08678314335089274137noreply@blogger.com0tag:blogger.com,1999:blog-5233946537982084404.post-56815173566815741322010-05-28T03:01:00.000-07:002010-05-31T00:52:41.401-07:00Ruby's origins - a find<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgXZjrSWlMMT4kRi8FIdouVmURwIvUkypiJ1Mkq5QtMcTYdVQUyat8dP9SD6AH07rieHj4I1Q4pOJIGSZfWOD7K2UsEaF6HBeyjr-Nhm6m2G09YO76BquaVBs87xy2YcgymhWZSrRqnbKw/s1600/ruby.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgXZjrSWlMMT4kRi8FIdouVmURwIvUkypiJ1Mkq5QtMcTYdVQUyat8dP9SD6AH07rieHj4I1Q4pOJIGSZfWOD7K2UsEaF6HBeyjr-Nhm6m2G09YO76BquaVBs87xy2YcgymhWZSrRqnbKw/s200/ruby.jpg" width="200" /></a></div><br />
<br />
Ruby is a pure Object-Oriented programming language. Everything in Ruby is objects, even classes. Amazing? Let's see why:<br />
<br />
<div style="background-color: #222222; border: 1px dotted; color: #eeeeee; padding: 10px;">irb> 'hello'.class <br />
=> String<br />
irb> String.class <br />
=> Class<br />
irb> Array.class<br />
=> Class<br />
irb> Class.class <br />
=> Class</div><br />
See even further:<br />
<br />
<div style="background-color: #222222; border: 1px dotted; color: #eeeeee; padding: 10px;">irb> Class.superclass <br />
=> Module<br />
irb> Module.superclass <br />
=> Object<br />
irb> Object.superclass <br />
=> nil</div><br />
<div style="background-color: #222222; border: 1px dotted; color: #eeeeee; padding: 10px;">irb> Module.class <br />
=> Class<br />
irb> Object.class <br />
=> Class</div><br />
So all classes are objects of class "Class". String, Array,.. are instances of class "Class".<br />
<span class="Apple-style-span" style="color: red;">Module </span>and <span class="Apple-style-span" style="color: red;">Object </span>are super classes of "Class" but also instances of "Class"!!!Hoang Tranhttp://www.blogger.com/profile/08678314335089274137noreply@blogger.com0tag:blogger.com,1999:blog-5233946537982084404.post-75263734081710051962010-05-25T04:36:00.000-07:002010-05-25T20:17:31.977-07:00Install adva-cms on Windows<a href="http://adva-cms.org/">Adva-cms</a> is an open source CMS (Content Management System) platform based on Ruby on Rails. Installing adva on Windows could be a bit tough. Follow is the steps I've tried to get passed:<br />
<br />
1. Make sure you already installed <a href="http://www.interaktonline.com/Documentation/KTML/031350_installimgk.htm">ImageMagick</a> and some gems adva requires<br />
<br />
2. Just follow <a href="http://github.com/svenfuchs/adva_cms">adva's installation guide</a>:<br />
<br />
<div style="background-color: #222222; border: 1px dotted; color: #eeeeee; padding: 10px;"># Create your app<br />
rails my-app<br />
cd my-app<br />
rm public/index.html<br />
<br />
# Prepare the config/environment.rb and remove the public/index.html<br />
# in config/environment.rb make sure you have:<br />
require File.join(File.dirname(__FILE__), 'boot')<br />
require File.join(File.dirname(__FILE__), '../vendor/adva/engines/adva_cms/boot') # this line<br />
<br />
# You *must* use Rails' old routing recognition/generation mode in order for adva-cms to work correctly:<br />
# in config/initializers/new_rails_defaults.rb set:<br />
ActionController::Routing.generate_best_match = true<br />
<br />
# Clone the adva-cms ( this might take a bit, grab a coffee meanwhile :) )<br />
git clone git://github.com/svenfuchs/adva_cms.git vendor/adva # or use: git submodule add ...<br />
<br />
# Install the core engines and copy the assets<br />
rake adva:install:core -R vendor/adva/engines/adva_cms/lib/tasks # install adva-cms to vendor/plugins/<br />
rake adva:assets:install # symlinks plugin assets to public/</div><br />
...and get this error<br />
<br />
<div style="background-color: #222222; border: 1px dotted; color: #eeeeee; padding: 10px;">$ rake adva:install:core -R vendor/adva/engines/adva_cms/lib/tasks<br />
(in d:/Document/Projects/AdvaCMS/adva3)<br />
installing engines: adva_activity, adva_blog, adva_cms, adva_comments, adva_rbac, adva_user<br />
rake aborted!<br />
unknown file type: ../adva/engines/adva_activity<br />
<br />
(See full trace by running task with --trace)</div><br />
Let's trace to see why it failed:<br />
<br />
<div style="background-color: #222222; border: 1px dotted; color: #eeeeee; padding: 10px;">$ rake adva:install:core -R vendor/adva/engines/adva_cms/lib/tasks --trace<br />
(in d:/Document/Projects/AdvaCMS/adva3)<br />
** Invoke adva:install:core (first_time)<br />
** Execute adva:install:core<br />
** Invoke adva:install (first_time)<br />
** Execute adva:install<br />
installing engines: adva_activity, adva_blog, adva_cms, adva_comments, adva_rbac, adva_user<br />
rake aborted!<br />
unknown file type: ../adva/engines/adva_activity<br />
c:/Ruby/lib/ruby/1.8/fileutils.rb:1256:in `copy'<br />
c:/Ruby/lib/ruby/1.8/fileutils.rb:451:in `copy_entry'<br />
c:/Ruby/lib/ruby/1.8/fileutils.rb:1325:in `traverse'<br />
c:/Ruby/lib/ruby/1.8/fileutils.rb:448:in `copy_entry'<br />
c:/Ruby/lib/ruby/1.8/fileutils.rb:423:in `cp_r'<br />
c:/Ruby/lib/ruby/1.8/fileutils.rb:1396:in `fu_each_src_dest'<br />
c:/Ruby/lib/ruby/1.8/fileutils.rb:1405:in `fu_each_src_dest0'<br />
c:/Ruby/lib/ruby/1.8/fileutils.rb:1403:in `each'<br />
c:/Ruby/lib/ruby/1.8/fileutils.rb:1403:in `fu_each_src_dest0'<br />
c:/Ruby/lib/ruby/1.8/fileutils.rb:1394:in `fu_each_src_dest'<br />
c:/Ruby/lib/ruby/1.8/fileutils.rb:422:in `cp_r'<br />
d:/Document/Projects/AdvaCMS/adva3/vendor/adva/engines/adva_cms/lib/tasks/adva_cms.rake:139:in install'<br />
d:/Document/Projects/AdvaCMS/adva3/vendor/adva/engines/adva_cms/lib/tasks/adva_cms.rake:126:in `send'<br />
d:/Document/Projects/AdvaCMS/adva3/vendor/adva/engines/adva_cms/lib/tasks/adva_cms.rake:126:in `perform'<br />
d:/Document/Projects/AdvaCMS/adva3/vendor/adva/engines/adva_cms/lib/tasks/adva_cms.rake:119:in `each'<br />
d:/Document/Projects/AdvaCMS/adva3/vendor/adva/engines/adva_cms/lib/tasks/adva_cms.rake:119:in `perform'<br />
d:/Document/Projects/AdvaCMS/adva3/vendor/adva/engines/adva_cms/lib/tasks/adva_cms.rake:35</div><br />
...so there're something wrong in <i><span class="Apple-style-span" style="color: red;">adva_cms.rake</span></i> file. It took me a while to understand how this file does things and found the lines that caused bugs:<br />
<br />
<div style="background-color: #222222; border: 1px dotted; color: #eeeeee; padding: 10px;">def source(type, subdir = nil)<br />
"../adva/#{type}" + (subdir ? "/#{subdir}" : '')<br />
end</div><br />
...so maybe this relative path causes confusing. Let's make it full:<br />
<br />
<div style="background-color: #222222; border: 1px dotted; color: #eeeeee; padding: 10px;">def source(type, subdir = nil)<br />
"#{Rails.root}/vendor/adva/#{type}" + (subdir ? "/#{subdir}" : '')<br />
end</div><br />
<div style="background-color: #222222; border: 1px dotted; color: #eeeeee; padding: 10px;">$ rake adva:install:core -R vendor/adva/engines/adva_cms/lib/tasks<br />
(in d:/Document/Projects/AdvaCMS/adva3)<br />
installing engines: adva_activity, adva_blog, adva_cms, adva_comments, adva_rbac<br />
, adva_user<br />
installing plugins: adva_cells<br />
c:/Ruby/bin/rake: No such file or directory - which convert<br />
rake aborted!<br />
private method `chomp' called for nil:NilClass</div><br />
now the engines installed ok, but there's still errors in installing plugins. It caused by paperclip initialization code that uses 'which' command to find path to 'convert' which is a tool provided by paperclip gem but 'which' command does not exist on Windows<br />
<br />
<div style="background-color: #222222; border: 1px dotted; color: #eeeeee; padding: 10px;">d:/Document/Projects/AdvaCMS/adva3/vendor/plugins/adva_cms/config/initializers/p<br />
aperclip.rb:1</div><br />
<div style="background-color: #222222; border: 1px dotted; color: #eeeeee; padding: 10px;">Paperclip.options[:command_path] = %x[which convert].chomp.gsub(/convert/, '')</div><br />
...so just go to <i><span class="Apple-style-span" style="color: red;">../vendor/adva/engines/adva_cms/config/initializers/paperclip.rb</span></i> and remove 'which'<br />
<br />
<div style="background-color: #222222; border: 1px dotted; color: #eeeeee; padding: 10px;">Paperclip.options[:command_path] = %x[convert].chomp.gsub(/convert/, '')</div><br />
then adva's core installation gets passed!<br />
<br />
<div style="background-color: #222222; border: 1px dotted; color: #eeeeee; padding: 10px;">$ rake adva:install:core -R vendor/adva/engines/adva_cms/lib/tasks<br />
(in d:/Document/Projects/AdvaCMS/adva3)<br />
installing engines: adva_activity, adva_blog, adva_cms, adva_comments, adva_rbac<br />
, adva_user<br />
installing plugins: adva_cells<br />
copied 33 migrations to db/migrate<br />
copied 33 migrations to db/migrate/app<br />
copied 33 migrations to db/migrate<br />
== CreateActivitiesTable: migrating ==========================================<br />
-- create_table(:activities, {:force=>true})<br />
-> 0.0050s<br />
== CreateActivitiesTable: migrated (0.0060s) =================================<br />
...</div><br />
3. Next, install adva's assets and run it up <br />
<br />
<div style="background-color: #222222; border: 1px dotted; color: #eeeeee; padding: 10px;">$ rake adva:assets:install -R vendor/adva/engines/adva_cms/lib/tasks<br />
$ script/server</div><br />
...and this is what I've got<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg0EYIi3_Fewb9NVRO7r3L_00z0qEHIBdKMlsiiv7Z-LZO9qZxBS4Z8MnyTjceHrYuIGT9l_AUWNgYOV7I7UvYQZiFM-MlIQKvmUBDDjFYYUk-PwOfLgFLtmBY_ENC6oyqJUFwM0_8l2zQ/s1600/adva_installation.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg0EYIi3_Fewb9NVRO7r3L_00z0qEHIBdKMlsiiv7Z-LZO9qZxBS4Z8MnyTjceHrYuIGT9l_AUWNgYOV7I7UvYQZiFM-MlIQKvmUBDDjFYYUk-PwOfLgFLtmBY_ENC6oyqJUFwM0_8l2zQ/s400/adva_installation.jpg" width="352" /></a></div><div class="separator" style="clear: both; text-align: center;"><br />
</div>Hoang Tranhttp://www.blogger.com/profile/08678314335089274137noreply@blogger.com0tag:blogger.com,1999:blog-5233946537982084404.post-60460293837760593592010-05-17T03:51:00.000-07:002011-03-12T22:27:50.526-08:00An issue with Rspec on Windows<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgz_IKXGPalGCaGrgOO3BNPJfz7XQH7XJJbc7svY7ummS8TpfzpT3H3__14B_WP3thlsQkTT2WEMc64RCsSJpwmFw1pT9twzVln-XocU9BfQUssUVJSQF0h5fGr0lIf0Ok2VdtFo6-dZCk/s1600/rspec-user-stories.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="196" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgz_IKXGPalGCaGrgOO3BNPJfz7XQH7XJJbc7svY7ummS8TpfzpT3H3__14B_WP3thlsQkTT2WEMc64RCsSJpwmFw1pT9twzVln-XocU9BfQUssUVJSQF0h5fGr0lIf0Ok2VdtFo6-dZCk/s320/rspec-user-stories.png" width="320" /></a></div><div style="text-align: center;"><br />
</div><br />
<div style="float: left;">Rspec is a very popular test framework used to test Rails application. I have tried to install and use it for my Rails projects on Windows. It raised a bug when I ran tests:<br />
<blockquote style="background-color: #222222; color: #eeeeee;"><span class="Apple-style-span">c:/Ruby/lib/ruby/gems/1.8/gems/activesupport-2.3.5/lib/active_support/dependencies.rb:440:in load_missing_constant': uninitialized constant RbReadline::Encoding (NameError)</span></blockquote><blockquote style="background-color: #222222; color: #eeeeee;"><span class="Apple-style-span">from c:/Ruby/lib/ruby/site_ruby/1.8/rbreadline.rb:4404 </span></blockquote>I traced back and found these causing lines:<br />
<blockquote style="background-color: #222222; color: #eeeeee;"> <span class="Apple-style-span"> if defined? ''.getbyte</span><br />
<span class="Apple-style-span"> @encoding = "X" # ruby 1.9.x or greater</span><br />
<span class="Apple-style-span"> @encoding_name = Encoding.default_external.to_s</span><br />
<span class="Apple-style-span"> end</span></blockquote>It seems the Rspec uses Ruby Readline library for its command-line interface. It defined <i>getbyte </i>that uses Encoding module which hasn't been defined in this Ruby package on Windows. I then commented out the line using Encoding module and the bug get fixed...<br />
<blockquote style="background-color: #222222; color: #eeeeee;"> <span class="Apple-style-span">if defined? ''.getbyte</span><br />
<span class="Apple-style-span"> @encoding = "X" # ruby 1.9.x or greater</span><br />
<span class="Apple-style-span"> # @encoding_name = Encoding.default_external.to_s</span><br />
<span class="Apple-style-span"> end</span></blockquote>It's not common to pass over the issue by this way but hopefully it still works fine in my case.</div>Hoang Tranhttp://www.blogger.com/profile/08678314335089274137noreply@blogger.com1tag:blogger.com,1999:blog-5233946537982084404.post-69917221184076545622010-04-26T18:27:00.000-07:002010-05-26T01:46:17.092-07:00Hello Ruby & Rails<div class="separator" style="clear: both; text-align: center;"></div><br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgRgWsywIIs5SuwSirbE8iV-89TFSHLX2ZOiNxXvfNABENrSbvfRM7F-gvw69KHemM8oyyw4QViEMGf_owii6IPL5X2cEqsmDTQGDRlKIlfRQqGXCN_uXMe_3QDxAtpbZ6Gb5znWqvIpd8/s1600/ror.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgRgWsywIIs5SuwSirbE8iV-89TFSHLX2ZOiNxXvfNABENrSbvfRM7F-gvw69KHemM8oyyw4QViEMGf_owii6IPL5X2cEqsmDTQGDRlKIlfRQqGXCN_uXMe_3QDxAtpbZ6Gb5znWqvIpd8/s200/ror.jpg" width="200" /></a></div><br />
<div float: left;"><br />
Ruby is a programming language and Rails (Ruby on Rails) is a web development framework written by Ruby. Those are attracting a lot of fans. Common philosophy that both Ruby and Rails based on is the simplicity, light-weight and beautifulness. You can find how easy it is to programming Ruby like talking. Also, bearing in mind with DRY (Don't Repeat Yourself) or CoC (Convention over Configuration) principles, Rails has made web developing simple and with least efforts.<br />
<br />
Keeping track changes and sharing what I've learned from Ruby and Rails are the most important things I target to from this beginning.<br />
<br />
So, let's say "hello Ruby & Rails"!<br />
</div>Hoang Tranhttp://www.blogger.com/profile/08678314335089274137noreply@blogger.com0tag:blogger.com,1999:blog-5233946537982084404.post-54202574032848229102009-02-08T22:17:00.000-08:002009-12-14T01:42:54.380-08:00A quick setup for development environment of Rails on Windows1. Install Ruby<br /> Use One Click Installer for Ruby<br /><br />2. Update Gem<br /> > gem update --system<br /><br />3. Install Rails<br /> > gem install rails<br /><br />4. Install Sqlite3 & Sqlite3 driver for Rails<br /><span> </span>- download sqlite and extract to get 3 files: sqlite3.exe, sqlite3.dll, sqlite3.def<br /><span> </span>- copy 3 above files to ruby/bin<br /><span> </span>- $ gem install sqlite3-ruby<br /><span> </span><span> </span><span> </span>-> If errors, try another version of sqlite driver, ex:<br /><span> </span><span> </span><span> </span>$ gem install --version 1.2.3 sqlite3-rubyHoang Tranhttp://www.blogger.com/profile/08678314335089274137noreply@blogger.com0tag:blogger.com,1999:blog-5233946537982084404.post-76194953969266943602008-07-08T01:29:00.000-07:002008-07-08T01:30:17.885-07:00hello worldHi everybody!!!Hoang Tranhttp://www.blogger.com/profile/08678314335089274137noreply@blogger.com0