OmniAICreator/Qiita-1.07M huggingface dataset:
FileMakerの開発支援ツールMBS FileMaker Plugin (1) 変数名存在チェック他

FileMaker開発を強力に支援してくれるツールがあります。名前は「MBS FileMaker Plugin」といいます。
このプラグインツールは開発にかかる機能のみを使用すれば、制作したアプリは動作します。つまりユーザーにリリースする際には当該プラグインを組み込む必要がないということです（あくまでも開発にかかる機能のみ使った場合）

たくさんの便利機能がありますが、ここではスクリプトを記述する部分での機能について紹介します。
なお、これはMac版のMBS FileMaker Pluginの動作であり、Windowsプラットフォームでは実現していない機能があります。

## データビューワー不要の計算式チェック

MBS FileMaker Pluginを組み込むとスクリプトを記述するウィンドウの下部に、Syntaxチェックなどの欄が表示されます。
標準機能であれば、データビューワを開き検証するわけですが、MBS FileMaker Pluginがあれば、スクリプトウィンドウ内にてすぐに確認することが可能です。

以下のような変数設定の計算式があるとします
![Screen Shot 2022-05-11 at 12.16.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2322472/89f26a86-3333-5e0c-c71c-df3f93bc6a8e.png)


計算式のウィンドウの下部にMBS FileMaker Plugin用のスペースとボタンが表示されます

![Screen Shot 2022-05-11 at 12.16.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2322472/fc4fd763-b673-1422-fe91-e8003b119365.png)

チェックマークを押下すると、Syntaxチェックをしてくれます。
![Screen Shot 2022-05-11 at 12.16.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2322472/0ae9fc41-15d6-884f-6fa3-b5fc337bfecf.png)

実行ボタンを押下すると、計算式が評価され、結果の値が表示されます
![Screen Shot 2022-05-11 at 12.17.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2322472/d780a2f4-c8b4-5dca-e275-eb238fcb25e1.png)

わざわざ、データビューワを開かなくてもここでチェックや結果を確認できるのはとても効率がよいでしょう。

## 変数名のチェック機能

スクリプト上に存在しない変数名の記載があるとアラートを出して教えてくれます。
この例では　$count　という変数名はない　と知らせてくれています。
![Screen Shot 2022-05-11 at 12.43.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2322472/57dbebdf-aa78-b383-f5c3-741d707dc1cb.png)

修正しましょう
変数名を正しくすることで、エラー表示が消えました。
![Screen Shot 2022-05-11 at 12.43.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2322472/29d9d50d-32c3-d212-5d7d-bd1adb60b758.png)

変数名のスペリングミスなどは発生しやすいです。視覚的にハッキリと見せてくれるこの機能はミスの発見に多いに役立つことでしょう。


## 検索と置き換え機能
スクリプトの中の文字列を検索することと、置き換えることが可能になっています

![Screen Shot 2022-05-11 at 12.17.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2322472/62c0841e-4c60-6719-b205-971987c12569.png)

右クリックなどでコンテキストメニューを表示させます
メニュー下部に、Search and Replace というメニューが追加されていることが分かります
![Screen Shot 2022-05-11 at 12.17.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2322472/64fc4063-a6ee-651b-bbb6-609115abc79a.png)

検索したい文字列、置き換えたい文字列を入力できます。
ここでは変数の名称を変えようとしています
![Screen Shot 2022-05-11 at 12.19.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2322472/c904982b-9104-8371-ea4e-a308b9400bb9.png)

置き換え処理ができました。
スクリプト内の変数名が、適切に置き換えられていることが分かります。

![Screen Shot 2022-05-11 at 12.19.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2322472/8f414893-b967-bd08-e2c5-1e139073c45e.png)

すべて漏らさずに確実に変更したい場合はこの検索と置き換えの機能が有効でしょう。
例では変数名を置き換えましたが、フィールド名も対応可能です。

EOF
Traditional CMS vs Headless CMS

今回の記事にはTraditional CMS と Headless CMS.の違い説明したいと思います。
みんなウェブサイトを作るときにcontent management system(コンテンツマネジメントシステム)または省略したらCMSと言いました。
今のウェブサイトにはこのCMS非常に大事と言われましたなぜかというとこのCMSはコード書かずにアプリを管理することができますそれと新しページを簡単に作れるからです

CMSは大体普通に分かれているそれは tradicional CMSとHeadless CMS。
- <b>tradicional CMS</b> は例えばWordPressとかwixとかです。
- <b>Headless CMS</b>は例えばsatiny.ioとかstrapiとかです。
# tradicional CMS
tradicional CMSはWordPress と Drupalのようなきちんとした簡単なアプリコードベースコードfront-endとbackendを繋がるためのモノリス
### メリット
- 全部のサービスは一つのシステムに含む
- コンテンツの管理がしやすい
- テーマとレンプレートが多い
- コミュニティがたくさんある
- エラー少ない
### デメリット
- 管理のためにたくさんお金がかかる
- フレキシブル がない
- 開発するときに特別なCMSが必要です

# Headless CMS
Headless CMSとは普通のCMSと違ってFrontendと繋がらないです。だからコンテンツの画面がとてもフレキシビリティです、すなわちどこの端末でもちゃんと綺麗に見れる。そしてHeadlessCmsはFrontendとコンテンツの繋がりはAPIを使っています。

### メリット
- どこの端末でも使える
- すべてを含む単一のシステムにいることを心配せずに、コンテンツを作成する
- フロントエンドにとらわれない（ヘッドレスCMSは、コンテンツがどこに行くのか、どのように表示されるのかを気にしません。開発者が好みのフレームワークやツールを自由に使用できるようにするだけです。
- ヘッドレスAPIを使用すると、開発者はコンテンツについて心配する必要がなくなり、プレゼンテーションについて心配することができます。


### デメリット
- コンテンツプレビューなし
- より事前の統合/構成の取り組み
- ヘッド/クライアントの開発（「ヘッド/クライアント」とは、作成したコンテンツ（Webサイト、モバイルアプリケーションなど）の出力と表示を意味します）。
【Prisma】 prisma migrate devをすると Could not resolve xxx エラーが消えない時

# 経緯

`prisma migrate dev` をすると`npm install @prisma/client`をしてくれと言われたので、やったがエラーが消えなかった

解消するまで沼ったので対応方法をまとめておく

```bash
prisma migrate dev         

Error: Could not resolve @prisma/client despite the installation that we just tried.
Please try to install it by hand with npm install @prisma/client and rerun prisma generate 🙏.
```

# 本題

`prisma --save-dev`した後に`@prisma/client`し直したら成功した

これが本質的な解消方法なのかは不明だが

```bash
npm install prisma --save-dev
npm install @prisma/client
```
AtCoder Two Colors Card Game 

## 問題
https://atcoder.jp/contests/abc091/tasks/abc091_b

## 回答
```Python
n = int(input())

a = {}
for _ in range(n):
    s = input()
    if s in a:
        a[s] += 1 #文字があったら1をプラス
    else:
        a[s] = 1 #　Nが一枚でもあれば最大で点数は1になる。
        
m = int(input())
for _ in range(m):
    t = input()
    if t in a:
        a[t] -= 1 #赤いカードに文字があったら1をマイナスをカウントする。
    else:
        a[t] = -1 #Mが1枚でもあれば最小で点数は-1になる。
        
ans = 0

for i in a.values():
    ans = max(i, ans)
    
print(ans)
```


## ポイント
点数を配列に格納する。
```for in```を使用し文字列ごとに点数を格納していく。
最後に最大値を求める。
Make(旧:integromat)で文字列を削除する方法について

# integromat内で使用している値から指定文字列を削除したい
integromatを使用していて迷った内容をメモしておきたいと思います。
様々なモジュールを使用してデータ連携を実装していると、"データ整形"が必要になってきます。

・文字列の中から日付データを抽出したい。
・前後の不要な文字列を削除したい。
など。

"Text parser"というモジュールを使用し、パターンマッチングさせる事でほとんどの場合要件を満たす事ができるのですが…正規表現は複雑なのでちょっと考えないといけない。

**『単純に前についている固定の文字列を削除したいだけなのにわざわざ正規表現を使わないといけない？』**
と思うことが多々あり、調べてみました。

## replace関数を使用する
replaceという関数がありました。
固定の文字列を置換してくれる関数ですね。
`replace( [対象の文字列] ; [置換したい文字列] ; [置換後の文字列] )`
![公式から.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/459104/7c1c8b76-1a06-3e26-0714-d570e7cd3403.png)
公式ページ通りに動きを検証してみます。結果は、
```
Hi World
```
になりました。

## 第3引数を空に
ということは、単純に第3引数([置換後の文字列])を空にすれば良い。
![第三引数を空にした場合.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/459104/61b415dc-14d6-6872-a419-45ec48ff8107.png)
結果は、
```
Hello World
```
置換されていない…。
空はダメなようです。

## 第3引数にnullを指定
第3引数([置換後の文字列])にnullを設定してみる。
![第三引数をnullにした場合.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/459104/bd87e8a8-dc73-83bf-8644-7e514222ae78.png)
結果は、
```
Hello World
```
これもダメでした。

# 結論
試行錯誤していると「emptystring」(空文字列)というのを見つけました。
「emptystring」を指定する事で、無事に対象文字列を削除(空文字列に置換)する事ができました。
![第三引数をemptystringにした場合.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/459104/80bb2350-4f93-38a3-0c27-ce9e9ef2e582.png)
【Swift】contains(_:)で任意の文字が含まれているか調べる

