OmniAICreator/Qiita-1.07M huggingface dataset:
未経験からITエンジニアとして転職するためにテックキャンプに通ってみた

# テックキャンプを受講してみて
私は、未経験でのITエンジニアへの転職を行うためにテックキャンプというプログラミングスクールに通っていましたので、今後検討される方のために感想を中立な立場として記述したいと思います。
なお、こちらの記事の内容は一個人の見解ですので、参考程度にしていただければと思います。
その上で、私の属性は以下を参考にしていただければ幸いです。

# 前提条件
【当方の前提条件】
・大学は私立文系で3年次より金融専攻
・銀行の営業員として業務に従事
・新卒で入社した企業を1年で退社した、24歳の人
・在職中にHTML&CSSは本を使って学習
・スクール学習期間中は、11時間程度学習（土日関係なし）

# 結論
テックキャンプはお勧めできる。（条件付き）
考える上で「学習内容について」「費用面」「転職活動面」の大きく３つに分けてお話しします。みなさんが気になるであろう上記３つ以外にももちろんスクール選びのための要因や比較等もあると思いますが、ひとまずこちらの３点だけ記述させていただこうと思います。


### 学習内容について
他社サービスとは比較していないですが、テックキャンプでは「Ruby」や「Ruby On Rails」を中心に学習するので、プログラミング初心者には理解しやすく、挫折はしにくいと思います。
ただ、「プログラミング言語をしっかりマスターして即戦力になってやる！」というのはカリキュラムだけでは無理で、色んな機能を自主的にキャッチアップする必要があります。これは、おそらく働き出してからも必要になるので、これができない人はテックキャンプに入ってもしんどいと思います。
なので、当方も未経験なりに公式ドキュメントやQiitaを活用して常にキャッチアップしていました。
ここでお知らせしたいのは、『プログラミングをマスターするというよりも、エンジニアになるためのまたはエンジニアに必要な素養を育てる』という心持ちの方がいいかもしれないです！
結論この章では、「自主的に学習できる人は、めちゃくちゃいい環境であると思います！」ということをお伝えしたかったです！


### 費用面
こちらは、条件付きでお勧めできるというところになります。端的にいうと、「訓練給付金」の受給者に該当する方にはお勧めできます！
というのも、当方はこちらの給付金の受給対象者ではないので、スクールの費用を全額一括で払いました。
（もちろんスクールの費用は高く、給付金を受給できないことを知りながら、受講を決めましたが、新卒一年目の給料も多くないので、かなり大きな負担になりました。加えて、当方は大阪在住で就職先は東京にありますので、移住費等も...）
ということもあるので、「すぐさまITエンジニアになりたい！」や「訓練給付金がなくてもお金は大丈夫だ！」という方以外は、給付金を受給できるかを確認した上で行動しましょう！
テックキャンプのサイトから、金額や受講料の分割等の情報もあるので、確認してみてください！


### 転職活動面
みなさん気になる点だと思いますが、こちらも「企業にこだわりすぎなければ、転職しやすい。」ということです。（もちろん個人差があり企業とのマッチング度に大きく依存します。）
私自身は企業選びをかなりこだわっていましたが、本当に納得のいく企業さんから内定をいただきました。私は、転職・就活媒体経由で企業さんを見つけましたが、テックキャンプからの求人等もあり、色んな企業がありのでこだわらなければ、いい企業は多いと思います。（人によって違うと思いますが。）
「こだわりすぎない人」や「ITエンジニアとしての一歩を踏み出すための１社目として修行をしたいと考えられる人」には就職活動面でも大いに、お勧めできると思います！

# まとめ
・「能動的に学び続けられる」
・「費用はなんとかする（もしくは、訓練給付金の受給者である）」
・「転職先をこだわりすぎない」
の上記3つををクリアできる方になら、私はテックキャンプをお勧めできます！
とはいえ、百聞は一見に如かずで兎にも角にも、アクションを起こしてみるのがいいと思います！
私も受講を決める前は無料カウンセリングでお話を聞いて決めたので、一度聞いてみられてはいかがでしょうか！
[Microsoft] ASP.NET Core Identity 認証サービスまとめ

# これはなに？

ASP.NET Coreでは、認証のいろいろな段階で、使用する認証スキームを選ぶことができます。

