SSブログ

PythonでRSSを生成する [Linux]

http://blog.wiredeffect.com/archives/639

RSS を Python から作成したくて色々探してみたのですが、ElementTree や RSS.py を触ってみたものの使用感が個人的にイマイチ。 更に探してみたら PyRSS2Gen というものがあることを発見。使ってみた感覚としては、前述した ElementTree や RSS.py より利用しやすいと思いました。


とのことらしい。週末に本気出す。

ちょっとだけ編集したい場合の.vimrc [Linux]

カスタマイズできるのがvimの魅力ではあるが、この環境じゃないとヤダヤダなんて言ってるやつは仕事で使い物にならないことが多い。俺か。が、vimのデフォルトは非常にストレスフルなので、どこでも作業するのに最低限設定したほうがいいというのを抜き出してみた。

・インクリメンタルサーチ
・ケース無視
・ハイライト
・シンタックスON
・タブ幅 4

オートインデントは見るだけならいらない。
シンタックスハイライトもいらんだろ という話は大いにありそうだが、自分は色でソースの配置を判断することが多いので、効率に影響する。

expandtabはオートインデントなどとセットでそのソースのインデント方式に合わせて設定する。元のソースがTab使ってるのに編集したところだけスペースでTabやってたら怒られる。というか俺が怒る。

あとここらへんのやつは単語の頭を抜き出してset igとかでもよい
サーバの設定をちょっとやるときは.vimrc用意しなくても設定できるようにはしておきたいところ。


========================================
syntax on
colorscheme darkblue

set ignorecase
set incsearch
set hlsearch

set cindent
set autoindent
set smartindent
set smarttab

set ts=4
set shiftwidth=4
set softtabstop=4

set expandtab
========================================

・vimrc
http://qiita.com/ahiruman5/items/4f3c845500c172a02935

・screenrc
http://qiita.com/t_cyrill/items/54ffb13918cb421a961b

hardstatus alwayslastline '%{= kw}%02c:%s %{= .y}%H %L=%{= .b}%-w%46>%{= .r}%n %t*%{= .b}%+w%-16=%{= .y}[%l]'

プロセスとファイルの関連をしらべる方法 [Linux]

サーバ上のファイルを消そうとしたら消せなかったので調べてみた。
fuserを使えばよいらしい。

http://www.math.kobe-u.ac.jp/~kodama/tips-linux-fileuser.html

プロセスとファイルの関連をしらべる

Linux で プロセスとファイルの対応を調べる方法.
プロセス番号と実行のファイルの関連(pstree -p, ps aux, top)
プロセス番号 --> 実行ファイル(/proc/*/exe)
実行ファイル --> プロセス番号(fuser)
プロセスと それが open/使用 しているファイルの対応
プロセス --> オープンファイル(/proc/*/fd)
ファイル --> プロセス(fuser -v)
ポート --> プロセス(fuser -v)
ファイルシステム --> プロセス(fuser -mv)

fuser自体はPIDしか返してくれないのでps auxでプロセス名を取得する。
実際調べてみたら、Sambaが何故かホールドしていたのでSambaをリスタートしたところ無事消えた。

煽ったタイトルつけたら debian cgroupで検索かけると上の方に来てたので追加実験 [Linux]

早速会社でやってみた。以下はrootfsはDeibanだがカーネルは2.6.31という微妙なバージョンで試したのでそこは注意。

まず、Debian cgroupで検索するとLXCなるものがひっかかるがfstabに以下のようにしてもだめだった

none /cgroup cgroup default 0 0

独自ビルドカーネルなので素直にDocumentation/cgroups/cgroups.txtを見たら書いてあった。

debian:~# dmesg | grep cgroup
[ 0.000000] Initializing cgroup subsys cpuset
[ 0.000000] Initializing cgroup subsys cpu
[ 0.081085] Initializing cgroup subsys ns
[ 0.081091] Initializing cgroup subsys cpuacct
[ 0.081096] Initializing cgroup subsys freezer

カーネルには入っているのを確認した。一応カーネルのコンフィグも確認したが、上の方のgeneric setupなんちゃらあたりにある。
で、Document通りにやってみる。

1) mkdir /dev/cgroup
2) mount -t cgroup -ocpuset cpuset /dev/cgroup

とやってみると、たしかにサブシステムが出来ているのを確認。

