Make it possible with Python.

最近Pythonから離れ気味、その他物作りに寄り気味です。

BaaSサービスのParse.com の使い方と、危険性について

photo by Abllo™

BaaSとParse.comの利点について

Webサービスを作る場合、BaaSサービスを使わないと初心者では敷居が高すぎると聞いたので、BaaSについて調べてみた。 BaaSというのは、バックエンド処理を提供してくれるサービスで、例えば有名なParse.comというサービスだと、以下のことができるらしい。

Parse.com で出来ること レコードの参照・登録・更新 ユーザ管理(スケルトンが用意されていて、Facebook・Twitter 連携も) 奥の手として、各APIにJavaScriptでサーバサイド処理を書ける(Cloud code) プッシュ通知 Parse.com を Backbone.js のバックエンドとして使ってみる - akiyoko blog

Parse.comを実際に使ってみた

便利そうなので実際に使ってみた。このサイトのチュートリアルが非常にわかりやすかった。

Parse.com を Backbone.js のバックエンドとして使ってみる - akiyoko blog

昨日できたてのVirtualBox環境で、実際に公式チュートリアルのTodoリストを動作させてみた。

BaaSがどうというより、初めてテキスト以外の動的サービスがVirtualBox上で動いてちょっと嬉しかった。

1点だけ詰まったのは、httpサーバーのURLについて。 SSHでcdを使ってディレクトリを移動すると、"python -m CGIHTTPServer" でhttpサーバーを動かす(?)際に、現在のディレクトリが最上位URLになるんですね。

Parse.comにはセキュリティリスクがある

その一方で、こんな指摘を見つけた。

超簡単にできるぐらいなので、そのままだとかなり危険。データベースをネットにさらしているようなもの。MySQLとかPostgreSQLとかOracleの入口をID、パスワードを公開してネットにさらしてる感じと、まずは理解する。 例) 保存されたユーザーのメールアドレスを誰でも閲覧可能 データの一覧は取り放題 誰でもデータも消せちゃう クライアント側からSQLで言うところの、SELECT, UPDATE, INSERT, DELETE 呼べてるんだから、当然。

Parse.com を導入する際に気を付けること:セキュリティの甘さについて - Qiita

これはちょっと怖い。正式サービス前にセキュリティ有識者へのヒアリングと対策が必須な様子。 何もかもうまくいくほど、成熟はしていない様子。

それにしても、BaaSで一番有名なParse.comがこのレベルだと、BaaSを使ったサービスには危険なものも含まれているんじゃないかと気になる。

VirtualBox上にサーバーを立ててpythonを実行

この本を読みながら、Windows内のVirtualbox上で、pythonを実行できた。

Pythonプロフェッショナルプログラミング

Pythonプロフェッショナルプログラミング

教科書のサンプルコードの1行目にある

#!/usr/bin/env python

は、環境変数で "python" を指定するという意味のよう。 環境変数は /usr/bin/env にあることが多いので、この方が汎用性が高まるらしい。

その他メモ

  • 本に書かれていなかったパーミッションは RLoginからGUIで設定できた。

  • しばらく以下のエラーがでてpythonが実行できなかったけど、

CGI script exit status 0x7f00

原因は文字コードがASCIIになっていたことだった・・・。 いつもUTF-8なのになぜ今回に限って・・・。

なにはともあれ、これでweb用のpythonコードを書き始められるはず・・・。

Windows8.1上のVirtualboxにUbunts server 64bitをインストール

言語に多少慣れてきたので、Web方面に一歩踏み出してみることにした。 そのためには仮想環境内にサーバーを立てるといいらしい。 一連の流れで詰まった箇所のメモ

photo by Andrew Mason

VirtualBoxをインストールし、Ubuntuインストール用環境を作成

Windows8.1だとHyperVを削除しないと64bit環境作成ができないらしい。

Windows8 Proの、VirtualBoxで対象OSのバージョンに(64bit)が表示されなく悩んだ。(原因はまた奴のせいでした・・・) | yoshikawa.64kb

「もしや?」と思い「クライアント Hyper-V」ごと削除してみました。 コントロールパネルを開き「プログラムと機能」を選択します。 右側に表示されている「Windowsの機能の有効化または無効化」を選択します。 「Hyper-V」にチェックがついていたら、チェックを外し「OK」を押し削除します。 OSの再起動を求められますので、再起動をしてください。 その後、「VirtualBox」を起動するとなんと、「Ubuntu(64bit)」が普通通り選択できるようになっています。

VirtualboxにUbuntu Server 64bitをインストール

VirtualBoxにUbuntuサーバーのインストール | WinRoad徒然草

ここで言語は日本語を選択しているが、インストール後に文字化けしてちょっと困ったので、英語のママインストールした方がいいかもしれない。

キーボードは半自動選択(?)だと英語キーボードになってしまったので、手動で選んだ方がいいかもしれない。

(必要なら)文字化け修正、キーボード変更

Ubuntu serverの文字化け対策:浜村拓夫の世界

コンソールで英語のメッセージを表示させるための設定を最初に行っておきましょう。 以下のコマンドでホームディレクトリの.bashrcをエディタ開きます。 nanoというエディタで開いています。

$ nano ~/.bashrc

ファイルの末尾に、以下のように記述します。

case $TERM in linux) LANG=C ;; *) LANG=ja_JP.UTF-8 ;; esac

