脱職エントリー

いつか退職エントリーを書いて一人前のエンジニアを名乗りたい

焦燥感に駆られてるエンジニアは高海千歌を目指せ

最近仕事が忙しかったので癒やしを求めてラブライブ!サンシャイン!!を見直してました。

改めて見てみると自分のようになにか焦燥感に追われてるエンジニアを前向きにさせる良い内容だったので色々思うところを書いておこうと思います。

 

ラブライブ!って何?

ラブライブ!サンシャイン!!はタイトルにもあるようにラブライブ!というスクールアイドル達が競い合う大会の名前から取られています。

1作目のラブライブではμ'sというユニットの9人の女の子達の物語が描かれ、ラブライブ!サンシャイン!!では沼津に住むAqoursというユニットで同じく9人の物語が描かれている。

が、別にラブライブ!での大会の優勝を目指して努力する話でもないし、ラブライブ!自体についてはあまり描写されず、むしろ、メンバーそれぞれの悩みの克服や欲求を叶える場としてスクールアイドルを始め、そして地区予選を突破して東海予選に出場するところで第一期は終了しました。

念のために添えておくとスクールアイドルとして頂上を目指すサクセスストーリーではありません。

高海千歌は何故スクールアイドルを始めたのか?

本作で重要なことは彼女たちがスクールアイドルを始めた動機にあると思ってます。
主人公の高海千歌は「このまま何もしないままだと普通になっちゃう」という焦燥感と
街頭モニターで見たμ'sの映像に衝撃を受けてスクールアイドルを始めることとなりました。

元々「輝きたい」というシンプルな欲求で、それを満たすためスクールアイドルという場が提供されただけで、実は水泳でも、サッカーでもなんでも良かったんじゃないかと思います。

もちろん、アイドルが歌って踊る映像はとても輝いて見えますのでスクールアイドルであることは作品の動機付けを補強することに意味が合ったと思います。

 

焦燥感にかられたエンジニアは何故スクールアイドルを始められないのか?

スクールアイドルというのは比喩でここではプログラミングスキル向上のための活動と置き換えてください。
掲題の回答としては単純にいうと現実との折り合いが付かないからです。
1日最低8時間働いて通勤で+1時間以上かけて、アニメも見たいし姪っ子とも遊びたい自分としてはプログラムの勉強にかけるコストなんて残っていないというのが本音です。

また、面白そうな分野というのもたくさんあって、AWSMicrosoftも次々と新サービスを提供してきますし、機械学習、IoT、VR、フロントエンド、バックエンド、インフラ、スマホアプリ・・等々やってみたら面白そうなこと、楽しそうなことで世の中は溢れかえっています。

千歌ちゃんがスクールアイドルを選択出来るぐらい簡単に何かを選ぶことが難しい時代になってきていると思います。

本作で、曜ちゃんが飛び込みかスクールアイドルかを悩むシーンはありませんし、(梨子ちゃんに関してはピアノの大会かラブライブ!地区予選かで悩むシーンがありましたが)3年生組が受験勉強に追われる描写もありません。

作中からそういった現実との折り合いやスクールアイドル以外のタスクに追われる描写の存在を想像することはできません。

しかし、少なくとも彼女たちは夏休み返上で特訓をしています。
持てる時間はすべて練習に当てているのです。
そうです、エンジニアとAqoursの違いはモチベの有無なんじゃないかと思います。

自分のモチベを捧げられる何かを発見出来ていないのが一番なんじゃないでしょうか?

 

高海千歌も挫折している

本作の最後に少しだけ触れられていますが、千歌ちゃんもスクールアイドルを始める前に何か色々やってみては辞めてるようなことを母親が示唆していたように、千歌ちゃんもまた、スクールアイドルにたどり着く前に多くのことを始めては挫折していたことがうかがえます。

焦燥感に駆られたエンジニアも本を買ってみたり勉強会に出るなどしつつも結局少し手を付けて辞めてしまうことは往々にしてあるのだと思います。

