「「若者はかわいそう」論のウソ」を読んだ

Joe's Labo見てから読んだから1章しか読んでないというか、読みにくかったので途中でやめた(読む本なかったら対談のあたりは読んでおこうかな)。

データの後によくわからないたとえがあったりとか、そこからデータに基づかない著者の思いとか主張に発展したりしているかなぁ。論文読んでる感じでデータと文章追いかけるとひどく混乱する。

本読んでて疑問に思ったのは著者の主張している、「日本企業的スローライフ」はサステイナブルなのかなぁ?(または現在存在しているのか?)というところかなぁ。自分のみた感じだと、「日本企業的スローライフ」に当てはまるのは「仕事できないけど組合大好きで、横並び主張ばかりするダメ人間」しかいないような気がするが。

ProductName 「若者はかわいそう」論のウソ (扶桑社新書)
海老原 嗣生
扶桑社 / ¥ 798 ()
在庫あり。

「食える数学」を読んだ

読み物として面白い。数学が実際の生活の中でどう使われているのか?とかを子供に説明する時に使えるネタが色々書いてあった。

chemoinformatics(とかbioinformatics)の世界に入って10年くらい経つけど、最近は数学的な部分を押さえてないと先に進めないなぁと。テクニシャンとかオペレーターからサイエンティフィックな方面に進みたい時には数学力がないと辛いなぁ(今まさになくて辛い)と感じる。

ProductName 食える数学
神永 正博
ディスカヴァー・トゥエンティワン / ¥ 1,575 ()
在庫あり。

  • ソリトン
  • プログラミングが出来るようになるにはプログラミングの訓練を重ねるしかない
  • 現代はタスクフォース型のシステムが有効に働くという状況ではない
  • ウェーブレット

本書でオススメされてたので読んでみよう。

ProductName これなら分かる応用数学教室―最小二乗法からウェーブレットまで
金谷 健一
共立出版 / ¥ 3,045 ()
通常2~4週間以内に発送

「はじめてのラーメン店オープンBOOK」を読んだ

技評の本だった。ラーメンは好きだけど、それ以上に全体の仕組みも気になるのでこういう本は面白い。最初の方は「麺の坊砦」や「らーめんのとやま」の事例を交えて説明されていてわかりやすい。

ProductName はじめてのラーメン店オープンBOOK (お店やろうよ! (19))
バウンド
技術評論社 / ¥ 1,869 ()
在庫あり。

  • 商圏調査: 商圏大勝
  • メニュー表の左上に目玉商品
  • 店舗と賃貸契約
    • 現状復帰と造作譲渡
  • 原価率は3-4割

石庭っていう画像埋め込みプログラムをつくろうとしたが途中で飽きた

プレゼンテーションZenに触発されてつくろうと思ったが途中で飽きた。あとは画像に埋め込むのと画像から抽出する部分を書けばいいんだけどね。まぁ気が向いたらまたやる。

ProductName プレゼンテーションzen
Garr Reynolds
ピアソン桐原 / 2415円 ( 2009-09-04 )


やりたかったのはうさぎの写真にfib(5)を実行するコードを埋め込むとか。

re.Scannerの使い方を覚えたのでよしとしよう。

import sys
import re
from re import Scanner
import Image

LOGLEVEL = 2

def log(level, *msg):
    if level <= LOGLEVEL:
        print "\t".join(map(str, msg))

