2014年 個人的お気に入り音楽

TLでやってる人がいたので。
2014年に知った曲の中で個人的に好きな曲です。

安井洋介 - YO-KAI Disco

まもるクンは呪われてしまった! サウンドトラック

まもるクンは呪われてしまった! サウンドトラック

VGMusic of the Day 607 Mamoru Has Been Cursed! YO KAI Disco - YouTube

メロディ、コード進行、アレンジ、音色……全てにおいて最高。
とりあえず聴きましょう。

田村ゆかり - 秘密の扉から会いにきて

秘密の扉から会いにきて

秘密の扉から会いにきて

田村ゆかり/「秘密の扉から会いにきて」MUSIC VIDEO*short ver - YouTube

田村ゆかり x 畑亜貴 x 太田雅友 の組み合わせはずるい。

Dada Life - One Smile

One Smile

One Smile

  • ダダ・ライフ
  • Dance
  • ¥250

Dada Life - One Smile - YouTube

One Smile😄
メイキングが面白い。

まとめ

もっとあるかと思ってましたが、パッと出るくらい記憶に残ってるのはこの3曲。
YO-KAI Discoが一番衝撃でした。こんな曲作りたい。

Twitter公式にアップロードされた画像の高画質版を表示するBookmarklet

[2015/06/01] URLの判定漏れを修正しました。


YoruFukurouでTwitter公式にアップロードされた画像をブラウザで開くと、縮小された画像が表示されますが、細かな文字が潰れて一切読めなくなってしまっていて困ったことが割とあったので、原寸大で表示するBookmarkletを作りました。

Bookmarklet

動作の保障はしません。自己責任で使用してください。

Twitter公式にアップロードされた画像の高画質版を表示するBookmarklet

D&Dでブックマークバーに登録したり、右クリックでブックマークしたりなど、お好きな方法でブックマークしてください。

画像を表示して登録したブックマークを呼び出すと、原寸大の画像が表示されます。

しくみ

