MOSA Multi-OS Software Artists

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

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

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

2009-04-21

目次

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

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

〜「Deployment」編〜

 Xserveがモデルチェンジしました。前回のモデルが発表されたのが2008年の1月ですから、1年と数ヶ月でのモデルチェンジとなります。今回の目玉はCPUにIntelのNehalemが搭載されパフォーマンスが向上していることですが、ほかにもオプションでSSDが選択できるなどの特徴があります。ハードディスクはこれまでと同様3基搭載できますが、SSDはこれとは別に追加することができ、SSDにOSをインストールして起動ボリュームとして使用することができます。
また、サーバ管理ツールの最新版もリリースされています。

・ニュースリリース
http://www.apple.com/jp/news/2009/apr/07xserve.html
・Server Admin Tools 10.5.6v1.1
http://support.apple.com/downloads/Server_Admin_Tools_10_5_6v1_1

◇NetBoot/NetInstallの準備
 それでは本題に戻りまして、今回からNetBoot/NetInstallの具体的な設定方法について解説していきます。まず全体的な流れですが、次のようになります。

1. システムの準備
2. システムイメージの作成
3. DHCPのセットアップ
4. NetBootサービスの設定
5. クライアントコンピュータの設定

 実際にはシステムの設計や設定後の検証なども必要になります。システムの規模によっても作業の内容は異なってきますが、まずはサーバ1台、クライアント1台という最小限の環境を想定して話を進めていきたいと思います。

◇システムの準備
 システムを構築するのに必要な機材を揃えて、個々の機材が動作条件を満たしているかを確認します。最小構成のNetBootシステムを構築するにはサーバおよびクライアントコンピュータとそれらを接続するネットワークが必要になります。
 まずクライアントコンピュータですが、次の条件を満たしている必要があります。

クライアントコンピュータの動作条件
・PowerPC G4またはG5ベースのMac
・IntelベースのMac

 つまり、これは10.5が動作するためのシステム条件と同じです。NetBootは10.4以前から存在したサービスなのですが、10.5では10.5のシステムイメージしか作成できなくなりましたので、この場合クライアントの動作条件も10.5の動作条件を満たす必要があるということです。10.4のシステムイメージを作成する方法もあるのですが、これには10.4の環境が必要になりますのでここでは説明を省略します。
 またファームウェアは最新のものを使用し、メモリは最低512MB必要となっています。

 次にネットワークの環境ですが、お勧めの環境はギガビットのスイッチです。マニュアルを読むとクライアントが50台より多い場合はギガビット、50台以下の場合は100-Mbitとなっているのですが、ネットワークはなるべく速い環境を用意しましょう。
 NetBootとNetInstallとではネットワークの使用状況が違いますが、どちらもより高速なネットワークのほうが快適に使用できます。

 最後にサーバですが、サーバのハードディスクの残り容量には注意しましょう。クライアント用のシステムイメージをサーバ上に保存することになりますし、場合によってはイメージを複数使用する場合もあります。さらに、NetBootの場合にはシャドウファイルと呼ばれるデータをサーバ上に保存する場合もあります。具体的に必要となるディスク容量はシステムによっても異なってきま
すので、事前に検証を行ってシステムに応じた必要なディスク容量を確認しておきましょう。例えば、空き容量が10GB程度しかない場合はディスクを増設するなどサーバ構成を再検討したほうがよいでしょう。
 またNetBootサービスはかなり負荷のかかるサービスですので、NetBootサーバではなるべく他のサービスは使用しないほうがよいです。Open Directoryやファイルサービスなど他のサービスは別サーバを用意して提供するようにしましょう。

◇システムイメージの作成
 クライアントコンピュータ用のシステムイメージの作成です。クライアントで使用するシステムをディスクイメージとしてサーバ上に作成します。NetBootとNetInstallとで少し作業手順は異なってきますが、どちらもサーバ管理ツールに含まれている「システムイメージユーティリティ」を使用します。
 システムイメージを作成するときにまず注意が必要なのは、システムのバージョンです。基本的には最新版のシステムを使用するようにしましょう。なぜならば最新の機種は最新のシステムが必要になるからです。10.5がリリースされた時点で出荷されていたMacであればシステム条件さえ満たしていれば10.5.0で起動はできますが、それ以降にリリースされた機種では10.5.0以降のシステムでないと起動できない場合があります。
 それでは次回はシステムイメージの作成方法の続きを解説します。
