SSブログ
前の10件 | -

LD_LIBRARY_PATH 指定の順番に気をつける ーパッケージ管理ツールを過信するなー

ー 超基本的な事かもしれないが。(恥ずかしながら)ハマってしまったので注意喚起の意味を込めて記載。

Android の SDK のデバッグツールをいじってたら、以下のログを出力して壮大にご臨終召された。

java: symbol lookup error: /usr/lib/libgnomevfs-2.so.0: undefined symbol: xmlTextReaderConstName

エラーを訴えているライブラリは ELF ファイルだし、CLASSPATH の問題じゃなさそうだ。環境変数 LD_LIBRARY_PATH がいけないのかなー
→ $ export PATH=${PATH}:/usr/lib
→ # /sbin/ldconfig
→ 再現

そもそも、ライブラリが足りないのかな?
→ 足りないと言われているシンボル (xmlTextReaderConstName) を含むライブラリを含むパッケージをインストール。案の定無かった。
→ でも、再現

え? 何がいけないの? ライブラリあるのにシンボルを参照してないってことは ...

$ ldd /usr/lib/libgnomevfs-2.so.0
linux-gate.so.1 => (0xb77e6000)
libgmodule-2.0.so.0 => /usr/lib/libgmodule-2.0.so.0 (0xb776f000)
libgthread-2.0.so.0 => /usr/lib/libgthread-2.0.so.0 (0xb776a000)
libgconf-2.so.4 => /usr/lib/libgconf-2.so.4 (0xb7737000)
libxml2.so.2 => /home/xxx/yyy/cvsroot-wgn/airone-debug/lib/libxml2.so.2 (0xb76b0000)
libdbus-glib-1.so.2 => /usr/lib/libdbus-glib-1.so.2 (0xb7694000)
libdbus-1.so.3 => /usr/lib/libdbus-1.so.3 (0xb765c000)
libgobject-2.0.so.0 => /usr/lib/libgobject-2.0.so.0 (0xb7620000)
libgnutls.so.26 => /usr/lib/libgnutls.so.26 (0xb7582000)
libavahi-glib.so.1 => /usr/lib/libavahi-glib.so.1 (0xb757f000)
libglib-2.0.so.0 => /usr/lib/libglib-2.0.so.0 (0xb74ca000)
libavahi-common.so.3 => /usr/lib/libavahi-common.so.3 (0xb74be000)
libavahi-client.so.3 => /usr/lib/libavahi-client.so.3 (0xb74ae000)
libresolv.so.2 => /lib/i686/cmov/libresolv.so.2 (0xb7499000)
libutil.so.1 => /lib/i686/cmov/libutil.so.1 (0xb7495000)
libpthread.so.0 => /lib/i686/cmov/libpthread.so.0 (0xb747c000)
libc.so.6 => /lib/i686/cmov/libc.so.6 (0xb7321000)
libdl.so.2 => /lib/i686/cmov/libdl.so.2 (0xb731d000)
librt.so.1 => /lib/i686/cmov/librt.so.1 (0xb7314000)
libORBit-2.so.0 => /usr/lib/libORBit-2.so.0 (0xb72c0000)
libm.so.6 => /lib/i686/cmov/libm.so.6 (0xb729a000)
libnsl.so.1 => /lib/i686/cmov/libnsl.so.1 (0xb7281000)
libtasn1.so.3 => /usr/lib/libtasn1.so.3 (0xb7271000)
libgpg-error.so.0 => /usr/lib/libgpg-error.so.0 (0xb726d000)
libz.so.1 => /usr/lib/libz.so.1 (0xb7257000)
libgcrypt.so.11 => /usr/lib/libgcrypt.so.11 (0xb71ef000)
libpcre.so.3 => /usr/lib/libpcre.so.3 (0xb71c6000)
/lib/ld-linux.so.2 (0xb77e7000)


libxml2.so.2 がアサッテなパスのライブラリを参照している。
なんぞ!? と思いながら ~/.bashrc を見てみると、次の一分が飛び込む

export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/usr/local/lib:${AIRCOLLECTORDIR}/lib:/usr/local/h8tools/lib:${AIRDIR}/lib"

別の開発環境のライブラリパスが /usr/lib のより先に来ている事が問題みたい。

export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/usr/lib:/usr/local/lib:${AIRCOLLECTORDIR}/lib:/usr/local/h8tools/lib:${AIRDIR}/lib"

