s3cmdを使う。

Ubuntu 10.04.2 でs3cmdを使うます。10.10じゃない理由は、AWSUbuntuが10.04だからです。

sudo apt-get -y install s3cmd

s3cmdな理由は、id:shot6s3fsを使っていたからです。


Access KeyとSecret Keyをゲトしておきます。そうしておいて、

s3cmd --configure
s3cmd mb s3://mybacket
touch test.txt
s3cmd put test.txt s3://mybacket
s3cmd put test.txt s3://mybacket/test.txt
s3cmd ls s3://mybacket
mkdir mylocaldir
s3cmd sync s3://mybacket ./mylocaldir
  • バケットの中にあるファイルを削除します。
s3cmd del s3://mybacket/test.txt
  • バケットを削除します。
    • バケットの中身は空っぽにしておかないと消せないので注意。
s3cmd rb s3://mybacket


バケットの中から一番下のファイルを取得する。

LATEST_BK=$(s3cmd ls s3://sinsai-db-backup | cut -f7 -d' ' | tail -1)
s3cmd get $LATEST_BK ./output

コマンドラインで処理するなら、s3cmdサイコーです。

IPv6アドレスをより妥当な正規表現でマッチする。

と言うサイトがあります。IPv6アドレスとして妥当かチェックしてくれる上に、RFC5952に則った表記を教えてくれます。


ここでは正規表現によってIPv6アドレスとして正しいか評価しています。
それは、以下のような正規表現です。

  • IPv6アドレスをマッチする。
    • 圧縮済みIPv6アドレスでもマッチする
    • IPv4アドレスが含まれていてもマッチする
    • リンクローカルアドレスを識別する為のインターフェース名が含まれていてもマッチする
((([0-9a-f]{1,4}:){7}([0-9a-f]{1,4}|:))|(([0-9a-f]{1,4}:){6}(:[0-9a-f]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9a-f]{1,4}:){5}(((:[0-9a-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9a-f]{1,4}:){4}(((:[0-9a-f]{1,4}){1,3})|((:[0-9a-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9a-f]{1,4}:){3}(((:[0-9a-f]{1,4}){1,4})|((:[0-9a-f]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9a-f]{1,4}:){2}(((:[0-9a-f]{1,4}){1,5})|((:[0-9a-f]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9a-f]{1,4}:){1}(((:[0-9a-f]{1,4}){1,6})|((:[0-9a-f]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(:(((:[0-9a-f]{1,4}){1,7})|((:[0-9a-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(%.+)?\s*$

何か凄い量ですね。以下、理解し易くする為にフォーマットしてみました。

続きを読む

IPv6Addressを正規表現でマッチする。

より正しい正規表現を別なエントリとして記述しました。

以下の内容は、僕が自力で頑張った為、正規表現として不適切な部分があります。

続きを読む

intポインタをPythonで配列の様に扱う。

こんな感じ。だけど、微妙に釈然としない感じ。
コレくらいは、標準搭載されてても良いんじゃないのかなぁ。
ちなみに、このコードだとデータの書きこみは出来ませぬ。

cdef class IntArrayIterator:
    cdef int index
    cdef int length
    cdef array

    def __init__(self, array):
        self.index = 0
        self.length = len(array)
        self.array = array

    def __next__(self):
        if(self.index < self.length):
            pos = self.index
            self.index = self.index + 1
            return self.array[pos]
        raise StopIteration

    def __iter__(self):
        return self

cdef class IntArray:
    cdef int length
    cdef int *data
    
    #http://www.cosc.canterbury.ac.nz/greg.ewing/python/Pyrex/version/Doc/Manual/special_methods.html
    def __len__(self):
        return self.length
    
    def __iter__(self):                
        return IntArrayIterator(self) 
    
    cdef int getitem(self, int x):
        if(x < self.length):
            return self.data[x]
        raise IndexError, "index out of range %s" % x
    
    def __getitem__(self, int x):
        return self.getitem(x)
      
    def __getslice__(self,int f,int t):
        if(f < t and f < self.length and t < self.length):
            a = []
            for i in range(t-f):
                c = f + i
                a.append(self.getitem(c))
            return a
        
        raise IndexError, "index out of range [%(from)s:%(to)s]" % {"from":f,"to":t}
    
    def __str__(self):
        cdef r = []
        cdef int i = 0
        r.append("[")
        
        for i in range(self.length):
            r.append(str(self.getitem(i)))
            if(i + 1 < self.length):
                r.append(",")

        r.append("]")
        return "".join(r)

Cythonを32bit Windowsで使う

うっかりCのライブラリが世の中リリースされてたりされてなかったりする訳ですけども、
プロトタイプ的な何かを作ろうと思った時に、ヘタレはCで頑張ったり出来なかったりするのですね、主に僕とか。
いや、Cが全然書けないって言うつもりは無いけど、漢の子ならゴリゴリ書けるだろJKとか言われても困る訳で。
と言う訳で、Pythonとか使っちゃうのです。実は僕、Pythonの事良く知らないんだけどもさ。


本日のお題は、CythonをWindowsXPの32bit版かつVisual Studio 2008 Express上で使ってみますよ、と言う話。

続きを読む

java.util.ServiceLoaderを使う。

DIコンテナやらOSGiやら使う程でもないけど、最低限の拡張性はとりあえず担保しておきたいので使う感じなのだけど、コアAPIに含まれているjava.util.ServiceLoaderは本当に使い辛い。
というか、そのままでは使えないのでユーティリティ的でいつも似てるけどちょっと違うコードをそこら中に書き散らす訳で。

続きを読む