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さんありがとう。