特定非営利活動法人MOSA

MOSAはソフトウェア開発者を支援します

  • iPhone/iPod touch アプリ紹介
  • MOSA掲示板
  • 活動履歴
  • About MOSA(English)
  • BIZMATCH
  • メールマガジン好評配信中

MOSA Developer News[MOSADeN=モサ伝]第337号

2009-03-31

目次

  • りんご味Ruby         第44回  藤本 尚邦
  • 藤本裕之のプログラミング夜話   #157
  • 高橋真人の「プログラミング指南」  第155回
  • mosa entranceだより       第4回   高松 和広

りんご味Ruby   第44回  藤本 尚邦

引き続き、Ruby+RubyCocoaを使って「CoreGraphicsによるPDFの描画」を記述するための簡易言語(DSL)を作っていきます。

前回、CoreGraphicsの描画コンテキストについて、CGContextという名前のRubyのクラスを定義して、そのインスタンスとして扱うことにしました。PDFコンテキスト(やBitmapコンテキストなど)は、CGContextクラスの派生クラスとして定義し、その中でコンテキストの種類を context_type という疑似構文によって宣言することにしました:

 class CGPDFContext < CGContext
   context_type :PDF   # PDFコンテキスト
   ...
 end

context_type という宣言風の疑似構文の実体は、いつもどおり、CGContextクラスのプライベートなクラスメソッドです。context_type メソッドは、引数で指定された描画コンテキストのためのCoreGraphics関数をインスタンスメソッドとして自動定義します。

【編集部注:以下バックスラッシュを¥で置き換えて表現します】

  

 def context_type(type)
     pattern = /¥ACG#{type}Context(.*)¥Z/
     OSX.methods.each do |func_name|
       matched = pattern.match(func_name)
       methodnize(func_name, matched[1]) if matched
     end
   end


この実装の中身を見ていきます。

■ 正規表現リテラル

context_type では、まず、引数として渡された描画コンテキストを扱う関数の名前にマッチする正規表現のバターンを作ります。すなわち、コンテキストが"PDF" であれば "CGPDFContext" で始まる関数名にマッチし、"Bitmap" であれば CGBitmapContext で始まる関数名にマッチするパターンです。

これまでにもしばしば出てきていますが、Rubyには、文字列などと同様に、正規表現オブジェクトを直接記述(リテラル表記)する構文があります:

 

pattern = /¥ACG#{type}Context(.*)¥Z/

右辺の "/" で挟んだところが、目的の関数名にマッチする正規表現オブジェクト(Regexpクラスのインスタンス)のリテラル表記です。生成された正規表現オブジェクトには、pattern という名前(変数名)をつけています。

このパターンで使われている正規表現の構文をざっと順に説明します:

 

¥A      -- 文字列の先頭にマッチ
 CG      -- "CG" という文字の並びにマッチ
 #{type} -- context_type の引数 type を評価した結果の文字列にマッチ
 Context -- "Context" という文字の並びにマッチ
 .       -- 任意の1文字にマッチするパターン
 ・      -- 直前のパターンの0回以上の繰り返しにマッチするパターン
 (.*)    -- 任意の1文字の0回以上の繰り返しにマッチした部分をグループ化
 ¥Z      -- 文字列の末尾にマッチするパターン


中でもポイントは、#{type} の部分と (.*) の2点になります。文字列リテラルの場合と同様、#{…} というパターンは、…の部分のRubyプログラムを評価した結果を文字列化し、その文字列をパターンとして埋め込みます。

 

context_type :PDF

と宣言された場合、引数typeの値は :PDF というSymbolオブジェクトです。それを文字列化すると "PDF" なので、/¥ACGPDFContext(.*)¥Z/ というパターンになります。また、(.*)のように括弧で囲まれた部分は、パターンマッチを実行したときに、その部分にマッチした文字列を取り出すことができます。この部分は、生成するインスタンスメソッドの名前になります。

 context_type nil

のように nil が渡された場合には、nil を文字列化すると空文字列 "" になるので、/¥ACGContext(.*)¥Z/ というパターンになり、これは CGContext 全般を扱う関数名にマッチすることになります(注 - 実を言うとそうでないものにもいくつかマッチしてしまうのですが、話をシンプルにするためそこは目をつぶってください)。

