OmniAICreator/Qiita-1.07M huggingface dataset:
AWS DynamoDB メモ 項目削除ではまったこと

# エラーと原因

- エラーメッセージ

```
[ERROR] ClientError: An error occurred (ValidationException) when calling the DeleteItem operation: The provided key element does not match the schema
```

- 原因

`DynamoDB.Table()` クラスの `delete_item()` メソッドの `Key` 引数にプライマリキー以外のキーを指定していた

- 関連するドキュメント


> A map of attribute names to AttributeValue objects, representing the primary key of the item to delete.
>
>For the primary key, you must provide all of the attributes. For example, with a simple primary key, you only need to provide a value for the partition key. For a composite primary key, you must provide values for both the partition key and the sort key.

https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/dynamodb.html#DynamoDB.Table.delete_item

# 例

## プライマリキーと削除したい項目

- プライマリキー

|パーティションキー|ソートキー|
|---|---|
|year|title|

- 削除したい項目

```json
{
  "year": {
    "N": "2000"
  },
  "title": {
    "S": "sample movie"
  }
  "director": {
    "S": "sample director"
  }
}
```

## コード例

### うまくいかないコード

```python:lambda_function.py
import json
import boto3
import decimal

dynamodb = boto3.resource('dynamodb')

def delete_movie(item):
    """
    項目削除メソッド
    """
    table = dynamodb.Table('sample-table')
    table.delete_item(
       Key={
            'year': decimal.Decimal(item['year']),
            'title': item['title'],
            'director': item['director']
        }
    )

def lambda_handler(event, context):
    item = {
        'year': event['year'],
        'title': event['title'],
        'director': event['director']
    }
    delete_movie(item)
```

### うまくいくコード

```python:lambda_function.py
import json
import boto3
import decimal

dynamodb = boto3.resource('dynamodb')

def delete_movie(item):
    """
    項目削除メソッド
    """
    table = dynamodb.Table('sample-table')
    # Key にはパーティションキーとソートキーのみ指定する
    table.delete_item(
       Key={
            'year': decimal.Decimal(item['year']),
            'title': item['title']
        }
    )

def lambda_handler(event, context):
    item = {
        'year': event['year'],
        'title': event['title'],
        'director': event['director']
    }
    delete_movie(item)
```

# 参考記事

https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/GettingStarted.Python.03.html#GettingStarted.Python.03.06

https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/dynamodb.html#DynamoDB.Table.delete_item
Lambdaオーソライザー使う時に知っておくと良いこと

### はじめに

最近、RESTでAPIを作るときにはLambda + APIGatewayで作ることが多いのですが、認可処理を作るときにはLambda オーソライザーが便利ですよね。
しばらく使ってみたので、新しく使おうと思う方向けに知っておいた方が良い知見を共有しようと思います


### [Lambda Authorizer](https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/apigateway-use-lambda-authorizer.html)とは

Amazon API Gatewayの機能で、APIのメソッドを実際に呼び出す前に認可処理用のLambdaを呼び出し、そこの結果で許可された場合のみ実際のAPIを呼び出せるというものです。

実際のAPIの処理から認可処理を分離することができるのと、APIで認可処理を再利用することができるので、とても有用です。
Lambda Authorizer以外でも認可処理をする方法は、[Amazon Cognitoユーザープールオーソライザー](https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/apigateway-integrate-with-cognito.html)やCognito IDプールを使った方法など、他にもありますが、データベースの情報などを使って認可処理をする場合はLambda Authorizerが便利だと思います。

```plantuml

クライアント --> APIGateway : 認証情報付きリクエスト
APIGateway --> LambdaAuthorizer : 認証情報
APIGateway <-- LambdaAuthorizer : 認可結果
alt 認可失敗
クライアント <-- APIGateway : 4XX系エラー
else 認可成功
APIGateway --> 何かしらの処理
APIGateway <-- 何かしらの処理
クライアント <-- APIGateway : 処理結果
end
```

### 便利機能1: 認証キャッシュ

Lambda Authorizerは、基本的にはAPIリクエストの度に呼ばれるのですが、
同じ認証情報を使ってリクエストされた場合は、認可処理の結果もほとんどの場合同じになると考えられるので、キャッシュを使うことで認可処理の実行頻度を減らすことができます。
挙動や設定の方法については、[Amazon API Gateway Lambdaオーソライザーの認証キャッシュを有効化し挙動を確認してみた](https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/apigateway-integrate-with-cognito.html)の記事がとてもわかりやすいので割愛します。

キャッシュを有効化した場合のシーケンス図は以下のようになります。キャッシュの有効期間の間はLambdaAuthorizerの呼び出しがスキップできます。

```plantuml

クライアント --> APIGateway : 認証情報付きリクエスト
alt キャッシュなし
APIGateway --> LambdaAuthorizer : 認証情報
APIGateway <-- LambdaAuthorizer : 認可結果
end
alt 認可失敗
クライアント <-- APIGateway : 4XX系エラー
else 認可成功
APIGateway --> 何かしらの処理
APIGateway <-- 何かしらの処理
クライアント <-- APIGateway : 処理結果
end
```

注意点としては、認証情報の有効期限を延長することになるので、キャッシュ期間を長くしすぎると有効期限切れの認証情報を使って情報を取得できてしまうため、その考慮を忘れないようにしましょう。

### 便利機能2: オーソライザーの出力を処理側に渡せる

["Amazon API Gateway Lambda オーソライザーからの出力"](https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/api-gateway-lambda-authorizer-output.html)の機能を使うと、Authorizerの情報を処理側に渡すことができます。

キャッシュとも組み合わせると、Authorizerでユーザーの情報などを出力するようにしておくと、処理側でユーザーの情報をあらためてデータベースに問い合わせる必要がなくなります。

例えば、下図のシーケンス図のように処理側でユーザーの情報をDBに問い合わせしているケースなどがあれば、その情報をAuthorizer側で事前取得し、出力することで問い合わせ数を減らすことができます。


```plantuml

クライアント --> APIGateway : 認証情報付きリクエスト
alt キャッシュなし
APIGateway --> LambdaAuthorizer : 認証情報
LambdaAuthorizer <--> DB : ユーザーのデータ
APIGateway <-- LambdaAuthorizer : 認可結果
end
alt 認可失敗
クライアント <-- APIGateway : 4XX系エラー
else 認可成功
APIGateway --> 何かしらの処理 : Authorizerの出力込みのリクエスト情報
DB <<-->> 何かしらの処理 : ここの問い合わせを\nスキップできる
APIGateway <-- 何かしらの処理
クライアント <-- APIGateway : 処理結果
end
```

ただ、出力できる情報のサイズには上限があるので注意が必要です。

### まとめ

今回は、Lambda Authorizerの便利機能について紹介しました。
もし、活用されることがあれば、参考になれば幸いです。
[python] バイト数指定でテキスト切り出し

以前、python2系で作成していたテキストファイルの一部を切り出して別ファイルにしていた処理が、python3系で切り取りに使っていた len がバイト数じゃなくて文字数カウントになってしまったので修正が必要になったメモです。

```python
text = "012345あいう67890"
charcode = 'cp932' # 文字コード指定
byte_text = text.encode(charcode) # 文字列エンコード
clip_text = byte_text[6:12].decode(charcode, errors='ignore') # バイト単位で切り取った文字をでコードで戻す
```

ちょっと面倒だけど、できました。
もっといい方法は無いのかしら。
Reactにおいての副作用の意味 

# 副作用？
Reactを勉強していて誰もが一度躓くのがこの言葉だと思います。

####  「副作用」

僕がこの言葉を聞いて思い浮かべるのは「薬の副作用」でした。風邪薬を飲んだら副作用で眠くなりますよというようなイメージです。

辞書にもこのように書かれていました。
>  副作用...薬物の、病気を治す作用とは別の、望んでいない作用。有害なことが多い。「―を伴う特効薬」

このイメージのまま次の文を読むと意味が分からないと思います。

>副作用 (effect) フック により、関数コンポーネント内で副作用を実行することができるようになります

僕は最初、『？？？』となりました。


# 副作用の再定義

Reactでの副作用を理解するにはまず、今までの副作用の定義を忘れましょう。Reactは`useState`で状態を持ちます。

```react
const [state, setState] = useState()
```
`setState`をして`state`を変えた時、ページをリロードせずとも自動的に`state`が変わりますよね。この`state`が変わる時Reactは**ページを再レンダー**しています。そしてこの再レンダー時（≒state変更時)に実行させる処理が**副作用**です。

（こんな感じ）
```react
const [state, setState] = useState()

useEffect(() => {
  hukusayou(state)
},[])

const handleClick = () => {
  setState('hoge')
}

const handleChange = () => {
  setState('bar')
}
```

上記を見ていただければ、「なぜわざわざ再レンダー時に副作用を起こすのか？」ということも分かるかと思います。setState後に続けて副作用の処理を書くとなると次のようになります。

```react
const [state, setState] = useState()

const handleClick = () => {
  setState('hoge')
  hukusayou(state)
}

const handleChange = () => {
  setState('bar')
  hukusayou(state)
}
```

このやり方でもstate変更時に実行させる処理、副作用を起こせています。しかし、一点問題があります。上記のコードはDRYでないですね。

