follow me

xml.etree.ElementTreeとxmlns

Pythonでのxml.etree.ElementTreeとxmlnsについてです。
Youtubeなどで提供されているXMLはxmlnsを使用していて、扱いに悩んでしまった。

例としてYoutubeの動画情報取得ではこんな感じになります。
以下URLで取得できるXMLの場合。
http://gdata.youtube.com/feeds/api/videos/動画ID

xmlnsはこのような形で複数定義された状態になります。
<entry xmlns="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" xmlns:gd="http://schemas.google.com/g/2005" xmlns:yt="http://gdata.youtube.com/schemas/2007">
xmlns一個だけの定義であれば解説しているページも多いのですが、実際XML提供されているサービス(Youtubeなどなど)では複数定義がほとんどのようです。。。

で、実際に値を取得してみる。
タイトル名の取得はxmlnsを指定し、属性を指定すれば取得できる訳ですが。
thumbnail画像URLなどは、xmlnsの指定を2個並べる事で取得する形になる。

サンプルコード
from xml.etree.ElementTree import *

url = "http://gdata.youtube.com/feeds/api/videos/動画ID"
tree = parse(urllib2.urlopen(url))
elem = tree.getroot()

//タイトル取得
title = elem.findtext("{http://www.w3.org/2005/Atom}title")

//thumbnail画像URL取得
thumbnail_url = elem.find("{http://search.yahoo.com/mrss/}group/{http://search.yahoo.com/mrss/}thumbnail").get("url")
follow me

CGIHTTPServerの仕様です

PythonでCGIのテストしてまして、リダイレクトが動作しないので悩んでました。
CGIHTTPServer - CGI 実行機能付き HTTP リクエスト処理機構

CGIHTTPRequestHandler クラスで実行されるCGIスクリプトは HTTP コード200 (スクリプトの出力が後に続く)を実行に先立って出力される (これがステータスコードになります) ため、リダイレクト(コード302)を行なうことができません。

ヘッダ箇所はいじれないんですね。
諦めて何かhttpd入れます。。。
follow me

PythonでのCGI動作確認

Pythonには標準で、Web Serverとして使えるモジュールが入っています。
Rubyにしても、最近のLLはhttpdのモジュール入りが多くありませんか?

ython 2.4以上の場合
 $ python -m CGIHTTPServer
Python 2.4以前の場合
>>> import CGIHTTPServer
>>> CGIHTTPServer.test()
実行したディレクトリ以下に、cgi-binディレクトリを作成し、cgiを設置すればcgi動作を確認できます。
わざわざ環境作らなくていいのは便利ですねぇ。
follow me

PythonでID3v2タグを利用

