自堕落な技術者の日記

基本は喰ってるか飲んでるかですが、よく趣味でカラオケ・PKI・署名・認証・プログラミング・情報セキュリティをやっています。旅好き。テレビ好きで芸能通

Jython

IP位置情報のGUIツール

自堕落な技術者の日記 : MaxMind(このIPってどこ?) - livedoor Blog(ブログ)
MaxMindという会社IP Geolocationという
IPアドレスが
* どの国か?
* どの地域か?
* どの都市か?
* どのISPか?
といったデータやそれ用のAPIを提供してくれています。


前にIP位置情報の話をしましたが、GUIベースのものがあると便利かも、、、とJython + Swingで作ってみました。(geoip_swing.py)

IP位置情報ツール



にょほほ、クリップボードにも対応してなかなかいいかも、、、

しかし、JavaのGUIプログラミングに慣れない、、、、、特に、Layout Managerにちっとも慣れることができません。細かいことができるのはいいんですが、いろいろ有りすぎてすぐ忘れちゃうんですよね(^^;Tcl/Tkみたいな覚えやすいのが欲しいんですけどね。FrameやPanelがデフォルトで持っているレイアウトマネージャーがもう少し高級なやつが使われてWidgetをadd()するだけで表示して欲しいんですけどね。思った通りレイアウトされるまで大変、、、、、

そんな中、今回BoxLayout初めて使ってみたんですがイメージしていたものとかなり近い感じでなかなかよろしい。ただ一点、なんでコンストラクタにContainerを渡さなきゃいけないんですか???他のは渡す必要がないのに渡す理由がよくわからない、、、、

久しぶりにSwing書いたのですっかり忘れていました。以下のページが大変参考になりましたので備忘録として、、、、

Cafe de Paison
とほほのJava入門:レイアウト
javadrive:BoxLayoutクラスの定義とコンストラクタ

ナンプレを解くGUI

自堕落な技術者の日記 : ナンプレ(数独)キラー Python - livedoor Blog(ブログ)
暇があれば、足りない組込み関数実装してJythonでも動くようにしといてパズルの入力や解く仮定を表示するようなGUIをSwingなんかで作れるといいなとおもっています、、、、


ということで朝暇だったので、いつものJythonで所要時間1時間程度作ってみました。

Java AWTのプログラムを書くのが5年ぶりぐらいだったのでウィジェットやメソッドの名前をすっかり忘れておりハマリマシタ(・∀・)つ

初期画面はこんな感じ、、、、

JySudoku01




適当な所で見つけたレベル4の問題を入力してみます。

JySudoku02




ボタン押します。

JySudoku03




トホホ、1秒すら待たずにあっさり結果が表示されます、、、、、空しい、、、

入力にえらく時間がかかるのに、解くのはすぐという、、、、

Jython 2.5α3リリース

The Jython Project
As of September 10, 2008, the Jython development team is proud to announce a new alpha release: Jython 2.5a3!


9月10日にスクリプト言語PythonのJava実装であるJythonのアルファ版 2.5a3 がリリースされました。

個人的には基本的にはJythonに含まれるPythonライブラリを使うことはあまりなくて基本機能さえあればあとはJavaでカバーするので2.1でもまったく構わないのですが、先日のブログの「ナンプレ(数独)を解くPythonプログラム」はPython 2.5系でしか動きません。

インストール方法は別館にて解説を書いてみました。(ただ、Next押せって書いてあるだけですけどね、、、)

早速、Jython 2.5でナンプレ(数独)を解くプログラムを動かしてみるとバッチリ動きました(^^)v

<追記>
ちなみに使用ディスク容量は



Jython-2.5α330.7MB
Jython-2.110.0MB

2.5太りすぎだろ〜〜〜って感じですね。
普段の利用では2.1で全く困ってないので2.1でいいや、、、、、






JRubyかJythonか

私は今やすっかりプログラムを作ることは仕事ではなくなってしまい、プログラミングはもっぱら趣味の状態なので、署名暗号、暗号ライブラリの動作の確認、ちょっとしたツール(XAdESのフルセットの検証器はもはやちょっとしたツールとは言えないんだけども、、、)を作るのにJava系のスクリプト言語であるJythonを使っています。

RubyのJava版であるJRubyは日本にはファンが多いし、JRubyの開発者がSunに行ったことから由緒正しくなってしまったJava系スクリプト言語なんですけど、どうもRubyの文法が体に馴染まない、、、、、

class Foo
 def initialize
  print "初期化します...\n"
 end

 def hoge
  print "ほげします...\n"
 end
end


多分、この"class〜end"、"def〜end" の括りが大学の授業以来ずっと抵抗のあったPascalの"begin〜end"を想像させるからだろうなぁ、、、、と思います。(同様にDelphiも馴染めなかった)。C、Perl、Java、Lispみたいに括弧の方が良くないですか?文の始まりと終わりの対応関係が取りやすいし、、、(Emacsだと特に、、、、)

Pythonは空白文字のインデントで文を表すオモシロイ文法なんですが、ちょっと書いてみると昔お世話になったPrologに似てるなと思ってみたり、、、、

■Python
def foo(i):
 """↓3の倍数と3がつくときにアホになる関数"""
 if i % 3 == 0 or "3" in str(i):
  print "オモロー"
■Prolog
foo(I) :-
 I mod 3 =:= 0,
 write('オモロー').
foo(I).


基本はシンタックスの体に馴染むJythonで良いと考えているんですが、唯一JRubyで惹かれるのが「JRuby on Rails」です。本当にこれだけのためにJRuby使ってしまうかも、、、、、

<追記>
2008年3月にJythonの開発者もSunに入ったそう。- @IT 米サン、JRubyに続いてJythonの開発者を採用 2008.03.08

ナンプレ(数独)キラー Python

うちのカミさんや子どもは前からナンプレ(数独 or SUDOKU)が好きで、暇があれば新聞の土曜版やら本を買ったりしてやっています。

ちょっと前は海外出張した際に、恋人たちがなかむつまじく二人でSUDOKUやりながら飛行機を待っているなんていう姿もよく見かけました。日本円は弱いしカミさんはあまりお土産など欲しがらないみたいなので、フランスやスペインやドイツのナンプレ(SUDOKU)を買ってきてあげると、まぁ、結構うれしいらしく子どもと競ってやっているようです。あれは、言語が変わってもやり方は同じなのでアラブ語だろうがフィンランド語だろうがお土産にはイイみたい、、、、、

話し変わって、「LispプログラマのためのPython入門」(邦訳)という記事を書いたPeter Norvingさんという方がいらっしゃいます。これはいまだにLispのプログラムはEmacsのためだけに書くことがある私にとってPythonを最初勉強するのにとてもありがたかった記事です。Peterさんは私も昔生業としていた人工知能に関する記事も書いておられ、NASAに勤めておられる雰囲気です。

たまたま氏のサイトを眺めていたら「Solving Every Sudoku Puzzle」という記事があるのを発見しました。

ここでは任意の数独のパズルを解くことができるたった100行程度のPythonのプログラムを紹介しています。実装方法としては、昔懐かしい人工知能の制約伝播やら解の探索やら枝刈りやらそんな方法を使っています。

未定のマスを"0"として9×9の行列を一行で"0001034008..."のように一つのパズルを表現すれば、それを入力ファイルとして処理してくれます。

Java実装のPythonであるJython 2.1 で試してみたところ dict, set, max, min など一部の組込み関数がなかったために実行できませんでした。

仕方なくcygwinのPython 2.5を使ってみると一つの問題解くのに0.1秒もかかっていないような感じです、、、、、空しい、、、、、

4 1 7 |3 6 9 |8 2 5
6 3 2 |1 5 8 |9 4 7
9 5 8 |7 2 4 |3 1 6
------+------+------
8 2 5 |4 3 7 |1 6 9
7 9 1 |5 8 6 |4 3 2
3 4 6 |9 1 2 |7 5 8
------+------+------
2 8 9 |6 4 3 |5 7 1
5 7 3 |2 9 1 |6 8 4
1 6 4 |8 7 5 |2 9 3


暇があれば、足りない組込み関数実装してJythonでも動くようにしといてパズルの入力や解く仮定を表示するようなGUIをSwingなんかで作れるといいなとおもっています、、、、

しかし空しい、、、、、やっぱり、頭は使わなくちゃね、、、、

JyConsole (その2)

先日紹介したJavaによるPython実装であるJythonのインタプリタのGUIフロントエンドであるJyConsoleですが、やっと時間がとれたので今更遊び始めています。

まず、やらなければならないのは


  1. Jythonのアーカイブを解凍して適当な場所(C:\Java\JyConsole等)におく

  2. 私はJDKを切り替えて使う派なのでWindowsの環境変数にはPathやJava_HOMEなどは設定していないためJyConsole.batをいじる必要がある。例えばこんな感じ
    set JAVA_HOME=C:\jdk1.6.0_03
    set Path=C:\jdk1.6.0_03\bin
    java -cp "JyConsole.jar;thirdpart/jython2.2/jython.jar;thirdpart/ArtTk/ArtTk.jar" com.artenum.jyconsole.JyConsole

  3. 上でクラスパスの区切りがJyConsole 1.4のJyConsole.batではWindowsなのにセミコロン";"ではなくコロンになっている":"ので必ず直します。



とこれだけやれば、とりあえず起動はできます。

普通にJyConsole.batを起動するとコマンドシェルが煩わしいのでJyConsole.batのショートカット作って、ショートカットのプロパティ設定で「ウィンドウ最小化」「フォントは小さめのもの」を設定しておけばいいでしょう。

う〜〜ん、なかなか楽しい。Javaでちょっと寂しいインタプリタがないところで、Jythonはそれをカバーしてくれたりもするんですが、便利さに欠けるところがあります。JyConsoleはそれをカバーしてくれると思います。

  • Javaのコードを型を気にせずインタプリタで試すことができる

  • Javaのコードをコンパイルしなくてよい

  • Javaのコードについてあまり例外を気にしなくてよい

  • 初期読み込みスクリプトの設定



と、早速JyConsole1.4を使ってみて問題発覚
from java.math import *
#↑ワイルドカードだとちゃんとインポートされない
from java.math import BigInteger
#↑明示すればちゃんとインポートされる


ムムム、これは問題だ、、、、ワイルドカード使えないととても面倒だし。


とりあえず、こんな感じで入力。

JyConsoleでBigInteger

例えば証明書のシリアル番号とかXMLDSig,XAdESとかでは10進数で表示されてしまうんだけども、普通の電卓じゃ桁があふれちゃうなんて場合に、不定整数を扱えるjava.math.BigIntegerが使えてしまいます。

もっといろんなEntrust ToolkitとかIAIKとかBouncyCastleとか自作のクラスとかクラスパスを通しておけばもっと楽しめそう。

一瞬、コンソールからクラスパスの設定抜きに動的に設定してロードさせたいと思ったんですが、これが結構厄介でURLClassLoader使って実装しないといけないので、それだったらまぁ、予めクラスパスに設定させとくしかないかな、、、と

jyconsole.propertiesでは

# Loading script for initial configuration
jyconsole.pref.loading.script=script/init.py


好きな起動スクリプトを設定できるらしいので、お気に入りのコマンドなど入れておいたり何時でもテスト用の秘密鍵、証明書など使えるようにしとけばコマンドラインであれやこれやできてしまうのではないかと思います。

今日は、とりあえず属性証明書を何とかしないとなりません、、、、(謎)

Jython 2.5a1 リリース (2008.07.16)

FrontPage - JythonWiki


いつのまにかJavaにポーティングされたPythonであるJythonの2.5a1 (アルファ版?)がリリースされていました。Jythonはもうあまり更新されないのかと思っていたんですが、、、、

MaxMind(このIPってどこ?)2

MaxMindという会社IP Geolocationという

IPアドレスが

  • どの国か?
  • どの地域か?
  • どの都市か?
  • どのISPか?

といったデータやそれ用のAPIを提供してくれています。

うちのサーバーに変わったアクセスがあったので、

「こりゃどこだ???」と調べるときに

こんなスクリプトを使っています。

^from com.maxmind.geoip import *

^if __name__ == "__main__":

^ import sys

^ ip = sys.argv[1]

^ checkISP = LookupService("c:/tmp/geo/z/GeoIPISP.dat")

^ checkCity = LookupService("c:/tmp/geo/z/GeoIPCity.dat")

^ loc = checkCity.getLocation(ip)

^ print "IP:\t" + str(ip)

^ print "国:\t" + str(loc.countryName)

^ print "地域:\t" + str(regionName.regionNameByCode(loc.countryCode, loc.region)

^)

^ print "市:\t" + str(loc.city)

^ print "ISP:\t" + str(checkISP.getOrg(ip))

日本ではRuby全盛の時代にJythonスクリプトで

すみません、、、、、

GeoIPCity.datのライト版なら無料でゲットできます。

ちかいうちに、この辺りについても

情報提供できればと、、、

リンク

最新記事
Categories
Archives
Twitter
記事Google検索

本ブログ内をGoogle検索
Yahoo!アクセス解析
Travel Advisor
記事検索
QRコード
QRコード
  • ライブドアブログ