「C#」を含む日記 RSS

はてなキーワード: C#とは

2008-02-27

Joel On Software私訳

訳してみた。あらためて、和訳はものすごく時間を要する作業だということがわかった。もうしないと思う。

注意:以下は意訳、適当訳、稚拙訳であり、誤訳を多々含んでいることは確実であり、Joel氏が本当に以下のように述べているとは限りません。

なぜMicrosoft Officeファイルフォーマットはこんなにもややこしいのか (そしてその対処法を幾つか)

Tuesday, February 19, 2008

先週、MicrosoftOfficeバイナリフォーマットを公開したが、このフォーマットは殆ど正気でないように見える。Excel 97-2003ファイルフォーマットは349ページのPDFファイルだ。でも待って、それで全部じゃない。このドキュメントには次の面白いコメントが書いてある。

それぞれのExcelワークブックは1つのcompound fileに収められている

つまり、Excel 97-2003ファイルはOLE coumpound documentで、それは結局、1つのファイル内にあるファイルシステムである。これは、理解するのにあと9ページはスペックを読まなくちゃならないぐらいには十分に複雑だ。そしてこれらの「スペック」は、普通我々が考えるようなスペックというよりは、Cデータ構造みたいに見える。これ全体が階層的ファイルシステムなのだ。

もしあなたが週末を、Wordドキュメントブログインポートしたり、あなたの個人的な財務データからExcelフォーマットスプレッドシートを生成するような気の利いたコードを書くのに使おうと思ってこれらのドキュメントを読み始めたなら、このスペックのややこしさと長さがそんな気をあっという間に失せさせるだろう。普通プログラマはこのOfficeバイナリファイルフォーマットについて次のような結論を下す:

この4つ全てについて、きみは間違っている。ちょっとだけ掘り下げて、これらのファイルフォーマットがどうしてこんなに信じがたいくらいに複雑なのか、なぜMicrosoftの悪いプログラミングを反映しているのではないのか、そしてそれを回避するためにあなたに何ができるか、を明らかにしよう。

理解すべき最初のことは、これらのバイナリファイルフォーマットはちょっと違ったデザインゴールを持って設計されたということだ。たとえばHTMLとは。

これらはすごく古いコンピュータで速く処理できるようにデザインされた。Excel for Windowsの初期のバージョンでは、1MBのRAM、20MHz動作の80386が Excelを快適に走らせることができるための妥当なものだった。このファイルフォーマット内には、ファイルを素早く開いたり閉じたりするための最適化が沢山仕込まれている:

これはライブラリを使うことを想定して設計されている。もしあなたがバイナリインポートするものを1から書き上げたいと思ったら、Windows Metafile Format (何か図を描く場合) や OLE Counpound Storage みたいなものをサポートしなくてはいけなくなる。もしあなたが Windows上でやるのなら、そうしたことをたいしたことのない作業にするためのライブラリサポート存在する... そういったフィーチャーを使うことは(元々)マイクロソフトチームのためのショートカットだった。でもあなたが全部を自分でスクラッチから書くなら、全部の作業を自分自身でやらなくてはいけない。

オフィスはcompound documentsに対して広範囲のサポートを持っている。例えば、スプレッドシートWord文書に埋め込んだりできる。完璧Wordファイルフォーマットのparserは、同じように、埋め込まれたスプレッドシートで何かインテリジェントなことが出来るべきだろう。

それは相互協調性(interoperability)を意識してデザインされてはいない。仮定されていたのは、WordファイルフォーマットWordからのみ読み書きされなくてはいけない、ということで、それは当時においては十分に合理的なものだった。これは、Wordチームのプログラマファイルフォーマットをどう変更するかについて決定を行う場合にはいつでも、彼らが気にするのは (a)何が高速か (b)Wordコードベースにおいて最小の行数になるのは何か、だったことを意味する。SGMLHTML-interchangeableといった標準ファイルフォーマットのようなアイデアは、最初にインターネットドキュメントの相互交換を実現するまで現実のものにはならなかった。それはOfficeバイナリフォーマットが最初に考案されてから10年後のことだったのだ。ドキュメントを交換するのにインポーターエクスポーターを使うことができるという仮定が常にあった。実際Wordは簡便な交換のために設計されたRTFと呼ばれるフォーマットを持っており、そのフォーマットは殆ど最初のころからあり、今も100%サポートされている。

それはアプリケーションの全ての複雑さを反映していなくてはいけない。 全部のチェックボックス、全部のフォーマッティングオプション、そして全部の、Microsoft Officeのフィーチャーは、ファイルフォーマットのどこかで叙述されていなくてはいけない。Wordパラグラフメニューにある、"Keep With Next" と呼ばれるチェックボックス、これはパラグラフを、その後ろのパラグラフと同じページに置くのに必要な場合は、次のページに移動させるもの(?)だが、これもファイルフォーマットの中に無くてはいけない。そしてこれはつまり、あなたがWordドキュメントを正しく読み込める完璧Wordクローンを実装したいなら、そういったフィーチャーを実装しなくてはいけないということだ。Wordドキュメントをロードする競争力のあるワードプロセッサを作っているのなら、ファイルフォーマットからそのビットをロードするコードを書くのには1分しかかからないかもしれないが、ページのレイアウトアルゴリズムをそれに対応させるのに何週間もかかるかもしれない。もしあなたがそうしない場合、カスタマーがあなたのクローンWordファイルを読み込んだら、全部のページがぐちゃぐちゃになってしまうだろう。

