プログラマの精神衛生について

プログラマにとって(プログラマに限りませんが)、心身ともにベストに近い状態で仕事をするのが一番いいのは間違い無いでしょう。体調が悪かったり、あるいはイライラしていたり落ち込んでいたりするとどうしても作業も遅くなるし、ミスも多くなる。特に精神的に不安定な状態で作業をしてそこでミスが発生して、それによってさらに精神状態がより悪化するなんて最悪の悪循環です。
そこで今回は、どうすれば精神的に少しでもいい状態で仕事をできるかについて考えて見たいと思います。

一番大切なのは、自分の今の状態を客観的に把握できるようになるということです。今の状態とは精神的にどんな状態なのかというのもそうですが、現時点で抱えているタスクと心身面のコンディションを天秤にかけて、このまま進んで問題ないかということです。
ちょっと精神的に疲れているなーとか感じたら、少しだけ外に出て深呼吸するとかお水を1杯飲むなどしてリラックスすると良いでしょう。
あるいは、それでもどうしてもつらい、無理だと感じたら、(できる場合とできない場合がありますが)チームのメンバーに相談して期限を延ばしてもらうとかあるいは1日だけ休ませてもらうなどするのも1つの選択肢かもしれません。

また、特に精神的にベストでない状態で何かをしている場合は、今やっていることが本当に大丈夫なのか、普段以上に気を配ったほうがいいと思います(難しいかもしれませんが)。例えば変なバグを埋め込んでいないかとか、あるいは人に宛てたメッセージで誤解を招くようなことを書いていないかなど、それによって今の状態をさらに悪化させることにならないよう1歩立ち止まって考えるのは大切なことだと思います。

後は常日頃から自分なりに気持ちを切り替える方法を持っておくことは大事だと思います。例えば甘いものを食べるとか運動するとか、あるいは誰かと雑談するとかです。自分は以前ミスをしてすごい落ち込んでいた時にyoutubeで某議員の動画を見て大笑いして、少し気持ちが落ち着いたことがありました(苦笑)。

そんなこんなで今回はどうすればいい状態で仕事ができるかについて考えて見ました。とは言っても、今までの自分を振り返って正直必ずしも実践できていたわけではないですが(むしろイライラや落ち込みでドツボにはまったことが何度もあったので、その反省と自戒を込めて)、少しでもいい精神状態を保つ方法を日々考えて実践していきたいと思います。

Qiitaでこんな記事を見つけました。常に自分をいい状態にしておくというスキル、本当大事ですよね。

LaravelのbelongsToManyで中間テーブルの情報を取得する

今回扱うテーマはデータ間の多対多の関係で2つのテーブルをつなぐ中間データが持つ情報も取得したいということを考えます。
まず、講師一覧を表すteacherというテーブルがあります。とりあえず、idとnameを持つとします。
id    name
1    鈴木
2    佐藤
3    田中
4    山田
次に、教える科目を表すsubjectというテーブルがあります。こちらも簡単に考えるため、idとsubject_nameのみを持っているとします。
id    subject_name
1    英語
2    数学
3    国語
4    社会
5    理科
さらに、講師は複数の科目を担当できるものとします。ただし、メインで教える科目とサブで教える科目は区別します。
そして、teacherとsubjectを結ぶteacher_subjectというテーブルがあります。これはteacher_id、subject_idに加えてメイン、サブを区別するtypeというカラムがあります(メインなら1、サブなら2)。
teacher_id    subject_id    type
1                  1                1
1                  4                2
2                  2                1
2                  5                2
3                  3                1
4                  4                1
4                  3                2
ここで、こんな表を作りたいとします。
講師    科目    種類
鈴木 英語 メイン
鈴木 社会 サブ
佐藤 数学 メイン
佐藤 理科 サブ
田中 国語 メイン
山田 社会 メイン
山田 国語 サブ

このとき、モデルクラスTeacher.php, Subject.phpに加えてTeacherSubject.phpをそれぞれ以下の様に用意します。

app\Teacher.php

app\Subject.php

app\TeacherSubject.php

