Pythonの日本語というかunicodeではまった話

Python(2.x)で日本語を含む文字列を+演算子を使って連結をしようとすると、

Traceback (most recent call last):
  File "", line 1, in 
    str = a + b
UnicodeDecodeError: 'ascii' codec can't decode byte 0xXX in position X: ordinal not in range(128)

とか言われて連結できない件。

Python(2.x)の文字列にはstr型とunicode型がある、というのをついさっきまで理解できていませんでした…
Pythonで日本語文字列 (UnicodeとUTF-8, Shift-JIS, EUC-JPなどの相互変換) - プログラミング工場 / Python
とか
マルチバイト文字列のエンコード・デコード - YAMAGUCHI::weblog
とか
Pythonでの日本語処理:Unicode型と文字列型 - 思い立ったら書く日記
をみて、ようやく何となく理解。

  • 文字列を連結する際に、暗黙的にunicode型に変換される
  • 暗黙的な変換では元の文字列の文字コードが考慮されない(指定されない)のでデフォルトのasciiに基づいて変換しようとする
  • その結果、7bit=128の範囲じゃない値(要するに8bitの値)が使われてるからasciiコーデックがデコードできない!

といってるってことね。
str = '日本語'.decode('utf-8') + '日本語'.decode('utf-8')
とかすればよさそう、ということで。

なかなかむつかしい。

Twitter APIのsearch/tweetsではまった話

Python で Twitter API にアクセス - Qiita
とかを参考にしながらtwitter関連のプログラムを勉強中のできごと。

GET search/tweets を使ってタイムラインの検索をしようとしたんだけど、検索結果を表示しようとしても、

TypeError: string indices must be integers

とかいわれて動かない。
GET statuses/home_timeline とかはすんなり動いたのになんでだろう。
悩むこと数十分。
GET statuses/home_timeline と GET search/tweets で得られるレスポンスを見比べてたら、

GET search/tweetsは、statuses と search_meatadaが返ってくる

のに気付いた。

気づいてみるとなんてことないんだけど、そんなのドキュメントに書いてなかったよなー、と
GET search/tweets | Twitter Developers
をよくよく読んでみたらExample Resultにそのまま書かれていた…
やっぱりドキュメントはしっかりと読まんとだめやなー

ラズパイのpythonでhttps通信をしようとしてはまった話

twitterapiを使おうとして、

url = "https://api.twitter.com/1.1/statuses/home_timeline.json"

とかすると、SNIMissingWarningとかInsecurePlatformWarningとか言われて煩わしい。
これをなくすために、
http://urllib3.readthedocs.org/en/latest/security.html
を参考にするんだけど、gccエラーが云々といわれてうまくいかない。
いろいろと考えた結果、どうやらlibffi-devが足りないのが原因らしい。
http://urllib3.readthedocs.org/en/latest/security.html#installing-urllib3-with-sni-support-and-certificatesにちゃんと書いてあった…

ラズパイのパッケージ、一度きちんと確認しないとだめやなー。

MendeleyでローカルのPDFをアップロードしないようにする話

Mendeleyを使い始めてみた。
管理しやすそうなんだけど、文献登録→Sync時にほっとくとローカルにあるPDFがアップロードされちゃうのね。
このままだと無料分の2GBがすぐなくなりそうなので書誌情報だけ共有してPDFはローカルに残しておきたい。
でまあいろいろ探してみた結果なんとかなりそうだったのでメモ。

デスクトップ版の初期画面で[Edit Settings]をクリック
   ↓
Synchtonize attached files のチェックをはずす

まあ単純なんだけど、忘れてしまいそうなのでとりあえず残しておきます。


本当は職場的にはRefWorksを使って欲しそうなんだけど、こちらはWebオンリーなのがネック。
デジタルネイティブな若者はオンラインで全部やるんだろうけど、オールドタイプなのでオフラインで作業したくなるのでした。

Raspberry Piでいろいろはまった話

その1:nanoエディタ
crontab -e

を実行するとnanoエディタが動く。
ここはvimじゃないのかー。

ラズベリーパイ、raspbian の nano エディタ?の使い方を少々 - ラズベリーパイで遊ぶよ~!
などを参考に何とか切り抜ける。

その2:ログ

問題なさそうなスクリプトがcronだと動かないのでログを見ようとして

tail /var/log/cron

を実行してファイルがないと怒られる。
/var/log/syslogに出力されるんですね。
/var/logの中をよくよく見てみるまで全然気づかなかった。

その3:No MTA installed, discarding output

/var/log/syslogを見てみると、

No MTA installed, discarding output

というエラーがあることに気付く。
MTA入ってないのか…ノーチェックだった。
仕方ないので

sudo apt-get install postfix

とかやって何とかやり過ごす。

なかなか難しいなー。

コース一覧に表示されるロールを替えたい話

Moodle2.7のコース一覧画面で各コースの説明に表示されるロール(たいていの場合は教師)を替えたいという要望がありました。
たしか2.4を触ってた時代にやったことがあるような...と昔の資料をあさること小一時間。
なんとかやり方を思い出したのでメモしておきます。

  • その1:サイト管理設定で変更する(ただし全コース共通)
    1. サイト管理 -> アピアランス -> コース を表示
    2. 「コース管理者」で表示するロールを選択
  • その2:ロールの名称をリネームする(ただしコース毎に設定が必要)
    1. 管理 -> 設定を編集する を表示
    2. 「ロールのリネーム」で表示されているロールの名称をリネームする

1.9時代は自分で適当にコードをいじってカスタマイズ修正してたけど、あれはまだコード自体に寄せ集め感というかいい加減さがあったからですよねー。
2.xになってからはきれいにまとめられた分、修正しにくくなったきがするなー

PHPのバージョン違いにはまった話:配列の書き方

PHPプログラミング本のサンプルプログラムを試していた時のお話し。
プログラミング本にありがちなサンプルプログラムのバグもなく、順調に進めていた。
…のだけど、ある章から突然サンプルプログラムが動かなくなった。
エラーログには、

[error] PHP Parse error:  syntax error, unexpected '[' in /xxx/yyy/zzz.php on line XXX.

とあったのでそれらしい場所を確認してみたけどおかしそうなところが全く見当たらない。
しかたなく該当する場所をコメントアウトしてみると、異なる行で同じエラーが吐かれる始末。
二日くらい悩んでも解決しないので著者に直接メールで質問してみた。
その結果、原因は、


PHPのバージョンが古いので、PHPのバージョンをあげるか、array()を使ってください。
(配列の短縮構文はPHP5.4以降じゃないと使えない)

でした…
バージョンなんてそんなの最初に確認しろよ、といわれるのはわかっていますが、ちょっとまって欲しい。
その前の章までのサンプルプログラムは、古いバージョンのPHPでも全く問題のないもの(array()を使ったプログラム)だったんですよ。
当然、そのままで問題ないと思いますやん。

その本自体はよく書かれていてわかりやすかったのに、できれば書き方を統一して欲しかったわー。