OmniAICreator/Qiita-1.07M huggingface dataset:
C#でローカルIP/グローバルIPを取得する

ローカルIPの取得
--

```C#
using System.Net;

string hostname = Dns.GetHostName();

IPAddress[] adrList = Dns.GetHostAddresses(hostname);
foreach (IPAddress address in adrList)
{
    Console.WriteLine(address.ToString());
}
```

グローバルIPの取得
--
グローバルIPをプログラムで取得するのは困難なため、外部サイトを利用します．


```C#
using System.Net;

string externalIpString = new WebClient().DownloadString("https://ipinfo.io/ip");
var externalIp = IPAddress.Parse(externalIpString);

Console.WriteLine(externalIp.ToString());
```

以上です．
WindowsからSSH越しにファイルシステムをマウントする（SSHFS-Win）

# What's？

Windowsから、SSHFS（SSH／SFTP経由でファイルシステムをマウントする）が使えないかなと思ったので調べてみました。

SSHFS-Winを使えば良さそうです。

https://github.com/winfsp/sshfs-win

# お断り

SSHFS自体は、すでに開発が終了しています。

https://github.com/libfuse/sshfs

SSHFS-Winも2年ほどリリースがない状態です。

# 環境

```powershell
PS C:\Users\xxxxx> $PSVersionTable.PSVersion

Major  Minor  Build  Revision
-----  -----  -----  --------
5      1      19041  2364


PS C:\Users\xxxxx> winget --version
v1.3.2691
```

# SSHFS-Winをインストールする

SSHFS-Winの[README.mdのInstallation](https://github.com/winfsp/sshfs-win/tree/v3.5.20357#installation)に従って、[WinFsp](https://github.com/winfsp/winfsp)とSSHFS-Winをインストールします。

```powershell
PS C:\Users\xxxxx> winget install WinFsp.WinFsp
PS C:\Users\xxxxx> winget install SSHFS-Win.SSHFS-Win
```

# GUIを導入する

SSHFS-WinだけでもCLIでマウントできるようですが、GUIもインストールしてみましょう。

今回はSSHFS-Winで紹介されているSSHFS-Win Managerを使うことにしました。

[SSHFS-Win · SSHFS for Windows / GUI front ends](https://github.com/winfsp/sshfs-win/tree/v3.5.20357#gui-front-ends)

https://github.com/evsar3/sshfs-win-manager

インストール。

```powershell
PS C:\Users\xxxxx> winget install evsar3.sshfs-win-manager
```

起動。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309669/b84ba6c4-9ce7-48b4-d47e-4d286e43b798.png)

「Add Connection」を選んで、接続情報を追加します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309669/fc3dcc7d-510c-074c-df98-085542abd5bf.png)

保存すると、一覧に現れるようになるので

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309669/deca03c4-22f9-40e3-559b-5cb1c49be235.png)

コネクタのアイコンをクリックすると、接続が行われて指定したリモートパスをマウントします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309669/4d128276-7f3e-4b2f-fe3b-088437acb1fa.png)

コネクタのアイコンをもう1度クリックすると、マウントが解除されます。
論文紹介~Concept Bottleneck Models(ICML 2020)~

こんにちは！
大学院でコンピュータビジョンに関する機械学習の研究をしている住安です。

今回は、コンセプト（e.g.,鳥の羽の色、尻尾の色...）を使用したConcept Bottleneck Modelsをスライドにまとめてみました！
詳細などは省いていたり、誤りがあるかもしれません。気になる方は、ぜひ元の論文をお読みください！

論文タイトル：Concept Bottleneck Models
著者：Pang Wei Koh, Thao Nguyen, Yew Siang Tang, Stephen Mussmann, Emma Pierson, Been Kim, Percy Liang

<iframe src="https://docs.google.com/presentation/d/e/2PACX-1vTNnhy_1tzKyKWlX2tkhH3aAKsYJCviXLw9BUN8OJfjBBytQH8YfWIKmr3WAzGO6f7zMgnmnf1VNku9/embed?start=false&loop=false&delayms=3000" frameborder="0" width="960" height="569" allowfullscreen="true" mozallowfullscreen="true" webkitallowfullscreen="true"></iframe>

## 論文URL
https://arxiv.org/pdf/2007.04612.pdf/
今後数年でエンジニアでも失職、従来型ITスキルじゃオワコンだよ！

2023年あけましておめでとうございます！！
改めて今年はスキルを磨く勉強等を決意されてる方も多いと思いますが、勉強する方向に注意して欲しいです。

それは、従来IT人材としてのスキルを身につけても未来がないという事です！
注意が必要です！
下手したら数年でエンジニアであってもオワコンになってしまうという話しです。

# 先端IT型人材とは？
先端IT人材とは、AIやビッグデータ、IoT等、第４次産業革命に対応した新しいビジネスの担い手として、付加価値の創出や革新的な効率化等により生産性向上等に寄与できるIT人材です。

# 従来型IT人材とは？
一方、従来型IT人材と呼ばれる人材とは、調べたのですが、言葉はあるけど、明確に定義されてはいない様です。受託開発や保守運用をメインの業務とするともありますが、受託だってAI開発やるので、むちゃくちゃですね。先端IT型人材以外という位置づけでしょうか。
僕の定義では、
- オンプレミスのサーバー構築やネットワーク構築エンジニア
- WEB系以外の旧型のクラサバ型開発エンジニア
- ウォーターフォール型でしか開発できないエンジニア（アジャイル開発嫌い）
等の人材だと思います。

# 従来型ITエンジニアがオワコン
実は、この**従来型ITエンジニア**の人材が2030年に**10万人**余ると言われてます。
一方、先端IT型人材は、2030年には約80万人規模の人材不足と言われてます。
真逆です！
この80万人不足だからと言って、従来型のITエンジニアの人が安心していると正にオワコンなんです。
１０万人余る人材ゾーンに入ってしまうか、８０万人不足人材ゾーンに入るかで、年収が大きく変わることは想像に容易い話しです。

# 勝ち組になるためには
先端IT型人材になるしかありません。若手エンジニアは、先端IT型人材になるためのスキルを磨き、シニアエンジニアは、先端IT型人材のスキルを取得しましょう。従来型ITエンジニアの人は、早めに転職した方が良いと思います。

## スキル面では
- データサイエンス
- 人工知能（AI）
- IoT（モノのインターネット）
- ビッグデータ
- AR／VR
- ブロックチェーン
- クラウドコンピューティング
- セキュリティ関連　

## ソフト面では
- アジャイル開発
- 提案できる人になる
- マネージメントできる人になる
- リーダーになる
- プロマネできる人になる
- 全体最適化ができる人になる

# まとめ
オワコンの従来型ITスキルを伸ばしてもオワコンへ突き進むだけです。2030年よりも早く2025年頃には仕事が無くなってしまう可能性もあります。伸ばすべきは、先端IT型人材になるためのスキルです。
そして、こちらの記事にも書きましたが、様々な技術を組み合わせて最適な組み合わせの提案が出来るエンジニアとして、ジェネラリストになりましょう。

■これからのエンジニアはジェネラリストになれ！
https://qiita.com/k1morikawa@github/items/dcdaebbc0811110406a7

未経験の皆さん、若手エンジニアの皆さん、勉強方法について悩みがあればなんでも気軽に質問して下さい！
これからも記事を書いていきますので、モチベーションアップのためフォロー、イイねお願いします。
AI-900: Microsoft Azure AI Fundamentalsに合格した話


