2016年7月31日日曜日

プチコン3号でたらい回し関数

プチコン3号SmileBasicを試してみたく、new3DSLLを手に入れた。たらい回し関数(竹内関数)を入力して実行してみた。

 DEF TARAI(X,Y,Z)
  IF X<=Y THEN
    RETURN Y
  ELSE
    RETURN TARAI(TARAI(X-1, Y, Z), TARAI(Y-1, Z, X), TARAI(Z-1, X, Y))
  ENDIF
END

PRINT TIME$
PRINT TARAI(12,6,0)
PRINT TIME$

BASICとはいっても、行番号いらないし、ローカル変数あるし、再帰呼び出しも可能なんですね。
引数(12, 6, 0)の場合、28秒で返ってきました。

さて、比較するものがないと困るので、メインで使っているToshiba dynabook SS RX1(Windows Vista 32bit)のpython 2.7.6でたらい回し関数を実行してみました。6秒ほどで返ってきました。

#import time
def tarai(x, y, z):
    if (x <= y):
        return y
    else:
        return tarai(
                    tarai(x-1, y, z),
                    tarai(y-1, z, x),
                    tarai(z-1, x, y))
start = time.time()
print tarai(12, 6, 0)
stop = time.time()
print stop - start

これを、zenfone2(ZE551ML)のqpythonで試すと12秒でした。

2016年3月23日水曜日

Kivy LauncherでAnimated Gif Viewer

Kivy Launcherのアップデートがあったので、せっかくなのでAnimated Gif Viewerを作ってみた。Kivyで作成して、QPythonでの動作を確認したけど、Kivy Launcherでは起動しない。GIFイメージの読み込みにPILを使っているけど、出力されたlogを見るとどうやら、GIFイメージを読むときに AttributeError: tobytes が起こっている。Pillowではtostring()が廃止予定になってtobytes()が使われるらしいとのこと。どうやらKivy Launcherが呼び出しているPILのバージョンが古いためにtobytes()メソッドがないらしい。そういうわけで、以下のようにスクリプトのあたまでtostring()を呼び出すようにtobytes()メソッドを追加してみた。

from PIL import Image as PILImage

def tobytes(pilimg, encoder_name="raw", *args):
    return pilimg.tostring(encoder_name=encoder_name)

PILImage.Image.tobytes = tobytes

無事に起動することができた。こういうところ、Pythonは便利ですね。


Next, Back, Pause, Rotate, Resume, Open, Quitとボタンをつけてみました。
GUIをwxPythonで作り直して、Windows用にもしてみた。



2016年1月15日金曜日

Kivy LauncherでImageViewerの起動に失敗

Zenfone2でKivy Launcherから自作のImageViewerを起動していたけど、新年になって起動しなくなった。どうやらバージョンアップして、動作が怪しくなったみたい。スクリプトを実行してもログも出力せずに、終了してしまった。Google Groupの方でも話題になっている。しかたがないので、プロジェクトのフォルダーをそのままQPythonに移動した。以前試したときは動かなかったけど、今回は問題なく起動した。こちらもバージョンが上がって、Kivyのバージョンが1.9.0になったようだ。

2016/3/21追記
Kivy Launcherのアップデートがあり、自作のImageViewerもKivy Launcherから無事に起動するようになった。


2015年8月25日火曜日

Windows10になったLatitude10とポメラDM100

Latitude10をWindows10にアップグレードしたので、ポメラDM100のBluetooth接続を試してみました。

ポメラDM100をBluetoothキーボードとして接続させてみると、問題なく認識しました。ところが、ファイル転送をさせようとしてもペアリングの手続きは現れますが、接続が完了しません。以前のメモでいうとステップ(5)で、ファイル転送のサービスが表示されないのです。

Windows8、8.1と使えていたので、ハードウェア上の問題はないはず。Windows10の標準のBluetoothドライバーが問題なのかと思い、DELLのサポートページからWindows8のBluetoothドライバーをダウンロードしてきてインストールしてみました。インストール中にタスクバーに表示されるアイコンは空欄になってしまい怪しかったのですが、無事にインストールできました。再度、DM100のBluetoothファイル転送を試みると、これまで同様に使えるようになりました。

これで、ポメラDM100とのBluetooth連携も問題なくできそうです。キーボードとして使うと、相変わらずキートップの表示とは異なる文字が入力されるキーがありますが、pythonで書いたスクリプトで回避しています。

ファイル転送は、PCを開いたデバイス欄にDM100アイコンが追加されるので、それを開くだけでファイル転送ができます。もちろん、ポメラはBluetoothのファイル転送状態にしておきます。フォルダが開かれたところで、ポメラのほうは接続完了状態になりました。


ファイル転送できるようになると、DM100アイコンがデバイスとドライブに追加された


DM100以下には、Main MemoryとSDカードがあり、これはMainMemoryを開いたところ



2015年8月19日水曜日

Latitude10のOSをWindows10にアップグレードした

DELLのLatitude10は、Windows8からWindows8.1にアップグレードして利用していた。Windows10への無償アップグレードが開始され、8月頭にそれを予約しておいたが、しばらくなにも起こらなかった。やっと先に進めるような通知が現れたので、さっそくアップグレードを実行してみた。

