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/へアクセスすると、
このように、日付と詳細の表示方法が変わっています。
今回のソースコードは、
https://github.com/asiagohan/flask_tutorial_todo/tree/layout
こちらにアップされています。