2012年10月17日水曜日

論文を書いて英訳して学術雑誌に投稿したいブログ

将来、何をしていたいか、たまに少し考えるんですけど
しばらくは自費出版することが夢だったんですけど
論文を書いて英訳して学術雑誌に投稿するのを夢にします

今年のお盆くらいに考えたんですよ
将来、ノーベル賞の受賞を目標にしようって
確率はものすごい低いけど
何もかも考慮しなければ
世界中の人達に少しづつの確率で
ノーベル賞を受賞する確率はあると思う
部活している高校生が将来オリンピックに出たいっていう夢を持つのと等しいのかな?
もしくは野球にはまっている小学生が将来、ドラフトで指名されて
プロ野球選手になりたい。という夢と等しい。みたいな
そこまで一生懸命ではないけれど
雑誌で一流の人は夢も一流みたいに読んで
夢が一流だから一流になれたのかもしれなく
夢をノーベル賞受賞という一流にしようと思いました
僕はダメ人間やけど
夢くらい一流にして
ここからの人生巻き返したいですね

で、夢をノーベル賞受賞に定めたんですけど
先日、Yahoo!のニュースで
今年のノーベル賞受賞者が
研究の論文を学術雑誌に投稿して
それが評価されてノーベル賞を受賞した。みたいに書いてて
そういう道もあるんやなぁ。と

今までは、考えた概念を自費出版にまとめて
それで勝負!って思ってたけど
書籍となると色々書かなきゃないとページ数貧相になるしw
でも、色々書こうとしすぎで上手く書き進められなく
論文だったら主な部分さえ書けば良いので
そっちの方が向いてそうです
とりあえず論文にしてみたいテーマは二つ
余計なこと考えないでそれ書いてまずは日本語で投稿の予定です

ただ学術雑誌に投稿するとなると
たぶん英語じゃなきゃダメで
この前、TOEICの問題集やったら
予想スコア325~350点って出て
相当頑張らなきゃ英訳出来なそうですね
時間はかかってもいいからってなったら
割と出来るかもしれませんが
そういう意味でも英語の勉強を相当頑張らなきゃいけませんね^^

2012年8月29日水曜日

プログラミングとメモ

僕がプログラミングする時
設計やTODOの洗い出しをするのは向いてないかもしれません

「時間のやりくりがうまくなる本」という雑誌の診断で
「夢や理想を追い求め、やるべきことはすべて後回し」タイプ
と診断され
TODOがやりたいことリストになってしまって
消化していかないタイプみたいです
設計したアウトプットもやりたいことリストになってしまいます
TODOは頭の中で
設計はメモ形式で
このやり方があってると思います

メモを書いて参考にしながらプログラミングをするのもいいですが
今回のメモとは別の考え方

今、HSPLetでPASSWORD機能を作成していて
暗号処理に入る手前です
ノートパッドにメモを構成して
メモを変化させながら
保存したいbytesを準備しています
普通にbytesを準備せず
メモを変化させながらbytesを準備した方が
論理が合いやすいと思うんです
暗号処理は初めてなので
メモを変化させながらやっているのであって
慣れれば普通にbytesを準備した方が楽かもしれませんが

で、そんなことをしていたら
恒常的にメモを保持するのはどうだろうか?と思ったんです
考えているうちに
それはヘッダファイルみたいなものだって思いましたが
ヘッダファイルを更に詳しくさせたものを想定しています

とりあえず今のメモ形式は
ID 変数の名前 型 size 値 記述欄
で構成しています
せっかくメモを変化させながらやっていますが
メモからデータは取り出していませんw
ちなみに型がわかっても(文字列とか)sizeが決定する訳ではないので
size項目は存在価値がありそうです

他にもHSPLetはモジュール機能がないので
データの集まりをまとめて、その集まりを何個か用意することが出来ません
なのでデータの集まりをメモとして表現するのも価値がありそうです
ソースコードを読めばデータが把握出来る
わからない時はprintデバッグすればいい
ではなく
メモを恒常的に保持し
それを参照しながらコーディングする手法も価値があると思うんですけど
そういう意味ではヘッダファイルに近い考え方で
ヘッダファイルがあれば参照しながらコーディング出来る訳で
なのに存在しないプログラム言語も多いのはどういう訳なのでしょうね

2012年8月7日火曜日

収穫逓減の法則の現代の例

収穫逓減の法則とは
農地に労働時間を加える時
一定の農地に加える労働の量が多いほど
労働によって得られる財の平均は減る
という法則です

僕が考えた例として
資本の収穫逓減の法則として
一人の労働者に資本を使用すると
加えれば加えるほど
資本によって増える財の
平均は減るというものです

例えば一人の労働者に
一カ月10万円の資本を使用して
得られるマネーが千円増えるなら
一カ月20万円の資本を使用すると
得られるマネーは2千円以下だろうという仮定です
理由は資本を増やすために使う時間が減るからです
10万円の資本を使用するなら
一人の労働者は全ての労働時間を10万円の資本を使用するのに
20万円の資本を使用するなら
一人の労働者は労働時間を10万円づつの資本を使用するのに
半分づつの労働時間をかけるからです

ただこれは資本から見た視点であり
労働者一人が増やした財は増えるため
労働者の賃金も増えるでしょう

またこれは
国内の資本の増える率が
使用する資本が増えれば増える程
率は減るということであり
先進国ほど利子が低いという現象の
理由の一つとしても考えられます

他の例として
機械のコストパフォーマンスという収穫逓減の法則も考えられます
理由は生産財がどれくらい生産されるか?という観点から見たものであり
生産する量が多ければ多いほどコストパフォーマンスが高いという観点です

生産財の価格が低い時は
賃金と生産財の価格の比率から
コストパフォーマンスは良いでしょう
さらに高価な生産財を使用することに変更していって
皆が使用している生産財であるほど
生産効率が良くてコストパフォーマンスも良いです
更に高価な生産財に変更していくと
生産財の使用している割合が減少し
生産する量が少ないという理由で
コストパフォーマンスが悪くなっていきます

