2008年4月25日金曜日

EclipseのPython開発支援プラグインPydev for Eclipseを入れてみた

この記事を参考に導入してみました。
記事中では1.0.1とありますが現在は1.3.15が最新版みたいです。




PyDev(Python Development)は、Eclipse上でPythonとJavaで実装されたPythonのインタプリタJythonのプログラムの開発をサポートするプラグインです。コード補完、シンタックスハイライティング、シンタックス分析、リファクタリング、デバッグをサポートしています。



スクリプト言語をサポートするEclipseプラグイン - @IT から2008年4月25日に引用


http://pydev.sourceforge.net/updates/
ここからソースをダウンロードしてもいいし、site.xmlを使ってもいいです。

site.xml
http://pydev.sourceforge.net/updates/site.xml

EclipseメニューバーのHelp>Software Updates>Find and Install...を開いて、Search for new feature to installにチェックしてNextボタン、New Remoteボタンを押して上記site.xmlのアドレスを入力すればおkです。
Eclipse使い慣れてる方にはおなじみです。jarダウンロードして直接pluginに放り込むよりは経験上site.xmlから入れたほうが安定してるのでおすすめです。
まだまだPythonは勉強中なので、使い慣れてるEclipse上でコーディングできるのはうれしい。

Javaでprivateなインスタンス変数にアクセスする方法

よくJUnitなどを使ってテストのテストケースでprivate変数の値をテストしたい場合があるけど、テストのためにクラス設計を変更するはあんましよくないし、回りまわって得られた結果でおkとするのもめんどくさいと思うことがよくあります。
そんなときはアクセス権を動的に変更して、private変数に直接アクセスしちゃいましょう!
こちらを参考にしました。

クラス Field
リフレクションの学習

サンプルコード:


// Test.java
public class Test {
public static main(String[] args) {
PrivateVariable pv = new PrivateVariable();
// System.out.print(pv.himitu);
// ↑このコードはprivateの変数を呼び出してるのでコンパイルエラー
  Field field = pv.getClass().getDeclaredField("himitu");
// ↑対象のオブジェクトからクラスをとってgetDeclaredField()を使ってprivate変数を取得しています。渡している文字列は変数名です。
field.setAccessible(true);
// ↑取得したFieldオブジェクトのアクセスチェックするしないの指定。
//trueを渡すとアクセスチェックが抑制され、private変数も呼び出せるようになる。
System.out.print(field.get(pv));
// ↑Fieldオブジェクトにprivate変数があるオブジェクトを渡して値を取得する。
}
}

// PrivateVariable.java
public class PrivateVariable {
private String himitu = "実は俺・・・";
}


上記のコードを実行するとコンソールに「実は俺・・・」と表示され、PrivateVariableクラスのprivate変数himituにアクセスできたことがわかります。
これでいちいち回りくどいユニットテストを書かずに、private変数にアクセスして単純なテストケースを書けるようになりました!

※注意事項
private変数にはアクセサ(private変数にアクセスするメソッド。要するにゲッター、セッター。)が用意されている場合この方法ではなくてアクセサを通して得た値でテストをしてください。アクセサのなかにはテストしたいオブジェクトの状態を持つprivate変数の値に影響を与えている物もあるからです。

2008年4月21日月曜日

pythonブートキャンプ4日目

HeadFirstのオブジェクト指向分析設計を買いました。
例題をpythonで書き直したりしつつ進めていきたい。
その前にチュートリアルを終わらせなければ!っということで4日目。

前回に続いてチュートリアルやってきます。
まだまだなぞってるだけなので参考にならないかも><
でも、初心者がつまずくところを挙げれればと。


ちょっとチュートリアル入る前に前回最後に言及した
ドキュメントの見かたを調べたのでどぞ。
パイソンのドキュメントはpython.exeの入っているフォルダのDocってとこに入ってます。
windows版だとPython25.chmが入っていました。
当然英語ですが、ネットで探せば日本語版も落ちてます。
http://www.python.jp/doc/nightly/
とりあえず、簡単に各項目の説明を。
・Tutorial - チュートリアル
・What's New in Python - 最新版の変更点
・Global Module Index - 索引
・Language Reference - 言語仕様
・Library Reference - 各クラスの機能
・Extending and Embedding - C/C++プログラマのためのチュートリアル
・Macintosh Module Reference - マック用
・Python/C API - C/C++プログラマ向けのリファレンス
・Installing Python Modules - 管理者向け
・Documenting Pyhon - ドキュメントの著者について
・Distributing Python Modules - 開発者とパッケージャーについて
・Documentation Central - ネット上のドキュメントの最新版が見れます
・Python How-To Guides - ネット上のハウツー

