<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
   <title>Xillion Script Tips</title>
   <link rel="alternate" type="text/html" href="http://www.xillion.net/script/" />
   <link rel="self" type="application/atom+xml" href="http://www.xillion.net/script/atom.xml" />
   <id>tag:www.xillion.net,2009:/script//2</id>
   <updated>2009-03-21T08:26:01Z</updated>
   
   <generator uri="http://www.sixapart.com/movabletype/">Movable Type 3.34</generator>

<entry>
   <title>CoreAnimationMenuを試してみる　その１</title>
   <link rel="alternate" type="text/html" href="http://www.xillion.net/script/2009/03/coreanimationmenu.html" />
   <id>tag:www.xillion.net,2009:/script//2.315</id>
   
   <published>2009-03-21T07:33:13Z</published>
   <updated>2009-03-21T08:26:01Z</updated>
   
   <summary>アニメーションを使用したメニューを作成してみましょう。 ADCに動かないサンプル...</summary>
   <author>
      <name></name>
      
   </author>
         <category term="1.Xcode" scheme="http://www.sixapart.com/ns/types#category" />
   
   
   <content type="html" xml:lang="ja" xml:base="http://www.xillion.net/script/">
      <![CDATA[アニメーションを使用したメニューを作成してみましょう。

ADCに動かないサンプルがあります。
<a target=_blank href="http://developer.apple.com/jp/documentation/Cocoa/Conceptual/CoreAnimation_guide/Articles/Headstart.htm">http://developer.apple.com/jp/documentation/Cocoa/Conceptual/CoreAnimation_guide/Articles/Headstart.htm</a>l
このページのサンプルは問題が多いのでちょっとおいておきます。

木下さんのマイコミの記事が秀逸です。
ここでCoreAnimationをお勉強しましょう。
<a href="http://journal.mycom.co.jp/special/2007/coreanimation/index.html">http://journal.mycom.co.jp/special/2007/coreanimation/index.html</a>

ポイント
・アニメーションの単位はレイヤです
・レイヤは画像や文字や映像を保持することができます
・レイヤは名前のとおり階層化が可能で、複数のレイヤを同時に動かすことができます
・レイヤはNSViewに描画します
ということで、レイヤとはアニメのセル画みたいなものです。
背景のセル画を作成して、そこにキャラクタのセル画を重ねあわせて、少しずつキャラクタのセル画を動かせばアニメーションが完成します。

]]>
      
   </content>
</entry>
<entry>
   <title>Coolirisのphotos.rssを作成する</title>
   <link rel="alternate" type="text/html" href="http://www.xillion.net/script/2009/01/coolirisphotosrss.html" />
   <id>tag:www.xillion.net,2009:/script//2.308</id>
   
   <published>2009-01-02T01:21:32Z</published>
   <updated>2009-01-02T02:51:50Z</updated>
   
   <summary>自分のサイトにCoolirisを導入する方法が、本家にかいてあります。 http...</summary>
   <author>
      <name></name>
      
   </author>
         <category term="2.AppleScript" scheme="http://www.sixapart.com/ns/types#category" />
   
   
   <content type="html" xml:lang="ja" xml:base="http://www.xillion.net/script/">
      <![CDATA[自分のサイトにCoolirisを導入する方法が、本家にかいてあります。
<a href="http://developer.cooliris.com/?p=full" target="_blank">http://developer.cooliris.com/?p=full</a>
3DWallをカスタマイズできるのです。

同サイトのPicLens Publisherをつかってみましょう。
簡単にアップできますね。
でも、追加したいときはどうするのでしょう？
毎回全部生成していたのでは時間の無駄ですね。

そこで、photos.rssのitemダグとサムネイルを作成するツールを作ってみました。
似非PicLens Publisherです。
基盤はautomator + applescriptです。

automatorのフローは以下のとおり。
1.選択されたfinder項目を取得
2.新規フォルダ（デスクトップにthumbsを作成）
3.フォルダの内容を取得
4.イメージサイズを調整(250ピクセル)
5.AppleScriptを実行
6.クリップボードの内容を取得
7.新規テキストエデッィト書類

新規テキストファイルにitemタグか書かれるので、自分のサイトのphotos.rssに追加すればOKです。
元画像、サムネイルもそれぞれアップしてください。

<a href="http://www.xillion.net/download/似非PicLensPublisher.workflow.zip" target="_blank">似非PicLensPublisherワークフローをダウンロード</a>
※automatorのバージョンは2.0.2です
※automator中のapplescriptの注意
　リンク先はhttp://www.xillion.net/xxxxxxxxxxxxxx（絶対パス）
　イメージフォルダはルートのimgフォルダ（相対パス）、
　サムネイルはルートのthumbsフォルダ（相対パス）でかいていますので、適宜修正してください。
　guidタグもPicLens Publisherにならって付けています。
ワークフローは使いやすい用にカスタマイズしてください。

以下applescriptの説明です。
<a href="http://www.xillion.net/img/20090102snap001.png" class="highslide" onclick="return hs.expand(this,{captionId: '20090102snap001.png' } )" style="text-decoration:none" onmouseover="this.style.background=' #ffff88 '" onmouseout="this.style.background='#ffffee'"><img src="http://www.xillion.net/img/tn/20090102snap001.png" /></a><div class='highslide-caption' id='20090102snap001.png'></div>
ワークフローにapplescriptを埋め込むことができます。
Automatorのライブラリからapplescriptを実行という項目を選んでフローに追加します。
すると、右のペインに下のようなスクリプトが埋め込まれます。
<div class=code>
on run {input, parameters}
	
	(* Your script goes here *)
	
	return input
end run
</div>
on run句の中にスクリプトを書く訳ですが、inputとして項目がわたってきます。
今回は各選択項目のrssのitem項目を作りたいので、repeat withで項目の数だけループをさせています。




]]>
      
   </content>
</entry>
<entry>
   <title>applescriptガイド</title>
   <link rel="alternate" type="text/html" href="http://www.xillion.net/script/2008/04/applescript_3.html" />
   <id>tag:www.xillion.net,2008:/script//2.304</id>
   
   <published>2008-04-05T06:13:16Z</published>
   <updated>2008-04-05T06:16:55Z</updated>
   
   <summary>AppleScript Language GuideがOSX10.5に対応して新...</summary>
   <author>
      <name></name>
      
   </author>
         <category term="2.AppleScript" scheme="http://www.sixapart.com/ns/types#category" />
   
   
   <content type="html" xml:lang="ja" xml:base="http://www.xillion.net/script/">
      <![CDATA[<a target="_blank" href="http://developer.apple.com/documentation/AppleScript/Conceptual/AppleScriptLangGuide/introduction/ASLR_intro.html">AppleScript Language Guide</a>がOSX10.5に対応して新しくなっています。全体を刷新していて、わかりやすい構成になっているようです。英語は苦手なのでよくからず、Fundamentalsぐらいまでしか読んでいませんが。。]]>
      
   </content>
