build.gradle.ktsのdependensiesに追加したいパッケージを追記すると象のsyncボタンが現れるので、syncのボタンを押す。

build.gradle.ktsのdependensiesに追加したいパッケージを追記すると象のsyncボタンが現れるので、syncのボタンを押す。
_config.ymlをpost_asset_folder: trueにする。
hexo new {記事title}の時に source/_postsディレクトリ以下に{記事tile}のディレクトリができるので、
そのディレクトリ内に画像を配置。
1 | {% asset_img 画像名 記事名 %} |
のタグで表示できます。
画像名や記事名にスペースがふくまれる場合、ダブルクォーテーションで囲ってください。
1 | {% asset_img "画像名" "記事名" %} |
https://hexo.io/docs/asset-folders#Tag-Plugins-For-Relative-Path-Referencing
Spring Initializrのから設定してダウンロード
Intellij IDEAからダウンロードしたSpring BootのフレームワークをOpenする。
そうすると右下にGradleをインストールしますかのようなポップアップが現れるので、そこからインストールをしてもらう。
GradleがインストールされるとProjectパネルに.gradelとbuildのディレクトリが作成され、main関数の横にrunボタンが表示されるのでrunボタンから起動してWEBアプリケーションを実行します。
PHPですとnginxやapacheなどのWebサーバを用意する必要がありますが、Spring Bootのフレームワーク自体にWebサーバが内包されているのでmain関数の横にrunボタンを押すだけでwebアプリケーションを起動できます、便利ですね。
ちなみに、AWSのLambdaのようなものをサーバレスといいますが、このような「WEBサーバ」の用意が不要なこともサーバレスというようです。
https://github.com/unamu1229/spring-boot-demo/pull/2/files
のファイルを追加します。
再度main関数をrunすると http://localhost:8080/ にhello worldと表示されました。
https://spring.pleiades.io/guides/tutorials/spring-boot-kotlin/
インターフェイスの名前を命名する時に、サーバー側の名前ではなくクライアント側の名前をつける必要があるそうです。
このソースは、アジャイルソフトウェア開発の奥義(ロバート・C・マーチン)
の9.3 鍵は「抽象」にあり
の項目(P130)に書かれていました。
理由は、抽象クラスはそれを実際に実装するクラスとの関係よりも、それを利用するクラスとの関係の方がずっと密接
だからだそうです。
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を利用するということは良くないようです。
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/
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 を実行すると
無事ログファイルがローテートされました。
調べている際に、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
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で無事実行されました。
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以下のsrcディレクトリに格納しなければならない。
GoLandで自作のモジュールが補完でimportされないのは、GOPATH設定が正しくないから。
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" |
データ項目のタイプがキーワードとして登録されている必要があります。
検索対象のtype
がkeyword
で、query
でterm
を指定して行う必要があります。
1 | #対象index作成 都道府県(pref)のtypeを完全一致の対象にする為にkeywordで登録する |
1 | { |
1 | データ登録 |
1 | { |
1 | # queryの種類をtermにすることで完全一致検索 |
1 | { |
1 | # queryの種類をtermにすることで完全一致検索 |
1 | # 該当するものは無い |
1 | POST /search_job2/_doc |
1 | # typeでtextで登録されて、fieldsにtype:keywordでも登録されます |
1 | # termの対象をpref.keywordとすることで、fieldsのtype:keywordを対象とすることができます |
1 | { |
queryのbool
のmust
で複数term
を指定する
1 | #request |
1 | # 路線が駅を持つようなネストしたデータを作成します |
Nested datatype
)をもたせるネストした経路の関係(Nested datatype
)を持たせたい場合にtypeにnested
指定してmappingをします。
先程のmappingだと、何線の何駅かというのは検索できません。
下記のようなデータを追加した場合。
山手線の渋谷駅というデータを絞りこめません。
1 | # request |
これは、追加したデータがElasticsearchの内部ではネスト構造を保たず、項目ごとにグルーピングされたような構造(Object datatype
)で解釈される為になります。
1 | { |
路線のtype
をnested
にしてネスト構造を保ったままmappingし、ネスト構造の経路を指定して検索してみる。
1 | # request |