2017年3月21日火曜日

プログラムの勉強

2020年度から小学校でもプログラムを教えるようになるそうです。
いったいどんなプログラム言語で勉強するんでしょうね。

個人的にはPythonとかBasicよりはJavaScriptのほうがいいと思っています。
その方がきれいにキャラクターがアニメーションしたり、学習意欲がわきそうに思うんですよね。
僕が小学生のときは算数の計算がめんどくさくて電卓で計算していたのすが、いまやブラウザに計算式をいれると計算してくれる時代。
小学生もおうちのスマホでプログラムとかもできるといいですよね。

キャラクターは動きませんがとりあえず小学生でもスマホやPCでJavaScriptのプログラムを作って遊べるサイトを作ってみました。

http://2nd.agolamusic.com/trial/jslearning/jslearning.html

でもこれスマホだとセミコロンとか入力しづらい・・・。
よく考えたら、varとかセミコロンとかなくても文法上大丈夫だね。
やっぱりスマホだけで計算できるじゃん。

とりあえずJavaScriptを実行するサイトは簡単に作れるのですが、世の中にはJavaScriptで書かれたPythonとかBasicもあるので、これらのライブラリを使えば、Pythonプログラムページとかも作れる?

おじさんのような悪い大人になると、このサイトにお花とかワニとか電車の絵をつけると高く売れそうな気がしてしまいます。
誰かこのサイト買ってくれないかなあ。



まあ、いろいろ利権がありますが、JavaScriptのほうがこういうサイトもすぐ作れるし、教材楽に作れそうな気がします。



2017年2月22日水曜日

転職電車

どうも僕の毎日利用している山手線には転職したいと思っている人が多いらしく、かならず扉のところにはいつも転職サービスへの広告があります。
仕事に疲れて電車を降りるときふと見上げると転職サービスの広告が・・・・。


そんなに転職ビジネスって儲かるんだと思っていたら、転職電車が登場していました。




電車の扉はビズリーチ、中刷りもビズリーチ、車内の動画広告もビズリーチ、電車の先頭から最後までもう全部ビズリーチ。


しかも毎日たくさん走っている。
明電舎、テイジン、楽天、ソニー、募集はいわゆつIT系のソフトウェアエンジニア系の会社ばかり。
あらー、日本という国はこんなに理系のエンジニア不足してるんだね。
そりゃー、給料が安い旧態依然の自動車メーカーや電気メーカーから人いなくなるわ。

会社にいくときもビズリーリ。
外に打ち合わせにいくときもビズリーチ。
会社にもどるときもビズリーチ。
家に帰る時もビズリーチ。
のんびり家族で出かけるときもビズリーチ。

こんな電車に毎日乗るとほんとうに転職したくなっちゃうじゃないか。
あらー、うちの会社のおっさんが真剣に見てるよ。
おい君、いったいどうしたんだ?


Android用のPythonをビルドしてみた

忙しくてブログが更新できていなかったのですが、大作を作ったので今日は更新。


Android端末で動くPythonがない。

ラズパイ版のPythonもあるのになんでAndroid版だけないんだ。
ということで、PythonのAndroid版をビルドしてみました。

まず、SL4A (Scripting Layer for Android)というGoogleの方が移植したAndroid用のPythonのソースをgithubからとってきます。
https://github.com/damonkohler/sl4a

--------------------
SL4A (Scripting Layer for Android) とは、 Android 上で、スクリプト言語によるコーディングや、スクリプトおよび対話式インタプリタの実行を可能とするソフトウェアです。 サポートされているスクリプト言語は Python、Perl、PHP、JRuby、Lua、JavaScript 等で、今後さらに追加される予定です。 また、これらのスクリプト言語から Android の API を呼び出すための仕組みが用意されているため、 HTML で UI を記述し、JavaScript で Android API を呼び出すといった使い方も可能です。
--------------------

このレポジトリにビルドしたPythonインタープリタのバイナリーも含まれているのですが、出力されたコードがPIEではないため比較的新しいAndroidではこのバイナリーが実行できないのです。
仕方がないので自分でビルドします。

が、やはりGoogleにはWindowsはないようで僕のAndroid-NDKがはいっているWindowsマシンではデフォルトのビルドが通らない・・・・・・。


ということで、いくつか修正してビルドします。


1. ソースのコピー
sl4a-master/python/srcをsl4a-master/python-build/python-srcにコピーします。