と言っても、先進国においては
賃金が高いので
高価な生産財も割合安価であり
それによりちゃんと生産効率があがるなら
十分使用価値はありますが

2012年8月6日月曜日

回路的プログラミング言語

今、日経ソフトウェアの付録を読んでるんですけど
(既に読破したやつw)
演算の回路について読んで
(ANDとかORとかNOTとか)
回路的プログラミング言語ってのもあってよいかと思いました
ググればありそうですけど

例えばBIGNUMを書こうとした時
回路的プログラミングをした方が簡単に書けるのではないかと
例えば1桁をBYTEにして
10を越えれば上のBYTEに接続して加算
10かけるとかして上の桁に代入する時も
上のBYTEに接続して代入とか
桁はスタックで管理して
桁増やす時はスタックに積んで
代入するなら接続とか
代入って演算もいいけど
接続って演算があってもいい気がします
同じ動作だとしても別名でも嬉しそう
リテラルの代入が代入で
変数からの代入が接続とか

簡単にBIGNUMのフローチャートを書いてみようか

toString
文字列に代入
toBIGNUM
BYTE配列に代入

加算
桁の数だけ繰り返し
同じ桁を足して10の商を一つ上の桁に加算

大小比較
符合がプラスとプラスなら
桁が大きい方が大きい
符合がマイナスとマイナスなら
符合が大きい方が小さい
符合がプラスとマイナスなら
符合がプラスの方が大きい
桁が同じなら
桁の数だけ繰り返し
桁の数が異なる場合
数が大きい方が大きい
全部等しい時のみ等しい

符合無視大小比較
桁が大きい方が大きい
桁が同じなら
桁の数だけ繰り返し
桁の数が異なる場合
数が大きい方が大きい
全部等しい時のみ等しい

減算
お互い0以上
減算A
引かれる数の方がプラスで
引く数がマイナスだと
加算
引かれる数の方がマイナスで
引く数がプラスだと
加算(符合はマイナス)
お互いマイナス
減算B

減算A
大小比較して
引く数が大きいなら
引く数引く引かれる数
符合はマイナス
引かれる数が大きいなら
引かれる数引く引く数
符合はプラス

減算B
大小比較して
引く数が大きいなら
引く数引く引かれる数
符合はプラス
引かれる数が大きいなら
引かれる数引く引く数
符合はマイナス

10の乗数Xの掛け算
桁の数だけ繰り返し
それぞれの桁のX上の桁に代入

掛け算
演算結果変数宣言
掛けられる数の桁の数だけ繰り返し
掛ける数の桁の数だけ繰り返し
掛ける数の桁をX数値をIとする
掛けられる数の桁をY数値をJとする
K=I*J
K掛ける10のX+Y乗(10の乗数Xの掛け算)
演算結果変数宣言+=K

割り算
演算結果変数宣言=0
i=1
while 1
割られる数<割る数*10のi乗(10の乗数iの掛け算):break
i++
wend
i--
tmp=割られる数
for iii i回
for ii 1~10
tmp<割る数*ii*10のiii乗(10の乗数iiiの掛け算):break
next
ii--
tmp-=割る数*ii*10のiii乗(10の乗数iiiの掛け算)
演算結果変数宣言+=割る数*ii*10のiii乗(10の乗数iiiの掛け算)
next

フローチャートのはずがだんだんHSPっぽくなっていったとかw

2012年7月24日火曜日

色々な直線

前のmoduleを使用して色々な直線を引いてみました
本当は方程式を解いて直線ぴーん。がいいんですけど(笑)
本当はそうするつもりなんですけど
一般化がよくわかりません(笑)

そんな訳で今後の展開に期待!です

#include "FILE_draw_graph_sub.hsp"
 graph_init
 
; y=x
 color $ff,0,0
 graph_line 300,300,-300,-300
; y=-x
 color $80,0,0
 graph_line -300,300,300,-300
; y=10(%)
 color 0,$ff,0
 graph_line 300,30,-300,30
; x=-10(%)
 color 0,$80,0
 graph_line -30,300,-30,-300
; y=2x
 color 0,0,$ff
 graph_line 150,300,-150,-300
; y=0.5x
 color 0,0,$80
 graph_line 300,150,-300,-150
; y=0.5x+20(%)
 color 0,$ff,$ff
 graph_line 300,150+60,-300,-150+60
; y=0.5(x+20(%))
 color $ff,0,$ff
 graph_line 300,150-30,-300,-150-30
 draw_zahyoujiku
 stop

グラフ描画モジュール

自費出版の書籍には色々とグラフを載せたいと思ってまして
そうなると誰がグラフを書くのかよくわからなく
編集の人に頼むと費用がかさむことが予想され
なので自分でグラフを書いてしまえwと
まずはx軸y軸と目盛を書いてみました
ちなみにグラフは目盛の意味する数値をグラフごとに用意するのがめんどうなので
単位は%です
1とか10とか100とかじゃなく
1%とか10%とか100%として読んでください

ちなみに使用言語は描画なので楽なHSPです。知らない方、ごめんなさい

// FILE_draw_graph_sub.hsp
/*
 graph_init
 
 color $ff,0,0
 graph_line 300,300,-300,-300
 color 0,$ff,0
 graph_line -300,300,300,-300

 draw_zahyoujiku
 stop
//*/
#module m_draw_graph
#deffunc graph_init
 screen 0,600,600
 return
#deffunc graph_line int p_x_A,int p_y_A,int p_x_B,int p_y_B
 tmp_x_A=p_x_A+300
 tmp_x_B=p_x_B+300
 tmp_y_A=600-p_y_A-300
 tmp_y_B=600-p_y_B-300
 line tmp_x_A,tmp_y_A,tmp_x_B,tmp_y_B
; line  tmp_x_A,0,0,600
 return
#deffunc draw_zahyoujiku
 color 0,0,0
// x軸の座標軸描画
 line 299,0,299,600
 line 300,0,300,600
// y軸の座標軸描画
 line 0,299,600,299
 line 0,300,600,300
