さいどうにっき

趣味や日常などを不定期で書いていきます

提督始めました

昨日は僕の誕生日でした。もう18です。実感ない。

日付が変わってからしばらくTwitterに出没した後、「そうだDMMのネトゲ登録しよう」と思い立ちました。
ネトゲの方は18歳以上でないと登録できず(DMM.comそのものは18歳未満でも登録可能でした)、 めちゃめちゃやりたかった艦これが始められずにいたからです。

これで艦これできる…と思いながら登録を済ませ、どうせならと艦これを開いてみました。 そしたらなんとなんと、サーバーに空きがあったのです。

今までTwitterで見たり知人友人に話を聞いたりした限りでは、「まず着任までに運が必要」とのことだったので、 非常にラッキーというか、渡りに船でした。

こうして僕の鎮守府ライフが始まりました。初期艦は見た目が一番カッコよかった叢雲です。

その後もTwitterで実況をしていたのですが、リーダー殿に「ゲームされるとイラつくから黙るか進捗生やせ」と叱られたので黙って進捗してました。
テザリング回線でQiita行けないの本当クソ。

そして遂に。

念願の響をゲットしました。
一番欲しかった艦娘なので、本当に嬉しかったです。深夜に一人でガッツポーズしました。

今は1-3まで攻略し、眼帯の2人組を第1艦隊と第2艦隊の旗艦にしてレベリングを頑張ってます。
ブロンズによると1-5でゴーヤがドロップするとのことなので、早くお迎えに行きたいでち。

android-caffe-demoを動かす時につまづいたこと

こういう類のアプリでは珍しく(?)助け舟がなかったので自分が助け舟になれればと思って書きます。

android-caffe-demoを使えるかどうか検討していたのですが、 そこで躓いたこととその解決法を幾つか書いていきます。

動したはいいけど写真を撮ったらぬるぽ出て落ちる

これはSONYのExperia Z4を使っていた時のバグです(しかもモデルを入れ忘れていた)。 確かfileUrinullだったと思います。 なんとか回避する方法を探していたのですが、いつの間にか出なくなってしまったので解決策は分かりません。 また、原因も分からないまま問題が解決してしまいました。

モデル入れたら画面が黒くなったり復活したりして最終的に落ちる

これもExperia Z4でのバグです。 どうやらモデルの読み込みをしているようなのですが、何故か失敗しているらしく画面がいつまで経っても描画されませんでした。 その時は思いつきもしなかったのですが、別スレッドで動かすと上手くいくかもしれません。 また、Nexus5を使うとうまくいったので、ここからはそれでデモアプリの実行をしています。

ぬるぽは出なくなったけど撮り終わった後とか画像選んだ後になぜか落ちる

これはモデルを入れていないのが原因です. android-caffe-libUsageを実行すれば動くようになります。

DeadObjectExceptionが出て落ちる

これも最初の躓きと同様、いつの間にか直っていたので原因も解決策も分かりませんでした。 ただ、DeadObjectExceptionメッセンジャーのホストまたはクライアントが死んでる(多分GCに持って行かれてる)時に出るようなので、 もしかしたらそれが原因かもしれません。

最後に

これまで僕は、先人の方々が書いた記事にたくさんお世話になってきました。 ですが、今回に限ってはどうやら僕が先人になってしまったようです。 この記事を書いたのは、先人への憧れと、先人になりたいというぼんやりした夢があったからです なるべく分かりやすく詳細に書いたつもりではありますが、分からなかったらごめんなさい。 少しでもandroid-caffeを使う方のお力になれれば幸いです。

PCK2015プログラミング部門予選参加録

予選に参加してから多分2週間か3週間くらい経ってるのにまだ書いてないのを思い出したから頑張る。 ちなみに結果は7完、本選通過ならずだった。地域枠を久留米と鹿児島に持って行かれたのは悔しい。

問題

1問目

パートナーに解いてもらった。

2問目

パートナーと一緒に解いた。 余りの切り捨てを利用した解き方を教える。 定数オーダー最高。

3問目

同上。

4問目

パートナーと一緒に解いた。 条件設定間違えて1WA