こうして、bash 再起動して検索キャッシュを再構築したら解決した。
『パッケージ管理ツールで入れたから大丈夫』と、過信してはいけない。

<教訓 : LD_LIBRARY_PATH 指定の順番に気をつける >

Haskell で行列計算

 今回は行列の演算 (加算・乗算) を行うプログラムを Haskell で書いてみた。
 もちろん同じプログラムも C や Perl で書けるが。行列の演算を行う際に、多くの場合2重ループを使って実現すると思うが。Haskell の場合には、リストモナドを使って簡潔に書く事ができる。
 以下がそのコード。

[calcMatrix.hs]

mxA = [[1,2],
[3,4],
[5,6]]

mxB = [[2,3,4],
[3,4,5]]

main = print $ mxB /**/ mxA

-- 行列とスカラの積算
(/*/) :: Int -> [[Int]] -> [[Int]]
(/*/) a mx = map (\x -> a /* x) mx

-- 行列どうしの積算
(/**/) :: [[Int]] -> [[Int]] -> [[Int]]
(/**/) mx my = let tmy = transpose my
in if length tmy == length mx
then cutArray (length mx) $ inMulti mx $ transpose my
else []
where
inMulti :: [[Int]] -> [[Int]] -> [Int]
inMulti mx my = do x <- mx
y <- my
[x /** y]

-- 配列から行列への変換
cutArray :: Int -> [Int] -> [[Int]]
cutArray len xs | xs == [] = []
| True = [(take len xs)] ++ (cutArray len $ reverse $ take ((length xs) - len) $ reverse xs)

-- 行列どうしの加算
(/++/) :: [[Int]] -> [[Int]] -> [[Int]]
(/++/) mx my = if (length mx) == (length my) then mxAdd mx my else []
where
mxAdd :: [[Int]] -> [[Int]] -> [[Int]]
mxAdd (xs:mx) (ys:my) | mx == [] || my == [] = [xs /++ ys]
| True = [xs /++ ys] ++ (mxAdd mx my)

-- ベクトルとスカラの積算
(/*) :: Int -> [Int] -> [Int]
(/*) a xs = map (\x -> x * a) xs

-- ベクトルどうしの加算
(/++) :: [Int] -> [Int] -> [Int]
(/++) xs ys = if (length xs) == (length ys) then aryAdd xs ys else []
where
aryAdd :: [Int] -> [Int] -> [Int]
aryAdd (x:xs) (y:ys) | xs == [] || ys == [] = [x + y]
| True = [x + y] ++ (aryAdd xs ys)


-- ベクトルどうしの積算
(/**) :: [Int] -> [Int] -> Int
(/**) (x:xs) (y:ys) | xs == [] || ys == [] = (x * y)
| True = (x * y) + (xs /** ys)

-- 行列 A の転置行列を求める
transpose :: [[Int]] -> [[Int]]
transpose matrix = transpose' matrix 1
where
transpose' :: [[Int]] -> Int -> [[Int]]
transpose' mx iterater | iterater > (length $ head mx) = []
| True = map (\x -> head $ reverse $ take iterater x) mx : transpose' mx (iterater + 1)

実行結果は次のようになる。

$ ghc calcMatrix.hs
$ ./a.out
[[31,40],[40,52]]


上の実行結果は 2*3 行列と 3*2 行列の積算結果だが。これを逆にすると、次のようにちゃんと 3*3 行列が出てくる。

$ ghc calcMatrix.hs
$ ./a.out
[[8,11,14],[18,25,32],[28,39,50]]

 また上述の main 関数中では使っていないが。他にも行列同士の加算や行列とスカラの乗算を行う演算子を定義した。よかったら、遊んでみてほしい。

Haskell で水差し問題を解く (自答編 2)

前回の話は、全状態のリストを求めるところまでと、中途半端だったので。全ての解を求めるプログラムを作成した。

ゴール状態に到着したら、ゴールまでの経路を文字列に変換し、全ての解とその経路を出力している。
以下が、コードの全体。

import List
import Char

basicState = (0,0)
actions = let {xmax = 4; ymax = 3}
in [(\(x, y) -> (xmax, y)),
(\(x, y) -> (x, ymax)),
(\(x, y) -> (0, y)),
(\(x, y) -> (x, 0)),
(\(x, y) -> if (x + y > xmax) then (xmax, y+x-xmax) else (x+y, 0)),
(\(x, y) -> if (x + y > ymax) then (x+y-ymax, ymax) else (0, x+y))]

main = putStr $ searchStates [] basicState

searchStates :: [(Int, Int)] -> (Int, Int) -> String
searchStates route state | stateGoal(state) = makeLine (state:route)
| True = let nexts = nub $ filter (not . (checkState route)) $ execSeek actions state
in if length nexts > 0
then concatMap (searchStates (state:route)) nexts
else ""

execSeek :: [((Int, Int) -> (Int, Int))] -> (Int, Int) -> [(Int, Int)]
execSeek (f:fs) crnt | null fs = (f crnt : [])
| True = (f crnt : []) ++ execSeek fs crnt

stateGoal :: (Int, Int) -> Bool
stateGoal (x,y) | x == 2 || y == 2 = True
| True = False

checkState :: [(Int, Int)] -> (Int, Int) -> Bool
checkState states (crnt_x, crnt_y) = any isSameState states
where
isSameState :: (Int, Int) -> Bool
isSameState (x, y) = if (x == crnt_x && y == crnt_y) then True else False

makeLine :: [(Int, Int)] -> String
makeLine states = (concatMap (\(x, y) -> "("++((chr (ord('0')+x)):", ")++((chr (ord('0')+y)):")") ) states) ++ "\n"


出力結果は次のようになる

./a.out | nl | tail
3143 (2, 3)(4, 1)(4, 1)(0, 1)(1, 0)(1, 0)(1, 3)(4, 0)(4, 3)(3, 3)(3, 3)(3, 0)(3, 0)(0, 3)(0, 0)(0, 0)
3144 (2, 3)(4, 1)(0, 1)(1, 0)(1, 0)(1, 3)(4, 0)(4, 3)(3, 3)(3, 3)(3, 0)(3, 0)(0, 3)(0, 0)(0, 0)
3145 (2, 3)(4, 1)(4, 1)(0, 1)(0, 1)(1, 0)(1, 0)(1, 3)(4, 0)(4, 3)(3, 3)(3, 3)(3, 0)(3, 0)(0, 3)(0, 0)(0, 0)
3146 (2, 3)(4, 1)(0, 1)(0, 1)(1, 0)(1, 0)(1, 3)(4, 0)(4, 3)(3, 3)(3, 3)(3, 0)(3, 0)(0, 3)(0, 0)(0, 0)
3147 (2, 3)(4, 1)(4, 1)(0, 1)(1, 0)(1, 3)(4, 0)(4, 3)(3, 3)(3, 3)(3, 0)(3, 0)(0, 3)(0, 0)(0, 0)
3148 (2, 3)(4, 1)(0, 1)(1, 0)(1, 3)(4, 0)(4, 3)(3, 3)(3, 3)(3, 0)(3, 0)(0, 3)(0, 0)(0, 0)
3149 (2, 3)(4, 1)(4, 1)(0, 1)(0, 1)(1, 0)(1, 3)(4, 0)(4, 3)(3, 3)(3, 3)(3, 0)(3, 0)(0, 3)(0, 0)(0, 0)
3150 (2, 3)(4, 1)(0, 1)(0, 1)(1, 0)(1, 3)(4, 0)(4, 3)(3, 3)(3, 3)(3, 0)(3, 0)(0, 3)(0, 0)(0, 0)
3151 (4, 2)(3, 3)(3, 3)(3, 0)(3, 0)(0, 3)(0, 0)(0, 0)
3152 (4, 2)(3, 3)(3, 0)(3, 0)(0, 3)(0, 0)(0, 0)


実行 (可能) 状態にあるプロセスを休眠させるカーネル処理の実装 [Linux]

○ 実行 (可能) 状態にあるプロセスを休眠させるカーネル処理の実装

[ありえるえりあ] 実行 (可能) 状態にあるプロセスを休眠させるカーネル処理の実装


これによって、Onix のパフォーマンスがナンボか良くなった。

I/O スケジューラの実装における各種制限 [Linux]

○ I/O スケジューラの実装における各種制限

[ありえるえりあ] I/O スケジューラの実装における各種制限


 これから GNU/Linux の I/O スケジューラを作ろうとしている人間には、少しは役に立つ内容だろうと思う。

I/O スケジューラの sysfs エントリについてのまとめ [Linux]

○ I/O スケジューラの sysfs エントリについてのまとめ

I/O スケジューラの sysfs エントリについてのまとめ


GNU/Linux カーネルプログラミングにおいて、かなり実用的な内容にまとめた (つもり)

I/O スケジューラ (その8-2) + 他 [Linux]

○ I/O スケジューラ (その8-2)

[ありえるえりあ] I/O スケジューラ (その8-2)


○ 今後の学習予定

 先月 9 日に DRBD が本家マージを果たした [1]。
 今後はこれについても調べてみようと思う。

[1] http://www.linux-magazine.com/Online/News/DRBD-Merged-into-Mainline-Kernel

I/O スケジューラ (その8-1) + 他 [Linux]

○ I/O スケジューラ (その8-1)

[ありえるえりあ] I/O スケジューラ (その8-1)


○ JCSSAセミナーでプレゼンをしてきた話

日本コンピュータシステム販売店協会のIPA開発支援ソフトウェア説明会に、プレゼンテータとして参加してきた。
『説明会』というタイトルにもあるように、単なる成果の紹介だと思い、軽い気持ちで会場に行ったのだが。会場に来られたのは目をギラギラ光らせた利に聡い企業経営者の方々。そして他のプレゼンテータの方々の内容も、完全に各人の会社組織を代表したセールストークであった。

そんなわけで、自分の存在は完全に浮き上がっていた。
自分のプレゼンはというと。"販売店協会" へのプレゼンなので、技術者はあまり居なそうだなと思い、これまでに話してきたような技術話は一切封印した。そして、プロジェクトのコンセプト (グリーン IT) から話を始め、Onix の有用性を訴えた所で時間切れとなった。
プロダクトのアピールをするという点では弱かったが。かなり順を追って話をしたつもりなので、その存在がどんなものかという事はわかってもらえたんじゃないかなと思うのだが。いかんせん質問タイムが無いので、わかってもらえているのかが全くわからず、とっても不安になる。

I/O スケジューラ (その7) + 他 [Linux]

○ I/O スケジューラ (その7)

[ありえるえりあ] I/O スケジューラ (その7)


○ わかりやすい技術話

 自分がアルバイトとして所属する IT ベンチャー企業の開発部は、過去に多くの優秀な学生を世に排出しており、自分はそのうち二人の優秀な学生を存じ上げている。
 一人は一昨年、研究員として日本を代表する電気メーカーのひとつである某社に入社された、若き技術エリート。
 もう一人は、以前にも触れたが。あの Unix Magazine で、内閣官房の山口さん、現・東工大准教授で未踏PMの首藤さん、そして西谷さんら有名人を差し置いて、表紙のトップに名前を飾った凄い人で。今年、情報・通信業を主とする超多国籍企業の某社に入社し、入社式で新入社員代表挨拶を任された、折紙付きのエリートである。

 一昨日。そんな彼らと、上述のベンチャーに自分よりも前から所属しており、社内の技術部門幹部から天才と称され、自分も尊敬する未来のエリートと共に、現在お世話になっているベンチャーの CTO からご馳走になった。

 その席において。大変に恐縮ながら自分のブログエントリを閲覧していただいているという話とともに、一言。次のような大変にありがたいアドバイスを頂戴した。


 『わかりにくい』と。


 ありえるえりあに投稿している内容は。後から自分が読んで理解しやすいように、また他人がそれを読んで理解しやすいであろう内容及び記述を行っているつもりであるが。それらの配慮はどうやら、独り善がりであったようだ。
 目的が前者に重点を置いている場合には、問題はないのだが。せっかく彼らを含む、凄い人が読んでくれているのだから、最低限彼らが読みやすいと思ってもらえるように努力すべきだろう。

 なので。彼らのアドバイス (クレーム) 及び同社 CTO の貴重なご意見を尊重して。まずは文書フォーマットを次に示す形式に代えた。

タイトル

1. 序論 (前回の復習等)

2. 概要 (今回学習する内容は何で、どんなものかの説明)

3. 学習内容のまとめ (学習した内容を、自分なりに端的にまとめたもの)

4. 内容詳細 (学習した内容を、かいつまんで説明)

5. まとめ

 一般的に論文はこのような形式で書かれているわけだ。
 ジャーナルに掲載されている論文と比較して、これはかなり砕けたフォーマットだが。意識としてはそれに近づけるように、今後の学習内容を記述してゆく。

前の10件 | -

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。