第2回JavaScript読書会は4/23

延期になってた第二回は静岡で4/23開催


今回は三島駅からすぐのゆうゆうホール。

今回は関数の章なので次の5,6章とあわせてこの本のピークに突入

ProductName JavaScript: The Good Parts ―「良いパーツ」によるベストプラクティス
Douglas Crockford
オライリージャパン / 1890円 ( 2008-12-22 )


テクノ折り紙

テクノ折り紙

ダイソーで買ったCR2032を赤色LEDで挟んで、セロファンの折り紙で作った風船をディフューザーにした簡易非常灯。

1301823332 1301823335

ProductName テクノ手芸
テクノ手芸部
ワークスコーポレーション / 3570円 ( 2010-11-29 )


包子作りは楽しいですよ

慣れれば生地はサクサク作れるし、ほとんどの工程をボールの中だけでやってしまうことが可能なので洗い物があまり出ない(これ重要)

具を詰める作業は子供と一緒に。難点は数が作れないあたりか(200g打って8個分の生地)

蕎麦打ち用のこね鉢使えば一度に600g位打てるかな。そうすると24個作れるのか

1301792174 1301792177

蒸しあがり。「豚バラとねぎ」「鶏肉、椎茸、筍」というオーソドックスな組み合わせ。

1301792179 1301792181

今の蒸し器だと一度に5個までしか蒸せないので、2,3段重ねられる蒸し器が欲しいところ。

Amazon アフィリエイトのレポートをメールで自動で受けとる (Python)

Amazon アフィリエイトのレポートをメールで自動で受けとる 2011年版を見て、毎回アクセスして確認すんのは面倒なので僕もやっとこうと思った。

普段こういう作業ってperlでやってしまうことが多いのでPythonのmechanize使うのは初めてだ。あと、pyquery使うのも初めてだったりするが、jQuery知ってればサクっと使えてかなり便利。

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

# kzfm <kerolinq@gmail.com>

from mechanize import Browser
import smtplib
from email.MIMEText import MIMEText
from email.Header import Header
from email.Utils import formatdate
from pyquery import PyQuery as pq

email = 'XXXXXXXX@gmail.com'
password = 'XXXXXXXXXXXX'
amazon_url = 'https://affiliate.amazon.co.jp/'

def get_amazon_data():
    br = Browser()
    br.set_handle_robots(False)
    br.addheaders = [('User-agent', 'Mozilla/5.0 (X11; U; Linux i686; en-US; \
     rv:1.9.0.1) Gecko/2008071615 Fedora/3.0.1-1.fc9 Firefox/3.0.1')]

    br.open(amazon_url)

    br.select_form(name="sign_in")
    br["email"] = email
    br["password"] = password

    response = br.submit()

    d = pq(response.get_data())
    return [data.text for data in d('div').filter('.data')]

def send_mail(data):

    from_addr = email
    to_addr   = email
    subject   = u'Amazonアフィリエイト'
    body      = u"""
発送済み商品合計: %s
売上合計: %s
注文済み商品: %s
クリック数: %s
あなたのコンバージョン: %s
""" % tuple(data)

    msg = MIMEText(body.encode("utf-8"),'plain','utf-8')
    msg['Subject'] = Header(subject, 'utf-8')
    msg['From'] = from_addr
    msg['To'] = to_addr
    msg['Date'] = formatdate()

    s = smtplib.SMTP('smtp.gmail.com', 587)
    s.ehlo()
    s.starttls()
    s.ehlo()
    s.login(email, password)
    s.sendmail(from_addr, to_addr, msg.as_string())
    s.close()

if __name__ == '__main__':
    amazon_data = get_amazon_data();
    send_mail(amazon_data)

11.04.03

4/1からちょっとデザインが変わったようで、紹介料率の項目がなくなっていたので修正した。

SphinxをWikiのかわりに利用する

wikiやめたのでSphinxにメモるようにしてます。

で、ちょっと悩んでいるのがmake html後の手順だ。

現在/var/www/html以下はgitで管理していて、/var/www/html/[sphinx_html]みたいにドキュメントを置こうかなと考えているんだが、それってクライアント側でmake htmlして_build/htmlをcp -Rして/var/www/htmlを管理している方のGitに管理させるのがいいのかそれとも分けて管理してサーバー側で改めてmake htmlするようにしたほうがいいのかと。