debian:~# ls /dev/cgroup/
cpuset.cpu_exclusive cpuset.memory_migrate cpuset.memory_spread_slab notify_on_release
cpuset.cpus cpuset.memory_pressure cpuset.mems release_agent
cpuset.mem_exclusive cpuset.memory_pressure_enabled cpuset.sched_load_balance tasks
cpuset.mem_hardwall cpuset.memory_spread_page cpuset.sched_relax_domain_level

最初にmkdirが必要というのがこの手のsysfsの罠。組み込まれているなら最初から出してくれてもいいのに・・・
で、2行目のmountを毎回やるのは面倒というか問題があるのでfstabに書く・・・と思ったがdevの下のmkdirは再起動すると消される(というか最初からファイルシステムに書いてるわけではない)のでmkdirとmountは毎回やらなくてはいけない、しかしsu権限は必要
ということで、/etc/rc.localに書く

とりあえず有効にするだけならば、以下のようにすることで可能

if [ "$PS1" ] ; then
mkdir -m 0700 /dev/cgroup/$$
echo 0 > /dev/cgroup/$$/cpuset.cpus
echo 0 > /dev/cgroup/$$/cpuset.mems
echo $$ > /dev/cgroup/$$/tasks
fi

echo $$とやってみたが、自分のttyのPIDであることを確認した。

が、Redhatの人のいうような方法のようにいきなりPIDを追加するとecho $$ ~~tasksで失敗する。
CPUやメモリを前もって割り当てておく必要があるようだ。これは2.6.31だからという可能性はある。

そして、この設定だと、メモリはともかく、CPU0を常に使うように制限をかけてしまうのでまったくよろしくない。QuadCPUの場合は

echo 0-3 > /dev/cgroup/$$/cpuset.cpus

とするのがよい。
CPUの個数を調べて設定する方法もあるにはある
メモリノードは通常のPCでは1つしかない。多分NUMA用。

if [ "$PS1" ] ; then
CPUN=`cat /proc/cpuinfo | grep processor | tail -n1 | awk '{ print $3 }'`
mkdir -m 0700 /dev/cgroup/$$
echo 0-$CPUN > /dev/cgroup/$$/cpuset.cpus
echo 0 > /dev/cgroup/$$/cpuset.mems
echo $$ > /dev/cgroup/$$/tasks
fi

で、結局これっていつも通りの設定なんじゃ?と思う。
一応今のコンソールから派生したプロセスはログイン時に作ったグループから派生してくれるようになるが、制限にはならない。

この後システムリソースを枯渇させないような設定が必要と思われる。
Documentをさらっと読んだ感じ、以下今のPIDから派生したプロセスは全部子供として扱われるようになるらしい。だから親子関係を作るだけでもスケジューラに対しては最適解を教えることになる?

このシェルだけだと、使用するCPUやメモリに制限がかかるわけではないし、普段は制限をかけてほしくない。cgroupに追加するだけでスケジューラの処理が最適化されるのだろうか?

あと、昨日のうぶんつのやりかたのところで、シェルを用意してログオフ時のリリースもやるようにしてあった。
上の今のやり方だと最初の1回はいいが、2回目にログインしたりすると問題がある可能性はある。副作用が無ければゴミがちょっと残ってても気にしなくていいとは思うが。

そして、やっとヨドバシでパーツを買って、サブマシンを動かせそうになったので休日にでも実験しようと思う。

200行パッチで脚光を浴びたcgroupとは? [Linux]

ITMedia風に煽ったタイトルをつけておいて自分はよくわかっていない。
しかも、手元にLinuxが無いので調査だけなので嘘が含まれている可能性は高いので要注意。

最近スケジューラに起因するパフォーマンスチューニングに詰まっていたので時間ができたら試してみたいと思ってまとめてみた。

http://www.atmarkit.co.jp/flinux/rensai/watch2008/watch05a.html
2008年に入った機能なので最近のカーネルなら問題なさそう。

CPU/メモリなどの「資源」の割り当て方をコントロールするためのインターフェイス。いまだと拡張が進んでいてbioとかでも使える?かもしれない。

使い方はイカの手順

・cgroup ファイルシステムをマウント
・適当な名前のディレクトリ (cgroup) を作成
・cgroup ディレクトリの中の 'task' ファイルに PID を書き込むことによりタスクを追加

LKMLでの例のTTYパッチに対する反論

The patch involved a simple edit of a users ~/.bashrc file with four new lines of code.

if [ "$PS1" ] ; then
mkdir -m 0700 /sys/fs/cgroup/cpu/user/$$
echo $$ > /sys/fs/cgroup/cpu/user/$$/tasks
fi

