return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));

xcodeでクラッシュする場合の話。

return UIApplicationMain をキャッチしてマウスカーソルを合わせるとEXC_BAD_ACCESSとだけ出る。コンソールログには何も出ていない。ゆえにどこで何が原因かということがまるでわからない。私の場合は特に処理の重いルーチンで発生していて、クラッシュの再現性もできなく不規則的に発生するので困難を極めた。それでもバグを取り除かなければならないのでまず手始めにやることはログの情報量を増やすことから始める。Edit SchemeからDiagnosticsタブでデバッグ時のオプションを選択できるようになっているので、そこからログに関係する項目にチェックしてコンソールに表示される情報を増やす。Loggingの項目のどれでもいいが例えばLog Dynamic Linker API Usageにチェックを入れて実行してみたところ変数名とその値がログに表示されるようになる。とりあえずその状態でデバッグをしてみることにする。クラッシュの再現性は不規則であったが、ログを確認してみると特定の関数内の変数に関わるところでクラッシュしているというのがわかった。クラッシュの原因は厳密にはわからないもののどこでクラッシュが発生しているかという関数の場所はログに表示される変数名から特定することができた。結局原因はプロパティ変数にアクセスする際のささいなミスだったんだけれども。

原因不明のEXC_BAD_ACCESSがでるクラッシュでもデバッグオプションでログの情報量を増やせば怪しい箇所を特定することができる。クラッシュした時に原因となる箇所がログに表示されれば一番いいのだけれど、表示されない場合もあるのでそういう場合は実行中にログを流し続ける設定にしてクラッシュしたらその直前のログをチェックして場所を限定する、という具合にやると厄介なバグでも修正できるかもしれない。

デバッグのオプション設定

Memory Management

Enable Malloc Scribble
Enable Malloc Guard Edges
Enable Guard Malloc
Enable Zonbie Objects

Runtime Sanitization

Enable Address Sanitizer Requires recompilation

Logging

Distributed Objects
Malloc Stack
Log Dynamic Linker API Usage
Log Library Loads

Dubugger

Stop on Debugger() and DebugStr()

スーパーロボット対戦F・完結編 精神検索

精神コマンドから該当するパイロットを一覧する

脱力
ボス、レミー、ミヤマ=アスフィー、レディ、ミオ
激励
さやか、ジュン、メリー、ベス、ハルル、沙羅、タシロ艦長、チャム、マーベル、エレ、シーラ、リリス、アム、ロザミィ、エマ、ファ、エル、イーノ、セシリー、レイン、シュバルツ、テュッティ、リューネ
再動
ギジェ、エレ、リリス、リィナ、リアル系副主人公
復活
シーラ、クリス
クリス、セシリー
補給
メリー、ちずる、ギャリソン、キャオ、カツ、レイン、サフィーネ
自爆
ボス、バーニィ、ヒイロ(とその他省略)

チャーハンをうまく作るコツ

固めのご飯を用意する
極端な事を言えば、おかゆ並みの柔らかいご飯ではどんなに上手い人でもパラパラなチャーハンはできない。固めに炊くか、冷やご飯や冷凍ごはんなどを用意して水分を飛ばして固めにする。
コンロの火力を強くしすぎない
チャーハンは火力とスピードが大事、と上手い人は口を揃えて言うが初心者には高火力をコントロールすることもスピーディに鍋振りする技術もないため失敗する原因になる。調理中も鍋から煙がモクモクと出ているようなら熱くなりすぎている。無理して高火力で調理しようとするとご飯を炒めてパラパラにほぐす前に焦げてしまってダマになりベタッとした仕上がりになってしまう。鍋を温めるまでは高火力で、その後は強火〜中火ぐらいで初心者のうちは慣れるようにする。調理時間の目安はコンロの火力全開で調理する場合は最大でも2分以内に仕上げないと焦げる。
仕上げに酒を振る
水分を飛ばしてパラパラするのがチャーハンだがやりすぎるとパサパサになってしまうことも。仕上げに日本酒を振ることでふっくら仕上げることができる。

鉄フライパンとテフロンフライパン調理結果に違いは出るか

2年前くらいから使用している鉄フライパン(クレープパン)でお好み焼きをまた最近焼き始めたところ、以前に比べて味がやたらと美味しく感じられるようになった。もちろん気のせいかもしれないが。前から作っていたのだけれど、この材料とこの材料を混ぜて焼いたらこんなのができて味も大体こんな感じだろうなと予想の範囲内のものができていたので驚きもなく特に美味しいと感じることもなかった。その後しばらく振りにまた鉄フライパンでお好み焼きでも作ってみようかと作ったところ、予想外に美味しくできてしまったのでテフロンフライパンでも同じように作れるかどうか試してみた。

