--/--/--

スポンサーサイト

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

2007/06/22

[今日のスクリプト] forall / exists

B4 Wiki - 問題集より、forall / exists を実装せよ。

#!/usr/bin/python
#coding:utf-8

def forall(cond, list):
    return not [x for x in list if not cond(x)]

def exists(cond, list):
    for x in list:
        if cond(x):
            return True
    return False

def main():
    print forall(lambda x: x % 2 == 0, range(1,11))
    print exists(lambda x: x % 2 == 0, range(1,11))

if __name__ == "__main__":
    main()

結果

$ python forall.py
False
True
  • existsは1行でやるよりこっちのほうが数倍速いはず。

追記

forall のほうも exists みたいにアウトになった時点で false 返すようにしたほうが速いわな。exists の逆回しなのでソースコードは略。

2007/06/21

[今日のスクリプト] 完全数

B4 Wiki - 問題集より。

簡単なのばっかりやってるのは割愛。

#!/usr/bin/python
#coding:utf-8

def pfnum_oneline(n):
    return n == sum([div for div in xrange(1, n / 2 + 1) if n % div == 0])

def pfnum(n):
    divs = []
    for i in xrange(1, n / 2 + 1):
        if n % i == 0:
            divs.append(i)
    return n == sum(divs)

def main():
    for n in range(1, 1000):
        if pfnum_oneline(n):
            print n
    for n in range(1, 1000):
        if pfnum(n):
            print n

if __name__ == "__main__":
    main()

結果

$ python pfnum.py
6
28
496
6
28
496
  • main関数を導入してみた。
  • 投稿した後、これ一行いけるんじゃねと思ってやってみたら難なく行けたので追加。

2007/06/21

CheckStyle on ant

CheckStyleっていうJavaのコード規約チェッカーをantでも使えるのでそのメモ。

  1. CheckStyleをダウンロード
  2. build.xml に以下を記述。
    <taskdef resource="checkstyletask.properties"
        classpath="checkstyle-all-4.3.jarへのpath" />
    
    <target name="checkstyle">
        <checkstyle config="規約を記述したxmlファイル">
            <fileset dir="ソースディレクトリ" includes="**/*.java" />
        </checkstyle>
    </target>
  3. ant checkstyle で走らせると結果がずびびびびと表示される。

以下はCheckStyleやantとは直接関係ないけど、より使い易くするために用いた方法を紹介。

あるクラスについてだけのCheckStyleの結果が欲しい時、直感的にはant checkstyle | grep クラス名などとしちゃうのが人情ってもんだが、なぜかこいつがうまくいってくれない。というわけで僕は以下のようにした。

ant checkstyle -l log
grep クラス名 log | lv

わざわざ2行も書くのが面倒なので以下のようなシェルスクリプトを書いてみた。実際に使えるシェルスクリプトを書くのは初めてである。

#!/bin/sh
ant checkstyle -l log
if [ -n $1 ];
then
    grep $1 log > a
else
fi

実際はちょっと違う(省きたいパッケージ名を先にgrepで省いて、それからクラス名でgrepしていたので、elseではパッケージを省くgrepだけ走らせていた)けど、まぁこんな感じで後は vi a なんてすればいいわけである。vi なら操作記憶なんかを駆使すれば面白いようにビシビシとCheck項目を消していけるだろうし、何かと便利なのだ。

世の中には自分の知らない便利なツールが山ほどある。そして知っているツールにも自分の知らない便利な使い方がある。今日はその2つに出会えた。

2007/06/20

[今日のスクリプト] 文字列の距離

風邪から復活。

今日のスクリプトはB4 Wiki - 問題集より、文字列の距離。

#!/usr/bin/python
#coding:utf-8

def str_dist(arg1, arg2):
    i = len(arg2)
    if len(arg1) - len(arg2) > 0 :
        i = len(arg1)
        arg1, arg2 = arg2, arg1
    diff = abs(len(arg1) - len(arg2))
    cnt = 0
    for j in range(i - diff):
        if arg1[j] != arg2[j]:
            cnt += 1
    for j in range(i - diff, i):
        cnt += 1

    return cnt

print str_dist("mos_burger", "mac_burger")

結果

$ python str_dist.py
2