`hukusayou(state)`を複数回呼び出しています。hukusayou関数が「stateの変更時に実行させたいもの」であるのならuseEffect内に書くと良いです。


# コードの捕捉
一応、上記のコードはもう一点問題があります。

```react
const handleClick = () => {
  setState('hoge')
  hukusayou(state)
}
```

hukusayou関数をsetState後に呼び出しているのですが、hukusayouに渡しているstateはsetState前のstateです。setStateは非同期で動くのでこのようになっています。なのでstateではなく新しい値をそのままhukusayou関数に渡しましょう。

```react
const handleClick = () => {
  setState('hoge')
  hukusayou('hoge')
}
```
Prefabに設定しているデータ構造をプログラムで一括変更して保存する

ゲームのバランス調整をしていると、色々仕様を変えたい部分が出てきます。。。

今回の場合、敵モーションのバリエーションを増やしたくなりました。
しかし、敵モーションは「攻撃」「必殺技1」「必殺技2」の3パターンを想定して、
Prefabにそのモーションの設定を個別に設定して実装していました。
（下記のような感じ）
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/88968/92b88bdb-09b5-6856-c176-065ed4d88e1c.png">


リスト化して増やせるように修正したかったのですが、
既に大量の敵モーションをPrefabに設定してしまっていたので、
手作業で行うのは絶望的でした。

そこで、プログラムでPrefabに設定したデータを移行する処理を書いて一括変更する対応をしました。
移行後は下記のような感じです。
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/88968/002f1d34-5855-e2e8-eca3-88e1995d62f8.png">



ポイントとしては、
- 変更対象のPrefabのリストを取得
- Prefabをロード
- パラメータ変更の処理
- Prefabを保存

```c#:EnemyMotionEdit.cs
using UnityEditor;
using UnityEngine;
using System.Collections.Generic;
using System.Linq;
using System.IO;

public class EnemyMotionEdit : EditorWindow {
	[MenuItem("Appli/敵モーションパラメーターデータ移行")]
	public static void EnemyMotionParamEdit() {
		List<string> paths = Directory.GetFiles(Application.dataPath + "/AppliResources/AssetBundle/additional/enemy", "*.prefab", SearchOption.AllDirectories).ToList();
		foreach(string path in paths) {
			// Prefabロード
			GameObject contentsRoot = PrefabUtility.LoadPrefabContents(path);

			// モーションパラメータ移行処理
			var motionController = contentsRoot.GetComponent<EnemyMotionController>();
			motionController.MotionParamEdit();

			// 保存
			PrefabUtility.SaveAsPrefabAsset(contentsRoot, path);
			PrefabUtility.UnloadPrefabContents(contentsRoot);
		}
	}
}

```

```c#:EnemyMotionController.cs
	/// <summary>
	/// モーションパラメーター移行処理
	/// </summary>
	public void MotionParamEdit() {
		motionParamList = new List<MotionParam>();
		motionParamList.Add(attackMotionParam);
		motionParamList.Add(special1MotionParam);
		motionParamList.Add(special2MotionParam);
	}

```

メニューからデータ移行処理実行
<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/88968/93e752ce-c31c-f87f-a9cc-635ee009debd.png">
Material UIのスタイルをカスタマイズする方法

Material UI v5でのカスタマイズ法です。`styled`でのカスタマイズ法を書きます。

# カスタマイズの仕方

TextFiledを例に使います。こんな感じです。

```react
import { styled } from "@mui/system"
import { TextField } from '@mui/material'

const CustomTextFiled = styled(TextFiled)({
    backgroundColor: "black"
})
```

これで背景を黒色にすることができました。

![Screen Shot 2022-04-25 at 20.25.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/949101/e51bdfe4-0a56-67b3-acd7-5c52ea1ae044.png)


次にアウトラインも黒にしてみましょう。Material UIのカスタマイズで躓くことがあるとすれば、ここですね。

上記にそのまま`border: "none"`といったように書いてもborderは消えません。なぜならTextFiled内のネスとしているコンポーネント内でスタイリングされているからです。

まず、開発者ツールから青いアウトラインのスタイリングをしている要素を探します。

![Screen Shot 2022-04-25 at 20.30.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/949101/2cff5d6a-1566-dcda-2510-f8ab8bd44e7b.png)

filedsetにborder-colorがありました。どこでスタイリングされているか分かったのでコードに書きます。奥深い要素のスタイリングをするときはsxを使います。書き方はSCSSのような感じです。

```react
import sx from "@mui/system/sx"

const CustomTextFiled = styled(TextFiled)(sx({
    backgroundColor: "black"
    "& .MuiOutlinedInput-root": {
        "&:not(:focus) fieldset": {
            border: "none",
        },
        "& fieldset": {
            borderColor: "none",
        },
        "&:hover fieldset": {
            borderColor: "none",
        },
    }
}))
```

これでTextFieldを真っ黒にすることができました。

![Screen Shot 2022-04-25 at 20.41.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/949101/ced58679-f970-634d-c24b-331c75bc2ed9.png)
モブ・コードレビューをやってみて

## 概要

私たちのチームでは最近モブコードレビューというものを行っています。
モブコードレビューとは私たちのチーム内の独自の呼び名です。
チームメンバーが集まって、開発メンバーが書いたコードを見ながらその場でコードレビューをして、必要であればその場で修正していくといったコードレビューの仕方です。

これまでのGitHubのプルリクエスト上でコメントをやり取りする方法より、より良い結果を得られるケースがあります。メリットやデメリットにはどういったものがあるのか、どうしてモブコードレビューをやることになったのか、といったことをご紹介したいと思います。

## モブ・コードレビュー

これまで、GitHubのプルリクエストのコメント上でやり取りしていたようなことを、１つの画面を見ながらリアルタイムに行っていきます。
モブという名の通り、レビューワーは一人ではなくチーム全員で行います。レビュー中に修正箇所が見つかると、その場でコードを修正していきます。

もし、モブプログラミングをご存じであれば、形式はモブで、内容がコードレビューにフォーカスしたものだと言えば伝わり易いかもしれません。

## チーム事情

私たちの開発チームを簡単に説明しておきます。
ベテラン2名＋新人2名の4人のチームです。
新人2名はプログラミングを初めて半年程度です。
開発環境は Ruby On Rails です。

## どうしてやることになったのか

私たちのチームでは、ベテラン2名と新人2名がそれぞれ２つの異なったプロダクトに対する開発を行っているという事情があります。
このためベテラン＋新人の組み合わせによるペアプログラミングやモブプログラミングができませんでした。

また従来通りのプルリクエストによるコードレビューでは、やり取りが煩雑であったり、レビューした内容が新人ふたりに行き渡らなかったり、意図したようなコード修正がなされなかったりといった課題を抱えていました。

こういった課題を解消するために、コードレビューとレビュー結果を反映させるコード修正にフォーカスした変則的なモブプログラミング→モブコードレビューを行ってみることにしました。


## やってみてどうだったか

前述の課題を解消するためにモブコードレビューを行ってみたのですが、思った以上に効果的で、今のところ継続しています。
新人向けのコードレビューでありがちな理解不足や勘違いによる再レビュー、再々レビューが減少しました。
指摘事項だけでなく、その理由や応用についても、その場で話しできるので新人の理解も進んでいます。
その理解が新人ひとりだけでなくチーム全体で共有できるのも良い点です。
また、ベテランメンバーといえど新人のコードから教わることもあるので逆も然りです。

## どんな場面におすすめか

やはり一番は新人の育成フェーズだと考えます。
もちろんペアプログラミングやモブプログラミングが出来るならそちらの方がより効果的ですが
様々な制約でそれができない場面があるかと思います。
そういった場合にモブコードレビューがおすすめできると思います。


## やり方

新人が書いたコードはチーム全員でモブコードレビューを行うようにしています。
ベテラン2名が書いたコードはベテラン同士で相互レビューしています。

- チームメンバー全員が１つの画面を見る（リモートでも可）
- レビュー対象のコードを書いた人がドライバーとなる（画面を操作する人）
- 残りのメンバーはレビュアーとなる
- 時間は30分程度
- ドライバーが今回レビューしてほしいコードについて説明する
    - 仕様、コード、テストケース、テストコード
- 説明を受けながら、レビュアーは疑問点を質問したりコードの修正を依頼する
- ドライバーはレビュアーからの質問に答えたり、コードの修正依頼に沿ってコードを修正する
- コードを修正する場合、レビュー後にひとりで修正するのではなく、できるだけその場でコードを書き直す
- コードをどのように修正するかは、ドライバーだけでなく周りのメンバーも逐一指示を出しながら行っていく
- 簡単な修正で、修正の誤解も生じなさそうな場合、ソースに「TODO」コメントを記述しておいて、後でひとりで修正してもらう
- ベテランだけが指摘するのではなく、新人もレビューを行う

## プルリクエストに対してコメントを行うコードレビューと比較して

### メリット

