ほげたつブログ

プログラムとアニメーションをかじって生きてる

「名探偵に薔薇を」を読了したので感想

城平京さんの長編ミステリーデビュー作である「名探偵に薔薇を」を読了した。
雨で自転車通勤ができず、通勤電車の中で読もうと思って本屋で手に取ったが、思っていた以上に読みやすく、気付けば夢中になって読んでいた。
以下、多少なりネタバレを含みつつ読後の感想です。



まず自分がこの本を手に取ったきっかけは、城平京さんが絶園のテンペストの作者であった事と、

第一部は良く出来た推理小説
しかし第一部で読むのを止めないでください。
第二部を読み終えた時に、第一部に対する印象が変わります。

という本屋の煽り文句に惹かれたからだ。


第一部は「メルヘン小人地獄」という一つの物語を巡る猟奇的連続殺人の話。
小人達に対して悪行の限りをつくした挙句にあっさりと死んでしまった博士に対し、小人達が抱えていた恨みを晴らすため、ハンナ、ニコラス、フローラの三人を槍玉に挙げて復讐劇を繰り広げるといった内容。
第一部ではそれになぞらえた形で逆さ釣りのまま殺されたり、熱湯で茹で上げられて殺されたりと、猟奇的な殺人劇が繰り広げられる。
しかしその裏側には「小人地獄」という無味無臭で使用後に体内から見つかる事もない完全無欠の毒薬と、それを製造した男と血縁者、それらに関わる者など様々な人間関係が渦巻き、混沌とした中で完全犯罪が囁かれる。
そんな中、名探偵と呼ばれる者が現れ、一つの仮説から心理的な弱みを付き、そこから物証を集めることにより事件を解決へと導くといった内容。
煽り文句で「良く出来た推理小説」と言われるだけあって、素直に楽しんで読み進めることができた。


第二部ではまた「小人地獄」を巡って事件が起こる。
第一部の事件と違うのは動機がないということ。
こちらの事件では殺害方法や犯人は容易に特定できるのだが、果たしてその殺人は罪に問われるべきなのか、という部分において話が繰り広げられる。
第一部もそうだったが、第二部では特に登場人物の心理状況やその背景が念入りに書かれていて、殺害方法や犯人は変わらないのに本当の黒幕が誰なのか、という部分において二転三転する様は読んでいてとても楽しめた。
話の構成的に自分で推理する、ということは難しいかもしれないが、ラスト10ページで大きな「転」が待ち受けているので、最後まで読者を飽きさせない構成になっている。
自分はそこまで本を読む方ではないが、この本だったら自信を持って人に薦められる。



次は同作者による「虚構推理 鋼人七瀬」を読んでみようと思っている。
第12回本格ミステリ大賞も受賞しているようなので期待している。

Visual Studio 2013で可変長テンプレートが対応されたのでdelegateのようなものを作ってみた

カッとなってやった。

template <class T, typename... Args>
class Delegate {
private:
    typedef void (T::*Func)(Args... args);
    std::list<std::tuple<T*, Func> > _funcs;

public:
    void add(T* pObj, Func func) {
        assert(!isExists(pObj, func));
        _funcs.push_back(std::make_tuple(pObj, func));
    }

    void remove(T* pObj, Func func) {
        for (auto it = _funcs.begin(); it != _funcs.end(); ++it) {
            if (pObj == std::get<0>(*it) && func == std::get<1>(*it)) {
                _funcs.erase(it);
                break;
            }
        }
    }

    void clear() {
        _funcs.clear();
    }

    bool isExists(T* pObj, Func func) {
        for (auto it = _funcs.begin(); it != _funcs.end(); ++it) {
            if (pObj == std::get<0>(*it) && func == std::get<1>(*it)) {
                return true;
            }
        }
        return false;
    }

    void call(Args... args) {
        for (auto it = _funcs.begin(); it != _funcs.end(); ++it) {
            auto pObj = std::get<0>(*it);
            auto func = std::get<1>(*it);
            (pObj->*func)(args...);
        }
    }
};

