DjangoフレームワークとVue.jsを使ってアプリケーションを作る

DjangoフレームワークとVue.jsでアプリケーションを作る例として、テキストを編集保存するシンプルなノートアプリケーションを作ってみました。

github.com

f:id:nullpobug:20180318185136p:plain

Djangoのサーバーサイドレンダリングを使いつつ、Vueを組み合わせる一例として参考になればよいかなと。

Django側はDjango REST FrameworkでAPIを用意していて、意図的にテストコードは用意してません。

JavaScriptのほうは、Vue.jsを使いつつ、なるべくテストコードを書きやすいように作ってみました。

その他詳細は、リポジトリにREADMEがあるので参照してみるとよいかと。

コードに説明のコメントなども入れています。

Windows上のVirtualBox共有フォルダでシンボリックリンクを有効にする

ホストOSをWindowsVirtualBox上のゲストOSをLinuxとして、VirtualBoxの共有フォルダ機能を使った場合、Linux側で共有フォルダ内にシンボリックリンクを作ろうとすると、デフォルトでは許可されず、エラーが発生します。

vagrant@ubuntu-xenial:/vagrant$ ln -s test.txt test2.txt
ln: シンボリックリンク 'test2.txt' の作成に失敗しました: プロトコルエラー

Pythonのvirtualenvや、Node.JSのnpmを使うときにシンボリックリンクが使えないと不便なので、これを解消します。試したのはWindows 10、VirtualBox 5.2.8、Vagrant 2.0.2

※2018/3/12更新: 最初はWeb検索で出てきた情報で試してて、うまくいったように見えたので、その手順を記載していましたが、不要な手順があるなどの指摘をもらったので、再調査して記事を大きく書き直しました。

VirtualBoxの共有フォルダとシンボリックリンク

そもそもVirtualBoxは、どうやってWindows側にシンボリックリンクを作るかを調べました。VirtualBoxソースコードが公開されていて、コードも整理されているので簡単に見つかりました。

というわけで、Windowskernel32.dll にある CreateSymbolicLinkW 関数を使っています。

また、setextradata VBoxInternal2/SharedFoldersEnableSymlinksCreate/%s の設定でシンボリックリンクの有効、無効が切り替わります。

Windows10でシンボリックリンクの作成を許可する

Windows 10の場合、シンボリックリンクを作成する権限はデフォルトではAdministratorグループのみになっています。

「ローカル セキュリティ ポリシー」-「ローカル ポリシー」-「ユーザー権利の割り当て」-「シンボリック リンクの作成」に一般ユーザーのグループ(Users)を追加することで、一般ユーザーでもシンボリックリンクを作成できるようになります。

f:id:nullpobug:20180312020620p:plain

http://f.hatena.ne.jp/nullpobug/20180312020620

これにより、 CreateSymbolicLinkW 関数でシンボリックリンクを作成できます。

VirtualBoxの設定

VirtualBoxで共有フォルダのシンボリックリンクを有効にするため、設定をVBoxManageコマンドで変更します。

VBoxManageコマンドはVirtualBoxディレクトリに入っています。PATHが設定されていない場合は、直接ファイルを指定して実行します。

PS C:\Users\tokibito> & 'C:\Program Files\Oracle\VirtualBox\VBoxManage.exe' setextradata VM名 VBoxInternal2/SharedFoldersEnableSymlinksCreate/共有フォルダ名 1

Vagrantの場合

Vagrantでは共有フォルダは、デフォルトでVirtualBoxシンボリックリンク設定(VBoxInternal2/SharedFoldersEnableSymlinksCreate/%s)を有効にしてくれるので、Windowsのポリシーの変更以外は特に追加の設定は不要でした。

実行結果

vagrant@ubuntu-xenial:/vagrant$ ln -s test.txt test2.txt
vagrant@ubuntu-xenial:/vagrant$ ls -l test2.txt
lrwxrwxrwx 1 vagrant vagrant 0  2月 28 01:11 test2.txt -> test.txt

2018年

年初なので今年やりたいこととか考えて整理しておく。 まず去年のを見直す。

2017年 - 偏った言語信者の垂れ流し

見直してみると、2017年に書いたことはあんまりやれてない。 去年の後半は仕事とかで余裕がなかったかな。

今年はもうちょっと具体的な内容にしてみようか。

  • 家にある不要なものを捨てる
    • 数年使ってないものとか使いそうにないものは捨てる
  • 畑は、各季節ごとに収穫できるものを計画的に植える
    • 半年先ぐらいまでの計画を考える
  • 山歩きと街歩き(散策)をする
    • 行ったことある山と行ったことない山、ルートをいくつか
    • 関東圏の観光スポットや歴史的な場所などまだ行ったことのないところとか
  • お金周りは、資産形成の計画や保険を見直す、低リスクな範囲で色々試して知見を得る
  • 少なくとも二ヶ月に1回程度の頻度で車を運転して慣れる

『仕事ではじめる機械学習』を読みました

タイトルの通り『仕事ではじめる機械学習』を電子版で読みました。オライリージャパンさん献本ありがとうございます。 一通りざっと読んだくらいですが、感想を書いておきます。