ここからは基本的に自分1人で解いてる。

5問目

バケットで簡単にできるのにわざわざSTL使って解いてた。 この辺りが一番頭固い時間帯

6問目

差分で解くまでは思いついたけど変更のやり方が遠回りでプログラムがわかりづらくなっていた。 ここで結構WAが出たがなんとかAC。実は7問目より後に解いてる。

7問目

一度ポインタでやろうとしてミスったけど、Union-Find木を使うことを思いついて無事AC


ここからはACできなかった問題

8問目

正規表現ゲーじゃん!と思ってJavaでやったけどダメだった(当然)

9問目

ぱっと見幾何っぽかったし残り時間少なかったのもあって全然解法が思いつかなかった。

10問目

問題タイトルしか見てない。

反省点

  • パートナーの育成に時間をかけなかった
    実質1週間くらいでC++の基本とかSTLまで色々教えたからかパートナーの頭がついていけず、 僕がコーディングを手伝うことがよくあった。 1ヶ月くらいじっくりできれば、もっと余裕が持てたように思う。
    場合によっては主要なアルゴリズムとデータ構造(今回使ったUnion-Find木とか)まで教えられたかも。

  • 提出前に自分のプログラムを見直さなかった 特に6問目。WAが出てからコードを見直すとすぐにバグの原因が見つかることがよくあり、 そのせいで3つか4つはWAが出ていた。

  • 自分のプログラムが潰されるケースを考えなかった
    テストケースではカバーしていない類の入力があるのは当然だが、そのことに考えが及ばず間違えることがあった。 特に多数の入力(例えば1000文字を超えるようなもの)が与えられる問題では実際に試す余裕がないため、 そういう問題こそしっかり考えて提出すべきだった。

良かった点

  • 必要なものがすぐ思いついた(ACした問題で)
    特に6問目と7問目。 実装の段階でミスをすることもあったが、考えていた解法はだいたい想定解だったと思う(5問目は例外)。

  • 予想より多くの問題を解けた
    多分5完、せいぜい6完だと思っていたが、結果は7完と非常に喜ばしいものだった。 WAはそこそこあったが、地域枠であれば充分に狙える順位までいけたのは本当に嬉しい。 本選行けなかったけど。

最後に

PCKは今年が最後だけど、あまり得意ではなかった競技で結構いい結果を残せて良かった。 本選では惜しくも開発だけの勝負になるが、こっちは得意分野だし普通に30万とPCとお米貰って帰って来ると思う。

ハッカーズ?何それ?おいしいの?

JavaScriptでライフゲーム作った

こんばんは。

前回の更新から一週間経たずにまた更新です。実際短期間な。

タイトルにもある通り、JSでライフゲーム作りました。
コーディング欲が満たされてとても良いです。

縦横の長さを指定してボタンを押すと始まります。
停止ボタンを押すと止まります。そのうち再開ボタンつけたいです。

300x300まで動くことを確認済みです。1000x1000投げたら落ちました。
とある方が10万x10万とか投げてサーバに負担を与えようとしていましたが、ローカル実行なので自分の首締めるだけです。
圧倒的な自信がある方やマゾヒスト以外はやめましょう。

興味のある方は以下のURLへアクセスしてください。
ライフゲーム -roadagain.org-

今回の苦労話

  • HTML5canvasタグを初めて触りました。絵とか図形とか描けて便利です。
  • JSLintがいちいちうるさい。他人のコーディング規約を守らされるのとても辛いです。インクリメント使わせて。
  • Bracketsのライブプレビューがちょくちょく接続エラー吐きました。でもその後10秒くらいで何故か繋がる不思議。
  • 配列のコピーにconcatを使いましたが、シャローコピーだったので世代を進めるときおかしな挙動してました。

ちなみにソースコードはこんな感じです。
変数名おかしかったりしますがご容赦下さい。

var play;

function initcell(width, height) {
    'use strict';
    var elem = document.getElementById('cell');

    elem.width = width * 10;
    elem.height = height * 10;
}

