OmniAICreator/Qiita-1.07M huggingface dataset:
AWS Shield Standard と AWS Shield Advanced違いまとめ

## 前書き
AWSのセキュリティ対策の一環としてAWS Shieldを利用するが、StandardとAdvancedの違いをきちんと理解できていなかったので自分向けにまとめておこうと思ったのがきっかけ。

## AWS Shieldとは
AWSの説明では以下のように記載している。
```
AWS Shield は、AWS で実行されるアプリケーションを Distributed Denial of Service (DDoS) 攻撃から保護するマネージド型のサービスです。
AWS Shield Standard は、すべてのお客様に対し追加料金なしで自動的に有効化されます。
AWS Shield Advanced は任意で利用できる有料サービスです。
AWS Shield Advanced により、Amazon EC2、Elastic Load Balancing (ELB)、Amazon CloudFront、AWS Global Accelerator、Route 53 で実行中のアプリケーションを標的とする、高度化された大規模な攻撃からの保護が強化されます。
```
つまりAWS ShieldはStandardであれば自動で有効化されて無料でDDoS対策のできるサービスであり、Advancedはオプションで特定のサービスに対して適用し利用可能なサービスであることがわかる。

## Advancedが適用可能なAWSサービス
- Amazon Route 53
- Amazon CloudFront
- Elastic Load Balancing
- AWS Global Accelerator
- Elastic IP

## Advancedでできること

### 自動化された攻撃緩和機能
- L3,L4のDDoS攻撃の自動緩和
- WAFと組み合わせたL7の攻撃緩和
  - Shield Advanced の防御対象リソースは AWS WAFの費用は発生しない

### Anormaly Detection（異常検知）機能
- 攻撃の統計情報からベースラインを策定し異常検知を行う

### 可視性レポート機能
- L3,L4,L7の攻撃に関する通知および履歴レポート
  - 過去13ヶ月分の攻撃の履歴が確認可能

### SLAの有無
- AdvancedではSLAが存在するため、SLAを満たさなければサービスクレジットが発行される

### Shield Response Team(SRT)によるサポート
- 設定の見直し
- シグネチャの更新
- 攻撃時のカスタム緩和
- 攻撃後の分析
- 自動防御で対処しきれない攻撃への対処
  - 事前にWAFへのアクセス権をSRTに付与することでL7攻撃緩和を実施してくれる


## Shield Response Team(SRT)とは？
AWS と Amazon.com を保護する知識と経験を持った DDoS 対策の専門家チーム
- AWSサポート経由での対応
- **利用するにはビジネスサポートまたはエンタープライズサポートを契約している必要がある**
- 24時間365日のサポート体制

## Advancedを利用するメリット(個人的感想)
- SRTによる24,365のサポートが受けられる
- 料金形態がOrganization単位なのでアカウント毎にサブスクリプション契約をする必要がない
- AWS WAFとFirewall Managerもサブスクリプション契約の料金で無料利用可能
- Firewall Managerを利用することによってマルチアカウントのリソースへのDDoS対策が可能


## 参考
- AWS Shield
https://docs.aws.amazon.com/ja_jp/waf/latest/developerguide/shield-chapter.html

- AWS Shield の開始方法
https://aws.amazon.com/jp/shield/getting-started/

- AWS Shield のよくある質問(JP)
https://aws.amazon.com/jp/shield/faqs/#:~:text=AWS%20Shield%20%E3%81%AF%E3%80%81AWS%20%E3%81%A7,%E3%81%AB%E6%9C%89%E5%8A%B9%E5%8C%96%E3%81%95%E3%82%8C%E3%81%BE%E3%81%99%E3%80%82

- AWS Shield Advanced(AWS Black Belt)
https://d1.awsstatic.com/webinars/jp/pdf/services/20200818_AWS_BlackBelt_AWS_Shield_Advanced.pdf

- Shield Response Team
https://docs.aws.amazon.com/ja_jp/waf/latest/developerguide/get-started-fms-shield-authorize-DRT.html

- SLA
https://aws.amazon.com/jp/shield/sla/
Dockerで構築したpostgreSQLデータベースのバックアップ・リストア

手順

```sh:
# PostgreSQLデータベースのコンテナ名を確認する
docker ps

# DBバックアップ
docker exec コンテナ名 pg_dumpall -c -U DBユーザ名 > dump.sql

# DBリストア
cat dump.sql | docker exec -i コンテナ名 psql -U DBユーザ名 -d データベース名

# DBアクセス
docker exec -it コンテナ名 psql -U DBユーザ名 -d データベース名

# DBテーブル一覧表示
\dt

# テーブルの中身表示
SELECT * FROM テーブル名

```
onclick属性で困った件

# onclick属性で困った件
以前、INPUTタグの**onclick**属性に指定したスクリプトが動かなくて原因をつかむまでに少し時間がかかったので、その時の備忘録です。

## 概要
下記のHTML/JavaScriptのようにSubmitされる前に**onclick**で何かしら処理を行いたい場合、function名を属性名と同じ**onclick**にしていると、正常に動作しません。

```onclick_test_failure.html
<!DOCTYPE html>
<HTML lang="ja">
<HEAD>
	<META charset="UTF-8">
	<TITLE>テスト</TITLE>
</HEAD>
<BODY>
<P>入力欄</P>
	<FORM>
		<INPUT type="text" id="txt">
		<INPUT type="button" value="確認" onclick="return onclick(0);" id="btn_check">
		<INPUT type="button" value="登録" onclick="return onclick(1);" id="btn_regist">
	</FORM>

	<SCRIPT>
		function onclick(val) {
			if (val == 0) {
				window.alert("確認が押されました");
			} else {
				window.alert("登録が押されました");
			}
		}
	</SCRIPT>
</BODY>
</HTML>
```

### エラー内容
ブラウザの開発者ツールで確認してみると、コールスタックがオーバーフローしています。
Edgeの例
![onclick_test_failure.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2534023/92ac14fe-ad31-8fa1-58c2-bffe06e15d6d.jpeg)
無限の再帰呼び出しにでもなってしまうのかな？

### 対応
function名を<strong>onclick</strong>以外のものに変えます。

```onclick_test_success.html
<!DOCTYPE html>
<HTML lang="ja">
<HEAD>
	<META charset="UTF-8">
	<TITLE>テスト</TITLE>
</HEAD>
<BODY>
<P>入力欄</P>
	<FORM>
		<INPUT type="text" id="txt">
		<INPUT type="button" value="確認" onclick="return check_txt(0);" id="btn_check">
		<INPUT type="button" value="登録" onclick="return check_txt(1);" id="btn_regist">
	</FORM>

	<SCRIPT>
		function check_txt(val) {
			if (val == 0) {
				window.alert("確認が押されました");
			} else {
				window.alert("登録が押されました");
			}
		}
	</SCRIPT>
</BODY>
</HTML>
```

修正したHTMLをブラウザで表示して、「登録」ボタンをマウスでクリックしてみると…
![onclick_test_success2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2534023/ef5c60da-6d5f-e457-fd21-f52d16c28a79.jpeg)
無事、スクリプトが動作しました。

## おわりに
この件は、改修案件で追加したfunctionの名称を既存から少し変えた際に起こったんですが、**function名に予約語を使うな**ってことですね。
まあ、初歩的なミスだとは思います。
[AWS]EC2で権限管理を統一するためのユーザー作成 ~備忘録~

##はじめに
この記事はプログラミング初学者による備忘録用の記事であり、また、少しでも他の初学者のお役に立てればと思い書いています。

今回は、EC2で権限管理を統一するためのユーザー作成手順を学びましたので、すぐに復習できるよう記事にまとめておきたいと思います。

間違いなどがございましたら、ご指摘のほどよろしくお願い致します。

##権限管理用ユーザーの作成手順
``~権限管理用ユーザーを作成する理由~``
何故、権限管理用ユーザーを作成するかというと、アプリケーションの各ディレクトリと各ファイルの所有者やグループがrootであったり、パーミッションが777であると権限管理が不明確になってしまうので、権限管理を統一するためのユーザーを作成します。

下記にて、権限管理用ユーザーの作成手順をまとめておきます。

###1.ユーザー追加の準備
デフォルトのままユーザーを追加すると、ホームディレクトリの権限が``700``で作成されます。
他のユーザーも対象ディレクトリを扱えるように権限を``755``に変更します。

ターミナルでEC2にログイン後、下記のようにコマンドで``/etcディレクトリ``の``login.defs``を**vi**で開きます。

```
$ sudo vi /etc/login.defs
```
viの起動後、``UMASK``の設定を下記のように変更します。

```
# 略
# The permission mask is initialized to this value. If not specified,
# the permission mask will be initialized to 022.
UMASK           022 //この行の077を022に変更
# 略
```
上記のUMASKを``022``へ変更することにより、ユーザー追加時にそのホームディレクトリの権限が``755``となります。

``~補足:ファイル内容を誤った場合~``
もしvi起動後の編集時に、ファイルの内容を誤った際は、以下の操作を行なってください。

1.escキーを押して、インサートモードを終了します
2.``:q!``と入力してエンターキーを押すことで、ファイルを保存せずにviを終了します

その後、改めてviを起動してファイルを編集してください。

###2.ユーザーの追加
下記のコマンドを実行してユーザーを追加していきます。

```
$ sudo useradd username
```
次に、追加できたかどうかを確認するために下記コマンドを実行します。

