Visual Studio 2010 で TFS 2012 Express を使う

素直に Visual Studio 2012 を使えばよいのですが、メインマシンには VS 2010 を残しておこうかなと思ってちょっと試してみました。

以前、Team Founcdation Server 自体が高くて手が出なかったのですが、2012 からは Express 版として5人ならばフリーで使えるバージョンがあります。まあ、つまりは個人的に使うならば自由だよ、という意味ですね。以前から、VSS を使っていたのですが、途中で cvs やら subvertion やら git とやらを使ってしまっていたので、TFS はほとんど手を出していませんでした。

Microsoft Visual Studio TFS Express 2012 | Microsoft Visual Studio
http://www.microsoft.com/visualstudio/jpn/products/visual-studio-team-foundation-server-express
TFS Express 2012 RC (無償) インストール STEP BY STEP | 一伝入魂 | 長沢智治のブログ
http://softwareengineeringplatform.com/articles/tfs-express-2012-rc-install-setp-by-setp/

TFS 自体は上記のところからダウンロードできます。手元に入れたのは Windows 7 32bit 版です。


で、何で今更 TFS なのかというと、VSS の後継というのもあるのですが、前日の  Developer Camp 2012 Japan Fall で、Power Point と TFS が連携できる、という話を聞いたからなのです。お客さんに見せる、あるいは自分で考えるための画面作成として、主に Visio を利用していたのですが、Visio って SkyDrive では見れない。Excel 方眼紙に書くのもちょっと辛い。で、Power Point はどうなのか?と思っていたところ、なるほど TFS のアイテムと連携できる(ような話?)をしていたので、確かめてみたかったのです。Blend の Sketch Flow もアリなのですが、これはこれで専用のツールになってしまっていて、他の人との共有が難しいのですよ。
パワポ職人といえば、MS の長浜さんか、Brian Keller 氏とか勝手に思っている訳ですが … まあ、そのあたりは別の機会に。

さて、Windows 7 に TFS 2010 Express を入れて、TFS に接続して「チームプロジェクト」を作ろうとすると VS2010 では「TFS10139」なエラーが出ます。なにやら、ユーザー権限が足りないとかなんとか … ユーザー自体は管理者権限だし、と思っていたのですが。

image

どうやら、VS2010 のチームエクスプローラーからは TFS 2012 の「チームプロジェクト」は作れないみたいなんですね。

Can’t create team project within VS2010 for TFS 2012 | .NET Developer
http://www.msigman.com/2012/05/create-team-project-vs2010-tfs-11-beta/

まあ、バージョンが新しい方に繋げるのだから、そうなのかもしれませんが、解決方法が提示されていないのがいまいち … orz

TF30172: 現在のユーザーには新しいチーム プロジェクトを作成するのに十分なアクセス許可がありません。
http://msdn.microsoft.com/query/dev10.query?appId=Dev10IDEF1&l=JA-JP&k=k(PCW.ENGINESTARTER.NOPERMISSION.ERROR)&rd=true

で、解決方法はどうするのかというと、「VS 2012 をインストールして、チームプロジェクトを作る」って方法しかないようです。ええ、解決というかなんというか…。なので、別のマシンに入っている VS 2012 から、Windows 7 + TFS 2012 に接続して「チームプロジェクト」だけ作ってあげます。そうすると、そのチームプロジェクトは、VS2010 からアクセスできます。なんともややこしいのですが、VS2010 から TFS2012 へは「チームプロジェクトだけが作れない」という状況で、チームプロジェクトさえて作ってやれば、あとは自由に使えます。

ちょっと構造がややこしいので整理すると。

+ DefaultCollection : チームプロジェクトコレクション (1)
+ blog-src : チームプロジェクト (2)
+ WpPost : ソリューション諸々 (3)

という構造になっています。この (2) のところが、VS2010 で「作れない」のです。

■チーム プロジェクト コレクション

チームプロジェクトのまとまりです。DB ごとに作られます。普通は、DefaultCollection ひとつで良いと思います。

image

■チームプロジェクト

「blog-src」のところがチームプロジェクトです。VSS の場合は、ソリューション配下を登録しましたが、TFS の場合はその上層にあたるまとまりがあります。

▼下記が VS2010 の場合
image

▼下記が VS2012 の場合
image

■新しいチームプロジェクトを追加

これもメモ的に、チームプロジェクトをもうひとつ追加する場合は、「プロジェクトと担当チーム」→「新しいチームプロジェクト」を選択します。

image

まあ、チームプロジェクト自体は、早々作る訳ではないので、個人作業用にひとつだけ作っておいて、後はソリューションもろとも TFS に突っ込むのが作業的に良いでしょうねぇ。

さて、本来の Power Point の連携はどうなるかというと … ってのはこれから調べるとしますか。

カテゴリー: 開発, プロジェクト管理 | 2件のコメント

Developer Camp 2012 Japan Fall には行ってないのだがメモ的に

正直なところを「申し込みを忘れいていたわ~わ~わ~(エコー)」ってなところなのと、昨日の夕方だけちょっとだけ渋谷ヒカリエに行ったので、行ったのか行かないのかは不明なのですが。基本は、Ustream だけでも十分楽しめるかと。

Developer Camp 2012 Japan Fall | MSDN
http://msdn.microsoft.com/ja-jp/jj614595.aspx
USTREAM: Developer Camp 2012 Japan Fall: Developer Camp 2012 Japan Fall〜 クラウド時代のアプリ開発者に贈る一歩進んだ開発スタイル 〜 優れたアプリケーションを開発し世の中に提供し続けていくために求められるスキルは、ここ数年特に幅広くなっ…
http://www.ustream.tv/channel/msdevelopercamp

twitter のハッシュタグ #DevCampJp あたりで突っ込みを入れて、楽しむのが常です。

Windows 8 が発売、Visual Stuido 2012 にバージョンアップということで「何にターゲットを絞っているのか」分からない Microsoft さんですが、「絞っている」のか「絞らずにいるのか」はちょっと不明です。ただし、今回の Developer Camp は(って、次回とか前回とかあるんでしたっけ?)「Azure + ○○」ってことで、クラウド関係との兼ね合いでの development というところでしょう。

