ブロックチェーンが気になる
ブロックチェーンという言葉をよく耳にする。いわゆるバスワードだ。
以前は金融関連の技術?程度だったのですが、2017年の秋頃のQiitaの「先週いいねが多かった投稿ベスト20」で
qiita.com
の記事を見て以来 ブロックチェーン が気になって仕方がない。
仮想通貨が話題になってるから、ちょっと胡散臭い感じがするのだけれど、
そういうものではなく
であることを知ってとても気に入っている。
ブロックチェーンの本を読んだり、
ネットでの検索もブロックチェーン関連が増えてるので、
Googleさんもどんどんお勧めしてくる。
考え事の第一優先事項になっている。
ブロックチェーン とは
以下のような特徴の「データ管理のしくみ」だ。
- いくつかの取引データをまとめてブロックにする。
- 1つ古いブロックと新しいブロックが数珠つなぎ(チェーン)のデータ構造。
- 一番最初の取引からすべて数珠つなぎで記録されてる。
- これらの数珠つなぎデータをネットワーク参加者みんなが持ってる。
⇒ 後で改ざんするのが超メンドクサイ(事実上改ざん出来ない)
- みんながデータ持ってるので単一障害点がない。
- 暗号化。
- みんなが取引をチェックして承認する。
- 頑張ってチェックした人には報酬。
⇒ 安全
⇒ 個人の利益のための行動がみんなの利益になるしくみ
- 謎の人物(サトシ・ナカモト)の論文を元に有志プログラマーが開発
⇒ なんかカッコ良い
ザックリ言うとこんな感じ。
分かり易い説明を発見
ブロックチェーンの仕組み 〜初心者のためのわかりやすい解説〜
5分でわかるブロックチェーンの基本的な仕組み
そして、あるロシア人の少年が「ビットコインでスクリプト使えるようにしようぜ」と提案したけど却下されてイーサリアムが始まったらしい。
ブロックチェーンの説明でよく一緒に登場するスマートコントラクトです。
スマートコントラクト
「効率的な契約」でしょうか。
ブロックチェーンに取引データがあるわけですが、その取引データを使ってスクリプトで契約を自動実行して新しい取引してしまおう。なのです。
要は「怪しげで危険な金融の何か」とかではなく、
今のところ当たり前である中央(サーバ)で管理されてるしくみを
みんなに見えるように晒して、ズルできなくして、面倒くさい手続きや業者やらもいらなくなるかもしれない。
なのです。
ブロックチェーンとスマートコントラクトが普及すると、システムの考え方が変わってきそうです。
データとプログラムは各ノード(PCやスマホやIOTデバイス)にあるのが当たり前。
スマートコントラクトに書かれた条件を満たせばノードが勝手に処理する。
スマートコントラクトの条件判定のパラメータは、
他の取引データかもしれないし、IOTデバイスのセンサーのデータかもしれない。
条件判断が難解なら、そこはサーバ(AIとか)を使うためにAPIを呼び出す。
とかになったりするのでしょう。
Django管理サイトについて
Djangoについて - ping2shi2’s diaryで触れたAdminサイトについて。
概要/チュートリアルは、本家サイト(はじめての Django アプリ作成、その 1 | Django documentation | Django)を見ていただきたい。
ザックリ言うと以下の作業で管理サイトが出来ます。
ER図さえ作れば(操作感や見た目にこだわらず)テーブルをCRUDするだけのWebアプリであれば、1日(もかからない)で出来てしまいます。マスタメンテとしては充分な機能です。
例えば、SI系の開発(ウォーターフォール)でも、要件定義や基本設計のできるだけ早いタイミング(作成請負部分の見積前)に管理サイトをユーザーに見てもらうことで、後工程の手戻りを減らせるような気がする。のは期待しすぎでしょうか?
(そもそもSI系の開発でPython/Djangoを採用するか?という話はありますが…)
上で「操作感や見た目にこだわらず」と書きましたが、ある程度カスタマイズできます。自分でカスタマイズすることもできますが出来るだけ手間をかけたくないのでライブラリ紹介サイトを見てみる。
Awesome Django
Djangoで使えるライブラリなどを紹介してます。その中のADMIN INTERFACE (http://awesome-django.com/#awesome-django-admin-interface)をザッと眺める。
1. djamin (https://github.com/hersonls/djamin/) - A new style for Django admin.
→ G Suite の管理Console風のデザインに。G Suite にDjangoアプリを追加する場合に良いかも。
2. django-admin-bootstrap (https://github.com/django-admin-bootstrap/django-admin-bootstrap) - Responsive Skin for Django Admin
→ bootstrapに。Django Ver.1.11
3. django-admin-bootstrapped (https://github.com/django-admin-bootstrapped/django-admin-bootstrapped/) - A Django admin theme using Twitter Bootstrap.
→ bootstrapに。Django Ver.1.8
4. django-admin-easy (https://github.com/ebertti/django-admin-easy)
→ カスタムフィールドを簡単に追加。Django Ver.1.11。どこまでできるか?
5. django-admin-interface (https://github.com/fabiocaccamo/django-admin-interface) - The ultimate admin interface, based on a modern flat theme, it lets you customize the admin title, logo and colors by the admin itself.
→ レスポンシブデザインに。Django Ver.2.0
6. django-admin-tools (https://github.com/django-admin-tools/django-admin-tools) - A collection of extensions/tools for the default django administration interface
→ ダッシュボードとナビゲーションメニューを追加してカッコ良く。
7. django-admin2 (https://github.com/jazzband/django-admin2/) - Extendable, adaptable rewrite of django.contrib.admin
→拡張性と適応性に焦点を当て、今風のUIで管理画面を作り直してる(途中)。モデルのRESTful APIも自動で作れちゃうみたい。が、まだ実際に使える状態ではない。協力者絶賛募集中な感じです。
8. django-flat-responsive (https://github.com/elky/django-flat-responsive) - An extension for Django admin and django-flat-theme that makes interface mobile friendly.
→ モバイル対応。Djnago2.0にふくまれてる。Django2.0未満でモバイル対応する際は使えそう。
9. django-fluent-dashboard (https://github.com/django-fluent/django-fluent-dashboard) - An improved django-admin-tools dashboard for Django projects
→ ダッシュボードにアイコンを追加したり、カスタマイズできる。
10. django-grappelli (https://github.com/sehmaschine/django-grappelli/) - A jazzy skin for the Django Admin-Interface.
→ キレイなインターフェイス。Django Ver.1.11.
11. django-hijack (https://github.com/arteria/django-hijack/) - Allows superusers to hijack (=login as) and work on behalf of another user.
→ 管理者は他のユーザーに代わってログインして作業できる。
12. django-jet (https://github.com/geex-arts/django-jet) - Modern responsive template for the admin interface with improved functionality.
→ モバイル対応。かっこいいUI。
13. django-material (https://github.com/viewflow/django-material) Material design for Django Forms and Admin. Template driven.
→ マテリアルデザインでフォームを簡単に作れる&管理画面。フォームは便利そうだけど管理画面はオリジナルより制限があるみたい。
パッと見フォームは良さそうなので悩ましい。
14. django-object-actions (https://github.com/crccheck/django-object-actions) A Django app for adding object tools for models in the admin
→ 何ができるかイマイチわからない。使ってみるか?
15. django-suit (https://github.com/darklow/django-suit/) - Modern theme for Django admin interface.
→ 新しいデザイン。有料。
16. django-wpadmin (https://github.com/barszczmm/django-wpadmin/) - WordPress look and feel for Django administration panel.
→ WordPress風 ☆
17. django-xadmin (https://github.com/sshwsfc/xadmin/) - Drop-in replacement of Django admin comes with lots of goodies, fully extensible with plugin support, pretty UI based on Twitter Bootstrap
→ 良さげに思えたがデモサイトがエラーで見れない。使おうと思いにくい。
18. yawd-admin (https://github.com/yawd/yawd-admin/) - An administration website for Django
→ こちらもデモサイトがエラーで見れない。
Django Packages : Admin Interface
こちらもDjangoのライブラリ紹介サイト。比較表があるので選びやすい。Starsが多いものが表の左側がにあり、高評価→低評価になっている模様。主に左側と機能比較で✓が多いものを眺めてみる。
1. XADMIN
→ 上の16.と同じ。2013年から始まってるのにベータ版。判断が難しい。
2. DJANGO-GRAPPELLI
→ 上の10.と同じ。実績は一番ありそう。機能比較の✓が多い。レスポンシブ非対応で良ければこれで決まりか?
3. DJANGO-MATERIAL
→ 上の13.と同じ。最近のコミットが多い。商用版はRESTfulAPIもあり充実してる。
4. DJANGO JET
→ 上の12.と同じ。機能比較の✓は一番多い。オープンソース版でどこまでできるか知りたい。
5. DJANGO-ADMIN-TOOLS
→ 機能比較の✓が多い。2013年から始まってるのにベータ版。
6. DJANGO-ADMIN-INTERFACE
→ 機能比較の✓が多い。
試してみる
django-grappelli (https://github.com/sehmaschine/django-grappelli/)
1番実績がありそうなので。
django-grappelli を試してみる - Qiita
django-jet (https://github.com/geex-arts/django-jet)
人気もありそう&機能比較表で✓多いので。
django-jet を試してみる - Qiita
django-admin-interface(https://github.com/fabiocaccamo/django-admin-interface)
機能比較表で✓多いので。
django-admin-interface を試してみる - Qiita
引き続きもう少し試してみよう。
DBについて
DjangoはDB(テーブル)を設計できれば、割と簡単にWebアプリが作れます。裏を返せばテーブル設計できないとダメです。
Djangoに関するDB関連のことと、一般的なテーブル設計についてです。
DBMS
使うDBMSによって注意点があるので Databases | Django documentation | Django を参照。
上記以外のDBMSもサードパーティーのドライバ Databases | Django documentation | Django があります。
また、NoSQLを使いたい方向けのプロジェクト Django non-rel もあります。
一般的なテーブルの論理設計(データモデリング)のこと
クラウドでDBのPaaSを使うと「これでDB作れたのか?」「勝手にスケールできちゃう!」「勝手にインデックス張ってくれる?!」になってます。今のところテーブルの論理設計はエンジニアがやらないとできないので、まとめておきたい。
(mBaaSやら、自然言語からSQLを作るサービスもあるので、そのうちテーブル設計もエンジニアがやらなくなりそうですが…)
テーブル設計について一通り盛り込まれていて、簡潔にまとまってる記事を見つけたので拝借。 DB論理設計のノウハウ - Qiita
この記事の内容で気になる点がいくつかあったのでメモしておきます。
自然キーを使うべき?
業務が変わるとキーが変わる可能性もある(殆どないですが…)ので代理キーを使うべき。の考え方もあり、私は代理キー派です。またDjangoを普通に使うと代理キーです。
正規化は第三正規形まででOK?
非正規化すると検索し易くなり(その検索処理だけコードが簡単になったり、レスポンスが良くなったりし)ます。逆に、正規化するほど業務の実態に近づきます。業務の実態に近いということは、仕様が変わってもテーブルの変更も対応し易い(正しくテーブル設計できていれば、テーブルには手が入らない。または、変更はなくテーブルの追加だけで対応できる。)です。非正規化した項目は、画面の仕様が変わると、全く役に立たないゴミデータになる可能性があります。後々のことを考えると、できるだけ正規化しておきたいです。
物理設計の内容
クラウドサービスを使うとあまり意識しなくて良くなってきてます。もちろん理解しておいた方が良いですが、優先度を下げて考えても良いのかと思います。
先述の記事でテーブル設計について一通りまとまっていますが、難しい単語があって頭に入りにくい部分もあります。
なので、もう少し分かり易い記事。 4ステップで作成する、DB論理設計の手順とチェックポイントまとめ - Qiita
この記事も気になる点をメモ。
主キーをidにするとSQLでjoinした際に混乱するからentity名_idとするべき?
Djangoでは主キーを定義しないと、自動的にidという主キーを作ってくれます。DjangoのORMだけ使用する場合、この記事の指摘は気にしなくて大丈夫ですが、Djangoでも生SQLを書くことができます。その場合はこの記事のとおり モデル名_id にしておいた方が無難でしょう。
中間テーブルについて
中間テーブルが「多:多の関係を解消するために、業務要件にないけど人工的につくるテーブル」として説明されています。確かに多:多を解消しますが、業務分析が不充分であるとも言えます。
この記事の例で言うと、学生は新学期が始まる際に新しい講義を選択し、受講期間を申し込むイベントがあるはずです。例にある中間テーブルに日付(受講期間)を追加したものが、このイベントのテーブルとして定義されるべきです。
上記の中間テーブルをイベントのエンティティに落とし込む点に重点をおき、分かり易く業務分析/データモデリング(≒論理設計)する手順を説明したスライドを見つけました。
イミュータブルデータモデル(入門編)
このスライドを作成した方のベースにはT字型ERがあるようです。
私も以前この本を読みました。言葉が難しいですが、テーブル設計が楽に出来るようになります。余裕があれば読んでみてはいかがでしょうか。
テーブル設計におけるDjangoの制約
複合キーは使えない
使いたい場合は、サロゲートキー + 複合ユニークキーにする。
日々の記録 : django で複合ユニーク制約をつける方法
ORMでテーブルを結合検索したい場合、modelのFieldにForeignKeyの指定が必要
ForeignKeyを張ると面倒な場面があるので、以前は物理設計時にForeignKey制約を外したこともありましたが、外さない方が良いです。ForeignKey制約についてちゃんと考えてる記事 キーレスエントリ(外部キー嫌い) - Ynishi Bussiness Logs があったので参考にしてみて下さい。
ちなみに、 Djangoでも modelのField定義で db_constraint=False を指定することで、ForeignKey制約なしにするのは可能ではあります。
customer = models.ForeignKey('Customer', null=True, blank=True, db_constraint=False)
Djangoについて
Pythonで作られたフルスタック・フレームワーク。フルスタック・フレームワークを使ったことがない方は、Djangoに限らずですが一度使ってみて下さい。便利でビビリます。
以下、Djangoの特徴について。
MVC(MTV)
いわゆるMVCフレームワークですが、Djangoでは以下のような対応になっていて紛らわしい。
通常のMVC | Djangoの場合 |
M | models |
V | templates |
C | views |
モデルとテーブルの同期
先述の models からDBのテーブル(データじゃない)を作成・変更・削除したり、逆に既存のテーブルからmodelsを作成したりできます。(失敗してハマることはありますが…)
Adminサイト
DBとテーブルを作ればテーブルのデータをメンテナンスできる管理画面を、ほとんど自動的に作成でき、カスタマイズもできます。
用途は、マスタメンテ画面として使用したり、プロトタイプとしても使えると思います。カスタマイズを上手くできるようになれば、簡単にプロトタイプをつくれるようになりそうです。
認証機能がついてる
Django でのユーザ認証 — Django 1.4 documentation にある通り、はじめから認証機能があります。固有アプリ用の画面(template)に変えるだけで充分使えます。
また、Djangoでシングルサインオンできる外部PKGもあります。
URLディスパッチャの正規表現
通常のMVCフレームワークのルーター(クライアントからのリクエストを最初に振り分けるとこ)がURLディスパッチャ(urls.py)と言う名前なのですが、リクエストURLが正規表現にマッチしたら振り分ける仕組みになってます。ここ以外は直観的に作れる感じなのですが、正規表現をスラスラかける人なんているのかしら?と思ってしまいます。
Djangoの設計思想
他にもたくさん特徴があるのですが、Django の設計思想 — Django 1.4 documentation を説明した記事があります。聞いたことない単語が出てくるし、直訳っぽいので読みにくいですが、考えこまずにひとまず読んでみてください。その後、この設計思想について書いた記事、Java開発者の読むDjangoの設計思想 - やさしいデスマーチ を読むと、自分がJavaをやっていたせいもあるかもしれませんが、とても理解し易いです。
Djangoの特徴を自分でちゃんと書こうと考えてましたが、Java開発者の読むDjangoの設計思想 - やさしいデスマーチ が解り易いので、これでおしまい。
Pythonについて
Pythonのことは検索すれば色々あるので気が済むまで調べていただきたいですが、私が感じてる特徴をザックリ書くとこんな感じ。
- いわゆるスクリプト言語
- 動的データ型
- ブロックをインデントで表現(カッコを使わない)ので見た目スッキリ
- なんか書き易い(見易い?3.のおかげか?)
- 標準ライブラリ&サードパーティーモジュール(パッケージ)が豊富
しっかりお勉強しなくても、ネットで検索すればある程度動くものは作れます。真面目に勉強しようかと思い、
これを読みかけてます。読むと、心なしか自分のコードがカッコ良くなった気がします。
個人的には、5.が一番気に入っていて、いわゆる車輪の再発名をしなくて良いです。「Pythonはデータ分析や、機械学習に向いている。」と言われていますが、多分5.のおかげが大きいのではないでしょうか。
Python(特に5.)の特徴を生かすために気を付けておいた方が良い点、その他の注意点を書きます。
英語
Pythonの情報は英語の記事の方が圧倒的に豊富です。日本ではRubyが人気でPythonを使う人が少なかったからだと思いますが、日本語の記事だけ見てPythonのことを調べても、結局英語の記事を読む羽目になります。
また、Pythonのサードパーティモジュールを使用する場合は、パッケージ管理サイト PyPI - the Python Package Index : Python Package Index を読むことになります。Pythonだけではないですが、Pythonの場合は特に英語に慣れるべきです。
と書きつつ、私は英語が苦手なので、Google 翻訳 - Chrome ウェブストア これを使ってます。相変わらず英語はダメですが、機械翻訳した日本語に慣れてきました。そのせいか、先述したオライリーの直訳っぽい日本語もスラスラ読めます。
パッケージ管理
豊富なサードパーティーモジュール(パッケージ)群を管理するために、pipというものを使います。他にも色々あるみたいですが、まずはpipです。
pipの使い方とインストール - Python入門から応用までの学習サイト で分かり易く説明してくれてます。こちらのサイトは、pipだけでなくPython全般のことを初心者(かつWindowsユーザー)にとても親切に説明してくれてます。ありがたいです。
まずは "pip install -r requirements.txt" は使えるようにしましょう。もう少し凝りたい方は、Python アプリ依存パッケージ管理 ベストプラクティス集 - Qiita など参考にされると良いでしょう。
仮想環境
Pythonを始めた頃、勉強に使った色々なサイトに「仮想環境を作成しよう」と当然のように書いてあって「なんで?」と思いました。これも「パッケージを使い分けるのに便利だから」だと思います。
仮想環境を使用すると、PythonインストールディレクトリとPythonパッケージディレクトリを簡単に作成/切り替えできます。開発するアプリ毎に使用するPython(のバージョン)とパッケージをそれぞれ管理できるのです。
例えば、
アプリAでは、Python2.7でDjango1.11を使用したい。
アプリBでは、Python3.6でbottle0.12を使用したい。
場合でも、アプリAはPython2.7の仮想環境を参照し、アプリBはPython3.6の仮想環境を参照することが簡単にできるようになります。
ということで、仮想環境を使った方が便利です。仮想環境の作成/切り替えは、
Python/Djangoの開発環境構築 の際にcondaを使ってやってます。
もっと知りたい方は、
Pythonの仮想環境構築(2017年版) pyenvとpyenv-virtualenvとvirtualenvとvirtualenvwrapperとpyvenvとvenv - Qiita
など参考にしてはいかがでしょうか?
規約
当然ですが従わなくても動きます。が、新しいプログラム言語を始める際は、その言語の規約には目を通しておくべき。Javaの規約で書かれたPythonプラグラムを見たことがありますが、とても見にくかった…。
規約を守ってるかをチェックしたり、自動的に修正するツールもあります。
Python のコーディング規約 PEP8 に準拠する - Qiita
Eclipse+PyDevでPythonコーディング規約(PEP8)を準拠するための環境構築 - Qiita
使ってなかったので参考にしよう。
日本語(データ)の扱い
日本語データの取り扱いでハマることが何度かありました。3系では問題ないようですが、私がちゃんと使ったのは2系なのでその際の注意点を。
特にハマったのはデータの文字コード変換です。機種依存文字、氏名でたまに使われる難しい方の漢字とかは標準モジュールでは変換できません。pykf 0.4 という拡張パッケージで変換できるのですが、これを発見するのとWindowsへのインストールに苦労しました。
この辺とか参考にしたような…
機種依存文字対策でpykfをインストールしてみた – BTY備忘録
それでもエラーが出て、これもインストールしたような…
Download Microsoft Visual C++ Compiler for Python 2.7 from Official Microsoft Download Center
人って嫌な記憶はなかったことになる仕組みになってるらしいので記憶があやふやで…。
Python Django の開発環境構築
まずはPython環境
Pythonの環境を初めて作ろうとググったら、2.x系 or 3.x系とか、仮想環境が○○とか、Pythonコミュニティ標準かAnacondaかとか…、いきなり迷う方もいると思います。
とにかく手軽に環境を作ってみて、解ってきたら後で最適な形に変更することにしましょう。まずはAnacondaを使うことをお勧めします。なぜAnacondaが便利か?とかは一旦置いといてインストールしましょう。
Anacondaのインストールと概要説明は、
Anaconda で Python 環境をインストールする - Qiita
が分かり易く、OSも3パターン(win/mac/Linux)対応で親切、コメントで「なぜAnacondaが便利か?」にも触れてる方がいて至れり尽くせりです。
私も参考にさせていただきました。
次はDjangoをインストール
となるところですが、上のPython環境の記事を最後まで読んだ方は、既にDjangoをインストールしています。読み飛ばした人は、もう一度最後まで読みましょう。
IDE / エディタ
結局は、使い慣れたのを使うのが一番効率が良いと思います。
が、感じたことを書いておくと、開発PCのスペックがそれなりならIDEが良いです。Pythonの特徴の一つに豊富なライブラリ群があり、これらを積極的に使用することで生産性が上がりますが、サードパーティのライブラリには最低限の説明しかないものが多々あります。Python使ってるんだからソース読んでね。が常識なのかソースを読まないと使えない場合があります。
そんな時、IDEのデバック機能を使った方が効率的にソースが読めます。最近は、エディタでもデバック機能を拡張できるのがあるので、エディタの場合でも、デバックできるものをお勧めします。
お勧めのIDE/エディタ
Eclipse & PyDev
PCスペックまあまあで、OSがWinで、Python以外もやるし、無償だし、使い慣れてて学習コストがかからないいので、私はおもにEclipse使ってます。
超ザックリ説明すると、
ちゃんと説明してる情報はあるのでググって頂きたい。Python+Anaconda+Eclipseのインストール手順/PythonとRのビッグデータ統計分析の比較 第2回 | GiXo Ltd.みたいな設定です。
PyCharm
Pythonはじめた頃にググったら、みなさんこれを勧めてました。有償だしPython以外に使えるか不明だったので使ってないです。
Visual Studio Code & Python拡張
PCスペックがイマイチの時にこれを使ってました。動作が軽いし、機能も充分で、感心した記憶があります。
環境設定の情報はたくさんあるのでググって下さい。