Then, as the superuser do this:

mount -t cgroup cgroup /sys/fs/cgroup/cpu -o cpu
mkdir -m 0777 /sys/fs/cgroup/cpu/user


Linuxの一般的なルールとして
・/dev/または/sys/fs/インターフェイスを用意してあってechoやcatなどの標準入出力で機能を制御できるようにしている。
・sysfsインターフェイスのいくつかは自前でマウントをする必要がある。
・sysfsインターフェイスは便利な半面、最新カーネルでないと実装されていないことも多い
 Debianなんかは古いカーネルを使っていることが多いので無いことが多い。

昔はWindowsだとMSが用意したABIを使うことに慣れていたのでLinuxのこういうとこはいいなぁと素直に思う。

使い方と順番が逆になっているのでわかりにくいが、実際に実行される順番は逆になるはず。
下のSuperuserでやれという部分

・cgroupタイプ(-t)、cpuオプションでマウントする。(オプションの有効化)
・cpuグループに適当なグループ(user)を作成。このとき、スーパーユーザーでなくても作業できるように-m 777をつけておくことがミソ。

これで普通のユーザーが自分のプロセス(PID)を追加することができるようになった。
あと、Debianの場合、/etc/fstabに書いておかないと再起動しても有効にならない気がするんだがどうだろうか。他のディストリだとマウントオプションを覚えておいてくれるのかな?

で、次がifの部分

・bash が「対話的に動作」している場合には、 PS1 が設定されるので、ユーザーがログインしていたらという意味。ユーザーがログインしていないのに.bashrcが参照される場合があるのかは謎。
・$$は各種プロセスID。これにはバックグラウンドジョブや $$ の値、 $PPID の値が含まれます。とのことなので、自分の属するPIDだと思う。これはあとで確認。
・echoで書きだして、自分が動かしているリソースは全部まとめてしまう。

こうすることで、ユーザーが起動しているプロセス1つ1つにCPUリソースを割り当てるわけではなく、そのユーザーが動かしているプロセスは全部まとめられるので、バックグラウンドプロセスの動作(ディスクの読み書きやフラッシュ、ACPIの割り込みや、デーモン)の動きを阻害しなく鳴る?

Xをまったく使わないので、Xを動かしているときのプロセス状態がよくわからん。

なので予想だが、
ユーザーがアプリを動かしまくる。
プロセスが増えるごとにそのプロセスにCPU資源が割り当てられる。
ヘビーなプロセスの数が増えるごとにバックグラウンド動作が阻害されてシステムのパフォーマンスが落ちる。

例えばこのパッチは、自分でXを起動するような奇特な人には効果がないと思う。というのもログインした時点のPIDをechoで突っ込んでいるので、.bashrcが動いた時点ではXが動いていないのでPIDも無い。

200行ttyパッチは、ユーザーごとであろうttyに起因する部分を内部的にcgroupに追加することで、スケジューラーが適切に動くようにするもの?


うぶんつの場合、
http://www.webupd8.org/2010/11/alternative-to-200-lines-kernel-patch.html

・/sys/fsが/devになっている。
・mount覚えてないのでrc.localでやる。
・ログインするたびにPIDが変わるので、全開放&再登録をやるようにする。

というような変更のようだ。Debianでも似たようなことができるだろうが、カーネルが古いので無かったりして。

なんかコメントでうぶんつで動かなかったみたいなのを見たが、マウントかバージョンあたりの問題だろう。

メモリが少ないときのI/Oでパフォーマンスが大幅に落ちたりOOMが出る問題は2.6.36で解決 [Linux]

実は仕事でこの問題に遭遇し、ある程度詳細までわかっていたのだが、Linuxの人たちはサーバ使ってるから「そんなクソHW変えろ」とか言い出すんだろうなと思ったら、真面目に直してくれた模様。

1.7. Improve VM-related desktop responsiveness
There are some cases where a desktop system could be really unresponsive while doing things such as writing to a very slow USB storage device and some memory pressure. This release includes a small patch that improves the VM heuristics to solve this problem.

2.6.36でちゃんと解決された模様

http://groups.google.co.jp/group/linux.kernel/browse_thread/thread/ab5301f243330ffe

http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commitdiff;h=e31f3698cd3499e676f6b0ea12e3528f569c4fa3


結局の頃、スレッドというかタスクの優先順位がついていないのが問題。