こんな感じでwithPivotを使うことで中間テーブルの情報を取得することができます。中間テーブルのモデルクラスはIlluminate\Database\Eloquent\Relations\Pivotを継承して作ります。

また、ある講師に対してメインの科目だけ欲しい場合は

という風にwherePivotで絞り込むことができます。

Eloquentのリレーションは結構奥が深いので、是非ともしっかりとマスターしたいですね。

LaravelとVue.jsで多言語対応を行う

今回は、LaravelとVue.jsを用いたプロジェクトで多言語対応を行うやり方を紹介します。
まず、resources/langに対応する言語のjsonファイルを置きます。とりあえず、日本語と英語を想定してja.json,en.jsonとします。

ja.json

en.json

次に、Laravelのbladeで表示する方法です。

index.blade.php

1つ目の方法は__ヘルパ関数を使用する方法です。翻訳文字列のキーを翻訳したものに変換するヘルパ関数です(Laravel標準のヘルパ関数なのでbladeだけでなく、モデルやコントローラでも使えます)。これで変換した文字列をMustache記法でechoします。
もう1つの方法はbladeの@langディレクティブを用いる方法です。このように2通りの書き方ができますが、どちらかに統一したほうがわかりやすいかもです。

次に、Vue.jsでの多言語対応の方法です。
vue-i18nというVue.jsのプラグインを使います。vue-i18nについての詳しい説明はこことかここを読んで下さい。
まず、

でvue-i18nをインストールします。
次に、こんな感じでvue-i18nをjs側で読み込みます。

main.js

MainComponent.vue

これで、Vue.jsで多言語表示ができるようになります。

ただ、1つ問題がありまして、vue-i18nでは第一階層のデータしか読み込めないので、

ja.json

en.json

のようなデータがこのままでは読み込むことが出来ないのです。
その場合は以下のように一旦blade側で加工してからコンポーネントに渡します。

index.blade.php

main.js

MainComponent.vue

自分はこんな感じのやり方でやりました(もしかしたらもっといいやり方もあるかもしれないので、他にいいやり方があれば教えていただければと思います)。

また、今回は言語切替機能については触れませんでしたが。そのあたりについてはこちらが参考になりました。

Axiosのファイル送信でハマった話

今月こそはVuexについてまとめようと思っていたのですが、Vuexについてはじっくり余裕を持って書けるときに書きたいということで、今回はAxios(Ajaxリクエストを送るためのpromiseベースのHTTPクライアント)でファイル送信を行うときにハマった話を書こうと思います。

今回やろうとしたのは、画像ファイルとかも含む編集画面で、例えばVue.jsでモーダルの編集フォームを作って、PATCHメソッドでAjaxで編集内容を送信するというケースでした。
まず、下記がうまくいかないケースです。

そしたらフォームが空になっていました(大汗)。
何故うまくいかないかわかりますか?
正解はaxiosのメソッドにはgetとかpostとかはあってもpatchというメソッドは用意されていないのです。
PHPがPOSTメソッド以外ではapplication/x-www-form-urlencodedやmultipart/form-dataで渡されたパラメタの処理をしてくれない仕様だから
です。(2018/9/9 一部修正、こちら参照)なので、どうしてもpatchで送りたいときは、下記のようにします。

axiosのメソッドとしてはpostだけど、送る時のデータにpatchメソッドであるという情報を含めるのです。
これで一安心です。

ちなみに、今回のはなかなか気が付かず、かなり悩んだのですが、色々ググってこちらのページに行き着いてようやくわかったというものです。
Laracasts様に本当に感謝。

久々にローカル環境で作業したときにたまにやりがちなこと

とりあえずphp artisan make:migrationでマイグレーションファイル作って、さあphp artisan migrateと打って、

あれ??

https://qiita.com/hondy12345/items/d32ed749fb49e9da7de6
MySQLのサーバー立ち上げてなかった(汗)

旅行Webサービス「Trabum」構想