プレスにするそうなので、NDA 内て言っても大丈夫なんでしょう。「Azure と○○」というスタイルは、社内運用環境をそのまま Azure 上に持って行く(正確には、Microsoft の管理するクラウド環境に持って行く)手段/手法として用意していくのに、

  • 仮想環境を使って、OS とアプリ毎持って行くパターン(LAMP 環境とか tomcat とか)
  • ユーザ管理の AD をそのまま持って行くパターン(主に、ファイルサーバー的な役割)
  • 今後の Microsoft 製品をごっそり Azure 上に展開するパターン(タブレットPC を含めた無線LAN環境で)

を用意するということです。MS-DOS からスタートした Unix -> MS-DOS というスタイルを、そのまま、自社デスクトップ環境を、自社クラウド環境に持って行くという戦略かと思われます。当然のことながら、Azure 上(あるいはそれに類するクラウド環境)の「課金」という形で従来の OEM 形式の Windows OS 売り、とは違ったスタイルに移行するわけです。その中で、Microsoft 社員への展開としては(米国副社長として展開ではなく)「自社製品売り」なのでしょうが、米国副社長の展開としては、「俺がやってみたいカードを晒すので、やってみたい奴はやってみてくれ~」のような潔さを感じられました…なんて偉そうなことを言いますが、

  • 組み合わせのカードとしては、自社製品を披露するものの
  • 技術的な組み合わせとしては、色々あって楽しそう。

ってなところです。そのあたり営業畑ではなく技術職から上がりってところかなと。その分、Apple のような「カリスマ的な戦略」(正確に言えば「ジョブズ的な戦略」)は見えてこないものの、そこは資金力的に潤沢な(株価の開きがどうあれ)Microsoft としては Apple とは違った戦略を敢えて取っている、ことなのでしょう。

私としては、Azure + Office 365 + WebApp という組み合わせを使った small company がターゲットの仕組みが面白そうです。興味深いのは、Active Directory 自体は大手企業には入れられるものの、零細企業には向かないもので Office 365 を Office の Web 版としてではなく「ユーザー認証」全般として AD と同等に扱うスタイル、というところが良さそうです。ところで、Office 365 って VBA とか動くんですかね? これは後で調べてみます。

~~~

詳しいところは別途 Ustream を眺めれば良いとして、

Windows ストア アプリ開発
http://msdn.microsoft.com/ja-JP/windows/apps/br229512

からなかなか辿り着けないけど有用なところを、(自分のためも含めて)メモをしておきます。

Windows ストア アプリ開発者向けダウンロード
http://msdn.microsoft.com/ja-JP/windows/apps/br229516
Windows アプリ アート ギャラリー | MSDN
http://msdn.microsoft.com/ja-jp/hh544699
Windows 8 アプリ開発体験テンプレート | MSDN
http://msdn.microsoft.com/ja-jp/jj556277
Windows 8 Code Samples and Examples in C#, VB.NET, C++, JavaScript
http://code.msdn.microsoft.com/windowsapps/
Windows 8 app samples サンプル 言語: C#, VB.NET, C++, JavaScript
http://code.msdn.microsoft.com/windowsapps/Windows-8-Modern-Style-App-Samples?amp;clcid=0x409

サンプルは「windows metro サンプル」で検索すると、色々引っ掛かるので参考にすると良い…のですが、今後1年ぐらいはこのあたりの情報は google では検索しづらくなりそうですね。古い情報と新しい情報とごっちゃになりそうな感じ。MS さんからのプレゼンも、ぼちぼちと繰り返しが多くなってきているので、初手ではないところの情報を集めておくのがベターかなと思ってます。

カテゴリー: 開発, windows 8 | Developer Camp 2012 Japan Fall には行ってないのだがメモ的に はコメントを受け付けていません

WordPress Book Style の実験運用をします

公開執筆をします … と言いますか、昨今の日本の電子書籍化なんですが、漫画関係、小説関係とぼちぼちと出ているものの(私にとって)肝心の「コンピュータ技術書」はほとんど話がないんですよね。もともと、オライリーの PDF 販売などがある訳で、紙面レベルの DTP から興すことは可能なのですが、執筆者自身からというのは難しいのが現状です。ええ、Web サイトの技術系記事でも十分というのもあるのですが、Twitter 也が流行ってしまってからブログも低迷しているようだし、このまま個人的な発信状況が沈下してしまうのは問題かと。

image

で、個人的に電子書籍化することを目指して、広告費削減も含めて WordPress を使って公開執筆をやってみます。実は、これ依頼ものなので、このまま私自身が「電子書籍化」できるかどううかは不明です(正確に言えば「契約書」を交わしてないので、現状は「白」ですね)が、まあ、ブログから書籍化というパターンも昨今多いし、その後ブログ自身を消されることはないので、こういう風なのもアリかと。

アメリカではいくつかのベータ版の PDF がフリーでダウンロードできたり、日本でも校正者を幾名か募集して書くパターンもあるので、それと似たようなものです。執筆時のデータは生データではないので、そのまま書籍になる訳ではありませんが、校正前のほぼそのままになると思います。なので、現時点では「著作権」自体は、増田 智明(moonmile)にあるので、引用やリンクなどは構わないのですが、「原稿をそのまま持って行って別のところで出版」ってパターンは止めてください。まあ、Wikipedia をそのままパクってしまう大手企業もあるので、なんとも言えませんが。きちんと、今回は copyright にします(いつもは、コピー/改変自由な copyleft なんですけどね)。

どこまで拡散されるか試してみたいといったところです。

執筆ペースは、結構なスピードで上がってくると思います。私の場合、この手の本は全体で3ヶ月弱で仕上げるのが常なのですが、今回は手伝いを頼んでいる関係もあり1ヶ月位のペースで上げる予定です。

なお、原稿が上がった後は、該当する wordpress は削除する可能性があります(出版するから、本と競合してしまうので)。ただし、「WordPress Book Style」として、少し考えているところがあります。

  • Google などの検索先として、本の宣伝にリンクする。
  • 全体を非公開にして、会員制のサイトにする。

WordPress で書いている関係もあり、スマートフォンのプラグインが入っています。なので、iPhone で見ると結構きれいな画面で読めます。このプラグインを流用して、WP Book Style に合うようにしていこうかなと思っています。

image

 

そんな訳で、公開執筆のリンク先です。執筆期間中の期間限定になると思いますが、ぼちぼち読んでもらえれば「iPhone プログラミング」ができるようになるかと。ええ、肝心の Windows 8 Metro のほうはまた別途。

