Windows 上で OSS と付き合っていくために

今回は、過去に私が経験したオープンソース ソフトウェアとの出会いに遡って、どのように使ってきたかという話を記載します。 最初にOSSと出会ったのは、まだOSSという用語のない時代で1990年代の前半でした。当時は仕事で商用のUNIXワークステーションを使っていたこともあって、 anonymouse FTPを使ってPDS(Public Domain Software)のアーカイブを落として、自分でmakeしていました。PC界隈では、MS-DOSや Windows 3.1が使われ出した頃の話です。当時のUNIX WSは、BSD系のSunOSやNEWS、System V系、そして様々なRISC CPUを搭載していました。この関係もあって、configを修正してmakeするのが当たり前だったのです。この頃に使っていたコンパイラは当然の事としてCなわけですが、C言語は独自で覚えました。 ある時、tarボールの中身を展開した内容をlsしていて、おや「MS-DOS」用があることに気が付きました。試しにmakeしてみようと思って、MS-Cコンパイラを引っ張り出してきてmakeして、gzip.exeを作って遊んでいました。その後に、Windows 95などを使ったアプリケーション開発に仕事が変わったのですが、時折、ユーティリティのような仕事も入りました。その中に Lotus Notes対応のユーティリティを作ったことがあるのですが、この時は Notes SDKを入手してNotes APIをラップしたDLLを作成して、Delphiでユーティリティを書いていました。ご存じのようにCコンパイラは、ヘッダーファイルのパスなどを設定すればコンパイルすることができますが、リンカはオブジェクトファイルへのパスを設定しないと編集することができません。何せ、Notes SDKなどを触ったのは初めてなもので、結構、四苦八苦した記憶があります。 結局、何が言いたいかと云えば、OSSと付き合っていくにはコンパイル方法を知っていた方が良いということです。不足するモジュールがあった場合に、親切な方がコンパイルしたモジュールを公開されていますから、検索すれば見つけることができますが、自分が使っている環境で問題なく使えるという保証はありません。こんな時に、野良ビルドの方法を知っていると、とっても便利だと思うのです。当時は、インターネットの商用利用の先駆けの頃でしたし、今ほど情報はありませんから、NetNewsで調べたり、何よりも自分で試すことが最初でした。最近は、便利な書籍が電子出版という形で出ていますので、この本なども野良ビルドをするための勉強になると思います。 タイトル:Ruby環境構築講座 Windows編 著者:arton 出版社:達人出版会 この書籍は電子出版の利点を生かして、ベータ公開して、フィードバックのによって内容の更新を行うものです。紙の書籍と違って、更新版も手に入るという新しい試みを行っています。アメリカのManningのEAPと同じ試みとも言えます。この野良ビルダー養成読本とも言える試みは、今年のRuby会議から始まったものです。Rubyに限りませんが、OSSの中でも使用者の多いLinux系の方達は、自分でビルドするという傾向があり、Windowsでの利用者はバイナリ利用という傾向があります。このために、Windows系のメンテナが慢性的に不足しており、新しいメンテナ養成講座という試みで、素晴らしいと私は考えています。 私が始めた頃にもあれば、試行錯誤して苦労することはなかったんですが、無ければ作るの心意気がハッカーの心情だと信じていますので、是非、無い物は作っていきましょう。

0

TechEdの準備に追われています