挫折してもそれでいいと、ラブライブ!サンシャイン!!は教えてくれています

そうです、「君のこころは輝いているかい」の歌詞は以下のように挫折しても立ち上がることの重要性を説いています。

君はなんども立ち上がれるかい?
胸に手をあて"Yes!!"と笑うんだよ
まだ出会いにどんな意味があるか
知らないけれどまぶしいね 僕らの夢 

 

この先がどうなるか分からないけど立ち上がることを述べるのは、先が見えず将来が分からない世界や社会の情勢の中で、立ち上がり続けることで状況に対応しようという現代人へのメッセージが込められているようにすら感じます。


色々手を付けては辞めてしまい、結局中途半端だった高海千歌にとって、スクールアイドルを始めて東海大会に進み、九人(地区予選では8人だったため)であの舞台で彼女の輝きたいという物語は達成してしまっているのです。

だから僕は二期は不要だと思います。
二期になってファンアート的にみんながわいわいする話は、ちょっとした後日談的なOVAなどとしては面白いかも知れませんが、すでに完結した物語をそこまでと同じかそれ以上の分量で描くことは物語としていけないと思っています。
もし、二期や劇場版が必要だとするなら、それはAqoursの後継者を作るために彼女達を伝説に仕立て上げるという作業だけでしょう。

 

最後にもう一つ、Aqoursの歌の中から歌詞を引用して終わりたいと思います。

特に最後の1行が大好きです。

届かない 星だって
手を伸ばす勢い持って
届かないって決めないで
手を伸ばせ それから悩め!

 

30を超えて普通にすらなれない底辺エンジニアの僕にとって手を動かすこと、挫折しても次を見つけて立ち上がり続けること、Aqoursの九人は本当に大切なことを教えてくれると思います。

 

しかし、30超えたおっさんが女子高生の生き方に感動するってキモチワルイデスネ

AWSのcentos+nginxでオレオレ証明書〜クライアント証明書+Let'sEncryptに証明してもらうまで

2日ぐらい作業をしたのですが、結構無駄に時間を食ってしまったので詰まりポイント等をメモしていきます

1.各証明書系を作る

qiita.com

4番以降はApacheの設定の話なのでスルーします。

2.作った証明書をnginxに設定する。

/etc/nginx/nginx.confを直します。

server {
listen 443 ssl; # ssl on; ではなく、listen に書くのが推奨
server_name domein名を書く!;

# server certificate
sl_certificate /etc/pki/CA/certs/ドメイン名.crt; # サーバのSSL証明書。

# server privatae key
# ssl_certificate_key /etc/pki/CA/private/ドメイン名.key; # サーバの秘密鍵。

ssl_verify_client on; # クライアント認証
# ssl_verify_depth 10; # 中間CA を使う場合のみ

# CA certificate
ssl_client_certificate /etc/pki/CA/cacert.pem; # プライベートCAの証明書
}

正直、どのファイルをどこに置けば良いのか全然分からないので最初にそこで詰みました。
どれがなんのファイルか理解しないと行けませんね

あと、reloadしたらエラーになって動かないこともあるので事前にチェックができます。

# which nginx
/sbin/nginx
# /sbin/nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
# 

3.Let'sencryptで証明書を無銭で証明してもらおう

オレオレ証明だとchromeさんがこんな感じにエラーを吐きます。(画像は参考です) f:id:darakunomiti:20170617115533j:plain

ちなみに長野県のサイトは未だに証明書系がおかしいのですが、いつ直るのでしょう・・

とにかくサーバーの証明書をちゃんとしたものにするためにlet'sencryptというものを入れます。
これをやるとレッツエンクリプトさんが認めたサーバーだからOKとchromeさんも怒らないみたいです。

基本的な手順書はこちtkuchiki.hatenablog.com

4.証明書をnginxさんに教えて上げよう