```
$ id username

//実行結果(追加成功例)
uid=1001(username) gid=1001(username) groups=1001(username)
```
最後に、追加したユーザーのホームディレクトリ権限を下記のコマンドを実行して確認します。

```
$ ls -l /home

//実行結果
drwx------ 6 ec2-user    ec2-user    138  9月 16 09:30 ec2-user
drwxr-xr-x 6 username username 158  9月 21 10:28 username
```
上記のように、作成したusernameのディレクトリ権限(左から2桁目以降)が``rwxr-xr-x(755)``となっていれば大丈夫です。

###3.作成ユーザーへの切り替え方法
先ほど作成した追加ユーザーに切り替える場合は下記コマンドを入力します。

```
$ sudo su -　username

//実行結果
[username@ip-xxx-xxx-xxx-xxx ~]$
```
上記のように、ターミナルに切り替え対象となるユーザー名が表示されていれば切り替えは成功しています。

``コマンド説明``
**・su**
su（substitute user）コマンドは、ログインし直さずに他のユーザーに切り替えるコマンドです。通常はrootユーザーの権限でシェルを動かし、様々なコマンドを実行したい場合に使用します。

要するに、suコマンド実行以降は、全てのコマンドが**rootユーザー**として実行されます。**プログラムのインストールやアップデートなど、root権限が必要なコマンドを実行する際に使用します。**

rootユーザー権限を解除する際は、``exitコマンド``を使用します。
元のユーザーに戻るのが面倒な場合、特定のコマンドだけrootユーザーで実行できる「-c」オプションを使うことで、元のユーザーに戻るのを忘れてしまうようなトラブルを避けることができます。

**・-**
``-``をつけることで、切り替えたユーザーの**ホームディレクトリ**に移動することができます。

##補足
###・umaskとは
umaskは新規ファイルや新規ディレクトリの作成時のパーミッションを設定したり、ファイル属性を確認できるLinuxコマンドです。

例えば、下記の例のように新規ファイルや新規ディレクトリを作成した際に、設定するファイル属性を確認できます。

``使用例:``

```
$ umask

//実行結果
0022
```
実行結果は、3桁or4桁の数値で表示され下三桁を確認することでファイル属性がわかり、１文字目が所有者、２文字目がグループ、３文字目がゲストユーザーの設定となっています。

###パーミッション数値
ファイルに与えるパーミッションの属性は下記の４種類です。

|英|数|意味|
|:--|:--|:--|
|r|4|読み込み可能|
|w|2|書き込み可能|
|x|1|実行可能|
|-|0|許可なし|
上記を組み合わせることで、様々なパーミッションを与えることが可能となります。

``組み合わせ例``

|数値|組み合わせ|権限|英字|
|:--|:--|:--|:--|
|7|4 + 2 + 1|読・書・実行|rwx|
|6|4 + 2|読・書|rw-|
|5|4 + 1|読・実行|r-x|
|4|4|読|r--|
|3|2 + 1|書・実行|-wx|
|2|2|書|-w-|
|1|1|実行|--x|
|0|0|なし|---|


