Rakudo Starを触ってみた

Wiki Bookを読みながら、面白いなと思った部分。

型チェックしてくれる

> my Int $x;
Int()
> $x = "1"
Type check failed for assignment
> $x = 1
1

multi method dispatch

Haskellっぽくかける

> multi sub fib (Int $n where { $n < 3 }) { 1 }
> multi sub fib (Int $n)                  { fib($n - 1) + fib($n - 2) }
> fib(10) #55

終了条件を最初に決めて、あとは再帰させてみた。

> multi sub mysum (@a where {@a == 0}) {return 0}
> multi sub mysum (@a) {@a[0] + mysum(@a[1..(@a-1)])}
> mysum 1..10 #55

Placeholder Arguments

$^で

> for (@myArray) { say $^a + $^b; }
3  # 1+2
7  # 3+4
11 # 5+6

gather take

リスト内包表記っぽい。それともScalaっぽい?

> gather for 1..10 {take $_ if $_ % 3 == 0} # 3 6 9

こんな感じにもできる

> gather for 1..10 {take 1..$_,"\n"}
1
 1 2
 1 2 3
 1 2 3 4
 1 2 3 4 5
 1 2 3 4 5 6
 1 2 3 4 5 6 7
 1 2 3 4 5 6 7 8
 1 2 3 4 5 6 7 8 9
 1 2 3 4 5 6 7 8 9 10 

Rakudo Starを入れた

朝からPerl6の実装のひとつのRakudo Starを入れて遊んでた。

$ ./perl6 
> for 1..5 { .say }
1
2
3
4
5

無限リスト

> for 1..Inf { .say }
1
2
3
...
20092
20093
20094
Segmentation fault

週末にもう少し触ってみよう。

ProductName Einstieg in Perl 6
Alvar Freude
Addison Wesley Verlag / ¥ 4,393 ()
近日発売 予約可

波越

浜千鳥乃詩のとこらしい。

1280404145

なかなか美味い。

そういえば今年は梅酒漬けてなかった。

「年金は本当にもらえるのか?」を読んだ

拡張現実とか興味ないとか言われるが、こういう内容は夫婦で読めるのでよい。

Q&A式の一問一答で、初級、中級、上級と徐々に内容が難しくなっていく構成なので読みやすかった。

ProductName 年金は本当にもらえるのか? (ちくま新書)
鈴木 亘
筑摩書房 / ¥ 819 ()
在庫あり。

もともと議論の出発点としての成長率と出生率がずれているというのは理解していたのだけど、年金が「賦課方式」だと今後難しいだろうというのはよくわかった。

あと、小難しい用語は、平易にすると反感勝手困る内容なので、わざと難解な言葉におきかえているというとこは笑った。

  • 現在の未納者の多くは、将来に受け取れる年金よりも、保険料支払いの方が多い世代
  • 保険料の実質未納率は6割近い
  • 有限均衡方式とは、後先のことは考えずに、今ある積立金をさっさと取り崩していまおうという方式
  • マクロ経済スライドとは、毎年の年金の伸び率を抑えることでだんだんと給付カットする仕組み
  • 債務超過という概念は、積立方式にしか定義されない

こっちもあわせて読むといいかも。

ProductName 世代間格差ってなんだ (PHP新書 678)
高橋 亮平,小黒 一正,城 繁幸
PHP研究所 / ¥ 756 ()
在庫あり。

逃げきれそうな世代は、逃げ切りをはかるもんなんかね?年功序列も、年金も? なんて思った。まぁ、そういう世代は自分の親の世代なんだけど、彼らは孫に何を残したいのかなぁ、僕らはどうすべきなのかなぁと。価値観違うから世代間闘争でもなんでもやって折り合い付ければいいんだろうと思うけど、早い段階で土俵にあげるように義務教育にでも組み込むとかは必要なんじゃないかなぁと。

そうしないと少なくともフェアじゃないよな。

[改訂第5版] LaTeX2e 美文書作成入門が届いてた

帰ったら届いてた。

ProductName [改訂第5版] LaTeX2e 美文書作成入門
奥村 晴彦
技術評論社 / ¥ 3,339 ()
在庫あり。

あとで、がっつり読む

「レバレッジ時間術」を読んだ

時間は資産なのでうまく使いましょう。

読みやすいし、主張も分かりやすかった。

cPickle

cPickleを使ってみる。

ダンプするとき

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

ProductName Python クックブック 第2版
Alex Martelli,Anna Martelli Ravenscroft,David Ascher
オライリー・ジャパン / ¥ 4,410 ()
在庫あり。

Flaskでコードをハイライトするサービス

pythonのMarkdownにはPygmentsをつかったコードハイライト用のエクステンションがあるので、それを使えば簡単にかける

flaskmd

スクリーンショット撮ってから「セッションとか使ってないからsessionとかkeyとかいらないじゃん」と思って少し綺麗にしたので最終的には15行くらい。

flaskmd.py

from flask import Flask, request, url_for, render_template
from markdown import markdown

DEBUG = True
app = Flask(__name__)
app.config.from_object(__name__)

@app.route('/',methods=['POST', 'GET'])
def show_code(code = ""):
    if request.method == 'POST':
        code = markdown(request.form['code'], ['codehilite'],safe_mode=False)
    return render_template('show_code.html', code=code)

if __name__ == '__main__':
    app.run()

show_code.html

markdownで生成したhtmlをそのままテンプレートに渡すとエスケープされてしまうので、autoescapeをFalseにした。今回ここが一番悩んだがドキュメントをちゃんと読めば書いてあった。