confをこんな感じに設定を直しましょう。

server {
        listen 443 ssl; # ssl on; ではなく、listen に書くのが推奨
        server_name ドメイン名;

        # server certificate
        ssl_certificate /etc/letsencrypt/live/ドメイン名/fullchain.pem; # let's encrypt ★ここを変更
        # server privatae key
        ssl_certificate_key /etc/letsencrypt/live/ドメイン名/privkey.pem; # let's encrypt ★ここを変更        

        ssl_verify_client on; # クライアント認証
  
        # CA certificate
        ssl_client_certificate /etc/pki/CA/cacert.pem; # プライベートCAの証明書   
     }

詰まったポイント

1 t2.microだとメモリーが足りなくて落ちる

./certbot-auto certonly –webroot -w /usr/share/nginx/html -d your.domain –agree-tos -m your@email.address –debug をやった際にmemoryが足りないぞと怒られます。 しかし、それ以外にもgccのインストールで失敗してるとかpip のバージョン上げろとか色々出てるので混乱するんですよね (エラーログはすみません、残ってません)

対策) メモリーを増やそう! swapというのを使えばいいみたいです。 oh-sky.hatenablog.com

2.IP制限をかけていたのでLet'sencryptさんが自分のEC2に繋げられずにエラー

koty.hatenablog.com こちらに書かれてるとおりです

アクセス元の66.133.109.36 は固定されたIPのようなので、次回からはこのIP指定でアクセス制限しても良いかもしれない。

書かれているとおりセキュリティグループに上記を追加したら上手くいきました。

3.well-knownに繋がらない

let'sencryptは/usr/share/nginx/html 配下に .well-known/acme-challenge/ランダム文字列 で何かを作りますがここにアクセス出来なくて困っていたようです。
なのでnginxさんにこちらのlocationを作って上げないと行けませんでした。

    server {
        listen 80; # ssl on; ではなく、listen に書くのが推奨
        server_name ドメイン名;
        location ~ /.well-known {
            root    /usr/share/nginx/html;
        }
    }

これを追加します。 正しいのかどうかはよく分かりません(^_^;)

4.chromeだけエラーを出し続ける(T_T)

上記の設定でsafarifirefoxでは証明書系の警告がなくなりましたがなぜかchromeだけで続けるんですよ!
プライベートブラウズしても!

多分の回答)nginxに中間証明書はないぞ!

# ssl_verify_depth 10; # 中間CA を使う場合のみ

手順書にこういう話があったので上記の1〜3で困ったときに中間証明書の設定をonにしたりoffにしてみたりしてました。
が、よくわかりませんがこの設定がonになってるとchromeさんだけ証明書を更新してくれず?エラーを出し続けます。 これを切ってnginxをreloadすることで無事chromeでも証明書の警告がでなくなりました。

これでひとまずクライアント証明書ができて、クライアント証明書を持った人が警告なしでサイトを開けるようになりました!

問題は期間が短いのでこいつを延ばしてやる必要があります。。(以下次号)

wordpressの記事をDjangoを使って変換してくれるツールがあった

wordpressの記事は表示されるhtmlそのままではなく、何故かpタグがない状態で保存されています。
表示する際はwpautopってツールを通すと上手いことpタグを付与して実際に表示する際のイメージに変えてくれます。
つまりwordpressのデータをそのまま表示してもhtmlとして欠損しまくってて上手く動かないんですね。

で、そのwpautopをDjango用に移植してくれた神ツールがあったので紹介しておきます。

https://gist.github.com/ckelly/7901124

しかし、これ4年前のものとあってpython3系では動きません。

ということでpython3で動くようにforkしたものを上げておきました。
linebreaks_wp.py · GitHub

 

gistとかよく分からないので書き方の指摘あったら誰か教えてください。

 

ちなみにこのツールが本当に正しく動くのかどうかも不明。。

体感的には結構ちゃんと動いてる感じがします

