2010年12月27日月曜日

2010年12月20日月曜日

gccでライブラリ関係を全部詰め込む方法。

Pass gcc the -static option. See:
man gcc

内容:

"Pass gcc the -static option. See: man gcc"
- How can I use gcc to build a static library?Google サイドウィキで表示

qt4.5 on mini2440

busyboxとqt4.5でqtopia動かさないでフルブラウザ、裏でlighttpd起動がいいかな。

内容:

"Qt 4.5 on mini2440"
- Qt 4.5 on mini2440 | CoRGoogle サイドウィキで表示

Debian を ソースからコンパイルする

root 権限で
コンパイルするのに必要なパッケージをインストールする
# apt-get build-dep package

ユーザ権限でも可
適当なディレクトリに移動する
$ cd /usr/local/src
ソースをダウンロードする
$ apt-get source package

該当ディレクトリに移動する
$ cd package-version
パッケージを構築する
$ dpkg-buildpackage -rfakeroot -uc -b

root 権限で
パッケージをインストールする
# dpkg -i package.deb

内容:

"Debian を ソースからコンパイルする"
- はっぴぃ・りなっくす - Debian を ソースからコンパイルする - Linux > Linux Install > Debian - SmartSectionGoogle サイドウィキで表示

directFB環境でタッチパッド

libdirectfbとlibts-binの2つが必要?

内容:

"libdirectfb-1.2-9"
- Debian -- パッケージのファイル一覧: libdirectfb-1.2-9/sid/armelGoogle サイドウィキで表示

2010年12月19日日曜日

タッチスクリーンライブラリ

apt-get install libts-bin

/usr/bin/ts_calibrate
/usr/bin/ts_harvest
/usr/bin/ts_print
/usr/bin/ts_print_raw
/usr/bin/ts_test

内容:

"/usr/bin/ts_calibrate /usr/bin/ts_harvest /usr/bin/ts_print /usr/bin/ts_print_raw /usr/bin/ts_test"
- Debian -- パッケージのファイル一覧: libts-bin/lenny/armelGoogle サイドウィキで表示

2010年12月18日土曜日

mini2440でbusybox環境構築する。

u-boot
kernel
busybox
をビルドしたらrootfs作成へ。

busyboxビルドしたときの_installフォルダに移動。



して下記項目をファイル化して実行する。

>スクリプト内で指定してあるディレクトリは任意の場所に書き換える必要がある。
ツールチェインで使ったライブラリ
・/opt/FriendlyARM/toolchain/4.4.3/arm-none-linux-gnueabi/sys-root/lib/
カーネルuImage
・~/kernel/mini2440
カーネルモジュール
・~/kernel/kernel-modules/


mkdir dev
mkdir -p etc etc/init.d etc/network
mkdir -p var var/run var/log
mkdir -p usr/bin usr/sbin usr/lib usr/local/bin usr/local/sbin usr/local/lib
ln -s usr/bin bin
ln -s usr/sbin sbin
ln -s usr/lib lib
mkdir pt mnt proc sys
mkdir -m 777 tmp
mknod -m 622 dev/console c 5 1
mknod dev/ttySAC0 c 204 64  
mknod dev/tty0 c 4 0
#touch linuxrc
#chmod ug+x linuxrc

