--/--/--

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

2007/09/30

Java の面白さ

最近 Java 熱が再加熱してきた。

Java の何が面白いかっていうと、クラスの作成を強制されるから、いやでもクラス階層、クラス関係を考えないといけないということ。つまりは、ビシッと構造化されたパッケージ、それに基づいた構成で小さなインターフェースでやりとりを行うクラス達、なんていう風な気持ちのいい構成を構築出来たとき、非常に気持ちいい。最高である。

別に他の言語でも可能なのは百も承知なんだけど、python だと package じゃなくて module だからディレクトリ階層みたいな気持ちいいことにはならなかったり、クラスの作成が強制ではなかったりする。これを強制される、っていうのが肝。

2007/09/29

vim で新たに help を追加する

$VIMRUNTIME/doc に突っ込むだけかと思ったら違った。

大体、プラグイン用のヘルプファイルを突っ込む場所として、/usr/share/vim/vim70/doc か /usr/share/vim/addons/doc があると思うんだけど、とりあえず前者に .txt ファイルを突っ込むとする。

/usr/share/vim/vim70/doc に tags というファイルがあるのを確認して、

sudo vi -c ':helpt /usr/share/vim/vim70/doc' -c ':q'

とやればヘルプファイルが追加される。

しかし、ヘルプファイルってどこに入れるべきなんだろう。俺は

export VIMRUNTIME=/usr/share/vim/vim70/

ってやってるからこの配下の doc ディレクトリに .txt ファイル、plugin ディレクトリに .vim ファイルを入れるようにしてる。どこが適切なんだろうか。

2007/09/26

1日30分でいいから続けなさい、っていう本

「1日30分」を続けなさい!人生勝利の勉強法55

タイトルで結論言ってて親切だよね。買わなくてもタイトルだけで参考になる。

何やろうかな。Python/Linux界隈で英語読めないことの辛さを実感しつつあるから英語かな。ただしWEBを読めるレベル。中学レベルの単語力とコンピュータ関連の専門用語、それに加えて高校下位レベルのイディオムってところ?

追記

WEB記事読めるレベルになりたいんだったら、そんなことちまちまやるよりWEB記事ひたすら読んだほうが早いように思えてきた。ただしその時、分からない単語・イディオムは適宜調べ、メモをとって保存しておくということを忘れないようにすることが重要。

1日30分は資格の勉強かアルゴリズムの勉強にでも当てよう。

2007/09/24

happy hacking keyboard professional を ubuntu で使うときの注意

英語配列なので、以下のコマンドを打つ必要がある。

setxkbmap us

セッションにこれ突っ込んどけばいい。

2007/09/24

vym

freemind に関する最後の記事でちらっと触れたけど、freemind が動かないのでその代替となるアプリが vym というアプリ。以前の記事を書いたときには日本語入力がうまくいかなかったが、つい先ほど思い出して試して見たところ、普通に日本語入力できた。

インストールは

sudo apt-get install vym

/etc/apt/sources.list にリポジトリを追加する必要はない。

日本語入力がうまくいかない場合、次のように .bashrc に追記するとよいかも。

alias vym='QT_IM_MODULE="xim" vym'

参考URL

ちなみに

もしやと思って freemind も試してみたけど、やっぱり同じ症状でダメだった。

2007/09/24

jd すっげー

ubuntu なら日本語セットアップヘルパとか、apt からインストールできる 2ch ビューワの jd なんだけど、vimperator の癖で jk で上下スクロールやっちゃったら普通にできてびっくりした。もしかしてと思ってそれっぽいキーを色々押してみたら、デフォルトでかなりのショートカットが割り当てられていることを知った。

タブの移動、スレを閉じる、操作するビューワを切り替えるなど、様々な操作がキーボードから行える。

具体的な操作方法は、file:///usr/share/doc/jd/help/help.xml をブラウザで見るとよい。

2007/09/22

libgmail 使ってたら

Gmailのアカウント停止くらった\(^o^)/

24時間停止って書いてあるから明日には復帰するんだろうけど、なんか悪いことしたかなぁ。

libgmail を使ったプログラムを何回も実行したり、ログインした libgmail.GmailAccount を1回永続化したオブジェクトを使いまわしたりしてたことが原因に考えられるけど、最初のほうは何回実行しても問題なかったし。。。クエリーの発行しすぎ?