・Linuxの場合、通常の書き込みは全部非同期書き込みになっていてメモリに蓄えられる。同期書き込みですら、非同期書き込み+終了待ちになっている。
・非同期書き込みで確保されたメモリは定期的にディスクにフラッシュされる(vm_cache_pressureとかdirty_なんとか_thresouldとかそこらへん)
・新しい書き込みを開始するときにメモリが無いと他の書き込みを待つ。congestion_waitがキーワード。
・メモリが少なかったり、ディスクの速度が遅いと書き込み前に空きメモリが枯渇する。このとき、ディスクへの書き込みを早く終わらせないと次にいかないのに、空きメモリが枯渇している場合は他のを待つという行動に出るため、待たせているのが自分なのに他のタスクに実行権を渡してしまう。
・さらに2.6.32ぐらいまでの、嘘フラッシュは、あるタスクが1秒以内に終わらない場合、パフォーマンスが足りないと判断して新たに書き込みスレッドを増やそうとする。メモリが足りないから遅いのに、スレッドを増やして解決しようとするのでOOMが発生する。これは2.6.34ぐらいで、ブロックデバイスごとのスレッドを作成することで解決してある。

とまあ、パフォーマンスの根幹部分にもかかわらず、結構適当。大体これぐらいのテストもしてない設計者ってどうなの?と言いたいところだが、タダだからな。これでメモリが少なくディスクも遅い組み込み用途でのパフォーマンスも改善しやすくなったのではないかと予想している。

Netwalkerその後 [Linux]

結局いろいろやってだめだったが、この方がChromeを使う方法を見つけてくれた。

http://plaza.rakuten.co.jp/kapper1224/diary/201004110000/

早い話が、ディストリのバージョンアップ。
Chrome-browserをインストールしてみたが、起動は確かに早い。
動作もそんなに悪くなかった。

が!!!

NetwalkerのキモであるExtensionがダメダメだった。特にジェスチャ系。
FirefoxにはGrab and Dragという神Extensionがあるのに、Netwalkerのやつは、Linux動作不可とか変なのしかない。(探せばあるのかもしれんが・・・)

で、しばらくつかってなかったが、不評なキーボードを廃したPC-T1が出るとのことで、ひさびさに動かしてみた。

が!!!

パスワードを忘れていたのでリカバリを行う。

よくよく考えてみると、Netwalkerに入っているFirefox 3.0はクソなので、3.5とかないかなと思ったら普通にあったのでインストール。メニューが英語なので以下のURLを入力するとメニュー拡張が入る。

ftp://ftp.mozilla.org/pub/mozilla.org/firefox/releases/3.5.★/linux-i686/xpi/ja.xpi
(一部修正 ★にはfirefoxのリビジョン番号を入れてください)

参考
http://kitsune248.blog.shinobi.jp/Entry/556/

Firefox 3.5はChromeほどではないが、3.0ほどクソではないので、かなり快適になった。ウィンドウマネージャとか入れ替えたいと思っていたが、これいれてGrab and Dragいれれば事足りる。

あとはPDFリーダーが微妙なので、いいやつを見つけたいところ。とくにジェスチャでできるやつ。

電車の中でPDF読んでみたが、悪くは無い。しかし、電車の中でPDF読むならキーボードいらんな・・・と新発売のデバイスが気になる今日この頃であった。


Mercurial extension mqを使う [Linux]

問題定義
・ブランチを作るとそのブランチがごみになったときにリポジトリが美しくないので残したくない
・なんだかんだでhg diffの出力をパッチとして管理しておくと何かと便利
・しかし多段パッチ管理は面倒

という場合に使える。
が、他のページを見ていても説明が長いので簡潔に書いておく。

hg mqつかいかた

・罠
 LennyのMercurialはちょっと古いので最後のqfinishが実装されていない。
 ソースをコンパイルして動かすとhgextが無いのでmqが最初から動かない

・準備
hg qinit [-C ?]
mqのコマンドが使えるようになる。

・パッチの登録
変更前に
hg qnew patch-name
すでに変更している場合には-fをつける
変更が終わったら
hg qrefresh
でパッチとして登録

・パッチの確認
hg qseries
でパッチをいくつ保存しているか確認できる。
今適用されているパッチの表示は
hg qdiff

・パッチの削除
hg qdelete パッチ名

・パッチのリポジトリ化
hg qfinish

・親リポジトリとのマージ
hg qpop -a
hg pull -U
hg qpush -a
でコンフリクトがなければ問題なし
コンフリクトがあったら
qsave -mとかで3WAYマージをするらしいが
やってないのでよくわからない

