ffmpegとopencvをいれる

ffmpegとopencvを連携させるのに結構手間取ったのでめも。

# それにしても動画系はライセンスがいろいろややこしくて難儀

1. ffmpegをいれる

まずgitから最新のソースを落としてくる。

$ git clone git clone git://source.ffmpeg.org/ffmpeg.git

configureする。

$ ./configure --arch=core2 --enable-avconv --enable-gpl \
  --enable-libfaac --enable-libmp3lame --enable-libpulse \
  --enable-libtheora --enable-libv4l2 --enable-libx264 \
  --enable-libxvid --enable-nonfree --enable-openal --enable-pic \
  --enable-shared --enable-version3 --enable-x11grab \
  --enable-zlib --prefix=/usr/local

ここで重要なのは、”–enable-ffmpeg”, “–enable-ffmpeg”, “–enable-pic”, “–enable-shared”。あとはライセンスとかの問題でデフォルトで無効になってるものだったり、追加のコーデックだったりするので、きちんとライセンスやコーデックを使うかを検討してから必要なものだけenableにするとよい。

あと、途中でいろいろlibraryが足りないと言われるので適宜install。ぜんぶapt-getで事足りた。

$ make

で、ビルド開始。すごく時間がかかります。

それで、インストール

# make install

2. OpenCVをいれる

まず、SVNで最新ソースを落としてくる

$ svn co https://code.ros.org/svn/opencv/trunk/opencv

それから、cmakeでconfigureする。

$ cmake .

このとき肝要なのが、以下の項目。

-- FFMPEG: YES
-- codec: YES
-- format: YES
-- util: YES
-- swscale: YES
-- gentoo-style: YES

ffmpegが有効になっていることを確認する。

そして、ビルド。

$ make

最後にインストール。

# make install

これで、OpenCVから動画とかを扱い易くなるはずです。

Esolang Advent Calender 8日目: Esolang on Linux kernel

みなさん、Esolangはご存知ですよね?

Esoteric Language = 奇妙な言語ということで、(難解|難読)プログラミング言語などを意味しています。そのEsolangをカーネルに載せるという話について書きたいと思います。

1.システムコールって?

Linuxカーネルにはシステムコールという機能があります。

システムコールとはカーネルがユーザーランドに対して提供するAPIのようなもので、例えばC言語のfopen()はシステムコールのopen()を裏で呼び出すことによってファイルを開いています。Linuxならカーネルのソースコードをkernel.orgから自由にダウンロードできるので、それを改造すればシステムコールを自前で追加することもできます。

なので、今回はLinuxカーネルにEsolangのインタープリタのシステムコールを追加してみました。

2.システムコールの追加方法

システムコールは、いくつかのファイルをいじって、本体となるファイルを追加するだけで作ることができます。どのようにして追加すればいいのか、例としてBrainfuckのインタープリタのシステムコール、sys_brainfuck()を追加する手順を解説してみます。

A. unistd.h

unistd.hはPOSIX環境でのOSが提供するAPIが定義されているヘッダーファイルです。ここにはシステムコールとそれに割り当てられた通し番号が書かれています。

まず、include/asm-generic/unistd.hに以下のように追記します。

#define __NR_brainfuck <通し番号>
__SYSCALL(__NR_brainfuck, sys_brainfuck)

通し番号は他のと被らないように一番最後の番号+1(バージョン3.2.0-rc4では244)を使用してください。

そして、以下の部分も変更します。

#define __NR_arch_specific_syscall <今までの番号+1>

これは、システムコールの総数を意味しているので、追加した分インクリメントしましょう。

続いて、各アーキテクチャに用意されたunistd.hを編集します。これは、アーキテクチャによって用意されているシステムコールが異なることから、動かしたいアーキテクチャ向けにunistd.hを変更する必要があります。

    • ARMならarch/arm/include/asm/unistd.h
    • x86ならarch/x86/include/asm/unistd_32.h
    • amd64ならarch/x86/include/asm/unistd_64.h

それぞれ表記方法が違ってややこしいのですが、だいたい見れば分かると思います。詳しくは、下に貼ってあるpatchをお読みください。

B.エントリファイル

それぞれのアーキテクチャに対して、アセンブリでシステムコールの一覧が書かれたファイルがあります。

    • ARMならarch/arm/kernel/calls.S
    • x86ならarch/x86/kernel/syscall_table_32.S
    • amd64はなし

