2011年12月24日土曜日

自炊?

書籍電子化:代行は「違法」 「自炊」業者を提訴 浅田次郎さんら7人、差し止め求め
この著者や出版社は電子出版しようと努力しているのだろうか?

私は、本は大好きだが、
1.引越しのたびに泣く泣く 蔵書を少しずつでも処分している。
2.あと何年生きれて、死んだあとその後蔵書を処分してもらうこと。
この2つのことを考えて数年前から本を買うのをやめてしまった。

君たちは、 電子出版しようと努力して無いのだったら、自ら顧客を無くしてしまっていることを自覚した方がいい。


追記:
ところで、浅田次郎って誰?

郵パックがトホホ

郵パックで送ろうと思って、ちょうど手元に送り状があった。
それに書いて郵便局に持って行くと、送り状が古くてバーコードが登録できないから新しいのに書きなおせだと。

そんなのだから赤字垂れ流しになるんじゃ。
ほんとどこ向いて 仕事しているんじゃ!
きっと新規システムを導入するとき、「ケッチって」古い番号を捨てたのだろう。
業者は「そんなことしたら大変なことにになりますよ」と指摘しても強行したに違いない。

もう二度と利用しない。

追記:
郵パックって安いというイメージがあったけれど今確認するとヤマトと50円しか変わらない。拠点の遠さ不愉快な思いをすることを考えたら、やっぱり。

もう二度と利用しない。

と言っていたら、「読経」が聞こえてきた。

まあ、郵便なんてなくなっても困らないし。郵貯と簡保は国債とご臨終になるだろうし。
もともと、役人と労組が食い物にしてきたのだし、清算してもいいんじゃない。「チーン!」

追記1:
海の向こうの方が早そうだ。
米郵政公社が250の集配施設を閉鎖、3万5千人削減へ

追記2:
12月26日午前中に届いたはずの荷物の「お届けしました葉書」昨日の30日についた。わざわざ北海道まで転送して投函したのだろうか?4日もかかるなんて。

GL220の受信データーを加工(struct編)

ここではint(char.encode('hex'), 16)を使っていたが、電圧や湿度、熱電対の温度に変換して出したい。

import struct

buffer_list = struct.unpack('!23h', buffer)
でおしまい。
structこりゃあ便利だ。Format Charactersを指定することで変換できちゃう。
!:network (= big-endian)
h:short 2byte
23:23回繰り返し(=46byte)
つまりbig-endianのsigned-short, 23 times

2011年12月22日木曜日

GL220の受信データー

忘れないようにGL220は10CHだから':MEAS:OUTP:ONE?'コマンドでの受信データーは46byteだからヘッダーは'#6000046 '

データ受信関連仕様書(GL220_820).pdfの4ページ

例) 端子台20CH、 内部バッファ内データ2点の場合

受信データ, 説明
#6******, ヘッダ(ASCII): #6は接頭文字で固定。次の6文字でその後の******で受信されるバイト数を表します。
 1:CH1アナログデータ, 1chデータのバイナリ(2byte)
 2:CH2アナログデータ, 2chデータのバイナリ(2byte)
   :(中略), : (中略)
10:CH10アナログデータ, 10chデータのバイナリ(2byte)
CH11アナログデータ, 11chデータのバイナリ(2byte)
:(中略), : (中略)
CH20アナログデータ, 20chデータのバイナリ(2byte)
11:パルス1データ1, パルス1データ上位2byte, パルスデータは上位2byte、下位2byteを合計した4byte(32bit)データ
12:パルス1データ2, パルス1データ下位2byte
13:パルス2データ1, パルス2データ上位2byte
14:パルス2データ2, パルス2データ下位2byte
15:パルス3データ1, パルス3データ上位2byte
16:パルス3データ2, パルス3データ下位2byte
17:パルス4データ1, パルス4データ上位2byte
18:パルス4データ2, パルス4データ下位2byte
19:ロジックデータ, ロジックデータのバイナリ(2byte)
20:アラームデータ1, CH1~CH10のアラームデータ(2byte)
アラームデータ2, CH11~CH20のアラームデータ(2byte)
21:アラームデータ(ロジック/パルス), ロジックとパルスのアラームデータ(2Byte)
22:アラーム出力データ, アラーム出力データ(2Byte)
23:ステータス, データの状態を表す情報(2byte), CH1アナログデータ

23×2byte=46byte

アラームデータ2, CH11~CH20のアラームデータ(2byte)  の部分に気が付かずに48byteになるがなと唸っていたぞ。

2011年12月21日水曜日

create_string_bufferからデーターリスト

create_string_bufferでデーター(data)が帰ってきているとき扱いやすいように

print repr(data.raw)
data_list = [int(char.encode('hex'), 16) for char in data]
print data_list

ふふふ、内包表記じゃ

2011年12月20日火曜日

pythonでgraphtec GL220

ctypes初めて使った。
CDからドライバーをインストールして。gtcusbr.dllをお側に。

        Open device
        HANDLE __stdcall GtcUSBr_OpenDevice(void);

        Close device
        BOOL __stdcall GtcUSBr_CloseDevice(
            HANDLE hDev        # Handle to the USB to be I/O
        );

        Read (Block mode)
        BOOL __stdcall GtcUSBr_ReadDevice(
            HANDLE hDev,                    # Handle to the USB to be read
            LPVOID lpBuffer,                # Pointer to the buffer that receives the data read from the USB
            DWORD nNumberOfBytesToRead,        # Number of bytes to read
            LPDWORD lpNumberOfBytesRead,    # Pointer to the number of bytes read
            DWORD dwTimeOut                    # TimeOut(ms)
        );

        Write (Block mode)
        BOOL __stdcall GtcUSBr_WriteDevice(
            HANDLE hDev,                    # Handle to the USB to be write
            LPVOID lpBuffer,                # Pointer to the buffer that sends the data write to the USB
            DWORD nNumberOfBytesToWrite,    # Number of bytes to write
            LPDWORD lpNumberOfBytesWrite,   # Pointer to the number of bytes write
            DWORD dwTimeOut                    # TimeOut(ms)
        );