<!doctype html>
<title>CodeHilite</title>
<link rel=stylesheet type=text/css href="{{ url_for('static', filename='style.css') }}">
<body>
<form action="{{ url_for('show_code') }}" method=post class=add-entry>
<dl>
<dt>code:
<dd><textarea name=code rows=5 cols=40></textarea>
<dd><input type=submit value=hilite>
</dl>
</form>
<div class=page>
  <h1>CodeHilite</h1>
{% autoescape false %}
{{ code }}
{% endautoescape %}
</div>
</body>
</html>

style.css

cssはpygmentsであらかじめファイルに出力しておいた

from pygments.formatters import HtmlFormatter
with open("style.css","a") as f:
    f.write(HtmlFormatter().get_style_defs('.codehilitetable'))

Flask楽しい。

ProductName Lonely Planet Discover Japan
Chris Rowthorn,Andrew Bender,Matthew D. Firestone,Timothy N. Hornyak
Lonely Planet / ¥ 2,326 ()
在庫あり。

Haskell読書会に参加

先週末はHaskell読書会に参加してきた。みなさんお疲れ様でした。今回8章

ProductName プログラミングHaskell
Graham Hutton
オーム社 / ¥ 2,940 ()
在庫あり。

do記法使わないで書いてあったので当日は、 筆者のページのサンプル見ながらdo記法で書いてた。

この日からガンダムの公開で、ヒトも多かった。

1280177376

メロンパン

1280177381

懇親会の赤から。焼肉した後に鍋が出てきた。

1280177378 1280177383

来月は浜松。浜松は行ったことないので楽しみ。

Flaskでtwitter名刺みたいなやつをつくるやつ

OAuth使えば簡単だろうと。

twitter_card

あとは名刺型にhtmlをいじればよいんだけど飽きた。

twittercard.py

from flask import Flask, request, session, g, redirect, url_for, abort, render_template, flash
from flaskext.oauth import OAuth
import qrencode

DEBUG      = True
SECRET_KEY = 'development key'
TWITTER_URL = "http://twitter.com/"

app = Flask(__name__)
app.config.from_object(__name__)

oauth = OAuth()
twitter = oauth.remote_app('twitter',
                           base_url='http://api.twitter.com/1/',
                           request_token_url='http://api.twitter.com/oauth/request_token',
                           access_token_url='http://api.twitter.com/oauth/access_token',
                           authorize_url='http://api.twitter.com/oauth/authorize',
                           consumer_key='XXXXXXXXXXXXX',
                           consumer_secret='XXXXXXXXXXXXX'
)

@twitter.tokengetter
def get_twitter_token():
    return session.get('twitter_token')

@app.route('/')
def show_entries():
    screen_name = session.get('screen_name',None)
    name = session.get('name',None)
    profile_image_url = session.get('profile_image_url',None)
    entry = {}
    if screen_name != None: 
        imgurl = "http://twitter.com/%s" % screen_name
        imgfile   = "%s.png" % screen_name
        qrencode.encode_scaled(imgurl,50)[2].save("static/"+imgfile)
        resp = twitter.get('http://twitter.com/status/user_timeline/'+screen_name+".json")
        if resp.status == 200:
            user = resp.data[0]['user']
            name = user['name']
            url = user['url']
            profile_image_url = user['profile_image_url']
        else:
            name = None
            profile_image_url = None

        entry = dict(screen_name=screen_name,qrimg=imgfile,name=name, profile_image_url=profile_image_url, url=url)
    return render_template('show_entries.html', entry=entry)

@app.route('/login')
def login():
    return twitter.authorize(callback=url_for("oauth_authorized"))

@app.route('/logout')
def logout():
    session.pop('screen_name', None)
    session.pop('logged_in', None)
    session.pop('twitter_token', None)
    flash('You were logged out')
    return redirect(url_for('show_entries'))

@app.route('/oauth-authorized')
@twitter.authorized_handler
def oauth_authorized(resp):
    next_url = url_for('show_entries')
    if resp is None:
        flash(u'You denied the request to sign in.')
        return redirect(next_url)

    session['logged_in'] = True
    session['screen_name'] = resp['screen_name']
    session['twitter_token'] = (
        resp['oauth_token'],
        resp['oauth_token_secret']
        )

    flash(resp['screen_name'] + ' were signed in')
    return redirect(next_url)

if __name__ == '__main__':
    app.run()

テンプレート(やる気レス)

<!doctype html>
<title>TwitterCard</title>
<link rel=stylesheet type=text/css href="{{ url_for('static', filename='style.css') }}">
<div class=page>
  <h1>TwitterCard</h1>
  <div class=metanav>
    {% if not session.logged_in %}
    <a href="{{ url_for('login') }}">log in</a>
    {% else %}
    <a href="{{ url_for('logout') }}">log out</a>
    {% endif %}
  </div>
  {% for message in get_flashed_messages() %}
  <div class=flash>{{ message }}</div>
  {% endfor %}
  <img src="{{ entry.profile_image_url }}" />
  <ul class=entry>
    <li>{{ entry.screen_name }}</li>
    <li>{{ entry.name }}</li>
    <li>{{ entry.url }}</li>
  </ul>
  <img src={{ url_for('static',filename=entry.qrimg) }} />
</div>

ついったー名刺ってのがあってQRコードはblogとかのURLなんだけど、ツイッターオフとかいくと、簡単にフォローしたいからQRコードはtwitterアカウントのほうがいいかな?なんて思っていたので作ってみようとした(がもう寝る時間なので眠くなってしまい、ヤル気が急速に失われた)。


エントリ書いてて思ったんだが、ツイッターオフ参加者のIDのリストをQRコードにしといて、そいつを食わすとまとめてフォローするサービスのほうがいいような気がしてきた。そんなのないかな。

名刺見ながらポチポチ登録作業すんのもめんどいよね。