acer & win8 で IE10 を使ってみる

acer w500 に windows 8 customer preview を入れて IE10 でブラウジングしているところです。

画像が多いめのサイトを閲覧すると、ちょっと重たい…というかテーブルやCSSの認識がいまいちなのか、ロード中に何度も画面が書き変わります。これは、iPad でも同じで、画像が多いとブラウザ自体のキャッシュがオーバーフロー気味になるのかスムースに表示されません。このあたり、タブレット PC もターゲットに入れた Web サイト作りが模索されるのかも。

iPhone や Android 対応の Web サイトが出てきているわけですが、スレート PC という中途半端な解像度にも対応していかないといけない感じですね。

image

上から指をスライドさせると、切り替え可能なページが表示されます。URLを直接入力したい場合はソフトウェアキーボードを使うとのは iPad も同じです。ただし、iPad は iOS5 から、タブブラウザになったので、この IE10 のインターフェースが1年後どう見えるのか?はちょっと疑問かもしれません。

image

metro IE10 では、Flash が表示されないので、Youtube が見れません。

とんち協会&滑稽珍聞 : 動画コレクション(The Best Science Fiction films) が見れないという落ちが。ちなみに、闇嶽さんのページが悪いのではなくて、わざと IE10 で表示できないページを持ってきただけです。

image

ちなみに、iPad の場合は、youtube は見れます。ちょっと、これはなんとかしないと駄目かなぁと。

image

デスクトップのほうの、IE では Flash が動くので、そちらのほうで見ればよいのですが、UI として metro IE から desktop IE への転送機能が用意されていません。しかたがないので、metro IE の URL をソフトウェアキーボードでコピーして、

image

スタートページから「デスクトップ」を開いて、IE を開いて、URL を貼りつける、という非常に手間な方法が必要になります。こりゃ、ちょっとまずい。

ちなみに、IE10 のスクロールの動きはかなりいまいちで、スクロールさせると Flash のコントロールが追随しません。かなり画面がずれて、動くというベータ版っぽい動きです。まぁ、Customer Preview なのだから、という考えもできますが、「消費者調査」としては減点の大きいところですね。

image

付属の metro app のピンボールゲームを動かしたところです。グラフィック自体は、特に問題なく動いています。解像度が iPad よりも低いのできれいさは少ないのですが、そのあたりは win8 に適したハードがでれば、ぼちぼちと解決されるかと。

image

ただし、このピンボールゲーム、左右のタッチでバンパーを動かすのですが、非常に反応が遅いです。ピンボールなのだから一瞬で反応してくれないといけないのに…ってな具合で、スレート PC に win8 を入れてアクションゲームは辛いかもしれません。ちなみに、iPad のピンボールゲームは、綺麗に反応します。

どこが悪いのか分からないのですが、

  • まだ、metro アプリのグラフィックライブラリが未完成で、タッチの反応がにぶい。
  • まだ、metro アプリのグラフィックライブラリが未完成で、反応後のグラフィックの性能がでていない。
  • ハードウェア&ソフトウェア的に、タッチの反応がにぶい。

ことが考えられます。最初の2つが原因だったら、おいおい解決される問題なのですが、最後の「ハードウェア的な問題」だとすると致命的ですね。

image

acer は 32GB の SSD を積んでいるのですが、Windows 7 Home から Windows 8 にアップデートした関係で、残り容量が 10GB ぐらいになっています。acer 用のアプリが入っているので、Windows 8 だけだとどれくらい占有するのか分かりませんが、動画を入れると一気に食いつぶすので、 SSD の増設か、SDHC カードを差し込んで「増設」するのがよいと思います。

image

実験的に SSD を切り替えるのは金額的にも労力的にも負担なので、ひとまず SDHC メモリの 32GB を買ってきて試そうと考えています。SDHC を差し込みっぱなしてにして、Visual Studio 11 beta を入れれば、それで使えるかなと。

カテゴリー: windows 8 | 1件のコメント

acer w500s に windows 8 customer preview を入れる

ICONIA TAB W500S | Product Model
http://www.acer.co.jp/ac/ja/JP/content/model/LE.RHC02.060

image

amazon で購入して、早速 windows 8 customer preview を導入してみました。クリーンインストールするのも良いかと思ったのですが、もともと W500S には、Windows 7 Home が入っているので、アップデートという形でインストールするのが手軽かと。

■Windows 8 のインストール手順

軽く手順を書いておきます。

  1. W500S を起動して、Windows 7 Home のセッティングをする。単純に電源を入れて起動するだけで OK です。
  2. 無線LAN の設定をしておく(ファイルコピーは、USB メモリ経由でも OK)。
  3. Windows 8 customer preview を iso ファイルのままインストールしたいので、SlySoft Virtual CloneDrive から、仮想ドライブをダウロードして、Windows 7 にインストール。
  4. ISO ファイルをコピーして、仮想ドライブから起動。
  5. Windows 8 へアップデートインストール
    インストールするときに、空き容量が 16GB 必要です。W500 の HDD は 32GB しかないのですが、Windows 7 の導入で既に14 GB ぎりぎりというところです。ISO ファイルを入れて、ぎりぎり 16GB 以内という感じでした。
  6. アップデートは普通の windows os と同じです。
  7. 途中でキーボードが必要なところ(ユーザー名、無線LANの設定だったか?)が出てくるのですが、ソフトウェアキーボードが出てきませんでした。仕方がないので、USB キーボードを接続して設定します。
  8. インストール後は、空き容量が 7.5 GB というところです。

 

image

