OmniAICreator/Qiita-1.07M huggingface dataset:
minikubeへIstioをインストール＆デモWebアプリをデプロイ

# 環境

- minikube v1.22.0
- Istio 1.10.3
- Docker 20.10.2
- Ubuntu 18.04
    - RAM: 4GB
    - SSD 30GB
    - CPU v2Core

# 手順

Istioが使えるメモリが4GBとれるように，VMのメモリを6GBに増やす．

> Istio本体の起動には2Gで十分なのですが、BookInfoの動作には4G以上のメモリが必要なことに注意してください。

参考URL) https://qiita.com/Ladicle/items/e949b0f68ac18b7a95d8

minikubeを一度消す．

```shell
$ minikube delete
```

minikubeを4096mbのメモリで起動する．

```shell
$ minikube start --memory=4096 --cpus=2
```

Istioをダウンロードする．

```shell
$ curl -L https://istio.io/downloadIstio | sh -
$ cd istio-1.10.3
$ export PATH=$PWD/bin:$PATH
```

Istioをインストールする．

```shell
$ istioctl install --set profile=demo -y
$ kubectl label namespace default istio-injection=enabled
```

サンプルアプリをデプロイする．

```shell
$ pwd
/home/koyama/istio-1.10.3
$ kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml
```

デプロイできているか確認する．

```shell
$ kubectl get svc
NAME          TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE
details       ClusterIP   10.102.37.85     <none>        9080/TCP   74s
kubernetes    ClusterIP   10.96.0.1        <none>        443/TCP    15h
productpage   ClusterIP   10.103.190.110   <none>        9080/TCP   74s
ratings       ClusterIP   10.100.108.5     <none>        9080/TCP   74s
reviews       ClusterIP   10.101.220.149   <none>        9080/TCP   74s

$ kubectl get pods
NAME                              READY   STATUS    RESTARTS   AGE
details-v1-79f774bdb9-m8q5w       2/2     Running   0          53s
productpage-v1-6b746f74dc-wlv2x   2/2     Running   0          53s
ratings-v1-b6994bb9-fn9z6         2/2     Running   0          53s
reviews-v1-545db77b95-pt62r       2/2     Running   0          53s
reviews-v2-7bf8c9648f-qwglq       2/2     Running   0          53s
reviews-v3-84779c7bbc-frs8t       2/2     Running   0          53s
```

以下のコマンドでデモ用Webアプリケーションの動作を確かめる．

```shell
$ kubectl exec "$(kubectl get pod -l app=ratings -o jsonpath='{.items[0].metadata.name}')" -c ratings -- curl -sS productpage:9080/productpage | grep -o "<title>.*</title>"

<title>Simple Bookstore App</title>
```

クラスタ外からアクセスしてみる．以下の図はポート転送設定の概要を表す．

