wxPythonメモ

wxPython。分かりやすくメモメモ
簡単にGUIがつくれて良い感じ。

テキストを2つ読み込んで組み合わせを表示するサンプルです

#! C:\Python27\python.exe
# -*- coding: shift-jis -*-

import wx       # wxPython
import xlwt     # Excel(書き込み)
import sys      # いろいろ

#-----------------------------------------------------------------------------
#    基本フレーム 基本パネル
#-----------------------------------------------------------------------------
class TestAppFrame(wx.Frame):

    Appname = ("TestApp")

    # コンストラクタ的なもの selfはコンテキスト
    def __init__(self):
        wx.Frame.__init__(self, None, wx.ID_ANY, self.Appname, size=(900,400))

        # ファイルの読み込み in1.txt
        try:
            f = open("in1.txt", "r")
            load_str1 = f.read()

            f.close()
        except IOError:
            self.showMessage("in1.txtが見つかりません")
            sys.exit()

        # ファイルの読み込み in2.txt
        try:
            f = open("in2.txt", "r")
            load_str2 = f.read()

            f.close()
        except IOError:
            self.showMessage("in2.txtが見つかりません")
            sys.exit()

        # shift-jis を unicode型にデコード (後々文字コードでハマりやすいので内部ではUnicode型に統一する。らしい)
        load_str1.decode('shift-jis')
        load_str2.decode('shift-jis')

        # 要素一覧の生成
        load_list1 = load_str1.split("\n")
        load_list2 = load_str2.split("\n")

        # メインパネル生成 (1つ)
        main_panel = wx.Panel(self, wx.ID_ANY)

        # サブパネル生成 (2つ)
        sub_list_panel = list_panel(main_panel, load_list1, load_list2) # リストパネル
        sub_button_panel = button_panel(main_panel)                     # ボタンパネル

        # メインレイアウト (メインパネルの上にサブパネルを配置する)
        main_layout = wx.FlexGridSizer(1,2)
        main_layout.Add(sub_list_panel, flag=wx.GROW)
        main_layout.Add(sub_button_panel, flag=wx.GROW)
        main_layout.AddGrowableCol(0)
        main_layout.AddGrowableRow(0)

        # レイアウト確定
        main_panel.SetSizer(main_layout)

    def showMessage(self, word):
        dig = wx.MessageDialog(self, word, "エラー", wx.OK)
        dig.ShowModal()
        dig.Destroy()

#-----------------------------------------------------------------------------
#    リストパネル
#-----------------------------------------------------------------------------
class list_panel(wx.Panel):

    # publicな感じ
    data = []

    def __init__(self, main_panel, listdata1, listdata2):
        wx.Panel.__init__(self, main_panel, wx.ID_ANY)

        # self.XXXは privateな感じ
        self.stage1 = listdata1
        self.stage2 = listdata2
        self.stage3 = []

        # リストボックスの生成 (3つ)
        self.listbox1 = wx.ListBox(self, wx.ID_ANY, size=(200,-1), choices=self.stage1, style=wx.LB_HSCROLL|wx.LB_MULTIPLE)
        self.listbox2 = wx.ListBox(self, wx.ID_ANY, size=(200,-1), choices=self.stage2, style=wx.LB_HSCROLL|wx.LB_MULTIPLE)
        self.listbox3 = wx.ListBox(self, wx.ID_ANY, size=(300,-1), choices=self.stage3, style=wx.LB_HSCROLL|wx.LB_SINGLE)

        # リストボックスのイベントを登録
        self.listbox1.Bind(wx.EVT_LISTBOX, self.stage1_select)
        self.listbox2.Bind(wx.EVT_LISTBOX, self.stage2_select)

        # リストパネルレイアウト(リストパネルの上にリストウィジェットを配置する)
        layout = wx.FlexGridSizer(1,3)
        layout.Add(self.listbox1, flag=wx.GROW|wx.TOP|wx.LEFT|wx.BOTTOM, border=10)
        layout.Add(self.listbox2, flag=wx.GROW|wx.TOP|wx.LEFT|wx.BOTTOM, border=10)
        layout.Add(self.listbox3, flag=wx.GROW|wx.TOP|wx.LEFT|wx.BOTTOM, border=10)
        layout.AddGrowableCol(0)
        layout.AddGrowableCol(1)
        layout.AddGrowableCol(2)
        layout.AddGrowableRow(0)

        # レイアウト確定
        self.SetSizer(layout)

    def refresh(self):
        self.cache1 = list(self.listbox1.GetSelections())
        self.cache2 = list(self.listbox2.GetSelections())

        self.data = []
        for i in range(len(self.cache2)):
            for ii in range(len(self.cache1)):
                self.data.append( self.stage2[self.cache2[i]] + " x " + self.stage1[self.cache1[ii]] )

        self.listbox3.Set(self.data)

    def stage1_select(self, event):
        self.refresh()

    def stage2_select(self, event):
        self.refresh()