## はじめに
`contains(_:)`メソッドを使う機会があったので備忘録として残します。

## 環境
- Swift: version 5.6
- Xcode: Version 13.3.1 (13E500a)
- macOS: 12.3.1 (21E258)


## `contains(_:)`メソッド

```swift
func contains(_ element: Self.Element) -> Bool
```

- Sequenceプロトコルで提供されるメソッド。
- 引数と同じ要素が含まれるかどうかを調べることができる。

## 使い方

### 例題

> 配列["MacBook", "iMac", "Mac Pro", "iPhone", "iPad", "Apple Watch"]に対して下記の操作行う。
> 1. iPhoneが含まれているか調べる。
> 2. iが含まれている製品を抽出する。 

### 実装
```swift
let product = ["MacBook", "iMac", "Mac Pro", "iPhone", "iPad", "Apple Watch"]

//iPhoneが含まれているかを調べる。
print(product.contains("iPhone"))
//true

//filterメソッドと組み合わせて、iが含まれる製品を抽出する
let filtered = product.filter { $0.contains("i") }
print(filtered)
//["iMac", "iPhone", "iPad"]
```

## `contains(where:)`メソッド

引数にクロージャを渡す`contains(where:)`もあります。

```swift
func contains(where predicate: (Self.Element) throws -> Bool) rethrows -> Bool
```
- 引数に渡したクロージャを満たす要素が含まれているかどうかを調べることができる。`

`contains(where:)`の使用例は[こちら](https://qiita.com/nownaka/items/a0d5b0d4ca30360dd6fb)。

## さいごに
`contains(_:)`メソッドの使い方をまとめてみました。
最後まで見ていただきありがとうございました。

## 参考記事・書籍

https://developer.apple.com/documentation/swift/array/2945493-contains

https://www.sbcr.jp/product/4815604073/
ESP32のホスト名、デバイス名を変更する方法

現在ESP32-CAMを使用して、開発を行っているのだが、
複数台のESP32-CAMを使用した場合、すべてのホスト名が「arduino-esp32」になってしまう
現象が発生していた。
これだとネットワーク管理者が区別しにくいと思い、
ホスト名を変更しようとしたのだが、ホスト名を変更する方法を記載した記事がなかったので
自分で書いてみた。
## ソースコード
```c
#include <WiFi.h>

const char* ssid = "SSIDNAME";
const char* password = "PASSWORD";
String hostname = "ESP32TEST01";

void setWiFi() {
  WiFi.setHostname(hostname.c_str()); //ホスト名設定
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.println("Connecting to WiFi..");
  }
  Serial.println(WiFi.localIP());  //設定されたIP表示
}

void setup() {
  Serial.begin(115200);
  setWiFi();
  Serial.println("setOK");
}

void loop() {

}
```
Excelをサーバーサイドで実行するためのIIS設定【非推奨】

## はじめに
クライアント側のWeb画面操作をトリガーにして、IISのサーバー側で既存のExcelマクロ（秘伝のタレ的な業務ツール）を実行させたいという~~無茶な~~要求があり、試行錯誤したときのメモです。
同じサーバー内にて、タスクスケジューラ等を使用してExcelマクロをバッチ実行させている環境でもあります。

:::note warn
注意
MS Officeのサーバーサイド オートメーションはMicrosoftでは非推奨かつ動作保証されません。
また、ライセンスの問題も存在します。以下のリンク先を確認して自己責任でお願いします。
[Office のサーバーサイド オートメーションについて](https://support.microsoft.com/ja-jp/topic/office-%E3%81%AE%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%82%B5%E3%82%A4%E3%83%89-%E3%82%AA%E3%83%BC%E3%83%88%E3%83%A1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6-48bcfe93-8a89-47f1-0bce-017433ad79e2)
:::

## 環境
* Windows Server 2016
* Microsoft Excel 2016
* IIS 10

WebアプリはASP Classic（VBScript）で作成。
そんな化石みたいな技術を使うなという意見もあると思いますが、Visual Studioのライセンスが与えてもらえない状況下でしたのでこれが精一杯でした。
(拡張子.asp、文字コードUTF-8)


## IISの設定

### 専用のアプリケーションプールを作成
IISマネージャーのアプリケーションプールの設定画面で以下画像のように設定する。
詳細設定 > 
* .Net CLRバージョン v4.0
* 32ビット アプリケーションの有効化 True（後述のExcelの環境に依存する）
* プロセスモデル > ID > カスタムアカウント
カスタムアカウントはWebアプリを実行したいユーザー
![IISアプリケーションプール.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513605/07e2685f-8d37-f8cb-ce77-8358607e3366.png)

参考文献

IIS ASP.NET でエクセルを使用する方法
https://itblogdsi.blog.fc2.com/blog-entry-418.html

## DCOM設定関係
### Excelの32bit/64bit判別
Excelのバージョン情報から32bit版か64bit版かを確認しておく
![Excelバージョン.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513605/514b6465-49d2-7c92-4bcb-2a7e65a19f19.png)

### DCOM設定	
コマンドプロンプトで　`mmc.exe comexp.msc /32`
⇒後ろに/32をつけることで32bitアプリケーション用のコンポーネントサービスを呼び出せる。
（通常Excelは32bit版がインストールされているはずなので。ここは各自で確認してね）

DCOMの構成 > Microsoft Excel Application で右クリック > プロパティ
ID タブを選択 > 起動したユーザー
![コンポーネントサービス.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513605/abba204f-10ad-e771-83c1-bc895ce74b17.png)



参考文献
http://cu-kansai-it.org/?p=453

64bit Windows 環境で 32bit の DCOM コンポーネントを登録しても一覧に表示されない
https://www.projectgroup.info/tips/Windows/comm_0060.html

Excel.applicationのローカルパスが空白になる
https://social.msdn.microsoft.com/Forums/ja-JP/9e71d56d-01f6-4949-b7de-ed235dff6362/excelapplication123981252512540124591252312497124731236431354303331?forum=aspnetja

## Windows認証でDCOM起動可能にする設定
DCOMの設定「セキュリティ」タブと、IISマネージャーの認証の設定を以下の画像のように設定する。
※IISの認証の設定で、Windows認証以外の認証方法は無効にしておくこと

ユーザー「NETWORK」にローカルからの権限を付与してあげるのがポイント。
他のサイトでよく解説されている"IIS_IUSRS"に権限を与えてもWindows認証で接続してきたユーザー情報が取得できない。
⇒これが取得できないとWebアプリ内のユーザー認証機能が作れないので苦労する
![IIS_Windows認証.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513605/d612ec3d-d779-8887-ab21-f2cb7d2a64df.png)



### メモ
・DCOM設定を特定のユーザ(このユーザー)に設定した場合の副作用
 サーバーにログインして直接VBScriptからExcelマクロを叩く時(タスクスケジューラから起動する等)、最上位の特権でないとCreateObject("Excel.Application")で失敗する。
React17での変更を読み直す

React18が2021年11月にベータ版となりましたが、Reactの経過を知るため、React17の変更を今一度読み返します。
↓公式リリースノートから抜粋しています
https://ja.reactjs.org/blog/2020/08/10/react-v17-rc.html

# React17での変更
### 1.段階的なアップグレードが可能
React18などのバージョンをアップグレードする際にアプリ全体をアップグレードせずに段階的にアップグレードを進めることができる。
例えば、アプリの大部分を React 18 に移行しつつ、いくつかの遅延ロードされるダイアログやサブページを React 17 のままにしておける。
段階的に更新しないといけないという訳ではなく、一気にアップグレードするのがベストの選択肢ではある。

### 2.イベントデリゲーションに関する変更
Reactはdocumentレベルにイベントハンドラをアタッチしなくなり、DOMツリーのrootDOMコンテナにアタッチするようになる。
Reactはイベントに対してdocument.addEventListener() のようにしていたが、React17は、rootNode.addEventListener() という呼び出しを行う。

##### 気を付けること
React内でdocument.addEventListener(...)とう形でイベントリスナを登録しても、dcumentレベルには到達しない（rootNodeまで）ため、e.stopPropagation()を使ってReact内の全てのイベントの制御はできない。
dcumentレベルでのイベントを実行するには、document.addEventListenerの第3引数として { capture: true }を追加し、イベントリスナがキャプチャフェーズで呼ばれるようにコードを変更する

#### キャプチャフェーズとは？
##### キャプチャリングとバブリング
DOMイベントは３つのフェーズがある。
1. キャプチャフェーズ（イベントが下る）
2. ターゲットフェーズ（ターゲットに到達）
3. バブリングフェーズ （ターゲット要素から上にバブル）

要素をクリックした場合の流れは、
まずキャプチャフェーズでイベントがWindowから要素に向かって降りていく。
ターゲットフェーズでターゲット要素に到達し、
その後、バブリングフェーズでハンドラを呼び出しながら上に伝達して行く(バブル)。

##### キャプチャフェーズは通常は使われない。
プロパティまたはHTML属性、もしくはaddEventListener(event, handler) を使って追加されたハンドラはキャプチャリングはせず、２と３のみで行われる。
キャプチャリングフェーズでイベントをキャッチするには、addEventListenerの３つ目の引数を true にする必要がある。

### 3.ブラウザとの整合性向上
- onScrollイベントはバブリングしないようになった。
- ReactのonFocusとonBlurイベントはネイティブのfocusinとfocusoutイベントを裏で使うように変更（以前はfocus）
- onClickCaptureといったキャプチャフレーズイベントは、実際のブラウザのキャプチャフレーズのリスナーとなった

### 4.イベントプーリングの廃止
イベントハンドラが実行された後にオブジェクトのプロパティにアクセスする必要がある場合は、e.persist() を呼ぶ必要があったが、このような最適化は必要なくなった。
```react:React16
function handleChange(e) {
  // Prevents React from resetting its properties:
  e.persist(); // ← React17からは必要ない

  setTimeout(() => {
    console.log(e.target.value); // Works
  }, 100);
}
```

### 5.副作用クリーンアップのタイミング
クリーンアップのタイミングも非同期になった。また、実行するタイミングは新しい副作用より前。

useEffect内の関数は画面に更新が反映された直後に非同期的に実行しするが、クリーンアップ関数は同期的に実行されていた。大きな画面遷移（タブの切り替えなど）がある場合に遅くなってしまう問題があった。

##### 気を付けること
```react:注意が必要
useEffect(() => {
  someRef.current.someSetupMethod(); // <=クリーンアップ実行時にはnullになっている場合がある
  return () => {
    someRef.current.someCleanupMethod();
  };
});
```
```react:対応策
useEffect(() => {
  const instance = someRef.current; // <=副作用の内部で書き換わる可能性のある値をキャプチャ
  instance.someSetupMethod();
  return () => {
    instance.someCleanupMethod();
  };
});
```

### 6. Undefined を返した場合の一貫性のあるエラー
forwardRefとmemoコンポーネントではこのような返り値のチェックを行っていなかったが、undefinedを返すことはエラーになる。
通常の関数・クラスコンポーネントの振る舞いと合致するように変更。

# 参考
https://ja.javascript.info/bubbling-and-capturing
メルセンヌ・ツイスタ(32bit版 mt19937)の「初めからの最下位ビット列」から初期設定値を探る

記事 "[メルセンヌ・ツイスタ(32bit版 mt19937)の初期値と「最初から偶数（または奇数）が連続する回数」を調べる](https://qiita.com/ikiuo/items/66f5f6ce3e5479cfaa6d)" を少し弄って、初期値と「初めからの最下位ビット列(64個)」の関係を調べます。

<details><summary>調査用プログラム(1)</summary><div>

```c++:
#include <cstdio>
#include <algorithm>
#include <random>
#include <vector>