B4 Wiki - 問題集がいつの間にかパワーアップしている。最近勉強のノート用途での wiki に憧れてる。

  • python って変数の入れ換えにx, y = y, xが使えるのを忘れてた。

2007/06/15

antがかなりいい

ビルドツールのant。今までなんとなくその全貌が掴めなかったため敬遠していたが、今日なんとなく試してみたところ、かなりいい。今日使った機能は ant のほんの一部だろう。

Tomcat で走らせる WEB アプリケーションを作るとき、通常 class ファイルは、

作業ディレクトリ
        +---- WEB-INF
                 +---- classes

に配置するのが一般的であるが、通常の javac コマンドでは例えば、

作業ディレクトリ
        +---- src

に配置されているソースファイルを網羅的にコンパイルしてさらに class ファイルは前述の別の場所に配置する、なんてことはできないだろう。(僕が知らないだけか?)

ant では簡単な xml 形式の設定ファイルにソースファイルを置くディレクトリやクラスファイルを置くディレクトリを設定しておくことで、ant compile -f build.xml -l logなどとすればカレントディレクトリ内に置いてある ant の設定ファイル build.xml を元にソースファイルをコンパイルしてくれて、かつ通常はコンソールに吐き出されるだけのログを log というファイルに出力してくれる。

こうしておくことでコンパイルエラーを log ファイルに残しておき、これを見ながら修正する、なんてことができるわけである。

この他にも自動的にソースディレクトリに配置されているソースファイル全てについての Javadoc を任意のディレクトリに作ってくれたり、今日は使わなかったけど jar ファイルにパッケージングしてくれたり、ビルドに関することを自動的にやってくれる素晴らしいツールなのだ。

今更 ant かよ、と思うかもしれないが、Java 開発者でまだ使ったことがない人には一押しのツールである。

2007/06/15

vimで印刷

覚書。

  • 印刷コマンドは:hardcopy
  • 行数を印刷するにはset printoptions=number:y
  • 行末で折り返すにはset printoptions=wrap:y
  • 上記2つを同時に設定するにはカンマで区切る

Windows環境のgVimでしか使ったことないんだけど、gVim限定の機能?

ちなみに配色はgVimだと、使用中のcolorschemeの配色がそのまま印刷される。

2007/06/15

[今日のスクリプト] 選択ソート

基本。こっちはswapも基本。

#!/usr/bin/python
#coding:utf-8

def sele_sort(list):
    i = 0
    while i < len(list) - 1:
        tmp = i
        j = i + 1
        while j < len(list):
            if list[tmp] > list[j]:
                tmp = j
            j += 1
        tmpl = list[tmp]
        list[tmp] = list[i]
        list[i] = tmpl

        i += 1

a = [5,2,3,4,5,2,1]
print a
sele_sort(a)
print a

結果

[5, 2, 3, 4, 5, 2, 1]
[1, 2, 2, 3, 4, 5, 5]

2007/06/15

[今日のスクリプト] 挿入ソート

基本。swap には一時変数を用いない手法を用いた。

#!/usr/bin/python
#coding:utf-8

def ins_sort(list):
    i = 1
    while i < len(list):
        j = i
        while j > 0 and list[j-1] > list[j]:
            list[j-1] -= list[j]
            list[j] += list[j-1]
            list[j-1] = list[j] - list[j-1]
            j -= 1
        i += 1

a = [3,1,1,2,3,4,5,7]
print a
ins_sort(a)
print a

結果

[3, 1, 1, 2, 3, 4, 5, 7]
[1, 1, 2, 3, 3, 4, 5, 7]

2007/06/15

Linuxプログラマーの道具箱

Linux Programmer's Toolbox

del.cio.usのLinuxタグを購読しているんだけど、こんな記事があがっていたので紹介する。

  1. オープンソースツールをダウンロード/インストールせよ。
  2. ツールをソースからビルドせよ。(?)
  3. ツールのマニュアルを読め。
  4. VimやEmacsを含むテキストエディタ以外の開発環境を導入せよ。
  5. Linuxカーネルへの理解を深めよ。
  6. プロセスについての理解を深めよ。(分岐、複製、同期などについて)(?)
  7. 同上
  8. 多くのLinuxにおいてデフォルトでインストールされているツールを導入せよ。(losf, fuser, stat, hexdump, strace などなど)
  9. チューニングについての技術を磨くべし。
  10. デバッグツール、デバッグテクニックについての技術を磨くべし。