いよいよ来週は、TechEd Japan 2010の開催です。私が担当するのは「T6-501 多言語パラダイムによる実装手法-動的言語、関数型言語を含めたプログラミング言語の有効活用へ-」というセッションになります。参加者向けにPPTが公開されていますので、おおまかなアウトラインを確認することができると思います。実は、まだ設計論に関しては色々と検討をしている最中です。この資料の作成に関しては、何度も萩原さんとディスカッションしたり、色々な資料(論文や書籍だったり)を読み漁ったりしています。中でも参考にしているのは、以下の3つになります。 Domain Driven Design : Eick Evans Lean Software Archtechture:James.O.Copplien 萩原さんの過去の講演資料(クラスにまたがる散乱ともつれ合い) 複数のプログラミング パラダイムを組合わせる上で重要だと考えるのは、如何以下に設計上でパラダイムを発見するかということです。この目的のために大切なことが、ドメイン、ユースケース(振る舞い)、コンテキストではないかというのが私の考えです。実世界のオブジェクトの振る舞いは、コンテキスト(その時の目標と言い換えても良いです)に左右されると考えているからです。この当たりの考え方は、当たり前と云えば当たり前なんですが、どうも実現が難しいように感じています。これを実現する1つの手法が、Agile Dvelopmentの本質だとも考えています。 話は変わって、TechEdでは「BOF-06 Let’s Dynamic」というBOFがありまして、イスラエル在住のMVPであるShay Friedmanが参加してくれます。彼は、IronRuby Unleashedという書籍の著者でもあります。IronRuby関係で知り合って、今回のBOFへの参加に当たって彼と何度も連絡を取り合っています。TechEdに参加される方で、Rubyにご興味のある方は是非ともご参加ください。 それから、F# 2.0 CTPですが2010 Augustが公開されました。このビルドには、以下の内容が含まれていました。 .NET Framework 2.0対応のバイナリ ソースコード .NET Framework 4対応のバイナリ Windows Phone 7向けのバイナリ 中でも.NET Framework 4向けのF#対話型シェル(fsi.exe)は、日本語の入力もできるようになっています。多分、対話型シェルの標準入力用のパーサーがユニコード対応になったと思います。これでVisual Studio 2010 Professional以上を持っていなくても日本語を使ってF#を試せるようになります。 追記:書き忘れましたが、TechEdのセッションの難易度は高く設定させていただいています。このため、オブジェクト指向分析&設計はもちろんのこと、デザインパターン、アジャイル開発などの知識は必須となります。用語を知っているという前提となりますので、ご容赦ください。 追記:F# 2.0 CTPの.NET Framework 4向けの対話型シェルですが完全な日本語入力に対応しているというものではなく、ユニコード対応のお蔭で日本語の入力もできるという程度のものです(いげ太さんのご指摘により、追記しました)。

2

IronRuby 1.0 におけるエンコーディングの取り扱いについて その2

前回のエントリについて、NAKAMURAさんかフィードバックをいただきました。「$KCODEとはコマンドライン オプションのことですか」という話で、その通りなんですが、この辺はどうなんでしょうかと個人的には考えていたります。コマンドライン オプション「-Kkcode」というものがあります。これを以下のように設定すると、スクリプトファイルのエンコーディングを変更することができます。 -Ks: $KCODE=’shift-jis’ -Ku: $KCODE=’utf-8′ 利用するスクリプトに応じて-Kオプションを使い分けるというのもあるでしょうし、オプションを設定しなくても動作するようにするという考え方もありますので、私がどちらの立場が好きかといえば、間違いなく後者なだけです。 前回は文字列のエンコーディングを変換するのにSystem::Text::Encoding.Convertメソッドを使ったわけですが、提供されているライブラリを調べるとIconvが使えました。NKFは移植が完了していませんが、Iconvを使えばエンコーディングの変換は問題なくできます。Iconvを使ったコードを以下に示します。 # オリジナルの読み込み(UTF-8) d0 = open(“utf8 bom.txt”).read # BOM(0xEF 0xBB 0xBF)を除いた文字列の作成 d1 = d0.slice 3..-1 # ICONVモジュール require ‘iconv’ # エンコーディングをUTF-8からシフトJISに変換 d2 = Iconv.conv(‘shift-jis’, ‘utf-8’, d1) puts d2 これでir上は、問題なく表示することができました。System::Console::WriteLineメソッドなどで出力するには、正しいエンコーディングを文字列に持たせてやる必要があります。というのは、上記の変換した結果のEncodingプロパティは、ASCII-8BITになっているからです。 IronRubyのIOクラスのソースコードを調べるとRuby 1.9のexternal_encodingとinternal_encodingを実装しようとしていることがわかりました。この実装は、まだ未完成でexternal_encodingがASCII-8BIT(バイナリ)固定になっています。これが、Fileオブジェクトを使って読み込んだ場合のEncodingプロパティがASCII-8BITになっている理由でした。 また「-1.9」オプションを使用すると、不完全ながらRuby 1.9互換モードになります。この1.9モードであれば、String#encodingプロパティへアクセスできるようになりますし、Encodingクラスも不完全ながら使用できるようになります。これらのことから推測できるように、前回のエントリで使っていたString#Encodingプロパティが1.9互換実装の機能を使うものだということです。 SilverlightでIconvを使用するには、「load_assembly ‘IronRuby.Libraries’, ‘IronRuby.StandardLibrary.Iconv’」を使ってモジュールを読み込みます。load_assemblyメソッドは、IronRuby固有のもです。このメソッドを使用する理由は、iconv.rbというライブラリをSilverlightの実行環境で使えるようになっていないからです。もしろんiconv.rbを使えるようにすれば「require ‘iconv’」で構いません。

