OmniAICreator/Qiita-1.07M huggingface dataset:
【基本情報技術者】システム構成

基本情報技術者試験の分野「システム構成」についてご紹介いたします。
## デュプレックスシステム
デュプレックスシステムは、**現用系**と**待機系**の2系統のシステムで構成され、**現用系**に障害が生じたときに、**待機系**に切り替えて処理を続行する形態です。
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2655909/74dfa00f-98f7-1dab-c93a-6becf36ac991.png)
デュプレックスシステムは、待機の状態により二つに大別できます。

**・ホットスタンバイ**
待機系を現用系と同一の業務システムを最初から起動しておき、**現用系の障害発生時に待機系に自動で速やかに切り替え処理を続行する形態**（「温かい状態で待機」という意味がある。）

**・コールドスタンバイ**
待機系は通常時バッチ処理（後辻※）などの他の処理を行っていて、**現象系に障害が発生したときにその処理を中断し、業務システムを起動して処理を続行する形態**
（「冷たい状態で待機」という意味がある。）
※バッチ処理とはデータを一定期間または一定量貯めてから、まとめて処理をする形態。
## デュアルシステム
デュアルシステムは、**一つの処理を2系統のシステムで独立に行い、結果を照合(クロスチェック）する形態**です。
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2655909/e4a1d509-fd89-29c9-91dc-de30ac578364.png)
## クラスタシステム
クラスタシステムは、複数のサーバをあたかも一台のサーバのように見せかける技術です。Clusterは、「ぶどうの房」という意味があり、サーバ一つ一つがぶら下がっているイメージです。

**・HAクラスタ**
可用性を高めることで、高信頼化を目的とするシステム構成。
**負荷分散型クラスタ**と**フェールオール型クラスタ**に大別される。
| 名前| 説明 |
|:-------:|:--------|
|負荷分散型|利用者からのリクエストに対する処理を各サーバに振り分けて負荷分散する。|
|フェールオール型|同じ機能の複数のサーバを現用系と予備系の二系統に分けて運用する。|

**・HPCクラスタ**
高性能化を目的とするシステム構成。複数のサーバの演算処理を連携させて高い演算能力を引き出すことができる。
## グリッドコンピューティング
グリッドコンピューティングは、**ネットワークを介して複数のコンピュータを連携させ、仮想的に1台の巨大で高性能なコンピュータを作る技術**です。処理能力に余裕のある数百台ものコンピュータを連携して並列処理させることで、スーパーコンピュータ並みのシステムを作りだすことができる。
データの整列

## データの整列
<b><font color = blue>整列</font>とは、ある規則に従いデータを並べ替えること。<font color = blue>ソート</font>ともいわれている。
小さなものから大きなものに並べ替える<font color = blue>昇順</font>、大きなものから小さなものに並べ替える<font color = blue>降順</font>がある。
## 代表的な整列法
### 基本交換法（バブルソート・隣接交換法）
<b>隣あうデータを比較し、逆順であれば入れ替える。
比較回数は<font color = blue>N(N-1)/2</font>
### 基本選択法
<b>データ列の最小値（最大値）を選択して入れ替え、次にそれを除いた部分の中から最小値（最大値）を選択して入れ替える。
比較回数は<font color = blue>N(N-1)/2</font>
### 基本挿入法
<b>既に整列済みのデータの正しい位置に、データを挿入する。
比較回数は<font color = blue>N(N-1)/2</font>だが、元の並び方次第でこれ以下になる。
## その他の整列法
### シェルソート（改良挿入法）
<b>ある一定間隔おきに取り出したデータから成るデータ列をそれぞれ整列する。
次に、間隔が1になるまで繰り返すのが<font color = blue>シェルソート</font>。
### クイックソート
<b>適当な基準値を決め、それより小さいグループと大きなグループに振り分ける。
### ヒープソート
<b>未整列の部分を順序木に構成し、その最大値（最小値）を取り出して、既整列の部分に移す。
こうして未整列部分を縮めていくもの。
Excel VBA(マクロ)で一部の文字色を変更するときはフォントを揃えたほうがいい

こんにちは、最近はVBA書いてたりするtoyohamaです。
しばらくWindowsでコーディングしていたので、Macの日本語切り替えで`1`を押してしまうクセに悩まされています……

## やりたかったこと

- 数万行、数十列のExcelシート(以下、`対象Excel`)がある
- 事前に発見したい文字列パターンが用意されている
- 対象Excelを上の行から順にチェックする
- マッチしたセルは背景色をつける
- マッチしたセルの該当文字列だけに色を付ける

### パターンマッチ例
`例えばなんだけどここ`がマッチさせたい文字列で、`なんだけど`はあってもなくてもいい、みたいなパターン
![image (15).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102801/c7c518b8-d5f5-1b82-40db-ce7a108b47f2.png)

### 期待する結果

![image (16).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102801/6a687922-45d2-8598-af37-c227bf60929f.png)

### サンプルマクロ

```vb
Sub tempMacro()
    '正規表現
    Dim reg As Object
    Set reg = CreateObject("VBScript.RegExp")
    
    With reg
        .Pattern = "例えば(なんだけど)*ここ"
        .IgnoreCase = True
        .Global = True
    End With
    
    Dim r As Integer, c As Integer
    c = 2       ' 今回はB列固定で
    For r = 2 To 10     '2行目から
        Dim cellStr As String
        cellStr = CStr(Cells(r, c))
        Dim sMatch, sMatches
        Set sMatches = reg.Execute(cellStr)
        For Each sMatch In sMatches
            'セルに色付け
            Cells(r, c).Interior.ColorIndex = 3
            
            'マッチした文字列だけ色をつける
            Dim sLen As Integer: sLen = Len(sMatch.Value)
            Dim sStart  As Integer: sStart = sMatch.FirstIndex + 1
            Cells(r, c).Characters(Start:=sStart, Length:=sLen).Font.ColorIndex = 4
        Next sMatch
    Next r
End Sub
```

当然これで期待する成果は得られましたが……

## マクロの動作が不安定になる

- うまくいく対象Excelとうまくいかない対象Excelがある(まあわかる)
- 同じ対象Excelでもエラーになったりならなかったりする(？)
- よくある、2回めの起動でうまくいかないというわけでもなく、1回目でも失敗したりしなかっりする(!?)
- 対象Excelを保存すると文字列データが壊れてしまう(!!?)
- PCのスペックに依存しているわけではない(2台で検証)

### 調査

`Characters`は256文字までしか扱えないとか、文字色変更はとても負荷がかかる処理だからコードをわける、みたいなことをやってもダメで、最終的に「対象エクセルを10行ずつ増やして、どこで壊れるかを検証」したところ、以下のようなことがわかりました。

- パターンマッチに依存して起こっているわけではない
    - 同じ文字列しかない対象エクセルでも起こった
    - 何十パターンあっても壊れないものは壊れない
- 行数が多くて起こっているわけでもない
    - 上記と同じく、サクッといくやつはいく
    - 10行でもだめな対象Excelもある

## うまくいかない対象Excelはフォントが混在していた

地道な検証の結果、フォントが混在している対象Excelはマクロの動作が遅く、終了したあとも不安定になり、保存すると壊れることが確認できました。

というわけで、対象Excelの全セルのフォントを揃えた結果、再起動せず何回マクロを起動しても安定して動作するようになりました。

```vb
    Cells.Font.Name = "ＭＳ ゴシック"
    Cells.Font.Size = 11
```
VBAでやりたければ、コードの冒頭にこんな感じで全セルのフォントを指定してやればOKです。
(フォントサイズは正直関係なさそうですが、見栄えのために)

## まとめ

そんなところで動作が安定しなくなるのかよ、という思いはなくもないですが、とりあえず解決してよかったです。
めちゃくちゃネットを漁ったけど、この動作については全く情報がなかったです。もし別の解決策があればアドバイスいただけると嬉しいです。
[Flutter]Firestoreから該当するフィールドのdocument IDを取得する方法

# 内容
FireStoreで特定のフィールドの値を含むドキュメントを探し
該当するドキュメントを全て取得または削除する方法について記載します。
![スクリーンショット 2022-05-06 12.35.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1631114/302a40c8-1255-5e31-d556-8b48dd8fbdcf.png)

イメージとしては
**community**フィールドが**shutアカデミー**のドキュメント全てを取り出すといった認識です。
# 方法
```
return FirebaseFirestore.instance
.collection('attendances')
.where('community', isEqualTo: 'shutアカデミー')
.get()
.then(
(QuerySnapshot snapshot) => {
snapshot.docs.forEach((f) {
print(f.reference.id);
}),
},
);
```
これを呼ぶだけで**2022年05月06日山田太郎**が取り出せます。
アカウント削除と同時にその人が持つデータ全て一括で削除したい場合などは
```
return FirebaseFirestore.instance
        .collection('attendances')
        .where('community', isEqualTo: 'shutアカデミー')
        .get()
        .then(
          // 取得したdocIDを使ってドキュメント削除
          (QuerySnapshot snapshot) => {
            snapshot.docs.forEach((f) {
              FirebaseFirestore.instance
                  .collection('attendances')
                  .doc(f.reference.id)
                  .delete();
            }),
          },
        );
```
これで該当する全てのドキュメントが一括で削除できるのでとても便利です。
# まとめ
Firestoreはデータ取得の時にwhereの有無などで取得の仕方が変わってしまうので、
自分と同じ状況の方に参考になってもらえたら幸いです。
駆け出しエンジニアのHTMLをレビューした際の指摘点

WEB開発やWEBデザインの情報の収集、発信を目的としてTwitterのアカウントを作ってから、駆け出しの方のコーディングに対してレビューを何件かさせていただきました。
何度かやっていると同じ指摘もあったので、今後のレビュー前にチェックしてもらいたい項目をここにまとめたいと思います。

