OmniAICreator/Qiita-1.07M huggingface dataset:
Angular11 + Electron11を3分で構築

# Angular11でElectronをWebハイブリッドにする
<a href="https://qiita.com/iz-j/items/cf7860959a6bbbb59fba">Angular7でElectron</a>を参考に最新で確認

# プロジェクトを作ってElectronをインストール

```shell

npm i -g @angular/cli

ng new electron-sample

cd electron-sample

npm install --save-dev electron@latest

npm install --save-dev electron-packager@latest

npm install --save-dev ngx-build-plus@latest
```

webpackを拡張するための **ngx-build-plus** をインストールしているのがポイント。 

# いくつかのファイルを作ったり編集したり

## main.jsを作る
`main.js`ファイルをプロジェクトルート直下に作って、
<a href="https://electronjs.org/docs/tutorial/first-app" target="_blank">Electronのチュートリアルページ</a>のコードをコピって、
12行目の`win.loadFile(filename)`の箇所を自分のアプリ用に編集する。

```typescript
const { app, BrowserWindow } = require('electron');

function createWindow() {
  const win = new BrowserWindow({
    width: 800,
    height: 600,
    webPreferences: {
      nodeIntegration: true
    }
  });

  win.loadFile('dist/electron-sample/index.html');
}

app.whenReady().then(createWindow);

app.on('window-all-closed', () => {
  if (process.platform !== 'darwin') {
    app.quit();
  }
});

app.on('activate', () => {
  if (BrowserWindow.getAllWindows().length === 0) {
    createWindow();
  }
});
```	

## index.htmlを編集する

`src/index.html`のhead内のbaseタグを次のように変える。

```html
<base href="/">　→　<base href=".">
```


## webpack.extra.jsを作る

Angular CLIのバージョン6以降では`ng eject`が使えず、webpackを編集できない。
なので、代わりに`ngx-build-plus`を使う。

`webpack.extra.js`ファイルをプロジェクトルート直下に作って、次のように書いておく。

```typescript

const webpack = require('webpack');

module.exports = {
  'target': 'electron-renderer',
};
```

これをやらないと、nodeのモジュール（fsとかpathとか）が全然使えない。

## angular.jsonを編集する

serveやbuild時に、`@angular-devkit/build-angular`ではなく前述の`ngx-build-plus`を使うようにする。

```json
~略~
"architect": {
  "build": {
    "builder": "ngx-build-plus:build",
~略~
  "serve": {
    "builder": "ngx-build-plus:dev-server",
```

## package.jsonを編集する

`main`に`main.js`を指定する行を追加し、
`scripts`にビルドしてElectronでアプリを起動およびパッケージするコマンドを追加する。

```json

{
  "name": "electron-sample",
  "version": "0.0.0",
+ "main": "main.js",
  "scripts": {
    "ng": "ng",
    "start": "ng serve",
    "build": "ng build",
    "test": "ng test",
    "lint": "ng lint",
    "e2e": "ng e2e",
+   "electron": "ng build --extraWebpackConfig webpack.extra.js && electron ."
+   "package": "electron-packager . --out=dist/"
  },
  ~略~
```

`ng build --extraWebpackConfig webpack.extra.js`とすることで、前述の`webpack.extra.js`が反映される。
ビルドしたパッケージは`dist`に出力する。

# 動かしてみる

```
npm run electron
```
で、Electronアプリとして起動される。

```
npm run package
```
で、WindowsやMac用にパッケージされた実行可能ファイルが出来上がる。

```
ng serve
```
最後にWEBでも動くことを確認。
webdriver_manager マジ便利

#何が便利なの？
仕事してると定期的に、これブラウザ操作で勝手にやってくれんかな・・って時あるよね

自分は本当に楽をしたい気持ちがいっぱいなので、定期的にこれ思います。

そんな時に使うのがseleniumさん。

ただ、ブラウザ操作するためにwebドライバー必要だよね。
しかもバージョンをしっかり合わせたやつ・・・。


使おう！って思った時に、あ・・なんか動かないわ・・手動でやるか・・ってことが多かったんですが、webdriver_managerを入れてからそんなことがなくなりました


#webdriver_managerとは？
ファイル実行時に、適合するwebドライバーを勝手にダウンロードしてきてくれるやつ！
実行時に何やらキャッシュがどうこうっていうのが出てくるから、一回使ったドライバーはキャッシュとして保存しておいてくれてるっぽい（調べてはないけど）



#インストール方法は？
```
pip install webdriver-manager
```

#さいごに
ちょっとだけセレニウム使おうとして、ドライバーがあってなくて動かない時、もうほんとにストレスですよね。
ダウンロードするほどじゃないんよ・・・みたいな。

これ入れとくことで、気軽にセレニウム使えてます
エクセルの画像を名前を付けて保存その2

# エクセルの画像を名前を付けて保存