■ 正規表現のパターンマッチ

必要なパターンはできたので、次は、全ての関数名の中からパターンにマッチする関数名を見つけて、インスタンスメソッド化します:

  

   OSX.methods.each do |func_name|
       matched = pattern.match(func_name)
       methodnize(func_name, matched[1]) if matched
     end


OSX.methods は、RubyCocoaで使うことの出来る Objective-C の関数名の配列を返します。それぞれの関数名について、Regexp#matchによりパターンマッチさせ、成功した場合は methodnize を呼び出します。methodnize は別途定義したプライベートクラスメソッドです。

matched[1] には、(.*) の部分にマッチした文字列、つまり生成するインスタンスメソッド名になる文字列が入ります。matched[0] はパターン全体にマッチした文字列で、matched[1]以降には括弧で囲まれたグループに部分マッチした文字列がグループの出現順に入ります。

(余談) ところで、Objective-C でも、Foundationフレームワークあたりに正規表現関連のクラスを導入して、@/パターン/ みたいな感じのリテラル表記を導入すればいいのに、と思いませんか?さらに欲を言うと、NSArray やNSDictionary のリテラル表記があればいいのになぁと思うこともあるのですが、単に私がRubyに毒され過ぎてるだけなのかもしれません。

次回は、見つけた関数をインスタンスメソッド化する methodnize を見ていく予定です。

藤本裕之のプログラミング夜話 #157

 バブル崩壊前、80年代末のソフトウェア業界を概括しておこう。前述のように労働者派遣法の制定によって、ソフトウェア技術者の派遣を受ける側はそれ以前の「形式的受託開発」のクビキを逃れ、ホントに使える人材だけを派遣元に要求できるようになった。

 既にそれなりのスキルを身につけている技術者にとって、これは必ずしも悪いことではなかった。だってそうでしょ? ものになるかどうか分からないワカモノとカップリングで仕事にあたり、彼らを指導し……と言えば聞こえはいいが大概の場合、彼らの尻拭いをしながらクライアントの要求に応え、報酬はそのワカモノに比べてそれほど高いわけではない、という立場だったのが「自分のハタラキ分をきっちり貰えて他人の面倒は見なくていい」という、なんつかプロのスポーツ選手みたいな感じの働き方になれたんだから。

 前回も書いたが派遣会社も楽だ。主たる仕事は上のような人材をきっちり集めて売り込むことであり、時間がかかる上に成功の保証もない「人材育成」なんてものに金を使わなくて済む。派遣を受ける側のメリットは言うにおよばず、つまり最近(でもない?)流行のコトバで言えば「WIN-WIN」……いや三者だから「WIN-WIN-WIN」かな? の関係がここに成り立ったわけである。あ、断っておくがオレ自身はこういう「WIN-WIN」とか言う言葉をしたり顔で使ってみせるヤツは嫌いなんだけどさ。

 しかし、である。忌野清志郎がかつて喝破したように、世の中「いい事ばかりはありゃしない」のだよね。

 考えれば誰でもすぐ分かることなんだが「今スキルのあるヒトだけを使って次の世代を育てなければ次の世代はスキルのないバカばっかりになる」のである。いやもちろん若い世代にも自分で学べる優秀なヤツはいるし天才だって生まれるさ。でもこんだけ肥大した、そして今も肥大を続けてるソフトウェア産業を下支えするには、そういうヒト達だけでは絶対数が足りないのだ。

 しかもである。ソフトウェア技術者のレベルというのは他の職業のそれに比べて維持するために努力を要する。ボブ・ディランの旧い歌にあったでしょ? 「昨日のトップが今日はビリになる」んである。マシンが進歩し、プラットフォームが新しくなり、新しいプログラミング言語が生まれ、開発手法に革新が起きればそれに追随していかなければ「スキルのある技術者」という立場は維持できない。

 ということは、たとえキチンと育てようとしていたとしても、次の世代がその域に達するためのハードルは日を追って高くなっていくのである。ダーウィンが言うように「獲得形質は遺伝しない」。今後何があっても「Cでプログラムが書ける頭脳を持って」子供は生まれてこない。たとえゴールが38万キロの彼方でも、みんな最初の1mから歩かなければならない。

 まぁ細かいことを言えば、高水準言語やIDE、あるいは各種フレームワークのブラックボックス化によって多少の下駄……というか、ジャンピングボードみたいなものが存在するわけではあるが、誰の助けも借りずスキルを身につける困難さがそれによって軽減しているとも思われない。いや下手をすると逆にそれが枷となって「Javaは分かるけどObjective-Cは駄目です」とか「Visual
