RoRに入門している

先週末にコメダでFlask談義をしていた時に、@ando_ando_andoに浮気しているとか言われたんだけど、RedmineもFastladderもRails使ってんだからしょうがないじゃんと答えておいた。

というわけで、最近Railsを学んでいる。

ProductName Ruby on Rails 3 アプリケーションプログラミング
山田 祥寛
技術評論社 / 3675円 ( 2011-05-12 )


この本をひと通り読んだけど、もっといい本はないものか?

あと同僚にPythonで書けよって言っても無視してレガシーなperlを書こうとするので、Perl徹底攻略を薦めておいた。

ProductName Perl徹底攻略 (WEB+DB PRESS plus)
大沢 和宏
技術評論社 / 2289円 ( 2013-07-23 )


ま、オブジェクト指向プログラミングから学ばないとあかんと思うけど、頑張って覚えるしかないよねー。

あと年末に三島Haskell無名の関数の会(忘年会)やりたいっすね。最近Haskell書いてないからそろそろなんか書かないとなーって思っている。

初めてのRubyを読みなおした

先日Rubyの本が届いた

1377515805

これを機会にということで初めてのRubyを読みなおした(5年ぶりか) 5年も経つので改めて読んだら、言語の仕様とかふむふむなるほどーと面白く読めた

  • 「?」「!」は単なる命名習慣
  • 二重引用符と一重引用符はバックスラッシュの扱いがことなる
  • シンボルオブジェクトはプロセス内で唯一
  • privateメソッドは常にレシーバ省略形式で呼びださなければならない
  • ブロックをオブジェクトとして渡したい場合には仮引数リストの最後に&で収縮された引数を置く

ProductName 初めてのRuby
Yugui
オライリージャパン / 2310円 ( 2008-06-26 )


速いredmineは正しい

Redmineの性能を検証した事例~ITS応答性能の調査結果と対策編を読んでのスライドにWEB+DB PRESS Vol.70を読めと書いてあったので、

おーこれは早速買わなきゃと思ってAmazon開いたら既に購入済みだった。

ProductName WEB+DB PRESS Vol.70
成田 一生
技術評論社 / 1554円 ( 2012-08-24 )


おもいっきり読み飛ばしてたので今から読む。

「Ruby on Rails 3 アプリケーションプログラミング」を読んだ

既に他のWAFを知っている場合の入門書として良いのではないかと。自分の知識をテコにして手っ取り早く知りたいことが知れるしね。僕は特に規約のあたりの知識を入れたかったので十分役に立った。

ProductName Ruby on Rails 3 アプリケーションプログラミング
山田 祥寛
技術評論社 / 3675円 ( 2011-05-12 )


インストールとか

Rubyはrbenv使いたかったのでMac OS X(Lion)にRuby on Rails 3.2の開発環境を構築するを参考にした。

brew update
brew install rbenv
brew install ruby-build
brew install readline
brew link readline
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
source ~/.bash_profile
rbenv install 1.9.3-p286
rbenv global 1.9.3-p286
gem update --system
gem update rake
gem install rails --no-ri --no-rdoc

RoRのマイグレーション便利そう

migrateっていまいちよく理解せずに言われるがままに叩いてたのだけど、これはなかなか便利そう。Python(SQLAlchemy)でも同じようなものがないかなーと探したらAlembicを見つけたので見てみる。

resources

FlaskだったらFlask-RESTful使えばいいんだろうけど、formをウェブ画面に表示するときのURLで良く悩む。

RoRのresourcesメソッドだと

  • /books/new(.:format)で新規登録画面
  • /books/:id/edit(.:format)で編集画面

って決まっているらしいので僕のFlaskアプリもこの規約に従おうっと。

その他

Rails consoleというコマンドでコンソールが起動できる

Redmineに手を入れたくなったのでRuby on Rails 3を学んでみることにした

Ruby on Rails製のソフトウェアはいくつか利用しているけど、自分でつくったことはないし、コードのそれっぽいところを探して手を入れたりするくらいなので、RoRの規約とかよくわかってない。

最近Redmineに手を入れたくなってきたので、ソースコードリーディングするついでにさわりくらいはRoRを学んでおこうかなと思ったので、本を読み始めた。

ProductName Ruby on Rails 3 アプリケーションプログラミング
山田 祥寛
技術評論社 / 3675円 ( 2011-05-12 )


rubyもrbenvで入れなおすのがよいのか?

JekyllかHydeかHakyllかはたまたObrazか

GitHub Pagesを管理するのに、Jekyllっぽいstatic site generatorを探している。ついでに、さくっと開発するためのボイラープレートとかTipsとかも知りたいんだけど、僕の観測範囲では見つけることができなかった。

やっぱ、Siteのデザイン眺めて、ヨサゲなサイトのデザインとかCSSとかを参考にして自分用テンプレートを作って管理するしかないのかなぁ。

twitter bootstrapは便利なんだけど、twitter bootstrap臭が消えないよね(モバイルで見やすいので気に入っているんだけど)。もう少しミニマルなtwitter bootstrapの作り方みたいなのも知りたいなぁ。

Jekyll

JekyllはRuby製で日本語の情報も結構ある。

来月GitHubのハンズオンやるから、Jekyllってその後のハンズオンネタとしてちょうどいいんじゃないか?と思って色々調べてたんだけど、結局HTMLとかCSSにいっちゃうみたいなんで、最初の方に書いたような感じになっている。

Hyde or Obraz

HydeはDjangoのテンプレートエンジンとか使っているらしいんだけど、僕はJinja派なのでちょっと避けた。