- コードを見る目が多いので、間違いや改善点に気付きやすい
- モブで行うことで、レビューを受けた人だけが修正理由を理解するのではなく、チーム全体で共有できる
- コードの修正理由がわからない場合に、その場で理由を確認できる
- その場でコードを修正してもらうので、修正後の再確認が必要ない
- チーム全体でプロダクトのコードや仕様についての理解が深まる
- コード修正時の試行錯誤をチーム全体で行った場合、チーム全体で結果に納得感を持てる（独りで行っていると結果だけでなく、途中経過もシェアしないと理解を得られない場合がある）

### デメリット

- 全員参加なので、単純に時間が多く取られる
- 全員参加しなくても良い場面もあるので、効率が悪いことがある
- その場で修正するので、コードレビュー以外の時間が取られる
- 修正を行う場合、周りが「答え」を言いがちになるので、新人が考える余地を奪ってしまうことがある
- コードの品質によっては、レビューよりもコーディングの時間が多くなることがある

## 気をつけること

モブコードレビューだからといった特別なことはないと思いますが、気づいたことを挙げておきます。

- 「どうしてそうなった」より「これをどうする」にフォーカスする
- コードの不備を責めたりしない
- RuboCop（静的コード解析）やフォーマッタを使う
- 同じ理由であっても何度でも説明する
- その場で理解したり考えたりする時間を設けるようにする

## 環境補足

- モブコードレビューは全員オフラインで行う場合もあれば、オンラインで行う場合もあります
- オフラインで行う場合は、大きなモニター（43インチ）を囲んで行っています

引き続きモブコードレビューを行って、気づきがあればまたシェアしたいと思います。
WindowsPowerShellでUTF8-BOMLessでLFなファイルを出力する

`WindowsPowerShell`の`Out-File`コマンドレットで下記のようにエンコーディングを`UTF8`を指定してファイル出力した場合。

`BOM付きUTF8`でファイルが出力されます。

```PowerShell
# UTF8-BOM CRLF
@("Hello World","Foo Bar") | Out-File -FilePath c:\temp\utf8-bom-crlf.txt -Encoding utf8
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/6ddb1594-3417-38ca-6a35-777d0977c4b0.png)

今回、`WindowsPowerShell`でコマンドの処理結果を`BOMLess`かつ`改行コードLF`でファイルを出力したいケースがあったので方法をメモ。

```PowerShell
# UTF8-BOMLess LF
@("Hello World","Foo Bar") | %{ $_+"`n" } | ForEach-Object{ [Text.Encoding]::UTF8.GetBytes($_) } | Set-Content -Encoding Byte -Path c:\temp\utf8-bomless-lf.txt
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/0ad0a8e8-07d5-f180-137f-14642599c6e9.png)

## 参考サイト

