<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
		xmlns:xhtml="http://www.w3.org/1999/xhtml"
>

<channel>
	<title>かばだんなさん かく語りぬ２</title>
	<atom:link href="http://kaba-blog.shall-systemservice.co.jp/feed/" rel="self" type="application/rss+xml" />
	<link>http://kaba-blog.shall-systemservice.co.jp</link>
	<description>株式会社シャル・システムサービスの責任者な人がちょびっと語るのです</description>
	<lastBuildDate>Thu, 08 Dec 2011 03:07:26 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.4</generator>
<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://kaba-blog.shall-systemservice.co.jp/feed/" />
		<item>
		<title>SQLServerのユーザー定義関数を作ってみた</title>
		<link>http://kaba-blog.shall-systemservice.co.jp/20111208-1374/</link>
		<comments>http://kaba-blog.shall-systemservice.co.jp/20111208-1374/#comments</comments>
		<pubDate>Thu, 08 Dec 2011 03:07:26 +0000</pubDate>
		<dc:creator>かばだんなさん</dc:creator>
				<category><![CDATA[b. 技術者かばだんなさん]]></category>
		<category><![CDATA[Azure]]></category>
		<category><![CDATA[SQLSever]]></category>

		<guid isPermaLink="false">http://kaba-blog.shall-systemservice.co.jp/?p=1374</guid>
		<description><![CDATA[師走でございます。こたつが恋しい季節になりましたがいかがお過ごしでしょうか。 最近かばだんなさんは初めてSQLServerに触れる機会を得まして。これ、いいです。 導入時の認証・権限管理の部分がちょっと難しいです。情報も&#160;&#160;<a href="http://kaba-blog.shall-systemservice.co.jp/20111208-1374/"><<続きを読む>></a>]]></description>
			<content:encoded><![CDATA[<p>師走でございます。こたつが恋しい季節になりましたがいかがお過ごしでしょうか。</p>
<p>最近かばだんなさんは初めてSQLServerに触れる機会を得まして。これ、いいです。<br />
導入時の認証・権限管理の部分がちょっと難しいです。情報も分かりやすいのがまとまってるわけじゃないし。<br />
たぶんこの難解さで、多くの人が目一杯に権限を緩くしてDB構築し、セキュリティリスクを作ってしまうんじゃないかと思います。（「そのうちちゃんと組みなおそう」と言いつつ時間が無くてそのまま本番運用、なんて光景が容易に想像がつきます。）　もったいないよね。<br />
・・・と、昨日ランチの時に有識者に話したら「お前がまとめ文章書け」と言われました。そのレベルにはまだ達していない（苦笑。</p>
<p>でも入り口はちょっとつまづきましたが、それ以外はクセもなくスムーズです。</p>
<p>で、面白がってSQLServerで使うためのユーザー定義関数を作りましたので今回はその一部を公開します。<br />
<a href="/sqlserver・sqlazureでnow/">現在日時を取得するNOW()</a> と <a href="/sqlserver向けのユーザー定義関数date_format/">日付書式を変換するためのDATE_FORMAT()</a>です。</p>
<p>NOW()に相当するものはSQLServerにもあるので、これはクラウドサービスであるSQLAzure用ですね。<br />
あ、SQLAzureもいいですよ。ローカルのSQLServerでやれることがまんまクラウド環境でもできるので開発効率もいいし。</p>
<p>またひとつ選択肢を入手してしまった かばだんなさんなのでした。</p>
]]></content:encoded>
			<wfw:commentRss>http://kaba-blog.shall-systemservice.co.jp/20111208-1374/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://kaba-blog.shall-systemservice.co.jp/20111208-1374/" />
	</item>
		<item>
		<title>Java でのセキュアコーディング規約</title>
		<link>http://kaba-blog.shall-systemservice.co.jp/20111109-1339/</link>
		<comments>http://kaba-blog.shall-systemservice.co.jp/20111109-1339/#comments</comments>
		<pubDate>Tue, 08 Nov 2011 23:43:22 +0000</pubDate>
		<dc:creator>かばだんなさん</dc:creator>
				<category><![CDATA[b. IT業界の人かばだんなさん]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[セキュリティ]]></category>

		<guid isPermaLink="false">http://kaba-blog.shall-systemservice.co.jp/?p=1339</guid>
		<description><![CDATA[JPCERTコーディネーションセンター から「CERT Oracle Java セキュアコーディングスタンダード」の日本語版が公開されましたね。（元ネタ） この資料の特筆すべきところは、 機械翻訳・非技術者翻訳ではなく、&#160;&#160;<a href="http://kaba-blog.shall-systemservice.co.jp/20111109-1339/"><<続きを読む>></a>]]></description>
			<content:encoded><![CDATA[<p>JPCERTコーディネーションセンター から「CERT Oracle Java セキュアコーディングスタンダード」の日本語版が公開されましたね。（<a href="http://codezine.jp/article/detail/6264">元ネタ</a>）</p>
<p>この資料の特筆すべきところは、</p>
<ul>
<li>機械翻訳・非技術者翻訳ではなく、技術者による翻訳なので分かりやすい。</li>
<li>個々のチェックポイントについて、NG例・OK例が提示されているので、文章の意味が分からなくてもコードを見たらよく分かる。</li>
<li>巷間話題のAndroidアプリで関係するチェックポイントはどれとどれか、別表で明確になっている。</li>
</ul>
<p>といった辺りでしょうか。通常セキュリティ診断の会社にこの資料出してもらうとすれば数百万円は払わなくてはならないでしょう（それでも格安）が、それが無償公開だなんて！！！</p>
<p>何となくセオリーとしてやっていた事・やらずにいた事ってのが、実はセキュリティ的な意味があったという事が分かったりもしますので、ざっと読むだけでもなかなか面白いですよ。<br />
特に「とりあえず作れ！」的な感じで質問できる先輩もいないのに Javaのプログラマになっちゃった方には必読の文章だと思います。腕磨いて下さい。（これ、特定の誰かを頭に浮かべてるわけではありません。ホントに（苦笑。）</p>
<p>しかしこんな情報が整理された状態で公開されるなんて、ホント、いい世の中になったよな～。</p>
<p>＊ <a href="https://www.jpcert.or.jp/java-rules/">「CERT Oracle Java セキュアコーディングスタンダード」 日本語版</a><br />
＊ <a href="https://www.jpcert.or.jp/java-rules/android-j.html">Androidアプリケーション開発へのルールの適用</a>（日本語版オリジナル）</p>
]]></content:encoded>
			<wfw:commentRss>http://kaba-blog.shall-systemservice.co.jp/20111109-1339/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://kaba-blog.shall-systemservice.co.jp/20111109-1339/" />
	</item>
		<item>
		<title>サーバーにメモリを追加したかっただけなのに・・・</title>
		<link>http://kaba-blog.shall-systemservice.co.jp/20111104-1315/</link>
		<comments>http://kaba-blog.shall-systemservice.co.jp/20111104-1315/#comments</comments>
		<pubDate>Fri, 04 Nov 2011 04:24:46 +0000</pubDate>
		<dc:creator>かばだんなさん</dc:creator>
				<category><![CDATA[b. 技術者かばだんなさん]]></category>
		<category><![CDATA[WindowsServer]]></category>

		<guid isPermaLink="false">http://kaba-blog.shall-systemservice.co.jp/?p=1315</guid>
		<description><![CDATA[以前、インストールマニアックス第１回大会に参加した際に頂いたWindowsサーバーですが、３年近くたった今でも元気に動いてくれていました。初期状態の１GBのメモリでしたが、いやぁ結構仕事してくれるもんです。 先日、同じ大&#160;&#160;<a href="http://kaba-blog.shall-systemservice.co.jp/20111104-1315/"><<続きを読む>></a>]]></description>
			<content:encoded><![CDATA[<p>以前、<a href="http://maniax.jp/installmaniax/1/result">インストールマニアックス第１回大会</a>に参加した際に頂いたWindowsサーバーですが、３年近くたった今でも元気に動いてくれていました。初期状態の１GBのメモリでしたが、いやぁ結構仕事してくれるもんです。<br />
先日、同じ大会に参加した友人のサーバーが壊れたそうで、メモリだけ頂きました。なんとその友人は増設していたので８GB♪<br />
昨日は祝日でしたのでサーバーを止めて増設しました。ハード系は得意ではありませんがメモリの交換ぐらいできるのです（笑。</p>
<p>そう、メモリの交換ぐらい・・・・<br />
<span id="more-1315"></span><br />
<strong>１．マシンの蓋を開けてメモリを差し込みます。</strong><br />
<a href="http://searchapj.dell.com/results.aspx?s=gen&#038;c=jp&#038;l=ja&#038;cs=&#038;k=T100&#038;cat=sup&#038;x=0&#038;y=0">DELL PowerEdge T100</a>は一度フタを開けると起動時にBIOSが警告を出しますので、BIOSの設定をクリアしなければなりません。普段通りのネットワーク越しの接続ではBIOSの設定はできませんので、モニタを出してきて直結しました。<br />
　⇒　<span style="color:#a00">モニタの電源が入りません。モニタが壊れていた模様。</span></p>
<p><strong>２．モニタを買ってきます。</strong><br />
急いでいたので近所のヤマ●電機に買いに行きました。１万３５００円。安くなったもんですね。買ってきたモニタをつないで起動。「Alert!Cover was previously opened.opened.（警告! カバーが取り外されました。）」と表示されたらF2。おぉ、BIOS設定画面か。何もかも懐かしい。[System Security]－[Chassis Intrusion]を、[Detected]から[Enabled]に変更。<br />
　⇒　<span style="color:#a00">Windowsが起動したので安心したが、間もなくWindowsが突然昇天（前触れ無し）。再起動するもファンは回るがBIOSが起動しない。（ここでしばし放心状態）</span></p>
<p><strong>３．メモリを少し減らします</strong><br />
BIOSが来ない・BEEP音が鳴らないとくれば電源ユニットかマザーがいかれたかと思ったのですが、４スロットに４枚メモリを差した事でどこかに負荷がかかったのかも（根拠なし）と思って２枚に減らして起動。おぉ！！起動した！！！<br />
何度かマシンの再起動を繰り返して動作確認をすると・・・<br />
　⇒　<span style="color:#a00">「シャットダウンしています」画面で異常に待たされた後、ブルースクリーンが出てそのままなぜか起動プロセスへ。（毎回再現）</span></p>
<p><strong>４．USB無線LANクライアントを外します。</strong><br />
起動後にWindowsがブルースクリーンの原因を調べてくれて、無線LANクライアントがいけないと教えてくれた。（調査結果はドンピシャではないけど大いにヒントになった）<br />
先週「２経路にしたら便利かも」と思って余ってたUSBクライアントを差したのですが、普段再起動しないマシンだったので問題に気が付かなかったんですね。必須要件でもないので抜いてみました。<br />
　⇒　<span style="color:#a00">動いた！！！</span></p>
<p>以上、楽しい休日でした（苦笑。　でも１GBが４GBになったのでご機嫌です♪</p>
]]></content:encoded>
			<wfw:commentRss>http://kaba-blog.shall-systemservice.co.jp/20111104-1315/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://kaba-blog.shall-systemservice.co.jp/20111104-1315/" />
	</item>
		<item>
		<title>CakePHPのPaginatorに独自のパラメータを追加</title>
		<link>http://kaba-blog.shall-systemservice.co.jp/20110731-1297/</link>
		<comments>http://kaba-blog.shall-systemservice.co.jp/20110731-1297/#comments</comments>
		<pubDate>Sun, 31 Jul 2011 09:50:46 +0000</pubDate>
		<dc:creator>かばだんなさん</dc:creator>
				<category><![CDATA[CakePHP]]></category>

		<guid isPermaLink="false">http://kaba-blog.shall-systemservice.co.jp/?p=1297</guid>
		<description><![CDATA[CakePHP の一覧表示には標準搭載のPaginate機構を使う事が多いと思います。お手軽ですから。bakeで焼いたままで、ソートや改ページといった細かい手間も省いてくれますしね。 でも、一覧画面でありがちな「条件で絞&#160;&#160;<a href="http://kaba-blog.shall-systemservice.co.jp/20110731-1297/"><<続きを読む>></a>]]></description>
			<content:encoded><![CDATA[<p>CakePHP の一覧表示には標準搭載のPaginate機構を使う事が多いと思います。お手軽ですから。bakeで焼いたままで、ソートや改ページといった細かい手間も省いてくれますしね。</p>
<p>でも、一覧画面でありがちな「条件で絞り込み」みたいな要件にどう対応したらいいのかってドンピシャで書いてるところ少ないんですよね。前に確かに実装したのにな・・・って事で覚書。（今回はCakePHP 1.3.10 で動作確認しています。）</p>
<p><span id="more-1297"></span></p>
<h3 style="color:#00f;">【今回の要件】</h3>
<p>例えば、人の一覧画面で、［全て｜男のみ｜女のみ］みたいなスイッチで絞り込みをしたいとしましょう。</p>
<p>やり方は色々あるのですが、どうせなら通常「http://あああ.com/・・・/index/page:2/sort:name/derection:asc」とかなってるURLにさらに「/seibetu:1」みたいな独自のパラメータが追加できればいいですよね。</p>
<h3 style="color:#00f;">【namedパラメータが途中で消えないようにしよう（View編）】</h3>
<p>この場合は Viewファイルに</p>
<pre class="brush: php; title: ; notranslate">
&lt;?php
// ページネータが自動生成してくれるリンクに独自のパラメータも追加してもらう
if (isset($this-&gt;params['named']['seibetu'])) {
	$paginator-&gt;options(array('url' =&gt; array('seibetu' =&gt; $this-&gt;params['named']['seibetu'])));
}

// 絞り込み用のリンク作成
$str = sprintf(&quot;[ %s | %s | %s ]&quot;,
	$this-&gt;Paginator-&gt;link('全て', array('seibetu'=&gt;'')),
	$this-&gt;Paginator-&gt;link('男のみ', array('seibetu'=&gt;'1')),
	$this-&gt;Paginator-&gt;link('女のみ', array('seibetu'=&gt;'2'))
);
?&gt;
</pre>
<p>と書きます。これでページが変わろうとソート順が変わろうと、絞り込み条件はパラメータとして引き継がれ続けます。</p>
<p>ちなみに余談ですが、上記ソース中「<span style="color:#D48D00;">$paginator</span>」と「<span style="color:#D48D00;">$this->Paginator</span>」は同じ物です。HtmlHelperが「<span style="color:#D48D00;">$html</span>」でも「<span style="color:#D48D00;">$this->Html</span>」でもアクセスできるのと同じです。変数名が短い方がいいか、ヘルパを操作しているのが一目で分かる可読性の高さを好まれるか、お好きな方をどうど。（そりゃ速度性能から言えば$paginatorの方が速いけど、万分の１秒も変わらないだろうから・・・・。）</p>
<h3 style="color:#00f;">【引き継がれた条件で絞り込み検索（Controller編）】</h3>
<p>次はコントローラ側です。ここではリクエストパラメータを受け取って絞り込み検索を行います。Bakeで焼いただけの自動生成されたソースでは</p>
<pre class="brush: php; title: ; notranslate">
	$this-&gt;set('modelNames', $this-&gt;paginate());
</pre>
<p>となっていると思います。これを</p>
<pre class="brush: php; title: ; notranslate">
	$conditions = array();
	if(isset($this-&gt;params['named']['seibetu'])) {
		$seibetu = $this-&gt;params['named']['seibetu'];
		$conditions = array(
			'Person' =&gt; array('seibetu' =&gt; $seibetu)
		);
	}
	$this-&gt;set('persons', $this-&gt;paginate(null, $conditions));
</pre>
<p>といった感じで書き換えればＯＫです。</p>
<h3 style="color:#00f;">【POSTで条件を送る場合（余談）】</h3>
<p>単独ならこれでもいいのですが、複数の条件を入力して１回でドカン！と再検索しようとするとどうしてもフォームを作ってPOSTで送る感じになりますよね。<br />
これこそ実装方式は色々ありますが、かばだんなさんは上記コントローラ編のソースの前に下記のように書いています。</p>
<pre class="brush: php; title: ; notranslate">
	if ($_SERVER['REQUEST_METHOD']=='POST' &amp;&amp; isset($this-&gt;params['data'][$this-&gt;modelNames[0]]['seibetu'])) {
		// ポストされたデータを名前付き変数に再セット
		$this-&gt;params['named']['seibetu']
			= $this-&gt;params['data'][$this-&gt;modelNames[0]]['seibetu'];
		// で、そのまま自分にリダイレクト
		$this-&gt;redirect($this-&gt;params['named']);
	}
</pre>
<p>リダイレクトは不要と思われるかもしれませんね。はい、なくても動きます。<br />
単に かばだんなさん の趣味ですｗ</p>
<p>しかしまぁ、「実装としては何てことはないけど忘れてしまうと大変」というのが、規約系フレームワークの辛い所ですね（苦笑。</p>
]]></content:encoded>
			<wfw:commentRss>http://kaba-blog.shall-systemservice.co.jp/20110731-1297/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://kaba-blog.shall-systemservice.co.jp/20110731-1297/" />
	</item>
		<item>
		<title>JavaScriptでループ毎に一定時間待つ方法</title>
		<link>http://kaba-blog.shall-systemservice.co.jp/20110719-1282/</link>
		<comments>http://kaba-blog.shall-systemservice.co.jp/20110719-1282/#comments</comments>
		<pubDate>Tue, 19 Jul 2011 07:04:00 +0000</pubDate>
		<dc:creator>かばだんなさん</dc:creator>
				<category><![CDATA[b. 技術者かばだんなさん]]></category>
		<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://kaba-blog.shall-systemservice.co.jp/?p=1282</guid>
		<description><![CDATA[ぐるぐるループしながら処理を行う際に、一定時間 間をおいてから次の処理をしたい場合は多々あります。 他の言語ですと sleep() や wait() を使えばいいのですが、残念JavaScript にはそのようなコマンド&#160;&#160;<a href="http://kaba-blog.shall-systemservice.co.jp/20110719-1282/"><<続きを読む>></a>]]></description>
			<content:encoded><![CDATA[<p>ぐるぐるループしながら処理を行う際に、一定時間 間をおいてから次の処理をしたい場合は多々あります。<br />
他の言語ですと sleep() や wait() を使えばいいのですが、残念JavaScript にはそのようなコマンドはありません。まぁJSの使われ所を考えると当然かもしれませんが。<br />
もちろん JavaScript では実現できないって意味じゃありません。setTimeout() があります。でもちょっと実装方法が違うので、最初のうちは少しだけ悩んじゃうんですよね。</p>
<p>先日そういった処理を実装する方法を質問されて、ちょっと説明に苦心しました。忘れてますね~（苦笑。</p>
<p>ということで本日は説明した時の備忘録。</p>
<p><span id="more-1282"></span></p>
<p>まずそれぞれの「待つコマンド」の違いを見てみましょう。</p>
<dl>
<dt>他の言語の sleep() や wait() の役割</dt>
<dd>指定された時間（多くはミリ秒単位）待ってから次の行を実行する。</dd>
<dt>JavaScript のsetTimeout() の役割</dt>
<dd>一定時間後に実行する処理を予約登録し、そのまま次の行を実行する。（ビデオの録画予約を登録したらさっさと次の用事を始める人間の動きに似ています。）</dd>
</dl>
<p>この違いが分からないうちは、</p>
<pre class="brush: jscript; title: ; notranslate">
	alert(&quot;始めるよ&quot;);
	for( i=0; i&lt;10; i++) {
		setTimeout(&quot;alert('Go!')&quot;,2000);
	}
	alert(&quot;お待たせ&quot;);
</pre>
<p>なんてコードを書いてしまいますね。この例ですと「始めるよ」を表示した後（すごい勢いで10件分の予約登録だけしてから）すぐに「お待たせ」が表示され、２秒後に連続10回「Go!」が表示されます。</p>
<p>以上、説明編。</p>
<p>ではどう実装するかですが、例えば配列にパラメータを突っ込んでおいて、その件数分ループしながら４秒に１回処理を行う、というありがちな処理の場合は下記のような実装でどうでしょう。</p>
<pre class="brush: jscript; title: ; notranslate">

// パラメータ
arr = [1,3,24,126,326];
// 実処理の実行
act();

function act() {
	// パラメータが無くなっていれば終了
	if(arr.length==0) return;
	// 配列の先頭を使う
	param = arr[0];

	//TODO: 何かの処理
	alert(param);

	// 処理済みのパラメータ削除
	arr.shift();
	// 次の回の実行予約
	setTimeout(function(){
		act();
	}, 4000);
	// これで１回の処理は終了
}
</pre>
<p>一見 再帰的に呼び出しているように見えるので、「パラメータの件数が増えた時に大丈夫？永久ループでは使えない？」と思われがちですが、あくまで後続の関数呼び出しは「予約登録」を行っているだけで自関数内から呼んでいませんので、再帰ではありません。</p>
<p>ところで若いうちはJavaScriptにsleepもwaitもないと分かると、</p>
<pre class="brush: jscript; title: ; notranslate">
	alert(&quot;始めるよ&quot;);
	for( i=0; i&lt;10; i++) {

		alert(&quot;処理します&quot;);

		// 待ちのための空ループ
		for( j=0; j&lt;10000; j++) {}
	}
	alert(&quot;お待たせ&quot;);
</pre>
<p>とやりがちです。こりゃあもう間違いのセオリーですな（笑。<br />
これはダメです。なぜかというと、このやり方だと割り込みが入らないので、同じページで例えばonclick()なんかを仕込んでおいたとしても処理実行中は聞き入れてくれません。処理が終わるまで固まりっぱなしです。<br />
まぁこういう方式もバッチ処理ならこれもアリかもしれません。JavaScriptでバッチを組むなら・・・。</p>
]]></content:encoded>
			<wfw:commentRss>http://kaba-blog.shall-systemservice.co.jp/20110719-1282/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://kaba-blog.shall-systemservice.co.jp/20110719-1282/" />
	</item>
		<item>
		<title>団扇 買っちゃった</title>
		<link>http://kaba-blog.shall-systemservice.co.jp/20110702-1272/</link>
		<comments>http://kaba-blog.shall-systemservice.co.jp/20110702-1272/#comments</comments>
		<pubDate>Sat, 02 Jul 2011 09:29:37 +0000</pubDate>
		<dc:creator>かばだんなさん</dc:creator>
				<category><![CDATA[c. 個人かばだんなさん]]></category>

		<guid isPermaLink="false">http://kaba-blog.shall-systemservice.co.jp/?p=1272</guid>
		<description><![CDATA[え～昨日、「水うちわ」なるものの存在を偶然知った かばだんなさん。どうしても欲しくなって青山まで買いに行ってしまいました。 あまりの薄さに向こう側がうっすら透けているのがお分かり頂けるでしょうか？ （カメラマンかばだんな&#160;&#160;<a href="http://kaba-blog.shall-systemservice.co.jp/20110702-1272/"><<続きを読む>></a>]]></description>
			<content:encoded><![CDATA[<p>え～昨日、「水うちわ」なるものの存在を偶然知った かばだんなさん。どうしても欲しくなって青山まで買いに行ってしまいました。</p>
<p><a href="http://kaba-blog.shall-systemservice.co.jp/wp-content/uploads/2011/07/DSC_0012.jpg" rel="lightbox[1272]"><img src="http://kaba-blog.shall-systemservice.co.jp/wp-content/uploads/2011/07/DSC_0012-225x300.jpg" alt="" title="水うちわ" width="225" height="300" class="aligncenter size-medium wp-image-1275" /></a></p>
<p>あまりの薄さに向こう側がうっすら透けているのがお分かり頂けるでしょうか？<br />
（カメラマンかばだんなさんの腕が悪いのですが、実物はもっともっと綺麗で上品です。）<br />
かばだんなさんはこういう職人の仕事が大好きなので、テンションあがりまくりです。</p>
<p>ちなみに制作は<a href="http://www.iedashikou.com/utiwa.html">家田紙工さん</a>。イケてます。</p>
<p>工芸品は使ってナンボと信じているかばだんなさんは、こいつを相棒に夏を乗り切るつもりです。</p>
]]></content:encoded>
			<wfw:commentRss>http://kaba-blog.shall-systemservice.co.jp/20110702-1272/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://kaba-blog.shall-systemservice.co.jp/20110702-1272/" />
	</item>
		<item>
		<title>CakePHP の HABTMって楽ですよ</title>
		<link>http://kaba-blog.shall-systemservice.co.jp/20110625-1219/</link>
		<comments>http://kaba-blog.shall-systemservice.co.jp/20110625-1219/#comments</comments>
		<pubDate>Sat, 25 Jun 2011 08:40:17 +0000</pubDate>
		<dc:creator>かばだんなさん</dc:creator>
				<category><![CDATA[CakePHP]]></category>

		<guid isPermaLink="false">http://kaba-blog.shall-systemservice.co.jp/?p=1219</guid>
		<description><![CDATA[ちょっと急用でCakePHPで簡単なサイトアプリを書いていたのですが、いや～半年近くやってないとCakeも忘れちゃいますね（汗。 そのサイトで多対多のテーブル連携ってのがありまして。 そのまま書くわけにはいかないので題材&#160;&#160;<a href="http://kaba-blog.shall-systemservice.co.jp/20110625-1219/"><<続きを読む>></a>]]></description>
			<content:encoded><![CDATA[<p>ちょっと急用でCakePHPで簡単なサイトアプリを書いていたのですが、いや～半年近くやってないとCakeも忘れちゃいますね（汗。</p>
<p>そのサイトで<b>多対多のテーブル連携</b>ってのがありまして。<br />
そのまま書くわけにはいかないので題材を変えると・・・例えば「会議議事録管理システム」としましょうか。</p>
<p>テーブルの構成としては「会議」のテーブルと「メンバー」のテーブルが ｎ：ｎ の関係で連携します。１回の会議には複数人が出席しますし、１人のメンバーは複数回の会議に出席しますからね。<br />
モデルクラス同士のつながりは下記のイメージになります。</p>
<p><a href="http://kaba-blog.shall-systemservice.co.jp/wp-content/uploads/2011/06/cakePHP_HABTM_model.png" rel="lightbox[1219]"><img src="http://kaba-blog.shall-systemservice.co.jp/wp-content/uploads/2011/06/cakePHP_HABTM_model-300x198.png" alt="多対多のモデルイメージ" title="cakePHP_HABTM_model" width="300" height="198" class="aligncenter size-medium wp-image-1220" /></a></p>
<p>このような連携のアプリケーションを実装するために、CakePHPでは「<b>HABTM(hasAndBelongsToMany)</b>」という仕組みを使うわけです。<br />
（サンプルのコードはCakePHP 1.3 を使用しています。）<br />
<span id="more-1219"></span></p>
<h3 style="color:#00f;">== モデルの作成 ==</h3>
<p>CakePHPの場合はモデルクラスはBake で焼いちまった方が早いです。ここで注意すべきは、</p>
<ul>
<li><span style="color:#f11;">中間モデルも（空っぽでいいから）作っておかなくてはダメ</span>。（メンバー情報・会議情報でHABTM定義してるからいらないやと勝手に思って実装したら動きませんでした。）</li>
<li>中間モデルのクラス（ファイル）名は前半分が複数形、後ろ半分が単数形。</li>
</ul>
<p>という事ですかね。</p>
<p>もしあなたがモデルクラスをBakeで自動生成したなら、例えば会議管理クラスファイルには</p>
<pre class="brush: php; title: ; notranslate">
	var $hasAndBelongsToMany = array(
		'Member' =&gt; array(
			'className' =&gt; 'Member',
			'joinTable' =&gt; 'meetings_members',
			'foreignKey' =&gt; 'meeting_id',
			'associationForeignKey' =&gt; 'member_id',
			'unique' =&gt; true,
			'conditions' =&gt; '',
			'fields' =&gt; '',
			'order' =&gt; '',
			'limit' =&gt; '',
			'offset' =&gt; '',
			'finderQuery' =&gt; '',
			'deleteQuery' =&gt; '',
			'insertQuery' =&gt; ''
		)
	);
</pre>
<p>って感じで書かれているでしょう。でしたらもうこれ以上何も要りません。<br />
「Bake様に焼いてもらうような無精は許せん！」という男気溢れるあなたは上記のコードをクラス内に貼り付けるだけです。</p>
<h3 style="color:#00f;">== ビュー・コントローラの作成 ==</h3>
<p>フロントエンドもそんなには難しくないです。参照の方は画面をBakeで焼いてしまえばサンプルがそのまま出来上がりますから省略するとして、更新の方だけ。</p>
<p>例えば会議を登録する時、参加したメンバーをリストボックスから選択したいとしましょう。</p>
<h4>=== リストボックスに表示するデータの取得 ===</h4>
<p>まずコントローラファイル（meetings_controller.php）では画面表示用に事前にメンバー情報を検索しておきます。</p>
<pre class="brush: php; title: ; notranslate">
		$members = $this-&gt;Meeting-&gt;Member-&gt;find('list');
		$this-&gt;set(compact('members'));
</pre>
<p>ちなみにここでsetする変数名ですが、「先頭だけ小文字のキャメルケース」になっていました。例えばテーブル名が「company_members」なら、この変数名は「companyMembers」になります。</p>
<h4>=== 更新画面の入力フォーム ===</h4>
<p>さて画面ファイル（add.ctp）ですが、これはもっと簡単。&lt;form&gt;&lt;/form&gt;内に</p>
<pre class="brush: php; title: ; notranslate">
	&lt;?php // 会議登録画面
		echo $this-&gt;Form-&gt;input('title');
		echo $this-&gt;Form-&gt;input('when');
		echo $this-&gt;Form-&gt;input('place');
		echo $this-&gt;Form-&gt;input('Member'); // ←この１行追加
	?&gt;
</pre>
<p>と１行追加するだけで、出席者をリストボックスから選択する事が出来るようになります。</p>
<p>余談ですが、このctpによって生成されるHTMLは、</p>
<pre class="brush: xml; title: ; notranslate">
&lt;select name=&quot;data[Member][Member][]&quot; multiple=&quot;multiple&quot; id=&quot;MemberMember&quot;&gt;
&lt;option value=&quot;25&quot;&gt;かばだんなさん&lt;/option&gt;
&lt;option value=&quot;26&quot;&gt;若旦那さん&lt;/option&gt;
&lt;option value=&quot;27&quot;&gt;バカ旦那さん&lt;/option&gt;
&lt;option value=&quot;28&quot;&gt;大旦那さん&lt;/option&gt;
&lt;/select&gt;
</pre>
<p>となります。「data[Member][Member]」は「data[Meeting][Member]」と書きたい気もしますが、これが正しいです。気持ち悪いけど。</p>
<p>さらに余談ですが、登録画面で情報を入力してSubmitボタンを押した場合、コントローラに渡されるデータ（$this->data）は</p>
<pre style="background-color:#FFCC00">
Array
(
    [Meeting] => Array
        (
            [title] => 今日のお昼にチキン南蛮弁当は妥当かどうか
            [when] => Array
                (
                    [month] => 06
                    [day] => 25
                    [year] => 2011
                )
            [place] => 本社大会議室
        )
    [Member] => Array
        (
            [Member] => Array
                (
                    [0] => 26
                    [1] => 27
                )
        )
)
</pre>
<p>てな感じです。（ひどい議題の会議もあったもんですが。）</p>
<h4>=== コントローラに戻って更新処理 ===</h4>
<p>さてコントローラに渡った後の更新処理ですが、これも普通にMeetingテーブルを更新するだけです。具体的にはコントローラ内で、</p>
<pre class="brush: php; title: ; notranslate">
if (!empty($this-&gt;data)) {
	$this-&gt;Meeting-&gt;create();
	if ($this-&gt;Meeting-&gt;save($this-&gt;data)) {
		$this-&gt;Session-&gt;setFlash('登録成功だぜ！', true));
		$this-&gt;redirect(array('action' =&gt; 'index'));
	} else {
		$this-&gt;Session-&gt;setFlash('エラーだぜ！', true));
	}
}
</pre>
<p>と、普通にMeetingの登録を行うと、自動的に中間テーブルの更新（今回の例ですと２行追加）もやってくれます。Meetingの削除を行えば関連する中間テーブルのレコードも削除してくれます。</p>
<p>以上、ホント簡単ですね。</p>
<h3 style="color:#00f;">～～ 中間テーブルに１件しか登録しないと分かってる場合 ～～</h3>
<p>「こんなの ｎ：ｎにする必要ないじゃないか」と言われてしまいそうですが、モデル的にはｎ：ｎでもこの機能では１：ｎ なんて局面はあるもんです。<br />
例えば上記の例で、会議登録時には登録者として自分だけの中間レコードが登録されるだけでいいや、みたいな時ですね。<br />
その場合、もう少しシンプルにすることができます。</p>
<p>まず入力フォームですが、わざわざ入力させる必要もないのでhiddenにメンバーIDを埋め込んで送ってもらうとします。</p>
<pre class="brush: php; title: ; notranslate">
	&lt;?php // 会議登録画面
		echo $this-&gt;Form-&gt;hidden('Member', array('value'=&gt;24));
	?&gt;
</pre>
<p>これで生成されるHTMLは、</p>
<pre class="brush: xml; title: ; notranslate">
&lt;input type=&quot;hidden&quot; name=&quot;data[Member][Member]&quot;
        value=&quot;24&quot; id=&quot;MemberMember&quot; /&gt;
</pre>
<p>となります。</p>
<p>Submitボタンを押してコントローラに渡されるデータ（$this->data）は</p>
<pre style="background-color:#FFCC00">
Array
(
    [Meeting] => Array
        (
                    <<省略します>>
        )
    [Member] => Array
        (
            [Member] => 24
        )
)
</pre>
<p>てな感じです。これで複数件の時と同様に、中間テーブルの更新もCakeが自動でやってくれます。</p>
<p>以上、「CakePHPのHABTMは分かりにくいので中間テーブル操作は自作した方が早い」って方を見かけたので、実はそんなに大変でもないよ、というご紹介でした。</p>
]]></content:encoded>
			<wfw:commentRss>http://kaba-blog.shall-systemservice.co.jp/20110625-1219/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://kaba-blog.shall-systemservice.co.jp/20110625-1219/" />
	</item>
		<item>
		<title>暑いですねぇ・・・</title>
		<link>http://kaba-blog.shall-systemservice.co.jp/20110624-1214/</link>
		<comments>http://kaba-blog.shall-systemservice.co.jp/20110624-1214/#comments</comments>
		<pubDate>Fri, 24 Jun 2011 08:15:13 +0000</pubDate>
		<dc:creator>かばだんなさん</dc:creator>
				<category><![CDATA[c. 個人かばだんなさん]]></category>

		<guid isPermaLink="false">http://kaba-blog.shall-systemservice.co.jp/?p=1214</guid>
		<description><![CDATA[しっかし、ホントに暑いですねぇ。 本日とうとう今年初めてエアコンを使ってしまいました。とは言っても１時間ぐらいですが。 ちょっと体調微妙だったんで無理は禁物かな、と。 節電って確かに大事ですけど、体壊しちゃ何にもなりませ&#160;&#160;<a href="http://kaba-blog.shall-systemservice.co.jp/20110624-1214/"><<続きを読む>></a>]]></description>
			<content:encoded><![CDATA[<p>しっかし、ホントに暑いですねぇ。</p>
<p>本日とうとう今年初めてエアコンを使ってしまいました。とは言っても１時間ぐらいですが。<br />
ちょっと体調微妙だったんで無理は禁物かな、と。</p>
<p>節電って確かに大事ですけど、体壊しちゃ何にもなりませんからね（笑。</p>
<p>ちなみに かばだんなさんは節電対策として、プリンターのコンセントを使わない間は抜いておくようにしています。これ、目に見えて電気代が減りますね。</p>
<p>みなさん頑張って暑さを乗り切りましょう～</p>
]]></content:encoded>
			<wfw:commentRss>http://kaba-blog.shall-systemservice.co.jp/20110624-1214/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://kaba-blog.shall-systemservice.co.jp/20110624-1214/" />
	</item>
		<item>
		<title>麻生さんが来てた</title>
		<link>http://kaba-blog.shall-systemservice.co.jp/20110519-1199/</link>
		<comments>http://kaba-blog.shall-systemservice.co.jp/20110519-1199/#comments</comments>
		<pubDate>Thu, 19 May 2011 10:16:04 +0000</pubDate>
		<dc:creator>かばだんなさん</dc:creator>
				<category><![CDATA[c. 個人かばだんなさん]]></category>

		<guid isPermaLink="false">http://kaba-blog.shall-systemservice.co.jp/?p=1199</guid>
		<description><![CDATA[今日の夕方、用事があって浦安駅の前を通りがかったら、ロータリーに止めた街宣車の上で麻生太郎さんが演説してました。 普段だったらスルーなのですが、かばだんなさんは麻生系列の飯塚病院で生まれましたので通り過ぎる事ができません&#160;&#160;<a href="http://kaba-blog.shall-systemservice.co.jp/20110519-1199/"><<続きを読む>></a>]]></description>
			<content:encoded><![CDATA[<p>今日の夕方、用事があって浦安駅の前を通りがかったら、ロータリーに止めた街宣車の上で<a href="http://ja.wikipedia.org/wiki/%E9%BA%BB%E7%94%9F%E5%A4%AA%E9%83%8E">麻生太郎</a>さんが演説してました。</p>
<p>普段だったらスルーなのですが、かばだんなさんは麻生系列の<a href="http://ja.wikipedia.org/wiki/%E9%A3%AF%E5%A1%9A%E7%97%85%E9%99%A2">飯塚病院</a>で生まれましたので通り過ぎる事ができません。そのまま５分ぐらい聞いてました。</p>
<p>「浦安の地価が下がったという事はすなわち皆さんの財産が目減りしたという事だ」という麻生さんらしい いかにも経済人的な発想や、積極財政政策によって財政安定化を狙う考え方などは かばだんなさんは非常に評価しているのですが、「なんだか分かんないうちにココに立つ事になっちゃった」とか・・・麻生さん～、それはちょっと笑いづらいのですが・・・（苦笑。</p>
<p>え、今日の演説で一番心に残った言葉ですか？<br />
<strong>『亭主と政権は変えるのは意外と大変』</strong><br />
ですかね（笑。</p>
<p>だってそこだけ聞いたら、「大変だから自民党にもう１回戻すのはやめよう」って話になりかねないじゃないですか。いや、話の流れでいうと「だから民主党に変えたのは失敗だったんですよ」って意味だってのは分かってるんですけどね（笑。</p>
<p>麻生さんは経済と漫画の話以外はしない方がいいんじゃないかと思ったかばだんなさんでした～。</p>
]]></content:encoded>
			<wfw:commentRss>http://kaba-blog.shall-systemservice.co.jp/20110519-1199/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://kaba-blog.shall-systemservice.co.jp/20110519-1199/" />
	</item>
		<item>
		<title>5分でOfficeの独自リボン作成（VB+ビジュアルデザイナ利用）</title>
		<link>http://kaba-blog.shall-systemservice.co.jp/20110412-833/</link>
		<comments>http://kaba-blog.shall-systemservice.co.jp/20110412-833/#comments</comments>
		<pubDate>Tue, 12 Apr 2011 06:09:41 +0000</pubDate>
		<dc:creator>かばだんなさん</dc:creator>
				<category><![CDATA[b. 技術者かばだんなさん]]></category>
		<category><![CDATA[Office]]></category>
		<category><![CDATA[VB]]></category>
		<category><![CDATA[VisualStudio]]></category>

		<guid isPermaLink="false">http://kaba-blog.shall-systemservice.co.jp/?p=833</guid>
		<description><![CDATA[Office2010(2007もだけど)では、『リボン』が重要なUIです。最初は「場所とるな~」と思ってましたが、今となってはリボン無しでOfficeを触る方が違和感があるほどです。 このリボン、VisualStudio&#160;&#160;<a href="http://kaba-blog.shall-systemservice.co.jp/20110412-833/"><<続きを読む>></a>]]></description>
			<content:encoded><![CDATA[<p>Office2010(2007もだけど)では、『リボン』が重要なUIです。最初は「場所とるな~」と思ってましたが、今となってはリボン無しでOfficeを触る方が違和感があるほどです。<br />
<a href="http://kaba-blog.shall-systemservice.co.jp/wp-content/uploads/2011/04/WhatsRibbon.png" rel="lightbox[833]"><img src="http://kaba-blog.shall-systemservice.co.jp/wp-content/uploads/2011/04/WhatsRibbon-300x221.png" alt="Officeのリボンとは" title="Officeのリボン" width="300" height="221" class="aligncenter size-medium wp-image-840" /></a></p>
<p>このリボン、VisualStudio を使えば簡単に作成できるのですが、意外とそのための日本語の情報が少ない気がします。それにあったとしても、デザイン部分はXMLを手書きするものばかりなんですよね。<br />
VisualStudio にはグラフィカルにリボンデザインができるように「ビジュアルなデザイナー」ってのがあります。このテのツールはMicrosoft のお家芸と言ってもいいでしょうから、使わない手はありません！</p>
<p>と思って作ってみたのですが、たったこれだけなのに随分悩みました（苦笑。<br />
今回は忘れてしまった時のための覚書です。<br />
（今回は新入社員の季節ということで 柔らかめに書いています。）</p>
<p><span id="more-833"></span></p>
<h1>【前提】</h1>
<dl>
<dt>・VisualStudio 2010 Professional SP1 を使っています</dt>
<dd>2010じゃなくても大丈夫なはずですが、グレードはProfessional以上が必要です。残念、無償版のExpressではダメです。</dd>
<dt>・言語は VisualBasic を使います。</dt>
<dd>今回はてっとり早くVBを使います。まぁ.netの世界なのでVCにしてもそう大きな違いはないと思いますが。</dd>
<dt>・サンプルとして Outlook2010 のリボンを作成します。</dt>
<dd>Outlook が一番引っかかりやすそうなので。</dd>
<dt>・デバッグにはOutlook2010 が必要です。</dt>
<dd>もちろんなくても開発はできるのですが、あった方がテストが格段に楽です。Outlook Express でも動くのかは・・・分かりません。情報求ム！</dd>
</dl>
<h1>【Outlook2010アドインプロジェクトを作る】</h1>
<p>まずVisualStudioを起動します。あ、この起動時間は「5分」に含めないでね（笑。<br />
起動したらメニューから、［ファイル］－［新規作成］－［プロジェクト］を選択します。<br />
「新しいプロジェクト」画面が表示されたら、［VisualBasic］－［Office］－［2010］を選択し、リストの中の「Outlook 2010 アドイン」を選択して OK をクリックします。</p>
<p><a href="http://kaba-blog.shall-systemservice.co.jp/wp-content/uploads/2011/04/create_Outlook2010AddinProject.png" rel="lightbox[833]"><img src="http://kaba-blog.shall-systemservice.co.jp/wp-content/uploads/2011/04/create_Outlook2010AddinProject-300x228.png" title="Outlook 2010 アドインプロジェクトを作る" width="300" height="228" class="aligncenter size-medium wp-image-863" /></a><br />
デフォルトのプロジェクト名は「OutlookAddIn1」になりますが、なんなら適宜書き換えて下さいませ。</p>
<h1>【自作リボンを作る】</h1>
<p>アドインプロジェクトが開いたら、右側に「ソリューション エクスプローラー」というパネルが表示され、そこに今作ったプロジェクトが表示されてると思います。（表示されてない？じゃあ「Ctrl+Alt+L」です！）<br />
ソリューション エクスプローラー では先ほど作ったプロジェクト「OutlookAddIn1」を右クリックします。（１番上のソリューションではなくて、その下のプロジェクトの方ね。）<br />
コンテキストメニューが表示されますので、［追加］－［コンポーネント］を選択します。<br />
すると「新しい項目の追加」というダイアログが表示されますので、「リボン （ビジュアルなデザイナー）」を選択して「追加」をクリックします。</p>
<p><a href="http://kaba-blog.shall-systemservice.co.jp/wp-content/uploads/2011/04/create_RibbonByVisualDesigner.png" rel="lightbox[833]"><img src="http://kaba-blog.shall-systemservice.co.jp/wp-content/uploads/2011/04/create_RibbonByVisualDesigner-300x168.png" title="新しい項目の追加 で リボンを選択する" width="300" height="168" class="aligncenter size-medium wp-image-869" /></a><br />
ソリューション エクスプローラー に「Ribbon1.vb」というファイルが作成されます。たぶん何もしなくても下記の画面が表示されると思いますが、表示されないようなら Ribbon1.vb をダブルクリックして下さい。</p>
<p><a href="http://kaba-blog.shall-systemservice.co.jp/wp-content/uploads/2011/04/create_RibbonByVisualDesigner2.png" rel="lightbox[833]"><img src="http://kaba-blog.shall-systemservice.co.jp/wp-content/uploads/2011/04/create_RibbonByVisualDesigner2-300x200.png" title="リボンデザイン画面（初期状態）" width="300" height="200" class="aligncenter size-medium wp-image-871" /></a></p>
<h1>【Outlook での追加手順】</h1>
<p>Outlook，InfoPath のアドインを作ろうとしている場合だけの手順ですが、このリボンのインスペクタを設定します。（分からん？ゴメン、私も五里霧中。MSDNの技術情報を読めば読むほど霧の中。深みにハマりそうなので、ただ画面にリボンを表示するだけのニーズなら「こういう事をするんだ」ぐらいに割り切った方が費用対効果出るかも。ちなみに私がハマったのがここ。）</p>
<p>リボンデザイナで「リボン」を選択して下さい。下図のようにリボン全体が点線で囲まれるイメージになるように。そうすると右下の「プロパティ」パネルの［動作］－［Ribbon Type］の項目に「Microsoft.Outlook.Mail.Read」と表示されています。<br />
右側にある下向き三角をクリックすると下図のように候補の一覧が表示されます。</p>
<p><a href="http://kaba-blog.shall-systemservice.co.jp/wp-content/uploads/2011/04/create_RibbonByVisualDesigner3.png" rel="lightbox[833]"><img src="http://kaba-blog.shall-systemservice.co.jp/wp-content/uploads/2011/04/create_RibbonByVisualDesigner3-300x213.png" title="RibbonType を選択する" width="300" height="213" class="aligncenter size-medium wp-image-873" /></a></p>
<p>初期状態でチェックされている「Outlook.Mail.Read」では リボンは表示されませんでした。もしかしたら表示されるのかもしれませんが、私には分かりませんでした。何となく一覧を眺めていて「受信トレイ選択時？」と思ったのですが、表示されません。</p>
<p>ということで「Microsoft.Outlook.Explorer」を選択します。これなら受信トレイだろうが予定表だろうがどこでもリボンが表示されますので。</p>
<p>余談ですが長らく「この一覧のそれぞれが何を意味しているか」っていう、使う側にとって最も欲しい情報が、MSDN で見つけられませんでした。もし VisualStudio にも表示されているリボンクラスのプロパティを説明する<a href="http://msdn.microsoft.com/en-us/library/microsoft.office.tools.ribbon.officeribbon.ribbontype.aspx">このページ</a>辺りから、<a href="http://msdn.microsoft.com/ja-jp/library/ee692172.aspx#OfficeOLExtendingUI_RibbonIdentifiers">そういう説明のページ</a>にリンクが張ってあったりするとすごく幸せだと思うのですが・・・。（まぁ説明のページって言っても何を説明したいのかフォーカスの絞れていないダメな説明ページだけど。）</p>
<h1>【ボタンを追加してみよう！】</h1>
<p>実はこれで独自リボンの作成は終わりなんです。（ね？５分でしょ？）<br />
でもさすがにこれじゃあ寂しいですか（笑。<br />
それでは せっかくなんでボタンでも配置してみましょう。</p>
<p>VisualStudio の左端の「ツールボックス」をクリックして開き、一覧から「Button」を選択し、リボンデザイナのリボングループ内をクリックして追加します。</p>
<p><a href="http://kaba-blog.shall-systemservice.co.jp/wp-content/uploads/2011/04/create_RibbonByVisualDesigner4.png" rel="lightbox[833]"><img src="http://kaba-blog.shall-systemservice.co.jp/wp-content/uploads/2011/04/create_RibbonByVisualDesigner4-300x205.png" title="ツールボックスからボタンを選択" width="300" height="205" class="aligncenter size-medium wp-image-880" /></a></p>
<p>画面の通り・・・これ・・・リボングループに張りつけるの大変ねｗ<br />
私は「ボタン」選択状態で、リボンを右クリックしてツールボックスをひっこめてから貼り付けるようにしてます。</p>
<p>ボタンを貼り付けたら右側のソリューションエクスプローラに戻り、リボンファイル（Ribbon1.vb）を右クリックして「コードの表示」を選択します。</p>
<p><a href="http://kaba-blog.shall-systemservice.co.jp/wp-content/uploads/2011/04/create_RibbonByVisualDesigner5.png" rel="lightbox[833]"><img src="http://kaba-blog.shall-systemservice.co.jp/wp-content/uploads/2011/04/create_RibbonByVisualDesigner5-300x165.png" alt="" title="リボンのコードを表示する" width="300" height="165" class="aligncenter size-medium wp-image-894" /></a></p>
<p>もうここから先はいつものVBですね。コード画面の左上のプルダウンから「Button1」を選択し、右上のプルダウンから「Click」を選択すればメソッドが表示されますので、下記のように書いて保存しましょう。</p>
<pre class="brush: vb; title: ; notranslate">
    Private Sub Button1_Click(sender As Object, e As Microsoft.Office.Tools.Ribbon.RibbonControlEventArgs) Handles Button1.Click

        MsgBox(&quot;We need ShallSystemService!&quot;)

    End Sub
</pre>
<p>メッセージの内容ですか？そりゃまぁこの通り書く必要はないですけどね（笑。<br />
でもできれば書いてほしいな～・・・<br />
え？周りに同僚がいる？できれば音読してほしいな～・・・<br />
何と！？離れた所に発注権限を持った偉い人がいる！？できれば叫んでほしいな～ｗ</p>
<h1>【動かしてみよう！】</h1>
<p>それでは たったこれだけですが動かしてみましょう。<br />
VisualStudio のツールバーにある右向き三角ボタンを押しましょう。<br />
（あ、その右の「構成」が「Debug」になっている事を確認してね。）</p>
<p><a href="http://kaba-blog.shall-systemservice.co.jp/wp-content/uploads/2011/04/create_RibbonByVisualDesigner6.png" rel="lightbox[833]"><img src="http://kaba-blog.shall-systemservice.co.jp/wp-content/uploads/2011/04/create_RibbonByVisualDesigner6-300x90.png" alt="" title="デバッグ実行ボタン" width="300" height="90" class="aligncenter size-medium wp-image-892" /></a></p>
<p>デバッグ実行すると自動的にOutlookが起動します。これはいい！<br />
上のリボンタブから「アドイン」を選択すると・・・自作のリボングループが作成されていますね。</p>
<p><a href="http://kaba-blog.shall-systemservice.co.jp/wp-content/uploads/2011/04/create_RibbonByVisualDesigner7.png" rel="lightbox[833]"><img src="http://kaba-blog.shall-systemservice.co.jp/wp-content/uploads/2011/04/create_RibbonByVisualDesigner7-300x85.png" alt="" title="実行結果" width="300" height="85" class="aligncenter size-medium wp-image-896" /></a></p>
<p>せっかくなので「Button1」もクリックしてみましょう。<br />
もちろん必要に応じて音読も歓迎です。</p>
<h1>【後始末】</h1>
<p>上記のデバッグ実行ですが、アドインは普通にOutlookにインストールされちゃっていますので、VisualStudio を終了した後も動き続けます。<br />
テストが終わったら後始末も大切ですからね、消しておきましょう。</p>
<p>VisualStudio のメニューから［ビルド］－［OutlookAddIn1 のクリーン］を選択します。</p>
<p><a href="http://kaba-blog.shall-systemservice.co.jp/wp-content/uploads/2011/04/create_RibbonByVisualDesigner8.png" rel="lightbox[833]"><img src="http://kaba-blog.shall-systemservice.co.jp/wp-content/uploads/2011/04/create_RibbonByVisualDesigner8-300x128.png" alt="アドインのクリーン（アンインストール）" title="アドインのクリーン（アンインストール）" width="300" height="128" class="aligncenter size-medium wp-image-897" /></a><br />
これで終わりです。</p>
<h1>【今日のおまとめ】</h1>
<p>まとめるほどの事もないんだけど、ビジュアルデザイナを利用した場合のポイントだけ。</p>
<dl>
<dt>・RibonType に Microsoft.Outlook.Explorer を選択するのがミソ。</dt>
<dd></dd>
<dt>・アドイン本体にリボンの表示などのコードを書く必要は無い。</dt>
<dd>（リボンをXMLで書いた時には必要なんですよ。）</dd>
<dt>・リボンで発生するイベントは、リボンのファイル内にコードを記述する。</dt>
<dd>（VBのForm と同じ考え方ですね。）</dd>
</dl>
<p>と、まぁこんな感じです。</p>
]]></content:encoded>
			<wfw:commentRss>http://kaba-blog.shall-systemservice.co.jp/20110412-833/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://kaba-blog.shall-systemservice.co.jp/20110412-833/" />
	</item>
	</channel>
</rss>