それはアプリケーション歴史を反映していなくてはいけない。 このファイルフォーマットに見られる多くの複雑さは、古く、複雑で、愛されず、めったに使われないフィーチャーを反映している。それらはファイルフォーマットのなかに後方互換性のためにまだあり、そしてMicrosoftにとってその辺りのコードを残しておくことには何らコストはかからない。しかしあなたがこれらのファイルフォーマットをparseおよびwriteする一貫した完全な仕事をしたいと思うなら、Microsoftインターンが15年前にやったのと同じことを全て、またやらなくてはいけない。要点は、何千人年の仕事が今のWordExcelには費やされてきたのであり、これらのアプリケーション完璧クローンを作りたいと本当に欲するなら、あなたは何千人年を費やさなくてはならないことになる、ということだ。ファイルフォーマットは単に、アプリケーションサポートする全てのフィーチャーの簡潔なサマリーなのだ。

手始めに、小さな例を一つ、深く見てみよう。Excelのワークシートは色々なタイプのBIFFレコードの集まったものだ。私はスペックの一番最初のBIFFを見てみたい。1904と呼ばれるレコードだ。

Excelファイルフォーマット仕様のこのレコードについての記述は非常に曖昧なものだ。そこでは単に、1904レコードが「1904日付システムが使われているかどうか」を示すレコードだ、と述べているだけだ。ああ、使えない仕様書の典型的な一例だ。あなたがExcelファイルフォーマットで何かしている開発者で、そしてファイルフォーマット仕様にこう書いてあるのを見つけたなら、あなたがMiocrosoftは何かを隠しているのだと結論付けたとしても無理はない。この情報の断片は十分な情報をあなたに与えはしない。あなたには幾ばくか外部の情報が必要で、私は今ここで、それを提供しよう。Excelワークシートには、2種類ある。日付のエポックが1900/1/1のもの(これには、Lotus 1-2-3 との互換性のために故意に入れられた閏年に関するバグがあるが、ここでそれについて述べるのは退屈すぎる)、および、1904/1/1のものだ。Excelは両方をサポートしているが、それはExcelの最初のバージョンMac版であり、それは単に簡単だったという理由でOSエポックを使っていて、しかしWindows版のExcel1-2-3ファイルインポートできなくてはならず、そしてそれは1900/1/1をエポックとして採用していたからだ。あなたが涙ぐむのも無理はない。歴史のどの時点においても、プログラマが正しいことをしなかった、という時はないのだが、しかし現実にあなたが手にしているものはこれなのだ。

1900と1904のファイルタイプは両方とも世の中には広く存在しており、それは通常、ファイルWindowsMacのどちらで作られたかによる。一方のタイプから他方のタイプへ黙って変換するのはIntegrity的に問題があるので、Excelファイルタイプを変換することをしない。Excelファイルをparseするためには、あなたは両方を扱わなくてはならない。それはファイルからこのbitをロードするだけの問題ではなく、あなたが日付表示と両方のエポックを扱うparsingのコードまで書き直さなくてはいけないということを意味する。実装には何日かかかるだろうと私は思う。

実際、あなたがExcelクローンの作業をするなら、日付の扱いについて、あらゆる種類の微妙ディティール発見することになるだろう。Excelは日付の値をいつ変換するのか? 表示の整形はどうやっているのか? なぜ1/31は今年の January 31と翻訳され、また一方で1/50はJanuary 1st, 1950と翻訳されるのか? Excelソースコードと同じだけの量のドキュメントを書かないがぎり、振る舞いに関しての微妙ビットを全て完全に記述することはできない。

そしてこのレコードは、あなたが扱う何百もあるBIFFレコードの最初の1つに過ぎず、しかももっとも単純なものなのだ。他のレコードの殆どは、より多くのプログラマーを涙に暮れさせるぐらいには十分複雑だ。

唯一導き得る結論はこれだ。

MicrosoftMicrosoftOfficeファイルフォーマットリリースしたことは大変有用なことだが、しかしそれでOfficeファイルフォーマットインポートしたり保存したりするのが楽になるということは全く無さそうだ。それらは狂気じみて複雑で、リッチアプリケーションで、そしてあなたは人気のある20%の部分を実装して80%の人々を幸せにするというくらいのことしかできない。バイナリファイル仕様によってなされるのは、多く見積もっても、著しく複雑なシステムリバースエンジニアリングにかかる時間を何分か削減するくらいだろう。

オーケー, 私はいくつか回避法を教えると約束した。良いニュースは、殆どの良く知られたアプリケーションにとって、Officeバイナリファイルフォーマットを読み書きしようと試みることは誤った決定だということだ。あなたが真剣に考えなくてはいけない代案が2つある。Officeそのものにそれをやらせるか、書き込むのが簡単なファイルフォーマットを使うかだ。

ヘビーな仕事Officeにやらせよう。WordExcelは実に完全なオブジェクトモデルを持っており、COMオートメーションの手段が可能で、これであなたは何でもプログラムでやるようにできる。多くのシチュエーションでは、Office内のコードを再利用するほうがそれを実装しようとするよりも良い。ここにいくつか例がある。

  1. Webベースアプリケーションがあって、それが既存のWordファイルPDFフォーマットに出力するようにする必要がある場合、それを実装するにはこうする: ファイルを読み込んでからWord 2007のビルトインのPDFエクスポーターを使ってそれをPDFとして保存する、数行のWord VBAコードだ。あなたはこのコードIISで動作しているASPASP.NETコードから直接呼び出す。これでうまくいく。最初にWordを立ち上げるときは数秒かかる。2回目はCOMサブシステムによりWordはまたあなたがそれを必要としたときのためにメモリ中にキープされている。それは通常のWebベースアプリケーションにとっては十分に速い。
  2. 上と同じ。ただしあなたのWebホスティング環境Linuxだった場合。フルライセンスWordインストールされたWindows 2003サーバを買う。そしてその仕事をする小さなWebサービスを構築する。C#ASP.NETでの半日の作業だ。
  3. 上と同じ、ただしあなたがよりスケールさせたいと望む場合。ステップ2で構築した全部のボックスの前にロードバランサーを置きなさい。コードは必要ない。