0

「邪道編- Ruby × Windows でできること」で中継していただける方を募集します

前回にご案内した「邪道編-Ruby × Windows で出来ること 」ですが、広く中継できないかと考えています。マイクロソフトの機材を使うと、Live Streamingなどになってしまいます。せっかく、artonさんに登場していただくのですから、Ustreamなどで配信できると良いなぁと考えています。そこで中継していただける方を募集させていただきます。中継しても良いという方がいらっしゃれば、私までご連絡ください。 よろしくお願いいたします。 追記:参加される方でiPhoneやAndroid携帯をお持ちの方は是非とも中継をお願いします。Ustreamに限らず、ニコ生でもなんでも中継は大歓迎です。#iPhoneなどの事を忘れていました。

0

IronRuby 1.0 におけるエンコーディングの取り扱いについて

前回にご案内した勉強会というかセミナーに絡んで IronRuby のマルチバイト文字の扱い方を色々と調べています。特に nkf  ライブラリが未完なので文字列の取り扱いがどうなのかという点が気になっていました。検索してみると Jamzzの日々というはてなダイアリーで、nkfが未完ならnkfを何とか使えるようにしようという取り組みが見つかりました。 以下に、.NET Framework 2.0 用の IronRuby で気が付いたことを記載します。 ir.exe では putsメソッドはシフトJISで文字を出力しているようだ。 というのは、UTF-8 や EUC などでは文字が化けるからです。 スクリプトファイルは、SJIS、UTF-8、EUCに対応しているけど、ir.exeからは $KCODEを設定しないと正しいエンコードを認識しない。 SJISは、何もしないでもOK。 Fileオブジェクトは、$KCODEに関わらずSJIS以外はバイナリとして扱っている(ASCII-8BIT)。 UTF-8などだとBOMもバイナリとして読み込んでしまっていました。 $KCODE のdefault は、’NONE’になっている。 試しにUTF-8でBOMを持つファイルを読み込むコードを以下のようにしてみました。 # オリジナルの読み込み(UTF-8) d0 = open(“utf8 bom.txt”).read # BOM(0xEF 0xBB 0xBF)を除いた文字列の作成 d1 = d0.slice 3..-1 # エンコードをUTF-8にした文字列の作成 d2 = d1.ToString System::Text::Encoding.UTF8 # 正常に出力できる(puts は化けます) System::Console.write_line d2 このコードでの注意点は、「ToString」メソッドです。.NET Frameworkをご存じの方にはメソッド名は馴染みのあるものですが、エンコーディングを指定している点に「?」が付くことでしょう。これは…

2

邪道編-Ruby × Windows で出来ること 開催が決定しました