</entry>
<entry>
   <title>Cocoaはじめの一歩＋α　練習問題7〜12</title>
   <link rel="alternate" type="text/html" href="http://www.xillion.net/script/2008/03/cocoa712.html" />
   <id>tag:www.xillion.net,2008:/script//2.300</id>
   
   <published>2008-03-28T13:30:25Z</published>
   <updated>2008-03-28T14:41:30Z</updated>
   
   <summary>Cocoaはじめの一歩というサイトの歩き方です。 Cocoaはじめの一歩にある練...</summary>
   <author>
      <name></name>
      
   </author>
         <category term="1.Xcode" scheme="http://www.sixapart.com/ns/types#category" />
   
   
   <content type="html" xml:lang="ja" xml:base="http://www.xillion.net/script/">
      <![CDATA[Cocoaはじめの一歩というサイトの歩き方です。
Cocoaはじめの一歩にある練習問題を通じでXcodeとobjective-Cになじもうとする企画です。

今回は残りの問題をすべてやってしまいましょう。
<a href="http://homepage.mac.com/nsekine/SYW/SYWSoft/learnCocoa/exercise7.html">練習問題7</a>はイメージファイルをIBで扱う方法
<a href="http://homepage.mac.com/nsekine/SYW/SYWSoft/learnCocoa/exercise8.html">練習問題8</a>はインスタンス変数の使用方法
<a href="http://homepage.mac.com/nsekine/SYW/SYWSoft/learnCocoa/exercise8.html">練習問題8</a>は環境設定ファイルの使用方法
<a href="http://homepage.mac.com/nsekine/SYW/SYWSoft/learnCocoa/exercise10.html">練習問題10</a>はローカライズ
<a href="http://homepage.mac.com/nsekine/SYW/SYWSoft/learnCocoa/exercise11.html">練習問題11</a>はアイコン作成
<a href="http://homepage.mac.com/nsekine/SYW/SYWSoft/learnCocoa/exercise12.html">練習問題12</a>はデバッグ方法

ということですが、xillionオリジナルアプリ1919361でほとんどの項目が経験済みですね。。
ということで、課題を以下の２つに絞ります。

1.バインディングによるコントロール
2.環境設定ファイルの使用

えっ問題がかわってるって？気にしないで自分のやりたいことをやりましょう。
もうそんな年頃ですから。

バインディングはADCのCocoaセミナービデオで覚えましょう。
<a target="_blank" href="http://developer.apple.com/jp/documentation/japanese.html">http://developer.apple.com/jp/documentation/japanese.html</a>

今回のアプリに取り込むバインディングは以下のとおり

身長インスタンス変数　←→　身長テキストフィールド　
身長インスタンス変数　←→　身長スライダ　
このチャート（？）は、身長インスタンス変数を介して、テキストフィールドとスライダの同期がとられることを意味します。
ユーザーが身長テキストの入力すると、身長インスタンス変数を変化させ、それに伴って身長スライダも同調します。ユーザーがスライダを動かした場合は、身長テキストフィールドがシンクロします。

体重インスタンス変数　←→　体重テキストフィールド　
体重インスタンス変数　←→　体重スライダ　
体重についても同様で、テキストとスライダが同期をとって変化します。

身長インスタンス変数・体重インスタンス変数　→ BMI計算
BMIインスタンス変数　　→　BMIテキストフィールド　
BMIインスタンス変数　　→　BMIインジケータ　
BMIインジケータ　→　体重計算
この矢印はちょこっとフクザツです。中心となるのはBMIインスタンス変数。身長か体重が変化したときに再計算します。そのBMIインスタンス変数を介して、BMI用のテキストとインジケータが変化します。インジケータの値を変更した場合は、体重を変化させます。因にBMIテキストフィールドは表示のみでユーザーが入力できないフィールドです。詳しくは解答で。

環境設定はuserdefaultsオブジェクトを使用します。
練習問題8のとおり、前回修了時の値を覚えておいて、次回の初期値として表示させる様にしましょう

インタフェイスはこんな感じ。
スペースがあまったのでBMIの説明をいれちゃいました。
<img src="http://www.xillion.net/img/ex7_01.png"> 


<a href="http://www.xillion.net/download/Exercise7.zip">Exercise7.zip</a>

<a href="#" onclick="return hs.htmlExpand(this, { contentId: 'ex0' } )"  class="highslide" >解答です。IB部分。</a>
<div class="highslide-html-content" id="ex0" >
<div class="highslide-header"><ul><li class="highslide-move"><a href="#" onclick="return false">Move</a></li><li class="highslide-close"><a href="#" onclick="return hs.close(this)">Close</a><li></ul></div>
<div class="highslide-body" ><div align="left">
IBでの作業はこんな感じです。
・ウィンドウにローラーを配置します。
　スライダやレベルインジケータは上限、加減、警告レベルや見た目の設定を行います。
・コントローラークラスを作成しインスタンス化します（MAbmiController）
・バインドキーの管理用にNSObjectControllerをインスタンス化します（バインドの詳細は下記）
・MAbmiControllerをアプリケーションのデリゲートとします。

バインディング設定の詳細です。
まず、コントロールパレットからMainMenu.nibのインスタンスにNSObjectControllerをドラッグ＆ドロップします。
NSObjectControllerのインスタンスが作成されるので、インスペクタのattributesを表示させます。
ここにバインドで使用する以下のキーを追加していきます。
height（身長テキストフィールドと身長スライダにバインドします。heightはMAbmiControllerのインスタンス変数として実装します。）
weight（体重テキストフィールドと体重スライダにバインドします。weightはMAbmiControllerのインスタンス変数として実装します。）
bmi（BMIレベルインジケータにバインドします。bmiはMAbmiControllerのインスタンス変数として実装します。）
calculateBmi（BMIテキストフィールドにバインドします。calculateBmiはMAbmiControllerのメソッドとして実装します。）
calculateWeight（計算体重テキストフィールドにバインドします。calculateWeightはMAbmiControllerのメソッドとして実装します。ただしcalculateWeightは値を返さないメソッドのため計算体重テキストフィールドには何も表示されません。）
<img src="http://www.xillion.net/img/ex7_05.png">

コントロールとのバインド方法は以下の通り。
コントロールのインスペクタを開き、bindのページを表示させます。（コントロールを選択して⌘+4キー）
valueの三角をクリックして詳細を表示させます。
Bind toのセレクタで、今作成したNSObjectControllerを選択します。
Cotroller Keyはselection、Model Key Pathに、先ほど追加したキーから適当なものを選びます。
<img src="http://www.xillion.net/img/ex7_04.png">

最後にcontrollerインスタンスとNSObjectControllerを接続します。
接続先はNSObjectControllerのデフォルトのoutletにある"content"です。

バインドで表示の制御を行うものについてはcontrollerのoutletは不要です。
アプリからキーへのセットを行うことで、その値が表示されます。

ところが今回のアプリではちょっと厄介なことが発生してしまいました。
1.体重スライダを調節（＝値を変える）　
→2.この値をMAbimControllerのインスタンス変数weightにバインド　
→3.変更をMAbimControllerのメソッドcalculateBMIに通知（＝実行）　
→4.calculateBMIでBMIを変更（setValue:forKey:）しBMIテキストフィールドとBMIレベルインジケータにバインド（＝表示）
とここまでは良いのですが、
BMIを変更（setValue:forKey:）するとメソッドcalculateWeightに通知（＝実行）されます。するとcalculateWeightがweightを変更（setValue:forKey:）し無限ループになってしまいます。
で4.のBMIの変更（setValue:forKey:）にかえて、BMIインジケータの値をセットすることにします。
このため、NSObjectControllerにBMIレベルインジケータのアウトレットを準備します。

</div><span class="highslide-footer"><span class="highslide-resize" title="Resize"></span></span>
</div></div>

<a href="#" onclick="return hs.htmlExpand(this, { contentId: 'ex1' } )"  class="highslide" >解答です。ソースコード（バインド）部分です。</a>
<div class="highslide-html-content" id="ex1" ><div class="highslide-header"><ul><li class="highslide-move"><a href="#" onclick="return false">Move</a></li><li class="highslide-close"><a href="#" onclick="return hs.close(this)">Close</a><li></ul></div>
<div class="highslide-body" ><div align="left">

MAbmiController.hです。
OutletはbmiLevelIndicatorのみ。その他のコントロールはバインドします。
インスタンス変数を公開します。
バインドキーとなるインスタンス変数は、ヘッダーに記述しなければなりません。
バインドするメソッドはヘッダーになくても大丈夫でした。
<div class=code>
@interface MAbmiController : NSObject
{
&nbsp;&nbsp;IBOutlet NSLevelIndicator *bmiLevelIndicator;
&nbsp;&nbsp;float height;
&nbsp;&nbsp;float weight;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;float bmi;
}
@end
</div>

次はMAbmiController.mです。
<div class=code>
+ (void)initialize {&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;[self setKeys:[NSArray arrayWithObjects:@"height", @"weight", nil]
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;triggerChangeNotificationsForDependentKey:@"calculateBmi"];&nbsp;&nbsp;
&nbsp;&nbsp;[self setKeys:[NSArray arrayWithObjects:@"bmi", nil]
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;triggerChangeNotificationsForDependentKey:@"calculateWeight"];&nbsp;&nbsp;
}
</div>
クラスメソッッドの初期化でバインドキーの宣言をします。モノの本には依存キーの登録として書かれています。setKeys:triggerChangeNotificationsForDependentKey:メソッドを使用して、クラス内のキーの依存関係（バインド関係）を設定します。setKeys:に列挙されたプロパティが変更されると、triggerChangeNotificationsForDependentKey:に指定されたプロパティに変更通知が送られます。ということですが、通知はオブジェクトに送信されるのであってプロパティに送信するというのはヘンな気がしませんか。そもそもこの依存キーの登録はself＝自分のクラスに対して行っているし、、、ちょっと意味が分かりませんね。たぶんオブジェクト指向のメッセージングとは違うのでしょう。。。とりあえず、今回の例では、heightかweightが変わると、calculateBMIを実行するように設定しています。
triggerChangeNotificationsForDependentKey:にインスタンスメソッドを書いておくと、setKeys:で指定したプロパティが変化したときに、そのインスタンスメソッドを実行するようです。
同様に、bmiが変わったときはcalculateWeightを実行して体重を再計算するように設定します。


<div class=code>
-(void)calculateWeight {
&nbsp;&nbsp;[self setValue:[NSNumber numberWithFloat:bmi * height * height / 10000] forKey:@"weight"];
}

-(float)calculateBmi {
&nbsp;&nbsp;if (height ==0) return&nbsp;&nbsp;0 ; 
&nbsp;&nbsp;bmi =weight / (height / 100) / (height / 100);&nbsp;&nbsp;
&nbsp;&nbsp;[bmiLevelIndicator setFloatValue:bmi];
&nbsp;&nbsp;return bmi;
}
</div>
キーの依存関係から実施されるコードです。
calculateWeightでは、setValue:forKey:メソッドを使用してキー値の変更を行います。
calculateBmiでは無限ループをさけるため、普通にbmiを計算してから、bmiLevelIndicatorコントロールにセットしています。図らずも、キー値コーディングとそうでないものの違いがわかりますね。

<div class=code>
- (void)awakeFromNib
{
&nbsp;&nbsp;[self loadUserDefaults];
}

- (void)loadUserDefaults
{
&nbsp;&nbsp;NSUserDefaults&nbsp;&nbsp;*thisDefaults=[NSUserDefaults standardUserDefaults];
&nbsp;&nbsp;if([thisDefaults floatForKey:@"lastHeight"]) {&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;[self setValue:[NSNumber numberWithFloat:[thisDefaults floatForKey:@"lastHeight"]] forKey:@"height"];
&nbsp;&nbsp;}
&nbsp;&nbsp;if([thisDefaults floatForKey:@"lastWeight"]) {
&nbsp;&nbsp;&nbsp;&nbsp;[self setValue:[NSNumber numberWithFloat:[thisDefaults floatForKey:@"lastWeight"]] forKey:@"weight"];
&nbsp;&nbsp;}
&nbsp;&nbsp;if (weight &gt; 0) {
&nbsp;&nbsp;&nbsp;&nbsp;[self calculateBmi];
&nbsp;&nbsp;}&nbsp;&nbsp; 
}
</div>
</div><span class="highslide-footer"><span class="highslide-resize" title="Resize"></span></span>
</div></div>

<a href="#" onclick="return hs.htmlExpand(this, { contentId: 'ex2' } )"  class="highslide" >解答です。ソースコード（環境設定）部分です。</a>
<div class="highslide-html-content" id="ex2" ><div class="highslide-header"><ul><li class="highslide-move"><a href="#" onclick="return false">Move</a></li><li class="highslide-close"><a href="#" onclick="return hs.close(this)">Close</a><li></ul></div>
<div class="highslide-body" ><div align="left">
環境設定（NSUserDefaults）の使い方です。
awakeFromNibでNSUserDefaultsを読み込みます。ここでは、自分のloadUserDefaultsメソッドを実行させるだけです。
loadUserDefaultsメソッドで環境設定のlastHeightを読み込み、その値をheightキーにセットします。
weightも同様です。
最後にcalculateBmiを実施します。
これで起動したときのウィンドウに前回修了時の値が表示されます。


<div class=code>
-(bool)applicationShouldTerminateAfterLastWindowClosed:(NSApplication *)theApplication
{
&nbsp;&nbsp;[self saveUserDefaults];
&nbsp;&nbsp;return YES;&nbsp;&nbsp;&nbsp;&nbsp;
}
- (void)saveUserDefaults
{
&nbsp;&nbsp;NSUserDefaults&nbsp;&nbsp;*thisDefaults=[NSUserDefaults standardUserDefaults];
&nbsp;&nbsp;[thisDefaults setFloat:height forKey:@"lastHeight"];
&nbsp;&nbsp;[thisDefaults setFloat:weight forKey:@"lastWeight"];
&nbsp;&nbsp;[thisDefaults synchronize];
}
</div>
最後に環境設定の保存です。
アプリケーションが終了するとき（最後のウィンドウが閉じられるとき）に、saveUserDefaultsメソッドを実行します。
saveUserDefaultsメソッドではheightを環境設定のlastHeightにweightをlastWeightにセットして、synchronize（保存）します。
実際、
<img src="http://www.xillion.net/img/ex07_10.png">
こんな感じで終わらせると、

<img src="http://www.xillion.net/img/ex07_11.png">
こんな風に保存されます。
環境設定は、下記のファイルとして保存されています。
Macintosh HD:Users:xillion:Library:Preferences:com.yourcompany.Exercise7.plist
（yourcompanyはご愛嬌です）

ファイルの制御がこんなに簡単にできるのですね。

</div><span class="highslide-footer"><span class="highslide-resize" title="Resize"></span></span>
</div>
]]>
      
   </content>
