たけし備忘録

自分の好奇心の赴くままに勉強メモ LL系が大好き Python bash Julia C

2.クイックスタート

クイックスタート: "Hello World"


 このチュートリアルでは、ボトルをインストール、またはプロジェクトディレクトリにコピーしたことを前提にしています。最も基本的な "Hello World"の例から始めましょう:

from bottle import route, run

@route('/hello')
def hello():
    return "Hello World!"
run(host='localhost', port=8080, debug=True)

 このスクリプトを実行し、​http://localhost:8080/helloにアクセスすると、あなたのブラウザに "Hello World!"が表示されます。


 route() デコレータは、URLパスのコードの一部をバインドします。この場合では、hello() 関数に/hello というURLをリンクします。
 これは、ルート(すなわちデコレータ名)と呼ばれ、このフレームワークの中で最も重要な概念です。必要な数だけルートとして定義することができます。ブラウザがURLを要求するたびに、リンクされた関数(今回はhello())が呼び出され、戻り値がブラウザに返されます。それほどシンプルなのです。


 最後の行のrun()で組み込みの開発用(テスト用)サーバーを起動します。これは、localhostのポート8080上で実行され、Control-cを押すまで、リクエストを提供します。
 後でサーバーのバックエンドを切り替えることができますが、この開発用サーバ上に必要とする全てが入っている。開発用サーバーは設定を全く必要とせず、あなたのアプリケーションを取得し、ローカルテストのために実行する上で信じられないほど労力を必要としない方法です。


 デバッグ·モードは初期の開発時に非常に便利ですが、公開されたアプリケーションのためにオフにする必要があります。このことを念頭に置いて保管してください。

 これは非常に単純な例ですが、bottleを使ったアプリケーション構築の基本的な考え方を含んでいます。さらに読み続けて、他に何が出来るのかを見ていきましょう。


デフォルトのアプリケーション

 簡単のためにこのチュートリアルではほとんどの例で、ルートを定義するモジュールレベルのデコレータであるroute()を使います。
 これはルートを追加するための標準的なデフォルトアプリケーションであり、初めてroute()を呼び出した時に自動的に作成されるbottle.Bottleのインスタンスです。他のいくつかのモジュールレベルのデコレータと関数は、このデフォルトのアプリケーションに関連していますが、より多くのオブジェクト指向のアプローチを好むと余分なタイピングを気にしない場合は、別のアプリケーションオブジェクトを作成し、グローバルなものの代わりにそのを使用することができます。

from bottle import Bottle, run
app = Bottle()
@app.route('/hello')
def hello():
    return "Hello World!"
run(app, host='localhost', port=8080)

オブジェクト指向のアプローチは、さらにデフォルトのアプリケーションのセクションで説明されています。ちょうどあなたが選択を持っていることを心に留めておいてください。

次の記事へ進む → 3.ルーティングリクエスト


関連リンク

1.Bottleのインストール

インストール


 ボトルは、任意の外部ライブラリに依存しません。あなたは自分のプロジェクトディレクトリにbottle.pyダウンロードしてコーディングを開始することができます。

$ wget http://bottlepy.org/bottle.py

 これにより、すべての新機能が含まれている最新の開発スナップショット(不安定版)を取得します。
より安定した環境を好む場合には、安定版を取得するべきです。安定版はPyPi上で取得でき、pip(推奨)やeasy_install、またはあなたのOSのパッケージマネージャを介してインストールすることができます。

$ sudo pip install bottle  # 推奨
$ sudo easy_install bottle # pip無しにやる方法 
$ sudo apt-get install python-bottle # Debian, Ubuntuなどのそれぞれのパッケージ管理システム


[パッケージシステム全体を、インストール権限を持っていないまたは作成したくない場合]

$ virtualenv develop             # 仮想環境を作成
$ source develop/bin/activate    # デフォルトのPythonを仮想環境上のものに変更
(develop)$ pip install -U bottle # 仮想環境上にbottleをインストール


[virtualenvをお使いのシステムにインストールされていない場合]