訳がかなり怪しいので、興味がある人は元記事を見てほしい。

2007/06/15

[今日のスクリプト] おやすみ

今日のスクリプトは、帰宅時間が遅かったためネタ探しおよびプログラムを考える時間がなかったのでお休み。

明日2つがんばります。

2007/06/13

[今日のスクリプト] 逆ポーランド記法計算機

よくあるネタ。del explist[i-1]のところとかかなりいやらしいのでもうちょっと綺麗にまとめたい。

処理の指針は

  • 現在の文字が演算子ならば、2つ前の値と1つ前の値について現在の文字の演算子で計算する。2つ前のところに計算結果を挿入し、1つ前と現在の文字は消去する。
  • 現在の文字が演算子でなければ、添字を進ませ次に行く。

という感じ

#!/usr/bin/python
#coding:utf-8

oplist = ("+","-","*","/")

def rpn(exp):
    explist = exp.split()
    i = 0
    while i < len(explist):
        if explist[i] in oplist:
            explist[i-2] = calc(explist[i-2], explist[i-1], explist[i])
            del explist[i-1]
            del explist[i-1]
            i -= 1
        else:
            i += 1
    return explist[0]

def calc(n, m, op):
    if op == "+":
        return str(int(n)+int(m))
    elif op == "-":
        return str(int(n)-int(m))
    elif op == "*":
        return str(int(n)*int(m))
    elif op == "/" and m != 0:
        return str(int(n)/int(m))

print "(6 3 2 + * 5 -)=" + rpn("6 3 2 + * 5 -")
print "(3 2 -)=" + rpn("3 2 -")
print "(6 4 3 2 + * / 5 -)=" + rpn("6 4 3 2 + * / 5 -")

結果

(6 3 2 + * 5 -)=25
(3 2 -)=1
(6 4 3 2 + * / 5 -)=-5

2007/06/12

[今日のスクリプト] 回文判定

元ネタ

#!/usr/bin/python
#coding:utf-8

def kaibun1(str):
    return True if not [s for i,s in enumerate(str[0:((len(str)/2)+1)]) if s != str[-(i+1)]] else False

def kaibun2(str):
    for i,s in enumerate(str[0:((len(str)/2)+1)]):
        if s != str[-(i+1)]:
            return False
    return True

print kaibun1("step on no pets")
print kaibun1(u"しんぶんし")
print kaibun2("step on no pets")
print kaibun2(u"しんぶんし")

結果

True
True
True
True

kaibun1(str) のほうが短いけど、こっちは途中で違うことが判明しようがなんだろうが全部に対してループ回すのに対し、kaibun2(str) は違うのが分かった時点で False を返す。

日本語は u"" でユニコード化する必要があるらしい。2ch で聞いた。

2007/06/12

今日のスクリプト

というコーナーを作ってみる。

具体的な内容としては、毎日1つ、代表的なアルゴリズムをPythonで実装する。

題材は主にC言語によるアルゴリズム事典や、B4 Wiki - 問題集などから持ってくる。

先日、「今年はJava一本に絞る!」という発言をしたが、早速撤回。メイン関数書くのがめんどくさい。Javaは会社でがんばります。

2007/06/10

HHK Pro2

憧れのHHK Pro2のデモ商品がヨドバシカメラに置いてあり、触ってみた。

正直言って今使っている HHK Lite2 とは全くの別もの。

どんなに柔らかくタッチしてもガチャガチャうるさい上にキーが硬くて押下するのにある程度の力が必要な Lite2 に対し、Pro2 は程良く柔かく、非常に打鍵感が心地よい。ますます欲しくなったが、値段がアレ。今年はちょっと無理な気がする。

福岡県民でHHK Pro2を触ってみたい、という方はヨドバシカメラ博多駅前店の地下1Fキーボード売り場に足を運んでみるといいだろう。HHK Pro2 と同じところに、よく良キーボードの代表格として HHK Pro2 と一緒に挙げられる、 Realforce もデモが出してあるので、そちらを触ってみるのもいいかもしれない。

2007/06/10

.vimrc

以前 .vimrc について書いたが、設定をまた色々いじったのでメモ。

