タイトル/名前 | 更新者 | 更新日 |
---|---|---|
日記/2009/03/16/Pythonの関数でstaticな変数を使いたい時 | msakamoto-sf | 2009-03-16 00:52:23 |
日記/2009/03/15/Pythonでのオブジェクト指向プログラミングについてメモ | msakamoto-sf | 2009-03-16 00:32:05 |
日記/2009/03/12/ATOK17が「地域と言語」からも消えた→標準IME設定ツールで復旧 | msakamoto-sf | 2009-03-12 00:10:49 |
Python/codepiece/関数(1) | msakamoto-sf | 2009-03-09 08:05:16 |
日記/2009/03/09/TeraTermのコマンドラインオプションは意外と便利 | msakamoto-sf | 2009-03-09 02:27:25 |
日記/2009/03/09/"nkf --guess"で文字コード判定って初めて知った。 | msakamoto-sf | 2009-03-09 01:56:25 |
日記/2009/03/09/Dynampis - Cisco 7200 Simulator | msakamoto-sf | 2009-03-09 01:50:59 |
日記/2009/03/09/Webで「ロード中」とかの「ぐるぐる」GIFアイコンアニメを生成してくれるサイト | msakamoto-sf | 2009-03-09 01:31:25 |
日記/2009/03/01/プログラミング言語の名前って頭大文字? | msakamoto-sf | 2009-03-01 14:09:36 |
日記/2009/03/01/WinXP, Apache2.0, Python2.5 でのmod_pythonインストール成功 | msakamoto-sf | 2009-03-01 14:04:22 |
あるにはあるんですが、結局クラス作ってどーたらこーたらで仰々しい。
というかstatic変数ってある種グローバルな変数なので、いっそ関数オブジェクトの属性として入れておけば良いんじゃないのか、と思ってこんな感じにしてみた。
>>> def f1(a1, sd='ABC'): ... if not hasattr(f1, 'hoge'): ... f1.hoge = sd ... f1.hoge = f1.hoge + a1 ... return f1.hoge ... >>> f1('abc') 'ABCabc' >>> f1('def') 'ABCabcdef' >>> f1('ghi') 'ABCabcdefghi'
"sd"というのは"Static Default"の略。
・・・これで良いような気がするんだけど、どうなんだろう。
まず参考サイトから。
大変参考になりました。これらの記事を書かれた皆さん、ありがとうございます。
なんというか・・・非常に簡潔な作り。C++とかJavaというよりは、JavaScriptとかPerlに近い。個人的な感覚ではPerlに似てるなぁ、と思う。Perlはリファレンスに対してパッケージでblessするという書いててもよく分からないんだけどとにかくそんなことをしてるんだけど、Pythonの場合は名前空間に対してClass名をbindするという感じで、多少の階層や概念の齟齬はあれど感覚的にはよく似てると思った。
だから、逆に言えば隠蔽機能は皆無に近いみたい。やろうとするとPerlと同じ感じで、特殊メソッドを使ってかなりガリガリマジックを駆使する必要が有るっぽい。簡潔な作りは簡潔に利用する方がいい気がする。せっかく覚えることを減らしてくれてるんだから。
Pythonドキュメントで言えば、Win版2.5でのCHMヘルプの章立てで示すと以下の辺りが参考になる。
あと、結局 __init__() とかインスタンスメソッドの第一引数で使う"self"という奴、予約語というわけじゃないのだから、"this"とかにしてもOKじゃね?と思ったら本当にOKだった。
>>> class C1(object): ... v1 = 'abc' ... def m1(this): print "Hello, " + this.v1 ... >>> o1 = C1() >>> o1.m1() Hello, abc
ちなみに以下のような実験で、どうやらインスタンス生成ではクラスオブジェクトの名前空間(__dict__)がコピーされてインスタンスの名前空間に引き継がれているようではあるが、未調査なので何とも言えない。
>>> class C1(object): ... v1 = 'abc' ... def m1(self): print 'Hello, ', self.v1 ... >>> o1 = C1() >>> o1.m1() Hello, abc >>> o1.v1 = 'ABC' >>> C1.v1 'abc' >>> o1.m1() Hello, ABC >>> o2 = C1() >>> o2.m1() Hello, abc >>> C1.v1 = 'DEF' >>> o3 = C1() >>> o3.m1() Hello, DEF >>> o1.m1() Hello, ABC
o1オブジェクトのv1属性を書き換えても、C1(クラス)オブジェクトのv1属性は変わっていない。このため、o2で新たにインスタンスを生成しても、最初の"abc"が引き継がれている。一方、C1オブジェクト側でv1属性を変更した後o3でインスタンスを生成すると、変更された値が引き継がれている。当然、o1のv1属性は先に変更した値のままである。
昨日から、いきなりATOKが立ち上がらなくなった。
再起動しても駄目。
どこかでMS-Officeの設定とか変わったか弄ったか?と、コンパネの「地域と言語」で切り替えようと思っても、何故かATOKが出てこない。
先日、2-3個のアプリを削除したのだけど、誤ってATOKも消してしまったか?と「プログラムの追加と削除」を見てもちゃんと有る。
少しGoogleをさまよった後、駄目元でスタートメニューのATOKから「ATOK17標準IME設定ツール」をクリックしたら、暫くしてATOKのいつものタスクトレイアイコンが出てきて、使えるようになった。
何だったんだ・・・。
def f1(): print "Hello f1!" def f2(name): print "Hello " + name + "!" f1() f2("Huga")
→
Hello f1! Hello Huga!
def f3(a1, a2 = 'default'): print "a1 = " + str(a1) print "a2 = " + str(a2) f3(123) f3(456, 789)
→
a1 = 123 a2 = default a1 = 456 a2 = 789
def f4(who, greet = "Hello", times = 5): print greet * times, print ", " + who f4("Taro", "Bonjour", 3) f4("Hanako", greet = "Good Night", times=2) f4("Fuga", times=3) f4("Bohe", greet = "Good-Bye")
→
BonjourBonjourBonjour , Taro Good NightGood Night , Hanako HelloHelloHello , Fuga Good-ByeGood-ByeGood-ByeGood-ByeGood-Bye , Bohe
def f5( a1, *args): print repr(a1) print repr(args) for i in args: print i f5(1, 2, 3) f5(*(4, 5, 6))
→
1 (2, 3) 2 3 4 (5, 6) 5 6
内部的にはタプルとして渡ってくる。
def f6(a1, a2, **opts): print "a1 = " + str(a1) print "a2 = " + str(a2) for (k, v) in opts.items(): print str(k) + " = " + str(v) f6('foo', 'bar', buz = 'hoge', aaa = 123)
→
a1 = foo a2 = bar buz = hoge aaa = 123
Erlangを勉強した事があったので、こういう小手先技も思いつきました。
def f7(*l): head = l[0] r = l[1:] print head if len(r) != 0: f7(*r) f7(1, 2, 3, 4, 5)
→
1 2 3 4 5
TeraTermについては、昨年(2008)末、
というのが発生し、このとき「TeraTermはCTRモードに対応してないので、PuTTY使うしかない」とか騒がれたのが記憶に新しかったりする。
とはいえ、TeraTerm(正確にはTTSSH)の方も2008.12.16の TeraTerm 4.61 にてちゃんとCTRモードに対応してくれたようで、一安心です。
個人的には、PuTTYで接続先毎にキーファイル名やSSHの設定を保存できるのが好きだったりするのですが、現場ではTeraTermという場面も多い。そういった時に、一々キーファイルやSSHのバージョンをTeraTerm起動して最初に表示されるダイアログでマウスクリックして指定するのは面倒です。
TeraTermの、正確にはttermpro.exeにはコマンドラインオプションが用意されており、それをショートカットとかで指定しておけば、後は接続先ホストとパスワードを入力するだけでOKになったりして便利ですので、メモ。
(実際はTeraTermの、というよりはTTSSHのコマンドラインオプションです。)
例えば社内限定と言うことでSSHバージョン1で、鍵ファイルは全サーバ共通で、ユーザ名も共通の場合は
ttermpro.exe /ssh /1 /user=ログインユーザ名 /auth=publickey /keyfile=秘密鍵ファイル名 /ask4passwd
としておけば、後はホスト名とパスフレーズだけの入力になります。
TeraTermのコマンドラインオプションについては添付の日本語ヘルプにも載っていますが、TTSSHのコマンドラインオプションの方は手元の4.49には英語版ヘルプにしか載っていませんでした。アップグレードしろよという話ですが、自宅の手元のPCではPuTTYしか使ってませんので・・・。(;´Д`)
取りあえず以上、なわけで、TeraTermユーザも4.61にアップグレードした上で、結構便利に出来るかもです、という感じです。TeraTermとPuTTYじゃ使われ方も微妙に違うような気もしますが。
先日、出向いている現場の人に教えて貰いました。
nkf --guess
これで文字コード判定してくれる。
うわー、nkfコマンドを知ってから実に6年以上経ってるけど、初めて知りました。現場ではFreeBSD5を使っているのですが、手元のLinux環境で"nkf --help"してみたら、"Network Kanji Filter Version 2.0.8 (2007-07-20)" でちゃんと"--guess"アリです。
全く関係ないコンテキストで検索している最中、"Dynamips"というCisco 7200ルーターをWindows上でシミュレートできるアプリの存在を知った。面白そうだったのでメモ。
特にCiscoルータを扱ったり勉強しようという気は無いのだけれど、単純に面白そうだったのでメモ。止まり。
今出向いている現場の人に教えて貰いました。
いずれも、FlashとかJavaScriptで最近よく見かける、「Now Loading...」の意味のぐるぐる回るGIFアニメを、色や「ぐるぐるタイプ」、サイズをチョイスして生成できます。いずれもライセンスは「Free for use」なので、商用サイトでも使用できると思います。
C, Java, Pascal, Python, PHP, Perl, Ruby, Lisp, Scheme, Erlang, Basic, Lua, Io, JavaScript, Fortran, Cobol, ...
全部頭が大文字。固有名詞だから?
小文字から始まるプログラミング言語ってあるのかなぁ?でも英語の文法的にそれってアリなのかな?
前回 日記/2009/02/22/WinXPのApache2.0へのPython2.5用mod_python.soのインストールが上手く行かない。 の続きですが、ふと、Apache2.0のバージョンを上げてみたらどうだろう?と、最新の 2.0.63 に上げてみたらあっけなく動いてしまいました。前のは 2.0.50 と結構昔のやつでしたので、それが原因だったのかも。
PHPとも共存できてます。Python2.5/Python2.6両方入れて動いてます。
というわけで、インストール成功。
次はフレームワーク・・・と行きたいところで、DjangoとかTurboGearsとかWeb.pyとか色々ありそうなのだけれど。
でもその前に、そもそもPythonとWebサーバとの接続点がいくつかあるらしくて、そこを見てからにしたい・・・。
CGIから、FastCGIから、mod_pythonから、あとWSGIというPython系での標準WebI/Fの仕掛けとかもあるらしくて、しかも混在しているらしくって、少し整理してからの方が良いかも。