OmniAICreator/Qiita-1.07M huggingface dataset:
【Javascript】2種類の方法でAPIを叩いてみた。（async/then）

# 初めに
javascriptでAPIを叩いてみた。非同期通信が難しかったが、なんとか完全に理解したので、サンプルコードを残しておく。

非同期通信とは、通常のスクリプトでの常識である「上から順に処理を行う」を逸脱した通信のこと。考慮しないと変数にまだ何も入っていないのに、次の処理が行われてしまう可能性がある。
そこで、「awat」や「then」を用いて処理を待つ。
※非同期通信にはユーザーの待ち時間を減らすメリットがある。

## 環境
 - MacOS 12.0.1
 - Google Chrome 99.0
 - APIはJSONで帰ってくる想定


# サンプルコード
### asyncを使用した例
```javascript:async_api.js
//async awaitの例
const url = "アクセスしたいURL";
async function call_api(url) {
  const request = await fetch(url);
  const json_data = await request.json();
  //JSONを受け取ってからしたい処理
  console.log(json_data);
}

callApi(url);

```
### thenを使用した例
```javascript:then_api.js
//thenの例
const url = "アクセスしたいURL";
function call_api(url) {
  fetch(url)
    .then(function (response) {
      return response.json();
    })
    .then(function (json_data) {
     //JSONを受け取ってからしたい処理
      console.log(json_data);
    });
}
callApi(url);
```

# 終わりに
ここまではAPIを叩くための準備段階のため、叩きたいAPIやそれぞれのプログラムに合わせて実装を変える必要がある。


# 参考サイト
https://qiita.com/soarflat/items/1a9613e023200bbebcb3

https://qiita.com/ryosuketter/items/dd467f827c1b93a74d76

https://www.i-ryo.com/entry/2020/06/05/192657

https://youtu.be/QugDLcOo_EE
プライミング とは

## 勉強前イメージ

プライマリー関係してそう

## 調査

### プライミング とは

フルサービスリゾルバー(キャッシュDNSサーバー)の機能で最新のルートサーバの一覧を入手する仕組みがあります、それをプライミングといいます。
キャッシュサーバは基本的にはキャッシュにないものはルートサーバからたどって結果をクライアントに渡します。
そのため、ルートサーバのIPアドレスが変更されると誰に聞けばいいかわからなくなります。
それを防ぐための機能です。

キャッシュサーバにはルートサーバの一覧が書かれている `ヒントファイル` というものを持っています。
プライミングは規格化されていないため詳細には説明はないですが
プロセスを起動した直後 とか 最初の名前解決の時 とかDNSのソフトウェアによって違いはあるものの
定期的にヒントファイルの更新が行われており、それをプライミングと言います。

## 勉強後イメージ

イメージとしてなかったけど、たしかにルートサーバがどこにいるかとかも持っておくべきだよね...
ずっと同じIPでルートサーバがいるって限らないしね。

## 参考

- [第5回　IPアドレスが変わっても名前解決できる技術](https://xtech.nikkei.com/it/article/COLUMN/20140207/535532/)
- [DNS入門基本編](https://www.nic.ad.jp/ja/materials/iw/2020/proceedings/c33/c33-ikeda-1.pdf)
WAFイベントの簡単なテスト方法(URLで指定）

# 実行方法
`where username='1' OR '1' = '1' AND Password='1' OR '1' = '1'` というSQL Injectionを想定したリクエストを投げる例として
`http://<FQDN>/?username=1'%20or%20'1'%20=%20'1&password=1'%20or%20'1'%20=%20'1`
を実行すれば良い。

# IBM Cloud Internet Service(CIS)での実行例

1. 該当のURLを実行するとブロックされた。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/946a24b6-8c0f-1edc-d943-0b5f60d1a509.png)
2. WAFのイベントが生成された。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/61b6f5f3-af60-b28a-a2f7-95646d8e6b9b.png)
3. 確かに対象のWAFイベントはSQL Injectionである。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/e14fed42-22a7-efee-faea-cdabda0f6896.png)
.NET 6.0 の Azure Functions を App Service で動かしてみた

## 背景と目的

Azure で Function as a Service (FaaS) といえば、Azure Functions です。従量課金プランで使用することが多いのですが、今回は専用プラン (App Service プラン) で .NET 6 の Azure Functions を動作確認してみました。

## 前提条件

コマンドの実施環境は、Mac + Azure CLI + .NET 6.0 です。

```bash:bash
$ sw_vers
ProductName:    macOS
ProductVersion: 12.2.1
BuildVersion:   21D62

$ az version
{
  "azure-cli": "2.34.1",
  "azure-cli-core": "2.34.1",
  "azure-cli-telemetry": "1.0.6",
  "extensions": {}
}

$ dotnet --version
6.0.200
```

## Azure Functions Core Tools のインストール

<https://docs.microsoft.com/ja-jp/azure/azure-functions/functions-run-local?tabs=v4%2Cmacos%2Ccsharp%2Cportal%2Cbash#install-the-azure-functions-core-tools>

```bash:bash
brew tap azure/functions

brew install azure-functions-core-tools@4

# 2.x または 3.x がインストールされているマシンでアップグレードする場合に実行します
brew link --overwrite azure-functions-core-tools@4
```

## ローカル関数プロジェクトを作成する

<https://docs.microsoft.com/ja-jp/azure/azure-functions/create-first-function-cli-csharp?tabs=azure-cli%2Cin-process#create-a-local-function-project>

```bash:bash
func init LocalFunctionProj --dotnet

cd LocalFunctionProj

func new --name HttpExample --template "HTTP trigger" --authlevel "anonymous"

func start

# 別ターミナルで実行
curl "http://localhost:7071/api/HttpExample?name=Functions"

# 以下のような出力結果が表示されます
Hello, Functions. This HTTP triggered function executed successfully.

# func start を止めます
[Ctrl + C]
```

## App Service を作成する

<https://docs.microsoft.com/ja-jp/azure/azure-functions/create-first-function-cli-csharp?tabs=azure-cli%2Cin-process#create-supporting-azure-resources-for-your-function>

```bash:bash
# 環境変数をセットします
region=japaneast
prefix=mnrfasrv

# リソースグループを作成します
az group create \
  --name ${prefix}-rg \
  --location $region

# ストレージアカウントを作成します
az storage account create \
  --name ${prefix}stor \
  --resource-group ${prefix}-rg \
  --sku Standard_LRS

# App Service プランを作成します
az appservice plan create \
  --name ${prefix}-plan \
  --resource-group ${prefix}-rg \
  --sku B1 \
  --is-linux

# Functions を作成します
az functionapp create \
  --name ${prefix}-fapp \
  --resource-group ${prefix}-rg \
  --storage-account ${prefix}stor \
  --plan ${prefix}-plan \
  --runtime dotnet \
  --functions-version 4

# Functions App を App Service にデプロイします
func azure functionapp publish ${prefix}-fapp

# 動作確認します
curl "https://${prefix}-fapp.azurewebsites.net/api/httpexample?name=Azure"

# 以下のような出力結果が表示されます
Hello, Azure. This HTTP triggered function executed successfully.
```

## 参考

```bash:bash
# ログストリーミングを表示します
func azure functionapp logstream ${prefix}-fapp

# リソースグループを削除します
az group delete \
  --name ${prefix}-rg \
  --yes
```

<https://docs.microsoft.com/ja-jp/azure/azure-functions/dedicated-plan>
SpringBoot基礎 アノテーション覚え書き

## DI関連
|  |  |
|:-|:-|
|Autowired |DIする時に使用   |
|Controller|コントローラクラスに使用。Spirngのコンポーネントとして認識され、Bean指定した場合と同じくAutowiredでDI可能となる|
|Service|サービスクラスに使用。Spirngのコンポーネントとして認識され、Bean指定した場合と同じくAutowiredでDI可能となる|
|Repository|リポジトリークラスに使用。Spirngのコンポーネントとして認識され、Bean指定した場合と同じくAutowiredでDI可能となる|
|Component|@Controller、@Service、@Repository以外でSpirngのコンポーネントとして認識させたい場合に使用|
|Bean |@Componentや@Serviceなどのアノテーションを付けていないクラスに対し、DI対象にする場合に使用   |
| Qualifier("Bean名") | 同じ型のBeanがDIコンテナに複数登録されている場合、どのBeanか指定するために使用 |

## Spring共通

|  |  |
|:-|:-|
| SpringBootApplication | SpringBootの様々な設定を自動的に有効にする。（@EnableAutoConfiguration,@Configuration,@ComponentScan） |
| EnableAutoConfiguration | AutoConfigureの有効化等 |
| Configuration | JavaConfig用のクラスであることを示す |
| ComponentScan | そのクラスのパッケージ以下の@Component等、特定のアノテーションが付与されたクラスのBeanをDIコンテナに登録 |

## コントローラクラス

### メソッド自体に指定

