<?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>Creative Gear</title>
	<atom:link href="http://www.creativegear.jp/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.creativegear.jp</link>
	<description>とあるWebエンジニアの活動記録</description>
	<lastBuildDate>Wed, 11 May 2011 17:02:24 +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>[Java]Byte型からInt型への変換を本気で考える</title>
		<link>http://www.creativegear.jp/2011/05/09/java_byte_to_int/</link>
		<comments>http://www.creativegear.jp/2011/05/09/java_byte_to_int/#comments</comments>
		<pubDate>Mon, 09 May 2011 14:50:00 +0000</pubDate>
		<dc:creator>たけし</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[キャスト変換]]></category>
		<category><![CDATA[言語仕様]]></category>

		<guid isPermaLink="false">http://www.creativegear.jp/?p=264</guid>
		<description><![CDATA[JavaでByte型変数をInt型にキャストする際には、気を付けなければならないことがあります。 前回のエントリーで、Byte型配列を16進数文字列に変換するメソッドを作りましたが、その時にByte型をInt型へ変換する [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.creativegear.jp/wp-content/uploads/2011/05/why.jpg"><img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 10px; padding-left: 0px; padding-right: 0px; display: inline; float: left; border-top: 0px; border-right: 0px; padding-top: 0px" title="why" border="0" alt="why" align="left" src="http://www.creativegear.jp/wp-content/uploads/2011/05/why_thumb.jpg" width="204" height="204"></a>JavaでByte型変数をInt型にキャストする際には、気を付けなければならないことがあります。</p>
<p>前回のエントリーで、Byte型配列を16進数文字列に変換するメソッドを作りましたが、その時にByte型をInt型へ変換するには、ただ単にキャスト変換するのではなく、「0xFF」でANDビット演算しなければ値がおかしくなるという事を書きました。</p>
<p><br clear="ALL">
<p>どういう事かというと…</p>
<p>[java]<br />
byte a = (byte)0xC8 //10進数では200のはず<br />
int b = (int)a;<br />
Sytem.out.println(b);<br />
[/java]</p>
<p>この実行結果は、「200」ではなく、「-56」が表示されます。</p>
<p>それを、</p>
<p>[java]<br />
byte a = (byte)0xC8 //10進数では200のはず<br />
int b = a &#038; 0xff;<br />
Sytem.out.println(b);<br />
[/java]</p>
<p>とすると、実行結果は「200」になってくれます。
<p>しかし、なぜそのままInt型にキャスト変換するだけじゃダメなのか？　なぜ0xFFでAND演算をしたら、期待した数値になるのか？そのあたりが僕の中でもやもやしてました。</p>
<p>「なんだかよく分からないけど、Byte型で作った16進数をInt型に変換する時には、0xFFでAND演算するオマジナイをしなきゃならない」</p>
<p>初級プログラマな僕は、そんな感じで全然理解出来てなかったんですよね。　でも、このオマジナイが僕にとってはブラックボックスで気持ち悪い；　自分が理解出来てないものを、プログラムの中で扱うのなんて落ち着かないったらありゃしません。</p>
<p>そこで、なぜByte型をInt型へそのままキャストしてはいけないのか。なぜ0xFFでAND演算をするとうまく変換されるのか。　そのオマジナイの中身を調べてみることにしました。</p>
<p>&nbsp;</p>
<p><span id="more-264"></span><br />
<h2>Java言語仕様を調べる</h2>
<p>とりあえずは、Java言語でキャスト変換する時に何が起こっているのか？　それを調べるために、Javaの言語仕様を調べることにしました。</p>
<p>最新のJava言語仕様は、Oracle(Sun)のHPに掲載されています。</p>
<p>(公式) The Java Language Specification<br /><a title="http://java.sun.com/docs/books/jls/index.html" href="http://java.sun.com/docs/books/jls/index.html" target="_blank">http://java.sun.com/docs/books/jls/index.html</a></p>
<p>ただし、英語・・・English。。。ジャパニーズな自分には、ちょっとしんどい。。。　読めるには読めるでしょうけど、辞書引きながらですごい時間かかってしまうでしょうね。</p>
<p>…ので、日本語訳が欲しいところ。でもOracleのHPには、日本語訳は無いんですよ。JDKは日本語訳を用意してくれてるのに。ちくしょぅ。</p>
<p>※いや、でもエンジニアならば英語は書いたり話したりは出来なくても、すらすら読めるようになるべきだとは思います。一次情報はほとんどが英語ですから。　むしろこれからのエンジニアは、英語もスキルの一つとして積極的に身につけて行くべきでしょうし。</p>
<p>&nbsp;</p>
<p><a href="http://www.amazon.co.jp/gp/product/4894717158/ref=as_li_ss_tl?ie=UTF8&amp;tag=creativegear-22&amp;linkCode=as2&amp;camp=247&amp;creative=7399&amp;creativeASIN=4894717158" target="_blank"><img style="background-image: none; border-right-width: 0px; margin: 2px 10px 5px 15px; padding-left: 0px; padding-right: 0px; display: inline; float: left; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="JLS" border="0" alt="JLS" align="left" src="http://www.creativegear.jp/wp-content/uploads/2011/05/JLS.jpg" width="234" height="295"></a></p>
<p>あとは、日本語訳された書籍ならば出版されているようです。</p>
<p><a href="http://www.amazon.co.jp/gp/product/4894717158/ref=as_li_ss_tl?ie=UTF8&amp;tag=creativegear-22&amp;linkCode=as2&amp;camp=247&amp;creative=7399&amp;creativeASIN=4894717158" target="_blank">Java言語仕様 第3版 (The Java Series)</a></p>
<p>ただ、値も張りますし、何より今すぐ読みたい。なうです。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>出来ればネットで親切な人が、日本語訳して公開しててくれたら嬉しいんだけどなー。。。　と探してみたらありました。　第2版の日本語訳なので、最新版(第3版)ではありませんが、ありがたやありがたや(^▽^)</p>
<p><a title="http://www.y-adagio.com/public/standards/tr_javalang2/jTOC.doc.html" href="http://www.y-adagio.com/public/standards/tr_javalang2/jTOC.doc.html" target="_blank">http://www.y-adagio.com/public/standards/tr_javalang2/jTOC.doc.html</a></p>
<p>&nbsp;</p>
<p>というわけで、このJava言語仕様・第2版の日本語訳で、まずはキャスト変換について調べてみることにしました。</p>
<p>&nbsp;</p>
<h2>キャスト変換で何が起こるのか？</h2>
<p>まずは、16進数値を入れたByte型変数をInt型へキャストした時に、期待した数値にならなかった理由を知りたい。　なので、キャスト変換をした時に何が起こっているのか？それを調べてみます。</p>
<p>Java言語仕様の目次を見ていくと、キャスト変換の項目がありました。以下、転載です。</p>
<blockquote><h4>5.5 キャスト変換</h4>
<p>キャスト変換 (casting conversion) は，キャスト演算子(15.16)のオペランドに適用する。このときオペランド式の型は，キャスト演算子で明示的に名前を与えた型に変換しなければならない。キャストの文脈では，恒等変換(5.1.1)，プリミティブ型の拡大変換(5.1.2)，プリミティブ型の縮小変換(5.1.3)，参照型の拡大変換(5.1.4)，又は，参照型の縮小変換(5.1.5)の利用を可能とする。従って，キャスト変換は，代入変換又は，メソッド呼出し変換よりも包括的とする。つまり，キャストは文字列変換以外の任意の変換が許される。</p>
<p>値集合変換(5.1.8)は，型変換の後に適用される。</p>
<p>コンパイル時に不正と証明されるキャストもある。このようなキャストは，コンパイル時エラーを発生させる。</p>
<p><font color="#ff0000" size="3">プリミティブ型の値は，型が同じならば恒等変換によって，そうでないときにはプリミティブ型の拡大変換又はプリミティブ型の縮小変換によって，他のプリミティブ型にキャストできる。</font></p>
<p>&nbsp;</p>
</blockquote>
<p>重要なのは、赤字の部分です。</p>
<p>Byte型はプリミティブ型なので、キャストには恒等変換、プリミティブ型の拡大変換、プリミティブ型の縮小変換の3パターンの変換が発生し得るみたいですね。</p>
<p>じゃあ、今回のようにByte型からInt型へキャスト変換する場合には、この3パターンの内のどれが適用されるんでしょう？</p>
<p>この3パターンの変換の詳細を、１つずつ見て行ってみたいと思います。まずは恒等変換から。。。(5.1.1の章を参照)</p>
<blockquote><h4>5.1.1 恒等変換</h4>
<p><font color="#ff0000">ある型からそれと同じ型への変換</font>は，いかなる型に対しても許される。</p>
<p>これは，二つの実用的な効果をもつ。第一に，すべての式は変換を受ける，と規則を簡潔に言明できる。第二に，明確化のために，プログラムが冗長なキャスト演算子を含むことを許可する。</p>
<p>型booleanを含む唯一許される変換は，booleanからbooleanへの恒等変換とする。</font></p>
<p>&nbsp;</p>
</blockquote>
<p>これは同じ型への変換のキャスト変換の場合に適用されるみたいですね。つまりは、Byte型からByte型へ変換する場合には、この恒等変換が適用されるみたいです。(あんま意味なさそうですけど。)</p>
<p>今回はByte型からInt型への変換なので、ちょっと違いますね。じゃあ、次はプリミティブ型の拡大変換を見てみます。</p>
<blockquote><h4>5.1.2 プリミティブ型の拡大変換</h4>
<p>プリミティブ型における次の19個の変換をプリミティブ型の拡大変換(widening primitive conversion) と呼ぶ。</p>
<p>&nbsp;&nbsp;&nbsp; ・<font color="#ff0000">byteからshort，int，long，float，又はdoubleへの変換。</font><br />&nbsp;&nbsp;&nbsp; ・shortからint，long，float，又はdoubleへの変換。<br />&nbsp;&nbsp;&nbsp; ・charからint，long，float，又はdoubleへの変換。<br />&nbsp;&nbsp;&nbsp; ・intからlong，float，又はdoubleへの変換。<br />&nbsp;&nbsp;&nbsp; ・longからfloat又はdoubleへの変換。<br />&nbsp;&nbsp;&nbsp; ・floatからdoubleへの変換。</p>
<p>プリミティブ型の拡大変換は，数値の大きさについての情報を失わない。実際，整数の型から他の整数の型への拡大変換及び型floatから型doubleへの拡大変換は，いかなる情報も失うことはない。つまり，数値を正確に保存する。 同じく，strictfp式での型floatから型doubleへの拡大変換も，数値を正確に保存する。しかし，strictfpでない変換は，変換後の数値の大きさについての情報を失うかもしれない。</p>
<p>int若しくはlongの値からfloatへの変換，又はlongの値からdoubleへの変換は，精度の損失(loss of precision)，すなわち値の最小位の数ビットを失うことがある。この場合，浮動小数点の結果値は，IEEE 754直近へのまるめモード(4.2.4)を利用して，正しく丸めた整数値とする。</p>
<p><font color="#ff0000" size="3">符号付き整数値の整数型 T への拡大変換は，単により長い桁を埋めるために整数値の2の補数表現について符号拡張をするだけとする。</font>文字から整数型 T への拡大変換は，より長い桁を埋めるために文字値の表現をゼロ拡張する。</p>
<p>精度の損失が発生する可能性があるという事実にもかかわらず，プリミティブ型間の拡大変換は，実行時例外(11.)を生じない。</p>
<p>&nbsp;</p>
</blockquote>
<p>最初の赤字部分を読んでの通り、Byte型からInt型への変換は、プリミティブ型の拡大変換に含まれるようです。　基本的には、サイズの小さいプリミティブ型から、サイズの大きいプリミティブ型への変換は、拡大変換になるようですね。</p>
<p>ちなみに、プリミティブ型の縮小変換も調べてみましたが、拡大変換とは逆に、サイズの小さい型への変換時に行われる処理のようですので、今回は関係ありませんでした。</p>
<p>そして、後半の赤字部分に注目すると、Byte型をInt型へただ単にキャストしちゃいけない理由が分かります。</p>
<p>&nbsp;</p>
<h2>16進数値のByte型からInt型へキャストしてはイケない理由</h2>
<p>まず、最初に認識しておかなければならないことは、「Byte型では-128～127までの整数しか表現できない」という事です。</p>
<p>つまり、「0xC8」という16進数表記は、普通に考えると10進数に変換すると「200」になるわけですが、Byte型ではこれが200になりません。-56という値になります。</p>
<p>これは何故かというと、「0xC8」を8ビットの2進数で表すと「11001000」となります。　JavaのByte型は符号付きの整数型ですので、先頭の1桁目が1だった場合、その数をマイナスの数として認識します。</p>
<p>マイナスの数。。。２の補数表現で考えた場合、「11001000」という数値は、「-56」というマイナスの10進数になります。</p>
<table border="1" cellspacing="0" cellpadding="2" width="395">
<tbody>
<tr>
<td valign="top" width="86">型</td>
<td valign="top" width="150">16進数</td>
<td valign="top" width="95">2進数</td>
<td valign="top" width="62">10進数</td>
</tr>
<tr>
<td valign="top" width="86">Byte型<br />(8ビット)</td>
<td valign="top" width="150">0xC8　<br />(10進数で200を想定)</td>
<td valign="top" width="96">11001000</td>
<td valign="top" width="63">-56</td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<p>ここで、先ほどの…</p>
<blockquote><p><font color="#ff0000" size="3">符号付き整数値の整数型 T への拡大変換は，単により長い桁を埋めるために整数値の2の補数表現について符号拡張をするだけとする。</font></p>
</blockquote>
<p>ということを踏まえると、Byte型(8ビット)からInt型(32ビット)に拡張する時に、足りない部分の24ビット分は、プラスマイナスの符号を変えないように埋めるということになります。</p>
<p>つまり、もともとの先頭1ビットが「0」だったらば、足りない部分は「0」で埋める。もともとの先頭１ビットが「1」だったらば、足りない部分は「1」で埋めるということになります。</p>
<p>そうすると、Byte型からInt型へキャスト変換をすると、こんな感じになります。</p>
<table border="1" cellspacing="0" cellpadding="2" width="610">
<tbody>
<tr>
<td valign="top" width="66">型</td>
<td valign="top" width="157">16進数</td>
<td valign="top" width="331">2進数</td>
<td valign="top" width="54">10進数</td>
</tr>
<tr>
<td valign="top" width="66">Byte型<br />(変換前)</td>
<td valign="top" width="157">0xC8　<br />(10進数で200を想定)</td>
<td valign="top" width="331">11001000</td>
<td valign="top" width="55">-56</td>
</tr>
<tr>
<td valign="top" width="66">Int型<br />(変換後)</td>
<td valign="top" width="157">0xFFFFFFFFFFFFFFC8</td>
<td valign="top" width="331">11111111 11111111 11111111 11001000</td>
<td valign="top" width="56">-56</td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<p>10進数で考えると何も変わっていないですが、符号なし16進数で考えるとだいぶ変わってしまっていますね。本当はInt型へ変換された後の16進数も「0xC8」のままになって、10進数で「200」となって欲しかったところなのですが。。。</p>
<p>Byte型では元々16進数で考えた数値を、10進数で表現できない以上、Int型へキャストしたとしても、期待通りの10進数数値にはならないのですね；</p>
<p>&nbsp;</p>
<h2>なぜビット演算(AND)すると大丈夫なのか？</h2>
<p>では、なぜこれが「0xFF」でAND演算をすると、期待通りの値になるのでしょうか？</p>
<p>まずは、AND演算について調べてみたいと思います。</p>
<blockquote><h4>15.22.1 整数値ビット単位演算子 &amp;，^及び|</h4>
<p><font color="#ff0000">演算子 &amp;，^ 又は | の両オペランドがプリミティブ整数型であるとき，最初にオペランドに二項数値昇格(5.6.2)を実行する。</font> ビット単位の演算子式の型は，そのオペランドの昇格された型とする。</p>
<p>&nbsp;</p>
</blockquote>
<p>オペランドというのは、演算対象のことです。　例えば、「1+2」という式があったとしたら、「+」はオペレーター(演算子)で、「1」と「2」がオペランドです。</p>
<p>Byte型はプリミティブ整数型ですし、0xFFも16進数表記のInt型として扱われますので、最初に各オペランドに、二項数昇格なるものが実行されるようです。</p>
<p>ちなみに、16進表記の数値がInt型として扱われるということは、以下に記載されていました。</p>
<blockquote><h4>3.10.1 整数リテラル</h4>
<p>整数型及びその値の詳細は，4.2.1を参照のこと。</p>
<p>整数リテラル (integer literal)は，10進数(基数 10)，<font color="#ff0000">16進数(基数 16)</font>，又は8進数(基数 8)で表現できる。</p>
<p>&nbsp;&nbsp; IntegerLiteral:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DecimalIntegerLiteral<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font color="#ff0000">HexIntegerLiteral</font><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OctalIntegerLiteral</p>
<p>&nbsp;&nbsp;&nbsp; DecimalIntegerLiteral:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DecimalNumeral IntegerTypeSuffixopt</p>
<p>&nbsp;&nbsp;&nbsp; HexIntegerLiteral:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HexNumeral IntegerTypeSuffixopt</p>
<p>&nbsp;&nbsp;&nbsp; OctalIntegerLiteral:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OctalNumeral IntegerTypeSuffixopt</p>
<p>&nbsp;&nbsp;&nbsp; IntegerTypeSuffix: one of<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; l L</p>
</blockquote>
<p>&nbsp;</p>
<p>じゃあ、二項数値昇格ってなんぞや？　と思いましたが、こんなことのようです。</p>
<blockquote><h4>5.6.2　二項数値昇格</h4>
<p>ある演算子が 二項数値昇格（binary numeric promotion） をオペランドの対に適用するときは，個々のオペランドが，数値型の値を表さなければならないが，必要に応じてオベランドを変換するための拡大変換(5.1.2)を用いて，順番に次の規則を適用する。</p>
<p>・ 一方のオペランドが型 double ならば，他方を double に変換する。<br />・ そうでないときには，一方のオペランドが型 float ならば，他方を float に変換する。<br />・ そうでないときには，一方のオペランドが型 long ならば，他方を long に変換する。<br />・ <font color="#ff0000">そうでないときには，両オペランドを型 int に変換する。</font></p>
<p>二項数値昇格は，特定の演算子のオペランドに関して実行する。</p>
<p>・ 乗法系の演算子，*，/ 及び % (15.16)。<br />・ 数値型加算演算子+ 及び減算演算子 -(15.17.2)。<br />・ 数値比較演算子 &lt;，&lt;=，&gt; 及び &gt;= (15.19.1)。<br />・ 数値等価演算子 == 及び != (15.20.1)。<br />・ <font color="#ff0000">整数のビット単位の演算子 &amp;，^ 及び | (15.21.1)。</font><br />・ 特定の場合における条件演算子 ? : (15.24)。</p>
</blockquote>
<p>どうやら、各オペランドのサイズを合わせるために、大きい方のオペランドの型に合わせて変換することのようですね。</p>
<p>今回は、Byte型とInt型のAND演算なので、両方のオペランドがInt型になります。　つまり、Byte型変数がInt型へ変更されるようです。</p>
<p>先ほどの、ただ単にキャスト変換した時と結果は同じになります。</p>
<table border="1" cellspacing="0" cellpadding="2" width="610">
<tbody>
<tr>
<td valign="top" width="62">型</td>
<td valign="top" width="164">16進数</td>
<td valign="top" width="328">2進数</td>
<td valign="top" width="54">10進数</td>
</tr>
<tr>
<td valign="top" width="62">Byte型<br />(変換前)</td>
<td valign="top" width="164">0xC8　<br />(10進数で200を想定)</td>
<td valign="top" width="328">11001000</td>
<td valign="top" width="55">-56</td>
</tr>
<tr>
<td valign="top" width="62">Int型<br />(変換後)</td>
<td valign="top" width="164">0xFFFFFFFFFFFFFFC8</td>
<td valign="top" width="328">11111111 11111111 11111111 11001000</td>
<td valign="top" width="56">-56</td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<p>上記のようにInt型へ変換された値と、「0xFF」をAND演算します。　すると、以下のようになります。</p>
<table border="1" cellspacing="0" cellpadding="2" width="611">
<tbody>
<tr>
<td valign="top" width="74">&nbsp;</td>
<td valign="top" width="145">16進数</td>
<td valign="top" width="336">2進数</td>
<td valign="top" width="54">10進数</td>
</tr>
<tr>
<td valign="top" width="74">Byte型からInt型へ変換された値</td>
<td valign="top" width="145">0xC8　<br />(10進数で200を想定)</td>
<td valign="top" width="336">11111111 11111111 11111111 11001000</td>
<td valign="top" width="55">-56</td>
</tr>
<tr>
<td valign="top" width="74">0xFF</td>
<td valign="top" width="145">0xFF</td>
<td valign="top" width="336">00000000 00000000 00000000 11111111</td>
<td valign="top" width="56">255</td>
</tr>
<tr>
<td valign="top" width="74">AND演算の結果</td>
<td valign="top" width="145">0xC8</td>
<td valign="top" width="336">00000000 00000000 00000000 11001000</td>
<td valign="top" width="57">200</td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<p>Int型に変換した時に、拡大された最初の3バイト(24bit)が全て0になってくれれば、2進数でのマイナス表記にはならないので、正常に「0xC8」（200）になってくれます。</p>
<p>その状況を作りだすために、最後の8ビットだけ1に設定した値「0xFF」でAND演算をするのですね。</p>
<p>※AND演算ではお互いに1の部分だけが抜き出されることになるので。</p>
<p>&nbsp;</p>
<p>ここまでの操作で、やっと16進数表記のByte型を、0xFFとAND演算することによって、期待通りの数値でInt型へ変換する。ということが出来たわけです。</p>
<p>※ちなみにC言語であれば、符号なしのInt型…unsigned int型がありますので、それにキャストするだけで期待通りの値に変換されるはずです。</p>
<p>&nbsp;</p>
<h2>終わりに</h2>
<p>いやー、長かったけどスッキリしました！　これでようやく、訳の分からないオマジナイではなく、ちゃんとした仕組みを理解したうえで使うことが出来ます！</p>
<p>実際には、概念やルール的な部分が多かったので、その辺りをちゃんと理解している人であれば当たり前の事なんでしょうけど、まだまだ初級プログラマな自分には勉強になりました。</p>
<p>やっぱりエンジニアとしては、正体不明な部分はなるべく無くしておきたいんですからね。　理解しないまま使うというのは極力避けたい。</p>
<p>ライブラリとかは、中身の具体的な処理を知らなくても、それが何をしているのかさえ理解していればそのまま使って良いと思いますが、やっぱりこうした基礎的な言語レベルの部分では、詳細を理解しておかないと、応用が利かなくなりそうで怖いです。</p>
<p>まだまだJava言語で理解出来ていないところも多いので、なるべく調べてアウトプットしておければと思います。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.creativegear.jp/2011/05/09/java_byte_to_int/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[Java]MD5、DESで暗号化する</title>
		<link>http://www.creativegear.jp/2011/05/08/java_encryption/</link>
		<comments>http://www.creativegear.jp/2011/05/08/java_encryption/#comments</comments>
		<pubDate>Sun, 08 May 2011 04:56:48 +0000</pubDate>
		<dc:creator>たけし</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[ビット演算]]></category>
		<category><![CDATA[暗号化]]></category>

		<guid isPermaLink="false">http://www.creativegear.jp/?p=279</guid>
		<description><![CDATA[Javaで文字列の暗号化をする処理が必要になったので、ライブラリクラスを作ってみました。 とりあえず、非可逆的な暗号化方式としてMD5を。可逆的な暗号化方式としてDESを選択。（※可逆的な暗号化というのは、暗号化された文 [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.creativegear.jp/wp-content/uploads/2011/05/encryption.jpg"><img style="background-image: none; margin: 10px; padding-left: 0px; padding-right: 0px; display: inline; float: left; padding-top: 0px; border-width: 0px;" title="Yellow computer folder with key. Isolated 3d image" src="http://www.creativegear.jp/wp-content/uploads/2011/05/encryption_thumb.jpg" border="0" alt="Yellow computer folder with key. Isolated 3d image" width="200" height="200" align="left" /></a>Javaで文字列の暗号化をする処理が必要になったので、ライブラリクラスを作ってみました。</p>
<p>とりあえず、非可逆的な暗号化方式としてMD5を。可逆的な暗号化方式としてDESを選択。（※可逆的な暗号化というのは、暗号化された文字列を元の文字列に復号化できる方式。非可逆的な暗号化というのは、もう元には復号化できない方式です。）</p>
<p>引数として渡された文字列を、MD5やDESで暗号化してバイナリ配列を作り、それを16進数表記の文字列として返す。というメソッドを実装しました。</p>
<p>&nbsp;&nbsp;</p>
<p>Javaには標準で暗号化のための便利なAPIが用意されているんですね。作るのも簡単です。<br />
&nbsp;</p>
<p><span id="more-279"></span><br />
また、作成にあたっては<a href="http://java.sun.com/javase/ja/6/docs/ja/api/" target="_blank">JavaのAPIリファレンス</a>の他、この辺りのHPも参考にさせて頂きました。</p>
<ul>
<li>TechScore <a href="http://www.techscore.com/tech/J2SE/JCE/2.html" target="_blank">http://www.techscore.com/tech/J2SE/JCE/2.html</a></li>
<li>トラスト・ソフトウェア・システム　<a title="http://www.trustss.co.jp/Java/JEncrypt100.html" href="http://www.trustss.co.jp/Java/JEncrypt100.html" target="_blank">http://www.trustss.co.jp/Java/JEncrypt100.html</a></li>
</ul>
<p><span style="font-size: small;"> </span></p>
<p>まずは、MD5に暗号化するためのクラス。。。</p>
<p>[MD5.java]</p>
<p>[java]<br />
package jp.creativegear.util.encryption;</p>
<p>import java.security.MessageDigest;<br />
import java.security.NoSuchAlgorithmException;</p>
<p>/**<br />
 * MD5で暗号化するクラス<br />
 *<br />
 * @author CreativeGear<br />
 */<br />
public class MD5 {</p>
<p>	/**<br />
	 * MD5で文字列を暗号化し、暗号化されたバイナリを16進数表記の文字列に変換した値を取得する<br />
	 *<br />
	 * @param str<br />
	 *            暗号化対象の文字列<br />
	 * @return 暗号化した結果を16進数表記に変換した文字列<br />
	 */<br />
	public static String digestMd5(String str) throws NoSuchAlgorithmException {<br />
		if (str == null || str.length() == 0) {<br />
			throw new IllegalArgumentException(&#8220;文字列がNull、または空です。&#8221;);<br />
		}</p>
<p>		// MD5で暗号化したByte型配列を取得する<br />
		MessageDigest md5 = MessageDigest.getInstance(&#8220;MD5&#8243;);<br />
		md5.update(str.getBytes());<br />
		byte[] enclyptedHash = md5.digest();</p>
<p>		// 暗号化されたByte型配列を、16進数表記文字列に変換する<br />
		return BinaryHexConverter.bytesToHexString(enclyptedHash);<br />
	}<br />
}<br />
[/java]</p>
<p>&nbsp;</p>
<p>インスタンス変数を持つ必要が無かったので、メソッドはStaticsにしています。このクラスはインスタンスを作成せずに利用できます。</p>
<p>JavaAPIでの暗号化は、基本的にはByte型配列を読み込んで、それを暗号化したByte型配列を返します。ただ、そのままでは扱いづらいですので、Byte型配列の中身を16進数表記に変換した文字列を作成して、それを返却するようにしています。</p>
<p>Byte型配列を文字列に変換する方法としては、他にもBase64でエンコードする方法等がありますが、今回は16進数表記文字列に変換する方法を採りました。</p>
<p>&nbsp;</p>
<p>Byte型配列を16進数表記文字列に変換するためのクラスは、別途用意してあります。</p>
<p>[BinaryHexConverter.java]<br />
[java]<br />
package jp.creativegear.util.encryption;</p>
<p>/**<br />
 * Byte型配列⇔16進数表記String型への変換<br />
 * @author CreativeGear<br />
 */<br />
public class BinaryHexConverter {</p>
<p>	/**<br />
	 * Byte型配列から16進数表記文字列へ変換する<br />
	 * @param fromByte 変換対象Byte型配列<br />
	 * @return 16進数表記に変換後の文字列<br />
	 */<br />
	public static String bytesToHexString(byte[] fromByte) {</p>
<p>		StringBuilder hexStrBuilder = new StringBuilder();<br />
		for (int i = 0; i < fromByte.length; i++) {</p>
<p>			// 16進数表記で1桁数値だった場合、2桁目を0で埋める<br />
			if ((fromByte[i] &#038; 0xff) < 0x10) {<br />
				hexStrBuilder.append("0");<br />
			}<br />
			hexStrBuilder.append(Integer.toHexString(0xff &#038; fromByte[i]));<br />
		}</p>
<p>		return hexStrBuilder.toString();<br />
	}</p>
<p>	/**<br />
	 * 16進数表記文字列からByte型配列へ変換する<br />
	 * @param fromHexStr 変換対象の16進数表記文字列<br />
	 * @return 変換後のByte型配列<br />
	 */<br />
	public static byte[] HexStringToBytes(String fromHexStr) {</p>
<p>		//16進数表記では2文字で1バイトを表現するため、<br />
		//Byte型配列に変換する際には、配列の長さは1/2で良い<br />
		byte[] toByte = new byte[fromHexStr.length() / 2];</p>
<p>		//16進数表記文字列を、2文字ずつByte型へ変換していく<br />
		for (int i = 0; i < toByte.length; i++) {<br />
			toByte[i] = (byte) Integer.parseInt(fromHexStr.substring(i * 2, (i + 1) * 2), 16);<br />
		}<br />
		return toByte;<br />
	}<br />
}<br />
[/java]<br />
&nbsp;</p>
<p>次に、DESで暗号化＆復号化を行うクラスも作りました。</p>
<p>[DES.java]<br />
[java]<br />
package jp.creativegear.util.encryption;</p>
<p>import java.security.InvalidKeyException;<br />
import java.security.NoSuchAlgorithmException;</p>
<p>import javax.crypto.BadPaddingException;<br />
import javax.crypto.Cipher;<br />
import javax.crypto.IllegalBlockSizeException;<br />
import javax.crypto.KeyGenerator;<br />
import javax.crypto.NoSuchPaddingException;<br />
import javax.crypto.SecretKey;</p>
<p>public class DES {</p>
<p>	private SecretKey secretKey;</p>
<p>	public String encryptDes(String clearText) throws NoSuchAlgorithmException, NoSuchPaddingException,<br />
			InvalidKeyException, IllegalBlockSizeException, BadPaddingException {</p>
<p>		KeyGenerator keyGen = KeyGenerator.getInstance("DES");<br />
		secretKey = keyGen.generateKey();<br />
		keyGen.init(56);</p>
<p>		byte[] clearTextByte = clearText.getBytes();</p>
<p>		Cipher cipher = Cipher.getInstance("DES");<br />
		cipher.init(Cipher.ENCRYPT_MODE, secretKey);</p>
<p>		byte[] encryptedBytes = cipher.doFinal(clearTextByte);<br />
		String encryptedHexString = BinaryHexConverter.bytesToHexString(encryptedBytes);</p>
<p>		return encryptedHexString;<br />
	}</p>
<p>	public  String decryptDes(String encryptedHexText) throws NoSuchAlgorithmException, NoSuchPaddingException,<br />
			InvalidKeyException, IllegalBlockSizeException, BadPaddingException {</p>
<p>		Cipher cipher = Cipher.getInstance("DES");<br />
		cipher.init(Cipher.DECRYPT_MODE, secretKey);</p>
<p>		byte[] decryptedByte = cipher.doFinal(BinaryHexConverter.HexStringToBytes(encryptedHexText));<br />
		String decryptedText = new String(decryptedByte);</p>
<p>		return decryptedText;<br />
	}</p>
<p>}<br />
[/java]</p>
<p>&nbsp;</p>
<p>こちらは秘密鍵を暗号化時と復号化時で共有するため、それをフィールドに定義しています。ですので、こちらはインスタンスを作成して利用する必要があります。</p>
<p>&nbsp;</p>
<p>実際の使い方はこのような感じです。</p>
<p>[test.java]<br />
[java]<br />
package jp.creativegear.util.encryption;</p>
<p>public class test {</p>
<p>	public static void main(String[] args) {</p>
<p>		String str = "Hello!";<br />
		try {<br />
			System.out.println("元の文字列: " + str);<br />
			System.out.println("MD5で暗号化: " + MD5.digestMd5(str));</p>
<p>			DES des = new DES();<br />
			String encryptedStr = des.encryptDes(str);<br />
			System.out.println("DESで暗号化: " + encryptedStr);<br />
			System.out.println("DESで復号化: " + des.decryptDes(encryptedStr));<br />
		} catch (Exception e) {<br />
		}<br />
	}<br />
}<br />
[/java]<br />
&nbsp;<br />
実行結果は、このような感じになりました。</p>
<blockquote><p>元の文字列: Hello!<br />
MD5で暗号化: 952d2c56d0485958336747bcdd98590d<br />
DESで暗号化: ec04d3dd171e3af9<br />
DESで復号化: Hello!</p></blockquote>
<p>&nbsp;</p>
<p>このtest.javaは、その他のクラスと同じパッケージ内に作成してありますのでimport宣言は必要ありませんが、もしパッケージ外から利用する時には、import宣言が必要です。</p>
<p>&nbsp;</p>
<p>標準で暗号化のためのAPIがあるなんて、Javaは便利ですね。C言語には無かったよなぁ。例外も丸投げですし、ライブラリ用としてはあんま使えないでしょうけど、暗号化処理の勉強になりました。</p>
<p>車輪の再発明も甚だしいですしね。作った後で分かったんですが、Byte型配列と16進数表記への変換するクラスなんかは、Apache CommonsのCodecパッケージにありましたし。</p>
<p>ただ、このBinaryHexConverter.javaで、Byte型配列からInt型数値への変換処理を入れているんですが、ここで結構ハマりました。</p>
<p>JavaではByte型からInt型への変換が、ただキャスト変換するだけではうまく行かないようなんです。　ソースコードを見て頂けると分かるんですが、Byte型をInt型へ変換する際には、「0xFF」とビットAND演算しないとならないようです。</p>
<p>つまりどういう事なのかというと、<br />
[java]<br />
byte a = (byte)0xC8 //10進数では200のはず<br />
int b = (int)a;<br />
Sytem.out.println(b);<br />
[/java]<br />
の実行結果は、「200」になりません。「-56」という値になります。</p>
<p>それを、<br />
[java]<br />
byte a = (byte)0xC8 //10進数では200のはず<br />
int b = a &#038; 0xff;<br />
Sytem.out.println(b);<br />
[/java]</p>
<p>とすると、実行結果は「200」になってくれます。</p>
<p>このあたりはネットで調べて初めて知ったのですが、最初はただ単にキャスト変換してうまく行かず、悩みまくってしまいました。</p>
<p>とりあえず「0xFF」でビット演算すればOKという事は分かったのですが、なぜそれをするとうまく行くのか？それが分からず、気になってしまい。いろいろと調べてみました。</p>
<p>調べた内容は長くなってしまうので、次回のエントリーでお話ししたいと思います。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.creativegear.jp/2011/05/08/java_encryption/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>WireSharkの裏技 〜 コマンドラインで実行できる「TShark」 〜</title>
		<link>http://www.creativegear.jp/2011/04/16/tshark/</link>
		<comments>http://www.creativegear.jp/2011/04/16/tshark/#comments</comments>
		<pubDate>Sat, 16 Apr 2011 12:46:21 +0000</pubDate>
		<dc:creator>たけし</dc:creator>
				<category><![CDATA[WireShark]]></category>
		<category><![CDATA[パケットスニファ]]></category>

		<guid isPermaLink="false">http://www.creativegear.jp/?p=215</guid>
		<description><![CDATA[オープンソースのパケットキャプチャソフト「WireShark」。。。ネットワーク関係のお仕事をされている方は使った事のある方も多いかと思います。※「Ethereal」が開発終了し、WireSharkへと引き継がれていった [...]]]></description>
			<content:encoded><![CDATA[<p><img style="float: left;" title="WireShark.png" src="http://www.creativegear.jp/wp-content/uploads/2011/04/WireShark1.png" border="0" alt="WireShark" width="200" height="192" />オープンソースのパケットキャプチャソフト「WireShark」。。。ネットワーク関係のお仕事をされている方は使った事のある方も多いかと思います。<br />※「Ethereal」が開発終了し、WireSharkへと引き継がれていったものです。</p>
<p>WireSharkを使うと、ネットワークを流れるパケットをキャプチャリングすることが出来るわけですが、基本的にはGUIプログラム。お手軽にGUI操作でキャプチャが出来るのも良いんですが、TcpDumpのようにコマンドラインで実行したいという時もありますよね。</p>
<p>※バッチファイル化したり、シェルでごにょごにょしたい時とか。あとは、GUIだと膨大なパケットを表示させる場合に、かなりのメモリを消費しますので、プログラムごと落ちてしまうこともありますし。</p>
<p>「あ〜、WireShark。。。コマンドラインで実行出来たら便利なのに。。。」と思っている方に朗報。実はコマンドライン版のWireSharkが存在するのです。</p>
<p>それが「TShark」</p>
<p>今回は、そのTSharkの使い方をご紹介します。</p>
<p> </p>
<p><span id="more-215"></span><br />
<h2>TSharkとは</h2>
<p>TSharkとは、CUI版のWireSharkです。</p>
<p>WireSharkとは別のプログラムですが、機能的にはWireSharkと同等です。実際のパケット解析処理部分のソースコードも共用されています。</p>
<p>ただし、WireSharkで使えていた幾つかの機能が、TSharkでは使えなくなっています。特に解析系の処理は、GUIでグラフィカルに結果を出力するようなものは、利用出来ないようです。</p>
<p>それでもほとんどの機能がWireSharkと同様に利用出来ますし、あまりディープな使い方をしない限りは、特に問題は無いでしょう。</p>
<p> </p>
<h2>TSharkのインストール</h2>
<p>実はWireSharkをインストールした際に、同じフォルダにTSharkもインストールされています。</p>
<blockquote>
<p>Windowsであれば、WireSharkのインストール先フォルダに「tshark.exe」という実行ファイルがあるはずです。(通常はProgram FilesのWiresharkフォルダ配下)</p>
</blockquote>
<blockquote>
<p>MacOSの場合には、Wireshark.appのパッケージ内に実行ファイルが入っています。(通常は、　/Applications/Wireshark.app/Contents/Resources/bin/の配下)</p>
</blockquote>
<p> </p>
<p>まだWireSharkをインストールしていない場合は、こちらからインストールしましょう。</p>
<blockquote><p><a href="http://www.wireshark.org/download.html">http://www.wireshark.org/download.html</a></p></blockquote>
<p> </p>
<p>ちなみに、WireSharkをインストールすると、TShark以外にも実はいくつかのプログラムがインストールされます。ログファイルを結合するMergeCap、ログファイルの内容を書き換えることが出来るEditCapなどがありますが、それはまた別の機会にでも。。。</p>
<p> </p>
<h2>TSharkを使うための準備</h2>
<p>コマンドプロンプトやターミナルからTSharkを実行出来るようにするためには、まずは環境変数(PATH)に、前述のTSharkインストール先フォルダを追加します。(※環境変数への追加の仕方は省略。)</p>
<p>PATHを通した後に、以下のコマンドをたたいて、バージョン番号が表示されればTSharkが使える状態になっています。</p>
<blockquote><p>tshark -v</p></blockquote>
<p>実際の使い方は、基本的にはヘルプメニューに全てパラメータが記載されていますので、それを読めば使えるようにはなっています。</p>
<blockquote><p>tshark -h</p></blockquote>
<p>ただまあ英語ですし、パラメータだけ見せられても「さぁ、使いましょ！」というわけにも行かないと思いますので、実際にいくつか実際にキャプチャを行う例を、以下に記載して行きたいと思います。</p>
<p> </p>
<h2>とりあえずパケットキャプチャしてみる</h2>
<p>とりあえず、何もフィルタをかけずに、パケットをキャプチャしてファイルに保存する。というのをやってみます。</p>
<p>まずは、どのNIC(ネットワークインターフェースカード)(つまりはLANポート)をキャプチャするのかを指定します。ちなみに通常は無線LANはキャプチャ出来ませんので、有線LANのポートを選択します。</p>
<p>では、以下のコマンドを実行してみてください。</p>
<blockquote><p>tshark -D</p></blockquote>
<p>すると、そのPCに備わっているNICの一覧が表示されます。どのNICをキャプチャしたいのかを決めて、そのNICの番号を覚えておきます。</p>
<p>次に、キャプチャを行います。</p>
<blockquote><p>tshark -i [NIC番号]</p></blockquote>
<p>[NIC番号]は、先ほど決めたNICの番号(整数)に置き換えて入力してください。これでとりあえずキャプチャは開始されます。</p>
<p>キャプチャを停止するための専用のコマンドはありませんので、停止したい場合にはCtrl+Cで停止させてください。</p>
<p> </p>
<h2>キャプチャした結果をログファイルに保存する</h2>
<p>上記のコマンドだけだとキャプチャはされるものの、その結果がログファイルに保存されません。ログファイルに保存するためには、そのためのオプションを付けてあげます。</p>
<blockquote><p>tshark -i [NIC番号] -w [ログファイル名]</p></blockquote>
<p>[ログファイル名]は、拡張子まで入力します。特に拡張子にこだわりがなければ、pcapやcap形式で良いでしょう。hogehoge.pcapのようなファイル名にすればOKです。</p>
<p>これでパケットキャプチャが開始され、キャプチャしたデータが逐一ログファイルに書き込まれて行きます。</p>
<p> </p>
<h2>ログファイルを読み込ませる</h2>
<p>また、このようにネットワークのパケットをキャプチャするのではなく、既存のログファイルをtsharkで読み込み、内容を表示させたい場合には、以下のようなコマンドを実行します。</p>
<blockquote><p>tshark -r [ログファイル名]</p></blockquote>
<p>-r オプションで、読み込むログファイルを指定します。こうすると、ログファイルの内容が一気にずらーっと表示されます。</p>
<p>ある程度の大きさのファイルだと読みづらいですので、ここからgrep等で処理したりという利用方法が必要になるかもですが。</p>
<p> </p>
<p> </p>
<p>あまりニーズがあるプログラムでは無いですが、WireSharkを良く利用するネットワーク関係のエンジニアさんは、TSharkを使うと便利なこともあるかも知れません。</p>
<p>ヘルプを見ると、まだまだ色んなオプションがありますので、色々と試してみると良いと思います。</p>
<p> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.creativegear.jp/2011/04/16/tshark/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MacにEclipse 3.6 Helios をインストール</title>
		<link>http://www.creativegear.jp/2011/04/05/install_eclipse/</link>
		<comments>http://www.creativegear.jp/2011/04/05/install_eclipse/#comments</comments>
		<pubDate>Tue, 05 Apr 2011 14:41:42 +0000</pubDate>
		<dc:creator>たけし</dc:creator>
				<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[Mac]]></category>
		<category><![CDATA[開発環境・ツール]]></category>

		<guid isPermaLink="false">http://www.creativegear.jp/?p=200</guid>
		<description><![CDATA[最近MacBookProをメインの開発環境にしようかと思い、Eclipseを入れました。 Windowsだと日本語化されたPleiades All in One Eclipseがあるので楽で良いですよね。WindowsP [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-medium wp-image-208" style="margin: 10px;" title="Eclipse 3.6 Helios" src="http://www.creativegear.jp/wp-content/uploads/2011/04/c5e89ec638db44921d41b5ee5e95cf36-300x194.png" alt="" width="200" height="129" />最近MacBookProをメインの開発環境にしようかと思い、Eclipseを入れました。</p>
<p>Windowsだと日本語化されたPleiades All in One Eclipseがあるので楽で良いですよね。WindowsPCを開発環境に使っていた時には、大して使いもしないくせに、全言語対応のUltimateパッケージをインストールしてました。</p>
<p>MacではPleiadesは使えないので、本家EclipseのJavaEEパッケージをインストールすることにしました。Java以外の言語は、後から追加でインストールします。</p>
<ul>
<li><span style="color: #0000ff;">本家Eclipseダウンロード先 </span><a href="http://www.eclipse.org/downloads/" target="_blank"><span style="color: #0000ff;">http://www.eclipse.org/downloads/</span></a></li>
</ul>
<p>&nbsp;</p>
<p>とりあえず日本語化をしたかったので、以下のブログさんを参考にやってみたら、あっという間に日本語化完了。最新版のVer.3.6 Heliosでの記事だったのでありがたいです。</p>
<ul>
<li><span style="color: #0000ff;">Getting Things Done!  | Eclipse 3.6 HeliosをMacにインストール<br />
<a href="http://nicomelmo.blog118.fc2.com/blog-entry-666.html" target="_blank"><span style="color: #0000ff;">http://nicomelmo.blog118.fc2.com/blog-entry-666.html</span></a></span></li>
</ul>
<p>&nbsp;</p>
<p>この記事を読みながら作業をしたのですが、最初、PleiadesのEclipseの「eclipse.ini」ファイルを書き換えた後、本家のEclipseの「eclipse.ini」ファイルに上書きをしてしまいました。</p>
<p>そしたらエラーが出てうまく起動しないなと思っていたんですが、ちゃんと読んでみると本家Eclipseの「eclipse.ini」ファイルに１行追記する形で書き込めば良かったんですね。ミスしてました。</p>
<p>ちゃんと書き換えたら、無事日本語化されてEclipseが起動してくれました。</p>
<p>あとは色々とプラグインをインストールして、自分好みに仕上げて行きます。とりあえず、Viのキーバインドをするプラグインと、Git関連のプラグインでも入れてみようかな。</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.creativegear.jp/2011/04/05/install_eclipse/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>DTI ServersMan@VPS 最初にやったこと</title>
		<link>http://www.creativegear.jp/2011/03/29/dti-serversmanvps/</link>
		<comments>http://www.creativegear.jp/2011/03/29/dti-serversmanvps/#comments</comments>
		<pubDate>Mon, 28 Mar 2011 18:48:30 +0000</pubDate>
		<dc:creator>たけし</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[VPS]]></category>
		<category><![CDATA[CentOS]]></category>
		<category><![CDATA[DTI]]></category>
		<category><![CDATA[Serversman]]></category>
		<category><![CDATA[サーバー]]></category>
		<category><![CDATA[作業メモ]]></category>

		<guid isPermaLink="false">http://www.creativegear.jp/?p=169</guid>
		<description><![CDATA[自分でサーバを構築して運用してみようと思い、DTI ServersManのVPSを契約しました。 これまではXreaのレンタルサーバを利用していたんですが、Javaを使ったWebアプリケーションサーバとして利用したかった [...]]]></description>
			<content:encoded><![CDATA[<p><img style="margin: 10px" class="alignleft size-full wp-image-191" title="serversman" alt="" src="http://www.creativegear.jp/wp-content/uploads/2011/03/serversman.png" width="200" height="200">自分でサーバを構築して運用してみようと思い、DTI ServersManのVPSを契約しました。</p>
<p>これまではXreaのレンタルサーバを利用していたんですが、Javaを使ったWebアプリケーションサーバとして利用したかった事もあり、もっと自由に使えるように自分でサーバを構築してみようかと。</p>
<p>ServersMan@VPSを契約して、いろいろと初期設定を行ってみたので、その時の作業記録を残します。</p>
<p>正直、サーバーの構築・運用は初めてなので、Webや書籍で調べながらの試行錯誤；　間違っている所や、この設定入れるべきだよ！ってのがありましたら、コメントもらえると嬉しいです。</p>
<p><span id="more-169"></span><br />
<h2>Standardプラン・シンプルセットを契約</h2>
<p>ServersMan@VPSは契約プランが、安い順にEntryプラン(月額490円)、Standardプラン(月額980円)、Proプラン(月額1980円)の３つがありますが、Standardプランを契約しました。</p>
<p>また、OSはCentOSを選択。それ以外にも、DebianとUbuntuも選べるみたいですね。</p>
<p>CentOSの場合には、さらに４つからプランを選べます。シンプルセット、ディスクセット、ホームページセット、エンジニアセット。</p>
<p>Webサーバとして利用して公開して行きたかったので、セキュリティやメンテナンスを考えて、なるべくシンプルな構成からセットアップして行きたかったので、シンプルセットを選びました。</p>
<p>※ちなみに、この４つのセットはあとからでも変更可能です。</p>
<p>シンプルセットを選んで、OS初期化状態でVPSが利用開始となります。その状態から設定した内容を以下にメモして行きます。</p>
<p>※なお、サーバーへアクセスするためのローカルPCは、Macを使っています。Windowsを使用している方は、適時読み替えてください。</p>
<p>&nbsp;</p>
<h2>sshでサーバーにrootログインする</h2>
<p>ローカルPC(MacOS)のターミナルを起動し、以下のコマンドを実行する。<br />パスワードを聞かれるので、契約時に発行されているrootログインパスワードを入力する。</p>
<blockquote><p style="padding-left: 30px">$ ssh -l root VPSのIPアドレス -p 3843</p>
</blockquote>
<p>※通常、sshのデフォルトでの使用ポーと番号は22ですが、ServersMan@VPSでは、3843番に変更されているため、ポート3843を指定して実行します。</p>
<p>詳細は、以下のDTIサポートページを参照。<br /><a href="http://dream.jp/support/announce/important/101207.html" target="_blank">http://dream.jp/support/announce/important/101207.html</a></p>
<p>&nbsp;</p>
<h2>rootパスワードの変更</h2>
<p>何はともあれ、以下のコマンドで、rootパスワードを変更する。</p>
<blockquote><p style="padding-left: 30px">$ passwd</p>
</blockquote>
<p>&nbsp;</p>
<h2>新しいユーザーを作成し、管理者グループに追加</h2>
<p>管理者用ユーザーを作成する。また管理者グループ「wheel」に追加する。</p>
<blockquote><p style="padding-left: 30px">$ useradd -G wheel 新しいユーザー名</p>
</blockquote>
<p>ついでにパスワードも設定する。</p>
<blockquote><p style="padding-left: 30px">$ passwd 新しいユーザー名</p>
</blockquote>
<p style="padding-left: 30px">&nbsp;</p>
<h2>sudoを実行できるユーザーへ登録(visudo)</h2>
<p>管理者グループのユーザーに、sudoコマンドの実行を許可するため、以下のコマンドを実行して設定ファイルを編集する。</p>
<blockquote><p style="padding-left: 30px">$ visudo</p>
</blockquote>
<p>次の行を探して先頭にあるコメント(#)を外す。</p>
<blockquote><p style="padding-left: 30px">%wheel&nbsp;&nbsp; ALL=(ALL)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ALL</p>
</blockquote>
<p>一度ログアウトし、作成した管理者ユーザーでログイン出来ることと、sudoコマンドを実行出来ること、su &#8211; コマンドでrootログイン出来ることを確認する。<br />※それを確認せずに、次の「rootログインを禁止する」を実行してしまうと、二度とサーバーへログイン出来なくなる可能性があるので危険。</p>
<p>&nbsp;</p>
<h2>sshでのrootログインを禁止する</h2>
<p>SSHでのrootログインを禁止するため、以下のコンフィグファイルを変更する。</p>
<blockquote><p style="padding-left: 30px">$ vi /etc/ssh/sshd_config</p>
</blockquote>
<p>PermitRootLoginをyesからnoへ書き換える。</p>
<blockquote><p style="padding-left: 30px">PermitRootLogin no</p>
</blockquote>
<p>設定を反映させるため、sshデーモンを再起動する。</p>
<blockquote><p style="padding-left: 30px">$ /etc/init.d/sshd restart</p>
</blockquote>
<p>一度ログアウトし、rootログイン出来ないようになっていることを確認する。<br />以降は上記で作成した管理者ユーザーでログインし、<br />適時、sudoコマンドでコマンド実行する。(一部コマンドはrootログインして実行)</p>
<p>&nbsp;</p>
<h2>公開鍵認証でログインするようにする</h2>
<p>SSHでサーバに接続する際に、パスワードによる認証ではなく、公開鍵認証でログイン出来るようにする。</p>
<p>ローカルPC(MacOS)で、公開鍵を作成する。<br />実行時にパスフレーズの入力を求められるので、適当な文字列を入力する。<br />※パスフレーズは後で利用するので覚えておく。</p>
<blockquote><p style="padding-left: 30px">$ ssh-keygen↵</p>
</blockquote>
<p>ローカルPCの「~/.ssh」フォルダに、秘密鍵「id_rsa」と公開鍵「id_rsa.pub」が作成される。<br />id_rsa.pubの内容をコピーし、サーバーの以下のファイルに追記する。<br />※ディレクトリ、ファイルが存在しなければ作成する。</p>
<blockquote><p style="padding-left: 30px">~/.ssh/authorized_keys</p>
</blockquote>
<p>上記フォルダ、ファイルのパーミッションを変更する。</p>
<blockquote><p style="padding-left: 30px">$ chmod 700 ~/.ssh<br />$ chmod 600 ~/.ssh/authorized_keys</p>
</blockquote>
<p>一度ログアウトし、ローカルPCから再度SSHでログイン実行すると、<br />「Enter your password for the SSH key &#8220;id_rsa&#8221;.」と書かれたメッセージダイアログが表示される。<br />SSHの公開鍵を作成した際に入力したパスフレーズを入力し、OKボタンを押下する。<br />これで次回から、パスワード入力をせずに、鍵認証でログイン可能となる。</p>
<p>&nbsp;</p>
<h2>パスワードログインを禁止する</h2>
<p>セキュリティ強化のため、パスワード入力でのログインを禁止し、<br />公開鍵認証でのログインのみ出来るように設定する。<br />※ローカルPCの秘密鍵、サーバ上の公開鍵を紛失してしまうとログイン出来なくなるので注意。<br />ローカルPCのHDDがご臨終とかしたらアウトなので、キーのバックアップは必須。<br />この設定をしたくなければ、飛ばしてもOK。</p>
<blockquote><p style="padding-left: 30px">$ sudo vi /etc/ssh/sshd_config</p>
</blockquote>
<p>PasswordAuthentication を、yesからnoへ変更</p>
<blockquote><p style="padding-left: 30px">PasswordAuthentication no</p>
</blockquote>
<p>設定反映するため、SSHデーモンを再起動する。</p>
<blockquote><p style="padding-left: 30px">$ sudo /etc/init.d/sshd restart</p>
</blockquote>
<p style="padding-left: 30px">&nbsp;</p>
<h2>システムの文字コードをUTF-8、日本語に変更</h2>
<p>システム文字をUTF-8,日本語に変更するため、以下のファイルを編集。</p>
<blockquote><p style="padding-left: 30px">$ sudo vi /etc/sysconfig/i18n</p>
</blockquote>
<p>LANGを以下のように変更する。</p>
<blockquote><p style="padding-left: 30px">LANG=&#8221;ja_JP.UTF-8&#8243;</p>
</blockquote>
<p>一度ログアウト＆ログインして、「df -h」コマンド等を実行し、<br />以下のように日本語が表示されればOK。</p>
<blockquote><p style="padding-left: 30px">Filesystem&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; サイズ&nbsp; 使用&nbsp; 残り 使用% マウント位置<br />/dev/simfs&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 30G&nbsp; 714M&nbsp;&nbsp; 30G&nbsp;&nbsp; 3% /</p>
</blockquote>
<p style="padding-left: 30px">&nbsp;</p>
<h2>ホスト名を変更する</h2>
<p>rootでログインし、ホスト名を変更する。</p>
<blockquote><p style="padding-left: 30px">$ su -<br />$ hostname 新しいホスト名</p>
</blockquote>
<p>rootからログアウトする。</p>
<p>&nbsp;</p>
<h2>不要なデーモンを停止する</h2>
<p>起動しているデーモンを表示する。</p>
<blockquote><p style="padding-left: 30px">$ /sbin/chkconfig &#8211;list | grep on</p>
<p style="padding-left: 30px">ajaxterm&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0:off&nbsp;&nbsp;&nbsp; 1:off&nbsp;&nbsp;&nbsp; 2:on&nbsp;&nbsp;&nbsp; 3:on&nbsp;&nbsp;&nbsp; 4:on&nbsp;&nbsp;&nbsp; 5:on&nbsp;&nbsp;&nbsp; 6:off<br />crond&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0:off&nbsp;&nbsp;&nbsp; 1:off&nbsp;&nbsp;&nbsp; 2:on&nbsp;&nbsp;&nbsp; 3:on&nbsp;&nbsp;&nbsp; 4:on&nbsp;&nbsp;&nbsp; 5:on&nbsp;&nbsp;&nbsp; 6:off<br />gpm&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0:off&nbsp;&nbsp;&nbsp; 1:off&nbsp;&nbsp;&nbsp; 2:on&nbsp;&nbsp;&nbsp; 3:off&nbsp;&nbsp;&nbsp; 4:on&nbsp;&nbsp;&nbsp; 5:on&nbsp;&nbsp;&nbsp; 6:off<br />httpd&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0:off&nbsp;&nbsp;&nbsp; 1:off&nbsp;&nbsp;&nbsp; 2:off&nbsp;&nbsp;&nbsp; 3:on&nbsp;&nbsp;&nbsp; 4:off&nbsp;&nbsp;&nbsp; 5:off&nbsp;&nbsp;&nbsp; 6:off<br />iptables&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0:off&nbsp;&nbsp;&nbsp; 1:off&nbsp;&nbsp;&nbsp; 2:on&nbsp;&nbsp;&nbsp; 3:on&nbsp;&nbsp;&nbsp; 4:on&nbsp;&nbsp;&nbsp; 5:on&nbsp;&nbsp;&nbsp; 6:off<br />lm_sensors&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0:off&nbsp;&nbsp;&nbsp; 1:off&nbsp;&nbsp;&nbsp; 2:on&nbsp;&nbsp;&nbsp; 3:off&nbsp;&nbsp;&nbsp; 4:on&nbsp;&nbsp;&nbsp; 5:on&nbsp;&nbsp;&nbsp; 6:off<br />lvm2-monitor&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0:off&nbsp;&nbsp;&nbsp; 1:on&nbsp;&nbsp;&nbsp; 2:on&nbsp;&nbsp;&nbsp; 3:off&nbsp;&nbsp;&nbsp; 4:on&nbsp;&nbsp;&nbsp; 5:on&nbsp;&nbsp;&nbsp; 6:off<br />mcstrans&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0:off&nbsp;&nbsp;&nbsp; 1:off&nbsp;&nbsp;&nbsp; 2:on&nbsp;&nbsp;&nbsp; 3:off&nbsp;&nbsp;&nbsp; 4:on&nbsp;&nbsp;&nbsp; 5:on&nbsp;&nbsp;&nbsp; 6:off<br />messagebus&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0:off&nbsp;&nbsp;&nbsp; 1:off&nbsp;&nbsp;&nbsp; 2:off&nbsp;&nbsp;&nbsp; 3:off&nbsp;&nbsp;&nbsp; 4:on&nbsp;&nbsp;&nbsp; 5:on&nbsp;&nbsp;&nbsp; 6:off<br />netconsole&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0:off&nbsp;&nbsp;&nbsp; 1:off&nbsp;&nbsp;&nbsp; 2:off&nbsp;&nbsp;&nbsp; 3:off&nbsp;&nbsp;&nbsp; 4:off&nbsp;&nbsp;&nbsp; 5:off&nbsp;&nbsp;&nbsp; 6:off<br />netfs&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0:off&nbsp;&nbsp;&nbsp; 1:off&nbsp;&nbsp;&nbsp; 2:off&nbsp;&nbsp;&nbsp; 3:off&nbsp;&nbsp;&nbsp; 4:on&nbsp;&nbsp;&nbsp; 5:on&nbsp;&nbsp;&nbsp; 6:off<br />network&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0:off&nbsp;&nbsp;&nbsp; 1:off&nbsp;&nbsp;&nbsp; 2:on&nbsp;&nbsp;&nbsp; 3:on&nbsp;&nbsp;&nbsp; 4:on&nbsp;&nbsp;&nbsp; 5:on&nbsp;&nbsp;&nbsp; 6:off<br />portmap&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0:off&nbsp;&nbsp;&nbsp; 1:off&nbsp;&nbsp;&nbsp; 2:off&nbsp;&nbsp;&nbsp; 3:off&nbsp;&nbsp;&nbsp; 4:on&nbsp;&nbsp;&nbsp; 5:on&nbsp;&nbsp;&nbsp; 6:off<br />rawdevices&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0:off&nbsp;&nbsp;&nbsp; 1:off&nbsp;&nbsp;&nbsp; 2:off&nbsp;&nbsp;&nbsp; 3:off&nbsp;&nbsp;&nbsp; 4:on&nbsp;&nbsp;&nbsp; 5:on&nbsp;&nbsp;&nbsp; 6:off<br />restorecond&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0:off&nbsp;&nbsp;&nbsp; 1:off&nbsp;&nbsp;&nbsp; 2:on&nbsp;&nbsp;&nbsp; 3:off&nbsp;&nbsp;&nbsp; 4:on&nbsp;&nbsp;&nbsp; 5:on&nbsp;&nbsp;&nbsp; 6:off<br />saslauthd&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0:off&nbsp;&nbsp;&nbsp; 1:off&nbsp;&nbsp;&nbsp; 2:off&nbsp;&nbsp;&nbsp; 3:on&nbsp;&nbsp;&nbsp; 4:off&nbsp;&nbsp;&nbsp; 5:off&nbsp;&nbsp;&nbsp; 6:off<br />sendmail&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0:off&nbsp;&nbsp;&nbsp; 1:off&nbsp;&nbsp;&nbsp; 2:on&nbsp;&nbsp;&nbsp; 3:on&nbsp;&nbsp;&nbsp; 4:on&nbsp;&nbsp;&nbsp; 5:on&nbsp;&nbsp;&nbsp; 6:off<br />serversman&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0:off&nbsp;&nbsp;&nbsp; 1:off&nbsp;&nbsp;&nbsp; 2:off&nbsp;&nbsp;&nbsp; 3:on&nbsp;&nbsp;&nbsp; 4:on&nbsp;&nbsp;&nbsp; 5:on&nbsp;&nbsp;&nbsp; 6:off<br />sshd&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0:off&nbsp;&nbsp;&nbsp; 1:off&nbsp;&nbsp;&nbsp; 2:on&nbsp;&nbsp;&nbsp; 3:on&nbsp;&nbsp;&nbsp; 4:on&nbsp;&nbsp;&nbsp; 5:on&nbsp;&nbsp;&nbsp; 6:off<br />syslog&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0:off&nbsp;&nbsp;&nbsp; 1:off&nbsp;&nbsp;&nbsp; 2:on&nbsp;&nbsp;&nbsp; 3:on&nbsp;&nbsp;&nbsp; 4:on&nbsp;&nbsp;&nbsp; 5:on&nbsp;&nbsp;&nbsp; 6:off<br />xinetd&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0:off&nbsp;&nbsp;&nbsp; 1:off&nbsp;&nbsp;&nbsp; 2:off&nbsp;&nbsp;&nbsp; 3:on&nbsp;&nbsp;&nbsp; 4:on&nbsp;&nbsp;&nbsp; 5:on&nbsp;&nbsp;&nbsp; 6:off</p>
</blockquote>
<p>とりあえず利用しないもの、serversmanとrestorecondを停止してみる。</p>
<blockquote><p style="padding-left: 30px">$ sudo /sbin/chkconfig serversman off<br />$ sudo /sbin/chkconfig restorecond off</p>
</blockquote>
<p>何を停止するべきか、後で調べて追加で停止する予定。</p>
<p>メールはSendMailではなく、Postfixを使用したかったためsendmailも停止。</p>
<blockquote><p style="padding-left: 30px">$ sudo /sbin/chkconfig sendmail off</p>
</blockquote>
<p style="padding-left: 30px">&nbsp;</p>
<h2>不要なパッケージをアンインストールする</h2>
<p>インストールされているパッケージを表示する。</p>
<blockquote><p style="padding-left: 30px">$ yum list installed</p>
</blockquote>
<p>たくさんパッケージ名が表示されるが、とりあえず使用しないserversmanと、samba、sendmailをアンインストールする。</p>
<blockquote><p style="padding-left: 30px">$ sudo yum -y remove smadmin serversman<br />$ sudo yum -y remove samba*<br />$ sudo yum -y remove sendmail</p>
</blockquote>
<p>&nbsp;</p>
<h2>Postfixをインストール、起動</h2>
<p>メールにはPostfixを利用しようかと思うので、インストールして起動しておく。</p>
<blockquote><p style="padding-left: 30px">$ sudo yum install postfix<br />$ sudo /etc/init.d/postfix start</p>
</blockquote>
<p>&nbsp;</p>
<h2>全パッケージをアップデート</h2>
<p>以下のコマンドで、アップデート可能な全パッケージをアップデート実行する。</p>
<p style="padding-left: 30px">$ sudo yum update</p>
<p style="padding-left: 30px">&nbsp;</p>
<h2>パケットフィルタを設定</h2>
<p>パケットフィルタリングを行うため、iptablesの設定を行う。</p>
<p>以下のコマンドを実行し、iptablesがランレベル2〜5で起動していることを確認する。</p>
<blockquote><p style="padding-left: 30px">$ /sbin/chkconfig &#8211;list | grep iptables<br />iptables&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0:off&nbsp;&nbsp;&nbsp; 1:off&nbsp;&nbsp;&nbsp; 2:on&nbsp;&nbsp;&nbsp; 3:on&nbsp;&nbsp;&nbsp; 4:on&nbsp;&nbsp;&nbsp; 5:on&nbsp;&nbsp;&nbsp; 6:off</p>
</blockquote>
<p>&nbsp;</p>
<p>取り急ぎ、Webサーバ、SMTPサーバ、POPサーバ、SSHぐらいしか使わないので、外部からのアクセスはそのサービスで利用しているポート番号のみを許可するようにしました。あとは、DNS応答とICMPの受信も許可。外部へのパケット送信は全て許可にしています。</p>
<p>以下、個別の設定の詳細。</p>
<p>&nbsp;</p>
<ul>
<li>外部からのWebサーバ接続用に、TCP &#8211; Port:80を接続許可する。 </li>
</ul>
<blockquote><p style="padding-left: 60px">$ sudo /sbin/iptables -A INPUT -p tcp &#8211;dport 80 -j ACCEPT</p>
</blockquote>
<ul>
<li>外部からのSMTP接続用に、TCP &#8211; Port:25を接続許可する。 </li>
</ul>
<blockquote><p style="padding-left: 60px">$ sudo /sbin/iptables -A INPUT -p tcp &#8211;dport 25 -j ACCEPT</p>
</blockquote>
<ul>
<li>外部からのPOP接続用に、TCP &#8211; Port:110を接続許可する。 </li>
</ul>
<blockquote><p style="padding-left: 60px">$ sudo /sbin/iptables -A INPUT -p tcp &#8211;dport 110 -j ACCEPT</p>
</blockquote>
<ul>
<li>外部からのSSH接続用に、TCP &#8211; Port:3843を接続許可する。※SSHをPort:3843に設定している場合。 </li>
</ul>
<blockquote><p style="padding-left: 60px">$ sudo /sbin/iptables -A INPUT -p tcp &#8211;dport 3843 -j ACCEPT</p>
</blockquote>
<ul>
<li>ICMPパケットの受信を許可する </li>
</ul>
<blockquote><p style="padding-left: 60px">$ sudo /sbin/iptables -A INPUT -p icmp -j ACCEPT</p>
</blockquote>
<ul>
<li>DNS応答の受信を許可する </li>
</ul>
<blockquote><p style="padding-left: 60px">$ sudo /sbin/iptables -A INPUT -p udp &#8211;sport domain -j ACCEPT</p>
</blockquote>
<ul>
<li>サーバから接続開始したTCP通信の受信パケットを許可する </li>
</ul>
<blockquote><p style="padding-left: 60px">$ sudo /sbin/iptables -A INPUT -m state &#8211;state ESTABLISHED,RELATED -j ACCEPT</p>
</blockquote>
<ul>
<li>それ以外のポート番号への、外部からの接続を禁止する。 </li>
</ul>
<blockquote><p style="padding-left: 60px">$ sudo /sbin/iptables -P INPUT DROP</p>
</blockquote>
<p style="padding-left: 60px"><span style="color: #ff0000">※くれぐれもSSHで利用しているポート番号の許可をした上で、このコマンドを実行することに注意する。間違えた場合、サーバを再起動しないとSSHアクセスが出来なくなる。</span></p>
<ul>
<li>iptablesの設定を確認する。 </li>
</ul>
<blockquote><p style="padding-left: 60px">$ sudo /sbin/iptables -L</p>
<p style="padding-left: 60px">Chain INPUT (policy DROP)<br />target&nbsp;&nbsp;&nbsp;&nbsp; prot opt source&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; destination<br />ACCEPT&nbsp;&nbsp;&nbsp;&nbsp; tcp&nbsp; &#8211;&nbsp; anywhere&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; anywhere&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tcp dpt:http<br />ACCEPT&nbsp;&nbsp;&nbsp;&nbsp; tcp&nbsp; &#8211;&nbsp; anywhere&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; anywhere&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tcp dpt:smtp<br />ACCEPT&nbsp;&nbsp;&nbsp;&nbsp; tcp&nbsp; &#8211;&nbsp; anywhere&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; anywhere&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tcp dpt:pop3<br />ACCEPT&nbsp;&nbsp;&nbsp;&nbsp; tcp&nbsp; &#8211;&nbsp; anywhere&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; anywhere&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tcp dpt:quest-agent<br />ACCEPT&nbsp;&nbsp;&nbsp;&nbsp; icmp &#8211;&nbsp; anywhere&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; anywhere<br />ACCEPT&nbsp;&nbsp;&nbsp;&nbsp; udp&nbsp; &#8211;&nbsp; anywhere&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; anywhere&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; udp spt:domain<br />ACCEPT&nbsp;&nbsp;&nbsp;&nbsp; all&nbsp; &#8211;&nbsp; anywhere&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; anywhere&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; state RELATED,ESTABLISHED</p>
<p>Chain FORWARD (policy ACCEPT)<br />target&nbsp;&nbsp;&nbsp;&nbsp; prot opt source&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; destination</p>
<p>Chain OUTPUT (policy ACCEPT)<br />target&nbsp;&nbsp;&nbsp;&nbsp; prot opt source&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; destination</p>
</blockquote>
<p style="padding-left: 60px">&nbsp;</p>
<ul>
<li>間違いが無ければ、以下のコマンドで設定をファイルに保存する。 </li>
</ul>
<blockquote><p style="padding-left: 60px">$ sudo /etc/init.d/iptables save</p>
</blockquote>
<p style="padding-left: 60px">※保存しておかないと、コマンドで設定したルールは、サーバ再起動時に消えてしまう。</p>
<p>&nbsp;</p>
<h2>とりあえず終了</h2>
<p>とりあえずここまで。他にも設定するべき事を調べてやって行きたいと思います。</p>
<p>また、これらの設定を行う上で、参考にさせて頂いたサイトも記載しておきます。</p>
<p>&nbsp;</p>
<p>参考サイト：<br />「MAKIZOU.COM」<a href="http://www.makizou.com/archives/2053" target="_blank">http://www.makizou.com/archives/2053</a><br />「zundairo」<a href="http://d.hatena.ne.jp/zundairo/20101029/ServersMan_VPS" target="_blank">http://d.hatena.ne.jp/zundairo/20101029/ServersMan_VPS</a></p>
<p>&nbsp;</p>
<p>&lt;2011/04/06 修正&gt;</p>
<p>iptablesの設定に、INPUTチェインへ、ICMPパケットの受信、DNS応答パケットの受信、サーバから接続開始したTCP通信の応答パケットの受信を許可する設定を追加しました。</p>
<p>上記のiptables設定は、HTTPの送受信が出来ること、SMTP,POP3の送受信が出来ること、ICMPv4の送受信が出来ること、SSHの送受信が出来ることしか、基本的には設定していません。</p>
<p>あとは、サーバ側から送信したDNSの応答、サーバ側から開始したTCP通信の応答パケットを受信出来るように許可しています。</p>
<p>iptablesの設定としては貧弱な内容だと思いますので、あくまで参考程度に見てください。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.creativegear.jp/2011/03/29/dti-serversmanvps/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>VimがTwitterクライアントになる！TwitVimの紹介</title>
		<link>http://www.creativegear.jp/2009/09/20/twitvim/</link>
		<comments>http://www.creativegear.jp/2009/09/20/twitvim/#comments</comments>
		<pubDate>Sat, 19 Sep 2009 20:41:47 +0000</pubDate>
		<dc:creator>たけし</dc:creator>
				<category><![CDATA[Twitter]]></category>
		<category><![CDATA[Vim]]></category>

		<guid isPermaLink="false">http://www.creativegear.jp/wordpress/?p=1</guid>
		<description><![CDATA[テキストエディタには、それほどこだわりはなくて、色々なもの使っていたのですが、最近Vimを使い始めました。 クセが強いので、慣れるまで時間がかかりそうです。でも、コマンドやスクリプトの使い方を覚えていくのは楽しいですね！ [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-full wp-image-135" style="margin: 5px;" title="TwitVim" src="http://www.creativegear.jp/wp-content/uploads/2009/09/TwitVim.png" alt="" width="200" height="200" />テキストエディタには、それほどこだわりはなくて、色々なもの使っていたのですが、最近Vimを使い始めました。</p>
<p>クセが強いので、慣れるまで時間がかかりそうです。でも、コマンドやスクリプトの使い方を覚えていくのは楽しいですね！Vimの便利さと軽快さに、だんだんと魅入られて行きそうです。</p>
<p>Twitterも最近始めてみたのですが、Webブラウザで利用するのが少し不便に感じます。Twitterクライアント・ソフトを利用しようかとも思ったんですが、いくつもソフトがあってどれにしようか迷ってしまう。</p>
<p>そんな時、ふと・・・「VimってTwitterクライアントには出来ないの？」と思い、検索してみたら、やっぱりそんなプラグインがありました。それが、「TwitVim」というプラグイン。このTwitVimを、Windows版の「vim」で使用するための方法を、ご紹介したいと思います。<br />
<span id="more-1"></span></p>
<h3><strong>TwitVimとは</strong></h3>
<p>先ほどもお話しましたが、TwitVimとは、テキストエディタ「Vim」でTwitterの閲覧や投稿などを出来るようにする機能を持ったプラグインです。詳しくチェックはしていませんが、リプライやダイレクトメッセージの送受信等、Twitterクライアントとして十分な機能を搭載していると思います。実際にTwitVimを使ってTwitterのつぶやきを閲覧している様子は、こんな感じです。</p>
<p style="text-align: center;"><a href="http://www.creativegear.jp/wordpress/wp-content/uploads/TwitVim_Sample-thumb-500x359-80.png"></a><a href="http://www.creativegear.jp/wp-content/uploads/2009/09/TwitVim_Sample-thumb-500x359-80.png"><br />
</a><img class="aligncenter size-full wp-image-137" title="TwitVim_Sample-thumb-500x359-80" src="http://www.creativegear.jp/wp-content/uploads/2009/09/TwitVim_Sample-thumb-500x359-801.png" alt="" width="500" height="359" /></p>
<h3><strong>「Vim」に「TwitVim」をインストールする</strong></h3>
<p>UnixやLinux環境では、vimは標準でインストールされているかも知れませんが、今回は「香り屋<a href="http://www.kaoriya.net/">http://www.kaoriya.net/</a>」さんで配布されているWindows版「vim」を利用します。LinuxのVimや、WindowsでCygwinのVimを利用する際も、設定方法などはあまり変わらないと思いますので、以下の設定方法等は参考になると思います。</p>
<p>まずは、TwitVimを以下のHPからダウンロードします。<br />
※2009/09/20時点での最新版は、Ver.0.4.2　「twitvim-0.4.2.vba」です。</p>
<p><a href="http://vim.sourceforge.net/scripts/script.php?script_id=2204" target="_blank">http://vim.sourceforge.net/scripts/script.php?script_id=2204</a></p>
<p>本来は、このVBAファイルをvimにそのままインストールすれば良いのですが、そうするとWindows版Vimでは、Twitterの閲覧表示が文字化けしてしまいます。文字化けを防ぐための方法が、<a href="http://d.hatena.ne.jp/hkn/20090421/1240316618" target="_blank">「hkn？」さんのブログ</a>で紹介されていましたので参考にさせて頂きました。<br />
上記のブログに詳細は記載されていますのでご覧下さい。念のため、こちらにも対処方法を記載させて頂きます。</p>
<p>文字化けを防ぐために、ダウンロードした「twitvim-0.4.2.vba」をテキストエディタで開きます。<br />
1335行目に、以下の記述がありますので、<span style="background-color: #ff99cc;">赤線部分の内容を追記してください。</span><br />
(Windowsの文字コードがShift-JISですので、エンコードの変換処理を追加してあげる必要があるようです。)</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br />
function! s:convert_entity(str)<br />
let s = a:str<br />
let s = substitute(s, &#8216;&amp;amp;&#8217;, &#8216;&amp;&#8217;, &#8216;g&#8217;)<br />
let s = substitute(s, &#8216;&amp;lt;&#8217;, &#8216;&lt;&#8217;, &#8216;g&#8217;)<br />
let s = substitute(s, &#8216;&amp;gt;&#8217;, &#8216;&gt;&#8217;, &#8216;g&#8217;)<br />
let s = substitute(s, &#8216;&amp;quot;&#8217;, &#8216;&#8221;&#8216;, &#8216;g&#8217;)<br />
<span style="background-color: #ff99cc;">setlocal encoding=utf-8</span><br />
let s = substitute(s, &#8216;&amp;#(d+);&#8217;,'=nr2char(submatch(1))&#8217;, &#8216;g&#8217;)<br />
<span style="background-color: #ff99cc;">let s = iconv(s, &#8220;utf-8&#8243;, &#8220;cp932&#8243;)</span><br />
<span style="background-color: #ff99cc;">setlocal encoding=cp932</span><br />
return s<br />
endfunction<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;</p>
<p>「twitvim-0.4.2.vba」を変更して保存したら、いよいよインストールです。<br />
とはいっても、Vimball形式のファイルですので、インストールは簡単。</p>
<p>Vimで「twitvim-0.4.2.vba」を開いた後、「: source %」コマンドを入力すれば完了です。<br />
※文字化け対策でファイル内容を変更した関係で、エラーメッセージが出ると思いますが、全て無視してしまってOKです。</p>
<h3><strong>Twitterのログインユーザー名、パスワードを設定する</strong></h3>
<p>TwitVimのインストールが終わったら、今度は「vimrc」ファイルを開き、以下の設定を追記してください。</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br />
let twitvim_login_b64 = &#8220;ユーザー名とパスワード&#8221;<br />
let twitvim_count = 100<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;</p>
<p>2行目は、Twitter閲覧時の表示するつぶやき数の指定です。ユーザー名とパスワードの部分には、以下の文字列をbase64で暗号化（エンコード）した文字列を入れて下さい。base64に暗号化するフリーソフトも、検索するとありますので利用してください。</p>
<p>ユーザー名：パスワード</p>
<p>※ユーザー名とパスワードの間に、半角コロンを入れた文字列を暗号化してください。<br />
また、暗号化を何もせずに平文で設定するには、以下の記述を使います。<br />
ただし、ファイルにログイン情報を丸見えの状態で記載するのは、<br />
セキュリティのことを考えると止めておいた方が良いでしょう。</p>
<p>let twitvim_login = &#8220;ユーザー名：パスワード&#8221;</p>
<h3><strong>cURLをインストールする</strong></h3>
<p>TwitVimでは「cURL」を利用しているようです。WindowsにはデフォルトではｃURLは入っていませんので、以下のサイトからWindows版cURLをダウンロードします。</p>
<p>香り屋　<a href="http://www.kaoriya.net/" target="_blank">http://www.kaoriya.net/</a></p>
<p>ダウンロードしたファイルを解凍すると、「curl-7.10.8-win32-ssl」フォルダに解凍されます。Vim以外にcURLを使う予定も無かったので、上記フォルダの中身をVimのインストールフォルダに移動させました。（パスを通すのがメンドカッタだけです；）　これで、VimからcURLを利用できるようになります。</p>
<h3><strong>TwitVimでTwitterを利用する</strong></h3>
<p>準備が長くなりましたが、これでいよいよVimでTwitterを利用することが出来ます。試してみましょう。</p>
<p>まず、gvim（もしくはVim）を起動して、「:FriendsTwitter」と入力してみましょう。自分がフォローしている人たちのつぶやきが表示されるはずです。</p>
<p>次に、Twitterへつぶやきを投稿してみましょう。「:PosttoTwitter」と入力し、Enterを押した後、つぶやきを入力してEnterキーを押してみます。これで投稿が完了しました。<br />
一応、画面を更新して確認してみましょう。「RefreshTwitter」と入力すると、画面が更新されます。</p>
<h3><strong>コマンドについて</strong></h3>
<p>上記のコマンドを含めて、僕がよく利用するコマンドを記載しておきます。</p>
<ul>
<li>:FriendsTwitter    ・・・フォローしている人のつぶやきを表示する</li>
<li>:ReplyTwitter　　　･･･リプライのコメントだけを表示する</li>
<li>:DMTwitter　　　　 ･･･ダイレクトメッセージの受信BOXを表示する</li>
<li>:DMSentTwitter　 ･･･ダイレクトメッセージの送信BOXを表示する</li>
<li>:RefreshTwitter    ・・・画面を更新する</li>
<li>:BackTwitter　       ･･･１つ前に見ていた画面に戻る（ブラウザの戻るボタンと同じ）</li>
<li>:FowardTwitter  　･･･１つ後に見ていた画面に戻る（ブラウザの進むボタンと同じ）</li>
<li>:NextTwitter　        ･･･より古いつぶやきのページに移動する</li>
<li>:PreviousTwitter　･･･より新しいつぶやきのページじ移動する</li>
<li>:PosttoTwitter　　  ・・・つぶやきを投稿する</li>
<li>:CPosttoTwitter　 ･･･現在の行に記載されている内容を投稿する</li>
<li>Alt + r　                   ･･･現在の行に記載されているユーザにリプライ投稿する</li>
<li> + R　                     ・・・現在の行に記載されているつぶやきにReTweetする</li>
<li>:SendDMTwitter　[相手のユーザー名]　・・・ダイレクトメッセージを投稿する</li>
</ul>
<p>その他のコマンドを知りたい場合には、「twitvim-0.4.2.vba」の2862行目からがマニュアルになっていますので参照して下さい。</p>
<p>他のTwitterクライアントソフトと違って、定期的に画面が更新されないのは少し不便ですが、やはり動作も軽いですし、Vimでテキスト編集をしながらTwitterを見れるのは良いですね。</p>
<p>Vim使いの方は、ぜひ一度お試しください。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.creativegear.jp/2009/09/20/twitvim/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Webで読める気になる本</title>
		<link>http://www.creativegear.jp/2009/03/25/webbooks/</link>
		<comments>http://www.creativegear.jp/2009/03/25/webbooks/#comments</comments>
		<pubDate>Tue, 24 Mar 2009 20:17:00 +0000</pubDate>
		<dc:creator>たけし</dc:creator>
				<category><![CDATA[Book]]></category>

		<guid isPermaLink="false">http://www.creativegear.jp/wordpress/?p=62</guid>
		<description><![CDATA[技術書の中には、書籍として販売もされているけれども、Web上で無料で公開されている本がたまにあります。本って、そんなに安いものでも無いし、無料で読めるのは本当にありがたいです。読んでみて気に入ったら、改めて書籍を購入して [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-full wp-image-139" style="margin: 10px;" title="books" src="http://www.creativegear.jp/wp-content/uploads/2009/03/Books-thumb-300x199-67.jpg" alt="" width="200" height="130" />技術書の中には、書籍として販売もされているけれども、Web上で無料で公開されている本がたまにあります。本って、そんなに安いものでも無いし、無料で読めるのは本当にありがたいです。読んでみて気に入ったら、改めて書籍を購入しても良いですしね。<br />
やっぱりディスプレイで見るよりも、本で読んだ方が目は疲れないですし。購入する前に一通り読めるというのもメリットですね。</p>
<p>そんなWeb上で読むことができる本の中で、気になっている本をメモしておこうかと思います。ちなみに、僕自身まだ読み始めたばかりというものばかりですが；</p>
<p>&nbsp;</p>
<p><span id="more-62"></span></p>
<h3>「ハッカーと画家」</h3>
<p><a rel="http://www.amazon.co.jp/gp/product/4274065979/ref=as_li_ss_tl?ie=UTF8&amp;tag=creativegear-22&amp;linkCode=as2&amp;camp=247&amp;creative=7399&amp;creativeASIN=4274065979" href="http://www.amazon.co.jp/gp/product/4274065979/ref=as_li_ss_tl?ie=UTF8&amp;tag=creativegear-22&amp;linkCode=as2&amp;camp=247&amp;creative=7399&amp;creativeASIN=4274065979" target="_blank"><img class="alignleft size-full wp-image-146" style="margin: 10px;" title="HackersAndPainters" src="http://www.creativegear.jp/wp-content/uploads/2009/03/HackersAndPainters.jpg" alt="" width="240" height="240" /></a>Lispハッカーとして有名なPaul Grahamさんの書くエッセイの影響力は有名です。Web上でエッセイが公開されていますが、書籍化されて販売もされています。日本語にも翻訳されて「ハッカーと画家」というタイトルで販売されています。</p>
<p><a href="http://www.paulgraham.com/articles.html">http://www.paulgraham.com/articles.html</a></p>
<p>また、Paul Grahamさんのエッセイを翻訳したものを、河合 史朗さんがWebで公開されています。</p>
<p><a href="http://practical-scheme.net/index-j.html">http://practical-scheme.net/index-j.html</a>（左記HPの「翻訳文書」のところ）</p>
<p>邦訳された書籍を購入して読んでみましたが、非常に面白い。技術的なウンチクを語るような内容ではなくて、物事や技術の本質を的確に捉えて、掘り下げていくような切り口は、<br />
普通に読み物として面白いと思える内容でした。</p>
<p>（あと、この本読んでて、Yahoo! Store って、最初はLispで作ってたんだ～っての初めて知った。Yahoo! Japanではどうか知らないけど。）</p>
<p>[注] プログラマ以外の方のために念のため。ここでいうハッカーというのは、どっかのマスメディアや、どっかの映画や漫画で取り上げられているようなセキュリティ破り等の行為をするような人のことではなく、試行錯誤と努力を積み重ねて、何か素晴らしい仕事をする人のことです。</p>
<p>ハッカーの定義については、Eric.S.Raymond のエッセイ<a href="http://cruel.org/freeware/hacker.html" target="_blank">「How To Become A Hacker」</a>が共感できる記述が多いですので、リンクを貼っておきます。また、<a href="http://www.itmedia.co.jp/enterprise/articles/0703/20/news011.html" target="_blank">ITmediaの「まつもとゆきひろ氏の連載」</a>にハッカーの定義が載っています。ハッカー達によるハッカーのための辞典<a href="http://www.catb.org/%7Eesr/jargon/" target="_blank">「Jargon File」</a>の邦訳書<a href="http://www.amazon.co.jp/%E3%83%8F%E3%83%83%E3%82%AB%E3%83%BC%E3%82%BA%E5%A4%A7%E8%BE%9E%E5%85%B8-Ascii-books-%E3%82%A8%E3%83%AA%E3%83%83%E3%82%AF-%E3%83%AC%E3%82%A4%E3%83%A2%E3%83%B3%E3%83%89/dp/475614084X/ref=sr_1_1?ie=UTF8&amp;s=books&amp;qid=1238074678&amp;sr=8-1" target="_blank">「ハッカーズ大辞典」</a>からの引用のようです。</p>
<h3>「On Lisp」</h3>
<p><a rel="http://www.amazon.co.jp/gp/product/4274066371/ref=as_li_ss_tl?ie=UTF8&amp;tag=creativegear-22&amp;linkCode=as2&amp;camp=247&amp;creative=7399&amp;creativeASIN=4274066371&quot;" href="http://www.amazon.co.jp/gp/product/4274066371/ref=as_li_ss_tl?ie=UTF8&amp;tag=creativegear-22&amp;linkCode=as2&amp;camp=247&amp;creative=7399&amp;creativeASIN=4274066371&quot;" target="_blank"><img class="alignleft size-full wp-image-151" style="margin: 10px;" title="OnLisp" src="http://www.creativegear.jp/wp-content/uploads/2009/03/OnLisp.jpg" alt="" width="240" height="240" /></a>前述のPaul Grahamさん著の「プログラミング言語Lisp」の解説本。以下のHPからダウンロードできます。</p>
<p><span style="text-decoration: underline;"><span style="color: #810081;"><a href="http://www.paulgraham.com/onlisp.html">http://www.paulgraham.com/onlisp.html</a></span></span></p>
<p>また、上記の本を翻訳したものを、野田　開さんがWeb上に公開されています。（こちらも書籍化され、販売されています。）</p>
<p><a href="http://www.komaba.utmc.or.jp/%7Eflatline/">http://www.komaba.utmc.or.jp/~flatline/</a></p>
<p>Lispを学んだことは無いのですが、Paul Grahamさんのエッセイを読んでいて興味が沸いてきました。そのうち勉強してみようかなぁ。</p>
<h3>「Producing Open Source Software」</h3>
<p><a rel="http://www.amazon.co.jp/gp/product/0596007590/ref=as_li_ss_tl?ie=UTF8&amp;tag=creativegear-22&amp;linkCode=as2&amp;camp=247&amp;creative=7399&amp;creativeASIN=0596007590" href="http://www.amazon.co.jp/gp/product/0596007590/ref=as_li_ss_tl?ie=UTF8&amp;tag=creativegear-22&amp;linkCode=as2&amp;camp=247&amp;creative=7399&amp;creativeASIN=0596007590" target="_blank"><img class="alignleft size-full wp-image-152" style="margin: 10px;" title="ProducingOSS" src="http://www.creativegear.jp/wp-content/uploads/2009/03/ProducingOSS.jpg" alt="" width="240" height="240" /></a>オープンソース開発の運営・管理のノウハウなどが書かれている本。オープンソースのバージョン管理システム「Subversion」の開発に携わっていたKarl Fogel さんが執筆していて、以下のHPで公開されています。</p>
<p><a href="http://www.producingoss.com/">http://www.producingoss.com/</a></p>
<p>また、それを邦訳したものが以下のページで公開されています。</p>
<p><a href="http://www.producingoss.com/ja/">http://www.producingoss.com/ja/</a></p>
<p>最近、オープンソース開発に興味が沸いてきたので、ぜひとも読んでみたいです。もうちょい勉強したら、Blenderの開発とかに参加してみようかなぁ。</p>
<p>他にもWebで読める書籍や、まとまった情報など、「こんなのもあるよ～」って方いらっしゃいましたら、ぜひ教えてくださいませm(・_・)m</p>
]]></content:encoded>
			<wfw:commentRss>http://www.creativegear.jp/2009/03/25/webbooks/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>復習しなかったら勉強してもゼロなのだ</title>
		<link>http://www.creativegear.jp/2009/03/20/study/</link>
		<comments>http://www.creativegear.jp/2009/03/20/study/#comments</comments>
		<pubDate>Thu, 19 Mar 2009 18:34:46 +0000</pubDate>
		<dc:creator>たけし</dc:creator>
				<category><![CDATA[Book]]></category>
		<category><![CDATA[勉強法]]></category>
		<category><![CDATA[復習]]></category>
		<category><![CDATA[脳科学]]></category>

		<guid isPermaLink="false">http://www.creativegear.jp/wordpress/?p=81</guid>
		<description><![CDATA[1週間くらい前に、「ひげぽん」さんのブログを見ていました。自作でOSとか作っちゃってるスゴイ方のブログなんですけど、そのブログで『勉強方法を勉強して分かった僕に足りなかった３つのこと』というエントリーを読んでいて、非常に [...]]]></description>
			<content:encoded><![CDATA[<p><a rel="http://www.amazon.co.jp/gp/product/4890852425/ref=as_li_ss_tl?ie=UTF8&amp;tag=creativegear-22&amp;linkCode=as2&amp;camp=247&amp;creative=7399&amp;creativeASIN=4890852425" href="http://www.amazon.co.jp/gp/product/4890852425/ref=as_li_ss_tl?ie=UTF8&amp;tag=creativegear-22&amp;linkCode=as2&amp;camp=247&amp;creative=7399&amp;creativeASIN=4890852425" target="_blank"><img class="alignleft size-full wp-image-154" style="margin-right: 10px; margin-left: 10px;" title="koukousei_benkyouhou" src="http://www.creativegear.jp/wp-content/uploads/2009/03/koukousei_benkyouhou.jpg" alt="" width="200" height="200" /></a>1週間くらい前に、「<a href="http://d.hatena.ne.jp/higepon/" target="_blank">ひげぽん</a>」さんのブログを見ていました。自作でOSとか作っちゃってるスゴイ方のブログなんですけど、そのブログで『<a href="http://d.hatena.ne.jp/higepon/20080811/1218456629">勉強方法を勉強して分かった僕に足りなかった３つのこと</a>』というエントリーを読んでいて、非常に感銘を受けたというか、ショックを受けたのが、「復習しなかったら勉強してもゼロなのだ」という言葉。</p>
<p>なんだか、一見して当たり前のことなんだけど、忘れていたことを、ズバリ指摘されたような感覚を覚えました。</p>
<p>今までプログラミングとかCGの事とか、資格試験とかを勉強してみたり、自己啓発本を読んだりとかしてきた中で、ちゃんと覚えて身に付いていることって少ない気がします。インプットの量に対して、最終的に自分の中でちゃんと残ってるのは、せいぜい10%くらい(・_・;)<br />
でも「まあ、こんなもんだろう」ってどこか勝手に納得しちゃってた気がする。</p>
<p>でも、「ひげぽん」さんのブログを読んで、そこで紹介されていた<a href="http://www.amazon.co.jp/%E6%9C%80%E6%96%B0%E8%84%B3%E7%A7%91%E5%AD%A6%E3%81%8C%E6%95%99%E3%81%88%E3%82%8B-%E9%AB%98%E6%A0%A1%E7%94%9F%E3%81%AE%E5%8B%89%E5%BC%B7%E6%B3%95-%E6%9D%B1%E9%80%B2%E3%83%96%E3%83%83%E3%82%AF%E3%82%B9-%E6%B1%A0%E8%B0%B7-%E8%A3%95%E4%BA%8C/dp/4890852425/ref=pd_bxgy_b_img_a" target="_blank">「高校生の勉強法」</a>という本を読んでみて、いかに今までの勉強の仕方が間違っていたか。。。というより、いかに「勉強の仕方」に無頓着だったかを痛感しました。</p>
<p><span id="more-81"></span></p>
<p>この「高校生の勉強法」っていう本。タイトルは高校生向けっぽいですが、受験本にありがちな「高校2年生までに一通りの試験範囲を勉強して、センター試験対策がナントカカントカ･･･」っていうようなものではなく、「脳の仕組みをかんたんに理解しながら、効率よくものごとを覚えたりするには、脳科学的にはどうしたら良いのか」っていうような事が書かれていますので、高校生だけでなく、それ以上の年齢の人にも役立つものになっています。（※著者も言及していましたが、中学生以下には向かない内容っぽいです。中学生までと高校生以上だと、ヒトは脳の使い方が違うらしいので。）</p>
<p>タイトルはなんだか硬派な感じですが、読みやすい易しい文章だし、挿絵や行間も多いし、ページ数も200ページも無いので、結構サックリと読めちゃいます。</p>
<p>読んでみると、色々な勉強の仕方のススメが書いてあるんですが、その中でも特に気になったのが「ヒトの脳は忘れることが得意なように作られている」という内容。脳で記憶できる量には限りがあって、例えば、いま見聞きしていること・モノを全て漏らさず脳に記憶できたとしたら、5分ほどでパンクしてしまうそうです。だから、本当に必要な情報以外は、全て忘れるように出来ているらしいです。</p>
<p>人が一度記憶したことを、どれだけの間覚えていられるのかということの統計を取った「忘却曲線」というものがあるんですが、それによると、</p>
<p><img class="alignleft size-full wp-image-155" style="margin-top: 10px; margin-bottom: 10px;" title="forget_graph1" src="http://www.creativegear.jp/wp-content/uploads/2009/03/forget_graph-thumb-300x192-63.png" alt="" width="300" height="192" /> 20分後には、覚えていたことは58%まで減り、</p>
<p>1時間後には、44%まで減り、<br />
1日後には、26%まで減り、<br />
1週間後には、23%まで減り、<br />
1ヶ月後には、21%まで減ってしまうみたい。</p>
<p>最初の20分で半分近くの情報を忘れてしまうことには驚き。でも、昨日の晩メシもすぐに思い出せないのも、これなら納得。</p>
<p>普通の人でもこれだけ忘れてしまうんだから、忘れっぽい僕なんかはきっと1ヶ月後に残ってるのは10%くらいなんだろうなぁ。。。(゜～゜)</p>
<p>せっかく勉強したことでも、何もせずにいたら1ヶ月後にはこれだけしか覚えてないって、なんだか残念というかモッタイナイというか。。。ひげぽんさんが、「復習しなかったらゼロなのだ」と言っていたのも、感覚的にだけでなく、統計的に見ても結構正しいんですね。</p>
<p>ただ、この「忘れてしまう」ということを、減らす方法があるんです。それが「何度も復習する」ということ。</p>
<p>脳は本当に必要な情報以外は、全て忘れる。とさっき書きましたけど、「本当に必要な情報」というのは一体どんな情報なのかというと、『生きていくために不可欠な情報』。</p>
<p>むかしむかし・・・他の動物同様、人間も生きていくので精一杯だった頃、「本当に必要な情報」というのは、「食べ物がどこにあるか。」とか、「安全な場所はどこか。」とか、そういった「生きていくために不可欠な情報」でした。</p>
<p>人類誕生の歴史から見ると、人間が生きていくこと以外のための活動をする「ゆとり」ができたのは、ごく最近のことですから、<br />
まだ人間の脳は「生きていくために不可欠な情報」しか記憶しない。っていう進化の上にいるわけです。</p>
<p>なので、やれ数学だの国語だの、昨日の晩メシだのと言った情報は、「どうでも良い情報」と解釈されてしまって、記憶に残らないってことのようですよ。</p>
<p>ただ、その「どうでも良い情報」も、何度も復習することで状況は変わってきます。何度も復習をすると、「こんなに何回もインプットされている情報なんだから、きっと生きていくために不可欠な重要な情報に違いない Σ(゜д゜)！」と、脳が勘違いをしてくれるようになるんだそうな。</p>
<p>中学、高校の頃って、先生から「しっかり復習しとけよ～！」とかって言われましたけど、あれは理に適ったことだったんですね。あー、できたらこの脳の仕組みを教えてくれた上で「しっかり復習しとけよ～！」って言って欲しかったなぁ。絶対学生の意識変わりますってば、先生。</p>
<p>ただ、ヤミクモに何度も復習するよりも、効率の良い復習方法というのがあるようで、それが以下のタイミングで復習をするというもの。</p>
<p>&nbsp;</p>
<p><img class="alignleft size-full wp-image-156" style="margin-top: 10px; margin-bottom: 10px;" title="ForgettingGraph2" src="http://www.creativegear.jp/wp-content/uploads/2009/03/ForgettingGraph2.gif" alt="" width="300" height="196" /></p>
<p>学習した翌日に1回目。<br />
1回目の復習から、1週間後に2回目。<br />
2回目の復習から、2週間後に3回目。<br />
3回目の復習から、1ヶ月後に4回目。</p>
<p>そうして復習していくと、「忘却曲線」は左図のようになります。たんだんと長期的な記憶として定着してくれるんですね。</p>
<p>やっぱり復習って大事なんだなぁ～。とヒシヒシと感じました。逆に復習していかないと、本当に最初に勉強したことがモッタイナイですよね。感覚的に必要性を感じていたことを、さらにこうして論理的にも必要性を説かれると、なんかもう逃げ場が無いですf(^^;)　これからは、ちゃんと復習することも勉強の計画にいれなきゃと思いました。</p>
<p>この本には、復習の必要性以外にも、「睡眠を取ること」や「感情や肉体的な動作と、記憶を関連付ける方法」など、効率的に勉強をしていくための様々なアドバイスが載っています。学生さんじゃなくてもオススメですので、興味がある方はぜひ読んでみて下さい。<br />
きっと損はしないと思いますよ(^-^)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.creativegear.jp/2009/03/20/study/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>lsのソースを読んでないのはプログラマとしてかなりまずいのではないでしょうか</title>
		<link>http://www.creativegear.jp/2009/03/07/ls_sorcecode/</link>
		<comments>http://www.creativegear.jp/2009/03/07/ls_sorcecode/#comments</comments>
		<pubDate>Fri, 06 Mar 2009 15:37:30 +0000</pubDate>
		<dc:creator>たけし</dc:creator>
				<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[FreeBSD]]></category>
		<category><![CDATA[UNIX]]></category>
		<category><![CDATA[オープンソース]]></category>

		<guid isPermaLink="false">http://www.creativegear.jp/wordpress/?p=92</guid>
		<description><![CDATA[ある程度プログラムが書けるようになったらば、次にするべきことは、他人の書いたプログラムを読むことである。･･･と、どっかで聞いた気がする。どこで聞いたのか見たのか覚えてないんですが、これって一理あると思うんですよね。 も [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-full wp-image-160" style="margin: 10px;" title="freebsd" src="http://www.creativegear.jp/wp-content/uploads/2009/03/freebsd.png" alt="" width="200" height="200" />ある程度プログラムが書けるようになったらば、次にするべきことは、他人の書いたプログラムを読むことである。･･･と、どっかで聞いた気がする。どこで聞いたのか見たのか覚えてないんですが、これって一理あると思うんですよね。</p>
<p>もっと突っ込んで言えば、他人の書いた良質なプログラムを読むことは、プログラムを書くことと同じぐらい。。。いや、それ以上に重要なプラクティスなのかも知れない。</p>
<p><span id="more-92"></span></p>
<div id="more">
<p>スポーツや武道、それだけじゃなく、将棋や囲碁、それに伝統芸能やモノ作りにいたるまで、まず最初に学ぶべきことは『基礎』です。野球なら正しいバッティング・投球のフォームを身に付けることだったり、将棋であれば定石を覚えることであったりと、初心者は必ず「基礎」を覚え、身に付けるところから入るものでしょう。プログラミングで言えば、プログラミング言語の構文を覚えたり、基本的なデータ構造やアルゴリズム等を勉強することが「基礎」に値するのだと思います。</p>
<p>そして基礎を学び、初心者から中級者への階段を上がるために必要なことは、上級者の技を見て、それを盗んでいくこと。スポーツなどでも、うまい人やプロの選手のテクニックを真似てみたり、伝統芸能やモノ作りにおいても、師の技を盗み、自分なりに消化・吸収していくことで、格段にレベルアップしていけるものでしょう。</p>
<p>プログラミングでは、それが「他人の書いた良質なプログラムを読むこと」に値するんじゃないかと思うんです。良質なプログラムを読むことで、そこで使われている技や知識を、盗んでいくことができるんじゃないかと。</p>
<p>最近、オープンソースのパケットキャプチャソフト「Wireshark」を改造しようと思い、ソースコードを読んでいたんですが、自分では思いも付かなかったロジックが使われているのを見て、非常に勉強になるなぁ～と感じました。世の中には数々のオープンソースソフトがあるんだから、読もうと思えば、いくらでも他人の書いた良質なコードを読むことができるんですよね。ホント、便利な世の中になったもんだ。。。</p>
<p>何かオープンソースのコードを読んで勉強をしよう！っと思ってたところで、ネットで以下の記事を見つけました。少し古い記事ですが、2006年の<a href="http://gihyo.jp/dev/clip/01/orangenews" target="_blank"><span style="color: #4c8ebf;">濃縮還元オレンジニュース</span></a>より。</p>
<blockquote><p><a href="http://gihyo.jp/dev/clip/01/orangenews/vol32/0004" target="_blank">『残念ながら休刊してしまった『日経バイト』（日経BP）の2006年1月号にて，</a></p>
<p><a href="http://gihyo.jp/dev/clip/01/orangenews/vol32/0004" target="_blank"> 書籍『ふつうのLinuxプログラミング』の著者である青木峰郎氏が</a></p>
<p><a href="http://gihyo.jp/dev/clip/01/orangenews/vol32/0004" target="_blank"> 「lsのソースを読んでないのはプログラマとしてかなりまずいのではないでしょうか」</a></p>
<p><a href="http://gihyo.jp/dev/clip/01/orangenews/vol32/0004" target="_blank"> と言及していました』</a></p></blockquote>
<p>マズイですか！？　　それも、かなりマズイですか！？　ごめんなさい、今すぐ読みますm(．_．;)m</p>
<p>ってのはまあ冗談ですが、lsのソースを読む･･･　いや、UNIXコマンドのソースコードを読むっていうのは、勉強するにはなかなか良い選択かも知れない。古くからオープンソースとして作られてきて、そして今なお世界中の人が使っているプログラムなわけですから、それは淘汰された先人の知恵が濃縮還元・果汁120%みたいなことになっていることでしょう。</p>
<p>よーし、UNIXコマンドのソースコードを読むぞ～(゜-゜)o　と意気込んでいたら、ちょうどそんな内容の本が出版されていることが分かり、またまたAmazonで購入しちゃいました。</p>
<p><a href="http://www.amazon.co.jp/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%83%86%E3%82%AF%E3%83%8B%E3%83%83%E3%82%AF%E2%80%95UNIX%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%AE%E3%82%BD%E3%83%BC%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AB%E3%81%BF%E3%82%8B%E5%AE%9F%E8%B7%B5%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E6%89%8B%E6%B3%95-UNIX-MAGAZINE-COLLECTION-%E5%A4%9A%E6%B2%BB%E8%A6%8B/dp/475614389X/ref=pd_sim_b_4" target="_blank">「プログラミングテクニック　～UNIXコマンドのソースコードにみる実践プログラミング手法～」</a></p>
<p><a rel="http://www.amazon.co.jp/gp/product/475614389X/ref=as_li_ss_tl?ie=UTF8&amp;tag=creativegear-22&amp;linkCode=as2&amp;camp=247&amp;creative=7399&amp;creativeASIN=475614389X" href="http://www.amazon.co.jp/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%83%86%E3%82%AF%E3%83%8B%E3%83%83%E3%82%AF%E2%80%95UNIX%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%AE%E3%82%BD%E3%83%BC%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AB%E3%81%BF%E3%82%8B%E5%AE%9F%E8%B7%B5%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E6%89%8B%E6%B3%95-UNIX-MAGAZINE-COLLECTION-%E5%A4%9A%E6%B2%BB%E8%A6%8B/dp/475614389X/ref=pd_sim_b_4" target="_blank"><img class="alignleft size-full wp-image-95" style="margin: 10px;" title="UNIXプログラミング" src="http://www.creativegear.jp/wordpress/wp-content/uploads/UNIXプログラミング.jpg" alt="" width="180" height="263" /></a></p>
<p>UNIXマガジンの連載をまとめた本のようなんですが、UNIXコマンドのソースコードを題材に、そこで使われているデータ構造やアルゴリズムなどのエッセンスを読み解いていくという内容です。</p>
<p>少し読んでみたんですが、内容はかなり濃い。「天下一品」のラーメンのスープぐらい濃い。正直、何回も読み直さないと理解が追いつかなかったです。（ただの実力不足か･･･；</p>
<p>あとは誌面の枠組みの都合上、ソースコードが一部しか掲載されていないのと、若干読みづらかったりするので、実際にUNIXコマンドのソースコードを、ネットでダウンロードしてきた方が良さそうでした。</p>
<p>濃縮還元オレンジニュースのページでも触れていますが、GNU版のソースコードは読みづらいです。FreeBSD版のソースコードの方が断然読みやすい。比べてみてみると、一目瞭然です。</p>
<p>FreeBSD版　lsコマンド：　<a href="http://www.freebsd.org/cgi/cvsweb.cgi/src/bin/ls/ls.c?rev=1.85.6.1;content-type=text%2Fplain" target="_blank">http://www.freebsd.org/cgi/cvsweb.cgi/src/bin/ls/ls.c?rev=1.85.6.1;content-type=text%2Fplain</a></p>
<p>GNU版　lsコマンド：　<a href="http://cvs.savannah.gnu.org/viewvc/*checkout*/coreutils/coreutils/src/ls.c?revision=1.471&amp;content-type=text%2Fplain" target="_blank">http://cvs.savannah.gnu.org/viewvc/*checkout*/coreutils/coreutils/src/ls.c?revision=1.471&amp;content-type=text%2Fplain</a></p>
<p>実際にFreeBSD版のソースコードを見ながら、本を読んでいくと、かなりの勉強になりそうです。</p>
<p>言語はC言語に特定されてしまいますが、アルゴリズムや知識を学ぶ上では、UNIXコマンドは最良の教材になり得るかも知れないですね。CGプログラミングの勉強がてら、ちょこちょこと読み進めてみます。</p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.creativegear.jp/2009/03/07/ls_sorcecode/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

