2013年7月3日水曜日

imageViewerを修正

imageViewerで画像を見ていると、画像切り替え時に白くフラッシュする感じだったので、それを抑えるように調整してみました。結局、MemoryDCに描画して、PaintDCに送っていたのだけど、ちょくせつPaintDCに描画することにしてみました。ついでに、画像の向きをスクリーンにあわせて自動回転するスイッチをAキーおよび、ストロークでトグルできるようにしました。ストロークは、1-0-3、または3-0-1。 NetWalker用、Windows用のどちらも修正しました。



2013年6月22日土曜日

イメージビューアのpythonスクリプト

NetWalkerで新しく書き直したImageViewerの動作を確認したので、
Windows用とあわせて、Pythonスクリプトをダウンロードできるようにしました。
スクリプト自体は同じものですが、
NetWalkerのものは、文字コードがUTF-8で改行LFで、
Windowsのものは、文字コードがSHIFT-JISで、改行CR+LF です。
また添付した初期設定ファイルが異なっています。
特に、DefaultScreenを指定するところ、NetWalkerのものは、
'/home/netwalker/imageViewer'というようにフルパスで記述しますので、
それぞれ環境に合わせて修正してください。

2013年6月21日金曜日

ImageViewerをNetWalkerで動かしてみた

先日書き直したImageViewerをNetWalkerで動かしてみた。
Pythonスクリプトの文字コードをUTF-8にして、改行コードをLFにしただけで、動作しました。
NetWalkerでは画面が小さいので、二ページ表示は活用できませんが、
先読みしているので、画像の切り替え速度は、前のJpegViewerより速くなった気がします。


Windows7にPSプリンタドライバを追加

先日、dropLaunchで、pdfからepsへの変換処理も簡単にできるようにしたところですが、
やっぱり直接epsファイルを生成したいということで、プリンタドライバを追加しました。
PSのプリンタドライバは、いろいろあるので、どれでもよさげなのですが、今回は、
MS Publisher Color Printerにしてみました。

手順をメモしておきます。

コントロールパネルを開きます

「ハードウェアとサウンド」の項目にある「デバイスとプリンターの表示」を選びます

「プリンターの追加」を選びます

「ローカルプリンターを追加します」をクリックします

「プリンターポートの選択」で、
「既存のポートを使用」「FILE:(ファイルへ出力)」を選択し、「次へ」を押します。

プリンタードライバーのインストールで、
「Generic」を選び、
プリンターとして、「MS Publisher Color Printer」を選びます。
「次へ」を押します。

プリンター名を適当に入力します(デフォルトのままでもよい)。

正しく追加されれば成功です。

テストページを印刷すると、ファイル名を入力するダイアログが開きます。

ここでは、フルパスでファイル名を記述しましょう。例えば、
C:\Users\loginname\output.ps
のように。ここで、c:\Users\loginnameはホームフォルダです。

epsファイルの出力にしか利用しないので、次のように設定しておきます。
コントロールパネルのデバイスとプリンターの中に、
「MS Publisher Color Printer」が追加されたら、
そのアイコンを右クリックしてメニューを出し、その中の印刷設定を選びます。

「詳細設定」ボタンを押すと、「詳細オプション」のウィンドウが開きます。

「ドキュメントのオプション」にある、「PostScriptオプション」を開きます。
(頭の+マークを押す)
「PostScript出力オプション」を「EPS」にします。
「OK」ボタンを押します。

「印刷設定」のウィンドウで、「適用」ボタンを押し、「OK」ボタンで閉じます。
これで、EPSファイル出力の設定になります。

2013年6月17日月曜日

ファイルをドロップして実行

ファイルをドロップして、そのファイルに対して処理をするpython+wxPythonの
スクリプトを作ってみました。
pdftopsでepsを作成するときに、便利になるかもしれません。
自分で使うための、ちょとした小物を作るのは、楽しいですね。
ここでダウンロードできます。


2013年6月15日土曜日

イメージビューアー

Windows 8 タブレットがいろいろと発売されている中、やっと8インチサイズのものも発表されてきたようです。NetWalkerのように、タブレットでPythonとwxPythonを動かせる小型のタブレットがでてきてほしいと思いつつ、少々大きめのタブレットの画面が生かせるようなイメージビューアとして、NetWalkerで利用しているJpegViewerを修正してみました。ペンで囲んでズームする機能は、使う機会がなかったので、削除してしまいました。

それ以外は、ほとんど変わっていないですが、デフォルトの初期画像を4枚用意してみました。このソフトは操作ボタンやメニューがないのです(ユーザーインターフェースがないわけではなくて、初期画面で見える形でないだけです)。JpegViewerでは、あまり意味のない操作説明を初期画像として用意してい たけれど、今度はわりきって、OPENとCLOSEのみの説明しか書いていないものにしました。NetWalkerではペンでストローク操作したのですが、Windowsではマウスで画 面上にストロークを描くことになります。昨今の静電式のタッチパネルでは試したことがないので操作できるかはわからないところ。キーボードによる操作もできるので、ノートパソコンではそちらが便利でしょう。
 