試しに、IE で、このページを表示させたところです。

左が比較用の iPad(初代)。右が acer ですね。発色が若干悪いように見えますが、多分光量が足りないだけのような気がします。acer のほうが、縦長になる(画面比が、16:9)なので、ブラウザを縦にすると iPad よりも大きく見えます。

image

試しに mp4 を表示さてみると、Windows 8 で出てくる「ビデオ」では、コマ落ちが発生します。まだ、metro application の api がうまく動いていないみたいです。デスクトップのほうにある「Windows media player」で表示させると全然大丈夫なので、マシンのスペックの問題ではなさそうです。customer preview の段階で、mp4 がコマ落ちしているのは、かなり不安なのですが大丈夫なんでしょうか?

— 追記 2012/03/28 — 窓の杜 – VLC media player を入れると、標準ビデオのほうでもコマ落ちがなくなりましたね。ちょっとエンコードに失敗していたのかもしれません。

■開発をどうするか?

容量が 32GB と少ないので、開発環境(VS11 beta)を入れることはできません。なので、主旨としては、

  • 普通に、タブレットPC として楽しむ、検証する。
  • 開発環境を別途用意して、インストールする

というパターンになります。肝心の metro application の開発は、Windows 8 + VS11 beta の環境でしかできません。Winodws 7 に VS11 beta を入れると、metro application を作れないので…

  • VMWare Player あるいは Workstation で、Windows 8 の環境を作る。
  • Windows 8 環境で、metro application を作成する。
  • 実機(w500)にアプリを配置する

という手順になります。

VMware Player :簡単に仮想マシンを実行できる無償ソフトウェア は、無料で使えるので、開発環境を整えるだけならお勧めです。有償(約2万円の workstation 版は、スナップショットを取る機能が付随しているのですが、普通に開発だけに使うのであれば Player で十分です)。開発自体は、VMWare 上でやるよりも、リモートデスクトップで接続したほうがスムーズにできます(VMWare 自体を全画面表示にして開発するという方法もあります)。

■使用感はどうなのだろうか?

Windows 8 は、普通のデスクトップ PC と、acer のようなタブレットPC/スレートPC の両用に使える os として発表されています。なので、必然的に「虻蜂取らず」の状態にならざるを得ないのですが、ちょっと使ってみると、虻は虻なり蜂は蜂なりでセッティング&利用していくと十分いけるのではないか?と思っています。

具体的に言うと、

  • デスクトップ PC では、Windows 8 の「デスクトップ」しか利用しない。
    • スタートボタンがないという問題がありますが、似たアプリ(多分すぐに作れる)を入れてしまえばOKです。
    • 基本はキーボードとマウスで操作するということになるので、Winodws 7 と同じ環境にあわせます。
  • タブレット/スレート PC では、Windows 8 の metro しか利用しない。
    • 逆に、スレート PC の場合は、metro ui しか使わないにします。まだ customer preview の段階では、いくつかの操作で「デスクトップ」を表示させないと駄目なのですが、「デスクトップがいらない」状態にするのが、最低の利用条件だと思います。
    • マウス操作や、実キーボードのショートカット等は考慮しない。
      デスクトップを使わないので、普通の PC で使うようなショートカットは要りません。というか、ソフトウェアキーボードとタッチやスライド以外の操作を含めないようにします。

こういう風な切り分けをしてしまうと良いかなと思っています。

後で開発環境については詳細を書きます。

カテゴリー: windows 8 | acer w500s に windows 8 customer preview を入れる はコメントを受け付けていません

C++ から使う Fortran を調査

お仕事として、Fortran を使うことになるとは思わなかった。大学の頃に炉物理関係で Fortran を使っていたのですが、その頃は Fortran 77。お仕事の方は、Fortran 95(あたり?)なので、ひとまず↓で評価しようかと。

XLsoft エクセルソフト : インテル Visual Fortran Composer XE Windows 版/インテル Visual Fortran コンパイラー XE Windows 版 製品紹介
http://www.xlsoft.com/jp/products/intel/compilers/fcw/index.html?tab=0

実は、Gnu にも Fortran があります。

GFortran – GCC Wiki
http://gcc.gnu.org/wiki/GFortran

ただし、今回は C++ から Fortran ライブラリを呼び出す(Fortran ライブラリを作る&GUI を C++ で書く)という具合なので、

  • 計算ロジックを Fortran で作成。
    • なので、Fortran の計算部分だけ理解できれば ok
    • リンク元は、VC++ なので、Gnu Fortran 独自の文法を使ってしまうとハマるかもしれない。
  • GUI 部分は、C++ で作成
    • C# でも可能、って話を貰ったのだが、Fortran との相性(構造体やポインタの扱い)を考えると、C/C++ がベター
    • GUI 系は、MFC の Doc-View を使っているので、極めて標準的

なんてことをぽろぽろと考えています。

Fortran 77 の頃は(今でも旧来のFortran を使ていればそのまま)、用語が大文字だったり、大小記号なんかが「GE」だったり「LT」だったりして、C 言語から Fortran 77 への変換が大変なのですが、Fortran 95 から文法が一新されています。C言語のように文法は標準で小文字を使い、大小記号は普通に「>」などの不等号を使えます。非常に可読性が良いです。インデントも使えるようになったので、見た目は C 言語とあまり変わりません。

Fortran入門: プログラムの書き方についての規則
http://www.nag-j.co.jp/fortran/FI_3.html#AUTOTOC_3_1

