konbu's blog

PHP/Ruby/Python あたりが仕事で使っている言語です。プログラミング、学習や教育ネタを書いていきます。

今 web プログラミングを覚えるためにやらないといけないこと

Web プログラミングを今から勉強しようと思った時に、 どれくらいのことを勉強すればとりあえずできると言えるレベルになるのか、考えてみた。

  1. bash (UNIX 系コマンドやターミナル) の操作
  2. プログラミング用のテキストエディタ (IDE含む)
  3. 使用する言語の習熟 (Ruby とか PHP とか色々)
  4. HTML/CSS
  5. JavaScript
  6. HTTP
  7. TCP/IP
  8. マイクロWebフレームワーク
  9. セッション
  10. RDB
  11. MVC フレームワーク
  12. Linux
  13. SSH 設定と接続
  14. Linux セキュリティ
  15. HTTPDドメイン取得と設定

とりあえず公開までやろうと思った時に覚えないといけないことはこんな感じかなと。 順番はこの通りでなくても良いと思うし、途中抜けても割となんとかなるけど、 途中抜かしたこと (理解不足) によって詰まって抜け出せない場合は何かが抜けてるかも。

雰囲気で順番は書いたけど、多分スクールとかも概ねこんな順番で教えてると思うので、 自分のペースで勉強したいとか、スクールに使うお金がもったいないって人は該当する部分の本を買って勉強すれば良いと思う。

スクールは色々言われてるけど、内容の良し悪しやメンターのレベルの低さなどはさておき、 初学の自分が詰まっている問題を解決してくれる (教えてくれる) という意味では良い手段ではあると思う。 ただしばらくはどのスクールが手放しで安心とかは言いづらい気はするし、 スクール終わった後も自分で勉強するのは続くので、使うにしてもある程度自分で勉強してからが良いと思う。

退職と起業

去年のタイミングで退職し大阪で 株式会社coroutine という会社を立ち上げました。

理由は前から会社を起こしたかったという物と、ある程度業界で仕事をして業務委託でも生きていける気がしたからという物の二つ。 起業アイディアがあるとか、VC からお金貰うの頑張るぞーという類のものでは無いです。

一先ずは前職からの繋りで仕事を貰いつつ、次の仕事を作る部分を進めています。 週休 4 日が実現する会社目指して頑張ります。

業務内容自体は特に縛りは無く、チャレンジをしていきたいと思っています。 願望で言えば、教育系 (社内教育, 教育システム等) とか PMO 周りで仕事を作りたい所存です。 とは言え今までやってきたのはサーバアプリケーション開発と運用 (Python) だったのでその辺りでしばらく資金作りに注力する事になるかと思います。

何かお仕事の話があれば contact@co-routine.com までお願いします。

npm で入れたコマンドの path について

debian の jessie では apt で npm を入れられるので入れてみたけど、npm で入れたコマンドを実行しようとすると not found が出るのでちょっと工夫が必要だった。

どうも /usr/bin/env node でコマンド実行を指定しているみたい (coffee とか) なんだけど node なんて実行ファイルは入っておらず、あるのは nodejs なので、シンボリックリンクを作って対応した。

ln -s /usr/bin/nodejs /usr/bin/node とりあえず的な対応だけで正しい対応は知らない。調査するのが面倒だったのでこれで満足。

django.contrib.auth をメールアドレスで認証するカスタマイズ

結構面倒なので、途中で投げて、username と password での認証でも良いかーとなった。 一応調査したので痕跡だけ残す。

Customizing authentication in Django | Django documentation | Django

この辺とか詳しく書いてたんだけど、結構面倒臭く、認証をメールアドレスに変更する為に標準以外の認証用 Backend class を作る必要がある。

Using the Django authentication system | Django documentation | Django

django.contrib.auth.authenticate に username と password を渡してやる事で標準の User モデルが返って来る。 どうもこの時に username が渡されていない場合は、password 以外の他のキーワード引数で指定した辞書から User.USERNAME_FIELD をキーにして User モデルを取得するようになっているっぽい。

ぽいというのは、試していないから。

この User.USERNAME_FIELDget_user_model() で取得できるモデルを使用していて、これは settings.AUTH_USER_MODEL から参照するのでカスタム認証用モデルを設定していれば使えるという事になる。

認証を Django の仕様に載せて変更するのは結構面倒な印象だった。

django の auth をカスタムする

Django 標準で付いている auth 機能をそのまま使うのでは無く、良い感じのログインデザインを作ろうと思うとカスタマイズする必要がでてくる。

ここを参考にすると良かった。 blackglasses.me

カスタムデザインを作るには、ちょっと面倒だけど model やら view やらの処理を書き直す必要がある。 その上でフォーム周りの設定をやれば、大体終る。

僕は bootstrap を使いたかったので class が変更出来る必要があってやった。

jinja2 と Django と django-debug-toolbar を使う

django 1.9 と jinja2(1.9 ではデフォルトで使用できる) と django-debug-toolbar を併用したかったので、色々調査。

結構悩んだけど、こんな感じで並列に書いてしまって良いらしい。 django-debug-toolbar は django の標準が使えないと駄目? らしく消すと上手くいかないのでこれで運用した。