Ebook: www.oreilly.co.jp

紙のほう(2018年01月16日 発売予定): www.oreilly.co.jp

対象の読者層

対象の読者層は、「機械学習を仕事で使っていくための基本的な知識がほしい人」といった感じですかね。

対象の読者については、本書の冒頭にも書かれています。

機械学習の入門教材は終えて、実務に活かしたいエンジニア

● 大学の講義などで機械学習を学んだ経験を、プロダクトに活かしたい若手エンジニア

また、本書の紹介文にはこう書かれています。

上司に「人工知能でいい感じの成果を出してくれ」とあいまいな指示をされたとき、本書で学んだことが活きてくるに違いありません。

難易度

  • Pythonコードや数式が出てきます。拒否感が出る人には厳しいかと思います。
    • 私は特に問題なく読めました。
  • 用語が多いため、つまみ食いのように途中から読み始めるには難しいかなと思いました
    • 用語の説明はあるので、冒頭から読む分には問題ないです
    • 用語を理解しないと読み進むのが難しい部分は多いです。けどこれは仕方ないかも

内容について雑多な感想

  • 機械学習とは何か?といったレベルから、用語やアルゴリズムをわかりやすく説明している
  • 機械学習をシステムに組み込むためのハウツーが載ってる
    • システム構成の図があって大変わかりやすい。
  • データを分析し、レポートを作るまでの業務フローを知れる
    • これも、私に馴染みのない業務なので、ノウハウを知れるのがありがたいです。
  • 内容を理解して覚えるには反復して読み直さないとちょっとキツイ。
    • 実際に実務で使えそうな内容だが、用語を使って説明される部分が多いので読み進めるのに時間がかかった
    • それだけ内容がつまっているというのと、そもそも機械学習ってそんなに簡単ではない気がする
  • 私は著者の方を知っているのもあり、読んでいると書いた人の姿が思い浮かんでニヤニヤしてしまった部分がいくつか。

まとめ

理解するには難易度は高いけど、丁寧に説明されていて、タイトルの通り「仕事ではじめる」に必要なことが載っています。

「仕事で機械学習に手をつける必要があるけど、どこからやればいいのかな?」という方にはとてもオススメです。

モデルクラスを継承してメソッドを追加する(proxyを使う場合)

この記事は Django Advent Calendar 2017 の7日目の記事です。

Djangoのモデルクラスを継承した場合、Metaに特に指定が無ければ、マルチテーブル継承となり、migrateを実行すると2つのテーブルができます。

モデルを継承して単一のテーブルにする方法は2つあります。

  • 親のモデルクラスでMetaに abstract = True を指定する
  • 継承した子クラスでMetaに proxy = True を指定する

今回は後者のproxyを指定する方法を紹介します。

https://docs.djangoproject.com/en/2.0/topics/db/models/#proxy-models

この方法は、継承元の親クラスがサードパーティライブラリ等から提供されて、直接書き換えられない場合などに便利です。

継承してproxyを指定したモデル

Djangoに組込みの django.contrib.auth.models.User を継承してみます。

from django.contrib.auth.models import User


class MyUser(User):
    """
    Userモデルを継承するが、新たにテーブルは作られない。
    """
    class Meta:
        proxy = True

    def display(self):
        """追加で定義したメソッド
        """
        print("{full_name}さん".format(full_name=self.get_full_name()))

呼び出し例

>>> from myapp.models import MyUser
>>> MyUser(first_name="Shinya", last_name="Okano").display()
Shinya Okanoさん

ハマりどころ

ForeignKeyなどで参照した場合には、継承した子クラスではなく、ForeignKeyで指定された元のモデルのインスタンスが返されます。

たとえば上記の例だと、 django.contrib.auth.models.Group などから辿った場合は、Userクラスのインスタンスになります。

>>> user = Group.objects.first().user_set.filter(first_name="Shinya").first()
>>> user
<User: >
>>> user.display()  # User.displayはない
Traceback (most recent call last):
  File "<console>", line 1, in <module>
AttributeError: 'User' object has no attribute 'display'

回避するには、proxyのモデルを起点にQuerySetを作るか、インスタンス__class__ を無理やり書き換えるなどですが、スマートなやり方が現状ないですね。

>>> user.display()
Traceback (most recent call last):
  File "<console>", line 1, in <module>
AttributeError: 'User' object has no attribute 'display'
>>> user.__class__ = MyUser
>>> user
<MyUser: >
>>> user.display()
Shinya Okanoさん

まあ、やっていきましょう。

Djangoフレームワーク組込みのドキュメントジェネレータ(django.contrib.admindocs)の紹介

この記事は Django Advent Calendar 2017 の6日目の記事です。

tell-kさんの記事 を読んでいて、「そういえばDjangoには組込みのドキュメントジェネレータがあるんで紹介しておこう」と思ったので書くことにしました。

タイトルの通り、 django.contrib.admindocs の紹介です。

Djangoフレームワークの黎明期からこの機能は存在してます。ドキュメントもあります。