</entry>
<entry>
   <title>Cocoaはじめの一歩＋α　練習問題5と6</title>
   <link rel="alternate" type="text/html" href="http://www.xillion.net/script/2008/03/cocoa56.html" />
   <id>tag:www.xillion.net,2008:/script//2.297</id>
   
   <published>2008-03-09T13:57:22Z</published>
   <updated>2008-03-14T14:12:19Z</updated>
   
   <summary>Cocoaはじめの一歩というサイトの歩き方です。 Cocoaはじめの一歩にある練...</summary>
   <author>
      <name></name>
      
   </author>
         <category term="1.Xcode" scheme="http://www.sixapart.com/ns/types#category" />
   
   
   <content type="html" xml:lang="ja" xml:base="http://www.xillion.net/script/">
      <![CDATA[Cocoaはじめの一歩というサイトの歩き方です。
Cocoaはじめの一歩にある練習問題を通じでXcodeとobjective-Cになじもうとする企画です。

では<a target="_blank" href="http://homepage.mac.com/nsekine/SYW/SYWSoft/learnCocoa/exercise5.html">練習問題5</a>と<a target="_blank" href="http://homepage.mac.com/nsekine/SYW/SYWSoft/learnCocoa/exercise6.html">練習問題6</a>をやって見ましょう。

練習５は身長と体重からBMIを、身長から標準体重を、それぞれ求めるプログラムを作るのが目的です。さらに練習６としてウィンドウを閉じたときにアプリを終了させる仕組みを作りこみます。

BMIを調べてみると、BMIとはバイオマスインデックスの頭文字であることがわかります。いわゆるデブ度の指数です。最近はメタボ流行りでBMI以外の数値も使われていますね。なんだかんだで、BMIの算式の方は一般常識として知っている人も多いかもしれませんが、単位に気をつけてください。

xillionはこんなインターフェイスで作成しました。
<img src="http://www.xillion.net/img/ex5_1.png">

問題文にバインディングの話題がありますが、そのヘンは後々やっていくとして、ターゲット＆アクションアーキテクチャ（単なるボタンのアクションです）を使用しましょう。



<a href="#" onclick="return hs.htmlExpand(this, { contentId: 'ex0' } )"  class="highslide" >解答です。</a>
<div class="highslide-html-content" id="ex0" ><div class="highslide-header"><ul><li class="highslide-move"><a href="#" onclick="return false">Move</a></li><li class="highslide-close"><a href="#" onclick="return hs.close(this)">Close</a><li></ul></div>
<div class="highslide-body" ><div align="left">

<a href="http://www.xillion.net/download/Exercise5.zip">Exercise5.zip</a>

xillionはコントローラとデリゲートを分けてしまってますが、一つのインスタンスでOKです。
小数点２桁で表示させるためフォーマットを使用しています。
<div class=code>
  [ bmiField setStringValue: [ NSString stringWithFormat:@"%.2f",bmi ] ];
</div>
プログラムではなく、IBを使ってフォーマットを適用させることができます。
いろいろと探ってみてくださいね。
因に、C言語の簡単な例として、よくでてくるprintf関数を使ってみたところ、実行ログに表示するようです。

つぎに練習６です。
きっとawakeFromNibみたいなアプリケーションのメソッドがあるのでしょう。マニュアルをcloseとかshutdownとかterminateとかで調べてみましょう。xillionはapplicationShouldTerminateAfterLastWindowClosed:というNSApplicationのデリゲートメソッドを発見しました。読んで字のごとく、すべてのウィンドウが閉じたときにアプリを終了させるかどうかの指示ができます。ここでYESをリターンすると、アプリが終了します。



</div><span class="highslide-footer"><span class="highslide-resize" title="Resize"></span></span>
</div>

アプリとして不満が残るのは身長をメートルで入力させる部分でしょう。普通身長はcmを単位としたいですね。次の練習問題もBMIですから、そちらでがんばりましょう。


]]>
      
   </content>
