ネットって狭い

今日(正確には昨日)、友人が諏訪に日帰りで何人かで旅行に行くと言っていた。
そして、Pixivで諏訪に日帰り旅行してきたという発言を見つけた。
確証は無いが、たぶん同じグループだと思う。
ネットって狭いなぁ。

あと前回の結果は、何の問題もなく0に戻っただけでした。
まぁそりゃそうですよね。
クラッシュしたら楽しいだろうな、とかしょうもないこと考える人が自分だけなわけないですしね。

ついでにもう一個小話。
新星間戦記CIVILIZATIONなるゲームを友人に教えられ、それをシステムリソースエラーなしにプレイ出来る用にして欲しいとの依頼を受けました。
なんでも、G.A.S軍後方支援基地(http://www.geocities.jp/sen31086/civilization/)さんの活動に興味を持ったが
既にプログラマーがいるなかに乗り込んで場を乱したく無いが、興味はあるし貢献もしたいので、これはその一環だ、とのこと。

自分はまったくこのゲームについて知りもせず、説明も特に無いために死にまくり。
ぶっちゃけこの時点ではあまり良い印象は持たなかったのですが、エラーの方は興味があったので了承。
その後、エラーを追う過程でゲームのことを理解していった結果、面白さが判ってきて好きになりました。
エラーの方は散々勘違いしまくった結果、原因らしきものまで後一歩という感じですが、
既に勘違いを5回繰り返しているので今回も勘違いかもしれない。
あと、”自機で移動できない方向に移動を繰り返すと敵が動けなくなる”のは誰も気づいていないんだろうか
これやるとシルフィード1000機と他ちょっと居るだけでも2章ラスボス余裕なんですが。
あとシルフィードさん理論上最速言われてたのにあっさり速度で負けるのが納得いかない、論理どこいった

ページフォールト(PageFault)

ページフォールトとは、読み書きといったアクセス不能なアドレスへのアクセス時に発生するイベントである。
と言ってもエラーだけではなく、様々なメモリー管理などでも使われる、極々ありふれたイベントである。

たとえば、実メモリーが不足したため一部仮想メモリーに移した場合、そのまま何もしないでおくと
プロセスが仮想メモリーに移された場所にアクセスすると、アクセスできずに落ちてしまう。
そこで、アクセス時のページフォールトを検出し、仮想メモリー上に対比していたデータを実メモリー上に復帰するといった処理を行う。
他にも、メモリー割り当て要求を受けた際も、最初は仮想的に割り当てるだけで、実際にページフォールトイベントが発生するまで実メモリーは割り当てない
といった使われ方もある。

まぁぶっちゃけこんな説明とかどうでもいいので無視して本題。
このページフォールトですが、WindowsXPではプロセスごとに発生回数を見る事が出来ます。
となるれば当然の疑問が一つ。
「ページフォールト回数が4GB限界(0xFFFFFFFF、4294967295)超えたらどうなるの?」

というわけで、適当に200MB確保しては全部に書き込んで即開放を繰り返すアプリを作って放置してみる事に。
今の速度だと9時間後ぐらいに4GB限界超えるみたいです。
普通に考えれば0に戻るだけだろうけど
さて、どうなることやら

昔からよく言われる

無駄に細かく節約するのに、使うときは一気に使う人、それが自分です。

というわけで、丸1日迷ったフリだけして、たかが目覚ましに9万6千円払う事になりました。
給料明細なんぞ一度も見た事が無い(※見れないのではなく見ない)自分なので、たぶん金銭感覚がおかしいんだと思います。

ふぅ、これで起きれるようになるなら万々歳だし
これでも起きれないなら、それこそ病気か何かを疑うべきなんだろうね、きっと

先人の知恵

やはり大人(自分も法律上は大人だけど)と話すのは良いこと。
自分の視野が以下に狭いかよくわかる。
あと、自分は褒められる事にすっごく弱い事もよくわかった。

昔から特に褒められた覚えが無く
褒められたくて邁進しては、失敗して貶されて終わるか、成功しても「ふーん」で終わるかの二択が多かった。
色々な意味で実力どおりには評価されない自分です、良い意味でも悪い意味でも。

そんなだからか、フィルターなしでダメなら怒るしやれば褒めてくれるうちの上司は色々とたまらない。
今日も帰り際に話し込み、散々おだてられた結果、色々とやる気が出てしまった。
いつも散々起こられているだけに、少なくとも嘘では無いということが分かってしまうのがなおさら性質が悪い。
自分はおだてられたら木に登る豚なんだよちくしょう!

とりあえず、世の中皆うちの上司みたいだったら自分はひねくれなかった気がしました。


話を戻して、哲学的な話?

プログラマーは職業寿命が短いのは有名で、35歳定年説なんてのがその最足るもので
それを考えたら、一年一個の目標を達成して言っても20個も達成できるかどうか、そういう折り返し地点を過ぎたところが君の居る位置だからね。
だいたいこんな話をしてもらいました。

これは頭では理解できるけど実感できない話の最たるもので、なおかつ実感できなければ意味ない話でもある。
だから自分がこれを聞いてするべきことは、これを実感し焦る事が出来るような方法を考える事。
20個の目標というたとえ話事態がそれを促すために考え出されたのだろうと思う。
だからがんばってみようとは思うけれど、経験上出来たためしがないから期待はしていない(とか言っているからダメなんだろうが)

次は対人能力について
自分は今日はじめて気づいたが、普通会話する上では粒度順でソートした上で会話をするべきである、という話をした。
たぶん一般的には当然のことで、自分も相手がそう喋ってくれなければ理解はできないのだが、自分が喋る上で考慮していない事に今更気づかされたわけだ。
上司曰く、大体人間(日本人って区切りの方が近いかも)が持つこの能力は4種類に分けられて
・ソート済みで考え、ソート済みで発言し、ソート済みの前提で聞く人
・ソートせずに考え、ソートせずに発言し、ソートせずに聞く人
・ソートせずに考え、ソートして発言し、ソートしつつ聞く人
・ソート済みで考え、ソート済みで発言し、ソートしつつ聞く人
自分は2番目で、上司は4番目らしい。
才能は絶対量とは言わないまでも、それに近い考え方をする人なので2番目である事は頭良い証拠だとか。
それを聞いて、絶対ないわーと思いつつも頭の中グデングデンになってた馬鹿な自分です。

とりあえず、2番目の人は訓練して3番目になると人生楽になるし得もするけど
うちの会社では重視しないし、致命的って程でもないから、落ち込むほど気にする事は無いとか何とか慰められたというお話です、

最後は会社の事とか技術の事とか色々
たしか、君はもっと情報をアウトプットするべきだといわれた。

同じものならば基本的に先出しした方が有効なのは間違いない。
で、色々考えを回して頭には入っているのに他の人が出すまでそのままで、言われたあとからそれは考えましたじゃ悪くしか思われない。
それどころか、誰も言わなければそのまま出さずに終わるのではもっと悪い。
君はもっと何でも表に出すべきだ。
もちろんソートして順序だてて表現で着ればそれに越した事は無いけれど、無理ならそのまま言うだけでもいい、最悪読み取るのはこっちの仕事。
どんな形であれ0.1でも表に出し続けることは、表に出さずに0で終わらせることよりも何十倍も良いこと。

こんな感じで散々諭されました。
ちなみに言われるのはそろそろ二桁行きそうなぐらい同じ事いわれた記憶があります。
にも関わらず、サイトは閉鎖するわ、配布はやめるわ、ダメダメだね。
心が余りにも弱い、どれだけガラスハートだよ……

不可能だという事は大切なこと

目指す地点が合って、けれどもそれは不可能で、でも限りなく近づく事は出来る。
これって実は素晴らしい、何せ完璧には永遠にたどり着けないから。
つまり、まだ先があると常に確信して進む事が出来る。

まぁ、答えが固定な問題を固定値return以外で解く事になったから思っただけなんですがね。
たぶんもっと高速化する方法はあるはずだけど、固定値returnが最速だと判っている時点で、そんなことに取り組む意欲が無くなってしまったという話。

やはり不可能であるという事は大事だ。
日本人は本質的にマゾだというのもある意味では間違ってないのかもね、本当。

学習をかねて

http://www.itmedia.co.jp/enterprise/articles/1004/03/news002.htmlをやってみた。

まず記事中で紹介されている、人材獲得作戦なる方の回答
ソース
所要時間一時間ちょっと、ただし開始前に食事しつつアルゴリズムを考えていたので2時間と考えた方が良いかも。

自分のアルゴリズム知識量は少ない、少なくともプログラムコンテストで成績を残せる人たちに比べれば天地、そして最短経路問題はうろ覚えのダイクストラしか知らない。
しかもダイクストラなんぞ滅多に使わないため、この問題にダイクストラは向かないと決め付けてしまい、アルゴリズムを自作する羽目になった馬鹿な自分。(使っても対して変わらなかったとは思うけど)
幅優先探索をスタートとゴールの両方からはじめ、最初に範囲が被ったところを最短ルートとする方法で実装。
探索方法は探索先リストをもち、そのリストの場所と隣接しており未探索の部分を次探索リストに追加をスタート側とゴール側で交互に繰り返すだけ。
どこかで見たことあるアルゴリズムだけれど、名前知らないしどこかで習ったアルゴリズムでもない気がするので気にしない。
反省点はstd::vectorを使ったこと。
場所によってイテレーター使ったり添え字アクセスだったり、上下左右のポインターを持たなきゃアクセスできない事を実装始めた後まで気づかなかったり。
まだまだ自分はC++に馴染めていないんだなぁと痛感。
あと、出題にちょっとだけ不満がある。
縦横のサイズはどうやって取得するのかの情報が一切無く、入力終端の判別方法すら指定されていない。
たぶん、そこは問題の本質ではないからどういう形でも好きに実装しろという話なんだろうけど、つい完璧主義に走って無駄な時間を使ってしまった。
でも楽しかったからよし。
そういえば、この回答はきちんとLv4扱いになるのかしら?
書き上げた時のままなのでチューン不足だから、それなりにサイズでかくされちゃうとタイムオーバーしそうな内容なんだけど、
これじゃまだLv3扱いかなーどうかなー

次に、記事中で実際に課された問題。
ソース
所要時間2時間ちょっと。

アルゴリズムは書きながら考えたので粗だらけ、最初にアルゴリズム考える時間30分ぐらい取ってたらコーディング事態は1時間で終わったかも。
1~9のみなので、待ちは順子の隣り合わせ8種/順子の中抜け7種/刻子9種/アタマ9種の計33種。
この中でアタマ9種を除く24種では更にアタマ9種に振り分けて、計225種。
この225種を手牌から成立しうるものに絞込み、その上で残りの手牌から作れる限りの順子と刻子を全探索(実際には重複が出ないようちょっとだけ枝狩りしてる)
そして手牌が0になるパターンに遭遇したら、それを答え配列に追加、これだけ。
最後の全探索が微妙ですが、最大でも手牌12で4つしか作れないからね、たいした計算量にはなら無いだろうという甘い読み。
反省点はまたしてもstd::vectorを使ったこと。
中間表現に散々悩んだ挙句、既に書いたコードを捨て切れなくて「データ変更->探索->データ復元」の流れで配列の中身を追加削除しまくり。
最大でも配列長は13だから、という事で何とかなってますが、読み辛いしコスト高いしで微妙すぎた。
しかも、差し替えたいという気持ちを引きずりすぎたせいで変更復元の流れを作りこむ気になれず、結果としてほぼ同じコードが大量に……
問題への不満点は、擬似麻雀でありながらルールの説明を省きすぎなところ。
具体的には、同じ数字は4つ以上出現するのかどうか(出現するものとして書いた)
(111)(333)(555)(666)[1]なんて回答を許すのかどうかっていうのは結構大きな問題になる。
結構悩んで、問題文を読み返しても特に言及がなく、サンプルでも現出しないパターンだったから投げた、これで違う言われたら泣くね。

これで半日ぐらい潰したが、まぁ楽しかったから良いや