OSX上で、Sublime Text 3、Atomそして VIM/GVIM/MacVIM上で Python3を一発で走らせる

全然プログラムも書かないくせに、Pythonの環境構築ばかりに凝っています それであっという間に時間が流れて行くのです それはそれは楽しい作業であり、なかなかうまくいかないことがまた楽しいのです とは言うものの、ついに昨夜目標を達成しました
それは、僕の環境(つまりは色々な Pythonをインストールしてあるだけでなく、OSXには初めから Python2.7がインストールされているので、そのような混在した環境、という意味です、つまり僕の MacBook Proでは成り立っても、他の方々のMacでは成り立たない可能性も高いのです)で、Sublime Text3、Atom、VIM、GVIMにおいてプログラムを書いたものが、それぞれ Cmd-b、Ctrl-i、そしてCtrl-e、Ctrl-eというショートカットで Python 3.5.1 Interpreterがその今書いたブログラムを走らせることができるようになったのです
これは素晴らしいことであり、効率が良いのはもとより、何より画面を傍で見ていれば、とてもかっこ良く、いかにもハッカーが何か恐ろしいことをやっているように見えるのです そうに決まっています 何よりも画面が綺麗であり、神秘的で高速に変化していくのです
そして、同様の環境は既に SurfacePro4の Windows10でも Sublime Text 3、Vimで実現したのです
一番大変だったのは、OSX Sublime Text 3です この「恋に落ちるエディタ」と称されている素晴らしい Editorですが、その上で Python 3.5を走らせるのは大変でした

まずは自分が走らせたい現在走らせている Python interpreterが何処にあるか調べねばなりません

$which python

これにより

/Users/*****/anaconda/bin/python

が戻ってきましたので、僕の現在の Pythonは /Users/*****/anaconda/bin/pythonにあることが分かります

そこで、これからがめんどくさいのですが Sublime Text 3のメニュー Sublime -> Preference -> 基本設定-ユーザ で設定ファイルを開きます

そこで その設定ファイルを

