OmniAICreator/Qiita-1.07M huggingface dataset:
AWS Application Composerを使ってS3監視機能を作ってみた

# はじめに
re:Invent2022にて発表された新サービスのApplication Composerを使ってみました。
発表の際、現地でのリアクションも非常に良く、注目サービスの1つだと思います。

# Application Composerとは
GUI画面でserverless系サービスを構築できるサービスです。
GUI画面での操作がリアルタイムにCloudFormationテンプレートに反映されます。
但し単体でデプロイ機能を持っていない為、CloudFormationに出来上がったテンプレートを投入するか、
SAM CLIにてデプロイすることになります。

特徴①
任意のローカルフォルダとの連携が可能です。
サービス利用時にCloudFormationテンプレートの保存先としてローカルフォルダを選択することで、
ローカルフォルダに生成されたテンプレートがGUI画面の操作をリアルタイムに反映してくれます。
弊社ではBOXを使用していますが、BOXフォルダとの連携も可能でした。

特徴②
GUI画面でサービスアイコン同士を線でつなげることで、接続設定を自動でやってくれます。
ハマりやすい接続設定を自動でやってくれるのは嬉しい所です。

# S3監視機能作ってみた
簡単に試せそうな、S3への操作があった際にメール通知する機能を作ってみます。
使用するサービスは「S3」と「SNS」のみです。

## プロジェクトの作成
右上の「Create project」ボタン、又は下部「Create a new blank project」を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2740559/49164ca3-4f6d-5b74-24ac-eb19a9fa3d6a.png)

ローカルフォルダとの連携をするか否か設定します。
連携する場合は「Select folder」ボタンを押下し、任意のローカルフォルダを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2740559/21b919d2-45fa-5baa-df14-8c70b491ea82.png)

ローカルフォルダ連携における、確認が表示されます。
臆することなく「ファイルを表示する」「変更を保存」を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2740559/db27e433-17d3-8eb5-b5de-36548d8ded93.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2740559/5aae7ecd-9f3f-2c67-4a4d-6f9a39259e50.png)

まっさらなプロジェクトが出来上がりました。
この画面を使って構築していきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2740559/02b7fa7c-e07d-6f19-71c6-dcd1fea960df.png)

## プロジェクトの編集
左ペインから「S3」と「SNS」アイコンをドラッグ&ドロップし、サービス間を線で繋げます。
線で繋げることでサービス間の接続設定を自動でやってくれます。
上記操作以外、この画面での操作は何もしていません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2740559/a400a79d-cafa-ecd0-66bc-1a41e81f9e5f.png)

ローカルに自動生成されたCloudFormationテンプレートを見てみると、いい感じに生成されていそうです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2740559/07224ee3-99ee-8cfc-b44e-c0afb4ececcc.png)

## デプロイ
出来上がったCloudFormationテンプレートを、CloudFormationに投入してデプロイしてみます。
問題なくデプロイできました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2740559/0bd46e96-13fa-a214-0c80-885a732427dd.png)

## 動作確認
メールの宛先(サブスクリプション)だけ手動で設定し、S3にファイルをアップロードしてみると...
無事にメール通知が発報されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2740559/48ada02a-7553-7310-0fd2-1a42660e6fc1.png)

# 所感
serverless系サービスは、複雑な構成になってくると接続関係を追うことが大変になるので、
構成図がAWS上に作れる、且つ、CloudFormationテンプレートが自動で生成されるのは非常に便利だと思いました。
PHP（Laravel）環境でstaticおじさんにならない心構え-staticの使いどころ編

# 追記

なし

# はじめに

__いろんな記事を見た結果、圧倒的私流結論をまとめると下記以外はstaticはやめとけデス__

あるときstaticの使い方に悩みました。いつ使うんだこれは、と。
「static　使いどころ　PHP」みたいに検索しても、「クラスのインスタンスを生成することなしに利用できるプロパティやメソッドのこと」とかそんなことしか書いてなかったです。（私感）

聞きたいのはそんなことじゃない。
いつ、どんな時に使うんだよ。

となったので、下記3つの時さえ注意してればOKかなと。
ワタシと同じ気持ちの人はぜひ参考にしてください。私の解釈なのであくまでご参考に。（※ここ違うんじゃないみたいなのは随時受け付けてますので優しくお願いします。）

# staticの使いどころ

### 【其の一】 singleton patternとか

singleton patternとはインスタンスが一つしか存在しないことを保証するパターン。
簡単にコードを記述してみると下記みたいな感じ。
Logger::getInstance()等もこれにあたりますね。

```php:route.php
Route::get('singleton/sample', 'App\Lib\SingletonSampleCall@main');
```

```php:SingletonSampleCall.php
<?php

namespace App\Lib;

/**
 * SingletonSampleCall Class
 */
class SingletonSampleCall
{
    public function main()
    {
        $singletonSample1 = SingletonSample::getInstance();
        $singletonSample2 = SingletonSample::getInstance();
        
        if ($singletonSample1 === $singletonSample2) {
            Log::debug('singletonSample1 is equal to singletonSample2 .');
        } else {
            Log::debug('singletonSample1 is not equal to singletonSample2 .');
        }
        
        $errorCase = new SingletonSample();
    }
}

```

```php:SingletonSample.php
<?php

namespace App\Lib;

/**
 * SingletonSample Class
 */
class SingletonSample
{
    private static $singletonSample;

    private function __construct()
    {
        Log::debug('created instance');
    }

    public static function getInstance()
    {
        // $singletonSampleプロパティにinstanceがセットされていなければ実行
        if (!isset(self::$singletonSample)) {
            self::$singletonSample = new SingletonSample();    
        }

        return self::$singletonSample;
    }
}
```

上記コードを実行したログが以下。
「singletonSample1 is equal to singletonSample2 .」なので作成されたインスタンスが同一ということがわかります。
また、SingletonSampleCallから直接インスタンスを作成しようとするとconstructがprivateの為エラーが表示されます。

```
local.DEBUG: created instance  
local.DEBUG: singletonSample1 is equal to singletonSample2 .  
local.ERROR: Call to private App\Lib\SingletonSample::__construct() from scope App\Lib\SingletonSampleCall
```

### 【其の二】 factory methodとか

MyClass::factory()等のそのクラスのインスタンスを作るためのものです。

### 【其の三】 ヘルパー関数とか

「Arr::add」や「Str::random」などですね。
通常の関数ではなくクラスのstatic functionとして実行するものたちです。

# まとめ

とりあえず上記以外のメソッドは、基本的にはstatic使わずにinstanceで書いておこう。
そうすればstaticおじさんにはならないはず。
そんな感じ。

# 参考リンク

- https://readouble.com/laravel/8.x/ja/helpers.html
- https://qiita.com/buntafujikawa/items/2e8e8f13b6eb2f2f9e64
- https://qiita.com/suin/items/0897adc7dc653b9c20de
非同期処理で立ち上げたlambdaのDLQはFIFOキューに入れられない

当たり前といえば当たり前かもしれないですが、設計時点で気が付かなかったのでメモ。

非同期実行の例としてS3, API Gatewayを想定しています。青い矢印は正常に疎通が取れます。

![名称未設定ファイル.drawio (6).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2882979/1db77976-0ba3-d5dd-fd2d-12ffa2bb4715.png)

# なぜこうなるのか
非同期実行でLambdaへ処理が流れてきたときに、Lambda内で並列的に同時実行されるためだと思います。

要するに、流れてきたときには処理A, 処理B, 処理C, ...という順序で流れてきたものが、再試行後の失敗時にはその順序が(例えば) 処理C, 処理A, 処理B, ...と変わってしまっている可能性が高いためです。

そのためFIFOキューの特徴である順序を保つということが保証できなくなり、仕様上送信できないのではないかと思われます。

**※ですが、console上ではFIFOキューをDLQとして設定できてしまうので要注意**
【VS Code】1つ前に使用したファイルに戻る方法

# 概要
VS Codeでは、ファイル間を行き来することが多々あります。
直前にどのファイルを使用していたか分からなくなり、ディレクトリを1から探してしまう時もあるかも知れません。。。
ファイルを見失った際にも使える、便利なショートカットキーです。

# 方法
「**control**」を押しながら「**tab**」を押します。
![スクリーンショット 2022-12-28 10.49.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1129869/c0aa3412-c85e-b0cb-80b4-558c6b9d8743.png)
これで１つ前に使用したファイルを開くことができます。
（直前に開いたファイルが上から順番に表示されます）

## 2つ前に使用したファイルに戻りたい時
また、２つ前に使用したファイルを開きたい場合は、
「**control**」を押しながら、もう一度「**tab**」を押します。
![スクリーンショット 2022-12-28 10.46.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1129869/f583eb10-6c82-7505-6e5c-3855eb3e2b1b.png)
これで２つ前に使用したファイルに戻ることができます。

## さらにファイルを戻りたい時
「**control**」を押しながら、繰り返し「**tab**」を押します。
そうすると、ファイルを好きなように選び、開くことが可能になります。

# まとめ
以上となります。
ちょっとしたショートカットキーですが、参考になれば幸いです。
Auroraのmysql5.6を8.0にアップグレードする

## 概要
タイトルの通り、先日Auroraのアップグレードを行ったので、備忘として残しておきます
作業の大枠としては、

1. mysql8.0のRDSクラスターを新規作成
1. メンテナンスを入れてアクセスを遮断
1. データ移行
1. アプリケーション側の接続先DBを変更
1. mysql5.6のクラスターを削除

という手順で行いました
他にもバージョンを5.6→5.7→8.0と段階的に上げる方法もあるようなのですが、こちらはアプリ側の接続先を変えなくてもよいというメリットはあるのですが、アップグレード待ちの分メンテナンス時間が長くなります
それに対して上記の手順の場合はアップグレード作業当日の所要時間は短く済み、かつあらかじめデータ移行をしてテストも行うことができるというメリットがあります