本エントリーはAdvent Calendar 2022「[NKC-UG Advent Calendar 2022](https://qiita.com/advent-calendar/2022/nkc-ug)」の7日目のエントリーです！

# はじめに

こんにちは。[ノル](https://twitter.com/noll6451)です

今回は「NKC-UG」主催のアドベントカレンダー「[NKC-UG Advent Calendar 2022](https://qiita.com/advent-calendar/2022/nkc-ug)」の7日目にエントリーしました
## きっかけ
Microsoftの資格を一通りとったので、備忘録代わりです。(いま調べたらMS900受験できるようになっているので、近いうちに取りに行く)
自分の合格したMicrosoftの資格一覧は[こちら](https://www.linkedin.com/in/rei-suzuki-22b443211/)で見れます。
~~NKC-UGの代表だから仕方なくではない~~

#この記事の対象者

- Microsoftの認定試験を受験予定の人
- AI,機械学習を勉強したい初心者の方
- 学生向け

## この資格の説明
[公式](https://learn.microsoft.com/ja-jp/certifications/azure-ai-fundamentals/)では
>より良い世界を構築するために必要な AI スキルを持っていることを証明する。 Azure AI Fundamentals 認定資格を取得すると、キャリアを築くために必要な基盤を提供し、AI と機械学習の一般的なワークロードの知識、また、どの Azure サービスを使うとこれらを解決できるのかを証明できる。
機械学習と AI の概念の基礎知識と、関連する Azure サービスを検証する。

となっております。

Azure AIに関してですが、基本的な知識からAzureのAIに関するサービスがどんなことができるのか問う試験です。
ちなみに
この試験も、社会人、学生関係なく**無料**のバウチャーがもらえる方法があります。


## 試験予約編
社会人も学生も無料になる方法があります(社会人の方はこちらの方法ですが、学生の方は2通りあります)
まずは、下から有無言わさず予約してください。この時のメールアドレスはしっかりと保管してください(個人のメールアドレスが推奨です。)

https://www.microsoft.com/ja-jp/events/top/training-days/azure?activetab=a1:primaryr5

前から録画してある動画を流すウェビナーなので、ぶっちゃけどんな状況でも受けれます。ただしっかりと出席だけはしてください。(バウチャーがもらえないので)

## 勉強方法
この試験ですが、前の記事と同様、ほとんど情報少ないです。
上記のウェビナーですが、合格したいなら、真剣に聞くことをお勧めします！(ほんとに！ここでしか言わない情報が多すぎる)

https://learn.microsoft.com/ja-jp/certifications/exams/ai-900


まずは**ヒント**というところをしっかりとみてください(重要です)
実際の試験の操作も体験できます。
その次に下にスクロールすると、勉強できるようにラーニングパスがあるので
それに沿って勉強すれば十分です。(もちろん無料です)

公式の問題集

https://learn.microsoft.com/ja-jp/certifications/resources/ai-900-sample-questions?azure-portal=true


# 試験を受けるときの注意点

- 日本語がおかしい場合がある(英語に直す、察する)
- 採点されない問題が出てくる
- 出題範囲にない問題が出てくる(たぶん採点されてない？)
- 人によって問題数が違う
- 意外と時間がないので、サクサク進める(後から回答し直せる)
- 分からなくてもとりあえず何かしら選ぶ(1000点中合格スコア700だけど、7割ではないらしい)


Microsoft試験基礎シリーズの5記事めです。
ぜひこれを機にとってみてはいかがですか？？(実は、基礎資格は有効期限はないです)
ちなみ学生ですが、実は単位認定される可能性があります。

https://learn.microsoft.com/ja-jp/certifications/college-credit


皆さんの合格をお祈りしてます。

Microsoft試験基礎シリーズ
1記事め

https://qiita.com/Rei1729/items/89d693c73e0156764beb

2記事め

https://qiita.com/Rei1729/items/d889385246886ec9dfa9

3記事め

https://qiita.com/Rei1729/items/f635ec940beaef6a6e6a

4記事め

https://qiita.com/Rei1729/items/b6b10aaef702763c0289
Laravelのマイグレーションで指定するカラムタイプとRDBMSで生成されるカラムについて(個人用)

## Laravelのマイグレーションとは?
ドキュメントではこのように説明されている。
>LaravelのSchemaファサードは、Laravelがサポートするすべてのデータベースシステムに対し、テーブルを作成、操作するために特定のデータベースに依存しないサポートを提供します。
>通常、マイグレーションはこのファサードを使用して、データベースのテーブルとカラムを作成および変更します。

[引用元:Laravel マイグレーション](https://readouble.com/laravel/9.x/ja/migrations.html#column-method-decimal)

開発者がRDBMSの種類を意識することなく管理できるようにlaravelがそれを吸収してくれていてとっても便利ですが、
実体のカラム型を知らずして使うのは怖さがあったりする。
ので、簡単にここでまとめる。

## 差分を吸収してくれているファイルはどこ?

Illuminate\Database\Schema\Grammars
ここに格RDBMSごとのカラム定義がある。
![スクリーンショット 2023-01-11 11.56.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346005/9698bbe1-f47e-cc6f-dd2f-03d1dcf9fdea.png)

僕はpostgresqlを使っているのでファイルを覗いてみると
例えばこんな記述がある
```PostrreGrammar.php
    /**
     * Create the column definition for a text type.
     *
     * @param  \Illuminate\Support\Fluent  $column
     * @return string
     */
    protected function typeText(Fluent $column)
    {
        return 'text';
    }

    /**
     * Create the column definition for a medium text type.
     *
     * @param  \Illuminate\Support\Fluent  $column
     * @return string
     */
    protected function typeMediumText(Fluent $column)
    {
        return 'text';
    }

    /**
     * Create the column definition for a long text type.
     *
     * @param  \Illuminate\Support\Fluent  $column
     * @return string
     */
    protected function typeLongText(Fluent $column)
    {
        return 'text';
    }
```

laravelマイグレーションファイルで指定できる
「text・mediumText・longTextはpostgresqlでtext型で作りますよ。」
というようになっていたんですね。

このファイルを見れば何に変換されるのかわかりますね。

## 一覧
多分あってるはず
|カラムタイプ|MySQL|PostgreSQL|
|:----|:----|:----|
|bigInteger|bigint|bigint|
|binary|blob|bytea|
|boolean|tinyint(1)|boolean|
|char|char|char|
|date|date|date|
|dateTime|datetime|timestamp|
|decimal|decimal|decimal|
|double|double|double precision|
|float|double|double precision|
|integer|int|integer|
|ipAddress|varchar(45)|inet|
|json|json|json|
|longText|longtext|text|
vue3覚書(watch,watchEffect,ライフサイクル)


## watch
- 値の変更を監視
- numberの値が変わったら呼ばれる
```vue
<script setup lang="ts">
import { ref, watch} from 'vue';

const number = ref(100)

watch(number, () => {
  console.log("watch")
})

const incrementNumber = () => {
  number.value++
}
</script>

<template>
  <div>
    <div>
      {{ number }}
    </div>
    <div>
      <button @click="incrementNumber">increment</button>
    </div>
  </div>
</template>
```

第一引数に監視したいデータ、第二引数にコールバック関数を指定する
- crには変更後の値が入る
- prevには変更前の値が入る
```vue
watch(number, (cr, prev) => {
  console.log("number", number.value)
  console.log("cr", cr)
  console.log("prev", prev)
  console.log("number", number.value)
})
```

## watchEffect
- やれることはwatchと同じ
- watchより簡単にかける
- 自動的にコンポーネント内のreactiveな値が監視される
```vue
<script setup lang="ts">
import { ref, watchEffect} from 'vue';

const number = ref(100)

watchEffect(() => {
  console.log(number.value)
})

const incrementNumber = () => {
  number.value++
}
</script>

<template>
  <div>
    <div>
      {{ number }}
    </div>
    <div>
      <button @click="incrementNumber">increment</button>
    </div>
  </div>
</template>
```


## ライフサイクル

### コンポーネントの読み込み時
- created
- onBeforeMount
- onMounted
### リソース呼び出し時
- onBeforeUpdate
- onUpdated
### コンポーネントの読み込み終了時
- onBeforeMount
- onUmounted

親コンポーネント
- IsShowで子コンポーネントのマウント、アウンマウントを切り替え

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

const IsShow = ref<Boolean>(false)
const ChangeIsShow = (Boolean: boolean) => {
  IsShow.value = Boolean
}
</script>

<template>
  <div>
    <LifeCycle v-if="IsShow"/>
    <button @click="ChangeIsShow(true)">show</button>
    <button @click="ChangeIsShow(false)">hide</button>
  </div>
</template>
```

子コンポーネント
```vue
<script setup lang="ts">
import { onBeforeMount, onBeforeUnmount, onBeforeUpdate, onMounted, onUnmounted, onUpdated, ref } from 'vue';
const text = ref<string>('aiueo')

// 読み込み時
onBeforeMount(() => {
  console.log("onBeforeMount")
})

onMounted(() => {
  console.log("onMounted")
})

onBeforeUpdate(() => {
  console.log("onBeforeUpdate", text.value)
})

// textに変更があったとき
onUpdated(() => {
  console.log("onUpdated", text.value)
})

// textが変更される前
onBeforeUnmount(() => {
  console.log("onBeforeUnmount")
})

// 読み込み終了時
onUnmounted(() => {
  console.log("onUnmounted")
})

console.log("created")
</script>

<template>
  <div>
    <h1>TestLifeCycle</h1>
    <div>
    <input type="text" v-model="text" placeholder="input test" />
    <div>{{ text }}</div>
    </div>
  </div>
</template>
```
【ESLint】Parsing error: ESLint was configured to run on `<tsconfigRootDir>/jest.config.js` using `parserOptions.project`をなんとかする

# はじめに

Firebase Functionsのプロジェクトを初期化した際に、CLIに従ってESLintを導入した場合、**jest.config.js**を開くとエラーが表示されることがあります。

![名称未設定のデザイン.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/577119/692c6c72-bdbe-7bb4-c6a3-4ad61930602b.png)

# 具体的なエラーの内容

先ほどの画像に表示されているエラーとして、**Parsing error**がVSCodeに表示されています。

```
Parsing error: ESLint was configured to run on `<tsconfigRootDir>/jest.config.js` using `parserOptions.project`: 
- <tsconfigRootDir>/../../../../../users/xxx/firebase/firebase-project/functions/tsconfig.json
- <tsconfigRootDir>/../../../../../users/xxx/firebase/firebase-project/functions/tsconfig.dev.json
However, none of those TSConfigs include this file. Either:
- Change ESLint's list of included files to not include this file
- Change one of those TSConfigs to include this file
- Create a new TSConfig that includes this file and include it in your parserOptions.project
See the typescript-eslint docs for more info: https://typescript-eslint.io/linting/troubleshooting##i-get-errors-telling-me-eslint-was-configured-to-run--however-that-tsconfig-does-not--none-of-those-tsconfigs-include-this-fileeslint
```

# 解決方法 - ignorePatternsを使う方法

このプロジェクトでは、TypeScriptを使用しています。なので、**jest.config.js**などのJavaScriptで書かれた設定ファイルはESLintの対象外に設定します。

**.eslintrc**の`ignorePatterns`に`**/*.js`を追加します。

```.eslintrc
ignorePatterns: [
    "/lib/**/*", // Ignore built files.
    "**/*.js",
],
```

もし、**jest.config.js**のみを対象外にしたい場合は`"jest.config.js"`のみを追加します。

```.eslintrc
ignorePatterns: [
    "/lib/**/*", // Ignore built files.
    "jest.config.js",
],
```

# 解決方法 - tsconfig.jsonのincludeを使う方法

初期状態の **.eslintrc.js** の`parserOptions.project`には、`"tsconfig.json"`と`"tsconfig.dev.json"`が含まれています。

```js
parserOptions: {
    project: ["tsconfig.json", "tsconfig.dev.json"],
    sourceType: "module"
}
```

この`parserOptions.project`に`"jest.config.js"`を追加します。

```js
parserOptions: {
    project: ["tsconfig.json", "tsconfig.dev.json", "jest.config.js"],
    sourceType: "module",
},
```

**tsconfig.json**と**tsconfig.dev.json**の`include`に`"jest.config.js"`を追加します。

```json
"include": [
    "src",
    "__tests__",
    "jest.config.js"
]
```

設定の変更後、jest.config.jsを開くと当初のエラーは消えています。しかし、今度は`Strings must use doublequote.`エラーがVSCode上で表示されています。

![名称未設定のデザイン (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/577119/467df48c-8a34-2d37-8550-eebb10258766.png)

`Fix all auto-fixable problems`をVSCode上で実行して、`'`を`"`に変更します。

![名称未設定のデザイン (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/577119/cd6841dc-9d9d-7d31-4d44-8ea18f7846c7.png)

これで、エラーは解決しました。

# まとめ

Firebase Functionsを初期化した段階で、このようなエラーが出てしまうのは辛いですが、エラーの内容をよく読み設定を変更するだけで簡単に解消することができます。エラーが出た際は冷静に対応しましょう。
Laravel Sanctumを使ってSPA認証を実装する


## Laravel Sanctumとは
Laravel Sanctumは、SPA（シングルページアプリケーション）、モバイルアプリケーション、およびシンプルなトークン・ベースのAPI向けの簡単な認証システムを提供します。

https://laravel.com/docs/9.x/sanctum#introduction

## 設定方法
### インストール
Composerを使ってインストールします。
```
composer require laravel/sanctum
```
次に下記コマンドを実行します。これにより、vendor/laravel/sanctum/database/migrationsの中身がdatabase/migrationsにコ、vendor/laravel/sanctum/config/sanctum.phpがconfig/sanctum.phpにコピーされます。
```
php artisan vendor:publish --provider="Laravel\Sanctum\SanctumServiceProvider"
```
今回「database\migrations\2019_12_14_000001_create_personal_access_tokens_table.php」は使用しないため、削除します。
```
rm database/migrations/2019_12_14_000001_create_personal_access_tokens_table.php
```
続いて、apiミドルウェアを追加します。`EnsureFrontendRequestsAreStateful`がコメントアウトされているので、コメントを外します。
- SPAからの受信リクエストがLaravelのセッションクッキーを使用して認証できるようになる
- サードパーティまたはモバイルアプリケーションからのリクエストがAPIトークンを使用して認証できるようにする役割を果たす
```diff_php:app\Http\Kernel.php
'api' => [
-   // \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class, 
+   \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class, 
    'throttle:api',
    \Illuminate\Routing\Middleware\SubstituteBindings::class
],
```
これでSanctumのインストールは完了です。続いて、SPA認証の設定をしていきます

## SPA認証の設定方法
### ファーストパーティドメインの設定
まず、SPAがリクエストを行うドメインを設定します。これらのドメインは、sanctum設定ファイルのstateful設定オプションを使用します。この設定は、APIにリクエストを行うときにLaravelセッションクッキーを使用して「ステートフル」な認証を維持するドメインを指定します。
`config('sanctum.stateful')`を設定する必要があるので各環境に合わせて `.env`にドメインとポート番号を設定する。ローカル環境では設定は不要だが、設定する場合は`SANCTUM_STATEFUL_DOMAINS=localhost`のように設定する。
```.env
SANCTUM_STATEFUL_DOMAINS=localhost:3000
```
### CORS
レスポンスヘッダの`Access-Control-Allow-Credentials`が`true`を返すように設定する
```diff_php:config\cors.php
- 'supports_credentials' => false,
+ 'supports_credentials' => true,
```

## 実際にルートの保護をしてみよう
ルートを保護するには、`routes/api.php`ファイル内のAPIルートにsanctum認証ガードを指定する必要があります。このガードは、受信リクエストがSPAからのステートフル認証済みリクエストとして認証されるか、リクエストがサードパーティからのものである場合は有効なAPIトークンヘッダを含むことを保証します。
```php:routes\api.php
use Illuminate\Http\Request;

Route::middleware('auth:sanctum')->get('/user', function (Request $request) {
    return $request->user();
});
```

## まとめ
以上で、Laravel SanctumのSPA認証の設定方法の解説は終わりです。この続きとしては、Laravel Fortifyを追加で導入して、ユーザー新規作成や、パスワード更新などのルートを追加するなどして使用します。今回は割愛しますが、また折を見て記事にしたいと思います
初心者必見！Laravelを使うならCollectionを活用しよう

開発をしているとArray型のデータを扱うことが多くあります。

PHPにはArrayに関する様々な関数が実装されていますが、
イテレートや値の変更という点でコードが読みにくくなりがち
という欠点もあります。

### Arrayは `array_xx()`の引数となることで変化する場合が多い
もし、下のコードでreturn の結果が実装者の予想と異なり原因を調査したいとして

```php
  $numbers = [1, 2];
  ・ // 間に何十行も処理がはさまっているとする
  $numbers = [1, 2, 3];
  ・
  return $numbers;
```

↑こうしたケースでは、$numbersがどう変化したかは追いやすいですが、次のようなケースではどうでしょう？

```php
  $numbers = [1, 2];
  ・
  array_push($numbers, 3);
  ・
  return $numbers;
```

↑$numbersの動きが少し分かりにくくなったかと思います

```php
  $numbers = [1, 2];
  $newNumbers = [];
  foreach($numbers as $i => $element) {
    $numbers[$i] = $numbers[$i] + 1;
    $element = $element + 1
    $newNumbers[$i] = $element;
    // $i=0のこの行時点での$numbers[$i]と$elementの値はどうなっているんだっけ？ foreachが終わったときの状態は？？?
  }
  return $numbers;
```

↑return 時点の$numbersを推測するのに、さらに集中力を要するようになりました。

この例ではチェックする先が10行にも満たないので、
「読めばわかるじゃん」で済むかと思います。
しかし実際にはこうした調査はバグの発生など、
心に余裕のない状況で行われるため、
直感的に理解しやすいコードであるに越したことはありません。


Collectionクラスはこれらの問題を解決してくれます。

### Collectionの変化は自身のメソッドで行う
```php
  $nunbers = collect([1, 2]);

  $nunbers->push(3);
  $namesWithNumbers = $nunbers->map(function ($element) {
    return $element + 1;
  });
  return $numbers;
```
- 要素の追加がメソッドで行えるため、$collectionを対象にした操作であることが分かりやすくなる
- map, each, filter などJavascriptでもお馴染みのイテレータが使える
- 繰り返しの内容がclosureに収まっているので、$numbersや他の変数の値が変化しないことが担保されている

他にも
- `collect(['a' => 'A'])->get('b', 'not found')`でキーが存在しない場合に`'not found'`を返してくれる(連想配列では undefined key のエラーとなる)
- `collect(['a' => 'A', 'b' => 'B'])->keys()`でキーの`[a, b]`だけを取得する
- `collect([1, 2, 3])->diff(collect([1, 2]))` で差分の `3` を取得する
- `firstWhere('age', '>=', 18)`でコレクションの中から条件に一致する要素を一つだけ取得する

などなど、紹介しきれないほど多様で便利なメソッドが公式ドキュメント1ページにまとまっています。
Collectionは実用性が非常に高く学習コストも比較的低いので、
Laravelの学習をどこから始めたらいいか迷っている人はぜひここから手をつけてみるのがオススメです。

https://readouble.com/laravel/9.x/ja/collections.html
Windowsでタスクスケジューラの実行が遅れたり失敗する時の対応

# 現象

ビルドインのSYSTEMユーザーで実行しているタスクスケジューラなのに実行が遅れる。

例えば毎日23:00に実行する設定なのに、実際は23:12だったり23:45だったり。
規則性は無く、大体12～45分くらい遅れる。（早くなることは無い）

時々、下記のようにイベント153で失敗することもある。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/4c612bb7-885e-88b6-e2bb-068374c94e48.png)

OSは『Windows 10 IoT Enterprise 22H2 19045.2364』。

# スリープ設定の変更で解消

問題が起きていた時は下記。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/ab3a3b15-c6da-a994-5dac-e08daa828705.png)

下記のようにしたところ、問題解消。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/3c3918de-b2b5-2680-204d-36bf4a41f519.png)

画面が焼き付いてしまうのを防止する為、ディスプレイのスリープはそのまま。

# 蛇足

タスクスケジューラに問題が起きた時は、スリープまわりの設定を変えてみるのも一つの手かと思います。
ApacheでIP制限を行いBasic認証をかける方法

# はじめに
Apacheの設定で対象のURLに対して、IP制限を行い、Basic認証をかける方法です。
.htaccessではなく、apacheのconfファイルに直接記載しております。

## 対象URL
対象URLに対しては、Locationで囲う。
```
<Location /hoge/huga>
</Location>
```

## 条件のマッチ
### RequireAll
RequireAllで、記述した条件がすべてマッチした場合にアクセスを許可させます。
こちらで、IP制限部分、Basic認証部分を囲います。
```
<RequireAll>
</RequireAll>
```

### RequireAny
RequireAnyで、記述した条件のいずれかがマッチした場合にアクセスを許可させます。
こちらで、IP制限であるRequire ipを記載します。
```
<RequireAny>
</RequireAny>
```

ロードバランサーを使用している場合は、以下を記載してください、
```
RemoteIPHeader X-Forwarded-For
```

# 全体
最終的にこうなりました。適宜置き換えてください。
```
RemoteIPHeader X-Forwarded-For
<Location /hoge/huga>
    <RequireAll>
        <RequireAny>
            Require ip XXX.XXX.XXX.XXX
            Require ip XXX.XXX.XXX.XXX
            Require ip XXX.XXX.XXX.XXX
        </RequireAny>
        AuthType Basic
        AuthName "auth"
        AuthUserFile /hogehoge/htpasswd
        Require valid-user
    </RequireAll>
</Location>
```
GitHubのリポジトリをクローンする際に表示されたエラー

## はじめに
初めてGitHub上にリポジトリを作成して、ローカルにクローンしようとした際に表示されたエラーです。

## エラー文
```
remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/xxx/xxx.git/'
```

## 原因
2021年8月13日以降、GitHubへのアクセスは、ユーザ名とパスワードではなく個人用アクセストークンで認証する必要があります。

## 解決方法
以下の公式ドキュメントを参考に個人用アクセストークンを作成する。
[個人用アクセス トークンの作成](https://docs.github.com/ja/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token)
変数のデータ型の種類

変数のデータ型の種類や使い方などを、学習し直した為、まとめていきたいと思います。
変数については以前簡単にまとめた記事がありますのでよろしければどうぞ。
[変数の定義　基本的な使い方](https://qiita.com/singekino-ojisan/items/12a51976b827e7dedb1c)

# 基本データ型の種類
javaでデータ型には大きく分けて、`基本データ型（プリミティブ型）`と`オブジェクト参照型（リファレンス型）`の2種類があります。
`オブジェクト参照型（リファレンス型）`には、`String型`、文字列を扱えるデータ型です。
[変数の定義　基本的な使い方](https://qiita.com/singekino-ojisan/items/12a51976b827e7dedb1c)こちらで、記事にしています。

`基本データ型（プリミティブ型）`は、数字や文字などの、最も基本的なデータの種類を扱うことができ、8種類あります。
ビット数とはPCのメモリ上で確保される桁数のことです。
同じような表現でバイト数というのもあり、一般的に`8ビット=1バイト`で扱われることが多いです。


| データ型 | 種類　| データの幅| データの表現範囲　|
|:-:|:-:|:-:|:-:|
|byte| 整数  |  8ビット | -128 ～ 127  |
|short|  整数|  16ビット | − 2の15乗～2の15乗 − 1(-32,768 ～ 32,767)  |
|int|  整数 |  32ビット |− 2の31乗～2の31乗 − 1(-2,147,483,648 ～ 2,147,483,647)|
|long| 整数  | 64ビット  |− 2の63乗～2の63乗 − 1(-9,223,372,036,854,775,808L ～9,223,372,036,854,775,807L)|
|fioat| 浮動小数点数  |  32ビット | IEEE 754 規格の単精度浮動小数点数  |
|double| 浮動小数点数  | 64ビット  |  IEEE 754 規格の単精度浮動小数点数 |
|char| 文字  | 16ビット  | Unicode規格の１文字（\u0000～\uFFFF）  |
|boolean|  論理値 | 1ビット  |trueまたはfalse|

この中で小数を表すデータ型は、`double型`と`float型`です。
小数型はデータサイズが変わることによって、格納するデータの精度が異なります。
小数を表すとき、`浮動小数点数`という数値が用いられます。
`浮動小数点数`とは、計算で誤差が発生することを前提とした数値データのことです。
なぜ、計算に誤差が出るのかと言うと、プログラム内でデータの表現に2進数を利用することが原因です。2進数で小数を表現する場合、
```
<2進数>  　 <10進数>
　0.1    →　 0.5
　0.01   →　 0.25
　0.001  →　 0.125
```
この様に半分になっていく数を足した結果として表します。
10進数で0.5などのピッタリ表せる数なら問題はないですが、10進数の0.01などを、2進数で表そうとすると、`0.00000010100011110101110000101000111101・・・・`の様に無限ループが続いてしまいます。
これをそのまま保存できないので、途中で保存することになります。これが原因で計算に誤差を生むことがあります。
では、簡単に一つ一つ説明してみます。
***
***`byte`***
8bit(1byte)の符号付整数。
-128～127
8bitというのは8桁の2進数。
10000000～01111111(-2の7乗～2の7乗-1)
一番左の桁が符号を表します。1が-、0が+（符号付整数型すべてに共通）

***`short`***
16bitの符号付整数。
-32768～32767
1000000000000000～0111111111111111(-2の15乗～2の15乗-1)

***`int`***
`Integer型`の省略表現。
32bitの符号付整数。
-2147483648～2147483647（約21億）
1000000000000000・・・(-2の31乗～2の31乗-1)
`int型`の仲間に`long型`という型があります。
`int型`と`long型`の違いは箱の大きさです。

***`long`***
64bitの符号付整数。
-約922京～約922京
1000000000000000・・・(-2の63乗～2の63乗-1)
　int型を超えるlong型の範囲の数値を書くときは、数字の最後に`「L」`または`「l」`をつけないとint型と判断されてコンパイルエラーになります。

***`fioat`***
32bitの浮動小数点数。（小数点以下を含む数）
リテラル（プログラムのソースコードにおいて使用される。数値や文字列を直接に記述した定数のこと）
にfloat型の数値を書くときは、数字の後ろに`「F」`または`「f」`をつけます。

***`double`***
64bitの浮動小数点数。
整数型の値と比べ、値の桁数が多く小数も扱えるような数値です。
浮動小数点数型は割り算をした際、小数点以下に誤差が出でます。
[BigDecimalクラス](https://qiita.com/y-hira18/items/1f84e0fc7ed4ad373e64)を使うと小数点以下の計算で正確な値が出せます。
double型の最大値は`1.797693e+308`、`最小値は2.225074e-308`です。

***`char`***
Unicode文字、1文字を扱うデータ型です。
簡単に言うと日本語の「あ」や「い」といった1文字を格納します。
4桁の16進数（0000～FFFF）に対応しています。
コメントをいただいたのでリンク貼ります！
[補足](https://qiita.com/singekino-ojisan/items/7d327380b1b7c40db7fb#comment-8423f115520ff8cf6aa0)
「あ」であれば「0x3042」といった風に、それぞれの文字に0～65535までの一意の番号が割り当てられます。
```text:例
char 変数名 = '任意の1文字';
```
***`boolean`***
1bit、つまり一桁の0か1で、trueかfalseのどちらかの値を格納する。
まず`true`か、`false`を宣言します。
```java
boolean a = true;
```
```java
boolean a = false;
```

と一つ一つ簡単に説明していきました。
調べてみて、思ったことは、正直難しかったです。
これを、実務でパッと使いこなす、エンジニアに方々、本当に尊敬します。
私も経験を積んで、使いこなせる日が来るのだろうか。。。。

努力します！！！！
かなり、頭パンクしそうな感じで書いていったので、間違いや、変なところあったら指摘お願い致します。

ありがとうございました。
PHP 繰り返し処理記述のコツ

<h2>はじめに</h2>
普段からループ処理を書いていると、途中で何を書いているかわからなくなったり、順番がおかしくなったりすることが多々あったのですが…

良い方法を学んだので書き残しておきます。

<h2>繰り返し処理のコツ</h2>

1.日本語で本文の処理を書く
2.コードに置き換える
3.ループで囲む
4.変数の初期化等を追記する

以上4つの順番で処理を書いていきます。
感覚としては、ループの内側から外側にむかって順番に書いていく感じです。

<h2>例</h2>

<b>例</b>

スーパーで複数の商品を購入して、その合計金額を算出する繰り返し処理

1.日本語で本文の処理を書く

```php
//料金を取得する
//料金を合計する
```

2.コードに置き換える

```php
//まぁ料金は$price変数にしようかな～
//購入した商品は$itemにして～
//連想配列でpriceっていうキーを持ってて、そこに値を持ってる感じにしよう
$price = $item['price'];

//次は料金を合計したいから、$totalに値段を足していけばいいか～
$total += $price;
```

3.ループで囲む

```php
//$itemだとループで処理しずらいな～
//$itemsっていう$itemを格納してる配列を作ってループを回そう
foreach ($items as $item) {
	$price = $item['price'];
	$total += $price;
}
```

4.変数の初期化等を追記する

```php
//じゃあ変数の初期化をしようか
//見た感じ、$itemsと$totalかな～

$items = [
	['name' => 'onion', 'price' => 100],
    ['name' => 'Carrot', 'price' => 120],
    ['name' => 'Cucumber', 'price' => 80],
    ['name' => 'potato', 'price' => 100],
];

$total = 0;

foreach ($items as $item) {
	$price = $item['price'];
	$total += $price;
}
```

終了。

<h2>おわり</h2>

この4ステップの良いところは、<b>同時に複数の条件や計算をしないで済む</b>とうところです。

初学者の方は使ってみてください。

<h2>参考</h2>

[独学エンジニア](https://dokugaku-engineer.com/course/serverside)
node.jsでalexaスキル その4

# 概要
node.jsでalexaスキル、やってみた。
練習問題やってみた。

# 練習問題
dynamodbを、使え。

# サンプルコード

```
const LaunchRequestHandler = {
	canHandle(handlerInput) {
		return Alexa.getRequestType(handlerInput.requestEnvelope) === 'LaunchRequest';
	},
	async handle(handlerInput) {
	    const attributesManager = handlerInput.attributesManager;
	    const attributes2 = await attributesManager.getPersistentAttributes() || {};
        let counter = attributes2.hasOwnProperty('counter') ? attributes2.counter : 0;
		let speakOutput = `こんにちは、カウンターは${counter}です`;
		counter++;
        let attributes1 = {
		    "counter": counter
	    };
	    attributesManager.setPersistentAttributes(attributes1);
	    await attributesManager.savePersistentAttributes();
		return handlerInput.responseBuilder.speak(speakOutput)
			.reprompt(speakOutput)
			.getResponse();
	}
};



```

# 実行結果


![kiyosi.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/8af45d64-a773-60e8-938a-b626e5722bed.png)


以上。
【AWS】ECS+FARGATEでサービスのタスクを更新する

ECS+FARGATEの構成でWebアプリを作成しようと思っているので、ソースを変更したときにサービスの更新もしなければならないのでやってみる

現状はこんな感じ↓　フリー席予約アプリを作ろうと思っているので「Hello World フリー席予約アプリです」が表示されている
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2884542/cf4b1cbe-d94f-9cc6-1c79-53fc21d44208.png)

1. ソースの変更
codecommitでソースを管理しているので変更していきたいと思う
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2884542/301ece5b-620e-894b-68e5-c48917cc0893.png)
今回は「こんにちは！　フリー席予約アプリです」とした

2. タスク定義を変更する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2884542/1e5f8af4-d508-32ca-c5e9-729cda958b66.png)
変更したいタスクをクリックして「新しいリビジョンの作成」をクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2884542/f3dfb525-ac71-2952-af90-1480b206ad7c.png)
コンテナ追加からソースを変更して、新しく作成したコンテナを追加する
※コンテナの名前を一意の名前にする（前回作成したコンテナの名前と同じにする）

3\. サービスの更新
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2884542/f9f5ff5e-4545-bdeb-b102-c3eb911275fe.png)
更新したいサービスをクリックして更新を選択する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2884542/214680b7-39e8-451e-db2c-3d6ebf7eabcc.png)
先ほど新たに作成したタスクを選択

サービスのタスク欄を確認する
更新直後・・
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2884542/eb42b494-e9e9-f860-996a-b295d3d4eeb2.png)

数分後・・
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2884542/a23ed565-6f45-5692-5547-0a06ed46410c.png)

更新直後は前回の分も起動しっぱなしになっていたが、数分経つと新しく作成し、指定したタスク定義だけが起動していることが分かる

ブラウザでアクセスしてみると・・
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2884542/b10ad976-7683-a200-2d12-3532494b665e.png)
「こんにちは！　フリー席予約アプリです」となっており、正常に更新された！
Falco Ruleを紹介するシリーズ - Create Privileged Pod

