くりーむわーかー

プログラムとか。作ってて ・試しててハマった事など。誰かのお役に立てば幸いかと。 その他、いろいろエトセトラ。。。

2018年06月

ドメイン駆動設計

最近、エリック・エヴァンスのドメイン駆動設計て本を読んでるんですが、なんかグッと来たので覚えてるうちに書いておこ。まだ読み途中なんだけども・・・。難しい。。。

・ウォーターフォールは一方向

各工程を担当の人間がやるけど開発モデル上、後工程から前工程へフィードバックが無いよね。 「ソフトウェアを書き始める時、我々は対象を十分に理解しているわけではない」。メンバ間でフィードバックループ?して、継続的学習を実践しましょと。ウォーターフォールって各工程での分業を前提としてると思うんです。今までの経験上それは割とダメで、設計した人が実装した方がいいし、実装した人がテストした方がいい。ただ、一人で全部やるのはダメだと思う。その辺のさじ加減。。。

・ドキュメントはコード上の表現を補うもの

すでにコードが上手くやっていることを、ドキュメントでもやろうとするべきではない。コードはふるまいに関する正確な仕様書。ただし、設計ドキュメントとしてのコードにも限界はある。それは理解しやすいということではない。ドキュメントはチームの活動の役に立たなければならず、最新の状態を保たなければならない。コードの補足に絞る。

全てにおいて、コードを読めって事は自分はダメだと思ってるけど、会社で作ってる仕様書も意味ないと思ってる。無駄。確かにコードを補足するものとしてドキュメントを捉えれば、有意義なものが出来そうな気がする。ちょっとやってみよう。まぁでも、納品とかある場合は無駄なモン作んないとダメなんですけどね。それも給料のウチってやつか。契約時にどうにか出来ないもんか。その時に口出しできればいいんだけども。。。

・プログラマは設計

この発想は目から鱗的だった。確かにそう考えるべきですね。上手く説明できないんだけども。

「コードを生成する人々がモデルに責任を感じていない場合やアプリケーションのためにモデルを機能させる方法を理解していない場合、そのモデルはソフトウェアと無関係になってしまう」。なんかコレ、身に染みてわかる。

・利口なUI

最初これ、何言ってんのか分かんなかったけど、いわゆる、MVCでViewにロジック書くんじゃねー的な事ね。確かに利口なUIです。ただ、これが必ず悪ってわけじゃなくて、利点と欠点を理解してその場に応じてアプローチする。コレはダメみたいな思考停止すんなと。

DjangoとApacheとWSGIとWindows

Windows上でDjangoで作ったアプリをApacheからWSGIで呼べるようにする。

まーWindowsはいばらの道じゃ。

とりあえず必要な資源をダウンロードしておく。ApacheとかPythonとか。PythonはPIPとVirtualEnvも。

①Djangoで適当にアプリを作る。

仮想環境つくる
virtualenv venv

仮想環境での作業に変える
cd venv
Scripts\activate

Djangoをインスト
pip install django

Djangoのバージョン ⇒ 今回は2.0.6
python -m django --version

アプリを作る
django-admin startproject mysite

とりあえず動かして確認 ⇒ http://127.0.0.1:8000/
cd mysite
python manage.py runserver

②Apacheの準備

1.ダウンロードしたZipを適当なフォルダに展開しておく
2.confファイルの変更(Apache24\conf\httpd.conf)
 ⇒ デフォでC:\Apache24みたいになってるところを格納したフォルダのパスに全部変える。
3.動作確認 : コマンドプロンプト上でbin/httpd.exeで動かしたら「http://localhost」にアクセス
 ⇒ IT WORKS!!って出ればOK。ポート変えてる時はURLは適宜変える。

そしたら、胆のmod_wsgiのインスト。仮想環境上でやってもいいかもだけど、自分は本体(って言い方であってんのかな)の方にインストした。windowsでインストールするやり方は昔はアレコレ大変だったようですが、今は割と楽。調べてて、昔のやり方ではまりそうになったんだけど、mod_wsgiのGitのReadmeにちゃんと書いてあった。やっぱ一次情報をちゃんと読まないとダメですね。これには大部分が昔のやり方で載ってるんだけど、一番上にここに載ってる事はもうやんなって書いてありましたね。

で、今のやり方は↓。

pip install mod_wsgi