* [「エクセルの画像を名前を付けて保存」](https://qiita.com/momoyamas/items/e36ff9f9c02c1804164e)でVBAを使って、画像を保存しました。
* 一般的に使うにはアドインにするなどして、どのエクセルファイルからでも使えるようする必要があります。

# PowerShellを使ってみた

PowerShellからエクセルブックにアクセスするときには、ブックが閉じている必要があると思っていたのですが、開いていても大丈夫でした。

画像の保存は、saggieさんの[「PowerShellでクリップボードの画像をファイルに保存する」](https://qiita.com/saggie/items/44cb8b317fe0effa5891) を利用させていただきました。

# 使い方

* 画像の左上のすぐ上のセルにファイル名を入力します
* ブックはファイル名を付けて保存します
* 下記のPowershellのコードを実行します
* ブックフォルダに、画像が保存されます

![zu.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165394/253dd23f-00d9-c888-58d4-36ade1d91daf.png)


# 制限事項、不具合

* ファイル名がないときには、セルのアドレスをファイル名としてPNG形式のファイルを保存します。
* 上書き確認はしません。
* ファイル名に拡張子がないときには、PNGにします。
* 拡張子が画像でないときには、そのままのファイル名で、おそらくPNGで保存されます。
* 画像が重なっていると、同一ファイル名で、上書きします。
* ファイルに使えない文字が含まれているときには、正常に動作しません。
* 変数の破棄をしていないので、もしかするとエクセルのプロセスが残ったままになるかもしれません。


```powershell:ExcelToPictue.ps1

Set-StrictMode -Version Latest
Add-Type -AssemblyName System.Windows.Forms

# attach to excel file
$Excel = [System.Runtime.InteropServices.Marshal]::GetActiveObject('Excel.Application')
$bookPath = $Excel.ActiveWorkbook.Path
if ($bookPath -eq "" ) {
  Write-Output ">>> save excel file first."
  exit
}

# save each file
$shapes = $Excel.ActiveWorkBook.ActiveSheet.Shapes
$shapes | ForEach-Object {

  # picture position check
  $address = $_.TopLeftCell.address()
  $isInRange = $False
  if ($_.TopLeftCell.row -gt 1) {
    $isInRange = $true
  }
  else {
    $address = $_.TopLeftCell.address
    Write-Output ">>> row of the picture at $address  must > 1."  
  }

  # file name check
  $fileName = ""
  $str_extension = ""
  if ($isInRange)
  {
    $fileName = $_.TopLeftCell.offset(-1, 0).text
    if ($fileName -ne "") {
      $str_extension = [System.IO.Path]::GetExtension($fileName)
      if ($str_extension -eq "") {
        $str_extension = ".png"
        Write-Output ">>> the picture at $address has no extension, so add .png."
        $fileName += $str_extension
      }
    }
    else { 
      $str_extension = ".png"
      $fileName = $address + $str_extension
      Write-Output ">>> the picture at $address has no file name. So name $fileName."
    }
  }

  # capture and save
  # https://qiita.com/saggie/items/44cb8b317fe0effa5891
  # picture save code is form above. 

  $_.CopyPicture(1, 2) # Appearance:=xlScreen, Format:=xlBitmap
  $clipboardImage = [Windows.Forms.Clipboard]::GetImage()
  if ([Windows.Forms.Clipboard]::ContainsImage() -and ($str_extension -ne ""))
  {
    $outputFilePath = Join-Path $bookPath $fileName
    $clipboardImage.Save($outputFilePath)
  }
  else {
    Write-Output ">>> the picture at $address has not captured." 
  }
}

```
【Rails6】AWS EC2でデプロイする手順

#概要
AWS EC2で、デプロイする方法について述べています。

#はじめに
AWS EC2を導入後、いまいちデプロイの仕方が掴めないという方向けの記事となっています。

私も導入したばかりで、デプロイの手順の備忘録として載せています。

#前提
AWS EC2を導入済み

#バージョン
rubyのバージョン　ruby-2.6.5
Railsのバージョン Rails:6.0.0

#実行の大まかな流れ
①【GitHub】ローカルでのコードの変更を、masterにpushする

②【ローカル】ターミナルでEC2にログイン

③【EC2】ターミナルで、ps aux | grep unicorn を実行

④【EC2】ターミナルで、kill プロセス番号 を実行

⑤【ローカル】ターミナルで、bundle exec cap production deploy を実行

#実行方法
##①【GitHub】ローカルでのコードの変更を、masterにpushする

GitHubでコードの変更内容をマージしてください。

##②【ローカル】ターミナルでEC2にログイン
以下の手順を、ローカル内のターミナルで実行してください。

```
$ cd
```
↓

```
$ cd .ssh/
```
↓

```
$ ssh -i ダウンロードした鍵の名前.pem ec2-user@作成したEC2インスタンスと紐付けたElastic IP
```
※ダウンロードした鍵の名前：AWS公式ページにて自身が設定したキーペア名のこと

※作成したEC2インスタンスと紐付けたElastic IP：AWS公式ページで記載している個人に割り振られているElastic IPアドレスのこと

※EC2にログイン完了

↓

```
cd  /var/www/開発中のアプリケーション
```

##③【EC2】ターミナルで、ps aux | grep unicornを実行
以下の手順を、EC2内のターミナルで実行してください。

```
$ ps aux | grep unicorn
```

##④【EC2】ターミナルで、kill プロセス番号を実行
以下の手順を、EC2内のターミナルで実行してください。

```
$ kill Unicornのプロセス本体のid
```
※Unicornのプロセス本体のid：unicorn_rails masterのプロセスidのこと

##⑤【ローカル】ターミナルで、bundle exec cap production deployを実行
以下の手順を、ローカル内のターミナルで実行してください。

```
$ bundle exec cap production deploy
```

#補足説明
##AWS EC2とは？
Amazonが提供している仮想サーバー構築サービスです。

##②【ローカル】ターミナルでEC2にログイン
ホームディレクトリに移動します。

```
$ cd
```

↓
「.ssh」という隠しディレクトリに移動します。
ユーザーに見せる必要がないファイルなので隠しディレクトリに置いています。

```
$ cd .ssh/
```
↓

ssh接続を実行して、EC2に接続しています。

```
$ ssh -i ダウンロードした鍵の名前.pem ec2-user@作成したEC2インスタンスと紐付けたElastic IP
```

↓
開発中のアプリケーションの格納場所まで移動しています。
※人によってディレクトリの名称は異なります。

```
cd  /var/www/開発中のアプリケーション
```

##③【EC2】ターミナルで、ps aux | grep unicornを実行
unicornのプロセスを確認しています。

・「プロセス」とは、PC上で動くすべてのプログラムの実行時の単位です。

・「psコマンド」とは、現在動いているプロセスを確認するためのコマンドです。

・「unicorn_rails master」と表示されているプロセスがUnicornのプロセス本体です。

```
$ ps aux | grep unicorn
```

##④【EC2】ターミナルで、kill プロセス番号を実行
killコマンドは、現在動いているプロセスを停止させるためのコマンドです。

・UnicornのプロセスをKillしています。

・killする理由としてはすでにunicornのサーバーが立ち上がっている状態で自動デプロイをすると、二重でサーバーを立ち上げることになるためです。（自動デプロイもサーバーを立ち上げる役割を担っています）

```
$ kill Unicornのプロセス本体のid
```

##⑤【ローカル】ターミナルで、bundle exec cap production deployを実行

・自動デプロイのコマンドです。

・EC2を導入するまでで、ローカルのターミナルからコマンド一発でデプロイできるようになっております。

```
$ bundle exec cap production deploy
```

#間違いやすいポイント（主観）
⑤の、bundle exec cap production deployを実行を誤って、EC2内で行ってしまうことがありました。
EC2内で実行すると以下のエラーが起こります。

```
bundler: command not found: cap
Install missing gem executables with `bundle install`
```

意味を理解しながらと言えど、連続して行う作業なので、間違いがちかなって思います（恥）

以上です。
低コストでSQLを勉強する方法【Employees Sample Database+Docker+GUI Toool】

macOS前提の記述ですが、他OSでもある程度対応できるはずです。
## Step1 Dockerを入れる
[Docker](https://www.docker.com/)を入れる。

### Step1-2 Dockerの操作を補助するツールを入れる(任意)
[Kitematic](https://kitematic.com/)を入れる。
想定読者層がDockerやSQLに慣れていない人であり、コンテナの停止や再起動といった事がGUIでできるため推奨。

## Step2 genschsa/mysql-employeesをpullする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430774/f1d25e5f-2ed6-b949-666d-e17b5dc5ef2c.png)
Docker Hubkから[genschsa/mysql-employees](https://hub.docker.com/r/genschsa/mysql-employees)を入れる。

```
docker pull genschsa/mysql-employees
```

でイメージを持ってきて

```
docker run -d \
  --name mysql-employees \
  -p 3306:3306 \
  -e MYSQL_ROOT_PASSWORD=college \
  -v $PWD/data:/var/lib/mysql \
  genschsa/mysql-employees
```

で動かせる

## Step3-1 DB GUIアプリを入れる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430774/2f596faf-5a7a-b611-11d4-69937f4aa5bb.png)
[Sequel Ace](https://apps.apple.com/us/app/sequel-ace/id1518036000)の様なGUIでDBを操作できるアプリケーションを入れる。
Windowsの場合や、他のGUIアプリケーションが良いなら[MySQLのおすすめ便利クライアントツール](https://qiita.com/a-nishimura/items/40b864c93245921d9eb5)を参考にしてみてください。

本記事でGUIツールでの利用を

## Step3-2 GUIアプリで接続する
docker runの際にmysqlのパスワードをcollege、コンテナのポート3306とローカルのポート3306を繋げているのでこの情報を元にGUIアプリから操作をする事ができる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430774/f0ae08fe-4c50-cebc-47e7-34418da9c09f.png)

設定はこの様にHostを自分のPC、ユーザー名をroot、パスワードにcollegeという様に設定すればどの環境でも接続できるはず。

あとはSelect Databaseにemployeesを設定して中身を確認し、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430774/ead74bbc-c8cb-6e7d-5ece-a2e7de167954.png)

データを追加したり

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430774/929d9188-a90e-c53c-587a-d471845bb4c3.png)

消したり

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430774/c149ec81-d1c4-7c7e-4268-e95929e5307d.png)

あとはWeb上のドキュメントを読んで試したりするだけ。
（例: [MySQL 5.6 リファレンスマニュアル](https://dev.mysql.com/doc/refman/5.6/ja/))
楽しみましょう!


## 本記事を書いたきっかけ
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">ええっ！？30万件近いデータの入ったemployeesデータベースがDocker imageとして公開されているのかい！？<br><br>クエリやインデックスやパフォーマンスチューニングの練習に使える最高の環境がdocker runするだけで手に入るのかい！？<br><br>すごいねマスオくぅん！<a href="https://t.co/Q8jKGs2I3F">https://t.co/Q8jKGs2I3F</a></p>&mdash; dowanna @PrAha Inc. CEO兼エンジニア (@dowanna6) <a href="https://twitter.com/dowanna6/status/1353900492120707072?ref_src=twsrc%5Etfw">January 26, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
を見てSQLの操作を勉強する時、データベースの中身を用意するのが面倒くて他の事に目移りしたんだよなぁと思って書きました。

この中のデータは[Employees Sample Database](https://dev.mysql.com/doc/employee/en/)で公開されているので、最新のMySQLでイメージ
作って試すのも面白そうですね。
[Delphi][ネタ]ズンドコキヨシ・コードゴルフ 

# ズンドコキヨシ・コードゴルフ

■平成から令和を跨ぐズンドコキヨシのせいだよwith Delphi
https://qiita.com/e99h2121/items/b67c03b3b53477e9847d

という記事をみて、**最近コードゴルフやってないなあ**と思って[ズンドコキヨシ・コードゴルフ](https://qiita.com/shunsugai@github/items/971a15461de29563bf90)やってみたんだけど、そんなに短くできなかった。
インライン変数宣言ができるようになったし、割と短くできるんじゃない？と思ったのに。

##2021/02/22 追記２

DEKO さんのコメントにあるコードを~~パクって~~参考にして 122 Byte！

```pascal:１行
begin Randomize;var F:=1;repeat F:=F*128+Random(2);Write(Copy('ズンドコ',1and F*2+1,2))until F=1;Write('キ・ヨ・シ！')end.
```

```pascal:整形
begin
  Randomize;
  var F:=1;
  repeat
    F:=F*128+Random(2);
    Write(Copy('ズンドコ',1and F*2+1,2))
  until F=1;
  Write('キ・ヨ・シ！')
end.
```


##2021/02/22 追記
[DEKO さんの記事](https://qiita.com/ht_deko/items/a066ea4be3afee7e8ef5)のコメントに 125 文字版が！

##2021/02/21 追記
130 文字のができたけど、概ね [DEKO さんのアルゴリズム](https://twitter.com/ht_deko/status/1363374533038673926)と同じ感じになってしまった。収斂進化？

```pascal:1行
begin Randomize;var Z:=['ドコ','ズン'];var F:=0;repeat F:=F*2and$1f+Random(2);Write(Z[1and F])until F=30;Write('キ・ヨ・シ！')end.
```

```pascal:整形
begin
  Randomize;
  var Z:=['ドコ','ズン'];
  var F:=0;
  repeat
    F:=F*2and$1F+Random(2);
    Write(Z[1and F])
  until F=30;
  Write('キ・ヨ・シ！')
end.
```

### ここから下は前のもの

**出来上がったコードは↓で、167文字**

```pascal
begin Randomize;var Z:='ズンズンズンズンドコ';var S:='';repeat S:='';repeat S:=S+Copy(Z,Random(2)*2+7,2)until Length(S)>9;Write(S)until S=Z;Writeln('キ・ヨ・シ！')end.
```

Randomize を無しにすると、156 文字

**整形すると↓**

```pascal
begin
  Randomize;

  var Z := 'ズンズンズンズンドコ';
  var S := '';
  repeat
    S := '';
    repeat
      S := S + Copy(Z, Random(2) * 2 + 7, 2)
    until Length(S) > 9;
    Write(S)
  until S = Z;

  Writeln('キ・ヨ・シ！')
end.
```

var 節で ```S:String``` と書くより ```var S:=''``` の方が短いけど２回 ```S:=''``` が出てくるのを何とかしたかった。

**実行結果は↓**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12977/27aeac1d-88d4-21bf-56a5-7742fea52b53.png)


令和の Delphi はインライン変数宣言宣言以外にも色々機能が増えた[^1]んだけど、コードゴルフで短くしようと思うとインライン変数宣言以外の機能は出番が無かった。
無念。

[^1]: [record helper やジェネリックなど沢山](https://gist.github.com/freeonterminate/fd7b737ca257f3dd363933f9835a3d7b)
OSPF

# はじめに
今年度中のCCNA取得に向けて勉強中です。
間違っていたら指摘していただけたら嬉しいです！

# OSPFとは
・ダイナミックルーティングのルーティングプロトコルの一種
・リンクステート型
・宛先までの経路をコストで決定する

# ルーティングテーブルに登録されるまで
### ①. Helloパケットによるネイバー関係の確率(Downステート)
1. Helloパケットを全OSPFルーター宛のマルチキャスト(224.0.0.5)に送信する。
2. Helloパケットにはネイバーの情報が記載されていて、隣（ネイバー）を認識できる。

### ②. ネイバーテーブルにネイバーを登録(Initステート)
1. Helloパケットを受け取ったルーターはHelloパケットの送信者をネイバーテーブルに登録する。
(この段階ではまだ一方のルーターのみが認識している状態。)

### ③. 相互認識(2-Wayステート)
1. Helloパケットにはネイバー一覧が格納されているので、受け取ったパケットに自分の情報が格納されていたら、**2Wayステート**になる。

### ④. ルーター間でDBDパケットを交換(Exstartステート)
1. DBDパケットにルーターIDを格納して、「マスター」「スレーブ」を決める。
2. 各ルーターの持つLSDB情報をDBDパケットに格納して送る。**(Echangeステート)**

### ⑤. 詳細なLSA情報を交換(Loadingステート)
1. Exchangeステート時に新しい情報を検出。
2. LSRパケット(Link State Request)にて詳細を要求。
3. LSUパケット(Link State Update)を送信。
4. LSUパケットを受信したら確認応答としてLSActパケットを送信。

### ⑥. LSDBの同期(Fullステート)
1. お互いに最新の状態を取得して、正確なLSDBを作成。<br>
↑<br>
LSDBは全ルーター共通の内容

### ⑦. ルートテーブルに登録
1. 作成したLSDBを基にSPFアルゴリズムを使用して**SPFツリー**を作成し、最短経路をルーティングテーブルに登録する。
Qiitaにおける私の投稿方針

初投稿です。
Qiitaで記事投稿を始めようかと思います。


#はじめに
これは、Qiitaでの私の投稿方針についてまとめた記事です。

[E資格試験に関する私の投稿記事リスト][link-1]
[link-1]:https://qiita.com/fridericusgauss/items/5a97f2645cdcefe15ce0

###目次
1. [Qiita投稿のきっかけ](#qiita投稿のきっかけ)
2. [記事投稿の方針](#記事投稿の方針)
3. [JDLA E資格](#jdla-e資格)
4. [おわりに](#おわりに)

#Qiita投稿のきっかけ
仕事は、データ解析などの数値計算を使うエンジニアです。
本日(2021年2月20日)、JDLA E資格試験を受けましたが、見事に勉強が進まず、不合格濃厚の感触でした。
なので、2021年8月のE資格試験に向けて、勉強を続ける予定ですが、時間に余裕が出来たので、せっかくなら投稿を始めてみようと考えました。

__【2021年3月11日追記】__
JDLA E資格2021#1に合格していました。


#記事投稿の方針
###コンテンツ
基本的には、__私の頭の中を整理するメモ代わり__として利用します。
そして、コンテンツも、しばらくは__E資格試験向けの知識__としようと思います。
したがって、__AIや機械学習、深層学習に関する知識が中心__です。
一方、気ままに、それ以外のコンテンツ(例えば実装面含め)についても投稿する可能性はあります。

本来は皆様に広く伝える意味では、youtubeなどで動画を投稿することも有効だと思います。
また、学生時代は[yahoo知恵袋][link-2]で、高校生や大学生向けの数学に関する知恵ノートを投稿していました。
ですが、私も受験する身なので、しばらくは私用のメモを、Qiitaで皆様に公開するスタンスとします。

[link-2]:https://m.chiebukuro.yahoo.co.jp/


###投稿頻度
特に決めていません。
ただ、平日は難しい可能性が高いので、土日で投稿できることを目指します。
そうでないと、8月の試験までに間に合わないので。
なるべく三日坊主は避けたいと思います。


###その他
途中、記事の方向性がブレてきたら、Qiita以外のナレッジコミュニティも使用して、それぞれ記事を分けて投稿する可能性もあります。

また、記事によっては、ですます口調ではなく、論文調になるなど、統一感はないかもしれません。
その記事の雰囲気に合わせて、柔軟に変更します。

なお、基本的には、Qiitaで記事を投稿すると、Twitter上でも記事をツイートするようにします。
Twitterアカウント
@fridericusgauss


#JDLA E資格
###E資格とは
__E資格__(JDLA Deep Learning For ENGINEER)とは、日本ディープラーニング協会(JDLA)が認定するAIエンジニアの資格です。
E資格を持つ人材は、深層学習を理解し、実装できるエンジニアとして認められます。

詳細は、下記のJDLAのホームページ、G検定・E資格のwikipediaをご覧ください。
[JDLA E資格とは][link-3]
[wikipedia: JDLA Deep Learning For GENERAL][link-4]
[wikipedia: E資格][link-5]

[link-3]:https://www.jdla.org/certificate/engineer/
[link-4]:https://ja.m.wikipedia.org/wiki/JDLA_Deep_Learning_For_GENERAL
[link-5]:https://ja.m.wikipedia.org/wiki/E%E8%B3%87%E6%A0%BC


E資格試験の受験資格は、直近2年以内にJDLA認定プログラムを修了することです。
JDLA認定プログラムはE資格向けの講座なので、基本的にそれを受講することはE資格試験対策となります。


###E資格試験向けコンテンツの必要性
企業でも__AI人材__が喫緊の課題ですので、G検定合格/E資格取得を推奨しているところもあるようです。
弊社も同様にAI人材が課題ですが、特にE資格について話題に出す人はいませんでした。
しかしながら、私自身含め立派なAI人材となるための必要な要素として、E資格は適切な資格だと判断し、2020年10月頃から資格取得を目指し、勉強を開始しました。

そして、実際に勉強して受験した結果、E資格試験向けコンテンツは需要がありそうだと推測しています。

* 認定プログラム内で、ある程度試験対策はできますが、それでも初心者にとってはハードルは高いため、自習が重要です。その人向けに、認定プログラムを実施している企業は、別途特別講座を開催しているところもありますが、別途費用が発生するケースが多いです。

* 先程の背景から、E資格受験者・取得者は増えています。単純に今後はもっと増えることが予想されます。


以上の理由から、他の資格試験と同様、ネット上で知識を共有することだけでも、需要がある予感がしています。


#おわりに
よって、しばらくは__JDLA E資格__をコンテンツとして記事投稿しようと考えています。

[E資格試験に関する私の投稿記事リスト][link-1]
Pythonで数式を書く_01（シグモイド関数）

# 数式
以下がシグモイド関数(sigmoid function)です。

```math
y\ = \frac{1}{1+e^{-ax}} \ \ (a>0)
```

a = 1 のときは標準シグモイド関数(standard sigmoid function)と呼びます。
今回はPythonで a = 1 のときのシグモイド関数を記述します。
※ちなみに、本やネットを見ていると、y は h(x) やς(x) と表記していたりもします。

#  Pythonで記述
```python
import numpy as np

# シグモイド関数
y = 1 / (1 + np.exp(-x))
```
これがPythonで記述したときのシグモイド関数です。
x = 1　のときは以下のように出力されます。

```python
import numpy as np

x = 1
y = 1 / (1 + np.exp(-x))
print(y)
```
```php:x=1の出力結果
0.7310585786300049
```

コードを省略しますが、x = -1 や x = 0 のときは以下のように出力されます。

```php:x=-1の出力結果
0.5
```
```php:x=0の出力結果
0.2689414213699951
```
# シグモイド関数を視覚化
先ほどの入力と出力を表にまとめると次のようになります。

|  | x = -1|x = 0|x = 1|
|:---:|:---:|:---:|:---:|
|**出力結果 y**|0.27|0.5|0.73|

表だけだとわかりにくいですが、
グラフにするとシグモイド関数の出力は 0 ~ 1 の間になることがわかります。
![シグモイド関数.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654501/bc29a13c-c141-f11a-033b-d34e459fb4a7.jpeg)

ちなみに、上のグラフは以下のコードで描くことができます。

```python
import matplotlib.pyplot as plt
import numpy as np

x = np.arange(-15, 15, 0.1)
y = 1 / (1 + np.exp(-x))

plt.plot(x, y)
plt.title("standard sigmoid function")
plt.xlabel("x")
plt.ylabel("y")
plt.show()
```

シグモイド関数はニューラルネットワークの活性化関数としても利用されますので、
その方面に興味のある方はシグモイド関数の数式とPythonでの記述方法を覚えておいてもよいかもしれません。
BeagleBoneGreenのWindows10用ドライバがインストールできない問題の解決方法

# はじめに

[BeagleBoneGreen Wireless(以下BBG)](https://beagleboard.org/green-wireless) というラズパイみたいな組込みボードを弄って遊ぼうとしていた。
初期設定の一つに、Windows10用のドライバをインストールするところで、躓いたので紹介する。

解決方法としては、RNDISドライバをMicrosoftネットワーク互換ドライバとしてインストールすれば上手くいった。
https://developer.toradex.com/knowledge-base/how-to-install-microsoft-rndis-driver-for-windows-7

# 今回インストールしようとしているBBGのドライバって？

BBGは色々なチップが搭載されているラズパイ的なボードになっている。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15085/ee204fd0-5acd-71a2-096d-9a714feb4ca3.png)

このボードはWirelessでネットワークに接続できるのだが、USB経由でPCと仮想的なネットワークを構築して、
SSHでBBG内のターミナルを触ることができる。

今回インストールしようとしたのが、PCからBBGへUSB通信で仮想的にネットワーク接続するためのモノ。
公式説明通り、下記サイトからドライバをダウンロードすれば良さそうに見える。
https://wiki.seeedstudio.com/BeagleBone_Green_Wireless/#step2-install-drivers
>Install the drivers for your operating system to give you network-over-USB access to your Beagle. Additional drivers give you serial access to your board.

# どんなエラー画面になったの？

ガイダンス通りに、Windows10(64bit)のドライバをダウンロードしてインストールしようとすると、下記エラーに。
あぁ、管理者権限が必要なのね、と思って試してみてもエラーは変わらずでした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15085/b3ae8c1e-7ec8-26c6-2b6e-ee100224abb7.png)

# 解決方法

ググってくると、[Windows 10 Bone_D64.exe Failing](https://groups.google.com/g/beagleboard/c/-gczCwKR2Rk?pli=1)という全く同じ症状の人たちが居ることが判明。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15085/5817e858-c778-003e-fdd2-49c4374f4b4a.png)

結論として、下記サイトで紹介している方法を試してドライバをインストールすることで、
私も正常動作させることに成功した。

https://developer.toradex.com/knowledge-base/how-to-install-microsoft-rndis-driver-for-windows-7
Androidでしてはいけない再帰をする

ふと思った
**「`onCreate()`みたいなところで自分をまた呼び出すようにしたらどうなるだろう？」**
結果はわかりきっているがやってみた
## 実際にやってみた
`onCreate()`と言っておいて`onResume()`に書いていますが気にしない気にしない

```kotlin:LaboratoryActivity.kt
class LaboratoryActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_laboratory)
    }

    override fun onResume() {
        super.onResume()
        Log.d("korehataihennnamisuwokennsyousurutamenomonodesu,Androidkunn...taete!", "onResume")

        startActivity(Intent(this, LaboratoryActivity::class.java))
    }
}
```

## 結果
MainActivityにおいてあるボタンからLaboratoryActivityに行くと...

LaboratoryActivityの画面は描画されませんが、しっかりと仕込んでおいたログが何回も出ています
少しすると画面が描画されました(なにか限界を迎えた感じがした)
もちろん、UIのボタンは反応しません

だんだん再帰の速さが遅くなってきたので、止めました
## まとめ
やる前からわかっていましたが、やっぱりフリーズしました

## おまけ 「何もできない!」
やっても意味ないし、やってはいけないのですが、やるときは気をつけましょう
さっき **だんだん再帰の速さが遅くなってきたので、止めました** なんて言いました
でも、実際はそんなあっさり止まりません、というか本当に止まりません

画面は何も反応しません タスク一覧は出ません ホーム画面にいけません
「ん〜 詰んだ？」いいえ諦めません
なぜかというと

```
$ adb shell
```

は全然反応します
そこで`am force-stop xxxxx`だったり`am kill xxxxx`だったりしましたが、だめでした
画面は凍ったままです
なんとか通知とかを出すくらいはできたので、電源メニューを出して再起動をしましたが、再起動しませんでした
じゃあどうしよう...

結果的には

```
$ adb reboot
```

で大丈夫でした
普通に再起動しました

ちょっと焦った
ラズパイのPLEXでPS3向けにDLNAでコンテンツ共有 カクつき対策

#ラズパイのPLEXでPS3向けにDLNAでコンテンツ共有
##困ったこと
Raspberry pi 4のPLEXでFull HD(1920x1080)のMPEG2 TSコンテンツをDLNA経由でPS3で再生しようとすると一部のコンテンツでカクつきがひどい。
調べてみると、ビットレートが高いコンテンツで発生している模様
##原因
PLEXのデフォルト設定で、PS3のフルHDのvideoのビットレートが15360kbpsに制限されており、その制限を超えるとトランスコードされてしまい、処理落ちが発生
##解決策
https://github.com/Hedda/Plex-DNLA-client-profiles/blob/master/PlayStation%203.xml
をダウンロード。ファイル中の

```
<VideoCodec name="h264">
   <Limitations>
     <UpperBound name="video.width" value="1920" />
     <UpperBound name="video.height" value="1080" />
     <UpperBound name="video.frameRate" value="30" isRequired="false" />
     <UpperBound name="video.bitrate" value="15360" isRequired="false" />
     <UpperBound name="video.level" value="41" isRequired="false" />
   </Limitations>
```
   のvideo.bitrate valueを20000とか大きな値に変更。
   このファイルを
   /var/lib/plexmediaserver/Library/Application Support/Plex Media Server/Profiles
   におく。Profilesディレクトリーはデフォルトではないので作成。
   PLEXがアクセスできるようにアクセス権の設定を忘れずに

   ```
  chown plex:plex /var/lib/plexmediaserver/Library/Application Support/Plex Media Server/Profiles
  chown plex:plex /var/lib/plexmediaserver/Library/Application Support/Plex Media Server/Profiles/PlayStation3.xml
  ```
n進数の計算

###n進数

n進数→nとは桁が次に進む数である

ex 2進数→２ごとに次の桁に進む。
　　10進数→10ごとに次の桁に進む

といったものである。

###2進数

上記の通り２ごとに次の桁に進む表現である。

コンピューターは**0と１（on off）**でデータを計算するためこの表現方法が用いられる。
表記方法は以下の通りである。

![スクリーンショット 2021-02-20 21.00.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1131065/49f5588c-3294-945e-212a-24feba325dc4.png)


###8進数###

8毎に桁上がりする。
０〜７の数字で表される。
→８から桁上がり。
数字の流れとしては

１→２・・・・７→**10（８）→11（９）→12（１０）**・・・１７（１５）→20（１６）

という形になる。

##16進数##

16毎に桁上がりをする。
０〜９までは数字表現だが、
**10~15**をアルファベットの**A~F**で表現する。

０〜９→**A(10)→B（11）**・・・F（15）→10→19→1A



##参考文献##
キタミ式基本情報技術者
P20~29
クライアントがアプリの一部機能にドメインを割り当てる際に自動でSSL化する方法

#概要
アプリケーションの一部機能、カート機能や予約機能をクライアントのページで作成する時に、ドメインを指定したいという要望に対してHTTPS接続なので、ACM証明書をこちらで追加する必要があります。今回は、その部分を自動化を行います。

##使用技術
・AWS ACM
　https://aws.amazon.com/jp/certificate-manager/
・AWS SDK for PHP 
　https://docs.aws.amazon.com/aws-sdk-php/v3/api/index.html

##作業手順
1. 特定の機能のURLにクライアント固有のidなど含めます。
2. クライアントが、【使用したいドメイン】をフォームに入力を行う。（AWS SDKを使用し入力されたドメインをACMに追加 レスポンスに含まれる「エントリー名」「値」を表示）
3. クライアントが、DNSサービスプロバイダで作成した【使用したいドメイン】にCNAMEで「1.のURL」 「エントリー名」 「値」を登録

上記の３ステップでクライアント側の操作のみで、SSL化されたドメインを割り当てれるようになります。 



####AWS SDK for PHPを使用しACM登録処理,「エントリー名」 「値」を確認する
参考コード（for_laravel）

```
use App\Certification;
use Aws\Acm\AcmClient;

public function createACM(Request $request)
{
    $client = new AcmClient([
                    'version'     => 'latest',
                    'region'      => 'ap-northeast-2',
                    'credentials' => [
                    'key'    => config('aws.key'),
                    'secret' => config('aws.secret_key'),
                ],
            ]);

  //ACM登録
  $result = $client->requestCertificate([
            'DomainName' => $request->url;,
            'Tags' => [
                [
                     'Key' => '<string>', // REQUIRED
                     'Value' => '<string>',
                ],
            ],
            'ValidationMethod' => 'DNS',
        ]);
   
   //こちらで、ACMの情報を呼び出します。
   $resource_name = $result['CertificateArn'],

　　$results = $client->describeCertificate([
       'CertificateArn' => $resource_name
　　]);

    $エントリー名 = $results['Certificate']['DomainValidationOptions'][0]["ResourceRecord"]['Name'];
    $値        = $results['Certificate']['DomainValidationOptions'][0]["ResourceRecord"]['Value'];
}

```

参考URL
https://docs.aws.amazon.com/aws-sdk-php/v3/api/api-acm-2015-12-08.html#requestcertificate



##あとがき
半年ほど前に実装した機能で、上手く説明出来なかったのですが記事にして理解できました。
クラウドフロントのキャッシュ削除なんかも下記サイトをみて実装しました。めっちゃ便利です！
・AWS SDK for PHP 
　https://docs.aws.amazon.com/aws-sdk-php/v3/api/index.html
【Firebase入門を更新】Firebase Authenticationの解説動画を5本追加しました！

# 概要

YouTubeで公開している再生リスト「Firebase入門」に、認証機能を実装できる「Firebase Authentication」の解説動画を追加しました。（合計19本の動画リストになった。）



再生リストへは以下のリンクから飛べます。
↓
https://youtube.com/playlist?list=PLgNEd6Q0CH8E6zHmqsO7EIcqsDEeVD089


# 追加コンテンツの詳細

今回追加した5本の動画は、大きく分けると以下の2種類に分かれています。

1. Firebase Authenticationの座学系の解説動画
2. Firebase Authenticationの実践動画（ハンズオン形式）


![スクリーンショット 2021-02-20 19.59.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/289248/d6218111-eefe-9a9a-e871-f1a2549eb452.png)



# Firebase入門で学べる内容

今回追加した認証機能を実装できる「Firebase Authentication」を含めて、現状「Firebase入門」で学習できる内容は以下の通りとなっております。



1. Firebaseの全体像
2. Firebase CLIのインストール方法
3. Firebase Hostingの利用方法
4. Cloud Firestoreの利用方法（概要解説とハンズオン形式）
5. Cloud Functionsを使ったAPI実装方法
6. Firebase Authenticationを使った認証機能の実装方法




「Firebase入門」がFirebase学習中の方の参考になれば幸いです^^


https://youtube.com/playlist?list=PLgNEd6Q0CH8E6zHmqsO7EIcqsDEeVD089
日本語を表示するJavaプログラムをコンパイルする時の注意について

こんにちは！佐野です。Javaの勉強をしており、私が学んだことを共有できればと思います。
文章の読みにくい所や理解の間違い等、ご指摘・アドバイスを頂ければ幸いです。

使用しているツール

* Visual Studio Code
* Java11 ( JDK "11.0.9.1" ) 
* OS : Windows10

コンパイル時に文字化けをさせない対応について学んだので、紹介します。

早速、このコードをコマンドラインからコンパイル、実行してみたいと思います。
期待する出力は　`x+yは15`　です 。

```
public class Main { 
    public static void main (String[] args) {
        int x = 5; 
        int y = 10; 
        String ans = "x+yは"+(x+y) ; 
        System.out.println(ans); 
    }
}
```
まずは文字化けする例を見てみましょう。コンパイルして...

```
javac Main.java
```
実行すると...

```
java Main

> x+y縺ｯ15
```
文字化けしてしまいました。

今度はコンパイル時にもとのコマンドに少し追加しました。

```
javac -encoding UTF-8 Main.java
```
実行すると...

```
java Main

> x+y縺ｯ15
```

今度は期待通り出力されました！

なぜ`-encoding UTF-8`が必要かというと、VSCodeの設定にありました。

>VS Code のターミナルはシェルからの UTF-8 エンコードされたデータしかサポートしていないため、環境変数 $LANG を UTF-8 準拠のオプションとして検出して設定するかどうかを制御します。
>VSCode Setting　より引用

また、Windowsは基本　Shift-JISコードのテキストファイルしか扱えません。

>Windows環境で作った日本語入りのJavaのソースファイルをLinux環境でコンパイルしたらエラーになった
>https://www-tlab.math.ryukoku.ac.jp/wiki/?Graphics/FAQ#v4beed7f


##まとめ
VSCodeのコマンドからJavaのソースコードをコンパイルするときには `-encoding UTF-8`と書き加える必要がある。

読んでいただいてありがとうございました。
Happy coding!! 😄✨
STM32L010のMbedでの温度,STTS751で温度表示(AQM0802A)(STM32L010F4P6)


x 愛用していたSTTS751の入手が難しくなったので代用品は、S-5851A。(おもにアドレスの違い)

1.SCLとSDAを接続、プルアップも忘れずに
2.電源の接続
3.下記のソースコードを書き込む
4.コンパイル実行で表示されたら終了
5.おわり

注意
mbedのリビジョンは、125

参照
STM32L010のMbedでの液晶,AQM0802Aで表示(i2c)(STM32L010F4P6)
https://qiita.com/caa45040/items/4c7a55bfe837e4ff7bdf

忙しい人の為
https://os.mbed.com/users/caa45040/code/STTS751_i2c_lcd_010_1/

```c++
#include "mbed.h"

#define ADDR        (0x39<<1)   //  address
#define ADDR_LCD    (0x7C)      //  address

//I2C i2c(I2C_SDA, I2C_SCL); //767
//I2C i2c(dp5, dp27); //1114
I2C i2c(PA_10, PA_9); //010

int     tempval;        //温度
char    data_read[2];   //i2cバッファー
int     ii;             //ループカウンター
int     p_val;          //戻り値

char INIT_com[]={0x0,0x38,
0x0,0x39,
0x0,0x4,
0x0,0x14,
0x0,0x70,
0x0,0x56,
0x0,0x6C,
0x0,0x38,
0x0,0xC,
0x0,0x1,
0x40,0x41,0x99,0x99};

char INIT_cls[]={0x0,0x1};

int main()
{
 
    //液晶の初期化
    for(ii=0;ii<11;ii++){
        p_val = i2c.write(ADDR_LCD, &INIT_com[ii*2], 2);
        wait_ms(2);
    } //for
 
    while (1) {
        //液晶のクリア
        p_val = i2c.write(ADDR_LCD,INIT_cls,2);
        wait_ms(2);
        
        //温度の読み込み
        // Read temperature register
        i2c.read(ADDR, data_read,1,false);
 
        //温度の保存
        // Calculate temperature value in Celcius
        tempval =  data_read[0];
 
        //液晶に出力
        // Display result
        data_read[0] = '@';
        data_read[1] = (tempval/10)+'0';
        p_val = i2c.write(ADDR_LCD, data_read ,2);
        wait_ms(1);
        data_read[1] = (tempval%10)+'0';
        p_val = i2c.write(ADDR_LCD, data_read ,2);
        
        wait_ms(1000);
    }//while
 
}//main
 


```
![STTS751_i2c_lcd_010_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/1fbe1238-f510-a3b4-abfa-def63e1e1020.jpeg)

![STTS751_i2c_lcd_010_2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/0196ee66-8382-1524-f9f6-3ed69ead5c88.jpeg)

![i2c_lcd_stts751_l010_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/586cc576-69fd-17b2-7383-4494b57c279f.jpeg)

![i2c_lcd_stts751_l010_2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/8b88224d-d9ef-690a-6541-a05bdcb0827f.jpeg)
Rubyインストールに伴うMSYS2インストール時のエラーについて

# 環境
- Windows 10
- Ruby 3.0.0

# どこで引っかかったか
### Rubyをインストールする
RubyInstallerを使ってインストールした
ここは特に問題なし。


### MSYS2をインストールする
ここで以下のようなエラーで出てうまくインストールできていないような感じ

```
エラー: mingw32: "David Macek <david.macek.0@gmail.com>" の署名は信頼されていません
エラー: mingw64: "David Macek <david.macek.0@gmail.com>" の署名は信頼されていません
```

詳細

```
C:\Windows\System32>ridk install
 _____       _           _____           _        _ _         ___
|  __ \     | |         |_   _|         | |      | | |       |__ \
| |__) |   _| |__  _   _  | |  _ __  ___| |_ __ _| | | ___ _ __ ) |
|  _  / | | | '_ \| | | | | | | '_ \/ __| __/ _` | | |/ _ \ '__/ /
| | \ \ |_| | |_) | |_| |_| |_| | | \__ \ || (_| | | |  __/ | / /_
|_|  \_\__,_|_.__/ \__, |_____|_| |_|___/\__\__,_|_|_|\___|_||____|
                    __/ |           _
                   |___/          _|_ _  __   | | o __  _| _     _
                                   | (_) |    |^| | | |(_|(_)\^/_>

   1 - MSYS2 base installation
   2 - MSYS2 system update (optional)
   3 - MSYS2 and MINGW development toolchain

Which components shall be installed? If unsure press ENTER [1,3] 3

> sh -lc true
MSYS2 seems to be properly installed
Install MSYS2 and MINGW development toolchain ...
> pacman -S --needed --noconfirm auto略ds-git
エラー: mingw32: "David Macek <david.macek.0@gmail.com>" の署名は信頼されていません
エラー: mingw64: "David Macek <david.macek.0@gmail.com>" の署名は信頼されていません
エラー: msys: "David Macek <david.macek.0@gmail.com>" の署名は信頼されていません
エラー: データベース 'mingw32' は無効です (無効または破損したデータベース (PGP 鍵))
エラー: データベース 'mingw64' は無効です (無効または破損したデータベース (PGP 鍵))
エラー: データベース 'msys' は無効です (無効または破損したデータベース (PGP 鍵))
Install MSYS2 and MINGW development toolchain failed
Installation failed: pacman failed

   1 - MSYS2 base installation
   2 - MSYS2 system update (optional)
   3 - MSYS2 and MINGW development toolchain

Which components shall be installed? If unsure press ENTER []
```



# どうやって解決したか

- MSYS2を更新
- 再度ridk installを実施

という感じで進めました。

### Rubyをインストールしたフォルダ内にあるMSYS2.exeを実行する

```
C:\Ruby30-x64\msys64\msys2.exe
```





### 表示されたコマンドラインでMSYS2を更新
以下issueを参考に、↓のコマンドを実行
https://github.com/msys2/MINGW-packages/issues/240

```
pacman-key --init
pacman-key --populate msys2
pacman-key --refresh-keys
```

この後↓を複数回実施する

```
pacman -Syuu
```

再度ridk installを実施したら、通りました。
やったぜ
AWSクラウドプラクティショナー試験


##この記事について

・2カ月かけてAWSクラウドプラクティショナーに合格することができましのたので
　備忘録的なメモです。

##購入したもの

参考書
・まずは参考書を購入しました。
　「AWS認定資格試験テキスト　AWS認定 クラウドプラクティショナー」




Udemy
・安くなっているときを見計らって、これを購入しました（1,500円くらいだったと思います）。
　「この問題だけで合格可能！AWS 認定クラウドプラクティショナー 模擬試験問題集（7回分455問）」
　　基礎問題2回＋応用問題3回+難易度高問題2回という問題設定になっています。



##勉強の仕方

・まずは参考書を1回読む
　参考書は全体的にまとまっていてよい本なのですが、これだけで合格は難しいと思います。
　自分が購入したのは第9刷でしたが、実際のテストには新しい要素が多々含まれていました。
　たとえば、Glacier Deep Archive や　AWS Glue　などはテストの選択項目にありました。

・Udemyでとにかく問題を解く
　基礎問題と応用問題のレベル差が大きすぎで、最初は50点も取れずに落ち込みましたが、
　5回くらいやることで何とか9割くらいは取れるようになりました。
　（難易度高問題には手を付けませんでした）
　説明読んでも分からないところは、Webで情報収集しました。
　特に[クラスメソッドさんのページ](https://dev.classmethod.jp/)　には、かなりお世話になりました。
　面白い記事がたくさんあるので、読みすぎると私のようにテスト受けるまで時間がかかるので注意。

・直前は参考書の見直し
　Udemyを繰り返すことで問題覚えてしまうこともあるので、ここでもう一度参考書に戻って見直し。お
　テスト直前になって、「なるほど！」と思うようなところもありました。


##試験申し込み＆試験

・試験の数日前に、突然「Confirmation of Cancelled Pearson VUE Exam Appointment」 のメールが届いて
　驚きました。
　ピアソンに電話して確認すると、申込み時に登録したカードでの引き落としに失敗したとのこと。
　かなり焦ったのですが、別のカードに変更することで事なきを得ました
　（ピアソンのお姉さん、ありがとうございました！！！）

　後にカード会社に確認したところ、有効期限がまちがっていたたとのこと。
　Web画面でOKでたのになぜ？と、釈然としない部分もありますが、まあいいでしょう

・土曜午前に受験しましたが、かなり混んでいました。
　日本語の問題の分かりづらさは仕方ないですね。
　念のためすべての問題を英語で確認しながら進めたので、40分くらいかかりました。

#結果
　終了して、アンケートに回答すると、合格の文字が表示されました。
　家に帰って確認したところ869点だったので、まずまずの出来だったと思います。
　
　ちなみに、今日は朝からAWSで大きい障害が発生していたそうです（まったく知らなかった！）


##今後について
　せっかくなので、AWSソリューションアーキテクトの取得を目指そうかと思います。
　
　これから試験受ける方、頑張ってください！！
pylance(pyright)でfrom requests.packagesに対して「reportMissingModuleSource」の警告が出る

# 環境
- Language Server version: 2021.2.3
- OS : Windows
- Python version 3.9

# 内容
インポートは正常に機能しますが`from requests.packages.urllib3.util.retry import Retry`に対して「reportMissingModuleSource」の警告が出てしまう

# 解決方法
`from requests.packages.urllib3.util.retry import Retry`を
`from urllib3.util.retry import Retry`に修正するだけ

## 再現方法
仮想環境を作成　requestsモジュールをインポート

```
python -m venv venv
```

```
.\venv\Scripts\activate.bat
```

```
pip install requests
```
コード

```python
from requests.packages.urllib3.util.retry import Retry

r = Retry
print(r)
```

実行

```
>python test.py
<class 'urllib3.util.retry.Retry'>
```
インポートは正常にできていることがわかる

# 「reportMissingModuleSource」の警告
pylance(pyright)では以下のような警告が出てしまう
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/457374/aa0ad862-83e8-034c-e2e1-84134e2761f1.png)

# 原因調査

ソースを見てみると
requests/packages/urllib3/util/retry.pyがあると期待してたが
実際にはrequests/packages.pyのみで以下の記述があった

https://github.com/psf/requests/blob/master/requests/packages.py

```python:packages.py
import sys

# This code exists for backwards compatibility reasons.
# I don't like it either. Just look the other way. :)

for package in ('urllib3', 'idna', 'chardet'):
    locals()[package] = __import__(package)
    # This traversal is apparently necessary such that the identities are
    # preserved (requests.packages.urllib3.* is urllib3.*)
    for mod in list(sys.modules):
        if mod == package or mod.startswith(package + '.'):
            sys.modules['requests.packages.' + mod] = sys.modules[mod]

# Kinda cool, though, right?

```
これで`requests.packages.urllib3.`を `urllib3.`に読み替えているのでimportは正常におこなえてpylanceがrequests.packages.urllib3.util.retryの実際のソースを見つけることはが出来きずに警告が出てい理由が分かる

なので解決方法としてはどうせ読み替えられるので`from urllib3.util.retry import Retry`でインポートするのがいいのかもしれません。

ほかに解決策があれば
入力文字の行数で縦幅が可変するtextareaのReactコンポーネント

## 概要

次の記事を参考に入力文字の行数で縦幅が可変するReactコンポーネントを作成しました
react hook formがすぐに使いたかったのでforwordRefを使用して実装しています

- 【参考記事】[内容に応じてサイズが可変する <textarea> を素敵に実装する](https://qiita.com/tsmd/items/fce7bf1f65f03239eef0)
    - （非常にわかりやすく助かりました。ありがとうございます）

## TypeScriptのコード

```tsx
import { ComponentProps, forwardRef, useRef } from "react"

export const FlexTextArea = forwardRef<HTMLTextAreaElement, ComponentProps<"textarea">>(
  (props, ref) => {
    const dummyRef = useRef<HTMLDivElement>(null)

    return (
      <div className={"flex_text_area"}>
        <div className={"flex_text_area_dummy"} aria-hidden={true} ref={dummyRef} />
        <textarea
          {...props}
          ref={ref}
          onChange={(e) => {
            if (dummyRef.current) {
              dummyRef.current.textContent = e.target.value + "\u200b"
            }
            if (props.onChange) {
              props.onChange(e)
            }
          }}
        />
      </div>
    )
  },
)
```

## スタイル(less)
```less
.flex_text_area {
    position: relative;

    .flex_text_area_dummy {
        overflow: hidden;
        visibility: hidden;
        box-sizing: border-box;
        padding: 5px 15px;
        min-height: 120px;
        white-space: pre-wrap;
        word-wrap: break-word;
        overflow-wrap: break-word;
        border: 1px solid;
    }

    & > textarea {
        position: absolute;
        top: 0;
        left: 0;
        box-sizing: border-box;
        padding: 5px 15px;
        width: 100%;
        height: 100%;
        background-color: transparent;
        border: 1px solid #b6c3c6;
        border-radius: 4px;
        color: inherit;
        font: inherit;
        letter-spacing: inherit;
        resize: none;
    }
}
```
【Windows】sbtのバージョンが1.4.6以上だと､プロジェクトの直下に"null"というフォルダが作られてしまう｡

情報共有兼備忘録です｡

##不具合内容
Windowsで`sbt 1.4.6`(または`1.4.7`)を起動すると､プロジェクト直下に`null`というフォルダができてしまいました｡
![sbt_1_4_6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492981/649c9116-a7c4-8237-7320-55c384aa93c9.png)

ちなみにコマンドライン経由だと`null/Coursier/cache/v1`というフォルダが出来上がるのみですが､IntelliJ IDEA経由で起動すると更にその中にいろいろなファイルが出来上がります｡

どうも､昔あった不具合が再発してるみたいです｡

参考
[On Windows, Coursier creates "./null/Coursier/cache/v1" directories as cache #5206](https://github.com/sbt/sbt/issues/5206)

##バージョンごとの発生状況

| バージョン | 発生状況 | リリース日 |
|:-----|:----------|:----------|
| 1.4.5 | 作られない| 2020-12-14 |
| 1.4.6 | 作られる| 2020-12-24 |
| 1.5.0-M1 | 作られる| 2021-01-18 |
| 1.4.7 | 作られる| 2021-01-31 |
| 1.5.0-M2 | 作られる| 2021-02-22 |
| 1.4.8 | 作られる| 2021-03-08 |
| 1.4.9 | 作られる| 2021-03-10 |


##対処方法(暫定対応)
`sbt 1.4.5`であればこの事象は発生しないので､バージョンを上げるのをやめてそちらを使うことにします｡

以上
Github Actions 使ったらPypiへのリリースがめちゃくちゃ楽になった

## Github Actions 使ったらめちゃくちゃ楽になった

### Python Packageのリリース (Pypi)

https://github.com/tys-hiroshi/backlogprocessing を例に挙げると、


今まで、setup.cfg ファイルの`version` パラメータを修正し、
以下のコマンドをUbuntuで叩いていた。

```
pipenv shell
pipenv install --dev twine
python3 setup.py sdist --formats=zip
twine upload dist/*
```

GithubからCloneしてこないといけないし、Releaseできる環境が常にあるわけではないので、
それなりにしんどい作業だった。

.github/workflows/[名前は何でも良いよ].yml

を作成し、以下のように記載すると、PypiへReleaseできる。

PYPI_API_TOKEN は Pypiで発行したAPI TokenをGithubのSecretsに登録すること！

```yaml
name: Upload pypi package release

on:
  # Trigger the workflow on push or pull request,
  # but only for the master branch
  push:
    branches:
      - master
  release:
    types:
      - created

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v2
    - name: Set up Python
      uses: actions/setup-python@v2
      with:
        python-version: '3.x'
    - name: Install dependencies
      run: |
        python -m pip install --upgrade pip
        pip install pipenv
        pip install wheel
    - name: Build
      run: |
        python3 setup.py sdist --formats=zip
    - name: Publish a Python distribution to PyPI
      if: startsWith(github.event.ref, 'refs/tags') || github.event_name == 'release'
      uses: pypa/gh-action-pypi-publish@master
      with:
        user: __token__
        password: ${{ secrets.PYPI_API_TOKEN }}
```

Thank you for Reference:

https://help.github.com/en/actions/reference/events-that-trigger-workflows

https://github.com/oke-aditya/image_similarity/blob/9ee94f0509d590178b2fb8f547b111a8cba6ad69/.github/workflows/pypi-release.yml
PyTorchのtorch.no_grad()とは何か（超個人的メモ）

torch.no_gradはテンソルの勾配の計算を不可にするContext-managerだ。

テンソルの勾配の計算を不可にすることでメモリの消費を減らす事が出来る。

このモデルでは、計算の結果毎にrequires_grad = Falseを持っている。
インプットがrequires_grad=Trueであろうとも。

このContext managerは、ローカルスレッドだ。他のスレッドの計算には影響を及ぼさない。

関数も@torch.no_grad()デコレーターを使用して返り値requires_grad=Falseに出来る。

つまり
with torch.no_grad():
のネストの中で定義した変数は、自動的にrequires_grad=Falseとなる。


以下のようにwith torch.no_grad()か、@torch.no_grad()を使用すると

```python
import torch

x = torch.tensor([1.0], requires_grad=True)
y = None
with torch.no_grad():
    y = x * 2
# y.requires_grad = False

@torch.no_grad()
def doubler(x):
    return x * 2

z = doubler(x)
# z.requires_grad = False
```

```python
import torch

x = torch.tensor([1.0], requires_grad=True)

y = x * 2
# y.requires_grad = True

def doubler(x):
    return x * 2

z = doubler(x)
# z.requires_grad = True
```

参考
https://pytorch.org/docs/stable/generated/torch.no_grad.html
Flutter 同じ名前のクラスをimportするには？

#クラスの名前衝突を避けるには？
まぁ結論として、同じ名前のクラスを作らなければいいだけの話なのですが、、:sweat_smile:

どうしても同じ名前のクラスをimportするしかない場合、どうしたら良いか？を調べると、とっても簡単だったのでご紹介！

#やり方は２パターンある
下記のような３つのファイルがあったとする。

```dart:main.dart
import '../providers/cart.dart';
import '../widgets/cart_item.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override 
 Widget build(BuildContext context) {
    // providers/cart.dartからCartクラスをimportしてる
    final cart = Provider.of<Cart>(context);
    // 省略

      Expanded(
            child: ListView.builder(
              //  widgets/cart_item.dartからCartItemクラスをimportしてる
              itemBuilder: (ctx, i) => CartItem(
                //
              ),
            ),
          )
   }
}
```

```dart:/providers/cart.dart
class CartItem {
  final String id;
  final String title;
  final int quantity;
  final double price;

  CartItem({
    @required this.id,
    @required this.title,
    @required this.quantity,
    @required this.price,
  });
}

class Cart with ChangeNotifier {

}
```

```dart:/widgets/cart_item.dart
class CartItem extends StatelessWidget {
  final String id;
  final double price;
  final int quantity;
  final String title;

  CartItem(
    this.id,
    this.price,
    this.quantity,
    this.title,
  );

  @override
  Widget build(BuildContext context) {

}
```

`CartItem`という名のクラスが２つ存在しており、main.dartでは同じ名前のクラスが２つimportされていることになる。。。

こういう場合、やり方は２通りあります。

##asキーワードを使う

```dart:main.dart
import '../providers/cart.dart';
import '../widgets/cart_item.dart' as wCart;

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override 
 Widget build(BuildContext context) {
    // providers/cart.dartからCartクラスをimportしてる
    final cart = Provider.of<Cart>(context);
    // 省略

      Expanded(
            child: ListView.builder(
              //  widgets/cart_item.dartからCartItemクラスをimportしてる
              itemBuilder: (ctx, i) => wCart.CartItem(
                //
              ),
            ),
          )
   }
}
```

`as`を使うことで、import時のどちらか一方のクラスを擬似的に変えることができます。

##showキーワードを使う

```dart:main.dart
import '../providers/cart.dart' show Cart;
import '../widgets/cart_item.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override 
 Widget build(BuildContext context) {
    // providers/cart.dartからCartクラスをimportしてる
    final cart = Provider.of<Cart>(context);
    // 省略

      Expanded(
            child: ListView.builder(
              //  widgets/cart_item.dartからCartItemクラスをimportしてる
              itemBuilder: (ctx, i) => CartItem(
                //
              ),
            ),
          )
   }
}
```

今回の例では`/providers/cart.dart`に**「CartItemクラス」と「Cartクラス」の２つが存在していました。**それが原因でmain.dartで名前解決ができないエラーが発生していました。。

ということは、`/providers/cart.dart`から**「Cartクラス」だけimportできれば解決ですね？**

なぜなら使いたいのは「Cartクラス」だけで、`cart_item.dart`で定義てるクラスと名前が被ってる「CartItemクラス」はimportする必要がないからです！

お好きな方をどうぞ！:grin:
Windows10からAWS ECRにDockerイメージをプッシュする

Windows10からAWS ECRにDockerイメージをプッシュします。

# 環境

Windows10 Pro
Docker for Windows 20.10.2
aws cli 2.1.10

```
docker --version
Docker version 20.10.2, build 2291f61

aws --version
aws-cli/2.1.10 Python/3.7.3 Linux/4.19.121-linuxkit docker/x86_64.amzn.2 prompt/off
```

aws cliはDockerで実行するタイプです。

# レポジトリを作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29324/d3abf4e2-5208-92f3-f72b-bac3dfe069c8.png)

「リポジトリ名」を入力し、「リポジトリを作成」をクリックします。
リポジトリ名＝イメージ名です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29324/22bf40bc-d2a0-af32-627e-f4da801ae454.png)

リポジトリが作成されました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29324/e2b7c977-99a3-e21c-45df-d94b6417589e.png)

# Dockerイメージをプッシュします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29324/a5f872cb-ffa6-62af-c0fa-08d9d7fdce92.png)

リポジトリを選択し、「プッシュコマンドの表示」をクリックします。
OS別にプッシュコマンドが表示されます。Windowsでもaws cliコマンドが使える場合、「macOS/Linux」の方法でプッシュできます。
Windowsの方は初回でエラーになったのでそれ以降試していませんが...

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29324/2189eae8-ea00-3b9b-d29e-004b2f077ae0.png)

```powershell
PS C:\> aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin 013311312082.dkr.ecr.ap-northeast-1.amazonaws.com
Login Succeeded
PS C:\> docker tag my_work_php:latest 013311312082.dkr.ecr.ap-northeast-1.amazonaws.com/my_work_php:latest
PS C:\> docker push 013311312082.dkr.ecr.ap-northeast-1.amazonaws.com/my_work_php:latest
The push refers to repository [013311312082.dkr.ecr.ap-northeast-1.amazonaws.com/my_work_php]
a1b1f93dda6e: Pushed
a908950ceaa5: Pushed
c237d48abef2: Pushed
8235c11a20e4: Pushed
17c2436afe5e: Pushed
a6f79b9f8213: Pushed
e20f9867e86d: Pushed
7831f8733bf5: Pushed
9c468bc69dbf: Pushed
5f29a23c8e9c: Pushed
0e754215b5eb: Pushed
6c0111550081: Pushed
02c59e64a328: Pushed
8888f89886ba: Pushed
f182865e86e9: Pushed
b2bb5e569df9: Pushed
d0fe97fa8b8c: Pushed
latest: digest: sha256:89fbf2f0ed4ab79debbbeed6bd5bda55eb24e635784efc1987cf3dd1fe934310 size: 3879
```
*)ここではイメージの作成はスキップしています。
[Unity3D] Terrain オブジェクトの配置

1, TerrainのPaintTreeを選択し、EditTreesを選びオブジェクトを選ぶ
![FF813CBE-F8AA-45AA-ABA2-B699434A448E_4_5005_c.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/940521/5787da1a-a777-9448-5415-6d544e39e47b.jpeg)
バリデーションをControllerではなくFormRequestに記述

#概要
今までバリデーションは`Controller`に記述していたのですが、分離させた方が読みやすくなると思って調べてみたら、`FormRequest`というものが使えるらしいので、実装してみました。

#実装
公式サイトを参考に実装してみました。
[公式サイト](https://readouble.com/laravel/8.x/ja/validation.html#rule-max)
##改善前

```AccountController.php
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Http\Requests\AccountRequest;
use App\Models\User;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Hash;
use Illuminate\Validation\Rule;


class AccountController extends Controller
{
    public function update(Request $request)
    {
        $request->validate([
            'email' => ['required', 'string', 'email', 'max:255', 
            Rule::unique('users')->ignore($request->id)],
            'password' => ['required', 'string', 'min:8'],
        ]); 
        DB::beginTransaction();
        try{
            $user = User::find($request->id);
            $user->email = $request->email;
            $user->password = Hash::make($request->password);
            $user->save();  
            
            DB::commit();
        }catch(\Exception $e){
            DB::rollBack();
        }

    }
}
```

##改善後


```
php artisan make:request AccountRequest
```

```AccountController.php
<?php

namespace App\Http\Controllers;

use App\Http\Requests\AccountRequest;
use App\Models\User;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Hash;

class AccountController extends Controller
{
    public function index($login_id){
        $user = User::find($login_id);
        return $user;
    }
    public function update(AccountRequest $request) //←ここ変更
    {
        DB::beginTransaction();
        try{
            $user = User::find($request->id);
            $user->email = $request->email;
            $user->password = Hash::make($request->password);
            $user->save();  
            
            DB::commit();
        }catch(\Exception $e){
            DB::rollBack();
        }
    }
}
```
```AccountRequest.php
<?php

namespace App\Http\Requests;

use Illuminate\Http\Request;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Validation\Rule;

class AccountRequest extends FormRequest
{
    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        return true;
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules(Request $request)
    {
        return [
            'email' => ['required', 'string', 'email', 'max:255', Rule::unique('users')->ignore($request->id)],
            'password' => ['required', 'string', 'min:8'],
        ];
    }
    public function attributes()
    {
        return [
            'email' => 'メールアドレス',
            'password' => 'パスワード'
        ];
    }
}
```

#まとめ
分けた方が管理しやすいし便利ですね。
VMware Workstation Player メモ

# VMware Workstation Player for Linux

## カーネルモジュールのコンパイルダイアログで install ボタンを押下しても先に進まない

下記のメッセージのダイアログが表示され、通常は install ボタン押下 ⇒ rootパスワード 入力でカーネルモジュールのコンパイル & ロードが行われますが、何故か root パスワードの質問が無く、install ボタン押下⇒ダイアログ表示 の無限ループになることが稀によくあります。

![VMware_Kernel_Module_Updater_Dialog.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117636/501a96b0-07fe-b916-e196-e78074fccc7f.png)


理由はよくわかりませんが、手動で vmware-modconfig コマンドを実行しカーネルモジュールのインストールを行うと解決します。

```bash
$ sudo vmware-modconfig --console --install-all
```