作ったお好み焼きの具材は、

  • お好み焼きの粉
  • キャベツ
  • 卵1個
  • 薄切り豚バラ肉2枚
  • お好み焼きソース
  • マヨネーズ
  • 粉末かつお削り節

というお好み焼きを作る最低限のものを使った。作り方は説明するまでもないがキャベツをスライサーで2mmの薄さに切ってお好み焼きの粉を水で溶いたものに卵と一緒にいれて混ぜる。あとはフライパンを温めてサラダ油を引いてさっき作った生地を流し込んで上に豚バラ肉を上に載せて焼く。弱火から中火で2分焼いたら裏返して3分~4分焼いて、また裏返して2分焼いてソース・マヨネーズ・かつお削り節をかけて出来上がり。

同じ材料と同じ手順で調理して、鉄フライパンとテフロンフライパンでそれほど違いはでないんじゃないかと思っていたが、個人的な感想だが鉄フライパンで作ったほうが美味しいと思える結果になった。使ったフライパンはテフロンフライパンの方はどこにでも売っている980円くらいのもので鉄フライパンはデバイヤーのクレープパン 20cm

食べた時の食感に違いが大きく、鉄フライパンで作った時はいわゆる外はカリッと中はふわっとしたものに作れる。テフロンフライパンで作った方はそれに比べて若干固く感じられた。

この鉄フライパン固有の特徴でクレープパンという仕様であるため縁が浅く出来ていて、料理が出来上がったらそのまま鍋敷きにでも置けばお皿がわりにも使えて、板厚約2mmで冷めにくいのでお好み焼きを温かいまま食べられるというメリットもある。

鉄フライパンは使い込めば油馴染みがよくなってきて料理がやりやすくなる・・・というようなことがあるらしいが、2年近く使っている私の鉄フライパンにもそういう変化が起こったのかもしれない(傷だらけだけど使い込んでいるわけではないが)

結局、お好み焼きがテフロンより鉄フライパンで美味しく作れた原因はあまりよくわからない。気の長い話だが2年ぐらい鉄フライパンを我慢して使いこめば理屈じゃなくて自然とお好み焼きが美味しく焼けるようになるのかもしれない(ドラゴンボールの超聖水的な意味で)

コンピュータ将棋の思考ルーチンを検討

実際に人間が対局する場合の次の1手をベースに検討してみる。次の1手を検討する場合のチェックポイント。

・相手玉に詰みがあるか
・自玉が王手がかかっているか
・自軍の駒で敵駒の利きが入っている駒はあるか
 ・敵駒の利きに入っている駒の内、味方駒の紐がついているかどうか
・自軍の駒の利きに入っている敵駒はあるか
 ・利きに入っている敵駒の内、敵駒の紐がついているかどうか
・持ち駒がある場合、有効な打ち場所があるか
・序盤であれば玉形を固めることを検討
・飛車先の歩、角道の歩を前進して
攻め駒を押し上げていく
・銀・桂も飛車角に先行して進める

大まかには上から順にこんな感じで次の1手を検討していくのではないだろうか(初心者は)。将棋というゲームは複雑なルールで難しい形勢判断を必要とするため局面によっては上記順序を入れ替えて検討するというのもよくある。駒得をして終盤全力で寄せるというのが一般的だが、局面が有利になるのなら多少駒損はやむを得ないという判断も人間の対局では一般にあり、コンピュータ将棋の思考ルーチンの作成の難しさはその人間の微妙な心理の形勢判断をプログラムとして反映させることにある。

nsmutablearrayの参照コピー仕様

参照コピー・・・というものに慣れていなくて戸惑った。実体を複製するわけではなくて、実体のもつアドレスつまり参照だけコピーするので、コピーされたものに対して変更を加えようとするとコピー元のオリジナルに変更を加えることを意味する。

