Webサーバーが出来上がるまで
今回からはWebAPIを作ってみようと思う。このサイトのコンセプトに沿って、作成するためのサンプルコードを上げるのではなく思考のプロセスを中心に書いていく。完全な初心者、または、なかなか上達出来ずに悩んでいるエンジニア向けの記事なのであしからず。 前回の記事でネットワークについて …
WebAPIを理解する上で、前回の記事と前々回の記事で、通信、サーバー、Webサーバーなどの話を書いてきた。今回は最深部であるアプリケーションの話。
アプリケーションというと、スマホの「アプリ」を思い浮かべてしまう人もいるかもしれないけど、広い意味で「ある特定の機能や目的のために開発・使用されるソフトウェア」という定義がある。より具体的な例を出すと、「投票システム」で投票データがブラウザから送信されるとして、そのデータをサーバーで受け取ってデータベースに保存したり、投票数を返却したりするシステムなどが上げられる。要はサーバーに到達したリクエストを処理してレスポンスの中身を作るシステムのことだ。
言語はなんでもいいので、今回はサーバミドルウェアの準備が比較的簡単なPythonにしてみる。
一番上に出てきた記事に、pythonのWebフレームワークの紹介記事が出てくる。「Flask」や「Django」といったフレームワークが有名みたい。ちな、フレームワークってのはWebアプリケーション開発の土台みたいなもので、便利な骨組みのこと。
そしてこの記事内に、「Flask(フラスク):超軽量フレームワーク」って書いている。「よし、これや!」と、この文言一つでフレームワーク採用。てか簡単なWebアプリ作るだけだから何でもいいんだけど、超軽量ってのが魅力的だ。
ここで重要なことだけど、サーバーサイドの開発といえども、開発段階ではローカル(あなたのPC上)で動作させます。サーバー上で直接開発してもいいんだけど、SSHで接続してVimのみで修正?まぁこれもありなんだけど、正直ローカルPCでやった方が楽だし、通信も軽い。だから以下はすべて自分のPC上でやっていることに注意。完成後、サーバー上にそのソースを配置すればOK。
一番上に出てきた記事。https://auth0.com/blog/jp-developing-restful-apis-with-python-and-flask/
これによると、まずサーバーにpythonとpipがインストールされていなければいけないらしい(当然)。
$ python -V
Python 3.8.5
$ pip -V
pip 21.1.2 from /home/user/.local/lib/python3.8/site-packages/pip (python 3.8)
普通に入ってますね。入っていなくてもそれぞれググればインストール方法は腐るほど情報が出てくる。
んで、Flaskとやらのインストールをやってみる。
pip install Flask
笑っちゃうくらい簡単っすね。
このページのサンプルコードの通りやってみる。hello.pyファイルを作成。
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello_world():
return "Hello, World!"
そして以下のコマンドでアプリ起動。
export FLASK_APP=hello.py
flask run
:
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
これは127.0.0.1の5000ポートで待ち受けているっていう意味。127.0.0.1ってのはlocalhostといって、自分自身のPCって意味ね。これは誰でも知っているくらい重要なこと。とりあえず、ブラウザで検索窓に「http://localhost:5000/」と入力してみれば「Hello, World!」って出てくるよね。すごくね!?たった5行のpythonのコードを書いて、言われた通りコマンドをたたくと、もうWebAPIが出来上がりました。こんなもんよ。
一応、コーディングを始める上で上記のpythonコードについて考えてみよう。
from flask import Flask # これはこういうもん!
app = Flask(__name__) # これはこういうもん!
@app.route("/") # このパスでのアクセスのときに動く
def hello_world(): # どうでもいい関数名
return "Hello, World!" # レスポンスする文字列
これだけ少ないコードでも、注目すべきことに緩急をつけなければいけない。できるエンジニアってのはそういうこと。Pythonに限らず、よく初心者の方に以下のように聞かれることが多かった。
これらの答えは1つだ。
いいかい?初心者がWebAPIを作る上で最も重要なことは「どんなリクエストを受け付けて、どんな処理をして、どんなレスポンスを返すか」だ。スマホアプリを作るときも、Webサイトを作るときも同じで、いちいち細かいことにこだわっているやつはまず成長しない。初めから全部理解しようなんて思わないで、やっていくうちに分かっていくし、最後まで理解できなくても全く問題ないようなコードも存在するんだ。
上記のpythonコードだと、3行目と5行目が核心であり、他はどうでもいいと思えなければいけない。ではどのようにフォーカスする箇所を特定するのかというと、「目的を達成するためにどこをいじれば変更されるか」を考えてその処理を特定するって方法が良いだろう。
具体的には、今回ブラウザに「Hello, World!」って表示されるけど、当然「Hello, World!」って表示したい人なんていないよね?このレスポンス部分を変更したいはずなので、5行目をいじってみる。→レスポンスが変わる。もう一つはリクエストのURLパスを変更することも考えるだろう。
@app.route("/aaa")
# このように書き換えてみるとリクエストパスが変更されることを理解できる
他の行も試しに自分で書き換えて変更してみればいい。変更して動かなくなるんだったら、いじってはいけない"そういうもの"と割り切る。そうしていくと、どこをいじれば何が変更されるのかがだんだん分かってきて、次第にフォーカスする箇所を瞬時に発見できる力がつく。必ずね。
今回はここまで。WebAPIを作成する上での言語・フレームワークを決めて、そしてサンプルコードをコピペまで。最も重要な教訓は、「自分でいろいろいじってみる」。そして、「フォーカスすべきこととそうでないことを認識する」。今回のコードはめちゃくちゃシンプルなので、誰でもできるけど、さらに複雑なコードになった場合も同様に、今何を実装すべきなのかという目的を考えてフォーカス箇所を発見する。そしてそのためには、このサイトでひたすら言っている『目的を把握し、そのタスクをイメージできるか』がやはり重要なのだ。(目次から参照)
そしてソースコードをこれでもかというくらいいじり倒す。“いじる→何か変わる"を繰り返して自分の理解を高め、大きく成長していくのだ。初心者のうちは、本やドキュメント、講義などのパッシブな学習よりも、自分でいじっていじってみることが最も効果的だ! さらにそれと同じく、いじっても意味ない、今は理解する必要がない箇所もあるという風に割り切る考えも大切。はじめからすべてを理解しなくても目的のものは作成できるんだから。
OK?バックエンド開発は、フロント開発と違って目に見えにくい分、闇雲でもいじっていじっていじり倒すのがコツだ。
今回からはWebAPIを作ってみようと思う。このサイトのコンセプトに沿って、作成するためのサンプルコードを上げるのではなく思考のプロセスを中心に書いていく。完全な初心者、または、なかなか上達出来ずに悩んでいるエンジニア向けの記事なのであしからず。 前回の記事でネットワークについて …
phpでcsvを作成する場合、fputcsv関数を使用するだろう。しかし数十万行・20MB以上のデータをcsvファイルとして書き込みする場合、かなりの時間がかかってしまう。 今回通常のレスポンスタイム内(3秒以内)でPHPのfputcsvでファイルを書き出す必要があり、多少情報が少なくて調べたこ …