iPhone Programming for Beginner | 初心者のためのiPhoneプログラミング入門(の原稿)
http://iphone.pp-club.net/

カテゴリー: 仕事 | WordPress Book Style の実験運用をします はコメントを受け付けていません

Source Code Pro を試してみる

プログラムをする上で、書きやすいコード/読みやすいコードというのは「フォント」にも及ぶ訳で、何故か「MS ゴシック」では眠くなってしまう私としては、色々と変えてみる訳です。

[速報] ソースコードを表示するためのフォント「Source Code Pro」をアドビがオープンソースで無料公開 - Publickey
http://www.publickey1.jp/blog/12/_source_code_pro.html

■ノーマルに MS ゴシック

まあ、悪くはないのですが…何故か、眠くなる。

image

■Osaka 等幅

Mac から借用している Osaka フォント。Visual Studio 上ではにじみが気になるのですが、まぁ、コード打つ分にはよいかと。フォントサイズが「10」のままだと滲みます。「11」だと綺麗に出力されるのですが、ちょっと大きいんですよねぇ。

image

■Migu M1

IPA で配布している Migu フォントシリーズ。横幅が、詰めぎみなのが気になりますが、全角/半角世代にはよいかと。

image

■Consolas

英語版 Visual Studio では、これが標準フォントです。日本語がちょっと大き目にでますが、プログラムはアルファベット中心なので、これも良いかと。

image

■Comic San MS

一時期、Microsoft さんのプレゼンに行くと「Comic San MS」が主流でした。プレゼンで文字を大きくしたときは見栄えがいいんですよね。最近はどんなフォントなんでしょう?

image

■みかちゃん

一度、「みかちゃん」フォントで一冊書き上げ…ようとしたのですが、文体までみかちゃんになりそうだったので止めました(苦笑)。

image

■Source Code Pro

で、今回の Adobe フォントですね。見ると分かるのですが、行間が広めに取ってあります。プログラムコードは行数がたくさん表示されたほうが視認性がよいので、他のフォントに比べるとちょっと不利かも、な感想です。

image

 

■ダウンロード先

一応、ダウンロード先を貼っておきます。仕事や遊びプログラムによって、色々と変えてみると気分が変わっていいですよ、ってことで。ええと、プログラムじゃなくて画像や埋め込みフォントとして使う場合は、各フォントの利用規約に従って下さい。

WindowsでOsakaフォントを使おう!
http://osaka.is.land.to/
M+とIPAの合成フォント
http://mix-mplus-ipa.sourceforge.jp/
オリジナルフォント【みかちゃん】
http://www001.upp.so-net.ne.jp/mikachan/

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

Windows Live Writer をテキストエディタから開く

Metro アプリストアへの登録記念ということで(単に、登録をだけで、アプリの公開はまだですが)、
Windows Live Writer を外部から操作する tips ということで。

準備としては、以下にあるように

c# – Windows Live Writer Automation – Stack Overflow
http://stackoverflow.com/questions/8490977/windows-live-writer-automation

regsvr32 WindowsLiveWriter.Application.dll

をレジストリ登録。こうしないと、IWindowsLiveWriterApplication2 へのキャストでエラーになります。何故かわからんけど、そういうものみたい。

これで作ったのが以下なコードです。

[img 20120927_01]

20120927_01

の形式で画像を貼りつけることができます。

namespace LiveWriterPost
{
	class Program
	{
		static void Main(string[] args)
		{
			if (args.Length == 0)
			{
				Console.WriteLine("LiveWriterPost [path]");
				return;
			}
			string path = args[0];
			var lw = new LiveWriter();
			lw.NewPost(path);
		}
	}

	public class LiveWriter
	{
		public void NewPost(string path)
		{
			// ファイルコードは UTF-8 で
			var sr = File.OpenText(path);
			// 最初の行はタイトル
			string title = sr.ReadLine();
			// 残りは本文
			string html = sr.ReadToEnd();
			NewPost( title, html );

		}
		public void NewPost( string title, string body )
		{
			string imgdir = @"file://D:\work\blog\image\";

			body = Regex.Replace( body, @&quot;\r\n\[img ([^]]+)\]&quot;, &quot;\r\n\<img src='&quot;+imgdir+&quot;'$1.jpg&quot; />&quot;);
			// 先頭行を削除
			body = Regex.Replace(body, &quot;^\r\n
&quot;, &quot;&quot;);
			// 改行を変更
			body = Regex.Replace( body, &quot;\r\n&quot;, &quot;
\r\n&quot; );

			var _app = new WindowsLiveWriterApplication();
			var app = (IWindowsLiveWriterApplication2)_app;
			app.BlogThisHtml(title, body );
		}
	}
}

ここのコードの部分は、wordpress 上で [/code] を使って書き直しています。なので、要検討。
あと、リンクの自動設定のところも。

カテゴリー: C# | Windows Live Writer をテキストエディタから開く はコメントを受け付けていません

仕様書の基本と仕組み 第2版ができました

宣伝がてら。秀和システムの「仕様書の基本と仕組み 第2版」の見本が届きました。

図解入門 よくわかる最新 システム開発者のための仕様書の基本と仕組み[第2版]|書籍情報|秀和システム

IMG_0388

基本的な路線は変わらず、増補版という形でボリュームを増やしています。

  • 継続的にアップデートする WEB サイト開発のパターンを追加
  • 携帯アプリなどのパッケージ型の開発パターンを追加
  • 仕様書テンプレートを追加

しています。まあ、アジャイル的に言えば、仕様書、設計書は必須という訳ではないのですが、取り処としてちまちま作っておくと便利です。特に、複数名のグループであったり、外注をしたり、あるいは外注を請けたり、というところでは「契約面」も含めて、仕様書が必須になります。

この本の中では、仕様書(specitication)と、設計書(software design)の区別をあまり明確に解説していません。いくつかの WEB サイトや現場でもこの区別は曖昧なのですが…まあ、曖昧でもいいんですけどね、それは現場に応じて。区別をするならば、仕様書が「顧客からの視点」で、設計書が「開発メンバからの視点」ってことです。これは、ひとり開発や自社開発でも同じことで、

  • 外側から制約を掛けるもの。必須となる条件や機能のことを「仕様書」に書く。
  • 「仕様書」の機能を具体的にプログラムコードまでに落とすまでを「設計書」に書く。