class VM(object):
    """ Virtual Machine """
    def __init__(self,insns):
        self.insns = insns
        self.stack      = []
        self.heap       = {}
        self.labels     = self.find_labels(insns)

    def run(self):
        return_to = []
        pc = 0
        while pc < len(self.insns):
            if len(self.insns[pc]) == 1:
                insn = self.insns[pc][0]
            else:
                insn,arg = self.insns[pc]

            if insn == "push":
                self.push(arg)
            elif insn == "dup":
                self.push(self.stack[-1])
            elif insn == "copy":
                self.push(self.stack[(arg+1)])
            elif insn == "swap":
                x = self.pop()
                y = self.pop()
                self.push(x)
                self.push(y)
            elif insn == "discard":
                self.pop()
            elif insn == "slide":
                x = self.pop()
                for i in range(arg):
                    self.pop()
                self.push(x)
            elif insn == "add":
                self.push(self.pop() + self.pop())
            elif insn == "sub":
                y = self.pop()
                x = self.pop()
                self.push(x - y)                
            elif insn == "mul":
                self.push(self.pop() * self.pop())                
            elif insn == "div":
                y = self.pop()
                x = self.pop()
                self.push(x / y)
            elif insn == "mod":
                y = self.pop();
                x = self.pop()
                self.push(x % y)
            elif insn == "heap_write":
                value = self.pop()
                addr  = self.pop()
                self.heap[addr] = value
            elif insn == "heap_read":
                addr = self.pop()
                value = self.heap[addr]
                self.push(value)
            elif insn == "jump":
                pc = self.jump_to(arg)
            elif insn == "jump_zero":
                if self.pop() == 0:
                    pc = self.jump_to(arg)
            elif insn == "jump_negative":
                if self.pop() < 0:
                    pc = self.jump_to(arg)
            elif insn == "call":
                return_to.append(pc)
                pc = self.jump_to(arg)
            elif insn == "return":
                if len(return_to) < 1: IndexError('return_to has no item')
                pc = return_to.pop()
            elif insn == "exit":
                return
            elif insn == "char_out":
                sys.stdout.write(chr(self.pop()))
            elif insn == "num_out":
                print self.pop()
            elif insn == "char_in":
                addr = self.pop()
                self.heap[addr] = ord(sys.stdin.read(1))
            elif insn == "num_in":
                addr = self.pop()
                self.heap[addr] = int(sys.stdin.read())
            pc += 1
        print "プログラムの最後がexitではない"

    def push(self, item):
        if type(item).__name__ != 'int': raise TypeError('Not a Integer')
        self.stack.append(item)
        log(2, "stack op: ",self.stack)
    def pop(self):
        if len(self.stack) < 1: raise IndexError('stack has no item')
        return self.stack.pop()

    def jump_to(self, name):
        pc = self.labels[name]
        return pc

    def find_labels(self, insns):
        labels = {}
        for i,tp in enumerate(insns):
            if tp[0] == 'label':
                labels[tp[1]] = i
        return labels

### Scanner

rnum = "([01]+)2"
rlabel = rnum

scanner = Scanner([
    (r"00%s" % rnum,    lambda s,token: ("push", to_num(re.sub(r'^00','',token)))),
    (r"020",            lambda s,token: ("dup",)),
    (r"010%s" % rnum,   lambda s,token: ("copy", to_num(re.sub(r'^010','',token)))),
    (r"021",            lambda s,token: ("swap",)),
    (r"022",            lambda s,token: ("discard",)),
    (r"012%s" % rnum,   lambda s,token: ("slide", to_num(re.sub(r'^012','',token)))),
    (r"1000",           lambda s,token: ("add",)),
    (r"1001",           lambda s,token: ("sub",)),
    (r"1002",           lambda s,token: ("mul",)),
    (r"1010",           lambda s,token: ("div",)),
    (r"1011",           lambda s,token: ("mod",)),
    (r"110",            lambda s,token: ("heap_write",)),
    (r"111",            lambda s,token: ("heap_read",)),
    (r"200%s" % rlabel, lambda s,token: ("label", to_label(re.sub(r'^200','',token)))),
    (r"201%s" % rlabel, lambda s,token: ("call",  to_label(re.sub(r'^201','',token)))),
    (r"202%s" % rlabel, lambda s,token: ("jump",  to_label(re.sub(r'^202','',token)))),
    (r"210%s" % rlabel, lambda s,token: ("jump_zero", to_label(re.sub(r'^210','',token)))),
    (r"211%s" % rlabel, lambda s,token: ("jump_negative", to_label(re.sub(r'^211','',token)))),
    (r"212",            lambda s,token: ("return",)),
    (r"222",            lambda s,token: ("exit",)),
    (r"1200",           lambda s,token: ("char_out",)),
    (r"1201",           lambda s,token: ("num_out",)),
    (r"1210",           lambda s,token: ("char_in",)),
    (r"1211",           lambda s,token: ("num_in",))
    ])

def to_num(str):
    n = int(str[1:-1],2)
    if str[0] == '0': return n
    elif str[0] == '1': return -n
    else: raise TypeError('Not a Integer')

def to_label(str): return str[:-1]

### Parser

