by shigemk2

当面は技術的なことしか書かない

JSON_AS_ASCII

JSON_AS_ASCII

JSONの中の文字(non ASCII)をASCIIにエンコードしない。

By default Flask serialize object to ascii-encoded JSON. If this is set to False Flask will not encode to ASCII and output strings as-is and return unicode strings. jsonify will automatically encode it in utf-8 then for transport for instance.

http://flask.pocoo.org/docs/0.12/config/

なのだけど、例のUnicodeDecodeErrorでコケた。

  • Flask 0.12.2
  • Python 2.7.13

memo: GET website including non-ASCII in request.el

概要

request.elで、日本語とかのASCIIじゃない文字列が混ざったページに対してGETすると、curlの結果が文字化けする。

(require 'request)
(request "http://rubikitch.com/"
         :parser 'buffer-string
         :complete (function*
                    (lambda (&key data &allow-other-keys)
                      (switch-to-buffer "*request-result*")
                      (erase-buffer)
                      (insert data))))

理由

このプルリク。elispについて、サブプロセスでcurlを実行しているけど、実行するバッファのエンコードが binary になっている。 Win/Mac/Linux全部に対応しないといけないライブラリなので、binaryにすることで動かなくなるのを回避しているのだと思う。

このプルリクの修正が直接の原因。 github.com

でも、binaryにするとASCIIじゃない、具体的には日本語のサイトでGETすると文字化けする。 github.com

対策

こう書いて、dataのエンコードをutf-8とかにする。

(require 'request)
(request "http://rubikitch.com/"
         :parser 'buffer-string
         :complete (function*
                    (lambda (&key data &allow-other-keys)
                      (switch-to-buffer "*request-result*")
                      (erase-buffer)
                      (insert (decode-coding-string data 'utf-8)))))

ってあるけど、正直知らないとわからないから、ドキュメントやテストには明記したいね。

set-process-coding-system

set-process-coding-system

サブプロセスに対して送るencodeの指定

(set-process-coding-system PROCESS &optional DECODING ENCODING)

Set coding systems of PROCESS to DECODING and ENCODING.
DECODING will be used to decode subprocess output and ENCODING to
encode subprocess input.

M-x describe-function で見られる説明はこれだけで、どんなエンコードを設定できるかは書いていない。

request.el parser

request.el parser

https://tkf.github.io/emacs-request/manual.html

request.elのparserについて。 レスポンスボディをどうやってパースするかを決める。 json-readを使う場合は、JSONのデータ構造を決めることができる。この例の場合だと、json-readしたデータをplistにすることが出来る。

(request
 "http://..."
 :parser (lambda ()
           (let ((json-object-type 'plist))
             (json-read)))
 ...)

すべてのレスポンスボディをstringにしたいなら、 buffer-string にする。

(request
 "http://..."
 :parser '(buffer-string)
 ...)

mapred.job.reuse.jvm.num.tasks

mapred.job.reuse.jvm.num.tasks

If you have very small tasks that are definitely running after each other, it is useful to set this property to -1 (meaning that a spawned JVM will be reused unlimited times). So you just spawn (number of task in your cluster available to your job)-JVMs instead of (number of tasks)-JVMs.

タスクがものすごく小さかったら、-1にして常に再利用するのをすすめる。 1にすると再利用しない。

Amazon EMR は mapred.job.reuse.jvm.num.tasks の値を 20 に設定しますが、これはブートスラップアクションによってオーバーライドすることができます。値を -1 にすると 1 つのジョブ内でいつまでも再利用が行われ、1 にするとタスクは再利用されません。

タスク間でJVMを共有してフレームワークのオーバーヘッドを低下させる意図。JVMの起動にはコストがかかるので、多くの小さいファイルを処理する場合はJVMを何度も再利用して起動のコストを下げる。 処理に時間がかかる場合は、すべてのメモリが確実に解放されるようにJVMを再利用しないようにする。