// x軸の+の目盛描画
 repeat 10,1
 x1=300-5
 x2=300+4
 line x1,(300-(30*cnt)),x2,(300-(30*cnt))
 loop
// x軸の-の目盛描画
 repeat 10,1
 x1=300-5
 x2=300+4
 line x1,(300+(30*cnt)-1),x2,(300+(30*cnt)-1)
 loop
// y軸の+の目盛描画
 repeat 10,1
 y1=300-5
 y2=300+4
 line (300-(30*cnt)),y1,(300-(30*cnt)),y2
 loop
// y軸の-の目盛描画
 repeat 10,1
 y1=300-5
 y2=300+4
 line (300+(30*cnt)-1),y1,(300+(30*cnt)-1),y2
 loop
 font "",10
// y軸の+の目盛(数値)描画
; pos 0,0
; mes "100"
; logmes ""+ginfo_mesx//15
; logmes ""+ginfo_mesy//10
 _4mes_n=100
 repeat 10,0
 pos (300-5-15),(cnt*30)
 mes _4mes_n
 _4mes_n-=10
 loop
// y軸の-の目盛(数値)描画
; pos 0,0
; mes "-100"
; logmes ""+ginfo_mesx//20
; logmes ""+ginfo_mesy//10
 _4mes_n=-100
 repeat 10,0
 pos (300-5-20),(600-cnt*30-10)
 mes _4mes_n
 _4mes_n+=10
 loop
// x軸の-の目盛(数値)描画
; pos 0,0
; mes "-100"
; logmes ""+ginfo_mesx//20
; logmes ""+ginfo_mesy//10 
 _4mes_n=-100
 repeat 10,0
 pos (0+cnt*30),(300-5-10)
 mes _4mes_n
 _4mes_n+=10
 loop
 
// x軸の+の目盛(数値)描画
; pos 0,0
; mes "100"
; logmes ""+ginfo_mesx//15
; logmes ""+ginfo_mesy//10
 _4mes_n=10
 repeat 10,0
 pos (300+(cnt+1)*30-15-1),(300-5-10)
 mes _4mes_n
 _4mes_n+=10
 loop
 return
#global

物語

出来る人ってそれに対して物語があるとか

プログラミングするとか、読書するとかは
小さい物語なのかな?
プログラム(小さいけどw)を完成させたい。とか
これを読破する!とか
僕はあんまり大きい物語はなくて
まー2個くらいある気もするけど
それもなんか曖昧やし
小さい何個かの物語を並行してこなしてるってのが僕の日常
そー言えば英語も少々勉強してるけど
それも出来る高校生くらい英語が上手くなって
英語サイトを色々巡回したいという物語♪

そしてもちろん自費出版に向けて頑張るのも僕の物語♪
曖昧すぎて全然はかどりませんがw

2012年7月12日木曜日

高階関数

なんでHSPには高階関数無いんだ?Javaにもw

いやHSPで継承もどきしてて
#modfuncが継承したい数必要なんです
自動で命令継承してくれればいいのに
そういう言語が作りたい
って思ったら
高階関数があればいいのか。と
関数もらってオブジェクトに対して実行すればいいのか。と
でもよく考えれば多重継承が出来ればいいのか

例えばStringのオブジェクト
初期化。set getのメソッドを持つのを2個持ってたとして
単継承だと2個継承出来ないし
それ継承すると他継承できないし
継承したい時毎回6つメソッド作るのめんどくさいし

でも多重継承だとなんとかなりそw
Rubyみたいにmix-inでもいいですね
Rubyには高階関数あるけどw
って気付いたw
まぁ。何もせず命令呼ぶだけやから
たいしたことないっちゃーたいしたことないんですけど
めんどくさいけどね

僕は主にモジュールを作成しているので
それを対象とした言語作成とか目指してもいいのかな?

2012年7月11日水曜日

価格と販売量の関係

グラフありますよね
需要と供給と価格のグラフで
価格と販売量はその接点で決まるってグラフ
有名なグラフです
高校でも軽く習ったような
大学でもよく出たような
(僕は経済学部卒です)

で、その需要曲線とか供給曲線を求める仮の数式を考えました
たぶん2、3年前に

現在の供給をX
現在の価格をYとします

その上で例えば
価格が20%下がれば
販売量が2倍になるのです
更に価格が20%下がれば
販売量が更に2倍になるのです

価格が20%上がれば
販売量は半分になるのです
更に価格が20%上がれば
販売量が更に半分になるのです

価格を安くしたい場合
Y2:売りたい価格=(Y1:現在の価格)の0.8のZ乗
なら
X2:売れる数量=(X1:現在売れている数)の2.0のZ乗
になります

価格を高くしたい場合
Y2:売りたい価格=(Y1:現在の価格)の1.2のZ乗
なら
X2:売れる数量=(X1:現在売れている数)の0.5のZ乗
になります

僕が自費出版用の文章に載せるプログラムの終着駅の一つは
この数式を解くプログラムを作成することです
単純だけど難しそうで先は長いです

税金

最近、消費税増税が話題ですね
で、税について考えた

小飼弾氏が相続税の税率100%にすべきと書いていました
それなら財産税という考え方も出来ますよね
個人でも企業でも財産税

例えば相続税が100%じゃなく
毎年、財産の2%を税金で取られるかんじ
現状、相続税の対象もある額以上なので
財産が3000万円ある人はそれ以上の分の2%を税金にもっていかれる。と
企業は資産から負債を除いた分の1%を税金として支払う
ある額以上じゃないので1%。と

これは思いつきのようだけど
前、標準の利子がマイナスだとどうなる。と思考実験したことがあって
なら預金しなきゃいいか。って
そういう結論なんですけど

利子をマイナスにせずに
資産に税金をかけるんです
利子をマイナスにするようなものです

昔、利子が高かった頃
利子は収入のようで収入じゃなかったんです
資産も利子で増えるけど
それ以上に国内総生産が増えるので
相対的に財産の価値が減るんです

