Django入門その後に(5)〜モデルを作ろう〜
ここまでDjangoをほとんど書いてなくてジレッタイガーかもしれませんが、一つ一つの手順をじっくり理解しながら進むスタイルですのでご理解ください
余談ですがガラスの艦隊ってアニメは第1話で革命が起きて王制を倒してその革命のリーダーが実は女だったって所まで分かるぐらい20分に詰め込みましたが、2話以降はよく知りません。
1.MTVモデルの復習から
とにかく今回からやっとDjangoの製造にとっかかります。 まずはMTVのM、モデルから行こうと思います。 モデルって何だっけって人のためのイラストを再掲しますとこんな感じです。
MTVモデルについて |
---|
要はデータベース部分です。最近はテーブル定義するのにSQL文とか要らないんですよね。Djangoで書いたものを反映してくれます。 すっごーい
2.実際に書いてみよう
今回追加するデータベースはinfoのアプリケーションで使うので/info/models.py に追加します。
from django.db import models # お決まり class Seiyuu(models.Model): # SeiyuuというTableを宣言する、頭文字が大文字が流儀 """声優さんの一覧""" # 性別を選択する選択肢を宣言 GENDER_CHOICES = ( (1, '男性'), (2, '女性'), (3, 'その他'), ) # フィールドを定義します # verbose_name:人間に表示する名前を決める、adminサイトとかで使う name = models.CharField(max_length=255, verbose_name='名前') # max_lengthは長さの最大値 # choicesにタプルを指定することで選択肢のエリアにできる、 # blankやnullをOKにするかどうか gender = models.IntegerField(verbose_name='性別', choices=GENDER_CHOICES, blank=True, null=True) birth_day = models.DateField(verbose_name='誕生日', blank=True, null=True) created_at = models.DateTimeField(auto_now_add=True) # レコードが追加された時にその時間を保存します updated_at = models.DateTimeField(auto_now=True) # レコードが更新されたタイミングで現在時間が保存されます。 def __str__(self): # クラスを呼び出したときに何が帰るか?(基本何でも良いです) return self.name
3. 細かく見てみよう
ここではSeiyuuというTableを宣言しています。
name = models.CharField(max_length=255, verbose_name='名前')
Char型の”名前”という最大255文字のfieldを宣言しています。 verbose_nameというのは人間にも分かる名前を意味しますが、後述するadminサイトで表示するときに「名前」と表示することができます。
choices
性別のように入力項目に制限がある場合は、choicesを使います。 タプルで宣言した項目だけが登録出来るようになります(この場合は1か2)
※タプルというのは、値の中身を絶対に変えられない配列です。丸括弧とカンマ区切りで宣言します。
4.戻り値
これを書いておかないと後述するadminサイトがエラーで表示されません。 とりあえずそのモデルの持つ代表的な項目を返せば良いと思います あんまりよく分かってないです
書き方 def __[戻すときの型]__(self): return self.戻すfield def __str__(self): return self.name
書き方のイメージはこんな感じです
[プロジェクトフォルダ]/[アプリケーション名]/models.py
from django.db import models # お決まりの書き方 class [TBL名](models.Model): # フィールドを定義します フィールド名 = models.型Field(この中の書き方は色々) def __[型名]__(self): return self.フィールド名
覚えていて欲しいコーディングルールはこんな感じです。
- TBL名はclass Xxxxで宣言する.
TBL名は先頭大文字で単語は複数単語の場合は繋げて書く(例: PrettyRhythm等)
field名は小文字で書く
- field名は単語が複数の時はアンダースコアで繋げて書く(pretty_rhythm等)
ということでいい加減migrate(djangoに書いた定義を実際のデータベースに反映する)をしましょう。
Django入門その後に(4)〜繋がるDB〜
ここではデータベースとDjangoを繋げます。 繋がるストーリー、カラフルストーリーです。(意味不明)
カラフルストーリーのPVは声優系PVとしては珠玉の出来映えです。 10代の素材を損なわない、制服という分かりやすい記号に、2人のダンシングスキルそして、ワンカットPVという努力と工夫の詰まった大変素晴らしいものです。
1.データベースの設定はどこで決める?
データベースへの接続設定はsettinngs.pyに書きます。
settings.py DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), } }
標準ではsqlite3に繋がるようになってます。 sqlite3ってなんだよって人もいると思いますがその謎はすぐに解けます。
2.データベースの設定を実際のデータベースに反映させよう
とりあえず何も考えずにマイグレーション(DjangoとDBを同期させる)という処理をやってみましょう。
$ python manage.py migrate
Apply all migrations: admin, auth, contenttypes, sessions Running migrations: Applying contenttypes.0001_initial... OK Applying auth.0001_initial... OK Applying admin.0001_initial... OK Applying admin.0002_logentry_remove_auto_add... OK Applying contenttypes.0002_remove_content_type_name... OK Applying auth.0002_alter_permission_name_max_length... OK Applying auth.0003_alter_user_email_max_length... OK Applying auth.0004_alter_user_username_opts... OK Applying auth.0005_alter_user_last_login_null... OK Applying auth.0006_require_contenttypes_0002... OK Applying auth.0007_alter_validators_add_error_messages... OK Applying auth.0008_alter_user_username_max_length... OK Applying sessions.0001_initial... OK
なんか色々動きましたね!
もう一回フォルダを見てみましょう
├── db.sqlite3: ★なんか出来てる! ├── info │ (中略) ├── manage.py └── seiyuu_info ├── 中略
db.sqlite3というのがデータベースの実体になります。
3.sqlite3に入って実際に作成されたデータベースを確認してみよう
今回生成されたデータベースの中に入ってみましょう。
sqlite3 [接続先のデータベース] $ sqlite3 db.sqlite3
SQLite version 3.16.0 2016-11-04 19:09:39 Enter ".help" for usage hints. sqlite> sqlite> sqlite> sqlite> sqlite> .tables ★このコマンドでテーブルの一覧が見れます auth_group auth_user_user_permissions auth_group_permissions django_admin_log auth_permission django_content_type auth_user django_migrations auth_user_groups django_session sqlite>
先ほどのmigrateというコマンドで色々できました。 じゃこれって何なんだろうというのも絵にしました。
マイグレートについて |
---|
ここまでデータベースの定義なんて何一つ書いてませんが、テーブルがいくつかできてますね。 何かというと、Djangoは標準でテーブルをいくつか作ります。例えばセッション管理とかユーザー情報みたいなところを標準で生成します。 うーん、至れり尽くせりですね
次は実際に声優情報のデータベースを追加していきましょう。
Django入門その後に(3)〜MTVモデルって何ですか? 難しいですか? 教えてもらって良いですか?〜
終末何してますか?は見てませんし、内容も全然知りません。ごめんなさい
MTVモデルって何?
Djangoの基本的な考えにMTVモデルについてです。 公式チュートリアル
中身は貼りませんが、この説明だとまずはMVCモデルが分からないと意味不明じゃないでしょうか 例によって絵を描きますが、深夜テンションで冷静な判断ができないので、アイドルオタクとアイドルを例にした絵を描きました。
MTVモデルって何? |
---|
オタクからのコールリクエストに対して写真(データ)をアルバム(Model)から探して、thankyouと書かれたフレーム(template)に詰めてレスポンスすることでオタクをぶち切れさせてるんですね
このアルバムから写真を探してきてフレームに詰めて渡す行為全般が処理(View)になります。
オタクはすぐにぶち切れます。
もうちょっと技術寄りに書くとこんな感じです。
MTVモデルって何?(技術寄りに) |
---|
(この例ではwikipediaの表示を例にしていますが、wikipediaはDjango製ではありません、分かりやすい例としてwikipediaを出しています。) ここではwikipedia.org/悠木碧をブラウザから叩くことで、該当の処理(View)が呼ばれてデータベース(Model)から名前や生年月日や出演歴を取得した後にhtmlファイル(template) にその文章や写真を詰めて返しています。templateは表示の部分を司っています。
これを今手元にあるファイルのどこに当てはまるか考えて見ましょう
├── info │ ├── __init__.py │ ├── admin.py │ ├── apps.py │ ├── migrations │ │ └── __init__.py │ ├── models.py: ★ここがモデルです。ここにデータベースの定義を書きます │ ├── tests.py │ └── views.py: ★ここがViewです。ここに処理を書きます。 ├── manage.py └── seiyuu_info ├── __init__.py ├── __pycache__ │ ├── __init__.cpython-35.pyc │ └── settings.cpython-35.pyc ├── settings.py ★ここにデータベース接続情報を書きます ├── urls.py └── wsgi.py
templateがないですね。ここは後で追加します。
ということで、次からはMTVのModelについて見ていこうと思います。
Django入門その後に(2)〜プロジェクトとアプリケーションを作ろう〜
ここから先は声優情報ポータルサイトを作ることを実例にして進めていこうと思います。
まずはプロジェクトとアプリケーションを作りましょう。
1.そもそもプロジェクトとかアプリケーションって何?
この疑問に対しては公式からの回答があります。 はじめての Django アプリ作成、その 1 | Django documentation | Django
プロジェクトとアプリケーション プロジェクトとアプリケーションの違いとは何でしょうか?アプリケーションとは、実際に何らかの処理を行う Web アプリケーションを指します。例えばブログシステムや公開レコードのデータベース、単純な投票アプリといった具合です。プロジェクトとは、あるウェブサイト向けに設定とアプリケーションを集めたものです。一つのプロジェクトには複数のアプリケーションを入れられ ます。また、一つのアプリケーションは複数のプロジェクトで使えます。
イメージ的にはこんな感じじゃないでしょうか?
プロジェクトとアプリケーション |
---|
ざっくり理解したところで次に進みましょう。
2.Djangoのプロジェクトを作ろう
以下のコマンドでプロジェクトが作れます。
書き方: $ django-admin.py startproject [好きなプロジェクト名] 実例: $ django-admin.py startproject seiyuu_info
プロジェクト名は小文字で単語をアンダースコアで繋ぐのが一般的です。
seiyuu_infoフォルダが作られます。 これはプロジェクトを管理するフォルダです。
manage.py: 超大事だけど直すことはないので気にしない └── seiyuu_info: フォルダ。プロジェクト名と同じ名前が付く ├── __init__.py: 各フォルダにはとりあえずこいつが必要ぐらいの認識でOK ├── settings.py: 色々な設定をここに書きます。超大事です。結構直します ├── urls.py: 大事です。直します。 └── wsgi.py: とりあえず気にしない。
3.アプリケーションを追加しよう
書き方: $ python manage.py startapp [アプリケーション名] 実例: $ python manage.py startapp info
ここでは先ほど作ったseiyuu_infoプロジェクトの中にあった manage.pyを叩いてます。
manage.py 呼ぶ処理名 引数
でDjangoの機能を呼び出しているんですね。
これでinfoというアプリケーションができました。 名前についてはできれば単語一つ、プロジェクト名のように小文字のアンダースコア繋ぎが一般的です。[要出典]
アプリケーションを追加したことでinfoフォルダが増えました。中身を見てみましょう。
│ ├── __init__.py │ ├── admin.py: データベースの中身を参照したり、更新したりできます。すごいです │ ├── apps.py: とりあえず今はまだ気にしなくて良いです。django1.8からの機能です。 │ ├── migrations: データベースの変更に関するファイルを持ってます。後で説明します。 │ │ └── __init__.py │ ├── models.py: データベースの設計を書きます │ ├── tests.py: 余裕があったら書きます │ └── views.py: 超大事です。詳しく説明します ├── manage.py └── seiyuu_info 省略
4.プロジェクトにアプリケーションを教えて上げよう
Djangoのプロジェクトのsettinngs.pyにinfoアプリを追加します。 settinngs.pyは時々直すので設定関係は全部ここぐらいの認識で良いんじゃないでしょうか? seiyuu_infoプロジェクトにinfoアプリケーションを使うことを教えます。
seiyuu_info/seiyuu_info/settings.py INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'info' # 追加したアプリケーション ←ここを追加 ]
これでDjangoのseiyuu_infoプロジェクトとinfoアプリケーションができました。
次はDjangoのMTVモデルについて簡単に説明しようと思います
Django入門その後に(3)〜MTVモデルって何ですか? 難しいですか? 教えてもらって良いですか?〜 - 脱職エントリー
おまけ
アプリケーションの命名規則などについては気になる人はこちらのブログをご参照ください。
Django入門その後に(1)〜始めに〜
Djangoを学習する上での課題色々
Djangoってみなさんどうやって勉強してます? 公式チュートリアルとかQiitaにもDjango入門とかありますけど、その後を補完するまとまった本や記事がないなぁと感じでいます。本も洋書しかありませんし、現状独学でwebアプリを作ろうとしている人にとってDjangoは取っつきにくいフレームワークとなっているように思えます。
Djangoはいいぞ
いいぞといっても筆者はwebフレームワークはDjangoしか使ったことがないので比べることができません。 しかし、Djangoを書く上でのストレスは少ないと感じているので、とっかかりは難しくても一度こつを掴むとさくさく作れるのがDjangoではないでしょうか?
自分は先輩諸兄の手厚い介護の元でDjangoエンジニアっぽいことができていますが、せっかくのGWなので、Django入門のその後のまとまった資料を書いてみようと思います。
なお、アジャイルなエントリーを目指しているので都度都度修正しようと思うので、空中で暴言を言わずに優しくリプを送って頂けると幸いです。
対象
- webアプリを作りたい人
- とりあえずDjangoでrunserverできる人(Django入門やチュートリアルが終わっている人)
- Django入門やってみたけどこの後何ができるかよく分からない人
- そもそもコピペしたので分かってない人
- ググっても体系的な記事が出てこなくて困ってる人
- ざっくり概念を理解したい人
- サブカルチャーへの造詣と理解がある人
やること
- Djangoの基本的な仕組みについて少し細かい説明を図やサンプルコードを使って概念を理解することを重点に説明。 (migration、MVCについて、adminサイト、Djangoクエリの取り方色々等々・・)そのため、多少のくどさはあるかも知れませんがご容赦ください。
やらないこと
環境構築 この話を始めると大変なのでやりません。 参考までに筆者はこんな感じでやってます OS: OSX Sierra Python: 3.5.2 Django: 1.11 IDE: pycharm(有料版)
htmlとかのフロント的なこと 筆者に力量がなさ過ぎるので説明
できませんしません とはいえ、templateがあるので素のhtmlで説明しようと思います、フロント的な知識は今回のDjangoの勉強からは外して、なるべくDjangoのみについて学べるようにしようと思います
とうことでプロジェクトを作るところから始めていこうと思います。 またソースコードはこちらに公開しています。
GitHub - NakajimaYuuki/seiyuu_info: Djangoの練習用です。
Django入門その後に(2)〜プロジェクトとアプリケーションを作ろう〜 - 脱職エントリー
おまけ
自分のつたないDjango知識で壮大なことをやろうとしていますが、結果的にDjangoを学ぶ役に立たない物になっても、Djangoの少しまとまった資料がない問題の提起になれば良いかなと思います(逃げ) オルフェンズも主人公サイドは最後にほぼ壊滅しましたが、それでも火星の人たちの待遇は良くなったのかもしれないねーという、問題提起ぐらいはできたんですし、このDjango入門その後にも鉄火団のように散れれば良いかなと思います。 批判や苦情は優しくお願いします。
オープンハードカンファレンスでVRと現実をつなげようとした話
先週行われたオープンハードカンファレンスで展示したギーラボオールスターズ「伝説の剣」に関する振り返りです。
オープンハードカンファレンス自体に関する詳細はこちら
オープンハードカンファレンス2017 Nagano – OSHWC
要するにものづくりで交流しましょう!を趣旨に活動されていて、電子工作がメインですが、それ以外でもなんでもありというものです。
オープンハードカンファレンス 2017 Naganoの全体的な振り返りはこちらをご参照ください
「劇場版!!ギーラボ伝説の剣」~ギーラボオールスター集結~
○やりたかったこと
・ハード系のイベントだけど会場提供のギークラボ長野からも何かを出典したかった
・ギーラボが持つoculusとhololensを使って何か現実の物質を動かしたかった
・VR空間と現実の空間を繋げたかった
○課題
・oculusやhololensとカードリーダーを繋げただけでは、楽しめる人の数が限られる。また13歳未満の子供が楽しめない
→映像はモニターに出力、Oculusを使う人は大人から一人選出の方針
○結果できあがったもの
概要はこんな感じですが、順を追ってみてみましょう
まず、現実の空間に宝箱を置きます。
手前の謎の箱が宝箱です、奥にはラズパイとカードリーダーが置かれています。
まずは精霊を助けるためにVR空間にいきましょう!
1.VR空間
VRアプリの作成はVizardというあんまり有名ではないpythonでVRコンテンツを開発できるアプリを使いました。
単に僕がこれのお仕事を少しやったことがあるのでさくっと作れるというのが理由です。
VR空間の中ではそれぞれの絵画の中に精霊たちが閉じ込められているのでそれを助けてあげます。
ボールをぶつけて救出します!
ボールがぶつかるとサーバーに解除したよって情報をpostしてあげます。
気をつけたことは、前後左右への移動があるとVR酔をするので、自分は周囲を見回す以上の動きはできず、狙いを定めて左クリックでボールを投げるという動作のみにした点でしょうか。
マウスも無線タイプのものを使えば、自分は立ったままマウスだけを持ってぐるぐる回れますしね。
2.サーバー
サーバーは僕は作っていないのですがDjango+DjangoRestFrameWorkでさくっと作っていただきました。
デプロイもheroku+postgresDBを使えば一定の制限付きで無料なのでそれを使いました。
3.ラズパイ+カードリーダー
ここも全然わからないので、弊社の分かるものに作ってもらいました。
カードリーダーにNFC付きのカードタッチしてサーバーにpostするだけです。
4.カード
こんな感じのカードをデザインしました。
これをNFCのカードに貼り付けるだけです。
5.戦闘画面
unity分からない僕が泣きながら二週間で作りました。
画面は水のカードをタッチするとこんな風に泡が出てきて宝箱に攻撃します。
演出は稚拙でも音楽さえつければその場は乗り切れます。
6.戦闘+Pepper
戦闘中にPepperのカードを使うとその場にいるpepperも攻撃アクションを取るように作っていただきました。
超電磁スピンで攻撃します。
7.戦闘終了~宝箱の解錠
戦闘が終わると伝説の剣が画面にでてくるので、会場にも伝説の剣を持ってきます(人力)
そして宝箱の前で伝説の剣を振るうと!!!
宝箱が解錠され、開けると中からお宝がざっくざっく!!
この辺はMESHを使いました。
剣に取り付けた「動きタグ」が動くと、GPIOタグが通電してモーターを回し、鍵に非掛かった棒を外します。
そして、宝箱を開けると明るさセンサーに反応して宝箱の中に入れたスマホから「ごまだれ~」の音楽を流すという仕掛けです。
MESHは驚くほどかんたんに操作やアプリづくりができるので本物の電子工作マンからすると物足りないかもしれませんが、web屋からするとこんな簡単にアプリが作れるのはすごいと思います。
お高いですけど。。。
○振り返り
本来の構想ではHololensから宝箱の解錠をするつもりだったのですが、結局間に合わず。
VR部分と宝箱の解錠部分が実は全然つながってないという本来やりたかったことが実際にはできませんでした。
hololensはせっかく物質空間が見えるものですので、MR×物質世界というのが今後と続けていきたいテーマかなと思います。
当日は色々トラブルも有りましたが、どうであれ来場してくれた人を楽しませることができたならそれでいいかなと思います!
VRやMRをうまく物質世界と繋げてギーラボでしか体験できないみんなが楽しめるアトラクションづくりを続けていきたいと思います!
未来ずら〜! hololens体験会 in長野 の振り返り
㋃8日にギークラボ長野で行われたhololens体験会の反省点と振り返りになります。
○イベントの概要
時間:13時~17時で随時
参加人数:connpass上で16人(うち二人はスタッフ)
hololensの台数:2台(うち一台はダメdeath.py (@nakajidamedeath) の私物)
MixedRealityやhololensの概要の説明はせずに、とにかく装着してもらって体験することを中心に実施しました。
いや、単に用意するのが面倒なだけでしたが
○会場の雰囲気
とにかく画面をスクリーンに映しておけばいいでしょぐらいの感覚でhololensの画面をモニターに出力、あとは床を広く取れるように机をどけて広いスペースを確保しました。
結果的にはもっと広いスペース用意しておけばよかったかなぁと思います。
がまぁこれでも結構楽しんでいただけたかなと思います。
不特定多数の人が装着するので一応こういうものを用意して内側のバンド部分だけ何度か拭くようにしました。
反省点①
用意したアプリの数が少なかった。
hologramを置くアプリ、holotours、サソリみたいなのと戦う最初から入ってるゲームやhologiraffe等を体験してもらいましたが、事前にもっと面白いアプリを見つけて入れておけばよかったのかなとも思います。
基本的に英語のアプリばっかりなのでholotoursとかやっても英語分からないし飽きてしまいますよね。
hologiraffeなんかはその点、アプリ自体すぐに終わるし天井に穴が開く面白いシーンも見れますし、体験にはとても向いているような気がしました。
反省点②
待ち時間が長くなってしまう。
13時~17時の間でばらばらとお越しくださいとしましたが、結果的にはばらばらと来てくれたのでよかったのですが、一度に来ていたら結構みんな退屈してしまったような気がします(今回もあまり触れない方とかがいました)
体験会の応募をするときは例えば一時間単位で4人とかにした方がいいのかなと思います。
実際には長野みたいなところで2台もhololensがあって体験会ができる環境というのは地方としては結構恵まれているのと思うのですが、それでもやはり待ち時間ができてしまうのはよくないですね。
反省点③
スタッフが疲れる
基本的にはair-tapとブルームだけ教えて後は慣れながらやったくださいという感じのマンツーマンだったので、スタッフはずっと立ちながら体験者の相手をし続けなければいけません。
大変でした、、疲れました。。。
休憩時間を用意する、初心者用のチュートリアル資料を用意するなど事前準備が必要かなと思います。
反省点④
シェアリング機能を準備するべきだった。
せっかくhololensが二台もあるのだからシェアリング機能を使って驚きの体験!!
させたかったなぁ・・
反省点⑤
電池が切れた!
一台は単に充電が不十分でした。普通に使っても3時間ぐらい持つので100%充電しておけば途中充電という悲劇にはならないと思います。
充電はしっかりやりましょう!
反省点⑥
一人当たりの体験時間を決めていなかった。
割と適当にやってもらったので不公平感があったかもしれません。。
とはいえ、参加者の皆さんがその辺の気遣いができる方でしたのでよかったです
反省点⑦
上手く動かせない人がいた。
エアタップ慣れるまで難しいですよね。。。
基本操作のコツはどっかに資料化してほしいなぁと思うばかり。
良かった点
・スタッフが一台に一人ずつ貼り付けた点
これは大事です。上手く操作できない人のためにも必ず張り付きましょう
・スクリーンに画面を出しておくと体験していない人でも楽しめる
でも、なぜかholotoursは画面がでませんでした。。音は聞こえてくるのに。。何故でしょう。。
・少人数体験会は地方ならではのメリット
これは地方ならではだと思います。
東京で自由参加の体験やったら結構な列になったり一人5分とかになってしまうんじゃないでしょうか?
その気になれば30分でも体験できるのは地方ならではかなと思います。
ちなみにですが、誰もイベントタイトルに突っ込んでくれませんでした😢
みんなラブライブ!サンシャイン!!みてないのかなぁ・・・
hololensに関しては個人的にはどんどん推していきたいところなので、hololensの地方コミュニティといえば長野といわれるぐらいの感じで行きたいな!と思います!!
ちなみにですがギークラボ長野は平日は基本的に9時~18時ぐらいは空いているのでふらっとお越しいただければhololensもoculusRift(DK2)もPepperも体験できますのでぜひお越しください!
また4月22日に開催予定のオープンハードカンファレンス2017 Nagano – OSHWC
でもhololensアプリを展示する予定です!よろしくお願いします!