あとはmake htmlしたあとの_buildディレクトリってもうちょっと自動的に公開されるようにできんかなと。

自動化といえば作業しているrstを監視しといてrstが更新されたら裏で自動的にmake htmlかかるようにできんかなとかも思った。

追記 11.04.02

Makefile読んだらmake htmlは

html:
        $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html
        @echo
        @echo "Build finished. The HTML pages are in $(BUILDDIR)/html."

ということなのでSPHINXBUILDつまりsphinx-buildコマンドを直接呼び出して明示的にBUILDDIRを指定してやればいいってことだった。

チェンツォンカオ(千層糕)を作ってみた

粉物は楽しいですね。

薄力粉とお湯なので油断すると手にくっ付く。油を入れる分パン作りよりはましだけど

1301726889 1301726893

一次発酵終了後。正方形に延ばしてから、畳みながらドライフルーツを挟んでいく。この重ねあわせがチェンツォンらしい。

1301726895 1301726897

子供用なのでドライフルーツはわんさか。あとプルーンを刻んだのも投入した。

1301726899 1301726901

蒸しあがり。本当は菱形に切るのがオシャレらしいんだが切り方わからん。

1301726903 1301726908

そしておやつタイム。息子の顔が北の国からのおとんみたいになっとんな。

1301726910 1301726913

初めてにしてはよく出来た

ProductName ウー・ウェンの北京小麦粉料理
ウー ウェン
高橋書店 / 1680円 ( 2001-11 )


modulefinderでimportされているモジュールを列挙する

引数にファイルを指定して呼び出せばそのファイルでimportされているモジュールを列挙してくれる

import cPickle

with open("list.txt","w") as f:
    cPickle.dump([1,2,3,4,5],f)

with open("list.txt","r") as f:
    a = cPickle.load(f)

print a

こんなのだと

  Name                      File
  ----                      ----
m __main__                  pickletest.py
m cPickle                   /opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/lib-dynload/cPickle.so

こんな感じ。

手芸+電子工作=テクノ手芸

テクノ手芸部の本

眺めているだけで創作意欲を刺激されるが同時に物欲度もあがる

ProductName テクノ手芸
テクノ手芸部
ワークスコーポレーション / 3570円 ( 2010-11-29 )


ホットボンド欲しくなった

娘にはまだフェルトとか早いだろうから、一緒に遊ぶならテクノ折り紙かな

LEDは色々持っているのでCRC-2032多めに買っておこうっと

reをコンパイルしとくと速いってのは割と単純な理由だった

ソース見ると毎度毎度コンパイルしてた

def match(pattern, string, flags=0):
    """Try to apply the pattern at the start of the string, returning
    a match object, or None if no match was found."""
    return _compile(pattern, flags).match(string)

def search(pattern, string, flags=0):
    """Scan through string looking for a match to the pattern, returning
    a match object, or None if no match was found."""
    return _compile(pattern, flags).search(string)

あとはこれで使ったexperimentalなScannerクラスのコード読んだ。

class Scanner:
    def __init__(self, lexicon, flags=0):
        from sre_constants import BRANCH, SUBPATTERN
        self.lexicon = lexicon
        # combine phrases into a compound pattern
        p = []
        s = sre_parse.Pattern()
        s.flags = flags
        for phrase, action in lexicon:
            p.append(sre_parse.SubPattern(s, [
                (SUBPATTERN, (len(p)+1, sre_parse.parse(phrase, flags))),
                ]))
        s.groups = len(p)+1
        p = sre_parse.SubPattern(s, [(BRANCH, (None, p))])
        self.scanner = sre_compile.compile(p)
    def scan(self, string):
        result = []
        append = result.append
        match = self.scanner.scanner(string).match
        i = 0
        while 1:
            m = match()
            if not m:
                break
            j = m.end()
            if i == j:
                break
            action = self.lexicon[m.lastindex-1][1]
            if hasattr(action, '__call__'):
                self.match = m
                action = action(self, m.group())
            if action is not None:
                append(action)
            i = j
        return result, string[i:]

ダンボール掘ってみた(12)

Individual Orchestra インタビュー

1295003330

ProductName MIND THE GAP-singles 2000-2006
INDIVIDUAL ORCHESTRA
インディーズ・メーカー / 2680円 ( 2006-07-07 )