</entry>
<entry>
   <title>Cocoaはじめの一歩＋α　練習問題4</title>
   <link rel="alternate" type="text/html" href="http://www.xillion.net/script/2008/03/cocoa4.html" />
   <id>tag:www.xillion.net,2008:/script//2.295</id>
   
   <published>2008-03-03T13:09:44Z</published>
   <updated>2008-03-08T11:31:22Z</updated>
   
   <summary>Cocoaはじめの一歩というサイトの歩き方です。 Cocoaはじめの一歩にある練...</summary>
   <author>
      <name></name>
      
   </author>
         <category term="1.Xcode" scheme="http://www.sixapart.com/ns/types#category" />
   
   
   <content type="html" xml:lang="ja" xml:base="http://www.xillion.net/script/">
      <![CDATA[Cocoaはじめの一歩というサイトの歩き方です。
Cocoaはじめの一歩にある練習問題を通じでXcodeとobjective-Cになじもうとする企画です。

では<a target="_blank" href="http://homepage.mac.com/nsekine/SYW/SYWSoft/learnCocoa/exercise4.html">練習問題4</a>をやって見ましょう。

この問題はアプリケーションの仕様を考える問題です。「春分の日の次の満月の後の最初の日曜日」（イースター）をいかにして計算するかがポイントです。いつもどおり自分で考えてみてください。

xillionはリストを使用する方法を考えつきました。
予めイースターの日をプログラムにもっていて、入力に応じて表示させます。
そうですね、ユーザーに日付を入力してもらい、次回のイースターを表示させましょう。

とすると、今回のプログラムでは日付の比較が必要そうです。
でも日付ってどうしましょう。
多分、cocoaにも日付型のデータタイプがある筈です。
NSDateと当てずっぽうでマニュアルをみたらクラスがありました。

比較の方法も書いてありますが、compare:メソッドのDiscussion（＝参考）をみると、NSDateは秒未満のコンペアもするようで、そこまでの精度が不要なら、NSCalendarDateが使えるとのこと。
（実際NSDateではうまく動きませんでしたし、単に不等号だけでもだめでした。入力値や配列を日付に変換するところで何かありそうです。）

ところが、NSCalendarDateのマニュアルをみても比較を行うメソッドがありません。
どうすれば良いのでしょう。
NSCalendarDateは比較のためのメソッドはありませんが年、月、日、時などの要素を取り出すことが可能です。
これで比較はできそうですね。

イースターのリスト（配列）を用意して、入力した日付と比べていき、はじめてイースターリストの日付が大きくなったところが、次のイースターとなります。


wikipwdiaをみていたら、イースターを求める算式が乗っていたので、こっちの機能も取り込んでしまいました。
（アプリとしてはちょっとヘンです。まあ練習ということで）
この算式中に剰余が登場しますが、Cでは剰余を計算する演算子は%です。

<a href="#" onclick="return hs.htmlExpand(this, { contentId: 'ex0' } )"  class="highslide" >解答です。</a>
<div class="highslide-html-content" id="ex0" ><div class="highslide-header"><ul><li class="highslide-move"><a href="#" onclick="return false">Move</a></li><li class="highslide-close"><a href="#" onclick="return hs.close(this)">Close</a><li></ul></div>
<div class="highslide-body" ><div align="left">

プログラムは次のイースターを取得するsearchEaster:アクションと、
その年のイースターを計算するcalcEaster:アクションです。
コメントを沢山いれたので解説はなしです。

<div class=code>
#import "MAEaster.h"
@implementation MAEaster
<font color="#800">- (IBAction)searchEaster:(id)sender</font>
{
&nbsp;&nbsp;<font color="#008">//入力日付を取得→inputDate
&nbsp;&nbsp; //dateWithNaturalLanguageString:メソッドを使用しているので"next year" などの入力も可能</font>
&nbsp;&nbsp;NSCalendarDate *inputDate = 
&nbsp;&nbsp;[NSCalendarDate dateWithNaturalLanguageString:[dateField stringValue]];
&nbsp;&nbsp;<font color="#008"> //Easterリスト、配列の最後はnil</font>
&nbsp;&nbsp;NSArray *easterday = [[[NSArray alloc] initWithObjects:
&nbsp;&nbsp;&nbsp;&nbsp;@"2007/4/8",
&nbsp;&nbsp;&nbsp;&nbsp;@"2008/3/23",
&nbsp;&nbsp;&nbsp;&nbsp;@"2009/4/12",
&nbsp;&nbsp;&nbsp;&nbsp;@"2010/4/4",
&nbsp;&nbsp;&nbsp;&nbsp;@"2011/4/24",
&nbsp;&nbsp;&nbsp;&nbsp;@"2012/4/8",
&nbsp;&nbsp;&nbsp;&nbsp;@"2013/3/31",
&nbsp;&nbsp;&nbsp;&nbsp;@"2014/4/20",
&nbsp;&nbsp;&nbsp;&nbsp;@"2015/4/5",
&nbsp;&nbsp;&nbsp;&nbsp;@"2016/3/27",
&nbsp;&nbsp;&nbsp;&nbsp;@"2017/4/16",
&nbsp;&nbsp;&nbsp;&nbsp;@"2018/4/1",
&nbsp;&nbsp;&nbsp;&nbsp;@"2019/4/21",
&nbsp;&nbsp;&nbsp;&nbsp;@"2020/4/12",
&nbsp;&nbsp;&nbsp;&nbsp;@"2021/4/4",
&nbsp;&nbsp;&nbsp;&nbsp;nil] autorelease] ; 
&nbsp;&nbsp;<font color="#008">//Easterリストから取得する日付に使用</font>
&nbsp;&nbsp;NSCalendarDate *compDate ;
&nbsp;&nbsp;<font color="#008">//出力日付用のフォーマットyyyy/m/d形式</font>
&nbsp;&nbsp;NSDateFormatter *dateFormatter = [[[NSDateFormatter alloc]
&nbsp;&nbsp;initWithDateFormat:@"%1Y/%1m/%1d" allowNaturalLanguage:YES] autorelease];
&nbsp;&nbsp;<font color="#008">//出力する日付に使用</font>
&nbsp;&nbsp;NSString *formattedDateString = nil ;
&nbsp;&nbsp;<font color="#008">//Easterリストを廻す添字</font>
&nbsp;&nbsp;int i;
&nbsp;&nbsp;<font color="#008">//Easterリストの最大値、iの上限</font>
&nbsp;&nbsp;int max =&nbsp;&nbsp;[easterday count] ;
&nbsp;&nbsp;<font color="#008">//出力用の文字列</font>
&nbsp;&nbsp;NSString *message;
&nbsp;&nbsp;<font color="#008">//Easterリストを始めからループ</font>
&nbsp;&nbsp;for ( i = 0; i &lt; max;i++) {
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#008">//Easterリストから日付を取得→compDate</font>
&nbsp;&nbsp;&nbsp;&nbsp;compDate =&nbsp;&nbsp;[NSDate dateWithNaturalLanguageString:[easterday objectAtIndex:i]];
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#008">//入力日付とEasterリストの年を比較</font>
&nbsp;&nbsp;&nbsp;&nbsp;if ( [inputDate yearOfCommonEra] &lt; [compDate yearOfCommonEra]) 
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#008">//Easterリストの方が大きい場合、
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//compdataが次のEasterの日となるのでformattedDateStringにセット</font>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;formattedDateString = [dateFormatter stringFromDate:compDate];
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font color="#008">//入力日付とEasterリストのt月日を比較（年は同じ）</font>
&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;else if&nbsp;&nbsp;(&nbsp;&nbsp;([inputDate yearOfCommonEra] == [compDate yearOfCommonEra]) 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&amp;&amp; ([inputDate dayOfYear] &lt;= [compDate dayOfYear]) )&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#008">//Easterリストの方が大きい場合、
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//compdataが次のEasterの日となるのでformattedDateStringにセット</font>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;formattedDateString = [dateFormatter stringFromDate:compDate];
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;}
&nbsp;&nbsp;if (formattedDateString != nil)&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#008">//formattedDateStringがセットされていれば次のEasterとして表示</font>
&nbsp;&nbsp;&nbsp;&nbsp;message = @"Next Easter Day is " ;
&nbsp;&nbsp;&nbsp;&nbsp;message = [message stringByAppendingString:formattedDateString];&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;[msgField setStringValue:message];
&nbsp;&nbsp;} else {
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#008">//formattedDateStringがセットされていない場合は上限エラー</font>
&nbsp;&nbsp;&nbsp;&nbsp;[msgField setStringValue:@"Limit Date is 2021/4/4"];
}

<font color="#800">- (IBAction)calcEaster:(id)sender</font>
{
&nbsp;&nbsp;<font color="#008">//メイアス・ジョーンズ・ブッチャーのグレゴリオ暦アルゴリズム(wikipedia)
&nbsp;&nbsp;//入力した年→year</font>
&nbsp;&nbsp;int year = [yearField intValue];
&nbsp;&nbsp;int a,b,c,d,e,f,g,h,i,k,l,m,mm,dd;
&nbsp;&nbsp;a=year % 19;&nbsp;&nbsp;b=year / 100;&nbsp;&nbsp;c=year % 100;&nbsp;&nbsp;d=b / 4;&nbsp;&nbsp;e=b % 4;&nbsp;&nbsp;i = c / 4;&nbsp;&nbsp;k = c % 4;
&nbsp;&nbsp;f=( b + 8 ) / 25;&nbsp;&nbsp;g=( b - f + 1 ) / 3;&nbsp;&nbsp;h=( 19 * a + b - d - g + 15 ) % 30;
&nbsp;&nbsp;l = ( 32 + 2 * e + 2 * i - h - k ) % 7;&nbsp;&nbsp;m=( a + 11 * h + 22 * l ) / 451;
&nbsp;&nbsp;mm=( h + l - 7 * m + 114) / 31;&nbsp;&nbsp;dd = (( h + l - 7 * m + 114) % 31) + 1;
&nbsp;&nbsp;<font color="#008">//結果を表示</font>
&nbsp;&nbsp;[msgField setStringValue: 
&nbsp;&nbsp;[NSString stringWithFormat:@"The EASTER Day is %d/%d/%d",year,mm,dd] ];
&nbsp;&nbsp;&nbsp;&nbsp;}
@end
</div>

<a href="http://www.xillion.net/download/Exercise4.zip">Exercise4.zip</a>

</div><span class="highslide-footer"><span class="highslide-resize" title="Resize"></span></span>
</div>




]]>
      
   </content>