という区別にしておいたほうが良いです。これは、仕様書、設計書という名前にこだわるのではなくて、「何を作ればよいのか」、「今回は何は必要ないのか」という「作業量」の問題ともなり、契約の線引きにもなります。このあたりが曖昧のまま進むと膨大な無駄コードを量産してしまうことなるので、注意が必要です。が、まぁ、現実的には、そういう線引きも必要なんですが、「作業工数」という人月的な面もありますからね。工場のラインとは違って、

  • 作らなくて、他から持ってくることが可能
  • ここで作っても、使わない可能性がある。
  • 他で使うために、ここで作っておく

というパターンがありますからね。そのあたりの話はまた別途。

仕様書のテンプレートに関しては、Word/Excel 2010 で用意をしました。先の秀和システムさんのサポートページがからダウンロードができます。使いどころや説明に関しては、書籍をご覧ください。ちまちま自分で使っているものを多少改変してあります。

カテゴリー: 書籍 | 仕様書の基本と仕組み 第2版ができました はコメントを受け付けていません

GBC を見て「重力」な機構を考える

LEGO TECHNICからくり部屋 レゴ GBC 二年間のまとめ
http://legokarakuri.blog91.fc2.com/blog-entry-48.html

海外で反響が…ってのを見て、このバスケットの部分は確かパクリだよ…と思っていたら本人でした、という話。玉入れのところを以前みて、注目しておりました。

自分のほうは、OpenCV で画像解析、プチロボを使って6軸のアーム作りの組み合わせをしたいところで、これに .NET Micro を組み合わせる予定です。ソフトウェア関係は長年やっているので OK なのですが、機器関係がまるで駄目で、多少の半田付けやプラモデルレベルの集中力が失われつつ…な状態なのですが、これを見て再び、絶賛挫折中の6軸アーム作りを頑張ります。

clip_image007

どれを見ても飽きないのですが、飽きずにみていると、分かるのが、

  • ボールが途中で滞っていない。
    • ボールを送るスピードが同じである。
    • あるいは、若干初速が遅くて、最後が早い、という作りになっている。
    • 生産系の TOC みたいで面白い。
  • 回転動作を、左右やカムの動作に切り替えている。
    • 機械工学の基本なのだけど、原子力屋さんの私はやらなかったのよねぇ。
  • ボールを送るのに、「重力」を活用している。

なところです。生産ラインの設計をしている方には当然なのかもしれませんが、ソフトウェア工学の場合には、この手の「製造段階の繰り返し」というのがきわめて少ない(多少の自動生成はありますが、ソフトウェア開発の「製造工程」は事実上、CD-ROM 焼き工程だったりするので)ので、このモーターの回転のみを利用して「繰り返し動作をさせる」ところに非常に興味が湧きます。

品質工学を見ると分かるのですが、生産ラインの繰り返しは、必ずしも「均一」ではありません。いわゆる、歩留りと言われる不良品がでます。この不良品率をできるかぎり「0」に近づけるのが、シックスナインな品質な訳ですが、実は微視的に言えば「歩留り」には至らない(不合格品には至らない)許容範囲のゆらぎを確保しつつ、生産ラインを作ることが、実は「安定的な生産ライン」を作ることと同値になります。

揺らぎ自体は、この GBC のような、完全オートマチックなもの(人手を介在しない)もあれば、途中に人手が必要なものがあります。あるいは、ゴールドラット氏の言う「ザ・ゴール」(だったっけ?)の中にある、機械のセッティングに掛かる時間を考慮する場合もあります。

なので、実は、品質を上げるという中には、経営的な意味も含めて考えると、

  • ライン自体を安定稼働させるシステム
  • ライン以外の揺らぎを許容するシステム

の2つが必要なわけですね。

さて、この GBC を眺めていると、ボールが順々に送られるわけですが「途中で滞る」ことはありません。実にスムースにボールが送られているわけですが、それには安全工学的に非常に重要な「重力」の問題がうまく解決/利用されています。作った彼がそれを意図していた(と私は思う)のですが、先の図のように、重力は常に下に向かって働きます。

ここで、一番最初のボールは「傾斜されている、スロープに沿って、輪の中へ送り込まれます」。ここの「傾斜」が枠に入れる仕組みである。ボールが1個ずつ送り込まれる仕組みです。そして、回転する輪は、少しだけ斜めになり、ボールは外側に落ちないで上に上がってきます。最後に、斜めになった向こう側に穴が開いていて、そこに「重力」が働いて、ボールが輪から出ていくのです。

すごいよ、akiyuky さんは完全に意図的にやっているよッ!!! と偉そうにほめまくりたいです。

この手の「実学」は、おそらくたくさん作った中で培ったものであり、電子回路をたくさんつくると大体勘でコンデンサーや抵抗の計算ができるそうで(そうらしい)、かつ安全用のゲートもそれなりに作れるそうで(確かに、電子回路の本をみると「○○の安全のために、○○を入れておきます」っていう文が頻発するのです)、そのあたりは「職人芸/勘」の世界です。ここでは「職人芸」と言ってしまいますが、実は「実学」としては大学の座学なんて目じゃないんですよね~。ええ、体系的な理論も必要なのですが、モノを作るというのは、目の前の「現実」に向き合うということなのですよ。

~~

そうそう、画像解析の「実学」も似たところが多くて、動物の「目」を理論的に解決するところからのスタートと、なんとなくマッチングすればOKというコンピュータらしい力技なところもあります。どっちにせよ、「現実」の解決になればよいわけで、識別する対象によって適切なロジック(それが簡易ロジックであってもよい)を満たせば十分「目」に足るということです。顔認識や、テンプレートマッチングなんてのは、力技のほうですよ。

カテゴリー: 開発, 雑談 | GBC を見て「重力」な機構を考える はコメントを受け付けていません

じりじりと Metro Design について考えていこう

そろそろ Metro Design について考えてみよう | Moonmile Solutions Blog
http://www.moonmile.net/blog/archives/3660

の続きです。

Metro スタイル アプリの構築方法を学ぶ
http://msdn.microsoft.com/library/windows/apps/

なところで、日本語版は「Metro スタイル」になっていますが、まあ「Windows ストア」スタイルでも何でもよいのです。ここに書いている話は「話半分に」聞いておかないと、後でドハマりいたしまっせ、って具合なのです。「ユーザーの価値が~」というのはさておき(自己言及すれば、「Windows 8 のユーザーに対する価値は~」という縛りなんですから)、Metro Design について引き続き考えていきます。

