shikato's blog

Software Engineerをやっている人間のブログです。きんいろモザイクが好きでした。

いろいろ整理した

mups β
f:id:alexam:20150507015944p:plain
photo(Google Keep note art) by sage_solar

生まれ変わるらしい、、


otoge.net 終了のお知らせ
f:id:alexam:20150507051927p:plain

重要なお知らせ
誠に勝手ながら、2015年5月6日をもちまして「otoge.net」のサービス提供を終了させていただきます。
otoge.netは2012年のサービス開始以降、総プレイ回数が9万回を超えるなど、多くの方に遊んでもらうことができました。
otoge.netは学生時に開発したサービスで、個人的な思い入れも深いサービスということもあり、終了させるのは名残惜しいですが、何卒ご理解の程よろしくお願いいたします。

「終了のお知らせ」ページにもちょっと書いてあるけど、自分が学生である2012年くらいから運用していて、MashupAwardsでも受賞できたりと、思い入れの強いサービスとなった。
ログを見ると未だに遊んでくれている人がいたり、結構最近である2014年6月くらいに紹介記事を書いてくれているブログがあったりして、終わらせるのは名残惜しかったけど、思い立ったが吉日ということで、急遽クローズさせた(個人で運用してたサービスなので許してください)。


otoge.netを運用してたVPSは解約して、mupsのサーバに「終了のお知らせ」ページを乗っけて、バーチャルホストさせることにした。
Nginxはバーチャルホストの設定も楽で、改めて良いものだと思った。



あと、今まで書いてきたユーザースクリプトの中で、唯一未だに使っているpixiv用のやつ(作品をソートしたりフィルタリングする)を、今後もメンテしやすくするため、GitHubで管理することにした。github.com

2012年産なので、ちょっとだけリファクタした。
ただのユーザースクリプトだけど、gif画像貼っつけたりしてREADMEもそこそこちゃんと書いた(日本語で)。
pixiv_sk/README.md at master · shikato/pixiv_sk · GitHub


f:id:alexam:20150507020545g:plain
(なんか色々うつってる気もするけど気にしないことにした)



これで、少しだけ身が軽くなったような気がする。

今年のクール別アニメOP/ED BEST

自分が携帯音楽プレーヤーで聴く曲は、基本、その時期に放送しているアニメの気に入ったOP/EDで、購入した曲をクールごとのプレイリスト(2014秋みたいな名前)に突っ込んで作業中等に聞いている。
なので特定のお気に入りアーテイストとかはあまりいない気がする。

ここ最近、少し体調を崩しベッドの上で音楽を聞くくらいしかやることがない時期があり、ずっと上述したクール別プレイリストを聴いていたら、ふとクールごとのBEST OP/EDを決めたくなったので決めてみた。

曲ごとに感想を書こうと努力してみたけど、語彙も文章力も音楽の知識も無いので酷いものとなった。

2014秋

OP

courage / ソードアート・オンラインII
http://ecx.images-amazon.com/images/I/61rX5PIlptL.jpg

すごく良い。
OPで流れる映像は確か3パターンくらいあるけど、キリトが一切出てこないやつがベスト。
マザーズ・ロザリオ編をある程度まで見た後にOP見ると毎度泣きそうになる。
SAOはマザーズ・ロザリオ編見るまでは普通に面白い良質アニメだと思って見ていたけど、マザーズ・ロザリオ編で急激にハマってしまい、視聴中にゲームのSAOホロウフラグメントが急にやりたくなり、視聴後PS Vitaと共にAmazonで衝動買いした。
Vita衝動買いした回は、キリトが、ユウキとアスナに迫ってくる群衆の中から抜け出し、その群衆の前に立ち塞がる辺りで終わった回。
その一個前の回のユウキとアスナが立ち会う回も良かったし、翌週のボス攻略する回も凄く良かった。
KarafinaのBGMも凄くいい。マザーズ・ロザリオ編でボス戦とか良い所で流れる曲が格好いい。
最終回はまだ見ていない。明日多分見る。

ED

星屑のインターリュード / 天体のメソッド
http://ecx.images-amazon.com/images/I/81qeaKInXrL._SL1137_.jpg

