Note

サイト
最近のコメント
 | 

2012-05-25

[] 極限脱出 善人シボウデス

前作のときほどのめり込めませんでした。

シナリオについては投げっぱなしであることが酷いのとゲームオーバーがやっつけ過ぎるのを除けばまあ。脱出ゲームというより延々パズルを解かされてた気がするのもまあ。プレイヤー推理の余地がないのもアンビデックスゲームに意味が無いのも前作で承知してましたし。

このゲームに入り込めなかった理由はそんなところにはないのです。

このゲームは3DSとVitaで同時発売されています公式サイトスクリーンショットがVita版であることからもわかりますように、Vita版こそがメインで、3DS版はやっつけ対応です。そして、私はMr.Fに借りた3DS版でプレイしました。そういうことです。

これからこのゲームを買う人は、Vita版をお勧めします。(私はVita版をプレイしてるわけではないので、Vita版で下記がどうなってるかわかりません。でも画面見る限り3DS版よりは確実にマシと思われます)

続きを読む

2012-05-18

ytqwerty2012-05-18

[] 打倒ザビエル (PSP版)

k.inabaさんの打倒ザビエルに触発されて、PSP版の烈風伝を引っ張りだしていました。

打倒ザビエルというのは、1546年3月開始のシナリオで初めて、1549年7月よりも早くクリアしてやろうという早解きチャレンジだそうです。

1回目、今川。領土が3あるから織田斎藤を倒して近畿を一掃した後、対本願寺毛利で詰まる。登用している暇がないですし、堅い城に集まられても困りますので、武将は捕らえた時点で仲間になるか死かなわけですよ。よほど運が無い限り初期武将の質が大事になるということに気付きます。

2回目、本願寺。領土が3あって武将の質もいいから。ただし本願寺は質はあっても量がなくて、領土3に対して武将が7名という密度のなさです。なんとか初手で高屋敷と室町御所を同時に落とす配分を見つけて、その後は運にも恵まれ朝倉宗滴や毛利元就が仲間になってくれて順調に最後まで行きました。記録は1549年3月。進行メモを残してあります。あとルートの図。観音寺城でもたついたため東方向への進出が全体的に遅れてしまい、あと半年は早くいけたはず。

ただし、PSP版は主城が40しかないため(k.inabaさんのプレイされてるPC版は64城)、早く終わって当然なのです。だからといってこれの2/3で20ターンクリアができるかといいますとできるわけ無いでしょう無理に決まってますハハハ。

2012-05-06 大雨、雷

俺々コミットメッセージ規約を作るエントリ Part 1

コミットメッセージなんて、一般的にはgit自体のガイドラインGitのコミットメッセージに関する注意点を守ってればなんの問題もないと思います。先頭行は先頭大文字現在形ではじめて、一行開けて詳細云々。

ただ最近gitに慣れてきて、rebase -iしまくるために過去のコミットをgit log --onelone | grepで一発特定できると嬉しい、という特殊事情が私の中だけで発生してまして、そのためにある程度コミットメッセージを統一しておきたくなりました。探しても深く主張しているものはあまり見当たりませんでしたので、俺ルールをどう作るかってエントリです。

全体の体裁

基本的に一行で全て済ませます。一行目に書かないと--onelineに出てこないのでgrepできません。72文字ルールは無視します。

3行目以降の詳細は余程のことがない限り書きません。主流とは逆になると思いますが、diff見たら一発でわかるものを書きなおすのは無駄です。基本的に私よりgitやコンパイラやdiff/grepのほうが賢いので、彼らの邪魔をしないほうがいいです。

ただ、本当に特記しておきたいことは書きます。普段書かないところを書いている、これは何かあったに違いない、ということで、重要なことが目立つ理論。

Initial commit(確定)

Initial commit

Initial commitのコミットメッセージはInitial commitです。

から移行してきた場合Initial commit, import from ...みたいにします。

なんといってもInitial commitはrebaseできません。grepして出てきたIDをろくに確認もせずにrebaseに渡して、なんてやってしまうと事故の元です。Initial commitはすぐに認識できる必要があります。

マージ(確定)

Merge branch 'マージ元' (commit 'ID7桁') into マージ先

並行ブランチ間で何度もマージしたりするので、デフォルトのメッセージだけでは特定ができなくなります。マージ元のコミットIDを付け加えます。

なおgit rebaseはマージコミットの再現に関しては非常に弱くて、自動マージは成功したけどビルドできなくなったからこのファイルも一緒に直さないと……なんてやっててもrebaseすると消失します。--preserve-mergesを付けても自動マージ分しか再現してくれません。

そのため、デフォルトで生成される本文のConflicts:の下に、Reverts:なりModifications:なりRemoves:なり勝手に書き加えて、一緒に変更したファイルをメモっておきます。

submoduleの更新(ほぼ確定)

Update サブモジュールのパス

Updateというのは便利な単語で、何にでも使えるのですが、submodule専用にしたいと今決めました。何しろsubmoduleとしてインポートしている外部ライブラリリポジトリがpush -fされたり、最悪URL移転なんてされてしまうと、何もしなくても過去のコミットが壊れることになります。(この現象は、外部リポジトリも私作だったりすると特に頻繁に発生します) つまりsubmodule関連のコミットは潜在的にrebase -iしたくなるコミットなのです。なので、一般的なUpdateという単語をsubmodule専用にしてしまいます。grepabilityの向上のためです。