これも、アーキテクチャによって微妙に表記方法が違いますが、基本的には順番にならべているだけです。なので、他のところを編集して順番変えてしまったりしないように注意してください!

x86の場合は一番下に以下のように追記すると大丈夫です。

.long sys_brainfuck

C. syscalls.h

これはシステムコールのプロトタイプ宣言が書かれているヘッダーファイルです。

普通と同じようにプロトタイプ宣言を書けばいいのですが、最初にasmlinkageとつける必要があります。要はinclude/linux/syscalls.hに以下のように書けば大丈夫です。

asmlinkage long sys_brainfuck(char *source_user, char *input_user,
                       char *output_user, unsigned int source_len,
                  unsigned int input_len, unsigned int output_len);

D. システムコール本体

今回はkernel/brainfuck.cに本体を書いてみました。

大体は普通にC言語のプログラムと同じように書けばいいのですが、stdio.hなどの標準ライブラリは使えません(カーネルランドで動くので、ユーザーランドのIOなどを使えるはずがありません)。ですが、大抵の関数はインクルードしなくても使えたりします。

また、main関数というものもありません。main関数に当たる部分にはSYSCALL_DEFINEというマクロを使用します。

sys_brainfuckでは以下のような形になります。

SYSCALL_DEFINE6(brainfuck, char *, source_user, char *, input_user,
               char *, output_user, unsigned int, source_len,
               unsigned int input_len, unsigned int, output_len)

簡単に表記すると以下のような仕組みです。

SYSCALL_DEFINE<引数の個数> (<システムコール名>, <引数1の型>, <変数1の名前>...)

また、malloc()やfree()も使えないので、代わりにkmalloc(), kfree()といった関数を使用します。

文字を表示したい場合は、printk()を使用しましょう。printk()はカーネルのログに文字列を出力することができます。

このような簡単な手順でLinuxカーネルのシステムコールを自由にいじることができるのです。

3. 実際にやってみた

とりあえずBrainfuckとLazy Kのインタープリタを作ってみたので、それぞれ、カーネルに当てられるpatchとしてgistにアップロードしました。

