OmniAICreator/Qiita-1.07M huggingface dataset:
Falco Ruleを紹介するシリーズ - CloudTrail Logging Disabled

:::note info
10/28（金）コンテナクラウドセキュリティで訊かれる「ランタイムセキュリティ」とは？と題してFalcoをSysdigが徹底解説するウェビナーを開催します。ご興味ある方はこちらから
https://go.sysdig.com/20221028JapanWebinar1.html
:::
本シリーズでは、ランタイム脅威検知のデファクトスタンダードである<a href=https://falco.org/ target=new>Falco</a>の検知Ruleを、１つの記事で１つ簡単に紹介していきます。
ランタイムセキュリティやFalco自体の概要を知りたい方は<a href=https://sysdig.jp/blog/intro-runtime-security-falco/ target=new>こちらのブログ記事</a>をご参照ください。
今回ご紹介する検知Ruleは<b>「CloudTrail Logging Disabled」</b>です。
# Rule記述
```
- rule: CloudTrail Logging Disabled
  desc: The CloudTrail logging has been disabled, this could be potentially malicious.
  condition:
    ct.name="StopLogging" and not ct.error exists
  output:
    The CloudTrail logging has been disabled.
    (requesting user=%ct.user,
     requesting IP=%ct.srcip,
     AWS region=%ct.region,
     resource name=%ct.request.name)
  priority: WARNING
  tags:
    - cloud
    - aws
    - aws_cloudtrail
  source: aws_cloudtrail
```
# Rule概要
<a href="https://github.com/falcosecurity/plugins/tree/master/plugins/cloudtrail" target=new>CloudTrailプラグイン</a>をインストールすることで使用可能になるルールです。
CloudTrailロギングの無効化を検知します。
AWS CloudTrailは、AWS Management Console、AWS SDK、コマンドラインツール、および上位のAWSサービスを使用して行われたAPIコールを含むアカウントのAWS APIコールの履歴を取得することにより、クラウド上のAWSデプロイメントを監視することができます。
そのため、CloudTrailを無効化すること自体が疑わしい活動と言えます。
CloudTrailロギングを有効化することは、AWSセキュリティのベストプラクティス26選のうちの１つです。ベストプラクティスの詳細については、<a href="https://sysdig.jp/blog/26-aws-security-best-practices/" target=new>こちらのブログ記事</a>もご参照ください。

# Condition（条件）
`ct.name="StopLogging" and not ct.error exists`
CloudTrailのイベント名が"StopLogging"で、エラーが発生していない場合

# Output（出力）
CloudTrailロギングが無効化されました。

`%ct.user`
ユーザー名

`%ct.srcip`
送信元IPアドレス

`%ct.region`
AWSリージョン

`%ct.request.name`
リクエストの対象エンティティ名
LambdaからDynamoDBへデータを登録する(Ruby)


# はじめに
LambdaとDynamoDBを使用すればIOT用のグラフページを作成できるのではと思ったのでその備忘録。
この記事では図中上の「IOTデータ保存」部分を実施。

![Lambda-DB.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/195542/82933046-6bbe-6525-d7a2-d8d23116a3ec.png)

# DynamoDBの設定
パーテーションキーとソートキーがある
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/195542/dcdf7d30-7cf0-90cc-c534-582bb2e6db46.png)
上記例ではパーテーションキーがidでソートキーがtime
パーテーションキーのみ、またはパーテーションキーとソートキーの2つを指定する事が可能。

今回のIOT機器の場合、idが機器固有の番号、timeがデータを計測した際の時間としています。
理由としてとあるIOT機器(id)が同じ時間(time)に計測を実施したデータを2つ3つ送信する事は無いはずなので。
idとtimeの2つの値を合わせて主キーの様な扱いとしています。

#  API Gatewayを使用しない(Lambdaのみ)
関数URLというものが存在する。
これによりLambda関数用のURLを生成できる。

![関数URL.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/195542/2675cfb0-bd51-9a61-466d-f7cb6e4e1a05.png)

関数URLについては公式ブログを参考にしてください
利用料やAPIGatewayを使用する場合との違いなどが記載されています。

https://aws.amazon.com/jp/blogs/news/announcing-aws-lambda-function-urls-built-in-https-endpoints-for-single-function-microservices/

# LambdaへDynamoDBへのアクセス権限を与える
![許可ポリシー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/195542/aa0ee6a2-09c2-e949-5759-7b0aa0834e46.png)
Lambda関数で使用中のロールに`AmazonDynamoDBFullAccess`ポリシーをアタッチ。
今回の場合DynamoDBへの書き込み権限だけで問題ないはずですが、あらかじめ用意されているポリシーではFullAccessくらいしか書き込めそうなのが無かったのでとりあえずフルの権限を与えました。
`dynamodb:PutItem`が書き込みのアクションだと思いますが`AWSLambdaDynamoDBExecutionRole`だとDynamoDBは読み込み限定で書き込み許可されてなさそう。

# Lambdaプログラム
機器からの受信データはそれぞれ
- v:電源電圧
- temp:気温
- lux:明るさ
- rx:電波受信感度
- status:バッテリー駆動またはソーラー発電による駆動のステータス

機器idは1固定で保存していますが、データと一緒に機器idも受け取るべき。

```Ruby
require 'json'
require 'aws-sdk-dynamodb'

def lambda_handler(event:, context:)
  # 受信データ加工
  datas = JSON.parse(event["body"])
  v = datas["data1"]
  temp = datas["data2"]
  # datas["data3"]
  lux = datas["data4"]
  rx = datas["data5"]
  status = datas["data6"]
  if status > 1
    status = false
  else
    status = true
  end
  
  # DynamoDB保存処理
  region = 'ap-northeast-1'
  table_name = 'iot_data'
  
  client = Aws::DynamoDB::Client.new(region: region)
    
  table_item = {
    table_name: table_name,
    item: {
      id: 1,
      battery: status,
      rx: rx,
      voltage: v,
      temperature: temp,
      light: lux,
      time: "#{Time.now}"
    }
  }
  
  client.put_item(table_item)
  
  return { event: JSON.generate(event), context: JSON.generate(context.inspect) }
end
```


# 実行結果
↓のようにデータが登録されていく。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/195542/73c84347-bc4d-0e4d-5812-adb724d6a536.png)
エンティティの洗い出し

　最近フリマアプリを実装するにあたってエンティティの洗い出しとER図、readmeを書くのにめっちゃ時間かかったので復習。
　結論からいうとER図はこんな感じになった。
![スクリーンショット 2022-10-26 9.39.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2884270/3c3285f3-f061-b9a2-ee60-6c9bba870c92.png)

　フリマアプリのER図を書く時に一番困ったのは、中間テーブルの存在。
自分の浅い認識では中間テーブルというのは多対多のテーブルの関係の間にはさまってるイメージだったけど、今回は出品情報を一旦まとめるテーブルと、受け取り先をまとめるテーブルを作って、その間を取り持つような形になった。
　ユーザー情報はdeviseをつかって。あとでバリデーションとか設けるときにメールアドレスとパスワードはdeviseの使用で勝手に記述されるので、二重記述にならないように注意。
　で、テーブルの設計はこうなった。
![スクリーンショット 2022-10-26 9.44.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2884270/340d1a79-e5b3-b77c-4f40-1b34a814e67d.png)
　ちなみに_idでついてるのはアクティブハッシュといって、プルダウン方式に設定するので、それができるようにカラム名を設定。
![スクリーンショット 2022-10-26 9.48.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2884270/e7fa617f-8f09-6bad-7775-149fef07cc99.png)
　モデルはこんな感じに。多分冗長な記述とかある気がする。あとで単体テストするときにわかったけど、「パスワードに半角英数混合」とか「名字と名前の部分は全角で」っていう指示するのができてなくて、大変苦労した。
あとはファクトリーボットとフェイカーで仮のデータをつくって、正常系、異常系両方ともテストで問題なければ無事実装。という流れでした。
　コンピュータって理屈っぽすぎる。けどそれが逆にたまらない。
　以上、忘備録。
【小ネタ】ctypes.Structureを使う際のアラインメント

PythonでバイナリファイルとI/Oしたいとき「ctypes.Structure」を使用するのだが、アラインメントの調整が入るのが気に入らなかった。
ドキュメントをちゃんと見たら調整方法が書いてあったので、忘備録としてメモ。
https://docs.python.org/ja/3/library/ctypes.html#structure-union-alignment-and-byte-order

# 普通の使い方
こんな感じで使用します。
```python
import ctypes
class Test1(ctypes.Structure):
    _fields_ = [
        ("X", ctypes.c_int32),
        ("Y", ctypes.c_int32),
        ("Z", ctypes.c_int32),
    ]
```
この場合のサイズは12バイトです。
```python
test1 = Test1()
ctypes.sizeof(test1)

12
```

# アラインメントで調整されてしまう書き方
これだと、アラインメントでサイズが変更されます。
```python
class Test2(ctypes.Structure):
    _fields_ = [
        ("X", ctypes.c_int32),
        ("a", ctypes.c_int64),
    ]
```
この場合のサイズは16バイトです。
```python
test2 = Test2()
ctypes.sizeof(test2)

16
```
なお追加される4バイトは、Xとaの間ではなく、最後に追加されるようです。（謎）

