|
|
||

しばらく更新が途絶えていたがそれは3.11の影響であることはカンのイイ人なら分かっていたであろう。私の分散コンピューティング実験施設は黒水の洗礼を受け家は破壊され最近ようやく家の修理が終わったところである。そんな自然の驚異に身を晒された体験から強く起業願望が芽生えてきた。
ただ、房二病的願望を箇条書きにして企業理念、責務、目的だけを忘れないように書いておきたいと思った。多くの被災者がそうであるように私も記憶力が鈍っている為だ。
NECのパソコンは魅力が無い。しかし、壊れにくさには定評がある。なぜなら周りのNEC製のパソコンは一台も根本的な部分で不具合が出ていないからだ。*1
NECのパソコンの魅力の無さを挙げるとすれば
サーバーに関しての私の評価はまったく逆だ。自作PCユーザーに配慮されているPCケースであり、部品の選定であり、それで格安で販売しているからだ。
私が学生時代、NEC Express5800 110Gdというサーバーが私にとっての激安鯖の元祖的存在*2であり、PC実験用に重宝していた。
さて、そのシリーズの最新版であるNEC Express5800 GT110bだがどうにもPCとして使うには難がある。
大体、サーバーをPCに改造するのはセカンドマシンとして使うのが前提なのだがせっかくのPCI-Express x16のポートに挿したグラフィックボードがCPU切替器を使用していると認識されないのだ。なお、GT110bの起動時にCPU切替器で画面をActiveにしている場合は認識される。
これは面倒だ。
GT110bのこの仕様が分かったとき本当にガックリときた。失望した。
よって、GT110b専用のディスプレイを常につけておかなければならない。15型の液晶ディスプレイが中古で5000円以内で買えるとしても、そんな出費はサーバー1台に対して行いたくは無い。電気代やスペースの問題もある。
この解決策はナンセンスだ。
ケースのデザインは横置きできなくなったがその代わりHDDが取り付けやすくなり、かつ静穏性は前代と比べるとものすごく良くなった。これは大変良い評価に値する。
さて、もう良いだろう。私の言いたいことは次の通りだ。
話は変わるが、今、どこの激安鯖を贔屓にしているかといえばヒューレット・パッカード のML110シリーズである。29800円でXeon付きってのは物凄く安いと思わないか?NECでXeon付きとなると滅茶苦茶高くなる。
今はXenで仮想サーバーを必要なだけ作って1台で色々運用できる時代になったのでIntel-VTに対応したマルチコアかつ大容量メモリのサーバーが個人ユースではなにかと便利なのである。
なお、激安鯖に関する情報は
本日、「第一回真の闇プログラマ認定プログラミングコンテスト(仮)」のレジュメをアップしました。ご都合がよろしければ、ぜひご参加くださいませ。
ガラケーの話題である。
携帯電話のボタンを押しても画面遷移までの時間がかかってイライラする事はないだろうか?ボタンを押しても反応が悪いといった感覚だ。私の携帯にはそれが顕著でかなりイライラしていたのだが店員に聞いたところ、Snapdragon*1というモノ?を使ったケータイがレスポンスが速くて良いそうである。ちなみに新規契約で0円のケータイなどには使われていないそうだ。
機種を挙げるとすれば
あたりである。
とにかく、レスポンスの速い携帯が欲しければケータイの店員さんにSnapdragonを使っているケータイを羅列していただけませんか?と頼む事だ。 −以上ー
コードコンテストのプログラマーのコーディング手法には様々なタイプがある。特に注目に値すべきコードの書き方から、そのプログラマーの考え方が分かってくるような気がしたので特にそういった印象が強かった点を以下に記しておく事にした。
問題文をあまり理解しないまま、「こんな感じだろう〜」といった具合で組んでいく。答えが合わないとモンキーデバッグに陥りやすい。一般的にプログラミングの能力のみがある人にこういった傾向が感じられる。コードコンテストサイト初心者にもありがちである。要するに私である。
2.一発屋
問題文を読んで、コードを組まずに頭の中で試行錯誤したり、紙に書いたりして問題を解く指針を決め、解ける確信を持ってからコーディングするタイプ。大体、1回書けばテストも通るのでそのまま提出になる。ある種の才能や能力を持った人達に多い気がする。例えば、コテコテの数学物理専攻の人とか。
手元にアルゴリズム本が無いと何も出来ないコーダー。問題文とアルゴリズム本(アルゴリズム本に限った事ではないが…)を行ったり来たりしてテストコードを量産する。アルゴリズム名やアプローチの知識は多いが、何も資料が無い状態だとまともなコードすら書けない。要するに私であry――。
私の周りにはコードコンテスト初心者しかおらずレッドコーダーレベルのコーディング文化の様がよく分からないので他にどういったタイプの人がいるのかよく分からない。情報が入り次第随時このエントリーに追記していく予定だ。
モンキーデバッグとは私がうろ覚えだった「モンキーテスト」の意味を取り違え、その他の概念と合わせて独自の解釈で作ってしまった俗語である。主に私とその界隈だけで通じる。メジャーな語句にさせる為にエントリーに書く事にした。
意味としては次のような状態を指す。
このような状態に対して次のようなアドバイスをする。
プログラミングする上で一番厄介なのが、モンキーデバッグが必要になってくる状況である。コレにはまったらもう抜け出せない。一つの問題にもかかわらず3時間以上かかる事が多かったので、デバッグは止めて、ソースコードと関連する資料の見直しをしよう。大体はアプローチが悪い事が多い。
今回のプログラムは珍しく、VC6ではコンパイルできません。*1g++あたりでコンパイルできるんじゃないかな?itoaをパクッてint to stringという事でitosという名前にしました。2進法から62進法まで対応する珍しい一品。私はこの手の処理に自信が無いのでバグがあるかも!?
//via http://hi.baidu.com/beyoniger/blog/item/1ef9dbcd3b24d8550fb345d0.html //http://github.com/sinefunc/base62/blob/master/base62.rb to C++ #include <iostream> #include <string> #include <algorithm> std::string itos(unsigned long long value,int base){ std::string out;// check that the base if valid if (base < 2 || base > 62) { return out; } unsigned long long absQModB; unsigned long long q = value; const char *ascii_table="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; while(q){ absQModB=q % base; //if (absQModB < 0) // absQModB=-absQModB; out += ascii_table[ absQModB ]; q /= base; } std::reverse( out.begin(), out.end() ); return out; } int main(){ return "lYGhA16ahyf"==itos(18446744073709551615ULL,62); }
wikiの方でソートのソースコードを更新していくことにした。何故かstd::sortが一定の条件でAccess ViolationやStack Overflowになるのでどうにかしなければならない。ということでstable_sortにしてみたorz。
誰もが思いつくと感じているが、一応実装を記す。メモリを多くするとideoneでSEGVったけど気にしない。メモリが壊れているかもしれないけれど眠いので今は調べない。私製のテストフレームワークを用いている部分はコメントアウトした。気にしないで欲しい。
要するに構造体を丸ごとコピーしてソートするのではなくポインタ経由で比較データにアクセスしてポインタ値のみをソートするという方法である。アルゴリズムの教科書の小ネタやソートの高速化の課題として書かれていそうな題材である。
このソースコードの場合、ideoneではポインタ経由ソートのほうが約10倍高速である。
#include <iostream> #include <algorithm> #include <functional> struct vbdata{ int prio; char data[1024]; vbdata() : prio(rand()){ } ~vbdata(){} friend bool operator<(const vbdata &x,const vbdata &y){ return x.prio < y.prio; } friend bool operator>(const vbdata &x,const vbdata &y){ return x.prio > y.prio; } }; template<class T> struct pointer_less: public std::binary_function<T*,T*,bool>{ bool operator()(const T *x,const T *y){ return *x < *y; } }; #include <boost/scoped_array.hpp> #include <boost/timer.hpp> void vbsort_test(size_t size){ using namespace boost; using namespace std; //RANKING_OBJ_DEFINE; srand(0); { size_t i; scoped_array<vbdata> a(new vbdata[size]); scoped_array<vbdata *> b(new vbdata *[size]); for(i=0;i<size;i++){ b[i] = &a[i]; } pointer_less<vbdata> l; //less<vbdata *> l; boost::timer t; //RANKING_TIMER_DEFINE("ptr sort"); std::sort(&b[0],&b[size],l); /*for(i=0;i<size;i++){ vbdata& d=*(b[i]); cout << d.prio << endl; }*/ cout << t.elapsed() << endl; } srand(0); { scoped_array<vbdata> a(new vbdata[size]); boost::timer t; //RANKING_TIMER_DEFINE("def sort"); std::sort(&a[0],&a[size]); /*for(size_t i=0;i<size;i++){ vbdata& d=a[i]; cout << d.prio << endl; }*/ cout << t.elapsed() << endl; } } int main(){ vbsort_test(1024*32); }
昔、vectorは遅い!という事をこのブログに記したが、実際push_back()を使って事前に確保した領域を拡張しない限り遅くないのでネタとして*1ここにメモしておくことにした。
要するにvector<POD>がPOD*2配列と張り合いたいのならばresize使って必要な領域を確保してoperator []でアクセスすること。そしてpush_back()は使うな!である。
//正しいvectorを使った配列の使い方 //resize後 配列と同じように・・・ #include <iostream> #include <boost/scoped_array.hpp> #include <vector> using namespace std; const int gSize = 100; int main(){ typedef vector<int> vt; typedef boost::scoped_array<int> sa; sa a(new int[gSize]); vt v; v.resize(gSize); for(int i=0;i<gSize;i++){ a[i] = rand(); v[i] = a[i]; } return 0; }
そういえば、何故、resize operator[]が一番速い方法として取り上げたかをやっと思い出した。これから糞コードテストコード置き場は私のHDD内ではなくideoneが肩代わりしてくれるって事ですかね。 http://ideone.com/uGMtx > http://ideone.com/q9C0o
uskz
2010/07/26 16:08
reserveしてpush_back
studiokingyo
2010/07/26 18:57
チェック早いですね。POD配列のインターフェースと同じという利点があるのですが、reserve版も用意しておきます。
これはmalloc大好きな私にとっての宝物。何故今まで見つけられなかったのだろうと思う。多分、見つけたけど忘れていたのだと思う。
http://www.ibm.com/developerworks/jp/linux/library/l-memory/
http://search.auctions.yahoo.co.jp/jp/search?p=HP+ProLiant+ML
お子様のプログラミング学習用に、Linuxの練習用に・・・一家に一台激安PC。音が出ないって所がミソね。動画や音楽のマルチメディアに気が奪われないためにね。