## クラスターの作成
バージョン8.0のクラスターを新規作成します。作成方法については一般的なRDS構築手順なので割愛します。
注意点として、パラメータグループはデフォルトのものをそのまま使うとパラメータを後から変更できないので、バージョン8.0用のパラメータグループを作成してアタッチする必要があります
インスタンス用とクラスター用でそれぞれ作成するので以下のようなイメージです

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139602/f9111200-4bfb-9982-c070-d51a0ffe3029.png)

また、パラメータグループの差分についてはパラメータアクション→比較から確認することができます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139602/1c2d3dae-7830-cd67-07a8-4d0477ee64bf.png)


## データ移行
これはmysqldumpを使いました
データ量が多いとバックアップ/リストアでそれなりに時間がかかるので、なかなか終わらなくても不安にならず待ちましょう
またそれなりに負荷がかかるため、リードレプリカがある場合接続先エンドポイントはリーダーインスタンスとするのが良いでしょう

#### バックアップ
```
mysqldump -u USER_NAME -p -h CURRENT_HOST_NAME DB_NAME > OUTPUT_FILE_NAME
```

#### リストア
```
mysql -u USER_NAME -p -h NEW_HOST_NAME DB_NAME < OUTPUT_FILE_NAME
```

また、charasetやcollationがデータ移行前後で一致しているか確認しましょう
```
SHOW TABLE STATUS FROM DB_NAME;

# charaset変更（utf8mb4に変更する場合）
alter table TABLE_NAME default character set utf8mb4;

# collation変更（utf8mb4_general_ciに変更する場合）
alter table TABLE_NAME COLLATE 'utf8mb4_general_ci'
```

## クラスターの削除
削除方法については一般的なRDS削除手順なので割愛します
筆者の場合は何か問題があった場合の切り分けやもしもの時の切り戻し用に一週間はインスタンスを稼働させておき、その後スナップショットを作成した上で削除しました

## まとめ
手順としては意外とシンプルかなと思います
むしろアプリケーション側のテストをどこまでやるかが難しいところですね
OSバージョン取得 VBScript （備忘録） 


```vb
Wscript.Echo GetOSVersion()

' **********************************************************
' Windows 2000 : 5
' Windows XP   : 5.1
' Windows 7    : 6.1
' Windows 8    : 6.2
' Windows 8.1  : 6.3
' Windows 10   : 10
' **********************************************************
Function GetOSVersion()

	Dim obj,colTarget,objRow,str,aData,nData,I

	Set obj = GetObject("winmgmts:\\.\root\cimv2")
	Set colTarget = obj.ExecQuery( "select * from Win32_OperatingSystem" )
	For Each objRow in colTarget
		str = objRow.Version
	Next

	aData = Split( str, "." )
	For I = 0 to Ubound( aData )
		if I > 1 then
			Exit For
		end if
		if I > 0 then
			nTarget = nTarget & "."
		end if
		nTarget = nTarget & aData(I)
	Next

	GetOSVersion = CDbl( nTarget )

End Function
```
Netlify で No such file or directory となって困ったら

