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);
}