プログラマが腕を競い合うTopCoderというサイトがある。
ここで戦ってれば、「私のレーティングは53万です」とか分かりやすく主張できるらしい。
レーティングが2200を超えるとレッドコーダと呼ばれる人種となり、崇められる。
日本にレッドコーダは十数名しかいないらしい。
レーティングの高いプログラマをリクルートしたがる企業もあるってさ!!!
というわけで、戦友が欲しいので始め方をまとめる。
プログラマが腕を競い合うTopCoderというサイトがある。
ここで戦ってれば、「私のレーティングは53万です」とか分かりやすく主張できるらしい。
レーティングが2200を超えるとレッドコーダと呼ばれる人種となり、崇められる。
日本にレッドコーダは十数名しかいないらしい。
レーティングの高いプログラマをリクルートしたがる企業もあるってさ!!!
というわけで、戦友が欲しいので始め方をまとめる。
ubuntu 12.04。
sudo apt-get install ruby-rvm
ってしたときに、以下のようなエラーに。
(LANG=Cで実行したときのエラーメッセージも取っとくべきだった・・・)
ruby-rvm (1.6.9-0ubuntu2) を設定しています ... dpkg-statoverride: error: 文法エラー: statoverride ファイルに未知のグループ 'admin' があります dpkg: ruby-rvm の処理中にエラーが発生しました (--configure): サブプロセス インストール済みの post-installation スクリプト はエラー終了ステー タス 2 を返しました 以下のパッケージの処理中にエラーが発生しました: ruby-rvm E: Sub-process /usr/bin/dpkg returned an error code (1)
まいった。
grep admin `locate ruby-rvm`
とかやって調べたところ、
/usr/share/ruby-rvm/scripts/extras/rails および /var/lib/dpkg/info/ruby-rvm.postinst にadminと書かれていた。
なんか、chown -R root:admin とかやってる。ubuntu的にはroot:rootのハズ・・・
とりあえず、 :%s/admin/root と置換したあとに、 apt-get install ruby-rvm と打ちなおすと、インストールは完了した。
大丈夫かどうかは不明。
とりあえず、これで入ったrvmで
rvm install 1.9.2
としてruby-1.9.2を入れてみたところ、普通に動いているように見える。
安全に.zshrcをいじくりまわすために。
!!! このエントリの内容は危ないので、もし実践するときは睡眠が足りてる時にやってください。sshでログインできなくなってしまった時でもどうにかなるように、あらかじめログインしてるターミナルを一つ確保して作業すると吉です。
私は”ssh sakura”でさくらのVPSにログインするように設定している。
そしてVPSのログインシェルをzshにしている。
もし.zshrcを弄っててやらかしちゃった時に、shでログインして.zshrcを修正できるようにしたい。
つまり、”ssh sakura_safe”ってやるとzshじゃなくてshに迎えてほしい。
ログインシェルは/etc/passwdの自分の行の末尾に書いてある。
いままではこれを大胆に/bin/zshに書き換えてたが、なんだか不安になった。
そう、師匠のTさんが僕の不安を煽ってきたのだ!!!
なので、これを/bin/shに戻す。
ssh-keygenで鍵をふたつ作る。
片方をsakura.pubおよびkey、 もう片方をsakura_safe.pubおよびkeyにリネーム。
.ssh/configにsakuraというHost名とsakura_safeというホスト名で、それぞれ登録。
ssh先の.ssh/authorized_keysにpubの方を追記。
(scpで打ち上げたsakura.pubを.ssh/に持ってきて、cat saura.pub >> authorized_keysってする。>>を>と書き間違えると、今まで許可してた鍵が全部消えてヤバイ。)
要するに、普通に鍵ログインの設定を二回する。
ここまでの状態でログインすると、/bin/shが迎えてくれる。
あんまり使わないけれど、ssh公開鍵にはコマンドを対応付けられる。
.ssh/authorized_keysのある行(一行が一つの公開鍵に相当)の先頭に次のように書いてみる。
command="echo hello" ssh-rsa ......
そして対応する秘密鍵でログインすると、コマンドラインに hello と表示され、即座にコネクションが閉じられる。ツンデレすぎる。
なのでzshを使いたい方の公開鍵の行頭に次のように書くと、ログインした瞬間にshがzshを起動し、zshをexitした瞬間にsshがログアウトする。
command="/bin/zsh" ssh-rsa ......
(具体的にいうと sh -c /bin/zsh ってなるみたい。)
このため、zshがログインシェルになってるっぽく見える。
これで、いざやらかした時にzshじゃなくてshでログインできるようになった。
ドルクエッション? ドルクエスチョン? 検索にかかりにくい$?の話。
延々とslが走るのを眺めたくなった。
が、terminalの閉じるボタンで消すのはやなので、ctrl+cで止めたい。
ちなみにslっていうのは、和製のキータイプ矯正ソフトのことです。
sudo apt-get install sl
slは-eオプションを付けないと、ctrl+cで終了させてくれない。
なのでsl -eをwhileループで回すのだが、まぁ、こう打ち込む。
true; while `return $?`; do sl -e; done;
$?には、直前に実行したコマンドが成功してれば0が、失敗してればそれ以外の値が入る、というマナーになっている。(C言語でreturn 0;するあれ。)
sl -eをctrl+cで終了すると1を返してくれるので、これを検出してwhileループを抜ける。
ただ、最初っから$?に0以外の値が入っているとループせずに終わるので、最初にtrueコマンドを実行して$?に0を放り込む。
trueは0を返し、falseは1を返す。
$?をwhileやifの条件文に放り込むのは、
if [ $? = 0 ]; then echo success; else echo false; fi
とやればいいが、なんか好きじゃない。
引数をそのまま返すコマンドっていうのはないのだろうか?
C言語で書くとこうだろうか? なんかなぁ
int main(int argc, char** argv){
int ret = 0, count = 0;
char* arg1;
if (argc == 1) return 0;
arg1 = argv[1];
while (arg1[count]) ret = ret * 10 + arg1[count++] - '0';
return ret;
}
とりあえず`return $?`って書いたら動いた。
前回はubuntuのデスクトップ通知を複数個出すべくデスクトップ通知デーモンを切り替えた。(notify-osdからnotification-daemonに切り替える)
今回はチャット(IRC)の発言内容を通知するためのperlスクリプトを書く。
環境はubuntu11.04
IRCでの発言をデスクトップに通知して欲しいです><
ということで、やってみる。ubuntu 11.04
まずは第一段階として、notify-osdからnotification-daemonに切り替える。
$ sudo apt-get install libnotify-bin
とすると、notify-sendというコマンドが出現する。
$ notify-send test
とすると、デスクトップ通知でtestと出るはず。
このコマンドを使うと、自作のスクリプトとかからもデスクトップに通知を出せて、夢が広がる!!!
のだけれど、notify-sendを連打するとわかるように、通知が一個しかだせない。
これではIRCの発言をデスクトップに出すのは無理なので、notify-osdからnotification-daemonに切り替える。
参考:[Secret Sword!!!] Ubuntu9.10のNotify-OSDの問題点と解決方法
notify-osdとかnotification-daemonってなんぞ?
apt-cacheで説明文見ると、どっちも『daemon to displays passive pop-up notifications』とある。
つまり何かメッセージを待ち受け、届くとデスクトップ通知を出すデーモンらしい。
そのデーモンに働きかけるコマンドがnotify-send。
notification-daemonはちょっと前のubuntuまでデフォルトで使われていたが、今はnotify-osdに取って替わられている。
しかし通知を複数出すとか、機能面ではnotification-daemonの方が優れている???
$ sudo apt-get install notification-daemon
これでnotification-daemonとnotification-propertiesという設定コマンドが入る。
$ killall notify-osd $ /usr/lib/notification-daemon/notification-daemon
ってしたあとにnotify-sendってすると待ってるデーモンが入れ替わってることを確認できる。
参考:[くしゃみ日記] BodhiでNotify OSDをgmailの着信表示に使う
次にD-Busの設定を書き換え、notification-daemonを正式に任命する。
$ sudo vim /usr/share/dbus-1/services/org.freedesktop.Notifications.service
[D-BUS Service] Name=org.freedesktop.Notifications # Exec=/bin/sh -c 'if [ ! -x /usr(中略) Exec=/bin/sh -c 'exec /usr/lib/notification-daemon/notification-daemon'
これで以降、notfication-daemonが待っててくれるようになった。
前回はzshでプロンプトにgitブランチを表示する方法について書いた。
ただ、サーバとかで作業するとzshなくてbashになるんだよなー・・・。
ということで、bashで同じことをしてみた。
まず、以下のbashスクリプトを書く。ここでは実行権限ありで/home/smokycat/.bash/gitbranchに保存した。
# ^/.bash/gitbranch
#!/bin/bash
# echo git branch for color PS1
name=`git symbolic-ref HEAD 2> /dev/null`
if [[ -z $name ]]
then
exit
fi
name=`basename $name`
st=`git status`
if [[ -n `echo $st | grep "nothing to commit"` ]]
then
echo -e "\e[1;32m[$name]\e[0m"
else
echo -e "\e[1;31m[$name]\e[0m"
fi
次にこれを.bashrc中で、シングルクォートに囲まれてるところでバッククォートで呼び出す。
単純な例だとこう。
# .bashrc
# 前略 PS1='\u@\h:\w`~/.bash/gitbranch` \$ ' # 後略
zshのプロンプトにgitのブランチ名を表示するようしたのでメモ。
gitの管理下にあるディレクトリに入ると、ブランチ名を表示するッッッ!!!
前回のコミットから変更がなければ緑で、何か変更があれば赤で表示。
ちなみに顔文字は、前回のコマンドが成功したか否かで表情を変える。
(zsh 前のコマンドの成否をプロンプトの顔文字で通知)
.zshrcに長々と書くのも何かと思ったので、gitについて調べるスクリプトを分離した。
# ~/.zsh/prompt-git-current-branch
参考:git のブランチ名を zsh の右プロンプトに表示+ status に応じて色もつけてみた
(中身はほぼ一緒です。参考になる情報、ありがとうございます。)
function prompt-git-current-branch {
local name st color
name=`git symbolic-ref HEAD 2> /dev/null`
if [[ -z $name ]]
then
return
fi
name=`basename $name`
st=`git status`
if [[ -n `echo $st | grep "^nothing to"` ]]
then
color="green"
else
color="red"
fi
echo "%F{$color}[$name]%f"
}
# ~/.zshrc
setopt prompt_subst
source $HOME/.zsh/prompt-git-current-branch
PROMPT='
%B%(?.%F{green}^-^%f.%F{red}@_@%f) %F{blue}[%M:%/]%f`prompt-git-current-branch`%b
%(!.%F{red}%B%n%b%f # .%F{green}%B%n%b%f $ )'
setopt prompt_subst ってすると、プロンプト文字列を毎回評価するらしい(よく知らない)。
ただ、PROMPTに代入する文字列はダブルクォートではなくシングルクォートで囲わなければならない。
これで20分くらいハマってしまった。
次はbashで挑戦します。
Kyoto.pm @ はてな京都本社、行ってきました(Perlの勉強会)。
みなさん、お疲れ様でした!!!
ユーモアあふれる方ばかりで面白かった。
CPANには冗談で作ったモジュールを投下するAcme::という名前空間があるらしく、結構みなさん作ってらっしゃる様子。
これはいいね。
Perl始めて二ヶ月くらいの僕がCPANに投下するなど、ハードルの高いことだと思っていた。
ちゃんと使ってもらえるモジュールを・・・とか、
重大なバグがあった場合の責任が・・・とか、
モジュールのメンテナンスが・・・とか。
こんな僕に、パッケージ公開の体験をする機会、言語仕様の深いところまで弄る機会、およびコミュニティに入り込む機会を与えてくれる場が、Acmeモジュールの作成なのではなかろうか。
というわけで、次回までに何か作って発表できたらなぁと思った。
今日はありがとうございました。
学部の研究室は、教授も院生もubuntuだった。 We love ubuntu !!!
それはさておき、aptのパッケージとyumのパッケージの対応を調べたくなった。
ubuntu(11.04)に、説明文を見るためだけにyumを入れるメモ。
sudo apt-get install yum
sudo vim /etc/yum/repos.d/CentOS-Base.repo
ここに本来ならこう書くらしい。(参考:パッケージ管理(yum:CentOS編))
[base] name=CentOS-$releasever - Base baseurl=http://ftp.riken.jp/Linux/caos/centos/$releasever/os/$basearch/ gpgcheck=1
$releaseverとか$basearchとかなんだろう。よく分からない。
とりあえず、次のように書いた。
[base] name=CentOS-5.6 - Base baseurl=http://ftp.riken.jp/Linux/centos/5.6/os/i386/ gpgcheck=1
この後、 sudo yum list とすると、baseリポジトリのパッケージリストがローカルPCにダウンロードされる。
どうやら/var/tmp/yum-smokycat-p2TTS_/i386/$releasever/以下に入ったっぽい。$releaseverってなんだYO!と思いつつも、説明文読めればいいから放置。
baseリポジトリ以外も、同じ要領で入れた。
PHPでMySQLのあれはなんだっけ・・・と思ったりしたら、次のようにしたら捗る。
$ yum search mysql | grep php php-mysql.i386 : A module for PHP applications that use MySQL databases. php-pdo.i386 : A database access abstraction module for PHP applications php-pear-MDB2-Driver-mysql.noarch : MySQL MDB2 driver php53-mysql.i386 : A module for PHP applications that use MySQL databases php53-pdo.i386 : A database access abstraction module for PHP applications $ apt-cache search mysql | grep php libphp-adodb - The ADOdb database abstraction layer for PHP php-db - PHP PEAR Database Abstraction Layer php-mdb2-driver-mysql - PHP PEAR module to provide a MySQL driver for MDB2 php5-adodb - Extension optimising the ADOdb database abstraction library phpmyadmin - MySQL web administration tool htcheck-php - ht://Check により生成されたデータベースへのシンプルな php5-mysql - MySQL module for php5 php5-sqlite - SQLite module for php5
ソースを落として中身を調べることでパッケージ名の対応を調べるとより確実かと思われたが、そこまでするのは面倒だった。