2.  NDK_MODULE_PATHを設定します

cd sl4a-master/python-build
export NDK_MODULE_PATH=$(pwd)


3. makefileにPIEオプションの追加

sl4a-master/python-build/jniにある、modules.mkとpython.mkに次の二行を追加

LOCAL_CFLAGS += -pie -fPIE
LOCAL_LDFLAGS += -pie -fPIE


4. ビルド

cd sl4a-master/python-build/python
ndk-build

途中の3つくらいのファイルでビルドエラーが出ますが、まぁその部分たいしたことないのでコメントアウトすればビルド完了

sl4a-master/python-build/python/libs/armeabi
このフォルダにpythonの実行形式のバイナリーとsoファイルが出来上がります。


5. LD_LIBRARY_PATHの設定

上でできたバイナリーをAndroid端末にもっていって、環境変数LD_LIBRARY_PATHをsoのあるフォルダに設定してあげればpythonを実行することができます。
だけどこれでは

import os

などのimport文が通りません。
なので、Pythonのライブラリを持ってきます。


6. PYTHONPATHの設定

sl4a-master/python/src/Libにあるファイル一式をAndroid端末にもってきて、そのパスを環境変数PYTHONPATHに設定します。


これでAndroid端末用のPythonが出来上がります。
コンソールのままAndroid端末の開発ように使うもよし、apkにいれてアプリとして使うもよし。

今回、SL4Aに含まれているPytyhon2.6をビルドしましたが、Android用のパッチを当てなくてもなんとなくビルドは通るんですね。ということはPython2.7もビルドできるかも。

Android用のPythonのバイナリーだけほしい方はこちら:
https://drive.google.com/file/d/0B5M9qMMg3tfQbkNTaUdkUnBHV1k/view?usp=sharing

Android用のPythonのソース一式がほしい方はこちら:
https://drive.google.com/file/d/0B5M9qMMg3tfQeTZ5LXRRcG5INDg/view?usp=sharing

Pythonって結構簡単にしかも高速にビルドできるのね。
Pythonの動作原理を勉強するのにもちょうどいいですね。
ということで今日はAndroid版のPythonのビルド方法の解説でした。

2017年1月11日水曜日

地図を表示してみた

最近、スマホアプリで近くのお店を探すアプリが増えてきました。
自分のいる場所とかで違うアイテムがもらえるゲームの位置ゲーとかもあるし。
技術的にどうやってんだろうと思って調べてみました。

どうやら、最近はブラウザでGPSの位置情報が取得できて、その位置情報をもとにJavaScriptでいろいろ処理したり、地図とかを表示しているようです。

ということで位置情報の取得はAPIを呼びだけなので、地図を表示するWebサイトのHTMLをつくってみました。

10分くらいごにょごにょJavaScriptを書けば位置情報とか地図ってすぐできんじゃん。

<html>

<head>
<style type="text/css">
#map-canvas {
width: 800px ;
height: 600px ;
}
</style>
</head>

<body>
<h1>Google Map Test</h1>



<!-- 地図が描画されるキャンパス -->
<div id="map-canvas">ここに地図が表示されます</div>


<!-- GoogleMap API JavaScript -->
<script src="https://maps.googleapis.com/maps/api/js?key=ここにAPIキーを入れる&v=3.24"></script>


<script language="JavaScript">

// 地図表示
var canvas = document.getElementById( 'map-canvas' ) ;
var latlng = new google.maps.LatLng( 35.792621, 139.806513 );
var mapOptions = {
zoom: 15 , // ズーム値
center: latlng , // 中心座標 [latlng]
};
var map = new google.maps.Map( canvas, mapOptions ) ;

// マーカーのインスタンスを作成する
var marker = new google.maps.Marker( {
map: map ,
position: new google.maps.LatLng( 35.792621, 139.806513 ) ,
} ) ;

//イベント
map.addListener('click', function(e) {

 alert("kita!");
 var lat=e.latLng.lat();
 var lng=e.latLng.lng();
 alert(""+lat);
 alert(""+lng);

});


</script>

<!-- User JavaScript -->
<script src="googlemap_test.js" language="JavaScript"></script>

</body>
</html>


2016年12月21日水曜日

ヤフー最悪

これは酷すぎる。あまりにひどすぎるので会社名を実名で書かせていただきます。

身内が亡くなったので、いろいろな解約手続きをしたのですが、どうしても解約できないものがある。それがYahooのサービスの解約。

