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_gesをFalseにしてあげるだけでよいようです。

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'

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

2012年8月21日火曜日

夏休み

弊社は、会社としての夏休みはなく、それぞれ各自で休暇をとるスタイルです。

いつもは夏、冬の休みを取っても自宅にいることがほとんどなのですが、

今年は(自分にとってはかなり)珍しく、実家に帰省をしてみました。



というのも、たまたま今年の年初にfacebookで学生時代の同級生からコンタクトがあり、

あっという間に何人もの友人とつながりが生まれ、

東京在住のメンバーは東京で集まって飲み会をしたりしていたのですが、

お盆に帰省する人も含め、故郷で大集合だー!! なんてイベントが立ち上がったもので、

そういうことなら、今年は帰るか、と思い立ったというわけです。



とはいえ、何しろ卒業以来20年以上会っていない人もたくさんいるわけで、

お互いに誰なのか分かるかな、とか、何を話そうかな、とか、

普段の営業活動とは異なる種類の緊張がありました(笑)



でも、会ってみたら全く20年の空白を感じることもなく、

当時の感覚そのままに、友だち同士のバカ話で盛り上がったりして・・・。

社会人になってから知り合った友人、大学時代の友人、などなど、

いろいろな時代と比べても、小学校や中学校時代の友人というのは、

実にバリエーション豊かだなと、思いました。



片道650キロ、時間にしておよそ8時間前後ですが、

今後はもうちょっと帰省する頻度、上げようと思いました(笑)

2012年6月29日金曜日

ヒューマンキャピタル 2012

6月は当社の決算月だったのですが、
4月、5月は静かだった案件もいろいろと動き出し、
慌ただしくしているうちに最終日となってしまいました。

と、思っていたら、もう来週に「ヒューマンキャピタル2012」が迫っているではありませんか!
2007年より毎年参加をしていますが、今年は3小間での出展です。
主力ソリューションである高機能人事システム【スマートカンパニー】、
この1年間で大きく機能強化しておりますので、
ご来場予定のある方は、改めてブースでご覧いただければと思います。

3日間、毎日10時~17時30分までというのは肉体的にかなりハードではありますが、
昨年に続いて今回もホットな商談を見つけられればいいなと思います。
いい話があれば、辛いことも疲れも、キレイに吹っ飛びますからね!!

2012年5月30日水曜日

良いことも、そうでないことも


物事には、常に「反対の見方」があるものです。

先日、紹介案件で日帰り九州出張に行ってきた時のこと。メーカーの技術部門に所属する人のスキル管理をシステム化するというテーマ。システム化の目的や狙いを聞く限りでは、ほぼスマートカンパニーで対応できる内容でした。

スマートカンパニーならば、スキル管理にとどまらず、目標管理や人事評価、キャリア管理や研修履歴、自己申告など、フルラインで人材マネジメントをカバーでき、手作りよりもベターですよ、そんなトーンでデモンストレーションを行ったのですが、

「機能がありすぎて、何だか大変そうに見える」
「ユーザーにデータをいかにして入れてもらうかが生命線なのでシンプルにしておきたい」

高機能、多機能ぶりが評価されることの多いスマートカンパニーですが、今回は逆に「使いこなすのが難しそう」との印象を与えてしまったようです。どんな時でも常に高機能、多機能が良いとは限らない・・・。


そうかと思えば。

今度は都内の商談で、「人事考課」部分が取り敢えずほしい、というお客様。目標管理から人事考課、キャリア管理やスキル管理などなど、当初は人事考課だけと考えていたのに、その他にもいろんなことができると分かったら、やっぱりあれもやりたい、これもやりたい、こんなことはできないの?

そんな会話になり、最終的にはフルセットでの見積依頼を頂きました。九州の件が頭にあったので、あれもこれもできます感をあまり強く出さないように、なんて思っていたら、高機能ぶり、多機能ぶりが評価されるということに。


お客様のニーズに対しては、謙虚でなければならないなと思った次第です。