MOSA Multi-OS Software Artists

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

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

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

MOSADenバックナンバー 2018年6月発行分

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

    2009-07-14

    目次

    • 「Wonderful Server Life」    第96回   田畑 英和
    • 小池邦人のCarbon視点でiPhone探求
    • ターミナルの向こうから      第51回  海上 忍 

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

      

    〜「Deployment」編〜

     今回からDeploymentの応用編について解説します。あらためてDeploymentの課題について振り返ってみますが、コンピュータをセットアップするときまずはシステムのインストールをどうするかという問題があります。
     NetBootでクライアントコンピュータを起動して運用する場合には、これまで解説してきましたようにサーバ上にのみシステムのイメージを設置しておけばよいということになります。

     内蔵ハードティスクにシステムをインストールする場合、インストール方法は色々と考えられますが、どのような方法にしてもポイントはシステムを起動中のディスクにはシステムをインストールすることはできないということです。あたりまえのことではありますが、例えばインストールディスクからシステムをインストールする場合、いったんインストールディスクからコンピュータを起動して内蔵ディスクを未使用の状態にしてからインストールを実行します。

     NetInstallではこの作業をネットワーク経由でおこないます。つまりまずはクライアントをネットワーク経由で起動し、内蔵のハードティスクにシステムをインストールするわけです。

    ◇他のソリューション
     システム標準の機能だけでもある程度のことはできますが、他のツールを組み合わせることにより、より高度な使い方ができます。以前はこのようはツールとして「NetRestore」が有名でしたが、2008年に開発が打ち切られています。じつは次期バージョンのSnow Leopard ServerにはNetRestoreという同じ名称の機能が搭載されることがすでに公表されていますが、その詳細はまだ明らかになっていません。

    ・NetRestore開発終了のお知らせ
    http://www.bombich.com/software/netrestore.html
    ・Snow Leopard Server
    http://www.apple.com/server/macosx/features/client-management.html

     NetRestoreのWebサイトでも紹介されているのですが、「DeployStudio」というDeploymentをサポートするソフトがありますので、こちらを取り上げてみたいと思います。DeployStudioは柔軟に設計されていますので、色々な使い方ができるのですが、例えばNetBootと組み合わせて使用することができます。
     DeployStudioでは専用のNetBootイメージを作成することができ、クライアントをDeployStudio用のNetBootイメージから起動するとDeployStuioのランタイムが起動して、システムのリストアを実行することができます。ランタイムではカスタマイズ可能なワークフローを利用することができ、システムのリストア以外にもパッケージのインストールや、NetBoot起動したクライアントのシステムからイメージを作成してサーバにアップすることもできます。
     また標準でサポートされているものの、GUIからは利用することのできないマルチキャストによるリストアにも対応していたり、NetBoot起動したクライアントでVNCを起動してリモートで画面共有ができたりします。

    ◇DeployStudioのインストール
     ではまずインストール方法ですがDeployStudioのWebサイトからインストーラをダウンロードします。トップページの左下にダウンロードリンクがありますので、ここから「DeployStudio Server」をダウンロードします。原稿執筆時点での最新版はv1.0rc12(stable)となっています。対応するOSのバージョンは10.4.11および10.5.0以降となっています。

    ・DeployStudioのWebサイト
    http://www.deploystudio.com/Home.html

     ではこのインストーラをどこにインストールするかですが、NetBootと組み合わせて利用するにはまずNetBootサーバ上でインストールします。さらにリモートでDeployStudioを管理したい場合には、管理用のMacにもインストールします。
     DeployStudioをインストールすると「/アプリケーション/ユーティリティ」に以下の3つのツールがインストールされます。

    ・DeployStudio Admin:管理ツール
    ・DeployStudio Assistant:セットアップツール
    ・DeployStudio Runtime:ターゲットコンピュータ上で実行されるツール

     さらに「システム環境設定」にも「DeployStudio Server」という項目が追加されます。ここでは、次のようなシステム構成を例に解説をしていきたいと思います。

    ・NetBootサーバ(Mac OS X Server)
    ・管理用Mac(Mac OS X)
    ・ターゲットコンピュータ

     NetBootサーバと管理用MacにはそれぞれDeployStudioをインストールしておきます。またNetBootサーバにはあらかじめリストア用のシステムイメージが用意されているものとします。ターゲットコンピュータとはDeployStudioでシステムをリストアするためのコンピュータです。
     まず最初の設定ですが、NetBootサーバで「システム環境設定」>「DeployStudio Server」を表示し、スイッチをOnにします。これでNetBootサーバ上でDeployStudioServer daemonが起動します。この手順はNetBootサーバ上のみでよく、管理用Macでは行う必要はないです。またこの時点ではレポジトリへのアクセスに失敗したとのメッセージが表示されますが、これはこの後の設定で解消されます。レポジトリとはリストア用のイメージなどを格納しておくフォルダのことです。レポジトリをNetBoot以外のサーバで運用することも可能です。

    ・Daemonの起動
    http://www.htabata.com/img/MXS105/ds/Pref_01.png

     さて、それでは次回は設定方法の続きを解説いたします。
                                 次回へつづく

    小池邦人のCarbon視点でiPhone探求(2009/07/10)

    〜 UITableViewのデータソースとデリゲート 〜

    今回は、テーブルビュー(UITableView)に必要とされるデータソース(dataSource)とデリゲート(delegate)のメソッドについて解説します。これらの仕組みは、Mac OS XのNSTableViewを使う時と似ていますが、iPhone OS独自の仕組みも沢山見受けられますので、そちらも含めて話を進めたいと思います。

    データソースには、UITableViewDataSourceプロトコルに準拠したメソッドを実装します。またデリゲートには、UITableViewDelegateプロトコルに準拠したメソッドを実装します。Interface Builderでテーブルビュー(UITableView)のdataSourceとdelegateアウトレットを「File’s Owner」(UITableViewControllerのサブクラスであるRootViewController)に接続したことを思い出してください。よって、両プロトコルに準拠したメソッドはRootViewControllerクラスに実装することになります。

    まずはデータソースからです。UITableViewDataSourceプロトコルには、全部で11のメソッドが用意されています。これらのメソッドは、UITableViewに内容を表示するために必要となるデータを提供します。このうち、絶対に実装しなければいけないメソッド(必須)が2つ、実装しなければデフォルト値が使われるメソッド( オプション)が9つ定義されています。

    ・データソースの必須メソッド(2)

    - (NSInteger)tableView:(UITableView *)table numberOfRowsInSection:
                                                              (NSInteger)section;
    


    指定セクション(テーブルの表示グループ)内のデータ配列数を返す。つまりテーブル表示が何行あるのかを返します。何も表示されていなければゼロを返します。

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:
                                                        (NSIndexPath *)indexPath;
    


    テーブルビューは、表示内容(文字列や画像)を配置したUITableViewCell(UIViewのサブクラス)が順番に並びます。指示された行番号(indexPath.rowで参照)に対して、そこに表示すべきUITableViewCellオブジェクトを返してやります。

    ・データソースのオプションメソッド(9つ)

    - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView;  

    セクション数(テーブル表示のグループ分け数)を返します(デフォルトは1)。

    - (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:
                                                              (NSInteger)section;

    指定セクションに表示したいヘッダータイトル(文字列)を返します。

    - (NSString *)tableView:(UITableView *)tableView titleForFooterInSection:
                                                              (NSInteger)section;

    指定セクションに表示したいフッタータイトル( 文字列) を返します。

    - (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView;

    テーブルビューの右側に表示されるインデックス(A,B,Cなどの索引)の文字列を含んだ配列を返します。インデックスを使わない場合には実装しません。

    - (NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:
                                        (NSString *)title atIndex:(NSInteger)index;

    インデックス(索引)に対応するテーブルのセクション番号を返します(Bは1とか)。

    - (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:
                                                        (NSIndexPath *)indexPath;

    行の挿入や削除に用います。行が編集可能かどうかの判断(YESかNO)を返します。NOだと(+)や(ー)マークは表示されません。

    - (void)tableView:(UITableView *)tableView commitEditingStyle:
                                    (UITableViewCellEditingStyle)editingStyle
                                   forRowAtIndexPath:(NSIndexPath *)indexPath;

    挿入や削除などの行の編集が行われた場合に呼ばれます。実際の編集処理を、このメソッド内に記述します。どのような種類の編集かはeditingStyleで判断します。

    - (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:
                                                        (NSIndexPath *)indexPath;

    行の順番の入れ換えに用います。行が移動できるかどうの判断(YESかNO)を返します。YESを返すとテーブル編集時に行の右側に移動用タップエリアが表示されます。

    - (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)
                sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath;

    行の順番の入れ換えに用います。行が移動させられた時の実際の処理を、このメソッド内に記述します。

    続いてデリゲートです。UITableViewDelegateプロトコルには全部で19のメソッドが用意されています。デリゲートの方には必須は無くすべてがオプションですが、iPhone OS 3.0で新規に追加されたメソッドが3つ、廃止(Deprecated)されたメソッドが1つ含まれています。

    ・デリゲートのオプションメソッド(19)

    - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:
                                                      (NSIndexPath *)indexPath;

    その行番号(indexPath.row)の行の高さを指示する(デフォルトは44ピクセル)。

    - (NSInteger)tableView:(UITableView *)tableView
                  indentationLevelForRowAtIndexPath:(NSIndexPath *)indexPath;

    行のインデンテーションレベルを返す(グループタイプのテーブルビューのみに有効)。

    - (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell
                                   forRowAtIndexPath:(NSIndexPath *)indexPath;

    行に表示するセル( UITableViewCell )内容をカスタマイズすることが可能。このメソッドはセル描画時に呼ばれる。

    - (void)tableView:(UITableView *)tableView
          accessoryButtonTappedForRowWithIndexPath:(NSIndexPath*)indexPath;

    アクセサリー(行右側の小さなボタン)がタップされた時の処理を実装する。

    - (UITableViewCellAccessoryType)tableView:(UITableView *)tableView
                  accessoryTypeForRowWithIndexPath:(NSIndexPath *)indexPath;

    行の右側に表示されるアクセサリーのタイプ(>など)を指示する。iPhone OS 3.0で廃止(Deprecated)された。

    - (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:
                                                      (NSIndexPath *)indexPath;

    行の選択(行をタップ)開始時に実行する処理を実装する。nilを返すと選択拒否となる。

    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:
                                                      (NSIndexPath *)indexPath;

    行の選択(行をタップ)終了時に実行する処理を実装する。

    - (NSIndexPath *)tableView:(UITableView *)tableView 
                          willDeselectRowAtIndexPath:(NSIndexPath *)indexPath;

    行の選択解除(別の行をタップ)開始時に実行する処理を実装する(セレクション開始)。nilを返すと選択解除拒否となる。iPhoen OS 3.0から利用可能。

    - (void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:
                                                      (NSIndexPath *)indexPath;

    行の選択解除(別の行をタップ)終了時に実行する処理を実装する(セレクション開始)。iPhoen OS 3.0から利用可能。

    - (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:
                                                              (NSInteger)section;

    セクションヘッダーに配置するカスタムビュー(UIView)を指示する。

    - (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:
                                                              (NSInteger)section;

    セクションフッターに配置するカスタムビュー(UIView)を指示する。

    - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:
                                                              (NSInteger)section;

    セクションへッダーの高さを指示する(デフォルトは24ピクセル)

    - (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:
                                                              (NSInteger)section;

    セクションフッターの高さを指示する(デフォルトは24ピクセル)

    - (void)tableView:(UITableView*)tableView willBeginEditingRowAtIndexPath:
                                                      (NSIndexPath *)indexPath;

    編集開始時に呼ばれる(例えばナビゲーションバーの編集ボタンをタップした
    時)。

    - (void)tableView:(UITableView*)tableView didEndEditingRowAtIndexPath:
                                                (NSIndexPath *)indexPath; 

    編集終了時に呼ばれる。

    - (UITableViewCellEditingStyle)tableView:(UITableView *)tableView
                      editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath;

    追加や削除などの編集スタイルを返す。これにより編集時に行の左側に(+)や(ー)などのマークが表示される。

    - (NSString *)tableView:(UITableView *)tableView
    titleForDeleteConfirmationButtonForRowAtIndexPath:(NSIndexPath *)indexPath;

    編集時に行の右側に表示される赤い「削除」ボタンの文字列内容を変更する。iPhoen OS 3.0から利用可能。

    - (BOOL)tableView:(UITableView *)tableView
            shouldIndentWhileEditingRowAtIndexPath:(NSIndexPath *)indexPath;

    編集時に行をインデントさせ(+)や(ー)マークを外に表示させるかどうか判断する。グループタイプのテーブルビューのみに有効(デフォルトはYES)。

    - (NSIndexPath *)tableView:(UITableView *)tableView
    targetIndexPathForMoveFromRowAtIndexPath:(NSIndexPath *)sourceIndexPath
            toProposedIndexPath:(NSIndexPath *)proposedDestinationIndexPath;

    編集モードで行の移動や並び替えを実行した場合に呼ばれる。必要ならば、実際のモデルオブジェクトの順序入れ換えをここで実行する。

    iPhone OS 3.0で廃止されたtableView:accessoryTypeForRowWithIndexPath:メソッドを使っていたアクセサリータイプの変更は、UITableViewCellのaccessoryTypeプロパティで指示するよう推奨されています。また、iPhone OS 3.0になり、行の選択解除時に呼び出されるデリゲートメソッドが追加されているのですが、UITavleViewのヒューマンインターフェースガイドラインによると、テーブル行の選択状態はそのまま残しておいてはいけないはずでした。
    なぜ追加されたのでしょうか? サブクラス対策でしょうか?

    次回は、本アプリのビューコントローラー(RootViewController)に、必要とされるデータソースとデリゲートメソッドの実装を行います。テーブルビューに表示する内容は、モデル(Model)オブジェクトに登録されていいる画像ファイルの名称やサムネイルとなる予定です。

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

    〜 ローカルでPHPを使う(2) 〜

    ・コマンドラインからPHPを使う
     前回紹介した方法は、WebブラウザなどのクライアントサイドからPHPを実行できるよう、ApacheモジュールのPHPをセットアップするものです。Leopardには、コマンドライン版のPHP(/usr/bin/php)も収録されているため、
    /etc/apache2/httpd.confを編集してApacheの設定を変えることなく、つまりはWebサーバ(システム環境設定でいえば「Web共有」サービス)を動作させることなく、PHPスクリプトを実行することが可能です。
     たとえば、お約束の「Hello World」は、以下に示すとおりphpコマンドを実行すれば表示できます。ここで使用するオプション「-r」は、続く引数をPHPコードとして評価 / 処理する役割を果たします。なお、PHPのタグ()を入力する必要はありません。
    【編集部注:以下円記号はバックスラッシュに置き換えてください】

    - - - - -
    $ php -r 'print "Hello World¥n";'
    - - - - -
    


     LeopardにはPHP 5が収録されていますから、PHP 5の豊富な関数も利用できます。たとえば、以下のコマンドではPHP 4.3からサポートされたstr_shuffle関数を利用し、与えられた文字列(ここでは「mosa」)をランダムに入れ替えて返しています。

    - - - - -
    $ php -r 'echo str_shuffle("mosa"),"¥n";'
    - - - - -
    


     ファイルとして存在するPHPスクリプトを処理することもできます。オプション「-f」(省略可)に続けてファイル名を指定すれば、結果が標準出力(ターミナルの初期値ではターミナルの画面)へアウトプットされるので、次に示すように結果をファイルへリダイレクトして保存することもできます。なお、PHPスクリプトの拡張子が「.php」である必要はなく、適当なものでも正しく処理されます。

    - - - - -
    $ php -f ~/Sites/info.php > phpinfo.txt
    - - - - -
    


    ・PHPスクリプトをチェックする
     phpコマンドは、スクリプトの構文チェックにも利用できます。使用するオプションは「-l」、スクリプトを引数に指定して実行すれば、結果が表示されます。「)」の記述漏れなど単純なミスの発見に役立ちますが、未定義関数の使用などといった構文以外に起因するエラーは検出できません。

    - - - - -
    $ php -l wp-comments-post.php 
    No syntax errors detected in wp-comments-post.php
    - - - - -
    


     複数のスクリプトをまとめてチェックするときには、findコマンドと組み合わせて実行すると効率的です。以下のコマンド実行例では、カレントディレクトリ以下にある拡張子「.php」のファイルすべてを対象に、構文チェックを行っています。

    - - - - -
    $ find . -name '*.php' -exec php -l {} ¥;
    - - - - -
    


    ・処理内容を1行ごとに入力する
     Leopardに収録されているPHP 5は、phpコマンドに「-R」オプションを追加しています。このオプションを使用すると、標準入力から1行ごとにデータを取り込み、それを順に処理することが可能になります。
     以下に示すコマンド実行例は、lsコマンド(ファイルリストを表示するコマンド)とphpコマンドをパイプし、lsコマンドの結果をPHPのstrtoupper関数(引数の文字列に含まれる英字すべてを大文字に置換する)で変換し、ターミナルの画面に出力するものです。このように「-R」オプションを使用すれば、mb_convert_variables関数でテキストファイルのエンコーディング形式を一括変換する、といったPHPの処理がターミナル上で実行できます。

    - - - - -
    $ ls | php -R 'echo strtoupper($argn),"¥n";'
    - - - - -
    
    


    ・シェルスクリプト風に使う
     phpコマンドは、bashなどのシェルと同様、テキストファイルの先頭にパスを記述(#!/usr/bin/php)したうえで実行権限を与えておけば(chmod + x 〜)、シェルスクリプトとして活用できます。
     反対に、PHPスクリプトからUNIXコマンド/シェルスクリプトを呼び出し、クライアントであるWebブラウザに結果を返すこともできます。次回は、そのときに使用されるPHPの関数「shell_exec」の使用例を紹介する予定です。

    ◇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.

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

    2009-07-07

    目次

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

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

    今回は、既存のiPhoneアプリケーションのプロジェクトに、iPhone RubyCocoaを組み込んでみることにします。例として、iPhoneのサンプルコードの1つViewTransitions をリモートアクセスできるようにしてみましょう。

    その前に、前回作った iPhone RubyCocoa のプロジェクトフォルダは使い回すことができるので、再利用しやすいように適当な名前(ここではiphone-rubycocoa-sim とします)をつけてどこかに保存しておいてください。

    ■ iphone-rubycocoaフォルダのコピー

    まず、iPhoneのサンプルプロジェクトViewTransitionsを準備してください。このサンプルは、Xcodeのメニューの「ヘルプ/Xcodeの製品ドキュメント」からダウンロード(といってもすでにローカルのディスク内にあるはず)できます。

    準備ができたら、Finderで、ViewTransitionsフォルダの中にiphone-rubycocoa-simフォルダをコピーしてください。

    ■ rubyとrubycocoaの組み込み (1) — C/Objective-Cプログラム部分

    次に、Xcodeで、ViewTransitions.xcodeproj とiphone-rubycocoa-sim/rubycocoa4iphone.xcodeproj の両方を開きます。

    まず、rubyを組み込みます。rubycocoa4iphoneプロジェクトウィンドウの右側にある「ruby」グループを、ViewTransitionsプロジェクトウィンドウのViewTransitionsにドラッグドロップします。表示されるダイアログパネルの設定は変えずに、そのまま「追加」してください。

    さらに、rubycocoaを組み込みます。「rubycocoa」グループをrubyグループと同様にドラッグドロップして追加します。

    これで、rubyとrubycocoaのうち、C/Objective-C で書かれている核心部分が組み込まれました。

    ■ rubyとrubycocoaの組み込み (2-1) — Rubyプログラム部分

    次に、RubyCocoaのRubyプログラム部分やremote-irbなどのrubyライブラリを組み込みます。rubycocoa4iphoneプロジェクトウィンドウの右側のResourcesグループから、以下の3つ:

    ・main.rb
    ・rubycocoa.rb
    ・utils

    を、ViewTransitionsプロジェクトのResourcesグループにドラッグドロップします。さきほどと同様、パネルの設定は変えずそのまま追加してください。

    ここまで完了した時点で、以降の作業では rubycocoa4iphone プロジェクトは使わないので閉じておくとよいでしょう。

    ■ rubyとrubycocoaの組み込み (2-2) — ビルドフェーズの追加

    最後にrubyの添付ライブラリを組み込みます。rubyのライブラリを正しく動かすためには、ディレクトリの階層構造を保ったままコピーする必要があります。Xcodeで階層構造を保ったままコピーするより良い方法がわからなかったため、ここでは、ビルドフェーズで実行されるスクリプトとして組み込むことにします。

    ViewTransitionsプロジェクトウィンドウを選んでおき、プロジェクトメニューの「新規ビルドフェーズ/新規スクリプト実行」コマンドを実行して、以下の1行のスクリプトを設定してください。

    cp -R iphone-rubycocoa-sim/ruby/lib $BUILT_PRODUCTS_DIR/$PRODUCT_NAME.app/

    ■ main.m の変更

    あとは、main.rb の Rubyプログラムが実行されるように main.m を変更すればすべて完了です。main.m を以下のように変更してください。

    #import 
    #import "RBRuntime.h"
    int main(int argc, const char *argv[]) {
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    int ret = RBApplicationMain("main.rb", argc, argv);
    [pool release];
    return ret;
    }
    


    元の main.m との違いは、RBRuntime.h を import していることと、UIApplicationMain の代わりに RBApplicationMain を読んでいることの2点だけです。UIApplicationMain は、main.rb の中で、remote_irb を起動したあとに呼ばれます(main.rb を見てみてください)。

    ■ ビルド

    ではビルドしてみましょう。困ったことに、29個の警告と2個のエラーが発生してしまいました。ViewTransitions は iPhone Simulator 3.0 向けなので、2.2.1 をベースとした iPhone RubyCocoa ではエラーが発生してしまったわけです。

    これらの警告やエラーのほとんどは、自動生成された Objecitve-Cコードである rb_Foundation.m の中で、廃れつつあるAPIを使っていることに起因しているのですが、とりあえず警告は無視します。2つのエラーは、完全に廃れた定数(NSDateFormatterBehavior10_0, NSNumberFormatterBehavior10_0)のRuby側インターフェースを定義しようとして発生しています。この定数はなくても良いので、それぞれの行(rb_Foundation.mの338行目と1554行目、をコメントアウトしてください。

    では、ふたたびビルドしてみましょう。今度はリンクでエラーがでました。エラーの原因になっている_NSConstantStringClassReference という値も、ここでは不要なので、rb_Foundation.m から関係する関数を削除してしまいます。

    コメントアウトする部分をまとめると以下の4カ所になります:

    ・rb_Foundation.m 338行目、NSDateFormatterBehavior10_0 の定義
    ・rb_Foundation.m 1554行目、NSNumberFormatterBehavior10_0 の定義
    ・rb_Foundation.m 2288行目、_NSConstantStringClassReference の定義
    ・rb_Foundation.m 2241-2246行目、osx__NSConstantStringClassReference

    再度、ビルドしてみしょう。今度はビルドに成功するはずです。

    ■ リモートアクセス

    では、iPhone Simulator で ViewTransitions を走らせて、telnetでリモートアクセスしてみましょう。

     $ telnet localhost 6000
     Trying ::1...
     Connected to localhost.
     Escape character is '^]'.
     >> app = OSX::UIApplication.sharedApplication
     => #
     >> app.delegate.nextTransition(nil)    # アクションを実行
     => nil
     >> app.delegate.performTransition      # アクションの中身を直接実行
     => nil
    


    nextTransition は、UI上にただ一つ存在するボタンから接続されているアクションです。performTransition はnextTransition から呼ばれて実際のtransition を実行します。どちらも ViewTransitionsAppDelegate.m で定義されています。

    このように、Objective-Cで書かれたiPhoneアプリケーションのプロジェクトにiPhone RubyCocoa を組み込むことにより、状態の確認や操作などの試行錯誤的作業を、アプリケーションを実行させたまま出来るようになります。

    今回紹介した方法は、他のサンプルプロジェクトやXcodeのプロジェクトテンプレートで生成したプロジェクトについても、おおよそ同様の手順で組み込むことができるでしょう。

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

     前回の続き、なぜ日本のソフトウェア産業では「人月の神話」がまかり通る……言い換えればプログラマの売り物である「技術」(オレを含めプログラマ自身はこれこそ自分の売り物だと思ってるはずだ)ではなく「人月」というカタチの「時間」を売るのであろうか。

     ……いきなり手前味噌な話を始めてマコトに恐縮なのだが、ワタシが以前書いた「プログラマを笑え!」という本の中に以下の如きくだりがある。ちょい長くなるが引用するね。

     他の業界は知らずこのソフトウェア業界の営業パーソンたちは、まずソフトウェアに関する商品知識を培おうとしないどころかそれが持てないからこそオレは営業をやっているんだとうそぶくようなヤツが一般的であり、かつ業界動向なんてモノにもほとんど興味がない、のである。
     特にソフトウェアの受託開発をするような会社において、営業に商品知識がないということ、すなわち自分トコのプログラマたちの腕とコストを把握していないというのは致命的なことである。誰が考えたってわかる理屈だろう。「高いモンを安く売ってしまう」かも知れないからだ。
     ところがである。不思議なことにこの業界においては、安いものを高く売ろうが高いものを安く売ろうがとにかく営業は売れば褒められることになっており、その仕事が赤字になった責任はすべて実作業を行うプログラマ側が負わされるのである。いや、他の業界のヒトはそんな馬鹿なと思うだろうがそうなのだ。

     5年ほど前の本だけどさして状況は変わってない。つうか、オレがこの業界にはいった1983年、あるいは前回紹介した「人月の神話」が出版された1975年からこのアタリの事情はぜーんぜん変わってないでしょ。

     図らずもこの文中でオレが喝破しておるように、つまるところこの業界が「技術」の代わりに「時間」を売るのは、「売る仕事」をしている連中が「技術」の価値を評価できないからなのである。もっとわかりやすく言えば八百屋のおやっさんが、旬のモノだろうとハウス栽培だろうと有機農法だろうと農薬びしばしの中国産だろうとええいかまうもんかオレに区別がつかないんだから客にも区別なんかつくもんか、とにかくオレが売るネギはどんなネギでも1本50円だぁ、と言って売っちまってるようなものなのだ。

     で、最も大きな問題は上の啖呵のなかにある「オレにも区別がつかないんだから客にも区別なんかつくもんか」というのが、恐ろしいほど正鵠を衝いていることなんだよね。

     一昨年(もう一昨年なんだよね)、いわゆる「宙に浮いた年金問題」が明るみに出たとき「コンピュータ上での照合に必要なプログラムの開発費用」として厚生労働省がNTTデータに払った金額を憶えておいでだろうか? 10億円である。あのあとオレんとこにも「ねんきん特別便」ちうのが来たが、あれに記載されているくらいのデータの類似レコードを抽出してひとまとめにするくらいのプログラム、そーんなに難しいと思いますか? オレもそうだが「1億くれたら、いや5千万でも喜んでやります」ってヒトが多いんぢゃない?

     こういうことを言うと、かならず「それは違う、おっきな会社はその仕事に対する責任も含めて巨額の費用をもらうのだ」とか眠たいこと言うオッサンがいるんだが、責任なんて取ってないぢゃん。年間650億もかかってる年金記録システムが、名寄せ失敗データを10年間も放置してきた結果の問題を修正するために、あらためて10億もらっておいて「責任」なんておこがましいだろ。

     おっと、怒りのあまり話が逸れた。結論として、売り手(この産業における営業パーソン)も買い手も、ソフトウェア(とその開発作業)の価値をキチンと評価できないから、ジッパヒトカラゲ(人月)に、そしてブランド(あれはNTTデータだから10億なのだ)重視でペイメントが決められるのである。
                           (以下次回 2009_07_03)

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

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

     皆さんこんにちは、高橋真人です。今回はリファレンスカウントについての説明をしていきます。
     では、以下のサンプルコードをご覧ください。(実際に動かしてみたい方のための説明が記事末尾にあります)

    #include 
    #include 
    #include 
    
    #define LIST_LENGTH 20
    
    typedef struct {
      char name[50];
      int age;
    } Person;
    
    void make_list(Person *list[]);
    void print_list(Person *list[]);
    void clear_list(Person *list[]);
    
    int main (int argc, const char * argv[])
    {
      srand(7);   // 乱数生成(make_list)のための準備。タネをあえて固定。
      Person *list[LIST_LENGTH];
      memset(list, 0, sizeof(list));
    
      make_list(list);
    
      print_list(list);
    
      clear_list(list);
    
      return 0;
    }
    
    
    void make_list(Person *list[])
    {
      int i;
      for (i = 0; i < LIST_LENGTH; ++i) {
          list[i] = malloc(sizeof(Person));
          if (list[i] != NULL) {
              list[i]->age = rand() % 30 + 20;    // 20〜49の間の乱数
              char buf[BUFSIZ];
              snprintf(buf, sizeof(buf), "Sample name_%d_.", i + 1);
              strcpy(list[i]->name, buf);
          }
      }
    }
    
    void print_list(Person *list[])
    {
      int i;
      for (i = 0; i < LIST_LENGTH; ++i) {
          printf("[%02d] age: %d, name: %s n",
                 i + 1, list[i]->age, list[i]->name);
      }
    }
    
    void clear_list(Person *list[])
    {
      int i;
      for (i = 0; i < LIST_LENGTH; ++i) {
          if (list[i] != NULL) {
              free(list[i]);
              list[i] = NULL;
          }
      }
    }
    


     分かり易くするために作為的なプログラムですが(笑)、簡単に解説します。
     人の名前と年齢を持った構造体Personを定義し、Person構造体へのポインタを20個保持する配列listを用意します。
     対話的にデータ入力をするのは省略して、単純に乱数を利用して年齢を作り、特に意味のない(だけど、識別だけは可能な)名前としての文字列を格納します。

     実際のところ、この程度のデータ量であれば、あえてポインタの配列にせず、直接Person型を20個格納してしまう配列を作れば充分ですが、そこは、あくまでも説明のための例なので(笑)。
     ここが話のスタートとなるわけですが、このプログラムにおいてはすべてのPersonデータ(のために確保されたメモリ領域)は、それぞれ一カ所からしか参照されていないので、全く問題はありません。シンプルなものです。
     問題は、1つのPersonデータが複数の個所から参照されるところから始まります。まず、上記のシンプルな例をしっかりと把握して、今後の複雑化に備えてください(笑)。

     注:コードを実際に動かしてみないと理解できない人のために。Xcode(3.1)で動かすためには、ファイルメニューから「新規プロジェクト...」を選び、Mac OS XのCommand Line Utilityというテンプレートを選びます。表示されたアイコン一覧の中から、Standard Toolというのを選び、適当な名前(英数字のみの名にしておいた方が無難)を付けて保存します。
     プロジェクトのウインドウが開きます。右側のファイル一覧からmain.cというファイルをダブルクリックして開きます。main.cの中身を上記のサンプルコードとまるごと置き換えてください。
     実行メニューから「実行」(コマンド+オプション+R)を選べば、コンパイル、リンク、実行が一気に行われます。出力結果は、実行メニューの「コンソール」(コマンド+シフト+R)で見ることができます。

     次回への振り:「今回は、これだけなの?」と、まだまだ余裕のある方へ。
    上記のプログラムに以下のような処理を加えてみてください。

    ・20代の人のみを抽出し、別途リストを作る
    ・リストを年齢順にソートする
    ・リストを20代、30代、40代に分離し、最初に作ったリストは廃棄する

    ◇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.

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

    2009-06-30

    目次

    • WWDC2009初参加レポート           今井 敬子
    • 「Wonderful Server Life」    第95回   田畑 英和
    • 小池邦人のCarbon視点でiPhone探求
    • ターミナルの向こうから      第50回  海上 忍 

    WWDC2009初参加レポート                 今井 敬子

    始めまして。コムシス東北テクノの今井敬子と申します。
    昨年からiPhoneアプリの開発を始めました。他には、Android、Nintendo DSi、PSP等のアプリ、Webアプリの調査、開発等にも携わっております。今年、初めてWWDCに参加しましたが、このたび、初参加の感想を書かせていただけるとのお話をいただきました。
    以下の項目ごとに、感じたこと、考えたことをお伝えできればと思います。

    1.出発前

    出発前に、MOSAで企画された「事前交流会」と「英会話&異文化マナー講座」に参加させていただきました。
    事前交流会は、MOSAに入会したばかりで、かつ初めて参加させていただいた企画だったので、初めこそ緊張しましたが、色々な方とお話をすることができました。また、渡航前にやること等の説明や、WWDCの歩き方等の資料をいただき、WWDCまでにやっておくべきことを整理できたのが良かったです。

    英会話&異文化マナー講座では、ネイティブの講師の方と英語で沢山会話させていただいたことも良かったですが、現地の人の会話の特徴や「名刺は最初に渡すものではない」「握手が弱いと変に思われる」等、日本とは異なる習慣や考え方についてレクチャーしていただけたのが大変ためになりました。(実際、現地の方の握手はかなり力強かったです。2回ほどしかその機会はあ
    りませんでしたが・・・)

    私は今回、弊社からは一人で参加したのですが、WWDC開催中は、これらの企画の場で知り合った方々と日程の多くをご一緒させていただくことができ、大変心強かったです。
    また、一人で行動していたら気付かなかったであろう様々な事を教えていただきました。
    WWDC前に、多くの方とお知り合いになれて本当に良かったと思っています。

    2.英語に関して

    WWDC参加にあたって、一番不安だったのが「英語のセッションを聞いて果たして分かるのか」という点でしたが、プレゼンの資料を見ながらだったせいか、思っていたよりもセッションは理解できました。ただ、スピーカー次第の部分もあり、セッションによっては、ついていくのが困難だったものもあります。かなり楽しみにしていたセッションで、喋るのは早い、メモを取っているうちにスライドが2、3枚進んでしまう、といった感じになってしまい、途中でメモするのを放棄したものもありました。

    Attendeeサイトで資料が公開されているのである程度フォローできますが、やはりもう少し耳で理解できるようになりたいと思います。また、プレゼン後に質問を受け付けるセッションが多数ありましたが、プレゼン時の話し方よりもスピードが速く感じられ、あまり理解できなかったのが残念です。

    3.WWDCで得られた事

    いざ参加すると、「せっかくここまで来たんだから、モノにして帰ろう」という欲が湧きます。
    また、何よりもAppleの担当者から情報を入手できる、またとない機会です(社会人になってしまうと、興味のある技術の説明を受ける機会自体、貴重だと思います)。セッションで聞いた事などは、想像していた以上に頭に入ってきた感じがします。まだ新機能のほとんどは使っておらず、実践はこれからですが、OSリリース後にドキュメントを自力で読み始めるのとは比べ物にならないくらいの収穫を得たと思っています。

    また、多くのデベロッパと交流できたことが、大変良い刺激になりました。色々な方が作ったアプリを見せていただき、直接質問等できるのが大変楽しかったですし、有意義でした。

    一方、反省点もあります。
    何より悔やまれるのは、準備不足であったことです。
    今回私は、ほとんどiPhone OS3.0に触れないまま参加してしまいましたが、もし、もう少し新機能の概要等掴めていれば、深い切り口でセッション等に臨めたと思います。

    また今回、iPhone OSのオーディオ関連で質問したい点があったのですが、質問するためのサンプルコードの準備がオーディオ関連のラボまでに間に合わず、Open Hoursに質問するのが精一杯でした。何とか聞きたかったことの半分くらいは達成したのですが、いざ持ち帰って再度試してみると別の疑問が出てきてしまいました。
    ちゃんと準備ができていれば、ターゲットのラボで質問し、追加の疑問はOpen Hoursで解消する等、もっと有意義にラボを活用できたのではないかと思います。

    ひとつ想定外だったのは、WWDC期間中、思ったほど時間の余裕がなかったことです。
    出発前には、「間に合わない分はWWDC期間中の夜にでも準備すればよい」とのんきに構えていましたが、WWDCが始まってしまうとそんな余裕は全くありませんでした。恐らく、セッションを聞くのに想像以上の体力・気力を使ったことが一番の原因だと思います。
    もし次回も参加できるならば、ちゃんと備えをして臨みたいです。

    4.気候について

    涼しいとは聞いていたので、日本でWWDCの時期に着ていたら暑いと感じるであろう程度の衣料は持っていきました。しかしそれでも寒いと感じる時がありました。日中の一瞬だけ、日が差して汗ばむ陽気になりますが、朝も夜も結構冷えます。また、風が吹いている時間が長く、それも寒く感じる一因でした。キーノートで朝から並ぶ際や、野外でのパーティなどは、薄手のコート等あった方が安心かもしれないと思います。

    気温の低さは予想以上でしたが、幸い天候に恵まれ、きれいな空の下で、気分良く一週間を過ごすことができました。
    あまり観光はできませんでしたが、お昼休みが長いので、会場付近の散策ができました。
    パウエル駅周辺の、様々なショップを見ているだけでも楽しかったです。

    以上を持ちまして、感想とさせていただきます。
    最後になりましたが、WWDC期間中にお世話になった皆様に、この場をお借りしてお礼申し上げます。
    本当にありがとうございました。

    ◆執筆者プロフィール
    コムシス東北テクノ 今井敬子

    昨年からiPhoneアプリの開発を始めました。Macでの開発はこれが初めてで
    す。その前は、主にWebアプリケーションの開発を行っていました。
    http://www.comsys-tt.co.jp/

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

    〜「Snow Leopard Server」編〜

     WWDCで発表のあったiPhone 3GSが6/19に米国で発売されました。最初の週末で100万台以上の売上を達成し、そして6/26には日本での発売も始まりました。
     WWDCで発表のあったのはiPhoneだけではありません。次期OSのSnow Leopardもその詳細が明らかになってきました。今回は予定を変更してサーバ版のSnow Leopard Serverについて紹介していきます。

    ◇Snow Leopard Server
     まず発売時期などの概要ですが、クライアント版のSnow Leopardと同様9月に出荷開始とだけアナウンスされています。これまでクライアント版とサーバ版は同時に発売されていましたから、おそらく今回もそうなるでしょう。
     クライアント版はMac OS X Leopardからのアップグレードが29ドルというこれまでにない超低価格で発売されることが発表され話題になりましたが、サーバ版のMac OS X Server Snow Leopardは無制限ライセンスが499ドルとこれまでの半額程度の金額になります。日本円での価格はまだ発表されていませんが、Mac miniと組み合わせれば10万円台からサーバが構築できることになりそうです。
     これまでは、AFPおよびSMBに接続数の制限があった10クライアントライセンス版もあったのですが、Snow Leopard Serverではどこにも記述がないことから無制限ライセンス版のみに統一されるのではないでしょうか。ちなみにこれまでは10クライアントライセンス版の価格が499ドルでした。

     Snow Leopard Serverの動作環境ですが、Leopard Serverと比較すると以下のようになっています。

     Snow Leopard Server:Intel CPU、2GBのRAM、10GBのディスクスペース
     Leopard Server:Intel/PowerPC G5/PowerPC G4(867MHz以上)
             1GBのRAM、20GBのディスクスペース

     まずCPUがIntel専用となっています。すでにすべての製品ラインがIntelに移行しているわけですが、いよいよPowerPCが動作環境から外れることになります。メモリは最低2GBのRAMが必要となっていますが、これはLeopard Serverの倍の容量となっています。ただしハードディスクのディスクスペースは半減し少なくとも10GBとなっています。OSがスリム化したことでディスクスペースが節約できるということですね。

    ◇Snow Leopard Serverの新機能
     クライアント版のSnow Leopardは新機能の追加よりも、基盤の強化に力を入れていますが、サーバ版では色々と新機能の追加があります。まず新サービスとしてAddress Book ServerとMobile Access Serverが追加されます。
     Address Book Serverではユーザごとに「アドレスブック」で管理するコンタクト情報をサーバで管理できるようになります。これにはCardDAVというプロトコルを使用します。
     Mobile Access Serverでは、VPNを使わずにインターネットから会社内などのプライベートなネットワークに安全にアクセスできる環境を提供します。クライアント側でのソフトウェアのインストールや設定は必要なく、メールやカレンダーサービスなどにアクセスでき、iPhoneからも利用可能です。

     既存のサービスもさらに強化されます。Leopard Serverで新登場したiCal Server、Podcast Producer、Wiki Serverがそれぞれバージョンアップします。
     iCal Serverではこれまで「iCal」などCalDAVに対応したクライアントソフトが必要でしたが、これからはWebブラウザベースでの利用も可能になり、さらにiPhoneからのアクセスも可能です。
     Podcast Producerでは新たにデュアルソースのキャプチャに対応し、カスタムワークフローを作成する「Podcast Composer」が新たに搭載されます。
     Wiki ServerではなんとQuick Lookを搭載し、Webブラウザ上でプレビューが表示できるようになります。またiPhoneからのアクセスにも対応しています。
     
     さらにメールサービスがプッシュメールに対応するなど、他のサービスでも様々な改良が加えられています。またパフォーマンスの向上も期待できます。

    ◇アップル技術者認定資格試験・認定トレーニング
     さて話は変わりまして、最後に認定試験/トレーニングについて取り上げます。日本ではPantherのころからアップル社のIT技術者向け認定トレーニングが実施されてきましたが、ようやくLeopardに対応したコースが実施されることになりました。ダイワボウ情報システムが新たにアップル公認のトレーニングセンターを開設し、2つのトレーニングコースを7月から東京と大阪で開催
    し、順次全国7カ所に展開する予定になっています。
     またトレーニングだけではなく、アップル技術者認定試験も実施され、こちらも全国展開が予定されています。
     
    ・ニュースリリース
    http://www.pc-daiwabo.co.jp/release/090624.html
                                 次回へつづく

    WWDC 2009に思う(2008/06/26)       小池邦人

    6月8日(日本では 6月9日の深夜)Steve Jobs CEO不在のまま、Philip Schiller副社長によるキーノート(基調講演)でWWDC 2009が開幕しました。
    「今回はJobs不在だからねぇ…」と油断していると痛い目に遭うと思い、キーノート待ち行列には午前6時前から並びました(前回より早い)。予想は的中、待ち行列は昨年以上の延びを示し、大きな会場をぐるりと一回り囲んでしまいました。今年の参加状況も「満員御礼!」です。会場に遅く到着した人の中には「オーバーフロールーム」(会場へ入れなかった人が映像のみ鑑賞す
    る部屋)からもオーバーフローしそうになったという話も流れていました(笑)。行列の付近には、お馴染みのMacTechマガジン配布チーム、Tシャツや小物の投げ込みチーム、ドングルSDKを配布するメーカ、iPhone用ポルノサイトを宣伝する水着のお姉さんを乗せた馬車まで登場し、退屈な待ち時間を存分に楽しむことができました。

    Philip Schiller副社長(このために少し痩せたのか?)のちょっと緊張気味の司会と、担当重役のそつのないナビゲートでキーノートも順調に進みました。何とか笑いを取ろうとした場面がことごとく失敗に終わったのは、まあ愛嬌です(笑)。WWDCのセッション内容はNDA(秘密保持契約)扱いで詳細開示は不可ですが、キーノートはNDA適用外なので、その概要については、既に関連サイトに多数掲載されています。今回も詳細については、そちらにお任せしたいと思います。噂通りにiPhone 3GSが登場しましたし、低価格MacBook Proの発売、Snow Leopardの最終日程と驚きの$29バージョンアップの発表など、ネタ的には十分満足できるキーノートだったと感じました(不満はCEOの不在のみ?)。ただし、iPhone OS 3.0やSnow Leopardの機能は既に発表済みの内容だったわけで、ソフト屋としては「次の一手」が何も示されなかった点に、若干のモヤモヤを感じたことも事実です。

    初日はiPhoneのみを所有している参加者が多かったのですが、2日目からは、会場の多くの人がMacBook Pro(17インチ多し)を持ち歩いていました。キーノートでお買い得13インチMacBook Proが発表されたおかげで、それを現地調達して使う人もいたようです(会場のゴミ箱に空き箱が捨てられていた)。ほとんどの人は、セッション内容のメモ取りなどでMacBookを活用しています
    が、後ろから画面を覗くと、自作アプリを一生懸命デバッグしている人も結構いて「ちゃんとセッション聞けよ!」とか、声をかけたくなります(笑)。また「変なデスクトップだな?」と見ると、そのまんまのWindows XPが走っていたりして(昔からLinuxは結構いた)吹き出すことも多々ありました。そうそう、今はやりのネットブックをハックしてMac OS Xをインストール(大胆)している人にも結構遭遇したことも追加しておきましょう。

    昨年のWWDCでは、Apple社のWebサイト(参加者のみ入れる)へと最新スケジュールがアップされ、それをiPhoneやiPod touch(もしくはMac)で参照していたのですが、今回は、iPhone&iPod touch専用の「WWDC09」アプリが用意されていました。それをダウンロードし自分のiPhoneにインストールすることで、参加者は最新のイベントやセッションスケジュールを参照できるわけです。アプリへは逐次最新情報が転送され、未読情報は画面の数値バッチで忠告してくれます。また、別途デバイスへインストールする「Provisioning Profiles」(認証ファイル)も同時配布されたのですが、これがオールマイティ版(デバイス識別子のUIDIを判断しない)と分かり、デベロッパーの中から「この仕組みを利用できるサービス形態が欲しいぞ!」と言う「大きな声」が上がっていたことも付け加えておきましょう(後に追記有り)。

    昨年のWWDCの感想で「美しきスツールのために、次のWWDCでは4本目の足(ビジネス分野への進出)についての戦略を公開して欲しい!」と書いたのですが、残念ながらそちら方面については、Snow LeopardのExchange対応が強調された程度で、これといった大きな発表はありませんでした。当然「Mac OS Xのライセンシング」の話などはこれっぽっちも出ていません。また「パソコンを生産をしていないSunやIBMとMac OS Xがらみで提携したら?」とも書きましたが、そのSunも既にOracleに買収されてしまったわけでして、状況の変化の速さに驚かされる今日この頃です。まあ、Apple社のことですから「抜き足、差し足、忍び足」で、知らない間に自社製品をビジネス分野へジワジワ浸透させていくための準備をしているかもしれません…。iPhoneがらみに関しても、その傾向が見え始めている気もしています。

    今回開催された多くのセッションは「iPhone OS 3.0」関連が中心です。また、全体の60%が初参加だと言うこともあり、「入り口」としての開発環境(Xcode Tools)関連のセッションも活発だったようです。しかし、十数年もWWDCへ通い続けているデベロッパーから見ると、それ以外は「成熟」の極みといった雰囲気が漂っていました。今まで何度も主役を演じてきたQuickTimeも
    QuickTime Xがらみのセッションがひとつだけ、今回はCocoaにしても目新しいトピックスはほとんど無い状況でした(当然Carbonセッションなどは皆無)。
    Snow Leopardで導入予定の、64Bitカーネル、OpenCL、Grand Central Dispatchなども、企業や大学のサイエンス系研究室では大いに力を発揮しそうな技術なのですが、コンシューマに直接結びつくトピックスではないことから、盛り上がり方も今ひとつ限定的なようです。

    しかし、こうした地味なテクノロジーが、OS自身や付属アプリの開発に大いに生かされている可能性は無視できません。つまり、Apple社の自社開発におけるソフトの処理速度の改善や、より強固なシステム構築に大きく貢献しているわけです。そのことは、間接的ですがコンシューマにとっても大きなメリットとなるはずですから、Snow Leopardの登場が本当に楽しみになってきました。さらに気になった点は、キーノートでも見え隠れしていた、Mac OS XとiPhone OSの「統合」の流れです。現在、両OSでは「Core OS」と呼ばれているシステムモジュールが共通で存在しており、その割合は全体の80%を占めます。後は、両OSのユーザインターフェース・フレームワークであるAppKitとUIKitの差異を縮めれば、2つのOSは割と簡単に統合の道を歩むことになります。つまりCPU依存でコンパイルし直せば、MacでiPhoneのアプリが起動し、iPhoneでMacのアプリが起動することになります。

    まあ、統合自体は少し未来の話かもしれませんが、「一歩先を行く」iPhoneアプリの開発を目指し、その先行メリットを得たい開発者は、iPhone OSと同時にMac OS Xの最新テクノロジーも勉強しておくことをお勧め致します。iPhone OS 2.0から3.0では「Core Data」「Spotlight」「OpenGL 2.0」「Pastebord」「VoiceOver(Accessibility)」などが、Mac OS X側から降りてきました。次の機会には「QTKit」「ImageKit」「CoreImage」「QuartzComposer」「Binding」「OpenCL」などが降りてくる可能性があります。逆に、Mac OS Xではトラックパッドによる「Multi Touch」機能が充実してきており、将来的
    にはiPhone OS特有の機能「MapKit」「GameKit」「StoreKit」「LibraryAccess」などが実装されるかもしれません。MacやiPhone(将来登場するかもしれない新デバイスも)を区別せず、総合的にApple社のテクノロジーを習得しておくことは、今後さらに重要性を増すことになるかもしれません。

    今回のWWDCで一番残念だった点は「App Store」の改善について何も言及されなかったことです。iPhone 3.0でアプリ内からコンテンツを購入できる機能は追加されましたが、 App Store自体の機能拡張については何も新しい発表がありませんでした。現在、5万以上の商品が店頭に並べられているApp Storeですが、どうひいき目に見ても、自分の欲しているアプリを簡単に見つけて購入できるという「ショップ」の心地良さはありません。商品数が多くなっていくペースに店舗のリソースの整備が追いついていないわけです。やはり「欲しい商品を見つけてくれる優秀な店員」が絶対に必要です。まあ、AIを駆使した検索エージェントを搭載しろとまでは言いませんが、もう少し買う人に優しい店舗に改築して欲しいところです。これはiPhoneアプリ開発者とユーザのために早急に改善すべき問題だと思うのですが、Apple社はいったいどうするつもりなのでしょうか?

    もうひとつの不満点は「iPhone Developer Program」契約形態の拡充が示されなかったことです。現在、このプログラムには「スタンダードプログラム」と「エンタープライズプログラム」の2種類が存在しています。このうち「エンタープライズプログラム」は社員数500人以上の大企業(加入している企業を聞いたことがないが…)が対象なので、ほとんどのiPhoneアプリ開発者は
    「スタンダードプログラム」へ加入しているはずです。しかしこの契約では、開発したiPhoneアプリはApp Store経由でしか販売できません。それ以外の手段としては、デバイス100台限定でAdHocによる配布が利用できます。「あれ、AdHocは200人までじゃないの?」と思われる方も多いでしょうが、現状のAdHocでは配布用リストには200人まで登録可能ですが、対象デバイスの方は何故だか100台までしか登録できないのです(Portalサイトのバグ?)。そんな訳で、AdHoc対象者は100人までに限定されてしまいます。

    システムインテグレートを生業としているMac関連企業が、iPod touchに独自の自社アプリをインストールし、Mac関連ソフトや周辺機器と一緒に販売しようと立案したとします。 例えばMacで組んだPOSシステムの端末にiPod touchを使い、そこに専用アプリをインストールするようなケースを考えましょう。
    さて、このiPhoneアプリをどうやってデバイスにインストールするのか?
    「App Storeに無料アプリとして置き、ユーザにダウンロードしてもらえば良い…」という考えもあるでしょう。しかし、何らかの理由 で(配布タイミング、セキュリティ、環境設定、ライバル対策など)、それが不可能だと判明したら…そう、AdHocを使うしか手がないのです。つまり、商品が100セット売れる度に、さらに1万円を支払って「iPhone Developer Program」を追加契約するといった冗談のような話が現実となります。

    Apple社が「それはレアケース」と考えているなら大間違いです。例えば一番の例は、今回参加者に配布された「WWDC09」アプリです。これは、不特定多数にApp Store経由以外でアプリを配布するケースです。こうした状況は、iPhoneが想定する「ビジネスシーン」でも頻繁に起こるでしょう。これを無料としてApp Storeに置かなかった理由は「一般ユーザによるダウンロードを避
    けたい」「プロファイル設定でWWDCが終われば起動不可にしたい」などが考えられます。つまり、自社でアプリをきめ細かくコントロールするのには、App Storeによる配布形態は大変不向きなのです。より多くの用途にiPhoneを活用したいと考えた時、現在の「iPhone Developer Program」の契約には大きな不備があります。会場でも多くの参加者の方に「何か良い方法はありませんか?」と尋ねられたのですが、現状ではうまい解決方法はありません。Apple社には、早急に何とかしてもらいたいものです。

    どうやらiPhoneの改訂ペースは1年毎で確定したようなので、次回もWWDC開催時期とも重なる可能性があります。また、Macがらみの次なる展開(Snow Leopard後)にも注目が集まるでしょう。加えて、噂の「新デバイス」が登場しており、そのOSやSDKの話題で、いつも以上に盛り上がっていることを期待したいと思います。
                                     以上

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

    〜 ローカルでPHPを使う(1) 〜

    ・PHPとMac OS X
     Macユーザの間でも、自身が運営または関与するWebサイトにPHPを利用している、というケースは少なくないはずです。自前のサーバならいざしらず、LAMP(Linux / Apache / MySQL / {Perl|PHP|Python|})ベースのレンタルサーバを使おうとなると、避けては通れないことすらあります。
     PHPは、ひとことで言えば「動的にWebページを生成するためのプログラミング言語」です。サーバサイドで動作し、生成されたデータは通常のHTMLとしてクライアント(Webブラウザ)に送信されるため、ユーザ側には特別な準備は必要ありません。この点が、JavaScriptなどのクライアントサイドで動作する処理系との大きな違いといえます。
     一方で、サーバサイドで動作するがゆえの難点もあります。HTTPサーバと連携することが前提にあるため、記述したスクリプトをテストするときには、PHP本体にくわえApacheなどのHTTPサーバが必要になります。出力されたHTMLを確認するためのWebブラウザも必要です。レンタルサーバの多くはこの条件を満たしていますが、公開サーバでテストするわけにはいかないため、ローカルにPHPのテスト環境を構築することが一般的です。
     Leopard(クライアント版)には、PHPとApacheの両方が標準装備されているため、PHPのテスト環境としての条件を満たしています。しかし、デフォルトではPHPが無効化されているため、これから述べる作業が必要になります。

    ・PHPを有効化する
     Mac OS X 10.5.7には、PHP 5.2.8が収録されています。これを有効化すれば、HTTPサーバ(Apache 2.2.11)をシステム環境設定からONにするだけで、PHPスクリプトの実行環境がMac上に出現します。
     Leopardでは、Apacheの設定ファイル(httpd.conf)は/etc/apache2ディレクトリに置かれています。ただし、管理者以外は書き込めないようファイルパーミッションが設定されているため、以下に示すとおり、sudoコマンド経由でテキストエディタ(ここではpicoを使います)を起動したうえで、編集作業を行います。

    - – - – -
    $ sudo pico /etc/apache2/httpd.conf
    Password:
    - – - – -

     sudoは、引数として与えたコマンドライン(ここではpico /etc/apache2/httpd.conf)を、管理者権限で実行するコマンドです。管理者権限でテキストエディタを起動することにより、一般ユーザには読み書きが制限されているファイルであっても、フルアクセスが可能になります。一方では、安易にアクセスされるべきではない重要なシステムファイルを自由に改変/削除できるこ
    とも意味するため、慎重な運用が求められます。
     なお、sudoコマンドを実行すると、管理者のパスワードの入力が促されます。5分以内であれば、再度sudoを実行してもパスワードの入力は求められません。

     picoで行う作業は、httpd.confの114行目行頭にある「#」を削除し、上書き保存することです。114行目までカーソルキーで移動してもかまいませんが、Control-Wをタイプして「php」+enterと入力(「php」で検索)したほうが効率的です。deleteキーで「#」を削除したあと、Control-Xでpicoを終了するとき「Y」と答え、続けてenterを押せば、ファイルの上書き保存は完了で
    す。

    - – - – -
    #LoadModule php5_module libexec/apache2/libphp5.so
     ↓ ↓ ↓
    LoadModule php5_module libexec/apache2/libphp5.so
    - – - – -

    ・動作を確認する
     これで、システム環境設定の「共有」ペインで「Web共有」にチェック(すでに有効化されていた場合はチェックボックスをいちど外して再度チェック)を入れれば、PHPのテスト環境は準備完了です。念のため、以下の1行のみ記述したテキストファイル(仮に「checkme.php」とします)を、「ホーム」→「サイト」フォルダ(~/Sites)に保存し、動作の確認を行いましょう。適当なWebブラウザで「http://localhost/~ユーザ名/checkme.php」にアクセスし、システム情報が表示されれば作業は完了です。

    - – - – -

    - – - – -

     なお、環境によっては、Apache2のアクセスログ保管用ディレクトリが消失していることがあります。筆者のMacBook Proも、ふと気付けばそのようになっていました。原因を特定してはいませんが、Time Machineで復旧したことが原因かも……とりあえず、以下のコマンドラインを実行し、復活させることができました。Web共有を有効化しても「サーバに接続できません」と表示される場合には、/var/log/apache2ディレクトリの有無をチェックしてみましょう。

    - – - – -
    $ sudo mkdir /var/log/apache2
    $ sudo chown root:wheel /var/log/apache2
    - – - – -

    ◇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.

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

    2009-06-23

    目次

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

    MOSA新会長ご挨拶           有限会社オッティモ 小池 邦人

    iPhoneが登場して以来、そのデバイスやシステム、もしくはビジネスモデルに対して様々な場所で色々な評価がなされています。その中で、あまり大きくは取り上げられていないのですが、「Mac + Cocoa + Objective-C」を経験したデベロッパーの数が格段に増えたという事実はかなり重要でしょう。Apple社の発表によると、本年度のWWDCは早々に満員御礼となり(参加者5,200人)、その60%が初めての参加者だったそうです。また、iPhone SDKのダウンロード数も100万を超えました。

    iPhone登場以前と比較し、Apple社製品にからむデベロッパーの数は10倍以上になったそうです。Apple社は、MacやiPhoneを中心としたエコシステムに対して大きな基盤を得たことになります。つまり、iPhoneアプリだけではなく、iPhone+Macソリューション構築時のMac OS X用ソフト、iPhone用周辺機器のソフト、そしてApple社が次に準備しているだろう「まったく新しいデバイス」用ソフトなどなど、それらの開発を担うことができるデベロッパーを一定数確保したことになります。

    その一方で、iPhoneアプリの開発は、手軽に作品発表ができるApp Storeの存在や、多くの関連書籍の出版のおかげで、あの懐かしいHyperCardの様な雰囲気も醸し出しています。確かに、そこまで簡単ではないのですが、プログラミングという「創造の結果」を手軽に体験できるツールとしては、久しぶりに登場した大物です。そのため、iPhoneユーザの中には、アプリ開発にチャレンジしてみようと思い立ったプログラミング初心者の方も多いようです。また、往年のプログラマーの中には、密かに「現役復帰」を画策する人も少なくありません(笑)。

    MOSAは、職業デベロッパーの方々だけではなく、プログラム初心者や学生の方の参加も大歓迎です。iPhone登場により、久しぶりに目が向けられた「プログラミングの楽しさや面白さ」を、さらに多くの方々と共有できればと考えています。そのためには、技術セミナーや各種イベント、そしてWebやオフラインによる会員同士のコミュニケーションを積極的にサポートしていきます。スタッフ一同「MOSA会員が作り上げるMOSA」を目標にがんばりたいと思いますので、会員の皆様のご協力、よろしくお願い致します。

    好きこそ物の上手なれ!     MOSA会長 有限会社オッティモ 小池邦人

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

    iPhone 3.0 がリリースされましたね。iPhoneとRubyといえば、森琢磨さんがRuby と RubyCocoa を iPhone に移植した iPhone RubyCocoa を公開しています。iPhone RubyCocoa には、リモートirbという機能が組み込まれています。この機能により、実行中のiPhoneアプリケーションのオブジェクトシステムに対して、リモートコンピュータ(リモートプロセス)からtelnet経由で、irbによるアクセスが可能です。

    今回から、この iPhone RubyCocoa をiPhoneアプリケーションの開発に活用する方法を考えてみることにします。

    ■ iPhone RubyCocoa のダウンロード

    iPhone RubyCocoa のソースコードは、githubで公開されています。githubというのは、分散型バージョン管理システム git によるソースコード管理を提供しているホスティングサービスです。では、github上の iPhone RubyCocoa のページ:

    http://github.com/takuma104/iphone-rubycocoa/tree/master

    から iPhone RubyCocoa のソースコードを入手しましょう。

    git コマンドを使う場合には:

     $ cd どこか作業用のディレクトリ
     $ git clone git://github.com/takuma104/iphone-rubycocoa.git
     $ open iphone-rubycocoa
    
    

    でソースコードをダウンロードできます。

    といっても、OS X 10.5 には git がインストールされていませんので、git を使っていない(インストールしていない)場合は、上記ページの download ボタンを押して、zip形式(あるいはtar形式)のファイルをダウンロードして展開してください:

     $ unzip takuma104-iphone-rubycocoa-ユニークID.zip
     $ mv takuma104-iphone-rubycocoa-ユニークID iphone-rubycocoa
     $ open iphone-rubycocoa
    


    (注: 「ユニークID」の部分には、ダウンロード時のソースコードのリビジョンを表す16進数番号が入ります)

    ■ Xcode でビルド

    では、最新の Xcode 3.1.3 を使ってビルドしてみましょう。Xcodeのプロジェクトファイル rubycocoa4iphone.xcodeproj を開いて、そのままビルドしてください。たくさんの警告(私のところでは28個)がでましたがリンクは通っているので、警告の解決は後回しにしてとりあえず実行してみます。iPhoneシミュレータの画面に「hello RubyCocoa world」と表示されたでしょうか?

    ■ リモートirb

    iPhone RubyCocoa のリモートirb機能は、デフォルトでは(おそらくセキュリティ上の理由から)機能しないようにコメントアウトされています。しかし、この機能こそ、iPhone RubyCocoa で一番使いたいところでもありますから、使えるようにしてみましょう(注: この機能はリモートコンピュータに対してIP接続のポートを公開することになるので、その点注意してください)。プロジェクト内のmain.rbファイルの 3,4行目:

     # require 'remote_irb'
     # RemoteIRB.new(6000).start
    
    の部分のコメントを外して:
    
     require 'remote_irb'
     RemoteIRB.new(6000).start
    


    にします。これをビルドして実行しましょう。先ほどと同じく、iPhone シミュレータの画面に「hello RubyCocoa world」と表示されたでしょうか(注: ここでシミュレータ内のiPhoneアプリケーションが落ちてしまう場合があるのですが、それについては後述します)。さらに、Xcode のデバッガコンソールを見ると:

     [remote_irb] listening on 192.168.xxx.xxx:6000
     #
     #
     #
    
    と表示されています。 IPアドレス 192.168.xxx.xxx のポート番号6000で接続
    を待ち受けているということなので、telnet で接続してみましょう:
    
     $ telnet 192.168.xxx.xxx 6000
     Trying 192.168.xxx.xxx...
     Connected to 192.168.xxx.xxx.
     Escape character is '^]'.
     >> 
    


    どうやら、iPhoneシミュレータ上で動く irb に接続することができたようです。
    さっそく、アプリケーションオブジェクトにアクセスしてみます:

     >> app = OSX::UIApplication.sharedApplication
     => #
     >> view = app.keyWindow.contentView
     => #
     >> view.class
     => OSX::UILabel
    
    contentViewには UILabelがセットされているようです:
    
     >> view.text.to_s
     => "hello RubyCocoa world"
    
    UILabelのテキストと背景色を変更してみましょう:
    
     >> view.setText Time.now.to_s
     => nil
     >> view.setBackgroundColor OSX::UIColor.blueColor
     => nil
    


    というような感じで、実行中のiPhoneアプリケーションのオブジェクトを操作することができました。

    ところで、このプロジェクトは、iPhone Simulator 2.2.1 向けになっています。
    ここは 3.0 で動かしたいところですが、残念ながらリンクエラーになってしまいます。コンパイル時の警告も含めて、次回は 3.0 で動かせるように修正することにします。

    ■ (補足) ビルドしたiPhoneアプリケーションが落ちてしまう場合の対策

    iPhone上のRubyがkconvライブラリを要求して落ちてしまうようで、言語の設定(localeなど)が関係しているようですが、これを書いている時点でははっきりと解決はできていません。私のところでは、iPhoneシミュレータを、XcodeからではなくFinderから起動して、ビルドしたiPhoneアプリを起動したら立ち上がるようになりました。

    ■ 参考URL

    iPhone で Ruby/RubyCocoa を動かしてみた
    http://d.hatena.ne.jp/takuma104/20090225/1235584788

    iphone-rubycocoaで、実機動作中のアプリをリモートから動的に変更する
    http://d.hatena.ne.jp/takuma104/20090301/1235927945

    github の iPhone RubyCocoa ページ
    http://github.com/takuma104/iphone-rubycocoa/tree/master

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

     承前……と言って皆さんWWDC前にモサ伝で読んだことなど憶えてないかも知れないので(なに憶えてなくても恥ぢゃない、書いてるオレが今前回のを読み返してからこれを書き始めてんだから)、「前回までの『24』は……」的にちょいとおさらいをする。まず我々は以下のような真実を確認した。

    「ソフトウェア技術者は昔も今も『高度で専門的な知識や経験を要する』職業である」
     
     しかるに現状はこうである。

    「ソフトウェア技術者は『高度で専門的な知識や経験を要する』職業にふさわしい扱われかたをしていない……安くコキ使われている」

     で、それはなんでだ? という設問に対する粉砕すべき仮説1として以下のものを提示したところまで、である。

    仮説1:ソフトウェア技術者の待遇が悪いのは受給のバランス、つまり供給が過剰だからである。「高度で専門的な知識や経験」も数が増えれば安くなるの
    が当然やんけ。

     で、上の仮説どー思います? その通りだと思いますか? ここで読者処刑……ハリツケ獄門食らってどうする、諸兄に納得されてしまうとオレも立つ瀬がないんだが、どうですか、実感としてこの仮説に首肯できるかたはおられましょうか。ワタクシはと言えば到底首肯できない、バン!(机を叩いた)。

     なんつかな、ひどく卑近かつ個人的怨念びしばしの話をさせてもらうと、そんなに「高度で専門的な知識や経験」を持ったヒトが増えて安く使えるようになってるのなら、あの時オレはもっと楽できたはずだと思い起こし、枕をくやし涙で濡らすような(濡らしやしないがね)仕事というのが数多あるのである。

     オレ思うに、仮説1はこう書き換えられるべきではないか。

    仮説1(改):ソフトウェア技術者の待遇が悪いのは、「需要」に対して業界が、実際には「高度で専門的な知識や経験」を持たない人材までを「供給」したことに起因する「見かけの供給過剰」が原因である。

     どっすか? これ、裏を返せばあの「IBM/システム360の父」フレデリック・P・ブルックスJrがその名著「人月の神話」の中で喝破した問題そのものである。読んでないヒトのために(読んだ方がいいよ)その部分だけかいつまむと、ブルックスはこう言ってる。

    「コストは人数と月数の積(人月)である。が、進捗はそうではない」

     もう涙が出るほど簡潔でしょ?

     そして彼は、「コスト(人月)」と「進捗」を混同して「人月を仕事の大きさを測る単位として使う」ことを「人月の神話」として戒めてる。……んだけど、この本が最初に出版された1975年からもう30年以上経っているにも関わらず、そして日本人の「教科書ダイスキ体質」にも関わらず、この悪弊だけは改善されずに残っているのである。

     でもこのブルックスの言葉、他の仕事に当てはめると別に特段珍しいことを言ってるわけではないのだ。例えばあなたが家を建てるとする。どうせ例えばの話なんだから田園調布あたりに300坪くらいの土地があり、建築資金も潤沢にあるとしよう。

     友人の建築家(そういう金持ちにはたいがい建築家の友達がいる)に図面をひいてもらい、腕のいい工務店を紹介してもらう。その時工務店が持ってくる見積もりは「大工何人が何ヶ月仕事しますからいくらです」ぢゃなくて「仮設工事いくら、基礎工事いくら、地盤改良工事いくら……」ですよ。

     次回より、なぜ日本のソフトウェア産業では「人月の神話」がまかり通るのかちゅうコトを追求しよう。
                           (以下次回 2009_06_19)

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

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

     皆さんこんにちは、高橋真人です。今回はリファレンスカウントという考え方についてのお話です。
     前回、「次回はretainカウントについて説明します」と予告しましたが、Cocoa特有の用語であるretainカウントを説明する前に、もっと一般的な概念の方を説明しておく方がいいと思いますので、先にリファレンスカウントを説明します。

     さて、malloc()によってヒープ領域から動的に確保したメモリーをfree()で解放するということについては前にお話をしましたが、実際のプログラムにおいては、この動的に確保されたメモリー領域が複数の個所から参照されるために話がややこしくなり、「解放のし忘れ」や「既に解放済みの領域にアクセスしようとする」といったバグの温床となります。
     具体的に見てみましょう。

    // バグあり、注意!
    01: #include 
    02: #include 
    03: 
    04: int main (void)
    05: {
    06:     int *a = NULL, *b = NULL;
    07: 
    08:     a = malloc(sizeof(int));
    09:     *a = 10;
    10:     printf("*a = %d\n", *a);
    11:     b = a;
    12:     ++(*b);
    13:     printf("*b = %d\n", *b);
    14:     free(b);
    15:     printf("*a = %d\n", *a);
    16: 
    17:     return 0;
    18: }
    


     intを指すポインタaとbを用意し、aに対して動的に確保したメモリ領域を割り当てます(6、8行目)。その領域に10という値を書き込んで、結果を確認します(9、10行目)。
     次に、bにもaの指している先をコピーし、bを経由して書き込んであった値をインクリメント(値を一つ増やすこと)します(11、12行目)。bの値を確認して(13行目)、bの指している先を解放します(14行目)。そして、aの指している先の値を確認する(15行目)というのが、このプログラムでやっていることです。
     さて、どこにバグがあるのか、お分かりですか?

     その答えは、14行目と15行目、確保した領域を解放してしまったあとでaを経由して値にアクセスしているところです。(実際に上記のコードを自分で試してみられた方、プログラムが落ちることはなかったかもしれませんが、それでこのプログラムにバグがないということにはなりません。理由を説明するのは話の本筋から外れるので省略しますが。)
     「あれ? 解放しているのはbだから、aの方は大丈夫なのでは?」と思われた方、11行目の代入文でbにコピーされているのは、領域を表すアドレス値であり、aもbも同じ場所を指している(つまり、aとbの値は同じである)ことをしっかりと認識してください。
     つまり、上記のコードでは意図的に混乱を引き起こすために(笑)、bを使って領域の解放を行っていますが、free(a)と書いてもfree(b)と書いても、11行目が実行された後であれば、a、bそのものの値が変更されない限りにおいて両者は同じ意味を持つのです。

     さて、上記の例をリファレンスカウントという観点からもう一度見てみます。
     まず、malloc()により確保された領域を何らかのオブジェクトだと言い換えてみます(今回は、オブジェクトの実体は単なるintの値ですが)。そして、このオブジェクトは、aというポインタによって参照されていることになります。
     bにaを代入するということは、bもまたこのオブジェクトに対する参照を得るということを表します。
     さて、件のオブジェクトはこの段階でaとbという二つのポインタから参照されています。この状態をリファレンスカウントが2であると表現します。
     a、b二つのポインタがこのオブジェクトを参照している以上、たとえばaにとってもう必要なくなったからと言って、勝手にこの領域を解放してしまうと、bの立場がなくなります(笑)。

     aにとって、この領域への関心がもうなくなったならば、ここはいきなりfree()を呼び出してしまうのではなく、単に

    a = NULL;

    とでもして、もうその領域を指すことをやめるだけにとどめておけばいいのです。この時点で件のオブジェクトを参照しているポインタはbだけですので、リファレンスカウントは1となります。
     そして、もしbにとってもこのオブジェクト不要となった場合、このオブジェクトをいよいよ解放するべきときが来たということになります。もちろん、それまでの間に別のポインタが新たにこのオブジェクトに対する参照をすることがないということが前提です。
     ちなみに、この場合においても

    b = NULL;

    とするのみで、free()を呼び出すことなくbがオブジェクトへの参照を放棄してしまえば、最早オブジェクトを参照するものが一つもない状態になるため、このオブジェクトの格納されている領域を解放することは永久にできず、いわゆるメモリーリークが発生することとなります。

     さて、今までのお話で「リファレンスカウント」という言葉を使って、「今、このオブジェクトを参照しているポインタはいくつ」ということを数えていましたが、それをしていたのは、あくまでこのコードを見ている人間の側でしかありませんから、コードがもっと複雑になって、「えっと、ここでこのポインタが参照を得て、この部分でこっちのポインタが参照を放棄しているから…」などといちいちやっていたら必ず間違えが起こりますし、何よりも面倒この上ありませんよね。
     そこで、このリファレンスカウントという考え方を実際にコードの中に組み込んで、プログラムに自動で管理させようというのが、本来のリファレンスカウントの考え方です。

     次回は、簡単なプログラムで実際にこのリファレンスカウントの使い方を見ていこうと思います。

    ◇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.