<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="rss.css" type="text/css"?>
<rdf:RDF xmlns="http://purl.org/rss/1.0/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:xhtml="http://www.w3.org/1999/xhtml" xml:lang="ja-JP">
	<channel rdf:about="http://www.nofuture.tv/diary/index.rdf">
	<title>Days of Speed</title>
	<link>http://www.nofuture.tv/diary/</link>
	<xhtml:link xhtml:rel="alternate" xhtml:media="handheld" xhtml:type="text/html" xhtml:href="http://www.nofuture.tv/diary/" />
	<description></description>
	<dc:creator>Jun NOGATA</dc:creator>
	<dc:rights>Copyright 2013 Jun NOGATA &lt;nogajun+diary@gmail.com&gt;, copyright of comments by respective authors</dc:rights>
	<items><rdf:Seq>
<rdf:li rdf:resource="http://www.nofuture.tv/diary/20130426.html#c03"/>
<rdf:li rdf:resource="http://www.nofuture.tv/diary/20130426.html#c02"/>
<rdf:li rdf:resource="http://www.nofuture.tv/diary/20130426.html#c01"/>
<rdf:li rdf:resource="http://www.nofuture.tv/diary/20130507.html#p02"/>
<rdf:li rdf:resource="http://www.nofuture.tv/diary/20130507.html#p01"/>
<rdf:li rdf:resource="http://www.nofuture.tv/diary/20130506.html#p02"/>
<rdf:li rdf:resource="http://www.nofuture.tv/diary/20130426.html#p02"/>
<rdf:li rdf:resource="http://www.nofuture.tv/diary/20130426.html#p01"/>
<rdf:li rdf:resource="http://www.nofuture.tv/diary/20130505.html#p01"/>
<rdf:li rdf:resource="http://www.nofuture.tv/diary/20130506.html#p01"/>
<rdf:li rdf:resource="http://www.nofuture.tv/diary/20130408.html#p02"/>
<rdf:li rdf:resource="http://www.nofuture.tv/diary/20130408.html#p01"/>
<rdf:li rdf:resource="http://www.nofuture.tv/diary/20130331.html#p01"/>
<rdf:li rdf:resource="http://www.nofuture.tv/diary/20130329.html#p02"/>
<rdf:li rdf:resource="http://www.nofuture.tv/diary/20130329.html#p01"/>
</rdf:Seq></items>
</channel>
<item rdf:about="http://www.nofuture.tv/diary/20130426.html#c03">
<link>http://www.nofuture.tv/diary/20130426.html#c03</link>
<dc:date>2013-05-12T23:22:25+09:00</dc:date>
<title>2013-04-26のツッコミ[3] (nogajun)</title>
<dc:creator>nogajun</dc:creator>
<description>ガラケー世代の人で携帯は使えるけどPCは使えない人がいた、という話しは聞いていたけれど、スマホになっても変わらないのかなーと思いましたよ。  &gt; タイピングの練習を高校の授業ではするようにしています。   おお!それはありがたい。  # 高校で情報を受けてるから慣れてるのかなーと思いきや、興味のない人は授業でしかPCに触らないし、触る頻度も授業だけなので全然覚えてないらしい…</description>
<content:encoded><![CDATA[ガラケー世代の人で携帯は使えるけどPCは使えない人がいた、という話しは聞いていたけれど、スマホになっても変わらないのかなーと思いましたよ。<br><br>&gt; タイピングの練習を高校の授業ではするようにしています。 <br><br>おお!それはありがたい。<br><br># 高校で情報を受けてるから慣れてるのかなーと思いきや、興味のない人は授業でしかPCに触らないし、触る頻度も授業だけなので全然覚えてないらしい…]]></content:encoded>
</item>
<item rdf:about="http://www.nofuture.tv/diary/20130426.html#c02">
<link>http://www.nofuture.tv/diary/20130426.html#c02</link>
<dc:date>2013-05-11T13:30:22+09:00</dc:date>
<title>2013-04-26のツッコミ[2] (takaya)</title>
<dc:creator>takaya</dc:creator>
<description>s/打てることが/打てる子が/</description>
<content:encoded><![CDATA[s/打てることが/打てる子が/]]></content:encoded>
</item>
<item rdf:about="http://www.nofuture.tv/diary/20130426.html#c01">
<link>http://www.nofuture.tv/diary/20130426.html#c01</link>
<dc:date>2013-05-11T13:29:36+09:00</dc:date>
<title>2013-04-26のツッコミ[1] (takaya)</title>
<dc:creator>takaya</dc:creator>
<description>少し前まではキーボード打てることが多かったのですが， 最近はスマホなどの影響でキーボードの配列が分からない子が増えてますね。 そのため，タイピングの練習を高校の授業ではするようにしています。</description>
<content:encoded><![CDATA[少し前まではキーボード打てることが多かったのですが，<br>最近はスマホなどの影響でキーボードの配列が分からない子が増えてますね。<br>そのため，タイピングの練習を高校の授業ではするようにしています。]]></content:encoded>
</item>
<item rdf:about="http://www.nofuture.tv/diary/20130507.html#p02">
<link>http://www.nofuture.tv/diary/20130507.html#p02</link>
<xhtml:link xhtml:rel="alternate" xhtml:media="handheld" xhtml:type="text/html" xhtml:href="http://www.nofuture.tv/diary/20130507.html#p02" />
<dc:date>2013-05-07T12:35:33+09:00</dc:date>
<title>zerofreeを使うとかなりファイルサイズがかなり縮む</title>
<dc:creator>Jun NOGATA</dc:creator>
<dc:subject>linux</dc:subject>
<dc:subject>virtualbox</dc:subject>
<description>Debian -- sid の zerofree パッケージに関する詳細: http://packages.debian.org/ja/sid/zerofree Keeping filesystem images sparse: http://intgat.tigress.co.uk/rmy/uml/index.html  zerofreeというのは、ext2/3/4用のファイルシステムの空き領域をゼロクリアするツールです。 Vagrantのboxを上のような感じで何も考えず作ると、だいたい400〜500MBになりますが、zerofreeで空き領域をクリアするとかなり縮みます。 $ ls -lah 合計 724M drwxr-xr-x   2 jun jun 4.0K  5月  7 12:20 . drwxr-xr-x 241 jun jun  20K  5月  7 12:20 .. -rw-r--r--   1 jun jun 3.9K  5月  7 11:36 Vagrantfile -rw-r--r--   1 jun jun 277M  5月  7 11:18 packag..</description>
<content:encoded><![CDATA[<h3>zerofreeを使うとかなりファイルサイズがかなり縮む</h3><!-- google_ad_section_start -->
<ul>
<li>Debian -- sid の zerofree パッケージに関する詳細: <a href="http://packages.debian.org/ja/sid/zerofree">http://packages.debian.org/ja/sid/zerofree</a></li>
<li>Keeping filesystem images sparse: <a href="http://intgat.tigress.co.uk/rmy/uml/index.html">http://intgat.tigress.co.uk/rmy/uml/index.html</a></li>
</ul>
<p>zerofreeというのは、ext2/3/4用のファイルシステムの空き領域をゼロクリアするツールです。
Vagrantのboxを上のような感じで何も考えず作ると、だいたい400〜500MBになりますが、zerofreeで空き領域をクリアするとかなり縮みます。</p>
<pre>$ ls -lah
合計 724M
drwxr-xr-x   2 jun jun 4.0K  5月  7 12:20 .
drwxr-xr-x 241 jun jun  20K  5月  7 12:20 ..
-rw-r--r--   1 jun jun 3.9K  5月  7 11:36 Vagrantfile
-rw-r--r--   1 jun jun 277M  5月  7 11:18 package.box
-rw-r--r--   1 jun jun 448M  5月  6 23:22 package.box_old</pre>
<p>package.box_oldは何も考えず作ったもので448MBありましたが、zerofreeで空き領域をクリアしたpackage.boxは277MBと171MBも差がでました。</p>
<p>使い方としては、Debianではサクッと apt-get install zerofree でインストールして、root権限で</p>
<pre>zerofree -v (パーティション)</pre>
<p>とすれば使えますが、アンマウントしたパーティションかリードオンリーでマウントされたパーティションにしか使えないので、自分はライブCDを起動して、そこから実行しました。</p>
<p>これはいいかも。</p><!-- google_ad_section_end -->

<p><a href="http://www.nofuture.tv/diary/20130507.html#c">ツッコミを入れる</a></p>]]></content:encoded>
</item>
<item rdf:about="http://www.nofuture.tv/diary/20130507.html#p01">
<link>http://www.nofuture.tv/diary/20130507.html#p01</link>
<xhtml:link xhtml:rel="alternate" xhtml:media="handheld" xhtml:type="text/html" xhtml:href="http://www.nofuture.tv/diary/20130507.html#p01" />
<dc:date>2013-05-07T12:35:33+09:00</dc:date>
<title>VeeWeeを使わずWheezyのVagrantのBoxを作る</title>
<dc:creator>Jun NOGATA</dc:creator>
<dc:subject>debian</dc:subject>
<dc:subject>ruby</dc:subject>
<dc:subject>virtualbox</dc:subject>
<dc:subject>vagrant</dc:subject>
<description>Vagrantといえば今更だけど、特殊な状況があって環境を用意する必要がありVirtualBox単体で作ってもよかったのだけれど、ちょっと慣れておこうかと思ってVagrantをインストールしてみた。 しかし、Vagrantbox.esにプレーンなDebian WheezyのboxがなかったのでBase boxから作ってみたのでメモ。 使用したVagrantは、debianパッケージもありますがgemからインストールしています。バージョンはVagrantは1.0.7。Virtualboxは4.2.12です。 参考  Vagrant Documentation - Documentation - Base Boxes: http://docs-v1.vagrantup.com/v1/docs/base_boxes.html  ベース仮想マシンの作成 Vagrantのドキュメントに書かれている仮想マシンの構成に従って作成します。  ハードディスク  40GB以上  メモリ  なるべく少なく(360MB)  オーディオ・USB  無効  ネットワーク  NAT    最終的なboxサイズは..</description>
<content:encoded><![CDATA[<h3>VeeWeeを使わずWheezyのVagrantのBoxを作る</h3><!-- google_ad_section_start -->
<p>Vagrantといえば今更だけど、特殊な状況があって環境を用意する必要がありVirtualBox単体で作ってもよかったのだけれど、ちょっと慣れておこうかと思って<a href="http://www.vagrantup.com/">Vagrant</a>をインストールしてみた。
しかし、<a href="http://www.vagrantbox.es/">Vagrantbox.es</a>にプレーンなDebian WheezyのboxがなかったのでBase boxから作ってみたのでメモ。</p>
<p>使用したVagrantは、debianパッケージもありますがgemからインストールしています。バージョンはVagrantは1.0.7。Virtualboxは4.2.12です。</p>
<h4>参考</h4>
<ul>
<li>Vagrant Documentation - Documentation - Base Boxes: <a href="http://docs-v1.vagrantup.com/v1/docs/base_boxes.html">http://docs-v1.vagrantup.com/v1/docs/base_boxes.html</a></li>
</ul>
<h4>ベース仮想マシンの作成</h4>
<p>Vagrantのドキュメントに書かれている仮想マシンの構成に従って作成します。</p>
<table border="1">
<tr><th>ハードディスク </th><td> 40GB以上
</td></tr>
<tr><th>メモリ </th><td> なるべく少なく(360MB)
</td></tr>
<tr><th>オーディオ・USB </th><td> 無効
</td></tr>
<tr><th>ネットワーク </th><td> NAT
</td></tr>
</table>
<ul>
<li>最終的なboxサイズは500MB以下にする。</li>
</ul>
<p>ということで、こんな感じで作成しました。</p>
<ul>
<li>OSタイプ: Debian</li>
<li>メモリ: 384MB</li>
<li>VRAM: 9MB</li>
<li>HDD: 50GB</li>
</ul>
<p>GUIから普通に作ってもよいですが、コマンドラインから作るとこんな感じ。
(というかコマンドラインから作る必要性はまったくなく、ちょっと書いてみたかっただけなので無理にこれを使うことはないです。)</p>
<pre># Debianマシンの設定
vboxmanage createvm --name vagrant-debian-wheezy --ostype Debian --register
vboxmanage modifyvm vagrant-debian-wheezy --memory 384 --vram 9 --rtcuseutc on
# ストレージコントローラの設定
vboxmanage storagectl vagrant-debian-wheezy --name IDE --add ide
vboxmanage storagectl vagrant-debian-wheezy --name SATA --add sata --sataportcount 1
# HDDを作成(50GB)
vboxmanage createhd --filename ~/VirtualBox\ VMs/vagrant-debian-wheezy/vagrant-debian-wheezy.vdi --size 51200
# HDDとCDをマウント
vboxmanage storageattach vagrant-debian-wheezy --storagectl IDE --port 1 --device 0 --type dvddrive --medium ~/debian-7.0.0-i386-CD-1.iso
vboxmanage storageattach vagrant-debian-wheezy --storagectl SATA --port 0 --device 0 --type hdd --medium ~/VirtualBox\ VMs/vagrant-debian-wheezy/vagrant-debian-wheezy.vdi
# ブートデバイスの変更
vboxmanage modifyvm vagrant-debian-wheezy --boot1 dvd --boot2 disk --boot3 none --boot4 none</pre>
<h4>Debianのインストール</h4>
<p>VirtualBoxにWheezyをインストールします。インストールは通常のインストールで構いませんが、サイズを小さくするため「ソフトウェアの選択」のチェックをすべて外してインストールします。また、個人的にはrootは不要なので「rootのパスワード」の入力画面でパスワードを空にしてrootを無効にしています。</p>
<p>ネットワークとアカウントは、Vagrantのドキュメントにしたがって設定します。</p>
<table border="1">
<tr><th>ホスト名 </th><td> vagrant-[os名]  例) vagrant-debian-lenny
</td></tr>
<tr><th>ドメイン </th><td> vagrantup.com
</td></tr>
<tr><th>Rootパスワード(rootを無効にするなら不要) </th><td> vagrant
</td></tr>
<tr><th>メインアカウント名 </th><td> vagrant
</td></tr>
<tr><th>メインアカウントパスワード </th><td> vagrant
</td></tr>
</table>
<h4>vagrantユーザの設定</h4>
<p>vagrantユーザーでログインをして、Debianの設定をおこないます。
最初にロケールが「ja_JP.UTF-8」ではコンソール上では文字化けをするので「C」に設定しておきます。</p>
<pre>$ export LANG=C</pre>
<p>続いて、vagrantユーザーがパスワード無しで管理者権限になれるように設定します。
rootを無効にしてインストールしたなら、vagrantユーザーはsudoグループに入っているので、visudoを使い%sudoの行にNOPASSWDを追加します。</p>
<pre>$ sudo /usr/sbin/visudo</pre>
<pre># Allow members of group sudo to execute any command
%sudo   ALL=(ALL:ALL) NOPASSWD:ALL</pre>
<p>rootユーザーを有効にしている場合は、sudoをインストールしてvagrantユーザーをsudoグループに追加してから上の設定をおこないます。</p>
<pre>$ su -
# apt-get install sudo
# usermod -G sudo vagrant</pre>
<h4>GuestAdditionsの設定</h4>
<p>VirtualBoxにDebianをインストールすると、自動的にvirtualbox-guest-dkmsパッケージがインストールされるので改めてインストールする必要はありませんが、気になる人はこれらのパッケージを削除してインストールしなおしてもよいと思います。
(VirtualBoxとGuestAdditionsのバージョンが異なった状態でVagrantを使うと警告が出ますが、GuestAdditionsの機能はホストゲスト間のファイル共有しか使っていないので、よほど大きくバージョンが異ならなければ問題は出ないはず。)</p>
<pre>$ sudo apt-get purge virtualbox-guest-dkms virtualbox-guest-utils
$ sudo apt-get install build-essential dkms
(VirtualBoxのメニューの[デバイス]→[GuestAdditionsのインストール]を選択してから)
$ sudo mount /media/cdrom
$ sudo sh -C /media/cdrom/VBoxLinuxAdditons.run</pre>
<h4>SSHのインストール</h4>
<p>SSHを使うための設定をします。
ca-certificatesパッケージは、wgetでSSH公開鍵を取得する際に必要になるのでインストールしています。</p>
<pre>$ sudo apt-get install ssh ca-certificates
$ sudo sh -c "echo 'UseDNS no' &gt;&gt; /etc/ssh/sshd_config"
$ mkdir ~/.ssh/
$ wget -O ~/.ssh/authorized_keys https://raw.github.com/mitchellh/vagrant/master/keys/vagrant.pub
$ chmod 700 ~/.ssh/
$ chmod 600 ~/.ssh/authorized_keys</pre>
<h4>その他の設定</h4>
<p>あとは適当にrubyやchefなどをインストールしたり、いろいろ必要なことをおこないます。</p>
<h5>クリーンアップ</h5>
<p>これは定番ですね。不要なDebianパッケージを削除します。</p>
<pre>$ sudo apt-get autoremove
$ sudo apt-get clean</pre>
<h5>dhcpの情報を削除する</h5>
<p>気になる人は気になるかもしれないdhcpの情報を削除しておきます。</p>
<pre>$ sudo rm /var/lib/dhcp/dhclient.*
$ sudo rm /etc/resolv.conf</pre>
<h5>grubの待ち時間をなくす</h5>
<p>vagrant upしたとき、ちょっと早くなるかな?
/etc/default/grubを編集してGRUB_TIMEOUTの値を0にします。</p>
<pre>$ sudo vi /etc/default/grub</pre>
<pre>GRUB_TIMEOUT=0</pre>
<p>編集がおわったgrubの設定を更新します。</p>
<pre>$ sudo /usr/sbin/update-grub</pre>
<h4>Vagrantパッケージ化とテスト</h4>
<p>ベースとなる仮想マシンが出来ればVagrant用にパッケージ化します。</p>
<pre>$ vagrant package --base vagrant-debian-wheezy</pre>
<p>パッケージ化出来るとpackage.boxというファイルができているので、package.boxを登録してみます。例ではd7という名前で登録しました。</p>
<pre>$ vagrant box add d7 package.box
[vagrant] Downloading with Vagrant::Downloaders::File...
[vagrant] Copying box to temporary location...
[vagrant] Extracting box...
[vagrant] Verifying box...
[vagrant] Cleaning up downloaded box...</pre>
<p>適当なディレクトリを作成して登録したboxのテストをします。</p>
<pre>$ mkdir test_env
$ cd test_env

$ vagrant init d7
A `Vagrantfile` has been placed in this directory. You are now
ready to `vagrant up` your first virtual environment! Please read
the comments in the Vagrantfile as well as documentation on
`vagrantup.com` for more information on using Vagrant.</pre>
<p>登録したboxを起動します。</p>
<pre>$ vagrant up
[default] Importing base box 'd7'...
[default] Matching MAC address for NAT networking...
[default] Clearing any previously set forwarded ports...
[default] Forwarding ports...
[default] -- 22 =&gt; 2222 (adapter 1)
[default] Creating shared folders metadata...
[default] Clearing any previously set network interfaces...
[default] Booting VM...
[default] Waiting for VM to boot. This can take a few minutes.
[default] VM booted and ready for use!
[default] The guest additions on this VM do not match the install version of
VirtualBox! This may cause things such as forwarded ports, shared
folders, and more to not work properly. If any of those things fail on
this machine, please update the guest additions and repackage the
box.

Guest Additions Version: 4.1.18
VirtualBox Version: 4.2.12
[default] Mounting shared folders...
[default] -- v-root: /vagrant</pre>
<p>無事起動したようです。SSHのポートをポートフォワーディングしてますね。
/vagrantでホストとゲスト間のファイルを共有できます。</p>
<p>SSHでログインしてみます。</p>
<pre>$ vagrant ssh
Linux vagrant-debian-wheezy 3.2.0-4-686-pae #1 SMP Debian 3.2.41-2 i686

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Mon May  6 23:13:52 2013
/usr/bin/xauth:  file /home/vagrant/.Xauthority does not exist

vagrant@vagrant-debian-wheezy:~$ ls -la
total 32
drwxr-xr-x 3 vagrant vagrant 4096 May  6 23:31 .
drwxr-xr-x 3 root    root    4096 May  6 23:13 ..
-rw------- 1 vagrant vagrant   67 May  6 23:31 .Xauthority
-rw------- 1 vagrant vagrant  405 May  6 23:19 .bash_history
-rw-r--r-- 1 vagrant vagrant  220 May  6 23:13 .bash_logout
-rw-r--r-- 1 vagrant vagrant 3392 May  6 23:13 .bashrc
-rw-r--r-- 1 vagrant vagrant  675 May  6 23:13 .profile
drwx------ 2 vagrant vagrant 4096 May  6 23:17 .ssh</pre>
<p>ということで作成できました。</p>
<p>あとは巷に溢れるblogなどをみながらいろいろ試すとよいと思います。</p><!-- google_ad_section_end -->

<p><a href="http://www.nofuture.tv/diary/20130507.html#c">ツッコミを入れる</a></p>]]></content:encoded>
</item>
<item rdf:about="http://www.nofuture.tv/diary/20130506.html#p02">
<link>http://www.nofuture.tv/diary/20130506.html#p02</link>
<xhtml:link xhtml:rel="alternate" xhtml:media="handheld" xhtml:type="text/html" xhtml:href="http://www.nofuture.tv/diary/20130506.html#p02" />
<dc:date>2013-05-06T11:05:33+09:00</dc:date>
<title>SULKのCDが間違って送られてきた</title>
<dc:creator>Jun NOGATA</dc:creator>
<dc:subject>music</dc:subject>
<dc:subject>amazon</dc:subject>
<description>ゴールデンウィークの話しと言えば、面白いことがあったので書いておこう。 Amazonで注文していたThe SchoolとSULKのCDがGW中に届いたので開けてみたけれど何かヘン。 The SchoolとSULKどちらも国内盤を買ったのだけれど、SULKのほうには帯はついているけど対訳・解説が入ってない。 あらためてSULKの国内盤告知ページを見ると、対訳・解説付きと書いてある。 やっぱり、これはおかしい。と思って、販売元のヴァイナルジャンキーさんに問い合わせをしたら、なんと、流通のウルトラヴァイブさんの手違いでTSUTAYA専用レンタルCDがAmazonに間違って流れていたとのこと。 (写真で言うと上がレンタル用、下が販売用。違いはレンタル用は歌詞対訳なし、盤面がピクチャーレーベルでない。) こういう事もあるんだなー。と思ったゴールデンウィークでした。 追記 そうそう。これは書いておかなければ。ヴァイナルジャンキーさんとウルトラヴァイブさんには、とても丁寧に対応していただきました。 ありがとうございました。</description>
<content:encoded><![CDATA[<h3>SULKのCDが間違って送られてきた</h3><!-- google_ad_section_start -->
<p><a href="http://www.nofuture.tv/diary/files/2013/20130506_0.jpg"><img src="http://www.nofuture.tv/diary/files/2013/s20130506_0.jpg" alt="上がレンタル用のCD。下が販売用" title="上がレンタル用のCD。下が販売用"  class="image-ex none"></a></p>
<p>ゴールデンウィークの話しと言えば、面白いことがあったので書いておこう。</p>
<p>Amazonで注文していた<a href="http://elefant.com/bands/the-school">The School</a>と<a href="http://www.sulktheband.com/">SULK</a>のCDがGW中に届いたので開けてみたけれど何かヘン。
The SchoolとSULKどちらも国内盤を買ったのだけれど、SULKのほうには帯はついているけど対訳・解説が入ってない。
あらためてSULKの<a href="http://vinyl-junkie.com/label/sulk/">国内盤告知ページ</a>を見ると、対訳・解説付きと書いてある。</p>
<p>やっぱり、これはおかしい。と思って、販売元のヴァイナルジャンキーさんに問い合わせをしたら、なんと、流通のウルトラヴァイブさんの手違いでTSUTAYA専用レンタルCDがAmazonに間違って流れていたとのこと。
(写真で言うと上がレンタル用、下が販売用。違いはレンタル用は歌詞対訳なし、盤面がピクチャーレーベルでない。)</p>
<p>こういう事もあるんだなー。と思ったゴールデンウィークでした。</p>
<h4>追記</h4>
<p>そうそう。これは書いておかなければ。ヴァイナルジャンキーさんとウルトラヴァイブさんには、とても丁寧に対応していただきました。
ありがとうございました。</p><!-- google_ad_section_end -->

<p><a href="http://www.nofuture.tv/diary/20130506.html#c">ツッコミを入れる</a></p>]]></content:encoded>
</item>
<item rdf:about="http://www.nofuture.tv/diary/20130426.html#p02">
<link>http://www.nofuture.tv/diary/20130426.html#p02</link>
<xhtml:link xhtml:rel="alternate" xhtml:media="handheld" xhtml:type="text/html" xhtml:href="http://www.nofuture.tv/diary/20130426.html#p02" />
<dc:date>2013-05-06T09:36:11+09:00</dc:date>
<title>「簡単」という名の壁</title>
<dc:creator>Jun NOGATA</dc:creator>
<dc:subject>life</dc:subject>
<description>3週間授業をやってみて思ったのが、学部によって授業の姿勢が全然違うんですよね。 授業がすんなり進む学部と、すんなり進まない学部。 自分の時代から考えると「コンピュータは使えて当たり前」だと思っていた世代の子らが、キーボードを打ったりメールを送るだけの事にとても苦労している。かたや、スイスイ使える子。 と、これだけなら、あるあると思うかもしれないけど、PCからメールを送ることに苦労してても、スマホでパズドラをやってたりする。 いろいろあるなと思いましたよ。</description>
<content:encoded><![CDATA[<h3>「簡単」という名の壁</h3><!-- google_ad_section_start -->
<p>3週間授業をやってみて思ったのが、学部によって授業の姿勢が全然違うんですよね。</p>
<p>授業がすんなり進む学部と、すんなり進まない学部。</p>
<p>自分の時代から考えると「コンピュータは使えて当たり前」だと思っていた世代の子らが、キーボードを打ったりメールを送るだけの事にとても苦労している。かたや、スイスイ使える子。</p>
<p>と、これだけなら、あるあると思うかもしれないけど、PCからメールを送ることに苦労してても、スマホでパズドラをやってたりする。</p>
<p>いろいろあるなと思いましたよ。</p><!-- google_ad_section_end -->

<p><a href="http://www.nofuture.tv/diary/20130426.html#c">ツッコミを入れる</a></p>]]></content:encoded>
</item>
<item rdf:about="http://www.nofuture.tv/diary/20130426.html#p01">
<link>http://www.nofuture.tv/diary/20130426.html#p01</link>
<xhtml:link xhtml:rel="alternate" xhtml:media="handheld" xhtml:type="text/html" xhtml:href="http://www.nofuture.tv/diary/20130426.html#p01" />
<dc:date>2013-05-06T09:36:11+09:00</dc:date>
<title>ゴールデンウィークで立て直したいな</title>
<dc:creator>Jun NOGATA</dc:creator>
<dc:subject>life</dc:subject>
<description>非常勤講師は週2だから大丈夫、かと思ったけど、そもそも大学のシステム自体に慣れてないので、もうgdgdでございました。いや、大した事はまったくやってないのだけど、なんでこんなに疲れてるのかと考えてみると、やっぱり慣れてないからかなと思ったですよ。 で、来週からゴールデンウィークですが、この間、授業は無いのでgdgdになった生活リズムやスケジュールとかを立て直したいなぁ。</description>
<content:encoded><![CDATA[<h3>ゴールデンウィークで立て直したいな</h3><!-- google_ad_section_start -->
<p>非常勤講師は週2だから大丈夫、かと思ったけど、そもそも大学のシステム自体に慣れてないので、もうgdgdでございました。いや、大した事はまったくやってないのだけど、なんでこんなに疲れてるのかと考えてみると、やっぱり慣れてないからかなと思ったですよ。</p>
<p>で、来週からゴールデンウィークですが、この間、授業は無いのでgdgdになった生活リズムやスケジュールとかを立て直したいなぁ。</p><!-- google_ad_section_end -->

<p><a href="http://www.nofuture.tv/diary/20130426.html#c">ツッコミを入れる</a></p>]]></content:encoded>
</item>
<item rdf:about="http://www.nofuture.tv/diary/20130505.html#p01">
<link>http://www.nofuture.tv/diary/20130505.html#p01</link>
<xhtml:link xhtml:rel="alternate" xhtml:media="handheld" xhtml:type="text/html" xhtml:href="http://www.nofuture.tv/diary/20130505.html#p01" />
<dc:date>2013-05-06T09:35:49+09:00</dc:date>
<title>Debian 7.0 "Wheezy" リリース</title>
<dc:creator>Jun NOGATA</dc:creator>
<dc:subject>debian</dc:subject>
<description>お疲れ様でした。  Debian -- ニュース -- Debian 7.0 &quot;Wheezy&quot; リリース: http://www.debian.org/News/2013/20130504  今回Debian Liveは通常のLiveに加えて、nonfreeのファームウェアが入っている非公式版のLiveも用意されています。  http://live.debian.net/cdimage/release/stable/ http://live.debian.net/cdimage/release/stable+nonfree/  公式のほうはミラーされると思うけど、非公式はミラーされないと思うので、ひとまずお知らせ。</description>
<content:encoded><![CDATA[<h3>Debian 7.0 "Wheezy" リリース</h3><!-- google_ad_section_start -->
<p>お疲れ様でした。</p>
<ul>
<li>Debian -- ニュース -- Debian 7.0 "Wheezy" リリース: <a href="http://www.debian.org/News/2013/20130504">http://www.debian.org/News/2013/20130504</a></li>
</ul>
<p>今回Debian Liveは通常のLiveに加えて、nonfreeのファームウェアが入っている非公式版のLiveも用意されています。</p>
<ul>
<li><a href="http://live.debian.net/cdimage/release/stable/">http://live.debian.net/cdimage/release/stable/</a></li>
<li><a href="http://live.debian.net/cdimage/release/stable+nonfree/">http://live.debian.net/cdimage/release/stable+nonfree/</a></li>
</ul>
<p>公式のほうはミラーされると思うけど、非公式はミラーされないと思うので、ひとまずお知らせ。</p><!-- google_ad_section_end -->

<p><a href="http://www.nofuture.tv/diary/20130505.html#c">ツッコミを入れる</a></p>]]></content:encoded>
</item>
<item rdf:about="http://www.nofuture.tv/diary/20130506.html#p01">
<link>http://www.nofuture.tv/diary/20130506.html#p01</link>
<xhtml:link xhtml:rel="alternate" xhtml:media="handheld" xhtml:type="text/html" xhtml:href="http://www.nofuture.tv/diary/20130506.html#p01" />
<dc:date>2013-05-06T09:35:25+09:00</dc:date>
<title>ゴールデンウィークももう終わり</title>
<dc:creator>Jun NOGATA</dc:creator>
<dc:subject>life</dc:subject>
<description>ゴールデンウィーク前に「リズムを整えられるかな」とこの日記を書いて公開するのを忘れてました。orz まあ、彼女の人が遊びに来てたり、田吾作が戻ってきてたり、4月の評価をつけてたり、いろいろあったゴールデンウィークも今日でオシマイです。平常運転平常運転。</description>
<content:encoded><![CDATA[<h3>ゴールデンウィークももう終わり</h3><!-- google_ad_section_start -->
<p>ゴールデンウィーク前に「リズムを整えられるかな」とこの日記を書いて公開するのを忘れてました。orz</p>
<p>まあ、彼女の人が遊びに来てたり、田吾作が戻ってきてたり、4月の評価をつけてたり、いろいろあったゴールデンウィークも今日でオシマイです。平常運転平常運転。</p><!-- google_ad_section_end -->

<p><a href="http://www.nofuture.tv/diary/20130506.html#c">ツッコミを入れる</a></p>]]></content:encoded>
</item>
<item rdf:about="http://www.nofuture.tv/diary/20130408.html#p02">
<link>http://www.nofuture.tv/diary/20130408.html#p02</link>
<xhtml:link xhtml:rel="alternate" xhtml:media="handheld" xhtml:type="text/html" xhtml:href="http://www.nofuture.tv/diary/20130408.html#p02" />
<dc:date>2013-04-09T14:07:23+09:00</dc:date>
<title>Debian JP Projectの副会長になりました</title>
<dc:creator>Jun NOGATA</dc:creator>
<dc:subject>debian</dc:subject>
<description>つづいて  2013年度役員改選および新体制スタートのお知らせ - Debian JP Project - 最近の話題: http://www.debian.or.jp/blog/board-2013.html  ということで、Debian JP Projectの副会長をお受けしました。 最近、姫路IT系勉強会など姫路の活動のほうが多くて、Debian関係のアクティビティはかなり落ちていますが、こっちも力を入れて頑張れとのことなので、こちらも頑張りたいと思います。 Debian Liveやfontconfigのデフォルトの話、ほかWordPressパッケージでプラグインを使うとパスの違いでコケるところものが多い問題とか気になっているけど手をつけてない/英語で億劫になってる事もありますが徐々に手をつけていきます…。</description>
<content:encoded><![CDATA[<h3>Debian JP Projectの副会長になりました</h3><!-- google_ad_section_start -->
<p>つづいて</p>
<ul>
<li>2013年度役員改選および新体制スタートのお知らせ - Debian JP Project - 最近の話題: <a href="http://www.debian.or.jp/blog/board-2013.html">http://www.debian.or.jp/blog/board-2013.html</a></li>
</ul>
<p>ということで、Debian JP Projectの副会長をお受けしました。</p>
<p>最近、姫路IT系勉強会など姫路の活動のほうが多くて、Debian関係のアクティビティはかなり落ちていますが、こっちも力を入れて頑張れとのことなので、こちらも頑張りたいと思います。</p>
<p>Debian Liveやfontconfigのデフォルトの話、ほかWordPressパッケージでプラグインを使うとパスの違いでコケるところものが多い問題とか気になっているけど手をつけてない/英語で億劫になってる事もありますが徐々に手をつけていきます…。</p><!-- google_ad_section_end -->

<p><a href="http://www.nofuture.tv/diary/20130408.html#c">ツッコミを入れる</a></p>]]></content:encoded>
</item>
<item rdf:about="http://www.nofuture.tv/diary/20130408.html#p01">
<link>http://www.nofuture.tv/diary/20130408.html#p01</link>
<xhtml:link xhtml:rel="alternate" xhtml:media="handheld" xhtml:type="text/html" xhtml:href="http://www.nofuture.tv/diary/20130408.html#p01" />
<dc:date>2013-04-09T14:07:23+09:00</dc:date>
<title>姫路獨協大学の非常勤講師になりました</title>
<dc:creator>Jun NOGATA</dc:creator>
<dc:subject>life</dc:subject>
<description>姫路IT系勉強会などでお世話になってる姫路獨協大学の園田先生から「Word/Excelを教える先生がいないのだけどやってみる?」とお話しをいただいて、「やります〜」と答えたのが2月終わりぐらい。 そんなこんなで、いろいろやりとりがあって気がつけば4月。打ち合わせが4月5日の金曜日にあって、土日、彼女の人と遊びに行くつもりだったけどキャンセルして準備して今日、新年度一発目の授業でした。 しょっぱなから1限と4限、5限はキツかったぁ。最後はフラフラでした。 自分は通信制の大学に一瞬だけ居たことがあるぐらいで、大学のことなんて何もわからないし、授業の方針や資料は中心になってまとめられてる先生におんぶに抱っこのマイナス状態ですが、とりあえず1年続けられるようがんばります。</description>
<content:encoded><![CDATA[<h3>姫路獨協大学の非常勤講師になりました</h3><!-- google_ad_section_start -->
<p>姫路IT系勉強会などでお世話になってる姫路獨協大学の園田先生から「Word/Excelを教える先生がいないのだけどやってみる?」とお話しをいただいて、「やります〜」と答えたのが2月終わりぐらい。</p>
<p>そんなこんなで、いろいろやりとりがあって気がつけば4月。打ち合わせが4月5日の金曜日にあって、土日、彼女の人と遊びに行くつもりだったけどキャンセルして準備して今日、新年度一発目の授業でした。</p>
<p>しょっぱなから1限と4限、5限はキツかったぁ。最後はフラフラでした。</p>
<p>自分は通信制の大学に一瞬だけ居たことがあるぐらいで、大学のことなんて何もわからないし、授業の方針や資料は中心になってまとめられてる先生におんぶに抱っこのマイナス状態ですが、とりあえず1年続けられるようがんばります。</p><!-- google_ad_section_end -->

<p><a href="http://www.nofuture.tv/diary/20130408.html#c">ツッコミを入れる</a></p>]]></content:encoded>
</item>
<item rdf:about="http://www.nofuture.tv/diary/20130331.html#p01">
<link>http://www.nofuture.tv/diary/20130331.html#p01</link>
<xhtml:link xhtml:rel="alternate" xhtml:media="handheld" xhtml:type="text/html" xhtml:href="http://www.nofuture.tv/diary/20130331.html#p01" />
<dc:date>2013-04-02T13:47:44+09:00</dc:date>
<title>花見と散歩</title>
<dc:creator>Jun NOGATA</dc:creator>
<dc:subject>life</dc:subject>
<description>nogajun's photo. 			  彼女の人と花見がてらの散歩。 			 				 					 				 				nogajun's photo. 			  そして、散歩先であった謎のモニュメント。あれはなんだ?</description>
<content:encoded><![CDATA[<h3>花見と散歩</h3><!-- google_ad_section_start -->
<p>			<div class="instagr">
				<a class="instagr" href="http://instagram.com/p/Xgk8oMgVCO/" title="">
					<img src="http://distilleryimage2.ak.instagram.com/1d0d70c499be11e28fba22000a1fb1a7_6.jpg" width="306" height="306" alt="">
				</a>
				<p>nogajun's photo.</p>
			</div>
</p>
<p>彼女の人と花見がてらの散歩。</p>
<p>			<div class="instagr">
				<a class="instagr" href="http://instagram.com/p/XglHrlgVCU/" title="">
					<img src="http://distilleryimage8.ak.instagram.com/5305e1ca99be11e2a73522000a1faf50_6.jpg" width="306" height="306" alt="">
				</a>
				<p>nogajun's photo.</p>
			</div>
</p>
<p>そして、散歩先であった謎のモニュメント。あれはなんだ?</p><!-- google_ad_section_end -->

<p><a href="http://www.nofuture.tv/diary/20130331.html#c">ツッコミを入れる</a></p>]]></content:encoded>
</item>
<item rdf:about="http://www.nofuture.tv/diary/20130329.html#p02">
<link>http://www.nofuture.tv/diary/20130329.html#p02</link>
<xhtml:link xhtml:rel="alternate" xhtml:media="handheld" xhtml:type="text/html" xhtml:href="http://www.nofuture.tv/diary/20130329.html#p02" />
<dc:date>2013-03-29T01:06:23+09:00</dc:date>
<title>シェルスクリプトだけで空白で区切られた文字列から特定部分だけ抜き出し、入れ替えて表示</title>
<dc:creator>Jun NOGATA</dc:creator>
<dc:subject>bash</dc:subject>
<dc:subject>shellscript</dc:subject>
<description>シェルスクリプトを使っていて空白で区切られた文字列「&quot;AAA BBB CCC DDD EEE&quot;」から2番目のBBBと5番目のEEEを取り出し、入れ替えて「EEE BBB」と表示したい場合、cutやawkを使うのもよいですが、いったん配列に入れると位置を指定して取り出すことができます。 1: T=&quot;AAA BBB CCC DDD EEE&quot; 2: F=(${T}) 3: echo &quot;${F[4]} ${F[1]}&quot;  EEE BBB 1行目: 変数Tに空白で区切られた文字列「&quot;AAA BBB CCC DDD EEE&quot;」が入ってます。 2行目: 配列変数に代入する際、F=(A B C D E)のようにするとF[0]=A, F[1]=Bのようにそれぞれの配列Fに分割されて代入されます。ここに空白で区切られた文字列$Tを指定すると、F[0]=AAA, F[1]=BBBのように分割されて配列Fに代入されます。 3行目: ということで、F[4]に文字列「EEE」、F[1]に文字列「BBB」が入っているので、それぞれ指定してechoで表示しています。</description>
<content:encoded><![CDATA[<h3>シェルスクリプトだけで空白で区切られた文字列から特定部分だけ抜き出し、入れ替えて表示</h3><!-- google_ad_section_start -->
<p>シェルスクリプトを使っていて空白で区切られた文字列「"AAA BBB CCC DDD EEE"」から2番目のBBBと5番目のEEEを取り出し、入れ替えて「EEE BBB」と表示したい場合、cutやawkを使うのもよいですが、いったん配列に入れると位置を指定して取り出すことができます。</p>
<pre>1: T="AAA BBB CCC DDD EEE"
2: F=(${T})
3: echo "${F[4]} ${F[1]}"

EEE BBB</pre>
<p>1行目: 変数Tに空白で区切られた文字列「"AAA BBB CCC DDD EEE"」が入ってます。</p>
<p>2行目: 配列変数に代入する際、F=(A B C D E)のようにするとF[0]=A, F[1]=Bのようにそれぞれの配列Fに分割されて代入されます。ここに空白で区切られた文字列$Tを指定すると、F[0]=AAA, F[1]=BBBのように分割されて配列Fに代入されます。</p>
<p>3行目: ということで、F[4]に文字列「EEE」、F[1]に文字列「BBB」が入っているので、それぞれ指定してechoで表示しています。</p><!-- google_ad_section_end -->

<p><a href="http://www.nofuture.tv/diary/20130329.html#c">ツッコミを入れる</a></p>]]></content:encoded>
</item>
<item rdf:about="http://www.nofuture.tv/diary/20130329.html#p01">
<link>http://www.nofuture.tv/diary/20130329.html#p01</link>
<xhtml:link xhtml:rel="alternate" xhtml:media="handheld" xhtml:type="text/html" xhtml:href="http://www.nofuture.tv/diary/20130329.html#p01" />
<dc:date>2013-03-29T00:36:06+09:00</dc:date>
<title>シェルスクリプト(bash)のメッセージを国際化する 2013年版</title>
<dc:creator>Jun NOGATA</dc:creator>
<dc:subject>bash</dc:subject>
<dc:subject>shellscript</dc:subject>
<dc:subject>i18n</dc:subject>
<description>シェルスクリプトのメッセージを国際化するといえば「bash スクリプト内メッセージの国際(カタログ)化」に書かれている方法が有名ですが、この方法はセキュリティ上の問題(シフトJISや中国語のエンコーディングではダブルクォーテーションを無効にできてしまうなど。くわしくは「bash - GNU `gettext' utilities」を参照)から現在、非推奨になっています。 現在推奨されているメッセージの国際化は、手順自体が大幅に変わったワケではありませんが、全体を通してまとまった文書は日本語ではないようなので、まとめておきます。 参考  Preparing Shell Scripts - GNU `gettext' utilities: http://www.gnu.org/software/gettext/manual/html_node/Preparing-Shell-Scripts.html#Preparing-Shell-Scripts Localization: http://tldp.org/LDP/abs/html/localization.html  以前との違い 大..</description>
<content:encoded><![CDATA[<h3>シェルスクリプト(bash)のメッセージを国際化する 2013年版</h3><!-- google_ad_section_start -->
<p>シェルスクリプトのメッセージを国際化するといえば「<a href="http://www.unixuser.org/~ysjj/bash_script_i18n.html">bash スクリプト内メッセージの国際(カタログ)化</a>」に書かれている方法が有名ですが、この方法はセキュリティ上の問題(シフトJISや中国語のエンコーディングではダブルクォーテーションを無効にできてしまうなど。くわしくは「<a href="http://www.gnu.org/software/gettext/manual/html_node/bash.html">bash - GNU `gettext' utilities</a>」を参照)から現在、非推奨になっています。</p>
<p>現在推奨されているメッセージの国際化は、手順自体が大幅に変わったワケではありませんが、全体を通してまとまった文書は日本語ではないようなので、まとめておきます。</p>
<h5>参考</h5>
<ul>
<li>Preparing Shell Scripts - GNU `gettext' utilities: <a href="http://www.gnu.org/software/gettext/manual/html_node/Preparing-Shell-Scripts.html#Preparing-Shell-Scripts">http://www.gnu.org/software/gettext/manual/html_node/Preparing-Shell-Scripts.html#Preparing-Shell-Scripts</a></li>
<li>Localization: <a href="http://tldp.org/LDP/abs/html/localization.html">http://tldp.org/LDP/abs/html/localization.html</a></li>
</ul>
<h4>以前との違い</h4>
<p>大きな違いとしては、国際化したいメッセージの部分を「$"Msgid"」と書いていたものが、「"$(eval_gettext "Msgid")"」という書き方になりました。それにともない、事前にラッパーのgettext.shを読み込ませる必要があります。</p>
<h4>シェルスクリプトのメッセージを国際化する</h4>
<p>ここからは、シェルスクリプトのメッセージを実際に国際化対応していきます。</p>
<h5>サンプルと実行例</h5>
<p>サンプルとしてHello Worldと表示するシェルスクリプトを使いました。</p>
<pre>#!/usr/bin/env bash
# hello.sh -- say hello script
echo hello world</pre>
<p>実行例</p>
<pre>$ ./hello.sh
hello world</pre>
<h4>メッセージのカタログ化事前準備</h4>
<p>メッセージをカタログ化を準備するため、ラッパーのgettext.shを読み込ませます。
読み込ませる方法は「. gettext.sh」(一番前にドットがあります。)という行を追加します。
追加する行は、先頭の部分、シェバンの下あたりに書くとよいでしょう。</p>
<pre>#!/usr/bin/env bash
# hello.sh -- say hello script
. gettext.sh
echo hello world</pre>
<h4>メッセージをカタログ化</h4>
<p>国際化したいメッセージをカタログ化します。
まず、メッセージの部分をダブルクォーテーションで囲み、その前に「eval_gettext」と書きます。</p>
<pre>#!/usr/bin/env bash
# hello.sh -- say hello script
. gettext.sh
echo eval_gettext "hello world"</pre>
<p>eval_gettextはgettext.shに含まれる関数ですが、このままでは文字列としか扱われてないので、バッククォート「`」もしくは「$(」と「)」でeval_gettextと文字列をくくり、関数として実行されるようにします。そして「$(」と「)」の外をダブルクォーテーションでくくります。</p>
<pre>#!/usr/bin/env bash
# hello.sh -- say hello script
. gettext.sh
echo "$(eval_gettext "hello world")"</pre>
<h4>potファイルの生成</h4>
<p>xgettextを使って(bash --dump-po-stringsは使わない)メッセージカタログの元になる、potファイルを生成します。「-o」オプションで出力ファイル名をつけて、xgettextを実行します。</p>
<pre>$ xgettext -o hello.pot hello.sh</pre>
<pre>$ cat hello.pot

# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR &lt;EMAIL@ADDRESS&gt;, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2013-03-28 22:25+0900\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME &lt;EMAIL@ADDRESS&gt;\n"
"Language-Team: LANGUAGE &lt;LL@li.org&gt;\n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: 8bit\n"

#: hello.sh:4
#, sh-format
msgid "hello world"
msgstr ""</pre>
<h4>メッセージカタログを作成</h4>
<p>potファイルをコピーし、言語のpoファイル(メッセージカタログ)を作成します。</p>
<pre>$ cp hello.pot ja.po</pre>
<p>適当なエディタを使い、ja.poをそれぞれの言語に翻訳します。
poeditなどの専用エディタならpoファイルの情報はそれぞれ適切に設定されますが、テキストエディタのみで作業する場合は、最低「Content-Type:」のCHARSETはUTF-8に設定してください。</p>
<pre>$ cat ja.po

# hello ja.po
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR &lt;EMAIL@ADDRESS&gt;, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2013-03-28 22:26+0900\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME &lt;EMAIL@ADDRESS&gt;\n"
"Language-Team: LANGUAGE &lt;LL@li.org&gt;\n"
"Language: Japanese\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" ← CHARSETをUTF-8にしておく
"Content-Transfer-Encoding: 8bit\n"

#: hello.sh:4
#, sh-format
msgid "hello world"
msgstr "こんにちは 世界" ←msgidに対応した文を翻訳する</pre>
<h4>poファイル(メッセージカタログ)のコンパイルと配置</h4>
<p>poファイルをコンパイルしmoファイルを生成。メッセージカタログのディレクトリに配置します。</p>
<p>まずカレントディレクトリにmoファイルを置くディレクトリを作成します。</p>
<pre>$ mkdir -p ja/LC_MESSAGES</pre>
<p>poファイルをコンパイルします。moファイルの出力先は「-o」オプションで変更できるので、ja/LC_MESSAGES/(アプリケーション名).mo とします。</p>
<pre>$ msgfmt -o ja/LC_MESSAGES/hello.mo ja.po</pre>
<h4>メッセージカタログの適用テスト</h4>
<p>メッセージカタログが生成できたので、スクリプトにそれぞれの言語でメッセージカタログが適用されるかテストします。</p>
<p>通常、メッセージカタログは /usr/share/locale/ja/LC_MESSAGES (日本語の場合)以下に置かれますが、メッセージディレクトリを指す環境変数 TEXTDOMAINDIR と、アプリケーション名を指す環境変数 TEXTDOMAIN を変更するとカレントディレクトリを指定できるので、それぞれを変更してテストをおこないます。</p>
<pre>LANGにCを設定した場合
$ LANG=C TEXTDOMAIN=hello TEXTDOMAINDIR=. ./hello.sh
hello world

LANGにja_JP.UTF-8(日本語)を指定した場合
$ LANG=ja_JP.UTF-8 TEXTDOMAIN=hello TEXTDOMAINDIR=. ./hello.sh
こんにちは 世界</pre>
<p>それぞれ適用できました。</p>
<h4>TEXTDOMAINDIRの設定とメッセージカタログのアップデート</h4>
<p>スクリプトを実行する際、いちいち「TEXTDOMAIN=hello TEXTDOMAINDIR=.」をつけての実行は面倒なので、スクリプトの中に書いてしまいます。</p>
<pre>#!/usr/bin/env bash
# hello.sh -- say hello script
. gettext.sh

TEXTDOMAIN=hello
export TEXTDOMAIN
TEXTDOMAINDIR=/home/hoge/src/hello/
export TEXTDOMAINDIR

echo "$(eval_gettext "hello world")"</pre>
<p>TEXTDOMAINは変わりませんが、TEXTDOMAINDIRは、「.」のままではカレントディレクトリを示して、別のディレクトリからスクリプトを実行するとメッセージカタログが適用されないので、フルパスでスクリプトのディレクトリを指定します。</p>
<p>スクリプトが変更されたので、メッセージの位置が変わります。ですのでメッセージカタログもアップデートします。</p>
<p>xgettextでpotファイルの生成は同じですが、msgmergeを使ってja.poをアップデートします。</p>
<pre>$ xgettext -o hello.pot hello.sh
$ msgmerge -U ja.po hello.pot</pre>
<p>上のような些細な変更ではなくメッセージの追加などあれば、未翻訳の部分もあるのでpoファイルに未翻訳部分の翻訳も追加します。
追加が終わればpoをコンパイルします。</p>
<pre>
$ msgfmt -o ja/LC_MESSAGES/hello.mo ja.po</pre>
<p>正しくメッセージカタログが適用されるかテストします。</p>
<pre>英語
$ LANG=C ./hello.sh
hello world

日本語
$ LANG=ja_JP.UTF-8 ./hello.sh
こんにちは 世界</pre>
<p>ディレクトリを変更してもメッセージカタログが適用されるかテストします。</p>
<pre>$ cd ~/
$ LANG=C src/hello/hello.sh
hello world
$ LANG=ja_JP.UTF-8 src/hello/hello.sh
こんにちは 世界</pre>
<p>これで問題なくメッセージカタログが適用されるようになりました。</p>
<h4>文字列を非推奨の「$"..."」で囲んでいるスクリプトにxgettextを使うと</h4>
<p>文字列をこれまで解説をした「"$(eval_gettext "...")"」ではなく、非推奨の「$"..."」で囲んでいるスクリプトに、xgettextでメッセージカタログを生成しようとすると警告されます。</p>
<pre>$ cat hello-old.sh
#!/usr/bin/env bash
# hello.sh -- say hello script
echo $"hello world"</pre>
<pre>$ xgettext -o hello-old.pot hello-old.sh
hello-old.sh:3: 警告: 文法 $"..." はセキュリティ上の理由で推奨されません. 代わりに eval_gettext を使ってください</pre>
<p>bash --dump-po-stringsでは何も出ません。</p>
<pre>$ bash --dump-po-strings hello-old.sh &gt; hello-old.pot</pre>
<p>ということで、メッセージカタログの作成にはxgettextを使いましょう。</p><!-- google_ad_section_end -->

<p><a href="http://www.nofuture.tv/diary/20130329.html#c">ツッコミを入れる</a></p>]]></content:encoded>
</item>
</rdf:RDF>