$ wget https://raw.github.com/pypa/virtualenv/master/virtualenv.py #virtualenvをwget
$ python virtualenv.py develop   # 仮想環境を作成
$ source develop/bin/activate    # デフォルトのPythonを仮想環境上のものに変更
(develop)$ pip install -U bottle # 仮想環境上にbottleをインストール

 いずれの方法でも、bottleのアプリケーションを実行するためにはPython 2.5以降(3.xを含む)が必要です。


次の記事へ進む → 2.クイックスタート


関連リンク

深層学習ライブラリ Chainerインストール時にメモリがいっぱいいっぱい Theanoもついでにインストール

昨日今日と引き続いてTheanoとChainerをpipからインストールしようとしたのですがどうにもインストール出来ない。
特にChainerなんてメモリが99%まで埋め尽くされてフリーズする。こいつぁひどい。

私の環境はそもそも

Windows7(64bit)
(※お金が無いのでGPUは載せてません。)
Python2.7.10

の下で
Cythonは最新, C++コンパイラ(g++)もある、pathも通ってる、pipも最新にした。
いったい何がおかしいんだってことでいろいろと原因を探ってみたところとても恥ずかしいミスを発見。
MinGWが32bit版でした。

MinGWWindows環境ではド定番で入れるコンパイラ群。プログラムやりたてホカホカの右も左も分からない時に入れたので32bit入れちゃったんだなぁきっと。
ということで
MinGW-w64 - for 32 and 64 bit Windows download | SourceForge.net
こちらからMinGW64bit版のインストーラを落としましてインストールしました。
MinGW32bit版と違ってC:直下ではなくC:\Program Files\mingw-w64 に配置されてました。
このままではpathが通ってなかったので、ここにpathを通します。

周知ではあるけども、pathの優先順位は先頭にあるものから優先して呼びだされます。
whereコマンドで where g++ と打ってみるとg++コンパイラのpathが通ってる全てのpathが表示されます。
whichコマンドで which g++ で最優先されるg++コンパイラのpathが表示されます。

MinGW32bit版は消したくなかったので、MinGW64bitのbinのディレクトリにだけpathを通してコンパイラ群だけ最優先(PATHの先頭に入れただけ)にさせました。

とりあえず全てを終えて、再度Theanoをインストール!
pip install theano → 成功!

安心できないぞ!importを終えてから安心するんだ!
import theano → 成功

いやまだだ!chainerのインストールが私の目的だったはずだ!
pip install chainer → 成功

Theano依存の最近ちょこちょこ名前の上がってるKerasも
pip install keras → 成功
これはtheano入ってなくてもg++が32bitでも出来たけどサンプルコードが動かなかった。
ということでKerasサンプルコードもg++を64bitにしたら成功しました。

ということでchainerをpipでインストールして(ソースからコンパイルするときも同じく)メモリが異常にいっぱいになってしまう方はぜひともC++コンパイラのバージョンをご確認下さいませ。
Chainerは悪く無かった。ごめんよChainer。悪口言ってゴメンネChainer。
お見苦しい文章ですがこんな感じで解決しました。

pyqtgraph+PyAudioによるリアルタイムで音声プロット その2

takeshid.hatenadiary.jp

前回書いた記事でのコードを改良し、時間的に流れるようにしました。
また、今回はついでにスペクトルアナライザーも作りましたのでヌルヌル具合をお確かめ下さい。


www.youtube.com



[AudioPlot.py]

#プロット関係のライブラリ
import pyqtgraph as pg
from pyqtgraph.Qt import QtCore, QtGui
import numpy as np
import sys

#音声関係のライブラリ
import pyaudio
import struct