この手のアプローチは、全ての種類の一般的なOfficeタイプについての、サーバ上であなたがやりたいと思うであろうアプリケーションで、うまくいくだろう。例えば:

これらのケースの全てにおいて、Officeオブジェクトインタラクティブ動作でないことを教えてやる方法があり、だから表示をアップデートするのに煩わされたり、ユーザ入力を促す必要はない。ところで、このようなやりかたでいく場合には、gotchas(?)がいくつかあり、そしてそれはMicrosoftは公式にサポートしているものではない。だからあなたがそれを始める前にはKnowledge baseの記事を読むように。

書き込むファイルにはもっとシンプルフォーマットを使いなさい。単にOfficeドキュメントプログラムで生成したいなら、殆どいつでもOfficeバイナリフォーマットよりももっと良いフォーマットWordExcelでも問題なく開くことができるようなフォーマット存在する。

いずれにせよ、全てのOfficeファイルを完全に読み書きできるような、文字通りのOffice競合製品を作ろうとする(その場合には、何千年もの作業があなたに予約される) のでない限り、Officeバイナリフォーマットの読み書きをするというのは、何であれあなたが解決しようとしている問題を解決するためのもっとも労働集約的な方法だ。

2008-02-24

http://anond.hatelabo.jp/20080224144209

おもいっきり同意しかねる。オリ増田はこれから情報系の大学生になる人だろう?

C#Java、その他 lightweight 言語などのメモリアロケーション自動でやってしまうような言語から入門しても内部動作の理解ができない。

文字列の連結は a . b でおk!ってだけでは情報工学を専門とする学生ではお粗末すぎる。

Cから学ぶのはプログラミングだけが目的ではなくて、コンピュータがどうやって動いているのかを理解しやすいからでもあるのだ。

そしてかつ現役一石二鳥の手であるのだ。

プログラミング入門として、オブジェクト指向をとりあえず脇においておけるのもいいかもしれない。

その後オブジェクト指向として C++ に移行するのが大学カリキュラムとしては王道じゃないかな。

ランクの高い大学だとその後 Java とかは、知っているものとしますので予習しておいてください、という流れになるんだろうね。

後は lightweight 言語のどれか1つを趣味でやっておけば、大抵の言語は入門ぐらいなら1日でできるようになる(なってほしい、ちゃんと概念を理解、体験していればなるはずだ)。

大学院になるともう Matlabなっちゃうけどね。

Matlab Love

C#がいいよ

Cはお勧めしない。なぜかと言うと、Cは言語使用があまりにいい加減だから。特に型関係がひどいのだが、型の概念をきちんとつかめないと、問題をプログラムに落とすのが下手になるので、俺はCはお勧めしない。

C#Javaがいいよ。どちらもC言語に似ているといわれるが、とっつきやすいように字面を似せているだけで、どちらもCとはまったく違う言語になっている。Cの悪いところはばっさり切り落としているので、その分勉強やすい。これはC++を薦めない理由でもある。C++はCと互換性を維持しているので、ぐちゃぐちゃになってしまった。CとC++は本当にそれじゃないとダメな局面にきたときに勉強すればいい。

C#Javaも入門コンテンツネットに転がっているので、好きな奴を読めばいい。

C#Javaを薦める別の理由は、そのライブラリが極端に充実していることがある。Cでプログラムを書いていると、たまに、何で俺がこんなことをやらないといけないんだ?世の中で何万人が同じことを回転だよ?、と思うようなことがある。言葉を変えると、非常に基本的な機能が無かったりする。C#Javaは、基本的な機能の膨大なライブラリを含むのでそれを利用できる。

C#Javaも良質の統合開発環境がある。C#にはVisual Stuido .Net Express for C#が、JavaにはEclipse無料で提供されている。Javaには.net版もあるが、もうサポート停止だし互換性もよくないのでお勧めしない。

C#Javaも型に厳しい。世の中には型に寛容な言語というものもあって、そういう言語が活躍する局面もあるが最初にきちんとした型を覚えておくというのは、スポーツや他の勉強と同じく他の言語と同じ。

Visual Studio express for C#には膨大な日本語オンラインヘルプが付いてくる。これは心強い。言語の基本からライブラリまでカバーしているので、旅先に本を持っていかなくてもPCがあればプログラミングには事足りる。

http://anond.hatelabo.jp/20080224122041

2008-02-19

Delphi使いやすいよね

1.0が出たときは唖然としたもんだ。

ところで、初めてプログラミングしてるんなら、落ち着いたところでC#お勧めDelphiの設計者がDelphiにやりたかった事を叩きつけて作ったような言語なので、違和感無いとおもう。べらぼうにライブラリが充実しているのもいいところ。

http://anond.hatelabo.jp/20080204133328

2008-01-31

何も知らない俺がIT土方になるまで。

高専化学っぽいところ出て、大学化学っぽいところに編入して、

東京来て、初めての仕事PHPで、誰に頼ればいいかもわからず、

最新の言語に興味も無く、セキュリティーも知らなかった。

使ってた言語?VB4とHSP2でしたが何か。

 

初めての仕事で学んだこと

 

その後もいろんな会社

 

とか、けっこう酷いことをして、たくさんの人に迷惑をかけましたが、

今ではそれなりにIT土方をやっている。

