OmniAICreator/Qiita-1.07M huggingface dataset:
Ubuntu 20.04 on WSLにおける認証Proxy設定

# Ubuntu 20.04 on WSLにおける認証Proxy設定

社内の認証proxyのせいで一筋縄でいかなかったので、proxyメモ

- 通常のproxy設定

```
proxy_id=name@domain→name%40domain
proxy_pass=password
https_proxy="http://${proxy_id}p:${proxy_pass}1@proxy.domain.com:port_number/"
http_proxy="${https_proxy}"
ftp_proxy="${https_proxy}"
```

- apt-get向けのproxy設定

以下のファイルを作成

```
$> sudo vi /etc/apt/apt.conf.d/30proxy
```

中身は以下の通り

```
Acquire::http { Proxy "http://name@domain:password@proxy.domain.com:port_number/"; };
Acquire::https { Proxy "http://name@domain:password@proxy.domain.com:port_number/"; };
```

これで、wgetもapt-getも動作するようになった。
AWSマネジメントコンソールの表示言語を変更する方法

# はじめに

みなさん、こんにちは。AWS マネジメントコンソールを使っていると、ごくごく稀に表示言語を代えたくなることはありませんか。私は日本語⇔英語を切り替えたくなるケースがたまにあります。

ただ、個人的に「設定」と言えばなんとなく右上の項目からできそうなイメージがあり、「あれ、設定ってどこから変えるんだっけ、、、アカウントへ飛んだ先にあったっけ、、、(答え、アカウントへ飛んだ先にはない)」みたいにウッカリ設定方法を忘れて途方にくれてしまうことがあります。みなさんはそんな経験ございませんかね？ということで自分への備忘も込め、今回は表示言語の設定方法について紹介していきたいと思います。

![01-where-is-settings.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613908/1ac0ef0f-ed82-a5c6-a725-3999aaf5876c.png)


# 表示言語の変更方法

では早速答えですが、言語の設定方法はAWS マネジメントコンソールの左下部分にございます。(なるほど、ここだったか、、、)

![02-language-settings.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613908/32edf040-b792-c0b8-c815-b08eb7544005.png)


# 終わりに

いまさらの情報でしたがいかがだったでしょうか。こんな記事でもだれかの役に立っていただければ幸いです。以上、AWS マネジメントコンソールの表示言語を変更する方法でした。

---

- AWS は、米国その他の諸国における Amazon.com, Inc. またはその関連会社の商標です。
- その他、本資料に記述してある会社名、製品名は、各社の登録商品または商標です。
SFSafariViewController を SwiftUI でいい感じに使う

## はじめに
Webページを表示したい(例えばお問い合わせフォーム)時に`SFSafariViewController`を使うと思いますが、SwiftUIでは一つのViewとして扱うことが出来ます。
UIをオーバーレイしたいとかで、WKWebViewを頑張ってカスタマイズせずに利用出来ます。

## 実装

```swift
import SwiftUI
import SafariServices

struct SafariView: UIViewControllerRepresentable {
    var url: URL
    typealias UIViewControllerType = SFSafariViewController
    
    func makeUIViewController(context: Context) -> SFSafariViewController {
        let config = SFSafariViewController.Configuration()
        config.barCollapsingEnabled = false
        let safariViewController = SFSafariViewController(url: url, configuration: config)
        return safariViewController
    }
    
    func updateUIViewController(_ uiViewController: SFSafariViewController, context: Context) {
    }
}

struct SafariView_Previews: PreviewProvider {
    static var previews: some View {
        SafariView(url: URL(string: "")!)
    }
}
```
代表的なDBとAWSのマネージドサービスの対応

代表的なDB（ソフトウェア）とAWSマネージドサービスの紐づけです。
 
| 分類 | 代表的なDB | ** AWS **
|:------------:|:------------:|:------------:|
| リレーショナル | Oracle,MySQL,PostgreSQL,, | Amazon RDS
| Key Value | Redis,Hibari | Amazon DynamoDB 
| カラム（列）指向 | Apache Cassandra, Apache HBase | Amazon Redshift
| ドキュメント指向 | MongoDB、Apache CouchDB | Amazon DoumentDB
| グラフ指向 | Neo4j | Amazon Neptune
## 参考
https://qiita.com/TaigoKuriyama/items/ed2ce1d04b8586461d1c
mayaの環境を構築していく    １日目

個人的な勉強の為にmayaを導入

今まで手元にあったmayaは2016で保守プラン切ってしまったので、
maya インディーを購入しました。

1年半ぶり何回目かのグランドゼロな環境なので、mayaの作業環構築のログを残していこうかと思います。


DLとインストール
--
割愛・・・・したいけれども一応。
現在　mayaの最新版は2022ですが、2020を使いたいので2020のインストーラーをDLしてきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1484234/ca8b0180-e2b4-9fd8-b699-33d639c48aa8.png)

オートデスクのページにログインして、製品とサービスからDL可能なverを探してDLしました。

※DL出来るのは　最新verを含めた4verなので、2023がリリースしたら2018が押し出されます。

ここからあとのインストール工程は割愛

mayaの起動
--
完全に初回起動の場合、プリファレンスが無いので新規に作るか過去verの物をコピーしてくるかを問われます。
今回は完全新規でやりたいので新規で。

maya起動完了
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1484234/2025525a-f971-a327-c1f5-979ea01d2ffb.png)

わかっていたことだけども、日本語UIなのでmayaを終了。
※英語UIに慣れてしまったので日本語UI苦手なのです。
※日本語UI導入されたのっていつでしたっけねぇ？　リリース当時「ついに日本語対応か！」って思って触り始めて、「うん？あれ？なんかやりづらい」　ってなって英語に戻しました。
※蛇足ですが一番最初に触ったmayaは4.0だったかな。
閑話休題

mayaの起動バッチを作る
--

mayaを英語UIで起動する方法はいくつかあるのですが、今回は batファイルからmayaを実行する方法にしてみようかと。

- batファイルを作る
    
任意の場所に maya2020.bat  というファイルを作成。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1484234/1dc0cef6-cd18-d77e-aa8a-073b82aa504c.png)

- batファイルの中身編集

テキストエディタ（メモ帳でもなんでも）でファイルを開いて編集

    SET MAYA_UI_LANGUAGE=en
    "D:\Program Files\Autodesk\Maya2020\bin\maya.exe"

こんな感じ。
※mayaのインストール先は普通はCドライブですが、手元の環境ではDドライブにしています。
1行目で　mayaのUIを一時的に英語として設定
2行目で　mayaを呼び出し


batファイルを編集した時に嵌るのが、変にスペースとか入れると途端に動かなくなるので注意。

    SET MAYA_UI_LANGUAGE = en
    "D:\Program Files\Autodesk\Maya2020\bin\maya.exe"

こうしただけで、1行目は処理されないので日本語UIで立ち上がってしまいます。

めでたく英語で立ち上がりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1484234/383bd2bf-019d-948f-c862-0f582db3b101.png)

もうmayaの環境構築終わったも同然なので、続きは次回。
改行なしのBase64エンコードをする方法いろいろ

[data URI]:https://ja.wikipedia.org/wiki/Data_URI_scheme
HTMLで画像を本文中に埋め込む場合などに、[data URI]を利用することがあります。

例えばこんな感じに使用します：
```
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==" alt="Red dot" />
```

この際、データは基本的には<sub>※例外下記</sub>改行なしのBase64エンコード文字列として埋め込みますが、この文字列を生成するための様々な方法に関する備忘録です。

※補足: 上記の例のように HTML5 の src アトリビュートに埋め込むような場合では、空白があっても無視されるので問題ないようです。

## openssl

`-A` オプションを付けると改行がなくなります。

```
openssl base64 -A -in INPUT_FILE -out OUTPUT_FILE
```

## base64 コマンド

同じ `base64` という名前のコマンドが複数プラットフォームにあって、かつオプションが微妙に異なるようです...

### MacOS版

```
base64 -i INPUT_FILE > OUTPUT_FILE
```

### GNU Coreutils

`-w` オプションで改行までの長さを変更可能。`-w 0` にすると改行がなくなります。

```
base64 -w 0 INPUT_FILE > OUTPUT_FILE
```

## Perl ワンライナー

`encode_base64()` の第２引数によって区切りの変更ができます。

```
perl -MMIME::Base64 -0777 -ne 'print encode_base64($_,"")' < INPUT_FILE > OUTPUT_FILE
```

## Ruby ワンライナー