ならゼロ金利の利子で財産税を取られても
相対的に財産の価値が減ることは変わりません
財産は増やす能力のある人が維持できて
ない人は維持できない
それでもいいと思います

2012年6月8日金曜日

数式型

さっきの記事にも書きましたが
僕は言語内言語をノウハウがたまってきた頃作成したいです
世間的にも自分的にも

ずっとなんとなくプログラミング言語に欲しいこと
それは数式型です

現状で数式を表現するとしたら
例えば数式っぽいメソッドを揃えたクラスの子クラスとして
プログラムとして数式を表現して解を返すとかなんかな?
そう言えば、最近Amazonで買った小飼弾氏の
「アルファギークに逢ってきた」という書籍の中で
Perlが数学を解く時に割と好まれるみたいな記述がありました
数式を解こうとしてるからここではPerlがメインとしてるのかな?

子クラスのプログラムとして数式を表現したいのではなく
「数式型」みたいのが欲しいんです
さっき出た最近書いたHSPのモジュール
(数値が指定の値より小さかったり別の指定の値より大きかったらメッセージが返ってくるやつ)
では数値と演算子を代入するんですけど(代入された演算子と数値によりメッセージを返すか判断してます)
本当は数式を指定したいんです

条件分岐クラスがあってtrueとfalseにメッセージを指定するとかもいいですね
でも条件分岐をインスタンスに設定するには現状では要素が不確定すぎます
x>minimumくらいの条件分岐ならいけそうですが
!((max>x)&&(x>min))とかも考えられ
set_numerical_formula(!((max>x)&&(x>min))),"illegal","normal")
p1:条件式
p2:条件を満たす時に返すメッセージ
p3:条件式を満たさない時に返すメッセージ
とかで値を設定したいんです

と、なんとなく考えていたことを書いてきましたが
だんだんあやふやになってきたので続きはいつか
(ものすごい遅いかもしれない 笑)

オブジェクト指向 その2

なんだかんだ言って、現在の僕はオブジェクト指向は
全然やったことありません
主にやってるのもオブジェクト指向が貧困なHSPですし
Perl5もオブジェクト指向弱いですし
でもちょっとずつわかってきました
たぶんJavaを勉強中だからだと思います
そんなオブジェクト指向使ったことのない僕における
オブジェクト指向の良さってのは
インスタンス変数のコピーです
後、アクセス許可とか
今やってるのはループのカウンタとかをインスタンスにして格納してます
違う変数にしちゃうと、共通の操作とかめんどいんで
インスタンスにすると楽ですね
違う変数なんだけど処理は同じっていう
そしてインスタンス変数に使用許可とかつけれることも
という訳でカウンタをゲッター取得にしちゃってます

そんな話はその概念が深まってからとして
最近はオブジェクトとメッセージの関係について考えていました
というのも僕がオブジェクト指向とはなんぞやっていう疑問に対する回答には
メッセージという概念が深く関わっています

HSPにモジュール変数が追加された時に(簡単なオブジェクト指向なんですけど)
その頃はたいしてプログラミングしてない頃で
カプセル化だの継承だのの利点はよくわからなく
でもメッセージという概念はしっくりきたんです
あの頃、図書館でオブジェクト指向に関する書籍を借りたりして
2、3冊読んだかな?
オブジェクトにメッセージを送り
オブジェクトがメッセージを受け取って
オブジェクトなりの振舞いをする
そんなかんじの説明がいいかんじでした

例えば(例は悪いかもしれませんが)
HSPだとボタンを押すと指定したラベルにjumpします
visualC++だとボタンを押すとイベントを起こすんです
僕は(楽だから 笑)jumpする方が好きですが
ボタンを押すとイベントを起こすイベント駆動の方が
メッセージの送り方、受け方的にオブジェクト指向なんだなって思います

最近、メッセージに注目したHSPのモジュールを書いてて
例えば自分のHPをインスタンスとしたモジュールで
敵が攻撃して自分のHPが0以下になったら"YouLose"というメッセージが返ってきます
"YouLose"というのは設定した文字列で設定しなければ"tooSmall"というメッセージが返ってきます
自分のHPが0以下にならなければメッセージは返って来なくて戦闘継続です
"YouLose"というメッセージが返って来たら戦闘終了という分岐です
これは条件分岐をメッセージの受け答えにした条件分岐です
確か2、3年くらい前になんとなく考えたのを思い出してやってみたら上手くいきました
条件分岐って意味が直観的にわからなくて
命令呼び出しにして、命令名で動作を匂わせるこの方式はアリだと思っています
中規模以上のプログラムのメインの処理って
即値や即計算ってのを極力排除して、全て名前付きの動作にするべきだと思ってたりします

僕はこれでもプログラム言語を作成してみたいって思っているんですけど
僕はプログラムを書くのが遅すぎるので無理(笑)って思ってた時期もありますが
僕はプログラムを書くスピードは普通だと思いますが
プログラムの方針を決めるのが遅いです
そう言えばルートの計算のプログラムを書くの一年くらいかかりましたし(笑)
どうやって書けばわからないのでゆっくり考えているうちに一年くらいかかりました
普通に書けばいいのに、自分の感覚に近い形で書きたい。とか考えてたら遅くなるんです
まつもとひろゆきさんみたいにパッと決めてパッと実装できなきゃ
何万行もある動作の濃いプログラムは書けないと思ってました
僕は書きたい動作に集中できないタイプですし
でも、実験用の言語内言語なら書けるかもしれない。と思うようになってきて
スローペースでそんなかんじの写経をしています
でもオブジェクト指向の方針が決まってなくて
オブジェクト指向は上にある言語まんま利用すればいいかな?
と思ってたんですが
プログラム言語を作成するとしたら
メッセージを送る。受け取る。という機能に着目したオブジェクト指向を編み出したいですね
と言ってもすぐプログラム言語に全力を尽くす気もなく
このブログを書きながら3、4年たって
言語内言語作成のノウハウがたまってきたらってかんじですけど

オブジェクト指向