次回へつづく

                             

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

〜 画像の矩形サイズを調整する 〜

今回は、ファイルから読み込んだ画像データのサイズ(幅と高さ)を変更する処理を考えてみます。オリジナルの大サイズ画像をメモリーに常駐させておいては、iPhoneのメモリーがいくらあっても足りません。特定のケースではサムネイルサイズに縮小して利用します。

ところで、iPhoneのDocumentsフォルダ (ディレクトリ)にちゃんと画像ファイルが保存されたかどうかを確認したい場合があります。もしくは、不必要になった画像ファイルを削除した時なども、それが本当に実行されているか不安です。通常では、iPhone自体のディレクトリの内容をのぞき見ることはできませんが、シミュレータの方であれば、その内容を確認することが可能です。シミュレータが管理しているアプリケーション固有のホームディレクトリは、以下のパスに設定されています。

User Home/ライブラリ/Application Support/iPhone Simulator/User/Applications/

このパスの下に「1F96CDFA-7EEA-4A1F-B63E-C22E8F825A50」などと暗号(?)のような名称が付いたフォルダが作成されますが、それがシミュレータが管理しているiPhoneアプリケーションのホームディレクトリです。このフォルダ名ですが、XcodeでMakeを実行し、シミュレータ上でアプリケーションを起動する度に逐次変更されます。ご注意ください。

この名称では何が何だか判断できませんが、作成日付(最新)をヒントにし、確認すべきターゲット・アプリのフォルダを見つけ出します。このフォルダ内に「Documents」というフォルダが作成されて、その中にアプリケーションから保存した画像ファイルなどが置かれることになります。iPhone側でも同様な階層構造でファイル管理されているので、よほどのことがないかぎりは、このフォルダ内容をチェックすることで、ファイル操作の正確さを確認することが可能となります。

さて、iPhoneアプリケーションで画像を取り扱う場合には、Quartz2DフレームワークのCGImageRefか、UIKitフレームワークのUIImageクラスを使います。処理内容によっては、UIImageよりCGImageRefを用いた方が便利(もしくは高速)な場合もあります。今回は、せっかくですので両方(CGImageRefとUIImage)を対象とした画像の縮小処理を考察してみます。まずは、CGImageRefの方です。

CGImageRef resizeCGImage( int type,CGImageRef simg,CGFloat width,
                                                       CGFloat height )

{
   CGRect          srt,frt,drt;
   void            *bitmapData;
   CGImageRef      dimg=NULL;
   CGFloat         ww,hh;
   CGContextRef    ctx;

   ww=(CGFloat)CGImageGetWidth( simg );  //  画像の幅を得る
   hh=(CGFloat)CGImageGetHeight( simg );  //  画像の高さを得る
   srt=CGRectMake( 0.0,0.0,ww,hh );
   frt=CGRectMake( 0.0,0.0,width,height );
   fitBounds( 1,&frt,&srt,&drt );  //  矩形の縦横比を合わせる自作ルーチン
   if( type==0 )  //  画像と同じ縦横比
   {
       drt.origin.x=drt.origin.y=0.0;
       ctx=createBitmapContext( drt.size.width,drt.size.height );
   }
   else  //  widthとheightと同じサイズ(背景の余白は白色)
       ctx=createBitmapContext( width,height );
   if( ctx )  //  オフスクリーン用CGContextRefが得られたか?
   {
       CGContextDrawImage( ctx,drt,simg );        //  オリジナル画像を描画
       dimg=CGBitmapContextCreateImage( ctx );  //  CGImageRefを得る
       if( bitmapData=CGBitmapContextGetData( ctx ) )  //  使用メモリを解放
           free( bitmapData );
       CGContextRelease( ctx );  //  CGImageRefを解放 
   }
   return dimg;
}


縮小させるオリジナルの画像は引数のsimgで与えられます。引数のwidthとheightは、縮小後の(拡大でもOK)幅と高さピクセル数で与えます。引数のtypeがゼロであればオリジナルの縦横比を保持してリサイズすることで背景を作りません。typeが1であれば、リサイズ方法はtypeがゼロの場合と同じですが、フレームの幅と高さは指定通りとなり背景を残します。

