ICPC国内予選

http://icpc2011.ait.kyushu-u.ac.jp/icpc2011/common/guest_standings_ja.php
317で参加.全体7位で学内3位.

先輩と私がコーダー,もう一人の先輩はペアプロの突っ込み要員.私が担当したのはA,B,D.Aは篩,Bはstd::stackで適当に,Dは円盤が最大で24枚しか存在しないので,状態をintのビットで保持して全探索とメモ化.


激しく練習不足で反省気味.私の担当分は大抵サンプルでバグを発見していた.そこで発見できたから良いという話もあるが,あれぐらいバグ無しで一発で通せないと不味い気がする.そもそも1年間にチーム全体で解いた問題数が40を超えていない説があってですね…….


SRMから逃げない」を目標にして頑張ることにする.せめてアリ本ぐらいは読まんとなぁ.

5月前半

どうでも良いメモ集.

てんぷれーと難しい

スクリプト言語による効率的ゲーム開発 C/C++へのLua組込み実践という本を読み始めた.Lua等のスクリプト言語に触ったことがなかったので何となく.それはそうと5章で「Luaヘルパークラス」というものが出てくる.これを使うとC/C++からLuaの関数を呼び出すのが楽になる(以下参照)

LuaHelper luah;
luah.SetLua(L);
LuaFuncParam params, results;
params.String("left").Number(100).Number(200);
if (!luah.CallFunc("on_mouse_click", &results, 2, &params)) {
    printf("%s\n", luah.GetErr());
} else {
    bool result = results.GetBool(0);
    const char *mes = result.GetString(1);
}

もうちょっと綺麗に書けないかな,と思ったので自分で何か書いてみた.可変長どころかテンプレート自体で何かを書いてみるのが始めてな気がする.むずい.せっかくなのでgistに置いた.以下利用例.

#include "luahelper.hpp"

int main(int, char**) {
    auto L = std::shared_ptr<lua_State>(lua_open(), lua_close);
    luaL_openlibs(L.get());
    luaL_dofile(L.get(), "sample.lua");

    kichi::LuaHelper LH(L);
    bool success;
    double ret1;
    std::string ret2;

    /* > sample.lua
       function sample(a, b)
           return a+b, "Waha-"
       end
     */
    std::tie(success, ret1, ret2) = LH.CallFunc<int, std::string>("sample")(1.0, 2);
    if (success) {
        std::cout << ret1 << ", " << ret2 << std::endl;
    }

    /* > fuga.lua
       return 1, "seikichi"
     */
    std::tie(success, ret1, ret2) = LH.DoFile<int, std::string>("fuga.lua")();
    if (success) {
        std::cout << ret1 << ", " << ret2 << std::endl;
    }
    return 0;
}

ちなみにgcc4.6の-std=gnu++0xで通った.相変わらず適当なC++力.

例会講座

サークルの講座(15分で適当な話題を発表)が久々に回ってきたので言語モデルとか漢字変換の話をした.2回生の頭にバイト先で受けた研修(?)を圧縮しただけですよ(ゲフッ.書いたコードはこんなん.全体的に投げやり.もうちょっとマシな言語モデルを作ろうと思っていたのだけれど,説明が面倒+準備開始が当日深夜 だったので残念な出来に.まぁいいか.

自炊

ScanSnapで自炊→バーコード自動認識→amazonAPIでタイトル取得 の幸せな日々を送っていたのだが,白黒の縞模様のページがあるとzbarからの返事が帰ってこなくなる.仕方ないのでulimit(1).

tmp=tmp
check=3
file="hoge.pdf"
page=$(pdfinfo $file | grep -E '^Pages' | sed -e 's/^Pages:\s*//')
pdfimages -j -l $check $file ${tmp}_h
pdfimages -j -f $(expr $page - $check) $file ${tmp}_t
for file in ${tmp}_*; do
    ulimit -t 10 && zbarimg -q $file \
        | uniq \
        | grep -E '^EAN-13:' \
        | grep -v -E '^EAN-13:192' \
        | grep -v -E '^EAN-13:191' \
        | sed -e 's/^EAN-13://';
done
rm ${tmp}_*

サークル

「今年は新入生と一緒にC++でゲーム作るかー!」と思って練習がてらに以前C#で書いたものを移植していた.普段Linux上で生活してるので,そっちでコード書けるのは快適.とは言えノートの方はWindowsなので,MinGWでごにょごにょしてたら時間がサクサク消えていった.ちなみにMinGW上でCMakeする場合は -G "MinGW Makefiles" としてやると良いらしい.何のこっちゃ.

Python

自炊関連でどーでもいいプログラムを動かしていたのだが,stderrに吐かせているログをファイルにリダイレクトするとエンコード何たらのエラーを吐く.もしやと思って確認してみると sys.stdout.encoding がリダイレクトするとNoneになっている(ちなみにリダイレクトしない場合はLANG見てそう).ということで明示的に.encode('utf8')してやって解決.

Juman

研究室の先輩(Mac)が上手く入れられんと言うので見てみた.ココ見て解決.どうでもいいがstraceってMacに無いのね,知らなかったぜ.

4月

今年も慌しい4月だった.

大学

今期は2コマ(4回生必修).研究室の拘束も強くないのだが,せっかく配属されたのだから「家で出来ることは研究室に行ってする」ぐらいの気持ちで望みたい.だからと言ってラノベ読むのはどうなのって気もするけど.

ちなみに研究室配属がどのように決定されているかは不明.今年は実験の比重が大きいと風の噂で聞いたが,どこまで本当なのか.隠さずオープンにしろよと思わんでもない.

研究室

無事に第一希望の研究室(知能情報のY研)に配属された.卒論は自然言語処理っぽい方向になった.既に忙しい研究室もあるようだが,うちはまだまだまったり.ダレないように気を付けたい.

ちなみに院試はまたちょっと考え中;-)