Studioでないとボクなんにもわかりません」みたいな「偽のスキル」(こういうのは偽のスキルだと思う)の横行を助長している側面もあるのではないか。

 と、話がちと逸れた。何が言いたかったかというと、バブル崩壊直前のこの業界では「次世代の技術者を育てる」という意識の減退もタケナワであったということなんである。では次回はいよいよバブルを崩壊させてしまおう(笑)。
(以下次回 2009_03_27)

高橋真人の「プログラミング指南」第155回

これから始めようとする人へ(6)

 皆さんこんにちは、高橋真人です。
 さて、前回予告したように、今回からObjective-Cについてのお話をしていきます。ただ、今までの話の流れに沿う意味で、あくまで「これから始める人」に向けての説明が中心になります。

 Mac/iPhoneのプログラミングを始めるに当たっての質問で頻繁に見られるものに「Objective-Cを学ぶにはあらかじめC言語を学んでおく必要があるのか?」というのがあります。
 Objective-CがCを拡張して作られた言語であることを知っていれば、答えを待つまでもないようにも思うのですが、このような質問をする側には、もう少し深い理屈があって、それだけではなかなか理屈通りには納得できないようです。
 そこで、具体的な例を示してこの辺を説明したいと思います。

 最初に、「Objective-CはCを拡張して作られている」ということですが、このことをよく「CはObjective-Cのサブセットである」とか「Objective-CはCのスーパーセットである」などと言います。サブセットのサブは「部分」、スーパーセットのスーパーは「上位」ということで、これらの表現はすべて「Objective-CがC自体を含んでいる」ということを意味しています。
では、簡単なサンプルを挙げてみます。
まずは、Cの例。

#include 

void foo(int n);

int main()
{
   foo(10);

   return 0;
}

void foo(int n)
{
   printf("%d", n);
}


 fooという名の関数に10を渡して、それをコンソールに表示するという単純なプログラムです。
次にObjective-Cの例です。

#import 

@interface Foo : NSObject {
}
- (void)foo:(int)n;
@end

int main ()
{
   Foo* f = [[Foo alloc] init];
   [f foo:10];
   [f release];

   return 0;
}

@implementation Foo
- (void)foo:(int)n
{
   NSLog(@"%d", n);
}
@end


 こちらも、Cの例と同様に10を渡してそれを出力をするだけのものです。Cの例と大きく違うのは、Cでは単なる関数を一つ作るだけで済んだのに、わざわざFooというクラスを定義して、foo:という名のメソッドを持たせているところです。
 この結果、実際の呼び出しの部分でも、Cでは1行で済んでいるところが、Objective-Cでは3行にわたっています。
 何故このようになるのかと言いますと、Objective-Cではメソッドは何らかのクラスに属している必要があるからです。このため、Cでは単なる関数を定義すれば済むところを、Objective-Cの例ではあらかじめクラスを定義しなければなりませんし、呼び出しの前には、クラスをオブジェクトとして実体化し、用が済んだら後始末をする必要まで出てきます。(実体化をさせない書き方も、できないことありませんが)

 さて、両者の違いが分かったところで、「Cを学ばずにObjective-Cを...」という点について考えてみます。
 冒頭に申し上げましたように、CはObjective-Cの一部であるという位置付けになるため、CのコードはそのままObjective-Cのコードとしても正当です。よって、先のCの例のコードも、単にソースファイルの拡張子をcからmに変更するだけでObjective-Cのコードとしてコンパイルされ、実行されます。
 さらに、Objective-Cの方の例をつぶさに観察してみると、NSLog()というC形式の呼び出しを行う関数があることが分かります。Objective-Cというと、どうしても