一応そのプログラムのソースコードを載せた記事は下書きにして隠してるけど、用心して使わないとな。

2007/09/20

man -k

何かしたいことがあるが、どの man ページを調べればいいのか分からないとき、以下のようなコマンドを打つといい。

man -k keyword

これで keyword 含む man ページが列挙される。それっぽい man ページを開くとよい。ただし、and 検索の類はできない。スペース区切りで複数のキーワードを検索すると、or 検索となる。

man man

を見ておくのは大事。

2007/09/18

C

gcc の使いかたすらままならず、まして libc6-dev を入れないと Hello world すらできないことを知らなかったこの俺が、Cにはまってしまった。K&Rのせい。

ちなみに gcc の使いかたはいまだに適当。

gcc -o helloworld.o helloworld.c

みたいな使いかたしかしてない。基本的に困らないけど、たまに main がないファイルに関数を書くとき、上記のコマンドが通らないのが気持ち悪い。もちろんそのファイルを include する .c ファイルをコンパイルするときに同時にコンパイルされるんだろうけど、なんとなく、そうなんとなく気持ち悪い。完全に Java 脳だな、こりゃ。

で、C の魅力はその道具チックな感じ。プログラムが非常にコンパクトになる。というか小さいプログラムを C でコツコツ書くのが面白い。Java ではこうはいかないなぁ。Python なら同じ楽しみを味わえそう。

面倒だと感じるのはやはりオブジェクト指向でないところ。ほぼオブジェクト指向脳になってしまった俺には、あるオブジェクトに関して何か調べてもらう関数よりも、その知りたいことをオブジェクトに尋ねるほうが直感的だと考えてしまうから。例えばこういう違い。

C
main(int argv, char* argc) {
/* 文字列が数字かどうか判断する isdigits(char*) 関数があるとする */
    isdigits(*argc);
}
Python
if __name__ == '__main__':
    sys.argv[1].isdigit()

この点に関しては、俺は後者が圧倒的に好き。とはいえ、Java ばっかやってるとこういう C みたいな小さい言語に楽しさを感じる。

今の会社にいる限り C の仕事はありえないけど。

2007/09/15

K&R

本の内容よりサンプルコード・演習問題がいい感じだと社長に勧められて借りてきたんだけどマジでいい。読んで書いて面白い。やっぱプログラマの経典だよ。

今プログラミングを始めるならCで始めるべきではないと思う。アルゴリズムを低レベルで厳密に組み立てやすい(というか強要される)という意味ではCは有用だけど、それを最初にやるべきではないと思う。後、後に学ぶであろうオブジェクト指向な言語の理解への弊害となりやすい。俺がそうだった。

で、まずはそのオブジェクト指向言語を先に学ぶべき。Python, Ruby のどっちかが妥当なところ。簡単だし、ライブラリも整備されてるし、オブジェクト指向だし。

これらの言語がある程度身に付いたら、ここで一度Cを経験するべき。例えばだけど、C のポインタがなんとなく分かると Python や Ruby の可変オブジェクトに対する理解が一層深まる。

学校で C やったとき、つまり初めてのプログラミングで C を触ったときはあんまり面白みが分からなかったけど、Java でガチガチに縛られるようになって改めてやってみると、その言語仕様の簡潔さといい加減さに感動すら覚える。

2007/09/14

hello happy hacking keyboard

ついカッとなって買ってしまった。今は興奮している。

Happy Hacking Keyboard 墨 無刻印

とりあえず一発目はキレイキレイで手を清めてから触った。ほんで記念にCでHello Happy Hacking Keyboard書いた。これは書く必要なかったな。きもいし。

で、付属のUSBケーブルが逝ってて、たまたま手元にあったminiBケーブルで繋いでみたらなったりとか色々あった。BIOSレベルで認識できてないみたいだからUbuntuが悪いわけではないし、俺のワクテカを阻害した罪は大きいから明日店に文句言いにいこう。今のケーブル白くて似合ってないし。短いから繋ぎのUSBケーブルまで使ってるし。

彼女さんはブラインドタッチできないからlite2のままがんばってもらうとしよう。

