« 2007年5月 | トップページ | 2007年7月 »

2007/06/29

[python] weakref を使って・・・

Python で Singleton クラスを作ろうと思ったんだけど、weakref を使ったら上手く書けるかもと思いついた。
が、weakref を使うのは初めてなのでいろいろと調べないとコードがかけそうにない。

今日は眠いので寝よう・・・( ´・ω・`)

| | コメント (0) | トラックバック (0)

2007/06/28

[C++] Fukin' unconcise Code

今日はなかなか読み難い C++ のコードを読む羽目になった。

わたしならば、読み難いコードコンテストに応募しようとでもしない限りは絶対に書かないであろうコードだ。
あれが美しいだって?わたしにはブラックジョークにしか聞こえないね。

「読みやすいコード」「美しいコード」「拡張性があるコード」と散々わめいておきながら、一文字変数とか想像もつかないような省略形を使っていたり、dense なコードを書いていたり if 節に brace が使われていないのはなぜだ?

IPアドレスのような、誰でも知っている言葉を internet_protocol_address とするのは極端すぎるとして、

  • それが何なのか想像できない識別子は使わない( 一文字変数とか )
  • 省略形は誰でもわかるもの以外は使わない
  • 適度なスペースを入れる
  • 暗黙のルールは用いない ( 暗黙の宣言とか記号の省略はせずに全て明示する )
  • 予約語・オペランド・マニピュレータと見間違えるような識別子は使用しない
  • 予約語・オペランドの多重定義は、どう考えてもそれしか方法がない場合を除いて行わない
ってのが「読みやすくなる」ことを意識したコードじゃないの?
「読みやすいコード」「美しいコード」「拡張性があるコード」が大切だというならば
コード規約がどうこうの前にこれくらい守ってほしい。

ひとつ、上手だなと思ったのは do{} while(); の使い方。それは見習いたい。

| | コメント (0) | トラックバック (0)

2007/06/24

[python] お題2: 単語数のカウント

英文のテキストファイルを読み込んで単語の出現数を数えるプログラムを作れ。

例えばテキストファイルの中身が「It's fine day, isn't it? Yes, it is!」ならばit'sが1回、fineが1回、dayが1回、isn'tが1回、itが2回、yesが1回、isが1回となるように数えてよい。
(isn'tにはisが含まれているな、とか、It'sの'sはisの省略形だな、などと判断するのはとてもむずかしいので)

余力があれば出現頻度の多い順に出力するプログラムも書け。

うわ~、頻度順じゃなくてアルファベット順で書いてしまったよ orz

import sys, string

try:
    globals().__setitem__( "file_object", open( sys.argv[1] ) )
except IOError:
    print "指定されたファイルが見つかりません。"
    sys.exit()

words_counter = {}
for line in file_object:
    for single_word in line.split():
        single_word = string.upper( single_word )
        words_counter.update( single_word=(words_counter[single_word] + 1) ) if single_word in words_counter else words_counter.__setitem__( single_word, 1 )

maximum_length = max( [len( key ) for key in words_counter] )
total_amount   = reduce( lambda x, y: x + y, words_counter.values() )
print "Total%s%6s words" % (chr( 0x20 ) * (maximum_length - len( "Total" )), total_amount)

found_words = words_counter.keys()
found_words.sort()
for word in found_words:
    print "%s%s%6s words ( %s %% )" % (word, (chr( 0x20 ) * (maximum_length - len( word ))), words_counter[word], (words_counter[word] / float(total_amount) * 100.0))

後で書き直すかも。

| | コメント (0) | トラックバック (0)

[ C ] C 言語で FizzBuzz -- やっぱり邪悪編? --

なんか C 言語で FizzBuzz 書いている人がいるのでやってみた。
プログラマに対しても書いているんだけど、その前に言わせていただくと、なんで FizzBuzz があんなに長ったらしくなるのか理解できないしね。

# include <stdio.h>

int main()
{
    for( int row=1; row <= 100; row++ )
    {
        ((row % 3 == 0) && (row % 5 != 0)) ? printf( "Fizz, " ) :
            ((row % 3 != 0) && (row % 5 == 0)) ? printf( "Buzz, " ) :
            ((row % 3 == 0) && (row % 5 == 0)) ? printf( "FizzBuzz, " ) : printf( "%d, ", row );
    }
    
    return 0;
}

Thinking Time 30 sec.
gcc 3.4.5 with C99

1~100までの整数列を考えるところまではいいんだけど、そのあとは「次は4つのケースで場合分けしよう」で終わると思うんだよ。FizzBuzz クイズに関してはこれだけで閉じているんだから。拡張性考えろって言われたら、上のコードは NG だけどね。

プログラマに向いているか向いていないかを決めている原因のひとつは、わたしも分析能力にあると思う。パズルのピースがどんな形をしていて、それらが全部でいくつあるのかを見極める能力。それからもう1つ、パズルのピースを組み立てる能力もあるんじゃないかと思う。見つけただけじゃプログラムはできない。見つけたピースをどんな順番で組み立てるのかを考える能力もまた必要なことだと思う。

わたしは後者が欠けている。それと、特定の問題に対する最適解は出せるが、一般化した解を求められない。理学よりの能力はあるものの、工学よりの能力は低いみたいだ。

2007.06.24 03:54
友人 「ふつーに書け」
わたし「普通って( ´・ω・`)?」
友人 「if と else とか使って!」
というリクエストがあったのでそっちの方も書いてみようかと(;´Д`)

# include <stdio.h>
# include <string.h>

int main()
{
    char* replaced = "FizzBuzz";
    char fragment[strlen( replaced )+1];
    
    for( int row=1; row <= 100; row++ )
    {
        if((row % 3 == 0) && (row % 5 != 0))
        {
            strncpy( fragment, replaced, strlen( replaced ) / 2 );
            fragment[4] = '\0';
            printf( "%s, ", fragment );
            
        }else if((row % 3 != 0) && (row % 5 == 0))
        {
            strncpy( fragment, replaced + 4, strlen( replaced ) );
            fragment[4] = '\0';
            printf( "%s, ", fragment );
            
        }else if((row % 3 == 0) && (row % 5 == 0))
        {
            printf( "%s, ", replaced );
        
        }else
        {
            printf( "%d, ", row );
        }
    }
    
    return 0;
}

| | コメント (0) | トラックバック (0)

2007/06/19

[python] Workshop Edge2007 お題1 -- Synchronizing Directory

二つのディレクトリ(フォルダ)を指定すると、そのディレクトリの下の全てのファイルについて「片方にしかないファイルはもう片方へコピーし、両方にあるけどもタイムスタンプ(更新時刻)の異なるファイルは新しい方で古い方を上書きする」という処理を行うプログラムを作りなさい。

個人的な目標

  • 集合演算を使う
  • 20行以内にする
import os, shutil, stat

get_timestamp = lambda filename: os.stat( filename )[stat.ST_MTIME]
get_filelist  = lambda dir_path: [os.path.join( node[0], filename ) for node in os.walk( dir_path ) for filename in node[2]]
get_dir_info  = lambda dir_path: dict( zip( get_filelist( dir_path ), [get_timestamp( filename ) for filename in get_filelist( dir_path )] ) )

def synchronize_directories( dir1, dir2 ):
    (dir1_info, dir2_info) = map( get_dir_info, (dir1, dir2) )
    (symmetric_difference, intersection) = map( lambda method: eval( "set.%s( set([filename[len( dir1 ):] for filename in dir1_info.keys()]), set([filename[len( dir2 ):] for filename in dir2_info.keys()]) )" % method ), ["symmetric_difference", "intersection"] )

    # copies lacked files
    # It is necessary to make intermediate path before copying or replacing file.
    # For example, imagine dir_path=X:\hoge and filename=X:\hoge\piyo\fuge\bar.txt. In this case, intermediate path is /piyo/hoge.
    # At first, using expression "os.path.split( orz )[0][len( dir_path ):]" to get the path and then make path by 
    # os.makedirs( os.path.abspath( target_directory ) + intermediate_path )
    if symmetric_difference:
        for filename in symmetric_difference:
            (source_directory, distination_directory) = ((dir1 if True in [(filename in element) for element in dir1_info] else dir2), 
                                                         (dir1 if not(True in [(filename in element) for element in dir1_info]) else dir2))
            intermediate_path = os.path.split( source_directory )[0][len( dir1 ):]
            os.makedirs( os.path.abspath( destination_directory ) + intermediate_path )
            shutil.copy( os.path.join( source_directory, filename ), os.path.join( destination_directory, intermediate_path ) )

    # replace old files by later files
    if intersection:
        for filename in intersection:
            # by comparing timestamps, discriminate which is later, which is destination directory
            (later_file, destination_directory) = (os.path.join( dir1, filename ), os.path.join( dir2, os.path.split( filename )[0])) if dir1_info[os.path.join(dir1, filename)] > dir2_info[os.path.join( dir2, filename )] else (os.path.join( dir2, filename ), os.path.join( dir1, os.path.split( filename )[0]))
            
            os.makedirs( os.path.abspath( destination_directory + os.path.split( later_file )[0][len( dir1 ):] ) )
            shutils.copy( later_file, destination_directory )

目標達成ならず 31 行 _| ̄|○il|!
先週見た時は集合演算を使った回答がなかったので集合演算を取り入れてみました。

もしかしたらバグがあるかも。見つけたらご連絡くださいませ m(_ _)m

2007.06.19 23:58 追記
うまくトラックバックが遅れないようなので、コメントで投稿しました。
あちらだとコードが途中で切れていますが・・・

2007.06.20 15:00
ソースファイル添付忘れていたので添付しました。
こちら

2007.06.20 21:51
アップ直前に加えた変更が原因で SyntaxError が発生してしまうのを修正。
ご通知ありがとうございました。どんなに忙しくても最低でもデバッガに通すべきでした。
反省しております。

| | コメント (0) | トラックバック (0)

2007/06/16

[python/備忘録] ホームディレクトリに Python をインストール

Linux でホームディレクトリにインストールしたときのメモ。

configure 走らせるときに --prefix=/home/fomalhaut/python2.5.1 を追加する。

その後のビルドは通常と変わらない。make が成功したら make test でちゃんと動くか確認。
致命的なエラーがなければ make install

その後で実行パスとライブラリパスを追加する。.bash_profile に以下を追記

export PATH=/home/fomalhaut/python2.5.1/bin:$PATH
export LD_LIBRARY_PATH=/home/fomalhaut/python2.5.1/lib:$LD_LIBRARY_PATH

サードパーティーモジュールはまだ使ってないけど、今のところは問題は起きてません。
何か問題があったら書いていこうかと。

| | コメント (0) | トラックバック (0)

ThinkPad 研究所の見学に申し込んでみた

ThinkPad の開発・研究を行っている大和事業所の見学ツアーがあるらしい。
Lenovo の申し込みページから申し込めるようになっていた。

x60 が熱暴走したのと電車の中で興味深い広告を見たのがきっかけ。

どんな研究がおこなわれて ThinkPad が誕生するのかとか、どんなテスト ( 品質向上の取り組み ) が行われているのかということにももちろん興味はある。でも、もっと優先して確認したいのは T61 と新しい ThinkPad。

T61 は液晶画面がワイドサイズになったことで使い勝手がかなり変わったらしい。14インチワイド液晶モデルは横に長く、縦に短くなった感じで人によっては T60 よりも使いにくいと感じることがあるそうな。15インチモデルなら縦のサイズは T60 と同じになるけど、横幅がかなり大きくなるので持ち運びが大変になるかもしれない。実際に触って確かめたいと思う。

新しい ThinkPad は、広告で見たんだけど、高い防水性と耐衝撃性をもったモデルが作られているらしい。出先で豪雨になって困ったことがあるし、デスクトップのキーボードにお茶をこぼして壊してしまったことがあるわたしにとっては防水性はとてもありがたい。25万以内に収まるなら防水 ThinkPad の登場を待とうと思う。

| | コメント (0) | トラックバック (0)

[dev] 何か信じられないものを見た

テストスクリプトの実行に時間がかかりそう ( 予測6.5時間 ) なのでいったん家に帰ってから出社したときのこと。
ディスプレイを見るとすごいものが表示されていた。

Out Of Memory

・・・・・・(;´д`)