function drawcell(x, y, cellstate) {
    'use strict';

    var cellbox = document.getElementById('cell').getContext('2d');

    cellbox.fillStyle = cellstate === true ? 'Lime' : 'Black';
    cellbox.fillRect(x * 10 - 10, y * 10 - 10, 10, 10);
}

function next(x, y, cell) {
    'use strict';

    var cnt,
        i,
        j;

    cnt = 0;
    for (i = -1; i <= 1; i += 1) {
        for (j = -1; j <= 1; j += 1) {
            if (cell[x + i][y + j] === true) {
                cnt += 1;
            }
        }
    }
    if (cell[x][y] === true) {
        cnt -= 1;
    }

    if (cnt === 3 && cell[x][y] === false) {
        drawcell(x, y, true);
        return true;
    } else if ((cnt < 2 || 3 < cnt) && cell[x][y] === true) {
        drawcell(x, y, false);
        return false;
    } else {
        return cell[x][y];
    }
}

function stopgameoflife() {
    'use strict';

    window.clearInterval(play);
}

function gameoflife() {
    'use strict';
    var width = Math.floor(document.format.width.valueAsNumber),
        height = Math.floor(document.format.height.valueAsNumber),
        cell,
        i,
        j;

    stopgameoflife();

    cell = [];
    for (i = 0; i < width + 2; i += 1) {
        cell[i] = [];
        cell[i][0] = cell[i][height + 1] = false;
    }
    for (j = 0; j < height + 2; j += 1) {
        cell[0][j] = cell[width + 1][j] = false;
    }
    for (i = 1; i <= width; i += 1) {
        for (j = 1; j <= height; j += 1) {
            cell[i][j] = (Math.random() >= 0.5);
        }
    }

    initcell(width, height);
    for (i = 1; i <= width; i += 1) {
        for (j = 1; j <= height; j += 1) {
            drawcell(i, j, cell[i][j]);
        }
    }

    play = window.setInterval(function () {
        var tmp,
            i,
            j;

        tmp = [];
        for (i = 0; i < width + 2; i += 1) {
            tmp[i] = [];
            for (j = 0; j < height + 2; j += 1) {
                tmp[i][j] = cell[i][j];
            }
        }

        for (i = 1; i <= width; i += 1) {
            for (j = 1; j <= height; j += 1) {
                tmp[i][j] = next(i, j, cell);
            }
        }
        for (i = 1; i <= width; i += 1) {
            for (j = 1; j <= height; j += 1) {
                cell[i][j] = tmp[i][j];
            }
        }
    }, 100);
}

WebサーバーをApacheからNginxに乗り換えた

お久しぶりです。

 

今日はまとめpdfアップのついでに興味のあったNginxに乗り換えてみました。

 

ページのディレクトリをNginx用の場所に移して起動したら何も変わってなかったので実感が沸かないです。

これから細かく更新していけたらいいなあ…

JOI本選に招待されました

_人人人人人人人人人人_

>まさかの2日連続更新<

 ̄Y^Y^Y^Y^Y^Y^Y^Y^ ̄

※今日の記事は超短いです

タイトル通り、JOI本選に招待されました!

ボーダーギリギリの420点で、OkNCTトップ成績だったじん君と2人です。

Twitterでつぶやいたら同じくボーダーだった1年生君にフォローされました。負けそう(こなみかん)

 

それにしても、本選は2月!しかも東京!流石に雪は降らないだろうけどそれでも

_人人人人_

>凍え死ぬ<

 ̄Y^Y^Y^Y ̄

死なないようにゲーセン行って体を温めたい!

 

姫におみや頼まれたけど、果たして買う時間はあるのだろうか…そもそも時間あったとしてもゲーセン行きそう

僕の考える地力について

この記事は、音ゲーマー達の発信所3枠目17日目のものとして書かれました。

 

皆様始めまして。コーヤ・ロードアゲイン(@ringoh72)といいます。

主にBEMANI(特にDDR)をメインにやっており、音ゲーではKOYA72という名前を使っております。ただ、色んな音ゲーを中途半端にやってます(周囲の人たちにはよく「音ゲーオールラウンダー」とか呼ばれてますが、広く浅くやってるだけです)あわよくばフレンドやらライバルやらの登録を

 