</entry>
<entry>
   <title>そろそろオリジナルアプリをつくってみよう（その4）</title>
   <link rel="alternate" type="text/html" href="http://www.xillion.net/script/2008/03/4.html" />
   <id>tag:www.xillion.net,2008:/script//2.293</id>
   
   <published>2008-03-02T12:30:13Z</published>
   <updated>2008-03-03T12:43:27Z</updated>
   
   <summary>アプリの基本は完成しました。 あとはこまごまとした作業です。 1.アイコンをつけ...</summary>
   <author>
      <name></name>
      
   </author>
         <category term="1.Xcode" scheme="http://www.sixapart.com/ns/types#category" />
   
   
   <content type="html" xml:lang="ja" xml:base="http://www.xillion.net/script/">
      <![CDATA[アプリの基本は完成しました。
あとはこまごまとした作業です。

<h3>1.アイコンをつける</h3>
128x128のアイコンを作成します。
/Developer/Applications/Utilities/フォルダにあるIcon Composer.appを開き、各サイズのアイコン枠に作成したアイコンをドロップします。

<a href="http://www.xillion.net/img/19_07i.png" class="highslide" onclick="return hs.expand(this,{captionId: '19_07i.png' } )" style="text-decoration:none" onmouseover="this.style.background=' #ffff88 '" onmouseout="this.style.background='#ffffee'"><img src="http://www.xillion.net/img/19_07is.png" /></a><div class='highslide-caption' id='19_07i.png'>すべて128x128のサイズのアイコンをドロップすればOK</div>

ファイルを保存すると.Icnsが作成されるので、Xcodeのプロジェクトウィンドウにドロップします。

<a href="http://www.xillion.net/img/19_08i.png" class="highslide" onclick="return hs.expand(this,{captionId: '19_08i.png' } )" style="text-decoration:none" onmouseover="this.style.background=' #ffff88 '" onmouseout="this.style.background='#ffffee'"><img src="http://www.xillion.net/img/19_08is.png" /></a><div class='highslide-caption' id='19_08i.png'>ドロップ</div>


最後にターゲットにある成果物の情報を表示させて、そのプロパティタブにあるアイコンの名前を指定します。名前を付けるとアイコンの画像が表示されます。

<table><tr><td valign=top>
<a href="http://www.xillion.net/img/19_09.png" class="highslide" onclick="return hs.expand(this,{captionId: '19_09.png' } )" style="text-decoration:none" onmouseover="this.style.background=' #ffff88 '" onmouseout="this.style.background='#ffffee'"><img src="http://www.xillion.net/img/19_09s.png" /></a><div class='highslide-caption' id='19_09.png'>ターゲットの情報を表示</div>
<td valign=top>
<a href="http://www.xillion.net/img/19_10.png" class="highslide" onclick="return hs.expand(this,{captionId: '19_10.png' } )" style="text-decoration:none" onmouseover="this.style.background=' #ffff88 '" onmouseout="this.style.background='#ffffee'"><img src="http://www.xillion.net/img/19_10s.png" /></a><div class='highslide-caption' id='19_10.png'>アイコンを指定する</div>
</table>

これはInfo.PlistのCFBundleIconFileキーを作成して、その値としてアイコンファイルを記述することでも可能です。

<h3>2.メニューバーを整理する</h3>
使わないメニューを削除します。
NewApplicationを1919361に変更します。
表示関連のメニュー（”隠す”とか”表示する”とか）を削除して気がついたのですが、windowからはclose、resizeができないようにしておきましょう。
ウィンドウのインスペクタのアトリビュートで設定します。

<a href="http://www.xillion.net/img/19_11.png" class="highslide" onclick="return hs.expand(this,{captionId: '19_11.png' } )" style="text-decoration:none" onmouseover="this.style.background=' #ffff88 '" onmouseout="this.style.background='#ffffee'"><img src="http://www.xillion.net/img/19_11s.png" /></a><div class='highslide-caption' id='19_11.png'>タイトルバーのボタンを設定</div>

結局、終了メニューとヘルプメニューだけ残しました。
ここでメニューインスタンスの接続を確認してみます。
<table><tr>
<td valign=top>
<a href="http://www.xillion.net/img/19_12.png" class="highslide" onclick="return hs.expand(this,{captionId: '19_12.png' } )" style="text-decoration:none" onmouseover="this.style.background=' #ffff88 '" onmouseout="this.style.background='#ffffee'"><img src="http://www.xillion.net/img/19_12s.png" /></a><div class='highslide-caption' id='19_12.png'></div>
<td valign=top>
<a href="http://www.xillion.net/img/19_13.png" class="highslide" onclick="return hs.expand(this,{captionId: '19_13.png' } )" style="text-decoration:none" onmouseover="this.style.background=' #ffff88 '" onmouseout="this.style.background='#ffffee'"><img src="http://www.xillion.net/img/19_13s.png" /></a><div class='highslide-caption' id='19_13.png'></div>
<td vallign=top>
<a href="http://www.xillion.net/img/19_14.png" class="highslide" onclick="return hs.expand(this,{captionId: '19_14.png' } )" style="text-decoration:none" onmouseover="this.style.background=' #ffff88 '" onmouseout="this.style.background='#ffffee'"><img src="http://www.xillion.net/img/19_14s.png" /></a><div class='highslide-caption' id='19_14.png'></div>
</table>

”1919361について”からNSApplicationへorderFrontStandardAboutPanel:
実際のアプリで動かしてみるとなにもしていないのに、アイコン、アプリ名、バージョン、コピーライトが表示されます。コピーライトは”©«ORGANIZATIONNAME», «YEAR»”となっていますが。これは（ローカライズの）InfoPlist.Stringの修正が必要です。
今回はこれでokですが、appleの<a target="_blank" href="http://developer.apple.com/jp/technotes/tn2006/tn2179.html">サイトに参考記事</a>がでています。

"1919361を終了"からNSApplicationへterminate:
アプリを終了します。特に終了時のトラップは必要ないのでこのままで良いでしょう。

"1919361のヘルプ"からFirstResponderへshowHelp:
何もしないとヘプルファイルがありませんとのダイアログがでます。
このままだとかっこわるいので、メニューを消すがヘルプを作成するかしましょう。
<a target="_blank" href="http://macwiki.sourceforge.jp/wiki/index.php/ヘルプ作成のノウハウ">MacWikiの記事に</a>ヘルプファイルの作成方法や<a target="_blank" href="http://developer.apple.com/documentation/Carbon/Conceptual/ProvidingUserAssitAppleHelp/user_help_intro/chapter_1_section_1.html#//apple_ref/doc/uid/TP30000903-CH204-CHDIDJFE">アップルのガイド</a>があります。
ローカリゼーション（Japanese.lproj）フォルダの下にヘルプファイル用のフォルダ(help)を作成します。
このhelpフォルダにhtmlでヘルプファイルを作成します。
<a href="http://www.xillion.net/img/19_15.png" class="highslide" onclick="return hs.expand(this,{captionId: '19_15.png' } )" style="text-decoration:none" onmouseover="this.style.background=' #ffff88 '" onmouseout="this.style.background='#ffffee'"><img src="http://www.xillion.net/img/19_15s.png" /></a><div class='highslide-caption' id='19_15.png'>ヘルプファイルの場所</div>
ヘルプファイルのトップページ（htmlファイル）のメタタグにヘルプファイルのタイトルを記入します。
<META NAME="AppleTitle" CONTENT="1919361 help">
その他は普通のhtmlです。
ヘプルファイルができあがったら、このhelpフォルダをプロジェクトウィンドウのResourcesにドロップします。フォルダごとドロップするのがポイントです。
<table><tr><td valign=top>
<a href="http://www.xillion.net/img/19_16.png" class="highslide" onclick="return hs.expand(this,{captionId: '19_16.png' } )" style="text-decoration:none" onmouseover="this.style.background=' #ffff88 '" onmouseout="this.style.background='#ffffee'"><img src="http://www.xillion.net/img/19_16s.png" /></a><div class='highslide-caption' id='19_16.png'>フォルダごとドロップ</div>

<td valign=top>
<a href="http://www.xillion.net/img/19_17.png" class="highslide" onclick="return hs.expand(this,{captionId: '19_17.png' } )" style="text-decoration:none" onmouseover="this.style.background=' #ffff88 '" onmouseout="this.style.background='#ffffee'"><img src="http://www.xillion.net/img/19_17s.png" /></a><div class='highslide-caption' id='19_17.png'>自動的にJapaneseの項目に分類されています</div>
</table>

Info.PlistのキーCFBundleHelpBookFolderを作って、ローカライズフォルダに作成したヘルプファイル用のフォルダ名を記入します。(例でhjelp1)
さらにInfo.PlistのキーCFBundleHelpBookNameを作って、メタタグに書いたタイトルを記入します。（例では1919361 help）


<h3>3.クリーニング</h3>
プロジェクトウィンドウのターゲットを右クリックしてクリーニングを実施します。
テストでビルドした成果物を削除してくれそうな勢いです？。


これでやっとできあがりです。
<a href="http://www.xillion.net/download/1919361.zip">1919361アプリ</a>
<a href="http://www.xillion.net/download/1919361proj.zip">1919361プロジェクト</a>]]>
      
   </content>
