2015年10月5日月曜日

初めてのpython

色々な集まりに使える出欠ツールを作ろうかと思い立ち、どうせ作るなら以前からやってみようと思ってたpythonで作ってみるかと、先週はずっとコーディングしてました。
ブログだの旅行で行ったスポットなんかの整理を投げ捨てて。
でも・・・

ハマッた・・・

1週間やって成果物ゼロという驚きの白さに!!
恐ろしいですわ、python。
いや、python+cgiが、と言うべきか。
 
作ろうと思ったのは、日付、場所、時間、参加人数が羅列されているリストのページと、そこからリンクで行ける入力ページ。
リストのページは、直近の任意の期間の確定曜日を抽出してデータファイル化し、それをリスト表示するというもの。
この辺りは後々のメンテが要らないよう全部自動化。
DBとかはめんどくさいので使わずにcsvのみ。

で、無駄にアイコンとかに凝ってページデザインに2日かかった(笑)
なので、先週水曜からコーディング開始。
環境はwindows版python3.5で動作確認し、本番環境はubuntu。
都度都度構文を調べながら書くという泥臭さながら、金曜には目標の動作をするようにはなりました。
それを本番環境に持っていくと・・・エラー続出。
もうね、洗い出しが大変でしたわ。
調べても、意外と日本語ページが少ないんですよね。
なので初心者がハマり易いこまごました部分ってのも少ない。
その代わり、オフィシャルのリファレンスは凄く解り易いですね。
というわけで、自分の為の忘備録と、同じようにハマってまった初心者の方の参考にちょいと書き出し。
 
まず最初は、BOM(Byte Order Mark)。
python3系は標準がunicodeです。
なので何も宣言しなくてもUTF-8でやってくれるらしいです。
で、エディタはwindows版に付いてたIDLEというのを使ってたんですが、どうも最初にコードの宣言をしないと、BOM付きのUTF-8のファイルとして保存されてしまうようです。
UTF-8のファイルにはBOM付きとBOM無しがあってメモ帳なんかで編集するとBOM付きになります。
このBOMが付いていると、スクリプトの最初の1行目のシェバンという#!から始まるパスが認識されません。
なので実行できないとか、実行できないformatというエラーが出ます。
調べる方法は、

> od -tx1 ファイル名

これで先頭に EF BB BF があれば、それがBOMです。
これの対処法は、BOM無しで保存する事。
エディタにBOM有無のオプションがある場合は簡単ですが、IDELにはそれらしき場所が見当たらなかったので、全文コピーして新規ファイルに貼り付け、そしてコード宣言を足して保存、という方法で回避しました。
シェバンの次の行に足したのは、

# -*- coding:utf-8 -*-

-*-はemacsというエディタの対応部分なので、# coding:utf-8でもいいらしいです。
emacsなんて20年ぐらい使ってないですけど、入れといても損は無いので入れときました(笑)
 
次の問題点は、改行コード。
windowsとmac、unix系で改行コードが違うのは有名な話ですが、これに引っ掛かっていました。
ちゃんとテキストモードでFTPしたんですがねぇ
問題発覚後、何度テストしても改行コードは変わってませんでした。
所詮はおまけのFTPクライアントか・・・
でもphpやplではちゃんと変換してくれてたんやけどなぁ
したつもりでできてないと、ハマり度数が大きくなりますな。
したつもりだけに、気付くのが遅れる。
linuxでの確認方法は、

> od -c ファイル名

これで改行部分が \r\n と見えていると、改行が変換されずに転送されてしまってます。
取り合えず、これでシェバン絡みのエラーは出なくなり、直に実行する分には動くようになりました。
しかし、しかし、cliでは動くのに、cgiとしてブラウザから動かすとエラーを吐くという現象が。
どうもprintとcsv.writerやcsv.readerで文字コードの扱いに違いがある様子。
ASCIIで変換しようとしたけどできんかったわ!という、pythonで有名なハマりエラーが出まくり。
まだまだ精進が必要ですな。
多分、続報アリです・・・
 

0 件のコメント:

コメントを投稿