MySQLユーザ会会 in 長野 2017に行ってきた

このイベントの参加メモです。

が、自分が無知すぎるので、せっかく東京から凄い人たちが来たのに自分は1割も理解に及んでないので申し訳ないなぁと言う気持ちと罪悪感から当エントリーはスタートしてます。

nseg.connpass.com

 

ちなみに筆者はDjangoのオーアールマッパーに頼り切った生活をしているため、裏側がmysqlなのかpostgresなのかsqlite3なのかすら意識することなくDjangoの処理を書いているため、さすがにそれじゃ不味いだろうなと言うことは頭の片隅に置きつつも今のところあんまり困っていない現状があったりします。

こんな話を聞くと登壇された方々は怒り出すか軽蔑するかも知れませんが、少なくとも2017年5月時点までの仕事でそ辺りの知識が必要になったことがないのです。

極端な話、ニューギニアの狩猟採取民族に向かってスマホも使えない野蛮人だと言ったところで彼らの生活に必要なスキルじゃないんだからしょうがないよねって思ってください。(必死の予防線)

 

MySQLとは - 坂井 恵(@sakaik)

 

データベースとは、mysqlとはについて簡潔にまとまっていました。
今のバージョンがいくつで次はこれみたいな基本的な話も聞けました。
(InnoDBとかMyISAMってなんなんだろうという疑問は後で調べてなんとなく分かりました。)

 

MySQL 8 - @RKajiyama

(資料見つからず)

なんとMySQLの中の人による、MySQL8で導入される新機能についての色々な説明です。

色々あるみたいですが、MySQL8はめっちゃ早くなる、デフォルトのエンコーディングがutf8mb4になるので絵文字が使える。ロックの粒度が変わるぐらいしか理解の範囲にありませんでした。

(個人的には昔知らずに標準のママlatin1で建てて、日本語入らないよ〜って泣いた経験があるので世界標準のデータベース製品目指すなら必然じゃないのかなとも思いますし絵文字とかが標準で使えるのはいいですね)

 

〇 yoku0825を支える技術 @yoku0825

 

大変恐縮ですがなんの話をしているのか分かりませんでした。

 MySQLって”私のSQL”って意味だと勝手に思っていたのですが開発者のお子さんの名前だったんですね。

 

〇Transactd PHP ORM - BizStation Corp.(@bizstationcorp)

PHPのORMの紹介です。(資料見つからず)


(すみません、PHPを知らないため、ふーんという感じでなんとなくで聞いてました。。いつかこの製品を使う場面に迫られたら思い出します。)

 

 

〇 MySQL文字コード - とみたまさひろ(@tmtms)

 

当日の資料は見当たりませんでしたが1つ前のバージョンは見つけました。

www.slideshare.net

 

エンコーディングとキャラクターセットの違いの意味がようやく分かりました。
日本語の厳密な検索は色々とめんどくさいなぁという印象です。
検索はいつでも使うことなので、お客様に検索がおかしいとか突っ込まれたら思い出そうと思います。

 

 

〇まとめ

懇親会でも色々と話を伺いましたが、まぁ何だか分からないけど熱いなぁと、最近はAWSのRDSを建てて後は全てamazon様に全てをゆだねているシアトルの植民地的な生き方を選んでいるのですが、やはり、会社に何人か、できればチームに一人とかインフラにめっちゃ詳しい人も必要だなぁと思いました。
そして今のところ、コンソール画面が苦手な僕にはインフラエンジニアとしての生き方はできないなぁとも思いました。

 

困ったときには今日の資料を思い出せるようにしたいですね。

あとはMySql8は今日聞いた話では超高性能っぽいので使って見たいですね!(postgresとどっちが早いんだろう)

 

MyNaのシールを頂きました。

mynaって鳥みたいです。

https://www.google.co.jp/search?q=myna&source=lnms&tbm=isch&sa=X&ved=0ahUKEwjdqbPpte7TAhXHv7wKHdeOBCcQ_AUICigB&biw=1180&bih=613