サークル

今年はそろそろ30人入部したことになるらしい.今年も新入生と一緒に何かゲームでも作るかなぁという気分.まだまだ現役ですよ.

新歓系のイベント以外では,読書会に参加したりといつも通り.今年はゲーム以外にも何か作ろうと画策中.ネタは決めているのでちびちび進めたい.

アニメ

タイバニ,あのはな,いろは あたりが楽しい.やっぱオリジナルは続きが気になって素敵.それ以外では C,DOG DAYS,日常,青の祓魔師Aチャンネル を見てる.書いてて気付いたけど,今期は結構アニメを見ているらしい.

積読

入門自然言語処理
何となく買って放置していた.5章まではPythonの入門的な色合いが強く退屈.現在7章.ちゃっちゃと読み終えたい.
カーネル多変量解析
これまた何となく生協で買ってしまった本(そんなんばっかり……).後半までカーネルの理論的な話は出てこないので気楽に読める.SVMの章は割と知ってることばかりじゃないかなーと甘く見ていたが,案外そうでも無かった.νトリックや1クラスSVMはどこかで聞いたことがあったが,ちゃんとした解説を読むのは初めてだった気がする.またSVM以外にも主成分分析やクラスタリングなどへのカーネル法の適用が載っていて楽しく読めた.現在6章でカーネルの理論のお話.

その他

風邪で体温が39.2度まで上がった.1人暮らしで風邪を引くと,布団に入る際「このまま寝てしまって大丈夫なのか.次起きた時今より高熱でどうしようもなくなったりしないか」と悩む.どうやらインフルエンザでは無かったようで,復帰も早かったのが幸い.

そういえば友人が桂キャンパスへ流された.「晩飯行こうぜ!」などと誘えなくなって寂しいもんだな,と思ったり.と言いつつよく吉田で見る気もするが.

Twitterで自分の発言に関連した発言を読みたい

動機

  • 「ラーメン食べたいなぁ」とpostしたあとに,@無しで「ラーメンなら夢語」とか言ってくる発言を読みたい
  • ただしクライアント非依存にしたい(TweenやTweetDeckから読めるようにしたい)

最初はtwitterAPIプロキシを作りtf-idfのコサイン類似度が一定以上の発言にハッシュタグもどきを付けて,クライアントの方でタブ分け等をすれば良いと思ったが,冷静に考えたらprotectedのボットを作ってRTすれば良いと気付いた.ということで書いてgithubに置いた

使い方

  1. ボット用のアカウントを作り(protected推奨),自分のアカウントからフォローしておく.
  2. プログラムを起動(% similot.py).OAuthの認証は2回行われる.自分のアカウント→ボットの順番で行う.同じアカウントで2回認証しないように注意.
  3. 自分のアカウントのTLで自分の発言に類似している発言がボットの方でRTされるので,適当にタブ分けなりリストなりで読む.

必要なライブラリや設定はREADME参照

注意

  • 俺「ラーメン食べたいなぁ」→友人「そこで天一!」とかの検知は無理.要するに同じ単語が入ってないとダメ.
  • それなりにノイズが入るので,無いよりマシかなー程度で使うと良いと思います.
    • 口語の分かち書きは難しいですね
    • 設定のmax_postsの値(デフォルト1000)を増やせばtf-idfのidfが効いてきてマシになるかも.まぁメモリと適当に相談して下さい.

春合宿

サークルで毎年恒例の春合宿に行ってきた.日中は部員による講座*1を聞き,夜はぐだぐだ適当.

1日目

午後1
私の講座.「初めての機械学習」という内容でtwitterの発話者を判定する話とエロゲ批評空間の感想文からその点数を当てる話をした.前者は同回の友人と後輩を激しくネタにした講座だったため,外部に公開するのは無理な素敵なスライドに.それはそうとliblinearは学習が高速で素敵ですね.
午後2
Coqの話.「うおー,CALっぽい」と思ってるうちに寝てしまった.目が覚めるとそこには上手く動くと証明された挿入ソートがOCaml, Haskell, Schemeのコードで出力されていた.合宿当日の睡眠不足よくない.後輩に土下座.