…という俺から見ると、PHP初心者罵倒は、見るたびに、なんだか恥ずかしさを思い出す。

ああ、明日も仕事だし、勉強するね。うん。みんなごめんなさい。それは全部俺がやった事です。

 

あれです。

ごめんなさい。

2008-01-23

http://anond.hatelabo.jp/20080122013133

> 例えばDVDが普及した今、VHS技術が専門の人なんて何の役にも立たないわけ。

> 今まで磁性テープを20年くらいやってきたオッサンに、

> いきなり光学の話フォローしろってのも酷な話。

VHS技術が専門の人って具体的にどんな人なんだろう?

研究者かなんか?それだったらVHSが廃れたからっていきなり首切られることはないよね。

自分の分野の話になって恐縮なんだけど、例えばTCP/IPについて

誰よりも深い見識があったとして、そんなことは何の金蔓にもならないの。

単なる技術オタクExcelCOBOLVBも同じ。今有効な技術はいずれ廃れる。

で、今までCOBOLしか出来なかった人がJavaが出来ませんって駄々こねて

ドロップアウトしたり、VB6がVB.NETになったぐらいで狼狽する人が世の中には

腐るほどいるんだけど、そんなの元から自分の分野に対する見識がなくて、

小手先のどうでもいいテクニックだけでその場その場を切り抜けてきたことの

ツケが回ってきただけで、本当にその分野を理解している人間なら、ある日を境に

自分の持ってる知識がゴミの塊になることなんてあり得ないんです。

少なくとも自分のまわりの優秀な技術者はみんな最新技術なんか難なく習得しているよ。

最新技術についてこれるから優秀、というわけでは断じてない。

> まして技術進歩ドッグイヤーも真っ青の超スピード

これはたぶんインターネットコンピュータのことも指していると思うんだけど、

ことプログラミングに関して言えば、半世紀前からこの分野は本質的には「全く」

進歩していないよ。確かにJavaとかRubyとかC#とか流行りの言語どんどん

生まれてきているけど、これらは既存の概念パズルのように組み合わせただけの

代物で、概念そのものはずっと昔からある。それらをマスターしていれば

技術の移行には半日で十分。それが出来ない人はまだまだ未熟だ。

とりあえず私の所感としては、スペシャリストゼネラリスト関係なく

ルイス・キャロル言葉を贈りたい。

「同じ所にとどまろうと思うなら、全速力で走り続けなさい」

2008-01-05

スーツギーク作業着

オレはスーツなんてカッコいい服も着れず、ギークみたいなスマートな考えや自己表現もできず、

工場勤務の「作業着」な組み込みソフトウェアエンジニアだった。

何となく地味な感じがし、それが嫌で組み込み系の開発から離れ、Web系とかオープン系?的な仕事に移った。

From マイコン上でC/アセンブラ To Windows/Unixサーバ上でJava/C#/VB/Perl...+色々なライブラリフレームワーク

スーツを着て直接お客さんに会う機会も出来たし、瑣末なモノだけど自分が利用したオープンソースに対してパッチを送ったりもした。

でも、なんか違う。本当のスーツには敵わないし、ギークみたいにいろんな事を知らない。なんか仕事の達成感も少ない。

今になって思ったよ「作業着」を着て開発してた時がすごく楽しかったって。

何時も「作業着」を着てコードゴルフをしてた気がする。(必要に迫られてだけど)

Webアプリ作りなんかより色々と考える時間が多かった。独自の制御アルゴリズムとかね。

上で書いた地味な感じというのは、着てる服が「作業着」で工場勤務だからオレって土方だよなぁって当時は自分で思ってたから。

でも、今やってる事の方がよっぽどIT土方だなぁって思ってる。

なんかここ↓見てたらモノ作りしたくなった。

http://monoist.atmarkit.co.jp/

いや、そんだけです。

2008-01-03

http://anond.hatelabo.jp/20080103002929

すごいねこれwww

怪しすぎるわー。パソコン検定何級なんていうのと同レベルだわ。ここの資格持ってたら書類で落とすね。

(うちの会社アビバでどうこうって言う人が来たら確実にとりません)

つうか今からVBを学ぼうという人の気が知れないけど。

結局.NETCLRがどう動くかを頭に入れなきゃいけないんだから、変に引きずられないC#から入ればよいのに。

2007-12-03

意外にそうでもなくて

本当の難関は古くささにあるんだけどね。マジレスすると、Delphi使うならC#のほうがお薦め

http://anond.hatelabo.jp/20071203124129

2007-12-02

ここで勝手言語論争ごっこ

一番使い勝手の良いプログラミング言語Perlどぅわ!

C/C++/C#なんて気軽に文字列処理できないし、

Windowsでしか使えないVisualほにゃらら

メモリの確保、解放なんてしたくない

だいたい、セグメンテーションフォルトを起こすような言語は嫌い

DirectXOpenGLとお友達になりたくない

Haskelわけわかんないし

Java重苦しいし、いちいちclass Hogehoge { public static void main() { ... } }書くのがめんどくさいし、API多すぎ

オブジェクト指向したくなるような複雑なプログラムは最初から考えない(作れない)

GUI作りたくなるような言語はめんどくさい

言語が提供するGUIのツールはOSとは別に独自のレイヤー世界感を持っててとっつきにくい

マルチスレッド、排他処理を扱うようなプログラム脳味噌がついて行かないので書かない

CGIにしか使えないようなPHP

Ruby、、、そもそもLL言語で大規模でオブジェクト指向プログラム書きたくない。小規模ならオブジェクト指向要らない。

俺のマシンで実行できないAda/Basic/Fortran/Pascal その他いろいろ

