OmniAICreator/Qiita-1.07M huggingface dataset:
ゼロからはじめる機械学習講座「データ分析入門とデータ可視化（Kaggleに挑戦）」

Numpy,Pandasライブラリを使って機械学習のデータ処理を体験し、線形回帰の問題を解いてみよう。
ラストは学んだことを活かして、Kaggleに挑戦してみよう。


## [サンプルソースの公開場所] 
https://github.com/techgymjp/techgym_ai
・実行環境がない場合はanaconda をinstall してください。

## 解説動画
https://youtu.be/rT-fhCmIhik

# ■0-A:numpyライブラリを使う: q3Mt.py

【問題】配列[9, 2, 3, 4, 10, 6, 7, 8, 1, 5]を作成して以下を実行しましょう。
□配列、次元数、要素数の表示します。
□配列*配列(掛け算)、配列を 3 乗、配列/2(割り算)の表示をします。 
□昇順、降順でソートした配列の表示をします。 
□最小値、最大値、合計、積み上げ合計、積み上げ合計/合計を表示します。
■解答は Tz6s.py

# ■0-D:matplotlibライブラリを使う: Kf74.py

【問題】100個の乱数を発生させた座標とy=sin(x)関数をグラフに表示しましょう。
■解答は N6pB.py

# ■0-E:ヒストグラム: Xb9t.py

【問題】10万個の乱数を発生させてヒストグラムを表示しましょう。
■解答は mY8e.py

# ■0-2:データフレーム: Jp9q.py

【問題】データフレームを表示してさらに、転置して表示しましょう。
■解答は X5gR.py(〜22行目まで)

# ■0-3:データフレーム: g5Hw.py

【問題】性別が男性の行のみを表示しましょう。
■解答は zP8u.py(17行目)

# ■0-4:データフレーム: Gu4t.py

【問題】男女別に勝ちの平均回数、勝ちの最大値、勝ちの最小値を表示しましょう
■解答は Ck8N.py(〜18行目まで)

# ■0-9A:データフレーム: Y8c2.py

【問題】各年齢で住所地別にじゃんけんの平均勝ち回数を表示しましょう。
■解答は t2Jv.py(28行目)

# ■0-11:データフレーム: C2kj.py

【問題】csvファイルへの書き込み、読み込みをしましょう。
■解答は dJ3a.py

# ■0-15:データ分析: Xh86.py

【問題】以下の操作をしてみてください。

□以下のデータをデータフレームとして読み込みます。
http://archive.ics.uci.edu/ml/machine-learning-databases/wine/wine.data 
□以下のデータの説明を表示して、データに index をつけます。
http://archive.ics.uci.edu/ml/machine-learning-databases/wine/wine.names
□データの個数や型を表示する(必要であればデータ全体を表示してみましょう)
□Alcohol のヒストクラムを表示しましょう。
□Alcohol 要約統計量を表示しましょう。
□['Alcohol', 'Malic_acid', 'Ash', 'Total_phenols', 'Color_intensity']のそれぞれのデータの散布図をプロットしてデータを可視化してみましょう
■解答は T7nf.py

# ■0-16:データ分析:Sk4a.py

【問題】前と同じデータを使用して以下の操作をしましょう。
http://archive.ics.uci.edu/ml/machine-learning-databases/wine/wine.data

□説明変数を'Alcohol'で目的変数'Color_intensity'として、 Alcohol(アルコール度数)と Color_intensity(色の濃さ)の単回帰分析のモデルを作りましょう。 
□回帰係数と切片を表示しましょう。
□'Alcohol'と'Color_intensity'の散布図を表示しましょう
□散布図の上に、計算した回帰係数と切片が示す直線を上書きして表示しましょう
□モデルの決定係数を表示しましょう。
(決定係数は 1 に近ければ良いモデルで、予測した値が実際の値に近くなります) 
■解答は uU9Y.py

【チャレンジ課題】時間が余った人は挑戦してみましょう!!!
Kaggleにアカウントがない方はhttps://www.kaggle.com にsign inしましょう。

# ■0-21:データ分析:D4qt.py

【問題】Kaggleにチャレンジします。以下に住宅価格を予測するコンぺティションがあります。 
https://www.kaggle.com/c/house-prices-advanced-regression-techniques/data

□訓練用データ(train.csv)とテスト用データ(test.csv)を読み込みましょう 
□データ型や大きさを確認して、さらに欠損値の状態を確認します。 
□単回帰分析モデルを作成します。(OverallQual を説明変数、SalePrice を目的変数として) 
□回帰係数と切片を表示します。
□テスト用データを使用して、SalePrice を予測します。
□kaggle の提出用で０田として、Id と SalePrice のみのデータをつくり、submission.csv という名前で保存する。
□kaggle のサイトに submit してスコアを表示させます。
■解答は d4XR.py

# AIエンジニア養成コース（機械学習・ディープラーニング）の概要
https://techgym.jp/about/machine_learning_course/
【Swift】外観モードの検知

# はじめに
https://qiita.com/SNQ-2001/items/9289e5a9730be6f94d81

私は以前、SwiftUIでの外観モードの検知について記事を投稿しました。
今回は以前紹介した方法とは別の方法でUIKitでも使用できる方法を紹介します。

# 方法
```swift
if UITraitCollection.current.userInterfaceStyle == .dark {
    // ダークモード
} else {
    // ライトモード
}
```



私はどの場面で使うことになったかというと、
SwiftUIでTabBarに色をつける際に使用しました。
```swift
import SwiftUI

struct ContentView: View {
    init() {
        let appearanceT: UITabBarAppearance = UITabBarAppearance()
        if UITraitCollection.current.userInterfaceStyle == .dark {
            appearanceT.backgroundColor = .white
        } else {
            appearanceT.backgroundColor = .black
        }
        UITabBar.appearance().standardAppearance = appearanceT
        UITabBar.appearance().scrollEdgeAppearance = appearanceT
    }
    var body: some View {
        TabView {
            Text("ホーム")
                .tabItem {
                    Text("ホーム")
                    Image(systemName: "house")
                }
            Text("検索")
                .tabItem {
                    Text("検索")
                    Image(systemName: "magnifyingglass")
                }
            Text("設定")
                .tabItem {
                    Text("設定")
                    Image(systemName: "gearshape")
                }
        }
    }
}
```

|ライトモード|ダークモード|
|:-:|:-:|
|![simulator_screenshot_663F6CC9-7692-4383-8D35-44D7834FF685.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/994ca551-9bf3-70c8-b22c-4c4233425755.png)|![simulator_screenshot_DCFECB85-A36A-4665-A803-6C8CC681D2BC.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/b65d7cc7-48d6-ca25-c989-25f715b4f9c8.png)|

# おわり
最近、開発モチベが上がってきて記事のストック増えてきました笑
TypeScriptでオブジェクトをループする方法

# はじめに
TypeScriptでオブジェクトをループするためにはいくつか方法があり、実装している中でいくつか詰まった点があったため記載します。

# 環境
TypeScript：Version 4.7.2
Node.js：v16.15.0

# ①for-in文
昔からあるfor-in文を使う方法があります。
```typescript
const obj = {
  foo: "FOO",
  bar: "BAR",
  baz: "BAZ",
};

for (const key in obj) {
  console.log(key, obj[key]);
}
```
私の環境では`tsconfig.json`を`"strict": true`で設定しているため、以下のエラーが出力されます。

```typescript
return new TSError(diagnosticText, diagnosticCodes, diagnostics);
           ^
TSError: ⨯ Unable to compile TypeScript:
memo.ts:271:27 - error TS7053: Element implicitly has an 'any' type because expression of type 'string' can't be used to index type '{ foo: string; bar: string; baz: string; }'.
  No index signature with a parameter of type 'string' was found on type '{ foo: string; bar: string; baz: string; }'.

271   console.log(key, obj[key]);
                              ~~~~~~~~~~~~

    at createTSError (/home/takaya/ProgrammingTypeScript/node_modules/ts-node/src/index.ts:859:12)
    at reportTSError (/home/takaya/ProgrammingTypeScript/node_modules/ts-node/src/index.ts:863:19)
    at getOutput (/home/takaya/ProgrammingTypeScript/node_modules/ts-node/src/index.ts:1077:36)
    at Object.compile (/home/takaya/ProgrammingTypeScript/node_modules/ts-node/src/index.ts:1433:41)
    at Module.m._compile (/home/takaya/ProgrammingTypeScript/node_modules/ts-node/src/index.ts:1617:30)
    at Module._extensions..js (node:internal/modules/cjs/loader:1159:10)
    at Object.require.extensions.<computed> [as .ts] (/home/takaya/ProgrammingTypeScript/node_modules/ts-node/src/index.ts:1621:12)
    at Module.load (node:internal/modules/cjs/loader:981:32)
    at Function.Module._load (node:internal/modules/cjs/loader:822:12)
    at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:77:12) {
  diagnosticCodes: [ 7053 ]
}
```

どうやら`obj`にtype`string`のパラメータを持つインデックスシグネチャがないと言われていますね。
そこでインデックスシグネチャを追加して実行してみます。
```typescript
type Obj = {
  [key: string]: string;
};

const obj: Obj = {
  foo: "FOO",
  bar: "BAR",
  baz: "BAZ",
};

for (const key in obj) {
  console.log(key as any, obj[key]);
}
```
実行してみると問題なく実行できました。
```typescript
foo FOO
bar BAR
baz BAZ
```