毎月ヤフーウォレットという会社から請求書が送られてくるのですが、何に対する請求かまったくわからない。
それだけではない。電話番号などが全く書かれていなく、どこで解約手続きをしないといけないのかが全く分からない。

請求書にはQRコードが書いてあるので、どうやらそこにアクセスすればよいんだなと思いそこにアクセスした。

問い合わせのページに行くと。わけのわからん項目がたくさんあり、どこに問い合わせてよいのか全くわからない。

酷すぎる。なんなんだヤフー。だからみんな使わねーんだよ。


いくつか入力するとやっと問い合わせのページが出てきた。

解約したい旨を書き込むと、まったく返事がこない。
一日待ってもこない。
ふざけんなよ。どんなに遅くても24時間以内に返信しろよ。
お前のところのオークションにもよく書かれているだろ。
24時間以内に応答できない人は非常に悪いの評価つけられちゃうんだよ。

ヤフーのサポート対応非常に悪いです。

さらに待ち続けます。

メールが返ってきました。
ここのURLにアクセスして解約手続きをしろと。

ふざけんな、客を散々待たせておいて、また同じようなことを入力しろと。
亡くなった人はお前のところと契約したかも知らないけど、僕はお前のところと契約した覚えはないし、お前に善意で知らせてやってんだよ。
なんでこっちがやんなきゃいけないんだ。
いったい何様のつもりなんだ。

怒りMAX。ふざけんのもいい加減にしろよ!酷すぎる。


そもそもサービスというものはお客様に価値のあるものを提供し、お客様の要望を叶えその対価としてお金をいただくものであり、客の言うことを全く理解しないどころかお客様がわざわざサービスにあわせるものではないはずです。
そんなふざけたサービスには金払わねーよ。とっととやめてやる。

とっととやめたいのに、とっととやめられないんだよ。

怒りを抑えながら、しょうがないのでもう一度同じようなことを入力。
以下の書類が必要ですと書いてある。
そんな書類ねーよ。

書類がない場合どうしたらよいのでしょうか?
先に進めないじゃねーかよ。
メールにはこのメールに返信しても届きませんと書いてある。
また問い合わせをするのかよ。

しょうがなく、とりあえず全く関係ない書類を適当なPDFにして送信ボタンを押す。
画面にはエラーと表示される。
セッションが切れました。時間がたっていますだって。
ふざけんなよ5分で入力しただろうが。
しかももう一度最初から入力してくださいと。

なんでもう一度入力しないといけないんだよ。
怒りを抑えに抑えてもう一度入力します。
また同じようなエラー

もう怒った。

お前のところ以外はすべて何の問題のなくすべて全部解約できたのに、解約できないのはお前のところのサービスと解約の電話を一時間くらい待たせたヤフーBBだけだ。

ヤフー、お前のところのサポートは最悪だ。
もうヤフーのサービスは一生使わない。メルカリに変えるからな。


もう、請求書も何の請求かわからない、解約しようとしても解約できない。
これ詐欺と全く変わらないじゃないか。

続く。




2016年12月7日水曜日

ZMQってなに?

おじさん忙しくてなかなかブログを更新できませんでした。
久々の更新。

車の自動運転のソースコード公開されたんだ
http://gigazine.net/news/20161206-commaai-open-source/

ソースコードでも見てみようかなぁ、
https://github.com/commaai

という軽い気持ちでソースコードを眺めていたら、自動運転ライブラリはZMQというライブラリを介していろんなモジュールが通信していました。

ZMQってなんなんでしょうね?
ということで今日はZMQについて勉強してみました。
ZMQとはどうやら0MQ(ZeroMessageQueue)の略らしいです。
http://zeromq.org/

どうやらIPC、RPCなどプロセス間通信とか分散処理をするライブラリみたいですね。
最近ではこのようなライブラリをつかってPythonとC++などの言語間のブリッジやWindowsとAndroid間など異なるプラットフォーム間の通信を行うんですね。
たしかに、こうすればあらゆるプラットフォームのあらゆる言語で開発できるし、C++のPythonラッパーを作るより便利だよね。

ディープラーニングとか機械学習はPythonで書かれたり、C++で書かれたりしているのでこのようなライブラリを使うんですね。


この辺日本人がなかなか理解できない苦手なところだよね。
全然使い方とか解説のブログないじゃんと思っていたら、ZMQガイドブックの翻訳版がありました。
http://www.cuspy.org/diary/2015-05-07-zmq/


