--/--/--

スポンサーサイト

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

2007/07/24

今日のスクリプトについて

似非ハフマンで止まってるけど、これにはふかーい言い訳があるのです。

どう書く.orgというサイトにプログラムを投稿しています。しょぼいながらも。似たような内容なので、ブログにはアップせずに、どう書く.orgのほうにアップするようにしちょります。

へたくそなプログラムでもアップすることで添削を頂いたりして、プラスへと向かうものだ、と認識しているが、眺めるだけでも結構勉強になる。1つの問題に対して、様々な言語で、様々なアプローチのプログラムが集結しているからだ。

2007/07/24

Webアプリケーションセットアップ

Tomcat による web アプリケーション構築を開始した。今回のようなセットアップは今後何度も体験するだろうから、何度も調べなくていいようメモを残しておく。なお、環境は coLinux 内に構築している debian etch。

ディレクトリ構造

Tomcat web アプリケーションのディレクトリ構造を構築。

cd /my_websys
mkdir WEB-INF
touch web.xml
cd WEB-INF
mkdir classes lib src
touch build.xml

src ディレクトリと build.xml は必須ではない。ant を使うのでこれらも同時に作った。

Tomcat 5.5 の Context の設定

$CATALINA_HOME/conf/Catalina/localhost 内に Context名.xml と名づけた xml ファイルを作り、以下のように記述する。

<Context path="/my_context" docBase="/home/hoge/work/my_webbsys" debug="0" reloadable="true">
</Context>

Context の設定場所には色々と流儀(?)があるらしく、この他にも server.xml 内に Context タグを作成することで設定したり、$TOMCAT_HOME/プロジェクト名/META-INF/context.xml に設定したりなどあるらしい。(後者はよく分かってない)

Postgresql をインストール

sudo apt-get install postgresql
cp /usr/share/java/postgresql.jar web アプリケーションのディレクトリ/WEB-INF/lib

ついでに lib へ postgresql の api を追加しておく。/usr/share/java 内に配置されることを知らず、find しまくった。ちなみに postgresql のバージョンは 7.4 だった。さすが stable。

流石に3回もやると・・・。

初めて Tomcat での web アプリケーション開発環境構築を行ったときは、本当に時間がかかった。あれのおかげというべきなのか、今ではだいぶこういった環境構築作業に慣れたように感じる。何事も経験か。

2007/07/16

coLinuxの環境整備

WinXPへの移行に伴い、開発環境としてcoLinuxの環境を真剣に整えた。

ネットワーク

久しぶりにやってみるとネットワークが使えなくなっていた。DNSのアドレスが間違っていたらしい。

colinux で Debian GNU/Linux を利用する

nameserver IPアドレス

IPアドレスにプロバイダ等で提供されているDNSサーバのアドレスを指定すればいいのですが、普通DHCPにより自動的に取得するのが一般的な場合は、アドレスが変わる可能性がかなり高く、その都度エラーになって設定し直しするのは面倒くさいです。

このような場合は、Windows側をDNSプロキシとして使用すれば、このIPアドレスに「192.168.0.1」固定とできるので、問題は解消されます。

Windows側をDNSプロキシとして使用するには、Windows側で以下のコマンドを実行します。

netsh routing ip dnsproxy install

言うまでもなく、ここが一番苦労した。

samba

WinXPとファイルを共有するため、sambaをインストールした。

Debian 環境を整える(その1, アップデートと samba)

localesの設定

localesの設定

sudoの設定

#apt-get install sudo
#cd /etc
#cp sudoers sudoers.org
#vi sudoers
Gousername      ALL(ALL) ALL:wq

svn

sudo apt-get install subversion
svnadmin create ~/svn

まとめ

Java 5とかPythonとかもっと色々インストールしなくちゃいけなくて大変そうだな、と思ってたら以前ほとんどインストールしてしまっていたらしい。ネットワーク以外は楽チンだった。

sambaって初めて触ってみたけど動くようにするだけならそんなに難しくはないことが分かった。おそらくこの先引っかかるとすれば、文字コード関係だろう。

リポジトリをホームディレクトリに1つだけ作成した。全てのバージョン管理をここで行うつもり。まぁどうせ一人だし。

今後の予定

後はviの設定だとか、そういう細かいことをやっていけばいいでしょう。

2007/07/16

WindowsXPのチューニング

とある事情により、自宅のOSがWinXPメインになりつつある。というわけで長らく放置していたWinXP環境を再び整えることにした。

