2010年3月17日水曜日

edコマンド

sedコマンドでhogehogeファイルの1行目の文字列「foo」を「bar」に置き換える場合

sed "1s/foo/bar/g" hogehoge

ってな感じになる。

そこでこれを同じファイルに保存するために

sed "1s/foo/bar/g" hogehoge > hogehoge

とするとhogehogeは空のファイルになってしまう。

こんな場合、edコマンドを使えば、こんな感じでできる。

echo -e "1s/foo/bar/g\nw\nq\n" | ed -s nkt_scripts/test.sh

echoの「-e」オプションは「\」をエスケープ文字と見なすためのもの。
これで「\n」を改行とみなしてくれる。

echoでは置き換え命令「1s/foo/bar/g」と
書き込み命令「w」と
終了命令「q」をedに送っている。
改行「\n」が命令の区切り。

edの「-s」オプションは、edの出力を消すため。
シェルスクリプト内で使いたいので、意味のない出力を出さないためにつけとく。

2010年3月14日日曜日

pythonとCでbase64

pythonのbase64モジュールを使った場合

import base64
print base64.b64encode('data to be encoded')        # → 'ZGF0YSB0byBiZSBlbmNvZGVk'
print base64.b64decode('ZGF0YSB0byBiZSBlbmNvZGVk')  # → 'data to be encoded'



C言語のOpenSSLライブラリを使った場合

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include <openssl/ssl.h>


//結果dst_dataは改行文字(0x0a = \n)付きでNUL終端なし
//改行文字(0x0a = \n)までの長さを返す
//0以下を返すとエラー
int base64encode( char *dst_data, int dst_data_buf_size, void *src_data, int src_len )
{
    int r;
    BIO *mem, *b64, *chain;
    BUF_MEM *bptr;
    
    if( dst_data==NULL || dst_data_buf_size<=0 || src_data==NULL || src_len<=0 )
        return -1;
    
    b64 = BIO_new(BIO_f_base64());
    if( b64==NULL )
        return -2;
    
    mem = BIO_new(BIO_s_mem());
    if( mem==NULL )
    {
        BIO_vfree(b64);
        return -3;
    }
    
    chain = BIO_push(b64, mem);
    
    r = BIO_write(chain, src_data, src_len);
    if( r<=0 )
    {
        BIO_free_all(chain);
        return -4;
    }
    
    r = BIO_flush(chain);
    if( r<=0 )
    {
        BIO_free_all(chain);
        return -5;
    }
    
    BIO_get_mem_ptr(chain, &bptr);
    if( dst_data_buf_size < bptr->length )
    {
        BIO_free_all(chain);
        return -6;
    }
    
    memcpy( dst_data, bptr->data, bptr->length );
    r = bptr->length;
    
    BIO_free_all(chain);
    
    return r;
}

//src_dataにはNUL終端は必要ないが、改行(0x0a = \n)は必須
//結果dst_dataのデータ長を返す
//0以下を返すとエラー
//制限事項として、変換結果とdst_data_buf_sizeが同じ長さの場合エラーを返す。
//必ず、変換結果より大きなサイズのバッファを用意しなければならない。
int base64decode( void *dst_data, int dst_data_buf_size, char *src_data, int src_len )
{
    int r;
    BIO *mem, *b64, *chain;
    
    if( dst_data==NULL || dst_data_buf_size<=0 || src_data==NULL || src_len<=0 )
        return -1;
    
    b64 = BIO_new(BIO_f_base64());
    if( b64==NULL )
        return -2;
    
    mem = BIO_new_mem_buf(src_data, src_len);
    if( mem==NULL )
    {
        BIO_vfree(b64);
        return -3;
    }
    
    chain = BIO_push(b64, mem);
    
    r = BIO_read(chain, dst_data, dst_data_buf_size);
    if( r<0 )
    {
        BIO_free_all(chain);
        return -4;
    }
    if( r>=dst_data_buf_size )
    {
        BIO_free_all(chain);
        return -5;
    }
    
    BIO_free_all(chain);
    
    return r;
}