VHDLVerilogFPGAやゲートアレイなんて持ってない、持ちたくない(苦手だもん)

データベースなんかいじってたまる

HTMLXML日本語タグが入り乱れるので、そのつど日本語入力の切替えが死ぬほど嫌になった。

だから、HTMLXMLは全部手入力なんて真似は絶対してやらねえ。

Flex(Action Script)はコンパイラJavaで実装されてて重すぎる。(シェルを使えばまし)

JavaScriptブラウザごとの挙動の違いを吸収しきれる自身が無いので使わない。

1プログラムにつき、(コメント含めて)250行以上書きたくない

複雑なプログラムを最後まで書ける連中が羨ましい。

排他制御にとちって、デスロックしてしまえ。

(本文には触ったこともない言語を思い込みで罵倒しているなど、嘘、おおげさ、紛らわしいが多数混入しています。それが全部わかった貴方プログラミング言語マスターです。)

2007-11-02

Visual C# Express Editionのダウンロード時の質問項目がひどすぎる

バカすぎる。俺は学生なんだが、

こんな質問に答えられるわけがないだろ。「お客様の主な役割について最も適したものをお聞かせください。」という質問に「学生」って答え作ってるんだから、学生にしたら上の質問を無効にしろよ。「システムを導入するにあたっての、あなたの立場を教えてください。」は確実に答えが選択肢にないんですが。学生は不可なのかと思って対象ユーザーをしらべたけど、ちゃんと学生も対象に入っている。

Visual C# 2005 Express Edition は、学生や、プロフェッショナルではない開発者を対象ユーザーと想定して作成されています。Visual C# 2005 Express Edition には、Visual Studio 2005 Professional Edition と同じ機能が多数用意されていますが、アプリケーション開発を簡単に始めることができるようにシンプル化されてもいます。

http://www.microsoft.com/japan/msdn/vstudio/express/faq/default.aspx#vcsharp学生向けを意識してるなら、質問もそれ向けに作ってくれよ。あれか製品自体は学生向けだけど、無料ダウンロード学生禁止なのか?もうどうでもいいや。

あ、あと

どのプログラミング言語の話題に興味がありますか。
HTMLXMLが入ってるのもアレHTMLプログラミング言語って言うのは意外とマイクロソフトが広めてるのかもしれない。

2007-10-30

[]55行で作るC#テンプレートエンジン

http://anond.hatelabo.jp/20071030034313二番煎じ

あまりのアホさに、作ってて気が狂いかけた

方針


using System;
using System.CodeDom.Compiler;
using System.Collections.Generic;
using System.IO;
using System.Reflection;
using Microsoft.CSharp;

delegate void ConvertTemplateDelegate(TextWriter tw, Dictionary<object, object> args);
static class TemplateGenerator {
    public static ConvertTemplateDelegate Generate(string code) {
        CompilerParameters param = new CompilerParameters();
        param.GenerateInMemory = true;
        param.ReferencedAssemblies.Add("System.Web.dll");
        CompilerResults rs = new CSharpCodeProvider().CompileAssemblyFromSource(param, ParseTemplate(code));
        if (0 < rs.Errors.Count) {
            StringWriter sw = new StringWriter();
            sw.WriteLine("Compile Error...");
            foreach (CompilerError err in rs.Errors)
                sw.WriteLine(err.ToString());
            throw new Exception(sw.ToString());
        }
        return (ConvertTemplateDelegate) Delegate.CreateDelegate(typeof(ConvertTemplateDelegate), rs.CompiledAssembly.GetType("Template", true).GetMethod("Convert"));
    }
    private static string ParseTemplate(string code) {
        using (StringWriter sw = new StringWriter()) {
            sw.WriteLine("using System; using System.Collections.Generic; using System.IO; using System.Web;");
            sw.WriteLine("public static class Template {");
            sw.WriteLine("public static void Convert(TextWriter tw, Dictionary<object, object> args) {");
            int index = 0;
            while (0 <= index &amp;&amp; index < code.Length) {
                int i = code.IndexOf("<%", index);
                sw.WriteLine("tw.Write(\"{0}\");", EscapeString(i < 0 ? code.Substring(index) : code.Substring(index, i - index)));
                if (0 <= i) {
                    i += 2;
                    int i2 = code.IndexOf("%>", i);
                    if (0 <= i2) {
                        string cc = code.Substring(i, i2 - i);
                        if (cc.StartsWith("="))
                            sw.WriteLine("tw.Write(HttpUtility.HtmlEncode(\"\"+({0})));", cc.Substring(1));
                        else
                            sw.WriteLine(cc);
                        i = i2 + 2;
                    }
                }
                index = i;
            }
            sw.WriteLine("}}");
            return sw.ToString();
        }
    }
    private static string EscapeString(string code) {
        return code.Replace("\\", "\\e").Replace("\"", "\\\"").Replace("\t", "\\t").Replace("\n", "\\n").Replace("\r", "\\r").Replace("\\e", "\\\\");
    }
}

サンプル C# コード。ためしにテンプレートから Xml 生成して、標準出力してみる。

class Program {
    static void Main(string[] args) {
        ConvertTemplateDelegate func = TemplateGenerator.Generate(TemplateEngine.Resource1.template);
        using (StringWriter sw = new StringWriter()) {
            Dictionary<object, object> arg = new Dictionary<object, object>();
            arg["title"] = "template sample";
            arg["data"] = new string[] { "foo", "fooo", "<strong>foooooooooo!</strong>" };
            func(sw, arg);
            Console.WriteLine(sw);
        }
    }
}