def parse_image(file):
    "pixelのrgpの合計のmod3をつなげた文字列を返す"
    modstr = ""
    im = Image.open(file)
    height,width = im.size
    for h in range(height):
        for w in range(width):
            r,g,b = im.getpixel((h,w))
            modstr += str((r+g+b)%3)
    return modstr

def extract_code(str):
    """10個以上の210の並びと10個以上の210の並びに挟まれた領域がコード領域"""
    return re.search(r'(210){10,}([012]+?)(210){10,}').group(2)

if __name__ == '__main__':

#     print "Hello World\n================="
#     t = [('push',10),('push',100),('push',108),('push',114),('push',111),('push',87),('push',32),
#          ('push',111),('push',108),('push',108),('push',101),('push',72),('char_out',),('char_out',),
#          ('char_out',),('char_out',),('char_out',),('char_out',),('char_out',),('char_out',),
#          ('char_out',),('char_out',),('char_out',),('char_out',),('exit',),]
#     vm = VM(t)
#     vm.run()

     print "token check\n================"
     tokens, remainder = scanner.scan("0001000012000110010020001101100200011100102000110111120001010111200010000020001101111200011011002000110110020001100101200010010002120012001200120012001200120012001200120012001200222")

     print tokens

     print "token -> vm\n================"
     vm2 = VM(tokens)

ProductName Rubyで作る奇妙なプログラミング言語 ~Esoteric Language~
原 悠
毎日コミュニケーションズ / ?円 ( 2008-12-20 )


「B級グルメ」の地域ブランド戦略

読んでみた。レビューではゴーストライター的な使い方をしてることにより、一つ星をうけてるけど内容がよければ誰が書いたかどうかはあんま関係ないんじゃないかな。

ProductName 「B級グルメ」の地域ブランド戦略

新評論 / ¥ 2,625 ()
在庫あり。

  • 無理な活動は持続的ではなく単発で終わってしまう傾向がある
  • 岩手のじゃじゃ麺
  • 久留米の焼き鳥は焼き場の見える位置で、ビール小を頼み焼き鳥を食べに来ているという無言のアピールをするのが通らしい。あとダルムを頼む
  • B-1グランプリに参加するための会費を出せないご当地グルメと、冷凍物を持ち込めないという規則により、その場での調理が難しい食べ物もある
    • 確かに調理時間とか一度に捌ける量とかも投票に影響してたな
  • 佐野ラーメンはみんなで盛り上げる時代から、独自性を出す、個人で頑張る時代に移行している
  • 岡谷はうなぎのまち
  • 富良野オムカレー
    • 富良野産の米を使いライスに工夫を凝らす
    • 卵は原則富良野産
    • 富良野産チーズ、またはワインを使う
    • 富良野産にこだわる
    • 富良野産牛乳と野菜一品をつける
    • 料金は1000円以内におさめる
  • 鍋焼きラーメン

新規開発型のB級グルメとしては、富良野オムカレーの制約のかけ方は面白かった。黒部ダムカレーとか、うわ、たかっと思ってしまったというか、あまり高額設定すると「一見さん狙いか」と勘ぐられるリスクはあるよね?964(クロヨン)縛りとかすれば良かったのに

そういう意味ではつけナポの競合はラーメンとかつけ麺の価格帯でしょう、1000円超えだと全部のせとかできるよね。あと、こっちは麺縛りしなかったのかなぁ。(出たんだろうけどまとめきれなかったんだろうなぁと勝手に想像してみる)

余談だが、つけナポはつけ麺認定(私が)しているのでパスタ麺のとこには行かないことにしている。(パスタ麺であえて麺とスープを分離させる意味がわからんし)

と書いていて、パスタ麺とスープを敢えて別盛りにすることでより美味しくなる何かがあったりするのかなぁ?そうであれば機会損失であり由々しき問題だ!とふと思ったので、一度は食べておかないといけないかな。今度どこかに食べに行こう。どこがいいかな?

Free Energy Calculations in Rational Drug Design

これは購入しておく。

ProductName Free Energy Calculations in Rational Drug Design

Springer US / ¥ 13,115 ()
一時的に在庫切れですが、商品が入荷次第配送します。配送予定日がわかり次第Eメールにてお知らせします。商品の代金は発送時に請求いたします。