[PowerShellでBOM無しUTF8を簡単に扱う、デフォルト設定を簡単に変える方法](https://blog.shibata.tech/entry/2016/10/02/154329)
Pythonで画像に線や文字を描画

# 始点と終点を指定することで線が描けます

```python
import cv2

img = cv2.imread("bird.jpg")

img = cv2.line(img,(210,80),(240,30),(255,0,0),1) # source, start, end, color, line width
img = cv2.line(img,(230,100),(280,50),(255,0,0),1)
img = cv2.line(img,(250,120),(320,70),(255,0,0),1)

cv2.imshow(img)
```

![bird.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/dbe1f5db-ca41-d628-93d8-2096416391cc.jpeg) ![ダウンロード (48).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/962a4ffb-1744-5d38-6582-46a59b6a2ea2.png)

# テキストも描けます

```python
import cv2

img = cv2.imread("bird.jpg")

cv2.putText(img,
            text="I am a bird.",
            org=(210,80),
            fontFace=cv2.FONT_HERSHEY_SIMPLEX,
            fontScale=0.7,
            color=(0, 255, 0),
            thickness=2,
            lineType=cv2.LINE_4)

cv2.imshow(img)
```

![ダウンロード (49).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/70de3411-f5b6-30b5-d6d5-e0f2870e2e34.png)

# 時計を描いてみる

```python
import cv2
import math

img = cv2.imread("bird.jpg")
h, w = img.shape[:2]
center_x = w / 2
center_y = h / 2
center = (int(center_x),int(center_y))
rad = int(w / 3)

for i in range(0,12):
  point = (int(center_x + rad * math.cos(math.radians(i*30))),int(center_y + rad * math.sin(math.radians(i*30))))
  img = cv2.line(img,center,point,(255,0,0),1)
  cv2.putText(img,
            text=str(i),
            org=point,
            fontFace=cv2.FONT_HERSHEY_SIMPLEX,
            fontScale=1.0,
            color=(0, 255, 0),
            thickness=2,
            lineType=cv2.LINE_4)

cv2.imshow(img)
```

![ダウンロード (50).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/cc795217-52c7-2a3a-d089-3e9f2126e58e.png)

🐣
****
フリーランスエンジニアです。
お仕事のご相談こちらまで
rockyshikoku@gmail.com

Core MLやARKitを使ったアプリを作っています。
機械学習／AR関連の情報を発信しています。

[Twitter](https://twitter.com/JackdeS11)
[Medium](https://medium.com/@rockyshikoku)
[GitHub](https://github.com/john-rocky)
【Unity】【雑記】OdinのSerializedMonoBehaviourを使おうとしたらWarningが出た話

UnityAssetのセールがあったので、Unityのユーザビリティ向上に定評のあるOdinを買って試していた。
DictionaryをInspectorで表示できるようになるというので、SerializedMonoBehaviourを継承するようにしてみたらInspectorでこんな警告文が！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99896/912875bd-491e-5eab-b63f-60f4c7b5d7f4.png)

Google先生に翻訳を頼んだら、どうやら、

Unityより高速なシリアライズをかけてるよ！
デフォルトのシリアライズが遅いのは、変化に強いようシンプルにするために冗長になってるからだよ！
だから、Unityのシリアライズ制約が変わったら壊れるかも知れんよ！

ってことらしい。（意訳）
シリアライズのプロトコルを変えてるなら、まぁ、制約変わったら壊れるよね。

テキストをコピペ出来たらすぐにGoogle先生に聞けたけど、コピペ出来なかったし、検索してもすぐに出てこなかったので全文書き出してました。面倒だなと思いました。（小並感）
英語が苦手な同志が、同じように検索した時に、すこしでも役に立てたらなって。


英文書き出し
```
Odin's custom serialization protocol is stable and fast.
It is built to be fast, reliable and resilient above all. 

* Words of caution *
However, caveats apply - there is a reason Unity chose such a drastically limited serializeation protocol.
It keeps things simple and manageable, and limits how much complexity you can introduce into your data structures.
It cambe very easy to get carryied away and shoot yourself in the foot when all limitations suddenly disappear, anc hence we have included this cautionary warning.

Warning wors aside, there can of course be valid reasons to use a more powerful serialization protocol such as Odin's.
However, we advise you to use it wisely and with restraint.
After all, with great power comes great responsibility!

[I know what I'm about, son. Hide message forever]
```

Google先生による翻訳
```
Odinのカスタムシリアル化プロトコルは安定していて高速です。
何よりも高速で信頼性が高く、回復力があるように構築されています。

*注意の言葉*
ただし、注意事項が適用されます。Unityがこのような大幅に制限されたシリアル化プロトコルを選択したのには理由があります。
物事をシンプルで管理しやすくし、データ構造に導入できる複雑さを制限します。
すべての制限が突然消えたときに、持ち去られて足を撃ち抜くのは非常に簡単です。そのため、この警告を含めました。

警告はさておき、もちろん、Odinのようなより強力なシリアル化プロトコルを使用する正当な理由があります。
ただし、賢明かつ控えめに使用することをお勧めします。
結局のところ、大きな力には大きな責任が伴います！

[私は自分が何をしているのか知っています、息子。 メッセージを永久に隠す]
```
j2clしてみた

久々にj2clしてみました

以下の記事(2022-04-11 に書かれている) を発見したためです。

https://blog.kie.org/2022/04/rise-of-j2cl-java-web-development-after-gwt.html


早速やってみましょう

私の環境
Windows10
Java8
maven 3.8.1


上記記事に従って mavenのプラグインを入れます。

上記記事に従って プロジェクトを作成します

DOS窓(コマンドプロンプト)で、行いました。


Define value for property 'module':と聞いてきます。
適当な名前をいれました。 (後で、気が付いたのですが、Appと入れるべきでした）

Define value for property 'groupId': と聞いてきます。
jp.co.xxx など、自分が普段つかっているパッケージ名を入れましょう

Define value for property 'artifactId': と聞いてきます。
Appと入れましょう

Define value for property 'version': と聞いてきます。
改行でよいでしょう

Define value for property 'package': と聞いてきます。
改行でよいでしょう

入力内容が表示されて Y: と聞いてきます。
改行しましょう。

できあがったファイル達は、上記英文の記事に書かれたものとは、違いました。
今は、気にしないことにしましょう。

> mvn j2cl:watch

しばらく待ちます。
Finished final task xxxx in 1516ms
---- Build Complete: ready for browser refresh -----
と出ました。


:::note warn
警告
ここで、もう１つ、DOS窓(コマンドプロンプト)を立ち上げます
:::

そこで、以下を実行

> mvn jetty:run

しばらく待ちます


Started ServerConnector ..... [0.0.0.0:8080]
Started ????ms
Started Jetty Server

と表示されました。

ブラウザーを立ち上げて
http://127.0.0.1:8080/



J2CL !!! というボタンが表示されました。

ボタンを押すと HelloJ2CL world!
に変わります。

無事成功しました。すんなり終わりましたね。

GWT3.0は、もう出ているのでしょうか？まだ出ていないのかな？
それまでは、j2clで遊びましょうか？

お読みいただきまして、ありがとうございました
Atcoder の「上書き」問題をRubyで解く

```rb
# https://atcoder.jp/contests/past202012-open/tasks/past202012_b

# 標準入力の1行目に文字列の長さが与えられる
length = gets.chomp

# 標準入力の二行目にテキストが与えられる
text = gets.chomp

# テキストを1文字単位で配列にしてループする
text.chars.each do |alphabet|
  # テキストからアルファベットを削除
  text.delete! alphabet
  # テキスト末尾にアルファベットを追加
  text += alphabet
end

puts text

```

# 問題

```
英小文字からなる長さ N の文字列 S が与えられます。
また、文字列 T があり、 T ははじめ空文字列です。

あなたは以下の操作を i=1,2,…,N に対して、 i=1 から順に行います。

S の左から i 番目の文字を c とする。 T から c と同じ文字を全て削除した後、 T の末尾に c を追加する。
操作が終わった後の T を求めてください。
```

https://atcoder.jp/contests/past202012-open/tasks/past202012_b

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89618/5acafb46-8750-d455-f3d9-0e5c37a4f32a.png)











<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
The CanIUse Embedが便利

## この記事の概要

HTMLやCSSの各ブラウザでのサポート状況を調べるために[Can I use...](https://caniuse.com/)を使う場面は多いと思います。

共有のためにスクリーンショットを撮ることもあると思いますが、よりリッチに埋め込める[The CanIUse Embed](https://caniuse.bitsofco.de/)を紹介します。

## サイトの説明

以下の3パターンの埋め込み用コンテンツを生成できます。

- マウスオーバーでブラウザの使用率まで確認できる、インタラクティブな最新情報
- 1日に1回更新される、静的画像の最新情報
- 画像生成時点の日付に準拠した、スナップショット

## 埋め込みコンテンツの作り方

サイトを見ればほぼ使い方は分かると思いますが、一応説明します。

### Create your Embed

ページ上部は生成できるコンテンツの例が載っているだけなので、ページの下の方までスクロールします。
`Create your Embed`以下が実際に埋め込みコンテンツを生成するエリアです。

### Select Feature

埋め込みたいHTMLやCSSの要素を選びます。
`select`の見た目をしていますが、直接文字列を打ち込めば大丈夫です。

![](https://raw.githubusercontent.com/xrxoxcxox/qiita-sync/main/images/caniuse-embed-select-feature.png)

### Select Embed Type

3種類の中から選択します。

![](https://raw.githubusercontent.com/xrxoxcxox/qiita-sync/main/images/caniuse-embed-select-embed-type.png)

| 名前 | 機能 |
| --- | --- |
| Interactive Embed | Can I use...の該当のページへ飛べる。<br>マウスオーバーでブラウザのバージョンごとの使用率が表示される。<br>アクセシブルなカラーへ変更できる。<br>モバイルから表示すると見た目が最適化される。 |
| Live Image | 単なる画像なのでJavaScriptの使えない場所でも埋め込める。<br>1日に1回更新される。<br>拡張子は`png`, `webp`, `jpg`から選べる。 |
| Static Image | `as of ~`の日付のスナップショット。<br>日付は画像右下に記載されている。 |

| Desktop用の見た目 | Mobile用の見た目 |
| --- | --- |
| ![](https://raw.githubusercontent.com/xrxoxcxox/qiita-sync/main/images/caniuse-embed-desktop.png) | ![](https://raw.githubusercontent.com/xrxoxcxox/qiita-sync/main/images/caniuse-embed-mobile.png) |

### Browser Versions

表示する情報のうち、過去のバージョン数、未来のバージョン数を指定できる。
デフォルトでは過去2バージョンと未来の1バージョン。

![](https://raw.githubusercontent.com/xrxoxcxox/qiita-sync/main/images/caniuse-embed-browser-versions.png)

Live Imageは非対応。

### Default Colour Scheme

Can I use...に準拠した色か、アクセシブルなカラースキームかを選べる。

Live Imageは非対応。

### Generate

選んだ形式にあわせて埋め込み用コードが出力されます。

Interactive Embedではscriptタグとセットで、Live ImageとStatic Imageではpictureタグのみ。

![](https://raw.githubusercontent.com/xrxoxcxox/qiita-sync/main/images/caniuse-embed-generate.png)

## まとめ

- [The CanIUse Embed](https://caniuse.bitsofco.de/)から埋め込み用のブラウザサポート一覧が取得できる
- `Interactive Embed`, `Live Image`, `Static Image`の3種類の生成方法がある
- いくつかオプションがあり、生成する内容をカスタムできる

---

最後まで読んでくださってありがとうございます！
Twitterでも情報を発信しているので、良かったらフォローお願いします！

https://twitter.com/xrxoxcxox
日商簿記３級

2022年5月1日に日商簿記３級を受験しました。
合格(2022/5/1)したので記事を書いておきます。
次受ける方の参考になれば幸いです。

## 受験理由
■１ 分析するデータを理解するのに簿記の知識が必要であったため
■２ 常識として知っておきたかったため

## 感想
■１ 1-2カ月ほど勉強すれば受かると思います。
■２ Youtubeで簿記3級の動画がいくつかあるので、本を読むよりそれらを見た方がすぐ理解できます。
■３ 参考書をたくさん読んでも結局あまり理解ができなかったので、問題集をひたすら解きつつ、理解できない点を動画などで補うスタイルが良い気がしました。
	
## 学習教材
■１ カラー版　会計のことが面白いほどわかる本＜会計の基本の基本編＞（天野 敦之, 2020, KADOKAWA）
■２ はじめての人の簿記入門塾（浜田 勝義, 2005, かんき出版）
■３ スッキリわかる 日商簿記3級 第13版 テキスト&問題集（滝澤 ななみ, 2022, TAC出版）
■４ 合格するための本試験問題集 日商簿記3級 2021年SS(春夏)対策 (よくわかる簿記シリーズ) （TAC簿記検定講座, 2021, TAC出版）
■５ ホントにゼロからの簿記３級 『ふくしままさゆきのホントに』シリーズ（ふくしままさゆき, 2014, 花嶋生花）
■６ めくるほどよくわかる！仕訳カード 厳選100問: これから簿記を始める人のための 読まないで会計思考を身につける方法（小松 啓 , 2017, 小松 啓）
■７<a href="https://play.google.com/store/apps/details?id=com.pubrof.pubrofboki3&hl=ja&gl=US">パブロフ簿記3級 日商簿記仕訳対策2022年度版（アプリ）</a>
■８ <a href="https://www.youtube.com/channel/UC4ZBlcSK0j_SrNxNMCv_qEg">公認会計士たぬ吉の資格塾（Youtube）</a>

## 学習方法
■１ 学習教材1-3を1周する。
■２ 学習教材5を2割ほど読み、学習教材6を半分読む（途中で飽きてしまった、、、）。 
■３ 学習教材7（アプリ）を一周する。 
■４ 学習教材4（問題集）を解きつつ、学習教材8（Youtube）を見て理解を深める。

## 反省点
■１ 最初から動画みて問題集解いた方が手っ取り早かった気がする。

## 試験前にやっておいてよかったこと等
■１ 仕訳のチートシートを作っており、試験1時間前にそれをひたすら見ていたこと。これしてなかったら落ちていた可能性が高い。
パーミッション作成時のライセンスの選択

おお、ライセンスと権限セットに分かれているから、アルファベット順に並んでないように見えるんだ。

:::note
It seems like they are in order, they're grouped by User Licenses and Permission Set Licenses, then each list is sorted alphabetically.
Please scroll up.
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/06fb898a-61a7-3cdd-395a-b1fb8600d2ca.png)

+ [Where can I find the Salesforce License to associate with a Permission Set?](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000ITG07SAH)
+ [Restrict Data Access with Field-Level Security, Permission Sets, and Sharing Set](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000Jzmt5)




何故かアルファベット順にならんでないんですよねぇ。

+ [Protect Your Data in Salesforce > Create New Users and Allow a User to Delete Accounts](https://trailhead.salesforce.com/content/learn/projects/protect-your-data-in-salesforce/create-new-users-and-delete-accounts)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/e2b7a1c4-552c-1c6f-4260-152400b7149a.png)

+ [上記トレイルでの例](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007aiNpp)

**回答例**

:::note
For some reason, they are not arranged in alphabetical order. Scroll up a little more.
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/8fd4d222-0e31-b3cc-edf7-e628869acee9.png)

+ [Create New Users and Allow a User to Delete Accounts](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX00000SWiK4)

Salesforce Platform がない

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/4de2458c-0cc8-4859-8146-b02aca312378.png)

:::note
Try scrolling up a bit. 

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/d2821bd5-0cf4-474a-9374-50abfa113b60.png)

:::


**Create New Users and Allow a User to Delete Accounts**

+ [ユーザーが権限セットを使用してアカウントを削除できるようにする-Salesforceプラットフォームがドロップダウンメニューに表示されない](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000HCT15SAH)

# ライセンスのスクロール

[Hello,](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000El0WASAZ)

I am doing "Control Access to Fields" challenge.  When I create a playground, the "Salesforce" license is not an option.  When I use the Developer edition only then I am able to be given "Salesforce" license as an option which is what the challenge requires. Why is that?

回答例
**I don't think it's in alphabetical order when choosing a license. Please scroll a little.**


# キャッシュのクリアー？

[Can not get out of Control access to fields module?](https://trailhead.salesforce.com/en/trailblazer-community/feed/0D54S00000Je7xe)
今のCSSにはベンダープレフィックスはほぼ要らないけど、強いてつけるなら

## この記事の概要

`-webkit-transition`など、CSSのプロパティにプレフィックスがついているのを見たことがあると思います。
しかし、昨今のCSSにはほとんど必要ありません。上記の`transition`も本来は不要です。

本来はベンダープレフィックスが必要な時期＝標準化がなされていない時期なので導入を待つべきだったそうですが、世の開発者達はガンガン使用していました。
そのため、プレフィックスではなくブラウザの設定でオンオフを制御するような流れになっています。

https://developer.mozilla.org/ja/docs/Glossary/Vendor_Prefix

ということで、少なくとも2022年4月現在はほとんど不要なベンダープレフィックスですが、使うとしたら……というものを挙げてみました。

:::note warn
「この記事で紹介したものがすべて」というわけではなく、筆者が日頃CSSを書いている中で`有用だと思う`かつ`ベンダープレフィックスが必要`なプロパティをピックアップしているのみです。
:::

## appearance

`button`をボタンっぽく、`checkbox`をチェックボックスっぽくなど、要素にあわせた見た目を割り当てられます。

実際はユーザーエージェントのスタイルシートに記述してあるので、開発者が細かな指定をすることはあまり無いと思われます。

よく使うのは`none`を指定し規定のスタイルをリセット→オリジナルのスタイルを指定、でしょうか。
Safariの15.3以前が効かないため`-webkit-`を指定する必要があります。

## backdrop-filter

https://developer.mozilla.org/ja/docs/Web/CSS/backdrop-filter

背景をぼかしたり色を変えたりできるプロパティ。
以下の記事でも説明されています。

https://qiita.com/ec081072/items/a0017a9d93d4a1f38a53

Safariがベンダープレフィックス付きでしか対応していません。
また、Firefoxはデフォルトでは対応しておらずユーザーが自分でフラグをオンにしないといけません。

## background-clip

https://developer.mozilla.org/ja/docs/Web/CSS/background-clip

要素の背景をどこまで拡張するか指定するプロパティ。
以下の記事でも説明されています。

https://qiita.com/redrabbit1104/items/ec1f225973ef0ba0053c

`background-clip`に指定できるのは`border-box`, `padding-box`, `content-box`, `text`がありますが、このうちベンダープレフィックスが必要なのは`text`のみです。
`-webkit-`がないとChromeやEdgeで動きません。

## hyphens

https://developer.mozilla.org/ja/docs/Web/CSS/hyphens

ハイフネーションを行うプロパティ。

筆者はタイポグラフィに関心があるため、Webでもハイフネーションを適用したいというモチベーションがあります。
日本語だけのサイトであれば問題になることは少ないですが……一応紹介します。

Safariが対応していないため`-webkit-`をつける必要があります。

## line-clamp, box-orient

https://developer.mozilla.org/ja/docs/Web/CSS/-webkit-line-clamp

「複数行に渡る文章を、3行目以降は省略したい」といったシチュエーションで使うプロパティ。
以下の記事でも説明されています。

https://qiita.com/KazuyoshiGoto/items/4f88e87bb12ff38d1c4e

Internet Explorer以外のブラウザなら使えるのですが、正式採用されているわけでもないためブラウザの種別に関わらず`-webkit-`をつける必要があります。
（FirefoxでもEdgeでも`-webkit-`です。）

---

最後まで読んでくださってありがとうございます！
Twitterでも情報を発信しているので、良かったらフォローお願いします！

https://twitter.com/xrxoxcxox
Webクリエイター能力認定試験 エキスパート（HTML5）

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

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

## 感想
■１ テキストは2~3日ほどで読み終わりますので、その後はサンプル問題か、模擬試験をやるのが良いです。試験ではHTMLを結構書くので模擬試験も実施しておいた方が安心できます。
■２ 問題自体は難しくないですが、慣れていないと時間が足りなくなる方もいると思いますので、うまくコピペを利用したほうが良いです。
	
## 学習教材
■１ Webクリエイター能力認定試験HTML5対応エキスパート公式テキスト―サーティファイWeb利用・技術認定委員会公認 第2版（狩野 祐東, 2021, 富士通エフ・オー・エム）
■２ Webクリエイター能力認定試験 エキスパート問題集 【HTML5対応】 第4版 第1刷（サーティファイＷｅｂ利用・技術認定委員会, 2021, 株式会社サーティファイ）
■３ スラスラわかるHTML&CSSのきほん 第2版（狩野 祐東, 2018, SBクリエイティブ）
■４ たった1日で基本が身に付く! HTML&CSS 超入門（WINGSプロジェクト・宮本 麻矢, 2017, 技術評論）

## 学習方法
■１ 公式テキスト（学習教材１）実施
・・・テキストを一通り読み、その後サンプル問題を１回実施
■２ 模擬試験（学習教材２）実施
・・・模擬試験3回分を１回ずつ実施
■３ 学習教材３と４実施
・・・３と４をサラッと読んだ

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

## 試験前にやっておいてよかったこと等
■１ 学習教材３と４も読んだので、HTMLの基礎知識がついて問題がだいぶ解きやすくなった。
iPhoneからm1 macにAirDropができない時の対処法


まずはこちらを参照してください。
https://prebell.so-net.ne.jp/tips/pre_21010801.html


##クリティカルな問題


iPhone側のインターネット共有をオンにしていたことが原因でした。

m1の場合はiPhoneのインターネット共有をオンにしているとm1のmac側に共有ができないようで、この問題を解決するのにやたらと時間がかかってしまいました

メールでも送信できるしいいかってやってたんですが、いい加減だるいと思い原因を探ってたらこれが原因でした。

どなたかの参考になれば幸いです。
読んだ論文メモ（5/1）

## Pang, B., Lee, L., & Vaithyanathan, S. (2002). Thumbs up? Sentiment Classification using Machine Learning Techniques. Proceedings of the Conference on Empirical Methods in Natural Language Processing(EMNLP)), 79–86.
-目的：映画のレビューを予測
-手法：Naive Bayes（単純ベイズ分類器）、Maximum Entropy（最大エントロピー法）、SVM（サポートベクターマシン）
-結果：SVMが一番正確。ただし、いずれも文脈を考慮しないモデルであり、改善が必要。
2022/5/2主にITとかセキュリティの記事

中国のハッカー集団APT41が、米国の家畜管理システムに謎の攻撃(4/30)
https://forbesjapan.com/articles/detail/47238

去年のサイバー犯罪被害 日本人の7人に1人 被害額は320億円に(4/30)
https://www3.nhk.or.jp/news/html/20220430/k10013606061000.html

2022年1月～3月対象「Webサイト・Webアプリケーションを狙ったサイバー攻撃検知レポート」を発表(5/1)
https://www.jiji.com/sp/article?k=000000276.000009107&g=prt

Zoom for Macのアップデート中にパッケージのバージョンを確認できない脆弱性が発見され、Zoomがアップデートを呼びかけ。(4/30)
https://applech2.com/archives/20220430-zoom-for-mac-critical-security-vulnerability.html

東映アニメーションへの不正アクセスについてまとめてみた(4/30)
https://piyolog.hatenadiary.jp/entry/2022/04/30/010606

ハッキングされているiPhoneの確認方法チェック項目7つ！3つの原因と解決方法(4/30)
https://www.appps.jp/365046/

イベント応募者の情報管理に関するお詫びとご報告(4/29)
https://www.vegalta.co.jp/news-game/2022/04/post-259.html

保守派のメール「検閲」されてた？共和党が連邦選挙委員会にグーグルの調査要求(4/29)
https://www.mashupreporter.com/rnc-complaint-over-gmail-censorship-of-fundraising-emails/

iPhoneのバッテリー使用状況から、不要なアプリを確認する(4/30)
https://news.biglobe.ne.jp/it/0430/imm_220430_6287750469.html

ビットコインが法定通貨になったエルサルバドルに行ってみた｜体験記寄稿1(4/29)
https://coinpost.jp/?p=345871

LINEはクソ(4/30)
https://note.com/rethink7/n/n3aa1e3e5609e

無料Wi-Fiでも安心できそう、マイクロソフトのEdgeブラウザー向けにVPN機能が登場(4/29)
https://getnavi.jp/digital/735406/
go test

test(std)
errors(std)
net/http/httptest(std)
testify(テストユーティリティ)
ginkogo(テストフレームワーク,BDD)
gomega(アサーションライブラリ)
gomock(普通のモック)
sqlmock(DBのモック)
go-txdb(実際のDBを使ったテスト用)
gotests (テスト自動生成)
gin testcontext(ginのコンテキストを使ったテストに使用)

wire

TDD(テーブルドリブン開発goの標準的なテスト指針)
Windows のリモートデスクトップを使ってラズベリーパイに接続する方法

# ラズベリーパイ側で以下のコマンドを実行
sudo apt update && sudo apt -y upgrade
sudo apt install -y xrdp
sudo service xrdp restar
参考記事：
- https://rs-techdev.com/archives/98
- https://linux.just4fun.biz/?Ubuntu/Windows%E3%81%8B%E3%82%89Ubuntu%E3%81%AB%E3%83%AA%E3%83%A2%E3%83%BC%E3%83%88%E3%83%87%E3%82%B9%E3%82%AF%E3%83%88%E3%83%83%E3%83%97%E6%8E%A5%E7%B6%9A%E3%81%99%E3%82%8B

# リモートデスクトップにコンピュータ名とユーザ名を入れるだけ
基本的にはコレで終わり。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172184/871b88fe-08d9-38f0-d1f2-691248c7171a.png)
Ubuntu Desktop 22.04を自宅の仮想マシンにインストールした。後RDPサーバー

まあ、出たし、割と普段使いする自宅のUbuntu仮想マシン（今は20.04）を置き換えるべく、インストール。

# 環境
物理のミニPCにWindows 10+VMware Workstation 16 Pro。
その上のVMにCPU 2コア、4GBメモリ、100GBのHDDを確保。

# インストール
Desktop版をインストール。
https://ubuntu.com/download/desktop
isoイメージは3.5GBほど。某RHELみたくインストールisoが10GBとか肥大化していないのは素晴らしい。

OSがLive CDでGUIなのは、簡単で分かりやすくて良いのだけども画面が狭い。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146381/0bca9033-629b-c431-302e-554d6a72df50.png)

オートログインがインストーラの設定で出来るのは嬉しい。

# RDPサーバーを設定する
インストール後の初期セットアップでCloudアカウントとか設定するのはとりあえずスキップして、まずはRDPサーバーを設定したい。
これが使いものになると、制限の強いネットワーク内の踏み台サーバーとしてUbuntu Desktopを導入して、RDPで接続してFirefox等のWebブラウザが使えて、そのためにWindows Serverもいらず、端末側のWindows PCにVNCクライアントとか特別なソフトウェアのインストールが不要という、運用上計り知れないメリットがある。

の、前に固定IPアドレスの設定からか。画面右上の「Wired Settings」から設定。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146381/60b9c549-0d6d-eaf2-1202-d0c0f4e142f3.png)

で、RDPサーバーの設定。
右上クリック>「Settings」から「Sharing」を有効に。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146381/d33f8a03-058b-e0e4-73fe-815d8e8c676a.png)

「Remote Desktop」をOnに。狭い画面では下側が切れて操作できないし接続パスワードも確認できないぜ。
「Remote Desktop」、「Remote Control」をOnにし、画面下のパスワードを確認ないし変更する。パスワードは、OSログインのものとは違うでたらめな文字列が自動生成されている。気に入らない場合は変えてもいいが、まあ、後述。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146381/ee9c2739-9be7-42bf-eeee-73c0d8c7c300.png)

# RDPで接続する。
さて、これでもうWindowsのRDPクライアントからつながるのかな？
RDPクライアント（mstsc）を起動しておもむろに接続。端末側OSはWindows 10。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146381/5c83ca10-940e-bd08-d3d5-0bdd21d9d6eb.png)

ユーザー名は、ありがちだがユーザー名そのままの文字列では受け付けてくれず、ユーザ名の前に「.\」を付ける必要がある。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146381/4000367b-bcbc-493d-6867-bb3aa51bd378.png)

リモート証明書の確認画面が表示されるが、証明書の名前がHost名ではなく「GNOME」となっている。これはバグっぽい。まあ「はい」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146381/5f443ed0-0192-1163-8b17-a89318a5fe66.png)

おっ、繋がった。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146381/f4d9a34c-3b27-8545-727e-ef29bfb146b2.png)