■まずは、Metor スタイル ガイドラインの読み方を

これは、Microsoft社の悪いところですが、本来の目的を忘れて手段に興じてしまうところがあります。Oracle のドキュメント群は昔から非常に少なくて辟易するものですが、あれはあれで Oracle の戦略としては重要なのです。「ガイドライン」には、先の記事に書いた通り「先駆者」を模倣する側面があるので、そのあたりを殺ぎ落として読むのがベターです。

私の場合、「組織」から離れて長いので、このあたりが見えるのですが「組織」に入っている人は、意外と見えにくいものなので注意が必要ってことで。まぁ、「組織」に組み込まれている人はそれはそれでいいんですが、フリーな人が、これにハマるとちょっとアレかなと。

  • ユーザーの価値、アプリの価値に言及したものは、読み飛ばし。
    • これは、開発者/開発する経営者が決めるものですから。
  • デザインの価値も読み飛ばし。
    • タイポグラフィとか、色デザインの本に直接あたったほうが良いです。
    • あと、iPad とかを使ってみるとか。
    • 中世のイコンなんかを調べると良いです。
  • コンテンツ操作のなんちゃらの話も読み飛ばし。
    • コンテンツの質や量によって変わります。また、読者によっても。
    • ターゲットの「引っ掛け」具合によっても変わります。
    • Metro アプリの場合、全画面が普通(単一画面)になるので、独自操作を作ってもそれほど「違和感」はありません。
  • 設計ガイダンス、UI の作り方
    • これは、アラン・クーパーの本とか、D.A.ノーマンの本とか読んだほうがいいです。
    • 読んだ上で、戻ってくるならば良いかと。
    • デザインルールは「審査が通る」程度でOKです。そのうちぐだぐだになるのを期待してます。
    • よく分からない場合は、先行する iPhone アプリの真似をするのが良いです。
  • サスペンドからの復帰に関して
    • これは「考慮不足」なので、読み飛ばして OK です。
    • おそらく、きちんと実装できるアプリケーションは現れません。

ってな感じで「読み飛ばし」て良いところがたくさんあります。

開発者/経営者として重要なところは、

あとは、ざっと流し読みをしておけば OK です。某所の本は、この主旨で目次をまとめてあります。

■ Metro Design の原点に戻ると

実は、先に書いた通り「読みやすい」かどうかは、「読みやすくさせるかどうか」はコンテンツの種類に変わっていきます。D.A.ノーマンは、航空機についているTV操作について、「子供がゲームをしたいと覆ったら、どんな複雑な操作でもこなしてゲームに辿り着こうとする」訳で、多少の複雑さはものもしません。しかし大人が何かの商品を買おうと思ったら「ちょっと複雑な操作をするぐらいだったら諦める」のです。このあたり、ゲームと商品販売が大きく違うし、読書にしても実用書と小説の場合は違うし、漫画だって流し読みしたい場合と、じっくりと考えながら読みたい場合もあるので、色々あるのです。だから、商品ごと本ごとに「パッケージ/装丁」がある訳で、それに惹かれるなり、その品物のデザインなりを重視して「購入する」に至る、あるいは「利用する」に至るわけですよ。「利用する」と「購入する」をあえて分けているのは、「購入するけど利用しない」パターンもあるからですね。現在のような経済の場合は、このパターンが一番「販売効率がよい」ことになっています。

で、PC タブレットや、各種のスマートフォンの場合は、外側のパッケージ部分は一様になってしまいます。もちろん、機種自体はユーザーが選べるのですが、アプリは機種の外観を変えることを(いまのところは)できませんよね。同じアプリを作っても、iPhone で動かす場合と、Windows 8 タブレットで動かす場合では、違ったアプローチをしたほうが良かろう、ということが容易に想像できます。

なので、一概に Metro Design は?ってことになると幅広くなってしまうので、ひとまず、電子書籍について考えてみましょう。

■ Metro Design としての書籍はどうなるのか?

先に書いた通り、電子書籍にしても色々あります。実用書、漫画、ライトノベル、コンピュータ本、占い本、株式投資本、絵本などなど。実のところ、大江健三郎の本とか、カフカの本を iPhone で読む気にはりませんし、IT 業者としてそれらの本を「電子書籍化」したとしても儲かりません。ええ、青空文庫的に「なんとか読める」ようにはなるのですが、いまのところ若い人以外は真面目に読むことはしないでしょう。一部の本好きのマニアだけです。先行き、教科書の電子化などが進んで、画面自体に慣れていけば、もうちょっと違う感じになると思うのですが、そうなると「本」自体のスタイルが変わってしまうので、ここでは「今、電子書籍化できるもの」かつ「収益が見込めるもの」を対象としておきます。

そうなると、いわゆる「読み捨て」のビジネス書は、電子書籍の筆頭にあがってきます。1回読んでBOOK OFF に売り飛ばすか(あるいは、BOOK OFF から買ってくるか)という感じで、数年後に読み直すことはありません。ならば、本を家においておくよりも(最近は本棚のない家庭があるので)、通勤途中にさっくりとダウンロードして、さっくりと読み捨てるというスタイルで「読める」ほうがよいわけです。

なので、ビジネス書を読むときのスタイルとして、

  • さっくりとダウンロードできる容量にする。
  • 文章をぱらぱらと捲れるほうがよい。
    • できれば、ページ数をなんとなく覚えておくほうがよい。
  • ラインマーカーをつかいたい。
  • 読み終わったら関連書籍を購入、という購入チェーンが望ましい

のパターンが良いのです。電車を待っているときにダウンロードが終わる容量と言えば、10M弱位でしょうか。このぐらいだと、図版を入れると重くなる(白黒ならば大丈夫か?)ので、できる限り文章だけで済ませます。大体の新書は、2週間ぐらいで書きあげてしまうので、図版は全くないか、チープなものしかないのが普通です。ページ数は、既存の新書よりも少なくて構いません。iPhone の画面は小さいので、文章が少なくてもページ数が増えたように見えます。ダウンロードさせる時には、躊躇する値段(1,000円とか)は避けたほうがよいです。500円ぐらいの漫画の単行本ぐらいの値段がいいですね。漫画雑誌の値段 300円位でもいいと思います。要は、「読み捨て」ができるスタイルにします。長い文章であれば、コストダウンを目的に分冊してしまいます。