オブジェクト指向とは何ぞや?
その問いに一つの視点をみつけました

オブジェクト指向とは数値の単位みたいな面もあるのではないか?
例えば数値があって
あるオブジェクトの中ではcmだったり
あるオブジェクトの中ではkgだったりするんです
同じ数値とはいえ、意味が違う
更に数値が長さのオブジェクトがあったとしても
単位がcmだったりmだったりkmだったりフィートだったり
こういうのは数値を持つ意味は違えど変換できます
こういうのは同じ親クラスを持つ子クラスに分類できるかもしれません
Rubyだと数値もオブジェクトなので
intオブジェクトdoubleオブジェクトbignumオブジェクトとかが
この例にあてはまります

オブジェクトの中身がcmとgのオブジェクトがあったとして
それの値段を求める。とかはポリモーフィズムにあたります
中身の種類が違えど同じ操作をする

商品って色々ありますが
値段という共通の属性があります
オブジェクトの中身が商品というオブジェクトを扱うプログラムでは
値段はすべての親クラスになりますね
Objectクラスみたいなものです

オブジェクトの振舞いが、移動する。穴を掘る
特定の位置で穴をほれば、宝物が出る
その問題を解決するプログラムを考えてみよう
目的は宝物を入手することです
そのために穴を掘ったり移動したり探したりする
穴を掘る。のと、移動する。のは全然違う動作です
しかし宝物を入手するという目的において二つの動作の目的が一致します

オブジェクトがある。オブジェクトは振舞う。プログラムは目的がある
そう考えるなら、プログラムの発展の次のステージにはAIが必要かもしれません
目的を目指すために、振舞いを選択し、振舞うようにメッセージを送るのです
その選択、実行をAIが担うのです

例えばGoogleで検索という動作について考えてみましょう
オブジェクトとして
名称、種類。の二つを設定します
名称と種類の(あらかじめ格納してあるとする)リストを読み込んで
種類がGAMEなら「名称 攻略」で検索
種類が芸能人なら「名称 動画」で検索
これを発展させたAIを導入してAIで検索を決定し実行するのです
なんかAIよりデータベースの方が向いてそうですね
でも、GOOGLEで調べたいんだけど名称がわからない。そういう場合に利用できそうです

例えば僕はあの芸能人の名前誰だっけ?ってよくなるんですけど
「芸能人 女性 過去半年くらいの間でぴったんこかんかんに出てた」
ってかんじのキーワードからキーワードに当てはまる芸能人の女性のリストを出して欲しいんです
僕の例においては米倉涼子でした(笑)
GOOGLEで調べても全然わからなくてmixiのぴったんこかんかんのコミュで見つけました(笑)
でもこんなかんじでわからない名称をキーワードから探してくれるAIはあって良さそうです
最近は英語の翻訳とかも進化しているので、こんな発展もできそうですよね
僕は主にHSPを使用していますが、わからないことが、公式BBSにあることがあるらしく
検索すればいいみたいですが、名称がわからないと検索できないので
キーワードからリストアップして欲しいです

こう書くと高度なAIを想像するかもしれませんが
幾つかの条件分岐の集まりも簡単なAIと言っていいかもしれません
そう考えると、大体のプログラムはAIという形式ではなくとも
簡単なAIを構成していると言ってよいと思います
更にはプログラムを作成すること自体がAIを構成するという作業であり
プログラムを試行錯誤しながら作成することもAIを構成することでしょう
と、定義するならばプログラミング言語もAIを構成しやすい方向に進化するという考えもありですね
RubyはAIを使用しているという意見も読んだような読まないような

PCを使用していると情報が多く(このくだりにおいてはプログラミングにおいては。ですね)
こんなことをしたい。それにはどんなAPIを使用すればいいのか?
このAPIと似たAPIにはどのようなものがあるのか?
このAPIを使用したサンプルプログラムを探したい
探したいことも多いし、変な情報も多い
(知りたい情報という観点から変な情報ですね)
変な情報が多いのは仕方ないとしても
そういう時にAIが動作して探し物をしたい。とは思います

僕はAmazonで書籍を買うことも多いのですが
どんな書籍があるのか?
どのような時に読むべきか?
よくわからないので大体著者買いです
CDレンタルする時もどんな曲があるかわからないので
アーティスト名でレンタルします
期待している書籍(内容)からお勧めの書籍を推薦して欲しかったりします
ジャンルがわかってる時はジャンルで検索しますが
最近だとvisualC++で検索してExpressっぽい解説の書籍をAmazonで買いました
やっぱり体系だった解説だったり、全体像の把握はWEBでは拙いので
書籍は必要ですよね
書籍とはあれだけの量の文章が詰まっているんですもの
例えば、公式の(書籍において)宣伝文とかあって良いと思います
後、対象とかこんなことを読みたいと思っているであろうキーワードとか
NETで本を買うって割と普通になってきたので
なので公式の(書籍において)宣伝文とかキーワードがあって
NETに紹介する時はそれを掲載して良い。とかそういう制度が欲しいですね
逆にキーワードからこういう情報は望まれているけれど扱った書籍がない
という観点から書籍の発行を企画したり

PCには使用していると情報が多いと書きましたが
このくだりにおいてはPC操作という側面から書いてみます
例えば、僕はたまに思い浮かんだ鼻歌を携帯に録音するんですが
前の携帯で録音した鼻歌がサイズが大きくて再生できないんです
なのでPCに取り込もうとしてPCに接続してもPCから携帯にアクセスできない
携帯は接続しました。みたいなメッセージがあるんですけど
どうやったらアクセスできるかわからない
ドライバはDLしてインストールしたんですが
ショートカット作成します。とか出てたぶんそれに失敗したぽい
ウィルス駆除ソフトが活躍した疑惑
もう電話で問い合わせるしかないな。ってかんじです