本シリーズでは、ランタイム脅威検知のデファクトスタンダードである<a href=https://falco.org/ target=new>Falco</a>の検知Ruleを、１つの記事で１つ簡単に紹介していきます。
ランタイムセキュリティやFalco自体の概要を知りたい方は<a href=https://sysdig.jp/blog/intro-runtime-security-falco/ target=new>こちらのブログ記事</a>をご参照ください。
今回ご紹介する検知Ruleは<b>「Create Privileged Pod」</b>です。
# Rule記述
```
- rule: Create Privileged Pod
  desc: >
    Detect an attempt to start a pod with a privileged container
  condition: kevt and pod and kcreate and ka.req.pod.containers.privileged intersects (true) and not ka.req.pod.containers.image.repository in (falco_privileged_images)
  output: Pod started with privileged container (user=%ka.user.name pod=%ka.resp.name resource=%ka.target.resource ns=%ka.target.namespace images=%ka.req.pod.containers.image)
  priority: WARNING
  source: k8s_audit
  tags: [k8s]
```
# Rule概要
<a href="https://github.com/falcosecurity/plugins/tree/master/plugins/k8saudit" target=new>Kubernetes Audit Events Pluginプラグイン</a>をインストールすることで使用可能になるルールです。
特権付きコンテナは、ホストに対するルートレベルのアクセス権を有しています。
攻撃者は特権付きコンテナを起動し、コンテナからエスケープすることでホストにアクセスし、ホストを侵害する特権昇格戦術をとることができます。
K8s環境のセキュリティ保護に関する基礎とベストプラクティスについては、<a href="https://sysdig.jp/blog/kubernetes-security-101/" target=new>こちらのブログ記事</a>もご参照ください。