# その他
RDP Server、Settingの画面で「Remote Control」のOn/Offを繰り返さないとリモート操作できないとか、若干不安定なところはある。

後、無操作で画面ロックの状態でRDP接続できないというのは、多分仕様だと思うのだけどいただけない。

なので使うときは「Settings」>「Privacy」>「Screen」で画面ロック系の設定は全部無効にするのが良いだろう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146381/e4bca5cb-ade1-fd2e-0f9c-4cde7176a329.png)

これとユーザーの「Automatic Login」を有効にしておけば、PC/VMの起動後にコンソール無操作でRDP接続可能な状態まで持っていくことが出来るんじゃない。。？と期待したが、起動後にRDP接続しても「内部エラーが発生しました」とかエラーメッセージが出る。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146381/6a87e621-e687-86d3-5bc6-cedd1cae58fa.png)

どういう理屈かは知らないが、「Settings」>「Shared」画面を再度開いて、「Authentication required」の画面を突破するとユーザー/パスワード入力の画面までは辿り着くようになる。そして、RDP接続のためのパスワードはOS再起動ごとに自動生成されているので、実際の運用上はOS起動後にRDPを有効にしたければ設定画面をその都度開き直さざるを得ない。

惜しい。vSphere Clientとかを経由してVMのコンソール操作ができればRDPサーバーの機能いらないんじゃないのという線に落ちるか。。AWSがUbuntu Desktopを提供するとかのモチベーションで、どうにかOS起動直後にRDP接続可能にする手だてを用意したりしないだろうか。