[object message:parameter]


という呼び出し形式が目に付いてしまうために、C形式の呼び出しを見ると「これはObjective-Cじゃない」と思ったりする人もいるかもしれませんが、CがObjective-Cの一部である以上、Cの呼び出し形式も正当なObjective-Cですし、実際に、全くC形式の呼び出しを使わずにObjective-Cのプログラムを書くことはほとんど不可能だと言ってもいいのではないかと思います。(作為的に作ることは可能でも、それが実用的に価値があるかというと疑問)

 今回は見た目の話での説明に近かったので、まだ納得の行かない方も多いと思います。次回は、Objective-Cとは切っても切りはなせないCocoaのフレームワーク、特にFoundationフレームワークについて見ていくことで、さらに本質的な部分に迫っていきます。

mosa entranceだより       第4回   高松 和広

 今週は埼玉工業大学 工学部 情報システム学科1年 高松 和広さんにメールでインタビューし、そのお返事を編集してお届けします。

◇情報システム学科ではどんな講義があるのですか?

日進月歩な情報技術の幅広い知識が学べる講義が揃っています。
農業地帯のど真ん中にある大学ですが、ビックリするほど充実したカリキュラムになっています。
1,2年次では、専門科目の他にも情報技術の知識を身につける上で必要な物理や数学の知識を磨き、人間としてのコミュニケーション能力を高められるようになっています。3年次以降では研究室に所属し、専門的で高度な知識を更に身につけます。

◇大学や専攻はいつ頃、何を決め手に選んだのですか?

大学に進学しようと決めたのは、高校3年生の時です。
決め手は、大学が地元にあることと、学科のカリキュラムが私にピッタリだと判断したからです。
私は幼い頃からコンピュータが好きでした。コンピュータに携わる仕事に就きたいという気持ちが中学生のときに芽生え、工業高校の情報技術科に入学しました。
コンピュータに携わる仕事に就きたい‥‥コンピュータに携わる仕事と言っても、色々な分野があります。そこで、コンピュータの幅広い知識を身につけ、将来的にはどんな仕事に就いても汎用的に働ける社会人になりたいと思いました。
私の住んでいる埼玉県深谷市に「4年間の間に情報技術の幅広い知識を学べる大学」の条件にピッタリな専攻のある大学がありました。その大学が、現在在学中の「埼玉工業大学」です。
進学したい理想の大学が地元にあるのなら、行かない手はないと思い、埼玉工業大学の情報システム学科に進学することにしました。

◇今つくってみたいソフトウェアやサービスはどんなものですか?

私はコンピュータを始めた時から、画像や映像を扱う作業が好きでした。なので、そのような作業が楽しくなるようなアプリケーションを作りたいです。
 例えば、デジカメの写真をMac上で扱う際に、iPhotoでは出来ないような便利な機能を搭載した写真専用のビューア、など‥‥

◇開発環境を教えてください。

MacにIntelのアーキテクチャが採用されたのを機に、Macを使うようになりました。
iMac(ポリカーボネートボディのCore 2 Duo搭載モデル)とMacBook(2008年秋登場のアルミユニボディモデル)の2台を使っています。iPhoneは持っていませんが、1世代目のiPod touchを持っています。

◇MOSA学生会員になったきっかけは何ですか?

大学に入学する前までは、正直に言うとプログラミングには全く興味を抱きませんでした。現在、大学では希望通りにコンピュータに関する様々な知識を身に付けているところです。大学での色々な体験が、インスピレーションを与えたんだと思います。最近になって、急にプログラミングがやりたくなったんです。
プログラミングがやりたいと思っていた矢先、iPodで何気なく聞いていたPodcastの番組「Apple Tips」で、MOSAの存在を知りました。
「私が好きになったMacでプログラミングをしながら、Macユーザーとのコミュニケーションを沢山することができそうだ!」と思い、MOSA学生会員になりました。

◇MOSA学生会員になった目的を教えてください。

