Tuesday, December 10, 2013

CGIHTTPServerでのトラブル

今回もPythonの話題です.

Pythonは便利な言語で,CGIサーバーも簡単に扱うことができます.
その辺の知識は全くなかったので,みんなのPython Webアプリ編 [みんなのシリーズ]を参考にしました.

CGIサーバーの勉強中にPythonスクリプトを呼び出せないというエラーが起きたので,その対処法をメモ代わりに残しておきます.
 
ここで扱う問題は,Windowsでコーディングし,Linuxでの動作確認時に起きた問題です.

CGIHTTPServerは,サーバーを起動したカレントディレクトリ上にあるcgi-bin内にあるPythonスクリプトを呼ぶことができます.
このPythonスクリプトがうまく実行されないという問題につまづきました.
起きた現象は以下の2つです.

① プログラムが実行されずWebブラウザがスクリプトファイルをダウンロードする.

② プログラムが実行されず,スクリプトファイルの中身が表示される.

▶ 原因と解決方法


それぞれの原因と解決方法を示します.

hoge.py:ここでは実行したいPythonスクリプトを表します.

①の原因

Pythonスクリプトに実行権限がないことが原因です.

実行させたいPythonスクリプトがあるディレクトリ(通常はcgi-bin)で,以下のコマンドを実行してみてください.

$ ls -l

そのときにの以下の様な結果が表示されます.

-rw-rw-r-- 1 usr usr 553 12月  9 15:51 hoge.py

該当する実行したいスクリプトファイルの「-rw-rw-r--」の部分を見てください.
ここの一番右が「x 」になっていない場合そのファイルに実行権限はありません.

①の解決方法

Pythonスクリプトに実行権限を与えれば解決です.
以下のコマンドを実行してください(hoge.pyは実行権限を与えたいスクリプトファイル名です).

$ chmod 755 hoge.py 

先ほどの「ls -l」で実行権限を確認します.
すると以下のように右端が「x」に変わっているはずです.

-rwxr-xr-x 1 hm hm 553 12月  9 15:51 hoge.py

以上で①の問題は解決されるはずです.
ちまにみに,これはちゃんと「みんなのPython」に書いてあります.

②の原因

・実行権限も与えたのにスクリプトが表示されるだけで実行できない.
・Windowsから移植したら動かなくなった.

以上のような場合はこの原因が考えられます.
以下のコマンドを実行してください.

$ file hoge.py 

そのときに以下のように表示されていれば,ここで解説する原因と一緒です.

hoge.py: a python\015 script, ASCII text executable, with CRLF line terminators

正常な場合は,以下のように表示されます.

hoge.py: a python script, ASCII text executable

これはWindowsの改行コード(CRLF)とLinuxの改行コード(LF)が異なることが問題になっています.

②の解決方法

文字コード変換ソフトで文字コードと改行コードを変換してください.
Linuxですと,nkfというコマンドが便利です.
参考:UNIX & Linux コマンド・シェルスクリプト リファレンス

$ nkf -file hoge.py > hoge_lf.py

これでhoge_lf.pyの改行コードを調べてみてください.

hoge_lf.py: a python script, ASCII text executable

上記のように表示されていれば成功です.

この他に問題が起きた場合は,以下のコマンドを実行してみてください.

$ ./hoge.py

このhoge.pyが実行できなければ,Linux上でスクリプトとして認識されていないか,実行権限に問題があると思いますので,その辺を中心に探ってみると良いかもしれません.

以上で,Pythonを使ったCGIサーバー実行時のトラブルのまとめを終わります.

Saturday, November 30, 2013

C++11のためにGCCの最新版をインストールする

 
 最近The C++ Programming Language (4th Edition)を読んでいます.
これは最新のC++11に準拠した権威ある(分厚い)解説書です.
C++はちょとたしなむ程度でしたが,これを気に真面目に勉強してみようと思います.

 勉強のためにUbuntu上でC++11の開発を行えるよう環境設定をしましたので,その工程をまとめておきます.
想定している環境は以下のようになります.

OS
Ubuntu 12.04 LTS 32bit

GCC
4.8.1

参考にしたサイト
UbuntuHandbook