ん!?C用のチュートリアルとかあるんだ・・・Cが組み込めるの?Cに組み込めるの?
Javaしか知らない僕にはとりあえずは関係なさそうかな?
で、自分が見たかったJavaのAPIのようなのはLibrary Referenceで見れました。
チュートリアルで少し触ったStringクラスのメソッドについては
3.6.1のString Methodsに詳しく載っています。
Javaのように1ページに説明からクラスメンバーまで全部載せるんじゃなくて
別になっているようです・・・すごい違和感。慣れって怖いなぁ><


それじゃ~チュートリアルへ。
今日は3.1.3 Unicode 文字列から。

Unicode文字列の作成


>>> u'Hello!!'
u'Hello!!' #出力に小文字のuがついてたらUnicode
>>> u'Hello\u0020!!' #\uでユニコードをそのまま使える
u'Hello !!'


Unicodeのrawモードは'ur'
rawモードはエスケープを無効に。ただしこの場合Unicodeは変換される。
http://aheadonestep.blogspot.com/2008/04/python.html

word = ur'Hellow\u0020!!\n world'
print word
Hellow !!\n world #ユニコードは変換されてるけど\nは変換されてない


最初間違って'ru'ってつけててエラーに。エラー表示は
SyntaxError: invalid syntax
最初何が間違ってるのかわかんなかった・・・。
エラー処理しっかりしてるってドキュメントに書いてる割に表示は微妙だ・・・。


