外縁部:re

学んだことのメモです: Notebook of Study

flask-sqlalchemy での relationship のオプション backref について - Flask Web Development の勉強(3)-

最初?と思ったのでメモ

ユーザーと、それに紐づくロールのテーブルを想定
test.py

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

basedir = os.path.abspath(os.path.dirname(__file__)) # hello.pyの存在するディレクトリ

app = Flask(__name__) #

# app.config 設定
app.config['SQLALCHEMY_DATABASE_URI'] =\
    'sqlite:///' + os.path.join(basedir, 'data.sqlite') # sqliteのベースディレクトリ指定
app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] =True # データベース変更時に自動コミットする設定

db = SQLAlchemy(app) # db操作用のオブジェクト生成

# SQLAlchemyのテスト用クラス
class Role(db.Model):
    __tablename__ = 'roles'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(64), unique=True)
    users = db.relationship('User', backref='role') # usersテーブルへの逆参照 ??  

class User(db.Model):
    __tablename__ = 'users'
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(64), unique=True, index=True) 

ここで対話シェルで

from hello import db
db.drop_all()
db.create_all()
from hello import Role, User
admin_role = Role(name='Admin')
mod_role = Role(name='Moderator')
user_role = Role(name='User')
user_john = User(username='john', role=admin_role)
user_susan = User(username='susan', role=user_role)
user_david = User(username='david', role=user_role)
db.session.add_all([admin_role, mod_role, user_role, user_john, user_susan, user_david])
db.session.commit()

と入れると以下のようなテーブル構造になる

roles users
id name id username role_id
1 Admin 1 john 1
2 Moderator 2 susan 3
3 User 3 david 3

ここで例えば、user_susan以下を見るとこんな感じになってる

user_susan.id           user_susan.query        user_susan.role         user_susan.username     
user_susan.metadata     user_susan.query_class  user_susan.role_id      

user_susan.roleというのができていて、user_susan.role以下は

user_susan.role.id           user_susan.role.name         user_susan.role.query_class  
user_susan.role.metadata     user_susan.role.query        user_susan.role.users    

と、結びつけられたroleをuser_susanオブジェクトから参照できるようになっている。

print(user_susan.role.id)
>>3
print(user_susan.role.name)
>>User

となる。backref指定がない場合どうなるかはおいおい調べようかなと。
ORM、概念はわかるのですがsqlベタ書きのほうが今んとこ楽ですね・・・

ARM mbed でLチカ(LPC 1114FN28)

f:id:origamisama:20160508011838j:plain
GWも終わりですが、久々に手で物いじりたくなり電子工作しています。
(そのうちきちんと書こうかとは思いますが)

もともとはもっとハードより(物性ーアナログ回路)が守備範囲だったので、マイコンを使ったデジタルな電子工作はだいぶ久々なのですが……

Raspberry Pi で遊ぼうかとも思ったのですが、値段や機能がIoT(コンセプトは面白いけどできることって…)の主役たりえるか、少し?マーク(もともと教育用ですし)
Arduino は昔触ったし、せっかくだから32bitマイコン手出してみようかな…と思い本屋行ったら

mbed電子工作レシピ

mbed電子工作レシピ

いい感じの本があったのでmbedにしようと。

スイッチサイエンスの書き込み器付きのチップ買って、後はテキトーにLEDと抵抗(200Ωくらい)買ってきて。
ARMコアのマイコンの、めんどくさい部分をよきに計らってくれて、Arduinoみたいにとっつきやすいのがmbedの売りなのかなーと、ざっと触ってみた感じ思います。
アカウント作成→ブラウザにコード入れてコンパイル→チップへ転送、
てのは驚きましたが。今日日たしかにネットに繋がらない環境のほうが少ないでしょうし、個人で作る分にはこれでいいのかも?

Lチカまで本片手に5分で出来たので、結構楽しくなるかもしれません。

個人的にはブレッドボードは接触不良のデバッグとかがしづらいので、あんま好きではないんですが、楽ですね。

.vimrc改修その3( jedi-vim を dein_lazy.toml へ移動、emmet-vim, vim-surround 導入)