これだけ。随分楽になったようで。・・・が、ApacheをC:の直下に展開してないとエラーが出ると言う罠。「No Apache installation can be found. Set the MOD_WSGI_APACHE_ROOTDIR environment to its location.」っていうエラーが出る。C:直下以外にある場合は、この環境変数setしてからじゃないとダメっぽいですね。stackoverflowに質問もあった。 という事で、C:直下以外にある場合は↓の感じ。

set "MOD_WSGI_APACHE_ROOTDIR=F:\Apache32\Apache24"
pip install mod_wsgi

で、Apacheには32bit版と64bit版があるんですが、64bit版だとこれでもまだ変なエラーがでる。あきらめて32bit版にしましたとさ。。。

あと、自分のPCにはVisualStudio2017も入ってるんですが、上記のStackOverflow見てると、VisualStudio入ってないとダメそう?mod_wsgiのインストールの中で、コンパイルしてるっぽい?

インストール出来たら↓。

mod_wsgi-express module-config

上記のコマンド実行すると↓感じの設定文字列が出てくるので、これをApacheのhttpd.confにコピペする。

LoadFile "f:/python36/python36.dll"
LoadModule wsgi_module "f:/python36/lib/site-packages/mod_wsgi/server/mod_wsgi.cp36-win32.pyd"
WSGIPythonHome "f:/python36"

そしたら、あとはDjangoの公式に載ってる設定をhttopd.confに追加しておしまい。最終的にhttpd.confに追記するのは↓。

LoadFile "f:/python36/python36.dll"
LoadModule wsgi_module "f:/python36/lib/site-packages/mod_wsgi/server/mod_wsgi.cp36-win32.pyd"

WSGIPythonHome "f:/py/venv"
WSGIScriptAlias /mysite "f:/py/venv/mysite/mysite/wsgi.py"
WSGIPythonPath "f:/py/venv/mysite"

<Directory f:/py/venv/mysite/mysite>
<Files wsgi.py>
Require all granted
</Files>
</Directory>

WSGIPythonHomeはDjangoを使ってる仮想環境のルートを指定するっぽいですよ。これで、WSGIScriptAliasで指定してるURLにアクセスすればDjangoが動くという寸法です。ただ、なんだかデフォのままだとトップページが出ないぽいので、「/mysite/admin/」みたいに中のURLまで行かないとダメな感じ?あんま調べてない。まー動いたから良しとしよう。

あーあと、MariaDB使ってるんですが、開発環境上だと「pip install PyMySQL」だけで動くんだけど、Apache通すと動かない。エラーログに「Did you install mysqlclient?」って出てくるから「pip install mysqlclient」でインストールしたら動くようになった。なんだろね。。。

イベント駆動とデータ駆動

最近Vueを使ってるんですが、自分がjQueryに染まってる事が凄く実感できたので、ちょっと書いておく。世の中の人達からしたら当たり前の話なのかもしれませんが、自分には久しぶりのパラダイムシフト的な実感があったので。。。頭悪くてごめんなさい。

端的に言うと、イベント駆動からデータ駆動での作りの頭に切り替えられたという話。

例えばボタン押して表示・非表示を切り替える的なやつ↓。

・イベント駆動 jQuery

・データ駆動 Vue

どっちがいいとかそういう事では無く、色々書いてく中で、両者の違いが体で分かってきた。自分、たくさん書いて体で覚えないと腑に落ちてくれない出来の悪い子なもんで。

Vueで書いてると、どうしてもjQueryの時みたいに、その場面場面で、イベント発生に対して何かを制御するという発想で考えている事に気付いて愕然としたのです。ダメだとは全然思ってないけど、思考回路がイベント駆動に染まってんなと思いまして。

なんでイベント駆動の頭なのか考えてみたときに、データが変わるにしろ、画面が変わるにしろ、何かが変わるっていう事は、何かのイベントが定義されていて、それに反応して動作するっていうロジックがコンピュータの根本的な動作だとイメージしてるからなんだと思う。極論すればコンピュータで動いてる以上、全てはクロックに反応してるわけですし。。。

リアクティブっていう概念が理解できてなかったですね。というか、リアクティブって究極のイベント駆動ってことなんだなと思った次第でして。全てのアクションに対して即反応するっていう感じみたい。まぁ違うんでしょうけど。

データ駆動はデータの変化をリッスンするサービスみたいなイメージなのかしら。今のとこそういう理解に至りました。

問合せ