# Condition（条件）
`kevt and pod and kcreate and ka.req.pod.containers.privileged intersects (true) and`
PodのK8s Auditイベントで特権付きコンテナが有効（true）になっており、

`not ka.req.pod.containers.image.repository in (falco_privileged_images)`
コンテナイメージのリポジトリがFalcoの特権付きコンテナイメージではない場合

# Output（出力）
特権付きコンテナを含むPodが起動しました

`%ka.user.name`
K8sユーザー名

`%ka.resp.name`
K8sレスポンスオブジェクト名

`%ka.target.resource`
K8sターゲットオブジェクトリソース名

`%ka.target.namespace`
K8sターゲットネームスペース名

`%ka.req.pod.containers.image`
K8s Podコンテナイメージ名
StringをStringリテラルのユニオン型に安全に型変換する

型をかっちり固めて開発をする際に、リテラルのユニオン型は欠かせません。
ただし、URL ParameterやAPI Responseなどの受け口では、詳細な型情報の無いstringを受け取ることはよくあります。
型をかっちり固めて開発際には、その受け口で詳細な型に変換し、内部の詳細なロジックの実装部分では詳細な型情報の元で考慮を減らして開発したいものです。

型キャストとして `as` がありますが、型情報の強制的な上書きであり、実際の値と型との乖離を生む危険性があります。
type guardを定義して、安全な型変換を実現します。

