Webフレームワークとして使われるDjango、Flask、Ruby on Rails、Sinatraの動向

このところWebフレームワークを調べていて、実際のところ何が一番使われているのか気になりました。

そこで、Stack Overflowでトレンドを調べてみました。調べたのは、Django、Flask、Ruby on Rails、Sinatraです。

次の図が、Stack Overflowにおける過去8年間の質問の割合いを示しています。青がRuby on Rails、橙色がDjango、緑がFlask、赤がSinatraです。

webframework

なんと、今年2017年にDjangoがRuby on Railsを抜いています。また、Flaskは増加しており着実にユーザーの数を増やしていることがうかがえます。また、Sinatraは拡大してみるとRuby on Railsと同様に減少傾向にあります。

Stack Overflowでの質問の数で、一概にユーザーの数がわかるわけではありませんが、初心者の数はRuby on Railsに比べてDjangoの方が増えているのではないかと思います。

Ruby on Railsが減少傾向にあることが気になります。近くの本屋さんでも、Ruby on Railsの本はあまりありません。とういことは、これからRuby on Railsを勉強しようという人がいないということであり、近い将来Ruby on Railsを使う人が減ってしまうことを意味します。

それに対して、Djangoは一定の数を保っていますし、Flaskは増加傾向にあります。近くの本屋さんでも、Pythonの入門書がたくさん置いてありますし、これから学ぶ人が増えていくのではないかと思います。

現状Ruby on Railsのプロジェクトは多いですし、スタートアップ企業では使われていくでしょう。しかし、これからのことを考えるとPythonが確実に広まっていくのかなと思います。

MySQLを同一サーバーで複数立ち上げた時の接続方法

MySQLのレプリケーションを勉強しています。同一サーバーで2つのMySQLを動かしたのですが、スレーブへの接続が難しかったので紹介します。

プログラムは、Oracleのバイナリを使い、Ubuntuのパッケージはアンインストールしました。MySQLのバージョンは5.7.18です。

インストールは、やさしく学べるMySQL運用・管理入門【5.7対応】を見て行いました。

インストール後、同じホストでMySQLをマスターとスレーブで2つ立ち上げました。

起動は簡単で、コンソールを2つ開いてそれぞれ別個に構成ファイルを指定して立ち上げます。

./mysqld --defaults-file=../etc/my.cnf &
./mysqld --defaults-file=../etc/my-slave.cnf &

もちろん、my.cnfとmy-slave.cnfのserver_idや、datadirは異なっています。スレーブ側のportは3307、Unixソケット名は/tmp/mysqlslave.sockです。

ここで、mysqlクライアントでマスターとスレーブの両方に接続しようとしましたが問題が起こりました。次のように2つ接続しましたが、結果は両方ともマスターにつながりました。

./mysql -uroot
./mysql -uroot -P3307

自分は、スレーブ上で作業していると思い込んでいて、マスターにマスターのスレーブになれと命令してしまいました。もちろんエラーになってそんなことできません。

調べてみると、接続方法としてLinux上ではTCP/IPではなく、Unixソケットが優先されるのだそうです。port番号だけでは無視されます。ホスト名にlocalhostを指定してもだめでした。

NGの例

./mysql -uroot -P3307
./mysql -uroot -hlocalhost -P3307

そこで、スレーブに接続するには次のようにIPアドレス127.0.0.1を使うかソケット名を使うと接続できました。--protocolオプションでTCPを指定しても接続できます。

OKの例

./mysql -uroot -h127.0.0.1 -P3307
./mysql -uroot --host=127.0.0.1 --port=3307
./mysql -uroot -P3307 --protocol=tcp
./mysql -uroot -S/tmp/mysqlslave.sock
./mysql -uroot --socket=/tmp/mysqlslave.sock

ホスト名は、localhostだとUnixソケットで、127.0.0.1とIPアドレスにするとTCP/IPが使われます。なんという仕様でしょう。

--protocolオプションでプロトコルを指定すればOKです。

ソケット名を-Sオプションで指定するともちろん接続できますが、ソケット名を一つ一つ覚えるのは大変です。

mysqladminも同じ仕様のようです。気をつけましょう。

『入門Python3』を読んで

入門Python3』を読みました。読みごたえがあって1か月ぐらいかかりました。

内容は、文字列やリスト、辞書といった基礎的なことから始まり、ウェブや並行処理、ネットワークの話まで広く解説がされています。

いろいろ勉強になりましたが、初心者の人には難しいと思います。どちらかというと、簡単なプログラミングの話はわかる人、ほかのプログラミング言語をやったことのある人向けのように思います。

丁寧に解説されていますので、内容がわからないといったことはありません。

各章に練習問題があり、その模範解答が章末にあるのがよいです。やはり問題を解かないとプログラミングの力はつかないですし。

自分の場合は、もう少し文字列やリスト、タプル、辞書の使い方を勉強したいなと思いました。いろいろな分野でPythonが使われていて面白かったですけど。

プログラミングは、Windows上のMSYS2で行いました。virtualenvを使って仮想環境を作りました。それには、MSYS版のPython3を使わないといけませんでした。ライブラリはほぼpipでインストールできましたが、ZeroMQだけはできませんでした。MinGW版のPython3にはmingw-w64-x86_64-python3-pyzmqというパッケージがあるのでこれを使いました。geventやfabricというパッケージのインストールにはとても時間がかかりました。最初フリーズしたのかと思いました。でも、使えるのですごいです。

これで、RubyとPythonの両方の入門書を読んでみました。ウェブで使う分にはどちらもあまり違いがわかりませんでした。最近の本屋さんに行くとPythonの入門書がとても多く、これからはPythonの時代のようにも思います。海外では、Pythonのようですので一時的な流行りでもなさそうですし。

ウェブサービスの作り方を勉強したいので、Flaskというフレームワークがいいかなと思っています。Djangoもやってみましたけど、大きすぎてもう少し簡単なフレームワークを使ってみたいなと思います。