#-----------------------------------------------------------------------------
#    ボタンパネル
#-----------------------------------------------------------------------------
class button_panel(wx.Panel):
    def __init__(self, main_panel):
        wx.Panel.__init__(self, main_panel, wx.ID_ANY)

        # ボタンの生成 (2つ)
        button1 = wx.Button(self, wx.ID_ANY, "全てテキストで出力")
        button2 = wx.Button(self, wx.ID_ANY, "全てExcelで出力")

        # ボタンのイベントを登録
        button1.Bind(wx.EVT_BUTTON, self.click_button_1)
        button2.Bind(wx.EVT_BUTTON, self.click_button_2)

        # ボタンパネルレイアウト(ボタンパネルの上にボタンウィジェットを配置する)
        layout = wx.BoxSizer(wx.VERTICAL)
        layout.Add(button1, flag=wx.TOP|wx.LEFT|wx.RIGHT, border=10)
        layout.Add(button2, flag=wx.TOP|wx.LEFT|wx.RIGHT, border=10)

        # レイアウト確定
        self.SetSizer(layout)

    def click_button_1(self, event):
        f = open("out.txt", "w")
        for word in list_panel.data:    # こんな感じに他のクラスの変数にアクセス可能
            f.write(word.encode('shift-jis') + "\n")    # 何らかの文字コードにエンコードしてからwrite
        f.close()

        self.showMessage("out.txt を出力しました")

    def click_button_2(self, event):

        book = xlwt.Workbook()
        sheet = book.add_sheet("HAHAHA!!")
        sheet.write(1,1,"ALL list")

        for i, word in enumerate(list_panel.data):
            sheet.write(i + 2,1,word)                   # Unicode形式のままwrite

        book.save("out.xls")

        self.showMessage("out.xls を出力しました")

    def showMessage(self, word):
        dig = wx.MessageDialog(self, word, "out", wx.OK)
        dig.ShowModal()
        dig.Destroy()

#-----------------------------------------------------------------------------
#    main ここからはじまる
#-----------------------------------------------------------------------------
if __name__ == "__main__": # main() な感じ

    app = wx.App()
    frame = TestAppFrame()      # クラスが生成されコンストラクタ的に__init()__が呼び出される

    frame.Show()
    app.MainLoop()

<参考サイト>
python-izm
YAMAGUCHI::weblog – マルチバイト文字列のエンコード・デコード

nginxでwordpressのサイトを構築する

WindowsでNginxを構築します
最近はNginxが流行ってきているということで、Windowsでやってる方が少ないのもあって構築方法をメモメモ

Windows + Nginx + FastCGI + PHP + Mysql の組み合わせで WordPress が動作するところまでです
検証環境は Windows7x64 です

ダウンロード
必要なものを集めてきます。
Nginx → Stable Version nginx/Windows-1.0.12
PHP → PHP5.3 VC9 x86 Non Thread Safe
Mysql → MySQL Community Server 5.5.20 Windows (x86, 32-bit), MSI Installer
Wordpress → WordPress 3.3.1