アップグレードは簡単で、指示にしたがって、ただ放置しておくだけであった。途中、何度か再起動がかかったが、そのときDELLのロゴ表示後に何も画面に表示されない長い時間が存在した。このときは、アップグレードに失敗して起動できなくなったのだろうかと不安になりつつも、電源ボタンに触るのを我慢し待ったところ、先に進みアップグレードは無事に終了した。ブラウザを起動して、とくに操作不能になるような不具合はなさそうだと思いつつ、それ以上触る時間もないので、電源を落としておいた。

問題に気づいたのは、 翌日、電源を入れてから。Windows10は起動したようだが、タッチパネルをスワイプしてもロック画面から先にすすめない。USBマウスと、キーボードを接続しログインしたところ、タッチパネルでも操作できるようになった。どうやら起動直後にタッチパネルが動いていないようである。デジタイザペンは最初認識している様子だったが、いざアプリケーションでデジタイザペンを使おうとすると、使えなくなっていた。

タブレットであるLatitude10でタッチパネルやデジタイザペンが使えないのは不便なので、使えるようにしたいところ。デバイスマネージャーを見てみると、特にエラーになっている様子はない。DELLのサポートページを見てみると、Latitude10は、Windows10ではサポートされていない様子。デジタイザ用にTABLET PC - Enhanced Tablet Driver 7.3.1-7をインストールしてみたり、デジタイザのユーザー設定を削除したりを行うと、一時的に使えるようになる。

そうこうしているうちに、デジタイザペンを使わずにある程度時間がたつと認識しなくなることが分かる。節電のためにデジタイザをオフをにするような動作だ。デバイスドライバの一覧からWacom Deviceのプロパティにある電源管理のタブを開くと、「電力節約のために、コンピュータでこのデバイスの電源をオフにできるようにする」があるので、このチェックをはずしたところ、無事にデジタイザペンを継続して使えるようになった。タッチパネルも同様かと思い、I2C HIDデバイスのプロパティから同様に設定すると、こちらも起動直後から使えるようになった。

とりあえず、入力デバイスが利用できるようになったので、一安心。Pythonで作ったGraffitiっぽい入力ができるソフトウェアキーボードも無事に動いている。 


2015年7月8日水曜日

MinGW gcc とctypesモジュールを用いてpythonからc関数を呼び出してみる 2

前に構造体を渡すような関数までやったけど、構造体の配列を渡すようなこともよくありそう。簡単な例で試してみたのでメモしておきます。
呼び出されるc関数は、以下の通り。

#include <stdio.h>

typedef struct {
 char name[20];
 int age;
} NAMEandAGE;

int sum_ages(int sz, NAMEandAGE *na)
{
 int i;
 int sum = 0;
 
 for (i=0; i<sz; i++){
  printf("%s %d\n", na[i].name, na[i].age);
  sum = sum + na[i].age;
 }
 return sum;
}
文字列と整数のフィールドをもつ、構造体NAMEandAGEの配列を渡して、 要素の値を表示し、ageの和を返す関数です。
配列は、pythonスクリプトで作成するため、その長さが分からないので、 整数szで長さを渡しています。

ソースファイルをstructures.cというファイルに保存して、

gcc -Wall -c structures.c

でコンパイルします。structures.oというオブジェクトファイルができますので、

gcc -shared -o structures.so structures.o

として、structures.soという、共有ライブラリファイルを作成します。
これを呼び出す、pythonスクリプトは、以下の通り。

import ctypes

class NAMEandAGE(ctypes.Structure):
    _fields_ = [('name', ctypes.c_char*20),
                ('age', ctypes.c_int)]

if __name__ == '__main__':
    mydll = ctypes.CDLL("structures.so")

    data = [('name1', 1), ('name2', 2)] 
    nameandages = (NAMEandAGE * len(data))()
    for n, d in zip(nameandages, data):
        n.name = d[0]
        n.age = d[1]

    result = mydll.sum_ages(ctypes.c_int(len(data)), ctypes.pointer(nameandages))
    print result

配列は、(構造体のクラス * 要素数)で構造体配列のクラスを作って、それを用いてインスタンスを生成するようです。 その後、リストdataの値で、各要素のフィールドを設定しました。
関数を呼び出すときは、ctypes.pointer()を使って、構造体配列のポインタを渡せばよいようです。

2015年5月30日土曜日

Zenfone2を手に入れた

IDEOSでは、OCN mobileのデータSIMを利用していたのですが、 3Gでしか利用していなかったので、ちょっともったいない気がしていました。 画面が小さいため、ほぼモバイルルーターとしてしか使用しないという状況。 Zenfone2が発売されたので、乗り換えました。 メモリ2GB、ストレージ32GBのモデルです。 IDEOSでもmicro SIMを使っていたので、SIMを入れ替えるだけですぐに使えました。 データSIMだけど、セルスタンバイ1%だって。問題がない様子。 画面をダブルタップで、スリープのON/OFFができるのはとても便利ですね。

QPythonを入れてみたところ、便利な計算機として、使えそうではあります。 さらにkivyを用いて、PC上でimageViewerを書き、Zenfone2へインストールしてみました。 しかしながら、QPythonではいるkivyのバージョンは1.8で、バージョン1.9からの in-memory loadingを利用したため、QPythonからは実行できませんでした。

Kivyのページを見たところ、AndroidにはKivy Launcherというものがあるらしいので、 そちらで試すことに。 Kivy Launcherは、kivyのバージョンが1.9で、無事に動作しました。 これで、PC上で作成したGUIつきのpythonスクリプトを、Zenfone2でもそのまま動かせそうです。