文章の脇は、新書と同じように多めに空けておきます。文字を変更できると良い、と思われれかもしれませんが、変更できなくても構いません。その書籍にマッチしたフォントだけを指定すれば良いのです。ページ数は、読んでいるときに左下あたりにでかでかと表示して構いません。小説とは違って、読み飛ばし、斜め読みが普通なので「ああ、あれはたしかここに」というなんとなく覚えるマーカーがあれば十分です。

巷の電子書籍リーダーではマーカーの使い方が駄目です。まさしく蛍光ペンで、適当なところに○なり線なりを指で付けられるようにします。プログラムとしては、レイアウトは変わらないのですから、ページ数と位置情報だけつけておけばOKです。

ツイッターなりフェイスブックなりに投稿する機能は必須です。連携するだけでOKです。「○○本の何ページ目」な形で投稿できるとなお良いでしょう。他の人に購入を諭すのではなくて「興味」を持たせるのが、広告業界の基本ですよね。

読み終わったら、関連書籍にジャンプさせましょう。続きものにして別ジャンルに飛んでもよいです。しかし、やり過ぎてはいけません、あくまで読者が「うーん、今度買うとしたらこれかな?」という感じで amazon のほしいもの、を集める機能があればベターです。これは他の機能と連携しても OK です。

…と、こんな風に「Metro Design」は考えるわけです。地下鉄のデザインは、地下鉄を利用する人の立場になって考える、というスタイルでもありますが、同時に、自然発生的にでてきたものを極力削り落として、裏の目的を果たさせる(道路標識は、事故を減らすという大きな理由がありますよね)のです。そのなかで出てきた、グリッドスタイルであったり、Metro 的なデザインであったりするので、進化論とか、自然淘汰とかの話になりますね。ええ、天地創造の方には理解されにくいかもしれませんが。

こういう風に考えていくとですね、グリッドの幅とか、フォントの大きさとかは「パターン」でしかないことが分かります。「某ガイドライン」では色々後付をしていますが、要は進化により帰着したデザインをシミュレートしたデザイン、ってことになるのです。それは、営業的には「先駆的なデザイン」を主張することになるのですが…まあ、そのあたりは Microsoft の戦略ということで、大目にみましょう。このあたりの話は、C.アレグザンダーの「パタン・ランゲージ」を読むと分かります。オブジェクト指向、GoF として有名になった「パターン」ですが、原本に立ち返ってみると、その後のパターンがポストでしかないことを分かります。

ちなみに言うと、この電子書籍のパターンは「ビジネス書」の場合にあてはまります。漫画や、子供をあやすための電子絵本の場合は別なアプローチになります。

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

[C++] NULLポインタアクセスをMFCはどのように回避して…いないか。

null/nil の扱いをオブジェクト指向的に考え直す | Moonmile Solutions Blog
http://www.moonmile.net/blog/archives/3770

なところで、Objecitve-C の nil の「優れた」扱いについて書きましたが、実は MFC(Microsoft Foundation Class)にも NULL ポインタに対して「優れた」扱いをしているのです、という話をひとつ。

MFC ってのは、Windows アプリケーションを作る時のクラスライブラリで、似たようなものには Delphi のライブラリがあります。ウィンドウシステムを扱うときに、直接の Windows API を扱うよりもクラスを使ったほうがまとまりが良い、ってのが主旨ですね。これを押し進めたのが、Windows RT なんですが、またこれは別の機会に(というか、この話はあちこちで出ているので)。

オブジェクト指向の扱いとして、MFC が行った実装は、CWnd クラスになります。

CWnd クラス (MFC)
http://msdn.microsoft.com/ja-jp/library/1xb05f0h(v=vs.80).aspx

CWnd クラスってのは、あらゆるウィンドウの元のクラスになっていて、これは Windows OS が、ウィンドウハンドル(HWND)を必ず持っている、という前提から来ているものです。後に、WTL というテンプレートライブラリで作ったウィンドウクラスライブラリもある訳で、必ずしも HWND が必要という訳ではないのですが。
CWnd クラスは、内部的にひとつのウィンドウハンドルを持ちます。CWnd::m_hWnd という形で保持しているのですが、このメンバ変数へのアクセスは、CWnd::Attach, CWnd::Detach という特別なメソッドを使います。あるいは、ウィンドウを作るための Create メソッドを使います。

ここで、CWnd 自体と、内部の CWnd::m_hWnd の動きを見てみると。

CWnd wnd ; 				// m_hWnd: NULL;
wnd.Attach( hwnd );		// m_hWnd: hwnd ;
...
wnd.Detach();			// m_hWnd: NULL;

という感じになります。クラスとして m_hWnd を内部に持っているために、外部としては常に CWnd オブジェクトを持ち続け、Attach/Detach により 内部の m_hWnd を設定する≒遷移するという仕組みです。

さて、ここに CWnd::GetClientRect というウィンドウの矩形の大きさを取るメソッドがあります。GetClientRect メソッドは、内部的に m_hWnd を参照して、Windows API の GetClientRect 関数を呼び出すという仕組みになっているので、コードとしてい次のように書きます。

CWnd wnd ;
wnd.Attach( hwnd );
CRect rc;
wnd.GetClientRect( &rc );
...
wnd.Detach();

GetClientRect 関数は、必ずウィンドウハンドルを必要とするのですが、CWnd オブジェクト自体が NULL でなければ、次のように Attach 前の場合にも呼び出しは可能です。

CWnd wnd ;
CRect rc;
wnd.GetClientRect( &rc );
...

さて、このとき rc は何を期待するのでしょうか?
内部のウィンドウハンドルが初期化されたまま NULL のままなので、矩形の大きさの取得自体が無効です。無効ではありますが、あえて返すとすれば、{0,0,0,0} の無効値を返すのがよいでしょう。

ここで面白いのは、ラップしている CWnd クラスと、ウィンドウハンドル自体の m_hWnd の関係です。ウィンドウハンドルに関わるメソッドについては、CWnd オブジェクトからの呼び出しは可能であるのですが、内部の m_hWnd が NULL の場合は「アプリケーション例外」を発生させるべきかどうか?という問題がでてきます。