地力について語ろうと思ったら既に被っていましたが、そんなことは気にせず僕なりの地力理論()について書いていきます。

 

僕は、地力は大きく分けて

  • 認識力
  • 処理能力

の2種類だと考えています。

同程度の物量は捌けるはずなのに認識できなくて結局ガチャガチャ押しちゃう、見えてるけど押せない、という僕の経験を下にしています。

 

認識力

文字通り、譜面をしっかり認識する能力のことです。「同じ譜面を何度かやったらスコアが上がった」というのは、こちらに深く関係します。

弐寺だと、ノーツがどのレーンから降ってくるのか、それは単押しか、同時押しか、はたまた微ズレか、ロングノーツか、乱打なのか、階段なのか、などなどです。ハイスピードやレーンカバーは、これを補助するためのものと考えます。

「短時間(1小節、1秒など)における譜面傾向を捉える能力」と言い換えてもいいでしょう。

 

譜面が極端に早かったり遅かったり、はたまた癖がつきやすかったりすると、これが顕著に現れます。代表格は七段4曲目のTHE SAFARIです。

知人に言われて初めて気がついたのですが、「癖がつく」というのは認識できない譜面を無理やり押そうとするのを何度もやることで、間違ったまま体が覚えてしまうということなんです。

BMS(LR2だけかな?)だと曲のスピード(ハイスピードではない)を調節したり出来ますよね。遅くした譜面を何度かやって元のスピードに戻すと、出来なかったのが嘘のようにスコアが伸びたりミスが減ったりします。でもAngelic Layer灰は伸びない

1度やった譜面をある程度覚えていると、「ここでこんな感じの譜面が来るはず」といった準備ができるため、譜面が難しくても対応しやすいのでしょう。Tohoku Evolvedはノーツを見てから踏む、なんて真似ができるとは到底思えないので、これがかなり実感できます。また、他のソフラン・停止系の譜面など、ギアチェンジ(ハイスピではなく目が対応するスピードの変更。目線の位置を変えるとか)が重要なものでは心の準備が非常に大切です。覚えずにCHAOSやるとか無理

また、集中や放置効果によって認識力が上がることがありますが、ほとんどが一時的なもので(特に前者)、実際の能力向上とは別物だと考えています。

 

処理能力

譜面を処理する能力です。「見えてるけど押せない」は処理能力が認識力より劣っている場合に起こります。

基本的に処理能力は認識力より上達が遅れ気味になります。「認識してから処理する」という音ゲーの流れが原因です。これはどうしようもありません。

初めて見る譜面パターンに遭遇したとき、つい指が(あるいは腕や足が)慣れている譜面の処理と同じ動きをしてしまった、または動かなかった、という経験はないでしょうか。処理能力の向上は、一部を除き「譜面パターンを体で覚える」ということに他なりません。弐寺ポップンでいう乱ノックがそれにあたります。どういう指の配置をすれば押しやすいか、どういう踏み方をすれば楽になるか、などといったことを考えつつやるともっと良いでしょう。

苦手な譜面があると、似たような傾向の簡単な譜面を探して練習したりすると思います(少なくとも僕はします)。これは上記の通り、似たような譜面パターンを覚えることで苦手譜面に対する処理能力を向上させ、克服を図るものです。

また、いわゆる「体力譜面」の対策をする場合、疲れて処理能力が落ちないよう体力づくりも大事です。1つ1つのパターン自体は簡単だったりすることが多く、いかに疲れないかがものをいいます。僕の場合、エレクリ激がそれにあたります(ノーツは基本的に4分と8分で16分は低速地帯のみ。更にのような「最初と最後が同じ3連」が多い)。

 

最後に

偉そうに見えるかもしれませんが、そこらにいる雑魚が持論を語ったに過ぎません。人それぞれ地力の定義は違うでしょうし、それで言い争うのは無意味なことだと思います。

あくまでも1人の意見として、参考にして頂ければ幸いです。

また、この場を借りて、「音ゲーマー達の発信所」を企画してくださったわんど~さんに、尊敬と感謝の念を申し上げます。