コンテンツにスキップするには Enter キーを押してください

カテゴリー: 技術メモ

AppEngineのhashlibで日本語を含む文字列のハッシュ値を取得しようとするとエラーになる件

ファイルやテキストの改竄を検知するためにMD5やSHA256などのハッシュ関数を利用してハッシュ値を求めるということはよくあると思うんですが。
Google App Engine / Pythonでこれをやろうとして変なエラーに遭遇してしまい、パニクったので備忘録として書いておきます。

ものすごく要約するとこんなコードを書いていました。

import hashlib

text = u'ほげほげ'
hash = hashlib.sha256(text).hexdigest()

実際はtextには外部から取得した、これよりもっとながーーい文字列が入っていて、その文字列のハッシュ値を求める、というものでした。

localhostのSDKではこれでちゃんと動いてたんですよ。

ところがプロダクション環境にデプロイしてみると、動かない。

ログを見ると、
UnicodeEncodeError: 'ascii' codec can't encode characters in position 18-40: ordinal not in range(128)
と出ていたので、どうやらASCII範囲外の文字をASCII文字列にエンコードしようとしてエラーになっている、ということはわかりました。

が、原因はわかったものの解決法がわからない。

エラーメッセージでググってみると、どうやら外人さんも同じ問題で悩んでいたらしいということがわかり、そこに解決法が載っていました。

というわけで修正したコードがこちらです。

import hashlib

text = u'ほげほげ'
hash = hashlib.sha256(text.encode('utf-8')).hexdigest()

はい、textを明示的に「utf-8」と指定してencodeしてやりました。

これがPythonのややこしいところなんですが、「Unicode型文字列」と「(UTF-8エンコードされた)str型文字列」は全くの別物なんですよね…。

とにもかくにも、これでプロダクション環境でもちゃんとハッシュ値を取得することができるようになりました。


コメントする

Twitterクライアントを日本語URLに対応させる一番楽な方法

先日公開したつい短ですが、残念ながらクライアントによっては日本語URL(国際化URL)に対応していない場合があります。

Janetterさんはアンカンファレンスの会場で僕がゴネたお願いしたこともあり数日中に対応していただいたのですが、他のクライアントでは特にそういう動きもなく…。
実際、Janetterでもだいぶ複雑な正規表現を使って判定されているようで、他のクライアントにもそれをお願いするのは難しいかもしれません。

が。

さっきTwitter APIのドキュメントを見ていたらそんな問題を一挙に解決する方法が載ってるじゃないですか。
しかもけっこう昔の版から。

なんでみんなこれを活用しないんだろう…。


3 Comments

IS01でWi-Fiテザリングしてみた

あけましておめでとうございます。本年もどうぞよろしくお願いします。
さて、年末年始は田舎の豊岡に帰省していました。
帰省したのは大晦日だったですが、大雪の影響で乗っていた特急が途中の福知山駅で運行打ち切りとなり、福知山駅で1時間以上足止めを食らってしまいました。
同じ山陰本線だと鳥取や島根の方では車内に缶詰にされたりと大変だったようですね…。

ところで。

行き帰りの電車に乗っている間もPCでネットしたいわけです。

去年の今頃はWILLCOM回線をつなぎ放題契約していたので、アドエスをUSBでつないでダイアルアップ接続できたのですが、回線速度は2xで128kbps、4xで256kbpsなので、この時代においてはとてつもなく遅いです。
しかも、福知山線にしても山陰本線にしても、別ルートの播但線にしても、どれも山の中を縫うように走っているので、WILLCOMのエリアだとほとんど圏外でつながりません。

でも今年は。

auの3G回線を契約しているので回線速度は下り最大3.1Mbps、しかもauなのでトンネルでもない限り山の中でもちゃんとつながることを期待できます。

が、一応公式的にはIS01はPCのモデムとして使えない、ということになっています。

でも実はどうやら使えるらしいんですね。

なお、帰省に持って帰るPCは、勉強会にもちょくちょく連れて行ってるUbuntuを入れたネットブック。
UbuntuだとAziLinkというソフトをつかってUSB接続でAndroid端末をモデムがわりに使えるようなのですが、どーせならニンテンドーDSもつなげてみたいのでWi-Fiテザリングをする方針で探ってみました。


コメントする

「俺の話を聞け!」で「Google App Engine / Pythonでソーシャルアプリを作った話」について発表しました

きょう13時から大阪・西中島にある株式会社クロノスで開催された「俺の話を聞け!」で、「Google App Engine / Pythonでソーシャルアプリを作った話」というタイトルで15分くらい発表させていただきました。
…ていうかこれを書いている現在、まだ開催中なんですが。

プレゼン資料はあとで公開します。
Google Docsってアニメーション効かないからページ数分割しまくってるので、それを上手いこと削除してからになります…。
そーゆーわけでちょっと待ってください><

16時45分追記
公開しました><
内容はそのまま、アニメーションだけ削除して100枚→50枚に圧縮!!

見えない人はこちら


コメントする