ポーカー、プログラミング、もぐ

ポーカーとプログラミングともぐもぐについてのブログ。

vagrantでdebian環境を動かそうとしたらvagrant upでエラーになった記録

A list of base boxes for Vagrant - Vagrantbox.es
から
Debian Jessie 8.1.0 Release x64 (Minimal, Guest Additions 4.3.26)
というのを入れようと思い、

vagrant box add https://atlas.hashicorp.com/ARTACK/boxes/debian-jessie
vagrant init ARTACK/debian-jessie

ここまでは何の問題もなく完了。
さて起動しようとして

vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Importing base box 'ARTACK/debian-jessie'...
==> default: Matching MAC address for NAT networking...
==> default: Checking if box 'ARTACK/debian-jessie' is up to date...
==> default: Setting the name of the VM: debian_box_default_1447491267837_72709
==> default: Clearing any previously set network interfaces...
==> default: Preparing network interfaces based on configuration...
    default: Adapter 1: nat
==> default: Forwarding ports...
    default: 22 => 2222 (adapter 1)
==> default: Booting VM...
==> default: Waiting for machine to boot. This may take a few minutes...
The guest machine entered an invalid state while waiting for it
to boot. Valid states are 'starting, running'. The machine is in the
'poweroff' state. Please verify everything is configured
properly and try again.

If the provider you're using has a GUI that comes with it,
it is often helpful to open that and watch the machine, since the
GUI often has more helpful error messages than Vagrant can retrieve.
For example, if you're using VirtualBox, run `vagrant up` while the
VirtualBox GUI is open.

The primary issue for this error is that the provider you're using
is not properly configured. This is very rarely a Vagrant issue.

oh...

理由がわからずなのでVirtualBoxを起動して、GUIから該当の環境を実行すると

Implementation of the USB 2.0 controller not found!
Because the USB 2.0 controller state is part of the saved VM state, the VM cannot be started. To fix this problem, either install the 'Oracle VM VirtualBox Extension Pack' or disable USB 2.0 support in the VM settings (VERR_NOT_FOUND).

ふむふむ

とりあえず、VirtualBoxから
設定>ポート>USB を選んで
USBコントローラを有効化 のチェックを外す。
設定を保存し、再度

vagrant up

エラーが出ないでうまくいってるみたい

vagrant status
Current machine states:

default                   running (virtualbox)

よし

SICPをやる記録 その3 1.1.7〜1.1.8

新しい訳d.hatena.ne.jp

が公開されたので、今後はそちらを使う。ありがとうございます。
あと、今回からファイルにコードを記述するようにした。
拡張子.scmとし、一行目に
#!/usr/local/bin/gosh
と書けば、
gosh ./test.scm
で実行可能。
結果を確認したいときは、
(print (function args))
でOK。

平方根は、どうやって計算するのでしょうか。最も一般的な方法は、ニュ ートンの逐次近似法を使うというものです。

a tour of Goでもニュートン法出てきたけど、海外のこういうやつだとニュートン法をやるのが通例になっているのだろうか。

練習問題 1.6:
new-ifは自分で定義したもの。
1.1.3、 1.1.5で見るように、手続きを定義したとき、

インタプリタは組み合わせ の各要素を評価し、手続き (組合せの演算子の値) を引数 (組合せの被演算子の 値) に適用する

という評価順序になる。
sqrt-iterはnew-ifを使用しているため、new-ifの評価が無限に行われてしまう。

練習問題 1.8:
#!/usr/local/bin/gosh
(define (cubic-iter guess x) (if (good-enough? guess x)
guess
(cubic-iter (improve guess x) x)))
(define (improve guess x) (/ (+ (/ x (* guess guess)) (* 2 guess)) 3))
(define (good-enough? guess x)
(< (abs (- (* guess (* guess guess)) x)) 0.0001))
(define (cubic x) (cubic-iter 1.0 x))
(print (cubic 27)) #3.0000005410641766

