WindowsでPythonのライブラリをコンパイルする方法

Windowsmisakaをインストールしようとしたらエラーが発生した。

$ pip install misaka

どうやらC言語のソースをコンパイルできない模様。

調べてみたらVisual Studio 2008をインストールすればよいようだが、今更古いバージョンをインストールする気にはなれず、とりあえず Visual Studio Express 2013 for Windows Desktop をインストールするも解消せず。

調べてみたところ以下のブログを発見。 街角のリブロガー: pythonでvcvarsall.batエラーが出る。

まずは、 from distutils.msvc9compiler import * get_build_version() これで現在のバージョンを調べる。 10.0なら HKEY_LOCAL_MACHINE\Software\Wow6432Node\Microsoft\VisualStudio\10.0\Setup\VC\ProductDir ここに文字列で C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC を入れて、 find_vcvarsall()を実行してみて、 ちゃんと戻り値が得られている事をチェックする。 これで完了。

$ python -i
Python 3.3.3 (v3.3.3:c3896275c0f6, Nov 18 2013, 21:19:30) [MSC v.1600 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> from distutils.msvc9compiler import *
>>> get_build_version()
10.0
>>> get_platform()
'win-amd64'

おそらくpythonコンパイルしたときと同じコンパイラを使用しようとするが、存在しないのでエラーになるのだと思う。そこで、無理矢理Visual Studio 2013のコンパイラを使用するように設定を変更すると、find_vcvarall()メソッドが通り、コンパイルもできるようになった。

$ python -i
Python 3.3.3 (v3.3.3:c3896275c0f6, Nov 18 2013, 21:19:30) [MSC v.1600 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> from distutils.msvc9compiler import *
>>> find_vcvarsall(get_build_version())
'C:\\Program Files (x86)\\Microsoft Visual Studio 12.0\\VC\\vcvarsall.bat'

変更したのは以下の2カ所

レジストリの編集

レジストリエディタで 以下のキーを作成し

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\VisualStudio\10.0\Setup\VC

文字列の値を次のように設定

C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC

vcvarsall.batの編集

C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin

を確認したところ x86_amd64ディレクトリが存在したので

C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\vcvarsall.bat

を編集し

if /i %1 == amd64     goto amd64

を次のように書き換えた

if /i %1 == amd64     goto x86_amd64

参考リンク

さくらのVPS 1Gに乗り換えました

さくらのVPS 1G が 512MBのプランと同じ価格で利用できるそうなので乗り換えました。これをきっかけにUbuntuからCentOSを使用することにしました。
乗り換えるにあたり初期設定を行ったので、作業メモを残しておきます。ただし参考にした記事とほとんど同じ内容ですが。

sshdの起動

ローカルの端末からsshで操作できるように
リモートコンソールからsshdの起動しておく。

$ sudo service sshd start

端末からログインできるようにする

sshの設定ファイルを書いてローカルの端末から簡単にログインできるようにしておく。

 $ vi  ~/.ssh/config

内容は次のような感じ。

host sakura
	hostname <ホスト名>
	port 22
	compression yes

次から以下のようなコマンドでログインできるようになる。

$ ssh -l root sakura

作業用ユーザーの作成

ssh接続するときは必要な時以外はrootユーザーは使用しない。
そのため、別の作業用ユーザーを作成する。

# useradd foo
# passwd foo
# usermod -G wheel foo

wheelグループのユーザーはすべてのコマンドを使用することができるようにする。

# visudo

で vi が起動するので、%wheel のコメントを外す。

%wheel        ALL=(ALL)       ALL

作業用ユーザーを作成したらローカル端末からログインできることを確認する。

$ ssh -l foo sakura

鍵の作成と登録

ローカル端末の公開鍵を登録する。
鍵を作っていなかったらssh-keygenで作成しておく。

$ ssh-keygen

ローカル端末の公開鍵をコピーする。

$ ssh-copy-id sakura

sshのセキュリティを高めるためにサーバー側の設定を変更する。

$ sudo vi /etc/ssh/sshd_config

ほとんどの設定が#でコメントアウトされているので#を削除して設定を書き換える。変更点は次の通り。

ポート番号を22から別のものに変更(例として22222にする場合)

Port 22222

ルートユーザーによるログインを禁止する。

PermitRootLogin no

パスワードによる認証を禁止する。

PasswordAuthentication no

設定ファイルを編集したらsshdを再起動。

$ sudo service sshd restart

ローカル端末から接続できることを確認する。
ポート番号を変えた場合は、先の手順で作成した ~/.ssh/config の port を変更しておくこと。

iptablesの設定

不要なポートを閉じるにiptablesを設定する。
sshのポート番号を変更している場合はそのポート番号も許可する必要があるので注意。

設定をシェルスクリプトに記述する。

$ vi iptables.sh
#!/bin/sh

iptables -P INPUT ACCEPT
iptables -F
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -s 10.0.0.0/8 -j DROP
iptables -A INPUT -s 172.16.0.0/12 -j DROP
iptables -A INPUT -s 192.168.0.0/16 -j DROP
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
iptables -A INPUT -p tcp --dport 2222 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -j LOG --log-level info --log-prefix "[iptables] "
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
iptables -L -v

設定を有効にしたあと、保存する。

$ sudo sh iptables.sh
$ sudo service iptables save

SDカードなしで手軽にDropbxの容量を増やす方法 on Windows7

話題になってるDropboxベータテスト参加で5GBの容量追加についてこんな記事が紹介されていました。
Dropboxベータテスト参加で追加5GBを獲得するための手っ取り早い方法 | ひとりぶろぐ

記事の中で、SDカードや外付けHDDを持っていない人はiPhoneを利用する方法が紹介されていますが、Windows7を使用している場合はもっと手軽な方法があります。
それは、外付けHDDの代わりにVHD(仮想HDD)を利用する方法です。Windows7では、OS標準でVHDがサポートされているため、簡単にVHDの操作ができます。

手順としては

  1. VHDを作成し接続する。このとき、適当なドライブ(E:\など)などにマウントする。
  2. DCIMフォルダを作成し、アップロードする写真や動画などを置く。
  3. VHDをマウントしたドライブを右クリックし、自動再生を開く。
  4. 「Import pictures and videos - Dropboxを使用」を選択すると、インポートが始まります。

VHDの作成、接続方法は@ITの記事が参考になります。

Windows7でなくても仮想HDDを使った方法は他のOSでもできると思います。しかし、Windows7なら簡単にできるよ!ということで。

2012/2/6 追記

元の記事のブックマークコメントで「本来はテスト協力のお礼なのだから、偽装ファイルを使用すべきでない」という意見がありました。もっともな意見だと思うので、この記事で公開していたダミーVHDを非公開としました。

よって、大容量のデータはカメラなどで動画を撮ったものを使用するようにしましょう。
(でもカメラ持ってたらSDカード持ってるか・・・)

お題:ランダム文字列(python)

半角英数からなる16桁の文字列をランダムに生成して下さい。
使用できる文字は 'a'から'z', 'A'から'Z'、'0'から'9'、そして '_' とします。

お題:ランダム文字列 - No Programming, No Life
import string
import random
chars = string.ascii_letters + string.digits + '_'
print "".join([ random.choice(chars) for i in range(16) ])

pythonはじめたばかりなので、pythonらしい書き方がよく分かってないけど
分かりやすく書いたつもり><

iMX515でNicoRo α版が予期せぬエラーで落ちるときは、パーミッションを手動で設定してみる

iMX515でNicoRo α版がインストールできたものの、いざ動画を再生しようとすると予期せぬエラーでアプリが強制終了してしまいます。アプリを再起動すると、強制終了の原因が表示されました。
今回は、以下のような内容でした。

java.lang.SecurityException: Neither user 10039 nor current process has android.permission.WAKE_LOCK. 

どうやら、スリープさせない(WAKE_LOCK)のパーミッションが足りないようです。
正直なところiMX515はスリープ周りが相当怪しいので、仕方ない気も。。

とりあえず、以下の手順でWKAE_LOCKパーミッションを手動で追加してあげることで、NicoRo α版で再生できるようになったことは確認しました。

以下、WKAE_LOCKパーミッションを手動で追加する方法

※自己責任でよろしくお願いします。
Android SDKやドライバをインストールして、iMX515をUSB接続している前提です。

packages.xmlを取り出す

adb pull /data/system/packages.xml

テキストエディタで開いて、name="jp.sourceforge.nicoro"〜となっている箇所を確認

<package name="jp.sourceforge.nicoro" codePath="/data/app/jp.sourceforge.nicoro-2.apk" flags="0" ts="1296148152000" version="19" userId="10056">
(中略)
<perms>
<item name="android.permission.CAMERA" />
<item name="android.permission.INTERNET" />
<item name="android.permission.WRITE_EXTERNAL_STORAGE" />
<item name="com.android.browser.permission.READ_HISTORY_BOOKMARKS" />
</perms>
</package>

permsにWAKE_LOCKがなかったら追加する

<item name="android.permission.WAKE_LOCK" />

あとは、packages.xmlを戻して再起動

adb push packages.xml /data/system/

iMX515でtwicca(など)がインストールできないときは、Google Map APIをいれる

iMX515でtwicca(など)がインストールに失敗することがあります。
調べてみると、どうやらGoogle Map APIが足りないそうなので
ここの手順どおりにファイルをコピーすると動作しました。

以下、手順

※自己責任でよろしくお願いします。
Android SDKやドライバをインストールして、iMX515をUSB接続している前提です。

ここからファイルをダウンロードして解凍。

  • 「com.google.android.maps.xml」を「/system/etc/permissions/」にコピー
  • 「com.google.android.maps.jar」を「/system/framework/ 」にコピー

するだけです。

adb push com.google.android.maps.xml /system/etc/permissions/ 
adb push com.google.android.maps.jar /system/framework/ 

ただし、以下のようなエラーでファイルのコピーに失敗するときは

failed to copy 'com.google.android.maps.xml' to '/system/etc/permissions//com.google.android.maps.xml': Read-only file system

/system を読み書きモードでマウントし直します。

adb shell
mount -o rw,remount /dev/block/mtdblock3 /system

あとは、iMX515を再起動すれば完了です。

adb shell reboot

いつものようにマーケットに接続すると、インストールできるようになっているはずです。

iMX515購入&使用感レポート

Android OS 2.2環境(というよりAIR for Android)が動作する環境が欲しかったので
iMX515という中国製Androidタブレット(いわゆるaPad)をヤフオクで落札しました。

iMX515

スペック

OS Android 2.2
CPU Freescale IMX515 800MHz ARM Cortex A8
メモリ 512MB
内蔵メモリ 4GB
液晶 8インチ 感圧式タッチスクリーン(マルチタッチ非対応) WVGA 800*600px
外部端子 microSDHC 3.5mmオーディオジャック
バッテリー 3900mAh
サイズ 209×161.5×14mm
重量 約480g
その他 Androidマーケット接続可Flash Player 10.1対応USBホスト機能あり

よいと思ったところ

  • さすがは中国製品なので価格が安かったです。私は13,000円ほどで落札しました。一般のオークション相場は15,000円ほどのようです。
  • 安価のわりにメモリが512MBも積まれています
  • 8インチで非ワイド(4:3)なので、10.1インチのタブレットと比べて、電車の中や寝ながら電子書籍や動画をみるのにちょうどよいサイズ&重量だと思います。
  • Androidマーケット対応済み。知らない人がいるかも知れませんが、aPadではAndroidマーケットに接続できない(アプリが入っていない)ケースもあるので、わざわざ「マーケット対応済み」と書いてあるショップもあります。
    • たとえば、国産マウスコンピュータのLuvPadAndroidマーケットに接続できないと公式サイトに書かれています。
  • Flash Player 10.1対応済み。Android版Flash PlayerはAndroid OS 2.2でないと動作しませんが、Android OS 2.2のタブレットだからといってFlash Playerが動作するわけではありません。(CPUごとに最適化されたFlash Playerがある)
  • USBホスト機能があります。つまり、USB機器を接続してAndroid側で利用できます。たとえば、USBメモリBluetooth、最新のファームウェアではUSBカメラがサポートされました。

残念なところ

  • 中国製品ゆえの(?)の不安定さ。無線LANがつながらない、マーケットで検索できないアプリがある etc
    • ただし、こういう不満を調べながら1つずつ解決していくのがaPadの楽しみでもあります(ポジティブすぎ?)
  • 電源ボタンがスライド式(ON-OFF)
    • 電源を切るときはOFFにスライド。すると電源が切れるのかと思いきや、「携帯電話の電源を切ります」のダイアログが表示されて、「OK」でようやく電源が切れるという仕様です
    • スリープはどうやるんだ?と思うかも知れませんが、ON→OFF→ONとすばやくスライドするとスリープできます。
      • ただし、フリーズしますorz ファームウェアのアップデートによる改善を待つしかありません。
タッチパネル

タッチパネルが感圧式(つまり圧力でタッチを感知する方式)なのでiPhoneなどの静電式比べると使い勝手が劣ります。コスト面を考えるとしょうがない部分でもあります。

逆に、ボールペンなど圧力をかけられるものなら何でもタッチペンとして利用というメリットもありますが。(iPhoneなどの静電式のタッチパネルは、先端が特殊加工されたスタイラスでないと操作できません)

ただし、感圧式であることを差し引いても、タッチ精度がイマイチです。特にゆっくりとスライドする場合。
ロングタップ(長押し)するときはさらに致命的で、プルプルと震えてしまいます。

iMX515 タッチパネル精度テスト ゆっくり移動した場合

すばやくスライドさせるときも多少ブレますが、まぁ許容範囲内だと思います。。
iMX515 タッチパネル精度テスト すばやく移動した場合

タッチパネルの精度については、個体差があるらしいです。私のiMX515は”ハズレ”ですかね。。

まとめ

個人的には値段のわりに十分遊べるデバイスだと思いますが、中国製品ゆえの難点が数多くあるのも事実です。そのあたりを楽しめる人で、iMX515が安価で手に入る状況であれば、おススメできる製品だと思います。