もがき系プログラマの日常

もがき系エンジニアの勉強したこと、日常のこと、気になっている技術、備忘録などを紹介するブログです。

laravel で HTTP キャッシュ

はじめに

こんばんは。

今回も備忘録です。

今回は、LaravelでAPIのHTTPキャッシュを試してみました。

Laravel標準で搭載されている SetCacheHeaders というミドルウェアで実現できるみたいです。

参考サイト

本題

Controller

<?php

namespace App\Http\Controllers;

use Illuminate\Http\JsonResponse;
use Illuminate\Support\Facades\Log;

class ExampleController extends Controller
{
    public function index(): JsonResponse
    {
        Log::info('index action!');
        return new JsonResponse('example api time => ' . time());
    }
}

API Route

<?php

use Illuminate\Support\Facades\Route;
Route::get('example', 'ExampleController@index');

Image from Gyazo

この状態で SetCacheHeaders を使ってみます。

API Route

<?php 

Route::get('example', 'ExampleController@index')->middleware('cache.headers:public;max_age=10');

Image from Gyazo

max_ageを10秒にしているので、10秒間はlaravel側までアクセスが来ないようになりました。

終わりに

SetCacheHeadersのおかげでかなり簡単に設定できました。

現場からは以上です。

CleanArchitecture輪読会始まりました

はじめに

こんばんは。

今週ついに新たなオンライン輪読会が始まりました。

今回の題材は「CleanArchitecture」です。

Clean Architecture 達人に学ぶソフトウェアの構造と設計

Clean Architecture 達人に学ぶソフトウェアの構造と設計

初回担当は僕で、担当箇所は1, 2, 3章でした。

内容

まだまだ概要部分なので特筆するところは少なかったのですが、個人的に刺さったのは 簡単に変更できてこそのソフトウェア というところです。

当たり前なんだけど、文章で読んで、たしかにそのとおりだなと思いました。

また、 何をすべきかではなく何をすべきでないか というところは、別の本で同じ様な事書いてたなと思い、ふむ。思いました。

終わりに

まだ第一回でメンバーも探り探り進めてますが、毎週欠かさずやることを目標に読破したいと思います。

また、自分は個人で同時に 実践ドメイン駆動設計 も読み進めてるので、混乱しないように、かつ、それぞれの本の伝えたい点を把握しつつ、ゆっくり着実にいきたいなとおもいます!

では。また来週。

mysql8のwindow関数(ROW_NUMBER)

はじめに

こんばんは。

簡単な備忘録ですが、 初めて使用してみたので、ブログに残しておきます。

mysql8のwindow関数のROW_NUMBERを試してみました。

今まで使ってなかったのか。。。という話ですが。

本題

テストテーブル作成

CREATE TABLE `test_users` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `email` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'メールアドレス',
  `name` varchar(128) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'パスワード',
  PRIMARY KEY (`id`)
);


CREATE TABLE `test_orders` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `user_id` bigint(20) unsigned NOT NULL COMMENT 'ユーザーID',
  `fee` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '料金',
  PRIMARY KEY (`id`)
);

テストデータ作成

select * from test_users;
+----+-------------------+--------+
| id | email             | name   |
+----+-------------------+--------+
|  1 | test_01@gmail.com | test01 |
|  2 | test_02@gmail.com | test02 |
|  3 | test_03@gmail.com | test03 |
|  4 | test_04@gmail.com | test04 |
|  5 | test_05@gmail.com | test05 |
+----+-------------------+--------+



select * from test_orders;
+----+---------+-------+
| id | user_id | fee   |
+----+---------+-------+
|  1 |       1 |  2000 |
|  2 |       1 |   500 |
|  3 |       1 |  4000 |
|  4 |       1 |  1000 |
|  5 |       1 |  1000 |
|  6 |       2 |   800 |
|  7 |       1 |  1000 |
|  8 |       4 |   200 |
|  9 |       2 | 10000 |
| 10 |       1 |  3000 |
| 11 |       1 |  2000 |
| 12 |       3 |  4000 |
| 13 |       2 |  1090 |
| 14 |       5 |   200 |
+----+---------+-------+

使用例

例えば、各ユーザーがそれぞれ何回注文したかみたいなのをとれたりします。