Fortran が便利なのは、科学計算が早いというのもそうですが、ファイルへのアクセスが手軽にできるのがいいのです。出力するときの書式が直感的に書けるのと、同じ形式でファイルの読込ができます。このあたり、炉物理では非常に重宝していました。

Fortran入門: データ入出力
http://www.nag-j.co.jp/fortran/FI_14.html#AUTOTOC_14

ってことで、メモ代わりにしばらく続く。

カテゴリー: Fortran | C++ から使う Fortran を調査 はコメントを受け付けていません

Thank You と Sorry が多い国で

街を歩くと、thank you と sorry の言葉が溢れています…というと喩えのように聞こえますが、実に音声として「thank you」と「sorry」がたびたび聞こえるているわけで、これを日本語に直せば「ありがとう」と「失礼」にあたるわけで、そうなると昨今の日本には「ありがとう」と「失礼(御免)」が聞こえないのは若者日本のなんちゃらだ…という話になりそうですが、そうではありません。

image

ロンドンの街で散歩をして(散歩に連れられて)思うのは、これらが単語として聞こえてくるということですね。感謝は気遣いの気持ちが、言葉として表れているということも言えるし、それに対して日本は…と続けることができるのですが、実は私が思うに「会釈」がそれにあたりますよね。いちいちに言葉には表さないけれど(言葉に表すこと自体が「無粋」と思えたりすわけで)、感謝の気持ちなり心遣いというものはあるわけです。

ロンドンという街中の、ビジネス街だからかもしれないのですが、そのあたりの雰囲気が日本と似ています。日本でも東京のど真ん中でそれなりに雰囲気の良いところであれば、そういう「余裕」があると思います。狭い道を歩いて、双方をから傘を差してきたときの傘かさぎのようなマナーの心ですね。

こういうのは、国の教育方針も含めて、伝統からくる教育方針というか小学校で「雰囲気」あるいは「道徳もどき」のものとして教わるものかなと。

なので、時にして「コンビニに行ったとき」とか「安め居酒屋に行ったとき」とかの違和感が、それなのかなぁと思ったりします。ロンドンに居るときの違和感が少ないのは、そのあたりのベースが日本と一緒なのかなと思ってみたり。が、ロンドンの街中を歩く人は必ずしも「英国出身」ではなくて、フランス人なり中国人なり黒人系なりいるわけです(国がわからないので「黒人系」と書きますが、白人系ではないという意味で)が、みな似たような雰囲気を持っています。この似たような雰囲気というものが、国自体を支える…というか、国自体を形作るものなのかなと。

カテゴリー: 雑談 | Thank You と Sorry が多い国で はコメントを受け付けていません

Visual Studio 11 の販売宣伝が始まりました

ふと、MSDN から Windows XP をダウンロードしていたら(出先VMWareで開発環境を構築中、ホテルの回線が意外に太くて助かります。時に800K bytes 出ていたりするし)、Visual Studio 11 の宣伝がここに

Visual Studio 11 Beta:次期バージョンを買うなら、リリース前の今がお買い時
http://www.microsoft.com/japan/msdn/vstudio/save/

image

現在 msdn 等からダウンロードできるのは beta 版なので、「Visual Studio 11」が正式名称なのか、それとも「Visual Studio 2012」が正式名称になるのか(あるいは「Visual Studio 2013」とか、「新しい iPad」と同じく、「new Visual Studio」とか「Visual Studio」とだけ呼ぶとか。現在、「Visual Basic」というと「Visual Basic 6.0」のことではなくて、.NET Framework の Visual Basic を示すことになっているので、その手の改名はありかも)はわかりませんが、ひとまず、公式に購入宣伝が出てきたところを見ると、出てくるまでに1年はかからないかな、と思ったり。

現段階の事実として、Windows 8 の Metro style appliation は Windows 8 上の Visual Studio 11 beta でないと作れないので、実際の動作環境がそのままだとすると Windows 8 が出荷されてから、Visual Studio 11 が出荷という順番になります。けれども、Windows 8 に適した(特にタブレットPC、スレートPCに適した)形で Metro Strle のアプリケーションを提供する場合には、Visual Studio 11 が出荷された後に、Windows 8 が出荷されないといけないというジレンマがあります。現実的には、Beta 版なり Preview 版なりでビルドは可能なのですが、アプリケーションの製品を出荷する側(デベロッパーという意味で)側として、ちょっとあまり良くない状況かなと。Windows 8 と Visual Studio 11 が同時に出荷されてしまうのも困りもので。

Windows 8 customer preview 版を vmware に入れて色々といじって、Visual Studio 11 で WinForm, WPF, Metro style と三種類組んでみた比較としては、Metor style のアプリケーションを作る場合は、スレートPC を購入して実行環境/テスト環境として使うのがベターだろうと思っています。開発環境とテスト環境を別々にするのです。

  • 開発環境は、Windows 8 上のデスクトップスタイルの Visual Studio 11
  • テスト環境は、スレートPC に Windows 8 を入れて、タッチ等で動作確認

という具合です。開発用PCで Metro Style のアプリケーションをビルドすると、デプロイ(配置)も一緒に行われえるためにスタートページに非常に多くのアプリケーションが動くことになります。また、開発用PCでタッチパネルにするよりも、スレートPCを用意したほうが安いし動作させるときのスタイル(手に持って動かすとか)は実際に環境に近いでしょう。縦置きの液晶ディスプレイに腕を伸ばしてタッチするのは非常に苦痛です。ノートPCの場合は、ヒンジのところで問題がでそうだし。

