PHPがサーバサイドでJavaScriptがクライアントサイドだから、
まぁするとしたらJavaScriptからAjaxでパラメータを投げてPHPで処理して結果を返す、
みたいな流れがいいんだと思います。
でも短時間で何十回もそのロジックを使いたいときはどうするのか、
HTTPリクエスト出しすぎて超重いんですけどみたいな状態になるようであれば、
上記の方法はあまりとりたくありません。
(というかだいたい上記の方法で事足りて、ここであげてるようなケースは
極々稀じゃないのかとは思いますが)
PHPのコードをなんとかJavaScriptのコードまで変換できたらなぁとか思って、
Hiphop-phpでC++へ変換して、llvm-gccを使ってコンパイルして
llvm-disで逆アセしてemscriptenでJavaScriptに変換とか考えましたけど、
llvm-gccのバージョンが4.2、Hiphop-phpが要求するGCCのバージョンは4.3以上
ということで、試す間もなく挫折しました。
というかHiphop-phpで実行モジュール作る時に、色々なライブラリをリンクしてる時点で
JavaScriptのコードにまで変換させるのは無理じゃねっていう。
あれこれ考えてみたところ、Luaでコードを書いて、
PHP側ではPECLのLuaモジュールを使ってLuaのコードを呼び出す、
JavaScript用にはlua2js(https://github.com/mherkender/lua.js)を使って
LuaのコードをJavaScriptに変換して使う、
っていうやり方でいいかなという結論にしました。
ただPHP側にしろJavaScript側にしろ、Luaの関数等を呼び出すときの記述が
若干長ったらしいで、記述するめんどくささを緩和できるラッパークラスのような何かを
作る事が出来たらいいなと思っています。
Showing posts with label Programming. Show all posts
Showing posts with label Programming. Show all posts
Thursday, May 24, 2012
Sunday, May 20, 2012
カリー化と部分適用
カリー化と部分適用の違いのメモ。
三つの変数を取って値を返す関数fを
f: X,Y,Z → V
として、カリー化や部分適用した後の関数をgとしたときに、
それぞれgは下記のようになる、と。
三つの変数を取って値を返す関数fを
f: X,Y,Z → V
として、カリー化や部分適用した後の関数をgとしたときに、
それぞれgは下記のようになる、と。
- カリー化
- g: X → (Y → (Z → V))
- 部分適用(Yを固定する場合)
- g: X, Z → V
fをカリー化したgだったら、Vを得るまでに、引数Xを一つ与えて返り値として関数を得て、その関数に次の引数Yを与えて…と、一つの引数をとる関数をチェーンした形で呼び出すようになる。部分適用みたいに引数が固定された状態にはならない。gを呼び出してVを得るまでに、X、Y、Zの三つの値を決めなければならない。
fに部分適用を施したgだったら、fのいくつかの引数の値が固定されて、fに比べてgは引数の数が減る。カリー化したgみたいに関数をチェーンして呼びだすなんて出来ない。gを呼び出してVを得るまでにはXとZの二つの値を決めなければならない。
部分適用は日頃ばんばん使いまくってるけど、カリー化はどういうケースで使うんだろう。
カリー化すると部分適用しやすくなるとか、"複数の引数をとる関数を、一つの引数のみを取る複数の関数のラムダ計算などの単純な理論的モデルと見なして研究できるようになる"とのこと(参考: http://ja.wikipedia.org/wiki/%E3%82%AB%E3%83%AA%E3%83%BC%E5%8C%96)なので、カリー化は理論寄りのツールであって、単にコードを書く場合は「ここでこの関数をカリー化して」なんていう場面はあまりないのかも。
(カリー化するとこんな風にすっきり書ける、っていうテクニックがもしかしたらあるのかもしれないけど。)
だもんで、prototype.jsのFunction#curryはあまり適当ではないと感じる(部分適用のメソッド名はpartiallyApplyとかになるのかな)。
けどまぁcurryって書く方に慣れちゃってるし、タイプ数も少ないし、curryでいいnうわなにをするやめくぁwせdrftgyふじこlp;「’」
Thursday, September 29, 2011
C#でHTTP Proxy Server
C#で簡単なHTTP Proxy Server書くとしたらどう書くんだろうと思って探してみたら、
下記URLに掲載されているコードが丁度よさげでした。
http://times.imkrisna.com/2011/08/simple-http-proxy-server-c-source-code/
探し方が悪かったのか、コピペしてちゃんと動くHTTP Proxy ServerのC#ソースコードが見つからなかったのですが、
上記のはさくっと動きました。
シンプルですし、流れを把握しやすそう。
追々、あれこれいじってみようかと思います。
例えば、Twitterのツイートのフィルタリングなんかをやってみたいなと考えてます。
メインでTweetDeckを使っているのですが、フィルタリング機能が少々弱いなと感じていまして。
それができたらF#で書き起こしてみたりですかねー。
下記URLに掲載されているコードが丁度よさげでした。
http://times.imkrisna.com/2011/08/simple-http-proxy-server-c-source-code/
探し方が悪かったのか、コピペしてちゃんと動くHTTP Proxy ServerのC#ソースコードが見つからなかったのですが、
上記のはさくっと動きました。
シンプルですし、流れを把握しやすそう。
追々、あれこれいじってみようかと思います。
例えば、Twitterのツイートのフィルタリングなんかをやってみたいなと考えてます。
メインでTweetDeckを使っているのですが、フィルタリング機能が少々弱いなと感じていまして。
それができたらF#で書き起こしてみたりですかねー。
Wednesday, October 28, 2009
Programming::C# - OneNoteのファイルをいじれそう
OneNoteのページ数とかを取得するためのサンプルコードです。
http://blogs.msdn.com/descapa/archive/2006/08/13/698311.aspx
OneNoteがないと死んでしまう私としては、
これを参考にしておもろーなプログラムが作成できそうな予感がびんびんしています。
OneNoteのファイルを対象に、いろいろ情報を抽出・検索したりするプログラムとか。
OneNoteに書いた情報のつながりを抽出したり、
あるキーワードをもとにページを手繰り寄せたりとかいう機能が
OneNoteは弱い気がしておりまして。
ページとかの中身もあれこれいじくれるんだったらいいなぁ。
「Microsoft.Office.Interop.OneNote」でぐぐっても
日本語のWebサイトが劇的に少ないから、
がんばって英語を読んで情報収集するしかないですね。
ちなみに私は、OneNote以外にもホワイトボードと計算用紙がないと死んでしまいます。
自宅に900mm X 1200mmのホワイトボードがあるんですけど、
いろいろ試行を巡らせるときはこれがないとやばいですね。
ホワイトボード大好きです。
すべての壁がホワイトボードだったらいいのに(笑
ホワイトボードにメモやらマインドマップやらをかいて、
あとでデジカメで撮影します。
撮影した画像だったり、後々参照しそうなデータは整理してOneNoteにまとめておきます。
計算用紙は、あとで見返すことがないようなことを書いたりします。
頭の中の記憶領域の使用量を減らすために、計算用紙に吐き出しています。
ということで、
OneNoteは整理して後で見直すデータをまとめるアプリケーションとして使っています。
なので、いろいろ情報の抽出機能が強化できると、激しく嬉しいんですけどね。
InterConnectが面白そうな情報抽出機能を持っているかと思ったんですけど、
動作環境の縛りの関係で著しく使いづらいことがわかったので、
現在は使っていません。
最近は、日曜日は一日仕事しなくてもよいようにスケジュールを組んでいるので、
近いうちに上記のサイトを参考にあれこれ遊んでみたいと思っています。
http://blogs.msdn.com/descapa/archive/2006/08/13/698311.aspx
OneNoteがないと死んでしまう私としては、
これを参考にしておもろーなプログラムが作成できそうな予感がびんびんしています。
OneNoteのファイルを対象に、いろいろ情報を抽出・検索したりするプログラムとか。
OneNoteに書いた情報のつながりを抽出したり、
あるキーワードをもとにページを手繰り寄せたりとかいう機能が
OneNoteは弱い気がしておりまして。
ページとかの中身もあれこれいじくれるんだったらいいなぁ。
「Microsoft.Office.Interop.OneNote」でぐぐっても
日本語のWebサイトが劇的に少ないから、
がんばって英語を読んで情報収集するしかないですね。
ちなみに私は、OneNote以外にもホワイトボードと計算用紙がないと死んでしまいます。
自宅に900mm X 1200mmのホワイトボードがあるんですけど、
いろいろ試行を巡らせるときはこれがないとやばいですね。
ホワイトボード大好きです。
すべての壁がホワイトボードだったらいいのに(笑
ホワイトボードにメモやらマインドマップやらをかいて、
あとでデジカメで撮影します。
撮影した画像だったり、後々参照しそうなデータは整理してOneNoteにまとめておきます。
計算用紙は、あとで見返すことがないようなことを書いたりします。
頭の中の記憶領域の使用量を減らすために、計算用紙に吐き出しています。
ということで、
OneNoteは整理して後で見直すデータをまとめるアプリケーションとして使っています。
なので、いろいろ情報の抽出機能が強化できると、激しく嬉しいんですけどね。
InterConnectが面白そうな情報抽出機能を持っているかと思ったんですけど、
動作環境の縛りの関係で著しく使いづらいことがわかったので、
現在は使っていません。
最近は、日曜日は一日仕事しなくてもよいようにスケジュールを組んでいるので、
近いうちに上記のサイトを参考にあれこれ遊んでみたいと思っています。
Saturday, September 26, 2009
Programming::JavaScript - エラーコード800a03e8
IE8でJavaScriptの動作チェックを行っていたら、
突然、エラー 800a03e8のため止まりますみたいなことをIEが出力してきました。
800a03e8でぐぐってもほとんどヒットしないので途方にくれていましたが、
IE TesterでほかのバージョンのIEでも確認してみたところ、
きちんとしたエラーメッセージがもらえました。
(IE8でデバッガを有効にしていたからちゃんと出なかったのかな?)
下記のようなエラーメッセージが出ました。
HTML Parsing Error: Unable to modify the parent container element before the child element is closed (KB927917)
そこで落ちたら今まで動いていたコードが動かなくなるじゃん!
document.write()とかの使いどころが激減する予感。
開発しているシステムのほうではdocument.write()でdiv要素とかを出力していまして、
body要素の半ばあたりでそれやっちゃうと上記みたいに怒られる、と。
しかしながらほかのサイトでもご紹介されているとおり、
bodyのとじタグ付近だったらOKなんですよね、いみふ。
bodyのとじタグ付近だろうがなんだろうが、
上記のエラーメッセージ通りの制約を課すならアウトだろうに。
何考えてんの?IEのデベロッパーは。
とか思います。
bodyの子要素からしてみれば、bodyは書き換えてよい親なのでしょうか。
対策として、document.writeやってるところは
すべてwindowがloadし終わったあとにdocument.body.appendChild()使って
要素を追加するよう書き直すしかない、ってことなんでしょうかね。
そういえばdocument.writeやってても大丈夫な箇所も、一応あります。
bodyの子(孫とかではなく)になる要素だったらdocument.writeして
要素を追加してもよいのかも。
んで、一回のdocument.writeの呼び出しで
bodyの子、bodyの孫を一気に出力しちゃえばOKなのかな
(一気に、っていうのは孫要素のとじタグもちゃんと出力してしまうということで)。
もー世の中FirefoxとChromeだけになりませんかね、無理ですよね。ふぅ。
突然、エラー 800a03e8のため止まりますみたいなことをIEが出力してきました。
800a03e8でぐぐってもほとんどヒットしないので途方にくれていましたが、
IE TesterでほかのバージョンのIEでも確認してみたところ、
きちんとしたエラーメッセージがもらえました。
(IE8でデバッガを有効にしていたからちゃんと出なかったのかな?)
下記のようなエラーメッセージが出ました。
HTML Parsing Error: Unable to modify the parent container element before the child element is closed (KB927917)
そこで落ちたら今まで動いていたコードが動かなくなるじゃん!
document.write()とかの使いどころが激減する予感。
開発しているシステムのほうではdocument.write()でdiv要素とかを出力していまして、
body要素の半ばあたりでそれやっちゃうと上記みたいに怒られる、と。
しかしながらほかのサイトでもご紹介されているとおり、
bodyのとじタグ付近だったらOKなんですよね、いみふ。
bodyのとじタグ付近だろうがなんだろうが、
上記のエラーメッセージ通りの制約を課すならアウトだろうに。
何考えてんの?IEのデベロッパーは。
とか思います。
bodyの子要素からしてみれば、bodyは書き換えてよい親なのでしょうか。
対策として、document.writeやってるところは
すべてwindowがloadし終わったあとにdocument.body.appendChild()使って
要素を追加するよう書き直すしかない、ってことなんでしょうかね。
そういえばdocument.writeやってても大丈夫な箇所も、一応あります。
bodyの子(孫とかではなく)になる要素だったらdocument.writeして
要素を追加してもよいのかも。
んで、一回のdocument.writeの呼び出しで
bodyの子、bodyの孫を一気に出力しちゃえばOKなのかな
(一気に、っていうのは孫要素のとじタグもちゃんと出力してしまうということで)。
もー世の中FirefoxとChromeだけになりませんかね、無理ですよね。ふぅ。
Friday, November 07, 2008
Laboratory::Programming - Boost.uBLASで特異値分解
Boost.uBLAS で特異値分解(SVD) - yanoの日記
SVDPACKCで特異値分解できる雰囲気になってきましたが,
Boost.uBLASを使った特異値分解もなかなか魅力的ですね.
わりと簡単に実装できるようですし.
C++で書いたら先生嫌がるんだろうなぁ.
後で自分で実装すれば良いだけの話なんですけどね.
SVDPACKCで特異値分解できる雰囲気になってきましたが,
Boost.uBLASを使った特異値分解もなかなか魅力的ですね.
わりと簡単に実装できるようですし.
C++で書いたら先生嫌がるんだろうなぁ.
後で自分で実装すれば良いだけの話なんですけどね.
Laboratory::Programming - SVDPACKCをVC++でコンパイル
うちの研究室の先生のお手伝いとして,
ベクトル空間モデルを実装しそうな勢いなのです.
いやまぁ以前私も一時手を出しかけて出さなかったんですけどね,実装には.
ベクトル空間モデルやるからには,LSIまで手を出したかったのですが,
特異値分解のところで躓いてあきらめたのでした.
そのときも,SVDPACKCを使えばよいというのはわかっていたのですが,
なにぶんうまくコンパイルできない,落ちる,入出力フォーマット意味不.
とグダグダだったので,あきらめちゃったのですが.
今回ちょっとリトライしてみることにしました.
ただ,先生の用件としては,
私が書こうしているプログラムはANSI Cで書けという.
C++かPerlで書かせてくださいよーと嘆願したんですが,
俺があとあといじるかもしれへんからC!といわれました.
しかもWindowsでコンパイルできないと行けなく,
Cygwinとかも使わない方なので,VC++でコンパイルできるのが望ましいわけで.
しかし私としてはLinuxででもコンパイルしたいので,
そこらへん気を使って書いていかないといけません.
ベクトル空間モデルの実装自体は簡単なのでいいんですが,
LSIですよねー.
やっぱSVDPACKCか?と思って情報を集めていたら.
www.koguchi.be - SVDPACKC
こちらを参考に,SVDPACKCのlas2.cを修正してみました.
結構修正しないといけませんねー.
で,VC++ express 2008でコンパイルしたわけですが,
リンカでこけてしまいます.
プロジェクトに追加したのはlas2.c, las2.h.
_timerが見つからないよーとリンカにおこられます.
_timerってなんやねん!と思ってたんですが,
timersun.cも必要なのですね.ここに定義してあります,timer()が.
プロトタイプ宣言はlas2.cにあるんですよね,気持ち悪.
で,timersun.cなんですが,こいつはVC++ではコンパイルできませんでした.
仕方ないので,timerのプロトタイプ宣言のところを,
0.0を返す関数定義に変えてやりました.
まぁ時間なんて計測する必要は,私には無いので.
特異値分解ができればそれでおっけぃですから.
てなわけで,コンパイル完了,バイナリが出来上がりました.
コンソールアプリの.
実際動かしてみて,特異値分解ができているくさいです.
さてさて,あとはこの出力されたファイルの中身がどうなっているのか,
入力するファイルの形式とかはどうなのか.
はっきり調べて,先生に頼まれるであろう実験用プログラムの開発をしていかないとですね.
ちなみに先生専用というわけでもなく,
ゆくゆくは私も使うことになりそうなので,ちょっと気合入れて書いていたりします.
というか,絶対Perlラッパー書いてやろうとか思ってます.
ベクトル空間モデルを実装しそうな勢いなのです.
いやまぁ以前私も一時手を出しかけて出さなかったんですけどね,実装には.
ベクトル空間モデルやるからには,LSIまで手を出したかったのですが,
特異値分解のところで躓いてあきらめたのでした.
そのときも,SVDPACKCを使えばよいというのはわかっていたのですが,
なにぶんうまくコンパイルできない,落ちる,入出力フォーマット意味不.
とグダグダだったので,あきらめちゃったのですが.
今回ちょっとリトライしてみることにしました.
ただ,先生の用件としては,
私が書こうしているプログラムはANSI Cで書けという.
C++かPerlで書かせてくださいよーと嘆願したんですが,
俺があとあといじるかもしれへんからC!といわれました.
しかもWindowsでコンパイルできないと行けなく,
Cygwinとかも使わない方なので,VC++でコンパイルできるのが望ましいわけで.
しかし私としてはLinuxででもコンパイルしたいので,
そこらへん気を使って書いていかないといけません.
ベクトル空間モデルの実装自体は簡単なのでいいんですが,
LSIですよねー.
やっぱSVDPACKCか?と思って情報を集めていたら.
www.koguchi.be - SVDPACKC
こちらを参考に,SVDPACKCのlas2.cを修正してみました.
結構修正しないといけませんねー.
で,VC++ express 2008でコンパイルしたわけですが,
リンカでこけてしまいます.
プロジェクトに追加したのはlas2.c, las2.h.
_timerが見つからないよーとリンカにおこられます.
_timerってなんやねん!と思ってたんですが,
timersun.cも必要なのですね.ここに定義してあります,timer()が.
プロトタイプ宣言はlas2.cにあるんですよね,気持ち悪.
で,timersun.cなんですが,こいつはVC++ではコンパイルできませんでした.
仕方ないので,timerのプロトタイプ宣言のところを,
0.0を返す関数定義に変えてやりました.
まぁ時間なんて計測する必要は,私には無いので.
特異値分解ができればそれでおっけぃですから.
てなわけで,コンパイル完了,バイナリが出来上がりました.
コンソールアプリの.
実際動かしてみて,特異値分解ができているくさいです.
さてさて,あとはこの出力されたファイルの中身がどうなっているのか,
入力するファイルの形式とかはどうなのか.
はっきり調べて,先生に頼まれるであろう実験用プログラムの開発をしていかないとですね.
ちなみに先生専用というわけでもなく,
ゆくゆくは私も使うことになりそうなので,ちょっと気合入れて書いていたりします.
というか,絶対Perlラッパー書いてやろうとか思ってます.
Monday, October 06, 2008
Programming::Perl - Parrot0.7.1
Journal of pmichaud (6013)
Parrotのバージョンが0.7.1になったようです。
Parrotがメジャーバージョンになってくれないことには
Perl6の実装Rakudoが実用に達しませんしねー。
めっちゃ書きやすそうなPerl6を、早く大学の実験とかでも使いたいのです。
処理が速くないと、実験おそーな状態ですから、なかなかPerl6使えず。
メジャーリリースが楽しみですね。
Parrotのバージョンが0.7.1になったようです。
Parrotがメジャーバージョンになってくれないことには
Perl6の実装Rakudoが実用に達しませんしねー。
めっちゃ書きやすそうなPerl6を、早く大学の実験とかでも使いたいのです。
処理が速くないと、実験おそーな状態ですから、なかなかPerl6使えず。
メジャーリリースが楽しみですね。
Thursday, August 28, 2008
Programming::SoftwareDevelopment - すっきり書くことについて
大学で、完全なるボランティアとしてのソフト開発に参加させられています、現在。
プロジェクトの方向がバシッと見えず、なぁなぁでミーティングが重ねられ、
システム全体像が不明瞭なまま、各担当モジュールを決められ、
来週から開発スタートとかになってしまい、イライラ感はいなめない最近ですが。
ったく誰になってんの?プロジェクトリーダーは。
先生ですか?それも怪しいのですが。
そんなこんなで、ある人の担当モジュール。
使用言語はC#、GUI部もC#で書いている彼女は、
ネットワーク処理を自分のプログラムに組み込まなくてはならなくなりました。
ネットワークモジュールとしては、C++、Ruby、Perlで書かれたものがすでにある状態です。
とはいうものの、ネットワーク処理のプロトコル仕様書はすでにあるので、
C#でネットワーク処理を書いてしまえばいいでしょう。
が、何やら、彼女が書いたプログラムを立ち上げるランチャをC++で書き、
C++で書かれたネットワークモジュールとランチャ部をくっつけ、
ネットワーク部分とGUI部分とのやりとりを
外部ファイルを用いておこなったらいいんじゃない、と言い始めるそこの先生っっ!
明らかにややこしい処理をやってます。気持ち悪いです。
C#で書いたほうがすっきりしますよね?と聞いたんですが、
きれいさは求めてないとかいわれました。
まぁ私の言い方も悪かったのでしょうが、すっきり書くことができると
バグ混入の余地が減りますし、デバッグもしやすい。コーディング量も少ない。
それに彼女はC++を経験していないので、
手間から考えても、慣れてるC#でネットワークの処理書いたほうが良い気がします。
すっきりかける=きれいにかけるしか連想してくれない先生に、
ちょっとがっかりした思いでした。
プロジェクトの方向がバシッと見えず、なぁなぁでミーティングが重ねられ、
システム全体像が不明瞭なまま、各担当モジュールを決められ、
来週から開発スタートとかになってしまい、イライラ感はいなめない最近ですが。
ったく誰になってんの?プロジェクトリーダーは。
先生ですか?それも怪しいのですが。
そんなこんなで、ある人の担当モジュール。
使用言語はC#、GUI部もC#で書いている彼女は、
ネットワーク処理を自分のプログラムに組み込まなくてはならなくなりました。
ネットワークモジュールとしては、C++、Ruby、Perlで書かれたものがすでにある状態です。
とはいうものの、ネットワーク処理のプロトコル仕様書はすでにあるので、
C#でネットワーク処理を書いてしまえばいいでしょう。
が、何やら、彼女が書いたプログラムを立ち上げるランチャをC++で書き、
C++で書かれたネットワークモジュールとランチャ部をくっつけ、
ネットワーク部分とGUI部分とのやりとりを
外部ファイルを用いておこなったらいいんじゃない、と言い始めるそこの先生っっ!
明らかにややこしい処理をやってます。気持ち悪いです。
C#で書いたほうがすっきりしますよね?と聞いたんですが、
きれいさは求めてないとかいわれました。
まぁ私の言い方も悪かったのでしょうが、すっきり書くことができると
バグ混入の余地が減りますし、デバッグもしやすい。コーディング量も少ない。
それに彼女はC++を経験していないので、
手間から考えても、慣れてるC#でネットワークの処理書いたほうが良い気がします。
すっきりかける=きれいにかけるしか連想してくれない先生に、
ちょっとがっかりした思いでした。
Monday, May 19, 2008
Programming::Perl - Mastering Perl
Amazon.co.jp: Mastering Perl (Mastering): Randal L. Schwartz, Brian D. Foy: 洋書]
洋書でいえば、以前Mastering Algorithms with Perlを購入したことがあり、そうかPerlならそう書けばいいのか!と感嘆した時期がありました。今回はMastering Perl。序章とアウトライン、あと全体的にちらちらとしか見ていませんが、かゆい所に手が届きそうな感じです。たとえば、私としてはPerlの正規表現の拡張表記についてはあまり詳しくなかったので、あぁそういう仕組みなのね、ということが書いてあって大変面白いです。(?:)や(?=)とかのお話ですね。
今までぼんやりとしかわかっていなかったので。
Friday, May 16, 2008
Programming::Perl - ちょっと距離を置いてみて
スラッシュドット・ジャパン | 本家インタビュー:Perl開発者ラリー・ウォール
上記のリンクや、2chなどからみて。
いや、2chで結構ひどい言われようなのですね、Perlって。
学部生のころはC++をメインに、マスターのころはPerlをメインに使って
研究を進めていました。
もともとPerl使いな私は、マスターのころはガンガンプログラムを書いて研究を進めていました。
C++よりも全然早くかけるし!とか思って。
まー確かに共同で開発するとなると、Perlってどうなんだろう、と思ったりもします。
OOPでうまい具合に書けば、別にどうってことなさそうな気もしますけど。
全員が全員に対して、読みやすく使いやすいようにコーディングルールを決めないと
うまく事が運ばない気もしますけどね。
2chにもたまーに書いてありましたけど、適材適所ですよね。
ひとりでやる分にはPerlで全然OK。
開発する人数が増えてくると、ルールを決めたり、
きっちりとした書き方しかできない言語を使ってみたり。
私は、研究にはPerlを使って実験しています。
ソフト開発としてはC#を使ったり、PHP+JavaScript使ったりしています。
まぁWebアプリかどうかの違いなんですけど、ソフト開発の面では。
実験にはJavaScript使うのなんて意味不明ですし、
C#でもいいっちゃいいんですけどPerlのほうがすぐコーディングできる。
でもC#で書いておけば、変なことしない限りLinuxやWindowsで走らせることはできる。
実験で速度を求める個所があるならば、Inline::C使ったりしています。
なので、速攻でコーディングできることを求めるならPerl、
実行速度を求めるならC/C++、
GUIアプリを作るならC#、
Webアプリ作るならPHP、
という感じですね、私の中では。
Javaは・・・重すぎるイメージがあるのでなかなかやる気になれないんですよね・・・
使う機会があるなら勉強したいですけど。
昔やってみて、あまりのタイプ量の多さに投げ出してしまいました。
Rubyも昔触りましたけど、begin~endとか好きになれなくて。好みの問題なんですけどね。
Perlの$、%、@とかは、見ただけでスカラーなのかハッシュなのか配列なのかわかる。
この記号が嫌いっていう方もおられるんですが。
でもまぁPerlのプログラムって知ってる人しか読み下せない、というのはあるんでしょうね。
何書いてんの、これ!?というのは昔私自身もありましたし。
use strictしないと変数に何が格納されていっているのか追跡しにくいとかいうのもあります。
サブルーチン化しなくてもべたべた書いていけるので、
平気でmain関数1000行的なプログラムもかけます。
逆に、OOPで書けば、めちゃくちゃ少ない行ですっきりかけたりもします。
ほんと自由な感じがします。
なので、大規模な開発を行う場合には、
その自由な中でいかに規律を決めて書いていくか、
という能力が求められるのでしょうね。
そんな言語だと、人数が増えるとコントロールするのが難しくて破たんしやすくなる。
だったら書き方に厳しい言語を採用したほうが楽じゃないか、という話になるんじゃないかと思います。
うん、Perlはきっとフェラーリのエンジンを載せたおもちゃだ、とかいってみる(笑
上記のリンクや、2chなどからみて。
いや、2chで結構ひどい言われようなのですね、Perlって。
学部生のころはC++をメインに、マスターのころはPerlをメインに使って
研究を進めていました。
もともとPerl使いな私は、マスターのころはガンガンプログラムを書いて研究を進めていました。
C++よりも全然早くかけるし!とか思って。
まー確かに共同で開発するとなると、Perlってどうなんだろう、と思ったりもします。
OOPでうまい具合に書けば、別にどうってことなさそうな気もしますけど。
全員が全員に対して、読みやすく使いやすいようにコーディングルールを決めないと
うまく事が運ばない気もしますけどね。
2chにもたまーに書いてありましたけど、適材適所ですよね。
ひとりでやる分にはPerlで全然OK。
開発する人数が増えてくると、ルールを決めたり、
きっちりとした書き方しかできない言語を使ってみたり。
私は、研究にはPerlを使って実験しています。
ソフト開発としてはC#を使ったり、PHP+JavaScript使ったりしています。
まぁWebアプリかどうかの違いなんですけど、ソフト開発の面では。
実験にはJavaScript使うのなんて意味不明ですし、
C#でもいいっちゃいいんですけどPerlのほうがすぐコーディングできる。
でもC#で書いておけば、変なことしない限りLinuxやWindowsで走らせることはできる。
実験で速度を求める個所があるならば、Inline::C使ったりしています。
なので、速攻でコーディングできることを求めるならPerl、
実行速度を求めるならC/C++、
GUIアプリを作るならC#、
Webアプリ作るならPHP、
という感じですね、私の中では。
Javaは・・・重すぎるイメージがあるのでなかなかやる気になれないんですよね・・・
使う機会があるなら勉強したいですけど。
昔やってみて、あまりのタイプ量の多さに投げ出してしまいました。
Rubyも昔触りましたけど、begin~endとか好きになれなくて。好みの問題なんですけどね。
Perlの$、%、@とかは、見ただけでスカラーなのかハッシュなのか配列なのかわかる。
この記号が嫌いっていう方もおられるんですが。
でもまぁPerlのプログラムって知ってる人しか読み下せない、というのはあるんでしょうね。
何書いてんの、これ!?というのは昔私自身もありましたし。
use strictしないと変数に何が格納されていっているのか追跡しにくいとかいうのもあります。
サブルーチン化しなくてもべたべた書いていけるので、
平気でmain関数1000行的なプログラムもかけます。
逆に、OOPで書けば、めちゃくちゃ少ない行ですっきりかけたりもします。
ほんと自由な感じがします。
なので、大規模な開発を行う場合には、
その自由な中でいかに規律を決めて書いていくか、
という能力が求められるのでしょうね。
そんな言語だと、人数が増えるとコントロールするのが難しくて破たんしやすくなる。
だったら書き方に厳しい言語を採用したほうが楽じゃないか、という話になるんじゃないかと思います。
うん、Perlはきっとフェラーリのエンジンを載せたおもちゃだ、とかいってみる(笑
Sunday, May 11, 2008
Programming::Perl Perl6AndParrotEssentials
Amazon.co.jp: Perl 6 And Parrot Essentials (Essentials): Allison Randal, Dan Sugalski, Leopold Totsch: 洋書
Perl6、いつ出るやらわからないですけど、
やっぱりどういう仕様なのか気になります。
メジャーリリースされていないのに、Perl6の本買うのってどうなんということで、
購入をしばらく見送っていましたが、我慢できずにAmazonで購入してしまいました。
到着するのが楽しみですね。
Perl6、いつ出るやらわからないですけど、
やっぱりどういう仕様なのか気になります。
メジャーリリースされていないのに、Perl6の本買うのってどうなんということで、
購入をしばらく見送っていましたが、我慢できずにAmazonで購入してしまいました。
到着するのが楽しみですね。
Friday, February 15, 2008
Programming::C# - Reflectionでメンバ変数にらくらく代入
http://blog.livedoor.jp/kkawauchi/archives/52925635.html
SQL Serverから取得したレコードをバスバス格納していく際に,
いちいち全てのメンバ変数を列挙して代入文書くのがいやだなぁと思っていたら
ちょうど良いサンプルが.
Perlとかだったら動的に代入コードを生成してevalしちゃえば楽勝です.
PHPでも匿名関数作ってやれなくもないですが,まぁリフレクション使いました.
で,C#でもリフレクションあるんだからきっとできるよなぁと思って調べてみました.
C#のマニュアルとか,みても良かったんでしょうけど.
MSのサイト重いしC#のhelpのサンプルコードは見たいコードがなかなかなかったり,
まず私にはあのhelpはみやすいとは思えず.
C#は便利な機能いっぱいあるのになー.
SQL Serverから取得したレコードをバスバス格納していく際に,
いちいち全てのメンバ変数を列挙して代入文書くのがいやだなぁと思っていたら
ちょうど良いサンプルが.
Perlとかだったら動的に代入コードを生成してevalしちゃえば楽勝です.
PHPでも匿名関数作ってやれなくもないですが,まぁリフレクション使いました.
で,C#でもリフレクションあるんだからきっとできるよなぁと思って調べてみました.
C#のマニュアルとか,みても良かったんでしょうけど.
MSのサイト重いしC#のhelpのサンプルコードは見たいコードがなかなかなかったり,
まず私にはあのhelpはみやすいとは思えず.
C#は便利な機能いっぱいあるのになー.
Saturday, February 09, 2008
Programming::Perl - Perl5.10
perldelta - Perl5.10.0の新機能
先日ActivePerlをインストールしたら5.10になっててウホッ,ってなったんですが,
結構いろいろ追加,変更されていますね.
say関数とか,Perl6にならないと使えないと思っていたのに,5.10で使えるようになっています.
というか,Perl6での機能がいくつか5.10に取り入れられていますね.
swtich文(given構文)とか,スマートマッチとか.
うれしい機能としては,
SVとかのメモリ利用方法の最適化とか,正規表現最適化とかもありますね.
削除された機能として,仮想ハッシュ(fieldsを使ったハッシュ)がなくなっています.
ま,Hash::Utilが標準モジュールで組み込まれているならいらない気もします.
fields自体は違う実装がなされていて,今までfieldsを使っているスクリプトが動かなくなることはないようです.
バイトコードコンパイラが消されています.
以前は少しでもサーバの負担を減らそうとして,
バイトコードコンパイラに期待したときもありましたが,
いまやPerlスクリプトのパース負荷なんて知れているのかもしれませんね,ハードウェア的に.
削除した理由が,ともかくなかなか上手く事が運ばなかったんでうざいから消したみたいな.
いや,うざいとかは書いていませんが,開発していかなきゃいかん!というほどのものでもなかった,
ということみたいですね.
他にもなにやらいろいろありますが,
なかなか日本語が意味不明で難しいです.
もっとうまい和訳ないもんですかね.
自分の中でもっと噛み砕いて「日本語」をアウトプットしろっつーの.
とかく,Perl5.10が出て超期待なのですが,
レンタルWebサーバはなかなかバージョンアップしてくれないんで,
当面5.10の機能に重きを置くスクリプトは作らないほうがいいですよね.
昔COOLにRubyインストールして!と正規会員でお願いしたんですがけられました.
まぁやすやすとバージョンアップや,新しくプログラムをインストールしたくないのはわからなくはないですが.
検討しろよったく,と思ったのも事実.
あー,今見てみてもperlしか使えませんね.
ssiやsendmailは使える様子ですが.
現在私がレンタルしているところは同人会みたいですよとおっしゃっておられて,
なんかいろいろできます.
Perl,Ruby,Pythonはもちろんのこと,SSHで入ってgccも使えるんで
ネイティブコードのCGIも実行可能です.
PHP,Java Servletも使えますし,ムービーなどのストリーミング配信,
Postgle, MySQLサーバも使えます.
メーリングリストも作れたっけか.
家族アカウントも作れたりして.
と,話がそれましたが,
Perl使いな私には,Perlのバージョンがあがったことは朗報です.
オブジェクト指向な文法が追加されたらもっとうれしかったんですけどね.
先日ActivePerlをインストールしたら5.10になっててウホッ,ってなったんですが,
結構いろいろ追加,変更されていますね.
say関数とか,Perl6にならないと使えないと思っていたのに,5.10で使えるようになっています.
というか,Perl6での機能がいくつか5.10に取り入れられていますね.
swtich文(given構文)とか,スマートマッチとか.
うれしい機能としては,
SVとかのメモリ利用方法の最適化とか,正規表現最適化とかもありますね.
削除された機能として,仮想ハッシュ(fieldsを使ったハッシュ)がなくなっています.
ま,Hash::Utilが標準モジュールで組み込まれているならいらない気もします.
fields自体は違う実装がなされていて,今までfieldsを使っているスクリプトが動かなくなることはないようです.
バイトコードコンパイラが消されています.
以前は少しでもサーバの負担を減らそうとして,
バイトコードコンパイラに期待したときもありましたが,
いまやPerlスクリプトのパース負荷なんて知れているのかもしれませんね,ハードウェア的に.
削除した理由が,ともかくなかなか上手く事が運ばなかったんでうざいから消したみたいな.
いや,うざいとかは書いていませんが,開発していかなきゃいかん!というほどのものでもなかった,
ということみたいですね.
他にもなにやらいろいろありますが,
なかなか日本語が意味不明で難しいです.
もっとうまい和訳ないもんですかね.
自分の中でもっと噛み砕いて「日本語」をアウトプットしろっつーの.
とかく,Perl5.10が出て超期待なのですが,
レンタルWebサーバはなかなかバージョンアップしてくれないんで,
当面5.10の機能に重きを置くスクリプトは作らないほうがいいですよね.
昔COOLにRubyインストールして!と正規会員でお願いしたんですがけられました.
まぁやすやすとバージョンアップや,新しくプログラムをインストールしたくないのはわからなくはないですが.
検討しろよったく,と思ったのも事実.
あー,今見てみてもperlしか使えませんね.
ssiやsendmailは使える様子ですが.
現在私がレンタルしているところは同人会みたいですよとおっしゃっておられて,
なんかいろいろできます.
Perl,Ruby,Pythonはもちろんのこと,SSHで入ってgccも使えるんで
ネイティブコードのCGIも実行可能です.
PHP,Java Servletも使えますし,ムービーなどのストリーミング配信,
Postgle, MySQLサーバも使えます.
メーリングリストも作れたっけか.
家族アカウントも作れたりして.
と,話がそれましたが,
Perl使いな私には,Perlのバージョンがあがったことは朗報です.
オブジェクト指向な文法が追加されたらもっとうれしかったんですけどね.
Friday, September 07, 2007
Programming::Perl - PAR::Packer
大学でデモプログラムを作ろうと思い,PARをCPAN使ってインストールすることにしました。
Perl使いの私は,殆どの実験プログラムやライブラリをPerlで書いています。
なんで,デモプログラム化するにはある程度のポータビリティが必要だと思って
PARを使い,自己実行形式ファイルを構築することにしました。
PAR自体は難なくインストール出来たんですが,
PAR::Packerがどうにもmake中に落ちてインストールに失敗する。
PAR::Packerのバージョンは0.976。
設定が足らないんかな?とか思ったんですが,そういう問題でもなさそう。
古いバージョンならいけるかも,と思って探していたら,0.975を発見。
難なくインストールできました。
インストールできないモジュールを上げるなよなぁと思いました。
Perl使いの私は,殆どの実験プログラムやライブラリをPerlで書いています。
なんで,デモプログラム化するにはある程度のポータビリティが必要だと思って
PARを使い,自己実行形式ファイルを構築することにしました。
PAR自体は難なくインストール出来たんですが,
PAR::Packerがどうにもmake中に落ちてインストールに失敗する。
PAR::Packerのバージョンは0.976。
設定が足らないんかな?とか思ったんですが,そういう問題でもなさそう。
古いバージョンならいけるかも,と思って探していたら,0.975を発見。
難なくインストールできました。
インストールできないモジュールを上げるなよなぁと思いました。
Friday, July 13, 2007
Programming::Programmer - 本物のプログラマー
本物のプログラマーはパスカルを使わない
…いや,変態でしょ(笑)
テキサスインスツルメンツ社の伝説的なプログラマがある日、長距離電話でユーザーからシステムクラッシュを告げられた。彼は、その電話口でユーザーに16進コードを指示して、メインフレームの制御フロントパネルのトグルスイッチを操作させた。曰く、「本物のプログラマは電話でブート・コードを唱え、大陸の反対側でクラッシュしたシステムを再起動させる」
…いや,変態でしょ(笑)
Monday, June 11, 2007
Programming::JavaScript - クラスの継承とオーバーライド
お遊びで作ったものですが。
JavaScript Library MKF
prototype.jsを先にscript要素で呼び出しておく必要があります。
JavaScriptでは継承がすっきりかけなくていやんだったので,
自分なりに作ってみました。
MKFを使うと継承はこんな感じです。
_superキーワードでスーパークラスのコンストラクタ呼び出しが出来るんで,
少しは気分良く継承が出来るかなぁと思っています。
そしてメソッドのオーバーライド。
普通にやろうとすると,スーパークラスのメソッドをサブクラスで上書きすることになるんですが,
そうするとスーパークラスのこのメソッドが呼び出せなくなります。
スーパークラスのオーバーライド対象となるメソッドを呼び出す前後に,
何かしら処理を加えたいとき,スーパークラスのが呼び出せなくていやんです。
なので,呼び出せるようにしてみました。
スーパークラスのコンストラクタ呼び出しは"this._super"で"this"がついているのに,
スーパークラスのオーバーライドされた元々のメソッドの呼び出しは"this"がつかなくて
少々気持ち悪いですが。
こんなものを作ってみましたが,
JavaとJavaScriptを連携して動かす方法もあるようなので,
オブジェクト指向でしっかり書きたいところはJavaで書くべきなのかもしれませんね。
JavaScript Library MKF
prototype.jsを先にscript要素で呼び出しておく必要があります。
JavaScriptでは継承がすっきりかけなくていやんだったので,
自分なりに作ってみました。
MKFを使うと継承はこんな感じです。
// スーパークラスの定義
var MySuperClass = Class.create(); // MKF.Class.create();でも可
MySuperClass.prototype = { /* ここにMySuperClassの定義を書く */ };
// サブクラスの定義
var MySubClass = MKF.Class.create();
MySubClass.extend(MySuperClass).implement({
initialize : function (arg) {
this._super(arg); // スーパークラスのコンストラクタ呼び出し
},
new_method1 : function () { /* サブクラスで新しくメソッドを定義 */ },
...
});
_superキーワードでスーパークラスのコンストラクタ呼び出しが出来るんで,
少しは気分良く継承が出来るかなぁと思っています。
そしてメソッドのオーバーライド。
普通にやろうとすると,スーパークラスのメソッドをサブクラスで上書きすることになるんですが,
そうするとスーパークラスのこのメソッドが呼び出せなくなります。
スーパークラスのオーバーライド対象となるメソッドを呼び出す前後に,
何かしら処理を加えたいとき,スーパークラスのが呼び出せなくていやんです。
なので,呼び出せるようにしてみました。
var MySuperClass2 = MKF.Class.create();
MySuperClass2.extend(MKF.Class.Overridable).implement({
initialize : function () { /* コンストラクタ */ },
calc : function (x, y) { return x + y; }
});
var MySubClass2 = MKF.Class.create();
MySubClass2.extend(MySuperClass2).implement({
initialize : function () { /* コンストラクタ */ },
// オーバーライドするメソッドをここで定義する
override : {
calc : function (x, y) {
x *= x;
y *= y;
return super_method(x, y); // MySuperClassのcalcを呼び出す
}
}
});
var foo = new MySuperClass2;
alert(foo.calc(2, 2)); // 4が表示される
var hoge = new MySubClass2;
alert(hoge.calc(2, 2)); // 8が表示される
スーパークラスのコンストラクタ呼び出しは"this._super"で"this"がついているのに,
スーパークラスのオーバーライドされた元々のメソッドの呼び出しは"this"がつかなくて
少々気持ち悪いですが。
こんなものを作ってみましたが,
JavaとJavaScriptを連携して動かす方法もあるようなので,
オブジェクト指向でしっかり書きたいところはJavaで書くべきなのかもしれませんね。
Tuesday, February 27, 2007
Programming::Perl - XSで高速化
大学の実験プログラムをPerlで書いているのですが、
さすがに三日以上もかかるプログラムだと高速化したくなってきます。
数式の処理が重いのかなーとプロファイリングも行わずに、
高速化を試み始めました。
Pure Perlレベルだったらやれることはやったような気がしていたので、
XSに手を出すことにしました。
まぁ具体的にはInlineモジュールを使って
数式処理の部分だけCで書いたりしたのですが。
PerlとCの間の架け橋処理が非常に面倒ですね。
なんなの、SVて。
それがPerlの、何でも入る構造体なんでしょうけどね。
で、sv_2mortalっていうのがさっぱり分かっていなかったんですが、
これやっておかないとメモリリークを引き起こすそうですね。
確保済みの領域を、sv_2mortalで揮発性にするんだとか。
…ここ5日ほどマシンを文回しながら、ページングサイズが1.4GBとかになっていまして。
Perlが保有しているメモリが880MB程行ってたんですよね。
もしかして確保したメモリを揮発性にしてなかったから?
という不安がちょっとよぎりました。
でも実験が3/4ほど終了したとこなんで、
今とめたくないんですけどね。
途中から処理を再開できるようにプログラムを変更すれば済む話なんですが。
Perlの中にCを入り込ませるのは、なかなか色々知識が必要ですね。
さすがに三日以上もかかるプログラムだと高速化したくなってきます。
数式の処理が重いのかなーとプロファイリングも行わずに、
高速化を試み始めました。
Pure Perlレベルだったらやれることはやったような気がしていたので、
XSに手を出すことにしました。
まぁ具体的にはInlineモジュールを使って
数式処理の部分だけCで書いたりしたのですが。
PerlとCの間の架け橋処理が非常に面倒ですね。
なんなの、SVて。
それがPerlの、何でも入る構造体なんでしょうけどね。
で、sv_2mortalっていうのがさっぱり分かっていなかったんですが、
これやっておかないとメモリリークを引き起こすそうですね。
確保済みの領域を、sv_2mortalで揮発性にするんだとか。
…ここ5日ほどマシンを文回しながら、ページングサイズが1.4GBとかになっていまして。
Perlが保有しているメモリが880MB程行ってたんですよね。
もしかして確保したメモリを揮発性にしてなかったから?
という不安がちょっとよぎりました。
でも実験が3/4ほど終了したとこなんで、
今とめたくないんですけどね。
途中から処理を再開できるようにプログラムを変更すれば済む話なんですが。
Perlの中にCを入り込ませるのは、なかなか色々知識が必要ですね。
Saturday, January 13, 2007
Programming::Javascript - 少し冷静になって作ってみる
こちらで書いたとおり、 _super()でスーパークラスのコンストラクタ呼び出しが可能なのは相変わらずです。ただ、_SUPERキーワードを使ってスーパークラスのメソッドを呼び出そうという試みで、正しくスーパークラスのメソッドが呼び出されるよう_SUPER.method(arg)を字句解析を用いて探し出し、変形させてやろうとしていたのですが…計算コストが高くつくのと、何か微妙にバグがとれずにいたので、実装するのに少し萎え気味になりました。デバッグが著しく面倒ですからね、JavaScript周りは。せっかく軽量で分かりやすいライブラリを目指しているのに、字句解析とか導入して重くなるのは嫌です、やっぱり。
Core JavaScript 1.5 Guide:Class-Based vs. Prototype-Based Languagesで、プロトタイプベース言語とクラスベース言語の比較について述べてあります。まー、JavaScriptプロトタイプベースの言語なんだから、無理にクラスベースの言語の使用に近づけなくても良い、というかむしろそれは良くないんかなぁっていう気がしてきました。これを読んだからだけでなく、クラスベース言語と同じようなことをしようとして、結果的に計算コストが高くつくようになってしまったことも、このような考えに至った原因の一つですが。
計算コストは恐らく、すんごいコーダーの手に掛かればもっと削減できるのでしょうが。スーパークラスのコンストラクタ呼び出しは結構使うと思うんで、これは削除せずに置いておきます。_SUPERキーワードを使ったスーパークラスのメソッド呼び出しは、サブクラスでオーバーライドしたメソッド内で、オーバーライドされる前のメソッドを呼び出したいときなんかは重宝するかなと思ったのですが。もうちょっと他の方法を考えてみて、出来そうだったら実装してみようかなと思っています。
Core JavaScript 1.5 Guide:Class-Based vs. Prototype-Based Languagesで、プロトタイプベース言語とクラスベース言語の比較について述べてあります。まー、JavaScriptプロトタイプベースの言語なんだから、無理にクラスベースの言語の使用に近づけなくても良い、というかむしろそれは良くないんかなぁっていう気がしてきました。これを読んだからだけでなく、クラスベース言語と同じようなことをしようとして、結果的に計算コストが高くつくようになってしまったことも、このような考えに至った原因の一つですが。
計算コストは恐らく、すんごいコーダーの手に掛かればもっと削減できるのでしょうが。スーパークラスのコンストラクタ呼び出しは結構使うと思うんで、これは削除せずに置いておきます。_SUPERキーワードを使ったスーパークラスのメソッド呼び出しは、サブクラスでオーバーライドしたメソッド内で、オーバーライドされる前のメソッドを呼び出したいときなんかは重宝するかなと思ったのですが。もうちょっと他の方法を考えてみて、出来そうだったら実装してみようかなと思っています。
Subscribe to:
Posts (Atom)