2013年10月31日木曜日

「TypeError: environment can only contain strings」 (Windows 7 + Python 2.7 + Django 1.5 + Werkzeug 0.9.4 + cx_Oracle 5.1.2)

WerkzeugをインストールしてDjango Extensionsのrunserver_plusを使おうとしたら

TypeError: environment can only contain strings

と言われて起動してくれず困りました。

どうもcx_Oracleが環境変数に入れているものが悪いようなので、runserver_plusの前に事前に設定しておくようにしてみました。

set NLS_LANG=Japanese_Japan.JA16SJISTILDE
set ORA_NCHAR_LITERAL_REPLACE=TRUE

とりあえずこれで動いてくれるようです。

2013年9月26日木曜日

LeapTrainer.jsを使ってみる

Leap Motionを購入したもののさっぱり触っていなかったので何かしたいと思い、ふらっと勉強会 Leap Motion 自習会 に参加しました。

Feedlyをものぐさに読むブックマークレットでも作ろうかと思ったのですが、こんな手の動きをしたらこうして欲しいなぁ、というイメージは湧いてもそのジェスチャを捉えるのが大変だと悩みはじめました。デフォルトでLeap Motionがみつけてくれるジェスチャは回転、スワイプ、タップだけです。

そこで調べてみたところとてもすてきなLeapTrainer.jsというライブラリを見つけましたので動かしかたを書いておきます。

ダウンロードして、
  trainer-ui.html
を開くと手の形が表示されます。



Leap Motionの上で手を動かしてみると画面の手も動きます。たまに黄色くなるときがジェスチャを捉えたときです。手の動きのスピードで検出がはじまるので、OPTIONSのRecording velocityを適当にかえてておきましょう。あまり値を小さくするといらない動きを拾ってしまいますし、大きくしすぎると手をムチャクチャはやく動かさないといけなくなります。



ちょうどよい速さにできたら、左上のCREATE GESTUREをクリックして名前を入力します。CREATEでジェスチャの記録開始までのカウントダウンの開始です。

Perform the ジェスチャ名 gestureと言われたら、Leap Motionの上で手を動かしましょう。

learned!と言われたらジェスチャの設定完了です。左のジェスチャ名をクリックするとデータがJSON形式で表示されます。



これを使いたいところで読み込めば、ジェスチャの検出ができるようになります。


<!doctype html>
<html>
  <body><div id="main"></div></body>
  <script src="./trainer-ui/js/jquery.min.js"></script>
  <script src="http://js.leapmotion.com/0.2.0/leap.min.js"></script>
  <script src="./leaptrainer.js"></script>
  <script>
    var trainer = new LeapTrainer.Controller();
    // =============↓ LeapTrainer.jsのデータを貼りつける
    trainer.fromJSON('{"name":"TEST1","data":[[{"x":0.0599484...,"stroke":1}]]}');
    trainer.fromJSON('{"name":"TEST2","data":[[{"x":0.1806993...,"stroke":1}]]}');

    function gestureDetected(name) {
      return function() {
         console.log(name);
         $('#main').html(name);
      }
    }
    // ↓ジェスチャを検出したときに何をするか書く
    trainer.on('TEST1', gestureDetected('TEST1'));
    trainer.on('TEST2', gestureDetected('TEST2'));
  </script>
</html>


2013年8月16日金曜日

LinuxでもOSqlEdit


Wineを使えばLinuxでもOSqlEditが使えますねー。

Ubuntu 12.10 + Wine 1.4 + Instant Client for Microsoft Windows (32-bit) + OSqlEdit 9.5.6.3 で確認しました。

2013年7月29日月曜日

今すぐ使える中国語講座 Lesson.1

弊社でもダイバーシティはひろがっており、この4月にはメンバーに中国人が加わりました。 これをよい機会と、週に一回の中国語講座を開いてもらっています。おかげさまで名前と出身地の自己紹介くらいはタドタドしくも何とか言えるようになりました。 ただ、それだけでは物足りません。そこで、もっと今すぐ使える中国語を教わりました。忘れないように書いておきます。
Sān tián méi huí laí le, wǒ qù zǎo táng
三天没回来了, 我去澡堂.
三日間帰っていないので、銭湯に行ってきます。


