Python3とUNICODE

Python3はインタプリタ内部はUNICODEベースであるが入出力がUNICODEとは限らない。コンソール出力はデフォルトでは環境依存で、私の環境(XAMPP付属のApacheの上で動作)ではShift-JISエンコードで表示される。なので、次のようなコードを書くとエラーになる。

print('cafe')

'cp932' codec can't encode character '\xe9' in position 3: illegal multibyte sequence

おフランス語の文字が解釈できませんと言われた。これを防ぐには、次の呪文を唱えるといいらしい。

import io,sys
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')
sys.stderr = io.TextIOWrapper(sys.stderr.buffer, encoding='utf-8')

入出力をutf-8で行いますよ、という意味だ。うまくいかずしばらくハマっていた。なお、これだけではファイル出力をutf-8にできないので、ファイルオープン時にエンコーディングをutf-8を明示指定する必要がある。
参考リンク:
[python3]デフォルト文字コードの指定(CGI実行時) | 「きまぐれほげほげひろば」のTOPICS
Python3スクリプトをCGIとして動かすときの文字エンコード指定 | Cross Points
2つ目は環境変数をutf-8に変えてしまう根本修正だが、例えばレンタルサーバーでこの手は使えるのだろうか?
PHPでもUNICODE周りで面倒な思いをした記憶がある。UNICODEは便利で思想も素晴らしいが、実装する人間にとっては悩みの種だ。


Pythonと集合

Introducing Python が読みやすすぎてドバドバ進む。
Pythonは集合理論が充実していて驚きだ。補集合和集合排他集合、サブセットかどうか、その逆なんかがみんな演算子一つでできちゃうんだな。
例えば和集合は a | b と書く。3文字だよ!?すげぇ!これが他の言語だったらfor文使って配列にあるかどうかのフラグ立てて、、って面倒なのに。


Pythonすげー

Amazon.co.jp: Introducing Python: Bill Lubanovic: 洋書
を読み始めた。まだ文法も何もわかっていないけれど、イントロのサンプルコードでいきなり衝撃を受けた。

import json
from urllib.request import urlopen
url = "https://gdata.youtube.com/feeds/api/standardfeeds/top_rated?alt=json"
response = urlopen(url)
contents = response.read()
text = contents.decode('utf8')
data = json.loads(text)
for video in data['feed']['entry'][0:6]:
print(video['title']['$t'])

9行だけで、youtubeのトップ6のビデオのタイトル一覧がゲットできる。現時点の実行結果はこちら。

Mission: Impossible Rogue Nation – Fate
Ariana Grande Does a Spot-On Celine Dion Impression
Kerry Washington accepts the Vanguard Award at the #glaadawards
Jennifer Lopez: “Feel the Light” – AMERICAN IDOL XIV
Marvel’s Avengers: Age of Ultron – TV Spot 2
Jennifer Lopez – Feel The Light (From The Original Motion Picture Soundtrack, Home)

分かりやすすぎる本なので本文に期待。


Learning Javascript Design Patterns

Learning JavaScript Design Patterns
やっと読み終わった。途中休み休みだったので、7か月もかかっている。backbone, YUI, requireJS, AMDの所はついていけなかった、、jQueryの解説についても、もうすこしjQueryに精通してからの方が良かったな。Moduleパターン、Object LiteralパターンやMVC、Namespace関連については、TrainNavi2やSHChartで実践することができた。ある程度JavaScriptでプログラムを組んだ方にはとても役立つ書籍だと思います。私ははじめてコードを組んでから約半年の段階で読み始めることができました。
次はPythonだ。Python3に対応、Amazonのレビューが良好、比較的新しい書籍、ということで
Introducing Python: Modern Computing in Simple Packages: Bill Lubanovic: 9781449359362: Amazon.com: Books
を選択しました。一体どんな言語なのでしょう。


日足週足月足の切り替え、速度増加、URL指定表示、一段落

kickzone/SHChart · GitHub
kickzone/StockHoloscope · GitHub
六帖webアプリ