</entry>
<entry>
   <title>そろそろオリジナルアプリをつくってみよう（その3）</title>
   <link rel="alternate" type="text/html" href="http://www.xillion.net/script/2008/02/3_1.html" />
   <id>tag:www.xillion.net,2008:/script//2.292</id>
   
   <published>2008-02-29T14:49:28Z</published>
   <updated>2008-03-03T12:43:13Z</updated>
   
   <summary>おつぎはプログラミングです。 気になるところから調べてみしょう。 1.boole...</summary>
   <author>
      <name></name>
      
   </author>
         <category term="1.Xcode" scheme="http://www.sixapart.com/ns/types#category" />
   
   
   <content type="html" xml:lang="ja" xml:base="http://www.xillion.net/script/">
      <![CDATA[おつぎはプログラミングです。
気になるところから調べてみしょう。


<h3>1.boolean型</h3>
ボタンのspeech:アクションから出題と解答を繰り返します。
ということで、現在出題中か、解答中かを認識している必要があります。
コントローラオブジェクトに状況を示す変数を作成します。
boolean型のデータとして、ボタンを押すたびにfalseとtrueを入れ替えれば良いでしょう。
cocoaにはBool型がありますので、flagという名のBool型変数を作ってしまいましょう。
このBool型は0と1を保有できるデータ型で、この数字がすなわち、falseとtrueにあたります。
内部変数として使用するので.hには記述しません。

<div class=code>
&nbsp;&nbsp;BOOL flag;
&nbsp;&nbsp;
- (IBAction)speech:(id)sender
{
&nbsp;&nbsp;
&nbsp;&nbsp;if (flag==false) {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;”出題ロジック”
&nbsp;&nbsp;} else {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;”解答ロジック”
&nbsp;&nbsp;} 
&nbsp;&nbsp;
&nbsp;&nbsp;flag = ! flag;
}
</div>
shpeech;アクションの骨子です。
出題の状況変数flagの値をみて処理を振り分け最後にflagの値を書き換えます。
!はnotという意味です。not演算を行いtrueとflaseを入れ替えます。
booleanを使用するときにはよく使う手法でう。

<h3>2.乱数の発生</h3>
出題時は乱数を発生させる必要があります。
xillionが書いたのはこんな感じですのコード。

<div class=code>
&nbsp;&nbsp;int aa, bb;
&nbsp;&nbsp;srand(time(nil));
&nbsp;&nbsp;aa = rand() % 9 + 11;
&nbsp;&nbsp;do { bb = rand() % 18 + 2; } while (bb==10)
</div>

srandに現在時刻(time(nil))を渡してランダムシードを作成します。
rnd()で乱数を発生させます。%9と指定すると０（より大）〜９（未満）で乱数を発生させます。これに１１を足して、掛け算する数にします。aaはint型ですので結局１１〜１９となります。
同様bbは２〜１９（ただし１０は除く）を乱数で発生させますが、
while条件を後ろにおいているので、まずループ内の処理（乱数発生）を行ってから条件を判定します。
これらの乱数の範囲は、普段xillionが唱えている方法を単純にロジックにしたものです。

<h3>Macに喋らせる</h3>
objective-Cで読み上げはどうすれば良いでしょう。AppleScriptのsay命令に相当するものがある筈です。まずマニュアルを調べてみましょう。残念ながら'say'ではヒットしませんでした。次に'voice'で検索すると、NSSpeechSynthesizerクラスのvoiceメソッドがありました。スピーチシンセサイザーです。

使い方としては、まず初期化して
<div class="code">
&nbsp;&nbsp;synth = [ [ NSSpeechSynthesizer alloc ] init ];
</div>

テキストをわたせば良さそうです
<div class="code">
&nbsp;&nbsp;[synth startSpeakingString:speakWords];
</div>

NSSpeechRecognizerもあり、音声認識が可能ですが、あまり認識率がよくないので
（１'ithi'、８'hathi'の区別ができないなど）アプリには組み込みませんでした。

あと、Macは日本語ができないので適当なテキストを探さなくてはなりません。
数字をテキストに変換するための配列を準備します。
配列の要素を指定する添字（番号）がそのまま、その数字の読み上げテキストになると言う具合です。
初期値として配列を作成します。
NSArrayというのがあるのでこれを使います。

<div class=code>
&nbsp;&nbsp;words =[ [ NSArray&nbsp;&nbsp;&nbsp;&nbsp;arrayWithObjects:
&nbsp;&nbsp;&nbsp;&nbsp;@"mulle",@"ichi",@"knee",@"sun",@"yon",
&nbsp;&nbsp;&nbsp;&nbsp;@"ga",@"roq",@"nana",@"hech",@"queue",
&nbsp;&nbsp;&nbsp;&nbsp;@"joo",@"joo ichi",@"joo knee",@"joo san",@"joo yon",
&nbsp;&nbsp;&nbsp;&nbsp;@"joo ga",@"joo roq",@"joo nana",@"joo hech",@"joo ku",
&nbsp;&nbsp;&nbsp;&nbsp;nil ] retain ];
</div>

<font color=red>配列の最後はnilが必要です。</font>
テキスト（文字列）は試行錯誤してきめました。
また範囲ですが、1919361を”じゅうきゅうじゅうきゅうさんろくいち”と読むことからわかるように、０から１９までつくっておけば大丈夫です。掛け算の答えは位取りせずに１桁ずつ数字を読み上げさせます。
この配列で出題の方はNSArrayのobjectAtIndex:メソッドで取り出せますが、答えの方はどうでしょう。出力する文字列のsubstringWithRange:NSMakeRangeメソッドで文字列（勿論ないようは数字）を１桁ずつ取り出すことが可能です。その取り出した文字列を数字に変換してNSArrayのobjectAtIndex:メソッドを使用します。

<div class=code>
&nbsp;&nbsp;speakWords =
&nbsp;&nbsp;[ [ [ words objectAtIndex:aa ] stringByAppendingString:@" " ] stringByAppendingString:[words objectAtIndex:bb ] ];
</div>
出題のテキスト作成部分です。メッセージのネスとが多く読み取り難いですが、ランダムに発生させた２つの数字aaとbbのテキストを配列から取り出して、連結させています。単語を分けるために間にブランクを入れました。このブランクは配列のテキストに入れておいても良いでしょう。

<div class=code>
&nbsp;&nbsp;kai1 = [ dispWord substringWithRange:NSMakeRange(0,1) ];
&nbsp;&nbsp;speakWords = [ [ words objectAtIndex: [ kai1 intValue] ] tringByAppendingString:@" "];

&nbsp;&nbsp;kai2 = [ dispWord substringWithRange:NSMakeRange(1,1) ];
&nbsp;&nbsp;speakWords = 
&nbsp;&nbsp;[ [ speakWords stringByAppendingString: [ words bjectAtIndex: [ kai2 intValue ] ] ]  stringByAppendingString:@" "];

&nbsp;&nbsp;if (intKai > 100) {
&nbsp;&nbsp;&nbsp;&nbsp;kai3 =[ dispWord substringWithRange:NSMakeRange(2,1) ];
&nbsp;&nbsp;&nbsp;&nbsp;speakWords = [ speakWords stringByAppendingString: [ words bjectAtIndex: [ kai3 intValue ] ] ];	
&nbsp;&nbsp;&nbsp;&nbsp;} 	
&nbsp;&nbsp;}
</div>
解答部分は、表示させる文字列（中身は数字）を１文字ずつ取り出して、その数字に対応するテキストを配列から取り出します。掛け合わせる２つの数の範囲から解答は２桁と３桁の場合がありますので、３桁目は100より大（正確には100も3桁ですが10x10がないので。。）の場合に処理をしています。


]]>
      
   </content>
</entry>
<entry>
   <title>そろそろオリジナルアプリをつくってみよう（その２）</title>
   <link rel="alternate" type="text/html" href="http://www.xillion.net/script/2008/02/post_32.html" />
   <id>tag:www.xillion.net,2008:/script//2.290</id>
   
   <published>2008-02-26T14:19:46Z</published>
   <updated>2008-03-03T12:43:00Z</updated>
   
   <summary>CocoaAppliのプロジェクトを作成しますが、まずアプリ名を決めておいた方が...</summary>
   <author>
      <name></name>
      
   </author>
         <category term="1.Xcode" scheme="http://www.sixapart.com/ns/types#category" />
   
   
   <content type="html" xml:lang="ja" xml:base="http://www.xillion.net/script/">
      <![CDATA[CocoaAppliのプロジェクトを作成しますが、まずアプリ名を決めておいた方が良いでしょう。
1919361とします。
一桁の掛け算の九九と言うのに対抗して、十九十九なのですが、その答え三六一もつけちゃいました。わかり易い名前でしょ。

IBを立ち上げてビューを作成します。
まずローカライズ。デフォルトがEnglishになっていますので、FileのOpenLocalizationsでJapaneseを選びます。Englishのインターフェイスは作りません。ローカライズ作成はXcodeプロジェクトの”グループとファイル”のResourcesにドロップすることでも可能です。ドロップするファイルはプロジェクトフォルダのJapanese.lprojにあるMainMenu.nibとInfoPlist.stringsです。こんな感じです。
<TABLE><TR><TD VALIGN=TOP>
<a href="http://www.xillion.net/img/19_07.png" class="highslide" onclick="return hs.expand(this,{captionId: '19_07.png' } )" style="text-decoration:none" onmouseover="this.style.background=' #ffff88 '" onmouseout="this.style.background='#ffffee'"><img src="http://www.xillion.net/img/19_07s.png" /></a><div class='highslide-caption' id='19_07.png'>ドロップすると</div>
<TD VALIGN=TOP>
<a href="http://www.xillion.net/img/19_08.png" class="highslide" onclick="return hs.expand(this,{captionId: '19_08.png' } )" style="text-decoration:none" onmouseover="this.style.background=' #ffff88 '" onmouseout="this.style.background='#ffffee'"><img src="http://www.xillion.net/img/19_08s.png" /></a><div class='highslide-caption' id='19_08.png'>資源が追加されます</div></table>

ウィンドウ１個、NSTextfield１個、NSButton１個のコンパクトな顔つきです。
<img src="http://www.xillion.net/img/19_01.png">

次にコントローラを作成します。
NSObjectのサブクラスにMyAppControllerを作成します。
出力用のOutlet(dispField)と、ボタンaction(Speech:)を作成します。
ここでインスタンス化とコード化を実施します。

次にビューとの連携を作成します。
コントロールキーを押しながらドラッグして線を結べばOKです。
さらにMyAppControllerをアプリのデリゲートに指定しておきましょう。
IBはこれでOK

<table><tr>

<td valign=top>
<a href="http://www.xillion.net/img/19_04.png" class="highslide" onclick="return hs.expand(this,{captionId: '19_04.png' } )" style="text-decoration:none" onmouseover="this.style.background=' #ffff88 '" onmouseout="this.style.background='#ffffee'"><img src="http://www.xillion.net/img/19_04s.png" /></a><div class='highslide-caption' id='19_04.png'>
NSButton→MyAppController</div>

<td valign=top>
<a href="http://www.xillion.net/img/19_05.png" class="highslide" onclick="return hs.expand(this,{captionId: '19_05.png' } )" style="text-decoration:none" onmouseover="this.style.background=' #ffff88 '" onmouseout="this.style.background='#ffffee'"><img src="http://www.xillion.net/img/19_05s.png" /></a><div class='highslide-caption' id='19_05.png'>
MyAppController→NSTextDield</div>

<td valign=top>
<a href="http://www.xillion.net/img/19_06.png" class="highslide" onclick="return hs.expand(this,{captionId: '19_06.png' } )" style="text-decoration:none" onmouseover="this.style.background=' #ffff88 '" onmouseout="this.style.background='#ffffee'"><img src="http://www.xillion.net/img/19_06s.png" /></a><div class='highslide-caption' id='19_06.png'>
MyAppControllerをデリゲートに</div>

<tr>
<td valign=top>
<a href="http://www.xillion.net/img/19_02.png" class="highslide" onclick="return hs.expand(this,{captionId: '19_02.png' } )" style="text-decoration:none" onmouseover="this.style.background=' #ffff88 '" onmouseout="this.style.background='#ffffee'"><img src="http://www.xillion.net/img/19_02s.png" /></a><div class='highslide-caption' id='19_02.png'>
MyAppControllerの入力</div>

<td valign=top>
<a href="http://www.xillion.net/img/19_03.png" class="highslide" onclick="return hs.expand(this,{captionId: '19_03.png' } )" style="text-decoration:none" onmouseover="this.style.background=' #ffff88 '" onmouseout="this.style.background='#ffffee'"><img src="http://www.xillion.net/img/19_03s.png" /></a><div class='highslide-caption' id='19_03.png'>
MyAppControllerの出力</div>


</table>]]>
      
   </content>