class PlotWindow:
    def __init__(self):
        #プロット初期設定
        self.win=pg.GraphicsWindow()
        self.win.setWindowTitle(u"リアルタイムプロット")
        self.plt=self.win.addPlot() #プロットのビジュアル関係
        self.plt.setYRange(-1,1)    #y軸の上限、下限の設定
        self.curve=self.plt.plot()  #プロットデータを入れる場所

        #マイクインプット設定
        self.CHUNK=1024             #1度に読み取る音声のデータ幅
        self.RATE=44100             #サンプリング周波数
        self.audio=pyaudio.PyAudio()
        self.stream=self.audio.open(format=pyaudio.paInt16,
                                    channels=1,
                                    rate=self.RATE,
                                    input=True,
                                    frames_per_buffer=self.CHUNK)

        #アップデート時間設定
        self.timer=QtCore.QTimer()
        self.timer.timeout.connect(self.update)
        self.timer.start(50)    #10msごとにupdateを呼び出し

        #音声データの格納場所(プロットデータ)
        self.data=np.zeros(self.CHUNK)

    def update(self):
        self.data=np.append(self.data, self.AudioInput())
        if len(self.data)/1024 > 5:     #5*1024点を超えたら1024点を吐き出し
            self.data=self.data[1024:]
        self.curve.setData(self.data)   #プロットデータを格納

    def AudioInput(self):
        ret=self.stream.read(self.CHUNK)    #音声の読み取り(バイナリ)
        #バイナリ → 数値(int16)に変換
        #32768.0=2^16で割ってるのは正規化(絶対値を1以下にすること)
        ret=np.frombuffer(ret, dtype="int16")/32768.0
        return ret

if __name__=="__main__":
    plotwin=PlotWindow()
    if (sys.flags.interactive!=1) or not hasattr(QtCore, 'PYQT_VERSION'):
        QtGui.QApplication.instance().exec_()

[SpectrumAnalyzer.py]

#プロット関係のライブラリ
import pyqtgraph as pg
from pyqtgraph.Qt import QtCore, QtGui
import numpy as np
import sys

#音声関係のライブラリ
import pyaudio
import struct


class PlotWindow:
    def __init__(self):
        #マイクインプット設定
        self.CHUNK=1024            #1度に読み取る音声のデータ幅
        self.RATE=16000             #サンプリング周波数
        self.update_seconds=50      #更新時間[ms]
        self.audio=pyaudio.PyAudio()
        self.stream=self.audio.open(format=pyaudio.paInt16,
                                    channels=1,
                                    rate=self.RATE,
                                    input=True,
                                    frames_per_buffer=self.CHUNK)

        #音声データの格納場所(プロットデータ)
        self.data=np.zeros(self.CHUNK)
        self.axis=np.fft.fftfreq(len(self.data), d=1.0/self.RATE)

        #プロット初期設定
        self.win=pg.GraphicsWindow()
        self.win.setWindowTitle("SpectrumAnalyzer")
        self.plt=self.win.addPlot() #プロットのビジュアル関係
        self.plt.setYRange(0,100)    #y軸の制限

        #アップデート時間設定
        self.timer=QtCore.QTimer()
        self.timer.timeout.connect(self.update)
        self.timer.start(self.update_seconds)    #10msごとにupdateを呼び出し

    def update(self):
        self.data=np.append(self.data,self.AudioInput())
        if len(self.data)/1024 > 10:
            self.data=self.data[1024:]
        self.fft_data=self.FFT_AMP(self.data)
        self.axis=np.fft.fftfreq(len(self.data), d=1.0/self.RATE)
        self.plt.plot(x=self.axis, y=self.fft_data, clear=True, pen="y")  #symbol="o", symbolPen="y", symbolBrush="b")

    def AudioInput(self):
        ret=self.stream.read(self.CHUNK)    #音声の読み取り(バイナリ) CHUNKが大きいとここで時間かかる
        #バイナリ → 数値(int16)に変換
        #32768.0=2^16で割ってるのは正規化(絶対値を1以下にすること)
        ret=np.frombuffer(ret, dtype="int16")/32768.0
        return ret

    def FFT_AMP(self, data):
        data=np.hamming(len(data))*data
        data=np.fft.fft(data)
        data=np.abs(data)
        return data

if __name__=="__main__":
    plotwin=PlotWindow()
    if (sys.flags.interactive!=1) or not hasattr(QtCore, 'PYQT_VERSION'):
        QtGui.QApplication.instance().exec_()