今までのfhanaの曲の中で一番のお気に入り。
fhanaは毎度良い感じにタイアップしている気がする。
終盤にイントロ流してシームレスにエンディング入るやつが毎度良かった。


2014夏

OP

heavenly blue / アルドノア・ゼロ
http://ecx.images-amazon.com/images/I/51LY-OEsj0L.jpg

Kalafinaのやつは大体好き。

ED

aLIEz / アルドノア・ゼロ
ウラオモテ・フォーチュン / 月刊少女野崎くん
花雪 / ハナヤマタ
http://ecx.images-amazon.com/images/I/61-kVoHOLlL.jpg

選べなかったので3つで。
aLIEz、初めてEDで流れた時は、歌詞あるんだ、と衝撃を受けた気がする。
そういえばどっちもアルドノア・ゼロが入った。
あと千代ちゃんは可愛かった。


2014春

OP

killy killy JOKER / selector infected WIXOSS
black bullet / ブラック・ブレット
STAND PROUD / ジョジョの奇妙な冒険 スターダストクルセイダース

http://ecx.images-amazon.com/images/I/818H9Nd2hmL._SL1500_.jpg

選べなかったので3つで。
WIXOSSは2期のも良いけど、やっぱり1期のOPが好き。

ED

トコハナ / ブラック・ブレット
奏(かなで) / 一週間フレンズ。

http://ecx.images-amazon.com/images/I/71Sg%2B-cjV9L._SL1050_.jpg

EDは2つで。
ブラック・ブレッドはOP/ED共によく豊作だった。
一週間フレンズ。は藤宮さんが良い子だった気がする。


2014冬

OP

divine intervention / ウィッチクラフトワークス
Be mine! / 世界征服~謀略のズヴィズダー~
JUSTITIA / ウィザード・バリスターズ~弁魔士セシル

http://ecx.images-amazon.com/images/I/81t4I29klgL._SL1416_.jpg

選べなかったので3つで。2014冬もOP豊作だった。
セシルは本編そんなに面白くなかった気がするけどOPは良かった(ウィッチとズヴィズダーは本編も面白かった)。

ED

With You / With Me / マギ
ウィッチ☆アクティビティ / ウィッチクラフトワークス

http://ecx.images-amazon.com/images/I/51P8E88LStL.jpg

こっちは2つで。
マギ、終盤イントロ流れ出しシームレスEDパターンが毎度良かった気がする。


今年BEST

OP

courage / ソードアート・オンラインII
http://ecx.images-amazon.com/images/I/51tZpB-2kqL.jpg

鮮度もあると思うけど、今年だけでなく3~4年くらいのOP含めてもベストにしたくなるくらい気に入ってる。

ED

表裏一体 / HUNTER×HUNTER
http://ecx.images-amazon.com/images/I/516sLoEHHGL.jpg

何かずっと流れていたのでクール別BESTに入れづらかったけど、今年BEST EDは表裏一体にしたい。
キメラアント編で初めて映像と共に曲が流れた時は鳥肌が立った気がする(初めて聞いたのは映画だった可能性もある)。
ただ、会長選挙編のEDは映像に手抜き感があって残念だった(4人が突っ立てるだけ)。暫定EDかと思ったら最後まであれだった。

さいごに

あんまりBESTにならなかった。

Mashup Awards10で賞をいただきました

Mashup Awards10で、ドワンゴ賞とTINAMI賞をいただきました。

f:id:alexam:20141119222718j:plain



ドワンゴ賞の商品です。Planning Cardsやマグカップなど実用的で嬉しい。
f:id:alexam:20141119213151j:plain

プレゼンターは清水さんで席も隣だったけど、インタビュー記事をちょうど最近読んだりしていて、死ぬほど緊張した。でも話せて良かったです。

「技術的負債」の返済ルールを作る 株式会社ドワンゴ 清水俊博 氏 |IT・Web業界の転職ならDODAエンジニア IT



TINAMI賞の商品は何故かコーヒーセットでしたが実用的で嬉しい。
f:id:alexam:20141119213508j:plain
プレゼンターの方に実際に使ってもらっている画面を見せてもらったりして感激した。