Laravel4.2 をLaravel5系が最新の今インストールする方法

スタートガイドのコマンド

composer create-project laravel/laravel your-project-name --prefer-dist

を打つと、その時点での最新版(現在だと5系)がインストールされてしまう。

4.2を入れたいときは、

composer create-project laravel/laravel your-project-name 4.2.* --prefer-dist

と打てばOK

マージソート at Python

組み込みのを使うのが普通なのだけど、まあ頭の体操がてら。

def mergesort(lst):
    if not isinstance(lst, list):
        raise ValueError("argument must be list")

    if len(lst) < 2:
        return lst

    lst1 = lst[:int(len(lst)/2)]
    lst2 = lst[int(len(lst)/2):]

    sorted_lst1 = mergesort(lst1)
    sorted_lst2 = mergesort(lst2)

    result = _merge(sorted_lst1, sorted_lst2)
    return result

def _merge(lst1, lst2):
    result = []

    total = len(lst1) + len(lst2)
    while len(result) < total:
        if  len(lst1) == 0:
            result.extend(lst2)

        elif len(lst2) == 0:
            result.extend(lst1)

        elif lst1[0] < lst2[0]:
            result.append(lst1[0])
            lst1.pop(0)

        else:
            result.append(lst2[0])
            lst2.pop(0)

    return result

ソートにもいろいろあるけど、私はこのマージソートが一番好きですね。
半分こしていって最後に結合していくのがなんかいいかんじ。

ハノイの塔 at Python

ハノイの塔をPythonで書いた。
スタックで各棒の状態も持たせるようにしたので、Stackクラスも書いたけど、
解くだけなら別にいらない。

class Stack(object):
    item = []
    name = ""

    def __init__(self):
        self.item = []
        self.name = ""

    def push(self, data):
        self.item.append(data)

    def pop(self):
        if len(self.item) == 0:
            raise ValueError("item is null")

        data = self.item[-1]
        self.item.pop(-1)
        return data

    def peek(self):
        if len(self.item) == 0:
            return None

        return self.item[-1]

    def naming(self, name):
        self.name = name

    def __repr__(self):
        return self.name

class Hanoi(object):
    disk_number = 0
    stack_a = Stack()
    stack_a.naming("a")
    stack_b = Stack()
    stack_b.naming("b")
    stack_c = Stack()
    stack_c.naming("c")

    def __init__(self, n):
        """
        :param n:number of disks
        """
        self.disk_number = n
        disks = reversed(range(n))
        for i in disks:
            self.stack_a.push(i)

    def solve(self):
        self.move(self.disk_number, self.stack_a, self.stack_c, self.stack_b)

    def move(self, n, from_s, to_s, tmp_s):
        if(n > 1):
            self.move(n-1, from_s, tmp_s, to_s)
            print("disk{0}:{1}->{2}".format(n, from_s, to_s))
            disk = from_s.peek()
            from_s.pop()
            to_s.push(disk)
            self.move(n-1, tmp_s, to_s, from_s)

        elif(n == 1):
            print("disk{0}:{1}->{2}".format(n, from_s, to_s))
            disk = from_s.peek()
            from_s.pop()
            to_s.push(disk)

hanoi = Hanoi(3)
hanoi.solve()

Flask on Heroku(Python3.4.2) その5 カスタムフィルターを使う

asiagohan.hatenablog.com
asiagohan.hatenablog.com
asiagohan.hatenablog.com
asiagohan.hatenablog.com

今回はカスタムフィルターを使い、データの表現方法をよりわかりやすいものにします。

そもそもカスタムフィルターは、Jinja2の機能で、アプリケーションの表示部分(viewの部分)の問題を解決するためのものです。
例えば、
・データベースから取得した日付データを、任意のフォーマットで表示したい
・URLをエンコードして表示したい
などです。

ここでは、
・日付データのフォーマットを変更する
・入力された改行を改行タグ(
)とする
二点についてカスタムフィルターを使います。

