ubuntuあれもこれもメモ

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