サンプルテンプレート

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
          "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
  <head>
    <title><%= args["title"] %></title>
  </head>
  <body>
    <h1><%= args["title"] %></h1>
    <table>
<% string[] data = (string[]) args["data"]; %>
<% for(int i = 0; i < data.Length; i++) { %>
      <tr bgcolor="<%= i % 2 == 0 ? "#FFCCCC" : "#CCCCFF" %>">
        <td><%= i %></td>
        <td><%= data[i] %></td>
      </tr>
<% } %>
    </table>
  </body>
</html>

出力例

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
          "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
  <head>
    <title>template sample</title>
  </head>
  <body>
    <h1>template sample</h1>
    <table>


      <tr bgcolor="#FFCCCC">
        <td>0</td>
        <td>foo</td>
      </tr>

      <tr bgcolor="#CCCCFF">
        <td>1</td>
        <td>fooo</td>
      </tr>

      <tr bgcolor="#FFCCCC">
        <td>2</td>
        <td>&lt;strong&gt;foooooooooo!&lt;/strong&gt;</td>
      </tr>

    </table>
  </body>
</html>

CodeDom 使って動的コンパイル……って、このコードのままだとセキュリティ的に大問題な気がするな。

素直に ASP.NET 使ったほうが楽だと直感した。

あと EscapeString すっごく自信ない。たぶん修正が必要だと思うw

2007-09-19

[]4日目

Eclipse経由を諦めてAptana IDEをそのまま使うようにした。

なんかこれは、まんまEclioseなのかもしれない。同じコードから作られてるのかな?

使いやすいよ。

昨日の続き

昨日の続きでこれをやった。

Windowsで簡単にRuby on Rails:Instant RailsAptana

http://japan.zdnet.com/sp/report/story/0,2000056431,20352478-3,00.htm

まずは、図11のようにテーブル名の単数形である「category」、「recipe」でそれぞれモデルを作成する。「GO」ボタンクリックするだけだ。

まったくもって何を言っているのかわからない。

そして図11なる画面をどこで呼び出すのかもわからない。

「みちこさん?パソコンを立ち上げるっていうのは縦に置けばいいのかいのぉ・・・?」

つまりはそういう感じだ。

うりうり探してたら、初期表示画面の画面下部のタグにGenerators画面があった。

scaffoldを実行とか書いてある。何これ趣味悪い。

scaffoldって絞首とか処刑とかそういう意味じゃなかったっけ?

足場っていう意味もあるのか。なんか違和感

で、なんなんだ!?

なんだかよくわからないまま連載終了。・・・くっ。

Aptana Eclipseプラグインで始めるRuby on Rails

Aptana Eclipseプラグインで始めるRuby on Rails

http://blog.codezine.jp/editor/2007/06/aptana_eclipseruby_on_rails_1.php

前にも見たことがあるこれにもどってきた。

現段階の環境構成でAptana IDE経由でRubyHello Worldを試す。さくさく。

おー。

この一連のコラムが、いままでの中で一番わかりやすかった。(目次はわかり難い)

ちなみにscaffoldの回のurlはここ。

http://blog.codezine.jp/editor/2007/08/ruby_on_railsscaffold_1.php

上のコラムをやって疑問点、へーっと思ったこと

Aptana IDEブラウザ内臓ってどこから呼び出すんだろ?

→下部WindowにあるServerタグのところにアイコンでLunchBrowserというのがあった。

ウインドウ:設定のところでFireFoxにも変更できる。

設定ついでにワークスペースエンコードの設定の欄を発見utf-8に変換した。

エンコードの状態をステータスバーなどに表示させておく方法はないのだろうか?探したが見つけられなかった。)

Generatorsタグが消えてしまった。

パースペクティブRubyになってた。これをRuby on Railsに。

Rake tasksを実行したりするとGeneratorsのプルダウンが出なくなる。なんでだろう?

ウインドウで新規ウインドウを開いたりして誤魔化している。

なんとかならないものか。

http://blog.codezine.jp/editor/2007/06/ruby_on_rails_migration1.php

RailsではmodelファイルDBのテーブルと対になります。

いわゆるO/Rマッピングというやつです。

へーーー!!そういう意味だったのか。

今日感想

今年買ったメーカー製のほとんど素のマシン

メモリを512MBしか積んでないのでページングしまくり

しかたがないのでこまめにテストサーバーを止めて対応。

IDE系統でメモリ食ってるのかな?落とすと300MB近くあく…。

1Gまでもっていかれちゃうと終了もままならなくなるので注意が必要そう。

Hello worldレベルでこんなんなってちゃ世話ない。

win系がダメなだけかな?

  • テーブル単体のI/Oはできるようになった。

複数を組込むにはどうしたらいいのだろうか。

さすがにheader/detailでDB参照したい。

追記:なんか少し調べたけどもしかしてRuby on RailsってO/Rマッピングオンリー…?

そんなまさか…。いや、いくらなんでも…。

http://www.web-career.com/seminar/ruby_on_rails.html

  • 今週中に予定していたアプリを作りこむのはムリ。

作る内容をもっとシンプルアイディア勝負なヤツに変えようとおもう。

[Ruby]3日目

http://anond.hatelabo.jp/20070918200857

2007-09-01

http://anond.hatelabo.jp/20070831005830

オレとほとんど同じ境遇でワロタww

金融系のシステム会社入ってエクセルマクロで作業効率図って、先輩、上司仕事と認めてもらえないあたりまで全く一緒。www

給料いいみたいだから俺と同じ会社ではないようだが。w

COBOLって本当になんであんなにゴミなんだろう。

いや、安定するってのはわかるんだが、javascriptjavaC#なんかで簡単にできることがなにもできない。

