OmniAICreator/Qiita-1.07M huggingface dataset:
より幅広いソースを日本語で集める４つのステップ

Bing AIは、検索して情報を収集し、その内容をわかりやすくまとめてくれます。

けど、これは１つ問題が。

それは、日本語で検索すると日本語のソースしか返さないということ。


日本語のサイトは少なくないですが、ソースの母数は英語にはどうしても負けてしまいます。

そらね、英語の方がソースが多いのは知ってるよ。でも英語なんてできない・・・

大丈夫、日本語を使うことで英語のソースを集めることができます。

しかもとても簡単！

早速、その方法を紹介してきます。

## 日本語で英語の情報を持ってきてもらう
では、結論からお話しします。

1. 質問を日本語で入力
2. 「英訳して」と入力
3. 「英語で検索して」と入力
4. 「検索結果を日本語訳して」

はい、これだけです。

画像で見て見ましょう。

![2023-10-31_10h09_50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2731108/47c8791b-d634-70d6-4c2d-da88051c9790.png)
![2023-10-31_10h10_04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2731108/5cf069ce-f4ae-56a2-5acc-e8fcfded7b03.png)


※僕のブラウザ設定が英語なので英語で処理の内容が出ていますが、日本語にも対応しています。

Bing AI側の処理が増えているのがわかります。

まず最初に質問の内容が英訳されており、
英語で検索、
次に、得られた検索結果を日本語にしています。

指示されたとおりに処理されていますね！

さらに、ソース元をクリックしてみると、英語のページに飛びます。

このことから、ちゃんと英語のページからソースを持ってきていることがわかります。


## おわりに
今回はわかりやすいもので検索しましたが、他の事を知りたいときでももちろん使えます。

この方法はBing AIだけでなく、ChatGPTでも可能です！

これでより、幅広いソースを集めまくりましょう！

以上になります。読んでくださりありがとうございました。
Lambda 予約語について注意

Lambdaに記述する関数の中ではAWS内での予約語に注意して記述する。
たとえば”name”のようなDBのキーとなっていそうなものは、ExpressionAttributeNames={"#name": "name"},

上のように、この"name"はカラム名として使用しますよ、宣言することで使用可能となる。

DynamoDBにputする場合の関数の例。

``` demo.py
def post_users(requestJSON):
    table.update_item(
    Key={"id": requestJSON["id"]},
    UpdateExpression="SET #name = :newName, age = :newAge, address = :newAddress, tel = :newTel",
    ExpressionAttributeNames={"#name": "name"},
    ExpressionAttributeValues={
        ":newName": requestJSON["name"],
        ":newAge": requestJSON["age"],
        ":newAddress": requestJSON["address"],
        ":newTel": requestJSON["tel"],
    },
)
```

他の変数名と異なり、“name”は、#nameとして、UpdateExpressionの中で使用する。
AI-102試験対策のまとめ「Azure AI Metrics Advisor」

## はじめに
Azure AI Engineer Associate(AI-102)取得に向けた勉強でまとめた内容を本記事では投稿しています。
試験範囲の内容を私が勉強していく中で、
・忘れてしまっていた内容
・他の知識と絡めて理解した方が良い内容
・Microsoft Learnの読解に苦戦した内容
などをできるだけ分かりやすく簡潔にまとめることを意識しています。
Azureの勉強を一から始め、AI-102取得を目指している方の参考になれば幸いです。
※本記事の内容が必ず試験に出るわけではないこと、ご注意ください
※勉強しながら投稿しているため、追加で学んだことがあれば随時投稿内容を更新します。

## 試験対策のまとめ
## Azure AI Metrics Advisor
* AIを使用して下記における異常検出を実行するサービス
    - データの監視
    - 時系列データ
* データにモデルを適用するプロセスを自動化
* 機械学習の知識が無くても下記が可能
    - データインジェスト
    - 異常検出
    - 診断
* 使用例
    - 複数のデータソースからの多次元データを分析
    - 異常を識別して関連付ける
    - 実際のデータで使用される異常検出モデルを構成して微調整
    - 異常を診断し、根本原因分析に活用
* 注意事項
    - 2023年9月20日以降は新しいMetrics Advisorリソースの作成不可
    - Metrics Advisorサービスは2026年10月1日に廃止

### Metrics Advisorの機能
* 様々なデータストアに接続して多次元メトリックデータの取り込みが可能
    - SQL Server
    - Azure Blob Storage
    - MongoDBなど
* 多次元メトリック内のすべての時系列が自動的に監視される
* 下記を使用してデータに適用されるモデルと以降の異常検出の結果をカスタマイズ可能
    - パラメーターの調整
    - インタラクティブフィードバック
* 異常を検出するたびに下記のフックを使用して複数のチャネルからリアルタイム通知を送信可能
    - 電子メールフック
    - Web hook
    - Teamsフック
    - Azure DevOpsフックなど
* 同じ多次元のメトリックで検出された異常を診断ツリーに結びつける  
⇒根本原因を特定のディメンションで分析可能
* メトリック間分析を有効化  
⇒関連するすべてのメトリック間の異常な状態を包括的に把握可能

<br>

* 参考
    - https://learn.microsoft.com/ja-jp/azure/ai-services/metrics-advisor/overview

## 次の試験対策のまとめ
* **AI-102試験対策のまとめ「Speech Service」**

https://qiita.com/fsd-jume/items/f49305db3cbb8f7efa84

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

https://qiita.com/fsd-jume/items/65aba5d5514e023fd66d
【CSS】フレキシブルボックスのアイテムの大きさを画面サイズ縮小時に固定する

# はじめに
フレキシブルボックスを使っている際、画面サイズが小さくなったときにアイテムを縮めなくするやり方を調べたのでメモです。


# やり方
アイテムが縮んでしまう修正前とアイテムを縮めなくした修正後のHTMLとCSSのサンプルを記載します。

## 修正前
画面サイズに応じてアイテムを縮めるスタイルが適用されています。

- 画面縮小前
![画面縮小前.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526202/52bf8613-4ce6-c30f-2c9a-7a58d514a798.png)

- 画面縮小時
![画面縮小時.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526202/abf6dbd0-e8d9-2a3b-10e2-2c16daf6032b.png)