学生のときに取ったやつと合わせてMashup Awardsの盾が3つになった。達成感あります。
f:id:alexam:20141119213935j:plain



印象的だった作品


台風リアルタイム・ウォッチャー:台風情報と「減災リポート」のリアルタイム・マッシュアップ
データの活用っぷりに感動した。1日でつくったらしい。TVでも紹介されてるしすごい。



18. Tetris 3D Modeler - 栗原一貴: Kazutaka Kurihara's Website
3Dプリンタ夢あるけどデータ作るの難しい→じゃあテトリスみたいにやれば簡単に作れるのでは。
みたいな発想が良いです。
一列揃えるとちゃんと消える点も面白かった。


VISTouch on Vimeo
なんか面白いことに使えそう。



あとプレゼン見ていて思ったことは、学生多いし、みんなプレゼンがうまいということ。
特に12歳の子がハキハキと安定感のあるプレゼンしている姿を見て衝撃を受けました(たぶんこの子かな)。自分はプレゼンとかすると周囲に不安感を与えるタイプなので羨ましい。


さいごに

突貫で作ったので完成度はまだまだ低いですが、賞もとれたので、継続開発がんばりたいと思います。

そういえば以下の記事で構成等を説明しています。

RubyとNode.jsでIFTTTみたいなものをつくる - Qiita

PixivSortFilterAddItemが動かなくなっていたので対応した

PixivSortFilterAddItemがいつの間にか動かなくなっていた。

リアルタイム検索で「PixivSortFilterAddItem」と検索してみると、


f:id:alexam:20140714022959p:plain


みたいな感じで、困ってる人がいるようなので、対応した。

pixiv_sk

SQLiteを使ってAndroid端末内でお手軽に日本語全文検索する

タイトルの通り、SQLiteを使ってAndroid端末内でお手軽に日本語全文検索する方法です。

FTS

SQLiteにはFTSという全文検索用モジュールがサポートされているのでそれを使う。
最新版はFTS4で、Android APIレベル11以上なら標準で使えるようなのでFTS4を使う。

公式ドキュメント
SQLite FTS3 and FTS4 Extensions


N-gram

FTS標準のトークン作成処理はスペース区切りにしか対応していないので、日本語の場合、自分でトークンを作成する必要がある。トークン作成には、お手軽にトークンを作成できるN-gram方式を採用する。

以下が指定した値(N)でN-gram変換するだけのNgramクラス。

/**
 * N-gramクラス
 * @author shikato
 *
 */ 
public class Ngram { 

    private Ngram() {
    }

    /**
     * N-gram変換したテキストを返す
     * @param aText N-gram変換するテキスト
     * @param aN N
     * @return N-gram変換されたテキスト
     */
    public static String getNgramText( final String aText, final int aN ) {

        final StringBuilder ngramText = new StringBuilder();
        final int length = aText.length();

        if ( length < 1 ) {

            return "";
        }

        if ( length > aN ) {

            int roop = length - aN;

            for ( int i = 0; i < roop; i++ ) {

                ngramText.append( aText.substring( i, i + aN ) );
                ngramText.append( " " );

                if ( i == ( roop - 1 ) ) {

                   i++; 
                   ngramText.append( aText.substring( i, i + aN ) );

                   if ( i % aN >= aN ) {

                       i++; 
                       ngramText.append( " " );
                       ngramText.append( aText.substring( i, i + aN ) );
                   }
                }
            }

        } else {

            ngramText.append( aText );
        }

        return ngramText.toString();
    } 
}

指定した値でN-gram変換するだけのNgramクラス


FTSテーブル作成

FTSテーブルでは値がすべて文字列扱いになってしまうので、実際に使用するときはメインのテーブルと全文検索用のFTSテーブルにわけて使うことが多くなると思う。

以下が上述したように、メインのテーブルと全文検索用のFTSテーブルにわけて作成する例。

CREATE TABLE hoge ( id INTEGER PRIMARY KEY AUTOINCREMENT, text TEXT )

CREATE VIRTUAL TABLE hoge_fts USING fts4( words TEXT )


