google-code-prettify

ラベル Linux の投稿を表示しています。 すべての投稿を表示
ラベル Linux の投稿を表示しています。 すべての投稿を表示

2012-09-12

Dropboxと暗号化ファイルシステムを組み合わせる

Dropboxは便利なのだが、やはり人に見られたくないファイルを置くのが少しためらわれる。 そこで、気休めかもしれないが、暗号化ファイルシステムであるencfsと組み合わせて使うことにした。

Dropboxが同期するディレクトリを~/Dropbox、暗号化したファイルを置くディレクトリを~/Dropbox/enc、アプリから直接読み書きするディレクトリを~/dropとする。

マウント方法

$ mkdir ~/Dropbox/enc (暗号化したファイルを置くディレクトリを作成)
$ mkdir ~/drop (マウントポイントを作成)
$ encfs ~/Dropbox/enc ~/drop
これでOK。Dropboxが~/Dropboxを勝手に同期してくれるので、アプリからは~/dropにあるファイルにアクセスすればよい。

アンマウントは以下。

$ fusermount -u ~/drop

2010-03-23

数あるLinuxのsound APIのうち、何を使うべきか?

Linuxには様々なsound API(ライブラリ)があるが、目的別にどのAPIを使うべきかを解説したページ。

Profession: Audio Terrorist

2010-01-02

pthreadのbacktraceでの不思議な現象

Debian lennyのgdbでbacktraceが正しく表示されないことがある。

うーむ。さっぱり原因が分からない。
どなたか分かる方、教えてください。

以下、再現させるためのプログラム。
#include <pthread.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>


static void *print_thread(void *arg)
{
for (;;) {
printf("print thread\n");
}
}

int main(void)
{
pthread_t th;

pthread_create(&th, 0, print_thread, 0);


for (;;) {
printf("main\n");
}

return 0;
}

このプログラムをgdbで実行すると、"main\n"と"print thread\n"が表示される.
途中でCtrl-Cでプログラムを停止させてbacktraceを表示すると、stackが正しく表示されない。
(gdb) thr 1
[Switching to thread 1 (Thread 0xb7e576b0 (LWP 12994))]#0 0xb7fdc424 in __kernel_vsyscall ()
(gdb) bt
#0 0xb7fdc424 in __kernel_vsyscall ()
#1 0xb7f46b53 in ?? () from /lib/i686/cmov/libc.so.6
#2 0xb7eb87b3 in ?? () from /lib/i686/cmov/libc.so.6
Backtrace stopped: previous frame identical to this frame (corrupt stack?)
(gdb) thr 2
[Switching to thread 2 (Thread 0xb7e56b90 (LWP 12997))]#0 0xb7fdc424 in __kernel_vsyscall ()
(gdb) bt
#0 0xb7fdc424 in __kernel_vsyscall ()
#1 0xb7f2828b in write () from /lib/i686/cmov/libc.so.6
#2 0xb7ec1d6c in _IO_file_write () from /lib/i686/cmov/libc.so.6
#3 0xb7ec2ee7 in _IO_do_write () from /lib/i686/cmov/libc.so.6
#4 0xb7ec2895 in _IO_file_overflow () from /lib/i686/cmov/libc.so.6
#5 0xb7ec5713 in __overflow () from /lib/i686/cmov/libc.so.6
#6 0xb7eb8746 in puts () from /lib/i686/cmov/libc.so.6
#7 0x08048456 in print_thread (arg=0x0) at a.c:12
#8 0xb7fb94c0 in start_thread () from /lib/i686/cmov/libpthread.so.0
#9 0xb7f386de in clone () from /lib/i686/cmov/libc.so.6

thread 1のbacktraceが、corruptと表示される。

2009-11-18

様々な周波数のbeep音を出す2

ioctlによる方法だと特別な権限が必要になってしまう。特別な権限無しにbeep音をだしたかったので、PortAudioを使うことにした。

テスト用のファイルのうち"sin"とつくものを適当に改造すれば、任意の周波数のbeep音を出すことができる。

様々な周波数のbeep音を出す。

ioctl(fd, KIOCSOUND, val);で、様々な周波数のbeep音を出すことができる。要root権限。

#define CLOCK_TICK_RATE 1193180