SELECT u.id, u.email, ROW_NUMBER() OVER (PARTITION BY u.id) AS 'row_count' FROM test_orders AS o JOIN test_users AS u ON (o.user_id = u.id);
+----+-------------------+-----------+
| id | email             | row_count |
+----+-------------------+-----------+
|  1 | test_01@gmail.com |         1 |
|  1 | test_01@gmail.com |         2 |
|  1 | test_01@gmail.com |         3 |
|  1 | test_01@gmail.com |         4 |
|  1 | test_01@gmail.com |         5 |
|  1 | test_01@gmail.com |         6 |
|  1 | test_01@gmail.com |         7 |
|  1 | test_01@gmail.com |         8 |
|  2 | test_02@gmail.com |         1 |
|  2 | test_02@gmail.com |         2 |
|  2 | test_02@gmail.com |         3 |
|  3 | test_03@gmail.com |         1 |
|  4 | test_04@gmail.com |         1 |
|  5 | test_05@gmail.com |         1 |
+----+-------------------+-----------+

終わりに

自分が使用したことがあるものだけなので、簡単ですがこれだけです...w ROW_NUMBER以外にも使用するときが出てくると思うので、その時にまたブログに残そうと思います。

雑な2020年の目標

はじめに

こんばんは。

子供が年末から体調不良で、実家から帰れない状況の僕です。

この空いている時間に、雑に2020年の目標を考えてみました。

前回の記事のTryとかぶっているのですが、こちらはよりまとめたものです。

f:id:kojirooooocks:20200104034506p:plain

本題

ソフトウェア設計に関しての知識を蓄える

現在、師匠と一緒にお仕事させてもらっているのですが、去年は自分の知識不足で足を引っ張っているところがありました...

自分が足りない部分は山程ありますが、直近で足りてないのはソフトウェア設計の知識・ノウハウだと思っています。

このあたりを読書などで蓄えて、設計周りのブログなどを書いてみたいと思います。

3回以上登壇する

去年簡単なLTを2回経験したので、去年以上の回数である3回を目指したいです。

3回のうち、1回以上は技術系ネタでLTなどしようと思います。

6件以上のOSSへPR

去年は簡単なものを3件ほどPRをマージしてもらいました。

今年も簡単なものから積極的に動いて、倍の6件以上のPRをだして、マージしてもらうまでを目標にしたいです。

週一のブログを落とさない

WBEWでは、最悪週2までブログ記事数を貯められるのですが、その制度に去年は何回か助けられた事がありました。

今年はWBEWの名の通り、週一必ずブログを書くようにしたいと思います。

1人アドベントカレンダーの完走

今年は11日分で終わってしまいました...

今回の失敗は、準備と下調べが足りなかったことが原因です。

今年は3度目の正直ということで、必ず完走したいと思います。

オンライン輪読会を2冊分やりたい

やりたいやりたいと言っていたのですが、早速今月からCleanArchitectureのオンライン輪読会を行うことが決定しました。

計算ではおそらく3〜4ヶ月で読み切れるはずなので、今年もう一冊出来ればやりたいと思っています。

一つの言語に偏らないような本で、これ読んでおいたお方がいい!みたいなのあれば是非教えてほしいです。

プランク120秒やる(できれば毎日)

去年頑張ったのですが、ダイエットだけはなぜか続きませんでした。

今年こそはと重い腰をあげようと思います。

継続力をつけるために、理想としては例外なく毎日とにかくやりきりたいです。

自分Release Noteをつけるようにする

前々から付けたかった、自分リリースノートをつけ始めようと思います。

ちょうど1月が自分の誕生日なので、0.36.0 からはじまるかな?

終わりに

バーっと雑に書いたので誤字などあるかもです。

まだまだ増えていくかもしれませんが、こんな感じです。

今年もよろしくおねがいします!!

ChallengeEveryMonthを立ち上げて

はじめに

こんにちは。

この記事は challenge-every-month Advent Calendar 2019の25日目の記事です。

無駄に最終日をとってしまって後悔しています。

ChallengeEveryMonthは @yoshitaku_jpさんと、WBEWよりゆるく、でも目標立てて新しいことをやっていきたいね。みたいな会話から立ち上ることになりました。

立ち上げて何ヶ月経ったんだっけ? 今年の2月だったは覚えているので10ヶ月くらいたってます。

正確な日わかれば、よしたくさん教えてください。。。

最初の方は人数も少なかったのですが、よしたくさんの勧誘で12月現在、18人になっています。