ということで、ZMQのサーバとクライアントを作ってみました。
このライブラリ、軽量でかつ簡単に分散処理とか異なる言語間通信できるので、本当に面白いですね。


------------------------------------------------
// Hello World サーバー
#include <zmq.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <assert.h>
int main (void)
{
 // クライアントと通信を行うソケット
 void *context = zmq_ctx_new ();
 void *responder = zmq_socket (context, ZMQ_REP);
 int rc = zmq_bind (responder, "tcp://*:5555");
 assert (rc == 0);
 while (1) {
  char buffer [10];
  zmq_recv (responder, buffer, 10, 0);
  printf ("Received Hello\n");
  sleep (1); // 何らかの処理
  zmq_send (responder, "World", 5, 0);
 }
 return 0;
}

------------------------------------------------

------------------------------------------------
// Hello World クライアント
#include <zmq.h>
#include <string.h>
#include <stdio.h>
#include <unistd.h>

int main (void)
{
 printf ("Connecting to hello world server...\n");
 void *context = zmq_ctx_new ();
 void *requester = zmq_socket (context, ZMQ_REQ);
 zmq_connect (requester, "tcp://localhost:5555");

 int request_nbr;
 for (request_nbr = 0; request_nbr != 10; request_nbr++)
 {
  char buffer [10];
  printf ("Sending Hello %d...\n", request_nbr);
  zmq_send (requester, "Hello", 5, 0);
  zmq_recv (requester, buffer, 10, 0);
  printf ("Received World %d\n", request_nbr);
 }
 zmq_close (requester);
 zmq_ctx_destroy (context);
 return 0;
}
------------------------------------------------







2016年10月17日月曜日

車の自動運転ってどうやってやるんだろ

おじさん、五歳の娘に「アニアは夜になると動くんだよ」と言ったところ、うちの娘はおじさんが寝ている間にアニアをリビングに移動させ、おじさんが起きた時に「アニアがほんとうに動いてた」と言ってました。五歳児の人をまねる能力って本当にすごいです。おじさんがやろうとしていることを想像して先に自分がやるんですね。



これとくらべると最近話題の機械学習も人間のやることをまねしているだけなんですが、猿まねというか五歳児以下ですね。

おじさん、五歳児に嘘を見破られてくやしいので、頭をよくするために車の自動運転のソフトウェア技術を勉強してみました。
しばらく勝手に車の自動運転の技術について勝手に解説しようと思っています。

車の自動運転では、信号とか歩行者や対向車などを判別しないといけないんですが、まずは歩行者などを判別するところまで。

映像の中から物体を識別するには

1. 物体候補領域抽出
2. 画像認識

という二段階が必要らしいです。

映像の中からなんか人とか物がありそうな領域を抽出して、その領域一つ一つに対して画像認識をして、画像が何かを判別するんですね。

2に関しては前回のブログで比較的最先端なものをやったので今回はパス。
今回は1の部分をやってみたいと思います。


物体候補領域抽出アルゴリズムはBING(Binarized Normed Gradients for Objectness Estimation)とかSelectiveSearchとかいうものがあるそうです。

この部分、結構処理が重たいらしく、いろいろな企業や研究機関で高速物体候補領域
抽出の研究がされているようです。

この辺のライブラリ、Pythonで書かれていることが多いのですが、将来商品に入れることを考えると、PCのフルPythonでしか動かないライブラリを使うのではなくて、やはりC++でやりたいですね。

ということで今回はDlibというライブラリでSelectiveSearchをやってみたいと思います。最新の19.2はVisualStudio2015以上でしか動かないので、僕は18.16を取ってきました。

このライブラリも面白いですね。allというディレクトリにあるsource.cppというファイルを一つコンパイルするだけで、ライブラリが使えます。


Selective SearchのC++のソースコードはここにあるのでそのまま取ってきます。
http://nonbiri-tereka.hatenablog.com/entry/2016/07/15/110000


先ほどのファイルと上記のメイン関数のファイル、二つをコンパイルすると実験ができちゃうんです。この10分くらいでサクッとビルドできて実験できちゃう感じがほんと便利。ライブラリの作者の頭の良さが伝わってきます。


ということで、アニアの画像を物体候補領域抽出してみました。


僕のPCでは20秒くらいかかる・・・・。
でもなんか正しいっぽいいじゃん。