|  |  |
|:-|:-|
|RestController |APIのコントローラに使用。戻り値：String  |
|Responsebody|戻り値に指定した値をViewにそのまま返すことが可能。デバッグ時に活用するとよい|
|RequestMappng |リクエストとメソッドの紐づけに使用。リクエストURLに対し、複数のメソッドを定義可能　※GetやPostのみなら、以降の@GetMapping/@PostMappingを使用。  
|GetMapping|GETリクエストを処理する@RequestMappngの簡略アノテーション|
|PostMapping|POSTリクエストを処理する@RequestMappngの簡略アノテーション|
|||

### メソッドの引数に指定
|  |  |
|:-|:-|
| RequestParam |URLのクエリパラメータやメッセージボディのポストパラメータを受け取る  |
| PathVariable | Rest形式のパラメータを受け取る |
| ModelAttribute | メソッドの戻り値をThymeleaf変数へ紐づける |
| Validated | BeanValidationのアノテーションが評価され、結果がBindingResultに格納される |

### 例外処理の制御
|  |  |
|:-|:-|
| ControllerAdvice | 例外処理制御するクラスに付与 |
| ExceptionHandler | @ControllerAdviceを付与したクラスのメソッドに付与。引数に任意の例外クラスを指定する。指定した例外が発生した場合は、当メソッドが処理される。 |

## サービスクラス

|  |  |
|:-|:-|
| Transactional |  トランザクションの境界を示すために使用。コントローラクラスでも使用可能だが、基本的にはサービスクラスで使用するとよい|
|  |  |

## リポジトリクラス・データアクセスクラス

|  |  |
|:-|:-|
| Entity | Jpaのエンティティであることを示す |
| Table | エンティティに対応するテーブル名を指定する |
| Id | プライマリーキーを指定 |
| Column | 名前や制約を設定 |
| GeneratedValue | オートインクリメント対象を指定 |
| SequenceGenerator | シーケンス設定 |
| Query | データへのアクセスを自作する際に使用　※JpaRepositoryクラスを継承して、型は<エンティティ名,Integer>であること |
|  |  |
|  |  |

## Lombok

|  |  |
|:-|:-|
| Data | コンパイル時にsetter,getter,toString,equals,hashCodeメソッドを生成 |
| AllArgsConstructor | 全フィールドを引数に持つコンストラクタを生成 |
| NoArgsConstructor | 引数のないコンストラクタを生成 |
| Builder | Builderクラスを自動で作成する |

## Bean Validation

|  |  |
|:-|:-|
| NotNull | Nullでないこと |
| NotEmpty | Null,空文字でないこと |
| NotBlank | Null,空文字,半角スペースでないこと |
| Size(min=xx,max=yy) | 文字数制限（バイト数ではないことに注意） |
| Email | xx@xx形式であること |
| AssertTrue | Trueであること |
| AssertFalse | Falseであること |
| Pattern | 指定の正規表現に一致すること |
| DataTimeFormat | 指定の日付形式であること |
|  |  |

## 非同期関連

|  |  |
|:-|:-|
| EnableAsync | mainクラスに指定することで@Asyncの機能を有効化 |
| Async | 指定したクラス、メソッドが非同期処理となる |

## その他

|  |  |
|:-|:-|
| EventListener | ApplicationEventを継承したクラスを引数に指定することで、引数にセットしたイベントが発生したとき、当メソッドを呼び出す。 |
Rubyで数値を3桁区切りにする方法

Rubyで 1234567を1,234,567と出力したい｡

```
require 'active_support'
require 'active_support/core_ext'
puts 1234567.to_s(:delimited) # 1,234,567
```
(requireは2つとも必要)

詳しくは 
https://rip.hibariya.org/post/ruby-activesupport-to-s-args/
参照して下さい｡
Zennシェア:FlutterレアWidgets選

周りはZenn使う人どんどん増えてきて、
自分もZennを試しました。

UIや操作などは好みで、今後の記事はZennでやると思います。