別の、12万チョイのノート PC でも実行できるスクリプトを実行させた時もこれが出たなぁ
低価格ノートでも実行できる程度のスクリプトで Out Of Memory になるマシンを開発用サーバって呼ぶの?
というか、マシンがしょぼすぎて Out of Memory ってのは初めてみた。

人のマシンにケチ付ける前に、しょぼい開発環境をどうにかしてほしいよ (;´д`)

| | コメント (0) | トラックバック (0)

2007/06/14

熱い Thinkpad x60

Thinkpad x60 が熱暴走したっぽい

ちょっと Python で負荷テストの準備スクリプト書いて試しに実行しただけなんだけど、 少ししたらパームレストが熱すぎて触れなくなった。準備が終わるまでほっとけばいいか と思って置いといたら、予想していたよりもかなり時間がかかってる。 マシンが不安定になっている。

x60 の底面を触ってみたらものすごく熱い。
排気口から出てくる風もかなり熱い。
やけどするんじゃないかと思ったくらい。

周りに聞いてみたら、小型のラップトップは高負荷状態が続くような使い方には向いてないそうな。
となるとわたしには x60 は向いていないってことになる。う~~~~ん、残念。

T60 なら熱対策が x60 より上らしいので T60 を買えばよかったかなぁ。
同じお金でより上のスペックにできたし、なにより T シリーズは中の CPU を交換できた はずなので使っていて楽しいと思うのだ。

一つ問題があるとしたら、大きさ。実物を見る機会がなかったので明らかに持ち運びが楽そうな x60 にしたんだよね。T60 がどれくらいの大きさなのか確かめたかった。

2007.06.16 追記
やっぱりパームレストが熱すぎて手を置けないのでものすごく肩が疲れる。
もちろん膝の上には置けないし・・・
Thinkpad T61 のモニタからは外れてしまったので自腹になりそうな予感 (´・ω・`)

| | コメント (0) | トラックバック (1)

2007/06/13

[備忘録] .NET Framework3.5 SDK β

ここしばらく Windows に触る時間が短くなっているんだけど、.NET Framework 3.5 β SDK が公開されたらしい。

Silverlight とか IronRuby とか、.NET 方面が面白くなっている。わたしもそっちを触りたいな。

| | コメント (0) | トラックバック (1)

« 2007年5月 | トップページ | 2007年7月 »