tag:blogger.com,1999:blog-62337873947943761692024-03-14T04:51:21.301+09:00on the edge of Complexityon the edge of Complexityhttp://www.blogger.com/profile/11692594157379801516noreply@blogger.comBlogger81125tag:blogger.com,1999:blog-6233787394794376169.post-24752937887653216182011-06-28T05:32:00.003+09:002011-06-28T05:41:39.889+09:00Coffescript iteration caveat<div>In Cofffeescript, there are 2 built-in sytanxes for interation. for .. of .. / for .. in .. (by ..)</div><div><br /></div><div>In Pragmatic Coffeescript book, the author says,</div><div><br /></div><div>" Why have a seperate syntax? Why not just use for key, value of array?<span class="Apple-style-span" style="font-size: 15.8333px; ">Because there're nothing stopping an array from having extra methods or </span><span class="Apple-style-span" style="font-size: 15.8333px; ">data. If you want the whole shebang, then sure, use of. </span><span class="Apple-style-span" style="font-size: 15.8333px; ">But if you just want to treat the array as an array, use in -- you will only</span><span class="Apple-style-span" style="font-size: 15.8333px; ">get array[0], array[1], etc., up to array[array.length-1], in that order"</span></div><div><br /></div><div><br /></div><br /><br /><div><script src="https://gist.github.com/1049769.js?file=gistfile1.txt"></script></div>on the edge of Complexityhttp://www.blogger.com/profile/11692594157379801516noreply@blogger.comtag:blogger.com,1999:blog-6233787394794376169.post-63495807267162591292011-01-11T08:57:00.007+09:002011-01-11T09:33:40.006+09:00how to get OAuth Consumer Key / Secret for Google OAuthI spent a hour to understand how to generate OAuth comsumer key for Google OAuth.<br />Here is the easiest way to do it.<br /><br /><div>step 0> visit <a href="https://www.google.com/accounts/ManageDomains">Manage Domains Tool</a><br /><br /></div><div>step 1> Insert meta tag in your html and upload it server that is running.<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_HbRZwpPnFNs/TSueaamSGPI/AAAAAAAAAZc/C02l_708N0o/s1600/Webmaster%2BCentral%2B-%2BVerify%2Bownership.jpg"><img style="cursor:pointer; cursor:hand;width: 400px; height: 222px;" src="http://1.bp.blogspot.com/_HbRZwpPnFNs/TSueaamSGPI/AAAAAAAAAZc/C02l_708N0o/s400/Webmaster%2BCentral%2B-%2BVerify%2Bownership.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5560712341572688114" /></a><br /><br />step 2> after uploading the page, click verify. And then you'll see a page like this in you google master.<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_HbRZwpPnFNs/TSuez_laYuI/AAAAAAAAAZk/P31yq1BP86M/s1600/2.jpg"><img style="cursor:pointer; cursor:hand;width: 400px; height: 129px;" src="http://3.bp.blogspot.com/_HbRZwpPnFNs/TSuez_laYuI/AAAAAAAAAZk/P31yq1BP86M/s400/2.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5560712780997878498" /></a><br /><br />step 3> Generating keys using OpenSSL. I assume you're using OS X. Do this in your terminal<br /><br /><script src="https://gist.github.com/773749.js?file=Generate%20the%20RSA%20keys%20and%20certificate"></script><br /><br />step4> Upload myrsacert.pem<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_HbRZwpPnFNs/TSufvI4TfSI/AAAAAAAAAZs/DSqMmw_Hd1M/s1600/3.jpg"><img style="cursor:pointer; cursor:hand;width: 400px; height: 265px;" src="http://1.bp.blogspot.com/_HbRZwpPnFNs/TSufvI4TfSI/AAAAAAAAAZs/DSqMmw_Hd1M/s400/3.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5560713797105319202" /></a></div>on the edge of Complexityhttp://www.blogger.com/profile/11692594157379801516noreply@blogger.comtag:blogger.com,1999:blog-6233787394794376169.post-88576054170655054002010-11-11T00:45:00.001+09:002010-11-11T00:45:19.897+09:00Resources for learning node.js<div class='posterous_autopost'><p><span style="font-family: arial; font-size: small;"> <div><span style="font-family: dotum, arial, sans-serif; line-height: 19px;"><strong><span style="font-size: large;">Resources for learning node.js</span></strong></span></div> <p /> <p /> <p /> <p /> <div><span style="font-family: dotum, arial, sans-serif; line-height: 19px;"><strong>Tutorials - Article</strong></span></div> <p /> <div><span style="font-family: dotum, arial, sans-serif;"><span style="line-height: 19px;"><span style="font-family: arial; line-height: normal;"><a href="http://howtonode.org/">http://howtonode.org/</a> </span></span></span><span style="font-family: dotum, arial, sans-serif;"><span style="line-height: 19px;"><span style="font-family: arial; line-height: normal;"><span style="font-family: dotum, arial, sans-serif; line-height: 19px;"> ★</span><span style="font-family: dotum, arial, sans-serif; line-height: 19px;"> ★</span><span style="font-family: dotum, arial, sans-serif; line-height: 19px;"> ★</span><span style="font-family: dotum, arial, sans-serif; line-height: 19px;"> ★</span><span style="font-family: dotum, arial, sans-serif; line-height: 19px;"> </span></span></span></span><span style="font-family: dotum, arial, sans-serif; line-height: 19px;">★</span><span style="font-family: dotum, arial, sans-serif; line-height: 19px;"> </span></div> <p /> <div><span style="font-family: dotum, arial, sans-serif;"><span style="line-height: 19px;"><span style="font-family: arial; line-height: normal;"><a href="http://visionmedia.github.com/masteringnode/">http://visionmedia.github.com/masteringnode/</a> </span></span></span><span style="font-family: dotum, arial, sans-serif;"><span style="line-height: 19px;"><span style="font-family: arial; line-height: normal;"><span style="font-family: dotum, arial, sans-serif; line-height: 19px;"> ★</span><span style="font-family: dotum, arial, sans-serif; line-height: 19px;"> ★</span><span style="font-family: dotum, arial, sans-serif; line-height: 19px;"> ★</span><span style="font-family: dotum, arial, sans-serif; line-height: 19px;"> </span></span></span></span></div> <p /> <p /> <p /> <p /> <div><span style="font-family: dotum, arial, sans-serif;"><span style="line-height: 19px;"><strong>Tutorials - Videos</strong></span></span></div> <p /> <div><a href="http://vimeo.com/pedroteixeira/videos">http://vimeo.com/pedroteixeira/videos</a> <span style="font-family: dotum, arial, sans-serif;"><span style="line-height: 19px;"><span style="font-family: arial; line-height: normal;"><span style="font-family: dotum, arial, sans-serif; line-height: 19px;"> ★</span><span style="font-family: dotum, arial, sans-serif; line-height: 19px;"> ★</span><span style="font-family: dotum, arial, sans-serif; line-height: 19px;"> ★</span><span style="font-family: dotum, arial, sans-serif; line-height: 19px;"> ★</span><span style="font-family: dotum, arial, sans-serif; line-height: 19px;"> </span></span></span></span><span style="font-family: dotum, arial, sans-serif; line-height: 19px;">★</span><span style="font-family: dotum, arial, sans-serif; line-height: 19px;"> </span></div> <p /> <div><a href="http://screenr.com/user/tjholowaychuk">http://screenr.com/user/tjholowaychuk</a> <span style="font-family: dotum, arial, sans-serif;"><span style="line-height: 19px;"><span style="font-family: arial; line-height: normal;"><span style="font-family: dotum, arial, sans-serif; line-height: 19px;"> ★</span><span style="font-family: dotum, arial, sans-serif; line-height: 19px;"> ★</span><span style="font-family: dotum, arial, sans-serif; line-height: 19px;"> </span></span></span></span></div> </span></p> <p style="font-size: 10px;"> <a href="http://posterous.com">Posted via email</a> from <a href="http://jaigouk.com/resources-for-learning-nodejs">on the Edge of Complexity</a> </p> </div>on the edge of Complexityhttp://www.blogger.com/profile/11692594157379801516noreply@blogger.comtag:blogger.com,1999:blog-6233787394794376169.post-15777701546537533712010-11-05T22:09:00.001+09:002010-11-05T22:09:25.461+09:00serving a mp4 via node.js<div class='posterous_autopost'><p>I'm practicing node.js. It's like early days of Rails. One thing that stops me to jump in this bandwagon is that my lack of knowledge of javascript. Anyway, after mastering node.js world technique, I want to go use event techniques in ruby in the future. I'm sure that ruby's virtual machine will evolve. </p> <p style="font-size: 10px;"> <a href="http://posterous.com">Posted via email</a> from <a href="http://jaigouk.com/serving-a-mp4-via-nodejs">on the Edge of Complexity</a> </p> </div>on the edge of Complexityhttp://www.blogger.com/profile/11692594157379801516noreply@blogger.comtag:blogger.com,1999:blog-6233787394794376169.post-2353948494319314282010-09-27T12:32:00.001+09:002010-09-27T12:32:22.725+09:00Untitled<div class='posterous_autopost'><p>Step1></p> <script src="http://gist.github.com/598558.js?file=STEP1%3E%20Install"></script> <p>Step2></p> <script src="http://gist.github.com/598558.js?file=STEP2%3E%20change_erb_ruby_testrb_irb_rake_etc"></script> <p>Step3></p> <script src="http://gist.github.com/598558.js?file=STEP3%3E%20install%20rspec"></script> <p style="font-size: 10px;"> <a href="http://posterous.com">Posted via email</a> from <a href="http://jaigouk.com/29041741">on the Edge of Complexity</a> </p> </div>on the edge of Complexityhttp://www.blogger.com/profile/11692594157379801516noreply@blogger.comtag:blogger.com,1999:blog-6233787394794376169.post-91415638046218592392010-09-21T17:45:00.001+09:002010-09-21T17:45:14.272+09:00Installing jspec, rspec textmate bundles<div class='posterous_autopost'><script src="http://gist.github.com/589406.js?file=Textmate%20bundle%20install"></script> <p style="font-size: 10px;"> <a href="http://posterous.com">Posted via email</a> from <a href="http://jaigouk.com/installing-jspec-rspec-textmate-bundles-0">on the Edge of Complexity</a> </p> </div>on the edge of Complexityhttp://www.blogger.com/profile/11692594157379801516noreply@blogger.comtag:blogger.com,1999:blog-6233787394794376169.post-29940235300319823342010-09-21T17:44:00.001+09:002010-09-21T17:44:39.690+09:00Installing jspec, rspec textmate bundles<div class='posterous_autopost'><p><span style="font-family: helvetica, arial, freesans, clean, sans-serif; font-size: 11px; line-height: 14px;"> <div class="CodeRay"> <div class="code"><pre>Install RVM textmate bundle http://rvm.beginrescueend.com/integration/textmate/cd /Library/Application\ Support/TextMate/Bundles/git clone git://github.com/rspec/rspec-tmbundle.git RSpec.tmbundleit clone git://github.com/visionmedia/jspec.tmbundle.gitosascript -e 'tell app "TextMate" to reload bundles'</pre></div> </div> </span></p> <p style="font-size: 10px;"> <a href="http://posterous.com">Posted via email</a> from <a href="http://jaigouk.com/installing-jspec-rspec-textmate-bundles">on the Edge of Complexity</a> </p> </div>on the edge of Complexityhttp://www.blogger.com/profile/11692594157379801516noreply@blogger.comtag:blogger.com,1999:blog-6233787394794376169.post-4508798745085344712010-02-28T07:38:00.001+09:002010-02-28T07:38:57.957+09:00My first visit to IDC
<div class='posterous_autopost'><a href='http://posterous.com/getfile/files.posterous.com/jaigouk/COSornylF2Y3RQ1U25XjU5T7GkTMXFDtMKgbtUQGqYEsO2CSFyTEEXNAulDJ/IMG_0091.jpeg'><img src="http://posterous.com/getfile/files.posterous.com/jaigouk/TErgAOhmnzSjKIeqS781jd8JRUMv16s4EHDaKXZzLXAMU90xb8dm2kB0jFtZ/IMG_0091.jpeg.scaled.500.jpg" width="500" height="375"/></a> <a href='http://posterous.com/getfile/files.posterous.com/jaigouk/dqFTmEsLabzqVCO4FDLtrwczUMZDMDxjqE7UAFLWUVZzC98XZbu7rDfWINVI/IMG_0092.jpeg'><img src="http://posterous.com/getfile/files.posterous.com/jaigouk/nHDHcFnqDrWPOlalmP9ySfjnft8fB9ah5hNuBdBy7G3aNQPvhjQYZvO8e3e6/IMG_0092.jpeg.scaled.500.jpg" width="500" height="375"/></a> <div><a href='http://jaigouk.posterous.com/my-first-visit-to-idc'>See and download the full gallery on posterous</a></div><p>These guys at IDC are really serious about security! I guess my XServe was the only OS X in the whole building</p> <p style="font-size: 10px;"> <a href="http://posterous.com">Posted via email</a> from <a href="http://jaigouk.posterous.com/my-first-visit-to-idc">on the Edge of Complexity</a> </p> </div> on the edge of Complexityhttp://www.blogger.com/profile/11692594157379801516noreply@blogger.comtag:blogger.com,1999:blog-6233787394794376169.post-86427958868975832012010-02-28T07:07:00.001+09:002010-02-28T07:07:49.140+09:00TentCot
<div class='posterous_autopost'><img src="http://posterous.com/getfile/files.posterous.com/jaigouk/v8rna2T7KAkZkgkkzeMwmu4RSdH3bNHUxdybOVsVF2RGaq3tpHhwldae13rw/IMG_0121.jpg" width="427" height="320"/> <p>I didn't want to use this. But project schedule is so tight.</p> <p style="font-size: 10px;"> <a href="http://posterous.com">Posted via email</a> from <a href="http://jaigouk.posterous.com/tentcot">on the Edge of Complexity</a> </p> </div> on the edge of Complexityhttp://www.blogger.com/profile/11692594157379801516noreply@blogger.comtag:blogger.com,1999:blog-6233787394794376169.post-87103114346215159902009-10-17T07:04:00.010+09:002009-10-17T07:30:49.144+09:00Cappuccino - animated segment controllerI was trying to implement segmented controller with Cappuccino extension. I've succeeded to make CPTrackingController work. But it seem that LPKit is better than mine. It works with animation effect. The working example is uploaded at github. (http://github.com/jaigouk/Cappuccino_merb-visual-api_ui)<br /><br><br /><br /><object width="400" height="300"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=7106529&server=vimeo.com&show_title=1&show_byline=1&show_portrait=0&color=&fullscreen=1" /><embed src="http://vimeo.com/moogaloop.swf?clip_id=7106529&server=vimeo.com&show_title=1&show_byline=1&show_portrait=0&color=&fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="400" height="300"></embed></object><p><a href="http://vimeo.com/7106529">LPKit enabled Cappuccino toolbar</a> from <a href="http://vimeo.com/user1159066">jaigouk</a> on <a href="http://vimeo.com">Vimeo</a>.</p>on the edge of Complexityhttp://www.blogger.com/profile/11692594157379801516noreply@blogger.comtag:blogger.com,1999:blog-6233787394794376169.post-77682604200976397192009-01-30T17:37:00.037+09:002009-02-07T13:15:46.812+09:00Rest with Merb: CouchDB resources<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_HbRZwpPnFNs/SYK8i3q8e0I/AAAAAAAAAXM/vpduf6f-zcE/s1600-h/rest_with_merb.png"><img style="cursor: pointer; width: 211px; height: 189px;" src="http://4.bp.blogspot.com/_HbRZwpPnFNs/SYK8i3q8e0I/AAAAAAAAAXM/vpduf6f-zcE/s400/rest_with_merb.png" alt="" id="BLOGGER_PHOTO_ID_5297003418986773314" border="0" /></a><br /><br />I've been studying couchdb. There are several ways to use couchDB with merb. CouchRest, dm-couchdb-adapter, relaxdb. At the beginning, I've focussed on dm-couchdb-adapter. Because there is a good example, the muddle. It works on my local machine too. I looked into the source codes, and it was not easy to understand them. My head was full of relational database concepts, and it prevented me to go further. I decided to spend more time on couchDB. I asked @merbist via twitter that which would be the proper way to use couchDB. And he answered that "Couchrest for sure, the 2 other ones don't use couch properly"<br /><br />These are the resources to start.<br /><ul><li><a href="http://www.infoq.com/presentations/katz-couchdb-and-me">CouchDB and Me(Jan 31, 2009): Damien Katz explains what drove him to create CouchDB</a><br /></li><li><a href="http://videos.sapo.pt/ntViNvMENhyUtvmPO02g">codebits2008 presentation by jan lehnardt(Nov 27, 2008) : good introduction</a></li><li><a href="http://peepcode.com/products/couchdb-with-rails">Peepcode screencast(Sep 23, 2008) : goes deeper and shows how to use couchrest. It is little bit outdated.(couchview -> couchapp) But example app works!<br /></a></li><li><a href="http://jchris.mfdz.com/posts/122">CouchRest::Model - ORM, the CouchDB way(Sep, 2008)</a></li><li><a href="http://atlruby.org/altrux/posts/85-Merbday-Isshen-Solutions-Merb-couchdb">Atlanta Ruby Group, merbday presentation(Dec 12, 2008)</a><br /></li></ul><br />There is a ruby interface written by jchris, Couchrest. He has a plan to launch Couchrest::Model seperately <a href="http://groups.google.com/group/couchrest/browse_thread/thread/fe83daccf26128d8#">[link].</a><br /><br />And Couchview has been replaced by <span style="font-weight: bold;">couchapp</span> <a href="http://github.com/jchris/couchapp">[link]</a>(I've followed Peepcode screencast, and spent some time to figure out why "couchview" command is not working.)<br /><br /><blockquote>$ <b>couchapp</b><br />Usage: /opt/local/bin/couchapp [options] (push|generate)<br />-q, —quiet Omit extra debug info<br />-h, —help Display detailed help and exit<br />-v, —version Display version number<br /><br />Here is what jchris said about couchapp at <a href="http://groups.google.com/group/couchrest/browse_thread/thread/351ed1b9ae08b0a1">couchrest google group[link]</a><br />====================<br /><span class="fixed_width" style="font-family:Courier,Monospaced;">Couchapp is equivalent to couchview, except for a few details about<br />how it expects to see documents stored on the filesystem.<br /></span><p><span class="fixed_width" style="font-family:Courier,Monospaced;">If I recall correctly, couchview takes something like this<br /></span></p><p><span class="fixed_width" style="font-family:Courier,Monospaced;">views/test-map.js<br />views/test-reduce.js<br /></span></p><p><span class="fixed_width" style="font-family:Courier,Monospaced;">and pushes it to the views member of a design doc, which you'd specify<br />on the command line, with a default of falling back to a directory name. Couchview does that job just fine, but it is no generalized to handle the other functions that can be stored in a design doc.<br /></span></p><p><span class="fixed_width" style="font-family:Courier,Monospaced;">the CouchApp script takes a filesystem and pushes it transparently to a design doc, so the on-disk layout it expects is a little different:<br /></span></p><p><span class="fixed_width" style="font-family:Courier,Monospaced;">views/test/map.js<br />views/test/reduce.js<br />validate_doc_update.js<br />shows/post.js<br />lists/index.js<br />_attachments/images/example.png<br />_attachments/foo/bar.html<br /></span></p><p><span class="fixed_width" style="font-family:Courier,Monospaced;">you are free to leave any of that out (so if you only care about views then you should be able to use it just fine.)<br /></span></p><span class="fixed_width" style="font-family:Courier,Monospaced;">currently the python version of couchapp also has the ability to "clone" from a url. I'm working on getting the ruby version back up to speed, but for now you might be happiest installing the python version. </span><br /></blockquote><br /><br />Things move so fast around couchDB and couchrest that one article is not proper to summarize them. I will post time to time about it.on the edge of Complexityhttp://www.blogger.com/profile/11692594157379801516noreply@blogger.comtag:blogger.com,1999:blog-6233787394794376169.post-83162315507152179812009-01-27T00:46:00.005+09:002009-01-27T21:15:55.400+09:00merb pagination<span style="font-size:130%;"><span style="font-weight: bold;">written by billturner #merb freenode irc channel.</span></span><br /><br />Q. "@current_page = (params[:page] || 1).to_i " what does that refers to?<br />A. billturner> when you use the pagination, and the <%= paginate(..) %> stuff, it gives you links like /posts/index?page=2<br />A. billturner> so, if there's no "page=X" then it will pull the first page of results<br /><br /><br /><script src="http://pastie.org/371098.js"></script></billturner></billturner>on the edge of Complexityhttp://www.blogger.com/profile/11692594157379801516noreply@blogger.comtag:blogger.com,1999:blog-6233787394794376169.post-80331408756690232112009-01-23T10:01:00.006+09:002009-02-03T22:15:36.970+09:00502 Bad Gateway<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_HbRZwpPnFNs/SXkXGxPGTbI/AAAAAAAAAXE/NFeCJ3XZh04/s1600-h/502_bad_gateway001.png"><img style="cursor: pointer; width: 400px; height: 300px;" src="http://1.bp.blogspot.com/_HbRZwpPnFNs/SXkXGxPGTbI/AAAAAAAAAXE/NFeCJ3XZh04/s400/502_bad_gateway001.png" alt="" id="BLOGGER_PHOTO_ID_5294288242014047666" border="0" /></a><br /><br />Recently, I've changed my server from mod-passenger to nginx because of the <a href="http://groups.google.com/group/merb/browse_thread/thread/112443c7c713d25a/dbcbd1480e180d1e?lnk=gst&q=passenger#dbcbd1480e180d1e">comment at merb google groups</a><a href="http://groups.google.com/group/merb/browse_thread/thread/112443c7c713d25a/dbcbd1480e180d1e?lnk=gst&q=passenger#dbcbd1480e180d1e">[link]</a>. Passenger was fit for me. It makes deployment more easier than before. However, merb's way of handling processes seems complicated and advanced <a href="http://brainspl.at/articles/2008/12/07/merb-master-worker-monit-control-setup">as Ezra said[link]</a>. And it is not fully compatible with passenger now.<br /><br />So I came back to nginx. I thought it would be easy. But it took some time to run my small app. I 've seen a lot of "502 Bad Gateway" page. I guessed that compiling was wrong at first time. It wasn't nginx but my logic in the codes. So the best way to check what's wrong, just type "merb" on the server. I haven't installed necessary gems and libraries. Yes, it is very basic stuff but easy to miss.on the edge of Complexityhttp://www.blogger.com/profile/11692594157379801516noreply@blogger.comtag:blogger.com,1999:blog-6233787394794376169.post-42072954545044808912009-01-16T13:02:00.059+09:002009-02-05T12:11:59.501+09:00Twitter on Merb : Merb flat app Walkthrough<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_HbRZwpPnFNs/SXQvnA6nBDI/AAAAAAAAAW0/XUdSL3l9z6E/s1600-h/Twitter+on+merb.png"><img style="cursor: pointer; width: 400px; height: 300px;" src="http://2.bp.blogspot.com/_HbRZwpPnFNs/SXQvnA6nBDI/AAAAAAAAAW0/XUdSL3l9z6E/s400/Twitter+on+merb.png" alt="" id="BLOGGER_PHOTO_ID_5292907809374405682" border="0" /></a><br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_HbRZwpPnFNs/SXQwWLjfGBI/AAAAAAAAAW8/z_Pk-bGLASY/s1600-h/commits.png"><img style="cursor: pointer; width: 400px; height: 300px;" src="http://2.bp.blogspot.com/_HbRZwpPnFNs/SXQwWLjfGBI/AAAAAAAAAW8/z_Pk-bGLASY/s400/commits.png" alt="" id="BLOGGER_PHOTO_ID_5292908619684059154" border="0" /></a><br /><br /><span style="font-weight: bold;font-size:180%;" >Description</span><br /><ul><li><span style="font-size:130%;">site : <a href="http://merb.kicks-ass.org/">merb.kicks-ass.org </a></span></li><li><span style="font-size:130%;">codes : <a href="http://jaigouk.github.com/twitter-on-merb/">jaigouk.github.com/twitter-on-merb</a></span></li><li><span style="font-size:130%;">server: slicehost Ubuntu 8.1, nginx, merb version 1.0.8.1, dm version 0.9.10</span></li><li><span style="font-size:130%;">purpose: aggreate github commits feeds and post them to twitter @edgemerb<br /></span></li><li><span style="font-size:130%;">todo: <span style="font-family:monospace;">eager cache</span><code></code></span></li></ul><br /><br /><span style="font-weight: bold;font-size:180%;" >Motivation</span><br /><br />I’m a newbie in merb community. Since “the merger”, I needed correct and reliable reference and so was other newbies in the community. I started to translate merb-book in Korean. But it was not enough for us .I thought that learning merb would be easier if I build an app what I really need such as tracking recent changes. It was easy since there are good tutorials and tools. And scraping nightly version of <span class="caps">README</span> file could be helpful too. Because merb core team members are too busy to write guides and tutorials.<br /><br />I laid aside scraping the <span class="caps">README</span> files for now. I just aggregated merb commits rss and send them to twitter. I use TwitterFox as twitter client on my desktop. Whenever a new message comes, It shows the message in a brief moment. It's really handy.<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_HbRZwpPnFNs/SXAG6dsiJ2I/AAAAAAAAAWE/ytEc0JsBEG0/s1600-h/twittbin_is_useful.png"><img style="cursor: pointer; width: 400px; height: 279px;" src="http://2.bp.blogspot.com/_HbRZwpPnFNs/SXAG6dsiJ2I/AAAAAAAAAWE/ytEc0JsBEG0/s400/twittbin_is_useful.png" alt="" id="BLOGGER_PHOTO_ID_5291737163633928034" border="0" /></a><br /><span style="font-weight: bold;font-size:180%;" ><br />Generating a flat app</span><br /><br /><script src="http://gist.github.com/47806.js"></script><br /><br />This is what I did at first time. As you see, It is really small and shows basic structure how merb works. If you want to learn more about internals of merb, visit here(http://github.com/michaelklishin/merb-internals-handbook)<br /><br /><br /><span style="font-size:180%;"><span style="font-weight: bold;">Using Model in a flat app</span></span><br /><br />I edited config/framework.rb file. Because I could not use twitter_search gem to verify the message is unique or not. This is same as twitter timeline api. It seems that they use cache. Therefore I had to add a model to check the message I'm sending is unique or not.<br /><br /><script src="http://gist.github.com/44598.js"></script><br /><br />First, I added one line :model => Merb.root / "models" in config/frameworks.rb file. And then, wrote dependencies in init.rb file.<br /><br />$merb-gen model tweet<br /><br /><script src="http://gist.github.com/44599.js"></script><br /><br />$rake db:automigrate<br /><br /><br /><span style="font-size:180%;"><span style="font-weight: bold;">Scraping with nokogiri</span></span><br /><br />Since merb flat app has a single controller file, It was easy to start. But the twitter api and nokogiri took some time to use. I was not familiar with nokogiri, I googled and found this tutorial. (http://www.robertsosinski.com/2008/12/08/scraping-pages-made-easy-with-ruby-and-nokogiri/).<br />And I better use a well designed web site template. I picked one of the recommended templates from samshmagazine.(http://www.smashingmagazine.com/2008/12/01/100-free-high-quality-xhtmlcss-templates/)<br /><br />There were 3 or 4 ruby libraries for twitter. And twitter4r has more documents than the others. It took much time to discover that timeline api and search api use cache. I just forgot about the cache. Anyway I installed necessary gems.<br /><br />$sudo gem install twitter4r twitter nokogiri shorturl<br /><br />And then I eddited index.html.erb file. In the controller, it only needs render method. I just wanted to use feedtools and feedupdater gem. But there were not enough document to reference and as merb-book says, I better not use codes that I don't understand. Scraping pages with nokogiri is easy but my app would be fragile.<br /><br /><script src="http://gist.github.com/44610.js"></script><br /><br />I know the codes above is not that beautiful. But I hope this code help another rubist who want a scraping example through nokogiri. As you see above, k.content which was return by nokogiri's search method was Hash. This is why i used to_s method.<br /><br /><br /><span style="font-size:180%;"><span style="font-weight: bold;">Scheduling background works</span></span><br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_HbRZwpPnFNs/SXQoOjbxjNI/AAAAAAAAAWs/FSjGscbDuwI/s1600-h/starling-process.png"><img style="cursor: pointer; width: 400px; height: 293px;" src="http://2.bp.blogspot.com/_HbRZwpPnFNs/SXQoOjbxjNI/AAAAAAAAAWs/FSjGscbDuwI/s400/starling-process.png" alt="" id="BLOGGER_PHOTO_ID_5292899692562189522" border="0" /></a><br /><br />And posting a message to twitter was tricky for me. Because of increasing popularity of twitter, posting throuth api was too fast for twitter sometimes. Posting messages takes much time and that code block needs to sleep. In the initial codes, I wrapped the block with run_later. But I found that I need to schedule the tasks. There would be several way to acheive scheduling the daemons. In version 0.0.1.4(Twitter-on-Merb), I used crontab and rake. But the codes were dirty and it did not work as I expected. I talked about this with lakteck via tiwtter, and I remembered that I've seen rufus-scheduler at <a href="http://www.igvita.com/2007/03/29/scheduling-tasks-in-ruby-rails/">igvita.com[link]</a>. It was really easy to implement scheduler with rufus-scheduler gem. The scheduler scrapes web sites on every 10 minutes. And I made a starling consumer daemon. I referenced <a href="http://www.pragprog.com/titles/fr_arr/source_code">"Advanced Rails Recipes #42"</a><br /><ul><li>rufus-scheduler github repo <a href="http://github.com/jmettraux/rufus-scheduler/tree/master">[link]</a><br /></li><li>rufus-scheduler rdoc <a href="http://rufus.rubyforge.org/rufus-scheduler/">[link]</a></li><li>starling github repo <a href="http://github.com/starling/starling/tree/master">[link]</a><br /></li></ul><br />confing/init.rb<br /><script src="http://gist.github.com/51419.js"></script><br /><br />lib/daemons/starling_consumer.rb file<br /><script src="http://gist.github.com/48582.js"></script><br /><br />lib/daemons/starling_consumer_ctl.rb file<br /><script src="http://gist.github.com/48584.js"></script><br /><br />config/consumer.god file. Daemons are started after "cap:deploy".<br /><script src="http://gist.github.com/48900.js"></script><br /><br /><span style="font-size:180%;"><span style="font-weight: bold;">Cache</span></span><br /><br />My flat app was too slow, and it was time to implement cache. I referenced,<br /><ul><li><span style="font-weight: bold;"><a style="color: rgb(255, 102, 0);" href="http://github.com/benburkert/community_shelf">Keep a hot cache with merb-cache</a> </span>by <span style="font-weight: bold;">Ben Burkert</span> at <a style="font-weight: bold; color: rgb(255, 102, 0);" href="http://merbcamp.com/video/burkert.mp4">MerbCamp</a></li><li><a style="color: rgb(255, 102, 0);" href="http://merbunity.com/tutorials/15"><span style="font-weight: bold;">Merbunity Tutorial#15</span></a> written by <span style="font-weight: bold;"> Ben Burkert</span> on Sep 07, 2008</li><li><a style="color: rgb(255, 102, 0);" href="http://gom-jabbar.org/articles/2008/12/19/merb-cache-s-methods"><span style="font-weight: bold;">Merb-cache's methods</span> </a>written by <span style="font-weight: bold;">Guillaume Maury(a.k.a giom)</span> on Dec 19, 2008</li></ul>Here's quick introduction <a href="http://gist.github.com/616">[original gist document link]</a><br /><br /><blockquote>== Quick intro<br />With fragment caching, you can mix dynamic and static content.<br /><br />With action caching, the whole template is cached<br />but the before filters are still processed.<br /><br />With page caching, the whole template is put in html files in a special<br />directory in order to be handled directly without triggering Merb.<br /><br />by Dan Kubb on July 22, 2008</blockquote><br /><br /><script src="http://gist.github.com/47858.js"></script><br /><br />But my init file was wrong at that time and throws erros whenever I run "rake db:automigrate" since I set up the cache(http://gist.github.com/44702). I really didn't know how to fix this. At first, I guessed that datamapper version could be the reason why causes it. After updating the gems, error were still there. Fortunately I have known Guillaume Maury(giom) recently via twitter. He helped to get out of this. This code was not familiar with me. I thought I knew the way to setup the cache.<br />The codes were already in his article (http://gom-jabbar.org/articles/2008/12/14/example-nginx-configuration-for-merb-with-page-caching-using-the-file-store). I run my apps on passenger so I simply skipped it. :) I highly recommend his blog if you are in Merb2 or Rails3. Here is the snippet written by him. (The initial flat app with plain dependency line did not work.)<br /><script src="http://pastie.org/356279.js"></script><br /><br />And I referenced here.<br />http://blog.evanweaver.com/files/doc/fauna/memcached/files/README.html<br /><br />$ wget http://download.tangent.org/libmemcached-0.25.tar.gz<br />$ tar -xzvf libmemcached-0.25.tar.gz<br />$ cd libmemcached-0.25.tar.gz<br />$ ./configure<br />$ make && sudo make install<br />$ sudo gem install memcached<br />$ irb<br />> require 'rubygems'<br />> require 'memcached'<br /><br /><br /><span style="font-weight: bold;font-size:180%;" >Deploy</span><br /><br />$cap deploy:setup<br />$scp -r database.yml to server<br />$scp -r twitter.yml to server<br /><br />$rake db:create<br />$rake db:automigrate<br />$cap deploy<br /><br />this is my deploy.rb file.<br /><script src="http://gist.github.com/47821.js"></script><br /><span style="font-weight: bold;font-size:180%;" >tip</span><br /><br />And if you have problems after your deployment, check if config.ru(must be 'config.ru', not 'Config.ru') file exists and the permissions are correct(chmod 755 -R).on the edge of Complexityhttp://www.blogger.com/profile/11692594157379801516noreply@blogger.comtag:blogger.com,1999:blog-6233787394794376169.post-19431982102198565782009-01-02T15:20:00.009+09:002009-01-06T08:41:29.720+09:00Free merb screen casts<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_HbRZwpPnFNs/SV20z4BZnpI/AAAAAAAAAVw/GUzHHl7n6sM/s1600-h/Atlanta.png"><img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 400px; height: 279px;" src="http://4.bp.blogspot.com/_HbRZwpPnFNs/SV20z4BZnpI/AAAAAAAAAVw/GUzHHl7n6sM/s400/Atlanta.png" alt="" id="BLOGGER_PHOTO_ID_5286580340907417234" border="0" /></a><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br />#1 <a href="http://merbcamp.com/video">MerbCamp</a> - Yes, all merbists have seen it.<br />#2 <a href="http://merbcamp.com/video">Merbunity</a> - It's maintained by hassox!<br />#3 <a href="http://atlruby.com/">Atlanta ruby user </a>- I found this site recently. I think it's worth to see.<br />#4 <a href="http://splendificent.com/2008/12/merb-dependencies-and-bundler-conquered-screencast/">Merb Dependencies and Bundler</a> - by <span class="author">Carl Lerche</span><br />#5 <a href="http://peepcode.com/products/meet-merb-pdf-draft">peepcode</a> (well, not free. but it's 9$) - The screencast was recorded on merb 0.9 but it still is a good one.<br /><br />And there are good tutorials.<br /><ul><li><a href="http://www.theamazingrando.com/blog/?p=41">HOWTO: Getting a sidebar in Merb</a></li><li><a href="http://uipoet.com/read/3">Merb on Slicehost </a></li><li><a href="http://scottmotte.com/">Merb subdomains</a></li><li><a href="http://gom-jabbar.org/articles/2008/12/19/merb-cache-s-methods">Advanced merb-cache articles</a><br /></li><li><a href="http://github.com/ck/cookbook">cookbook</a></li><li><a href="http://github.com/mattetti/merb-book">merb-book</a><br /></li></ul>on the edge of Complexityhttp://www.blogger.com/profile/11692594157379801516noreply@blogger.comtag:blogger.com,1999:blog-6233787394794376169.post-35410209979014703912008-12-24T08:34:00.033+09:002009-02-08T02:33:15.702+09:00Merb + Rails merger<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_HbRZwpPnFNs/SVRQGOmTlaI/AAAAAAAAAVU/hidRMbnvShs/s1600-h/where_is_rails_300_400.png"><img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 300px; height: 400px;" src="http://2.bp.blogspot.com/_HbRZwpPnFNs/SVRQGOmTlaI/AAAAAAAAAVU/hidRMbnvShs/s400/where_is_rails_300_400.png" alt="" id="BLOGGER_PHOTO_ID_5283936330740635042" border="0" /></a><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><blockquote>Update(2009.2.8)<br />"Merb in Action" => "Rails3 in Action"<br />http://www.manning.com/katz/<br /><br />Table of Contents<br /> 1. Building Your First Rails 3.0 Application<br /> 2. Overview of the Rails stack(s) + architecture<br /> 3. Creating Rails Applications<br /> 4. Using DataMapper for Models<br /> 5. Using ActiveRecord for Models<br /> 6. Other Choices for Models<br /> 7. Processing Requests<br /> 8. Routing in Rails 3<br /> 9. Customizing Views<br />10. Working on the Client Side<br />11. Supporting Characters<br />12. Using the Plugin API<br />13. Testing Your Applications<br />14. Deploying a Rails Application<br />15. Scaling Rails<br /><br />Appendix A Just enough advanced Ruby<br />Appendix B The migration story<br />Appendix C Rails 2 to Rails 3<br />Appendix D Merb 1 to Rails 3<br /><br />Update(2009.2.5)<br /><span class="fixed_width" style="font-family:Courier,Monospaced;"><a href="http://groups.google.com/group/merb/browse_thread/thread/9a3513804b2855ba/815e4298f681a405#815e4298f681a405">Rails 3 will have mountable applications, not engines or slices</a>.<br /><br /></span>Update(2009.1.16)<br />I just got an email from manning about "Merb in Action".<br /><ul><li><span style="font-weight: bold;">Rails becomes more modular</span>, by building on rails-core with the ability to opt in or out of specific components and making it possible to replace parts of Rails without disturbing other parts.</li><li><span style="font-weight: bold;">Merb performance improvements flow into Rails</span>, including benchmarking applications so developers can see which optimizations have real-world impact.</li><li><span style="font-weight: bold; color: rgb(0, 0, 0);">A defined public API with a test suite</span>, so users and plugin developers have a stable API to build against.</li><li><span style="font-weight: bold; color: rgb(0, 0, 0);">A "core" version of Rails, like Merb's current core generator</span>, that makes it easy to select just the parts that are important for your app.</li><li><span style="font-weight: bold;">DataMapper and Sequel support as first-class ORMs</span>, along with ActiveRecord as the default.</li><li><span style="font-weight: bold;">Rack support in Rails 3</span>, to improve the state of modular, sharable logic between applications. </li></ul>Update(2008/12/26)<br />So far, it seems that <a style="color: rgb(255, 102, 0); font-weight: bold;" href="http://groups.google.com/group/merb/">merb google group</a> is the best source. And <a style="font-weight: bold; color: rgb(255, 102, 0);" href="http://merbist.com/2008/12/25/merb-rails-merge-or-why-should-merbists-be-happy/">Matt Aimonetti</a> answers all the concerns.<br /><br /><span style="font-weight: bold;font-size:130%;" >Yehuda Katz</span> says<br />"If you want to learn Merb for modularity and power that is not currently present in Rails, stick with Merb. <span style="font-weight: bold;">We'll provide a good upgrade path to Rails3</span> (and feel free to contact me personally to keep me honest on that promise), and you'll have a leg-up when the same power makes its way into Rails. While Rails3 will still be very similar to Rails2 for current Rails users, it will look a lot like Merb for those users who are currently drawn to Merb."<br /><br />"We always said that there would be breaking changes in Merb 2.0. <span style="font-weight: bold;">Now, some of those breaking changes will be in tandem with the Rails3 merger</span>. However, we will treat them like any other breaking changes, and make sure the deprecation notices flow freely and the transition path is clean. Make sense?"<br /><br /><span style="font-weight: bold;font-size:130%;" >Matt Aimonetti</span> says,<br />"The great advantage of using merb now, is that it has a public API so we will be able to easily migrate it to the new 3.0 API. Concretely, we are planning on being able to<span style="font-weight: bold;"> replace merb-core by rails-core</span> in your merb app and to use merb-helpers and other plugins with rails-core." </blockquote><br /><br />I think "Merb in Action" would take longer than expected. And it's required to rewrite the whole chapters that are published. Of course, book's title will not be changed but I'm just worried about Merb. It would be called Rails3.0 by many other people, especially inside Rails community.<br /><br />As Ezra said, <blockquote><span style="font-size:130%;"><span style="font-weight: bold;">Merb is dead</span></span>, long live Merb(Rails-3.0)!<br /></blockquote>Matt Aimonetti said,<br /><blockquote>I don't think Ezra is right. Merb isn't dead. First off, merb will still be around until the next release (rails 3.0) and we will keep on supporting it even after that (maintenance).</blockquote>So many merbists are disappointed by this news but there is nothing can be done. Engin Yard's decision looks solid. I've accepted it, after all. I've read many articles enough to say that I will stick with Merb. There were some people who even want to switch to Django. I decided to practice Merb more than before. Because Merb would be the core changes in Rails3. And it could happen that Merb core team is too busy. But evangelist like Matt Aimonetti will help us. I hope taking this path would be natural to Merb2.on the edge of Complexityhttp://www.blogger.com/profile/11692594157379801516noreply@blogger.comtag:blogger.com,1999:blog-6233787394794376169.post-41327792447136752392008-12-20T01:53:00.023+09:002009-01-04T23:34:57.961+09:00오픈소스 merb-book 한국어 번역<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_HbRZwpPnFNs/SUvTN7Z2e-I/AAAAAAAAAUk/zcf_ChK_9-4/s1600-h/merb.png"><img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 136px; height: 54px;" src="http://3.bp.blogspot.com/_HbRZwpPnFNs/SUvTN7Z2e-I/AAAAAAAAAUk/zcf_ChK_9-4/s400/merb.png" alt="" id="BLOGGER_PHOTO_ID_5281547224259918818" border="0" /></a><br />Now, merb has many resources to learn.<br /><br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_HbRZwpPnFNs/SUvTek5_QyI/AAAAAAAAAUs/H75HHX7I6sg/s1600-h/merbcamp.gif"><img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 134px; height: 71px;" src="http://3.bp.blogspot.com/_HbRZwpPnFNs/SUvTek5_QyI/AAAAAAAAAUs/H75HHX7I6sg/s320/merbcamp.gif" alt="" id="BLOGGER_PHOTO_ID_5281547510278472482" border="0" /></a>튜토리얼 및 기타 소개 동영상들 : MerbCamp videos,<br />스크린캐스트 : http://merbunity.com/screencasts<br /><br /><br /><br /><br />and there is open source merb-book which is started by <a title="Matt Aimonetti" href="http://www.linkedin.com/in/mattaimonetti" target="_blank">Matt Aimonetti.<br /></a> Well, I saw Chinese and Japanese but no Korean one. I think that there are probably not enough rubists in Korea. Anyway I sent a message to him that I want to start if there is no one. And <a href="http://github.com/jaigouk/merb-book/tree/korean">here </a>it is.<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://book.merbist.com/"><img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 320px; height: 272px;" src="http://3.bp.blogspot.com/_HbRZwpPnFNs/SU9AfUssXkI/AAAAAAAAAU0/zFlJY9pWPLQ/s320/merb-book.png" alt="" id="BLOGGER_PHOTO_ID_5282511794805169730" border="0" /></a><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><blockquote><br />Update(12/22/2008)<br />I've completed "Merb-More" Chapter. But there are still unfinished chapters in English.<br />Merb-More 챕터까지 모두 한국어로 번역을 완료했지만, 영어로 된 원본이 아직 빈 곳이 많습니다. 번역하는데에는 네이버 단어장, 구글번역기, 바벨피쉬, 그리고 제 경험을 최대한 살려서 번역했습니다. 많이 부족하므로 오타나 잘못된 번역을 알려주시면 고치도록 하겠습니다. 한글로 된 merb 책이 나오려면 아직 오래 걸릴 것 같습니다. (영어 책도 아직 출판되지 않았습니다.) 참여를 원하시는 분은 메일 보내주시기 바랍니닷.<br /><br />Update(12/23/2008)<br />I finished the translation.<br />현재까지 작성된 영어 원본에 대한 번역은 마쳤습니다. 제 생각에는 본격적으로 책들이 쏟아지는 2009년 전반에는 이 오픈소스 책도 많은 개선이 있을 것 같습니다.<br /><br />Update(12/24/2008)<br />Rails와 Merb가 합쳐지는 이 시점에서, Pragmatic Bookshelf, Apress 등에서 나온 책들은 의미가 희석되었다고 생각합니다. 워낙 빠르게 변하다보니 책들이 따라가지 못하고 있습니다. 오픈소스 책의 발안자인 Matt Aimonetti가 Rails 코어팀에 합류했기 때문에 이 책이 그나마 현재 나온 책중에서는 가장 참고할만한 책이 되지 않을까 싶습니다. Rails3.0에선 Merb의 기능들을 흡수할 예정이기 때문입니다.<br /><br />update(2009.1.4)<br />제가 실수로 master 브렌치에 작업내용을 합치질 않았었습니다. -_-;;;<br />이제 github에서 다운받으셔서 정상적으로 보실 수 있습니다. 업데이트 내용은 4번째 장인 "데이터베이스와 상호작용" 부분입니다. 현재까지 작업된 영어원본까지 모두 작업완료되었습니다. 책을 받아서 보시는 분들이 계시다면, 오타나 의역에 무리가 있는 부분을 지적해주세요. :)<br /></blockquote><br />오픈소스 merb 책이 나왔지만 한국어 번역이 없어 매트에게 해보겠다고 메세지를 보냈습니다. 흔쾌히 해보라해서 현재 작업중이고 getting started/mvc까지 작업완료했습니다. 이제와서 보니 일본어나 프랑스, 중국 번역판에 비해 늦은 것은 아니었습니다.<br /><br /><span class="postbody">------------------------------<br /><span style="font-weight: bold;">책을 보는 방법</span><br />------------------------------<br /><br /><span style="font-weight: bold;">필요조건 : </span><br />a. ruby, gem<br />b. git<br /><br /><span style="font-weight: bold;">스텝 :</span><br /><br />1. 먼저 제 github 저장소에서 merb-book을 로컬 pc로 복사합니다.<br />$git clone <a href="mailto:git@github.com">git@github.com</a>:jaigouk/merb-book.git<br /><br />2. 다운받은 merb-book 루트 디렉토리에서 다음을 실행해 주시면 됩니다.<br />$./bin/merb<br /><br />3. 브라우저에서 <a href="http://localhost:4000/" target="_blank">http://localhost:4000</a> 주소로 가면 책을 보실 수 있습니다. 목차 맨위에 보시면 각 언어들 링크가 있는데 한국어를 선택하시면 됩니다.<br /><br /></span><span class="postbody">------------------</span><span class="postbody">-</span><span class="postbody">-</span><span class="postbody">-</span><span class="postbody">-</span><span class="postbody">-</span><span class="postbody">-----------<br />Chapter별 완성도(2009/1/4): 좋음(○), 미흡(△), 없음(X)<br /></span><span class="postbody">-----------------------</span><span class="postbody">-</span><span class="postbody">-</span><span class="postbody">-</span><span class="postbody">-</span><span class="postbody">-------</span><br /><ol class="available-for-translation" id="toc"><li> <p><a href="http://localhost:4000/front-matter">서문</a></p> <ol><li><a href="http://localhost:4000/front-matter/foreword">머리말 By Yehuda Katz<span class="postbody">(X)</span></a></li><li><a href="http://localhost:4000/front-matter/preface">서문 by Matt Aimonetti<span class="postbody">(○)</span></a></li><li><a href="http://localhost:4000/front-matter/contributors">공헌자들<span class="postbody">(○)</span></a></li></ol> </li><li> <p><a href="http://localhost:4000/introduction">소개</a></p> <ol><li><a href="http://localhost:4000/introduction/ruby">Ruby 언어<span class="postbody">(○)</span></a></li><li><a href="http://localhost:4000/introduction/merb">Merb 웹프레임웍<span class="postbody">(○)</span></a></li><li><a href="http://localhost:4000/introduction/datamapper">DataMapper ORM<span class="postbody">(X)</span></a></li><li><a href="http://localhost:4000/introduction/rspec">RSpec 테스팅 프레임웍<span class="postbody">(○)</span></a></li></ol> </li><li> <p><a href="http://localhost:4000/getting-started">시작하기</a></p> <ol><li><a href="http://localhost:4000/getting-started/install-instructions">설치방법<span class="postbody">(○)</span></a></li><li><a href="http://localhost:4000/getting-started/generate-an-application">어플리케이션 생성하기<span class="postbody">(○)</span></a></li><li><a href="http://localhost:4000/getting-started/project-structure">프로젝트 구조<span class="postbody">(○)</span></a></li><li><a href="http://localhost:4000/getting-started/mvc">MVC<span class="postbody">(○)</span></a></li><li><a href="http://localhost:4000/getting-started/controllers">컨트롤러<span class="postbody">(○)</span></a></li><li><a href="http://localhost:4000/getting-started/views">뷰<span class="postbody">(X)</span></a></li><li><a href="http://localhost:4000/getting-started/models">모델<span></span></a><span><a href="http://localhost:4000/getting-started/controllers"><span class="postbody">(○)</span></a></span></li><li><a href="http://localhost:4000/getting-started/request-path">리퀘스트 패스<span></span></a><span><a href="http://localhost:4000/getting-started/controllers"><span class="postbody">(○)</span></a></span></li><li><a href="http://localhost:4000/getting-started/router">라우터<span class="postbody">(X)</span></a></li></ol> </li><li> <p><a href="http://localhost:4000/interacting-with-the-database">데이터베이스와 상호작용</a></p> <ol><li><a href="http://localhost:4000/interacting-with-the-database/up">DataMapper 세팅<span class="postbody">(</span>○<span class="postbody">)</span></a></li><li><a href="http://localhost:4000/interacting-with-the-database/schema">데이터베이스 스키마<span class="postbody">(</span>△<span class="postbody">)</span></a></li><li><a href="http://localhost:4000/interacting-with-the-database/queries">데이터베이스 쿼리<span class="postbody">(</span>○<span class="postbody">)</span></a></li><li><a href="http://localhost:4000/interacting-with-the-database/relationships">모델 관계<span class="postbody">(X)</span></a></li><li><a href="http://localhost:4000/interacting-with-the-database/migrations">데이터베이스 마이그레이션<span class="postbody">(</span>○<span class="postbody">)</span></a></li><li><a href="http://localhost:4000/interacting-with-the-database/validations">유효성 검증<span class="postbody">(X)</span></a></li></ol> </li><li> <p><a href="http://localhost:4000/testing-your-application">어플리케이션 테스팅</a></p> <ol><li><a href="http://localhost:4000/testing-your-application/why">테스트를 하는 이유<span class="postbody">(△)</span></a></li><li><a href="http://localhost:4000/testing-your-application/models">모델 테스팅<span></span></a><span><a href="http://localhost:4000/interacting-with-the-database/validations"><span class="postbody">(X)</span></a></span></li><li><a href="http://localhost:4000/testing-your-application/requests">리퀘스트 테스팅<span></span></a><span><a href="http://localhost:4000/interacting-with-the-database/validations"><span class="postbody">(X)</span></a></span></li><li><a href="http://localhost:4000/testing-your-application/cucumber">RSpec Cucumber를 사용한 통합테스팅</a><a href="http://localhost:4000/testing-your-application/why"><span class="postbody">(△)</span></a></li></ol> </li><li> <p><a href="http://localhost:4000/merb-more">Merb More</a></p> <ol><li><a href="http://localhost:4000/merb-more/authentication">인증<span><span></span></span></a><span><span><a href="http://localhost:4000/getting-started/controllers"><span class="postbody">(○)</span></a></span></span></li><li><a href="http://localhost:4000/merb-more/mailer">메일러</a><span><a href="http://localhost:4000/interacting-with-the-database/validations"><span class="postbody">(X)</span></a></span></li><li><a href="http://localhost:4000/merb-more/caching">캐싱</a><span><a href="http://localhost:4000/interacting-with-the-database/validations"><span class="postbody">(X)</span></a></span></li><li><a href="http://localhost:4000/merb-more/exceptions">예외처리</a><span><a href="http://localhost:4000/interacting-with-the-database/validations"><span class="postbody">(X)</span></a></span></li><li><a href="http://localhost:4000/merb-more/slices">슬라이스</a><span><a href="http://localhost:4000/interacting-with-the-database/validations"><span class="postbody">(X)</span></a></span></li></ol> </li><li> <p><a href="http://localhost:4000/recipes">레시피</a></p> <ol><li><a href="http://localhost:4000/recipes/simple-blog">간단한 블로그</a><span><a href="http://localhost:4000/interacting-with-the-database/validations"><span class="postbody">(X)</span></a></span></li><li><a href="http://localhost:4000/recipes/blog-slice">블로그 슬라이스 만들기</a><span><a href="http://localhost:4000/interacting-with-the-database/validations"><span class="postbody">(X)</span></a></span></li></ol> </li><li> <p><a href="http://localhost:4000/deployment">배치</a></p> <ol><li><a href="http://localhost:4000/deployment/passenger">Passenger</a><a href="http://localhost:4000/testing-your-application/why"><span class="postbody">(△)</span></a></li><li><a href="http://localhost:4000/deployment/nginx">nginx</a><a href="http://localhost:4000/testing-your-application/why"><span class="postbody">(△)</span></a></li><li><a href="http://localhost:4000/deployment/jruby">JRuby 와 Glassfish<span><span></span></span></a><span><span><a href="http://localhost:4000/interacting-with-the-database/validations"><span class="postbody">(X)</span></a></span></span></li><li><a href="http://localhost:4000/deployment/bundle">어플리케이션 번들링<span><span></span></span></a><span><span><a href="http://localhost:4000/interacting-with-the-database/validations"><span class="postbody">(X)</span></a></span></span></li></ol> </li></ol> <ul id="appendices"><li> <p><a href="http://localhost:4000/appendix">부록</a></p> <ol><li><a href="http://localhost:4000/appendix/hints-tips">힌트와 팁/Tips<span><span></span></span></a><span><span><a href="http://localhost:4000/interacting-with-the-database/validations"><span class="postbody">(X)</span></a></span></span></li><li><a href="http://localhost:4000/appendix/slices">사용가능한 슬라이스들<span><span></span></span></a><span><span><a href="http://localhost:4000/interacting-with-the-database/validations"><span class="postbody">(X)</span></a></span></span></li><li><a href="http://localhost:4000/appendix/gems">유용한 Gem들<span><span></span></span></a><span><span><a href="http://localhost:4000/interacting-with-the-database/validations"><span class="postbody">(X)</span></a></span></span></li></ol> </li></ul>on the edge of Complexityhttp://www.blogger.com/profile/11692594157379801516noreply@blogger.comtag:blogger.com,1999:blog-6233787394794376169.post-78177019043406323312008-12-17T20:21:00.003+09:002008-12-17T20:33:33.087+09:00garage sale like notes<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_HbRZwpPnFNs/SUjjZafYopI/AAAAAAAAAUA/B6C9-chMQSE/s1600-h/omz:software_sketchbox.png"><img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 254px; height: 190px;" src="http://4.bp.blogspot.com/_HbRZwpPnFNs/SUjjZafYopI/AAAAAAAAAUA/B6C9-chMQSE/s320/omz:software_sketchbox.png" alt="" id="BLOGGER_PHOTO_ID_5280720588839101074" border="0" /></a><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_HbRZwpPnFNs/SUjjZBxweUI/AAAAAAAAAT4/EkWu8tBzyjI/s1600-h/Scribble.png"><img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 197px; height: 320px;" src="http://3.bp.blogspot.com/_HbRZwpPnFNs/SUjjZBxweUI/AAAAAAAAAT4/EkWu8tBzyjI/s320/Scribble.png" alt="" id="BLOGGER_PHOTO_ID_5280720582205274434" border="0" /></a><br /><br /><img style="width: 489px; height: 343px;" src="http://farm4.static.flickr.com/3275/3114628217_fe72831a40.jpg" alt="onenote.png" title="onenote.png" align="bottom" /><br /><br />iPhone, and desktop notes are hard to see them all in a big picture as Roam said.<br /><br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_HbRZwpPnFNs/SUjgwGCld4I/AAAAAAAAATw/4X04TKjkTGM/s1600-h/garage_sale.jpg"><img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 320px; height: 240px;" src="http://4.bp.blogspot.com/_HbRZwpPnFNs/SUjgwGCld4I/AAAAAAAAATw/4X04TKjkTGM/s320/garage_sale.jpg" alt="" id="BLOGGER_PHOTO_ID_5280717679951705986" border="0" /></a>on the edge of Complexityhttp://www.blogger.com/profile/11692594157379801516noreply@blogger.comtag:blogger.com,1999:blog-6233787394794376169.post-49202179538256395612008-12-17T18:54:00.009+09:002008-12-17T19:17:44.616+09:003D desktop and ruby<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_HbRZwpPnFNs/SUjO0bK9bdI/AAAAAAAAATg/mNNTdiXviUY/s1600-h/apple_3d_desktop_patent.png"><img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 320px; height: 226px;" src="http://1.bp.blogspot.com/_HbRZwpPnFNs/SUjO0bK9bdI/AAAAAAAAATg/mNNTdiXviUY/s320/apple_3d_desktop_patent.png" alt="" id="BLOGGER_PHOTO_ID_5280697963134152146" border="0" /></a><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br />As <a href="http://www.macrumors.com/2008/12/11/apple-exploring-3d-desktop-and-application-interfaces/">the rumor</a> says, it is obvious that Apple is developing next OSX. 3D environment is the critical difference. Bumptop desktop could be similar with it. Trends are really clear. Wiimote, Jeff Han's Ted demo, and Ubuntu Compiz fusion. The new era of HCI has come. But there're little apps which are appropriate with these environments. Adobe launched AIR, and it is still early for general users. But it is certain that adoptions are growing.<br /><br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_HbRZwpPnFNs/SUjPB_hT7hI/AAAAAAAAATo/zZdWbs2AyAg/s1600-h/k3_lglass_gallery3.gif"><img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 320px; height: 256px;" src="http://1.bp.blogspot.com/_HbRZwpPnFNs/SUjPB_hT7hI/AAAAAAAAATo/zZdWbs2AyAg/s320/k3_lglass_gallery3.gif" alt="" id="BLOGGER_PHOTO_ID_5280698196229877266" border="0" /></a><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br />Now, we see java 3d OS. Where is shining, rich ruby desktop environment! Do we need to learn Air to mimic 3d actions?on the edge of Complexityhttp://www.blogger.com/profile/11692594157379801516noreply@blogger.comtag:blogger.com,1999:blog-6233787394794376169.post-62536996752286883882008-12-09T19:16:00.001+09:002008-12-09T19:33:55.048+09:00morganstanley - Presentation from Web 2.0 Summit<div style="width: 425px; text-align: left;" id="__ss_725248"><a style="margin: 12px 0pt 3px; font-family: Helvetica,Arial,Sans-serif; font-style: normal; font-variant: normal; font-weight: normal; font-size: 14px; line-height: normal; font-size-adjust: none; font-stretch: normal; display: block; text-decoration: underline;" href="http://www.slideshare.net/hblodget/mary-meeker-web-20-presentation-presentation?type=powerpoint" title="Mary Meeker Web 2.0 Presentation">Mary Meeker Web 2.0 Presentation</a><a style="left: 0px ! important; top: 0px ! important;" title="Adblock Plus로 이 객체를 차단하려면 여기를 누르십시오." class="abp-objtab-03433276582795671 visible" href="http://static.slideshare.net/swf/ssplayer2.swf?doc=techtrendsweb2110508-1225933600339539-9&stripped_title=mary-meeker-web-20-presentation-presentation"></a><a style="left: 0px ! important; top: 0px ! important;" title="Adblock Plus로 이 객체를 차단하려면 여기를 누르십시오." class="abp-objtab-03433276582795671 visible" href="http://static.slideshare.net/swf/ssplayer2.swf?doc=techtrendsweb2110508-1225933600339539-9&stripped_title=mary-meeker-web-20-presentation-presentation"></a><object style="margin: 0px;" height="355" width="425"><param name="movie" value="http://static.slideshare.net/swf/ssplayer2.swf?doc=techtrendsweb2110508-1225933600339539-9&stripped_title=mary-meeker-web-20-presentation-presentation"><param name="allowFullScreen" value="true"><param name="allowScriptAccess" value="always"><embed src="http://static.slideshare.net/swf/ssplayer2.swf?doc=techtrendsweb2110508-1225933600339539-9&stripped_title=mary-meeker-web-20-presentation-presentation" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" height="355" width="425"></embed></object><div style="font-size: 11px; font-family: tahoma,arial; height: 26px; padding-top: 2px;">View SlideShare <a style="text-decoration: underline;" href="http://www.slideshare.net/hblodget/mary-meeker-web-20-presentation-presentation?type=powerpoint" title="View Mary Meeker Web 2.0 Presentation on SlideShare">presentation</a> or <a style="text-decoration: underline;" href="http://www.slideshare.net/upload?type=powerpoint">Upload</a> your own. (tags: <a style="text-decoration: underline;" href="http://slideshare.net/tag/trends">trends</a> <a style="text-decoration: underline;" href="http://slideshare.net/tag/web">web</a>)</div></div><br /><br /><br /><br /><br />Motorola hired 350 people for Android.on the edge of Complexityhttp://www.blogger.com/profile/11692594157379801516noreply@blogger.comtag:blogger.com,1999:blog-6233787394794376169.post-32648013185144532262008-12-05T12:23:00.000+09:002009-01-17T09:13:06.111+09:00Paul Hughes: Design Thinking's photostream<object width="400" height="300"> <param name="flashvars" value="&offsite=true&lang=en-us&page_show_url=%2Fphotos%2Fpaulhughes%2Fshow%2F&page_show_back_url=%2Fphotos%2Fpaulhughes%2F&user_id=21296916@N03&jump_to="></param> <param name="movie" value="http://www.flickr.com/apps/slideshow/show.swf?v=63961"></param> <param name="allowFullScreen" value="true"></param><embed type="application/x-shockwave-flash" src="http://www.flickr.com/apps/slideshow/show.swf?v=63961" allowFullScreen="true" flashvars="&offsite=true&lang=en-us&page_show_url=%2Fphotos%2Fpaulhughes%2Fshow%2F&page_show_back_url=%2Fphotos%2Fpaulhughes%2F&user_id=21296916@N03&jump_to=" width="400" height="300"></embed></object>on the edge of Complexityhttp://www.blogger.com/profile/11692594157379801516noreply@blogger.comtag:blogger.com,1999:blog-6233787394794376169.post-61864336165317616392008-12-03T20:43:00.007+09:002009-01-02T13:39:44.301+09:00look, see, imagine<div xmlns="http://www.w3.org/1999/xhtml">Recently I've read "The Back of the Napkin". And Here is what I'm thinking.<br />I think it is really hard to see the big picture in these days. There are just too many informations to catch up.<br /><img style="max-width: 800px;" src="http://lh5.ggpht.com/_HbRZwpPnFNs/STZLRiSA12I/AAAAAAAAASY/lWeuWHTB2-Y/%5BUNSET%5D.jpg?imgmax=800" /><br /><br />We're gathering informations by emails, RSS, twitter, conversations and so on. But have you really gone through all the star-marked articles? Well, I haven't.<br /><br /><img style="max-width: 800px;" src="http://lh4.ggpht.com/_HbRZwpPnFNs/STZLYoq3zzI/AAAAAAAAASc/mNEfHJgCuec/%5BUNSET%5D.jpg?imgmax=800" /><br /><br />And there are web apps that makes me do extra things. Some apps look promising to me except I don't have a mac.<br /><div class="youtube-video"><a style="left: 0px ! important; top: 0px ! important;" title="Adblock Plus로 이 객체를 차단하려면 여기를 누르십시오." class="abp-objtab-0058575608755113806 visible ontop" href="http://www.youtube.com/v/i_ncr1Ee9e8&rel=0&color1=0xb1b1b1&color2=0xcfcfcf&feature=player_embedded&fs=1"></a><a style="left: 0px ! important; top: 0px ! important;" title="Adblock Plus로 이 객체를 차단하려면 여기를 누르십시오." class="abp-objtab-0058575608755113806 visible ontop" href="http://www.youtube.com/v/i_ncr1Ee9e8&rel=0&color1=0xb1b1b1&color2=0xcfcfcf&feature=player_embedded&fs=1"></a><a style="left: 0px ! important; top: 0px ! important;" title="Adblock Plus로 이 객체를 차단하려면 여기를 누르십시오." class="abp-objtab-0058575608755113806 visible ontop" href="http://www.youtube.com/v/i_ncr1Ee9e8&rel=0&color1=0xb1b1b1&color2=0xcfcfcf&feature=player_embedded&fs=1"></a><a style="left: 0px ! important; top: 0px ! important;" title="Adblock Plus로 이 객체를 차단하려면 여기를 누르십시오." class="abp-objtab-0058575608755113806 visible ontop" href="http://www.youtube.com/v/i_ncr1Ee9e8&rel=0&color1=0xb1b1b1&color2=0xcfcfcf&feature=player_embedded&fs=1"></a><a style="left: 0px ! important; top: 0px ! important;" title="Adblock Plus로 이 객체를 차단하려면 여기를 누르십시오." class="abp-objtab-0058575608755113806 visible ontop" href="http://www.youtube.com/v/i_ncr1Ee9e8&rel=0&color1=0xb1b1b1&color2=0xcfcfcf&feature=player_embedded&fs=1"></a><a style="left: 0px ! important; top: 0px ! important;" title="Adblock Plus로 이 객체를 차단하려면 여기를 누르십시오." class="abp-objtab-029854344656011766 visible ontop" href="http://www.youtube.com/v/i_ncr1Ee9e8&rel=0&color1=0xb1b1b1&color2=0xcfcfcf&feature=player_embedded&fs=1"></a><a style="left: 0px ! important; top: 0px ! important;" title="Adblock Plus로 이 객체를 차단하려면 여기를 누르십시오." class="abp-objtab-029854344656011766 visible ontop" href="http://www.youtube.com/v/i_ncr1Ee9e8&rel=0&color1=0xb1b1b1&color2=0xcfcfcf&feature=player_embedded&fs=1"></a><a style="left: 0px ! important; top: 0px ! important;" title="Adblock Plus로 이 객체를 차단하려면 여기를 누르십시오." class="abp-objtab-029854344656011766 visible ontop" href="http://www.youtube.com/v/i_ncr1Ee9e8&rel=0&color1=0xb1b1b1&color2=0xcfcfcf&feature=player_embedded&fs=1"></a><a style="left: 0px ! important; top: 0px ! important;" title="Adblock Plus로 이 객체를 차단하려면 여기를 누르십시오." class="abp-objtab-029854344656011766 visible ontop" href="http://www.youtube.com/v/i_ncr1Ee9e8&rel=0&color1=0xb1b1b1&color2=0xcfcfcf&feature=player_embedded&fs=1"></a><object height="344" width="425"><param value="http://www.youtube.com/v/i_ncr1Ee9e8&rel=0&color1=0xb1b1b1&color2=0xcfcfcf&feature=player_embedded&fs=1" name="movie"> <param value="true" name="allowFullScreen"> <embed allowfullscreen="true" type="application/x-shockwave-flash" src="http://www.youtube.com/v/i_ncr1Ee9e8&rel=0&color1=0xb1b1b1&color2=0xcfcfcf&feature=player_embedded&fs=1" height="344" width="425"></embed> </object></div></div><br /><br /><br /><br /><div style="text-align: left;">After reading Alan Greenspun's "The Age of Turbulence", I'm sure that the global economy's speed is really fast like light. It's out of control in this hot, flat, crowded world even for FRB.<br /></div><br />How can we catch up all these informations? May be, no one can. But they only pay their attentions on something meaningful to them. <a href="http://www.mckinseyquarterly.com/Googles_view_on_the_future_of_business_An_interview_with_CEO_Eric_Schmidt_2229?pagenum=1#interactive_google_schmidt">As Eric Schmidt says</a>, most of us focus on the head, not the tail. Why? Because there is so little time to spend on reading, studying, and even eating. Most of people do what they have been doing. But there are specific needs. And they start to google it or to digg it. They already have established their information sources. It could be friends, social networking sites, ranking sites, or a RSS reader. Here it comes, "Look, see, imagine".<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_HbRZwpPnFNs/STdXyEXjJCI/AAAAAAAAASw/gMWIV4c3FWY/s1600-h/long-tail-graph.gif"><img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 198px; height: 143px;" src="http://1.bp.blogspot.com/_HbRZwpPnFNs/STdXyEXjJCI/AAAAAAAAASw/gMWIV4c3FWY/s400/long-tail-graph.gif" alt="" id="BLOGGER_PHOTO_ID_5275782006165414946" border="0" /></a><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_HbRZwpPnFNs/STdblaTawFI/AAAAAAAAAS4/o95P80Mvz84/s1600-h/multitouch-jeff_han.jpg"><img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 190px; height: 142px;" src="http://1.bp.blogspot.com/_HbRZwpPnFNs/STdblaTawFI/AAAAAAAAAS4/o95P80Mvz84/s400/multitouch-jeff_han.jpg" alt="" id="BLOGGER_PHOTO_ID_5275786186761879634" border="0" /></a><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br />I don't have enough room to post every data that I've gathered. And it would consume a lot of ink and papers. Why there is no software that help me to see the big picture?on the edge of Complexityhttp://www.blogger.com/profile/11692594157379801516noreply@blogger.com0tag:blogger.com,1999:blog-6233787394794376169.post-7831048911214742422008-11-20T13:37:00.001+09:002008-11-20T18:38:45.585+09:00Comment on Google CEO Interview<br /><br /> <br /> <br /> <br /><div><br /><div><br /><div><br /> 1. 지금 구글은 안드로이드와 기존의 플랫폼을 연계, GPS를 활용한 광고 등을 사용하여 기기 자체는 거의 공짜로 공급하는 것을 생각중 <br><br /> 2. 롱테일 관점에서 80%를 차지하는 부분이 더 가속화. 브랜드가 강화될 것. 물론 테일 부분도 놓치면 안됨 <br><br />3. 애플의 모바일미는 시기상조였음. 서비스 자체가 단조롭고 진짜로 도움이 되질 않음. 별반 다를게 없었던 것<br><br />4. 먼저 웹상에서 탄탄한 기반을 가지고 나서야 모바일 서비스의 의미가 있을 것임.<br><br />5. RFID, GPS, Sensor network 등이 갖춰졌을때 에릭슈미트가 이야기하는 서비스들이 나올 것. 그 전까지는 현재의 스마트폰이나 아이팟처럼 컨텐츠를 데스크탑에서 다운받아서 싱크하는 형태로 2-3년간 지속될 가능성이 큼.<br><br /></div></div><br /><div id="eu5x" style="padding: 1em 0pt; text-align: left;"><img style="width: 502px; height: 422px;" src="http://docs.google.com/File?id=dgqskm5q_24frj9gngh_b"></div><br /></div><br />6. 애플의 플랫폼이냐 구글의 플랫폼이냐는 좀 더 두고봐야 하겠지만 서비스가 웹상에서 먼저 정착이 되야 하므로 기다리면서 관망하는 것도 가능. (구글이 블로거를 인수하긴 했지만 블로깅에서는 워드프레스가 우위 )<br><br />7. 애플 아이폰이 선전하고 있으나 전체 마켓쉐어는 아직 멀었음. <br><br />8. 애플은 아이튠즈를 통한 어플리케이션 시장을 벌써 형성했음. 이에 반해 구글은 이제 막 안드로이드를 정착시켜나가야 하는 형태. 만약 구글이 노키아나 삼성, 모토롤라를 아우르는 협력을 끌어내어 안드로이드를 장착시킨다면 이야기가 달라짐. <br><br /><ul></ul><br />9. 위의 경우는 쉽지 않을 것. 각 업체들이 원하는 바를 통합시키는 것에 대한 시간이 걸릴 것. 그런면에서 애플이 타이밍이나 속도면에서 우위임.<br>on the edge of Complexityhttp://www.blogger.com/profile/11692594157379801516noreply@blogger.com0tag:blogger.com,1999:blog-6233787394794376169.post-67359655908962488692008-08-22T13:40:00.001+09:002008-08-22T13:40:23.622+09:00me.com simple UI<div xmlns='http://www.w3.org/1999/xhtml'><img height='283' width='406' src='http://lh5.ggpht.com/jaigouk/SK5BibMdlWI/AAAAAAAAANc/hFGUU8TUkG8/%5BUNSET%5D.png' style='max-width: 800px;'/><br/><br/><img height='283' width='407' src='http://lh5.ggpht.com/jaigouk/SK5BvrQAKMI/AAAAAAAAANg/JPMgdUvTPNc/%5BUNSET%5D.png' style='max-width: 800px;'/><br/><br/><img height='284' width='409' src='http://lh5.ggpht.com/jaigouk/SK5B8kMIPRI/AAAAAAAAANk/3Pu0Elwe924/%5BUNSET%5D.png' style='max-width: 800px;'/><br/><br/><img height='273' width='406' src='http://lh3.ggpht.com/jaigouk/SK5CHC4QcFI/AAAAAAAAANo/OGeJ3Llcock/%5BUNSET%5D.png' style='max-width: 800px;'/><br/><br/><br/>Well, on my ubuntu 8.04 file attachment was not working properly. It seems that the UI is so simple that it even makes me feels paying for this app is expensive. <br/></div>on the edge of Complexityhttp://www.blogger.com/profile/11692594157379801516noreply@blogger.com0tag:blogger.com,1999:blog-6233787394794376169.post-22518703164252986822008-08-22T07:47:00.013+09:002009-01-17T09:12:03.204+09:00Rails 2.1 OSX Finder like ColumnNav.<img id="BLOGGER_PHOTO_ID_5237110930105117042" alt="" src="http://3.bp.blogspot.com/_HbRZwpPnFNs/SK30pL47KXI/AAAAAAAAAL4/v-F_3LfWXlk/s400/ColumNav.png" style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" border="0" />original google code : http://columnav.googlecode.com/svn/trunk/index.html<br /><blockquote><br /><b>Update(22/8/2008)</b>:<br />Since ResponseHeader was "applicatoin/json <b>;utf8</b> ",<br />The original code does not work.<br /><br />in columnav.js,<br /><i><u>Before</u>:</i><br />var contentType = o.getResponseHeader['Content-Type'];<br /> if ('application/json' == contentType.replace(/\s+$/,'')) {<br /><br /><i><u>After:</u></i><br />var contentType = o.getResponseHeader['Content-Type'];<br /> var compareString = contentType.replace(/\s+$/,'')<br /> if (compareString.include('application/json')) {<br /></blockquote><br /> <br /><br />It was not easy to implement "finder" with extjs. And furthermore, my codes were getting ugly. Almost hard to see. So I abandoned Extjs on the user-view. I've decided to use it on admin pages.<br /><br /><br /><br /><blockquote>ColumNav is a hierarchical menu implementation utilizing Bill Scott's <a href="http://developer.yahoo.com/yui/">Yahoo UI</a> <a href="http://billwscott.com/carousel/">Carousel component</a>. Content is loaded from an unordered list and displayed in a scrollable viewport, similar to Column View in the <a href="http://en.wikipedia.org/wiki/Image:Finder1.png">Mac OS X Finder</a>.<br /></blockquote><br /><br /><p></p><p><strong>Features include:</strong></p><strong> <br /><ul><li><strong>infinite extensibility using Ajax to build sub-menus</strong></li><li><strong>instantiation from DOM or JSON data sources</strong></li><li><strong>a highly customizable look and feel using CSS</strong></li><li><strong>support for multiple columns</strong></li><li><strong>support for keyboard-only navigation (<kbd>CTRL</kbd> + arrow keys)</strong></li><li><strong>cross-browser compatibility</strong></li></ul><strong><br />App/views/Categories/index.html<br /></strong><br /><br /><pre rows="15" class="javascript:nogutter:collapse" name="code" cols="40"><br /><% content_for :head do%><br /><br /><br /> <%= stylesheet_link_tag 'cssbits_notice' %><br /> <%= stylesheet_link_tag 'columnav', 'columnav_apply' %><br /> <%= javascript_include_tag :defaults %><br /> <%= javascript_include_tag "columnav/yui/yahoo-min" %><br /> <%= javascript_include_tag "columnav/yui/utilities" %><br /> <%= javascript_include_tag "columnav/yui/container_core-min" %><br /> <br /> <%= javascript_include_tag "columnav/carousel_min" %><br /> <%= javascript_include_tag "columnav/columnav" %><br /> <%= javascript_include_tag "columnav/columnav_json_parsing" %><br /><br /><br /><% javascript_tag do %><br /> try { document.execCommand('BackgroundImageCache', false, true); } catch(e) {}<br /><br /><br /> function init() {<br /> var cn_cfg = {<br /> numVisible: 3,<br /> prevElement: 'columnav-prev',<br /> datasource: '/categories/columntree/1.json'<br /> };<br /> var cn = new YAHOO.extension.ColumNav('columnav', cn_cfg);<br /> }<br /> YAHOO.util.Event.addListener(window, 'load', init);<br /><% end %><br /> <br /><% end %><br /><br /><br /><div class="prevButton"><br /> <a href="javascript:void(0)" id="columnav-prev">< back</a><br /></div><br /><br /><div id="columnav" class="carousel-component"><br /> <div class="carousel-clip-region"><br /> <ul class="carousel-list"><br /> </ul><br /> </div><br /></div><br /></pre><br /><br />App/controllers/Categories_controller.rb<br /></strong><br /><pre rows="15" class="ruby:nogutter:collapse" name="code" cols="40"><br /><br />def columntree(id = params[:id])<br /> categories = Category.find_all_by_parent_id(id)<br /><br /> data = get_tree(categories, id)<br /> respond_to do |format|<br /> format.json { render :text => data[0].to_json, :layout => false }<br /> end <br />end <br /><br /> <br />def get_tree(categories, parent_id) <br /> parent = Category.find_by_id(parent_id)<br /> data = Array.new<br /> data.concat([ "ul" => insert(categories, parent) ])<br /> return data <br />end<br /><br />def insert(categories, parent)<br /> result = Array.new<br /> result.concat(["li" => insert_data(categories, parent) ])<br />return result[0]<br />end<br /><br />def insert_data(categories, parent)<br /> iterated = Array.new<br />categories.each { |category|<br /> if !category.leaf? <br /> iterated.concat(["a" => {"#text" => category.text, "@href" => "/categories/columntree/"+category.id.to_s+".json", "@rel" => "ajax"}, "id" => category.id]) # "@rel" => "ajax" 면 폴더로 인식.<br /> else <br /> iterated.concat(["a" => {"#text" => category.text, "@href" => "http://peepcode.com"}, "id" => category.id]) <br /> end <br /> }<br />return iterated<br />end<br /><br /></pre><br /><br />app/models/category.rb<br /><br /><pre rows="15" class="javascript:nogutter:collapse" name="code" cols="40"><br />class Category < dependent =""> :nullify<br /> has_many :portfolios, :dependent => :nullify<br /><br /> acts_as_nested_set<br /><br /> validates_presence_of :text<br /><br />has_attached_file :photo,<br /> :styles => { :medium => "220x180#", :thumb => "100x82#" },<br /> :path => "#{RAILS_ROOT}/public/images/category_photos/:id/:style_:basename.:extension",<br /> :url => "/images/category_photos/:id/:style_:basename.:extension",<br /> :default_url => "/images/category_photos/missing.png",<br /> :whiny_thumbnails => true<br /><br /><br />#liquid<br />liquid_methods :text<br /><br /># extjs를 위한 코드임<br /><br /> def self.root_nodes<br /> find(:all, :conditions => 'parent_id IS NULL')<br /> end<br /><br /> def self.find_children(start_id = nil)<br /> start_id.to_i == 0 ? root_nodes : find(start_id).direct_children<br /> end<br /> <br /> def children<br /> Category.find_all_by_parent_id(self.id)<br /> end<br /><br /> def self.find_level1<br /> find_all_by_parent_id(1)<br /> end<br /> <br /> def leaf<br /> unknown? || children_count == 0<br /> end<br /><br /> def leaf?<br /> unknown? || children_count == 0<br /> end<br /><br /><br /> def to_json_with_leaf(options = {})<br /> self.to_json_without_leaf(options.merge(:methods => :leaf))<br /> end<br /> alias_method_chain :to_json, :leaf<br /> private<br />end<br /></pre>on the edge of Complexityhttp://www.blogger.com/profile/11692594157379801516noreply@blogger.com0