<?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/"
	>

<channel>
	<title>クオリサイトテクノロジーズ TECH BLOG</title>
	<atom:link href="http://www.qualysite.co.jp/tech-blog/?feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://www.qualysite.co.jp/tech-blog</link>
	<description>クオリサイトテクノロジーズの技術情報ブログです</description>
	<lastBuildDate>Tue, 24 Apr 2012 00:00:22 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1</generator>
		<item>
		<title>新入社員研修について</title>
		<link>http://www.qualysite.co.jp/tech-blog/?p=5088</link>
		<comments>http://www.qualysite.co.jp/tech-blog/?p=5088#comments</comments>
		<pubDate>Tue, 24 Apr 2012 00:00:22 +0000</pubDate>
		<dc:creator>Kenji</dc:creator>
				<category><![CDATA[未分類]]></category>

		<guid isPermaLink="false">http://www.qualysite.co.jp/tech-blog/?p=5088</guid>
		<description><![CDATA[4月より多くの新入社員が我々の新たな仲間として加わりました。 近い将来、最前線でバリバリと活躍してくれるはずです。 今はそのための基礎造りとして、新入社員研修の真っ最中です。 弊社の新入社員研修は、大部分を内製で構築して &#8230; <a href="http://www.qualysite.co.jp/tech-blog/?p=5088">続きを読む <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>
4月より多くの新入社員が我々の新たな仲間として加わりました。<br />
近い将来、最前線でバリバリと活躍してくれるはずです。<br />
今はそのための基礎造りとして、新入社員研修の真っ最中です。<br />
<br />
弊社の新入社員研修は、大部分を内製で構築しています。<br />
（一部外部の助力もいただいています。）<br />
コースの概要は、<a href="http://www.qualysite.co.jp/recruiting/training.php">研修制度ページ</a>にあります。<br />
<span id="more-5088"></span><br />
新入社員研修を内製化して今年で6年目。ほぼ社歴と同じです。<br />
現場からのフィードバックをもらい、翌年には改善やチャレンジを重ね、<br />
ようやく今のスタイルが出来上がってきました。<br />
<br />
毎年見直しをかけているポイントは技術要素です。<br />
時々に応じて、現場でニーズの高いアーキテクチャをベースに変更を重ねています。<br />
来年にはJavaScriptがほぼ全てになるくらいの変更をするかもしれません。<br />
<br />
技術要素とは反対に毎年変更のないものは、<br />
研修を通して最も重要な制度としている「アドバイザー制度」です。<br />
新入社員一人に対して、2年目～4年目程度の先輩社員が一人つきます。<br />
メンターとも呼ばれる制度ですね。<br />
<br />
新入社員への育成効果はもちろんですが、アドバイザー自身の成長としても非常に効果があると感じています。<br />
普段アドバイザー自身もまだまだ得意ではないこと（スケジュール管理、ホウレンソウ etc）も、<br />
正論でアドバイスしなければならない。<br />
そして、言ったからにはやらなければならない。<br />
アドバイザーの行動もどんどんと自律的になり、成長スピードが加速します。<br />
<br />
あまり経験年数の多くない社員をアドバイザーとして起用しているのは、<br />
新入社員と共に成長をしてほしいからです。<br />
アドバイザー制度は、先輩からアドバイスを受けて後輩にアドバイスを返すまで。<br />
そのような制度としています。<br />
<br />
アドバイザーが新入社員の日報を指導している姿は毎年の光景ながらニヤニヤしてしまいます。<br />
なぜなら手元には、そのアドバイザーがかつて新入社員時代に書いたズタボロの日報があるからです。<br />
<br />
もしアドバイザーにアドバイスするならば「人の振り見て我が振り直せ」<br />
自戒の念を込めて。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.qualysite.co.jp/tech-blog/?feed=rss2&#038;p=5088</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Twitter-Mobileインストール手順</title>
		<link>http://www.qualysite.co.jp/tech-blog/?p=4835</link>
		<comments>http://www.qualysite.co.jp/tech-blog/?p=4835#comments</comments>
		<pubDate>Wed, 30 Nov 2011 22:09:09 +0000</pubDate>
		<dc:creator>入江隆平</dc:creator>
				<category><![CDATA[未分類]]></category>

		<guid isPermaLink="false">http://www.qualysite.co.jp/tech-blog/?p=4835</guid>
		<description><![CDATA[ご無沙汰していました。ようやく沖縄に帰ってきましたのでまたちょこちょこと更新していこうと思います。 帰沖後、最初の投稿としてTwitter-Mobileのインストール手順をご紹介します。サイズもさほど大きくないので、自分 &#8230; <a href="http://www.qualysite.co.jp/tech-blog/?p=4835">続きを読む <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>
ご無沙汰していました。ようやく沖縄に帰ってきましたのでまたちょこちょこと更新していこうと思います。<br />
帰沖後、最初の投稿としてTwitter-Mobileのインストール手順をご紹介します。サイズもさほど大きくないので、自分でTwitterクライアントをカスタマイズしたい方がベースとするのにちょうどよいと思います。<br />
<br />
Twitter-Mobileのダウンロードはこちらからどうぞ。<br />
<a href="https://github.com/rsepulveda2/Twitter-Mobile">https://github.com/rsepulveda2/Twitter-Mobile</a><br />
<br />
取りあえず一通りの機能を動かすところまで出来たので手順を記載します。<br />
<br />
目次：<br />
　Twitter-Mobileの概要<br />
　Twitter-Mobileをサーバに配置<br />
　APIキーを取得<br />
　APIキーの登録とタイムラインの表示<br />
<span id="more-4835"></span><br />
<h2>Twitter-Mobileの概要</h2>
Twitter-MobileはHTML+JavaScriptで作成されているTwitterクライアントです。ソースコードはOSSで公開されており、改変・再配布は自由に行うことが出来ます。またファイルもindex.htmlひとつだけで構成されているので、ソースコードを読むのもデバッグするのも比較的簡単に出来ます。<br />
<br />
Twitter-Mobileはタイムライン(TL)の取得や投稿に@Anywhereと言うAPIを使用しています。@AnywhereはTwitterの各種機能を簡単に扱うことが出来るAPIで、自分のWebサイトをTwitter Developersに登録しておくと使うことが出来ます(登録時に発行されるAPIキーが必要)。Twitter-Mobileも@Anywhereを使っているからこそ、こんなにシンプルな実装が実現出来ているのだと思います。<br />
<br />
<div align="center">
<a href="http://www.qualysite.co.jp/tech-blog/?attachment_id=4988" rel="attachment wp-att-4988"><img src="http://www.qualysite.co.jp/tech-blog/wp-content/uploads/2011/11/3ba375d6c244d23ece603e6e302776191.png" alt="" title="概要1" width="551" height="153" class="alignnone size-full wp-image-4988" /></a><br />
@Anywhereの概要図<br />
</div>
<br />
この図のように、@Anywhereを使うには事前にTwitter-Mobileを配置するサイトをTwitter Developersに登録しておく必要があります。私が実際に動かしてみたところ、以下の機能は動作確認が出来ました。<br />
　TL表示／投稿／検索／ダイレクトメッセージ／RT<br />
<br />
多少動作に怪しい点はありますが、これだけ動けば取っ掛かりとしては十分です。上図の通り、Twitter-Mobileはサーバ上で動かす必要があるためローカルに配置して動かすことは出来ません。(PhoneGapなどでは使えません)<br />
<br />
<br />
<h2>Twitter-Mobileをサーバに配置</h2>
@Anywhere APIを使用するために、Twitter-Mobileはサーバ上に配置しておく必要があります。<br />
サーバは何でも良いのですが、今回はTomcatを使用します。Macの人は標準で入っているWebサーバが手軽で良いと思います。<br />
<br />
Tomcatの設定に特に難しいところはないのでサラッといきます。今回はちょっと手抜きをしてTomcatに付いているexamples内にTwitter-Mobileを配置します。<br />
<br />
Tomcatはこちらからどうぞ。起動に必要な諸々の準備(Javaのインストール等)は省略します。<br />
<a href="http://tomcat.apache.org/">http://tomcat.apache.org/</a><br />
<br />
適当なところに展開して、examplesが動くところまで確認します。次にexamples配下のindex.htmlをTwitter-Mobileのindex.htmlで置き換えます。<br />
<br />
まずはここまででTwitter-Mobileにアクセスしてみます。※この時点ではエラーになります<br />
<br />
examplesプロジェクトのindex.htmlを表示するとConnect with Twitterボタンが表示されるのでクリックします。<br />
<a href="http://www.qualysite.co.jp/tech-blog/?attachment_id=4847" rel="attachment wp-att-4847"><img src="http://www.qualysite.co.jp/tech-blog/wp-content/uploads/2011/11/error11.png" alt="" title="error1"  class="alignnone size-medium wp-image-4847" /></a><br />
<br />
サブウィンドウが立ち上がり、Twitterアカウントへの接続確認を求められます。ここでは「コネクション」を選択し、接続を許可します。<br />
<a href="http://www.qualysite.co.jp/tech-blog/?attachment_id=4997" rel="attachment wp-att-4997"><img src="http://www.qualysite.co.jp/tech-blog/wp-content/uploads/2011/11/error22.png" alt="" title="error2" width="545" height="350" class="alignnone size-full wp-image-4997" /></a><br />
<br />
エラー画面が表示されます。<br />
<a href="http://www.qualysite.co.jp/tech-blog/?attachment_id=4860" rel="attachment wp-att-4860"><img src="http://www.qualysite.co.jp/tech-blog/wp-content/uploads/2011/11/error3.png" alt="" title="error3" width="495" height="171" class="alignnone size-full wp-image-4860" /></a><br />
<br />
このエラーは@Anywhereに送信したAPIキーに紐づくサーバとTwitter-Mobileが起動しているサーバが異なるために発生しています。<br />
<a href="http://www.qualysite.co.jp/tech-blog/?attachment_id=5009" rel="attachment wp-att-5009"><img src="http://www.qualysite.co.jp/tech-blog/wp-content/uploads/2011/11/5c6c77cfa128b5bad6e5c0b7c682dd0d2.png" alt="" title="errorの概要図" width="360" height="142" class="aligncenter size-full wp-image-5009" /></a><br />
<br />
ダウンロード直後のTwitter-Mobileにはサンプル用のAPIが設定されているため、これを修正する必要があります。<br />
<br />
<br />
<h2>APIキーを取得</h2>
上記のエラーを回避するために、正しいAPIキーを取得して送付するように変更します。twitter developersをブラウザで開き、自分のTwitterアカウントでログインします。<br />
<a href="https://dev.twitter.com/">https://dev.twitter.com/</a><br />
<br />
<a href="http://www.qualysite.co.jp/tech-blog/?attachment_id=5012" rel="attachment wp-att-5012"><img src="http://www.qualysite.co.jp/tech-blog/wp-content/uploads/2011/11/63d55ffe75fb4832739667043b1b30221.png" alt="" title="twitter_devに登録1" width="805" height="100" class="aligncenter size-full wp-image-5012" /></a><br />
twitter developersトップ画面へ遷移するので、Create an appを選択します。<br />
<a href="http://www.qualysite.co.jp/tech-blog/?attachment_id=4935" rel="attachment wp-att-4935"><img src="http://www.qualysite.co.jp/tech-blog/wp-content/uploads/2011/11/0a9e6b1c0a535468be41983f5d9f6163.png" alt="" title="twitter_devに登録2" width="330" height="202" class="alignnone size-full wp-image-4935" /></a><br />
<br />
<br />
アプリケーション情報を入力し、画面下部の「Create your twitter application」を選択します。ちなみに、アプリケーション名に「Twitter」の文字を含めるとエラーになるので、それ以外を指定します。<br />
<a href="http://www.qualysite.co.jp/tech-blog/?attachment_id=5022" rel="attachment wp-att-5022"><img src="http://www.qualysite.co.jp/tech-blog/wp-content/uploads/2011/11/4676a0d2cde785535ebc206fcde449523.png" alt="" title="twitter_devに登録3" width="778" height="393" class="alignnone size-full wp-image-5022" /></a><br />
<br />
<br />
画面上部に以下のアラートが表示されればアプリケーションの登録は成功です。<br />
<a href="http://www.qualysite.co.jp/tech-blog/?attachment_id=4946" rel="attachment wp-att-4946"><img src="http://www.qualysite.co.jp/tech-blog/wp-content/uploads/2011/11/2a9f9bfe7dc63c5c56bfef73dc3b6f46.png" alt="" title="twitter_devに登録4_success" width="368" height="40" class="alignnone size-full wp-image-4946" /></a><br />
<br />
<br />
OAuth settingsのConsumer keyをコピーします。この値をTwitter-Mobileに書き込みます。<br />
<a href="http://www.qualysite.co.jp/tech-blog/?attachment_id=5039" rel="attachment wp-att-5039"><img src="http://www.qualysite.co.jp/tech-blog/wp-content/uploads/2011/11/d47dfcd4f4c149c6c5134c867106121e1.png" alt="" title="twitter_devに登録5" width="662" height="281" class="alignnone size-full wp-image-5039" /></a><br />
<br />
<br />
<h2>APIキーの登録とタイムラインの表示</h2>
Twitter-Mobileをお好みのエディタで開いてください。headタグ内に@Anywhereを使用するための記述があり、APIキーとバージョンが指定されています。ここのAPIキーを先ほどコピーしたConsumer keyに書き換えます。<br />
<a href="http://www.qualysite.co.jp/tech-blog/?attachment_id=5073" rel="attachment wp-att-5073"><img src="http://www.qualysite.co.jp/tech-blog/wp-content/uploads/2011/12/864ddf357a2f503b27bd9470fba6e384.png" alt="" title="twitter_devに登録9" width="819" height="98" class="alignnone size-full wp-image-5073" /></a><br />
<br />
<br />
書き換えが終わったら画面を再表示してみましょう。今度は正常にログインして、自分のタイムラインが見れるはずです。(ここでは@twitterのTLを表示しています)<br />
<a href="http://www.qualysite.co.jp/tech-blog/?attachment_id=5066" rel="attachment wp-att-5066"><img src="http://www.qualysite.co.jp/tech-blog/wp-content/uploads/2011/12/d5bb5a84ae06a9d9d009a90e60f04da2.png" alt="" title="twitter_devに登録8_1" width="795" height="294" class="alignnone size-full wp-image-5066" /></a><br />
<br />
<br />
Twitter-Mobileのインストール手順は以上で完了です。ここではタイムライン表示のみご紹介しましたが、RTや投稿・検索など一通りの機能は使うことが出来ます。<br />
あとは自分の好みに合うように改造してみてはいかがでしょうか。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.qualysite.co.jp/tech-blog/?feed=rss2&#038;p=4835</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Haskell入門 Part.3-2 再帰実行</title>
		<link>http://www.qualysite.co.jp/tech-blog/?p=1805</link>
		<comments>http://www.qualysite.co.jp/tech-blog/?p=1805#comments</comments>
		<pubDate>Wed, 28 Sep 2011 23:00:07 +0000</pubDate>
		<dc:creator>入江隆平</dc:creator>
				<category><![CDATA[未分類]]></category>

		<guid isPermaLink="false">http://www.qualysite.co.jp/tech-blog/?p=1805</guid>
		<description><![CDATA[&#60;目次&#62; 再帰実行に関するサンプルプログラムです。 再帰実行はカリー化や関数定義にも多用されるのでぜひ使いこなせるようになっておきましょう。 リストの和を計算する リストの合計値を再帰実行を使って求めてみます &#8230; <a href="http://www.qualysite.co.jp/tech-blog/?p=1805">続きを読む <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>
<a href="http://www.qualysite.co.jp/tech-blog/?p=1480" target="_blank">&lt;目次&gt;</a><br />
<div></div>
再帰実行に関するサンプルプログラムです。<br />
再帰実行はカリー化や関数定義にも多用されるのでぜひ使いこなせるようになっておきましょう。<br />
<span id="more-1805"></span><br />
<br />
<h2>リストの和を計算する</h2>
リストの合計値を再帰実行を使って求めてみます。標準ライブラリにsum関数が既に存在するので、ここではtotalという名前で作っていきます。<br />
<br />
手続き型言語では以下のように書くのが普通だと思います。（javaを例にしています）<br />
<pre class="brush: java; title: ;">
int sum=0;
for (int i=1; i&lt;=10; i++) sum += i;
</pre>
<br />
（純粋な）関数型言語では一度値を設定した変数の値を変更することが出来ません。<br />
リスト内包表記と再帰実行を使って、リスト要素をひとつずつ取得・加算していきます。<br />
<pre class="brush: erlang; title: ;">
ghci

let total[] = 0; total(x:xs) = x + total xs
total[1..10]  --result 55

:q
</pre>
<br />
<div class="koramu">
(x : xs)は<a target="_blank" href="http://www.qualysite.co.jp/tech-blog/?p=2008">リスト内包表記</a>と言い、リストの最初の要素をxに、xを除いたリストをxsに割り当てることを意味します。<br />
例えばリストが1～10であれば、x=1 、 xs=2～10となります。<br />
</div>
<br />
関数totalを引数[1,2,3]で実行すると以下のように展開・計算されます。<br />
<pre class="brush: erlang; title: ;">
total[1,2,3] = 1 + total[2,3] = 1 + 2 + total[3] = 3 + 3 + total[] = 6 + 0 = 6
</pre>
<br />
このように関数型言語ではループ処理は再帰実行で実現します。手続き型言語ではあまり見かけない手法ですね。<br />
以下で再帰実行を使った関数の例をいくつかご紹介します。<br />
<br />
<br />
<h2>リストの積を計算する</h2>
リストの要素全ての積を求める関数prdを作ってみます。<br />
<pre class="brush: erlang; title: ;">
ghci

let prd[]=1; prd(x:xs)=x * prd xs
prd[1..4] -- result 24

:q
</pre>
<br />
<br />
<h2>クイックソート</h2>
Haskellの解説でよく見かけるクイックソートを実装します。<br />
<br />
sample.hs<br />
<pre class="brush: erlang; title: ;">
qsort[]=[]
qsort(x:xs) = qsort smaller++[x]++qsort larger
            where
              smaller = [a|a&lt;-xs,a&lt;=x]
              larger = [b|b&lt;-xs,b&gt;x]
</pre>
<br />
実行<br />
<pre class="brush: erlang; title: ;">
ghci

:l c:/haskell_sample/sample.hs
qsort[1,5,3,8,2] --result [1,2,3,5,8]

:q
</pre>
<br />
where句は関数内に直接埋め込むことも可能です。この場合はクイックソートが２行で実現出来ます。<br />
<pre class="brush: erlang; title: ;">
ghci

let qsort[]=[]; qsort(x:xs)=qsort[ps | ps&lt;-xs, ps&lt;x] ++ [x] ++ qsort[ps | ps&lt;-xs, ps&gt;=x]
qsort[1,5,3,8,2] --result [1,2,3,5,8]

:q
</pre>
</p>
]]></content:encoded>
			<wfw:commentRss>http://www.qualysite.co.jp/tech-blog/?feed=rss2&#038;p=1805</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Haskell入門 Part.3-1 関数の作成と合成</title>
		<link>http://www.qualysite.co.jp/tech-blog/?p=1793</link>
		<comments>http://www.qualysite.co.jp/tech-blog/?p=1793#comments</comments>
		<pubDate>Mon, 26 Sep 2011 22:58:20 +0000</pubDate>
		<dc:creator>入江隆平</dc:creator>
				<category><![CDATA[未分類]]></category>

		<guid isPermaLink="false">http://www.qualysite.co.jp/tech-blog/?p=1793</guid>
		<description><![CDATA[関数の作成と合成に関するサンプルプログラムです。 引数を２倍にして返す 引数を1つ受け取り２倍にして返す関数です。もっとも単純な関数のひとつですね。 ghci --関数宣言。左が引数、右が関数の本体 let double &#8230; <a href="http://www.qualysite.co.jp/tech-blog/?p=1793">続きを読む <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>
<a target="_blank" href="http://www.qualysite.co.jp/tech-blog/?p=1480"><目次></a><br />
<div></div>
関数の作成と合成に関するサンプルプログラムです。<br />
<span id="more-1793"></span><br />
<br />
<h2>引数を２倍にして返す</h2>
引数を1つ受け取り２倍にして返す関数です。もっとも単純な関数のひとつですね。<!--more--><br />
<pre class="brush: erlang; title: ;">
ghci

--関数宣言。左が引数、右が関数の本体
let double x = x + x

--実行
double 3  --result:6
</pre>
<br />
<br />
<h2>掛け算と足し算を続けて実行する（関数の合成）</h2>
&#8220;合成&#8221;とは関数の連続実行のことです。掛け算を行う関数multiを作成し、doubleと合成してみましょう。<br />
上で宣言したdoubleを使うので同じコンソールでそのまま実行します。<br />
<pre class="brush: erlang; title: ;">
--関数宣言
let multi x = x * x

--doubleとmultiを続けて評価
multi $ double 10  --result:400

--逆順に評価
double $ multi 10  --result:200
</pre>
<br />
関数は右から順に評価されることに注意してください。なお、(double 10)はポインタとしてmultiに渡されるため、評価は一度だけ行われます。<br />
<div class="koramu">
multi $ double 10 = (double 10) * (double 10) = 20 * 20 = 400<br />
</div>
<br />
呼び出す順序を逆にした２つ目では以下のように計算されます。こちらも(multi 10)は一度だけ評価されます。<br />
<div class="koramu">
double $ multi 10 = (multi 10) + (multi 10) = 100 + 100 = 200<br />
</div>
<br />
以下の書き方でも同じ結果（400）を得ることが出来ます。<br />
<pre class="brush: erlang; title: ;">
multi $ double $ 10
(.) multi double 10
(.) multi double(10)
multi(double(10))
</pre>
<br />
<br />
<h2>中置記法</h2>
中置記法とは関数の呼び出し方の一種です。バッククォート（`）で囲むことで引数の間に配置することが出来ます。<br />
中置記法の方が直感的に書けることもよくあるので覚えておきましょう。<br />
<pre class="brush: erlang; title: ;">
let foo x y = x + y
10 `foo` 20  -- result:30
</pre>
</p>
]]></content:encoded>
			<wfw:commentRss>http://www.qualysite.co.jp/tech-blog/?feed=rss2&#038;p=1793</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Haskell入門 Part.2-6 無限リストの遅延評価</title>
		<link>http://www.qualysite.co.jp/tech-blog/?p=2181</link>
		<comments>http://www.qualysite.co.jp/tech-blog/?p=2181#comments</comments>
		<pubDate>Wed, 21 Sep 2011 07:17:50 +0000</pubDate>
		<dc:creator>入江隆平</dc:creator>
				<category><![CDATA[未分類]]></category>

		<guid isPermaLink="false">http://www.qualysite.co.jp/tech-blog/?p=2181</guid>
		<description><![CDATA[無限配列の扱いを例に、Haskellの特徴の一つである遅延評価について記載します。 Haskellでは関数の評価は実際に必要となるまでは行わなれません（遅延評価）。手続き型言語に慣れていると理解しずらいところではあります &#8230; <a href="http://www.qualysite.co.jp/tech-blog/?p=2181">続きを読む <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>
<a target="_blank" href="http://www.qualysite.co.jp/tech-blog/?p=1480"><目次></a><br />
<div></div>
無限配列の扱いを例に、Haskellの特徴の一つである遅延評価について記載します。<br />
Haskellでは関数の評価は実際に必要となるまでは行わなれません（遅延評価）。手続き型言語に慣れていると理解しずらいところではありますが、このおかげで巨大なリストの扱いがとても楽になります。<br />
<br />
例として無限配列の一部だけを扱う関数を記載します。これは配列を宣言時に評価する手続き型言語では扱うことが出来ません。<span id="more-2181"></span><br />
<pre class="brush: erlang; title: ;">
ghci

-- 無限に続く等差数列
let sncd x = x:sncd (x+1)  -- :type=sncd :: Num a =&gt; a -&gt; [a]
-- 無限数列の先頭3要素を取得
take 3 (inc 10)  -- result:[10,11,12]

:q
</pre>
<br />
6行目は下記のように展開・評価されます。<br />
<pre class="brush: erlang; title: ;">
take 3 (sncd 10)
 = take 3 (10:sncd 11)           -- sncdを適用
 = 10:take 2 (sncd 11)           -- takeを適用
 = 10:take 2 (11:sncd 12)        -- sncdを適用
 = 10:11:take 1 (sncd 12)        -- takeを適用
 = 10:11:12:take 1 (13:sncd 13)  -- sncdを適用
 = 10:11:12:13:take 0 (sncd 13)  -- takeを適用
 = 10:11:12:13:[]                -- takeを適用。ここでsncdは不要になります
 = [10,11,12,13]
</pre>
<br />
sncdはtakeから要求されたときに必要な分だけ実行されます。このため無限数列であるsncdも扱うことが出来ます。<br />
<br />
このようにHaskell（に限らず遅延評価を行う言語）ではプログラムに記載した内容が上から順に実行されるとは限りません。このように実行順序が複雑であることと、StackTraceが取れないことにより、Haskellのデバッグは特に大変だと言われています。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.qualysite.co.jp/tech-blog/?feed=rss2&#038;p=2181</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Haskell入門 Part.2-5 リスト内包表記</title>
		<link>http://www.qualysite.co.jp/tech-blog/?p=2008</link>
		<comments>http://www.qualysite.co.jp/tech-blog/?p=2008#comments</comments>
		<pubDate>Wed, 14 Sep 2011 23:55:43 +0000</pubDate>
		<dc:creator>入江隆平</dc:creator>
				<category><![CDATA[未分類]]></category>

		<guid isPermaLink="false">http://www.qualysite.co.jp/tech-blog/?p=2008</guid>
		<description><![CDATA[リスト内包表記を使用するサンプルプログラムを記載します。 メモリの使用量は多いですが、リスト内包表記を活用するとリストの扱いがとても楽になります。 リスト内包表記と数式の比較 「ｘが1～5のときにx+3を満たす集合」を求 &#8230; <a href="http://www.qualysite.co.jp/tech-blog/?p=2008">続きを読む <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>
<a target="_blank" href="http://www.qualysite.co.jp/tech-blog/?p=1480"><目次></a><br />
<div></div>
リスト内包表記を使用するサンプルプログラムを記載します。<br />
メモリの使用量は多いですが、リスト内包表記を活用するとリストの扱いがとても楽になります。<br />
<span id="more-2008"></span><br />
<br />
<h2>リスト内包表記と数式の比較</h2>
「ｘが1～5のときにx+3を満たす集合」を求めたいとします。数学では以下のように表しますね。<br />
<pre class="brush: erlang; title: ;">
{x+3 | x∈{1,5}}  ※これはhaskellではありません
</pre>
<br />
これをHaskellで書くと以下のようになります。<br />
<pre class="brush: erlang; title: ;">
ghci
[x+3 | x&lt;-[1..5]]  -- result:[4,5,6,7,8]
:q
</pre>
<br />
ほとんど同じですね。このように数式と同じ書き方が出来るのもHaskellの魅力のひとつだと思います。<br />
同じように2変数の場合も見てみましょう。まずは数式です。<br />
<pre class="brush: erlang; title: ;">
{(x+3, y ^ 2) | x∈{2,3},  y∈{5,6}, y &gt; x^2}  ※これはhaskellではありません
</pre>
<br />
こちらがHaskellで書いた式です。<br />
<pre class="brush: erlang; title: ;">
ghci
[(x+3, y^2)|x&lt;-[2,3], y&lt;-[5,6], y&gt;x^2]  -- result:[(5,25),(5,36)]
:q
</pre>
<br />
こちらもほぼ同じ記法ですね。※式の左側で作られた値を絞り込む記法のことをガードと呼びます<br />
<br />
<br />
<h2>リストを要素に分解する</h2>
以下はリストを最初の要素と残りの要素リストに分解することを表します。<br />
<pre class="brush: erlang; title: ;">
f(x:xs)=x+f xs
</pre>
<br />
(x : xs)はリストの最初の要素をxに、xを除いたリストをxsに割り当てることを意味します。<br />
例えばリストが1～10であれば、x=1 、 xs=2～10となります。<br />
<br />
<br />
<h2>リストを逆順に並べ替える関数</h2>
<pre class="brush: erlang; title: ;">
let f[]=[]; f(x:xs)=f xs++[x]
f [1..10]  -- result:[10,9,8,7,6,5,4,3,2,1]
</pre>
<br />
<br />
<h2>リストのリストから要素であるリストを連結する関数</h2>
<pre class="brush: erlang; title: ;">
ghci
let ccat xss=[x|xs&lt;-xss, x&lt;-xs]  -- type=ccat :: [[t]] -&gt; [t]
ccat [[1..3],[4..6]]             -- result:[1,2,3,4,5,6]
:q
</pre>
<br />
これは以下のように展開・実行されます。<br />
<pre class="brush: erlang; title: ;">
ccat [[1..3],[4..6]]
 = [x|xs&lt;-[1..3], x&lt;-xs] ++ {評価待ち}
 = [1,2,3] ++ [x|xs&lt;-[4..6], x&lt;-xs]
 = [1,2,3] ++ [4,5,6]
 = [1,2,3,4,5,6]
</pre>
<br />
<br />
<h2>タプルを要素に持つリストから、タプルの先頭要素の二乗を要素とするリストを作る関数</h2>
<pre class="brush: erlang; title: ;">
ghci
let firsts ps=[x^2|(x,_)&lt;-ps]  -- type=firsts :: Num t =&gt; [(t, t1)] -&gt; [t]
firsts [(1,3),(2,5),(10,30)]   -- result:[1,4,100]
:q
</pre>
<br />
&#8220;二乗&#8221;の処理を外すとNum制約はなくなります。こちらは以下のように展開・実行されます。<br />
<pre class="brush: erlang; title: ;">
firsts [(1,3),(2,5),(10,30)]
 = [x^2|(x,_)&lt;-(1,3)] ++ {評価待ち}
 = [1^2] ++ {評価待ち}
 = [1] ++ [x^2|(x,_)&lt;-(2,5)] ++ {評価待ち}
 = [1] ++ [2^2] ++ {評価待ち}
 = [1,4] ++ [x^2|(x,_)&lt;-(10,30)]
 = [1,4,100]
</pre>
<br />
<br />
<h2>指定順序を変えた場合の挙動</h2>
左側が優先されるため、同じ値でも指定順によって結果が変わります<br />
<pre class="brush: erlang; title: ;">
[(x,y)|x&lt;-[1..3], y&lt;-[4,5]]  -- result:[(1,4),(1,5),(2,4),(2,5),(3,4),(3,5)]
[(x,y)|y&lt;-[4,5], x&lt;-[1..3]]  -- result:[(1,4),(2,4),(3,4),(1,5),(2,5),(3,5)]
</pre>
<br />
<br />
<h2>前方の生成器で宣言した変数を使用する</h2>
後方の生成器では前方の生成器が使う変数を使用出来ます。<br />
これを使うと重複を除いたリストの組み合わせを生成出来ます。<br />
<pre class="brush: erlang; title: ;">
[(x,y)|x&lt;-[1..3], y&lt;-[x..3]]  -- result:[(1,1),(1,2),(1,3),(2,2),(2,3),(3,3)]
</pre>
</p>
]]></content:encoded>
			<wfw:commentRss>http://www.qualysite.co.jp/tech-blog/?feed=rss2&#038;p=2008</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Haskell入門 Part.2-4 リストの宣言と操作</title>
		<link>http://www.qualysite.co.jp/tech-blog/?p=1947</link>
		<comments>http://www.qualysite.co.jp/tech-blog/?p=1947#comments</comments>
		<pubDate>Mon, 12 Sep 2011 23:32:07 +0000</pubDate>
		<dc:creator>入江隆平</dc:creator>
				<category><![CDATA[未分類]]></category>

		<guid isPermaLink="false">http://www.qualysite.co.jp/tech-blog/?p=1947</guid>
		<description><![CDATA[リストの宣言・操作に関するサンプルプログラムです。 リストの宣言 浮動小数点は誤差が出るようなのでご注意ください。コンソールから使う場合は型を明記することで誤差を回避出来ます。 例：(0.2::Float) + (0.1 &#8230; <a href="http://www.qualysite.co.jp/tech-blog/?p=1947">続きを読む <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>
<a target="_blank" href="http://www.qualysite.co.jp/tech-blog/?p=1480"><目次></a><br />
<div></div>
リストの宣言・操作に関するサンプルプログラムです。<br />
<span id="more-1947"></span><br />
<h2>リストの宣言</h2>
浮動小数点は誤差が出るようなのでご注意ください。コンソールから使う場合は型を明記することで誤差を回避出来ます。<br />
例：(0.2::Float) + (0.1::Float)<br />
<pre class="brush: erlang; title: ;">
ghci

[1,3,2,7,10]    -- result:[1,3,2,7,10]
1:3:2:7:10:[]   -- 上と同じ結果を返します。上はこちらの糖衣構文になります

-- 等差数列の宣言
[1..10]         -- 公差  1. result:[1,2,3,4,5,6,7,8,9,10]
[10,13..20]     -- 公差  3. result:[10,13,16,19]
[10,7.. -10]    -- 公差 -3. result:[10,7,4,1,-2,-5,-8]
['a'..'z']      -- result:&quot;abcdefghijklmnopqrstuvwxyz&quot;
['A'..'Z']      -- result:&quot;ABCDEFGHIJKLMNOPQRSTUVWXYZ&quot;
['a'..'Z']      -- 小文字から大文字では取得出来ません result:&quot;&quot;
['A'..'z']      -- 大文字から小文字は取得出来ますが、途中に記号が入ります result:&quot;ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz&quot;
['a','c'..'z']  -- 公差=2 result:&quot;acegikmoqsuwy&quot;

-- 浮動小数点のincrementは誤差が出るようです
[0.1,0.2..0.3]  -- result:[0.1,0.2,0.30000000000000004]

-- 型を明記しても同じです
let ar::[Float];ar=[1.0,1.1..1.3]
ar  -- result:[1.0,1.1,1.2,1.3000001]

let ar::[Double];ar=[1.0,1.1..1.2]
ar  -- result:[1.0,1.1,1.2000000000000002]

-- タプルのincrementは出来ません
-- [(1,1)..(1,3)]  -- result:No instance for (Enum (t0, t1))

:q
</pre>
<br />
<h2>無限リストの宣言</h2>
コメントアウトを外すと止まらないのでご注意ください。遅延評価されるため無限数列も引数として使用出来ます。<br />
無限数列がどのように評価されているかについては<a target="_blank" href="http://www.qualysite.co.jp/tech-blog/?p=2181">無限リストの遅延評価</a>を参照ください。<br />
<pre class="brush: erlang; title: ;">
ghci

-- 止まりません
-- [1..]
-- [1,100..]
-- ['a','c'..]

-- 必要な分だけ評価されるため、無限配列でも引数として使用出来ます
take 10 [0,100..]  -- result:[0,100,200,300,400,500,600,700,800,900]

:q
</pre>
試しに、下記を３０分ほど動かして見ましたが落ちることもなく延々と動いていました。<br />
<pre class="brush: plain; title: ;">
[1,100000000000000000000000000000000000000000000000000000000000000..]

-- 止める直前に出ていた値
116993599999999999999999999999999999999999999999999999999999998830065
</pre>
<br />
<h2>リストの操作</h2>
よく使うリスト操作です。<br />
<pre class="brush: erlang; title: ;">
ghci

head [1..10]    -- 先頭取得    result:1
tail [1..5]     -- 先頭以外取得 result:[2,3,4,5]
last [1..10]    -- 最後尾取得   result:10
init [1..5]     -- 末尾以外取得 result:[1,2,3,4]

take 3 [1..10]  -- 先頭から指定数の要素を取得 result:[1,2,3]
drop 7 [1..10]  -- 指定数以降の要素を取得 　  result:[8,9,10]
1:[2,3,4]       -- リストへ追加             result:[1,2,3,4]

-- 条件を満たす要素の前でリストを分割し２つ組みのタプルを返す
break (&gt;5) [1..10]  -- result:([1,2,3,4,5],[6,7,8,9,10])

:q
</pre>
</p>
]]></content:encoded>
			<wfw:commentRss>http://www.qualysite.co.jp/tech-blog/?feed=rss2&#038;p=1947</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Haskell入門 Part.2-3 デフォルトの型</title>
		<link>http://www.qualysite.co.jp/tech-blog/?p=2102</link>
		<comments>http://www.qualysite.co.jp/tech-blog/?p=2102#comments</comments>
		<pubDate>Wed, 07 Sep 2011 23:40:17 +0000</pubDate>
		<dc:creator>入江隆平</dc:creator>
				<category><![CDATA[未分類]]></category>

		<guid isPermaLink="false">http://www.qualysite.co.jp/tech-blog/?p=2102</guid>
		<description><![CDATA[ghc起動時に読み込まれるPreludeモジュールで定義されている型のうち、よく使われるものを解説します。 型はデータの集まりにつけた識別子で、先頭大文字の英数字で表します。 よく使用される型 下記はPreludeで宣言 &#8230; <a href="http://www.qualysite.co.jp/tech-blog/?p=2102">続きを読む <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>
<a target="_blank" href="http://www.qualysite.co.jp/tech-blog/?p=1480"><目次></a><br />
<div></div>
ghc起動時に読み込まれるPreludeモジュールで定義されている型のうち、よく使われるものを解説します。<br />
型はデータの集まりにつけた識別子で、先頭大文字の英数字で表します。<br />
<span id="more-2102"></span><br />
<h2>よく使用される型</h2>
下記はPreludeで宣言されている型です。<br />
<pre class="brush: erlang; title: ;">
-- Bool： 真理値
let v=True  -- type=v :: Bool

-- Char： 文字。文字列は[Char]です
let v='a'    -- type=v :: Char
let v=&quot;abc&quot;  -- type=v :: [Char]

-- Int： 固定精度整数。範囲⇒-2^31～2^31-1
let v=1::Int        -- type=v :: Int
let v=(-2)^31::Int  -- result:-2147483648
let v=2^31-1::Int   -- result: 2147483647

-- 範囲を超えると正負が反転します
let v=2^31::Int       -- result:-2147483648
let v=(-2)^31-1::Int  -- result: 2147483647

-- Integer： 多倍長整数。整数全体を表します。メモリが許す限り、制限はありません
-- 私の環境ではこれを超えるとかなりレスポンスが悪くなりました（30万1031桁）
let v=2^(10^6)::Integer

-- Float： 浮動小数点数。小数点以下9桁まで保持するようです
let v=0.123456791::Float  -- result:0.12345679  最後の1は保持されません

-- Rational： 有理数
let v=1/2::Rational  -- result:1 % 2
</pre>
<br />
<br />
<h2>リスト型</h2>
0個以上の任意の型を並べたものをリストと呼び、[T]で表します。（0個でもリストになります）<br />
要素は同じ型である必要があります。要素の追加が可能です。<br />
よく使うリスト操作については<a target="_blank" href="http://www.qualysite.co.jp/tech-blog/?p=1947&#038;preview=true">リストの宣言と操作</a>を参照してください。<br />
<pre class="brush: erlang; title: ;">
let v=[1,2,3]  -- type=v :: [Integer]

-- 型を明示的に指定することも出来ます
let v=[1::Int,2::Int,3::Int]  -- type=v :: [Int]
</pre>
<br />
<br />
<h2>タプル型</h2>
2個以上の任意の型の組み合わせをタプルと呼び、(T1,T2,・・・)で表します。<br />
要素の型は異なっていても良いです。組み合わせの個数は変更できません。<br />
<pre class="brush: erlang; title: ;">
let v=(1::Int,'a')  -- type=v :: (Int, Char)
</pre>
<br />
<br />
<h2>関数型</h2>
型T1を引数にとり型T2を返却するものを関数型と呼び、T1->T2と表します。<br />
<pre class="brush: erlang; title: ;">
:{
let { f::Int -&gt; Int;
      f x = 1 + x
    }
:}
-- type=f :: Int -&gt; Int

--  セミコロンを使うと一行で書くことも出来ます
let f::Int -&gt; Int; f x = 1 + x       -- type = f :: Int -&gt; Int

-- 変数に制約を付ける場合は括弧で括ります
let f :: (Num a) =&gt; a -&gt; a; f x = x  -- type = f :: Num a =&gt; a -&gt; a

-- 型推論が働くので型宣言は省くことも出来ます。この場合は数値の型Numになります
let f x = 1 + x                      -- type = f :: Num a =&gt; a -&gt; a
</pre></p>
]]></content:encoded>
			<wfw:commentRss>http://www.qualysite.co.jp/tech-blog/?feed=rss2&#038;p=2102</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Haskell入門 Part.2-2 型・型クラス・インスタンス</title>
		<link>http://www.qualysite.co.jp/tech-blog/?p=3541</link>
		<comments>http://www.qualysite.co.jp/tech-blog/?p=3541#comments</comments>
		<pubDate>Mon, 05 Sep 2011 23:08:51 +0000</pubDate>
		<dc:creator>入江隆平</dc:creator>
				<category><![CDATA[未分類]]></category>

		<guid isPermaLink="false">http://www.qualysite.co.jp/tech-blog/?p=3541</guid>
		<description><![CDATA[型・型クラス・インスタンスについて例文を交えながら解説します。単語は同じでもOOPとは意味合いが異なるので、全く新しい単語と思って接した方が理解しやすいかもしれません。 私はイメージが湧くようになるまで結構時間がかかりま &#8230; <a href="http://www.qualysite.co.jp/tech-blog/?p=3541">続きを読む <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>
<a target="_blank" href="http://www.qualysite.co.jp/tech-blog/?p=1480"><目次></a><br />
<div></div>
型・型クラス・インスタンスについて例文を交えながら解説します。単語は同じでもOOPとは意味合いが異なるので、全く新しい単語と思って接した方が理解しやすいかもしれません。<br />
私はイメージが湧くようになるまで結構時間がかかりました。<br />
<br />
型・型クラス・インスタンスの関係は以下のような思っておくと、比較的分かりやすいです。<br />
・型は任意の値の集まり<br />
・型クラスは任意の型の振る舞いの集まり<br />
・インスタンスは型クラスの制約を全て満たす型<br />
<br />
具体的にイメージ出来るように例文を見ていきましょう。<br />
今回はプログラムが少し長くなるので、モジュールとして読み込んでいます。<br />
<span id="more-3541"></span><br />
<h2>型</h2>
型は任意の値を集めて名前（識別子）を付けたものです。集合と同じですね。<br />
例えば整数の集まりにはIntと言う名前がついています。&#8221;デフォルトの型&#8221;と呼ばれているものはPreludeモジュールに含まれている型です。<br />
<br />
型は自分で新しく宣言することも出来ます。Manga1~3の集まりとしてComic型を宣言してみます。<br />
<br />
sample1.hs<br />
<pre class="brush: erlang; title: ;">
data Comic = Manga1 | Manga2 | Manga3
</pre>
<br />
実行<br />
<pre class="brush: erlang; title: ;">
ghci
:l sample1.hs
-- Manga2が型Comicとして認識されていることを確認
:t Manga2  -- type = Manga2 :: Comic
:q
</pre>
<br />
ここでのManga1〜3は文字列ではなくComic型です。Comicと言う名前の付いた集合の要素になります。<br />
<br />
<br />
<h2>型クラス</h2>
型クラスは型を集めて、その振る舞いを定義したもの・・と言うと分かりやすいでしょうか。<br />
JavaのInterfaceやAbstractクラスに近いです。<br />
以下のように書きます。<br />
<pre class="brush: plain; light: true; title: ;">
class 型クラス 型 where
　条件式
</pre>
<br />
例としてタイヤ数・ハンドル位置・車体の色を返却する機能を持った型クラスCarを宣言します。<br />
このようなOOP風の書き方が適切なのかは微妙ですがイメージはしやすいと思います。<br />
<br />
sample1.hs<br />
<pre class="brush: erlang; title: ;">
-- ハンドル位置と色の型を宣言
data HundlePosition = HLeft | HRight
data Color = Red | Blue | Green | Black

class Car a where
  -- 型Carが満たす振る舞いを定義
  getWheelCount :: a -&gt; Int
  getHundlePosition :: a -&gt; HundlePosition
  getBodyColor :: a -&gt; Color

  -- デフォルトの振る舞いを宣言。インスタンスで変更も出来ます
  getWheelCount n = 4
  getHundlePosition n = HRight

  -- getBodyColorはデフォルトの振る舞いを定義していないため
  -- インスタンスで必ず実装する必要があります
</pre>
<br />
実行<br />
<pre class="brush: erlang; title: ;">
ghci
:l sample1.hs  -- エラーが発生しないことを確認

-- getWheelCountは型クラスCarを受け取ってIntを返す
:t getWheelCount  -- type = getWheelCount :: Car a =&gt; a -&gt; Int
:q
</pre>
タイヤの数とハンドル位置はデフォルト値を定義しています。車体の色は様々ですので、ここでは定義せずにインスタンス定義に任せます。<br />
<br />
<br />
<h2>インスタンス</h2>
型クラスの制約を満たすように定義した型をインスタンスと呼びます。Javaではクラスの実体と言う意味で”インスタンス”と言いますが、Haskellでは”型クラスの制約を満たす型”のことを指します。<br />
<br />
上で宣言した型クラスCarのインスタンス（＝制約を満たす型）を作ってみましょう。<br />
<br />
sample1.hs<br />
<pre class="brush: erlang; title: ;">
-- 型Cera1を宣言。derivingはおまじないと思ってください
data Cera1 = Cera2 deriving Show
-- 型Cera1を型クラスCarのインスタンスとして宣言する
instance Car Cera1 where 
  getBodyColor Cera2 = Black

-- Carを引数に取る関数を宣言する
smp3 :: (Car a)=&gt; a -&gt; Int
smp3 a=3
</pre>
<br />
実行<br />
<pre class="brush: erlang; title: ;">
ghci
:l sample1.hs  -- エラーが発生しないことを確認
-- Carのインスタンス、Cera2でsmp3を実行する
:t smp3 Cera2  -- type = smp3 Cera2 :: Color
:q
</pre>
<br />
インスタンスとなれるのはdataで宣言された型のみです。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.qualysite.co.jp/tech-blog/?feed=rss2&#038;p=3541</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>窓が割れることをどうするか？</title>
		<link>http://www.qualysite.co.jp/tech-blog/?p=4223</link>
		<comments>http://www.qualysite.co.jp/tech-blog/?p=4223#comments</comments>
		<pubDate>Mon, 25 Jul 2011 01:00:47 +0000</pubDate>
		<dc:creator>Kenji</dc:creator>
				<category><![CDATA[未分類]]></category>

		<guid isPermaLink="false">http://www.qualysite.co.jp/tech-blog/?p=4223</guid>
		<description><![CDATA[割れ窓理論という犯罪学上の理論があります。 詳しくはWikipediaに解説がありますのでこちらへ。 反証もあるようですので、学説の真偽については専門家に譲るとしても、 理論への納得感は大きいものがあります。 「小のルー &#8230; <a href="http://www.qualysite.co.jp/tech-blog/?p=4223">続きを読む <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>
割れ窓理論という犯罪学上の理論があります。<br />
詳しくは<a href="http://ja.wikipedia.org/wiki/%E5%89%B2%E3%82%8C%E7%AA%93%E7%90%86%E8%AB%96">Wikipediaに解説がありますのでこちら</a>へ。<br />
<br />
反証もあるようですので、学説の真偽については専門家に譲るとしても、<br />
理論への納得感は大きいものがあります。<br />
「小のルール違反を放置することにより大のルール違反を生み出す」<br />
開発現場にこそ強く当てはまらないでしょうか？<br />
<br />
<span id="more-4223"></span><br />
<br />
開発現場の中には様々な規約・方針が存在します。<br />
大きいものでは、<br />
・法律<br />
・社則<br />
・セキュリティルール<br />
etc<br />
<br />
プロジェクト個別では、<br />
・プロジェクトの運営ルール（ミーティングや報告方法など多数）<br />
・ドキュメント規約<br />
・コーディング規約<br />
・テスト方針<br />
etc<br />
<br />
有無を言わさず違反ができない仕組みや、自動でチェックする仕組みがベストですが、<br />
ちょっとした決まりごと（ここでは御作法と呼びます）は人手に頼ることは多くあります。<br />
モラルと言い換えても良いかもれません。<br />
<br />
プロジェクトの中で、よくあるケースはこうです。<br />
<br />
<strong>御作法を決める</strong> <em>～光り輝く未来～</em><br />
理想のプロジェクト像を夢みて、あるいはこれまでのプロジェクトの失敗を教訓として。<br />
「ああしよう」「こうしよう」と大小様々な御作法を決めていきます。<br />
<br />
<strong>御作法違反を許容する</strong> <em>～初めての例外～</em><br />
緊急の対応などどうしても例外を&#8221;一時的&#8221;に許容しなければならない事態が、往々にして起こります。<br />
<br />
<strong>御作法違反が増加する</strong> <em>～侵略する例外～</em><br />
～初めての例外～を&#8221;一時的&#8221;なものとしておかず、<br />
ついつい放置してしまうことにより、類似の違反が増殖していきます。<br />
この時点で例外は例外ではなくなり、この御作法は死に体となります。<br />
<br />
<strong>死に体の御作法が増加する</strong> <em>～御作法の失墜～</em><br />
一つの御作法の死は、他の御作法の死へ波及していきます。<br />
守らなくてもよい御作法があるのに、なぜ別の御作法は守らなくてはいけないのか？<br />
その論に反論するのは難しいものです。<br />
<br />
消火のポイントは、～初めての例外～　前後にあります。<br />
対応方法は複数あります。<br />
<br />
<span style="color: #0000ff;"><strong><span style="color: #ff0000;">窓は割らせない</span> = 意地でも守る</strong></span><br />
一番わかりやすい方法です。理想的すぎて「これができれば苦労しない」方法ではあります。<br />
<br />
<span style="color: #0000ff;"><strong><span style="color: #ff0000;">窓は割れても即座に修理する</span> = &#8220;一時的&#8221;後に即座に修正する</strong></span><br />
御作法違反をあくまで&#8221;一時的&#8221;とすることです。<br />
&#8220;一時的&#8221;な期間が短ければ短いほど、他の御作法へのマイナスの波及効果は少なくなります。<br />
<br />
<span style="color: #0000ff;"><strong><span style="color: #ff0000;">これは窓ではありません</span> = 御作法を変える・やめる</strong></span><br />
なにがしか問題が出るということは御作法自体にも問題があるとも言えます。<br />
逆説的ではありますが、大きな判断として御作法自体を&#8221;変える・やめる&#8221;ということもアリです。<br />
ただし、&#8221;変える・やめる&#8221;を周知・徹底することが必要です。<br />
ある御作法を止めはしたが、決して無法地帯にはしない、という強いメッセージは重要です。<br />
<br />
現実的には例外の大小、御作法の種別により、これらを組み合わせていくと思います。<br />
有耶無耶にしてほったらかしの状態はもっとも避けなければなりません。<br />
目をつぶっても窓は割れます。<br />
<br />
いずれにせよ重要なのは、例外が発生した場合の対応スピードと強い意志なのではないでしょうか。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.qualysite.co.jp/tech-blog/?feed=rss2&#038;p=4223</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