今度、Tech Fielders セミナーの一環として Windows 上の Ruby に関するオフラインセミナーを開催することになりました。 セミナー名:『邪道編~Ruby × Windows で出来ること』 日時:7月5日(月) 18:30- 場所:マイクロソフト株式会社 本社セミナールーム 申し込み方法は、World Wide Events ホーム このセミナーの発案者は私でして、マイクロソフト製品というより オープンソースで開発が行われている Ruby を使って Windows 上で何かできないかという趣旨が発端になっています。このため私がセミナー内容を考えて、 個人的なお知り合いでもある arton さんへ参加をお願いして、「おもしろそうだ」ということで快諾していただいたので開催にこぎつけました。このため、参加者は以下のような方達を思い描いています。 Rubyist の方々 Ruby を使ってみたい方々 セミナーの紹介文は、以下のように私が考えました。 Ruby の王道的な使い方は Linux ですが、亜流である Windows 上にも様々な Ruby 実装が存在します。 「Rubyを256倍使うための本邪道編」を踏襲しながら、私 と Ruby コミュニティでご活躍の arton さんが Windows で実現する Ruby の楽しみ方を検討します。 邪道編という単語はパクリ(256倍シリーズを持っていたりします)なんですが、参加者と楽しく Ruby について語り合いたいというのが私の考えです。ご興味のある方は、是非ともご参加ください。 追記:セミナーページの修正はこれからですが、artonさんの内容がきまりました。「邪にして悪にあらず、ただ道にしたがう」というタイトルになります。いやー、本当に楽しみになってきました。自分で話をするよりも、聴き手になりたいぐらいワクワクしています。

0

[TechDays 2010] Dynamic のデモについて

TechDays 2010が終わりましたので、参加者の方へのフォローアップ(デモを失敗した自分へのフォローアップも含みます)を兼ねて、何回か不足していると思われる内容を記述していきます。今回は、Dynamic(動的)に関して説明します。 最初にPythonのコードを使って、以下のような図形を描画しました。   このデモ(BadPaint.exe)は、C#でWPFを使って作成しています。上記のようなシェイプを描画したPythonコードを以下に示します。 from System.Windows.Controls import Canvas from System.Windows.Shapes import * from System.Windows.Media import * import math dim = min(Application.Painting.ActualWidth – 20, Application.Painting.ActualHeight – 20) / 2 for i, color in zip(xrange(0, 360, 10), dir(Brushes)): rect = Rectangle(Width=20, Height=20, Fill=getattr(Brushes, color)) Application.Painting.Children.Add(rect) Canvas.SetTop(rect, dim * math.sin(i * math.pi * 2 / 360) +…

0

[TechDays].NET Framework 4 時代の言語を担当します

Tech・Days 2010では、「.NET Framework 4時代の言語」というセッションを担当します。概要にも記載していますが、扱うテーマは以下の3つになります。 Dynamic (動的) Declarative (宣言型) Concurrent (同時実行) 最初のテーマであるDynamicについては、DLRが提供されることで何ができるかというのがメインテーマになります。ここでお見せする予定のデモとしては、C#<->IronPython、C#<->IronRubyなどの静的言語と動的言語間の相互利用になります。両方を組み合わせることで、どういうことが実現できるかについて説明ができればと考えています。 2番目のテーマとしては、宣言型プログラミングの定義に従って XAML と Visual F#を取り上げます。XAMLについては、.NET Framework 4で提供される System.Xamlを説明する予定です。 F#は、関数型言語としての基本的な部分をご説明することを考えています。 3番目のテーマに関しては、これが一番難しいと感じています。Concurrentという単語を「同時実行」と訳していますが、「並行」と訳す場合もあります。Parallelという単語では、並列と訳するわけです。一般的に並列プログラミングと呼んでも、並行プログラミングと呼ばれることは少ないわけです。並列か並行かというのは、言葉の定義が大切なのですが、並列プログラミングに関するトピックはMSDN ライブラリの中では、Advanced Topicになっているため、一般の人には理解しにくいのではないかと考えています。従って、どのように説明するかという点に関しては、未だに検討しています。 すべてのテーマに関して考えていますのは、 今迄がどうだったのか .NET Framework 4 でどうなるのか ということです。たとえば、Dynamicですが今迄は提供されていませんでしが、これからは提供されるわけです。そうすると、モックオブジェクトと本番オブジェクトを入れ替える場合に「Dynamic」を使うことで依存性を気にしないで入れ替えることが可能になります。もちろんプログラミング的には、インターフェース継承などを使って入れ替える方が、記述ミスの少ないプログラムを記述できますし、実行速度も速くなります。ですが、オブジェクトのインスタンスを作成するFactoryクラスなどを用意する必要があるわけです。これをDynamicにすることで、FactoryクラスがDynamicオブジェクトを返すことで、どのようなオブジェクトでも扱えるようになるわけです。もちろん、知らないメンバーを呼び出すことはコストがかかりますので、呼び出すメンバーの名前に関しては知っている必要がありますが、インターフェースを使うことなく実行時に解決できるのが、DLRのメリットになります。また、2度目以降の呼出しは、サイトバインダーによってキャッシュされていますから、速度の向上も望めるわけです。Dynamicを使用しなかった場合との違いは、「コンパイル時にメンバーを解決するか」「実行時に文字列でメンバーを解決するか」ということです。 この速度面の課題を許容するのなら、オブジェクトを作成するコンテナとしてDLRを活用する価値があるのではないかと、私は考えています。スクリプト系の言語が、色々なところで使われている状況を考えると、使っても問題ないと考えることができます。もちろん、絶対的に速度を重視する場合では、目的を達成するために別の手段をつかうべきだと思います。 PS.考えることが多くて、資料を読み込むのも大変な状況にいます。