# 結論

以下の様に実装することによって、`isSample`関数は型に合致するかを表すbooleanを返しつつ、引数に与えたString型の変数(sample)にSampleの型情報を付与します。

```ts
const samples = [
  'valueA',
  'valueB',
] as const
type Sample = typeof samples[number]

export const isSample = (
  sample: string
): sample is Sample => {
  return samples.some((v) => v === sample)
}
```

`isSample`関数は、以下のように使用できます。
想定外の文字列が与えられた場合は適切にハンドリングしつつ、想定どおりである場合には型情報が与えられた変数を利用できて便利です。

```ts
// type of sample: string
if (isSample(sample)) {
  // 文字列sampleがSample型に含まれている場合
  // type of sample: Sample
} else {
  // 文字列sampleがSample型に含まれていない場合
  // type of sample: string
}
```

type guard便利ですね。
type guardを利用すると、他の型同士の変換の実現にも応用できます！
【AWS】CodeBuildのエラー　COMMAND_EXECUTION_ERROR

AWSでcodebuildをしたら`COMMAND_EXECUTION_ERROR: Error while executing command: docker build -t $IMAGE_REPO_NAME:$IMAGE_TAG -f $DOCKERFILE .. Reason: exit status 1`なるエラーが出力され、うまくいかなかった。