syntax on
set ts=4 sw=4 sts=4
set expandtab
set nohlsearch
set autoindent
set smartindent
set background=dark

1行ずつ説明すると、

  1. 色付け
  2. タブ幅の設定。全て4
  3. タブをスペース化
  4. / や ? で検索するときハイライトしない。次の } まで削除するとき、 d/}などとするが、set nohlsearch を設定しておかないと } 全てがハイライトされてうざいため。
  5. 自動インデント
  6. よくわからない
  7. 暗い背景に適した syntax になるように

こんだけで十分な気がする。

2007/06/10

改修工事終了

1、2週間ほったらかした後また着手してから大体4、5日。レイアウトテンプレートなどを駆使して作業してみるとあっという間に終わってしまい、落胆してしまった。と同時に、フレームワーク(ここだとテンプレートだけど)などを用いると如何に作業が楽になるかを感じた。

改修するにあたってこういう形を目指そう、というのがいくつかあったけど、それに加えて以下のようなことをやりたかった。

  • でっかい RSS feed アイコンを使いたかった。
  • 構造を線で表現したかった。
  • カテゴリをタグメニュー化したかった。
  • 無駄を省きたかった。

RSS アイコンは見ての通り。他にいい感じのを見付けたときにはその都度適当に変えるのもいいなと思っている。

今回は線を多用した。シンプルかつシャープに構造を表現できることを目指した。

タグメニューはMore Free CSS Navigation Menu Designsもろぱくり参考にした。

以前の本blogにはとにかく無駄が多かった。記事を書いた時間へのリンクってなんなの、とかまぁとにかくうざったらしく思っていた。それからカテゴリの氾濫もそれに当たり、今回統合する形となった。線で構造を表現する、などはその現れである。

それから以下のような変更点がある。

  • 続きを読む、廃止した。
  • RSS feed 配信が全記事を網羅するようになった。
  • いくつかのカテゴリを統合し、より汎用的なものだけを残した。

続きの読むの廃止に関しては、作り替えるのが面倒だったもう使わないから。過去の記事に関してはその内「続きを読む」欄から「本文」へ統合しようと思う。気が向いたときにでも。

RSS feed 配信に関して、以前は fc2 blog 付属のプラグインを用いていたせいか、最新記事10件(しかもタイトルと記事本文の一部のみ)のみの配信になっていたのが気がかりだった。今回はここを改善し、全記事の本文全てを配信するようにした。

カテゴリの統合はいずれやりたいなと思っていたこと。PythonとJavaをProgrammingに統合し、vimとemacsを開発環境に統合した。特にemacsなどはもう記事を書くことはなさそうなので、カテゴリとして残しておくのはいやだったし、かといって記事を消すのはもったいないと思っていた。

以前は記事本文に対してリストくらいしかタグ付けしていなかったため、ここも全て直そうかと当初は考えていたが、さすがにめんどくさすぎるでこれはやめにする。

2007/06/07

howto install Tomcat6

以前から tomcat5.5 のインストールに悩まされていて、普通は apt-get install tomcat5.5とでもすればインストールされてしかも勝手にデーモン扱いの手続きまでしてくれるはずなんだけど、どうしてもうまくいかなかった。

半ばめんどくさくて諦めてたが、今日なんとなく tomcat6 を入れてみようと思い、調べながらやってみた。

上記の2つのサイトを参考に導入した。どちらも ubuntu ではないので、僕が ubuntu feisty で行った手順を残しておく。なお、JDKのインストールについては省く。

  1. 公式サイトからTomcat6の最新版(2007/6/6 時点)をダウンロード
  2. DLしたファイルを解凍するtar zxvf apache-tomcat-6.0.13.tar.gz
  3. 解凍してできたディレクトリを適当な場所へ移す。ついでに名前も簡単なものに変更する。sudo mv apache-tomcat-6.0.13.tar.gz /usr/local/tomcat6
  4. このへんでいっちょ起動テスト。sudo /usr/local/tomcat6/bin/startup.shブラウザにて http://localhost:8080/ で確認。
  5. Tomcat5のインストールの自動起動スクリプト(ここでは /etc/init.d/tomcat6 と名付けるものとする)を書く。ファイル名だとか、JAVA_HOME だとか、Tomcat までのパスなどは自分の環境にあわせる。
  6. 実行権限を付与する。sudo chmod 755 /etc/init.d/tomcat6
  7. 魔法の呪文。よくわかっていない。とりあえずPCを立ち上げたら起動するように設定している。と思う。sudo update-rc.d tomcat6 defaults 30

