荒井省三のBlog

  • IronPython 2.0RC2

    出ていました。RC2に同期しているらしい、DLR 0.9も公開されています。

    今月は、忙しくてなかなかブログを更新できていません。Silverlight Dynamic Languageシリーズも次回位で終了にしたいのですが、時間が取れていません。期待して方々に、改めてお詫びを申し上げます。

  • DLR プロジェクト

    ちょっとしたお知らせです。
    DLR自体が単独のプロジェクトとして11月から開始されるようです。

  • Silverlight Dynamic Language SDK の使い方4

    今回は、 Chiron.exeの/bや/z、/mオプションで作成されるアプリケーション・マニフェストを説明します。例題とするのは、DLR Consoleで使用されているAppManifest.xamlです。

    <Deployment 
      xmlns="http://schemas.microsoft.com/client/2007/deployment"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      RuntimeVersion="2.0.31005.00" 
      EntryPointAssembly="Microsoft.Scripting.Silverlight"
      EntryPointType=
      "Microsoft.Scripting.Silverlight.DynamicApplication"
    >
      <Deployment.Parts>
        <!-- Add additional assemblies here -->
        <AssemblyPart Source="Microsoft.Scripting.Silverlight.dll"/>
        <AssemblyPart Source="Microsoft.Scripting.Core.dll" />
        <AssemblyPart Source="Microsoft.Scripting.dll" />
        <AssemblyPart Source=
              "Microsoft.Scripting.ExtensionAttribute.dll" />
        <AssemblyPart Source="IronPython.dll" />
        <AssemblyPart Source="IronPython.Modules.dll" />
        <AssemblyPart Source="IronRuby.dll" />
        <AssemblyPart Source="IronRuby.Libraries.dll" />
        <AssemblyPart Source="Microsoft.JScript.Runtime.dll" />
        <AssemblyPart Source="Microsoft.JScript.Compiler.dll" />
      </Deployment.Parts>
    </Deployment>


    最初に取り上げるのが、Deployment要素のEntryPointAssembly属性とEntryPointType属性です。ここには、以下のように記述されています。

    • EntryPointAssembly="Microsoft.Scripting.Silverlight"
    • EntryPointType="Microsoft.Scripting.Silverlight.DynamicApplication"

    属性名が表しているようにSilverlight2.0対応のランタイムが起動するプログラムが格納されたアセンブリと開始するクラスを指定しています。このDynamicApplicationクラスこそが、SilverlightとDLRを結びつけるものです。このエントリポイントのモデルは、DLRに限った話ではなくC#やVBを使ったSilverlightアプリケーションでも使用されているものです。そして、DynamicApplicationクラスはSystem.Windows.Applicationクラスを継承しています。

    Deployment.Parts要素内のAssemblyPart要素にSilverlightランタイムが読み込むアセンブリをSource属性で指定します。ここで指定しているアセンブリを以下に示します。

    アセンブリ名 説明
    Microsoft.Scripting.Silverlight.dll Silverlight 2.0ランタイムのエントリポイントです。
    Microsoft.Scripting.Core.dll DLRの本体です。
    Microsoft.Scripting.
    ExtensionAttribute.dll
    IronPython 2.0RC1から追加されたDLRの補助アセンブリです。ビルド時のSystem.Core.dllとの衝突を回避するために導入されました。
    Microsoft.Scripting.dll DLRを使用するための各種ヘルパーです。


    これ以外のアセンブリが、動的言語のためのものです。アセンブリ名から、IronPython、IronRuby、Managed JScript用がどれかというのは自明でしょう。そしてSource属性は、上記のような書き方以外にURLによる記述も可能です。URLを使った表記の場合は、相対パスではなく絶対パス(http://で始まる)の記述になります。URLで記述した場合は、xapファイル内に対象のアセンブリを含める必要はありません。

    プログラムを開発する上でSilverlight SDKなどで提供される拡張アセンブリを使用する場合は、AssemblyPart要素に記述する必要とxapファイルに含める必要があります。Visual StudioのSilverlightプロジェクトでは、この一連の作業をVisual Stduioが行ってくれます。動的言語で開発する場合は、自分でAppManifest.xamlへの記述とxapファイルへのアセンブリをパッケージングする必要があります。後は、使用される動的言語によって追加したアセンブリに対する参照を記述するれば、スクリプトの中から使用することが可能になります。

    #IronPython
    import clr
    clr.AddReference(アセンブリ識別子かアセンブリ名)
    import文かfrom -- import 文で参照を行う

    #IronRuby
    require 'アセンブリ識別子'
    

    上記のように参照を行うことで、スクリプトの中から自由に参照したアセンブリを使用することができるようになります。ちなみに、アセンブリ識別子とは「System.Windows, Version=2.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e」という形式のことです。

    最後に添付のapp.pyは、最初にご紹介したDLR Consoleのキーマッピングを日本語キーボード用に変更(TextInputHandlerクラス)したものです。ライセンスは、Silverlight Dynamic Language SDKがMS-PLですので、それに準拠したご使用をお願いいたします。

    Posted Tuesday, October 28, 2008 3:52 PM by shozoa | 1 Comments
    Filed under: , , ,

    Attachment(s): app.py
  • Silverlight Dynamic Language SDK の使い方3

    Dynamic Language SDK で提供されるスクリプトのserver.batとは、chiron.exeをラップしただけのものです。このため指定できるオプションを確認するには、「/?」か「/h」オプションを指定します。指定できるオプションを以下に示します。

    オプション
    説   明
    /d:パス 又は /dir、/directory アプリケーション(スクリプトやプログラム)を格納しているフォルダを指定します。デフォルトは「app」になります。
    /x:xapファイル 又は /xap、/xapfile xapファイルを作成する場合に「/x:app.xap」のようにxapファイルを指定します。/dで指定したフォルダの中身がxapファイルに格納されます。
    /n 又は /nologo バナーの表示を抑制します。
    /s 又は /silent コンソール出力を抑制します。
    /z:xapファイル 又は /zipdlr DLRアプリケーション向けのxapファイルを生成します。/dで指定したフォルダにAppManifest.xamlが存在しなければ自動的に生成します。/xオプションとの違いは、スクリプトファイルを解析して必要なアセンブリと生成したAppManifest.xamlをxapファイル内に含めることです。
    /w 又は /webserver テスト用のWebサーバーを起動します。デフォルトのポートは、2060になります。ポートを指定する場合は、/w:ポート番号と指定します。
    /b 又は /browser テスト用のWebサーバーを起動して、ブラウザを起動します。開始時のURLを指定するには、/b:パスオプションを指定します。/dオプションを組み合わせれば、WebサーバーのトップURLの場所を指定することができます。
    /m 又は /manifest アプリケーション・マニフェスト(AppManifest.xaml)を生成します。
    /? 又は /h、/help ヘルプを表示します。
    /r:パス 又は /refpath 参照するアセンブリへのパスを指定します。デフォルトは、Chiron.exeが存在するフォルダを参照します。
    このオプションは、ヘルプに表示されません。

    オプションの使い方は、ヘルプコマンドで確認するか、SDKに含まれるReadme.txtに記述されています。

    前回に解説したプログラムをテスト実行するだけであれば、「chiron.exe /b /d:アプリケーションフォルダ」を実行することでブラウザで実行することができます。

    配布用にXAPファイルを作成するには、以下のようにコマンドを入力します。

    chiron.exe /d:アプリケーション・フォルダ /z:app.xap
    


    これでXAPファイルが出来ますので、index.htmlとjavascriptフォルダ、stylesheetsフォルダ、作成したXAPファイルをWebサーバーへ配置すれば本番環境への移行が完了します。

    chiron.exeは/xオプションでXAPファイルを作成できますが、このオプションは動的言語に特化したものではありません。どういう場合に使うかというと、既存のXAPファイルを展開して、中身のリソース(画像など)を入れ替えた場合などの再XAP化に使用することができます。つまり、リソース入れ替えでVisual StudioのリビルドなどをしなくてもXAPファイルを作成できるのです。具体的には、以下のようなコマンドを入力します。

    chiron.exe /d:アプリケーション・フォルダ /x:app.xap
    


    /dオプションで指定したフォルダに配置したファイル(AppManifest.xaml、dllなど)をそのままxapファイルにパッケージ化します。
     
    /bオプションや/wオプションでWebサーバーを起動した場合は、ブラウザ・リクエストによるログがコンソールに表示されます。このコンソールを終了する場合は、コンソールで「CTRL+C」を入力するか、ブラウザで「http://localhost:2060/bye!」のように「bye!」コマンド入力してください。これで、Webサーバーが終了します。

    追伸:IronPython 2.0 RC1が先週にリリースされました。今回はToyScriptのサンプルも公開されていますので、DLRの使い方を調べやすいと思います。

    追記:RednaxelaFXさんのご指摘で、/nologの書き間違いを/nologoに訂正しました。それと/zオプションに/xオプションとの違いを追記しました。

  • Silverlight Dynamic Language SDK の使い方2

    今回は、SDKで提供されるテンプレート集の構造を説明します。最初にindex.htmlのobjectタグを解説します。

    <object data="data:application/x-silverlight,"
            type="application/x-silverlight-2" 
            width="100%" height="100%">
      <!-- 
         XAPファイルを指定します。指定したファイル名が
          開発中に使用するフォルダ名になります。
        -->
      <param name="source" value="python.xap"/>
    
      <!-- 
          "initParams"はkey=valueの形式で、カンマ区切りで複数の
           パラメータを指定できます。
        -->
      <param name="initParams" value="debug=true,
             reportErrors=errorLocation" />
            
      <!-- Silverlightランタイムのエラーを処理する
            javascript関数を指定します。この関数は
            javascripts/error.js で定義されています。 -->
      <param name="onerror" value="onSilverlightError" />
          
      <!-- 
          他のパラメータは、Silverlightのプロパティです。
       -->
      <param name="background" value="white" />
      <param name="windowless" value="true" /&lg;
    
      <!-- 
          Silverlight ランタイムのインストール用のリンクです。
        -->
      <a href="http://go.microsoft.com/fwlink/?LinkID=124807" 
          style="text-decoration: none;">
        <img src="http://go.microsoft.com/fwlink/?LinkId=108181" 
             alt="Get Microsoft Silverlight" 
             style="border-style: none"/>
      </a>
    </object>

    以下に指定しているパラメータの説明を記載します。

    パラメータ名 説   明
    objectタグのtype "application/x-silverlight-2"がSilverlight2.0の指定です。HTTPサーバーのMIMEタイプに拡張子xapを設定する必要があります。
    source xapのファイル名を指定します。開発中の場合は、ファイル名(拡張子除き)のフォルダを作成します。この例では、「python」フォルダになります。
    initParams DynamicApplicationに対してカンマ区切りで複数のパラメータを指定します。これが動的言語を起動するために必須のものです。
    start:複数のスクリプトファイルがあれば、エントリーポイントとなるスクリプトファイルを指定します。defaultは、「app」になっています。
    debug:エラー時にスタックトレースを出力するかどうかを指定します(デバッグ用です)。defaultは、falseです。
    reportError:エラーが発生した場合にエラー内容を出力するHTML要素のIDを指定します。この例では「errorLocation」を指定しており、HTML内でdivタグで定義しています。defaultはnullです。
    exceptionDetail:例外の詳細情報(マネージ スタックトレース)を出力するかどうかを指定します。defaultは、falseです。
    onerror Silverlightランタイムのエラーを処理するjavascript関数を指定します。


    Silverlight2.0で動的言語を使う上で重要なのが、initParamsパラメータになります。ここで動的言語の起動用の様々な指定を行っています。このパラメータは、Microsoft.Scripting.Silverlight.DynamicApplicationクラスのコンストラクタに渡されます。独自のパラメータを指定した場合は、DynamicApplicationクラスのInitParamsプロパティを使って辞書オブジェクトへアクセスすることができますので、起動時に自分用のパラメータを指定することも可能です。

    python言語のテンプレートでは、python.xapが指定されていますのでpythonフォルダ内にapp.pyがあることになります。このapp.pyの内容を以下に示します。

    from System.Windows import Application
    from System.Windows.Controls import UserControl
    
    class App:
      def __init__(self):
        root = Application.Current.LoadRootVisual(
                             UserControl(), "app.xaml")
        root.Message.Text = "Welcome to Python and Silverlight!"
    
    App()
    


    Pythonコードで、Appクラスを定義してからAppクラスのインスタンスを作成するようになっています。ここでのポイントは、System.Windows.Applicationクラスの使い方にあります。

    • from 文は、C#のusing文、VBのImports文に相当します。
    • Application.CurrentプロパティでApplicationクラスのインスタンスを取得します。このインスタンスがDynamicApplicationクラスになっています。
    • LoadRootVisualメソッドを使ってXAMLファイルを読み込んでいます。このメソッドの1つ目の引数がUserControlのインスタンスで、2つ目の引数がXAMLのファイル名です。戻り値に、XAMLファイルで指定したルートオブジェクトが戻ります。1つ目の引数に指定するオブジェクトは、XAMLファイルのルートで指定したものになります。よって、Canvasタグが指定されている場合はCanvasオブジェクトになります。
    • root.Message.Textプロパティに文字列を指定しています。Messageオブジェクトは、XAMLファイルで定義されたTextBlockのインスタンスです。

    以下にapp.xamlを示します。

    <UserControl x:Class="System.Windows.Controls.UserControl"
        xmlns="http://schemas.microsoft.com/client/2007"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
      <Grid x:Name="layout_root" Background="White">
        <TextBlock x:Name="Message" FontSize="30" />
      </Grid>
    </UserControl>
    

    このapp.xamlをapp.pyと同じフォルダに配置します。従ってPythonのコードで指定しているXAMLファイル名を変更すれば、app.xamlである必要はありません。テンプレート集では、スクリプトファイルの名前がdefaultでappになっているために、XAMLファイルも同じように合わせていると思われます。
    app.pyをユニコードのエンコードにして、設定している文字列を日本語にしてみてください。問題なく、日本語が表示されます。Silverlightで日本語を含むマルチバイトの言語を使用するには、スクリプトファイルのエンコードをユニコードにする必要があります。これは、使用する言語に左右されません。Silverlight上の言語実装が、このようになっている模様です。事実、IronPython2.0ベータのインタラクティブシェルなどで試すとファイルエンコーディングを指定して様々なエンコードのスクリプトファイルを処理することができます。よって、Silverlightで動作させるために削減された機能の1つが、スクリプトファイルのエンコーディング指定のようです。

    追伸:サンプルのcollateraldamageのPython版について
    ゲームのサンプルですが、Python版を試すとエラーが発生します。リーソースが見つかりませんというものです。エラーが発生しても継続することはできます。このエラーを回避するには、index.html内のonSilverlightError関数に以下を追加する必要があります。

      else if (errorType == "ImageError")
      {
          // ImageErrorを握り潰す
          return;
      }
    
    これでリソースイメージエラーが発生しなくなります。
  • Silverlight Dynamic Language SDK の使い方1

    既にご案内したようにSilverlight 2.0に対応したDynamic Language SDKがリリースされています。Codeplexのサイトには、以下の5種類が公開されています。

    • sdlsdk-0.4.0(Everything):バイナリ、サンプル、ソースが含まれています。
    • sdlsdk-0.4.0-bin:バイナリのみ。
    • sdlsdk-0.4.0-samples:サンプルのみ。
    • sdlsdk-0.4.0-src:ソースコードのみ。
    • sdlsdk-0.4.0-symblos:デバッグなどで使用するシンボル。

    開発に利用するには、sdlsdk-0.4.0(Everything)がお勧めでしょう。このパッケージには以下のようなフォルダ構造が含まれています。

    bin chiron.exeや使用するdllが含まれます
    samples サンプルプログラム
    script 起動用のスクリプトと開発用のテンプレート集(templatesフォルダ)
    src ソースコード(Managed JS除き)
    ルート直下のファイル Readmeとライセンス


    テンプレート集を試すには、scriptフォルダでコマンドプロンプトを開いて、「server /b」を実行するとブラウザが開きます。templates/言語フォルダ/index.htmをブラウザで開くことで、テンプレート集で提供されているプログラムを動かすことができます。

     テンプレート集で提供されている構造は以下のようなものです。

    javascriptフォルダ error.js:Silverlightランタイムのエラー時に指定するonSilverlightError関数が定義されています。
    言語フォルダ app.言語拡張子、app.xaml:言語のコードサンプルと単純なXAML(GridとTextBlockだけ)が定義されています。
    stylesheetsフォルダ screen.css、error.css:error.cssはSilverlightランタイムのエラーなどを表示するスタイルシートで、フォントがCourier Newになっています。
    index.html Silverlightを起動する指定がobjectタグで記述されています。

    このテンプレートを使ってカスタマイズして、動的言語を使ったSilverlight2 アプリを開発できるようになっています。

    このテンプレートを使って開発するには、scriptフォルダにある「sl.bat」ファイルを使用するのが簡単です。sl.batの使い方は、scriptフォルダでコマンドプロンプトを開いて以下のようにコマンドを入力します。

     sl  言語  アプリケーションフォルダ

    言語には、「python」「ruby」「jscript」を指することができます(要は、templatesフォルダ内にある言語フォルダの名前です)。アプリケーションフォルダとは、開発するアプリケーションを格納するフォルダのことです。これで上記のコマンドを実行すると、templatesフォルダで提供されているテンプレート集を指定したアプリケーションフォルダにコピーしてくれます(xcopyです)。これで、必要なコードを記述していけばよいということになります。

    提供されているサンプルを試す場合は、scriptフォルダでコマンドプロンプトを開いて以下のようにserver.batにオプションを付けて実行します。

    server /d:..\samples /b

    /dオプションで、開始するフォルダを指定しています。/bオプションは、ブラウザを開く指定です。後は、ブラウザを使って提供されているサンプル(jscript、python、ruby)のフォルダをナビゲートしてindex.htmlを開けば、サンプルプログラムが動作します。

    次回は、実際の開発時の注意点などを含めてまとめていきます。

    #この時点で試されるかたは、スクリプトファイルのエンコードをunicodeにするようにしてください。日本語を扱うには、エンコードがunicodeになっている必要があるからです。

  • Silverlight 2.0RTM 用のDynamic Language SDKが公開されました

     Silverlight 2.0 RTM対応のDynamic Language SDKが、もうまもなく公開されるようです。JimmyさんのBlogで、リリースの案内が掲載されています。日本時間では、明日でしょうか。codeplexのサイトで公開されますので、今日・明日にでもUpされるのでしょう。
    と書きながらチェックしたらUpされました。バージョンは、10月初めに公開された0.4.0のままです。

  • GAX のVS08SP1用のアップデータが公開されました

    Guidance Automation eXtensionのVisual Studio 2008 SP1に対応したアップデートがリリースされています。このリリースのインストールは、以下のような順序で行います。

    1. Visual Studio 2008 SP1
    2. Visual Studio 2008 SDK 1.1
    3. GAX 2008 February
    4. Guidance Automaintion Toolkit 2008 February
    5. Guidance Automation eXtension Update

    このアップデートのインストールそのものは、GATをインストールする前でも良いかもしれませんが、私は上記の順番で日本語版のVisual Studio 2008にインストールして動作を確認しました。
     それから詳細を確認できていないのですが、私の環境ではDSL ToolsのDomain Specific Languageプロジェクトでテキスト・テンプレートの生成が失敗する現象が発生しました。インストールは、VS SDK 1.0をアンインストールしてから前述の順番で行ったのですが。仕方ないので、レジストリエディタでテキスト・テンプレートの検索パスを調べたら環境変数を使う形式になっていたので、フルパスに書き換えて動作するようになりました。

  • Dynamic Language SDK 0.4.0 が公開されています

    Silverlight2.0 RC0に対応したDynamic Language SDK 0.4.0が公開されています。

    お知らせまで。

    追伸:まだ、DLRの変更点とかまで調べきれていません。

  • ASP.NET 動的言語サポートのリフレッシュ

     昨年にリリースされたASP.NET FutureというCTPにDynamic Languageサポートが含まれていたのを皆さんは、覚えていらっしゃるでしょうか。その後は、特に新しいCTPが出るでもなく経過しておりましたが、codeplexのASP.NETプロジェクトから更新されたものがリリースされています。提供されているのは、以下の3種類です。

    • ASP.NET WebForms IronPython サンプル
    • ASP.NET MVC IronPython サンプル
    • ドキュメント

    昨年のCTPのようにVisual StudioのIDEに統合したプロジェクトの提供ではありませんが、確かにPythonのコードがWebフォームのコードビハインドとして動作するようになっています。サンプルを既存のWebサイト(ファイルシステム)としてVisual Studioで開けば、デバッグも含めて実行することができます。

     このサンプルに含まれているDLRは、IronPython 2.0ベータ4相当(厳密には、ベータ4とベータ5の中間くらいかも知れません)の模様です。というのもネームスペースを調べると、System.Scriptingになっているからです。そしてサンプルのBinフォルダにMicrosoft.Web.Scripting.dllが提供されています。web.configを見ると、このdllを使ってhttpモジュールを登録しています。登録しているhttpモジュールが、DLRをホスティングすることでIronPythonのLanguageContextを使用するようになっています。
    ご興味があれば試してみてください。

  • Dynamic Language SDK を使った ZIPアーカイブの使い方

    C#などの言語でZIPアーカイブを取り扱うには、幾つかの方法があります。全てではないにしても、その代表的なものを以下に記載します。

    • J#のZipライブラリを使用する。
    • Windows Shell APIを使用する(COMを使うのが簡単)。
    • フリーのライブラリを使用する(たとえば、ここなど)。
    • 統合アーカイバ プロジェクトのライブラリを使用する。
    • 市販のコンポーネントを使用する。

    これ以外にも、独自に作成したりと幾つかの方法を考えることができるでしょう。ここでは、Silverlight Dynamic Language SDKで提供されるChiron.exeユーティリティを利用してみたいと考えています。Chiron.exeは、IronPython、IronRuby、Managed JScriptを使ってSilverlightアプリを開発する時に使用するユーティリティです。このユーティリティで「Chiron /z:app.xap /d:App」を実行することで、XAPファイルを作成することができます。XAPファイルは、ZIPアーカイブの拡張子をXAPにしただけのファイル・フォーマットです。つまり、Chiron.exeユーティリティの中にZIPアーカイブを扱うライブラリがあるわけです。このChiron.exeのソースコードもDynamic Language SDKで提供されています。これ以外にも、IronPython 2.0やIronRubyプロジェクトのソースコードにもChiron.exeのソースコードが含まれています。これらのプロジェクトで配布されているソースコードはライセンスがMS-PLですから、MS-PLを守ればソースコードを流用することも可能になっています。今回、利用するソースコードは、以下の2つです。

    1. Chiron\Zip.cs (ZIPアーカイバのメインソース)
    2. Chiron\Crc32.cs (CRC計算用のヘルパー)

    Zip.csには3つのクラスが定義されており、その中のZipArchiveクラスとZipArchiveFileクラスを利用します。ZipArchiveクラスが、Zipアーカイバそのものを扱うクラスであり、Zipアーカイバに含まれるエントリ(ファイル)がZipArchiveFileクラスのコレクションで扱います。つまり、ZipArchiveFileクラスがZipアーカイブに含まれる1エントリを扱うためのクラスになるのです。
     ZipArchiveクラスを利用する上で、必ず守らなければならない手順があります。それは以下のようなものです。

    1. ZipArchiveのインスタンス作成
    2. 各種操作(アーカイバの作成や展開など)
    3. ZipArchive.Closeメソッドの呼び出し

     次に良く使用するだろうと考えられるメンバーを以下にまとめます。

    メンバー名
    説   明
    ZipArchive(string archivePath) コンストラクタで、読み取り専用のZIPアーカイブを開きます。
    archivePath:ZIPアーカイブのファイル名
    ZipArchive(string archivePath, FileAccess access) コンストラクタで、読み書き用(FileAccess.ReadWrite)にZIPアーカイブを開きます。
    archivePath:ZIPアーカイブのファイル名
    access:ファイルのオープンモード(FileAccess.ReadWriteを指定します)
    Countプロパティ ZIPアーカイブに含まれている要素数を戻します。
    Filesプロパティ ZIPアーカイブに含まれているZipArchiveFileのコレクションを戻します。このコレクションを使うことで、ZIPアーカイブに含まれる様々な情報や個別の展開などを行うことができます。
    CopyFromDirectory(string sourceDirectory, string targetDirectory) 指定したフォルダからZIPアーカイブへ追加します。
    sourceDirectory:ZIPアーカイブへ追加するフォルダ
    tagetDirectory:ZIPアーカイブ上のルートフォルダを指定します。空文字は、ルート直下となります。
    CopyToDirtectory(string sourceArchiveDirectory, string targetDirectory) ZIPアーカイブを指定したフォルダへ展開します。
    sourceArchiveDirectory:ZIPアーカイブ上の展開したいフォルダ名を指定します。空文字は、ルートとなり全てのエントリが展開されます。
    targetDirectory:展開先のフォルダを指定します。
    CopyFromFile(string sourceFilePath, string targetArchivePath) ZIPアーカイブへ指定したファイルを追加します。
    sourceFilePath:ZIPアーカイブへ追加するファイルを指定します。
    targetArchivePath:ZIPアーカイブ内のフォルダを指定します。空文字は、ルートとなります。
    CopyToFile(string sourceArchivePath, string targetFilePath) 指定したZIPアーカイブのエントリを指定したファイルへ展開します。
    sourceArchivePath:ZIPアーカイブのエントリの名前のインデクサ(ZipArchiveFile.Name)です。
    targetFilePath:展開先のファイル名をフルパスで指定します。
    Close() ZipArchiveクラスのインスタンスで使用したリソースを解放します。

      これ以外にもメンバーはありますが、この程度が頻繁に使うものだと考えられます。ZipArchiveクラスのエントリになるZipArchiveFileクラスから、様々な情報を取得することができます。その代表的なメンバーを以下に示します。

    メンバー名
    説    明
    Nameプロパティ ファイル名で、フルパス(ZIPアーカイブをルートとしています)で表現されます。ファイル名だけを取得するには、パス区切りで分割などして取り出します。
    Lengthプロパティ ファイルサイズです。
    LastWriteTimeプロパティ ファイルの最終更新日です。
    ReadAllText()メソッド テキストファイルの場合に、その内容を文字列で取得します。

      後は圧縮されたサイズが参照したくなるかも知れませんが、ZipArchiveFileクラスで圧縮サイズを返すメンバーが用意されていません。このため自分で取得するメンバーを実装する必要があります(プライベート変数にcompressedDataが用意されているので、この変数のLengthなどを返すようにすれば取得することができます。もっともCopyFromFileメソッドを実行した直後は、compressedDataがnullになっていることに注意が必要です。

     ここまでで必要になるクラスやメンバーの説明が完了しました。以下に新しいZIPアーカイブを作成するサンプルコードを提示します。

    // 新規のアーカイブ作成
    ZipArchive zipArchive = new ZipArchive(
    "アーカイブ名", FileAccess.ReadWrite); // アーカイブへ指定フォルダを追加 zipArchive.CopyFromDirectory(
    "追加するフォルダ", "アーカイブ上のフォルダ名"); // アーカイブをクローズ zipArchive.Close() // アーカイブを開く zipArchive = new ZipArchive("アーカイブ名"); // エントリを取得 foreach (ZipArchiveFile item in zipArchive.Files) { // エントリの一覧などを処理する; } // アーカイブをクローズ zipArchive.Close()

    後は、説明したメンバーなどを活用すればZIPアーカイブに対する操作は一通りできるようになると思います。ここで使用したZipArchiveクラスでは、残念ながらパスワード付きZIPには対応していませんので、パスワード付きZIPを作成したい場合は、別の方法を使って下さい。

    最後に、Windows エクスプローラで作成したZIPアーカイブをZipArchiveクラスで扱う場合の注意点を以下に記します。

    • ZipArchiveFile.Lengthプロパティがゼロのメンバーが存在します。
    • ZipArcihveクラスは、ZipArchiveFile.Lengethプロパティのゼロを想定していませんので、エラーになります。

    この問題を回避する場合は、必要なメソッドに対処コードを追加する必要があります。

  • DLR ベータ5 について

    IronPython 2.0ベータ5がリリースされてから、DLRにどのような変更が行われているかを調べてみました。一番、大きな変更はネームスペースの変更なのですが、ベータ4に対して以下のようになっています。

    • System.Scripting-> Microsoft.Scripting

    Systemというネームスペースが廃止されて、元のMicrosoftというネームスペースに戻っています。それからScriptRuntimeクラスからCreateメソッドが廃止されて、コンストラクタがScriptRuntimeSetupクラスの引数を取るようになっています。この関係でWell Known Languageを指定するScriptRuntimeSetupクラスのコンストラクタからbool引数が廃止されています。この代わりにReadConfigurationメソッドが追加されています。この変更に伴ってScriptRuntimeクラスにもCreateFromConfigurationメソッドが追加されています。この追加されたメソッドを使用するには、app.configに以下の記述を行います。

    <configuration>
      <configSections>
        <section name="microsoft.scripting"
            type="Microsoft.Scripting.Hosting.Configuration.Section,
                  Microsoft.Scripting, Version=1.0.0.5000,
                  Culture=neutral, PublicKeyToken=null"
                  requirePermission="false" />
      </configSections>
    
      <microsoft.scripting>
        <languages>
          <language names="IronPython;Python;py"
                       extensions=".py"
                       displayName="IronPython 2.0 Beta"
                       type="IronPython.Runtime.PythonContext,
                       IronPython, Version=2.0.0.5000,
                       Culture=neutral, PublicKeyToken=null" />
        </languages>
    
        <options/>
      </microsoft.scripting>
    </configuration>
    


    languageタグに仕様使用する言語を記述しておくことで、ReadConfigurationやCreateFromConfigurationメソッドでScriptRuntimeSetupクラスをWell Known Languageで初期化することができます。IronRuby svn 148のソースツリーは、既にこの対応が行われていて、Python、Ruby、JScript、VB、ToyScriptが記述されています(VBのリリース状況がどうかは不明です)。

    それからObjectOperartions.GetMemberNamesメソッドは正常に動作するようにバグ対応が行われていました。また、Expressions.ExpressionクラスからCodeContextメソッドが削除され、Microsoft.Scripting.Ast.UtilsクラスにCodeContextメソッドが追加されています。細かな変更は他にもありますが、ホスティングする上では上記の内容程度で対応することができます。TechEdの独自言語サンプルなどのベータ5への移植は、それほど手間がかかりませんので、試される方は試してみてください。

  • IronPython 2.0 Beta5 がリリースされました

    ベータ5がリリースされました。リリースノートによると、もうじきRC1が出来ると書いてあります。残っていたバグ対応とDLRのネームスペース変更などが行われていると書かれています。まずは、お知らせまで。

  • 現在のDLRにTreeCompilerは存在するのか

    以前のDLRのASTのみを使うというエントリでTreeCompilerを使う方法を説明しました。最近のDLRでは、どうなったでしょうか。結論から云えば、IronPython 2.0 ベータ4ではTreeCompilerは無くなっています。その代わりに、以下のような方法を使うことでDLRのASTのみを使うことができます。

    using System;
    using System.Collections.Generic;
    using System.Text;
    
    using System.Linq.Expressions;
    using Microsoft.Scripting.Ast;
    
    namespace AstTest
    {
      class Program
      {
        delegate void MyFunc();
    
        static void Main(string[] args)
        {
          LambdaBuilder lambdaBuilder = Utils.Lambda(
                        typeof(void), "MyFunc", Annotations.Empty);
    
          var helper = typeof(Console).GetMethod("WriteLine",
                                        new[] {typeof(string)});
    
          // 1行の場合
           //lambdaBuilder.Body = Expression.Call(
          //       helper, Expression.Constant("Hello, world"));
          // 複数行の場合
           lambdaBuilder.Body = Expression.Block(
                 Expression.Call(helper, 
                            Expression.Constant("Hello, world")),
                 Expression.Call(helper,
                            Expression.Constant("Hello, world")),
                 Expression.Call(helper,
                            Expression.Constant("Hello, world")));
    
          LambdaExpression lambdExpression = lambdaBuilder.MakeLambda();
          // 型パラメータを作成したコードブロックに一致させる
           MyFunc myFunc = lambdExpression.Compile<MyFunc>();
          myFunc();
    
          Console.ReadKey();
        }
      }
    }
    


    これにMicrosoft.Scripting.dllとMicrosoft.Scripting.Core.dllへ参照を追加し実行すれば、「Hello, world」の文字列が3回コンソールに出力されます。

    この内容からDLRのASTの基本的な使い方を理解することができます。それは、以下のようなことです。

    • LambdaBuilder:戻り値型やメソッド名などを指定する。
    • LambdaBuilder.Body:Expressionクラス(ASTによって作成される式)のインスタンス。
    • MakeLambdaメソッド:MakeLambdaメソッドによって、LambdaExpressionを作成する。
    • LambdaExpression.Compileメソッド:LambdaExpressionをコンパイルして、結果をデリゲートのインスタンスとして返す。
    • デリゲートを呼び出す。

    この使い方を理解できれば、If文やループなどに応用することができます。

    追記:Naitoさんよりフィードバックを頂きました。正確にはBeta4でCompile<T>()メソッドが削除されていて、Beta5に含まれています。このためNaitoさんのご指摘通り、Compile()メソッドを使って、Microsoft.Actionクラスを受け取り、DynamicInvokeメソッドで実行することができます。

  • DLR Console を使って時計をドラッグするサンプル

    前回のエントリで Silverlight Dynamic Language SDK 0.3.0がリリースされたと記載しました。このSDKで提供されているサンプルにDLR Consoleがあります。もっともDLR Consoleは、SDK 0.2.0(Silverlight 2.0 ベータ2と一緒に提供されたものです)で動作するようになっています。SDK 0.3.0に含まれているDLRを調べると、IronPythonのChangeset38029以降のもののようです。このためIronRubyプロジェクトで今日時点で公開されているSVN138よりも新しいDLRになります。このDLRでは、ホスティングAPIなどの細かな変更やネームスペースの変更が行われています。

    SDK 0.3.0のDLR Consoleでは、時計をドラッグするというRuby用のスクリプトが含まれています。時計をドラッグするサンプルは、Jimmyさんのブログに解説がありビデオのリンクやDLR Consoleを試すリンクなどがあります(英語キーボードなのでご注意ください)。このサンプルを動かしているのが、以下の画像になります。
    DLR Console

    ここで入力しているコードを以下に記載します(Jimmyさんのブログには、一か所不足しているコードがありますので)。

    require 'lib/clock'
    $clock = Clock.show
    require 'lib/drag'
    Drag.new($clock.canvas).enable
    


    これで私は上記のサンプルを動作させることができました。
    ちなみに今日時点でIronPythonの最新のChangesetは38690がUpされています。

    追伸:実はTechEdでこのデモをお見せしようとしたのですが、時間が足りなくて忘れてしまいました。Peer Talkで一部の方に受けていたのが、このサンプルです。

More Posts Next page »

© 2008 Microsoft Corporation. All rights reserved. Terms of Use  |  Trademarks  |  Privacy Statement
Microsoft
Page view tracker