前回は遅延ロードなるもの理解していなかったので、dain_lazy.tomlのほうへ jedi-vimを移動しました。
こちらの記事(http://qiita.com/kawaz/items/ee725f6214f91337b42b)によると、on_ftなどon_XXで起動指定しているプラグインは自動で遅延ロードになるそうです(そりゃそうか)
ついでにFlaskまわりでHTMLいじること多くなるなと思ったので2つ追加。

jediの補完をpyvenvで動かしてる仮想環境読みに行けるようにできればいいのだけれど、なかなか難しくて挫折。。。


gistc15d8a19bd196822c4848ba9515c916b

flask-script の使い方 -Flask Web Developmentの勉強(2)-

Flaskだと通常

from flask import Flask
app = Flask(__name__)

"""もろもろ"""

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

と書きますが、これだと実行状態の指定(debugモードONとか、走らせるHost指定とか)を態々該当.pyファイルを編集する必要があります。

コマンドラインから実行指定できた方が便利ーということで、flask-script (http://flask-script.readthedocs.io/en/latest/)というエクステンションが利用できるようです。

pip install flask-script

で入れた後はこんな感じのファイルを用意してあげて(めんどいので前記事のhello.pyと同じディレクトリに置いてあげてimportしてます)

あとはコマンドラインから

python manager.py rumserver --host 0.0.0.0 -d

とかしてあげれば、

* Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)

とパブリックIP参照、debugモードonの状態で起動してくれます。

  • dなしだとoffの状態で起動するみたいです。

便利ですね。

参考書籍:

Flask Web Development: Developing Web Applications with Python

Flask Web Development: Developing Web Applications with Python

Flask Web Development の勉強(1)

GWということで洋書ですが

Flask Web Development: Developing Web Applications with Python

Flask Web Development: Developing Web Applications with Python

を読みつつ、GitHubの勉強もしようと
GitHub実践入門 ~Pull Requestによる開発の変革 (WEB+DB PRESS plus)

GitHub実践入門 ~Pull Requestによる開発の変革 (WEB+DB PRESS plus)

を読み読みGitHubについて勉強しています。

ついでに私はGETとPOSTの違いも最近わかったレベルなので

Webを支える技術 -HTTP、URI、HTML、そしてREST (WEB+DB PRESS plus)

Webを支える技術 -HTTP、URI、HTML、そしてREST (WEB+DB PRESS plus)

を読みながら、です。

この本の筆者のMiguelさんはFlask Mega Tutorialというサイトも公開されているかたで、「Flask tutorial recommend」とかでググるとここがいいよ!的な知恵袋みたいなページがよくヒットします。

本の方がいいかな、と思って読んでみはじめたのですが、面白いアプローチでGitHubからリポジトリをクローンしてきて、各節に対応したタグへとチェックアウトしてコードを眺める、という進め方をしています。最終的にはブログっぽいのができますよーといった感じのようです。
github.com

ディレクトリ構造とかあれこれ環境整える必要がないですが、いい加減GitHubも慣れなきゃ慣れなきゃ、と思ってたので自分で手組みしてPush、というのを試してみようかなと。
ということで一番最初の章ながめながらapp.pyの挙動を見てみています。

(pyenv + venvでPython3環境で試してみてるのですが、日本語扱いやすくていいですね!)
Cookieが動作どうしてるのかいまいちよくわかってない(⇦
のですがのんべんだらりと進めてこうかなーと

このペースだとGW終わっちゃいそうですが

.vimrc改訂作業(dein, jedi導入中)

nihaoshijie.hatenadiary.jp
こちらを参考にvimをガチャガチャいじってたんですが、「Neobundle インストール」で調べてたらdeinというのに開発が移った?のか
qiita.com
という記事を発見したので試行錯誤しながら入れてみました

" ---------- dein.vim 設定 ----------
" ディレクトリ設定
if &compatible
    set nocompatible
endif
let g:rc_dir = expand('~/.vim')  "設定ディレクトリ
let s:dein_dir = expand('~/.vim/dein') " deinディレクトリ
let s:dein_repo_dir = s:dein_dir . '/repos/github.com/Shougo/dein.vim' " deinリポジトリ
" dein.vim がないときgit clone
if &runtimepath !~# '/dein.vim'
    if !isdirectory(s:dein_repo_dir)
        execute '!git clone https://github.com/Shougo/dein.vim' s:dein_repo_dir
    endif
        execute 'set runtimepath^=' . fnamemodify(s:dein_repo_dir, ':p')
    endif
" プラグイン設定
if dein#load_state(s:dein_dir)
    call dein#begin(s:dein_dir)
    " プラグインリストの場所
    let s:toml      = g:rc_dir . '/rc/dein.toml' "通常ロード
    let s:lazy_toml = g:rc_dir . '/rc/dein_lazy.toml' "遅延ロード
    " プラグインリストのロード
    call dein#load_toml(s:toml,      {'lazy': 0})
    call dein#load_toml(s:lazy_toml, {'lazy': 1})
    call dein#end()
    call dein#save_state()
endif
" 未インストールのものをインストール
if dein#check_install()
    call dein#install()
endif

filetype plugin on

" ---------- 基本設定 ----------
syntax enable "構文ハイライト有効化
set number    "行番号表示
set showmatch " 対応括弧強調表示
set backspace=indent,eol,start"backspaceを有効化

" ---------- タブ設定 ----------
set expandtab     " ソフトタブ有効化
set tabstop=8     " タブ文字幅はスペース8つ相当
set softtabstop=4 " ソフトタブ幅はスペース4つ

" ---------- インデント ----------
set autoindent   " 改行時自動インデント
set shiftwidth=4 " autoindent時の幅を4に

" ---------- Python設定 ----------
autocmd FileType python setl smartindent cinwords=if,elif,else,for,while,try,except,finally,def,class
    " 改行時自動インデントする宣言
let python_highlight_all =1 " Python用のシンタックスハイライトを全てONに

もう一個

[[plugins]]
repo = 'Shougo/dein.vim' 
[[plugins]]
repo = 'Shougo/vimproc.vim'
build = 'make'
[[plugins]]
#name = 'lang/python/compl-jedi'
repo = 'davidhalter/jedi-vim'

ひとまず動く感じにはなったっぽい。
jediまわりもちっといじったほうが良さそう

にしても慣れてないからかもしれませんがvimrcとかの設定って1日とけますね…

Flaskのimportでつまずいた話(Python の import を階層構造で )

Flask を学習し始めたのですが、

__init__.py

from flask import Flask

app = Flask(__name__)
from app import views

としててのっけから??となってしまいました。

  1. なんで一番下でもっかいimport?
  2. appなんてモジュール入れてないよ?

と。

1は
Larger Applications — Flask Documentation (0.10)
のCircular Importsに書いてあったのですが、循環importを解決するのにそうしてるとのこと(はっきり理解したわけではないのでまた調べたいです)

2はディレクトリの構造が

app
  |-__init__.py
  |-views.py

となってたのですが、__init__.pyがあるとそこのフォルダ(今回はapp)をまるっとモジュールとして扱えるようになるんですね(パッケージ化)。
6. モジュール — Python 2.7.x ドキュメント
それでfrom app import viewsなんて出来たのだと。

まだ勉強中ですが、ちょこちょこ備記録代わりに上げてけたらなあと