このpatchはx86, amd64, armのアーキテクチャに対応しています。Androidのカーネルにこれをあてて、実機で動かすことも可能です。(IS01でやったこともありますが….

あと、システムコールを呼び出す見本プログラムもおいときます。

ちゃんと動くので試してみてください!

4. さいごに

なぜかEsolang Advent Calenderのはずが、Linuxカーネルの記事になってました….

申し訳ありません….

あと、要望があれば別の言語でも作ってみますが?

桜花あどべんとかれんだぁ 4日目 おーかちゃんかわいいよ

おーかちゃんかわいいよ


おーかちゃんかわいいです!

しりあったきっかけ


セキュリティ&プログラミング2011で、はじめて会いましたっ!

僕はLinuxカーネル組で、おーかちゃんがソフトウェアセキュリティ組だったので

おーかちゃんとあんまりはなせませんでした…

でもその時にもらった名刺はちゃんといつでも眺められるように保管してますっ

おーかちゃんのようじょりょくをしる


そのあと、Twitterでふぉろーさせてもらいました

おーかちゃんかわいい!!

しまぱんようじょのかわいさに圧倒されました

Twitterでずっとしゃべってることもしばしば

よく2:00頃とかにおしゃべりさせてもらいました>ω<

おーかちゃんのこわさをしる


それから、関西の勉強会で何度か会うことになります

で、おーかちゃんのこわさをしりました

そのうちのひとつが、カーネル/VM勉強会@関西です

そのときの発表が円周率プログラミングです…

おーかちゃんやっぱりこわいです

あと、おーかちゃんが懇親会でメイド服を着てました

かわいかったです(^ω^)

気になる人は検索してみれば….(/ω・\)

おーかちゃんのきょうぎぷろぐぷろぐらみんぐ


おーかちゃんとの共通点のひとつに競技プログラミングがあります

おーかちゃんつよいです><

いつまでたっても追いつける気がしません

あと、コンテストがだいたい2:00~3:00くらいに終わるので、

それから朝までしゃべってることもけっこうあります

さいごに


おーかちゃんのいえにおじゃまさせてもらったり

なんかいろんなところでお世話になってます

おーかちゃんだいすき!

こんどあえるのはいつかな~?

Android Bazaar and Conference 2011 Summerで話してきました

 

Android Bazaar and Conference 2011 Summerにいって参りました。

今回は、学生トラックで20分間話すというのが一番の目的でした。

「カーネルから見るAndroidのセキュリティ」という話させて頂きました。

内容はスライドを見てもらうとわかるのですが、root奪取などに使われている脆弱性の解説と

Androidで特に気をつけるべきことなどについて話してきました。

わかりやすいと結構好評で嬉しかったです。

Slideshareでもhot in twitterやpopular in this weekなどで取り上げられていました。

スライドの下を歩いているDroid君にも突っ込んでもらえてよかったです。

 

あと、僕も参加しているAndroid セキュリティ部のセッションも盛況でよかったです。

いま求められる、Androidのセキュリティ

View more presentations from Bomb Mine

立ち見で壁が埋まるほど人が集まっていて、正直驚きました。

セキュリティ部の懇親会も、ここには書けないことばかりですがとっても楽しかったです。

 

Android Bazaar and Conference 2012にも参加できるといいなぁ

OSC 2011 Kansai@Kyotoに行ってきました

 

7/15~16の二日間、京都リサーチパークで行われたOSC Kyoto 2011に参加してきました。

今回は、ブース出展とセミナーという形でした。

 

1.ブース

ブースではARとOpenCV、テトリスを展示していました。

ARは、そのままARToolkitをつかったプログラムで、

マーカーを書いた手袋をカメラにかざすと、魔法陣が飛び出てくるという物。

OpenCVは顔認識機能を使って、動画からアニメ顔を認識するという物。

これは、動画の1フレームごとに、こちらで公開されているxmlをつかって顔認識をかけて

その結果を合成して動画を再生成するというものです。

テトリスは、上原テトリスのパロディみたいなもので、

ときどき高橋という文字が落ちてきたりするというものでした。

感想としては、1日目は設営に時間がかかってグダグダだったものの、

2日目は好評でした。

 

2.セミナー

セミナーも部活で1コマ、やらせていただいてました。

今回の目的は、普段外部で活動してない人が外部に出るきっかけにするというものだったので、

いつもとは一味違うメンバーでした。

はじめに、パソコン部の紹介を数分。

それから@catupperによるルービックキューブについてのお話。

Rubick

View more presentations from catupper

これは、ルービックキューブの最短手数を如何にして見つけるかという

アルゴリズム的な話でルービックキューブへの興味を掻き立ててくれるような内容でした。

最後に@hakatasilovingによるフォントのお話。

彼は、文字を見ただけでフォントを言い当てられるという稀有な能力の持ち主で、

このスライドでは存分に彼の個性的な面が発揮されていたのではないかなと思っています。

また、彼がいつもtwitterで語っている写研の話をやっと理解できました。

フォントの歴史の話も、初めて聞く内容で面白かったです。

 

OSC京都、大変楽しかったです。

きょーくりっのメンバーともいろいろ喋れて、面白かったし、

連れてきた後輩たちにもいい刺激になったんじゃないかなと思っています。

懇親会でもいろんな方と話せて、楽しかったです。

最後の最後に無茶ぶりで来年のOSCではスタッフ側に回ることになりました(;´∀`)

精一杯頑張りますっ!!

戦利品は、TurboLinuxのTuxぬいぐるみ、マスタリングBlender

子どもが体験するべき50の危険なことでした!

 

P.S. 終わってからtyageやpastakに祇園祭にも連れていってもらいました。

人生で初めての祇園祭で楽しかったです。

人混みや鉾のスケールに圧倒されてきました!

Macbook is dead…..

 

Macbookがやられちゃいました。

昨日から、モスキート音みたいなのが聞こえると思ったら、MacbookのHDDが原因でした。

モスキート音がなってしばらくすると、キーボードもタッチパッドも効かなくなって、

UbuntuがI/O Errorのメッセージを吐きまくるような状態になり、強制終了せざるを得ないという状況になってしまうのです。

OSCとかABCとかの準備で忙しい時に……(´・ω・`)

大急ぎでHitachiの0S02598を買ってきて、データコピー中です。

早く治ってくれると嬉しいのだけれど……

Hello, world!

+++++++++[>++++++++>+++++++++++>+++++<<<-]>.>++.++

+++++..+++.>-.———–.<++++++++.——–.+++.——.——–.>+.

こんにちは、hiromuです。

このブログは技術的なことなどを適当に書いていくために作りました。

更新頻度は高くないですが、よろしくお願いします。