using namespace std;

int main()
{
  struct result
  {
    uint32_t seed;
    uint8_t pattern[8];
  };

  vector<result> res_list;
  uint32_t seed = 0;

  do
    {
      mt19937 rand(seed);
      result r = { seed, { 0, 0, 0, 0, 0, 0, 0, 0 } };
      for (int i = 0; i < 64; i++)
        r.pattern[i >> 3] |= (rand() & 1) << ((i & 7) ^ 7);
      res_list.push_back(r);
    }
  while (++seed != 0);

  sort(res_list.begin(), res_list.end(), [](result &a, result &b) {
    for (int i = 0; i < 8; i++)
      {
        if (a.pattern[i] < b.pattern[i])
          return true;
        if (a.pattern[i] > b.pattern[i])
          return false;
      }
    return (a.seed < b.seed);
  });

  for_each(res_list.begin(), res_list.end(), [](result &res) {
    printf("%08x:%02x%02x%02x%02x%02x%02x%02x%02x\n", res.seed,
	   res.pattern[0], res.pattern[1], res.pattern[2], res.pattern[3],
	   res.pattern[4], res.pattern[5], res.pattern[6], res.pattern[7]);
  });

  return 0;
}
```

</div></details>

結果が出るまで数時間かかります。また、出力されるテキストは 104 または 108 GiB (1 行 25 + [改行] バイトで 2<sup>32</sup>行) になります。

```console:結果{初期値:パターン}
ecd5c6c6:000000003076cb23
e4ffc2e9:00000001f1d4ae6a
447a34c4:000000036a491069
39b98442:00000003a1e527ed
8fd4babb:00000004ec6f13de
7e27ad00:00000005649e9b0b
563b264d:000000069f4da9c8
87129e85:00000007e117e509
~~~(略)~~~
4f9926e7:fffffff00e7437c5
e4261907:fffffff5b4b1c6ff
69d1a06c:fffffff68f959603
466c9425:fffffff83a6ca338
74d84d8d:fffffffb2d40220f
e417fbd4:fffffffe1e2275e3
b0c30fba:ffffffff417d84b3
b8422813:ffffffff5d2811ce
```

パターンは 64 ビットで最初はビット 63 で、64 番目がビット 0 に割り当てています。

もうお分かりでしょう。この辞書を使えば凡そ 40(+α) 番目くらいで初期値が判明し、その後はシミュレーション可能になります。

最下位ビットを二値（表裏など）のゲームに使っていたら、プレイヤーがある時点から 100% 的中する事態になり得ます。

ここではパターンをビット並び（2進数）としましたが、辞書に6進数のパターンを用いればサイコロに適用できます。

他の疑似乱数でも同様の状況になるものがあるでしょう。
AthenaにてOpenCSVSerDeでダブルクォーテーションの利用で作成したテーブルのクエリエラー

# エラー
> HIVE_BAD_DATA: Error parsing field value '' for field X: For input string: ""

Athenaでクエリを流す時に上記のエラーが出ました。

# テーブル定義
テーブル作成時のエンジンは `OpenCSVSerde` でダブルクォーテーションを指定して、CSVデータを処理したいです。

```sql
...
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
WITH SERDEPROPERTIES (
   'separatorChar' = ',',
   'quoteChar' = '"',
   'escapeChar' = '\\'
   )
STORED AS TEXTFILE
LOCATION 's3://DOC-EXAMPLE-BUCKET/mycsv/';
```

# 解決方法
AWSのKnowlageCenterの記事に記載されています。
[Why do I get the error "HIVE_BAD_DATA: Error parsing field value '' for field X: For input string: """ when I query CSV data in Amazon Athena?](https://aws.amazon.com/premiumsupport/knowledge-center/athena-hive-bad-data-error-csv/)

一言で言うと、**テーブル定義のDDLで全部のカラムを `STRING` として定義すれば解消します**。

# 原理
その理由は`OpenCSVSerde`はデータを解析する時、`null`でも `""`でも、なんでもいいです、とりあえず全部`STRING`として取り扱ってください。こうするとエラーがならないです。

# おまけ
なぜ `OpenCSVSerde` を利用しますかと言われたら、今回処理したいCSVデータはCURレポートです、出力したCSVデータは一部だけカンマ「,」が入っていてダブルクォーテーションで囲まれています。`OpenCSVSerde` を利用しないとこんなデータの列ずれが発生します。
要するには、一部のデータだけダブルクォーテーションで囲まれていても、`OpenCSVSerde` を利用して `quoteChar = '"'`を指定してもOKです、ダブルクォーテーションで囲まれていないデータへの影響がありません。

# 文句
AWSのCURレポートはCSVフォーマットの出力データはほんっとうに馬鹿馬鹿しいですわ。カラムは可変だし、Athenaで大文字小文字が区別できないのに、レポート中で大文字小文字で区別するカラムがあるし、カンマが入っているデータも存在するし。。。Athena整合性を有効化によってある程度が回避できますが、なんでそもそももっといい構成にしてないのか？
CP2102 6in1というめちゃ安のUSB変換モジュール使ってみた。（ESP-CAM書き込み用）

![コメント 2022-05-11 105416.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1339052/5463598d-a4b9-f17a-103c-99abdb52b97d.png)
Aliexpressで300円程度のUSB変換モジュールを購入したので、
レビューします。
https://ja.aliexpress.com/item/32830021528.html

ちなみに今回は、ESP32-CAMにプログラムを書き込みたかったため
購入しております。

## 機能
機能としては、
- TTL通信
- RS232C通信
- RS485
があり、PCのUSBに接続して色々な通信ができるようです。
信号レベルは、テスターで当たると3.3Vでした。

## driver
以下のサイトから自分のPCにあったドライバをダウンロード
https://www.silabs.com/developers/usb-to-uart-bridge-vcp-drivers?tab=downloads

## PCからのマイコン（TTL通信）
今回はESP32-CAMと通信しますので、CP2102のディップスイッチの設定は
以下のようになります。
No1：ON
No2：OFF
モードスイッチ？：下
↓写真の設定です。
![コメント 2022-05-11 105416.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1339052/5463598d-a4b9-f17a-103c-99abdb52b97d.png)

ピンも色々ありますが、ESP32-CAMに接続する場合はTXDとRXDを使用して下さい。
B - Ringo's Favorite Numbers AtCoder

## 問題
https://atcoder.jp/contests/abc100/tasks/abc100_b
## 回答

```Python
d, n = map(int, input().split())

if n == 100:
    print(101 * (100 ** d))
else:
    print(n * (100 ** d))
