OmniAICreator/Qiita-1.07M huggingface dataset:
Pythonの「クロージャ」って知ってる？

こんにちはエンジニアとして、機械学習とサーバーサイドの実務をしているかるでねです。

いきなりですが皆さんPythonの「クロージャ」って知ってますか？

なかなか聞きなれない言葉で抵抗があるかもしれないですが、そこまで難しくなく、知っていると便利なので早速解説していきます！

以下の記事で細かく解説しています。

https://chaldene.net/python-closure
【WEB】lottie.jsをローカルで動かす

#背景
SVG+JSONでサクサク軽量アニメーションを実装できるlottie.js。

https://github.com/airbnb/lottie-web

https://airbnb.io/lottie/#/web


検索でパッと出てくるHow to サイトに載っている方法だと、JSONの読み込みの都合上、サーバー上じゃないと動作しません。
ローカルで動かす要件があった時にちょっと悩んだので、その方法をメモしておきます。
AEなどでのアニメーションJSON吐き出しは終わっている前提とします。

# 手順
## まずはプラグイン類を読み込む
こんな感じのフォルダ構成としましょう。
CDNでももちろんOKですが、今回はローカルで完結させたいのでjQuery本体とlottie.jsはダウンロードしてきたものを読み込むとします。

```
.
├── index.html
└── assets
    ├── js 
    |   ├── jquery-3.6.0.min.js
    |   └── lottie.js
    └── json
        └── animation.json
```

```html:index.html
<script src="./assets/js/jquery-3.6.0.min.js"></script> <!-- jQuery本体のパス -->
<script src="./assets/js/lottie.js"></script> <!-- lottie.jsのパス-->
```

## JSONをjsに書き換える
ここがポイントです。吐き出したアニメーションJSONをテキストエディタで開きます。
なんかカッコで囲まれた文字列がダーってなってますね。

```json:animation.json
{"assets":[{"id":"comp_1","layers":[{"d" // ...略 }
```

この文字列を、var dataって形でjsのvarにします。
そしてanimation.jsって名前で保存しましょう。

```js:animation.js
var data =  {"assets":[{"id":"comp_1","layers":[{"d" /* ...略 */ }
```

## jsに書き換えたJSONを読み込む
先ほど保存したanimation.jsをindex.htmlで読み込みます。

```html:index.html
<script src="./assets/js/jquery-3.6.0.min.js"></script> <!-- jQuery本体のパス -->
<script src="./assets/js/lottie.js"></script> <!-- lottie.jsのパス-->
<script src="./assets/json/animation.js"></script> <!--  animation.jsのパス-->
```

## lottie.jsを実行するコードを書く
index.htmlの、jsを読み込んでるコード類の下でもいいし、新たにjsファイルを用意してもいいでしょう。
下記のJavascriptを記述します。

```html:index.html
<div id="anim-target"></div> <!-- アニメーションさせたい要素を作っておく -->

<script src="./assets/js/jquery-3.6.0.min.js"></script> <!-- jQuery本体のパス -->
<script src="./assets/js/lottie.js"></script> <!-- lottie.jsのパス-->
<script src="./assets/json/animation.js"></script> <!--  animation.jsのパス-->
<script>
 var animation = lottie.loadAnimation({
        container: document.getElementById('anim-target'), //アニメーションさせたい要素のid
        renderer: 'svg', // この辺りのoptionは用途に合わせて！
        loop: true,
        autoplay: true,
        animationData: data //参照するアニメーションのvarの名前
    });
</script>
```

よく落ちてるexampleでは、オプションのpathって項目でJSONのパスを指定しますが、ローカルで動かす場合はanimationDataって項目でvarの名前を指定します。
これは公式ドキュメントをよくよく見てみると見つかります。

https://airbnb.io/lottie/#/web?id=other-loading-options

# 参考
同じことで悩んでる先人がいました。

https://teratail.com/questions/185843
Mac Anaconda + VSCode環境

機械学習のお勉強環境をぶっ潰して幾星霜。
久々にお勉強を再開するので環境を構築し直してみたのでメモ。
ちなみに、お勉強している教科書は、Anaconda GUI版のインストールを推奨していたので、教科書の指示に合わせて使えるかドキドキ中。

# 前提
以下の環境でやってみました。

OS: macOS Catalina
pyenv導入済み
VSCodeインストール済
(関連する拡張機能:Python,Pylance,Jupyter, Jupyter KeyKeymap, Jupyter Notebook Renderers導入済み)

# Anacondaインストール & 仮想環境作成
Anacondaのインストール

```
% pyenv install anaconda3-5.3.1
```

仮想環境作成

```
% pyenv global anaconda3-5.3.1
% conda update conda # 確認が出てきたら許可
% python -V # Versionチェック
Python 3.7.2
% pyenv rehash
% conda create -n py37 python=3.7.2 anaconda # 確認が出てきたら許可
% pyenv global system # 仮想環境が出来たらGlobalは戻しておく
```

作業フォルダ設定
※Shellからの実行のために設定しておく

```
% mkdir workspace
% local anaconda3-5.3.1/envs/py37
```

# VSCode

VSCodeを起動し、上記の作業フォルダを開く
Command+ｓｈiｆｔ+P でコマンドパレットを起動
Python: Select Interpreterを選択し、作成した仮想環境(py37)を指定する
これで、次回以降、該当フォルダでは、py37が選択される。

# 番外編
デフォルトのpythonPathを作成した仮想環境にする場合
Command+ｓｈiｆｔ+P でコマンドパレットを起動
Preferences: Open Settings (JSON)を選択し以下の設定を追加する

```
"python.pythonPath": "使用するPythonのPath"
```
IFTTを使って他社HPの更新が有ったらLINE通知する仕組みを作ってみた


他社HPを毎週確認しているが、なかなか更新されず、どうにかならないかと考えた。
IFTTを教えて頂いたので、課題が解決できそうだなと感じたため、実際に作ってみた。