こんな感じに使う。

class Test {
public:
    void foo(int v1, float v2) {}
    void bar(int v1, float v2) {}
};

Test t;
Delegate<Test, int, float> d;
d.add(&t, &Test::foo);
d.add(&t, &Test::bar);
d.call(1, 2.0f);

同じインスタンスの同じメンバ関数は同時に登録できない。
リストの中身はタプルにしたけどもっと良い方法は無いかな?
もちろんお仕事では使えない。(コンパイラが云々かんぬん)

同じ内容でQiitaにも投稿してる。
http://qiita.com/HogeTatu/items/188eadefe191db822823

2014年の目標

明けましておめでとうございます。

簡単に今年の目標を書いておく。

プログラマとしての武器を作る

自分は器用貧乏であり、何でもそこそこできて手を動かすのが早い。
コンシューマ機向けのゲームプログラムを専門にしている弊社において、サーバーサイドやスクリプト、開発環境整備周りの知識も持っていることもあり、重宝されている自覚はある。
が、どの分野においても専門家には到底及ばない知識しか持っておらず、何でもできるが何もできない自分に対して酷くコンプレックスを持っている。
今年は何か自身を持てる分野を見つけ、伸ばしていきたい。
(最近になってコレかな?って思えるものができつつあるので、それはまた別に記事にしたい)

仕事以外でコードを書く時間を増やす

GitHubに草を生やせるようにしたい。
Unity2Dで何か作ってみようかと思ってる。

今まで読んでなかった本やエッセイを読む。

今まで技術書かミステリかライトノベルくらいしか読んでなかったので、もう少し幅を広げたい。
最近は空いた時間でポール・グレアムの日本語訳されたエッセイを読んでる。

プログラマとして前に出ていく

ハッカソンとかGameJamとかに出て、モノづくりに貪欲な人達と話してみたい。

運動する時間を増やす

数ヶ月やってないけどボルダリングを再開するか、自転車を始めるか。
フットサルとランニングは継続したい。
地域のマラソン大会に出ようかなって思ってる。


とりあえずソシャゲと無駄遣いを辞めて色々と余裕ができつつあるので、実りのある一年にしたいと思ってる。
あと彼女とかできればもっと楽しくなるのかなー。

Havok製モバイル向けゲームエンジン「Project Anarchy」を動かしてみた

Intel傘下Havokの完全無料の3Dエンジンが供用を開始, Unityと並ぶ選択肢に | TechCrunch Japan

HavokがUnityに対抗してゲームエンジンの提供を始めたという事で、チュートリアルをやってみた。

Project Anarchyとは?

以下、公式より抜粋。

Project Anarchyはモバイル端末向けの総合的なゲームエンジンおよび最先端なツールセットです。 また、Project Anarchyユーザーの活発なゲームデベロッパーコミュニティがあり、www.projectanarchy.com/jpにて誰でも参加できます。 Project Anarchyには、iOSAndroid、およびTizenプラットフォーム向けにゲームをリリースできる完全無償ライセンスが付いています。

無料なのに、なんだか凄そう(小並感)