</entry>
<entry>
   <title>RegEx</title>
   <link rel="alternate" type="text/html" href="http://www.xillion.net/script/2008/02/regex.html" />
   <id>tag:www.xillion.net,2008:/script//2.289</id>
   
   <published>2008-02-26T13:57:33Z</published>
   <updated>2008-02-26T14:16:14Z</updated>
   
   <summary>2003年、たぶん当時エクセル初の？レジストリツール。 このアプリは、ユーザーイ...</summary>
   <author>
      <name></name>
      
   </author>
         <category term="6.Heritage" scheme="http://www.sixapart.com/ns/types#category" />
   
   
   <content type="html" xml:lang="ja" xml:base="http://www.xillion.net/script/">
      <![CDATA[2003年、たぶん当時エクセル初の？レジストリツール。
このアプリは、ユーザーインターフェイスをダイナミックに作成します。
エクセルのワークシートの情報をもとに（＝カスタマイズ可能）、タブを増殖させて、コントロールを追加します。ダイナミックに作成したコントロールのイベントをトラップするため、イベントコントロールというクラスモジュールを作りました。
今にしてみれば、我ながらよくもまあこんな発想ができたなあと思う作品。
レジストリなのでMacでは動きません。

<a href="http://www.xillion.net/download/RegEx.zip">ダウンロード</a>

当時開発時に公開していたステップバイステップです。データ名称を日本語にしているので読み易い？と思います。
なぞり読みしてくださいね、解説がでてきます。

<a target="_blank" href="http://www.xillion.net/excel/sbs/reg/_st_reg_fr.html">http://www.xillion.net/excel/sbs/reg/_st_reg_fr.html</a>

]]>
      
   </content>
</entry>
<entry>
   <title>そろそろオリジナルアプリをつくってみよう（その１）</title>
   <link rel="alternate" type="text/html" href="http://www.xillion.net/script/2008/02/post_34.html" />
   <id>tag:www.xillion.net,2008:/script//2.288</id>
   
   <published>2008-02-25T14:48:07Z</published>
   <updated>2008-03-03T12:42:22Z</updated>
   
   <summary>Xcodeの操作もだんだんわかってきて、入出力がコントロールできるようになりまし...</summary>
   <author>
      <name></name>
      
   </author>
         <category term="1.Xcode" scheme="http://www.sixapart.com/ns/types#category" />
   
   
   <content type="html" xml:lang="ja" xml:base="http://www.xillion.net/script/">
      Xcodeの操作もだんだんわかってきて、入出力がコントロールできるようになりました。
するとなんだかオリジナルなアプリが作りたいなぁと思うわけです。
ということでなにか題材はないかと考えてみたら。。。

ありました。
インド算術です。
じつはxillionは最近、インド式算術にハマっていまして例の20×20の暗記に挑戦しています。
20×20といっても実際は19×19です。
現在16の段とか19の段とかそれぞれの段を順番に唱えることが（８割ほど）できるレベルです。
ならば、ランダムに出題させて、それに解答するというようなアプリをつくりましょう。

先ずはビューを決めましょう。
ウィンドウは１個OKですね。（ドキュメントベースではない、ふつうのcocoaアプリです）。

まずランダムに、iMacが出題します。
出題部分の出力はテキストフィールドです。

ユーザーは答えを考え（というか暗記しているので即座に解答が思い浮かぶはず）、ボタンをクリックします。すると、解答が現れます。
解答の出力ですが、出題と同じテキストフィールドでよいでしょう。

そして解答したら次の出題をします。
ここでもユーザーのクリックがよいでしょう。クリックするためのボタンも１個で良いでしょう。

これでビューが決まりです。
ウィンドウ１個、テキストフィールド１個、ボタン１個です。
でマンマシンインタフェイスで流れを書くと、
クリック→出題→クリック→解答→クリック→出題→クリック→解答→・・・・・・
という繰り返です。

ところでxillionの暗記方法は”呪文のように唱える”という方法です。
頭の中で唱えるというような手法も可能なので、通勤電車の中とか、ちょっとした待ち時間なんかに適当な段を暗唱するのです。
なぜこんなことを書くのかといえば、そうです、iMacに読み上げさせることをさせたいからです。
するとユーザーはクリックするたびにiMacと一緒に唱えることによって、より早く掛け算を覚えることができますからね。
      
   </content>
</entry>
<entry>
   <title>AppleScriptのメニュー構造を上手に調べる</title>
   <link rel="alternate" type="text/html" href="http://www.xillion.net/script/2008/02/applescript_2.html" />
   <id>tag:www.xillion.net,2008:/script//2.283</id>
   
   <published>2008-02-25T13:08:57Z</published>
   <updated>2008-02-25T14:47:10Z</updated>
   
   <summary>All AboutにAppleScriptの構造を上手に調べるという記事がありま...</summary>
   <author>
      <name></name>
      
   </author>
         <category term="2.AppleScript" scheme="http://www.sixapart.com/ns/types#category" />
   
   
   <content type="html" xml:lang="ja" xml:base="http://www.xillion.net/script/">
      <![CDATA[<a href="http://allabout.co.jp/computer/macos/closeup/CU20070626A/index3.htm">All AboutにAppleScriptの構造を上手に調べる</a>という記事がありました。

AppleScriptがアプリケーションと連携して、そのオブジェクトを操作することは周知の通りですが、AppleScriptはアプリケーションのメニューをクリックするということまでやってのけます。
ただ、このメニューアイテムを直感的に記述することは、なかなかできません。
そのため、All AboutではUI elementsをディスプレイさせながらコーディングをしていく手法を紹介しています。
この方法も便利だと思いますが、もっと面白いスクリプトを見つけました。

<a href="http://lists.apple.com/archives/applescript-users/2005/Feb/msg00439.html">AppleMailingListの記事です。</a>
コードの末尾のtell application "Script Editor"でスクリプトを作成している部分も興味深いですね。

<a href="applescript://com.apple.scripteditor?action=new&script=to%20chooseItem(i,%20l)%0a%20%20set%20c%20to%20choose%20from%20list%20l%20with%20prompt%20%22Choose%20a%20%22%20&%20i%20&%20%22:%22%0a%20%20if%20c%20is%20false%20then%20error%20number%20-128%0a%20%20c's%20item%201%0aend%20chooseItem%0a%0atell%20application%20%22System%20Events%22%0a%20%20set%20p%20to%20my%20chooseItem(%22process%22,%20name%20of%20processes%20whose%20visible%20is%20true)%0a%20%20tell%20process%20p%20to%20tell%20menu%20bar%201%0a%20%20%20%20tell%20menus%20to%20set%20m%20to%20my%20chooseItem(p%20&%20%22%20menu%22,%20name)%0a%20%20%20%20tell%20menu%20m%20to%20tell%20menu%20items%20to%20set%20i%20to%20my%20chooseItem(p%20&%20%22%20menu%20item%22,%20name)%0a%20%20end%20tell%0aend%20tell%0a%0atell%20application%20%22Script%20Editor%22%20to%20make%20new%20document%20at%20end%20with%20properties%20{contents:%22tell%20application%20\%22%22%20&%20p%20&%20%22\%22%20to%20activate%22%20&%20return%20&%20return%20&%20%22tell%20application%20\%22System%20Events\%22%22%20&%20return%20&%20%22repeat%20until%20\%22%22%20&%20p%20&%20%22\%22%20is%20in%20name%20of%20processes%22%20&%20return%20&%20%22end%20repeat%22%20&%20return%20&%20%22tell%20process%20\%22%22%20&%20p%20&%20%22\%22%20to%20pick%20menu%20item%20\%22%22%20&%20i%20&%20%22\%22%20of%20menu%20\%22%22%20&%20m%20&%20%22\%22%20of%20menu%20bar%201%22%20&%20return%20&%20%22end%20tell%22%20&%20return}">AutoMenu.scpt</a>です。
<div class=code>
to chooseItem(i, l)
&nbsp;&nbsp;&nbsp;&nbsp;set c to choose from list l with prompt "Choose a " &amp; i &amp; ":"
&nbsp;&nbsp;&nbsp;&nbsp;if c is false then error number -128
&nbsp;&nbsp;&nbsp;&nbsp;c's item 1
end chooseItem

tell application "System Events"
&nbsp;&nbsp;&nbsp;&nbsp;set p to my chooseItem("process", name of processes whose visible is true)
&nbsp;&nbsp;&nbsp;&nbsp;tell process p to tell menu bar 1
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tell menus to set m to my chooseItem(p &amp; " menu", name)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tell menu m to tell menu items to set i to my chooseItem(p &amp; " menu item", name)
&nbsp;&nbsp;&nbsp;&nbsp;end tell
end tell

tell application "Script Editor" to make new document at end with properties {contents:"tell application \"" &amp; p &amp; "\" to activate" &amp; return &amp; return &amp; "tell application \"System Events\"" &amp; return &amp; "repeat until \"" &amp; p &amp; "\" is in name of processes" &amp; return &amp; "end repeat" &amp; return &amp; "tell process \"" &amp; p &amp; "\" to pick menu item \"" &amp; i &amp; "\" of menu \"" &amp; m &amp; "\" of menu bar 1" &amp; return &amp; "end tell" &amp; return}

</div>

]]>
      
   </content>