最近になって、プログラミングに興味を持ち始めました。大学では、2年次以降よりC言語によるプログラミングを習得します。
MacやiPhone向けのプログラミングで使うCocoaやObjective-Cは、C言語がベースになっているので、大学でプログラミングを行う際は、MacやiPhone向けのプログラミングの知識が少しでも役に立つだろうと思いました。
プログラミングを習得するのなら、大好きなMacやiPhone向けのプログラミングを覚えた方が楽しそうだと思い、それを機にMOSA学生会員になりました。
それから、MOSAの活動でMacユーザーの方々と沢山のコミュニケーションを取りたいと思ったのも1つの入会した理由です。

◇アプリケーションプログラムとwebのサービスではどちらに興味がありますか?

Webで提供されている色々なサービスは、様々なOSから利用できるものが多いです。
私はMac OS XとWindowsの両方を使っていますが、現在興味を持っていて、作りたいのはMacやiPhone向けのアプリケーションです。
2つのOSを使っているので、OSに依存しないWebのサービスには興味がありますし、機会があれば自分でも作ってみたいと思います。

◇MacとiPhoneではどちらに興味がありますか?

どちらにも同じ位の興味があります。
Macを携帯電話に変化させたのが「iPhone」というイメージを持っています。また、MacとiPhoneのアプリは同じ開発環境で制作できます。
なのでこれから先、MacとiPhoneで出来る事がどのように増えていくかが気になります。自分でもアプリケーションを作って、両プラットフォームの可能性を広げたいです。

◇自己PRや仲間募集など、書きたい事があればどうぞ

Mac OS Xを使い始めてから2年、Mac・iPhone向けの開発を学び始めてから1ヶ月が経ったばかりの、ひよっこのMacユーザーです。
今後も積極的に、MOSAの活動に参加をしていきたいです。その節には、ご指導ご鞭撻の程、宜しくお願い申し上げます。

◇mosa entrance参加して良かった事は何ですか?

Mac・iPhone向けの開発をする技術の習得を始めたばかりで、この先も続けられるか時々不安に思うことがありました。しかし、mosa entranceに参加し、色々なお話を聞かせて頂くことによって、どんどん頑張っていこうという気持ちになれました。それが自分にとっては良かったです。

◇期待していたけど果たせなかった事があれば書いてください

開発以外に、皆様が日頃どのようなMacの使い方をされているのかが気になっていたので、そういった話題もあれば良いなと思いましたし、自分から積極的にそういった疑問を質問しておけば良かったと後悔しております。

◇ほかの参加者のMacやiPhoneに対する『思い入れ』のようなものは感じましたか?

アップル関連のグッズを愛用している方がいらっしゃいました。
ここにいる皆さんは、MacやiPhoneを愛されているんだなぁと思いました。私も参加した日にはアップルのトートバッグを持参していて、「あ、私もいつのまにかMacやiPhoneが好きになってたんだ」と感じさせられました(笑)

◇mosa entranceの印象に残ったシーンやエピソードがあれば書いてください

冗談を交えながら、楽しく話題が進んでいったことが楽しく、印象に残りました。
mosa entranceは楽しくコミュニケーションをしながら、色々な知恵を交換することができるイベントだと思います。
今後も積極的に参加し、コミュニケーションを通して、将来へ繋げたいです。

◇そのほか思い出した事やこの際書きたい事があればどうぞ!

これからもmosa entranceには積極的に参加させて頂きます。
まだまだ未知な部分が多いので、皆様に色々と教えて頂く機会が沢山あると思います。今後とも、宜しくお願い致します。

◇以上です、ありがとうございました。

◇MOSAからのお知らせと編集後記は割愛します◇

 

 MOSA Developer News   略称[MOSADeN=モサ伝]
        配信停止 mailto:mosaden-ml@mosa.gr.jp
 記事内容に関するご意見 mailto:mosaden-toukou@mosa.gr.jp
      記事投稿受付 http://www.mosa.gr.jp/?page_id=850
Apple、Mac OSは米国アップル社の登録商標です。またそのほかの各製品名等
はそれぞれ各社の商標ならびに登録商標です。
このメールの再配信、および掲載された記事の無断転載を禁じます。
特定非営利活動法人MOSA  http://www.mosa.gr.jp/
Copyright (C)2009 MOSA. All rights reserved.