やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

スクリプト言語を乗り換えるべきか

Batchファイルで頑張ってきたが、Pythonに乗り換えるべきかもしれない。

前回まで

以前、自らGitHubのAccessTokenを漏洩した失敗から、自爆防止のためバッチを改善した。

今回

今回はTokenの生成をAPIでやりたい。

と思ったのだが、必要になる処理がBatchファイルの構文ではむずかしい。もうBatchは潮時かもしれない。

Batchではできないこと

カンマ区切り文字列の処理

カンマ区切りの可変配列な文字列から、指定値の存在確認がしたい。for /fでできるかと思ったができない。

やり方次第ではべつに必要ではないのだが…。妥協する上に、for文などわかりづらいコードになってしまう。また、以前、他にもできないことがあった。

正規表現

リポジトリ名の文字確認のため正規表現を使いたかった。しかし、Batch(cmd.exe)標準機能だけでは実現できない。

代わりにVBSを使ったが、最悪のスクリプト言語だと感じた。また、Batchとの連携が不恰好になるため結局使っていない。

Scopeの存在確認がしたい

問題のおさらい

今、GitHubのAccessTokenをTSVファイルに保存して管理している。各Tokenは任意にscopeを設定できる。

実行するAPIに応じて必要なscopeを持つTokenを選択したい。しかし、現状bat(cmd)ファイルではTokenDescription文字列の一致確認でTokenを選別している。

現状

User Description Token
username1 RepoControl 01234...
username1 GistControl 11234...
username2 UserControl 21234...
username3 RepoCreateOnly 31234...

理想

User Scopes Token
username1 repo,delete_repo 01234...
username1 gist 11234...
username2 user 21234...
username3 repo 31234...

原因

理想にできない理由は簡単。複数のscopeをカンマ区切りで保存するのだが、指定したscopeの存在を確認する処理がBatchで書けない。構文的に不可能。がんばれば可能かもしれないが無駄&わかりづらい。

Batchの限界

たとえばrepo,delete_repo,...などのカンマ区切りの可変配列データ中、repoが存在するか確認したい。しかし、Batchではできなかった。for /f構文なら可能と思ったが、テーブルデータとして列数も内容も固定したデータであるときだけ使えるものだった。

これ以上Batchで無理やりどうにかするのは無駄と考える。

スクリプト言語のりかえ

この際、Batchをやめてしまおうか。他のスクリプト言語としては以下の選択肢がありそう。

言語 概要
Batch 正規表現不可、可変配列不可、そろそろ限界か。
Shell Batchよりはマシな構文。でもダブルクリックで実行できない。
VBScript 見づらい構文。スクリプトのくせにスラスラかけない。最悪。
JScript VBScriptよりはマシ。でも文字コード問題がある。
PowerShell サポート終了問題。.NET Framework依存→OS依存→サポート終了→プロプライエタリC#も同様。
C# HttpWebRequestでGitHubAPIが叩けなかった。SSL/TSLの問題と思われる。
Ruby WindowsXPでGitHubAPIが叩けなかった。SSL/TSLの問題と思われる。
Python WindowsXPでGitHubAPIが叩けた。文字セットもUTF-8。採用!

文字コード問題、サポート終了問題は、SSL/TSL問題は、ともにWindows固有→Microsoft固有→プロプライエタリ起因の問題。Linuxへの移行が理想だが、今はMinGW/msysでごまかしている。

言語 拡張子 呼出 環境 文字セット HTTP通信
Batch bat cmd.exe Windows CP932 curl.exe
Shell sh msys.bat, sh.exe MinGW/msys UTF-8 curl.exe
VBScript vbs WScript.exe, CScript.exe, .wsf Windows CP932 curl.exe
JScript js WScript.exe, CScript.exe, .wsf Windows CP932 curl.exe
C# cs csc.exe .NET Framework4.0 UTF-8 System.Net.HttpWebRequest
Ruby rb ruby.exe Ruby1.9.3 UTF-8 net/http, net/https
Python py python.exe Python2.7.10 UTF-8 urllib2

Pythonを使う

結論としては、Pythonを採用する。PythonはWebAPIクライアントとしても価値がありそう。対してcurl,libcurlは動作するWindowsXPバイナリがなかったり、周辺のdllの用意などがとても大変で実現できなかった。 今後、作業の自動化はPythonで進めるのがよさそうか。 でも、まったく触ったことがないから当面は学習が必要。Batchと併用するかも?

Python 2.7.10 を使う

GitHubとのSSL/TSL通信ができそうなバージョンは2.7.10以降っぽい。

めでたく通信できた。文字セットもUTF-8が使えるのでWebAPIとの相性もよい。Python採用!

C# .NET Framework 4.0 は使えない

HttpWebRequestでGitHubAPIが叩けなかった。SSL/TSLの問題と思われる。

GoogleなどのサイトからHTTPのGET通信ができたことは確認した。 しかし、GitHubとの通信ができない。おそらくSSL/TSLのバージョンが古いためと思われる。

どうやら.NET Framework 4.5以降なら解決するらしい。しかし、Windows XPは4.5にアップグレードできない。XPはすでにサポート対象外なのでやむなし。Vista以降なら、SSL/TSLを新バージョンに対応するパッチがあるらしい。しかし、やはりXPは蚊帳の外。

プロプライエタリの宿命か

Microsoft社製品では解決できない。 XPというサポート外のOSを使っている限り。OSを変えたところで、それも将来サポート外になる。でも通信暗号技術は刷新されつづけるに違いない。結果、いずれまた使えなくなる日がくる。パッチがでても古いOSは対象外。救いはない。プロプライエタリなOSを使い続ける限り。Linuxへ移行したい。

Ruby 1.9.3 は使えない

Windows XP で使える最新版が1.9.3っぽい。

RubyoctokitというGitHubAPIクライアントがある。有名っぽいので使ってみたかったのだが、エラーが出て使えなかった。

HTTP通信からやってみようと思い、net/http, net/httpsライブラリを用いたが、同様のエラー。どうもSSL/TSLの通信がうまくいかないらしい。GoogleとのHTTP通信には成功したが、GitHubとの通信はできなかった。

おそらく最新版のRubyでは解決するのだろう。またしてもWindowsXPの呪縛。役に立たないのでRubyはあきらめた。

所感

Windowsのせいでできないことや面倒なことが多い。前々からずっと不満だった。VC++MinGW/msys、Batch→Python、のように、もう少し環境を改善したくなってきた。いずれLinuxデビューしたい。

一旦GitHubAPIによる自動化を止めて、環境改善について考えてみようか。GTKmmのことは忘れていない。