創り屋も行く3

 

こんにちは。Isodaです。
このエッセイは主にパソコン関連、
数もの(数学、数式など)、
ファイナンス、科学?等々の話題をメインに
取り上げていきます。
乞うご期待!

 

***********************

 

2016年7月1日
『Javaで入出力 初級編』

こんにちは。Isodaです。
先日、テレビで子供のプログラミング教育の特集をやっていました。
2020年頃までに、小学校でプログラミングが必修科目になるようです。
時代の流れですね。
今や英語も小学校で学ぶ時代ですから、プログラミングにも
すんなりと入っていけるでしょう。

かたや、教える側の人間が不足しているとの事。
プログラミングってのは、専門学校、情報系の大学で学ぶ以外は、
独学しかありませんから当然ですね。

しかし、小学、中学生に教える程度のプログラミングなら、
家庭の主婦でも十分教えられます。

なので、当サイトでも始めました。
「プログラミング子供教室 オレンジ」

これは、ご家庭の主婦の方が、自宅で近所のお子さんに
プログラミングを教えられるようにするプロジェクトです。

参加希望の方は、ぜひ早めに申し込んでください。

さて、今回は簡単なJavaの入出力プログラムを作ってみましょう。

まずはJavaでキーボードからの入力プログラムを作ってみます。
コードはこちら。

詳細はコードのコメントを見てください。
String型のstrdataにキーボードからの入力を入れて、
System.out.printlnでそのまま表示します。

簡単ですね。

で、このままでは面白くないので、
入力した文字列が「What time」なら、
現在の日時を表示するプログラムに改造しましょう。

コードはこちら。

これも詳細はコメントを参照のこと。
最初のコードにif文を少々追加したのみです。

どうでしょうか。
意外と簡単にプログラムって組めるんだって事が、
おわかり頂けたでしょうか。

ソフト開発ってのは、最初はわからないことだらけです。
でも今は、ネットがある、書籍がある。
わからなければ、まずネット。
特に簡単なコードってのは、ネット上に溢れています。
それらを組み合わせて実際に動くコードにしていく。

プログラミングってのは、大工さんが材料を組み立てて家を作るように、
小さいコードを組み合わせて、大きなソフトを作っていく、
まさに「手仕事の極み」みたいなものなんです。

で、その時に必要なのが、「論理的な思考力」。
AがBになってCになる。
そんな考え方ができる人は、どんどん上達していきます。

文系の人が意外にコードが上手く書けるってのも、
納得できると思います。

普段、文章書いている人は、論理的思考力も養われているので、
すんなりとコードも書けるんですね。

逆もまた真なりで、コードを書くことで、この論理力も身に付くでしょうから、
まさにお子さんの初等教育には最適なんですね。

プログラミング力だけでなく、国語力、英語力、数学力なんかも
自然と付いてきます。

さあ、プログラミング。
楽しんで学ぶ勉強教材としては、最適じゃありませんか。

********************************

2016年3月25日
『Javaでゲームプログラミングを作ってみる』

こんにちは。自称art & アプリクリエイターのIsodaです。
この時期は花粉がすごいですね。
最近、医者からもらった花粉症の薬が切れて、
市販の花粉薬に変えたのですが、こいつは眠くなってどうにも。

ちょっと休憩中に本でも読もうものなら、途端に睡魔の嵐です。
でも飲まないと、鼻と目がじゅるじゅる。
どうしたもんですかねー。

さて、今回のテーマは表題の通り。
Javaを使って、簡単なゲームを作ってみようと思います。

ゲームプログラミングってのは、非常に奥が深いんですね。
なんと言っても画像を思い通りに動かすのが、結構メンドウですから。
座標を指定して、あーだのこーだの。

そこで今回は、みなさんが後々改造しやすいように、
シンプルなゲームを作っていきましょう。

今回作るゲームの種類は「スロットマシーン」系。

起動するとDos窓に3桁の数字が勝手に動いて表示。
数秒後に自動で止まる。
「700」超えの数字が出たら当たり。
GUI画面で「おめでとう」の表示をする。

こんな感じのプログラムを作っていきましょう。

まずはDos窓にランダムな3桁の数字を表示。
当たると「Bingo!」を表示する。
コードはこちら。

とりあえず、コンパイル→実行してみましょう。

>javac testSlot.java

>java testSlot

どうでしょう。数字がスロットのように表示されているでしょうか。

何回か実行すると、当たりが出ます。
すると、「Bingo!」の表示が。

続いて、GUI画面で「おめでとう」の表示。
こちらもコードはこれ。