そう、Objective-C 風にするならば、m_hWnd の値が NULL の時(Attach する前の時)でも、CWnd::GetClientRect はさらりと呼び出されたほうがよいはずです。そうですよね…

■で、実際のところはどうなのか?

実は、CWnd クラスの内部で、ASSERT( this->m_hWnd != NULL ) という形でチェックをしています。わざわざデバッグモードでは止めてあるのです。しかも、ASSERT はデバッグコンパイルだけ実行されるので、リリースビルドの場合は m_hWnd は NULL のまま通ってしまい、アプリケーションエラーとなります orz

ここのところは if ( this->m_hWnd == NULL ) return ; のように、NULL チェックだけして何事もなかったように値を返して欲しかったなぁと。そうすると、Attach や Create 前に wnd->GetClientRect をしてもエラーにならなくて便利なんですけどね。

カテゴリー: C++ | [C++] NULLポインタアクセスをMFCはどのように回避して…いないか。 はコメントを受け付けていません

null/nil の扱いをオブジェクト指向的に考え直す

Objective-C で nil のメソッドを実行すると例外が発生しないのは変…ではないよ、というのを解説。

■そもそもの NULL の意味

C++ も Objective-C も C言語を発端としているので、「NULL」≒「値が無い状態」というのを継承しています。
御存じの通り、C言語では、NULL というのは(void*)0 あるいは 0 として定義されています。定義されているのですが、これが NULL という意味を示しているかどうかは別なのです…が、「現実主義的な」C言語としては、NULL = 0 のほうが都合が良かったわけですよ。

基本は NULL はポインタとして扱うので、0 ポインタ自体を「有効」にできないという矛盾があります。かつて、8bit 時代の CPU ではメモリが貴重だったので、0 ポインタを「無効」にするとはなんということかッ!!! という話ががあったとかなかったとか聞きます…いえ、聞いたことはありませんが、0 ポインタを特別な値にするのは、結構なもめごとだったのです。当然、アセンブラだと 0 から始まったほうが良いですからね。

ですが、16bit 時代になり、ほどよくメモリが広くなると捨て領域としての 0 ポインタが作れるようになりました。つまりは、先頭の 16 バイトぐらいは捨て領域にしたわけです。これは、NULL ポインタアクセスを検出するためと同時に、NULL アクセスをしたときに OS ごと落ちてしまう(MS-DOSの場合は落ちますが)ことを防ぐために、0 ポインタは「無効」な領域として存在させていたわけです。

そんな訳で、NULL というものが「無効」であると同時に、0 であることを決めたのが「#define NULL 0」あるいは「#define NULL ((void*)0)」な訳ですね。ちなみに、20年以上前の古いコードを見ていくと、この定義が散見しています。これは、組み込み系のCコンパイラが NULL を定義していなかったからなんですね。まぁ、インクルードとして stdio.h に define が定義されているため、というのもあります。

つまりは NULL の定義としては、

  • そのポインタが「無効」である。
  • そのポインタが「0」である。

の二重の定義があるのです。実は2番目の定義がデファクトスタンダードで、なんか NULL を 0 に定義してまったら、定着してしまったという悪習ではありますが、まぁ、そういう二重の定義を NULL は持ちます。

■NULL ポインタをアクセスするという意味

では、NULL ポインタをアクセスするという意味を考え直してみます。
現実的に 0 ポインタにアクセスするということは、実はメモリというものは「メモリがある限りアクセスできる」という原則に従えば、0 ポインタでも何処でもよいわけです。実際、i386 のノーマルなモードではそういう動きをしています。

しかし、i386 のプロテクトモードからメモリ保護の概念が入ってきました。詳細は i386 アセンブラの本を読んで頂くとして、メモリアクセスに「範囲」を指定できるようになったわけです。で、「範囲」以外のときには、アクセス保護例外が発生できるようになりました。この「アクセス保護例外」自体が、まさしく「NULL ポインタアクセス例外」な訳です。もう少し詳しく言えば、0 ポインタをアクセスできるようにしてしまえばアクセス保護例外は発生しないのです。つまりは、あえて 0 ポインタにアクセス保護を掛けている訳ですね。

さて、通常の NULL ポインタのアクセスとしては、C言語ではこんな風に書きます。

int *n = NULL;
*n = 10;

NULL = 0 ポインタを示すので 10 を代入しようとしたときに「アクセス例外」が発生します。

string *str = NULL;
int sz = str->size();

この場合は、どうでしょうか? str が 0 ポインタとなっているので、0 ポインタの size メソッドを呼び出そうとしてエラーになります、という仮定ができます。現在の vector<> では NULL ポインタアクセスのエラーになりますが、実は、こんな風に書くとエラーになりません。

class A {
private:
	 int _n ;
public:
	A() { _n = 0; }
	void func() {
		cout << &quot;in A::func &quot; << endl;
	}
	static void sfunc() {
		cout << &quot;in A::sfunc&quot; << endl;
	}
};

int main( void )
{
	A a;
	a.func();
	a.sfunc();

	A *p = NULL;

	p->func();
	p->sfunc();

	return 0;
}

これを実行すると、エラーを出さずに動きます。 p->func や p->sfunc のところで p が NULL なのでエラーが発生しそうな気がするのですが、実はエラーにならないのです。なぜでしょうか? 実は、先の「仮定」が間違っていて、C++ の場合クラスのメソッドを呼び出すときには、クラス自身の関数テーブルを呼び出し、その中でメソッドのポインタを呼び出すからなんですね。なので、クラス自身の関数テーブルだけを参照するような static メソッドや内部変数を扱わないメソッドはエラーにならないのです。

※ コメントにある通り、ここでは、virtual method を使っていないので実は vtbl は関係ありませんね。ちょっと後でこのあたり修正します。実際、virtual func2 を定義してやって、p->func2 と呼び出すと、this->vtbl が呼び出せないためにエラーなります。

なので、次のように内部変数の _n を参照させてやると、p->func の実行時にエラーになります。

class A {
private:
	 int _n ;
public:
	A() { _n = 0; }
	void func() {
		cout << &quot;in A::func &quot; << this->_n << endl;
	}
	static void sfunc() {
		cout << &quot;in A::sfunc&quot; << endl;
	}
};

ということは、NULL ポインタへのアクセスというのは二つのパターンがあって、

  • NULL ポインタそのものにアクセスする。
  • NULL ポインタを持つオブジェクトのメソッドやプロパティにアクセスする

