<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Bear's Droppings</title>
  <link href="http://bearmini.net/blog/Latests.aspx?bid=1" rel="alternate" />
  <link href="http://bearmini.net/blog/atom.aspx?bid=1" rel="self" />
  <updated>2010-09-06T06:24:18-05:00</updated>
  <author>
    <name>bear.mini</name>
  </author>
  <id>urn:uuid:0DCEB8A6-2D77-453E-AED7-5809CF429BFB</id>

<entry>
  <title>upTeX/upLaTeX の amd64 版パッケージを Ubuntu 10.04 にインストールしようとしてハマった件</title>
  <link href="http://bearmini.net/blog/View.aspx?bid=1&amp;aid=183" />
  <id>urn:uuid:a9f87b4e-374d-41a9-955a-9db491f76dda</id>
  <updated>2010-08-09T02:52:02-05:00</updated>
  <content type="html">&lt;p&gt;&lt;a href=&quot;http://homepage3.nifty.com/ttk/comp/tex/uptex.html&quot;&gt;upTeX/upLaTeX&lt;/a&gt; という、pTex/pLaTeX が Unicode 化されたパッケージがありまして、しかもこれを &lt;a href=&quot;http://www1.pm.tokushima-u.ac.jp/~kohda/tex/uptex.html&quot;&gt;Debian 用のパッケージにしてくださっている方&lt;/a&gt;もいらっしゃいまして、さらにこれを &lt;a href=&quot;http://d.hatena.ne.jp/hogem/20100805/1280938227&quot;&gt;Ubuntu 用に修正する方法を公開してくださっている方&lt;/a&gt;もいらっしゃいまして、おかげさまで大変便利に使わせていただいています。&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;32bit 版のパッケージは、事前に texlive-full と xpdf-japanese あたりのパッケージをインストールしておく必要がある以外はほぼすんなりインストールできるのですが、64bit 版のパッケージはちょっと手こずりました。&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;まず、32bit 版と同様に texlive-full と xpdf-japanese パッケージをインストールします。&lt;/p&gt;  &lt;p&gt;次に、64bit 版の uptex パッケージ（上記リンクを参考に自作）をインストールしようとすると、libgd2-xpm というパッケージが必要だというエラーが出ました。&lt;/p&gt;  &lt;p&gt;そこで sudo apt-get install libgd2-xpm を実行したのですが謎のエラーが発生。&lt;/p&gt;  &lt;p&gt;（エラーメッセージを保存し忘れましたが、なにやらコンフリクトしてるだの virtual package だのどうのこうのというエラーでした）&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;これは、libgd2-noxpm を一旦アンインストールして、そのあと libgd2-xpm をインストールしたら直ったと思います（記憶が定かでなくてすいません、、、）&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;さらに大きな問題がこの後襲ってきました。&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;自作 uptex パッケージをインストールしようとしたら、以下のようなエラーが起こってしまいました。&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;pre class=&quot;console&quot;&gt;  ：
Generating fmt files ...
Error: `pdfetex -ini  -jobname=etex -progname=etex -translate-file=cp227.tcx *etex.ini' failed
Error: `pdfetex -ini  -jobname=pdfetex -progname=pdfetex -translate-file=cp227.tcx *pdfetex.ini' failed

###############################################################################
fmtutil: Error! Not all formats have been built successfully.
Visit the log files in directory
  /opt/uptex/share/texmf-var/web2c
for details.
###############################################################################