![技術系ポンチ絵(1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103672/bbd4475d-14d9-6fd7-66dc-b99c9da029c0.png)

Kubernetesクラスタのサービス producpage が提供するポート9080を，localhostのポート3300に公開する．

```shell
$ kubectl port-forward svc/productpage 3300:9080
```

上記コマンドとは別でシェルを立ち上げる．
手元にあるラップトップのポート3210をKubernetesクラスタのポート3300に転送する．

```shell
$ ssh -L 3210:localhost:3300 koyama-k8s
```

Webブラウザからlocalhostのポート 3210へアクセスする．

![bookinfo-top.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103672/a45135b6-d622-5ecf-7556-f2d9d1be1838.png)

![bookinfo-subpage.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103672/cd43f64e-c8c5-1d72-ec9d-708a0bc45251.png)

デプロイしたWebアプリケーションの詳細は以下にある．

https://istio.io/latest/docs/examples/bookinfo/

カスタマイズ方法は以下にある．

[BookinfoデモでIstioを体感する | Think IT（シンクイット）](https://thinkit.co.jp/article/14641)
Laravelしくじり先生その2「sesionsテーブルのidの型はBIGINT!じゃない!!」

#TL;DR
``VARCHAR(255)``（NOT NULLと主キー制約付き）でした。

#前提
- Laravel Valetで開発環境を構築しています（Docker不使用）
- Laravel 8.41.0
- PHP 8.0.8
- Nginx 1.21.1
- macOS Big Sur 11.4
- Laravel Fortifyの認証機能を使用しています
- .envファイルにて``SESSION_DRIVER=database``にしています。
- .envファイルにて``APP_DEBUG=false``にしています。
- データベースmigrationに、[Laravel純正のもの](https://readouble.com/laravel/8.x/ja/migrations.html)ではなく[ridgepole](https://github.com/ridgepole/ridgepole)を使用しています

# 事の発端
本番環境を構築してログインページからフォームのPOSTを送ったところ下記の画面が表示されました。
``419|期限切れのページ``
「Laravelで419応答ならリクエストにCSRFトークンが含まれていない（[例](https://qiita.com/yusuke_mrmt/items/cfaba798f22b63de56fb)）」というのがよく言われている原因です。
しかし、実際にはCSRFトークン付きでPOSTリクエストを送信しています。
ここで小一時間悩みました。

# 解決に至るまでの過程
正常にログイン出来る試験環境と、問題が発生している本番環境との差を確認していったところ
``sessions``テーブルの``id``列の型が
試験環境→``VARCHAR(255)``
本番環境→``BIGINT(2O)``
と違いがあり、試験環境の``id``列には文字列が入っていました。
下記SQL文を実行して本番環境の``id``列の型を変更したところ、419応答が無くなり、無事ログインできるようになりました。
``ALTER TABLE `データベース名`.`sessions` CHANGE COLUMN `id` `id` VARCHAR(255) NOT NULL;``
``BIGINT(2O)``として``id``列の型が作成された理由は、ridgepoleでのmigrationをデフォルトのまま使用したためです。


# しくじりの理由
**「データベース起因のエラーなら``SQLSTATE``で始まるエラーが返ってくるのが普通」**
**「idという列名なら数値以外のデータ型はあり得ない」**
と言う思い込みが、問題解決までの道のりを遠ざけていました💦

# 最後に
マサカリ大歓迎です。
よろしければ、**LGTM**ボタンを押して行ってくださいね🌟

# 見出しの出典
https://dic.nicovideo.jp/id/4494511

# これまでのしくじり
[Laravelしくじり先生その1『（型宣言を）「ガチガチにやらなきゃモチモチにならない」と言ったな。あれはやり過ぎ注意だ。』](https://qiita.com/ykawasaki683/items/91e8a354e7793dee9192)
【AWS】AWS認定CloudPractioner(Certified Cloud Practitioner) 勉強教材まとめ in 2021/7

## きっかけ
最近、チームに新しくPM職でjoinしてもらい、まず認定CloudPractioner取得目指して勉強してもらいましょうってことになり、
勉強に役立ちそうな教材をまとめたので、個人の印象含めこちらにもシェア。


## 書籍(新しい順)
1. [一夜漬け AWS認定クラウドプラクティショナー](https://www.amazon.co.jp/%E4%B8%80%E5%A4%9C%E6%BC%AC%E3%81%91-AWS%E8%AA%8D%E5%AE%9A%E3%82%AF%E3%83%A9%E3%82%A6%E3%83%89%E3%83%97%E3%83%A9%E3%82%AF%E3%83%86%E3%82%A3%E3%82%B7%E3%83%A7%E3%83%8A%E3%83%BC-%E7%9B%B4%E5%89%8D%E5%AF%BE%E7%AD%96%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88-%E5%B1%B1%E5%86%85-%E8%B2%B4%E5%BC%98/dp/4798062952/ref=pd_lpo_14_t_0/356-2974313-1185861?_encoding=UTF8&pd_rd_i=4798062952&pd_rd_r=f5c0432e-f54a-4dc7-93f3-5fa802d0e47c&pd_rd_w=dHQjS&pd_rd_wg=HhJYP&pf_rd_p=cc043046-48af-4a56-a049-b4a889070edc&pf_rd_r=R7HAF0M89EPYZ8AMSVSN&psc=1&refRID=R7HAF0M89EPYZ8AMSVSN)
2. [AWS認定資格試験テキスト AWS認定 クラウドプラクティショナー](https://www.amazon.co.jp/AWS%E8%AA%8D%E5%AE%9A%E8%B3%87%E6%A0%BC%E8%A9%A6%E9%A8%93%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88-AWS%E8%AA%8D%E5%AE%9A-%E3%82%AF%E3%83%A9%E3%82%A6%E3%83%89%E3%83%97%E3%83%A9%E3%82%AF%E3%83%86%E3%82%A3%E3%82%B7%E3%83%A7%E3%83%8A%E3%83%BC-%E5%B1%B1%E4%B8%8B-%E5%85%89%E6%B4%8B/dp/4797397403)
3. [AWS認定アソシエイト3資格対策](https://www.amazon.co.jp/AWS%E8%AA%8D%E5%AE%9A%E3%82%A2%E3%82%BD%E3%82%B7%E3%82%A8%E3%82%A4%E3%83%883%E8%B3%87%E6%A0%BC%E5%AF%BE%E7%AD%96-%E3%82%BD%E3%83%AA%E3%83%A5%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%88%E3%80%81%E3%83%87%E3%83%99%E3%83%AD%E3%83%83%E3%83%91%E3%83%BC%E3%80%81SysOps%E3%82%A2%E3%83%89%E3%83%9F%E3%83%8B%E3%82%B9%E3%83%88%E3%83%AC%E3%83%BC%E3%82%BF%E3%83%BC-%E5%B9%B3%E5%B1%B1-%E6%AF%85/dp/4865941991)

3.の書籍は各サービスの概要をさらう意味で有用(記載のあるアソシエイト資格に向けてであれば1冊のみだと不足している印象)


## AWS 公式Eラーニング(無料)
> 直接、資格には関係ないが、試験範囲と被っている＆無料なので推奨

1. [AWS Technical Essentials](https://aws.amazon.com/jp/training/classroom/aws-technical-essentials/)
2. [AWS Business Essentials](https://aws.amazon.com/jp/training/classroom/aws-business-essentials/)


## 試験受けるうえでの前提情報
[【AWS Black Belt Online Seminar】AWS 認定クラウドプラクティショナー取得に向けて](https://www.youtube.com/watch?v=QVhl8cy-A7U)


## 動画での学習コンテンツ(Youtube, 英語)
> 英語ができればおすすめ。(自動翻訳字幕も補助的には使えるレベル)

1. [AWS Certified Cloud Practitioner Training 2020 - Full Course](https://www.youtube.com/watch?v=3hLmDS179YE)
2. [AWS Certified Cloud Practitioner Practice Exam Questions (CLF-C01 Exam Questions)](https://www.youtube.com/watch?v=FXKE1SfityA)


## 外部サイト(有料)
> 定期的にセールがあるため、そのタイミングで購入することをおすすめ(個人的に定価は高い…)

### Udemy
1. [[NEW] Ultimate AWS Certified Cloud Practitioner - 2021](https://www.udemy.com/course/aws-certified-cloud-practitioner-new/)
2. [Practice Exams | AWS Certified Cloud Practitioner CLF-C01](https://www.udemy.com/course/practice-exams-aws-certified-cloud-practitioner/)

### whizlabs
1. [https://www.whizlabs.com/aws-certified-cloud-practitioner/](https://www.whizlabs.com/aws-certified-cloud-practitioner/)
これからのメールセキュリティ(暗号編)

# これからのメールセキュリティ


2021.7.8-9 開催された Internet Week ショーケース 2021 で、弊社チーフエンジニア平野善隆 @hirachan により「これからのメールセキュリティ(暗号編)」というタイトルで発表が行われました。その時の資料をこちらにも共有します。


## はじめに

いずれチャットに置き換わると言われ続けている電子メールですが、 今なおインターネットの基盤としてさまざまな局面で利用され続けています。 そのメールの基本的な構造に変化はありませんが、 現在でもさまざまな技術や仕様を取り込んで進化しています。 

ここでは、 最新の送信ドメイン認証技術や暗号化の仕組みについて紹介します。


## 目次

- メールセキュリティ 世界と日本
- 盗聴・なりすまし受信から守る
 - STARTTLS
 - MTA-STS
 - TLS-RPT
 - DANE for SMTP
 - Require TLS
 - DANE for S/MIME
- まとめ


## これからのメールセキュリティ(暗号編)
<script async class="speakerdeck-embed" data-id="4718cbc854a74f17a62232e9a9f5d753" data-ratio="1.77777777777778" src="//speakerdeck.com/assets/embed.js"></script>


## 関連発表資料

以下、他の発表資料も合わせてご参考ください。

- [メールセキュリティとDNSの蜜月関係](https://qiita.com/qualitia_cdev/items/632a421b879d936104a5)
- [送信ドメイン認証・暗号化 DeepDive ～ DMARC から MTA-STS, DANE まで全部PASSさせるまでの道のり](https://qiita.com/qualitia_cdev/items/9f01f4151ceafca1ef8d)
HTML 入力フォーム

#input

1行テキストを入力するためのフォームで、属性にtype、値にtextを使います。
初期値を設定する時は属性にvalueを使いましょう。

```HTML
<input type="text" value="hello">
<input type="password" >
```
typeにpasswordを入力することで、伏字になります。

また、複数行使う時はtextareaを使いましょう。

```HTMl
<textarea placeholder="名前">
```
このように属性にplaceholderを使うことで、
どのような値を入力すべきか書くことができます。

#label

上記のようにplaceholderの他にlabelを使う方法もあります。
labelを使う時はlabelタグを使います。
labelタグに属性のforを入力して、inputタグにidを入力します。
そのようにすることで紐付けが完了します。

```HTML
<label for="name">名前</label>
<input type="text" id="name">

<label>名前 <input type="text"></label>
```
このようにlabelの中に入れることもできます。
その時は紐付けが完了している状態なので、idやforは消しておきましょう。

#ドロップダウンリスト

複数の選択肢から選ぶことができる方法をドロップダウンリストと言います。
これにはselectタグとoptionタグを使います。

```HTML
<label for="color">好きな色</label>
<select id="color">
 <option>色1</option>
 <option>色2</option>
 <option>色3</option>
 <option selected>色4</option>
 <option>色5</option>
 <option>色6</option>
</select>
```
selectedを使うことで最初に選択されている状態を作ることができます。
また、selectにsize属性を使うことで表示されている幅を変えることができ、
multiple属性を使うとcommandを押しながら
クリックすることで複数選択することができます。

#チェックボックス

type属性の属性値をcheckboxに変えましょう。
予めcheckedを使うことによって最初に選択されている状態を作ることができます。

入力部品をグループ化するタグはfieldsetタグです。
キャプション（見出し）を付けるにはlegendタグを使います。

```HTML
<fieldset>
 <legend>お使いの携帯</legend>
 <label><input type="checkbox">iphone</label>
 <label><input type="checkbox" checked>Android</label>
 <label><input type="checkbox">その他</label>
</fieldset>
```

#ラジオボタン

上記のチェックボックスは複数選択の時に使いますが、
ラジオボタンは一つ選択の時に使います。
書き方はほとんどチェックボックスと変わりませんが、
そのまま同じだと複数選択になってしまいます。
ですので、同じ項目と認識させるためにname属性を使います。

```HTML
<fieldset>
 <legend>一番好きな携帯</legend>
 <label><input type="checkbox" name="phone">iphone</label>
 <label><input type="checkbox" name="phone" checked>Android</label>
 <label><input type="checkbox" name="phone">その他</label>
</fieldset>
```

他にも入力の種類はあります。
色を選択できるcolor,日付を選択できるdate,数を選べるnumber,
範囲を選択できるrangeがあります。

#ボタン

ボタンはtype属性の値をbuttonに変えます。
ですが、画像の埋め込みなどもできるので、一般的にはbuttonタグが好まれています。
また、disabledなどを使うことで部品を無効化することもできます。

```HTML
<input type="button" value="OK">
<button>OK</button>
<input type="button" value="OK" disabled>
<button disabled>OK</button>
```

#最後に
初心者ですので、拙い文章や書き方だと思いますが、最後まで見て頂き
ありがとうございました。もし、ご指摘等がございましたらよろしくお願い致します。
【UiPath】InvokeCodeアクティビティで関数を定義する

# はじめに

この投稿は、RPA ツールの UiPath の実装例についての説明です。
※ 個人的に書き方を忘れてしまうことがあるので「備忘録」として投稿します。

UiPathのコミュニティ「UiPath Friends」が企画する「UiPathブログ発信チャレンジ2021サマー」の 19日目の投稿でもあります。

企画の内容は [**こちら**](https://note.com/shumpei_w/n/n651cbdbec4e8) 。カレンダーのURLは [**こちら**](http://u0u1.net/sUwZ) です。

https://twitter.com/ShumpeiWatanabe/status/1405168150736359427


# InvokeCode内で関数を定義したい

UiPathでフローを作成する際に、ちょっと凝ったことをしようとするとコードが長くなりがちです。そんな時に `コードを呼び出し(Invoke Code) アクティビティ` を使用するとシンプルに実装できることがあります。
また、コードを呼び出し(Invoke Code) アクティビティ を使用して、フロー内に関数を作成することが出来ます。

メリットとして

- 繰り返し何度も呼び出せる
- 他のアクティビティに変数として渡せる（例：DataTable出力関数をログ出力アクティビティで使用）

があります。デメリットは「.NET寄りの知識なので、少しわかりにくい」「」ことでしょうか。



# 参考記事

以下の記事が参考になります。

https://forum.uipath.com/t/invoke-code/185816/5

https://www.uipath.com/ja/blog/developer/uipath-tips-for-dot-net-programmers


# 書き方サンプル

コードの上部で匿名関数を定義して、それを呼び出します。

関数には2つの型があります。

- 1）Func型（Function形式で戻り値があるもの）
- 2）Action型（Sub形式で戻り値が無いもの）

1）Func型（Function形式で戻り値があるもの）

```
'// FUNC（戻り値あり）定義
Dim fncHoge As Func(Of Integer, Integer) = _
	Function(in_NumberA As Integer) As Integer
		Return in_NumberA * 2
	End Function

'// 呼び出し例
Console.WriteLine(fncHoge(7))
```

2）Action型（Sub形式で戻り値が無いもの）

```
'// SUB（戻り値なし）定義
Dim subHoge As Action(Of Integer, Integer) = _
	Sub(in_NumberA As Integer, in_NumberA As Integer)
		Console.WriteLine(in_NumberA + in_NumberB)
	End Sub
'// 呼び出し例
subHoge (3, 5)
```


# どういう時に使うのか？

Func型（Function形式で戻り値があるもの）は色々使いみちがあるのですが、Action型（Sub形式で戻り値が無いもの）は、そんなに使いません。

過去に使ったことあるかなと思って探してみたら、以下で使ってました。

https://qiita.com/miya_gis/items/fb65d758d074e8974790

TreeNodeの階層型のデータを扱う際に「再帰的」に使っていましたが、現実的にはあまり使いません。
「内部でログ出力するだけ」のような関数なら使えると思います。


# xamlファイル上の変数としても使用可能

この匿名関数は「InvokeCode内」で無くても、xaml内で変数としても作成可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154139/a89befa4-1492-a510-6910-d3e4f0a541d3.png)

ただし、上記のように `変数の初期値として関数を定義する` 方法だと残念ながら「未使用変数の削除」を実行すると変数が消えてしまうので、以下のように `代入アクティビティ、またはコードを実行アクティビティ内で定義` するほうが良いです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154139/efefd0b9-92c6-a6b3-bd2e-af466f02c070.png)


# 終わりに

いかがでしたでしょうか。実装時の引き出しの一つとして、何かの役に立てば幸いです。
この記事が参考になったら、 LGTMをお願いします。閲覧ありがとうございました。
よく使うWebツールまとめ

## 1. 概要
実装時の動作確認、フォーマット整形、テスト等その他もろもろちょっとした事でお世話になっているWeb上にあるツールについてまとめてみました。他にも役に立つWebツールについて教えていただけたら幸いです:relieved:

## 2. Webツール一覧

### 2.1 パスワード・乱数自動生成
https://www.luft.co.jp/cgi/randam.php

### 2.2 全角半角変換
https://so-zou.jp/web-app/text/fullwidth-halfwidth/

### 2.3 .htaccess用暗号化パスワード生成
http://www.shtml.jp/htaccess/make_htpasswd.html

### 2.4 PHP動作確認
https://3v4l.org/ktlYs

### 2.5 正規表現チェック
http://okumocchi.jp/php/re.php

https://www.regexpal.com/

### 2.6 HTML構文チェック
https://validator.w3.org/

### 2.7 透過画像作成
https://www.peko-step.com/tool/alphachannel.html

### 2.8 JSONの整形、構文チェック
https://lab.syncer.jp/Tool/JSON-Viewer/

### 2.9 エンコード/デコート
http://www.encodemaniax.com/

### 2.10 フォント一覧
http://www13.plala.or.jp/bigdata/index.html

### 2.11 SQLフォーマット

https://atl2.net/webtool/sqlフォーマッターfor-web

### 2.12 グローバルIPアドレス確認
https://www.ugtop.com/spill.shtml

### 2.13 テストデータ作成
* 画像ファイル生成

http://placehold.it

* テキスト生成

https://lipsum.sugutsukaeru.jp/
文字列と数値を使おう1

#以下のプログラムでエラーが起きた原因
```
puts "1日は" + 24 * 60 + "分です。"
```

原因は文字列と数列は+を使って繋げることができないため！


正しいコードはこう

```
puts "1日は#{24 * 60}分です。"
```

or

```
puts "1日は" + (24 * 60).to_s + "分です。"
```

文字列として連結したい場合は数値を文字列に変換する。
方法は二つある
1.文字列の中に数値を入れる。
ダブルクオーテーションで囲んで文字列として扱って、そこに数値をぶちこむ。埋め込みたい値は#{}で囲む

2.to_sメソッドを使う。
to_sを使えば+が使えます！数値は　（）で囲みましょう。そしてかっこの終わりに.to_sをつける！そしたら数値と文字列は繋がるのです。
Before starting UiPath:初期化の代入

## 皆もすなるQiitaといふものを、儂もしてみむとてするなり。

と言う訳で、こん＊＊は！はなっち！です。

★★★この記事はUiPathブログ発信チャレンジ2021サマー、7/19の記事です。★★★

今回は、ちょっとしたシリーズです。UiPathを使うに当たって、UiPathの機能ではなく、コンピュータ言語を使う上での基礎知識を展開していこうと思います。

#初期化のための代入

初期化と言うのは、変数に対して、最初の状態にしておく、あるいは使い終わった変数を綺麗にするなどで言い換えられます。
お皿で言うと、棚から出した埃まみれの皿を洗うのが初期化、または、食べ終わったお皿をまた使うために洗いますね。そのような事です。

UiPathで変数を扱うには、「変数」タブで定義をする必要があります。
　　　　名前 ……… UiPathのロボットが使用する変数名を定義します。
　　　　変数の型 … 変数が格納できる内容の型を指定します。
　　　　スコープ … 変数が有効なシーケンスなどの範囲を指定します。
　　　　規定値 …… 使用する変数をUiPathのロボットが準備した時の最初の値を指定します。

UiPathで変数を使用する前に、代入アクティビティを使って、その変数に値を設定しておいた方がよい場合があります。
　　　　最大値を求める際に、最小値を設定しておく（Int32.MinValue）
　　　　最小値を求める際に、最大値を設定しておく（Int32.MaxValue）
　　　　文字列を連結するために、空白を設定しておく（String.Empty）

その他に、変数に「型」を事前に設定しなければならないものがあります。これも代入アクティビティを使って行います。
　　　　日付型に、本日を設定する（DateTime.Today）
　　　　日付型に、当月1日を設定する（New DateTime(Now.Year, Now.Month, 1)）
　　　　辞書型に、辞書のキー、値の型を設定する（New Dictionary(Of String, String)）
　　　　DataTable型に、DataTableとしての領域をする（New DataTable("テーブル名称")）

変数を使用する場合、その変数に何が入るか、何を入れるかを意識してみましょう。
変数を繰り返して使う場合、ロジックを見極めて、初期化のタイミングを間違えないようにしましょう！

##おわりに
いかがでした？

初期化は、使う場合に応じて使用する事が多いです。初期のタイミングを誤ると、無駄な処理を延々繰り返してしまう（無限LOOP）に陥ります。

是非UiPathでのロボ開発の一助になればと思っています。

ありがとうございました！
Oneライナー_ファイル拡張子変更編

## Oneライナー_ファイル拡張子変更編

find,xargs,sed ...

カレントディレクトリ内の *.txt ファイルに *.log を追加する

```
$ for filename in *.txt; do mv $filename ${filename%}.log; done
```

指定ディレクトリ内の *.txt ファイルに *.log を追加する

```
$ find ./xargs_tmp/ -type f | xargs --replace=SomeFile bash -c "mv SomeFile SomeFile.log"
```

カレントディレクトリ内の *.log ファイルを *.txt に変更する

```
$ find ./ -type f -name "*.log" | sed 'p;s/.log/.txt/' | xargs -n2 mv
```

カレントディレクトリ内の ファイルを に、YYYY-MM-DD-を付与する。

```
$ for file in *; { mv "$file" "$(date +%F)-$file"; }
```

カレントディレクトリ内の ファイルを すべて拡張子 .log 付与する

```
$ find ./ -type f  | xargs -I% mv % %.log
```


カレントディレクトリ内の *.txt ファイルを すべて拡張子取り除く

```
$ find ./ -type f -name "*.txt" | perl -pe 's/\.txt\n/\n/g' | xargs -I% mv %.txt %
```

カレントディレクトリ内の *.txt ファイルを *.log に変更する

```
$ find ./ -type f -name "*.txt" | perl -pe 's/\.txt\n/\n/g' | xargs -I% mv %.txt %.log
```

カレントディレクトリ内の *.txt ファイルを *.log に変更する

```
$ find * -maxdepth 0 -print0 | perl -pe 's/\.txt\0/\0/g' | xargs -0 -I% mv %.txt %.log
```

カレントディレクトリ内の *.txt ファイルを *.log に変更する

```
$ find * -maxdepth 0 -print0 | perl -pe 's/\.log\0/\0/g' | xargs -0 -I% mv %.log %.txt
```
kintoneでレコードの値を取得する

# 本記事の目的
前回の記事（https://qiita.com/miyapon38/items/16efc9cf0356b9916ee9） の応用として、
今回はJavaScriptを用いたレコードの値の取得を行ってみます。

# 準備するもの
任意のアプリを作成し、フィールドを追加します。
今回フィールドコードはフィールド名と同一とします。
<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1526064/0c6b09f6-9fd3-21e1-eed3-845700c592e1.jpeg">

# JavaScript記述
次に、実際にレコードの値を取得してみます。
レコードの値は「event」から取得することができます。

```javascript
(function() {
  'use strict';
  kintone.events.on('app.record.detail.show', function(event) {
    console.log(event);
  });
})();
```
実行結果
<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1526064/3d346d0b-2dcd-c798-469c-5e056e060277.jpeg">
このように、レコード内の色々なデータが取得されます。
　

更に「食べた物」フィールドの値に深掘りしたい場合は「event.record.食べた物.value」という風に記述します。


```javascript
(function() {
  'use strict';
  kintone.events.on('app.record.detail.show', function(event) {
    window.alert(event.record.食べた物.value+'を'+event.record.数量.value+"個たべました");
  });
})();
```
実行結果
<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1526064/d5e0ac29-1e16-668d-8946-0b2d7701bac3.jpeg">
無事、レコードの値を利用したログを出力できました。

# まとめ
レコードの値の取得はJavaScript処理を行う上で大事な基礎部分です。
次回はこの応用としてアプリ間のデータ処理を扱いたいと思います。
PythonでHello, world!

Python学習の第一歩、Hello, world!と表示する方法を解説します。
実行環境はWindowsを想定しています。

まずは、Pythonをインストールします。
https://www.python.org/

適当なファイルを作成します。今回はhello.pyというファイルを作成します。

コマンドプロンプトを起動して、cdコマンドを使ってファイルを作成したディレクトリに移動します。
cdコマンドについては以下の記事が参考になります。
参考：https://eng-entrance.com/windows-command-cd

```python:hello.py
print('Hello, world!')
```
print関数は、カッコ内をシングルクォーテーション（'）または、ダブルクォーテーション（"）で囲んだ文字列を表示できます。

```
python hello.py
```
コマンドプロンプトで上記のコマンドを実行します。すると

```
Hello, world!
```
と表示されます。

また、インタラクティブシェルを使ってもHello, world!を表示できます。
インタラクティブシェルについては以下の記事が参考になります。（私が書いた記事です）
参考：https://inouelog.com/python-interactive-shell/

コマンドプロンプトで

```
python
```
と入力します。
するとインタラクティブシェルが立ち上がるので、先ほどと同じようにprint関数を使います。
Enterを押すと以下のように表示されます。

```
>>> print('Hello, world!')
Hello, world!
```
2通りの方法でHello, world!を表示させる方法を解説しました。
【swiftUI】UIFeedbackGeneratorでブルッとする振動を実装してみる

現在開発中のアプリで使用した感触フィードバックについての解説です。
SNSアプリとかでメッセージ投稿したときブルっと振動がなることってありますよね。それです。

こちらの記事を参考のうえ、swiftUIで実装してみました。
https://qiita.com/WorldDownTown/items/2b5a72e41a95763727bb

## Haptics Feedbck（感触フィードバック）とは
iOS10以降で使えるようになった振動によるアクションフィードバック。
ユーザーの何かしらのアクションに対するフィードバックを表現します。

`UIImpactFeedbackGenerator`, `UISelectionFeedbackGenerator`, `UINotificationFeedbackGenerator`
の三種類があるとのことだが、今回はアクションの成功や失敗を表す`UINotificationFeedbackGenerator`を実装しました。
（詳しい説明は省略します）
https://developer.apple.com/documentation/uikit/uinotificationfeedbackgenerator

## swiftUIで実装してみた

大事な部分以外は省略して書きました

```swift

import SwiftUI

struct SettingEditTextView: View {
    let haptics = UINotificationFeedbackGenerator()
    var body: some View {
            Button(action: {
                saveText()
            }, label: {
                Text("Save".uppercased())
            })
        }
        .padding()
        .frame(maxWidth: .infinity)
        .alert(isPresented: $showSuccess) {() -> Alert in
            return Alert(title: Text("更新しました"), message: nil, dismissButton: .default(Text("OK"),action: {
                dismissView()
            }))
        }
    }

    func dismissView() {
        self.haptics.notificationOccurred(.success)
        self.presentaitonMode.wrappedValue.dismiss()
    }

    func saveText() {
        // テキスト保存のメソッド...
        self.showSuccess.toggle()
    }
}
```

`notificationOccurred`には.success, .warning, .error の三種類があって、用途によって選択できるとのこと。
Stackのchange-set簡易確認

# Stackのchange-set簡易確認

簡単な確認用

```
#!/bin/bash

# --------------------------------------------------------
# checkしたいLogicalResourceIdの配列
# --------------------------------------------------------
array=(
ExampleServiceDiscoveryEntry
ExampleService
ExampleTaskDefinition
)

# --------------------------------------------------------
# 定数設定
# --------------------------------------------------------
csn=change-set-example
sn=stack-example
pf=prd_xxx

# --------------------------------------------------------
# メイン処理
# --------------------------------------------------------
for target in "${array[@]}"
do
  echo "[${target}]"
  tmp=$(aws cloudformation describe-change-set --change-set-name $csn --stack-name $sn --query "Changes[?ResourceChange.LogicalResourceId=='${target}'].ResourceChange.Action" --output text)
  echo "Action = ${tmp}"
done


```
繰り返し処理

#1.以下のプログラム実行後に出力される最終的な値は何か。

```
8.times do |num|
  num = num + 1
  puts num
end
```

答えは8

解説
timesメソッドは数値の値によってその値の回数だけ処理を繰り返すメソッドである。
そして||で囲うということはブロック変数を定義している。ブロック変数の最初の値は0。0から数える。
繰り返し処理が一回実行されるごとにブロック変数には一ずつ加算した値が代入される。
今回は8回繰り返されるので最終的に値は8になる。

#2.以下のプログラム実行後に出力される値は何か
```
colors = ["あか", "あお", "きいろ"]
element_count = colors.length

element_count.times do |i|
   i = i + 1
end

puts i
```

答えは　エラーが起こる
解説
ブロック変数||は繰り返し処理の中でしか使えない。
今回はそのブロック変数を繰り返し処理の外で記述してしまっているためエラーが起こる。
puts iは中に入れればOK!

#3.以下のプログラム実行後に出力される値
```
posts = ["あか", "みどり", "黄色", "オレンジ", "黒"]

num = 0

posts.each do |post|
  num = num + 1
end 

puts num
```
答え5
解説
each文を使用すると配列の要素分だけ処理が繰り返される。
今回postsの中身は5個入ってるから5回処理を繰り返す。
処理内容は一回ごとにnum+1なので最終的にnumは5になる。
HTMLとCSSの概要

#拡張子とは
・拡張子とは、ファイルの後ろにつける、〇〇という文字列のこと。
ファイルにかかれている言語の種類を示すもの。

#HTMLの役割とCSSの役割
・HTMLとはブラウザ上に情報を表示するための言語。
・CSSはHTMLを装飾し、閲覧する人にとって見やすくするための言語。
文字数を算出するプログラムの実装

# 問題
以下の要件を満たすcount_hiメソッドを実装しましょう。

対象となる文字列の中から、"hi"という特定の文字列の数を取得する
上記で取得した数を出力する


#雛形
```
def count_hi(str)
  #  処理を記述
end

# 呼び出し例（引数には対象となる文字列を指定します）
count_hi('abc hi ho')
```

#この問題の解き方
対象の文字列の中に"hi"という文字列がいくつあるか数える為、scanメソッドを使用します。
scanメソッドは、対象の要素から引数で指定した文字列を数え、配列として返すメソッドです。


count_hiメソッドの仮引数strには文字列が格納されているので、以下のように記述することで、”hi”という文字列の数だけ配列の要素を返すことができます。

```
def count_hi(str)
  str.scan("hi")
end
```
そして、その配列の中の要素の数をlengthメソッドで返し、putsメソッドで出力すれば完成です。
初学者による復習[モデルを作成してみよう！]

さて今回は基礎中の基礎、モデルを作成してみよう！

**そもそもモデルとはなんぞや**
ざっくり説明するとデータベースのやり取りを行うもの。
最終的にはテーブルと言われるものが作成されその中にユーザー名、テキストの種類など
分けて管理することができるってわけ！
文章だけで説明しても伝わりづらいと思うので実際にご自身のPCで手を動かしながらの方がしっくりくるかも。

先ずはターミナルで以下のようにコマンドを入力する。

```
rails g model message
```

messageとなっているところは実装の際、ご自身が作りたいものに置き換えて記述しよう。
**ここで気をつけたいのは必ず単数系の名前で実行すること！
複数形にすると意図しないものが作成されてしまうため、ご法度となっている。**
こうすることでmessageのマイグレーションファイルが作成される。
その中に扱いたい情報を記述していくことになる。

```ruby
class CreateMessages < ActiveRecord::Migration[6.0]
  def change
    create_table :messages do |t|
      t.string  :content
      t.references :room, null: false, foreign_key: true
      t.references :user, null: false, foreign_key: true
      t.timestamps
    end
  end
end
```

t.~と記述しているのがこのテーブルで扱いたい情報になる。
ここでいうとテキストの内容、メッセージを投稿したユーザーIDなどを記述している。
情報＝カラムと呼ばれるものでこちらの説明は過去の記事を参考にしていただければと思い、
今回は割愛する。

ただここまでだと記述したカラムがテーブルの中にデータとして反映されていないので
ターミナルで必ず以下のコマンドの実行を忘れずに！

```
rails db:migrate
```

こちらを実行することでテーブルの中にカラムの情報が反映される。
とてもよく使う流れなので覚えといて損は無し！
実際にSequel Proなどデータベースの中身が可視化できるツールで確認すると
今までの作業がちゃんと反映されているか分かりやすい！

https://gyazo.com/d0a31c6d326e9ee139143ab51fa1569c
2021/07/17開催 Connpassイベントランキング

# 申込数TOP5

|順位|イベント名|グループ|申込数|定員|
|:---:|:---|:---|:---:|:---:|
|:one:|[AWSの基礎を学ぼう 特別編　最新サービスをみんなで触ってみる はじめての位置情報サービス](https://awsbasics.connpass.com/event/215185/)|[AWS エバンジェリストシリーズ　AWSの基礎を学ぼう](https://awsbasics.connpass.com/)|438||
|:two:|[ROS Japan UG #43 組み込み勉強会](https://rosjp.connpass.com/event/215366/)|[ROS Japan UG](https://rosjp.connpass.com/)|213|358|
|:three:|[23卒エンジニア志望学生LT会 vol.2](https://connpass.com/event/215902/)||87||
|:four:|[Code Polaris 女性 IT エンジニア向け勉強会 #06 - 1周年記念](https://code-polaris.connpass.com/event/216797/)|[Code Polaris](https://code-polaris.connpass.com/)|80||
|:five:|[PLATEAU Hack Challenge 2021（オンライン）](https://asciistartup.connpass.com/event/212785/)|[ASCII STARTUP](https://asciistartup.connpass.com/)|75|88|
【Swift】CIImageからUIImageに変換すると画像が表示されない


CIImage->UIImageへの変換がうまくいかなかった話。

#環境
MacOS Big Sur version 11.4
Swift 5.4.2
Xcode 12.5.1

#CoreImageを使って画像加工をしていた
Swiftの勉強でCoreImageを使った画像にフィルターをかけるアプリを制作していました。

CoreImageを使うにはUIImageからCIImageを作る必要があるらしい。
そして、CIFilterなどで加工したCIImageをSwiftUIのView内で表示するにはUIImageに変換する必要がある。

いろいろ記事を漁ったところ、UIImageからCIImageへの変換は次の2種類があることがわかった。


```example1.swift
let uiImage: UIImage = UIImage(ciImage: ciImage!)
```

```example2.swift
let ciContext = CIContext(options: nil)
let outputCGImage: CGImage = ciContext.createCGImage((ciImage)!,
            from: (newCiImage?.extent)!)!
let uiImage = UIImage(cgImage: outputCGImage, scale: 0, orientation: uiImage.imageOrientation)
```
参考：Core Imageを使ったiOS上での画像フィルタの実装（ https://qiita.com/makoto-nagai/items/21cb119d036b7db346af ）

#CIImage->UIImageの変換がうまくいかない
とりあえず、上側のUIImage→CIImageにダイレクトに変換しているコードがシンプルなので書いて実行してみたら、画像がまったく表示されなくなった。なぜ？
![スクリーンショット 2021-07-18 20.18.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1724786/4335fc9d-0618-12b0-b543-eaa7ce9375b2.png)
printでデータが入っているか確認したがデータはちゃんと入っていそう。なぜ、、、？（ここで1時間ぐらい格闘した）

下側のCIContextでCGImageを経由してUIImageに変換しているコードだとちゃんと画像が表示されました。なぜ、、、？


#CIImageは画像そのものではなく、「レシピ」
こういう時は公式ドキュメントだ！

Apple Developerの公式ドキュメントのCIImageに書かれていた文章（を日本語訳したもの）は以下の通り。
>CIImageオブジェクトは、画像データが関連付けられていますが、画像ではありません。CIImageオブジェクトは、画像の "レシピ "と考えることができます。CIImageオブジェクトには、画像を生成するために必要な情報がすべて含まれていますが、Core Imageは、指示されるまで実際に画像をレンダリングしません。このような遅延評価により、Core Imageは可能な限り効率的に動作します。
>CIImage | Apple Developer Documentation: https://developer.apple.com/documentation/coreimage/ciimage

つまり、、、？
料理で例えると、CIImageは料理そのものではなく料理を行う手順を記載しているクックパッドのような役割で、CIContextからCGImageへの変換の段階は手順に従って料理を行っているということでしょうか。
そして、CGImage->UIImageは料理を見せるためにお皿に盛り付けを行うといったイメージ？

つまり、UIImage(ciImage: ciImage!)で画像が表示されなかったのは、クックパッドをそのままお皿に盛り付けようとしたためにうまくいかなかったということなのでしょうね。

しかし、なぜCIImage->UIImageにダイレクトに変換できるメソッドが用意されているのかはわかりませんでした。この方法でも正しく動く例があるのでしょうか、、、。


#おわりに
そもそもうまくいかなかった時点でCIContextでの方法にさっさと切り替えればよかったのですが、結果的にUIImageとCIImage、CGImageの理解を深めることができたのでいい経験になりました。

また、著者はSwiftでのプログラミングの経験も浅く、Qiitaでの記事執筆も初めてなので、至らぬ点があるかもしれません。何か問題があればコメントをお願いします。
自分のアウトプットと備忘録のために執筆しましたが、この記事が誰かの役に立てば幸いです。
深層学習。DeepMind(Google)のPerceiverを理解するコツ。

# 概要

以下のDeepMind(Google)のPerceiver、

Jaegle, A., Gimeno, F., Brock, A., Zisserman, A., Vinyals, O., & Carreira, J. (2021). Perceiver: General perception with iterative attention. arXiv preprint arXiv:2103.03206.

Perceiver: General Perception with Iterative Attention
https://arxiv.org/abs/2103.03206

に関して、理解するコツを記載する。

# 理解するコツ１

以下は、論文の図１引用。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342207/01aad308-7087-9ae4-e1fe-80520bcf31af.png)

 
このアーキテクチャを含め、理解するコツは、

* 深層学習の場合は、なんでもあり※1 なので、いちいち、個別の意味や作用に関してまじめに考えないこと。

※1 非常に大規模なパラメータと、トレーニングがあるために、基本、なんでもあり。例えば、ある処理は掛け算すべきところを誤って足し算にしても、それは、どうにでもなる場合もある（はず）。

* 「Q]「K」「V」が気になるかもしれないが、、、まあ、適当に考えればいい（はず）。
* Weightsのsharedも、意味があると理解してもいいし、パラメータを減らしているだけと理解してもいい（はず）。

# まとめ
特にありません。

#　関連記事（本人）
[DeepMind(Google)のPerceiverの記事でわかりやすい思った記事N選　(まだ、N＝1）](https://qiita.com/enoughspacefor/items/866d579b743400ed3da6)

[深層学習。DeepMind(Google)のPerceiverのココが気になる。](https://qiita.com/enoughspacefor/items/da14dfa85f43c0063344)
pdf.jsを使って画面をpdfにするときのテクニック

どうしてもサーバサイド言語を使わずにpdfにしないといけないというので色々やったメモです。

## 基本お作法
 * pdf.js
 * canvas2html

を用意してやり

```js
let doc = new jsPDF('p','pt','a4')
let dom = document.body
doc.addHTML(dom, () => {
  doc.save('html.pdf')
})
```

これでbody（見えてる画面）がpdfになります。

## 注意するべき点

 * 何もしないとクライアントの画面サイズで書き出される
 * object-fitのcoverやcontainは効かない

### 何もしないとクライアントの画面サイズで書き出される
結構ハマりました。
cssで幅指定したり、canvas2htmlのオプション調べたり・・・
結局`addHTML()`の第4引数(options)で`windowWidth`と`width`という2つの値を調整すればよさそうでした。

```js
let doc = new jsPDF('p','pt','a4')
let dom = document.body
doc.addHTML(dom, 0, 0, {
  windowWidth: 1500,
  width: 1500
} () => {
  doc.save('html.pdf')
})
```

## object-fitのcoverやcontainは効かない
これはfill状態になります。
backgroudは画像すら出ません。
素直に画像を直すか、親要素をつけて`overflow:hidden`と子要素の画像をうまく位置をずらし擬似的にobject-fitしてるっぽくすることで回避できます。

## 今見ている画面でなく違う画面をpdfにしたい時
画面遷移させてそこでpdfというのでもいいですが、そういったことはさせずpdfにしたい場合。
このとき隠し要素をコーディングしておき、`let dom = document.body`をその要素にしてやればいいです。
`display:none;`や`opacity:0;`とすると`save()`で真っ黒になってしまいます。
いろいろ試しましたが、`z-index:-1`とかで見えない場所に置いておくとうまくいきます。
IceVisionでのformatごとのデータ読み取り方法

#これは何
2021年で**最もイケている物体検出フレームワーク**と言っても過言ではないIceVisionを使って、**VOC format**と**COCO format**のデータセットに対してObject Detectionを簡単に行うためのhands-on

#IceVisionとは
[過去記事](https://qiita.com/Ikwus/items/2a5d4b5ac2d00baf7fec)参照

#環境
https://qiita.com/Ikwus/items/2a5d4b5ac2d00baf7fec

Jupyterは結局オンプレのUbuntuで動かしています。
一応google colabでの動作確認も行いました。

#手順
今回はデータセットのみを手軽に書き換えたいため、基本的な手順は以下のhands-onに準じます。

https://qiita.com/Ikwus/items/7f7558745e5e7221c7b6

##前準備
以下の部分は今回の記事において共通です。

```python
##Dataset加工
train_records, valid_records = parser.parse()
image_size = 384
train_tfms = tfms.A.Adapter([*tfms.A.aug_tfms(size=image_size, presize=512), tfms.A.Normalize()])
valid_tfms = tfms.A.Adapter([*tfms.A.resize_and_pad(image_size), tfms.A.Normalize()])
train_ds = Dataset(train_records, train_tfms)
valid_ds = Dataset(valid_records, valid_tfms)

#モデル構築
model_type = models.mmdet.retinanet
backbone = model_type.backbones.resnet50_fpn_1x(pretrained=True)
model = model_type.model(backbone=backbone(pretrained=True), num_classes=len(parser.class_map))

#データローダー構築
train_dl = model_type.train_dl(train_ds, batch_size=8, num_workers=4, shuffle=True)
valid_dl = model_type.valid_dl(valid_ds, batch_size=8, num_workers=4, shuffle=False)

#学習設定
metrics = [COCOMetric(metric_type=COCOMetricType.bbox)]
learn = model_type.fastai.learner(dls=[train_dl, valid_dl], model=model, metrics=metrics)
```

## VOC format

VOC formatのFridgeデータセットをimportします。**VOC Dataset**はannotationがdirectroyなので、```annotations_dir```を指定し、```images_dir```もdirで指定します。
現状ではURL末尾が.zipでないと動きません。URLを使わない方法はまた別にあるのですが、後述します。(現状ではどこかにuploadした方が楽です。)

```python
url = "https://cvbp-secondary.z19.web.core.windows.net/datasets/object_detection/odFridgeObjects.zip"
dest_dir = "fridge"
data_dir = icedata.load_data(url, dest_dir)
parser = parsers.VOCBBoxParser(annotations_dir=data_dir / "odFridgeObjects/annotations", images_dir=data_dir / "odFridgeObjects/images")
parser.class_map
```

学習の詳細は省略しますが、以下のようにある程度良い感じで学習ができました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/726758/85b5b1fb-2013-19e8-4977-a4027265c521.png)


## COCO format
COCO formatではRaccoonデータセットをimportします。([Roboflow](https://public.roboflow.com/object-detection/raccoon/38)から取ってきました。)
**COCO format**はannotationがfileなので、```annotations_filepath```を指定し、```images_dir```はdirで指定します。

```python
url = "https://github.com/Ikwus/pub-sandbox/raw/main/coco.zip"
dest_dir = "raccoon"
data_dir = icedata.load_data(url, dest_dir)
parser = parsers.COCOBBoxParser(annotations_filepath= data_dir / "coco/_annotations.coco.json", img_dir=data_dir / "coco/images")
parser.class_map
```

同じく学習の詳細は省略しますが、結果は良好でした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/726758/8055621b-1001-c180-6bc7-cb2cc68210ea.png)

#おわりに
(TODO) fast.aiを説明なしに使っているので、その説明を行ってからIceVisionの本領であるモデルを横断したobject detectionをやってみようとおもいます。
AIきりたんがどうしてもうまく出力できないときの対処方法

# 問題点
[LogicProでxml出力してからファインダー上で手動でmusicxmlにするっていう方法](https://matcha-music.com/2020/03/13/post-2189/)でいままでやっていたんですが、たまにうまく行かないときがありました。それは、きりたんが歌いにくくなっているとかではなくて明らかに、なにかのエラーですべて無声化してしまっていました。特に、ラップのように１小節に多くノートを詰めると、完全に無声化したり、エラーで書き出せなかったりします。

# 対処方法
いろいろ試してみたんですが、うまく行かず結局、運営さんにtwitterのDMで聞いたところ

> 「スコア（MusicXML）は記述の自由度が高い形式のため、予期せぬエラーが起こっている可能性があります。
該当の楽譜を見ていないため正確なことは申し上げられないのですが、一度楽譜をMIDIに出力していただき、再度MIDIインポートしてから歌詞を打ち込んでいただくのが確実かと思います。」

とのことでした。

このやり方を自分流に変えたのが

> 「LogicProでスコアに歌詞まで書いたものをMIDIもしくはxmlとして出力したあと、Musescoreでmusicxmlでエクスポートする」

っていう方法でした。本質的には一番上の方法と変わらないんですがうまくいきました。たぶん、ファイルの形式をファインダーで手動でxmlからmusicxmlに変更するのがよくなかったのではないかと思ってます。
python で gRPC にふれてみた

公式で quick start が用意されていたので、実際に手を動かして試してみました。

https://grpc.io/docs/languages/python/quickstart/

## 環境構築

まずは gRPC を試す環境をつくります。

手元の環境:

- os: windows 10

```powershell
> python -m pip install virtualenv
> virtualenv venv
> .\venv\Scripts\activate.ps1
(venv) > python -m pip install --upgrade pip
```

gRPC をとツールをインストール

```powershell
(venv) > python -m pip install grpcio
(venv) > python -m pip install grpcio-tools
```

## サービスを定義

gRPC の最初のステップはサービス定義です。リクエストとレスポンスを書いていきます。

```proto:hello.proto
syntax = "proto3";

package hello;

service Hello {
  rpc SayHello (HelloRequest) returns (HelloReply) {}

}

message HelloRequest {
  string name = 1;
}

message HelloReply {
  string message = 1;
}
```

## クライアントとサーバサイドのコード生成

``.proto``ファイルからクライアントとサーバのインターフェースのコードが生成できます。

```powershell
(venv) > cd src/hello
(venv) > python -m grpc_tools.protoc -I../../protos --python_out=. --grpc_python_out=. ../../protos/hello.proto
```

上記のコマンドを実行すると、以下のコードが生成されます。

- hello_pb2_grpc.py
- hello_pb2.py

``hello_pb2_grpc.py``は RPC を実行するときに使用されて、``hello_pb2.py``はリクエストとレスポンスのインターフェースとして使用されている感じ（ただのイメージ。ここらへんはもう少しさわってみて確認してみる）。

## サーバ側のコードを作成

quick start のコードを真似して作成。``python hello_server.py``を実行するとサーバとして起動されます。

```python:hello_server.py
from concurrent import futures
import logging

import grpc

import hello_pb2
import hello_pb2_grpc

class Hello(hello_pb2_grpc.HelloServicer):

    def SayHello(self, request, context):
        return hello_pb2.HelloReply(message='Hello, %s!' % request.name)

def serve():
    server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
    hello_pb2_grpc.add_HelloServicer_to_server(Hello(), server)
    server.add_insecure_port('[::]:50051')
    server.start()
    server.wait_for_termination()

if __name__ == '__main__':
    logging.basicConfig()
    serve()
```

## クライアント側のコード作成

サービスメソッドを呼び出すためにスタブを作成します。スタブと呼ぶあたり疎結合システム、マイクロサービスと相性が良さそうです。

```python:hello_client.py
import logging

import grpc

import hello_pb2
import hello_pb2_grpc

def run():
    with grpc.insecure_channel('localhost:50051') as channel:
        stub = hello_pb2_grpc.HelloStub(channel)
        response = stub.SayHello(hello_pb2.HelloRequest(name='you'))
    print("Greeter client received: " + response.message)

if __name__ == '__main__':
    logging.basicConfig()
    run()
```

## 実行

gRPC の動作を確認するだけなら以上のコードだけで十分です。
まずはサーバ側のコードを実行します。

```powershell
(venv) > hello_server.py
```

別のターミナルを立ち上げて、クライアント側のコードを実行します。

```powershell
(venv) > hello_client.py
Greeter client received: Hello, you!
```

REST な API に慣れていたので gRPC のような API の呼び出しは中々理解できませんしたが、実際に手を動かして実装することによって大雑把にですが理解できるようになりました。

gRPC にはリクエストとレスポンスに stream 形式も扱えるらしいので、次はここら辺を試してみます。
Windows ChromeのCookieを10行で復号する

# TL;DR
```python
import json, sqlite3
from base64 import b64decode
from os.path import expandvars
from win32.win32crypt import CryptUnprotectData # pip install pywin32
from Cryptodome.Cipher.AES import new, MODE_GCM # pip install pycryptodomex

db = expandvars('%LOCALAPPDATA%/Google/Chrome/User Data/Default/Cookies')

key = CryptUnprotectData(b64decode(json.load(open(f'{db}/../../Local State'))['os_crypt']['encrypted_key'])[5:])[1]

conn = sqlite3.connect(db)
conn.create_function('decrypt', 1, lambda v: new(key, MODE_GCM, v[3:15]).decrypt(v[15:-16]).decode())
print(dict(conn.execute("SELECT name, decrypt(encrypted_value) FROM cookies")))
```

出力

```javascript
{'NID': '219=SQ2s60nIXcSZo3sE==', 'freeform': 'cookieFooVal', 'key': 'value'}
```

# 復号に必要なキーを取得する
**%LOCALAPPDATA%/Google/Chrome/User Data/Local State** のencrypted_keyからキーを復号します。
先頭5バイト('DPAPI')は、除去します。

```python
key = CryptUnprotectData(b64decode(json.load(open(f'{db}/../../Local State'))['os_crypt']['encrypted_key'])[5:])[1]
```

# nonceで暗号化された値を復号する
**encrypted_value** カラムの先頭3バイト('v10')を除去し、15バイト目までをnonceとします。
後ろの16バイトは、検証用タグなので取り除き複合します。

```python
conn.create_function('decrypt', 1, lambda v: new(key, MODE_GCM, v[3:15]).decrypt(v[15:-16]).decode())
```

使いやすく、関数にまとめました。
https://gist.github.com/GitHub30/427b0474008234d449acefb216a4a833

SQLにWHEREを追加をすることで任意のCookieを絞り込めます。

```python
print(dict(conn.execute("SELECT name, decrypt(encrypted_value) FROM cookies")))
```

# 参考

https://qiita.com/taizan_hokuto/items/bff1a1ccd65655e1c386

https://gist.github.com/GramThanos/ff2c42bb961b68e7cc197d6685e06f10

https://stackoverflow.com/questions/60416350/chrome-80-how-to-decode-cookies

https://www.geeksforgeeks.org/how-to-extract-chrome-passwords-in-python/
HTML 基礎　Part2

#HTMLの記述方法

&lt;br&gt;と記述したい時でも普通に&lt;br&gt;と書いてもタグとして
扱われ、反映されません。その時のために使われるのが、文字実態参照です。

<　←この不等号を作るために&とltとセミコロンを使います。
　>　←反対にこの不等号を作るために&とgtとセミコロンを使いましょう。
これらで挟むことにより、使えるようになります。

複数のタグを同時に編集する時はcommand + Dを使うことで同時に編集
することができます。

## preタグ

preタグは改行や字下げが潰れてしまっていることがあります。
それを修正するために使います。


#リストの種類

3種類あって、箇条書きリスト、順序付きリスト、説明リストになります。

・箇条書きリスト
ul = unordered listと言います。
全体を&lt;ul&gt;で囲み、それぞれのリストを&lt;li&gt;で囲みます。
順番を変えても大丈夫なリストに使います。

・順序付きリスト
ol = ordered listで表します。
全体を&lt;ol&gt;で囲み、リストを&lt;li&gt;で囲みます。

・説明付きリスト
dl = description listで表します。
全体を&lt;dl&gt;で囲み、項目はdt（description term)、説明はdt(description detail)で
表します。

#表の記述

表を作る時はまず全体をtableタグで囲みます。
見出しは&lt;thead&gt;で囲み、本文を&lt;tbody&gt;で囲みます。
theadとはtable headの略で、tbodyはtable bodyの略です。

それぞれの行のタグにはtr(table row)を使います。
見出しのセルはth(table header cell)を使います。


#リンク

リンクを表すにはaタグを使います。リンクの飛び先はhref属性で表して下さい。
同じタブで開きたくない時は属性にtargetで属性値に_blankを書くようにして下さい。

また、同じページ内にリンクを貼る時はhrefの属性値に#名前を使います。
そして、飛ばしたい見出しにid属性を使い、#と同じ名前を使います。
ですが、先頭に戻りたい時は#だけを使うか#topを使うかのどちらかを使います。

#区切りを表すタグ

・　headerタグ　　　導入的なコンテンツで使います。
・　footerタグ 　　　締めくくりのコンテンツで使います。
・　navタグ    　　　　ナビゲーション
・　asideタグ  　　　関連性が薄いコンテンツ
・　articleタグ　　　記事/独立したコンテンツ
・　mainタグ  　　　主要なコンテンツ
・　sectionタグ 　　凡用的に使える区切り
・　divタグ　　　　特定の範囲を指定したい時
・　span      　　　　　一部にだけ指定したい時

時間を表す時はtimeタグを使って下さい。
またdatetime属性で時間を指定するとなお良いでしょう。

#その他

もしHTMLで分からないことがある時はMDNを見てみましょう。

#最後に

初心者ですので、拙い文章や書き方だと思いますが、最後まで見て頂き
ありがとうございました。もし、ご指摘等がございましたらよろしくお願い致します。
参考書「Go言語ハンズオン」go.mod file not foundのエラー

「Go言語ハンズオン」という参考書のSection4-1をやっています。
https://www.amazon.co.jp/dp/B08XYQ1RS3

## エラー内容
goバージョン 1.16.6

```sh:zsh
$ go run hello.go
hello.go:4:3: no required module provides package fyne.io/fyne/app: go.mod file not found in current directory or any parent directory; see 'go help modules'
hello.go:5:3: no required module provides package fyne.io/fyne/widget: go.mod file not found in current directory or any parent directory; see 'go help modules'
```

```go:hello.go
package main

import (
  "fyne.io/fyne/app"
  "fyne.io/fyne/widget"
)

func main() {
  a := app.New()

  w := a.NewWindow("Hello")
  w.SetContent(
    widget.NewLabel("Hello Fyne!"),
  )

  w.ShowAndRun()
}
```

## 解決方法
Go1.11バージョン以降追加された機能の”Goモジュール”でパッケージ管理が必要みたいです。
その前に、僕はmacOSパッケージインストーラでGUIでGoをインストールしたのですが、goenvを使ってGoをインストールし直しました。

### GUIで入れたGoをアンインストール
参考記事 https://qiita.com/Nekonecode/items/8561bbe27830090bc70c

```sh:zsh
$ sudo rm -rf /usr/local/go
$ sudo rm -rf /etc/paths.d/go
```

### goenvでGoを再インストール
参考記事 https://github.com/syndbg/goenv/blob/master/INSTALL.md

```sh:zsh
$ git clone https://github.com/syndbg/goenv.git ~/.goenv
```

```text:.zshrc
export GOENV_ROOT="$HOME/.goenv"
export PATH="$GOENV_ROOT/bin:$PATH"
eval "$(goenv init -)"
export PATH="$GOROOT/bin:$PATH"
export PATH="$PATH:$GOPATH/bin"
```

```sh:zsh
$ exec $SHELL
$ goenv install -l
$ goenv install 1.16.6
$ goenv global 1.16.6
$ go version
```

### Goモジュールの管理下に
参考記事 https://qiita.com/Syoitu/items/f221b52231703cebe8ff

```sh:zsh
$ go env -w GO111MODULE=on
```

```sh:zsh
# hello.goと同じ階層で
$ go mod init hello
$ go get -u fyne.io/fyne
$ go mod tidy
$ go run hello.go
```
WSL2でGitKrakenを使うまで

## はじめに

windowsでWeb開発をする場合、WSL2+VSCodeを使うと便利です。
ただ、Git周りはやはりGUIを使いたい、という思いはあるかと思います。
LinuxのGUIクライアントはいくつかありますが、今回はGitKrakenを使う方法を忘備録として記載します。

## 必要なツール

* X410(有料)
    * https://x410.dev/
* GitKraken(有料)
    * https://www.gitkraken.com/


## WSL2のインストール

まず、WSLのインストールを実施します。
方法は様々なサイトで解説されているので、今回は省略します。

以下はMicrosoftの記事です。
[Windows 10 用 Windows Subsystem for Linux のインストール ガイド](https://docs.microsoft.com/ja-jp/windows/wsl/install-win10)

Ubuntuが動作するところまで確認してください。
今回はUbuntu 20.04 LTS前提で話を進めます。

また、注意点として**WSL2で動いていることを必ず確認**してください。

```shell
User> wsl --list --verbose
  NAME            STATE           VERSION
* Ubuntu-20.04    Running         2
```

上記コマンドの結果のVERSIONが1の場合、以降の説明通りに実施してもうまくいきません。
必ずVERSIONが2であることを確認して下さい。

## X410の設定

以下の記事の「Enable 'Allow Public Access' option in X410」のみ設定してください。

[Using X410 with WSL2](https://x410.dev/cookbook/wsl/using-x410-with-wsl2/)

.bashrcに以下の行を追加します。

```bash
export DISPLAY=$(cat /etc/resolv.conf | grep nameserver | awk '{print $2; exit;}'):0.0
```

ターミナルを再起動して、以下のコマンドを実行してください。

```shell
$ xeyes &
```

![Snag_181ff6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192873/3a130715-c4a9-20c6-341c-ae0977cc55a5.png)


目玉のアプリが起動すればOKです。

もし、アプリが起動しない場合、以下の記事の「How do I check if my WSL2 is ready for X410?」を参考に動作確認をお願いします。

[Using X410 with WSL2](https://x410.dev/cookbook/wsl/using-x410-with-wsl2/)

もし、上記方法で動作確認がうまくいかない場合、X410が起動しているかどうかを確認して下さい。
起動しているかどうかはwindowsの右下のアイコン一覧から確認できます。

![Snag_1ade2c.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192873/adaa3c63-1579-072a-7b6e-ecb625b53716.png)

## GitKrakenのインストール

```shell
$ wget https://release.gitkraken.com/linux/gitkraken-amd64.deb
$ sudo dpkg -i gitkraken-amd64.deb
```

恐らくエラーになると思うので、以下のコマンドを実行してください。

```shell
$ sudo apt --fix-broken install
```

再度以下のコマンドを実行します。

```shell
$ sudo dpkg -i gitkraken-amd64.deb
```


以下のコマンドを実行してバージョンが表示されることを確認して下さい。

```shell
$  gitkraken -v
```

以下のコマンドを実行するとGitKrakenが起動すると思います。
起動しない場合は、X410が起動しているかを確認して下さい。

![Snag_25d2bd.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192873/2102b0c3-1604-20d8-ba7d-fc25e25796e0.png)


## 終わりに

WSL2とVSCodeの連携でWindowsでも比較的簡単にWeb開発ができるようになりました。
今回の方法でGUIのアプリを使うこともできるので、より開発の幅が広がるかと思います。
少しでも、参考になれば幸いです。

## 参考サイト

* [【Windows10/WSL2 Ubuntu 20.04 LTS】X Serverアプリを実行する（Emacs GUI版を試す）](https://www.yokoweb.net/2020/06/12/windows10-wsl2-xserver-x410-emacs/)
* [How to Install GitKraken Git GUI](https://support.gitkraken.com/how-to-install/)
UE4の Pixel2D買ってみたよ (Part7.2) 遠距離攻撃　続き

Creating 2D games with Unreal Engine using Pixel 2D - Part 7.2 - Ranged Attack Continued

https://www.youtube.com/watch?v=TTgJk2JPpJQ&list=PLSHq8CaNTAqDalhMyicUJPDH4v8RDXz86&index=9

というわけでチュートリアルをちまちまと進めれるときにやっていってみるよー。
やっぱり触ってみるとわからないこと出てくるよね。

#飛び道具を作る(00:00)

![7.2.1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270619/4b82f559-c7bc-ec9f-c479-2862d6f0327a.png)

こんな右クリックで適当に追加して図のようにつなげる
![7.2.2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270619/6cfebdf1-001c-811c-23c8-1a4694285dd1.png)

値を直接入れても動くけどいじれなくなるので変数を作ってこんな感じにする
（発生場所のオブジェクトは別途作成しておく必要あり。）
![7.2.2a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270619/db542fdb-c882-134d-4a0d-4dcb2f3a98b1.png)


発生場所のオブジェクトはこんな感じで作る。
![7.2.3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270619/93ab5436-fcf2-e734-4edc-2bec965aec07.png)

#矢を作るよ(10:00)

右クリックブループリントの追加から
![7.2.4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270619/7d3f2a0c-7be7-fc54-4ae5-8a97183261d8.png)

開くとここら辺の設定ができる。説明があるのはこの３か所。
![2021-07-18_14h47_56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270619/b25cf1c2-6fc2-be85-0f19-2601e22d0d49.png)

![2021-07-18_14h47_56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270619/a4449df9-3d43-9ff5-243f-e4460da45a18.png)

#球が発射できるよ(15:00)
という感じでKeyを押したら球が出るはずだが出ない
その場合は「玉の速さ」「Distance」の値を調整
![2021-07-18_23h51_16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270619/b203329c-e5f7-80da-7256-03d91861e2d0.png)

#アニメーションが変だからArrowの時はこれを使うといいよ(18:00)
特に詳しい説明はないけどこれ使うと壁に刺さったときとかいい感じになるよ、とのこと
[BP Projectile Arrow]
![7.2.5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270619/23f04951-81b2-07af-34b3-5a36db0611c8.png)

#次回は(21:00)
敵の追加だよ！
２６分まで動画あるけど真っ暗になって終わったやん！
次回ぽいと思ったら次はアニメーションのものをやってて得に追加されていないみたいだな・・
WSL2の理解度を深める、Ubuntu と Docker Desktop とコンテナ の知見（その４／４）


その１　https://qiita.com/ssugimoto/items/668d33e4b151933b2e19
その２　https://qiita.com/ssugimoto/items/1b19083f5045e190e4ae
その３　https://qiita.com/ssugimoto/items/3b4a26711604bb6d56d2
その４　この記事

## Docker Desktop for Windowsとwsl2 の関係や設定

### wsl2 側
- wsl2として、dockerのバックエンド側を docker-desktopを使うようにしている場合（wsl2 Ubuntuをインストールしていない、またはwsl2としてdocker-dektopを使うようにしている場合） や
- マイクロソフトストアから wsl2 Ubuntuはインストールせずに、wsl2をインストールした後に `Docker Desktop for Windows`のみインストールした場合は`wsl -l -v`の結果でUbuntuの行はなく、docker-desktop がデフォルトです。

`wsl -l -v` コマンドにて確認
wsl2 Ubuntu をインストールしていない場合は、その行は表示されず、Docker Desktop for Windowsを入れていれば、docker-desktopに `*` がつく

```bat
>wsl -l -v
  NAME                   STATE           VERSION
  docker-desktop-data    Running         2
* docker-desktop         Running         2
```


wsl2 Ubuntu-XX をインストールし wsl2 として Ubuntu-XX を使うようにしている場合（おそらく多くの人はこの状態）

```bat
>wsl -l -v
  NAME                   STATE           VERSION
* Ubuntu-20.04           Running         2
  docker-desktop-data    Running         2
  docker-desktop         Running         2
```
`*` がどこに付くかにより変わる。上記はwsl2のwslconfig として Ubuntu-20.04 をデフォルトにしている。

### Docker Desktop側
- docker-desktopとして、wsl2を使うかどうかの設定は、 General -> `use the WSL 2 based engine` がチェックONだと、wsl2としてdocker-desktop使う設定です
    - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1482752/c457bc6f-95c9-4c58-d0c3-abda018c863c.png)

- 他の項目の設定、Docker Desktop for Windowsのデフォルト設定ではwsl2 Ubuntuとwindows内のdocker desktopは連携しない。
    - Settings  Resources -> WSL Integration で  `Enable integration with my default WSL distro`  はチェックON、`Ubuntu-XX`等のLinuxディストリビューションはチェック・オフ
![11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1482752/a8b00d68-1ef0-be6a-399d-338c5f98d808.png)


上記の `wsl -l -v` の結果で、「`* docker-desktop`」の状態で、WindowsでDocker desktopを動かし、Windows内の任意のディレクトリに、コンテナ用のファイルを置き、docker run や docker-composeで起動すれば、Docker Desktop for Windowsがコンテナを動かしている状況になります。（Docker Desktop for mac を使うときや、Linuxでdockerコンテナ使うときと同じ）

また、（[その３](https://qiita.com/ssugimoto/items/3b4a26711604bb6d56d2)）にて記載の通り、コンテナ用のファイルとして、リモートコンテナのファイルを置けばVSCodeのリモートコンテナを使うことできる。VSCodeのリモートコンテナを使う場合にwsl2 Ubuntuはインストールしていなくても良い(言い換えると、Docker desktop の Settings  Resources -> WSL Integration でLinuxディストリビューションは何もなくても良いし、既にインストールしているならば Ubuntu-XX をオフにしても良い)

### 参考
Dockerの公式ドキュメント
https://docs.docker.com/docker-for-windows/wsl/
Djangoでアプリのひながたを作るまでをまとめてみた

#Djangoのプロジェクトを作る流れ

<h2>環境</h2>
<ul>
<li>anaconda</li>
<li>Windows10</li>
<li>Django==3.1.2</li>
</ul>

##フォルダを作成（やらなくてもいい）

エクスプローラー上でフォルダを作成する。その後、作ったファイルのフォルダ内に移動する。
この工程は、他のファイルと混同させないように行っているので、しなくても可。

##新しいプロジェクトの作成
`django-admin startproject 《作成したいプロジェクト名》`
環境内にいないとDjangoが入ってないとエラーされるので注意。Anacondaの方はconda activate <環境名>で移動。
`cd 《作成したプロジェクト名》`を行う。

##プロジェクトにアプリケーションを作成
`python manage.py startapp 《作成したいアプリケーション名》`

##マイグレーションファイルの作成
`python manage.py migrate`