Zhè bú shì lòu dòng, shì shè jì guī gé
这不是漏洞, 是设计规格.
それはバグではなくて、仕様です。


À nàge chéng xù yuán zuó tián táo zǒu le
啊!那个程序员昨天逃走了!
ああ、そのプログラマなら昨日逃げました。


Yù suàn yòng wán le
预算用完了.
予算は使い切りました。


Jīn tiān kě yǐ huí qù le ma
今天可以回去了吗?
今日は帰っても良いですか?


Zhège chéng xù de lòu dòng shì zhì mìng de
这个程序的漏洞是致命的.
このプログラムのバグは、致命的ですね。


Wǒ yào tiào cáo le
我要跳槽了.
わたしは、転職することにしました。
ご活用ください!

2013年7月2日火曜日

Python3、uWSGI1.9、Django1.5で日本語ファイル名のダウンロードができない

(【2013/07/03 追記】uWSGIの本家で修正して頂きました。)

ファイル名に日本語があるとダウンロードできない。環境は、Python 3、Django 1.5、uWSGI 1.9。uWSGIのログに、

TypeError: http header must be encodable in latin1

というエラーが。

uwsgi/plugins/python/wsgi_headers.c の156行目、

 zero2 = PyUnicode_AsASCIIString(h_value);
 zero2 = PyUnicode_AsLatin1String(h_value);
としたらうまくいきました。

2013年6月26日水曜日

Djangoでモデルにひもづかないパーミッションを作りたい

Djangoで新しいパーミッションを作りたいものの、どのモデルとも深い関係はないんだよなー、というときには、stackoverflowの How can I use Django permissions without defining a content type or model? で紹介されている方法が便利です。

PermissionモデルのプロキシモデルなGlobalPermissionにpermissionを追加すれば、

from django.contrib.auth.models import Permission

class GlobalPermission(Permission):
    class Meta:
        proxy = True
        # ↓↓↓↓↓↓
        permissions = (
            ('listen_to_me', u'オレの話しを聞け'),
        )

authのパーミッションとして、

{% if perms.auth.listen_to_me %}
むかしむかしあるところに…
{% endif %}

つかえるようになります。

2013年4月24日水曜日

AVOX AWR-100T使ってます

Webで調べても使っている人の情報があまりなくて買うかどうかサンザン悩みました。快適に使えているので、使えましたよレポートを。

モノは 『3G限定だけどSIMフリーのWi-Fiルーター「AVOX AWR-100T」』。

香港"3"のプリペイドSIM、HSDPA Broadband Access Rechargeable SIM Cardをさして中国で国際ローミングしてChina Unicom経由で利用できました。

充電するときは電源を切ってからと説明書にあるので保証の範囲外ではありますが、充電しながらでも使えています。

前回の出張時はAndroid携帯(Sony Xperia tipo dual)のテザリング機能を使っていたのですが、そのときより遥かに通信速度が出て快適です。アキバで8,000円ほど。お買い得ですよ。

2013年4月1日月曜日

中国でGoogleマップがずれるのを直すにはGCJ-02を

中国でブラウザ版のGoogleマップを見ると、現在地のピンが立っているところが衛星写真と地図でずれています。

現在地で確認すると衛星写真ではぴったりなので、地図がおかしいようです。

調べてみると地図の形式が異なるようなのですが、いろいろなところで書かれているBJ54への変換を試してみても現在地が合いません。

さらに調べてみるとGCJ-02という座標系があって、これがぴったりと合うようです。GPSの値をWGS-84からGCJ-02に変換すれば地図もピタリと現在地を示します。

GCJ-02是由中国国家测绘局制订的地理信息系统的坐标系统。它是一种对经纬度数据的加密算法,即加入随机的偏差。国内出版的各种地图系统(包括电子形式),必须至少采用GCJ-02对地理位置进行首次加密。
(GCJ-02 - 百度百科)