**認証のいろいろな段階** というのは、具体的には [IAuthenticationService](https://github.com/dotnet/aspnetcore/blob/main/src/Http/Authentication.Abstractions/src/IAuthenticationService.cs) 実装クラスのメソッドです。 

各メソッドがそれぞれ何をするのかわからなかったので、まとめてみようと思いました。


# 参考リンク

以下を参考にしました。

* [スタックオーバーフロー](https://stackoverflow.com/questions/52492666/what-is-the-point-of-configuring-defaultscheme-and-defaultchallengescheme-on-asp)
* [ASP.NET Core 2.0 Authentication](https://qiita.com/masakura/items/85c59e60cac7f0638c1b)
* [AuthenticationOptions クラス](https://github.com/dotnet/aspnetcore/blob/main/src/Http/Authentication.Abstractions/src/AuthenticationOptions.cs)
* [IAuthenticationService インターフェース](https://github.com/dotnet/aspnetcore/blob/main/src/Http/Authentication.Abstractions/src/IAuthenticationService.cs)


# 認証のいろいろな段階一覧

IAuthenticationService インターフェースから拾った認証段階は、以下のとおりです。

* Authenticate
* Challenge
* Forbid
* SignIn
* SignOut

それぞれ見てみます。

## Authenticate

認証するといいますか、指定されたスキーマから認証情報を取り出します。
例えば、CookieスキーマならCookieから、JwtBearerスキーマならAuthorization HTTPヘッダから取り出します。

## Challenge

未認証ユーザーが、認証が必要なエンドポイントへリクエストしたとき、ユーザに対して認証を要求します。
例えば、ログイン画面へリダイレクトします。

## Forbid

認証済みユーザが、アクセス許可されていないリソースへアクセスしようとしたときに実行されます。

## SignIn

認証情報を保管します。
例えば、Cookieにトークンを保管します。

## SignOut

認証情報を破棄するようにします。
例えば、Cookieをexpireします。
【Unity】PlayerInput（InputSystem）でマウスからGamePad操作に切り替わらない問題

環境
Unity2021.3.6
Windows
GamepadはXboxコン
　
問題
・New InputSystemでマウスキーボード、ゲームパッドを切り替えるためにAutoSwitchを使っている
・ゲームパッド用にバーチャルマウスを使用している
・この時<b>ゲームパッドにSchemeを切り替えた後（バーチャルマウス等で）エディタ外にカーソルがでると、マウスだけではCurrentSchemeのオートスイッチができない</b>
　
結論
おそらくバグではなく仕様だから諦める
エディタをゲームウインドウと別のソフトと考えるならゲームウインドウ外に出た時点で、エディタ全体がUnityというソフトになっているので、ウインドウ上で入力してもゲームへの入力として識別されない
結果、Schemeが切り替わらない
　
対処
キーボード等で入力すれば切り替え可能(Actionの登録は不要）
使用しているMapのActionにマウスのActionを登録しても変わらない
たぶん実機上では起こらないので、あまり気にしなくてもいい
SQL用語 日本語vs英語対比表

# はじめに
ORACLE SQL 1Z0-071の試験対策をするときに、日本語のテキスト表記だとよくわからなくて、英語で検索しようとしたときに見つけるのに少し時間がかかったものを一表にしました。随時更新していきます。

# SQL用語 日本語vs英語対比表

| No |    日本語     　　　　　|    英語                 |      備考        |
|---:|------------------------|------------------------|------------------|
| 1  |       集合演算子        |    SET OPERATOR        |   UNION,UNION ALL ,MiNUS INTERSECT               |
| 2  |       集計ファンクション |  Aggregate Functions     |SUM(),COUNT(),GROUP BY HAVING |
| 3  |       デカルト（積）        |       Cartesian(product)                 |  （参考）http://www.takuichi.net/hobby/edu/vector_analysis/coordinates/cartesian-j.html               |
| 4  |       グローバル一時表   |     global temporary tables          | |
| 5  |       システム権限      | system privilege           | |
| 6  |       相関サブクエリ     |  correlated subquery          | |
| 7  |          非等結合          |  non-equijoin          | |
| 8  |        随時追加                |            | |
| 9  |                        |            | |
| 10  |                        |            | |
全国の人流オープンデータを取得する

[こちら](https://www.geospatial.jp/ckan/dataset/mlit-1km-fromto)にある全国の人流オープンデータ、とても素晴らしいのですが、
全国のデータを取ってくるためには都道府県毎に利用規約に承諾する必要があったり、zipの下にzipがあったり、zipの下は同名fileだったりで、結構使いにくいんですよね。。
自分は敬意を払って全部手動で承認しましたが、面倒な方は[selenium](https://www.selenium.dev/ja/documentation/)あたりを使うとよいかもです。

で、取得したデータはとりあえず同じフォルダにおいて、

```unzipall.ps1
$f0 = '.\monthly_fromto_city_mesh1km';
for ($p=1; $p -lt 48; $p++){
  $s1 = $f0+'\monthly_fromto_city_'+$p.ToString("00")+'.zip '+$f0+' -Force';
  powershell Expand-Archive $s1;
  Write-Output ($s1);
}
for ($y=2019; $y -lt 2022; $y++){
  for ($m=1; $m -lt 13; $m++){
    for ($p=1; $p -lt 48; $p++){
      $f1= $f0+'\'+$p.ToString("00")+'\'+$y.ToString("00")+'\'+$m.ToString("00");
      $s1 = $f1+'\monthly_fromto_city.csv.zip '+$f1+' -Force';
      powershell Expand-Archive $s1;
      Write-Output ($s1);
    }
  }
}
```
こんな感じで展開しました(再帰展開の方法がありそうですが見つけられませんでした。。)。
また、実行前に ```Set-ExecutionPolicy RemoteSigned``` が必要な場合があります。
その場合は実行後に ```Set-ExecutionPolicy Restricted``` で戻しておいたほうが良いかもしれません。

これをmapboxに全部食べさせてクラスター表示してみたものが[こちら](https://www.youtube.com/watch?v=Ev5wNDz2Hew)になります。
結構なデータ量なのですが、ちゃんとクラスターサイズを動的に変更してくれるのがすごいです。。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/e819c9b3-c51d-6973-157a-161828e40081.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/c70e645f-a04d-fd6a-da7b-307dc2d8b76a.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/111453d2-8dc6-377a-adb4-8aa63b205fa6.png)
laravel Factoryを用いてテストデータを作成する（追記編）

# 概要

- Factoryを用いてデータを作成する複数の方法をまとめる。

# 1件のデータを作成する

- 下記の記載で1レコードのデータを登録する事ができる。

    ```php
    モデルクラス::factory()->createOne();
    ```

- Factoryによって作成されたデータのモデルが返される。

    ```php
    $eloquent = モデルクラス::factory()->createOne();
    ```

- 下記のように記載することで特定の情報を固定してレコードを作成する事ができる。

    ```php
    モデルクラス::factory()->createOne([
        'カラム名' => 特定のデータ,
    ]);
    ```

- ちなみにcreate()関数を用いて1レコードを作成することもできる。この場合戻り値がコレクションで返される。

    ```php
    $collection = モデルクラス::factory()->count(1)->create();
    ```

- `createOne()`と`create()`関数の実装部分にPHPDocでレスポンスの記載がされている。
    - createOne()

        ```vendor/laravel/framework/src/Illuminate/Database/Eloquent/Factories/Factory.php
        /**
         * Create a single model and persist it to the database.
         *
         * @param  (callable(array<string, mixed>): array<string, mixed>)|array<string, mixed>  $attributes
         * @return \Illuminate\Database\Eloquent\Model|TModel
         */
        public function createOne($attributes = [])
        {
            return $this->count(null)->create($attributes);
        }
        ```

    - create()
   
        ```vendor/laravel/framework/src/Illuminate/Database/Eloquent/Factories/Factory.php
        /**
         * Create a collection of models and persist them to the database.
         *
         * @param  (callable(array<string, mixed>): array<string, mixed>)|array<string, mixed>  $attributes
         * @param  \Illuminate\Database\Eloquent\Model|null  $parent
         * @return \Illuminate\Database\Eloquent\Collection<int, \Illuminate\Database\Eloquent\Model|TModel>|\Illuminate\Database\Eloquent\Model|TModel
         */
        public function create($attributes = [], ?Model $parent = null)
        {
            if (! empty($attributes)) {
                return $this->state($attributes)->create([], $parent);
            }
        
            $results = $this->make($attributes, $parent);
        
            if ($results instanceof Model) {
                $this->store(collect([$results]));
            
                $this->callAfterCreating(collect([$results]), $parent);
            } else {
                $this->store($results);
            
                $this->callAfterCreating($results, $parent);
            }
        
            return $results;
        }
        ```

# レコード数を指定してテストデータを作成する

```php
モデルクラス::factory()->count(レコード数)->create();
```

# テーブルに値を格納せずモデルクラスのみを作成する

```php
$model = モデルクラス::factory()->count(レコード数)->make();
```

# 特定の情報だけは指定してレコードに情報を登録する

- 下記の様にcreateOneの引数に配列でキー名と指定したい情報を記載してレコードを作成することも可能である。（例えばユーザー情報を1レコード作成する時にemailカラムの値は`test@example.com`でpasswordカラムの値は`p@ssw0rdという文字列がハッシュ化された物`を指定する場合）

    ```php
    $this->user = User::factory()->createOne([
        'email' => 'test@example.com',
        'password' => Hash::make('p@ssw0rd')
     ]);
    ```

# 参考文献

- [https://readouble.com/laravel/9.x/ja/database-testing.html](https://readouble.com/laravel/9.x/ja/database-testing.html)
2直線のなす角 「21年 公立千歳科技大 理工 1(2)」をwolframalphaとsympyでやってみたい。

オリジナル
y=1/3x+1 と y=2x−3が なす角θ 
2直線のなす角の問題。となると，「オーソドックスな解答」は、tanの加法定理しかありません。＜

(参考)数学入試問題

https://kamelink.com/blog/2022/07/21/3-4-21-kouritutitosekagidai-rikou-1-2/

(参考)T氏の数学日記

https://mathmathmass.exblog.jp/31326454/


# 参考
すみません。全部で解法が何パターンあるのか、まとめきれませんでした。

https://qiita.com/mrrclb48z/items/42a8f5e8e6ff63303a50


# wolframalphaで(tanの加法定理より)オーソドックスな解答
(勉強中)

# wolframalphaで(「なかけんの数学ノート」より)

https://www.wolframalpha.com/input?i=arctan+2-+arctan+1%2F3&lang=ja

別の形:π/4

# wolframalphaで(内積の定義より)
3:1→1:3

https://www.wolframalpha.com/input?i=%281*2%2B3*1%29%2F%28sqrt%281%5E2%2B3%5E2%29*sqrt%282%5E2%2B1%5E2%29%29&lang=ja

結果 sqrt(2)/2

# wolframalphaで(Angle Between Vectors)
<1,1/3>
<1,2>
を代入しました。

https://www.wolframalpha.com/widgets/view.jsp?id=30e58abb328b85fd43398973f4daa190

# sympyで
(勉強中)
「2直線のなす角(The angle between two lines)」について調べてみた。

この４つの角１つ１つを，「２直線のなす角」といいます。（「２直線のつくる角」という場合もあります。）＜

https://kou.benesse.co.jp/nigate/math/a14m0314.html

(参考)21年 公立千歳科技大 理工 1(2)では、
0度以上90度以下。狭い?方の角度でした。


以下の「なかけんの数学ノート」様が一番わかりやすいと思いました。
θ=135°-75°　　
直線の傾きから角度を考える。＜

https://math.nakaken88.com/textbook/basic-trigonometric-functions-angle-between-lines/

# 計算パターン
詳細は下の「googleで」から、参照して下さい。
すみません。全部で解法が何パターンあるのか、まとめきれませんでした。
(1)タンジェントの加法定理と，直線の傾き=\tan=tan であることを使って解きます。----オーソドックスな解答
(2)二直線のなす角を求める方法1(tan)
(3)二直線のなす角・ベクトルのなす角... 方向ベクトル?
(4)二直線のなす角を求める方法2(cos)... 法線ベクトル.検定教科書?
....


# 計算例

https://www.wolframalpha.com/input?i=arctan+x-+arctan+y&lang=ja

mなんたらかんたら......
「google translate (English version)」もありました。

https://w3e.kanazawa-it.ac.jp/math/category/kika/zutohouteisiki/henkan-tex.cgi?target=/math/category/kika/zutohouteisiki/2tyokusenn-no-nasukaku.html

# googleで

https://www.google.com/search?q=2%E7%9B%B4%E7%B7%9A%E3%81%AE%E3%81%AA%E3%81%99%E8%A7%92&client=ms-android-huawei&sxsrf=ALiCzsbCd38TYUa6JSvksQuqAmjjbGIFfw%3A1658627844037&ei=BKfcYvu4AZPL2roP5tmj6As&oq=2%E3%81%A1%E3%82%87%E3%81%8F&gs_lcp=ChNtb2JpbGUtZ3dzLXdpei1zZXJwEAEYADIHCAAQgAQQBDIHCAAQgAQQBDIHCAAQgAQQBDIHCAAQgAQQBDIHCAAQgAQQBDIHCAAQgAQQBDIHCAAQgAQQBDIHCAAQgAQQBDoHCCMQsAMQJzoHCAAQRxCwAzoHCCMQ6gIQJzoECCMQJzoLCAAQgAQQsQMQgwE6CAgAEIAEELEDOg0IABCABBCxAxCDARAEOgoIABCABBCxAxAESgQIQRgAUM4NWNhdYIloaAJwAXgCgAHlAYgBjyKSAQYwLjMwLjGYAQCgAQGwAQ_IAQnAAQE&sclient=mobile-gws-wiz-serp

https://www.google.com/search?q=The+angle+between+two+lines&client=ms-android-huawei&sourceid=chrome-mobile&ie=UTF-8

<math xmlns="http://www.w3.org/1998/Math/MathML">
  <mstyle displaystyle="true">
    <mo>=</mo>
    <mfrac>
      <mrow>
        <mo>tan</mo>
        <msub>
          <mi>&#x3B8;</mi>
          <mn>2</mn>
        </msub>
        <mo>&#x2212;</mo>
        <mo>tan</mo>
        <msub>
          <mi>&#x3B8;</mi>
          <mn>1</mn>
        </msub>
      </mrow>
      <mrow>
        <mn>1</mn>
        <mo>+</mo>
        <mo>tan</mo>
        <msub>
          <mi>&#x3B8;</mi>
          <mn>2</mn>
        </msub>
        <mo>tan</mo>
        <msub>
          <mi>&#x3B8;</mi>
          <mn>1</mn>
        </msub>
      </mrow>
    </mfrac>
  </mstyle>
</math>

# wikipediaで
加法定理
逆三角関数の和に関する公式

https://ja.wikipedia.org/wiki/%E4%B8%89%E8%A7%92%E9%96%A2%E6%95%B0%E3%81%AE%E5%85%AC%E5%BC%8F%E3%81%AE%E4%B8%80%E8%A6%A7#%E5%8A%A0%E6%B3%95%E5%AE%9A%E7%90%86

Arctangent[13]

https://en.wikipedia.org/wiki/List_of_trigonometric_identities#Angle_sum_and_difference_identities


# 入試問題



https://kamelink.com/exam/index.php?%BF%F4%B3%D8II%A1%A6B%A5%C1%A5%A7%A5%C3%A5%AF%A1%F5%A5%EA%A5%D4%A1%BC%A5%C8%A1%A1%C2%E83%BE%CF%A1%A1%A1%F81%B2%C3%CB%A1%C4%EA%CD%FD%A1%A14.2%C4%BE%C0%FE%A4%CE%A4%CA%A4%B9%B3%D1
WSLでVisal Studio Codeを使用する

## WSLでVisal Studio Codeを使用


①wsl インストール
```
PS C:\> wsl --install -d Ubuntu-20.04
ダウンロード中: Ubuntu 20.04 LTS
インストール中: Ubuntu 20.04 LTS
Ubuntu 20.04 LTS はインストールされました。
Ubuntu 20.04 LTS を起動しています...
PS C:\>
```

②Ubuntuの初期設定

```
nstalling, this may take a few minutes...
Please create a default UNIX user account. The username does not need to match your Windows username.
For more information visit: https://aka.ms/wslusers
Enter new UNIX username: ari
New password:
Retype new password:
passwd: password updated successfully
Installation successful!

The list of available updates is more than a week old.
To check for new updates run: sudo apt update
```

③Windows側でVSCodeにRemote WSL 拡張機能インストール

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2724457/946f9b43-44f1-0919-9ecc-963cc4212951.png)

③VS Code起動
```
ari@DESKTOP-LK1B8U6:~$ code .
Installing VS Code Server for x64 (3b889b090b5ad5793f524b5d1d39fda662b96a2a)
Downloading: 100%
Unpacking: 100%
Unpacked 2822 files and folders to /home/ari/.vscode-server/bin/3b889b090b5ad5793f524b5d1d39fda662b96a2a.
```

※gitの接続方法
https://qiita.com/AwsEngineer-kagoshima/items/7009f14de677ed8158a3
cscの作法 その254

# 概要
cscの作法、調べてみた。
練習問題やってみた。

# 練習問題
pem秘密鍵ファイルからJsonWebKeyを生成せよ。

# 方針
pem読み込みにBouncyCastleを使う
RSACryptoServiceProviderに変換
xml読み込んで、ExponentとModulusを使う
base64url使う

# サンプルコード

```
using System;
using System.IO;
using System.Security.Cryptography;
using Org.BouncyCastle.X509;
using Org.BouncyCastle.Math;
using Org.BouncyCastle.Asn1.X509;
using Org.BouncyCastle.Asn1.Pkcs;
using Org.BouncyCastle.Crypto.Operators;
using Org.BouncyCastle.Security;
using System.Collections.Generic;
using System.Text;
using Org.BouncyCastle.Asn1;
using Org.BouncyCastle.Crypto;
using Org.BouncyCastle.Crypto.Generators;
using Org.BouncyCastle.Crypto.Parameters;
using Org.BouncyCastle.Crypto.Prng;
using Org.BouncyCastle.OpenSsl;
using Org.BouncyCastle.Pkcs;

	class test0 {
		static void Main() {
			AsymmetricCipherKeyPair privateKey;
			using (var reader = new StreamReader(@"privatekey.pem", Encoding.ASCII))
			{
				var pemReader = new PemReader(reader);
				privateKey = (AsymmetricCipherKeyPair) pemReader.ReadObject();
			}
			var rsaParams = DotNetUtilities.ToRSAParameters((RsaPrivateCrtKeyParameters) privateKey.Private);
			RSACryptoServiceProvider csp = new RSACryptoServiceProvider();
			csp.ImportParameters(rsaParams);
			File.WriteAllText("privatekey.xml", csp.ToXmlString(true));
			var privateKey2 = File.ReadAllText("privateKey.xml");
			var rsa = RSA.Create();
			rsa.FromXmlString(privateKey2);
			var publicParameters = rsa.ExportParameters(false);
			var e = Convert.ToBase64String(publicParameters.Exponent).TrimEnd('=').Replace('+', '-').Replace('/', '_');
			var n = Convert.ToBase64String(publicParameters.Modulus).TrimEnd('=').Replace('+', '-').Replace('/', '_');
			var dict = new Dictionary<string, string>() {
				{"e", e},
				{"kty", "RSA"},
				{"n", n}
			};
			foreach (var item in dict)
			{
				Console.WriteLine(item.Key + ": " + item.Value);
			}
		}
	}

```

# 実行結果

```



>bc18
e: AQAB
kty: RSA
n: lrpUlgxTaOLAUNOus45cl_VBOtqoAv1Y3w3ka5VLzxHVgw9Z4gW1t5a1KsbboJQn_u_gG5SJ_FaV4RzlJe_nGxYYep5fcfSHiZPCV__5xl7QJLvh4PzA6vXJ3BJQF7mEx5xvvW2Ga-gTYpfAQppo_OGcjGJ1VLw06x4oNUliz9zH_vUROlNR2Tbhl8xpSUY6LCPJiQvhVbIBC6GJKosfrXXe-rtrGbUrNtsOjGYJk7496_hzHtsrDy-HdBAWKDjdot7GW2ESxybIrVUIDvyNXV9CUyyQmC_jA6_yiAN9xrWK75Un7Eav_bbhOKVGN9DC2JaSoTcjavomP9QMEWjWOxNcCX0f6iONBGDw4FpaYaCRyiqkD_lY1xfAFLEhD_5QY6GWvHgvRSDyjQwV8Mc4ZUORsEX7eN1DUdIZUfJ5lsRFwXuxCnjgzkdi_-RZocPOuaFkjpX_Es0ZcWc8Rb_-dyaJQlVzrQHC7y8LduPa-qotb7vLUjoxp-1g0yGeK6Sy4sXO0UflrrfsIn8vfmW3VNFxhUUJB4ruXw99yAkyGwCWEonYH3GbK09sx-3_cNDZdx9V04q3vp3nMr0jQ2VfF6I5pRGRl6niWUDNH5OFcGOQ6DRBGaaJ-LXXn6dnsvpimPmf38pshYV8OiHVl1o4fP0NxdeQl25XIpGAWJEJJAE
ok

>

```



以上。
laravel Factoryを用いてテストデータを作成する（使用編）

# 概要

- laravelにてFactoryを用いてテストデータを作成する方法をまとめる。

# 前提

- 下記記事の内容を実施して準備が完了していること。
    - [laravel Factoryを用いてテストデータを作成する（準備編）](https://qiita.com/miriwo/items/7d032be9cfb39e9e0a44)

# 方法

1. Featureテストクラスを用意する。
1. setUp()関数に下記の様に記載してFactoryを用いてデータをテーブルに格納する。

    ```FooTest.php
    public function setUp(): void
    {
        parent::setUp();

        モデルクラス::factory()->createOne();
    }
    ```

1. 紐づくテーブルにFactoryを用いて1件のレコードが追加される。
PHP Laravelのプロジェクトをgit cloneする手順

# はじめに

AWSよりFree Tier limit alertが届き、「やばい使ってないインスタンス消さないと」と思い整理したところ、間違えてcloud9で使用しているインスタンスを終了してしまうハプニングがあり、インスタンスを作り直しでgit cloneしました。

PHPを学習し始めたばかりで理解が乏しいですが、今後またgit cloneしなくてはならない場面に遭遇した時の自分のためにも整理してみました。

# 目次
1. [開発環境](#Chapter1)
2. [手順](#Chapter2)
3. [最後に](#Chapter3)
4. [参考文献](#reference)

<!-- 各チャプター -->
<a id="#Chapter1"></a>
# 開発環境

- AWS Cloud9
- PHP 8.0.2
- Laravel 9.21.6
- Composer 2.3.10
- MariaDB 5.5.68

<a id="#Chapter2"></a>
# 手順
今回私が実際に行った手順です。
PHPやLaravelのインストールなど、環境は既に構築されていることを前提としています。

### 1. git clone
ローカルにgitHubのリポジトリをクローンします。
```
$ git clone リポジトリSSH
```

### 2. パッケージをインストール
```
$ composer install
```
これでvendorディレクトリが入りました。
composer.lockがない場合は、下記の記述でもよさそうです。
```
$ composer update
```

### 3. .envファイルを準備
.envファイルを作成します。
ない場合は、.env.exampleの内容を書き換えるか、新しくプロジェクトを作成し、入っている.envファイルのデータベース名を参考にすると間違いなさそうです。（バージョンが違うと中身も違うので。）

新しくプロジェクトを作成するコマンドは下記です。
```
$ composer create-project --prefer-dist laravel/laravel プロジェクト名
```

私は.envのデータベース名だけ編集しました。
```
DB_DATABASE=データベース名
```

.envファイルができたら、アプリケーションキーの初期化を行います。
```
$ php artisan key:generate
```

### 4. マイグレーション
データベースがある場合は、マイグレーションを行います。
```
$ php artisan migrate
```


うまくできない場合は、MariaDBが実行されていない場合があります。（
```
$ sudo systemctl status mariadb
```
でステータスを確認し、inactiveだったら
```
$ sudo systemctl start mariadb
```
でMariaDBを実行させます。


seederがある場合は、下記コマンドも実行します。
```
$ php artisan db:seed
```
これでデータベースにseederで作成したデータを反映させました。


### 5. サーバーを起動して確認
```
$ php artisan serve --port=8080
```
正常に接続できていることを確認します。


<a id="#Chapter3"></a>
# 最後に
PHPの学習をはじめたばかりで理解が浅い上、なぜかPHP 8.0とかMariaDBとかあまり情報がないものから始めてしまったせいで、環境構築の時点からエラー祭りでなかなかスムーズにできませんでした。
理解してみるとgit cloneするだけの手順は割と簡単だったので、ここで挫折しないために記事にしました。

ざっくりとした内容ですが、将来の自分など誰かの役に立てばうれしいです。
次は情報の少ないMariaDBについてまとめる予定です。

<a id="#reference"></a>
# 参考文献
非常に参考になった記事です。
- [cloning laravel project from github（英語）](https://stackoverflow.com/questions/38602321/cloning-laravel-project-from-github)
- [Laravelのプロジェクトをgit cloneしたときの手順](http://vdeep.net/laravel-git-clone)
はじめまして

## 自己紹介
はじめまして、今年で新卒3年目のべあです。

新卒未経験でSES企業に就職しました。
三か月間新人研修を受講し、保守業務に一年間従事したのち、
webアプリケーション開発業務を行っています。
入社後、一年目の冬で基本情報技術者試験、
三年目の春に応用情報技術者試験の資格を取得しました。

## 経験
3か月間の新人研修でC言語、Java、html、cssを学習。
一年間、調べても出てこないほどのマイナーな技術を用いた保守業務に従事。
その後、C++、Reactを用いたWebアプリ開発にプロジェクトの途中から参加、主にコーディング、テストを担当。
設計、環境構築、一からのWebアプリ開発経験はなし。

## 記事に残すこと
webアプリケーションを一から作成した経験がないため、
勉強と転職活動のためにポートフォリオを作成します。

初めての個人開発、Webアプリケーション開発で
疑問に思ったこと、躓いたところ、
調べたことを記載していきます。

主に自分が後で振り返るために記事を残しますが、
同じくwebアプリケーションを一から作成した経験がない方、
未経験で転職活動のためにポートフォリオを作成したいけど
何をすればいいかわからない方のお役に立てれば幸いです。
AuroraとRDSのメンテナンスと再起動の挙動の違い

# はじめに
最近、Auroraのメンテナンスや再起動の挙動を意識することがあったので違いをまとめていきます。

# 1.MultiAZ構成の基本（おさらい）
まずは、MultiAZ構成をとった場合の障害時の挙動をおさらいとして記載します。
## RDSの場合
これは、言わずもがなですが、Primary、Secondaryの２台構成で通常時は同期処理が行われており、障害が発生した場合は、Secondaryへの切り替えが発生します。DNSのエンドポイントの切り替えが発生するため、３０秒程度のダウンタイムがあります。
![スクリーンショット 2022-07-24 13.50.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/584167/4315d267-d540-d8b8-cac2-763987592a16.png)

## Auroraの場合
こちらもほぼ同様ですね。
Auroraの場合、ストレージがAZをまたいだクラスタ構成になっており、書き込みが可能なライターインスタンスと、読み込み専用のリーダーインスタンスで構成されます。（リーダーは複数構成可能だったり、GlobaｌDatabaseなどの構成もありますが、今回は割愛します。）
障害が発生すると、リーダーインスタンスがライターインスタンスへ昇格します。こちらもDNSのエンドポイントの切り替えが発生するため、３０秒程度のダウンタイムが発生します。
![スクリーンショット 2022-07-24 13.52.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/584167/803a71d0-ede3-ddcf-bd36-7517850bbbcb.png)

# 2.メンテナンス時の挙動
パッチ適用や設定変更等を実施した場合の挙動を記載します。
※メンテナンス内容によっては下記に示すフェールオーバーが使用できないケースもあります。（DB エンジンのメンテナンス等、全台同時に実施されるようなものは不可）
https://aws.amazon.com/jp/blogs/news/amazon-rds-online-seminar-20211111/

## RDSの場合
最初にSecondaryで変更、パッチ適用などが実施されます。その後フェールオーバーを実施し、旧Primary側で変更を実施、完了となります。
![スクリーンショット 2022-07-24 13.55.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/584167/c0606ced-6628-f921-9654-c7a65d173325.png)

## Auroraの場合
Auroraの場合も、クラスタ全体への変更が伴うような変更では、RDSのようなローリングアップデートは不可能です。
また、RDSのように自動的にフェールオーバーすることもないため注意が必要です。
まず、各種インスタンスに対して必要な変更を実施します。その後、最初にリーダーインスタンスを再起動します。
リーダーインスタンスの再起動完了後、手動でのフェールオーバーを実施します。
その後ライターインスタンスで再起動を実施し完了となります。
この順番や手順を間違えると、ライターインスタンスの再起動が発生してしまうため、ダウンタイムが長時間となる可能性があります。このあたり、Auroraのほうがちょっと気を使いますね。
![スクリーンショット 2022-07-24 14.05.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/584167/e8400943-f1b9-cada-1029-dab61a6e9b87.png)
![スクリーンショット 2022-07-24 14.05.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/584167/4bac9203-e244-deb8-4c9c-9224106fddee.png)

# ３.再起動時の挙動
## RDSの場合
２．メンテナンス時の挙動に記載したものと同様の動きです。※明確にフェールオーバーありを選択する必要があります。

## Auroraの場合
Auroraの場合ライターインスタンスを再起動すると、自動でリーダーインスタンスが再起動します。
特にフェールオーバーは実施されないので、注意が必要です。
逆にリーダーインスタンスを再起動しても、ライターインスタンスは再起動されないため、この仕組を利用し、
最初にリーダーインスタンスを再起動、フェールオーバーを実施し、旧ライターインスタンスを再起動といった順番で実施するとダウンタイムが最小限となります。
![スクリーンショット 2022-07-24 14.11.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/584167/a9eeb84b-9f12-e709-ac03-dc2f22973f64.png)

# Tips
Auroraにはゼロダウンタイムのパッチ適用の機能があります。対象のバージョンが限定されているので注意が必要なのと、必ず利用できるものではありませんが、１分程度のスループット低下でパッチ適用が可能という、すごい機能なので、是非活用してみるとよいかと思います。
https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/USER_UpgradeDBInstance.PostgreSQL.html#USER_UpgradeDBInstance.PostgreSQL.Minor.zdp

# まとめ
RDSとAuroraのメンテナンスや挙動の違いって結構あるものだなぁと思いました。
運用時に気をつける必要が結構あるなぁと

# 参考
https://aws.amazon.com/jp/premiumsupport/knowledge-center/rds-required-maintenance/

https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/USER_RebootCluster.html

https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/Aurora.Modifying.html
laravel Factoryを用いてテストデータを作成する（準備編）

# 概要

- laravelにてFactoryを用いてテストデータを作成する方法の準備をまとめる。

# 前提

- マイグレーションファイルの記載及びマイグレート、モデルクラスの最低限の作成が完了していること。

# 方法

1. Factoryの準備
    1. artisanコマンドを用いてファクトリークラスを作成する。
    1. Factoryを下記のように記載する。

        ```FooFactory.php
        <?php
        
        namespace Database\Factories\Content;
        
        use Illuminate\Database\Eloquent\Factories\Factory;
        use App\Models\モデルクラス;
        
        /**
         * @extends \Illuminate\Database\Eloquent\Factories\Factory<\App\Models\Model>
         */
        class ContentFactory extends Factory
        {
            protected $model = モデルクラス::class;
        
            /**
             * Define the model's default state.
             *
             * @return array
             */
            public function definition()
            {
                return [
                    'カラム名' => 投入するデータ,
                ];
            }
        }

        ```

    1. definition()関数の例を下記に記載する。（contentカラムにStrファサードを用いて255文字のランダムな文字列を格納する例を記載）格納するデータはもちろん当該カラムの制約に一致しているものである必要がある。

        ```FooFactory.php
        use Illuminate\Support\Str;

        public function definition()
        {
            return [
                'content' => Str::random(255),
            ];
        }
        ```

1. モデルクラスの記載
    1. 当該のモデルクラスを開き下記の関数を記載する。（静的関数なので注意）準備はこれで完了となる。

        ```Foo.php
        public static function newFactory()
        {
            return 先に定義したFacotryクラス::new();
        }
        ```

    1. 次は[laravel Factoryを用いてテストデータを作成する（使用編）](https://qiita.com/miriwo/items/2e455353c5935bd13e33)で使い方を説明する。
複数Office文書のPDF変換処理を並列化してみた

## はじめに

複数Office文書を同時にPDF変換してみました。
※ [[LibreOfficeのsofficeコマンドでOffice文書をPDF変換してみた](https://qiita.com/mingchun_zhao/items/bb7166b808bfbccf39fa)]も合わせてご参照ください。

## やりたいこと

複数Office文書のPDF変換にかかる時間を短縮したい。

## 解決方法

Office文書別、異なるユーザプロファイルを指定しsofficeコマンドをバックグラウンド実行する。

## 前提知識: [LibreOfficeのユーザプロファイル](https://wiki.documentfoundation.org/UserProfile/ja)

- ユーザーに関連するすべてのデータを格納するフォルダ
    - 拡張機能やカスタム辞書、テンプレートなど
- LibreOfficeをアンインストールやアップデートしても削除されない
    - カスタマイズした内容は保存される
- デフォルトの格納場所
    - Windows: `%APPDATA%\libreoffice\4\user`
    - Linux: `/home/<ユーザー名>/.config/libreoffice/4/user`
    - macOS: `~/Library/Application Support/LibreOffice/4/user`

## 検証環境

- Ubuntu 20.04 LTS

## 検証シナリオ

同時に三つのExcelファイルをPDF変換してみます。

- sofficeコマンド実行方法
    - 異なるユーザプロファイルパスを指定し、バックグラウンド実行

### 元のユーザプロファイルをコピーし、新しいユーザプロファイルを三つ作成

```
mkdir /tmp/user1
cp -r $HOME/.config/libreoffice/4/user /tmp/user1/
mkdir /tmp/user2
cp -r $HOME/.config/libreoffice/4/user /tmp/user2/
mkdir /tmp/user3
cp -r $HOME/.config/libreoffice/4/user /tmp/user3/
```

### sofficeコマンドを、バックグラウンドで並列実行

```
soffice -env:UserInstallation=file:///tmp/user1 --headless --convert-to pdf test1.xlsx --outdir ./out &
soffice -env:UserInstallation=file:///tmp/user2 --headless --convert-to pdf test2.xlsx --outdir ./out &
soffice -env:UserInstallation=file:///tmp/user3 --headless --convert-to pdf test3.xlsx --outdir ./out &
```

## 処理時間の比較

- Excelファイルを一つのみ変換(サイズは3MB)
    - 6秒
- Excelファイルを三つ順次変換(サイズはそれぞれ3MB)
    - 18秒 
- Excelファイルを三つ並列変換(サイズはそれぞれ3MB)
    - 6秒

同時実行により処理時間が短縮できました。

## おわりに

複数Office文書を同時にPDF変換してみました。
大量PDF変換で時間短縮したい場合使えるかもしれません。
Cocos CreatorでHello TypeScript

今回は、Cocos Creatorのプロジェクトを作成する際の雛形プロジェクトHello TypeScriptの紹介です。
Hello TypeScriptは、所謂、Hello WorldのCocos Creatorプロジェクト版です。

# Hello TypeScriptプロジェクト作成

まずは、Hello TypeScriptのプロジェクト作成からはじめます。
Cocos Dashboardを起動すると、下のようなウィンドウが表示されます。
「New」ボタンをクリックします。

![DashBoard.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2708476/4413901a-897b-7e33-fbcd-732ca4e7a11a.png)


次に、下のようなウィンドウが表示されます。
フォルダーアイコンのようなものが、３つ並んでいるうちの中から、「Hello TypeScript」を選択します。
選択したら、Name欄のプロジェクト名にHello_TypeScriptと入力します。（プロジェクト名なので任意です）
Location欄は、プロジェクトを作成するフォルダパスを指定します。（任意です）
「Create」ボタンをクリックします。

![Hello_TypeScript1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2708476/1ab18598-4a2c-de64-013a-c38d8f623ccf.png)

# Cocos Creatorでプロジェクトを開く

Cocos Creatorが起動されると下のようなメイン画面が表示されます。
Sceneパネル上には、Cocosのロゴが表示され、ロゴの下にHello World!が表示されています。
これを再生するとどうなるでしょうか？

![CocosCreatorメイン.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2708476/4adad810-eaeb-d7c3-db00-f12006c41dba.png)

# 実行

Hello World!だった文字がhelloに変わってしまいました。
どういうことでしょうか。
これから、プログラムを解説したいと思います。

![再生.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2708476/f251cc95-1017-6112-d75f-15f5692373a6.png)

# プログラム解説

C言語や他のスクリプトでよく出てくるHello Worldよりは長いですが、それでもこれだけです。

```
const {ccclass, property} = cc._decorator;

@ccclass
export default class Helloworld extends cc.Component {

    @property(cc.Label)
    label: cc.Label = null;

    @property
    text: string = 'hello';

    start () {
        // init logic
        this.label.string = this.text;
    }
}
```

## @property識別子

まずプログラム中の
@property(cc.Label)
label: cc.Label = null;
に注目します。

@propertyは、Cocos Creatorの特異的な識別子です。
@propertyを付けると、この変数がPropertyパネルにパラメーターとして表示されるようになります。下の画像のようにPropertyパネルにLabelというプロパティが表示されています。
スクリプトは、Node TreeパネルのCanvasに紐付けされていますので、Canvasをクリックしてみて下さい。
下の画像のPropertyパネルをみるとHellowolrdというコンポーネントに、Labelというプロパティがあります。これがスクリプトで@propertyを付与した変数になります。

![Canvas_Select.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2708476/e813f894-0b59-3eb2-6083-566d1b44b20b.png)

このように、Cocos Creatorでは、スクリプトが適用されているノードに対して、外部のノードを入力（紐付け）することが可能です。定義する時に型を正しく指定（labelの場合、cc.Label型）しておけば、色々なノードがスクリプトへ渡すことができます。使用用途としては、cc.Nodeやcc.Prefabなどの型を指定することが多いです。

## start()関数内の処理

最後に、プログラム中のstart()関数内の処理について書いてプログラム解説を終えたいと思います。

this.label.string = this.text;

で、text変数に設定された'hello'を、外部から入力されたLabelノードのstring変数に設定しています。実行すると、まずスクリプトのstart()関数が呼び出されるので、この処理で、Hello World!がhelloに置き換わって表示されたということになります。

# まとめ

１.　Cocos Creatorのスクリプト中に@propertyを付与した変数を定義すると、そのスクリプトをコンポーネントとして紐付けしているノードのPropertyパネルにプロパティとして変数が表示される。

２.　@Propertyを付与した変数に外部から他のノードを入力することができ、入力されたノードに対してプログラミングで影響を与えることができる

https://panda-ringo.com
SemanticRelease整備メモ

必要なパッケージを全部インストール

```sh
$ npm i -D @semantic-release/changelog @semantic-release/git semantic-release simple-git-hooks @commitlint/config-conventional commitlint
```

```package.json
{
    "scripts": {
        "prepare": "npx simple-git-hooks",
        "commitlint": "commitlint -e $GIT_PARAMS",
    },
      "commitlint": {
    "extends": [
      "@commitlint/config-conventional"
    ]
  },
  "release": {
    "plugins": [
      "@semantic-release/commit-analyzer",
      "@semantic-release/release-notes-generator",
      "@semantic-release/changelog",
      [
        "@semantic-release/npm",
        {
          "npmPublish": false
        }
      ],
      "@semantic-release/github",
      [
        "@semantic-release/git",
        {
          "assets": [
            "package.json",
            "package-lock.json",
            "CHANGELOG.md"
          ],
          "message": "chore(release): v${nextRelease.version}"
        }
      ]
    ],
    "branches": [
      "main"
    ]
  },
  "simple-git-hooks": {
    "commit-msg": "npm run commitlint"
  }
}
```


```workflow.yml
name: Production
on:
  push:
    branches:
      - main
jobs:
  build:
    name: Build
    runs-on: ubuntu-18.04
    steps:
      - uses: actions/checkout@v2
      - uses: actions/setup-node@v2
        with:
          node-version: 16.x
      - name: Cache dependencies
        id: cache
        uses: actions/cache@v2
        with:
          path: ./node_modules
          key: modules-${{ hashFiles('package-lock.json') }}
      - name: Install dependencies
        if: steps.cache.outputs.cache-hit != 'true'
        run: npm ci
      - run: npx nx build app
      - name: Archive production artifacts
        uses: actions/upload-artifact@v2
        with:
          name: dist
          path: dist
  release:
    name: Release
    runs-on: ubuntu-18.04
    needs: build
    outputs:
      is_released: ${{ steps.result.outputs.is_released }}
      version: ${{ steps.get_version.outputs.version }}
    steps:
      - uses: actions/checkout@v2
      - uses: actions/setup-node@v2
        with:
          node-version: 16.x
      - name: Cache dependencies
        id: cache
        uses: actions/cache@v2
        with:
          path: ./node_modules
          key: modules-${{ hashFiles('package-lock.json') }}
      - name: Install dependencies
        if: steps.cache.outputs.cache-hit != 'true'
        run: npm ci
      - name: Download production artifacts
        uses: actions/download-artifact@v2
      - env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        run: npx semantic-release
```
groupbyの使い方。分かりやすく簡潔に。

## 初めに
データサイエンス100本ノックを行っている、転職を目標とするものです。
groupbyについて忘れていたので復習します。忘備録として。

## 学習。

### groupbyについて。
df上で同じ値を持つデータをまとめる。
そのまとめた塊に対して操作(合計､平均等の算出)をおこなう。

これだけじゃさっぱりですよね。さっさと実例を。

### 実例。

まずはdfを提示致します。行数がとても多いですね…。

![2022-07-24_13h14_52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2719278/8ab3a5a5-2ca0-85f1-114e-dfef9feb428c.png)


そして一旦コードを提示します。


```python
df_amount_sum = receipt.groupby('customer_id').amount.sum().reset_index()
df_amount_sum.head(5)
```
これが結果。コードも結果も現時点ではさっぱりですよね。

![2022-07-24_13h11_41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2719278/af1bf313-da2f-3703-8056-53994afc5e65.png)

抑えてほしいポイントは、<font color="red">reciptのカラムにcustomer_idとamountがある。</font>**コードと結果も同様のカラムがある**という事です。

つまりreceiptの中の'customer_id'と"amount"に何かしらの処理を行っているという訳ですね。

##### 答をお教えします。

'customer_id'の個別データを"amount"の合計を算出できるようにまとめる。という事です。

具体例を提示致します。
例えば､"ZZ000000000000"が複数あるけど、それぞれに個別に"amount"の数値が記載されていますよね。
その複数ある"ZZ000000000000"の列を１列にして、"amount"も合計.sum() を算出しているという事です。画像でも補足致します。

![2022-07-24_13h29_13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2719278/2d0adc69-a0ad-a516-7368-18b710d17b04.png)


## 別例追加。2022/08/02更新
この例も分かりやすいのではないでしょうか。
要素ごとにグループ化した上で平均を算出しております。

```python
#df3のカラムClassから出現回数カウント
df3["Class"].value_counts()

#カラムの固有値、グループごとの集計。
#Classでの値毎にグループでまとめる。その各々の中で
df3.groupby("Class").mean()
```


![2022-08-02_13h49_09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2719278/a5f1a8b2-ed07-f4fd-b9e3-fdb0f63000b2.png)




## 終わりに。
いかがでしょうか？
正直、あまり説明が伝わらなかったのではと思います。それは一重に私の勉強不足です。
文章で説明は難しいですね。これから人に説明できるよう精進を続けてまいります。
CognitoのTooManyRequestsException対策

## 概要
Cognitoのlist_userには時間当たりの実行回数に制限があり、超えると
TooManyRequestsExceptionが発生する。

https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_ListUsers.html

## 対策

configでretry処理を追加する。
modeはstandardを指定する必要がある。
legacyではTooManyRequestsExceptionには対応していない。

```python:cognito_config.py
import boto3
from botocore.config import Config

config = Config(
   retries = {
      'max_attempts': 10,
      'mode': 'standard'
   }
)

cognito_client = boto3.client('cognito-idp', config=config)
```

https://boto3.amazonaws.com/v1/documentation/api/latest/guide/retries.html
Google Cloud Professional Cloud Architectに実務経験なしで合格したので勉強方法を書いておく

# はじめに
Google Cloud Professional Cloud Architectに合格したので、勉強方法を書いておきます。

# 前提条件
AWSメインのクラウド基盤のエンジニア。最近Top Engineers(Service)、ALL Certificate Engineersに認定されました。
AWSはSAP on AWS以外の資格取得済み、Azure Solution Architect Expert取得済み。
そろそろGCPにも手を出したいと思い、挑戦しました。Google Cloud Associate Cloud Engineerは取得済み。

# 勉強方法

## 1. Google Cloud Associate Cloud Engineerを取得する。
勉強方は以下に記載しています。
https://qiita.com/Regryp/items/1b8d123d136eadf72103

個人的に、AWSを理解しているうえで、差分が大きいなとか、重要だなと思ったのは以下です。
・IAM（基本ロール、事前定義ロール、カスタムロール）
・リソース階層（プロジェクト、組織、フォルダなど）
・ComputeEngineのライブマイグレーション、マシンイメージ
・VPCのリージョン、ゾーンの考え、デフォルトネットワーク
・ロードバランサの種類（グローバルとか、SSLプロキシとか）
・CloudStorageのストレージクラス
・GKEのスケーリング
・AppEngineのデプロイとスタンダードとフレキシブル環境の違い
・SQLサービス（ClouｄSQL、CloudSpanner）
・NoSQL（Datastore、Bigtable）
・データ分析関連（BigQuery、CloudPub/Sub、 Dataflow、DataProcなど）
・監視関連（Logging、デバッガーなど）
・Anthos

## 2. 問題集を解く
いつもお世話になっているUdemyです。
このあたりの問題集を２周ほどときました。
解説を読んで、理解すると細かい部分が理解できます。
問題集を解きながら、あれ、これ、Associateと難易度あまり変わらないのでは。。。。と思いました。

https://www.udemy.com/course/google-cloud-professional-cloud-architect-i/

https://www.udemy.com/course/google-professional-cloud-architect-gcp-pca-exams/


## 3. 模擬試験をとく
公式サイトより模擬試験が無料で受けられます。
こちらをときました。

https://cloud.google.com/certification/cloud-architect?hl=ja

# まとめ
Professional Cloud Architectの出題範囲、難易度はあまりAssociateと変わらず・・・といった印象でした。
Associateを受験された方は間髪入れずに受けても良いのかなと思います。
違いが結構あれば、出題範囲やらを解説しようかと思ったのですが・・・
取りやすい資格といった意味でもGCPの概念を理解するといった点でもおすすめの資格です。

# 参考にさせていただいたページ
https://blog.g-gen.co.jp/entry/professional-cloud-architect
SEのマインドその①

先日、上司から言われたことが印象に残っているのでその備忘的な意味で投稿します。

本題の前に
---
本題に行く前に軽く自己紹介をしておくと、私は入社7年目のインフラ寄りのSEです。
業界の中でも相当大きな会社（いわゆるSIer）なので、お客さんの発注を直接受ける
立場にあります。
（※元々は子会社に入社したのですが、統合により親会社所属となりました）

入社してからは、ずっと同じお客さんの同じプロジェクトでインフラの運用・管理を
担当しています。
厳密には、一度EOSLで新システムへの移行もあったのですが、その時私は現行側の
担当だったので、直接移行作業に関わることはありませんでした。

それはおかしいぞ
---
飲み会の席で上司に「入社以来ずっと同じプロジェクトです」と伝えた時の開口
一番がそのセリフでした。

その上司は最近に転属してきた方で、これまで様々なプロジェクトを渡り歩いてきた
経歴を持っており、大体2~3年スパンで転属をしてきたそうです。

その方からすれば、同じ場所にずっといてもエンジニアとしての価値は伸びないとの
こと。

このセリフを聞いた時、私は衝撃を受けたと同時に納得以外ありませんでした。
勿論、長年いることでそのプロジェクトへの理解度は高まるし、トラブル時の対応も
迅速化していくなど意味が無いとは思いません。
ですが、似た業務をずっとやり続けることで価値が伸び続けるかと言われると
頭を捻るところです。

もし、会社が倒産して次の職場を探さなくてはならなくなった時、SEとして働いて
きた年数は評価対象でしょうが、何を行ってきたかと言われた時に十分なアピールが
出来るでしょうか？

少なくとも私だと、毎年似たようなことしかしてないなと思ってしまうのでアピール
なんて出来ないでしょう。

そもそも、なんで疑問に思わなかった？
---
そんな当たり前のことを言われても、なんて思った方もいるかもしれません。
ですが、私がそう思えなかった理由は単純で、周りの社員の方がずっと同じ
プロジェクトにいるからです。

うちの会社でそのお客さんのプロジェクトに配属されている人は大体15人くらい
でしょうか。そのうち大半が40歳以上のいわゆるベテランであり、同時に10年以上
同じプロジェクトで働いています。中には15年、20年近くの方もいます。

そんな環境に配属されたらどう思うでしょう？
自分も同じ道を辿るんだろうなと思うのは自然ではないでしょうか。
最初に抱いたその認識が、いつの間にかSEとして働く一般常識のように自分の中で
形成されていたので、上司の言葉には驚かされたのです。

まとめ
----
SEとして同じ場所に留まり続けることに意味が無いとは言いません。
ですが、似た業務をこなし続けることは「今のままで十分に働けている」という
考えを生み出し、成長を止めてしまう可能性も孕んでいると思います。

自らの価値を自ら築きあげていくために、私と一緒に新しい場所を探す意識を
持ちましょう。
FUTABA RS30x系 TTL サーボの強力書き換えツール

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565043/a41cd967-f549-8677-1efa-2e99bf69518d.png"> DIOS DIAL DIALMA MADI

# FUTABA RS303MR, RS304MD, RS306MD

FUTABAのコマンドサーボモーターには上記の３線半二重TTL通信のシリーズと４線RS485方式のものがあります。
このうち３線半二重TTL通信のシリーズについて、ESP32DevkitCと接続して強力なサーボ設定が行える[**MADIwrite**](https://github.com/Ninagawa123/MADIwrite_Futaba_RS30xTTL)というツールをつくってみました。

https://github.com/Ninagawa123/MADIwrite_Futaba_RS30xTTL

# MADIwriteの強力なところ
* 設定通信速度やIDが不明なサーボも一発で復活できます。
* 通信速度を公式の3倍の691,200bpsまで設定可能です。
* ファクトリーリセットが可能です。
* その他のサーボ設定も変更可能です。


# 使い方
サーボを１個だけ接続し、ソースコードにサーボ設定を書き、ボードに書き込みます。
書き込み後にサーボが動けば成功です。
サーボは＋60度→-60度→0度→(休止)→+60度... と繰り返し動くので、回転方向の設定についても目視確認できます。
また0度の時にサーボ線を抜けばセンター出しにもなります。

# しくみ
新しい通信速度の設定について、可能性のある通信速度の全種類のについて書き込みとリブートを繰り返すため、書き込み終了時には指定した通信速度になるというからくりです。
ESP32は通信速度が速いため、Arduinoでは難しいサーボの上限までの通信速度設定ができます。（Arduinoでもサーボの高速通信の設定はできますが、設定後の速度にArduinoが追いつけないため戻せなくなります。）
Teensy等でもシリアルやENピンを変更すれば使えると思いますがまだ試していません。

# 今後
接続中のサーボの全インフォメーションを取得できるようにしようと思っています。
現在はある程度のデータをサーボ自体から読み込み、表示するようにしてあります。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565043/d4f95bf6-cd47-2049-31ce-3fcfcb547040.png" width = 300>
ラズパイのOSがUbuntuで、KubernetesのCNIを追加したらエラーになった場合の対処法

## 概要

UbuntuをインストールしたラズベリーパイをKubernetesのノードに追加して、CalicoやFlannelでCNI（Container Network Interface）の設定をしようとしたら上手く動かずにハマる…。試行錯誤してようやく解決したので、その方法をご紹介。

## 環境

* Kubernetesのバージョン : v1.24.3
* ノード
    * master
        * Linuxマシン（ラズパイではない）
        * OS : Debian GNU/Linux 10 (buster)
        * CPUアーキテクチャ : x86_64
    * worker
        * Raspberry Pi 4 Model B 4GB
        * OS : Ubuntu 22.04 LTS
        * CPUアーキテクチャ : aarch64

## 発生現象

ラズパイのノード追加は問題なくできるが、以下記事（自筆）の方法などでPod間通信の設定をしようとすると、上手く行かない。

https://qiita.com/showchan33/items/e0cce753d9c7c646a983

例えばCalicoで設定しようとした場合に、ラズパイにデプロイされるcalico-nodeというPodが再起動を何度も繰り返す事態となる…。（Flannelの場合は、kube-flannel-dsでPod同様の現象が発生）

## 原因と解決法

どうやら、**ラズパイにVXLANの設定が出来ていなかった**ことが原因だった模様。

以下の記事を参考にして、``linux-modules-extra-raspi``をインストールして解決
https://bugs.launchpad.net/ubuntu/+source/linux-raspi/+bug/1947628

インストールと設定手順

```
$ sudo apt update -y && \
  sudo apt install -y linux-modules-extra-raspi
$ sudo reboot now
```

再起動したらPod間通信できるようになった！

現時点で確認したのはラズパイをWorkerノードにした場合のみだが、Masterノードにしてもこれで問題なく動くはず。

## 補足：VXLANのメモ

VXLANについてよくわかっていない上でのメモ。

Kubernetesの異なるノードにPodがデプロイされた際に、それらのPodが「共通に属するネットワーク」を作りたい。そんなネットワークを作ってくれるのがCalicoやFlannel等のCNIと呼ばれるもの。
そのためには、IPアドレスの異なるノードを跨ってネットワークを作る必要があるが、VLAN（Virtual LAN）では実現不可能。
そこでVLANよりも拡張性の高いVXLAN（Virtual Extensible LAN）を使う必要がある。
CPUの高速化技術

# パイプライン処理
逐次制御方式で命令を実行していくと
命令の取り出し、命令の解読、対象データの呼び出し、命令実行どれか一つが動いているがそれ以外は動いていないことになる。
そうすると、動いていないところは無駄になってしまう。
そのために```複数の命令を同時に行うことによって無駄を無くして、命令の速度を速くできる。```
これを```パイプライン処理```という。

例で３つの命令を実行すると１２クロック掛かるがパイプライン処理を行うと、６クロックでできる。
命令実行手順の各段階のことを```ステージ```と言う。
## 気づき
CPUは大変だな。
パイプライン処理は忙しいけどすごいな。
ステージはgitみたいだ。

## 分岐予測と分岐実行
次から次へと命令を先読みしている。分岐命令が出できた場合は先読み分が無駄になったしまう。これを```分岐ハザード```と言う。

この分岐ハザードを防止するために```この分岐命令が実施される場合次の命令がどれかを予測```する。
これを```分岐予測```という。
そうすることで無駄な待ち時間を生じさせないようにする。

それで```その予測に基づいて分岐先の命令を実行開始```する手法を```投機実行```と言う。
### 気づき
予測をする予測をもとに命令を実行する。しかし予測が外れると分岐ハザードになるのかな。
予測の精度が高くなるほど分岐予測が生きてくるのか。
　
## スーパーパイプラインとスーパースカラ
パイプライン処理をさらに拘束させるための手法
### スーパーパイプライン
* 各ステージの中身をさらに細かいステージに分割する
* １/2クロック単位で実行する方式。論理的には１クロックで２命令を実行可能で、ステージ数が増えれば、各ステージで行う処理はより単純稲荷、動作周波数を上げやすくなる。
    出典　https://gihyo.jp/book/2022/978-4-297-12375-8
#### 気づき
各ステージを細分化させるとはどうやってするのだろうか？

### スーパースカラ
パイプライン処理を行うカイロを複数持たせることで同時に複数の命令を実行できるようにする。

#### 気づき
CPUが複数あるのかな？

## CISCとRISC
CPUのアーキテクチャ（基本設計・設計思想)を紹介
### CISC
CPUに高機能な命令を持たせる。一つの命令で複雑な処理を実現するアーキテクチャ
* ```高機能な命令が実現```できる。
* 命令の追加や変更が```容易```
* 機械語の```プログラム作成が楽```
* 命令の実行速度は```遅い```
* 命令の長さや実行速度が```バラバラ```

### RISC
CPU内部に単純な命令しか持たないしかしハードウェアのみで実装して一つ一つの命令を高速に処理するアーキテクチャ
* ```ワイヤードロジック```によって全ての命令を```ハードウェア的に実装```
* 命令の追加や変更は```難しい```
* 単純な命令があるだけなので手作業による機械語の```プログラム作成は困難```
* 命令の実行速度が```速い```
* 命令の長さや実行速度が```ほどんど等しい```
* パイプライン処理の実行効率が高くなる

#### 疑問　ワイヤードロジックとは？
* ワイヤードロジックとは、マイクロプロセッサ（CPU/MPU）などの内部で命令を実行する際、演算や処理を物理的な素子や配線を組み合わせた論理回路によって直に行うこと。
* チップ内に各命令に対応する回路群を組み込み、これを用いて処理を行う。高速に実行できるが命令ごとに物理的な回路を用意しなければならないため、命令セットが大きいと比例して回路が大規模化してしまう。
* 単純な命令に絞り込んだRISC（Reduced Instruction Set Computer）方式のプロセッサの実行部などで用いられる。
出典 https://e-words.jp/w/%E3%83%AF%E3%82%A4%E3%83%A4%E3%83%BC%E3%83%89%E3%83%AD%E3%82%B8%E3%83%83%E3%82%AF.html#:~:text=%E3%83%AF%E3%82%A4%E3%83%A4%E3%83%BC%E3%83%89%E3%83%AD%E3%82%B8%E3%83%83%E3%82%AF%E3%81%A8%E3%81%AF%E3%80%81%E3%83%9E%E3%82%A4%E3%82%AF%E3%83%AD,%E3%81%AB%E3%82%88%E3%81%A3%E3%81%A6%E7%9B%B4%E3%81%AB%E8%A1%8C%E3%81%86%E3%81%93%E3%81%A8%E3%80%82

* 複雑な処理を行なわない小規模なプロセッサーや、特に高速性を要求される場合に採用される。
出典 https://www.wdic.org/w/SCI/%E3%83%AF%E3%82%A4%E3%83%A4%E3%83%BC%E3%83%89%E3%83%AD%E3%82%B8%E3%83%83%E3%82%AF

#### マイクロプログラム
マイクロプロセッサーの内部処理方法は二通りしかなく、一つはマイクロプログラムで実行する方法、もう一つはこのワイヤードロジックで実行する方法である。
出典 https://www.wdic.org/w/SCI/%E3%83%AF%E3%82%A4%E3%83%A4%E3%83%BC%E3%83%89%E3%83%AD%E3%82%B8%E3%83%83%E3%82%AF

# 出典　
https://gihyo.jp/book/2020/978-4-297-11781-8

https://qiita.com/masatom86650860/items/5c1afbd6cd2845a95aac
長整数型で表せる10進数を4Byte(32bit)の2進数の文字列型に変換するVBAコード

```vb
'↓*******************************************************************************↓
'+-------------------------------------------------------------------------------+
'|  正負の整数の10進数(整数型)を4Byteの2進数(文字列型)に変換
'|
'|  引数 decimalNumber: 10進数（長整数型(long)）-2,147,483,648～2,147,483,647の整数
'|  返値 Dec2Bin:        2進数（文字列型(string)）
'+-------------------------------------------------------------------------------+
Public Function Dec2Bin(ByVal decimalNumber As Long) As String
    Dim cnt As Byte                                 '繰り返し処理用
    Dim blnNeg As Boolean: blnNeg = False           '負値フラグ
    Dim precisionByte as Byte: precisionByte = 4    '精度（Byte数）
    Dim precisionBit As Byte                        '精度（ビット数）
    Dim strTmp As String: strTmp = ""               '途中計算用

    '精度（bit数）を求める
    precisionBit = precisionByte * 8

    '負値の場合
    If decimalNumber < 0 Then
        '後続処理用の負値フラグ
        blnNeg = True
        '10進数で-2147483648の絶対値を取るとオーバーフローするので例外処理
        If decimalNumber = -2147483648# Then
            Dec2Bin = "10000000000000000000000000000000"
            Exit Function
        End If
        '絶対値を取って正の値にする
        decimalNumber = Abs(decimalNumber)
    End If

    '精度（bit数）－１桁の２進数で数値を表記する
    For cnt = 0 To precisionBit - 2
        If (decimalNumber And 2 ^ cnt) <> 0 Then
            Dec2Bin = "1" & Dec2Bin
        Else
            Dec2Bin = "0" & Dec2Bin
        End If
    Next cnt

    '一番上の桁に0を付与して桁数を精度（bit数）にする
    Dec2Bin = "0" & Dec2Bin

    '負値の場合
    If blnNeg Then
        '0と1を反転（「１の補数」を作る）
        Dec2Bin = Replace(Dec2Bin, "0", "a") 'aは仮置き。1以外なら何でもよい
        Dec2Bin = Replace(Dec2Bin, "1", "0")
        Dec2Bin = Replace(Dec2Bin, "a", "1")

        '更に2進数で1を加える（「２の補数」を作る）
        For cnt = 1 To precisionBit
            If Left(Right(Dec2Bin, cnt), 1) = "1" Then
                strTmp = "0" + strTmp
            Else
                Dec2Bin = Left(Dec2Bin, precisionBit - cnt) + "1" + strTmp
                Exit For
            End If
        Next cnt
    End If

End Function
'↑*******************************************************************************↑
```
Windows10 + Python3.10 でサポートされている wheel を確認する

## 概要

wxPython を入れようとして、python3.10に対応しているのがまだスナップショット版だったので、自分の環境に合った wheel を確認しようとした時のコマンド

-------

## 自分の環境

 - Windows 10 Pro
 - Python 3.10

## コマンド

```python
python -c "from pip._internal.utils.compatibility_tags import get_supported; print(get_supported());"
```

## 実行結果

```python
[<cp310-cp310-win_amd64 @ 2879235685504>, <cp310-abi3-win_amd64 @ 2879235684992>, <cp310-none-win_amd64 @ 2879235817216>, <cp39-abi3-win_amd64 @ 2879231961472>, <cp38-abi3-win_amd64 @ 2879235866688>, <cp37-abi3-win_amd64 @ 2879235866944>, <cp36-abi3-win_amd64 @ 2879235867200>, <cp35-abi3-win_amd64 @ 2879235867456>, <cp34-abi3-win_amd64 @ 2879235867712>, <cp33-abi3-win_amd64 @ 2879235867968>, <cp32-abi3-win_amd64 @ 2879231961600>, <py310-none-win_amd64 @ 2879235868800>, <py3-none-win_amd64 @ 2879231961536>, <py39-none-win_amd64 @ 2879235868992>, <py38-none-win_amd64 @ 2879235869184>, <py37-none-win_amd64 @ 2879235869440>, <py36-none-win_amd64 @ 2879235869696>, <py35-none-win_amd64 @ 2879235869952>, <py34-none-win_amd64 @ 2879235870208>, <py33-none-win_amd64 @ 2879235870464>, <py32-none-win_amd64 @ 2879235870720>, <py31-none-win_amd64 @ 2879235870976>, <py30-none-win_amd64 @ 2879235871232>, <cp310-none-any @ 2879235871744>, <py310-none-any @ 2879235871488>, <py3-none-any @ 2879235872000>, <py39-none-any @ 2879235872320>, <py38-none-any @ 2879235872512>, <py37-none-any @ 2879235872768>, <py36-none-any @ 2879235873024>, <py35-none-any @ 2879235873280>, <py34-none-any @ 2879235873536>, <py33-none-any @ 2879235873792>, <py32-none-any @ 2879235874048>, <py31-none-any @ 2879235874304>, <py30-none-any @ 2879235874560>]
```

## 補足

WxPython スナップショットページ

https://wxpython.org/Phoenix/snapshot-builds/

インストールしたスナップショットwheel

https://wxpython.org/Phoenix/snapshot-builds/wxPython-4.2.0a1.dev5449+3ac1e526-cp310-cp310-win_amd64.whl
Atcoder ABC261

# ABC261
## A -  [Intersection](https://atcoder.jp/contests/abc261/tasks/abc261_a)
memo:
空白区切りの入力をmapをもちいて変数に代入する
```
a, b, c, d = map(int, input().split()) 
```
反省点：
大小関係を場合分けするだけの問題だったが時間がかかってしまった考えられる場合を丁寧に数え上げることが大切

```python:ans.py
a, b, c, d = map(int, input().split()) 

if a < c:
  l_1 = min(b-c, d-c)
  if l_1 >= 0:
    print(l_1)
  else:
    print(0)
elif a == c:
  print(min(b-a, d-c))
else:
  l_2 = min(d-a, b-a)
  if l_2 >= 0:
    print(l_2)
  else:
    print(0)
```

## B - [Tournament Result](https://atcoder.jp/contests/abc261/tasks/abc261_b)
memo:
転置行列の求め方　各要素の同じインデックスのところをとってきて行列として保存
```python
B = []
for i in range(N):
  B.append([-r[i] for r in A])
```
反省点：
5分ほどで実装できたので悪くないと思う

```python:ans.py
import numpy as np

N = int(input())
A = []
for i in range(N):
  l = [s for s in input()]
  A.append(l)

for i in range(N):
  for j in range(N):
    if A[i][j] == 'W':
      A[i][j] = 1
    elif A[i][j] == 'L':
      A[i][j] = -1
    else:
      A[i][j] = 0
B = []
for i in range(N):
  B.append([-r[i] for r in A])

if np.allclose(A,B):
  print('correct')
else:
  print('incorrect')

```

## C - [NewFolder(1)](https://atcoder.jp/contests/abc261/tasks/abc261_c)
memo:
重複のあるlistでkeyとなるものを持っていて各要素の登場回数が欲しいときは
`flag_dict = dict.fromkeys(flag, 0)`のようにvalueが0のdictをつくるのではなく
```python
if s not in flag_dict:
    print(s)
    flag_dict[s] = 0
```
とすることで重複のないかつ出現数をvalueとして持つdictを得ることができる.


反省点:
最初はN個の要素をlistにいれてsetで重複を消してdictを作って比較するという方法をとっていたがこれだと時間が膨大にかかってしまったO(N**2)
計算時間も考えながらコードを書くようにしたい

```python:ans.py
N = int(input())

flag_dict = {}

for i in range(N):
  s = input()
  if s not in flag_dict:
    print(s)
    flag_dict[s] = 0
  else:
    flag_dict[s] += 1
    print(s + '(' + str(flag_dict[s]) + ')' )
```