組み込み関数unicode()はUnicodeへエンコードおよびデコードするための使える。
Unicodeの印字やファイル書き出しstr()の変換はデフォルトはASCII
Unicode文字列.encode()で8ビット文字に変換(普通の文字列とは違うので注意!!
.encode('[エンコード型]')エンコード型は小文字推奨


str(u"あいう") #これはASCIIに変換できないのでエラーとなる

u"あいう".encode('utf-8') #utf-8形式に変換
"あいう".encode('utf-8') #デフォルトはASCII型なのでできないとエラーになる

unicode('hentai', 'utf-8') #Unicodeへ変換


文字列はここでとりあえず終わりのようですね。
Webサービスを作ってみたいと思っている身としては文字列の扱いには
慣れておかないといけませんね。あとは通信系か。


3.1.4 リスト

リストはカッコ内にカンマで区切って宣言。シンプル!
インデクスはもちろん0からで文字と同じように[]で。スライスも使える。
→文字列のスライス


list = ['hello','Hentai',4]
print list
['hello','Hentai',4]

print list[1]
Hentai
print list[1:]
['Hentai',4] #単一だと中身で複数だとちゃんとリストの切り出しなのがすごい


文字列型は変更不可でしたがリストはここの要素を変更できる
スライスの代入を行うことでサイズ変更もでき要素の除去や挿入ができる。
文字列型と同じようにlen()でサイズもみれる。
#これはlist.len()じゃないとオブジェクト志向とは言えないよねー


list = ['hello','hentai',200,4649]
list[1] = 'do' + list[1]
print list[1]
dohentai

list[:2] = [] #最初の二つの要素を除去
print list
[200,4649]

list[0:1] = ['hentai','hello'] #最初に挿入
print list
['hentai','hello',200,4649]

list[0] = ['hentai', 'hello'] #要素指定だとそれがリストに入れ替わる
print list
[['hentai', 'hello'],'hello',200,4649]

list[0:] = ['hentai','hello'] #0以降なので全部入れ替わる
print list
['hentai', 'hello']

list = ['hello','hentai',200,4649]
print len(list) #要素数の表示
4


リスト内リストのとこで参照の話が触れる程度でてきます。
Javaは参照だらけなのでこの辺の考えは大丈夫。

次からようやく各種構文が出てきてプログラミングらしくなりそう!

2008年4月18日金曜日

これだからはてなブックマークはおもしろい

はてなブックマークは日本最大級のソーシャルブックマークサービスだ。
僕がこのサービスを利用し始めたの半年前ですごく後発なんだけど、今ではなんでもっと早く利用しなかったんだって後悔するくらいどっぷりハマっている。
当初ソーシャルブックマークとはただ単に、ブックマークをネットワーク上に保存して他の環境でも使えるようにするための物だと思っていた。もちろん本質的にはそういうサービスなんだけど、はてなブックマークではそのブックマークにコメントを付ける事ができる。
自分の感想を付けたりメモを残したりできるので、他の人がそのブックマークをつけたサイトにどういう感想を持ったのかっというのを見ることができるのだ。ブログの記事をブックマークすればその記事への感想といった感じで書くこともできる。
100文字という制限もちょうど良い。みんな自分の感想で一番強く思った点を簡潔に書くからだ。簡潔に書くということは、それだけ理解しやすく心に響く文章になる。
今日はそのブックマークコメントを読んでてゾクっと感じたので紹介してみる。

自分の感想を持つだけじゃなく他人の感想と比較する


まずはブックマークした元記事の引用。



マザーテレサは、もちろんすごい人であることには間違いないのだろうけれど、 あの人は同時に、「もっとすごいことが出来たのにやらなかった」人なんだと思う。



「能力ある人の不作為」という罪悪 - レジデント初期研修用資料 から引用

このエントリーの要点は能力のある人はもっとがんばればすごい事ができるのに何故しないんだ?という点だと思う。
マザーテレサを例にしていて、彼女がもっと商売っ気のある人だったらもっと多くの人が救われたんじゃないか?っと論じている。
これを読んで僕は確かにそうだ、本当に難民を救おうと思うならば目の前の事だけじゃなくもっと大きな視点で物事を運ぶべきじゃないのか?それをしないマザーテレサは実は聖女でもなんでもなく、ただの自分勝手な人間なんじゃないか!?っと感想を持った。
しかし、ブックマークコメントのid:yukky2001のコメントを見てゾクッ感じた。



論旨に矛盾がないか。難民キャンプにいたからこそ高い評価があったのであって、集金活動をしていたらそこまでの評価は無かったはずだ。また彼女の価値観で後者ができたとも思えない。人にはふさわしい役目がある。



はてなブックマーク - 「能力ある人の不作為」という罪悪 - レジデント初期研修用資料 から引用

まさにそのとおりで、マザーテレサがそこまで支持されている理由は、目の前の人々を助けたからなのだろう。彼女がある意味で自分勝手だったからこそだ。もし、多くの人を助けるために商売っ気のあることをやったなら、ここまで担ぎ上げられるような事にはなっていなかっただろう。
じゃ~どうすればいいかっという点は論点がずれるので割合するが、自分の単純な視点でしか見れない愚かさに気づかせてくれるはてなブックマークのコメント機能は僕にとって無くてはならない存在となっている。

youtubeで完成されたと思われた動画投稿サービスに、ニコニコ動画というコメント投稿機能を持ったサイトの登場でイノベーションが起きたように、まだまだネットをおもしろくするサービスは登場すると思う。
これからもはてなブックマークのコメントの様に僕をゾクっとさせるサービスに出会えるといいなぁ。

2008年4月15日火曜日

Eclipseの最新バージョンのHelpを見る方法

2008/04/15日現在Eclipseの最新バージョンは3.3ですが、次期バージョンで6月24日にリリース予定のEclipse3.4のHelpを見つけたので置いておきます。
といっても中身はまだ無いみたいですが・・・。
旧バージョンのHelpを見るとEclipseの歴史が垣間見れますね!!

現バージョンのHelpへのアドレスはこれ
http://help.eclipse.org/help33/index.jsp

前バージョン
http://help.eclipse.org/help32/index.jsp

http://help.eclipse.org/help31/index.jsp

http://help.eclipse.org/help21/index.jsp

最新バージョン
http://help.eclipse.org/stable/index.jsp

2008年4月10日木曜日

Python、それは吸引力の落ちないプログラミング言語

最近Python始めたところなんだけど、なにやらものっそいホットな話題が!!




Googleは米国時間4月7日夜、「App Engine」と呼ばれるサービスをローンチした。GoogleはApp Engineを擁し、オンラインアプリケーションのための拡張性の高いインフラを求めるプログラマや、いずれは企業を取り込む意向だ。
中略
App Engineはプログラミング言語のPythonで記述されているが、Googleではほかにサポートすべき言語について意見を求めているという。



グーグル、「App Engine」を発表--オンラインアプリケーション開発用にインフラ提供:ニュース - CNET Japan から引用


GooGle App Engine - Google Code
http://code.google.com/appengine/

なんとグーグルの新サービスApp Engineが公開されて、初期バージョンは言語としてPythonが利用できるそうです。App Engineは無料でWebサービスを公開できるストレージを利用できるサービスのようですね。
Webサービス何か作りたいなぁと思って始めたPythonですが、Web言語は初めて勉強するのでもちろんサーバーを借りた事が無くレンタル等の知識が無いから大変そう~っと思ってたところにこのニュースなので非常にタイムリーで、無料だし気軽に公開できそうで嬉しい!!。
一応アカウント申し込んだんだけど、やっぱり順番待ちみたい。1万アカウントじゃすくねー;;
開放されるまでにちゃんと勉強だな!

すでに最先端を行ってる方々はテスト的なサービスを公開してらっしゃるようです。
すごいなー><




何か作ってみよう!



というわけで、 Tropy みたいなやつを作ってみる



python で 20 行以上のプログラムを書くのはたぶん初めてだ



Google App Engine で Tropy っぽいやつ作ってみた - IT戦記 から引用




Getting Started Guide はなぞってみたので、今度は TODO アプリケーションを作ってみる。



Google App Engine で Tropy っぽいやつ作ってみた - IT戦記 を参考にしました。



うわっ Python のメソッドって self を引数に def するのか。モデルを定義 Todo クラス。done には BooleanProperty を使おう。



[GAE] Google App Engine で TODO アプリケーションを作ってみる - letter から引用


導入にはここが参考になりそうです。




こ、これは・・・ Web 開発に革命が起きようとしているのかもしれません。 Google がその膨大なサーバーリソースを全世界の Web 開発者に開放するべく、 Google App Engine を公開しました! Google のサーバーファームで透過的に負荷分散される Python ベースの Web アプリケーションサーバーに、 Google が誇る分散データベースシステム Bigtable ベースのストレージを組み合わせた、フルスタックの Web アプリケーションプラットフォームです。



Google のインフラで Web アプリを公開できる!「Google App Engine」 - WebOS Goodies から引用

2008年4月9日水曜日

初心者がつまづくPython 三日目

前回に追記
隣り合った文字列はそのまま連結→隣り合ってるのがリテラルの場合のみ


word = 'hello'
print word 'hello' #これはダメ

print 'hello''hello' #これはいける
hellohello

三日目からはスクリプトファイルを作って実行する
対話モードはちょっとした事を調べるのに便利ってこと
スクリプトファイルの実行
→python test.ph

TeraPadの設定
実行ファイル:cmd
コマンドパラメータ:/K CD %d && python %n


文字列の抜き出し
文字列変数[最初のインデクス:最後のインデクス]
インデクスはもちろん0から


word = 'hello'
print word[1:3] #2文字目から3文字目まで
el


インデックスのデフォルト値
何も入れないとそれまで、それ以降


word = 'hello'
print word[:4] #4文字目まで
hell
print word[2:] #3文字目から最後まで
llo


その他の数値
無理そうな数を入れてもエラーにならない!!


word = 'hello'
print word[100:] #何も出力されないがエラーも出ない
print word[-2:] #マイナスを入れると・・・
lo #最後の2文字が
print word[-2:4] #lohelloを期待したけど・・・何も出力されない


C言語のように文字列の変更はできないが要素同士の組み合わせは便利


word = 'hello'
word[0] = 'x' #エラーとなる

word = 'x' + word #これなら代入なのでいける
print word
xhello

print word[1:] + 'world'
helloworld


スライス文字の不変式


word = 'hello'
print word[2:] + word[:2]
hello


前述したが無理のあるインデクスでもうまくいく
大きすぎるインデクスは文字列のサイズに置き換えられる
負の数字は右から数えるが"-0"は0と一緒で右からじゃなく1文字目
ただし、インデクス指定ではエラーがでる。


組み込み関数len(文字列)は文字列の長さを返す


word = 'hello'
len(word)
5


Unicode文字列はシーケンス型

三日目まとめ
チュートリアル中に出てくる関数を調べる方法がわからない><
Javaだとクラスを元に探せるけど、Pythonはオブジェクト指向といっても
クラスベースじゃないってことかな?
なんにせよドキュメントの見かたって新しい言語を覚えるのに大切な事だと思います。

2008年4月5日土曜日

Python初心者の二日目

新しいPCの環境も整ってきてPythonも入れて少し勉強した。
とりあえずチュートリアルを一通りやろうとpdfをダウンロード。

Python チュートリアル (PDF)
http://www.python.jp/doc/pdf/nightly/tut.pdf

が、開けない。アドビリーダーがインストールできないっ・・・!!
vistaやってくれる、そこにしびれる憧れない。
インストーラーを実行してもうんともすんとも言わない。
検索すると以下のような記事が。




 1)AdobeのDownLoad Manegaerが起動

 2)ダウンロードが完了すると下記フォルダにファイルが展開される

   C:\Users\hogehoge\AppData\LocalLow\NOS\Adobe_Downloads



   展開されたファイルは

    Setup.exe、setuo.ini、Data1.cab、AcroReader.msi、abcpy.ini