夜は劇なのを鑑賞したり桂へ流される友人のために皆で「今日の日はさようなら」を合唱するなどして終了.

2日目

午前1
経済の話.おいお前Railsやるって言ってなかったかw.講座によると「人を助けるという自らの労働から,なのはは疎外された」らしい.「疎外されない○○」というフレーズが妙に気にいって,以後「疎外されない雪掻き」「疎外されない春休み」とか友人らと言っていた気がする.実にアホっぽい.
午前2
物語工学論.何のサークルか怪しくなってきましたね!
午前1
デザインのお話.新歓ビラをdisりつつ改善案を出していく内容.デザインやっぱ難しい.大切なのは分かるんだけど.
午後2
友人による離散フーリエ変換のお話.FFTとかはちゃんと理解して無かったので面白かった.

終わったあとは雪掻きしたり雪を他人に投げ付けたり等々.

3日目

午前1
集合論とかZFとかペアノの公理とかそんな内容.喋り慣れてて上手いなーと思った.某自主ゼミサークルで鍛えているのかしら.
午前2
十字軍
午後1
Structure from Motion.ひたすら線形代数.「授業3回分くらいの内容を1回でやります」「対応点はSIFTのマッチングとかで適当に頑張ってください」
午後2
書くと不味い気がするので秘密.


初日は雪が酷く色々と苦労した.来年以降はもう少しマシな天気だと良いのだけれど.

*1:合計20人.ただし2部屋同時に行うので10人分しか聞けない

IPythonの設定

~/.ipython/ipy_user.conf.py に

This is a more flexible and safe way to configure ipython than *rc files
(ipythonrc, ipythonrc-pysh etc.)

とあるので,このファイルを編集することにする.設定の意味はipythonrcの方に書かれているのでそれを参考に.また方針として ip_user_conf.py だけで完結させることにする.(=日本語の問題を解決するために iplib.py を直接編集しない)


設定したのは

  • 終了時に確認を取らない
  • プロンプトは'>>> ' (ただし -cl で起動する場合と違って色付き)
  • C-lでclear-screen
  • u','.jo 等で補完が出るように(この場合join)
  • 日本語関連の不具合を直す
  • virtualenvとの連携(元ネタ)

などなど.

#!/usr/bin/python
# -*- coding: utf-8 -*-

""" User configuration file for IPython"""

import IPython.ipapi, IPython.iplib
ip = IPython.ipapi.get()

import os
import sys
import site


def main():
    o = ip.options
    # see ~/.ipython/ipythonrc
    o.system_verbose = 0
    o.confirm_exit = 0
    o.banner = 0
    o.prompt_in1 = r'>>> '
    o.prompt_in2 = r'.\D: '
    o.prompt_out = r''
    # remove all input/output separators
    o.nosep = 1
    # M-*を削除.iとoだけで十分かも
    _binds = []
    for b in o.readline_parse_and_bind:
        if not b.startswith('"\\M-'):
            _binds.append(b)
    o.readline_parse_and_bind = _binds
    o.readline_parse_and_bind.append(r'"\C-l": clear-screen')
    # alias
    o.autoexec.append('__IPYTHON__.magic_ed = __IPYTHON__.magic_edit')
    # greedy complete (ex: ','.j<TAB> -> ','.join)
    import ipy_greedycompleter
    for m in ('os', 'sys', 'math'):
        ip.ex("import %s" % m)
    IPython.iplib.InteractiveShell.runsource = _runsource

    # virtualenv (from http://www.ianlewis.org/jp/ipython-virtualenv)
    if 'VIRTUAL_ENV' in os.environ:
        virtual_env = os.path.join(os.environ.get('VIRTUAL_ENV'),
                                   'lib',
                                   'python%d.%d' % sys.version_info[:2],
                                   'site-packages')
        site.addsitedir(virtual_env)
        print 'VIRTUAL_ENV ->', virtual_env
        del virtual_env


def _runsource(self, source, filename='<input>', symbol='single'):
    # source=source.encode(self.stdin_encoding)
    if source[:1] in [u' ', u'\t']:
        source = u'if 1:\n%s' % source
    try:
        code = self.compile(source,filename,symbol)
    except (OverflowError, SyntaxError, ValueError, TypeError):
        self.showsyntaxerror(filename)
        return None
    if code is None:
        return True
    self.code_to_run = code
    if self.runcode(code) == 0:
        return False
    else:
        return None

main()

*1:'0' とか

*2:u'あ' が u'\xe3\x81\x82' と1byte文字*3として認識される.このためか print u'あ' で文字化け