fitBounds()は、srt(オリジナル画像の矩形)をfrt(描画先矩形)に合わせて拡大縮小させたdrt(描画矩形)を得るための自作ルーチンです。そして、createBitmapContext()ルーチンで、オフスクリーン用のCGContextRefを作成し、そこへオリジナル画像を描画します。最後に、そこから目的のCGImageRef(縮小した画像)を得ます。オフスクリーンとして確保したCGContextRefは、それ自体をCGContextRelease()で解放するだけではなく、そこに使用していたメモリ領域もfree()で解放することを忘れないでください。

以下は、オフスクリーン用のCGContextRefを作成するcreateBitmapContext()ルーチンです。

CGContextRef createBitmapContext ( int pixelsWide,int pixelsHigh )
{
   CGContextRef      bitmapContext=NULL;
   void              *bitmapData;
   CGColorSpaceRef   colorSpace;

   if( bitmapData=calloc( 1,pixelsWide*pixelsHigh*4 ) )  //  画像用メモリ確保
   {
       colorSpace=CGColorSpaceCreateDeviceRGB();  //  カラースペースを設定
       bitmapContext=CGBitmapContextCreate( bitmapData,pixelsWide,
       pixelsHigh,8,pixelsWide*4,colorSpace,kCGImageAlphaPremultipliedLast );
       if( ! bitmapContext ) )    //  オフスクリーン用CGContextRef作成
           free( bitmapData );  //  失敗した場合にはメモリを解放する
       CGColorSpaceRelease( colorSpace );
   }
   return bitmapContext;
}


今回の処理で利用しているAPIの詳細については、Quartz2D関連のヘッダーファイルCGBitmapContext.h 、CGGeometry.h、CGImage.hなどを参照してみてください。続いて、UIImageクラスを利用した画像の縮小処理です。

UIImage *resizeUIImage( int type,UIImage *simg,CGFloat width,CGFloat height )
{
   CGRect    srt,frt,drt;
   UIImage   *dimg;
   CGSize    size;

   srt=CGRectMake( 0.0,0.0,simg.size.width,simg.size.height );
   frt=CGRectMake( 0.0,0.0,width,height );
   fitBounds( 1,&frt,&srt,&drt );  //  矩形の縦横比を合わせる自作ルーチン
   if( type==0 )       //      画像と同じ縦横比    
       UIGraphicsBeginImageContext( drt.size );  //  オフスクリーンContext作成
   else  //  widthとheightと同じサイズ(背景の余白は白色)
   {
       size.width=width;
       size.height=height;
       UIGraphicsBeginImageContext( size );
   }
   [simg drawInRect:drt];   //  画像の描画(UIImageクラスのメソッド)
   dimg=UIGraphicsGetImageFromCurrentImageContext();   //  UIImage作成 
   UIGraphicsEndImageContext();  //  オフスクリーンContext解放
   return dimg;
}


こちらでは、先ほどのcreateBitmapContext()ルーチンの役割をUIGraphics.hに定義されているUIGraphicsBeginImageContext()ルーチン(メソッドではない)が担います。描画後にUIImageを作成するのは、UIGraphicsGetImageFromCurrentImageContext()です。また、不必要となったImageContextは、UIGraphicsEndImageContext()で解放します。UIGraphics.hには、今回紹介したような便利なCルーチンが多数定義されていますので、ぜひ一度参照してみてください。

iPhone OS 3.0でコピー&ペーストにより画像を別アプリケーションから持ってくることが可能になりました。しかし、iPhone OS 2.2ではまだそうした操作はできません。主な画像の入手方法は、iPhoneの写真ライブラリから画像を得るか、そのアプリから写真撮影するかです。次回は、そうした操作の実装を考えてみます。

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

〜 リモートでシェルを使う(1) 〜

 MOSAメンバーの中にも、安くて気軽なレンタルサーバを利用している方は多いのではないでしょうか? 今回は、レンタルサーバの管理に欠かせない「ssh」の使い方を解説します。