f:id:kojirooooocks:20191226000349p:plain

本題

今回の記事では、自分の1年の振り返りをしてみたいと思います。

振り返り

よかったところ(Keep)

1. AdventCalendarを行えた

この記事もAdventCalenderの記事になります。

また、GWのAdventCalendarもやれました。

こういうイベント系は基本的に共同運営者のよしたくさんがどんどんアイディアを持ってきてくれたり、メンバーの方からのアイディアがあったりと、ありがたいです。自分は何もしてないのが申し訳ない...

2. オンライン輪読会が楽しかった

WBEWの振り返りブログでも書いたのですが、オンライン輪読会がとても勉強になりました。

反省すべきところ(Problem)

1. チャレンジの失敗が続いた

自分の目標の立て方に問題があるんですが、チャレンジの失敗が続いてました。

WBEWのように強制退会的なペナルティもないので、チャレンジ達成は自分次第なので、もう少し目標をうまく立てるべきでした。。。

今後やってみたいこと(Try)

1. PHP以外の言語の習得

前々から言ってるけど、そろそろ本当に習得したいので、来年こそはとがんばります。

いま頭にあるのは、 前から少しだけやってたgolang, swiftあたりです。

最終目標は案件として取れるようになれるくらいの練度になることです。

2. OSSへの貢献

今年はちょくちょく、貢献できましたが、来年度からは目標を定めて、何件以上という感じで動いていこうと思います。

3. ライブラリの開発・保守

現在何個かネタは思いつているので、来年は積極的にライブラリ開発をして行きたいです。

また、以前作った laravel-json-schema-veridatorの保守とかもやらないとなと思ってます...

4. LTなどの登壇

今年は合計2回だけで、かつ非技術系なLTだったので、来年は回数も3回以上で、かつ、技術系のLTも1件はやりたいなとおもいます。

5. オンライン輪読会再び

今年やってすごく良かったのが、オンライン輪読会です。

自分ひとりだと読むの辛いなぁと思うような本をみんなで読むという試みはまじで良かったです。

来年も一冊やってみたいです。

現在人員を募集してて、合計3人になればやってみたいです!

6. 1人アドベントカレンダーの完走

今年も1人アドベントカレンダーを行ったのですが、12月の仕事の忙しさのせいで、今年も途中リタイアという結果になりました...

一昨年の失敗を踏まえて、準備期間を設けていたのですが、まだ準備期間が足りなかったみたいです。

3度目の正直で、来年こそは完走したいと思います。

終わりに

こんな感じで、やってみたいことがいっぱいになりました。

来年もどんどんいろんなことにチャレンジしていきたいと思います。

プログラマー35歳定年説の、まさに35歳になりましたが、気持ち的にはまだバリバリ25歳くらいなんで、これからも新しいことにどんどんチャレンジしていきます!

こんな感じの締まらないラストですが、ChallengeEveryMonthは、一緒に頑張る仲間を随時募集しています!

現在参加している方々はエンジニア畑の方ばかりですが、チャレンジしたいという精神にエンジニアであることは関係ありません。

どんな職業の方でもOKです。

来年から新しいことに挑戦してみたい!

諦めてたことを来年こそはやりたい!

そんな野望がある方、TwitterのDMいただければ何時でも招待させていただきます!

来年もみんなで頑張るぞ!

Symfony5を試してみた

はじめに

こんにちは。

この記事はSymfony Advent Calendar 2019 24日目の記事です。

昨日は@ringtail003さんのSymfony4+ で Server-Sent events を使ってみようでした。

直近ではLaravelを触っており、SymfonyはAdvent Calendarを書くときだけ触っています。

なので1年ぶりなので完全に忘れています。

ちなみに去年のAdvent CalendarはSymfony4でNelmioApiDocBundleを試してみたという記事を書いています。

今回は先月Symfony5がリリースされたので、インストールして試してみようと思います。

こちらの記事をみるに、新規機能はなく不具合の修正が中心とのことです。

なので、今回やることはSymfony4でも再現できるものだと思います。

では早速始めます。

参考サイト

本題

インストール

以下のコマンドでインストールしてみます。

$ composer create-project symfony/website-skeleton sample_project
$ ./bin/console -V
Symfony 5.0.2 (env: dev, debug: true)

5.0.2入りました。

参考サイトで紹介されている通り、ローカルサーバを立てる用のコマンドを入れたいのでインストールします。

