Back to Perl

『たのしいRuby』は土曜で第3部まで終わったので区切りをつけ、今日は再び『Perl言語プログラミングレッスン』をやりました。

『Perl言語プログラミングレッスン』の不思議なたのしさの源泉は、丁寧な解説と構成にあります。文章も適切ですが、それ以上に読者に与える情報の順番が適切で、よく整理されている。結果として読者は、不明な点を解消しつつ、着実にステップアップすることができます。

Perlのモットーは「There’s more than one way to do it.(やり方は他にもはある)」。一つの機能を実現するにも様々な書き方ができる。そのため、初心者向けの言語としては向かない印象もあります。しかし、『Perl言語プログラミングレッスン』では、結城浩氏の巧みな整理によって、様々な書き方があることに伴う混乱は最小限に抑えられています。

一方で、Perlに戻って実感するのは、Rubyのラクさ。Rubyは、行末のセミコロンだとか、条件式の括弧だとかいっためんどくさい要素が排除されています。したがって、プログラミングの好きな人が、プログラミングの楽しさを味わうには向いている言語だと思います。

GitHub始めました

アカウントは以前から取ってたのですが、ほぼ休眠状態でした。

ひと通りセットアップが終わったので、書いたものの中から適当に選んで上げていきたいと思います。できれば毎日、何かしらは書いてUPしたい。

https://github.com/ryo-utsunomiya

現在は、 https://github.com/ryo-utsunomiya/Ruby に『たのしいRuby 第3版』の答案など上げています。

オライリーのiOSアプリをePubファイルに変換する

先日、iOSアプリの『CSS Cookboook』を購入したのですが、どうも動作がおかしい。ページめくりが効かないことが多々ある。

ということで、アプリの販売元であるO’riley Mediaにメールをしてみました(最初はオライリー・ジャパンにメールしたのですが、アプリのことは知らないのでO’riley Mediaに問い合わせてくれ、と返事がきました)。

返ってきたメール:

Some of our iPhone apps don’t work well with IOS 5.  Here is a blog post
that shows you how to extract the ePub file from that app and use it in
iBooks on your phone –
http://zef.me/3246/convert-cheap-oreilly-iphone-app-books-to-epub

オライリーのiOSアプリにはiOS 5で上手く動かないものがあるから、アプリからデータを取り出してePubファイルにして読んでね、とのこと。

で、実際にやってみました。リンク先のブログ記事もスクリーンショットがあって十分わかりやすいのですが、一応手順を書いておきます。なお、操作はMac OS X Lionのものですが、Windows 7でもほとんど変わりません。

  1. iTunesでお目当てのアプリを見つけて右クリック > Finderで表示
  2. 出てきた.ipaファイルを複製
  3. 複製した.ipaファイルの拡張子を.zipに変更
  4. .zipファイルを解凍(ダブルクリック)
  5. 解答して出来たフォルダの中の、Payloadフォルダに.appという拡張子のファイルがあるので、右クリック > パッケージの内容を表示
  6. bookフォルダの中に、META-INFフォルダ、OEBPSフォルダ、mimetypeという名前のファイル、の3つがあるので、これらを選択して「3項目を圧縮」
  7. 圧縮して出来た.zipファイル(Macデフォルトだと「アーカイブ.zip」)の拡張子を.epubに変更

以上で、変換作業は終了。あとは、お好みのePubリーダーに放り込めばOK。iOS 5にデフォルトで入っているiBooksが手軽です(iTunesのブックライブラリに.epubファイルを入れて、同期するだけ)。

なお、CSS Cookbookは、インデックスの量が多すぎるのか、ePubリーダーでも快適に読めるとは限りません。私の試した範囲だと、iBooksはなんとか実用レベル、bREADERはダメダメ、って感じです。

ちなみに、ePubファイルの中身は、ただのhtmlです(OEBPSフォルダの中には大量の.htmlファイルが入っています)。したがって、htmlファイルを取り出して個別に読むこともできます。

Ubuntuを再セットアップした/たのしくなってきたRuby

今日、Macのダウンロードフォルダを整理したところ、誤ってUbuntuの仮想ハードディスクまで消してしまいました。Ubuntuの仮想ハードディスクをダウンロード後、ダウンロードフォルダに置いたままセットアップしていたのが原因です。

Ubuntuは開発環境(というか、学習環境)の構築と、多少のファイルの移動はしていたものの、本格的に開発に使っていたわけではなかったので、それほど痛手にはなりませんでした。が、一歩間違えたら恐ろしい事態になっていたことでしょう。ファイルの置き場には十分に気をつける必要があると再認識しました。

バックアップをとっていないため、復旧も無理そうなので再セットアップを行いました。そこで、以前LAMP環境を構築する記事で書いた内容と齟齬が生じました。Ubuntuに、PHPが入っていないのです。前回は気づいたら入っていたのですが、恐らくセットアップ初期の段階でインストールしていたのでしょう。

再セットアップの今回は、userフォルダの中に作ってあるtoolsフォルダに入れました。これで誤って消すことはないはず。TimeMachineによるバックアップのためにも、外付けHDDを早く買わねば。