## インデントは揃えましょう
HTMLはコードのインデントによるブラウザ表示への影響はありませんが、不規則になっていると可読性が損なわれ、ミスの記述ミスの原因となります。実際にインデントが揃っていないコードには閉じタグの記述漏れや、タグの入れ子の間違いなどがありました。
インデントは自分で揃えようとせずともコードエディターが自動で揃えてくれる機能や、コピペをすると自動で整形してくれるサービスもありますので、利用するといいでしょう。

**Visual Studio Codeの拡張機能 「Beautify」**
インストール：左メニューの「拡張機能」から「Beautify」を検索してインストール。
使い方：https://programming-engineer.com/vscode-beautify/

**HTMLのコード生成ツール Syncer**
https://lab.syncer.jp/Tool/HTML-PrettyPrint/

## scriptの読み込みはbody閉じタグ前に書きましょう
JavaScriptの外部参照ファイルやCDNからの読み込みをhead内に記述してしまうと、HTMLの構造を読み込む前に読み込まれてしまうため、ページを表示するまでにかかる時間が長くなってしまいます。
Googleのタグマネージャーや、アクセス解析のトラッキングコードなど、読み込む位置を指定されていないものについては`</body>`タグの直前で読み込むようにしましょう。

こちらの図解がとてもわかりやすかったので紹介しておきます。
https://webukatu.com/wordpress/blog/39711/

## レンダリング最適化のためにclassをつけましょう
CSSを記述する際に、class名をつけていないものに要素セレクターを使ってしまうと、　ブラウザのレンダリングが遅くなることがあります。HTMLタグにはなるべくclassをつけましょう。
参考：https://qiita.com/Yametaro/items/5c2d0267156ecc8562e4

## classや画像ファイルの名前に連番を入れるのはやめましょう
連番による命名は変更する際のメンテナンス性に欠けます。

**例**
下記のような`li`が連番になっている記述があったとします。
```
<ul class="itemList">
  <li class="item01"><img src="img/001.jpg" alt="画像１"></li>
  <li class="item02"><img src="img/002.jpg" alt="画像2"></li>
  <li class="item03"><img src="img/003.jpg" alt="画像3"></li>
</ul>
```
この記述に新しい画像をもらい、１と2番目の間に`li`を足すとなるとどうでしょう？
```
<ul class="itemList">
  <li class="item01"><img src="img/001.jpg" alt="画像１"></li>
  <li class="item02"><img src="img/002.jpg" alt="画像2"></li>
  <li class="item02"><img src="img/002.jpg" alt="画像2"></li>
  <li class="item03"><img src="img/003.jpg" alt="画像3"></li>
</ul>
```
のように２が重なってしまうため、可読性を維持するにはもとの2、3は3、4と変更する必要が出てきてしまいます。連番は降らずともCSSには擬似セレクタの`nth-of-type`で順番は指定できるので連番の記述は不要です。`li`ごとに順番以外の理由で固有のclassを付けるのであれば下記のような記述が良いと思います。
```
<ul class="itemList">
  <li class="item item__about"><img src="img/about.jpg" alt="about"></li>
  <li class="item item__works"><img src="img/works.jpg" alt="works"></li>
  <li class="item item__contact"><img src="img/contact.jpg" alt="contact"></li>
</li>
```

## HTMLエラーチェッカーで確認しましょう
HTMLの記述に慣れている人でもミスはつきものであり、ミスがあっても正常に表示されてしまうこともあるため、HTML構文のミスは見逃されてしまうことがよくあります。また、CSSがうまく反映されないときにもHTML構文が原因のこともありますので、他の人に見てもらう前には必ず構文チェックを行いましょう。
構文チェックはブラウザの拡張機能がありますので、あまり時間をかけることなく実施できます。

**Chromeの拡張機能「HTMLエラーチェッカー」**
https://chrome.google.com/webstore/detail/html%E3%82%A8%E3%83%A9%E3%83%BC%E3%83%81%E3%82%A7%E3%83%83%E3%82%AB%E3%83%BC/ohdllebchmmponnofchalfkegpjojcaf?hl=ja

## 画像の容量を確認しましょう
WEBサイトを閲覧する際のデータ量の多くは画像や動画になります。画像は書き出しフォーマットが最適になっていない、圧縮がかけられていないなどの理由で想定外の容量になっていることがありますので、データ容量を必ずチェックしましょう。

**例**
- 長方形の写真がpngで書き出されていた
- スマートフォン向けの画像で横幅が2000pxもあった
- 納品された画像を圧縮したら、画像劣化もなく70%のデータ容量削減ができた。

## 終わりに
これまでレビューした中で多く上がったものを記載させていただきました。これからも増えるようであれば随時書き足していこうと思います。あくまで私の知識内のことなので、間違っている部分やもっと良いやり方を知っている方がいらっしゃいましたらご教示いただけると助かります。
Azure Managed Grafanaを触ってみる

# Azure Managed Grafana
GrafanaはOSSの分析視覚化ツールであり、組織内のデータを保存場所に関わらず収集・分析可能です。MicrosoftとGrafana Labsの戦略的協業によってAzure Managed Grafanaがパブリックプレビューとなりました。今回はそちらをデプロイして所感を確認しようと思います。

https://azure.microsoft.com/ja-jp/blog/enhance-your-data-visualizations-with-azure-managed-grafana-now-in-preview/

# デプロイ
Azure Portal上でGrafanaと検索すると「Grafanaワークスペース」なるものが出てきます。そちらをクリックしてデプロイしていきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205918/36756661-89b2-0cb3-b026-0aa204de7b63.png)

日本のリージョンはまだ対応していないようです。GAのタイミングで追加されるかもしれません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205918/7323aaac-3b8a-5783-4cc8-f6deb2d3299f.png)

アクセス許可の部分ではGrafanaのワークスペース自体のManagedIDとワークスペースに対するユーザのRBACロールを追加できます。デフォルトでワークスペースのManagedIDには監視閲覧者ロールが割り当てられ、作成しているユーザはワークスペースの管理者となります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205918/5a5bbb95-a2f4-ea8c-7035-0031d2144ce8.png)

作成したワークスペースの概要から、エンドポイントをクリックしてワークスペースへアクセスします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205918/92295a64-73e3-0af8-66fc-5a726e03623f.png)

こういったGrafanaの画面にサクッとアクセスできました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205918/68fa85c6-874a-b975-8f94-3d869470e472.png)

# ワークスペースの使用感
データソースとしてはAzure Monitorが既定で追加されています。非常に楽ですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205918/3baad023-d403-bfaf-ae77-5acfb32d14e2.png)

Explore画面からサクッとVMのCPU Usageなんかも出力できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205918/cedb3d57-dfa3-5747-a00d-b8ce023a9189.png)

分割して比較することもできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205918/bc31c800-deac-212a-8264-62dae9cee8bc.png)

ダッシュボードを作成したい場合はCreateから行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205918/2f29c2c8-9ff2-d015-4798-4990367ceb1e.png)

データの可視化に関する詳細設定が可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205918/7960ef5c-8466-edc1-e477-cfc1594eb7a8.png)

追加してみるとこのように確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205918/a4617118-c8ac-9594-3c76-cd655f9d327b.png)

# おわりに
Azureのマネージドな環境なだけあって本当にサクッとデプロイすることができPaaS的に利用することができるのはかなりのメリットだと思います。個人的には単純にGrafanaというサービスの勉強に使えそうなのでありがたいです。ただ現時点でパブリックプレビューなこともあり、ネットワーク関連での機能が弱かったりとセキュアな環境では導入しづらい部分もあったりするかとは思います。UXとしてはかなり楽なので今後に期待です。
MMOCRを使ってOCRを作成する（Text Detection)③

# はじめに