これもコンパイル→実行してみます。

>javac Gamen1.java

>java Gamen1

ここまでは、よろしいでしょうか。

さて最後に、この2つを合体させて、冒頭のゲームを完成させましょう。
合体させたコードはこちら。

じゃあ、コンパイル→実行してみましょう。

どうでしょうか。
大当たりでGUI画面が出て祝福してくれましたか。

このように、いくつかのブロックに分けて作る。

合体させて大きなプログラムにする。

こんな方法もあるんです。

所詮プログラムは部品の集合体。
長いコードも一個一個はシンプルにできてるものです。

さて、今回は改造しやすいように必要最小限のコードで、
ゲームプログラミングを紹介してみました。

皆さんも上記を参考にして、自分好みのゲームを作ってみましょう。

***********************

2016年1月4日
『野球、サッカー、プログラミング』

こんにちは、Isodaです。

2016年が開始された。
最近は一年があっという間に過ぎてしまう。
日々やることに追われ、それなりに充実しているものだと
勝手に解釈している。

年末から新年、本屋に行ってブラブラし、
目についた本を手に取る。
新本で買うか、安い古本をアマゾンで探すか。
携帯片手にぽちぽち押す。
近所の本屋も大事なので、少々の差額だったら本屋で落とそうと思う。

でもたまにあるんですよね。
勢い余って衝動買い。新本で2冊数千円。
帰ってから何気にアマゾンで古本確認。
ええっ~、2冊で数百円。
なんだかなー、てな感じです。

でも、つい手に取ると買っちゃうんですよね…。

さて、今回は子供のプログラミング教育を考えてみたい。
題名にも書いたが、野球、サッカー、プログラミング。
そう、今やプログラミング教育は必須だと思っている。
子供は外で野球やサッカーするのも大事。
で、外で遊んだ後は、室内でプログラミング教育。
これも大事だ。

今やどの職場でもPCやITを導入していない所はない。
事務所に一台は必ずパソコンはあるでしょう。

そのパソコンを動かしているのはソフトウエア。
ソフトを作るのに必須なのは、プログラミング言語だ。

やがて、ロボットの時代が来ると言われている。
半数以上の職業はロボットに取って変われると。

しかし、ロボットはプログラミングで動くもの。
さすれば、プログラミングができる者は職にあぶれないってことになる。

ただ今後数十年は、まだまだ大丈夫でしょう。

でも、皆さんの子供が大きくなった頃にはわかりません。
いろんな職業がロボットに置き換わっているかもです。

人生に保険を掛ける意味でも。また、第二のビルゲイツ輩出のためにも。
子供にプログラミングを教えましょう。

と、いささか強引な理由付けになってしまったが、
一言でいえば、プログラミングは楽しいんです。
趣味でやっている人も多いくらいですから。
だったら、野球、サッカー、プログラミング位の軽い気持ちで
トライしてみましょう。

それでは、今回は子供のプログラミング習得用のソフト、
Scratch(スクラッチ)を紹介しよう。

こちらのソフトはアメリカ、マサチューセッツ工科大学の
研究所で、 プログラミング教育普及の目的で作られたもの。

操作方法が直感的でわかりやすい上、複雑なソースコードも
出てこないので、子供に教えるのには打ってつけのソフトだ。
しかも無料。
検索で「Scratch ダウンロード」で落とせます。
ダウンロードのいらないブラウザバージョンもあるようなので、
お好きな方をどうぞ。

さて、Scratchの使い方。

まずScratch画面はこちら。

真ん中の画面に命令文を加える。
すると、右上のキャットが命令通りに動きだす。

やってみましょう。

まず、左上の「動き」をクリック。
左の「10歩動かす」をドラッグして真ん中画面へ。

同じく「もし端に着いたら跳ね返る」をドラッグして真ん中へ。

次に、左上の「制御」をクリック。
「緑旗がクリックされたとき」を真ん中の先頭へ。

同じく「ずっと」を真ん中の2番目へ。
すると青文字を自動で挟み込む。

これで完成です。
なんて簡単なんでしょう。

じゃあ、動かしてみましょう。

右側のキャットがいる画面の上、緑の旗をクリック。
止める時は隣の赤ボタンをクリック。

どうでしょう。
キャットが右や左に動き出しますね。

ちなみに、真ん中画面の「緑旗がクリックされたとき」を
ダブルクリックでも動き出します。
(止める時は赤ボタン)

さて、真ん中画面の

「緑旗がクリックされたとき」
「ずっと」
「10歩動かす」
「もし端に着いたら跳ね返る」

