OmniAICreator/Qiita-1.07M huggingface dataset:
もう逃げない。基礎から学ぶDocker入門 / Docker Composeのよく使う基本操作（7/9）

## はじめに

今まで、全然理解できていなくて逃げてたDockerに関して、しっかり理解していこうと思います。

https://www.docker.com/

コレまで、便利なんだろうなと思いながらも、逃げてました。

なので、開発環境では使いこなせるスキルにまでは理解したいと思います。

あと、暗記してたDockerコマンドを１つ１つ理解していきます。

以下のような順番で勉強していきます。

- [Dockerの概要（1/9）](https://qiita.com/ryosuketter/items/d7833182dced67713d27)
- [Dockerの基本操作（イメージの作成, コンテナの起動, 停止, 削除）（2/9）
](https://qiita.com/ryosuketter/items/c53352f1143366d8b9a9)
- [Dockerの基本操作（ログの出力, コンテナの中でプロセスを実行する方法, 使用していない Docker オブジェクトの削除）（3/9）](https://qiita.com/ryosuketter/items/5fd73b7311175a691dfe)
- [Dockerfileを使用したサーバー構築（座学編）（4/9）](https://qiita.com/ryosuketter/items/d9c3420be7da586225e8)
- [Dockerfileを使用したサーバー構築（実践編）（5/9）](https://qiita.com/ryosuketter/items/716a4c5e49795d494600)
- [Docker Composeの概要（座学編）（6/9）](https://qiita.com/ryosuketter/items/104a4eb38f8824eb6de9)
- [Docker Composeのよく使う基本操作（7/9）](https://qiita.com/ryosuketter/items/8bbd2c60392f443cfe23) :point_left_tone1: 今ここ
- [Docker Composeを使ってRailsの環境を構築する（8/9）](https://qiita.com/ryosuketter/items/91cd107794c1cbe358c6)
- [Docker上に構築したRailsをHeroku（本番環境）にデプロイ（公開）する（9/9）](https://qiita.com/ryosuketter/items/e3e68ce6ec572dc8905e)

## Docker Composeのよく使うコマンド一覧

前回紹介した Docker Composeの定義ファイルであるdocker-compose.ymlによってコンテナを作成した後の

それ、または、それらの操作方法について紹介していきたいと思います。

基本的な操作はDockerの時と同じです。

### イメージのビルド

```bash
docker-compose build
```

これで、イメージがビルドされます。

### コンテナの作成と起動

```bash
docker-compose up -d
```

`-d` : バックグラウンドで実行できます（デタッチド・モード）。

### コンテナを停止・削除

```bash
docker-compose down
```

### コンテナの一覧を表示

```bash
docker-compose ps
```

コンテナの一覧を表示してくれます。

### ログを表示

```bash
docker-compose logs
```

### コンテナを作成してコマンドを実行

```bash
docker-compose run <サービス名> <コマンド>
```

コンテナを作成して、コマンドを実行するやつです。

### 起動中のコンテナにコマンドを実行

```bash
docker-compose exec <サービス名> <コマンド>
```

`docker-compose run`に対して、こちらは、起動中のコンテナに対してコマンドを実行するやつです。

----

以上です。

これで、Docker Composeのよく使う操作方法の説明はおしまいです。

次回は、Docker Composeを使って、Railsの環境を構築したいと思います。

## アウトプット100本ノック実施中

https://qiita.com/ryosuketter/items/713474dbd009870e4103
Laravel8でページネーションを作る

#はじめに#
　ページネーションとは、ECサイトの商品件数や掲示板のコメントなど件数が多い場合に、一気に表示させるのではなく、ページ遷移を行うことで数件〜数十件ずつ取得していく手法のことです。

　Laravelでは簡単にページネーションを実装することができます。

#paginateメソッド#
　paginateメソッドを使うことで、１ページに表示したい件数を取得することができます。

・Eloquentを使用する場合

```controller.php
 $products = Product::paginate(15);
```

・クエリビルダを使用する場合

```controller.php
 $products = DB::table('products')->paginate(15);
```

これで１５件ずつデータを取得することができます。


#viewファイルにリンクを記載#
　次に、viewファイルにリンクを記載します。

```php:view.blade.php
@foreach($products as $product)
    <p>{{ $product->name }}</p>
@endforeach

{{ $products->links() }}
```

これでリンクが出来上がりました！

#ページネーション用ファイルの設置#
　まずは下記のコマンド入力をしてください。

```
php artisan vendor:publish --tag=laravel-pagination
```

これで、resources/views/vendor/paginationディレクトリの中にページネーション用ファイルが作成されます。

#Bootstrapの設定#
　Laravel8ではTailwindがデフォルトの設定になっているので、この時点ではデザインが崩れています。解消するには設定をBootstrapに変える必要があります。

app\Providers\AppServiceProvider.phpをこのように編集してください。

```app\Providers\AppServiceProvider.php
<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use Illuminate\Pagination\Paginator;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        //
    }

    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        Paginator::useBootstrap();
    }
}

```

Illuminate\Pagination\Paginatorをuseして、boot()の中身でPaginator::useBootstrap();とします。

これでBootstrapが適用されて綺麗に表示されるようになります！
【Python】欲しいサイズの壁紙用画像をフォルダ内から取り出す

## はじめに
画像フォルダ内に種々雑多の形の画像があって，PC用やスマホ用の壁紙を探すのにちょっとした手間を感じたことはありませんか？求める条件の画像を選び出す簡単なプログラムを今回は書きました。

## 使うサードパーティーパッケージ
* OpenCV

画像処理をあれこれするためのオープンソースライブラリ。
各動作環境に合わせてインストールしてください。

## 実際のプログラム

```python
import cv2
import sys
import shutil
from pathlib import Path

# 絶対パスで入力する
target_dir = Path(sys.argv[1])
save_dir = Path(sys.argv[2])

# もし保存用ディレクトリが無かったら作成しておく
if not save_dir.exists():
    save_dir.mkdir()

# 条件にマッチする画像ファイルをリストに追加
# 今回はPC用の画像
target_pic_list = []
for pic_path in target_dir.glob('*.jpeg'):
    try:
        pic = cv2.imread(str(pic_path))
        vert_pixel, hori_pixel = pic.shape[0], pic.shape[1]
        ratio = hori_pixel/vert_pixel
    except:
        continue
    
    if (1.6 < ratio < 1.8):
        target_pic_list.append(pic_path)


# リスト内の画像を保存用ディレクトリにコピー
for pic_path in target_pic_list:
    pic_name = pic_path.name
    shutil.copy(pic_path, save_dir/pic_name)
```

コマンドライン引数として検索対象のディレクトリと保存用のディレクトリを絶対パスで与えています。そして検索対象ディレクトリ内の画像をOpenCVによって読み取り，画像の縦横のピクセルを取得します。それを条件文で処理して，欲しい画像の形状や画質を指定し，保存用のディレクトリへとコピーするというのが全体の流れです。


プログラムの簡単な解説をします。
今回はディレクトリ操作のために```Path```オブジェクトを利用しています。
glob()メソッドにより，正規表現に似たような記法でディレクトリ内のファイルをジェネレーターとして取得することができます。

```python
# 今回はjpegファイルを指定
for pic_path in target_dir.glob('*.jpeg'):
```

そしてOpenCVで各画像を読み込みます

```python
# Pathオブジェクトは受け取れないのでstr()で文字列に直している
pic = cv2.imread(str(pic_path))
```

shapeプロパティには，タプルで（縦のピクセル，横のピクセル，画像の色のチャンネル数）が入っています。
例えば以下のkuma.pngについて，
![kuma.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/632453/e32328f2-4028-7da4-0b11-bc874d1d51b9.png "kuma.png")

```python
pic = cv2.imread('kuma.png')
print(pic.shape)

# (384,512,3)
```

この情報をもとに条件文を記述して画像を選択します。
今回はPCモニターの横と縦の比（だいたい1.6〜1.8）に合うような条件としました。
高画質の画像のみ欲しい場合には縦横どっちかのピクセルに下限を与えてもいいかもしれないですね。

```python
    vert_pixel, hori_pixel = pic.shape[0], pic.shape[1]
    ratio = hori_pixel/vert_pixel
    if (1.6 < ratio < 1.8):
        target_pic_list.append(pic_path)
```

最後に条件を通過した画像をコピーします。
ここで簡単にPathオブジェクトについて説明します。
Pathオブジェクトはnameプロパティでファイル名（かディレクトリ名）を取得できます。

```python
p = Path('/hoge/fuga/foo/bar.txt')
print(p.name)

# bar.txt
```

またPathオブジェクト同士（または文字列）を```/```で区切ることで新たなPathオブジェクトを作成できることを利用しています。これがPathオブジェクトの便利な点ですね。

```python
p1 = Path('/hoge/fuga')
p2 = Path('foo/bar.txt')

p1 / p2 
# （macの場合）PosixPath('/hoge/fuga/foo/bar.txt')

p1 / 'foo/bar.txt'
# （macの場合）PosixPath('/hoge/fuga/foo/bar.txt')
```

これらをもとに保存先のパスを作成し，shutil.copy()メソッドでコピーしています。

```python
for pic_path in target_pic_list:
    pic_name = pic_path.name
    shutil.copy(pic_path, save_dir/pic_name)
```

## まとめ
OpenCVやshutil，pathlib.Pathなどのツールを使って（そこそこ）便利なツールを作れたと思います。（僕自身そうですが）初心者の方のライブラリの勉強になるかもですね。


## 参考にさせていただいた記事
[【Python】OpenCVによる画像の画素へのアクセスと切り取り (初心者向け)](https://qiita.com/sino20023/items/ec7e0ac77547f3b6484b)
Python3エンジニア認定基礎試験合格に向けて

機械学習やAIの話題が流行する中で、本屋に行くとPythonのテキストも充実していることをよく目にすると思います。
シンプルなコードで機械学習を実践できる内容が紹介されているのでPythonの学習開始する方も多くいるのではと感じています。
私自身もそのように感じる中で、Pythonのスキル認定を取りたいと思い学習して合格しました。
合格までので学習方法やノウハウなど、これから受験される方の参考になればと思い投稿することにしました。

Python3エンジニア認定基礎試験　試験概要
https://www.pythonic-exam.com/exam/basic
受験場所：全国にあるテストセンター
試験内容：CBT方式 40問 1000点満点（合格ライン700点）
参考テキスト：Pythonチュートリアル（O’REILLYから出版）
模擬試験：PRIME STUDY、DIVE INTO EXAM

この記事では、コードの内容（if、for、クラス）などは説明はないです。
あくまでも学習してコードを理解して定着、合格までの私の方法を参考にしてもらえればと思います。

まず参考テキストのPythonチュートリアルを準備しましょう。
こちらはAMAZONでも購入できるし本屋に行けば買うことができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555481/499db388-dacc-f230-4c61-25a4c17d2def.png)

続いて模擬試験の確認
■PRIME STUDY
https://study.prime-strategy.co.jp/
メールで採点内容を確認できる

■DIVE INTO EXAM
https://diver.diveintocode.jp/dive_into_exam#exam_list
終了後に採点内容を確認できる

無料で何回も受けることができるのと採点内容を確認できるのがいいです。
どちらでも満点をとれるくらいにしましょう。出題されている問題範囲を
テキストで確認して蛍光ペンでマークすると覚えやすかったです。

正誤問題は覚えるしかない（ある程度時間が必要）ですが、コードの出力結果の問題はJupyterNotebook等にコードをコピーして実行確認するのがいいです。
余裕があれば変数など書き換えて理解を深めるのがおすすめです。

これを繰り返して自信をつけて受験しましょう

最後に
Pythonってなに？とかこれから勉強してもできる？とか考えている方には参考にしていただいて興味を持ったきっかけを無駄にせず合格できるまでトライしてみてはいかがでしょうか。
人生が変わるきっかけ（私自身も）になれば幸いです。
【RxSwift】RxSwift Traitsを知る

#はじめに
今回は、Single, Completable, Maybeについてまとめます。いわゆる、RxSwift Traitsと呼ばれるものですね。

#Single
Singleは値またはエラーのいずれか一方を返す（流す）ことが保証されているObservableのようなものです。
使う場面の例としては、
・APIから値を要求し、取得する
・DBから値を取得する
・画像が読み込まれたときに、操作する
などなど

```swift
func readAll() -> Single<[Record]> {
    return Single.create { observer in
        if isSuccess {
            observer(.success(records))
        } else {
            observer(.failure(error))
        }
    }
    return .just(dataStore.readAll())
}
```

さらに、純粋なObservableは`.asSingle()`を用いることで変換できます。

#Completable
Completableはエラーまたは完了を流すことが保証されています。
`Observable<Void>`と同値です。
使う場面の例としては、
・DBに値を保存するなど、操作後に値の返却をする必要がないとき
・ログイン処理
・Twitterに投稿など

```swift
func login(email: String,
           password: String) -> Completable {
    return Completable.create { observer in
        self.dataStore.login(email: email,
                             password: password) { result in
            switch result {
                case .success:
                    return observer(.completed)
                case .failure(let error):
                    return observer(.error(error))
            }
        }
        return Disposables.create()
    }
}
```

Single同様に、純粋なObservableは`asCompletable`を使うことでCompletableに変換できます。
さらに、Completableで完了を表すには`Completable.empty()`を使います。


#Maybe
Maybe = Completable + Singleというイメージです。値、完了、エラーを流します。

```swift
func generateString() -> Maybe<String> {
    return Maybe<String>.create { maybe in
        maybe(.success("RxSwift"))
        maybe(.completed)
        maybe(.error(error))
        return Disposables.create()
    }
}
```

使う場面の例としては、
・DBから取得した値を流すことが多い
・DB内に値があれば成功、なければ完了、エラー発生時は失敗、という3パターンで都合がいいため
さらに、純粋なObservableは`.asMaybe()`を用いることで変換できます。


#おわりに
RxSwiftたのし〜
AWSにおけるDBのパフォーマンス向上について

#はじめに
AWSにはNoSQLも含めて、様々なDBサービスが展開されています。
その中でも運用していく段階で、トラフィックの増大などによって上手くDBが機能しない場合があります。（DBへの受信リクエストの急増により、WEBサイトが表示されないなど）
そのような場合にスループットやIOPSを向上させることにより以上のような問題を解決できますが、具体的にどのような対処によりパフォーマンスが向上するのか、少しまとめてみたいと思います。

#そもそも
そもそもの話として、スループットならびにIOPSの詳細についてから入りたいと思います。
###スループット
スループットとは、「単位時間あたりの処理量」になります。
単位時間というところがポイントで、「○○あたり」という限定された範囲内の話です。
具体的には、一定時間内でどれだけデータ量を転送できたかを表し、単位としては「bps」、「kbps」などで、よくネットワーク機器などの性能表記に書かれていることが多いです。
###IOPS（Input/Output per second）
IOPSは「１秒あたりに処理できるI/O（読込・書込）アクセス数」になります。つまり、IOPSが高いと高速にデータの読み書きが可能という意味になります。
ハードディスクやSSDなどのストレージの性能指標として表されます。ちなみに、ハードディスクは物理的に１分あたりのディスクの回転数（RPM）に限界があるためIOPSが低く、SSDはIOPSが高いです。
読込性能はキャッシュレイヤの追加などにより改善されますが（キャッシュに乗る初回アクセスはIOPSの影響を受ける）、書込み処理（追加・更新・削除）はIOPSの影響を受けやすいです。

DBのパフォーマンスを向上させていくには、このIOPSとスループットを改善していく必要があります。
以下のケーススタディを考えてみました。

#ケーススタディA
アクセスの増加により、データベース（例えばRDS）が受信リクエストへの対処が追いつかなくなってしまい、WEBサイトがきちんと表示されない場合を考えてみます。
この場合、受信リクエスト＝つまり読み取り処理が増大したことによる障害のため、データベースの読み取りパフォーマンスを向上させる必要があります。対応としては以下が考えられると思います。

・リードレプリカを作成し、読み取りトラフィックをオフロードさせる。（→スループットの改善）
・キャッシュレイヤーを追加して、アクセスが集中しているクエリをキャッシュ処理することで、高速処理を実現し、データベース側への負荷を減少させる。（→スループットの改善）
・アタッチしているストレージのストレージタイプをIOPSの大きなものに変更することで、DB本体のI/O性能を向上させる。（→IOPSの改善）

#ケーススタディB
反対に、DBに対する書込み処理の増大により、DBの書込みパフォーマンスが低下している場合はどうでしょうか。
こちらは、以下のような対応が考えられると思います。

・EBSボリュームを追加し、RAID 0構成とする。（→IOPSの改善、スループットの改善）
・高パフォーマンスを実現できるストレージボリュームタイプ（プロビジョンドIOPSなど）に変更する。（→IOPSの改善）
・インスタンスタイプを変更する（EC2などにミドルウェアをホストしている場合）。（→IOPSの改善）　

#スループットとIOPSによるパフォーマンス最適化
以上のように、スループットやIOPSの改善によりパフォーマンスを向上できます。
ただ、スループットの大きいディスク（スループット最適化HDD）を選んだからといって、アプリのパフォーマンスが向上するとは限りません。例えば、ファイルサイズがあまり大きくない3~4KB程度のデータを頻繁に書込むようなケースの場合、IOPSが高くないと処理が追いつかず、結果としてパフォーマンスが低下してしまうので、スループットよりもIOPSを重視した方がパフォーマンスが上がりやすいです。
反対に、一度の書込みが数GB単位のような大きいサイズファイルのデータの場合、いくらIOPSが高くてもスループットが低いとデータ転送に時間がかかり、結果としてパフォーマンスが低下してしまうので、IOPSよりもスループットを重視した方がパフォーマンスが上がりやすいです。

#まとめ
DBのパフォーマンスを向上させるには、IOPSとスループットの２つの観点から改善を行なっていく必要があることがわかりました。
ケースに合わせて、最適なストレージタイプの選択やRAID構成を組んだり、リードレプリカやキャッシュレイヤを追加したりすることによって、アプリ全体のパフォーマンスを上げていく必要がありますね。
DBRE（Database Reliability Engineering）と言われているように、DBのパフォーマンスがアプリ全体のパフォーマンスに関わってくるんだなと痛感しました。
【UiPath】自然順ソート（Natural Sort Order）してみる

# はじめに

この投稿は、RPAツール「UiPath」での 実装例 について記事です。

# はじめに

この投稿は、RPAツール「UiPath」での **API呼び出し例** の記事です。

この記事は「UiPath Friends もくもく会 2021年9月開催 2021-09-25（土）9:00 - 12:00」で書きました。

https://uipath-friends.doorkeeper.jp/events/126209


# 自然順ソート（Natural Sort Order）とは

自然順ソートとは、数字部分の大小を良い感じに解釈してくれるソートのことです。
WindowsExplorerの「名前順の並び替え」は、この自然順ソートで表示されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154139/417aed5b-3b3d-7029-8a75-dc45a552ee05.png)

通常のソートとは違い、数字部分を自然に解釈してくれて、見やすくなっています。


# UiPathで自然順ソートする

上述の通り、通常のソートでは自然順になりません。

.NETでソートする場合、StrCmpLogicalW を使ってソートをするのが良くある方法ですが、
「shlwapi.dll」をインポートしないといけないため、ちょっと面倒です。

なので、InvokeCodeで実装してみます。
引数は「In/Out」で配列型を渡します。

``` VB
'// Argument
' aryIO

'// Function
Dim PartCompare As Func(Of String, String, Integer) = 
	Function(left As String, right As String) As Integer
		Dim x, y As Integer
		If Not(Integer.TryParse(left, x)) Then
			Return left.CompareTo(right)
		ElseIf Not(Integer.TryParse(right, y)) Then
			Return left.CompareTo(right)
		End If
		Return x.CompareTo(y)
	End Function

'// Function
Dim NaturalCompare As Func(Of String, String, Integer) = 
	Function(x As String, y As String) As Integer
		Dim table As New System.Collections.Generic.Dictionary(Of String, String())
		 If x = y Then
			 Return 0
		 End If
		 Dim x1, y1 As String()
		 If Not(table.TryGetValue(x, x1)) Then
		 	x1 = System.Text.RegularExpressions.Regex.Split(x.Replace(" ", ""), "([0-9]+)")
		 	table.Add(x, x1)
	 	End If
		 If Not(table.TryGetValue(y, y1)) Then
		 	y1 = System.Text.RegularExpressions.Regex.Split(y.Replace(" ", ""), "([0-9]+)")
		 	table.Add(y, y1)
	 	End If

		Dim i As Integer = 0
			While i < x1.Length AndAlso i < y1.Length
				 If x1(i) <> y1(i) Then
					 Return PartCompare(x1(i), y1(i))
				 End If
        	i += 1
    	End While
			
		If y1.Length > x1.Length Then
            Return 1
        Else If x1.Length > y1.Length Then
            Return -1
        Else
            Return 0
        End If
		Return 0
	End Function

'// Main
For idxA As Integer = 0 To UBound(aryIO) -1
	For idxB As Integer = idxA + 1 To UBound(aryIO)
		If NaturalCompare(aryIO(idxA), aryIO(idxB)) > 0 Then
			Dim wrk As String = aryIO(idxB)
			aryIO(idxB) = aryIO(idxA)
			aryIO(idxA) = wrk
		End If
	Next
Next
```

配列を受け取り、ループしながら前後で値を比較しています。
比較の際には、数値部分を切り出して桁数を合わせながら実施しています。

普通、.NETでソートを定義する場合は「IComparableインターフェース」を実装したクラスを「Array.Sortメソッド」に渡して処理しますが、UiPathではクラス定義が出来ないので、上記のように前後比較して並び替えています。


# 終わりに

いかがでしたでしょうか。実装時に役立てば幸いです。
この記事が参考になったら、 LGTMをお願いします。閲覧ありがとうございました。
Wiggle Trace のプロット方法

地震データなどの波形処理をしていると、観測記録をWiggle Traceで表示することが多いので、
そのプロット方法を考えてみた。

##コード
```py
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.collections import LineCollection, PolyCollection

nt=200 #sample 数
data=np.sin(np.linspace(0,10*np.pi,nt)) #今回はsin波をプロットする
data=np.asarray([data]*10)
amp=0.5 #プロット時の振幅のスケーリング

y=np.arange(nt)
xs_all=[]
xs_pos=[]
for i in range(len(data)):
    pos=data[i].copy()
    pos[pos<0.0]=0 #極性が正のデータ
    xs_pos.append(pos/data[i].max()*amp+i) #トレース毎にスケーリング
    xs_all.append(data[i]/data[i].max()*amp+i)
    
xs_pos=np.asarray(xs_pos)
xs_all=np.asarray(xs_all)

segs_all = np.zeros((data.shape[0],data.shape[1],  2))
segs_all[:, :, 0] = xs_all
segs_all[:, :, 1] = y

segs_pos = np.zeros((data.shape[0],data.shape[1],  2))
segs_pos[:, :, 0] = xs_pos
segs_pos[:, :, 1] = y
fig, ax = plt.subplots(figsize=(10,10))
#極性が正の部分は塗りつぶし
line_segments_pos = PolyCollection(segs_pos, linewidths=0,
                               facecolors='k',edgecolors='k',linestyle='solid')
#極性が負の部分は線だけ引く
line_segments_all = LineCollection(segs_all, color='k',linewidths=0.5,linestyle='solid')
ax.add_collection(line_segments_all)
ax.add_collection(line_segments_pos)
ax.set_xlim(xs_all.min()-0.5, xs_all.max()+0.5)
ax.set_ylim(y.max(), y.min())
ax.set_xlabel('Channel No')
ax.set_ylabel('Sample Number')
```

##結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1997363/593ca8c4-705f-435e-59b2-8fcdcad43419.png)

思ったようにできた。
matplotのCollectionを使うことで、for文より早くプロットできるようにしたことが工夫。
WSL2でサービスを起動するとUnable to register authentication agent: GDBus.Error:org.freedesktop.PolicyKit1.Error.Failedになる

#環境
WSL2 Ubuntu20.04


#問題のエラー

・最初に叩いたコマンドはこちら。
```
$ service apache2 restart

** (process:32041): WARNING **: 09:54:47.037: Unable to register authentication agent: GDBus.Error:org.freedesktop.PolicyKit1.Error.Failed: Cannot determine user of subject
Error registering authentication agent: GDBus.Error:org.freedesktop.PolicyKit1.Error.Failed: Cannot determine user of subject (polkit-error-quark, 0)
Failed to restart apache2.service: Interactive authentication required.
See system logs and 'systemctl status apache2.service' for details.
```

・よくわからなかったので、sudo で実行したら以下のようになりました。
```
$ sudo service apache2 start
Failed to retrieve unit state: Connection reset by peer
Warning! D-Bus connection terminated.
Failed to restart apache2.service: Connection reset by peer
See system logs and 'systemctl status apache2.service' for details.
```
以下、仮説です。（間違っているかもしれません）

＜意訳＞
unit(apache2のサーバーのこと)の状態取得に失敗しました。peer＝同じもの　をリセットしてください。
危険！：D-BUS（１台のコンピュータ上で動作する複数のプログラムの間で情報を交換するシステム。WSLのことかな？）の接続が終了しました！
apache2サービスの再起動に失敗しました。peer＝同じもの　をリセットしてください。
system logsを確認したり、ステータスを確認してください。

＜想定＞
peerとあるため、接続情報の何かがダブっているということではないか。
ちなみにコマンド 'systemctl status apache2.service'は同じエラーが出力されました。
ということで、再起動してみました。

```
$ sudo reboot
$ sudo service apache2 restart
Failed to connect to bus: Connection refused
Failed to connect to bus: Connection refused
```
エラー文が短くなって、嬉しいような悲しいような…。


#解決方法
意外とあっけなく解決しました。
```
C:\Users\ryo>wsl --shutdown
```
すなわち、コマンドプロンプト上でWSLをシャットダウンするだけです。実際に再度Ubuntuを起動したら、普通にコマンド通りました。
このコマンドは『魔法の呪文』のようなもので、とりあえず詰まったら実行してみるとよいみたいです。
WSL2、奥が深い！（？）

お世話になったサイト：[WSL2で困ったときに使う魔法の呪文](https://qiita.com/kotauchisunsun/items/8b1d879b8f682bb9d55a)
Unity 極力少ない労力で移動操作

### 極力少ない労力で。

```C#
using UnityEngine;
public class moveo : MonoBehaviour
{
    void Update()
    {
        //カメラをこのオブジェクトの下に加えると追従。
        float speed = 10.0f;
        float rotonce=15f;
        float tz = Input.GetAxis("Vertical") * speed * Time.deltaTime;
        float tx = Input.GetAxis("Horizontal") * speed * Time.deltaTime;
        float ry = Input.GetKey("space") ? rotonce : 0;
        //
        transform.Translate(tx, 0, tz);
        transform.Rotate(0, ry, 0);
    }
}
```

### ctr版
```C#

using UnityEngine;
public class CharMove : MonoBehaviour
{
    CharacterController ctr;
    void Start(){
#if !UNITY_WEBGL
        Application.targetFrameRate = 20;
#endif
        ctr = gameObject.GetComponent<CharacterController>();
        if(ctr==null){
            gameObject.AddComponent<CharacterController>();
            ctr = gameObject.GetComponent<CharacterController>();
            ctr.height = 0.9f;
            ctr.skinWidth = ctr.height * 0.1f;
            ctr.radius = 0.4f;
            ctr.stepOffset = ctr.radius * 0.1f;
            ctr.minMoveDistance = 0.001f;
            ctr.slopeLimit = 45f;
        }
        //ctr = gameObject.GetComponent<CharacterController>();
    }
    void Update()
    {
        //カメラをこのオブジェクトの下に加えると追従。
        float speed = 10.0f / 2;
        float rotspeed = 360f / 1;
        float gravity =9.8f;
        float ty = ctr.isGrounded?0:-1*gravity*gravity*Time.deltaTime;
        float tz = ctr.isGrounded?Input.GetAxis("Vertical") * speed * Time.deltaTime:0;
        float ry = ctr.isGrounded?Input.GetAxis("Horizontal") * rotspeed * Time.deltaTime:0;

        //transform.Translate(0, 0, tz);
        ctr.Move( transform.TransformDirection(0,ty,tz)); 
        transform.Rotate(0, ry, 0);

        if (Input.GetKeyDown("space")){
            transform.Round().RoundAngleY();
            //Debug.Log(ctr.isGrounded);
        }
    }
}//class

static class transformRoundExtension
{
    public static Transform Round(this Transform @this, bool yesX = true, bool yesY = false, bool yesZ = true)
    {
        var demi = 0.001f;//just 0.5 is upper;
        var p = @this.localPosition;
        var x = yesX ? Mathf.Round(p.x + demi) : p.x;
        var y = yesY ? Mathf.Round(p.y + demi) : p.y;
        var z = yesZ ? Mathf.Round(p.z + demi) : p.z;
        @this.localPosition = new Vector3(x, y, z);
        return @this;
    }
    public static Transform RoundAngleY(this Transform @this, float angle = 90)
    {
        var demi = angle / 2 + 0.001f;//just 0.5 is upper;
        var q = @this.localRotation.eulerAngles;
        var y = (int)(Mathf.Round(q.y + demi) / angle) * angle;
        @this.localRotation = Quaternion.Euler(q.x, y, q.z);
        return @this;
    }

}//class
```
最適な値はこのあたりに。

https://docs.unity3d.com/ja/2019.4/Manual/class-CharacterController.html
[Python]Playwrightを用いたE2Eテスト方法メモ

* ブラウザ自動操作ツールPlaywrightを用いたテスト方法についてメモする。

## 事前準備

* ライブラリ類インストール

  ```shell
  pip install playwright
  playwright install
  pip install pytest-playwright
  ```

* テストレポートツール`allure`インストール

  * 筆者はWindows環境を利用しているため、パッケージ管理ツール`scoop`を使用する。

    * `scoop`インストール方法は[こちら](https://qiita.com/rhene/items/d8a0c0c7d637904e14da)を参照。

    ```
    scoop install allure
    pip install allure-pytest
    ```

    

## テストコード

* `test.py`

  1. 「Playwright Python」でGoogle検索
  2. 検索結果に含まれるPlaywright-Python公式GitHubページにアクセス
  3. ページタイトルを検証

  ```python
  from playwright.sync_api import Playwright, sync_playwright, Page
  import allure
  
  
  @allure.title('「Playwright Python」でGoogle検索し、検索結果に含まれる公式GitHubページにアクセスする')
  def test_google(playwright: Playwright) -> None:
  
      browser = playwright.chromium.launch(headless=False)
      context = browser.new_context()
  
      page = context.new_page()
  
      page.goto("https://www.google.com")
  
      page.goto(
          "https://www.google.com/search?q=Playwright+Python&oq=Playwright+Python")
  
      # Click text=microsoft / playwright-python Public - GitHub
      page.click("text=microsoft / playwright-python Public - GitHub")
  
      # ページタイトル検証
      assert page.title() == "GitHub - microsoft/playwright-python: Python version of the Playwright testing and automation library."
  	# Close page
      page.close()
  
      # ---------------------
      context.close()
      browser.close()
  
  with sync_playwright() as playwright:
      test_google(playwright)
  
  ```

  

## 動作確認

1. テストコード実行

   ```shell
   pytest test.py --alluredir=allure_results
   =========================================================== test session starts =========================================================== 
   platform win32 -- Python 3.8.3, pytest-6.2.3, py-1.10.0, pluggy-0.13.1
   rootdir: C:\Users\user\Documents\dev\vscode\ws_git\e2e_test\playwright\test
   plugins: allure-pytest-2.9.43, anyio-3.2.1, asyncio-0.15.1, base-url-1.4.2, cov-2.11.1, playwright-0.2.0
   collected 1 item                                                                                                                            
   
   test.py .                                                                                                                            [100%] 
   
   =========================================================== 1 passed in 10.18s ============================================================
   ```

   

2. テスト結果確認（レポートページが起動する）

   ```shell
   allure serve allure_results
   ```

   ![allure_report.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/586535/9ccba9d9-fba8-ced8-28f3-43b35cc090c8.png)


   



## 参考情報

* [playwright-pythonを使ってE2Eテストを始める](https://zenn.dev/yusukeiwaki/articles/8e2b159a8d90bf)
WKWebViewで2種類の"_blank"に対応した件

# 対処法 
target="_blank" 
window.open({URL}, '_blank') 
の2種類

```swift
class MainViewController: UIViewController, WKUIDelegate, WKNavigationDelegate{
    
    //MARK:- LifeCycle
    override func viewDidLoad() {
        super.viewDidLoad()
        webView.uiDelegate = self // 追加
    }
    
    func webView(_ webView: WKWebView,
                 createWebViewWith configuration: WKWebViewConfiguration,
                 for navigationAction: WKNavigationAction,
                 windowFeatures: WKWindowFeatures) -> WKWebView? {
        // 変数 url にはリンク先のURLが入る
        if let url = navigationAction.request.url {
            let request = NSURLRequest(url: url)
            webView.load(request as URLRequest)
        }
        return nil
    }
}

```

delegateを設定する必要があり、
taget="_blank" のリンクを開こうとした時や window.open() の JavaScript が実行されるタイミングで発火する。


参考
[【Swift】WKWebViewで表示しているページのtaget=”_blank”のリンク先を開く方法](https://cpoint-lab.co.jp/article/202006/15624/)
数理人口学　稲葉寿先生　東京大学出版


```{r}

#p.228 7.1基本的なＳＩＲモデル　－－学習中
#SIRモデルを最小２乗法で解く

S=c(21,16,13,11,12,10,9)
I=c(0,3,5,3,5,6,2)
R=c(0,2,3,7,4,5,10)
N=21

S=S[length(S):1];I=I[length(I):1];R=R[length(R):1]

t=c(1,2,3,4,5,6)

mu=1
beta=1
r=1

SX=S[1:(length(S)-1)]
IX=I[1:(length(I)-1)]
RX=R[1:(length(R)-1)]

SY=S[2:(length(S))]
IY=I[2:(length(I))]
RY=R[2:(length(R))]

ite=10000
eta=0.00001

for(l in 1:ite){

b=mean(SY+SX*(mu+beta-1))  
dmu=2*sum(SX*(SY-(b-SX*(mu+beta-1))))+2*sum(RX*(RY-(-(mu-1)*RX+r*IX)))+2*sum(IX*(IY-IX*(SX*beta-(mu+r-1))))  
dbeta=2*sum(SX*(SY-(b-SX*(mu+beta-1))))+2*sum((-SX*IX)*(IY-IX*(SX*beta-(mu+r-1))))
dr=2*sum(-IX*(RY-(-(mu-1)*RX+r*IX)))+2*sum(IX*(IY-(SX*IX*beta-(mu+r-1)*IX)))

mu=mu-eta*dmu
beta=beta-eta*dbeta
r=r-eta*dr

cost=sum((SY-(b-SX*(mu+beta-1)))^2)+sum((IY-IX*(SX*beta-(mu+r-1)))^2)+sum((RY-(-(mu-1)*RX+r*IX))^2)

print(cost)

}

R0=beta*N/(r+mu)

#定常解E1(感染者のいない状態：DFSS)
print(paste0("Sが",round(b/mu,2),"でIが",0))

#定常解E2(伝染病が人口に定着して共存するエンデミックな状態：ESS)
print(paste0("Sが",round(N/R0,2),"でIが",round(mu*(R0-1)/beta,2)))



init=c(19,2,0)



```
Linuxでのbrewはまだ時期早々

# MacではBrew最高

[brew bundleでMacのアプリをまとめてインストール・管理](https://qiita.com/vochicong/items/f20afc89a6847cd58f0f)していたら、かなり[幸せ](https://qiita.com/vochicong/items/f20afc89a6847cd58f0f)になりました。

*****

# Linuxではどうか

Ubuntuのaptですんなりインストールできないツールが諸々

- Julia, Conda, Mamba
- VSCode, Chrome

***

# Linuxbrew

[Linuxbrew](https://docs.brew.sh/Homebrew-on-Linux) を試しました
- Julia インストール OK
- その他はだめでした (Conda, VSCode, Chrome)

***

# 結論

Linuxでアプリ管理をやるなら、今の所 BrewではなくAnsible かなという感じです。
MySQL メモ



##データベースの確認
```
SHOW DATABASES;
```

##データベースの作成
```
CREATE DATABASE データベース名;
```

##データベースへの接続
```
USE データベース名;
```

##テーブルの確認
```
SHOW TABLES;
```

##特定のデータベースのテーブル一覧
```
SHOW TABLES FROM データベース名;
```

##テーブルの作成
```
CREATE TABLE テーブル名 (カラム1 カラムの型1, カラム2 カラムの型2);

ex)CREATE TABLE test_table (id int, name varchar(10));

(test int NOT NULL) NULLを許可しない
(test int DEFAULT 5) デフォルトで5を格納する
(id int AUTO_INCREMENT) 1,2,3と自動的に値を格納する
(id int PRIMARY KEY)主キーとして設定し、重複を許可しない
(id int UNIQUE) 重複を許可しない
(FOREIGN KEY (カラム名)　REFERENCES 親テーブル(親テーブルの主キー); 
```

##データの追加
```
INSERT INTO テーブル名 VALUES (データ1, データ2);

カラムを指定する場合
INSERT INTO テーブル名 (カラム1, カラム2) VALUES (データ１, データ２);
```

##データの更新
```
UPDATE テーブル名 SET カラム1 = データ1, カラム2 = データ2;
```

##データの削除
```
DELETE FROM テーブル名 WHERE id = 10;
idが10のデータを削除する
条件(WHERE)をつけなければ全て削除される
```

##データの検索
```
SELECT カラム1, カラム2 FROM テーブル名;
```
【Vue.js】監視プロパティについて

#はじめに
こんにちは。
Vue.jsの監視プロパティについてアウトプットしていきます！

##監視(watch)プロパティとは
>watchプロパティは、dataオプションやcomputedオプションに定義した値を監視します。
監視している値に変更があればwatchプロパティに定義したプロパティが呼び出されますので、任意の処理を行うことができます。

> 参照：https://johobase.com/vue-js-watch-property-option/


```html:HTML
<div id="app">
  <p>
    <input type="text" v-model:value="km">km
  </p>
  <p>
    <input type="text" v-model:value="m">m
  </p>
</div>
```

```javascript:Vue.js
var app = new Vue({
  el: '#app',
  data: {
    km: 0,
    m: 0
  },
  watch: {
    km: function(value){
      this.km = value
      this.m = value * 1000
    },
    m: function(value){
      this.km = value / 1000
      this.m = value
    }
  }
})
```
双方向データバインディングされたinputとwatchプロパティを定義。
片方にデータを入力すると、watchプロパティの関数が実行されて動的に単位変換が可能となる。

<img width="250" alt="qiita-square" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/966101/47bd5fe5-99ff-1248-1c69-a866731bcd53.png">





<br>


#最後に
ここまで監視プロパティについてまとめました。
今回はかなりシンプルになりましたが、以前記事を作成した「算出プロパティ」との違いについても触れていきたいと思います。
今後も備忘録としてアウトプットしながら学習を継続していきます！
AtCoderログ：0123 - ABC 153 D

---
# 問題

https://atcoder.jp/contests/abc153/tasks/abc153_d

## 問題文
> カラカルはモンスターと戦っています。
> モンスターの体力は $H$ です。
> カラカルはモンスターを $1$ 体選んで攻撃することができます。モンスターを攻撃したとき、攻撃対象のモンスターの体力に応じて、次のどちらかが起こります。
> ・モンスターの体力が $1$ なら、そのモンスターの体力は $0$ になる
> ・モンスターの体力が $X>1$ なら、そのモンスターは消滅し、体力が $\lfloor X/2 \rfloor$ のモンスターが新たに $2$ 体現れる
（$\lfloor r \rfloor$ は $r$ を超えない最大の整数を表す）
> 全てのモンスターの体力を $0$ 以下にすればカラカルの勝ちです。
> カラカルがモンスターに勝つまでに行う攻撃の回数の最小値を求めてください。

## 制約
> ・$1 \le H \le 10^{12}$
> ・入力中のすべての値は整数である。

## 収録されている問題セット
- [AtCoder Problems Boot camp for beginners Easy 100](https://kenkoooo.com/atcoder/#/training/Boot%20camp%20for%20Beginners/1) [#026]

# 回答
## 回答1 (AC)
体力 $X~(>1)$ のモンスターを攻撃すると、体力が $\lfloor X/2 \rfloor$ のモンスターが 2 体に変わります。ここで $\lfloor X/2 \rfloor$ が $X$ に比べてちょうど $1$ ビット小さい値であることに注意すると、$X$ が $d$ ビットであるとき、体力 $d$ ビットのモンスター $1$ 体が体力 $d-1$ ビットのモンスター $2$ 体に変わったと言い換えることが出来ます。同様に考えると、これらのモンスターは体力 $d-2$ ビットのモンスター $2^2=4$ 体に、体力 $d-3$ ビットのモンスター $2^3=8$ 体に、...、体力 $1$ ビットのモンスター $2^{d-1}$ 体に変わります。よって攻撃回数は $1+2+\ldots+2^{d-1}=2^d-1$ 回となることがわかります。コードは以下のようになりました。$H$ の最大値は $10^{12}$ なので、long long 型の変数が必要になることに注意が必要です。

```C++:abc153d-1.cpp
#include <bits/stdc++.h>
using namespace std;
 
int main() {
  int64_t h;
  cin >> h;

  int d = floor(log2(h))+1;
  
  cout << (int64_t)pow(2,d)-1 << endl;
}
```

なお設問では攻撃に必要な回数の最小値を問われていますが、攻撃手順はいろいろ考えられるものの、攻撃回数は一定になっています。

# 調べたこと
## [AtCoder の解説](https://atcoder.jp/contests/abc153/tasks/abc153_d/editorial) → [ユーザ解説](https://blog.hamayanhamayan.com/entry/2020/01/27/202817)
回答1と同じ方針でした。

## [AtCoder の解説](https://atcoder.jp/contests/abc153/tasks/abc153_d/editorial) → [コンテスト全体の解説](https://img.atcoder.jp/abc153/editorial.pdf)
漸化式を用いた解法でした。

# リンク
## 前後の記事
- 前の記事 → [AtCoderログ：0122 - ABC 150 C](https://qiita.com/RoadLynton/items/84c0483bb612fe86b9e0)
[Delphi][小ネタ] Delphi 11 Alexandria で誰も気づいていない FMX Constraints

# 待望の Constraints

DocWiki にも書いてないけど FireMonkey の [TCommonCustomForm](https://docwiki.embarcadero.com/Libraries/ja/FMX.Forms.TCommonCustomForm) に [Constraints](https://docwiki.embarcadero.com/Libraries/ja/FMX.Forms.TCommonCustomForm.Constraints) プロパティが追加されています！
VCL の [Constraints](https://docwiki.embarcadero.com/Libraries/Sydney/ja/Vcl.Controls.TControl.Constraints) と同じ…いや [WM_GETMINMAXINFO](https://docs.microsoft.com/ja-jp/windows/win32/winmsg/wm-getminmaxinfo) で制御してるからむしろこっちの方が優秀！[^1]

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12977/4fadd276-7d1f-63e0-be07-d34ba6a8ee7f.png)

ね！！
今まで [LimitSize というライブラリ](https://qiita.com/pik/items/6cd18bc366f8ac8f8359)を作って最小・最大サイズを指定していたけど、それももう必要無いのです！ 
ヤッター！

ちなみに IFMXWindowConstraintsService というサービスが追加され、これによって最小・最大値を制御出来るようになっています。
Windows / macOS の実装を見たところ基本的には LimitSize と同じでした。

# おわりに

むしろ最初から対応しておいてよ…

[^1]: VCL の Constraints は上側か左側から小さくしようとすると Form が移動するっていう仕様がある…
Python3: 加算をする API

AWS APIGateway と Lambda を使って加算をするプログラムを作成します。

Lambda のプログラム

```py:sumup_function.py
# -*- coding: utf-8 -*-
#
#	sumup_function.py
#
#					Sep/25/2021
#
# --------------------------------------------------------------------
import sys
import json
 
# --------------------------------------------------------------------
def lambda_handler(event, context):
	sys.stderr.write("*** lambda_handler *** start ***\n")
	print("Received event: " + json.dumps(event, indent=2))
	print("event['aa'] = " + str(event['aa']))
	print("event['bb'] = " + str(event['bb']))
	aa = int(event['aa'])
	bb = int(event['bb'])
	sum = aa + bb
	rvalue = {}
	rvalue['aa'] = aa
	rvalue['bb'] = bb
	rvalue['sum'] = sum
	sys.stderr.write("*** lambda_handler *** end ***\n")
#
	return rvalue
#
	#raise Exception('Something went wrong')
# --------------------------------------------------------------------
```

ローカルでのプログラムの動作確認

```bash
python-lambda-local -f lambda_handler sumup_function.py event.json
```

```json:event.json
{
  "aa": 25,
  "bb": 72
}
```

AWS Lambda にアップロード
>必要なロール
>role_lambda_sep25
>は作成済みとします。

```bash:create_lambda.sh
#
NAME="sumup_function"
#
zip -r ${NAME}.zip ${NAME}.py
#
aws lambda create-function \
    --function-name ${NAME} \
    --runtime python3.9 \
    --role arn:aws:iam::123495704257:role/role_lambda_sep25 \
    --handler sumup_function.lambda_handler \
    --zip-file fileb://${NAME}.zip \
    --region ap-northeast-1
#
```

APIGateway の作成

```bash:restapi_create.sh
aws apigateway create-rest-api --name 'Sumup AAA' \
    --region ap-northeast-1
```

Method の作成
>POST の Method は AWS のコンソールで行います。
>方法はこちら
>[API Gateway から Lambda にアクセスする](https://qiita.com/ekzemplaro/items/e20b34e74d63d2a9a5b5)

デプロイ
>やはり、AWS のコンソールで行います。

##テスト##
URL の呼び出し が
https://1234ucmnfhj.execute-api.ap-northeast-1.amazonaws.com/Test
とします。

HTTPie

```bash:http_test.sh
URL="https://1234ucmnfhj.execute-api.ap-northeast-1.amazonaws.com/Test"
http $URL < event.json
```

curl

```bash:curl_post.sh
URL="https://1234ucmnfhj.execute-api.ap-northeast-1.amazonaws.com/Test"
curl -X POST $URL -d@event.json
```
冗長構成を構築する


__<記事の目的>__
EC2インスタンスを2台構築し、冗長構成を構築する。

__<イメージ図>__
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2052920/f36131e6-7bca-48a7-cf50-893b1e4145e7.png)


__<構成内容>__
各Public subnetのEC2②はAutoScalingでCPU使用率が70%以上、30%以下でインスタンスが1台増減するように設定。
ELBで冗長を構成し、どちらかのPublic subnetがダウンしてもサービスが継続出来るようにしている。
※サービスはテストとしてwordpressを導入。

__<構築中に発生した問題>__
1.wordpressインストール中にエラーが発生。
wget http://ja.wordpress.org/latest-ja.tar.gz ~/
tar zxvf ~/latest-ja.tar.gz
上記、コマンド実行中にエラー発生。
rootでコマンドを実行したのが原因。
tar zxvf ~/latest-ja.tar.gzのコマンドをtar zxvf /home/ec2-user/latest-ja.tar.gzとして実行すると問題なく実行できた。
事前に同様の作業を行ったが、その際はコマンドを修正せずに実行したが、その際はエラーは発生しなかった。

2.wordpressへのアクセスが出来ない。
エラーコードとして、「504」が表示される。
wordpressの作業を途中で切り上げ、スナップショットで保存したものを復元。
保存する前はアクセス出来ていたため、どこかの設定に誤りがあるのは予測できた。
wordpressの設定ファイルをcatコマンドで確認しても問題はない。そもそもviコマンドで編集していないのだから、
設定ファイルが原因とは考えにくい。
セキュリティグループの選択が誤っていたため、アクセス出来なかったのが原因。
__接続が出来ない場合はセキュリティグループをまず確認と学習__

3.ELBの作成でセキュリティグループを追加できない。
セキュリティグループを作成し、プルダウンから作成したセキュリティグループが表示されない。
反映に時間が掛かっていると思い、何度か更新しても表示されないため。ELB経由で作成はあきらめ、EC2インスタンスの左ペインにある
セキュリティグループから直接作成し、ELBのセキュリティグループから再度、確認すると作成したものが表示されたため、選択。

__<動作確認>__
構築が完了し、動作確認を実施。どちらかのインスタンスを停止しても、wordpressにアクセス出来ることを確認。
Auto Scalingも負荷を掛けてインスタンスの増減が発生していることを確認。

__<最後に>__
この記事はAWS初学者を導く体系的な動画学習サービス
「AWS CloudTech」の課題カリキュラムで作成しました。
https://aws-cloud-tech.com
Linux(Gentoo)でC#

Linux(Gentoo)にC#をインストールしてみた。

# インストール

```
emerge --ask --autounmask=y --autounmask-write virtual/dotnet-sdk
etc-update
emerge virtual/dotnet-sdk
```

「virtual/dotnet-sdk」をインストールしますが、私のマシンの場合はマスクが掛かっていたので解除しています。

# バージョン確認

インストールできたか確認も兼ねてバージョンを確認します。

```
dotnet --version
```

私の場合は「5.0.301」と表示されました。

```
apo@gentoo ~/Documents/project/make/cs/hello $ dotnet --version
5.0.301
```

# プロジェクトの作成

```
dotnet new console
```

上記を実行すると下記のようなファイルやフォルダが作成されています。

```
apo@gentoo ~/Documents/project/make/cs/test $ ls -la
total 8
drwxr-xr-x 3 apo apo  54 Sep 25 08:40 .
drwxr-xr-x 4 apo apo  31 Sep 25 08:40 ..
drwxr-xr-x 2 apo apo 165 Sep 25 08:40 obj
-rw-r--r-- 1 apo apo 186 Sep 25 08:40 Program.cs
-rw-r--r-- 1 apo apo 171 Sep 25 08:40 test.csproj
```

「Program.cs」ファイルの中身は下記のとおり

```
﻿using System;

namespace test
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");
        }
    }
}
```

# ビルド

```
dotnet build
```

# 実行

```
dotnet run
```

下記のとおりの結果となります。

```
apo@gentoo ~/Documents/project/make/cs/test $ dotnet run
Hello World!
```

以上
Windows365クラウドPCにVPN設定してハマった

今回Windows365の試用版が海外サーバーで設定されるため、WordPressの管理画面にアクセス制限されてしまうことを回避するため、VPNのアプリをインストールしたらクラウドPCが落ちてしまいました。

その復旧作業が大変だったので、反省をしたいと思いシェアします。

最初の事件は、こちらのnoteの記事を読んでください。

https://note.com/masaru21/n/n0aaf79a98a96

Microsoftが公開しているクラウドPCの日本語化の情報は、こちら。

https://jpmem.github.io/blog/w365/2021-08-20_01/

この公開情報の手順でもタイムゾーンの変更ができず、マイクロソフトのサポートに問い合わせをしました。

レジストリを修正してタイムゾーンを日本に設定する方法で、解決できました。

##VPNは自分で設定しないこと
私は、millenを使っています。
今回は、millenのWindowsのソフトをインストールして、VPNを利用しようとしました。
でも、millenのソフトをインストールして初期設定を行なっていたら、途中でクラウドPCが落ちてしまい、再接続ができなくなってしまったのです。

そのため、自分でVPNの設定を行なっては、いけないと思いました。
【AWS】自分のインフラ構成図のそれぞれの役割を１つ１つ調べていく


#はじめに

自分でインフラ構成図を作成しましたが、
それぞれの箇所がどんな役割を持っているのか
わからなかったので記事にしてみることにしました。


#目的

* インフラ構成図の構成を知ること

![スクリーンショット 2021-09-28 10.54.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1681213/edc8566a-0220-42a9-6a94-724ea1f5326a.png)



#インフラ構成図概要

* ロードバランサーとAWS Certificate Managerでhttps化
* GitHubアクションによる自動デプロイ
* データベース：MySQL
* アベイラビリティゾーン２つ
* サブネット３つ

###1.Internet Gateway

*  VPCと外部のインターネットをつなぐための接合点。
*  VPC内のシステムがグローバルIPを使えるようになります。（外部のインターネットとやりとり可能になる）


###2.ルーティング

* AWS上の仮想的なネットワーク環境。
* ルートテーブルを作成することで、「どこに接続できるか」を設定できる。


###3.ロードバランサー

* 負荷分散装置のこと。
* Webサイトへのアクセス集中やサーバー故障などの場合に活躍。
* アクセス集中した場合でも負荷を分散して接続を安定させる。
* 種類がある

###4.VPC

* AWS上に構築する仮想ネットワーク。
* ユーザー専用のプライベートなクラウド環境を提供するサービス。
* 複数作成できる。

###5.サブネット

* VPCによって作られているCIDRブロックを分割したネットワーク群のこと。
* VPCのIPアドレス範囲の中で、さらに小さな仮想ネットワークを作成する。
* ネットワークをサブネット化しないと余計な通信が発生してしまう

https://qiita.com/nao0725/items/618ac7efc72db923a1fc


###6.アベイラビリティゾーン(AZ)

* リージョンよりも小さな区分けのこと。
    * リージョンは地域のこと。AWSは世界中にサーバーを持っていて、その一つひとつの地域を指す（日本は東京リージョン）
* 障害対策の役割を担っている。
* 　現在は３つある。（2021/09/25）
* 　１つのAZに障害が発生しても、他のAZで対応できる。


###7.EC2

EC2に関してはこちら

https://qiita.com/nao0725/items/80d52a49f158c9e4cdc1

####A.Nginx

* Webサーバーの一種。
* ユーザーからリクエストをもらって、そのリクエストに対して何らかの処理を行なって返すもの。
* 高速、大量処理が得意、設定がカンタン

####B.Puma

* アプリケーションサーバーの一種。
* アプリケーションを動かす役割をもつ（Ruby on Rails）


ユーザー → Webサーバ → アプリケーションサーバ → アプリケーション → Webサーバ → ユーザーの順でリクエストに対して反応している。


###8.RDS(MySQL)

* RDSはAWSのサービスのひとつ。
* データベース管理をするシステム。
* MySQLがデータベース
* データの保存管理をしている。


###9.GitHub Actions

* GitHubのCI/CDツールのひとつ。
* GitHubに存在するリポジトリでワークフロー（ビルド、テスト、リリースなど）を簡単に自動化できる。
* CI/CDツール
    * CI:継続的にソースコードをマージしたタイミングでテスト等を実行する仕組み。
    * CD:本番環境へデプロイを行う仕組み。


#参考にさせて頂いた記事

* [AWSのVPCって何？メリットや使えるシーンなど徹底解説！](https://techplay.jp/column/541)
* [【ネットワーク】 脱・知ってるつもり！AWSのネットワーク関連用語を基礎からおさらい](https://www.bit-drive.ne.jp/managed-cloud/column/column_31.html)
* [【図で理解】ロードバランサーとは？負荷分散の仕組みを解説](https://www.kagoya.jp/howto/it-glossary/network/loadvalancer/)
* [AWSのリージョンとアベイラビリティゾーンの違いを解説](https://xn--o9j8h1c9hb5756dt0ua226amc1a.com/?p=629)
* [【入門】Nginx（エンジンエックス）とは？Apacheとの違いと初期設定](https://www.kagoya.jp/howto/it-glossary/web/nginx/)
* [RubyのWebサーバ「puma」を使ってみた感想](https://arma-search.jp/article/ruby-puma#Web)
* [MySQLとは？初心者にわかりやすい説明](https://kinsta.com/jp/knowledgebase/what-is-mysql/)
flutter 自分用雛形

```dart
import 'dart:ffi';
import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
import 'dart:convert';

class SelectStoreFitness extends StatefulWidget {
  const SelectStoreFitness({Key key}) : super(key: key);

  @override
  _PopupMenuButtonState createState() => _PopupMenuButtonState();
}

class _PopupMenuButtonState extends State<SelectStoreFitness> {
  List<Store> _storeNames = [];
　　　　// イニシャライズ
  @override
  void initState() {
    super.initState();
    initialize();
  }
  // API取得
  Future<http.Response> initialize() async {
    var url = 'http://localhost:3000/endpoint/show';
    var resp = await http.get(url);
    var body =  json.decode(resp.body);
    final stores = (body["store"] as List).map((e) => Store.fromJson(e)).toList();
    _storeNames = stores;
    setState(() {});
  }

  // buildのうえにかく:overrideは描画を上書きする
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: // HogeHoge
    );
  }

}

// 構造体定義
class Store {
  final int id;
  final String store_name;
  final String store_address;

  Store(
      this.id,
      this.store_name,
      this.store_address,
      );

  factory Store.fromJson(Map<String, dynamic> json) {
    return Store(
      json["id"],
      json["store_name"],
      json["store_address"]
    );
  }
}

```


```dart

// 返す値はbool
// 受け取る値は String
bool isMan(String gender){
   if(gender == "男性"){
      return true
   } else {
      return false
   }
}

```
flutter API を取得して表示


構造体を定義

```dart
class Fitness {
  final int id;
  final String name;
  final int company_id;

  Fitness(
      this.id,
      this.name,
      this.company_id
      );

  factory Fitness.fromJson(Map<String, dynamic> json) {
    return Fitness(
        json["id"],
        json["name"],
        json["company_id"]
    );
  }
}
```

APIを呼び出す

```dart
  List<Fitness> _fitnessNames = [];

  @override
  void initState() {
    super.initState();
    initialize();
  }

  Future<http.Response> initialize() async {
    var url = 'http://localhost:3000/endpoint/show';
    var resp = await http.get(url);
    var body =  json.decode(resp.body);
    // ここで上で定義した構造体に取得した情報を入れていく
    final fitnesses = (body["fitnesses"] as List).map((e) => Fitness.fromJson(e)).toList();
    _fitnessNames = fitnesses;
    setState(() {});
  }
```
10年前の俺、その知識忘れんなよ！！！

## はじめに：10年前のぼくへのひとこと

学生時代に知ったことはだいたい使うから、ちゃんと忘れんなよ

## ぼくの情報

- 某工業高専（専攻科）卒
- 新卒で某SIerに入社
- 今に至る

## もう使わないだろう、としまっておいたはずの知識がフル稼働した3選

### そのいち　モバイル（ガラケー）開発技術

もはや10年どころか15年以上前の話に遡るが、学生当時にガラケーのアプリ（ドコモ向けのiアプリ）を開発していた。

2009年当時、お堅い金融系メインのSIerに入社したわけで、
当時の自分は「ガラケーのアプリ開発の経験なんてそうそう活きんだろうな」と思っていた。

実際、入社当時はC#やJavaを使った業務システムの開発業務を行なっていたので、
モバイルなんてかなり遠い存在だったように思える。

2011年頃といえば、iPhoneが流行り出してAndroidが4.xに移行した頃。
それでもまだスマホは「ギークな人のもの」だった。

そんな感じで過ごしていたら、唐突にスマホが流行り出した。


当時、唐突に「iPhoneとAndroidのアプリを作れ」と言われ、
当時のiOS Developer（現Apple Developer）に苦労しながら登録したのをなんとなく覚えている。

特に、当時のAndroid開発はJavaを使ったコードとXMLによるレイアウト作成が主体だったのだが、
iアプリの開発で身につけたテクニックが意外と役に立った。
ガラケーもスマホも、PCから比べたら小さい画面に情報を詰め込むという点では一緒だった。
（iPhoneについては、Storyboardもよー分からんしObjective-CだからどちらかというとC言語で培った知識フル活用だったから、またちょっと違ったかな・・・）

その後もモバイル系の案件に関しては色々と顔を出していた気がする。
なんだかんだで、iOS Developer登録作業を３回実施した経歴の持ち主なんてそうそうおらんやろ、と自負している。
（もちろん、アプリ開発専門の会社には余裕で負けるわけだが）

もはやモバイルファーストなんて言われている昨今。
気づけば、SIerでありながらフロントエンジニアに片足突っ込んだ半生を送っている気がする。

### そのに　電子工作技術

なにを隠そう、この記事を書いている本人は電子工学科の出身であり、プログラミングよりも電気系の方がメインだったのだ。
普通に進んでいればITのつかないエンジニアになっていたハズなのである。

しかしながら、いつの間にか電子系よりもプログラミングの方に目覚めてしまい今に至る。

さて、そんなエセ電気屋さんが活躍するタイミングが唐突に訪れたのである。

－－－そう。``IoT``というようわからんワードの登場である。

研究開発部門に属している以上、そんなワードが出たらやるしかない。

さて、そこで登場したのがArduino。

当時のぼく「うわー。学生時代にPICやったなー。なつかしーーーー！」

そこからである。当時の上司と一緒になって暴走し始めたのは。

SIerに就職して早や数年の時を経たその時から、ホームグラウンドが秋月電子へ戻ってしまった。

アキバを通ること数年間、あえて遠ざかっていたあのエリア（千石・秋月、飛んでマルツ）に再び足を踏み込むことになったのである。

当時、秋月に行ったときの「そうそうこれだよこれ」感はなんとなく覚えている。

そこからセンサーやら通信モジュールやらを色々と購入し、さらには3Dプリンタまで購入してしまった。

まさか、電子回路だけでなく3D CADまでやることになるとは、
入社当時はもちろん、そこから2年たった2011年の自分は思いもしなかっただろう。

### そのさん　ネットワークの知識

10年前といえば、ちょうどAWSが日本にリージョンを出した頃である。

当時はまだ、アプリとインフラは完全に分離しており、アプリ側にいたエンジニアがインフラを触ることはほぼなかったと記憶している。

そんな中で、「就職祝いだー！いえーい！」と言いながら自宅鯖を立て、メールサーバーを作り運用していた男がいたらしい。
その男、今では自宅にYAMAHAのルーターを置いてVLANを組んでいる。
~~？？？「でもさ、中古なら5kくらいだし実質一般家庭向けだよね」~~

という余談は置いておいて。

AWSをはじめとするクラウドプラットフォームが流行り出したことで、アプリエンジニアが受け持つ範疇に少し変化が起きた。

EC2とELBを使っていた頃は単純なBlue-Green構成と大きく変わらないので、オンプレ運用の知識だけでなんとかなった。

そこから、IaaSからPaaSへの移行や、Docker、そしてKubernetesの登場が登場したことによりさらに変化が起きた。

「モノリス」から「マイクロサービス」へ、そして「仮想マシン」から「仮想クラスタ」へ代わる中で、
一つの小さなインフラを構築することが普通になった。

今では、アプリケーションの構築にネットワーク構築もセットになり、
ネットワーク周りのインフラ知識がフルで必要になってしまった。

さらには「ハイブリッドクラウド」なーんてものもあるので、ネットワークやセキュリティに関する知識は本当に大事になったなぁ、と身にしみたのが割と最近の話。


### 番外編（あまり活躍できなかった例）：　数学の知識

あまり得意分野とはいえなかったので、なるべく隠してきた事実。

それが「数学系の知識」

専攻は暗号理論だったので、線形数学に関する本当に最低限の知識は一応持っていた。はず。

こればっかりはいまだに自信がない。

とは言ってもられなくなったのが、唐突に降ってきた【AI（機械学習）】の単語。

元々頭の片隅に追いやられていた記憶を辿って、やっていることはなんとなく分かった気がする。
しかし未だに理解が追いつかない。

~~「なんならAutoML使えばなんとかなるし」という最低な考えのまま今に至る~~

## まとめ

思い返してみると、「今は使わないけど」から、始まることが多い１０年間だった気がします。

これからも長く続く社会人人生、いつどんな知識が活用させられるかわかったもんじゃありません。

「この知識は就職したら使わないだろう」

なんて思っていると、どこかで唐突に使う場面に出くわすかもしれません。

### 先の10年とVUCA

余談ですが、この先「VUCA」の時代が来る（もう来ている？）と言われています。
ちなみに、VUCAは次の頭文字を取った造語です。

- Volatility（変動性）
- Uncertainty（不確実性）
- Complexity（複雑性）
- Ambiguity（曖昧性）

端的にいうと、「不確定要素が多すぎて、もはやこの先何が起きるか予測できないことが普通になる」ということです。

「何が起きるか分からない」ということは、逆説的には「持っている知識を活用するタイミングが唐突に現れる」ことも大いにあり得ます。

「専門外だったから」と思わずに、それまで得てきた知識を声に出してみることで、新しい活躍の場が唐突に降ってくるかもしれませんね。
[備忘録]nestjs/swaggerにてApiPropertyのtypeで指定したクラスのモデルがうまく生成されない

# 状況

↓のように`@ApiPropertyOptional({ type: User })`で指定したところ、

```project.model.ts
export class Project extends Model {
  ・・・
  @ApiPropertyOptional({ type: [User] })
  @BelongsToMany(() => User, () => ProjectMember)
  members?: User[];
```

SwaggerUIでProjectモデルを展開すると、↓のようにmembersにUserが反映されずstringとなってしまいました

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325108/aeefa05b-504d-67f1-d0dc-e588bda0cd1f.png)


# typeにクラスでなくGetter関数を指定する

[こちら](https://github.com/nestjs/swagger/pull/179#issuecomment-465506777)で解決策が提示されていました
循環参照により型がうまいこと読めていなかったようです。

`type: () => [User]`のように無名関数で型を返すようにしてあげるだけです

```project.model.ts
  @ApiPropertyOptional({ type: () => [User] })
  @BelongsToMany(() => User, () => ProjectMember)
  members?: User[];
```

SwaggerUIで再度確認すると、無事にUserクラスのモデルが反映されました

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325108/49b120f0-0cc6-9fc9-6ea3-31faaa10caa8.png)
ebitenのwasm表示ではまった

　sakura.ne.jpでapplication/wasmを設定しても実行できなかったのでメモを残しておきます。ebitenでのwasmを扱うマニュアルは、 https://ebiten.org/documents/webassembly.html にあります。

まず、コンパイルはWindowsでは、&&を足して

```bat
set GOOS=js&& set GOARCH=wasm&& go build -o ../build/game.wasm
```

でコンパイル出来ます。

　sakura.ne.jpでサーバー設定が効かなかったので、PHPのスプリクトにて、

```php:wasm.php
<?php
	header('Content-Type: application/wasm');
	echo(file_get_contents("game.wasm"));
	exit;
```

PHPのheaderでファイルタイプを送信してから、wasmファイルを読み込んでブラウザへ送信してます。

　wasmを表示するHTMLファイルの該当部分の

```html
WebAssembly.instantiateStreaming(fetch("wasm.php"), go.importObject).then(result => {
```

ファイル名をwasm.phpへ変更して、ｆｔｐなどでファイルを転送。ブラウザで表示すると、wasmで実行できるはずです。

　画像ファイルなどもサーバーへ転送してないとエラーが出ます。（実は、そこで少し嵌まった…　私、wasm知らなすぎ…）

　以上の方法で、ebitenで作ったゲームのwasmファイルを実行出来ます。:grinning:　今、作っているゲームのウェブは、まだ見せれませんが。:neutral_face:

　あと、オマケで、いつも使っているBATファイルも置いておきます。

```bat:make.bat
@ECHO off

if "%1" == "compile" (
cd src
go build -o ../build/game.exe
cd ..
)

if "%1" == "wasm" (
cd src
set GOOS=js&& set GOARCH=wasm&& go build -o ../build/game.wasm
cd ..
)

if "%1" == "exec" (
cd build
game.exe
cd ..
)

if "%1" == "vet" (
cd src
go vet ./...
cd ..
)

if "%1" == "fmt" (
cd src
go fmt ./...
rem gofmt -s -w .
rem go vet .
cd ..
)

REM モジュールの整合性を整え直す
if "%1" == "tidy" (
cd src
go mod tidy
cd ..
)

echo end.
```
IsLoggedIn（Privacy Community Group）を理解する

ウェブブラウザのプライバシー保護対策の動向を把握するために、W3Cの[Privacy Community Group](https://privacycg.github.io/)の[各提案](https://github.com/privacycg)を読み進めている。自分の頭の整理用にまとめている資料を公開する。今回は[IsLoggedIn](https://github.com/privacycg/is-logged-in/)について。

### 概要

現在のWebの振る舞いは「デフォルトでログイン状態」（websiteはロードされた時点で、cookie等を利用してユーザーの情報を実質永続的に保存できる）となっているため、プライバシー上の問題とディスク容量の問題がある。ブラウザがログイン状態を把握できるようにして、ユーザーデータの保存を制御できるようにする。

### API仕様の素案 (Straw Man Proposal）

* 基本となるのは以下の3つのAPI
	* `navigator.setLoggedIn(username, credentialTokenType, optionalParams) -> Promise<void>`
		* Websiteがログイン状態 (isLoggedIn=true) になることをブラウザに知らせる。
	* `navigator.setLoggedOut(optionalUsername) –> Promise<void>`
		* Websiteがログアウト状態（isLoggedIn=false) になることをブラウザに知らせる。
	* `navigator.isLoggedIn() –> Promise<void>`
		* Websiteのログイン状態をブラウザから取得する。
* トラッキングへの悪用を防ぐための対策として以下が例示されている。
	* WebAuthnやパスワードマネージャの利用など、ログイン処理であることが明らかな操作の後にのみ`setLoggedIn`を呼び出せるようにする。
	* ログイン状態にするときにユーザーに明示的な同意確認を行う。
	* ログイン状態であることがわかるUI、定期的なログイン状態継続の確認を実施する。
* ブラウザがログイン状態を保持するには[HTTP State Token](https://datatracker.ietf.org/doc/html/draft-west-http-state-tokens-00)もしくはCookie（ブラウザへの普及をスムーズにするため）のいずれかを利用できる。
* IDフェデレーションのサポートも考慮されており、IdPのwebsiteで`navigator.initiateLoggedInFederated`を呼び出した後に、SP (RP) のwebsiteで`navigator.setLoggedInFederated`を呼び出すことで、SPの`isLoggedIn`をIdPのアカウントを使って`true`にできる。

### 議論の状況

* 別オリジンとのisLoggedIn状態の共有によるSSO実現の是非。([Support for federated logins, or the ability to transfer IsLoggedIn #35](https://github.com/privacycg/is-logged-in/issues/35)、[Potential use of First Party Sets for Single Sign-On #43](https://github.com/privacycg/is-logged-in/issues/43))
* WebIDとの関係。WebIDを使ったログイン時にisLogggedInをtrueにするか？([Integration with WebID #44](https://github.com/privacycg/is-logged-in/issues/44))
* ログインに関係する情報（過去にログインしたユーザー名やMFA通過状態など）の永続化をサポートすべきか？([Support "Remember me" functionality #9](https://github.com/privacycg/is-logged-in/issues/9))