再度 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ライブラリがきちんと読み込まれたことが確認できたのです 長い道のりでした

本日は UPS友の会

本日土曜日は 8:00AMに自宅を出発し、電車で麹町まででかけています これは USP友の会が開催している シェル芸勉強会に出席するためです

何時もはとても難しくついていけそうもないのですが、今日は特別に初心者向けに開催して下さっているのです とは言っても参加者の年齢は皆せいぜい 30歳、僕だけ超年寄りですので浮いていますがそれでも頑張って参加しています

皆さんパソコンを持込み、プログラム書いて勉強しています 頑張るぞ

HDへのバックアップ-続き2

さて大分目標に近づいてきました 次はいよいよ command.shの中身を書くことです そもそもなんで .shという拡張子をつけたのでしょうか? それは .shという拡張子は、そのファイルが shell scriptであるということが予約されているからなのです つまり シェルがこのファイルをスクリプトと認識できるのです さてその中身ですが、

#!/bin/sh
rsync -av Documents/backup-source1/ /Volumes/TOSHIBA1TB/backup-source1/
rsync -av Documents/backup-source2/ /Volumes/TOSHIBA1TB/backup-source2/
echo "Backup procedures were finished!"

などとするのです 今簡単に、中身をこのようにすると書きましたが、実はこれも Unix初心者には困難な作業です これには vimなどのエディタを使用せねばならないのですが、このエディタというのが初心者には敷居が高いのです まあ今回はそこについては解説しませんね

ちなみに、rsyncのパラメーターである -avといのはおまじないのようなものですが、要するにバックアップの途中経過を表示する、という意味です

また、ここで非常に重要なのは、

rsync -av Documents/backup-source1/

の部分の

backup-source1/

のところの最後に

/

というスラッシュがついていることです これが無いと、rsyncはこのバックアップ元がフォルダであることを認識しなくなります 非常に重要です さて、ここまでして command.sh という実行ファイルを作成しましたが、これを実行するためには 今自分が /Users/username/というディレクトリにいるとすれば、

$ /Volumes/TOSHIBA1TB/command.sh

このように打てば良いだけです 後は、バックアップを実行してくれます これで便利な日常の回復です

HDへのバックアップ-続き

さて、シェル・スクリプトを用いてバックアップを自動化するためにはどうすれば良いか?

方針としては、その該当するシェル・スクリプト、これを仮に command.shと名付けることにしましたが、このスクリプトの置き場所は、その該当する HDに置くことにしました

まずは HDに内容の無い command.shというファイルを作成します その前に、OSXから見て、該当の HDがどのような名前で認識されているか知らねばなりませんが、これには

$ df -k

と打ちます

そうすると僕の場合

Filesystem                        1K-blocks      Used Available Use% Mounted on
/dev/disk1                        975912960 719561052 256095908  74% /
localhost:/YGd**************4DJF2 975912960 975912960         0 100% /Volumes/MobileBackups
/dev/disk3                        976076800 947381836  28694964  98% /Volumes/TOSHIBA1TB

というものが戻ってきました 既に 1TBの内の 74%を使用していると書いてありますね この /dev/disk1 というのが僕の 1TB SSDということになります

そして、最後の /dev/disk3というのが MacBook Proに USB接続した portable HDであり、その名前は /Volumes/TOSHIBA1TB であることが狩りました おっと、こちらも 1TBの内の既に 98%を消費している、ということが分かりますね さて、この HDに command.shというファイルを作成するには

$ touch /Volumes/TOSHIBA1TB/command.sh

とすれば良いのです つまり、意味する所は、/Volumes/TOSHIBA1TB/command.sh というファイルを作成する、ということなのですが、実はこのままでは permission errorというエラーが出て叱られてしまいます

$ sudo touch /Volumes/TOSHIBA1TB/command.sh

このように頭に sudoというコマンドを付け、最高権限でコマンド touchを実行せねばなりません 当然この時には passwordを聞かれます

ここからが Unixである OSXはややこしいのです このままでは command.shを実行することはできません、それは僕が root権限でこのファイルを作成したからでなのです 実際にそうであることは以下のコマンドで分かります

$ ls -l /Volumes/TOSHIBA1TB

これに対して OS側が次のようなものを戻します

-rw-r--r--    1 root        wheel      0  6 17 18:28 command.sh

これが意味するところは、このファイルは rootのものであり、僕のものではない、ということです ですからまずはこのファイルの所有権を僕のもの、ここでは username  というユーザーということにしておますね、その僕のものにせねばなりません このためには所有者変更コマンドを発行します

$ sudo chown username /Volumes/TOSHIBA1TB/command.sh

これで再び

$ ls -l /Volumes/TOSHIBA1TB

とするとあらあら不思議

-rw-r--r--    1 username        wheel      0  6 17 18:28 command.sh

となり、このファイルの所有者が見事に username  に変更されました

Portable HDへのバックアップ

1TBの SSDを搭載しているMacBook Proを持ち歩いているので、その中にあるデータは僕にとって過去の自分の歴史25年間ぐらいが詰まったとても貴重なものです
パソコンは機械ですので何時障害が起こるかも知れません そんな時にはSSDの中の貴重なデータも消失してしまいます 実際過去にそのようなことが何回か僕の身にも降りかかりました 一番良く覚えているのは、15年ぐらい昔のことです その当時、Sonyの VAIOを持ち歩いていたのですが、タイのバンコクで突然変な音がすると共に VAIOが立ち上がらなくなったのです
記憶ではあの時は Spencer King III先生とご一緒していました 僕は正直真っ青になったのです 当時は未だ Portable HDと真に呼べるような小型のHDはとても高価であり、持ち歩いていなかったのです
ただ幸いなことに、その当時から OS boot領域は HDへのアクセスが頻回なので破壊される危険性が他の領域よりも高いことを知っていまし そして、新しいパソコンを入手すれば、まずは必ず HDの partitionを切り、Drive C:に対して OSを Clean Installしていました そして、Programは C:¥Programに、データは全て D:に入れていました
このバンコクで起こったことは、多分当地の湿気も絡んでいたのでしょうが、C: driveがクラッシュしたのです
仕事を早々に切り上げ、成田に戻り、知人の会社にそのパソコンを運び込み、HDを VAIOより取り出し、そのHDを直接他のマシンに接続し、D: drive dataを安全な他の HDに完全にバックアップしました
これでその時までの僕の人生のかなりがリカバーされました
この事件以来、僕は必ず portable HDにデータはバックアップすることにしました

さて、MacBook Proですが もともとHDは存在せず、SSDしかありません そんな訳で HDシステムよりは安全ですが、それでも何時障害が起こるかも知れません これに備えて常に複数の Portabld HD (1TB – 2TB)にバックアップしていますが、もともと OSXには TimeMachineという簡単で優秀なバックアップ・ツールが存在します これを用いれば簡単なのであり、実際にそのようにしています
しかし、時に個々のファイルや個々のフォルダをBack Upする必要もあります
これには

$ rsync

という bash shellのコマンドを使用します 実際先の TimeMachineも内部的にはこのコマンドを用いている、という話です

ところが、いちいちこのコマンドを打つのは結構面倒です そこで、僕はその Portable HD上に、command.shというシェル・スクリプトを書き込み、このスクリプトを走らせれば目標のフォルダをバックアップすることができるようにしたいと思いました

まあ小さな小さな Unix Programmingということになりますね

この続きはまたね