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っぽい。
RubyはoctokitというGitHubAPIクライアントがある。有名っぽいので使ってみたかったのだが、エラーが出て使えなかった。
HTTP通信からやってみようと思い、net/http, net/httpsライブラリを用いたが、同様のエラー。どうもSSL/TSLの通信がうまくいかないらしい。GoogleとのHTTP通信には成功したが、GitHubとの通信はできなかった。
おそらく最新版のRubyでは解決するのだろう。またしてもWindowsXPの呪縛。役に立たないのでRubyはあきらめた。
所感
Windowsのせいでできないことや面倒なことが多い。前々からずっと不満だった。VC++→MinGW/msys、Batch→Python、のように、もう少し環境を改善したくなってきた。いずれLinuxデビューしたい。
一旦GitHubAPIによる自動化を止めて、環境改善について考えてみようか。GTKmmのことは忘れていない。