https://qiita.com/tatsuakimitani/items/b4447635476c628f5dee

↑の方の記事を見てみたが、当てはまるものはなく・・・

そこで、ログを見てみると・・
```
[eslint] 
src/App.tsx
Syntax error: '>' expected (23:4)
```
そのまま書かれていました
下のコードの`>`が抜けていました
何かの拍子に削除してしまったようです
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2884542/51804e47-9364-e36e-7b83-21c4b74d4a24.png)

このようにエラーが出力されたときはログを見る癖をつけて解決しましょう！
ksqlDBを使ってIoTデータからオフライン状態のデバイスを識別してみる

### 概要
今回は、IoTのをユースケースを、ksqlDBを利用して試してみました。

### IoTのユースケースを考えてみるきっかけについて
近年、IoT、AIのユースケースも珍しくなくなってきました。ところが先日、あるお客様からIoTシステムは便利だけどIoTデバイスを過度に信用しすぎると危険だという話を聞きました。よく伺ってみるとそのお客様の現場にあるメタン検知用ガスセンサ搭載のIoTデバイスが不調(完全に壊れていない状態)で、そのデバイスから収集したデータをそのまま信じてAI/MLで処理すると想定外のトラブルが発生する可能性があるということでした。

これを聞いてksqlDBを使ってIoTデータからデバイスがオフラインになっているか、またはいつもと違う状態になっていることを自動で検知できればこうした課題に少しは役立つかなと思い簡単なケースを想定して試してみました。

### IoTのユースケースについて
IoTといえば例えば車両や製造設備またはスマート家電などにも広がっています。IoTデバイスによるデータの多くは特定の時間に生成、処理され、そのデータ量と速度が重要な要素となる場合が少なくありません。こうしたケースでは、通常時と比較してデータ送信（共有）の挙動が変化した場合はデバイスのメンテナンスが必要な時期かもしれないという判断をする手助けするIoT資産追跡システムの重要な機能として実装されることもあるようです。
ここでは、シンプルにksqlDB を使用してどのデバイスのデータが取得できなくなったかを確認する方法をご紹介します。

### ksqlDBを使う
ksqlDBは、クラウド内の一般的なデータソースやエンドシステムから直接データをインポートおよびエクスポートするができます。ここでは、ksqlDBのINSERT INTO機能で模擬データを使用してコードを実行します。
この例では、IoTのユースケースとしてデバイスからのデータ取得の際に異変があることを知ることで、そのデバイスの故障の予兆検知であったり、サイバー攻撃の対象となっている可能性などを判断することに役立つものをイメージしました。

### 手順１：STREAMを作成する
以下のksqlDB構文を実行します。
```sh
CREATE STREAM iot_telemetry( 
　　device_id INT, 
　　ts BIGINT 
) WITH ( 
　　KAFKA_TOPIC = ‘iot_telemetry‘, 　　　　
　　VALUE_FORMAT = 'JSON‘, 　
　　PARTITIONS = 6, 
　　TIMESTAMP = 'ts’ 
);
````

### 手順２：ビューを作成する
```sh
CREATE TABLE iot_telemetry_lags WITH (KAFKA_TOPIC = 'iot_telemetry_lags') AS 
SELECT 
　device_id, 
　WINDOWEND - LATEST_BY_OFFSET(ts) as lag_ms, 　
　TIMESTAMPTOSTRING(WINDOWSTART, ‘yyyy-MM-dd HH:mm:ss’) as window_start, 　
　TIMESTAMPTOSTRING(WINDOWEND, 'yyyy-MM-dd HH:mm:ss') as window_end 
FROM iot_telemetry 
WINDOW TUMBLING (SIZE 120 SECONDS) 
GROUP BY device_id;
````

### 手順３：模擬データを投入する
ここでは、ksqlDBを使って模擬データを投入します。
```sh
INSERT INTO iot_telemetry (device_id, ts) VALUES (1, 1655144403000); 
INSERT INTO iot_telemetry (device_id, ts) VALUES (0, 1655144403000); 
INSERT INTO iot_telemetry (device_id, ts) VALUES (0, 1655144423000);
INSERT INTO iot_telemetry (device_id, ts) VALUES (0, 1655144443000); 
INSERT INTO iot_telemetry (device_id, ts) VALUES (0, 1655144463000); 
INSERT INTO iot_telemetry (device_id, ts) VALUES (0, 1655144483000); 
INSERT INTO iot_telemetry (device_id, ts) VALUES (0, 1655144503000); 
INSERT INTO iot_telemetry (device_id, ts) VALUES (0, 1655144523000); 
INSERT INTO iot_telemetry (device_id, ts) VALUES (0, 1655144543000); 
INSERT INTO iot_telemetry (device_id, ts) VALUES (0, 1655144563000); 
INSERT INTO iot_telemetry (device_id, ts) VALUES (0, 1655144583000); 
````

### 手順４：確認する
ここでは、模擬データが正しく投入されたか以下のクエリを実行して確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128268/625f4184-46ad-bbad-6378-7bf62f8527c1.png)

模擬データが正しく投入されていれば、実行結果は以下のとおりとなります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128268/c9fb7742-1360-60cd-e920-bd11af97b5ef.png)

この例では、一定時間IoTデバイスからテレメトリ―データが送信されていない状況をウォッチして、もしその状況(今回の例の場合はlag_msの値が60000を超えた時)になったら該当するデータを出力するというものでしたが、非常にシンプルなSQLの構文でIoTデバイスの状況をチェックできることがわかりました。

今回も最後までお読み頂きましてありがとうございまいた。
seed_fuでYour seed constraints contained unknown columns: `id`.と言われたのはそのテーブルのプライマリキーがidではなかったから

Fusicの賀来という者です。

https://fusic.co.jp/

## 解決したい問題

ある日、Railsアプリでseed_fuというgemでseedを流したところ、怒られました。

```terminal
rails aborted!
ArgumentError: Your seed constraints contained unknown columns: `id`. Valid columns are: `user_id`, `group_id`, `group_uid`, `created_at`, `updated_at`.
```

gemはこちら。

https://github.com/mbleigh/seed-fu

バージョンの確認です。
古くてちょいアレですが...。

```
ruby:2.3.4
Rails 5.1.7
```

seedファイルはこうなっています。

```ruby
UserRegistration.seed do |ur|
  ur.user_id = user.id
  ur.group_id = group.id
end
```

Modelをよく見たら、プライマリキーが別途設定されていました。

```ruby
class Post < ApplicationRecord
  self.primary_key = 'user_id'
end
```

## 解決

この場合、seedメソッドの引数にprimary keyの情報を渡してあげれば良い。

```ruby
    UserRegistration.seed(:user_id) do |ur|
      ur.user_id = user[0].id
      ur.group_id = group.id
    end
```

うまく行きました。
Terraformでセキュリティグループを設定してEC2にhttp接続する

# はじめに
Terraformの勉強を始めたので備忘録を兼ねて行ったことを投稿しようと思います。
これは[前回の投稿](https://qiita.com/kakita-yzrh/items/980f3209d587e7e349a6)の続きです。
前回の投稿ではTerraformでIAMを設定してEC2にセッションマネージャー経由で接続しました。
今回はhttp接続できるようにセキュリティグループをTerraformで設定します。
※EC2にはセッションマネージャー経由で接続できるので、予めnginxをインストールして起動しておきます

# Terraformでセキュリティグループの定義を行う
### http接続用のセキュリティグループを定義
http接続できるようにセキュリティグループを定義します。
```terraform:securitygroup.tf
resource "aws_security_group" "test" {
  name = "tf_test"

  tags = {
    Name = "tf_test"
  }
}