[SpectrumAnalyzerで注意すべき点]

今回、スペクトルアナライザーを載せましたが注意すべき点が少々あります。
pyqtgraphやnumpyのFFTは非常に高速なのですが、いかんせんPyAudioが非常に遅いのです。
ですのでプロット点数を増やす→CHUKを増やす と安易にするととてつもなくプロッティングが遅くなります。
ですので上記のスペクトルアナライザーでは少し工夫をしてあります。
AudioInputメソッドのself.stream.read(PyAudioの部分)するところでのCHUNKは1024点ですが、updateメソッドの中で音声データを貯めてからFFTをしてあげています。
これによりpyqtgraphとnumpyの恩恵を受けれるようになります。

[pyqtgraphのデザイン関係について]

 def update(self):
        self.data=np.append(self.data,self.AudioInput())
        if len(self.data)/1024 > 10:
            self.data=self.data[1024:]
        self.fft_data=self.FFT_AMP(self.data)
        self.axis=np.fft.fftfreq(len(self.data), d=1.0/self.RATE)
        self.plt.plot(x=self.axis, y=self.fft_data, clear=True, pen="y")  #symbol="o", symbolPen="y", symbolBrush="b")

ここの部分のself.plt.plotです。
コメントアウトしてありますが、symbol, symbolPen, symbolBrushというものがあります。

penは線の色、
symbolはプロット点の形(oで丸, tで三角など),
symbolPenはプロット点の形の周の色,
symbolBrushはプロット点の中の色です。

それぞれ順に pen=黄色, symbol=丸, symbolPen=黄色, symbolBrush=青
としておきました。色関係はRGB指定も出来るそうです。
これらを有効にしてあげたものを貼っておきます。

[無効(pen="y"のみ)]
f:id:takeshiD:20151127044353p:plain

[有効(pen="y", symbol="o", symbolPen="y", symbolBrush="b" )]
f:id:takeshiD:20151127044435p:plain

pyqtgraph+PyAudioによるリアルタイムで音声プロット

通常pythonでのプロットと言ったらmatplotlibですがプロッティングがとても遅い欠点があります。その分使いやすくてキレイなんですけどね。
リアルタイムでプロットしようとしたらメモリは喰うし遅いしで最悪(工夫次第ではそうでもないらしいですがその工夫がめんどくさい)ですので、高速なプロッティングが出来るとされるpyqtgraphを使ってリアルタイムで音声をプロッティングしました。

pyqtgraphは
PyQt(Qtだけかも?)
・numpy
に依存してますのでそれだけ入れてしまえばオッケーです。

また今回は音声のプロットですので音声関係のライブラリを入れておく必要があります。
今回用いたのはPyAudioです。

# -*- coding:utf-8 -*-

#プロット関係のライブラリ
import pyqtgraph as pg
from pyqtgraph.Qt import QtCore, QtGui
import numpy as np
import sys

#音声関係のライブラリ
import pyaudio
import struct


class PlotWindow:
    def __init__(self):
        #プロット初期設定
        self.win=pg.GraphicsWindow()
        self.win.setWindowTitle(u"リアルタイムプロット")
        self.plt=self.win.addPlot() #プロットのビジュアル関係
        self.plt.setYRange(-1,1)    #y軸の上限、下限の設定
        self.curve=self.plt.plot()  #プロットデータを入れる場所

        #マイクインプット設定
        self.CHUNK=1024             #1度に読み取る音声のデータ幅
        self.RATE=44100             #サンプリング周波数
        self.audio=pyaudio.PyAudio()
        self.stream=self.audio.open(format=pyaudio.paInt16,
                                    channels=1,
                                    rate=self.RATE,
                                    input=True,
                                    frames_per_buffer=self.CHUNK)

        #アップデート時間設定
        self.timer=QtCore.QTimer()
        self.timer.timeout.connect(self.update)
        self.timer.start(10)    #10msごとにupdateを呼び出し

        #音声データの格納場所(プロットデータ)
        self.data=np.zeros(self.CHUNK)

    def update(self):
        self.data=self.AudioInput()
        self.curve.setData(self.data)   #プロットデータを格納

    def AudioInput(self):
        ret=self.stream.read(self.CHUNK)    #音声の読み取り(バイナリ)
        #バイナリ → 数値(int16)に変換
        #32768.0=2^16で割ってるのは正規化(絶対値を1以下にすること)
        ret=np.frombuffer(ret, dtype="int16")/32768.0
        return ret