$ composer req server

[InvalidArgumentException]                                                    
Could not find package symfony/web-server-bundle in a version matching 5.0.*  

5系ではまだ使えないようでした...

しょうがないのでphpコマンドで行きます。

$ php -S localhost:8080 -t public
PHP 7.3.8 Development Server started at Tue Dec 24 01:14:16 2019
Listening on http://localhost:8080
Document root is /Users/yudai_fujita/projects/study/php/symfony/sample_project
Press Ctrl-C to quit.

f:id:kojirooooocks:20191224023743p:plain

入りました。

CRUD作成

試しに簡単なCRUDをつくってみます。 コマンドは以下

$ ./bin/console make:crud

ただ、Entityを先に作る必要があるので、適当に作っておきます。

$ php bin/console make:entity SampleUser

 created: src/Entity/SampleUser.php
 created: src/Repository/SampleUserRepository.php

Entityは以下です。

<?php

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity(repositoryClass="App\Repository\SampleUserRepository")
 */
class SampleUser
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\GeneratedValue()
     * @ORM\Column(type="string", length=128)
     */
    private $name;

    /**
     * @ORM\GeneratedValue()
     * @ORM\Column(type="string", length=255)
     */
    private $email;

    /**
     * @ORM\Column(type="text")
     */
    private $description;

    public function getId(): ?int
    {
        return $this->id;
    }
}

作成したEntityからマイグレショーンファイルを作成します。

$ php bin/console doctrine:migrations:diff
Generated new migration class to "/Users/yudai_fujita/projects/study/php/symfony/sample_project/src/Migrations/Version20191223164904.php"

To run just this migration for testing purposes, you can use migrations:execute --up 20191223164904

To revert the migration you can use migrations:execute --down 20191223164904

出来たマイグレーションファイルを流し込みます。

$ php bin/console doctrine:migrations:migrate
                                                              
                    Application Migrations                    
                                                              