qfinishのときにコメントをつけられるようにしてほしかった。
qmessageとかあったきもする。

NetwalkerでChromiumのビルド [Linux]

やけになってNetwalkerでやってみることにする。
が、Ubuntu 9.10 Kermic以上!だのなんだの書かれているのでまず失敗すると思うが、一応だめもとでやってみる。

まず、Netwalker上でビルドするにあたり容量が足りないのでUSB-HDDをつないでみた。
/dev/sdaが謎デバイスで、/dev/sdbがUSB-HDDになるようだ。
fdisk/mkfs.ext3を実行後、なぜか勝手にマウントされるので、一度umountした後
tune2fs -o journal_data_writeback /dev/sdb1
としたあとfstabに以下のようなものをつけてマウント
/dev/sdb1 /mnt ext3 defaults,noatime,data=writeback 1 1

少しでも早くビルドしてほしいおまじない。
参考:http://www.drk7.jp/MT/archives/001407.html

■セットアップ
http://code.google.com/p/chromium/wiki/LinuxBuildInstructionsPrerequisites

まずビルド環境をつくるところからはまる。
http://src.chromium.org/svn/trunk/src/build/install-build-deps.sh
これはx86でないと動かないようになっている。

On a 32-bit Ubuntu 8.04, you can fetch all of the above as follows:
$ sudo apt-get install subversion pkg-config python perl g++ g++-multilib \
bison flex gperf libnss3-dev libgtk2.0-dev libnspr4-0d libasound2-dev \
libnspr4-dev msttcorefonts libgconf2-dev libcairo2-dev libdbus-1-dev \
libbz2-dev libjpeg62-dev libpam0g-dev libglu1-mesa-dev libxss-dev python2.5-dev

気にせずやってみたがg++-multilibが無いといわれる。
さすがにライブラリが無いんじゃダメじゃないかと思うが、あえて続行してみる。

今日落ちてきたやつはこれ
http://build.chromium.org/buildbot/archives/chromium.r41134.tgz
まあ、どうせgclient syncやると勝手にアップデートされるだろうが。

サポートツールを落とす。
svn co http://src.chromium.org/svn/trunk/tools/depot_tools

今回はクロス環境ではないので、クロス設定は無視
~/.bashrcに以下を追加して、sourceする。

export PATH=/mnt/depot_tools:"$PATH"
export GYP_GENERATORS=make
export GYP_DEFINES="target_arch=arm sysroot=/ disable_nacl=1 linux_use_tcmalloc=0 armv7=1 arm_thumb=1"

gclient sync --force

make -r -j2 BUILDTYPE=Release chrome

即効だめになるかとおもいきや、意外にがんばる・・・
が、やっぱりでた。

Assembler messages:
Error: unrecognized option -mimplicit-it=thumb
make: *** [out/Release/obj.target/protobuf_lite/third_party/protobuf2/src/src/google/protobuf/stubs/common.o] エラー 1

thumb対応してないのか?

Chromium Arm版のコンパイル(emdebian編?) [Linux]

前回のエントリ名は準備といいつつ結構やってしまった。
つづき

third_party/protobuf2/src/src/google/protobuf/stubs/common.cc:1: error: invalid floating point option: -mfpu=vfpv3

このオプションがないとのことだったので、調べぐぐってみると

GCC 4.4 Release Series — Changes, New Features, and Fixes - GNU ... - [ このページを訳す ]
21 Jan 2010 ... GCC now supports the VFPv3 variant with 16 double-precision registers with -mfpu=vfpv3-d16 . The option -mfpu=vfp3 has been renamed to -mfpu=vfpv3 .

GCC4.4でコンパイルオプションかえたようだ。
EmdebianのGCCは4.3だったので無理。
あきらめてCT-NGを使うことにした。

前にやったときは、ソースからビルドしようとしたが、文句言われて無理だった。
そもそもインストーラーパッケージがあるのでそれでやってみる。

IA32 GNU/Linux Installerをダウンロードしてインストール

$ wget http://www.codesourcery.com/sgpp/lite/arm/portal/package5385/public/arm-none-linux-gnueabi/arm-2009q3-67-arm-none-linux-gnueabi.bin
$ chmod +x arm-2009q3-67-arm-none-linux-gnueabi.bin
$ ./arm-2009q3-67-arm-none-linux-gnueabi.bin


Javaが動くようだ。