もう1つの方法として、ループ内で型を指定する方法があります。
```typescript
const obj = {
  foo: "FOO",
  bar: "BAR",
  baz: "BAZ",
};

for (const key in obj) {
  console.log(key as any, obj[key as keyof typeof obj]);
}
```
こちらでも問題なく実行できます。
```typescript
foo FOO
bar BAR
baz BAZ
```


# ②for-of文
`Object.entries`を利用してループすることができます。こっちの方が`for-in`文よりもスマートに出来ますね。
```typescript
const obj = {
  foo: "FOO",
  bar: "BAR",
  baz: "BAZ",
};

for (const [key, value] of Object.entries(obj)) {
  console.log(key, value);
}
```

# 最後に
他の記事を見ると、`for-in`文で実装しているものが多かったのですが、`tsconfig.json`を`"strict": true`で設定しているとエラーが出力されたため、解決するための記事を書いてみました。
Linux 「/proc」について（自分用メモ

●「/proc」ディレクトリはプロセス、ハードウェアおよびシステムリソースなどの情報を扱うための擬似的なファイルシステム。そのため、ハードディスク上にファイルは存在せず、システムが起動する際にメモリ上に作成されます。
「/proc」ディレクトリ配下のファイルはメモリ上に作成される仮想的なファイルなので、ほとんどのファイルはサイズは0（ゼロ）、ファイルの種類はempty（空）と表示されます。（「/proc/kcore」ファイルはファイルサイズとしてシステムのメモリ容量が表示されます。）

起動中のプロセスやカーネルが認識しているハードウェアの情報が格納されているディレクトリは「/proc」

●「/proc」ディレクトリ配下にある主なファイル。

ファイル名
・interrupts IRQに関する情報
・inports I/Oアドレスの情報
・bus/pci/divece PCIデバイスに関する情報
・bus/usb/devices USBデバイスに関する情報
・meminfo メモリに関する情報
・cpuinfo CPUに関する情報
・dma 使用中のDMAチャネルに関する情報
・modules ロードされているカーネルモジュールに関する情報
・scsi/scsi SCSIデバイスに関する情報

「/proc」ディレクトリ配下に格納されているファイルの多くはASCIIテキスト形式なので、catコマンドなどで内容が確認できます。

※IRQ(Interrupt ReQuest)とは、マウスやキーボードなどの周辺機器(デバイス)からCPUへの割り込み要求のことです。IRQには0から1、2、3のように順に番号がつき、そのうちのいくつかは特定のデバイスに割り当てられています。例えば0はシステムタイマー、1はキーボードに割り当てられています。
なお、IRQ番号が重複しているとハードウェアが正常に動作しないことがあります。

※I/Oポートアドレスとは周辺機器(デバイス)とCPUがデータをやり取りする際に使用する16ビットのアドレスのことです。「/proc/ioports」ファイルでは、どのデバイスにどのI/Oポートアドレスが割り当てられているのかが確認できます。
なお、I/Oポートアドレスが重複しているとハードウェアが正常に動作しないことがあります。

※DMAとは、CPUを介することなくメインメモリと周辺機器の間で直接的に情報転送を行う方式です。
DMAチャネルは周辺機器がDMAのコントローラ（制御装置）に対して情報転送を要求するために使用する通信経路の事

※また、以下のようなコマンドを使用して、これらのファイルの内容を効率的に確認することもできます。

■lspci
PCIデバイスに関する情報を表示します。

■lsmod
ロードされているカーネルモジュールに関する情報を表示します。

■lsusb
USBデバイスに関する情報を表示します。
1つのUSBデバイスの情報は「T:」がある行から始まります。


■lspci
PCI(Peripheral Components Interconnect)デバイスとはPCIバスに接続されたデバイスのことです。PCIデバイスにはネットワークカード(NIC:Network Interface Card)やSCSIカードなどがあります。
PCIデバイスの情報を表示するコマンドはlspciです。

lspci　[オプション]

※ -v　詳細表示（-vvでさらに詳細も可能）

●lspciコマンドの実行結果から以下のような情報が読み取れます。
・(1)PCI識別番号
・(2)PCIデバイスの種類　
・(3)ベンダー名（ベンダーID）
・(4)デバイス名
・(5)バスの速度(詳細表示のみ)
・(6)IRQ番号(詳細表示のみ)
・(7)I/Oポートアドレス(詳細表示のみ)
Golangでphpのarray_diff_assocをやる方法

```golang
//php array_diff_assoc replacement
func ArrayDiffAssoc(s1, s2 map[string]interface{}) map[string]interface{} {
	r := make(map[string]interface{})
	for k, v := range s1 {
		if c, ok := s2[k]; !ok || c != v {
			r[k] = v
		}
	}
	return r
}
```
Nuxt.jsをインストールしたら大量のワーニングが出た件

## 概要
今まで普通に`yarn install`でインストールし、`yarn dev`で立ち上がっていたプロジェクトで、
`yarn install`し直したら大量に以下のエラーが出現した


```
 WARN  [@vue/compiler-sfc] ::v-deep usage as a combinator has been deprecated. Use :deep(<inner-selector>) instead.   
```


このときのパッケージ情報は以下
```
  "dependencies": {
    "@nuxtjs/axios": "^5.13.6",
    "core-js": "^3.19.3",
    "nuxt": "^2.15.8",
    "vue": "^2.6.14",
    "vue-server-renderer": "^2.6.14",
    "vue-template-compiler": "^2.6.14",
  },
```

## 原因
https://dev.classmethod.jp/articles/warn-vue-compiler-sfc/

こちらにある通り、パッケージのバージョン指定を修正したところ、`yarn dev`で立ち上げ時のワーニングは消え去りました。
ただ、`yarn generate`したところまたもや同じ内容のワーニングが発生。
原因追求のためyarn.lockを確認すると以下の記載を発見

```
vue-template-compiler@^2.6.12, vue-template-compiler@^2.6.14:
  version "2.7.8"
  resolved "https://registry.yarnpkg.com/vue-template-compiler/-/vue-template-compiler-2.7.8.tgz#eadd54ed8fbff55b7deb07093a976c07f451a1dc"
  integrity sha512-eQqdcUpJKJpBRPDdxCNsqUoT0edNvdt1jFjtVnVS/LPPmr0BU2jWzXlrf6BVMeODtdLewB3j8j3WjNiB+V+giw==
  dependencies:
    de-indent "^1.0.2"
    he "^1.2.0"
```

package.jsonでバージョン指定してる意味がなく、最新の2.7系が使用されている模様…
依存してるパッケージのバージョン指定ってできるのか？と調べたところできるらしい

https://numb86-tech.hatenablog.com/entry/2020/05/26/170627

こちらを参考にpackage.jsonを更新
```
  "dependencies": {
    "@nuxtjs/axios": "^5.13.6",
    "core-js": "^3.19.3",
    "nuxt": "^2.15.8",
    "vue": "~2.6.14",　★修正
    "vue-server-renderer": "~2.6.14", ★修正
    "vue-template-compiler": "~2.6.14", ★修正
  },
  "resolutions": {　★追加
    "vue-template-compiler": "~2.6.14"
  }
```

`yarn generate`、`yarn dev`のどちらも問題なく動きました〜
JavaでWebアプリを開発するための初歩的知識

■背景
初歩的なWebアプリの作り方を理解したい。
Java(Servlet+JSP)で学習する。

■基礎知識
【webアプリケーションの基礎技術】
・ルーティング：webブラウザからのリクエストに合わせて、呼び出す処理を切り替える
・テンプレートエンジン：アプリケーションが保持するデータなどをHTMLのひな形と組み合わせてwebページを作成


【Javaでwebアプリケーションを開発するには】
以下の技術やツールを組み合わせる

-Servlet：サーバー上でJavaを実行する技術
-JSP：HTMLの中にJavaのコードを埋め込んで、動的にwebページを生成する技術
-Tomcat：ServletやJSPを実行するためのサーバー用アプリケーション

【参考】
https://web-dev.hatenablog.com/entry/java/servlet/dev-restful-app/table-of-contents
pivot_rootがInvalid argumentで動かない

# 概要

https://amasuda.xyz/post/2020-03-07-create-container-with-golang/

go言語でコンテナランタイムを自作する際にこのページを参考に書いていた所、pivot rootが動かない
# エラー
```bash
$ sudo ./main run /bin/sh
2022/08/14 18:38:44 mkdir newroot/putold
2022/08/14 18:38:44 bind mount to ./newroot
2022/08/14 18:38:44 run pivot_root
panic: pivot root: invalid argument
```

# 原因
元々のrootとnewrootがshared mountであった為、pivot root: invalid argumentが起こった。

https://tenforward.hatenablog.com/entry/2017/06/28/021019
より
元々のLinuxのデフォルトの挙動では、privateであるがsystemdがsharedに書き換えている為このようなエラーが起こった。

# 解決策
名前空間を分けたプロセスでbind mountを行う前にsharedを外す必要がある




