本連載では、名前はよく耳にしていてもなかなか触れる機会のないSmalltalkについて、最近話題のSqueakシステムを使って紹介しています。今回は、簡易ペイントスクリプトに、描いた絵を保存する機能拡張を施します。position]]このスクリプトは5行目でshiftキーが押されていることを関知すると、ループをやめて終了します。描いた絵を保存するためには、この後に任意の矩形領域を切り取り、それを画像ファイルとして保存するコードを追加すればよさそうです。手始めに、画面の矩形領域を基本図形GUIウィジェトである「モーフ」として取り出すコードを書いて、その動作を確認してみましょう。it(cmd-D)すると、マウスポインタの形が変わって任意の矩形領域をマウスのドラッグにより指定することを促されます。ドロー系アプリケーションなどでお馴染みの方法、つまり、左上から右下にかけてドラッグすることで矩形領域を指定します。この操作が終わると同時に、指定した矩形領域に含まれるビットマップ画像はモーフとして切り出されるはずです。Formは、ビットマップ画像を表わすオブジェクトが属するクラスで、fromUserメッセージを送ると、画面の任意の矩形領域のビットマップ画像をインスタンスとして返します。asMorphメッセージは、レシーバと等価、あるいは類似のモーフを生じさせ、それにopenInHandメッセージを送ることで画面に呼び出すと同時に、マウスで“つかんだ”状態にすることができます。fromUserの結果、つまりFormのインスタンスに送られる、ということです。同様に、openInHandは、FormでもFormのインスタンスでもなく、FormのインスタンスにasMorphを送った結果の返値、すなわち、Formのインスタンスと等価な画像モーフに対して送られます。余談ですが、asMorphはFormのインスタンスだけでなく、文字列などにも送ることができます。この場合、等価な文字列モーフ(StringMorph)のインスタンスが作られます。openInHand話を戻します。...)を11行目として続けます。it(cmd-D)をしてみましょう。絵を描いた後、shiftを押すと同時に矩形領域の選択が促され、それに従うと指定した矩形領域に含まれる絵を切り取ったモーフを手にすることができるはずです。モーフではなく、指定した矩形領域に含まれる絵をファイルとして保存するにはasMoprh、openInHandの代わりに次のメッセージ「writeJPEGfileNamed:’image.jpg’」をFormのインスタンスに送ります。パラメータで指定したファイル名でビットマップ画像をJPEGファイルとして保存することが可能です。blank)を使います。”描く前の画面のクリア、描き終わった後の画面のリストアの処理を加え、出来上がったスクリプトはこんなかんじになります。'Filename?')次回から、システムブラウザ(GUI)を使ったクラスやメソッドの定義のしかたを解説します。今回は、ウィンドウに実装するイベントハンドラの例題として、前回紹介したアバウトウィンドウを表示するためのopenAboutWindow()ルーチンについて解説します。アバウトウィンドウはアプリケーションメニューの「MOSAについて...」を選択すると表示されます。アプリケーション自身に実装したイベントハンドラが、コマンドIDとして’abou’を受け取ることでopenAboutWindow()が実行される仕組みです。アバウトウィンドウの雛形オブジェクトは、先んじてNibファイル(main.nib)内に用意しておきます。オブジェクト名はAboutWindowです。Positionと設定されています。これは、昔で言うところのダイアログ(Dialog)ウィンドウを準備したことになります。‘のコマンドIDが割り当てられています。「Web」ボタンでは筆者ホームページの表示を、「OK」ボタンではダイアログ表示の終了(閉じる)を実行できます。ダイアログは一度表示されると、それを閉じるまで後ろのウィンドウと切り替えることはできません。ManagerのAPIを使っていたのですが、Nibファイルを使用したCarbonアプリケーションでは、通常のウィンドウとまったく同様に扱うことが可能となりました。);}openAboutWindow()は、Nibファイルに登録されているアバウトダイアログのオブジェクト名(AboutWindow)を、汎用ダイアログ作成ルーチンのcreateMyDialog()へ渡します。この時点では、ウィンドウは作成されただけで表示はされていませんので注意してください。続いてsetupDialogWindowEvent()を実行し、このダイアログにイベントハンドラを実装します。最後にTransitionWindow()を呼んだ時点で初めてウィンドウがオープンされます。以下が、ダイアログにイベントハンドラを実装しているsetupDialogWindowEvent()ルーチンです。);}ここでは、2種類のイベントに対応できるようなEventTypeSpecリストが作成されています。kEventCommandProcessの方はダイアログのボタンのコマンドIDを受け取るため、もうひとつのkEventCommandUpdateStatusの方は、メンテナンス(状況によりメニュー項目を利用可、不可に切り替える)が必要であるメニューのMenuRefを受け取るためです。アプリケーション自身にハンドラを実装する場合にはInstallApplicationEventHandler()を使いましたが、今回はウィンドウへの実装なので、代わりにInstallWindowEventHandler()を利用していることに注目してください。この時にuserDataとして対応するウィンドウのWindowRefを渡しておきます。これにより、処理対象となるウィンドウをハンドラルーチン側で簡単に認識することが可能となります。以下が、アバウトダイアログに実装されたイベントハンドラルーチンのmyDialogWindowEventHandler()です。);}ダイアログのイベントハンドラであるmyDialogWindowEventHandler()内は、以前に紹介したmyApplicationEventHandler()とそっくりです。コマンドIDとして’www!’が届いた時には、ユーザが「Web」ボタンを押したことを意味しますので、以下のopenURL()ルーチンを実行します。2.0に属するAPIで、システムに登録されているウェブブラウザにURLを渡し、そのサイトを表示します。‘が届いた場合には、ユーザが「OK」ボタンを押したことを意味しますので、DisposeWindow()を実行してダイアログウィンドウを閉じます。);}今回は、イベントハンドラルーチンのウィンドウへの実装方法を解説しました。次回は今回の処理を参考にしながら、メインウィンドウ(CatalogWindow)をオープンするためのnewCatalogWindow()ルーチンへと話を進めることにします。前回はERChangeNotificationJMS(以下ERCN)のセットアップ方法を解説しましたがいかがでしたでしょうか。最新版のOpenJMSに対応するためにはファイルの差し替えなどが必要になり少し手間がかかりますが、手間をかけた分のメリットは十分あるかと思います。今回はERCN解説の最後としてカスタマイズの設定方法やOpenJMSの自動起動についてご紹介いたします。ERCNのカスタマイズPropertiesファイルによりERCNの挙動をカスタマイズすることができます。ERCNのプロジェクト内にPropertiesファイルのサンプルがありますので、こちらをもとに解説していきましょう。・サンプルファイルERChangeNotificationJMS/Documentation/SampleProperties.txt◇serverHostNameまずは”serverHostName”です。このパラメータを指定することで別サーバ上で稼働しているOpenJMSに接続することができます。デフォルトではlocalhostとなっているところをOpenJMSが稼働しているサーバに書き換えてください。これでアプリケーションサーバとは別マシンでJMSサーバを運用することができるようになります。WONDER2.0のERCNではもしJMSサーバへの接続が失敗した場合には、再接続処理をおこなうなど安定性を向上する機能が追加されています。localhost◇entitiesNotToSynchronizeERCNを使用するとデフォルトではすべてのEOの変更に対してJMS経由での同期処理がおこなわれますが、この”entitiesNotToSynchronize”パラメータを指定することにより特定のEntityのEOを同期処理の対象から外すことができます。EntityのEOを同期の対象から外すことができます。変更される機会が少ないEntityなどは処理対象から外しておけばEOの同期処理にかかる負荷を下げることができます。(TalentPhoto)◇changeTypesToTrackERCNがEOの同期をおこなうタイミングは、EOの追加/変更/削除の3つがありデフォルトではすべてのタイミングで同期処理が実行されます。*注1”changeTypesToTrack”を設定することにより同期処理を実行するタイミングを指定することができます。deleted)*注1ERCNが実際にEOの同期をおこなうのは「変更」の場合のみです。追加/削除のタイミングではフレームワーク側で同期処理はおこなわれません。追加/削除のタイミングで処理をおこなう場合はアプリケーション側での対応が必要になり、具体的にはERCNSubscriberDelegateインターフェースを用いて追加/削除時に処理をおこなうクラスを作成し、ERCNSubscriberのsetDelegate()メソッドを用いてセットしておく必要があります。OpenJMSの自動起動ERCNを使用した場合、アプリケーションの起動時にJMSサーバへの接続がおこなわれます。アプリケーションの起動時にはあらかじめJMSサーバが起動している必要があります。そこでシステム起動時にOpenJMSを起動するためのスクリプトがあらかじめ用意されています。WONDERのソースに収録)ERChangeNotificationJMS/Support/StartupItemsMacOSX/OpenJMS/Library/StartupItems/に、StartupItemsMacOSXフォルダ内にあるOpenJMSフォルダをコピーしてください。これでシステム起動時にOpenJMSが自動起動するようになります。実際にOpenJMSを起動させている起動スクリプトはOpenJMS/OpenJMSになりますが、うまく動作しない場合はパーミッションの実行権限が与えられているかを確認してください.*注2起動スクリプトはopenjms-0.7.6.1に対応していません。対応するためには以下のように起動と停止のコマンドを書き換えてください。$OPENJMS_HOME/config/$CONFIG_FILEさて、これまで3回にわたってERCNの解説をおこなってきましたがいかがでしたでしょうか。ERCNはもともとOpenJMSを利用して開発されていますが、JMSはJavaの仕様であり、OpenJMS以外にもJMSを実装したプロダクトは存在しますので、他のJMSサーバを利用することも可能です。マルチインスタンスでの運用をおこなうには、あらかじめEOの同期が適切におこなわれるような設計でアプリケーションを開発しておく必要がありますが、このERCNを用いれば、アプリケーション側のコードを変更することなくインスタンス間でのEO同期が実現できますので非常に強力です。お知らせWebObjectsの運用管理トレーニングがスタートします。詳しくは次のURLを参照してください。10.3より可能になった、カーネルコアのダンプを他のサーバマシンに転送する機能の使い方を紹介した文書が公開されている。カーネルで問題が発生した場合には、コアダンプを検討して問題点を突き止めると言った作業が行われる。あるコンピュータで設定を行えば、カーネルパニックのときなどにコアダンプを他のホストに送付する機能が働く、受け取る側でも設定を行っておけば、ダンプをサーバで受け取るということができる。これらの機能を可能にするための設定と、コアダンプを見ながらのデバッグについての解説がある。X向けのパッケージが公開されている。1.3ベースで稼働するものをビルドしてパッケージにしている。Module」で、Ver.5.0.1のパッケージを配布しているが、フォーラムの書き込みもチェックしておいた方がいいだろう。PHP5では、オブジェクト指向プログラミングの機能が充実し、SQLiteが組み込まれるといった変化がある。PHP4からの変更点が大きいため、多くのサイトはしばらくは以前のバージョンを使い続ける事になる模様だ。OSは米国アップルコンピュータ社の登録商標です。そのほかの各製品名等はそれぞれ各社の商標ならびに登録商標です。このメールの再配信、および掲載された記事の無断転載を禁じます。Artistsアクセスリンクについて個人情報の取り扱いについて支援のお願いお問い合せこのサイトに掲載されている文章、画像を含む一切のデータの無断転載を禁止します。