2013年9月5日木曜日

[Python] ファイルからの読み込み

超今更なエントリですが、自分自身の知識の定着を図るために書きます。
と言ってもコードは、数行

fp = open('./data/router.log', 'r')
for line in fp:
  print type(line)
  print line[:-1].split(' ')
fp.close()


-出力-
<type 'str'>
['2013/04/09', '00:55:45:', 'PP[01]', 'IP', 'Commencing', '(DNS', 'Query', '[www.asial.co.jp]', 'from', '192.168.100.2)\r']
<type 'str'>
['2013/04/09', '00:55:46:', 'PP[01]', 'IP', 'Commencing', '(DNS', 'Query', '[api.twitter.com]', 'from', '192.168.100.2)\r']
<type 'str'>

line は、str型なのでsplitメソッドでリストに分解してます。
一行ずつの読み込みは、

fp.readline()

とする方法もあるが、最初の例のほうが高速らしい、

2013年8月14日水曜日

[Python] モジュールのサーチパス表示

Python モジュールのサーチパスの表示方法 ( 以下は、Mac OS X での実行結果

>>> import sys
>>> print sys.path

['', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python27.zip', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-darwin', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac/lib-scriptpackages', '/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-tk', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-old', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload', '/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/PyObjC', '/Library/Python/2.7/site-packages']

2013年8月6日火曜日

[python] COMコンポーネントを利用してみる

今回は、WindowsにてpythonでCOMコンポーネントを利用してみます。
pythonは既にインストール済みとして、

まず、必要なライブラリをインストールします。

http://sourceforge.net/projects/pywin32/

からインストールされているpythonのバージョンのインストーラーをダウンロードして、インストール。
これで、[python-install-dir]\Lib\site-packages にライブラリがインストールされます。


次に自分の環境にどのようなCOMコンポーネントがインストールされているか確認する。
Windows SDKをインストールして。以下を管理者権限で実行。

regsvr32 "c:\Program Files\Microsoft SDKs\Windows\v7.1\Bin\IViewers.Dll"

そして、Oleview.exeを管理者権限で実行。ちなみに自分の環境では、C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin に当該プログラムがインストールされていた。

ツリーの「Type Libraries」で各COMコンポーネントのインタフェースを確認することができる。


次に、各タイプライブラリのpython用ソースを生成する。win32com clientのインストールディレクトリに移動して、
cd C:\usr\local\python\2_7_5\Lib\site-packages\win32com\client
以下を実行
python makepy.py 

すると利用可能なタイプライブラリの一覧が表示されるので。ソースを生成したいライブラリを選択して「OK」を押下。

 ここでは、iTunesを選択してみた。生成したタイプライブラリの情報は、

python make.py -i "iTunes 1.13 Type Library"

で確認することができる。

さてようやくサンプルコードですが。。。

>>> import win32com.client
>>> foo = win32com.client.Dispatch("iTunes.Application")
>>> foo.Quit()

ウィンドウを最小化したり、音量を変更したりできるみたいですが今日はここまで



-Reference-
Quick Start to Client side COM and Python

2013年7月30日火曜日

[Network] IPアドレスの衝突

最近普段自分が利用するIPネットワークが不安定にたまにホストの名前解決に失敗する
ネットワークの構成変更をしたばかりでもあり、一番可能性が疑われるIPアドレスの衝突の調査をしてみる。

BSD系OS/Windows
[1] arpテーブルを全て削除
arp -d # BSD系OSの場合 root権限で

[2] テーブルエントリーの追加のために衝突が疑われるアドレスに対してping
ping dst-address

[3] arpテーブルの表示
arp -a

上記手順を数回繰り返して、[3]で表示されるMACアドレスが複数あれば、IPアドレスが衝突していることになる。




2013年7月23日火曜日

[FreeBSD] GUI環境構築

DM に xfce4 を採用してGUI環境を構築したが、シャットダウン、リブートを一般ユーザーが出来ない

これを解決するためには、/usr/local/etc/polkit-1/localauthority/50-local.d/org.freedesktop.consolekit.pkla を作成して以下を記述する

[Local restart]
  Idendity=unix-group:power
  Action=org.freedesktop.consolekit.system.restart
  ResultAny=yes
  ResultInactive=yes
  ResultActive=yes

  [Local shutdown]
  Idendity=unix-group:power
  Action=org.freedesktop.consolekit.system.stop
  ResultAny=yes
  ResultInactive=yes
  ResultActive=yes

  [Local restart - multiple]
  Idendity=unix-group:power
  Action=org.freedesktop.consolekit.system.restart-multiple-users
  ResultAny=yes
  ResultInactive=yes
  ResultActive=yes

  [Local shutdown - multiple]
  Idendity=unix-group:power
  Action=org.freedesktop.consolekit.system.stop-multiple-users
  ResultAny=yes
  ResultInactive=yes
ResultActive=yes

そして、シャットダウン、リブートを許可したいユーザーをpowerグループに所属させる

2013年7月8日月曜日

[FreeBSD] ports チェックサム unmatched

portsにてgmakeをコンパイル、インストールしようとしたら、チェックサムが合わないと言われた。

make distclean

でダウンロードしてきたファイルを削除して

make checksum

でハッシュ値を計算しなおしたらいけた。

[libxml2] XPath によるxmlのパース

APIの多さと初心者向けの情報の少なさで苦戦してますが、ようやく超最低限なパースができたのでメモ


パースするXMLファイル
<?xml version="1.0" encoding="us-ascii" ?>
<orchestra>
  <players num="3">
    <player>aoki</player>
    <player>nakashima</player>
    <player>suzuki</player>
  </players>
</orchestra>

コード
#include <stdio.h>
#include <libxml/xmlreader.h>
#include <libxml/xpath.h>

int main(int argc, char **argv){

  char *xml;
  char *xmlPath;
  int i;

  xmlXPathContextPtr cntxt;
  xmlXPathObjectPtr xmlObj;
  xmlDocPtr doc;
  xmlNodeSetPtr nodes;
  xmlNodePtr node;
  struct _xmlAttr *curAttr;

  xml = argv[1];
  xmlPath = argv[2];
  
  doc = xmlParseFile(xml);
  if(!doc) return -1;
  cntxt = xmlXPathNewContext(doc);
  if(!cntxt) return -1;
  xmlObj = xmlXPathEvalExpression((xmlChar *) xmlPath, cntxt);
  if(!xmlObj) return -1;

  nodes = xmlObj->nodesetval;

  // iterate node
  for(i=0;i<nodes->nodeNr; i++){
    node = xmlXPathNodeSetItem(nodes, i);

    // node name
    printf("=%s=\n", node->name);
    // properties
    curAttr = node->properties;
    while( curAttr != NULL ){
      printf("%s: %s\n", curAttr->name, curAttr->children->content);
      curAttr = curAttr->next;
    }
    if(node->children->content != NULL ){
      printf("content= %s\n",  node->children->content);
    }
  }


  xmlXPathFreeContext(cntxt);
  xmlFreeDoc(doc);
  xmlCleanupParser();

  return 0;
}

実行
./a.out sample/01.xml "//*"

出力
=orchestra=
content= 
  
=players=
num: 3
content= 
    
=player=
content= aoki
=player=
content= nakashima
=player=
content= suzuki


上記サンプルには、値を含んでいないcontentのケアを含んでいない。

参考サイト: http://d.hatena.ne.jp/hakutoitoi/20090319/1237397160 取っ掛かりのコード