[Netlify で UNSUPPORTED BUILD IMAGE となって困ったら](https://qiita.com/ganessa/items/36e128e2f1854ea4ed24)を対応すると以下のような出力となり、ビルドに通らなくなってしまいました。

```
10:51:09 AM: /opt/build-bin/run-build-functions.sh: line 351: /opt/buildhome/python3.7/bin/activate: No such file or directory
```

[Included Software](https://github.com/netlify/build-image/blob/focal/included_software.md)を確認すると、以下のようになっていました。

```
Python - PYTHON_VERSION, runtime.txt, Pipfile
3.8 (default)
2.7
```

以下のように変更すると、無事ビルドが通りました。

```diff:runtime.txt
+ 3.8
- 3.7
```
Netlify で UNSUPPORTED BUILD IMAGE となって困ったら

ひさしぶりにNetlifyで使っているコードを変更するとエラーが出るようになっていました。

```
  UNSUPPORTED BUILD IMAGE
```

`Build image selection`の`Edit settings`を押すと、`(deprecated)`が選ばれていると思いますので、`(default)`の方を選んで、`Save`すると解決します。
OpenCV for iOS ビルド

# はじめに
iOSアプリ開発で最新のOpenCVを使いたい、M1 macを使っていて公式ビルドを使えない、他の記事を参考にビルドするとエラーが起きる、方向けの内容です。ビルドしたいだけの方は最後だけ読んでください。

# 前提
- MacBook Pro M1
- Xcode 14.2
- OpenCV 4.6.0
- cmake 3.24.0

# Lessons Learned
## 公式ビルドはM1に対応していない
最初に一番お手軽な公式ビルドのライブラリを追加してみたのですが、iOSアプリのビルド時に以下のエラーとなります。ログから、x86_64シミュレータ向けビルドのみで、arm64シミュレータ向けのビルドは含まれていない、と解釈しました。Rosettaを使えば何とかなるかもしれませんが、Nativeビルドを選択しました。Excluded Architecturesにフラグを付ける云々の記事がありますが、別問題のようです。

```
Could not find module 'opencv2' for target 'arm64-apple-ios-simulator'; 
found: x86_64-apple-ios-simulator, armv7s, armv7s-apple-ios, armv7-apple-ios, 
i386-apple-ios-simulator, arm64-apple-ios, armv7, at:
```

## 自前ビルドを試みる(失敗する方法)
いくつかの記事を見て、下記のコマンドでビルドしてみました。

```
% python opencv/platforms/apple/build_xcframework.py --iphoneos_archs armv7,armv7s,arm64 --iphoneos_deployment_target 12 --iphonesimulator_archs arm64 -o ./build --build_only_specified_archs --contrib opencv_contrib
```

すると、以下のようなエラーで止まります。ここではまりました。CPU_BASELINE関連で調べて、最適化オプションの無効化等試しましたが上手く回避できなく時間を溶かしました。

```
CMake Error at cmake/OpenCVCompilerOptimizations.cmake:593 (message):
  Compiler doesn't support baseline optimization flags:
Call Stack (most recent call first):
  cmake/OpenCVCompilerOptions.cmake:327 (ocv_compiler_optimization_options)
  CMakeLists.txt:631 (include)
```

## 成功する方法
あれこれ試している過程で、新しいビルド環境がarmv7、armv7sをサポートしていない旨の警告ログが出力されました。ということで、以下のように、arm64のみを指定してめでたく成功です (何も考えずに付けてましたが、iPhone 5とかサポートする必要ないですもんね。。。)

```
% python opencv/platforms/apple/build_xcframework.py --iphoneos_archs arm64 --iphoneos_deployment_target 12 --iphonesimulator_archs arm64 -o ./build --build_only_specified_archs --contrib opencv_contrib
```

後は、Xcodeのプロジェクトで、Link Binary With Libraries にopencv2.xcframeworkと libc++.tbdを追加して、Other Linker Flagsに -all_load を追加すれば良いようでした。
ハイパーリンク式を使用してコンソールでサブタブを開く

[Answersで回答する時に使う情報のまとめに戻る](https://qiita.com/Keiji_otsubo/items/9e6e0e946826133eddc7)

+ [元の質問:Open Subtab in console with hyplink formula](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000H1cCB)

https://dfc-org-production.force.com/forums/ForumsMain?id=906F00000008w2ZIAQ

 _self is opening new subtab in lightning console. I dont want to open link in new subtab. It should override primary subtab. The formula field is- 


```
(" [" &
HYPERLINK("/apex/Sc_UpdateCustomerEnvironment_Update?action=Select&CaseNumid="&Id,"Select", "_self") & "]" &
" [" & HYPERLINK("/apex/Sc_UpdateCustomerEnvironment_Update?action=View&CaseNumid="&Id&"&EnvId="&CustomerEnvironment__c,"View Selected", "_self") & "]" &
" [" & HYPERLINK("/apex/Sc_UpdateCustomerEnvironment_Update?action=Edit&CaseNumid="&Id&"&EnvId="&CustomerEnvironment__c, "Edit Selected", "_self") & "]" &" [" &
HYPERLINK("/apex/Sc_UpdateCustomerEnvironment_Update?action=New&CaseNumid="&Id,"New Environment", "_self") & "]")
```
Azure Administrator(AZ-104)：Azure での ID とガバナンスの管理「Azure ADのセルフサービスパスワードリセット」

Microsoft Learnを用いたMicrosoft Azure Administrator(AZ-104)の試験内容をまとめる投稿です。
この投稿ではMicrosoft Learnで学ぶ内容をできるだけ簡潔にまとめております。
Azureの勉強を一から始め、AZ-900取得後の資格としてAZ-104取得を目指している方の参考になれば幸いです。
※AZ-900の内容は本投稿では省略しております。再度復習したい方は下記をご参照ください。
[Azure Fundamentals(AZ-900)：試験合格に向けた学習内容のまとめ](https://qiita.com/fsd-jume/items/e4ec76959adb547ac5e8)

## 今回の学習内容
**◆「Azure ADのセルフサービスパスワードリセット」**
◇対応するMicrosoft Learn ラーニングパス
[AZ-104:Azure での ID とガバナンスの管理](https://learn.microsoft.com/ja-jp/training/paths/az-104-manage-identities-governance/)
◇対応するモジュール
[Azure Active Directory のセルフサービス パスワード リセットを実装する](https://learn.microsoft.com/ja-jp/training/modules/configure-azure-active-directory/7-implement-self-service-password-reset)

※前回の投稿は下記から確認できます。
[Azure Administrator(AZ-104)：Azure での ID とガバナンスの管理「Azure ADへの参加」](https://qiita.com/fsd-jume/items/1036ba45568d4beaf323)

## Azure ADのセルフサービスパスワードリセット
### Azure ADセルフサービスパスワードリセット(SSPR)機能
**ヘルプデスクを介さずにユーザが自身のパスワードをリセットできる機能**

### SSPR機能の特性と要件
・すべてのAzure ADエディションでサポート
・SSPRオプションを管理するためにグローバル管理者特権のAzure ADアカウントが必要
⇒このアカウントはオプションに関係なく、いつでも自身のパスワードリセットが可能
・セキュリティグループを使用してSSPR特権を持つユーザを制限
・組織内のユーザアカウントのすべてにSSPR使用のライセンスが必要

### SSPR使用の考慮事項
**◆パスワードリセットできるユーザの検討**
・設定によりパスワードリセット可能なユーザを指定可能
　-なし：Azure AD上のすべてのユーザがパスワードリセット不可
　-選択済み：パスワードリセットを有効にするグループを選択
　-すべて：Azure AD上のすべてのユーザがパスワードリセット可能

**◆使用する認証方法を検討**
・認証方法の数とオプションを選択可能
・認証方法の数は1回か2回を選択
⇒認証方法の数を2回にした場合は2種類の方法で認証が必要
・認証方法のオプション(事前にユーザが認証方法を登録しておく必要あり)
　-モバイルアプリの通知(2回の時のみ使用可能)
　-モバイルアプリコード
　-Email
　-携帯電話
　-会社電話(有料サブスクリプションを使用するテナントのみ使用可能)
　-セキュリティの質問
・認証方法は複数選択可能
例)認証方法の数：2回、認証方法：モバイルアプリの通知かコード、Email、携帯電話
⇒1回目は携帯電話で認証、2回目はモバイルアプリのコードで認証してリセットに進むなどが可能

**◆セキュリティを強化するために方法の組み合わせを検討**
・セキュリティの質問は安全性が低くなる可能性があるため、他のオプションとの併用を推奨

## 次の学習内容
**◆Azure ADユーザアカウント**

https://qiita.com/fsd-jume/items/c97ad09e960edf6ef483

## 学習内容をまとめたページの一覧

https://qiita.com/fsd-jume/items/6eda24728c9c03c36bc3
Unity上で録音と再生を試す

音声認識システムを取り込む際に、どうしても音声データの生成を
先にする必要があるのかなということころで
今回は以下のサイトを元に、音声の録音から試していきます。

## 試してみた①
コードへの理解不足で断念。

https://harukichi.hatenadiary.jp/entry/2020/11/23/135044

## 試してみた②
jsonをNugetからDLして動かせるようにしたかったのですが、できませんでした・・・

[Unity上で音声を録音し、録音したデータをWavファイルに保存するコードと、録音したWavデータを再生するコード](https://gist.github.com/micchi-fms/67452ed318187f964cad2ea044ab6300)

## 試してみた③
サンプルまで配布してくれている凄い人がいました

https://github.com/BeatUpir/Unity3D-save-audioClip-to-MP3

が、APIレベルを2まで下げる必要があり（現在の最低ライン：5）、断念・・・。

## 試してみた④

http://yamakengames.seesaa.net/article/455773390.html

自分の理解力のなさに絶望しかけてきました
（折れない心、だいじ）

## 試してみた⑤

https://qiita.com/TyounanMOTI/items/5306336823316b0b289c

## ふと気が付く
したいことは「Unityでwevファイルを生成する」だけだから
普通にmicrophoneだけ使えば・・・よくないか・・・

https://sites.google.com/site/myccom2014/memo/unitydemaikuwo-shiu

ちょっとそれだけで以下のソフトと接続が
いけるか試そうと思います

https://acp.amivoice.com/
年末なので今年の頑張りを定量化して見える化する

# はじめに
年末ですね。
今年を振り返ると「やたら勉強した気がする（漠然）」という感想しか出てこなかったので、定量化してダッシュボードぽくして振り返ってみました。

## それがこちら
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2641841/a1fec4e8-0adb-2218-5554-95d1f44b0d9b.png)


## 仕事用に読んだ本　66冊
月平均で5冊くらい。趣味の本は除いてます。



おすすめは「[コピペで簡単実行　キテレツおもしろ自然言語処理](https://www.amazon.co.jp/%E3%82%B3%E3%83%94%E3%83%9A%E3%81%A7%E7%B0%A1%E5%8D%98%E5%AE%9F%E8%A1%8C-%E3%82%AD%E3%83%86%E3%83%AC%E3%83%84%E3%81%8A%E3%82%82%E3%81%97%E3%82%8D%E8%87%AA%E7%84%B6%E8%A8%80%E8%AA%9E%E5%87%A6%E7%90%86-Python%E3%81%A8Colaboratory%E3%81%A7%E8%BA%AB%E3%81%AB%E3%81%A4%E3%81%8F%E5%9F%BA%E7%A4%8E%E3%81%AE%E5%9F%BA%E7%A4%8E-youwht/dp/4798170267)」 、
思い出深いのは「[データサイエンス100本ノック　構造化データ加工編ガイドブック](https://www.amazon.co.jp/%E3%83%87%E3%83%BC%E3%82%BF%E3%82%B5%E3%82%A4%E3%82%A8%E3%83%B3%E3%82%B9100%E6%9C%AC%E3%83%8E%E3%83%83%E3%82%AF%E6%A7%8B%E9%80%A0%E5%8C%96%E3%83%87%E3%83%BC%E3%82%BF%E5%8A%A0%E5%B7%A5%E7%B7%A8%E3%82%AC%E3%82%A4%E3%83%89%E3%83%96%E3%83%83%E3%82%AF-%E6%A3%AE%E8%B0%B7-%E5%92%8C%E5%BC%98/dp/4802613563)」でしょうか。大変でした。主にDockerの環境構築が。

## 年間のセミナー視聴回数　20回
技術のトレンドを知りたいので、月に１回はセミナーに参加するようにしています。思ったより視聴回数が多く、振り返って面白い点でもありました。

中でも「[脱なんとなく！改善を加速させるデータドリブンデザイン【デザナレVol.13](https://vivivit.connpass.com/event/246327/)」が面白かったです！デザインの領域にデータを活かしていくお話で、夢が広がりました。

他にも安定して[Forkwellさん](https://forkwell.connpass.com/event/)のシリーズを視聴しています。BI、データ基盤系の知識はここから仕入れているといっても過言ではない。


## 取得した資格数　4個
取得しようと思ったけど面倒だったのでやめた資格が7つありました。
来年から頑張ります。

# 来年に向けて
2022年は本を読みまくりながらセミナー見ながら資格の勉強もした１年でした。
そしてインプットの割にアウトプットが足りないと気づきました。反省します。

こういうデータあったら面白かったのに！と思うものはたくさんあったので、来年はデータ収集設計から考えたいですね。~~あとダッシュボードがダサいのもなんとかしたい~~

皆さま1年間お疲れ様でした。来年もどうぞよろしくお願いいたします！
Arduino UNOとSSD1306にアイテムを表示する(drawBitmap)


x 過去ログをみよ

x Adafruit SSD1306 を　インストール
x Adafruit GFX Library を　インストール

x 回路は、Arduinoと同じ

目的
OLEDのテスト

SCL , SCL
SDA , SDA


あいてんどう


★0.96インチ★OLEDモジュール★I2C★ [OLED096UNO-A]

販売価格: 500円(税別)

(税込: 550円)


![o_cop289.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/757f42e4-fce7-6741-7350-76854e1417aa.jpeg)



![o_cop290.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/7d4cb242-986c-bae7-b33e-9a71bcbbd263.jpeg)


![o_cop275.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/efa7dcaf-b3b4-5fe5-7d09-8468cf2f1d42.jpeg)


![o_cop372.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/802b4956-35d1-bacb-06eb-2ed7bc9a18d0.jpeg)



いろいろ
ビットマップ表示がたまたま、ヒットだったので
調子にのってSSD1306でもやってみた
めどがついたので
次で全面パターンでちよつと本気だす。はず


```c++



//OLED_SSD1331_BITMAP_TEST1_UNO


//ヘッダーファイル
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>


//定義
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
#define OLED_RESET     -1 // Reset pin # (or -1 if sharing Arduino reset pin)
#define SCREEN_ADDRESS 0x3C ///< See datasheet for Address; 0x3D for 128x64, 0x3C for 128x32
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);


// ビットマップデータ
uint8_t databytes[8] = 

{

0b01100110,
0b10101111,
0b10111111,
0b11011111,

0b01111110,
0b01111110,
0b00111100,
0b00011000

};


//初期化
void setup() {

  // I2Cアドレスは使用するディスプレイに合わせて変更する
  display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS);

}//setup


//メインループ
void loop() {

  // 画面表示をクリア
  display.fillScreen(BLACK);

  //ビットマップの表示
  display.drawBitmap(0, 0, databytes, 8, 8,  WHITE);

  // 描画バッファの内容を画面に表示
  display.display();


  delay(1000); //1秒待つ

}//loop




```
ReactのFCとVFCってなにが違うの？

Reactを書いていると見かける`FC`と`VFC`がいまいち理解できていなかったけどようやく理解できた気がします。

結論、**React18以降のプロジェクトではこのような記述を見かけることはないはず**です.
React18以前からプロジェクトにReactを導入されている場合に記述が混在している状態になっている可能性もあります。

`FC`と`VFC`が何で、どうするのが良いのかを理解しておくのが無難だと考えています。
レガシーコードを残さないためにも理解して淘汰していけるように心がけましょう！


## `FC`と`VFC`の違い

React17以前では`FC`を定義すると暗黙的にchildrenがpropsの中で定義され定義され、`VFC`では定義されませんでした。
childrenを含むコンポーネントは`FC`、そうでないコンポーネントは`VFC`を利用するのが基本だったようです。

**React18以降では`VFC`が非推奨になり、`FC`から暗黙的childrenが削除されました。**
現在は、propsに対して型を明示するのが一般的だそうです。

```diff_javascript
type A = {
  text: string;
  children: React.ReactNode;
}

- const B: React.FC<A> = (props) => {}
+ const B = (props:A) => {}
```

詳細には理解できていませんが、上記のように記述するのは`FC`の`defaultProps`は非推奨、`displayName`は使われないのとpropsの型定義にジェネリクスを使うとFCに適切な型を定義できないなどの理由で`FC`を利用するケースが減ってきているそうです。

### `FC`の`defaultProps`や`displayName`について
現在では`defaultProps`は非推奨、`displayName`明示的に設定する必要はないとされているそうです。

https://github.com/reactjs/rfcs/blob/createlement-rfc/text/0000-create-element-changes.md#deprecate-defaultprops-on-function-components

https://ja.reactjs.org/docs/react-component.html#displayname

バージョンアップする際は気をつけたいですね…。
そしてこれから新しいバージョンでプロジェクトを作成する時は古い書き方にならないように注意したいと思います。
交渉上手なエンジニアマネージャー、プロジェクトマネージャー達

![23143122.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23130/73e7c146-f676-15cd-1501-4650ef9175d3.jpeg)


昔、テレビドラマで『交渉人』というのが米倉涼子さん主演でありました。

ところ、このタイトル通り『交渉人』って肩書きが付いた人は世の中に、あまり居ないとは、思うが、交渉が上手な人って関心しますね。

# 交渉上手な人
営業面でとんでも無く、ヤヤコシイ状況であっても、その人が登場するとギクシャクしながらも話がまとまる。
プロジェクトフェーズで、納期遅れ、バグ多発。クラアイントが激怒り状態でも、その人が登場するとクライアントが納得して、プロジェクトが問題がありながらも前に進んで行く。
メンバーが混乱して、不安だったり、不平を言っている状態に陥っても、管理者としてあるべき姿へ導いて、全員が納得する形で調整を行い。全員が同じ目的意識を持ち、高いモチベートを持って進んで行く状況に持っていく。

色んな側面での交渉人を目にします。
何が素晴らしいのだろうか。
- 口が旨いのか？
- 見立てが旨いのか？
- 顔が良いのか？

# 交渉人ではない人
交渉人よりも数多く、口が旨いなぁっという人が良く見かける。良くもまぁーそんな屁理屈が出てくるなぁっとか、旨く話しを展開できるなぁっとか思います。
実際、ほとんどの人が交渉人といレベルでは無い。
その場では、自分がMTGの雰囲気を仕切って、調整して、周りを納得させた様に見えるけれども、ほとんどの人が頭の中に？？を持ってしまっている。
この差は大きい。

# 交渉うまい人
この差の大きな原因は、幾つかあると思う。
## １．周りが調整出来てない事を理解できてない
根本的な問題であるが、以外にこういう人は多い。
## ２．本質を理解してない
数多い口の旨い人たちは、問題の本質を理解していない場合が多い。
いや、むしろ理解出来ない人が多い。
論理的な思考を持ってない人間でありながら、口先だけで調整してしまっている場面が多い。
## ３．責任感が無い
調整しようとしている事柄に対して、責任感を持ってない人は、上手く調整しようと立ち回った所で、周りからは不安感が残る
## ４．相手に選択肢を与えない
１，２，３は、基本的にはマインド的な部分が大きい。
テクニカル的な面で行くと、この相手に選択肢を与えるというのは、非常に大きい。
仕切られる側は、一方的に仕切られると納得したくないという意識が働く。
仕切られる側に、選択肢を与えた上で、自分自身が選択したという意識を植えつけることがポイントです。

# まとめ
他にもあると思いますが、責任感をもって、本質を理解しながら、相手に選択肢を与えて、逃げ場を与えるシチュエーションを作れば口先だけで無く全体が納得できる交渉人になる事ができると思います。
相手に選択肢を与えれるには、自分も選択肢を保つ必要があるので、経験も必要ですね。
ひき続き記事を書いていきますので、フォロー、イイねお願いします！
若手エンジニアへ：年末年始の過ごし方

# 準備をしておけば、いつかチャンスはやってくる
エイブラハム・リンカーンの言葉です。
仕事でもプライベートでもよく思います。日頃から、高い視点を持って、自分の夢・目標・理想を持っておく必要がある。
- あるべき姿を常にイメージしておく必要がある。
- イメージしておくと、自然とチャンスがやって来る。
- イメージしておかないとチャンスに気づかないかもしれない。

# イメージを持ったら準備する
そのイメージ対して、具体的に準備もしておく必要もある。準備をしておかないと、チャンスに対して対応できない。
チャンスに来ても準備をしてないと最高の動きが出来ないかもしれない。結構、いきなりのチャンスには動けない事が多い。
例えば、
- 新しい楽しい仕事のために時間に余裕を持っておく
- web3.0ビジネスのためにブロックチェーンの勉強をしておく
- 企業のために知り合いを増やしておく
- 大事な時のために貯金しておく

1年、2年先を具体的にイメージして、しっかりと落とし込んで考えて、準備をする事が必要だし、一ヶ月、二ヶ月先のためにも準備が必要。

# そんなにイメージできなくても
とはいえ、具体的にイメージが湧かない人も多いと思います。そんな人は、色んなイメージの準備を沢山すれば良いだけです。上手く行ってる人もそんなにイメージどおりドンピシャに進んではいません。色んなパターンの流れ、未来をイメージして、沢山準備をしているから色んなチャンスに対応できてるんです。
これって準備があるからチャンスにも気付ける。準備してないとせっかくのチャンスにも残念ながら気付きもしない。

# チャンスはピンチの顔してやってくる
これから人生色んな事が起きると思います。厳しそうに思える事、全く面白そうでない事。でも怖がらずに飛び込んでみましょう。それが実は、チャンスへの扉だったりします。
誰かあなたのチャレンジを見ていて、次のチャンスを与えてくれるかも知れません。知らずしらずにあなたのスキルが上がっているかも知れません。
経験は、人生を豊かにしてくれます。

僕も今年の年末年始は、ReactやSpringbootとか色々と触りながら、改めてプログラミングの勉強をしたいと思ってます。

# まとめ
流れ星が流れてきた瞬間に願い事を伝えるには、日頃から願い事を考えておく必要があります。
流れ星に願いを叶えてもらえる人になるために年末年始、時間がある時に色々と考えてみて下さい。
ひき続き記事を書いていきますので、フォロー、イイねお願いします！
現役PGのポートフォリオ

# 0.簡単なプロフィール
[Don't Pray Debug](https://twitter.com/DebugDon)です。
大学生からプログラミングに触れて数年…
最近、少しプログラミングが分かってきたので、今まで作成した作製を紹介したいと思います。

ネタで作ったものから実用的なモノまでありますので、お楽しみください。
（業務効率化のために作ったものもあるので、役立つと思います）

ちなみに私はWebプログラマ歴は2年ほどです。
元々C++のフレームワークopenFrameworksの使い手でした。

# 1.ポートフォリオ
副業で作製したもの。
遊びで作製中のものもありますが、今回はWebに公開しているモノを紹介します。
## 1.某ハンバーガー店ガチャ
[作品リンク](https://codepen.io/DoNotPrayDebug/full/JjvzzzE)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2870946/ad9bee66-f5af-37df-196b-b6b0a37d6882.png)
始めにWebに公開した作品です。
一般の方も使う事を考えて、レスポンシブルwebデザインで作製してます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2870946/b22e9949-ae1f-a6e4-cad6-3a7ad23eb713.png)
**開発環境**
- フロント:React,TailwindCSS
- バッグ:GAS

## 2.SELECT文生成ツール
[作品リンク](https://codepen.io/DoNotPrayDebug/full/wvXpeBK)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2870946/bdc77912-467a-c9dc-e5d9-47e593f30c9a.png)
A5M2やWebに生成ツールがなかったので
「なければ作ればいいじゃない！」って発想で作りました

サブクエリ？
そこは運用でカバーしてください

**開発環境**
- フロント:React,TailwindCSS

## 3.テンプレート複製ツール
[作品リンク](https://codepen.io/DoNotPrayDebug/full/ZEjQRjg)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2870946/b9977bf9-9827-2386-ba8f-55f013267ae3.png)
テンプレートを置換したデータを複数、欲しいとき。
いちいち1データずつ置換して作成するのが面倒だったので作りました。

**開発環境**
- フロント:React,TailwindCSS

## 4.自作DB用SQL生成器
[作品リンク](https://codepen.io/DoNotPrayDebug/full/XWBdLgX)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2870946/cd0db971-7a77-1b9f-77ec-333ac5561daf.png)

URLに関連した情報を保存する[自作DB](https://qiita.com/DoNotPrayDebug/items/df8e96b8fc157f1fbc1e#2a5m2%E3%81%AE%E5%B0%8E%E5%85%A5%E3%81%8B%E3%82%89%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB%E4%BD%9C%E6%88%90)用に制作しました。

**開発環境**
- フロント:React,TailwindCSS

## 5.ステータス表作成ツール
[作品リンク](https://codepen.io/DoNotPrayDebug/full/bGjMwox)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2870946/966ab0db-cc64-de47-3abb-5f1bd0822488.png)
「自分の能力を数値じゃなくて視覚で見れたら便利やん」
って気持ちから作りました！

UIデザインを少し勉強したので
少しは扱いやすいWebアプリになったと思います

**開発環境**
- フロント:React,TailwindCSS

# 2.終わり
ここまで記事を読んでいただき、ありがとうございます。

連絡や質問をしたい方は[Twitter](https://twitter.com/DebugDon)のDMで受け付けています。
企業、個人どちらとも大歓迎で対応します!
emacs-pkg-boot: Emacs Lispコードをインターネット(URL)からロードする

以下に定義した emacs-pkg-boot という関数を使えば、url上に存在する(ダウンロード可能な).elファイルを直接ロードすることができます。また、第三引数で指定したファイル名で "~/.emacs.d" 配下(または --init-directory (emacs 29 で導入されるオプション) で指定したパス配下)に実ファイルとして保存されるので、オフライン(インターネットに接続していない)時でも前回ダウンロードしたバージョンがロードされます。オンラインの時は常に最新の.elファイルをロードします。(**多分、これが最終版かな？**)
- **.emacs.d 配下にバックアップファイルが作成されないようにしました。**
- **emacs29 の --init-directory=/path に対応しました。**
- **第一引数の feature-name を追加したことにより、ロードされるコードの中で provide を用いていることを前提に多重ロードを防ぐことができるようにしました。(emacs-pkg-boot でロードされるコード同士で疑似requireを実現するため)** ※ provide の使用例は https://github.com/emacs-pkg/xprint/raw/main/xprint.el の最後の行をご覧ください。

```elisp:.emacs or .emacs.d/init.el
(defun emacs-pkg-boot (feature-name url &optional file-name)
  (unless (featurep feature-name)
    (unless file-name (setq file-name (car (last (split-string url "/")))))
    (let ((make-backup-files nil)
          (file-path (expand-file-name file-name user-emacs-directory)))
      (ignore-errors
        (url-copy-file url file-path 'ok-if-already-exists))
      (ignore-errors
        (load file-path nil 'nomessage)))))

(emacs-pkg-boot 'xprint "https://github.com/emacs-pkg/xprint/raw/main/xprint.el" "xprint.el")
```
また、url の最後の部分がローカルに格納する名前と同じ場合は(上記の例ではともに xprint.el)、以下のように第三引数を省略できます。(url からファイル名を自動取得します)

```elisp
(emacs-pkg-boot 'xprint "https://github.com/emacs-pkg/xprint/raw/main/xprint.el")
```

上記の例([https://github.com/emacs-pkg/xprint/raw/main/xprint.el](https://github.com/emacs-pkg/xprint/raw/main/xprint.el))は、以下の記事のコードを自動ロード(および自動更新(に追随))することができます。

https://qiita.com/javacommons/items/8fb62f9052df31582168
Mybatisで自己結合を扱う

# 初めに
簡単な在庫管理システムをSpringBoot+Mybatisで作成中、mybatisで自己結合テーブルを扱う際に躓いたため、解決策を備忘録として残しておく。


# 扱うテーブル(例)

例として、ツリー構造型の人事テーブルを扱うとする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3083608/29391d2e-a905-5cc3-34b6-490aa92ddfcd.png)

# MybatisでJavaオブジェクトとマッピング

```jinji.java
@Data 
public class Jinji implemnts Serializable {
    
    //社員ID
    private String employeeId;
    
    //社員名
    private String name;
    
    //上司ID
    private String managerId;
    
    //部下のデータを格納するリスト
    private List<Jinji> members;

}
```


社員IDがAの部下全員を参照するSQLをMybatisで行いたい。このときのマッピングは、


```jinjiMapper.xml

<select id="hogehoge" resultMap="jinjiResultMap">
    SELECT
        manager.employee_id,
        manager.name,
        manager.manager_id,
        member.employee_id AS member_employee_id,
        member.name AS member_name,
        member.manager_id AS member_manager_id
    FROM
        jinji AS manager
    INNER JOIN
        jinji AS member
    ON
        manager.employee_id = member.manager_id
    WHERE
        manager.employee_id = 'A'
</select>

<resultMap id="jinjiResultMap" type="Jinji">
    <id property="employeeId" column="employee_id" />
    <result property="name" column="name"/>
    <result property="managerId" column="manager_id"/>
    <collection property="members" javaType="ArrayList" ofType="Jinji">
        <id property="employeeId" column="member_employee_id" />
        <result property="name" column="member_name"/>
        <result property="managerId" column="member_manager_id"/>
    </collection>
</resultMap>

```

自己結合したときは、AS句で指定した子カラム名でマッピングしないとダメみたい。
AS句を指定せずにマッピングをした場合、membersには社員A2,A3,A4のデータがはずが、社員A1のみが格納されていて困惑。よくよく考えればそりゃそうなるわ...

# まとめ

間違いとか多々あると思うけど、僕みたいな初心者に参考にしてもらえればと思う。
今回初めての投稿だけど、ほかにも学んだこととか記事にまとめてみようかな...
python-pptxで テキストの見た目を保持しつつ文字を変更する

# 結論

```python
import pptx, re
from pptx.util import Cm, Pt, Inches

self.replace_text('置き換えられる文字列', '置き換える文字列')

def replace_text(self, before, after):
    for shp in self.slide.shapes:
        if shp.has_text_frame:
            if before in shp.text:
                new_text = re.sub(before, after, shp.text)
                    self.replace_paragraph_text_retaining_initial_formatting(shp.text_frame.paragraphs[0], new_text)

def replace_paragraph_text_retaining_initial_formatting(self, paragraph, new_text):
    p = paragraph._p
    for idx, run in enumerate(paragraph.runs):
        if idx > 0:
            p.remove(run._r)

    paragraph.runs[0].text = new_text
```

参考元のコードだとforループの処理がうまく行われていなかったため修正

# 参考

https://qiita.com/Kent-747/items/a60b8638a31549c0ebd3

https://github.com/scanny/python-pptx/issues/285
Pillow10で削除される「getsize」を「multiline_textbbox」で置き換える

# 結論
```python
self.draw.font.getsize('string')

↓

self.draw.multiline_textbbox([0, 0], 'string') #の2,3番目
```

# getsize

```python
self.draw.font.getsize('string')

>> (138, 44)
```

# multiline_textbbox

```python
self.draw.multiline_textbbox([0, 0], 'string')

>> (0, 9, 138, 44)
```

# 参考

https://pillow.readthedocs.io/en/stable/reference/ImageFont.html#PIL.ImageFont.FreeTypeFont.getsize:~:text=%E3%82%AA%E3%83%95%E3%82%BB%E3%83%83%E3%83%88%E3%81%AE%E3%82%BF%E3%83%97%E3%83%AB-,getsize,-(%20text%20%2C

https://pillow.readthedocs.io/en/stable/reference/ImageDraw.html#PIL.ImageDraw.ImageDraw.multiline_textbbox:~:text=ImageDraw.-,multiline_textbbox,-(xy%2C
初心者エンジニアの独学におすすめするWebサイト・Githubリポジトリ

# はじめに
初めまして！！
2022年に化学系の学科からエンタープライズ向けの自社開発などをしている企業に就職し、現在はバックエンドエンジニアとして勤務しているmirouと言います。
この記事はエンジニアとして勤務する中で独学に役立っている無料のWebサイトやGithubリポジトリを紹介したいと思います。
学生の方や新卒の方、エンジニアを目指している方などのお役に立てれば幸いです。


##  おすすめGithubリポジトリ
**[Developer Roadmap](https://github.com/kamranahmedse/developer-roadmap)**
こちらはバックエンドやフロントエンドなどの役割ベースから、PythonやReactなどスキルベースまで、学ぶべき技術を示してくれる学習ロードマップです。
「バックエンドエンジニアとしてどういう技術を学べばいいの？」「Pythonを学びたいけど、どういう技術があるの？」
など何を勉強したらいいかわからない方におすすめです。



**[freeCodeCamp](https://github.com/freeCodeCamp/freeCodeCamp)**
こちらは
 * アルゴリズムとデータ構造
 * RDB
 * HTML, CSS, JavaScript, React, Node.jsを利用した開発
  * Pythonを用いたデータ分析

   などを学ぶことができるリポジトリで、これ1つで一通りの開発は学べると思います。
[日本語版のサイト](https://www.freecodecamp.org/japanese/learn/2022/responsive-web-design/)があるので、こちらを利用するのがおすすめです。



**[freeProgrammingBooks](https://github.com/EbookFoundation/free-programming-books)**
   こちらはGit, Java, Linuxなど、項目ごとに学ぶことができるリポジトリです。
こちらは「Javaについて学びたい！！」など目的が明確な場合に利用するのがおすすめです。
しかし、「こういう技術もあるんだなぁ～」と目次を見るのもいいと思います。
日本語対応もしているのでぜひ見てみてください。

# おすすめWebサイト
**[CS50](https://cs50.jp/)（日本語版）**
こちらはハーバード大学が無償で公開しているコンピューターサイエンス入門講座を日本語化したもので、コンピューターサイエンスを学びたいという方に特におすすめです。
ただ、こちらを学んだだけでは知識としては足りないので、他に紹介しているGithubリポジトリやWebサイトと合わせて学ぶことをおすすめします。



**[Codewars](https://www.codewars.com/)**
  こちらは競プロの問題に無料で解くことができるサイトになります。
１日に解くことができる問題数などに制限がなく、アルゴリズムのトレーニングにおすすめです。
こちらは英語版しか対応してないため、Google翻訳などを駆使して学んでいます。
[Codewarsの使い方を紹介している記事](https://qiita.com/javacommons/items/7c473cda7825ab99e08c)があったので、ぜひこちらもご覧ください！



**[Udemy](https://www.udemy.com/?utm_source=adwords-brand&utm_medium=udemyads&utm_campaign=Brand-Udemy_la.JA_cc.JP&utm_term=_._ag_106402441658_._ad_451172770945_._de_c_._dm__._pl__._ti_kwd-296956216253_._li_1009492_._pd__._&utm_term=_._pd__._kw_udemy_._&matchtype=b&gclid=Cj0KCQiAwJWdBhCYARIsAJc4idA4rgpNb-n67trIaBbzGDUZu87ulwF61Dt15Iul0h4VlxmzP_VbR_YaAv1MEALw_wcB)**
Udemyは僕が独学で学ぶ際に非常にお世話になっていて、動画を購入することで学習することができます。
またUdemyを利用する際は英語（もちろん他の言語でも）の講座も受講することを強くおすすめします。
日本語字幕があるものもあれば、ないものもありますが、日本語の講座数よりも圧倒的に英語の講座数は多く、質も量も非常に高いので、僕自身購入する講座のほとんどは英語の講座です。
最初は英語だととっつきにくいかもしれませんが、慣れれば学習の手段も増えるのでぜひ英語の講座で学習してみてください。

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

ここで挙げたGithubリポジトリやWebサイトは、あくまで僕が学習する際によく利用するものなのでまだまだたくさんの便利な教材があります。（あまり使っていないものに関してもいつか紹介したいと思います）

無料で学べるものは多いですが、書籍や動画など数千円払うだけで質の高い教材で学べるので、「無料で学べるから買わなくていいや」と思わず、「たった2000円でこんなに学べるなんて！！」と考えると効率の良い学習ができると思います。
そして、日本語だけでなく、ぜひ英語でも検索して便利な教材を探してみてください。
日々学び、そして成長するために一緒に頑張りましょう！！
【MySQL接続エラー】SQLSTATE[HY000] [2002] Connection refused【DBに接続ができない】

dockerを使用してlaravelの環境構築を行った後、apiの作り込みをしていたら、表題のエラーで詰まり、解決するにかなりの時間を浪費しました。
初歩的なミスで恥ずかしい事ですが、備忘録して今回の修正方法を記録しておきます。


### laravelのDB接続概要(簡易)
laravelでは、```config/database.php　```に各種DBに接続する為、情報を記載する入力欄があると思います。
(基本的は、どの言語のフレームワークでも、同様の入力する欄があると思います)

```php
'connections' => [
     // 省略

    'mysql' => [
        'driver' => 'mysql',
        'host' => env('MYSQL_HOST', '127.0.0.1'),
        'port' => env('MYSQL_PORT', '3306'),
        'database' => env('MYSQL_DATABASE', 'forge'),
        'username' => env('MYSQL_ROOT_USER', 'forge'),
        'password' => env('MYSQL_ROOT_PASSWORD', ''),
        'charset' => 'utf8mb4',
        'collation' => 'utf8mb4_unicode_ci',
        'prefix' => '',
        'prefix_indexes' => true,
        'strict' => true,
        'engine' => null,
        'options' => extension_loaded('pdo_mysql') ? array_filter([
            PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
        ]) : [],
    ],

    // 省略
],

``` 

今回の問題点ですが、```config/database.php　```　に記載されている```MySQL```の環境変数と```.env```記載した```MySQL```の環境変数が異なっていた為、DBに接続できませんでした。

```.env　初期の環境変数名
DB_CONNECTION=mysql
DB_HOST=test_db
DB_PORT=3306
DB_DATABASE=test_detabase
DB_ROOT_USER=test_root_user
DB_ROOT_PASSWORD=test_password
```

```.env 修正後の環境変数名
DB_CONNECTION=mysql
MYSQL_HOST=test_db
MYSQL_PORT=3306
MYSQL_DATABASE=test_detabase
MYSQL_ROOT_USER=test_root_user
MYSQL_ROOT_PASSWORD=test_password
```

環境変数名が間違っていた為、laravelの仕様上、　下記に記載したenv関数の第二引数を読み込む為、DBが接続できず、エラーを吐き続けると言う状態に陥りました。
```php
 'host' => env('MYSQL_HOST', '127.0.0.1' ← この値を使用する )
```
環境変数を合わせた事で、無事にDBに接続でき、開発を進める事ができました。

# 参考文献
- [Laravel データベース接続の設定](https://qiita.com/te-k/items/1f2deddb6808afca2f2b)

# 感想
今回、laravelを使用した開発を初めて行いましたが、新しいフレームワークを使って開発すると初歩的な部分でハマる事が多いなと実感しました。
公式ドキュメントをしっかり読み込んで開発する必要性があるなと、改めて痛感しました。
luaでテーブルの中身を曝け出す

　
この記事は[アドカレ](https://qiita.com/advent-calendar/2022/lua)に参加しています。

# luaでテーブルの中身を曝け出す
luaにはテーブルという便利な機能があります。
なにが便利かというと、キーに数字と文字を扱うことができたりするところです。
```lua
local a={}
a[1]=0
a[10]=0
a["key"]=100
a["test"..10]="aiueo"
```
とても便利ですね。

さて、ここで気を付けておきたいのが変数名被りです。
```lua
local a={}
a["name"]="Tom"

--[[なんらかの処理～～～～]]

a["name"]="Emma"
```
うっかりこんなことをやってしまった日には、トムが男の娘になってしまいます。~~それもいいですね~~

これを防ぐためには、正確にテーブルの中身を知る必要があります。
そこで、テーブルの中身をprintするプログラムを書きました。

## コード
少し駄目なところがありますが、このプログラムを考えていたときは頭がいっぱいいっぱいだったのでご容赦を。
```lua
<?
--[[渡されたテーブルの中身をdebug_printする関数]]
local function load_G(m,mt,s)
 if(type(mt)~="table")then
  mt={m}
 else
  mt[#mt+1]=m
 end

 --これ、どうにかしたいね…
 --debug_print(string.format("%d",#mt))

 for k,v in pairs(m) do
  debug_print(s..k.." = "..tostring(v).."\n")
  if(type(m[k])=="table")then
   local ch=1
    for i=1,#mt do
     if(mt[i]==m[k])then
      ch=0
      break
     end
    end

   if(ch==1)then
    load_G(m[k],mt,s..k..".")
   end
  end
 end
end

TEST={}
local c=0
for i=1,10 do
 TEST[i]={}
 for j=1,10 do
  c=c+1
  TEST[i][j]=c
 end
end

os.execute("cls")--[[コンソールクリア]]
load_G(_G,0,"_G.")--[[_Gのテーブルをコンソールに書き出す]]
?>
```

## 理論
まず、テーブルのすべての要素にアクセスするには汎用for文を使います。
[これ](https://www.lua.org/pil/14.html)とかシンプルで分かり易いです。
以下のコードはただ書き直しただけです。
```lua
<?
debug_print("グローバル変数の表示")
for n in pairs(_G) do
 debug_print(n)
end
?>
```
　
次に、テーブルの要素がテーブルだったときのことを考えます。
もし要素がテーブルだったら、そのテーブルの中身を曝け出せばいいことになります。再帰処理でできますね。
```lua
<?
--[[渡されたテーブルの中身をdebug_printする関数]]
local function load_G(m,s)
 for k,v in pairs(m) do
  debug_print(s..k.." = "..tostring(v).."\n")
  if(type(m[k])=="table")then
   load_G(m[k],s..k..".")
  end
 end
end

--[[ちゃんと表示されるか確認するための配列]]
TEST={}
for i=1,1000 do
 TEST[i]=i
end

os.execute("cls")--[[コンソールクリア]]
load_G(_G,"_G.")--[[_Gのテーブルをコンソールに書き出す]]
?>
```
　
はい、ここで例外を考えなければなりません。
_Gです。
_Gは、それ自身に_Gという要素を持っています。
つまり、
_G._G._G._G._G._G._G・・・・・
無限ループです。
なので、これを防ぐ必要があります。
方法としては、一度表示したものを記録しておいて、もし次に表示しようとしているものが既に表示したものならば、表示しないようにすればいいです。
```lua
<?
--[[渡されたテーブルの中身をdebug_printする関数]]
local function load_G(m,mt,s)
 if(type(mt)~="table")then
  mt={m}
 else
  mt[#mt+1]=m
 end

 --これ、どうにかしたいね…
 --debug_print(string.format("%d",#mt))

 for k,v in pairs(m) do
  debug_print(s..k.." = "..tostring(v).."\n")
  if(type(m[k])=="table")then
   local ch=1
    for i=1,#mt do
     if(mt[i]==m[k])then
      ch=0
      break
     end
    end

   if(ch==1)then
    load_G(m[k],mt,s..k..".")
   end
  end
 end
end

TEST={}
local c=0
for i=1,10 do
 TEST[i]={}
 for j=1,10 do
  c=c+1
  TEST[i][j]=c
 end
end

os.execute("cls")--[[コンソールクリア]]
load_G(_G,0,"_G.")--[[_Gのテーブルをコンソールに書き出す]]
?>
```

## おわりに
テーブルの中身を曝け出しました。
人肌に触れてテーブルも喜んでいますね！(え？
Unity公式が公開しているプログラミングパターンを読み取ってみた！～その4. InterfaceSegregationPrinciple(インターフェース分離の原則)～

# はじめに
Unity公式がプログラミングパターンのデモを説明書と共に全12種公開していたので、1つずつ読み取っていきたいと思います！
英語の説明書でしたので間違った解釈をしているかもしれませんが、ご了承下さい！
最初の5種は、SOLID原則に沿ったデモとなっており、コードのみが公開されています。
残り7種は、Scene付きのデモが入っていますので、ZIPファイルをダウンロードして試してみてください。
今回は、4つ目のInterfaceSegregationPrinciple(インターフェース分離の原則)についてです。

https://github.com/Unity-Technologies/game-programming-patterns-demo

https://resources.unity.com/games/level-up-your-code-with-game-programming-patterns

# 環境
OS : Windows10
Unity バージョン : 2021.3.8f1

# InterfaceSegregationPrinciple(インターフェース分離の原則)とは
InterfaceSegregationPrinciple(インターフェース分離の原則)は、1つのインターフェースに要素を多く詰め込まず、細かく分けてくださいという原則です。
短くするという意味では、単一責任の原則と同じ考え方になります。
デモでは、戦略ゲーム内で敵とタル爆弾（実際はもっと多くのユニットが存在）を作成する例が取り上げられています。

### 悪いコード
以下のインターフェースでは、HPや前後の動きなど様々な機能が1つのインターフェースに入ってしまっています。

```C#
public interface IUnitStats
{
    public float Health { get; set; }
    public int Defense { get; set; }
    public void Die();
    public void TakeDamage();
    public void RestoreHealth();
    public float MoveSpeed { get; set; }
    public float Acceleration { get; set; }
    public void GoForward();
    public void Reverse();
    public void TurnLeft();
    public void TurnRight();
    public int Strength { get; set; }
    public int Dexterity { get; set; }
    public int Endurance { get; set; }
}

```
目的、用途に分けて分割すると以下のようになります。

### 良いコード
```C#
// 移動可能なユニットに使用
public interface IMovable
{
    public float MoveSpeed { get; set; }
    public float Acceleration { get; set; }
    public void GoForward();
    public void Reverse();
    public void TurnLeft();
    public void TurnRight();
}
// ダメージを受けるユニットに使用
public interface IDamageable
{
    public float Health { get; set; }
    public int Defense { get; set; }
    public void Die();
    public void TakeDamage();
    public void RestoreHealth();
}
// 能力値を持つユニットに使用
public interface IUnitStats
{
    public int Strength { get; set; }
    public int Dexterity { get; set; }
    public int Endurance { get; set; }
}
```
タル爆弾には、爆発する機能が必要なため以下のインターフェースも作成します。
```C#
public interface IExplodable
{
    public float Mass { get; set; }
    public float ExplosiveForce { get; set; }
    public float FuseDelay { get; set; }
    public void Explode();
}
```
タル爆弾は、ダメージを受ける、爆発機能を持つ要素で構成されます。
敵は、ダメージを受ける、移動可能、能力値を持つ要素で構成されます。
```C#
public class ExplodingBarrel : MonoBehaviour, IDamageable, IExplodable
{

}
public class EnemyUnit : MonoBehaviour, IDamageable, IMovable, IUnitStats
{

}
```
以上のようにインターフェース分離の原則は、機能を切り離し変更を容易にするのに役立ちます。

# 参考

https://blog.unity.com/ja/games/level-up-your-code-with-game-programming-patterns
【受験記録】AWS Certified: SAP on AWS - Specialty (PAS-C01)

## 前提
- 6年目エンジニア
- アプリケーション開発メイン
- インフラは少しだけ

## 試験結果
- 1回目
    - 受験日: 2022/11/23
    - 点数:685点/750点/1000点(取得スコア/合格ボーダー/満点スコア)
    - スコアパフォーマンス: 全セクションで"改善が必要"
- 2回目
    - 受験日: 2022/1２/27
    - 点数:778点/750点/1000点(取得スコア/合格ボーダー/満点スコア)
    - スコアパフォーマンス: 全セクションで"コンピテンシーを満たしている"

## 試験感想
- とにかく情報が少ない
    - 今年からできた試験でそもそも受けた人も少なく、書籍や問題集もあまりない
    - 情報が少ないため、１度受けてみる必要があると判断して、そもそも２回受けるつもりで学習を実施（ちょうど[再受験無料キャンペーン](https://pages.awscloud.com/TrainCert-Japan-PearsonVUE-Retake-Terms-and-Conditions-2022.html)もあった）
        - もちろん記事を書いてくださっている方のQiita等は読ませていただきました（数記事リンク）
        
https://qiita.com/Regryp/items/07c112f15b7598002911

https://qiita.com/handy-dd18/items/18e8a856906f97bbb964

https://qiita.com/tkubota/items/6e5389ff2817171c2529

- SAPの知識が０からスタート
    - 必要最低限の知識の習得で済ませたい
        - HAや移行、バックアップは必須
        - 技術文書全体を隅から隅まで読まない（問題演習等でわからなかった部分は参照する）
    - SAPがほぼ関係なく、AWSの知識で解ける問題は落とさないようにする

## 学習リソース
前項で記載した記事リンクにて主要なリソースは押さえてありましたので、記載のなかったものを記載しています。
- [学習リソース一覧(SAP公式)](https://blogs.sap.com/2022/12/16/get-aws-certified-sap-on-aws-specialty-pas-c01/)
    - SAP公式が英語の学習リソースをまとめた資料。WhizlabsやCloud Academyの外部サイトまで掲載。

- [Whizlabs](https://www.whizlabs.com/learn/course/sap-on-aws-certification-exam-training/2481)
    - (変なDumpサイトを除いて)１００問以上の問題、解説があるサイト。受けた感じ、似たような問題もあったので、問題解いて学習している人は必須と思われる。
    
- [AWS認定試験（SAP on AWS）シリーズ](https://www.youtube.com/playlist?list=PLrbutKlth8WG7Fp7AOP_LGHIjRuWnRBI1)
    - 公式以外で動画を使って試験内容の解説を行なってくれている。解説していたパラメータが試験問題に出ていて助かりました。


## 技術メモ
移行ツールが最後の最後にわかった気がしたので、メモ（※裏どりはしてください）

- SAP anyDB→SAP anyDB (OS変えない)
    - SWPM 同種コピー
    - MGN（ブロックレベル、最小限のダウンタイム）
    - SMS(エージェントレス)
- SAP anyDB→SAP anyDB (OS変える)
    - SWPM 異種コピー
- SAP anyDB→SAP HANA (OS変えない)
    - SUM DMO
- SAP anyDB→SAP HANA (OS変える)
    - SUM DMO with System Move
- SAP HANA→SAP HANA 
    - HANA System Replication

## あとがき
これでAWS１２冠達成できたので、それについても何か書きます。
Reactで作成したアプリをApache環境にデプロイする

localhostにアクセスするのとは違ってデプロイまでを疑似的に行うことで仕組みの理解を少しでも進められたらなと思ったのでやってみます。
実際に自分で手を動かすと、「へーっ」て納得感が増しますね。
画面表示するところまでとなります。

ソースは編集せず、よく見る画面（下記画像）を表示させるところまでをゴールにします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2779836/e3d2a847-e202-d021-3f75-6223f5d41ef0.png)

## 前提
WSL2のUbuntu環境に入れたApacheにデプロイします。
yarnが使える環境を準備してください。

## 手順

アプリをビルド
```Bash
$ sudo apt update
$ cd ~
$ nvm use 14
$ npx create-react-app sample-app --template typescript
$ cd sample-app
$ yarn build
```
Apacheを導入し、念のため初期画面を表示
```Bash
$ sudo apt install apache2
$ sudo apachectl start
$ ip addr
```
http://xxx.xxx.xxx.xxx(←上記で確認したIPアドレス、ポートは80です)
以下の画面が表示されることを確認。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2779836/7a65d610-5f66-254a-0720-caad9978ed1f.png)

```Bash
$ sudo apachectl stop
$ cd /var/www/html
$ sudo mv index.html indexBackUp.html
$ sudo cp  -pR ~/sample-app/build/* ./
$ sudo apachectl start
```
再び、Apache導入時に確認したURLにアクセスする

最初に示した以下の画面が表示されたら正しくデプロイ出来ている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2779836/03e1bc50-cc47-db30-2d1e-e4505b58915b.png)

## おまけ
reactのアプリをデプロイすると、
- index.html
- css
- js
- json
- img

おおまかに上記のファイル、ディレクトリが作られる。SPAなのでhtmlは一つですね。

現場で、typeScriptを使っているので、typeScriptを使える状態でアプリを作りましたが、
今回の記事にはまったく意味がありません。。。
virshコマンドでの仮想マシンの管理

●virshコマンドでの仮想マシンの管理
virshコマンドは、様々な仮想化ソフトウェアと仮想マシンを管理できるコマンドラインツール。libvirtパッケージに含まれる。

virshコマンドはシェルから実行。

　virsh サブコマンド {ドメイン名|ID|UUID}

※ドメインはリソースを含む仮想マシンの構成。

「virsh」コマンドでvirshを起動し、対話的にサブコマンド以降を入力することも可能。


virshコマンドの主なサブコマンド
・start 仮想マシンを起動
・shutdown 仮想マシンを正常に終了
・destroy 仮想マシンを強制終了
・reboot 仮想マシンを再起動
・suspend 仮想マシンを一時停止
・resume 仮想マシンを再開
・save 仮想マシンの状態をファイルに保存し、停止
・restore 仮想マシンを復元し、起動
・dominfo ドメイン情報を表示　※ドメイン：リソースを含む仮想マシンの構成
・edit XML形式で記述された仮想マシンの設定を変更
・list 仮想マシンの一覧を表示(デフォルト：稼働中のみ)、—all：すべての仮想マシンを表示
・net-list 仮想ネットワークの一覧を表示
sap data warehouse cloud（DWC） スペース間の移送について

# はじめに
DWCの運用で、開発環境と本番環境に分けて運用するケースが殆どかと思います。その際、開発環境と本番環境が異なるテナントであればエクスポート/インポート機能を利用して移送する事は可能です。ただ、同一テナント内でスペースを開発と本番に分けて運用するケースもあるかと思います。その場合、エクスポート/インポート機能は利用できず（エクスポートとインポートは同一スペース名である必要があるため）、スペース間の移送をするにはテーブルやビュー毎にエクスポート（jsonファイル）し、インポートする必要があります。今回はそのjsonファイル形式での移送方法を紹介したいと思います。

# 移送内容
スペース内で完結しているデータフローやビューであれば、jsonファイルをエクスポートしてインポートするだけなのであまり面白くありません。今回はスペースを共有化して作成しているビューの移送方法を実践してみたいと思います。（下図参照）

＜イメージ図＞
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2705941/11f04061-e4bf-875e-d37b-0431ee260272.png)


実施したいことは以下です。
１．開発スペース１のテーブル１を本番スペース１へ移送
２．開発スペース２のビュー（テーブル１参照）を本番スペース２へ移送

# 移送手順
手順①　開発スペース１のテーブルをエクスポート(jsonファイル)し、本番スペース１へインポート
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2705941/db3be8dd-f995-f948-f79c-040f0adb3f98.png)

手順②　移送後、共有化設定は解除される為、本番スペース１のテーブル１を本番スペース２へ共有化
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2705941/3240eb93-3d9d-67d3-5bfe-a1c2c54f156e.png)
※共有化設定は以下を参考
　https://qiita.com/takao_kotaniguchi/items/9a8a5676869629abf6e5

手順③　開発スペース２のビューをエクスポート(jsonファイル)し、本番スペース２へインポート　※但し、そのままjsonファイルをインポートするとエラーとなります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2705941/d5266b9e-ee02-9940-b5b7-506e688aa000.png)
※理由はjsonファイルの参照先情報が開発スペース１を向いており、開発スペース１のテーブル１は本番スペース２へは共有化していない為です。

手順④　jsonファイルの修正し、修正したjsonファイルを本番スペース２へインポート　※き換えについては、開発スペース名に該当する部分を本番スペース名に変更する(下図は一例なので、該当する部分は書き換え必要)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2705941/d76f6574-7e77-7890-eafe-a55c2309541d.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2705941/92ee0cd5-be43-6468-54bb-abee6a38d18f.png)
以上で移送完了です。手順②で共有化している事で本番スペース１のテーブル１を参照してくれます。

# おわりに
上記の方法を利用すればビューやデータフローを直接編集することなく移送できます。
また同じ要領で例えばリモートテーブルの移送も可能です。リモートテーブルの場合、jsonファイル内にリモート先の接続情報が設定されているので、開発環境の接続情報を本番環境に書き換える事で移送可能となります。
最終的に思う事はもう少し簡単に移送出来ればなぁと思います。
Unity DOTSを始めたい

# お前誰だよ
そこら辺の大学生です。この記事は勉強するついでに書いた記事なので、間違ってる場所多めでお送りするかもしれません。自信もないけど書いてます。ごめんね。
また、この記事は2022年12月末の公式ドキュメントを頑張って読んで書いてます。
# この記事の目的
いろんな記事読んだけど結局何したら理解できるんやみたいな人用。細かいところはいろんなところでまとまってるのでそっちをご確認ください。
# Unity DOTSって？
Unityがめっちゃ力入れてるもの。プログラム組むときの設計が大きく変わるが、高速化を実現してるもの。詳しくはほかの記事見て。
ECS, Burst, C# JobSystemの３つを柱としている。
## 紹介の前に環境
Unity 2022.2.1f1
Entities 1.0.0-pre.15
Burst 1.7.4
## ECS(Entity Component System)
メインディッシュ。詳しくは以下略
## Burst
コンパイルうんぬんかんぬんだと思ってる。詳しくは以下略
## C# JobSystem
C#を早く非同期処理できるぜﾍﾞｲﾍﾞ！詳しくは以下略。
# DOTSやりたい！なにする？
Unityの公式ドキュメント読みましょう。俺は下のSpawn exampleをやると少し理解できました。
[Unity Spawn example](https://docs.unity3d.com/Packages/com.unity.entities@1.0/manual/ecs-workflow-example.html)
# Spawn exampleやったという前提で…俺の備忘録
こっからは、Spawn exampleとUnityの従来の開発スタイルをある程度理解してる前提で書きます。
## SubScene
GameObjectは、SubSceneに入れるとEntityになります。昔の記事を見てると、従来はSubSceneではなく「Convert to Entity」というスクリプトをアタッチしてEntityになってたっぽい。
オブジェクトにアタッチしてたコンポーネントも再生モード時に**Entityに変換**されるので、今まで通りの世界の構築方法で大丈夫！
（※コンポーネントの変換は一部対応してないです。**対応してないやつは無視**されてシーンに反映されるので注意。）
## Baker
今までの開発スタイルとECSを連携させるときに使うっぽい。
## IJobEntity
C# JobSystemのやつ。俺も詳しくは知らんけど、ECSのSystemで使う用の汎用メソッドを定義するノリで良いと思う。
## ISystemとSystemBase
基本的にはISystemを使うべきっぽい。こっちの方が早い。その代わりSystemBaseは便利な機能があるよーって書いてあった。
### ISystemのEntityのアクセス方法
```C#
foreach(var 変数 in SystemAPI.Query<RefRW</*自作IComponent*/>>) 
{
    //処理
}
```
### SystemBaseのEntityのアクセス方法
```C#
Entities.ForEach( (ref /*自作IComponent*/) =>{
    //処理
});
```
詳しい使い方は、ほかの記事見てね。

# 以上
Unity DOTSを実際に触る一日目でした。
デフエンジニアの会の成り立ちー中編ー

この記事は「[デフエンジニアの会の成り立ち　ー前編ー](https://qiita.com/deafengineers/items/545fb0ae479c54b8888b)」の続きです。

# 退職後の生活
退職後はまずは正社員として走り抜いて疲れた心と体を癒すため、アルバイトを探していた。
その時はプログラマーという仕事はもうしない、と決めていたものの、
それでもパソコンに可能性を見出していたので今後もパソコンを使った仕事がしたいと思い、それでデザイナーの仕事を探した。
もちろん、障害者雇用枠ではなく一般枠でひたすら探した。

## バイトとして再就職
結果、これまた何社もの応募を経て大阪にあるデザイン事務所に採用が決まった。

そこでは主にサイト作成・ウェブサイトデザインを中心とした事務所でとてもアットホームな所だった。

### チャットをはじめて知った
その事務所は男性１０名女性１０名のアットホームな所だったため、会話するときは皆でホワイトボードに筆談したり色々と楽しかった。

その時、ある人が
「ねえ、良いことを思いついたんだけど。
仕事中なども皆でチャットを使ってお話すればいいんじゃない？」と言ってくれた。

そして、そのお話は上司や社長にいき、結果、チャットが全員に取り入れられ、
その時から会議や朝礼などはみんなそのチャットでやってもらえることになった。

また昼食もみんなで輪になって食べていたが、チャットを取り入れてからは各自自分の机に座ってチャットしながら、時々顔を見合わせて笑い合いながら昼食の時間も楽しめるようになった。

ちなみに、前職ではチャットが取り入れておらず、全部紙ベースでの筆談だった。
（※会社によっては今もまだチャットが取り入れられていないところもある）

この筆談も本当にありがたかったのだけど、会議の時などはやはり追い付かないというデメリットもあった。
また、昼食の時間も食堂で筆談しながら食べるというのもなかなか大変で、それでその辺りちょっと難しいなと思っていた。
それだけに、チャットという形を取り入れれば全員で楽しめるのだということを知った時は本当にうれしかった。

やはり、**テクノロジーの進化は聞こえない人も聞こえる人も救うことが出来る**と思った。

### デザイナーとしての採用のはずが
この事務所では人間関係も順風満帆でとても楽しかったのだが、仕事の面ではどうだったのかというと。

最初はWEBデザイナーとしての採用のはずが、1か月後くらいに徐々にプログラミングもお願いされるようになり・・・
気づいたらプログラミングもやっていた。

今はまだ１年目だから簡単な案件だけやっていればいいけど、これがもしまた難しくなっていったら・・？と思うと、このままではだめだと思った。
そして上司にお話ししたものの、人員不足だからとお願いされ気づいたらそのままプログラミングの仕事を続けていた。

### また無職に
そしてまた無職に戻った。
また前のように技術的に追い付かずまたみんなに迷惑をかけるのではという恐怖が勝ってしまい、怖くなったのだ。

当時、祖母の体調があまり良くなく色々としていたというのもあるが、今思えば恐怖の方が勝ってしまったのだと思う。

それからはずっと他の会社で経理事務のアルバイトをしながら色々なことをやった。
全国一周をしたり、海外旅行をしたり・・・とにかくいろいろなことを経験した。

この頃は、「聞こえない人のための何かを作りたい」という夢は忘れていた。
ただ、今まで色々と大変なことばっかりだったので、とにかくそれを忘れて遊びたい、それだけだった。

そしてある日。「そうだ、東京に行こう。」
私は東京へ行くことを決めた。ずっと関西にいたため、他の世界を見たくなったというのもある。

## よみがえったプログラミングへの気持ち
東京では一人暮らしをしながら金融事務の仕事をしていた。
そして色々と経験してきて気づいたことがあった。

私、本屋さんに行った時に気づいたらプログラミング書籍のコーナーに行ってるなぁ・・と。

そしてプログラミング書籍を眺めては「あー、あれ勉強してみたい！」「こんなのも出てきたんだ・・」とか色々と眺めてはウロウロしている私自身に気づいて、「私やっぱりまたプログラミングの世界に戻りたいのかなぁ」と思うようになった。

やはり、プログラミングの仕事をしていた時が一番楽しかった。
色々なことがあったけど、お客様の要望に応えて喜んでもらえること、
自分で考えて自分で開発してそれが仕上がった時の爽快感、
色々なことが忘れられなかった。

しかし、戻るにしてもやはり不安があった。それに、戻ったとしてもやっていけるのか？また体を壊すんじゃないかと思った。
それに、どうせきちんと学ぶこともできない・・・と思っていた。

それに、当時同じ関西にプログラマーの仕事をしている友達が１人もいなかったというのもある。
それで相談もできず不安に感じていた。

### また戻る決心
それでも、いつも本屋さんに行ってはプログラミング書籍コーナーをうろうろとしてしまうぐらいなら、
もうやっちゃおう！戻っちゃおう！と決心した。

それに今は時代も変わり、スクールなどの対応も幾分かはマシになってるかも・・という若干の期待もあった。
そして、とにかく、あれこれ考えるよりはやってみないと分からない、と腹をくくりプログラミングの仕事に戻る決心をした。

後編へ続くhttps://qiita.com/deafengineers/items/d0142319c82573774750