UbuntuでTopCoderをやる方法まとめ。

Post to Twitter

プログラマが腕を競い合うTopCoderというサイトがある。
ここで戦ってれば、「私のレーティングは53万です」とか分かりやすく主張できるらしい。
レーティングが2200を超えるとレッドコーダと呼ばれる人種となり、崇められる。
日本にレッドコーダは十数名しかいないらしい。

レーティングの高いプログラマをリクルートしたがる企業もあるってさ!!!

というわけで、戦友が欲しいので始め方をまとめる。

続きを読む UbuntuでTopCoderをやる方法まとめ。

ubuntuにruby-rvmを入れようとしてエラーに。

Post to Twitter

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を入れてみたところ、普通に動いているように見える。

ssh鍵によってシェルを使い分ける

Post to Twitter

安全に.zshrcをいじくりまわすために。
!!! このエントリの内容は危ないので、もし実践するときは睡眠が足りてる時にやってください。sshでログインできなくなってしまった時でもどうにかなるように、あらかじめログインしてるターミナルを一つ確保して作業すると吉です。

目次

1. 概要

私は”ssh sakura”でさくらのVPSにログインするように設定している。
そしてVPSのログインシェルをzshにしている。
もし.zshrcを弄っててやらかしちゃった時に、shでログインして.zshrcを修正できるようにしたい。
つまり、”ssh sakura_safe”ってやるとzshじゃなくてshに迎えてほしい。

2. ログインシェルの設定

ログインシェルは/etc/passwdの自分の行の末尾に書いてある。
いままではこれを大胆に/bin/zshに書き換えてたが、なんだか不安になった。
そう、師匠のTさんが僕の不安を煽ってきたのだ!!!
なので、これを/bin/shに戻す。

3. 二つのssh鍵の生成

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が迎えてくれる。

4. sshログイン時のコマンドの設定

あんまり使わないけれど、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が走るのを眺める方法

Post to Twitter

ドルクエッション? ドルクエスチョン? 検索にかかりにくい$?の話。

延々とslが走るのを眺めたくなった。
が、terminalの閉じるボタンで消すのはやなので、ctrl+cで止めたい。
ちなみにslっていうのは、和製のキータイプ矯正ソフトのことです。

目次

1. slのインストール

sudo apt-get install sl

2. 延々と走らせる

slは-eオプションを付けないと、ctrl+cで終了させてくれない。
なのでsl -eをwhileループで回すのだが、まぁ、こう打ち込む。

true; while `return $?`; do sl -e; done;

3. 若干の解説

$?には、直前に実行したコマンドが成功してれば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 $?`って書いたら動いた。

IRCクライアントirssiで発言内容をnotify-sendでデスクトップ通知

Post to Twitter

前回はubuntuのデスクトップ通知を複数個出すべくデスクトップ通知デーモンを切り替えた。(notify-osdからnotification-daemonに切り替える
今回はチャット(IRC)の発言内容を通知するためのperlスクリプトを書く。
環境はubuntu11.04

続きを読む IRCクライアントirssiで発言内容をnotify-sendでデスクトップ通知

notify-osdからnotification-daemonに切り替える

Post to Twitter

IRCでの発言をデスクトップに通知して欲しいです><
ということで、やってみる。ubuntu 11.04
まずは第一段階として、notify-osdからnotification-daemonに切り替える。

目次

1. notify-sendコマンドの導入

$ sudo apt-get install libnotify-bin

とすると、notify-sendというコマンドが出現する。

$ notify-send test

とすると、デスクトップ通知でtestと出るはず。
このコマンドを使うと、自作のスクリプトとかからもデスクトップに通知を出せて、夢が広がる!!!
のだけれど、notify-sendを連打するとわかるように、通知が一個しかだせない。
これではIRCの発言をデスクトップに出すのは無理なので、notify-osdからnotification-daemonに切り替える。

2. 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ってすると待ってるデーモンが入れ替わってることを確認できる。

3. デフォルトデーモンの変更

参考:[くしゃみ日記] 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が待っててくれるようになった。

bashのプロンプトにgitリポジトリを表示

Post to Twitter

前回は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のブランチを表示する

Post to Twitter

zshのプロンプトにgitのブランチ名を表示するようしたのでメモ。

目次

1. 画像

gitの管理下にあるディレクトリに入ると、ブランチ名を表示するッッッ!!!
前回のコミットから変更がなければ緑で、何か変更があれば赤で表示。
ちなみに顔文字は、前回のコマンドが成功したか否かで表情を変える。
zsh 前のコマンドの成否をプロンプトの顔文字で通知

2. .zshrcの内容

.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行ってきました。

Post to Twitter

Kyoto.pm @ はてな京都本社、行ってきました(Perlの勉強会)。
みなさん、お疲れ様でした!!!

ユーモアあふれる方ばかりで面白かった。
CPANには冗談で作ったモジュールを投下するAcme::という名前空間があるらしく、結構みなさん作ってらっしゃる様子。

これはいいね。
Perl始めて二ヶ月くらいの僕がCPANに投下するなど、ハードルの高いことだと思っていた。
ちゃんと使ってもらえるモジュールを・・・とか、
重大なバグがあった場合の責任が・・・とか、
モジュールのメンテナンスが・・・とか。
こんな僕に、パッケージ公開の体験をする機会、言語仕様の深いところまで弄る機会、およびコミュニティに入り込む機会を与えてくれる場が、Acmeモジュールの作成なのではなかろうか。

というわけで、次回までに何か作って発表できたらなぁと思った。
今日はありがとうございました。

Debian系に、パッケージの説明文を見るためだけにyumを入れる。

Post to Twitter

学部の研究室は、教授も院生もubuntuだった。 We love ubuntu !!!
それはさておき、aptのパッケージとyumのパッケージの対応を調べたくなった。
ubuntu(11.04)に、説明文を見るためだけにyumを入れるメモ。

目次

1. yumのインストール

sudo apt-get install yum

2. 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リポジトリ以外も、同じ要領で入れた。

3. パッケージの説明文見る

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

ソースを落として中身を調べることでパッケージ名の対応を調べるとより確実かと思われたが、そこまでするのは面倒だった。