PCを操作しているとどこをどうすればよくわからない
僕はノートPC派なんですけどWiFiの接続の仕方もよくわからない
そういう時にキーワードからやり方を教えて欲しいんです
マニュアルをきちんと読めって話でもありますが
キーワードによる検索はPCならではであり
なんか僕のノートPCはマニュアルが薄い気がし
昔のPCの方がマニュアルが厚かった気がし
高いお金を出して製造してるPCなんだから
オンラインマニュアルでいいからマニュアルを充実させて欲しいです
マニュアルのわかりやすさってPCの売りとしては弱いですが
メーカー的にマニュアルが充実しているかしていないかは方針としてありであり
結局はマニュアル読まないでサポート利用する人も多そうですが
メーカーの方針としてサポートの厚さは売りになると思う
そう言えば僕のDVD時代に買ったHDDR一回もDVDにバックアップしたことないな(笑)

2012年4月22日日曜日

なぜPerlで書くのか?

自費出版掲載のスクリプトは主にPerlで書く予定です
で、僕は何故Perlで書くのか?

・Perl5.xはほぼ言語仕様が確定している
Rubyを勉強してRubyで書いてもいいんですけど
Rubyはver upするとスクリプトのメンテナンスが必要な気がします
WEB上だとメンテナンス出来ますが、書籍上だとできませんよね
そういう意味で自費出版用のプログラミング言語としてPerlの良さがあります

・スクリプト言語である
なんでスクリプト言語にこだわっているんやろ?
HSPもスクリプト言語ですし
(ちなみに僕は主にHSPやってます)
でもスクリプト言語って手軽に書いて手軽に実行ってイメージありますよね
手軽に書きたいとは常々思ってますけど
Cも言語仕様がほぼ確定してますが、スクリプト言語じゃないから採用しないのかな?
ちなみに今は何回目かのJavaの勉強中だったりします
JavaとPerlを比べたらやっぱりPerlの方が手軽ですよね

・割とメジャーであり、研究用っぽいイメージがある
僕は主にHSPやってるんですけど、HSPってマイナーですよね
ってか研究用のスクリプトをHSPで書く人はいるのでしょうか?
研究用としてはCやLISPがメジャーなのかな?イメージですが
Cより研究用として向いていそうであり
LISPよりメジャーではあります
LISPは読みやすさ。より書きやすさに重点を置いているかんじしますよね

・色々と便利な機能がそろっている
Perlと言えば正規表現
僕は正規表現を書いたことは一度もありませんが
でも正規表現を除いても便利な機能があります
主にハッシュとリスト
CはハッシュとリストがないからPerlを採用した面も大きいです
ハッシュは使うかどうかわかりませんが
リストは使いたいです
リスト(実際は配列をこう使う予定です)に確率をぶちこんで
平均確率とか平均の点数とかを求めたいです
HSPにはハッシュとリストがないのがメインにしたくない理由です

・文字列操作に強い
CとPerlを比べて、ここでの一番のPerlの魅力は文字列操作に強いことです
Cの文字列は連結関数だとか比較関数だとか直勘的でないです
Perlは文字列操作に強いですよね
数値演算が主ではありますが、直観的に文字列操作ができるのはPerlの魅力です

・直観的に書ける
僕のプログラミング・スタイルにおいて直勘的に書けることは重要です
HSPでも直勘的な書き方がしたくて、よくラッピングします
色々な書き方が出来るのはPerlの特徴であり
その中で出来るだけ僕の直勘に近い書き方をして行こうと思っています

・第二言語としてHSP
自費出版用の文章に載せるプログラムは主にPerlで書く。と決めましたが
それでも第二言語としてHSPを使用する予定です
用途はグラフ描画です
HSPでグラフを描画するスクリプトを書いて自分でグラフを描けば
自費出版の費用も安くなるかなって
更にX軸Y軸Z軸の三次元的なグラフを3Dで描いて見やすく回転しよう。だなんて考えています
簡単に3Dの画像を書けるのはHSPの特徴の一つですよね

2012年3月2日金曜日

桁の小さい平方根の計算

とりあえず桁の小さい平方根の計算の処理は完成しました
次はBIGFloatを利用してもう少し大きい桁の平方根を計算したいです
完成まで長かったwて、やってないから長いんですけどw

後、HSPでグラフを描くモジュールも作成したいです
Perlでグラフを描くのは僕の技量では無理w

use strict;
use warnings;

my ($r,$ans);

($r,$ans)=&small_sqrt(20000.0,0);
print $r." ".$ans."\n";

($r,$ans)=&small_sqrt(0.0002,0);
print $r." ".$ans."\n";

($r,$ans)=&small_sqrt(20000.0,1);
print $r." ".$ans."\n";

($r,$ans)=&small_sqrt(0.0002,1);
print $r." ".$ans."\n";

# 平方根の計算。計算する桁が小さい
sub small_sqrt{

# 引数A:sqrtしたい値
my $value=$_[0];
# 引数B:これが1だとprint debug
my $on_debug=$_[1];

# 返り値用
# $r:error情報。-1:数値が大きすぎる:-2数値が小さすぎる
# $ans:解
my ($r,$ans);

if ($value>=1.0){
# sqrtしたい値が1.0より大きい場合
($r,$ans)=&small_sqrt_L_in($value,$on_debug);
}else{
# sqrtしたい値が1.0より小さい場合
($r,$ans)=&small_sqrt_S_in($value,$on_debug);
}

return ($r,$ans);
}

# 平方根の計算。計算したい値は1.0より大きい
sub small_sqrt_L_in{

# 計算したい値
my $p=$_[0];
# これが1だとdebug
my $on_debug=0;
$on_debug=$_[1];

if ($on_debug==1){
printf "sqrt(".$p.")"."\n";
}

# &some_divはsqrtしたい値が1以上の時呼び出す
# sqrtしたい値は10の何乗の2乗か?求める
my ($r,$r_A,$r_B)=&some_div($p);

# &in_calc_0p1to0p0000001は実際に計算する
my $ans=&in_calc_0p1to0p0000001($r_A);

if ($on_debug==1){
printf $r."\n";
printf $r_A."\n";
printf $r_B."\n";

printf $ans*$r_B."\n";
}

return ($r,$ans*$r_B);

}