ubuntu server でキーボードの種類を変更するための備忘録 | COMPNET

sudo aptitude install console-data

上のコマンドを実行して、表示されるダイアログで [Select keymap from arch list → qwery → Japanese → StandardPC 100] を選べばキーボードの種類が「日本語 106/109 キーボード」に設定される。

console-data パッケージがすでにインストールされているときは、以下のコマンドを実行すればキーボードの種類を設定するダイアログが表示される。

sudo dpkg-reconfigure console-data

リストやディクショナリ、変数へのデータの収納の仕方

今も会社で空き時間を見つけては、単純作業自動化ツールを少しずつ書いています。

そんな中でのたぶんプログラミングの基本的な気づきを1つ。

多次元リストやディクショナリに値を収納するときの話。

最近、徐々に複雑なデータを扱うようになってから、出力しやすいことを考えるだけじゃなくて、処理もしやすいように収納する必要があることがわかった。

具体的には、データの持つ「意味」で分ける。

実験サンプル名とそのサンプルにおける実験データと各データのラベルを取り込んで出力したいとき、それらをリストに同じレベルで混ぜて並べてはいけない。

階層が深くなってもいいから、最上位のリストには、[[name],[label],[data]]、みたいに、それぞれの子リストが意味で明確に分けられるように構造を作る必要がある。

出力をするだけなら、上から順に出力すればいいので、異なる意味のデータが混ざっていてもリストの階層が浅いほうがラクなんだけど、

これだと抽出や並び替えの処理に困る。

データの行と列を入れ替えたかったり、データを4つに分割したかったりすると、そのたびに面倒な手順が入る。

なので、しばらくはきちんと階層を作ってデータを収納してみようと思います。

photo by pasukaru76

AnacondaがPython3.4ベースに!

Anacondaが2.0にバージョンアップしたというメールが来ました。

Anaconda Scientific Python Distribution

ついに、Python2.7に加えて3.4もでデフォルトでインストールされるそうです。

難しいインストールを気にすることなく、以下のモジュール、ツールがPython3ベースで使えることを意味するはずです!

  • Numpy
  • Scipy
  • pandas
  • IPython
  • IDE Spyder

これで、日本語の扱いが楽になったり、より日本人に優しいツールになるのでしょうか?

今はPython(x,y)で上記モジュール類を使っていますが、1~2ヶ月様子を見て移行をしようと思います。

codecs.open() とcsv.reader の組み合わせでUnicodeEncodeErrorエラー

Python2.7でこんなコードを書いたらUnicodeEncodeErrorエラー。

    infile = codecs.open(file, "r", "cp932")   
    
    dat = csv.reader(infile)   
    
    y_sig = []
    
    for row in dat:
        
        y_sig.append(row[6])

IDE上ではエラーにならないが、ソースコードを実行するとエラーになる。

それも、なぜかforの行でUnicodeEncodeErrorエラーが発生。

原因はたぶん、csv.readerがunicode型に対応していないらしいこと。(詳細は不明)

このバージョンの csv モジュールは Unicode 入力をサポートしていません。また、現在のところ、 ASCII NUL 文字に関連したいくつかの問題があります。従って、安全を期すには、全ての入力を UTF-8 または印字可能な ASCII にしなければなりません。

13.1. csv — CSV ファイルの読み書き — Python 2.7ja1 documentation

そこで、以下のように、decodeしてunicode型にするタイミングを後ろにずらしたらokになった。

    infile = codecs.open(file, "rb")   
    
    dat = csv.reader(infile)   
    
    y_sig = []
    
    for row in dat:
        
        y_sig.append(row[6].decode('cp932'))

ついでにunicode型と decode,encodeについて勉強。 特に参考になったページのリンクをメモ。

PythonのUnicodeEncodeErrorを知る - HDEラボ ゼロから概念を学ぶのに役立ちました。わかりやすい。

Unicode HOWTO 詳細で明確に記載されている。

今回は特殊なケースだけど、通常は、できるだけ早めにunicode型にして、その後はギリギリまでunicode型を保つのがいいらしい。

python3で標準がunicode型になると、こんな煩わしさもなくなるんだろうか。

herokuは諦めます。

正確には、しばらくは諦めます。 きつすぎました。

思ったよりいっぱいエラーが出て、解決法を調べても調べても、芋づる式にわからない言葉が出てきて収拾がつかなくなりそうなので。

UNIXもサーバーもhttpもsshもunicodeすら知らない人間にはちょっと早かったかもしれない。

herokuだけじゃなく、pythonにも言えることだけど、こういう抽象度の高いプログラミング言語って、

「短時間で」「簡単に」ものが作れるけど、それって

「内部の仕組みを知ってる人なら」っていう限定がつくんですね。

初心者でもうまくいけば作れるけど、エラーが出たときには、結局解決のために内部の仕組みを学ばないと行けない。

まあ、それでもできあがるコードが短く簡潔になるのであれば、長いコードを書いて手のつけようがなくなるよりは楽なんだろうけど・・・。

まずは会社の業務自動化を進める中で言語仕様をもう少ししっかり覚えて、コードの書き方も勉強して、それからVPS経由でwebサービスを学んでいくことにします。

python2.7は文字コードについてしっかり勉強する機会をくれそうなので、まずはそこから。