# 対応方法
_pack_でバイトオーダーの値を設定します。
※_fields_より前に設定すること
```python
class Test3(ctypes.Structure):
    _pack_ = 1
    _fields_ = [
        ("X", ctypes.c_int32),
        ("a", ctypes.c_int64),
    ]
```
※「\_pack\_ = 4」でもOK
これだとサイズはちゃんと12バイトになります。
```python
test3 = Test3()
ctypes.sizeof(test3)

12
```
DMXとかArtNetについて調べてみた

お勉強のメモ

# はじめに

最近、TouchDesignerというものをいじってみたりしていて、
「DMXってなんぞや」とか「ArtNetってなんぞや」とか「universeってなんだ」とか自分の中で不明瞭なことが多かったので、調べてまとめてみた。
(ド素人なので、間違ってたりしたら教えていただけると感謝です。)

ちなみに、TouchDesignerについては

https://qiita.com/sanokazuya0306/items/75eeb7009bf4eb5678bc

とか見てみるといいかもしれない。

# DMXについて

+ **DMXとは?**

「DMX」というのは、舞台照明とか演出機器の制御に使われている通信プロトコルです。
正式には、「DMX512-A」って言うらしいです。
舞台、建築のライティング、クリスマスイルミネーション、電光掲示板とか結構幅広く使われているらしいです。(スモークとか、花火とか、モーターとかいろいろ操作できるらしい。すごい。)

単純で、堅牢で、ケーブルを乱暴に扱ってもいい、みたいなメリットがあります。
→外乱の多い屋外でも安定して使える。

https://ja.wikipedia.org/wiki/DMX512-A