# 平方根の計算。計算したい値は1.0より小さい
sub small_sqrt_S_in{

# 計算したい値
my $p2=$_[0];
# これが1だとdebug
my $on_debug=0;
$on_debug=$_[1];

if ($on_debug==1){
printf "sqrt(".$p2.")"."\n";
}

# &some_mulはsqrtしたい値が1より小さい時呼び出す
# sqrtしたい値は0.1の何乗の2乗か?求める
my ($r2,$r_A2,$r_B2)= &some_mul($p2);

# &in_calc_0p1to0p0000001は実際に計算する
my $ans2=&in_calc_0p1to0p0000001($r_A2);

if ($on_debug==1){
printf $r2."\n";
printf $r_A2."\n";
printf $r_B2."\n";

printf $ans2*$r_B2."\n";
}

return ($r2,$ans2*$r_B2);

}

# sqrtしたい値が1以上の時呼び出す
# sqrtしたい値は10の何乗の2乗か?求める
sub some_div{
# $r:error通知用。普通は1。10の301以上だとerror
# $r_A:繰り返しで/100.0づつしていく
# $r_b:10のX乗の2乗か?のXの値を入れる
my ($r,$r_A,$r_B)=(1,$_[0],1.0);
# $r_A=&mul_10_X_count(301);
if ($r_A>&mul_10_300_count()){
$r=-1;
}
while ($r_A >= 100.0) {
$r_A/=100.0;
$r_B*=10.0;
}
return ($r,$r_A,$r_B);
}
# sqrtしたい値が1より小さい時呼び出す
# sqrtしたい値は0.1の何乗の2乗か?求める
sub some_mul{
# $r:error通知用。普通は1。10の301以上だとerror
# $r_A:繰り返しで*100.0づつしていく
# $r_b:0.1のX乗の2乗か?のXの値を入れる
my ($r,$r_A,$r_B)=(1,$_[0],1.0);
# $r_A=&mul_0p1_X_count(285);
if ($r_A<&mul_0p1_285_count()){
$r=-2;
}
while ($r_A <= 1.0) {
$r_A*=100.0;
$r_B/=10.0;
}
return ($r,$r_A,$r_B);
}
# 計算の処理。in_calcを8回呼び出す
sub in_calc_0p1to0p0000001{
# $p:この数値以下で最も大きい数値を導きたい。等しくてもいい
# $ret0~$ret8:計算結果が入る。少しづつ小さな単位を計算して代入
# &in_calcの3つめの引数:計算する単位
my $p=$_[0];
my $ret01=&in_calc($p,0,1);
my $ret02=&in_calc($p,$ret01,0.1);
my $ret03=&in_calc($p,$ret02,0.01);
my $ret04=&in_calc($p,$ret03,0.001);
my $ret05=&in_calc($p,$ret04,0.0001);
my $ret06=&in_calc($p,$ret05,0.00001);
my $ret07=&in_calc($p,$ret06,0.000001);
my $ret08=&in_calc($p,$ret07,0.0000001);
return $ret08;
}
# 計算の処理。一桁だけ計算
sub in_calc{
# この数値以下で最も大きい数値を導きたい。等しくてもいい
my $expression=$_[0];
# 計算結果を入れる
my $exp01=$_[1];
# 計算の単位
my $unit01=$_[2];
# 返り値用
my $ans01=0;
# 乗算の基
my @for_mul;
for (0..9){
$for_mul[$_]=$exp01+($_*$unit01);
}
# 乗算の基を2乗
my @of_mul;
for (0..9){
$of_mul[$_]=$for_mul[$_]*$for_mul[$_];
# print "i:$for_mul[$_]:i*i:$of_mul[$_]\n";
}
# X以下で大きい数値を求める
for (0..9){
if ($of_mul[$_]<=$expression){
$ans01=$for_mul[$_];
}
}
# print "解の候補:$ans01\n";
$ans01;
}
#printf &mul_10_X_count(0)."\n";
#printf &mul_10_X_count(3)."\n";
#printf &mul_10_300_count()."\n";
#printf &mul_10_300_count()*&mul_0p1_300_count()."\n";
#printf &mul_0p1_X_count(0)."\n";
#printf &mul_0p1_X_count(3)."\n";
#printf &mul_0p1_300_count()."\n";
#printf &mul_0p1_300_count()*&mul_10_300_count()."\n";

# 10の引数A乗の数を返す
sub mul_10_X_count{
my $x=1.0;
my $i=$_[0];
$i--;
for(0..$i){
$x*=10;
}
return $x;
}
# 10の300乗の数を返す
sub mul_10_300_count{
return &mul_10_X_count(300);
}

# 0.1の引数A乗の数を返す
sub mul_0p1_X_count{
my $x=1.0;
my $i=$_[0];
$i--;
for(0..$i){
$x/=10;
}
return $x;
}
# 0.1の285乗の数を返す
sub mul_0p1_285_count{
return &mul_0p1_X_count(285);
}

2012年2月22日水曜日

裏テーマ

僕が今書いている自費出版用の書籍の裏テーマは
問題をプログラミングで解く。と
数式の解の近似値を得る。です

人には様々な問題がある
社会にも様々な問題がある
それをプログラミングを利用して解こう
そういうテーマです
今書いているやつには
人の問題、社会の問題を解くようなプログラミング例は
思いついていないので書けませんが
プログラミングで解けることは
数学的な問題や
物理的な問題だけじゃないと思うんです
それを書籍を書くことを通して
道筋をつけたい
そういうテーマです
なので今やってるルートの計算なんて
(それが終われば2乗である数になる近似値だけじゃなく
 X乗(まずはXは整数)すればある数になる近似値を解くプログラムを書きたいです)
ググれば出てきそうですが
あえて自力で解こうと思っています

数式の近似値を得る。というテーマは
数式の解を解くって難しいんですよ
3次式の解を求める解の公式とか
やたらややこしいんですよ
でもそれは近似値ならば少数として
より把握しやすい値になるかもしれない
正確な解ってややこしいし
解き方も難しいし
なのでコンピューターの力で
強引に近似値を得てしまおう
書籍に載っているやり方を応用して
式の解を強引に得て欲しい
そういう道の道筋をつけたい
そういうテーマです