まず、これはカスタムフィルターとは関係ありませんが、Hello Worldをいい加減削除し、
"/"へregister関数を紐付けます。
一緒に、register.htmlテンプレートをindex.htmlへリネームします。

import datetime
from flask import render_template, flash, redirect, url_for, request

from flask_app import app, db
from .forms import TodoForm
from .models import Todo

@app.route('/', methods=['GET', 'POST'])
def register():
    form = TodoForm()
    if request.method == 'POST' and form.validate():
        title = form.title.data
        detail = form.detail.data
        timestamp = datetime.datetime.utcnow()
        todo = Todo(title=title, detail=detail, timestamp=timestamp)
        db.session.add(todo)
        db.session.commit()
        return redirect(url_for('register'))

    todo_list = Todo.query.order_by(Todo.timestamp.desc())
    return render_template('index.html',
                           form=form,
                           todo_list=todo_list)

次に、flask_appディレクトリ下にカスタムフィルターファイルを追加します。

datetimeformat.py

from jinja2 import Markup

def datetimeformat(value, format='%Y-%m-%d %H:%M '):
    return Markup(value.strftime(format))

newlinetobr.py

from jinja2 import Markup
from jinja2 import escape

def newlinetobr(value):
    return Markup('<br />'.join(escape(value).splitlines()))

このカスタムフィルターを登録します。
flask_app/__init__.pyを編集します。

from flask import Flask
from flask.ext.sqlalchemy import SQLAlchemy

from .datetimeformat import datetimeformat
from .newlinetobr import newlinetobr

app = Flask(__name__)
app.config.from_object('config')
db = SQLAlchemy(app)

app.jinja_env.filters['datetimeformat'] = datetimeformat
app.jinja_env.filters['newlinetobr'] = newlinetobr

from flask_app import views, models

登録が終わったら、テンプレートファイルを編集します。
先ほどリネームしたtemplates/index.htmlの、日付データと詳細データ部分を変更します。

<!DOCTYPE html>
<html>
<head lang="ja">
    <meta charset="UTF-8">
    <title>register</title>
</head>
<body>
<h2>REGISTER</h2>
  <form action="" method="post" name="register">
      {{ form.hidden_tag() }}
      <p>
          title:<br>
          {{ form.title() }}<br>
      </p>
      {% for error in form.title.errors %}
            <span style="color: red;">TITLEを入力してください。</span>
          {% endfor %}<br>

      <p>
          detail:<br>
          {{ form.detail() }}<br>
      </p>
      <p><input type="submit" value="投稿" class="btn btn-primary"></p>
  </form>

{% for todo in todo_list %}
    <h2>{{ todo.title }}</h2>
    {{ todo.detail | newlinetobr }}<br>
    {{ todo.timestamp | datetimeformat }}
    <hr>
{% endfor %}



</body>
</html>

カスタムフィルターを利用するとき、
{{ argument | function }}
という形で表記します。

すべての編集が終わった段階で、
http://127.0.0.1:5000/へアクセスすると、

f:id:asiagohan:20150813222912j:plainf:id:asiagohan:20150813222912j:plain
このように、日付と詳細の表示方法が変わっています。

今回のソースコードは、
https://github.com/asiagohan/flask_tutorial_todo/tree/layout

こちらにアップされています。

最近のポーカー

このごろポーカーをやっていなかったが、

どうも自分は残暑のころになるとポーカーがやりたくなるらしい。

ZOOMとSit&Goをやった。

Sit&Goのほうは2位になった。

 

ヘッズで負けた。かなりタイトな相手だったので、それに完全に合わせられなかったのが敗因かと思う。

またこんどライブにも行きたい。

 

今までアクションの時に、余計な感情が入り込みすぎていたような気がする。

少しばかり間を置いたので、そこがある程度落ち着いた気がする。

本当にそうかどうかは、もう少しハンド数を重ねる必要がある。