AWSソリューションアーキテクトアソシエイト試験向けのWEB問題集を作成した。
https://www.aws-qualification.link/
問題数や出題形式はこれから増やしていく予定。
gradleでcomposer requireにあたることをする
build.gradle.ktsのdependensiesに追加したいパッケージを追記すると象のsyncボタンが現れるので、syncのボタンを押す。

Hexoで画像を表示する
_config.ymlをpost_asset_folder: trueにする。
hexo new {記事title}の時に source/_postsディレクトリ以下に{記事tile}のディレクトリができるので、
そのディレクトリ内に画像を配置。
1 | {% asset_img 画像名 記事名 %} |
のタグで表示できます。
画像名や記事名にスペースがふくまれる場合、ダブルクォーテーションで囲ってください。
1 | {% asset_img "画像名" "記事名" %} |
参考url
https://hexo.io/docs/asset-folders#Tag-Plugins-For-Relative-Path-Referencing
KotlinでSpring Bootでhello worldを出してみる
KotlinのSpring Bootでhello worldを出してみました。
前提条件
- JDKがインストール済み
- Intellij IDEAもインストール済み
Spring Bootのフレームワークをダウンロード
Spring Initializrのから設定してダウンロード
設定の参考url
GradleをインストールしてSpring Bootを起動してみる
Intellij IDEAからダウンロードしたSpring BootのフレームワークをOpenする。
そうすると右下にGradleをインストールしますかのようなポップアップが現れるので、そこからインストールをしてもらう。
GradleがインストールされるとProjectパネルに.gradelとbuildのディレクトリが作成され、main関数の横にrunボタンが表示されるのでrunボタンから起動してWEBアプリケーションを実行します。