NSMutableArrayをコピーする場合は参照コピーになる。参照コピーではなくて、実体をコピーする、ハードコピーとかディープコピーとか呼ばれるコピーがしたくてその仕方を色々試してみた。
その方法は下記のようにいくつかある

  • [array mutablecopy]
  • [[NSMutableArray alloc] initWithArray:oldArray copyItems:YES]
  • NSArray* array = [NSKeyedUnarchiver unarchiveObjectWithData:
    [NSKeyedArchiver archivedDataWithRootObject:oldArray]]
  • 上記方法を試してみたが、結論からいうと全部ダメだった。私のやり方が悪いのかなんなのか。何をやっても参照コピーになってしまうので、最後の手段として力づくで複製することにした。つまりnewの段階から新しいオブジェクトを作って、コピー元の要素をループで回して新しいオブジェクトの中に入れるという方法。さすがにこの方法なら複製できる。

    デギンの憂鬱編をプレイ

    ジオンの系譜のデギンの憂鬱編をプレイしてみた。

    55ターンまでやった

    デギンの憂鬱編はプレイヤーはギレン率いるジオン公国を操作して、敵は正統ジオンと新生ジオン。ジオン公国のニュータイプは5人(シャリア・ブル、グレミー・トト、NT-002,003,004)。オールドタイプのエースパイロットはガトーやシーマ、ノリスなど他にもいて人材は十分揃っている。新生ジオンと正統ジオン、手ごわいのは強力なニュータイプがいる正統ジオンの方。シャア、ララァ、クスコ、マリオンウェルチの4人がいてジオングやエルメスに高確率で乗ってくるので非常に苦戦する。したがって先に攻略するのは正統ジオンの方にした(本拠地サイド3に敵本拠地グラナダが近接しているというのも)。

    55ターンほどやってようやく正統ジオンは滅亡させることに成功した。攻略の方針はまず宇宙を手っ取り早くグラナダ以外制圧して、その後正統ジオンが制圧している地上の特別エリアにザンジバルで降下して制圧していくというパターン。グラナダに隣接するエリアは攻めてこられても対応できるように少数のニュータイプ搭乗のジオングやエルメスかノイエジールを配備して対処するようにして、そのまま最終攻略まで閉じ込めておく。シャアなどのニュータイプなどにはシャリア・ブルや002をジオングに乗せて前衛に高アーマーのGBアルファを置いて仕掛ければ2〜3ターンあれば倒せる。

    正統ジオン倒して宇宙を全部制圧した後は地球の新生ジオンだが、もう勝ち確定が見えているためモチベーションが激しくダウン。ニュータイプもいないし、地上ではどのみちサイコミュ兵器も使えないし。エースパイロットもランバラルやドズル、シンマツナガなどは強いことは強いがシャアなどを倒した後では今更というかなんというか。

    モチベーションを維持するためには先に新生ジオンを倒すのがいいかもしれない。ただし正統ジオンを後にするとAランク以上にシャアやララァが成長する可能性もありそうなると手がつけられなくなる。

    デギン編をやってみて発見したことは002が予想以上に強かったこと。Sランクで射撃17、A覚醒なので実質射撃は21にもなる。他には登場ユニットはジオンで生産できるものに限定されているのでZガンダムやキュベレイといった強力なMSがいないのでニュータイプ相手でも数で押せばそのうち倒せるということ。

    NT-002のステータス

    ジオンの系譜に登場するNT-002というパイロットのステータスの射撃値の上限は14と思っていたが17ということに最近気づいた。射撃17と反応14でA覚醒によるボーナスを適用すると実質の最大ステータスは射撃21と反応18になる。NT-001(レイラ)はB覚醒なので実質の最大ステータスは射撃20と反応23になる。指揮と射撃は002の方が優れて魅力と反応は001の方が優れている。魅力の値が0というのがどれだけのデメリットかというのは実感のしづらいところで、顔なしの002だからといって見くびっていたが001とさほど戦闘力的には変わらない印象。

    シナリオの進行ではプロトゼロと001を選ぶか、それとも002,003,004の3人を選ぶか選択するが、002がこれほど強いのなら3人の方を選択するのもアリかもしれない。ちなみにプロトゼロはC覚醒で実質の最大ステータスは射撃23と反応24になる。格闘が19と飛び抜けているが耐久は5とかなり低いので強化人間らしい不安定な特徴を持つ。人材難のアクシズならまだしも豊富なジオン公国ならプロトゼロと001を選択がやはり無難だろうか。

    玉の候補手

    ・自玉に王手がかかっていないか
     ・王手をかけている駒を味方の駒により除く
     ・持ち駒で王手を遮断する(桂馬以外、香、飛車、角による遠距離からの王手)
     ・玉自身で王手をかけている駒を取る
     ・王手のかからない場所へ移動する
     ・移動場所がない場合は相手玉へ王手をかける
     ・逃げ場所もなく相手玉に王手もかけられない→投了

    xcode の Code Sign error

    しばらく振りにアプリのアップデートをするために実機テストをしてみたところprovisioning profileのエラーが出てビルドできなくなっていた。あたらしいファイルをダウンロードしてxcodeで更新してとやってみたところどうやってもエラーが改善しないから試しにと思ってxcodeを終了して再度起動してプロジェクトを開いてビルドしたら勝手にFixしてくれるアラートがでてビルドできるようになった。勘弁してよ。