#目次
[1.解決できそうな業務課題](#1-はじめに)
[2.使用したツール](#2-内容い)
[3.実際の作成物](#3-内容ろ)
[4.実装してみた](#4-実装してみた)
[5.次回に向けて](#5-次回に向けて)


#1. 解決できそうな課題
他社がどのようなキャンペーンなどをやっているのか、情報を収集するために毎週、HPを閲覧している。あまり頻繁に更新はされないため、更新されたら通知が来ると便利だと考えた。

#2. 使用したツール
IFTT

#3. 実際の作成物
IFTTより、If This（トリガー）を選択→rssで検索→RSS FeedでNew feed itemを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2494868/85806750-e70c-3460-b966-5fde8cbfef82.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2494868/c11a2415-23a4-3a7c-4627-d57a74c4d6bc.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2494868/cdcade40-84be-2847-ec47-44c21c4d3934.png)

更新情報を受け取りたいページのURLを貼り付け→Create triggerを押す。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2494868/10edbb47-02ad-c966-2c1d-0d3e5638f27f.png)

Then That(何をするのか）を選択→LINEで検索、選択→Create actionを選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2494868/ad52f9ae-ae21-0ebe-ec6e-e4924b54031b.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2494868/d9720af7-9e4a-4e07-c05c-75e78b863815.png)


#4. 実装してみた
上記手順で実際に同じ職場の上司1人に登録を行っていただいた。
まだ、ページの更新が無いので何とも言えないが、実際に通知が来たら便利だねと言って頂いた。
今後、通知が来たらまた、表示内容が分かりやすいのかどうかなどを確認して、わかりずらいようなら改善してみる。

#4. 次回に向けて
IFTTは比較的分かりやすいツールだったため、少しのアイデアで業務改善ができそうなものがたくさんあると思うのでいろいろ調べて今後も使ってみたい。
Scssで@useを使うと"Invalid CSS after " ~ : expected expression (e.g. 1px, bold) とエラーが出た話

##そもそも、なぜ@useを使わないといけないのか？

###Sassで@import が公式で廃止予定
@importにはめっちゃおせわになっているのですが、
21年10月、既に非推奨になっており、
遅くとも22年10月には廃止予定とのことです。

>（日本語訳）
Dart SassとLibSassの両方がモジュールシステムのサポートを開始してから1年後、またはDart Sassがモジュールシステムのサポートを開始してから2年後、いずれか早い方（遅くとも2021年10月1日）に、@importと、モジュールを介して行われる可能性のあるグローバルなコアライブラリ関数の呼び出しを非推奨にします。
この非推奨措置が実施されてから1年後（遅くとも2022年10月1日）には、@importとほとんどのグローバル関数のサポートを完全に終了します。これには、すべての実装のメジャーバージョンのリリースが必要になります。
https://sass-lang.com/blog/the-module-system-is-launched

まじか...今更知りました。
それで、私も重ーーーい腰を上げて、@useを使うことにしました。

##@useの使い方

こちらの記事で、とても丁寧にご説明くださっています！

- [SCSSの@importは廃止に！？@useとの違いについて解説！](https://crestadesign.org/sass-import/)

##本題のエラー
上の記事を参考に@import → @use に変更しました。
_settings.scssを
common.scss内で@useで読み込ませ、コンパイルしようとしました。

```scss:_settings.scss
$cText: #1a1a1a;
```

```scss:common.scss
@use "settings" as hoge;

.contents {
  color: hoge.$cText;
  .test {
    color: #000;
  }
}
```
すると、こんなエラーメッセージが...
```Error: Invalid CSS after "  color: hoge": expected expression (e.g. 1px, bold), was ".$cText;"
```

##原因は、node-sass(LibSass)
>（日本語訳）
LibSassはC/C++によるSassの実装であり、様々な言語に簡単に統合できるように設計されています。しかし、時間が経つにつれて、機能やCSSの互換性においてDart Sassに遅れをとることになりました。**LibSass は現在では非推奨**となっており、新しいプロジェクトでは代わりに Dart Sass を使用する必要があります。
https://sass-lang.com/libsass

今までSassのコンパイルは、LibSassを使っているものが多く、
LibSassを使ってコンパイルしようとするとこのエラーが出るようです...


##対処法は、DartSassに変更する
LibSassは、推奨されている@useや@forwordに対応していないので、
DartSassに変更します。


###VSCodeの場合
Sassをコンパイルできるプラグインで有名なのが「Live Sass Compiler」と「Easy Sass」ですが、
これはDartSassに対応しているので使えません。

なので、プラグインを**「DartJS Sass Compiler and Sass Watcher」**に変更する必要があります。
インストールや設定方法は、こちらの記事をご参照ください。

- [VSCodeプラグイン【DartJS Sass Compiler and Sass Watcher】でSassを使ってみよう！](https://crestadesign.org/sass-vscode/#DartJS_Sass_Compiler_and_Sass_Watcher)

###Preprosの場合
昔っからPreprosを使っていたので、気づかなかったのですが、
**Preprosのバージョン6では、DartSassに対応していない**ので、
最新版の7をダウンロードし直す必要があります！
（勝手にアップデートしてくれないのね...）
https://prepros.io/updates

Prepros7では、DartSassが搭載されているので、
特に特別な設定無しで使えます！

##[余談] DartSassにしても@importは使える
VSCodeの「DartJS Sass Compiler and Sass Watcher」は、@importでコンパイルも可能です。

###ただし、Prepros7の場合は、追加設定が必要！
ちょっと設定がわかりにくかったので、以下メモ書きです。

1. 右上の三本線の[Menu]をクリックし、[App Settings]をクリック。![スクリーンショット 2022-02-07 17.57.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/616900/278e27de-f4fb-f1c0-98c6-4836aec91778.png)

2. [Prepros Settings]のメニューの一番下[Project Defaults]をクリック。![スクリーンショット 2022-02-07 17.58.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/616900/6b72225d-5d6c-8d29-6387-1ef8dd18dc2f.png)

3. [Defalut Project Settings]メニュー内の[Css Tools]>[Sass]をクリック。
**「Allow Windcard(Glob) Imports」にチェックを入れる。**![スクリーンショット 2022-02-07 17.52.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/616900/aa8e1c97-8d01-b6d6-3119-24d7a0d75f6e.png)
PrePoMax / CalculiXによる単純な静的解析、軸対称

#  問題の説明と使用されたモデル

FEMソルバーCalculiXのプリ・ポストプロセッサPrePoMaxの2D機能のデモです。
パイプ減速機の簡単な軸対称解析が示されています。
2次元解析の場合、ジオメトリはx-y平面（z=0）で作成する必要があり、軸対称モデルの場合、対称軸はグローバルy軸となります。

作者によるYouTube操作動画の内容をQiitaの記事にしました。

https://youtu.be/x3q42cs9so8

# モデルの定義

## CADモデルの読み取りとメッシュの生成

![fig000.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201403/02369a46-3e07-952d-9607-29074a5933f4.png)

1. PrePoMaxを起動し、「File」/「New」メニューから、問題の次元（2D Axisymmetric）と単位セット（mm, ton , s, ℃）を選択し、「OK」します。
2. 「File」/「Import」でモデル「Pipe_reducer.STEP」を読み込みます。
3. デフォルトのShell_part-1という名前を、より読みやすい名前、たとえばPipeに変更します。
4. PipeのMeshing Parametersを以下のように変更してメッシュを生成します。
   * Max element size：2mm
   * Min element size：1mm

## 計算モデルの作成

![fig001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201403/87bbf90e-ea74-e7cc-db1e-556183624411.png)

1. 材料の定義（S235）
2. セクションを作成し、ソリッドセクションを選択し、断面形状に材料の割り当てを定義します。
3. 静的解析ステップを定義します。
4. 特定の場合の固定は、モデル軸（特定の場合はY軸）に沿った変位を拘束（U2=0mm）することになります。
5. 「Set selection」ウィンドウで、「Edge angle」を選択し、内部のエッジに1MPaの圧力荷重を定義します。

## 計算と結果

計算を実行し、結果を表示します。
![fig002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201403/b7becffa-6b62-42d2-a304-d04836479a1c.png)
![fig003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201403/d5cc8478-7ddb-502a-2077-33b5a13d559e.png)

## 結果の3D視覚化を得る方法

![fig007.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201403/d511d7dc-35bc-b05c-5dde-27bdd481214c.png)

PrePoMaxでは、上記のような結果、つまり実際のボディの部分を表示できます。
ここで、「エッジなし」アイコンをクリックすると、さらにメッシュが非表示になります

![fig004.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201403/b90a81a4-da5b-0aad-e003-69891df60c42.png)

1. 「FEモデル」タブに戻ります
2. 要素結果のEF-Output-1、Output（2D/3D）の行で、デフォルトの2Dではなく、3Dを選択します。
3. 計算を繰り返します。
4. これで、結果がモデルセクションの背景に対して2°の傾斜角で表示されます。

![fig005.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201403/c457393c-bb70-af51-3224-d1722611200e.png)

5. この角度は、「Results」/「Transformation」メニューで増やすことができます（または、「Transformation」ボタンをクリック）。

![fig006.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201403/2cc7ac6a-a717-8ae1-ede2-ab67f7116a12.png)

1. CircularをActiveにします。
2. 配列の次の断片の回転角度（2°）と繰り返し回数（45回）を指定します。これにより、最終的に2°×45=90°の回転角度を持つ形状が得られます。
3. あとは回転軸の定義ですが、軸対称のモデルでは常にY軸となります。この軸の方向ベクトルの最初の点の座標（0,0,0）は、リストFirst axis point coordinatesにすでに与えられています。2つ目のリスト（第2軸ポイント座標）において、Y座標の値のみを任意の正の値に変更し、Z座標の値をリセットします。方向ベクトルがグラフィックウィンドウに表示されます。
4. OKで適用します。
5. 「No edge」ボタンでモデルのエッジが非表示になります。
6. 「Tools」/「Setting」メニューで、「Post-processing」/「Defomation」/「Draw undeformed modle」を切り替えることで変形前のモデル形状の表示/非表示できます。
Sync Gatewayデプロイメント：ロードバランサーとの連携

## はじめに

ここでは、Couchbase Mobileを構成するSync Gatewayをデプロイする際のロードバランサーとの関係について解説します。

なお、Couchbase Mobileについては、[Couchbase Mobileアプリケーション開発へのロードマップ](https://qiita.com/yoshiyuki_kono/items/6a5bbad1b02196a25417)に記事をまとめている他、（これらの記事を元に構成した）以下の電子書籍を無償で頒布しています。

https://techbookfest.org/product/5074954942939136?productVariantID=5042865933647872

また、Couchbase Mobileは、Couchbase LiteとCouchbase Serverとのデータ同期機能を提供します。Couchbase Serverの存在意義、機能詳細、利用方法等については、拙著[NoSQLドキュメント指向データベースCouchbase Serverファーストステップガイド(インプレスR&D刊)](https://www.amazon.co.jp/-/en/%E6%B2%B3%E9%87%8E-%E6%B3%B0%E5%B9%B8/dp/429560030X/ref=tmm_pap_swatch_0?_encoding=UTF8&qid=1636588872&sr=1-1)や、[NoSQL/JSONデータベースCouchbase Server理解・活用へのロードマップ](https://qiita.com/yoshiyuki_kono/items/4c9cd1115efc5807b49f)にまとめてある記事をご参考ください。

## ロードバランサーとの連携

Couchbase Serverは、他のNoSQLデータベースと同様、分散環境としてそれ自体冗長性を備えています。一方、Sync Gatewayについては、外部的に冗長性を担保する必要性があります。冗長性のみではなく、水平方向のスケーリングという面でも同様です。Couchbase Serverでは、クライアントは、クラスターとの接続時にクラスターマップというクラスターの構成情報を受け取り、以降の接続では、対象となるノードに直接アクセスするため、ロードバランシングが介入する必要はありません。Sync Gatewayでは、複数ノードでクラスター構成を取る場合には、クライアントからのアクセスを仲介するロードバランサーを用いることになります。

あるいは、冗長性や水平方向スケーリングを置いたとしても、インターネット上のCouchbase Liteアプリケーションとの接続のためにリバースプロキシを用いるのは、通常クライアントがアプリケーションサーバーであるCouchbase Serverの場合とは違った意味があります。

これらを以下のように整理できます。

- クライアントからのリクエスト（からの負荷）を、複数のSync Gatewayインスタンスに分散する。
- Sync Gatewayサーバーの存在を外部から隠す。これによって、サービスがインターネットに公開されているときにSync Gatewayインスタンスを保護する。
- アプリケーションファイアウォール機能によって、Sync Gatewayを一般的なWebベースの攻撃から保護する。
- Sync GatewayからSSLターミネーションをオフロードする。これによる、多数のモバイルデバイスをサポートする場合のオーバーヘッドを分散する。
- 各着信要求のURLを書き換える。例えば、ポート80を、標準のSync GatewayのパブリックREST　APIポート4984にマップする。

ここでは、Sync Gatewayでロードバランサーを使用する際の考慮点や参照可能な情報について紹介します。

#### WebSocket接続における考慮点

WebSocket接続を開いたままにするために、Couchbase Lite(レプリケーター)は300秒（5分）ごとにWebSocket PINGメッセージ（ハートビート）を送信します。このハートビートは、Couchbase LiteとSync Gateway間の接続を維持するために必要です。

ハートビートを成立させるためには、介在するロードバランサーのキープアライブタイムアウト間隔がハートビート間隔より長い必要があります。そのため、必要に応じてロードバランサーのWebSocketプロキシ設定します。または、Couchbase Liteのハートビート間隔を変更することもできます。

### AWS Elastic Load Balancer（ELB）との連携

Sync GatewayとCouchbase Liteは、変更フィードに対して長時間実行される接続を持つ可能性があるため、ELBのアイドルタイムアウト設定を最大値の3600秒（1時間）に設定します。

この設定を変更する方法の詳細については、以下を参照することができます。

https://docs.aws.amazon.com/elasticloadbalancing/latest/classic/config-idle-timeout.html

### NGINXとの連携

以下のCouchbase公式ドキュメントでは、NGINXを、Sync Gatewayのために利用する方法が解説されています。


https://docs.couchbase.com/sync-gateway/current/load-balancer.html


https://www.nginx.co.jp/


### トランスポート層セキュリティ（HTTPS、SSL）

本番環境でクライアントとSync Gateway間の接続を保護するには、トランスポート層セキュリティ（TLS、HTTPSまたはSSLとも呼ばれます）を使用する必要があります。

これにより、盗聴者に対して、データ（パスワードやログイントークンを含む）が暗号化されるだけでなく、 Man-In-The-Middle攻撃に対する防御になります。

NGINXとSync Gatewayの間の接続にX.509証明書を用いたTLSを有効化する方法についても、上述のドキュメントで解説されています。

### 関連情報

https://docs.couchbase.com/sync-gateway/current/load-balancer.html


https://www.tribeck.jp/column/opinion/technology/20171016/
[IntelliJ]一度は使いたいおもしろプラグイン達

#はじめに
こちらのイベントで発表したことのまとめ記事になります。

https://connpass.com/event/238836/


#一覧
###code glance
XCodeとかによくあるやつ。
画面右側にファイルの全容が表示されます。

https://plugins.jetbrains.com/plugin/7275-codeglance

###Nyan Progress Bar
にゃんすけがプログレスバー上を駆け走ります。

https://plugins.jetbrains.com/plugin/8575-nyan-progress-bar

###Zelda Progress Bar
私のAndroidStudioがバグっているのか、プログレスバーが緑になっただけ・・・
リンクがでてこない・・

https://plugins.jetbrains.com/plugin/14726-zelda-progress-bar

###Mario Progress Bar
マリオと緑こうらがプログレスバーを彩ってくれます。

https://plugins.jetbrains.com/plugin/14708-mario-progress-bar

###pokemon progress bar
ランダムにポケモンがプログレスバーを往復します。（往復してくれる所が高得点）
第一世代から最近のポケモンまで抑えていて老若男女問わず楽しめる。

https://plugins.jetbrains.com/plugin/15090-pokemon-progress

###Rainbow Brackets
括弧を色付けしてくれます。
ネスト範囲を見失わない、また一々括弧前後をクリックして確認しなくても良い。

https://plugins.jetbrains.com/plugin/10080-rainbow-brackets

###Power Mode 2
コーディングした後にバチバチの火花が飛びます。

https://plugins.jetbrains.com/plugin/8251-power-mode-ii/

###emoji
ツールバーからコミットメッセージに絵文字を付与できる。

https://plugins.jetbrains.com/plugin/9174-emoji-support-plugin

###Atom Material Icons
アイコンがマテリアルデザインになり、オシャレになる。

https://plugins.jetbrains.com/plugin/10044-atom-material-icons

###GitToolBox
行ごとにコミット履歴が見れる。

AndroidStudioにも実はある・・・。
行の箇所を右クリック → Annotate with Git blame

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599059/aa2702c6-9fe0-1401-929d-546ecb6171e3.png)


https://plugins.jetbrains.com/plugin/7499-gittoolbox

###Material Design Color Palette
カラーコードを検索する手間が省かれる。

https://plugins.jetbrains.com/plugin/10869-material-design-color-palette

###Key Promoter X
ショートカットキーを教えてくれます。

https://plugins.jetbrains.com/plugin/9792-key-promoter-x?_ga=2.145408887.218954690.1644720294-2035567011.1640220028&_gac=1.15743300.1644215502.Cj0KCQiAgP6PBhDmARIsAPWMq6kISlee7tX2AS6SwIfmSddtR5L_ZfJV1UHZLvqoCkfjl_2_N5KjEu4aAui2EALw_wcB&_gl=1%2A1b3q8gz%2A_ga%2AMjAzNTU2NzAxMS4xNjQwMjIwMDI4%2A_ga_0WQ2ZF5VGT%2AMTY0NDc0MzM0Ni4zLjAuMTY0NDc0MzM0Ni4w


#おわりに
エディタを使いこなして、楽しく効率的に開発していきましょう！
Pythonでtar.gzファイルを解凍する方法

# はじめに
自然言語処理のデモのために、livedoorニュースコーパスをダウンロードしてみたらtar.gz形式で圧縮されていたので、その解答の仕方を調べてみた。
忘れそうなので備忘録

※なお、ライブドアコーパスのダウンロードは[ここ](https://www.rondhuit.com/download.html)
[株式会社ロンウイット](https://www.rondhuit.com/)が、収集して配布してくださっているデータらしい。便利。

#コード
```python
import tarfile
with tarfile.open('ldcc-20140209.tar.gz') as tar:
    for i in tar.getmembers():
        tar.extractall()
```

## 参考
下記を参考にさせていただいております。
[https://analytics-note.xyz/machine-learning/download-livedoor-news/](https://analytics-note.xyz/machine-learning/download-livedoor-news/)
Access 「エラー3048：これ以上データベースを開くことができません」というエラーが表示される

2022年2月4日からAccessのプログラムが、エラーで動かなくなりました。

### 環境
Windows10 64bit 21H2  
Access 2016 Runtime

***
### 症状
「エラー3048：これ以上データベースを開くことができません」というエラーが表示される

***
### 原因
 Office の更新プログラム Ver.2112(ビルド14827.20158)

***
### 処置

```trust.bat
rem 信頼できる場所に追加する　Access 2016 Runtime
REG ADD "HKEY_CURRENT_USER\SOFTWARE\Microsoft\Office\16.0\Access\Security\Trusted Locations\Location10" /v AllowSubfolders /t "REG_DWORD" /d "1" /f
REG ADD "HKEY_CURRENT_USER\SOFTWARE\Microsoft\Office\16.0\Access\Security\Trusted Locations\Location10" /v Path /t "REG_SZ" /d "Accessのmdbがあるフォルダ" /f

rem すべてのマクロを有効にする Access 2016 Runtime
REG ADD "HKEY_CURRENT_USER\SOFTWARE\Microsoft\Office\16.0\Access\Security" /v VBAWarnings /t "REG_DWORD" /d "1" /f
```
上記を管理者権限で実行して、ひとまず動作することを確認！  
セキュリティ上の問題があるので、アップデートが対応するまでこれで様子見。
CloudBuild でsubstitutionにbash substitution を適用する

```yaml
substitutions:
  _BUILD_SHORT_ID: ${BUILD_ID:0:8}
options:
  dynamic_substitutions: true

steps:
  - name: bash
    args:
      - -c
      - |

        echo -------------------
        echo  $BUILD_ID
        echo  $_BUILD_SHORT_ID
        echo -------------------

```

出力

```
-------------------
1857becb-4cdd-4b9b-a7f4-aa88e30abe03
1857becb
-------------------
```

## 参考
- [ペイロード バインディングと bash パラメータの拡張を置換で使用する  |  Cloud Build のドキュメント  |  Google Cloud](https://cloud.google.com/build/docs/configuring-builds/use-bash-and-bindings-in-substitutions)
Oracle MASTER Silver SQL合格体験記　（SQL未経験）

# 概要
Oracle MASTER Silver SQL(1Z0-071-JPN)に合格したので、学習方法、受験した感想についてまとめます。


# 自分の経歴
・エンジニア２年目
・SQL未経験、実務経験もなし
・今年から新しい職場に転職し、業務でSQLを使用するため、勉強ついでに資格取得を目指した（仕事で使うのはOracleでは無くBigQuery）

# 受験日、学習期間
__受験日__
　2022/1/27

__学習期間__
約３週間

__学習時間__
多分50時間くらい？


# 学習に関して
・SQLやデータベースに関しては何にも分からない状態だったので、Udemyで下記の動画を使用して勉強しました。
　[BigQueryで学ぶ！SQLの基本：初学者からすらすらデータ抽出できるまで](https://www.udemy.com/share/103Ori3@Ubk9Aef5mKdfoJuwn5YVWmUSZ9TR2X3vkX3GNZuoXHgWQQb3g7rpYagn6EEPV92e9w==/)

※このUdemyの教材を使用している時点では、「Oracle MASTER Silver SQL」の試験を受けるつもりはなかったので、試験合格だけを目標としているならば別に不要かなと感じます。ただ、私の場合未経験だったので、動画で学習するのがとても理解しやすかったです。

・現時点では参考書はこれしかありません。
　[ORACLE MASTER Silver SQL 2019試験対策本](https://www.amazon.co.jp/dp/4798172367)
この参考書の模試で１００点取れる状態になって、試験を受けました。
上の学習時間はこの参考書だけの勉強時間を記しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2156673/a0d6fe68-e77a-a3fb-72e8-b039ea532fd8.png)


# 試験結果
合格ライン： 63%
正解率：__７２％__
なかなか危なかったかもしれません、、笑

# 試験の感想
前述した参考書で試験の内容はカバーできていたかと思います。
問題の形式も参考書の模試と同じような形式でした。
試験中に、あ、参考書と同じ感じじゃんと思いながら解いてました（笑）
ただ何問か細かい内容で、「うわー、参考書に小さく書いてあったけどどうだったかなー」っていう問題が何問かありました。何かは忘れちゃったんですが、参考書に小さく書いてある内容（コラムの部分など）は覚えておいて損はないと感じます。
あとは、数値ファンクションに負の数値を入れた場合ってどうなるんだっけ？みたいなのとか試験中に迷いましたね。

# まとめ
正解率72%だったので危なかったかもしれませんが、未経験で一ヶ月以内の勉強で取得できたので、頑張ったんじゃないでしょうか。
とりあえず紹介した黒本の参考書で勉強すれば大丈夫だと思います。まぁ、現時点では他に参考書が無いのでこれ一択ですが。。。
Oracle MASTER Silver SQL(1Z0-071-JPN)に関して書いてる記事あまり見かけないので、少しでも参考になれば幸いです！
不明点あればコメントなどして下さい！
Kotlin を Linux で使う方法

Ubuntu 21.10 で Kotlin を使う方法です。

こちらから、コンパイラーをダウンロードします。
[Kotlin 1.6.10](https://github.com/JetBrains/kotlin/releases)

```bash
wget https://github.com/JetBrains/kotlin/releases/download/v1.6.10/kotlin-native-linux-x86_64-1.6.10.tar.gz
```

解凍

```bash
tar xvfz kotlin-native-linux-x86_64-1.6.10.tar.gz
```

/usr/local に移動

```bash
sudo mv kotlin-native-linux-x86_64-1.6.10 /usr/local
cd /usr/local
sudo ln -s kotlin-native-linux-x86_64-1.6.10 kotlin
```

.bashrc にパスを加える

```text:.bashrc
（省略）
export PATH=$PATH:/usr/local/kotlin/bin
```

#簡単なプログラム (その1)#

```kotlin:hello.kt
fun main() {
	println("Hello World!")
	println("こんにちは")
	println("Feb/07/2022")
}
```

```text:Makefile
hello: hello.kt
	kotlinc-native hello.kt -o hello
clean:
	rm -f hello.kexe
```

コンパイル

```text
make
```

実行結果

```text
$ ./hello.kexe 
Hello World!
こんにちは
Feb/07/2022
```

#簡単なプログラム (その2)#

```kotlin:pythagoras.kt
// ------------------------------------------------------------------
/*
	pythagoras.kt

					Feb/07/2022
*/
// ------------------------------------------------------------------
fun display_proc(it:Int, jt:Int, kt:Int)
{
	val tab = '\t'
	var str_out = ""
	str_out += "it = "
	str_out += it.toString() + tab
	str_out += "jt = "
	str_out += jt.toString() + tab
	str_out += "kt = "
	str_out += kt.toString()
	println(str_out)
}

// ------------------------------------------------------------------
fun main() {
	println("*** start ***")

	val nmax = 20
	for (it in 1..nmax)
		{
		var it2 = it * it
		for (jt in it..nmax)
			{
			var jt2 = jt * jt
			var itjt2 = it2 + jt2
			for (kt in jt..nmax)
				{
				var kt2 = kt * kt
				if (itjt2 == kt2)
					{
					display_proc(it,jt,kt)
					}
				}
			}
		}

	println("*** end ***")
}

// ------------------------------------------------------------------
```

```text:Makefile
pythagoras: pythagoras.kt
	kotlinc-native pythagoras.kt -o pythagoras
clean:
	rm -f pythagoras.kexe
```

コンパイル

```text
make
```

実行結果

```text
$ ./pythagoras.kexe 
*** start ***
it = 3	jt = 4	kt = 5
it = 5	jt = 12	kt = 13
it = 6	jt = 8	kt = 10
it = 8	jt = 15	kt = 17
it = 9	jt = 12	kt = 15
it = 12	jt = 16	kt = 20
*** end ***
```
【やっぱり辛かった】実務未経験27歳が就活に対して感じたこと・これから就活する方へ

IT業界に興味を持ち、はや2年。やっと巡り巡って某受託開発の企業に内定をいただきました。
就活の軌跡・感じたことを記録しようと思います。

#応募した求人数・応募媒体

大体合計**60**社くらい応募し、うち面接や面談をしたのが8~9社、内定をいただいたのが1社でした。

50社近くはGeeklyによる応募で、あとはWantedlyを利用しました。
利用してみた感想としては、
###Geekly (50社応募 → 書類通過10社 → 面接3社 → 全落ち)
+ あまり惹かれる求人が無い。COBOLをよく使う現場がちらほらあるのとSESが多い印象。
+ 履歴書はZoom繋いでエージェントの方と一緒に作っていく。先方がヒアリングをしながら履歴書に入力していくスタイル。楽かもしれないけど、細部まで自分なりのアレンジができるわけでは無い（向こうの時間もあるからなかなか言えない部分あった😂）

というわけで途中で利用するのやめました。

###Wantedly (15社応募 → 面談2社（全て途中辞退） / 20社スカウト → 面談・面接3社 → 内定1社)
+ 会社の紹介がかなり詳しく書かれているのでかなり会社の雰囲気を掴める要素が多いと言う印象。⇨結果、自分とフィーリングが合う企業が見つけやすいと思う
+ ベンチャーで勢いのある会社が多い。こういう所で働けたらワクワクするなぁ〜という会社もたくさんありました。
+ 何よりもスカウト機能が素晴らしい。そして月3000円課金すればプロフィールの閲覧数だいぶ増えるので（もちろんプロフィールを充実させておくのは大前提）もらえるスカウトも増える傾向にあると思います。


最初は課金せず自分から企業へエントリーしまくっていましたが、ほとんど返事が来ない😭
実務未経験だからしょうがないけどやっぱりメンタルは少しずつ削られていく。
そこで月3000円課金し、Wanted Score（携帯アプリから確認できるよ）を60前半くらいに上げておくと、スカウト2~3件(/日)くらいもらう時期もありました。
面接を受けないにしても精神の安定剤にもなるので課金はおすすめです。
自分で応募するとなると、どの会社が今未経験の採用に力を入れているのか分からない（未経験とっているところでもあんま未経験可ということは強調していないとこが多い）ので、会社側から見染めてもらう方が効率良いのかなとも思いました。


#これから就活する方に向けて、、

結構ありきたりかもしれませんが、**就活はマイペースに、自分が作り上げてきたものに誇りを持って、心が辛くならないように取り組んでほしい**と思います。

自分は他の就活生のポートフォリオを見て自分の作品に自信が持てなくなったり焦ってしまったこともあったので、あくまで参考にする意識を持っていければと思います（そんな簡単にできるわけないだろバカヤロー）。
ネットで検索して目につくような作品は評価が高く（閲覧数が多い・LGTM数が多いなど）、余計に人の目につきやすいと思うので、ネットですぐに出てきた作品 or 評価が高い作品＝現在の未経験転職市場の標準的なレベルだとは思わない方がいいのでは？と思います。

今は未経験の転職に関するコンテンツがたくさんあり、中には不安を煽るものもあります。
いくら自分なりに努力しても、本当に転職できるのか？転職できても質の良い経験が積めるのか？など不安は尽きません。不安を煽っているものも理論として正しいのかもしれませんが、あまり全てを真面目に考えてしまうのも辛いなあと思います。
もちろん、世の中にはインフルエンサーの方々が言うように、未経験の転職市場はレベルが上がっているということ・自分の成長を阻害してしまうような企業もあるにはあるということは頭に置いておかなければならないことだと思います。
ですが、あまり深刻に考えすぎず、調べてみると会社の数は多くあるし、エンジニアとして全く成長を実感できない会社というのも全体の何%なんだろうと考え、正しく気をつけていればきっと進むべき道へ一歩ずつ進んでいるのじゃないかなぁと思います。（コロナや地震、津波を正しく恐れて冷静に対策を取ろうという考えに似ている）

これから転職活動する方が自分にとって満足の行く結果になることを願ってやまないです。
パーケージマネージャー・パッケージ依存管理ツール 参考サイト

##パッケージ依存管理ツール

###Composer (PHP)

https://hara-chan.com/it/programming/php-composer/

https://www.sejuku.net/blog/82454

##パーケージマネージャー

###npm　と yarn (JavaScript)

https://www.sejuku.net/blog/96866

https://qiita.com/Hai-dozo/items/90b852ac29b79a7ea02b
Elastic Filebeat(7.16.3)で Apache HTTP Server の Response Time を取得する方法

# FilebeatでApacheのCombined形式ログにResponse Timeを付与したログ形式を取得する方法

## 1.Apache HTTP Serverのログの形式combinedを修正する

~~~shell:$APACHE_HOME/conf/httpd.conf
#LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
↓ %Dを追加して、Apacheのcombinedのログの形式の最後にレスポンスタイムを追加する
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %D" combined
~~~

## 2.Filebeatのfields.ymlを修正する

**response_time**をフィールドに追加する

~~~yml:/etc/filebeat/fields.yml
 10481             - name: response_code
 10482               type: alias
 10483               path: http.response.status_code
 10484               migration: true
#↓response_timeを追加
 10485             - name: response_time
 10486               type: alias
 10487               path: apache2.access.response_time
 10488               migration: true
#↑response_timeを追加
 10489             - name: referrer
 10490               type: alias
 10491               path: http.request.referrer
~~~

## 3.Apacheのモジュールを有効化

~~~shell:filebeat
# filebeat modules enable apache
~~~

## 4.FilebeatのApacheのモジュールのpipeline.ymlを修正する

16と20行目の最後に「**( %{NUMBER:apache2.access.response_time:long})?**」を追加する

~~~yml:/usr/share/filebeat/module/apache/access/ingest/pipeline.yml
 12     patterns:
 13     - '%{IPORHOST:destination.domain} %{IPORHOST:source.ip} - %{DATA:user.name} \[%{HTTPDATE:apache.access.time}\]
 14       "(?:%{WORD:http.request.method} %{DATA:_tmp.url_orig} HTTP/%{NUMBER:http.version}|-)?"
 15       %{NUMBER:http.response.status_code:long} (?:%{NUMBER:http.response.body.bytes:long}|-)(
 16       "%{DATA:http.request.referrer}")?( "%{DATA:user_agent.original}")?( %{NUMBER:apache2.access.response_time:long})?'
 17     - '%{IPORHOST:source.address} - %{DATA:user.name} \[%{HTTPDATE:apache.access.time}\]
 18       "(?:%{WORD:http.request.method} %{DATA:_tmp.url_orig} HTTP/%{NUMBER:http.version}|-)?"
 19       %{NUMBER:http.response.status_code:long} (?:%{NUMBER:http.response.body.bytes:long}|-)(
 20       "%{DATA:http.request.referrer}")?( "%{DATA:user_agent.original}")?( %{NUMBER:apache2.access.response_time:long})?'
~~~

## 5.Apacheのログの場所を指定

~~~yml:/etc/filebeat/modules.d/apache.yml
- module: apache
  # Access logs
  access:
    enabled: true

    # Set custom paths for the log files. If left empty,
    # Filebeat will choose the paths depending on your OS.
    var.paths: ["$APACHE_LOG_HOME/access_log**"]

  # Error logs
  error:
    enabled: true

    # Set custom paths for the log files. If left empty,
    # Filebeat will choose the paths depending on your OS.
    var.paths: ["$APACHE_LOG_HOME/error_log**"]
~~~

## 6.Filebeat起動

~~~shell
# systemctl enable filebeat.service
# systemctl start filebeat.service
~~~

### 参考文献

[FilebeatでApacheアクセスログの取り込み(レスポンスタイムフィールド追加)](https://qiita.com/maruwagumaru/items/2610f46b33c7b4f193aa)
データベースについて　参考サイト

### 比較 (MySQL PostgreSQL Redis)

https://prograshi.com/platform/database/concept-when-selecting-db/

### Redis

Redisとはどのようなデータベース？3つの特徴や使い方についても解説

https://www.fenet.jp/infla/column/%E6%9C%AA%E5%88%86%E9%A1%9E/redis%E3%81%A8%E3%81%AF%E3%81%A9%E3%81%AE%E3%82%88%E3%81%86%E3%81%AA%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%EF%BC%9F3%E3%81%A4%E3%81%AE%E7%89%B9%E5%BE%B4%E3%82%84%E4%BD%BF%E3%81%84/



## RDB と NoSQL

一般的にデータベースと呼ぶと __RDB__ を意味しています。
他のデータベースの種類に __NoSQL__ があります。

#### 主なRDBMS製品
・Oracle
・Microsoft SQL Server
・MySQL
・PostgreSQL
__特徴：__
・複雑な関連を持つデータを扱える
・データ更新時のトラブルに強い
__用途：__
・業務系のシステム

#### 主なNoSQL製品
・MongoDB
__特徴：__
・大量のデータを素早く検索できる
・柔軟な形式でデータを持てる
__用途：__
・ログデータ
VSCodeをロールバックする（1.64⇒1.63）

# はじめに

先日公開されたVSCode1.64を導入したら急にRemote WSLが使えなくなった。
githubを見たらnew releaseラベルのついた「WSL使えん！」みたいなissueが沢山あったので
そのうち直るだろうとは思うが、直近の作業が進められないのでロールバックを決意。

https://github.com/microsoft/vscode/issues?q=is%3Aissue+is%3Aopen+label%3A%22new+release%22

無事VSCode1.63にロールバックできて、元通り作業できるようになったので手順を残しておく。

# 前提

VSCode1.64がユーザーにインストールされている状態
⇒VSCodeのプロパティをみてリンク先が`C:\Users\…`であればOK
　違う場合でも「インストーラのDL」の項で違うリンクからDLすればいけるとは思う

![tempsnip.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2026870/13ae36c7-c41b-8c9b-f1a7-27a0a9870246.png)


# 手順

## インストーラのDL

- 下記のページからVSCode1.63をDL

https://code.visualstudio.com/updates/v1_63

- Windows用は「User」「System」「ARM」の3種類あるので「User」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2026870/cac5bb8d-16f4-4972-056c-9f5bb6b5976b.png)



## インストール

- 起動中のVSCodeを閉じる

- DLしたインストーラ（VSCodeUserSetup-x64-1.63.2.exe）を実行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2026870/23af863b-4db3-e7dc-e3d7-5c945b7a9669.png)

- インストール済の環境に上書きするので追加タスクはチェックなしでOK（たぶん）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2026870/d9fc6e99-df39-14fc-332f-3c12ace120d5.png)

- インストールを進めて、完了したらVSCodeを起動

## VSCodeの設定

### 自動更新の抑制

- `ctrl+,`で設定を開き、設定の検索に「update」と入力
- Update:Modeにnoneを設定したらダイアログに従い再起動
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2026870/fe498415-1e26-9f4f-c145-8a8f340cb8ab.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2026870/60b2a0bd-95e1-ff38-10b4-9379af7cdfb7.png)

### バージョンが合っていない拡張機能の更新

- 拡張機能を開き、インストール済みの中で色が薄くなっているものを全て更新する
  - アンインストール右側のプルダウンから「別バージョンのインストール」を選択
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2026870/5fb522b9-6c27-0f6d-fd65-4bd1411594fe.png)

  - 表示されたバージョンの中からの最新を選択する
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2026870/56aef04d-7c7e-6f53-e554-db7ae21fda4f.png)


以上でロールバック完了。


# 参考
https://blgid1974.blog.fc2.com/blog-entry-1327.html
https://blgid1974.blog.fc2.com/blog-entry-1440.html
クラウド版Qlik Sense 2022年1月の新機能

![スクリーンショット 2022-02-07 164649.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2520131/285a4f74-8525-322d-d212-663b12832dc0.png)

クラウド版 Qlik Sense の2022年1月に追加・更新された新機能をご紹介します。
新機能はリリースされる都度、[What’s new in Qlik Cloud (英語）](https://help.qlik.com/en-US/cloud-services/Subsystems/Hub/Content/Sense_Hub/Introduction/saas-change-log.htm)、[Qlik Cloud の新機能(日本語）](https://help.qlik.com/ja-JP/cloud-services/Subsystems/Hub/Content/Sense_Hub/Introduction/saas-change-log.htm)に掲載されます。日本語版は翻訳の都合上、英語版より情報が遅れますのでご注意ください。

**アラート機能の改善**
タイトル、メジャー、ディメンジョン、選択項目などのビジュアライゼーションの詳細が、アラートの関連するフィールドに自動設定されます。

**拡張知能の機能の強化**
●インサイトアドバイザーチャット
Explore this furtherオプションから直接、アプリ内のインサイトアドバイザーサーチ画面に質問を引き継いだ形で移動

●インサイトアドバイザー
「前の期間 対 現在の期間」ダッシュボード（フィルタ・KPI・チャート）の自動作成

●ビジネスロジック
カレンダー期間の特定の粒度（年、四半期、月単位など）を使用するか無視するかの制御が可能

**その他**
●変数編集画面の改善
変数の編集画面が、より使いやすくリニューアルされました。
変数を一覧で確認し、新規追加や編集をすることができ、最大20個の変数を同時に削除することもできます。

●カタログ
共有スペースまたは管理されているスペースを [設定] から直接削除

●接続
Facebook Fan Pages コネクターの削除
Twitter コネクターのテーブルの更新

●モバイル
Google ID や OneLogin を Qlik Sense Mobile for SaaS および OAuth 2.0 アプリケーションで、ID プロバイダーとして使用

●アプリの自動化
以下の新しいコネクタの追加が追加されました。
Snowflake、Amazon Redshift, Google Big Query, Qlik Auto ML, Dbt, UI Path, Splunk
詳細は[Qlik’s Application Automation Continues to Impress with Seven New Connectors](https://community.qlik.com/t5/Qlik-Product-Innovation-Blog/Qlik-s-Application-Automation-Continues-to-Impress-with-Seven/ba-p/1869876)

●ハイブリッドデータ配信
 Snowflake ストレージ データ アセットを作成するときに、ライブビューの作成を指定し、トランザクション的に一貫したライブ ビューが必要かどうかを選択できるようになりました。このオプションはSnowflake のコストが増加する可能性があります。既定ではオフになっています。

詳しくはクラウド版Qlik Senseのヘルプサイトをご覧ください。
【JavaScript】連想配列のキーを使ったソート

連想配列のキーを使ったソートについてメモしておく。

# 連想配列のキーを使ったソート
連想配列のキーを使ったソートの前に、```sort()```を使った1次元配列の場合は以下となる。

```javascript
const array = [10, 23, 50, 21, 45];
array.sort((a, b) => a - b);    // [ 10, 21, 23, 45, 50 ]
```

連想配列のキーを使ったソートも基本的には1次元配列の場合と変わらない。
オブジェクトのキーの値で降順ソートする場合のサンプルが以下となる。

```javascript
const array = [
	{ name: "ryota", score: 63 },
	{ name: "taro", score: 85 },
	{ name: "ken", score: 72 },
];
// 降順ソート
array.sort((a, b) => b.score - a.score);

// ソート後
 { name: 'taro', score: 85 },
 { name: 'ken', score: 72 },
 { name: 'ryota', score: 63 }
```
もし昇順にソートする場合は、```b.score - a.score```を```a.score - b.score```と書きかえればよい。
また、```sort()```は**破壊的メソッド**であり、元の配列のデータを上書きしてしまうため、ソートを実行すると元の配列が得られなくなる。そのため、元の配列を残しておきたい場合は、あらかじめコピーしておく必要がある。配列のコピーは```slice()```が使える。

```javascript
const array = [10, 23, 50, 21, 45];
const copy = array.slice();

array.sort((a, b) => a - b);    

console.log(array);    // [ 10, 21, 23, 45, 50 ]
console.log(copy);    // [ 10, 23, 50, 21, 45 ]
```
AWSで使えるマネージドAIサービスのまとめ

AWSで使えるAIサービスについてまとめておきます。

1. Amazon Personalize
1. Amazon Forecast
1. Amazon Transcribe
1. Amazon Comprehend
1. Amazon Rekognition
1. Amazon Polly
1. Amazon Redshift ML

# Amazon Personalize
ブログ記事でよくある「関連する記事」やECサイトで見かけるレコメンド商品、売れ筋ランキングなどの情報を生成できるサービスです。

# Amazon Forecast
時系列のデータ推移の予測をしてくれるサービスです。
売上、サイトアクセス数などの予測に使えそうです。

# Amazon Transcribe
音声から文字起こしをしてくれるサービスです。
リアルタイムで喋った内容を文字起こしする方法と、音声ファイルを流し込んで文字起こししてくれるジョブ型の処理の両方が利用できます。

# Amazon Comprehend
文章情報の分析を行い、キーワード抽出や感情分析、言語分析などを行うサービスです。
これもその場で入力した内容を分析する方法と、テキストファイルを流し込んで分析をさせるジョブ型の処理の両方が利用できます。

# Amazon Rekognition
画像や映像の分析を行なって映っているものを認識したり、人物が他の写真と一緒かどうかを分析するサービスを提供しています。さまざまなデモがあるのでどんなサービスなのかをすぐ確認できます。

# Amazon Polly
テキスト読み上げサービスです。

# Amazon Redshift ML
SQLに似た方法で機械学習モデルを作成し、推論結果を取得できるサービス。
例えばCreate文を作成すれば、自動的にS3からデータを取得し、SageMakerが立ち上がり、最適なモデルを選択して学習処理が進みます。
その後、Select文を発行すれば、与えられたデータからモデルが推論した結果を取得できます。

# まとめ
ビジネス利用するためにはこれまでに蓄積されたデータが必要ですが、必要なデータさえ既に蓄積できていればすぐに試してみることができます。
マネージドサービスは裏の機械学習の仕組みを知らなくても、ある程度簡単に利用できるのでAWSの他のサービスと組み合わせれば現状のシステムにうまく連携して新しい機能を作るのに役立ちそうです。

# 参考
[AWS Managed AI/ML サービス はじめの一歩](https://pages.awscloud.com/JAPAN-event-OE-Hands-on-for-Beginners-AIML-2021-confirmation.html)
Terraform importでError: Resource already managed by Terraform対策

# はじめ
`terraform plan` で差分がゴチャゴチャでapplyしても大丈夫か分からない
`terraform import` で `Error: Resource already managed by Terraform` 怒られる

## 以下の手順で対処できる

1. tfstateをバックアップ

```
$ terraform state pull > tfstate.bk
```

2. elementsモジュール削除によるdestroyの差分をstate rmで削除

```
$ terraform state rm module.network.module.private_route_table
$ terraform state rm module.network.module.public_route_table
```

3. これで邪魔なものがなくなりました

`terraform plan` でモジュールのパス確認 → `terraform import` 実施 

例：
```
terraform import 'module.rds["hoge"].module.security_group_rds.aws_security_group_rule.ingress_with_cidr[0]' sg-014c9982446a15b94e_ingress_tcp_3306_3306_172.34.163.0/26_172.34.163.64/26
```

以上です
インストール済みgemの特定ファイルの絶対パス確認方法


例： vendor/bundleをパスとしてbundle installしたrailtiesの特定ファイルのパスを確認したい
↓


```
$ bundle exec gem contents railties | grep rails/commands.rb
/home/yu_uchida/my_app/vendor/bundle/ruby/2.6.0/gems/railties-5.2.4.3/lib/rails/commands.rb
```

　
　
　
comannds.rbの中身を見たいときは
↓

```
$ cat `bundle exec gem contents railties | grep rails/commands.rb`
# frozen_string_literal: true

require "rails/command"

aliases = {
  "g"  => "generate",
  "d"  => "destroy",
  "c"  => "console",
  "s"  => "server",
  "db" => "dbconsole",
  "r"  => "runner",
  "t"  => "test"
}

command = ARGV.shift
command = aliases[command] || command

Rails::Command.invoke command, ARGV
```
業務中の息抜きに。leetcodeをお試しあれ

なんだかわからないコードをひたすら追い続けもう疲れた、気分転換したいなと思うエンジニアさん達いらっしゃるのではないでしょうか？

そこでこの度皆様におすすめするものは、「leetcode」になります！

なんとこちらのサイトはレベル別にアルゴリズムの問題が用意されておりまして、初級〜上級までと幅広いジャンル、豊富な問題数を提供してくれているサイトになります

アルゴリズムやデータ構造の勉強をしなきゃ。。。勉強方法がわからない。。。勉強してみたが、達成感がなく続かない。。。
など思われた方いらっしゃるのではないでしょうか

そんな方へこちらのサイトは要必見です！！
なんとこちらのサイトでは、自分が組んだアルゴリズムの他、他人の書いたアルゴリズムを見ることができます。また、レビュー機能もあるので、公開し修正点を指摘してもらうこともできます

さて気になるお値段ですが。。。。。。。

今ならなんと0円！！ 0円での提供になります
こんな機会もう二度とありません。ぜひ一度お試しあれ

こちらよりアクセスください
https://leetcode.com/problemset/all/
Typescript で 簡単な HTML Parser を書いてみた

メモ。
間違いなどありましたら、ご指摘お願いします

## 簡単な HTML Parser を書いてみた
HTML Parser の説明は、[こちら](https://zenn.dev/ak/articles/c28fa3a9ba7edb#nodesに変換)などを参考にしてください。
ファイルは、[github](https://github.com/YmBIgo/easy_html_parser/blob/master/html_parse.ts)にあります。

現状は、空白が完全に除去された HTML ファイル (`<p><div>hoge</div></p>` のような形式 ) で SelfClosingタグ (`<img />` や `<br />` のように、閉じるタグがないが `/` で閉じているタグ) を認識できる形になっています (コメントアウトは実装していません) 。

では、簡単にコードを説明します。

## 説明 (型)

```typescript
type MyHTMLElement = {
	nodeName: string;
	childrenNode: MyHTMLElement[];
	parentNode: MyHTMLElement | undefined;
	textContent: string;
	attributes: MyAttribute | undefined;
	DocumentPosition: MyDocumentPosition | undefined;
	isSelfClosingTag: boolean;
}

type MyAttribute = {
	[key in string]: string
}

type MyDocumentPosition = {
	openTag: { start: number | undefined; end: number | undefined; }
	closeTag: { start: number | undefined; end: number | undefined; }
}
```

[前の記事](https://qiita.com/YmBIgo/items/71fdef34f9a0825b21b0) の型説明は分かりづらかったと思うんですが、今回は nodeName, childrenNode, parentNode などがあって、分かりやすい形になっていると思います。

## 説明 (実装)

実装に当たっては、[ここのコード](https://github.com/developit/htmlParser/blob/master/src/htmlParser.js)にある、正規表現を使いました。

```typescript
let domParserTokenizer = /(?:<(\/?)([a-zA-Z][a-zA-Z0-9\:]*)(?:\s([^>]*?))?((?:\s*\/)?)>)/gm;
// 1 : / 2 : tag_name 3 : attribute 4 : /
let splitAttrsTokenizer = /([a-z0-9_\:\-]*)\s*?=\s*?(['"]?)(.*?)\2\s+/gim
// 1 : name 2 : "' 3 : value 4 : 2
```

1つ目の domParserTokenizer は `<div>` などのタグを認識し、2つ目の splitAttrsTokenizer は `class="hoge"` などの attribute を認識します。

パースする方法は、まず上の正規表現でマッチした部分を while文で回し、各ループで 上で書いた型に沿って HTMLElement を定義していく方法です。

その時の最初の parentNode になるのが、

```typescript
	let parent: MyHTMLElement = {
		nodeName: "document",
		childrenNode: [],
		parentNode: undefined,
		textContent: "",
		attributes: undefined,
		DocumentPosition: undefined,
		isSelfClosingTag: false
	}
```

の部分です。

では、while文の中身を見てみましょう。
まず、

```typescript
		if (token[1] !== "/") {
```

からの条件式では、通常の `<div>` のように `/` で区切られていないタグを HTMLElement として登録します。
そして、`<img />` のように 自分で閉じた形のタグの場合は、closeTag を設定し、それ以外の場合は parent をそのタグに変更します。

```typescript
			if (token[4] && token[4].indexOf("/") != -1 && tag.DocumentPosition != undefined) {
				tag.DocumentPosition.closeTag = tag.DocumentPosition.openTag
				tag.isSelfClosingTag = true
			} else {
				parent = tag
			}
```

では、次に `</div>` のように `/` で区切られたタグ を見てみましょう。条件式は以下のようになっています。

```typescript
		} else {
			if (token[2].toLowerCase() == parent.nodeName) {
```

ここでは、tag.DocumentPosition で抜けている closeTag を追加しています。

これで、なんとか 簡単な HTML Parser を実装できました。
[ヒントを多く与えてくれたコード](https://github.com/developit/htmlParser/blob/master/src/htmlParser.js) には感謝です。
rex0220 計算式プラグイン 足し算

[計算式プラグイン](https://qiita.com/rex0220/items/ae83c6d5ce50ff7a9a73)の足し算の基本的な使い方です。
数値項目だけではなく、文字列・チェックボックスなども値が数値であれば、数値計算が可能です。


# 概要

計算式プラグインでは、数値項目だけではなく、文字列・チェックボックスなども値が数値であれば、数値計算が可能です。
条件を指定してのテーブル項目の合計にも対応しています。

![2022-02-07_16h09_47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/44acc413-bcfd-123a-281a-939aa2e5cc62.png)

# 数値項目の足し算

単純な数値項目の足し算は、+ 演算子で指定します。
指定した項目に未入力がある場合は、計算結果が"" になります。
SUM 関数では、指定した項目に未入力ある場合、数値を合計します。

- 「足し算」項目の計算式：
    -  数値A+数値B
-  「合計」項目の計算式：
    -  SUM(数値A,数値B)

![2022-02-07_14h28_33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/42adf97f-3884-0ee1-6a40-53ba32605f4a.png)

計算式の設定画面

![2022-02-07_14h30_14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/ab5ecc88-b4fa-49b5-3ba6-6d9853d5d6ef.png)


※ 項目未入力時の足し算方法２
SUM 関数の他に、項目未入力時の足し算方法があります。

- IF 関数：
    - IF(数値A,数値A,0) + IF(数値B,数値B,0)
- NVL 関数：
    - NVL(数値A,0) + NVL(数値B,0)


# 文字列・ラジオボタン・ドロップダウン項目の足し算
値が数値であれば、数値項目と同様に足し算が可能です。

- 文字列合計の計算式
    - SUM(文字列A,ラジオボタンA,ドロップダウンA)

![2022-02-07_15h11_11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/95e67f97-a4b4-72d0-1b96-34efbe6ad677.png)

# チェックボックス・複数選択項目の足し算
チェックボックス・複数選択項目の数値を合計する場合は、ARAAY 関数が必要です。

- 「チェックボックスの合計」の計算式：
    - SUM(ARRAY(チェックボックスA),ARRAY(複数選択A))

![2022-02-07_15h25_30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/2e8caef6-b319-1db0-49f6-e3075f96823a.png)


# テーブル項目の足し算（行単位）

行単位で、足し算を行う場合、TR_SUM 関数を指定します。
※SUM 関数は、全行の合計になります。

- 金額（税込み）の計算式：
    - TR_SUM(金額_税抜き,消費税)

![2022-02-07_15h38_23A.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/9f92c78e-09fe-0385-91b1-41a2eb913782.png)

# テーブル項目の合計


![2022-02-07_15h38_23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/9a3e0b45-d314-e81d-fc37-3e8cbebd385b.png)

# 条件を指定して、テーブル項目の合計

SUMIF関数で条件を指定して数値を合計します。

- 「消費税合計（8%）」の計算式
    - SUMIF(税区分="8%",消費税)
- 「消費税合計（10%）」の計算式
    - SUMIF(税区分="10%",消費税)


![2022-02-07_16h04_12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/1fc09788-e7c8-752c-6a2c-d7cc5f3c60a1.png)
コマンドラインからYouTubeの音楽を再生 - 『yewtube』の紹介


## mps-youtubeが使えない(泣)！
コマンドラインからYouTubeを再生できるツールとして、[mps-youtube](https://www.blky.me/2018/02/02/mps-youtube/)がありますが、
長らくメンテナンスがされていないようで、、、
（2021年にYouTubeから廃止された「低評価」がまだ削除されておらず、エラーの原因になっていたり。）
(issueやプルリクも結構溜まってる)


「どうにか使えないかな。」と、issueをブラウズしてたら、もっと便利にしてくれている方がいたので、紹介します。

↓『[yewtube](https://github.com/iamtalhaasghar/yewtube)』リポジトリ

https://github.com/iamtalhaasghar/yewtube

iamtalhaasgharさん、、、もう神です。。。

## mps-youtubeからの変更部分
([README](https://github.com/iamtalhaasghar/yewtube/blob/develop/README.md)から抜粋)
### 1. Youtube APIキーが要らない！
GCPで"YouTube Data"のキーを発行する必要があった。
簡単に使えるようになりました。

### 2. VLCをGUI無しで再生できる
**VLCのダミーインターフェイス機能が追加されてます！**
Macではmpvがプレイヤーとしてオススメされていましたが、バグが出て再生できなかったんですよね。
VLCでも再生できたのですが、GUIが立ち上がるのでスマートじゃなかったので、これは画期的です。

### 3. その他バグ修正


## インストール
既にpyplにも上げてくれているようです。神ですね。

```:bash
# pipでインストール　
pip3 install yewtube

# もしかしたらGitHubからの方が良いかもしれないです
pip3 install git+https://github.com/iamtalhaasghar/yewtube
```


VLCが入っていない方は、インストールしてください。

```:Bash
brew install vlc
# or
sudo apt install vlc
```

## 使い方
基本的にはmps-youtubeと変わらないので、そっちの手順を見たほうが良いかもしれません。
https://github.com/mps-youtube/mps-youtube

こちらがとても参考になりました！mm
[ターミナルからYoutubeの音楽を聴く”mps-youtube”](https://www.blky.me/2018/02/02/mps-youtube/)

```:bash
# 起動
yt

### 検索 ###
# 例
> /アイデンティティ
# キーワードは追加できます
> /アイデンティティ Kanaria
```


こんな感じで検索結果(Kanariaさんのアイデンティ)が出てきます。
![Screen Shot 2022-02-07 at 15.25.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550844/609a07b6-71b0-f501-92d1-e55dbd01b6b1.png)



```:bash
# 再生(検索結果から番号で選択)
> 1

### その他設定など ###
# help
> h

# Playerの変更
> set player mpv # mpv用
> set player vlc # VLC用

# 終了
q # (もしくは Ctrl+C)
```


## VLCをバックグラウンドで立ち上げる
```:bash
> set vlc_dummy_interface true
```
バックグラウンドで音楽が再生できたらOKです。

## おまけ
プレイリストの検索もできるようです。

```:bash
# プレイリストの検索
> //ボカロメドレー
# 複数再生(1〜10, 11, 16〜24を再生)
> 1-10, 11, 16-24
# すべて再生
> all
```

## まとめ
ブラウザからYouTubeを開くと、作業の邪魔になったり、リソースを食ってしまうので、
凄くありがたいツールだなと思い、紹介させていただきました。

## URLs
[yewtube - GitHub](https://github.com/iamtalhaasghar/yewtube)
[mps-youtube - GitHub](https://github.com/mps-youtube/mps-youtube)
[ターミナルからYoutubeの音楽を聴く”mps-youtube”](https://www.blky.me/2018/02/02/mps-youtube/)

ありがとうございました。
【Rails】過去一週間でいいねされた数を多い順でソートする

#初めに
プログラミング初学者2ヶ月目です。
今回が初投稿となります。
自身の忘備録として記事を更新していこうと思いますので、もし間違いなどありましたらご指摘頂けると幸いです。

#アソシエーション
```ruby:user.rb
has_many :books, dependent: :destroy
has_many :favorites, dependent: :destroy
```

```ruby:book.rb
belongs_to :user
has_many :favorites, dependent: :destroy
has_many :favorited_users, through: :favorites, source: :user
```

```ruby:favorite.rb
belongs_to :user
belongs_to :book
```
userモデル,bookモデル,favoriteモデルのアソシエーションが完成しました。
has_many :favorited_users, through: :favorites, source: :user
はfavoritesモデルを介してuserモデルのデータを持ってくるという記述になります。
この解釈が正しいかわかりませんがそんな感じです。笑

#コントローラー
```ruby:book_controller.rb
def index
    to = Time.current.at_end_of_day
    from = (to - 6.day).at_beginning_of_day
    @books = Book.includes(:favorited_users).
      sort_by {|x|
        x.favorited_users.includes(:favorites).where(created_at: from...to).size
      }.reverse
    @book = Book.new
  end
```
今回はeach文でビューページに投稿された内容を一覧表示しています。
いいね数が多い順で表示させるためにコントローラー内で条件を定義してあげます。
上から順番に見ていきましょう。

```
to = Time.current.at_end_of_day
```
Time.current はconfig/application.rbに設定してあるタイムゾーンを元に現在日時を取得しています。
at_end_of_day は1日の終わりを23:59に設定しています。

```
from = (to - 6.day).at_beginning_of_day
```
()内はなんとなく分かりますね。
at_beginning_of_day　は1日の始まりの時刻を0:00に設定しています。

上記２行を要約すると
一週間分のデータとってきたよーって感じです。笑

```
@books = Book.includes(:favorited_users).
```
今までは@books = Book.all で投稿されたデータを全て取得していましたが、どうやら誰が投稿したかという情報をユーザーテーブルに毎回取りに行っているそうです。
そこで includesの登場です。先程book.rbで記述した
has_many :favorited_users, through: :favorites, source: :user
のおかげでユーザーの情報がfavorited_usersに格納されていて、includesの引数に入れてあげることで、事前にユーザーのデータを読み込ませてあげることができます。これで無駄にSQL文が発行されなくなります。

```
sort_by {|x|
  x.favorited_users.includes(:favorites).where(created_at: from...to).size
 }.reverse
```

sort_byメソッドを使っていいね数を少ない順に取り出しています。
ブロック変数 |x| を定義してあげないと、2よりも10,11の方が小さいと判定されてしまうのでこのように対処するそうです。
ただ、このままだと少ない順に表示されてしまうので最後にreverseをつけてあげましょう。
これで昇順、降順を入れ替えることができます。

sort_byではなくsortを使って記述することもできます。

```
sort {|a,b|
  a.favorited_users.includes(:favorites).where(created_at: from...to).size <=>
  b.favorited_users.includes(:favorites).where(created_at: from...to).size
 }.reverse
```
UFO演算子を使ってaとbを比較して返す記述方法です。
個人的にはsort_byの方が分かりやすくて記述も少ないので好きです。
それぞれのメリットデメリットはどうなのか把握できてないので気になる方は調べてみてください。

参考までにlink貼っておきます。

https://docs.ruby-lang.org/ja/latest/method/Array/i/sort.html

以上になります。

#最後に
初めての投稿で拙い説明、合ってるかも少し不安な点も多々有りますがご容赦いただけると幸いです。
冒頭でもお伝えした通り、間違いがあればご指摘ください。
今後も定期的に更新していけたらと思いますので、その際はよろしくお願いします。
最後までありがとうございました。
ESP32 A fatal error occurred: Timed out waiting for packet header

「A fatal error occurred:　ESP32XXXXXXX Timed out waiting for packet header」
が出て、書き込みが出来ない。

LEDストリップのコントロールをさせようとしたところ、上記エラーが出て書き込みできず。

COMポートも通信できてます。
USBの裏表も関係なさそう。
リセットボタンを押すとシリアルポートにBOOTが飛んでくる。

原因はGNDをLED電源と共通化させていること。
GNDを抜いてあげれば無事書き込み出来た。
Oracle Databaseの認証情報をTextファイルに保存するのは止めましょう！ -外部パスワード・ストア活用のすすめ-

## 外部パスワード・ストアとは

Oracle Databaseへ接続するための認証情報を保存した外部のWalletファイルになります。
外部パスワード・ストアを作成すると認証情報をそこから読み取るので、以下のようにバッチスクリプトなどにパスワードを書く必要がなくなり、セキュリティの向上につながります。

```
$sqlplus /@<接続識別子>
もしくは
SQL> connect /@<接続識別子>
```

上記に付随して、パスワードを変更してもスクリプトの修正が不要となる利点もあります。
また外部パスワード・ストアには暗号化された状態で認証情報が保存されます。

ちなみに私は19cの環境で試しましたが、機能自体は10gR2からあります。
19cのマニュアルは以下になります。
[安全性の高い外部パスワード・ストアについて](https://docs.oracle.com/cd/F19136_01/dbseg/configuring-authentication.html#GUID-2239A690-3F63-4B1D-A09B-94B8411700D5)


## 利用手順

最初にWalletファイルを作成するため mkstore コマンドを実行します。
パスの部分は環境に合わせて変更してください。

```
$ mkstore -wrl /u01/app/oracle/product/19.0.0/dbhome_1/network/admin/wallet/ -create
Oracle Secret Store Tool Release 19.0.0.0.0 - Production
19.3.0.0.0: バージョン{1}
Copyright (c) 2004, 2019, Oracle and/or its affiliates. All rights reserved.

パスワードの入力:
パスワードの再入力:
```

無事に作成できますと指定したディレクトリ配下に以下のファイルが作成されます。

- cwallet.sso
- cwallet.sso.lck
- ewallet.p12
- ewallet.p12.lck

作成したWalletファイルにデータベースの認証情報を保存します。
この際も mkstore コマンドを実行します。

```
$ mkstore -wrl /u01/app/oracle/product/19.0.0/dbhome_1/network/admin/wallet/ -createCredential TSTPDB1 test
Oracle Secret Store Tool Release 19.0.0.0.0 - Production
19.3.0.0.0: バージョン{1}
Copyright (c) 2004, 2019, Oracle and/or its affiliates. All rights reserved.

コマンド・ラインでシークレット/パスワードが欠落しています
シークレット/パスワード入力:
シークレット/パスワード再入力:
ウォレット・パスワードを入力してください:
```

パスには作成したWalletファイルまでのパスを、createCredentialオプションには「接続識別子」と接続に使う「ユーザ名」を指定します。
コマンドを実行するとパスワードの入力を求められるので、指定したユーザのパスワードを入力します。
最後にWalletファイルに設定したパスワードを入力します。

続いて sqlnet.ora に以下を追記します。

```
WALLET_LOCATION =
  (SOURCE =
    (METHOD = FILE)
    (METHOD_DATA =
  (DIRECTORY = /u01/app/oracle/product/19.0.0/dbhome_1/network/admin/wallet)
  )
 )
SQLNET.WALLET_OVERRIDE = TRUE
```

DIRECTORY にて指定するパスはWalletファイルの配置先を指定します。
これで準備が整いました。
外部パスワード・ストアを利用して接続してみます。

```
$ sqlplus /@TSTPDB1
```

以上になります。
セキュリティ向上のために是非ご活用ください。
CakePHP4でAjaxを利用する with csrfToken

# やること
セレクトボックスの値が変わったら、選択された値を取得して、一旦コントローラーに送信し、返却。
返却された値をテキストボックスに挿入。ということをやってみます。

# 確認環境
* CakePHP 4.2.9
* jQuery 3.6.0

# Templates
```html:index.php
<div class="index content">
    
    <select id="kicker">
        <option value="1">サンプル1</option>
        <option value="2">サンプル2</option>
        <option value="3">サンプル3</option>
    </select>
    
    <input type="text" id="target" disabled>
    
</div>

<script>
    $("#kicker").on("change", function(){
        var send_data = {selected:$('option:selected').val(), add_key:'add_value'};

        $.ajax({
            type: "post",
            url: "<?= $this->Url->build(['controller' => 'Samples', 'action' => 'receiver']) ?>",
            data: send_data,
            headers: { 'X-CSRF-Token' : "<?= $this->request->getAttribute('csrfToken') ?>" },
        }).done(function(response){
            $("#target").val($.parseJSON(response));
        }).fail(function(jqXHR){
            console.error('Error : ', jqXHR.status, jqXHR.statusText);
        });
    });
</script>
```
### 大事な点
```headers: { 'X-CSRF-Token' : "<?= $this->request->getAttribute('csrfToken') ?>" },```
headersに'X-CSRF-Token'がないと403エラーになるので気を付けてください。
ちなみにbeforeSendでもできましたが、なんか使い方違う気がした()のでheadersにしました。
どうしてもajax処理より先にcsrfを送らないといけない場合は使うかも。

```url: "<?= $this->Url->build(['controller' => 'Samples', 'action' => 'receiver']) ?>",```
urlの生成はCake3系からHtml->urlではなくUrl->buildに変更になってます
ちなみにurlは文字列で'samples/receiver'でもいけます

# Controller
```php:SamplesController
<?php
declare(strict_types=1);

namespace App\Controller;

/**
 * Samples Controller
 */
class SamplesController extends AppController
{
    
    public function index(){}
    
    public function receiver(){
        $this->autoRender = false;
        $data = $this->request->getData();
        echo json_encode($data['selected']);
        //echo json_encode($data['add_key']);
    }
}
```
```$this->autoRender = false;```がないと500エラーになっちゃうので気を付けてください。
getData()で取得して、そのままecho json_encodeして返すだけです。'add_key'の方を取得すると'add_value'が取れます。
取得した値を元にDBにデータを検索、listで取得してそのまま返して動的なセレクトボックスとか作れると思います。

# まとめ

とにかく調べても調べても最低限の知識で作られたサンプルがなくて…
とりあえずここまでできれば後は皆でどうにかしてくれるよね？