Windows Phone の場合は、エミュレータで開発するわけですが、実はスレートPCの場合も解像度の関係からエミュレータ動作ができるといいんですどね。多分、VMWare を使って解像度を制限させれば似たようなことはできると思います。ただし、実機でタッチする感覚は iPhone アプリを試しに作ってみたときに気づいて、「実機でしかできない操作感を、アプリケーションのUIデザインにフィードバック」するには実機が必要ではないか、と思った次第で。

カテゴリー: 雑談 | Visual Studio 11 の販売宣伝が始まりました はコメントを受け付けていません

ロンドン橋落ちたの国で

逆光で暗くなってしまいましたが(カメラを持って来なかったので iPhone で)、ロンドン橋の近くにある場所で仕事で来ています。仕事で1週間ほど英語漬けになると、ちょっとはヒアリングがマシになるでしょうか…っほどの英語力しかないので、こころもとないかもしれませんが、宜しくお願いしますということで。

image

大学の頃に旅行したイタリアと同じく、ロンドンの街は古い建物が満載です。あたかも、シャーロックホームズの映画の中にいるように、その当時の建物が目の前にあります。地震がないのでできる技なのですが、建物自体の持久力は?ということと、中身をホテルやアパートに改造するときに、そのまま使うには不便ではないだろうか?と常々思っていたのですが、実は下の写真のように表の外壁だけを残して裏側全体を改築してしまうようです。

image

窓のところをよく見ると、裏が透けてみえます。出勤途中にざっと撮ったので分かりづらいのですが、表の煉瓦の部分だけを残して裏がごっそりありません。まるで映画のセットのようになっています。鉄骨で補強しながら作業をして、最終的には裏側に現代建築ができるというところでしょう。

日本ならば外壁を補修して中身を残すというところですが、イギリスの場合は外壁を残して中身を入れ替えるという感じなのですね。

地下鉄に乗って出勤をすると、まわりが濃いイギリス顔の方がいっぱい…というか当たり前なのですが、血の濃さを感じます。あと、サリーを付けているアラブ系(だったけ?)と黒人の方が意外と多いですね。黒人の方はパリッとしたスーツを着ていたり、中国人は無地の背広だったりします。

失業率だとか社会保障だとかを考えてロンドン橋のあたりを眺めていたりするのですが、日本の国がどうという話よりも、自分がどうしたいかを優先したほうがよいのでは?と思ったりします。一時期、没落であったり斜陽であったりの代表国であるイギリスですが、ロンドンの街並みと出勤途中に歩く人、古くからそのままの地下鉄、ごみを収集しているおじさん、公園でお昼を食べているカップルの群れ、なぜかやたらに走っている二階建てバスの群れ、工事現場のおじさん、パブにいる老夫婦、仕事の相手がフランス人と中国人と日本人だったりするのにイギリスに出張に来るという不思議さ、も含めて、中学生の頃に1ドルが300円近かった頃に米国に憧れる塾の先生を思い出して、1ドルを100円以下に押し上げて(押し下げて?)しまった経過は重要なのではないかな、と思い直したりします。

カテゴリー: 雑談 | 1件のコメント

逆引き大全iOSの脱稿間近

いや、間近というか、既に締切を過ぎておりますが、来月の末には発行の運びになる…という観測をば。

秀和システム様より、「逆引き大全 iPhone/iPad の極意 500(仮)」で出る予定です。

image

ネタ元をばらしておくと

Amazon.co.jp: iPhoneプログラミングUIKit詳解リファレンス: 所 友太, 京セラコミュニケーションシステム株式会社: 本

Amazon.co.jp: iPhone デベロッパーズ クックブック: Erica Sadun, 株式会社クイープ: 本

から相当パクリ…じゃなくて参考させて頂きました。なんせ、300 tips を執筆しないといけないので(共著の池谷さんが 200 tips で合計 500 ということで)、並みの数ではないッ!!! というのは毎度のことで、この2冊からピックアップして、Xcode 4.3.1 で作れるように直してあります。と云うのも、UIKit と デベロッパーズ クックブックは、実は api をそのまま呼び出して作っています。以前のタイプの iPhone プログラミングのコーディングの仕方を良く知らないので、何とも言えないのですが、

  • Interface Builder を使う方法
  • Interface Builder を使わない方法

の2種類があります。Visual Studio なんていう統合開発環境に慣れている(emacs も統合開発環境です、実は)場合は、当然 「Interface Builder を使う方法」を選択したほうが良い…ハズなんですが、mac の世界では微妙に違うようです。VC++ 6.0 の頃に画面をガシガシと Windows API のみで組んでいたような強者な方が mac なプログラマな方にはたくさんいらっしゃって、画面ひとつ作るにもコーディングだけで済ませてしまうという例題が多いのです。まあ、私もそれを狙ってこの二冊を買ったのですが。

で、去年の夏から調べていって、Xcode 3 -> Xcode 4 -> Xcode 4.2 -> Xcode 4.3 と来てしまった訳で、なんか非常に便利になっているのです。Xcode 4.3 がッ!!!(最新は、App Store で導入できる Xcode 4.3.1 です)

そんな訳で、生の iOS を使いつつ、できるだけ画面に近いところは Storyboard を使うという本の作りになっています。

 

image

Amazon.co.jp: これならわかる!iPhone/iPadアプリ開発入門講座―図解とサンプルでわかりやすい! Xcode4対応: 水口 克也: 本

こちらのほうは、同じく秀和システムから最近出たものです。