DMXでは、機器を[デイジーチェーン](https://ja.wikipedia.org/wiki/%E3%83%87%E3%82%A4%E3%82%B8%E3%83%BC%E3%83%81%E3%82%A7%E3%83%BC%E3%83%B)(数珠つなぎ)で接続して、それぞれの機器に割り振られたアドレスを用いて、照明とかを制御します。
シリアル通信のI2Cみたく1つのマスターから複数の機器(スレーブ)と接続してデータのやり取りができる、みたいなイメージです。
シリアル通信、I2Cについては↓からどうぞ。

https://qiita.com/Gri_Gra/items/b6f901b35d3917ffc580

+ **データ形式**

DMXでやり取りされるデータは__513byte__のパケットです。
0スロット目は、「スタート・コード」といって、データの種類を指定しています。
それ以降の、1~512スロットは「データ・スロット」といって接続機器をコントロールするためのデータが格納されています。

**1パケット = \[0スロット, 1スロット, 2スロット, ... , 512スロット\] (1スロット=1Byte)**
**= \[スタート・コード, 1チャンネル, 2チャンネル, ... , 512チャンネル\]**

データ・スロットのことを「チャンネル」と呼ぶこともあり、
「この機器は制御に14channel必要」
「こっちは9channel」
みたく使います。
（DMXでは1バイトのことを「スロット」と呼びます。）

デイジーチェーンされた各接続機器には、読み取るべき自分のデータがどのチャンネルから始まるかを指定する「スタート・アドレス」が設定されます。
「この機器は173channnlから」
みたいなイメージです。

# ArtNetについて

DMXの欠点

1universe＝512channel→1channel＝8bit→0〜255
→チャンネルのスタート1chから！
Art-Net4 32768universeが使用(2^15)
→ユニバースのスタートは0uniから！


RDMについて(Remote Device Management)

https://show-network-lab.hateblo.jp/entry/rdm



TDではDMX Out Chopの各チャンネルが上から順に1〜と割り当てられている。

メモfromWiki
>データは250kbit/sでシリアルに伝送され、1度に連続転送されるのは最大513バイトのパケットである。

キャノン→USのキャノン社が作ったケーブル。正式にはXLRケーブル。
キャノンの極性が違うものがあるので注意らしい。

# 力尽きる。

# 参考
(記事内で紹介したものも含む)

https://qiita.com/sanokazuya0306/items/75eeb7009bf4eb5678bc

https://qiita.com/LUDO/items/25e2a27619a05fffeab9

https://jmpelletier.com/ja/dmx512/

https://show-network-lab.hateblo.jp/entry/artnet

http://www.ushiolighting.co.jp/entertainment/blog/?tag=art-net
Azure Fundamentals(AZ-900)：Azure の基礎: Azure のアーキテクチャとサービスについて説明する「Azure ディレクトリサービス」

Microsoft Learnを用いたMicrosoft Azure Fundamentals(AZ-900)の試験内容をまとめる投稿です。
この投稿ではMicrosoft Learnで学ぶ内容をできるだけ簡潔にまとめております。
Azureの勉強を一から始める方の参考になれば幸いです。

## 今回の学習内容
**◆「Azure ディレクトリサービス」**
◇対応するMicrosoft Learn ラーニングパス
[Azure の基礎: Azure のアーキテクチャとサービスについて説明する](https://learn.microsoft.com/ja-jp/training/paths/azure-fundamentals-describe-azure-architecture-services/)
◇対応するモジュール
[Azure ディレクトリ サービスについて説明する](https://learn.microsoft.com/ja-jp/training/modules/describe-azure-identity-access-security/2-directory-services)

※前回の投稿は下記から確認できます。
[Azure Fundamentals(AZ-900)：Azure の基礎: Azure のアーキテクチャとサービスについて説明する「Azureのファイル移動オプション」](https://qiita.com/fsd-jume/items/8ebadb8ee2cd1cd36e4d)

## Azure ディレクトリサービス
### Azure Active Directory(Azure AD)
**クラウドベースのIDおよびアクセス管理サービス**
**◆Azure ADの利用者**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2851723/a20d244c-1fb0-3e30-ab0d-b1de4780e841.png)

**◆Azure ADが提供するサービス**
**◇認証
アプリとリソースにアクセスするためのIDの検証**
・セルフサービスによるパスワードリセット
・多要素認証(MFA：Multi-Factor Authentication)
・禁止されているパスワードのカスタムリスト
・スマートロックアウトサービスなど
**◇シングルサインオン(SSO：Single Sign On)
1つのユーザ名と1つのパスワードで複数のアプリにアクセス可能**
・ユーザのIDは1つのため、セキュリティモデルが単純化
・アカウント変更/削除時の労力が大幅に減少
**◇アプリ管理
クラウドとオンプレミスのアプリを管理可能**
・アプリケーションプロキシ、SaaSアプリ、マイアプリポータル、SSOを使用すると、ユーザエクスペリエンスを向上可能
**◇デバイス管理
デバイスの登録により、ツールを使用した管理が可能**
・アカウントに関係なく、デバイスごとにアクセス制御が可能

**◆オンプレミスのADとAzure ADの接続**
**オンプレミスのADとAzure ADがある場合は、2つのIDセットを維持する必要がある**
⇒Azure AD Connectを用いて両者を接続することで、オンプレミスとクラウド間でユーザIDを同期可能
・Azure AD Connectでは両方のIDシステム間で変更が同期される
⇒両方のシステムでSSO、MFA、セルフサービスによるパスワードリセットが可能

### Azure Active Directory Domain Services(Azure AD DS)
**マネージドドメインサービスを提供**
※マネージドドメインサービス(AD DS機能)：ドメイン参加、グループポリシー、LDAP認証、Kerberos/NTLM認証など
・クラウドでドメインコントローラ(DC)をデプロイ、管理、パッチすることなく、ドメインサービスを使用可能
・既存のAzure ADテナントと統合されることにより、
　-ユーザは既存の資格情報でサインイン可能
　-既存のグループとユーザアカウントを使用して、リソースへのアクセス制御が可能
※Azure ADテナント：単一の組織を表し、Azure AD利用時に自動的に作成

**◆Azure AD DSのしくみ**
・マネージドドメインを作成するときは、一意の名前空間(ドメイン名)を定義する
⇒選択したリージョンに2つのWindowsサーバDCがデプロイされる( =レプリカセット)
・これらのDCの管理、構成、更新は自分で行う必要なし
⇒マネージドドメインの一部としてDCを処理

**◆情報の同期**
・マネージドドメインはAzure ADからの一方向の同期のみ
・マネージドドメイン内で直接リソース作成は可能だが、Azure ADに同期されない
・オンプレミスのAD DS環境とのハイブリッド環境
⇒Azure AD ConnectでID情報がAzure ADと同期された後、マネージドドメインと同期
・マネージドドメインに接続されるAzure内のアプリ、サービス、VMは共通のAD DS機能を使用可能
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2851723/a26dd28d-9b3d-a465-0e6f-99dafeeba986.png)

## 次の学習内容
**◆Azureの認証方法**

https://qiita.com/fsd-jume/items/466923ea5d53c2fcd380

## 学習内容をまとめたページの一覧

https://qiita.com/fsd-jume/items/e4ec76959adb547ac5e8
【メモ】OutSystemsのアクション差異

# アクションについて
OutSystemsには、3つのアクションがある。
* スクリーンアクション (画面ウィジェットに対応するイベント処理)
* クライアントアクション (スクリーンアクションもしくは、別のクライアントアクションから呼び出されるAPIのようなもの)
* サーバーアクション (スクリーンアクションもしくは、クライアントアクション、別のサーバーアクションから呼び出されるAPIのようなもの)

# アクション別、実行環境

| アクション | クライアント | サーバー |
|-----------|:------------:|:---------:|
| スクリーンアクション| ●|
|クライアントアクション| ●|
|サーバーアクション||●|

# アクション別、ウィジェットの違い

|ウィジェット|スクリーンアクション|クライアントアクション|サーバーアクション|
|-----------|:----------------:|:------------------:|:--------------:|
|イメージ|![2022-10-26_08h48_13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2910496/658f3c6a-f011-dcbe-758d-3316d761332c.png)|![2022-10-26_08h54_16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2910496/33ec9101-61c5-a267-03fc-0cf884a9d575.png)|![2022-10-26_08h54_35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2910496/37ab6edb-26a9-29f6-8b50-ed078660f9e9.png)
| Start<br>Message<br>If<br>Switch<br>For Each<br>Assign<br>JSON Serialize<br>JSON Deserialize<br>Exception Handler<br>RaiseException<br>Comment |●|●|●|
|RefreshData<br>Destination<br>Download|●|||
|JavaScript|●|●||
|Aggregate<br>SQL<br>Record List To Excel<br>Excel To Record List<br>Send Email|||●|

# メモ
画面自体に、データベースを使用する、アグリゲート(SQLクエリーのようなもの)をフェッチ可能なため、スクリーンアクションやクライアントアクションに、Aggregateのウィジェットが存在していると誤認していたのですが、実際には存在していない事を、このタイミングで確認しました。

# 免責事項
ここに記載している情報は、正しい情報を記載するよう努めておりますが、情報に誤りがあった場合や、第三者によりデータの改ざん、データダウンロード等によって生じた障害等に関し、事由の如何を問わず一切責任を負うものではありません。
AutoGluonでテーブルデータの分析やーる

# はじめに

これやっていきます

https://auto.gluon.ai/stable/index.html

# 開発環境
- Windows 10 PC
- Python 3.9

# 導入

pip install autogluon

（※GPUで実行する場合）
pip install torch==1.12.0+cu113 torchvision==0.13.0+cu113 torchtext==0.13.0 --extra-index-url https://download.pytorch.org/whl/cu113

~~~
from autogluon.tabular import TabularDataset, TabularPredictor
train_data = TabularDataset('https://autogluon.s3.amazonaws.com/datasets/Inc/train.csv')
test_data = TabularDataset('https://autogluon.s3.amazonaws.com/datasets/Inc/test.csv')
predictor = TabularPredictor(label='class').fit(train_data=train_data)
predictions = predictor.predict(test_data)
~~~

AutoGluon training complete, total runtime = 513.17s ... Best model: "WeightedEnsemble_L2"
TabularPredictor saved. To load, use: predictor = TabularPredictor.load("AutogluonModels/ag-20221024_125633\")

AutogluonModels/ag-20221024_125633に.pklで保存される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63863/c6b56346-02d4-6384-df0d-adf44f475c4f.png)

~~~
from autogluon.multimodal import MultiModalPredictor
from datasets import load_dataset
train_data = load_dataset("glue", 'mrpc')['train'].to_pandas().drop('idx', axis=1)
test_data = load_dataset("glue", 'mrpc')['validation'].to_pandas().drop('idx', axis=1)
predictor = MultiModalPredictor(label='label').fit(train_data)
predictions = predictor.predict(test_data)
score = predictor.evaluate(test_data)
~~~

load_offloaded_weightsのエラー
RuntimeError: Failed to import transformers.models.gpt2.modeling_gpt2 because of the following error (look up to see its traceback):
cannot import name 'load_offloaded_weights' from 'accelerate.utils' (C:\Users\good_\anaconda3\envs\py39\lib\site-packages\accelerate\utils\__init__.py)

pip install --upgrade accelerate
Successfully uninstalled accelerate-0.8.0
Successfully installed accelerate-0.13.2

datasetsが見つからないエラー
ModuleNotFoundError: No module named 'datasets'
pip install --upgrade mxnet

AttributeError: module 'numpy.random' has no attribute 'Generator'
pip install --upgrade numpy

Successfully uninstalled numpy-1.16.6
Successfully installed numpy-1.23.4

ImportError: cannot import name 'PROTOCOL_TLS' from 'urllib3.util.ssl_' (C:\Users\good_\anaconda3\envs\py39\lib\site-packages\urllib3\util\ssl_.py)
Successfully uninstalled urllib3-1.22
Successfully installed urllib3-1.26.12

pip install datasets
最初からこれでよかったんじゃw

RuntimeError:
        An attempt has been made to start a new process before the
        current process has finished its bootstrapping phase.

        This probably means that you are not using fork to start your
        child processes and you have forgotten to use the proper idiom
        in the main module:

            if __name__ == '__main__':
                freeze_support()
                ...

        The "freeze_support()" line can be omitted if the program
        is not going to be frozen to produce an executable.
DBキャッシュで処理速度を上げる(SPSS Modeler データ加工逆引き9-7)

# DBキャッシュで処理速度を上げる

![スクリーンショット 2022-10-19 17.56.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/1f1ccae6-318d-7d12-5c07-e372f2bd9269.png)

## 1.想定される利用目的

・大規模なデータベースを入力にした際のデータ加工速度の向上


## 2.サンプルストリームのダウンロード

https://github.com/yoichiro0903n/blue/blob/main/cache.str?raw=true

ストリームは逆引き9-5と同じものです。DB入力ノードは個別に設定ください。
この記事は逆引き9-5と9-6を組み合わせた利用方法です。そちらを先に参照ください。

## 3.サンプルストリームの説明

![スクリーンショット 2022-10-19 15.12.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/834eae85-aa79-27b4-3877-1770665f4ad8.png)

a.入力するデータのひとつ目です。6種類のカテゴリーと値が100万レコード（行）生成されます。
![スクリーンショット 2022-10-18 10.05.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/be9fdbf2-f656-cdca-ac85-3bf8928124e4.png)

DB接続は以下の記事を参考にしてください。

https://qiita.com/416nishimaki/items/ee13873b9d78268d648a

b.入力ふたつ目はカテゴリの重みマスタです。
![スクリーンショット 2022-10-18 10.06.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/957618b4-011f-a7b0-c8a1-9cc041ec16cb.png)

c.[レコード結合]ノードを編集します。ふたつの入力データを[Cate]をキーに内部結合します。
![スクリーンショット 2022-10-18 10.07.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/1a3c6f16-6330-05c3-12b3-878b0a4fc158.png)

d.[フィールド作成]ノードを編集します。値に重みを掛けます。
![スクリーンショット 2022-10-18 10.07.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/099d9a89-954a-f054-5098-f7286679d3cf.png)

e.[レコード集計]ノードを編集します。
![スクリーンショット 2022-10-18 10.08.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/f22d1524-3080-6a86-882f-9680d9b49ba9.png)


[レコード集計]ノード上で右クリックし[キャッシュ]＞[使用する]を選択します。
![スクリーンショット 2022-10-19 18.08.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/9230edf3-3204-7921-d60b-d25fcd5d0602.png)

[レコード集計]ノードにバッジが付与されました。
![スクリーンショット 2022-10-19 18.08.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/dd85f61f-5c92-da3a-bcba-afe657e3f20a.png)

f.[テーブル]を実行します。バッジが四角からDBマークに切り替わり緑に点灯しました。入力で利用した２つのテーブルを結合・加工した上でDB内に1時的なテーブルを作成（DBキャッシュ）したことを意味します。後続の処理はレコード集計を基点にするだけでなくSQLプッシュバックが有効になります。
![スクリーンショット 2022-10-19 18.09.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/8560245c-1a98-ab4c-bd24-324af51a3cd3.png)

#### 注意事項

DB内に一時的なテーブルを作らせたくない場合にはストリームのプロパティの設定で以下をオフにします。
![スクリーンショット 2022-10-19 18.20.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/35cdc431-89c3-6ae0-3325-f1685f61521a.png)


## 4.参考情報

#### DBキャッシュを解説した記事

https://qiita.com/kawada2017/items/ea4f0e1b068c9bb152e5

#### SPSS Modeler ノードリファレンス目次

https://qiita.com/416nishimaki/private/503037195081d3323eee

#### SPSS Modeler 逆引きストリーム集（データ加工）

https://qiita.com/416nishimaki/private/4bf813e6cba84b2a1008
Spotifyのデスクトップアプリに足りない機能をタスクトレイアプリで補完してみた

# 概要
Spotify、便利ですよね
私も在宅勤務中ずっと聴いています。
ただ、使っていて不便に思う部分があったので自作アプリを作成しました。
コードは[Github](https://github.com/bitte8565/big-tray-star)にあります

# 機能概要
* spotifyでフォロー中しているアーティストの新曲を通知する
* spotifyで現在再生している曲をプレイリストに登録する（履歴用）
* 他人が作成したプレイリストが更新されたら通知する
* spotifyで再生数上位の曲をプレイリストに登録する
* 再生中の曲をブラウザでGoogle検索する

# 実行環境等
* windows10
* Python3.10
* Spotify API
* AWS Dynamodb
* AWS Systems Manager パラメータストア
パラメータストアは機密情報の取得に使っているだけです。

# 機能説明
以下、各機能の説明です。

## タスクトレイ
アプリ実行中はタスクトレイにアイコンが表示されます。
手動操作の機能は右クリックメニューから実行します。


## spotifyでフォロー中しているアーティストの新曲を通知する
アーティストをフォローしていても新曲が追加されたことに気が付かないことが多かったので作成しました。
通知先は個人用のDiscordサーバーです。
一定間隔で自動実行するようにしています。

## spotifyで現在再生している曲をプレイリストに登録する（履歴用）
Spotifyの履歴は50曲しか保存されないようです。プレイリストには1万曲まで追加できるので再生した曲を全部プレイリストに自動追加して擬似的な再生履歴を作成しました。
Spotifyのプレイリストは同じ曲を複数入れることができますが、今回は重複しないようにしました。
なので正確には再生したことのある曲リストが出来上がります。

参考にした記事
https://qiita.com/qope/items/332a250f8dc6dc6f10d1

## 他人が作成したプレイリストが更新されたら通知する
継続的に更新してくれている公開プレイリスト、自分でプレイリストを作ったり更新したりする手間が省けてありがたいですよね。メンテナーの方に感謝です。
ただ、新規に追加された曲は一番下に追加され特に通知もないので更新があっても気づく手段がなく不便でした。
通知先は個人用のDiscordサーバーです。
一定間隔で自動実行するようにしています。

## spotifyで再生数上位の曲をプレイリストに登録する
よく聞く曲をプレイリストにしたかったので作成しました。
APIの仕様で再生回数は取得できないので短期、中期、長期で`top_tracks`取得してそれぞれのプレイリストにしています
```python
    time_ranges = [{'term': 'short_term', 'playlist_id': short_term_rank_playlist_id},
                   {'term': 'medium_term', 'playlist_id': medium_term_rank_playlist_id},
                   {'term': 'long_term', 'playlist_id': long_term_rank_playlist_id}]

    for time_range in time_ranges:
        top_tracks = sp.current_user_top_tracks(limit=20, offset=0, time_range=time_range['term'])

        urls = []
        for track in top_tracks['items']:
            urls.append(track['id'])

        playlist_id = time_range['playlist_id']
        clear_playlist(playlist_id)
        sp.playlist_add_items(playlist_id, urls)
```

## 再生中の曲をブラウザでGoogle検索する
Spotifyのデスクトップアプリはコピペができないので曲の詳細を検索しようにも曲名を手打ちする必要がありました。
タスクトレイのメニューから現在再生中の曲名をGoogle検索し、ブラウザを開く機能を作りました。
```python
def search_current_playing():
    # 現在再生中の曲を取得する
    current_playing = sp.current_user_playing_track()
    if current_playing is None:
        return

    # 検索文字列作成
    track_name = current_playing['item']['name']
    artist = current_playing['item']['artists'][0]['name']
    search_params = ' '.join([track_name, artist])

    # URL作成
    url = "https://www.google.com/search"
    params = urllib.parse.urlencode({"query": search_params})
    search_url = f'{url}?{params}'

    # ブラウザで検索する
    webbrowser.open(search_url)
```

# おわりに
思いつく範囲で追加機能を作成しましたが、今後もなにかあれば追加していく予定です。
簡単 Elixirシリーズ ~ 発表順を決める簡単なお仕事 ~ 

この記事は「[Elixir Advent Calendar 2022](https://qiita.com/advent-calendar/2022/elixir)」4日目の記事です

東京にいるけどfukuokaexのYOSUKEです。

簡単 Elixirシリーズでは小ネタをサクッと書いていこう。というコンセプトで作っていきます。

仕事柄、発表順を決めるという機会が多く、いつもネタでスプレッドシートを使った簡単なあみだくじで決めているのですが、Elixirで簡単に決めるプログラムを考えてみよう。という小ネタ

例えば、a,b,cの3つのチームの発表順を決めたい。
ランダムに数値とのセットを作って数値が大きい準に発表順にしましょう。とした場合

```elixir
iex> list = ["a", "b", "c"]
["a", "b", "c"]
iex> Enum.map(list, fn x -> {x, :rand.uniform 10} end )
[{"a", 3}, {"b", 10}, {"c", 1}]
```

とりあえず、こんな感じでサクッと決めるのも良いかもしれない。
ただし、これだと同じ数字が被る場合もあるのでその課題を解決したいです。それはまた今度気が向いた時に！ w
Error: package.json in functions directory has an engines field which is unsupported. Valid choices are: {"node": 10|12|14|16}

# 概要

タイトルにあるエラーが発生したので経緯と対応の記録を行う

# 経緯

久しぶりにfirebaseのプロジェクトをデバッグしようとしたらエラーになり起動しなかった

# 調査

cloudfunctionsに関するエラーですね（エラー文読めばわかる）

ざっくり解決方針は次の２通りのよう
- firebase CLIのダウングレード
    - https://stackoverflow.com/questions/65316988/firebase-cli-deploy-error-deploys-to-runtimes-below-node-js-10-are-now-disable
- nodeのアップグレード
    - https://qiita.com/iron-samurai/items/833c86f956f10a7ea765

特にこだわりはないのでnodeのアップグレードで対応する

# やったこと

## 下記をコマンドをプロジェクトのルートディレクトリで実行
`npm install -g firebase-tools `

## functions/firebase.jsonの書き換え
```
{
  "name": "functions",
  "description": "Cloud Functions for Firebase",
  "scripts": {

  },
  "engines": {
    "node":"12"
  },
  "dependencies": {

  },
  "devDependencies": {

  },
  "private": true
}
```

`node`のところを8 &rarr; 12 に変更

> 参考はこちら
https://qiita.com/iron-samurai/items/833c86f956f10a7ea765

## firebase serve を実行

下記警告が出たが一旦ローカルで実行できるようになった。目的達成。
```
⬢  functions: Failed to load function definition from source: FirebaseError: Error parsing triggers: Cannot find module 'firebase-functions'

Try running "npm install" in your functions directory before deploying.
```

## ついでに警告に従う

### functionsでnpm installの実行をする。

またしても警告
```
⬢  functions: Failed to load function definition from source: FirebaseError: Error parsing triggers: Cannot find module
```

手動かどうかわからないですが、モジュールを削除してしまっているらしい。

少し考えてわかりましたが、git ignoreファイルで指定したものだったので後で移動しておきます
// TODO:移動できたらここに結果を追記する
変数、関数の名付けについて

英語に自信がないのなら変数や関数は日本語にしよう！

圧倒的に日本語の方が語彙力が多いのは確かです。
変数が日本語だと文章を読むようにコードを読めます。
また説明のコメントも減ります！

変数名はとても大事です。誰もが言います
私たちはコードを書くとき、日本語で思考してます。
意味付け、他人がコードを読む時の理解、見返す時の理解など。

pythonの変数は初学者なら、なるべく日本語で書くようにしましょう。
数字を表すiやjなどは英語を使いますが
外国の人が読めない、あとは文字コードのエラーに対応できないなどは懸念点ですが、
始めたては日本語変数、関数をお勧めします。

最初の記事なのでここまでにします。失礼しました。
WordPressテーマをGit Hubにpushするまで

表題の通り、WordPressテーマをGit Hubにpushするまでの手順メモです。

# 手順

１．
インストール。Windowsは以下から。

https://gitforwindows.org/

２．
初期設定
~~~
git config --global user.name "your_user_name"
git config --global user.email your_email
git config --global core.editor "code --wait"
~~~

３．
管理したいところにcdして、git ininする。
私は今回はwordpressプロジェクトの一番上にしました。wp-admin, wp-content, wp-includesたちと.gitフォルダが同じ階層に並んでる感じです。ググった感じ、wpだとテーマフォルダごとにgit管理する派閥の方と、一番上に置く派の方がいるらしい。
~~~
git init
~~~

４．
.gitignoreファイルをつくる。
私は今回特定テーマ（myblog）だけ管理したかったので、gitinitした階層直下に、以下のようにつくりました。
~~~
/*
!.gitignore
!/wp-content/
/wp-content/*
!/wp-content/themes/
/wp-content/themes/*
!/wp-content/themes/myblog/
~~~

５．
add, commitする

６．
githubでリモートリポジトリ作成する　→URLコピー

７．
以下コマンドで、originという名前でリモートリポジトリ登録
~~~
git remote add origin your_repos_url
~~~

８．
以下コマンドでプッシュ　-uを付けとくとプッシュ先が保存されて、次回以降git pushだけ入力すればよくなる。コマンドたたくとログインのために勝手にブラウザ立ち上がって、ログイン完了後プッシュされる。
~~~
git push -u origin master
~~~

おわ！



# 参考
https://qiita.com/takeo-asai/items/9bc7e25cd94cd8c9adee

https://axel-media.com/topics/1521/

https://qiita.com/yukibe/items/9ef9d54f2e7d53cfb51c
ShaderGraphで作成したシェーダの透明度がUIに反映されない件

# 現象
Shader Graphで作成したシェーダをUIに適用すると、本来アルファで抜ける部分が真っ黒になってしまいます。
左がマテリアル未指定で正常に描画されているスプライト、
右がシェーダを適用して、抜き部分が黒くなってしまったスプライトです。
<img width="640" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/85432/7d381e84-0bf5-43b9-c761-ec276e4f336f.png">
このような最小限の内容でも確認できます。
<img width="640" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/85432/dbec59b9-2332-9ee6-a113-696bbe845182.png">

# 理由と対策
CanvasのRender ModeがOverlayになっていると透明度が反映されなくなります。
Screen Space - Camera で描画カメラを指定することで期待通りの結果が得られるようになります。
<img width="640" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/85432/f781c91d-4ff3-0124-84ca-a05c8a5f9d38.png">

# 原因
Shader Graphが生成するシェーダコードにはuGUIが必要とする機能の一部が含まれていません。出力させるオプションも存在しません。
半透明の問題ばかりではなく、実はマスクも機能しません。
こちらはShader Graphが生成したシェーダコードに自前でステンシルの指定を書き加える必要があります。

つまり、Shader Graphは本来uGUI未対応です。
2022年10月現在、これは残念ながらUnityの仕様ということのようです。

https://forum.unity.com/threads/shader-graph-ui-image-shader-does-not-work.1202461/

ユーザーからの改善投票は続いていますので、どこかで対応されることを祈りましょう。
それまではUI用に別途カメラを設けることをお勧めします。
Apacheとは

前提条件
.Webアプリを開発し、誰もが使える状態にすることを目的とする
.開発環境、Web構造（ざっくり３層構造のクライアント、Webサーバー.APサーバー.データベースサーバー）
.サーバーにデプロイするために開発する必要があり、それがあることが前提であること（意識しなくてもまぁ良いことは良い）
.サーバーに関する知識←←

→Apacheとは
.Apacheソフトウェア財団によって開発されたOSSのこと
.Webサーバソフトウェアの一つ
>OSSとは...オープンソースソフトウェアの略称
          ソースコードが公開されていて無償で使用できるソフトウェア

→Apacheの役割
・Webサーバソフトウェアの一つ。
>Webサーバソフトウェアについて...
・Webサーバとは、Webページを表示させるために必要なデータの保管場所で、そのデータを送受信することができる。
・サーバの種類について
ハードウェア　と　ソフトウェア　　の２種類が存在する
　→ハードウェアはソフトウェアやデータベースを格納する。
　『超ハイスペコンピュータ』のこと
　→ソフトウェアはWebサーバ、データベースサーバ、メールサーバ。ファイルサーバなどデータを保管する場所のことで、正しく処理するためのプログラムを指す。『サーバOS』と呼ばれることもある
サーバー機能を提供するソフトウェアのこと
・サーバーについて
そもそもサーバーという名の機器は無く、
　＊コンピューター（ハードウェア）のサーバーについては、『サーバーコンピューター』『サーバーウェア』と呼ばれる
　＊ソフトウェアのサーバーについては、『サーバーソフト』『サーバーウェア』と呼ぶ
https://www.acrovision.jp/tech/?p=403

・モジュールを使った機能拡張がある。
→120種類以上がリリースされている
→モジュール名は「mod_拡張対象となる機能」と言った書式で記載される

・PHPとの相性
→PHPよはWEBサイトの開発で使われるバックエンドのプログラミング言語であり、サーバー上で動作という点がApacheとの共通点である。そのためApacheにPHPをインストールすることが多々ある。
PHP自体もApache上での開発を可能にするので、Apache関数というのが存在する

・Apacheの特徴とメリット
→OSを選ばずに動作する。
→→アプリケーションやシステムによってはOSの種類で不具合が生じることがあるが、Apacheは複数のOSで動作するので汎用性が高い

→オープンソースなので無償で使用可能＊（深掘りしたい。）
→→サーバーのレンタルやドメインの取得には費用が発生するが、ホームページやブログの解説をしたいケースにおいては最適である

→処理速度が早い
→→HPの表示や動的コンテンツのだおうさがスムーズに処理できるので、規模の大きいサイトでも快適に動作を実現しやすい。かつPHPやデータベースとの連携もしやすく、CMsを動かすのが容易
>CMSとは
Webサイト運営に係るコストと時間を削減できるツール
役割→専門的知識がなくても、コーディングが不要で、サイトのコンテンツを保存し、管理マネジメントをする。


→機能が豊富
→→オフィシャルで公開されているものをはじめ、ユーザーが独自で開発したものも少なくない
必要な機能を自由に搭載できるカスタマイズ性も優れている点だ
動作の安定性やセキュリティ性の高さなども利点である
技術情報が多いので習得しやすい

・デメリット
→複数のデータ処理を実行すると、動作が重くなりがちである
→→「C10K問題」（クライアント1万台問題）...同時接続するクライアント多すぎてサーバーパンクした事例
→→→メモリ上でプログラムに与えられる「プロセス番号」は符号付き１６ビット整数と決まっている。つまり1〜３２７６７までの番号がう割り当てられるので、一つのリクエストに足して、1つのプロセスを生成するサーバーだと、約3リクエストが最大の同時接続であるとのこと
ハードウェアの性能上で問題がなくても、アーキテクチャ（設計）によってはソフトウェアの上限値が引っかかるっちゅうこと

→つまり同時接続が多くなると想定される場合は不向きではある
→サポートや保証が存在しない
→→技術的な問題はリソースが多い分対処はしやすいだろう

・どんな用途に向いているのか？
→個人サイトや企業ブログのように、あらゆるサイトを開発するというようにオールマイティに対応するときに

❌SNSとかみたいに同時アクセスが多くなると想定される場合は向いていない
メモ：Markdownで数式の `_` を消させない方法

Markdownパーサーが MathJaxとかKatexの `_` を `<em> </em>` に変換しちゃう問題

正規表現で `\W_\S.*\S_\W` の条件に当てはまると変換されちゃう。

[MD037](https://github.com/DavidAnson/markdownlint/blob/v0.26.2/doc/Rules.md#md037) に意図的に違反することで回避できる（斜体にすることを意図していないから違反ではない？）
`_` の前後どちらかにスペースを入れるだけでいいが、MathJaxとかKatex側でWarningが出るかも？

$\text{a}_{bcd}$ と $\text{e}_{fgh}$ だとダメ
`$\text{a}_{bcd}$ と $\text{e}_{fgh}$ だとダメ`

$\text{a} _{bcd}$ スペースが一か所だと $\text{e}_{fgh}$ ダメ
`$\text{a} _{bcd}$ スペースが一か所だと $\text{e}_{fgh}$ ダメ`

$\text{a}_ {bcd}$ スペースが一か所だと $\text{e}_{fgh}$ だとダメ $\text{i}_{jkl}$ な場合が
`$\text{a}_ {bcd}$ スペースが一か所だと $\text{e}_{fgh}$ だとダメ $\text{i}_{jkl}$ な場合が`

$\text{a} _{bcd}$ スペースが前後同じ片側に入ってれば $\text{e} _{fgh}$ OK
`$\text{a} _{bcd}$ スペースが前後同じ片側に入ってれば $\text{e} _{fgh}$ OK`

$\text{a}_ {bcd}$ スペースが前後同じ片側に入ってれば $\text{e}_ {fgh}$ OK
`$\text{a}_ {bcd}$ スペースが前後同じ片側に入ってれば $\text{e}_ {fgh}$ OK`

$+_a$ と $b_-$ とかでも変換されちゃう
`$+_a$ と $b_-$ とかでも変換されちゃう`

マッチ条件が `\s_\S.*\S_\s` になってほしい...
SMTPとPOP３

# メールサービスを提供するサーバー
### SMTPサーバー
送信に使用する。

### POP３サーバー
受信に使用される。

# SMTPサーバーが利用するプロトコル
SMTP(Simple Mail Transfer Protocol)というプロトコルを利用してメールを送信するサーバー

### SMTPサーバーの動き
* メールソフトからメールを受け取ると、宛先メールの@より後ろに記述されいるドメイン名を見て、そのドメイン名のSMTPサーバーを探す。
* DNSによってそのドメイン名のSMTPサーバーのIPアドレスが分かったら、そのIPアドレスに対してメールデータを送信する。
* メールデータを受け取った宛先側のSMTPサーバーは宛先メールアドレスの@より前に記述されているユーザー名を見てユーザーごとに用意されているストレージ領域「メールボックス」にメールデータを格納する。

### 注意点
SMTPは宛先のサーバーのストレージ領域に届いているだけでメールデータが届いていたわけではありません。

# POP3サーバーが利用するプロトコル
メールをくださいとリクエストを受け取ると、POP3(Post Office Protocol version 3)というプロトコルを利用している。

### POP3サーバーの動き
電源がオンになっていて、かつ欲しい時にだけメールボックスのメールデータをダウンロードする「プル型」のプロトコルである。

# 出典
https://www.sbcr.jp/product/4797386660/

# OP25Bとサブミッションポート
日本で提供されている大部分のインターネット接続サービスでは、その接続　しているISPのネットワーク外にあるメールサーバーに対して２５番ポートで接続することを禁止している。

# 出典
https://www.sbcr.jp/product/4797386677/
MacOS venturaで公開鍵認証できなくなった

Venturaにアップデート後にsshしようとしたところ、公開鍵認証できてたサイトに入れなくなった。

```
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
```

とりあえず.ssh/known_hostsから対象のサイトのキーを削除で、パスワードでログイン。

調べてみるとデフォルトのアルゴリズムが変わったことによるものみたい。
ただキーを作り直すのは避けたいので、.ssh/config冒頭に

```
HostkeyAlgorithms +ssh-rsa
PubkeyAcceptedAlgorithms +ssh-rsa
```
を付けることを事なきを得た。

参考
https://superuser.com/questions/1749364/git-ssh-permission-denied-in-macos-13-ventura
ARMテンプレート

●ARMテンプレートのメリット
・エラーの軽減
・一貫性のあるデプロイの実現
・再利用性の向上
・複数のデプロイの自動化(オーケストレーション)

●ARMテンプレートの構造
JSON形式で記述。

■$schemaセクション（必須）
テンプレート言語のバージョンが記述されたJSONスキーマファイルの場所を指定するセクション。

■contentVersionセクション（必須）
テンプレートのバージョンを記述するセクション。

■parametersセクション
リソースをデプロイするときにユーザーが入力可能なパラメータを指定できる。

parametersセクションの主な要素
・type パラメータのデータ型(必須要素)。指定可能な方はstring,securestring,int,bool,object,secureObject,arrayのいずれか
・defaultValue 値が指定されない場合のパラメータの規定値
・allowedValues ユーザーが選択可能な値の配列。指定された値以外は許容されない
・minValue int型の値における最小値
・maxValue int型の値における最大値
・description ユーザに表示されるパラメータの説明

■variablesセクション
テンプレートないで使用する値を変数として定義できる。必須ではないが、このセクションで変数を定義することによって複雑な式が減り、テンプレートのわかりやすさが向上する。

■resouceセクション（必須）
デプロイまたはリソースを定義する。

■outputsセクション
デプロイによって返される値を指定する。

●テンプレートからのデプロイ結果確認
ログインユーザーのみコメント/投稿ができる機能を実装

### 前提条件

ログインしたユーザーのみがコメント/投稿できるように制限をかけてみたいと思います。

♦︎投稿機能、コメント機能、ユーザー機能が実装済みである
♦︎Gem 'devise'を導入している
上記を前提条件として記述していきます！

### ポイントは"user_signed_in?"メソッド

user_signed_in?メソッドとはなんぞや。まあ読んだままのメソッドで、
ユーザーがサインインしているかどうか判定してくれます。
ヘルパーメソッドの一種ですが、こちらは前提条件で示しているように、
deviseを導入していることで使えます。
※もしuserではなくて、customerやmemberを使用している場合は
それぞれの仕様に書き換えてください。

### コントローラーを書き換える

```ruby:app/controllers/comments_controller.rb
def create
    if user_signed_in? ①
      post = Post.find(params[:post_id])
      comment = current_user.comments.new(comment_params)
      comment.post_id = post.id
      comment.save
      redirect_to post_path(post)
    else　②
      flash[:notice]="ログインが必要です"
      redirect_to new_user_session_path
    end
  end
```
①ここのif文を用いて条件分岐をさせることにより
ログインしているユーザーとしていないユーザーの仕様を分けます。
コメントする先の投稿を見つけてきて、current_user=ログインしているユーザーなら、
コメントidと投稿のidを紐づかせてsaveしますというコードです。

②else=もしログインしていないユーザーなら、コメントするにはログインが必要なので
redirect_to でログイン先に遷移させます。
この遷移先はそれぞれのルーティングを見てログイン先のパスを記述してください。

### コメント欄のview

```ruby:app/views/comments/form.html.rb
<%= form_with model: [post, comment], local:false do |f| %>
    <%= f.text_area :content, placeholder: 'コメントをここに' %>
    <%= f.submit "コメントする" %>
<% end %>
```
シンプルなのであくまで参考で！
この"：content"はそれぞれに設定してあるカラムを参照してください。

これでこの"コメントする"ボタンを押せば、
ログインしていないユーザーはログインへのパスをコントローラーに記述したし、
ログインページに遷移されるはず！と思って試したら、
コメントはできないけれど、ログインページにも遷移されませんでした。
え、なぜだ、、？としばらく考えた結果。原因はこれでした。

```ruby:app/controllers/comments_controller.rb
before_action :authenticate_user!
```

コントローラーの一番上に記述していたこの一文。
このbefore_action :authenticate_user!は、コントローラーの先頭に記載することで、
そこで行われる処理はログインユーザーのみが実行可能になる、というメソッドです。
ちなみにこちらもdeviseを導入することで使えるようになるヘルパーメソッドなので、
user_signed_in?メソッドとは兄弟のような関係でしょうか？

これを記述していたことにより、ログインしていない状態だと
そもそもcreateアクションにもいかないわけです。
つまりは先ほどつらつら書いたcreateアクションの条件分岐も無かったことになり、
そのため遷移もされずコメントもされないという無の状態が生まれていました。

この"before_action :authenticate_user!"を消すと、
ログインしていない状態でコメントボタンをクリックするとログイン画面
遷移させることができました！

### 投稿機能編

ちなみに投稿機能の制限もこのコメント機能を参照にすれば実装できます。
```ruby:app/controllers/posts_controller.rb
def new
    if user_signed_in?
      @post = Post.new
    else
      flash[:notice]="ログインが必要です"
      redirect_to new_user_session_path
    end
  end
```
私の場合は投稿しようとした時点で、ログイン画面に遷移させたいため、
newアクションに条件分岐を使用し定義しています。

```ruby:app/views/posts/new.html.rb
<div class="postnew">
   <%= link_to "投稿", new_post_path %>
   <% if current_user == nil %> ①
     <p>投稿には<%= link_to "ログイン", new_user_session_path %>が必要です</p>
   <% end %>
</div>
```

①もし"current_user == nil"（ログインしているユーザーがnil=空）なら
ログインページに遷移するよう記述しています。
これで投稿機能もログインの有無で仕様を分けることができます。

※ちなみにpostsコントローラーは"before_action :authenticate_user!"メソッドを
使用しないと、編集も投稿もなんでもありになってしまい大変なので、
onlyを使用し実行可能なアクションを指定すると良いです。

```ruby:app/controllers/posts_controller.rb
before_action :authenticate_user!, only: [:edit, :update]
```

例えば上記のように記述すると、編集と更新はログインユーザーのみ実行可能ですが、
その他の一覧（index）や詳細(show)はログインなしでも実行可能です。
自分の機能に合った記述をするといいかと思います！
ReactでError Too many re-renders. React limits the number of renders to prevent an infinite loop.が出た時の対処方法

# エラーの背景
次はカウントが５の倍数になったら笑顔マークが出る処理にしていきます。

```App.jsx
//省略
const App = () => {
  const [count, setCount] = useState(0); //[]で配列の分割代入　1つ目はstateとして使う変数名　2つ目はそのstateを変更するための関数 0で初期値を設定
  const [smileFace, setSmileFace] = useState(true); //smileの関数　レンダリングの処理

  const clickPlus = () => {
    //setCount(100); //プラスボタンを押すと100になる
    setCount(count + 1); //プラスボタンを押すと+1
  };


const clickSwitchSmileFace = () => {
    setSmileFace(!smileFace);
  };

  if (count % 5 === 0) {
    setSmileFace(true);
  } else {
    setSmileFace(false);
  }

//省略
```
すると
```
Error
Too many re-renders. React limits the number of renders to prevent an infinite loop.
```

```index.js
6 > ReactDom.render(<App />, document.getElementById("root")); //レンダリング //rootはindex.htmlの<div id="root"></div>
```

のようなエラーが出てきました。
これは***コンポーネント内で再レンダリングが起きすぎている***というエラーです。
これはstateを変更していきます。


# 解決法
論理演算子を入れてレンダリングしすぎないようにしました。

```App.jsx
const clickSwitchSmileFace = () => {
    setSmileFace(!smileFace);
  };

  if (count % 5 === 0) {
    smileFace|| setSmileFace(true);  //smileFaceがfalseなら右のtrueを返す
  } else {
    smileFace && setSmileFace(false);　//smileFaceがtrueなら右のfalseを返す
  }
```

# 資料

https://www.udemy.com/course/modern_javascipt_react_beginner/
【小ネタ】PostgreSQLのSQL/コマンドメモ書き

# 背景・目的
コマンドやSQLを忘れがちなので、メモします。今後、必要に応じて追加していく予定です。

# コマンド/SQL
## SQLクライアントを使用した接続
```
psql -h ホスト名 -d データベース名 -p DBポート番号 -U ユーザ名
```
## スキーマ作成
```
CREATE SCHEMA スキーマ名;
```
## テーブル
### テーブル作成
```
CREATE TABLE スキーマ名.テーブル名(
id VARCHAR(64)
,year INT
,month INT
,day INT
,PRIMARY KEY(id)
);

```

###  テーブル定義を確認
```
select table_catalog ,table_schema , table_name,ordinal_position,column_name,is_nullable,data_type,character_maximum_length from information_schema.columns where table_name='テーブル名' order by ordinal_position;

  table_catalog   | table_schema  | table_name | ordinal_position |    column_name     | is_nullable |          data_type          | character_maximum_length
------------------+---------------+------------+------------------+--------------------+-------------+-----------------------------+--------------------------
 データベース名      | スキーマ名      |　　テーブル名   |                1 | id                 | YES         | character varying           |                       64
 データベース名      | スキーマ名      | テーブル名   |                2 | year               | YES         | integer                     |
 データベース名      | スキーマ名      | テーブル名   |                3 | month              | YES         | integer                     |
 データベース名      | スキーマ名      | テーブル名   |                4 | day                | YES         | integer                     |

(4 rows)
```

## インデックス
### インデックス作成
```
CREATE INDEX インデックス名 ON スキーマ名.テーブル名 (year,month,day);
```

### インデックスの一覧確認
```
select schemaname,tablename,indexname from pg_indexes where tablename='テーブル名';

  schemaname   | tablename  |    indexname
---------------+------------+------------------
 スキーマ名      | テーブル名   | インデックス名

(1 rows)

```

## データのロード
### コマンドから
複数ファイルある場合にワンライナーで実行する。
```
for i in `seq 0 10`;do psql -d データベース名 -U ユーザ名 -c "\copy スキーマ名.テーブル名 from /home/XXXXXXX/000"$i"_part_00  delimiter '|' csv" -h DBホスト名 -p DBポート番号;done

```

## 時間計測
```
 \timing
Timing is on.
```
上級者を目指すExcelVBA #5 『読みやすいコードを心がける』

プログラミングにおいて、綺麗で読みやすいコードを書くことは非常に大事です。
「今動けば良いや」と適当にコードを書いた場合、1か月後に読み直すとさっぱり意味不明なことが多いです。

改修の手間やバグを減らすためにも、読みやすい綺麗なコードを心がけましょう。

### インデント

VBAは自動インデント（タブ）が挿入されないため、慣れるまではインデントせずに書いてしまいがちです。
<img src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200881/e53239a7-6073-ba33-795b-e918f742a036.png" width = "838" />

以下のようにきっちりタブを入れることを心がけましょう。
<img src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200881/30b6f59a-7847-7e42-33c9-7bcff7a34d75.png" />


### コメント（関数）

コメントも非常に大事です。
コメントを読むだけで処理内容が理解できるようにしておきます。

まず、関数上部にはその関数でやっている処理の概要を記述します。
引数、戻り値なども記載しておきましょう。

<img src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200881/30b6f59a-7847-7e42-33c9-7bcff7a34d75.png" />

引数、戻り値は@params、@returnなどで記載しても良いかと思いますが、私は分かりやすさ重視のためにこのように日本語で書いています。

関数内部にもコメントを適宜記載します。
ただし、極論的には関数内部にコメントがなくても処理概要が理解できるぐらいシンプルに処理を書くのが理想です。

　
### コメント（モジュール上部）

モジュール上部のコメントには、そのモジュールでやっている処理の概要を記述します。
コメントだけで全体像が理解できるようにしておきます。

また、他モジュールから呼び出せるグローバル関数には番号を振って索引を書いておきます。
こうすることで、関数が増えてきた際にも迷子になりません。

<img src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200881/d1094e19-d029-5db4-15a6-92fedc237eb8.png" width = "581" />


### 分かりやすい名前を付ける

モジュール、関数は適切に分割し、分かりやすい名前を付けます。

関数名や変数名の付け方も非常に大事です。
一貫性のあるネーミングルールを使いましょう。これについては別記事で説明します。
　

### 1行の処理はできるだけシンプルに

1つの行が長くなりすぎるようなコードもNGです。
1行の処理が複雑になりすぎた場合、複数行に分割して各行にコメントを付けてやります。

常にシンプルにコードを書くのが理想です。

　
### まとめ

保守の観点から考えると、処理内容は一目見ただけで分かるようにするのが理想です。

常に保守のことを考えてコードを書くように心掛けましょう。

:::note info
<strong>まとめ</strong>
・インデントを丁寧に付ける
・関数、モジュールには処理概要のコメントを付ける
・コードは適切に分割し、分かりやすい名前を付ける
・1行の処理は出来るだけシンプルに
:::
【ポエム】レガシィPHPの中でも生き残る

先日行われたカンファレンスでは相変わらず「[静的解析をCIに取り入れてみました！」や「レガシィシステム改善してるぜ！」というようなキラキラした発表が多かったように感じます（カンファレンスというのはそういう場なのでそれはそう）。少し前のPHPerKaigiを含めマイクロサービスやモジュラモノリスのようなアーキテクチャの話やフィーチャートグルでシステムを安定させるようなマクロ的話も印象的でした。

しかしながらリアルワールドなPHPの現場には未だにレガシーな環境も数多く存在することは言うまでもなくまた事実。
PHPConference2022の[『PHPの今とこれから』](https://fortee.jp/phpcon-2022/proposal/e67d6f03-ecc5-4fc8-a794-db8097b645af)という発表恒例のアンケートでははとっくにEOLを過ぎているPHP5系のシェアが少なくなったものの、未だに20％以上を占めているということからも、様々なしがらみからバージョンアップができずにレガシー化しているプロジェクトがまだまだ相当数あるのだなぁということが感じられました。

そして自分もどちらかといえばそういった「脈々と受け継がれてきた秘伝のソース」みたいな現場での経験が比較的多く、composerはもちろん自動テストも無ければ静的解析もできないし、PhpStormが会社から支給されるなんて夢のまた夢...みたいな状況下でifとforがもはや何十か数えることもできないくらいにネストしたソースコードに更にfor文とif文での制御を足すようなコーディングをしながら、そのあまりの認知負荷の高さに「やはり自分には向いていなかったかもしれない...」と転職したことを後悔した時期もありました。

ただ、そんな中でも折れずに今日までやってこれたのは転職前に未経験の自分に対して実務案件を通して色々教えてくれたプログラミング大好きな某ベンチャーの社長さんや、新卒でも育成枠でもないような中年の転職組の自分にも色々と教えてくださったPHPコミュニティの皆様のおかげだと思っています。

そしてレガシィシステムの開発に携わる中で「なぜこんなにもバグが多いんだろう？」「なぜこのソースはこんなにもぐちゃぐちゃになってしまうんだろう？」という疑問に対して「きっと知っている人がいるはず...！」とコミュニティの皆さんに聞きまくり、書籍を読み漁った結果[先日のQiita記事に書いたような本達](https://qiita.com/tak121/items/fc0e9719fe6d9998c842)に出会うことができ、そして現場の泥臭いコードをローカル環境でこねくり回しながらどうすればこの状況防げたのか？どうすれば改善できるのか？というところを苦しみながらも考えてきた結果、転職してからわずか2年間の間にとても多くのことを学んだ気がします。

もしこの記事を見ていただいた方の中に自分と同じようにレガシィ案件の中で苦しい思いをしている人がいたら是非コミュニティの皆さんから頂いた言葉を繋いであげたいと思っています。

__どんな案件であってもやりようはある、あなたが品質の高い、良いコードを書くことは誰にも止められないのだから
あなたの考え方は間違っていない、正気を保てなくなりそうになったらいつでもコミュニティに来たらいい__

例え所属しているチームや会社の中では1人であっても、コミュニティにはあなたと志をともにする仲間がたくさんいます。
まだ勉強会やカンファレンスなどのコミュニティイベントに参加したことのない方は是非勇気を出して一度顔を出してみてください、きっと新しい世界が広がります。

_Where there is a will, There's always a way._
[Vue3/Nuxt] jsonファイルからデータを受け取る方法

※初学者の投稿です。

バックエンドがまだ出来上がっていない時にjsonに仮データを作り、表示させる方法。

【jsonファイル】
![スクリーンショット 2022-10-25 22.57.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2931766/3b2591fb-93f9-2d84-8e56-0cdea9195552.png)

【表示させるコンポーネント】
![スクリーンショット 2022-10-25 23.07.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2931766/8b7ca05c-4c66-6153-50de-8cbae91cdbbe.png)

①【jsonファイル】のようにテストデータを作成。
② ①を【表示させるコンポーネント】でまずは読み込む。(1~3行目)
```php
<script setup lang="ts">
  import lesson from '..//..//assets/json/lesson.json'
</script>
```
③ ②で読み込んだjsonファイルを呼び出す。(６行目~8行目)
[0]の部分を[1]に変えると test2 が表示されるよ。
```php
<template>
  {{ $route.params.id }}
  <div>
    <p>{{ lesson[0].title }}</p>
  </div>
</template>
```
④こんな感じで表示される。完成
![スクリーンショット 2022-10-25 23.13.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2931766/14ebade0-33b8-2cec-3784-350d64e8ef4b.png)

５行目の{{ $tute.parasms.id }}はページが変わったらその変わったページの情報を引っ張ってくる処理。
これはまた追々てな感じで。

以上。

次回、動的ルーティングにおいてのjsonファイル読み込みをやっていきます。
【UE4】UnrealEngineでLive2Dを動かすまで【1日目】

## 1. はじめに
UnityでLive2Dを使うことは容易にできるが、UnrealEngineでLive2Dをサポートしているわけでもなく、プラグインも数少ない。しかし、UnrealEngineでどうしてもLive2Dを動かしたいと考え、試行錯誤した奮闘記をここに残します。

**この記事を読んだところでUnrealEngineでLive2Dを動かせるわけではないので注意**

## 2.現在の開発環境
* UnrealEngine: ver.4.27.2
* Plugin: [UE-Live2D](https://github.com/stkrwork/UE-Live2D)
* Live2D Cubism SDK: Cubism 4 SDK for Native R5_1

## 3.UnrealEngineのバージョンについて
UnrealEngineは**4.27.2**を使用します。
このバージョンを使用する経緯は以下の通りです。

まず始めにUnrealEngine5.0.3を使用していましたが、2つの壁が立ちはだかりました。
1つ目の壁は下記の箇所でビルドエラー
```
Live2DBatchedElements.cpp
Line61: SHADER_PARAMETER(FVector2D, InMaskSize)
```
SHADER_PARAMETERマクロの第1引数で指定してあるFVector2Dが使用できないというビルドエラーが発生。SHADER_PARAMETER以外の適したマクロを使用するようShaderparameteMacros.hで確認したところ、見つからない。なので、FVector2DをFVector2fに変更することでビルドエラーを回避。

とりあえず、エディタを起動できたので実際にLive2Dのファイルをインポート
成功！
これで作品作れると思い、インポートしたLive2DModelをダブルクリック
・・・
・・・・・・
・・・・・・・・・
エディタが強制終了・・・
これが2つ目の壁
インポートしたLive2DModelを開かなければいいんだと思い、Widgetを作成し、Panelの中にImageを追加し、preConstructerにSetBrushFromLive2DModelMotionを使い、Live2DModelMotionファイルを指定、エディタ強制終了
エディタを再起動して、生成したWidgetをダブルクリック
・・・
・・・・・・
・・・・・・・・・
エディタが強制終了

Live2Dの公式がリンクを貼っているPluginのGithubページがこんなポンコツなわけないと思い、ここでUnrealEngine5に対応していないということに気が付きダウングレードを決行。

4.27と4.26はそこまで変わらないよね、と思い、ここで4.26を選択。
これが間違い。
<font color="Red">GetResource()</font>という関数をFTexture2Dが所持していないというビルドエラー
UE5ではこのようなエラーは出ていなかった。
ということは、Plugin製作者のUnrealEngine開発環境は**4.27**ということが判明
（そもそも書いておいてよという感想しかないが）

UnrealEngine4.27を使用することで、一つもビルドエラー出ずにエディタ起動

## 4.現在の壁
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281712/a657ece9-a4dd-aa6b-e12c-2da4dd084bde.png)
Live2D公式の[サンプルモデルのライスグラスフィールド](https://www.live2d.com/download/sample-data/)をインポートしたところ、↑のような結果に

* 目が表示されていない
* 前髪がおかしい

最低でもこの2つ。所持している個人のLive2Dモデルを入れても正常に表示されていない。
原因はわからず。

怪しいのはLive2D Cubism SDKのバージョン。
UE5ではNGであるならば、2022年9月15日に更新されたSDKで動作確認していない可能性があるため、少なくとも1年前の**Cubism 4 SDK for native R4**でdllファイルを作り、動作確認をしてみるつもりです。

## 5.最後に
Pluginを公開してもらえるのはとてもありがたいことですが、最小限すぎるReadme。せめても動作確認した環境の記載だけはしてほしい。自分が作ったらちゃんとそこら辺を記載しておこうと思いました。

2日目は進捗があり次第書きます。
では。
react nativeでapiたたいたら[AxiosError: Network Error]が出てきたので修正する

# 修正前

```typescript
try {
  console.log("try to create user");
  await axios({
    method: 'post',
    url: 'http://localhost:5050/api/v1/users',
    data: jsonData,
  }).then((response) => {
    console.log(response.data);
  }).catch(error => console.log(error));
} catch (ex: any) {
  console.error("ex", ex);
}
```

# 修正後

```typescript
try {
  console.log("try to create user");
  await axios({
    method: 'post',
    url: 'http://10.0.2.2:5050/api/v1/users',
    data: jsonData,
  }).then((response) => {
    console.log(response.data);
  }).catch(error => console.log(error));
} catch (ex: any) {
  console.error("ex", ex);
}
```

# 解説編
https://developer.android.com/studio/run/emulator-networking.html

👆こちらに以下のような表があります！

![スクリーンショット 2022-10-25 23.16.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1645779/b01f9933-6052-ee4a-0cc3-35b1ba17bae3.png)

エミュレーターからするとlocalhostとはエミュレーター自身のことで、普段のweb開発で使用するlocalhost(127.0.0.1)で使うような開発マシンは「10.0.2.2」となります！
これで解決できるわけですね！
Linuxで指定時刻・指定時間後に再起動・パワーオフする

# はじめに

- Linuxで指定時間、あと５分後にシャットダウンしたい、リブートしたい、といったときにやる方法です
- 夜間に再起動したいけど、ターミナルは切断しちゃうし、cron? nohup? なにが簡単？
- 今から１時間ぐらいあとに再起動したいけどどうしたらいいだろうか

# at コマンドを使う

- 再起動は reboot 、シャットダウンは poweroff

## 1分後
```terminal
$ at now + 1 min
at> sudo reboot
Ctrl + D
at> <EOT>
job 1 at Tue Oct 25 23:01:10 2022
```

## 1時間後に再起動

```terminal
$ at now + 1 hour
at> sudo reboot
Ctrl + D
at> <EOT>
job 1 at Tue Oct 25 23:10:10 2022
```

## 23:30に再起動

```terminal
$ at 23:30
warning: commands will be executed using /bin/sh
at> sudo reboot
Ctrl + D
at> <EOT>
job 1 at Tue Oct 25 23:30:00 2022
```

## 2022/10/25 23:30に再起動

```terminal
$ at -t '202210252330'
warning: commands will be executed using /bin/sh
at> sudo reboot
Ctrl + D
at> <EOT>
job 1 at Tue Oct 25 23:30:00 2022
```

## 確認

```terminal
$ atq
1	Tue Oct 25 23:02:00 2022
```

## 詳細を確認

```terminal
$ at -c 1
```

## 解除

```terminal
$ at -d 1
```

# さいごに

かんたんでしたね
【備忘録】Laravelによる非同期処理(Ajax)の使い方

# Ajaxとは何？

まずはAjaxとは「Asynchronous JavaScript XML」の略です。
「Asynchronous」は「非同時性の、非同期の」という意味です（コトバンク）
Ajaxは「JavaScript+XMLによるサーバーとの通信」となります。

## Ajaxの書き方について

Ajaxを利用するには`Java Scriptファイル`もしくは
scriptタグ内に処理、つまり次のテンプレートを記述します
### jsファイルにコードを記述する場合
```javascript:index.js
$.ajax({
          //以下の引数は使用しない場合省略可能です
        　url: ‘URL’　//LaravelのルーティングにつなぐURL
        　type: 'postかget',
        　cache: false, //cacheを使うかどうか
        　dataType:'json', //data type scriptなどデータタイプの指定
        　data:引数名, //Laravelのコントローラへ渡す引数を記述する
                    // $request->引数名　などで呼び出せます
        　})
        　.done(function(data){ // 通信が成功したときの処理 
        　})
        　.fail(function(data){ // 通信が失敗したときの処理（メッセージなど）
        　})
        　.always(function(data){ //通信の成否にかかわらず実行する処理 
    });
```

### scriptタグに記述する場合
```html:index.html
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>CSS overflow</title>
    <script src="https://code.jquery.com/jquery-3.0.0.min.js"></script>
    <script>
      $.ajax({
             //以下の引数は使用しない場合省略可能です
             url: ‘URL’　//LaravelのルーティングにつなぐURL
             type: 'postかget',
             cache: false, //cacheを使うかどうか
             dataType:'json', //data type scriptなどデータタイプの指定
             data:引数名, //Laravelのコントローラへ渡す引数を記述する
                        // $request->引数名　などで呼び出せます
             })
             .done(function(data){ // 通信が成功したときの処理 
             })
             .fail(function(data){ // 通信が失敗したときの処理（メッセージなど）
             })
             .always(function(data){ //通信の成否にかかわらず実行する処理 
            });

    </script>
  </head>
  <body>
    
  </body>
</html>
```

### パラメーターの説明(cache)

- cache(デフォルトはtrue)
一時データを示します。
例としてボタンを押すことで現在時刻を示す非同期処理を作成した場合
cacheを有効したままだと、過去に保存された時刻を表示してしまうこともあり、
正確な時刻を表示できない可能性があります。
よって、cacheはfalse(無効化）しておくことで正常な動作が期待できます
【Vue3】フォーカス時にテキストが全選択される input

![focusdemo.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/474068/0602a001-93a5-6c3d-dc95-d21605439b65.gif)

```vue
<script setup lang="ts">
import { ref } from 'vue';

const input = ref<HTMLInputElement>()
</script>

<template>
  <input 
    ref="input"
    @focus="input?.select()"
  />
</template>
```

ユーザーが１クリックでコピー / 削除 / 入力などの作業を行えるので便利です。


　
　

フロントエンドのことをよく呟いています
<a href="https://twitter.com/punksy2?ref_src=twsrc%5Etfw" class="twitter-follow-button" data-show-count="false">Follow @punksy2</a><script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>