0

DLR プロジェクトの状況 2010年1月時点

久し振りにDLRの状況を記述したいと思います。2010.1時点では、以下のようなものがリリースされています。 IronPython 2.6 (2009.12.11) IronPython 2.6 CTP .NET 4.0 Beta2 (2009.10.21) IronRuby 1.0 RC1 (2009.11.20) IronRuby 1.0 CTP for .NET 4.0 Beta2 (2009.10.21) DLR 0.92 (2009.10.22) Visual Studio 2010 ベータ2と合わせて試すのなら、IronRuby 1.0 CTP for .NET 4.0 Beta2 がお勧めです。その理由は、.NET Framework 4.0 ベータ2に同期した IronRuby と IronPython のバイナリが含まれているからです。 また、結構前からになります DLR を使った言語サンプルとして SymPL が以前に提供されていたToyLanguage に替わって提供されています。SymPLには、2種類の実装が提供されています。 charp:ExpandoObjectなどを使った言語実装です。 charp-cponly:DLR対応のホスティングサンプルです。 SymPLの実装方法自体は同じなのですが、ホスティング方法の違いで2種類が提供されています。DLR 対応として DLRホスティング可能なサンプルとしては、charp-cponlyをお勧めします。DLRホスティングの方法としては、以前に私が公開した…

0

Rack ベースの Web アプリを IIS で動かしてみました

前回にご紹介した Railsカンファレンスの IronRuby on Railsセッションで、Rails以外のWebフレームワークとしてrackが紹介されていました。rackは、Ruby向けの Webインターフェースを提供するフレームワークで、Ruby on Rails 2.3.x系も内部でrackと統合されています。このrackをIronRubyを使って、IISで動かしてみました。その動かし方を以下に記載します。 1.必要なもの IronRuby 0.5.0 rack 1.0.0 IronRuby.Rack Ruby 1.8系 2.rackのインストール 「igem install rack」コマンドでインストールします。私の場合は、PATHとGEM_PATH環境変数を設定後に実行しました。実行すると以下のようなメッセージが出力されます。C:>igem install rack Successfully installed rack-1.0.0 1 gem installed Installing ri documentation for rack-1.0.0… Installing RDoc documentation for rack-1.0.0… mscorlib:0:in `GetBytes’: 値が有効な範囲にありません。 (System::Text::EncoderFallbackException) from :0:in `write’ from :0:in `puts’ from c:/ruby/lib/ruby/site_ruby/1.8/rubygems/ user_interaction.rb:227:in`alert_error’ from c:/ruby/lib/ruby/site_ruby/1.8/rubygems/ user_interaction.rb:103:in`alert_error’…

0