これがプログラムの動かし方なんですね。
実際のソフトウエアのソースコードは、この日本語部分が
英語っぽいプログラミング言語に置き換わるわけです。
英語を学んでいないキッズの頃はこういった日本語プログラムで十分。

やがて英語を学べば、すんなりとコードが書けるようになります。

どうでしょう。
今や、「子供を億万長者にしたけりゃプログラミング」らしいです。

お子さんのプログラミング教育に興味のある方は、お問い合わせください。

さあ、レッツ プログラミング!

※下記の動画でビルゲイツやザッカーバーグが
プログラミング教育を普及しています。
http://www.ideaxidea.com/archives/2013/02/learn_to_code.html

※ちなみに、Scratchはパソコン版もアプリ版も、
終わったらきっちりと終了させてから次の作業をしましょう。
メモリ上に残したまま次の作業をすると、
PCやタブレットの動きがイマイチになります。
遊び終わったら、きっちり終了。これがScratchの上手な利用法です。
(ゆくゆくは、バージョンアップで解消されると思いますが)

*******************************

2015年10月5日
『ビットコインの中本論文に出てくる関数を動かしてみた』

こんにちは、ブルーバックスファンのIsodaです。
本屋に行くと、必ず売り場コーナーに寄っちゃうん
ですよね。
「リーマン予想」だの「P≠NP問題」など、面白過ぎです。

さて、今回のテーマは、表題の通り。
ビットコインの源流となったと言われている中本論文。
この中に出てくるc言語の関数を実際に動かしてみる。

まず原文の関数はこちら。
(関数のソースコードは原文*(1)のままです)

ビットコインの正当性は連なるチェーンの長さを利用しているので、
アッタカーがこの正当チェーンの長さを逆転する確率を、
ポアソン分布を絡めて計算している。

q=アッタカーが次のブロックを見つける確率
qz=アッタカーがzブロックの遅れから追いつく確率

このままではこの関数は動かないので、main関数を付けてみる。
ソースはこちら。

では、コンパイルする。
今回はOSはwindows、ソフトはcygwinのgccを使って
コンパイルする。

上記のソースを「asPro.c」で保存。
保存先は「cygwin」「home」「ユーザ名フォルダ」に入れる。

まず、コンパイル。
$ gcc -o asPro asPro.c

一応、フォルダ内を確認。
$ dir
asPro.exe があればコンパイル成功。

では、実行する。z値は5刻みで表示。
$ ./asPro

q=0.3 z=0 Pro= 1.00000000
q=0.3 z=5 Pro= 0.17735231
q=0.3 z=10 Pro= 0.04166048
q=0.3 z=15 Pro= 0.01010076
q=0.3 z=20 Pro= 0.00248040
q=0.3 z=25 Pro= 0.00061323
q=0.3 z=30 Pro= 0.00015223
q=0.3 z=35 Pro= 0.00003790
q=0.3 z=40 Pro= 0.00000945
q=0.3 z=45 Pro= 0.00000236
q=0.3 z=50 Pro= 0.00000059

論文通り、Z値が増えるに従って、指数関数的に確率が
減少していく。

q値、z値を引数にて変更&グラフに表示したくなったので、
引数付き&csvファイル書き出しのmain関数に改変してみる。
ソースはこちら。

ちなみにササッと作ったので、ファイル書き出しの部分は
やや荒いです。
各自で関数化して可読しやすいソースに改変してください。
また、引数のエラー処理はしてあるが、数値自体のエラー処理は
していないのであしからず)

では、先ほどと同じくコンパイルして実行する。
ソースファイル名は「asProArgc.c」に変更。

$ gcc -o asProArgc asProArgc.c

では、実行する。
q値0.35、 z値70回にて実行してみる。

$ ./asProArgc 0.35 70

q=0.35 z=0 Pro= 1.00000000
q=0.35 z=5 Pro= 0.33636478
q=0.35 z=10 Pro= 0.14280536
q=0.35 z=15 Pro= 0.06245366
q=0.35 z=20 Pro= 0.02765919
q=0.35 z=25 Pro= 0.01233443
q=0.35 z=30 Pro= 0.00552425
q=0.35 z=35 Pro= 0.00248141
q=0.35 z=40 Pro= 0.00111696
q=0.35 z=45 Pro= 0.00050357
q=0.35 z=50 Pro= 0.00022731
q=0.35 z=55 Pro= 0.00010270
q=0.35 z=60 Pro= 0.00004644
q=0.35 z=65 Pro= 0.00002101
q=0.35 z=70 Pro= 0.00000951