The Django admin documentation generator | Django documentation | Django

使い方

  1. settings.pyのINSTALLED_APPSに django.contrib.admindocs を追加する。(django.contrib.adminも必要です)
  2. ROOT_URLCONFで指定されているurls.pyに url(r'^admin/doc/', include('django.contrib.admindocs.urls')), を追加する。(このとき url(r'^admin/', admin.site.urls) よりも前に書いておくことに注意する)
  3. 依存モジュールのdocutilsをインストールしておく。
  4. runserverを起動して、Djangoの管理サイトにログインし、右上のメニューに『ドキュメント』リンクがあるのでクリックで移動

動作例

admindocsでは、有効になっているDjangoのタグやフィルター、モデル、ビュー定義が一覧され、docstringなどの説明を参照できます。

f:id:nullpobug:20171206030638p:plain
ドキュメントのトップ

たとえば以下のモデルだとこんな感じ。Django2.0で試しました。

django-example-todo/models.py at master · tokibito/django-example-todo · GitHub

from django.db import models

# Create your models here.
class Todo(models.Model):
    """
    TODOのデータを扱うモデルクラス
    このクラスのインスタンス1つが、データベース上の1レコードに相当します
    """
    name = models.CharField("名称", max_length=50)
    done = models.BooleanField("完了")
    created_at = models.DateTimeField("作成日時", auto_now_add=True)

    def __str__(self):
        return self.name

f:id:nullpobug:20171206025819p:plain
モデルのドキュメント詳細

簡易なものですが、使える場面があるかもしれません。

1年の振り返りなど

この記事はpyspa Advent Calendar 2017の2日目の記事です。

https://adventar.org/calendars/2258

今年1年の振り返りなどいくらか。ほとんど畑の話。

去年畑を借りて、今年も契約を更新しました。

借りている市民農園の畑の使用料は1万円/年です。安い。

契約は最長3年で、3年目の終わりに返却することになるため、残りの期間はあと1年半ほどです。

いくつかの野菜は栽培に失敗しました。

  • 白菜
    • 収穫の時期を逃したせいで大きくなりすぎ、花が咲いた
    • 白菜の花って普通に菜の花やん

f:id:nullpobug:20170422112235j:plain
白菜の花

  • ほうれん草
    • 収穫の時期を逃したせいで大きくなりすぎ、花が咲いた
    • ほうれん草って1m超える大きさになるのか!
  • トマト
    • 植えた時期が遅すぎたか、大きくならず。

気温が変わると一気に育つので気をつけないとなー。

一方、うまくいったものも結構多い。

  • パセリ
    • 畑に植えたものは虫が付きやすく、土がかかって洗うのが面倒だったけど、日当たりがいいとよく育ったのでたくさん収穫できた。
  • たまねぎ
    • 土を盛って埋める必要があるようだった。なかなか大きくならない。

f:id:nullpobug:20170702205946j:plain
パセリとたまねぎともらった大根

f:id:nullpobug:20170709163259j:plain
チーズトースト(自家製のバジルとたまねぎ)

  • えんどうまめ
    • 暖かくなると一気に伸びるので、支柱を建てるのははやめにやったほうがよかった。2mぐらいまでは伸びる
  • きゅうり
    • 去年の種で普通に育った。育つの早すぎなので、苗の本数は3~4本まで減らしてよさそう。
    • 小さめでも取れるうちに取ったほうがよさげ。
  • とうもろこし
    • 虫に這われて食われる
    • 収穫量がそんなに多くないので、本数を増やすのありかも。

f:id:nullpobug:20170717113315j:plain
きゅうりととうもろこし

  • さつまいも
    • 植えてから根づくまでは、乾燥させないように気をつける必要があった。暖かい時期に植えるのだと、最初はかなり多めに水やりしてよさそうだった。
    • 夏場はつるが伸び放題になった。芋がら収穫して食べたけど、処理が面倒
    • マルチで覆って植えたの大正解だったけど、畝の間も覆ってしまったほうがよかったかも。
    • つるが伸びすぎて隣の畑まで出てしまったので、柵を予め用意したほうがよかった
    • 植え付けから110~130日程度で収穫した。かなり大きく育ってよかった。
    • 収穫後、数日乾燥させたほうが包丁が通りやすく、味もよかった。
    • 乾燥させればかなり長持ちするので、おすそ分けしやすい。

f:id:nullpobug:20171028140245j:plain
さつまいも(この量を3回ほど収穫した)

来年は以下を育ててみたい。

  • ナス
  • ピーマン
  • トマト
    • 春すぎには植えて早めに大きくしたほうが良さそう。
  • ローズマリー
    • 種からだと発芽率低いみたいなので、苗を買って育てるのでよさそう。

料理

洋風の調理や、揚げ物、煮物は少し上達したかな。作った野菜の保存処理なんかをもうちょっとうまくしたい。

魚料理の幅を少し広げていきたい。

仕事

プンコレ入社してから1年経ったの早い。ぼちぼちやっています。仕事の幅は広がったかな。

停滞しないよう、引続きやっていきたいと思います。