<?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>あるエンジニアの不定期勉強記録</title>
	<atom:link href="http://abalone.ununu.org/feed" rel="self" type="application/rss+xml" />
	<link>http://abalone.ununu.org</link>
	<description>あるエンジニアが不定期に技術を勉強した内容を備忘録的に記録していきます。</description>
	<lastBuildDate>Sat, 28 Jan 2012 17:08:02 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Python &#8211; スレッド</title>
		<link>http://abalone.ununu.org/archives/786</link>
		<comments>http://abalone.ununu.org/archives/786#comments</comments>
		<pubDate>Sat, 28 Jan 2012 17:03:36 +0000</pubDate>
		<dc:creator>Abalone</dc:creator>
				<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://abalone.ununu.org/?p=786</guid>
		<description><![CDATA[Pythonでもスレッドを作成してマルチスレッドプログラミングをすることが可能。前回の記事では、ファイルのバイナリ入出力をやってみると書いたが、必要にかられてこちらを先にやる。 マニュアルを見ると、Pythonでスレッド [...]]]></description>
			<content:encoded><![CDATA[<p>Pythonでもスレッドを作成してマルチスレッドプログラミングをすることが可能。前回の記事では、ファイルのバイナリ入出力をやってみると書いたが、必要にかられてこちらを先にやる。</p>
<p><span id="more-786"></span></p>
<p>マニュアルを見ると、Pythonでスレッドを作成するには、threadingモジュールを利用するのが簡便なようだ。threadモジュールを使って低レベルな操作もできるようだが、まずはthreadingモジュールを使ってやってみる。次のようなコードを書いてみた。</p>
<pre><code>
import time
import threading

class ThreadTest(threading.Thread):
    def run(self):
        print "Thread start."
        time.sleep(5)
        print "Thread end."

th = ThreadTest()
while True:
    th.start()
    th.join()
</code></pre>
<p>説明のため、行番号を付加したものを以下に示す。</p>
<pre><code>
 1: import time
 2: import threading
 3:
 4: class ThreadTest(threading.Thread):
 5:     def run(self):
 6:         print "Thread start."
 7:         time.sleep(5)
 8:         print "Thread end."
 9:
10: while True:
11:     th = ThreadTest()
12:     th.start()
13:     th.join()
</code></pre>
<p>1行目では、timeモジュールをimportしている。これはスレッド作成のために別に必須という訳ではない。テスト中、time.sleep()を使いたいからimportしているだけである。time.sleep()については、以前に書いたので<a href="http://abalone.ununu.org/archives/738" target="_blank">こちら</a>を参照して欲しい。</p>
<p>2行目が今回使おうとしているthreadingモジュールのimport。このモジュールをimportしておくことで、thredingモジュールのThreadクラスを継承したクラスを作成することが可能になる。このクラスの宣言が4行目である。</p>
<p>このThreadクラスには、run()メソッドが定義されているが、これを今回4行目から定義しているThreadTest()クラスでオーバーライドする。オーバーライドされたrun()メソッドにはスレッド内で実行する処理を記載する。</p>
<p>そのスレッド内での処理内容が6～8行目。ここではテストなので大した処理は行っていない。&#8221;Thread start.&#8221;と表示した後、5秒間待って、&#8221;Thread end.&#8221;を出力して終了するだけである。ここで、7行目のsleep()は、そのスレッドの実行を指定秒数停止することに注意。このスレッドを作成するメインのスレッドの処理は停止しない。</p>
<p>さて、メインの処理。10～13行目である。</p>
<p>10行目では、無限ループになるwhile文を書いてある。<br />
11行目でThreadTest()クラスのインスタンスを作成。12行目でそのインスタンスのstart()メソッドをコールしている。この呼び出しでThreadTestクラスのrun()メソッドが別スレッドで実行される。</p>
<p>13行目では、join()メソッドを実行している。このメソッドは、ThreadTestクラスのインスタンスである、thのrun()メソッドが終了するまで終了しない。つまり、スレッドの処理が終了するまで呼び出したスレッドが待ちたいときに呼び出すメソッド。</p>
<p>13行目のjoin()が必要な理由は、10行目で無限ループにしているので、thインスタンス側のスレッドが終了するまで待たないと、スレッドが大量に作成されてしまうため。実際このプログラムを実行すると、以下のような出力が得られる。無限ループなので、Ctrl+C等で停止する必要がある。</p>
<p><code>
<pre>
Thread start.
Thread end.
Thread start.
Thread end.
Thread start.
Thread end.
Thread start.
Thread end.
</pre>
<p></code></p>
<p>13行目をコメントアウトして実行してみると、大変なことになる。なかなか停止もできないので、テスト目的以外で実施するはお勧めしない。</p>
<p>これ以外にも、処理内容によっては、マルチスレッドプログラムを作るときに考えなくてはならないことはたくさんある。まずは、実行するには、threading.Threadクラスを継承したサブクラスを作ること。そのサブクラスのrun()メソッドをオーバーライドしたメソッドを作ること。<br />
ここまでやったら、そのサブクラスをインスタンス化して、start()メソッドを呼び出すと、サブクラスでオーバーライドしたrun()メソッドが別スレッドで実行される。</p>
<p>マルチスレッドプログラミングをするには他にも勉強しないといけないことがたくさんありそうだが、まずはここまで。</p>
]]></content:encoded>
			<wfw:commentRss>http://abalone.ununu.org/archives/786/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Python &#8211; ファイル入出力 ファイルへのテキスト書き込み</title>
		<link>http://abalone.ununu.org/archives/784</link>
		<comments>http://abalone.ununu.org/archives/784#comments</comments>
		<pubDate>Sun, 15 Jan 2012 16:18:35 +0000</pubDate>
		<dc:creator>Abalone</dc:creator>
				<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://abalone.ununu.org/?p=784</guid>
		<description><![CDATA[前回は、テキストファイルからの読み込みをやってみた。 今回はファイルにテキスト書き込みをやってみる。 ファイルをオープンするのに使うのは、読み込みと同じopen()メソッド。第二引数で指定するモードで読み込み、書き込みを [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://abalone.ununu.org/archives/779">前回</a>は、テキストファイルからの読み込みをやってみた。</p>
<p>今回はファイルにテキスト書き込みをやってみる。</p>
<p><span id="more-784"></span></p>
<p>ファイルをオープンするのに使うのは、読み込みと同じopen()メソッド。第二引数で指定するモードで読み込み、書き込みを指定する。<br />
読み込みの時は&#8217;r',書き込みの時は&#8217;w'を指定する。例えば以下のような感じ。</p>
<pre><code>
fp = open('test.txt','w')
</code></pre>
<p>これで、test.txtが書き込みようにオープンされる。実際に書き込んでみる。</p>
<pre><code>
fp = open('test.txt','w')
</code></pre>
<p>これで一旦クローズしてみる。</p>
<pre><code>
fp.close()
</code></pre>
<p>ファイルの内容を確認すると以下の通り。</p>
<pre><code>
This is a test.
</code></pre>
<p>ここで、この書き込まれた内容には改行コードが含まれていないことに注意。改行コードは必要なら自分で加える。</p>
<pre><code>
fp.write('This is a test.\n')
</code></pre>
<p>こうすると改行コードも書き込まれる。</p>
<p><code>
<pre>
This is a test.
</pre>
<p></code></p>
<p>とは言ってもウェブ上だと同じにしか見えないかもしれない。テキストエディタで開くと確かに改行コードは書き込まれている。</p>
<p>もう一つ重要な注意点があって、ファイルのオープン時に、&#8217;w'を指定した場合、ファイルは書き込み用でオープンされるが、その時、同名のファイルがすでに存在した場合、内容が上書きされる。<br />
そうすると元々そのファイルに書き込まれていた内容は消えてなくなってしまうので、プログラム作成時に十分な注意が必要。</p>
<p>これだとファイルの更新がやりづらいので、モードに&#8217;a'を指定して開く。</p>
<p><code>
<pre>
fp = open('test.txt','w')
fp.write('This is a test.\n')
fp.close()
fp = open('test.txt','a')
fp.write('Additional Texts\n')
fp.close()
</pre>
<p></code></p>
<p>このコードを実行するとファイルの内容は次のようになる。</p>
<p><code>
<pre>
This is a test.
Additional Texts
</pre>
<p></code></p>
<p>きちんとファイルに追記されているのが分かる。</p>
<p>もう一つが、writelines()メソッド。複数行を一気に書き込むメソッド。引数には、文字列を要素とするシーケンスを引き渡す。</p>
<p>まず、文字列を要素とするリストを作成する。</p>
<p><code>
<pre>
str = ['Line 1\n', 'Line 2\n', 'Line 3\n']
</pre>
<p></code></p>
<p>これをファイルオブジェクトのwritelines()で書き込む。</p>
<p><code>
<pre>
fp = open('test.txt','w')
fp.writelines(str)
fp.close()
</pre>
<p></code></p>
<p>これでファイルは以下の内容が書き込まれる。</p>
<p><code>
<pre>
Line 1
Line 2
Line 3
</pre>
<p></code></p>
<p>ここでも注意する点は、改行コード。改行コードは自動では書き込まれない。例えば以下のコードを書いてみる。今回はシーケンス型としてリストではなくてタプルをつかってみる。</p>
<p><code>
<pre>
str = ('Line 1','Line 2','Line 3')
fp = open('test.txt','w')
fp.writelines(str)
fp.close()
</pre>
<p></code></p>
<p>これを実行すると、ファイルの内容は以下の通りになる。</p>
<p><code>
<pre>
Line 1Line 2Line 3
</pre>
<p></code></p>
<p>改行コードが入っていないので全部1行に書き込まれてしまっている。改行コードを最後に追加しないとこうなってしまうので注意。</p>
<p>というわけで、テキストファイルへの書き込みは以上。次回はバイナリファイルの読み書きをやってみようと思う。</p>
]]></content:encoded>
			<wfw:commentRss>http://abalone.ununu.org/archives/784/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Python &#8211; ファイル入出力 テキストファイルの読み込み</title>
		<link>http://abalone.ununu.org/archives/779</link>
		<comments>http://abalone.ununu.org/archives/779#comments</comments>
		<pubDate>Sun, 08 Jan 2012 12:16:32 +0000</pubDate>
		<dc:creator>Abalone</dc:creator>
				<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://abalone.ununu.org/?p=779</guid>
		<description><![CDATA[ファイルをopenする方法は前回書きました。 そこで、開いたテキストファイルから読み込みをやってみます。 まず、test.txtのファイル名でテキストファイルを作成しておきます。テキストエディタか何かで作成すればいいです [...]]]></description>
			<content:encoded><![CDATA[<p>ファイルをopenする方法は前回書きました。<br />
そこで、開いたテキストファイルから読み込みをやってみます。</p>
<p><span id="more-779"></span></p>
<p>まず、test.txtのファイル名でテキストファイルを作成しておきます。テキストエディタか何かで作成すればいいです。</p>
<p><code>
<pre>
Line 1
Line 2
Line 3
Line 4
Line 5
</pre>
<p></code></p>
<p>とりあえずこの5行を書き込んだファイルを作成して、読み込んでみます。</p>
<p>まず、open()でファイルを開きます。</p>
<p><code>
<pre>
fp = open('test.txt', 'r')
</pre>
<p></code></p>
<p>open()の第2引数には&#8217;r'を指定、読み込み用でオープンします。とりあえず読み込みしかしないので、読み込み用でオープンしておくことで、誤って書き込んで内容を破壊してしまうことを防ぎます。というほどのことでもないのですが、読み込みの時は読み込みモードでオープン。</p>
<p>テキストファイルの読み込みには、readline()メソッド、readlines()メソッドを使用します。まず、readline()。以下のコードを実行。</p>
<p><code>
<pre>
fp = open('test.txt', 'r')
print fp.readline()
fp.close()
</pre>
<p></code></p>
<p>出力結果は以下の通り。最初の1行が読み込まれて、print で表示されてます。使い終わったら忘れずにclose()。</p>
<p><code>
<pre>
Line 1
</pre>
<p></code></p>
<p>readline()は、繰り返せば次の行を読み込んでくれます。</p>
<p><code>
<pre>
fp = open('test.txt', 'r')
print fp.readline()
print fp.readline()
fp.close()
</pre>
<p></code></p>
<p>この出力結果は以下の通り。</p>
<p><code>
<pre>
Line 1

Line 2
</pre>
<p></code></p>
<p>ここでポイントは、出力結果に改行が含まれていることでしょうか。readline()は、行末の改行コードも含めて読み込みます。</p>
<p>複数行まとめて読み込むにはreadlines()メソッド。次のようなコードを書いてみます。</p>
<p><code>
<pre>
fp = open('test.txt', 'r')
lines = fp.readlines()
print lines
fp.close()
</pre>
<p></code></p>
<p>これを実行すると、以下の出力結果が得られます。</p>
<p><code>
<pre>
['Line 1\n', 'Line 2\n', 'Line 3\n', 'Line 4\n', 'Line 5\n']
</pre>
<p></code></p>
<p>各行が要素のリストが返却されます。何行目まで読み込まれるかというと、マニュアルによれば、EOFを読み込むまでとなっています。ファイルサイズによらず全部読み込むんじゃないだろうかと思われますが、そんなに大きなファイルで試したことがないので、どのくらいまで読み込めるのかは不明。</p>
<p>で、1行ずつ読み込んで処理したい場合等の状況も多いかと。この場合には、for文とreadline()を使うと1行ずつ読み込んで処理できます。</p>
<p><code>
<pre>
fp = open('test.txt', 'r')
for line in fp:
    print line
fp.close()
</pre>
<p></code></p>
<p>このコードは、open()で作成したファイルオブジェクトfpから1行ずつ読み込んで処理をしていきます。出力結果は以下の通り。</p>
<p><code>
<pre>
Line 1

Line 2

Line 3

Line 4

Line 5
</pre>
<p></code></p>
<p>1行ずつ読み込んでprintで出力されています。さらに、with節を使うと、close()しなくてもよいらしいです。以下のようなコードを書いてみます。</p>
<p><code>
<pre>
with open('test.txt', 'r') as fp:
    for line in fp:
        print line
</pre>
<p></code></p>
<p>出力結果はこの前のコード例と全く同じ。マニュアルによると、この構文はPython2.5以降で使えるとされています。こんな構文もあったんだなぁ。</p>
<p>次回はテキストファイルへの書き込みをやってみます。</p>
]]></content:encoded>
			<wfw:commentRss>http://abalone.ununu.org/archives/779/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Python &#8211; ファイル入出力</title>
		<link>http://abalone.ununu.org/archives/775</link>
		<comments>http://abalone.ununu.org/archives/775#comments</comments>
		<pubDate>Sun, 25 Dec 2011 15:48:17 +0000</pubDate>
		<dc:creator>Abalone</dc:creator>
				<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://abalone.ununu.org/?p=775</guid>
		<description><![CDATA[大抵のプログラム言語でファイルへの入出力は可能でしょう。Pythonでももちろん可能。 組み込み関数のopen()を使用する。 open()は組み込み関数なんだが、ファイルを閉じるときにはファイルオブジェクトのclose [...]]]></description>
			<content:encoded><![CDATA[<p>大抵のプログラム言語でファイルへの入出力は可能でしょう。Pythonでももちろん可能。<br />
組み込み関数のopen()を使用する。</p>
<p><span id="more-775"></span></p>
<p>open()は組み込み関数なんだが、ファイルを閉じるときにはファイルオブジェクトのclose()メソッドを呼ぶ。</p>
<p>何でだろうなぁ、と思っていたので調査。と言ってもマニュアルを読んだくらいだけど。</p>
<p>組み込み関数open()は、ファイルオブジェクトを返却する。実はどうもファイルオブジェクトを直接作ることも可能らしい。</p>
<pre><code>
fp = file('test.txt','w')
fp.close()
</code></pre>
<p>これでもファイルは作成される。作成されるファイルは、ファイル名 &#8220;test.txt&#8221;、書き込みモードでオープンされる。</p>
<p>ここで呼び出しているfile()は、ファイル型のコンストラクタ。ファイル型のオブジェクトを作成することでファイルがオープンできるという仕組み。</p>
<p>これでも開けるのだが、マニュアルによると、組み込み関数open()を使うことが好ましいとされていて、file型は、コンストラクタを呼び出すような使い方よりも、例えばisinstance()等で使用して型を確認する等の用途により適している、とされている(そういう風に使うべきと書かれているように読める)。されているのだが、残念ながら理由は書いてない。</p>
<p><code>
<pre>
fp = open('test.txt','w')
fp.close()
</pre>
<p></code></p>
<p>書いてないけど、マニュアルにそう書いてあるので、とりあえずこう書いた方が良さそうだ。</p>
<p>こんな感じで作成したファイルオブジェクトを介して書き込みが可能になる。しかし、なんでfile型のコンストラクタを使わない方がいいのだろう。組み込み関数なのでopen()の方が早い、ってことなんだろうか。</p>
<p>とりあえず、実際の読み書きはまた次回。</p>
]]></content:encoded>
			<wfw:commentRss>http://abalone.ununu.org/archives/775/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Safari のテキスト入力フィールドが・・・</title>
		<link>http://abalone.ununu.org/archives/772</link>
		<comments>http://abalone.ununu.org/archives/772#comments</comments>
		<pubDate>Wed, 23 Nov 2011 08:50:57 +0000</pubDate>
		<dc:creator>Abalone</dc:creator>
				<category><![CDATA[Macintosh]]></category>

		<guid isPermaLink="false">http://abalone.ununu.org/?p=772</guid>
		<description><![CDATA[私はMacintoshではウェブブラウザにSafariを利用しているのだが、いつ頃からかテキスト入力フィールドへの入力がおかしくなった。 どうも日本語の文章を入力しようとすると前の画面に戻ってしまうようなのだ。 大分使い [...]]]></description>
			<content:encoded><![CDATA[<p>私はMacintoshではウェブブラウザにSafariを利用しているのだが、いつ頃からかテキスト入力フィールドへの入力がおかしくなった。<br />
どうも日本語の文章を入力しようとすると前の画面に戻ってしまうようなのだ。</p>
<p><span id="more-772"></span></p>
<p>大分使い勝手が悪く、仕方ないのでFirefoxを使ったりCaminoを使ったりしていたのだが、どうにもやはり使いづらい。</p>
<p>なんでだろうと思っていたのだが、どうも日本語IMEを切り替えると直るようだ。普段はATOK2008を利用しているのだが、試しにことえりにしてみたら普通に入力できるようになった。</p>
<p>ただ、やはりATOKを使い体ので、これはどちらが修正されるのを待てばいいのかな・・・。</p>
]]></content:encoded>
			<wfw:commentRss>http://abalone.ununu.org/archives/772/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>EmEditor &#8211; 2 ストロークショートカットキーを使う</title>
		<link>http://abalone.ununu.org/archives/765</link>
		<comments>http://abalone.ununu.org/archives/765#comments</comments>
		<pubDate>Mon, 15 Aug 2011 17:46:33 +0000</pubDate>
		<dc:creator>Abalone</dc:creator>
				<category><![CDATA[EmEditor]]></category>

		<guid isPermaLink="false">http://abalone.ununu.org/?p=765</guid>
		<description><![CDATA[このブログに記事を書くときのテスト、勉強とかにはMacintoshを使うことが多いのだが、仕事ではWindowsを利用している。そのため、使うテキストエディタは結局EmEditorが一番多い。 EmEditorを使ってい [...]]]></description>
			<content:encoded><![CDATA[<p>このブログに記事を書くときのテスト、勉強とかにはMacintoshを使うことが多いのだが、仕事ではWindowsを利用している。そのため、使うテキストエディタは結局EmEditorが一番多い。</p>
<p><span id="more-765"></span></p>
<p>EmEditorを使っていて、できるといいのになぁ、と思っていたのが2ストロークショートカット。元々私はEmacsで仕事をしていたので、これができるとできないでは大分作業効率が変わってきてしまう。</p>
<p>何か方法はないのかと思ってググってみたところ、Emacsほど柔軟ではないけれど、設定できるじゃないですか。どのバージョンからできるようになったんだろう。EmEditorのホームページのFAQに書いてあった。</p>
<p><a href="http://jp.emeditor.com/help/faq/customize/customize_twokeystroke.htm" target="_blank">Q. 2 ストローク キーのショートカットを定義するには?</a></p>
<p>ここの説明がちょっと私には分かりにくかったのだけれど、要するに、</p>
<p>ユーザー定義メニューをショートカットで開けるように設定(ここはシングルストローク)<br />
そのメニューの中の項目を追加<br />
その追加した項目にショートカットキーを設定する(ここもここだけみるとシングルストロークだ)</tr>
<p>で設定できると書いてあるのだ。最初のキー入力で、メニューが開く、その次のキー入力でメニュー中の項目を実行だから、確かにこれで2ストロークショットカットを実現できるか。実際やってみたら自作のマクロをツーストロークキーで実行できた。上にも書いたとおり、Emacsほどは柔軟には設定できない(Emacsではツーストローク目もCtrl+Xとか、Alt+Xとかにできるけれど、EmEditorではどうもできないっぽい)。ただ、それでも非常に使いやすくなった。</p>
<p>以前のバージョンで私はツーストロークキーを実現するため、自前のマクロを書いて使っていた。あんまりきちんと作らなかった私がいけないのだろうが、設定変更が結構面倒くさくて、作った物のあまり使ってなかったのだが、それよりはもちろん余程よい。</p>
<p>EmEditorをこれからも使っていくと思うので、何かあれば記事を上げていくとします。</p>
]]></content:encoded>
			<wfw:commentRss>http://abalone.ununu.org/archives/765/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>シェルスクリプト &#8211; ファイルにスクリプトを記述する -</title>
		<link>http://abalone.ununu.org/archives/762</link>
		<comments>http://abalone.ununu.org/archives/762#comments</comments>
		<pubDate>Tue, 26 Apr 2011 16:24:39 +0000</pubDate>
		<dc:creator>Abalone</dc:creator>
				<category><![CDATA[ShellScript]]></category>

		<guid isPermaLink="false">http://abalone.ununu.org/?p=762</guid>
		<description><![CDATA[実際にシェルスクリプトを使う場面というと、実際にシェルを使って何か作業しながらいきなりスクリプトを使うケースなんかもあると思うのだが、ファイルにスクリプトを記述して作成するケースが多いのじゃないだろうか。 実際にファイル [...]]]></description>
			<content:encoded><![CDATA[<p>実際にシェルスクリプトを使う場面というと、実際にシェルを使って何か作業しながらいきなりスクリプトを使うケースなんかもあると思うのだが、ファイルにスクリプトを記述して作成するケースが多いのじゃないだろうか。<br />
実際にファイルにスクリプトを書いて実行してみる。</p>
<p><span id="more-762"></span></p>
<p>実際は前回デバッグする方法を先に書いてしまったのだが、こちらを先に書くべきだった。</p>
<p>さて、以下の内容でファイルを&#8221;test.sh&#8221;という名称で作成する。たった一行である。</p>
<pre><code>
echo "Test Script !!"
</code></pre>
<p>今回は実行するだけなので、ここでは内容は何でもいい。適当にechoコマンドを書いておく。</p>
<p>これを実行するには、sh、またはbashのコマンドラインに引数として渡す。</p>
<pre><code>
bash-3.2$ sh ./test.sh
Test Script !!
bash-3.2$ bash ./test.sh
Test Script !!
</code></pre>
<p>これで実行できる。他にオプションもあるのだが、とりあえずはこれで実行できるので、今回はこれでいいとする。</p>
<p>もう一つの実行方法は、ご存じの方がほとんどじゃないかと思うのだが、イゲタビックリ、つまり#!を書いて、実行するシェルのパスを書いておくこと。上のtest.shを以下のように書き換える。</p>
<pre><code>
#!/bin/sh

echo "Test Script !!"
</code></pre>
<p>このままだと実行できないので、test.shに実行属性を付加する。</p>
<pre><code>
chmod +x ./test.sh
</code></pre>
<p>これで実行属性を付加した後、単に./test.shとタイプすれば実行される。</p>
<pre><code>
bash-3.2$ ./test.sh
Test Script !!
</code></pre>
<p>一行目は、#!/bin/sh ではなくて #!/bin/bash と書いてもよい。</p>
<p>これ、皆さんご存じの方が多いと思うのだが、書かないわけにもいかないので、今回書いた。<br />
次回は、特殊変数について勉強してみようと思っている。</p>
]]></content:encoded>
			<wfw:commentRss>http://abalone.ununu.org/archives/762/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Windows7 &#8211; PowerDVD7 Vista ハイビジョンシアターをインストール</title>
		<link>http://abalone.ununu.org/archives/760</link>
		<comments>http://abalone.ununu.org/archives/760#comments</comments>
		<pubDate>Sat, 23 Apr 2011 09:26:27 +0000</pubDate>
		<dc:creator>Abalone</dc:creator>
				<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://abalone.ununu.org/?p=760</guid>
		<description><![CDATA[Windows7 をインストールした PC でも DVD を見たいなと思って、昔買って使わなくなっていたPowerDVD7 Vista ハイビジョンシアターを Windows7 にインストールしてみた。 今使っている W [...]]]></description>
			<content:encoded><![CDATA[<p>Windows7 をインストールした PC でも DVD を見たいなと思って、昔買って使わなくなっていたPowerDVD7 Vista ハイビジョンシアターを Windows7 にインストールしてみた。</p>
<p><span id="more-760"></span></p>
<p>今使っている Windows7 は 64bit 版だし、インストールしようとしている PowerDVD7 は、Windows7 発売前にリリースされたものだし、果たして動作するかな、と少し心配していたのだが。</p>
<p>特にインストール時におかしな動きをするでもなく、普通にスンナリ動きました。これで DVD を見られる。</p>
]]></content:encoded>
			<wfw:commentRss>http://abalone.ununu.org/archives/760/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Windows7 &#8211; 電源ボタンの動作を変える</title>
		<link>http://abalone.ununu.org/archives/757</link>
		<comments>http://abalone.ununu.org/archives/757#comments</comments>
		<pubDate>Sun, 03 Apr 2011 14:33:36 +0000</pubDate>
		<dc:creator>Abalone</dc:creator>
				<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://abalone.ununu.org/?p=757</guid>
		<description><![CDATA[最近ある理由でWindows7を使うことが実は増えていて。 いろいろ快適に使えるようにしていきたい、というところなのだが、結構困るのが、スタートメニューの電源ボタンの動作。デフォルトでシャットダウンになっている。 あまり [...]]]></description>
			<content:encoded><![CDATA[<p>最近ある理由でWindows7を使うことが実は増えていて。<br/><br />
いろいろ快適に使えるようにしていきたい、というところなのだが、結構困るのが、スタートメニューの電源ボタンの動作。デフォルトでシャットダウンになっている。</p>
<p><span id="more-757"></span></p>
<p>あまりログオフしたり、ユーザーをスイッチしたりして使わない場合には大したことはないのかもしれないが、そういう使い方をしていると、ちょっと間違ってボタンクリックでいきなりシャットダウンされてしまう。</p>
<p>これはちょっと不便なので変更方法を探してみた。実際に何度か間違えてシャットダウンしてしまったこともあるし・・・。</p>
<p>と、探すまでもなく変更方法はすぐに見つかった・・・。</p>
<p>スタートボタン上で右クリックし、表示されたメニューからプロパティをクリック。<br />
[スタート]メニュータブにある、電源ボタンの操作、で変更可能。</p>
<p>色々選択できるので、私はスリープに変更した。シャットダウンではなく、スリープであれば、間違えてクリックしてしまっても大事にはならない。スリープするだけなので、再度起こせば元通り。<br />
離席時とかにこまめにスリープにすることで節電にもなり、いいかな、と思ってデフォルト動作をスリープとした。</p>
<p>なんであんな押しやすいところにシャットダウンがあるのだろう、と思っていたところなので、まずはメデタシ。<br />
さらに使いやすくカスタマイズしていきたい。</p>
]]></content:encoded>
			<wfw:commentRss>http://abalone.ununu.org/archives/757/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>シェルスクリプト &#8211; デバッグ -</title>
		<link>http://abalone.ununu.org/archives/755</link>
		<comments>http://abalone.ununu.org/archives/755#comments</comments>
		<pubDate>Sat, 02 Apr 2011 17:37:54 +0000</pubDate>
		<dc:creator>Abalone</dc:creator>
				<category><![CDATA[ShellScript]]></category>

		<guid isPermaLink="false">http://abalone.ununu.org/?p=755</guid>
		<description><![CDATA[シェルスクリプトを書いていく上でデバッグを行わなければならないことももちろんあります。 特に他人が書いたスクリプトがうまく動かない場合とか、内部の動作を確認して修正しなければならない場合など、デバッグする方法がないと大分 [...]]]></description>
			<content:encoded><![CDATA[<p>シェルスクリプトを書いていく上でデバッグを行わなければならないことももちろんあります。<br />
特に他人が書いたスクリプトがうまく動かない場合とか、内部の動作を確認して修正しなければならない場合など、デバッグする方法がないと大分面倒なことになります。</p>
<p><span id="more-755"></span></p>
<p>デバッグプリントを仕込む方法でも、もちろんいいのですが、シェルスクリプトには実行時トレースを出力する機能があります。トレース機能を ON/OFF するには、&#8221;set -x&#8221; と &#8220;set +x&#8221; を使います。例えば、以下のような単純なスクリプトを考えます。</p>
<pre><code>
#!/bin/sh

echo 1
echo 2
echo 4
echo 7
</code></pre>
<p>実行すると以下のような出力になります。</p>
<pre><code>
1
2
4
7
</code></pre>
<p>単純なスクリプトなので、出力結果はすぐに予想できますが、もっと複雑なスクリプトの出力だと思ってください。でも、期待している出力は以下の物だったとします。</p>
<pre><code>
1
2
4
8
</code></pre>
<p>ま、元は単純なスクリプトなのでなぜ最後の出力が7になっているのかはすぐに分かります。実際7を出力してるし。でも、これがもっと複雑なスクリプトだとして、何かの計算結果だとするとなかなか分からなかったりする、かもしれません。そんなときに&#8221;set -x&#8221;と&#8221;set +x&#8221;を使います。</p>
<pre><code>
#!/bin/sh

set -x

echo 1
echo 2
echo 4
echo 7

set +x
</code>
<pre>

これを実行すると出力は以下のようになります。
<pre><code>
+ echo 1
1
+ echo 2
2
+ echo 4
4
+ echo 7
7
+ set +x
</code></pre>
<p>これで、7が出力されているのは"echo 7"のせいだと分かるので、ここを直せばいいということになります。ここで、"set -x"自身は出力されていませんが、"set +x"は出力されていることに注意します。これは、"set +x"が実行された後はトレース出力されなくなるため、これが出力されないとトレースが終了したのか、単に何も出力されていないのかが分からなくなるためです。<br /><br  /><br />
例えば、"set +x"をスクリプトの最後ではなく、真ん中辺りに書いてみます。</p>
<pre><code>
#!/bin/sh

set -x

echo 1
echo 2
set +x
echo 4
echo 7
</code></pre>
<p>こうすると出力は以下のようになります。"set +x"が出力されて以降、トレースは出力されません。</p>
<p><code>
<pre>
+ echo 1
1
+ echo 2
2
+ set +x
4
7
</code></pre>
<p>こんな感じで、さすがにデバッガはありませんが、トレース出力を見てデバッグを行うことができます。</p>
]]></content:encoded>
			<wfw:commentRss>http://abalone.ununu.org/archives/755/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