いらないアプリケーションの削除

長らく放置していただけあって、いらないアプリケーションが山のようにあった。まず、これらを削除した。

自動起動アプリの設定変更

メッセンジャーなど、ログインすると自動的に起動するアプリケーションを、起動しないように設定した。これのせいで起動が遅延するのが許せないため。

グラフィックドライバの更新

グラフィックドライバをインストールした記憶がないくらいだいぶ前のものを使ったままだったので、最新のものをインストールした。

デフラグ

大体内部の掃除が終わったところでデフラグをかけた。デフラグツールは標準のものではなく、GIGAZINEで爆速デフラグツールと紹介されていた、Auslogics Disk Defragを用いた。最近のアプリケーションは窓枠がVistaなんだね。以下はデフラグの結果。断片化していたものが13.75%から0.29%へ減っている。


ほこり掃除

WinXPは関係ないけど、こちらもひどい状況だったので掃除した。CPUファンは日ごろ掃除しているので綺麗な状態を保っているが、GPUについているファンやその他排気ファンなどは掃除していないので、今回はこちらを掃除した。だいぶ音が静かになった。

エディタのインストール

gVimが入ってなかったのでインストールした。これがなければ何も始まらない。

coLinux用のネットワーク

普段は無効に設定しておくことにした。有効にしておくと起動が遅延するため。

その他

デスクトップのアイコンを最小限にしたり、Firefoxを再インストールして整備したりした。

終えてみて

かなりいい感じになった。まず起動速度が全く違う。起動して5分は放置していないといけなかった代物が、全く違和感なく起動してくれるようになった。それからだいぶ動作も安定しているように思える。以前はよくフリーズしていた。

アプリケーションの削除に関して

使う予定がないものは全て消去した。使わないアプリケーションは残さない。必要なときにまたインストールするというスタンス。

また、開発環境は全てcoLinuxに一任することにした。coLinuxにsambaを導入することで共有している。なので今WinXPにはJDKもPythonも入っていない。ただ、Cygwinは残している。shがあると便利なので。

今後の予定

後は細かいことでチューニングとは異なるんだけど、エクスプローラには常にアドレスバーを表示するようにしたり、拡張子は常時表示にしたり、そういうことを気が向いたときにやっていこうと思う。

2007/07/09

[今日のスクリプト] 似非ハフマン符号化

基本情報の参考書を眺めてたらあったのでやってみた。が、書いてみた後でハフマンの例文にふさわしい文を探すべくハフマンで検索してみたところ、参考書に載ってたやつと符号の割り振りかたが微妙に違う。

今回作ったのは参考書で紹介されていたもので、出現回数の多い順に、0、10、110、と1を1つずつ増やしていっている。

 1 #!/usr/bin/python
 2 #coding:utf-8
 3 
 4 # 暗号化する関数
 5 def to_sign(val):
 6     chrlist = mksortedchrlist(val)
 7     signs = {chrlist[0]:"0"}
 8     for i in range(1, len(chrlist)):
 9         signs[chrlist[i]] = "1" + signs[chrlist[i - 1]]
10     result = ""
11     for c in val:
12         result = result + signs[c]
13     print result
14     return (result, chrlist)
15 
16 # 文字列から文字の出現回数の昇順のリストを生成する関数
17 def mksortedchrlist(val):
18     dict = {}
19     get = dict.get
20     for c in val:
21         dict[c] = get(c, 0) + 1
22     result = []
23     for k in dict.iterkeys():
24         if len(result) == 0:
25             result.append(k)
26         else:
27             i = 0
28             while i < len(result):
29                 if get(k) >= get(result[i]):
30                     result.insert(i, k)
31                     break
32                 elif i == len(result) - 1:
33                     result.append(k)
34                     break
35                 i += 1
36     return tuple(result)
37 
38 # 復号化関数
39 def decode(signs):
40     i = 0
41     result = ""
42     sign = signs[0]
43     chrlist = signs[1]
44     while i < len(sign):
45         cnt = 0
46         while sign[i] != "0":
47             i += 1
48             cnt += 1
49         result = result + chrlist[cnt]
50         i += 1
51     print result
52 
53 def main():
54     base = "tokyotokkyokyokakyoku"
55     print "前:",len(base) * 8
56     signs = to_sign(base)
57     print "後:",len(signs[0])
58     decode(signs)
59 
60 if __name__ == "__main__":
61     main()