#gcc 4.3.2 or 4.4.3 for frienldyARM toolchain
#cp -Rp /opt/FriendlyARM/toolchain/4.4.3/arm-none-linux-gnueabi/sys-root/lib/* lib/
cp -Rp /usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/armv4t/lib/* lib/

#kernel copy
cp ~/kernel/mini2440/uImage boot/
cp -Rp ~/kernel/kernel-modules/lib/* lib/


# The operation of the init program is define in the inittab file, busybox init has the following default behaviour.
printf "::sysinit:/etc/init.d/rcS\n" > ./etc/inittab
printf "::askfirst:-/bin/sh\n" >> ./etc/inittab
printf "::ctrlaltdel:/sbin/reboot\n" >> ./etc/inittab
printf "::shutdown:/bin/umount -a \n" >> ./etc/inittab
printf "::shutdown:/sbin/swapoff -a\n" >> ./etc/inittab
printf "::restart:/sbin/init\n" >> ./etc/inittab
printf "::respawn:/sbin/getty -L 115200 /dev/ttySAC0 vt100\n" >> ./etc/inittab

# Create a rcS job file in the /rootfs/etc/init.d directory to initialize the target system.
printf "#! /bin/sh\n" > ./etc/init.d/rcS
printf "\n" >> ./etc/init.d/rcS
printf "# Setup the bin file location and export to system PATH\n" >> ./etc/init.d/rcS
printf "PATH=/sbin:/bin:/usr/sbin:/usr/bin\n" >> ./etc/init.d/rcS
printf "umask 022\n" >> ./etc/init.d/rcS
printf "export PATH\n" >> ./etc/init.d/rcS
printf "\n" >> ./etc/init.d/rcS
printf "# mount the filesystem directories\n" >> ./etc/init.d/rcS
printf "mount -a\n" >> ./etc/init.d/rcS
printf "mkdir /dev/pts\n" >> ./etc/init.d/rcS
printf "mount -t devpts devpts /dev/pts -o mode=0622\n" >> ./etc/init.d/rcS
printf "\n" >> ./etc/init.d/rcS
printf "# create device nodes and directories\n" >> ./etc/init.d/rcS
printf "echo /sbin/mdev>/proc/sys/kernel/hotplug\n" >> ./etc/init.d/rcS
printf "mdev -s\n" >> ./etc/init.d/rcS
printf "mkdir /var/lock\n" >> ./etc/init.d/rcS
printf "\n" >> ./etc/init.d/rcS
printf "# start logging utility services\n" >> ./etc/init.d/rcS
printf "klogd\n" >> ./etc/init.d/rcS
printf "syslogd\n" >> ./etc/init.d/rcS
printf "\n" >> ./etc/init.d/rcS
printf "# set system clock from RTC\n" >> ./etc/init.d/rcS
printf "hwclock -s\n" >> ./etc/init.d/rcS
printf "\n" >> ./etc/init.d/rcS
printf "# set host and config loopback interface\n" >> ./etc/init.d/rcS
printf "ifconfig lo 127.0.0.1\n" >> ./etc/init.d/rcS
chmod +x ./etc/init.d/rcS

#Create a mdev.conf file in the /rootfs/etc directory for the mdev process to do an initial update of the device files dynamically.
printf "# system all-writable devices\n" > ./etc/mdev.conf
printf "full  0:0 0666\n" >> ./etc/mdev.conf
printf "null  0:0 0666\n" >> ./etc/mdev.conf
printf "ptmx  0:0 0666\n" >> ./etc/mdev.conf
printf "random  0:0 0666\n" >> ./etc/mdev.conf
printf "tty  0:0 0666\n" >> ./etc/mdev.conf
printf "zero  0:0 0666\n" >> ./etc/mdev.conf
printf "\n" >> ./etc/mdev.conf
printf "# console devices\n" >> ./etc/mdev.conf
printf "tty[0-9]* 0:5 0660\n" >> ./etc/mdev.conf
printf "vc/[0-9]* 0:5 0660\n" >> ./etc/mdev.conf
printf "\n" >> ./etc/mdev.conf
printf "# serial port devices\n" >> ./etc/mdev.conf
printf "s3c2410_serial0 0:5 0666 =ttySAC0\n" >> ./etc/mdev.conf
printf "s3c2410_serial1 0:5 0666 =ttySAC1\n" >> ./etc/mdev.conf
printf "s3c2410_serial2 0:5 0666 =ttySAC2\n" >> ./etc/mdev.conf
printf "s3c2410_serial3 0:5 0666 =ttySAC3\n" >> ./etc/mdev.conf
printf "\n" >> ./etc/mdev.conf
printf "# loop devices\n" >> ./etc/mdev.conf
printf "loop[0-9]* 0:0 0660 =loop/\n" >> ./etc/mdev.conf
printf "\n" >> ./etc/mdev.conf
printf "# i2c devices\n" >> ./etc/mdev.conf
printf "i2c-0  0:0 0666 =i2c/0\n" >> ./etc/mdev.conf
printf "i2c-1  0:0 0666 =i2c/1\n" >> ./etc/mdev.conf
printf "\n" >> ./etc/mdev.conf
printf "# frame buffer devices\n" >> ./etc/mdev.conf
printf "fb[0-9]  0:0 0666\n" >> ./etc/mdev.conf
printf "\n" >> ./etc/mdev.conf
printf "# input devices\n" >> ./etc/mdev.conf
printf "mice  0:0 0660 =input/\n" >> ./etc/mdev.conf
printf "mouse.*  0:0 0660 =input/\n" >> ./etc/mdev.conf
printf "event.*  0:0 0660 =input/\n" >> ./etc/mdev.conf
printf "ts.*  0:0 0660 =input/\n" >> ./etc/mdev.conf
printf "\n" >> ./etc/mdev.conf
printf "# rtc devices\n" >> ./etc/mdev.conf
printf "rtc0  0:0 0644 >rtc\n" >> ./etc/mdev.conf
printf "rtc[1-9] 0:0 0644\n" >> ./etc/mdev.conf
printf "\n" >> ./etc/mdev.conf
printf "# misc devices\n" >> ./etc/mdev.conf
printf "mmcblk0p1 0:0 0600 =sdcard */bin/hotplug\n" >> ./etc/mdev.conf
printf "sda1  0:0 0600 =udisk * /bin/hotplug\n" >> ./etc/mdev.conf

#Create a fstab filesystem table in the /rootfs/etc directory to mount the system directories.
printf "# device mount-point type options dump fsck order\n" > ./etc/fstab
printf "proc /proc proc defaults 0 0\n" >> ./etc/fstab
printf "sysfs /sys sysfs defaults 0 0\n" >> ./etc/fstab
printf "tmpfs /dev tmpfs defaults 0 0\n" >> ./etc/fstab
printf "tmpfs /tmp tmpfs defaults 0 0\n" >> ./etc/fstab
printf "var /var tmpfs defaults 0 0\n" >> ./etc/fstab

#Create a group file in /rootfs/etc directory.
printf "grep root /etc/group>group\n" > ./etc/group