runcのrootfsより
https://github.com/opencontainers/runc/blob/480e1298d8848f5a38518468161cf2620d76720c/libcontainer/rootfs_linux.go#L772


```go
// sharedを外す
if err := syscall.Mount("", "/", "", syscall.MS_SLAVE|syscall.MS_REC, ""); err != nil {　
		return fmt.Errorf("prepare RootFS: %w", err)
	}
// 古いrootfsを置く場所を作る
if err := os.MkdirAll("newroot/putold", 0755); err != nil {
		return fmt.Errorf("creating directory: %w", err)
	}
// bind mountを行いmountポイントを作る
if err := syscall.Mount("newroot", "newroot", "", syscall.MS_BIND|syscall.MS_REC, ""); err != nil {
		return fmt.Errorf("bind mounting newroot: %w", err)
	}
//pivot rootを行う
if err := syscall.PivotRoot("newroot", "newroot/putold"); err != nil {
		return fmt.Errorf("pivot root: %w", err)
	}

```

# 参考サイトとなぜ違いがあったのか？

参考サイトでは、特権コンテナ上で行っておりコンテナを作る際に既にsharedを外されていため
# 参考文献

https://amasuda.xyz/post/2020-03-07-create-container-with-golang/

https://tenforward.hatenablog.com/entry/2017/06/28/021019

https://github.com/opencontainers/runc/blob/480e1298d8848f5a38518468161cf2620d76720c/libcontainer/rootfs_linux.go#L772
VScodeでDjangoのライブラリが「Import XXX could not be resolved from source」になるとき

# 発生したこと
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1446396/4d29aa22-7578-29d9-ef5d-02fc90075fa1.png)
・URLの設定を記述する「urls.py」でdjangoのライブラリを使おうとするとVScodeがエラーを知らせてきた
・16行目「from django.urls」の部分で(黄色い波線)
`Import django.urls" could not be resolved from sourcePylancereportMissingModuleSource`
と言われている
# 問題の内容
・対応するソースファイルがないインポートに対する診断
・django.urlsがないってことらしい
# 仮説/前提条件
・仮想サーバーは立ち上げられるのでdjango自体が入っていることは間違いない
・djangoのモジュールを探す場所が違う
・importしなきゃいけない何かがある
# 解決方法
①表示→Command Palette...を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1446396/43acf4b6-07f7-db12-60ec-d4d8aa17e984.png)
②インタープリンタを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1446396/7ce3f9a8-0843-9f3d-6059-d939be98d2ac.png)
③「Python3.9.13 64-bit」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1446396/2ff41245-19b5-50fc-5f10-80a14651b996.png)
④治った
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1446396/01f0676a-060b-6049-995e-2fa7a85171cf.png)
# 原因
・VScodeに入れてる「pylance」という拡張機能はpythonインタープリターを使用してコードを分析し、コードの作成中にエラーをマークする
・この時に仮想環境のインタプリンタが設定されていると、djangoのmoduleが認識されなかった
# インタプリンタとは
プログラミング言語を、コンピュータが解釈・実行できる形式に変換しながら同時に少しずつ実行していくソフトウェアのこと。前も調べたことあったわこれ。
【Jetpack Compose】paddingで指定した余白に背景色が適用されない

# 概要
Cardの背景の色指定をしたのですが、paddingで指定した余白の分だけ背景の色の塗りつぶしができませんでした。
# コードとプレビュー
```Kotlin:card.kt
    Card{
        Text(
            modifier = Modifier
                .padding(start = 10.dp, end = 10.dp)
                .background(color = Color.Yellow),
            text = "先攻プレイヤー",
            fontSize = 30.sp
        )
    }
```
![スクリーンショット 2022-08-15 14.40.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524029/96c3ef63-2e46-ae63-be30-3d697703d7f8.png)
# 原因
Modifierの順番に問題があったようで、先にpaddingを決めてしまうと、余白には背景色が適用されなかった
```Kotlin:解決後.kt
    Card{
        Text(
            modifier = Modifier
                .background(color = Color.Yellow),
                .padding(start = 10.dp, end = 10.dp)
            text = "先攻プレイヤー",
            fontSize = 30.sp
        )
    }
```
![スクリーンショット 2022-08-15 14.44.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524029/ea72261b-10df-d1bc-a869-9576a16df937.png)
spacyで指定した単語から係り受けのリンクをたどる

言語処理ノックに似たようなのがあって,spacｙ番は探してもなかったので。
単語の登録に苦労したけど、そちらは必要な調べてください。

```python
import spacy
from spacy.language import Language
from spacy.matcher import PhraseMatcher
from spacy.tokens import Span

nlp = spacy.load("ja_core_news_sm")

#なんか解析したいテキストのファイル名
input_fn="/Users/satoshi/Downloads/[LINE] 引きこもり当事者と家族の会のトーク.txt"

with open(input_fn) as f:
    lines = f.readlines()

#探したいワード
topics=["障害年金","生活保護"]

N=17000
text=" ".join(lines)
text=text.replace("\n","").replace("\t","")


def get_word_to_head(w):
    chain=[]
    while w!=w.head:
        chain.append(w.text)
        w=w.head
    chain.append(w.text)
    return chain



    
chains=[]
for i in range(20):
    print(N*i,min(len(text),(i+1)*N))
    doc=nlp(text[(N*i):min(len(text),(i+1)*N)])
    for w in doc:
        if w.text in topics:
            chains.append(" ".join(get_word_to_head(w)))
               

    
chains=[]
for i in range(20):
    print(N*i,min(len(text),(i+1)*N))
    doc=nlp(text[(N*i):min(len(text),(i+1)*N)])
    for w in doc:
        if w.text in topics:
            chains.append(" ".join(get_word_to_head(w)))
                          
            
sorted(list(set(chains)))
['生活保護 15万 13万',
 '生活保護 あり',
 '生活保護 い',
 '生活保護 さ 人 多い 減額 聞き きい こと',
 '生活保護 しれ',
 '生活保護 そう 思い',
 '生活保護 なかっ 援助 感じ',
 '生活保護 なる 思い 難しい こと 面 思い',
 '生活保護 世帯 行く こと 思っ わかり 理解 考え 😊 52 突然 もやもや 投票 切ら いる 理解 頑張っ さ 思い しれ 許せ かけ 政党 呼び かける …',
 '生活保護 人 来 申請 31 @ 閉じ ありがとう 勝手 ござい 願い さん 教え 料金 42 いる さん 中 守っ 仕事 辞め こと ？ 言わ 動い し どう 休ん ない 疲弊 決断 なり',
 '生活保護 厳し 受け',
 '生活保護 受け なっ まぎらわし さん はじめ すみ 願い smile 紹介 ござい わかり 拒否 詰ん',
 '生活保護 受け 思い 分かっ 行っ 断ら 貰え 1人暮らし ござい',
 '生活保護 宣伝 死ん なっ',
 '生活保護 抜け なっ 行っ 出し こと ねぇ 申請',
 '生活保護 持ち家 出 限ら ある 思い さ 人 多い 減額 聞き きい こと',
 '生活保護 持っ 通り',
 '生活保護 料金 42 いる さん 中 守っ 仕事 辞め こと ？ 言わ 動い し どう 休ん ない 疲弊 決断 なり',
 '生活保護 減額 聞き きい こと',
 '生活保護 相談 行っ 断ら 貰え 1人暮らし ござい',
 '生活保護 貰い なる もらう 08 ござい 無知 恥ずかしい ある 控除 考え ない 割引 聞い みこ',
 '生活保護 貰え さん すい 疑問 暮らし 聞い ござい m 子供',
 '生活保護 貰え 思っ い 歳 八十 やっ 若い ユル やっ 変 すごい 思い 相続 疎い わかり おら なる 思い 難しい こと 面 思い',
 '生活保護 貰え 現状 感じ 状況 いる よぎり さん 声 願い 申請 手伝っ 多かっ そう',
 '生活保護 貰え 限り 多い 思い 宣伝 死ん なっ',
 '障害年金 36111',
 '障害年金 つい き',
 '障害年金 なさ 聞き あり いい 思い 受け 感じ',
 '障害年金 もらい 働け 良い 解体 あり 古い し ない 行か 相談 持っ てらっしゃる',
 '障害年金 もらい 社会 なる いい 思い',
 '障害年金 もらう 難しい',
 '障害年金 ハードル 高い 状態 分かり 助かり 年金 かけ 受給 知り 年金 年金 違い 手伝っ し 働か 事 調べ 来 欲しい 書い 疾患 ？ 書き 状態 さ',
 '障害年金 制度 入れ なる 教え',
 '障害年金 受け 方 い',
 '障害年金 受給',
 '障害年金 受給 それ 暮らし 方 いい かかり ない 無理 たか 継続 無理 ネット 大した こと 売る どう し いい 思い 共有 方 いい みんみん',
 '障害年金 大事',
 '障害年金 手伝っ でき',
 '障害年金 手帳 審査 もらっ 受け 方 い',
 '障害年金 生活保護 あり',
 '障害年金 申請 納め 受給',
 '障害年金 貰える 疾患 あり いい 思い 受け 感じ',
 '障害年金 賄え 厳しい ない 無理 とる いる 実感 高い 難しい 古家 更地 思い 使え   やっ 調べ 分かっ し   分かり なら 支え キッカケ 教え 意見 なり praying なっ 生活保護 そう 思い']
```