##参考文献
[EC2 Linux インスタンスに新しいユーザーを追加する](https://aws.amazon.com/jp/premiumsupport/knowledge-center/new-user-accounts-linux-instance/)
各種 log について　MySQL / Docker / Nginx

# MySQL

https://proengineer.internous.co.jp/content/columnfeature/7002

### ログファイルの種類
MySQL Server 5.7のログファイルには、次の４種類があります。

+ 一般クエリの実行ログ（General query log）
+ スロークエリの発生ログ（Slow query log）
+ バイナリログ（Binary log）
+ エラーログ（Error log）

このうち__スロークエリの発生ログ__と__エラーログ__については、__デフォルトで記録が設定__されています。残りの___一般クエリの実行ログ___と___バイナリログ___については、___設定の追加___が必要です。


### 一般クエリログとは

実行したSQLクエリの履歴が全て記録されていくログです。
サイズが大きくなりやすいですが、障害対応などで重要な役割を果たすことも多く、システムが稼働する際にはよほどでなければ出力するケースが多いようです。

### スロークエリログとは

実行に時間のかかったクエリがあった際に記録されるログです。パフォーマンス向上のための原因分析の場面などで役立ちます。

### バイナリログとは

バックアップログとも呼ばれ、データ変更の情報をバイナリ情報で記録しています。いざという時はバイナリログからデータを復元できる内容となっており、レプリケーションにも使用されています。

### エラーログとは

サーバの起動や停止の情報と合わせて、発生したエラーや警告の履歴が出力されるログファイルです。

#### 各種ログの出力設定、ログの確認と読み方は参考サイトを参照のこと。

# Docker

https://qiita.com/sho_U/items/1f0f25e1cfe928828dd8

https://qiita.com/nitaking/items/4ca215b95cef2ad5e958

https://blog.ryou103.com/post/docker-compose-logging/

自分はまだ未設定

# Nginx

https://teratail.com/questions/374806



### 後々考える

https://seri.hatenablog.com/entry/2018/10/20/172656

https://dev.classmethod.jp/articles/recommend-operation-for-bigoted-developers/
DateTimeFieldの値をdatetime-localタグで表示させる

#環境・前提
* Django4.0.2を使ったWebアプリ作成。

#やりたいこと
モデルから取得した日付データ（DateTimeField型）を、inputタグ（type="datetime-local"）のvalueにセットして表示させる。

#方法
下記のようにモデルに定義した、DateTimeField型のデータを取得し、テンプレートに配置したinputタグに表示させます。

```python:models.py
class studyModel(models.Model):
    deadline = models.DateTimeField()

    def __str__(self):
        return self.title
```

テンプレートです。モデルから取得したobject.deadlineをinputタグのvalueにセットして表示させます。

```html:template.html
<input type="datetime-local" name="deadline" value="{{ object.deadline | date:"Y-m-d\TH:i" }}" />
```

このように表示されます。
![date.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2533999/ea66a233-95aa-39ed-8d81-afe61029165b.png)

#注意点
モデルのDateTimeField型とinputタグ（type="datetime-local"）の日付フォーマットが異なるため、valueプロパティに設定する際にそのまま「{{ object.deadline }}」としてしまうと、うまく表示されず、下のような表示になってしまう。
![date2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2533999/bd42a9b9-6ed3-4980-1938-ed8661c37a56.png)

inputタグのフォーマットは「yyyy-MM-ddThh:mm」なので、モデルから取得した日付データをinputのvalueに設定する場合は、この形式に合わせてやる必要がある。

:::note info
inputタグ（type="datetime-local"）のフォーマット
　　yyyy-MM-ddThh:mm
:::

そのため、実際にvalueに設定するのは、{{ object.deadline | date:"Y-m-d\TH:i" }}になります。
「date:"日付の形式"」でフォーマットを指定します。

フォーマット中の「Y」、「m」、「d」、「H」、「i」はそれぞれDjangoの日付フォーマット変換の書式として決まっているものです。「\T」の部分については、「\」に続く文字列は変換されずそのまま出力されます。
今回必要なフォーマットは「yyyy-MM-ddThh:mm」であり、ddとhhの間に「T」が必要なので入れています。
HULFT-WebConnect 設定ガイド【４つの転送方式の違い】（1/6）

# はじめに
こんにちは、よろず相談担当 すぎもんです。本日は、HULFT-WebConnectの設定方法のポイントについてご紹介します。
HULFT-WebConnectは、運用要件により４種類の転送の仕組み（言い換えると、４種類のクライアント）から選択することができます。まずは、それぞれの用途について紹介した上で、４つの転送方式についての設定の流れについて解説いたします。

## HULFT-WebConnectとは
ここで、HULFT-WebConnectをご存知ない方に簡単に紹介すると...
HULFT-WebConnectとは、一言で言うと「インターネット上でHULFTを使えるようにする」サービスです。
![001_WebConnectとは.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/b06feefd-2836-d2d3-edfd-08cf1f62f690.png)

これだけだと、どのようなサービスかわかりにくいので、もう少しかみ砕いて説明します。

### 採用するメリットは？

+ 主にイントラ環境で利用いただいていたHULFTをインターネット越しでも**安全に**利用できるようになる
+ ファイアウォールなどネットワークインフラの準備が不要なので、**簡単・すぐに**利用できるようになる
+ 従来のHULFTと同様に運用できる

### どのような仕組みか？

+ HULFTの通信経路をTLS暗号化することで、HULFT専用の**VPN上でHULFT通信**を行うイメージ
+ 両端のHULFT側（イントラ側）からWebConnectサービス（SaaS）へアウトバウンドセッションを貼るだけなので、**インターネット側からイントラ側へのインバウンドセッションが無い**。だから**ファイアウォールの設定が不要**となる
+ WebConnectサービス（SaaS）は、各HULFTセッションの認証とルーティングを行うのみ。予め許可したルーティング（ホワイトリスト方式）しかしないので、安全なデータ中継を実現できる
+ また、WebConnectサービス（SaaS）上では、**中継データの保存（一時蓄積）は行わない** ので、情報漏えいのリスクが低い仕組みになっている
![003_WebConnectの仕組み.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/257664cb-bcd6-3d94-e7fa-82cd7ae5b94b.png)


## ４つの転送方式とは
HULFT-WebConnectには、利用用途に応じて４つの転送方式があります。
わかりやすく縦横の２軸で説明すると、
　**横軸**（転送を **自動運用** or **主導運用**）
　**縦軸**（**HULFT転送** or **簡易転送**）

![002_4つの転送方式.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/0093a4d9-1fc0-7f5e-3bbc-43914528d568.png)

### 縦軸で分類すると
**自動運用：Agent方式、CLI方式**
**手動運用：D-Client方式、Webブラウザ方式**
となります。

**手動運用**は人が画面を直接操作してアップロード／ダウンロードするイメージになります。そのため、クライアントPCを利用して運用する感じです。
**自動運用**は、予めバッチファイルなどのスクリプトを仕込んでおいて自動送受信をするような、サーバで運用イメージになります。

### 横軸で分類すると
**HULFT転送：Agent方式、D-Client方式**
**簡易転送：CLI方式、Webブラウザ方式**
となります。

**簡易転送**は一般的なhttpsベースのアップロード／ダウンロードと同レベルの通信品質となり、HULFT独自の機能が活用できません。
**HULFT転送**との機能的な違いとしては、主に
　・**文字コード変換**ができない
　・**圧縮機能**が使えない
　・**データ整合性**のチェックレベル違い（HULFT転送ではSHAアルゴリズムによるハッシュチェックが可能）
などが挙げられます。
**より柔軟で確実なデータ送受信を望む場合は、ミッションクリティカルな業務の連携実績が豊富なHULFT転送の方式がお勧めとなります。**　

## 設定の流れ
下図は、WebConnectのオンラインマニュアル（[ファーストステップガイド](https://www.hulft.com/help/ja-jp/WebConnect-V3/index.htm)）に記載のある設定の流れです。管理者側はHULFTの利用が必須となっており、通信相手先（利用者）の設定が転送方式により異なることがわかります。
![004_設定の流れ（共通）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458288/c3935ae7-938d-ffb1-e1f9-6ee8198659dc.png)


***
**HULFT-WebConnect 設定ガイド** は、全6回のシリーズで順次公開予定です。

1. **４つの転送方式の違い**（本記事）
2. [Agent方式の設定ポイント](https://qiita.com/sugimon/items/071693e248014505c8f3)
3. [CLI方式の設定ポイント](https://qiita.com/sugimon/items/aed0713cf56dbd0de063)
4. [Webブラウザ方式の設定ポイント](https://qiita.com/sugimon/items/521ec99dc20e4cdb8730)
5. [D-Client方式の設定ポイント](https://qiita.com/sugimon/items/adbb055ae1208ed8143c)
6. [その他設定上の考慮ポイント](https://qiita.com/sugimon/items/0ffa6838d24650e8461f)

次回は、[Agent方式](https://qiita.com/sugimon/items/071693e248014505c8f3)について解説いたします。

***
本記事は、[HULFT-WebConnect V3 マニュアル](https://www.hulft.com/help/ja-jp/WebConnect-V3/index.htm)を参考にしています。
Laravel Telescopeのログを直接取得する

## 前提条件

- `laravel/framework v8.83.1`
- `laravel/telescope v4.7.3`

## 例

リクエストのログを5件取得する。

```php
use Laravel\Telescope\Contracts\EntriesRepository;
use Laravel\Telescope\Storage\EntryQueryOptions;

$entries = app(EntriesRepository::class)->get(
    'request',
    (new EntryQueryOptions())->limit(5)
);
```

ページネーションする場合は `beforeSequence()` で。

```php
use Laravel\Telescope\Contracts\EntriesRepository;
use Laravel\Telescope\Storage\EntryQueryOptions;

$entries = app(EntriesRepository::class)->get(
    'request',
    (new EntryQueryOptions())->limit(5)->beforeSequence($prevEntries->last()->sequence)
);
```

コントローラーで使う場合は `EntryQueryOptions::fromRequest()` で省略できる。

```php
use Laravel\Telescope\Contracts\EntriesRepository;
use Laravel\Telescope\Storage\EntryQueryOptions;
use Illuminate\Http\Request;

public function index(Request $request) {
    $entries = app(EntriesRepository::class)->get(
        'request',
        EntryQueryOptions::fromRequest($request)
    );
    // ...
}
```

Requestに使えるパラメータは以下。

- batch_id
- uuids
- before (`beforeSequence()`用)
- tag
- family_hash
- take (`limit()`用)

## 参考資料
- [telescope/EntriesRepository](https://github.com/laravel/telescope/blob/4.x/src/Contracts/EntriesRepository.php)
- [telescope/EntryQueryOptions](https://github.com/laravel/telescope/blob/4.x/src/Storage/EntryQueryOptions.php)
RESTFul API の例外- ClientHandlerException

## 事前情報
・最初からRESTFul APIを作ったことがない
・すでにあるAPIでやり取りだけ

## やりたいものちゃんとエラーハンドリング
例) https://www.programcreek.com/java-api-examples/?class=com.sun.jersey.api.client.ClientHandlerException&method=getCause
↓のコードが理解できなかった

```java
public ChannelFinderException(ClientHandlerException cause) {
    super(cause.getMessage());
    if(cause.getCause() instanceof SocketException) {
        this.setStatus(Status.NOT_FOUND);
    } else {
        this.setStatus(Status.SEE_OTHER);
    }
}
```

ClientHadnlerExceptionはRuntimeExceptionなのにSocketException IOExceptionのものもチェックしてくるの？(まだgetCauseが見えない)

Java.lang.Object 
 extended by java.lang.Throwable      
    extended by java.lang.Exception          
      extended by java.lang.RuntimeException             
        extended by com.sun.jersey.api.client.ClientHandlerException

SocketExceptionの場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209211/b5e834dc-bd53-1bc3-34f1-d85bd723c270.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209211/12abe085-e135-bc33-8ec1-1ba42e520221.png)
写真参照)
https://rollbar.com/blog/java-exceptions-hierarchy-explained/#:~:text=The%20class%20at%20the%20top,direct%20subclasses%20%2D%20Exception%20and%20Error.&text=Exceptions%20are%20further%20subdivided%20into,(run%2Dtime)%20exceptions.

例外の継承関係を見たら？instanceofする前に引っかからないのでは？

と思ったが違った→

ex.getCause() 
ClientHandlerExceptionのconstrunctorを見ると
A runtime exception thrown by a client handler that signals a failure to process the HTTP request or HTTP response.

ClientHandlerException(java.lang.Throwable cause)(ここからは推測。。。)
がある、つまりAPI側ではエラーをClientHandlerExceptionのエラーを返しているでしょう
それで↓の書き方ができるでしょう

```java
  if(cause.getCause() instanceof SocketException) {
```


ちょっと。。。推測だらけなので、後でjerseyを使ってrestful api作成した方がいいかも






参照資料
https://www.javadoc.io/doc/com.sun.jersey/jersey-bundle/1.4-ea01/com/sun/jersey/api/client/class-use/ClientHandlerException.html#com.sun.jersey.api.client

http://itdoc.hitachi.co.jp/manuals/link/cosmi_v0970/03Y2360D/EY230666.HTM

指定したJavaの型がサポートされない型の場合，エラーとなり（KDJJ10031-EおよびKDJJ18888-E），ClientHandlerExceptionがスローされます。

戻り値が次に示すJavaの型で，HTTPレスポンスのエンティティボディが使用できないMIMEメディアタイプの場合，エラーとなり（KDJJ10031-EまたはKDJJ18888-E），ClientHandlerExceptionがスローされます。
[terraform][AWS] ECSタスク定義の更新時に旧リビジョンを残す

# 困っていたこと

AWSの仕様として、ECSのタスク定義は更新ができません。（タグの編集は可）
タスク定義を変更するときには新しいリビジョンを作成する管理方式となっています。

AWSマネジメントコンソールではリビジョンの作成と削除は別操作ですが、 terraform では delete/create になっていました。旧リビジョンは削除されてしまいます。
「旧リビジョンはその瞬間から２度と使わない」と割り切れるのならそれでも構わないのかもしれませんが、残しておきたいケースもあるはずです。


# 対処方法


なぜか現時点では [リファレンス - Resource: aws_ecs_task_definition](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/ecs_task_definition) に記載されていませんが、`Terraform AWS Provider v3.72.0` から削除をスキップするフラグ `skip_destroy` が追加されています。
https://github.com/hashicorp/terraform-provider-aws/pull/22269

このフラグを設定することにより、旧リビジョンを残しつつ新しいリビジョンを作成することが可能になっています。


```diff_hcl:sample
resource "aws_ecs_task_definition" "ecs_task" {
  family = "sample-task"
  container_definitions = templatefile("./task-definition.json", {
    image_url = "nginx:latest"
  })
  requires_compatibilities = ["FARGATE"]
  network_mode             = "awsvpc"
  cpu                      = "256"
  memory                   = "512"
+ skip_destroy             = true
  lifecycle {
      ignore_changes = [container_definitions]
  }
}
```

# 現時点での問題点
* リファレンスに記載されていない件については、 [こちらのissue](
https://github.com/hashicorp/terraform-provider-aws/issues/23244) で提起されています。
* 削除されないにも関わらず、plan/apply で destroy の対象として表示・カウントされています。それについては [こちらのissue](https://github.com/hashicorp/terraform-provider-aws/issues/23295) で提起されています。
Apexを使ったメールの操作など

[まとめページに戻る](https://qiita.com/Keiji_otsubo/items/60afc2a8d211b6f7d89f)

+ [メール関係の設定のまとめ](https://qiita.com/Keiji_otsubo/items/160369c1c4c7dca02ea9)

# 制限事項
+ [電子メールサービスでタイプemlまたはmsgの添付ファイルを処理する方法は？-->不可能](https://salesforce.stackexchange.com/questions/72054/how-to-process-attachments-of-type-eml-or-msg-in-email-services)


# 作成例

+ [添付ファイルとしてレポートを送信する【作業中】](https://qiita.com/Keiji_otsubo/items/d2e1082bcd1a040be722)
【Python】ファイル・ディレクトリの存在を確認する方法

ファイルの存在を確認する方法を使用したので、あわせてディレクトの存在確認の方法もメモしておく。

# ファイル・ディレクトリの存在を確認する方法
ファイルやディレクトリの存在有無によって処理を切り替えたりする場合に使用できる。
以下で出てくる``isfile()``、``isdir()``、``exists()``を使用するためには、``os``モジュールをインポートする必要がある。

```Python
import os
```

## ファイル・ディレクトリの存在：exists()
``exists()``は、指定されたパスが存在した場合``true``が返される。それがファイルでもディレクトリでも``true``。
つまり、ファイルかディレクトリであるかはこれでは分からないため、判別したい場合に``isfile()``、``isdir()``を使用する。

```Python
os.path.exists(<ファイルパス>):
```

## ファイルの存在：isfile()
``isfile()``は、指定されたパスが存在し、それがファイルである場合``true``が返される。指定されたパスがディレクトリの場合は``false``

```Python
os.path.isfile(<ファイルパス>):
```

## ディレクトリの存在：isdir()
``isdir()``は、指定されたパスが存在し、それがディレクトリである場合``true``が返される。指定されたパスがファイルの場合は``false``

```Python
os.path.isdir(<ファイルパス>):
```

ここで指定するファイルパスについて、ファイル名だけを指定することもでき、その場合は現在のディレクトリ内からのパスを探索する。
GCPの使用料金の内訳は、"お支払い”の「レポート」と「価格表」

# やりたいこと

GCP(Google Cloud Platform)のサーバ代でどのサービス(VM・ストレージなど)がいくらかかったのか知りたい。

# ここを見る


ハンバーガーメニューの「お支払い」に移動
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90529/c0720984-9dc5-e34e-6f76-b1318905ddd7.png)

## 知りたい内容によって、「レポート」か「価格表」を見る


* **レポート**
    * 請求前(現在)のデータが見たい
    * 使用量の推移を見たい
    * 内容をGUIで絞り込みたい
* **価格表**
    * 過去の請求を見たい
    * サービスの機能(SKU)ごとの料金を知りたい(例えば、ストレージ料金の内、通信と保存それぞれの料金)

## 「レポート」を見る場合

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90529/d05ee20a-aa12-38aa-75f4-b1f1d9e2da55.png)

②でフィルターバーを表示し、
③で、 **"サービス"** に絞り込むことで、どのサービスに料金がかかっているか表示できる。

フィルターで色々絞り込めて、便利。

## 「価格表」を見る場合

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90529/54a796d6-88a9-669d-b195-5b8c75876bd0.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90529/8651f198-5ae6-3612-ba13-df60651064ec.png)


プロジェクト毎　⇒　サービス毎 ⇒　SKU(通信などの細かい値段) にテーブル表示になっており、把握しやすい。

さらに、チェックボックスを押すだけで **合計金額** を出してくれる。
(例えば、全サービスの通信代だけ知りたい、みたいなのが簡単！)


以上です。
GCPの料金表示は、とても分かりやすかった！！
AWS Solutions Architect Professional 認定更新の記録


## 概要

SAP試験を受けて更新してきました。

AWS資格の更新は初めてだったので、メモを残します。

## 資格に関して

https://aws.amazon.com/jp/certification/certified-solutions-architect-professional/

個人的に、現時点で**最も難度の高いAWS資格**だと思っています。
AWSサービス/分野の範囲が恐ろしく広く、初回受験時の対策は辛かった。。（下部リンク参照）

SAPの下位資格は以下１点ですが
Solutions Architect – Associate

アソシエイト試験と比べると、各AWSサービス単体ではなく、**複雑なアーキテクチャや移行プロジェクト**などを沢山扱うため
各サービスの**メリット・デメリットの比較**や、**AWSサービスの組み合わせ可否**など
問われる知識のレンジが圧倒的に広がります。
これは、様々な問題集を見るとすぐわかるかと思います。

特につらみなのは、Advanced Networking等で問われるようなVPN,DX
Data Analyticsで主に問われるEMRやGlue、Kinesis系など、
**各種専門サービスが当たり前のようにひょっこり出題範囲となっている点**です。

※これらの情報も[試験ガイド](https://d1.awsstatic.com/ja_JP/training-and-certification/docs-sa-pro/AWS-Certified-Solutions-Architect-Professional_Exam-Guide.pdf)に記載してあるので熟読必須です


## 受けて感じたこと

受けて感じたのは前回と同様、**試験所要時間が非常に長い**ということと、
自分が普段触れていないサービスのオプションや詳しい部分を聞かれるとどうしても答えられないという、割と当たり前の現実です。

しかし、AWS認定試験は**消去法が非常に有効**なので
わからなくても「これはありえないだろう」という選択肢を**迷わず先にぶった切る**ことだと思います。
あとはわからないものはどうしようもないので確率に頼りましょう。試験合格ラインは72.2%程度です。

## 今後

次はDOP試験を更新しますが、ProfessionalやSpecialtyも近いうち試験回答形式が増えると思うので
精進せねばと思っています。触れないサービスがガイドや問題集にあったら、時間があるうちに触れてみるのがベストですね。

例えばSAA試験は既に**「試験ラボ」**が導入されているので、他も時間の問題な気がします。

>試験ラボ: AWS マネジメントコンソールまたは AWS CLI で実行する一連のタスクで構成される
シナリオが表示される

※[SAA 試験ガイド](https://d1.awsstatic.com/ja_JP/training-and-certification/docs-sysops-associate/AWS-Certified-SysOps-Administrator-Associate_Exam-Guide.pdf)


また、試験のアップデートや新試験も出るので挑戦予定です。

https://aws.amazon.com/jp/certification/coming-soon/




以上です、ありがとうございました！

## Links


**AWS Skill Builder**
※最近は[こんな訓練所](
https://explore.skillbuilder.aws/learn)もあります。模擬試験も受けられます

https://explore.skillbuilder.aws/learn/course/external/view/elearning/34/exam-readiness-aws-certified-solutions-architect-professional


**個人記録**

[失敗時の記録](https://qiita.com/shinon_uk/items/ba839ba048ba439cc3ff
)(2019/08)

[合格時の記録](https://qiita.com/shinon_uk/items/c6b599d1cd3000e84d59
)(2019/11)
JavaアプリでPDF出力する方法

JavaアプリでPDF出力する方法を実務で実装したのでメモしておきます。

#１、 `Jaspersoft Studio`をインストールし、帳票のテンプレートファイル（jrxmlファイル）を作成する

まずはEclipseで、

ヘルプ → Eclipseマーケットプレイス・ウィザードを開く

でマーケットプレイスを開き、JasperSoft Studioをインストールします。インストールが終わったら、

src/main/webapp/template/ 配下でjrxmlファイルを作成します。このjrxmlファイルでレイアウトを作成し、パラーメータを割り当てます。また、ここではフォントを「IPAex明朝」にしておきます。

#２、 jarファイル一式をダウンロード

下記のjarファイル一式をダウンロードします。

```
bcprov-jdk15on-1.68.jar
castor-core-1.4.1.jar
castor-xml-1.4.1.jar
commons-beanutils-1.9.4.jar
commons-collections-3.2.2.jar
commons-collections4-4.2.jar
commons-digester-2.1.jar
commons-lang3-3.4.jar
commons-logging-1.1.1.jar
ecj-3.21.0.jar
gson-2.8.6.jar
itext-2.1.7.js8.jar
jackson-annotations-2.12.4.jar
jackson-core-2.12.3.jar
jackson-databind-2.12.5.jar
jasperreports-6.18.1.jar
javax.inject-1.jar
jcommon-1.0.23.jar
jfreechart-1.0.19.jar
```

これらをダウンロードしたら、

src/main/webapp/WEB-INF/libの直下にすべてコピーします。必ずしもバージョンは記載のものでなくても大丈夫です。新しいものがあればそっちをダウンロードしてください。

#３、帳票ファイル定義とデフォルトデータを追加する

次に、

src/main/java に exportというパッケージを作成します。（名前は任意）

そのパッケージ下でclassファイルを作成します。

このファイルでパラメータを取得します。

#４、帳票データ設定処理を追加する

src/main/java/export に サーブレットファイルを作ります。

ここに帳票データ設定処理を追加していきます。（必要があればデータベースに接続したり）

#５、PDF出力用のJSPを作成する

src/main/webapp/WEB-INFの配下に出力用のJSPを作成します。

４で作成したサーブレットにアクセスするaタグを実装します。このリンクを押せばPDFが出力されます。

#６、フォント等のインストール

まず、src/main/resources配下にfontsという名前のパッケージを作成します。この中にフォントをインストールします。

今回は「IPAex明朝」でjrxmlファイルを作成したので、「ipaexg.ttf」 と 「ipaexm.ttf」 をダウンロードして、fontsパッケージ下にコピーします。

また、「pdf_font.xml」 という名前のxmlファイルもfontsパッケージ下に作成し、下記のように入力します。

```pdf_font.xml
<?xml version="1.0" encoding="UTF-8"?>
<fontFamilies>
  <fontFamily name="IPAexゴシック">
    <normal>fonts/ipaexg.ttf</normal>
    <pdfEncoding>Identity-H</pdfEncoding>
    <pdfEmbedded>true</pdfEmbedded>
  </fontFamily>
  <fontFamily name="IPAex明朝">
    <normal>fonts/ipaexm.ttf</normal>
    <pdfEncoding>Identity-H</pdfEncoding>
    <pdfEmbedded>true</pdfEmbedded>
  </fontFamily>
</fontFamilies>
```

最後にsrc/main/resources配下に 「jasperreports_extension.properties」 の名前でファイルを作成して、下記のように入力します。

```jasperreports_extension.properties
net.sf.jasperreports.extension.registry.factory.fonts=net.sf.jasperreports.engine.fonts.SimpleFontExtensionsRegistryFactory
net.sf.jasperreports.extension.simple.font.families.font=fonts/pdf_font.xml
```

これでPDF出力できるようになります。
Prism コードサンプル学習：20-NavigationExistingViews

# Prism コードサンプル学習：20-NavigationExistingViews

## はじめに

以下の記事の続きです。
<https://qiita.com/mngreen/items/cf6f758d04a0b6fa00f2>

## 20-NavigationExistingViews

本サンプルは、前回記事と同じくボタンを押下するとタブコントロールにタブアイテムが追加されるサンプルです。
ボタンを押下するごとにタブのビューのカウントがインクリメントされます。
ただし、設定した回数（サンプルの場合は4回目）を超えると新しいタブが生成されます\(正確には、そのVMと紐づくVがジャンプする対象とならない\)。
以下のINavigationAware.IsNavigationTargetメソッドがtrueを返すかfalseを返すかで、タブが新しく生成されるかが変わります。

```cs
using Prism.Mvvm;
using Prism.Regions;
namespace ModuleA.ViewModels
{
    public class ViewAViewModel : BindableBase, INavigationAware
    {
        private string _title = "ViewA";
        public string Title
        {
            get { return _title; }
            set { SetProperty(ref _title, value); }
        }

        private int _pageViews;
        public int PageViews
        {
            get { return _pageViews; }
            set { SetProperty(ref _pageViews, value); }
        }

        public ViewAViewModel()
        {
        }

        public void OnNavigatedTo(NavigationContext navigationContext)
        {
            PageViews++;
        }

        public bool IsNavigationTarget(NavigationContext navigationContext)
        {
            return PageViews / 3 != 1;
        }

        public void OnNavigatedFrom(NavigationContext navigationContext)
        {
        }
    }
}
```

今回のサンプルの変化点としては、VMでINavigationAwareインターフェイスを実現しており、IsNavigationTargetメソッド内の処理を変更している点です。
入口はこれまでに見たものと同じで[RegionNavigationService.ExecuteNavigationメソッド](https://github.com/PrismLibrary/Prism/blob/7f0b1680bbe754da790274f80851265f808d9bbf/src/Wpf/Prism.Wpf/Regions/RegionNavigationService.cs#L221)から通ります。
この中の[RegionNavigationContentLoader.LoadContentメソッド](https://github.com/PrismLibrary/Prism/blob/7f0b1680bbe754da790274f80851265f808d9bbf/src/Wpf/Prism.Wpf/Regions/RegionNavigationContentLoader.cs#L51)で、IsNavigationTargetメソッドでtrueが返らない場合、遷移先のViewが存在しないことになり、新たにViewを作成する処理に遷移することが分かります。
その結果として、モジュールのViewのインスタンスがどんどんと新たにできることが分かります。

## おわりに

今回は、RegionManager.IsNavigationTargetメソッドの処理を変更することで、タブアイテムが増えていくサンプルを見ていきました。
前回と同じく、大きな流れ（クラス間の関連やメソッド呼び出し）はあまり大きく変わってはいませんでしたが、なぜViewが増えていくのかその中身に触れられました。
次回、[21-PassingParameters](https://github.com/PrismLibrary/Prism-Samples-Wpf/tree/master/21-PassingParameters)について見ていこうと思います。
【Linuxで音ゲー#6】音ゲーアプリが標準MIDIファイル(SMF)をうまく認識しなかった

:::note alert
本稿は未完成です
:::

※当分の間省略

## 短く言うと

音ゲーアプリで扱う標準MIDIファイル(SMF)はマイナーなformat0形式になっていることが多い。
以下コマンドでバイナリファイルを読み込めばSMFファイルのフォーマット形式を確認できる。

```:Terminal
od -tx1 -c -N 16 (filename).mid
```
```
0000000  4d  54  68  64  00  00  00  06  00  01  00  02  01  e0  4d  54
          M   T   h   d  \0  \0  \0 006  \0 001  \0 002 001 340   M   T
以下略
```

:::note info
フォーマット形式を知りたいだけなら、ファイル名.midを右クリックしてTiMidity++で演奏させればformat0/format1が表示されます。
:::

:::note info
「Music Studio Producer」を使えばformat0形式で保存できます。
:::



＜＜前の記事　[【Linuxで音ゲーを実行#1】Linux Mintをインストールしたらヘッドホンから音が出なかった][1]

[【Linuxで音ゲーを実行#5】]　次の記事＞＞


# はじめに

※当分の間省略

# 今回の環境

* NEC LaVie LS350/A
* Linux mint 20.3 Cinnamon
* ALSA[^1](初期状態でインストール済み)
* PulseAudio[^2](初期状態でインストール済み)
* ~~JACK~~[^3]
* WineHQ7.0
* TiMidity++
* Windows版音ゲーアプリ「Synthesia」（Wineにて実行）
* Andoroid版音ゲーアプリ「Chordana Play」（作成したSMFを転送してAndroidタブレットで実行）

[^1]: Linuxカーネルコンポーネントのひとつ。カーネルモジュール/ライブラリーで構成されている。バックグラウンドで動作しサウンドカードハードウェアの自動設定や複数のサウンドデバイスの取扱いを行うアプリケーション群。

[^2]: サウンドサーバのひとつ。バックグラウンドで動作し異なる音声データをミキシングして出力装置(ここではALSA)へ単一の統一された音声を送る。

[^3]: サウンドサーバのひとつ。低レイテンシーで呼び出されたJACK対応アプリケーション同士でのオーディオ、MIDIデータ両方の接続を提供する。　https://ja.wikipedia.org/wiki/JACK_Audio_Connection_Kit

:::note info
はじめはJACKをインストールして使おうと思ったのですがPulseAudioで足りました。JACKをインストールするとサウンドシステムのレイヤーがとても深くなってしまうので、より操作が簡単なPulseAudioを用います。
:::



# おわりに

:::note info
多くの標準MIDIファイル（SMF）はFormat1形式で保存されています。一方、「Synthesia」や「Chordana Play」ではFormat0形式のほうが扱いやすいです。
:::
:::note info
Windowsアプリの「Music Studio Producer」を使えばformat0形式で保存できます。
:::


＜＜前の記事　[【Linuxで音ゲーを実行#1】Linux Mintをインストールしたらヘッドホンから音が出なかった][51]

[51]:https://qiita.com/johnnystg/items/62ea57bd2c487a17000f

[【Linuxで音ゲーを実行#5】]　次の記事＞＞

# 参考サイト

http://maruyama.breadfish.jp/tech/smf/

https://yppts.adam.ne.jp/music/midi.html

https://nekonenene.hatenablog.com/entry/2017/02/26/001351

http://www13.plala.or.jp/kymats/study/MULTIMEDIA/midiStream_format.html

https://music.casio.com/jp/
Chromeのdevelopper toolでReactのstateがコピーできなかった時の対処方法

#経緯
クリップボードの容量の関係か何かは調べてないが、react developper toolでstateをコピーして解析しようとしたときに、コピーができなかった

#対処方法
https://devinschulz.com/copy-react-props-to-your-clipboard-in-google-chrome/

上記の手順で解決。ただし、手順5の変数名は記載されてるものではなく。$reactTemp0等の名前だった
Jsonを整形したい🐾

#Talend API Testerを使う方法

>1.リクエストを送る画面に遷移
2.「METHOD」をPOSTに変更
3.BODYに成型したいJsonを貼る
4.BODY下の以下ボタンを選択する
5.Text：「JSON」を選択
6.「Format body」を選択
7.END
グローバルIPの無い環境でMinecraft自宅サーバーを公開する

自宅Minecraftサーバーを公開するにあたって、システムがごちゃごちゃしてしまったので備忘録として残しておく。

<h1>自宅サーバーの現状</h1>
自作PCの新調に伴い、Desikminiで運用を行っていた環境を旧自作PCに移行した。OS:Ubuntu20.04
 <h3>問題点</h3>
 ネットワークはアパート全体で共用のものしか使えない→グローバルIPアドレスの取得・ポート開放が不可能


<h1>解決策</h1>
 <h3>当初</h3>
  ngrokを利用し、tcp25565ポートを開放したのちアドレスを参加者に共有<br>
   →PCの再起動などで変更があるたびに周知が必要となってしまう

 <h3>現在</h3>
  ConohaVPSのメモリ1GBプランを契約(月800円ほど)し、Tailscaleを用いてサーバー機とVPSを同一VPNネットワークに接続<br>
  VPS上でWaterfall(プロキシサーバー)を動かし、VPSの25565番ポートに来た通信をVPN内の自宅サーバー25566番ポートに転送、サーバーへの接続を可能にした。
<br>
<br>
ポート開放できない環境での自宅Minecraftサーバーの公開方法はこんな手段もありますよということで。
ブロック、スクリプト、スプライト「こども向けのSnap!かいせつ」

<h1>はじめよう</h1>
Snap!のがめんには５つのエリア（はんい）があります。
ステージエリア：スプライトをおいて、動かすところ
スプライトエリア：スプライトをえらぶところ
スクリプトエリア：ブロックをおいて、プログラムをつくるところ
パレットエリア：ブロックをえらぶところ
ツールバーエリア：ほぞんなどのその他のきのう

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/671164/70cade91-90ac-b291-d74d-37c5d95507b2.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/671164/341ebe54-8860-4c43-868f-1b6f807008c1.png)
スクリプトエリアに、スプライトエリアからブロックをいどうさせて、はじめのプログラムをつくりました。スプライトエリアからいどうさせたぶろっくをほかのブロックに近づけると、くっつくことのできる場合は、白い線が出てきます。この線のいちにブロックがくっつきます。

<h1>ぼうしブロックとコマンドブロック</h1>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/671164/2856a876-f3b9-ed6d-72d7-f317a5955892.png)
上がぼうしのように丸くなっているのが、ぼうしブロックです。ぼうしブロックは他のブロックに上がわでくっつくことができません。ぼうしブロックは、みどりのはたマークがおされたとき、スペースがおされたとき、といったように、たいてい「～したとき」をあらわす言葉がついています。
みどりのはたマークのブロックがあると、ツールバーエリアのみどりのはたマークをおすと、そこからプログラムが始まります。みどりのはたマークがないばあいは、プログラムはブロックがクリックされた時だけ動きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/671164/78749b76-de12-fcbe-01c1-aa4b42546f63.png)
whenと書かれたブロックは少しとくべつです。whenの中に書かれたじょうけんが成り立つと、そこからプログラムが始まります。ただし、ほかのプログラムが始まるまでは、whenと書かれたブロック以下のプログラムが動くことはありません。whenブロック以下のプログラムが動かないときは、右上の止まるマークが八角形ではなく、四角形になります。
whenブロック以下のプログラムが動くとき
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/671164/b51bf900-3ea1-1bea-7bc3-5881df2432dc.png)
whenブロック以下のプログラムが動かないとき
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/671164/adc78b90-ddd0-8370-935d-d89a241e1766.png)

他のブロックは、コマンドブロックと呼ばれます。それぞれのコマンドブロックは他のブロックに上がわも、下がわもくっつくことができます。ブロックをくっつけることによって、プログラムを作っていくことができるのです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/671164/2714762f-f6be-09b3-b6ce-a3ecb1dc9687.png)

多くのブロックは四角い形をしていますが、「かいくりかえす」のようなCのような形のブロックや、「もしなら、でなければ」のようなEのような形のブロックがあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/671164/c3ed680c-96c0-d324-3e2a-4bf3be91fc35.png)
このようなブロックは、コマンドブロックを囲むことができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/671164/64aa0127-3e33-f980-9cce-a8f3d7ac8b3e.png)

<h1><a href="https://qiita.com/wordplugin/items/6f6644aaa46acd54e7ed">A.スプライトとへいれつ実行</a></h1>
<h1><a href="https://qiita.com/wordplugin/items/63ed18eeab605bc3b9bd">B.ネストされたスプライト：アンカーとパーツ</a></h1>
<h1>C.表じブロックと表げん</h1>
<h1>D.じゅつ語とじょうけんのひょうか</h1>
<h1><a href="https://qiita.com/wordplugin/items/102d2cac8e4c8c3bbbb9">E.変数（へんすう）</a></h1>
<h1><a href="https://qiita.com/wordplugin/items/c9ff7b78781a4b95c7bf">F.バグをとる</a></h1>
<h1>G.ハイパーブロック</h1>
<h1>H.その他</h1>

<a href="https://qiita.com/wordplugin/items/434f17a878fdacc8febc">目次</a>
Advanced Custom Fields(ACF)の「Show in REST API」の使い方と注意点

ACFのv5.11から「Show in REST API」という機能が有効になりました。
これまではWP REST APIでACFのレスポンスを出力したい場合、
- プラグイン「[ACF to REST API](https://ja.wordpress.org/plugins/acf-to-rest-api/)」などを利用する
- 独自のエンドポイントを作成

などで対応していましたが、
この機能を使うとデフォルトの機能だけで対応可能になります。

## 使い方
カスタムフィールドを作成する際に、以下をオンにする。
![Screen Shot 2022-02-22 at 14.27.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251561/90e152a5-960c-a27d-022c-e90de80b72d0.png)

あとは、以下のようにAPIにアクセス。

```html:
投稿なら：http://localhost/wp-json/wp/v2/posts/記事ID
固定ページなら：http://localhost/wp-json/wp/v2/pages/?slug=固定ページスラッグ
```


## 注意点
「Show in REST API」機能では、レスポンスを軽くするためなのか、
```?acf_format=light``` というパラメータがデフォルトで有効になっています。

これの影響で、
例えば画像のレスポンスを「URL」、
テキストエリアのレスポンスを「自動的に段落に変換」で選択していても、
レスポンスが以下のようになってしまいます。

```json:デフォルト
"acf": {
 "thubmanail": 8,
 "text": "テキスト"
}
```

```json:本来はこうなってほしい
"acf": {
 "thumbnail": {
    "ID": 8,
    "id": 8,
    "title": "",
    "filename": "",
    "filesize": ,
    "url": "",
    "link": "",
    "alt": "",
    "author": "1",
    "description": "",
    "caption": "",
    "name": "",
    "status": "inherit",
    "uploaded_to": 5,
    "date": "",
    "modified": "",
    "menu_order": 0,
    "mime_type": "image/png",
    "type": "image",
    "subtype": "png",
    "icon": "",
    "width": "",
    "height": "",
    "sizes": {
      "thumbnail": "",
      "thumbnail-width": "",
      "thumbnail-height": ""
    }
  },
 "text": "<p>テキスト</p>"
}
```

以下のどちらかの方法で
画像URLやテキストのpタグなどを出力できます。

### リクエストURLに?acf_format=standard を加える
```html:こんな感じ
http://localhost/wp-json/wp/v2/posts/記事ID/?acf_format=standard
```

### functions.phpでデフォルトの設定をオーバーライド
```php
add_filter( 'acf/settings/rest_api_format', function () {
  return 'standard';
} );
```
:::note info
この場合acf_formatパラメータは不要
:::

:::note warn
functions.phpを変更後、記事を再度更新しないとレスポンスに反映されないです。
:::


## 参考
https://www.advancedcustomfields.com/resources/wp-rest-api-integration/#rest-api-field-types
[Salesforce]LWCで住所を郵便番号検索で自動入力するには

#LWCで住所を郵便番号検索で自動入力するには

標準コンポーネントである[lightning-input-address](https://developer.salesforce.com/docs/component-library/bundle/lightning-input-address)を画面に追加し、「address-lookup-placeholder」をtrueにすると、郵便番号等で検索できるルックアップ欄が出てきてくれます。

**ポイント: 自前で郵便番号マスタとか検索ロジックとか作る必要無し！**

#動作イメージ
1. 初期表示
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/573815/4e4af2b9-94fd-3542-1b50-40fa84654b07.png)

2. 郵便番号を入力時
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/573815/75726858-42b7-f94c-13e5-4f2b6fcb6d03.png)

3. 郵便番号を選択時
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/573815/13282999-8271-3b6e-a181-40c874b2e4b6.png)

#コード例

```HTML
      <lightning-input-address
        show-address-lookup="true"
        address-lookup-placeholder="🔍住所検索欄"
        address-label="住所"
        street-label="以降の住所"
        city-label="市区町村"
        country-label="国"
        province-label="都道府県"
        postal-code-label="郵便番号"
      ></lightning-input-address>
```

#豆知識
- 住所を構成する各入力欄のラベル(国、郵便番号、都道府県、市区町村、以降の住所)は自由に設定できる。
- 住所を構成する各入力欄の個数は、国項目を除いて増減できない。つまり、「番地と建物名を別項目にしたい」は不可。国項目だけは有無を指定可能。
- ルックアップ欄では、郵便番号だけでなく、日本語の文字(町名や建物名)でも検索可能。
コメントまみれなcrontabをキレイにしたい

# 困っていること
とあるサーバーの`crontab`コマンドを叩いたら、めっちゃ長いcron設定が出てきた。
よく見たら、コメントアウトされているエントリーが多くて、半分くらいゴミだった。
捨てるのが苦手なので、累々とゴミが積みあがっている状態でした。

なんとかしなければ。

# コマンド例
やった順にコマンドを書く

## 1.まるっと出す
```
crontab -l
```

crontabの設定がまるっと出力される。垂れ流しです。
長いので`crontab -l | more`などしないと滝のように流れます。

## 2.コメント行を除去
```
crontab -l | grep "^[^#]"
```

cronの設定内容のうち、#で始まらないものが表示される。
:arrow_right: cronとして有効なものだけが出てくる。

正規表現の`^[^#]` は

`^` 行頭記号＝各行の先頭が
`[^#]` #ではない任意の1文字

という意味です。
　
cronで今有効なものだけをサクッと見たい場合は、ここまでで大丈夫です。


## 3. 意味のあるコメントを復活
```
crontab -l | grep "^[^#]" -B1
```

2のコマンドだと人間用のコメントも消えてしまうので、grepに`-B1`を付けることで、

- 先頭が#でないもの
- さらにその1行前（BeforeのB)
- grepが出す区切り文字の--

となる。

:arrow_right: 有効なエントリーとその行の1つ前も出てくる。コメントとエントリーがセットになっているパターンの時有効である。

cronのエントリーの直前にコメントが書いてる前提のコマンドです。コメントが2行以上あるときは、、ごめん。

## 4. 不要な--を除去
```
crontab -l | grep "^[^#]" -B1 | sed -e "s/^--$//g"
```


`grep`の`-B`オプションを付けると不要な区切り文字「--」が入るので、`sed`で抜き取る。以下の3行のパターンに整形されるはず

```crontab
#コメント
0 * * * * /home/kanaxx/test.sh
(空行)
```


## 5. ファイルに保存
```
crontab -l | grep "^[^#]" -B1 | sed -e "s/^--$//g" > /tmp/crontab.cleaned
```

ただファイルにリダイレクトしただけ。
コマンドの結果がファイルに保存されます。

# 確認
## 現状のものとの差分確認
```
crontab -l | diff - /tmp/crontab.cleaned
```

crontabコマンドで**今設定されている実態**を取り出し、上で作ったファイルとのdiffをとる。

diff の第一引数は`-` ハイフン1個。これは標準入力を比較対象とすることになるので、`crontab -l` の出力内容と比較対象としている。以下のようにファイルに書きだしてdiffするのと同じ。
```
crontab -l > /tmp/crontab.now
diff /tmp/crontab.now /tmp/crontab.cleaned
```

crontab.newがいつのものか分からないのと、crontabが別の誰かによってすでに変更されていることもあるので、crontabコマンドから直結するほうがいい（と思う）

## ぶちこむ
```
crontab < /tmp/crontab.cleaned
```

覚悟を決めてエイっと。あとは祈る:pray:

# さいごに
最後の部分でcrontabコマンドに突っ込み直すところはやらずとも、コメントだらけで可読性の低いcrontabから大事なものを探すのが簡単にできるようになります。

捨てるのが苦手な人は何でもコメントアウトで残しちゃいますからね。crontabの古いエントリーをコメントアウトした状態で消せない人におすすめです。
Rails migrationで使うデータ型の備忘録

# はじめに
ここ最近AWS(ECS)ばかり勉強していたため、久しぶりにRailsの勉強したのですが、マイグレーションの際のデータ型をすっかり忘れてしまったため、備忘録として残そうと思います。


# データ型の種類
データベースにデータを保存する場合、データの形式を理解しておく必要があります。 このようなデータ形式のことを、「データ型」といいます。 代表的なデータ型には、以下のようなものがあります。
他にもデータ型はありますが、頻繁に使うものだけをピックアップしたので今回は省略します。

型	　　　　　内容
string	　　　 　文字列(255文字まで)
text	　　　　　長い文字列
integer　　　　整数
bigint	　　　　 整数
float	　　　　　浮動小数
decimal	　　　 精度の高い小数
datetime	　　　日時
timestamp	　　日時（Unixtime）
time	　　　　　時間
date	　　　　　日付
binary	　　　　バイナリデータ
boolean	　　　真偽値(true or falseのように二択の際使われる)

# 文字列の扱い
文字列を扱う際は選択肢として、「string」 と「text」があります。

string は「255文字」までしか取り扱えないため、255文字以上になる可能性があるのであれば、「text」を選択します。

例えばユーザー名は文字数が少ないため「string」になります。
コメントのような長い文章を保存する場合は「text」になります。

メールアドレスは string でOKと言われていることが多いそうですが、どうでしょう。RFC5321 で reverse-path や forward-path で利用できるのが 256文字、これらには区切り文字として < , > が含まれるため、実際には 254文字 となります。そのため、メールアドレスは 「string」 で問題ないとなります。

それ以外で256文字以上となってしまう可能性や、その際に運用フェーズで変更に対応できるかを検討した上で決めましょう。

# 小数の扱い
小数を使用する場合は、丸め誤差についてきちんと検討する必要があります。

「float」の場合、精度を指定できないため、丸め誤差が発生しても良い場合にしか利用できません。
「decimal」では全体の桁数と小数点以下の桁数を指定できます。

```ruby:使用例
t.decimal :hoge, precision: 12, scale: 2
```
例を読み解くと、全体の桁数を12にし、小数点以下の桁数を2としています。
これにより、誤差の問題を指定した精度のレベルでは解消することができます。

# IDの場合
整数値のIDについてはいろんなパターンがあると思いますが、増加量が止まることが想定できないことがあるのであれば、「bigint」を選択するべきでしょう。

# まとめ
データ型を選ぶ際にはいろいろと検討する必要がありますが、以下気をつけておくと良いかもしれません。
・必要なサイズ、精度が十分なものを選択する
・セキュリティ的に問題ない形式を選択する
・運用が始まって変更になっても問題ないか、問題があるならより変更が少ない方に倒す
・オプションなどをドキュメントで理解した上で使用する

今後もまとめを気にしつつ、とりかかれればいいなと思いました。
今回も見てくださりありがとうございました。
v-snackbarをvuexに登録するとtimeout指定時にエラーになる

##エラーメッセージ

>Error: [vuex] do not mutate vuex store state outside mutation handlers.

##原因
timeoutを設定しているとshowフラグがタイムアウト時にFALSEに変更される。

しかし、vuexのmutationsもしくはactionsを呼び出して書き換えているわけではないので上記のようなエラーが発生する。

##対策

```javascript:v-snackbarの属性値
// タイムアウトの設定値を-1にする
timeout="-1"
```

```javascript:actions
// スナックバー表示の後、非表示用のmutationを呼ぶ
export const actions = {
  setSnackbar( { commit }, snackbar) {
    commit('SET_SNACKBAR', snackbar)
    // スナックバーを設定したあとのsetTimeout関数で非表示用のmutationを呼ぶ
    setTimeout(() => {
      commit('CLEAR_SNACKBAR')
    }, 4000);
  },
  clearSnackbar( { commit } ) {
    commit('CLEAR_SNACKBAR')
  }
}
```

##参考
https://stackoverflow.com/questions/64106201/do-not-mutate-vuex-store-state-outside-mutation-handlers-vuetify-snackbar
module の include と extend

# はじめに
移植やってます。
( from python 3.7 to ruby 2.7 )
# wrap (Python)
https://qiita.com/superrino130/items/500063867f069608854f

前回の記事（`module`と`class`間）でホッとしたのですが、`module`と`module`間ですと、`NoMethodError`になります。
# 失敗 (Ruby)
```ruby
module M
  def my_decorator(meth)
    orig = method(meth)
    define_singleton_method(meth) do |*args, **kwargs|
      puts "Calling decorated method"
      orig.call(*args, **kwargs)
    end
  end  
end

module A
  include M
  module_function

  def _example
    puts "Called decorated method"
  end
  def example
    my_decorator(:_example)
    _example    
  end
end

a = A
a.example

# output
undefined method `define_method'
```
ぐぬぬ。
# 成功 (Ruby)
```diff_ruby
module M
  def my_decorator(meth)
    orig = method(meth)
    define_singleton_method(meth) do |*args, **kwargs|
      puts "Calling decorated method"
      orig.call(*args, **kwargs)
    end
  end  
end

module A
-  include M
+  extend M
  module_function

  def _example
    puts "Called decorated method"
  end
  def example
    my_decorator(:_example)
    _example    
  end
end

a = A
a.example

# output
Calling decorated method
Called decorated method
```
https://docs.ruby-lang.org/ja/latest/method/Object/i/extend.html

> Module#include は、クラス(のインスタンス)に機能を追加しますが、extend は、ある特定のオブジェクトだけにモジュールの機能を追加したいときに使用します。

ふむふむ、`Module`はインスタンスが生成されないので`include`では追加されないと理解。
# メモ
+ Ruby の extend を学習した
+ 百里を行く者は九十里を半ばとす
Snap!を始める「こども向けのSnap!かいせつ」

Snap!をはじめるには「<a href="https://snap.berkeley.edu/snap/snap.html">Snap!</a>」のページを開きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/671164/12724b28-4beb-525d-1fa2-876273557958.png)

左上の歯車のマークをクリックすると、一番上のメニューに「げんご」というのがあるので、これを押して「にほんご」を選びましょう。

ほぞんをおこなうために、左上の雲のマークをクリックし、「サインアップ」を選びます。
ユーザーめいなどを書いて、OKを押します。１３才以下の場合、でんしメールアドレスはほごしゃの方のものを使いましょう。

これだけでSnap!を始めることができます。
「こども向けのSnap!かいせつ」の目次

Snap!(<a href="https://snap.berkeley.edu/">公式ホームページ</a>）のこども向けの説明を<a href="https://snap.berkeley.edu/snap/help/SnapManual.pdf">Snap!マニュアル</a>にそって行っていきます。Snap!のバージョンは７です。４年生ぐらいまでの漢字を使います。

０，<a href="https://qiita.com/wordplugin/items/1c4e30cd887a9aa12d35">はじめに</a>
１，<a href="https://qiita.com/wordplugin/items/4158def39e181110c5bb">ブロック、スクリプト、スプライト</a>
２，ほぞん、ひらく、よみこみ
３，<a href="https://qiita.com/wordplugin/items/a816f7b50b77f9d8914d">ブロックをくみたてる</a>
４，ファーストクラスリスト
５，かた付きの入力
６，データーとしての手順
７，スプライトとオブジェクトしこうプログラミング
８、手順とオブジェクトしこうプログラミング
９，外の世界
１０、けいぞく
１１、ユーザーインターフェースのようそ
ふろくA、Snap！色ライブラリ
ふろくB　APLについて
SPSS ModelerのR拡張ノード関連記事へのリンク

SPSS Modelerの拡張ノードでRを利用する記事のリンクをまとめました。


|概要|記事|説明|ノード|
|---|---|---|---|
|R拡張導入|SPSS Modelerの拡張ノードでRを利用する<br>https://qiita.com/kawada2017/items/0bb68e0b577e02bb8c6a|SPSS Modeler - Essentials for Rの導入セットアップ|セットアップ|
|複数ファイル入力|SPSS Modelerでフォルダ内のCSVを一括で読み込む（拡張ノード版）<br>https://qiita.com/kawada2017/items/dab5c83a9f7c89928e5f|フォルダ内のCSVを一括読込|入力|
|正規表現|SPSS Modelerで正規表現を使う<br>https://qiita.com/kawada2017/items/0ef1c4d0a009a46db24a|subなどのRの正規表現関数|加工|
|タイムスタンプ補間|SPSS Modelerで欠損したタイムスタンプのレコードを補間する。取得できなかったセンサーデータの補間<br>https://qiita.com/kawada2017/items/be56ae15ded415253faa|seqを使ってタイムスタンプの補間をします|加工|
|日付補間|SPSS Modelerで欠損した日付のレコードを補間する。売上がない日のデータ補間<br>https://qiita.com/kawada2017/items/31fcc2e59277ac33c4e7|seqを使って日付の補間をします|加工|
|信号包絡線処理|信号包絡線処理をSPSS ModelerのR拡張ノードで行う<br>https://qiita.com/kawada2017/items/f14b00974c4432d2a548|fftなどを使って信号包絡線処理をします|加工|
|PLSモデル|PLSをSPSS ModelerのR拡張ノードで使用する - Qiita https://qiita.com/kawada2017/items/9af41585caae338790ad|PLS(Partial Least Squares Regression;部分的最小二乗回帰）を使ってモデリングとスコアリング|モデル|
|相関行列|SPSS Modelerで相関行列を見たい R拡張ノード編<br>https://qiita.com/kawada2017/items/5532232f29938335724a|corをつかった相関行列取得|出力|
|相関行列ヒートマップ|SPSS Modelerで相関行列のヒートマップ<br>https://qiita.com/kawada2017/items/07040aba22bd3a3e6cc0|corrplotをつかった相関行列ヒートマップ表示|グラフ|
|地図表示|Rのleafletを使ってSPSS Modelerのデータを地図にプロットする<br> https://qiita.com/kawada2017/items/3b40b0fc595482deeb66|leafletを使って、データを地図（OpenStreetMap）にプロットする|出力|
|R拡張デバッグ|SPSS Modelerの拡張Rノードの詳細ログ<br>https://qiita.com/ttsuzuku/items/6de084d3fd3a9c356fac|Rコードで発生したエラーを、ログファイルに出力|セットアップ|




参考：SPSS ModelerのPython拡張ノード関連記事へのリンク - Qiita 

https://qiita.com/kawada2017/items/055ace72f9e1949004f3
9: 配列途中,  連想配列

<font color="green"><h1>配列　昨日の途中</h1></font>

```
$data = [‘河野’, ’子安’, ’及川’, ’中辻’, ’地引’];
          [0]     [1]    [2]    [3]     [4]
```

このように配列の中身を参照しているのが上。

ブラケット（［~］）で括られた部分は、<font color="red">インデックス番号</font>または<font color="blue">添え字</font>と呼ばれ、配列の何番目の要素を取り出すのかを表す。

上の例では、配列\$dataに5つの要素が格納されているので、指定できるインデックス番号は0〜4の範囲となる。

配列へのアクセス

```
$配列名[インデックス番号]
```

ブラケット構文を利用する事で、配列の個々の要素に値をセットすることもできる。

具体例

```
<?php
$data[0] = ‘染谷’;
$data[1] = ‘伊藤’;
$data[2] = ‘河野’;
$data[3] = ‘笠川’;
//上記は配列$dataを新規に作成

$data[1] = ‘後藤’;
//1番目の要素を書き換え

$data[] = ‘榊原’;
//末尾に要素を追加

echo $data[4];
//結果: 榊原
```

ブラケットでインデックス番号が指定されている他は、スカラー型の変数に値をセットするのと同じ要領。

すでに存在するインデックス番号が指定された場合には、既存の値が書き換えられ、
インデックス番号が省略された場合には<font color="red">「その時点での最大インデックス番号+1」</font>が自動的に割り振られる。

特にインデックス番号を省略した構文は、要素を順に配列の末尾に追加していきたいという際によく利用するので、きちんと覚えておく。

<font color="pink"><h2>配列の内容を確認する</h2></font>

作成した配列の内容を手っ取り早く確認したい場合には、print_r関数を利用すると便利。

print_r関数は、配列をはじめ、オブジェクトなど複合型の変数を見やすい形で出力する。

例

```
<pre>
<?php
$data[0] = ‘染谷’;
$data[1] = ‘伊藤’;
$data[2] = ‘河野’;

print_r($data);


//実行結果

Array(
  [0] => 染谷
  [1] => 伊藤
  [2] => 河野

```

\<pre\>タグを利用しているのは、そのままでは結果に含まれるスペースや改行が無視されてしまうから。

<font color="green"><h1>連想配列の基本</h1></font>

複数の値を一つに束ねる配列は非常に便利だが、値を参照するために使えるのがインデックス番号（数値）だけだと不便に感じることもある。

そこで登場するのが<font color="blue">連想配列</font>である。

連想配列では数字キーの代わりに文字列キーを使って要素を管理する。

例えば下記のような住所録を想定してみる。

|名前|住所|
|:-:|:-:|
|山田太郎|千葉県府中市東町1-1-1|
|山口百恵|広島県福岡市北町2-2-2|
|矢沢永吉|群馬県三次市南町3-3-3|
|藤子不二雄|埼玉県豊田市西町4-4-4|
|ドラえもん|机|

このような表を通常の配列で表現しようとすると、次のようになる。

```
<?php
$names = [‘山田太郎’, ’山口百恵’, ’矢沢永吉’, ’藤子不二雄’, ’ドラえもん’];

$addresses = [‘ 千葉県府中市東町1-1-1’, ’ 広島県福岡市北町2-2-2’, ’ 群馬県三次市南町3-3-3’, ’ 埼玉県豊田市西町4-4-4’, ’机’];

```

名前は\$names、住所は\$addressesで、それぞれ個別の配列として表している。

しかし、このような状態は名前と住所の対応関係が分かりにくいという意味で好ましく無い。

そこで連想配列を利用すればこのような表を一つの変数で管理できる。

例

```
$members = [
   ‘山田太郎’ =>   ‘千葉県府中市東町1-1-1’,
   ‘山口百恵’ =>   ‘広島県福岡市北町2-2-2’,
   ‘矢沢永吉’ =>   ‘群馬県三次市南町3-3-3’,
   ‘藤子不二雄’ => ‘埼玉県豊田市西町4-4-4’,
   ‘ドラえもん’ => ‘机’,
];

echo $members[‘山田太郎’];
//結果: 千葉県府中市東町1-1-1

```

連想配列を生成するには、通常配列の場合と同じく[~]を使う。

連想配列の生成

```
$配列名 = [キー1 => 値1, キー2 => 値2,………];

```

通常配列の場合と異なるのは、連想配列では「キー名 => 値」の形式でキーと値との対応関係を表しているという点。

記号「=>」は、キー名を値に対応させなさい、という意味。

キー名には任意の文字列を指定できるが、文字通り<font color="red">値を取り出すためのキー（手がかり）</font>となる情報。
重複することはできない。

通常配列の場合と同じく、ブラケット構文を利用して、連想配列に新規の要素を追加したり、既存の要素を書き換えたりもできる。

```
$members[‘ダンテ’] = ‘魔界’;
//新たな要素を追加

$members[‘山田太郎’] = ‘段ボール’;
//既存の要素を書き換え

```

<font color="green">10: 多次元連想配列から</font>
cakePHPでtinyint型を扱うときの注意事項

cakePHPではMySQLのtinyint型をboolean型として扱ってしまいます。

cakePHPではtinyintを使うな！という意見もありますが、以下のようにvirtualFieldsで型変換することにより、tinyintを「0」「1」以外で使うことができます。

以下をModel内で定義する。以下はstatusカラム（tinyint型）の例。

```
    public $virtualFields = array(
        'status' => 'CAST(モデル名.status as CHAR)',
    )
```