検索対象テキストをメインテーブルのtextに格納し、検索対象テキストをN-gram変換したものを、FTSテーブルのwordsに格納する。
FTSテーブルを作成すると、docidというAUTO INCREMENTなカラムが自動的に用意されるので、メインテーブルと結合するときに使う。ちなみにdocidはrowidの別名なのでテーブル定義にはない。
あと、FTSでテーブルを作ると、~_contentのような名前のテーブル(Shadow Tables)が5つくらい勝手に作られるけど、普通に使う分にはあまり意識する必要はなさそう。
その辺りの詳細は公式ドキュメントに書いてある。
http://www.sqlite.org/fts3.html#section_9


保存

今回の例ではメインのテーブルとFTSテーブルにわけているので、両方のテーブルに保存する(メインのほうには通常のテキスト、FTSテーブルのほうにはN-gram変換したテキスト)。
※保存するテキストは、ユーザーの入力値になることがほとんどだと思うので、実際の開発時にはプリペアードステートメント等でSQLインジェクション対策する。

INSERT INTO hoge ( text ) VALUES( "hoge" ) 

INSERT INTO hoge_fts ( words ) VALUES( "ho og ge" )


同様に削除や更新の際も、両方のテーブルに対して実行する。


検索

MATCHを使用する。

SQLは以下のような感じになる。検索キーワードにN-gram変換したテキストを使用する。
※検索キーワードはユーザーの入力値になることがほとんどだと思うので、実際の開発時にはプリペアードステートメント等でSQLインジェクション対策する。

SELECT * FROM hoge h INNER JOIN hoge_fts hf ON h.id = hf.docid WHERE words MATCH "ho og ge"


前方一致だとこんな感じになる。

SELECT * FROM hoge h INNER JOIN hoge_fts hf ON h.id = hf.docid WHERE words MATCH "ho og ge*"


他にも色々な検索方法がある。
http://www.sqlite.org/fts3.html#section_3


パフォーマンス

SQLiteの.timerオプションを使用して測定。 投入したデータは5万件ほど。

普通にLIKE

SELECT count(*) from hoge WHERE text LIKE "%hoge%"

CPU Time: user 0.104006 sys 0.240015


FTS メインテーブルとの結合なし

SELECT count(*) from hoge_fts WHERE words MATCH "ho og ge"
 
CPU Time: user 0.000000 sys 0.000000


FTS メインテーブルとの結合あり

SELECT count(*) FROM hoge h INNER JOIN hoge_fts hf ON h.id = hf.docid WHERE words MATCH "ho og ge"

CPU Time: user 0.004000 sys 0.000000


FTS 前方一致でメインテーブルとの結合あり

SELECT count(*) FROM hoge h INNER JOIN hoge_fts hf ON h.id = hf.docid WHERE words MATCH "ho og ge*"

CPU Time: user 0.004001 sys 0.000000


やっぱりLIKEより速い。


まとめ

LIKEで検索するより速いし、別途ライブラリ等もいらないので、お手軽に端末内で日本語全文検索するときは使うと良いと思う。

さくらインターネットの田中社長

今週を振り返ってみると、さくらインターネットの田中社長に、スケールアウト可能になった、さくらVPSとさくらクラウドの使い分けや、今時の専用サーバの話等を直接聞けたのは、すごく貴重な経験だった気がする。


さくらの専用サーバが申し込み後、最速10分で使えるようになる、という話も驚いたし、クラウドで数はすぐに増やせるようになったけど、DBサーバ等、増やすだけではパフォーマンスが出ない箇所には、化け物のようなスペックの専用サーバ(それでも月5万くらい)を使う事例が増えてきている(さくらクラウドとの複数台構成も容易らしい)、などの話は興味深かった。


それと講演での「ビジネスは感動を得た時に出てくる(田中社長の場合は自分の学内サーバに初めて秋葉原からアクセスできたとき)」みたいな話も面白かった。


あと前評判通り、見た目若い、かつ良い人オーラが出ていたし、話していてサーバ等の技術そのものに対する興味関心のようなものが伝わってきて、非常に好感の持てる人柄だと思った(何か上から目線な書き方になってしまいすみません)。


さくらのサービスは、今後は仕事で使うことは難しそうだけど、少なくとも個人での開発においては、今まで以上にさくらユーザーになりそうだし、レア名刺が増えたので良かった。