MP3のIDタグにはv1とv2で大きく仕様が異なり、IDv1タグであれば簡単なのですが、文字数制限がある為IDv2タグを使ってみた。
ライブラリには、eyeD3を利用してみました。
他にもいろいろとあるのですが、使いやすそうだったので(笑
以外にパッケージ提供されてるLinuxディストリビューションもあったりで準備がラク。

Windowsで利用する場合は、site-packages以下に解凍したeyeD3ディレクトリをコピーし、__init__.py.inを__init__.pyに名前変えれば使用できます。

実際にIDv2タグを書き込んで見ます。
とりあえず、最低限こんな感じで書き込める訳です。簡単ですね。
import eyeD3

tag = eyeD3.Tag()
tag.link('test.mp3')
tag.header.setVersion(eyeD3.ID3_V2_3)
tag.setTextEncoding(eyeD3.UTF_16_ENCODING)

tag.setArtist('テストアーティスト名')
tag.setTitle('テストタイトル名')
tag.update()
follow me

UnicodeDecodeErrorが出てしまう

思いつきでPythonはじめました。
今更ですか?と云われそうですが。。。

ElementTreeでXMLを弄っていると以下エラーメッセージ発生。
データに2バイト文字があった場合に出ている様子。
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe5 in position 0: ordinal not in range(128)
どうやらPythonでは良くある事のようで、Pythonでのデフォルトの文字コードがutf-8ではなくasciiとして認識されているのが問題らしい。
python install path/lib/site-packages/以下に「sitecustomize.py」という名前でファイルを作成し、以下内容を書いておけば解決する。
import sys
sys.setdefaultencoding("utf-8")
follow me

PHP:fgetcsv()日本語消失

WebメーラーのSquirrelMailを、とある理由で構築したのですが、
アドレス帳に書いた日本語部分が表示されません。
サーバ上のファイルには、日本語で出力されているので、おかしいと思いまして。。。
どうやら、PHPのfgetcsv()関数が原因だった様です。

fgetcsv()関数は、ロケールを意識するとの事で、srchack.orgの「en_US」がモロに引っかかった様です。

・PHPのマニュアルには、こんな感じです。
注意: この関数はロケール設定を考慮します。もし LANG が例えば en_US.UTF-8 の場合、 ファイル中の 1 バイトエンコーディングは間違って読み込まれます。

んで、解決策としては、
1. 日本語を使用する際はフィールドをダブルクォートで囲む
2. setlocale(LC_ALL, ‘ja_JP.EUC’);等で一時的にロケールを変更する。

汎用的に考えると、アドレス帳追加時に、ダブルクォートで囲んでファイルに出力する様にプログラム修正ですかね。。。
follow me

Event2syslog

Event2syslogを公開します。
プログラム内容は、WindowsのEventLogに出力された内容をUNIX syslogサーバへ転送を行います。
EventLogのメッセージ内容は、syslogのプロトコル仕様に合わせ、全体で1024byteに収まるようにカットします。
単なるアプリケーションなので、インストールやアンインストールの必要はありません。
現在、Windowsのサービスとして登録可能なモノは作成中ですので、サービスとして登録を行いたい方は少々お待ちください。

使用方法:event2syslog.exe 引数:syslogサーバのホスト名

event2syslog_bin.zip
event2syslog_src.zip
follow me

NotifyChangeEventLog()にやられた

WindowsのEventLogを扱うためのAPIで、新しいEventLogの発生の検出を行う物があるのですが、この変な仕様(WMIの仕様?)なんとかなりません?

NotifyChangeEventLog()って名前のAPIなのですが。
内容は、hEventLogで指定されたイベントログにイベントが書き込まれたらhEventで指定されたイベントオブジェクトをシグナル状態にする。
となっているのですが、5秒以内に複数のEventLogが発生した際に取りこぼしが発生する可能性があります。
実際に試した所、確かに取りこぼしが発生しました。
それもかなりの高確率で。。。
Microsoftのページでも、取りこぼしの可能性があるってなってました。。。
とりあえずは、2003SP1では修正されているそうですが。

詳細は、Microsoftのページに記載されています。
follow me

タスクトレイ格納型プログラム

タスクトレイに格納されたプログラムの作成。
久々にプログラム作ろうと思ってみて、せっかくなのでタスクトレイ格納型にしたいと思ったので、やり方を調べてみたメモ。
内容は、Shell_NotifyIcon()使えばイイだけ。これを使ってトレイ内のアイコンを変えてみたり~。
とりあえず、プログラム初期化部分に以下のコードを埋め込み完了。
nidNoftyIconData.cbSize  = sizeof(NOTIFYICONDATA);
nidNoftyIconData.hWnd    = hwnd;
nidNoftyIconData.uID     = 1;
nidNoftyIconData.uFlags  = NIF_ICON | NIF_TIP | NIF_MESSAGE;
nidNoftyIconData.uCallbackMessage = WM_USER + 1;
nidNoftyIconData.hIcon   = LoadIcon(hCurInst, MAKEINTRESOURCE(IDI_ICON));
strcpy(nidNoftyIconData.szTip, APP_DESCRIPTION);

Shell_NotifyIcon( NIM_ADD, &nidNoftyIconData );

あと、ウィンドウが無いので、プログラムを終了するために、ポップアップメニューを追加しないと。。。プログラムが終了できない。。。
ちなみにメニュー箇所は、こんな感じにしてみた。
  case (WM_USER + 1):  //アイコンからのメッセージ処理
    if( lParam == WM_RBUTTONDOWN ){
      // マウス右押し
      GetCursorPos( &pt );
      hMenuPop = CreatePopupMenu();
      AppendMenu( hMenuPop, MF_BYCOMMAND | MF_STRING, IDR_EXIT, TEXT("Exit(&X)") );
      SetForegroundWindow( hwnd );
      TrackPopupMenu( hMenuPop, TPM_RIGHTBUTTON, pt.x, pt.y, 0, hwnd, NULL );
      if( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) ) {
        TranslateMessage( &msg );
        DispatchMessage( &msg );
      }
      DestroyMenu( hMenuPop );
    }

とりあえず、ポップアップメニューまで追加したタスクトレイ格納型の雛形。
プログラムはVC++6.0で作成。
TaskTray.zip
follow me

Borland Turboシリーズ無償版登場

Borland Turboと聞くと、MS-DOSやWindows3.1を思い出すのは自分だけでしょうか。
それはいいとして、最近、開発環境やらDBやら無償化が流行ってますね~。
LinuxだろうがWindowsだろうが簡単にプログラムが勉強出来るようになって、これからプログラミングをはじめようかという方には、いいんじゃないでしょうか。

う~ん、ダウンロード可能なのは以下の4種類か、十分だな。(アセンブラが消えてしまってるのが少しさびしい)
・Turbo Delphi
・Turbo Delphi for .NET
・Turbo C++
・Turbo C#

Borland turbo公式サイト