解凍
NginxをC:\Program Files\nginx-1.0.12 に解凍
PHPを C:\Program Files\php-5.3.10-nts-Win32-VC9-x86 に解凍
Wordpressを C:\www に解凍
Mysqlをインストール。(ry

動作確認
1. まずNginxの動作確認。
“C:\Program Files\nginx-1.0.12\nginx.exe” を起動してから、ブラウザで localhost に接続する。
「 Welcome to nginx! 」と表示されればOK

2. 次にPHPの動作確認
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 の項目のコメントアウトを外して次のようにする

location ~ \.php$ {
root html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
include fastcgi_params;
}

“C:\Program Files\php-5.3.10-nts-Win32-VC9-x86\php-cgi.exe -b 127.0.0.1:9000” で PHPを起動し、
“C:\Program Files\nginx-1.0.12\nginx.exe -s reload” で変更した設定を読み込む。
ブラウザで localhost/tekitou.php にアクセスします。
「 No input file specified. 」と表示されれば、Nginx PHP 間のやり取りは成功です

WordPressを動かす

“C:\Program Files\nginx-1.0.12\conf\nginx.conf” の

location / {
root html;
index index.html index.htm;
}

を以下のようにする

location / {
root C:/WWW;
index index.php index.html index.htm;
}

# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 の項目を

location ~ \.php$ {
root C:/;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME C:/WWW$fastcgi_script_name;
include fastcgi_params;
}

にする。

“C:\Program Files\php-5.3.10-nts-Win32-VC9-x86\php.ini-production” を コピーして php.ini を作成する
そして php.ini の
;extension=php_mysql.dll のコメントアウトを解除して
extension=php_mysql.dllにする

phpを再起動する。

ブラウザで localhost に接続する

完了。

自動起動するようにする
ポートを介してphpを利用するためIISやApacheと違って事前にphpを起動させておく必要があります。

batファイルを作って起動時に実行させます

start C:\"Program Files"\php-5.3.10-nts-Win32-VC9-x86\php-cgi.exe -b 127.0.0.1:9000
start C:\"Program Files"\nginx-1.0.12\nginx.exe

参考サイト
nginx + PHP on Windows in 5 minutes
Install WordPress on WEMP (Windows, nginx, MySQL and PHP)
nginxの起動オプション
CGI版のPHPで「No input file specified.」のエラーを解決する方法
fastcgi_param SCRIPT_FILENAME パラメータの意味
WordPressを100倍速くする! MySQLの調整やnginx proxy cache
ソースファイルが shift-jis だと文字化けする問題 「未解決」

iosへのGoogleAppsアカウントの追加方法

久しぶりに新しいカレンダーを作成した所、
iosへカレンダーが同期されなくて(カレンダーが存在しないように見える)
いまさら困ったのでメモ。

アカウントの再設定やら、CalDAVなどは必要なかった。

  1. アカウントの設定
    Exchangeを選択。「次へ」を選択するとサーバの入力項目が現れるので「m.google.com」を入力
     
  2. ios デバイスから 「m.google.com」 へアクセスする
  3. 「Googla Appsをご利用の場合」へをタップしてドメインを入力する。

  4. 日本語の状態では「sync」が出てこないので
  5.  左下の「言語を変更」を選択し、「English(US)」へ変更する

  6.  言語が変わると「Sync」が表示されるようになるのでタップ
  7. 「Sign in with your Google Apps Account」をタップ
  8. 「iPad」をタップ
  9. 同期するカレンダー一覧が表示されるのでチェックを入れて「Save」でおしまいです。

無線ネットワークの認証が必要です と キーリングのロック解除

久しぶりにメモメモ
毎回要求されていたので解除方法

ブラウザを立ち上げると毎回「キーリングのロック解除」を求められる場合

アプリケーション > アクセサリ > パスワードと暗号鍵で 「パスワード:デフォルト」を選択して右クリックからパスワードの変更

新しいパスワードを空のままでOKします

「無線ネットワークの認証が必要です」の場合

「すべてのユーザに利用可能」 にチェックを入れると毎回要求されることは無くなります

XBeeの設定で詰まったところなど

XCTUを使ったXbeeの設定など
※XBeeはZigbee規格で作られた製品です。

すでに沢山のサイトで解説されていますが、苦戦したのでメモメモ
あまり触れられてない所など

デバイスの存在を意識せずに自動的にネットワークを構築してくれる優れもので、シリアル通信を簡単に無線化してくれます。
しかもお値段が安いっ!
他のモジュールは6000~7000円するところが1700円で買えます

買った場所
スイッチサイエンス
XBee ZB / チップアンテナ型 2個
XBeeエクスプローラUSBドングル
ドングルのほうが高いとな…

回路
ループバックのみ。

X-CTU
①最新バージョン(5.2.7.5)で問題なく動きました。
X-CTUの使い方は他サイト参照

②X-CTUは癖のあるソフトです。

③ファームの種類
ファームの種類ですが、今回はXBee ZB(XB24-Z7CIT-004)を買ったので XB24-ZBでうまくいきました。
※シリーズの違いでも変わってくるみたいです
Function Setは
・ZIGBEE COORDINATOR AT
・ZIGBEE END DEVICE AT
の二種類を片方ずつに書き込みます。COORDINATORが親機でEND DEVICEが子機です
三台目からはEND DEVICEになります

④設定内容
③の通りにFunction Setを設定してあれば設定内容は弄らなくても動きます
設定をデフォルトへ戻すにはShow Defaultsで戻ります。
きちんと設定したければ、設定項目ごとに表示される下枠の説明で意味がよく分かります。

⑤読み込めない!書き込めない!
最初はファームが問題なく書き込めて、テンションが上がってたんですが、設定を弄っているうちにファームの書き換えにミスったのか通信できなくなって青ざめました。

どうやらXBeeは通信中はX-CTUを受け付けないようで、リセット直後なら通信できるようです。
なのでリセットボタンを押してくれのメッセージが出ますが
ドングルにはリセットボタンは付いていないのでタイミングよくXBeeをドングルに差し込みます。
↓のInfoダイアログが出たら数秒(長い分には問題ないみたい)待ってから

サクッと挿します。

⑥通信はできたけど遅い。リアルタイムじゃない
Destination Address High
Destination Address Low
がブロードキャストの設定になっているとパフォーマンスが落ちるみたいです。
XBeeの裏にあるアドレスを指定するか、0x0000000000000000でリアルタイムに動きました
※ 0x000000000000FFFFでブロードキャスト
※ 0x0000000000000000で親(COORDINATOR)を指定

⑦はじめの数バイトが送信できてない
デバイスがSleepモードになっていると通信開始時のデータがうまく送信されないようです。
初期設定では周期Sleepになっているので
SleepMode で NO SLEEPに設定。

⑧なぜかSleepModeのNO SLEEP設定がうまく行かず。



この問題については[参考サイト]参考
PIN HIBERNATEで NO SLEEP代用

参考サイト
XBeeで無線通信!
xbeeを使ってすぐに壊した
いまさらXBee

なんか適当だけどままぁいいかっ