if __name__=="__main__":
    plotwin=PlotWindow()
    if (sys.flags.interactive!=1) or not hasattr(QtCore, 'PYQT_VERSION'):
        QtGui.QApplication.instance().exec_()

これを実行すると以下の様な画像になります。
(ごめんなさい、本当は動画を上げたかったのですが動画の上げ方がわからずこのような形になってしまいました。上げ方が分かったら追記で動画を載せます。)

f:id:takeshiD:20151126145102p:plain


データの入出力あたりはPlotWindowクラスのupdateメソッドとAudioInputメソッドでコントロールしてますので
このあたりをテキトーにいじくってあげたり、FFTしてあげたりすればスペクトルアナライザーにもなります。
self.timer.start(10)を50にしてあげたりすればプロットスピードが落ちたりします。

pyqtgraphのリファレンスがちょっと充実度にかけるのでご参考になれば幸いです。

また、PyAudioを利用されたことのある方にお叱りを受けるかもしれませんが、今回streamなどを明示的に終了させてません。
ちゃんと動いて止まっておかしいことはなかったので大丈夫っちゃ大丈夫かな程度のテキトーなコードです。
ちゃんと明示的に止めるのであれば、PlotWindowクラスのpg.GraphicsWIndowがQtからの継承ですので、ウィンドウを閉じる時におそらくcloseEventを発するはずですので、オーバーライドしてstreamを止めればいいのでは。
ですので上記のコードはかなりテキトーです。



[次の記事]
pyqtgraph+PyAudioによるリアルタイムで音声プロット その2 - たけし備忘録

PyQt4メモ1

最近PyQt4を使い始めたのでテキトーにメモしていきます。


[参考にしているサイト]
PyQt's Modules
PyQt Class Reference

[環境]
OS: Windows7
IDE: Pyscripter
Python: Python2.7
PyQt: PyQt4

Pyscripterのモジュールのメソッドの補完については

(手順1)
Pyscripterの起動 -> ツールタブ -> Edit Start Scripts

とすると pyscripter_init.py と python_init.py が開かれるので
python_init.pyの方に

import sys
import PyQt4.QtGui as QtGui
import PyQt4.QtCore as QtCore

を追加してファイルを上書き保存。

(手順2)
Pyscripterの起動 -> ツールタブ -> オプション -> IDEオプション

とするとIDEオプションのウィンドウが開かれるので
Code Completionの表の中の Special packagesにPyQt4を追加する

Special packages os, wx, PyQt4

となっていればOK



numpy, scipy, matplotlibなどを使いたいって時も同じ手順で行います。
これは何をやっているのというと、
Pyscripter上にあるPythonインタプリタに、初期設定でpython_init.pyでimportしまっせということらしい。
そしてコード補完はPyscripter上のインタプリタで定義された変数やクラスにしか作用しないということらしいです。
なのでpython_init.pyを起動時に読み込んであげて、変数・クラスを定義しますよ ということらしいです。
外部モジュールをpython_init.pyで読み込むには,手順2で設定してあげましょうね、ということらしいです。
合ってるかはワカリマセン。


では以下よりPyQtの話題
まずは基本の雛形

[mamo1_1.py]

import sys
import PyQt4.QtGui as QtGui
import PyQt4.QtCore as QtCore

#基本のウィンドウの作成 これの上にボタンとかを載せていく
class MainWidget(QtGui.QWidget):
    def __init__(self):
        QtGui.QWidget.__init__(self, parent=None)
        self.initUI()

    def initUI(self):
        self.show()
   