#Create a password file in /rootfs/etc directory.
printf "grep root /etc/passwd>passwd\n" > ./etc/password

#Create a system wide 'profile' in /rootfs/etc directory.
printf "USER=\"`id -un`\"\n" >> ./etc/profile
printf "LOGNAME=$USER\n" >> ./etc/profile
printf "PS1='[\\u@\\h \\W]\\# '\n" >> ./etc/profile
printf "PATH=$PATH\n" >> ./etc/profile
printf "HOSTNAME=`/bin/hostname`\n" >> ./etc/profile
printf "export USER LOGNAME PS1 PATH HOSTNAME\n" >> ./etc/profile

#Create a 'hostname' file in /rootfs/etc directory.
printf "mini2440" > ./etc/hostname

#Create a /rootfs/etc/issue to add a welcome prompt to the console login.
printf "Welcome to Mini2440\n" >> ./etc/issue
printf "Kernel \\r on an \\m \(\\l\)\n" >> ./etc/issue

#Finally, create a resolv.conf file in /rootfs/etc directory to configure the 
#DNS address to access the internet with your service provider network domain 
#and ip address.
printf "nameserver 192.168.1.1\n" > ./etc/resolv.conf
printf "auto lo\niface lo inet loopback\n" > ./etc/network/interfaces
printf "auto eth0\niface eth0 inet dhcp\n" >> ./etc/network/interfaces



参考サイト
http://cchia-cwp.blogspot.com/2010/03/build-root-file-system.html
http://for-invent.com/mini2440-linux-kernel-from-scratch-getting-started-with-linux-on-the-mini2440-part-1

mini2440でbusybox環境構築

busybox
kernel
initrd
を作らないといけない。

内容:

"Build Root File System on Mini2440"
- Charles Blog: Build Root File SystemGoogle サイドウィキで表示

2010年12月17日金曜日

debianでupstart導入(ドキュメント読んでみた編)

ARM400MHzメモリー64Mしかないボードだと起動するだけで1分かかる。
これだと組み込み製品にしたとき使い物にならないのでなんとか早くしたい!と思って
upstartのドキュメントを読んでみた。
それで分かった事をメモしていく。