WARNING! You are about to execute a database migration that could result in schema changes and data loss. Are you sure you wish to continue? (y/n)y
Migrating up to 20191223164904 from 0

  ++ migrating 20191223164904

     -> CREATE TABLE sample_user (id INT AUTO_INCREMENT NOT NULL, name VARCHAR(128) NOT NULL, email VARCHAR(255) NOT NULL, description LONGTEXT NOT NULL, PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_unicode_ci` ENGINE = InnoDB

  ++ migrated (took 221.3ms, used 20M memory)

  ------------------------

  ++ finished in 268.5ms
  ++ used 20M memory
  ++ 1 migrations executed
  ++ 1 sql queries
——

色々詳細が出てるのがいいなぁ。

とか思いつつ、やっとCRUD作成コマンドを実行します。

$ ./bin/console make:crud SampleUser

 created: src/Controller/SampleUserController.php
 created: src/Form/SampleUserType.php
 created: templates/sample_user/_delete_form.html.twig
 created: templates/sample_user/_form.html.twig
 created: templates/sample_user/edit.html.twig
 created: templates/sample_user/index.html.twig
 created: templates/sample_user/new.html.twig
 created: templates/sample_user/show.html.twig

           
  Success! 
           

 Next: Check your new CRUD by going to /sample/user/

出来たみたいです。 CRUD画面にアクセスしてみます。

f:id:kojirooooocks:20191224023809p:plain

出来てます!

さっそくデータを作ってみようと Create New をクリックすると

f:id:kojirooooocks:20191224023822p:plain

エラー。

Entityで用意したプロパティにSetter/Getterを追加してませんでした。。。

追加すると問題なく新規作成ができました。

修正も問題ありません。

f:id:kojirooooocks:20191224023907p:plain

EasyAdminBundle導入

せっかくなので、なんらかのBundleを入れてみようと思ったのですが、まだ5系対応されてないのが多かったです。。。 調べるとEasyAdminBundleは5系対応されていたので、入れてみました。

インストールは以下

$ composer require easycorp/easyadmin-bundle
Using version ^2.3 for easycorp/easyadmin-bundle
./composer.json has been updated
Loading composer repositories with package information
Updating dependencies (including require-dev)
Restricting packages listed in "symfony/symfony" to "5.0.*"

Prefetching 2 packages 🎵 💨
  - Downloading (100%) 

Package operations: 2 installs, 0 updates, 0 removals
  - Installing pagerfanta/pagerfanta (v2.1.3): Loading from cache
  - Installing easycorp/easyadmin-bundle (v2.3.4): Loading from cache
Writing lock file
Generating autoload files
ocramius/package-versions: Generating version class...
ocramius/package-versions: ...done generating version class
Symfony operations: 1 recipe (c89d68f6646119e76a9f3a281a2b655c)
  - Configuring easycorp/easyadmin-bundle (>=2.0): From github.com/symfony/recipes:master
Executing script cache:clear [OK]
Executing script assets:install public [OK]

Some files may have been created or updated to configure your new packages.
Please review, edit and commit them: these files are yours.

次に、 設定ファイルを修正します。

config/packages/easy_admin.yaml

easy_admin:
    entities:
        - App\Entity\SampleUser

とりあえず最低限これで設定は終わりなので、 /admin にアクセスしてみます。

f:id:kojirooooocks:20191224024028p:plain

バッチリ入りました。

Image from Gyazo

いい感じです。

本来はもっと細かく設定ができるのですが、今回は試すだけなので一旦ここまでで。

終わりに

こんな感じの簡単なお試しブログになりましたが、以上です。

冒頭でも書いたのですが、基本的に Advent Calendarを書く年末だけにしか触らないので、来年はもう少し触れたらと思っています。

一個Bundleのネタもあるので、作れたらなと。

ラストは @cube_3110さんの記事です!

よろしくおねがいします!

リモートワークして2年以上たった

はじめに

こんにちは。

この記事は、テレワーク・リモートワークAdvent Calendar 2019の15日目の記事です。

adventar.org

自分がリモートワークを始めて2年2ヶ月が経過しました。

なぜ正確に覚えているかというと、子供が生まれたタイミングで自宅でのリモートワークをし始めたからです。

あんなに小さかった子供も現在は2歳になり、今はイヤイヤ期の真っ最中。何をするのも「アー!」と叫んでおります。

さて、そんな感じで自分が切り替えたように、子供ができたことでリモートワークを考える人は多いと思います。

今回は子供のためにリモートワークに切り替えたことが実際に良かったのかどうかを簡単に振り返ってみたいと思います。

当然ですが前提として、自分の子供の話なので全子供に該当するわけではありません。

本題

実際にリモートワークがよかったかどうかというと、半分半分といったところです。

自分の子供の場合でいうと、0ヶ月〜24ヶ月すべての期間で必要だったかというとおそらく答えはNOでした。

当然必要な期間はありましたが、すべての期間で家にいたほうがいいという感じでもありませんでした。

自宅リモートワークをやっててよかったと思った期間

  • 0ヶ月〜6ヶ月

    子供のケアはもちろん、奥さんも産後でナイーブになっているため、一緒にいてあげて話を聞いてあげることが大事だった。(できていたかどうかは明言しません...)

  • 24ヶ月〜

    今現在イヤイヤ期で、子供が体格もいいこともあり、奥さん一人では静止しきれない場面などもあるため。

自宅リモートワークがキツイなと思った期間

  • 24ヶ月〜

    とんでもなく大騒ぎしているので、なかなか昼間は集中できない。

とまぁこんな感じで、今まさにキツイ期間で、奥さんと交代交代で相手をしたりしているので、完全に昼夜逆転の仕事をしています。

自宅リモートワークをやっててよかったこと

また期間という切り口ではなく、やっててよかったことも羅列してみます。

  • 煮詰まったときに子供の顔を見ると元気になる

    自分的にはこれが一番ありがたいです。リフレッシュも出来るし、癒やしにもなります。

  • プレ幼稚園などの送迎を手伝ってバス代を節約できる

    幼稚園代って結構するんですよね...。少しでも自宅で作業させてもらっていれば、そのへんも手伝って節約することができます。

おわりに

このような感じで、いい事だらけではない自宅でのリモートワークですが、平日の仕事の合間に子供と遊んだり、仕事しながらも子供の成長を間近でみることができるのはとてもありがたいです。

直近ではお仕事を頂いているので、自宅でのリモートを続けることになりますが、今後常駐に切り替わるのかは不明です。

できれば、子供が幼稚園に入る再来年くらいまではリモートを続けられたらなと思っています。

php系の案件ありましたら連絡お待ちしております!

f:id:kojirooooocks:20191202032722j:plain