OmniAICreator/Qiita-1.07M huggingface dataset:
メモ：C#の環境をWindows上のVSCodeで構築

若干古いWindowsServer2012だけど大して変わらないはず

## コンパイラ
まずは対応している中で最新版の.NET SDKを入れる。
プロジェクト作ってデバッグしたい場合は
https://dotnet.microsoft.com/download
からCoreSDKをダウンロード

C#のコンパイルが出来れば良いという場合は、例えば以下をDLして
https://dotnet.microsoft.com/download/dotnet-framework/net48
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe
がC#コンパイラとなっている。


## VSCode
VSCodeで拡張機能を追加
 * C# MS謹製の拡張パック
 * C# Extensions　新規クラス作るのが楽になる等

フォーマット関係の設定はomnisharpというものが使われているらしい
[ここ](https://github.com/OmniSharp/omnisharp-roslyn/wiki/Configuration-Options)にFormatting optionsの書き方があるのでコピペして好みに修正か
[ここ](https://ascii.jp/elem/000/004/038/4038170/)のフォーマットなんかを参考にすれば良さそう。

omniSharpに関係する設定は
File-Preferences-Settings → Extensions → C# configuration → OmniSharp:設定
この中からUse Editor Formatting Settingsを外すことで設定ファイルomnisharp.jsonが優先されるようになる。
あとはファイルを配置してVSCodeを再起動すればとりあえずフォーマットは動作するはず。（右クリックからフォーマットを実行）
Windowsでのファイルの配置場所は%USERPROFILE%\.omnisharp\
USERPROFILEはコマンドプロンプトを立ち上げた時のカレントディレクトリ。echo %USERPROFILE%で表示してもよい。

※なお、.omonisharpフォルダをエクスプローラから作る時は.omonisharp.と打ち込んでやる

"NewLinesForBracesInControlBlocks": false
とかにすると

```
if(...){
    ...
}
```
のようにifの後ろで改行しなくなる。
（こっちの方が好き）

## 実行とデバッグ
まずはテスト用のファイルを作成。

```
using System;

class Test
{
    public static void Main(){
        Console.WriteLine("Hello World");
    }
}
```
この状態でもターミナルで`csc ./Test.cs`を実行する事でコンパイル、exeファイルの作成までは出来る。


ただ、現状でVSCodeの実行からやっているわけではないので、もう少し対応する。
`dotnet new TmplateName --name ProjectName --output OutputDir`
でドットネットのプロジェクトを作成する方法が一般的な感じ。


launch等はVSCodeで自動生成も出来るみたいなのでプロジェクトを作らずにやってみた。
.vscodeを一度削除して、フォルダを開きなおしたりしてからTest.cs上でF5を押すと自動でlaunch.jsonが作成された。
デバッグなし実行を選択、このままデバッグで
launch：プログラム
～<insert-project-name-here>.dllが存在していません

次はタスクの構成でMSのビルド構成を選択して
テンプレートからtasks.jsonを選択すると自動でファイルが作成されたので再度実行すると

>MSBUILD : error MSB1003: プロジェクト ファイルまたはソリューション ファイルを指定してください。現在の作業ディレクトリはプロジェクト ファイルまたはソリューション ファイルを含んでいません。


ここまで来て諦めた。


やはりdotnet newコマンドからプロジェクトファイルを作成するのが良さそうなので
`dotnet new console --name test`
を実行、自動生成されたフォルダで開きなおす。
launch.json等は少し待った後に右下に表示されるダイアログでYESを押して自動作成。

F5を押してみると

>プロジェクトの既定の xml 名前空間は msbuild の xml 名前空間でなければなりません。

Projectタグに以下を追加すると大丈夫になった。
xmlns="http://schemas.Microsoft.com/developer/msbuild/2003"

実行とデバッグから緑の△を押すと「デバッグコンソール」にHello Worldと表示された。
WriteLineにブレークポイントを設定して再度実行すると止まったので、コンソール向けのC#はこれで開発可能になった。

最終的にexeファイルを作成する場合は

```
dotnet restore
dotnet publish -c Release
```

のようにすると(本来はビルドターゲットも指定できるが）bin/Releaseの下にexeファイルが作成される。
AMSAMOTIONの中華PLC(FX3U風)を使ってみよう その1

AliExpressで変なものを買うのが趣味なのでこんなものを買ってみた。
AMSAMOTION AMX-FX3U-26MT-E という(FX3U風)PLCです。
買ったのはいいが長らく放置してたので記事のネタにすることにした。

https://ja.aliexpress.com/item/4001264357068.html

* メーカーサイト(中文で見ないと全ての商品が見れない)

http://www.amsamotion.com/product_view_1011_515.html

* マニュアル

http://www.amsamotion.com/show_569.html

中華PLCって色々種類あるけどメーカーが不明であったりしますがこれはマニュアルもあるし
一番すごいのはEthernetポートがあるところです。
MCプロトコルとMODBUS/TCPに対応

# スペック
入力:16点(シンク,ソース両対応)
出力:10点 トランジスタ出力(マイナスコモン,シンク)
アナログ入力:2点
アナログ出力:2点
10/100Mbpsネットワークポート:MCプロトコル,MODBUS TCP
プログラム容量:16000Step

# 外観
![DSC_3467.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2146151/c89ac6f2-15c6-9326-c250-a2de2ed615a7.jpeg)
![DSC_3470.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2146151/96a17f1b-5dba-83fe-29c2-c020dc0ca251.jpeg)
![DSC_3472.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2146151/1b1c7e28-aab3-2768-a6b0-45ad6ee56eab.jpeg)
![DSC_3475.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2146151/45f3fb78-0cd7-8088-f88d-c9b57d834b7a.jpeg)
![DSC_3477.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2146151/dc8b7f59-a959-9bb1-a8cc-39c1fa71a1cf.jpeg)
![DSC_3479.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2146151/acee1c2c-a08c-6653-6858-adfa80624a1b.jpeg)
![DSC_3481.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2146151/bd998d5c-7003-a985-5894-ff7c5de3556c.jpeg)
![DSC_3483.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2146151/5539f206-46d4-8ef0-f3f3-a96c6b463b10.jpeg)

# 中身
CPU:STM32F103VET6(72MHz,ARM Cortex-M3,FLASH 512KB,RAM 64KB)
LAN:WIZnet W5500
![_DSC5358.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2146151/551f8109-ed2c-8335-919a-3dde288478ea.jpeg)
![_DSC5382.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2146151/ba9ef99f-cef3-efe0-0441-f3bbdb901703.jpeg)
![_DSC5368.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2146151/c63da1f3-4b67-199f-614c-7cf9bc749ec9.jpeg)
![_DSC5378.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2146151/9c3f9304-7ab5-ca4a-fd5b-76fc7345ab04.jpeg)
![_DSC5375.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2146151/ce5c5b2f-8ac3-665e-4299-4e8120f45070.jpeg)

# まとめ
次回は使ってみよう
【物体検出】Google Colabで電車の車両形式を判定させてみる【YOLOv5】

# はじめに

任意のデータセットで物体検出のモデルを作成する手順について備忘録としてまとめました。
今回はGoogle ColabでYOLOv5を使用して物体検出モデルを作成しますので、Googleアカウントがあれば誰でも簡単に試すことができます。なお、ローカル環境でのモデル作成は以前の記事を参照してください。

（参考記事）ローカル環境でのYOLOv5モデル作成

https://qiita.com/hkwsdgea_ttt2/items/ccac4cec24a3799df8f3



# 成果物
以下のようにYolov5の物体検出により動画または画像から電車を抽出して、車両形式を判定します。
今回は一般型(E231系,E233系など)、特急(E257系,E353系など)、機関車(EH200系,EH500系など)など14種類の車両形式を対象とします。



![IMG_4911.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1559455/49c52663-8e7b-c67a-871b-e0cc9b2f9b36.jpeg)![IMG_4926.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1559455/b5064663-8009-598d-2d1c-444ecdd8ee25.jpeg)

https://youtu.be/UqBF30AqavU




# 物体検出とは
物体検出（object detection）とは、画像内の「どこに」「何が」写っているかを検出する技術のことです。
物体検出としては、SSDやYOLOといったものがよく使用されます。

# YOLOv5とは
YOLOv5とは、物体検出をするアルゴリズムですがYOLOv3の後継にあたり、2020年に公開された最新のモデルです。YOLOv4という高精度化したYOLOv3の後継モデルもありますが、YOLOv5は推論処理時間がより速くなっているのが特徴です。



# 環境構築

まずはGoogleドライブをマウントします。

```ruby:cmd
from google.colab import drive
drive.mount('/content/drive')

```

クローンしてきます。

```ruby:
%cd ./drive/MyDrive
!git clone https://github.com/ultralytics/yolov5
```

次に必要なライブラリをインポートします。

```ruby:
%cd yolov5
!pip install -qr requirements.txt
```

```ruby:python
import torch
model = torch.hub.load('ultralytics/yolov5', 'yolov5x', pretrained=True)
```



以上で準備完了です。

# 準備

YOLOv5でモデル作成の際に必要となるのは、教師データ・アノテーションデータ・yamlファイルです。これらをGoogleドライブにアップします。

教師画像とアノテーションファイルを作成したうえで、それぞれyolov5内の場所に格納していきます。
①画像(.jpg)
②アノテーションファイル(.jpg)
③yamlファイル(.yaml)

```
yolov5
  ┠ data
  ┃  ┠ train
  ┃  ┃   ┠ images
  ┃  ┃   ┃   ┗ *.jpg
  ┃  ┃   ┗ labels
  ┃  ┃       ┗ *.txt
  ┃  ┠ valid
  ┃      ┗ images
  ┃          ┗ *.jpg
  ┗ traincar.yaml
```

coco.yamlをコピーしてtraincar.yamlと名前を付けて、ファイル内を以下のように書き換えます。

```traincar.yaml
train: .data/train/images # 学習の画像のパス
val: .data/valid/images # 検証用画像のパス
#number of classes
nc: 14
names: [ 'E231','E233',...]
```

`number of classes`：物体検出対象のクラス数です。今回は14種類なので14とします。
`class names`：物体検出対象の名前です。任意の名前にすることが可能です。
# 学習

学習は以下のコマンドを実行すれば開始します。
初めから学習するときは以下のコマンドを入力を実行して学習を進めます。

```
!python train.py --img 640 --batch 4 --epochs 1000 --data traincar.yaml --weights yolov5x.pt --name traincar
```

上記の引数は以下の通りです。
`batch`:バッチサイズを指定します。
`epochs`:学習回数を指定します。
`data.yaml`:先程作成したyamlファイルを指定します。
`weights`:ここではyolov5x.ptを指定します。

#前回の続きから学習
YOLOv5では学習するごとに結果がGoogleドライブに自動で保存されます。
`--resume`を付け加えることで、前回までの結果の途中から学習することができます。

```
!python train.py --resume --img 640 --batch 4 --epochs 1000 --data traincar.yaml --weights yolov5x.pt --name traincar
```



# 結果

学習が終わるごとに`/runs/train/traincar/weights/`に`best.pt`と保存されます。

# まとめ

実際に`best.pt`でテストしてみます。
電車の車両形式判定モデルを作ることができました。


![IMG_4893.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1559455/af3775b4-5994-ee07-285b-14586f62a83e.jpeg)
![IMG_5045.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1559455/639ea53a-4179-809d-3775-d0c38f09e705.jpeg)


# おわりに
最後までご覧いただきありがとうございました。
訂正要望・ご意見等がございましたら、ご連絡頂けますと幸いです。
gRPCについて簡潔にまとめてみた

#gRPCについて
##はじめに
gRPC初心者がgRPCについてまとめてみました。間違っている部分や補足などありましたらガンガン投げていただけると嬉しいです。
Web+DB PRESSのVol.110「速習gRPC」の記事を参考にしております。(めちゃくちゃわかりやすかった。。)
新たに学んだことがあったらどんどん追記していく予定です。
＊実務経験1年程度の駆け出しエンジニアです。業務ではRESTを使用した開発を行っております。gRPCに精通している訳ではないのでその点ご容赦ください。

##gRPCとは
grpcはGoogleが開発し、OSSとして提供されている　RPC(遠隔手続き呼び出し)フレームワークです。
gRPCを用いることで様々な言語で書かれたクライアントアプリケーションから、別のマシーンのサーバアプリケーションへ通信手段を意識せずに接続できる。マイクロサービス間の通信に適している。


###通信プロトコルはHTTP/2を使用
gRPCは通信プロトコルとしてHTTP/2を使用しているHTTPメソッド、ステータスコード、URL、ヘッダなどに変更はなく、特徴としてストリームが挙げられる。

###ストリームとは
同一のTCP接続においてクライアントとサーバ間で双方向にデータをやりとりできる仕組みのことである。単一のTCP接続の中で複数のストリームを生成し、リクエストとレスポンスを並列に処理できる。それらは個々で独立しておりブロックされることはない。

・gRPCの主な用途
・マイクロサービス間の通信
・モバイルアプリとサーバ間の通信
・ブラウザとサーバ間の通信
###gRPCとRESTの通信間の違い
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599304/d3391175-c6b0-8690-79df-ec0829546086.png)


##gRPCとRESTでは何が違うのか

##設計モデル
###REST: リソース
RESTはリソース指向の設計モデルである。URLとHTTPメソッドで対象のリソースを操作する。URLが対象のリソースを表現して、HTTPメソッドのPOST,GET,PUT,DELETEがCRUD操作に対応する。
###gRPC: メッセージとサービス
gRPCはRPCと呼ばれる通信相手に操作を要求する手法を採用している。gRPCの場合、操作そのものをサービスおよびメソッドで表現して、操作に必要な情報や操作の結果を型付けしたメッセージを表現する。




##データ形式
###REST: JSON
JSONの利点は読みやすい、多くのプログラミング言語がサポートしている。拡張しやすいなどが挙げられる。しかしサーバおクライアントの両方で対象のJSONを解析するコードを書く必要があり、使用しているプログラミング言語が違うとそれらのコードを言語ごとに書かなければならない。

###gRPC: バイナリデータ
gRPCはバイナリデータを使用する。
gRPCがデフォルトで使用するprotobufはprotocコマンドを提供している。protocコマンドはデータ構造やRPCを定義したファイルをコンパイルして、対象のプログラミング言語に対応したコードと、それらをバイナリデータに変換するコードを生成する。
これにより、サーバとクライアントで使用している言語が違う場合も、データをシリアライズ/デシリアライズするコードを書く必要がなくなり、シームレスに接続できる。

##通信方式
###REST:リクエスト/レスポンス
RESTは1つのリクエストに対して1つのレスポンスを返す方式をサポートしている。1つのリクエストで複数のレスポンスを取得する通信や、チャットのような双方向な通信はRESTの範囲外となる。


###gRPC:様々なストリーミング
gRPCは1つのリクエストに対して1つのレスポンスを返す方式の他、HTTP/2の機能を活かしたストリーミングによる通信方式を提供している。ストリーミングによる通信方式は3種類あり、サーバからクライアントへの複数のメッセージを送信する方式、クライアントからサーバへ複数のメッセージを送信する方式、さらにクライアントとサーバの双方向で複数のメッセージを送信する方式がある。

今回はここまで。
次回はgRPCのデータ形式、Protocol Buffersについて記事にしたいと思っております。
Swift Vaporの環境構築方法

SwiftはVaporというサーバーサイドフレームワークがあり、環境構築してみた。
--
インストール

```
brew install vapor
```

確認　

```
vapor --help
```

しっかり入っていたら

```
vapor new プロジェクト名 --template=web
```

ビルド

```
cd プロジェクト名
vapor build
```

実際にrun

```
vapor run
```

でできたサーバーを開けば
![スクリーンショット 2021-10-30 8.24.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1474285/5d08cf86-9017-5131-a7e6-fe382785ddec.png)


これが出てくるはず。とても簡単でした。とは言ってもこれでwebアプリケーションを開発したわけではないので、
モバイルアプリの開発の息抜きに下記のドキュメント見ながら勉強したいと思います。

https://docs.vapor.codes/4.0/
404 Not Found nginx/1.12.2とは何か・解決方法

EC2でnginxを起動した際にエラーが発生した
##404 Not Foundとは何か
存在しないwebページへのアクセス時に発生するHTTPステータスコードのこと。
発生する要因として、該当アドレスのページがない、またはそのサーバーが落ちている状態などがある。
##解決方法
まず、nginxのエラーログを確認

```
$ sudo tail -n 20 /var/log/nginx/error.log

 [error] 30547#0: *11 FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream, client: ****, server: _, request: "GET / HTTP/1.1", upstream: "fastcgi://unix:/run/php-fpm/www.sock:", host: "****"

```

どうやらnginx.confのrootが間違っていたらしい

```
server {
        listen       80 default_server;
        listen       [::]:80 default_server;
        server_name  _;
        root         /home/webapp/laravel-ci/public; #この行を変更
        (/usr/share/nginx/html;を/home/webapp/laravel-ci/public;に)

        location / {
        }
```
[RDS] mysql でmysqldumpのimportが失敗する・・

データベースを mysql8.0 にしているときに、mysqldump したファイルをmysqlコマンドで別スキーマにインポートすると、以下の様なエラーが出る。

```
ERROR 1227 (42000) at line 18: Access denied; you need (at least one of) the SUPER, SYSTEM_VARIABLES_ADMIN or SESSION_VARIABLES_ADMIN privilege(s) for this operation
```

## 解決策

RDSのパラメータグループの設定について gtid-mode を　OFFにしました

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42407/7fe0758c-b7d2-6a30-890e-a6700aaade62.png)



## 解説など

ちなみに Line 18の記述はこんな感じ

> SET @@SESSION.SQL_LOG_BIN= 0;


エラーメッセージの提案としてはユーザーに権限をあたえることとなっているけど、RDSのユーザーはSUPER権限は許容されていないです。
なので、ユーザーが許容されていないコマンドの原因となる設定を変更しました。これが、gtid-modeとなっています

よくみるとmysqldump作成時に以下の様なwarningが出ていた

```
Warning: A partial dump from a server that has GTIDs will by default include the GTIDs of all transactions, even those that changed suppressed parts of the database. If you don't want to restore GTIDs, pass --set-gtid-purged=OFF. To make a complete dump, pass --all-databases --triggers --routines --events. 
```

DBのレプリケーションをする様な場合はgtid-modeを有効にする必要があるようなのですが、私の要件ではそれが必要無かったので、コピー元の設定を変更することで対応

gtid-modeの話としてはこのあたりが参考記事：https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/mysql-replication-gtid.html

一連の操作でやりたかったことは本番データベースの内容でステージング環境を構築することだったのですけど、本番データベースの設定を変えられない場合は、mysqldumpで出力される内容を変更することで対応できるようです

参考：https://docs.microsoft.com/ja-jp/azure/mysql/howto-troubleshoot-common-errors

> RROR 1227 (42000) at line 18 (エラー 1227 (42000)、行 18): Access denied; you need (at least one of) the SUPER privilege(s) for this operation. (アクセスが拒否されました。この操作には、(少なくとも 1 つの) SUPER 権限が必要です。)
GTID が有効にされている MySQL サーバーからターゲット Azure Database for MySQL サーバーにダンプ ファイルをインポートしようとすると、上記のエラーが発生することがあります。 Mysqldump では、GTID が使用されているサーバーからのダンプ ファイルに SET @@SESSION.sql_log_bin=0 ステートメントが追加されます。これによって、ダンプ ファイルがリロードされている間のバイナリ ログが無効になります。

>解決方法: インポート中のこのエラーを解決するには、万全を期すために、mysqldump ファイルにある以下の行を削除するかコメント アウトしてから、再度インポートを実行してください。

> SET @MYSQLDUMP_TEMP_LOG_BIN = @@SESSION.SQL_LOG_BIN; SET @@SESSION.SQL_LOG_BIN= 0; SET @@GLOBAL.GTID_PURGED=''; SET @@SESSION.SQL_LOG_BIN = @MYSQLDUMP_TEMP_LOG_BIN;
初心者が一か月目でアンドロイドアプリ開発中に起きたエラー

１　デザインとして解決したいプログラムやレイアウトを考える。
２　cssとして解決できる要素なのかを見分ける。
３　JSとしてできるプログラムなのか見分ける。

スクレイピング　scraping

`<html></html>`
`<body></body>`
`<h></h>`
`<p></<p>`
`<br></br>`
`<li></li>`
`<div></div>`
`<div class="></div>`
`<style></style>`
`<script></script>`
`<code></code>`
`<detail><summary></summary></detail>`

css property
`.id{text-align:left;
color:;}``

参照
https://qiita.com/shizen-shin/items/a997bc228fa2850c9fce
[aws,ecs,terraform]ecsでtaskが立ち上がらない原因例

## 何があった？
terraformを使って画面からではなく、jsonファイルを準備してコマンドからでecsを立ち上げようとしたら下記画像のようになって、タスクが立ち上がりませんでした。また、コンソール上にもエラーはでませんでした。

さらにaws画面上のエラー文が`Task failed to start`のみという調査ハードモードでした。（通常は２枚目の画像の詳細の下にエラー文が出現するのですが今回は出ませんでした。ちなみに原因はエラーではない挙動のためであり、その理由は結論を読んでもらうとわかります。）

[ecsのタスク詳細画面]
![スクリーンショット 2021-10-30 6.20.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555157/1373bcd3-d61d-33d1-bfc6-be959a945185.png)
![スクリーンショット 2021-10-30 6.20.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555157/6eea481c-c656-810d-db8e-ddefdf5bb265.png)

[コマンドの画面]
![スクリーンショット 2021-10-30 7.04.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555157/4b5e16bf-7121-676d-1e66-500553623e25.png)


## 調査過程

下記の記事を見つけて指示内容を調べてみましたが、筆者の場合はすべて正しく準備されていて解決できませんでした。

[aws公式]
https://aws.amazon.com/jp/premiumsupport/knowledge-center/ecs-fargate-pull-container-error/
https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_cannot_pull_image.html

[個人記事]
https://github.com/aws-actions/amazon-ecs-deploy-task-definition/issues/62
https://qiita.com/x-color/items/8f986d01d6a6100b7d5b

そして、調査に詰まったため参考にした書籍を最初から読み直したところ、原因を特定することができました。

## 結論（原因と解決方法）

原因はecs-service-def.jsonの`desired_count`(タスクの個数指定）部分が0になっていたからでした。（元々タスクが立ち上がらない指定をしてしまっていたため、エラー判定されない状態となっていました。）
よってこの部分を１にすることで、タスクが立ち上がることを確認できました。

詳細は[terraformの公式リファレンス（desired_countに関する記述）](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/ecs_service#desired_count)を見ていただけるとわかります。

[タスクが立ち上がった様子]
![スクリーンショット 2021-10-30 6.38.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555157/f8cb2194-fc21-9714-4dd7-ae228b2a6b44.png)



## 余談
調査過程で見つけた上記の記事は、本当にありそうな内容だったので、筆者のエラーでなかった場合はぜひ参考していただけると良いと思いました。

また、それでも解決できず本当に困ったら、筆者のように読み飛ばしている部分があるかもしれないため、最初に参考にした記事を最初から読み直すのをおすすめします。
Geeetech A10のファームウェア(Marlin)の更新方法



## TL;DR
Geeetech A10のファームウェア(Marlin)を1.0.8から2.0.xにアップデートしました。

## 使うもの
- VScode
- VScodeのPlatformIOの拡張機能
- USBケーブル

## バージョン情報
- 実施日 2021年10月30日
- windows10 home 20H2
- Marlin 2.0.x
- PlatformIO IDE 2.3.4

## 方法
### 1.下準備
VScodeにPlatformIOの拡張機能を入れます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327331/b563ad70-820d-4788-5dc2-84c7369998f7.png)

インストール出来たら、[Marlinのgithubリポジトリ](https://github.com/MarlinFirmware/Marlin)より最新バージョンをダウンロードし、`Marlin/config/`に入ってるreadme.mdにあるリンクからconfigurationファイルのアーカイブをダウンロードします。

### 2. configurationファイルの置き換え
configurationのアーカイブの中に`exmaples/geeetech/A10`というフォルダがあり、中に`configuration.h`と`configuration_adv.h`が入っているので、これをMarlinの中に入っている`configuration.h`と`configuration_adv.h`と入れ替えます(下の画像の印を付けたものを置き換えます)。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327331/b974abfa-bb24-9e18-c0fa-3824ede34a18.png "この印を付けたのを置き換えます")


### 3. ビルド
VScodeでMarlinのフォルダを開きます。以下のようなファイル構成かと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327331/0524213a-f0d4-db4c-82d6-a72ce2ec9029.png)

VScodeの下には下のようなPlatformIOのボタンが出ていることを確認してください(この拡張機能はインストールに際し、VScodeの再起動が必要です)。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327331/2fc4599d-d6e1-5913-ab78-40d6bfb3772a.png)
このチェックマークを押すとビルドがはじまります。

もしビルドに必要なライブラリが無くビルドに失敗した場合、PIO HomeのLibrariesにて検索しインストールすることが出来ます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327331/ac9cdc0c-acd0-56c4-91b0-110130040a4a.png)

### 4. 書き込み
ビルドの完了後、A10をPCに繋ぎ(A10をPCに繋ぐタイミングはいつでも良いと思います)、VScode下部の右に向いた矢印をクリックするとA10に書き込まれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327331/f13ad263-6e81-5a6e-abd4-2909af3e4491.png)

### 終わり
以上でGeeetech A10のファームウェアの更新は完了です。

## 参考

https://www.tobiasschuerg.de/3d%20printing/2019/12/08/geeetech-a10-marlin-v2.html

https://www.youtube.com/watch?v=1EoGAKu6zwY&t=283s

(なお上記の動画ではvert-Marlinを使用していますが、こちらは動作しませんでした。ファームウェアが正しく動作していない場合、A10のディスプレイ表示がおかしくなります。)

https://marlinfw.org
Python 3.8.10におけるCaboChaの環境構築 windows版

# はじめに
初投稿です。
~~2021/10/30時点でCaboChaの環境を作成したところ、参考になる記事は複数あるものの、かなりの苦労を要した為記事にしました。~~
記事を書いている途中で、苦労した部分をすべて吹き飛ばす簡単な方法が発見されたので前の記事はボツになりました。
本記事では、MeCabのインストールからCaboChaの環境作成までを扱います。

# 環境
- Windows 10
- Python 3.8.10 (32bit)

# Python 64bit版について
MeCabの使用は可能なようですが、CaboChaの使用が不可能なようです。
大人しく32bit版をインストールしてください。
32bit版をインストールする際には、"PATHを通す"のチェックボックスにチェックを入れてください。

# MeCabのインストール
[MeCab公式](https://taku910.github.io/mecab/)より、MeCabのダウンロードを行います。
今回はWindowsなので、自己解凍インストーラを選択してください。
私は、mecab-0.996.exeを選択しました。
インストーラを起動後文字コードを選択する場面がありますが、UTF-8の選択をお勧めします。
インストールが終了した後、MeCabにPATHを通します。
画面右下の吹き出し->すべての設定->システム->詳細情報->システムの詳細設定->環境変数に移動した後、システム環境変数にあるPathを選択し、編集で末尾にPathを追加します。
追加するPathはMeCabをインストールした場所によって異なりますが、恐らく`C:\Program Files (x86)\MeCab\bin`だと思います。

# MeCabの動作確認
cmdで今回インストールしたMeCabを実行した場合、文字コードが異なる為に結果が文字化けします。（cmd標準文字コードはcp932）
ただ、今回は動作確認の為動けば良いです。

```:実行例
> mecab
めかぶスープ
めか    險伜捷,荳闊ｬ,*,*,*,*,*
ﾔ       蜷崎ｩ・蝗ｺ譛牙錐隧・邨・ｹ・*,*,*,*
X       蜷崎ｩ・荳闊ｬ,*,*,*,*,*
        險伜捷,荳闊ｬ,*,*,*,*,*
[       蜷崎ｩ・繧ｵ螟画磁邯・*,*,*,*,*
        險伜捷,荳闊ｬ,*,*,*,*,*
v       蜷崎ｩ・蝗ｺ譛牙錐隧・邨・ｹ・*,*,*,*
```

この様になれば大丈夫です。

# Pythonへのバインディング
MeCabのバインディングはPyPIに公開されている様なので、pipでインストール可能です。

```
pip install mecab
```

# Pythonでの動作確認
以下のコードを実行してみましょう。

```python
import MeCab
t = MeCab.Tagger()
s = "めかぶスープ"
print(t.parse(s))
```
 
```:実行結果
め      名詞,一般,*,*,*,*,め,メ,メ
かぶ    動詞,自立,*,*,五段・ラ行,体言接続特殊２,かぶる,カブ,カブ
スープ  名詞,一般,*,*,*,*,スープ,スープ,スープ
EOS
```

# CaboChaのインストール
[CaboCha公式](http://taku910.github.io/cabocha/)より、最新のCaboChaをダウンロードします。
今回はcabocha-0.69.exeを使用します。
文字コードはMeCabと同様の物を選択します。
今回はUTF-8です。
インストール後に、CaboChaのPATHを通す必要があります。
デフォルトのPATHは恐らく`C:\Program Files (x86)\CaboCha\bin`です。


# CaboChaのバインディング
pipを用いてバインディングをインストールします。
`pip install cabocha-python`
以上、PythonでCaboChaを使用する為の準備でした。
(PyPIは良いなぁ)


# テストコード

```python:テストコード
import CaboCha
c = CaboCha.Parser()
s = "シートンの動物好き、動物に目と心とをひかれつくして飽きず観察に我を忘れる姿は全く一種独特である。"
result = c.parseToString(s)
print(result)
```

```:実行結果
    シートンの-D
        動物好き、---------------D
              動物に---D         |
            目と心とを-D         |
          ひかれつくして-D       |
                    飽きず-----D |
                      観察に---D |
                          我を-D |
                          忘れる-D
                              姿は---D
                                全く-D
                      一種独特である。

```

# 最後に
ここまで読んでいただきありがとうございました。
また、参考となる記事を書いてくださった方々に感謝の意を表します。
何か間違いがありましたらコメントにて教えていただけると幸いです。



# 参考サイト
[CaboCha & Python3の環境構築(Windows版)](https://qiita.com/ayuchiy/items/17a2d48116b2da7535eb)
[非Anaconda環境にCaboChaをインストールする(Win)](https://qiita.com/ogadra/items/dc8590ceb27c06c92035)
[AMD製CPUのRyzenでNumpyが遅い問題を解決する方法](https://engineer-milione.com/programming/ryzen-numpyl.html)
面倒なGitHubのPushを1秒で完了させる方法

## 注意

こちらの記事は、2年ほど前に私が個人ブログに書いた記事で、当時は「GitHubのコミットメッセージの重要性」を理解していない頃に作成したものなので、業務での利用はできないものとなっております。

エンターテイメントとしてお読みくださいm(__)m

原文はこちら
<a href="https://milkywayy.com/2020/01/25/%e3%80%8cgit-push-origin-master%e3%80%8d%e3%81%a8%e3%81%8b%e6%89%93%e3%81%a4%e3%81%ae%e3%81%a0%e3%82%8b%e3%81%8f%e3%81%ad%ef%bc%9f%ef%bc%9f%e3%80%901%e7%a7%92%e3%81%a7%e5%ae%8c%e4%ba%86%e3%81%95/">「git push origin master」とか打つのだるくね？？【1秒で完了させる裏技を紹介】</a>



## イントロダクション

今日はGitHubでソースコード管理をする、優秀なプログラマーの皆さんに「面倒なGitHubのPushを1秒で完了させる方法」を紹介する。

いわゆる「自動化」というやつ。


## 茶番

私の名前はharakazu_nanfg、とても優秀なRails使いのエンジニアだ。
しかし、そんな優秀なエンジニアである私にも日々の業務で悩ましいことがあったのだ。

<strong>それはGitHubへのpushまでの手順が面倒ということである。</strong>


GitHubを使ったことがある方ならわかるはず。
GitHubに作業中のリポジトリをpushするにはいくつか手順を踏まなければならない。



```
git add -A
↓
git commit -m "[commit message]"
↓
git push origin [branch name]
```




このようにいたって単純なものなのだが、とても優秀なエンジニアである私にとってこのGitHubへのpushは非常に面倒なことであったのだ。




そして今回はこの面倒な時間を省くことができる裏技を紹介する。




私は実際にこの裏技を使ってGitHubへのPushが僅か1秒でできるようになったのだ！
当然だが金はかからない、無料だ！



## 必要なもの

```
・ターミナル
・GitPushが面倒だと思う怠惰心
```

※操作はMacOSでおこなう

それでは早速紹介していこう！

<br>

### GitPush自動化ツールを作成する

はじめにGitHubへのpushを自動でおこなってくれるツールを作成する。

その名も「GitPush自動化ツール」である。


まずはターミナルを開いてこのコマンドを入力だ！

```
vi ~/.gitpush
```


そうすることで「vi」というテキストエディタが表示される。

そこではじめに「i(アイ)」を入力してみてほしい。


ターミナルの下に「--INSERT--」の表示されればOKだ！
そうしたら次はいつも入力しているGitのコマンドを入力していく。

```
git add -A

git commit -m "auto push"

git push origin HEAD
```


さあ、入力が終わったらキーボード左上の「esc」キーを入力してターミナル下の「--INSERT--」表示が無くなったことを確認しよう。

続いてこの「vi」を抜け出すコマンドを入力。

```
:wq
```

これで先ほどのファイルは保存されていつものターミナルに戻ることができた。
ここまででGitPush自動化ツールの完成だ！

<br>

### GitPush自動化ツールを1秒で使うための準備

さて、続いてはGitPush自動化ツールを1秒で使う準備をしていこうと思う。

実はもう自動化ツールは出来上がっているのでこれだけでも自動Pushは使えるようになったのだが、私はさらに上をいく優秀なエンジニアなので<strong>これを1秒でできるようにならなければ意味がない</strong>と思った。

それでは早速「GitPush自動化ツールを1秒で使う準備」をやっていこう！


まずはターミナルを開いてこのコマンドを入力だ！

```
vi ~/.bash_profile
```

そうすることで先ほどと同じく「vi」テキストエディタに移動する。
同様に「i(アイ)」を入力して「--INSERT--」であることを確認して下記のコードを入力だ！

```
alias ap='source ~/.gitpush'
```

入力が終わったらキーボード左上の「esc」キーを入力してターミナル下の「--INSERT--」表示が無くなったのを確認しよう。

続いて「vi」を抜け出すコマンドを入力。

```
:wq
```

これでターミナル内で「ap」と入力された時にGitPush自動化ツールが実行されるように設定された！（ちなみに「ap」とは「auto push」の略称である）

あとはGitHubで管理中のディレクトリに移動してGitHubにPushしたいタイミングで「ap」と入力するだけ！

、、、とその前に一旦ターミナルを再起動しよう。

<br>

ブレイクタイム（茶番）

![a16a231b47e483a33012743ccc0d1221_t.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1912656/ed899522-9de3-c7c5-2eaf-ae44df84cc74.jpeg)





<br>





そうして作業中のディレクトリに移動したら先ほど設定した「ap」を入力しよう！

※ディレクトリ内を何かしら編集することを忘れずに、、

```
ap
```

これでめでたくGitHubへのPushが1秒でできるようになった！




これがとても優秀なエンジニアである私がGitPushをするのが面倒だと思い過ぎたことで完成した「GitPushを1秒でできる裏技」だ！




しかしこの方法でPushした場合のコミットメッセージは「auto push」だけで非常に難があるため、これを業務でやって「なんなんだこの酷いコミットメッセージは！」怒鳴られた時に「harakazu_nanfgがやれって言ってました」と言い訳しないようにだけ気をつけていただきたい。



## 最後に

以上が「GitPushを1秒でできる裏技」だ。
いかがだっただろうか。

今回の記事が面白いと思った方は他の記事も読んでいただけると幸いだ。
ここまで読んでくれてありがとう！
matplotlib と seaborn を日本語化する（Ubuntu）

# 概要
Jupyter で matplotlib や　seaborn を使っているとき、ラベル名などに日本語を入力すると、 □ のお豆腐として表示されたりします。

この場合の対処法を記載します。

# 環境
2021/10/30
matplotlib 3.3.4
seaborn 0.11.1
ubuntu 20.04.3

# 対処法

## 日本語フォントをインストール

```bash:bash
sudo apt install fonts-ipaexfont
```

## matplotlib の設定ファイルを変更

matplotlib の設定ファイルのパスを表示します。

```python:python
import matplotlib as mpl
mpl.matplotlib_fname()
```

``.../site-packages/matplotlib/mpl-data/matplotlibrc``の様なもののはずです。
vi で編集します。

```bash:bash
vi .../site-packages/matplotlib/mpl-data/matplotlibrc
```

vi で開いた状態で ``:set number`` をすると行数が表示されます。
251行目の ``font.family: sans-serif`` を ``font.family:  IPAexGothic`` に変更してください。

## seaborn の設定ファイルを変更

先ほど表示した matplotlib の設定ファイルのパスの ``/matplotlib/mpl-data/matplotlibrc`` の箇所を ``/seaborn/rcmod.py`` に変えたものが seaborn の設定ファイルのパスです。

vi で編集します。

```bash:bash
vi .../site-packages/seaborn/rcmod.py
```

vi で開いた状態で ``:set number`` をすると行数が表示されます。

87行目の ``font`` を ``IPAexGothic`` に変えてください。

```python:rcmod.py
def set_theme(context="notebook", style="darkgrid", palette="deep",
              font="IPAexGothic", font_scale=1, color_codes=True, rc=None):
```

205行目の ``font.family`` も ``IPAexGothic`` にしてくだい。

```python:rcmod.py
            "font.family": ["IPAexGothic"],
```

206行目の ``font.sans-serif`` に ``IPAexGothic`` を追加してください。

```python:rcmod.py
            "font.sans-serif": ["Arial", "DejaVu Sans", "Liberation Sans",
                                "Bitstream Vera Sans", "sans-serif", "IPAexGothic"],
```

## matplotlib に関するキャッシュを削除

```bash:bash
# キャッシュがある可能性のある場所を全て削除
# 「No such file or directory」とか出たらスキップしてOK
rm -rf ~/.matplotlib/* 
rm -rf ~/.cache/.matplotlib/*
rm -rf ~/.cache/matplotlib/*
```

## 確認
jupyter の ipynb でカーネルを再起動すると反映されるはずです。

# 参考
https://qiita.com/Masahiro_T/items/cfe1a016a4f0db5df760

https://self-development.info/ipaexgothic%E3%81%AB%E3%82%88%E3%82%8Bmatplotlib%E3%81%AE%E6%97%A5%E6%9C%AC%E8%AA%9E%E5%8C%96%E3%80%90python%E3%80%91/
Javaのコーディングでお手本探しに役立ちそうなリンクたち

# はじめに
いわゆる「良いコード」や「読みやすいコード」を書くためにお手本が欲しくなる時があると思います．本記事では，こういったお手本を探すときに参考になりそうな検索キーワードやリンクを備忘録も兼ねて残そうと思います．`Java`を題材にしてまとめてみました．

# 「良いコード」や「読みやすいコード」を書く基礎になる指針
「変数名が1文字になるのは避けた方が良いよ」や「`import`文はアスタリスク付きで書かない方が良いよ」といったコードを書く上での指針は基本的にこちらをご参考になさると良いのかなと思います．

https://future-architect.github.io/coding-standards/documents/forJava/Java%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0%E8%A6%8F%E7%B4%84.html

「良いコード」や「読みやすいコード」のお手本はこういったコンセンサスの取れたルールみたいなのが基礎になると思いますので，こちらでどんな書き方が良いのか，まずいのかを確認すると良いと思いました．

また，蛇足ですが他にも`Python`であれば`PEP8`というコーディング規約が存在するようです．`Java`以外の規約はないのかといったことが気になった方は「プログラミング言語名　コーディング規約」といった感じで検索すると色々ヒットすると思います．

# 「読みやすいコード」を書くためのヒント
上記のコーディング規約にも「良いコード」，「読みやすいコード」，「わかりやすいコード」を書くようにしましょうという旨が載っているのですが，これは恐らく規約に従うだけで実現するのは結構難しいと思われます．

なので規約に追加して，「どんな言葉選びがわかりやすいんだろうか」といったことを考えるヒントが必要になるのかなと思います．こういったヒントが載っているのがこちらの記事になるのかなと思います．

https://qiita.com/shimataro999/items/ef6cd838d56f1fe87015

個人的には高頻度で拝見させていただいております．

ただし完全に個々のケースに対応した「良いコード，読みやすいコード，わかりやすいコードを書くための方法」はないと思いますので，私がよくやる考え方としては「システムが使われるドメインではどんな単語の使われ方がされているか」などに合わせて命名やアルゴリズムを整理すると良いのかなと思いました．

例えば会計系のシステムであれば，経理などの会計に関するドメイン知識をちょっと勉強して，「どんな言葉選びが伝わりやすいか」，「経理をやっている人たちは頭の中でどんな計算をしているか」などを基に命名や計算のアルゴリズムを考えると良さげなのかなと思われました．

# コメントの書き方
`Java`においては`Javadoc`というコメントがあるように，コードにはコメントが存在すると思います．これにも規約があるようなので，コーディング規約のように利用すれば「良いコード」にプラスして「良いコメント」を書く基礎が得られるかと思います．

「Javadoc　規約」，「Java　コメント　規約」とかって検索すると出てきます．

http://www.okapiproject.com/java/java_codeconventions/jcc_comment.htm

他にも「Java　List　Javadoc」とかって検索すると`List`型の`Javadoc`のお手本がヒットするのでおすすめです．

https://docs.oracle.com/javase/jp/8/docs/api/java/util/List.html

おまけなのですが，コメントを日本語で書くときは「です，ます」調で書くと良いそうです．私は「〇〇から△△を取得する」みたいな書き方をしていたので，同じ感じの書き方をなさっていた方がいらっしゃればご参考ください．

# オープンソースを参照する
「ルールとか規約を使ってある程度のところまでは良いコードや良いコメントが書けそう」という所まで辿り着けるかなと思います．これ以上に質を高めるとなったときにはやっぱりコードを書くのが上手な方たちのコードを覗くのが良いのかなと思いました．

有効そうなアプローチとして，オープンソースを参照するというのがあると思います．「java list java source code」とかって調べると`Javadoc`だけでなくコードのお手本まで見られます！`list`の部分を別の変数型などに変えれば別のコードがヒットすると思います

http://hg.openjdk.java.net/jdk8/jdk8/jdk/file/tip/src/share/classes/java/util/List.java

これも個人的な見解なのですが，こういったサイトだとコードの書き方やコメントの書き方が勉強できる上に，アルゴリズムなども勉強できるのでおすすめです．

他の人のロジックに触れる機会は重要かなと思うので，よかったらご覧になってみてください！

# おわりに
この記事では`Java`のお手本コードのリンクと，少しだけ検索テクニックに関してまとめてみました．たまに私の考えも挟まっているのですが，読みづらかったらすみません泣

あと既にコーディング規約などの存在をご存じだった方には役に立たないかと思います泣

ただ個人的には「なんでこの書き方じゃダメなんだ！」っていう方がちょっとでも多くのお手本コードを見つけて「良いコードってこういうのだよね」っていう境地に辿り着けるきっかけになったら良いなと思いまして書いてみました．

かくいう私は勉強中なので自分の勉強も兼ねて共有させていただきました．

お役に立てたら幸いです
PowerShellでパスワードを生成してみる（大文字小文字記号数字）

PowerShellで大文字小文字記号数字を含むパスワードを生成するワンライナーを書いてみました。

なんか他にもっといい書き方だったり、そもそも何かしらそういうツールを使うって話があるかと思いますが。

一つのサンプルとして解説します。

```PowerShell
1..[int]::maxvalue | % {-join $(Get-Random -Count 32 -Input $(48..122 | % {[char]$_})) } | ?{$_ -cmatch '[a-z]'} | ?{$_ -cmatch '[A-Z]'} | ?{$_ -cmatch '[0-9]'} | ?{$_ -cmatch '[^a-zA-Z0-9]'} | Select-Object -first 1
```

実行すると画像のような形で文字列を出力します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/861c594f-e9d5-61cd-709d-7406bea8da74.png)

## このワンライナーが何をやっているか解説。

やってる事を分解すると

1. `1..[int]::maxvalue`でひたすらループさせる。
2. `% {-join $(Get-Random -Count 32 -Input $(48..122 | % {[char]$_})) }` 32文字の文字列を生成する
3. `?{$_ -cmatch '[a-z]'} | ?{$_ -cmatch '[A-Z]'} | ?{$_ -cmatch '[0-9]'} | ?{$_ -cmatch '[^a-zA-Z0-9]'}`　a-zにマッチする、A-Zにマッチする、0-9にマッチする、それ以外（記号）にマッチするかどうか判定することによってそれぞれが1文字は含まれている文字列のみ選択する
4. `Select-Object -first 1` 最初の一件を取得


ざっくりと流れを書くとこんな形。

大文字、小文字、数字、記号がそれぞれ含まれるように文字列を生成するんじゃなくて。
生成した文字列にそれらが含まれる1件が取得できるまで文字列生成を繰り返す。

そんな作りとなります。

## 総評

こういう処理をさっくりとかけるPowerShell。便利かと思います。
Libertyのserver.xmlでPostgreSQLの各種タイムアウトを指定する

JDBCプロパティである``loginTimeout``や``socketTimeout``は``<properties プロパティ名="秒">``で指定する。ロックタイムアウトはクライアントレベルなので``options="-c lock_timeout="ミリ秒"``で指定する。

```
<library id="JDBCLib">
    <fileset dir="****" name="*.jar"/>
</library>

<jdbcDriver id="PostgresqlDriver"
            javax.sql.XADataSource="org.postgresql.xa.PGXADataSource"
            javax.sql.ConnectionPoolDataSource="org.postgresql.ds.PGConnectionPoolDataSource"
            libraryRef="JDBCLib"/>
<dataSource id="DefaultDataSource"
            jndiName="jdbc/********"
            jdbcDriverRef="PostgresqlDriver"
            type="javax.sql.ConnectionPoolDataSource"
            transactional="true">
    <properties serverName="********"
                portNumber="****"
                databaseName="********"
                user="********"
                password="********"
                loginTimeout="30"
                socketTimeout="60"
                options="-c lock_timeout=30000"/>
</dataSource>
```
キリル文字をローマ字に変えるパーサが存在しなかったので作ってみた。

# 目的
ローマ字からキリル文字変換器はWeb上に存在したがその逆のキリル文字をローマ字に変えるパーサが存在しなかったので作ってみた。

```russian.py
murnes_pursey_rossita={
    "А":"a",
    "а":"a",
    "Б":"b",
    "б":"b",
    "В":"v",
    "в":"v",
    "Г":"g",
    "г":"g",
    "Д":"d",
    "д":"d",
    "Е":"e",
    "е":"e",
    "Ж":"zh",
    "ж":"zh",
    "З":"z",
    "з":"z",
    "И":"i",
    "и":"i",
    "Й":"y",
    "й":"y",
    "К":"k",
    "к":"k",
    "Л":"l",
    "л":"l",
    "М":"m",
    "м":"m",
    "Н":"n",
    "н":"n",
    "О":"o",
    "о":"o",
    "П":"p",
    "п":"p",
    "Р":"r",
    "р":"r",
    "С":"s",
    "с":"s",
    "Т":"t",
    "т":"t",
    "У":"u",
    "у":"u",
    "Ф":"f",
    "ф":"f",
    "Х":"kh",
    "х":"kh",
    "Ц":"ts",
    "ц":"ts",
    "Ч":"ch",
    "ч":"ch",
    "Ш":"sh",
    "ш":"sh",
    "Щ":"shch",
    "щ":"shch",
    "Ь":"",
    "ь":"",
    "Ю":"yu",
    "ю":"yu",
    "Я":"ya",
    "я":"ya"
}

def info_rossita():
    puts=input("ロシア語入力>>")
    for k in murnes_pursey_rossita:
        puts=puts.replace(k,murnes_pursey_rossita[k])
    print(puts)

while(True):
    info_rossita()
    if(input("quitでキリル→ローマ終了")=="quit"):
        break
```

# 結果
変換ができてるみたい。
PyMongoでMongoDB Atlasに接続するとSSL: CERTIFICATE_VERIFY_FAILED

# 環境

* OS: Windows 10 Pro 21H1 (19043.1320)
* Python: 3.8
* PyMongo: 3.12.1

# 状況

Pythonのライブラリである**PyMongo**を使って、MongoDB Atlasで作ったクラスタに接続しようとすると、下記のような例外が発生し、接続することができませんでした。

```
pymongo.errors.ServerSelectionTimeoutError: hogehoge-shard-00-00.usai2.mongodb.net:27017:
[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: certificate has expired (_ssl.c:1124)
```

# 解決策

StackOverflowにて、解決方法が回答されていました。

https://stackoverflow.com/questions/69397039/pymongo-ssl-certificate-verify-failed-certificate-has-expired-on-mongo-atlas

エラーの原因としては、自身のWindowsクライアントにインストールLet’s Encryptのルート証明書(ISRG Root X1)または中間証明書(Let’s Encrypt R3)の有効期限が切れているからのようです、たぶん。
(MongoDB AtlasはLet’s Encryptを使用している)

確認してみると、自分の場合は中間証明書の期限が切れていました。(注:今回の事象発生は2021/10/29)
![期限切れ証明書](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/84550/e069a882-fed6-d140-4e20-f8cb50c4916c.png)

ですので、期限が切れている証明書を更新します。まず、下記ページにアクセスします。

https://letsencrypt.org/certificates/

ルート証明書を更新する必要がある場合は、「Root Certificates」->「Active」->「ISRG Root X1」->「der」をクリックして、証明書をダウンロードします。
![ルート証明書](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/84550/401230d7-ecd5-0086-382c-04e8be8bc80b.png)
中間証明書を更新する必要がある場合は、「Intermediate Certificates」->「Active」->「Let’s Encrypt R3」->「der」をクリックして、証明書をダウンロードします。
![中間証明書](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/84550/05d74aa4-5af0-4d98-9d87-f68a5531e3d7.png)

あとは、ダウンロードした証明書をそれぞれインストールするだけです。

ダウンロードした証明書ファイルをダブルクリックして開きます。
![derファイルをダブルクリック](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/84550/45821bd4-b396-904b-bfb2-54f5d23030d4.png)
セキュリティの警告が表示された場合は、そのまま「開く」をクリックします。
![「開く」をクリック](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/84550/741c77aa-af91-9c5c-1f76-56490f31949e.png)
有効期限が切れていないことを確認し、「証明書のインストール」をクリックします。
![証明書のインストール](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/84550/cc59ecf7-540e-46d5-a950-7183f642aeef.png)
インポートウィザードが開きます。保存場所は任意の場所を選択し、「次へ」をクリックします。
![保存場所](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/84550/7f60ba28-2416-ae11-47eb-4c432ba1f17d.png)
「証明書の種類に基づいて、自動的に証明書ストアを選択する」を選択し、「次へ」をクリックします。
![証明書ストア](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/84550/62a920e5-3911-07cf-43c4-d2160af05eb2.png)
「完了」をクリックします。
![完了](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/84550/854705b1-1fb7-71d7-82c1-d36cbcdafd54.png)
「正しくインポートされました。」というメッセージが表示されるので、「OK」をクリックします。
![OK](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/84550/1d020973-436f-3518-c4fa-ca2323372d8a.png)
証明書ウィンドウも「OK」をクリックして閉じます。
![OK](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/84550/68e9fbbc-ea5f-0478-b799-601fa3bff2b4.png)

以上で、新しい証明書がインストールできました。

証明書を更新することで、正常にMongoDB Atlasのクラスタへ接続することができました。
Gitのコマンド一覧(1) -init, add, commit, push, status-

# 概要
[先のページ](https://qiita.com/sepakTama/items/41796f82457ceffae006)ではGitとはどのようなものかについて大雑把に説明した。本記事では筆者が実際に使っているコマンドを載せていく。（複数ページにわたる）
- 主に使っているコマンド（太文字が本ページで説明する部分）
- 基本的な流れ

# 主に使っているコマンド
- **init**
- **add**
- **commit**
- **push**
- clone
- **status**
- log
- reflog
- branch
- checkout
- remote
- fetch
- merge
- pull
- rebase
- cherry-pick
- reset
- rm

## init
`git init`
ローカルにあるファイルをgitの構成管理に入れたい場合に用いる。実行することで.gitファイルができる。（確認コマンド`ls -a`）

## add
`git add [file]`
（例：`git add ./README.txt`）
ローカルで編集したファイルを**ステージ（stage）**するときに用いる。ステージとは次で述べるコミット（commit）をするための下準備である。
-A ですべての修正/追加/削除をステージングする。（`git add -A`）

## commit
`git commit -m "[message]"`
addでステージした（変更を登録）したものをまとめてローカルリポジトリ（.gitディレクトリの中）に反映するためのコマンド。-mはコメントを載せオプションだが付けるのが慣習。（自分/他人がどのような変更を行なったかをコメントとして残すために）

## push
`git push origin [branch]`
commitでローカルリポジトリに反映した変更点をリモートリポジトリに反映するためのコマンド。（ここの[branch]はリモートリポジトリのブランチ名）
branchとoriginに関しては別の記事で説明する。（Gitのコマンド一覧(3)）


## status
`git status`
ローカルリポジトリの状態を表示するコマンド。主に3つの状態が表示される。
- untracked : 新規で追加されたファイル/ディレクトリ（前回のコミットでローカルに反映しなかったファイルも含む）
- modified : ローカルリポジトリに反映されているファイル/ディレクトリに修正が加わったもの
- deleted : ローカルリポジトリに反映されていたが、削除されたファイル/ディレクトリ（記録（ログ）としては残る）



## 基本的な流れ
1. `git init`でローカルリポジトリを登録。
1. `git add [file]`で変更を加えたファイル/ディレクトリをステージング。（ファイルごとor機能ごとに分割するのがおすすめ）
1. `git commit -m "[message]"`でステージングされたファイルをローカルリポジトリへ登録。（2,3を繰り返す）
1. `git push origin [branch]`でローカルリポジトリへ登録された変更点をリモートリポジトリへ反映させる。

都度`git status`で状態を確認する。


# 次のブログでは
[次のブログ](https://qiita.com/sepakTama/items/e861f0e5cfd75fe10f82)ではブランチの考え方から、それを実現するために必要なコマンドを紹介する。

https://qiita.com/sepakTama/items/e861f0e5cfd75fe10f82
ラビットチャレンジレポート #5 情報科学

# 情報科学
* どうやって情報を数量化するのか？

* 四角の枠が2つあるときに、その四角それぞれの中にいくつかの点があることを考える。（点はきれいに並んでるのではなくばらばらに散らばっているものとする）
    1. 点が10個と11個
    1. 点が1個と2個

* 上記の1と2のパターンがあるときにパッと見て数の違いに気づけるのはパターン2である
* パターン1も点の数は1個しか違わないが、四角の枠内にある点の数が多くなるとパッと見たときに判断が難しくなる

* どうして1パターン1のほうが判断が難しいのか？
* 増加の比率が違うのではないか？
* 変化している数はどちらのパターンも1なので $\Delta w=1$とする
* 変化の比率は
    * パターン1が $\frac{\Delta w}{w}=\frac{1}{10}$
    * パターン2が $\frac{\Delta w}{w}=\frac{1}{1}$
* $\frac{\Delta w}{w}$ は$w$の積分とも考えることができる

# 自己情報量
* $\frac{\Delta w}{w}$を積分すると$log(W(x))$となる
* これは情報を表す単位であり、自己情報量と言われている
* 対数の底が2のとき単位はビット(bit)
* 対数の底がネイビアの$e$のとき単位はナット(nat)

```math
I(x)=-log(P(x))=log(W(x))
```

* 通常、情報の珍しさや珍しくなさを示すのに使っているのは確率($P(X)$)である
* $W$と$P$は逆数の関係になっている

# シャノンエントロピ
* 自己情報量の期待値のこと

```math
H(x)=E(I(x))=-E(log(P(x)))=- \sum (P(x)log(P(x)))
```

# カルバック・ライブラー ダイバージェンス(KLダイバージェンス)
* 同じ事象・確率変数における異なる確率分布P,Qの違いを表す
    * 例
        * Pは普通のコイン、表と裏がでる確率がそれぞれ1/2
        * Qはいかさまコイン、表が出る確率が2/3で裏が出る確率が1/3

```math
D_{KL}(P||Q)=E_{X~P}[log \frac{P(x)}{Q(x)}]=E_{X~P}[logP(x)-logQ(x)]
```

# 交差エントロピー
* KLダイバージェンスの一部分を取り出したもの
* Qについての自己情報量をPの分布で平均している

```math
H(P,Q)=H(P) + D_{KL}(P||Q)\\
H(P, Q) = -E_{X~P}logQ(x)
```
コミットが消えた時の復活方法

ブランチを切り替えたらコミットが消えてしまった／(^o^)＼

つい3分前確かにコミットしたはずなのに、ツリーに表示されてる最新のコミットは5日前。
噓でしょ…私の５日分の作業…。


# 状況整理
pushしたつもりがgit resetしてしまった…？
ずっとpushしてなかったから、何らかの原因でローカルの変更が巻き戻ってしまった…？

どうやら作業用のブランチにチェックアウトしていたつもりが、チェックアウトしていない状態でコミットしてたっぽい。
コミットが消えたわけではなく、一覧からは見えなくなっているだけでちゃんと残ってるらしい。

# 復活方法
git reflogコマンドでコミットの履歴を取得。

```
cf01020 HEAD@{1}: pull 
0c47249 HEAD@{2}: commit:2
1c30a9c HEAD@{3}: commit:1
```
こんな感じで履歴が返ってくるので、
取り込みたいコミットのハッシュ（cf01020みたいなやつ）をコピー。

```
$ git cherry pick ハッシュ
```
git cherry pickで指定したコミットを取り戻す。
必ず古いコミットから順番に一つずつ指定してください。

# 参考記事
https://qiita.com/Ratty27/items/7ebfe9a4933eba7630dc

◆gitでpushしたコミットが消える現象の対処法、もしくはgit reflogの紹介
https://anatoo.hatenablog.com/entry/20121209/1354982574

本当に助かりました…🙏
作業前にチェックアウト中のブランチを確認するのと、こまめなpushを心がけたいと思います🙏
EC2インスタンス起動時にCodeDeployエージェントを自動インストール

EC2 インスタンスのユーザデータを登録すると、初回起動時に指定したスクリプトを実行できます。
下記を設定すれば、CodeDeploy エージェント `codedeploy-agent` をインストールできます。
Auto Scaling グループと CodeDeploy を組み合わせることで、
インスタンス起動時から一度もログインせずに、アプリケーションのセットアップを完了できます。

```sh
#!/bin/bash

yum update -y
yum install -y curl ruby
curl -s https://aws-codedeploy-ap-northeast-1.s3.amazonaws.com/latest/install | ruby - auto
```

※ `AWS_REGION` はメタデータから取得してくれるので指定しなくても ~~大丈夫かも~~（→大丈夫でした）。

----

［11/1追記］

ユーザデータの実行結果は、以下のファイルで確認できる。

```sh
sudo cat /var/log/cloud-init-output.log
```
Linuxコマンド(shell) 基本項目

<h1>初めに</h1>
bashにおいて基本的なコマンド、使えるコマンド、よくみるコマンド、コマンドラインで操作していく上で重要なコマンドをまとめました。軽く紹介しているだけなので、それぞれのオプションなどはurlから飛んで確認してみてください。


<h1>ls</h1>
現在のディレクトリの中身を確認するコマンド

```php
//commandディレクトリの中身確認
command % ls 
    # command.txt
```
<h1>mkdir</h1>
フォルダを作る

```php
//mkdirでフォルダを作って中身確認
command % mkdir test
command % ls
   # command.txt	 test/
```

<h1>cd</h1>
現在のディレクトリを移動するコマンド

```php
testフォルダに移動
command % ls
    #command.txt	test/
command % cd test
test % 
```

<h1>pwd</h1>
現在のディレクトリがどこなのか表示する

```php
//pwdでそのときの場所を(絶対パスで)確認
test % pwd
     #/Users/*/Self-development/qiita/command/test
```
* 絶対パス　：　最上階のフォルダの場所からそのときの場所まで全てつなげたパス

<h1>touch</h1>
ファイルを作る

```php
test % touch text.txt
test % ls
    #text.txt
```

<h1>vi</h1>
ファイルを編集できる

```php
test % vi text.txt
# このコマンドを打つとtextが表示された画面になる。そのままだとコマンドモードであるが、iを押すことによって編集モードとなる。そして、'hello world'と打ち込む。
# 編集モードを保存して閉じるときは
# まずescキーを押し、シフトキーを押しながらzを2回押せばコマンドラインに戻る。
```

<h1>cat</h1>
ファイルの中身を確認する

```php
// viで入れたhello　worldが入っていることがわかる
test % cat text.txt
     #helloworld
```


<h1>cp</h1>
ファイルをコピーする

```php
// コピーされていることがわかる
test % cp text.txt copy.txt  
test % ls
       # copy.txt	text.txt
test % cat copy.txt
      #hello world
```

https://atmarkit.itmedia.co.jp/ait/articles/1605/31/news019.html


<h1>ps</h1>
現在、Linux上で動作しているプロセスを確認する

```php
// zshが動いている
test % ps
PID TTY           TIME CMD
60949 ttys001    0:00.43 -zsh
```

https://eng-entrance.com/linux-command-ps

<h1>ssh</h1>
リモートマシンにログインし、リモートマシン上でコマンドを実行するコマンド
https://webkaru.net/linux/ssh-command/
ローカルホストのDNSをpowershellとDockerで調べる方法

#特定のネットワーク内で使うためのローカルな DNS を探す方法

この記事にはWindows版の説明のみ記載する。

まずpowershellを起動する

```
cd ~\ワークスペース名前\linux入れてるファイル
docker-compose up -d
docker-compose exec app bash
```

これでDocker内部のubuntuコンテナを立ち上げて操作できるようになる。
コンソールに`#`が乗っていればそこに下記を打ち込む

```
less /etc/hosts
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1822331/89aefea4-c074-8beb-5d46-adafb4816ac9.png)

出力されるのは一行目がステータスラインでlocalhost に対しての設定を示す。
これで`/etc/hosts` ファイルを表示している

127.0.0.1 はIPアドレスです
【Flutter】画面を下にスワイプして最新の状態に更新する実装方法


# はじめに
Twitterを触っていたときに下にスワイプして離すと最新の投稿データを取得できるやつってどうやって実装してるんだろうと思い気になったので自分がいつか仕事で実装する事があるかもしれないので調べてみました。

# 結論
`RefreshIndicator`を使うことで実装可能です。

:::note warn
2021/10/21時点の情報のため、Flutterのバージョンにより実装方法が大きく変更されることがございます。
:::
# 執筆時の環境
- Flutter2.5.2



# 実装方法
## 1. 今回作るもの
![IMG_4465.GIF](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/501157/bb3e0fa8-c77b-28dc-7560-f5558f8509e9.gif)
# 実装方法

今回Firestoreから値を取得しています。
DBについては適宜読み替えてください。

```:dart
class Sample extends StatefulWidget {
 const Sample({Key key}) : super(key: key);
 
 @override
 _SampleState createState() => _SampleState();
}
 
class _SampleState extends State<Sample> {
 List titleList = [];
 
 Future<void> getTitle() async {
   final snapshot =
       await FirebaseFirestore.instance.collection('sample').get();
   setState(() {
     titleList = snapshot.docs.map((title) => title.data()['title']).toList();
   });
 }
 
 @override
 Widget build(BuildContext context) {
   return Scaffold(
     appBar: AppBar(
       title: const Text('sample'),
     ),
     body: RefreshIndicator(
       onRefresh: () async {
         // スワイプ時に更新したい処理を書く
         await getTitle();
       },
       child: ListView(
         children: titleList
             .map((title) => ListTile(
                   title: Text(title),
                 ))
             .toList(),
       ),
     ),
   );
 }
}
```
スクロール可能なWidgetに対してRefreshIndicatorをラップしてあげると、画像のような動きを実装可能です！
ローディング時にインジケーターが回転するようになります。
このインジケーターはonRefresh内に書いた処理が完了するまで画面上に現れ、完了したら画面外へ移動します。
またインジケーターのデザインはカスタマイズ可能です。


# 参考にしたサイト
 
https://www.youtube.com/watch?v=ORApMlzwMdM

https://api.flutter.dev/flutter/material/RefreshIndicator-class.html

# まとめ

画面をリアルタイムで更新するのではなく、その都度更新したいときには相性の良いWidgetです。
インジケーターのカスタマイズできるし使い勝手が良さそうだなと感じました。
ここまでお付き合いありがとうございます！
Keycloakをロードバランサの内側に立てる

https://qiita.com/quwaji/items/a2f24c90fc8819da247e

Dockerで検証用のKeycloakがサクッと立てられたのだけれど、これを実際に検証環境で稼働させるためには外部からhttpsでアクセスできるようホストやSSL環境の構成が必要。
SSLはロードバランサーに利用しているBIG-IPで処理しており、iRuleで振り分けを行っている。
Keycloakをロードバランサーの内側で稼働させるには、２つのことが必要なようだ。

##HTTPヘッダ X-Forwarded-Proto の挿入

一つはロードバランサーの内側がhttpになるのだが、httpsでの接続が中継されたものであることをHTTPヘッダで伝えること。
iRuleに追加するのは以下のような感じ。

```
   # add header ssl request
   if { [PROFILE::exists clientssl] == 1 } {
      HTTP::header insert "X-Forwarded-Proto" "https"
   }
```

## http-listenerにproxy-address-forwardingを指定

ロードバランサーの内側ではhttpでの接続になるので、そのままだとレスポンスにhttpでリソースのUrlを返してしまったりする。proxy-address-forwardingを設定することで、中継されているリクエストであることを把握しhttpsでレスポンスするようになる。

standalone.xmlを見てみると、

```xml
<http-listener name="default" socket-binding="http" redirect-socket="https" proxy-address-forwarding="${env.PROXY_ADDRESS_FORWARDING:false}" enable-http2="true"/>
```
proxy-address-forwardingは環境変数を見るようになっていたので、起動オプションに追加で行けそうだ。
docker-composeに書くと、こんな感じ。

```yaml
version: "3"
services:
  keycloak:
    container_name: keycloak
    image: jboss/keycloak
    environment:
      - KEYCLOAK_USER=admin
      - KEYCLOAK_PASSWORD=admin
      - PROXY_ADDRESS_FORWARDING=true
    ports:
      - "80:8080"
    restart: always
```

##参考URL

https://yoshinorin.net/2018/03/22/keycloak-with-nginx-https-reverse-proxy/

https://qiita.com/yoonis/items/4f4a9df0f6f8e858bd4a#%E3%83%AD%E3%83%BC%E3%83%89%E3%83%90%E3%83%A9%E3%83%B3%E3%82%B5%E3%83%BC%E3%81%AE%E8%A8%AD%E5%AE%9A
【GitHub】privateとpublicの変更方法

#はじめに
privateリポジトリで管理していたところ、コードを見せる必要が出てきて、privateとpublicの設定を変更するなんてことありますよね。
そんなときのために変更方法を書き記しておきます。

#変更方法
① `Settings`をクリック。
② 1番下に`Danger Zone`という項目があるので、その中の`Change visibility`をクリック。
③ `Make public`と`Make private`というラジオボタンが出現するので、変更したい方をクリックする。
④ その下に`ユーザー名/プロジェクト名`を入力し、`I understand,change repository visibility.`と書いている１番下のボタンをクリック。

#おわりに
これだけで変更ができるので簡単ですよね。
どこで変更するのか分からなくなったときは是非参考にしてみてください。
[メモ] error MSB6001: "cmd.exe" のコマンド ライン スイッチが無効です。

OpenCVをVisual Studio2019でビルドするときに起きた現象のメモ。

CMakeでVS2019のプロジェクトを作成してビルド、

```
C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Microsoft\VC\v160\Microsoft.CppCommon.targets(241,5): error MSB6001: "cmd.exe" のコマンド ライン スイッチが無効です。
```
となる場合、
https://docs.microsoft.com/en-us/visualstudio/msbuild/errors/msb6001?view=vs-2019
によると、(Google翻訳)
>このエラーは、MSBuildタスクに無効なコマンドラインオプションが指定された場合に発生します。問題の詳細については、2番目のエラーを参照してください。
一般的な原因は次のとおりです。
* パス内の不正な文字。引用符の配置をチェックして、不適切に使用されていないことを確認します。
* スイッチの構文のスペルミス
* 使用しているツールのバージョンは、そのスイッチをサポートしていません

とある。
CMakeで設定しているどこかのパラメータがおかしいので、基本的にはCMakeLists.txtなどを修正する必要がある。

ただ、エラーの起きている個所によりそうだが、**ビルドを繰り返すだけでビルドに成功する**場合がある。
OpenCVは数回ビルドするだけでビルドできるようになったが、どんな設定でビルドされたのかよくわからないのできちんと修正した方が良いのだろう。
モダンJSの基本

## const、varについて
- letは上書きは可能だが、再宣言はできない
- constは上書きも再宣言もできない
- constで定義したオブジェクトはプロパティの変更が可能
- constで定義した配列の値の変更が可能

## テンプレート文字列

${}で変数を表示できる、＋を使わなくてよくなる

```javascript
const name = "ハム";
const age = 27;
const message = `私の名前は${name}です。${age}歳です`;
console.log(message);
```

## アロー関数

```javascript
// 従来の関数
const func1 = function (str) {
  return str;
};
console.log(func1("func1です"));

// アロー関数
const func2 = (str) => {
  return str;
};

console.log(func2("func2です"));

```

## 分割代入

オブジェクト

```javascript
// 分割代入
const me = {
  name: "はむ",
  age: 27
};
// オブジェクト名meと何回も書くことになる
const mes1 = `私の名前は${me.name}です。${me.age}歳です。`;
console.log(mes1);
// 分割代入を使う
const { name, age } = me;
const mes2 = `私の名前は${name}です。${age}歳です。`;
console.log(mes2);
```
配列

```javascript
const me = ["ハム", 27];
const mes1 = `私の名前は${me[0]}です。${me[1]}歳です。`;
console.log(mes1);

const [name, age] = me;
const mes2 = `私の名前は${name}です。${age}歳です。`;
console.log(mes1);
```

## デフォルト値

say();の引数がないときにはデフォルトで”ありません”と出るように設定することができる

```javascript
const say = (name = "ありません") => console.log(`私の名前は${name}です`);
say("ハム");

```

## スプレッド構文

スプレッド構文は奥が深そう

```javascript
// スプレッド構文
// 配列の展開
const arr1 = [1, 2];
console.log(arr1);
console.log(...arr1);

const sum = (num1, num2) => num1 + num2;
console.log(sum(arr1[0], arr1[1])); //3となる
console.log(sum(...arr1)); //3となる

// // まとめる
const arr2 = [1, 2, 3, 4, 5];
const [num1, num2, ...arr3] = arr2;
console.log(arr3);

// 配列のコピー
const arr4 = [5, 6];
const arr5 = [7, 8];

// const arr6 = arr4;でもコピーはできるが、arr4の参照を引き継ぐのでバグの元になりやすい
const arr6 = [...arr4];
console.log(arr6); //5,6

const arr7 = [...arr4, ...arr5];
console.log(arr7); //5,6,7,8
```

## mapやfilterを使った配列の処理
mapはなんでも回す、filterは回しながら条件にあったものを返す

```javascript
const nameArr = ["たろう", "じろう", "はな"];
// 普通のfor
for (let index = 0; index < nameArr.length; index++) {
  console.log(nameArr[index]);
}

// map
const nameArr2 = nameArr.map((name) => {
  console.log(name);
});

// map省略
nameArr.map((name) => console.log(name));

//map1は第２引数にインデックスをとれる
nameArr.map((name, index) => console.log(name, index));

//filter
const numArr = [1, 2, 3, 4, 5];
const newNumArr = numArr.filter((num) => {
  return num % 2 === 1;
});
console.log(newNumArr);
```
## JSでの&&、||の本当の意味

```javascript
// ||は左側がfalseなら右側を返す,左側がtrueなら左側を返す
const num = null;
const fee = num || "金額";
console.log(fee);
```

```javascript
// &&は左側がfalseなら左側を返す、trueなら右側を返す
const num = null;
const fee = num && "金額";
console.log(fee);
```