Spring BootはWebサーバーが内包されている
PHPですとnginxやapacheなどのWebサーバを用意する必要がありますが、Spring Bootのフレームワーク自体にWebサーバが内包されているのでmain関数の横にrunボタンを押すだけでwebアプリケーションを起動できます、便利ですね。
ちなみに、AWSのLambdaのようなものをサーバレスといいますが、このような「WEBサーバ」の用意が不要なこともサーバレスというようです。
hello worldを表示するコード
https://github.com/unamu1229/spring-boot-demo/pull/2/files
のファイルを追加します。
再度main関数をrunすると http://localhost:8080/ にhello worldと表示されました。
参考url
Spring Initializr
サーバレス
Controller
https://spring.pleiades.io/guides/tutorials/spring-boot-kotlin/
インターフェイス名はクライアント側に由来する名前にする
インターフェイスの名前を命名する時に、サーバー側の名前ではなくクライアント側の名前をつける必要があるそうです。
このソースは、アジャイルソフトウェア開発の奥義(ロバート・C・マーチン)
の9.3 鍵は「抽象」にあり
の項目(P130)に書かれていました。
理由は、抽象クラスはそれを実際に実装するクラスとの関係よりも、それを利用するクラスとの関係の方がずっと密接
だからだそうです。
Laravelのapp()->make()はアンチパターンなの?
Laravelのapp()->make()はアンチパターンなのか調べてみました。
結論
フレームワークに依存すると問題のあるドメイン層以外ではapp()->make()を利用してもいい。
調査内容
アプリケーションサービスのメソッド内でapp()->make()を利用していたら、
疎結合を意識してコンストラクタインジェクションを利用するようにコードレビューをもらったことがあったのですが、app()->make()は疎結合だし、コンストラクタからタイプヒンティングでプロパティに持たせるほうがインスタンスの作成時に必ず依存することで循環参照になりやすく結合度は高そうと思ったのでいろいろ調べて見ました。
パターンの種類でいうと
app()->make()はServiceLocaorで、
コンストラクタインジェクションはDIになります。
双方のバターンとも疎結合を基本としている。
という記事や、
そもそもDIは依存性の解決であって、依存が無くなるわけではない。
という記事があったりして正反対な意見があるようですが、ServiceLocaorをDIにすることで、サービスロケータ自体には依存しないようになるようです。
そのため、ServiceLocaorがアンチパターンのような記事をいくつか見かけたのですが、マーティンファウラー先生によるとそれは違うようです。
先生によるとDIよりService Locatorが利用できるのであれば、それを利用するのはもっともだとおっしゃっています。
1 | Service Locator と Dependency Injection とのどちらを採用するかの判断は、 ロケータへの依存性が問題になるかどうかにかかっている。 |
とありましたので、Laravelのフレームワークを利用する上で、フレームワークに依存すると問題のあるドメイン層以外では Service Locatorを採用したほうがよさそうです。
また、同様の意見が「上田勲. プリンシプル オブ プログラミング 3年目までに身につけたい 一生役立つ101の原理原則」にも書かれていました。
1 | 結合先モジュールの質にも着目しましょう。密な結合自体は問題ですが、本質的には、不安定な要素と密に結合するのが問題になります。安定的なライブラリに依存するのは特に問題ではありません。盲目的にデータ結合を目指すというより、相手によって付き合いの深さを判断しましょう。 |
「データ結合」とは、この本の中でもっとも疎結合であるという形です。
フレームワークとして提供されるサービスロケータの質は安定的しているといえるので、盲目的に疎結合を目指してDIを利用するということは良くないようです。
参考url
マーティンファウラー
https://kakutani.com/trans/fowler/injection.html#ServiceLocatorVsDependencyInjection
マーティンファウラーとは反対の意見
http://blog.a-way-out.net/blog/2015/08/31/your-dependency-injection-is-wrong-as-I-expected/
日毎のlogrotateをテストで動かしたい
日毎のlogrotateをテストで動かしたい
AmazonLinuxで日毎の設定のlogrotateの動作確認をしたいと思い。
対象のファイルの日付をtouchで昨日にして、
/usr/sbin/logrotate /etc/logrotate.conf を実行してもログファイルが作成されませんでした。
調べてみると
/var/lib/logrotate/logrotate.status
というファイルに前回のログローテートを行った時刻を記載しているとのこと。
/var/lib/logrotate/logrotate.status に先程logrotateコマンドをした日時が記録されていたので、
その日時を昨日に変更して、再度 /usr/sbin/logrotate /etc/logrotate.conf を実行すると
無事ログファイルがローテートされました。
tips
調べている際に、logrotateは/etc/cron.dailyで実行されていて。
cron.dailyの実行は/etc/anacrontabで設定されているということを知りました。
参考サイト
https://www.khstasaba.com/?p=958
https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/6/html/deployment_guide/ch-automating_system_tasks#s2-configuring-anacron-jobs
systemd Failed to execute command: Permission denied
CentOS8にてsystemdのtest.serviceを作成してみてsystemd start testを行ってみると実行に失敗、
/var/log/messagesに下記のエラーが表示されていました。
1 | Mar 20 13:21:45 unamu systemd[1]: Started testscript. |
Permission deniedの表示からファイルのパーミッションを確認しましたが、問題無し。
SELinuxが邪魔をしていたようです。
有効になっているか確認
1 | $ getenforce |
Permissiveモードにします。
1 | $ setenforce 0 |
その後、systemd start testで無事実行されました。
参考url
ファイアウォールでpingの疎通確認を拒否する
CentOS8のfirewall-cmdでpingの疎通確認を拒否を試してみました。
pingはicmpのプロトコルです。
firewallの設定内容を確認します。
1 | [root@localhost unamu]# firewall-cmd --list-all |
icmp-block-inversionがyesの時にicmp-blocksに記載されたICMP Typeを受け入れ、
noの時はicmp-blocksに記載されたICMP Typeを拒否します。
icmp-blocksに何も設定されていないので、icmp-block-inversionをyesにすることですべてのICMP Typeを拒否することで
pingを拒否できそうです。
icmp-block-inversionをyesにする。
1 | [root@localhost unamu]# firewall-cmd --add-icmp-block-inversion |
icmp-block-inversionが yes になったので、pingを実行して拒否されるか確認します。
1 | ~/D/g/D/laradock ❯❯❯ ping 192.168.11.17 (git)-[master] |
100.0% packet loss となっているので拒否できているようです。
icmp-block-inversionをnoに戻しておきます。
1 | [root@localhost unamu]# firewall-cmd --remove-icmp-block-inversion |
応答自体を返さない場合はtargetをDROPにすることで可能です、
targetの設定を反映するにはreloadが必要なようです。
1 | [root@localhost unamu]# firewall-cmd --set-target=DROP --permanent |
pingで応答が無いか確認
1 | ~/D/g/D/laradock ❯❯❯ ping 192.168.11.17 (git)-[master] |
AWSのサービスにpingを実行した時と同じ反応です、
これが応答が無い場合のリアクションなんですね。
元に戻しておきます。
1 | [root@localhost unamu]# firewall-cmd --set-target=default --permanent |
参考サイト
https://milestone-of-se.nesuke.com/sv-basic/linux-basic/firewall-cmd/
https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/7/html/security_guide/sec-managing_icmp_requests
https://milestone-of-se.nesuke.com/sv-basic/linux-basic/drop-ping-on-linux/
Goの使い始めにハマったこと
GOPATH 関係
GOのファイルはGOPATH以下のsrcディレクトリに格納しなければならない。
GoLandで自作のモジュールが補完でimportされないのは、GOPATH設定が正しくないから。
参考url
https://pleiades.io/help/go/configuring-goroot-and-gopath.html#gopath
コードポイント 関係
ElasticSearchでqueryの結果が下記の\u6771\u4eac0
ように日本語がUTF16のコードポイントとして表示されていた。
本当はprefの項目は東京0と表示されて欲しかった。
1 | body, _ := ioutil.ReadAll(resp.Body) |
日本語がUTF16のコードポイントとして表示されており、
tranceformパッケージでurf16のバイトのDecodeを試したが文字化けして失敗。
(失敗例)
1 | body, _ := ioutil.ReadAll(resp.Body) |
structにqueryの結果を入れて表示すると、期待通り東京0と表示されました。
Unmarshalの中でdecodeがされているようです。
1 | type GetResponse struct { |
json全体ではなく、コードポイントの箇所のみであれば、Unquoteで文字に変換できました。
1 | t := "\\u6771\\u4eac0" |