まあ、リモートデスクトップは特許とか色々な利権が絡み合った世界だろうから、ここまで辿り着いただけでも大きな進歩だろう。あまり期待せず今後の改善を待とう。
ゲノムアノテーションのやり方（目次）

ナノポアで新しい種や系統のシーケンスをしてアセンブルすることは簡単になったが、アノテーションは色んなツールがあり過ぎて正解が分からない人は多いと思う。私もそうだった。そして一通りのやり方を通して説明してくれるサイトも見当たらないので、作っておくことにした。
　このプロトコールでは、Anaconda、というか mamba (https://kazumaxneo.hatenablog.com/entry/2021/02/11/073000 を参照するとよい) を使った環境の管理を前提とする。また、デフォルトのチャンネルにbiocondaとcodna-forgeを追加していない人は以下のコマンドを実行しておくこと。
```
mamba config --add channels bioconda --add channels conda-forge
```

使用するツール群は以下の通り。
EDTA (https://github.com/oushujun/EDTA)
Braker2 (https://github.com/Gaius-Augustus/BRAKER)
GeMoMa (http://www.jstacs.de/index.php/GeMoMa)
Gffread/Gffcompare (http://ccb.jhu.edu/software/stringtie/gff.shtml)
HISAT2 (http://daehwankimlab.github.io/hisat2/)
TRINITY(https://github.com/trinityrnaseq/trinityrnaseq)


手順は以下の通り
1. [RepeatModeler/RepeatMaskerを使ってゲノムにSoftmaskを掛ける](https://qiita.com/drk0311/items/cba7958319737a1f12c0)
2. [BRAKER2のインストール](https://qiita.com/drk0311/items/a3ac648f2780cfee57b1)
3. [BRAKER2を使ってタンパク質コード領域を予測する](https://qiita.com/drk0311/items/0263691a7cc4dcb0c33c/)
4. [RNA-seq のノイズを除去してゲノムにマッピングする](https://qiita.com/drk0311/items/56715d46dc7893c95f78)
5. [GeMoMa で近縁種のアノテーションを移植する](https://qiita.com/drk0311/items/32aa45b85e0ad3545067) 
6. [GffCompare を使って GeMoMa とBRAKER の差分を取り、アノテーションを補完する](https://qiita.com/drk0311/items/7c9910f12a2a959c710d)
7. [EnTAP のセットアップ](https://qiita.com/drk0311/items/9bbe56dc0669376eb98f)
8. [EnTAP の実行と結果の解釈](https://t.co/kWNa01djMF)
RepeatModeler/RepeatMaskerを使ってゲノムにSoftmaskを掛ける 

RepeatModelerはゲノム配列の総当り検索によってゲノム中の反復配列を同定するツール。
RepeatMaskerは反復配列をNや小文字に置換（mask）するツール。Nに置換するすることをHardmask、小文字に置換することをSoftmaskという。そしてSoftmaskingをすることによって、Brakerによる遺伝子予測の精度が向上する。

# 1. まずはツールのインストール
```
git clone https://github.com/oushujun/EDTA.git
cd EDTA
mamba env create -f EDTA.yml
conda activate EDTA
```
<br> 

# 2. Build Database
まず、BLASTデータベースを作成。
```
BuildDatabase -name DATABASE GENOME.fasta
```
`-name`はBLASTデータベースのファイル群のPREFIX。好きに付けてよい。
`GENOME.fasta`はアセンブルで得られたゲノム配列のFASTAファイル。
マシンのメモリは十分大きいはずなのにメモリ不足のエラーが出たときには、
`export BLASTDB_MDB_MAP_SIZE=100000000` などとして、プログラムが使用するメモリの上限を上げてやるとよいらしい（菅さん@県立広島大より）。
<br>  

# 3. RepeatModeler
```
RepeatModeler -database DATABASE -pa 12
```
`-pa` は並列プロセス数で、1プロセスにつきCPUを4コア使う。ジョブを12分割すると48コアのマシンをフルに使うことになる。結果は`RM_`で始まるディレクトリに出力。
<br>  

# 4. RepeatMasker
上の出力の`consensi.fa.classified`を入力に使う。結果はカレントディレクトリに出力。
```
RepeatMasker -pa 12 -lib RM_XXXXX/consensi.fa.classified GENOME.fasta
```
<br>  

# 5. ProcessRepeats
反復をSoftmasking。RepeatMaskerがNに置換してしまった配列を小文字にして戻す。入力には上の結果の`GENOME.fasta.cat.gz`を使う。出力のうち、`GENOME.fasta.masked` が目的の産物。
```
ProcessRepeats -maskSource　GENOME.fasta -xsmall -gff GENOME.fasta.cat.gz
```
`-gff`で出力にGFFファイルも追加。IGV等でのブラウジングに使えるので出しとくと便利。まあこの段階ではなくてもよい。
`GENOME.fasta.masked`を`mv`コマンドや`cp`コマンドを使ってアノテーション作業のワーキングディレクトリに保存。ファイル名は`Genome.softmasked.fasta`とした方がよいかも。

# 関連
- [ゲノムアノテーション（目次）](https://qiita.com/drk0311/items/c024888962f840e3ce3e)
- [BRAKER2 のインストール](https://qiita.com/drk0311/items/a3ac648f2780cfee57b1)
- [BRAKER2を使ってタンパク質コード領域を予測する](https://qiita.com/drk0311/items/0263691a7cc4dcb0c33c/)
- [RNA-seq のノイズを除去してゲノムにマッピングする](https://qiita.com/drk0311/items/56715d46dc7893c95f78)
- [GeMoMa で近縁種のアノテーションを移植する](https://qiita.com/drk0311/items/32aa45b85e0ad3545067) 
- [Gffcompare を使って GeMoMa と Braker の差分を取り、アノテーションを補完する]
- [EnTAP のセットアップ](https://qiita.com/drk0311/items/9bbe56dc0669376eb98f)(https://qiita.com/drk0311/items/7c9910f12a2a959c710d)
- [EnTAP の実行と結果の解釈](https://t.co/kWNa01djMF)
CPCTF22 writeup

## この記事の内容
CPCTFという初心者向けのCTFが開催されると聞いて参加してみました。この記事はそのwriteupです。

今回はCTFらしい問題を解きたかったのでPPC(いわゆる競プロ的な問題)は解いてません。

## Crypto
暗号に関する問題

### My own language
#### 問題
`Ya! Lxi zyq etxn sawo rtooxmto? Metxs! Sawo wo x pwin yb owrugt oqcoswsqswyi lwuate saxs etugxlto x gtsste dwsa ysate gtsste. Sat Lxtoxe lwuate, yit yb sat bxryqo oqcoswsqswyi lwuateo, axo ctti wi qot owilt sat swrt yb sat xilwtis Eyrxi Truwet. sat bgxm wo atet. LULSB{dtglyrt_sy_lezusy_dyegn}.`

#### 解答
`LULSB`が`CPCTF`であることに注目すると、LがCに、UがPに対応しているのでABC順をずらした暗号ではないことがわかります。もとの文章が英語であると仮定すれば、語中のxがaに対応するとわかるので`Lxi`は`Can`であると推測できます。`Lxi zyq etxn sawo rtooxmto?`は疑問文で文脈から`Can you read this...`とすると整合します。このように英語らしさと文脈を突き合わせると答えが`CPCTF{welcome_to_crypto_world}`であるとわかります。

### RSA warmup
#### 問題
RSA暗号の $c,e,N$ が $c=810, e=5, N=415411$ と与えられるので平文 $m$ を求める。

#### 解答
まず $N$ が小さいので素数 $p,q$ が求まります。 $d$ は $\bmod (p-1)(q-1)$ において $de \equiv 1$ を満たす数であり、これを用いて $m = c^d \pmod n$と計算すれば復号できます。この値は愚直に計算すると爆発してしまいますが、pythonのpow関数の第3引数に$n$を入れることで簡単に計算できます。

### xxorxx
#### 問題
`text[i] = a ^ ((b ^ text[i]) ^ a) ^ b ^ a`を100回繰り返すことで暗号化する。ただし`a,b`は1から32の間の整数を繰り返しのたびに計算される。

#### 解答
xorは`a^b^b==a`というように同じ数を2回xorすると演算前のものと等しくなる性質を持つので右辺は`text[i]^a`となります。また、xorはビットごとの演算で繰り上がりが存在しないので平文と1から32の間の整数を一つxorしたものが暗号文になります。暗号文と1から32の整数をxorしてCPCTFから始まるものが答えです。

## Forensics
### sunset
#### 問題
画像が与えられている

#### 解答
画像には撮影時の日時や位置情報、カメラや編集ソフトの設定などを含むExifと呼ばれるメタデータがつけられています。これを`exiftool flag.jpg`コマンドで表示すると`Comment : CPCTF{3x1f_inf0_15_us3fu1}`が見つかります。

## Misc
その他の問題
### Mellon
#### 問題
トップページ下にある暗号文とMACHINE TYPE : Wehrmacht / Luftwaffe 3 rotorsなどの情報
`..-. --.. .... --. -..- .-.. --. . .--. .- .-.. .-.. -.-- ..- - -... --. ..-. .-- -.-- .. .--. -.-. .-. --- - .-.. -.-- .-. .---`

#### 解答
暗号文はモールス信号で書かれていると推測できるので、変換すると`FZHGXLGEPALLYUTBGFWYIPCROTLYRJ`となります。また、Wehrmacht / Luftwaffe 3 rotorsで検索するとエニグマのソルバーが出てくるので変換すると`REQUESTGETMETHODFRIENDANDENTER`となります。GETメソッドでfriendとリクエストしてエンターせよ、の通り、アドレスバーに`cpctf.space/friend`を入力すると解答が得られます。

### This is Flag!!
#### 問題
w‮e‭h‮urt‭a‮si‭t

#### 解答
問題文を選択してみると、選択のされ方が不自然であることに気づきます。デベロッパーツールで見ると、`&#202e`(Right-to-Left Override)という文字の向きを右向きに変更する制御文字が使われています。もとの順番は`wehurtasit`となっていることが確認でき、これが答えです。

## OSINT
### Welcome to OSINT! 1

画像が与えられているので、Google画像検索で検索すると、解答の書かれたブログが見つかる

## Shell
シェルになれるための問題。簡単めに設定されている。
### Hello Webshell
WebShellにログインしcatコマンドを打つ
### netcat
ncコマンドで通信する
### Find Image
ディスクイメージが与えられているので`sudo mount image.img /mnt/`コマンドでマウントする。また、ファイル階層が深いので`find . -type f -name "*flag*"`コマンドで検索するとよい。アンマウントするときは`sudo umount image.img`を使う。
### Veeeeeeery Long Text
サイズの大きいファイル内で検索するためgrepコマンドを用いる

## Web
### Forbidden 1
デベロッパーツールを見ると、cookieに`admin=false`が設定されている。よって以下のように要求すればよい。
```
curl -b 'admin=true' https://forbidden-1.cpctf.space/private/flag.txt
```


### POST ME!
jsonをPOSTして、その後DELETEをリクエストする。jsonをPOSTするときはヘッダーにcontent-typeをセットする必要があるので注意。
```
curl -H "content-type: application/json" -X POST -d '{"password":"pass"}' https://postme.cpctf.space/
curl -X DELETE https://postme.cpctf.space/
```

### Robots
`robots.txt`にアクセスする。これは検索エンジンがクロールするときに使う情報を記すファイルである。

## あとがき
解こうとして解けなかった問題も多かったのでちゃんと復習したい。
pandasでカラムが特定の文字列を含むか１行ずつチェックし、その行のみを抽出

```python
import pandas

df = pandas.read_csv('sample.csv')
df2 = pandas.DataFrame({})

for index, row in df.iterrows():
    if row['x'] in ("b", "e"): # check
        df2 = df2.append({'x': row['x'], 'y': row['y'], 'z': row['z']}, ignore_index=True)

print(df2)
```

```sample.csv
	x	y	z
0	a	foo	1
1	b	bar	2
2	c	baz	3
3	b	foo	4
```

```
	x	y	z
1	b	bar	2
```

(2022/5/3　編集追記)


上述のfor文は、カラムが特定の値を持っていた場合に別の処理を呼び出したいため記述しましたが、シンプルに特定の文字列を含む行を抽出する場合には下記のような書き方がシンプルで良いと思いました。

@WolfMoon2 氏よりコメントにて教えていただきました。

```python
df[(df['x'] == 'b') & (df['y'] == 'bar')]
```

ref: https://qiita.com/akkiii/items/ed365fc97ff012043ed4#comment-3d70369003280f363c28
Discordでコマンドを使用すると画面が揺れる現象への対処

# 結論
DiscordAPIのバグ
すぐ解決されるはず(2022/05/02現在:未解決)

# どうすればいいか
コマンドの前にスペースを入れる
```
/test
```
↓
```
 /test
```

# 参考文献
https://github.com/discord/discord-api-docs/issues/4840
【新卒SE】新人研修の振り返り①　〜入社から4月末〜

# 研修の振り返り①
現在、GW休暇に入り研修の前半戦が終了したので、一度振り返りの為に記事に残そうと思います。
研修の内容まで詳細に語ると社バレ（今後Organization登録するかもしれませんが）しちゃうので詳細までは書きませんが、研修を通して「こんな事学べたなー」っていうのをざっと自分の中で整理できたらなと思います。また、研修は原則リモートで行われているので、色々思うところがあり、そこも軽く振り返りたいと思います。

# 研修内容
大きく分けて、
「①企業理解の研修」「②ビジネススキルの研修」「③IT基礎知識の研修」
の三つの研修を行いました。①に関しては、企業理念・制度等色々知る事ができましたが、ここでは書きません。
 また③では、基本情報の午前分野のテクノロジ系分野の内容を研修で行いました。一様自分は基本情報を取得しているので、苦手であった分野を復習するような形で研修を進める事ができました。
 新しい発見であったり学びがあった研修は②の「ビジネススキルの研修」です。

### ビジネススキルの研修
 この研修は「ビジネス文書の作成」「議事録作成」「電話応対の練習」「Excel」「正しい言葉遣い」「日報作成」等、個人的にすごく新鮮で一番新しく知った事が多い研修でした。また、自分の弱み・改善すべき点も見つかりました。研修を通して学んだことで、今後意識していきたい事をいかに記します。

**○とにかくPDCAを回す事**
→ これは就活の時だったり、ビジネス本だったりで死ぬほど目にしたり耳にしてきた事ですが、ぶっちゃけずっと実戦はできてませんでした。正直よく理解できてない・メリットを感じないといった理由で。
　ただ研修を通して、今回の記事の執筆自体もそうですが「振り返る」事で知識が定着され、また改善点を洗い出す事で効率よく自分の成長に繋げらる事を知れました（当たり前すぎ笑）。「振り返る」「次に繋げる」。
何にでも言える事だと思うので、些細なことでもPDCAを意識して今後も取り組んでいきたいです。
　
**○意見を述べる時、語尾は断定で終わる**
→これはグループワークの後に、出た意見をプレゼンするという研修で講師の事がおっしゃった事なのですが、プレゼン時に「〜だと思います/ました」「〜だと考えました」といった曖昧な表現は使わないという事です。
言われてみれば、「〜だと思いました」と個人の感想を述べられても納得して聞いてられません。グループ・個人で出した答えに確証が持てなくても、「〜です」と断定の語尾で終わらせ発言に責任を持つ事が重要だと学びました。


### 所感

　他にも、色々ありますが、自分が忘れないようにしたいと強く思ったのが上記2点だったので、今回投稿しました。5月（とゆうか今日）からはいよいよプログラミング研修です。着実に技術を自分のものにできるよう、前半の研修で学んだ事を胸に刻んで取り組んできたいです。

### 最後に
　同期ともっと仲良くなりたいです笑。原則リモート研修で同じ部署の方と二日間だけ対面で会いましたが、同じ部署の人以外とは対面であった事がありません。もっと気軽に話せる仲になりたいです。これが結局最重要課題かも知れません、、、笑。
C++でUserWidgetを非同期ロードして生成する

# 概要
UAssetManager::Get()->GetStreamableManager()->RequestAsyncLoadを使用した非同期ロードで、UserWidgetを読み込んでインスタンスを作成する方法のメモ

# SoftObjectPathの作成
Content Browserでアセットを選択し右クリックからCopy Referenceをしたパスを使って、SoftObjectPathを作成する。
<b>_Cを付けることに注意</b>
例 FSoftObjectPath("/Game/UMG/UMG_HUD.UMG_HUD_C")

# RequestAsyncLoad呼び出し
```c++
handle = UAssetManager::Get().GetStreamableManager().RequestAsyncLoad(FSoftObjectPath("/Game/UMG/UMG_HUD.UMG_HUD_C"), [this]()
	{
		TSubclassOf<class UUserWidget> WidgetClass;
		WidgetClass = TSoftClassPtr<UUserWidget>(handle->GetLoadedAsset()).Get();
		auto w = CreateWidget(GetWorld(), WidgetClass);
		w->AddToViewport(0);		
		handle->ReleaseHandle();
		handle = nullptr;
	});
```

# コールバック内でWidgetをインスタンス化
TSoftClassPtr<UUserWidget>にGetLoadedAsset()のUObject*を渡すことで、Get()から正しいUClass*が取得できる。
ブループリントで行っているのと同じ流れで、CreateWidgetとAddToViewportを呼び出す。

# 不要になったハンドルを解放
handle->ReleaseHandle()で解放。
一応nullptrを入れる。
Javascript_関数を作る

# はじめに
このページは初学者のメモ書きです。
## 参考
Progate JavascriptⅢ
### 内容
```javascript:関数を作る時の書き方①
const 定数名 = function(引数){
  関数の中身を書く;
}
```
```javascript:関数を作る時の書き方②
const 定数名 = (引数) =>{
  関数の中身を書く;
}
```
```javascript:関数で処理した値を返す
const 定数名 = () =>{
  return 値;
}
```
```javascript:戻り値をつかう例
const half = (number) => {
  return number / 2;
};

const result = half(130);

console.log(`130の半分は${result}です`);
```
`half`関数に入れた数字の半分を出力した。

引数は複数設定することもできる
```javascript:引数複数
const half = (number1,number2) => {
  return number1 / number2;
};

const result = half(130,20);

console.log(`${result}です`);
```

簡単な関数を作れるようになった。
cloud9でrailsの環境構築をする

cloud9でrailsの環境開発を行う際にすることをまとめた。まずはターミナルで
```
$rails new sample app
```
と打ち込む。ここのsample appは好きなファイル名でOK！
その後
```
$cd sample app
```
で移動したのち
```
$rails s
```
でサーバー起動します。無事起動できれば終了です。しかし，以下のようなエラーが出てくるかもしれません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2500127/5b6d06a5-bba6-180b-8ba5-74af78433db2.png)

対処方法としてはGemfileを編集します。
Gemfileに以下を追記します。
```ruby:Gemfile
gem 'sqlite3', '~> 1.3.6'
```
修正前
![スクリーンショット 2022-05-01 23.59.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2500127/938c00ad-be8d-a2c7-1039-63ef4d93b046.png)
修正後
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2500127/98e76a79-29f2-0130-e4c5-019124398315.png)
7行目を変更しました。変更後，ターミナルで
```
bundle install
```
した後再度
```
rails s
```
でサーバーを起動します。以下のような画面になれば成功です！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2500127/0d2a8ee5-d6c2-9376-47c9-c76d280dcd0c.png)
参考記事
https://note.com/se_no/n/na8210c5fccd5
https://qiita.com/MORITAKENTARO/items/e8d5306a07715db6c4f2
NextjsスターターキットをOSSにします


## 概要
Nextjsのスターターキットを作りました。
Nextjsのプロジェクトを始める時に必要なツールを詰め込んでます。

https://github.com/Foxlottery/nextjs-starterkit


## 設定済みのツール
- Sentry
- Web3
- Jest test
- Tailwind.css
- Vscode initialization
- PR and Issue template
- Seo module
- Husky
- Lingui
- Google Tag Manager
- Redux
- ESlint
- Prettier
- Github workflow


## スクリーンショット

### PC

![pc-size.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264684/31b7a275-03f6-acaf-ab35-926adef39aed.png)

### スマホ
![s-size.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264684/2f47c6cf-6331-0b6b-60fd-49200235130b.png)


# Sentry
https://sentry.io/
アプリケーションの監視とエラー追跡のソフトウェア

# Web3
### wallet connect
supported wallet
metamask: https://metamask.io/
coinbase: https://www.coinbase.com/en/wallet
portis: https:/portis.io
fortmatic: https://fortmatic.com/

### network connect
supported network
Ethereum
Avalanche
Polygon
Ropsten

# Jest test
https://jestjs.io/ja/
javascriptのユニットテストツール

# Tailwind.css
https://tailwindcss.com/
css フレームワーク

# Vscode initialization
https://code.visualstudio.com/
vscode 対応のための初期設定

# PR and Issue template
github pr と issue テンプレート

# Seo module
NextjsでSEO対策するための初期設定

# Husky
https://www.npmjs.com/package/husky
コミット時に自動でコマンドを実行

# Lingui
https://lingui.js.org/
Javascriptのシームレスな国際化

# Google Tag Manager
https://tagmanager.google.com/
Google Analyticsは、広告のROIを測定するだけでなく、Flash、ビデオ、ソーシャルネットワークのサイトやアプリケーションを追跡することができます。


# Redux
https://redux.js.org/
JSアプリのための予測可能なステートコンテナ

# Eslint
https://eslint.org/
コードチェックツール

# Prettier
https://prettier.io/
コードフォーマッター


# Github workflow
https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions
CI/CD ツール
Github のワークフローは、コミットやマージが行われたときにデプロイやテストを実行する