```

## ポイント

```N * 100 ** D```が答えになる。
Nの値で条件文を使い、Nが100のときには100で割り切れない101を使う。Nが100でなければNがそのまま使えるので、それぞれ100のD乗を掛ける。

問題がよくわからず。
【ServiceNow】Virtual Agent_レコードのアクセス権限に関する注意点

## はじめに

みなさんこんにちは、三井情報株式会社です。
今回は、Virtual Agent（チャットボット）のレコードアクセス権限に関して、実装時に注意すべきことを紹介します。以下の2章立てとなっております。
　1．コンポーネントによるレコードアクセス権限の違い
　2．ユースケース：ユーザの会社に基づいてフローを分岐させる

### 1．コンポーネントによるレコードアクセス権限の違い
Virtual Agentの中でテーブルのレコードを取得する方法として、2種類のコンポーネントを使う方法が考えられます。一方で、これらのコンポーネントはレコードへのアクセス権限がそれぞれ異なります。
①ユーティリティ > ルックアップ：「ユーザ権限」に基づいてアクセス
②ユーティリティ > スクリプトアクション：「System権限」に基づいてアクセス
　　　　　　　　　　　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2599953/53ef1627-4c10-3603-a2d8-93c7ee9b7776.png)


ルックアップのコンポーネントは、条件設定のレベルでレコード取得のノードを実装できるお手軽さがあります。その一方で、ユーザ権限でレコードアクセスできない場合には、スクリプトで実装する必要が有ります。
第2項では、私たちが実装で困った場面をもとに、スクリプトで実装する必要があるケースを1つ紹介します。


### 2．ユースケース：ユーザが所属する会社に基づいて、フローを分岐させる
第2項では、レコードの取得に関して、スクリプトを使用して実装する必要が有るケースを1つ紹介します。ここでは、以下の機能を実装することを考えてみます。

★実装したい機能：ユーザが所属する会社に基づいて、フローを分岐させる

今回作成したサンプルフローの流れは下記の通りです。
1．ルックアップ/スクリプトのどちらで会社を取得するか選択
2．会社テーブルから操作ユーザの所属会社を取得（1．で選択した方法で取得）
3．取得した会社に基づいて、フローを分岐させる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2599953/1b990e27-bad8-5b8d-2baa-6bb0bc9be1e2.png)

フローの詳細な実装方法は割愛します。
ここからはルックアップ・スクリプトアクションの両方で会社を分岐させた場合の動きを見ていきます。今回は下記のテストユーザを使用して、「テスト会社1」の分岐を通るかを見ていきます。※ロール無しのユーザ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2599953/a9045405-9318-d4c8-7939-840b3ab23371.png)


#### 2-1. OKなパターン：「ユーティリティ > スクリプトアクション」を使用して会社を分岐
まずは、スクリプトアクションのコンポーネントを使用して会社を分岐させてみます。

※スクリプトアクションノードの設定は下記の通り
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2599953/14c55427-5862-cf63-5c34-1f1b783d03e7.png)


テストユーザでVirtual Agentで今回のテストシナリオを起動して、「スクリプトで会社を取得」を選択してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2599953/4f20cdfa-c900-3039-93ee-28e942956f8d.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2599953/0695c7ac-e4bb-92f5-9677-bc99f34d7368.png)

無事、テスト会社1の分岐を通過させることができました。

スクリプトアクションを使用することで、System権限でテーブルにアクセスできます。ロールを持っていないユーザでも会社テーブルにアクセスして情報を取得することができました。


#### 2-2. NGパターン：「ユーティリティ > ルックアップ」を使用して会社を分岐させる
次に、ルックアップを使用して会社を分岐させてみます。

※ルックアップノードの設定は下記の通り
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2599953/f8f5cd79-249e-3849-29bb-865a60693071.png)

テストユーザでVirtual Agentで今回のテストシナリオを起動して、「ルックアップで会社を取得」を選択してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2599953/f7568663-46a9-4168-e94b-c7547a0cb79b.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2599953/16e622c0-df41-3865-fc16-8f7db5d77c6c.png)

下記のチャットが表示され、分岐へ上手く進めませんでした。
「技術的な問題が発生しており、この会話を続けることができません。」

今回のテストユーザは、会社テーブルへのアクセス権限を持っていなかったため、ルックアップのノードで強制終了してしまいました。
このように、チャットボットの操作ユーザがテーブルへのアクセス権限を持たない場合、ルックアップコンポーネントではアクセスできないことが分かります。




## おわりに
今回はルックアップ、スクリプトアクションの2種類のコンポーネントのテーブルアクセス権限の違いと、アクセス権限の違いによるユースケースを1つ紹介しました。

ルックアップは設定レベルでお手軽にテーブルの情報を取得できる一方で、操作ユーザのテーブルアクセス権限を考慮する必要があります。今回のように、ルックアップで上手く動作しない場合は、スクリプトアクションでの実装を試してみることを推奨します。
最後までお読みいただき、ありがとうございました。


三井情報株式会社
ソリューション技術本部
ITマネジメント技術部
第一技術室
野口　唯
キャンペーンメンバーレコードのコレクションを組み立てて、ループの外に作成するにはどうすればよいですか


+ [キャンペーンメンバーレコードのコレクションを組み立てて、ループの外に作成するにはどうすればよいですか？](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000GzktJ)

ループを使用してアイテムをレコードコレクションに追加します。  

1. タイプVariable>Recordの新しいコレクションリソースを作成します。オブジェクト：キャンペーンメンバー。コレクションであることを確認します（[複数の値を許可する]チェックボックスをオンにします）
2. キャンペーンメンバーの単一レコード用の別のレコード変数を作成します（[複数の値を許可する]ボックスにチェックマークを付けないでください）。
3. ループ内で、レコードの作成を割り当てに置き換えます
4. 割り当てで、単一のレコード変数のすべてのフィールドに適切な値を割り当てます
5. 割り当ての最後に、コレクションに単一のレコードを追加します（<collection> add <single record>）
6. ループの後に、レコードコレクションをデータベースに保存するためのレコードの作成があります

ループ内にレコードの作成（またはその他のピンク色の要素）を入れないでください。
Windows Rancher Desktop が proxy環境で docker run hello-world できない人の Tips

## はじめに

以前の記事で Docker Desktop の代替に minikube を使う方法を記載しました

https://qiita.com/RyoWakabayashi/items/e243be18b2db6b11400d

しかし、この方法は Rancher Desktop の登場により、もはや過去のものになりました！

https://rancherdesktop.io/

macOS では minikube で不便だったところが全て解消されます

Windows でも、わざわざ WSL 上の Docker を使わなくてよくなります

本記事では、 Windows かつ proxy 環境の場合の設定方法を紹介します

macOS かつ proxy 環境の場合は以下の記事（後輩著）を参考にしてください

https://qiita.com/yuu-matsuo/items/4a9b007cc3da88055418

## Rancher Desktop の導入

以下の記事を参考に Windows に入れてみました

https://qiita.com/moritalous/items/14d4099023981dcf4fd2

特に問題なくインストールできました

が、 proxy 環境なので追加で設定していきます

## Proxy 設定

Qiita に先駆者様がいらっしゃったので、

https://qiita.com/yassan168/items/91b15b5edba8718d6196

そこから公式の Issue に飛ぶと、解決策が書いてありました！

https://github.com/rancher-sandbox/rancher-desktop/issues/995#issuecomment-1036165778

まず、 WSL のディストリビューション一覧を確認してみます

```powershell
> wsl -l
Linux 用 Windows サブシステム ディストリビューション:
dev (既定)
rancher-desktop-data
rancher-desktop
elixir
```

dev と elixir は個人的に作ったものですが、身に覚えのないものが二つ

- rancher-desktop-data
- rancher-desktop

どう見ても、 Rancher Desktop が作ったものたちです

では `rancher-desktop` に入ってみましょう

```powershell
wsl -d rancher-desktop
```

そして、 `/etc/rc.conf` に以下を追記します

```bash
rc_env_allow="http_proxy http_proxy no_proxy"
export http_proxy="http://<プロキシサーバー名>:<ポート番号>/"
export https_proxy="http://<プロキシサーバー名>:<ポート番号>/"
```

追記後、 `exit` で WSL から抜けて Windows を再起動すると、


```powershell
> docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
...
Hello from Docker!
...
```

hello-world が動きました！

## Kubernetes はエラー

ただし、 Kubernetes はこれだけではエラーになります

![k8s-error.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/9462a99b-b4b4-1335-23bd-acb39072123f.png)

Kubernetes を使う予定がないのであれば `Enable Kubernetes` を OFF にしてしまいましょう

![k8s-unchecked.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/14c3c787-c134-02d9-455d-1d07f03cb174.png)

エラーは発生しなくなります

Docker だけを使うのであれば、そもそも OFF にした方が良いです

Windows で Kubernetes を使う場合は、、、

とりあえず私にその予定がないので、後進に道を譲ります

## おわりに

これで Docker Desktop 有償化前の快適環境に戻りました！

開発が捗りますね！
GoogleMapAPIを使って、Webページに地図を表示する

# Google Map APIを使って、Webページにマップを表示させる方法

GoogleMapAPIを利用することで、Google Mapの機能をウェブサイトやアプリに埋め込むことができます。
Maps SDK for AndroidやMaps SDK for IOSといったように端末に応じたAPIがありますが、本記事では、Webアプリ用のMaps JavaScript APIを対象とします。

## 1. GoogleMapAPIKeyの取得
Google Maps APIはGoogle Maps API Keyが必須になります。
Keyの取得方法は他の方が纏めた記事があったので、そちらの方をご参照ください。

## 2. GoogleMapAPIの読み込み
Mapを表示させるために、JavaScriptファイルをHTMLで読み込みます。
方法は2つあり、後者の方を多用していました。

###  2-1. HTMLに直接記述する
「YOUR_API_KEY」に1で取得したKeyをコピペし、ブラウザで表示させるとマップが表示されます。
```index.html
<!DOCTYPE html>
<html>
  <head>
    <title>Simple Map</title>
    <script src="https://polyfill.io/v3/polyfill.min.js?features=default"></script>
    <link rel="stylesheet" type="text/css" href="./style.css" />
    <script src="./index.js"></script>
  </head>
  <body>
    <div id="map"></div>

    <!-- Async script executes immediately and must be after any DOM elements used in callback. -->
    <script
      src="https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY&callback=initMap"
    ></script>
  </body>