f:id:darakunomiti:20170514121543j:plain

 

これをmacに貼る覚悟はできていないのでそっと机に閉まっておこうと思います。

 

Django入門その後に(8)〜TとVを追加してとにかく動かす〜

ここから先は少し複雑で、いくつかのことを同時に直さないと動かすことができません。
まずはやることを図示します。

urlにアクセスしたとき
f:id:darakunomiti:20170506181417j:plain

最初のMTVモデルではurlについて説明をはしょりましたが、実際にはurlがcontrollという役割を担います。
MTVのViewの前にどのViewを呼ぶかを振り分ける、コントロールという処理があるんですですね。

流れとしては、①プロジェクトのurls.py→②アプリケーションのurls.py→③アプリケーションのViews.pyの指定したメソッド→④取得したデータをtemplateに詰めて返す

処理の順番に従うと①から書くのが良いと思うのですが、①を書くためには呼び出す②が必要で、②を書くには③が・・となるので④番のtemplateから書いていこうと思います。

最終的に何を表示したいか

最終的には先ほど登録したゆきよ様の名前を1行表示します。

④template置き場を作ろう

templateの置き場はまぁ諸説ありますが、seiyuu_info/info/template/に置こうと思います。

  • seiyuu_info/info/直下にtemplatesフォルダを追加します。
  • その中にlist.htmlを追加します。
  • htmlを以下のように修正します。
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>ゆきよ様</title>
</head>
<body>
<p>{{seiyuu.name}}</p>
</body>
</html>

ここでは{{seiyuu.name}}にデータベースから読み出した声優さんのお名前を表示します。{{ }} 二重の中括弧に括られた中にデータベースから取得したお名前を表示します。
なお、筆者はwebapiばかり作っているhtmlど素人なので、自分の勉強もかねて素のhtmlで行こうと思います。

③Viewを追加しよう

次にView(処理)を書きましょう。

seiyuu_info/views.py
from django.shortcuts import render  # レスポンス用の関数
from info.models import Seiyuu  # データベースを使えるようにする 

# Create your views here.


def get_yukiyo(request):
    """ゆきよ様のデータを返す"""

    seiyuu = Seiyuu.objects.get(name='藤井ゆきよ')  # 声優さんTBLからゆきよ様のデータだけ取得します。
    return render(request,
                  'seiyuu_list.html',  # 使用するテンプレート
                  {'seiyuu': seiyuu})  # テンプレートに渡すデータ

seiyuu = Seiyuu.objects.get(name=‘藤井ゆきよ’)

ここでは名前が'藤井ゆきよ'であるようなレコードをselectしています。
テーブル名.objects.get(条件)とすることで、Seiyuuテーブルの中身を一件だけselectできますが複数件(または0件)来た場合はエラーとなります。
条件の書き方も色々ありますが、今回は field名=‘条件文'という書き方にしました。
ここは感覚的に分かるかなと思います。

レコードを取得したら、次にrequestデータを受け取って、レスポンスデータを返します。
テンプレートは先ほど作成したseiyuu_list.htmlです。
seiyuu_list.htmlでは{{seiyuu.name}}を表示ししようとしていますので、seiyuuというレコードをそのまま渡します。

viewを呼ぶとtemplateにデータを詰めて返すところはできました。
しかし、まだurlにこの処理がどのurlから呼ばれるか書いていないので追加しましょう。

②アプリケーションのurlからlistを呼ぶ処理を書く

アプリケーションinfoでurlとviewを繋げます。
seiyuu_info/info/urls.pyを追加する

``from django.conf.urls import url from info.views import get_yukiyo # ゆきよ様のデータを呼び出す関数を追加

