MOSA Multi-OS Software Artists

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

プログラマーに興味がある方なら誰でも入会いただけます。
MOSA Multi-OS Software Artists
===SINCE 1995===

  • iPhone/iPod touch アプリ紹介
  • MOSA掲示板
  • 活動履歴
  • About MOSA(English)

MOSADenバックナンバー 2008年8月発行分

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

    2008-08-26

    目次

    • WWDC初参加レポート
    • 「「Wonderful Server Life」    第76回   田畑 英和
    • 小池邦人のCarbon視点でCocoa探求
    • ターミナルの向こうから      第31回  海上 忍 

    Wonderful Server Life」  第76回  田畑 英和

      〜「サーバ管理」編〜

     今回は共有ポイントの設定について解説します。ファイルサービスを運用するにはサービスの管理だけでなく共有ポイントの管理も必要になります。また、Tiger Serverのころは「ワークグループマネージャ」を使って共有ポイントの管理を行っていましたが、Leopard Serverからは「サーバ管理」を使用するように変更になりました。こういった違いにも注意しましょう。

    ◇共有ポイントの設定
     共有ポイントを管理するには「サーバ管理」でサーバに接続し、左側のリストからサーバを選択した状態でツールバーの「ファイル共有」ボタンをクリックします。
     ファイル共有の設定画面では、ツールバーのすぐ下に「ボリューム」「共有ポイント」「リスト」「ブラウズ」の4つのボタンが表示されます。まず左の2つですが、「ボリューム」をクリックするとサーバ上のボリュームの一覧が表示され、「共有ポイント」をクリックすると共有ポイントの一覧が表示されます。
     右の2つのボタンですが「リスト」をクリックするとディスクの使用状況とともにボリュームもしくは共有ポイントの一覧を表示し、ブラウズをクリックすると各ボリュームまたは共有ポイントの中身をブラウズすることができます。新規に共有ポイントを作成するときには「ボリューム」と「ブラウズ」を組み合わせるのがよいでしょう。

    ・「ファイル共有」設定画面
    http://www.htabata.com/img/MXS105/afp/sharing_01.png

     画面下半分にはアクセス権の設定エリアが表示されます。ここではPOSIXのアクセス権だけではなく10.4から導入されたACLのアクセス権も設定できます。10.4ではACLには対応していたもののデフォルトでは無効になっていましたが、Leopardからはデフォルトで有効になりましたので、いつでもACLを設定することができます。
     またアクセス権の設定だけではなくボリュームを表示しているときには「クオータ」の設定/確認画面が、共有ポイントを表示しているときには「共有ポイント」の設定画面が表示されます。

    ◇共有ポイントの作成
     新規に共有ポイントを作成する場合は、まずツールバーのすぐ下のボタンで「ボリューム」と「ブラウズ」ボタンをクリックし、目的のフォルダを選択します。次に左上の「共有」ボタンをクリックし右下の「保存」ボタンをクリックすれば、新しい共有ポイントを作成できます。「サーバ管理」からサーバ上に新規にフォルダを作成することもできます。ただし「サーバ管理」からは、
    フォルダの名前を変更したり削除することはできません。
     共有ポイントを作成すると自動的に共有ポイントの設定エリアが表示されます。ここでは以下の4つの設定ができます。

     ・自動マウント
     ・Spotlight検索
     ・Time Machine
     ・プロトコルオプション

     ネットワークホームなどを用いるときには自動マウントの設定が必要になります。Spotlightの設定は、ネットワークを経由したSpotlight検索を有効にする設定です。共有ポイントを作成すると自動的にSpotlight検索が有効になります。
     ネットワーク経由でTime Machineのバックアップを行うには、共有ポイントをTime Machineのバックアップ先として設定します。Time Machineの設定をおこなった共有ポイントには「.com.apple.timemachine.supported」という空のファイルが作成されます。
     プロトコルオプションでは、共有ポイントに対するプロトコルごとの設定をおこないます。

    ・「共有ポイント」設定画面
    http://www.htabata.com/img/MXS105/afp/sharing_02.png

    ◇プロトコルオプション
     共有ポイントごとに「AFP」「SMB」「FTP」「NFS」に関する設定ができます。共有ポイントを新規に作成するとデフォルトでは「AFP」「SMB」「FTP」の3つのプロトコルでの共有が可能になります。実際に各プロトコルでアクセスするにはサービスが起動している必要があります。
     プロトコルオプションではまずプロトコルごとの共有のOn/Offが設定できます。ですので例えば「AFP」のみで共有するとか、「SMB」と「FTP」で共有するといった設定が可能です。基本的には使用していないサービスの共有はOffにしておきましょう。またサービスを起動したのにアクセスできない場合は、共有ポイントの設定を確認するようにしましょう。
     また「AFP」「SMB」「FTP」ではゲストアクセスのOn/Offも設定できます。ただし、実際にゲストアクセスを可能にするには、サービスの設定でもゲストアクセスが有効になっている必要があります。つまりゲストアクセスを有効にするには共有ポイントとサービスでの2段階の設定が必要になるということです。FTPではゲストアクセスのことをanonymousアクセスとも呼んでいます。

     「AFP」のプロトコルオプションの設定では、他にもカスタムAFP名の設定があります。これはサーバ上の実際のフォルダ名とは別の名前でクライアントに共有ポイントを公開する設定になります。カスタム名の設定は「SMB」と「FTP」にもありますので、プロトコルごとに異なる名前で共有ポイントを公開するような設定も可能です。
     Tiger Serverでは「AFP」のプロトコルオプションで、デフォルトのアクセス権に関する設定がありましたが、Leopard Serverの「サーバ管理」では設定がなくなりました。これはデフォルトでACLが有効になっているためと思われます。ACLでは親フォルダのアクセス権が継承されます。

    ・「プロトコルオプション(AFP)」設定画面
    http://www.htabata.com/img/MXS105/afp/sharing_03.png

     それでは、次回も引き続き「サーバ管理」について解説をしていきます。
    次回へつづく                             

    小池邦人のCarbon視点でCocoa探求(2008/08/22)

    〜 様々な画像ファイル取り込み方法 〜

    画像さえ登録してしまえば、ImageBrowserの扱いは簡単そうに見えます。しかし、その画像登録に色々なパタンが存在するので注意が必要です。今回は「しんぶんし3」でのドキュメントファイルや画像ファイルの取り扱いを復習しながら、登録ボタンで画像を追加していく処理を解説したいと思います。

    ここで、もう一度「しんぶんし 3」のドキュメントファイルや画像ファイルの取り扱い処理の一覧を示してみます。

    ・ドキュメントファイルの場合

    (1)ファイルメニューの「開く…」でファイルを読み込み内容をウィンドウに表示
    (2)ファイルメニューの「保存」で内容をファイルへ書き出す
    (3)ファイルメニューの「別名で保存…」で名称を変えてファイルへ書き出す
    (4)ファイルメニューの「最後に保存した状態に戻す」で編集をキャンセルする
    (5)未保存の編集済みウィンドウを閉じた時には「保存」処理を実行する
    (6)終了時に未保存の編集済みウィンドウに対して「保存」処理を実行する
    (7)アプリ・アイコンへのドロップで起動と内容を表示したウィンドウを開く
    (8)新規や登録済みウィンドウにドロップすることでその内容を追加登録する
    (9)ドキュメントのエイリアスファイルでも上記同等の処理を行えるようにする

    ・画像ファイルの場合

    (1)画像追加ボタンでウィンドウに画像を追加登録
    (2)ドラッグ&ドロップでウィンドウに画像を追加登録
    (3)アプリ・アイコンへのドロップで新規ウィンドウを開き画像を登録
    (4)画像ファイルが含まれたフォルダについても上記と同等の処理を行う
    (5)画像ファイルのエイリアスファイルについても上記と同等の処理を行う

    ドキュメントファイルの(1)から(7)までの処理は、Info.plistに対象ドキュメントのタイプや拡張子を正しく記載しておけば、NSDocumentクラスが、そのほとんどを自動処理します。(8)や(9)の一部、画像ファイルの(1)から(5)までの処理はすべて自分で実装します。また「ドキュメントファイルへの保存」に関する(2)(3)(5)(6)については、とりあえず画像取り
    込みとは直接関係ないので、まずは、それ以外の処理(ImageBrowserへの画像の登録に関わる処理)を順次実装して行きます。 順番としては(1)の「画像追加ボタンでウィンドウに画像を追加登録」から実装することにしましょう。

    ユーザが画像追加ボタンをクリックすると、Interface Builderでリンクしておいたアクションメソッドが呼び出されます。今回の場合には、addImage:メソッドがそれに相当します。以下が、そのaddImage:メソッドです。最初に、NSOpenPanelクラスを用いてファイル選択用ダイアログを表示します。画像ファイルを選択できるようにするだけでなく、フォルダ(ディレクトリ)も
    選択可能に設定しておきます。ユーザが、ファイルやフォルダを選択しOKボタンをクリックしたら、そのパス名(NSString)を返してきます。

    - (IBAction)addImage:(id)sender
    {
       NSArray        *paths;                // パス名が保存される
       NSOpenPanel    *panel;
    
       panel=[NSOpenPanel openPanel];        //  NSOPnePanleオブジェクトを得る
       [panel setCanChooseDirectories:YES];  //  フォルダを選択可能に
       [panel setCanChooseFiles:YES];        //  ファイルを選択可能に
       [panel setAllowsMultipleSelection:YES];  //  複数ファイルが選択可能に
       if( [panel runModalForTypes: [NSImage
               imageUnfilteredTypes]]==NSOKButton)  //  OKボタンをクリック
       {
           if( paths=[panel filenames] )     //  選択ファイルやフォルダのパスを得る
               [self addImagesPaths:paths];  //  実際の画像登録作業へ
       }
    }
    


    対象となるのは画像ファイルだけなので、それのみをダイアログに表示(選択可能に)するようにする必要があります。そのため、NSImageクラスのimageUnfilteredTypes:メソッドを使い、NSImageクラスで取り扱う事が可能な画像ファイルのUTI(Uniform Type Identifiers)情報の配列を得てNSOpenPanelに渡します。Carbonの場合には、スタンダードファイルダイアログを表示する時に、対象ファイルのファイルタイプの配列を渡していましたが、それとまったく同じ仕組みです。UTIについては、Apple社のデベロッパーサイトからダウンロードできる「Uniform Type Identifiers Overview」というドキュメントが参考になりますので、そちらを参照してみてください。

    実際の画像登録作業ですが、大量の画像ファイルを登録する場合には、処理がかなり長時間となることが予想されます。ImageKit用に提供されているサンプルソースコードを見てみると、画像登録中にユーザが何も操作できなくなるのを避けるために、そうした処理を別スレッドで実行していました。「しんぶんし3」もそれを見習って、addImagesPaths: メソッドで実行する画像登録処理を別スレッドとします。Cocoaでのマルチスレッド処理は、NSThreadクラスを使うことで簡単に実現できます。

    - (void)addImagesPaths:(NSArray*)paths
    {
       if( [paths count] )  // 配列個数を調べる
           [NSThread detachNewThreadSelector:@selector(addImagesThread:) 
                                               toTarget:self withObject:paths];
    }
    


    まず、得られたパス(NSString)の配列個数を調べ、それがゼロならば何も実行しません。もしパスが得られていたら、detachNewThreadSelector:toTarget:withObject:メソッドを使い、別スレッドとして起動するメソッドを指定します。この処理で作成されたスレッドは最初からデタッチされており、処理は終了してもメイン(親)スレッドとは合流しません。今回の場合、メソッドの実装先オブジェクトは自分自身(self)そしてメソッド名はaddImagesThread:とします。また、ユーザ情報オブジェクトとしてパス名の配列(paths)を対象スレッドへ渡しています。以下が、別スレッドとして起動するaddImagesThread:メソッドです。

    - (void)addImagesThread:(NSArray*)paths
    {
       NSAutoreleasePool  *pool;
       NSInteger            i,ct;
    
       pool=[[NSAutoreleasePool alloc] init];  //  NSAutoreleasePoolを用意
       ct=[paths count];                       //  パスの個数を得る
       for( i=0;i
    


    マルチスレッド処理で注意することは、スレッド内でスレッドセーフでないメソッドやルーチンを使用しない(もしくはNSLockクラスなどを使い制御して使用する)ことです。また、メインイベントから切り離されていますので、autorelease処理も単独で用意しなければいけません。ですから、入り口で NSAutoreleasePoolオブジェクトを作成し、スレッドを抜ける時にそれを
    releaseします。メインスレッドから渡されたユーザ情報オブジェクト(今回はNSArray)は、スレッドに入る時に自動時にretainされ、抜ける時にreleaseされますので、こちらも取り扱いに注意してください。

    ユーザインターフェース制御などには多数の「スレッドセーフでない」クラスが関わりますので、別スレッドからそうしたクラスを利用する時には注意が必要です。加えて、メインスレッドで使っているメソッドをそのまま呼びたい場合も多々あります。そんな時には、performSelectorOnMainThread:withObject:waitUntilDone:メソッドを利用すると便利です。このメソッドを使い、メインスレッドのメソッド(スレッドセーフでなくてもOK)を呼び出します。今回、この仕組みにより呼び出されているのは 後処理を担当するupdateDatasourceメソッドです。

    - (void)updateDatasource
    {
       if( [temp count] )  //  テンポラリ配列の要素があるか?
       {
           [list addObjectsFromArray:temp];  //  テンポラリ配列をlistに追加する
           [temp removeAllObjects];          //  テンポラリ配列の要素を削除する
           [imageBrowser reloadData];        //  ImageBrowserを再描画
           [self updateChangeCount:NSChangeDone];  //  ドキュメントを編集済みに
       }
    }
    


    次回は、 addImagesThread:のループ内から呼ばれている addImagesPathメソッドのソースコードを提示し解説することから画像登録処理の話を続けたいと思います。
    つづく                                

    ターミナルの向こうから      第31回  海上 忍

    〜 PDFを活用する(2)〜

    ・PDF、なぜYet Anotherな方法が必要か
     OSネイティブでPDF生成機能を備えているMac OS Xの場合、他のOSと比較してPDFの生成は容易です。描画命令はAppKitフレームワークを使えばPDFに変換できますし、表示目的にはPDF Kitが用意されています。Yet anotherな解法(そればかりと言われますが)を提示することが主旨の本連載では、敢えて取り上げる必要もないでしょう。
     そこで、スクリプト言語を利用したPDFの生成を検討してみたいと思います。確かにMac OS XにはPDF生成機能が標準装備されていますが、あらゆるニーズに応えられるわけではないからです。
     その1つが、「日本語フォントを埋め込まないPDF」の生成です。Leopardに搭載されたPDFエンジン(Quartz PDFContext)は、デフォルトでv1.3(Acrobat 4.x相当)のPDFを生成しますが、日本語の文字列はCIDフォントを埋め込むことでしか対応できず、環境の違いに関係なく同一のフォントで表示される環境非依存のPDFとなりますが、一方ではファイルサイズの肥大化というデメリットが生じます。
     ちなみに、PostScriptの時代から、和文フォントにはリュウミンL-KLと中ゴシックBBBがデフォルトで使用されます。フォントを埋め込まない形式の日本語PDFでは、この2つのフォントが利用され、Adobe Readerなどのビューアにより代替のフォントが割り当てられます。環境によってフォントデザインは変わってしまいますが、ファイルサイズは抑えられます。
     もう1つは、差し込み印刷的な処理が難しいことでしょうか。世の中には、電子文書として保存できるようPDFとしてオンデマンドで各種帳票を作成したい、というニーズがありますが、これをCocoaで実装しようとなると一苦労です。しかし、スクリプト言語からフリーなPDFライブラリの機能にアクセスするスタイルであれば、その手の機能を実現することは比較的容易です。

    ・PDFJを導入する
     上記の問題を解決する答えの1つが、中島靖氏が開発したPerlモジュール
    「PDFJ」です。横/縦書きはもちろんルビに添え字、下線・傍線、禁則処理や行の詰め伸ばしなど、JIS X 4051に既定された組版ルールに準拠しているため、凝ったレイアウトの日本語文書を作成できます。JPEG/PNG画像やベジェ曲線を含む線画にも対応、スクリプトベースながらワープロ文書並みの仕上がりを期待できることがポイントです。
     PDFJのダウンロードおよびインストールの手順は、以下に示すとおりです。各行をターミナルへコピー&ペーストのうえ、実行してください。

    - - - - -
    $ curl -O http://hp1.jonex.ne.jp/~nakajima.yasushi/archives/PDFJ-0.90.zip
    $ unzip PDFJ-0.90.zip
    $ perl Makefile.PL
    $ make
    $ sudo make install
    - - - - -
    


    ・PDFJを試す
     PDFJを利用する場合、Perlスクリプト冒頭に「use PDFJ」の記述を加えます。引数に「EUC」や「UTF8」などの文字コードを指定すると、日本語エンコーディング形式を変更できます(デフォルトは「SJIS」)。
     PDFの作成は、文書を構成する各種オブジェクトを並べることで進行します。表示可能なオブジェクトには、テキスト(PDFJ::Text)、段落(PDFJ::Paragraph)、画像(PDFJ::Image)などがあります。基本的な情報は、付属の文書(doc/PDFJ.jp.pdf)が参考になるはずです。
     以下に示すリストは、クリップボード(ペーストボード)の内容をPDFとして出力します。適当なファイル名で保存し、ターミナルから「perl XXXX.pl」として実行すると、「MOSAtest.pdf」というPDFが生成されるはずです。
     このスクリプトでは、クリップボードからテキストを取得し、和文フォントをリュウミンL-KL/フォントサイズを12ポイントとして、A4サイズの大きさにレイアウトしたうえでPDFに出力しています。クリップボードの内容の取得にpbpasteコマンドを使用したことを除けば、ごく単純なHelloWorldノリの内容となっているので、これをベースにレイアウトを工夫してみてもいいでしょう。

    - - - - -
    #!/usr/bin/perl
    
    use strict;
    use warnings;
    use PDFJ 'SJIS';
    
    my $pdfversion = 1.6;
    my $paperwidth = 595;
    my $paperheight = 842;
    
    my $doc = PDFJ::Doc->new($pdfversion, $paperwidth, $paperheight);
    my $font = $doc->new_font("Ryumin-Light", '90ms-RKSJ-H');
    my $fontSize = 12;
    my $textStyle = TStyle(font => $font, fontsize => $fontSize);
    
    my $page = $doc->new_page();
    my $text = `pbpaste`;
    $text =~ s/ x80/  /g;
    my $contents = Text($text, $textStyle);
    
    my $para = Paragraph($contents, PStyle(size => 500, align => 'b', linefeed => '120%'));
    $para->show($page, 50, $paperheight - 100);
    
    $doc->print("MOSAtest.pdf");
    - - - - -
    


     次回は、このPDFJを利用して、差し込み印刷ならぬ「差し込みPDF生成」に挑戦する予定です。

    ◇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)2007 MOSA. All rights reserved.

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

    2008-08-12

    目次

    • りんご味Ruby         第30回  藤本 尚邦
    • 藤本裕之のプログラミング夜話   #143
    • 高橋真人の「プログラミング指南」  第141回

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

    前回に引き続き、YahooHonyaku#post_textを実装します。post_textの実装は:

    ・HTTP POSTのパラメータを準備
    ・x-www-form-urlencoded形式に変換
    ・HTTPリクエストのヘッダーを作成
    ・HTTPリクエストを送信
    ・受信したHTTPレスポンスを返す

    という流れになります。

    ■ HTTP POSTのパラメータを準備

    HTTP POSTのパラメータはキーと値の組になっていますから、Ruby上ではそれをHashリテラルで表現することにします。

     params = {
       :eid  => _eid_(mode),  # 変換モード(前回作った_eid_で正規化)
       :text => text,         # 翻訳したいテキスト
       :key  => @key,         # HTTPレスポンスから取得した値
       :time => @time,        # HTTPレスポンスから取得した値
       :both => "TH"          # (謎のパラメータ、おまじない)
     }
    


    keyとtimeは、open_top_pageの中から呼ばれるparse_form!によって、HTTPレスポンスから抜き取った値をセットしています。

    (余談) たかが一時的なパラメータの準備のためにHashを作るのはコストが高いのではないかという考え方があるかもしれませんが、それを気にしていてはRuby(やPerl)を使うメリットが半減してしまうというものです…と言い切りたいところなのですが、実際にRuby on Railsなどを使って公開するWebアプリを作るときなどは、状況によってはやはり気にした方がよいかもしれません。

    ■ x-www-form-urlencoded形式に変換

    次に、準備したPOSTパラメータを、HTTP POSTリクエストのボディ部に書き出すためのx-www-form-urlencoded形式に変換します。x-www-form-urlencodedは、HTTP GETのURLでも使われている、パラメータを`&’で区切り、各パラメータのキーと値を`=’で区切る形式のことです。

     body = params.map{ |key, val| "#{key}=#{val}" }.join('&')

    mapメソッドは、paramsのキーと値の組み合わせのそれぞれについて、ブロックで与えられた手続きを実行(ここでは”キー=値”という文字列への変換)して、その結果の配列を返します。出来上がった配列の各要素は、joinメソッドにより`&’で接続された文字列に変換されます。例えば:

     { :eid=>'ej', :text=>'hello', :both=>'TH' }. # Hashの各要素を
       map { |key,val| "#{key}=#{val}" }.         # 「キー=値」に変換して
         join('&')                                # '&'で接続

    を評価すると “eid=ej&text=hello&both=TH” という文字列を返します。これで済めばよいのですが、「キー=値」の部分のkeyとvalはそれぞれURLエンコードする必要があります。ここではcgiライブラリを使ってURLエンコードします:

     

    require 'cgi'
       (中略)
     body = params.map{ |key, val|
       "#{CGI.escape(key.to_s)}=#{CGI.escape(val.to_s)}" }.join('&')
    

    ■ HTTPリクエストのヘッダーを作成

    第27,28回で、Yahoo!翻訳のトップページをHTTP GETしてパースするためのopen_top_pageを実装しました。post_textではHTTP POSTするわけですが、まずHTTPリクエストのヘッダーやURLなど、両者で共有できる部分を整理します。

    URLとHTTPリクエストヘッダーの共通部分を定数として定義します:

     class YahooHonyaku
         (中略)
       URL = "http://honyaku.yahoo.co.jp/"
       HTTP_REQUEST_HEADER = {
         "User-Agent"     => "Mozilla/5.0",
         "Accept-Charset" => "UTF-8"
       }
         (中略)
       def open_top_page
         html = open(URL, HTTP_REQUEST_HEADER) { |io| io.read }
         parse_form!(html)
         @top_page_opened = true
       end
         (中略)
     end
    


    これに併わせてopen_top_pageも修正しました。HTTP POSTでは、content-typeにx-www-form-urlencodedの指定を追加します。

     request = HTTP_REQUEST_HEADER.merge(
       "Content-Type" => "application/x-www-form-urlencoded")

    Hash#mergeメソッドは、レシーバのHashオブジェクトに引数で渡されたキーと値の組を追加した新しいHashオブジェクトを生成します。Hash#merge! というメソッドもあって、こちらはレシーバのHashオブジェクト自体に対して破壊的にキーと値の組を追加します。メソッド名に`!’を付けた場合は、レシーバオブジェクトへの破壊的操作を示すという慣習を思い出してください。

    ■ (補足) Mix-inモジュール、繰り返しなど

    paramsからbodyへの変換のところで使ったmapメソッドは、Hashクラスではなく、Enumerableモジュールに実装されています。Enumerableモジュールは、eachメソッド(レシーバオブジェクトの各要素について、任意の手続きを繰り返す)を実装しているオブジェクトに、繰り返しに関わる典型的なメソッド群を組み込むためのモジュールです。Rubyの組込みクラスの中では、Array、Hash、Rangeクラスなどに、Enumerableモジュールが組み込まれています。

    繰り返しを扱うようなクラスを書くのなら、eachメソッドを実装してEnumerableモジュールを組み込みましょう。

     class YourClass
       include Enumerable
       def each
         ...
       end
     end
    


    これで、YourClassクラスのインスタンス全てがEnumerableになります。これだけで、mapを始めとして、繰り返しに関するたくさんの手続きが使えるようになります。Enumerableのように、任意のオブジェクトに組み込んで使うためのモジュールをMix-inといいます。

    (おまけ) ある一つのオブジェクトをEnumerableにすることもできます:
    
     an_object = Object.new
     ...
     def an_object.each    # an_objectの特異メソッドとしてeachを定義
       ...
     end
     an_object.extend Enumerable
     an_object.is_a? Enumerable  # => true
    


    これで an_object をEnumerableなオブジェクトになります。Rubyの柔らかさが示されたコードなのではないでしょうか。このようなコードを本物のプログラム内で使うことはあまりないでしょうが、irbで試しながらプログラムを作るようなときには使うことがあるかもしれません。

    次回は、残りの部分、HTTPリクエストの送信を実装して post_text を完成させる予定です。

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

     テレビ番組の話が出たのを幸いに、ちと時事ネタ方面にシフトして行く。いや、これでもかろうじて全体の話の流れちうもんをなんとか保ってはいるんだけど、目の前にそのことを考えるのに絶好のネタであるオリンピックがころがってきたのでこれを見逃す手はないな、と。

     思い起こせば……ってもそんな昔の話ではなく、アレは今年の5,6月ごろですか。著作権団体と電子機器メーカーの間で長いことすったもんだが続いていたダビング10の導入が「ぼやぼやしてると北京オリンピックが始まっちまう」からってんで急転直下決まったというハナシがあったではないの。

     白状すればオレはもともとこのダビング10なんてどーでもいいと思っていて、上の決定の直前か直後くらいにこのモサの理事でもある元日経MACのハヤシさんとか、個人的に親交のあるMIAU(インターネット先進ユーザーの会)のコデラくんとかの話を聞いたり読んだりしてようやくなるほどそれはスジワルな仕組みですねと初めて気付かされたくらい。

     参考までに書いておくと、そのスジワルというのは以下のようなことである。

     まず、9回コピーと1回ムーブができてもその孫コピーが作れないのでは、この映像ソフトを永久保存したいと思っても、その「永久」がコピーしたメディアの寿命に依存してしまう。分かりやすく言えばHDレコーダの中に今年のNBAファイナルで我らがセルティックスが憎きレイカーを……あ、私情を入れるのはよくないわね。

     とにかくセルティックスが勝った試合の録画がある、とする。この試合に感動したアナタはこれを子々孫々まで伝えたい、と思う。しかしあなたにできるのは、同じ速度で劣化するであろうDVD10枚にそれをコピーすることだけなのだ。遠い(いや近い?)将来、かつてビデオテープがDVDに代わったようにDVDに取って代わる新しい媒体が出現したとき、秘蔵のDVDからそれらの媒体に中身を移動するスベはない。

     もうひとつ、こっちはもっとマクロな話。世界中でダビング10のようなセセコましい制限を可能にした機械が売れるのは日本市場だけだということだ。つまりですね、ダビング10という機構を組み込んだ機械はその分だけわずかながらコスト高なのであり、そんな機構を必要としない海外市場での競争力が落ちるのである。

     なに? 海外には海外仕様のモノを作るからいい? ちょっと待て。iPodそしてiPhoneと、世界中で同じハードを売れることのメリットを我々は嫌というほどアップルに見せつけられているんと違うんかい。ただでさえ日本製品は人件費その他でコスト高なんだぞ、と。

     でもここでオレが言いたいのはダビング10がいかにスジワルな機構かではなくて、それが「北京オリンピックに間に合うように導入されたと」というそっちの方なんである。なにが言いたいかわかりますか? わからない? 

     ではこちらからお聞きしよう。今オレがこの原稿を書いているのは8月9日の午後である。昨夜はその北京オリンピックの開会式でありました。今これをお読みのモサ伝読者のうちどのくらいのヒトが昨夜の開会式をデジタル録画し(アナログはもともとダビングで画質が落ちるしダビング10の対象ではない)、それをDVDなりに保存するおつもりであろうか。

     ……あのさ、かつて東京オリンピックのとき、「オリンピックをカラーで観よう」ってんでカラーテレビの売り上げが伸びたってのはわかるのだ。今回の北京だって「オリンピックをハイビジョンで観よう」というCMはオレ、わからないでもない(ノせられて買ったりしないけど)。

     でもさ、「オリンピックをダビング10で残そう」なんてヒトが、著作権団体と電子機器メーカーがその根深い対立を棚上げにしてまで発売を間に合わせたいと、商売的に美味しいと思うほどいるもんだろうか? あなたはどう思われます?
    (以下次回 2008_08_09)
                          

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

    プログラマのためのオブジェクト指向再入門(47)

    〜XcodeによるPowerPlant X入門(30)〜

     こんにちは、高橋真人です。
     さて、前回ご紹介したプログラムでは、Attachmentという仕組みを使ってViewの拡張を行いました。アタッチメントというのは言ってみれば、何らかの動作部分を独立したオブジェクトの形として作っておいて、動的に、つまりプログラムが走っている状態の時に、任意のオブジェクトに対してくっ付けたり外したりできるものです。
     オリジナルのPowerPlantにおいて、このアタッチメントという考え方がLAttachmentというクラスによって実現されていたのですが、それがPPxにも引き継がれたというわけです。ただ、オリジナルのPPが主に対象としていたMac OS 9以前システムに比べると、OS Xではシステム自体が動的に振る舞いの変更ができる仕組みを持っているため、PPxのAttachmentは、そのシステムの仕組みを手助けするような形で成り立っています。
     今までにも何度か触れていますが、Carbonイベントモデルにおいてはハンドラ(イベントを処理する関数)をイベントターゲット(ウインドウやビューなど、イベントを受け取る対象物)に対して複数インストールすることができるようになっています。そして、複数のハンドラのインストールされたターゲットにイベントが到達した場合、いちばん最後にインストールされたハンドラが起動されることになっています。
     以前もやりましたように、そのハンドラがnoErrを返せばそこでイベントの処理は終結しますし、eventNotHandledErrを返すと次のハンドラ、つまり最後から2番目にインストールされたハンドラに処理が引き渡されるという具合です。また、ハンドラの中で“次の”ハンドラを呼び出すことが可能なのも、以前に見た通りです。

     今回のプログラムで新たに作成したMyViewAttachmentクラスですが、クラス全体の構造こそ、今まで見てきたものとは少し異なりますが、内部で使用されている個々のAPIを見てみますと、クラス継承によってViewをカスタマイズするときとほとんど変わりません。特にアタッチメントのインスタンスが生成、初期化される部分(今回のプログラムでは、Application.cpの
    DoSpecificCommand()の中です)で行っているのは、PPx::ViewやPPx::BaseViewをサブクラス化して作ったクラスの初期化部分のコードで行っていることそのままと言ってよいくらいです。
     サブクラス化の時と唯一違うのが「対象にアタッチすること」です。まあ、アタッチメントなので当然ですが。注意していただきたいのは、AddAttach()関数を持っているのはアタッチメントの方ではなく、Attachable(アタッチメントを保持する側)の方だということです。このAttachableというクラスは、ViewやWindowはもとより、Applicationの継承元でもあるために、ほとんどのクラスにアタッチメントを付けることが可能になってるわけです。

     さて、アタッチメントをくっ付けたら、今度は外す方です。
     今回のプログラムでは、ウインドウがディアクティベートしたら(アクティブでなくなったらアタッチメントを外す仕掛けになっています。一回外れたアタッチメントはもう二度と戻ってこないので、かなりしょぼい仕様ですが(笑)。
     これを行っているのはMyWindowの、その名もDoWindowDeactivate()という関数です。アタッチメントを外す手順としては、

    ・アタッチされているViewを探す
    ・外す対象のアタッチメントを探す
    ・外す
    ・アタッチメントを始末する

    となります。
     ここには、今まで登場していないことがたくさんありますので、回を改めて説明をします。

    ◇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)2007 MOSA. All rights reserved.

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

    2008-08-05

    目次

    • WWDC初参加レポート
    • 「「Wonderful Server Life」    第75回   田畑 英和
    • 小池邦人のCarbon視点でCocoa探求
    • ターミナルの向こうから      第30回  海上 忍 

    「Wonderful Server Life」  第75回  田畑 英和

      〜「サーバ管理」編〜

     今回は、「サーバ管理」を使ったAFPサービスの設定について解説します。サービスの設定画面は「一般」、「アクセス」、「ログ」、「アイドル状態のユーザ」の4画面から構成されています。それではTiger Serverでの設定とも比較しながら設定項目を1つずつみていきましょう。

    ◇一般
     まずは「一般」設定画面ですが、ここではクライアントからのブラウズに関する設定を行います。Mac OS Xのクライアントのみをサポートする場合には、デフォルトの設定のままでも特に問題はないでしょう。Tiger Serverではブラウズの設定として次の2つの設定がありましたが、Leopard Serverでは「サーバ管理」からはBonjourに関する設定しかできなくなりました。レガシーな設定は徐々に切り離していく傾向にあるようです。

     ・Bonjour登録を使用する
     ・AppleTalkを使ったブラウズを有効にする

     次に「古いクライアント用にエンコード」するという設定がありますが、この設定はMac OS Xには関係なく、Mac OS 9以前のクライアントのための設定になります。Mac OS Xではユニコード(UTF-8)でファイル名を管理していますが、Mac OS 9以前のOSでは各言語ごとのエンコーディングを使用しているためエンコードの変換が必要になってきます。そこで、Mac OS 9以前のクライアントのためにファイル名をどのエンコードに変換するかを設定します。
     個人的にはMac OS 9以前のOSを使う機会はほぼなくなっていますが、まだ使用しなければいけない場合は事前にエンコードの変換が問題なく行えるかしっかりと検証するようにしましょう。
     あとは「ログインメッセージ」の設定があります。これはクライアントからの接続時にクライアント上にメッセージを表示するための機能です。管理者がユーザになにかお知らせをしたいような場合に使うことができます。1回しかメッセージを表示しないように設定することもできます。

    ・「一般」設定画面
    http://www.htabata.com/img/MXS105/afp/afp_admin_05.png

    ◇アクセス
     「アクセス」設定画面では認証や接続に関する設定を行います。まず認証の設定ですが、次の3つから選択することができLeopard Serverでは「すべてのメソッド」がデフォルトの設定になっています。

     ・標準
     ・Kerberos
     ・すべてのメソッド

     認証方式の設定はちょっと分かりにくいですが、「標準」というのはこれまで一般的に使われてきているサーバへの接続時に認証ダイアログが表示されてユーザ名とパスワードで認証する方式のことです。一方「Kerberos」は1度認証すればあとは一定期間内であれば様々なサービスに対して手動で認証することなくアクセスできる、いわゆるシングルサインオンのことです。Kerberosを
    利用するにはOpen Directoryの機能を利用する必要がありますので、AFPサービスの設定だけで実現できるものではありません。残るは「すべてのメソッド」ですが、これはようするに「標準」と「Kerberos」を両方とも使うという設定です。この場合クライアントから接続リクエストがあればまずはKerberosによる認証を試み、もし失敗した場合には「標準」方式での認証を行います。つまり、デフォルトで「すべてのメソッド」となっているということはKerberosでの認証を優先して行うということになります。
     LeopardになってからはクライアントのMac OS Xにも標準でKerberosが搭載されており、Kerberosによる認証を行う機会はどんどん増えてきています。

     ゲストアクセスを許可する場合には、デフォルトでは無効になっている「ゲストアクセスを有効にする」を設定します。ただし共有ポイントごとにもゲストアクセスを有効にする必要がありますので、ゲストアクセスはサービスと共有ポイントで2重の設定が必要になります。ゲストアクセスを有効にすると認証なしでのアクセスが可能になりますのでセキュリティには十分注意しましょう。
     次に「管理者が登録ユーザとして振る舞えるようにする」の設定ですが、これもちょっと分かりにくい設定項目かと思います。この設定が有効になっていた場合、管理者は他のユーザでの接続が可能になります。具体的には認証時に、接続に使用したいユーザのユーザ名と管理者のパスワードを入力します。そうすることで管理者であれば、パスワードが分からなくても特定のユーザでのAFP接続が可能になります。例えばユーザごとのアクセス権の挙動を実際に確認したいときなどにこの機能が利用できます。
     Tiger ServerではSSHトンネリングを使用する「安全な接続を有効にする」という設定がありましたが、Leopard Serverでは設定項目がなくなりました。ただし、デフォルトでSSHのトンネリングは有効になっています。

     後はクライアントの接続数の制限に関する設定があります。デフォルトでは無制限に設定されていますが、サーバの負荷を抑えたい場合などは接続数を設定して同時に利用可能なユーザを制限することができます。AFPサービスは、NetBootサービスでも使用される場合がありますので、実に接続数を制限する場合には他のサービスに影響がないか注意が必要になります。ちなみに10クライアント版のMac OS X Serverを利用している場合でも、接続数の設定はデフォルトで無制限に設定されています。

    ・「アクセス」設定画面
    http://www.htabata.com/img/MXS105/afp/afp_admin_06.png

    ◇ログ
     ログはアクセスログとエラーログの2種類があり、個別にログの出力を設定できます。またアクセスログはさらに細かく分かれており次のイベントごとにログの出力を設定できます。

     ログイン、ログアウト、ファイルを開く
     ファイルを作成、フォルダを作成、ファイル/フォルダを削除

     当然出力するログの種類を増やせばログファイルのサイズも増えることになります。また、ログを定期的にアーカイブすることもできます。

    ・「ログ」設定画面
    http://www.htabata.com/img/MXS105/afp/afp_admin_07.png

    ◇アイドル状態のユーザ
     ファイルサーバを運用していると、実際には使用していないユーザがクライアントから接続しっぱなしになるということもありますが、ここではそういったアイドル状態のユーザに関する設定ができます。
     具体的にはスリープを許可する時間(デフォルトは24時間)を設定したり、一定時間(デフォルトでは10分)アイドルタイムが続いた場合に接続を解除する設定ができます。デフォルトの設定ではアイドルタイムが続いても接続は解除されません。また、接続を解除するときに表示するメッセージも設定できます。

    ・「アイドル状態のユーザ」設定画面
    http://www.htabata.com/img/MXS105/afp/afp_admin_08.png

     というわけで今回は「サーバ管理」でのAFPサービスの設定について解説しました。サービスの設定はコマンドラインからもできます。詳細についてはコマンドラインのマニュアルを参照してください。

    ・「Command-Line Administration」(英文)
    http://images.apple.com/server/macosx/docs/Command_Line_Admin_v10.5.pdf

    実際にファイルサーバを運用するには共有ポイントの設定も必要になりますので、次回は共有ポイントの設定について解説する予定です。
    次回へつづく                             

    小池邦人のCarbon視点でCocoa探求(2008/08/01)

    〜 ImageBrowser Viewを使う準備が大変 〜

    Cocoaの場合、Interface Builderでの設定がソースコードと密接に関連しているため作業をより複雑にしています。このために、実際のプログラミング作業に入る前にめげてしまう人もいるかもしれませんが、今回は、ちゃんとしたソースコードの話です(笑)。

    NSTableViewの場合と同様、ImageKitのIKImageBrowserViewでは、MyDocumentクラスに実装した「datasource」と「delegate」メソッドが、画像表示のメンテナンスやユーザからの操作(画像クリックなど)に対応します。このうち、datasourceでは画像情報が保存されたモデルオブジェクトやその個数を返す事になります。今回のモデルオブジェクトは、以前に作成したImageFileクラスのオブジェクト(ファイルパス名などを含む)です。まず最初に、これらを保
    存する配列(NSMutableArray)と、画像を読み込む時に一時的に用いる配列を、MyDocumentクラスのインスタンス変数として用意しておきます。MyDocumentクラスのクラス定義は以下のようになります。

    @interface MyDocument : NSDocument
    {
     IBOutlet id      imageBrowser;   //  IKImageBrowserViewのOutlet
     IBOutlet id      imageView;      //  NSImageViewのOutlet
     NSMutableArray  *list;           //  Idatasourceで利用
     NSMutableArray  *temp;           //  ファイル作業用テンポラリー
    }
    


    まず最初は、MyDocumentクラスに実装するdatasourceです。これについては「登録数を返す」「指定番号の画像情報を含んだImageFileオブジェクトを返す」「指定番号のImageFileオブジェクトを削除する」「画像の順序を入れ換えた時の後処理を行う」の5つのメソッドを用意します。この中で少し複雑なのは、最後の「画像の順序を入れ換えた時の後処理を行う」ぐらいで、残りは
    大変簡単な処理で済むことが分かります。

    - (int)numberOfItemsInImageBrowser:(IKImageBrowserView*)view
    {
     return [list count];  //  画像の登録数を返す
    }
    
    -(id)imageBrowser:(IKImageBrowserView *) view itemAtIndex:(int) index
    {
     return [list objectAtIndex:index];  //  ImageFileオブジェクトを返す
    }
    
    - (void)imageBrowser:(IKImageBrowserView*)view
                             removeItemsAtIndexes: (NSIndexSet*)indexes
    {
     [list removeObjectsAtIndexes:indexes];  //  ImageFileオブジェクトを削除
    }
    
    -(BOOL)imageBrowser:(IKImageBrowserView*)view
       moveItemsAtIndexes: (NSIndexSet*)indexes toIndex:(unsigned int)dindex
    {
     BOOL            ret=NO;   //  画像の順序を入れ換えた時の後処理を行う
     NSMutableArray  *temp;
     NSInteger       ct,i;
     id              obj;
    
     if( temp=[[NSMutableArray alloc] init] )
     {
         for(i=[indexes lastIndex];i!= NSNotFound;i=[indexes indexLessThanIndex:i])
         {
             if( i < dindex )
                 dindex--;
             obj=[list objectAtIndex:i];
             [temp addObject:obj];         // 一時的に保存
             [list removeObjectAtIndex:i]; // オブジェクトを削除
         }
         ct=[temp count];
         for( i=0;i
    


    NSTableViewならこれだけですが、IKImageBrowserViewの場合には、もう少し追加作業が必要となります。ImageFileオブジェクトを渡した時に、その中のどの種類の情報(インスタンス変数)を画像表示用に使うのかという指示が必要なのです。その処理に準拠したdatasourceを、ImageFile(モデル)クラス側に実装します。具体的には「情報の種類」「情報の内容」「識別子(ID)」「画像タイトル」「画像サブタイトル」を返す5つのメソッドを用意することになります。以下がそうしたdatasourceの実例です。

    - (NSString*)imageRepresentationType  //  画像表示にどんな種類の情報を使うか
    {
     if( [type isEqualToString: @"public.movie"] ) // Movieファイル
         return IKImageBrowserQTMoviePathRepresentationType;
     else if( [type isEqualToString: @"public.executable"] ) // CCompositionファイル
         return IKImageBrowserQCCompositionPathRepresentationType;
     else                                                       // 一般画像ファイル
         return IKImageBrowserPathRepresentationType; // 画像ファイルパスを使う
    }
    
    - (id)imageRepresentation  //  画像表示用の情報を返す(画像ファイルパス名)
    {
     return path;
    }
    
    - (NSString*)imageUID  //  画像の固有識別子を返す(画像ファイルパス名と一致)
    {
     return path;
    }
    
    - (NSString *) imageTitle;  //  画像タイトルを返す(今回はファイル名)
    {
     return[ path lastPathComponent];  //  パス名の一番最後を抽出
    }
    
    - (NSString *) imageSubtitle;  //  画像サブタイトルを返す(今回はファイルタイプ)
    {
     return type;  // タイプにはファイル種類識別用のメタデータが入っている
    }
    
    次はdelegateメソッドですが、こちらはMyDocumentクラスに実装します。以下
    は、ユーザがブラウザ上の任意の画像をマウスクリックした時に実行される
    delegateです。マウスクリックにより、その画像をお隣のNSImageViewいっぱ
    いに表示します。
    
    - (void) imageBrowserSelectionDidChange:(IKImageBrowserView *) aBrowser
    {
     NSImage      *image;
     NSIndexSet   *set;
     ImageFile    *obj;
    
     if( set=[imageBrowser selectionIndexes] ) // 選択画像のインデックスを得る
     {
         if( obj=[list objectAtIndex:[set firstIndex]] )  // ImageFileオブジェクトを得る
         {
             if( image=[[NSImage alloc] initByReferencingFile:obj.path ] )
             {                              // パス名を使い画像(NSImage)を得る
                 [imageView setImage:nil];
                 [imageView setImage:image]; // 得られた画像をNSImageViewに設定
                 [image release];
             }
         }
     }
    }
    
    その他に「画像をダブルクリックした時の処理」「画像を右ボタンでクリック
    した時の処理」「背景を右ボタンクリックした時の処理」なども、delegateと
    して実装することが可能です(以下参照)。ちなみに、画像のダブルクリック
    に対する処理を差し替えなければ(delegateを実装しなければ)デフォルトと
    して、アプリケーション(オーナ)による画像のオープンが実行されます。
    
    - (void) imageBrowser:(IKImageBrowserView *) aBrowser
                   cellWasDoubleClickedAtIndex:(NSUInteger) index
    
    - (void) imageBrowser:(IKImageBrowserView *) aBrowser
       cellWasRightClickedAtIndex:(NSUInteger) index withEvent:(NSEvent *) event
    
    - (void) imageBrowser:(IKImageBrowserView *) aBrowser
          backgroundWasRightClickedWithEvent:(NSEvent *) event;
    


    画像さえ登録してしまえば、ImageBrowserの扱いは簡単そうに見えます。ところが、その画像登録に色々なパタンが存在するので注意が必要です。次回は「しんぶんし3」でのドキュメントファイルや画像ファイルの取り扱いを復習しながら、登録ボタンで画像を追加していく処理を解説したいと思います。
    つづく
                                    

    ターミナルの向こうから      第30回  海上 忍

    〜 PDFを活用する(1)〜

    ・PDFをもっと活用しよう
     ご存じのとおり、Mac OS Xの描画・印刷システムはPDFベースです。紙へ印刷する代わりにPDFとして出力したり、画像をPDFに変換したりといった処理はお手のもので、かつてAdobe Acrobatに付属していた「Acrobat PDF Writer」相当の機能が組み込まれていると言っていいでしょう。Leopardへバージョンアップする過程では、付箋を加えるなどAdobe Acrobat本体に相当する編集機能や、PostScript / EPSをPDFに変換するAcrobat Distillerに相当する機能(ただし日本語は非対応)も追加されています。
     その意味ではAcrobatに近づきつつあるMac OS XのPDFサポートですが、「PDFの再利用」という点ではまだ不十分です。システム標準のPDF閲覧・編集ツール「プレビュー」は、書き加えたメモ(付箋)を変更/削除できず、複数人でのコラボレーション作業には不向きです。テキストを抽出するときも、手作業で範囲指定してコピー&ペーストするしかありません。
     この問題を解決する近道は、ズバリ「Adobe Acrobatを購入すること」ですが、それでは単なるアプリケーションの機能紹介になってしまいますので、各種オープンソースソフトウェアを使い代替案を探りたいと思います。つい閲覧するだけになりがちなPDFを、情報を抽出したり書き加えたりして活用することが目的です。

    ・PDFをHTMLに変換する
     PDF編の第1回は、「PDFをHTMLに変換する」方法を紹介します。MOSA伝の趣旨からは若干外れますが、各種ドキュメントもPDFで配布されることが当たり前の現在、開発者にも役立つのではないかと思います。HTMLに変換しておけば、本文をプレインテキストとして抽出するなど加工も容易です。
     利用するアプリケーションは「xpdf」(X Window Systemを利用したフリーなPDFビューア)と、xpdfをベースに開発されたPDF/HTMLコンバータ「pdftohtml」です。なお、xpdfの機能はエンコードセットの解釈で利用される程度のため、X Window System(X11.app)のGUIは使用しません。
     インストールの手順は、以下に示すとおりです。最初にxpdf、次にpdftohtml、最後にxpdfの設定ファイルをpdftohtml用に修正する、という順序になります。作業はターミナルで行いますが、pdftohtmlのダウンロードと、設定ファイルに追加する内容(リスト1:add.rc)をデスクトップに作成する作業は、他の適当なアプリケーションを利用してください。

    - - - - -
    ・xpdfのインストール
    
    $ curl -O http://www.ctan.org/get/support/xpdf/xpdf-3.02.tar.gz
    $ tar xzf xpdf-3.02.tar.gz
    $ cd xpdf-3.02
    $ configure ; make
    $ sudo make install
    - - - - -
    


    - - - - -
    ・pdftohtmlのインストール
    
    (ソースコードはhttp://pdftohtml.sourceforge.net/からダウンロード)
    $ tar zxf pdftohtml-0.40a.tar.gz
    $ cd pdftohtml-0.40a
    $ make
    $ sudo cp src/pdftohtml /usr/local/bin/
    - - - - -
    


    - - - - -
    $ curl -O http://www.db.is.kyushu-u.ac.jp/computer/src/toollib/xpdf-japanese.tar.gz
    $ tar xzf xpdf-japanese.tar.gz
    $ cd xpdf-japanese
    $ sudo mkdir -p /usr/local/share/xpdf/japanese
    $ sudo cp -r ./* /usr/local/share/xpdf/japanese/
    $ cp ~/Desktop/add.rc .
    $ sudo sh -c "cat add.rc >> /usr/local/etc/xpdfrc"
    - - - - -
    


    - - - - -
    リスト1 : add.rc
    
    cidToUnicode    Adobe-Japan1    /usr/local/share/xpdf/japanese/Adobe-Japan1.cidToUnicode
    unicodeMap      ISO-2022-JP     /usr/local/share/xpdf/japanese/ISO-2022-JP.unicodeMap
    unicodeMap      EUC-JP          /usr/local/share/xpdf/japanese/EUC-JP.unicodeMap
    unicodeMap      Shift-JIS       /usr/local/share/xpdf/japanese/Shift-JIS.unicodeMap
    cMapDir         Adobe-Japan1    /usr/local/share/xpdf/japanese/CMap
    toUnicodeDir                    /usr/local/share/xpdf/japanese/CMap
    - - - - -
    


     pdftohtmlの使い方ですが、最初の引数にPDF、2番目の引数に書き出すファイル(HTML)を指定すればOKです。処理が完了すると、カレントディレクトリにトップページ(コマンド実行時に指定したもの、XXX.html)と、しおり部分のページ(XXX_ind.html)、本文のページ(XXXs.html)としてPDFの内容が書き出されます。
     日本語を含む文章の場合、「-enc」オプションでエンコーディング形式を指定する必要があります。UTF-8で書き出す場合は「-enc UTF-8」、日本語EUCで書き出す場合は「-enc EUC-JP」という要領です。なお、ブラウザにSafariを利用する場合、EUC-JPを選択したほうがエンコーディング形式の自動判別に成功しやすくなります(テキストエンコーディングに「デフォルト」を選択している場合)。

    - - - - -
    $ pdftohtml -enc EUC-JP develop.pdf index.html
    - - - - -
    

    ◇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)2007 MOSA. All rights reserved.