今日会社からK&Rとアルゴリズム辞典借りてきたし、3連休はコード書きまくって早くこいつに慣れてしまおう。

2007/09/14

紅芋×麦茶

普段通り焼酎を麦茶で割ってのんだらクソまずかった。

というのも、こないだまで同じことを米焼酎でやってたんだけど、米焼酎だとこれがなかなかイケる。

で、米焼酎なくなったから紅芋焼酎で同じことやってみたら大失敗。まずい。もったいないから飲むけど。

こりゃ明日も風邪だな。

2007/09/14

消毒

風邪菌を消毒するために、焼酎飲んで寝る。何も間違ってない。

2007/09/13

欲しい。悩む。どうする。俺。

HHK Professional が欲しい。明日給料日。

目当てのものは2万。生活費、貯金、色々差し引いて自由に使える金額は3万。内、今月はこたつ布団を買うから、それを約1万と見積もって、自由に使える金額は2万。

さすがに無理がある気がしてきた。

こたつ布団ちゃんと探してから決めようかな。

2007/09/13

日毎にまとめる

はてなダイアリーは日毎にまとめられるみたいだけど、fc2はできないの?

たまーに1日に書きまくる日があるから、出来れば日毎にまとめられるようにしたいなぁ。

2007/09/13

風邪ひいた

昨日起きたら体が動かず、そのまま欠勤してもうた。

昨晩、就寝の時点で39.0度近くあったけど、今朝には熱が引いてたからとりあえず出といた。でもだいぶゴホゴホしたから他の人に伝染した可能性は高い。ごめんなさい。

2007/09/07

夜光性

眠れないから最近の自分の金銭の運用について考え直し、改善策を考えるなり、妄想したりしてたらモチベーションあがってきた。

夜は無駄にテンションあがるから困る。

2007/09/06

Google Reader に待望の検索機能

マジで待望すぎる。

The Official Google Reader Blog: We found it!

2007/09/04

bash メモ

if 文の各文字列評価演算子(! と -z と -n 以外は試してないけど)にスペース区切りの文字列を直接渡すと「引数が多すぎるぞハゲ」とエラーが出る。"" で囲ってやると、これを防げる。

 1 #!/bin/bash
 2 #############################################
 3 #url:  http://ja.doukaku.org
 4 #date: 2007年  9月  3日 月曜日 23:23:23 JST
 5 #############################################
 6 
 7 #重複のない配列(ただのスペース区切りの文字列だけど)を
 8 #作る関数
 9 function uniq () {
10     result=""
11     for c in $@; do
12         if [ ! "$(echo $result | grep $c)" ]; then
13         #if [ ! $(echo $result | grep $c) ]; then #これはエラー
14             result=$result\ $c
15         fi
16     done
17     echo $result
18 }
19 
20 function all_test () {
21     uniq 3 1 4 1 5 9 2 6 5
22 }
23 
24 all_test

実行結果(正しいもの)

$ ./doukaku.sh
3 1 4 5 9 2 6

実行結果(正しくないもの)