となりましたので



 3)上記フォルダ内のファイルを全て別フォルダに退避。

 4)セットアップを中断し、PCを再起動。

 5)退避させたsetup.exeのプロパティ→互換性→「視覚テーマを無効にする」にチェック

 6)setup.exeを起動しインストール



Adobe Reader8.1 のインストール ネットワーク管理者というお仕事 から2008年4月6日に引用

とりあえず視覚テーマを無効にすればできました。AdobeはVistaに対応したと書いてるけどしてないという罠。いや、仕様ですか・・・><
これでチュートリアル読めるようになったので本題に入ります。

今日のPython(今日のわんこ的な意味で)


まだまだ初歩的です。間違った理解してる箇所があるかもしれませんのでご了承ください><

起動->python
終了->import sys;sys.exit()かControl-Z
sysはシステムクラス?importはJavaといっしょ

python -c [command]でコマンド実行
python -c print "Hello world"→×
-c オプションのあとはすべて""で囲む。エスケープは\
正解は→python -c "print \"Hellow Woerld\""

コメントは#で始まる

>>> = 一次プロンプト
... = 二次プロンプト

対話モードでは代入した変数が保持されてる


>>> width = 10 #エンター押しても表示されないが代入はされてる
>>> width #変数を入力すると値が表示
10
>>> print width #も同じ結果
10