先に書いた通り、ちょっと前までの iOS プログラミング系はハードなものが多くて C言語をあらかじめ知っておかないと駄目という雰囲気があったのですが、最近はこの手の「やさしい」シリーズが出てきています。逆引きのほうで書いていて分かったのですが、iPhone プログラミングをしてみたいなぁと思ったときの躓きは、

  • まずは、開発環境をどうやって整えたらよいのか分からない。
  • 開発者登録をするらしいのだが、どうやったらいいのか?
  • アプリケーションを自分の iPhone で動かしたい場合はどうしたらいいのか?
  • アプリケーションを公開したいのだが、どうやったらいいのか?

ってのが問題になります。プログラミング自身よりも、導入そのもののがよくわからないというのと、アプリの公開というハードルをどうやってクリアするのか、に不安を感じます。まあ、実は1回やっていしまえばいいのですが、その初回が問題なんですよね。」

この本の場合、初っ端の導入と、最後の公開を抑えているので、本屋さんでぱらぱらと捲ってみると良いと思います。中身のアプリ開発な部分は…まぁ、初心者本なので、本当のプログラム初心者向きというところです。C言語の説明を抜いてしまって、アプリ開発に踏み込んだほうが良かったのでは、と思ったり。

まぁ、兎も角、初心者本と従来のハードな技術本を組み合わせて、google に検索を手伝って貰って、apple のサンプルをつらつらと動かしていくとなんとなくプログラミングができていきます。そのあたりの「手間」を手っ取り早く解決したいなぁ、というのが今回の逆引きの目的だったりします。ので、来月末ぐらいになったら、本屋なり amazon なり、秀和システムのホームページなりでどうぞ。

カテゴリー: Objective-C | 逆引き大全iOSの脱稿間近 はコメントを受け付けていません

花のズボラ飯に見る、手早くプログラミングを「済ます」というレシピ

Amazon.co.jp: 花のズボラ飯 うんま~いレシピ―なぜ、ズボラ料理なのに泣くほどうまいのか: 久住 昌之, 水沢 悦子: 本

2巻が出たばっかりですが、1巻を買おうと思ったのが、間違えて「レシピ」のほうを買ってしまうという…まぁ、昼は家にいることが多いので、しばらくはこれでご飯を作ってみますか。ええ、後から1巻は別の書店で買い直しました。

Amazon.co.jp: かっこいいスキヤキ (扶桑社文庫): 泉 昌之: 本 や、Amazon.co.jp: 豪快さんだっ! 完全版 (河出文庫): 泉 昌之: 本 を知っているので、内容的には外れはないのですが、ん~、絵を何故と思っていたものの、特に抵抗はなく機会があればと思ていた「ズボラ飯」です。「花」というのは名前だったのですね。旦那が単身赴任、本屋でバイトをする準一人暮らしの女性という設定は(主婦業なんだから、付いていっても良かろうと思うのですが)まあ、なかなかツボを得ています。わたくし的にツボと思うのは、

  • 旦那(ゴロさん)が絵的に出てこない。「既婚」という設定だけがある。
  • ひたすら、家でズボラ飯を作る(食べる)という回が続く。

清い、実に清い漫画です。この「清さ」は、久住/泉 昌之 しか出せません。口絵のところに、扇風機とコートとマフラーが一緒にでてくるところが、リアルです。あと、科白にいちいちダジャレを入れるのが、ストーリー性を無視した漫画という物語でありますね。

さて、「ズボラ飯」だけの解説だけで終わってしまってはつまらないので、プログラム関係に派生させてみます。

Amazon.co.jp: 職人学: 小関 智弘: 本 を読むと、「治具」(じぐ)という言葉がでてきます。製造業界で「部品を作るときの部品」というちょっとメタ的な使い方をするもので、直接製品には関わらないけれども、その部品を作成するときの支えとなるものです。この治具ですが、作成するのにあまり長時間掛かっては困ります。また、大量生産ができるものではない(少量多種の典型)なので、あまり複雑怪奇なものでは困ります。場合によっては、設計図自体はなくて製作者の勘や過去の経験(他の人の経験も含めて)を利用して作ります。(最近の、製造業界の治具は、非常に高度ですが)

これをプログラミングにあてはめてみると、

  • 本来、スクリプト言語(sh, awk, sed など)は使い捨てで作れるものが多かった。
  • 汎用性よりも、多様性を重視して、実行するのに直結するパターンが多い。
    (パラメータは、外部から与えるのではなく、ソースコード自身に書いてあるとか)
  • いちいちフローチャートなどを書くのではなく、さっくりと経験を踏まえて1日位で書いてしまう。

なところです。最近では、クラスライブラリなどが完備されてきたので、昔よりも非常に高機能なものができます。が、「さっくりと作れる」ところを忘れてしまうと、目的と手段を取り違えた「使い捨てプログラム」ができてしまうのが難点です。

で、「ズボラ飯」を読んでいて思ったのですが、

  • コンビニのおにぎりでお茶漬けを作るとか、
  • 鮭フレークを使うとか、
  • ふえるわかめが常備されているか、

そういう、コンビニエンスな加工食材が出てきます。この「コンビニ」なところというのは、いわゆるプログラム言語が持っている豊富なクラスライブラリにあたります(と強引に引っ張ってきます)。昔は、sh からちょこちょこと ls やら sed を組み合わせて作ったものですが、最近は C# で豊富なライブラリを駆使して作っても、「似たようなもの」が「似たような時間」で出来ます。このあたり、java や ruby のライブラリも同じですね。