TEMPLATES = [
    # jinja2
    {
        'BACKEND': 'django.template.backends.jinja2.Jinja2',
        'DIRS': [],
        'APP_DIRS': True,
        'OPTIONS': {
            'environment': 'app.jinja2.environment',
        },
    },
    # django default
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

'environment': 'app.jinja2.environment' というのは、 Templates | Django documentation | Django で書いているサンプルを使っている。

あと、地味に templates (htmlとかjinjaとか) の配置に困ったんだけど、 基本的に各 app の下に置くという形が良さそうという感じに落ち着いた。

この辺りは別の話なので、また後で書く。

手を動かしてみる

昨日の続き。 本を読みながら、再帰の話と実際に手を動かすところがあったので適当に書いてみた。

本書で話に上がっている zip 関数 (Python にある関数と同じ挙動) を実装してみるという内容で、 自分がどの程度本を読んで理解できているのかを確かめてみた。

tail_zip([], [], Acc) -> lists:reverse(Acc);
tail_zip([X|Xs], [Y|Ys]) -> tail_zip([X|Xs], [Y|Ys], []);
tail_zip([X|Xs], [Y|Ys], Acc) -> tail_zip(Xs, Ys, [{X, Y}|Acc]).

こんな感じ。 使ってる名前は本書の物を流用していたり、 命名規則をそれっぽく使ってるのでこの短さならまぁ同じコードになるかなぁくらいの感想だった。

もう一つは流れが変わらんと思うのでパス。 書いてみて思うのは初パターンマッチは特に違和感無く書ける感じだったし、 パターンマッチのおかげで末尾再帰再帰の書きやすさが上がってる感じだった。

なんだろう、かなり考えたまま書ける感じかと。 ただ、[H|T] のパターンマッチを再帰で書いた時に逆順になるのは未だ慣れないなーと思った。 イメージでは、単にリスト構造の先頭にノードをくっつけていくだけなんだけど、 どうも見た目の印象の所為で後ろに伸びてる錯覚を覚える気がする。 もっと頭を訓練しないと。

末尾再帰とか書いた感想は、書き味は Lisp に通じるものがあるなーと感じた。

すごいErlangゆかいに学ぼう!

すごいErlangゆかいに学ぼう!

Erlang 勉強はじめ

かねてからやろうやろうと思ってはや 5 年 (冗談でも何でもなく、Elixir 出た時にやりたいと思ったので...) 一向にやる気が出ず放置していたんだけど、昨今の言語事情を考えて始めた。

言語事情と言うのは、最近 Scala、Go、Erlang をプロダクトに使用する会社が日本でも出始めているという話で、多分あと 5 年くらいで主流になっていくんだろうなーと思っている。

なので、今年は Python に加えて Erlang を覚える年にしようかと言う考えで勉強を始めた。

すごいErlangゆかいに学ぼう!

すごいErlangゆかいに学ぼう!

勉強はこの本で取り敢えず始めた。 結構フランクな文体で書かれているけど中身はガチっぽく、プログラミング入門者は読まない方が良い本だけど、中身が分かりづらい訳でも無いので好感が持てる。

取り敢えず読んでるだけなので一切手に馴染んでないけど、パターンマッチとガードの章を読んだ頃くらいには Erlang の独特な記法に目が慣れてきたので割と早い段階で書くことにもなれる気がする。

と言ってもまだ 5 章で、50p 位なのでさっさと 1 週してしまって開発環境とかに踏み込んでいきたい。

EffectivePython その 1

EffectivePython を読んでいて、なるほどなぁと思う部分を書き残しておく。

Effective Python ―Pythonプログラムを改良する59項目

Effective Python ―Pythonプログラムを改良する59項目

for と while ループの後の else ブロックは使うのを避ける

自分の文化にはそもそもこの仕様が無かったため、全く使っていないのだけど、知識としては else が for や while で書けるのは知っていたために、使わないように覚えておきたい。 理由としては if や try の else と違い、正常に繰り返しが終了した場合に実行されるのが分かりづらいという事らしい。 確かに分かりづらい。気をぬくと忘れそう。

None を返すよりは例外を返す

結構処理を書く際に戻り値を返す以外の関数の終わり方が None になる事があり、その None チェックをするという事が発生していたので本当そうだなーと思った。

やっぱり戻り値の型が変わるのは良くないということだった。 そういう場合は何がダメなのかを考え、適切な例外を出すようにする。

キーワード専用引数で明確さを高める

Python 3 ではそういう機能があるみたいで、位置引数の後ろの引数を *, とし、その後にキーワード引数を設定すれば使えるらしい。

デフォルト引数としても機能するけど、*, の後に定義されているキーワード引数の部分を位置引数にするとエラーを吐いてくれる。

ただ、この機能は Python 2 には無いので工夫が必要との事。

python 2 で専用引数を使う場合

def func(a, b, **kwargs):
  c = kwargs.pop('c', False)
  b = kwargs.pop('d', False)
  if kwargs:
    raise TypeError('Unexpected **kwargs: %r' % kwargs)
  # ...

pop 使ってるのは想定引数で辞書が空にならない場合、本来定義したい引数ではないモノが入力されても検知できるようにしている。 本来の処理が始まるまでに数行必要だけど、引数が長くならないのは非常に見易く感動した。 今後是非使って行きたいレベル。

休み中に全部読みきるつもりだったけど意志が弱く体調が良くなかった (PM 2.5 とかで) ので読みきれなかった。

emacs でバッファの状態を保持する

emacs で作業をしている時に OS の再起動が必要になると本当に萎えるので探して導入してみた。

いや、Mac OSX とか Windows とか使わなかったら良いだけなんだけど、会社では Mac なので再起動をしょっちゅう求められてしまうんで。

そんな時にバッファを消したくないので探す事になった感じ。

github.com

persp-mode.el という拡張があるので、これを入れると管理してくれます。 ついでにワークスペースとしての管理機能もあって、バッファリストとウィンドウに名前をつけて管理できるようになるので便利。

Support persp-mode buffer filtering in helm. · GitHub

helm を使っているのならこの Gist の設定も入れておくと、C-x C-f と C-x b が helm 仕様で persp-mode に対応してくれる。

C-c p s でワークスペースを作れて、切り替えもできるのでとりあえずこれを覚えておけばなんとかなる。