[FlutterレアWidgets選](https://zenn.dev/reinf0rce/articles/98b0c6ae994f46)

Qiitaも運営していきますが、シェアの形でしたいので、よろしくお願いします。
個人的に参考にしているフロントエンドのパフォーマンスに関するリソースまとめ

# 概要
フロントエンドのパフォーマンスに関して個人的に参考にさせて頂いているリソースをまとめました。

# 概要を抑える本２冊

２冊とも素晴らしい本でした。
なぜフロントエンドのパフォーマンスが重要なのかから始まり、ブラウザの挙動、計測手段、実際のチューニングの方法まで包括的に説明してくださっています。
どちらかの本を読むだけでも、十分なパフォーマンスのチューニングを行えるのではないかと個人的に思いました。

https://www.amazon.co.jp/Web%E3%83%95%E3%83%AD%E3%83%B3%E3%83%88%E3%82%A8%E3%83%B3%E3%83%89-%E3%83%8F%E3%82%A4%E3%83%91%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%B3%E3%82%B9-%E3%83%81%E3%83%A5%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0-%E4%B9%85%E4%BF%9D%E7%94%B0-%E5%85%89%E5%89%87/dp/4774189677


https://www.amazon.co.jp/Web%E3%83%9A%E3%83%BC%E3%82%B8%E9%80%9F%E5%BA%A6%E6%94%B9%E5%96%84%E3%82%AC%E3%82%A4%E3%83%89-%E4%BD%BF%E3%81%84%E3%82%84%E3%81%99%E3%81%95%E3%81%AF%E3%80%8C%E9%80%9F%E3%81%95%E3%80%8D%E3%81%8B%E3%82%89%E5%A7%8B%E3%81%BE%E3%82%8B-WEB-PRESS-plus/dp/477419400X/ref=pd_lpo_1?pd_rd_i=477419400X&psc=1

# ブラウザの挙動を理解する

フロントエンドのパフォーマンスのチューニングを行う上でブラウザの挙動を理解するのは非常に重要だと考えています。
下記の記事はモダンなブラウザの挙動を非常にわかり易く説明してくれています。

https://www.html5rocks.com/en/tutorials/internals/howbrowserswork/

# Web Vitals
WebvitalsはGoogleが提唱するWebサイトの品質を図る様な基準です。

> Web Vitals は、Web 上での優れたユーザー エクスペリエンスの提供に欠かすことのできない品質シグナルに関する統一的なガイダンスの提供を目的とした、Google によるイニシアチブです。
> [Google Webvitals](https://web.dev/i18n/ja/vitals/)

Googleが提唱しているので本家Googleが包括的かつ、詳細までカバーした親切なドキュメントを多数提供してくれています。
下記のリンクから行けば全てのWebvitalsに関しての情報に辿り着けるはずです。

https://web.dev/vitals/


# Bundleサイズ測定

使用しているModule Bundlerに応じて下記の様なBundle Analyzerを使用する事でバンドルサイズを確認する事ができます。

### Webpack

https://github.com/webpack-contrib/webpack-bundle-analyzer

https://github.com/chrisbateman/webpack-visualizer

### Rollup

https://github.com/doesdev/rollup-plugin-analyzer

### ライブラリ毎のサイズ測定
ライブラリ選定の際にバンドルサイズを測るのに使用するのがBundlePhobiaです。

https://bundlephobia.com/


# 具体的な技術 ・ 実践練習

株式会社サイバーエージェントや株式会社リクルートがハッカソン形式でフロントエンドのパフォーマンスチューニングを競う場を提供してくれています。

https://developers.cyberagent.co.jp/blog/archives/32747/

https://engineers.recruit-jinji.jp/event/20-speedhackathon/

特に下記の様な解説記事を記載してくださっており、実際に開発している際に盛り込める具体的なテクニック等が詰め込まれており個人的にとても参考になりました。

https://github.com/CyberAgentHack/web-speed-hackathon-2020/wiki/Web-Speed-Hackathon-Online-%E5%87%BA%E9%A1%8C%E3%81%AE%E3%81%AD%E3%82%89%E3%81%84%E3%81%A8%E8%A7%A3%E8%AA%AC

# React(おまけ)

個人的にフロントのフレームワークでReactを使用する事が多いので諸々溜まっていきました。

### ツール

https://chrome.google.com/webstore/detail/react-developer-tools/fmkadmapgofadopljbjfkapdkoienihi?hl=en

https://github.com/welldone-software/why-did-you-render

### 参考になった記事

https://blog.recruit.co.jp/rtc/2018/09/19/react_spa_performance_tuning/

https://blog.logrocket.com/speed-up-react-app-dynamic-imports-route-centric-code-splitting/

https://linguinecode.com/post/code-splitting-react-router-with-react-lazy-and-react-suspense

https://qiita.com/teradonburi/items/5b8f79d26e1b319ac44f

https://tmegos.hatenablog.jp/entry/react-re-render-why-did-you-render

https://reactjs.org/docs/perf.html

https://brycedooley.com/debug-react-rerenders/
Powershellでの暗号化・復号化を行う関数

# Powershellでの暗号化・復号化を行う関数
業務では、Windows Powershellにて自動化することが多いです。
自動化の中でサーバー構築から、運用保守のツール作成までを行っています。
そこで、管理者権限を持ったユーザーでリモート処理などを行うのですが、
設定ファイルにパスワードをそのまま記載するわけにはいかないため、
簡易的に設定ファイルを見ただけではわからないようにパスワードを暗号化して、
ツール内で復号するような作りをしています。
関数にしてあるので使いやすくなっているかと思います。
みなさんは自動化ツールなどで使っているパスワードなどはどのように管理していますか？

## 対象者
- 設定ファイル等にパスワードはそのまま記載したくない
- キーワードを使ったパスワードを使っていない($$とか)

## 暗号化
```powershell
function Restore-Encrypt {
  [CmdletBinding()]
  param(
    [parameter(Mandatory=$TRUE)]
    [string]$PassWdStr
  )
  # Convert to base64
  $StringToByte = [System.Text.Encoding]::UTF8.GetBytes($PassWdStr)
  $Base64String = [System.Convert]::ToBase64String($StringToByte)

  # Encryption Byte Array
  [byte[]]$PasswdKey = (1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,99,99,99,99,99,99)

  # Convert the string to be encrypted
  $SecurePW = ConvertTo-SecureString -String $Base64String -AsPlainText -Force -ErrorAction stop
  $EncryptString = ConvertFrom-SecureString -SecureString $SecurePW -key $PasswdKey

  # Return after encryption
  return $EncryptString
}
```

## 復号化
```powershell
function Restore-Decrypt {
  [CmdletBinding()]
  param(
    [parameter(Mandatory=$TRUE)]
    [string]$PassWdStr
  )
  # Byte array for decoding
  [byte[]]$PasswdKey = (1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,99,99,99,99,99,99)

  # Convert encrypted strings
  $ImportSecureString = $PassWdStr | ConvertTo-SecureString -Key $PasswdKey
  $SecureStringToBSTR = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($ImportSecureString)
  $ToString = [System.Runtime.InteropServices.Marshal]::PtrToStringBSTR($SecureStringToBSTR)

  # Convert encrypted strings
  $PasswordToByte = [System.Convert]::FromBase64String($ToString)
  $DecryptString = [System.Text.Encoding]::UTF8.GetString($PasswordToByte)

  # Return of decryption
  return $DecryptString
}
```

## カスタマイズするところ
[byte[]]$PasswdKeyについては、配列数を変えなければ中身の数字を好きに変えていただき、
自分のオリジナルのキー配列にしていただいて構いません。
また、その外出しにしてアレンジしてみてください。
初めて、他人のソースをレビューして気づいたこと


<h2>三項演算子</h2>
ソースは短くなるが、すべてを三項演算子にするのはよくない

この記事を参考にレビューした

https://qiita.com/smicle/items/7d3b9881834dc0142fb7


```javascript
if (a) {
    b(0, 0);
} else {
    b(1, 0);
}


const code = a ? 0 : 1;
b(code, 0);
```

<h2>大小判定</h2>

```javascript
if(this.zoom > 0) {
  this.zoom -= 10;
}
if(this.zoom < 50) {
  this.zoom = 50;
}
```

マイナス10ずつ引いて行って、50以下にはならないというプログラムである

まずいらない分岐は消す

```javascript
this.zoom -= 10;
if(this.zoom < 50) {
  this.zoom = 50;
}
```

これは関数が用意されている

```javascript
this.zoom -= 10;
this.zoom = Math.max(50, this.zoom);
```
 これで6行が一行に
```javascript
this.zoom = Math.max(50, this.zoom - 10);
```

Math.maxは入力された0以上の数字の内最大のものを返している



<h2>async/awaitが関数の最後に来ても、消さない方がいい</h2>
最後に非同期処理が来ても、消さない方がいい
理由は以下の点である<br/>
・チーム開発の場合、次に何か処理をつけ足すときにエラーにきずきにくくなる<br/>
・Promise は Promise であると分かりやすくなっていたほうがよい（ミス防止のため）<br/>
・await していないと、投げっぱなしなので reject されてもそこで例外は発生されない<br/>



```javascript
function async () {
    何か処理
    await axios.get("http//")
}
```

<h2>filter/slice適切なメソッドを使おう</h2>

例えば、数字の配列から、要素を切り出したいとき
こんなソースを多く見た

```javascript
const data = [10, 345, 357, 34, 3546, 67, 34, 24, , 34, 23, 352]
const filterData = data.filter((item, index) => { return index > 2 })
```

これは完全にsliceの役目ですので、こうかいたほうがよい

```javascript
const data = [10, 345, 357, 34, 3546, 67, 34, 24, , 34, 23, 352]
const silceData = data.slice(3)
```

<h2>引数がないときは明示的にしておく</h2>

vueでは子コンポーネントからemitされ,
emitに引数があっても
で引数を使うことができる

```vue
<Child @my-click='func'/>
```

引数が一つの場合は下の書き方と同じ意味である
```vue
<Child @my-click='func($event)'/>
```

引数がない場合、明示的にしておいた方が良い
```vue
<Child @my-click='func()'/>
```


<h2>functionとアロー関数でthisのあたいが決まるタイミングが違う</h2>

一般的にJavaScriptでは、関数の中でthisを使うと、その呼び出し元のオブジェクトになる。

```javascript
function func() {
    console.log(this.param);
}

let object = {
    param: '1',
    func: func
}
let object2 = {
    param: '2',
    func: func
}

object.func();
object2.func();

//コンソール
1
2
```

これをアロー関数に変えてみると

```javascript
const func = () => {
    console.log(this.param);
}

let object = {
    param: '1',
    func: func
}
let object2 = {
    param: '2',
    func: func
}

object.func();
object2.func();

//コンソール
undefined
undefined
```

結果が異なる

アロー関数はただ単に書き方を変えただけのものではなく
thisの値が決定されるタイミングがfunctionとはことなり、
宣言時にthisを決定するのだ
【Kotlin】実装クラスが戻り値となるabstract関数を定義する

# お詫び
当初公開していた内容は誤りが含まれていたため、全面的に記事を書き直しています。
ご指摘下さいました @sdkei 氏に感謝を申し上げます。

---

# TL;DR
- 基本的には再帰的ジェネリクスで実現できる
- 再帰的ジェネリクスで問題が発生するパターンでは、拡張関数で見た目を整えられる

# やりたいこと
以下のような、実装したクラスが戻り値になる`myCopy`関数を定義したいとします。

```kotlin
abstract class Abst {
    // 実装時には実装クラスの型を返す
    abstract fun myCopy(): Abst
}

class Impl : Abst() {
    override fun myCopy(): Impl = TODO("実装")
}
```

一方、上記の定義では、以下のように利用側でのダウンキャストが必要になります。

```kotlin
fun <T : Abst> consumer(t: T) {
    // ここでダウンキャストが必要になる
    val cp: T = t.myCopy() as T

    /* 略 */
}
```

この記事では、利用側でのダウンキャストを発生させずに上記のような関数を定義する方法を紹介します。

# 再帰的ジェネリクスを使った方法
再帰的ジェネリクスを使うことで、以下のように定義することができます[^inyo]。

[^inyo]: このセクションで紹介するコードはほぼsdkei氏がコメントしたものです。

```kotlin
abstract class Abst<T: Abst<T>> {
    abstract fun myCopy(): T
}

class Impl : Abst<Impl>() {
    override fun myCopy(): Impl = TODO("実装")
}
```

この方法はダウンキャストがどこにも生じないため安全です。

```kotlin
fun <T : Abst<T>> consumer(t: T) {
    val cp: T = t.myCopy()

    /* 略 */
}
```

## 型パラメータが複数になる場合
型パラメータが複数になる場合は以下のように定義します。

```kotlin
abstract class Abst<T: Abst<T, U>, U> {
    abstract fun myCopy(): T
}

class Impl : Abst<Impl, Int>() {
    override fun myCopy(): Impl = TODO("実装")
}
```

ここで、`T`と`U`を入れ替えると`Type argument is not within its bounds.`としてコンパイルエラーとなる点に注意が必要です。

```kotlin
// -> Type argument is not within its bounds.
abstract class Abst<U, T: Abst<T, U>> {
    abstract fun myCopy(): T
}
```

# 再帰的ジェネリクスを使わない方法
先ほど紹介した実装では、例えばクラス側の型パラメータを上限とする型パラメータを取る関数でダウンキャストが必要になります。

```kotlin
class Consumer<T : Abst<T>> {
    fun <S : T> consumer(s: S) {
        // キャスト無しでは Type mismatch. Required: S Found: Tでエラーになる
        val s: S = s.myCopy() as S

        /* 略 */
    }

    // Tをそのまま使った場合はダウンキャスト不要
    fun consumer2(t: T) {
        val t2: T = t.myCopy()

        /* 略 */
    }
}
```

このような場合、ダウンキャストは避けられず、その他の問題も発生しますが、拡張関数で見た目を整えることはできます。

## やり方
以下のように、再帰的ジェネリクスを用いず、拡張関数にダウンキャストを隠ぺいすることで、利用側では再帰的ジェネリクスを使った時と同様にダウンキャスト無しでの利用が可能になります。

```kotlin
abstract class Abst {
    // 実装時には実装クラスの型を返す
    protected abstract fun _myCopy(): Abst

    companion object {
        // ダウンキャストは拡張関数内に隠ぺい
        fun <T : Abst> T.myCopy(): T = this._myCopy() as T
    }
}

class Impl : Abst() {
    override fun _myCopy(): Impl = /* 実装 */
}
```

利用側のコードは以下のようになります。

```kotlin
class Consumer<T : Abst> {
    fun <S : T> consumer(s: S) {
        val s: S = s.myCopy()

        /* 略 */
    }
}
```

この方法は、ダウンキャストが発生しており、継承側の実装ルールも必要となる点で、再帰的ジェネリクスを使った方法に劣ります。
一方、再帰的ジェネリクスを使った方法で問題が発生する場合には、利用側コードに利用方法を漏出させないという点で利点が有ります。
ターミナル(zsh)のプロンプトにGitのbranchを表示する方法

## はじめに
　本記事は、プログラミング初学者、学習を進めていて疑問に思った点について調べた結果を備忘録も兼ねてまとめたものです。
　そのため、記事の内容に誤りが含まれている可能性があります。ご容赦ください。
　間違いを見つけた方は、お手数ですが、ご指摘いただけますと幸いです。

## ターミナル(zsh)のプロンプトにGitのbranchを表示する方法
設定をすることで下画像のようにターミナルのプロンプトにGitのbranchを色付きで表示することができます（画像はiterm2の画面です）。

![スクリーンショット 2022-03-12 1.13.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/49651554-cd26-2221-bf29-0a55613158fa.png)

設定の手順は以下の通りです。

まず、ターミナルで以下のコマンドを叩き、`.zshrc`を開きます。

```:ターミナル
# viで開く場合
$ vi ~/.zshrc

# vscodeで開く場合
$ code ~/.zshrc
```
`.zshrc`が開いたら以下を追記します。

```.zshrc
# prompt(git branch)
autoload -Uz vcs_info
setopt prompt_subst
zstyle ':vcs_info:git:*' check-for-changes true
zstyle ':vcs_info:git:*' stagedstr "%F{green}"
zstyle ':vcs_info:git:*' unstagedstr "%F{red}"
zstyle ':vcs_info:*' formats "%F{blue} %c%u<%b>%f"
zstyle ':vcs_info:*' actionformats '%B%F{yellow} [%b|%a]%f%b'
PROMPT=$'\n''%F{196}┝ %f%U%c$vcs_info_msg_0_ (%D %*)%u'$'\n''%B%F{196}%#%f%b '
precmd(){ vcs_info }
```

ターミナルを開き直すと上画像のようにプロンプトが表示されるかと思います（GitのbranchはGitが使えるディレクトリに移動しないと表示されません）。

`.zshrc`の記述についての解説は以下の通りです。

* __check-for-changes__
`true`にすることで`formats`の箇所で``%c``と``%u``というフォーマットが使用可能になる。

* __stagedstr__
git adddのみされているファイルがあった場合に、ここで設定した文字列が`formats`の`%c`に展開される
上記の例では`%F{green}`とすることで`<カレントブランチ名>`の文字色を`green`に変更しています。

* __unstagedstr__
git adddされていない変更ファイルがあった場合に、ここで設定した文字列が`formats`の`%u`に展開される
上記の例では`%F{red}`とすることで`<カレントブランチ名>`の文字色を`red`に変更しています。

* __formats__
`$vcs_info_msg_0_`で表示する内容をここに記述する。

* __actionformats__
コンフリクトの発生等、特殊な状況になった場合に `formats`の代わりに `actionformats`で指定した文字列が`$vcs_info_msg_0_`に格納される。


|変数|変数の説明|
|:--|:--|
|%c|git addのみされているファイルがあった場合に _stagedstr_ で指定した文字列に展開される。|
|%u|git addされていない変更ファイルがあった場合に _unstagedstr_ で指定した文字列に展開される。|
|%b|カレントブランチ名|
|$vcs_info_msg_0_|通常メッセージが格納される。|
|$vcs_info_msg_1_|警告メッセージが格納される。|
|$vcs_info_msg_2_|エラーメッセージが格納される。|
|$'\n'|改行|
|%F{任意の色}文字列%f|フォントカラーを指定する。指定方法は色名か番号を記述する。|
|%U文字列%u|アンダーライン|
|%B文字列%b|太字|
|%D|日付|
|%*|時間|
|%#|%|


* __色の指定について__
以下の色名を記述することで色を指定することができます。

 - black
 - red
 - green
 - yellow
 - blue
 - magenta
 - cyan
 - white

色名を記述するとターミナルの場合は下画像の箇所で設定した色が適用されます。
![スクリーンショット 2022-03-12 1.25.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/fc9fd9b7-97eb-10e7-75bb-43c1c577de4f.png)


iterm2の場合は下画像の箇所で設定した色が適用されます。
![スクリーンショット 2022-03-12 1.27.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/d98ead7b-ff06-0df7-c711-1d02c917fb00.png)


また、以下画像の番号を記述して指定することができます。

![スクリーンショット 2022-03-12 1.46.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/3985a3bb-b8e8-1b0b-d818-bd4bedb386c0.png)

上記の番号を指定した場合には、指定した色で表示されます。

上記を踏まえて見やすいようにカスタマイズしてください。
Webクリエイター能力認定試験 スタンダード（HTML5）

2022年2月13日にWebクリエイター能力認定試験 スタンダード（HTML5）を受験しました。
合格(2022/2/22)したので記事を書いておきます。
次受ける方の参考になれば幸いです。

## 受験理由
■１ Web関連の知識を仕事で使う可能性があるため
■２ HTMLを本格に学んだことがないので基礎から勉強するため

## 感想
■１ テキストは2~3日ほどで読み終わりますので、その後はサンプル問題か、模擬試験をやるのが良いです。模擬試験も学習した上での感想ですが、（模擬試験までやらずに）サンプル問題がしっかり理解できていれば合格できると思います。
■２ 問題はすべて記述式ですが、難しくないです。
■３ 問題自体は難しくないですが、実際に手を動かすのでHTMLに慣れるのにはよいと思います。
	
## 学習教材
■１ Webクリエイター能力認定試験HTML5対応スタンダード公式テキスト―サーティファイWeb利用・技術認定委員会公認 第2版 第3刷（狩野 祐東, 2021, 富士通エフ・オー・エム）
■２ Webクリエイター能力認定試験 スタンダード問題集 【HTML5対応】 第2版 第3刷（サーティファイＷｅｂ利用・技術認定委員会, 2021, 株式会社サーティファイ）

## 学習方法
■１ 公式テキスト実施
・・・テキストを一通り読み、その後サンプル問題実施。
■２ 問題集実施
・・・模擬試験3回分実施。

## 反省点
■１ 特になし。

## 試験前にやっておいてよかったこと等
■１ 模擬試験を3回分実施したので、HTMLの苦手意識がだいぶなくなりました。
ThreadでFlaskを起動する

## やりたい事

- WebUI用のFlaskとAPI用のFlaskを一つのアプリケーション内で実現したい。
- プロセスを2つ立ち上げる方法もあるが、サブとなるAPI用をThreadで起動したい。

```
$ curl localhost:5001/
This is WebUI
$ curl localhost:5002/api/
This is api
```

## ファイル構成

```
+ app.py
└ api
   └ views.py
```

## コード

```app.py
import threading
from flask import Flask


class APIThread(threading.Thread):
    def __init__(self):
        threading.Thread.__init__(self)
        self.daemon = True

    def run(self):
        api_app = Flask(__name__)
        from api.views import api
        api_app.register_blueprint(api, url_prefix="/api")
        api_app.run(use_reloader=False, threaded=True, port=5002)


app = Flask(__name__)


@app.route('/')
def index():
    return "This is WebUI"


def main():
    thread = APIThread()
    thread.start()
    app.run(port=5001)


if __name__ == '__main__':
    main()
```

```py:api/views.py
from flask import Blueprint

api = Blueprint("api", __name__)


@api.route('/')
def index():
    return "This is api"
```


https://ai-can-fly.hateblo.jp/entry/flask-directory-structure
https://www.subarunari.com/entry/2018/03/10/%E3%81%84%E3%81%BE%E3%81%95%E3%82%89%E3%81%AA%E3%81%8C%E3%82%89_Flask_%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6%E3%81%BE%E3%81%A8%E3%82%81%E3%82%8B_%E3%80%9CDebugger%E3%80%9C
https://news.mynavi.jp/techplus/article/python-33/
https://stackoverflow.com/questions/40460846/using-flask-inside-class
https://qiita.com/yaaamaaaguuu/items/486968e3b566f8340a9e
巡回セールスマン問題

[問題](https://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=DPL_2_A&lang=ja)

全頂点を訪れてた後、最初に戻る場合と戻らない場合がある(yが必要)

有向性グラフであり、矢印がない頂点間はINFを与える

```c++
ll N, E, y; //頂点、辺、最後に通る点
ll G[20][20];  // グラフ
ll dp[(1 << 20) + 1][21]; // dpテーブルは余裕をもったサイズにする


/* メモ化再帰 */
ll rec(int bit, ll v)
{
    
    // すでに探索済みだったらリターン
    // dp[bit][v]は一度で全パターン試されるので次呼ばれるときは計算不要
    // yが違う時(一周)の時は使えない
    //if (dp[bit][v] != -1) return dp[bit][v];

    
    // 初期値 (v(最後に訪れた頂点)だけが1(探索済み))
    if (bit == (1 << v)) {

        return dp[bit][v] = G[y][v]; //yが同じ時、dp[bit][v]は1通りしかない

    }
    
    ll res = INF; // 最短距離

    int prev_bit = bit &~ (1 << v); // ｖを探索済みに変える( &~ は Nand )


    for (ll u = 0; u < N; ++u) {
        if ((prev_bit & (1 << u)) == 0) continue; // u が探索済みなら
        
        // 階数ごとに最小値を求める
        if (res > rec(prev_bit, u) + G[u][v]) {
            res = rec(prev_bit, u) + G[u][v];
                    
        }
    }

    return dp[bit][v] = res; // メモしながらリターン
}


int main()
{
    // 入力
    cin >> N >> E;

    // グラフの初期化
    rep(i,0, 20) {
        rep(j,0, 20) { G[i][j] = INF; }
    }
    rep(i,0, E) {
        ll s, t, d;
        cin >> s >> t >> d;
        G[s][t] = d;
       
    }

    // テーブルを全部 -1 にしておく (-1 でなかったところは探索済)
    for (int bit = 0; bit < (1 << N); ++bit) for (ll v = 0; v < N; ++v) dp[bit][v] = -1;

    // 探索
    ll res = INF;
    for (ll v = 0; v < N; ++v) { // y は最後に通る頂点
        y = v;
        
        if (res > rec((1 << N) - 1, v)) {
            res = rec((1 << N) - 1, v); // 1が探索済み(逆から探索)
        }
    }

    if (res >= INF) cout << -1 << endl;
    else cout << res << endl;
    
}
```
"There was an error deploying functions" firebase

## 問題
Firebase Cloud Functionsにて、
`firebase deploy`
時に以下のようなエラーが出てdeployができなくなった。

```
There was an error deploying functions
- Error Failed to update function xxx in region yyy
- Error Failed to update function xxx in region yyy
- Error Failed to update function xxx in region yyy
・・・
```

## 解決策
package.json内のモジュールのバージョンが変わっていたため、以下コマンドにてモジュールをアップデートする必要があった
`npm install`

Happy Developing!
レイヤー1ブロックチェーンの比較 


# はじめに
この記事では、Unichainと呼ばれる新しいブロックチェーンと ETH、BSC、PolkaDot、Solanaなどの一般的なレイヤー1ブロックチェーンを比較します。

# 1.　コンセンサスアルゴリズム
コンセンサスは全てのネットワークノードが同じプラグラムを実行し、会話をし、同じ結果を生み出す為のアルゴリズムです。各ブロックチェーンには、独自のコンセンサスがある場合があります。
次の表は、一般的なブロックチェーンのコンセンサスアルゴリズムを比較したものです。
![09.03 Blockchain Comparison-05 (1) (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516631/de5cfd55-5f84-c863-3e58-153815e75437.png)

（*)原則無制限のバリデーターノードがマイニングに参加可能です。然しながらマイニングハッシュレートパワーは5〜10のマイニングプールとなります。
 
ブロックチェーンネットワークでは、ノード（物理サーバー）がトランザクションを検証/ブロックし、データを元帳に追加します。これらのノードは、バリデーターノード、ウィットネスノード、またはマイナーノードと呼ばれます。各コンセンサスアルゴリズムには、異なるタイプのバリデーターノードが必要な場合があります。以下は、異なるプラットフォームでのバリデーターノードハードウェア仕様の比較しています。
![09.03 Blockchain Comparison-05 (1) (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516631/edf0d5d4-ab42-86d1-8c9c-6d3d3f1df293.png)

# 2.　スマートコントラクト
スマートコントラクトは、分散型ネットワーク上で実行されるプログラムです。通常、契約の実行を自動化するために使用されます。これにより、すべての参加者は、仲介者の関与や時間の損失なしに、結果を即座に確認できます。
スマートコントラクト言語はプログラム言語です。契約の論理と流れを定義します。
次の表は、一般的なプラットフォームのスマートコントラクトを比較しています。
![09.03 Blockchain Comparison-06 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516631/b8299e7f-068e-1d6e-23c9-1440f7ceaaf1.png)

# 3.　トランザクションスループット
トランザクションスループットは、ネットワークが1秒で処理できる処理能力です（ Transaction Per Second or TPS）。
![09.03 Blockchain Comparison-07 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516631/9ee9dce4-4f41-1a5d-fdf2-74de0e6d6383.png)

（*） UniChainでのTPSの開発予測は、サイドチェーンアーキテクチャを含めると最大100万となっています。
（**）実際のファイナリティタイムは、ユーザーの承認状況によって異なります。最大は75秒です。 2022年２Qのバージョンリリースでは正確に3秒となります。

# 4.　ネイティブトークン
ネイティブトークンは、取引手数料の支払いなどの特別な目的に役立つプラットフォームデジタル資産です。
![09.03 Blockchain Comparison-08 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516631/a4271706-bd7a-f97c-5f18-ec62871983e7.png)


# 5.　エコシステムとその他
![09.03 Blockchain Comparison-09 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516631/ed442233-a245-3fb5-86e8-f69f70bf24cf.png)
（*）コインマーケットキャップに基づく（ 28/2/2022 ）
マイコン操りたいのでtinygo環境構築とgoroutineしてみた

# あらすじ
会社で使用している機器のGPIO機能をテストしようと思ったので環境構築して使ってみたの巻。

# tinygoを入れる
https://tinygo.org/getting-started/install/windows/
これに従えばOK。
scoopを使わずにManual Installに従ったほうがシンプル。
好きなところに解凍してexeにpathを通す。

# avrのツールを入れる
お手軽なのはArduino IDE内のavrdudeにPathを通す方法。
`C:\Program Files (x86)\Arduino\hardware\tools\avr\bin`
とかにあるはず。

# その他
LLVMと本家goが必要といわれたらこれらもPathを通す。

# コーディングする
今回使用するのはESP32くん。
tミリ秒で無限にLチカする関数を用意し、500msと300msでトグルするようにして呼び出す。
goキーワードを書き足すだけで以降の処理と並行して実行されるらしい。なんかすごい！

```golang:main.go
package main

import (
	"machine"
	"time"
)

func main() {
	a := machine.IO5
	a.Configure(machine.PinConfig{Mode: machine.PinOutput})
	b := machine.IO23
	b.Configure(machine.PinConfig{Mode: machine.PinOutput})
	go ltika(a, 500)
	ltika(b, 300)
}

func ltika(p machine.Pin, t int) {
	for {
		p.High()
		time.Sleep(time.Duration(t) * time.Millisecond)
		p.Low()
		time.Sleep(time.Duration(t) * time.Millisecond)
	}
}
```
書き込み
```
tinygo flash -target=esp32-coreboard-v2 main.go
```
# 結果
見事に並行実行できました！静止画じゃ多分わからないけど。。。良い子は抵抗を付けましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1977360/c20b04ee-e9ee-e774-a707-77a0049e5242.png)
書き込みにかかった時間は6.309秒。そこそこ速く、コードも難しくないから楽しい！！！！
Windows＆SourceTreeでの開発環境で、ブランチの変更を行うと改行コードがCRLFになってしまう

Windows10環境でSourceTreeを利用しています。
gitで管理しているファイルの改行コードは「LF」なのに、ブランチ変更でファイルの改行コードがCRLFになってしまう事に気が付いた。
なんかおかしい。と思いSourceTreeのgit config見てみた。

## git config

```
C:\Users\{ユーザー名}> cd C:\Users\{ユーザー名}\AppData\Local\Atlassian\SourceTree\git_local\bin
C:\Users\{ユーザー名}\AppData\Local\Atlassian\SourceTree\git_local\bin> git config --system -l
```

あれ？
```
～中略
core.autocrlf=true
～中略
```
読んで字のごとく「自動CRLF=true」になってしまっているじゃないか！？


# 解決方法
globalとsystemの「core.autocrlf」を「false」にする
### global
```
C:\Users\{ユーザー名}\AppData\Local\Atlassian\SourceTree\git_local\bin> git config --global core.autocrlf false
↓
C:\Users\{ユーザー名}\AppData\Local\Atlassian\SourceTree\git_local\bin> git config --global -l
～中略
core.autocrlf=false
～中略
```

### system
```
C:\Users\{ユーザー名}\AppData\Local\Atlassian\SourceTree\git_local\bin> git config --system core.autocrlf false
↓
C:\Users\{ユーザー名}\AppData\Local\Atlassian\SourceTree\git_local\bin> git config --system -l
～中略
core.autocrlf=false
～中略
```

一件落着。
実務未経験者によるRubySilver対策

4ヶ月ほど前（2021年10月）にRubySilverに合格したので、忘れないうちに対策したこと、やって良かったこと、勉強になったことなどをまとめます。

# はじめに

筆者のステータス（受験時）：文系出身、実務未経験、Rubyは独学とプログラミングスクールで勉強したのみ
（いわゆる「チェリー本」は読んでいました）

# 試験結果
94点/100点

# 結論
それほど難しい資格ではなかったです。以下をやれば合格圏内に入れると思います。
1. [Ruby技術者認定試験合格教本（基本問題、模擬問題部分）](https://www.amazon.co.jp/%E6%94%B9%E8%A8%822%E7%89%88-Ruby%E6%8A%80%E8%A1%93%E8%80%85%E8%AA%8D%E5%AE%9A%E8%A9%A6%E9%A8%93%E5%90%88%E6%A0%BC%E6%95%99%E6%9C%AC-Silver-Gold%E5%AF%BE%E5%BF%9C-Ruby%E5%85%AC%E5%BC%8F%E8%B3%87%E6%A0%BC%E6%95%99%E7%A7%91%E6%9B%B8/dp/4774191949)

2. [公式？模擬問題集](https://www.ruby.or.jp/assets/images/ja/certification/examination/exam_prep_jp.pdf)

3. [REx](　https://rex.libertyfish.co.jp/)　※難易度高め（いくつか回答に誤りあり？）
※これは毎回問題が変わるので、やればやるほど色々なパターンを覚えると思います。

4. [minituku](http://www.minituku.net/drills/775230600.html) （いくつか回答に誤りあり）



# 実際に行った対策（期間：１ヶ月程度）
- 1.公式教本 を初めから読んでrubyについて理解する。
※網羅的にもう一度学習したいと思って自分は行いましたが、資格だけを考えれば不要かもです。

- 【**最重要**】1.公式教本〜3.RExまでの問題集を解きまくる。

- 【**重要**】合格者、不合格者のブログや記事を見る。
（傾向と対策の確認、落ちた人がやればよかった、といっているポイントを自分が理解しているか確認）

- 4.minitukuも１回り演習
- なかなか覚えられないものは別でまとめて直前に叩き込み、そのまま受験する

# 自分の受験時の状態
- 1.公式教本の模擬問題、演習問題、2.の模擬問題の内容は完全に頭に入れた

- 3.RExは安定して９２〜９６点以上取れる状態

- 4.minitukuは一通りやって、前日に間違えたところだけ１回復習

# 難易度の体感と感想

　4. minituku >= 3. REx > **実試験** ≒ 1. 公式教本 > 2. 公式？問題集

- 結果94点と、合格ラインまでかなり余裕があったので、資格を取るためだけであれば、もう少しラインを下げても良さそうです。
- 本番の難易度は、1.公式教本2.公式問題集レベル（3.RExや4.minitukuでたまーーに出てくる複雑な問題は出なかったです。）


# 試験時の感触
- ３５問： １００％あっている、と確信して回答　　
- １２問：９０％あっているだろう、と思って回答
- ２問：２択までいったが、どちらが答えかな、、、
- １問：全くわからん（問題の形式が初見）
＝＞　結果：94点

# 勉強して良かったこと

この資格を取った後、初めてプロジェクトに参加しましたが、「あっこれRubySilverでやったやつだ」と何度かなりました。
すぐにメソッド名が出て来なくても、Rubyでこういうことするメソッドあったなーと思えるだけでもかなり効率が良いと思います。
（split, uniq, concatなどは実際に案件でsilverで得た知識が生きた場面がありました。）
OpenSea (Polygon)で出品できない時の解決法

OpenSeaにてNFTをPolygonネットワークで販売登録しようとしたところ、`Selling functionality`を`unlock`出来なくて困っていた時の解決法・忘備録です。

NFT商品ページから、`Sell`ボタンを押す事で出品準備画面が出てきます。初回に`Complete Listing`を押して、色々とUnlockをする必要があり、場合によっては以下の様なエラーが表示され出品できない不具合に遭遇しました。

```
There was an error with your transaction. Please try again.
```

ブラウザのリロードなど色々試しても解決せず。メタマスクのMatic口座残高が全くなかったのが原因っぽい。

と言うわけでメタマスクにMaticを入金すれば無事解決・・・でもなかった。BinanceからmetamaskにMaticを振り込むまでが一苦労でした。参考にしたのがこちらのページです。

https://medium.com/crypto-and-defi/how-to-sent-matic-from-bsc-to-polygon-4bcd815ca49e

まず、最初に。バイナンスでMaticを買って、そこから直接メタマスクに送るのが簡単そうなのですけど、現在のところ（2022年3月11日）バイナンスからポリゴンネットワークで送金することができません。なので面倒臭いことをして振り込む必要があります。

1. バイナンスでETHを購入。
1. バイナンスからBSCネットワークを使い、自分のメタマスクのアドレスに直接送金。BSC上のETHコントラクトアドレスは[0x2170Ed0880ac9A755fd29B2688956BD959F933F8](https://bscscan.com/token/0x2170Ed0880ac9A755fd29B2688956BD959F933F8)
1. [EvoDefi](https://bridge.evodefi.com/)でETHを両替する。設定は以下の通り

![evodefi-matic.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145550/22508eba-7875-14b3-907d-c6f689d8a798.png)

4.メタマスクのネットワークをPolygonに切り替えると、無事に入金されているはず。

![ScreenShot 2022-03-11 at 5.20.20 PM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145550/f829d3c5-65db-6a1d-8a69-2c2f152c630a.png)

と言う事で、この後に、再び出品手続きしてみたら、すんなり出品できました。
Laravel8 personal_access_tokens のマイグレーションを無効化する

## Laravel 8.6.0 以降、Laravel Sanctumがなぜか標準搭載

- https://github.com/laravel/laravel/pull/5663
- https://github.com/laravel/laravel/releases/tag/v8.6.0

Laravel9にも `laravel/sanctum` がプリインストールされています。

- https://github.com/laravel/laravel/blob/9.x/composer.json

(なんでなん...？)

## マイグレーションファイルを消してもテーブルが生成される

https://github.com/laravel/laravel/blob/9.x/database/migrations/2019_12_14_000001_create_personal_access_tokens_table.php

Laravelをインストールすると `database/migrations/2019_12_14_000001_create_personal_access_tokens_table.php` ファイルがあります。
このファイルを消してマイグレーションを実行しても...

```
$ php artisan migrate
Migrating: 2014_10_12_000000_create_users_table
Migrated:  2014_10_12_000000_create_users_table (43.38ms)
Migrating: 2014_10_12_100000_create_password_resets_table
Migrated:  2014_10_12_100000_create_password_resets_table (35.42ms)
Migrating: 2019_08_19_000000_create_failed_jobs_table
Migrated:  2019_08_19_000000_create_failed_jobs_table (24.97ms)
Migrating: 2019_12_14_000001_create_personal_access_tokens_table
Migrated:  2019_12_14_000001_create_personal_access_tokens_table (56.15ms)
```

とこのように `personal_access_tokens` テーブルが生成されてしまいます。

実行されているのは下記のマイグレーションファイルです。

https://github.com/laravel/sanctum/blob/2.x/database/migrations/2019_12_14_000001_create_personal_access_tokens_table.php

## Sanctumが必要ない場合は...

Sanctumをアンインストールすればokです。

```shell-session
$ composer remove laravel/sanctum
```

## Sanctumのマイグレーションを無効化する

SPA認証を使う場合は、 `personal_access_tokens` は不要です。
そういった時はマイグレーションを無効化したいです。

サービスプロバイダに下記のようにコードを追加します。

```php:app/Providers/AppServiceProvider.php
<?php declare(strict_types=1);

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use Laravel\Sanctum\Sanctum;

class AppServiceProvider extends ServiceProvider
{
    public function register()
    {
        Sanctum::ignoreMigrations();
    }
}
```

Sanctumのマイグレーションが実行されないことを確認します。

```shell-session
$ php artisan migrate:fresh
Dropped all tables successfully.
Migration table created successfully.
Migrating: 2014_10_12_000000_create_users_table
Migrated:  2014_10_12_000000_create_users_table (40.94ms)
Migrating: 2014_10_12_100000_create_password_resets_table
Migrated:  2014_10_12_100000_create_password_resets_table (31.85ms)
Migrating: 2019_08_19_000000_create_failed_jobs_table
Migrated:  2019_08_19_000000_create_failed_jobs_table (35.03ms)
```

okですｂ
基本情報技術者試験　2日目

基本情報技術者試験対策　2日目
--

目的
--
模擬試験を解いて、できなかった問題をまとめて、整理する。

できなかった箇所
--
1論理チェック
関連のある項目の値に矛盾がないかどうかをチェック

2 フォーマットチェック
入力データのけた数や文字種などの書式や形式が正しいかを検証

3 重複チェック
入力データと同じデータが既に入力済みではないか(一意であるか)を検証

4 シーケンスチェック
データが定められた順番に並んでいるかどうかを検証

5 2分探索
①要素が昇順または降順に整列された集合に対して、探索範囲の中央に位置する値と探索する値を比較
②　探索する値＜中央値
目的の値　→ 範囲の先頭から中央までに存在
　　探索する値＞中央値
目的の値　→ 中央から最後の値までに存在


6　UML(Unified Modeling Language)
オブジェクト指向開発で用いられる標準表記法群で、オブジェクト間の関連や動作・構成を表現する13種の図表から構成

7 構造図
システムの静的な構造をモデルで表現する。
クラス図，コンポジット構造図，コンポーネント図，配置図，オブジェクト図，パッケージ図

8 振る舞い図
システムの振る舞いをモデルで表現する。
アクティビティ図，ユースケース図，シーケンス図，インタラクション概念図，コラボレーション図，タイミング図，ステートマシン図

9 クロスコンパイラ
コンパイルを実施するコンピュータとは異なるアーキテクチャをもったコンピュータで動作するオブジェクトコードを生成

10 デバッガ
プログラムの実行時に，呼び出されたサブプログラム名やある時点での変数の内容を表示するようなオブジェクトコードを生成する

振り返り
--
テクノロジー系の正解率が低い。
間違ったポイントを意識しながら、明日も引き続き30問は取り組む！

>基本情報技術者試験
https://www.fe-siken.com/
pyqt5 ros 

# 1

pyqt5のROS guiをノードにしたもの

```python
import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *

import rospy

def window():
  rospy.init_node("PyQT5_ROS")
  app = QApplication(sys.argv)
  w = QWidget()
  b = QLabel(w)
  w.setGeometry(100,100,200,50)
  b.setText("         ")
  b.move(50,20)
  w.setWindowTitle("PyQt5 + ROS")
  w.show()

  count = 0
  while not rospy.is_shutdown():
    QApplication.processEvents()
    b.setText(str(count))
    count = count + 1

if __name__ == '__main__':
   window()

```

![Screenshot from 2022-03-12 00-22-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/589906/a9afe158-36e0-8e5d-fc41-14589165ec47.png)
色情報の特徴量をRGBで表現する

# はじめに
色情報が"Green"や"White"などの文字列で表現された特徴量があるとする。
これを特徴量としてベクトル変換する際、以下のような方法が考えられる。
1. one-hot変換する
2. いくつかの色カテゴリに分類する。

問題点として1の手法では次元が多くなってしまい、2の方法では手動でカテゴリを適切に設定する必要がある。

この記事では、色情報を[webcolors](https://github.com/ubernostrum/webcolors)というライブラリを使ってRGB変換し、それぞれを比例尺度の特徴量とすることを提案する。

表で表すと以下のようなテーブルがあった際に
|  |color  |
|---|---|
|1  |white  |
|2  |blue   |
|3  |red   |
|4  |green   |

以下に変換する
|  |red  |green  |blue  |
|---|---|---|---|
|1  |255  |255|255|
|2  |0  |0|0|
|3  |255   | 192 | 203
|4  |255   | 165 | 0

こうすると色情報を比例尺度で表すことができるため有利な気がする。

# 実装
[webcolors](https://github.com/ubernostrum/webcolors)は色文字列を受け取ってrgbを返してくれるライブラリである。これを利用することでRGB変換を実現する。
実装例をいかに示す。

```python
# 名前をRGB変換する
import webcolors
def convert_color_name_to_rgb(color_name: str):
    color_name = color_name.lower().replace(" ","")
    try:
        return webcolors.html5_parse_legacy_color(color_name).red, webcolors.html5_parse_legacy_color(color_name).green, webcolors.html5_parse_legacy_color(color_name).blue, False

    except ValueError:
        return 125,125,125, True



df[['color-red','color-green','color-blue','color-ValueError']] = df.apply(lambda x: convert_color_name_to_rgb(x["color"]),axis=1 ,result_type='expand')
df = df.drop('color', axis=1)

# ValueErrorは削除する
df = df[df["color-ValueError"] == False]
df = df.drop("color-ValueError", axis=1)
```

# 注意
webcolorsでうまく変換できない色があるっぽい?
[UE5] JsonBlueprintUtilities

# Jsonを気軽に読み書きしたい！

UnrealEngine5にJsonをブループリントから気軽に読み書きするプラグインがエンジンに組み込まれました。5.0時点ではBeta版となっており、今後APIの大幅な変更は予定されませんが安定面などの面で使用には注意が必要というステータスです。
Jsonはソースコントロールによるマージが可能なため、複数の開発者が同時に変更しても(コンフリクトに気を付ければ)問題が無く、気軽な運用ができることに大きなメリットがあると個人的に思います。

# 有効化
デフォルトではプラグインは無効化されているのでメインメニュー > Edit > Plugin を開いて有効化します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/464248/fe2ee39d-1fd8-729e-140d-5b3f1ea64048.png)

# ノードたち

Jsonファイルのセーブロード、Json文字列からのロードと文字列への出力、フィールドへの読み書きのノードがあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/464248/0b83a8d3-0407-d164-8621-039dddfc3aa8.png)


# 使用例

## サンプルJson
以下のようなJsonファイルをContent/Json以下に配置します。

JsonUtilityLibrary
```sample.json
{
	"name" : "IamJson",
	"value" : 123,
	"array" : [
		"index 0 in array",
		"index 1 in array",
		"index 2 in array"
	],
	"map" : {
		"first" : 1.2,
		"second" : 1.75,
		"third" : -0.001
	}
}
```

## ブループリントでの利用例
まずはロードするときに与えるパスについて注意点があります。
直接相対パスで記述した場合、FPlatformProcess::BaseDir()からの相対パスとなります。エディタでは `[エンジンのルート]/Engine/Binaries/Win64/` となりプロジェクト側からでは使いにくいので ProjectContentDirやProjectDirなどからの相対パスを作成して渡すことをお勧めします。
**またもう一つ重要な点としてJson中の配列へのアクセスを行うことが出来ません。例えば前述のsample.jsonではarray以下を読み取ることはできません。ご注意ください。**
(辞書形式(map|連想配列)であれば読み取れるのでこちらで代用などを検討してください。)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/464248/5e9e5a49-b905-fbbe-79bd-55a2f7e03f22.png)

# パフォーマンスについて
非常に気軽に利用できるプラグインですが、Jsonの構造をロードするときに細かく大量のメモリアロケーションを行うためパフォーマンス面ではあまり効率的ではありません。巨大なJsonを読んだり、ランタイム中にフレームレートを維持したままデータを読み取りたいといったニーズにはあまり適しません。
そういったニーズでは [rapidjson](https://github.com/Tencent/rapidjson)などの高速かつ省メモリなパーサーを活用することをお勧めします。
Windows環境のPythonでN-gram生成ツール SRILM を使う方法

# SRILMのインストール手順
### 1.SRILMのインストール
今回はCygwin環境にSRILMをインストールします。
Cygwinの設定は[前回の記事（Windows環境のPythonで形態素解析器 -- ChaSen -- を使う方法）](https://qiita.com/phi934/items/2fd43a3ea3e51dde10e3)を参照

SRILMのダウンロードは[**こちら**](http://www.speech.sri.com/projects/srilm/download.html)から（今回は srilm-1.7.3.tar.gz を使用しています。）

Cygwin64の直下に「srilm」というフォルダを作成
```
cd /
mkdir srilm
cd srilm
```

作成したフォルダにダウンロードしたsrilm-1.7.3.tar.gzをコピーする。
そして、作成したフォルダ内でsrilm-1.7.3.tar.gzを解凍する。
```
tar zxvf srilm-1.7.3.tar.gz
```

解凍したフォルダ内の「Makefile」を開き、次の行を見つける。
```
# SRILM = /home/speech/stolcke/project/srilm/devel
```

見つけた行を次のように書き換え、保存する。
```
SRILM = /srilm
```

Cygwinに戻り、次のように実行する。
```
make
```

### 2.SRILMの実行
「**ngram**」や「**ngram-count**」の実行ファイルがあるフォルダに移動する。
```
cd bin/cygwin64/
```

次のように実行する。
```
./ngram-count -text [input_corpus] -lm [output_language_model] -order 3 -write [output_ngram]
```
input_corpus：入力するファイル（文章から単語をスペースで区切ったもの）
output_language_model：出力する言語モデルのファイル名
output_ngram：出力するN-gramのファイル名

# コマンドプロンプトでSRILMを実行
**環境変数の変更方法**は[前回の記事（Windows環境のPythonで形態素解析器 -- ChaSen -- を使う方法）](https://qiita.com/phi934/items/2fd43a3ea3e51dde10e3)を参照

Windowsのコマンドプロンプトを開く。
次のように実行する。
```
C:\cygwin64\srilm\bin\cygwin64\ngram-count -text [input_corpus] -lm [output_language_model] -order 3 -write [output_ngram]
```
Cygwinの時と同じ結果が出力されればOK。

# PythonでSRILMを実行
ソースコードを以下に載せております。
```python:srilm.py
import subprocess
import os

def srilm(srilm_path, input_corpus, output_language_model, output_ngram):
    path = os.getcwd().replace(os.sep,'/')+"/" # 実行中のパス取得
    cmd = "{0} -text {1} -lm {2} -order 3 -write {3}".format(srilm_path, path+input_corpus, path+output_language_model, path+output_ngram)
    proc = subprocess.Popen(cmd, shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    stdout, stderr = proc.communicate()

if __name__ == '__main__':
    srilm_path = "C:/cygwin64/srilm/bin/cygwin64/ngram-count"
    input_corpus = "corpus.txt"
    output_language_model = "lm.txt"
    output_ngram = "count.txt"

    srilm(srilm_path, input_corpus, output_language_model, output_ngram)
```
コマンドプロンプトで実行した時と同じ結果が出力されればOK。
以上、Windows環境のPythonでSRILMを使う方法でした。

# 参考にしたページ
https://qiita.com/yukinoi/items/1f4f6c7e5b13830bdcc0

https://hovinh.github.io/blog/2015-12-22-install-srilm-windows/

https://okapiframework.org/wiki/index.php/SRILM_Installation_and_Running_Tutorial
【超初心者向け】rails migrationファイルの削除方法

# この記事を読むとわかること
1. マイグレーションファイルを削除する方法
1. NO FILE を削除する方法


初学者ですが、自分が躓いた箇所を基礎からなるべく分かりやすく書いたつもりなので
参考にしていただけると幸いです。
また間違っているところがあればご教授お願いします。

---
# 【STEP0】 migrationの現状把握
まず、migrationの状況確認しましょう
わかる方は読み飛ばしてくださいー
確認コマンドは↓↓↓
```bash
rails db:migrate:status
```
ターミナルへ入れると下のように確認ができます。
```bash
ec2-user:~/environment/sample (main) $ rails db:migrate:status

 Status   Migration ID    Migration Name
--------------------------------------------------
   up     20211219053729  Devise create users
   up     20211219065745  Devise create admins
   up     20211219070933  Create apps
   up     20211219071038  Create logs
   up     20211225103252  Create active storage tablesactive storage
   up     20220126105427  Hoge

```
左列のstatusがupになっているとmigtrationの内容が更新されない状態です。
次の解説でstatusをdownしてから、いらないmigrationを消し去りましょう!

# 1.  マイグレーションファイルを削除する方法
### 手順まとめ
**1.migrationをdownにする**
`$ rails db:migrate:down VERSION=マイグレーションID`

**2.migrationファイルを削除する**
`$ rm db/migrate/マイグレーションID_hoge.rb`

## 【解説】
### 【1-1】migrationをdownにする
statusで確認した"Migration ID"を以下コマンドに当てはめます
```bash
rails db:migrate:down VERSION=Migration ID
```
実際に動かしてみると 
```bash
ec2-user:~/environment/sample (main) $ rails db:migrate:down VERSION=20220126105427
== 20220126105427 Hoge: reverting =============================================
== 20220126105427 Hoge: reverted (0.0027s) ====================================
```
再度`rails db:migrate:status` で確認するとdownになっているはずです!

### 【1-2】migrationを削除
downにできたのでこれでファイルの削除ができるようになりました!
あとは下のコマンドで瞬☆殺です! ^^
(コマンドではmodelの頭文字は小文字でOKです)
```bash
rm db/migrate/20220126105427_hoge.rb
```
---
# 2.  NO FILE を削除する方法
### 手順まとめ
**1. NO FILEを名前をつけて復活させる**
`$ touch db/migrate/マイグレーションID_hoge.rb`

**2. migrationファイルに内容記載**

**3.記載した内容を反映させる**
`$ rails db:migrate`

**4.migrationをdownにする**
`$ rails db:migrate:down VERSION=マイグレーションID`

**5.migrationファイルを削除する**
`$ rm db/migrate/マイグレーションID_hoge.rb`

## 【解説】
### 【2-1】　NO FILEを名前をつけて復活させる
modelを先に消してしまった場合、
statusを確認すると、`********** NO FILE **********`となっています。
```
ec2-user:~/environment/sample (main) $ rails db:migrate:status

 Status   Migration ID    Migration Name
--------------------------------------------------
   up     20211219053729  Devise create users
   up     20211219065745  Devise create admins
   up     20211219070933  Create apps
   up     20211219071038  Create logs
   up     20211225103252  Create active storage tablesactive storage
   up     20220126105427  ********** NO FILE **********
```
この状態ではそもそもファイルがなく、ファイルの削除ができません。

ファイルが無いのであれば、削除のためにファイルを作っちゃいましょう☆
NO FILEのIDをtouchコマンドを使って以下のように打ち込みます。
```
touch db/migrate/20220126105427_hoge.rb
```
### 【2-2】　migrationファイルに内容記載
後は消すだけ!と思ったら

作成されたファイルに中身を書かないと、認識してくれないようなので"中身をかけ"と怒られます。
(5.2の数字は他のmigrationファイルと合わせた数字を書きます)
```rails
class CreateHoges < ActiveRecord::Migration[5.2]
  def change
  end
end
```
中身を書いたので`rails db:migrate`を忘れずに、、、

ここまでくれば、前半と同じで
**migrationをdownにする**
`$ rails db:migrate:down VERSION=マイグレーションID`

**migrationファイルを削除する**
`$ rm db/migrate/マイグレーションID_hoge.rb`

で、完了です!!!

以上、ご覧いただきありがとうございました!
C# から C ソースの生成・コンパイル・実行まで

# 環境
Ubuntu 18.04 (WSL2 / Windows 11)
.NET 5.0 / C# 9.0
gcc 7.5.0

# やること
ワークスペース直下にCソースを生成し、gccでコンパイルして実行まで.NETアプリ（C#）で行います。gccが吐いたエラーはそのまま表示します。

## ソース生成
```C#:Program.cs
// using System.Text;
// using System.IO;

var sb = new StringBuilder();
sb.AppendLine($@"#include <stdio.h>");
sb.AppendLine($@"");
sb.AppendLine($@"int main() {{");
sb.AppendLine($@"    printf(""Hello C!\n"");");
sb.AppendLine($@"    return 0;");
sb.AppendLine($@"}}");

var writer = new StreamWriter("hello.c");
writer.WriteLine(sb.ToString());
writer.Close();     
```

これで、↓が生成されます。

```C:hello.c
#include <stdio.h>

int main() {
    printf("Hello C!\n");
    return 0;
}

```

ちょっと例が悪いですが、ソースには変数の埋め込みとかしたいはずなので `$@""`形式の補完文字列を使っています。この文字列には、`{a}`や`{a * b}`のような形で（ほとんど）任意の変数や式を書くことができ、また改行文字などをエスケープできます（かわりに、文字として出力させたい場合は`"`のほか`{}`も2つ重ねて書く必要があります）。ちなみに`$@`から始まる補完文字列は複数行をまとめて書けるので、たとえば

```C#:C#
string source = $@"
#include <stdio.h>

int main() {{
    printf(""Hello C!\n"");
    return 0;
}}
";
```

みたいにすることもできます。ただ、ソース文字列の左にあるインデントが出力先にそのまま反映される（エディタ・フォーマッタの設定次第？）ので、たとえば同じ方法でCではなくPythonのソースファイルを生成すると怒られる可能性があります。ソース部分がインデントされていなければ問題ないはず。

## コンパイル・実行

```C#:Program.cs
// using System.Diagnostics;

var pInfo = new ProcessStartInfo()
{
    FileName = "gcc",
    Arguments = "hello.c",
    UseShellExecute = false,
    RedirectStandardOutput = true,
    RedirectStandardError = true
};

var process = Process.Start(pInfo);
process.WaitForExit();
var output = process.StandardOutput.ReadToEnd();
Console.WriteLine(output);
var error = process.StandardError.ReadToEnd();
Console.WriteLine(error);

```

`UseShellExecute` を `false` にしておかないと、C#側で出力を読めません。逆に言えば、C#側で読みだす必要がなければ`UseShellExecute`は`true`にしておくことで標準出力をシェルにそのまま吐き出してくれます（その場合は`RedirectStandardOutput`は`false`にしておかないと例外）。ここではコンパイルの成否によってそのまま実行するかいったん止めるか分けたかったのでこうなっています。

**2022/03/20追記**
...
標準エラーもリダイレクトしないとコンパイルの成否判定はできません（ソース修正済み、`RedirectStandardError = true`とすればOK）。
当たり前ですがすっかり失念していました...
...

`Arguments` には空白区切りにして複数の引数を記述できます。たとえば、


```
Arguments = "hello.c -o hello"
```

などとすることもできます。gccなら`-march`や`-O`オプションなどもOK。

同じ要領で、`FileName`を`a.out`（または`-o`オプションで指定した実行ファイル名）にしてやればコンパイルしたCアプリを実行できます。