というパターンがあるわけです。既に分かる通り、NULL ポインタそのものにアクセスする時は「アクセス保護例外」が発生するのでエラーになります。しかし、NULL ポインタのオブジェクトに対しては、C++ では一度クラスの this ポインタにアクセスするためにエラーにならない場合もあるのです。いや、エラーになるのは、内部の this ポインタからオブジェクトそのもののポインタへアクセスしようとした(この場合は 0 ポインタです)

■ちなみに C# の場合はどうなのか?

C# の場合をみてみましょう。

public class A
{
	private int _n;
	public void func()
	{
		Debug.Print("in func");
	}
	public static void sfunc()
	{
		Debug.Print("in sfunc");
	}
}

同じようにクラスを作っておいて、以下のようにアクセスをすると p.func() のところで例外が発生します。

A a = new A();
a.func();
A.sfunc();

A p = null;
p.func();
A.sfunc();

C# の場合は、NULL ポインタそのもの(擬似的に null ですが)にアクセスするために、例外が発生していると考えられます。
ちなみに static メソッドの場合は、クラス名でしかアクセスできないので、A.sfunc のために例外が発生しません。C++ の場合は、A::sfunc でもアクセスできるし、p->sfunc でもアクセスできる、という違いがあります。

■Objective-C の nil の挙動を考える

さて、このことを踏まえて、Objective-C の nil の挙動を考えます。nil の場合は、オブジェクトに値を設定しても「アクセス例外を発生しない」という挙動があります。

 A *a = nil;
 [a func];

この func を呼び出すときには、どのような挙動が望ましいのでしょうか?

  • C++ の static メソッドのようにアクセス例外を発生させない。
  • C# のようにアクセス例外を発生させる。

実は、Objective-C の発祥は古くて、ほぼ C++ と同じぐらい(30年前ぐらい?)です。実は F# の元になっている関数言語も同じぐらいの発祥だったりします(教科書をみるとその位の年代)。なので、プログラム言語のカンブリア紀って感じだったのかもしれません。その後、Perl や Ruby などのスクリプト言語(sed, awk, sh は以前からあるし)にも関係していきます。

そこで、Objective-C としては、C++ の挙動によってアクセス保護例外が発生するよりも、全く例外が発生しない、という道を選んだわけです。これが、nil が単なる 0 ポインタ(NULL ポインタ)ではなくて、オブジェクトとして扱ったときの C++ や C# との大きな違いになります。

# java の null の扱いはどうだったかなぁと思っているのですが … 確かめてみると、C# と同じように p.func() の時にエラーを発生しますね。

■nil の利点を考える

長々と書きましたが、実は nil の挙動に関しては、他にはない非常に有利な点があります。
通常は、オブジェクトの NULL 判別をしなくて便利とか、間違って NULL を渡されてしまったときもエラーにならないくて便利、という「便利」さが強調されていますが、実は、もっと大きな利点があります。
この「利点」どの本にも書いてないので、もともと objective-c の発想にあったのかさだかではないのですが、解説すると、

スレッド間やプロセス間でオブジェクトの値が変更されたとしても正常に動く、という驚異的な動きが可能なのです。

  1. A スレッドと B スレッドが動作している。
  2. 共有のオブジェクトを使っている。
  3. A スレッドが非同期に共有オブジェクトの値を nil にした。
  4. B スレッドはオブジェクトが nil であっても正常に動く。

という動きをします。

これを C++ のコードで書いてみると、

// 共有オブジェクト
static Com *com ;

void Athread()
{
	if ( com == NULL )
		return ;
	for ( int i=0; i<100; i++ ) {
		// 何かの処理
		com->method() ;
		...
	}
}
void Bthread()
{
	if ( com == NULL )
		return ;
	com->method() ;
	// 解放するとか
	com = NULL;
}

このような場合、A スレッドは、com->method で落ちてしまう可能性があります。なので、com を使う時にはいちいち NULL であるかどうかをチェックしないと駄目なのです。非同期処理の場合は、これが結構面倒で、C/C++ の場合はロックを掛けたりしますね。C# も似たような苦労があります。
この例では、一か所しかないのですが、複数の共有オブジェクト、複数のメソッドを呼び出すとこのチェックは結構手間です。

void Athread()
{
	if ( com == NULL )
		return ;
	for ( int i=0; i<100; i++ ) {
		// 何かの処理
		if ( com != NULL )
			com->method() ;
		...
	}
}

また、細かく云えば、if ( com != NULL ) と com->method() の間にインタラプト(割り込み)が発生する可能性もあるわけで、これを完全にガードする方法はロックしかありません。実際、OS 内部ではこの手の非同期処理をちまちまとアセンブラレベルでロックしているのですが、実は、Objective-C で書くとすんなり解決ができます。

// 共有オブジェクト
static Com *com ;

- (void)Athread
{
	for ( int i=0; i<100; i++ ) {
		// 何かの処理
		[com method];
		...
	}
}
- (void)Bthread
{
	[com method];
	// 解放するとか
	com = nil;
}

こんな風に、com ポインタが NULL であるかどうかを気にせずに書けます。これは、そもそもが com のポインタが nil である場合は method が呼び出されないという objective-c の仕組みにより有利な書き方ができるのです。
更に云えば、C/C++ ではロックを掛ける必要があった部分が、objective-c ではロックを掛ける必要はありません。おそらく、相当非同期に com ポインタが nil になったとしても正常に動くと思われます。

■まとめ…のようなもの

と、まぁ、こんなことを objective-c のコードを書きながら思ったわけですが、実のところはどうなんでしょうね? iOS の中身が objective-C とは思われないので、多少は違うのかもしれませんが、nil の挙動のおかげで非常にバグが少ないプログラムが書けるはずです(それでも、不具合があるのは Apple の C言語部分ではないかな、と想像したり)。

nil/NULL を指定しているのだから「アクセス例外」が発生して欲しい、という意見もあるでしょうが、実行時にはこういう「フェールセーフ」(安全系に倒れる仕組み)は重要かと思っています。人的ミス(コーディングミス)が発生しても、ほぼ安全にコードが動くという話はまた別の機会に。
↓のところに、ちょっとだけ書いてあります。

フェイルセーフなコードを書くには? | Moonmile Solutions Blog
http://www.moonmile.net/blog/archives/2173

カテゴリー: C#, C++, Objective-C | 8件のコメント