ソートするだけですらcobolプログラム内部ではやらなくて(できないわけじゃないが)、一度ファイルを作ってjclからソート

いまだに漢字とか使いにくいし。(まぁ、日本語cobolなんてのも世の中にはあるわけだが、あれもゴミだね。

ちなみに、cobolでもコメントになら全角文字打てるはずだぞ。

0x0A42 ?? 0x0A41 とかの漢字シフトコードいれるんだよ。

>俺は80文字×32行の緑文字を見つめながら、遠い夢を見続ける。

あなたならそれでやるよりソースダウンロードしてテキスト編集したほうがいいっしょ?

2007-07-22

[]C#にあるようなプロパティもどき

getter/setterを関数で書くと、後ろに()を付けないといけないから格好悪い!!

って人にオススメ

template<typename T>struct _property{

  virtual operator T() = 0;

  typedef T _t;

};

class asdf{

  int foo;

public:

  struct __foo : _property<int>{

    asdf &parent;

    operator _t(){

      printf("親クラス(?)のメンバへのアクセスが面倒...");

      return parent.foo;

    }

    __foo(asdf &p) : parent(p){}

  }y;

  struct : _property<char*>{

    operator _t(){

      printf("ここに副作用付き処理を書ける!?\n");

      printf("この関数が参照を返せばgetもどきも実装できる!?\n");

      return "ふひひひ!やったね!!";

    }

  }x;

  asdf(int v) : y(*this){ foo = v * v - v - v; }

};

void p(char*s){ printf("\n増田はこちらを振り返ると、\n悲しそうな顔をしてこう言った\n「%s」\n", s); }

int main(){

  asdf a(127);

  //生でprintfに渡すと型推論が行われない

  //それ以外の関数だったら問題ないかも

  p(a.x);

  printf("\n");

  //どうしてもと言うならキャストすべし

  printf("\n%d\n", (int)a.y);

  return 0;

}


VC8で動作確認してるよ!

はっきり言って普通にgetter/setter書くよりも手間多いね!

あとcppシンタックス表示使うと文字化けしちゃうから引用ブロックに入れておいたよ!

2007-07-13

不満をつらつらと

  1. 二十歳過ぎた男を女と勘違いする奴って何なの?そりゃ髪がイエうたのハルみたいだったり色白だったりチビだったりするけどさ、肩幅が異様に広かったり声が低すぎたり髭の跡が見えたりナイムネ過ぎたりで、普通気付くでしょが。ボーイッシュって、そりゃ当たり前だ。
  2. トイレット行くとき、直接的表現だと気分を害するかなーと思って婉曲的に表現したのだから、その辺りの意図を汲み取ってよ。そりゃ「ちょっとキヤノン会長のところに行ってきます」って言ったのはマズかったよ。でもさ、前「花を摘みに行ってきます」って言ったら「どんな野薔薇を散らすんですか?」って茶化したのは誰だよ。
  3. 知らないプログラミング言語の課題を訊かないでよ。PHPとかJavaとかBasicとかRubyとかC#とか訊かれても答えられないよ。出来るのはC(とC++)とPascalPerlだけって言ってるのに、何でそれらは訊かないで、未知の言語ばっかり質問するのさ。しかもこれからの時代はPHPだとかJavaだとかRubyだとかC#だって説教するんなら自分で解いてよ。
  4. スズメバチの退治なんてやらせないでよ。恐いよ。しかもさ、ハチスプレー高いんだよ、数千円とか。そりゃ何度かアシナガバチ退治したことあるって言ったけどさ、アシナガバチスズメバチじゃ雲泥の差だよ。だって奴ら、アシナガバチ狩るし。アシナガバチ倒せるのは相手も同じってことだよ。しかも、見るとキイロスズメバチじゃん。凶暴な種じゃん。恐いよー毛深いよー。
  5. 何でも知ってるデータベースか何かみたいに扱わないでよ。いきなり小狼シャオラン)とか言われてもわからないよ。CLAMPは、せいぜいちょびっツ知ってるくらいだよ。柚姫イイよね。School Daysがどうとか言われても、付いていけないよ。つかどんだけアニメ見てるんだよ。そのくせ何で「デスラー総統万歳」を知らないんだよ。往年の名作じゃないか。
  6. 八つ当たりしないでよ。あいつが悪いって言われても、現場に居なかったんだしわからないよ。どっちの味方だって尋ねられたって、どっちとも答えようがないよ。非同盟政策ってやつだよ、栄光なき孤立。そしたら八方美人みたいに言うし。どっちにも肩入れしてない……っていうか、出来るはずもないじゃない。八方美人はどっちにも肩入れする場合でしょが。

2007-05-24

http://anond.hatelabo.jp/20070524000131

そうそう、プログラムの組み立て方を学ぶ前の、とりあえず試すために覚える言語ってなにがいいのかな?

とりあえず俺のおすすめを書いておくよ。

  1. まず、「文字を書いたら結果が出る。文字を変えたら結果が変わる。ミスをするとたまに変なことになる、思い通りになるのではなくて書いたとおりになる」を習得するために、HTML3.2をやる。開発環境がどこにでもあるのも良い。
  2. 次に、ゲームで恐縮だが「カルネージハートポータブル」をやるとよい。PSP版はわかりやすいチュートリアルも付いているしおすすめだ。繰り返し、条件分岐、ブラックボックスっぽい「チップ」という名の「ライブラリ」を組み合わせて、勝利するという「目的」に向かってプログラムを組みまくるという体験ができる。このとき、一通りクリアするまで絶対に他人のプログラムを読まないこと!(モチベーション維持のため)あと、カルネージハートには大会等も開かれているので、他人のソースが結構読める。クリア後は、他人のプログラムを読んで意図を汲む練習をここで行うことができるので必ずやっておこう。
  3. その次、Cを授業か独習Cなんかでつまんねーなと思いながら習得すべし。
  4. C++を、他人のソースが読める程度に習得。
  5. やりたいことができる、イマドキの言語へ。Rails使いたかったらRubyだっていいし、ManagedDirectXのためにC#やったっていい。
  6. 気が向いたらlisp