あたりを使う。

橋渡しは
LPVOID        ctypes.create_string_buffer()
DWORD       ctypes.c_ulong()
LPDWORD  ctypes.pointer(ctypes.c_ulong())

読むときはクエリーの時はASCIIが帰ってくる。1文字づつ読もう。
フリーランニングで、:MEAS:OUTP:ONE?で瞬時データを読むときは、
まずASCIIで8byteヘッダーを読んで「#6******」アスタリスクの部分をintに変えて続きのdataを読む。


どうでもいいけど。その1
マニュアルGL220 GL820 インターフェイスコマンド(GL220_820 IF_Command_Japanese.pdf)12ページのバッファ構成の欄の「は:MEAS:OUTO:STAT?で確認できます。」はバグ。正しくは「は:MEAS:OUTP:STAT?で確認できます。」

どうでもいいけど。その2
HPの「お問い合わせ」でくるメールの
###### 引用初め
本メールの配信に身に覚えのない場合、お手数ですが以下まで
ご連絡お願いいたします。

webmaster@grephtec.co.jp
###### 引用終わり
にはワロタ。

2011年12月6日火曜日

ubuntuでサービス一覧

サービス一覧
service --status-all

インストール済みパッケージ
dpkg --get-selections

2011年11月25日金曜日

extundelete

削除したファイルを復活させるユーティリティだ。
ここここに詳しくのっている。

でもついやっちまうんだよな。
rm -rf

昨日、間違えて写真を削除してしまったが復活出来た。
ありがたや、ありがたや。

sudo apt-get install extundelete
でインストール。

2011年11月15日火曜日

独自ドメインをvaluedomainからstardomainへ移管

なんか
1)valuedomainがいっちょかみに買われたらしい。
2)stardomainのほうが少し安い?
3)トップドメインはstardomainが直ぶら下がり。(少し安心かな?)
4)おまけで10GBのサーバーがついてくる。(bk倉庫に使おう。)

て言うことで手持ちドメイン全部移管してみました。
1月以上使っているが問題なし。

2011年11月5日土曜日

django-1.3にdjango-cms-2.2をインストールする時

django-1.3にdjango-cms-2.2をインストールするとき、docのチュートリアルに沿って行けばいいんだけれど、django-mpttのversionに注意
素で入れるとdjango-mptt-0.5.0が 入ってしまうがこれが曲者。0.5.0が入っていたらuninstallしてここから0.4.2を取ってきてインストールしよう。
tagsを押すとold-releaseが出てくる。

と書いていたら、4時間前に craigdsさんがパッチを当てたみたい。0.5.1で今は動いています。
pip install -U django-mpttでアップグレードしよう。

2011年11月1日火曜日

ファイル名 rename

ファイル名Hoge_R.xlsを人に渡して修正をお願いした時 Hoge_R-1.xlsやHoge_Rev.xlsなど修正済みという事でファイル名の後ろに何かくっついて帰ってくることは多い。これを元の名前に返すには。
(gitでファイルを管理しているためファイル名が変更されているのはヤダ)