urlpatterns = [ url(r'^get_yukiyo/$‘, get_yukiyo), # http://XXX/info/list にアクセスされたらseiyuu_listの関数を呼び出す ]```

①プロジェクトのurlsからアプリケーションinfoを呼ぶ

webプロジェクト全体とinfoプロジェクトを繋げます。
ここについても、開くと英語でなにか書かれていると思いますが、あそこを参考にすれば大丈夫です。

from django.conf.urls import url, include # includeの追加
from django.contrib import admin

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^info/', include('info.urls')) # 先ほど追加したinfo.urlをinclude(良い翻訳が浮かばない)する
]```

include('info.urls')についてですが、この書き方をすることで、 info/urls.pyに書かれた全てのurlを取り込むことができます。(今回はyukiyoしかありませんが・・)</br> 

この時点で以下のアドレスにアクセスするとお名前が表示されていると思います。

[http://127.0.0.1:8000/info/yukiyo/:title]


まずはこれで最低限の疎通ができました。
これ以降はMVTのそれぞれに絞って細かく見ていこうと思います。

Django入門その後に(7)〜Adminサイトを見てみよう〜

ここではDjangoでGUIGUIデータの投入が行えるadminについて見ていこうと思います。

1.その前にスーパーユーザーを作ろう

adminサイトを作る前にスーパーユーザーを作りましょう。
当たり前の話ですがadminサイトが誰からも見えてしまったらセキュリティ上とんでもないことです。
ログインは必須なのでその権限を持ったスーパーユーザーをつくりましょう

$  python manage.py createsuperuser
Username (leave blank to use 'XXXX'): admin
Email address: amind@email.com
Password: minadminad
Password (again): minadminad

こんな風にユーザー名、メールアドレス、パスワード(8文字以上、usernameと似た名前はダメ)を決めると作られます。
もう分かってるかも知れませんが、スーパーユーザーの情報はDjangoで最初にmigrateしたときに自動的に作られたUserテーブルに保存されています。

2.DjangoAdminを書こう

seiyuu_info/info/adminを見てみましょう。

まだこれしか書かれていません

# Register your models here.

さくっとSeiyuuモデルを追加してみましょう。

from django.contrib import admin
from info.models import Seiyuu  # Seiyuuクラスをimportする
# Register your models here.


class SeiyuAdmin(admin.ModelAdmin):  # 声優アドミンのクラスを宣言
    pass

admin.site.register(Seiyuu, SeiyuAdmin)  # 決まった書き方
# 書き方
class [モデル名]Admin(admin.ModelAdmin):  # 
    pass

admin.site.register([モデル名], [上記のクラス名])  # 決まった書き方

Djangoを実行して確認してみよう

$ python manage.py runserver

そして、アドミンサイトに入ってみましょう。

http://127.0.0.1:8000/admin

ログインするとなにか画面ができてますね!

f:id:darakunomiti:20170506022334j:plain

早速Seiyuusの所を押してみましょう

f:id:darakunomiti:20170506023704j:plain

適当に入力してSAVEを押すと一覧にゆきよ様が追加されましたね!
ちなみにこの記事を書いてるときはサカサマのパテマを見てるのですが、普通のヒロイン感あっていいですね。 こういう役もっとやってもいいと思います。
f:id:darakunomiti:20170506023727j:plain

一覧から開くとこんな感じで修正や削除ができます。

f:id:darakunomiti:20170506025228j:plain

後は感覚的にadminサイトを扱えると思います。一旦これでデータをGUIGUI作れるようになりました。
いよいよ。MTVモデルのTとVを一緒に作ろうと思います。次回はちょっと作業が多くて大変かも知れません。

Django入門その後に(8)〜TとVを追加してとにかく動かす〜 - 脱職エントリー

Django入門その後に(6)〜migrateって何〜

今度こそ遂にようやくデータベースに反映しますがその過程について少し細かく書いていこうと思います。

マイグレートに関する3つのコマンド

マイグレートってなんぞ
f:id:darakunomiti:20170506011702j:plain

マイグレーションにはざっくり3つのコマンドがあります。

  • showmigration: 今のデータベースへの反映状態を表示する
  • makemigraiton: models.pyの内容を読んでマイグレーションファイルを作る
  • migrate: マイグレーションファイルの内容をデータベースに反映する

それぞれについて細かく見ていきましょう

①showmigrationで反映状態を確認しよう

$ python manage.py showmigrations とコマンドを打ってみましょう

 [X] 0001_initial
 [X] 0002_logentry_remove_auto_add
auth
 [X] 0001_initial
 [X] 0002_alter_permission_name_max_length
 [X] 0003_alter_user_email_max_length
 [X] 0004_alter_user_username_opts
 [X] 0005_alter_user_last_login_null
 [X] 0006_require_contenttypes_0002
 [X] 0007_alter_validators_add_error_messages
 [X] 0008_alter_user_username_max_length
contenttypes
 [X] 0001_initial
 [X] 0002_remove_content_type_name
info
 (no migrations)
sessions
 [X] 0001_initial

多分こんな感じにでてくると思います。
最初にDjangoが標準で作るdjango_migrationsを表示しています。

②makemigration

反映状態を確認したらマイグレーションファイルを作ってみましょう。

Migrations for 'info':
  info/migrations/0001_initial.py
    - Create model Seiyuu

なんかでましたね

ここでもう一度先ほどのコマンドを叩いてみましょう $ python manage.py showmigrations

 [X] 0001_initial
 [X] 0002_logentry_remove_auto_add
auth
 [X] 0001_initial
 [X] 0002_alter_permission_name_max_length
 [X] 0003_alter_user_email_max_length
 [X] 0004_alter_user_username_opts
 [X] 0005_alter_user_last_login_null
 [X] 0006_require_contenttypes_0002
 [X] 0007_alter_validators_add_error_messages
 [X] 0008_alter_user_username_max_length
contenttypes
 [X] 0001_initial
 [X] 0002_remove_content_type_name
info
 [ ] 0001_initial ★なんかできてる!
sessions
 [X] 0001_initial

次にフォルダを覗いてみましょう seiyuu_info/info/ f:id:darakunomiti:20170505234128j:plain

0001_initial.pyというのができていますが、これがマイグレーションファイルの実体になります。infoapiには未反映の0001_initialというマイグレートファイルがあるよということですね。
ちなみに反映済みになると先頭の[]が[X]になります

3.migrate

実際に反映するにはmigrateというコマンドを打ちます。

$ python manage.py migrate

  Apply all migrations: admin, auth, contenttypes, info, sessions
Running migrations:
  Applying info.0001_initial... OK

これでデータベースにデータが反映されました。

せっかくなので実際にデータベースを開いて確認してみよう

$ sqlite3 db.sqlite3
sqlite> .schema info_seiyuu
CREATE TABLE "info_seiyuu" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "name" varchar(255) NOT NULL, "gender" integer NULL, "birth_day" date NULL, "created_at" datetime NOT NULL, "updated_at" datetime NOT NULL);

info_seiyuuというTBLが作られています。

  • 名前はSeiyuuではなく [アプリケーション名]_[Djangoに書いたTBL名]で作られますが実際にDjangoで操作するときに意識することはありません。普通にSeiyuuで扱います。
  • IDなんて宣言した覚えがない!→これは定義するときにPKを指定しないとDjango側でIDという名前でPKを自動で作ります。これは大事です。

れで、遂に、やっと、Djangoとデータベースが繋がりました。
ドカベンが柔道から野球を始めるまでに6巻、まどかが魔法少女になるまでに12話掛かりましたが、このチュートリアルは記事6本使って、まだMTVのMしか終わっていませんが一つ一つを丁寧に理解しながら進むことで、色々応用が利くので、ゆっくりと進みましょう。

次回はこれらを登録・更新・削除するadminサイトについて見ていこうと思います。

Django入門その後に(7)〜Adminサイトを見てみよう〜 - 脱職エントリー