cygwinの同じフォルダ内に「bitdata.csv」があるので、
こちらをエクセルなり、Rなりで読み込んでグラフにしてみる。

今回はRでグラフ化する。
まずRでファイルを読み取り。
(bitdata.csvをRの作業フォルダにコピーしてから実行)

> bit=read.csv(“bitdata.csv”)

一応、読み取れたか確認してみる。

> bit
1 1 0.62774911
2 2 0.44571710
3 3 0.32458410
4 4 0.23912686
5 5 0.17735231
6 6 0.13211117
7 7 0.09871250
8 8 0.07392440
9 9 0.05545720
10 10 0.04166048
11 11 0.03133088
12 12 0.02358402
13 13 0.01776622
14 14 0.01339226
15 15 0.01010076
16 16 0.00762190
17 17 0.00575380
18 18 0.00434517
19 19 0.00328247
20 20 0.00248040
21 21 0.00187480
22 22 0.00141740
23 23 0.00107182
24 24 0.00081065
25 25 0.00061323
26 26 0.00046396
27 27 0.00035108
28 28 0.00026570
29 29 0.00020111
30 30 0.00015223
31 31 0.00011525
32 32 0.00008726
33 33 0.00006608
34 34 0.00005004
35 35 0.00003790
36 36 0.00002870
37 37 0.00002174
38 38 0.00001647
39 39 0.00001248
40 40 0.00000945
41 41 0.00000716
42 42 0.00000543
43 43 0.00000411
44 44 0.00000312
45 45 0.00000236
46 46 0.00000179
47 47 0.00000136
48 48 0.00000103
49 49 0.00000078
50 50 0.00000059

グラフ化する。
> plot(bit,type=”l”)

どうでしょう。
z値が増えるに従って、ほぼ0に収束していく様子がわかります。

要は流通しているビットコインをいたずらする時間があったら、
ビットコインのマイニングで稼いだ方がよっぽど確率が高いって
ことです。(とは言っても大変ですけどね)

サーバ&クライアントシステムを使わず、
P2Pシステムでマネーを流通させるビットコイン。
貨幣の価値が物と物との交換するための手段だとすれば、
ネット上でも偽造さえ防ぐことによって、
流通貨幣として十分通用するシステムが作れるってことですな。

参照 *(1) ビットコイン:P2P 電子マネーシステム 中本哲史

*************************

2015年4月14日
『webスクレイピングと形態素解析をやってみる』

ビッグデータという言葉も久しいが、ネット上にあるさまざまな情報を
ビジネスに利用しない手はない。

では、どのようにしてその情報を解析するか。

いろいろ調べてみたのだが、サイトの情報はwebスクレイピングで
ピンポイントゲット。
得た情報を細かく単語ごとに分けて解析するには、
形態素解析がいいようだ。

そこで、今回はwebスクレイピングとRによる形態素解析で
この手法を実現してみたい。
(ちなみに、精度は開発途上なので、ざっくりバージョンとする)

………

使用パソコンのOSはLinuxのubuntuを使う。

まず流れとしては、
1,ubuntuのターミナル画面でwgetを使い、対象サイトのhtmlをダウンロードする。
2,ダウンロードしたhtmlからrubyの正規表現を利用してタグを除去する。
3,タグを除去したテキストファイルを統計ソフトRに渡して、形態素解析をする。
4、以上の処理を一つ一つやるのは面倒なので、スクリプトにして全自動で実行する。

こんなところだ。

使用環境
ubuntu14.04
htmlファイルをダウンロード(webスクレイピング)するためにwgetコマンドを
使えるように設定しておく。
統計ソフトR、rubyもインストールする。
形態素解析に使うMeCab
同じくRMeCabをインストールして使えるように設定。

製作するファイル
tagtori.rb
rkaiseki2.R
testsh1.sh

さて、それでは早速上記1~を実行する。

まずお手持ちのubuntuのターミナル画面を開いて、wgetを実行する。
今回は架空サイトhogehoge.hogeのトップページを、画像ファイルなしで
ダウンロードする。
ダウンロードしたファイルはtest.htmlの名前で保存される。

$ wget -O test.html -R jpg,png,gif http://hogehoge.hoge

次にダウンロードしたファイルtest.htmlを一応nkfで文字コード変換。
test2.htmlで保存。

$ nkf -w test.html > test2.html

次にrubyで作った正規表現を除去するtagtori.rbを使う。
引数は先ほどのtest2.html。

ちなみに、当方で作ったこのtagtori.rbはざっくりバージョンなので、
ソースの公開はしない。
「ruby 正規表現」 などで検索すると専門サイトが出るので、
そちらを参考に各自でよく調べて製作してほしい。

