あけましておめでとうございます。高知からリモートでインターンさせていただいている森田です。今年もインターンさせてもらえるように、また頑張っていきたいと思います。目標はAWS資格を3つ取得することです。大学が2月の頭に春休みに入る予定なので、2月、3月で2つ資格を取ろうと思っています( アソシエイトはもうちょっと勉強すれば取れそうなので、あと一つがとれるかな?って感じです)
今日は、年末に指摘してもらったコードを修正していました。見直してみると、「なんでこんなコードを書いたんだろう?」と思う箇所ばかりでした。色々エッセンスを教えてもらったので、忘れないようにしたいです。
機能ごとにメソッドを分割
基本的なことだと思いますが、できていませんでした。適当な形で分割していたんですが、メソッドの中で、さらに機能ごとに分割する、といったことができていませんでした。
また、調べたところによると、「Linuxのカーネルソースにおける各メソッドの行数を計測すると、90%くらいが20行未満」らしいです。分割しすぎると見づらくなるというデメリットもありますが、短く分割するに越したことはないみたいです。
エラー時のレスポンスを別ファイルに記述
エラー時には
"body" : {
"code" : "エラーコード",
"message" : "エラーメッセージ",
"tip" : "エラーの解決方法"
}
といった形式のレスポンスを返すんですが、配列にまとめたりせずに、ベタがきしていました。なので、別ファイルのjsonファイルを作って読み込むようにしました。
json_var = open('/error_valiables.json', 'r')
errors = json.load(json_var)
json_var.close()
コード的には間違っていないんですが、テストしてみると「そんなファイルは存在しない」とエラーメッセージが。エラー時のファイルと、実行ファイルは同じ階層に置いてあるので、相対パス的に考えれば間違ってないはずです。
ただ、エラーメッセージ的に考えて、パスのエラーで間違いないはずなので、メンターの森さんに質問しました。森さんからは、「パスのエラーだね」というメッセージと以下のコードを送っていただきました。
# カレントディレクトリを取得
current_dir = os.getcwd()
json_var = open(current_dir + 'error_valiables.json', 'r')
errors = json.load(json_var)
json_var.close()
絶対パスは、lambdaの動作する場所によって変わるので、相対パスの指定がいいと思っていましたが、このやり方なら、環境に寄らずに絶対パスで指定できそうです。
その後のスレッドで、森さんと加藤さんの相対パスにつまった談義が展開されていたので、僕が知らない沼がありそうでちょっと怖かったです。今後はとりあえず絶対パスで指定するようにします
local実行時にパスのエラー
一通りリファクタリングが終わったので、localで実行してみると、またパスのエラーが再発しました。
No such file or directory: '/var/task/weather_api/error_valiables.json'"
実は、森さんから送られてきたコードでは、パスの指定が通らなかったので、 weather_api/という文字列を追加していました。その部分を削除するだけでよかったんですが、「lambdaのファイル構造ってどうなってるんだろう」と色々調べて回り道していました。
相対パスは、呼び出されるプログラムからの位置に依存するものだと勘違いしていたんですが、コマンドを実行するディレクトリに依存するみたいですね。 pytest 時のディレクトリだとイメージしやすいんですが、lambdaの中ではどういうパスの仕様になっているんでしょうか?また疑問が湧いてきたので、調べておこうと思います。(いまだにlinuxの動きがわからないので、答えに辿りつけなさそうですが)