Free energy calculations represent the most accurate computational method available for predicting enzyme inhibitor binding affinities. Advances in computer power in the 1990s enabled the practical application of these calculations in rationale drug design. This book represents the first comprehensive review of this growing area of research and covers the basic theory underlying the method, numerous state of the art strategies designed to improve throughput and dozen examples wherein free energy calculations were used to design and evaluate potential drug candidates.

うちの職場は古きよきというか(略)

量子化学計算のコストも下がったというか、小さい化合物だったら普通に待てる時間でレスポンス返せるのでWebインターフェースつくってある。配座の安定性調べたり、ソルベーションエナジー計算したりとか色々やれるので、合成力(how to make)よりも、何を合成するか(what to make)?つまり、どういう仮定を置くか、論理をどう組み立てるか?という化学反応の背景にある物理化学とか量子化学に対する理解を強めるのは重要でないのかなぁと思っているんだけど。

どうかな?

「Google API Expertが解説する Closure Libraryプログラミングガイド」を注文した

amazonのwishlistには入っていたのだけど、いまいちどういう本かわからなかったので、保留中であったが、著者のblogに本の内容のエントリがでてたので読んだら欲しくなった。

ProductName Google API Expertが解説する Closure Libraryプログラミングガイド
伊藤 千光
インプレスジャパン / 3570円 ( 2010-12-10 )


サーバー側がGAE for Pythonってのもなんだかいい。

「データ構造とアルゴリズム」を読んだ

実装が載っていないけど、これはわかりやすい。大学の1,2年向けらしい。情報系って1,2回でこんなことやってたのか。うらやましい。囲み記事のカーペンターズアルゴリズムの解説が良かった、というか読むべし。

ProductName データ構造とアルゴリズム
杉原 厚吉
共立出版 / ¥ 2,415 ()
在庫あり。

  • 第1章 アルゴリズムと計算量
  • 第2章 リスト構造
  • 第3章 ヒープ
  • 第4章 ハッシュ法とバケット法
  • 第5章 再帰呼出しと分割統治
  • 第6章 グラフ探索
  • 第7章 最短路問題
  • 第8章 動的計画法
  • 第9章 縮小法
  • 第10章 最大流と割当て問題
  • 第11章 ボロノイ図とドロネー図
  • 第12章 3次元凸包とドロネー図
  • 第13章 平面走査法
  • 第14章 問題の難しさの測り方
  • 第15章 難問対策
  • 第16章 難問を利用した情報保護

以下メモ

  • ヒープソートの良さはメモリを効率的に扱えるところ
  • 分割統治は問題が比で小さくなるか差で小さくなるかを考えることが重要
  • 縮小法の中央値を早く見つける方法
  • 空円性
  • 最近点対
  • 最小全域木に属する全ての辺はドロネー辺
  • 平面走査法は次元を下げることにより問題を効率よく扱う
  • 分枝限定法

14章から先はちょっと端折っている感があるが、ここらへんが気になるのであれば「メタヒューリスティクスの数理」でも読めばいいのではと。Pythonの実装も載ってるし。

ProductName メタヒューリスティクスの数理
久保 幹雄,J. P. ペドロソ
共立出版 / ¥ 3,675 ()
在庫あり。

iPod用のヘッドフォンアダプタ

最近ジム通いを始めた。

で、前世代iPod shuffleの純正イヤフォンだとジムで走っているうちに外れて困るし、普通のやつだとつながらないので、アダプタを購入してみた。

これでジムで配っているヘッドフォンが使えて快適。英語のポッドキャスト聞きながら走っている。

ProductName Apple iPod shuffle 第3世代 2GB ブラック MC323J/A

アップル / ¥ 5,800 (2009-09-10)
在庫あり。

選曲できる機能があると、ジムで走っているときに曲が気に入らなくて変えたくなったりして集中力がなくなるので、onかoffしかないiPod shuffleはちょうど良い。

「なぜ、ベンチャーは失敗しやすいのか? 」を読んだ

おもしろかった。

ProductName なぜ、ベンチャーは失敗しやすいのか?
真田 哲弥,東京大学起業サークルTNK
インデックス・コミュニケーションズ / ¥ 1,575 ()
在庫あり。

  • 一過性ビジネスと永続型ビジネスの見極め方
  • 通常はビジネスアイデアを思いついてから、ターゲットを決めるが、自分をターゲットにして「自分なら欲しいか?」と自問自答しながら仕上げていく方法は有効