結果

前: 168
11101001101011101000110100110100111110011010011110
後: 50
tokyotokkyokyokakyoku

最初に出力されているのが元のサイズ。文字数 * 8 で求めている(ASCIIは1文字8ビットであるため)。2行目は符号化した文字列。3行目は符号化した後のサイズ。4行目は符号化したものから元の文字列に戻したもの。

  • 今度からはもうちょっと使い道のあるスクリプト書くようにしようかなぁ。
  • 最近またちょっとみんpyを見直してみたりしている。読み飛ばしていた標準モジュールのところは今一番知りたいところの1つ。後、クラスの特殊メソッドは今非常に面白いと感じている。Python がどのようにオブジェクト指向言語として実現されたかが伺える部分だと思う。
  • 最近仕事が忙しく、GoogleReaderで購読しているRSSフィードもかなり溜っている。はず。常時100+は当たり前。100+のフォルダが4,5個ある状況。

2007/07/08

色々発見

Vimで色々と発見したことと、2つだけプラグインを入れてみた。

発見したことはプラグインを見付けている時に偶然発見したもの。

以前から、こういうコマンドがあればいいのに、と思っていたことで、ファイルエクスプローラからファイルを開くときに新しいウィンドウで開けないか、ということ。それからもう1つは、ウィンドウを分割したときにそれぞれ別のカレントディレクトリにできないのか、ということ。

Vim の help が偶然検索にヒットし、中身を見てみたところそれに該当するコマンドがばっちり紹介されていた。

新しいウィンドウに開くほうは、ファイルを開くときに o を使えばいいだけだった。

ウィンドウ別のカレントディレクトリの設定は :lcd でディレクトリを指定すると、そのウィンドウだけに指定したカレントディレクトリが適用される。

やはり基本的に Vim の操作に関する情報はほとんど help に網羅されてるっぽい。何か欲しいときは、まずは help、それでもなければ vim.org でスクリプト検索をするといいだろう。

それから今回導入したというプラグインは、EnhancedCommentifyと、VTreeExplorerというプラグインを導入した。

EnhancedCommentifyはコメント化、非コメント化を楽にするプラグインである。ビジュアルで範囲選択し、\xと入力すればその範囲がコメントアウトされる。ちなみにインサートモードでも有効らしく、前述のコマンドを書く際、行がコメントアウトされてしまった。

VTreeExplorerはファイルエクスプローラでディレクトリツリーを表示できるようにするもの。rename とか delete とかできないっぽいから、ツリー表示できること以外は低機能なのかなぁ。もうちょっと使い込んでみて、判断しようと思う。ちなみにVTreeExplorerに対しては以下のような設定を行っている。

" 縦分割でエクスプローラを表示
let g:treeExplVertical=1
" エクスプローラから Enter で開くとき、エクスプローラの右のウィンドウに表示
let g:treeExplSplitRight=1

:VSTreeExplorerで縦分割の左側にツリーを表示する。

ツリーを表示できたときや、今まで:'<,'>s/^/\/\/ /gなどとしてコメントアウトしていたのが \x で一発だったりとか、色々と感動してしまった。一番感動したのは :lcd かな。一番困ってたからね。

2007/07/05

EclipseでVimが使いたかった

vi(Vim) を使い倒すと宣言してから3ヶ月ちょい経つが、もうすっかり Vim 以外ではソースを(もはやテキストファイルすらも)書きたくない体になってしまった。Ctrl-N、.、qなどは特に良く使う。ビジュアルは使ったら負けかなと思ってるのでできるだけ使わない。特に意味はない。使わないと面倒な時は使う。後はマークをもうちょい使いこなせるようにしたほうがいいかな。それからバッファを開きすぎる傾向があるので :bd をもうちょっと使うようにしたほうがいいかな。

それはさておき、今回は Eclipse の魅力的な機能は羨ましいが、 Vim から離れられない僕への最高の処方箋となったことを紹介。

Eclipse において vi っぽい環境でエディットしたい!という場合、率直に思い付くのは Eclipse で vi プラグインを使うという方法。しかしこの vi プラグインが曲者で、有料らしいのだ。無料版もあることはあるが、似て非なるもので余計にストレスがたまるという声もあり、躊躇してしまう。こうなりゃ Eclipse なんて使わねえ!と思っていた(実際使わないで作業していた)が、やはり保存しただけでコンパイルが行われることや、GUIデバッグ、Ctrl-左クリックは非常に魅力的である。さらにコミット漏れをよく起こすおっちょこちょいな僕に、作業コピーの状況を視覚的にかつリアルタイムに見ることができる、あのソースツリーも羨ましいと思っていた要素の1つだ。

