「書籍電子化:代行は「違法」 「自炊」業者を提訴 浅田次郎さんら7人、差し止め求め」
この著者や出版社は電子出版しようと努力しているのだろうか?
私は、本は大好きだが、
1.引越しのたびに泣く泣く 蔵書を少しずつでも処分している。
2.あと何年生きれて、死んだあとその後蔵書を処分してもらうこと。
この2つのことを考えて数年前から本を買うのをやめてしまった。
君たちは、 電子出版しようと努力して無いのだったら、自ら顧客を無くしてしまっていることを自覚した方がいい。
追記:
ところで、浅田次郎って誰?
2011年12月24日土曜日
郵パックがトホホ
郵パックで送ろうと思って、ちょうど手元に送り状があった。
それに書いて郵便局に持って行くと、送り状が古くてバーコードが登録できないから新しいのに書きなおせだと。
そんなのだから赤字垂れ流しになるんじゃ。
ほんとどこ向いて 仕事しているんじゃ!
きっと新規システムを導入するとき、「ケッチって」古い番号を捨てたのだろう。
業者は「そんなことしたら大変なことにになりますよ」と指摘しても強行したに違いない。
もう二度と利用しない。
追記:
郵パックって安いというイメージがあったけれど今確認するとヤマトと50円しか変わらない。拠点の遠さや不愉快な思いをすることを考えたら、やっぱり。
と言っていたら、「読経」が聞こえてきた。
まあ、郵便なんてなくなっても困らないし。郵貯と簡保は国債とご臨終になるだろうし。
もともと、役人と労組が食い物にしてきたのだし、清算してもいいんじゃない。「チーン!」
追記1:
海の向こうの方が早そうだ。
「米郵政公社が250の集配施設を閉鎖、3万5千人削減へ」
追記2:
12月26日午前中に届いたはずの荷物の「お届けしました葉書」昨日の30日についた。わざわざ北海道まで転送して投函したのだろうか?4日もかかるなんて。
それに書いて郵便局に持って行くと、送り状が古くてバーコードが登録できないから新しいのに書きなおせだと。
そんなのだから赤字垂れ流しになるんじゃ。
ほんとどこ向いて 仕事しているんじゃ!
きっと新規システムを導入するとき、「ケッチって」古い番号を捨てたのだろう。
業者は「そんなことしたら大変なことにになりますよ」と指摘しても強行したに違いない。
もう二度と利用しない。
追記:
郵パックって安いというイメージがあったけれど今確認するとヤマトと50円しか変わらない。拠点の遠さや不愉快な思いをすることを考えたら、やっぱり。
もう二度と利用しない。
と言っていたら、「読経」が聞こえてきた。
まあ、郵便なんてなくなっても困らないし。郵貯と簡保は国債とご臨終になるだろうし。
もともと、役人と労組が食い物にしてきたのだし、清算してもいいんじゃない。「チーン!」
追記1:
海の向こうの方が早そうだ。
「米郵政公社が250の集配施設を閉鎖、3万5千人削減へ」
追記2:
12月26日午前中に届いたはずの荷物の「お届けしました葉書」昨日の30日についた。わざわざ北海道まで転送して投函したのだろうか?4日もかかるなんて。
GL220の受信データーを加工(struct編)
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になるがなと唸っていたぞ。
データ受信関連仕様書(GL220_820).pdfの4ページ
例) 端子台20CH、 内部バッファ内データ2点の場合
受信データ, 説明
#6******, ヘッダ(ASCII): #6は接頭文字で固定。次の6文字でその後の******で受信されるバイト数を表します。
1:CH1アナログデータ, 1chデータのバイナリ(2byte)
2:CH2アナログデータ, 2chデータのバイナリ(2byte)
:(中略), : (中略)
10:CH10アナログデータ, 10chデータのバイナリ(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)
21:アラームデータ(ロジック/パルス), ロジックとパルスのアラームデータ(2Byte)
22:アラーム出力データ, アラーム出力データ(2Byte)
23:ステータス, データの状態を表す情報(2byte), CH1アナログデータ
23×2byte=46byte
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
ふふふ、内包表記じゃ
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の「お問い合わせ」でくるメールの
###### 引用初め
本メールの配信に身に覚えのない場合、お手数ですが以下まで
###### 引用終わり
にはワロタ。
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日火曜日
2011年11月25日金曜日
extundelete
2011年11月15日火曜日
独自ドメインをvaluedomainからstardomainへ移管
なんか
1)valuedomainがいっちょかみに買われたらしい。
2)stardomainのほうが少し安い?
3)トップドメインはstardomainが直ぶら下がり。(少し安心かな?)
4)おまけで10GBのサーバーがついてくる。(bk倉庫に使おう。)
て言うことで手持ちドメイン全部移管してみました。
1月以上使っているが問題なし。
1)valuedomainがいっちょかみに買われたらしい。
2)stardomainのほうが少し安い?
3)トップドメインはstardomainが直ぶら下がり。(少し安心かな?)
4)おまけで10GBのサーバーがついてくる。(bk倉庫に使おう。)
て言うことで手持ちドメイン全部移管してみました。
1月以上使っているが問題なし。
2011年11月5日土曜日
django-1.3にdjango-cms-2.2をインストールする時
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)で拡張子
(gitでファイルを管理しているためファイル名が変更されているのはヤダ)
rename -v 's/^(.*?)_R.*(\.xls)/$1_R$2/' ./*.xls
-nオプションでdry-run、変換を確認できる。
_Rはなんでもいい、固定のモノにしておくといい。つまり、ここまでが最初のファイル名の最後マークだと思ってくれ。これは、trunkが単にグループ名だとすると正規表現がややこしくなるため。
正規表現
^(.*?)_Rで行頭から渡す前のファイル名までlasy-matching
.*で追加部分
(\.xls)で拡張子
2011年10月22日土曜日
2011年10月21日金曜日
pythonでcoreserverからmail送信
chihiroさんのこのページのほぼ丸写し。
chihiroさんありがとうございます。
chihiroさんありがとうございます。
# -*- coding: utf-8 -*-違いは赤い字のSMTP_SSLあたり
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)
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
でいける。
何がこんな目に私をあわしたかは秘密!
[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時についた。
翌々日ですた。
書籍、現物あり。
2時すぎにはコンビニからの入金が確認できたとさ。
さあ、いつ来ることやら。
ワクワクドキドキ。
これで遅ければ、ジュクドウさん、まだまだチャンスありまっせ。
P.S. 9/30.13時についた。
翌々日ですた。
2011年9月10日土曜日
formでselectを書き換え禁止
class Metaでwidgetsに適切なものを指定して、そのwidgetsが生成するhtml tagの属性をattrsに辞書で渡す。というわけやね。
追記:
class Hoge(ModelForm):True要らないけれど、attrsが辞書なので。
class Meta:
model = Foo
widgets = {'choice': forms.Select(attrs={'disabled': True,}),}
追記:
form = Hoge()でもOK
form.fields['choice'].widget.attrs['disabled'] = True
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与えるのより、全部与えるほうが多いような気がする。
えっ。作れって、そうさせて頂きます。
と思ったら。似たようなのがここにあった。
ということで、
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をもとの位置に戻す。
横メニューなら
肝は、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日土曜日
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"に変更になっている。
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によるとこれを継承したクラスをつくれとのこと。
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
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を渡すことで舐める方向を決めている。
例
同一レベルで順に舐めていくときは、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>example
<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>
#!/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のほうが遅いとか言っている。これより遅いのか?
朝や夜間はそこそこの速度が出るのだが昼間はダメ、比較にならないほど遅くなる。ちょっとしたファイルのダウンロードやアップロードでもウンともスンとも言わなくなるし、webサイトはリロードを頻繁に繰り返さないと取ってこない。
tracerouteで調べたら、Wimax, KDDIの内部で1,000msec以上かかっているじゃああーーりませんか。朝や夜間は100msec程度。こりゃダメだ。使いもんにならない。基地局の設置ばっかり頑張っていてもナローバンド回線では。
ここの提供パターン3,4,5あたりでMVNOでやっているところなら大丈夫なのだろうか?
結論:固定回線の代替にはなりません。
追記:2chあたりでは 上記のMVNOのほうが遅いとか言っている。これより遅いのか?
2011年7月25日月曜日
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
メモ:ここ
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は--
訂正
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月24日金曜日
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できるぞ。
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使ってやるということも考えられる。
pip install ./freeze.pybundle
でインストールできる。
残りはsourceからインストールした。
これを使ってpythonを2.7.1から2.7.2へアップロードしてみた。
うーん便利。複数のアップロードには有効!
リモートへfabric使ってやるということも考えられる。
2011年6月18日土曜日
2011年6月17日金曜日
pipでbundle
ここによるとpipにbundleというコマンドがあるらしい。
インストール済みのパッケージを固めてくれるらしい。
早速チェック
pip freeze -l > ./requirements.txt
pip bundle freeze.pybundle -r ./requirements.txt
を、固めだした。しかしいちいちpypiに取りに行っている。まあ固まったら楽できるからいいや。
と思っていたらエラー。なになに、ローカルでインストールしたwxWidgetsが見つからないと。そりゃそうだ。ということで削る。
固まった。。。。。 続きは後ほど。
インストール済みのパッケージを固めてくれるらしい。
早速チェック
pip freeze -l > ./requirements.txt
pip bundle freeze.pybundle -r ./requirements.txt
を、固めだした。しかしいちいちpypiに取りに行っている。まあ固まったら楽できるからいいや。
と思っていたらエラー。なになに、ローカルでインストールしたwxWidgetsが見つからないと。そりゃそうだ。ということで削る。
固まった。。。。。 続きは後ほど。
2011年6月7日火曜日
django-cmsでTinyMCEのcustomize
settings.pyに
cms/plugins/text/widgets/tinymce_widget.py
CMS_PLUGIN_TEXT_TINYMCE_CONFIG['theme'] = "advanced"
を入れておかないとerror
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'"cms/plugins/text/settings.py
mce_config = cms.plugins.text.settings.TINYMCE_CONFIG.copy()
mce_config.update(get_language_config(self.content_language))
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を取り出してきてインストールし、サイトから落としたアップデータをインストールして認識するようになった。
結論として、ファームを突っ込まないとダメ?
古いCDを取り出してきてインストールし、サイトから落としたアップデータをインストールして認識するようになった。
django-cmsでTinyMCEの設定でsimpleとadvancedが一緒
plugins/text/widgets/tinymce_widget.py
の
line 65-66
の
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 &
ついでに
そこから、[ファイル名:行番号]形式で重複なくファイル名の取得
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')),を追加。
mediaディレクトリの適当な位置にTinyMCE本体をコピー。
TINYMCE_JS_URLとTINYMCE_JS_ROOTを設定。
url.pyにurl(r'^tinymce/', include('tinymce.urls')),を追加。
2011年6月2日木曜日
2011年5月31日火曜日
plugins template
すぐ忘れるので、メモ
find . -type d -name templates | grep plugins | sed 's/$/\/cms/' | xargs cp -rvf -t [project]/templates/
find . -type d -name templates | grep plugins | sed 's/$/\/cms/' | xargs cp -rvf -t [project]/templates/
2011年5月27日金曜日
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"
ところで「ファイルを登録した時、順序良く登録してくれない。」のは何故だろう?
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/
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)タイトルクリップの作成
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年5月16日月曜日
2011年4月14日木曜日
括弧抜け
cms/templates/admin/cms/page/change_form.html
52: .notfilled{
53: color: #808080 !important;
54: }
django-cms-2.1.3
本家に投げときました。
52: .notfilled{
53: color: #808080 !important;
54: }
django-cms-2.1.3
本家に投げときました。
2011年4月12日火曜日
amazonの出荷が遅い
「amazonの出荷が遅い」そのまんまですがな。
4月5日に入金済みの商品早く出荷してくれんかな。
つまらないプロモーションメール送ってくる暇があったら。
なんで遅れているかといったら、
「現在当サイトでは、震災の影響により、商品の出荷処理に通常よりもお時間をいただいております。」
だそうだ。ほんまか!
挙句の果てに
この商品は配送準備に入っているため、キャンセルや変更はできません。返品についてはこちらをご覧ください。
だそうだ。在庫があるのに配送準備に何年かかるねーん! キャンセルして他所に注文も出来やしない。
追伸:
と書き込んだ直後に「ご注文の発送」メールが来た。監視されているぞ、これは。
さらに追伸:
お預かり店 アマ堺店
だそうだ。堺の倉庫も地震でずいぶん揺れたらしい。ほんまに長いことゆれてますなーあ。一ヶ月も揺れているとは。
さらにさらに追伸:
嫁に言わせると、「堺の倉庫」って、大阪府堺市じゃあなっくて宮城県にあったんじゃない?だとさ。
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)
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の初期化でやっちゃう。
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()
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++でずいぶん使い倒した記憶があるが、ほとんど忘れていた。
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!
ドキュメントとおりにインストールして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月28日金曜日
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
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
pythonで、関数もオブジェクトだから既存のライブラリを書き換えてしまえ。
main.py
from funcs import funcfuncs/func.py #元の関数
def main():
func.printStr(u'hello')
if __name__ == '__main__':
main()
import monkey #新しい関数でpatch
main()
def printStr(string):monkey_patch.py #新しい関数
print u'original', string
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
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を
追記:結局pythonを野良ビルド
古い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
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日水曜日
登録:
投稿 (Atom)