`sample.css`で`flex-item`クラスに`flex:1;`を適用することで、画面サイズを縮小すると等しく縮むアイテムになっています（詳細は[参考](#参考)へ）。
```sample.html
<html lang="ja">
	<head>
		<title>さんぷる</title>
	<link rel="stylesheet" href="sample.css">
	</head>
	
	<body>
		<div class="flex-container">
			<div class="flex-item item1">サンプル１</div>
			<div class="flex-item item2">サンプル２</div>
			<div class="flex-item item3">サンプル３</div>
			<div class="flex-item item1">サンプル４</div>
			<div class="flex-item item2">サンプル５</div>
			<div class="flex-item item3">サンプル６</div>
		</div>
	</body>
</html>
```

```sample.css
.flex-container{
	display: flex;
	gap: 0.5rem;
}

.flex-item{
	flex:1;

}

/* アイテムの色付け（本質じゃないです） */
.item1{
	padding:0 auto;
	background-color:red;
}

.item2{
	padding:0 auto;
	background-color:blue;
}

.item3{
	padding:0 auto;
	background-color:green;
}
```

## 修正後
`sample.css`で`flex-item`クラスに`flex-grow: 0` `flex-shrink:0` `flex-basis: 200px(固定したい大きさ)`を指定します。
アイテムの大きさが固定したい大きさになり、コンテナの大きさがアイテムの大きさに対して足りない際はアイテムが縮まないため、アイテムの大きさが固定されます（詳細は[参考](#参考)へ）。

```sample.css
.flex-container{
	display: flex;
	gap: 0.5rem;
}

.flex-item{
	flex:1;

}

/* 追加箇所 */
@media(max-width: 1200px){
	.flex-item{
		flex-grow: 0;
		flex-shrink: 0;
		flex-basis: 200px;/* 固定したい大きさ */
	}
}

/* アイテムの色付け（本質じゃないです） */
.item1{
	padding:0 auto;
	background-color:red;
}

.item2{
	padding:0 auto;
	background-color:blue;
}

.item3{
	padding:0 auto;
	background-color:green;
}
```
- 画面縮小時 
![修正後_画面縮小時.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526202/84748ea0-c144-28d1-2a04-960e29b87d1d.png)

↑アイテムの大きさが固定されて画面サイズを縮小するとスクロールバーでスクロールが必要な状態になりました。

# 参考
https://www7b.biglobe.ne.jp/~homepage-note/webmemo-flex.html

https://krzm.jp/2016/07/21/inprecor2082/
laravel jetstream導入後にregisterを解除する方法

# 解決方法

```
// config/fortify.php
'features' => [
// Features::registration(), // <-- コメントアウトする
],

```

# 補足
- `php artisan route:list`から気付きました。
- chatGPTは、知っていました。

# 参考
- https://readouble.com/laravel/10.x/ja/fortify.html
【Mac】Chromeの `cmd+Q` は無効にしよう


MacのChromeでタブを閉じるときによく `⌘+W` で閉じている人は、
間違えて `⌘+Q` を押して、Chromeのアプリ自体を消してしまうことありませんか？

特にミーティング中とかでやってしまうと、後で戻ってきたときに落ちた理由聞かれたりするので面倒ですよね。
そんな人用の機能。

その他にもショートカットをいろいろ設定できるのでいじりたいひとはどうぞ。


## Chromeのみ

Chrome自体に設定があります。一回確認挟んでくれるのでありがたいです。
連続で押すと閉じられますが。

![スクリーンショット 2023-10-27 16.49.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112929/9f08fec3-ceab-3827-8fb9-8d86044799f4.png)


## macOS Ventura 13.4.1 (c)（22F770820d）

* 設定
* キーボード
* キーボードショートカット
* アプリケーション

![スクリーンショット 2023-10-27 16.54.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112929/99f25b72-7a25-3874-c994-a2da88fcd39d.png)|![スクリーンショット 2023-10-27 16.54.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112929/5a224560-c124-3e80-a774-e6dd29c13e98.png)
:-:|:-:


スクショの文言通りに入力します `Google Chrome を終了`


### Discord での設定例

Old Menu | Setting | New Menu
:-:|:-:|:-:
![スクリーンショット 2023-10-27 17.04.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112929/db83ce55-7089-55f7-7b8d-3813b2991c6a.png) | ![スクリーンショット 2023-10-27 17.08.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112929/84513655-6884-31cf-a0fc-64c1e32e761b.png) | ![スクリーンショット 2023-10-27 17.06.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112929/0d2933d2-68bc-a40b-4575-4f26f7afa0ec.png)

Macのメニューを開き Discordの終了が `Quit ⌘Q` となっていることを確認してください。この場合 `Quit` という文字が重要になります。
先程の画面の+ボタンから設定画面を開き


> アプリケーション: Discord.app
> メニュータイトル: Quit
> キーボードショートカット: `CMD + SHIFT + Q` 

これで終了するキーボードショートカットを SHIFT も同時に押さないと全体終了ができなくなります。
`CMD + SHIFT + Q` はMacのログアウトとして、アプリ側ではなくシステム側で使われているショートカットなので、これを設定しているとChromeが閉じられることはないはずです。

![スクリーンショット 2023-10-27 17.21.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112929/012cb615-c71e-5819-a7ac-aff7f55e1f6d.png)

新しいメニューを開いて `⇧⌘Q` みたいになってたらOK.

## VSCode

VSCodeはこちらでショートカット封じているはずなのに閉じてしまいます。

`CMD+SHIFT+P` で `ショートカット`　とか打つとでてくるキーボードショートカットで編集します。

![スクリーンショット 2023-10-27 17.23.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112929/1a57e032-3daf-bdbe-e300-ca4d519a66cf.png)

`"cmd+q"` で検索かけるか `workbench.action.quit` で検索する。

![スクリーンショット 2023-10-27 17.27.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112929/c92da328-3811-6ca9-f8d0-c17039eaef5a.png)

自分は `CMD+Q` + `CMD+Q` の2連続同じコマンドを打たないと閉じないようにしました。

VSCode側で設定しないと駄目でした。

## macOS Sonoma 14.0

まだアップグレードしてないので不明ですが同じようなメニューかと思います。
BigQueryで数値列（string）を日付（date）に変換する方法

### PARSE_DATE関数を使う！
RedshiftではCAST関数を使用していたのだが、BigQueryで数値列を日付に変換する方法を調査した。
結論から言うと、PARSE_DATE(%Y%m%d, 変換元カラム名)で変換できる。

### 実行結果
##### クエリ
![スクリーンショット 2023-10-31 9.30.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3580229/17ba691e-0036-5567-0f00-f1ccce40e29a.png)

##### 実行結果
![スクリーンショット 2023-10-31 9.30.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3580229/bf761e3b-afc8-8916-f628-372024f4f79d.png)
SQLを学びます。⑥

# 初めに
こんにちはiwanagaです。

最近金木犀の香りが各地でしていてとても良い匂いです。個人的に一番好きな花なのでテンションが上がります。

さて、全く脈絡のない事を話しましたが今回も前回に引き続きSQLの学習をしていきたいと思います。今回はDELETE文を学んでいきたいと思います。

# DELETE文
今回やるDELETE文は文字通りデータを削除する際に使う命令文です。DELETE文を使用する際に気をつけなければいけない注意点などはありますが、内容自体はそこまで難しいものではないので説明させていただきます。

まず今回のDELETE文を紹介するにあたって必要なテーブルを下記に記載させていただきます。

テーブル名：group

|ID|first_name|last_name|team|salary｜
|:---:|:---:|:---:|:---:|:---:|
|1|taro|yamada|IT|200000
|2|jiro|suzuki|food|220000
|3|sabro|kitano|book|320000
|4|hanako|iwai|IT|110000
|5|matuko|dx|food|250000
|6|yuta|abe|IT|540

# 基礎


まずはDELETE文の基本構造です。
```
DELETE FROM table_name
WHERE condition;
```

・table_name: レコードを削除するテーブルの名前。
・condition: 削除する行を指定する条件。

これを上記のテーブルに合わせた内容にすると
```
DELETE FROM group
WHERE last_name = 'abe';
```

すると下記の様な結果になります。

|ID|first_name|last_name|team|salary｜
|:---:|:---:|:---:|:---:|:---:|
|1|taro|yamada|IT|200000
|2|jiro|suzuki|food|220000
|3|sabro|kitano|book|320000
|4|hanako|iwai|IT|110000
|5|matuko|dx|food|250000


見ての通りこのDELETE文により"last_name" が "abe" である行が削除されます。

# 応用
今度は特定の条件を記入して複数のDELETEをします。

例：給料が11万以下の従業員を削除する場合

```
DELETE FROM employees
WHERE department = 'IT' AND salary < 110000;
```

すると下記の様な結果になります。

|ID|first_name|last_name|team|salary｜
|:---:|:---:|:---:|:---:|:---:|
|1|taro|yamada|IT|200000
|2|jiro|suzuki|food|220000
|3|sabro|kitano|book|320000
|5|matuko|dx|food|250000

条件を使用することで複数を選択できるので効率がいいですね。

# 注意点
個人的にDELETE文は特段難しいものではありませんがミスをした際に一番被害がでかい命令文だと考えています。なので注意点を幾つか記載させていただきます。
※UPDATE文と多少被るところもありますがよろしくお願いいたします。

・条件の慎重な選択
誤った条件を指定すると、誤ってデータを削除する可能性があるため、条件の選択に慎重さが必要です。


・トランザクションの使用 
DELETE文を実行する前に、トランザクションを開始して変更を確認することをお勧めします。トランザクションを使用すると、変更を一括してコミットまたはロールバックできます。誤ってデータを削除した場合に、変更をロールバックしてデータを復元できます。最悪これだけでも注意してもらえますと幸いです。


・バックアップの取得
重要なデータを削除する前に、データベースのバックアップを定期的に取得し、必要に応じてバックアップからデータを復元できるようにしておくと安全です。


・制約の考慮
データベース内の制約（外部キー制約、一意性制約など）に注意してください。DELETE文が制約に違反する可能性がある場合、そのまま実行することはできない場合があります。


・影響範囲の確認
DELETE文の実行前に、削除される行の影響範囲を確認しましょう。誤って多くの行を削除することを避けるために、影響を評価しましょう。

・権限とセキュリティ
DELETE文を実行するために必要な権限を確認し、不正なアクセスを防ぐためにセキュリティ対策を実施しましょう。

・ログの監視
DELETE文の実行に関するログを監視し、誤ってデータを削除した場合やセキュリティ上の問題が発生した場合に備えることが重要です。


# 最後に
今回もご覧いただきありがとうございました！
正直DELETE文は文の内容を覚えるより注意点を覚えた方がいいものですので、皆様扱いはご慎重にご利用くださいませ。

エンジニアファーストの会社 株式会社CRE-CO　iwanaga
SQLの基礎知識

# はじめに
この記事ではSQLの基礎知識について簡単にまとめてみます。
間違っている箇所ありましたら、コメントいただけますと嬉しいです。

## データベースとは何か
大量のデータを保存し、コンピュータから利用しやすいように加工したデータの集まり。
データベースを管理するコンピュータシステムをデータベースマネジメントシステム(DBMS) と呼ぶ。

### DBMS(データベースマネジメントシステム)が必要な理由
テキストファイルやExcelでもデータの保存はできるが、多人数でデータを共有するのに向かない
大量のデータを扱える形式になってない
読み書きを自動化するのにプログラミング技術が必要
万一の事故に対応できない

DBMSはこれらすべての問題を解消できるそう。

## SQL(Structured Query Language)とはなにか
SQとはRDBMS(リレーショナル・データベース・マネジメント・システム)を操作するための言語です。
プログラミングの技術があるひとも技術がない人も、リレーショナルデータ管理システムからデータを参照、操作、変更するために作られた言語です。

## リレーショナルデータベース(関係データベース)とは
イメージと指定はエクセルで作った表みたいな感じです。

各テーブルは、名前がついた列とデータが入っている行があります。
![SQLテーブル.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1065057/75b7041d-79fd-d8c4-76ee-e293d67eed45.png)

## SQLの命令文について
SQLは、大きく分けて3種類の言語から構成されています。

### データ定義言語（Data Definition Language）
データ定義言語はDDLと略され、RDBMSで扱うオブジェクト（テーブルやインデックスなど）の構造や、オブジェクト同士の関係を定義する構文です。

＜DDLの命令文＞
CREATE：新しいデータベースやテーブルなどのオブジェクトを定義する

JOIN：テーブル同士を結合する

DROP：定義したオブジェクトを削除する

ALTER：定義したオブジェクトの内容を変更する

TRUNCATE：データをすべて削除する

### データ操作言語（Data Manipulation Language）
データ操作言語はDMLと略され、データベースを操作するための構文です。
目的語やさまざまな条件を示すキーワードと組み合わせて使われ、多くのパターンがあります。
目的語には「～以上」「～以下」などの条件をつけることもでき、SQL関数と呼ばれる関数を使用することもできます。

＜DMLの命令文＞
SELECT：データベースを検索する

INSERT：データを挿入する

DELETE：データを削除する

UPDATE：データを更新する

### データ制御言語（Data Control Language）
データ制御言語はDCLと略され、データへのアクセスを制御する構文です。
トランザクションやシステムを管理したり、ユーザーのアクセス権を制御したりするために使われます。

＜DMLの命令文＞
GRANT：ユーザー権限を付与する

REVOKE：ユーザー権限を削除する

BEGIN：トランザクションを開始する

COMMIT：トランザクションを確定する

ROLLBACK：トランザクションを取り消す

## まとめ
今回はSQLの基礎を簡単にまとめてみました。
データベースやSQLについてはほとんど知識がないので、これから使えるようにしていこうと思います。
最後までご覧いただきありがとうございました！
SQLを学びます。⑤

# 初めに
こんにちはiwanagaです。
今回は前回に引き続きSQLの学習をしていきます。

# UPDATE文
SELECT文ばかりやっていて偏りが出てるかと思いましたので今回はUPDATE文を学習します。仕事でやるとなると自分もなかなか不安なので、頑張ります。

# 基礎
まずは今回使うテーブルを下記に記載します。

テーブル名：group

|ID|first_name|last_name|team|salary｜
|:---:|:---:|:---:|:---:|:---:|
|1|taro|yamada|IT|200000
|2|jiro|suzuki|food|220000
|3|sabro|kitano|book|320000
|4|hanako|iwai|IT|110000
|5|matuko|dx|food|250000
|6|yuta|abe|IT|540


例 1: ID1の給与を更新

```
UPDATE group
SET salary = 210000
WHERE ID = 1;
```

結果は下記の様になります。

|ID|first_name|last_name|team|salary｜
|:---:|:---:|:---:|:---:|:---:|
|1|taro|yamada|IT|210000
|2|jiro|suzuki|food|220000
|3|sabro|kitano|book|320000
|4|hanako|iwai|IT|110000
|5|matuko|dx|food|250000
|6|yuta|abe|IT|540

例 2: 複数の行を更新

```
UPDATE group
SET last_name = 'tanaka'
WHERE team = 'IT';
```

結果は下記の様になります。

|ID|first_name|last_name|team|salary｜
|:---:|:---:|:---:|:---:|:---:|
|1|taro|tanaka|IT|210000
|2|jiro|suzuki|food|220000
|3|sabro|kitano|book|320000
|4|hanako|tanaka|IT|110000
|5|matuko|dx|food|250000
|6|yuta|tanaka|IT|540

teamがITの方々は皆last_nameがtanakaになりました。


# 応用
少し応用になりますがCASEも紹介させていただきます。

CASEは特定の条件の場所に条件を加えて更新するものになります。今までが1に対して2をかけた合計の2をこちら側で計算、更新していたのがCASEの場合1に2をかける命令をするといった感じです。

これを上記のテーブルに当てはめて文を作成すると
```
UPDATE group
SET salary = CASE
  WHEN team = 'IT' THEN salary * 1.1
  WHEN team = 'book' THEN salary * 1.5
  WHEN team = 'food' THEN salary * 2
  ELSE salary
END;
```

すると結果は下記の様になります。

|ID|first_name|last_name|team|salary｜
|:---:|:---:|:---:|:---:|:---:|
|1|taro|tanaka|IT|231000
|2|jiro|suzuki|food|440000
|3|sabro|kitano|book|480000
|4|hanako|tanaka|IT|121000
|5|matuko|dx|food|500000
|6|yuta|tanaka|IT|594

# 最後に
今回もご覧いただきありがとうございました。
最後にUPDATE文を使用するにあたっての注意事項を記載させていただきます。

・更新内容の確認
当たり前ではありますが更新するデータを事前に確認し、誤ったデータが更新されないように注意してください。不要なデータの更新を避けるために、更新内容を慎重に検討しましょう。

・トランザクションを使用する
UPDATE文を実行する前に、トランザクションを開始して変更を確認することをお勧めします。トランザクションを使用すると、変更を一括してコミットまたはロールバックできます。これをしないと失敗した時ものすごく怒られます。

・トランザクションのコミット
変更を確認し、データが正しく更新された場合にトランザクションをコミットして変更を確定させることを忘れないようにしましょう。コミットする前にデータの確認を怠らないでください。

・パフォーマンスへの影響
大規模なテーブルのデータを更新する場合、UPDATE文のパフォーマンスに注意が必要です。適切なインデックスや条件を使用して、パフォーマンスを最適化しましょう。

・権限とセキュリティ
UPDATE文を実行するために必要な権限を確認し、不正なアクセスを防ぐためにセキュリティ対策を実施しましょう。

以上です。

参照
https://www.sejuku.net/blog/72910#index_id9

エンジニアファーストの会社 株式会社CRE-CO　iwanaga
SQLを学びます。④

# 初めに
こんにちはiwanagaです。

最近割と寒くなってきて寒暖差で体調を崩しかけていますが、皆様はどうお過ごしでしょうか。まあ冒頭の挨拶とは何の脈絡もありませんが今回はSELECT文の中の１つ、COUNTを説明させていただきます。

# COUNT
COUNTとは集計関数の一つで、一言で言えば数を数える関数です。前回やったORDER BYと少し似ていますね。また集計関数とは「平均値」「合計値」など何かを集計する時に使用する関数たちのことを指します。

今回いくつかの命令文を説明するにあたって下記のテーブルを使用します。

テーブル名：group

|ID|first_name|last_name|team|salary｜
|:---:|:---:|:---:|:---:|:---:|
|1|taro|yamada|IT|200000
|2|jiro|suzuki|food|220000
|3|sabro|kitano|book|320000
|4|hanako|iwai|IT|110000
|5|matuko|dx|food|250000
|6|yuta|abe|IT|540


# 基礎
まず最初に紹介するのが条件抜きにしたCOUNTです。上記のテーブルでする場合下記のような文になります。

```
SELECT COUNT(*) FROM group;
```

すると下記の様な結果が出ます。

|COUNT(*)|
|:---:|
|6|

ただただシンプルに数を数えてくれます。

# 特定の条件を入れる
ここからは特定の条件を入れて抽出する方法を紹介させていただきます。

例1：teamがITの人物をCOUNTする場合
```
SELECT COUNT(*) FROM group WHERE team = 'IT';
```
結果
|COUNT(*)|
|:---:|
|3|


例2：first_nameに"ro"が入っている人物をCOUNTする場合
```
SELECT COUNT(*) FROM group WHERE first_name = 'ro';
```
結果
|COUNT(*)|
|:---:|
|3|

です。
条件さえ入れれば基本的には何でも検索できます。


# DISTINCT
重複を回避して数を数えたい場合はDISTINCTを使用することで簡単に実現できます。

DISTINCTは重複レコードを1つにまとめてくれる便利な命令です。例えば、teamの種類だけを知りたい場合以下のように使います。

```
SELECT COUNT(DISTINCT team) FROM group;
```

結果は
|COUNT(DISTINCT team)|
|:---:|
|3|

となります。カテゴライズするのに便利ですね。

# その他

SUM：合計値を出せます。
```
SELECT SUM(salary) FROM group;
```

結果は下記の様になります。
|SUM(salary)|
|:---:|
|1100540|

MIN：最小値が出せます。
```
SELECT MIN(salary) FROM group;
```
結果は下記の様になります。
|MIN(salary)|
|:---:|
|540|

MAX:最大値が出せます。
```
SELECT MAX(salary) FROM group;
```

結果は下記の様になります。
|MAX(salary)|
|:---:|
|320000|

# 最後に
何やかんや脱線もしましたが良い勉強になりました。
皆様今回もご覧いただきありがとうございました！

参照
https://www.sejuku.net/blog/72910#index_id9

エンジニアファーストの会社 株式会社CRE-CO　iwanaga
SQLを学びます。③ 後編

# 初めに
こんにちはiwanagaです。
前回に引き続きSQLのSELECT文の学習を進めていきます。
今回も前回同様に下記のテーブルを元に学習を進めていきます。

テーブル名：grade1_class2

|出席番号(number)|名前(name)|性別(gender)|身長(height)|
|:---:|:---:|:---:|:---:|
|1|アベ|男|170|
|2|イトウ|女|160|
|3|ウエノ|男|190|
|4|エガシラ|女|172|
|5|オオノ|その他|175|
|6|ボブ|無|200|


# WHERE文
前回学習したSELECT文に今回はWHEREを追加していきます。WHEREがあることでカラムだけではなく更に条件を絞って特定のフィールドを抽出することが出来ます。これを文にすると...
→SELECT [抽出したいカラム] FROM [使用テーブル] WHERE [条件];になります。
なのでこれを上記のテーブルに当てはめると下記のようになります。
```
SELECT * FROM grade1_class2 WHERE 171 <= height;
```
そうすると下記の様な結果がでます。

|出席番号(number)|名前(name)|性別(gender)|身長(height)|
|:---:|:---:|:---:|:---:|
|3|ウエノ|男|190|
|4|エガシラ|女|172|
|5|オオノ|その他|175|
|6|ボブ|無|200|

カラムの身長(height)の中から更に171cm以上に絞り結果を出すことが出来ます。

更にWHERE文では複数の条件で絞ることが出来ます。その内容を文にすると
→SELECT [抽出したいカラム] FROM [使用テーブル] WHERE [条件① AND 条件②];になります。なのでこれを上記のテーブルに当てはめると下記のようになります。

```
SELECT * FROM grade1_class2 WHERE 171 <= height　AND gender=`男`;
```
そうすると下記の様な結果がでます。

|出席番号(number)|名前(name)|性別(gender)|身長(height)|
|:---:|:---:|:---:|:---:|
|3|ウエノ|男|190|

便利ですね。

# ORDER BY文
ORDER BYは少し特殊なのですが、テーブルから抽出すると言うよりも、条件を提示して並び替える文になります。

例えば上記のテーブルを身長順にして見たい場合、今までのSELECT文だと出来ないので抽出ではなく並べ替える必要があります。その内容を文にすると、SELECT [抽出したいカラム] FROM [使用テーブル] ORDER BY [ソートしたい要素] [昇順・降順の指定];となります。なのでこれを上記のテーブルに当てはめると下記のようになります。


```
SELECT * FROM grade1_class2 ORDER BY height desc;

```

すると下記の様な結果が出ます。

|出席番号(number)|名前(name)|性別(gender)|身長(height)|
|:---:|:---:|:---:|:---:|
|6|ボブ|無|200|
|3|ウエノ|男|190|
|5|オオノ|その他|175|
|4|エガシラ|女|172|
|1|アベ|男|170|
|2|イトウ|女|160|

※[昇順・降順の指定]部分へは、asc(昇順)、desc(降順)のどちらかを指定できます。
※ 省略した場合が昇順となります。

# GROUP BY
グループに分けてその数字を抽出した場合、GROUP BY文が使えます。文にすると、SELECT [取得したいカラム] FROM [使用テーブル] GROUP BY [グループ化したい要素];となります。

上記のテーブルの場合、性別で分けをすると下記の文になります。

```
SELECT gender, count( * ) FROM grade1_class2 GROUP BY gender;
```

すると下記の様な結果が出ます。

|gender|count( * )
|:---:|:---:|
|男|2|
|女|2|
|その他|1|
|無|1|

個人的によく使います。

# AS文
これは抽出した際の結果の表示方法になります。例えば上記のテーブルにあるカラム"出席番号(number)"をIDとした上で中有出する場合下記の様になります。

```
select number AS "ID" from grade1_class2;
```

すると下記の様な結果が出ます。

|ID|
|:---:|
|1|
|2|
|3|
|4|
|5|
|6|

# 最後に
SELECT文一つとっても色々ありますね。

ただ他にも色々あるのでこれからもどんどん紹介していきたいと思いますのでよろしくお願いいたします。

皆様今回もご覧いただきありがとうございました！

参照
https://www.sejuku.net/blog/72964

エンジニアファーストの会社 株式会社CRE-CO　iwanaga
WAFで対応できる脆弱性

WAFで対応できる7つの攻撃について、
概要と開発者としての対応策をまとめました。

### ◇WAFとは
“Web Application Firewall”の略で、Webアプリケーションの脆弱性を悪用した攻撃からWebサイトを保護するセキュリティ対策。
インターネットバンキングやECサイトなど、ユーザが情報を入力するようなWebサービスに有効。

**【参考】WAF、ファイアウォール、IPS/IDSの違い**

https://www.digicert.com/jp/waf/waf-ips-ids



## 1. バッファオーバーフロー

**【概要】**
　プログラムが確保したメモリの領域を超えて大量のデータを送り付けることで
　Webサイトに誤作動を起こさせ、乗っ取ったコンピュータをDoS攻撃の踏み台にしたり、
　実行中のプログラムを停止させたりする。
 
**【対策】**
・直接メモリにアクセスできる言語（C,C++,アセンブラなど）での記述を最小限にする
・ソースコード記述時、データの長さを意識する


　
## 2. クロスサイトスクリプティング（XSS）

**【概要】**
　ユーザ入力に対して動的にページ生成するようなwebサイトにおいて
　外部から不正なスクリプトを挿入され、
　利用者がそのwebサイトを閲覧すると不正スクリプトが実行される。
　その結果、利用者の端末に保存されていた個人情報が漏洩したり、
 　マルウェア感染を起こしたりする。
  
**【対策】**
・サニタイジングを行う（スクリプト構成に必要な文字を置換し、スクリプトの無害化をする）
・バリデーション処理を行う（入力値の制限をする）


 　
## 3. SQLインジェクション

**【概要】**
　webサイトのフォームに不正な操作を行うSQL文を意図的に注入することによって、
　**データベースに保存されたデータが改ざん、削除される**。

**【対策】**
・バリデーション処理を行う（入力値の制限をする）
・エスケープ処理を行う（不正に注入される恐れのある危険な文字を別の文字に置き換える）


　　
## 4. OSコマンドインジェクション
**【概要】**
　webサーバへのリクエストにOSへのコマンドを注入し、不正に実行させることによって
　**サーバ内のファイルの改ざん、削除、流出等の被害を受ける**。

 **【対策】**
 ・OSコマンドを呼び出す関数、メソッドを利用しない
 ・シェルを呼び出す関数を利用しない
 ・エスケープ処理を行う（不正に注入される恐れのある危険な文字を別の文字に置き換える）


　
## 5. DDoS攻撃
**【概要】**
　対象のサーバなどに対して複数のコンピュータから大量のリクエストを送信することで
　処理能力を超過させ、サービスを停止させる。

　※Dos攻撃…**1台**のコンピュータから攻撃を仕掛ける
　※DDoS攻撃…**複数台**のコンピュータから攻撃を仕掛ける

**【対策】**
・アクセス制限を実施する（IPアドレス制限、日本国外からのアクセス拒否など）


　
## 6. ブルートフォースアタック（総当たり攻撃）
**【概要】**
　暗号を解読するための攻撃手法の１つ。
　考えられるパターンを全て試行し、力ずくでパスワード等の解読を行う。

　※ブルートフォース攻撃…**ログインIDを固定**し、パスワードを手当たり次第に試す
　※リバースブルートフォース攻撃…**パスワードを固定**し、ログインIDを手当たり次第に試す

**【対策】**
・パスワード設定のルールを厳格化する


　
## 7. ディレクトリトラバーサル
**【概要】**
　相対パスの脆弱性を悪用し、「../」を指定してディレクトリをさかのぼることで
　意図しないディレクトリやファイルを参照、操作されてしまう。

 **【対策】**
・外部からパラメータとファイル名を指定してサーバのファイルにアクセスさせない仕様にする
・ファイル名の指定に相対パスが入らない設定をする

## 参考
https://www.ipa.go.jp/security/vuln/websecurity/index.html

https://www.shadan-kun.com/waf_websecurity/
ビジュアルプログラミングの「OctoStudio」でスマホ間連携！

## 何に関する記事？
↓こちらの動画の内容に関する話です。

<iframe width="560" height="315" src="https://www.youtube.com/embed/YKJMnTUPUPQ?si=XFDZmPNwga8RR-t6" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>

OctStudio というスマホ等で使えるアプリ（※ ビジュアルプログラミングを使った開発と処理の実行ができるアプリ）で、「Androidスマホの画面に配置した⭐️をタップすると、隣にある iPhone の画面上のキャラがジャンプして、そして iPhone が振動する」という、簡単なデバイス間連携の処理を試した話です。

## OctStudio とは？
今回の記事に登場する「OctoStudio」は、MITメディアラボ の Lifelong Kindergarten が開発したアプリです。Lifelong Kindergarten は、よく教育分野などで使われている、ビジュアルプログラミングが行える Scratch の提供元でもあります。

OctStudio はスマホやタブレットでビジュアルプログラミングを使った開発・処理の実行が、とても手軽に行えます。OctStudio に関して、スマホのセンサーやアクチュエーターなど、スマホ内蔵の仕組みを扱えるのが良いな、と個人的には感じています。

自分は、所有している iPhone・iPad・Androidスマホにインストールしています。

### 公式ページ
OctoStudio の公式ページは👇こちらです。

https://octostudio.org/ja/
![公式ページ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/8fe443d8-eef4-5ef0-b08e-334f765191cc.png)

## 今回扱った仕組み
今回扱ったのは、その中の「異なるデバイス間でやりとりができるブロック」です。

つい先ほど、公式の X でのポスト（以下）を見て、それを知りました。
どうやら「"ビーム" ブロック」という名前のようです。

![公式のポスト](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/530688ba-006a-88c9-02c7-367193273da3.png)

ポストされていた動画では、3台のスマホを連携させている例も紹介されていました。

### 利用したブロック
今回、Androidスマホ側（送り側）と iPhone側（受け側）で使ったブロックは、それぞれ以下となります。

![ブロック](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/9e75b76d-6b78-147b-c309-1d09bf6b8276.png)


### どんな通信を使っている？
上で紹介した公式のポストでも書かれているように、端末間の通信では Bluetooth が利用されているようです。

## おわりに
今回、OctoStudio　を使ったスマホ間のデバイス連携を試しました。

今回の内容は動作確認的な、軽いお試しでしたが、今後も 3台以上の連携や今回と違った処理を扱うものなど、試していければと思います。

### 公式のサンプル動画
OctoStudio を使った作例について、公式の YouTubeチャンネルにサンプル動画が複数アップされているので、そちらもぜひ見てみてください。
　https://www.youtube.com/@OctoStudioApp/videos
![OctoStudio - YouTube](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/267834b1-83f5-ccbb-39ce-7df0868e4135.png)
長野県長野市南長野県町のような住所は他にもあるのか

https://note.com/inuro/n/n7ec7cf15cf9c

こちらの記事で「長野県長野市南長野県町」という住所が紹介されています。長野県の住所なのですが、県名の部分だけではなく大字と小字をくっつけたところにも「長野県」という文字列が現れています。単純に県名を文字列マッチして処理していると誤処理してしまいそうですね。

こういう住所って他にもあるんだろうかと気になったので、アドレス・ベース・レジストリを使って調べてみました。

使用したデータはアドレス・ベース・レジストリの「日本 町字マスター データセット」2023-01-25 更新版です。市区町村ごとに1000回以上ダウンロードしなきゃいけないのかなと思ったら、全データをまとめたものが公開されるようになったのですね。これは便利。

https://catalog.registries.digital.go.jp/rc/dataset/ba-o1-000000_g2-000003

そして調べたスクリプトはこちら。書きなぐりの適当なので、汚いところはご容赦ください。

都道府県名が複数回登場したらという条件で検出しています。このときの都道府県名は同一でなくてもよしとしました。つまり「ほげ県\*ふが県\*」のようなものも検出しています。

```ruby
require 'csv'

addresses = CSV.read('mt_town_all.csv', headers: true, nil_value: "")
prefectures = addresses.map{|e| e["都道府県名"]}.uniq

addresses.select do |address|
  str = "#{address["都道府県名"]}#{address["市区町村名"]}#{address["政令市区名"]}#{address["大字・町名"].sub(/^(大字|字)/, "")}#{address["丁目名"]}#{address["小字名"].sub(/^(小字|字)/, "")}"
  if prefectures.select{|e| str.include?(e)}.count >= 2
    p str
  end
end
```

結果は以下の通りです。

```
"宮城県大崎市古川上埣北海道"
"千葉県八千代市北海道"
"東京都府中市本宿町一丁目"
:
(途中省略)
:
"東京都府中市武蔵台三丁目"
"富山県上市町下経田北海道"
"愛知県岡崎市岩中町北海道"
"愛知県一宮市大和町氏永北海道"
"愛知県春日井市神屋町北海道"
"愛知県田原市北海道"
"愛知県田原市神戸町北海道"
"愛知県みよし市莇生町北海道"
"愛知県あま市七宝町桂北海道"
"愛知県あま市七宝町遠島北海道"
"愛知県大口町大屋敷北海道"
"愛知県扶桑町斎藤北海道"
"愛知県扶桑町高雄北海道"
"愛知県阿久比町阿久比北海道"
"京都府南山城村南大河原北海道"
```

「"東京都府中市」は間に「京都府」が入ってるパターンです。これは有名ですね。他は全て小字が「北海道」というパターンでした。ただ、読み方は「キタカイドウ」となるものが多いようです。そして、大字と小字の文字列をくっつけたところに都道府県名が現れるというパターンはありませんでした。

では冒頭の「長野県長野市南長野県町」はどうなっているのでしょう。アドレス・ベース・レジストリを確認すると、以下のようになっていました。

```
:
202011,0000264,3,長野県,ナガノケン,Nagano,,,,長野市,ナガノシ,Nagano-shi,,,,,,,,,,県町,アガタマチ,Agatamachi,0,0,0,1,0,0,0,0,1947-04-17,,0,3800838,
:
```

ウィキペディアの「南長野」の記事には以下の記述があります。

https://ja.wikipedia.org/wiki/%E5%8D%97%E9%95%B7%E9%87%8E

> 後述の9町が属しているが、長野市街地内の町（通称名）については住所表示の際に「大字南長野」を省くことが多く、郵便番号もそれぞれ単独で与えられている[1]。また、町名（通称名）のほか「幅下」「十念寺裏」といった小字があるが、これらは原則用いない（省略する）ことが長野市の慣例となっている。つまり、長野県立大学後町キャンパス近くの住所を例にとると以下の3通りの表し方がある。
> 
> * 長野市大字南長野西後町*** - *
>   - 慣例による（大字を省略しない）表記
> * 長野市西後町*** - *
>   - 慣例による（大字を省略した）表記。最も一般的
> * 長野市大字南長野字十念寺裏***番地*
>   - 登記などに用いる表記
>
> しかしながら、例えば長野県は長野県庁舎の住所を「大字南長野字幅下」と表記しており（慣例に従うならば「大字南長野妻科」または「妻科」）、混乱に拍車をかけている[2]。

つまり大字を省略する場合と省略しない場合が入り混じっていると。これも住所のややこしい特性の一つですね。アドレス・ベース・レジストリは大字南長野を省略する表記を採用したのでしょう。
JSX記法

# 1. JSX記法基礎
- JSXはJSでテンプレートが作成でき、JS記法の拡張機能です。
- JSXはJavaScript XML(HTML)の略で、HTML構造をJSコードで記述する。
- JSXはES記法の標準となっており、Vue3 などの他のフレームワークでも使えます。

### 基礎
- タグ
  - 最初の文字は大文字と小文字の違い。（大文字はカスタマイズしたコンポーネントです）
  - タグは必ず閉じる
  - 各JSXに存在できるルート ノードは1つだけです。
- 属性
  - class → classNameに書き換え
  - styleでは (stringではなく) JS オブジェクトを使用する必要があり、キャメル ケースで記述する必要がある。
  - for → htmlForに書き換え
- イベント
  - onXxxのようにを使用する
  - 関数を渡す必要があります (fn() ではなく fn)
- JS式
- 判断
- ループ

### 1.1 JSXでのJS構文の使用

構文
`{JS 式}`

```jsx
const name = 'Mei'

function App() {
  return (
    <h1>こんにちは、{name}です。</h1>
  )
}
```
要注意：
if文/switch-case /変数宣言ステートメント は{} 内に含めることはできません。

### 1.2 JSXでリストのレンダリング
> 商品リストなどの繰り返しリストのレンダリングの場合、Vueであれば、v-forが使えますが、Reactはどう実現するのか。

実装：配列のmapメソッドを使用する。

```jsx
const songs = [
  { id: 1, name: 'JavaScript' },
  { id: 2, name: 'Java' },
  { id: 3, name: 'PHP' }
]

function App() {
  return (
    <div className="App">
      <ul>
        {
          songs.map(item => <li>{item.name}</li>)
        }
      </ul>
    </div>
  )
} 
export default App
```

- 注意: 子項目に key 属性を追加する必要があります。
![Screen Shot 2023-10-30 at 16.18.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193270/8b2261e1-7cee-eec7-1f4a-508f30baf6e9.png)
1.このkeyは HTML 構造には表示されませんが、パフォーマンスの最適化のために React によって内部的に使用されます。
2.key は、現在のリスト内の一意の文字列または数値 (文字列/数値) です。
3.リスト内に id のような一意の値がある場合は、id をkey値として使用します。
4.リスト内に id のような一意の値がない場合は、index (添え字) をkey値として使用できます。

### 1.3 JSXの条件付きレンダリング

機能: 条件が満たされるかどうかに基づいてHTMLを生成します。

実装: 三項演算子または論理 (&&) 演算子を使用できます。

```jsx
const flag = true
​
const loadData=()=>{
  if (isLoading) {
    return loadingUI;
  } else {
    return successUI;
  }
}
function App() {
  return (
    <div className="App">
      {/* 条件付きレンダリング文字列 */}
      {flag ? 'reactが良い' : 'vueが良い'}
      {/* タグ/コンポーネントの条件付きレンダリング */}
      {flag ? <span>this is span</span> : null}
      <div>{loadData()}</div>;
    </div>
  )
}
export default App

```
2023/10/31主にITとかセキュリティの記事

MITRE Engenuity ATT&CK評価「Turla」におけるトレンドマイクロのパフォーマンス(10/27)
https://www.trendmicro.com/ja_jp/research/23/j/mitre-attack-solution-tested.html

Node.jsで作られたFacebookアカウント窃取ツールを分析(10/30)
https://www.trendmicro.com/ja_jp/research/23/j/analyzing-a-facebook-profile-stealer-written-in-node-js.html

超大規模なHTTP分散型サービス拒否攻撃が発生、2023年第3四半期(10/29)
https://news.mynavi.jp/techplus/article/20231029-2804174/

「娘のアレルギー情報はこちら」　ホテルなど狙うサイバー攻撃増加(10/29)
https://www.sankei.com/article/20231029-JO37LHKBOVIINLDR2XGBPF3HLE/

「恒心教」掲示板に個人情報113万件流出　ハッキングで脅迫被害も(10/29)
https://news.yahoo.co.jp/articles/856fc027c66e372b74955ba0ff623300ef267698
	
「アドフラウド」って何？覚えておきたいWeb広告詐欺の仕組みと種類(10/29)
https://gunosy.com/articles/aKn4x

マルウェア「StripedFly」に警戒を、100万超システムが被害の恐れ(10/29)
https://news.mynavi.jp/techplus/article/20231029-2804402/

焦点：ハイテク国産化急ぐ中国、米依存に「セキュリティ懸念」(10/29)
https://jp.reuters.com/economy/2AIHULRB7ZPAZJ3E7HUCTJ6UPQ-2023-10-28/

トラックポイント搭載で「HHKB Studio」がやってきた(10/28)
https://news.mynavi.jp/article/dounano-1/

目指すはデジタル資産の「日本発グローバル基盤」、新会社Progmatが離陸(10/30)
https://xtech.nikkei.com/atcl/nxt/column/18/00001/08498/

LockBit被害の菱機工業がセキュリティー強化へ(10/30)
https://xtech.nikkei.com/atcl/nxt/mag/nnw/18/041800012/101900227/

ネットワーク技術者のリスキリング(10/30)
https://xtech.nikkei.com/atcl/nxt/mag/nnw/18/101800177/101800001/

富士通CTO「競合は米国企業」、大学との協業でAI・量子の研究加速(10/30)
https://xtech.nikkei.com/atcl/nxt/column/18/02127/00067/

大手IT企業が競って開発、機械学習や画像認識を効率的に処理する「AIプロセッサー」(10/30)
https://xtech.nikkei.com/atcl/nxt/column/18/01679/090700131/
Deploy to Azure Button を作る

こんにちは駆け出しアーキテクトのやまぱんです。
 Azure を触ってると時々みかけるこのボタン、そう、Deploy to Azure Button 
 [![Deploy to Azure](https://aka.ms/deploytoazurebutton)](https://portal.azure.com/#create/Microsoft.Template/uri/https%3A%2F%2Fraw.githubusercontent.com%2Faktsmm%2FIac%2Fmain%2F01_2Vnet-2VM%2Fmain.json)
今回は誰でも作れて人によっては便利なので簡単に紹介したいと思います

大まかにいうと Github にソースを上げてURL取得、加工してリンク作成です。
(ストレージ アカウントを利用する方法もあります)

## ARM Templates json URL の取得
Gitに上げてるjsonファイルの URL は、rawで表示してそのURLをコピペし変換する必要があります。
![2023-10-31_03h01_38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/e8728d9e-74fe-7deb-6c54-2a773e2f4310.png)

## URL のエンコード
そして、PowerShellを使って下記でエンコードしてリンクをつくる


```PowerShell:PowerShell
$url = "https://raw.githubusercontent.com/aktsmm/Iac/main/03_bas-peer/main.json"
[uri]::EscapeDataString($url)
$: https%3A%2F%2Fraw.githubusercontent.com%2Faktsmm%2FIac%2Fmain%2F03_bas-peer%2Fmain.json
```

## リンクの作成(完成)
```
https://portal.azure.com/#create/Microsoft.Template/uri/<上記で取得したエンコードしたURL文字列>
```
でリンクをつくります。

+ マークダウンで書くときはこんな感じでよくある [Deploy to Azure] ボタンができます。
下記の **""https://portal.azure.com/#create/Microsoft.Template/uri/""** 以降に上記で作ったリンクを挿入します。
+ 例
```
[![Deploy to Azure](https://aka.ms/deploytoazurebutton)](https://portal.azure.com/#create/Microsoft.Template/uri/https%3A%2F%2Fraw.githubusercontent.com%2Faktsmm%2FIac%2Fmain%2F01_2Vnet-2VM%2Fmain.json)
``````

[![Deploy to Azure](https://aka.ms/deploytoazurebutton)](https://portal.azure.com/#create/Microsoft.Template/uri/https%3A%2F%2Fraw.githubusercontent.com%2Faktsmm%2FIac%2Fmain%2F01_2Vnet-2VM%2Fmain.json)


## あとがき
これでよく使うような環境のひな形をコードとして保存しておいて、必然な都度高速にデプロイすることができます。

## 参考
+ 公式 Docs

 https://learn.microsoft.com/ja-jp/azure/azure-resource-manager/templates/deploy-to-azure-button


+ Deploy to Azure Button を量産していく予定のページ(あくまで予定)

https://github.com/aktsmm/Iac

:::note info
執筆時(2023/11/01(水) )現在では、bicepファイルには対応していないので、ARMTemplate (Json形式)のファイルを指定する必要があります。
私の場合はbicepファイルからコンパイルしてjsonにして指定しています。他にもやり方はある模様です。
:::
git diffについてまとめた

## インデックスとワークツリーの差分
```
git diff
```
一番シンプル。
「インデックス」とはコミットするファイルを格納する場所です。
「ワークツリー」は開発作業を行っているディレクトリを指します。
※`git add`してワークツリーからインデックスにファイルを格納することを「ステージング」と言います。

## コミットとワークツリーの差分
```
git diff <SHA-1> or HEAD
```
最新のコミットの場合は`HEAD`、それ以外は<SHA-1>（コミットオブジェクトのオブジェクト名）
※SHA-1とは？↓コレ
![スクリーンショット 2023-10-26 21.45.38.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1106470/e36f67d1-3ffb-3888-0d08-04eff6a0b422.jpeg)

[参考：gitで特定のcommitバージョン/リビジョンを指すコレをなんと呼ぶか問題](https://qiita.com/bigwheel/items/0b331451558637ee29b3)

## インデックスとHEADの差分
```
git diff --cached
git diff --chached HEAD
```
`git diff`の基本は「ワークツリー」に対しての変更を表示します。
ですが、`--cached(--staged)`オプションを利用することで、インデックスとHEADの比較を行います。

## ブランチ間の差分を調べる
```
git diff dev..testing
```
devからtestingの変更差分が表示される。
※逆にしても結果は同じ（プラスかマイナスかの表示が逆転する）

## コミット間の差分も確認できる
```
git diff SHA1..SHA2
```

## リモートとの差分
```
git diff HEAD..origin/branch
```
pullする前に、ローカルとリモートの差分を確認できます。
`HEAD..origin/branch`の右側が最新とみなされるため、pushするときは`origin/branch..HEAD`にします。

## あるコミットの差分
```
git diff SHA1^..SHA1
```
同じSHA同士で比較すれば、差分がわかる裏技的な方法。
`^`が一つ前のコミットを指しています。

## オプション系
### 差分の数だけ見る
```
git diff --stat
```
### 差分のあるファイル名だけ見る
```
git diff --name-only
```
### 改行コード、空白を無視
```
git diff -w
```
### 空行無視
```
git diff --ignore-blank-lines
```
### 変更点の前後に表示される行数を変える
```
git diff -U0
```
### 単語単位で比較する
```
git diff --color-words
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1106470/b0e63975-a61f-7b45-d43d-420d9b59eea7.png)
Preline UI , TailblocksをHTMLのlinkタグだけで利用する。インストール不要！

Tailwind CSS のテンプレートサイトを使えば Web サイトを効率よく作成できます。しかし、インストールをしないと利用できないものばかり...（それが普通なのかもしれない。）lolipopレンタルサーバーなどではインストールができないので、`<link>`を使ってUIを簡単に美しくしたいと思います。
# Preline UIの場合
Preline UIの場合は、
~~~C:HTML
<link rel="stylesheet" href="https://preline.co/assets/css/main.min.css">
<link rel="stylesheet" href="https://preline.co/assets/css/algolia.min.css">
~~~
このコードを入れます。そのあとに、コピーしたHTMLコードをペーストすると大体適用されます。
全コードを出すとこんな感じ
~~~C:HTML
<head>
  <link rel="stylesheet" href="https://preline.co/assets/css/main.min.css">
  <link rel="stylesheet" href="https://preline.co/assets/css/algolia.min.css">
</head>
<body>
  <!--ここにコピーしたコードを置く-->
</body>
~~~
ただし、JSは適用されていないので、ユーザーからのリクエストは自分で書くまたは、自分でJSファイルを探すしかないです。
一応、あるだけ適応されているJSファイルを集めます。
~~~C:
<script src="https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/2.0.0/clipboard.min.js" type="text/javascript"></script>
<script src="https://client.crisp.chat/l.js" type="text/javascript"></script>
<script src="https://client.crisp.chat/static/javascripts/client.js?8d32644" type="text/javascript"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/2.0.0/clipboard.min.js" type="text/javascript"></script>
~~~
# Tailblocksの場合
Tailblocksの場合も同じように
~~~C:
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/tailwindcss/2.0.2/tailwind.min.css">
~~~
全体のコード
~~~C:
<head>
  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/tailwindcss/2.0.2/tailwind.min.css">
</head>
<body>
  <!--ここにコピーしたコードを置く-->
</body>
~~~
JSを探す時間がなかったので、許して。(;^ω^)
SwiftUIとCombine: ObservableObjectの基本

Combine,ObservableObjectとかよく分からなかったのでメモします。

### SwiftUIとCombine: ObservableObjectの基本
#### SwiftUIとは?
SwiftUIは、SwiftによるネイティブUIの作成のための新しいフレームワークです。SwiftUIは、iOS、macOS、watchOS、そしてtvOS向けのアプリケーションのUIを簡単に構築することができます。

#### Combineとは?
Combineは、Swiftでの非同期プログラミングとストリームの処理をサポートするフレームワークです。Combineを使用すると、イベントやデータの流れをオブザーバブルなシーケンスとして扱い、変化に応じてUIを更新することができます。

#### ObservableObjectとは?
ObservableObjectはCombineフレームワークに属するプロトコルで、クラスのインスタンスの変更を監視可能にするものです。このプロトコルに従ったオブジェクトは、そのオブジェクト内で@Publishedプロパティラッパーがマークしたプロパティが変更されたときに変更を通知します。

簡単な具体例:
以下は、ObservableObjectと@Publishedを使用した簡単な例です。
```swift:qiita.swift
import SwiftUI
import Combine

class UserData: ObservableObject {
    @Published var username = ""
    @Published var isLoggedIn = false
}

struct UserView: View {
    @ObservedObject var userData = UserData()

    var body: some View {
        VStack {
            Text("Username: \(userData.username)")
            Toggle(isOn: $userData.isLoggedIn) {
                Text("ログインステータス")
            }
        }
    }
}
```
上記の例で、UserDataクラスはObservableObjectプロトコルに準拠しており、usernameとisLoggedInの2つの@Publishedプロパティを持っています。これにより、これらのプロパティが変更されると、関連するUI部分が自動的に更新されます。
GNURadioでHackRF Oneを使う (macos)

GnuRadioでHackRF Oneを使おうと思ったらSourceとしてうまく使えなかったので、SoapyHackRFをインストールする手順のメモです。

# 検証環境

- macos Sonoma(14.0)
- [Homebrew](https://brew.sh/)

# インストール

## GNURadio

```
brew install gnuradio
brew install soapyrtlsdr
```

GNURadio実行方法
```
gnuradio-companion 
```

## hackrf

```
brew install hackrf
```


`hackrf_info`コマンドで認識されているか確認します。

```
$ hackrf_info
hackrf_info version: 2023.01.1
libhackrf version: 2023.01.1 (0.8)
Found HackRF
Index: 0
Serial number: 000000000000000026a468dc********
Board ID Number: 2 (HackRF One)
Firmware Version: 2023.01.1 (API:1.07)
.....
```

## SoapyHackRF

SoapySDRのモジュールのインストールパスを調査します。

```sh
SoapySDRUtil --info
######################################################
##     Soapy SDR -- the SDR abstraction library     ##
######################################################

Lib Version: v0.8.1-release
API Version: v0.8.0
ABI Version: v0.8
Install root: /opt/homebrew
Search path:  /opt/homebrew/lib/SoapySDR/modules0.8
Module found: /opt/homebrew/lib/SoapySDR/modules0.8/librtlsdrSupport.so (0.3.3)
....
....
```
という事で　`/opt/homebrew`以下にインストールされているのを確認。これをCMAKE_INSTALL_PREFIXとして設定します。

※Module Foundに出てこないと実行しても`RuntimeError: SoapySDR::Device::make() no matc`と出て失敗します。

```sh:
git clone https://github.com/pothosware/SoapyHackRF.git
cd SoapyHackRF
mkdir build
cd build
cmake .. -DCMAKE_INSTALL_PREFIX=/opt/homebrew/
make
sudo make install
...
Install the project...
-- Install configuration: "Release"
-- Installing: /opt/homebrew/lib/SoapySDR/modules0.8/libHackRFSupport.so
```

再度`SoapySDRUtil --info`で確認して Moduleとして認識されているのを確認して完了。
PowerShellで新規パスワードの生成

あったら便利かなと思って

```powershell
function new-password {
    param(
        $length = 12,
        [switch]$LowerExclude,
        [switch]$UpperExclude,
        [switch]$NumericExclude,
        [switch]$SymbolExclude,
        [switch]$Foolproof,
        [string]$NotIn = ""
    )
    if ($LowerExclude -and $UpperExclude -and $NumericExclude -and $SymbolExclude) { throw 1 }
    $password = ""
    while($password.Length -lt $length){
        $rand = Get-Random -Minimum 33 -Maximum 127

        if ($SymbolExclude  -and 33 -le $rand -and $rand -le 47) { continue }
        if ($NumericExclude -and 48 -le $rand -and $rand -le 57) { continue }
        if ($SymbolExclude  -and 58 -le $rand -and $rand -le 64) { continue }
        if ($UpperExclude   -and 65 -le $rand -and $rand -le 90) { continue }
        if ($SymbolExclude  -and 91 -le $rand -and $rand -le 96) { continue }
        if ($LowerExclude   -and 97 -le $rand -and $rand -le 122) { continue }
        if ($SymbolExclude  -and 123 -le $rand -and $rand -le 126) { continue }
        if ($Foolproof -and $rand -in @(48, 79, 108, 73, 49, 124)) { continue }
        $c = [string][char]$rand
        if ($NotIn -and $c -cin ($NotIn -split "")) { continue }
        $password += $c
    }
    return $password
}
```
RPi2Bカーネルビルド手順

# ハードウェア種別とアーキテクチャ

- Raspberry Pi Zero(初代)
ARMv6 である。後のビルド手順での KERNEL 環境変数には
`KERNEL=kernel`を指定する。
- Raspberry Pi2 ModelB(v1.1)
ARMv7 である。後のビルド手順での KERNEL 環境変数には
`KERNEL=kernel7`を指定する。

# ビルドの準備と手順

## ソースコードの取得
Raspberry Pi OS のソースコードの取得(Github上のソースをシャローコピー)
```
$ git clone --depth=1 https://github.com/raspberrypi/linux`
```

## x86ホスト上でのクロスコンパイル
```
ARCH=arm make bcmrpi_defconfi (または bcm2709_defconfig)
ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- make
```

## RPi上でのビルド手順
ARMv6の場合
```
KERNEL=kernel
make bcmrpi_defconfig
```

ARMv7の場合
```
KERNEL=kernel7
make bcm2709_defconfig
```

# ファイルの導入

Bookworm リリース以降は、 `/boot/firmware` 配下にファイルを配置するように変更になった。以下リンクの内容を参照のこと。
https://www.raspberrypi.com/documentation/computers/linux_kernel.html
https://www.raspberrypi.com/documentation/computers/config_txt.html
よってビルド完了後のファイル類の配置は、参照先ページの通り `/boot/firmware/`ディレクトリの配下で合っている。
```
sudo cp arch/arm/boot/dts/*.dtb /boot/firmware/
sudo cp arch/arm/boot/dts/overlays/*.dtb* /boot/firmware/overlays/
sudo cp arch/arm/boot/dts/overlays/README /boot/firmware/overlays/
sudo cp arch/arm/boot/zImage /boot/firmware/$KERNEL.img
```

`Bookworm`以前のリリースでは、ファイル類を`/boot/`配下に配置するという手順が正しかったが、それはobsoleteになった。

# クロスコンパイル用マシン(x86)でのビルド環境の準備
https://www.raspberrypi.com/documentation/computers/linux_kernel.html#cross-compiling-the-kernel
に準じる。

## パッケージ導入
Raspberry Pi OS や Ubuntu には以下のパッケージが存在するので、aptで導入する。
```
sudo apt install git bc bison flex libssl-dev make libc6-dev libncurses5-dev
sudo apt install crossbuild-essential-armhf
```
古めの書籍に記載されているような、 https://github.com/raspberrypi/tools から clone するという手順は不要である。このリポジトリ上のクロスビルド用ツール(4.xといった古いバージョンのgcc)の代わりに、上記の apt で導入できる arm 用ツール(OSに準じるが、2023年だと gcc 11.x)を使用するからである。
【Fortigate】FortiOS 7.2.6で有効化された自動アップデート

# FortiOS 7.2.6のリリースノート
http://docs.fortinet.com/document/fortigate/7.2.6/fortios-release-notes/230510/changes-in-default-behavior

こちらのリリースノートで自動アップデートがDefaultで有効になったことが通知されています。
対象は以下のモデルです。ざっくりFortigate100F以上のモデルは対象外になっています。

|主要モデル|派生モデル|FortiWiFiモデル|産業用モデル|
|:-:|:-|:-|:-|
|FGT-40F|FGT-40F-3G4G|FWF-40F<br>FWF-40F-3G4G|-|
|FGT-60E|FGT-60E-DSL<br>FGT-60E-DSLJ<br>FGT-60E-POE<br>FGT-61E|FWF-60E<br>FWF-60E-DSL<br>FWF-60E-DSLJ<br>FWF-61E|-|
|FGT-80E|FGT-80E-POE<br>FGT-81E<br>FGT-81E-POE|-|-|
|FGT-90E|FGT-91E|-|-|
|FGT-60F|FGT-61F|FWF-60F<br>FWF-61F|FGR-60F<br>FGR-60F-3G4G|
|FGT-70F|FGT-71F|-|FGR-70F<br>FGR-70F-3G4G
|FGT-80F|FGT-80F-BP<br>FGT-80F-POE<br>FGT-81F<br>FGT-81F-POE|FWF-80F-2R<br>FWF-81F-2R<br>FWF-81F-2R-3G4G-POE<br>FWF-81F-2R-POE|-|

*ただし、FortiManagerの管理下にある場合は対象外となるようです。(未検証)

# わかってる人用メモ
```:Fortigate60E OS 7.2.6【無効化】
■ 設定コマンド（VDOM無効の場合）
config system fortiguard
    set auto-firmware-upgrade disable
end
config system autoupdate schedule
    set status disable
end

■ 設定コマンド（Multi-VDOM構成）
config system global
config system fortiguard
    set auto-firmware-upgrade disable
end
config system autoupdate schedule
    set status disable
end
end

```

# 自動アップデートの問題点
リリースノートにあるように、自動アップデートはリリースを検知してから3日後に実行されるようです。
(Default=3,0-14で設定可能)
>the installation is scheduled after the upgrade delay in days (0-14, default = 3) between the firmware upgrade time interval.

他にも、設定値を確認する限り、AM2時-4時の間に実行されるように見受けられます。
```:Fortigate60E OS 7.2.6 Default-Config（Multi-VDOM）
config system global
config system fortiguard
    set auto-firmware-upgrade enable
    unset auto-firmware-upgrade-day
    set auto-firmware-upgrade-delay 3
    set auto-firmware-upgrade-start-hour 2
    set auto-firmware-upgrade-end-hour 4
end
end
```
アップデート実施時には再起動が発生しますので、通信断が発生します。

HA構成であれば1秒あるかないか程度のわずかな断時間で済みますが、シングル構成では起動までそれなりに時間がかかります。
許容できるかは要件次第ですが、受け入れられない要件にも関わらず気付かず納入してしまうことは避けましょう。

# 公式Administration Guideを参照したチューニング
http://docs.fortinet.com/document/fortigate/7.2.6/administration-guide/369092/enabling-automatic-firmware-updates
automatic firmware updatesに関連する設定のガイドがこちらです。

（内容確認してまた追記します。）

# 参考リンク
■ FortiOS 7.2.6 における自動アップグレード設定の意図しない変更について
[日立ソリューションズ]
https://csps.hitachi-solutions.co.jp/fortinet/data/info_20231013-1.pdf

■
バベルの塔症候群を避けましょう

# はじめに
以下イベントの参加記事です(開催：2023/10/09 〜 2023/11/08)

https://qiita.com/official-events/85f0264a6d31de057e8f

## タイトル関連用語

■[参考]バベルの塔

https://ja.wikipedia.org/wiki/%E3%83%90%E3%83%99%E3%83%AB%E3%81%AE%E5%A1%94

※更に気になる人は世界No1ベストセラーの「聖書」を読んでみてください

■[参考]バベルの塔症候群

https://scrapbox.io/villagepump/%E3%83%90%E3%83%99%E3%83%AB%E3%81%AE%E5%A1%94%E7%97%87%E5%80%99%E7%BE%A4

## 目次
下記の例を通して「なるべく用語の使用を避けて伝わりやすくしましょう」という趣旨です。

1. 非エンジニアからのヒアリング
2. エンジニアから非エンジニアへの回答
3. まとめ

## 非エンジニアからのヒアリング
目的：抽象的に説明された目的をいかに具体的にするか
※あくまで一例ですので誇張して記述している部分もあります
以下の例では「Q:非エンジニア」「A:エンジニア」として記述します。

1.例 / 要望 => 具体化

Q：〇〇画面にマウスで「ぐーっ」と引っ張ってきたファイルを付けられるようにできますか？

(頭の中：ドラッグアンドドロップしたファイルの添付機能を追加できるか訊いているのかな？)
A：マウス操作で(右利きの場合)右手人差し指のボタンを押下しながら
  　ファイルを〇〇画面に移動させた時に添付するようにできるかという事でしょうか？
  　例えば、お使いのメールソフトでメールにファイル添付する動作のようなイメージでしょうか？

Q：そうです！

A:「エンジニアから非エンジニアへの回答」へ続きます

「左クリック」すら言わないレベルで極端ですが、
「用語での表現を噛み砕いて」「例を提示して」分かりやすく伝える、
という例で書いてあります。

ここで大切なことは、「ルー語」のようになって
相手に伝わらなくなることを避ける、ということです。

## エンジニアから非エンジニアへの回答
役割：具体化したモノをどのように分かりやすく説明するか

2.例 / 具体化 => 回答

A：実現可能です。

Q：簡単に機能追加できますか？
(頭の中：この状況ではキツい…けど実現できないこともない、大変さをどう伝えようか)

A:実現するためには「添付ファイルがどこに置いてあるか」、「添付ファイルが存在するのか」等
各種情報を解析・加工し、そこから更に「添付する」という処理を
プログラムで行うようにする必要があるため(...中略...)くらいの規模の開発になります。

A：ですので技術的には可能ですが、弊社内で検討し別途見積りを出すことになります。
(なぜ難しいかを専門用語を用いず説明する => ここが非常に大変)

Q：「じゃあやめる」or「検討する」におおよそなる。

### まとめ
ここまで(おおよそ)日本語しか出てきませんでした。

用語を用いて正確に記述すると本筋から逸れてしまうので
参考になるようなサイトのリンクを貼りますが、以下のように説明をして
「なるほど！」と非エンジニアの方はなるでしょうか。

https://developer.mozilla.org/ja/docs/Web/API/File_API/Using_files_from_web_applications

逆に非エンジニアの方に以下のような専門用語を用いられて
「こういう機能が欲しいんだけれども」と説明されて
「なるほど！」とエンジニアの方はなるでしょうか。

https://www.orikane.co.jp/glossary/words/professionaljargon/

ならないですよね。

上記を意識しないと「要望 => 具体化」や「具体化 => 回答」のような
コミュニケーションをとることは容易ではありません。

## 補足
「アジェンダ( ≒ 議題)、レジュメ( ≒ 資料)」のように用語の変換を行わず、
そのまま伝わることが必要だと私は思います。

### 補足の補足
勢いで書いた文章なので後日修正する可能性があります。
z/OS V2R5

Migration from z/OS V2R3 or later 
---
Before migrating to z/OS V2R5, you must need to install PTFs for driving system, please refer to required PTFs.

Required PTFs
---
https://www.ibm.com/docs/en/zos/2.5.0?topic=idsrizpus-driving-system-requirements-installing-zos-other-products-by-using-serverpac-portable-software-instance-zosmf-software-management#reqos3b

You need to install required PTFs for driving system. COD has already installed required maintenance at the release.

Customized Offering Driver
---
https://www.ibm.com/docs/en/zos/2.5.0?topic=system-customized-offerings-driver

If you do not have z/OS V2R3 or later, you need install COD(Customized Offering Driver) system to your z mainframe. It will drive your installation of z/OS V2R5.

Note : z/OSMF V2R2 do not support latest version of ServerPac portable software instance, you must have z/OS V2R3 or later with appropriate maintenance.

References
---
<B>Marna Walle (STSM, z/OS Installation, IBM Systems)</B>
- https://www.linkedin.com/pulse/how-you-pulling-zos-ptfs-marna-walle/
- https://blog.share.org/Article/tag/marnas-musings

<B>IBM z/OS V2R5 related documents bookmarks</B>
- https://github.com/IBM/IBM-Z-zOS/tree/main/zOS-Education/zOS-V2.5-Education
PostgreSQLで特定のデータベースの全テーブルのレコード数をカウントする

PostgreSQLを使っていて、「このデータベースの総レコード数って何件になる？」と聞かれることがたまにあります。
それはデータのサイズ感をデータディレクトリのサイズで言ってもピンとこなかったり、データ移行後に件数を比較するために正確な件数が知りたかったりと理由は様々あると思いますが、とにかくレコード数が知りたい。

手っ取り早く件数を調べるには以下のSQLが使えます。

```SQL
SELECT reltuples FROM pg_class WHERE relname = '件数を調べたいテーブル名';
```

pg_classはPostgreSQLのシステムカタログ[^1]の一つで、テーブルと、その他に列を持つもの、あるいはテーブルに似た全てのもの（インデックスやシーケンス等）の情報を格納しています。`reltuples`列はテーブルのタプル数、つまりレコード数を保存しています。

しかし`reltuples`の値はプランナが参照する推定値であり、正確ではありません。おおよその数を知るだけなら活用できますが、「正確な現在の件数」を調べるには不向きです。

正確な現在の件数を知るためには、COUNT関数を使用します。

```SQL
SELECT COUNT(*) FROM 件数を調べたいテーブル名;
```

確かにCOUNT関数を使用すれば正確な件数がわかりますが、複数のテーブルの件数を同時に取得することができません。大量のテーブルがある場合、まずテーブルを列挙して`SELECT COUNT(*)`をテーブルの数実行する必要があります。テーブルを列挙したときに漏れがあると困りますし、一個一個SQLを実行していくと時間もかかります。実行し忘れたりするかもしれません。

なんとか一発で全テーブルにもれなくSELECT文を実行できないか考え、PL/pgSQLで関数を作成することにしました。

```SQL
CREATE OR REPLACE FUNCTION pg_temp.record_count()
RETURNS TABLE(objname TEXT, recordcount NUMERIC) AS $$
DECLARE
  cursor_tablename CURSOR FOR
    SELECT (schemaname || '.' || tablename) AS table_name
    FROM pg_tables
    WHERE
      schemaname !~ 'pg_*' AND
      schemaname != 'information_schema'
    ORDER BY table_name;

BEGIN

  FOR rec_table IN cursor_tablename LOOP
    EXECUTE 'SELECT COUNT(*) FROM ' || rec_table.table_name INTO recordcount;
    objname := rec_table.table_name;
    RETURN NEXT;
  END LOOP;
  RETURN;

END;
$$ LANGUAGE plpgsql;
```

上記PL/pgSQLを実行し、次のSQLで作成した関数を実行すると、データベース内に存在する全てのテーブルとそのテーブルの件数がどばっと表示されます。ただし「pg_」から始まるスキーマに属するテーブルと「information_schema」に属するテーブルは除外しています。

```sql
SELECT * FROM pg_temp.record_count();
```

テーブル数やレコード数が多いと実行に結構時間がかかります。

なお、pg_tempスキーマに作成しているため、この関数はセッションが終了すると削除されます。
これは用が済んだあとに削除し忘れないようにしているためで、残しておいて時々使いたい場合はpublicに作成してもいいかもしれません。

[^1]:リレーショナルデータベースがテーブルや列の情報などのスキーマメタデータと内部的な情報を格納する場所。 PostgreSQLのシステムカタログは通常のテーブルとして実装されている。
【AWS】Glueの処理結果をS3に1ファイルで出力する【Glue】

## 初めに
データの集計処理をGlueで実装中に、途中の処理結果を一旦S3に出力して確認したい時がある。この時何も設定せず出力先にS3バケットを指定するとS3バケットには複数に分割されたファイルが大量に出力されて中身の確認が大変になります。
これに対処するためのS3バケットに1ファイルで結果を出力する方法(今回はCSVファイル)を記事にしました。

## 使うAWSサービス
・AWS Glue
・Amazon S3

## 実現方法
### アーキテクチャ図(Glue Studio)
![GLueキャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192949/29b9478e-af92-0c0a-34cb-4de33af1fce2.png)


### 構成説明
#### ①DataSource
・図ではS3Bucketを指定している
・用途によってはRedshiftなど他のDataSourceを指定可能
※今回の話の記事の主題ではないので説明は割愛

#### ②Transform
・図ではSQLQueryを指定している
・DataSourceから受け取ったデータをSQLやPythonコードで集計/加工する
※今回の話の記事の主題ではないので説明は割愛

#### ③Custom Code ★
・結果をCSVに出力するにはCustomCodeを使用する
・下記のコードのように指定するとS3にファイルが1つ出力できる
・出力には区切り文字や並び特定の文字の置換、行の並び替えなど様々なオプションをつけることが可能だが、今回は良く使うオプションを記載した。

##### <コード例>
```python:sample
def MyTransform2 (glueContext, dfc) -> DynamicFrameCollection:
  selected = dfc.select(list(dfc.keys())[0]).toDF() # 前処理の結果を取得
  path = "【s3://bucket-name/key-name】" # S3の出力先を指定
  selected
    .orderBy("COLUMN_1","COLUMN_2","COLUMN_3") # 出力データの並び替えを行う場合に指定
    .coalesce(1) # 1つのパーティションに結合
    .write # 書き込み命令
    .option("header", "True") # ヘッダ有無
    .option("sep", ",") # 区切り文字
    .option("quoteAll", "True") # ダブルクォートで囲むか
    .option("escape", "\"") # エスケープしたい文字
    .option("emptyValue", "") # 空文字をどのように出力するか
    .option("nullValue", "") # NULL値をどのように出力するか
    .mode("overwrite") # 出力先ファイルの扱いoverwriteは上書き
    .csv(path) # 出力先
```
※parquetで出力したい場合
```python:sample
df.write.mode("overwrite").format("parquet").save(path)
```

## さいごに
Lambda関数だとコードの途中にprint()を使うことで途中の結果をコンソール画面の「TEST」の実行結果画面に出力できるのでデバッグが比較的しやすいが、Glueだと処理の途中の結果などをどのように確認したらよいか、良い方法を探していました。
私の業務ではRedshiftやS3の結果をCSV形式で出力することも多いのでこの記事の内容のように結果をS3にファイル出力する方法があればGlueでのデバッグもかなり楽になる。
「家電メーカーの考えるべき未来」に追記しました。

[「家電メーカーの考えるべき未来」](https://qiita.com/nonbiri15/items/ec8deb0e7bcbf788e1de)に追記しました。

## 変更点
- 統計データを追記しました。
- 白物家電の単価の上昇状況を追記。
- 白物家電の出荷台数の減少を追記。
- 白物家電を購入しないという選択が増えていることを追記。
- コインランドリーの市場規模の拡大
- パックごはんの市場規模の拡大
- 世帯普及率統計の分母の変更（平成26年）による、統計の比較可能性の破壊。

## 私見：
- コインランドリー事業に活路を見出したAQUA（旧三洋電機洗濯機事業）の活躍はすごい。
- 高価格路線に進んで平均単価の上昇をした家電業界は、20代の若い世帯にとって負担を上昇させるだけの状況にしかなっていないように見える。
- 市場から見捨てられる時期が近づいているように思われる。

## 新しい技術・新しい製品の開発の状況を見たことのない人のために
### [ボブ・ジョンストン著、伊浦志津　訳「松下流起業家精神」東洋経済新聞社　2006年](https://www.amazon.co.jp/%E6%9D%BE%E4%B8%8B%E6%B5%81%E8%B5%B7%E6%A5%AD%E5%AE%B6%E7%B2%BE%E7%A5%9E%E2%80%95%E6%97%A5%E6%9C%AC%E3%81%AE%E3%82%82%E3%81%AE%E3%81%A5%E3%81%8F%E3%82%8A%E3%81%AF%E3%81%93%E3%81%86%E3%81%97%E3%81%A6%E7%94%A6%E3%82%8B-%E3%83%9C%E3%83%96-%E3%82%B8%E3%83%A7%E3%83%B3%E3%82%B9%E3%83%88%E3%83%B3/dp/4492501592)

この本は、かつて存在した松下電子工業での技術開発を1人のエンジニアに着目して書かれたものである。
この本に書かれた時代を経験しているものの多くは、既に現役世代にはいなくなってしまっていることだろう。
光ディスクや非接触ICカードタグなどで新しい利用分野を拡大していくことに対して、積極的に取り組んでいた時代の雰囲気を読み取ってほしい。
結果的に敗れ去ったプラズマ・ディスプレイなどの分野もある。

何かを感じ取って、何かを得てほしい。