<Ubuntu環境から分かったこと>
1.設定ファイルの居場所
sysvinit→upstartにしたとき、
/etc/inittabに全部の設定を書いていたものが
/etc/init/*.confでばらばらに1ファイル1設定で記述する形式になる。

2.設定内容
試しに
/etc/init/tty1.confを開いてみるとランレベルが無くなる?と、どこかで見た内容とは違い、
ランレベルの設定がある。
start on stopped rcRUNLEVEL=[2345]
stop on runlevel [!2345]

respawn
exec /sbin/getty -8 38400 tty1
この内容だけ見て検討も付けられないけど今まで一行にまとめて記述していたものを分解したイメージなのかな。

これがsysvinitのときの設定。
T0:123:respawn:/sbin/getty 115200 ttySAC0

見比べてみればほぼ一致してるけど新しいパラメータが増えていたり設定できない部分もある。
これ以上みても真相が分からないままなので公式を見に行くことにした。

<公式UpstartのWikiから分かったこと>
http://upstart.ubuntu.com/wiki/

1.1つ1つイベントの状態は変更ができるぽい。
http://upstart.ubuntu.com/getting-started.html
こんな感じにできるんだーって感じで流し読み。
イメージできたものはsysvinitで全部直列でやってたものをパラレル処理できるように
1イベント1プロセスで割り当てて、依存関係は1プロセス内に条件を記述しているんだな程度。
停止するときはどうなんだろう、、とか変な事も考えつつページをそっと閉じた。

2.その他
コマンド一覧などが一杯あるけど、やってみないと分かんないと判断して読むのをやめた。

自分が扱うもので依存しそうなものはないので、
Sysvinitから移植しても動かせれそうな気がしてきた。
移植方針は、似たモジュール設定をコピー書き換えで済ましてやってみようと思う。

2010年12月16日木曜日

flashbootに関する情報

mini2440用wiki

コンパイルに関する便利なサイトを見つけた。

内容:

"friendlyarm"
- Linux_Tutorial - friendlyarm - Project Hosting on Google CodeGoogle サイドウィキで表示

gccでOpencvライブラリのパスを設定する方法

gcc `pkg-config --cflags opencv` `pkg-config --libs opencv` -o edge edge.c

これでおk

Makefileでコンパイルするなら
LDFLAGS += `pkg-config opencv --libs`
CFLAGS += `pkg-config opencv --cflags`
CXXFLAGS += `pkg-config opencv --cflags`

内容:

"LDFLAGS += `pkg-config opencv --libs` CFLAGS += `pkg-config opencv --cflags` CXXFLAGS += `pkg-config opencv --cflags`"
- OpenCV を使ったプログラムの作り方Google サイドウィキで表示

ubuntuでopencvのサンプルを動かす

とても参考になった。
自前の環境でまだパスの問題は解決されていなくて
#includeを
#include
にすればいいけど。。

内容:

"[OpenCV][Ubuntu][InspironMini]OpenCVインストール、顔認識などサンプル動かす"
- OpenCVインストール、顔認識などサンプル動かす - 橋本詳解Google サイドウィキで表示

gccで外部コマンドの実行

2010年12月15日水曜日

lighttpd + fastcgi(C/C++)設定

WEBサーバ経由で組み込みボードの汎用ポートを制御したりするには、スクリプト言語に移植されていない
ライブラリを使用するので、C/C++でコンパイルした実行ファイルをfastcgi経由で実行させなくていけない。

やりたいイメージ:
 (ユーザ、WEBブラウザ)→ LAN経由 → WEBサーバ(fastcgi経由 → 目的の制御プログラム)

処理の流れ:
1.ユーザがLAN経由でアクセスしてきて、WEBサーバにWEBAPI(URL、リクエスト)が届く。
2.WEBサーバは、起動しているfcgiモジュールにリクエストを投げてレスポンスをもらう。
3.WEBサーバは、ユーザへレスポンスを返し、結果をWEBブラウザに表示する。

こういった内容をnginxでできるか調べてみたら、fastcgiのプロセス管理は自前でやる事になる。
そこで別の軽量WEBサーバ「lighttpd」を使う事にした。


1.インストール
・lighttpdサーバインストール。
apt-get install lighttpd

・C/C++用fcgiライブラリをインストール。(ついでにテスト用fcgiもコンパイル)
$ wget http://www.fastcgi.com/dist/fcgi.tar.gz
$ tar zxvf fcgi.tar.gz
$ cd fcgi
$ make
$ sudo make install
$ cd example
$ gcc -o index.fcgi echo.c -lfcgi
$ mkdir /var/www/fcgi/
$ mv index.fcgi /var/www/fcgi/


・初期設定のままで
http://127.0.0.1/
へアクセスしてみてサーバが正常に動いているか確認する。


2.設定
fastcgiが動くように設定をする。
$ lighty-enale-mod fastcgi

公式ドキュメントより、Fastcgi.serverの設定方法はこんな感じにする。
lighttpd.confで
ドキュメントルート:/var/www/fcgi/
に設定してから
conf-enabled/10-fastcgi.confを開き、
---
…
fastcgi.server = (
        ".fcgi" => (
                "localhost" => (
                        "socket" => "/tmp/fcgi.socket",
                        "bin-path" => "/var/www/fcgi/index.fcgi",
                        "idle-timeout" => 20,
                        "check-local" => "disable",
                        "min-procs" => 1,
                        "max-procs" => 1
                )
        )
)
---

fastcgiモジュールのプロセスを起動して、サーバー再起動。
$ sudo spawn-fcgi -f /var/www/fcgi/index.fcgi -s /tmp/index.fcgi 2>&1 > /dev/null
$ sudo /etc/init.d/lighttpd farce-reload
(追記)
lighttpdが起動してくれるのでサーバ再起動のみでOK。
それの確認方法は、自分で生成されたプロセスIDをKillしても
別のプロセスIDで再起動しているのがわかる。
$ ps aux | grep index.fcgi
$ kill -9 (プロセスID)
$ ps aux | grep index.fcgi


3.動作確認
http://127.0.0.1/fcgi/
へアクセスしてみてfastcgiが動作しているかチェックする。

参考URL
http://redmine.lighttpd.net/projects/lighttpd/wiki/Docs%3AModFastCGI
http://linux.mini13i.gotdns.org/?Lighttpd%2FFastCGI

netsurfをコンパイルする

1.ダウンロード&インストール
apt-get install libcurl3-dev libxml2-dev libmng-dev libxcb-image0-dev libxcb-icccm1-dev libxcb-keysyms1-dev libxcb-aux0-dev libglade2-dev
svn co -r 10901 svn://svn.netsurf-browser.org/trunk/libparserutils
svn co -r 10901 svn://svn.netsurf-browser.org/trunk/libwapcaplet
svn co -r 10901 svn://svn.netsurf-browser.org/trunk/hubbub
svn co -r 10901 svn://svn.netsurf-browser.org/trunk/libcss 
svn co -r 10901 svn://svn.netsurf-browser.org/trunk/libnsgif
svn co -r 10901 svn://svn.netsurf-browser.org/trunk/libnsbmp
svn co -r 10901 svn://svn.netsurf-browser.org/trunk/librosprite
svn co -r 10901 svn://svn.netsurf-browser.org/trunk/libnsfb
(※リリースされた時期にあわせたリビジョン指定が必要。ちなみに10901はそれらしい日付で合わせてる。)

それぞれのライブラリをコンパイルしてインストール
make
make install

途中で「warning: cast increases required alignment of target type」エラーが出たら
Makefileを開き、コンパイルオプション「-Wcast-align」を取り除く。
(ARMネイティブ環境でコンパイルしたら出たが、VMWare上Ubuntu10.10ではエラーが出なかったのでコンパイラのバージョンか、アーキテクチャの問題で出てるのかな?)

ここからNetsurfソースビルド。
ReadMeをみてみると、iConv対応にするならMakefileに
CFLAGS += -DWITH_ICONV_FILTER
を追加。

今回はFrameBuffer用ブラウザをビルドするので、
make TARGET=framebuffer
make install

これで無事完了。

2010年12月14日火曜日

nginx + gunicorn + web.py設定例

1.web.pyインストール
sudo easy_install web.py

2.実行
街角のリブロガー: Djangoより軽いフレームワーク探し中
ここのHelloworldソースコードを作成して、

gunicorn app:app

これで実行。
パラメータは、
gunicorn <モジュール名>:WSGI戻り値を格納している変数名

というようになっている。

2010年12月13日月曜日

Kernelパラメータの説明書

モニター回転
fbcon=rotate:
n=0 通常
1:90度
2:180度
3:270度

内容: Linux Kernel Documentation :: fb : fbcon.txtGoogle サイドウィキで表示

nginxサーバのfastcgi経由でC/C++アプリを動かす

組み込み系で使えそう。

内容:

"#include <fcgi_stdio.h>"
- nginx and FastCGI C/C++Google サイドウィキで表示

/dev/input/*の取り扱い方

/dev/input/フォルダ内にあるものはKernelが認識している入力デバイスで、読み込めばイベント取得できて、書き込めばイベントを装う事ができるらしい。

内容:

"Linux Input Subsystemの使い方"
- Linux Input Subsystemの使い方Google サイドウィキで表示

X使わずに使えるWEBブラウザ(Mozilla)をコンパイルする

Djangoより軽いフレームワーク探し中

gunicorn+web.pyの設定編。


#!/usr/bin/env python
# -*- coding:utf-8 -*-
import web

urls = (
'/(.*)', 'hello'
)

#app = web.application(urls, globals())
app = web.application(urls, globals()).wsgifunc() # <- .wsgifunc() を追加!


class hello:
def GET(self, name):
if not name:
name = 'World'
return 'Hello, ' + name + '!'

if __name__ == '__main__':
app.run()

内容:

"app = web.application(urls, globals()).wsgifunc() # <- .wsgifunc() を追加!"
- gunicorn で web.py 製のアプリケーションを動かす - yono05の日記Google サイドウィキで表示

nginx + gunicorn + django設定例

さまざまなサイトで公開されているので必要ないけども、
fastcgiからgunicornへ移行したときの手順を自分用にまとめておいておく。
参考になったらいいな程度に手順をまとめる。

1.gunicornインストール
wget http://peak.telecommunity.com/dist/ez_setup.py
python ez_setup.py -U setuptools
easy_install -U gunicorn


2.nginx + gunicorn + djangoの場合
setting.pyを開いて、
INSTALLED_APPSに
"gunicorn",
を追加する。

nginxの設定ファイルを開いて、ルートドキュメントセクション内に
設定例:
        location / {
                #host to gunicorn server
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header Host $http_host;
                proxy_redirect off;
                if (!-f $request_filename) {
                        proxy_pass http://127.0.0.1:8000;
                        break;
                }

                ##host and port to fastcgi server
                #fastcgi_pass 127.0.0.1:8080;
                #fastcgi_param PATH_INFO $fastcgi_script_name;
                #fastcgi_param REQUEST_METHOD $request_method;
                #fastcgi_param QUERY_STRING $query_string;
                #fastcgi_param CONTENT_TYPE $content_type;
                #fastcgi_param CONTENT_LENGTH $content_length;
                #fastcgi_pass_header Authorization;
                #fastcgi_intercept_errors off;
        }

python maange.py run_gunicornでまずdjangoアプリ起動
それからnginxデーモンを再起動。
http://localhost/にアクセスしてみる。
正常にページがロードされたら成功。


参照URL
http://gunicorn.org/install.html
http://gunicorn.org/run.html

gummo さんの Google サイドウィキ エントリ

nginxの使い方参考サイト。

内容:

"WordPress on nginx with FastCGIに移行してみた"
- WordPress on nginx with FastCGIに移行してみた - stnard.jpGoogle サイドウィキで表示

マイクロフレームワークFlask

ツイッターBOTもだいたい20行くらいで書けちゃうシンプルさがウリらしい。

内容:

"Flask"
- Welcome | Flask (A Python Microframework)Google サイドウィキで表示

python2.6標準機能のWEBブラウザモジュール

import webbrowser

webbrowser.open("http://www.python.jp/doc/release/lib/module-webbrowser.html")

内容:

"import webbrowser webbrowser.open("http://www.python.jp/doc/release/lib/module-webbrowser.html")"
- Pythonメモ: Webブラウザを開くGoogle サイドウィキで表示

2010年12月10日金曜日

mpeg-streamerを使ってみる。

KernelでV4L対応になっている事が条件。

1.ファイルダウンロード。
http://sourceforge.net/projects/mjpg-streamer/files/

2.インストール。
$ sudo dpkg --install mjpg-streamer_r94-1_i386.deb

3.実行
$ mjpg_streamer -o "/usr/lib/output_http.so -w /usr/www" -i "/usr/lib/input_uvc.so -y -r 320x240 -f 4"
4.動作確認。
ブラウザからhttp://localhost:8080/にアクセスする。

[Django]static_mediaの設定方法

settings.pyを開いて
MEDIA_ROOT = '/var/www/mysite/site_media/'
MEDIA_URL = '/site_media/'

urls.pyを開いて
from django.conf import settings

(r'^site_media/(?P.*)', 'django.views.static.serve', {'document_root': settings.MEDIA_ROOT}),

を追加。

テンプレート内でメディアにアクセスする場合、絶対パス。
/site_media/foo.jpg

View.py内でメディアにアクセスする場合、相対パス。
./site_media/foo.jpg

[Django]view内のパス

project/app/view.py内が読み込まれるときパスは

project/

になっている。

lennyからsqueezeへアップグレード(暫定)

ただ単純にアップグレードが成功するならこの記事の必要性はないだろうw
サービスパックをあてる様な感覚でLennlyからSqueezeにアップグレードすると
様々なエラートラップにはまるので、それらを切り抜けて完了させる方法を説明していく。

まず前提としてapt-getのみでアップグレードする事を推奨。

$ apt-get install apt aptitude
$ apt-get install perl5 libdpkg-perl
$ apt-get install python2.6 python2.6-minimal
$ apt-get dist-upgrade
・dpkgエラーの場合は、参照リンク
・shエラーの場合は、
$ cd /bin/sh
$ ls -l sh
dashがないのにリンクしていたらbashにリンク張替えて
$ rm sh
$ ln -s bash sh
$ apt-get dist-upgrade
全部完了したところで
$ rm sh
$ ln -s dash sh

これでlennyから無事squeezeへアップグレードした。

・参照リンク
街角のリブロガー: Mini2440のバッドノウハウ

2010年12月9日木曜日

moinmoin

これやってみるかな

内容:

"Ubuntuにmoinmoinを導入する方法"
- Ubuntuにmoinmoinを導入する方法 - RENAISSANCEGoogle サイドウィキで表示

CSS+jQueryでソフトウェアキーボード

これは使えるのか?

内容:

"Creating a Keyboard with CSS and jQuery"
- Creating a Keyboard with CSS and jQuery | Nettuts+Google サイドウィキで表示

python-webkitのインストール情報

/usr/share/doc/python-webkit/

exampleフォルダにタブブラウザがある。

内容:

"/usr/share/doc/python-webkit/"
- Debian -- パッケージのファイル一覧: python-webkit/sid/armelGoogle サイドウィキで表示

Django1.2.3のチュートリアル

日本サイトのDjangoチュートリアルは古くてUrls.pyの設定が違う。

mysite.polls.views.index

polls.views.index

myciteの部分はいらなくなる。

内容:

"This document describes Django 1.2"
- Django | Writing your first Django app, part 3 | Django documentationGoogle サイドウィキで表示

Linuxでソフトウェアキーボード

使えそうだけど、Androidみたいにテキストボックスフォーカスしたら出てきてほしい。

内容:

"Matchbox Keyboard and Stroke"
- http://matchbox-project.org/?p=1Google サイドウィキで表示

2010年12月8日水曜日

mini2440用ディストリのまとめ

mini2440にWEBアプリサーバーを入れてWEBアプリ専用の端末にする自己ディストリを作成してたけど、
一度目標確認のためにまとめメモ。
容量の問題:
・Flashメモリが256MBに収まる環境構築を目指しているが、現状400MBオーバー。
xorgとopencv合わせると結構大きくなるので、どうするか。
SDカード接触が悪いのでなるべく収めたい。

・WEBアプリサーバーの構築で組み合わせ問題。
apache+mod_pythonだとパス設定の問題で作成したページが見れない状態だった。
開発用サーバそのまま運用する手もある。
現在は、nginx+fastcgiで構築中。

・起動時間の問題
systemdかupstartをsqueezeから取ってくれば入るが、設定が必要。

最短で考えて、WEBアプリサーバは外部公開しないから開発用サーバそのままでいってみるかな。。

WEB上に乗ってる情報はメモレベルなので、そのとおりやっても動かないのがほとんど。
WEBやってる人が近くにいればなーって思うこのごろ。

nginx+Django

そのままの設定で動いたのを確認。

内容:

"Deloying Django on Nginx"
- Deloying Django on Nginx « Python & My lifeGoogle サイドウィキで表示

起動を早くするのに使えそう

initramfs

内容:

"initramfsなブートディスク"
- initramfsなブートディスク: Notes On NotesGoogle サイドウィキで表示

debian lennyで開発環境を入れる

aptitude install build-essestial
を入れれば開発環境のベースが整う。

lenny→squeezeアップグレードエラー

aptitudeでfull-upgradeすると正常に最後までアップグレードができない。
原因はショートカットshがdashインストール前に置き換えられていたり、
dpkgをアップグレードすると正常にインストールできなくなったりする。。

そういうときの対処は、
・shショートカットをbashにする。
ln -s sh bash

・dpkgをlennyで使っていたものに戻す。
wget http://ftp.jp.debian.org/debian/pool/main/d/dpkg/dpkg_1.14.30_armel.deb
dpkg --install dpkg_1.14.30_armel.deb

マイナーバージョンが変わってた場合、Googleで「Debian Lenny dpkg」で
Debianサイトからdpkgなどパッケージのバージョンを調べる必要あり。

これでもエラーしてる場合は、apt動かすのに必要なPythonとPerlを先に
アップデートしておけばおk。
Lennyで使っているPythonやPerlだとエラーするので。。


どうでもいいけどSqueezeが正式リリース前のフリーズ状態になってから半年?経った気がするけど、バグ多いよね。。
乗り換えたいけどARMが使えるディストリって少ないんだよなー

2010年12月7日火曜日

gummo さんの Google サイドウィキ エントリ

WEBアプリサーバに使えそう。

内容:

"gunicorn は何かというと、python で作られた WSGI に対応するウェブサーバーです。"
- Django アプリサーバ、gunicorn と fastcgi の比較 - Ian LewisGoogle サイドウィキで表示

起動エラーについてまとめ

・(none) login:と出る場合
→/sbin/initがinittabファイルを読み込んでランレベルに応じたgetty実行する部分で設定が不足している。

ちなみにinittabは/etc/inittabかと思いきや、/usr/share/sysvinit/inittabなど別の場所にある場合が
あるので注意しておく必要がありそう。


・dhcp読み込んだ後、カーネルパニックが起きた。
→kernel panic - not syncing: vfs: unable to mount root fs on unknown-block(2,0)
ルートをマウントしたけどFS(ファイルシステムの形式)が不明で読み込んだけどよう分からんっとカーネルがパニックしているぽい。
Kernelビルド前にMenuconfigでEXT3なりのオプションが有効になってるかチェックする。
ちなみに4.4.3から4.3.2へGCCのバージョンを変えたら直った。

2010年12月6日月曜日

クロスコンパイラ作成

1.必要なファイルをダウンロード&インストールする
<Synapticsから>
・gawk
・bison
・flex
・texinfo
・automake
・libtool
・cvs
・libncurses5-dev

<Webから>
http://ymorin.is-a-geek.org/download/crosstool-ng/から最新版をダウンロードする。
(現在1.9.0が最新)


2.crosstool-ngをコンパイル&インストール
$ ./configure
$ make
$ sudo make install


3.toolschain作成
フォルダ作成
$ cd ~/
$ mkdir toolchain
$ cd toolchain

Config作成
$ wget http://v3.netyxia.net/~mobyfab/mini2440/.config
自分で設定場合は、
$ ct-ng menuconfig
(設定する項目は後日まとめる)

パッチがあれば当ててからビルド実行
sudo rm ${HOME}/targets/src/.eglibc-trunk.patching
nice ct-ng build.2

4.環境設定
.bashrcに記述する。
export PATH=$PATH:$HOME/toolchain/arm-920t-linux-gnueabi/bin


参考URL
http://mini2440.netyxia.net/viewtopic.php?f=8&t=12
http://www.friendlyarm.net/forum/topic/156

Win7でRAMディスク設定する

XPで使ったGavotte Ramdiskでできるようだ。

内容:

"32bit 版の Windows 7 に Gavotte Ramdisk を導入した."
- 32bit 版の Windows 7 に Gavotte Ramdisk を導入した. とりコー/ウェブリブログGoogle サイドウィキで表示

2010年12月3日金曜日

xorgのバージョン別の設定が載っている

Xorg7.4からhaldないでキーボード等の制御するようになったからlennyからsqueezeへアップグレードした時は設定に注意しないといけない。。
前にアップデートした時、動かなかった原因はもしかするとこれか!

内容:

"GUI環境を構築する (X.org 7.x/xfce 4.x)"
- 【FreeBSD】GUI環境を構築する (X.org 7.x/xfce 4.x)Google サイドウィキで表示

django + python + sqlite

apt-getでこれらパッケージを入れる。
python2.6
python2.6-sqlite
libapache2-mod-python2.6
python-gtkmozembed(処理が重い、Cookie対応)
python-wibkit(処理が早い、Cookie未対応)
python-django

swap設定

mini2440の場合、
$ vim /etc/rc.local
swapon /dev/mmcblk0p3

将来スワップOFFにするつもりだから、
メモリオーバーコミット設定とかは今のところしない予定。

内容:

"を追加デフォルトは60なので50に設定vm.swappiness = 50"
- 備忘録:Swap設定について(Linux)|taka_lifeGoogle サイドウィキで表示

XWindowのフォント設定

フォントディレクトリを登録して、
xset +fp /usr/share/fonts/TrueType-Japanese

フォントパスを認識させる。
xset fp rehash

最後に再起動してもフォントを使えるようにする。
/etc/X11/xorg.conf
Section "Files"

FontPath "/usr/share/fonts/TrueType-English"←追加
FontPath "/usr/share/fonts/TrueType-Japanese" ←追加

EndSection

内容: Column - X Window SystemにTrueTypeフォントを追加しようGoogle サイドウィキで表示

SDメモリーエラー

s3c-sdi s3c2440-sdi: running at 398kHz (requested: 400kHz).
s3c-sdi s3c2440-sdi: powered down.
mmc0: error -110 whilst initialising SD card
s3c-sdi s3c2440-sdi: powered down.

こんなエラーが出た時は大体接触不良。
挿しなおしで解決でちゃったりするから怖い。

2010年12月1日水曜日

PythonでPluginローダを書いてみた

http://d.hatena.ne.jp/jkani4/20080105
参考サイトでプラグイン管理モジュールを公開されているのをみて、
自分流にリメークしてみた。

違いは、シンプルにした点。
オリジナルは必須関数と推奨関数2つ登録できるのに対して、
リメークしたものは必須関数限定にしてある。
それと呼び出し用クラスを介してプラグインモジュールを呼び出せるようにした。

使い方はこんな感じ
[手順]
#プラグインローダを生成
pl = PluginLoader("./plugins")

#使いたいプラグインモジュール名を指定して関数を呼び出す。
func = pl.get_plugin_module("plugin_name")
func.get_name()

これでスレッド処理に対応させれば満足。

# -*- coding: utf-8 -*-

import os
import sys
import inspect

#targetDirパス内のプラグインファイルを読み込む
class PluginLoader:
 def __init__(self, targetDir):
  self.plugFuncNames = ['run', 'test', 'get_name', 'get_ver']
  self.pluginDict = {}
  sys.path.append(targetDir)
  # プラグイン検索&登録
  for item in os.listdir(targetDir):
   modname = inspect.getmodulename(item)
   if modname not in self.pluginDict.keys():
    self.import_plugin(modname)

 def import_plugin(self, modName):
  cnt = 0
  funcDict = {}
  # プラグイン関数検索
  funcList = inspect.getmembers(__import__(modName), inspect.isfunction)
  funcNames = [item[0] for item in funcList]
  for fname in self.plugFuncNames:
   if fname in funcNames:
    cnt = cnt + 1
  # プラグイン関数登録
  if cnt == len(self.plugFuncNames):
   for name, funcObj in funcList:
    if name in self.plugFuncNames:
     funcDict[name] = funcObj
   self.pluginDict[modName] = funcDict
   print "plugin registered:%s" % modName

 def get_plugin_count(self):
  return len(self.pluginDict)
 def get_plugin_list(self):
  return self.pluginDict.keys()
 def get_plugin_module(self, modName):
  return PluginFunc(self.pluginDict[modName])
 
#プラグインモジュールを呼び出すクラス
class PluginFunc:
 def __init__(self, ptr):
  self.plugin_ptr = ptr
 def run(self):
  return self.plugin_ptr['run']()
 def test(self):
  return self.plugin_ptr['test']()
 def get_name(self):
  return self.plugin_ptr['get_name']()
 def get_ver(self):
  return self.plugin_ptr['get_ver']()

#動作確認用
if __name__ == '__main__':
 pl = PluginLoader("./plugins")
 print 'plugin module count : %d' % pl.get_plugin_count()
 print '------------------------'
 for name in pl.get_plugin_list():
  print "plugin name: " + name
  func = pl.get_plugin_module(name)
  print func.get_name()
  print func.get_ver()
  print func.run()
  print func.test()
  print '------------------------'

プラグインの雛形
# -*- coding: utf-8 -*-

def run():
 return "run"
 
def get_name():
 return "get_name"

def get_ver():
 return "get_version"

def test():
 return "test"

ARMのバージョンについて

まとめてみた。

Nov.2006年のInterfaceより抜粋

v1 最初の命令セット.ほとんど使用されていない
v2 乗算命令とコプロセッサをサポート
v2a キャッシュのサポートと同期命令(SWP)の追加
v3 ARM 社独立後の最初のアーキテクチャ
v3G 詳細不明.v2a と互換性なし
v3M 結果が64 ビットの乗算
v4 システム・モードのサポート.アーキテクチャの完成版
v4T Thumb モードの追加
v5T BLX,CLZ,BKPT 命令の追加
v5TE DSP 命令セットの追加
v5TEJ Java 拡張(Jazelle)の追加
v6 マルチメディア拡張(SIMD).同期命令の強化(LDREX/STREX).割り込み応答の高速化
v6T2 Thumb-2 モードの追加
v6Z TrustZone の追加
v7 最新アーキテクチャ(詳細は第7 章を参照)
ARM1-3 Acorn 社時代に設計されたコア(現在は使われていない)
ARM4-5 存在しない
ARM6 ARM 社として最初に設計されたコア(現在は使われていない)
ARM7 現在のARM プロセッサの基本コア
ARM8 (現在は使われていない)
ARM9 5 段パイプラインへ拡張
ARM10 6 段パイプラインへ拡張
ARM11 8 段パイプラインへ拡張

aptitudeがSegmentation faultエラーで止まる

$ aptitude upgrade
Segmentation fault

こうなったときは、キャッシュファイルが壊れた時らしいので、一回削除してupdateしなおす。

$ rm /var/cache/apt/pkgcache.bin
$ rm /var/cache/apt/srcpkgcache.bin
$ apt-get update

内容:

"# rm /var/cache/apt/pkgcache.bin # rm /var/cache/apt/srcpkgcache.bin どうやらキャッシュファイルが壊れてたらしい"
- apt-getもaptitudeもエラーで止まる - HYPERSPACE UNIVERSE NEWSGoogle サイドウィキで表示

debファイルの格納される場所

lenny→squeezeにアップグレードしたとき、dhcpクライアントが消えて
どうしようもなくなったので他から
isc-dhcp-client_4.1.1-P1-12_arm.debファイルを取ってきた。
んで格納した場所はここ。

/var/cache/apt/archives

Androider