resource "aws_security_group_rule" "ingress_http" {
  type              = "ingress"
  from_port         = 80
  to_port           = 80
  protocol          = "tcp"
  cidr_blocks       = ["0.0.0.0/0"]
  security_group_id = aws_security_group.test.id
}

resource "aws_security_group_rule" "egress_all" {
  type              = "egress"
  from_port         = 0
  to_port           = 0
  protocol          = "all"
  cidr_blocks       = ["0.0.0.0/0"]
  security_group_id = aws_security_group.test.id
}
```

### EC2に定義したセキュリティグループを設定
前回作成したec2.tfに定義したセキュリティグループを追加してhttp接続を許可します。
```terraform:ec2.tf
resource "aws_instance" "test" {
  ami           = "ami-0404778e217f54308"
  instance_type = "t3.micro"

  iam_instance_profile = aws_iam_instance_profile.test.name

  # 以下を追加
  vpc_security_group_ids = [
    aws_security_group.test.id
  ]

  tags = {
    Name = "tf_test"
  }
}
```


# Terraformで定義したセキュリティグループを追加してEC2を作成
### Terraformのplan applyを実行
前回と同様、terraformの`plan` `apply`を実行して、AWS上にリソースを作成します。
```bash
terraform plan
terraform apply
```

### http接続を行う
問題なければ、EC2のパブリックIPをもとにhttp接続するとnginxのページが表示されます。

# 作成したリソースの削除
前回と同様、terraformの`destroy`を実行して、AWS上のリソースを削除します。
```
terraform destroy
```

# さいごに
今回は作成したEC２にhttp接続する為のセキュリティグループの定義を行いました。
まだまだ実運用するにはいろんな設定が足りないですが、最低限、作成したEC２にhttp接続ができるところまではTerraformで実現できるようになりました。
この調子でTerraformで少しずつ設定できるAWSサービスを増やしていこうと思います。
【AWSコスト最適化設定】AWSを安く使おう！


## 前書き
AWSを何も考えずに学習していると、びっくりしてしまうような請求が
来てしまった。。

そんな経験がある方もいらっしゃるのでは。。

今回はSAAアソシエイト試験の学習も兼ねて安く！安心に！
利用する方法をまとめてみました！

## コスト最適化とは？
いわゆる安く使うために必要な設計が必要になります。
具体的には。。

・不必要なリソースを少しでも削減する
・ケースごとに最適なサービスを利用する
・マネージド型サービスを上手く使いコスト削減
・請求されるコストを把握すること
など。。

公式にもコスト最適化のための記事が出ています！

https://aws.amazon.com/jp/architecture/cost-optimization/?cards-all.sort-by=item.additionalFields.sortDate&cards-all.sort-order=desc&awsf.content-type=*all&awsf.methodology=*all

## AWSの課金の仕組み/課金を抑える
基本的にAWSは利用料に比例してコストが発生します。
ただし使い方によっては割引価格でサービスを利用できます！

割引で使えるケースは以下。
### サービスの利用を予約する
EC2などが代表ですが、リザーブドインスタンスを利用することで
割引が適用されます。

期間は通常1〜3年を想定されており、最大70%以上割引可能とのこと。
使用量などが予測できるケースなどに適してそうですね！

### 使用量を増やすと割引
AWSでは使えば使うほど料金が安くなる事が可能。
いわゆるボリュームディスカウントと呼ばれる方法です。

### 使用量を予め決める
Savings Plansというものがあり、使用量を予め決定した上で
利用することで割引可能。

Amazon EC2、AWS Fargate、AWS Lambda に適用可能。

### 利用するサービスの選択(AWS Compute Optimizer)
使用率データに基づいて、EC2インスタンスタイプなど
最適な設定を提案してくれます。

私みたいな初心者はサービスの知識が少ないので、
こういうのは安心ですよね〜！

公式にも課金について説明している記事がありました。

https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/concepts-reserved-instances-application.html

## 請求コストを把握する
安く使っても、利用できる額は決まってると思います。
個人なら尚更。。

そこでどの程度コストが掛かっているのか確認する方法を
みてみましょう。

### Pricing Calculator
いわゆるコスト見積もりツールです。

サービスごとの請求額を見積もりすることができます。
利用しているサービスを統計することで、アーキテクチャ全体のコストを
把握することも可能です！

### Cost Explorer
今後どの程度コストがかかるかわかるサービスになります。
例えば今月末に請求されるであろう金額を把握することができます。

実際の例を貼っておきます。

![スクリーンショット 2023-01-11 9.36.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/945342/36addd02-c283-4e25-6ed0-5540349f594a.png)

:::note info
サービスごとのコストが把握可能！
:::

![スクリーンショット 2023-01-11 9.36.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/945342/02f6b52d-4bd8-a123-5e6e-f892d37b8e38.png)

:::note info
これは月の中旬に確認したものになります。
月末のコストなどを予測してくれてますね！
:::


### Cost Allocation Tags
AWS利用明細において、タグ別に利用料金を出力したい場合に利用します。

例えばグループごとにタグをつけておくことで、グループごとに
コストを分析したり把握する事ができます！

![CostAllocationPartExampleReport.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/945342/61e761db-5029-930c-fb6a-f09d0191f110.png)

## コストの異常を検知する
上記の対策をしても、コストが予測より多く掛かっていたり
不正な利用があったりする事があります。

月末に気づいた時には莫大な請求額が。。
そんなことにならないように、異常を検出する方法があります。

### CloudWatch
請求額に対するアラーム設定が可能です。

例えば月に100$を超えたらアラームする設定をすることで、
コストを把握する事ができるわけです。

月初にアラームが検出されたら一大事。。
でもすぐに気づければ傷も少なく済むので必ず設定したい機能ですね！

https://aws.amazon.com/jp/cloudwatch/


### AWS Budgets
使用量や予算額を超えた場合にアラームがかかります。
CloudWatchとの違いは、コストのタイプや利用サービスごとに細かく設定できることです。

## 最後に
いかがでしたでしょうか。
AWS初心者には特に心強いサービスがあることを把握
いただければ嬉しいです！

莫大な請求が来てしまうという怖い話を耳にしたりするので、
本記事の知識を参考にしていただけたら幸いです！

## 参考文献
・AWS公式ページ (課金の仕組み)

https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/concepts-reserved-instances-application.html

・AWS公式ページ (Cost Category)

https://docs.aws.amazon.com/aws-cost-management/latest/APIReference/API_CostCategory.html

・AWS公式ページ (Cloud Watch)

https://aws.amazon.com/jp/cloudwatch/

・AWS公式ページ (AWS コスト配分タグの使用)

https://docs.aws.amazon.com/ja_jp/awsaccountbilling/latest/aboutv2/cost-alloc-tags.html
【AWS学習】AWSサービスとグローバル、リージョン、AZとの関係

## AZ（アベイラビリティーゾーン）
物理的なデータセンタ群。

地理的にも電力的にも独立している。
そのため、落雷や大雨などの浸水などの障害が発生しても他のAZに影響が出ないように配置されている

AZ間で冗長的に配置することで、可用性の高いシステムを構築することができる。
AWSが掲げる7つのベストプラクティスである「故障に備えた設計で障害を回避」にも該当する。

## リージョン
複数のAZが存在する地域

-------
リージョン > AZ
リージョンの中にAZが配置されているイメージ
例）　東京リージョン > 新宿AZ（本当はどこに配置されているか不明だけどイメージで。。。）

## サービスレベル
**注意**
1つのリージョン内のAZサービス間であれば、プライベートIPアドレスで接続できる。
リージョン間では、グローバルIPアドレスで接続しなければならない。


グローバルサービス　> リージョンサービス > AZサービス

### グローバルサービス
どこのリージョンからでも共通のサービスとして利用できる

### リージョンサービス
リージョン毎に作成・管理される

### AZサービス
AZ毎に作成管理される

|                    | サービス名 | サービスの概要 | 
| :----------------: | :--------: | :------------: | 
| グローバルサービス | IAM        |   認証・アクセス制限             | 
| 　　| Route53        |  DNS              | 
| 　　| CloudFront        |  コンテンツ配信           | 
| リージョンサービス | S3         |     ストレージ           | 
|  | S3         |                | NoSQL
|  | SQS         |                | キュー
|  | CloudSearch         |                | 検索
| AZサービス         | EC2        |  仮想マシン              | 
|  | RDS        |   リレーショナルDB             | 
|  | ELB        |   負荷分散             | 
|  | ElasticCache        |   キャッシュ             | 


例）
・「ELB」は「AZサービス」なので、リージョンを跨いで負荷分散できない
・「Route53」は、「グローバルサービス」なので、リージョンを跨ってサーバーやDBを配置できる

### 参考書籍
[合格対策 AWS認定ソリューションアーキテクト －アソシエイト](https://amzn.to/3XeEAjW)
クロス集計表を作成する1＊1_統計量(SPSS Modeler データ加工逆引き11-5)

# クロス集計表を作成する（1＊1_統計量の集計表）

![スクリーンショット 2022-12-21 14.17.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/464ed625-dd2e-b3b0-fc79-0cb5cf343a03.png)

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

・データ理解のための基礎統計量の確認
・固定帳票の作成


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

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

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

####  ①クロス集計ノードを利用する

![スクリーンショット 2022-12-21 14.28.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/d27c4198-83a4-482a-d683-3673c32af062.png)

入力するデータは以下の通りです。
![スクリーンショット 2022-12-27 10.33.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/50732955-fe98-94b2-2efb-b7dfc3dc8bb8.png)

[クロス集計]ノードを編集します。[行]に[血液型]を[列]に[年代]を指定します。その上で[関数]を選択して[体重]の[平均]を求めます。
![スクリーンショット 2022-12-27 10.34.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/6af448c9-835e-524e-95e8-d0d2e0e603e1.png)

[クロス集計]ノードを実行します。
![スクリーンショット 2022-12-27 10.35.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/648e437d-d999-6721-7ab3-20707d048cd0.png)

####  ②固定帳票作成のための処理

![スクリーンショット 2022-12-27 10.40.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/7ebca616-070e-7cbc-dcb8-a0a107dbd9bc.png)

a.入力するデータは以下の通りです。
![スクリーンショット 2022-12-27 10.33.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/50732955-fe98-94b2-2efb-b7dfc3dc8bb8.png)

b.[再構成]ノードを以下のように編集します。[年代]を[再構成フィールド]に移して[値フィールド]に[体重]を選択します。
![スクリーンショット 2022-12-27 10.37.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/6fdf2a53-9e15-5950-c521-0a114cccdc4b.png)

[プレビュー]します。
![スクリーンショット 2022-12-27 10.38.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/8291dd79-9033-2099-1ff5-765123df106b.png)

c.[レコード集計]ノードを以下のように編集します。
![スクリーンショット 2022-12-27 10.38.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/869e95a5-a119-c2be-f18e-b62caf44a80a.png)

d.[フィルター]ノードを以下のように編集します。
![スクリーンショット 2022-12-27 10.39.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/448aed71-455d-5b62-cd38-7087b77b7fd5.png)

[デーブル]ノードを実行します。
![スクリーンショット 2022-12-27 10.41.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/f1b05056-3918-258a-4584-08d60da0583d.png)

#### 注意事項

クロス集計表は表示して終了するために、表の展開/自動化には②が有効です。
[再構成]ノードで列に展開するメンバーが表示されないときは前方でデータ型の[値の読み込み]を実行します。

## 4.参考情報

####  クロス集計ノード

https://qiita.com/416nishimaki/items/7006912d4d4f6515841b

####  カテゴリ値を列に展開してIDで集約　縦持ちを横持ちへ

https://qiita.com/416nishimaki/items/2519553c7cce0fc0b0e0

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

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

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

https://qiita.com/416nishimaki/private/4bf813e6cba84b2a1008
【Spigot/Paper】maven.sk89q.comを使うべからず【WorldEdit/WorldGuard】

## 要約
* `maven.sk89q.com`はメンテされてない上に2021年12月から更新が凍結されているので使うべからず。
* 代わりに`maven.enginehub.com`を使うこと。古いバージョンも含んでいるのでこちらのほうが良い。

## 背景
皆さん<sup>[誰？]</sup>はSpigotのプラグインを開発するときにWorldEditやWorldGuardと連携した機能を追加することがよくあると思います<sup>[要出典]</sup>。昔<sup>[いつ？]</sup>は`maven.sk89q.com`というmavenレポジトリを経由してdependency graphに組み込むのが王道<sup>[要出典]</sup>とされていました<sup>[誰によって？]</sup>。

そんな中、2021年12月より高い安定性のためにEngineHub[^1]が主導するプロダクト[^2]のリリースする先が`maven.enginehub.com`に変更されます。そして、すでに非推奨となっている`maven.sk89q.com`の更新を凍結すること、エンドユーザーが**可及的速やかに**移行することがEngineHubの公式Discordで発表されました。

2022年6月には`maven.sk89q.com`のサーバーがダウンしていることが発表され、速やかに移行するようにアナウンスがなされていました。

## おわりに
`maven.sk89q.com`は不安定なのでこれを機にさっさと乗り換えてしまいましょう。

[^1]: WorldEditやWorldGuardなどの開発の主軸を担うコミュニティ。
[^2]: WorldEdit、WorldGuard、CraftBook
CData コネクタの活用 Twitter 情報の分析

## はじめに
[CData](https://www.cdata.com/jp/drivers/) は様々なデータソースに接続可能なコネクタを提供しています。以前に [Active Directory](https://qiita.com/ExtremeCarvFJ/items/b38076e093e20d6192a8) や [SharePoint]( https://qiita.com/ExtremeCarvFJ/items/e28555dfc041e5775bb5) に接続して情報を活用する手順を紹介しました。今回は、Twitter に接続して情報を分析してみたいと思います。

## コネクタ
#### コネクタの入手
CData の Twitter JDBC Driver 評価版を利用します。まずは下記 URL にアクセスし、対応データソースから Twitter を選択します。その後、[JDBC] > [ダウンロード] > [ダウンロード評価版] > [ダウンロード Windows Setup (.exe)] の順に進み、TwitterJDBCDriver.exe をダウンロードします。

https://www.cdata.com/jp/driver

TwitterJDBCDriver.exe を実行すると、デフォルトで以下にファイルが解凍されます。
`C:\Program Files\CData\CData JDBC Driver for Twitter 2022J`
lib フォルダに以下のようなファイルが存在します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2128512/43e4517e-ffd0-4b26-2ffa-55c464267739.png)

#### コネクタのインストール

ライセンスファイル cdata.twitter.lic を zip ファイルに圧縮した後、cdata.jdbc.twitter.lic.zip をcdata.jdbc.twitter.lic.jar に名称変更します。プラグイン管理画面で .jar か .yfp ファイルしか登録できないことへの対応です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2128512/04ead757-df39-810b-af3c-d2e2765d8ec6.png)

Yellowfin 画面から [管理] > [プラグイン管理] > [追加] と進み、cdata.jdbc.twitter.jar をドロップして追加した後、「さらに追加」を選択して、cdata.jdbc.twitter.lic.jar を追加します。結果、以下のように、実行ファイルとライセンスファイルの両者を合わせて登録します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2128512/eaa07355-3632-344a-040f-83f13574afe3.png)

## データソース
Yellowfin 画面から [管理] > [プラグイン管理] > [追加] と進み、[新規データ接続] で [データソースを選択] から [データベース] を選択します。
新規接続の設定画面から、以下を参照に新規接続を作成します。

|項目|設定値|
|---|---|
|名前|Twitter CData|
|認証アダプター|Standard Authentication|
|データベースタイプ|一般 JDBC データソース|
|JDBC ドライバー|cdata.jdbc.twitter.TwitterDriver(Twitter CData)|
|接続文字| jdbc:twitter:AccountId=&lt;your_account&gt;;InitiateOAuth=GETANDREFRESH; |
|ユーザー名|&lt;your_account&gt;|
|パスワード|********|
|スキーマ|Twitter|

接続文字列内の InitiateOAuth に指定するオプションの詳細は、以下でご確認ください。

https://cdn.cdata.com/help/RTG/jp/jdbc/RSBTwitter_p_InitiateOAuth.htm

接続文字列の末尾に下記を付与することで、指定したディレクトリにログファイルを出力することもできます。
`LogFile=C:\log\TwitterLog.log;Verbosity=3;`

[ビュー作成] ボタンを押下し、接続が成功し、テーブル名が参照できればひとまず大丈夫です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2128512/4d6a9363-b196-5a26-ea88-bbc4ac7c9bb3.png)

## ビュー作成
先の手順で作成したデータソースを参照して、[ビュー](https://wiki.yellowfin.co.jp/pages/viewpage.action?pageId=2294093)を作成します。

Tweets テーブルを参照すると、自分がフォローしているアカウントのツイート内容が見えます。下記は、イーロン・マスク (Elon Musk) さんと岸田首相 (岸田文雄) のツイートです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2128512/c479333a-c8c8-6077-5c5d-4e57891d5780.png)

## レポートの作成
[レポート](https://wiki.yellowfin.co.jp/pages/viewpage.action?pageId=2293799)を新規で作成し、例えば以下のようなチャートを作成します。イーロン・マスクさんと岸田首相の 2023 年 1 月 10 日の投稿に対する総リツイート数を集計してみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2128512/d42bb318-f585-3c3e-1280-dab44087dc2a.png)
## 最後に
CData は Instagram や Facebook など、様々な SNS に対するコネクタをそろえています。SNS の情報を販売やマーケティングなどに活用できたら素敵ですね。
では皆様、良いデータ分析を! See you then, Cheers!!