int main(int argc, char *argv[])
{
int fd;
int ret;
int freq;
int val;

fd = open("/dev/console", O_WRONLY);
if (fd == -1) {
perror("open");
exit(1);
if (argc > 1) {
freq = atoi(argv[1]);
val = (int)(CLOCK_TICK_RATE/freq);
} else {
val = 0;
}

ret = ioctl(fd, KIOCSOUND, val);
if (ret < 0) {
perror("ioctl");
exit(1);
}
return 0;
}

2009-04-02

LinuxとNetBSDのbridgeの違い

LinuxとNetBSDでは、bridgeの意味が違うようだ。

Linuxのbridgeは、複数のネットワークを一つのネットワークに見せるために使う。
例えばeth0とeth1をブリッジする時には、
・eth0とeth1には、IPアドレスを割り当てない(0.0.0.0)。
・bridgeに対して、IPアドレスを割り当てる。
このようにする事で、eth0とeth1が一つのネットワークに見え、Linuxは一つのIPアドレスを持つ事になる。

NetBSDのbridgeは、複数のネットワーク間でパケットを素通しするために使う。
例えばeth0とeth1をブリッジすると、
・eth0に来たパケットは、eth1へ行く。
・eth1に来たパケットは、eth0へ行く。
・bridgeはIPアドレスを持たない。eth0とeth1はIPアドレスを持っている。
Linuxと同じように、eth0とeth1が一つのネットワークに見えるが、NetBSDの場合は二つのIPアドレスを持つ事になる。

参考
http://archive.netbsd.se/?ml=openbsd-misc&a=2006-05&t=2063095

2009-01-23

opensslのs_serverの不思議

以下のようなコードを書いた。これをopenssl.shとする。
#!/bin/sh

openssl s_server ...(省略)... &

bash上から、$ ./openssl.shとすると、バックグラウンドでopensslのs_serverが起動する。

NetBSD上で
$ ./openssl.sh
を実行すると、このs_serverにブラウザから接続できる。
しかし、Linux上で./openssl.shを実行すると、ブラウザから接続できない。

openssl.sh経由ではなく、以下のように直接opensslを実行すると、ブラウザから接続できる。
$ openssl s_server ... &


openssl.sh経由と直接の違いをktraceで調べてみた。

直接opensslを動作させると、
1. opensslがselectを呼ぶ
2. selectから抜ける。
3. ブラウザからの接続があり、通信を行う。
となるのだが、openssl.sh経由だと、
1. opensslがselectを呼ぶ
2. selectから抜ける。
3. fdの0(STDIN)が切られているので、プログラムを終了する。
と動作しているようだ。

なぜLinuxとNetBSDで動作が違うのかが不明。
bashの違い? opensslの違い?

動作が違う原因はわからないが、opensslのSTDINをcloseしてはいけないという事はわかった。
以下のようにする事で、回避する事にした。
1. openssl.shの中でopenssl s_serverを起動する時には、&を付けない。
#!/bin/sh

openssl s_server ...(省略)...

2. openssl.shを起動する時に、&を付ける。
$ openssl.sh &

2008-06-09

Linux Kernel Map

Linux Kernel Map
Linuxカーネルの内部モジュールの地図。

via OSnews

2008-03-26

Nokia 705NKで撮影した画像をBluetoothでLinuxへ転送する

Nokia 705NKで撮影した画像をBluetoothでLinuxへ転送する

携帯内のC:/Data/Images/とE:/Images/以下の全ての画像をPCに転送するスクリプト。

本当はこのスクリプトを、
「携帯が近付いたときに、自動で実行する」
としたいのだけど、どうすればよいのだろう?

2007-12-19

mprotectでPROT_WRITEした領域へのmemsetができない場合がある

NetBSDのcompat-linuxな環境で、以下のコードが動作しないらしい。
mprotect(buf, len, PROT_WRITE);
memset(buf, 0, len);
原因は、glibcがmemset時にリードアクセスを行う事があるためらしい。

memset時にリードアクセスをすると速くなる(事がある)理由は、以下の通り。
・アーキテクチャによっては、read時のキャッシュミスではキャッシュをfillし、write時のキャッシュミスではfillしない物がある。
・そのようなアーキテクチャの場合、4バイト毎に実メモリへの書き込みが発生してしまう。
・事前に一回空readをしてキャッシュラインをfillしておくと、writeアクセスは実メモリではなくキャッシュに対して行われるようになり、高速に書き込みが行われる。

via current-users@netbsd

2007-05-07

ext3cow - snapshotをとれるext3 FS

ext3cowは、FSのsnapshotを取り、過去のファイルを取り出す事ができるFSのようだ。
名前が表している通り、ファイルをcopy-on-writeする(らしい)。