となると、治具としては高機能すぎるのですが、実際に使っているものはほんのちょっぴり。かなりオーバースペックではあるものの、「既に」豊富なクラスライブラリがあるのですから(場合によっては無償で)、それを使えばプログラム的な「治具」が手軽に作れるわけです。このあたり、オープンソースに似ていますが、ちょっと違います。「無料」なところにポイントがあるのではなく、手近なところに手近な値段のものがある(コンビニで買うと、ちょっと高いけれどもコンビニエンスに、ちょっとだけ支払ってもよいですよね)というのがミソです。このあたり、apple appとかも同じです。

さて、「ズボラ飯」的にプログラミングをするとどうなるかというと、

  • 手元なり、手近なところに高機能なライブラリがある。
  • 高機能ではあるけれど、使うところは、ほんのちょっぴりで良い
    (マニュアルは、必要なところだけ読めばいい)
  • 過去の経験を踏まえて、さっくりと作る。
    ケチャップを入れるとか、味噌を入れるとか、結果を想像して調味料を入れるように、クラスライブラリの組み合わせにちょっとだけ手を加える。
  • そして、楽しみの彩(いろどり)を加える。
    ズボラ飯は、単に食するだけではなく、うまいズボラ飯を食う、という目的を達成する手段を持つ。

最後の「彩」のところは、プログラムで云えば、ちょっとアイコンを加えてみたり、デザインを変えてみたり、自分好みにスイッチを加えてみたり(他人には美味くなくてもよいのです)というところです。

で、何よりも「手軽」に作れるかつ、多少の手間を惜しまない(ミョウガを切るとか、海苔を細く切っておくとか)、の精神が必要ですね。

カテゴリー: 雑談 | 花のズボラ飯に見る、手早くプログラミングを「済ます」というレシピ はコメントを受け付けていません

Visual Studio の T4 を使って、ViewModel を自動生成してみる(多分途中)

常々、C# では C/C++ のようにマクロが使えん…と思っていたのですが、実は Visual Studio 2008/2010 上であれば、T4(TextTemplatingFilePreprocessor)を使ってマクロっぽい動きができる(=コードの自動生成ができる)ってことを今頃再確認して、ああ、なるほどと思って作ってみた次第です。

コード生成と T4 テキスト テンプレート
http://msdn.microsoft.com/ja-jp/library/bb126445.aspx
T4 TemplateでViewModelの生成をするアイテムテンプレートを作りました – かずきのBlog@Hatena
http://d.hatena.ne.jp/okazuki/20110325/1301070808
宣言的にクラスを宣言しT4 Templateでコードを生成する – かずきのBlog@Hatena
http://d.hatena.ne.jp/okazuki/20110408/1302275410

を参考にして、*.tt ファイルを作って、ViewModel を作ってみます。ViewModel クラスは、Silverlight + MVVM モデルで DataGrid をバインドの落とし穴(その2) | Moonmile Solutions Blog で書いていたときのパターンを使ってみます。チープすぎて実用的ではないのですが、T4 の自動生成の確認として。

宣言的にクラスを宣言しT4 Templateでコードを生成する – かずきのBlog@Hatena なところでは、設定ファイルを作っていますが、こちらでは、

/// <summary>
/// ViewModel クラス
/// </summary>
 [ViewModelTarget]
public class _ViewModel
{
	public int id { get; set; }
	public string name { get; set; }
	public int age { get; set; }
	public DateTime UpdateAt { get; set; }
}

な風に、クラスを定義しておけば勝手に INotifyPropertyChanged を継承した ViewModel クラスを作る、ってところを目指してみます。設定自体が生のクラスを使うってことろがミソです。

実は、テンプレートから自分のアセンブリを参照する方法が不明なので(もう少しトリッキーなことをやればできそうなんですが)、ViewModel を参照させるためだけのアセンブリを別に用意しています。

  • SampleT4 に、テンプレートがあります。
  • SampleT4Target は、アセンブリを参照するために用意しています。
  • SampleT4 から SampleT4Target をプロジェクト参照します。
  • _ViewModel.cs には、先の元になるクラスがはいっていて、2つのプロジェクトで共有(リンク)させています。

■ターゲットとなる ViewModel クラス

ちょっと無理矢理ですが、解析用のための MakeViewModel クラスを作成しています。
属性「ViewModelTarget」が付いているクラスを探すのですが、_ViewModel.cs 自体が共有されているので、無理矢理、文字列で属性値を調べています。

namespace SampleT4Target
{
	/// <summary>
	/// ViewModel クラス
	/// </summary>
	[ViewModelTarget]
	public class _ViewModel
	{
		public int id { get; set; }
		public string name { get; set; }
		public int age { get; set; }
		public DateTime UpdateAt { get; set; }
	}

	public class MakeViewModel
	{
		public string className;
		public List<Prop> props;
		public MakeViewModel( Type c )
		{
			this.className = c.Name;
			this.props = new List<Prop>();
			foreach (var p in c.GetProperties())
			{
				props.Add(new Prop { name = p.Name, type = p.PropertyType });
			}
		}
		public class Prop
		{
			public string name { get; set; }
			public Type type { get; set; }
		}
		public static List<Type> TargetTypes(string fname = &quot;&quot;)
		{
			var lst = new List<Type>();

			Assembly asm = (fname == &quot;&quot;)?
				Assembly.GetExecutingAssembly():
				Assembly.LoadFile(fname);

			foreach (var t in asm.GetTypes())
			{
				foreach (var at in t.GetCustomAttributes(false))
				{
					if ( at.GetType().ToString().IndexOf(&quot;ViewModelTarget&quot;) >= 0 ) 
					// var attr = at as ViewModelTargetAttribute;
					// if (attr != null)
					{
						lst.Add(t);
					}
				}
			}
			
			return lst;
		}
	}
	public class ViewModelTargetAttribute : Attribute
	{
	}
}