NetBeans には vi モジュールがあるらしいが、会社が Eclipse を使うという方針なのでこれも却下。

結局たどり着いたのが、先のリンク先でも紹介してあるが、外部プログラムでの変更を自動更新のオプションにチェックを入れ、基本的にソース閲覧・編集は gVim で、実行・デバッグ・バージョン管理(その他諸々)は Eclipse という形に落ち着いた。

Eclipse で Vim を使う、とは若干ニュアンスが違うけど、いいとこ取りでなかなかいい感じである。

2007/07/01

しつこく freemind について

ふと、Berylを切って使ってみたらどうだろうと思い、freemind を synaptic からインストールし、試してみた。

Beryl使用時は、ウィンドウの大きさを変えても中身の大きさ(マインドマップを書くキャンパス部分など)が変わらない問題が発生していたが、Berylを切るとこれは解消された

Java 6だとメニューが正しく表示されない問題も Beryl を切ることで解決した。

また、キーボードが効かなくなる問題については、キーボードとの相性の問題である気がしてきた

今使っているキーボードは HHK Lite2 というキーボードだが、このキーボードは Insert や Delete を使うとき、Fnキーと特定のキーを同時押しする必要がある。どうもこれらの Fnキーを使う操作の後、固まる傾向にある。freemind のよさはこれらのショートカットキーにあるというのに、これは致命的である。かといってキーボードは変えたくないし、mindomo は重すぎてお話にならなかった。

悩ましい限りである。

2007/07/01

[今日のスクリプト] 3n+1問題

B4 Wiki - 問題集より、3n+1問題。

 1 #!/usr/bin/python
 2 #coding:utf-8
 3 
 4 def maxlength(val1, val2):
 5     def calc(val, cnt = 0):
 6         cnt += 1
 7         if val == 1:
 8             return cnt
 9         elif val % 2 == 0:
10             return calc(val / 2, cnt)
11         else:
12             return calc(3 * val + 1, cnt)
13     return max([calc(n) for n in range(val1, val2 + 1)])
14 
15 def main():
16     print maxlength(1,10)
17 
18 if __name__ == "__main__":
19     main()

結果

$ python 3nplus1.py
20
  • 関数のネーミングが苦しい。センスのなさが伺える。
  • 記事を投稿してから、こうすればもっと簡潔じゃん、という理由の訂正を3回ほど行った。投稿する前にもうちょっとソースコードを眺めて、その訂正を施してから投稿しよう。

2007/07/01

[今日のスクリプト] マージソート

B4 Wiki - 問題集より、マージソート。

 1 #!/usr/bin/python
 2 #coding:utf-8
 3 
 4 def merge2(list1, list2):
 5     i = 0
 6     j = 0
 7     len1 = len(list1)
 8     len2 = len(list2)
 9     result = []
10     while i < len1 or j < len2:
11         if j >= len2 or (i < len1 and list1[i] < list2[j]):
12             result.append(list1[i])
13             i += 1
14         else:
15             result.append(list2[j])
16             j += 1
17     return result
18 
19 def merge2_old(list1, list2):
20     larger = list1
21     smaller = list2
22     if len(list1) < len(list2):
23         larger, smaller = smaller, larger
24     for val in smaller:
25         larger.append(val)
26         larger.sort()
27     return larger
28 
29 def mergeN(list):
30     if len(list) < 2:
31         return list
32     for n in list:
33         result = merge2(result, n)
34     return result
35 
36 def main():
37     print merge2([3,4,6,8], [2,4,7])
38     print mergeN([[2,3], [2,6], [5,9]])
39 
40 if __name__ == "__main__":
41     main()

結果

$ python merge.py
[2, 3, 4, 4, 6, 7, 8]
[2, 2, 3, 5, 6, 9]
  • merge2のほうはだいぶ邪道な気がする。今度調べて正攻法を学ぼう。
  • 2html.vimを使ってみた。<font>タグ使ってるのが気にくわないけど、まぁ見やすいしよかろうってことで。

追記

最初に書いたmerge2をmerge2_oldに、マージソートがどんなもんか調べて書いたのをmerge2として追加。merge2_oldはマージソートにすらなってない。

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