2012年2月17日金曜日

とりあえず

とりあえず、ルートを求める処理は出来てます
少々の改良と
(改良ってかスクリプトのサブルーチン化で呼び出せるように。です)
コメント書くのとサブルーチンの名前のリファクタリングが
TODOとして残ってるんですが
中途半端でも載せれば、眺めながらやる気出るかもしれないので
載せときますw

追記:一応、スクリプト完成したので削除w

2012年2月16日木曜日

自費出版を目指すブログ

TACKは数学っぽい経済学っぽいプログラミングっぽい書籍を自費出版するのが夢です
数学と経済学とプログラムを足して3で割ったような書籍です
あんまり言ってないんですが(笑)僕の夢は作家になることです
作家は何冊も書かなければ作家とは言えなく
文章を書くことは好きですが、作家になれるほど大量に書いている訳でもなく(笑)

インタプリタ/コンパイラの作成を目指すブログ で
このネタ書籍で使えるかも?と思ったネタを書いたので
それを機にGOOGLEのブログに投稿しながら執筆していこうかな?
と、考えるに至りました

はてなの方が見てくれそうですが
GOOGLEのブログはアフィリエイト?が使えるみたいなんで
収入になるかもしれないし
こっちで書くことにしました

幾つか寝かせてあるネタもあるので
ブログに投稿しながら
それをマイルストーンとして
ある程度の分量になるまで執筆して
そしたら自費出版しようと思いました

大学でゼミの頃、空想していた概念をまとめて自費出版する!というのは作家を目指す上での最初の僕の夢です!
最初は卒論にしようと思いましたがまだ構想があやふやで、実行するのに踏み切れませんでした
あれから10年経つんだなぁ
大分形になって来ましたが
手を伸ばせば、遠ざかり
手を離そうとすると、近づいて来るようで
難しいですね
そろそろ概念をきちんと文章にすることを決意しようかな?と考えているところです
なんか理想の人みたいな概念みたい
手を伸ばせば、遠ざかり
手を離そうとすると、近づいて来るようで

自費出版したら絶版になるまで
書いた記事は削除する予定です

文章をよりよくするためのコメントもお待ちしています

2012年2月6日月曜日

BIGFloat

先日ルートを計算するPerlスクリプトを書いていて
Perlのdoubleの有効桁数は何桁だったかな?と思ってググったら
PerlにはBIGFloatがあるみたいですw
ルートの計算の後で桁の大きい少数を扱うスクリプトを書こうと思ってましたw

あろうがなかろうが自力で処理を書いてもいいんですけど
めんどくさいしwバグが怖いので
素直にBIGFloat使う予定です

ルートの計算は大筋完成していて
後は整理してコメント書いて完成です

#最近、コメント書くのめんどくさいw

2012年2月3日金曜日

上限と下限の条件分岐

rootの計算はdoubleを使ってるので
ものすごい大きい数から
ものすごい小さい数まで計算できるので
いらないかもしれませんが
一応、考え方として
どれくらい大きい数から
どれくらい小さい数まで計算できるか
決めておいた方がいいですよね

とりあえず、最大1e+300
最小1e-300まで計算できるように決めました
決めるったら決めるw

でそんなのを求めるスクリプトです

追記:doubleの下限は300桁ちょいくらいなので
doubleの桁数も考え最小1e-285に変更しました
use strict;
use warnings;

printf &mul_10_X_count(0)."\n";
printf &mul_10_X_count(3)."\n";
printf &mul_10_300_count()."\n";
printf &mul_10_300_count()*&mul_0p1_X_count(300)."\n";
printf &mul_0p1_X_count(0)."\n";
printf &mul_0p1_X_count(3)."\n";
printf &mul_0p1_285_count()."\n";
printf &mul_0p1_285_count()*&mul_10_X_count(285)."\n";

# 10の引数A乗の数を返す
sub mul_10_X_count{
my $x=1.0;
my $i=$_[0];
$i--;
for(0..$i){
$x*=10;
}
return $x;
}
# 10の300乗の数を返す
sub mul_10_300_count{
return &mul_10_X_count(300);
}

# 0.1の引数A乗の数を返す
sub mul_0p1_X_count{
my $x=1.0;
my $i=$_[0];
$i--;
for(0..$i){
$x/=10;
}
return $x;
}
# 0.1の285乗の数を返す
sub mul_0p1_285_count{
return &mul_0p1_X_count(285);
}

2012年1月23日月曜日

いきなりサブルーチンを書く

現在やっていることは
ルートの計算なんですけど
ちょっと行き詰ってました

現時点で100以下の数値のルートは求めれるんですけど
(1以下の数値は有効な桁が少なくなりますが、たぶん求められる)
100以上の数のルートをどうやって計算しようかと

1e+3以上1e+5以下なら求める数字を1e+5で割って解を1e+3で割って
ちなみに1e+xとは10のx乗のことです
1e+3は100。1e+5は10000です
ちょうど1e+(2n+1)以上1e+(2n+3)未満になるように
再帰的な解決の仕方をしようと考えていたんです

でも、再帰で解こうとしたのが誤りで
結局繰り返しで解くことにしました
解を求める数字が100以上なら100で割り返り値Bにする変数に10掛けます(初期値1.0)
更に100以上なら同じ計算を続けます
何回か100で割った数値を返り値A
何回か10で割った数値を返り値Bとします
返り値Aのルートを求めて返り値Bをかけると、計算の出来上がり
1.0より小さい数も似たような計算で処理します

やっぱ僕は再帰苦手やわー
処理の全貌がつかみ難いのが苦手です
後、処理を書いてからサブルーチンに分割しようとしたのも敗因です
いきなりサブルーチンを書いてくっつけるのも良い手段ですね
ちなみにこの処理はまだメモを書いただけで
これから処理を書く予定です