新しい機能は、二つの画像を並べて表示する機能とスライドショーです。とりあえず、Windowsのみで動作するように割り切って、主なスクリプトはすべて書きなおしました。

あとは、すてきなWindowsタブレットを手に入れることができたら動作を試してみたいと思います。

2013年4月18日木曜日

PythonでGoogleドライブのSpreadsheet

Windowsのpythonを使って、GoogleドライブのSpreadsheetをテキストデータベースとしてアクセスしてみました。Web上に情報がたくさんあるのですが、いくつかつまづいたので、覚え書き。

まず、pythonで利用するモジュールですが、
http://code.google.com/p/gdata-python-client/
からダウンロードします。左側のフレームにあるDownloadsから、gdata-2.0.17.zipをダウンロードしました。
展開して、Windowsのコマンドプロンプトを起動します。
展開してできたフォルダに移動して、インストールを実行します。

> python setup.py install

使用するモジュールは、gdata.spreadsheet.text_dbです。
これを用いると、スプレッドシートの一行目を要素名(Field名)の記述として、それ以降の各行を1つずつのレコードとしてアクセスすることができます。

import gdata.spereadsheet.text_db

としたらOKです。
googleドライブにアクセスするのには、アカウント名とパスワードが必要です。とりあえずコンソールで動かすのでパスワードをgetpassモジュールで取得します。このモジュールを利用すると、エコーバックなしに、文字を受け取ることができるようです。

import getpass
pw = getpass.getpass('password >')

pwに入力文字列が入ります。
さて、emailにgmailアドレスをいれて、アクセスしましょう。

client = gdata.spreadsheet.text_db.DatabaseClient(username=email, password=pw)

つぎにスプレッドシートを選択します。
dblist = client.GetDatabases(name='sheetname')
さて、sheetnameの名前のスプレッドシートがdblistに入ります。nameで指定すると一つとは限りません。目的のスプレッドシートのみを指定できるわけではないので、注意が必要です。スプレッドシートのkeyで指定する方法であれば一つに決まるようですが、keyを知らないといけません。

name='sheetname'で選ばれる最初のスプレッドシートはdblist[0]です。
そのkeyは、dblist[0].spreadsheet_keyに入っています。

さて、スプレッドシートを選んだら、次はその中のシートを選びます。text_dbでは、それがtableになります。

tablelist = db.GetTables(name='sheet1')
こちらもname='sheet1'で選ばれるのは一つとは限らないので注意が必要ですね。とりあえず、最初のシートを開きましょう。似たような名前の複数のシートを作らなければ大丈夫でしょう。
table = tablelist[0]
そのテーブルに含まれるField名を得るには、

table.LookupFields()

を呼びます。すると、table.fieldsにリストされます。

さてレコードを順番にアクセスしていくには、table.GetRecords()でレコードのリストを得ます。

for rec in table.GetRecords(1, 100):
    #write process for each record.
    pass

で1番から100番までのレコードを順に処理していけます。

特定の条件のレコードを得たいなら、table.FindRecords()を使うことができます。たとえば、nameというFieldに'net walker'が入っているレコードを得たければ、recs = table.FindRecords('name == "net walker"')
とするとよいでしょう。

特定の行のレコードを得体なら、table.GetRecord()を使います。10行目のレコードなら、
rec = table.getRecord(row_number=10)
でよいでしょう。ここで、10行目といいますが、Field行が0行目として考えています。

さて、最初利用してみたとき、このレコードがうまく取得できませんでした。大切なのは、第1カラム(最初のField)が空のレコード(行)を作らないことのようです。空があると、レコードの終わりと認識するようですね。

レコード(rec)内の各フィールド内の文字は、contentという辞書として保存されています。たとえば、'name'というフィールドに入っている文字を得たければ、rec.content['name']として得られます。python2.7で扱うときは、unicodeに変換して利用するとよいでしょう。

str = unicode(rec.content['name'])

とすると、いろいろと処理が便利になると思います。

さて、text_dbモジュールのいろいろは、"gdata text_db"で検索をかけてみると見つかると思います。制限がありますが、割り切って使うと便利なこともあるかもしれません。

○スプレッドシートやテーブルを選択するときに、名前で引くと意図したもの一つだけが選択されるわけではない。
○第1カラムが空の行(レコード)は作らない
○そうそう、Field名は、半角英数小文字を使うとよいそうです。
○テーブル(ファイル内のシート)を削除するときは、シートがすべて無くならないようにする。

以上、つまづいたので、覚え書きしておきます。