そんなこんなで無事Tomcat6のインストールに成功した。

-----------------------

追記

今日立ち上げてすぐ http://localhost:8080/ してみたけど立ち上がってはいなかった。まぁsudo /etc/init.d/tomcat6 startすればいいだけの話。どうせ練習用だし。

2007/06/05

目標進捗

今年掲げた目標の進捗を調べてみる。

  1. viを使い倒す
    • これは正確にはvimを指す。仕事/自宅ともにvimで作業を行っていることもありかなり慣れた。後は便利なvimスクリプトを探してみたり、知らないコマンドを身につけたり、より短いコマンドで済ませられるよう練習するのがいいだろう。

・・・あれ、こんなにいっぱい絶対無理だろってくらい掲げたつもりだったんだけど、「site:talototo.blog48.fc2.com 目標」でぐぐってみても上のやつしかヒットしない。おかしいなー消しちゃった記事に書いてたのかなー。

消えちゃったからしょうがないので上のに加えて掲げなおし。

  1. 毎月技術書を1冊読む
  2. 毎月技術書以外の本を1冊読む
  3. Javaをマスターする

技術書はJava本、プログラミング全般の本、Linux/UNIX本がメイン。オラ本を中心に読んでいこうと思う。

技術書以外の本は本屋をうろついて直感的に目についたものを買っていこうと思っている。これはぼくが読んだ面白い本・ダメな本 - そしてぼくの大量読書術・驚異の速読術達人プログラマーの影響。

Javaのコアパッケージ~は、仕事でJavaが必要だから。そして言語についての目標をJavaに絞ったのは、僕に基礎力がないから。基礎力は様々な縛りがあったほうが伸びやすい、と経験上考えている。Javaは縛りの強い言語である。つまりJavaを、特にJavaのコアパッケージについて学習することで基礎力を高めようと考えた。

達人プログラマーにはプログラマーは1年に1つの言語をマスターするべきという記述があった。どの程度でマスターと呼べるかは分からないが、とりわけJava SEのパッケージについて不自由なく扱えることができればマスターした、と僕は定義した。というわけで今最も覚えなければならない言語であるJavaに絞ることにした。

Javaはでかい。でかすぎる。様々なジャンルの数多のパッケージが標準でインストールされている上に、バージョンを追う毎に覚えることが増えている。おそらく言語だけの勉強には留まらないだろう。Java 5の新しい言語仕様なんてほとんど知らない。覚えることはごまんとある。それに屈することなく適当に立ち向かっていこうと思う。

あ、あと追加で今月の目標にblogを整えるも挙げておこう。コメントの submit ボタンがないらしいし。

2007/06/01

[coLinux]coLinux導入メモ

なんとなく入れてみたかったのでやってみた。そのメモ。

まず導入部分は以下のサイトと丸々同じようにやった。 注意すべきは etch.conf(設定ファイル) の最後に改行を入れないとアレしてくれないこと。

debian-etch環境構築まとめ

次にcoLinuxを導入した目的が

  • linux鯖の環境でプログラムが動くか確認が容易
  • unixツールを簡単に使うことができる
  • debianのお勉強
  • なんとなく

と、色々あり、特に最初のlinux鯖の環境でプログラムが動くか確認が容易には色々とインストールが必要なので、そのメモ。

apache2

apt-get install apache2

tomcat5.5

GettingNutchRunningWithDebianをもろ参照。tomcat-users.xmlの設定まででいいと思う。

non-free を /etc/apt/sources.list に追加するってのは、

  • deb http://ftp.debian.org/debian/ etch main contrib non-free
  • deb-src http://ftp.debian.org/debian/ etch main contrib non-free

の2行を /etc/apt/sources.list に追加すればいい。これをしないと java 関係がインストールされない。

w3m

apt-get install w3m

これは何に使うかってーとjspとかservletの動作確認のため。他に方法が思いつかなかったので。

ちなみに perl だの python だのは tomcat5.5 をインストールするときに一緒にされてた。

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