rename -v 's/^(.*?)_R.*(\.xls)/$1_R$2/' ./*.xls

-nオプションでdry-run、変換を確認できる。

_Rはなんでもいい、固定のモノにしておくといい。つまり、ここまでが最初のファイル名の最後マークだと思ってくれ。これは、trunkが単にグループ名だとすると正規表現がややこしくなるため。

正規表現
^(.*?)_Rで行頭から渡す前のファイル名までlasy-matching
.*で追加部分
(\.xls)で拡張子

2011年10月22日土曜日

djangoでmail送信

サーバーが吸い込んでいるのに送信されないとか、届いたメールの送信元がおかしいときはsettings.pyの
DEFAULT_FROM_EMAIL
を疑おう。

2011年10月21日金曜日

pythonでcoreserverからmail送信

chihiroさんのこのページのほぼ丸写し。
chihiroさんありがとうございます。
# -*- coding: utf-8 -*-

import smtplib
from email.MIMEText import MIMEText
from email.Utils import formatdate
from pit import Pit

def create_message(from_addr, to_addr, subject, body):
    msg = MIMEText(body)
    msg['Subject'] = subject
    msg['From'] = from_addr
    msg['To'] = to_addr
    msg['Date'] = formatdate()
    return msg

def send_via_SSL(from_addr, to_addr, msg, email_account):
    print from_addr + ' to ' + to_addr
    mail_pit = Pit.get(email_account)
    s = smtplib.SMTP_SSL(mail_pit['servername'], 465) #
    s.ehlo()
    s.login(mail_pit['username'], mail_pit['password'])
    s.sendmail(from_addr, [to_addr], msg.as_string())
    s.close()

if __name__ == '__main__':
    from_addr = 'hoge@hogehoge.jp'
    to_addr = 'hoge@hogehoge.com'
    email_account = 'hoge@hogehoge.jp'
    msg = create_message(from_addr, to_addr, 'test subject', from_addr + ' to ' + to_addr + ' using ' + email_account + ' with SSL')
    send_via_SSL(from_addr, to_addr, msg, email_account)
 違いは赤い字のSMTP_SSLあたり

2011年10月12日水曜日

xlrdで背景色(やりかけ)

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

import xlrd

if __name__ == '__main__':
    doStrip = True
    wb = xlrd.open_workbook(U'./' + u'test.xls', formatting_info=True)
    sheetCount = wb.nsheets
    workSheets = []
    for num in range(sheetCount):
        sheet = wb.sheets()[num]
        rows =[]
        print u'row, col, value, attr'
        for row in range(sheet.nrows):
            cols = []
            for col in range(sheet.ncols):
                value = int(sheet.cell(row,col).value)
                attr = sheet.cell_xf_index(row, col)
                print row, col, value, attr

                cols.append(value)
            rows.append(cols)
        workSheets.append((sheet.name, rows))

row, col, value, attr
0 0 10 15
0 1 21 15
1 0 11 21
1 1 22 15
2 0 12 15
2 1 23 15
3 0 13 15
3 1 24 21
4 0 14 15
4 1 25 15
5 0 15 21
5 1 26 15
6 0 16 15
6 1 27 15
7 0 17 15
7 1 28 15
8 0 18 15
8 1 29 15
9 0 19 15
9 1 30 15

2011年10月9日日曜日

あまりにもアホなことして Ubuntuがcoreだけになってしまったところからの復旧。

mountall: Disconnected from plymouthが出て止まる。
[ctrl] + [alt] + [F1] でtty1にログイン
sudo apt-get updateでネットワークにつながっているか確認。
(ネットワークにつながっていれば、sudo apt-get ubuntu-desktop ubuntu-desktop-ja)

つながっていなかったら、どっからインストールCDを取ってくるかISOイメージを取ってきて突っ込む。
ISOイメージなら、USBスティックをマウントして

sudo mount -t iso9660 -o loop /path/to/ISO /media/cdrom

sudo apt-get install network-managerでnetwork-managerのインストールを試みる。
当然無いパッケージがエラーとなって出てくるから、それらをCDもしくはISOから強引に
dpkg -i /path/to/package.deb
でインストール。
sudo apt-get install network-managerでエラーが出なくなったら再起動。
また、[ctrl] + [alt] + [F1] でログイン
sudo apt-get update
sudo apt-get ubuntu-desktop ubuntu-desktop-ja

でいける。

何がこんな目に私をあわしたかは秘密

2011年9月28日水曜日

今回もamazon遅いかな?

久しぶりにamazonに発注してしまった。
書籍、現物あり。
2時すぎにはコンビニからの入金が確認できたとさ。

さあ、いつ来ることやら。
ワクワクドキドキ。


これで遅ければ、ジュクドウさん、まだまだチャンスありまっせ。


P.S. 9/30.13時についた。
翌々日ですた。

2011年9月10日土曜日

formでselectを書き換え禁止

class Metaでwidgetsに適切なものを指定して、そのwidgetsが生成するhtml tagの属性をattrsに辞書で渡す。というわけやね。

class Hoge(ModelForm):

    class Meta:
        model = Foo
        widgets = {'choice': forms.Select(attrs={'disabled': True,}),}
True要らないけれど、attrsが辞書なので。

追記:
form = Hoge()

form.fields['choice'].widget.attrs['disabled'] = True
でもOK

2011年9月6日火曜日

permission name取得

auth->groupでもいいけれど

python shell
>>> from django.contrib.auth.models import Permission
>>> for item in Permission.objects.all():
...   print item.name
...
Can add log entry
...

て思っていたけれど。@permission_requiredが引くのはcodenameですた。
×...   print item.name
○ ...   print item.codename

それと、 permission_requiredで引けるのは、1個だけ。
でも複数のがほしいよな。add, change, delete単体でpermission与えるのより、全部与えるほうが多いような気がする。
えっ。作れって、そうさせて頂きます。

と思ったら。似たようなのがここにあった。

ということで、
#-*- coding:utf-8 -*-

from django.contrib.auth.decorators import user_passes_test

def require_all_permissions(perm_list):
    """
    A decorator which checks user has all of the given permissions.
    """
    def test_func(user):
        return user.has_perms(perm_list) 
    return user_passes_test(test_func)
 どうでしょう。

django 初期のパーミッション

忘れないように初期のパーミッション
admin | log entry | Can add log entry
admin | log entry | Can change log entry
admin | log entry | Can delete log entry
auth | group | Can add group
auth | group | Can change group
auth | group | Can delete group
auth | message | Can add message
auth | message | Can change message
auth | message | Can delete message
auth | permission | Can add permission
auth | permission | Can change permission
auth | permission | Can delete permission
auth | user | Can add user
auth | user | Can change user
auth | user | Can delete user
contenttypes | content type | Can add content type
contenttypes | content type | Can change content type
contenttypes | content type | Can delete content type
sessions | session | Can add session
sessions | session | Can change session
sessions | session | Can delete session
sites | site | Can add site
sites | site | Can change site
sites | site | Can delete site

2011年9月5日月曜日

suckerfishでdropdownメニュー

ここから。
肝は、hoverしていないulを明後日の方に配置するということだけ。
hoverしたらulをもとの位置に戻す。
横メニューなら
<html>
    <head>
        <title>horizontal nav</title>
        <meta charset="utf-8">
        <link rel=stylesheet type="text/css" href="horizontalMenu.css">
    </head>
    <body>
        <div id="menu">
            <ul>
                <li><a href="">test11</a></li>
                <li>second
                    <ul>
                        <li><a href="">test21</a></li>
                        <li><a href="">test22</a></li>
                        <li>third
                            <ul>
                                <li><a href="">test31</a></li>
                                <li><a href="">test32</a></li>
                                <li><a href="">test33</a></li>
                            </ul>
                        </li>
                        <li><a href="">test23</a></li>
                    </ul>
                </li>
                <li><a href="">test12</a></li>
                <li><a href="">test13</a></li>
            </ul>
        </div>
    </body>
</html>
 に対して
#menu ul{
    margin: 0px;
    padding: 0px;
    list-style: none;
    float: left;
}

#menu li{
    margin: 0px;
    padding: 0px;
    border: 1px solid;
    display: block;
    color: black;
    background-color: white;
    display: block;
}

#menu li:hover{
    color: white;
    background-color: black;
}

#menu > ul > li{
    float: left;
}

#menu ul > li > ul{
    position: absolute;
    left: -999em;
}

#menu ul > li:hover > ul{
    left: auto;
}

#menu ul > li > ul > li{
    width: 10em;
}

#menu ul > li > ul > li:hover > ul{
    margin-top: -1.1em;
    margin-left: 10em;
}
もしくは
#menu ul{
    margin: 0px;
    padding: 0px;
    list-style: none;
    float: left;
}

#menu li{
    margin: 0px;
    padding: 0px;
    border: 1px solid;
    display: block;
    color: black;
    background-color: white;
    display: block;
}

#menu li:hover{
    color: white;
    background-color: black;
}

#menu > ul > li{
    float: left;
}

#menu ul > li > ul{
    position: absolute;
    display: none;
}

#menu ul > li:hover > ul{
    display: block;
}

#menu ul > li > ul > li{
    width: 10em;
}

#menu ul > li > ul > li:hover > ul{
    margin-top: -1.1em;
    margin-left: 10em;
}
 垂直メニューなら

 #menu ul{
    margin: 0px;
    padding: 0px;
    width: 10em;
    list-style: none;
    float: left;
}

#menu li{
    margin: 0px;
    padding: 0px;
    width: 10em;
    border: 1px solid;
    position: relative;
    float: left;
    color: black;
    background-color: white;
    display: block;
}

#menu li:hover{
    color: white;
    background-color: black;
}

#menu li > ul{
    margin-top: -1.3em;
    margin-left: 10em;
    position: absolute;
    left: -999em;
}

#menu li:hover > ul{
    left: auto;
}
もしくは
#menu ul{
    margin: 0px;
    padding: 0px;
    width: 10em;
    list-style: none;
    float: left;
}

#menu li{
    margin: 0px;
    padding: 0px;
    width: 10em;
    border: 1px solid;
    position: relative;
    float: left;
    color: black;
    background-color: white;
    display: block;
}

#menu li:hover{
    color: white;
    background-color: black;
}

#menu li > ul{
    margin-top: -1.3em;
    margin-left: 10em;
    position: absolute;
    display: none;
}

#menu li:hover > ul{
    display: block;
}

2011年9月3日土曜日

vtk 5.8.0

出ています。
gitでcloneできるようになった。ここ

branchはtagで
最新releaseは、
git checkout v5.8.0
で。

ところで、CDashのアイコンってgoogle chromeのアイコンに似ていない?
どうでもいいけどね。

2011年8月11日木曜日

insert_at with commit arg @ django-cms 2.2 b1

やられた。
django-cms 2.2 b1から従来のdjango-cms内のmpttからdjango-mpttに変更になっている。

ここのDjango-cmsでpageをスクリプトで挿入する方法が"commit=True"から"save=True"に変更になっている。

2011年8月4日木曜日

AdminSiteのソースを覗く

adminサイトをfancyにカスタマイズしたいので、とりあえずdjango.contrib.adminのsites.pyを覗いてみた。

class AdminSiteがデフォルトではdjango.contrib.admin.siteとしてインスタンス化される。

    AdminSite.index_template
    AdminSite.app_index_template
    AdminSite.login_template
    AdminSite.logout_template
    AdminSite.password_change_template
    AdminSite.password_change_done_template
にテンプレートをセット

modelのadminは
self._registry = {} # model_class class -> admin_class instance
に格納
  AdminSite.index
が全体のモデルの一覧を表示
  AdminSite.app_index
が各モデルを表示
documentsによるとこれを継承したクラスをつくれとのこと。

admin template customize

置き場所は
TEMPLATE_DIRS
     │
     ├admin
     │  │
           ├app_name
           │   │
           │   ├model_name
           │   │    │
           │   │    ├customized_template_for_specific_models
           │   │
           │   ├customized_template_for_all_models

2011年7月27日水曜日

BeautifulSoupのソースを読んでみた。 Read Write

上から順に舐めていくときは、findNext(), 下からならfindPrevious(),
同一レベルで順に舐めていくときは、findNextSibling(), 下からならfindPreviousSibling(),
複数形になるとそこを起点に全部

BeautifulSoupで読むのに必須なのはTagクラス。
でTagクラスには
findAll(self, name=None, attrs={}, recursive=True, text=None, limit=None, **kwargs)
基底クラスのPageElementには

findNext(self, name=None, attrs={}, text=None, **kwargs)
findAllNext(self, name=None, attrs={}, text=None, limit=None, **kwargs)
findPrevious(self, name=None, attrs={}, text=None, **kwargs)
findAllPrevious(self, name=None, attrs={}, text=None, limit=None, **kwargs)

findParent(self, name=None, attrs={}, **kwargs)
findParents(self, name=None, attrs={}, limit=None, **kwargs)

findNextSibling(self, name=None, attrs={}, text=None, **kwargs)
findNextSiblings(self, name=None, attrs={}, text=None, limit=None, **kwargs)
findPreviousSibling(self, name=None, attrs={}, text=None, **kwargs)
findPreviousSiblings(self, name=None, attrs={}, text=None, limit=None, **kwargs)


で、肝になる関数が
_findOne(self, method, name, attrs, text, **kwargs)
_findAll(self, name, attrs, text, limit, generator, **kwargs)
_findOneが1個_findAllが複数探してきてくれる。_findAllのgeneratorにnextGenerator, previousGenerator, nextSiblingGenerator, previousSiblingGeneratorを渡すことで舐める方向を決めている。


<html>
    <head>
        <title>
            Page title
        </title>
    </head>
    <body>
        <p id="firstpara" align="center">
            This is paragraph one.
        </p>
        <p id="secondpara" align="blah">
            This is paragraph two.
        </p>
        <div>
            first level
            <div>
                second level
                <div>
                    third level
                </div>
            </div>
        </div>
    </body>
</html>
 example
#!/usr/bin/env python
#-*- coding:utf-8 -*-

from BeautifulSoup import BeautifulSoup

fi = open(u'test.html', u'r')
soup = BeautifulSoup(''.join(fi.read()))

print u'### document'
print u'tag name: ', soup.name

html = soup.html
print u'### top html'
print u'tag name: ', html.name

# findNext
head = html.findNext()
print u'### findNext @ html'
print u'tag name: ', head.name

title = head.findNext()
print u'### findNext @ head'
print u'tag name: ', title.name

body = title.findNext()
print u'### findNext @ title'
print u'tag name: ', body.name

# findPrevious
current = body.findPrevious()
print u'### findPrevious @ body'
print u'tag name: ', current.name

current = current.findPrevious()
print u'### findPrevious @ title'
print u'tag name: ', current.name

current = current.findPrevious()
print u'### findPrevious @ head'
print u'tag name: ', current.name

# findAllNext
current = body.findAllNext()
print u'### findAllNext @ body'
for item in current:
    print u'tag name: ', item.name

# findAllPrevious
current = body.findAllPrevious()
print u'### findAllPrevious @ body'
for item in current:
    print u'tag name: ', item.name

# findParent
current = body.findParent()
print u'### findParent @ body'
print u'tag name: ', current.name

current = title.findParent()
print u'### findParent @ title'
print u'tag name: ', current.name

# findParents
current = body.findParents()
print u'### findParents @ title'
print u'from tag name: ', body.name
for item in current:
    print u'tag name: ', item.name

bottom = body.div.div.div
print u'### findParents @ bottom of div'
print u'from tag name: ', bottom.name
current = bottom.findParents()
for item in current:
    print u'tag name: ', item.name

# findNextSibling
p = body.findNext()
print u'### findNextSibling @ body.p'
print u'from tag name: ', p.name
print p.text
current = p.findNextSibling()
print u'tag name: ', current.name
print current.text

# findNextSiblings
p = body.findNext()
print u'### findNextSiblings @ body.p'
print u'from tag name: ', p.name
print p.text
current = p.findNextSiblings()
print current
for item in current:
    print u'tag name: ', item.name

# findPreviousSibling
current = body.div
print u'### findPreviousSibling @ body.div'
print u'from tag name: ', current.name
current = current.findPreviousSibling()
print u'tag name: ', current.name
print current.text

# findPreviousSiblings
current = body.div
print u'### findPreviousSiblings @ body.div'
print u'from tag name: ', current.name
current = current.findPreviousSiblings()
print current
for item in current:
    print u'tag name: ', item.name
    print u'tag text: ', item.text

2011年7月26日火曜日

UQ Wimaxが遅い

先日、Try WiMAX レンタルで借りてみた。
朝や夜間はそこそこの速度が出るのだが昼間はダメ、比較にならないほど遅くなる。ちょっとしたファイルのダウンロードやアップロードでもウンともスンとも言わなくなるし、webサイトはリロードを頻繁に繰り返さないと取ってこない。
tracerouteで調べたら、Wimax, KDDIの内部で1,000msec以上かかっているじゃああーーりませんか。朝や夜間は100msec程度。こりゃダメだ。使いもんにならない。基地局の設置ばっかり頑張っていてもナローバンド回線では。

ここの提供パターン3,4,5あたりでMVNOでやっているところなら大丈夫なのだろうか?

結論:固定回線の代替にはなりません。

追記:2chあたりでは 上記のMVNOのほうが遅いとか言っている。これより遅いのか?

2011年7月25日月曜日

Beautiful Soup tips

ここによると全ての属性を除去するには
    for tag in soup.findAll(True):
        tag.attrs = None
bradmontgomerysさんありがとう。

2011年7月5日火曜日

coreserverでgit git-receive-pack

ここによると

hoge/.git/config

uploadpack = $HOME/usr/local/git/bin/git-upload-pack
receivepack = $HOME/usr/local/git/bin/git-receive-pack
と設定するといいらしい。

Tatsuquitoさんありがとう。

P.S.
[remote "origin"]
の最後に設定しよう。

cloneは--update-packを引数で与えて、remoteにpushするときは--receive-pack
訂正
cloneは--upload-packを引数で与えて、remoteにpushするときは--receive-pack


git clone hoge@foo.coreserver.jp:/path/to/repo --upload-pack=/virtual/hoge/path/to/git-upload-pack


git remote add origin ssh://hoge@foo.coreserver.jp/virtual/hoge/path/to/repo
git push origin master --receive-pack=/virtual/hoge/path/to/git-receive-pack


メモ:ここ

2011年7月1日金曜日

しちゃだめ

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

class Obj:
    string = u''
    prop = u''

def printItem(lst):
    print u'items:'
    for item in lst:
        print item.string
        print item.prop

a = Obj()
a.string = u'A'
a.prop = u'null'

b = Obj()
b.string = u'B'
b.prop = u'null'

c = Obj()
c.string = u'C'
c.prop = u'null'

lst = [a, b, c]

printItem(lst)

for item in lst:
    if item.string == u'B':
        lst.remove(item)
        continue
    else:
        item.prop = u'_add'

printItem(lst)

items:
A
null
B
null
C
null
items:
A
_add
C
null

2011年6月23日木曜日

読者追加

こんなブログでも読者がついていて下さているので、読者ガジェットを追加した。
お役に立ってますでしょうか?

djangoでlocalとremoteを切り替える。tips

djangoで共有SSLを使っていると、remoteとlocalを切り替えるのが面倒だ。
settingsに
USE_AT_LOCAL = False
を追加して、
manage.pyに
settings.USE_AT_LOCAL = True
を追加して、
 remoteとlocalの部分をifで切り分けた。

eclipseでdebugできるぞ。

2011年6月19日日曜日

pipでbundle2

bundleで固めたものは、
pip install ./freeze.pybundle
でインストールできる。
残りはsourceからインストールした。

これを使ってpythonを2.7.1から2.7.2へアップロードしてみた。
うーん便利。複数のアップロードには有効!
リモートへfabric使ってやるということも考えられる。

2011年6月17日金曜日

pipでbundle

ここによるとpipにbundleというコマンドがあるらしい。
インストール済みのパッケージを固めてくれるらしい。
早速チェック
pip freeze -l > ./requirements.txt
pip bundle freeze.pybundle -r ./requirements.txt
を、固めだした。しかしいちいちpypiに取りに行っている。まあ固まったら楽できるからいいや。
と思っていたらエラー。なになに、ローカルでインストールしたwxWidgetsが見つからないと。そりゃそうだ。ということで削る。
固まった。。。。。 続きは後ほど。

2011年6月7日火曜日

django-cmsでTinyMCEのcustomize

settings.pyに
CMS_PLUGIN_TEXT_TINYMCE_CONFIG = {}
CMS_PLUGIN_TEXT_TINYMCE_CONFIG['theme'] = "advanced"
CMS_PLUGIN_TEXT_TINYMCE_CONFIG['theme_advanced_buttons1'] = "cut,copy,paste,|,undo,redo,removeformat,|,code,preview,cleanup,|,help,|,hr,charmap,insertdate,inserttime"
CMS_PLUGIN_TEXT_TINYMCE_CONFIG['theme_advanced_buttons2'] = "styleselect,formatselect,fontselect,fontsizeselect,|,justifyleft,justifycenter,justifyright,"
CMS_PLUGIN_TEXT_TINYMCE_CONFIG['theme_advanced_buttons3'] = "bold,italic,underline,strikethrough,sub,sup,|,forecolor,backcolor,|,blockquote ,link,unlink,anchor,image,|,bullist,numlist,|,indent,outdent,"
CMS_PLUGIN_TEXT_TINYMCE_CONFIG['theme_advanced_toolbar_location'] = "top"
CMS_PLUGIN_TEXT_TINYMCE_CONFIG['theme_advanced_toolbar_align'] = "left"
CMS_PLUGIN_TEXT_TINYMCE_CONFIG['theme_advanced_statusbar_location'] = "bottom"
CMS_PLUGIN_TEXT_TINYMCE_CONFIG['theme_advanced_resizing'] = True

cms/plugins/text/widgets/tinymce_widget.py
assert 'id' in final_attrs, "TinyMCE widget attributes must contain 'id'"
mce_config = cms.plugins.text.settings.TINYMCE_CONFIG.copy()
mce_config.update(get_language_config(self.content_language))
cms/plugins/text/settings.py
if USE_TINYMCE:
    import tinymce.settings
    TINYMCE_CONFIG = getattr(settings, 'CMS_PLUGIN_TEXT_TINYMCE_CONFIG', tinymce.settings.DEFAULT_CONFIG)
となっている。
 CMS_PLUGIN_TEXT_TINYMCE_CONFIG['theme'] = "advanced"
を入れておかないとerror

2011年6月6日月曜日

olympus DM-1

訳あってご老体を引っ張り出してきたのだがメディアにコピーしたファイルをよう見つけない。
結論として、ファームを突っ込まないとダメ?

古いCDを取り出してきてインストールし、サイトから落としたアップデータをインストールして認識するようになった。

django-cmsでTinyMCEの設定でsimpleとadvancedが一緒

plugins/text/widgets/tinymce_widget.py

line 65-66
mce_config['plugins'] = plugins
if mce_config['theme'] == "simple":
    mce_config['theme'] = "advanced"
mce_config['theme_advanced_buttons1_add_before'] = "cmsplugins,cmspluginsedit"
やられた。

ファイルの中から特定の文字列を持つファイルの検索

find . -type f -print0 | xargs -0 grep "$1" -n --binary-files=without-match
ついでに
そこから、[ファイル名:行番号]形式で重複なくファイル名の取得
awk '{ print $1 }' | sed -E 's/(.*:[0-9][0-9]*):.*$/\1/'
これをエディタで起動すると特定の行に飛んでくれる。つまり、

find . -type f -print0 | xargs -0 grep "$1" -n --binary-files=without-match | awk '{ print $1 }' | sed -E 's/(.*:[0-9][0-9]*):.*$/\1/' | xargs geany &

2011年6月5日日曜日

django-cmsでTinyMCE

INSTALLED_APPSに'tinymce',を追加。
mediaディレクトリの適当な位置にTinyMCE本体をコピー。
TINYMCE_JS_URLとTINYMCE_JS_ROOTを設定。
url.pyにurl(r'^tinymce/', include('tinymce.urls')),を追加。

2011年6月2日木曜日

djangoでdumpdata

./manage.py dumpdata --indent 2
とするとインデント付きでダンプしてくれる。

2011年5月31日火曜日

plugins template

すぐ忘れるので、メモ
find . -type d -name templates | grep plugins | sed 's/$/\/cms/' | xargs cp -rvf -t [project]/templates/

2011年5月27日金曜日

bash-completionで邪魔なスペース

ubuntu 11.04にアップグレードしたらCUIでスペースが出てbashの補完が効きませんがな。
ここによると、邪魔なスペースの発生源はacroreadのバグ。

ずいぶん苦しめられたぞ。

using sound converter from command line

ということでメモ。
GUIからだとファイルを登録した時、順序良く登録してくれない。したがって、変換時間が登録順になり、名前順にならないのがやだ。

ということで、mp3フォルダ内のファイルをwmaファイルに変換
ls ./mp3 | sort -r | sed 's/^/.\/mp3\//' | xargs soundconverter -b -m "audio/x-wav" -s .wav

encodersは/usr/bin/soundconverter:1159で確認してちょ。
sound converterのバージョンは
VERSION = "1.4.4"

ところで「ファイルを登録した時、順序良く登録してくれない。」のは何故だろう?

2011年5月24日火曜日

django-cms media folder

すぐ忘れるので、メモ
cp -rvf django/django/contrib/admin/media [project]/media/admin/
cp -rvf django-cms/cms/media [project]/media/

2011年5月19日木曜日

kdenlive使い方

本家のマニュアルはここ
Quickstart guideを見ながら編集中なので、嘘、間違いがあると指摘していただけると助かります。ー>得意な人

1)動画を読み込む。
Project->Add ClipでもOK 

2)timeline panelへ追加。
project treeからtimeline panelへドラッグアンドドロップ。

3)タイトルクリップの作成

2011年5月18日水曜日

2011年5月17日火曜日

Django password reset

NoReverseMatch: Reverse for 'yourapp.django.contrib.auth.views.password_reset_confirm' with arguments '()' and keyword argumentsとでたら、ここ

2011年4月14日木曜日

括弧抜け

cms/templates/admin/cms/page/change_form.html
52: .notfilled{
53:     color: #808080 !important;
54: }
django-cms-2.1.3

本家に投げときました。

2011年4月12日火曜日

amazonの出荷が遅い

「amazonの出荷が遅い」そのまんまですがな。
4月5日に入金済みの商品早く出荷してくれんかな。
つまらないプロモーションメール送ってくる暇があったら。

なんで遅れているかといったら、

「現在当サイトでは、震災の影響により、商品の出荷処理に通常よりもお時間をいただいております。」

だそうだ。ほんまか!
挙句の果てに

この商品は配送準備に入っているため、キャンセルや変更はできません。返品についてはこちらをご覧ください。

だそうだ。在庫があるのに配送準備に何年かかるねーん! キャンセルして他所に注文も出来やしない。

追伸:
と書き込んだ直後に「ご注文の発送」メールが来た。監視されているぞ、これは。

さらに追伸:
お預かり店 アマ堺店
だそうだ。堺の倉庫も地震でずいぶん揺れたらしい。ほんまに長いことゆれてますなーあ。一ヶ月も揺れているとは。

さらにさらに追伸:
嫁に言わせると、「堺の倉庫」って、大阪府堺市じゃあなっくて宮城県にあったんじゃない?だとさ。

2011年4月8日金曜日

python-dateutil

'No module named _thread'と出たら、ここからpython-dateutilを取り込み、インストール。
pipでインストールすると上が出る。

python-dateutil-2.0.tar.gz (Python >= 3.0)
python-dateutil-1.5.tar.gz (Python < 3.0)

2011年2月18日金曜日

既存の関数に後からデコレート

django-axesでやっていたのでメモ
admin.site.loginに定義したwatch_loginをくっつける。middlewareの初期化でやっちゃう。

class FailedLoginMiddleware(object):

    def __init__(self, *args, **kwargs):
        super(FailedLoginMiddleware, self).__init__(*args, **kwargs)

        # watch the admin login page
        admin.site.login = watch_login(admin.site.login)

        # and the regular auth login page
        auth_views.login = watch_login(auth_views.login)

Djangoのadminのurlsは

django.admin.site.urls -> django.admin.site.get_urls

urlpatterns = patterns('',
    url(r'^$', wrap(self.index), name='index'),
    url(r'^logout/$', wrap(self.logout), name='logout'),
    url(r'^password_change/$', wrap(self.password_change, cacheable=True), name='password_change'),
    url(r'^password_change/done/$', wrap(self.password_change_done, cacheable=True), name='password_change_done'),
    url(r'^jsi18n/$', wrap(self.i18n_javascript, cacheable=True), name='jsi18n'),
    url(r'^r/(?P<content_type_id>\d+)/(?P<object_id>.+)/$', 'django.views.defaults.shortcut'),
    url(r'^(?P<app_label>\w+)/$', wrap(self.app_index), name='app_list')
)

    urlpatterns += patterns('',
        url(r'^%s/%s/' % (model._meta.app_label, model._meta.module_name), include(model_admin.urls))
    )
 

2011年2月17日木曜日

wxPythonでGUI調査

import wx.lib.inspection

app = wx.App()
frame = wx.Frame(None, -1, u'Frame')
frame.Show(True)
wx.lib.inspection.InspectionTool().Show()
app.MainLoop()

2011年2月16日水曜日

ファイル名一括変更

rename 's/.htm/.html/' *.htm
 
後方参照も使えるぞ
01hogehoge.mp3 -> 01-01 
rename 's/([0-9][0-9]).*\./01-$1\./' -v *.mp3
 

2011年2月15日火曜日

wxPythonをソースからインストール

本家はこちら
wxWidgetsのクラスをpythonに晒して、蛇に「窓使い」をさせるもの。
思ってたより簡単だった。のでメモ。
wxWidgetsは既にソースコードからビルドインストールしてあるので割愛。
ソースのtarボールを取ってきて展開。その下の、wxPythonディレクトリのsetup.pyでやっつけられる。

ちゃんとやろうとすれば、wxWidgetsのcurrent stable soruceも付いてくるから野良ビルトすればよい。

1)wxWidgets
cd wxWidgets-XXXXXXXXXX
mkdir gtkbuild
../configure --prefix=$HOME/XXXX/XXXX/wxWidgets --enable-unicode --with-opengl
make
make install
cd ./contrib/src/stc
make
make install
cd -
cd ./contrib/src/gizmos
make
make install
cd -

~/.bash_mine
export PATH=$PATH:$HOME/XXXX/XXXX/wxWidgets/bin/
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$HOME/XXXX/XXXX/wxWidgets/lib/

2)wxPython
cd ./wxPython
python ./setup.py install

python ./demo/demo.py でテスト

C++でずいぶん使い倒した記憶があるが、ほとんど忘れていた。

2011年2月8日火曜日

django-axesでlogin lock

djangoでadminやloginに複数回のログイン失敗に対してlockをかけ設定した時間が経過しないとログインできないようにしたいならdjango-axes
ドキュメントとおりにインストールしてdjangoに設定すればOK

ソース読めば分かるけれど、ドキュメントにない設定もある。使うのは、
#失敗した後ロックされる時間
AXES_COOLOFF_TIME = 3 #hour
#ロックされたときに使うテンプレート
AXES_LOCKOUT_TEMPLATE = 'account_locked.html'

あと、
settings.pyで
PROJECT_ROOT = os.path.abspath(os.path.dirname(__file__))
と設定しているから
LOGFILE = os.path.join(settings.DIRNAME, 'axes.log')

LOGFILE = os.path.join(settings.PROJECT_ROOT, 'axes.log')
としてプロジェクトディレクトリにlogin履歴がaxes.logに書き込まれる。


AXES_LOCKOUT_TEMPLATEには
'cooloff_time': COOLOFF_TIME,
'failure_limit': FAILURE_LIMIT,
が渡されるので好きにしてよい。

デコレーターなので自前のログイン関数にも
from axes.decorators import watch_login
.......
@watch_login
def login(request):
でOK


本家はここ。 TNX!

2011年1月20日木曜日

sshFSでremote diskをmount

ubuntuだと
sudo apt-get install sshfs
でおわり。
マウント
sshfs [アカウント@]<サーバ>:[ディレクトリ] <マウントポイント>
アンマウント
fusermount -u <マウントポイント>

これで、リモートのファイルをローカル環境でいぢれる。開発用サーバーの出番が減るなあ。

Life with ITさんありがとう!

追記:-o reconnect
ServerAliveInterval 60 @~/.ssh/config

monkey_patch function

django-cmsのmonkeypatch_reverseから忘れないうちにメモ。
pythonで、関数もオブジェクトだから既存のライブラリを書き換えてしまえ。

main.py
from funcs import func

def main():
    func.printStr(u'hello')

if __name__ == '__main__':
    main()
    import monkey #新しい関数でpatch
    main()
funcs/func.py  #元の関数
def printStr(string):
    print u'original', string
monkey_patch.py  #新しい関数
import funcs

def monkey_patch_func():

    def new_printStr(string):
        print u'monkey', string

    print funcs.func.printStr
    funcs.func.old_printStr = funcs.func.printStr   #元の関数を退避
    funcs.func.printStr = new_printStr   #新しい関数を接続
    print funcs.func.printStr

    monkeypatched = False    #新しい関数の接続は1回だけ
    if not monkeypatched:
        monkey_patch_func()
        monkeypatched = True

2011年1月19日水曜日

geanyのPPAからupgrade

geanyに新しい0.20が出ているということで。 PPAからいれるべぇ。

sudo add-apt-repository ppa:geany-dev/ppa
sudo apt-get update
sudo apt-get upgrade

2011年1月17日月曜日

django-cms, python2.4 work around

RC2になってからインストール時にerror
古いpythonしか使えないから、小細工を

cms/utils/urlutils.pyのis_media_requestを
def is_media_request(request):
    """
    Check if a request is a media request.
    """
    parsed_media_url = urlparse(settings.MEDIA_URL)
    #python 2.4 work around                                                    
    try:
        if request.path.startswith(parsed_media_url.path):
            if parsed_media_url.netloc:
                if request.get_host() == parsed_media_url.netloc:
                    return True
            else:
                return True
    except:
        if request.path.startswith(parsed_media_url[2]):
            return True
    #python 2.4 work around end                                                
    return False

追記:結局pythonを野良ビルド

2011年1月12日水曜日

共有SSLでDjango接続

proxyを使って
              https                                                http
client---------->SSL(proxy) Server--------->Server
                             |----> provider
と言うことらしい。
つまり、プロバイダ内のSSLサーバーがSSL接続を受けて、プロバイダ内のネットワークを経由して共有サーバーに普通にhttp接続する。こうすることにより、clientからプロバイダまでの接続が暗号化される。

coreserverだと
request.METAの中に'HTTP_VIA'と'HTTP_X_FORWARDED_FOR'がセットされている。
ちゅうことは、Djangoのミドルウエアで受けたらOKかな?

参考:
http://drupal.org/node/339552
http://wiki.ryusendo.net/index.cgi?page=PHP%A5%D7%A5%ED%A5%B0%A5%E9%A5%DF%A5%F3%A5%B0#p17

追記:
HTTP_X_FORWARDED_FORがセットされたrequestがくるとurlを変更するミドルウエアでOK
のこるはlogin, admin

2011年1月5日水曜日

virtualenvのpackage管理

yolkが入っていること前提で

yolk -U | awk '{ print $1}' | xargs pip install -U

でどうでっしゃろう