『たのしいRuby』は第2部の基礎編を終え、第3部に入りました。第2分では変数、配列、制御構造、ループといった、「伝統的」なプログラミングの基礎が説かれています。とはいえ、メソッドあたりからは「Rubyらしい」話題になりますし、クラスを自分で定義する、といった話題は本書で初めて読みました。

第3部からは各クラスごとのメソッドを掘り下げ、今までに身につけた内容をテストする練習問題も収録されています。第2部の感想は「まあまあたのしい(でもクラスの辺りはよくわからん)」、第3部は、まだ序盤ですが、ようやく「たのしい」感じになってきましたね。

練習問題にあった素数を判定するプログラムは、PHPを覚えたての頃(今年の3月)に書こうとして上手くいかなかったのですが、今回は書き下ろすことができました。

def prime?(num)
    count = 0
    i = 1

    while i <= num
        if num % i == 0
            count += 1
        end
    end

    if count == 2
        print num, ” is prime.n”
    end
end

3月の段階でも、FizzBuzzは書けていたので、当時でも書くことはできたはず。が、当時は、「2回割り切れたら素数、3回以上割り切れたら素数ではない」という発想ができませんでした。ちなみに、『たのしいRuby』のサポートページにはエレガントな解法が載っています。

viに乗り換えた/たのしい?Ruby

先週の記事では、terminal内で使用するエディタとしてはnanoを使ってるよ、と書きました。が、viに乗り換えました。

nanoは、確かに覚えるべきことが少なく(参考)、初心者にはわかりやすい。その反面、機能に乏しいのが弱点です。ちょっとした直し程度ならnanoでもいいのですが、ある程度の長さのテキストを編集するとなると、nanoでは限界があります。

そこで、やはり本格的なエディタに取り組もう、と選んだのがviです。参考にしたのは、エディタ特集をやっているSoftware Designの2012年7月号。単なるユーザーにとってはvi(vim)、自分でカスタマイズ(プログラム)するならemacsに軍配が上がる、という印象を受けました。

viの習熟度の現状は、モードの切り換えやhjklでの移動に慣れた程度です。挿入モードメインで普通のエディタみたいな使い方をしています。もう少しコマンドを覚えれば、コマンドモードの方が高効率になるんでしょうが…。

あと、初歩的なテキストファイルの編集に関してはMacのterminalでもUbuntuのterminalでも大差ないので、最近はMacのterminalで作業するほうが多いです。ApacheとMySQLはUbuntuにしか入れてないので、PHPを書くときはUbuntuです。

また、言語に関してはRubyを始めました。今月からRubyの勉強会に参加する予定なので、その準備です。参考書としては『たのしいRuby 第3版』を選びました。理由は、

(1) 3版目である(=間違いが混入している可能性が低い)
(2) まつもとゆきひろ氏の推薦文がある
(3) 2色刷りで紙面が見やすい
(4) 2010年刊と比較的新しい

といったところ。今日は第1部、約60ページを終えました。感想は、

(1) Rubyの構文はシンプル
(2) 基本的な部分が説明不足(オブジェクトって何?)
(3) あまりたのしくないかも…(比較対象は『Perl言語プログラミングレッスン』)

Rubyでまず驚いたのは、文末のセミコロン(;)やif文の{}を使わないこと。短いif文を私の知っている言語で書いてみると、以下のようになります。

PHP(if文の中身が1行だけなら波括弧は省略可):

$a = 10;
if ( $a >= 10) print “$a”;

Perl(波括弧省略不可):

$a = 10;
if ($a >= 10) {
    print “$a”;
}

ただし、Perlで実行部分が1行の場合は、

print “$a” if ($a >= 10);

という書き方もできる(if修飾子)。

Ruby(セミコロン不要、波括弧の代わりにthen~endという文字列を使う)

a = 10
if (a >= 10) then
    print a
end

なお、『たのしいRuby』の第1部の段階では触れていないが、RubyでもPerlと同様にif修飾子が使えるので、

print a if (a >= 10)

と書くこともできる。

また、『たのしいRuby』では、オブジェクト指向言語の用語に慣れさせるためか、「オブジェクト」「メソッド」等の用語を多用します。しかも、これらの用語に関する詳しい説明はありません。プログラミング初心者を対象としているにも関わらず!

オブジェクト指向は直感的な書き方ができるので、「習うより慣れろ」式でも良いのかもしれませんが、納得感が得られないのが気になります。

『たのしいRuby』を、並行して進めている『Perl言語プログラミングレッスン』と比べると、構成もかなり違います。

『Perl言語プログラミングレッスン』は、数と文字列、変数、配列とハッシュ、条件判断とループ、といった具合で、基礎的な概念から順番に説明していく「伝統的」なスタイルです。これに対し、『たのしいRuby』は、最初にその本で紹介するトピックを概説し、その後各トピックを深く掘り下げるスタイル。

目次だけ見ると、『たのしいRuby』の方が見通しが良いように感じるのですが、実際にやってみると、『Perl言語プログラミングレッスン』の方が、「たのしい」。一歩ずつ前進していく(各項目をきっちり理解していく)感覚が心地よいのです。

『たのしいRuby』は、今日読み終えた第1部の段階では、地図をじっくり眺めただけ。一歩も進んでない。2部以降は各論に入っていくので、この先が楽しめるといいな、と思います。