int main(int argc,char **argv)
{
    int r;
    char *data = "data to be encoded";
    char a[256];
    char b[256];
    
    r = base64encode( a, sizeof(a), data, strlen(data) );
    if( r<=0 )
    {
        printf("err=%d\n",r);
        exit(1);
    }
    a[r-1] = '\0';
    printf("%s\n",a);
    
    strcat(a,"\n");
    r = base64decode( b, sizeof(b), a, strlen(a) );
    if( r<=0 )
    {
        printf("err=%d\n",r);
        exit(1);
    }
    b[r] = '\0';
    printf("%s\n",b);
    
    return 0;
}

pythonでURLエンコード

pythonでURLのエンコードとデコードする例。
urllib.urlencode()でエンコード、
cgi.parse_qs()でデコード。

import urllib
import cgi

a = urllib.urlencode([('username','gazpara'),('password','!"#$%&()')])

print a               # → 'username=gazpara&password=%21%22%23%24%25%26%28%29'

b = cgi.parse_qs(a)
print b               # → {'username': ['gazpara'], 'password': ['!"#$%&()']}
print b['username']   # → ['gazpara']
print b['password']   # → ['!"#$%&()']


リンクメモ
http://www.python.jp/doc/release/index.html
http://www.python.jp/doc/release/lib/module-urllib.html
http://www.python.jp/doc/release/lib/module-cgi.html

ubuntuでOpenVPN

VPNをしたいけどいくつか選択肢がある。

箱物を使ってもいいならヤマハとかアライドとか
YahooオークションでNetScreenとかCisco1700を買うって手もあるけど
Linuxで安く、そんなに性能も要らないなら上記のソフトで十分。

無料ならOpenVPNしかないみたい。
SoftEtherは当時衝撃的だったけどPacketiXとして商業化してしまった。
オープンソース化してれば今より可能性あったと思うんだけど
個人的には失敗だったと思う。
TinyVPNもブリッジとして使う場合に有償となったし・・・
L2TP + IPsecはOpenVPNより設定がめんどうそうだし。

そんなわけでOpenVPNを試す。
設定方法はここをそのまま実行するだけ。
たしかに面倒だけど無料だと思って、がまんがまん。

ちなみにこっちにも似たような説明があるが
あちこち間違いがあって無用としか思えん。

使用するプロトコルはTCPよりUDPの方がスループットが良いみたい。
server.confとclient.ovpnに

proto udp


それと、VPNを使ってsshしかしないから圧縮は意味が無いと思うのでコメントアウトに。

#comp-lzo


しかし、めんどくさいなー
もう少し簡易化してほしい


リンクメモメモ
https://help.ubuntu.com/community/OpenVPN
http://openvpn.net/index.php/open-source/documentation/howto.html
http://www.stackasterisk.jp/tech/systemConstruction/openVpn01_01.jsp
http://www.remus.dti.ne.jp/~grn/openvpn.html
http://freescitech.net/2/ovpn2_howto_ja.html
http://freescitech.net/2/ovpn2_static_ja.html

2010年3月13日土曜日

DisplayLinkなるもの

新しいPCにはモニタが無い。
必要なときに他から持ってきて繋げている。

もっぱらリモートアクセスだからそれでもいいんだが
やはり小さくてもモニタがあればなぁと思ってみれば
それにぴったりのがあるんですね。

衝動買いしました。
USB給電なのがなによりも良い。

LCD-USB7XB



とはいえ、Linuxでも使える保障なんてなくて
ただ単に遊んでみようってのが主な目的なんですが。

他社からも似たような製品が出ていて、
これらはDisplayLinkのチップを使ってるようです。

そこで自宅のLinux(ubuntu 9.04 desktop)でも動くかやってみる。
DisplayLinkのLinux用ドライバはこちらから
http://libdlo.freedesktop.org/wiki/

libdlo-0.1.2.tar.gzを落として解凍。
READMEにあるように


sudo apt-get install libusb
./configure
sudo make install
make check


テスト用画面が作動。
おぉー

すんなりいって良かった。

一応ここまで。

ホントはサーバのコンソール画面(Xではなくて)を表示したいのだが
勉強しないといけないことが多いのでまた今度。

最近UBICOMの評価ボードでOpenWRTを動かしてるんだけど
そちらでも使えるとおもしろいかなぁと
OpenWRTで実際やってる人もいる