では、このtagtori.rbに引数でtest2.htmlファイルを与えて実行する。

$ ruby tagtori.rb test2.html
この結果、同じフォルダ内にtagunasi2.txtができる。

tagunasi2.txtはwgetでダウンロードしたhtmlファイルを
ほぼテキストのみにしたもの。
ここで注意して欲しいのは「ほぼ」という点だ。
コメントタグや改行したタグなどは完全に除去できないので、
こいつも改良の余地あり。
(なので、ざっくりバージョンとする)

さて、
次に統計ソフトRにtagunasi2.txtファイルを引数で与えて、形態素解析を行う。

Rで形態素解析をするために、あらかじめRにMeCabとRMeCabを導入しておく。
これらのインストールについては、専門サイトを参照してほしい。

RMeCabはインストール後、Rのコンソール画面上で、
>library(RMeCab)
で利用できる

導入後のRの処理を一括で行いたいので、
以下のrkaiseki2.Rファイルを作成しておく。

下記をテキストファイルに入力後、rkaiseki2.Rで保存。

######################ここから

#引数の初期設定
args <- commandArgs(trailingOnly = T)

#1番目の引数をinfileに格納
infile <- args[1]

#RMeCabを読み込み
library(RMeCab)

#変数toriにRMeCabFreq関数の処理を入れる
tori=RMeCabFreq(infile)

#解析結果で、出現頻度が2より大きい数だけを変数tori2に入れる
tori2=tori[tori$Freq> 2,]

#tori2を昇順に並べ替え変数tori3に入れる
tori3=tori2[order(tori2$Freq),]

#表示
tori3

#tori3をcsvで保存
write.table( tori3, file=”data1.csv”, sep=”,”, fileEncoding=”UTF-8″ )

####################ここまで

このrkaiseki2.Rに引数でファイル名を与えると、そのファイルの中の
テキストを読み込んで、形態素解析をし、昇順で表示。
結果をcsvファイルにて保存してくれる。

では実行する。

ubuntuのターミナル画面で、
$ R –vanilla –slave –args tagunasi2.txt < rkaiseki2.R
を実行。

以上で、形態素解析の結果が
出現頻度2より大きく
昇順
の順番で表示される。
実行したディレクトリィにdata1.csvができるので、
後々、表計算ソフト等で利用できる。

これら一連の処理をひとつひとつ実行するのは面倒なので、
scriptとして自動実行できるようにする。

下記をtestsh1.shとして保存。

######################ここから

#!/bin/sh

# 実行時に指定された引数の数、つまり変数 $# の値が 1 でなければエラー終了
if [ $# -ne 1 ]; then
echo “実行するには./testsh1.shの後ろに、半角を入れて、URLを付けてください。” 1>&2
echo “例 ./testsh1.sh http://hogehoge.hoge” 1>&2
exit 1
fi

#wgetで落としてファイルに書き込み
#引数でもらったURLのhtmlを落とす(画像落とさず)
#指定ページのみ リンク先は落とさず
wget -O index1.html -R jpg,png,gif $1

#nkfで文字コード変換
nkf -w index1.html > index2.html

#index2.htmlファイルを引数とし、tagtori.rbを実行
#tagunasi2.txtを出力する(正規表現でタグを除去したテキスト)
ruby tagtori.rb index2.html

#Rに引数tagunasi2.txtを与えてrkaiseki2.Rを実行する
R –vanilla –slave –args tagunasi2.txt < rkaiseki2.R

#それぞれの各ファイルを削除 各ファイルを残しておきたければコメント可
rm -rf index1.html index2.html tagunasi2.txt

######################ここまで

このscriptを実行する。
$ sh testsh1.sh http://hogehoge.hoge
(上記http://hogehoge.hogeは調べたいサイトのURLを入れる)

どうでしょう。
ターミナル画面に解析結果が表示されたでしょうか。

(当サイトのトップページを解析した結果)

昇順で表示されるので下から順番に見ていけば、
特定ページの頻出単語がひと目でわかる。

※例えば、上記の画像からだと、「ソフト」という単語が、
頻出数10で表示されている。下から10行目。
ちなみに見方は、左から2番目の列が単語、
一番右の数字が頻出数。

作られたdata1.csv

使ってみた所感としては、
食べログなど巨大サイトのリンク先全ページの情報解析となると、
まだまだ処理に時間がかかるので、
1ページづつの読込解析版として利用できそうな感じだ。

さて、それじゃあもういっちょ、巨大サイト解析用も作りますか。