まあでも結局、「プログラミングがしたいからプログラムを覚えよう」っていうのは身につかないんだ。

PCにこれこれをさせたい!」と強烈に思って、なんとしてもやりきらなきゃいけない状況に追い込まれれば簡単に習得できるよ。「ゲームが作りたい!」「エロ画像自動で集めたい!」「卒論データをどうにかして分析しないといけない!」でもなんでも良いんだけど。

EXCELテキストファイルから物凄い大量の入力をしてグラフを大量に印刷しなきゃいけないとかいう羽目になってVBAの達人になっちゃうとか、そんな感じ。

2007-05-02

プログラミング言語ヒエラルキーにおける罵倒

http://www.geekpage.jp/blog/?id=2006/12/13

プログラミング言語ヒエラルキーにおいて、上位が下位に対してどう見下してるのかを書いてみた。詳しくない言語も無理して調べながら書いてある。あと、言語に理解の無い人みたいで生々しいかと思って、刺激的かつあまり真っ当でない内容ばっかにしてみたよ!((FORTRAN から Java に「GO TO も実装されてないんですか?」とかそういう、馬鹿にすることを目的とした偏狭で的外れな発言ってことだよ!))((ここにある中では、C# に多重継承が無いことを馬鹿にする C++ プログラマーが真っ当でない指摘のわかりやすい例かな))

みんなが普段どういう不当な見下しをしてるかも教えてね!

Lisp → C

「いつまで経っても言語仕様が貧弱で大変ですね」

アセンブラ → C

「結局アセンブラ翻訳してるだけじゃん」

C → C++

C++ の難解な仕様と戦うぐらいなら C で関数ポインタを使ったオブジェクト指向の方がスマートだね」

STL は糞」

C++C#

中途半端ポインタを隠蔽して何がしたいの?」

「多重継承したくなったらどうするの?」

C → Perl

CPAN 見たって C でコア部分を書いてるライブラリばっかじゃん」

「なんでわざわざ use strict なんて書かなきゃいけないの」

PerlPython

Python って明示的に object継承した場合としなかった場合で挙動が違うって本当なの?」

「インデントブロック(笑)

Python → OO PHP

ライブラリ環境が全然整備されてなくて最悪じゃん。C や C++ で書かれたライブラリをラップしてるだけのはずなのに機能が減りまくってるのも多いし」

OO PHPPHP

ベタ書きしてて楽しい?」

PHPAjax

ウェブブラウザでしか動かないプログラム書いてて楽しい?」

AjaxJavaScript

「簡単な処理をコピペで実装してるだけだね」

JavaScriptVisual Basic

As とか書いてて混乱しない?」

C# があるのにまだ使ってるんだ」

FORTRANCOBOL

「冗長でわかりやすいですね(笑)

「DIVISION の概念って本気で言ってるんですか?」

COBOLAda

「航空宇宙産業専用言語でしょ」

「記述がわかりづらいね」

JavaScriptAda

ペンタゴンで使われてるだけじゃん」

「ガベージコレクタが無い……?」(あるらしいです><

AdaPascal

「昔 Apple で使われてただけじゃん」

「Del…phi…?」

PascalJava

コンパイルも実行も遅いらしいけど何に使うんですか?」

JavaHTMLプログラミング言語であると主張する人々

「処理も記述できないのに何言ってるの」

おまけ

マイクロソフト・ジョークス/プログラミング言語が女性なら

2007-03-17

プログラミング言語

世の中いろいろなプログラミング言語があるけど、**言語仕様が**特定のOS専用に設計された言語って見たことないな。

(C#とかはそれに近いけど)

OSプログラミング言語をひとつにして開発して、あとはCygwinみたいな感じでエミュレートできるようにすれば、けっこういいOSになるかと。

(まあ言語仕様オバケになるのは間違いないけど)

たとえばパッケージマネージャあたりは言語仕様に組み込むべきだよ。

2007-03-04

http://anond.hatelabo.jp/20070304154248

なにをいってやがるんだか。まあお説はもっともなんだけど。比べるもんじゃないでしょ。両方覚えて、適所で使え。

(書いてるうちに他人とかぶった…)

特集 私がJavaからC#に乗り換えたくない10の理由

2007-01-29

[]キーワードテスト

OK

C# $10 (T_T) *ist D +ANIMA yes,mama ok -196℃ .book c/w :active ave;new アンリ・カルティエ=ブレッソン ?B @CHaT [TV] ^H _no PE`Z ||リ・_・`川

文字参照ならヒットするもリンク書き換えならず

AirH" AirH" 女子高生 GIRL'S-HIGH 女子高生 GIRL'S-HIGH MÄR MÄR (*゚∀゚)ノ パキャッ (*゚∀゚)ノ パキャッ

文字参照に変換されるため双方上と同様に

R&B R&B のどごし<生> のどごし<生>

キーワード文字参照ではないが変換されるためヒットせず

P&G

存在するはずだがたぶんはてな側の問題かな?

!K7

含むキーワードを見つけられず

% \ { } ~

キーワード関連

<p&gt; <p&gt; <p>

というわけで、残るは文字参照関係だけかな。

ログイン ユーザー登録
ようこそ ゲスト さん