リンクメモメモ
http://libdlo.freedesktop.org/wiki/
http://blogg.noonday.se/2010/01/28/linux-usb-video-adapter/
http://sven.killig.de/openwrt/slugterm_dl.html
http://www.oceans.mydns.jp/tech/20090521001.html
http://mulchman.org/blog/?p=21

デバッグツール

友人からこんなのあるよって教えてもらったのでメモメモ

Valgrind

仮想化ソフト一覧 と 管理ソフト一覧

役に立ちそうなのでメモメモ

仮想化ソフト一覧
http://virt.kernelnewbies.org/TechComparison

管理ソフト一覧(KVM用)
http://www.linux-kvm.org/page/Management_Tools

ubuntu 仮想化 ことはじめ

ubuntu 9.10 serverをインストールできたので
こいつをホストとして仮想化してやろうと思う。

今のところkvmなのは決定で、でも今後もしかするとsparc環境を使う可能性もあるので
QEMUも入れとく。


sudo apt-get install kvm qemu-kvm qemu-kvm-extras
   kqemu-common kqemu-source



まずはこの辺で勉強
https://help.ubuntu.com/community/KVM
http://doc.ubuntu.com/ubuntu/serverguide/C/libvirt.html
http://help.ubuntu.com/9.10/serverguide/C/jeos-and-vmbuilder.html



とりあえずkvmコマンド直叩きで動かしてみる。
HDDなしでCDROMブートで動くか確認。動作画面はVNCで接続する。


sudo kvm -cdrom /isoimage/ubuntu-9.10-desktop-i386.iso 
  -boot d -m 512 -vnc 0.0.0.0:0 -k ja


すんなり動く。

こんどはツールで試す。

これに従いvirt-installコマンドでゲストを作成してみる。
これも動く。

続いて・・・
これに従いvmbuilderコマンドでゲストを作成してみる。
これも動く。

これらは便利なんだが、勝手にゲストが作られるのも不安なので
結局ゲストを定義するXMLファイルを自分で作成して
virshコマンドからdefineで読み込む方法を採用した。

XMLの定義はこちら


ちょっと気になったのはvmbuilderをインストールする際、
apt-get install python-vm-builderすると
postfixまでインストールしてしまう。
これは勘弁願いたいなぁ


それと
virt-installとvmbuilderを試して気づいたんだが、
生成されるMACアドレスのOUIが異なる。

54:52:00:xx:xx:xx と
52:54:00:xx:xx:xx だ。

ネットで調べてみても両方が混在しているようで、どちらが正しいのかわからない。
IEEEにはどちらも登録されてない。

私の常識だと、
U/L(Universal/Local)ビットがsetされてる52:54:00:xx:xx:xxの方が無難だと思うのだが
どういうことなんでしょ?
既成事実として両方獲得してしまおうというこのなのかしらん?

ubuntu本家ドキュメント

今後、調べものをするにあたってドキュメントへのリンクをメモメモ

https://help.ubuntu.com/9.10/serverguide/C/index.html

http://manpages.ubuntu.com/

Fake RAIDにubuntuインストール、、、でも失敗

新しいPCではRAID1にしたかったのだが、これがハマッタ。
ちょっと楽観的すぎた。

RAIDなんてほとんどやったことなくて
最初で最後の経験なのが5年ほど前、
仕事で組んだPCにAdaptecのRAIDカードを乗せて
RAID5にしてWindows server 2003を入れたことだけ。

OSのインストールの際にドライバーを入れてやればすんなり成功した。
その経験から単純に、RAIDはOSから見れば
1つのHDDなんだって思ってたら違うんですな。


今回の環境ではintel P55チップに載ってるSATA RAID機能を使うのだが
Linuxから見ると、素のHDDが/dev/sdaと/dev/sdbとして見えてる。
それを、/deb/mapper/isw__aabbccdd_Volume0として
linuxのdmraidが見なすってことみたい。

そんで、この中途半端なRAID機能をFake RAIDと呼んでる。

LVMを使ってSoftware RAIDにするってのは知ってたけど・・・