{
	"build-env":
	{
		"PATH": "/Users/*****/anaconda/bin/python"
	},
	"cmd":
	[
		"/Users/*****/anaconda/bin/python"
	],

のように修正するのです これにより Sublime Text 3では Cmd-Bで Pythonが自動的に走るようになり快適になりました ここまで来るのに相当調べまくりましたよっ

OSXと Windows10の間でクロス・プラットフォーム環境をつくる

現在主体として使用しているマシンは MacBook-Proです この上の native OSである OSX El Capitanで色々としています しかし、数カ月前に SurfacePro-4を手に入れてから、Windows10でも遊んでいます
実はそれ以前には OSX上で Parallels Desktopを動かし、その上で Windows10を動かしていたのですが、やはり重く、MacBook-Proが熱くなることがしばしばだったので辞めました
とは言っても、二つの OSは大分と性格が異なります 今年の夏になれば、Ubuntu-Bashが Windows10 nativeとして走るようになり、そうなればこの垣根は一挙に取り払われるのでしょう それを非常に期待しています
しかし、現在は未だそうは行きません
そこで、二つをつなぐものとして、Pythonを走らせることにしたのです Pythonを走らせる、と言ってもプログラムを描くには Editorが必要です もちろん、Pycharmなどの IDEも存在し、それは Javaで走るためそもそもが Cross Platformなのですが、重いのです 気軽に書く、という訳には行きません
そこで取り組んだのが、Vim (GVim)を両者で走らせることでした 色々な設定ファイルをいじくる必要がありますが、無事両方のOS上で、Ctrl-eを押せば、Python programが走るようになりました
そして次に取り組んだのが Sublime Text3でした これは秀逸の editorですが、これでも Ctrl-bを押せば Python programが走るようになりました
こうなるともうどのマシンを使っているのか分からなくなってしまいます 

数日間の苦労の果てにようやくできました

この処 Pythonと格闘しています 格闘と言っても未だまだ理解が足りないので、試作プログラムを走らせた時に目で見える変化が無いと困るのです それでTkinterを用いて作りました

#!/Users/******/anaconda/bin/python
# -*- coding: utf-8 -*-

from tkinter import *
from tkinter.colorchooser import *
import sys
def colorRed(n): 
    global label1
    label1.configure(bg='#%02x0000' % scale1.get())

def getColor():
    global label1
    color = askcolor()
    label1.configure(bg=color[1])

root = Tk()
label1=Label(root, text="この部分の背景色が変化します", fg='#ffffff')
label1.pack()
scale1 = Scale(root, label='色を指定して下さい', orient='h', from_=0.0, to=255, command=colorRed)
scale1.pack()
Button(root, text="指定する色の選択", command=getColor).pack()
Button(root, text="終了", command=exit).pack()
root.mainloop()

これを走らせると 次のようになります

プログラム走らせた直後
プログラム走らせた直後

スライダーを動かすとラベルの背景色が変化します

スライダーを動かしたところ
スライダーを動かしたところ

今度は色選択ダイアログから直接色を選択します

色選択ダイアログからの色指定
色選択ダイアログからの色指定

色選択ダイアログで指定した背景色に変化しました

背景色が変化しました
背景色が変化しました

さて、プログラムの最初にある二行はそれなりに重要です

#!/Users/******/anaconda/bin/python
# -*- coding: utf-8 -*-

このうちの最初の一行は Python interpreterがこのパソコンの何処にインストールされているかを示しています

そして二行目は、文字コードとして UTF-8を使用するよ と宣言しているのです これをしないと、走らない場合がありますよ

さて、上記の実行結果では、一部文字が欠けていますが、それはもちろんすぐに直せますよ それには一部分を修正すれば良いのです

 

 scale1 = Scale(root, label='色を指定して下さい', orient='h', length=250,  from_=0.0, to=255, command=colorRed)

これでバッチリです

再度 Python環境構築

現在の Pythonには version 3 (主体は v3.5)と version 2 (主体は v2.7)の二系統あります もちろん version 3.5の方が言語体系として合理的であり、かつスピードも早いのですが、これまで創られた膨大なライブラリの多くが 2.7にしか対応していないので、簡単には 2.7一辺倒という訳には行かないのです

そこで、 pyenvという仮想環境を構築するツールが造られ、それを用いれば 3.5系と 2.7系に切り替えることができるように世の中には書いてあります

でも、事はそんなに簡単なものではなく、実際にそれをできる人はいわゆるプロの領域の人々のみなのです しかも、anacondaという Python環境構築ツールを用いれば更に困難なのです

ここ金浦空港ラウンジでの3時間の時間潰しで挑戦しました 参考にしたサイトは数多くありますが、新しいこのサイトが参考になりました 一部記述に誤りがありますが、それは仕方有りません

その結果

$pyenv local anaconda3-2.4.0

で Python 3.5.1が走り

$pyenv local anaconda3-2.4.0/envs/py2

で Python 2.7.1が走るようになりました 目出度しめでたしです

Vimで編集中の Python scriptをそのまま実行する

最強のエディタと称される Vimを練習中です その練習の一環として、Pythonの簡単なスクリプト書いて Pythonの勉強がてら Vim操作法の勉強もしています

この時に、いちいち書いたスクリプトを Vimの中で IDEの如く実行できれば便利なのにと思い色々調べてみましたところ、ありましたね ここです 感謝感激です

つまり .vimrcの中に

autocmd BufNewFile,BufRead *.rb nnoremap <C-e> :!ruby %
autocmd BufNewFile,BufRead *.py nnoremap <C-e> :!python %
autocmd BufNewFile,BufRead *.pl nnoremap <C-e> :!perl %

というおまじないを書き込むのです こうするとC-e (Macの keyboardで Control keyを押しながら、eのキーを押すこと)すると何と Vimのコマンド行に、Pythonの場合には

:!python %

というのが現れますので、それを Enterすれば現在書いているスクリプトが実行されます 何と便利でしょうか

Pythonで OpenCVを取り扱う

このところ数ヶ月間に渡り Pythonを少しずつかじりつつあります 日本では松本氏がゼロから作り上げ、今や世界のWeb Programmingの世界をリードする一つとなっている有名な Rubyという言語が有名ですし、実績もあります

しかし、科学技術の世界では圧倒的に Pythonという言語がトップを占めています その理由としては、科学技術の世界に特化したライブラリが豊富にあるからです

コンピューターで汎用に画像処理をするソフトウェア・フレームワークの代表が Open CV (Computer Vision)というツールなのですが、この本体は Cで書かれているのです しかし、C以外の言語に対するインターフェースが豊富に用意されており、特に Pythonに対する接続は容易である、とされています

しかし、プロでなければそのような接続自体がちんぷんかんぷんなのです これを何とかしようとここ数日のめり込んでいました 資料としてはインターネット上にあるものだけであり、色々な Key wordsで検索し、それらしきページを読み、そして試しているのですが、なかなかうまくいきませんでした

現在僕の OSXには Python処理系が、もともと OSXと一緒にインストールされているもの、Homebrewでインストールしたもの、Pyenv環境でインストールしたもの、そして anacondaを用いてインストールしたもの、そして最後に MacVim同梱のもの、と合計5つも入っているのです それぞれに、Python3.5系と、Python2.7系があるのです

Python単独でももちろんお仕事できますが、PythonのPythonたる所以は 豊富なライブラリの存在です 特に必須のものが、Numpy, Matplot, Tkinterなどですが、その一つとして CV2があります これがOpenCV 2.0/3.0のライブラリなのです

もともと CV libraryは OS Xにはインストールされてませんので、インストールせねばなりません しかし しかし これが難しい 色々試みてもことごとく失敗 いやインストールそのものは誰が行ってもできるのですが、肝腎の Pythonそのものとリンクしないのです 何が何やらさっぱり分かりません

そこで $which pythonで現在用いている pythonがどこに存在するのか調べましたところ、僕の場合には

/Users/******/.pyenv/shims/python

にあるのです そしてインストールに用いたのは anacondaだったのです そこで

$conda install -c https://conda.anaconda.org/menpo opencv3

としたところ、見事にインストールが開始となりました そしてきちんとインストールされたことを確認するためにまず Pythonを立ち上げました

$python

そうすると Pythonが立ち上がり bashの画面は次のようになります

Python 3.5.1 |Anaconda 4.0.0 (x86_64)| (default, Dec  7 2015, 11:24:55)
[GCC 4.2.1 (Apple Inc. build 5577)] on darwin
Type "help", "copyright", "credits" or "license" for more information.

この >>>という Python待受の中で、

>>>import cv2
>>>cv2.__version__

とすると、見事に ’3.1.0’と最新の version番号が戻りました これでとにもかくにも cv2ライブラリがきちんと読み込まれたことが確認できたのです 長い道のりでした

iPython Notebook

またまた iPython Notebookにハマり始めています でも Pythonすら未だ使いこなせていないのでまだまだ道は遠いのですが・・・

それにしても、昔は IPython Notebookと題が書かれていたのが、2015年9月頃からいつの間にか Jupiterとしか書かれていないのです これについても良くわからなかったのですが、昨日 Kindle購入した本によれば、IPythonというPython言語の縛りから解き放たれ、Notebookは独自のプットフォームとして開発が進んでいるとのことでした 現在では、Rubyなど他の言語にも対応しているのだそうです そして Jupiter.orgという団体を作り上げ、そこが中心になって開発しているのだそうです

という訳で TAVIのクラス最初の段階は

class TAVI():
    def __init__ (self, age, sex):
        self.age = age
        self.sex = sex
        
class Sapien(TAVI):
    def __init__ (self, age, sex, size):
        super().__init__(age, sex)
        self.size = size
        print("SAPIEN case, Age = {0}, Sex = {1}, Size = {2}".format(self.age, self.sex, self.size))
        
sapien_case = Sapien(88, 'M', 23)

これを走らせれば 

SAPIEN case, Age = 88, Sex = M, Size = 23

となります

ちなみに Python 3.4では

先のクラスを用いたプログラムは version 2.7用に書かれていましたが、これを version 3.4で走らせる時には簡単になります

class Shape():
    def __init__(self, x, y):
        self.x = x
        self.y = y
    def position(self):
         print("Corer position = x: {0} and y: {1}.".format(self.x, self.y))
 
class Square(Shape):
    def __init__ (self, side = 1, x = 0, y = 0):
        super().__init__ (x, y)
        self.side = side
    def area(self):
        print("Area = {0}.".format(self.side * self.side))
 
class Rectangle(Shape):
    def __init__ (self, short_side = 1, long_side = 1, x = 0, y = 0):
        super().__init__ (x, y)
        self.short_side = short_side
        self.long_side = long_side
    def area (self):
        print("Area = {0}.".format(self.short_side * self.long_side))
 
class Circle(Shape):
    def __init__ (self, r = 1, x = 0, y = 0):
        super().__init__ (x, y)
        self.r = r
    def area (self):
        print("Area = {0}.".format(self.r * self.r * 3.14))


a = Shape(10, 20)
b = Square(5, 10, 20)
b.position()
b.area()
c = Rectangle(5, 6, 10, 20)
c.position()
c.area()
d = Circle(10, 20, 15)
d.position()
d.area()

これで良いのです めんどくさい最初の親の objectクラス継承の宣言は不要ですし、super()のめんどくさい引数も不要です

pyenv 覚書

$pyenv versions

これでインストールされているpythonの version一覧出力 例えば

* system (set by /Users/***/.pyenv/version)
  anaconda-2.1.0
  anaconda3-2.1.0

これで現在は systemに最初からインストールされているpython ここでは Python 2.7.1が選択されていることが分かる

echo eval "$(pyenv init -)" >> ~/.bash_profile
source ~/.bash_profile

というおまじないをterminalから打ち込む必要があります これで

Python 3.xにするには

$pyenv global anaconda3-2.1.0

このようにすれば、Python 3.4.1に切り替わる

$ python --version
Python 3.4.1 :: Anaconda 2.1.0 (x86_64)

Python2.7でのクラス使用

最近 Pythonに傾きつつあります もっぱらプログラムのテストには Pythonシステムに内蔵してある IDLEを用いています そこで、クラスの勉強をしているのですが、Pythonでややこしいのは、 version 2.x系列と version 3.x系列で大分異なる、ということです 3.x系列ではエラーにならないものが、2.7ではことごとくエラーとなります

クラスの定義にしても然りであり、2.7でクラス定義していてはまりました 結局、親クラスは object抽象クラスを継承する必要があり、また子クラスで親クラスを継承するためには、super()の引数として、自分自身のクラス・タイプと、selfを使用せねばならない、ということです ここに到達するのに1時間を要しました

class Shape(object):
    def __init__(self, x, y):
        self.x = x
        self.y = y
    def position(self):
         print("Corer position = x: {0} and y: {1}.".format(self.x, self.y))

class Square(Shape):
    def __init__ (self, side = 1, x = 0, y = 0):
        super(Square, self).__init__ (x, y)
        self.side = side
    def area(self):
        print("Area = {0}.".format(self.side * self.side))

class Rectangle(Shape):
    def __init__ (self, short_side = 1, long_side = 1, x = 0, y = 0):
        super(Rectangle, self).__init__ (x, y)
        self.short_side = short_side
        self.long_side = long_side
    def area (self):
        print("Area = {0}.".format(self.short_side * self.long_side))

class Circle(Shape):
    def __init__ (self, r = 1, x = 0, y = 0):
        super(Circle, self).__init__ (x, y)
        self.r = r
    def area (self):
        print("Area = {0}.".format(self.r * self.r * 3.14))

これは Shapeという親クラスを継承して、Square, Rectangle, Circleという3つのクラスを継承したのです あくまでも Python 2.7です

使用するには例えば

a = Shape(10, 20)
b = Square(5, 10, 20)
b.position()
b.area()
c = Rectangle(5, 6, 10, 20)
c.position()
c.area()
d = Circle(10, 20, 15)
d.position()
d.area()

このようにすれば、回答は

Corer position = x: 10 and y: 20.
Area = 25.
Corer position = x: 10 and y: 20.
Area = 30.
Corer position = x: 20 and y: 15.
Area = 314.0.

となります