ライフゲーム その2
先日のコードより後退して、最小限のコードを書いた。
- 初期状態はコード上で決め打ち。
- 出力はLog出力の最小限アプリ。
以上の2点しかないのに、テンプレートから作成したので無駄なWindowが出る。
モデルクラスの使い方
モデルクラスは、LGOMModelです。インスタンス化する時に、格子のサイズを指定して作成します。
{
LGOMSize theSize = {32, 32};
self.model = [LGOMModel modelWithSize:theSize];
.
.
.
上記は、32x32の格子サイズを持つライフゲームのモデルを作成します。
初期状態の設定
初期状態の設定用に3つのメソッドを用意しています。
// すべてのセルを非生存状態にします。
- (void) clearAll;
// すべてのセルの生存状態/非生存状態を乱数で設定します
- (void) randomizeAll;
// 文字列でセルの状態を指定します。
- (void) gameBoardSetup:( NSString* _Nonnull )inNewLifeGameBoard;
clearAllとrandomizeAllはコメントの通りです。 gameBoardSetupメソッドに引き渡す文字列は、以下のような形式になります。
// 8x8の格子でLGOMModelを作成した場合
[model gameBoardSetup:
@"........\r"
@"...OOO..\r"
@"........\r"
@"........\r"
@"........\r"
@"...OOO..\r"
@"........\r"
@"........\r"
それぞれの文字の意味を以下の表に示します。
| 文字 | 意味 |
|---|---|
| “O” | セルが生存状態 |
| “.” | セルが非生存状態 |
| “r” | 次の行、または終了マーカー |
世代の進行
メソッド”next”を呼び出すと、モデルの内容を次の世代に書き換えます。
各セルの値の確認と変更
それぞれのセルの状態を確認変更するメソッドは以下の2つです。
// inPointで示す位置のセルの状態をBOOLで返します。YES:生存 NO:非生存
- (BOOL) aliveAtPoint:(LGOMPoint)inPoint;
// inPointで示す位置のセルの状態をinAliveで指定した値に変更します。
- (void) setAlive:(BOOL)inAlive atPoint:(LGOMPoint)inPoint;
すべてのセルの状態確認
descriptionメソッドで出力するようにしています。
- (NSString*) description
サンプルコードでの使用方法
NSApplicationのdelegateに設定している、LGOMApplicationDelegateの中のawakeFromNibメソッドで使用しています。
- (void) awakeFromNib
{
LGOMSize theSize = {32, 32};
self.model = [LGOMModel modelWithSize:theSize];
[self.model gameBoardSetup:
@"................................\r"
@"...OOO..............O...........\r" // ブリンカー
@"....................OO..........\r" // ブロック
@"...........OOOO.................\r" // 蜂の巣
@"................................\r"
@"................................\r"
@"................................\r"
@"................................\r"
@"................................\r"
@".............OOO................\r" // Tテトロミノ
@"..............O.................\r"
@"................................\r"
@"................................\r"
@"................................\r"
@"................................\r"
@"...O............................\r"// グライダー
@"....O...........................\r"
@"..OOO...........................\r"
@"................................\r"
@"................................\r"
@"................................\r"
@"................................\r"
@"................................\r"
@"................................\r"
@"................................\r"
@"................................\r"
@"................................\r"
@"................................\r"
@"................................\r"
@"................................\r"
@"................................\r"
@"................................\r"];
NSLog(@"\r%@\r", self.model );
[self.model next];
NSLog(@"\r%@\r", self.model );
[self.model next];
NSLog(@"\r%@\r", self.model );
[self.model next];
NSLog(@"\r%@\r", self.model );
[self.model next];
NSLog(@"\r%@\r", self.model );
[self.model next];
NSLog(@"\r%@\r", self.model );
[self.model next];
}
出力結果は以下の通り。
2016-09-04 23:21:11.141 LifeGameOnMac[38776:1497000]
................................
...OOO..............O...........
....................OO..........
...........OOOO.................
................................
................................
................................
................................
................................
.............OOO................
..............O.................
................................
................................
................................
................................
...O............................
....O...........................
..OOO...........................
................................
................................
................................
................................
................................
................................
................................
................................
................................
................................
................................
................................
................................
................................
2016-09-04 23:21:11.144 LifeGameOnMac[38776:1497000]
....O...........................
....O...............OO..........
....O.......OO......OO..........
............OO..................
............OO..................
................................
................................
................................
..............O.................
.............OOO................
.............OOO................
................................
................................
................................
................................
................................
..O.O...........................
...OO...........................
...O............................
................................
................................
................................
................................
................................
................................
................................
................................
................................
................................
................................
................................
................................
以下省略
多分、最も原始的なCocoaアプリでのライフゲイムだと思う。
ソースコードはここ。( LifeGameOnMac_01.zip )
次は、GUIで編集できるコードの解説をします。じゃあね。
NSTableViewのUIを改良する、その1
Cocoa勉強会資料。入力した文字列の長さに応じて行の高さを調整するコードです。 プロジェクトファイルはここに置いてきます。( TableViewUX.zip )
その2は無いかもしれない。
Sphinxで作るApple help book
目的
Sphinxは美しいドキュメントを簡単に作れるようにするマンドラインツールです。 これを転用して、アプリケーションのオンラインマニュアルを作成ができます。
Apple help bookはMacアプリケーションのオンラインマニュアルの形式です。このApple help bookはhtmlで表記する必要があります。
html直書きよりも簡易な表記が可能なドキュメント作成ツールSphinxでオンラインマニュアルを作成すると、ほんのりラクが出来る気がします。
Sphinxの出力形式にApple help book形式が2015年に追加されたましたので、少しだけ調べてみました。
作成手法
最小限の手間で既存のCocoaアプリケーションに、Sphinxで作成したオンラインヘルプを追加する方法を示す。流れは以下の5つの手順。
- Sphinx-quick-start
- configファイルの変更
- XCodeにスクリプトフェーズの追加
- apple help book fileをResorceとして追加
- info.plistの変更
Sphinx-quick-start
以下のような既存のプロジェクトにSphinxのコードを追加します。
.
├── HalloWorld/
└── HalloWorld.xcodeproj
このディレクトリに、sphinxディレクトリを作成しそこを、カレントディレクトリにします。
.
├── HalloWorld/
├── sphinx/ <--- 今作った。
└── HalloWorld.xcodeproj
sphinx-quickstartコマンドでsphinxのテンプレートファイルを設置します。(私の環境では、2.7系のコマンドしかうまく動かなかったので、2.7系で使用しています)
$ sphinx-quickstart-2.7
Welcome to the Sphinx 1.4.3 quickstart utility.
.
.
.
> Root path for the documentation [.]:
> Separate source and build directories (y/n) [n]: y
> Name prefix for templates and static dir [_]:
> Project name: HalloWorld <—- 重要
> Author name(s): HalloWorld Author
> Project version: 1.0
> Project release [1.0]: 1.0
> Project language [en]: ja <—- 重要
> Source file suffix [.rst]:
> Name of your master document (without suffix) [index]:
> Do you want to use the epub builder (y/n) [n]:
> autodoc: automatically insert docstrings from modules (y/n) [n]:
> doctest: automatically test code snippets in doctest blocks (y/n) [n]:
> intersphinx: link between Sphinx documentation of different projects (y/n) [n]:
> todo: write "todo" entries that can be shown or hidden on build (y/n) [n]:
> coverage: checks for documentation coverage (y/n) [n]:
> imgmath: include math, rendered as PNG or SVG images (y/n) [n]:
> mathjax: include math, rendered in the browser by MathJax (y/n) [n]:
> ifconfig: conditional inclusion of content based on config values (y/n) [n]:
> viewcode: include links to the source code of documented Python objects (y/n) [n]:
> githubpages: create .nojekyll file to publish the document on GitHub pages (y/n) [n]:
> Create Makefile? (y/n) [y]:
> Create Windows command file? (y/n) [y]: n <—- 重要
コマンドを実行すると、上記のように幾つか質問されます。重要点は3点だけです。
| 設定項目 | 説明 |
|---|---|
| Project name | 生成されるApple help bookのファイル名になります。 |
| Project language | ローカライズに使用されます。日本語ならばjaを使用します。 |
| Create Windows command file? | 信仰心が試される箇所です。最後まで気を抜かずに、必ずnにしましょう。 |
コマンドの実行が終了すると、以下のようなディレクトリ構造になります。
.
├── HalloWorld/
├── HalloWorld.xcodeproj
└── sphinx
├── Makefile
├── build
└── source
configファイルの変更
sphinx/source/conf.pyを編集します。変更箇所は1箇所です。
# apple help book bundle のCFBundleIdentifierの値の設定。
applehelp_bundle_id = 'com.mindto01s.HalloWorld.help'
上記の1行を適当に追加してください。
この状態で、make applehelpを行うと、apple help fileが作成されます。 ただし、この状態では、アプリケーションバンドルにはコピーされませんし、ヘルプメニューから呼び出すこともできません。
XCodeにスクリプトフェーズの追加
XCodeでビルドした時に、自動でsphinxのmakeファイルを呼び出すために追加します。
追加したコードを以下に示します。
cd "./sphinx/"
PATH=${PATH}:/opt/local/bin
make applehelp
PATHに/opt/local/binを追加しているのは、私がMacPortsを使用しているため。他の方法でsphinxをインストールしてるならば別の場所のPATHを書いてください。
この時点で、XCode上でsphinxもビルド可能になります。
apple help book fileをResorceとして追加
XCode上で一度ビルドすると、”./sphinx/build/applehelp/”に、”HalloWorld.help”というapple help bookバンドルができます。 これを”Copy Bundle Resources”に追加します。
これで、XCode上でビルドすると、アプリケーションバンドルに含まれるようになります。
info.plistの変更
最後に、info.plistに以下の2項目を追加して、アプリケーションにバンドル内のApple help bookを認識させます。
| キー | 値 | 説明 |
|---|---|---|
| CFBundleHelpBookName | com.mindto01s.HalloWorld.help | conf.pyで設定したapplehelp_bundle_idの値 |
| CFBundleHelpBookFolder | HalloWorld.help | AppleHelpBookのフォルダ名 |
これで、アプリ実行後に、Helpメニューから”HalloWorld Help”を選ぶと以下のページが表示される。
Apple help book作成に関連するSphixの設定
Sphinxのoption項目で、Apple help bookに関連する項目の一覧です。
apple help book bundle用info.plsitの設定
- applehelp_bundle_name
- Apple Help Bookのベース名です。デフォルトでproject名が使用される。
- applehelp_bundle_id
- Apple Help BookのバンドルID(必須)。CFBundleIdentifierに反映される。
- applehelp_dev_region
- Apple Help BookのCFBundleDevelopmentRegionに反映される。デフォルトで’en-us’
- applehelp_bundle_version
- Apple Help Bookのバージョン文字列。デフォルトで1。CFBundleVersionに反映される。
多分、applehelp_bundle_id以外は設定しないで良いハズ。
その他の設定
- applehelp_disable_external_tools
- この値がTrueだと、indexerやcodesignなどのコマンドラインツールを呼び出しません。つまり、MacOSX以外でビルドのテストを使用するときに使います。デフォルトで、false。
- applehelp_locale
- バンドルのResourceフォルダーの中のロケールフォルダー(*.lproj)の生成に使われます。ここが、enならば、en.lprojを生成し、jpnならば、jp.lprojを生成します。デフォルトでlanguageの値。
- applehelp_icon
- Apple Help Book用の16x16ピクセルのアイコンのファイル名。Apple Helpのリスト表示などの使われます。
必須でないけと設定してiconを作成しないとみっともないので、applehelp_iconは設定した方が良い。その他は設定は不要と思います。
出力されるhtmlファイルの設定
- applehelp_title
- ヘルプファイルのタイトルの設定。デフォルトでは ‘<project> Help’です。 info.plistのHPDBookTitleの変更と、html中の<title>タグの変更。
- apple help bookの出力は、既存のhtml出力のビルダーから継承されているので、html関連のoptionを変更すると変更できます。
- このapplehelp_title項目は設定しなくても良いと思います。
indexer用の設定
ヘルプファイルのindexを作成するためのコマンドラインツール用のoptionです。多分使わない。
- applehelp_indexer_path
- hiutilコマンドへのパスの変更。変更する必要なし。
- applehelp_index_anchors
- コード上からAppleHelpBookのページを呼び出すための、アンカー用indexを作成するか否か。Trueにする。アンカーの表記方法は知らない。
- applehelp_min_term_length
- hiutilに渡すminmum term lengthの引数。an とかtheとかをindexに含めないようにするためのもの。変更の必要はないだろう。
- applehelp_stopwords
- hiutilに渡すstop wordの引数。’about’や’then’などの単語をindexに含めないように、あらかじめstopWordとして登録しておいた単語を指定するためのもの。普通は変更する必要なし。デフォルトの登録内容でOK.
codesignの設定
apple help book バンドルに署名する必要があるときに使用するらしい。使うことがあるとは思えない。
- applehelp_codesign_identity
- 設定されている場合は、この値に設定されているidentityでコードサインされる。デフォルトでは、環境変数CODE_SIGN_IDENTITYに使われている値を使用する。
- applehelp_codesign_flags
- 設定されている場合は、この値のオプションをcodesignコマンドのオプションとして使用する。デフォルトでは環境変数OTHER_CODE_SIGN_FLAGSに使われている値を使用する。
- applehelp_codesign_path
- コマンドcodesignへのパスを変更するためにあるらしいが、使うことはないハズ。
リモートアクセス系の出力のオプション
Apple Help Bookはネット経由でダウンロード出来たり、知識ベース(サポート掲示板を格好良くいう言葉らしい)へアクセスできるらしいが、使ったことはない。
- applehelp_kb_product
- ナレッジベースへのURLの基本部分。デフォルトでは、’<project>-<release>’.
- applehelp_kb_url
- 知識ベースへのURL
- applehelp_remote_url
- リモートコンテンツへのURL
多分、これからも使わないと思います。
参考資料とソースコード
プロジェクトファイルはここに置いてきます。( HalloWorld.zip )
- 使っている人はここの人ぐらいかも。
- https://alastairs-place.net/blog/2015/01/14/apple-help-in-2015/
- Apple Help Book自体の解説はこちらを参考にしてください。
- https://developer.apple.com/library/mac/documentation/Carbon/Conceptual/ProvidingUserAssitAppleHelp/user_help_concepts/apple_help_concepts.html
- Apple Help Bookの構造自体はこちらの解説の方がわかりやすかったです。
- http://devzone.touchdude.com/step-step-create-apple-help-your-cocoa-xcode-application
- Sphinxの設定ファイルの書き方は本家が一番わかりやすいです。
- http://www.sphinx-doc.org/ja/stable/config.html
じゃあね。