</html>
```

###  2-2. JavaScript上で動的に読み込む
「YOUR_API_KEY」に1で取得したKeyをコピペし、ブラウザで表示させるとマップが表示されます。
こちらを採用することで、サーバー側からKeyを取得することが可能になります。
データベース、azure key vaultといった環境に応じたKeyを設定することが可能になります。
callback=””でJavaScriptを読み込んだ後に任意の関数（後述する中心座標の設定や、マップのオプションの設定）を実行することができます。
※下記はJQueryを利用したコードですので、JQueryも必要になります。
```index.js
function setMap() {
    $("<script>", {
        'src': 'https://maps.google.com/maps/api/js?key= ' + YOUR_API_KEY + '&callback=initMap'
    }).prependTo('Body');
};
```

## 3. MAPの中心座標やその他オプションを設定する
緯度、経度をフロント側へ渡して、この関数を実行することで、任意の地点をマップの中心として表示させることができます。
その他、Google Mapの画面右下にあるアイコンも表示、非表示切り替えができます。
この関数は、GoogleMapAPIのJavaScriptを読み込んだ後に実行する必要があるので、その点は注意が必要です。
```index.js
function initMap() {
  var latLng = new google.maps.LatLng(緯度, 経度);
  var Options = {
    zoom: 21,               // 地図の縮尺値
    center: latLng,         // 地図の中心座標
    mapTypeId: 'hybrid',    // 地図の種類
    rotateControl: false,   // 回転・傾き有無
    tilt: 0,                // 航空地図にした時の、視点の傾きの角度
    scrollwheel: false,     // スクロール制御
    streetViewControl: false// ストリートビュー表示有無
  };
  MapObject = new google.maps.Map(document.getElementById('map'), Options);
}
```

## 4. MAPにアイコンを表示させる
google.maps.Markerに位置情報と表示するMAPオブジェクトを渡すことで画面上にアイコンを表示することができます。
この関数を繰り返し実行することで、任意の数のアイコンをマップ上に描画することができます。（1万件オーダーならば処理速度は気になりませんでした。）
```index.js
function setIcon() {
  var iconLatLng = new google.maps.LatLng(緯度, 経度);
  new google.maps.Marker({
    position: iconLatLng,
    map: MapObject,
  });
}
```

## まとめ
Maps JavaScript APIを利用することで、マップを使ったサービスを容易に構築することができます。
（例：従業員の位置情報把握、駐車場の空き情報確認、圃場の管理）
MAPにアイコンの表示以外にも、アイコン追加と削除、アイコンへのイベント（マウスオーバーやクリックイベント）付与、MAP上へポリゴン描画と削除等、フロント側で実装することが可能です。
データベースには緯度、経度の他にGeometry型のデータを格納しておくことで、距離を算出することができるようになります。

## 参考資料
GoogleMapAPIKeyの取得
https://tcd-theme.com/2018/08/google-maps-platform-api.html
公式ドキュメント
https://developers.google.com/maps/documentation/javascript/overview#maps_map_simple-html
テーブルを作成したときのコマンドを確認する　SHOW CREATE TABLE

## 用途
既にあるテーブルを作成した際のコマンドを確認したい時に使う。
SQL文を真似したいときなど、このコマンドを使うことで、以前にテーブルを作成した際のSQL文が観れるので参考になる。

## 使用方法
```
SHOW CREATE TABLE テーブル名;
```
見たいテーブル名を指定するだけ。

### 結果
```
| テーブル名 | CREATE TABLE テーブル名 (
id int(10) unsigned NOT NULL AUTO_INCREMENT,
hoge_id int(10) unsigned NOT NULL,
hoge text,
created datetime DEFAULT NULL,
updated timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (id),
UNIQUE (hoge_id, hoge)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='ここにはコメントが表示されます。'
```
これはあくまでも例です。
このSQLの意味などはこちらにまとめてあります。
https://qiita.com/marukome/items/1e359bdc2a91f52bf875
GitHubからアクセストークンの有効期限切れメールが届いた際の対策方法

## 概要
「[GitHub] Your personal access token has expired」 というタイトルのメールがGitHubから送られてきた。
既に多くの記事で対策方法が記載されているが、自分の備忘録のため記載する。

## アクセストークン発行

GitHubにアクセスして、右上の自身のアイコンをクリックし、「Settings」ボンタンをクリックする。
![スクリーンショット 2022-05-09 110445.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1229062/82980a65-e034-8be5-8f93-529dc0755719.png)

「Developer settings」ボタンをクリックする。

![スクリーンショット 2022-05-09 110525.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1229062/20001bb6-eb72-fa8f-c6a0-7a9ef5b09e94.png)

「Personal access tokens」ボタンをクリックし、「Generate new token」ボタンをクリック。

![スクリーンショット 2022-05-09 110601.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1229062/89590703-f87c-69d5-8b1a-8d6ba0dc3fab.png)

下記画面に遷移するので任意の設定をしてアクセストークンを発行する。
![スクリーンショット 2022-05-09 111954.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1229062/af744656-b808-88a5-4972-534de7830168.png)

## config ファイル変更
必要に応じて設定ファイルの変更を行う。
発行したアクセストークンの情報をgitのconfigファイルに記載する。
```vim
> git config --global --edit

// ローカルの場合
git config --local --edit

[url "https://[発行したアクセストークン]:x-oauth-basic@github.com/"]
    insteadOf = https://github.com/
```

上記設定により、下記URLを含むコマンドを叩く際にアクセストークンの情報が追加されるようになる。

```
https://github.com/
```

下記の様に変換される。
```
https://[発行したアクセストークン]:x-oauth-basic@github.com/
```
Node.jsのバージョンが元に戻る事象のトラブルシュート

## 環境
Ubuntu 20.4

## はじめに
自分の環境に入っているNode.jsのバージョンは、v10.19.0（system）とv16.14.0の２種類。systemとなっているバージョンは、aptでインストールしているはず。そして、v16.14.0は、nvmでインストールしているはずです。

nvmを使って、Node.jsのバージョンをv16.14.0に上げたのだが、OSに再度ログインし直すと、必ず、元のバージョンであるv10.19.0（system）に戻ってしまう現象が発生しているため、そのトラブルシューティングの記事。

## やったこと
OS起動直後のNode.jsのバージョンです。
```
$node -v
v10.19.0
```

バージョンをv16.14に変更しました。
```
$node use v16.14
$node -v
v16.14.0
```

しかし、この後、OSにログインし直すと、Node.jsのバージョンがv10.19に戻ってしまいます。原因は、defaultのエイリアスの設定ができていないことでした。
```
$ nvm ls
->     v16.14.0
         system
default -> lts/* (-> N/A)
```

defaultのエイリアス設定を、v16.14のバージョンに設定します。
```
$nvm alias default 16.14.0
```

defaultのエイリアスの設定がv16.14に設定されました。
```
$ nvm ls
->     v16.14.0
         system
default -> 16.14.0 (-> v16.14.0)
```
この後、OSに再ログインしても、バージョンが元に戻ることはなくりました。
SQL　CREATE TABLE　テーブル作成したので、メモとして残しておきます

## CREATE TABLEでテーブル作成したので、メモとして残しておきます

自分が使ったSQL文
```
CREATE TABLE hoge_table (
id int(10) unsigned NOT NULL AUTO_INCREMENT,
hoge_id int(10) unsigned NOT NULL,
hoge text,
created datetime DEFAULT NULL,
updated timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (id),
UNIQUE (hoge_id, hoge)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 comment='ほげほげ';
```

### 文法
```
CREATE TABLE テーブル名 (
カラムの名前① データ型 オプション,
カラムの名前② データ型 オプション,
オプション
) データベースやコメント設定;
```

### 使った用語などの説明
`unsigned`
正の数のみ格納するようにするオプション。
intの場合、通常は-2147483648～2147483647までの数字を格納できるが、`unsigned` することで、0～4294967295まで格納できるようになる。

`NOT NULL`
NULL が格納できなくなるオプション。
NULL を記述すると NULL を格納できるようになる。
指定しなかった場合、デフォルトでは NULL が格納できるようになる。

`AUTO_INCREMENT`
データを追加した時にカラムに対して現在格納されている最大の数値に 1 を追加した数値を自動で格納するオプション。
注意点は以下の通り。
- 整数または浮動小数点数のデータ型が設定されているカラムに対して設定できる。
- AUTO_INCREMENT はテーブルごとに 1 つのカラムにしか設定できない。
- AUTO_INCREMENT が設定されたカラムにはインデックスが設定されている必要がある。
（インデックスを自動的に作成する PRIMARY KEY や UNIQUE で設定してもOK）
- AUTO_INCREMENT が設定されたカラムには DEFAULT 制約は設定できない。
- AUTO_INCREMENT が設定されたカラムに正の数値を格納した場合だけ正しく動作する。

`DEFAULT`
DEFAULT 制約をつけることができるオプション。
このオプションを設定したカラムに対して値を指定しなかった場合にデフォルトの値が格納される。
今回の場合は DEFAULT NULL としているので、デフォルトでは NULL が格納される。

`DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP`
デフォルト値が現在のタイムスタンプになり、現在のタイムスタンプに自動的に更新される。
このカラムは更新のタイムスタンプを格納するカラムなので、更新した際のタイムスタンプが更新されていることになる。

`PRIMARY KEY `
このオプションで指定したカラムは、重複する値は格納できなくなる。
NULL も格納することができない。
なので、PRIMARY KEY が設定されたカラムの値を検索することで、そのテーブル内で1つのデータを特定できる。

`UNIQUE `
指定したカラムが重複する値は格納できなくなる。
複数のカラムを指定していたら、指定したカラム全ての値が重複する値が格納できなくなるということ。

`ENGINE`
データベースを指定する。
デフォルトでは、InnoDBなので、今回の場合は必要なかった。

`DEFAULT CHARSET `
テーブル全体に文字コードを指定するオプション。

`comment`
コメントを設定できるオプション。
このテーブルがなんのテーブルなのかなどの、メモにもなる。

---------------------
以下のサイトを参考にしました。
- https://www.dbonline.jp/mysql/table/index7.html
pipに代わりpip2をインストール

最新のKali Linuxではpipがpython3用に使われてしまう。

そこで改めてpip2をインストールする。

```
wget https://bootstrap.pypa.io/pip/2.7/get-pip.py
python get-pip.py
```

これでよし
![pips.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2659122/95e4df5f-db9a-6f81-ba4c-cd255694db39.png)
無料で使えるOpenShift@IBM cloud

以前書いた無料で使える OpenShift(https://qiita.com/osonoi/items/a5d3a5fe78455c842f42)ですがサイトが変わったようなのでもう一度書きます。
ウェブサイトのアドレスは
https://developer.ibm.com/openlabs/openshift
(注：2022年5月12日の現状ではアクセスがIBM社員だけに限定されているようです）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59741/282c17e7-3d7e-65df-26a8-06c972885513.png)

　ご覧になってわかるようにこのサイトは基本的にはチュートリアルで学習するサイトになっています。
ただ自分のアプリをデプロイすることもできて下にスクロールすると以下のようなメニューが出てきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59741/c8419db4-ef95-ba94-cdd9-3a4219861cf6.png)
ここで　"Launch Lab"　をクリックします。
次にIBM IDでログインしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59741/899d684b-e62e-a86c-8a23-03943cf5041d.png)
少し待っていると以下のように準備が始まります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59741/1dbbabc2-fa83-92c3-00f3-f760e670d400.png)
数分待つと以下のようにOpenShiftの画面が現れ使えるようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59741/af3a0995-90b5-5b9b-55e7-9658f81f29df.png)
コマンドラインのインターフェースは上記右側のように出てきておりますがwebのインターフェースは左側のメニューから"Exercize 1"の"RedHat OpenShift on IBM Cloud Basics"の中の "3 Next, explore the OpenShift web console."を選択すると
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59741/317552d0-87e9-976d-e314-7a88d32112f6.png)
アクセスすることができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59741/c3f7553d-dabc-7201-ad19-65c5963d5e9b.png)
Kali LinuxにDockerをインストールする方法

# まずはDockerのインストール


まずcurlやgnupg2などの事前に必要となるものをインストールします（docker-composeのインストールは後半で）。

```
sudo apt -y install curl gnupg2 apt-transport-https software-properties-common ca-certificates 
```

次にDockerのGPGキーをインポート：

```
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/docker-archive-keyring.gpg
```

（gpgキーはセキュリティ関連のものです）

次にDockerのリポジトリをKaliに追加：

```
echo "deb [arch=amd64] https://download.docker.com/linux/debian buster stable" | sudo tee  /etc/apt/sources.list.d/docker.list
```

このコマンドでリポジトリのURLをKali中の`/etc/apt/sources.list.d/docker.list`に追加してくれる。

ここで一旦アップデートしておきます：

```
sudo apt update
```

そしたら次のコマンドを走らせる：
```
sudo apt install docker-ce docker-ce-cli containerd.io
```
（Do you want to continue?はYesと答える。）

これらのインストールにより、”docker”というグループが新しく作られるから、自身のユーザーアカウントをそのグループに追加しておく：

```
sudo usermod -aG docker $USER
newgrp docker
```

こうすることでDockerを実行する際に一々`sudo`をつける必要がなくなる。

あとは`docker version`と打ち込んでインストールされてるはずのDocker情報が出るか確認。

# docker-composeをKaliに入れる

次のコマンドを一気に、そのままターミナル上にコピペして実行する：

```
curl -s https://api.github.com/repos/docker/compose/releases/latest | grep browser_download_url  | grep docker-compose-linux-x86_64 | cut -d '"' -f 4 | wget -qi -
```
上記のコマンドにより取得された実行ファイルに実行権限を与える：

```
chmod +x docker-compose-linux-x86_64
```

PATHに追加する：

```
sudo mv docker-compose-Linux-x86_64 /usr/local/bin/docker-compose
```

docker-composeのバージョンを確認して完了：

```
$ docker-compose version
```

参考：

https://computingforgeeks.com/install-docker-and-docker-compose-on-kali-linux/

https://computingforgeeks.com/how-to-install-latest-docker-compose-on-linux/
namespaceの使い方を確認してみた

2022.5.10 10日目　

## やること
今回はnamespaceに関してどうやって使用するのかを確認していきます。
こういうときにしかしっかり調べなさそうなのでやっていきます。


## きっかけ
そもそもnamespaceは、チームで制作しているゲームのコードによくみられる印象があります。
今回、社内で使用しているプログラムコードにnamespaceが使用されていて調べてみる事にしました。

## 参考資料
https://www.fenet.jp/dotnet/column/language/c-sharp/9710/



## namespaceってなんぞや
namespaceとは、日本語では名前空間といい、関連するクラスを整理するための名前付けのスキームのことです。
（スキームとは、体系的な計画、計画をともなう枠組み、基本的な仕組みのことだそうです）

名前空間を定義するために「namespace」を使います。
namespaceの｛｝で囲った中でクラスを定義することで、クラスが名前空間に属することになります。

「関連のあるものでまとめる」仕組みこそが名前空間であり、そのような意味合いでもクラスを名前空間で階層化して管理します。

↓サンプルコード
```C#
namespace School {

    namespace Student {

        class Profile {
        }

        class Activities {

        }

        namespace Subject {
            class Test {
            }

            class Rating {
            }
        }
    }
}
```
このサンプルコードは以下のように書き換える事も出来ます。
```C#
namespace School.Student {

    class Profile {
    }

    class Activities {
    }
}

namespace School.Student.Subject {

    class Test {
    }

    class Rating {
    }
}

```

## namespaceで定義したクラスを使用する方法

```C#
using School.Student;
using School.Student.Subject;
```
using で名前空間を定義します。（しなくても使用することはできますが、コードの量が増えるので、最初に定義しておいた方が便利です）

```C#
Profile profile = new Profile();
Activities activities = new Activities();
testc test = new test();
Rating image = new Rating();
```
内容を呼び出すときは、上のコードのように呼び出します。

終わりです。
react-router-dom v6 + Storybookでページ間のStateを取得する

## 前提
- 以下のように前のページからStateをもらって動作するようなページのStorybookの作り方です。
```react
import React, { useEffect, useState } from 'react'

const page: React.FC = () => {
  const [title, setTitle] = useState<string>()

  const location = useLocation()
  useEffect(() => {
    setTitle(location.state as string)
  }, [])

  return (
    <div>
      {title && <h1>{title}</h1>}
    </div>
  )
}
export default page
```

### Storybook
- 遷移元（Dummy）を用意する
- `useNavigate`を使って遷移させる（`state`を使う）
- 遷移元（Dummy）のパスは`/`にする

```react
import React, { useEffect } from 'react'
import { MemoryRouter, Route, Routes, useNavigate } from 'react-router-dom'

import Page from './page'

const Dummy: React.FC = () => {
  const navigate = useNavigate()
  useEffect(() => {
    navigate('/a', { state: 'ダミータイトル' })
  }, [])

  return (
    <div>HOME</div>
  )
}


const template: Page = () => {
  return (
    <MemoryRouter>
      <Routes>
        <Route path="/" element={<Dummy />} />
        <Route path="/a" element={<Page />} />
      </Routes>
    </MemoryRouter>
  )
}

export const normal = template.bind({})
normal.storyName = 'Default'

```
GoogleColabでImageJを動かそう

# あらまし

使いやすい画像処理環境は、画像処理のアルゴリズム実装のときに役立ちます。
私は、GoogleColabがJavaを動かすことができることは知っていましたが、外部ライブラリを利用できることは知りませんでした。
この記事は、私が普段から使っているImageJをColabで動かす手順の記録です。

# ColabNotebookを編集する

Colabノートブックはデフォルトのプログラミング言語のカーネルがpythonになっています。  
これを、javaに変更します。  
方法は、kernelspecのpythonの箇所をjavaに置き換えるだけです。  
置き換えると、このような状態になります。  

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379410/368a1efb-2051-cce1-b31e-9620158c3776.png)

編集の方法は、まず、GoogleDriveに新しいColabノートブックを作り、空のまま、「.ipynb」でダウンロードします。  
適当なテキストエディタでダウンロードしたノートブックを開き、上述の箇所を編集します。  
編集し終えたら、再度、GoogleDriveへアップロードし、Colabで開きます。  

# JavaとIJavaをインストール

次に、OpenJDK8と、IJavaをインストールします。
ImageJはまだjava8で開発されているので、バージョンを合わせています。
IJavaは、ノートブックをJava仕様で動かすためのツールです。

以下のコードセルを追加して、実行します。  
```
!apt update -q
!apt-get install -q openjdk-8-jdk-headless
!curl -L https://github.com/SpencerPark/IJava/releases/download/v1.3.0/ijava-1.3.0.zip -o ijava-kernel.zip
!unzip -q ijava-kernel.zip -d ijava-kernel && cd ijava-kernel && python3 install.py --sys-prefix
```

カーネルが無事に追加されると、カーネルリストにjavaが追加されます。
確認は以下のコマンドで可能です。
```
!jupyter kernelspec list
```

```
Available kernels:
  ir         /usr/local/share/jupyter/kernels/ir
  python3    /usr/local/share/jupyter/kernels/python3
  java       /usr/share/jupyter/kernels/java
```

# ホストされているランタイムに接続

ランタイムに再接続することで、Javaを有効にします。
（ランタイムの再起動ではJavaを有効にできません。）
ノートブック右上のRAM、ディスクの表示の右にある下向きの三角マークを選択して、「ホストされているランタイムに接続」を選択します。
数秒、ランタイムが再起動するまで待ちます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379410/d75e6376-02cb-ab72-af8f-34c3394146f5.png)

# Javaの動作確認

Hello javaを出力してみます。

```
// check running java
System.out.println("Hello java")
```

# ImageJを動かす

次に、ImageJをMavenを使って導入します。
ここでは、拡張性を考えて、POM形式で外部ライブラリを読み込む方法を示します。
以下のコードセルを実行します。
```
%%loadFromPOM
<repositories>
  <repository>
    <id>scijava.public</id>
    <url>https://maven.scijava.org/content/groups/public/</url>
  </repository>
</repositories>

<dependencies>
  <dependency>
    <groupId>net.imagej</groupId>
    <artifactId>ij</artifactId>
    <version>1.53r</version>
  </dependency>
</dependencies>
```

POMを用いなくとも、各ライブラリやリポジトリは、次のように一行で追加できます。
しかし、POMが確実です。
```
// add repositories
// %mavenRepo <ID> <URL>
// %mavenRepo scijava.public https://maven.scijava.org/content/groups/public/
// example of load dependensies
// %maven net.imagej:ij:1.53r
```

画像を表示したいときは、BufferedImageで返すようにします。
（DICOMは非圧縮（JPEG形式のDICOMはNG）でなければ読み込めないので注意してください）

```
ImagePlus sampleCT = new ImagePlus("https://imagej.nih.gov/ij/images/ct2.dcm");
sampleCT.getBufferedImage();
```

画像フィルタリング、画像のリサイズ、保存、しきい値処理、ROI、など処理できます。
ちょっと楽しみが増えました。

# コメント募集

ImageJでこのような処理をしたい！など、難しいものでなければリクエストにお答え致します。お気軽にコメントください。

# サンプルノートブック

https://drive.google.com/file/d/1Ds2Xz6Fo-toA70h7OM93xz3FWw911Epb/view?usp=sharing

# References
- Prepare Java Kernel for Google Colab: https://colab.research.google.com/gist/tueda/a200b3f747d0fc864be8b4dd09be5a1e/java-colab.ipynb
- How to write JAVA in Google Colab: https://youtu.be/VHlSICjZRPs
- IJava Magics to work with maven: https://github.com/SpencerPark/IJava/blob/master/docs/magics.md

Visionary Imaging Services, Inc. 2022/05/11
【Git】任意のGitHubリポジトリでプロキシを利用する【簡単設定】

# 任意のGitHubリポジトリでプロキシを利用する設定

以下のコマンドを実行します。
`GitHubリポジトリの組織名`は`https://github.com/usuba/sample`というGitHubリポジトリであれば`usuba`を指定してください。

```
git config --global http.https://github.com/[GitHubリポジトリの組織名]/.proxy http://[プロキシのドメインかIPアドレス]:[プロキシのポート]
git config --global https.https://github.com/[GitHubリポジトリの組織名]/.proxy https://[プロキシのドメインかIPアドレス]:[プロキシのポート]
git config --global url.https://github.com/[GitHubリポジトリの組織名]/.insteadOf git@github.com:[GitHubリポジトリの組織名]/
```
[swift]SourceTreeでのGitflow

# はじめに

SourceTreeでgitを運用する際の備忘録です。

# Gitflowとは？

「A successful Git branching model」というワークフローが元になっているそうです。

https://nvie.com/posts/a-successful-git-branching-model/

大規模な開発をうまく運用していく為のフローですね。

# ブランチの種類

![at-it-git-15-001.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1112697/cc1a2328-7b66-ce18-4299-68b0eefaae0e.jpeg)

## メインブランチ

以下の２つは常に存在しています。

### ・master　
リリース済みのソースコードを管理する

### ・develop
開発中のソースコードを管理する


## サポートブランチ

タスクに合わせて、下記ブランチを切って進めていきます。

### ・feature
機能実装やバグ修正などの開発作業を行う

### ・release
リリース準備作業を行う

### ・hotfix
緊急の修正作業を行う


# SourceTree

![スクリーンショット 2022-05-05 12.16.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1112697/4ae9bd6d-ebab-9ab0-bdff-fe2997a8849c.png)

mainからdevelopを切り、さらにfeatureを切る

![スクリーンショット 2022-05-05 12.58.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1112697/f7b18637-43bf-b697-6c54-dadfb90e231d.png)

※feature/名前　とブランチ名を入れれば自動的にファイリングされる


featureをdevelopにマージしていく

# おわりに

まだ実践的なGitflowは経験していないので、チュートリアルで試しつつ徐々に慣れていきたいです。
経営者目線を持ったエンジニアになるために

# 経営会議出席ワイ　〜その1〜

経営陣「時にはリスキーな判断も必要だが」
経営陣「**早期**に**リターン**を得ることも重要だ」

ワイ「早期のリターンが重要、と」
ワイ「メモメモ・・・」

## その後、開発チームにて

ワイ「コラッ！」
ワイ「この関数、早期`return`してないやないか！」

後輩くん「すみません、やめ太郎先輩！」

ワイ「あれ、こっちの関数もや」
ワイ「他にも、ここも早期`return`してないやんけ！！！」
ワイ「全部書き直しや！」

後輩くん「お言葉ですが・・・」
後輩くん「**納期が今日まで**なので、一旦このままで・・・」

ワイ「アカン！」
ワイ「早期の`return`が重要なんや！」
ワイ「ぜんぶ修正してもらうで！」
ワイ「**どれだけ時間とコストが掛かっても**、早期`return`を徹底するんや！」

後輩くん「ハイッ！！！」

## 経営陣の言いたかった「リターン」

- 「利益」のこと

## 早期`return`について
早期`return`をすると、コードレビューの時に、

> 「おっ、このケースの場合は、ここで早期`return`してるから」
> 「以降のコードは一旦読まなくていいいな！」

という効果があり、コードがリーダブルになるため、レビューがしやすくなります。

`if`文のネストも減るので、可読性も上がると思います。

積極的にやって行きましょう。


# 経営会議出席ワイ　〜その2〜

経営陣「我が社は今後、活動の**スコープ**を**グローバル**に拡大していく必要がある」

ワイ「スコープをグローバルに、と」
ワイ「メモメモ・・・」

## その後、開発チームにて

ワイ「コラッ！」
ワイ「関数の中で変数を定義すな！」
ワイ「スコープが狭い！」
ワイ「全部**グローバル変数**にするんや！」

後輩くん「え！そうなんですか・・・？」

ワイ「せや！」
ワイ「経営者目線を持ってくれんと！」

後輩くん「ハイッ！！！」

## 経営陣の言いたかった「スコープ」と「グローバル」

- スコープ
  - 活動の「範囲」や「領域」のこと
- グローバル
  - 「世界規模」という意味

## グローバルスコープの変数について
グローバルスコープの変数を定義して、色んな所から書き換えたりすると、どこで何をしてるんだか訳が分からなくなります。
気をつけましょう。

# 経営会議出席ワイ　〜その3〜

経営陣「一人一人が会社に**大きくコミット**することが大切だ」

ワイ「大きくコミット、と」
ワイ「メモメモ・・・」

## その後、開発チームにて

ワイ「コラッ！」
ワイ「なんやその細かいコミットは！」
ワイ「しゃらくせぇ！」
ワイ「もっとデカい`commit`してくれや！」
ワイ「クソデカ`commit`上等やで！」

後輩くん「え！いいんですか・・・？」

ワイ「せや！」
ワイ「`機能追加`の`commit`と一緒に」
ワイ「`500ファイルのタイポ修正`とかも`commit`するのがオススメや！」

後輩くん「ハイッ！！！」

## 経営陣の言いたかった「コミット」

- 「結果を約束する」「積極的に関わる」という意味

## `commit`の粒度について
`機能追加`と一緒に`500ファイルのタイポ修正`がコミットされていたら、コードレビューがめっちゃ辛いです。
分けましょう。

# 経営会議出席ワイ　〜その4〜

経営陣「可能な限り**コスト**を削減して行きたい」

ワイ「costを削減、と」
ワイ「メモメモ・・・」

## その後、開発チームにて

ワイ「コラッ！」
ワイ「`const`を使って変数を定義すな！」
ワイ「`const`削減や！」

後輩くん「え、じゃあどうすれば・・・」

ワイ「全部`var`で変数定義するんや！」
ワイ「それが経営者目線のJavaScriptや！」

後輩くん「ハイッ！！！」

## 経営陣の言いたかった「コスト」

- 「費用」のこと

## JavaScriptの変数定義について
可能な限り`const`を使いましょう。

`var`や`let`は**再代入**ができるため、

> 「コードの行によって変数の中身が変わるから、レビューが辛いな・・・」

・・・となる恐れがあります。

どうしても再代入が必要な場合のみ`let`を使いましょう。
`var`は使わないようにしましょう。

# まとめ
エンジニアとそれ以外の職種だと、用語の意味が違ったりします。
齟齬の無いようにコミュニケーションして行きたいです。


# 新しい記事も読んでみてくださいやで

- [「なんのために作るか分からへん」と愚痴っていたらPMさんが救ってくれた話](https://qiita.com/Yametaro/items/46e31a9aa6257eb900ae)


# Twitterもフォローお願いしますやで
https://twitter.com/Yametaro1983/status/1522793792856014848?s=20&t=Uy6CwxbduhZ0dAtBaETSOw
AWS公式資料で挑むMLS認定(6)-Amazon AIサービスの全体像

##### [前回] [AWS公式資料で挑むMLS認定(5)-機械学習手法のまとめと比較](https://qiita.com/mingchun_zhao/items/91cc59f69860f12e7638)

## はじめに

今回から、Amazon AIサービスの勉強です。
まずは、Amazon AIサービスの全体像から。

## 勉強に使用する教材

下記AWS公式ドキュメントを参照しながら進めます。

- AWS Black Belt Online Seminar
- ユーザーガイド
- デベロッパーガイド
- チュートリアル
- よくある質問
- AWSナレッジセンター
- APIリファレンス

## Amazon AIサービスの概要

- AWSの事前トレーニング済みAIサービスは、アプリケーションやワークフローですぐ使えるインテリジェンスを提供
- AWSのAIサービスをアプリケーションと簡単に統合できる
- Amazon.comおよびAmazon社のMLサービスと同様の深層学習技術を使用
- ビジネスメリット
    - 継続的な学習によりAPIの品質と精度が得られる
    - パーソナライズされたレコメンデーション
    - コンタクトセンターの最新化
    - 安全性とセキュリティの改善
    - カスタマーエンゲージメントの向上

## ユースケースから見る、Amazon AIサービスの分類

- 高度なテキスト分析
    - 自然言語処理を使用し、非構造化テキストからインサイトと関係性を抽出
    - サービス例: Amazon Comprehend
- コードレビュー自動化
    - コードレビューを自動化し、負荷の大きいコード行を特定(すごい、どう特定するかな)
    - サービス例: Amazon CodeGuru
- Chatbot
    - 対話型エージェントを簡単構築、顧客サービス向上とコンタクトセンター効率改善を実現
    - サービス例: Amazon Lex
- 需要予測
    - Amazon.comで使用されている機械学習予測技術に基づき、正確な予測モデルを構築
    - サービス例: Amazon Forecast
- ドキュメント分析
    - テキストとデータを大量ドキュメントから短時間で自動抽出し、手作業軽減
    - サービス例: Amazon Textract
- エンタープライズ検索
    - アプリに自然言語検索機能を追加し、必要な情報を簡単に見つける
    - サービス例: Amazon Kendra
- 不正防止
    - Amazon.comで使用されている技術を用いて、不正アクティビティを識別
    - サービス例: Amazon Fraud Detector
- 画像と動画の分析
    - 画像と動画の分析によるアセット一覧化、メディアワークフローの自動化と意味抽出
    - サービス例: Amazon Rekognition
- パーソナライズされたレコメンデーション
    - Amazon.comで長年かけて完成した機械学習技術を使用し、顧客エクスペリエンスをパーソナライズ
    - サービス例: Amazon Personalize
- リアルタイム翻訳
    - 効率的かつ費用対効果の高い翻訳によって、多言語で相手にアプローチ可能
    - サービス例: Amazon Translate
- テキスト読み上げ
    - 文章をリアルな音声に変換し、アプリケーションに声を与える
    - サービス例: Amazon Polly
- 文字起こし
    - 高品質な音声のテキスト変換機能を、アプリケーションやワークフローに簡単に追加
    - サービス例: Amazon Transcribe

※ 引用元: [AWS AIサービスについて知る](https://aws.amazon.com/jp/machine-learning/ai-services/)

## レイヤーから見る、Amazon AIサービスの分類

- AIサービス
    - Amazon Recognition
    - Amazon Polly
    - Amazon Lex
- AIプラットフォーム
    - Amazon ML
    - Amazon EMR
    - Apache Spark
    - SparkML Serving
    - Amazon Kinesis
    - AWS Batch
    - Amazon ECS
- AIフレームワーク
    - Apache MXNet
    - TensorFlow
    - Cafe
    - Theano
    - Pytorch
    - CNTK
- AIインフラストラクチャ
    - GPU
    - CPU
    - IoT
    - Mobile

## おわりに

すぐにでも使ってみたいAIサービスが盛沢山でした。
次回から、試験対象サービスを一つずつ深掘りしていきます。
お楽しみに。

##### [次回] [AWS公式資料で挑むMLS認定(7)-Amazon Pollyの基本](https://qiita.com/mingchun_zhao/items/a3dcda37bdf3c8a2a2af)
HTTP通信を簡単にまとめてみた！

# はじめに
HTTP通信についてあまり自分自身が理解できていなかったので、簡単にまとめてみました。

# HTTP通信とは
ブラウザとサーバー間の通信を行うための通信規格のこと。
具体的に言うと、Qiitaのページをユーザーが見たいとする。
すると「ページ情報をちょうだい」とブラウザからサーバーに対して依頼を送る。
それに対して今度はサーバーからブラウザにリクエストされたサイト情報を送る。
この通信のやりとりをHTTP通信という。
![スクリーンショット 2022-05-10 23.26.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521366/db16b523-5f3c-58a5-6933-bb5ee3e04ffe.png)


## HTTPレスポンスの構成
* HTTPメソッド
GET、POSTなどのリクエスト方法が書いてある
* リクエストヘッダー
サーバーのソフトウェア&サーバー情報、データタイプ等が記述されている
* リクエストボディ
ブラウザがWebサーバーにデータを送りたい情報がある時に使用されます。

## HTTPリクエストの構成
* HTTPステータス
サーバーでの処理結果を表すもので、コードで状態を表す。
* レスポンスヘッダー
サーバーのソフトウェア&サーバー情報、データタイプ等が記述されている。
* レスポンスボディ
Webブラウザに送るHTMLや画像等のデータが記載されており、Webブラウザは
これらのデータを読み取り、表示しています。

## HTTPの確認方法
ここでは具体的にHTTPの中身を確認してみます。
確認方法はブラウザの検証ツールより確認ができます。
やり方は、下記のサイトを参考に開いてみてください。
https://my-terrace.com/chrome_http_res/

下記がHTTP通信の中身です。
この情報を見ればリクエストやレスポンスの中身を確認することができます。
![スクリーンショット 2022-05-10 23.56.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521366/9a9b64bc-a90f-dbf9-d4af-672df8cfa060.png)

## 参考サイト
https://viral-community.com/other-it/http-1873/
[https://www.web-knowledge-info.com/wp/web_basic_knowledge4/](https://www.web-knowledge-info.com/wp/web_basic_knowledge4/)
Leopardでもmpg123

コードを眺めていたらなんとPowerPCのSIMDなAltiVecのコードもあり、試しにMac Mini G4のMac OS X 10.5(Leopard)でもconfigureを実行してみたところ、ちゃんと通りmakeもできました。

CoreAudioのコードも入っているようです。

CPU負荷はだいたい20%くらいで大きいですが、WBGOなどが問題なく再生できます。

mpg123は開発が続いているにも関わらず10.5でもコンパイルできるのはすごいです。

Mac MiniにはWolfsonのDACなHUD-mx1がつながっていて、やっぱ音いいです。
Kali Linuxのキーリピート設定

- １回しかキーを押してないのに連続して文字がたくさん出てくる
- キーを一度しか押してないのに文字がダダっと出てくる

例えば、`msfconsole`と押したのに`msffffffconsooooooolllllllle`のように文字が連続して一気に出てくるやつです。

これはpcの動作が重いからとかではなく、**キーリピート (key repeat)** という設定の問題です。

以下ではKali Linuxでキーリピートを設定する方法について解説します。

# キーリピート設定

Kali Linuxのデスクトップ上で右クリックして

「Applications」 > 「Settings」 > 「Keyboard」

と進みます。
![key-repeat-scaled.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2659122/fc2d9b45-e42d-3a8d-4d02-b3f3b71fae11.jpeg)

キーボード設定画面にたどり着くと、Kali Linuxでは次の画面が出てきます：
![keyrepeat.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2659122/684fe64c-f0c7-389a-cad5-d6a84029fcb3.png)


１回しかキーを押してないのに連続して文字が出力される原因は、この**Enable key repeat**が有効になっているからです。

上の画像では既に外れてますが、この部分が有効になっていてチェックが入ってるならこのチェックをはずすだけで解決します。


これで解決するはずです。お疲れ様でした。