```
ruby -r base64 -e "print Base64.strict_encode64($_)" < INPUTFILE > OUTPUT_FILE
```
[encode64](https://docs.ruby-lang.org/ja/latest/method/Base64/m/encode64.html) ではなく、 [strict_encode64](https://docs.ruby-lang.org/ja/latest/method/Base64/m/strict_encode64.html) を使うのがポイント。

## Python ワンライナー

あまり上品じゃないが以下で可能

```
python -c "import sys,base64;print(base64.b64encode(sys.stdin.buffer.read()).decode())" < ¥
INPUT_FILE > OUTPUT_FILE
```

ちなみに改行発生していいならもっと楽。残念ながら改行をなくすためのオプションが無い。

```
python -m base64 < INPUT_FILE > OUTPUT_FILE
```
アロー関数

変数を定義して、関数を代入する時

```
var 変数名=function(){};
```

と記述しますが

```
var 変数名=()=>{};
```
上記コードの=>のように矢印っぽいのを入れて
functionを抜いても同じ意味になるそうで
この関数の定義の仕方を「アロー関数」というそうです
「矢」っぽいからわかりやすいですね！
【TypeScript】『any』は悪なのか？？



#結論：理由なくanyを使うのは問題
> どうしてもanyを使わないとならない場面
型安全性を妥協した上で、まずは動くコードを形にすることを優先する

といったこともありえます。

anyをどこまで許容するか、
型チェックをどこまで厳格にするかは、
チームの熟練度やプロジェクトの方針によるところが大きいです。


#「がんばらないTypeScript」というアプローチ
たとえば、コンパイルエラーで詰まった時に any型 を指定すれば、
とりあえずコンパイルエラーを解消することができます。


<b>すべてが型安全な実装になっている状態が理想</b>ですが、
一部分だけが型安全な実装になっているだけでも、
型チェックがまったくないJavaScriptだけのときよりも大きな恩恵を受けることができます。

<br>
##型の制約に時間を費やして、動くモノが作れないのは本末転倒

```
型による制約はコードをより安全に書くためのひとつの手段にすぎません。
型の制約に時間を費やして、動くモノが作れないのは本末転倒です(´;ω;｀)
```
Firebase Storageで処理がタイムアウトしないよー

##はじめに
Firebase Storage、アプリから便利に使ってますが、オフライン時に処理が全くタイムアウトしないことが発覚:joy:

まあなんとかなったので、ご報告
##どうやる？
iOSは

```ObjC
    FIRStorage *storage = [FIRStorage storage];
    const int timeout=5;    //5秒
    storage.maxOperationRetryTime=timeout;
```
これはdeleteするとき。Operation以外にUploadとDownloadもある。リトライだけど5秒で終わる。

androidは

```Java
        FirebaseStorage storage = FirebaseStorage.getInstance();
        final long timeoutMS = 5000;    //5秒
        storage.setMaxDownloadRetryTimeMillis(timeoutMS);
```
なぜかdeleteはDownloadの方:sweat_smile:　おいおい。

##最後に
アップロード・ダウンロードのタイムアウト、デフォルトは10分ですって。巨大ファイルの時もあるので、まあいいのかな。

今回も手抜き。
[2022Feb] Microsoft Power Automate Desktop の始め方

# はじめに

かつて Windows 11 リリース前の 2021 Apr 頃に Power Automate Desktop を試したことがありました。先日ふたたび利用しようとしたら、かつてのインストール手順が通用しなくなっていました。似たような手順が再現できないか探ってみて、再現できたので、メモを残します。

ほか、サインインで困ったこともあったので、その対処の記録も残します。


# 手順の正当性について

下記の手順の正当性については、「かつて作成したフローに再びアクセス出来たこと」をもって、満たしていると判断しています。

その他の観点では不足が有り得ると思います。あしからず。


# 利用開始手順の概要

1. インストーラのダウンロード
1. インストール
1. ブラウザ拡張のインストール（任意）
1. アプリ起動
1. Microsoft アカウントでサインイン


# つまづきポイント

### インストール

[ポータルページ](https://powerautomate.microsoft.com/ja-jp/desktop/)内で "Windows 10" を検索し近傍にある「無料でダウンロードする」をクリックすると、Microsoft Store の Power Automate ページに誘導されます。Microsoft Store からでも Power Automate はインストール可能でしたが、Power Automate Desktop と同じものかどうか不明なので、別のインストール方法を探しました。


### インストーラのダウンロード

[ポータルページ](https://powerautomate.microsoft.com/ja-jp/desktop/)のトップにある「無料トライアルを始める」をクリックすると、[インストーラのダウンロードページ](https://docs.microsoft.com/ja-jp/power-automate/desktop-flows/install)に移動します。ダウンロードページ本文冒頭の「Power Automate のインストーラーをダウンロードします。」もしくは「Download the Power Automate installer.」をクリックすると、インストーラファイルのダウンロードが開始されます。

ダウンロードされるファイルの名称は `Setup.Microsoft.PowerAutomate.exe` です。ファイルのプロパティを覗くと文字列 "Power Automate for desktop" が見つかりました。
![property of Setup.Microsoft.PowerAutomate.exe](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150857/79b0892d-fa72-50ba-d806-6017af365a3f.png)

同手順でダウンロードされるファイルの名称は、かつては `Setup.Microsoft.PowerAutomateDesktop.exe` でした。
![property of Setup.Microsoft.PowerAutomateDesktop.exe](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150857/6db79e1f-d503-99a2-89e2-04491df700dc.png)


### アプリ起動

アプリは Power Automate という名称です。スタートメニューやデスクトップのショートカットは Power Automate という名称になっています。

かつては Power Automate Desktop という名称でした。


### Microsoft アカウントでサインイン

アプリ Power Automate はクラウドなくして利用できません。クラウドにサインインした場合のみ利用できます。
Power Automate のサインイン用のウィンドウは Microsoft Edge のコンポーネントを利用して表示されているようです。もし先行して Microsoft Edge で Microsoft クラウドにサインインしていると、期待どおりサインインできない場合があります。

たとえば、１手順目のメールアドレス入力画面に入力したメールアドレスと、２手順目のパスワード入力画面に表示されるメールアドレスが異なる、つまり、１手順目で入力したメールアドレスが無視されて、既にシステムが知っている別のメアドを通知してくる、などです。
（この２手順目をキャンセルしたら、Power Automate が大量の excepsion を吐いて制御不能になりました。）

必ず事前に Microsoft Edge にて Microsoft クラウドからサインアウトしておくべきです。

サインインされた状態かサインアウトした状態かの厳密な確認方法は不明なため、下記を実施するのが安全と考えます。

1. Microsoft からのサインアウト
1. Microsoft Edge 自体でのサインイン※の解消
1. 履歴その他の完全な消去
1. プロファイルの削除

※別ＰＣとのブクマの同期などをする機能のことです。


# おわりに

2021 Oct 5 の Windows 11 リリースや、Microsoft Store の推進、Power Automate 製品群の整理など、色々と流転している感じです。
情報の陳腐化が激しい、というナウなトレンドの体現を突きつけられた気分です。

こういう時代の、こういう分野のサスティナビリティとは何か、考えさせられます。
ビリビリ！　アニメの超解像モデル 

#アニメに最適化された超解像モデルを使う方法です
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/d145995b-c05e-9cbd-3c9a-14adf7024420.jpeg" width=400>元画像
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/0dcaf256-c1e7-c0ef-8b78-bf8df8be2fac.jpeg" width=400>超解像


#何気なくみているアニメも実はアーティファクトがあったりする

#Real-CUGANでスッキリ
ノイズを取り除き、4倍にまで超解像できます。

#方法
リポジトリをクローンして、事前トレーニング済みのweightをダウンロードします。

https://github.com/bilibili/ailab

upcunet_v3.pyからモデルをインポートして実行します。

```python
import cv2
upscaler2x = RealWaifuUpScaler(4, "/content/drive/MyDrive/updated_weights/up4x-latest-denoise3x.pth", half=True, device="cuda:0")
frame = cv2.imread("im.png")
frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
result = upscaler2x(frame, tile_mode=tile_mode)[:, :, ::-1]
cv2.imwrite("result.png", result)
```
元画像
![mononoke.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/b7f9309b-abb0-f6a7-7dc6-302f3723915d.jpeg)
超解像
![cfdba9d8-3348-43ca-9897-ad2218efe811](https://user-images.githubusercontent.com/23278992/152456001-522c2eab-94cc-4a92-9dc1-3e41fb32019e.png)

拡大して比べてみると、綺麗になっているのがわかります。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/d145995b-c05e-9cbd-3c9a-14adf7024420.jpeg" width=400>元画像
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/0dcaf256-c1e7-c0ef-8b78-bf8df8be2fac.jpeg" width=400>超解像

#動画にも
リポジトリにはビデオに適用できるスクリプトもあります。

🐣
****
フリーランスエンジニアです。
お仕事のご相談こちらまで
rockyshikoku@gmail.com

Core MLやARKitを使ったアプリを作っています。
機械学習／AR関連の情報を発信しています。

[Twitter](https://twitter.com/JackdeS11)
[Medium](https://medium.com/@rockyshikoku)
【Next.js】混同しやすいSSR, SSG で使う関数

迷ったときは公式ドキュメント🐾

https://nextjs.org/docs/basic-features/data-fetching/overview


プラスわかりやすい方はこちら
![スクリーンショット 2022-02-04 103539.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684145/c9cfdd43-8af1-9ed3-1d27-7e381b2f1285.png)


https://nextjs-ja-translation-docs.vercel.app/docs/basic-features/data-fetching




#getServerSideProps（SSR）

https://nextjs.org/docs/basic-features/data-fetching/get-server-side-props

#getStaticProps（SSG）

https://nextjs.org/docs/basic-features/data-fetching/get-static-props


#SSR SSGってなんぞ？

https://zenn.dev/bitarts/articles/37260ddb28ae5d
【アルゴリズム】メモ化再帰関数を用いた高速化

## はじめに
本記事ではフィボナッチ数列を題材にして、メモ化再帰関数を用いた高速化についてまとめたいと思います。

再帰関数ってなに？って方は[再帰関数についての記事](https://qiita.com/_taketeru/items/18ac27d865629192497c)をご覧ください。

## メモ化再帰関数とは
再帰関数内で、同じ引数の再帰関数を複数回呼び出すような実装では、その計算結果を保持しておくことで、複数回呼び出さないような実装にしようというのがメモ化再帰関数です。計算結果を配列に代入するという処理を加えるだけなので、非常に簡単にできる高速化になります。

## フィボナッチ数列とは
フィボナッチ数列とは、以下のように定義される数列です。

```math
F_0=0, F_1=1\\
F_N = F_{N-1}+F_{N-2}(N=2,3,...)
```

## 再帰関数によるフィボナッチ数列の実装
通常の再帰関数で実装すると以下のようになります。

```c++
#include <iostream>
#include <vector>
using namespace std;

vector<int> cnt(11);

int calc_fibo(int N){
  cnt[N]++;

  if (N == 0) return 0;
  else if (N == 1) return 1;

  return calc_fibo(N - 1) + calc_fibo(N - 2);
}

int main(){
  cout << calc_fibo(10) << endl; // 55
  int total = 0;
  for (int i = 0; i < cnt.size(); ++i) {
    cout << "calc_fibo(" << i << "):" << cnt[i] << "回" << endl;
    total += cnt[i];
  } 
  cout << "total:" << total << "回" << endl;
}
```

上記のコードの出力は以下のようになります。

```
55
calc_fibo(0):34回
calc_fibo(1):55回
calc_fibo(2):34回
calc_fibo(3):21回
calc_fibo(4):13回
calc_fibo(5):8回
calc_fibo(6):5回
calc_fibo(7):3回
calc_fibo(8):2回
calc_fibo(9):1回
calc_fibo(10):1回
total:177回
```

出力を見ると、同じ関数が何度も呼ばれていて、計算量やメモリの観点から効率が悪いことがわかります。そこで、一度計算した値を保持しておくことで、無駄に関数を呼び出さなくて良くなります。

## メモ化再帰関数による高速化
メモ化再帰関数で実装すると以下のようになります。memo配列の値はありえない数値で初期化しておきます。

```c++
#include <iostream>
#include <vector>
using namespace std;

vector<int> cnt(11);
vector<int> memo(11, -1);

int calc_fibo(int N){
  cnt[N]++;

  if (N == 0) return 0;
  else if (N == 1) return 1;

  if (memo[N] != -1) return memo[N];

  return memo[N] = calc_fibo(N - 1) + calc_fibo(N - 2);
}

int main(){
  cout << calc_fibo(10) << endl; // 55
  int total = 0;
  for (int i = 0; i < cnt.size(); ++i) {
    cout << "calc_fibo(" << i << "):" << cnt[i] << "回" << endl;
    total += cnt[i];
  } 
  cout << "total:" << total << "回" << endl;
}
```

上記のコードの出力は以下のようになります。

```
55
calc_fibo(0):1回
calc_fibo(1):2回
calc_fibo(2):2回
calc_fibo(3):2回
calc_fibo(4):2回
calc_fibo(5):2回
calc_fibo(6):2回
calc_fibo(7):2回
calc_fibo(8):2回
calc_fibo(9):1回
calc_fibo(10):1回
total:19回
```

計算結果をmemo配列に保持しておくことで、関数の呼び出し回数が177回から19回に激減しました！

## 最後に
本記事ではメモ化再帰関数についてまとめました。次は動的計画法についての記事を書きたいと思ってます！（メモ化再帰関数もそれに似てますが）
【Laravel 8.x】Factoryヘルパーを瞬時にStaticメソッドに変換しませんか？

# Laravel-Factory-Refactor

Laravel 8.x からFactoryの呼び出し方が大きく変更されました。

```php:Laravel7.x以前
//ヘルパー
factory(User::class)->make()
```

```php:Laravel8.x以降
//staticメソッド
User::factory()->make()
```

上記の変更をコマンド１つで完結できるパッケージを作成しました。

https://packagist.org/packages/wadakatu/laravel-factory-refactor


## How to Use

### 1. パッケージをインストール

```bash
composer require wadakatu/laravel-factory-refactor --dev
```

### 2. Artisanコマンドを実行

```
php artisan refactor:factory
```

### 3. 結果を確認

```php:Before
factory(User::class)->make();
factory(App\Models\User::class)->make();
factory(User::class, 10)->make();
factory(App\Models\User::class, 10)->make();
```

```php:After
User::factory()->make();
App\Models\User::factory()->make();
User::factory()->count(10)->make();
App\Models\User::factory()->count(10)->make();
```

## きっかけ

最近、業務でLaravelのバージョンアップ作業を行なっています。
その中で、UT内のFactoryヘルパーを手直しでStaticメソッドに変更するのがとても大変だったので、このパッケージを作りました。

アップグレード作業している方の負担を少しでも減らすことができれば本望です。。

## 最後に

生まれたてほやほやのパッケージなので、これから不具合や物足りない点など出てくると思います。
その都度改修して、より良いパッケージにしていきます。

https://github.com/wadakatu/laravel-factory-refactor

**プルリクエスト**, **スター**お待ちしております。

最後まで読んでくださり、ありがとうございました。
Linux MINT にXAMPPをインストール

久々に、virtual BOXに作ったLinux MINTの仮想マシンに、XAMPPをインストールしました。
その手順を忘れないように、記録します。

参考した記事
https://style.potepan.com/articles/19086.html

最初にダウンロードのURLを確認します。
https://www.apachefriends.org/download.html
ここで、最新のXAMPPのダウンロードボタンからURLを確認します。
ブラウザを右クリックして、リンクURLをコピーなどを使うと楽です。

```bash
 wget https://www.apachefriends.org/xampp-files/8.1.2/xampp-linux-x64-8.1.2-0-installer.run --no-check-certificate
```
証明書がないとエラーが出ましたので、'--no-check-certificate'を付けてダウンロードしました。

```bashsh
chmod +x ./xampp-linux-x64-8.1.2-0-installer.run 
```
全権限を付けました。

```bash
sudo ./xampp-linux-x64-8.1.2-0-installer.run
```
スーパーユーザーの権限で、インストールを行いました。


実は、古いPHPのバージョンでテストする必要があり、古いPHPのXAMPPを使っていました。
ですがWordPressのテストの必要が生じて、一度XAMPPをアンインストールして、今回の手順を行いました。

アンインストールは、こちらの記事を参考にしました。http://hitokotoubuntu.blogspot.com/2019/08/xampplinux.html

```bash
cd  /opt/lampp
sudo  ./uninstall
```
これで、アンインストールできます。
トランザクションがどうたらこうたらって出てアプリインストール出来なかったので

[アップル サポート 電話でググって](https://www.google.com/search?q=%E3%82%A2%E3%83%83%E3%83%97%E3%83%AB+%E3%82%B5%E3%83%9D%E3%83%BC%E3%83%88+%E9%9B%BB%E8%A9%B1&rlz=1C1TKQJ_jaJP991JP991&oq=%E3%82%A2%E3%83%83%E3%83%97%E3%83%AB%E3%80%80%E3%81%95%E3%81%BD%E3%83%BC&aqs=chrome.2.69i57j0i4i512l9.5544j0j7&sourceid=chrome&ie=UTF-8)
出てきたAppleサポートの電話番号：
に電話して解決しましたー

とメモらせて頂きます。
【 識別子（identifier）とそのルール 】

現在Javaを学習中なので、その備忘録としての投稿になります。

## 識別子とは
`変数名`、`関数名`、`プロパティ名`、`ファイル名`等を宣言・命名するときに使える、
`文字や数字の並び`のことです。
名前を何にするかは自由ですが、通常は、
`アルファベット`、`数字`、`アンダースコア(_)`、`ドルマーク($)`などを組み合わせて作ります。

## ルール
名前を何にするかは自由とは言え、`ルールや慣習`があり、それを守らなければなりません。
### ①予約語を使わない
予約語とは、すでに使われている、`「int」`、`「void」`、`「static」`のような単語のことです。
宣言・命名にはこれらを利用することはできません。

### ②既に使っている変数名の利用
例えば、既に変数nameを宣言しているのに、再び変数nameを宣言するようなことをしてはいけません。
同名の2つの変数の区別ができなくなるからです。

### ③文字の大小の違いは区別される
大文字/小文字、全角/半角は完全に区別されます。
例えば、変数nameと変数Nameは全くの別物になります。

### ④小文字で始める
慣習的には、変数には`小文字`で始まる`名詞系`の名前を宣言します。
また、複数の単語を繋げて変数名にする場合、`「myAge」`のようにキャメルケースを用いて命名します。

## まとめ
変数名、関数名、プロパティ名、ファイル名を宣言・命名するときには以上の様なルール・慣習に気を遣わなければなりません。
GitBash

## 1. `GitBash`
```ruby:Githubコマンド

■タグ付け
作業ブランチに対してタグ付けを行う
cd /c/git/develop/aaaaaa
git tag tagtnm_20220203_02

1-0.チェックアウト
1)作業ブランチ（dev_wk）をチェックアウト
Git Bashで以下のコマンドを実行する。

	cd /c/git
	mkdir dev_wk
	cd dev_wk
	git clone htmessage.txttps:xxxx-yyyy.x-network.jp/aaaaaa/_git/aaaaaa_bbbb
	cd maaaaaa_bbbb
	git checkout dev_wk

2)コミットのデフォルトメッセージを設定する。

	git config --global commit.template /c/git/develop/maaaaaa_bbbb/.gitmessage.txt


■Git Bash起動

git config --global user.name "ユーザー名"
git config --global user.email "メールアドレス"
git config --global color.ui.true
git config --global alias.st.status
mkdir c:/git
mkdir c:/git/develop

1.mgaisai_docプロジェクトのチェックアウト
cd C:\git\develop
git clone https://xxxx-yyyy.x-network.jp/aaaaaa/git/aaaaaa_bbb
cd C;\git\develop/aaaaaa_bbb
git checkout develop
git log --online

2.aaaaaa_bbbbプロジェクトのチェックアウト
cd C:\git\develop
git clone https://xxxx-yyyy.x-network.jp/aaaaaa/git/aaaaaa_bbbb
cd C;\git\develop/aaaaaa_bbbb
git checkout develop
git log --online

3.aaaaaa_bbbb_ccccプロジェクトのチェックアウト
cd C:\git\develop
git clone https://xxxx-yyyy.x-network.jp/aaaaaa/git/aaaaaa_bbbb_cccc
cd C;\git\develop/aaaaaa_bbbb_cccc
git checkout develop
git log --online

```
ダイジェスト認証をやってみよう

## 勉強前イメージ

すぐできそうではある。

## 調査

### そもそもダイジェスト認証 とは

ダイジェスト認証は、一言で言えばbasic認証のパワーアップ版になります。
詳細は [こちら](https://qiita.com/miyuki_samitani/items/19f691311089d659ea38) をごらんください

### ダイジェスト認証してみる！

- ダイジェスト認証設定前のwebページ

ただの文字列が表示されるだけのwebページ

![1Mozilla Firefox 2022-02-03 18.19.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/f4052cd4-26b6-29c0-44fc-7c70fc1a7045.png)


- ダイジェスト認証のファイルを作成

`htdigest -c [ファイルパス] '[認証名]' [ユーザー名]` のコマンドを使用します。
実行例が以下です。

```
htdigest -c /etc/httpd/conf.d/.digestpass 'Digest Auth Test' admin
```

```
[root@localhost conf.d]# htdigest -c /etc/httpd/conf.d/.digestpass 'Digest Auth Test' admin
Adding password for admin in realm Digest Auth Test.
New password: [adminのパスワードを入力]
Re-type new password: [adminのパスワードを再入力]
```

- 認証ファイルの確認

生成された認証ファイルです。

```
cat /etc/httpd/conf.d/.digestpass
```

```
admin:Digest Auth Test:a9502XXXXXXXXXXXXXXXXXXX
```

- 設定ファイルに追記

```
vi /etc/httpd/conf/httpd.conf
```

設定に以下に記載しているものを追記します。

- `AuthType` : 認証方法。ちなみにbasic認証だと Basic が入る
- `AuthName` : 認証名
- `AuthUserFile` : パスワードファイルのパス
- `Require` : valid-userにすると全ユーザになる。ユーザ名を指定することも可能

```
<Directory "/var/www/html">
    AuthType Digest
    AuthName "Digest Auth Test"
    AuthUserFile "/etc/httpd/conf.d/.digestpass"
    Require valid-user
</Directory>
```

- httpdの再起動

```
service httpd restart
```

- ダイジェスト認証設定後のwebページ

basic認証と一緒の表示がされます。

![2Mozilla Firefox 2022-02-03 18.33.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/66acd7e8-e3b2-4344-cb49-04fc44e646e3.png)


## 勉強後イメージ

大体わかってたけど、あまりbasic認証とほぼ変わらんねw

## 参考

- [Digest認証の設定手順](https://laboradian.com/setting-up-digest-auth/)
- [ApacheでBASIC認証（パスワード認証）を設定する](https://pointsandlines.jp/server-infra/basic-authorize)
- [ApacheでDigest認証を設定する](https://blog.junpeko.com/apache-digest-auth)
LV2プラグインの作り方 (2) WindowsでのLV2開発

最近になって音楽制作環境をWindowsに移行したので、WindowsでのLV2プラグインの実装方法についてざっと調べてみた結果のメモ書き。なおLV2=LADSPA v2=Linux Audio Developer's Simple Plugin API v2という名前からしてもLinux専用だと思っていたのだが、実際にはLV2プラグインのホストとなるアプリケーション（大体の場合DAW[^1]）さえあれば特にLinux専用というわけでもないようだ。

なおCコンパイラやツールチェインはMinGWを利用している。また、後述のLV2ライブラリのビルドにwafが使われているので、そのためにPythonも必要になっている。

* https://www.mingw-w64.org/
* https://www.python.org/


## LV2ライブラリのインストール

特にバイナリパッケージが公式に用意されているようではなさそうなので、アーカイブを落としてくる必要がある。

* https://lv2plug.in/

展開したアーカイブのルートで下記のようにコマンドを打てばよい。

```
$ ./waf configure --prefix=/d/lib --lv2dir=/d/lv2
$ ./waf
$ ./waf install
```

prefixはヘッダファイルやライブラリのインストール先、lv2dirはバンドルされているLV2プラグインのインストール先になるので、各自の環境に合わせて読み替える事。

## LV2プラグインのビルド

ビルドするプラグインは以前作ったこれ。

* https://github.com/ckuwata/audio-plugins/tree/master/tube-fucker


```
$ gcc -std=c99 -I /d/lib/include/ -DLV2_VERSION="1.18.2" -DHAVE_LV2=1 -o  tube-fucker.dll  -shared  tube-fucker.c
```

※ttlファイルで参照するライブラリは.dllに書き換えておくこと。

[^1]: Digital Audio Workstation。録音したり編集したりMIDIを打ち込んだりするするためのアプリケーション。私は[Ardour](https://ardour.org/)を15年ぐらい愛用している。クロスプラットフォームだし。
【Unity】UnityとAndroid SDK & NDK Toolsをインストールする時に「ダウンロードが失敗しました: Validation Failed」とエラーが出る


Uninty Hub から「Android SDK & NDK Tools」をモジュール追加しようとすると、
「ダウンロードが失敗しました: Validation Failed」とエラーが出て追加できず、
結構ハマってしまったのでその議事録です。

# 結論
筆者の環境では、ファイアウォールの設定で解決しました。

コントロールパネル > システムとセキュリティ > Windowsファイアウォールによるアプリケーションの許可　> Unity Hub の項目をチェックして、「ドメイン / プライベート / パブリック」は環境に応じてチェック

一応PCを再起動して、再度モジュールの追加するとインストールできました。

# 環境
- Windows10
- Unity Hub 3.0.1
- Unity 2020.3.27f1

# エラー内容
UnityHubから、Unity 2020.3.27f1をインストールする時に、
「**Android SDK & NDK Tools**」にチェックをして、インストールしようとしました。

![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f323531313235342f31313338623730632d326335332d633462312d383231322d3065303839663163656634302e706e67.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399610/55bd360f-a3ae-247c-1abc-f15520f422d8.png)

すると、以下のエラーが出ました。

```
Android SDK Platform 30 ダウンロードが失敗しました: Validation Failed
Android SDK & NDK Tools ダウンロードが失敗しました: Validation Failed
Android NDK ダウンロードが失敗しました: Validation Failed
Android SDK Platform 29 ダウンロードが失敗しました: Validation Failed
Android SDK Platform Tools ダウンロードが失敗しました: Validation Failed
Android SDK Build Tools ダウンロードが失敗しました: Validation Failed
```

![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f323531313235342f32363232373134652d303931362d623263642d666137632d3732353832326463656363392e706e67.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399610/87d280ac-38fc-73c5-1505-34ce41b6b131.png)

これではAndroid向けのBuildができないので困りました。

# 試したけどダメだったこと
- ❎UnityHubとUnityの再インストール
- ❎PCの再起動
- ❎別バージョンのUnityをインストール
- ❎Unity Hubを管理者権限で実行
- ❎以下の削除
    - C:/Program Files/Unity
    - C:/Program Files/Unity Hub
    - C:/Program Files(x86)/Android
    - C:/ProgramData/Unity
    - C:/ProgramData/Unity Hub
    - C:/Users/<ユーザー名>/AppData/Local/Temp(プレフィックスでunityとついてるフォルダ全て)
    - C:/Users/<ユーザー名>/AppData/Local/Unity
    - C:/Users/<ユーザー名>/AppData/Local/unityhub-updater
    - C:/Users/<ユーザー名>/AppData/LocalLow/Unity
    - C:/Users/<ユーザー名>/AppData/Roaming/Unity
    - C:/Users/<ユーザー名>/AppData/Roaming/Unity Hub
    - C:/Users/<ユーザー名>/.android
    - C:/Users/<ユーザー名>/.gredle

以上です。
[Ruby]ありえない分岐には雑にraise NotImplementedErrorを置いておくと便利

2024/04/30追記

下記の記事にもある通り、 `NotImplementedError`は役割として適切ではないようです。
`NoMethodError`などStandardErrorを継承したエラーを状況にあわせて適切に選択するのが良さそうです。

https://techracho.bpsinc.jp/hachi8833/2024_04_26/141461

---追記ここまで---

下記の実装を見てください。
type1、またはtype2の2種類のタイプを持つhogeインスタンスがあり、タイプごとに処理を分岐しています。

```ruby
case
when hoge.type1?
  # type1の処理
when hoge.type2?
  # type2の処理
end
```

タイプが2種類なのでこの実装で問題はないのですが、私はこういう分岐のelseに`raise NotImplementedError`を書いておくことが多いです。

```ruby
case
when hoge.type1?
  # type1の処理
when hoge.type2?
  # type2の処理
else
  raise NotImplementedError
end
```

こうしておくと何が良いのか？
のちにtype3というタイプが増えたとします。
その時にtype3のテストパターンを追加すると思いますが、type3の場合はelseに入るためここを修正しないとテストが必ず落ちます。
最初の実装ではcase文がスルーされるのでテストの書き方次第ではここを修正しなくてもテストが成功してしまうかもしれません。

コードベースの大きなプロダクトでは、隅々まで影響範囲を調べるのは難しく、見落としてしまうことが多々あります。
そういう時に、後者の実装のようにテストで機械的に見つけやすくしておくことで、実装漏れを防ぎやすくなります。

# おまけ: NotImplementedErrorとは？

> 現在のプラットフォームで実装されていない機能が呼び出されたときに発生します。

https://docs.ruby-lang.org/ja/latest/class/NotImplementedError.html
マーケットイン型アジャイル開発が上手くいかない訳

##背景

昨今、アジャイル開発に注目が集まり、ウォーターフォール開発は悪、アジャイル開発は善というような風潮が見受けられます。果たして本当にそうなのでしょうか？今回はそのあたりを辛辣に深掘りしていきたいと思います。

##上手くいかない結論

**アジャイルする範囲に要求要件定義を入れてしまう、なのに納期とコストはアジャイルではない。**

これが全てです。

##何が起こっているか？

現場でこんな声が聞こえてきます。

「早くリリースして、お客様の声からフィードバックして開発しよう」
「必要な部分を都度調査してアジャイル開発しよう」

**いやいや、それ要求要件が都度変わってますよね？**

聞こえが良い言葉で、開発のスコープ・コスト・デリバリーが変わってしまっているのです。こんな恐ろしいことがあるでしょうか？そうであるならば、ゴールを達成しなくても良しとするか、納期とコストを再コミットする必要があります。でも許されません。受託開発(マーケットイン型開発)ではアジャイル的な開発は成り立たないのです。

##原因は何か

アジャイル開発宣言には、以下の2つの宣言があります。

```
・顧客満足を最優先し、 価値のあるソフトウェアを早く継続的に提供する
・要求の変更はたとえ開発の後期であっても歓迎する
```

果たしてこれは受託開発(マーケットイン型開発)で実現できるのでしょうか？
この部分のアジャイルと受託の相性の悪さが根本的な原因です。

##では、どうするか？

まずはアジャイル的な開発に対する認識を正しく持つべきです。その上で安易に誤用しないこと。そしてどうしてもアジャイル的に開発を進めたい場合は、納期とコストを都度変更する必要があるでしょう。アジャイル的な開発は銀の弾丸ではありません。
vistaでillustrator その6

#概要

vistaでillustratorやってみる。
アートボード作って、コッホ曲線書いて、png出力してみた。

#写真

![ill5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/5dc07a9a-eddc-c93a-1444-bf78deac7452.png)


#サンプルコード

```
var v = [];
var ANGLE = 0;
var LX = 10;
var LY = 100;
function fmod(a, b) {
	var x = Math.floor(a / b);
	return a - b * x;
}
function turn(a) {
	ANGLE = fmod(ANGLE + a, 360.0);
}
function gmove(l) {
	var rd = Math.PI / 180.0;
	var x = l * Math.cos(rd * ANGLE);
	var y = -l * Math.sin(rd * ANGLE);
	var px = LX;
	var py = LY;
	LX += x;
	LY += y;
	v.push([LX, LY]);
}
function koch(i) {
	if (i <= 1)
	{
		gmove(5);
		return;
	}
	koch(i - 1);
	turn(-60);
	koch(i - 1);
	turn(120);
	koch(i - 1);
	turn(-60);
	koch(i - 1);
}
koch(5);
var docRef = documents.add(DocumentColorSpace.RGB, 400, 400);
var lineColor = new RGBColor();
lineColor.red = 255;
lineColor.green = 0;
lineColor.blue = 0;
var line = activeDocument.pathItems.add();
line.filled = false;
line.strokeColor = lineColor;
line.setEntirePath(v);
var pngOpt = new ExportOptionsPNG24();
pngOpt.artBoardClipping = true;
var filePath = new File("/Users/ore/ill5.png");
activeDocument.exportFile(filePath, ExportType.PNG24, pngOpt);
alert("ok");




```


以上。
[初心者log]React Hooks(useState,useEffect)について

#本記事の目的
Reactが日本で爆発的にシェアを広げた要因の一つのReact Hooksについて自分なりにまとめていきます。

##useState()
useStateは変数をstateと呼ばれる状態として管理し、更新関数にて更新していくことができるというHooksです。

###使い方

####1.useState関数をインポート
```jsx
import React, { useState } from "react"
```

####2.宣言する
```jsx
const [count, setCount] = useState(0);
```
ここでは
- count・・・state変数名
- setCount・・・state更新関数名
- 0・・・state初期値
になっています。

あとはjsxの中で自由の使うことができます。
####例
```jsx
import React, { useState } from "react"

export const CountUp = () => {
  const [count, setCount] = useState(0)
  
  return (
    <button onClick={() => setCount(count + 1)} >
      ボタン
    </button>
    <p>{count}</p>
  )
}
```

これでボタンを押すと更新関数に+1され数字が上がっていくというプログラムが書けました。

##useEffect()
useEffectはReactのライフサイクル（マウント、アップデート、アンマウント）を関数コンポーネントで置き換えるために使うHooksです。

####使い方①
```jsx
useEffect(() => 
  console.log("sample")
  return () => {
    console.log("test")
  }
)
```

まず初めに基本の型として、useEffect内にCallback関数を書きます。このCallback関数の中身(上記でいうconsole.log("sample"))はrenderごとに呼ばれます。
returnの中に書いたものはクリーンアップ関数と呼ばれていて、ライフサイクルのアンマウントの時に呼ばれます。


####使い方②
```jsx
const [count, setCount] = useState(0)

useEffect(() => {
  console.log("sample")
}, [count])
```
他の使い方として。コールバック関数を実行するタイミングを指定するというものがあります。
useEffectの第二引数の配列内の値を前回レンダー時と今回レンダー時で比較し、変更があればCallback関数を実行します。
もし仮に、第二引数の中に空の配列を渡すと、初回(マウント時)のみ実行される形になります。
2022/2/4主にITとかセキュリティの記事

XMLパーサーライブラリ「Expat」に複数の深刻な脆弱性
https://www.security-next.com/133864

フィッシング報告が2割減となるも高水準 - 悪用されたURLは増加
https://www.security-next.com/133867

【Q】Wi-Fi経由でインターネットにつながらない(2/2)
https://internet.watch.impress.co.jp/docs/column/wifi_qanda/1384837.html

2021年はデジタル出版50周年だった(2/2)
https://hon.jp/news/1.0/0/32388

Windows 10 1月の累積更新プログラムで修正の脆弱性、PoC公開で要注意(2/2)
https://news.biglobe.ne.jp/it/0202/mnn_220202_3712192834.html

再生可能エネルギーの導入進展で生じるセキュリティリスクに要注意(2/2)
https://japan.zdnet.com/article/35182373/

テレワーク「劣等生」はあの役職とあの年代、ダントツに低い利用率(2/2)
https://active.nikkeibp.co.jp/atcl/act/19/00347/012100002/?i_cid=nbpnxta_sied_pickup

報道発表資料　各種証明書発行にかかるコンビニ交付サービスの障害について(2/2)
https://www.city.osaka.lg.jp/hodoshiryo/ictsenryakushitsu/0000557023.html

Apple、2ファクタ認証機能でフィッシング攻撃のSMS自動入力をブロック(2/1)
https://iphone-mania.jp/news-435697/

コインハイブ事件で逆転無罪 サイト運営者に大きな意味ある判決－倶楽部情報局(2/2)
https://ascii.jp/elem/000/004/082/4082036/?rss

MozillaのVPNサービス、2つのプライバシー機能を追加(2/2)
https://japan.cnet.com/article/35182944/

高速ブロックチェーン「アバランチ」、賞金総額6億円のハッカソン開始(2/1)
https://coinpost.jp/?p=316229

NFTはどのように価値を生み出すのか(2/1)
https://www.dhbr.net/articles/-/8322

DatachainとNTTデータ、異なるブロックチェーン上のDVP決済実験に成功(2/2)
https://enterprisezine.jp/news/detail/15528

プロジェクトの依存関係を特定可能な「Dependency graph」がGitHub Actionsをサポート(2/2)
https://codezine.jp/article/detail/15529

サイバー攻撃を受けたら「どこに相談すれば良い？」被害者にしかわからない現実(2/2)
https://www.sbbit.jp/article/cont1/79099?ref=rss

SREを自社に導入するためのプラクティス(2/2)
https://japan.zdnet.com/article/35182423/

Coinhive事件は無罪確定も　依然残る「不正性」の曖昧さ(2/3)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/020800017/012700666/

Web利用者情報の保護強化案　ネット業界などの反発で後退(2/3)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/020800017/012700668/

DX阻む「ズブズブ」の依存も　ITシステム決裁者1000人調査(2/3)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/020800017/012700671/

文書型マルウエアから接続先を抽出(2/3)
https://xtech.nikkei.com/atcl/nxt/mag/nnw/18/111900071/011800027/
~/.ssh/configにSSHトンネリングの設定を定義して安全にSSH接続する

# 概要

SSH接続時に秘密鍵の指定やポートの指定などを行うのは面倒なので`~/.ssh/config`でいい感じにやってくれるように以下を参考に設定してみた

https://qiita.com/passol78/items/2ad123e39efeb1a5286b

https://blog.odaryo.com/2020/01/ssh-config-settings/

# `~/.ssh/config`とは

> ~/.ssh/configファイルとは、SSHクライアント用の設定ファイルです。 configファイルに記載しておくことでSSH接続を行う際は上記の情報を省略することができます。 configファイルは各ユーザのホームディレクトリ配下の .ssh ディレクトリで管理します

https://tech-blog.rakus.co.jp/entry/20210512/ssh#:~:text=~%2F.ssh%2Fconfig%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%A8,%E7%94%A8%E3%81%AE%E8%A8%AD%E5%AE%9A%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%A7%E3%81%99%E3%80%82&text=config%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AB%E8%A8%98%E8%BC%89%E3%81%97,%E3%83%AA%E3%81%A7%E7%AE%A1%E7%90%86%E3%81%97%E3%81%BE%E3%81%99%E3%80%82

## ~/.ssh/configを作成

```zsh
touch ~/.ssh/config

# パーミッションを変更しないとSSH接続時に権限エラーで怒られます
chmod 700 ~/.ssh/config
```

## 接続情報を定義する

```config
# ホスト名
Host hogehoge.com

# 接続先のIPアドレス/ドメイン名
HostName sv.hogehoge.com

# ポート番号
Port xx

# ユーザ名
User hoge

# 指定した秘密鍵のみを使用するか
IdentitiesOnly yes

# 秘密鍵のパス
IdentityFile  ~/.ssh/hogehoge.com.key

# ポートフォワード失敗時にプロセスを終了する
ExitOnForwardFailure yes

# リモートホストがクライアント側に転送されたポートに接続することを許可するか
# 任意のアドレスにバインドする
GatewayPorts yes

# Keepalive(パケットを送信しタイムアウトを防止する）
TCPKeepAlive yes

# パケットの送信間隔（秒）
ServerAliveInterval 60
```

### SSHトンネル(SSHポートフォワーディング)

> SSHトンネルはSSHポートフォワーディングとも呼ばれており、SSHによって確立した通信経路を利用して、クライアントが直接アクセスできないサーバーのポートへ転送してくれる仕組みのことです。

https://www.wantedly.com/companies/tutorial/post_articles/298736#:~:text=SSH%E3%83%88%E3%83%B3%E3%83%8D%E3%83%AB%E3%81%A8%E3%81%AF,%E3%81%8F%E3%82%8C%E3%82%8B%E4%BB%95%E7%B5%84%E3%81%BF%E3%81%AE%E3%81%93%E3%81%A8%E3%81%A7%E3%81%99%E3%80%82

# SSHで接続

```bash
ssh hogehoge.com
```

# 最後に

`GatewayPorts yes`にするとすべてのRemote Port Forwardingが強制的に(localhostのみではなく)すべてのアドレスでListenする事になるので影響が大きいとのことなので留意した上で設定することが必要です

https://teratail.com/questions/256497
RasPi4 Camera で定点観測

#カメラ位置の変更
リモートロケーションからの定点観測の映像をもう少し安定させたいと考えていたが、そのソリューションが見つかったかも。窓に貼り付ける！！
![raspi4camra.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/92380/3078ae0b-a46c-e393-72ad-54bcadf50ef8.jpeg)
ガラスに近いから汚れもほとんど気にならない。今は特に外気が冷たいので、結露に対しては、まあ対策にならないと思うが、ハウジングして外に出してケーブルを這わせて・・・などなど考えていたがとりあえずこれが一番手軽なので早速トライ。
##_結果は・・・
![2022-02-03-1510.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/92380/482e0e99-7c74-198b-b682-328be1e47903.png)
予想以上にクリア！

##ちょっとスクリプト
①イメージをキャプチャ
②WEBサーバにあげたいので適度に圧縮（１MB以下に）
③FTPサーバにイメージをポスト

Raspiは長くあげっぱましにしておくと①でエラーなるケースがあり、一旦そうなるともうだめです。
なので、その場合はRELOADするようにしました。

```
#!/bin/sh
# camera.sh
path=/home/hoge/image/
fn=$(date +%Y-%m-%d-%H%M)
dn=$(date +%Y-%m-%d)
FILE=${fn}.jpg
SERVER=ubuntu
USER=anonymous
PASS="nopasswd"
#Capture Image
#
raspistill -t 1000 -q 75 -o ${path}${FILE}
#
# Reload system if raspistill return ERR
if [ $? -ne 0 ]; then
    /usr/local/bin/reload.sh
    exit 1
fi
#
# compress image for HTTP upload
#
jpegoptim --size 900k --overwrite ${path}${FILE}
#
# Upload to FTP server
#
echo user $USER $PASS
pftp -n <<END
open $SERVER
user $USER $PASS
lcd $path
cd image
mkdir $dn
cd $dn
binary
put $FILE
END
```
後はCRONで１０分ごとに撮影をキック

```
~$ crontab -l
*/10 5-18 * * * /home/hoge/camera.sh 
```
夜は何も映らないので５時から１８時の間。明け方と夕方が特に素敵なので、このあたりは日の出日の入りの時間で自動調整するような工夫ができたらいいな、と思いつつ。今日はここまで。

次は自動的にWORDPRESSに連続写真としてPOSTできればいいなと思っています。
carthage で "API rate limit exceeded ~ " と表示された場合の対処法

# 問題

Carthageでライブラリをチェックアウトするタイミングで、

```
*** Skipped downloading SnapKit binary due to the error:
	"API rate limit exceeded for xxx.xxx.xxx.xxx. (But here's the good news: Authenticated requests get a higher rate limit. Check out the documentation for more details.)"
```

このようにAPI制限された場合の対処法。


# 環境

```
$ carthage version
0.38.0
```

# 対処法

`~/.zshrc` などに Github Access Token を追加する。

```
export GITHUB_ACCESS_TOKEN="xxx" carthage checkout
```

# 参考

https://github.com/Carthage/Carthage/issues/2154
ローカルでhttpサーバを動かす方法メモ

# 背景

クイックにローカルでhttpサーバーを使いたい時の手段をいくつか並べた記事。

# 参考

https://threejs.org/docs/index.html#manual/ja/introduction/How-to-run-things-locally

こちらの記事を参考。

##  Visual Studio Codeの[Live Server](https://marketplace.visualstudio.com/items?itemName=ritwickdey.LiveServer)
VSCode使う場合はこちら

https://marketplace.visualstudio.com/items?itemName=ritwickdey.LiveServer

##  Node.js http-server
Node.jsを使いたい場合

```
npm install http-server -g
```

ローカル環境で実行する

```
http-server . -p 8000
```

##  Python server
コマンドラインで実行

```
//Python 2.x
python -m SimpleHTTPServer

//Python 3.x
python -m http.server
```

こちらにアクセス

```
http://localhost:8000/
```

# ホットリロードしたい場合

https://qiita.com/jesuissuyaa/items/90798223541c2d152a13

この記事を参考にして

```
npm install -g reload
```

でインストール

```
reload -b
```

で、localhostが立ち上げる。
離散型と連続型の確率（密度）関数の定義

**注意**：私は数学が専門ではないので，間違っているかもしれません．もし間違いに気がついた方がいらしたら，コメントを頂けると幸いです．

あまり多くの確率の本を確認したわけではないですが，通常，離散型と連続型の確率（密度）関数は別個のものとして定義されることが多いです．ここでは，これらを統一的に定義する方法を考えてみましょう．

とりあえず確率変数$X$が離散型とか連続型とかの定義をしましょう．まず確率空間を$(\Omega, \mathcal{F},\Pr)$とします．また関数$X$を$\Omega$から$\mathbb{R}$への写像とし，$\mathcal{F}$可測である（すなわち$\\{\omega\mid X(\omega)\in \mathcal{B}(\mathbb{R})\\}\in\mathcal{F}$）とします．このとき$X$は確率変数です．また，確率変数$X$によって誘導される確率測度を$\mathbb{P}_X(A)=\Pr(X\in A)$と定義します．ただし，$A$はボレル可測集合です．そうすると，測度空間$(\mathbb{R}, \mathcal{B}(\mathbb{R}), \mathbb{P}_X)$が定義できます．さらに累積分布関数を$F(x)=\Pr(X\leq x)$で定義します．ここで，$X$が連続だとか離散型だとかいうのを次のように定義しましょう．


### [定義]確率変数における連続型と離散型の定義
確率変数$X$が**連続型確率変数**であるとは，$\mathbb{P}_X$がルベーグ測度$\mu$に対して絶対連続であるときにいう．また，$X$が**離散型確率変数**であるとは，たかだか可算な集合$A\subset \mathbb{R}$があって，$\Pr(X\in A)=1$となるときにいう．

---

いくつか注意点を書いておきます．まず確率変数は$\mathbb{R}$ではなく，$\mathbb{R}^d, d\geq 2$のような多次元の場合にも定義できますが，ここでは簡単のために実数上だけで考えています．また，確率変数は上記の連続型や離散型以外にも様々なものが考えられますが，ここでは連続型と離散型のみを考えます．統計の教科書などでは，連続型と離散型を考えて，それぞれについて議論するという形式を取ることが多いと思いますので，とりあえずはこれらを統一的に扱う方法を考えましょう．

上の定義から次のことがわかります．


### [定理]連続型と離散型における累積分布関数の表示
1. $X$を離散型確率変数とする．定義から，$A=\\{a_i\in \mathbb{R}\mid i=1,2,\dots\\}\subset \mathbb{R}$で$\Pr(X\in A)=1$となるようなものが存在する．このとき，分布関数は
$$
F(x)=\sum_{a_i\leq x}p(a_i)
$$
とかける．ここで，$p(a_i)=\Pr(X=a_i)$

2. $X$を連続型確率変数とする．このとき，ある非負関数$f$で$\int_{\mathbb{R}}f(x)dx=1$となるものを用いて，
$$
F(x) = \int_{-\infty}^x f(x) dx
$$
とかける．

---

よく知られているように$p$のことを**確率質量関数**とよび，$f$のことを**確率密度関数**と呼びます．見たらわかりますが，両者の違いは単に総和か積分かだけです．したがって，ルベーグ積分を用いればこれらを統一的に定義できそうなことがわかります．そのために次のラドンニコディムの定理を用います．


### ラドンニコディムの定理
測度空間$(\Omega, \mathcal{F})$上の２つの$\sigma$有限な測度$\mu$と$\nu$について，$\nu$が$\mu$に対して絶対連続であるとき($\nu \ll \mu$と書きます)，非負な可測関数$f$が存在して，任意の可測集合$A\in \mathcal{F}$について
$$
\nu(A) = \int_A f(x) d\mu(x)
$$
を満たす．

---

連続型確率変数については，そもそも定義がラドンニコディムの定理（というかルベーグの分解定理）を意識しているので，素直に密度関数を定義可能です．すなわち，上のラドンニコディムの定理において，$\nu=\mathbb{P}_X$，$\mu$をルベーグ測度とすれば良いです．一方で，離散型の場合は，少なくともルベーグ測度に対して絶対連続ではないので，連続型と同じようにはラドンニコディムの定理は使えません．


離散型確率変数では，ルベーグ測度ではなく計数測度を$\mu$とすれば，絶対連続となります．ただし，この場合の注意点として，測度空間$(\mathbb{R}, \mathcal{B}(\mathbb{R}), \mu)$は，$\sigma$有限ではないので，そのままではラドンニコディムの定理を使うことができないということです．そこで，新たに集合$\mathcal{X}=\\{x\in \mathbb{R}\mid F(x)\neq F(x-)\\}$を定義します．明らかに，$\sum_{x\in \mathcal{X}}\Pr(X=x)=1$です．また，$\mathcal{X}$はたかだか可算なので，測度空間$(\mathcal{X}, 2^\mathcal{X}, \mu)$は$\sigma$有限となります．これを用いることで，ラドンニコディムの定理を使って離散型の場合についても確率質量関数を定義可能です．以上より次のようになります．

### 離散型と連続型の確率関数の統一的な定義
確率変数$X$が離散型のとき，$\mathcal{X}$を$F(x)$の不連続点の集合とし，位相として離散位相を入れる．また，測度$\mu$を計数測度とする．もし$X$が連続型のときは，$\mathcal{X}=\mathbb{R}$のようにユークリッド空間を取り，測度$\mu$をルベーグ測度とする．このとき，可測空間$(\mathcal{X}, \mathcal{B}(\mathcal{X}))$において，
$$
\mathbb{P}_X(A)=\int_A f(x) d\mu(x)
$$
を満たす非負な可測関数$f$が存在する．この$f$を**確率関数**という．

---

以上の話は，確率質量と確率密度関数を統一的に扱うための話でした．ただ見て分かる通り，すべてを実数上（すなわち可測空間$(\mathbb{R}, \mathcal{B}(\mathbb{R}))$）で議論できないので，多くの本では，面倒を避けるためにラドンニコディムの定理を使って統一的に定義を行っていないのかなと思いました．また，測度論的には，離散型と連続型のミックスとか，そもそも特異な分布も存在するので，密度関数のような特別なものを考えることに重きをおいてもしょうがないという話もあると思います．

同じようなのりで，離散型と連続型の確率変数の入り混じった多変数の場合を考えることもできます．ただその話はまた別の機会にしたいと思います．
会社のtechポータルをなぜ作ったのか。「KDDI Engineer Portal」公開までの道のり

先日、[KDDI Engineer Portal](https://developers.kddi.com/)というKDDIのTechポータルを公開しました。このポータルの公開までの道のりと**なぜtechポータル**を作ったのかという話を今回は記事にさせていただきました。

# なぜ、KDDI Engineer Portalを作ったのか
* 入社して1年半くらいになったのだが、転職で入社した時になんでこんな楽しい部署なのに外に対して全然楽しさが伝わっていないのだろうと思うことが何回かありました。
* **どうにか、社内にはこんなエンジニアがいるよ！！を伝えるために、入社後Qiitaに対し会社のOrgnaizationを付けていただき記事投稿を続けてきました。入社してからQiitaを始めたので、記事総数が現在98記事(2022/2/3時点)** も投稿を続けています。
* ただ、やはり会社としてTechポータルをもつ(かつエンジニアが主役)会社を見ていると、羨ましいなとも思いました。

**そこで業務の合間で「KDDIのエンジニアの文化や雰囲気、どんなエンジニアがいるのかを発信」するためのポータルの作成を始め、上司にデモを見せ自分の気持ちを伝えたところ、共感していただきプロジェクトとして業務の合間の時間でポータル開発を正式に続けていいことになったという感じです。**

## 目的はここだ
* このポータルサイトの目的は、**「KDDIのエンジニアの文化や雰囲気、どんなエンジニアがいるのかを発信」** するためにあり、エンジニア主体で技術情報を発信するためのTechポータルであることを目指しています。

## 他のTechポータルとは、ここが違う
* **会社でのTechポータルの作成に懐疑的な人がいるのも事実で、その理由もよく理解しています。**
* というのも、「社内ブログが続かない、破綻するから作りたくない」というのがよくあげられます。

### なんで社内ブログは続かないの？？
* その理由はこの記事がとても分かりやすいです。[テックブログは続かない](https://note.com/makaibito/n/n2d9e84a959c0)
抜粋になるのですが、下記の２つくらいが揃うと破綻するそうです。

>・ 編集長が居ない／転職する
・ 誰がいつ投稿するか決めない、スケジュールがない、締切がない
・ 濃密すぎる文章チェック・法務チェック
・ （上記とは逆に）チェックが皆無で内容がしょぼく、社内外にディスブランディングとなって「投稿したら負け」という雰囲気になる
・ （ヘッドハンティング対策で）完全匿名にする
・ 業務時間外に書かせる
・ PV、LGTM、応募者などKPIを設ける
・ 社内に称える文化がない
・ 他職種から遊びに見えるような立て付け

### これを解決するアイデア
* 僕もこの記事(https://zenn.dev/catnose99/articles/cb72a73368a547756862) を見てなるほどなとなったのですが、つまり上記の問題を解決するために **「社内のサイトでブログを管理するだけではなく、ブログの投稿を既に成熟しているブログのプラットフォームに委ね、個人の活動として書いた記事をRSSとして収集したポータル」にすれば、いいのではというアイデアです。**

### ここからさらに
* このRSS収集のアイデアとTechブログも書ける会社としてのポータルを作ることにより、こんな未来を描きました。

**①:** 社内のエンジニアは、Zenn, Qiita, Note, はてブロ等にTech記事を投稿します。
ここへの投稿は、普段の個人的な時間で描いたものが自動的に「KDDI Engineer Portal」に反映されます。
なので、破綻理由の「業務時間外に書かせるや、誰がいつ投稿するか決めない、スケジュールがない、締切がない」的な事が発生しなくなります。(あくまで個人の記事を収集しているだけなので)
また、「KDDI Engineer Portal」に対してもブログ投稿が行えるので、こちらは会社として発信したい人や既存のブログサイトのアカウントを持っていない人が記事を書けるようになっています。

**②:** 発信された情報をさまざまな人が見ます

**③:** **見た記事の内容から書いた著者に対し、感謝をしていただける**と思いますし、**記事を書くことで社員の技術力向上**、さらには**アウトプットにより社員の市場価値向上につながる** と思っています。

![](https://storage.googleapis.com/zenn-user-upload/cd1bb6373cb4-20220204.png)

## KDDI Engineer Portalの構成
## フロントエンド
* **Next.js(version12-2022/2/3時点)+TypeScript**を使用しています。
また、**バックエンドとの疎通をGraphQL**で行っているので、**Apollo Client**も使用しています。
CSSライブラリには、**Tailwind CSS**を採用しています。
ユーティリティファーストにしたかったのが強いですね。(classの名前作るのが苦手なので、最高ですね。)

## バックエンド
* 今回、バックエンドについて0から作ろうとも思ったのですが、業務の合間に開発を進める必要があったのと、短期間でリリースしたかったので、Headless CMSの**Contentful**を使用することにしました。
* Contentfulは設定を追加するとGraphQLのEndpointも用意してくれます。

## インフラ
* インフラについては、AWS環境にデプロイしています。
* ここの構成については、どこかのカンファレンスでお話ししたいと思います。
* 一番の肝をNextで作成したものをどのサービスを使用しホスティングするのかというところですね。
* Amplifyなのか、S3+cloudfront+lambda@edgeなのか、EC2に立てているのか、Fargateなのか、そこはお楽しみに。

# おわりに
* これからも**KDDI Engineer Portal**は、進化させていこうと思います。
* また、ブログについてもぜひこれから続々と記事投稿されると思いますので、見届けていただけると幸いです！！
* また、[メンバー](https://developers.kddi.com/members)には、こんな人たちが働いているよというのが分かるので、チェックしていただけると面白いと思います！

最後に、現時点(2022/2/3時点)のlighthouseのreport結果です。
これもカンストさせるつもりで改修していきたいと思います。
![](https://storage.googleapis.com/zenn-user-upload/fa8f042a6bc3-20220204.png)
KubernetesでPrivate RegistryからDocker Imageを引っ張ってくる方法

# 前書き

公式ドキュメントだと、何種類かの方法とそれの検証方法が書かれていてその上英語なのでわかる人には最高のドキュメントなんでしょうが、初学者にはちと厳しいので、決定版だけ抜き出して書いておきます。備忘録です。

引用元:

https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/

# 本文

ワンライナーの方法もあるのですが、入力ミスでイライラしそうなので`docker login`でログインする方法を使います。

Kubernetesは普通にインストールすると、dockerではなくcontainerdで動いているので、`docker image`とか今回使う`docker login`等が使えないと思います。今回はとりあえずdocker.ioというパッケージをインストールします。

とりあえず、Ubuntuのインストール方法をば。

```bash
apt install docker.io
```

ログイン！オプションをいじれば、DockerHub以外のRegistryからも引っ張ってこれます。

```bash
docker login #指示通りにユーザー名とパスワードを入力
```

ホームディレクトリ配下の`.docker/config.json`に認証情報が保存されているはずなのでそれを使います。フルパスで指定しないとエラーを吐きます。

```bash
kubectl create secret generic regcred --from-file=.dockerconfigjson=<ホームディレクトリ>/.docker/config.json --type=kubernetes.io/dockerconfigjson
```

公式ドキュメントにもある通り、こんな感じでImagePullSecretsのnameにgenericの次に入力したオプション（上の通りならregcred）を書けば勝手に認証してくれます。

```yaml
apiVersion: v1
kind: Pod
metadata:
  name: private-reg
spec:
  containers:
  - name: private-reg-container
    image: <ユーザー名>/<リポジトリ名>
  imagePullSecrets:
  - name: regcred
```

# おわり

最近docker-composeのprofileでやりくりしていたのをKubernetesに移行しようと試行錯誤中なのですがやっぱりKubernetesは難しいですね。PersistentVolumeでつまづいてます。
Amazon Rekognition を触ってみた

# Amazon Rekognition とは
Amazon Rekognition は機械学習の知識がなくても、画像や動画をアップロードすることで
誰でも簡単に画像分析や動画分析を行えるAWSが用意しているAI サービスの一つです。
具体的には画像や動画内のオブジェクトの識別、顔の比較、顔の認識などが行えます。

# 料金について
Amazon Rekognition の初回利用時から12カ月間は、無料で使うことができます。
料金の詳細は以下のリンクから確認できます。
[Amazon Rekognition の料金](https://aws.amazon.com/jp/rekognition/pricing/)

# ラベル検出機能
ここでは画像をアップロードして、画像内にどんなオブジェクトが存在するのかを判別してくれます。
また認識したオブジェクトの信用度のスコアも表示されます。　
試しにクラゲの画像をアップロードしましたが「Jellyfish（クラゲ）」が認識され、96.9％信用できると表示されました。
<img width=100% src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1082287/fa3503b7-9f2e-f7fb-ffab-67ba2774cf1d.png">

### 使い方
Amazon Rekognition にアクセスし、デモ内のラベル検出を開きます。
赤枠のアップロードから画像をアップロードすると自動で解析をしてくれます。
試しに蒸気機関車の画像をアップロードしましたが、
「Railway （鉄道）」が認識され99.9％、人間も映っているので「Person（人間）」が認識され99.5％
それぞれ信用できると表示されました。
<img width=100% src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1082287/631d44dd-0891-0262-8534-60d2abf358a8.png">

# 顔の比較
顔の比較では2つの画像をアップロードすることで、画像内に映っている顔がどのくらい似ているのかを分析してくれます。

### 使い方
Amazon Rekognition にアクセスし、デモ内の顔の比較を開きます。
赤枠のアップロードから比較したい画像をそれぞれアップロードすると自動で解析をしてくれます。
試しに橋本環奈さんの最近の写真と、人気になるきっかけとなった奇跡の一枚を比較しましたが、99.5％似ていると結果が出ました。
<img width=100% src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1082287/04217338-981b-06d0-484a-624bad7fa80d.png">

# 有名人の認識
有名人の認識では、アップロードした画像内の有名人は誰なのかを分析してくれます。

### 使い方
Amazon Rekognition にアクセスし、デモ内の有名人の認識を開きます。
赤枠のアップロードから画像をアップロードすると自動で解析をしてくれます。
橋本環奈さんの画像をアップロードしましたが、96.8％似ていると結果が出ました。
<img width=100% src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1082287/66208bc3-7d47-b9cb-2ac9-b134b1323674.png">

# 終わりに
AWSのAIサービスである「Amazon Rekognition」を試しに触ってみましたが、
機械学習の知識が全くなくてもサービス側で勝手に分析してくれるので簡単に触ることができました。
記事内で触れていない機能も他にあるので、興味を持った方は触ってみて下さい。
知ってるか?SVNのDiffにWinwergeが使えるってことを

#はじめに
本記事を見ていただいてありがとうございます。

我社の開発部は、レガシーです。
ソースのDiffを取るのにWinWergeをメインに使ってます。(最近やっとGitHubを導入し始めましたけど)

さらにソース管理はSVNを使っています。

SVNにはTortoise Diffがありますが、レポート出力できるWinMergeのほうがいいということで、Tortoise SVNのDiffをWinMergeで使えるように設定していきます。

#Tortoise SVNの設定
Tortoise SVNのSettingsを開き、「External Programs」→「Diff Viewer」のページにいきます。  
[External]を選択し、WinMerge.exeのファイルパスを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/413535/6004019b-204f-44df-9608-39acd5e37e94.png)

ここで、WinMergeへのオプションに以下を設定します。

```
-e -ub -dl %bname -dr %yname %base %mine
```

これで、Tortoise SVNのDiffがWinMergeで見れるようになります。

#おわりに
早く社内でGitHubが浸透するといいな
AI-900:Microsoft Azure AI Fundamentals試験に向けて part5

#会話言語理解を使って言語モデルを作成する

- MSLearn
    - [リンクはコチラ](https://docs.microsoft.com/ja-jp/learn/modules/create-language-model-with-language-understanding/)

- この学習の目的・やること
    - 会話言語理解を理解する。
    - 意図や発話などの主要な機能について理解する。
    - 自然言語機械学習モデルを構築し、発行する。

- 会話言語を理解するために必要な３つの主な概念
    - 発話（Utterances）
        - ユーザーが言うこと
        - （例１）「ファンのスイッチを入れて」
        - （例２）「照明を点けて」
    - エンティティ（Entities）
        - 「発話」で参照される言葉・項目
        - （例１）「ファンのスイッチを入れて」の「ファン」
        - （例２）「照明を点けて」の「照明」
    - 意図（Intents）
        - 「発話」が意味する内容・目的・目標
        - （例１）「ファンのスイッチを入れて」　→　電源ON（対象デバイスは「ファン」）
        - （例２）「照明を点けて」　→　電源ON（対象デバイスは「照明」）

- 会話言語理解用のAzureリソース
    - Language Service（Language Understanding）
        - NLP（自然言語理解）機能を備えたアプリを構築可能なリソース
    - Cognitive Services
        - 会話言語理解やその他を含む一般的な共通サービス

- Language Serviceの作成で詰まったとこ
    - いくら探しても「Language Service」が出てこなかった
        - 結果、「日本語＋日本」の環境だと出てこないことが判明
        - 対処方は、以下のとおり設定画面でLanguageとRegionalをEnglishに変更すること
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/219847/7fff631b-5677-0289-5b89-1f14a7ab2153.png)

- 会話言語理解アプリの作成で詰まったとこ
    - 進んでいくと、アプリ作成時にエラーが出た
        - 結果、Pricing tierがFreeのままだとできないことが判明
        - 恐らく無料枠が残ってる人はFreeでもよい
        - 自分の場合はPricing tierをStandardに変更
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/219847/9e609374-c209-e306-086c-c5e664b0f00d.png)

- intentの作成
    - これはテキストどおりにやっていけば問題なし
    - トレーニングには少し時間がかかる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/219847/06e8f27f-e4bf-1749-97eb-21982d2bcd13.png)

- トレーニング&モデルのテスト
    - turn the light offなどの言葉で意図したintentとentityが表示された
    - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/219847/b62ef6ec-991d-4fa6-adfa-e51283cb568c.png)

- Azure Command Cloud Shellの実行
    - AzureポータルからCloud Shellを実行
 
```
git clone https://github.com/MicrosoftLearning/AI-900-AIFundamentals ai-900
cd ai-900
code .
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/219847/010bbac3-ef90-a5db-21bc-62b001deecf2.png)

- VSCode(ブラウザ)の実行
    - エンドポイントとキーに、デプロイモデルから取得したものを貼り付け
    - うまくいけばソースから実行可能になる（switch offも同じようにできますね）

```
# ココ
$endpointUrl="YOUR_ENDPOINT"
$key = "YOUR_KEY"
```
   
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/219847/0888689c-4339-4455-5e96-7795e29c92f1.png)

- 完了
    - 無事終わってよかった（英語がちょいちょい面倒だけど）