Preparing to install...
Extracting the JRE from the installer archive...
Unpacking the JRE...
Extracting the installation resources from the installer archive...
Configuring the installer for this system's environment...

Launching installer...

Invocation of this Java Application has caused an InvocationTargetException. This application will now exit. (LAX)

Stack Trace:
java.awt.HeadlessException:
No X11 DISPLAY variable was set, but this program performed an operation which requires it.
at java.awt.GraphicsEnvironment.checkHeadless(Unknown Source)
at java.awt.Window.(Unknown Source) at java.awt.Frame.(Unknown Source) at java.awt.Frame.(Unknown Source) at javax.swing.JFrame.(Unknown Source) at com.zerog.ia.installer.LifeCycleManager.g(DashoA10*..) at com.zerog.ia.installer.LifeCycleManager.h(DashoA10*..) at com.zerog.ia.installer.LifeCycleManager.a(DashoA10*..) at com.zerog.ia.installer.Main.main(DashoA10*..) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at com.zerog.lax.LAX.launch(DashoA10*..) at com.zerog.lax.LAX.main(DashoA10*..) This Application has Unexpectedly Quit: Invocation of this Java Application has caused an InvocationTargetException. This application will now exit. (LAX) が、ダメ! X11入れろといわれた。ビルドしたいだけなのにX11かー これはUbuntuに戻るときがきた。 というわけで、最初に放棄したUbuntuで再チャレンジ。 リンク先を見てもらえればわかるが、Ubuntuのほうがセットアップスクリプトがあったりして割と親切。 ただ、ターゲットバージョンがなぜか古いが。というか、その古いバージョンでやるべきだったのか? http://code.google.com/p/chromium/wiki/LinuxBuildInstructionsPrerequisites http://src.chromium.org/svn/trunk/src/build/install-build-deps.sh コレを落としてきて実行するか sudo apt-get install subversion pkg-config python perl g++ g++-multilib \ bison flex gperf libnss3-dev libgtk2.0-dev libnspr4-0d libasound2-dev \ libnspr4-dev msttcorefonts libgconf2-dev libcairo2-dev libdbus-1-dev \ libbz2-dev libjpeg62-dev libpam0g-dev libglu1-mesa-dev libxss-dev python2.5-dev これを実行するか で、実行するがまたしてもエラー。 よくよく読んでみるとX11のライブラリがいるんじゃなくて、X11が動いてないとだめだった。 Ubuntuは最初からデスクトップ環境が入っているので、そっちで端末を動かすとWindowsっぽいインストーラーが動いた。とりあえずデフォルトでインストール。変なところにインストールしようとしていたが、パスを設定してくれるようなのでそのままにした。 上記のようにCORSSTOOLSのパスが /root/CodeSourcery/Sourcery_G++_Lite/bin/arm-none-linux-gnueabi とかへんなところになっているが gclient sync --force をやる。 make -r -j6 BUILDTYPE=Release chrome ターゲットchromeが無いとか言われたので 今一度見直してみた。 export GYP_GENERATORS=make gclient sync --force これが抜けてたようだ。 気を取り直してもう一度ビルドすると、今度はうまくいきそう。 が、ダメ! In file included from third_party/protobuf2/src/src/google/protobuf/extension_set.cc:35: third_party/protobuf2/src/src/google/protobuf/stubs/hash.h:38: fatal error: string.h: No such file or directory compilation terminated. In file included from third_party/protobuf2/src/src/google/protobuf/stubs/once.h:75, from third_party/protobuf2/src/src/google/protobuf/stubs/once.cc:42: third_party/protobuf2/src/src/google/protobuf/stubs/common.h:38: fatal error: assert.h: No such file or directory compilation terminated. In file included from third_party/protobuf2/src/src/google/protobuf/generated_message_util.h:41, from third_party/protobuf2/src/src/google/protobuf/generated_message_util.cc:35: third_party/protobuf2/src/src/google/protobuf/stubs/common.h:38: fatal error: assert.h: No such file or directory compilation terminated. In file included from third_party/protobuf2/src/src/google/protobuf/stubs/common.cc:33: third_party/protobuf2/src/src/google/protobuf/stubs/common.h:38: fatal error: assert.h: No such file or directory compilation terminated. In file included from third_party/protobuf2/src/src/google/protobuf/stubs/hash.cc:33: third_party/protobuf2/src/src/google/protobuf/stubs/hash.h:38: fatal error: string.h: No such file or directory compilation terminated.

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