This is a summary of all `failed' messages and warnings:
`pdfetex -ini  -jobname=etex -progname=etex -translate-file=cp227.tcx *etex.ini' failed
`pdfetex -ini  -jobname=pdfetex -progname=pdfetex -translate-file=cp227.tcx *pdfetex.ini' failed
  ：&lt;/pre&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;なんだかよくわからないのですが、エラーメッセージにしたがって /opt/uptex/share/texmf-var/web2c/ 以下のディレクトリにある log ファイルを見てみました。.log ファイルはたくさんあったのですが、etex.log というファイルだけが、他のファイルと違って *.fmt というファイルが出来ていなかったので、たぶんこれが問題のログでしょう。&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;etex.log の中身を見てみると、最後の方で&lt;/p&gt;

&lt;pre class=&quot;console&quot;&gt;! TeX capacity exceeded, sorry [pattern memory=300000].&lt;/pre&gt;

&lt;p&gt;というエラーが起こっているようです。&lt;/p&gt;

&lt;p&gt;このエラー自体は、無限ループなどによって TeX の処理系が使うスタックが溢れそうになったときに起こるようですが、それ以上のことは私にはよくわかりません。&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;ちなみに、私の環境では loadhyph-hu.tex というファイルの中で hyph-hu.tex というファイルを処理しようとしたときにこのエラーが起こっていましたので、loadhyph-hu.tex がロードされないように /usr/share/texmf-texlive/tex/generic/config/language.def を修正して、loadhyph-hu.tex が呼び出されている行をコメントアウトしました。&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;それで再度 uptex のパッケージのインストールを試みたところ、やはり同じようなエラーが起こりました。ログファイルを確認すると、別の言語のファイルを処理しようとしたところでエラーが起こったようです。&lt;/p&gt;

&lt;p&gt;先程コメントアウトしたハンガリー語(hu）の他に、ノルウェー語(nb)やスウェーデン語(sv)、英国の英語(en-gb) を同様にコメントアウトする必要がありました。&lt;/p&gt;

&lt;p&gt;これらの言語を使わない場合は、コメントアウトしてしまってもよいのではないでしょうか。&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;これでようやく uptex のパッケージをインストールし、実行することができました。&lt;/p&gt;

&lt;p&gt;（/opt/uptex/bin に PATH を通すのを忘れないようにしましょう）&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;問題の根本の原因がよくわかりませんが、とりあえず回避できたのでその方法を公開してみます。&lt;/p&gt;

&lt;p&gt;「ここはこうしたほうがよい」とか「根本の原因はこうだから、こういうふうに直したほうがよい」等の情報がございましたらお教えいただけると幸いです。&lt;/p&gt;</content>
</entry>

<entry>
  <title>VMware Player でゲスト OS として Ubuntu 10.04 LTS Desktop をインストールしたらログイン画面でキーボード入力ができなかった問題</title>
  <link href="http://bearmini.net/blog/View.aspx?bid=1&amp;aid=182" />
  <id>urn:uuid:6080697e-d6f9-4149-adca-e6896185e50e</id>
  <updated>2010-05-19T18:00:00-05:00</updated>
  <content type="html">&lt;p&gt;タイトル通りなのですが、VMware Player 3.0.1 で Ubuntu 10.04 を新規インストールしたら、ログイン画面でパスワードを入力しようとしてキーボードが一切使えなくて弱りました。&lt;/p&gt;  &lt;p&gt;（アップグレードした方は問題なかったんですけどね、、、）&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;http://bearmini.net/blog/repos.aspx?2010/05/19/2010.05.20_vmware_ubuntu_01.png&quot;&gt;&lt;img style=&quot;border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px&quot; title=&quot;2010.05.20_vmware_ubuntu_01&quot; border=&quot;0&quot; alt=&quot;2010.05.20_vmware_ubuntu_01&quot; src=&quot;http://bearmini.net/blog/repos.aspx?2010/05/19/2010.05.20_vmware_ubuntu_01_thumb.png&quot; width=&quot;591&quot; height=&quot;480&quot; /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;↑この状態から何もできない。キーを押しても何も反応しない。&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;マウスは使える（ボタン等をクリックできる）のですが、、、&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;マウスが使えるなら、、、ということで、VMware の外のアプリ（メモ帳など）でパスワード文字列を入力し、それをコピーしてから Ubuntu のログイン画面のパスワード欄へペーストしようとしたのですが、受け付けられませんでした。&lt;/p&gt;  &lt;p&gt;オンスクリーンキーボードを使おうとしたら、一瞬ちらっと表示されてすぐ消えてしまいました（汗）&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h2&gt;解決策&lt;/h2&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;オンスクリーンキーボードを使う設定にして、&lt;strong&gt;一旦再起動&lt;/strong&gt;。 &lt;/li&gt;    &lt;li&gt;再起動後、オンスクリーンキーボードが表示されて使えるようになっているので、パスワードを入力し、ログイン &lt;/li&gt;    &lt;li&gt;ログイン後はキーボードが普通に使えるので、/etc/default/console-setup を編集して次回からオンスクリーンキーボードが不要なようにする &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;以下、スクリーンショットを交えて手順を詳細に説明します。&lt;/p&gt;  &lt;p&gt;（ちなみに私がインストールした Ubuntu は英語版なので、他の言語のバージョン（日本語版とか）だと表示される内容が違ったりするかもしれませんが、大まかな手順は一緒だと思います）&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h3&gt;1. オンスクリーンキーボードを使う設定にして、一旦再起動&lt;/h3&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;オンスクリーンキーボードは以下のようにして使えるようにします。&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;http://bearmini.net/blog/repos.aspx?2010/05/19/2010.05.20_vmware_ubuntu_02.png&quot;&gt;&lt;img style=&quot;border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px&quot; title=&quot;2010.05.20_vmware_ubuntu_02&quot; border=&quot;0&quot; alt=&quot;2010.05.20_vmware_ubuntu_02&quot; src=&quot;http://bearmini.net/blog/repos.aspx?2010/05/19/2010.05.20_vmware_ubuntu_02_thumb.png&quot; width=&quot;485&quot; height=&quot;237&quot; /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Universal Access Preferences を選ぶと、以下のようなダイアログが現れるので、”Use on-screen keyboard”（オンスクリーンキーボードを使う）にチェックを入れます。&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;http://bearmini.net/blog/repos.aspx?2010/05/19/2010.05.20_vmware_ubuntu_03.png&quot;&gt;&lt;img style=&quot;border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px&quot; title=&quot;2010.05.20_vmware_ubuntu_03&quot; border=&quot;0&quot; alt=&quot;2010.05.20_vmware_ubuntu_03&quot; src=&quot;http://bearmini.net/blog/repos.aspx?2010/05/19/2010.05.20_vmware_ubuntu_03_thumb.png&quot; width=&quot;550&quot; height=&quot;378&quot; /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;これでこのダイアログを閉じると、一瞬何かが（おそらくオンスクリーンキーボードが）ちらっと表示されてすぐ消えてしまいます。&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;ここはぐっとこらえて一度再起動します。&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h3&gt;2. 再起動後、オンスクリーンキーボードが表示されて使えるようになっているので、パスワードを入力し、ログイン&lt;/h3&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;http://bearmini.net/blog/repos.aspx?2010/05/19/2010.05.20_vmware_ubuntu_04.png&quot;&gt;&lt;img style=&quot;border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px&quot; title=&quot;2010.05.20_vmware_ubuntu_04&quot; border=&quot;0&quot; alt=&quot;2010.05.20_vmware_ubuntu_04&quot; src=&quot;http://bearmini.net/blog/repos.aspx?2010/05/19/2010.05.20_vmware_ubuntu_04_thumb.png&quot; width=&quot;537&quot; height=&quot;382&quot; /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;↑このように、オンスクリーンキーボードでパスワードを入力できるようになっているはずです。&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h3&gt;3. ログイン後はキーボードが普通に使えるので、/etc/default/console-setup を編集して次回からオンスクリーンキーボードが不要なようにする&lt;/h3&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;ログイン後は、なぜか普通にキーボードが使えるようになっています。&lt;/p&gt;  &lt;p&gt;不思議です。&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;とはいえ、毎回オンスクリーンキーボードでパスワードを入力しなければならないのも面倒なので、直してしまいましょう。&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;/etc/default/console-setup というファイルがあるので、それを管理者権限で開いて、以下のような部分を見つけてください。&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;編集前：&lt;/p&gt;  &lt;pre class=&quot;code&quot;&gt;XKBMODEL=&amp;quot;SKIP&amp;quot;
XKBLAYOUT=&amp;quot;us&amp;quot;
XKBVARIANT=&amp;quot;U.S. English&amp;quot;
XKBOPTIONS=&amp;quot;&amp;quot;&lt;/pre&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;これを、以下のように編集します。（英語キーボードの場合）&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;編集後：&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;XKBMODEL=&amp;quot;pc105&amp;quot;
XKBLAYOUT=&amp;quot;us&amp;quot;
XKBVARIANT=&amp;quot;&amp;quot;
XKBOPTIONS=&amp;quot;&amp;quot;&lt;/pre&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;日本語キーボードをお使いの場合は、XKBMODEL は pc106 とかになって XKBLAYOUT は jp とかになるのでしょうかね（日本語キーボードを持っていないので私は確認できません。日本語キーボードで動作確認された方がいらっしゃいましたら、コメント欄等で教えてください。） &lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;これでログイン画面でも、オンスクリーンキーボードでなく普通のキーボードからでもパスワードを入力できるようになっているはずです。&lt;/p&gt;

&lt;p&gt;いったん再起動して、、ログイン画面でキーボードが使えることを確認したら、オンスクリーンキーボードは先程と同じダイアログを出して、OFF にしてしまってよいでしょう。&lt;/p&gt;</content>
</entry>

<entry>
  <title>中断してしまった git svn clone を再開する方法</title>
  <link href="http://bearmini.net/blog/View.aspx?bid=1&amp;aid=181" />
  <id>urn:uuid:be679b99-612e-4ad5-b092-0b146effd8d8</id>
  <updated>2010-04-23T19:40:05-05:00</updated>
  <content type="html">&lt;p&gt;答えから先に書くと、途中まで clone できた git リポジトリの中で&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;pre class=&quot;console&quot;&gt;$ git svn fetch&lt;/pre&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;を実行します。&lt;/p&gt;

&lt;p&gt;これだけです。あとは、完了するのを待ちます。&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;Subversion のリポジトリに履歴が蓄積されていればいるほど、clone するときにかかる時間が長くなってしまいますよね。&lt;/p&gt;

&lt;p&gt;リポジトリのサイズとネットワークの状況によっては、一晩かかっても終わらないかもしれません。&lt;/p&gt;

&lt;p&gt;それだけ長い時間をかけていると、その間にコンピュータの電源を落としたりしないといけなくなるかもしれません。&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;モバイル PC なら clone している途中で別の場所に移動したくなってスリープさせる必要がでてくるかもしれませんし、無線 LAN やデータ通信カードの電波の状況等でネットワーク接続が途切れてしまうかもしれません。&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;デスクトップ PC なら Windows Update などで強制的に再起動させられたりしているかもしれません。&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;そのような理由で git svn clone が中段してしまったときは、最初に書いたように、git svn fetch すれば続きから再開してくれます。&lt;/p&gt;

&lt;p&gt;簡単ですね。&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;ちなみに、私の環境の git のバージョンは 1.6.6.1 でした。&lt;/p&gt;</content>
</entry>

<entry>
  <title>RSpec で exit したかどうかをチェックする方法</title>
  <link href="http://bearmini.net/blog/View.aspx?bid=1&amp;aid=180" />
  <id>urn:uuid:95957d9f-9af0-4467-9ad8-e609f38e7145</id>
  <updated>2010-03-16T08:10:03-05:00</updated>
  <content type="html">&lt;p&gt;RSpec 入門初日でいきなりつまづいたのでメモ。&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;今日は、Makefile の中から呼ばれてシステム環境の事前チェックを行うようなスクリプトを Ruby で書いていました。（必要な環境変数が設定されているか、とか、必要なファイルが存在しているか、とか、ファイルのパーミッションは適切に設定されているか、とか、以下略。そのようなチェックを行うための DSL とかって自分で作らなくてもすでに何かありますかね？ご存じの方は教えてください。）&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;今日書いていたそのスクリプトは、Makefile の中から呼ばれるという性質上、チェックを行った結果として条件が整っていなかった場合には 0 以外のエラーコードを返して終了して欲しいわけです。&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;そのような挙動を RSpec でテストしようとしたのですが、今日入門したばかりの僕にはどうしたらいいのかわかりませんでした。&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;ググったときのキーワードが悪かったのか、日本語の情報は見つけられませんでした。&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;一応、英語のサイトで情報を見つけてうまくいったのでメモしておきます。結構簡単でした。&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;例として、check_file というグローバル関数があって、それを呼んだら指定されたファイルが存在するかどうかのチェックを行い、存在すれば何も起こらず、存在しなければ exit する、という挙動をチェックしたいという場合を想定してみます。&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;spec ファイルの中で、以下のように書くと良いようです。&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;pre class=&quot;ruby&quot; name=&quot;code&quot;&gt;require 'target.rb'

describe &amp;quot;存在しないファイルに対して&amp;quot; do
  it &amp;quot;check_file は exit すること&amp;quot; do
    lambda { check_file(&amp;quot;/hogehoge/fugafuga&amp;quot;) }.should raise_error(SystemExit)
  end
end&lt;/pre&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;最初に require している target.rb はテスト対象のファイルです。&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;ポイントは、exit しそうな関数を lambda { } でくくっておき、 .should raise_error(SystemExit) で exit したことを検出します。これだけです。簡単ですね。&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;ちなみに、グローバル関数に対してチェックを行いましたが、クラスのメソッドに対しても同様にチェックできると思います。&lt;/p&gt;

&lt;p&gt;（むしろ、RSpec を使ってクラスやオブジェクトに所属していないメソッドのテストをする方法の日本語の解説が見つけられなかったので、そんな単純そうなことで結構戸惑ってしまいました。わかってしまったらなんてことないのですが。というわけで RSpec でグローバル関数の挙動をチェックしたい人は上記コードが参考になるかもしれません。ってほどおおげさなものでもないか。）&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;なお、exit するときはたいがい puts とかでメッセージを出力しているはずで、そのメッセージの内容をチェックしたい場合は &lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://pivotallabs.com/users/alex/blog/articles/853-capturing-standard-out-in-unit-tests&quot;&gt;alex blabs - Capturing Standard Out In Unit Tests&lt;/a&gt; 

  &lt;br /&gt;の記事を参考に、標準出力を文字列にリダイレクトすると良いでしょう。&lt;/p&gt;

&lt;p&gt;（実際問題として、メッセージの内容までチェックしないにしても、 RSpec の実行結果の中にテスト対象スクリプトが出力した puts の文字列が紛れ込んでしまうので、リダイレクトした方が実行結果が美しくなるのでいいかもしれません。）&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;今日はちょっと触ってみただけですが、RSpec は面白いですね。ハマる人が続出しているのもわかる気がします。&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;
&lt;a href=&quot;http://www.amazon.co.jp/exec/obidos/ASIN/1590599225/smallbear-22/&quot; target=&quot;_blank&quot;&gt;Foundations of RSpec: Behavior-Driven Development with Ruby and Rails (ペーパーバック)&lt;/a&gt;

&lt;br /&gt;&lt;a href=&quot;http://www.amazon.co.jp/exec/obidos/ASIN/1590599225/smallbear-22/&quot; target=&quot;_blank&quot;&gt;&lt;img border=&quot;0&quot; alt=&quot;1590599225&quot; src=&quot;http://ec3.images-amazon.com/images/I/51BhqTbdSKL._SL160_.jpg&quot; /&gt;&lt;/a&gt;</content>
</entry>

<entry>
  <title>[Linux デバイスドライバ 第3版] サンプルコードをビルドしようとしてエラーが起きる問題の解決方法</title>
  <link href="http://bearmini.net/blog/View.aspx?bid=1&amp;aid=179" />
  <id>urn:uuid:31ce8660-284d-455f-a680-1daa57afa398</id>
  <updated>2010-03-15T06:07:31-05:00</updated>
  <content type="html">&lt;p&gt;仕事で Linux のデバイスドライバを開発しないといけないことになって、&lt;a href=&quot;http://bit.ly/ca68Fd&quot;&gt;Linux デバイスドライバ 第3版&lt;/a&gt; など購入してお勉強しています。&lt;/p&gt;  &lt;p&gt;（ちなみにこれで、デバイスドライバ・そのデバイスを使いこなすための C++ のアプリケーション・そのアプリを外からコントロールするための Web アプリのサーバ・及びその Web サーバにアクセスするための Appcelerator Titanium によるデスクトップアプリケーション、と下から上までオールマイティにひとりでコードを書くことになってしまいました。誰か手伝ってくれる人募集中。）&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;本を読みながら Hello World ドライバ（insmod されたときに printk() で Hello world を表示するもの）はすぐにできたのですが、もっと高度な（まともに使える）デバイスドライバを書くには本の情報だけだとちょっと足りません。&lt;/p&gt;  &lt;p&gt;そこでオライリーのサイトから&lt;a href=&quot;http://examples.oreilly.com/9780596005900/&quot;&gt;サンプルコード&lt;/a&gt;を落としてきて、ビルドしてみたのですが、エラーになってしまいました。&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;エラーの内容は、&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;pre class=&quot;console&quot;&gt;cc -O2 -fomit-frame-pointer -Wall -I/lib/modules/2.6.31-14-server/build/include    setlevel.c   -o setlevel
setlevel.c:30: error: expected declaration specifiers or ‘...’ before ‘syslog’
setlevel.c:30: error: expected declaration specifiers or ‘...’ before ‘type’
setlevel.c:30: error: expected declaration specifiers or ‘...’ before ‘bufp’
setlevel.c:30: error: expected declaration specifiers or ‘...’ before ‘len’
setlevel.c:30: warning: data definition has no type or storage class
setlevel.c:30: warning: type defaults to ‘int’ in declaration of ‘_syscall3’
setlevel.c: In function ‘main’:
setlevel.c:41: warning: implicit declaration of function ‘syslog’
make[1]: *** [setlevel] Error 1&lt;/pre&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;という感じで、幾つかあるサンプルのうち misc-progs という最初のサンプルをビルドしようとしていきなり失敗しました。&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;ちなみに私の環境は Ubuntu 9.10 (kernel は 2.6.31.20-generic) です。&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;とりあえず、今必要な scull だけはビルドできないかなぁと思って scull ディレクトリに移動して make してみたところ、&lt;/p&gt;

&lt;pre class=&quot;console&quot;&gt;scripts/Makefile.build:49: *** CFLAGS was changed in &amp;quot;/home/hoge/examples/scull/Makefile&amp;quot;. Fix it to use EXTRA_CFLAGS.  Stop.&lt;/pre&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;というエラーが起こってしまいました。&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;仕方ないので Makefile を手直しします。&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;pre class=&quot;Makefile&quot; name=&quot;code&quot;&gt;CFLAGS += $(DEBFLAGS)
CFLAGS += -I$(LDDINC)&lt;/pre&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;と書かれている行があると思うので、それを上記のエラーメッセージにしたがって&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;pre class=&quot;Makefile&quot; name=&quot;code&quot;&gt;EXTRA_CFLAGS += $(DEBFLAGS)
EXTRA_CFLAGS += -I$(LDDINC)&lt;/pre&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;と修正します。（EXTRA_ を先頭に付加）&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;これで make してみると、、、&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;pre class=&quot;console&quot;&gt;  CC [M]  /home/hoge/examples/scull/main.o
/home/hoge/examples/scull/main.c:17:26: error: linux/config.h: No such file or directory&lt;/pre&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;まだエラーが出ますね（汗&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;linux/config.h はカーネルのバージョンが 2.6.19 以降では使われなくなったようで、単純に linux/autoconf.h に置き換えれば良いようです。&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;scull では main.c で linux/config.h を include しているようですので、そこを書き換えて再度 make します。&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;pre class=&quot;console&quot;&gt;  CC [M]  /home/hoge/examples/scull/access.o
/home/hoge/examples/scull/access.c: In function ‘scull_u_open’:
/home/hoge/examples/scull/access.c:106: error: dereferencing pointer to incomplete type
/home/hoge/examples/scull/access.c:107: error: dereferencing pointer to incomplete type
/home/hoge/examples/scull/access.c:114: error: dereferencing pointer to incomplete type
/home/hoge/examples/scull/access.c: In function ‘scull_w_available’:
/home/hoge/examples/scull/access.c:165: error: dereferencing pointer to incomplete type
/home/hoge/examples/scull/access.c:166: error: dereferencing pointer to incomplete type
/home/hoge/examples/scull/access.c: In function ‘scull_w_open’:
/home/hoge/examples/scull/access.c:179: error: ‘TASK_INTERRUPTIBLE’ undeclared (first use in this function)
/home/hoge/examples/scull/access.c:179: error: (Each undeclared identifier is reported only once
/home/hoge/examples/scull/access.c:179: error: for each function it appears in.)
/home/hoge/examples/scull/access.c:179: error: implicit declaration of function ‘signal_pending’
/home/hoge/examples/scull/access.c:179: error: implicit declaration of function ‘schedule’
/home/hoge/examples/scull/access.c:184: error: dereferencing pointer to incomplete type
/home/hoge/examples/scull/access.c: In function ‘scull_w_release’:
/home/hoge/examples/scull/access.c:205: error: ‘TASK_INTERRUPTIBLE’ undeclared (first use in this function)
/home/hoge/examples/scull/access.c: In function ‘scull_c_open’:
/home/hoge/examples/scull/access.c:277: error: dereferencing pointer to incomplete type
/home/hoge/examples/scull/access.c:281: error: dereferencing pointer to incomplete type&lt;/pre&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;orz orz orz&lt;/p&gt;

&lt;p&gt;さらに大量のエラーが出ます。&lt;/p&gt;

&lt;p&gt;しかし、これらのエラーは結果的には単純な理由によるものなのでめげずに直していきましょう。&lt;/p&gt;

&lt;p&gt;まず、access.c の current というマクロを参照しているところでエラーとなっているのですが、これは asm/current.h で定義されています。&lt;/p&gt;

&lt;p&gt;また、current は結局 tasc_struct 構造体（のポインタ）を参照することになるのですが、これは linux/sched.h で定義されていますのでこれら二つのヘッダファイルを access.c に追加しましょう。&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;pre class=&quot;c&quot; name=&quot;code&quot;&gt;#include &amp;lt;linux/sched.h&amp;gt;  /* for task_struct */
#include &amp;lt;asm/current.h&amp;gt;  /* for 'current' */ &lt;/pre&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;追加する場所は、どこでもいいですが、#include “scull.h” の直前あたりでしょうかね。&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;この時点で make しても、まだエラーが出ます。&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;pre class=&quot;console&quot;&gt;  CC [M]  /home/hoge/examples/scull/access.o
/home/hoge/examples/scull/access.c: In function ‘scull_u_open’:
/home/hoge/examples/scull/access.c:109: error: ‘struct task_struct’ has no member named ‘uid’
/home/hoge/examples/scull/access.c:110: error: ‘struct task_struct’ has no member named ‘euid’
/home/hoge/examples/scull/access.c:117: error: ‘struct task_struct’ has no member named ‘uid’
/home/hoge/examples/scull/access.c: In function ‘scull_w_available’:
/home/hoge/examples/scull/access.c:168: error: ‘struct task_struct’ has no member named ‘uid’
/home/hoge/examples/scull/access.c:169: error: ‘struct task_struct’ has no member named ‘euid’
/home/hoge/examples/scull/access.c: In function ‘scull_w_open’:
/home/hoge/examples/scull/access.c:187: error: ‘struct task_struct’ has no member named ‘uid’&lt;/pre&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;これも単純に修正可能です。同じく access.c の current-&amp;gt;uid や current-&amp;gt;euid を参照している箇所を、単純に current-&amp;gt;cred-&amp;gt;uid や current-&amp;gt;cred-&amp;gt;euid に置き換えます。（cred-&amp;gt; を追加）&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;これでようやく make が通るようになるはずです。&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;make できたら、scull_load スクリプトでロードしてみましょう。&lt;/p&gt;

&lt;pre class=&quot;console&quot;&gt;$ sudo sh ./scull_load
$ ls -l /dev/scull*
lrwxrwxrwx 1 root root        6 2010-03-15 18:01 /dev/scull -&amp;gt; scull0
crw-rw-r-- 1 root staff 250,  0 2010-03-15 18:01 /dev/scull0
crw-rw-r-- 1 root staff 250,  1 2010-03-15 18:01 /dev/scull1
crw-rw-r-- 1 root staff 250,  2 2010-03-15 18:01 /dev/scull2
crw-rw-r-- 1 root staff 250,  3 2010-03-15 18:01 /dev/scull3
lrwxrwxrwx 1 root root       10 2010-03-15 18:01 /dev/scullpipe -&amp;gt; scullpipe0
crw-rw-r-- 1 root staff 250,  4 2010-03-15 18:01 /dev/scullpipe0
crw-rw-r-- 1 root staff 250,  5 2010-03-15 18:01 /dev/scullpipe1
crw-rw-r-- 1 root staff 250,  6 2010-03-15 18:01 /dev/scullpipe2
crw-rw-r-- 1 root staff 250,  7 2010-03-15 18:01 /dev/scullpipe3
crw-rw-r-- 1 root staff 250, 11 2010-03-15 18:01 /dev/scullpriv
crw-rw-r-- 1 root staff 250,  8 2010-03-15 18:01 /dev/scullsingle
crw-rw-r-- 1 root staff 250,  9 2010-03-15 18:01 /dev/sculluid
crw-rw-r-- 1 root staff 250, 10 2010-03-15 18:01 /dev/scullwuid&lt;/pre&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;scull デバイスに cat や dd でファイルを書き込んでみたり読み出してみたりすることができれば成功です。&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;
&lt;a href=&quot;http://www.amazon.co.jp/exec/obidos/ASIN/4873112532/smallbear-22/&quot; target=&quot;_blank&quot;&gt;Linuxデバイスドライバ 第3版 (単行本)&lt;/a&gt; 

&lt;br /&gt;&lt;a href=&quot;http://www.amazon.co.jp/exec/obidos/ASIN/4873112532/smallbear-22/&quot; target=&quot;_blank&quot;&gt;&lt;img border=&quot;0&quot; alt=&quot;4873112532&quot; src=&quot;http://ecx.images-amazon.com/images/I/51XDC8XAK3L._SL160_.jpg&quot; /&gt;&lt;/a&gt; 

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;私はこの本を購入して、早速裁断してスキャンして電子化してしまいました。（裁断機とかスキャナの話はそのうちこのブログで書くかもしれませんが、世の中に結構そういう情報がすでに溢れているので、めげるかもしれません。）&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;今まで、興味はありながらも未知の暗黒世界だったデバイスドライバの領域ですが、この本は本当に基本的なところから必要なことを親切に解説してくれるので、よい道標となります。&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;あとはサンプルコードを読んだりしながら分からないことを調べていけば、実用的で堅牢なデバイスドライバを書くことができるようになりそうな気がします。&lt;/p&gt;</content>
</entry>
</feed>