某オープンチャットでこの辺のワードで公金をもらってる人に対して怒ってる人がいたので解析してみましたｗ
個人的にバージョン対応を待っているマネージドサービス一覧


## RDS for MySQL のバージョン MySQL `8.0.30` 【リリース済み】

2022/11/10 に `8.0.31` はリリースされている

2022/07/26 に `8.0.30` はリリースされている

2022/08/15 現在 RDS for MySQL が対応しているバージョンは `8.0.28` まで

[MySQL on Amazon RDS versions - Amazon Relational Database Service](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/MySQL.Concepts.VersionMgmt.html)

[MySQL バージョン情報 | OSSサポートのOpenStandia™【NRI】](https://openstandia.jp/oss_info/mysql/version/ )


## AWS CloudWatch agent for Ubuntu Server `22.04`

2022/08/15 現在 Ubuntu Server の対応バージョンは `20.04`, `18.04`, `16.04`, `14.04`

（※ x86-64 アーキテクチャ）

[Collect metrics and logs from Amazon EC2 instances and on-premises servers with the CloudWatch agent - Amazon CloudWatch](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/Install-CloudWatch-Agent.html)
Salesforceで入力規則を作成するための注意点～プロファイルを設定する場合

Salesforceで入力規則を作成して数式にプロファイルを設定するための注意点です



#### 例：商談オブジェクトのフェーズを「Closed Lost」（失注）にさせない。しかし、プロファイル「システム管理者」は「Closed Lost」（失注）にできる


よくある数式はこちらです

「数式」
AND(
$Profile.Name <>"システム管理者",
ISPICKVAL(
StageName,"Closed Lost"))

しかしながら、この数式ではうまく動かないことがございます。


### 動かない原因　「組織情報」が日本語ではない

入力規則で使われるプロファイル名は「組織情報」の言語のデフォルト値になります
![言語デフォルト値.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/ee11cec4-6233-ee52-5cd1-6dd331cd65e1.png)

例えばこちらの組織情報の「言語のデフォルト値」が「英語」（English）の場合、数式はこのようになります

「数式」
AND(
$Profile.Name <>"System Administrator",
ISPICKVAL(
StageName,"Closed Lost"))

#### 参考ヘルプ：組織のデフォルト言語設定と $Profile.Name の値の関係について
https://help.salesforce.com/s/articleView?id=000317298&type=1


では、言語のデフォルト値に関わらずに入力規則をしたい場合、どうしましょうか

### 設定方法1 プロファイルIDを入力規則に設定する

プロファイルIDを入力規則に組み込みます

![プロ01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/de9dd18f-cbe4-47d7-2479-8d12568f34a6.png)


なお、プロファイルIDは上部画面のようにプロファイルから確認できます。

数式は以下となります

「数式」
AND(
$Profile.Id <>"00e5h000003RzF1",
ISPICKVAL(
StageName,"Closed Lost"))

しかしながら直接IDを打つのはあまりよろしくないので、設定方法2を紹介します

### 設定方法2 カスタム権限を作成しプロファイルで割り当てる


次にご紹介するのはカスタム権限を作成しプロファイルにカスタム権限を割り当て、入力規則にそのカスタム権限を割り当てる方法です

#### ステップ1 カスタム権限を作成
今回はカスタム権限「Opportunity」を作成します
![カスタム権限01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/26c368e2-5860-e77d-b8fd-ce77e886afd0.png)

#### ステップ2　プロファイルにカスタム権限を追加
![カスタム権限02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/85f522fd-759a-e62d-5dad-066cb2ac587d.png)

![カスタム権限03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/6d56dd4e-e623-3a75-397e-eee25ff4866a.png)


#### ステップ3  カスタム権限を組み込んだ入力規則の数式作成

「数式」
AND(NOT($Permission.Opportunity),
ISPICKVAL(
StageName,"Closed Lost"))

これでカスタム権限を追加したプロファイルに対して入力規則を組み込みことができます
RustでTwitter Textライブラリーを導入して、ツイートの文字数をとります。

# コード
## ライブラリーをインストール

Cargo.toml

```rust
twitter-text = "0.2.0"
twitter_text_config = "0.2.0"
```

## ツィートの数の計算

```rust

let parse_result = twitter_text::parse("これは内容ですね", twitter_text_config::default(), false);
let count = parse_result.weighted_length

```


# 以上です。
CompTIA Security+ 勉強法

# はじめに
CompTIA Security+に合格したので、勉強法や試験の感想などを簡単にまとめます。
スコアは786だったのでギリギリでした（満点900で合格点は750）。
海外だと結構有名な資格のようですが、日本だと知名度が低く、あまり情報が
ないと思いますので、どなたかのお役にたてば幸いです。

# CompTIA Security+

### 概要

ベンダーニュートラルで業務上必要とされるセキュリティが学べる資格です。

https://www.comptia.jp/certif/core/comptia_security/

米国国防総省で情報資産を扱う役職の方は取得が必須のようです。
なんかものものしいですね。

https://www.comptia.jp/information/2019/05/comptia-dod.html

### 試験内容
４択問題が中心ですが、CompTIA独自の内容としてパフォーマンスベーステストというものがあります。
詳しくはリンクをご覧ください。

https://www.comptia.jp/certif/core/comptia_security/#exam


### 受験料

税込 ¥47,815
高いです。私は会社が受験料払ってくれましたが、そうでなければ
なかなか気軽には受けられない試験ですね。

## FREE RETAKEバウチャー
そんな厳しいCompTIAですが、FREE RETAKEという素晴らしい制度があります。
FREE RETAKEとは１度目の試験が不合格な場合、2度目の試験は無料で受験できる制度です。
今までは期間限定のサービスだったようですが、現在はいつでもFREE RETAKEが利用できるようです。
CompTIAを受験される方は必ず利用しましょう。

https://www.comptia.jp/information/2022/02/freeretake-202202.html

# 筆者について

### 受験時の保有知識

- エンジニア３年目(AWS上でのシステムの構築や保守がメイン)
- 保有資格
    - AWS認定(CLF, SAA, DVA, SOA, SAP, DOP, MLS, DAS, DBS, SCS, ANS)
    - 情報処理技術者試験 (FE, AP)
    - CompTIA (Network+) 
### 受験の動機
仕事ではAWSなどのドキュメントをよく読むのですが、セキュリティに関しての記載が
理解できなかったことが多々あったので、一度セキュリティを体系的に勉強したかったためです。
また、秋に安全確保支援士を受験予定のため、その準備としての意味もありました。


# 勉強方法

### 使用教材


最初に以下の本を使用しました。
試験範囲を網羅してますし、演習問題も豊富なので、この一冊をやりこめば
合格ラインにのると思います。演習問題はオンラインの専用ページで解くこともできます。

https://www.amazon.co.jp/-/en/Mike-Chapple/dp/1119736250/ref=sr_1_7?crid=3G4NO6ENUJ17K&keywords=CompTIA+Security+Plus&qid=1660537951&sprefix=%2Caps%2C803&sr=8-7

また以下のUdemyの講座も購入しました。
上記の本で理解が難しかった内容の補助に活用しました。

https://www.udemy.com/course/securityplus

模擬試験もあります。

https://www.udemy.com/course/security-601-exams/

### 勉強時間
131時間ほど勉強しました。時間の記録にはToggle使ってます。
シンプルでおすすめです。

https://toggl.com/

# 受験後の感想
### 難易度
結構難しかったです。一つ一つの問題の難易度はそれほどでもないのですが
CompTIAは合格点が高く設定されており(満点900で合格点750)
試験終了ボタンを押すときには不安でした。
合格はしましたが、決して楽ではありませんでした。

### 受験して得たもの
セキュリティに関しての基礎を学習することができました。
AWSのセキュリティに関してのドキュメントなどを読んでも
受験前よりも内容を理解できるようになりました。

また安全確保支援士のテキストを見てもSecurity+で学習したことが
多数記載されており、安全確保支援士の事前準備としてもとても有意義な試験だと思います。

セキュリティの基礎に関して勉強したい方にお勧めできる資格だと思います。
【PHP】なぜ初期化をするのか？

# コード
```PHP
<?php
foreach ([1,2,3,4]as $a){
    if($a%2 === 0){
        $b = $a;
    }
    echo $b,PHP_EOL;
}
```
# 上記の場合はエラーになる
```
PHP Warning:  Undefined variable $b
```

# なので

```PHP
<?php
$b = 0;
foreach ([1,2,3,4]as $a){
    if($a%2 === 0){
        $b = $a;
    }
    echo $b,PHP_EOL;
}
```

# 結果
```
0
2
2
4
```
Next.js＋Firebase Hostingでブログ構築

Next.js＋Firebase Hostingでブログ構築しました。今後はこちらに投稿します。。

[ブログ](https://ty-gcp-blog.web.app/)
[ソース](https://github.com/gomagon/nextjs-blog/)

## 参考にさせていただいた情報

[Next.jsでのブログ立ち上げ](https://reffect.co.jp/react/nextjs-markdown-blog)

[ssgでnext/imageを使うとビルドエラー](https://qiita.com/toshikisugiyama/items/9d9ada2de0cedb03a21e)
→imgを使うか、[ここ](https://ebisu.com/note/next-image-ssg/)を参考にする

[Next.jsでページ共通の処理をする](https://zenn.dev/catnose99/articles/2169dae14b58b6)

[React-playerがHydration errorを出す](https://stackoverflow.com/questions/72235211/trying-to-use-react-player-throws-a-hydration-error)
→react-playerをdynamic importする
```javascript
import dynamic from 'next/dynamic'
const ReactPlayer = dynamic(() => import("react-player"), { ssr: false });
```

## Firebase Hostingにデプロイするときの注意点

・出力ディレクトリはoutを指定
・next.config.jsにtrailingSlash: trueを追加
・scriptsに"export": "next export"を追加
```:package.json
  "scripts": {
    "dev": "next dev",
    "build": "next build",
    "start": "next start",
    "lint": "next lint",
    "export": "next export"
  },
```
・ビルド→エクスポート→デプロイという流れで行う。これを自動化するにはfirebase.jsonを修正すればいい。firebase.jsonのhostingの下に"predeploy": "npm run build && npm run export",を追加。
```:firebase.json
{
  "hosting": {
    "predeploy": "npm run build && npm run export",
    "site": "<app名>",
    "public": "out",
    "ignore": [
      "firebase.json",
      "**/.*",
      "**/node_modules/**"
    ]
  }
}
```
そして、
```
firebase deploy --only hosting:<app名>
```
でデプロイ
Python自作パッケージのimport時にVSCodeで警告が出る問題の解決

# 概要
- VSCodeでPythonのソースコードを書いている際、自作のパッケージを使うことはよくある。
- しかし、自作パッケージ(あるいは自作モジュール、自作ライブラリ)のimportはVSCodeにおいては適切な設定をしなければ警告対象となる。
- 警告がでたままにしておくと、バグの作りこみの確率が上がる可能性があるため、消したい。
- そのため、".vscode/settings.json"の"python.analysis.extraPaths"に絶対パスで指定する。

# 前提
- OS: Windows 11 Pro(バージョン:21H2/OSビルド22000.856)
- VSCode: 1.70.1 (user setup)
- Python: 3.10.3

# 背景
- Pythonでコーディングする際、別のアプリでも再利用したい機能はいくつもある。
- それらの機能を実現するためのソースコードはパッケージとして切り出し、再利用したい。
- Pythonではソースコードの再利用するためには、別ファイルでパッケージとしてコーディングし、importする。
- なお、カレントディレクトリにパッケージを収めたファイルがあってもVSCodeはそれを認識できない。
- パッケージを見つけられないVSCodeはimport可能なパッケージがないと警告をあげる。
- この警告を消したい。

# 現象
- 以下の構造で、以下のファイルがある場合のVSCodeの画面を示す。
- 「利用できるクイックフィックスはありません」と表示されるが、実際には`python main.py'で実行可能である。
![VSCodeの画面(警告あり)](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208295/713393ad-c348-cafc-462c-d2bc6957e4a5.png)

# 発生した状況
- 以下がディレクトリ構造とファイル内容
```
root/
  ├ common/
  │    └ mypackage.py
  └ main.py

```
- 実行するPythonスクリプト
```main.py
import common.mypackage as mypkg

mypkg.MYHEY().hey()
```
- パッケージを記載するファイル
``` mypackage.py
class MYHEY:
    msg=None

    def __init__(self,msg='Hey!'):
        self.msg = msg

    def __del__(self):
        pass

    def hey(self):
        print(self.msg)
```

# 解決方法
- ".vscode/settings.json"の"python.analysis.extraPaths"に絶対パスで指定する。
- 今回は、WSL2上のファイルをWin側でVSCodeを用いて編集している場合を考える

```settings.json
{
    "python.analysis.extraPaths": [
        "\\\\wsl.localhost\\<OS名>\\<実行するカレントディレクトリ>"
    ]
}
```
- 以下のように警告が消える
![VSCodeの画面(警告なし)](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208295/f753593a-fc7f-0084-21ac-fb5b5ae214b4.png)

# おわりに
- 警告自体は出ていても実行は可能だが、より致命的な問題を見落とす原因になると考えている。
- 何よりもすっきりとしている方が気持ち良いのではないだろうか。
- Enjoy VSCode!

# 参考サイト
- [ディレクトリ構成図を書くときに便利な記号-Qiita](https://qiita.com/paty-fakename/items/c82ed27b4070feeceff6)
Docker-composeでmariaDBコンテナが立ち上がらない

# 背景
タイトルにもある通り、Dockerを使って開発を行なう際にmariaDBコンテナが立ち上がらなく解消するまでに時間がかかったのでメモ。
コンテナの構成はよくある```nginx/php/db/phpmyadmin```のような感じ。
ただ、いつもはMySQLを使っていてmariaDBを使うのは初めて。

# エラー時の状況
docker-compose.ymlを書いて```docker-compose up -d```。
するとdbコンテナだけがなぜか立ち上がらない…

その時のdbコンテナに関するlogの内エラーは↓の通り。
```
db | 2022-08-14  7:32:23 0 [ERROR] InnoDB: Plugin initialization aborted with error Generic error
db | 2022-08-14  7:32:23 0 [Note] InnoDB: Starting shutdown...
db | 2022-08-14  7:32:23 0 [ERROR] Plugin 'InnoDB' init function returned error.
db | 2022-08-14  7:32:23 0 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.
db | 2022-08-14  7:32:23 0 [Note] Plugin 'FEEDBACK' is disabled.
db | 2022-08-14  7:32:23 0 [ERROR] Could not open mysql.plugin table: "Unknown storage engine 'InnoDB'". Some plugins may be not loaded
db | 2022-08-14  7:32:23 0 [ERROR] Unknown/unsupported storage engine: InnoDB
db | 2022-08-14  7:32:23 0 [ERROR] Aborting
```

InnoDBで何か上手くいっていないようだけど、うーん分からん…

# 解決に至るまで
エラー文を読んでも理解できなかったので、エラー文そのままでググってみると解決方法が書かれた記事がいくつか出てきたのでそれぞれやってみた。
### 使っていないボリュームを削除する
これまでに使っていたボリュームが悪さをしているような記事が一番多かった。
対象のvolumeと、ついでに使っていないvolumeも併せて削除。
```
# Volume の一覧で対象のvolumeを確認
$ docker volume ls

# 対象のvolumeを削除
$ docker volume rm hogehoge
```

しかし状況は変わらず…

### DBの設定を修正する
M1のMacだとinnodb_use_native_aioをオフにしないとInnoDBが起動できない場合があるみたい。
docker-compose.ymlのdbコンテナのところに以下を追加。
```command: mysqld --innodb_use_native_aio=0```

```docker-compose down```&```docker-compose up --build```したが変わらず…

※後に分かりましたが、↑で解消する場合は以下のようなエラー文が出ているようです。なので今回のエラーに対しては見当違いな対応でした。
```
 [ERROR] InnoDB: Linux Native AIO interface is not supported on this platform. Please check your OS documentation and install appropriate binary of InnoDB.
```

### mariaDBのバージョンを変えてみる
「特定のバージョンだと上手く起動しない」みたいな記事があったので、ダメ元で変えてみた。
が予想通りエラーは変わらず…

# 解決した方法
他の案件でmySQLを使っているから、そこと干渉してるのかな。。。とも思って諦めようと思ってましたが、最終的には↓で解決。
https://github.com/MariaDB/mariadb-docker/issues/267

抜粋すると、dbコンテナにマウントするディレクトリ内に```ib_logfile0```というログファイルがあるのでそれを削除。
これをやった後、```docker-compose down```&```docker-compose up -d```でmariaDBコンテナが無事に起動！！

github様ありがとう…m(_ _)m
slackにAzureDevOpsReposのPRコメント通知を送る

# Appをslackワークスペースに追加

「Azure Repos」を追加する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647946/581e9524-a469-b35c-b437-1b9b713707a0.png)

# 通知を送りたいチャンネルにAppをinvite

`/invite @Azure Repos`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647946/7c39ddb6-58d1-368c-6dbf-f84c78b3fa83.png)

# DevOpsにサインインする

`/azrepos signin`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647946/5e3b9270-168e-288d-88a4-3814aa4c0874.png)

「Sign in」ボタンをクリックして認証します。（ブラウザに遷移します）
6桁くらいのコードがブラウザに表示されるので、そちらをslack側で入力すると、下記のようにサインインが完了します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647946/57d5df3e-cd72-1693-ce80-665418933ab7.png)


# リポジトリをサブスクライブ

`/azrepos subscribe [リポジトリのURL]`

リポジトリのURLはこちらを参考に: `/azrepos subscribe https://dev.azure.com/myorg/myproject/_git/myrepo`
DevOpsのReposタブならどこ開いててもいけると思いますケド

# 通知するサブスクリプションの追加

`/azrepos subscriptions`

するとslack上でこんなメッセージが表示されますので、「Add subscription...」をクリック（動作はもっさりですのでのんびりした心でいきましょう）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647946/e789ecfc-24ce-e93f-7984-294a6bb687ac.png)

下記をプルダウンから設定
Which event...?: `Pull request commented on`
Repository: `通知対象とするリポジトリ`(複数のリポジトリをサブスクライブしてると`Any`が選べる)
Target branch: `通知対象とするPRのマージ先ブランチの指定`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647946/cee454b9-4c6a-fcb8-5343-001bc2f5d20b.png)

「Save」をクリックして、下記メッセージが表示されてたら通知設定完了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647946/bcb4357b-0b3a-0f27-629e-391bc44cf675.png)

# テストしてみようか

こんなコメントをしてみたら......
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647946/f3c7112d-591f-2d27-b3a2-f1bb44289abf.png)

slackに通知が来ましたね！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647946/ce14c454-75d5-7dd6-6174-9a2a98969dac.png)

# 備考

slackワークスペースへのアプリ追加は管理者じゃないとできなかったような気もする。
そのへんはググってくださいな。
DjangoFormsのファイル指定でvalidationする方法

【mui備忘録】
DjangoのFormsでCSVファイルのみを受け付ける方法。

1、CSVファイル以外のデータファイルが送られてきた際にValidationで通さない。
2、CSVファイル以外のデータファイルが送られてきた際にアラートを表示。

### forms.py
```python

from django import forms
from django.core.validators import FileExtensionValidator

class UploadForm(forms.Form):
    testfile = forms.FileField(
        validators=[FileExtensionValidator(['csv'])]#CSV指定
    )

```

### index.html
```html

{% if form.errors %}
    <ul>
    {% for error in form.testfile.errors %}
        <li>{{ error }}</li><!--form内にエラーがある際に表示させる-->
    {% endfor %}
    </ul>
{% endif %}

<form method="POST" class="form" enctype="multipart/form-data">
    <div>
        {{ form.testfile }}
    </div>
</form>

```

他にも、自作でValidationを充てることもできますので別の記事で載せたいと思います。
【AWS】AWS Cloud Questで遊んでみた


# 概要
* AWS Cloud Questとは？↓
>AWS Cloud Quest はパズルを解いたり、報酬を獲得したり、クラウドについて学びながら、AWS サービスを使用した実践的なクラウドスキルを伸ばせるロールプレイゲームです。
* 遊びながら学ぶことができる
* 無料でAWSリソースを使うことができる(リソースの削除も不要)
* 無料で利用できるのは、AWSの初級者向け資格であるCloud Practitioner(クラウドプラクティショナー)のコースまで、それ以上のレベルはサブスクとして展開されているらしい
![aws.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/969534/c2a790c6-954b-55c1-0d0d-16d70ea5c56a.png)

# 内容
ゲームの目的は、仮想世界内で困った市民をAWSのクラウド知識で解決させることのようです。解決させてあげられると何故か建物が立ちます。笑
↓困っている市民が街のそこら中に立っていて、手を振ってアピールしてきます。
![image3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/969534/801c4ce9-3f28-9bc1-ea80-54caed2a27d6.png)

ざっくりですが、困っている市民の内容は下記になります。これらを一つずつAWSのコンソールを触りながら解決に導いてあげます。

- S3で静的コンテンツを公開したい
- EC2サーバーを作成して、別のアベイラリティゾーンにも配置したい
- EC2のサイズをアップしたい
- インターネットゲートウェイをルートテーブルにアタッチしてサイトを公開したい
- セキュリティグループのインバウンドルールを変更してDBサーバーに接続できるようにしたい
- 異なるVPC同士をピアリングしたい
- サーバーにかかっているコストを減らしたい
- RDSインスタンス作成後、fail over対策で マルチAZ&リードレプリカを作成したい
- IAMでユーザーとユーザーグループを作成して、EC2とRDSにReadOnlyのアクセス許可を与えたい
- DynamoDBのtableを作成後、新規でテーブルの項目を追加したい
- Auto Scalingを作ってシステムの可用性を高めたい


中学英語レベルの私でも進められました。web 系アプリの実務経験が1年程度あったので、なんとなく話を読み取れたのもあるかなと思います。実務経験0でやるには少しハードルが高いかなという気がします。(勿論、できる人はできるとは思いますが、なかなか凄いと思う)

下記の記事には画像が沢山あり、参考になると思うので興味のある方は見てみてください。
https://www.publickey1.jp/blog/22/awsawsaws_cloud_quest.html 


# 始め方
私は下記のブログを参考にさせていただきました。
https://blog.serverworks.co.jp/aws-cloud-quest-cloud-practitioner

よーし、この勢いでクラウドプラクティショナーとるぞー
【Java】コンストラクタにおけるthis

# はじめに
コンストラクタにおけるthisの挙動が頭の中でごっちゃになっていたので学習しました。
アウトプットを兼ねて記事投稿したいと思います。

# いきなり結論
thisの役割：「**自クラスの別のコンストラクタを呼び出す**」

# 実行環境
OS：Windows10　バージョン20H2
言語：Java 8
使用ツール：Spring Tool Suite 4

# 1. コンストラクタのthisの使い方・動作
### ⑴ 使い方
自クラスの別のコンストラクタを呼び出したい場合、このように記述します。
``this(引数);``
もちろん引数なしでも可能です。

### ⑵ 動作
```Main.java
Public class Main {
	public static void main(String[] args) {
		new Test("world!!");
	}
}

class Test{
	public Test() {
		System.out.println("Hello");
	}	
	public Test(String val) {
		this();
		System.out.println(val);
	}
}
```
上記コードではTestクラスのコンストラクタ(引数あり・引数なし)を2つ用意し、Mainクラス内でnewして引数に文字列「world!!」を記述しています。

すると、実行結果は下記の通りになります。

```
Hello
world!!
```

この場合、生成されたTestインスタンスにString型の引数があるため、引数ありのTestコンストラクタが起動します。

すると別のコンストラクタを呼び出すthisが最初に記述されているため、引数なしのコンストラクタが呼び出され、上記の実行結果が表示されます。

もちろん逆もできます。

```Main.java
public class Main {
	public static void main(String[] args) {
		new Test();
	}
}

class Test{
	public Test() {
		this("Hello");
		System.out.println("world!!");
	}
	public Test(String val) {
		System.out.println(val);
	}
}
```

```
Hello
world!!
```

上記コードでは、生成されたTestインスタンスに引数が無いため、引数なしのTestコンストラクタが起動します。

先程とは逆に引数ありの別のコンストラクタが呼び出され、上記の実行結果が表示されます。


# 2. 注意点
### ⑴ コンストラクタの先頭に置けない

```Main.java
public class Main {
	public static void main(String[] args) {
		new Test();
	}
}
class Test{
	public Test() {
		System.out.println("これは");
		this("エラーだ！");
	}
	
	public Test(String val) {
		System.out.println(val);
	}
}
```
```
Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
	Constructor call must be the first statement in a constructor
```

Javaの仕様上、thisはコンストラクタ内の先頭にしか置けません。
先頭以外に記述した場合、上記の実行結果のように怒られます。

### ⑵ superとthisを同じコンストラクタ内で使用できない
コンストラクタにおけるsuperも、thisと同様にコンストラクタ内の先頭にしか置けません。
そのため、superとthisを1つのコンストラクタ内で併用することは不可能です。

# 3. でもthisとsuperの2つを使いたいときあるじゃん！

仰る通りです。
1つのクラス内であれば可能です。

```Main.java
public class Main {
	public static void main(String[] args) {
		new Test();
	}
}

class SuperTest{
	public SuperTest() {
		System.out.println("親!");
	}
}

class Test extends SuperTest{
	public Test() {
		this("Hello!!"); 
		System.out.println("world!!");
	}
	
	public Test(String val) {
		super();
		System.out.println(val);
	}
}
```
```
親!
Hello!!
world!!
```

チョット複雑ですが、以下のような処理が行われています。

---

⓵ 引数なしのTestインスタンスが生成されて、引数なしのコンストラクタ、```public Test()```を呼び出す。

⓶ 他のコンストラクタを呼び出す```this("Hello!!")```が起動し、引数ありのコンストラクタ、```public Test(String val)```が呼び出される。

⓷ 親クラスのコンストラクタを呼び出す```super()```によって親クラスの引数なしコンストラクタ、```SuperTest()```にアクセスし、「親!」を表示する。

⓸ ```super()```の処理が終わったため、今度は引数ありのコンストラクタ、```Test(String val)```が```Test()```内の```this("Hello!!")```で受け取った文字列「Hello!!」を表示する。

⓹ ```this("Hello!!")```の処理が終わったため、```Test()```にて文字列「world!!」を表示する。

---

上記のような動作が行われるため、別々のコンストラクタであれば、superとthisを1つのクラス内で使用することが可能です。

# 参考資料
【参考記事】

https://workteria.forward-soft.co.jp/blog/detail/10135

https://www.zunouissiki.com/java-this-super/

【参考書籍】
[徹底攻略 Java SE 11 Silver 問題集[1Z0-815]対応](https://book.impress.co.jp/books/1118101186)
Rustの所有権について

## はじめに

Rustの所有権について勉強したことをまとめました。

## 所有権とは

所有権とはRustにおける独特なメモリ管理方法です。
従来のプログラミング言語では以下の様な方法でメモリを管理していました。

* プログラマの責任で明示的に領域の確保と開放を行う

* ガベージコレクションで不要な領域を自動的に開放する

Rustでは上記2つとは違う方法でメモリを管理しています。

## 所有権の規則

所有権には以下の3つの規則があります。

* Rustの各値は、所有者と呼ばれる変数と対応している

* いかなる時も所有者は一つである

* 所有者がスコープから外れたら、値は破棄される

### 所有者

所有者とはデータを所有している変数のことです。
以下の場合、変数`s`は文字列`Hello`の所有者になります。

```rust
fn main() {
    let s = String::from("Hello");
    println!("{}", s);
}
```

main関数の実行が完了すると変数`s`のスコープから外れるので
文字列`Hello`のメモリ領域は自動で開放されます。

### 所有権の移動

上記の規則にあるように、所有者は常に一つだけです。
そのため、変数の値を別の変数に代入すると新しい変数が所有者になります。
これを**所有権の移動**と言います。

下記の例では所有権が変数`x`から変数`y`に移動しています。
所有権が移動した場合、元の所有者である変数は使用できなくなります。

```rust
let x = String::from("Hello");
let y = x;
```

下記のコードはコンパイルエラーになります。
所有権が移動した後に変数`x`の値を出力しているためです。

```rust
fn main() {
    let x = String::from("Hello");
    let y = x; // 所有権が変数yに移動し変数xは使えなくなる
    println!("{}", x);
}
```

所有権の移動は関数の引数でも発生します。
引数に値渡しするとその引数が新しい所有者になります。
下記のコードもコンパイルエラーになります。

```rust
fn print_string(s: String) {
    println!("{}", s);
}

fn main() {
    let x = String::from("Hello");
    print_string(x); // print_string関数の引数sが所有者になる
    println!("{}", x);
}
```

引数を値ではなく参照にすると所有権は移動しません。
型名に`&`を付けると参照型になります。
呼び出し側は変数の前に`&`付けます。

```rust
fn print_string(s: &String) {
    println!("{}", s);
}

fn main() {
    let x = String::from("Hello");
    print_string(&x); // 所有権は移動しない
    println!("{}", x);
}
```

### メモリ

所有権が移動する際のメモリは以下の様になります。

* スタック上の値はコピーされる

* ヒープの領域は変わらない

下記の様に所有権が移動した場合、メモリの内容は図の通りです。

```rust
let x = String::from("Hello");
let y = x;
```

移動前
![before.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2693350/f8e43296-6ff6-a037-3d3a-dd62d4942823.png)
移動後
![after.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2693350/ee2cb8b2-1f66-c898-d565-694ca91555de.png)

### プリミティブ型

プリミティブ型（整数型、小数点型、bool型等）は所有権の移動は発生しません。
これは値のコピーが自動的に行われるためです。
そのため以下のコードはコンパイルエラーになりません。

```rust
fn main() {
    let x = 1;
    let y = x; // 変数xの値が変数yにコピーされる
    println!("{} {}", x, y);
}
```

### スコープ

波括弧(`{}`)を使って変数のスコープを制限することができます。
スコープを抜けると、そのスコープで宣言した変数は使用できなくなります。

```rust
fn main() {
    let x = 1;
    {
        let y = 2; // ネストされたスコープでのみ有効な変数y
        println!("{}", y);
    }
    println!("{} {}", x, y); // 変数yはスコープ外のためコンパイルエラーになる
}
```

## まとめ

* 所有権とはRustにおけるメモリの管理方法

* 変数に値を代入するとその変数が所有者となる

* 変数の値を別の変数に代入すると新しい変数が所有者となる（所有権の移動）
  元の所有者の変数は使用できなくなる

* プリミティブ型は値がコピーされるため所有権は移動しない

* スコープを抜けるとそのスコープ内で宣言した変数は使用できなくなり値は開放される

## 参考文献

https://doc.rust-jp.rs/book-ja/ch04-01-what-is-ownership.html

https://doc.rust-jp.rs/rust-nomicon-ja/ownership.html
RAM DISKとSSDの速度

　フラッシュメモリの寿命は、むかしデジカメCFカード故障で泣いたことがあり、結構気にしています。そのため、PC内蔵のSSDについても延命を願い、主に%SystemRoot%\TEMPをRAM DISKに置いています。みなさんはどうされているでしょうか。
　ところで、RAM DISKはどの程度早いのか？について、故障の恐怖はあるものの、調べてみました。結果、HDD時代には重宝したRAM DISKですが、本機については、整数倍的な早さはなさそうで、残念でした。

## スペック
> PC  － HP ENVY x36-13 ar0xxx
> CPU － AMD Ryzen 7 3700U with Radeon Vega Mobile Gfx 2.3GHz
> RAM － 16GB (2400MHz DDR4)
> SSD － 476.94GB SAMSUNG MZVLB512HBJQ-000H 
> OS － Windows 11 21H2
> RAM DISK － ImDisk ToolKit20220301 により1600MBを確保

### ImDisk設定
SSD時は「NVMe SSD」にしました。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173967/5294b152-d29d-dd32-1dd2-758b185d14ff.png" width="60%"> 

　計測結果は以下の通りです。本機付属のサーマルプロファイルを変え2種計測しました。なお、「静」は最低クロックのようで、1.3～1.4GHz駆動でした。「パフォーマンス」は2.5GHzくらみ

### サーマルプロファイル「静」でのSSD
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173967/26bd1c74-b07f-c1ce-5b0c-6d35e314dab7.png" width="60%">

### サーマルプロファイル「静」でのRAM DISK
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173967/69d1f526-957d-8238-670e-9e8c0aee08e7.png" width="60%">

### サーマルプロファイル「パフォーマンス」でのSSD
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173967/585e1345-ed14-cc0f-9ab3-2be99d8ae3d7.png" width="60%">

### サーマルプロファイル「パフォーマンス」でのRAM DISK
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173967/b95ddebf-ef99-1c62-1db3-3f2ecdc43451.png" width="60%">
AmazonLinux2にPHP8.1とnginxを導入してphpinfo();を表示するまで 

Laravel9を使うにはPHP8.1が必要ですが、amazon-linux-extrasにはPHP8.0までしかありません。ググりながらインストールを進めましたが、php-fpmとnginxの設定で詰まったので、備忘録を残しておくことにしました。

一通りの作業を終えてから記事として書きましたので、抜け漏れ等がありましたらご指摘いただけると嬉しいです。よろしくお願いいたします。

# PHP8.1をインストールする
amazon-linux-extrasにはPHP8.0までしか用意がありませんので、epelとremiを入れます
```
sudo amazon-linux-extras install epel -y
sudo yum install http://rpms.remirepo.net/enterprise/remi-release-7.rpm
```

php8.1とphp-fpmを入れます
```
sudo yum install php81 php81-php-fpm
```

（参考）Laravel9を使う場合はこのようになります
```
sudo yum install php81 php81-php-mbstring php81-php-mysqlnd php81-php-gd php81-php-xml php81-php-fpm
```

`php81`を`php`で呼び出せるようにしておきます
```
sudo alternatives --install /usr/bin/php php /usr/bin/php81 1
```

（参考）Laravelを使うには、composerを入れておきます。[公式](https://getcomposer.org/download/)を参考にしました
```
sudo php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
sudo php -r "if (hash_file('sha384', 'composer-setup.php') === '55ce33d7678c5a611085589f1f3ddf8b3c52d662cd01d4ba75c0ee0459970c2200a51f492d557530c71c15d8dba01eae') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
sudo php composer-setup.php
sudo php -r "unlink('composer-setup.php');"
```

# nginxのインストールとconfファイルの用意
nginxを入れます
```
sudo amazon-linux-extras install nginx1
```

`/etc/nginx/nginx.conf`のrootディレクトリを編集します
```/etc/nginx/nginx.conf
        root         /var/www/app/public;
```

`/etc/nginx/conf.d/`ディレクトリにnginxのconfファイルを生成します。
以下2点がポイントになると思います。
- rootディレクトリを先ほどのnginx.confと合わせる
- fastcgi_passをphp81のwww.sockにする

```/etc/nginx/conf.d/app.conf
server {
    listen 80;

    charset UTF-8;
    root  /var/www/app/public;
    index index.php index.html;

    location / {
        try_files $uri $uri/ /index.php?$args;
    }

    location ~ [^/]\.php(/|$) {
        fastcgi_split_path_info ^(.+?\.php)(/.*)$;
        fastcgi_pass unix:/var/opt/remi/php81/run/php-fpm/www.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
   }
}
```


ここで指定したroot`/var/www/app/public`内に`index.php`を置きます
```/var/www/app/public/index.php
<?php
phpinfo();
?>
```

# php-fpmをnginxで使えるようにする

php-fpmのwww.confを編集します

:::note warn
このlistenを編集する点がどこにも書いてなくて詰まりました
:::

```/etc/opt/remi/php81/php-fpm.d/www.conf
listen = /var/opt/remi/php81/run/php-fpm/www.sock
listen.owner = nginx
listen.group = nginx
listen.mode = 0660
;listen.acl_users = apache,nginx
```

# nginxとphp-fpmを立ち上げる
いずれも立ち上げて自動起動を有効化します
```
sudo systemctl start php81-php-fpm
sudo systemctl enable php81-php-fpm
```

```
sudo systemctl start nginx
sudo systemctl enable nginx
```

これで完了です。EC2インスタンスの、パブリックIPv4アドレスにアクセスすると、phpinfo();が表示されました。
【知らないと損する】スッキリわかるSQL入門が良書すぎたのでオススメしたい

## はじめに
バックエンドエンジニアであれば関わるであろうSQLについて纏められた技術書
「[スッキリわかるSQL入門 第３版 ドリル256問付き!](https://amzn.to/3pefnqC)」が良書すぎたので
おすすめしたいと思います。
SQLはMySQLで扱ってましたが、腰を据えて学んだことがなかったので今回、技術書を使って知見を深めました。

## この記事の対象者
- SQLについて初めて学ぶ人
- SQLを実務で扱っているが理解が浅い人
- SQLについての理解を深めたい人
- テーブル設計ができるようになりたい人

## はじめてのSQL
この章では主にデータベースとは何かといった、基礎知識について纏められている。
ハンズオンとして [dokoQL](https://dokoql.jp/) を使って環境構築なしでSQL文を実行することができるようになります。

:::note
この章で学ぶこと
- データベースの概要
- SQLの概要
:::

## 基本文法と４大命令
章題の通り、基本文法についての説明が纏められている。
`SELECT`、`UPDATE`、`DELETE`、`INSERT` の書き方のレクチャー。

:::note
この章で学ぶこと
- SQLの基本ルール
- データ型とリテラル
- SQLの体系
- ４大命令をスッキリ学ぶコツ
:::

## 操作する行の絞り込み
主に条件についての説明が纏められている。
`AND`、`IS NULL`、`LIKE`、`IN`、`BETWEEN` などの使い方のレクチャー。

:::note
この章で学ぶこと
- WHERE 句
- 演算子
- NULL
- 主キー
:::

## 検索結果の加工
並び替えなどについて纏められている。
`DISTINCT`、`ORDER BY`、`OFFSET - FETCH`、`UNION`、`EXCEPT`、`INTERSECT`などのレクチャー。

:::note
この章で学ぶこと
- 検索結果の加工
- 集合演算子
:::
## 式と関数
四則演算や関数について纏めている。
CASE演算子なども出てきて一見複雑そうに見えてしまうが
丁寧に纏められているのでしっかりと読んで、手を動かしていけば身につく。

:::note
この章で学ぶこと
- 計算式
- 計算式に用いる演算子
- 関数
:::
## 集計とグループ化
集計とグループ化について纏めている。
`HAVING`句なども出てきてくる。
図でも説明があるため、理解がとてもしやすい。

:::note
この章で学ぶこと
- 集計
- グループ化
- 集計関数
:::
## 副問い合わせ
1つのSQL文で2つ以上の処理をするための副問い合わせについて纏めている。
副問い合わせのSQL文は複雑に見えてしまい、敬遠してしまうかも。
だけどこの章では**習得するためのコツ**についても記載しているのでしっかりと読んでほしい。

:::note
この章で学ぶこと
- SQL文のネスト
- 副問い合わせのパターン
- 複数行副問い合わせと演算子
:::

## 複数テーブルの結合
複数テーブルを取り扱う方法についてまとめている。
イメージがわかりにくい `JOIN` について、紙工作をして
体感することができる。準備に手間はかかるかもですがやることで
間違いなくイメージがしやすくなるので体感することがおすすめ。

:::note
この章で学ぶこと
- リレーションシップ
- 結合
- 結合構文のバリエーション
:::

## トランザクション
トランザクションについてまとめられている。
副作用についても図を使いつつ説明しているのでわかりやすい。

:::note
この章で学ぶこと
- トランザクション
- 原子性
- 分離性
- ロック
:::

## テーブルの作成
テーブルの作成をもとに制約についてもまとめられている。
ここの理解をすることで、すでに作られたテーブルに対しても
必要な制約などについて考えることができるようになる。

:::note
この章で学ぶこと
- ４種類のSQL命令
- テーブルの作成と削除
- 制約
:::

## さまざまな支援機能
インデックスやビューなどについてまとめられている。
ただ使い方などが書かれているだけではなく、なぜ必要なのかも
解説してくれている。

:::note
この章で学ぶこと
- インデックス
- ビュー
- 採番とシーケンス
- バックアップ
:::

## テーブルの設計
設計について段階的に説明がされている。
その後、正規化の流れについてもまとめられている。

:::note
この章で学ぶこと
- データベース設計
- エンティティの関係
- 論理モデルと正規化
:::

## 付録
- 簡易リファレンス
- エラー解決 虎の巻
- 特訓ドリル
## まとめ
既に実務で大抵の知識はついていたが、理解が浅かった部分の再確認ができたのがすごいよかった。
特に正規化に関してはこれまで学んでこなくて言葉すら知らなかったけど、感覚的に正規化していたことを、これからは確信を持って行えるようになるのは成長を感じました。


↓↓↓スッキリわかるSQL入門はこちらから購入できます↓↓↓
[![スッキリわかるSQL入門](https://images-na.ssl-images-amazon.com/images/I/810UhT+Xu2L.jpg "スッキリわかるSQL入門")](https://amzn.to/3w1V3MQ)
C++关键字register过时


在C语言和C++语言里面都有register关键字。代码使用NDK编译，编译器给出警告信息。
```
warning: 'register' storage class specifier is deprecated and incompatible with C++17 [-Wdeprecated-register]
```
NDK使用clang编译器，我在Linux系统使用clang编译器测试。
下面是测试代码。

```C
#include <stdio.h>
int main()
{
    register int abc = 0;
    printf( "%d" , abc );
    return 0;
}
```

代码保存为cpp文件，编译命令clang -std=c++17 test.cpp。编译器给出错误信息。
```
error: ISO C++17 does not allow 'register' storage class specifier [-Wregister]
```
说明在C++17的方式编译出错。编译命令clang -std=c++11 test.cpp。编译器给出警告信息。
```
warning: 'register' storage class specifier is deprecated and incompatible with C++17 [-Wdeprecated-register]
```

说明在C++11的方式编译出警告，是对于C++17的预警。
代码保存为c文件，编译命令clang -std=c17 test.c。没有警告与错误信息，说明C语言可接受register。
【クエリビルダ：拡張表現】フィルター参照を使用してみる

今回は拡張表現を使用する場合の基本中の基本、**フィルター参照**を見てみます。

[Sharperlight](https://sharperlight.jp/)アプリケーションメニューからクエリビルダを起動します。
起動したら先ずフィルターの設定をしましょう。
`モード`はなんでもいいです、そうですね今回は**詳細レポート**にしましょうか。
`製品`には、**SAP Business One**でも選びましょうか。`Company`には**デフォルトComapny**が表示されるのでそのまま進みましょう。
`テーブル`は、**G/L Transactions**でも選びましょうか。
テーブルを指定すると、必須フィルターアイテムが表示されるのでフィルター値の設定をしてみます。
`G/L Account Code`は、``<``**ALL**``>``のまま。`Year/Period Code`のfrom値には、**PERIOD -12y**、 to値には**PERIOD**を設定します。
12年前の当会計期から現在の会計期までという意味です。


次に出力アイテムを設定します。
選択領域から次の三つを選びました。
- G/L Account Code
- Posting Date
- Amount

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/9623fc08-467e-5a1e-1f98-f506090cce0b.png)
とりあえずプレビューしてみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/a91759d3-e3fd-decc-add2-d5adf5bd3b70.png)
このような結果が返されました。

ではクエリに戻り、フィルター参照を使用してみます。
出力領域の右クリックから**拡張表現を追加**を選択します。
関数一覧からフィルター参照を展開してみます。フィルター領域に設定してあるフィルターの一覧が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/aea235a1-3242-c778-4bde-91ef07b8c211.png)
フィルターの**説明**と**名前**がそれぞれ表示されます。フィルター参照では、この**名前**がキーとなり重要になります。
名前の変更は、フィルター領域の右クリックメニューから行えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/adf6706c-c5f5-2bf2-f876-3a27987c7cd9.png)
では早速使用してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/75141f20-a5f4-24f9-ca50-d1bedb5431c1.png)
`Year/Period Code {@YeaPerCod}`をダブルクリックで、上記エディター領域に転送します。
このように文章にしてみましょう。
`"年/期間コードフィルターの範囲の開始コードは [" + {@YeaPerCod} + "] です。"`
上部データ型オプションに**Text**を設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/7439d230-65b9-671a-2e48-5f4403020fec.png)
ではOKで確定し、クエリをプレビューしてみます。
このように表示されました。指定したフィルター値も上手に変換され表示されていることがわかりますね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/c42cd68c-0f2c-fca4-a0e0-629bff9f9b98.png)
今回は、ただ表示しただけですが、他の関数を組み合わせていろいろな応用ができますので試してみてくださいね。
【PHP】PHPの関数の型の指定(引数)

# コード
```PHP
<?php
function func1(array $array) {
  return $array[0];
}
echo func1(['a','b','c']),PHP_EOL;


function func2(int $num){
  return $num + 1;
}
echo func2(9),PHP_EOL;


function func4(string $string) {
  return $string.':文字列';
}
echo func4('a'),PHP_EOL;

```

# 結果
```
a
10
a:文字列
```