</entry>
<entry>
   <title>Display dialogをループさせてランチャーを作ってみる</title>
   <link rel="alternate" type="text/html" href="http://www.xillion.net/script/2008/02/display_dialog.html" />
   <id>tag:www.xillion.net,2008:/script//2.287</id>
   
   <published>2008-02-24T14:04:43Z</published>
   <updated>2008-02-24T14:16:10Z</updated>
   
   <summary>かなりキワモノのスクリプトです。 ランチャを作成しようと思いつくってみました。 ...</summary>
   <author>
      <name></name>
      
   </author>
         <category term="2.AppleScript" scheme="http://www.sixapart.com/ns/types#category" />
   
   
   <content type="html" xml:lang="ja" xml:base="http://www.xillion.net/script/">
      <![CDATA[かなりキワモノのスクリプトです。
ランチャを作成しようと思いつくってみました。
ランチャ実現のコアは、applescriptからターミナルのopen -aコマンドを実行させる部分です。
これは、まあよいのですが、常駐アプリにしようということで、アプリ名の入力をもとめるダイアログをrepeatブロックでループさせてみました。
これは意図した無限ループです。おすすめはできません。
しかも、ターミナルの終了確認をオフにしないとかえってウルサイアプリになってしまいます。。。

<a href="applescript://com.apple.scripteditor?action=new&script=repeat%20%20%0a%20%20display%20dialog%20%22Open%20-a%20%22%20default%20answer%20%22Application%20name%22%0a%20%20set%20myCommand%20to%20text%20returned%20of%20result%0a%20%20--%20キャンセルでexit%20%20%0a%20%20tell%20application%20%22Terminal%22%0a%20%20%20%20do%20script%20%22open%20-a%20%22%20&%20myCommand%0a%20%20%20%20quit%0a%20%20end%20tell%20%20%0aend%20repeat"> できそこないランチャ.scpt</a>
<div class=code>repeat&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;display dialog "Open -a&nbsp;&nbsp;&nbsp;&nbsp;" default answer "Application name"
&nbsp;&nbsp;&nbsp;&nbsp;set myCommand to text returned of result
&nbsp;&nbsp;&nbsp;&nbsp;-- キャンセルでexit&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;tell application "Terminal"
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;do script "open -a " &amp; myCommand
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;quit
&nbsp;&nbsp;&nbsp;&nbsp;end tell&nbsp;&nbsp;&nbsp;&nbsp;
end repeat</div>

ソースには難しい部分はないとおもいますが、display dialogの入力結果をtext returned of resultで取得します。これは覚えておきましょうね。
]]>
      
   </content>
</entry>
<entry>
   <title>Cocoaはじめの一歩＋α　練習問題3</title>
   <link rel="alternate" type="text/html" href="http://www.xillion.net/script/2008/02/cocoa3.html" />
   <id>tag:www.xillion.net,2008:/script//2.286</id>
   
   <published>2008-02-23T23:44:02Z</published>
   <updated>2008-03-08T11:34:41Z</updated>
   
   <summary>Cocoaはじめの一歩というサイトの歩き方です。 Cocoaはじめの一歩にある練...</summary>
   <author>
      <name></name>
      
   </author>
         <category term="1.Xcode" scheme="http://www.sixapart.com/ns/types#category" />
   
   
   <content type="html" xml:lang="ja" xml:base="http://www.xillion.net/script/">
      <![CDATA[Cocoaはじめの一歩というサイトの歩き方です。
Cocoaはじめの一歩にある練習問題を通じでXcodeとobjective-Cになじもうとする企画です。

では<a target="_blank" href="http://homepage.mac.com/nsekine/SYW/SYWSoft/learnCocoa/exercise3.html">練習問題3</a>をやって見ましょう。

この問題はアプリケーションの細やかな仕様を実現するためのもの。
パブリッシュするアプリを作ったことのあるヒトなら当然配慮する事柄です。
割り勘の計算ということで、割り算の際の余りを考慮する問題です。

でも、あなたが割り勘の計算をするときって、１円単位まで割りますか？そのへんも考えてみてください。
あと、アップリケーションのウィンドウにもタイトルをつけてあげましょう。

<a href="#" onclick="return hs.htmlExpand(this, { contentId: 'ex0' } )"  class="highslide" >解答です。</a>
<div class="highslide-html-content" id="ex0" ><div class="highslide-header"><ul><li class="highslide-move"><a href="#" onclick="return false">Move</a></li><li class="highslide-close"><a href="#" onclick="return hs.close(this)">Close</a><li></ul></div>
<div class="highslide-body" ><div align="left">
<div class=code>
@implementation MAWarikan

- (IBAction)keisan:(id)sender
{
&nbsp;&nbsp;&nbsp;&nbsp;int gokei = [gokeiField intValue];
&nbsp;&nbsp;&nbsp;&nbsp;int ninzu = [ninzuField intValue];
&nbsp;&nbsp;&nbsp;&nbsp;if (ninzu &gt; 0 ) {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int hitoriatari = gokei / ninzu / 100 * 100;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int hasu = gokei - hitoriatari * ninzu;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[hitoriatariField setIntValue:hitoriatari];
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[hasuField setIntValue:hasu];
&nbsp;&nbsp;&nbsp;&nbsp;} else {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[ninzuField setStringValue:@"error"];
&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;
}

@end
</div>

まず人数は正の数しか許しません。.......と書きましたが、小数が入ってしまいますね（ただしプログラムでは無視されます）。
普通のアプリはユーザーの入力をチェックするフェーズがあって、想定外の入力はエラーとします。
このコードの場合は、人数がゼロ以下の場合、入力したフィールドにerrorとの表示をします。

割り算の答えを100で割って100をかけます。受け側の項目hitoriatariがint型なので、この計算で100円単位の切り捨てができます。
余りはこのhitoriatariから逆算しています。
ビューはこんな感じです。
<img src="http://www.xillion.net/script/img/warikan.png">

練習問題3の答えを見てみたら、100円単位の記述がありますね。
データの名前付けにも言及しています。xillionはC言語のネーミングルール自体知らないのですが、データの名前は小文字から始める習慣があるようです。複数の単語を結合させてデータの名前とするときは２単語目以降の頭文字を大文字にします。
例えば、goodMorningMrFoobarという感じです。


<a href="http://www.xillion.net/download/Exercise3.zip">Exercise3.zip</a>
</div>
</div><span class="highslide-footer"><span class="highslide-resize" title="Resize"></span></span>
</div>




]]>
      
   </content>
</entry>
<entry>
   <title>Cocoaはじめの一歩＋α　練習問題2</title>
   <link rel="alternate" type="text/html" href="http://www.xillion.net/script/2008/02/cocoa2.html" />
   <id>tag:www.xillion.net,2008:/script//2.285</id>
   
   <published>2008-02-23T05:21:44Z</published>
   <updated>2008-03-08T11:35:28Z</updated>
   
   <summary>Cocoaはじめの一歩というサイトの歩き方です。 Cocoaはじめの一歩にある練...</summary>
   <author>
      <name></name>
      
   </author>
         <category term="1.Xcode" scheme="http://www.sixapart.com/ns/types#category" />
   
   
   <content type="html" xml:lang="ja" xml:base="http://www.xillion.net/script/">
      <![CDATA[Cocoaはじめの一歩というサイトの歩き方です。
Cocoaはじめの一歩にある練習問題を通じでXcodeとobjective-Cになじもうとする企画です。

では<a target="_blank" href="http://homepage.mac.com/nsekine/SYW/SYWSoft/learnCocoa/exercise2.html">練習問題2</a>をやって見ましょう。

この問題はC言語のループ処理をコーディングすることが目的です。
練習問題1と同様に、今まで何かの言語でプログラミングをしたことがあれば、問題なく解答ができると思います。そうでない場合も”C言語”、”ループ処理”でネット検索すればコードの書き方がわかると思います。

ところでべき乗って負の値があることをご存知ですか？
３のべき乗を考えてみましょう。
まずは正の値。
３の１乗＝３
３の２乗＝３＊３＝９
３の３乗＝３＊３＊３＝２７

指数が１増えると数が３倍になっていますね。
３の１乗＝３
３の２乗＝３の１乗＊３＝９
３の３乗＝３の２乗＊３＝２７

これを逆に考えると、指数が１つ減るとその値は３分の１になると言えます。
３の１乗＝３
３の０乗＝３の１乗／３＝１
３の−１乗＝３の０乗／３＝１／３
３の−２乗＝３の−１乗／３＝１／９
３の−３乗＝３の−２乗／３＝１／２７

結果をみると、
nの０乗＝１
nのマイナスm乗は、nのm乗の逆数
といえそうですね。

なぜこんなくどい説明をしたかというと、そうですマイナスの指数や０乗をプログラミングしてほしいからです。いろいろなロジックが考えられますがあなた自身で考えてみてください。
もちろんべき乗の基数が０やマイナスの場合も考えてね。

<a href="#" onclick="return hs.htmlExpand(this, { contentId: 'ex0' } )"  class="highslide" >解答です。</a>
<div class="highslide-html-content" id="ex0" ><div class="highslide-header"><ul><li class="highslide-move"><a href="#" onclick="return false">Move</a></li><li class="highslide-close"><a href="#" onclick="return hs.close(this)">Close</a><li></ul></div>
<div class="highslide-body" ><div align="left">

<div class=code>- (IBAction)calculate:(id)sender
{
&nbsp;&nbsp;&nbsp;&nbsp;int i,value1, value2;
&nbsp;&nbsp;&nbsp;&nbsp;float result;
&nbsp;&nbsp;&nbsp;&nbsp;value1=[value1Field intValue];
&nbsp;&nbsp;&nbsp;&nbsp;value2=[value2Field intValue];

&nbsp;&nbsp;&nbsp;&nbsp;result = 1;
&nbsp;&nbsp;&nbsp;&nbsp;if (value1 == 0 ) {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result=0;
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;else if (value2 &gt; 0) {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for (i =1;i &lt;= value2; i++) { result = result * value1; };
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;else if (value2 &lt; 0) {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for (i =-1;i &gt;= value2; i--) {result = result / value1; };
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;[resultField setFloatValue: result];
}</div>
ソースとしては、はじめに結果(result)を１とおきます。
基数がゼロの場合の結果はゼロとします。
正の累乗の場合は掛け算を、負の累乗の場合は割り算をそれぞれ繰り返すというロジックです。
ゼロ乗の場合ななにもしないので、はじめにセットした１が結果となります。
最後に計算した結果を表示させます。

<a href="http://www.xillion.net/download/Exercise2.zip">Exercise2.zip</a>
</div>

</div><span class="highslide-footer"><span class="highslide-resize" title="Resize"></span></span>
</div>

ところで０の０乗や０のマイナスm乗って不定というのが正解らしいのですが、xillionは数列
的に考えて０としました。０のマイナスm乗はゼロ割ではないかって？まあ数列的判断ですから。



]]>
      
   </content>
</entry>

</feed>