■ViewModel のテンプレート

テンプレートファイル「ViewModel.tt」は、以下のようになります。
アセンブリを直接参照させているので、ここが嫌なんですが(プロジェクト名が変わると変更しないといけないので)ひとまず、これでコンパイルが通ります。

<#@ template debug=&quot;false&quot; hostspecific=&quot;false&quot; language=&quot;C#&quot; #>
<#@ output extension=&quot;.cs&quot; #>
<#@ assembly name=&quot;$(SolutionDir)\SampleT4Target\bin\Debug\SampleT4Target.dll&quot; #>
<#@ import namespace=&quot;SampleT4Target&quot; #>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;

namespace SampleT4
{
<#
var types = MakeViewModel.TargetTypes();
foreach (var t in types) {
	var mk = new MakeViewModel(t);
#>
	/// <summary>
	/// <#= mk.className #> クラス
	/// </summary>
	public class <#= mk.className #> : INotifyPropertyChanged
	{
<# foreach ( var p in mk.props ) { #>
		private <#= p.type.ToString() #> _<#= p.name #>;
		public <#= p.type.ToString() #> <#= p.name #>
		{
			get { return _<#= p.name #>; }
			set
			{
				if (_<#= p.name #> != value)
				{
					_<#= p.name #> = value;
					OnPropertyChanged(&quot;<#= p.name #>&quot;);
				}
			}
		}
<# } #>
		#region INotifyPropertyChanged メンバ
		/// <summary>
		/// プロパティ変更時のイベント
		/// </summary>
		public event PropertyChangedEventHandler PropertyChanged;
		protected virtual void OnPropertyChanged(PropertyChangedEventArgs e)
		{
			if (PropertyChanged != null)
				PropertyChanged(this, e);
		}
		protected virtual void OnPropertyChanged(string name)
		{
			if (PropertyChanged != null)
				PropertyChanged(this, new PropertyChangedEventArgs(name));
		}
		#endregion
	}
<# } #>
}

テンプレートの中身自体は、インテリセンスが効かない状態なので(T4用の拡張プラグインを入れると効きます)、一度 *.cs ファイルに書き出してからちまちまと移しています。PHP か ASP.NET 風に書けば ok です。

Devart T4 Editor for Visual Studio 2010 sample
http://visualstudiogallery.msdn.microsoft.com/a42a8538-8d6e-491b-8097-5a8a00174d37
でダウンロードができます。

■自動生成された ViewModel.cs

テンプレートを保存すると、T4(TextTemplatingFileGenerator)が実行されて、ViewModel.cs ファイルが作成されます。本来は、partial にしてカスタマイズ部分と分離させると良いかなと。クラス名が元ネタのクラスと同じなので、実際は何らかのルールで変えたほうがよいでしょう。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;

namespace SampleT4
{
	/// <summary>
	/// _ViewModel クラス
	/// </summary>
	public class _ViewModel : INotifyPropertyChanged
	{
		private System.Int32 _id;
		public System.Int32 id
		{
			get { return _id; }
			set
			{
				if (_id != value)
				{
					_id = value;
					OnPropertyChanged(&quot;id&quot;);
				}
			}
		}
		private System.String _name;
		public System.String name
		{
			get { return _name; }
			set
			{
				if (_name != value)
				{
					_name = value;
					OnPropertyChanged(&quot;name&quot;);
				}
			}
		}
		private System.Int32 _age;
		public System.Int32 age
		{
			get { return _age; }
			set
			{
				if (_age != value)
				{
					_age = value;
					OnPropertyChanged(&quot;age&quot;);
				}
			}
		}
		private System.DateTime _UpdateAt;
		public System.DateTime UpdateAt
		{
			get { return _UpdateAt; }
			set
			{
				if (_UpdateAt != value)
				{
					_UpdateAt = value;
					OnPropertyChanged(&quot;UpdateAt&quot;);
				}
			}
		}
		#region INotifyPropertyChanged メンバ
		/// <summary>
		/// プロパティ変更時のイベント
		/// </summary>
		public event PropertyChangedEventHandler PropertyChanged;
		protected virtual void OnPropertyChanged(PropertyChangedEventArgs e)
		{
			if (PropertyChanged != null)
				PropertyChanged(this, e);
		}
		protected virtual void OnPropertyChanged(string name)
		{
			if (PropertyChanged != null)
				PropertyChanged(this, new PropertyChangedEventArgs(name));
		}
		#endregion
	}
}

と、ここまで生成ができます。

本当は、別プロジェクトを作るのではなくて自前のアセンブリを参照して、対象の ViewModel クラスを見つけたいですよね。一度、「ViewModelTarget」の属性がない状態でビルドをした後に、別のところに保存。それを一時的に参照させればよいかな、と考えていますが。

カテゴリー: C# | Visual Studio の T4 を使って、ViewModel を自動生成してみる(多分途中) はコメントを受け付けていません

[C#] パイプで繋げて、データベースを検索

ふと、|演算子(パイプ演算子)を使って、データベースのストリームを検索できたら、何かできるのではなかろうか…と骨休めがてらちょっと。

public class Test
{
	public void test001()
	{
		var db = new DB{ ConnectionString=&quot;&quot;};
		RESULT items = db | &quot;person&quot; |
			&quot;familyname&quot;.EQ(&quot;masuda&quot;) |
			&quot;age&quot;.GE(20) |
			&quot;*&quot;;
		RESULT items2 = db | &quot;person&quot; |
			&quot;familyname&quot;.EQ(&quot;masuda&quot;) |
			&quot;age&quot;.GE(20) |
			&quot;id&quot; | &quot;familyname&quot; | &quot;lastname&quot;;
	}
	public void test002()
	{
		var db = new DB { ConnectionString = &quot;&quot; };
		RESULT items = 
			db | &quot;person&quot; |
			(EQ)&quot;familyname&quot; % &quot;masuda&quot; |	// familyname == &quot;masuda&quot; と同じ
			(UP)&quot;age&quot; % 20 |				// age >= 20 と同じ
			&quot;*&quot;;
	}
	public void test003()
	{
		// これが直感的で良い
		var db = new DB { ConnectionString = &quot;&quot; };
		RESULT items =
			db | &quot;person&quot; |					// テーブルを指定
			(OP)&quot;familyname&quot; == &quot;masuda&quot; |	// 検索条件
			(OP)&quot;age&quot; >= 20 |				
			&quot;*&quot;;							// 出力
	}
}

データストリームというよりも、擬似LINQ構文になっちゃった感じで、あまり意味がありませんが。|演算子のオーバーライドと、暗黙の型変換(implicit)を駆使すると、こんな風に書けますという例です。
データの比較を行うときに、”カラム名”.EQ(値) のように、最初はメソッド名を考えてみたのですが、あまり可読性がよくないので、「==演算子」等もオーバーライドすることにしました。

OP クラスのところが肝で、テーブルのカラム名(文字列)を一度 OP クラスにキャストしてから使うという妙な技をつかっています。このあたりは、もう少ししっかりと作れば、LINQ と同じになるんでしょうが、しっかり作ってしまうと LINQ と同じになりそうなんで、このあたりで止めておきます。

上記のコードをコンパイルするためのクラス群は以下になります。コンパイルするためだけなので、中身は作っていませんが、まあ、構造が分かるかと。本来はパイプで使うわけだから、グラフィック系のフィルターのようにしたいですよね。ちょっとそのあたりの例は思案中ということで。

public class DB
{
	private SqlConnection _cn;
	public string ConnectionString { get; set; }
	public static DB operator |(DB db, string name)
	{
		return db;
	}
	public static DB operator |(DB db, OP op)
	{
		return db;
	}
	public static implicit operator RESULT(DB db)
	{
		return new RESULT();
	}
}

public static class DPipeExtentions
{
	public static OP EQ( this string cname, object val )
	{
		return new OP { ColumnName = cname, Value= val, OpCode = OP.OPRATOR.EQ };
	}
	public static OP NE( this string cname, object val )
	{
		return new OP { ColumnName = cname, Value= val, OpCode = OP.OPRATOR.NE };
	}
	public static OP LE(this string cname, object val)
	{
		return new OP { ColumnName = cname, Value = val, OpCode = OP.OPRATOR.LE };
	}
	public static OP LT(this string cname, object val)
	{
		return new OP { ColumnName = cname, Value = val, OpCode = OP.OPRATOR.LT };
	}
	public static OP GE(this string cname, object val)
	{
		return new OP { ColumnName = cname, Value = val, OpCode = OP.OPRATOR.GE };
	}
	public static OP GT(this string cname, object val)
	{
		return new OP { ColumnName = cname, Value = val, OpCode = OP.OPRATOR.GT };
	}
}
public class OP
{
	public enum OPRATOR {
		EQ, NE, LT, LE, GT,GE,
	}
	public OPRATOR OpCode { get; set; }
	public string ColumnName { get; set; }
	public object Value { get; set; }
	public static OP operator %(OP op, object val)
	{
		op.Value = val;
		return op;
	}
	public static implicit operator OP(string name ) {
		return new OP{ ColumnName = name };
	}
	public static OP operator ==(OP op, object val) { 
		return new OP { ColumnName = op.ColumnName, Value = val, OpCode = OPRATOR.EQ };
	}
	public static OP operator !=(OP op, object val)
	{
		return new OP { ColumnName = op.ColumnName, Value = val, OpCode = OPRATOR.NE };
	}
	public static OP operator <(OP op, object val)
	{
		return new OP { ColumnName = op.ColumnName, Value = val, OpCode = OPRATOR.LT };
	}
	public static OP operator <=(OP op, object val)
	{
		return new OP { ColumnName = op.ColumnName, Value = val, OpCode = OPRATOR.LE };
	}
	public static OP operator >(OP op, object val)
	{
		return new OP { ColumnName = op.ColumnName, Value = val, OpCode = OPRATOR.GT };
	}
	public static OP operator >=(OP op, object val)
	{
		return new OP { ColumnName = op.ColumnName, Value = val, OpCode = OPRATOR.GE };
	}
	public override bool Equals(object obj)
	{
		return base.Equals(obj);
	}
	public override int GetHashCode()
	{
		return base.GetHashCode();
	}
}
public class RESULT : List<object>
{
}
public class EQ : OP
{
	public static implicit operator EQ(string name)
	{
		return (EQ)new OP { ColumnName = name, OpCode = OPRATOR.EQ };
	}
}
public class UP : OP
{
	public static implicit operator UP(string name)
	{
		return (UP)new OP { ColumnName = name, OpCode = OPRATOR.GE };
	}
}
カテゴリー: C# | [C#] パイプで繋げて、データベースを検索 はコメントを受け付けていません