意外にもJavaScriptのDateオブジェクトのgetTime関数の動作コストが高いことが分かった。カレンダーを見て時間を足しまくる必要があるからか?これをなるべく使わないようにすることで、体感速度が10倍くらいになった。
日足をあまり多く表示すると描画が遅くなるので、キリのいいところで週足、月足に切り替える機能も追加した。
PHPのURL変数渡しを使って、指定した銘柄の指定した期間のチャートを一発表示できる実装も行った。これが一番やりたかったこと。過去のチャートを見て分析したいときに、既存のサイトでは昔のデータを表示しずらい。リアルタイム表示が売りのサイトが多いから。例えば伝説のライブドアショックのチャートが見たければ、次のように指定すればよい。
http://rokujo.esy.es/StockHoloscope/chart.php?mcode=4753&start=20050601&end=20060531
上のURLのmcodeに証券コード、startに開始日、endに終了日を入れれば任意のチャートを表示可能。手元だと3秒程度で表示される。十分実用に足るだろう。しかしライブドアってあんなに騒がれてた割には、絶頂期でせいぜい2005年の値の2.5倍くらいにしかなってないんだね。テンバガーには程遠い。2004年に謎の暴騰があるけれど、これは株式分割バブルというらしい。
SHChart関連の開発はこれでおしまい。本当はテクニカル指標を入れたりとか、色々やろうと思っていたことはあるんだけれど、もうテクニカル指標を使った投資には全く興味がなくなってしまった。未来は過去の数字から予測できない。次は、財務データの自動所得・分析をするソフトウェアが作りたい。


pythonはじめる

参考URL
Download Python | Python.org
[python][xampp] xamppでpythonを使う答えを知りたい | 答えを知りたい
Python3.4を入れてみました。xamppと連携して使うつもりです。まずはhello worldから。。と2つ目のリンク先のコードを試したら、

Server error!

サーバ内部で障害が発生し、 リクエストに応えることができませんでした。

Error message:
End of script output before headers: test.py

サーバーの障害と思われる場合は、ウェブ管理者までご連絡ください。
Error 500
localhost
Apache/2.4.4 (Win32) OpenSSL/0.9.8y PHP/5.4.19

と言われました。2つ目のリンク先のコードはpython2用で、3になってprintが関数になったということを知り次のように書き直しました。

#!C:\Python34\python.exe
print("Content-Type: text/plain")
print("hello world.")

すると

Server error!

サーバ内部で障害が発生し、 リクエストに応えることができませんでした。

Error message:
malformed header from script ‘test.py’: Bad header: hello world.

サーバーの障害と思われる場合は、ウェブ管理者までご連絡ください。
Error 500
localhost
Apache/2.4.4 (Win32) OpenSSL/0.9.8y PHP/5.4.19

なんでやねんっ、、しかし、web検索してみたところ、
XAMPP + Python = Malformed header from script … | DaniWeb
これをヒントにして、

#!C:\Python34\python.exe
print("Content-Type: text/plain\n")
print("hello world.")

と入力したら

hello world.

やった!Content-Typeの最後に改行が無いと、hello worldとヘッダ?が一体化してしまってダメってことなんですかね。まだpythonの文法は全く知らないので、これからゆっくり勉強します。


ドラッグ移動、マウスホイールで拡大縮小、DBリード


六帖webアプリ
kickzone/SHChart · GitHub
ドラッグによる移動、マウスホイールによる拡大縮小が可能になったので、DBリード機能を入れてようやく公開可能なバージョンができた。1か月半もかかった。
VS2013上でMySQLを使いたいが、どうも環境を作るのが難しそうだ。プラグインはあるようだがバグもあるらしい。仕方なく、テストにはハードコードしたオブジェクトを使用している。また、eclipseに戻るべきなんだろうか。。
マウスホイール実装が実に面倒だった。IEとFireFoxでやってくるイベントの変数が全然違うらしく、小細工が必要となった。クロスブラウザ対応は大変だ。

this.CanvasMouseWheel = function (e) {
//ホイール移動量をゲット
var delta = e.deltaY ? -(e.deltaY) : e.wheelDelta ? e.wheelDelta : -(e.detail);
if (!delta) {
delta = e.originalEvent.deltaY ? -(e.originalEvent.deltaY) : e.originalEvent.wheelDelta ? e.originalEvent.wheelDelta : -(e.originalEvent.detail);
}
//省略
}

現時点の問題点は、
・2年分くらい表示するととても重い→週足・月足に切り替える必要あり
・終値モードが欲しい
来週はこの2点を改善するところから。


TypeScriptのスコープ

TypeScriptには、カッコ内のみ有効になるスコープはないようだ。例えば以下のコードはコンパイルエラーにならないが、まともに動作しない。

for (var i in this.elements) {
var element: GraphElement = this.elements[i];
if (element.date >= xrange.start && element.date <= xrange.end) {
this.validElements.push(element);
}
}
for (var i in this.validElements) {
//elementがエラーにならない
element.paint(stage, min, max, xrange.GetX(element.date), xrange.xsize, xrange.xmin, xrange.xmax, this.ymin, this.ymax);
}

これがC#だとelementなんかないよ、ってエラーになるんだけどね。javascriptでもこれはエラーにならない。ただしどちらの場合も、elementはundefinedとなるので、動作はしない。