def main():
    app = QtGui.QApplication(sys.argv)
    main_widget = MainWidget()
    sys.exit(app.exec_())  #app.exec_()でメインループの開始

if __name__=="__main__":
    main()

これでとりあえず画面は表示される。
何も設定しない状態でデスクトップのどこに表示されるのかなどを比較したかったのでデスクトップごと映しました。

f:id:takeshiD:20151114160732p:plain

何もしなくても中心あたりに表示された。
GUIを作るんだったら静的にではなく動的にいろいろいじくりたいのでまず、ウィンドウの状態や状態の変更の仕方を知りたいです。
そしてウィンドウの状態の定義の仕方はどんなウィジェットでも一貫性のあるもののはずです。きっと。応用が効きまくるはずです。
サイズだとか位置だとかが必ずクラスで定義されているはずだし、英語だとpositionだからそれっぽい名前だろうということで、上記の参考サイトで調べるとありました。
(GoogleChromeでのキーワードの検索はWebページ上で Ctrl+F で行えます。画像のようになります)

f:id:takeshiD:20151114164947p:plain

QWidgetの位置はQPointというクラスで定義されているようです。
さらにQPointクラスについて調べてみると
QPoint Class Reference
英語読めないよ、という方はWebブラウザの翻訳機能を使いましょう。少ししょぼい翻訳ですが英語だけで読み切るよりはマシなはずです。

Methodsの項目だけみてればとりあえずOK。それっぽいのがありました

QPoint.setX(self, int xpos)
QPoint.setY(self, int ypos)
QPoint.x(self)
QPoint.y(self)

setX,setYはウィジェットの位置を決めるメソッド
x,yはウィジェットの位置を返すメソッド
だと分かります。

QWidgetのサイズはQSizeというクラスで定義されているようです。
QSize Class Reference

QSize.setHeight(self, int h)
QSize.setWidth(self, int w)
QSize.height(self)
QSize.width(self)


確かめてみましょう。上記のmemo1_1.pyにprintを追加しただけです。

[memo1_2.py]

import sys
import PyQt4.QtGui as QtGui
import PyQt4.QtCore as QtCore

class MainWidget(QtGui.QWidget):
    def __init__(self):
        QtGui.QWidget.__init__(self, parent=None)
        self.initUI()

        print "x:",self.x()
        print "y;",self.y()
        print "widht:", self.width()
        print "height:", self.height()

    def initUI(self):
        self.show()
def main():
    app=QtGui.QApplication(sys.argv)
    main_class=MainWidget()
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()

f:id:takeshiD:20151114172200p:plain


これでなんとかウィンドウの状態が取得できました。めでたしめでたし。
今回はデスクトップ上での位置だったけど、ウィジェットウィジェットを入れ子にするのが普通なのでその場合は位置はどうなるのか気になるところです。
多分ウィジェット上での位置になるんだろうけど。

vimのクリップボードとレジスタのコピーアンドペースト

vimクリップボード共有でハマったのでメモ

[環境]
OS : LMDE2
端末: MATETerminal
vim: vim7.4

vimで書いたプログラムをコピーして記事に貼り付けたかったが、なぜかうまくいかなかった
ググってもMacでの記事ばかりでvim初心者には困る

とりあえず.vimrcに
set clipboard=unnamed
と書くといいらしいとかいろんなHPで言ってますがこれはどういう意味なんでしょう
ということでvim上で
:help clipboard
でいろいろ見てみました。
その結果

set clipboard=unnamed
は yankした文字をvim上の*レジスタ(無名レジスタ)に保存するようにする設定

set clipboard=unnamedplus
は yankした文字をvim上の+レジスタ(OSのクリップボード)に保存するようにする設定

ということが分かりました
これで解決だぁ

ということで.vimrcに
set clipboard=unnamed, unnamedplus
を加えました

ちなみにマウスでvim以外のソフトからコピーした文字はvim上の*レジスタと+レジスタに保存されていました なんとなく仕組みが見えた気がする

大変わかりにくい記事ですがこれで OSとvimクリップボードが共有できます