2021年の振り返り
今年も残すところあと1日となりました。今まで振り返りブログは書いてこなかったのですが、来年のためにも振り返ってみたいと思います。
1月
技術書典10に参加してKtorとNuxt.jsの薄い本を頒布しました。
年末の慌ただしい時期に執筆したので当初思い描いていた内容を少し削っての頒布となってしまいました。。
それでも無事に出せたことはホッとしましたね
2月
これと言った活動はしていない模様。。
TDD Boot Campを長野でやるやる詐欺をしているツイートが見受けられた。。
やりたいんだけど、オンラインかオフラインかで葛藤している自分がいるんです。。。
3月
メルカリで中古のMacbook Airを購入。久しぶりにElmに触れた。フロントの学習でいい題材ないですかね~
三男の高校合格もあり、一安心
4月
今年初ブログをアップしたのが4月。しかも近況報告でほとんど自己学習ができていない証拠で情けない。。
仕事面では大型リニューアルを行い、バタバタした月でした。
たしか副業しないかと声をかけていただいたのがこの時期だったかな。
Ktorのお仕事だったのでめちゃくちゃ心揺れたが、所属会社が副業を許可していないので泣く泣く断念。。
お金を貯めたいという話で会社に相談したので、その代わりにR&D部門のお仕事を休日に行う動きが始まった。
5月
プロダクトのJavaバージョンをまずは11に上げたい!と思い、孤軍奮闘したのがこの時期だったかと思います。
バージョンを上げること自体は大したことないんですが、UnitTestで利用しているGroovy(Spock)のバージョンを上げるのがめちゃくちゃ大変だった。。
一人でほぼやりきったけど、残念ながら取り込まれることはなかったのは辛かった。
合わせてSpringBootAdminも導入したいと動きBugfixの影響で導入が加速されて全て用意したのになんの説明もなくスルーされるという仕打ちも受けたのもこの時期。
6月
この頃から尿管結石再発、逆流性食道炎による体調不良が起き始め「すべての元凶は肥満だ!」と考えてダイエットを開始した。
朝食をプロテインに変えたり、食事制限をしたり、フィットネスバイクを始めたりと積極的に動いていた。
結果的にどのぐらい痩せたかは12月に書きたいと思います。
7月
また技術書典11に個人と会社で応募を行い、個人は頒布できずという不甲斐ない結果に。。
書きたいと思っていたネタの知識がほぼほぼ失われてしまっていて、調査にすこぶる時間がかかってしまったのが原因。
会社名義の薄い本はなんとか頒布することができ、無料にしたことでたくさんの方にダウンロードしてもらうことができました。
8月
なんでかは覚えていないんですが自作PCを作りたい熱がめちゃくちゃ高く、ギリギリの予算で組み上げました。
このブログもその自作PCで書いています。ただ、目的なく作ったのでマイニングを行うだけのPCとかしてしまっています。。
開発PCに変えねば。。。
9月
これと言った活動はしていない模様。。
まぶたの痙攣に悩まされてたみたい。ストレスですな。。
10月
今年もPHPカンファレンスの当日スタッフに応募して参加させていただきました。
オンライン開催2日間でバタバタしたがやっぱ楽しいですね!
来年もオンラインであればぜひ当日スタッフとして参加したいと思います。
11月
ペチコンに参加したことで熱が上がりPHPやってみたりフロント開発始めてみたりを少し自己啓発をしていた時期。
とはいえ大したことできてないのでもっと頑張らないといけないですね
12月
お仕事は体制が変わったことでフロントメインのお仕事になっています。
苦手な分野ではあるものの、フロント技術を身に着けたいと思っていたのでなんとかやれている感じでしょうか。。
気になる半年間のダイエット成果は「22kg」の減量に成功しました!
頑張ればやれるものですね!!目標体重にはまだ届いていないのでもうちょい続けていきたいと思います。
総評
かんたんに1年を振り返ってみましたが、自己啓発が少ないが反省点ですね。
インプットを増やしてアウトプットを増やしていかないとです。
全体的にモチベーションが下がっていて良くない1年だったかな。でも逆に新たな悩みや課題に気づけた1年でもあったかと思います。
それらも踏まえていい1年だったのではないかと思います。
今年も大変お世話になりました。来年もよろしくお願いします!
(来年の目標は年明けに書くと宣言して自分を追い込む)
デスクを新調しました
新型コロナウィルスがまん延以降リモートワークを行っていますが、その前から子供のお古であるニトリの学習机をPCデスクとして活用していました。
これからもフルリートでお仕事をするので、妻にお願いして新しいPCデスクをようやく購入することができました。
今までのデスクはコチラ
2つの学習机をL字にして使っていました。
自作PCと個人mac、仕事用macを利用しているためかなりゴチャゴチャしてますね。。
新しいデスクを設置する前に2つの学習机を処分する必要があります。長野市のゴミ処理場に自分で持っていけば、重さに応じてお支払いをすればいいんですが、さすがに学習机2つを自力で運ぶ車がありません。
写真には写っていませんが、机の横には2人掛けソファもあり一緒に廃棄もしたいので業者を探すところからはじめました。
(妻からはリビングにおいてある3人掛けソファも捨てたいと要望あり)
いくつかお問い合わせさせて頂いた結果、ご近所に不用品回収のマンモスさんにお願いさせていただきました。
予算にあう金額で、2階からの運び出しもしていただき大変助かりました!
新しいデスクですが、荷物が多くあるので妻が許す予算の中でできる限り大きいデスクを探した結果、こちらになりました。
160cm幅のなかなかデカ目のデスクです。購入時はもうちょい安く購入することができました。
ということで新デスクがコチラ
とりあえず設置してみましたが、ごちゃり度はあまり変わらないですね。。(もっと真ん中で使えよって感じです)
使い始めて設置を改善していくしかないですね。
モニターをデスクトップとノートで共用している関係で設置が難しいのですが、皆さんどのようにされているんですかね?
ぜひアドバイスをいただけると幸いです!
LaravelでRESTfulAPIを作る〜その2〜
LaravelでAPIを作るの最終回です。MySQLとの接続を行っていきます。
Modelの作成
LaravelのORM、Eloquent(エロクアント)を使っていきます。
PHPが動いているDockerコンテナに入って artisan
コマンドでModelを作ります。
$ docker-compose exec php bash $ php artisan make:model Todos -f
App/Models
配下に Todos.php
が作られます。
class Todos extends Model { use HasFactory; }
class TodosFactory extends Factory { /** * The name of the factory's corresponding model. * * @var string */ protected $model = Todos::class; /** * Define the model's default state. * * @return array */ public function definition() { return [ // ]; } }
調べていて気がついたのですが -c
や -r
、 -api
をつけることで Controllerも作ってくれるようです。
今回は -f
オプションでモデルとファクトリを作成します。
Todosに追記
カラム情報とtimestampeがないことを定義します。
protected $fillable = [ 'task', ]; public $timestamps = false;
準備はこれで終わり。ControllerからModelを使ってDBアクセスをしてみます。
検索
Todos::all
で全件を取得し、 Todos::find
でプライマーキーで検索を行います。検索した結果をそのままレスポンスに返しています。
JSON_UNESCAPED_UNICODE
はマルチバイト文字が文字化けを起こさないように設定しています。
public function getTodos(Request $request): JsonResponse { $todos = Todos::all(); return response()->json($todos, 200, ['Content-Type' => 'application/json;charset=UTF-8', 'Charset' => 'utf-8'], JSON_UNESCAPED_UNICODE); } public function getTodo(Request $request, int $id): JsonResponse { $todo = Todos::find($id); return response()->json($todo, 200, ['Content-Type' => 'application/json;charset=UTF-8', 'Charset' => 'utf-8'], JSON_UNESCAPED_UNICODE); }
登録、更新、削除
DB::beginTransaction
でトランザクションを開始し、成功時にはコミット、失敗時にはロールバックしています。
単一テーブルへの操作なので特に必要ないですが、お試しに入れてみました。Controllerにトランザクション処理があるのは正直気持ち悪さはありますがw
public function createTodo(Request $request): JsonResponse { $task = $request->input('task'); DB::beginTransaction(); try { $new = Todos::create([ 'task' => $task, ]); DB::commit(); } catch ($exception) { DB::rollBack(); } return response()->json($new, 201, ['Content-Type' => 'application/json;charset=UTF-8', 'Charset' => 'utf-8'], JSON_UNESCAPED_UNICODE); } public function updateTodo(Request $request, int $id): JsonResponse { $task = $request->input('task'); DB::beginTransaction(); try { $todo = Todos::find($id); $todo->update(['task' => $task]); DB::commit(); } catch ($exception) { DB::rollBack(); } return response()->json($todo, 201, ['Content-Type' => 'application/json;charset=UTF-8', 'Charset' => 'utf-8'], JSON_UNESCAPED_UNICODE); } public function deleteTodo(Request $request, int $id): JsonResponse { DB::beginTransaction(); try { $todo = Todos::find($id); $todo->delete(); DB::commit(); } catch ($exception) { DB::rollBack(); } return response()->json(null, 200); }
まとめ
とりあえず目的のAPIを作ることはできました。検索はもっと複雑な絞り込みや結合を試さないとですし、ロジックをControllerに書いてしまっているのでソフトウェアアーキテクチャを導入して責務を明確にしてあげる必要がありますしユニットテストも書きたいし。まだまだやることはありますね。
それらについてはまだ後日余力があれば試したいと思います。
今回作ったソースはGitHubに上げてあります。
LaravelでRESTfulAPIを作る〜その1〜
前回の続きでLaravelでAPIを作っていきます。
以前の記事はこちら
作る内容はTODO用のAPIで元ネタは僕が技術書典9で頒布したKtorをLaravel版に作り変えていきます。詳細は以下を御覧ください。
DDLの準備
MySQLにテーブルを作成するためのDDLを用意します。 docker/db/sql
配下に init.sql
ファイルを作成します。
CREATE TABLE todos ( id int(11) NOT NULL AUTO_INCREMENT, task TEXT NOT NULL, PRIMARY KEY (id) );
ファイルを配置したらdocker-composeを起動させ、テーブルが作られていることを確認します。
もし作られないようであれば docker/db/data
内をすべて削除してから起動してみてください。
.env
LaravelからMySQLに接続するための設定を.envファイルに設定します。
その他にもRedisやメールサーバ、AWSの設定などがありますが、デフォルトのままでOKです。
DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=database DB_USERNAME=docker DB_PASSWORD=docker
初期画面の削除
RESTfulなAPIサーバになるので初期画面を表示は削除します。
server/routes/web.php
に書かれているルーティングはコメントにしておきます。 http://localhost
にアクセスすると404が表示されます。
エンドポイント
APIの接続口となるエンドポイントを先に設定してしまいます。 今回利用するエンドポイントは以下になります。
- GET /todos
- GET /todos/{id}
- POST /todos
- PUT /todos/{id}
- DELETE /todos/{id}
server/routes/api.php
に追記します。
Route::get("/todos", [TodosController::class, "getTodos"]); Route::get("/todos/{id}", [TodosController::class, "getTodo"]); Route::post("/todos/{id}", [TodosController::class, "createTodo"]); Route::put("/todos/{id}", [TodosController::class, "updateTodo"]); Route::delete("/todos/{id}", [TodosController::class, "deleteTodo"]);
/todos
にアクセスされると TodosController
の getTodos
メソッドが呼び出されるという意味となります。
Controller
server/app/Http/Controllers
に TodosController
クラスを作っていきます。とりあえず空っぽのResponseを返すようにしておき、実際のDBとの接続は次回としたいと思います。
<php use Illuminate\Routing\Controller as BaseController; class TodosController extends BaseController { public function getTodos(Request $request): JsonResponse { return response()->json([], 200); } public function getTodo(Request $request, int $id): JsonResponse { return response()->json([], 200); } public function createTodo(Request $request, int $id): JsonResponse { return response()->json(null, 201); } public function updateTodo(Request $request, int $id): JsonResponse { return response()->json(null, 201); } public function deleteTodo(Request $request, int $id): JsonResponse { return response()->json(null, 201); } }
$ curl http://localhost/api/todos []
今回はここまで。次回はDBとの接続を行い完成を目指します。
Dockerに作ったPHP環境にIntellij IDEAで接続してDebugする
前回はDocker上にPHP環境を作るところまで行いました。今回はそのDocker上のPHPにIntellij IDEAから接続してDebugするところまで作りたいと思います。
この記事はIntellij IDEA Ultimate Editionで行っていますが、PhpStormでも同様の方法になると思います。(自信なし)
なお、私のIntellij IDEAは日本化されてますので適切に読み替えてください。
プラグインのインストール
※PhpStormをご利用の方は読み飛ばしていただいて大丈夫です。
Intellij IDEAにPHP関係のプラグインをインストールします。
Dockerの設定
Preferences
のDocker
を開いて接続Dockerを設定します。
私の環境はmacですので Docker for Mac
を選択します。
次にPHP
を選択して言語レベルとCLIを設定します。
言語レベルは利用しているPHPのバージョンに合わせて8.0を設定し、CLIインタプリタはDocker用をして新たに登録します。
Form Docker, Vagrant, VM, WSL, Remote
を選び画像のように設定します。
すると、DockerのPHPを読み込んでCLIインタプリタが作成されます。
最終的には次の画像のような設定となればOKです。
続いてPHP
->サーバ
の設定を行います。これはDockerのXdebugに接続するために行います。ポイントはserver
=/var/www
であることを紐付けることです。
実行
上部メニューの構成の追加
をクリックしPHPリモートデバッグ
を登録します。
デバッグ実行の虫アイコンと電話のようなアイコンのリッスンを起動します。
適当な箇所にブレイクポイントを貼って http://localhost
にアクセスすると指定した箇所で止まることができました。
かんたんに接続することができましたね。環境構築はこれで終わりで次回からはAPIサーバを作っていきたいと思います。
Docker上にLaravel環境構築
普段はJavaとSpringBootで開発しているのですが、PHPカンファレンス2021にスタッフ参加したことでモチベーションがあがりLaravelでなにか作りたいなと思い、環境構築しました。
数年前にPHP開発をしたこともありましたが、Vagrantを利用した環境だったので昨今の当たり前環境を学ぼうという魂胆もあります。
以下の環境を作ろうと思います。
図らずともバージョンは8で統一されましたw
ディレクトリ構成
以下の構成としました。多分よくある構成かと思われます。
server
にはLaravelのソースが入る形となります。
root ├ docker-compose.yml ├ docker │ ├ php │ │ ├ php.ini │ │ └ Dockerfile │ ├ db │ │ ├ data │ │ ├ logs │ │ ├ sql │ │ └ my.cnf │ └ nginx │ └ default.conf └ server
docker-compose
詳しい解説はしませんが、PHP・Nginx・DBの3つのコンテナを立ち上げます。
version: '3' services: php: container_name: php build: ./docker/php volumes: - ./server:/var/www depends_on: - db nginx: image: nginx container_name: nginx ports: - 80:80 volumes: - ./server:/var/www - ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf depends_on: - php db: image: mysql:8.0.26 container_name: db environment: MYSQL_ROOT_PASSWORD: root MYSQL_DATABASE: database MYSQL_USER: docker MYSQL_PASSWORD: docker TZ: 'Asia/Tokyo' command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci volumes: - ./docker/db/data:/var/lib/mysql - ./docker/db/my.cnf:/etc/mysql/conf.d/my.cnf - ./docker/db/logs:/var/log/mysql - ./docker/db/sql:/docker-entrypoint-initdb.d ports: - 3306:3306
PHP
PHPのコンテナにはcomposerを入れたりaptでモジュールを入れたりする必要があるのでDockerfileを用意します。
aptで入れているモジュールやdocker-php-ext-installはよくわからんので個別に調べないとだな。。。
FROM php:8.0-fpm COPY php.ini /usr/local/etc/php/ RUN apt-get update \ && apt-get upgrade -y \ && apt-get install -y libicu-dev libzip-dev libonig-dev libssl-dev zip unzip \ && docker-php-ext-install zip pdo_mysql \ && pecl install xdebug \ && docker-php-ext-enable xdebug COPY --from=composer /usr/bin/composer /usr/bin/composer ENV COMPOSER_ALLOW_SUPERUSER 1 ENV COMPOSER_HOME /composer ENV PATH $PATH:/composer/vendor/bin WORKDIR /var/www RUN composer global require "laravel/installer"
続いてphp.iniです。これも特段説明することはないのですが、xdebugを入れています。今後はIntellij IDEA(PHPStorm)を使った開発を想定しているのでデバッグできるように入れています。
[Date] date.timezone = "Asia/Tokyo" [mbstring] mbstring.internal_encoding = "UTF-8" mbstring.language = "Japanese" [xdebug] xdebug.client_host = host.docker.internal xdebug.client_port = 9003 xdebug.idekey = PHPSTORM xdebug.mode = debug xdebug.start_with_request = yes
Nginx
Nginxの設定ファイルです。今まではApacheでPHPを動かしていたので実はNginxは初めてです。。触ってみたいと思っていたのでNginxにしています。なのであまり説明できません、ごめんなさい。。。
ただ、ポイントとするとnginxコンテナのルートがserverになっているのでnginxのルートが /var/www/public
=プロジェクトルート/server/public
ということです。
server { listen 80; index index.php index.html; root /var/www/public; location / { try_files $uri $uri/ /index.php?$query_string; } location ~ \.php$ { try_files $uri =404; fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_pass php:9000; fastcgi_index index.php; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_path_info; } }
MySQL
MySQLのデータを永続化するためにホストマシンに保持する形としています。sqlフォルダにDDLを配置しておけば起動時にテーブルを作ることも可能です。このあとTODOアプリを作ろうと思うのでDDLはこちらに配置することになります。
my.confもよくある設定だと思いますが、文字コード・ログ、スロークエリの出力についての設定です。
[mysqld] character-set-server=utf8mb4 collation-server=utf8mb4_unicode_ci default-authentication-plugin = mysql_native_password log-error = /var/log/mysql/mysql-error.log slow_query_log = 1 slow_query_log_file = /var/log/mysql/mysql-slow.log long_query_time = 5.0 log_queries_not_using_indexes = 0 general_log = 1 general_log_file = /var/log/mysql/mysql-query.log [client] default-character-set=utf8mb4
プロジェクトの作成
Docker環境については以上でアプリケーションLaravelのプロジェクトを作っていきます。
コンテナを起動し、PHPコンテナでコマンドを実行します。
$ docker-compose up -d --build $ docker-compose exec php bash root@aafbcadd9d34:/var/www# composer create-project --prefer-dist laravel/laravel ./
しばらく待つと、serverディレクトが作られLaravelの各種ファイルが配置されます。
初期画面
ブラウザから http://localhost にアクセスするとLaravelの画面が表示されると思います。
昔の画面と違うんですね。もっとでかいLaravelって文字が真ん中にあった気がします。
まとめ
今回は初期画面が表示されるまでの環境構築になります。Dockerのおかげで非常にかんたんに構築することができますね。
次回以降はxdebugやRestAPIを作るところをやっていければと思います。
今回作った環境はGitHubにもアップしているので興味があれば参照してみてください。
PHPカンファレンス2021に当日スタッフとして参加しました(#phpcon2021)
2019、2020に続き今年もPHPカンファレンスの当日スタッフとして参加してきました。
過去最高の応募人数となった今回のPHPカンファレンスですが、10/2、3の2日に渡って開催されました。
何してたの?
自分の役割はSNS担当とDiscordの盛り上げ係となります。
Twitter上で質問があれば回答したり、配信の遅れや連絡事項があればTwitterとFacebookに投稿するといったことを行います。
前回も同じ役割だったし、SNS広報を取りまとめてくれている @mukakenさんが事前に説明してくれていたのでスムーズに行えたと思います。ありがとうございました!
Discordでは今回始めての試みとなるスポンサーツアーがあり基本そこに入り浸っていました。各企業のプロダクトやエンジニアリング文化など聞くことができスタッフでありながら楽しく参加することができました。今後もぜひ続けていただきたいですね。
スポンサーツアーセッション結構踏み込んだお仕事の話をしてくれるので気になる企業があれば参加するとイメージ湧きやすい#phpcon2021 #php #phpcon
— てら☀️ (@chichi1091) 2021年10月2日
次回も参加する?
オフライン開催でリモートスタッフが可能であればもちろん参加したいと考えています。とはいえ、配信現場のLIVEを見ているとやっぱ現地に行きたくなりますねw
ペチコンの配信LIVEを見てるとやっぱ現場に行きたくなる pic.twitter.com/AoXKDqkX65
— てら☀️ (@chichi1091) 2021年10月3日
次回は9/24、25に開催予定ですのでまだお会いできることを楽しみにしています。
コアスタッフ・運営委員、当日スタッフの皆様大変お疲れ様でした!
来年のPHPカンファレンス2022は9/24,25に開催予定です!
— PHPカンファレンス2021 (@phpcon) 2021年10月3日
(ただし、今後の時勢により不透明なところがあるので開催形態については後ほど告知します。)
来年もよろしくお願いします!https://t.co/BzDgBPitgz#phpcon #phpcon2021 #phpcon2022