offtopic
Up one level書きはじめ
最近働きだしたmatsuyamaです、どうぞよろしく。現在自宅サーバーを立てられない状態なので、しばらくはここを本家ブログとしてエントリを書きつづっていきたいと思っております。内容としてはC++やLinux界隈を主として書いていきたいと思っています。また井上氏の提案により、GCCを解読するという何年かかるかわからないようなプロジェクトも予定しておりますので、それの進捗もここに書きたいと思っています。
書きはじめですので、とりあえず僕の環境を晒しておきます。
環境:Gentoo 2006.0 Kernel 2.6.15ぐらい + xorg 7 + Xfce4 + rxvt-unicode + GNU screen + zsh + emacs( + emacs-w3m) + [vim]
最新鋭のツールを組合せた最強の環境です。screenでhsplitしてtop windowのemacsでvsplitしてleft bufferにw3m、right bufferにeshell、bottom windowでzshを待機させたりってことができます。近いうちにWanderlustなどを導入してemacs上でmailやRSSを読めるようにしたり、~/srcをnamazuかgonzuiにかけてemacs-w3m上でboostのソースやgccのソースを参照できるようにしたりする予定なので、それが実現すればもうキーボードひとつで何もかもできてしまうでしょう。
- Category(s)
- offtopic
- The URL to Trackback this entry is:
- http://dev.ariel-networks.com/Members/matsuyama/66f8304d306f3081/tbping
Google Code Jam 2006に参加してみました
結論からいうとTest phaseでふるいにかかっちゃいました。750pt問題は落ちるだろうと思ってたんですが、250pt問題まで落としちゃったのはショックです。四捨五入の処理をミスったか無駄にほどこしてみた最適化が問題をおこしたのでしょうが、本当に簡単な問題だっただけにくやまれます。750pt問題もちゃんと冷静に考えて書けばとおっていたかもしれません(expired後に二時間かけて書いたコードはおそらく通る)。何より今回問題だったのが経験のなさと緊張です。緊張は脳みそを馬鹿にします。緊張していると総当たりしか思い付きません。k.inabaさんの偉大さを新ためて思い知りました。点数的には大差ない(つまり実装にかかった時間)のですが、Test phaseを確実に通るコードを書く実力とか冷静さとか、やはり雲の上の人です。
あと今回勉強になったのが、Codeing Areaでプログラミングせずにemacs + g++でプログラミングしつつ、Statementにのっていないようなtestcaseを用意して独自にテストするべきだったということです。一々Compile->Test->Example1->Testとかやってると時間かかってしかたありません。まあ今年始めてなわりには結構健闘できたかなと自己満足しています。
来年はちゃんとアルゴリズムと数学を勉強して挑みたいと思います。当日に徹夜でぷよぷよやっているようではまだまだ駄目です。
(wait for system test phase to end)
暇なときに他のqualification setもといてみようかと。
- Category(s)
- offtopic
- The URL to Trackback this entry is:
- http://dev.ariel-networks.com/Members/matsuyama/google-code-jam-2006306b53c252a030573066307f307e3057305f/tbping
Google Code Jam 2006 Qualification Setを勝手に解く
練習がてら解いてみる。かなり適当。
Qualification Set 1
1-250pt問題
Nコンタクトをうまくグループ分けしてコンタクトを見つけるまでにかかる時間を最小にしろという問題。nグループに分けた場合、まずグループを捜すのにn秒、そしてそのグループから実際のコンタクトを見つけるのにN/n秒かかる。例えば5コンタクトを2グループに分ける場合、2+ceil(N/2) == 5秒かかる。
groups.py:
from math import ceil class IMGroups: def optimalTime(self, N): res = 1000000 for i in range(1, N): tmp = int(i + ceil(float(N) / i)) if tmp < res: res = tmp return res
1-750pt問題
N queensの変形。正方のチェスボードが与えらえれk個のビショップを置くパターンの数を計算して下4桁の数をかえせという問題。なおいくつかのセルは破壊されていてそこにビショップを置くことができないという制限がついている。僕が自分で解いた方法は総当たりによる方法で、わかりやすく直接的ではあるけど実行時間がかなりぎりぎりなので他の方法を紹介。簡単に説明するとビショップを置くパターンと置かないパターンでなめるようにdiagをスキャンしていくようになっている(たぶん)。memset(memo, -1, sizeof(memo))はなるほどと思った。
bishops.cpp:
#include <iostream> #include <vector> #include <string> #define MOD 10000 using namespace std; int n; int memo[18][1 << 15]; vector<string> b; int go(int k, int d1, int mask) { int& res = memo[d1][mask]; if (res != -1) return res; if (k == 0) return res = 1; if (d1 >= 2 * n - 1) return res = 0; res = go(k, d1 + 1, mask) % MOD; for (int i = 0; i < n; i++) { int j = d1 - i; int d2 = n - 1 + i - j; if (i < 0 || i >= n || j < 0 || j >= n) continue; if (!(mask & (1 << d2)) && b[i][j] == '.') { res += go(k - 1, d1 + 1, mask ^ (1 << d2)); res %= MOD; } } return res; } class Bishops { public: int count(int k, vector<string> board) { n = (int)board.size(); b = board; if (k > 2 * n - 1) return 0; memset(memo, -1, sizeof(memo)); return go(k, 0, 0); } }; #if 0 int main() { vector<string> board; board.push_back("........"); board.push_back("......#."); board.push_back("........"); board.push_back(".#......"); board.push_back("........"); board.push_back(".....#.."); board.push_back("........"); board.push_back("...#...."); Bishops bishops; cout << bishops.count(7, board) << endl; return 0; } #endif
Qualification Set 2
2-250pt問題
シャッフルする種をあたえられ、それを使って1, 2, 3, ..., nなデッキをn回シャッフルしろという問題。
shuffler.py:
class DeckShuffler: def getDeck(self, n, shuffled): res = range(1, len(shuffled) + 1) while n > 0: tmp = res[:] for i, x in enumerate(shuffled): tmp[i] = res[x - 1] res = tmp n -= 1 return res
2-750pt問題
Qualification Set 1の750pt問題と同じ。
Qualification Set 3
3-250pt問題
レフリーの全行動が[YR] MINUTES NAMEという形式であたえられるので、それの間違いを見付けて最も最初に間違った時間をかえせという問題。たとえば二回目のイエローカードなのに同時間にレッドカードがでてないなど。完璧なコードを書くのが結構むずかしい。と、思ってたら以下のようにすれば簡単にかつ完璧にできることが発覚。さすがですk.inabaさん、あとからレッドカードを検索する発想はなかったわ。なんていうかイエローカードのチェックのifの次にelifとして書きたい衝動にかられる。そっちのほうが美しいみたいな。でも実際そうすると逆に問題が難しくなる。いやはやアルゴリズムは奥が深い。
3-750pt問題
Permanentとかいうやつを計算しろという問題。The parmanent of nxn matrix A is equal to the sum of A[1][p[1]] * A[2][p[2]] * ... A[n][p[n]] over all permutations p of set {1, 2, ..., n}. ということらしい。前から思っていたんだけど、set {1, 2, ..., n}のall permutationsってなにかとても簡単な方法で生成できないのかな。結構用途多いわりにいざ作るとなると再帰やらスタックやらで生成しないといけなくて面倒くさい。で、問題は解けたんだけど遅すぎてtestとおらない。c++で書きなおす気もおこらず、上と同じようにk.inabaさんのコードを掲載。僕のpythonのプログラムにmemoizationつければk.inabaさんのと同じになるけど、面倒なのでいいや。
Qualification Set 4
4-250pt問題
(n,m)のボードから最大の正方(含有可能な正方をはぶくという意味)を抽出してその数をかえせという問題。たとえば
AAB AAB BBB
は2x2のAの正方が1個、1x1のBの正方が5個で計6。Constraintsがゆるいのでごりごり処理しても余裕。まあ工夫するとしたらcoloringして四隅のcolorをチェックすることにより含有をチェックするようにするとか。追記、rは最大にしちゃだめだ。修正面倒なのでこのまま。
square.py:
class SquareCounting: def howMany(self, grid): w = len(grid[0]) h = len(grid) sq = {} res = 0 def row(c, l, t, r): while l < r: if grid[t][l] != c: return False l += 1 return True def include(c, l, t, r, b): for s in sq.get(c, []): if s[0] <= l and s[1] <= t and s[2] >= r and s[3] >= b: return True return False for l in range(w): for t in range(h): c = grid[t][l] r = l + 1 while r < w and grid[t][r] == c: r += 1 b = t + 1 while b < h and row(c, l, b, r): b += 1 r = l + min(r - l, b - t) b = t + min(b - t, r - l) if not include(c, l, t, r, b): sq.setdefault(c, []).append([l, t, r, b]) res += 1 return res
4-750pt問題
Qualification Set 3の750pt問題と同じ。
Qualification Set 5
5-250pt問題
y < x < zのf(x)がy, zのfに関してconvexになっている場合その総数をかえせという問題。convexというのはy, zの直線((y, f(y)), (z, f(z))より点(x, f(x))が上にある場合をいうらしい。y, zはつまりx - 1, x + 1ということだと決めつけて?になっていたことは秘密。上にあるかはy, zの傾きa1とx, yの傾きa2の比較でチェックできる。これもかなりごりごりと処理。floatいるかは不明。
convex.py:
class ConvexityIssues: def howMany(self, values): res = 0 n = len(values) for i in range(n - 2): for j in range(i + 2, n): a1 = float(values[j] - values[i]) / (j - i) for k in range(i + 1, j): a2 = float(values[k] - values[i]) / (k - i) if a1 < a2: res += 1 return res
5-750pt問題
Qualification Set 3の750pt問題と同じ。
Bishopsの問題が一番むずかしかった。でも一番収穫があったのもBishops。特にgo(k, ...)とgo(k - 1, ...)の使いわけによって配置パターンをすべて表現してしまうのには感心した。来年もがんばろう。
P.S. reStructured Textは使いにくくてしょうがない。
- The URL to Trackback this entry is:
- http://dev.ariel-networks.com/Members/matsuyama/google-code-jam-2006-qualification-set309252dd624b306b89e3304f/tbping
Plaggerを試してみた
Plagger::Plugin::Publish::Maildirというモジュールがあるのを知り、先日書いたfetchrssの機能をそのままPlaggerで実現できるじゃんということでPlaggerをインストールしてみました。
% cpan -fi Plagger Plagger::Plugin::Publish::Maildir
ちなみにforceフラグなしでモジュールがインストールできた経験がありません。Portage経由ならCPANモジュールもさくさく入るんですが、あいにくPlaggerというebuildがないようで、いやいやながらCPAN経由で。それで以下のような設定ファイルを書いて早速テスト。
config.yaml:
global: timezone: Asia/Tokyo plugins: - module: Subscription::Config config: feed: - http://somewhere/RSS - module: Publish::Maildir config: maildir: /home/foo/Maildir folder: plagger attach_enclosures: 1 mailfrom: plagger@localhost
% plagger -c config.yaml ... Plagger::Plugin [fatal] file error - mail.tt: not found at line 144
はやりなツールはことごとく僕を拒むようです。ログによるとmail.ttはちゃんとインストールされているはずなんですが、なんていうか初歩的すぎて直す気もおこりません。やはり僕はfetchrssでいいです。
- The URL to Trackback this entry is:
- http://dev.ariel-networks.com/Members/matsuyama/plagger30928a6630573066307f305f/tbping
Re:Plaggerを試してみた
global:
assets_path: /path/to/assets
を追加してみてください。
このごろろくにメンテしていませんので、不具合がありましたら連絡お願いします。
Re:Plaggerを試してみた
Re:Plaggerを試してみた
Compizインストールしてみた
普段urxvt + screen + emacs -nwをフルスクリーンにして作業している僕には最高に必要なさそうなCompizをインストールしてみました。環境は Gentoo Linux 2006.1, Ahtlon 64 X2, DDR2 1G, GeForce 7300GT です。最初はCompiz on Xglでやっていたのですが、操作するにつれ画面が徐々に真っ白になってうまく動かないので代替としてAIGLXを使いました。AIGLXはxorg7.1からサポートされたeffects用の正式拡張です。XglのようにXそのものを変えてしまうのではなくて、Xをeffectsに対応させる形に変更するだけなので、たとえばデスクトップマネージャでXglを起動したりするような面倒くさいことをしなくてすみます。詳しくは以下を参照。
http://gentoo-wiki.com/HOWTO_nVidia_GL_Desktop_Effects
http://gentoo-wiki.com/HOWTO_XGL
http://gentoo-wiki.com/HOWTO_AIGLX
手順としては、nvidiaのベータドライバをインストール、effectsを使えるように必要なパッケージを更新、/etc/X11/xorg.confをいじくる、.xsessionなどをいじくってcompizを起動できるようにするって感じです。
/etc/X11/xorg.confはAIGLXのところを読んでください。ちなみに僕は以下のように設定してうごきました。
/etc/X11/xorg.conf:
Section "DRI" Group 0 Mode 0666 EndSection Section "ServerLayout" Option "AIGLX" "true" EndSection Section "Module" # Load "dri" EndSection Section "Device" Option "nologo" "true" Option "XAANoOffscreenPixmaps" "true" Option "DRI" "true" Option "AllowGLXWithComposite" "true" Driver "nvidia" EndSection Section "Screen" Option "AddARGBGLXVisuals" "True" EndSection Section "Extensions" Option "Composite" "Enable" EndSection
Xorg.0.logによると必要ないオプションも含まれているようですが動くのでいいでしょう。あまりよくわからないのですがglxがちゃんと動いているかはgrep -i glx /var/log/Xorg.0.logとかxdriinfoとかglxgearsとかで確かめられると思います。glxgearsは正常ならば5000fpsぐらい出ます。それをかなり下回るようではeffectsはちょっとつらいです。 で、compizを起動する方法。いろいろあるのですが僕はXfce4 + Custom Session(.xsession)を使っているのでそのやり方をかいときます。
まず、/etc/xdg/xfce4-session/xfce4-session.rcを以下のように編集します。
/etc/xdg/xfce4-session/xfce4-session.rc:
[Failsafe Session] ... #Client0_Command=xfwm4 Client0_Command=compizrc ...
んで/usr/bin/compizrcを作ります。
/usr/bin/compizrc:
# Start window decorator gtk-window-decorator --replace & # Start compiz LIBGL_ALWATS_INDIRECT=1 compiz --replace --use-cow --indirect-rendering --strict-binding gconf &
ちなみにこれは/usr/bin/compiz-*から拝借して手を加えたやつです。そして~/.xsessionに
rm -rf ~/.cache execc xfce4-session
と書きます。なんか.cacheがあると二回目にcompizを起動したときに固まるのでrm -rfはそれの対策です。固まらない人は消したほうがいいです。
出来上がった感じはスクリーンショットで載せておきます。
compizの初期起動状態ではプラグインが何も選択されていないので、何もできません。gconftools-2を使うかgconf-editorでactive_pluginsに使いたいプラグインを指定してやらなければなりません。とりあえずはgconftools-2(-s,-g)かgconf-editorで/apps/compiz/general/allscreens/options/active_pluginsに[gconf,decoration,wobbly,fade,minimize,cube,switcher,move,resize,place,rotate,zoom,scale,water,screenshot]を指定しておきましょう。これで通常使う分には問題ありません。うにょうにょ動かしましょう。
ちなみに調子にのってberylもインストールしてみたのですが重すぎてだめでした。テーマの豊富さは魅力なんですが初期テーマがあれなのと重すぎるのとでやっぱりcompizに戻しました。
最後によく使うキーとマウス操作をば。
Alt+Tab | window switch |
Ctrl+Alt+Up | window catalog |
Ctrl+Alt+Down | screen switch |
Shift+F9 | Water |
Alt+WheelUp | opacity+ |
Alt+WheelDown | opacity- |
Alt+LeftButton | Move |
Alt+Ctrl+LeftButton | Cube |
まだ使い始めたばかりですが、かなり便利です。やっぱり若者はこうでなくちゃ。
- The URL to Trackback this entry is:
- http://dev.ariel-networks.com/Members/matsuyama/compiz-installation/tbping
Re:Compizインストールしてみた
年末年始はemerge -Du world
なかなかやる機会がない(やる気もない) emerge -Du world ですが、年末年始は絶好のチャンスです。是非やっておきましょう。ついでに kernel の更新もしておくといいかもしれません。
世界を更新:
% esync # or emerge --sync % emerge portage % emerge -avDu world % etc-update
カーネルを更新:
% USE="symlink" emerge gentoo-sources % cp /path/to/config /usr/src/linux % cd !$ % make menuconfig % make && make modules_install
ちなみに kernel を更新するとインストールしておいたドライバも消えるのでそれもインストールしなおしておきましょう。僕の場合は nvidia-drivers と alsa-drivers を入れていたので、それらをインストールしなおします。
% emerge nvidia-drivers alsa-drivers -av
それでまあ alsaconf とか pkill X gdm && gdm で compiz が正しく起動するか確認して一応更新完了。 gentoo にはこれからもバリバリとがんばってもらいます。
(会社のPCも更新したいな…)
- The URL to Trackback this entry is:
- http://dev.ariel-networks.com/Members/matsuyama/emerge-Du-world/tbping
Re:年末年始はemerge -Du world
Beryl で Windows Vista っぽいデスクトップを作る
Beryl の設定
「エメラルドのテーマ設定」から「リポジトリ」→「Fetch non GPL'd Themes」をクリックしてテーマを取得します。なお事前に、
% svn ls https://svn.generation.no/emerald-themes p
しておく必要があります。
次に、「テーマ」からお好みで Vista っぽいテーマを選択します( Aero-Class, vista_theme, Vista-Compiz など)。
フォントの設定
メイリオフォントにかなり似ている(と個人的に思う) M+ Outline Fonts (*) を使います。 Gentoo なら Portage から簡単に取得することができます。
% emerge -av mplus-outline-fonts
インストールができたら xorg.conf を編集してフォントが読みこまれるように設定します。
/etc/X11/xorg.conf:
Section "Files" ... FontPath "/usr/share/fonts/mplus-outline-fonts/" ... EndSection
設定が完了したら X を再起動してください。
(*) http://mplus-fonts.sourceforge.jp/mplus-outline-fonts/index.html
ユーザーインターフェースの設定
これはデスクトップ環境によって異なりますが、僕が使っている Xfce4 では「設定マネージャ」→「インターフェース」からユーザーインターフェースの見栄えを変更することができます。 KDE は kcontrol から設定できますが、 Gnome は使ったことないので知りません。それぞれ Vista っぽいユーザーインターフェースを選択してください。さらにユーザーインターフェースに使われるフォントもここで設定します。 Xfce4 からテーマ一覧のすぐ右にあるフォントボタンから M+ Outline Fonts を選択します。 KDE は「 Appearance & Themes 」→「 Fonts 」で設定できます。
壁紙
Google Image から Vista っぽい画像をとってきて壁紙に設定します。
その他
ウィジェットとかサイドバーとか模倣する必要を感じないので今回は無視しましたが、あえてそこまでこだわるなら aDesklets (*) なんかを使ってみるといいかもしれません。
- The URL to Trackback this entry is:
- http://dev.ariel-networks.com/Members/matsuyama/build-windows-vista-like-desktop-with-beryl/tbping
アグレッシブさが足りない
オープンソースソフトウェアのソースコードを読むことは確かに勉強にはなるかもしれないけど、その知識でガチガチに防御を固めていざそのプロジェクトに貢献するってなったときに、その人がどれほど役に立つかというと全く勉強していない人と同じぐらいだと僕は思う。
ソースコードというのはそのソフトウェアの具体的写像でしかなくて、いかにソースコードを理解しようともそのソフトウェアを理解したことにはならない。ソフトウェアを理解していないというは結果的に貢献(改善)すべき場所の特定や斬新なアイデアの生成ができないということに等しい。もちろんソースコードを読むというのはスキル上げの面でも娯楽の面でも結構な事だと思う。が、しかし、それでいきなり自分が他人より貢献の力があると思ったりするのは良くない。
どういうわけか巷では、ソフトウェアを改造することよりもそのソースコードを読むことのほうが遥かに人気を博しているようだが、ソースコードを読むことのどこが楽しいのかよくわからない。僕が勉強と銘打って何かしらのソースコードを読んでいるときはいつも全然内容が身についてないなと感じる。それを避けるためか否かは自分でもはっきりしないが、結果的に必要のないときに概観や単語の取得するため以外にソースコードを読むことはやらなくなった。それよりか、今そのソフトウェアにどういう事が起きててどういう事が望まれるかをアンテナを張り巡らしてウォッチしたり考察したりするほうが好きだし、よっぽど生産的だと考えている。別にソースコードを読むのは何かやることを見つけてからでも遅くないし、それに加えておそらくそういう状況のほうが内容が身につくと思うのである。
しかし、アンテナを張り巡らしたり、毎日休むことなく具体的にあるいは漠然と何かやろうと考えるのはなかなか体力が必要で、結局ひとまずそういうことを未来の視野において、今のうちにソースでも読んでおこうという人が出てくるのだと思う。別に今やったって誰も困るわけでもないのに。
僕は人に言えた身分ではないけれども、少なくとも毎日 lkml を読んだり、何かしらアイデアを練ったり、バグを見つければすでにポストされているかを探すようにしている。何も貢献する気はないと言ってしまえばそれまでなのだが、しかしオープンソースソフトウェアに限った話ではなく、どのような世界でもそのようなアグレッシブさを発揮できる人のみが自分の力や知識を如何なく発揮できるポジションに付くものなのだろうと僕は思っている。
僕は周りの数人(カーネルに興味のある人も含まれている)に lkml を読むことを必死に薦めている(*)。しかし誰も読もうとしない。読まない理由を理解できないわけではないが(要するに英語やらなんやらで面倒くさいのだろう)、読まない理由で自分を制させる理由は理解できない。人間は自分の処理系を変化させることによって対象をどう捉えるかを変化させることができる。
つまるところ、もう少しアグレッシブに考えるようにして、自分を自分が居たいと思うポジションに向かうように自分を律するべきだと思うのだ。
(*)数少ない日本人kernel hackerの富士通・亀澤氏もそう提案している
全然まとまってなくて申し訳ない。自律に関してはまた今度書く。
- Category(s)
- offtopic
- philosophy
- The URL to Trackback this entry is:
- http://dev.ariel-networks.com/Members/matsuyama/the-lack-of-aggressiveness/tbping
Re:アグレッシブさが足りない
両者の違いを例えるならば、目の前に百のインターフェイスと千の機能を備えた不思議な箱(取説つき)が存在し、それを見て、『こいつの中身はどうなってるのだろう』と思うか、『こいつをどう利用しようか』という事だと思いました。
matsuyamaさんほどの実力者ならば、後者に『どう改造しようか』という考察も追加されるのかもしれません。しかし、それは中身を知った人間とて同じ事です。
又、
>オープンソースソフトウェアのソースコードを読むことは確かに勉強にはなるかもしれないけど、その知識でガチガチに防御を固めていざそのプロジェクトに貢献するってなったときに、その人がどれほど役に立つかというと全く勉強していない人と同じぐらいだと僕は思う。
と思われる根拠を教えてください。
Re:アグレッシブさが足りない
同じというのは少し乱暴な気がしますが、自分が読んだ氷山の一角のみを正とし、その結果柔軟性を失い状況に応じて適切な解決策を考えられなくなる
というのであれば確かに無知の人よりタチが悪い場合があるとは思います。実際他人のそういう場面を見てきましたし、僕自身も当てはまる場面が多々ありました。
少ない情報しか得ていない状態で無理に理論武装をしようとしてしまって、結果そこから身動きが取れなかったり・・。
Re:書きはじめ
Re:書きはじめ
Re:書きはじめ