javascript:(function(){if(location.href.match(/\/\/.*?\.twimg\.com\/media\//)){document.location=location.href.replace(/:(large|orig)$/,"")+":orig"}})();

単純にURLの末尾に :orig をくっつけているだけです。

すでに原寸表示されている場合と、Twitter公式にアップロードされた画像ではない場合には何もしないようになっています。

ISUCON4 本選に出場した #isucon

(2014/11/10 18:29) 書き直しました。


ISUCON4の予選を学生枠5位でなんとか滑り込めたので、本選に出場してきました。

チーム名は、「☆(ゝω・)vキャピ」です。 アイコンがソーニャの人なんてメンバーにいなかったかもしれませんが、察してください。

本選まで

メンバーのうちの一人が、本選当日の都合が付かなくなり、2名で出場することになりました。 残った自分ともう一人は、複数台のサーバーを組み合わせたWebサービスを作った経験がないため、これは大変なことになってしまったと焦るはめに…… とりあえず抜けるメンバーに聞けるだけいろいろ聞いて、なんとかしようとしました。

事前にやったことは、MySQLレプリケーションの方法と、抜けるメンバーが環境構築をやっていたので、環境構築でしていることの確認です。

本選当日

やりたかったこと

1台で大半の処理、残り2台はひたすら動画を返す、という形を目指していました。 具体的には、全ての処理は一旦メインのサーバーに飛ばし、入稿の場合はメインのサーバーで受けたリクエストをそっくりそのまま動画サーバーに投げ、reportはメインのサーバーが必要な情報を取りまとめるというアプローチです。

やったこと

やりたかったことが完成しなかったため、分散処理は一切できませんでした。 完全に1台で完結しています。

その時点でなぜかは分かりませんでしたが、2号機でベンチマークを回すとスコアがよかったため、2号機を初期実装でセットアップして、最後に提出したベンチマーカーに渡すオプションは2号機のみを指定しました。

というわけで、結果的にやったことは、 「2号機でPython初期実装を動くようにしてベンチマーカーを設定した」 だけです。

一つでも何かできれば、もっとすっきりと終えることができたんですが……

結果

ISUCON4 本選結果 : ISUCON公式Blog

25位 7231 ☆(ゝω・)vキャピ

とにかくFAILはしないようにしようとずっと言っていたので、点数が残せたのはよかったです。

疑問点

特に使いこなせる言語が無かったのでPythonを選択しましたが、初期実装一切弄らず6000点を越えていました。 終わってから他のチームの話を聞いたところ、Rubyの初期実装では1000点もいかなかったらしく……

特にswapしてた感じも無かったはずなので別のなにかしらがあったんだと思いますが、知識不足でよく分かりません。

反省点

  • 予選と同じことをひたすらやらかしたこと
    • 実装してみたものの、デバッグがうまくいかず結局完成しないパターン
  • 環境構築にかなり時間を食ってしまったこと
    • 事前の確認不足
  • 思い込みで動いてしまったこと
    • サーバーのスペックは全て同じ?
      • 2号機と3号機のCPUに差があることに気付かなかった
    • 初期実装の言語間にスコアの差はない?
      • 今回はたまたま運がよかったものの……
    • その想定外の挙動はサーバー側が悪い?
      • AdBlockが邪魔してました! 初歩的すぎて恥ずかしいです!

感想

非常に疲れましたが、非常に面白かったです。 フルメンバーで出場できていればもう少し勝負できたかなと思うと、少し心残りではあります。 でも、こうして一つの会場に集まってがっつりプログラムを書く機会なんて滅多に無いので、いい経験が出来たと思います。 問題を解いていて、気付いたというか学んだ点がたくさんあったので、初期状態で提出してしまったものの、得られたものはあったと思います。 来年も開催するそうなので、また来たいです。 予選突破できるかな……

出題・運営スタッフの方々お疲れ様でした。 とても楽しかったです!

特にテコラスさん! お寿司おいしかったです。 名前覚えました。

写真

f:id:minasa757:20141109015031j:plain

f:id:minasa757:20141109015143j:plain

f:id:minasa757:20141109015017j:plain

f:id:minasa757:20141109014913j:plain

f:id:minasa757:20141109015043j:plain

f:id:minasa757:20141109015058j:plain

ドライブの空き容量を取得する (GetDiskFreeSpaceEx)

WinAPIを使用して接続されているドライブの情報を取得します。

たぶんWindows2000より前では動きません。

参考にしたページ

コード

#include <stdio.h>
#include <windows.h>

int main(void)
{
    DWORD dwDrive;
    char pszDrive[16];
    UINT DriveType;
    BOOL fResult;
    unsigned __int64 i64FreeBytesToCaller, i64TotalBytes, i64FreeBytes;
    char szVolume[256];
    DWORD dwSerial, dwLength, dwFlags;
    char szSystem[256];

    //ドライブレターを順番にチェック
    dwDrive = GetLogicalDrives();
    for (int nDrive = 0; nDrive < 26; nDrive++){

        //そのドライブレターが使用されているか
        if (dwDrive & (1 << nDrive)){
        
            sprintf_s(pszDrive, sizeof(pszDrive), "%c:\\", nDrive + 'A');

            //HDDかどうか
            DriveType = GetDriveTypeA(pszDrive);
            if (DriveType == DRIVE_FIXED || DriveType == DRIVE_REMOVABLE) {

                printf("%s\n", pszDrive);

                fResult = GetVolumeInformationA(pszDrive, szVolume, sizeof(szVolume), &dwSerial, &dwLength, &dwFlags, szSystem, sizeof(szSystem));
                if (fResult) {
                    printf("ボリューム名          :%s\n", szVolume);
                    printf("ボリュームのシリアル番号    :%08X\n", dwSerial);
                    printf("ファイル名の最大の長さ     :%lu\n", dwLength);
                    printf("ファイルシステムのオプション  :%08X\n", dwFlags);
                    printf("ファイルシステム名       :%s\n", szSystem);
                }
                else {
                    printf("エラー:%lu\n", GetLastError());
                }

                fResult = GetDiskFreeSpaceExA(pszDrive, (PULARGE_INTEGER)&i64FreeBytesToCaller, (PULARGE_INTEGER)&i64TotalBytes, (PULARGE_INTEGER)&i64FreeBytes);
                if (fResult) {
                    printf("呼び出し側が利用できるバイト数 :%I64u\n", i64FreeBytesToCaller);
                    printf("ディスク全体のバイト数     :%I64u\n", i64TotalBytes);
                    printf("ディスク全体の空きバイト数   :%I64u\n", i64FreeBytes);
                }
                else {
                    printf("エラー:%lu\n", GetLastError());
                }

                printf("\n");

            }
        }
    }

}

ISUCON4 予選 に出場した

ISUCON4 の予選に出場しました。 同じ大学サークルの友人に釣られ、もう一人後輩を釣って3人で出ました。 アレがアレなのでチームについてはアレします。

予選まで

メンバーを集めて2回勉強会を開きました。

1回目

  • 計測周り、memcached、クエリ高速化についてそれぞれ喋る
  • ISUCON3予選問題をやる

2回目

  • ISUCON3予選問題の前回の続きをやる
  • 当日の動きを詰める
  • アプローチの立て方を研究

本番では自分はアプリケーションサーバ側でやれることをやる感じになったので、9月中はそのことについて調べたりしていました。

EC2のインスタンス用意して練習したかったんですが、クレジットカード持ってないですし、Vプリカ買う余裕もなくて結局やりませんでした。

運営さん!予選もchefのcookbook用意してください!

予選本番

とにかく計測第一ということを勉強会で言われたので、とりあえずアプリを触ってみつつ、スロークエリログを見たりdstat見たりアクセスログみたりしてから動き出しました。

自分がやったこと

  • PSGIサーバをStarmanからStarletに変更
  • テーブルにインデックスを張る

失敗

  • nginxとappの通信をTCPからUNIX domain socketへ
    • app側は変更してサーバ周り担当に投げたものの結局反映させず放置
      • とにかく一番遅い部分を直そうと放置してしまったけど直せばよかった
  • banとlockの判定が重いので高速化
    • 遅いクエリがやっていることをそのままPerl+memcachedに落とし込もうとして失敗
    • ベンチのログを見ると、ログインできないはずがログインできてしまっているのでロジックのバグを疑って再実装
    • 同じエラーが出続けるのでロジックをひたすら弄る
      • 今思えばキャッシュ更新のタイミングが悪かったのでは……

こう見るとなにもしてないですね…… banとlockの判定処理を修正するのに時間かけすぎました。

反省

何度も気をつけようと言っていた無茶なアプローチをやってしまったのが一番くやしい! ロジックの再実装はまず既存のコードを完全に理解した上でコーディングしなければならなくて、とてつもなく時間がかかるし、デバッグも大変です。 初期実装自体は、よほど酷い何かが無い限り、弄らないで進めた方がよかったのかもしれません。

1つの問題に3人でとりかかってしまっていたこともあったりと、折角のリソースを生かしきれていなかったように感じました。 それぞれが独立して動ける体制が最高ですが、それには全員が技術を持っていないと難しいとも思います。

受け身な感じで単に投げられたアプローチをそのまま実装するといった思考停止していた場面があったので、落ち着いてそれが正しいのか流されず判断できればよかったです。

感想

IT系の競技というと競技プログラミングくらいしか知らなかったので、こんな形で競えるのかという意外性がとても面白かったです。

ACM-ICPCに出た時も感じましたが、チーム制の競技はチームワークが何よりも大事だと思います。 チームで作業している以上、技術よりチームを回す方が大切になります。 コミュニケーションはそれなりに大きいオーバヘッドですが、生かせればそれ以上にいろいろなことができるようになれる気がしました。

もちろん技術不足も作業中に何度も感じました。 特に、問題が起きた時にパッと思い付く原因の可能性がある箇所の数が少ないと、そこから何もできなくなってしまうので、もっとトラブルに遭遇できるようにいろいろ動かしてみたいです。

YAPC::Asia Tokyo 2014 に行った

YAPC::Asia Tokyo 2014 に初参加してきました。 ブログ書こうってめっちゃ言ってたので感想を書きます。

参加まで

存在自体は前から知っていて、2011年に関東に出てきてから行ってみたいなとは思っていたんですが、気付いたらチケット売り切れてたりとかでなかなか参加できず。 今年はたまたまTwitterYAPCのチケット発売の情報を見つけて、学生無料だし、Larry Wallさんを見れるっぽいという超適当な理由でチケット取りました。 結局Larry Wallさんは来日できなかったので残念でしたが、手術されてるということで早く元気になってほしいです。

学生チケットだったので2日間通しで参加できたのですが、29日の早朝に実家から関東に到着した時点で体調が優れなかったのでその日は直帰して爆睡、結局2日目午後のみの参加でした。

全体的に

初参加で右も左も分からないままうろうろしたり適当にトーク聞いたりしてました。 1階の駅と繋がってる部分から入ったら、受付の場所が分からなくて2階を一周してしまったので、階段登ったところにでも受付の方向が書いてあるとよかったと思います。

トークは噂通りPerlの内容はほぼ無し。でも知らない話だらけで面白かったし、よい刺激になりました。細かい感想は後述。

ぼっち参加だったので交流とか全く出来なかったのが残念でした。怖そうなおじさましか居ない。 輪に入れるような企画とかあればとも思いましたが、それはそれでつらいしどうにもならないですね。 交流したければ自ら動くべしという事でしょうか。

各トークについて

聞くトークを決めずに会場をふらふらしてしまいまして、中盤から入って内容がよく掴めてないものとかがあったり。ちゃんと計画立てるべきですね。

Plack for Fun and Profit (But Mostly Profit)

PSGI/Plackとそれを用いたサイト運用の話。 大規模なサイトの運用にもまだまだPerlが使われているらしい。 ちゃんと儲けようぜという姿勢はとても見習いたいと感じました。

Perl For (Non?) Perl Mongers

Perlは悪い言語じゃないよという話。 軽く触れていく感じで紹介してたので、もうちょっと深く掘り下げて話を聞きたかった。

そんなにビッグでもないデータ処理手法の話

GB〜TB規模のデータ処理にはどんなミドルウェアを使えばいいかという話。 HadoopMapReduceがとても気になったけど、データ処理する機会が無い……

Lightning Talks Day 2

LTの勢いのある喋りは別の勉強会などの配信で見てても楽しいし、実際の会場で見るとより楽しいです。 特にSawyer XさんのLTは完全に言葉の壁越えてて最高でした。

TDDはとても重要だと思ったので真似していきたいです。 ただ、上を見過ぎると自分のキャパを越えてしまうので、その辺りの制御は難しいところ。

キーノート

20代の経験は非常に大事とのこと。もちろんそれまでもそれ以降も大事でしょうが、それぞれの年代にしかない意義みたいなものはありそうなので、自分がどうなりたいかとかは常に意識して動ければと思いました。

まとめ

せっかく人が集まってるので、聞くだけではなく交流やら発信やらしたいととにかく思いました。 そのためには何かしらの成果を持っていたいのですが、書いているものといえば細々したスクリプトばかり…… 何か作ると言うと、Webサービスを作るといった大規模で必要なものが多くハードルが高いものををどうしても考えてしまうんですが、OSSにコミットしたりCPANにモジュール書いたりといろいろ首を突っ込める方法はありそうなので、そういうことを見つけては首を突っ込めるように頑張ります。

VimをHaxeの開発環境にしたい

まだ探り探りの状態です。

とりあえずjdonaldson/vaxeShougo/neocomplete.vimは入れました。
.vimrcの設定は以下のような感じです。

" Shougo/neocomplete.vim -------------------------
let g:neocomplete#enable_at_startup = 1
let g:neocomplete#enable_smart_case = 1
let g:neocomplete#force_overwrite_completefunc = 1

if !exists('g:neocomplete#force_omni_input_patterns')
    let g:neocomplete#force_omni_input_patterns = {}
endif
let g:neocomplete#force_omni_input_patterns.haxe = '\v([\]''"\)]|\w|(^\s*))(\.|\()'

" jdonaldson/vaxe --------------------------------
autocmd FileType haxe setlocal autowrite
autocmd FileType hxml setlocal autowrite
autocmd FileType nmml.xml setlocal autowrite

"let g:vaxe_lime_target = "mac -neko"

残念ながらneocomplete.vimのomni補完には対応していないようなので、force_omni_input_patternsからvim標準のomni補完を呼び出しています。

g:vaxe_lime_targetは、毎回どのターゲットにするか聞かれるのが邪魔な人向けです。 自分は開発時はmac -nekoに決め打ちにしておいて、リリース時にはシェル上から任意のターゲットを指定してビルドするという流れを想定してこの設定にしました。

課題

  • makeした後のメッセージをvim上に出力したい
  • デバッグがやりづらい

参考にしたサイト