現在、夏季休暇で小田原に行っていて、その間にWebサービスを作ろうと言うことで、色々と頭を悩ませている。
今回作ろうと思っているのは、旅行記を書いて公開したり、他の人の旅行記を呼んだりするためのWebサービス。名前は旅行の「Travel」とアルバムの「Album」を合わせた「Trabum」(トラバムと読む)。

機能面としては、大雑把にこんな感じ。
・ユーザプロフィール(User)
・旅行記(タグ、いいね、コメント機能)(Travel, Travel_tag, Travel_like, Travel_comment)
・チェックポイント(タグ、いいね、コメント機能、写真)(Checkpoint, Checkpoint_tag, Checkpoint_like, Checkpoint_photo)
・観光地(Spot)
イメージとしては、ユーザがまず旅行記を投稿する。旅行記としては、例えばこんなイメージ。
タイトル:2017-18 年末年始北海道旅行 開始日:2017年12月29日 終了日:2018年1月4日 タグ:北海道、18きっぷ、スキー、グルメ メモ:長いので略
次に、その旅行記に対して具体的な行った場所をチェックポイントとして投稿する。
場所:北海道函館市 到着日:2017年12月29日 出発日:2017年12月30日 タグ:五稜郭、イカ飯、函館山、夜景 メモ:長いので略
場所については後述の観光地と結びついているイメージ。さらに、チェックポイントには写真を入れることが出来る。
旅行記、チェックポイントに対して他のユーザはいいねとコメントが出来る。
観光地については、1つのチェックポイントに対して1つの観光地が結びついていて、ユーザがチェックポイントを投稿するときすでにその観光地があればそれを選択して、なければ新規の観光地を追加する。観光地には地名、位置(Google Maps APIを使うことを検討)、紹介文などが入る。また、ユーザが観光地について書かれたチェックポイントの一覧を見ることが出来る。

次に、使用する技術要素としてはこんな感じか。
・PHP(7.2)
・Laravel(5.6)
・JavaScript
・Vue.js, Vuex(Vue-router,Vuetifyは使うかどうか未定)
・MariaDB
・Apache
・Valet
今回はMacのローカル環境で開発するのでValetを使おうかと。Dockerも使いたかったけど、今の低スペックマシンだとどうも微妙なので。
実際に一般公開するとなったらAWSを使おうと思っている。将来的にはスマホアプリでも投稿や閲覧が出来るようにしたいと思う。

まだ作り始めたばかりだけど、何とか今年中に一般公開できればいいなと思う。

PHPフレームワーク Laravel入門

今のところ、書店でよく売られているLaravelについて書かれた本はそんなに多くなく(どちらかというとCakePHPの方がよく売っている印象)、かつ現時点では知っている限りでは一番新しい本ではないかと思う。
本の印象としては、Laravelの基本的なことがコンパクトにまとめられていて、全体的に読みやすいと思う。個人的にはLaravelのミドルウェアについて理解が浅かったころChapter4の「リクエスト・レスポンスを補完する」を読んで理解が深まった気がする。
欲を言えば、最後のChapter7がいろいろな内容(セッション、ページネーションなど)があっさりとすまされているので、その辺りをもう少し増強してほしかったという気もする。
ちなみに、この本はLaravel5.4(2018年7月30日時点最新は5.6)を前提に書かれているので、それ以外のバージョンを使う場合は日本語版Laravelドキュメントも参考にしつつ(英語が得意な方は公式サイトでいいかと)、手を動かしながら使っていくことでLaravelへの理解が深まるのではないかと思う。

技術ブログ始めました

今日からWebプログラミングを中心とした技術ブログを始めてみました。主に以下のテーマでブログを書いていこうと思います。
・PHP
・JavaScript
・MySQL
・Laravel
・Vue.js
・インフラ技術(サーバ周り、ネットワーク、セキュリティなど、後はDockerとか)
他にも余裕があればスマホアプリ開発や機械学習などについても少しは書ければいいなと。
後、個人的に旅行に関するWebサービスを作ろうと思っているので、それの開発記録も書いていこうかと。

技術とは関係ない個人のブログはこちら。合わせてよろしくお願いします。