1.GCCとG++のバージョン確認


まずは現在の自分の環境を確認します.
・現在のGCCとG++のバージョンを確認します.
$ gcc --version
$ g++ --version 
 
私の環境では,以下のようになりました.
gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3
g++ (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3

バージョンごとのC++11に対するサポートは以下のサイトをごらんください.
C++0x/C++11 Support in GCC

今回は4.8をインストールします.

2. GCCとG++のインストール


 update-alternativesを使用して元のGCCと最新のGCCを共存させます.

・Personal Package Archive(PPA)の追加します.
$ sudo add-apt-repository ppa:ubuntu-toolchain-r/test

・GCC 4.8とG++ 4.8をインストールします.
$ sudo apt-get update; sudo apt-get install gcc-4.8 g++-4.8

・GCC 4.8とG++ 4.8をupdate-alternativesに優先度20で登録します.
$ sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.8 20
$ sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.8 20 

・元のGCC(4.X)をupdate-alternativesに優先度10で登録します.
ここでXは自分の環境に合わせて変更してください.
$ sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.X 10
$ sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.X 10
・GCC 4.8とG++4.8が使用できるか確認します.
$ gcc --version
$ g++ --version

GCC4.8系列が表示されれば成功です.
gcc (Ubuntu 4.8.1-2ubuntu1~12.04) 4.8.1
g++ (Ubuntu 4.8.1-2ubuntu1~12.04) 4.8.1


3. 元のGCCにバージョンを戻す方法


 元のGCC/G++のバージョンに戻す方法を説明します.
これは,2章でGCC 4.8がバージョンに表示されない場合にも有効です.

・configから使用するGCCを選択し,変更する.

$ sudo update-alternatives --config gcc
$ sudo update-alternatives --config g++

selectionの番号を入力しEnterキーを押せば,使用するGCCを変更できます.


GCCのConfig





 
G++のConfig











4. サンプルを作成する


 開発環境が無事に準備できたか確認するために,適当なコードをコンパイルしてみましょう.

・test.cppを作成します.
適当なエディタ(emacsやgeditなど)で以下のコードを入力してください.

#include <iostream> 
#include <vector> 

int main() 
{
     int array[] {1, 2, 3, 4, 5};
     std::vector vec;

     for (int& i : array)
     {
         vec.push_back(i);
     }

     for (auto itr = vec.begin(); itr != vec.end(); ++itr)
     {
         std::cout << *itr << std::endl;
     }

     return 0;
}

・test.cppをコンパイルします.

$ g++ -std=c++11 test.cpp -o test

もし,G++4.6以下を使用しているのであれば,以下のコマンドでコンパイルしてください.

$ g++ -std=c++0x test.cpp -o test

無事にコンパイルでき,以下のようにコンソールに表示されれば成功です.

test.cppの実行結果







以上で,C++11の開発環境の設定は終わりとなります.

Sunday, November 3, 2013

Maker Faire Tokyo 2013

 Maker Faire Tokyo 2013に行ってきました。
Makeに行くのは久しぶりなのですが、今回も非常に楽しかったです。

色々楽しい作品が多かったのですが、気になったものをいくつか紹介します。

BreadBoardManiac


 ここでしか見たことない、フレキシブルなブレッドボード。
カッターで切って好きな大きさにして使えるらしい。

 貫通型の非常に薄いブレッドボードはおしゃれだけど、どう使うのか悩みどころです。
多層の基板を構築することができるようですが、やったことないのでいまいちピンときません。
今後販売するようなので、ぜひ手にとって確かめてみたいです。


フレキシブルブレッドボード







貫通型ブレッドボード




















kadecot


 Web API付きのAndroidセンササーバ。
ECHONET Lite対応の家電を操作することができるらしい。

 OpenECHOというJavaで書かれたECHONET Lite用のドライバライブラリをいじって、自分でECHONET Lite対応の機器を作ることもできるとのこと。

 デモがマニアックだな―と思ったらSONYの研究所がやっている萌家電でしたよ。
写真のデモは空気中のエネルギーを集めて、美少女キャラが電気をつけてくれるというもの。


kadecot



















スマポン


 Android端末にガジェットを差し込むと、スクリプトを自動で流してくれるフレームワーク。
ガジェット内のスクリプトで色々なことを実現するので、スクリプト解釈用のアプリ以外は余計なアプリを入れなくて良いらしい。
らくらくホン使っている人や、鍵ガジェットがないとアクセスできないファイルをつくるなど、セキュリティーに使いたいそうです。

 SL4Aで実装しているとのことですので自作のガジェットを作れそうです。

スマポン













凸P


 レゴを画面に差し込むと、ゲーム内の挙動が変わるという拡張現実的なゲーム。
インタラクティブなプロジェクションマッピングといった感じ。

 自動で動くマリオを、プレイヤーがブロックを動かして操作し遊ぶことができます。
ゲーム自体のクオリティーが高く見ていて楽しかったです。

 赤外線LEDをブロックに照射して赤外線カメラでブロックを見ているそうです。


凸P



















DotFab

ドット絵を3Dモデルに変換してくれる3Dモデラーです。
3次元モデルを作れない人でも楽しくモデルが作れるかも?
ピクセルの色の明るさに応じて、3次元モデルの高さが決まるそうです。
完全に余談だけど多分この人はまどか☆マギカのファンです。

DotFabで作成したモデル













アニキと愉快な仲間たち


 マイクロマウス競技会の一部門である、ロボトレース競技向けのロボットを展示していました。
実はこのチーム名のアニキとはサークルでお世話になった大先輩です。

 下の写真はここの人が作ったロボットMETEORAです。
この方もサークルの先輩です。
このトレーサーはラインセンサを円周上に無数に配置することで、スキャナのように使用できます。
独特な円形状が非常にイカしています。


METEORA













METEORAの裏側


















 Maker Faire Tokyo 2013は非常に楽しめました。
いつかは自分も参加してみたいものです。



Saturday, November 2, 2013

pytextcheck

 お久しぶりです。
最近はブログではなく、別のWebページを作成に勤しんでいました。
私の記事を待ってくれている人がいたら、すみませんでした。

今回はpytextcheckというPythonから使用できるテキストチェッカーを作ったので紹介します。

このモジュールはテキスト形式の文書の中身を検索して、特定の語句を検出します。

Texで論文を書くために作成しました。

論文のように公開する文書内の語句には、いくつか規定があります。
例えば、ある学会では「行う」は「おこなう」、「。」は「.」と表記するといった決まりがあります。
文書を書いたあとに、1つずつ検索して禁止語句が含まれていないか探すのは大変面倒でした。
この前書いた論文では 208個も使用してはいけない漢字があり、とても検索する気が起きませんでした。
そこで、 今回紹介する、pytextcheckを書きました。
使い方は簡単で、以下のようにたった3行のコードで使用できます。

import pytextcheck
t = Text()
t.check_text('test.tex', 'basic.txt', 'sice.txt')

ダウンロードと詳しい説明はここからお願いします。
サンプルではtest.tex内で、basic.txtとsice.txtに記述された語句を使用されているか調べます。
もし使用されていらば、該当する語句とそれが含まれる行番号を表示してくれます。
現状では、あまり文書のコンテキストを読む機能はありませんので、漢字があれば拾ってしまいます。
例えば、「~の時」は「~のとき」と表記しなけらばならないとします。
そこで、禁止語句リストに「時」を入れると、「時間」「時計」なども検出するということです。
回避方法をいくつか思いつきましたが、用途的には余計なことをしてfalse negative(偽陰性)を発生させるよりは、
false positive(偽陽性)は許容するということにしました。
このあたりの問題は、もう少し色々な人に使ってもらって検討したいと思います。

 余談ですが、このモジュールを作成するにあたり、文字コードと改行コードには苦労しました。
改行コードは各OSで以下のようになっています。
・Windows
\r\n
・Mac (9以下)
\r
・Unix
\n

このようにOSによってコードが違うので、読み込んだ文字列から改行コードを削除しています。
また、Pythonで扱いやすいよう、Unicode形式に変換して検索を行っています。
今回で文字列を扱うときの注意点がなんとなくわかってきたのは、収穫でした。


次回もへばらない程度に、気を抜きながら何か記事にしたいと思います。
気長にお待ちください。

Thursday, March 21, 2013

Python:matplotlibでScatterを使った2Dアニメーション

 お久しぶりです。
ブログお引越し後の一発目のネタが実はずっと前に書きかけだったネタです。

今日はmatplotlibというPythonから使用出来るグラフ描画ライブラリを使用したのでそれについて書きます。
単純な内容であれば非常に簡単に使えるのですが、アニメーションのサンプルがわかりづらく、手間取ったのでメモ代わりです。
ほとんどのサンプルが乱数を使っており、挙動が理解しづらいため書き直して確認しました。

内容的には、Scatterという散布図を作成する機能で2Dアニメーションを行う方法について説明します。
XY平面に描画するサンプルを扱います。

1. 処理の流れ
 ① 必要なモジュールのインポート
 ② 描画準備(値の設定、画面の設定)
 ③ アニメーションの設定
 ④ コールバック関数の設定

という流れです。実際にはコールバック関数は最初に設定しています。
アニメーションでは設定したコールバック関数が一定間隔で呼び出されます。
そこに再描画用の設定をすることでアニメーションにすることができます。

2. ソースコード
XY平面上にプロットされた点が移動するサンプルが以下のようなスクリプトになります。


import matplotlib.pyplot as plt
import matplotlib.animation as animation
import numpy as np

def _update_plot(i, fig, scat):
scat.set_offsets(([0, i],[50, i],[100, i]))
print('Frames: %d' %i)

return scat,

fig = plt.figure()

x = [0, 50, 100]
y = [0, 0, 0]

ax = fig.add_subplot(111)
ax.grid(True, linestyle = '-', color = '0.75')
ax.set_xlim([-50, 200])
ax.set_ylim([-50, 200])

scat = plt.scatter(x, y, c = x)
scat.set_alpha(0.4)

anim = animation.FuncAnimation(fig, _update_plot, fargs = (fig, scat),
frames = 100, interval = 100)

plt.show()


3. 各処理の説明
ある程度matplotlibの基本はわかっていることを前提に説明します。

fig = plt.figure()

図全体の描画を行うFigureオブジェクトをインスタンス化します。


x = [0, 50, 100]
y = [0, 0, 0]

プロットする各点のXY座標をリストに格納します。


ax = fig.add_subplot(111)
ax.grid(True, linestyle = '-', color = '0.75')
ax.set_xlim([-50, 200])
ax.set_ylim([-50, 200])

グラフ描画領域の設定を行います。
Subplotオブジェクトをインスタンス化します。
次に、グリッドの描画設定を行い、最後にX軸とY軸の値域を設定します。


scat = plt.scatter(x, y, c = x)
scat.set_alpha(0.8)

Scatterオブジェクトをインスタンス化します。
引数は、Xの値を格納したリスト、Yの値を格納したリスト、色となります。
色はXの値から自動的に色が設定されます。
最後にプロットする点のアルファチャンネルを設定します。


anim = animation.FuncAnimation(fig, _update_plot, fargs = (fig, scat),
frames = 100, interval = 100)

FuncAnimationオブジェクトをインスタンス化します。
引数は、Figure、コールバック関数、コールバック関数へ渡す値、フレーム数、フレーム間インターバルとなります。
ここで指定した関数がintervalで設定した間隔で呼ばれます。
fargsではコールバック関数に渡す値を設定します。
framesは設定した値まで0からアップカウントし、設定回数数えると0からまた数えます。
intervalは設定した間隔 [msec]でコールバック関数を呼び出します(単位はおそらく)。


plt.show()

showメソッドで描画がスタートします。


def _update_plot(i, fig, scat):
scat.set_offsets(([0, i],[50, i],[100, i]))
print('Frames: %d' %i)

コールバック関数です。
フレーム数と、Figure、Scatterオブジェクトを受け取っています。
Scatterのプロット値はset_offsetsメソッドを使用します。
XYの値は、([X1,Y1], [X2, Y2], ....., [XN, YN])と指定します。
Scatterオブジェクトの設定時とは指定方法が異なるので注意して下さい。

以上で以下のような2Dアニメーションが描画できます。

4. 描画






今回はここまでです。