[MMOCRを使ってOCRを作成する（Text Recognation)①](https://qiita.com/ryosao/items/c0a0cc274508759bbdc7)

[MMOCRを使ってOCRを作成する（Text Recognation)②](https://qiita.com/ryosao/items/28bb50ceb74b10c8cf32)
を通して、MMOCRを使って文字列を認識する方法を学びました。

OCRを実現するために、まず画像のどこに文字列があるのかを認識する必要があります。
今回は、そのためのText Detectionを学習するタスクについてみていきたいと思います。


## 学習データの準備

以下の形式で作成したJSONファイルが必要です。 　　
基本的には、 COCO Datasetと同様の形式になりますが、対象の文字列を記載したテキストファイルのファイル名を入れる必要があります。 対象のテキストファイルは、ルートパスの下に"annotation"というフォルダを作成して、annotationフォルダから下のファイルパスを記載してください。


instances_test.json 
```
{
"images":
  ["file_name":画像ファイル名,  
  "height":画像の高さ,  
  "width":画像の横幅,  
  "segm_file":文字列を保存したテキストファイルのファイル名,
  "id",画像のファイルのID(一意）,   
  .....,  
  ....],  
"categories":
  [{"id": 1, "name": "text"}],  
"annotations":
  [{"iscrowd": 1(たくさんの文字があれば１),   
  "category_id": "1"(基本的にはテキスト以外のものは対象がなので、常に1),   
  "bbox": [左上のx座標, 左上のy座標, 高さ, 幅],   
  "area": 面積（bboxから計算可能),  
  "segmentation": [[x1, y1, x2, y2, x3 , y3 , x4 , y4 , .......]](ポリゴン形式で各頂点の座標を左周りに記入),   
  "image_id": 画像のファイルID,   
  "id": アノテーションのID(一意)}, 
  {....},  
  ....
  ]
}
```

なお、COCO Dataset形式については、以下の記事などが参考になると思います。
[COCO Formatの作り方](https://qiita.com/harmegiddo/items/da131ae5bcddbbbde41f)

## 学習の実施

前回同様以下にgoogle collaboratory上で動くサンプルをgithubで用意しています。
[サンプル](https://github.com/saotomryo/Use_MMOCR/blob/main/Use_MMOCR_fcenet_r50_fpn_1500e_icdar2015.ipynb)

学習タスクについては、[今まで](https://qiita.com/ryosao/items/c0a0cc274508759bbdc7)とほぼ同じ内容なので、割愛します。

以下の部分に用意したデータのパス情報を入力すれば学習が開始します。


```
## アノテーションフォルダの設定


train_label_path = 訓練用のJSONファイル
val_label_path = 検証用のJSONファイル

# 画像ファイルのパス
train_img_path = 訓練用画像ファイルのフォルダパス
val_img_path = 検証用画像ファイルのフォルダパス

# ルートフォルダ
root_path = ルートフォルダのパス


# 作業フォルダ（学習時のモデル出力先（エポック毎に出力))
work_path = '/content/work_dir'
```

##　最後に
前回までの「Text Recognation」のタスクと、「Text Detection」のタスクを組み合わせることで、AI OCRの作成が可能になりました。
しかし、この２つのタスクを別々に学習するのは非効率な感がありますので、次回はこの２つのタスクを一度に実施できる「KEY INFORMATION EXTRACTION MODELS」タスクについて解説したいと思っています。

## OCR関連の投稿記事
[MMOCRを使ってOCRを作成する（Text Recognation)①](https://qiita.com/ryosao/items/c0a0cc274508759bbdc7)

[MMOCRを使ってOCRを作成する（Text Recognation)②](https://qiita.com/ryosao/items/28bb50ceb74b10c8cf32)
[Flutter]Navigatorで2つ以上前の画面に戻る方法

# はじめに
Flutterで複数ページどうやって戻るのと思った時、とても革命的だったのが
Navigator.popUntilです。Routeより簡単に階層が複雑にならずに戻ることができます。
# 方法
```
int count = 0;
Navigator.popUntil(context, (_) => count++ >= n);
```
nの部分を戻りたい画面分記述すれば問題ないです。
注意点としては、引数を定義できないということです。
(自分が調べて試した結果なので、もしやり方が分かったら記述します。)

[参考記事](https://www.yukiiworks.com/archives/10382)
redisでreturn Promise.reject(new errors_1.ClientClosedError());というエラー対応





# redisの「return Promise.reject(new errors_1.ClientClosedError());」というエラーについて

# 結論（どうすればよいか）

```json
    "redis": "^4.1.0"
```

から

```json
    "redis": "^3.0.0"
```
に`package.json`を変更しろ

なお、なぜかは知らん


```docker
# 掃除
docker compose -f docker-compose.yml -f docker-compose.dev.yml down
docker compose -f docker-compose.yml -f docker-compose.dev.yml up -d --build
```

# エラー内容
return Promise.reject(new errors_1.ClientClosedError());


# ソース
※もう直しているので再現はしません
github
https://github.com/2f0833e717/node-docker


## 実際のコンソール出力内容
```bash

[nodemon] restarting due to changes...
[nodemon] starting `node index.js`
Fri, 06 May 2022 02:29:38 GMT express-session deprecated undefined resave option; provide resave option at index.js:43:9
Fri, 06 May 2022 02:29:38 GMT express-session deprecated undefined saveUninitialized option; provide saveUninitialized option at index.js:43:9
listening on port 3000
succesfully connected to DB
/app/node_modules/@redis/client/dist/lib/client/index.js:404
        return Promise.reject(new errors_1.ClientClosedError());
                              ^

ClientClosedError: The client is closed
    at Commander._RedisClient_sendCommand (/app/node_modules/@redis/client/dist/lib/client/index.js:404:31)
    at Commander.commandsExecutor (/app/node_modules/@redis/client/dist/lib/client/index.js:167:154)
    at Commander.BaseClass.<computed> [as set] (/app/node_modules/@redis/client/dist/lib/commander.js:8:29)
    at RedisStore.set (/app/node_modules/connect-redis/lib/connect-redis.js:65:21)
    at Session.save (/app/node_modules/express-session/session/session.js:72:25)
    at Session.save (/app/node_modules/express-session/index.js:406:15)
    at ServerResponse.end (/app/node_modules/express-session/index.js:335:21)
    at ServerResponse.send (/app/node_modules/express/lib/response.js:232:10)
    at ServerResponse.json (/app/node_modules/express/lib/response.js:278:15)
    at exports.signUp (/app/controllers/authController.js:20:21)
[nodemon] app crashed - waiting for file changes before starting...

```

# 余談その1　写経の元ネタ
[Youtube] [Google自動翻訳]
Dockerを学ぶ-Node.jsとExpressを使用したDevOps

https://www.youtube.com/watch?v=9zUHg7xjIqQ

#  余談その2　

```javascript
// /home/ubuntu/work/study/node-docker/controllers/authController.js

exports.signUp = async (req, res) => { // reqとresを逆位置にする解決方法もあるみたいだが実際どうなのか、、ちなみに使えなかった
  const { username, password } = req.body = {}; // default {}で落ちても復帰できるようにしていたが、逆にhttp statusが全部failになるのでやめました。
  try {
    const hashpassword = await bcrypt.hash(password, 12);
    const newUser = await User.create({
      username,
      password: hashpassword,
    });
    res.status(201).json({
      status: "success",
      data: {
        user: newUser,
      },
    });
  } catch (e) {
    res.status(400).json({
      status: "fail",
    });
  }
};
```




# エラー対応　参考：
今回は一発

https://stackoverflow.com/questions/70145795/node-redis-does-not-work-on-my-windows-computer-even-though-the-server-is-up-and
C#について個人的まとめNote 

# C#とは
- C言語・C++の後継にあたる言語という位置付け。
- Microsftが、主にJavaをベースに作った。
- コンパイルとインタープリター二つの側面を持つ。
> コンパイル言語 : ソースコードを全てコンパイルした後に実行する。

> インタープリター言語 : ソースコードを1行ずつ機械語に翻訳しながら実行できる言語。

> スクリプト言語 : ソースコードの実行や修正が簡単なプログラミング言語という、比較的抽象的な意味で使われる。

- **.NET Framework** と呼ばれる実行環境の上で実行できる言語。
    - **.NET Framework**上で動くようにCLI(Common Launguage Infrastructure)にコンパイルした後、1行1行インタープリターで実行される。
    - **.NET Framework**は機種やOSに縛られずに実行することが可能。

## VisualStudioでのC#用プロジェクトの作り方
-
[PHP]宇宙船演算子

# 概要
宇宙船演算子`<=>`は
- 左辺が右辺より大きい場合は`1`
- 左辺が右辺より小さい場合は`-1`
- 左辺が右辺と等しい場合は`0`

を返す。

# 例
PHPの関数`usort`と併用します。

## 一次元配列

```php
usort($array, function ($a, $b) {
  return $a <=> $b;
}
```

これにより`$array`内部は昇順に並び替えられます。

## 二次元配列

```php
usort($array, function ($a, $b) {
  return $a['hoge'] <=> $b['hoge'];
}
```

これによりキー名が`hoge`の内容を対象に昇順で並び替えられます。

# 参考
https://www.php.net/manual/ja/migration70.new-features.php
Docker official WordPressコンテナを確認してみた

# 前提
数年何となく触っている筆者の個人的感想ですが
結構この数年でドラスティックに構成が変わる場面がありました。
（wp-config.php周りが顕著で
自分の場合は公式のものをダウンロードしてDockerfileやshファイルを
直接編集していたことで影響を受けました。通常の使い方でしたら影響はないのかもしれません)
あくまでも2022年3月時点での記事ということで残しておきます。

# ハンズオン
まずはハンズオンで立ち上げてみます。
[docker公式](https://docs.docker.jp/compose/wordpress.html)
こちらは難なく立ち上がりました。
※M1Macを使っている場合はdbコンテナに以下の一行(platform)を加えると動きます。
```
services:
   db:
     platform: linux/x86_64
     image: mysql:5.7
```
# WordPressコンテナを確認してみる
### mysqlコマンドはあるのか？
WordPressコンテナ内にmysqlコマンドはありません。
```
% docker exec -it 280daxxxxx bash
root@280da4xxxxx:/var/www/html# mysql --version
bash: mysql: command not found
```
しかしWordPressは立ち上がり機能しています。
おそらくmysqlコンテナ、wpコンテナ共に独立してセッティングした状態で立ち上がる動きだと思います。
wpコンテナ側からmysqlコマンドを叩いてというのは基本的にはやらない設計のようです。

### wp-config.phpはどのようになっているか？
このファイルがデフォルトで設置されていました。
[公式WPコンテナのwp-config](https://github.com/docker-library/wordpress/blob/a59112cc8738962784daf2ed9383d5148281c66f/latest/php7.4/apache/wp-config-docker.php)

# mysql
データベース名はdocker-compose.ymlのMYSQL_DATABASEで指定した値で作成されます。
ここの値はデフォルトではWordPressとなっておりますが変更することも可能です。
ただし変更した際はWPコンテナ側でも名前を合わせて作成する必要があり
合っていないと以下のようなエラーがブラウザでアクセスした際に表示されます。

```error.sh

Error establishing a database connection

```

WPコンテナ側で名前を合わせるにはdocker-compose.ymlにWORDPRESS_DB_NAMEを加えて設定します。
具体的な動きとしてはwp-config.php内に設定が加えられる動きとなりどのデータベースを読みに行くのかが変わる動きとなります。
# 生成される乱数volumeの確認
コンテナを立ち上げた際に自動生成される乱数volumeには
wpルートディレクトリ（wp-admin、wp-content、wp-includes含む同階層以下のファイル）が
格納されていました。
確認方法は以下で試しました。

https://qiita.com/SwuBHj8aKGqBKHet/items/0f2377fdd61b692efe84

どうやらwpコンテナで生成されたファイルが格納される仕組みのようですね。
この乱数volumeには名前をつけることもできます。
docker-compose.ymlに以下のようにvolumesセクションを加えます。
```
     volumes:
       - docker-official-wp-volume:/var/www/html
```

私の環境では名前をつけた方がわかりやすいので名前をつけて管理しています。
フローでの数式


# この方法が普通のやり方かもしれん。

[Formula issue in the flow](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000HDEzy)

---------------------------------------


+ [画面フロー、SSN検証が完了するか、4桁のみ](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000HCeEeSAL)
OR (REGEX( {!ssn_validate} , "[0-9]{3}-[0-9]{2}-[0-9]{4}"),REGEX( {!ssn_validate} , "[0-9]{4}")) 
 ここで、{！ssn_validate}は画面コンポーネントによって生成されるテキスト変数です。

+ [フロービルダーの式がカスタムフィールドを認識しない](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000HD8mxSAD)

Flowでフィールドを参照する場合は、{!}で囲む必要があります。したがって、Conveyor_Length_2__cは{!Conveyor_Length_2__c}になります

+[フローのトリガー条件のカスタムラベルについて](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000HDC3Q)

# メールのSubjectには先頭に何か違う文字が入っているので、contain関数で含まれているかでチェックする

[Flow is not triggered because of ' in the text - how to fix?](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000H1PK1SAN)

# 数式を使った条件でレコードを更新する

ワークフローやプロセスビルダーのように開始時点で数式によってトリガーを制御できそうなんですが、実はできません。
別途数式のリソースを作って決定ロジックで判断させて分岐する必要があるみたいです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/042f590b-dddc-1ab9-0097-534e0f9bf4db.png)

全体像

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/c3cef7e6-f70b-397d-84df-0a6d22c42711.png)

必要なリソース

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/8e5c00b1-7e40-d7d8-e833-9a23e3f93991.png)

数式のリソースの中に判定に使う式を書きます。
書いてすぐに数式の構文チェックがされないので、非常に面倒です。

今回の数式です。

```
OR(
AND(
NOT(ISNEW()),
ISCHANGED({!$Record.Supplier_id__c})
),
AND(
ISNEW() ,
ISBLANK({!$Record.Supplier_code__c})
)
)
```

# その他の回答

+ [フローの条件演算子としてIsNullを使用する際のヘルプが必要です。](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000HDBUw)
+ [DoesRequireRecordChangedToMeetCriteriaフィールドの値は「true」であるため、次のフィールドも設定する必要があります。フィルター。](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000H1sKV)
+ [Creating a formula in "Collection Filter " with overall search filter functionality creation of the flow](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000HDpUF)
ローカルドメイン環境以外での証明書警告

WindowsServer2016までの場合は、MMC証明書スナップショットで見るWebサーバ証明書テンプレートは、1024bitなのでこれを複製して2048bitのWebサーバテンプレートを作成する必要がある。有効期限は10年程度がお勧め。
証明書のテンプレート管理なるものがあるのでこれを使って作成する。

このテンプレートを使って証明書を作成すれば、ドメイン外のマシンでも証明書警告は出なくなる。
ファイル内検索をしたいとき (grep)

# grep
1.grepコマンドでファイル指定する場合
+ 1ファイルから検索
→ファイル名は表示されない
```
grep 検索文字列 ファイル
```
+ *を利用して複数ファイルから検索
→複数ファイルから検索文字列が見つかるとファイル名も表示される
```
grep 検索文字列 /フォルダ/hoge*.log
```

2.grepコマンドでファイル指定しない場合
→標準出力から検索

+ catした内容をgrep
catで標準出力してたものをパイプでつないでgrep
→いったん標準出力させているため、ファイル名は表示されない
```
cat ファイル | grep 検索文字列
```
IISでオレオレ認証局を作ってみた

WindowsServer2016のAD CSサーバを使ってオレオレ認証局を作ってみた理由。
1、IIS7.5以降ではオレオレ証明書（自己認証証明書）にIPアドレスが指定できない。※Apacheなどは未だにOK。
2、自分で作ったドメインなら配布もポリシーでされて自動で認証され、オレオレ（自己認証証明書）ではない本物もどきの証明書が出来る。
3、どうせやるなら、本物に近いオレオレ証明書（自己認証証明書）を作りたい。

と言うことでやってみたが、セキュリティの非常に肝な部分のため明確にやり方を示す情報サイトはなかった。

どうやらWindowsServerに搭載されたAD CSは同じドメイン内（AD内）では安全に運用出来る方法らしい。
社内アクティブディレクトリのポリシー配布の機能を併用するとドメイン内では外のインターネットSSLサイトと同じように証明書が自動的に配布され、ドメイン外のユーザーからは証明書を別途頂かないとアクセスすることが出来ない環境を作ることが出来るようだ。この事も考慮しないと間違ったAD CSを作ってしまうので注意しよう。

AD CSサーバの構築場所：
ADサーバにAD CSサーバを共存させることも可能であるが、共存の場合は、モジュールのインストール順序を間違えると一旦AD CSをクリーンアンインストール（証明書の管理からも削除が必要）する必要が発生するので、ADサーバとは別のいわゆるADメンバーサーバーが理想的である。メンバーサーバーでもWebサーバとして使うサーバは証明機関Web登録のURLの設定がIISを使う関係で難しくなるのでWebサーバ以外がお勧め。実際に私は共存を検証しているが予測不能な事態をたくさん解決する必要が発生するのでお勧めできない。

さて構築場所が決まったら、AD CSサーバの構築：
1、エンタープライズ証明機関
2、ルートCA
3、資格情報はこのADドメインの管理者アカウント（大抵はAdministrator）
4、ドメイン名はADドメインのものをつかい、それに適当なサフィックスを付ける形になる。
※これも何度か入れ直しをするとどういう仕組みなのか分かるはず
5、必要な機能は証明機関、証明機関Web登録
※証明機関Web登録：これ入れないと簡単な証明書登録画面を出せなくなる証明書登録はWebアプリ（/certsrv)で行う
これでAD CSのインストールは終わるが、これだけでは、証明書登録Web画面（http://～/certsrv）へのアクセスが出来ない事がある。
私の環境では特に問題はなかったが、HTTPではアクセス出来ないバージョンがありその場合は下記でHTTPS対応をする。
6、MMC証明書スナップインを起動し個人証明書で新しい証明書の要求をする。
7、IISの管理画面で、「バインド編集」を行い、HTTPSを追加し、6で作成した証明書を選択する。
8、これでhttps://～/certsrvにアクセス出来るはず。

これでAD CSサーバ構築は簡単に終わる。

このAD CSで作成される証明書は認証局発行の正式な証明書には当たり前に付いているSAN情報がデフォルトでは付加できない。

AD CSサーバでコマンドプロンプトを開き、
certutil -setreg policy\EditFlags +EDITF_ATTRIBUTESUBJECTALTNAME2
net stop certsvc
net start certsvc
でSAN属性が設定出来るようになる。
※certutil -getreg policy\EditFlags（現在の証明書属性を表示出来る）
※certutil -setreg policy\EditFlags -EDITF_ATTRIBUTESUBJECTALTNAME2（属性削除）

証明書登録方法：
証明機関Web登録画面を、一般の証明書購入時の認証局の役割として考え、証明書発行したいサーバのIISでSSL証明書発行要求を作り、これを、証明機関Web登録画面で入力する。
注意点は発行要求を出す際にFQDN指定は必須になるが、これは、フレンドリ名と一致していないと呼び出すURLのFQDN名をフルFQDNで指定することになったり、サフィックスでフィルターしたりする必要が出るのでややこしくなる。
またSAN属性は付加されるように上記で設定されているが、証明書にSAN属性を追加するのは別途必要。
追加属性欄に　san:dns=XXX.example.com&dns=xxx.example　のように記述する。これ大事。
証明書は、ほぼすぐに発行されるが、発行されたら、証明機関Web登録画面からダウンロードが必要で、配布したい形式でダウンロードすれば良い。
ダウンロードされた証明書は、ドメイン外の端末に手動でインストールして使う事も出来るが、その際は、どうしてもHostsなどの名前解決がされている必要があるので名前解決は工夫が必要。

この環境にすると、同一ドメイン内にいるクライアントPCにはこのSSL証明書を使うドメインのURLには自動で証明書を配信させる事が出来る。
※この設定で出来るのはこのようなローカルドメイン環境であり、ドメイン外のマシンでChrome、EdgeなどのブラウザでSSLアクセスすると2020年12月以降、これだけでは証明書警告が出るようになってしまった。この回避方法は下記に記載した。

https://qiita.com/jg1mnv/items/2a3404a524c0f813602c
AWS EC2環境でのrails db:seedする方法

## 初めに
AWSのEC2にてデプロイしています。
rails db:seedをしたかったのですが、rake db:seedだったり、cd currentする、
など自分の環境にあった情報が見つかりませんでした。
なのでとても簡単なことですが投稿しています。

## 環境
Rails： 6.1.5
Ruby： 2.6.3
ローカル環境：　cloud9
デプロイ環境：　EC2

## 結論
EC2に入り、cd アプリケーション名してから
（rails sしてるなら念の為停止しておく）
```terminal:terminal
[ec2-user@パブリックIPアドレス アプリケーション名]$ bundle exec rails db:seed RAILS_ENV=production
```
だけです。

## 最後に
とてもシンプルで読み応えはありませんが、色々調べる手間を省くため書きました。
ありがとうございました！
mysqlでテーブルのデータをリセットする方法(備忘録)

# データを一気に消したい…でもテーブル削除は面倒…
そんなときに使うSQLはこちら。

`truncate table テーブル名;`

このSQL文はdeleteとは異なり指定したテーブルの全データを消してリセットしてくれます。
またid等のauto_incrementが設定されているカラムもリセットされるので、リセット後に新たなデータを登録するとauto_incrementのカラムには1が入ります。
Ruby で Translation API を叩く

# ゴール
以下を ruby から叩く。

https://cloud.google.com/translate

[500,000 文字 / 1 ヶ月までは無料](https://cloud.google.com/translate/pricing)なので、とりあえず Translation API Basic

# 事前準備
具体的には、[こちら](https://cloud.google.com/translate/docs/setup)
- GCPのプロジェクト（課金の有効化）を作って
- 翻訳APIを有効にして
- 認証JSONファイル（サービスアカウント経由で作成）を取得する

[Translation API Basic を叩いてみる](https://cloud.google.com/translate/docs/basic/translating-text)（BasicはV2、AdvancedはV3）

# Gem から API を叩く
- [ドキュメント](https://cloud.google.com/translate/docs/reference/libraries/v3/ruby)を見ると、[Gem](https://github.com/googleapis/google-cloud-ruby/tree/main/google-cloud-translate) を使うとのこと
- [ドキュメント](https://cloud.google.com/ruby/docs/reference/google-cloud-translate/latest#quick-start)通りに作業すれば OK
    - 認証JSONファイル内容を環境変数に設定する（セキュリティ的に、JSONファイルパスではなく）
    - `$ export TRANSLATE_CREDENTIALS=$(cat [認証JSONファイル])`
- Gem の使い方は、[こちら](https://googleapis.dev/ruby/google-cloud-translate-v2/latest/index.html)

```ruby
require "google/cloud/translate/v2"
=> true

client = Google::Cloud::Translate::V2.new
=> #<Google::Cloud::Translate::V2::Api:0x00007fbdf7c8b768 @service=Google::Cloud::Translate::V2::Service>

translation = client.translate "Hello world!", to: "ja"
=> #<Google::Cloud::Translate::V2::Translation:0x00007fbdf0db8638 @text="こんにちは世界！", @to="ja", @origin="Hello wo...

puts translation
こんにちは世界！
=> nil
```
データサイエンティスト検定(リテラシーレベル)という試験を受けました

<!-- wp:paragraph -->
先日、データサイエンティスト検定というものを受けてきました。LINEやSNS、HPに携わっていく中でデータ分析の必要性が自分の中でかなり大きくなってきていたからです。そこで、データサイエンスの概要を体系的に勉強できるいい機会だと思い、受験することを決めました。（2021年第1回開催）

簡単にですが、試験の結果と、勉強方法などをシェアしていこうと思います。

## データサイエンティスト検定（DS検定）とは？

一般社団法人データサイエンティスト協会が主催している検定試験で、本検定の取得により、データサイエンティストに必要なデータサイエンス力・データエンジニアリング力・ビジネス力についてそれぞれ見習いレベルの実務能力や知識、また、数理・データサイエンス・AI教育のリテラシーレベルの実力を有していることを証明することができる、というものです。

![](https://linemarketer.com/wp-content/uploads/2022/05/image.png)
**これからの社会人として必要最低限の知識を図る検定試験**といっても言い過ぎではないくらい、どの業界・業種でも使える知識を図る試験かと思います。

対象は以下のような方を想定しているようです。

- データサイエンティスト初学者
- これからデータサイエンティストを目指すビジネスパーソン
- データサイエンティストに興味を持つ大学生や専門学校生など

詳しくは以下のホームページをご覧いただければと思います。

https://www.datascientist.or.jp/dskentei/ 

## 結果

早速ですが、結果をシェアしたいと思います。

結果：**合格**

総合得点：385点（内訳：データサイエンス215点、データエンジニアリング80点、ビジネス90点）

【正答率】
データサイエンス 95％（平均81%） 
データエンジニアリング 64%（平均78%） 
ビジネス 90%（平均84%）



CBT試験なので、試験が終わった瞬間に結果が表示されます。

合否は合格で、トータルでは83%でした。

「データサイエンス」と「ビジネス」については90%以上の正答率と良い結果。

ただ、「データエンジニアリング」は平均以下と言う結果に。

## 勉強方法

データサイエンティスト検定の公式参考書が出ていたので、こちらを購入しました。

他の試験だったら過去問をメインに、参考書は辞書のように使って勉強していくのですが、第1回目ということもありこちらの書籍を3週読み込むことに。

https://www.amazon.co.jp/%E6%9C%80%E7%9F%AD%E7%AA%81%E7%A0%B4-%E3%83%87%E3%83%BC%E3%82%BF%E3%82%B5%E3%82%A4%E3%82%A8%E3%83%B3%E3%83%86%E3%82%A3%E3%82%B9%E3%83%88%E6%A4%9C%E5%AE%9A-%E3%83%AA%E3%83%86%E3%83%A9%E3%82%B7%E3%83%BC%E3%83%AC%E3%83%99%E3%83%AB-%E5%85%AC%E5%BC%8F%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9%E3%83%96%E3%83%83%E3%82%AF-%E7%94%B1%E7%B4%80%E5%AD%90/dp/4297122618 

2年半以上エンジニアをしていたり、統計学の勉強をしたり、大学生の時に機械学習をかじったこともあったので、割とスムーズに読み進めることができました。

最後にアウトプットも兼ねて、1問1答アプリが出ていたものをダウンロードしてきて、全問正解するまでひたすら繰り返してから試験に挑戦。

## まとめ

これが取れたから何か仕事が特別できるわけではないということが前提になりますが、あるデータを論理的に評価する方法や、それをどう活用する方がいいのかといった基本的なことは理解できていると考えられるようなものなので、**有益な検定試験**になるかと個人的には考えております。

どの業種・部門に属していても今後はこのくらいの知識は社会人として必修になっていくと思いますので、おすすめしたい試験です。
gvfsのコンパイル備忘録

# gvfsのコンパイル備忘録です。
Ubuntu 22.04 LTS (GNU/Linux 5.15.0-29-generic x86_64)で作業しました。
（インストールには至らず）
# 必要なパッケージをインストールする。
```bash:
sudo cp -p /etc/apt/sources.list /etc/apt/sources.list.org
sudo sed -i /etc/apt/sources.list \
    -e 's/^# *\(deb-src\)/\1/g'
diff -y -W 100 /etc/apt/sources.list.org /etc/apt/sources.list
sudo apt-get update
sudo apt-get source gvfs
sudo apt-get install \
    cmake \
    debhelper \
    dh-exec \
    git \
    gnome-pkg-tools \
    gsettings-desktop-schemas-dev \
    meson \
    xsltproc
sudo apt-get install \
    libarchive-dev \
    libavahi-client-dev \
    libavahi-glib-dev \
    libbluray-dev \
    libcap-dev \
    libcdio-paranoia-dev \
    libdbus-1-dev \
    libfuse3-dev \
    libgcr-3-dev \
    libgcrypt20-dev \
    libgdata-dev \
    libgoa-1.0-dev \
    libgphoto2-dev \
    libgudev-1.0-dev \
    libimobiledevice-dev \
    libmtp-dev \
    libnfs-dev \
    libpolkit-gobject-1-dev \
    libsecret-1-dev \
    libsmbclient-dev \
    libsoup2.4-dev \
    libsystemd-dev \
    libudisks2-dev \
    libusb-1.0-0-dev \
    libxml2-dev
```
# libsoup-3.0-devが有ればインストールする。
```bash:
apt-cache search libsoup-3.0-dev
sudo apt-get install \
    libsoup-3.0-dev
```
# コンパイル環境が入っていなかったらインストールする。
```bash:
dpkg -l build-essential
sudo apt-get install build-essential
```
# ”--nonet”がコンパイルエラーに関わるので削除する。
```bash:
sudo cp -p man/meson.build man/meson.build.org
sudo sed -i man/meson.build \
    -e '/--nonet/d'
diff -y -W 100 man/meson.build.org man/meson.build
```
# コンパイル実施。
```bash:
sudo bash -c './debian/rules clean && ./debian/rules'
sudo ./debian/rules build
```
anyenvからnodenvでnodeインストールまで

忘れがちな環境構築
最近、仕事に復帰して、また一から設定し直したので忘れないうちに記事かしました！

## 1. デフォルトを`zsh`に変更

`macOS Catalina`以降、デフォルトシェルがbashから`zsh`に変更されたので
まずは、そこから実行します

#### 1. ターミナルを起動すると下記のメッセージが表示される

ターミナルの場所は下記を確認
アプリケーション＞ユーティリティ＞ターミナル

```
$ The default interactive shell is now zsh.
$ To update your account to use zsh, please run `chsh -s /bin/zsh`.
$ For more details, please visit https://support.apple.com/kb/HT208050.
```

#### 2. メッセージにしたがって下記を実行

```
$ chsh -s /bin/zsh
```

#### 3. ターミナル再起動

メニューから`ターミナルを終了`もしくは下記のコマンドでもOK
ターミナルの上部のバーが`-zsh`に変わっていればOK

```
# ターミナル再起動コマンド
$ exec $SHELL -l
```

## 2. `enyenv`をインストール

#### 1. enyenvをインストール

```
# 一度ルートディレクトリに戻る
$ cd ~
# anyenvをインストールする
$ git clone https://github.com/anyenv/anyenv ~/.anyenv
```

#### 2. PATHを通す

.zshrcファイルにPATHを記述します、下記のコマンドを実行すると.zshrcファイルにPATHが記述されます
.zshrcファイルはuserディレクトリにあります
不可視ファイルが見れるようになっていないと確認できません

```
# 入力するコマンド
$ echo 'export PATH="$HOME/.anyenv/bin:$PATH"' >> ~/.zshrc
$ echo 'eval "$(anyenv init -)"' >> ~/.zshrc

# .zshrcに出力される内容
export PATH="$HOME/.anyenv/bin:$PATH"
eval "$(anyenv init -)"
```

#### 3. ターミナルを再起動

メニューから`ターミナルを終了`もしくは下記のコマンドでもOK

```
# ターミナル再起動コマンド
$ exec $SHELL -l
```

#### 4. enyenvが入っているか確認

```
$ anyenv --version

# 下記のような値が返ってくればOK
$ anyenv 1.1.4-2-g2ba77e5
```

### 5. プラグインをインストール

```
$ anyenv install --init
```

## `nodenv`を使って`node`をインストール

#### 1. `nodenv`をインストール

```
# nodenvをインストール
$ anyenv install nodenv

# 一応入っているか確認
$ nodenv -v

＃ 下記のような値が返ってくればOK
$ nodenv 1.4.0+3.631d0b6
```

#### 2. `node`をインストール

チームで一番よく使っているnodeのバージョンをインストールしましょう

```
# インストール可能なNode.jsのバージョン一覧
$ nodenv install -l

# 例えば10.16.3をインストール
$ nodenv install 10.16.3

# グローバルにも設定しておきましょう
$ nodenv global 10.16.3

# nodeのバージョンを確認
$ node -v

# 下記のような値が返ってくればOK
v10.16.3
```
.gitignore の使い方 | 一部のデータを共有しない方法

### この記事について

#### 対象とする方
github 初心者の方を想定しています。

#### 使う場面
git push したら不要なデータも github に上がってしまい、それらのデータを今後アップしないようにしたいとき
例：.DS_Store , node_modules などのディレクトリやその他ファイル

---

### .gitignore とは？
システム開発に不要なファイル、ディレクトリの名前を、とあるファイルにリストアップしておくと、github に上がらないようになる仕組みです。

### .gitignore の使い方
※ 実行環境はMacです
#### github上で共有したくないが、すでに git push してしまったデータへの対処
今後 git push されないようにするため、キャッシュの削除という作業を行います。

1. 当該データがある階層に行きます
(参考) ターミナル操作
`$ cd ディレクトリの場所`
ディレクトリの場所に移動する
`$ cd ~/`
ホームディレクトリに移動する
`$ cd ..`
1つ上の階層に移動する

2. 以下を入力します
`$ git rm --cached データ名`

3. 成功すると以下のように表示されます
`rm データ名`


#### .gitignore ファイルを作る
.gitignore というファイルを作ると、それが不要なデータ名称のリストとして認識されます。

1. .git ディレクトリがある階層に行きます
2. .gitignore という名前のファイルを作成します
(参考) ターミナル操作
`$ touch ファイル名`
中身が空のファイルを作る

#### .gitignore ファイルに入力する
決められた形式で、データ名をリストアップします。

1. 共有したくないデータ名をそのまま入力します
例）.DS_Store というディレクトリを共有したくなければ、 .DS_Store と入力

※ その他、ワイルドカード等を使ってデータ名を指定することも可能です。方法は他の記事をご参照ください。

#### 状態を確認し、 git push する
1. 通常通り git add をします
2. git status で、 .gitignore に入力したデータが追跡対象から削除されているかを確認します
3. 問題がなければ、git commit , git push します

#### github上の状態を確認する
最後に、 git hub 上でも .gitignore に入力したデータがなくなっているかを確認しましょう。
※ .gitignore のファイル自体はgithub上で共有されます

---

### 参考記事

https://qiita.com/sf213471118/items/efbc0abf028a3ead72e7

https://qiita.com/anqooqie/items/110957797b3d5280c44f

参考にさせていただきました。ありがとうございます。
GitLab API の使い方

プロジェクトID の調べ方
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/2be6d075-ad52-9d75-060b-d8b3c3d21175.png)


プロジェクトのメンバーの取得

```bash:get_members.sh
#
#	get_mbembers.sh
#
#
#
FILE_JSON="tmp01.json"
TOKEN="glpat-xxxxxxx"
PROJECT_ID="35195199"
LIMIT="?page=1&per_page=10"
URL="https://gitlab.com/api/v4/projects/"${PROJECT_ID}"/members"${LIMIT}
#
rm -f ${FILE_JSON}
http $URL "PRIVATE-TOKEN:"${TOKEN} > ${FILE_JSON}
#
jq ".[] | { id : .id, username: .username, name : .name, web_url : .web_url, created_at : .created_at }" ${FILE_JSON}
#
```

プロジェクトのブランチの取得

```bash:get_branches.sh
#
#	get_branches.sh
#
#
#
FILE_JSON="tmp02.json"
TOKEN="glpat-xxxxxx"
PROJECT_ID="35195199"
LIMIT="?page=1&per_page=10"
URL="https://gitlab.com/api/v4/projects/"${PROJECT_ID}"/repository/branches"${LIMIT}
#
rm -f ${FILE_JSON}
http $URL "PRIVATE-TOKEN:"${TOKEN} > ${FILE_JSON}
#
jq ".[] | {name : .name, merged : .merged, author_name: .commit.author_name}" ${FILE_JSON}
#
```

プロジェクトの削除
>参考情報
>[Delete project](https://docs.gitlab.com/ee/api/projects.html#delete-project)

```bash
TOKEN="glpat-xxxxxx"
PROJECT_ID="35195199"
URL="https://gitlab.com/api/v4/projects/"${PROJECT_ID}
#
http DELETE $URL "PRIVATE-TOKEN:"${TOKEN}
```
M365VMで紹介したリンク関連

# はじめに
　2022/5/6 [Microsoft 365 Virtual Marathon 2022 Japanese Track - connpass](https://connpass.com/event/243871/)に登壇しました。スライド内で紹介したリンクが多いので、こちらに記載します。

## office.comからはじめよう
https://aka.ms/MyApps

https://office.com

https://docs.microsoft.com/ja-jp/power-platform-release-plan/2022wave1/power-bi/power-bi-integration-outlook-office-hub?WT.mc_id=DP-MVP-5004418

https://docs.microsoft.com/ja-jp/power-bi/create-reports/service-quick-create-report?WT.mc_id=DP-MVP-5004418

https://docs.microsoft.com/ja-jp/power-bi/create-reports/service-insights?WT.mc_id=DP-MVP-5004418

## さまざまなM365系サービスとの連携
https://docs.microsoft.com/ja-jp/power-bi/create-reports/service-quick-create-sharepoint-list?WT.mc_id=DP-MVP-5004418

https://docs.microsoft.com/ja-jp/power-bi/collaborate-share/service-teams-analytics?WT.mc_id=DP-MVP-5004418

https://docs.microsoft.com/ja-jp/microsoft-365/admin/usage-analytics/usage-analytics?WT.mc_id=DP-MVP-5004418

https://docs.microsoft.com/ja-jp/power-bi/connect-data/service-desktop-files?WT.mc_id=DP-MVP-5004418

https://docs.microsoft.com/ja-jp/power-platform-release-plan/2022wave1/power-bi/view-power-bi-files-onedrive-sharepoint?WT.mc_id=DP-MVP-5004418

## Excelからのデータセット
https://docs.microsoft.com/ja-jp/power-bi/guidance/powerbi-implementation-planning-introduction?WT.mc_id=DP-MVP-5004418

https://docs.microsoft.com/ja-jp/power-bi/connect-data/service-datasets-understand?WT.mc_id=DP-MVP-5004418

https://docs.microsoft.com/ja-jp/power-bi/connect-data/service-datasets-hub?WT.mc_id=DP-MVP-5004418

https://docs.microsoft.com/ja-jp/power-bi/collaborate-share/service-connect-excel-power-bi-datasets?WT.mc_id=DP-MVP-5004418

https://qiita.com/ishiayaya/items/6389215d11d44c41cca2

https://powerbi.microsoft.com/ja-jp/blog/analyze-in-excel-workbooks-are-now-saved-to-onedrive-for-business/

## Excelからのデータフロー
https://docs.microsoft.com/ja-jp/power-bi/transform-model/dataflows/dataflows-introduction-self-service?WT.mc_id=DP-MVP-5004418

https://docs.microsoft.com/ja-jp/power-query/new-dataflow-from-template?WT.mc_id=DP-MVP-5004418

## PowerPointとの連携は?
https://docs.microsoft.com/ja-jp/power-platform-release-plan/2022wave1/power-bi/power-bi-integration-powerpoint?WT.mc_id=DP-MVP-5004418
Kubeflowのローカルへのインストール方法

## はじめに
https://www.kubeflow.org/

本記事ではKubeflowのローカルへのインストール方法を解説します。現時点でKubeflowのインストール方法について解説した日本語記事が存在しないため、これから利用する方の参考になれば幸いです。

**NOTE: 本記事で解説する方法は、2022年5月現在の最新版であるv1.5のインストール方法です。**

## 事前準備

Kubeflowをインストールするために以下のツールが必要ですので適宜インストールしてください。

- Kuernetesクラスター ([Kind](https://kind.sigs.k8s.io/)や[Minikube](https://minikube.sigs.k8s.io/docs/start/))
- [kubectl](https://kubernetes.io/docs/tasks/tools/)
- [kustomize](https://kustomize.io/)

## インストール方法

インストール方法はいくつかあるのですが、今回は最も簡単な方法であるKubeflowが用意してくれている公式のスクリプトを用います。

1. MinikubeやKindなどを用いてKubernetesクラスターをお手元のPC上で起動します。
2. 以下のスクリプトを実行し、KubeflowをKubernetes上にインストールします。インストールは10分程度かかります。

```bash
$ git clone https://github.com/kubeflow/manifests
$ cd manifests
$ ./hack/setup-kubeflow.sh
```

エラーっぽい文が出力される時がありますが、スクリプトが終了していなければ問題ありませんのでそのまま待ちます。
スクリプトが終了したら以上でインストール完了です。 KubernetesクラスタにKubeflowがインストールされています。

以下のコマンドでKubeflowの名前空間でPodが立ち上がっていることを確認することができます。

```bash
kubectl get pods -n kubeflow
```

## UIにアクセスする
ここではKubeflowのUIにlocalhostからアクセスするための方法を説明します。

KubeflowのWeb UIにアクセスするにはkubectlを使ってポートフォワードをする必要があります。以下のコマンドを実行後、localhost:7777`でログイン画面にアクセスできます。

```bash
$ kubectl port-forward svc/istio-ingressgateway -n istio-system 7777:80./local/port-forward.sh
```

ログインするための初期パスワードは以下の通りです。

```
email: user@example.com
password: 12341234
```

## 参考
[kubeflow/manifests](https://github.com/kubeflow/manifests)
log4jのバージョン確認方法

2021年12月に、Apache Log4j の脆弱性が話題になり、その時の調査で利用したコマンドをまとめました。
https://www.ipa.go.jp/security/ciadr/vul/alert20211213.html

## Maven
### 使われているLog4Jのバージョンの確認方法
```
mvn -f pom.xml dependency:tree -DoutputFile=出力先ファイル
mvn -f pom.xml dependency:tree | grep log4j
```

### pom.xml ファイルに Log4jのバージョンを指定する方法
```
    <properties>
        <java.version>1.8</java.version>
        <log4j2.version>2.17.0</log4j2.version>
    </properties>
```

## Gradle
### 使われているLog4Jのバージョン確認方法 
```
./gradlew dependencies --configuration runtimeClasspath | grep log4j
```

### build.gradle ファイルで、Log4jのバージョンを指定する方法
```
ext {
  set('log4j2.version', '2.17.0')
}
```

# References
* https://irof.hateblo.jp/entry/2021/12/10/180215
* https://qiita.com/flyaway/items/1df3ce9b4dae6f6e5e28
IntelliJで保存時に自動でPrettierを実行する方法

# 環境
- IntelliJ IDEA 2022.1
- File Watchersのプラグインを導入済み

# 設定
- prettierをインストール
```
$ yarn add -D prettier
```

- Preference->Tools->File Watchersから以下の設定で新規追加。
![スクリーンショット 2022-05-06 9.17.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229739/528bf540-3bdf-5c16-3360-a34077470212.png)
Twitterクローンを作ります #46 チャット機能(8)

今回は別ユーザーが投稿したメッセージをリアルタイムでチャット画面に表示していきましょう。
今回の実装は Cloud Run 上では多分うまく動かないので次回対応します。

# 方針

Socket.IOでは room という機能があって、roomに参加しているメンバーに対してだけメッセージを送信することができます。

なので、同じチャットを開いているユーザーがチャットに対応するroomに参加するような実装にすれば受け取ったメッセージを表示するだけでOKになります。

が、元のudemyの講座ではチャット画面を開いていないユーザーに、メッセージが来たことを知らせるために下記のような方針で実装しています。

- webアプリを開いた時点でユーザーIDをIDとするroomに参加する
- チャットで誰かが発言したら発言者以外のメンバーに対応するそれぞれのroomにメッセージを送る
- メッセージを受け取ったユーザーが該当のチャット画面を開いていればその画面に新しいメッセージを表示する

# 実装

```vue:client/src/App.vue
...
    const store = useStore();
    const socket = io();
    socket.onAny((event, ...args) => {
      store.dispatch("handleSocketEvent", { event, args });
    });
    store.dispatch("setSocket", { socket });
...
```

ルームへの参加はログイン後でなければならないので、ここでは接続だけしてイベントのハンドリングをstoreでできるようにしておきます。

```javascript:client/src/store/index.js
...
    async setSocket({ commit }, args) {
      commit("setSocket", { socket: args.socket });
    },
    async handleSocketEvent({ commit }, args) {
      switch (args.event) {
        case "message":
          commit("addMessage", { message: args.args[0] });
          break;
      }
    },
    async joinRoom({ state }, args) {
      state.socket.emit("join", { _id: args.id });
    },
...
```

この実装だと別のチャットを開いていてもメッセージが追加されてしまいますが、ざっくりとした動きをまず作ってしまいたいので放置します。

```python:server/main.py
...

@socketio.on("join")
def join(payload):
    if not payload.get("_id"):
        return
    join_room(payload.get("_id"))
```

```python:server/apis/chats.py
...

@app.route("/api/chats/<chat_id>/messages", methods=["POST"])
@login_required()
def create_message(chat_id):
    body = request.json

    user_id = session["user"]["_id"]
    error_message = Message.validate(body, user_id)
    if error_message:
        return error(error_message)

    chat = Chat._collection.find_one({"_id": ObjectId(chat_id)})
    if not chat or ObjectId(user_id) not in chat.get("users", []):
        return error("チャットが存在しないか、参加していないチャットです")

    message = Message(content=body["content"], chat=chat_id, sender=user_id)
    message.create()
    message = vars(message)
    message["sender"] = session["user"]
    message["_id"] = str(message["_id"])
    message["chat"] = str(message["chat"])
    message["created_at"] = str(message["created_at"])
    message["updated_at"] = str(message["updated_at"])

    for uid in chat.get("users"):
        if str(uid) == user_id:
            continue
        socketio.emit("message", message, room=str(uid))
    return jsonify(message)

...
```

自分以外にメッセージを送ります。

無理矢理感が結構強いものの、一応動くようにはなりました。

次回細かい部分を修正していきましょう。
Juliaでproxy経由でパッケージをインストールしたいけどエラーがでる時の解決策 v2

[Juliaでproxy経由でパッケージをインストールしたいけどエラーがでる時の解決策](https://qiita.com/cometscome_phys/items/d85ff2958f21d9a42a64)
こちらにproxy経由でのパッケージをインストールする解決策について述べました。

今回は、Artifact(ijlパッケージ)を入れたい時に遭遇するproxy問題を解決する方法について述べます。IJuliaとかを入れたいときにも依存関係でArtifactがあることがありますから、遭遇する人は結構頻繁に遭遇するかもしれません。


参考文献は

https://discourse.julialang.org/t/julia-1-6-libcurl-firewall-download-issue-windows-schannel-certificate-revocation-check-failure/58021/17

# バージョン
Julia 1.7.2

# 状況
プロキシ経由でウェブにアクセスしているけれど、入らないパッケージが時々ある。

# 解決策
以下のものをJuliaのREPLで入力します。


```julia
ENV["http_proxy"] = "http://<your_proxy>:<port>"
ENV["https_proxy"] = "http://<your_proxy>:<port>"
ENV["JULIA_SSL_NO_VERIFY_HOSTS"] = "github.com"
```
ここでyour_proxyなどには自分のproxyの情報を入れてください。どうやらcurlのproxy絡みのようです。
カスタムオブジェクトを使って休日を省く方法

[Answersで回答する時に使う情報のまとめ](https://qiita.com/Keiji_otsubo/items/9e6e0e946826133eddc7)


**元の質問**
[休日を削除する式](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000HD6wl)

**紹介されていた方法**
[カウント期間は、コードなしで Salesforce の週末と祝日を除外します](https://munawirrahman.medium.com/count-duration-exclude-weekends-and-public-holidays-in-salesforce-without-any-codes-285277df35d)

Opportunity オブジェクトとデフォルトの Holidays 設定オブジェクトのみを使用してこれを達成する方法を共有したいと思います。この記事の使用例は、作成日から完了日までの商談期間をカウントしたいというものです。

**同じ質問**

+ [ケース作成日時点からの営業日経過日数の算出方法について](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000JfhzZ)
100日後くらいに個人開発するぞ！day018

## 今日もHTML＆CSS初級編を復習してみた！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2632394/87f6c6a9-cba6-a85d-9158-50d3e6c5b5f4.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2632394/fde4deb1-2aa2-20d4-5264-4c46876b5995.png)


## 今日の備忘録

### HTMLの全体構造
- HTMLファイルには決められた型を書いていく必要がある
    - `<html>`要素の中に`<head>`要素と`<body>`要素が必要です。
        - `<head>`要素にはページに関する情報を記述
        - `<body>`要素には実際に表示したい内容を記述
- HTMLバージョンを指定する
    - HTMLのファイルではHTMLのバージョンを宣言する必要がある
    - 最新バージョンのHTMLを使うために宣言される`<!DOCTYPE html>`はDOCTYPE宣言と呼ばれる


### `<head>`要素の3つ
- ①文字コードの指定
    - 定型文：`<meta charset="文字コード">`
    - 文字コードを指定することで文字化けを防ぐことができる
    - HTMLで推奨されてるコードは"UTF-8"
- ②ページタイトルの設定
    - 定型分：`<title>タイトル</title>`
    - 指定されたタイトルはブラウザのタブ上に現れる
- ③CSSの読み込み
    - 定型文：`<link rel="stylesheet" href="CSSのファイル名">`
    - CSSを反映するにはHTMLの方で読み込む必要がある
ARの教科書まとめ 第一章

### ARの教科書まとめ

### 第一章

#### ARの目標
ARは物質世界に直接、情報を提示することが目的としている点で、全てコンピュータ上に表示されるVRとは異なる。
そのため、現実世界と仮想世界の橋渡しをすることが最大の目標である。

#### ARのインタラクティブ性
よくARやVRなどで使用されるインタラクティブ性とは人とコンピューターがインターフェイスで強く結びつきフィードバックループを繰り返すことである。（ARのフィードバックループの主な要素は後述）
利用する側がARシーンを能動的に享受する。
ARシステム側は逆に利用者の視点や姿勢をトラッキングすることで利用者の状態と入力を受け取る。それと、現実世界における仮想コンテンツの中身とその位置姿勢を紐付けることで視覚情報を提供する。

#### ARの定義
* 現実と仮想の組み合わせである。
* 実時間で動作する応答性を備えている。
* 3次元的に整合性が取れているもの

注意点
ARというと視覚情報（現実世界に仮想コンテンツを表示すること）だと認識している方が多いが、広義の意味でAR（拡張現実）は視覚メディアにとらわれるものではない。
聴覚や味覚など、さまざまな現実世界を拡張する手段として用いられる。

#### ARに必要な3つの構成要素 + 1
* トラッキング機能（実世界で利用者の位置を決定する機能）->これらで位置を決定し実世界モデルを生成する。
* 登録機能（可視化機能で作られた仮想世界モデルとトラッキング機能で生成された実世界モデルを同じ座標系に落とし込む機能のこと）
* 可視化機能(仮想コンテンツの位置合わせから現実世界への表示を行う機能)

四つ目
+ 空間モデル(現実世界と仮想世界の情報)を保存する機能（データベース）

ARは上記の機能をARに適応したデバイスで行い、フィードバックループすることで視覚情報を提供する。
AWS公式資料で挑むMLS認定(2)-AI/機械学習(ML)の基本

##### [前回] [AWS公式資料で挑むMLS認定(1)-試験ガイドを読む](https://qiita.com/mingchun_zhao/items/149aedc35b69e25a4c07)

## はじめに

Amazon AI/機械学習の関連サービスを理解する前に、
まずは、AI/機械学習の基本知識から。

## 人工知能(AI: Artificial Intelligence)とは

- AIとは
    - 人間の知能に関連する認知的問題の解決に取り組む、コンピュータサイエンスの分野
        - 学習
        - 問題解決
        - パターン認識
- 機械学習の由来
    - 研究者Pedro Domingos教授の機械学習の"5部族"
        - 論理学と哲学に由来するシンボリスト
        - 神経科学から派生したコネクショニスト
        - 進化生物学に関連する進化論主義者
        - 統計学と確率に取り組むベイジアン
        - 心理学に由来するアナロジー主義者
    - ※ 機械学習のさまざまなアルゴリズムの背景がわかったような。。。
- 学習手法
    - 教師あり
        - トレーニングデータ(学習データ)に事前用意の正解を与えた状態で学習させる手法
    - 教師なし
        - トレーニングデータに正解を与えない状態で学習させる手法
- データとAI
    - データはAIの燃料で、データが増えるほど賢くなり、学習速度が増加
    - データはどこから
        - Amazon Redshiftなどデータウェアハウスから収集および抽出
        - Mechanical Turkなどのグランドトゥルースにより
            - グラウンドトゥルース(Ground truth)とは、推論ではなく、直接の観察と測定によって提供される、真実であることがわかっている情報
        - Kinesis Streamsにより動的に取り出される
        - IoTのセンサー技術により、さまざまなソース、場所、対象、イベントから入手

## 機械学習(ML: Machine Learning)とは

- 機械学習(ML)とは
    - 人工知能の領域から派生したコンピュータサイエンスの分野
    - 名前の由来は、パターン認識や学習に使用されるいくつかのベイジアン技術から
- 機械学習の中核となるアルゴリズム
    - 記録されたデータに基づく`学習や予測`
    - 不確実性の下で効用関数の`最適化`
        - 効用関数(Utility Function)とは、物/エネルギー/情報/サービスなどの効用を数値におきかえた関数(数学モデルのこと?)
    - データから隠れた構造を抽出し簡潔に表現する`データ分類`
- 通常のプログラミングとの違い
    - 通常のプログラムコードは、所定入力に基づいて固有の出力を生成する
    - 機械学習は、プログラミングでは明示的解決、適用が困難な場合に使用
- 機械学習モデル(MLモデル)
    - データを使用し生成される統計的コード(関数)
    - MLモデルの機能
        - 所定の入力に基づいて結果を予測できる最適な関数を見つける
        - 入力サンプル(教師ありは出力サンプルもあり)から認識されたパターンに基づき適切な結果を出力
    - MLモデルの品質と量はトレーニングデータによって決まる
    - MLモデルの評価
        - 評価スコアを用いて、予測とパフォーマンスに関する統計的信頼性を確保
        - MLモデルまたは個別予測の決定に、評価スコアが必要不可欠

- ビジネスにおけるAmazon機械学習
    - Amazon社自身が、機械学習ベースのシステムに基づきビジネス構築した結果
        - ビジネスの成長
        - 顧客サービスと顧客選択の向上
        - 物流スピードと品質の最適化
    - AWSの機械学習関連サービスについて
        - 俊敏性と費用対効果を備えたITインフラストラクチャを利用できる
        - Amazon.com規模のミッションクリティカルな環境でテストされてから、AWSサービスとして公開される
    - 機械学習は従来のビジネスインテリジェンス(BI)を補完
        - BIは、過去のビジネスデータの報告に重点を置く
        - MLは、過去の傾向と取引に基づいて将来の結果を予測

- ビジネスへのML導入ステップ
    - 課題特定
        - ビジネスメリットがある適切な予測を選定
    - データ収集
        - 過去のビジネスメトリクス(取引、販売)に基づきデータ収集
    - MLモデル構築
        - 収集データに基づきMLモデル構築
    - MLモデル実行
        - モデルの予測出力をビジネスシステムに適用し意思決定

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523098/5d9a0fa5-35aa-728a-0ea0-3753debd3dcf.png)

※ 引用元: [企業への機械学習の導入](https://aws.amazon.com/jp/machine-learning/what-is-ai/)

- 機械学習のユースケース
    - 異常検出
        - 予期されるパターンまたはデータセット内で、他の項目と合致しない`項目/イベント/観測値`を特定
    - 不正検出
        - 不正または不適切な項目検出に役立つ予測モデルを構築
    - カスタマーチャーン
        - 顧客離れを検出し、プロモーションまたはカスタマーサービスなど前もって対処可能 
        - ※ カスタマーチャーンとは、一定期間離脱してしまったユーザーや、有料会員から無料会員にダウングレードしてしまったユーザー
    - コンテンツのパーソナライズ
        - 予測分析モデルを使用し、ユーザーの過去の行動パターンに基づき、商品/サービスの推奨やWebサイトフローの最適化

## おわりに

AI/機械学習の基本知識を勉強しました。
次回から関連サービスを一つずつマスターします、お楽しみに。

##### [次回] [AWS公式資料で挑むMLS認定(3)-深層学習(ディープラーニング)](https://qiita.com/mingchun_zhao/items/2ebf4300d5b39be94eec)
MMOCRを使ってOCRを作成する（Text Recognation)②

# はじめに

[こちら](https://qiita.com/ryosao/items/c0a0cc274508759bbdc7)で、MMOCRの文字認識のタスクの学習方法について解説しましたが、用意されているモデルは英数字記号のみの文字認識しか行うことができず、日本語の文字認識は行うことができません。

以下のコンフィグファイルでは、中国語用の辞書が用意されておりましたので、同じ形式で辞書を作成し、日本語などの文字認識を行う方法について解説します。

利用したコンフィグファイル

- sar_r31_parallel_decoder_chinese

# 使い方

前回同様以下にgoogle collaboratory上で動くサンプルをgithubで用意しています。
[サンプル](https://github.com/saotomryo/Use_MMOCR/blob/main/Use_MMOCR_sar_r31_parallel_decoder_chinese.ipynb)



辞書ファイルの利用部分以外は、ほぼ[前回](https://qiita.com/ryosao/items/c0a0cc274508759bbdc7)と同じ内容なので、割愛します。

今回は、以下の部分で利用する辞書ファイル部分の作成方法になります。
```
## アノテーションフォルダの設定
#　元になるテキストファイル
train_label_path = #訓練用ラベルファイルのパス
val_label_path = #検証用ラベルファイルのパス

# 画像ファイルのパス
train_img_path = #訓練用画像フォルダのパス
val_img_path = #検証用画像フォルダのパス

# ルートフォルダ
root_path = #ルートフォルダのパス

# 作業フォルダ（学習時のモデル出力先（エポック毎に出力))
work_path = #作業フォルダのパス


# 辞書ファイルのパス
dict_path = # 辞書ファイルのパス
```

## 辞書ファイルの形式

以下のような感じで、利用する文字毎に改行したテキストファイル準備するだけです。

label.txt

1  
2  
3  
.  
.  
あ  
い  
.  
.  
阿  
位  
.  
.

日本語OCRを作成したい場合など、日本で利用する漢字全体をモデルに含めた辞書ファイルを作成するとモデル容量も増え、学習時間も大量になるため、学習データに含まれる文字のみを辞書に含めるといった内容が現実的かと思います。

# OCR関係の投稿記事

[MMOCRを使ってOCRを作成する（Text Recognation)①](https://qiita.com/ryosao/items/c0a0cc274508759bbdc7)