adaptecのような高級なのがHardware RAIDで
マザーボードに載ってるような安っぽいのがFake RAIDで
ソフトでやるのがSoftware RAIDと。

いろいろありますなー


そんでこのFake RAIDでubuntu 9.10 serverをインストールしようとしたのだが
ブートローダのインストールのところで失敗する。
GRUBもLILOもインストールできない。

ext4でフォーマットしてkernelやらのパッケージをHDDに書き込めているようなので
RAIDとしては動いているようだが・・・?

仕事で使うのが前提なので、
こんな些細なことで時間とられるわけにもいかずここで断念。

RAIDはやめて単なる2台のHDDとして運用することに。
これだと何の問題も無くインストールできた。

はぁ~
adaptec買うべきだったかなー


一応、そんとき調べた先のリンクをメモメモ
https://help.ubuntu.com/community/FakeRaidHowto
http://ubuntuforums.org/showthread.php?t=721825
http://wiki.debian.org/DebianInstaller/SataRaid
http://ubuntuforums.org/showthread.php?t=1277552
http://ubuntuforums.org/archive/index.php/t-111090.html
http://d.hatena.ne.jp/gmaxlab/20080602/1212387298
http://bbossola.wordpress.com/2008/03/07/dmraid-on-ubuntu-with-sata-fakeraid/
http://www.hinet.mydns.jp/tdiary/?date=20080112
http://slashdot.jp/~ribbon/journal/425657
http://myhome.cururu.jp/maniac_linux/blog/article/81001468520
http://sourceforge.jp/magazine/05/03/17/0923219
http://affilie.cocolog-nifty.com/blog/2010/03/fedora-12-dmrai.html

新しくPCを調達

会社の金でPCを買ってもいいとの事なので、1台自作PCを買うことにした。
と言っても、自分で組むのは面倒くさいのでお店にやってもらう。

今回の目的は、Linux(ubuntu)サーバとして組み込み開発で使うmake環境を用意すること。
また、複数の開発環境を用意できるようにするためにkvmかqemuで仮想化する。


ということでCPUはcore i7 860。
ハイパースレッドありだからOSからは8コアに見える。
core i5より仮想化したとき性能があればいいなー(実際のとこどうなのかは不明)

メモリは4GBのモジュールは高いので、2GB x 4枚とする。

サーバなので一応HDDをRAID1にする。
RAIDはマザーボード(intel P55チップ)の機能のものにする。

他の部品は適当に。ただし電源はそれなりのものにしたい。


という計画で日本橋にでかけて、たまたま入った大阪faithさんで購入。
なんでこの店なのかは特に理由も無く。

店の人に話を聞きながら以下の構成に決定。
cpu: Intel Core-i7 860 2.8GHz
board: ASUS P7P55-M
mem: PSD34G1333KH x 2 (2GB 2枚セットが2つで計8GB)
hdd: SEAGATE ST31500541AS (1.5TB 5900rpm 32MB SATA300) x 2
power:ENERMAX EMD525AWT-II
他:適当

組立工賃+送料込みで約12万円となりました。
当初は10万円前後かと思ってたから意外とかかったなぁ


組むのに1~2週間って言われて待ってると
何かトラブルがあったらしく、相性の問題でDVDドライブが認識しないとかで
マザーボードが変更になった。
新しいのはGIGABYTE GA-P55M-UD2
組み立て代行しててよかった・・・?

価格.comではASUSの方がGIGABYTEより高い?
まぁー自分でトラブル解決する手間を考えたら

2000円くらいだし気にしない気にしない。

そんなこんなで届いたPCは快調に動いてる。
音もそんな気にならないしいい感じ。


失敗したのは、適当に選んで買った1000円の日本語キーボード。
サーバだからやっぱし英語キーボードの方がよかった。

Ubuntu 9.10 Server入れるためにいろいろやるんだけど
記号(; : / \)なんかが入力しずらい。

今度から気をつけよう。


それと、Intel CPUに暗号用の命令AES-NIが追加されるらしい。
ちと興味ある機能だ。
Linuxのkernelは既に対応してるそうだし。

それまで待てればいいんだけど、
今期予算でって話だし、今すぐ仕事で使いたいからしゃーないね。