最近、ObrazっていうテンプレートエンジンにJinja2を使っているstatic site generatorを見つけたので、こっち使ってみようかなぁと思っている。コードも500行未満らしいので一度読んでみようっと。

Hakyll

Haskell製のstatic site generator

Hakyll is a Haskell library for generating static sites, mostly aimed at small-to-medium sites and personal blogs. It is written in a very configurable way and uses an xmonad-like DSL for configuration.

Shizudevつくる会のgithub organizationsのサイトはこれを使ってみようと思っている。なぜなら、静岡東部にはHaskellerが3人以上存在するからだ。これは人口比率から考えてもそこそこ高いのではないかと思っているがどうなんだろ?

それから「静岡県の形は世界的にも有名なプログラム言語Haskellのロゴマークである「λ(ラムダ)」に似ているからね。

というわけで、いまはHakyllを使ってみようかなぁと考えている。誰か今度のつくる会で黙々してみませんか?

ゲノム言語ATGC

プログラムとして実行できるfasta形式のプログラミング言語を作ってみた。いちおうチューリング完全(なはず)。

>HELLO_WORLD
ccggaccgcg gggcaccgcc ggcggaccgc cgccggaccg cccggcgacc gccgccccac
cgcccgccca ccgcggggga ccgccgcccc accgccgccg gaccgccgcc ggaccgccgg
cgcaccgcgg cgggaaccga cacatccata ccacagaacc caaaa

これはatgcというコマンドで解釈して実行します。

$ bin/atgc hello_world.fasta 
Hello world!

ゲノム的にGCリッチなほうがいいだろうということで0と1にg,cをそれぞれ割り当てて数字を表現するようにしてる。exitコマンドには終止コドンを割り当てようかとも思ったが、なんとなくaaaにしてみた(polyA)。

しかも(というか当たり前だけど)blastでホモロジーサーチがかけられるし、multifastaにしておけばソース管理もできるうえに、データベース化してインデックスはっておけば、NCBIのツール群でコマンド一発で取り出せる。

ただ今回作ったHELLO_WORLDの配列はblastnだといい感じにヒットしなくて悲しかったので、blastxかけたらブラックコットンウッドからなんかひっかかった。

>gb|ABK94795.1|  unknown [Populus trichocarpa]
Length=229

 Score = 33.5 bits (75),  Expect = 5.9
 Identities = 14/21 (66%), Positives = 15/21 (71%), Gaps = 0/21 (0%)
 Frame = +1

Query  100  GPPPDRRRTAAGTDTSIPQNP  162
            GPPPDRRRT  GT  S P +P
Sbjct  209  GPPPDRRRTRQGTTKSEPASP  22

VMとかは特にいじってないのでEsotericの本を参照のこと。

ProductName Rubyで作る奇妙なプログラミング言語 ~Esoteric Language~
原 悠
毎日コミュニケーションズ / ?円 ( 2008-12-20 )


VMを使った中間言語方式の強力さを理解した。

追記 2012.07.31

ソースをGitHubに移した

$ ./bin/atgc examples/shizuoka.fasta

                                                  **
                                                 **
                                              ****
                                              ******
                                              ******
                                            ********
                                              ****                  ******
                                            ********              ******      ************
                                          ********              **************************
                                     ****************            **********************
                              **********************        **********************
                          **************************      ************************
                        **************************          **********************
                        **********************************************************
                    ******************************************   ******************
                  ****************************************                ************
                  **************************************                ****************
                ************************************                    ****************
              **************************************               ********************
           **************************************                ************************
        ************************************                      ************************
        **************************************                    **********************
  ******************************************                    ********************
************************************************                  ********************
****      ********************************                        ********************
****     **************** **************                              ****************
**************************************                              **************
                 ****************************                                ******
                                          **********

Rubyスクリプティングテクニック

あまりテスト駆動じゃなかった。

ProductName Rubyスクリプティングテクニック ―テスト駆動による日常業務処理術
Brian Marick
オライリー・ジャパン / 2625円 ( 2008-02-23 )


例題やりたかったら、テスト駆動JavascriptかPython Testingがいいと思う。

ProductName テスト駆動JavaScript
Christian Johansen
アスキー・メディアワークス / ?円 ( 2011-11-25 )


ProductName Python Testing: Beginner's Guide
Daniel Arbuckle
Packt Publishing / 3220円 ( 2010-01-31 )


Rubyスクリプティングテクニック

ちょっと気になった本

ProductName Rubyスクリプティングテクニック ―テスト駆動による日常業務処理術
Brian Marick
オライリー・ジャパン / 2625円 ( 2008-02-23 )


テストファーストっていうところに興味がわいた。Rubyが物足りなければCoffeeScriptでかきなおすのも面白いかなぁと

RubyのgsubをCoffeeScriptで

Rubyのgsubはblockを受け取ってマッチするたびにブロック内の処理内容を変えられるので便利。

irb(main):002:0> i = 0
=> 0
irb(main):003:0> 'a-a-a-a'.gsub(/a/){i += 1}
=> "1-2-3-4"

Node.jsでも同じようなことがやりたかったのでRuby's String gsub in Javascriptをちょっと変更して配列を受け取れるようにしてみた。

gsub = (source, pattern, replacements) ->
  unless pattern? and replacements?
    return source

  result = ''
  while source.length > 0
    if (match = source.match(pattern))
      result += source.slice(0, match.index)
      result += replacements.shift()
      source = source.slice(match.index + match[0].length)
    else
      result += source
      source = ''
   result

console.log gsub('a-a-a-a', /a/, [1..4])