・sshとは
 ssh(Sechure SHell)とは、ネットワーク経由で他のマシンに接続し、コマンドを実行して遠隔操作を行うためのプロトコルです。その名が示すとおりセキュアな性質を持ち、ネットワーク上を流れるデータは公開鍵暗号方式で保護されます。リモートホストを安全に操るための実装系、と言ってもいいでしょう。
 同名のコマンド「ssh」は、このプロトコルに対応したクライアントです(以降、混同を避けるためプロトコルを指す場合「SSH」と表記)。リモートのサーバ(SSHサーバ)に接続し、指定されたコマンドを実行するか、リモートシステム上でシェルの機能を利用するために利用されます。冒頭に挙げたレンタルサーバの場合、ファイル操作などの処理を行うためには連続して複数のコマンドを実行するはずで、後者の役割が期待されているとも言えます。
 SSH登場以前のUNIXでは、rsh(リモートでのコマンドの実行/シェルの起動)とrlogin(リモートホストへのログイン)、そしてtelnet(ベーシックなネットワークログイン)が多く利用されていました。しかしいずれもセキュリティ上の問題があり、特にtelnetは平文がネットワーク上を流れることから敬遠され、デフォルトで1,024bitの暗号鍵が使用されるSSHが急速に普及しまし
た。Mac OS Xでも、v10.1以降「リモートログイン」にSSHが採用されています。
 ちなみに、ssh以外にもscpやsftpといった「s」から始まるコマンドが収録されていますが、これらはSSHに対応したセキュアな通信を実現します。コマンド名から推測できるように、scpはrcpの、sftpはftpの代替であり、ファイルの安全な転送に役立ちます。

・sshの使い方
 前置きが長くなりましたが、クライアントとしてのsshをいう場合、「(レンタルサーバなどの)サーバでシェルの機能を利用するためのコマンド」を意味します。直接的には、前述したrshコマンドのSSH対応版ですが、loginコマンドとしての機能も備えている(sloginコマンドも用意されているが、実体はsshコマンドのシンボリックリンク)ため、ログインもできます。もちろん、「リモートログイン」を有効にしたMacへのログインにも使えます。
 典型的な使い方ですが、以下に示すとおり引数に「サーバのユーザ名@サーバのアドレス」を与え、コマンドを実行します。初めてログインを試みる場合は、サーバの鍵をクライアント(つまりMac)に作成するためyes/noで確認されるので、「yes」と答えます。あとは、サーバのパスワードを入力すれば、リモートへのログインは完了です。

- - - - -
$ ssh daresore@abc.dokka.com
The authenticity of host 'abc.dokka.com (123.45.44.111)' can't be established.
RSA key fingerprint is a4:f5:91:b3:c2:25:84:d8:ea:28:bb:46:c9:a5:de:2f.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'dokka.com' (RSA) to the list of known hosts.
daresore@abc.dokka.com's password: 
Last login: Mon Apr 20 13:34:41 2009 from shiranai.ne.jp

daresore@abc:~>
- - - - -


・最初に確認すること
 ログインが完了すれば、そこから先はサーバ上の世界です。ふだん利用しているTerminalとはプロンプトが異なるでしょうし、利用できるコマンドにも差があります。当然、サーバのリソースを使用してコマンドが実行されるため(MacのTerminalには結果が表示されるだけ)、処理能力に差があるかもしれません。
 ともあれ、最初に行うべきは動作しているシェルの確認です。レンタルサーバの場合、ログイン直後に起動されるシェル(デフォルトシェル)は企業/サーバによりまちまちで、bashだったりcshだったり、あるいは機能制限付きのシェルだったりしますから、面倒がらずに以下のコマンドを実行しましょう。気に入らなければ、chshコマンドで他のシェルに変更できます(利用するサービスによってはできないかもしれません)。

- - - - -
~> echo $SHELL
/bin/bash
- - - - -


 契約時に確認済とは思いますが、サーバのOSも確認しておくべきです。商用ベースのサーバはLinuxとFreeBSDが多く採用されていますから、unameコマンドは収録されているはずなので、以下のとおりunameコマンドを実行すればOKです。ここではOSがLinux、カーネルのバージョンが2.6.23.16-smpで、マシンのCPUアーキテクチャはi686だということがわかります。

- - - - -
~> uname -a
Linux abc 2.6.23.16-smp #2 SMP Sat Feb 16 04:28:23 JST 2008 i686 GNU/Linux
- - - - -


 次回は、scpコマンドを利用したファイル転送について解説する予定です。

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