Windowsで開発して、iOSでパブリッシュする時にMacを使うって感じなのか。
個人的にはVisual Studioが使い慣れているので歓迎ですが、若干の面倒臭さは感じますね。
とはいえ無料版でも部分的にソースコードを公開しているようなので、それを見るのも勉強になりそう。
あとUnityと違ってC++で書ける。
(C#でも書けるので、パフォーマンスと開発効率を天秤にかける感じかな)

とりあえずインストールしてみる。

インストール

Download | Project Anarchy
上記のページからインストーラを落とし、手順に従ってインストールを行う。
今回は以下の項目にチェックを入れてインストールした。

Windows

  • Havok Anarchy SDK for Windows
  • Havok Anarchy SDK for Android and Tizen
  • Havok Anarchy Samples for Windows
  • Havok Anarchy Samples for Android and Tizen
  • Havok Animation Studio
  • Scaleform GFx - Windows
  • Scaleform GFx - Android ARM
  • Scaleform GFx - Android x86

Mac

  • Havok Anarchy iOS SDK
  • Havok Anarchy iOS Samples


ひとまず色々と入れてみたけど、結構時間かかった…。
Androidはadt-bundleとかndkとかインストールしておく必要がある(それの手順は省略)

とりあえず動かしてみた

サンプルのソリューションをVS2010で起動。

\AnarchySDK\Workspace\Win32_VS2010_anarchy_DX9_C++\HavokVision_Samples_Win32_VS2010_anarchy_DX9_C++.sln

Totorial01DX9をスタートアッププロジェクトに設定して、ビルド→実行!

Error !

Unable to connect to vForge! Please ensure that vForge is running. (Please refer to the documentation for further information.)

ふむふむ。
vForgeってのを起動しておけばいいのね。

以下のディレクトリにあった。

\AnarchySDK\Bin\win32_vs2010_anarchy\dev_dll\DX9\vForge.exe

vForgeを起動して、再度実行!

f:id:hogetatu:20131223015057j:plain

動いた!

Tutorial01.cpp を見てみると、シーンの読み込みは以下のようになっている。

virtual void Init() HKV_OVERRIDE
{
    LoadScene(VisAppLoadSettings("ViewerMap.vscene", ":havok_sdk/Data/Vision/Samples/Engine/Maps/ViewerMap"));
}


ちなみにViewerMap.vsceneをvForgeで見てみると、

f:id:hogetatu:20131223021904j:plain

まだほとんど見れてないけど、デバッグ機能でリソースのリロードがあったので、VS2010で実行しつつ、vForgeで編集してリロード・確認って感じなのかな。


意外とさっくりサンプルの実行まではいけた。
年末年始と忙しいけど、もうちょっとじっくり見ていきたい。

パッケージにアンダースコアが入っていた場合にJNI関連でハマったのでメモ

Qiitaに投稿した。
Java - パッケージにアンダースコアが入っていた場合にJNI関連でハマったのでメモ - Qiita [キータ]

cocos2d-xとかでクロスプラットフォーム開発やる時にJNIを書かないといけない場面が多々あるけど、シミュレータだけハングする問題とか色々と落とし穴があって面倒。

あと毎年の事だけど、勤労感謝の日に出勤してた。

中堅と呼ばれ始めたゲームプログラマだけど、新人時代の事を書いてみる

入社前

普通の高専生だった。総合的には平均以下の学力で、プログラムに関しても授業でCをちょっとやっていたくらいだったから、インターンで日立に行った時に書いたプログラムを見せたら「高専生ってこれくらいのレベルなんだ…」って驚かれ方をされるくらいには酷かった。まぁ高専生なんてこんなもんだよね。全体的にヌルい。大体は学校のコネで仕事を決めて、そこで定年まで安定した仕事ができればいいなって感じにゆるく考えてる。

就職活動の時期になってから、ゲーム好きだしゲーム作る仕事がしたいなって気持ちが出てきてコンシューマ系のゲーム制作会社を片っ端から受けてみた。本当は企画屋をやりたかったけど、競争率が高そうだからプログラマやるかーなんて考えているしまっている糞コード量産機だった。もちろん落ちまくった。でも12月の頭に、最後の一社と決めていた会社から奇跡的に内定を貰えた。

入社

入社したのは名前を出せばゲームをやってない人でも知ってるくらいの中堅ゲーム会社だった。その年の新人は自分を含めて8人。それなりの規模の会社だったので、最初の二ヶ月は研修として色々な部署で仕事体験みたいなことをさせてもらった。それからコンシューマコンテンツ開発部に配属され、プログラムの研修として上長から出された課題に取り組んでいた。その頃は床井研究室にお世話になった。

この頃の自分はよくやっていたなと思う。新人らしくやる気に満ち溢れていた。研修とかいいから早くゲームが作りたいという気持ちが強かったので、課題を終わらせては上長に「そろそろゲームを作らせてくれない?」って感じに催促しに行ってた。新人だから人月の話とか大人の事情なんて知らないし。そうやってしつこくしていたら開発中のDSゲームのソースコードを見せてくれることになった。それからは食い入るようにコードを追っていた。でもそれだけじゃ放置プレイされそうな臭いがプンプンしていたので、目についたコードを綺麗にして上長に見せてドヤァァしていた。忙しいのに本当にウザかったと思うよゴメンね上長。

入社して三ヶ月

念願叶ってDSゲームの開発メンバーとしてアサインされた。テンション上がりまくった。
一週間後、プロジェクトがペンディングした。
もう笑うしかないよね。ちょっと落ち着いた。そのまま夏休みに入った。

夏休み明けから同じメンバーで、新しいプロジェクトがスタートした。ペンディングとは言いつつも、名前とゲームのメインコンテンツ部分を作り替えて同じようなゲームをまた作ってた。他のプログラマはプログラムを書きつつディレクションもやっている上長と、ベテランのプログラマが二人だけだった。その頃も時間を見つけては他の人が書いたコードを読んでいたな。

入社して半年

ベテランプログラマの一人がゲームのメインコンテンツ部分を作っていたのだけど、その人は良くも悪くもベテランでお固い人だったので、遊びとしては面白くないものが出来上がっていた。
そもそも企画から面白くなかったけどね。
とはいえ、実装が真面目過ぎたのが仇となり手触り感がだいぶ悪かった。そしてディレクタは何を思ったか、プロジェクト終盤にメインコンテンツ部分を新人に作り直させるという無謀な決断に出たので、仕方なくフレッシュマンパワー(有り余る時間と体力)を消費して作り直した。作り直し前よりは良い手触り感になったと思うので、やって良かったとは思う。(コードとして綺麗なのかはさておき)
企画は同じだから糞には変わりなかったけどね!
案の定売れなくてチームも解散した。プロジェクトが終わってからは振休で一ヶ月も出社せずに家を守ってた。

二年目

部署移動になった。コンシューマコンテンツ開発部であることは変わりなかったけど。そこで自分の師匠と呼べる人に出会った。自分の人生を変えたと言っても過言じゃない人。とにかく今まで見てきたコードとは違う、美しく合理的なコードを書く人だった。自分はその人のコードに惚れたのだと思う。毎日欠かさずコミットログを漁り、その人がコードに込めた考えを読み取ろうとしていた。それがわかった時は達成感で満たされていたし、わからなかったら意図を教えてもらってた。この頃になると新しい技術やコードの書き方を模索するのに夢中になり、プログラマとしては糞コード量産機からダメプログラマくらいまでには昇格していたと思う。仕事は忙しかったけど、今の自分を形成した大事な一年だった。そして三年目になる直前に、会社が買い取られた。

それから書くのが面倒なくらい色々あって現在(五年目)

ばっちりGとかDとかのソーシャルゲームの大波に飲まれた時期もあったけど、今は小さなゲーム開発会社に転職してプログラマやってる。コンシューマゲーム業界ではそこそこ有名で、技術力で勝負していくような会社なので学ぶことは多い。ダメプログラマから、やっとプログラムで飯食ってますって言えるくらいの普通レベルにはなったと思う。

まとめ

つまり新人の頃は他人の美しいコードでも糞コードでも、とにかく色々と読んでみることが大事ってこと。美しいコードに出会って自分でも書いてみたいと思うようになったら、途端にプログラムは楽しくなる。あと自分はC++を書く機会が多いけど、C#とかPythonとかJavaScriptとか色々と使ってみると視野が広がると思う。PHPはもうお腹いっぱいです。GitHubとかQiitaとか技術系ブログを見れば高いレベルで構築されたプログラムが公開されていたりもするし、読むべきコードは尽きない。自分もまだまだ25歳になったばかりの若造だから、もう一つ上のステップに行きたいと思ってる。