ホーム > タグ > Concurrent Clean

Concurrent Clean

セキュリティおよびPHPいじめwの話

最近なんか多いですねぇ。セキュリティに絡んだPHPとそのユーザいじめ。

でもさぁ、僕はPHPもRubyもPerlもPythonもやるけど、どれも似たり寄ったりだと思いますけどねぇ。

確かにPHPは標準関数のネーミングとかに行き当たりばったり的なものを感じるし、文字コード周りの妙な自動化処理は気に食わないけど、それって、関数に別名つければいいし(そうするだけの価値があるなら)、文字コード周りのこともその回避策を知ってれば済むはず。

逆に言えば、妙な挙動が文字コード周りに限定されるから回避もしやすいけど、言語仕様レベルでクラスの妙な挙動を許しているPerlとか、そっちのほうが問題かと。

なので実際には、「PHPのhtmlspecialcharsはけしからん!」と言えるだけマシだと思うんですよ。だって、他の言語で書かれたhtmlspecialcharsよりもけしからん名もないhtmlspecialchars的な処理が現実にwebサービスとして動いてるほうが怖いですよ。(もちろんPHP vs その他という構図ではなくて。)

啓蒙しづらいし、修正方法も教えにくい。

ただ、僕がPHP好きで他が嫌いかといったらむしろ微妙に逆です。上に挙げた4つの中では微妙にPythonが一番ですけど、でもPHPをVB5に例えるなら、他はVB6くらいにしか見えません。つまりどんぐりの背比べ。

どの言語でも等しく選択する機会が与えられればPHPは使いませんが、世の中の共用レンタルサーバってmod_phpは入っててもmod_perlは入ってないし、RubyとPythonは実行環境すらないのが普通なので、どうしてもPHPになってしまいます。

自分の好きな言語のユーザを増やしたかったら、ネガキャンやって足引っ張ってないで、どんな鯖管でも真っ先に入れたくなるような共有環境でも問題のない「素性のいい」mod_なんとかを作れば良いんですよ。

話は少し変わるのですが、こことかここをみて、もやもや感が晴れた感じ。

やっぱりまずは作ってナンボの世界ですよ。もちろん最初から最後までセキュリティ糞食らえじゃダメだけれとも、少なくともセキュリティのことを考えるのは設計してプロトタイプを作った後にするべきです。

セキュリティって画一的にこうしておけば良いってもんじゃなく、個々の場合に応じて考えられるべきなので、その「個々の場合」ってのがはっきりしないうちから考えるのは時間の無駄です。

僕にも昔ありました、セキュリティやオブジェクト指向のことばかり考えて悦に浸ってるけど、実際は何も生み出してない時期が。

それは今考えるとまったくの無駄って訳じゃないけども、まるで好きな人に告白する場面を何百回もイメトレしたけど、100万分の1の確立のことにまで考えを巡らせすぎて行動を起こせなくて期を逃すみたいな。

先に行動すれば、結果が良くても悪くても得るものはあるのです。結果が良ければその結果自体を、結果が悪ければ「その方法はダメだった」という事実を得ることができます。

学ぶ者としては、そのほうが学ぶスピードが格段に速いと思います。

PS.

Web系に限らなければConcurrent Clenが最高だと思います。他の言語はクソですよ。本気でそう思います。

しかしそう表明することにどれほどの公的な価値があるでしょうか?

Concurrent CleanでFizzBuzz

“Concurrent Clean FizzBuzz”で検索して来られる方が最近何人かいらっしゃるので、期待にこたえるべく?Concurrent CleanでFizzBuzz問題を解いてみました。

Cleanは久しぶりで色々なことを忘れてたので、今日はとりあえず的な書き方で作ってみました。

生まれてから何日経ったか

本当はこれ、20日に書かなきゃいけなかったことなんですが、

わたくし、8月20日に誕生日を迎えまして、26歳になってしまいました。

26歳なんておっさんじゃないですか。
会社の人はみんな10歳以上年上なので、まだ若者のつもりでいたのですが、
今、新卒が入ってきたら4歳も年上じゃないですか。
おっさんですよ紛れもなく。
そして肝臓からはγ-GTP垂れ流し。

でまぁ、誕生日だと言っても、友達一人からちょっとしたプレゼントもらったり(感謝!)
好きな人に耳元で「お誕生日おめでとう」と囁かれた以外は、
休日出勤で普通に仕事でした。

ええ、実は今回は実験とか研究とかと言えるものは何もしてないのです。
仕事も忙しいし。
って割には会社のおっさん3人でエアガンを使った射的大会を事務所内でやってましたが。

しかし、ネタは作るもの。
生まれてから26歳の誕生日まで何日経ったか計算してみます。

ただ、普通に手計算してもマンドイだけなので、プログラム組んで計算してみます。

使用言語はなんと・・・Concurrent Clean!!!

関数型言語ですよ。
http://sky.zero.ad.jp/~zaa54437/programming/clean/
ここを参考にしながら(パクリながら)作ってみました。
いきなり以下ソースです。

module testproj

import StdEnv, StdDebug

//***** 生まれて何日経ったか *****
Start =dateDiff 1980 8 20 2006 8 20

//閏年か否か
isLeap year = (year rem 4 == 0) && ((not (year rem 100 == 0)) || (year rem 400 == 0))

//年の日数を返す
daysOfYear year
|isLeap year = 366
|otherwise = 365

//月の日数を返す
daysOfMonth year month
|month == 1 = 31
|(month == 2) && (isLeap year) = 29
|(month == 2) && (not (isLeap year)) = 28
|month == 3 = 31
|month == 4 = 30
|month == 5 = 31
|month == 6 = 30
|month == 7 = 31
|month == 8 = 31
|month == 9 = 30
|month == 10 = 31
|month == 11 = 30
|month == 12 = 31

//0年1年1日からの経過日数を返す
dateSerial year month day
= sum (map (\x->daysOfYear (trace (toString x +++ “\t”) x)) [0..year - 1])
+ sum (map (\x->daysOfMonth year x) [1..month - 1])
+ day

//2つの日付の差を日数で返す
dateDiff sYear sMonth sDate dYear dMonth dDate
= (dateSerial dYear dMonth dDate) - (dateSerial sYear sMonth sDate)

以上ソース終わり。

デバッグ用のコードが紛れ込んでるのでこのままでは実行結果が汚いですが、
一応、26歳の誕生日で9496日経ったと結果が出ました。
合ってるかどうかは分かりませんが、たぶんそのくらいでしょうw
9496を365で割ったら26.~ってなったのでたぶんあってると思いますw

にしても関数型言語ってなんか夢を感じます。なんとなく。
ってのを今回の結論とさせていただき、今回は終わりたいと思います。なんだそれ。

トップページ > タグ > Concurrent Clean

検索
フィード
メタ

ページの最初に戻る