浮動小数点は完全にサポート

>>> 7/2 #整数の演算は切り捨てだが
3
>>> 7.0/2 #7を7.0にして割ると
3.5
>>> 7.0/3 #無理数も
2.3333333333333335


複素数もサポート(複素数=2乗すると-1になる数字)
よくわからん


対話モードでは最後に印字された式が変数が"_"に代入される
文字列は×この変数は読み込み専用として使うべき
→print を使わずに直接""で囲んで表示させると文字列も_変数に入る

>>> 3+3
6
>>> _
6
>>> print "10" #文字の10を印字
10
>>> _ #式のみなので最後の6が表示される
6
>>> "Hello" #直接印字
'Hello'
>>> _ #'Hello'が入っている
'Hello'


文字列は''で囲う
文字の末尾をバックスラッシュにすると改行してかける
(理論的にはつながっている)
出力はprintを使わないとそのまま表示される

>>> hello = "こんにちは\
... はじめまして"
>>> print hello
こんにちははじめまして
>>> hello
'unicode...'


文字リテラルに"raw"(未加工)

>>> r"test\n\
... tetest!!"
'test\\n\\\ntetest!!"
>>> print r"test\n\
... tetest!!"
test\n\
tetest!!


"""もしくは'''を使うと行末エスケープが不要になる

>>> t = """test
... te
... testtttt"""
>>> print t
test
te
testtttt


文字列の演算

>>> t = "test"
>>> e = "exam"
>>> te = t + e #+は結合
>>> print te
testexam
>>> print te*10 #*で繰り返し
testexamtestexamtestexamtestexamtestexamtestexamtestexamtestexamtestexamtestexam

隣り合った文字列はそのまま連結する


今日は以上です。
Pythonの徹底的にシンプルに書ける文法にはまりつつあります。
モチベーションのために何か簡単なサービスを考えて目標としたいところ。

2008年4月3日木曜日

DELLのタブレットPC「Latitude XT」がやってきた!

半年前くらいからノートPCを買おうと決めていろいろと検討した結果、DELLのタブレットPC「Latitude XT」をついに購入した。
この時期PCは安くなるっぽくて確かに合計で8万引きだった。
検討中にMac Airが出たり、新型のMac Bookが出たりしてマカーの仲間入りも考えたけどマウス使うのがだるくなってきたのと、絵も描けるタブレットPCに決めた。
MacもそのうちiTouchPCを出すだろうけど、我慢できませんでした><
以下、写真レポート。

箱、DELLの梱包は無駄にでかい・・・。


箱の中に箱!1


箱の下には・・・


靄がかかっているだっとっ!!


にょろ~ん


全体像


横から


初オープン!!液晶が綺麗(新品的な意味で)


くるんと画面が回転して折りたためます。


電源オン!


指紋センサー


ThinkPadみたい・・・青いけど


ショートカットボタン。画面の向きも変えれる。


DVDドライブは外付け。


付属品


電源アダプタ


ネット繋げたのでとりあえずニコニコ。ペンタブサーフィン快適すぐる。


何やら袋が・・・・


何と・・・なかにLatitudeが入ってました!!



以上です。