$ ./doukaku.sh
./doukaku.sh: line 13: [: 1: binary operator expected
./doukaku.sh: line 13: [: too many arguments
3 1 4 5 9 2 6
  • エラーが出ても結果が正しいのが気持ち悪い。
  • コメントの http://ja.doukaku.org のところは、このファイルがどう書く.orgの解答を書きまくる予定のファイルだから。

2007/09/03

背筋したら頭痛くなった

ポルナレフのAAを貼りたいところだけど、面白いセリフが思いつかなかったので自重。

色々調べてみたら、たぶん同じ症状であろうと思われる人たちがいろんなところに質問投げてた。集合知万歳。

要するに酸欠の可能性が高いと。

回避策としては酸欠を防げばいいわけだから、息を止めつづけないとできないような筋トレは避けること。後、呼吸のしかたにも注意して、

  • 力を入れるとき: 吐く
  • 力を抜くとき: 吸う

を心がければいいんじゃないかな。

普段全くと言っていいほど運動をしなくなった僕が、昨日突然エビ反り背筋を200回ほどやってこの症状が起こった。回数減らそうと思う。

関係ないけど、教えて!goo って powered by OKWave なのね。内容同じじゃんって思ったら一番下に書いてあった。知らなかった。

2007/09/02

ubuntu でログイン時に .bash_profile が読み込まれない

参考URL:

どうやら ubuntu ではデフォルトだと、グラフィカルログインの時には $HOME/.bash_profile が読み込まれない設定らしい。/etc/gdm/Xsession を編集してやることで、これを回避できる。

参考URLに紹介してある /etc/gdm/Xsession のように、

sudo vi /etc/gdm/Xsession

# First read /etc/profile and .profile
test -f /etc/profile && . /etc/profile
test -f "$HOME/.bash_profile" && . "$HOME/.bash_profile"
# Second read /etc/xprofile and .xprofile for X specific setup
test -f /etc/xprofile && . /etc/xprofile
test -f "$HOME/.xprofile" && . "$HOME/.xprofile"

のように、bash_profile を読み込むよう設定してやればよい。

ちなみにデフォルトだと、$HOME/.profile というファイルが読み込まれる設定になっていた。デフォルトシェルが bash なんだから .bash_profile 読み込むようにしときゃいいもんを、なぜこういう設定になっているのかが謎。

追記

ログインしなおしてみようとしたところ、何やらエラーが出てログインすることができなかった。おそらく原因は ~/.bash_profile 内で ~/.bashrc を読み込むという処理が行われるタイミングが、早すぎるのではという結論に達した。

デフォルトの ~/.bash_profile では、以下のようにして ~/.bashrc を読み込んでいると思う。少なくとも僕はそうだった。

if [ -f ~/.bashrc ]; then
    . ~/.bashrc
fi

ところが、デフォルトの設定で ~/.bash_profile の代わりに読み込まれるようになっていた、 ~/.profile 内では、この処理を以下のように行っていた。

if [ -n "$BASH_VERSION" ]; then
    if [ -f ~/.bashrc ]; then
        . ~/.bashrc
    fi
fi

BASH_VERSION が null ではないかというチェックが外についている。これが何を意味するのかはまだ分かっていないが、とりあえずこれに ~/.bash_profile もあわせるよう修正したところ、エラーは止まった。

それとこの ~/.bash_profile の読み込み問題とは関係ないが、デフォルトの ~/.bash_profile で、~/bin の設定のしかたが少しまずかったので指摘しておく。デフォルトではこのように記述してある。

if [ -d ~/bin ]; then
    PATH=~/bin:"${PATH}"
fi

つまり、~/bin というディレクトリが存在した場合、 $PATH の先頭に設定されている。これがまずい。

ユーザ固有の実行ファイルが詰められるであろう ~/bin は、システムの bin ディレクトリ、(/bin, /usr/bin, /usr/X11/bin などなど)よりも常に後に来るべき。

理由は簡単で、コマンドを実行する際、bash はこの $PATH に設定されたディレクトリを走って入力されたコマンドを探しにいくわけだが、当然先頭から探しにいくわけだ。つまりシステムの実行ファイルと同じ名前の実行ファイルが ~/bin の中にあった場合、 ~/bin の中のものが呼ばれてしまう。これはあまりに無謀である。それに加えてクラッカー達がこの危険な PATH と suid ビットを組み合わせて、セキュリティホールを作るシナリオがあるからだ。と、入門 bash に書いてあった。なので詳しいことは実は知らない。とりあえず危険らしい。

なので、以下のように修正するといい。ついでになぜか2度追加される現象が起こったので、それを防ぐ処理も追加している。

if [ -d ~/bin ]; then
    if [ ! "$(echo $PATH | grep $HOME/bin)" ]; then
        PATH=$PATH:~/bin
    fi
fi

これで無事 $PATH の最後に ~/bin が追加され、かつ重複追加も防ぐことができる。

もういっちょ追記

BASH_VERSION が null ではないかというチェックが外についている。これが何を意味するのかはまだ分かっていないが、とりあえずこれに ~/.bash_profile もあわせるよう修正したところ、エラーは止まった。

~/.profile のコメントに思いっきり書いてあった。

# if running bash
if [ -n "$BASH_VERSION" ]; then
    # include .bashrc if it exists
    if [ -f ~/.bashrc ]; then
	. ~/.bashrc
    fi
fi

要するに bash が走ってるかどうかのチェックをしてるみたい。

修正

~/.bash_profile における PATH の二重追加を防ぐために入れていた if 文の grep のところを、 $HOME/bin にした。こっちのほうがより正確かなと。

2007/09/02

逆ポーランド式の計算[リベンジ bash編]

さっきのリベンジ。基本的な文法があってないせいで、スタックに詰められる値がおかしくなっていた。

しかし改めて見直すとその部分は必要なく、最終的には結構シンプルな形になった。

 1 #!/bin/bash
 2 #逆ポーランド方式の数式を解くプログラム
 3 #2007年  9月  2日 日曜日 00:39:56 JST
 4 
 5 #解く関数
 6 #どうしても引数に * を文字列として渡す方法が
 7 #わからなかったので、掛け算は @ 記号とすることにした。
 8 #誰か教えてくり。
 9 function solve () {
10     stack=""
11     for token in $@; do
12         case $token in
13             "+" ) pop_args; add $arg1 $arg2;;
14             "-" ) pop_args; sub $arg1 $arg2;;
15             "@" ) pop_args; mul $arg1 $arg2;;
16             "/" ) pop_args; div $arg1 $arg2;;
17             *   ) push $token
18         esac
19     done
20     echo ${stack%% *}
21 }
22 
23 #スタックに詰める
24 function push () {
25     stack="$1 $stack"
26 }
27 
28 #スタックから2回ポップし、最初にポップしたものを
29 #計算の2番目の引数へ、後にポップしたものを計算の
30 #1番目の引数へ設定する。
31 function pop_args () {
32     arg2=${stack%% *}
33     stack=${stack#* }
34     arg1=${stack%% *}
35     stack=${stack#* }
36 }
37 
38 function add () {
39     push $(($1+$2))
40 }
41 
42 function sub () {
43     push $(($1-$2))
44 }
45 
46 function mul () {
47     push $(($1*$2))
48 }
49 
50 function div() {
51     push $(($1/$2))
52 }
53 
54 function test () {
55     echo test:solve 3 2 +
56     solve 3 2 +
57     echo test:solve 3 2 4 + +
58     solve 3 2 4 + +
59     echo test:solve 3 2 + 4 5 + -
60     solve 3 2 + 4 5 + -
61     echo test:solve 3 2 + 5 '*'
62     solve 3 2 + 5 @
63 }
64 
65 test

文字列演算子がかなり面白い。けど if 文とかのスペースにやかましいのがちょっと鬱陶しい。まぁ全てを文字列的に扱う以上しょうがないんだろうけど。

  • if 文で文字列比較するときは = の両端にスペースを入れる。

2007/09/02

逆ポーランド式の計算

リベンジ。でも Python で。

Python での逆ポーランドは前回カスみたいなコード書いたから、これに対するリベンジでもある。あいかわらず文法チェック等は一切無しだけど。

 1 #!/usr/bin/env python
 2 #coding:utf-8
 3 ##############################################
 4 #逆ポーランド式を計算するプログラム
 5 #2007年  9月  2日 日曜日 02:59:18 JST
 6 ##############################################
 7 
 8 operators = {
 9     '+':lambda x, y: x + y,
10     '-':lambda x, y: x - y,
11     '*':lambda x, y: x * y,
12     '/':lambda x, y: x / y,
13 }
14 def solve(target):
15     stack = []
16     ops = operators.keys()
17     for token in target.split():
18         if token not in ops:
19             stack.append(int(token))
20         else:
21             stack.append(operators[token](stack.pop(-2), stack.pop()))
22     return stack[0]
23 
24 def main():
25     print solve('2 2 +')
26     print solve('2 2 2 + +')
27     print solve('2 3 * 4 5 * +')
28     print solve('2 3 4 + * 3 /')
29 
30 if __name__ == '__main__':
31     main()
  • リストにしてもディクショナリにしても、便利すぎて涙が出る。

2007/09/02

逆ポーランド式の計算失敗

bash で。失敗した。

solve 3 3 3 + +

とかやるともうだめ。

 1 #!/bin/bash
 2 #逆ポーランド方式の数式を解くプログラム
 3 #2007年  9月  2日 日曜日 00:39:56 JST
 4 
 5 function solve () {
 6     stack=""
 7     isEval=false
 8     result=""
 9     for token in $@; do
10             case $token in
11             "+" ) pop_args; add $arg1 $arg2;;
12             "-" ) pop_args; sub $arg1 $arg2;;
13             "*" ) pop_args; mul $arg1 $arg2;;
14             "/" ) pop_args; div $arg1 $arg2;;
15             *   ) push $token
16                   isEval=false
17             esac
18             if [ $isEval=true ]; then
19                 push $result
20             fi
21         done
22     echo ${stack%% *}
23 }
24 
25 function push () {
26     stack="$1 $stack"
27 }
28 
29 function pop_args () {
30     stack=${stack#* }
31     arg2=${stack%% *}
32     stack=${stack#* }
33     arg1=${stack%% *}
34     arg1=${arg1:-$stack}
35 }
36 
37 function add () {
38     isEval=true
39     result=$(($1+$2))
40 }
41 
42 function sub () {
43     isEval=true
44     result=$(($1-$2))
45 }
46 
47 function mul () {
48     isEval=true
49     result=$(($1*$2))
50 }
51 
52 function div() {
53     isEval=true
54     result=$(($1/$2))
55 }
  • 文法チェックとか一切無し。男はだまtt
  • 代入のところで $hoge=hogehoge とかやったり、かなり基本的なことで躓いた。
  • スタックの操作がうまくいってないっぽい。

2007/09/02

端末で日本語打ちつづけると落ちる不具合

ここ(ubuntu-jpの中の人のIRCログっぽい)では対策あげたよって書いてあったんだけど、発生した。

上記のリンクで<jkbys> archive.ubuntulinux.jp に入れたので、upgradeすれば入ると思いますとあったので、

grep archive.ubuntulinux.jp /etc/apt/sources.list

してみたところ、

# deb http://archive.ubuntulinux.jp/ubuntu-ja edgy/
# deb http://archive.ubuntulinux.jp/ubuntu-ja edgy-ja/
deb http://archive.ubuntulinux.jp/ubuntu-ja edgy/
deb http://archive.ubuntulinux.jp/ubuntu-ja edgy-ja/

よくわからんけど何故か edgy edgy-ja がコメントアウトされてるにも関らず、同じものが有効になっている。しかも今走っているこの ubuntu は feisty だし。

とりあえず archive.ubuntulinux.jp に対策があがっているということなので

sudo apt-get update
sudo apt-get upgrade

してみるも、当然アップグレードは無し。今まで何回もアップグレードやってるんだから、これで解決するならとっくにしてるはずだし当然の結果。

なので、怪しいと思われる箇所を、下記のように書き換えてみる。

# deb http://archive.ubuntulinux.jp/ubuntu-ja edgy/
# deb http://archive.ubuntulinux.jp/ubuntu-ja edgy-ja/
deb http://archive.ubuntulinux.jp/ubuntu-ja feisty/
deb http://archive.ubuntulinux.jp/ubuntu-ja feisty-ja/

ほんで

sudo apt-get update
sudo apt-get upgrade

すると

> sudo apt-get upgrade
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています                
Reading state information... 完了            
以下のパッケージは保留されます:
  libtomoe-gtk0 ubuntu-desktop-ja
以下のパッケージはアップグレードされます:
  anthy evolution-data-server evolution-data-server-common jd kasumi
  language-pack-gnome-ja-base language-pack-ja-base lha-sjis libanthy0
  libcamel1.2-10 libebook1.2-9 libecal1.2-7 libedata-book1.2-2
  libedata-cal1.2-6 libedataserver1.2-9 libedataserverui1.2-8
  libegroupwise1.2-13 libexchange-storage1.2-3 libtomoe0 libvte-common libvte9
  libx11-6 libx11-data python-vte scim-anthy scim-tomoe tomoe-dic
  ubuntu-ja-setup-helper unzip

お、なんか scim-anthy とかそれっぽいのが入ってる。ストライクの予感。

とりあえずちょびっと使ってみたけど、今のところは再発していない。

ちなみにこの ubuntu、edgy から feisty にアップグレードしたんだけど、なんで自動的に edgy edgy-ja のところが書き換わっていなかったのかが不思議。コメントアウトはちゃんとされてるのに。

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。