バグ修正(ほぼ確定)

Fix ...

Dirty fix ...

この辺はまあいいでしょう。

で、後が問題です。私に限らずその辺のリポジトリを覗かせていただいても、皆さん適当Add ...なんて書いているわけですが、機能の追加なのかモジュールの追加なのかファイルの追加なのかソースコードレベルでの定義の追加なのかごちゃ混ぜで、grepabilityは低いと言わざるを得ません。

ここはひとつ、大きめのリポジトリを覗かせてもらって、wcでもかけてみましょうか……。

(続く)

というわけで本家gitリポジトリコミットメッセージ単語を数えてきました

#!/usr/bin/perl
# 適当に検索して取ってきたソース、誰かに感謝
while ( <> ) {
    @words = split(" ");
    $wc{@words[1]} += 1; # [0]=commit id [1]=first verb
}
foreach $key (keys %wc) {
    print "$wc{$key} $key\n";
}
git --oneline | perl ↑ | sort -n -r | head -n 100 

……ごめんなさい実際にはエディタ機能を使いました。

続きを読む

俺々コミットメッセージ規約を作るエントリ Part 2

↑見てやる気を無くしたので終了します。

grepして一括で過去を書き換えたい需要を考えてみますと、submodule、makefile(いつの間にか別マシンでビルドできなくなってたetc)、readme(晒すのでメールアドレス消したいetc)……要するにメタ情報が多い気がします。

ソースコード本体を修正したいときは、具体的にどのコミットを直すべきなのか特定できているはずですし。

なのでこの辺を、Update submoduleImprove makefileEdit readmeみたいに固定してしまえば、需要は結構満たせる予感がします。Addの使い方なんてどうでも良かったですね。

2012-05-04

[] Ovenモドキ妄想

gcc-4.7ではAda2012のAda.Iterator_Interfacesが実装されました。

コンテナをfor文で回すためのものですが、要するに所謂"range"そのものですので、Ovenの様に連鎖させることもできるはずです。(まあこんなもの無くてもシグネチャを全部自分で決めてしまえば当然どうにでもなりますが、枠組みが標準に入ったのは大きいです)

用語の違い補足。C++iterator=AdaのCursor、C++のrange=AdaのIterator、次の位置を求める操作はC++ではiteratorの++ですがAdaでは(Cursorではなくて)IteratorのNext関数。forward iteratorみたいな種類分けは(Cursorではなくて)Iterator側。

generic
   with package Source_Iterators is new Ada.Iterator_Interfaces (others => <>);
package Generic_Filters is
   -- FilterがTrueを返したCursorのみ抽出
   function Iterate (
      Source : Source_Iterators.Forward_Iterator'Class;
      Filter : not null access function (Position : Source_Iterators.Cursor) return Boolean)
      return Source_Iterators.Forward_Iterator'Class;
private
   -- 実装はこれを読んでいるあなたに任せた
end Generic_Filters;

↑みたいなのを用意しておけば、↓みたいに使えるはずです。

declare
   package Int_Lists is new Ada.Containers.Doubly_Linked_Lists (Integer);
   package Int_Filters is new Generic_Filters (Int_Lists.List_Iterator_Interfaces);
   function Even (X : Int_Lists.Cursor) return Boolean is (Element (X) rem 2 = 0);
   List : Int_Lists.List;
begin
   for I in Int_Filters.Iterate (Int_Lists.Iterate (List), Even'Access) loop
      Put (Element (I)); -- 偶数だけ出てくる
   end loop;
end;

(実はGNATはgenericのformal packageのothers関係が怪しいので、このままですと通らなかったりしますがCursorとHas_Elementを個別のパラメータにしてやれば通ります。タイプ量倍増orz さっさと直らないでしょうか→ http://gcc.gnu.org/bugzilla/show_bug.cgi?id=47748)

で、まあ、こういうのってライブラリとしては面白い反面、意外と使いどころがなかったりするのですが、妄想した範囲で実用的っぽいのは、Unicodeのややこしい操作を単純化するのに使えないかなー、とかなんとか。

   -- Iterate_Code_Pointsは文字列を取ってコードポイント単位のイテレータを返す関数
   for I in Iterate_Code_Points (S, Substitude => ' ') loop
      S (I.First .. I.Last) -- slicing
      To_Wide_Wide_Character (I) -- code point
      Has_Error (I) -- TrueならUTF-*としておかしい
   end loop;
   -- Iterate_Combiningはコードポイント単位のイテレータを取って
   -- Combining Character Sequence単位のイテレータを返す関数
   for I in Iterate_Combining (Iterate_Code_Points (S)) loop
      S (I.First .. I.Last) -- slicing
      Compose (I) -- NFCに
      Decompose (I) -- NFDに
   end loop;
   -- Iterate_Translatingはコードポイント単位のイテレータを取って
   -- Wide_Wide_Character_Mappingを適用する関数
   for I in Iterate_Translating (
      Iterate_Code_Points (S),
      Ada.Strings.Wide_Wide_Maps.Wide_Wide_Constant.Upper_Case_Map)
   loop
      Value (I) -- Ada.Strings.Wide_Wide_Maps.Value (Upper_Case_Map, ...)
   end loop;

これなら、先頭から順次NFCに変換した上でCase Foldingして比較、みたいな処理も簡単に書ける気がします。

どなたか実装しません?

 | 
カレンダー
2004 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2005 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2006 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2012 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2013 | 01 | 02 | 03 |