(Google翻訳)
GCJ-02測量とマッピングの中国の国家局が開発した地理情報システムの座標系。これは、暗号化アルゴリズム、ランダム偏差を追加することにより、緯度と経度のデータである。国内出版マップシステム(電子フォームを含む)、少なくとも最初のgcj-02の場所を使用して暗号化する必要があります。
WGS-84 到 GCJ-02 的转换(即 GPS 加偏)算法是一个普通青年轻易无法接触到的“公开”的秘密。这个算法的代码在互联网上是公开的,详情请使用 Google 搜索 "wgtochina_lb" 。
([操作系统]IOS定位与坐标系算法)

(Google翻訳)
WGS-84は、GCJ-02への変換(すなわち、GPSに加えて部分的な)アルゴリズムは、普通の若い人たちは簡単に "公然の"秘密と接触することはできません。インターネット上でこのアルゴリズムのコードが開かれている、Googleの検索"wgtochina_lb"をご利用ください。

2013年3月19日火曜日

PythonのSAXで外部DTDを読みたくない

掲題の通り。

DTDにインターネットへの参照が

<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
  "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
のようにあると、オフラインではファイルを取得できずにエラーとなってしまいます。DTDの中身を見たいわけでもないときには非常に残念です。

いまどきオフラインでの開発はほとんどありませんが、精神衛生上よろしくないので解決策を調べておくと、

from xml.sax import make_parser
from xml.sax.handler import feature_external_ges

parser = make_parser()
parser.setFeature(feature_external_ges, False)
f = open('some_file.xml')
parser.parse(f)
f.close()

feature_external_gesFalseにしてあげるだけでよいようです。

EntityResolverを用いて、あらかじめダウンロードしておいたDTDを参照することでもエラーを解消できます。

from xml.sax import make_parser
from xml.sax.handler import EntityResolver

class MyEntityResolver(EntityResolver):
    def resolveEntity(self, publicId, systemId):
        # ローカルに保存したDTDを開く
        return open(systemId.split('/')[-1], 'rb')

parser = make_parser()
parser.setEntityResolver(MyEntityResolver())

f = open('some_file.xml')
parser.parse(f)
f.close()

2013年3月6日水曜日

Viz.jsで日本語出力

Graphvizの出力をJavaScriptだけで手軽に得られるVis.js。ラベルに日本語を使うとエラーが出たので、ムリクリ動かしてみました。
example.htmlをいじって↓のグラフを表示してみます。まずは日本語なしで。
digraph G {

 subgraph cluster_0 {
  style=filled;
  color=lightgrey;
  node [style=filled,color=white];
  a0 -> a1;
  label = "process #1";
 }

 subgraph cluster_1 {
  node [style=filled];
  b0 -> b1;
  label = "process #2";
  color=blue
 }
 start -> a0;
 start -> b0;
 a0 -> b1;
 a1 -> end;
 b1 -> end;

 start [shape=Mdiamond];
 end [shape=Msquare];
}

すばらしいですね。
さっそくstartのラベルを日本語に変更してみます。
 start [label="はじめ" shape=Mdiamond];

ラベルはちゃんと変わったもののエラーが…
日本語を入れるとグラフソースの終わり位置の計算が狂うような動きをしています。 もうそこソースじゃないっすよ、というところまでグラフだと思って読んでしまってエラーが出ているようです。
そこでexample.htmlの、
function src(id) {
  return document.getElementById(id).innerHTML;
}
を変更して、グラフのソースにたっぷりと空白をつけて先に進みすぎても大丈夫なように、
function src(id) {
  var dot = document.getElementById(id).innerHTML;
  return dot + new Array(dot.length).join(" ");
p}
としてみると、

きれいに表示できましたとさ。

2013年3月5日火曜日

Pythonで中国語をピンインに (xpinyin)

xpinyinを使うとこんな感じです。

1. インストール

pip install xpinyin

2. 使う

from xpinyin import Pinyin
p = Pinyin()

print p.get_pinyin(u'个')
=> 'ge'

おおざっぱに読みを知りたいときによさそうですね。