Python 学習を始めるにあたり - Rubyist の Python 学習記録(1)
PythonLibrary
Python
2018年
12月
28日
背景
これまで MATLAB でプログラムを多く書いてきた.
ただし,素の MATLAB はそのままでは記載が面倒なので,オブジェクト指向記述でライブラリを作成している.
また,ビットストリームの解析などはデータ構造がかなり複雑になるので,Ruby で実装を記述している.
さらに,高速化が必要であったり,既存のプログラムにパッチを当てるなどの処理で C 言語での記述も多い.
これらのプログラムでは常にテストファーストプログラミングを心がけている.
その際,効率化のためにテストの自動化や,CI(Continuous Integration)ツールである Jenkins などでテストを管理している.
MATLAB についても CI や自動テストは実現可能なのだが,MATLAB の起動時間がネックになり,頻繁なテストはやりにくい.
色々な方々から,学生に MATLAB 使わせるくらいなら,Python でいいのではと言われたので,私自身も勉強することにした.
これまで作成してきた画像処理ライブラリ
参考までにこれまで開発してきた画像処理ライブラリの特徴を示す.
今回の開発ではこれらのライブラリが持っていた特徴を活かすような形で設計したい.
- C言語で開発した初期のライブラリ
-
学部・大学院時代に作成したもの.
メモリ空間が 4MB 程度しかない中で,256KBのモノクロ画像(512×512×8bit)や 768KB(512×512×8bit×3プレーン)のカラー画像を取り扱っていた.
このため,既存の画像データの行や列,部分行列を窓のようにアクセスできる仕組みを作っていた.
次のデータや次の列との距離を構造体内に別に保管することにより,同じメモリ空間内をスキャンできる仕組みである.
windowRowVector や windowColVector, windowMatrix という関数により,オリジナル画像の窓ベクトル,窓行列が作成できた.
- Objective-C で開発した初めてのオブジェクト指向ライブラリ
-
Objective-C のクラスで実装したもの.画像クラスの下にモノクロ画像,カラー画像を継承して同様のインターフェースを提供していた.
C の時代にあった窓の仕組みを取り込み,ループ部分をイテレータで実装した.
さらに,画素や列ごとのイテレータに加え,ブロックごとのイテレータも用意した.
- オブジェクト指向っぽい C 言語ライブラリ
-
Objective-C だと使える人が限られるので,Objective-C の処理を C で書き直したもの.
C だと継承はできないので,Ruby on Rails にあるような STI (Single Talbe inheritance: 単一テーブル継承)に近いものを作っていた.
Matrix という構造体の中で,モノクロ,カラーの両方を表現できるようにして,bytesPerPixel にしたがって処理を変えるようにしていた.
- オブジェクト指向 MATLAB で実装したもの
-
現在,メインで利用中のもの.MATLAB の制限である 1 から始まる添字を気にしなくていいように,内部でオフセットをずらす処理をしている.
また,handle クラスにしているので,常に新しいオブジェクトを作成するのではなく,addSelf 的なメソッドなども利用できるようにしている.
窓の仕組みは MATLAB では実装できないため,この部分はブロックコピーと書き戻しで対処している(ここが悲しい).
ピクセル単位のイテレータはメソッドレベルで実装した.ピクセル単位であれば,画像の場所を意識しないプログラムが実装可能となっている.
昨今の HDR の流れを受けて,8ビットを超える整数値や実数値のピクセルにも対応している.
カラー画像クラスはモノクロ画像クラスのオブジェクトをセル配列で内包する形になっており,カラー画像のメソッドのほとんどはモノクロ画像メソッドの呼び出しのみで実装可能となっている.
新らしい言語を学ぶということ
世の中には非常に多数のプログラミング言語がある.
ちょうどこんな記事が出ていた.→
自然言語学からみたプログラミング言語 Vol.1 -世界に現存する数とその需要-
これだけ多くの言語があるのは,それぞれの言語に得意な部分,不得意な部分が存在するからである.
私自身もこれまでに様々な言語を学習してきたし,現在でも用途に応じて使い分けて使っている.
これまでの利用履歴は以下のような感じである.
- 現在現役で利用中
-
- Ruby
- 利用例: 校務支援システムを Ruby on Rails で運用中.その他多くのデータベースシステムを実装.ビットストリーム解析機など複雑なデータ構造を持つプロトタイプ作成
- メリット: クラスの作成が容易.全てがオブジェクト.() の省略記法により DSL を作りやすい.RSpec でテストが書きやすい
- デメリット: インタプリタであるため遅い
- C
- 利用例: 既存の符号化プログラムへのパッチ実装.簡易なデータ変更,フィルタ作成など
- メリット: 高速なプログラム.共用体を用いたデータ表現変換
- デメリット: メモリ管理は自己責任.オブジェクト指向言語でないので,関数の入出力は全て自分で管理
- Swift
- 利用例: iOS, macOS のアプリ作成.
- メリット: Optional の導入による nil アクセスの回避.タプルの導入.クラスだけでなく構造体や enum にもメソッドを記述可能
- デメリット: 開発は macOS のみ.頻繁なメジャーアップデートにより,ネット上の古い情報は信用できない
- MATLAB
- 利用例: 現在の研究のメイン環境
- メリット: 行列,ベクトルを一括で計算可能.大量のツールボックスによる資産.拡張でオブジェクト指向的な記述も可能
- デメリット: 添え字が1から始まる.インタプリタであるので,自前でループを書くと遅くなる.
- sed
- 利用例: テキストデータの簡易書き換え
- メリット: コマンドラインで簡単に記述可能
- デメリット: 正規表現が他のものと若干異なる
- awk
- 利用例: 列志向テキストデータの簡易集計
- メリット: コマンドラインで簡単に記述可能
- デメリット: 入力データが綺麗に揃っていることが条件
- 過去に使っていたが使わなくなったもの
-
- Perl: 最初の教務室データベースに利用.当時はまだオブジェクト指向ではなかった.WebObjects に移行してから使わなくなった.
- Java: 次の教務室データベースの運用環境だった WebObjects の記述のために使用.ネットワークの授業などで学生に記述させることはあるが,自分で書くことはほとんどない
- Objective-C: Mac OS X (現在の macOS) のソフトウェアを記述するために利用.Objective-C 2.0 になってかなり記述が簡単になったが,新しく Swift が使えるようになったため,使用しなくなった.
- 読めるが書かないもの
-
- C++: 既存の符号化プログラムが C++ で書かれていることが多いので,読めるようになっている.ただし,多重継承などあまり趣味に合わず自分で描こうとは思わない.
- 今後勉強したいもの
-
- Javascript: フロントエンド開発のために,記述できるようになりたいが,今のところ作成したいアプリがない
- vimscript: vim の環境をもっと整備したいが,なかなか時間がない
- 少し使ったことがあるもの
-
- Prolog: Z-80 の S-OS Sword 上で体験した程度
- Lisp: Prolog と同様に Sword で体験.Emacs lisp は全く勉強しなかった.
- Forth: こちらも同様に Sword で体験.高校時代にこれで逆ポーランド記法を覚えた.Open Firmware で久々に見かけて感動した.
上記のような言語体験を踏まえて,Python の学習の前に色々と調査を実施した.調査した結果をあとでまとめておく.
長くなったので今日はここまで