OmniAICreator/Qiita-1.07M huggingface dataset:
書き方思い出したい人用vba記述メモ

# VBAコード一覧
注意1:VBのコードブロックで記載しているため、一部赤線がありますが、VBAでは問題ない書き方です。
注意2:以前のアカウントを削除して記事の再掲をしました。

## プロシージャ作成
### - Sub
```VB
Public Sub Main()
    Dim Num As Integer
    Dim Back As String
    Dim DataArr（） As String

'プロシージャの呼び出し
    Back = Addin(DataArr(),Num)
'戻り値がない場合
    Call Addin(DataArr(),Num)
End Sub
```

### - Function
```VB
Private Function Addin(ByRef DataArr() As Range, Optional ByVal Num As Integer As Range)

'プロシージャ名に値を代入すると戻り値になる
    Addin = "戻り値の設定"
End Function
```


#### SubとFunctionの違い
-Functionは戻り値が設定できるが、Subはできない
-Subはフォームコントロール（ボタンなど）にマクロを設定できるが、Functionはできない
※Mainの処理はSubで、サブの処理や何度も使用する処理はFunctionで作成すると良い


#### プロシージャの参照範囲
Public :他のモジュールから参照できる
Private:同じモジュール内しか参照できない

#### 引数の引用方法
ByVal   :値渡し。データのみを渡す。
ByRef   :参照渡し。データがあるアドレスを渡す。
　　　　渡し先で値が変更されると、渡し元も値が変更される。
Optional:使用しなくてもいい引数に設定する。
　　　　本来は、引数を全て指定しないとプロシージャは使用できないが、
　　　　これを使うと指定しなくてもにプロシージャが動作する。
　　　　※Optionalは複数設定できるが、必ず後ろに設定する必要がある。

## 主なデータ型と条件の書き方
-Integer
-Long
-String
-Variant
-Range(オブジェクト）
-WorkSheet（オブジェクト）
-WorkBook（オブジェクト）

```VB
'データ宣言と代入
Dim Sample As Integer
Sample = 2

'オブジェクトの場合
Dim Sample As Range
Set Sample = Cells(1,1)

'If (※比較は”＝”一つで良い)
If Sample = 24 Then
    Sample = 1
ElseIf Not(Sample Is Nothin)Then
    Sample = 2
Else
    Sample = 3
End If

'For
For Sample = 2 To 100
    Cells(1,Sample) = "Test"
Next

'減少＆途中抜けパターン
For Sample = 100 To 2 Step -2
    If Cells(1,Sample) = 1 Then
        Exit For
    End If
Next

'Do While

Sample = 2
Do While(Sample < 100)　
    If Cell(Sample,1) = 24 Then
        Exit Do
    End If
    Sample = Sample + 1
Loop

'Select Case
Select Case Sample
Case 1
    '〜write code〜
Case Is < 5
    '〜write code〜
Case Else
    '〜write code〜
End Select
```
BigQueryでタイムトラベル機能を使用した過去データの復元

# はじめに
BigQueryのタイムトラベル機能についての紹介です。
以下のようなケースで利用できます。

- 間違ってテーブルを削除、上書きしてしまった
- 調査等でテーブルの過去のデータを参照したいが洗い替えられており分からない

※注意点として、現時点では7日前までしか遡ることができません。
　タイムトラベル期間を過ぎているとエラーメッセージが表示されます。

https://cloud.google.com/bigquery/docs/managing-tables?hl=JA#bq_5

# 使い方
BigQueryのCloud Shellで以下のコマンドを実行

```shell
bq cp プロジェクト名:データセット名.テーブル名@Unix エポック時刻からの経過時間(　ミリ秒) コピー先のプロジェクト名:データセット名.テーブル名
```
Unix エポック時刻からの経過時間は、以下のサイトのツールで計算した値を入力

https://itneko.com/epoch-milliseconds/

もしくは、以下のようなSQLでも取得可能です
```sql
SELECT UNIX_MILLIS(TIMESTAMP('2022-12-01 12:00:00', 'Asia/Tokyo'));
```

## 実行例
2022/12/01 12:00:00時点のtarget_tableをtarget_table_restoredとして復活(コピー)させる
```shell
bq cp my_project:my_dataset.target_table@1669863600000 my_project:my_dataset.target_table_restored
```
現在から1時間前のデータが欲しい場合
```shell
bq cp my_project:my_dataset.target_table@-3600000 my_project:my_dataset.target_table_restored
```
「○○時間前」のような指定をする場合は「-」をつける
【MOD】向いている方向にワープする【Minecraft】

MineraftのMODでワープするアイテムを追加するとする。Minecraftの世界はブロックで表現されているわけだが、これがワープ先の座標を決定することを難しくする。
ここでは、右クリックをするとワープするアイテム`ItemWarpStick`を例にして説明する。

# getYRot()を使う
Y軸を軸とした回転の角度を得られるメソッド`getYRot`があるので、それを使う方法である。理解しやすく、単純な方法である。

```java:ItemWarpStick.java
public class ItemWarpStick extends Item {
    public ItemWarpStick() {
        super(new Item.Properties().tab(CreativeModeTab.TAB_COMBAT));
    }

    public Vec3 toVec3(BlockPos pos) {
        return new Vec3(pos.getX(), pos.getY(), pos.getZ());
    }

    @Override
    public InteractionResultHolder<ItemStack> use(Level level, Player playerIn, InteractionHand handIn) {
        BlockPos pos = playerIn.getOnPos();
        float YRot = playerIn.getYRot() % 360;

        if (YRot > 180) {
            YRot -= 360;
        }
        if (YRot < -180) {
            YRot += 360;
        }

        if (YRot <= 15.0f && YRot > -15.0f) {
            playerIn.setPos(toVec3(pos).add(0, 1, 3));
        } else if (YRot <= 45.0f && YRot > 15.0f) {
            playerIn.setPos(toVec3(pos).add(-1, 1, 2));
        } else if (YRot <= 75.0f && YRot > 45.0f) {
            playerIn.setPos(toVec3(pos).add(-2, 1, 1));
        } else if (YRot <= 105.0f && YRot > 75.0f) {
            playerIn.setPos(toVec3(pos).add(-3, 1, 0));
        } else if (YRot <= 135.0f && YRot > 105.0f) {
            playerIn.setPos(toVec3(pos).add(-2, 1, -1));
        } else if (YRot <= 165.0f && YRot > 135.0f) {
            playerIn.setPos(toVec3(pos).add(-1, 1, -2));
        } else if (YRot <= -135.0f && YRot > -165.0f) {
            playerIn.setPos(toVec3(pos).add(0, 1, -3));
        } else if (YRot <= -105.0f && YRot > -135.0f) {
            playerIn.setPos(toVec3(pos).add(1, 1, -2));
        } else if (YRot <= -75.0f && YRot > -105.0f) {
            playerIn.setPos(toVec3(pos).add(2, 1, -1));
        } else if (YRot <= -45.0f && YRot > -75.0f) {
            playerIn.setPos(toVec3(pos).add(3, 1, 0));
        } else if (YRot <= -15.0f && YRot > -45.0f) {
            playerIn.setPos(toVec3(pos).add(2, 1, 1));
        } else {
            playerIn.setPos(toVec3(pos).add(1, 1, 2));
        }

        return super.use(level, playerIn, handIn);
    }
}
```

`getOnPos`を使うことでプレイヤーが立っているブロックの`BlockPos`が取得できる。`setPos`を使ってワープさせる際に引数が`Vec3`だったため、`BlockPos`を`Vec3`に変換するメソッド`toVec3`を定義した。
あとは角度に応じてX軸方向Z軸方向にそれぞれ何ブロック移動させるかを決めている。`getOnPos`を使っている関係で`add`の引数yを0にすると地面に埋まるので、1を入れる。
360で割った余りに対して360を足したり引いたりしているのは、`getYRot`で得られる値が-180~180と思いきやそうではないからである。Javaにおいて、負の数を正の数で割った余りは負の数になる。参考として、`getYRot`で得られた値を`System.out.println`で表示した結果を以下に示す。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370590/a06a2f7e-4a46-7389-9491-f53684c81107.png" width=75%>
ひたすら場合分けしているだけなので12方位にしかワープできない。場合分けをさらに細かくしていけばより高精度になるが、現実的ではない。

# 他にも
他にもベクトルや行列、四元数を用いたアプローチが考えられるが、気が向いたら後日取り上げる。
Slackにコードを貼り付けるとシングルクォーテーションや二重引用符が勝手に変換されてしまう件

# 困ったこと

* Slackのメッセージでコードを送り合っていざHTMLのソースコードに貼り付けたら、どうもうまく反映されない。
* なぜだろうとよくよく見ると、Slackで送ったソースコードの一部が、勝手に変換されていることが発覚する。

* 本来のコード
```html
<div class="row">
```

* Slackに貼り付けた後のコード
```html
<div class=“row">
```

* ナンジャコリャー！！ダブルクオーテーションが変になっているぞ！！（誰かミスったのか！？）

# 解決方法
* いいえ、誰のミスでもありませんでした。これはMacの設定が原因。ここにたどり着いた方もMacをお使いのはず。
* 「システム環境設定」→「キーボード」→「ユーザ辞書」→「スマート引用符とスマートダッシュを使用」をオフにしてください。再起動後、解決します！
* これはSlack特有のバグではなく、テキストエディタなどにおいても発生しうるので、オフは必須だと思います。
* Visual Studio CodeやAdobeソフトは元から無効になっているようです。
* テキストエディットでは、アプリ側からも環境設定があるので、ご留意ください。

# スマート引用符とスマートダッシュとは
* 公式のmacOSユーザガイドを見ると、以下のように記載があります。 

> ストレート引用符をタイポグラフィで使用する引用符（丸い引用符記号）に、2つのハイフンを自動的にemダッシュに変換します
  
* macOSユーザガイド: [Macで書類のテキストと句読点を置き換える](https://support.apple.com/ja-jp/guide/mac-help/mh35735/mac)

* タイポグラフィのための設定らしいですが、コーディングしている人からすると「なんで丸い引用符記号なんや」と突っ込みたくなるところですね（笑）

Smart double quote
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710373/3bfce923-909e-15f1-4bcb-16abc85c408b.png)

Straight double quote
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710373/97f73a30-afc7-3649-cf94-947e4947b71e.png)
【TypeScript】inferは怖くない

TypeScriptの学習を進めていく中で、多分ぶつかるであろう壁が**infer**ではないでしょうか。  
何をしているのかわからず、普段使用しないから無視している方もいらっしゃるかと思います。
しかし、inferはよく使用されています。知らないところで型を推論してくれています。

今回は例を交えながらinferの特徴と使用方法について解説していきます。

## 何がinferの理解を妨げているのか
まずはConditional Typesの理解不足からくるものが考えられます。
以下公式からじっくりみていくことをおすすめします。
https://www.typescriptlang.org/docs/handbook/2/conditional-types.html#handbook-content

また、inferという単語から複雑さを感じやすいのも一つです。
いきなり多用されている部分をみると理解しづらい状況になってしまいます。

ですが、一つ一つを順番に読んでいけば難しいものではなく、むしろ役に立ちそうな便利な型推論になります。


## infer とは
inferとは、**条件付き型のextends内で、推論される型を導入するための宣言**です。
条件付きとは、Conditional Typesのことです。

Conditional Typesについて詳細な説明は省きますが、以下のような形をとります。
T型がU型に含まれている時に、X型を返し、含まれなければY型を返します。
```
T extends U ? X : Y
```

### 環境
今回試した環境は、公式TypeScript TS Playgroundです。
https://www.typescriptlang.org/play

バージョンは **v4.9.4** になります。

### ReturnType
Utility Typesの中に**ReturnType**があります。これは指定した関数の返り値の型を推論してくれる便利な型です。
実はここでinferが使用されています。
https://www.typescriptlang.org/docs/handbook/utility-types.html#returntypetype

MyReturnTypeは、**関数であるならばその関数の返り値をinferを使用して推論し型として定義**しています。
```typescript
type MyReturnType<T> = T extends (...args: any[]) => infer R ? R : never;

const sum = (a: number, b: number) => a + b
type Sum = MyReturnType<typeof sum> // number
```

実際にReduxのアクション型を定義するのに一役買ってくれています。
アクションの関数返り値をまとめて定義でき、reducerで使用しています。
```typescript
const INCREMENT = 'INCREMENT' as const;
const SET_COUNT = 'SET_COUNT' as const;

export const increment = () => ({
  type: INCREMENT,
})

export const setCount = (num: number) => ({
  type: SET_COUNT,
  payload: {
    count: num,
  },
})

type Actions = (
  | ReturnType<typeof increment>
  | ReturnType<typeof setCount>
)
/*
type Actions = {
    type: "INCREMENT";
} | {
    type: "SET_COUNT";
    payload: {
        count: number;
    };
}
*/

export default function reducer(
  state: any,
  action: Actions,
) {
  switch (action.type) {
    // 省略
  }
}
```

### Flatten型
以下から拾ってきました。
https://www.typescriptlang.org/docs/handbook/2/conditional-types.html

Typeが配列ならばその中身の型をinferで推測し、型として定義しています。

```typescript
type Flatten<T> = T extends Array<infer U> ? U : T;

const users = [
  {
    name: 'a',
    age: 25
  },
  {
    name: 'b',
    age: 30
  }
]
type MyObject = Flatten<typeof users>
/*
type MyObject = {
    name: string;
    age: number;
}
*/
```

### Unpack型
以下から拾ってきました。
https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-8.html#type-inference-in-conditional-types

配列要素型、関数戻り型、promise.resolve引数型を取得する型になります。
難しいように見えますが、Conditional Typesが多いだけです。
```typescript
type Unpacked<T> =
 T extends (infer U)[] ? U :
 T extends (...args: any[]) => infer U ? U :
 T extends Promise<infer U> ? U
 T
```

## GoQSystemでは一緒に働いてくれる仲間を募集中です！
ご興味がある方は以下リンクよりご確認ください。

https://goqsystem.recruit.site?qiita=677251ce778afcacd33e
xxx.getClass()　と xxx.class

いわゆる型。よくわからなくなってきたのでconsoleに出力して確認

```sample.java
    public static void main(String[] args) {
        String s1 = new String("1");
        System.out.println(s1.getClass());
        System.out.println(String.class);
        System.out.println(s1 instanceof String);
    }
```
実行結果
```
class java.lang.String
class java.lang.String
true
```
VUE compositionAPIの関数exportで困ったこと

# VUE compositionAPIの関数exportで困ったこと
## 困ったこと
肥大化したコンポーネントをファイル分割するためにaxiosを使ってAPIにリクエストを送っている部分を外だししようしたところ、
ローカル実行では特に問題なく動作したが、buildしようとするとエラーをはいてしまう。
備忘も兼ねて共有。

## 該当コードとエラー
```getInfoApi.vue
<script lang="ts">

export const getInfoApi=()=>{
    return //ここにAPIを投げる処理
}

</script>
```

- エラーメッセージ
`Error: 'default' is not exported by <getInfoApiを外部から呼び出しているファイルのパス>`
## 解決策
- compositionAPIで関数の記述をファイル分割する場合はexport defaultで書く。
```getInfoApi.vue
<script lang="ts">

export default function getInfoApi(){
    return //ここにAPIを投げる処理
}

</script>

```

## その他
export defaultを使用したことで呼び出している側のファイルでも分割代入によるimportができなくなっているので、
{}は外しておく。
`import  {getInfoApi}  from './getInfoApi.vue';`
↓
`import  getInfoApi  from './getInfoApi.vue';`
ASTERIA WarpでTwitterのツイートをTeamsに投稿する


普段Teamsを使っている方、チャネルにニュースやトレンド情報などが流れてきたら便利ですよね！今回ASTERIA WarpでTwitterのツイートをTeamsに投稿するフローを作ってみました。

構築したフローは以下のように動作します。

# 動作シナリオ

フローを実行すると検索ワード入力欄が表示されますので検索ワードを入力します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/851649/54f4cd57-b9a0-306f-85b6-5681d3edca96.png)

指定した検索ワードにヒットする過去一日のツイートを取得し、Teamsのチャネルに投稿します。投稿するメッセージにはツイートしたユーザ名、ツイート内容、ツイートへのリンクが含まれます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/851649/9ad78287-2b3c-f06a-1b22-3ecec28116b5.png)

# 準備したもの

今回は[マルチセレクトオプション](https://www.asteria.com/jp/warp/blog/20210625/86878.html)に含まれる以下二つのアダプタを使用します。

・[Twitterアダプター](https://www.asteria.com/jp/warp/feature/option/twitter)
・[Microsoft Teamsアダプター](https://www.asteria.com/jp/warp/feature/option/ms_teams)

また、TwitterとTeamsのそれぞれのユーザアカウントが必要です。Teamsは***管理者アカウント***が必要ですのでご注意ください。

# フロー

構築したフローを以下に示します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/851649/e6f4f6f8-90eb-2d74-76ad-7fb84c11821b.png)


### Mapper1

今回、取得するツイートは検索ワードと日時でフィルタリングします。最初のMapperコンポーネントではフローに入力された検索ワードと取得するツイートの日時をTwitterGetコンポーネントのSQLパラメータに渡します。過去一日のツイートを取得するため、日時には現在時刻から一日マイナスした日時を指定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/851649/c3f52bb3-c144-c41e-3dcc-60be59d454e3.png)


### TwitterGet

TwitterGetコンポーネントでは[Tweetsテーブル](https://cdn.cdata.com/help/RTH/jp/jdbc/pg_table-tweets.htm)からツイートを取得します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/851649/ab016340-70d7-241b-31f2-18e1fb24a2c6.png)


フローではツイートの以下3つの情報を投稿します。
1. ツイートしたユーザ名
2. ツイート内容
3. ツイートへのリンク

ツイートへのリンクURLはユーザのスクリーン名とツイートIDから以下のように構成できます。

`https://twitter.com/<ユーザのスクリーン名>/status/<ツイートID>`

これらの値を取得するため、SELECT文では以下のカラムとSQL関数を設定しています。

1. `From_User_Name` : ツイートしたユーザ名
2. `Text` : ツイート内容 : 
3. `CONCAT('https://twitter.com/',From_User_Screen_Name,'/status/',ID)` : ツイートへのリンク

さらにフィルタ条件として以下のカラムを設定しています。

1. `Lang` : ツイートの言語コード。ここでは日本のツイートのみを取得するため固定値「ja」を指定しています。
2. `SearchTerms` : 検索ワード。フローの入力をSQLパラメータとして取得します。
3. `Created_At` : ツイートが作成された時刻。一つ前のMapperコンポーネントで生成した時刻をSQLパラメータとして取得します。


### Mapper2

次のMapperコンポーネントではTwitterGetコンポーネントで取得した3つの情報を1つの文字列にまとめます。Teamsに投稿するメッセージはリンクを含むためHTML形式で構成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/851649/e39047b0-3ef3-45a7-e865-6019ef448de0.png)


### MSTeamsSQLCall

MSTeamsSQLCallコンポーネントでは[SendMessageストアドプロシージャ](https://cdn.cdata.com/help/GSH/jp/jdbc/pg_sp-sendmessage.htm)を使ってTeamsのチャネルにメッセージを投稿します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/851649/38c50764-5572-b0de-957e-b6973fee24b1.png)

ストアドプロシージャのパラメータは左から<チームID>, <チャネルID>, <コンテンツタイプ>, <メッセージの内容>です。今回はメッセージをSQLパラメータとして受け取ります。

SendMessageストアドプロシージャの使い方やチームID, チャネルIDの取得方法については[こちら](https://www.cdata.com/jp/blog/msteamssendmessage)の記事をご参考ください。また、[SendChatMessageストアドプロシージャ](https://cdn.cdata.com/help/GSH/jp/jdbc/pg_sp-sendchatmessage.htm)を使ってチャットに送信することもできます([参考記事](https://www.cdata.com/jp/blog/msteams-drivers-chatmessagesusage))。

# おわりに

今回はASTERIA WarpでTwitterのツイートをTeamsに投稿するフローを作成しました。TwitterアダプタやMSTeamsアダプタは他にも様々な機能を持っていますのでいろいろ応用してみてください。
Generics サンプル

generics class sample

paramをgenericsで定義
instance化する際に、concreteなclassを指定する

```Putlog.java
public class Putlog <T>{
    private T param;
    public Putlog(T p1) {
        this.param = p1;
    }
    public void setPlog(T p1) {
        this.param = p1;
    }
    public void outlog() {
        System.out.println(param);
    }
}
```
```sample.java
    public static void main(String[] args) {
        Putlog p = new Putlog("a1");
        p.outlog();
        p = new Putlog(1);
        p.outlog();
    }
```
実行結果
```
a1
1
```
generics methodは、return valueの前に型パラメータを置く
```java
    static <T> Optional<T> get(T[] array, int index) {
        if(array == null) {
            return Optional.empty();
        } else {
            try {
                return Optional.ofNullable(array[index]);
            } catch (ArrayIndexOutOfBoundsException ex) {
                return Optional.empty();
            }
        }
    }
```
UnityのゲームでModが作られる手順について

[PONOS Advent Calendar 2022](https://qiita.com/advent-calendar/2022/ponos) 18日目の記事です。
昨日は@abcdeffさんの「[クラス設計に関して](https://qiita.com/abcdeff/items/b9ec01044fda01394883)」でした。

# Unityのコンパイラについて

UnityのコンパイラはMonoとIL2CPPの2種が用意されています。特に何も設定せずビルドをするとMonoでコンパイルが行われますが、この場合.NETの中間言語であるILで出力されます。
IL2CPPの場合はILをC++に変換するので解析が難しくなりますが、Monoの場合は各種ツールを使う事で簡単に解析・改造を行う事が可能です。

本記事では自作のゲームを用いてModを作成してみます。

![moto.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/924601/b5698dec-06b3-a647-3d11-f799351e636f.gif)

:::note warn
本記事内でModの作成方法について触れますが改造行為を推奨する物ではありません。
行う場合はあくまで自己責任でお願いします。
:::

# dnSpyを使う

C#のデコンパイラであるdnSpyをダウンロードします。
https://github.com/dnSpy/dnSpy

Monoでビルドしたゲームのローカルファイルを見ると`「(ゲーム名)_Data/Managed」`というフォルダがあります。
この中の`「Assembly-CSharp.dll」`をdnSpyに入れるとデコンパイル出来ます。

・元のC#のコード
![vscode.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/924601/6b8ce932-1022-c402-d9ab-5870ff2abcc4.png)

・デコンパイルしたコード
![dnSpy.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/924601/48cac278-9026-f7bf-ab54-47853e9c59b9.png)
見比べるとコメント文が無いなどの違いはありますが、ほぼそのままコードが復元出来ていることが分かります。
このままdnSpy上でコードを書き換えて再度コンパイルをする事も可能ですが、完全に上書きしてしまうのでModの様に再配布する形には向きません。そこで別のツールを使用します。

# BepInEx

UnityのゲームにModを導入出来るフレームワークの一つにBepInExという物があります。
https://github.com/BepInEx/BepInEx

1. VisualStudioでプロジェクト作成。種別はクラスライブラリ(.NET Framework)
2. 参照→「参照の追加」から必要なdllを追加。
   (BepInEx.dll・0Harmony.dllとManagedの中身から必要な物を探す)
3. 改造したい内容を記載してビルド。
4. ビルドして出来たdllを`「BepInEx/plugins」`に入れれば準備完了。

先程のジャンプゲームの移動速度を3倍に、また縦にも移動出来る処理を入れてみます。

```c#:
using HarmonyLib;
using UnityEngine;

namespace JumpGameMod
{
    [HarmonyPatch(typeof(PlayerJump), "FixedUpdate")]
    internal class FreeMove
    {
        public static void Postfix(Rigidbody2D ___rigidbody2d)
        {
            var newVec = ___rigidbody2d.velocity;
            newVec.y = Input.GetAxis("Vertical") * 3.5f;
            ___rigidbody2d.velocity = newVec * 3f;
        }
    }
}
```

このコードをビルドして出来たdllを導入してゲームを起動すると、以下の通り記載した処理が反映されている事が確認出来ました。
![mod.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/924601/6ba62514-f944-a981-faa4-de0c5385c16a.gif)

# まとめ

以上の通り各種ツールを用いたMod作成が出来る事を確認しました。高度な知識が必要という訳では無く、C#さえ分かればある程度のコード書き換えは出来てしまいます。

PCゲームの場合は逆にユーザーによるMod作成を推奨している作品もありますが、特に理由が無い限りはIL2CPPでのビルド及び難読化などの対策を行うことをオススメします。

明日は@tequila0725さんの記事です🍣
閉じたVPC内のHTTPSサービスにEC2 SSH踏み台を通してアクセスする




# 閉じたVPC内のEC2へのSSH
インターネット接続経路が無いVPC内にあるEC2でも、SSM経由ならSSHアクセスが可能です。

https://aws.amazon.com/jp/premiumsupport/knowledge-center/ec2-systems-manager-vpc-endpoints/

https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/session-manager-getting-started-enable-ssh-connections.html


# HTTPならSSHトンネルでもアクセス可能
SSHが通るなら、(HTTPSではなく) `HTTP` のサイトなら簡単にトンネルを貼ってアクセスすることが可能です。

```sh
ssh -L 8080:yoursite.local:80 bastion
```

アクセス先のホスト名は変わりますが、アクセスできます。

```sh
curl http://localhost:8080
-> OK
```

ただ `HTTPS` の場合は、

```sh
ssh -L 8081:yoursite.local:443 bastion
```

証明書エラーになり上手くいきません。

```sh
curl https://localhost:8081/
curl: (35) OpenSSL SSL_connect: SSL_ERROR_SYSCALL in connection to localhost:8081
```


# Dynamic Port Forwardingを使えばHTTPSもアクセス可能
Dynamic Port Forwardingを使えばHTTPSもアクセス可能になります。

`-D` オプションで待ち受けポートを指定して踏み台にSSHします。

```sh
# Port番号1080は任意
# [-D 0.0.0.0:1080]なども指定可能
ssh -D 1080 bastion
```

HTTPSやHTTPでなく、 `socks5`をスキーマに指定して実行すると通ります。ホスト名は本来のアクセス先のホスト名です。

```sh
curl -x socks5://localhost:1080 https://yoursite.local
```



ブラウザと一緒に利用もできます。

```cmd
> "C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" --proxy-server="socks5://localhost:1080"
```

ブラウザの拡張機能と合わせて使うと便利です。

https://chrome.google.com/webstore/detail/proxy-switchysharp/dpplabbmogkhghncfbfdeeokoefdjegm?hl=ja

https://addons.mozilla.org/ja/firefox/addon/foxyproxy-standard/

それぞれSOCKS5の設定をすることで繋がります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116068/c7d99c08-bd85-574c-98c3-194867d02860.png)



# アプリ等がSocks Proxyに対応していない場合
アプリが対応してないなど、どうしてもHTTPのPROXYを通したアクセスが必要な場合は、SOCKS5のPROXYを更に [DeleGate](https://its-more.jp/delegate/) でラップしてあげると、HTTPのPROXYとして利用可能です。`HTTPS_PROXY` 等の環境変数と一緒に普通のPROXYとして利用可能になります。

Dynamic Port Forwardingの準備をして、

```sh
ssh -D ${PRIVATE_IP}:1080 bastion
```

[DeleGate](https://its-more.jp/delegate/) の [Dockerコンテナ](https://hub.docker.com/r/vimagick/delegated/)使ってラップします。

```sh
docker run --rm -p 8080:8080  vimagick/delegated -P8080 SERVER=http SOCKS=${PRIVATE_IP}:1080
```

これでHTTP ProxyとしてもHTTPS通すことができます。

```sh
curl -x http://localhost:8080 https://yoursite.local
```
2022年お世話になったVSCodeの機能拡張

年末になったのでVSCodeの機能拡張の棚卸しを兼ねて、私が2022年にお世話になった機能拡張を紹介します。

# Error Lens
https://marketplace.visualstudio.com/items?itemName=usernamehw.errorlens

以下の画像のようにインラインでエラー（問題）を表示してくれます。コードを書いた後にLintを実行したら怒られたといったことが少なくなります！（なりました）

![Screenshot 2022-12-15 at 17.54.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73698/d77d82af-3585-9a1c-7416-0e01c2de7213.png)


# Jest Runner
https://marketplace.visualstudio.com/items?itemName=firsttris.vscode-jest-runner

インラインで「Run|Debug」を表示してくれて、クリックするとターミナルでJestテストを実行されるようになります。
![Screenshot 2022-12-15 at 18.02.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73698/32e5af46-d51c-aba9-ca22-ea4145fdfdc2.png)


# WakaTime
https://marketplace.visualstudio.com/items?itemName=WakaTime.vscode-wakatime

開発者向けのFitBitのようなものです。コーディング時間、言語などの統計をとってくれます。
![Screenshot 2022-12-15 at 18.07.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73698/e8a2cc6b-1cd4-9ef1-7d7a-5278ae5188f1.png)

https://wakatime.com

# VSCode UIFlow
https://marketplace.visualstudio.com/items?itemName=kexi.vscode-uiflow

マークダウンぽいのを書くと勝手にUIFlow図ぽいのを作ってくれます。マークダウンなのでgitで管理しやすいです。(私が個人開発しているので宣伝です😆)

![Screenshot 2022-12-15 at 18.58.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73698/eb61a6a3-ad7c-5de6-d636-df6613f3e443.png)







# おわり
みんなが入れているだろう拡張機能は省きました。他の方が入れている拡張機能知りたいです😇
zshrcのカスタマイズ

この記事はHRBrain Advent Calendar 2022 カレンダー3の20日目の記事です。

https://qiita.com/advent-calendar/2022/hrbrain

## はじめに

株式会社HRBrainでエンジニアをやっている深谷です。
この記事ではおすすめのzchrcのカスタマイズについて書こうと思います。

## そもそもzshrcとは
zshrcの説明をする前にzshとはなにかの説明を軽くしておくと
>Z shellは、Unixのコマンドシェルの1つである。対話的なログインコマンドシェルとしても、強力なシェルスクリプトコマンドのインタープリターとしても使うことができる。

bashやkshなどと同じコマンドシェルのうちの1つです。
macOSではmacOS 10.15 Catalinaからデフォルトのシェルとして使用されています。

##### それではzshrcとはなにか
zshをログインシェル、インタラクティブシェルとして使用する場合に読み込まれる設定ファイルのことを指します。
zshrcをカスタマイズすることで今までより便利にzshを使うことが可能となります。
ちなみにrcは`run command`の略です。


## zshの導入
Homebrewを使ってzshをインストールします。
Homebrewがない方は[こちら](https://brew.sh/index_ja)からinstallしてください。

```
brew install zsh
```

ログインシェルを変更します。
```
chsh -s /usr/local/bin/zsh
```

これでzshが使えるようになったはずです。

```
~/.zshrc
```
がない場合は作成してください。

## カスタマイズ
#### zsh-completions コマンド補完機能の設定。
ない方は下記のコマンドでinstallしてください。
```
brew install zsh-completions
```
```
autoload -U compinit && compinit -u
```
#### 日本語ファイル名を表示可能にする
```
setopt print_eight_bit
```
#### ビープ音の停止
```
setopt no_beep
```
#### historyの保存数を増やす
```
HISTFILE=~/.zsh_history
HISTSIZE=100000
SAVEHIST=100000
```
#### git系
- gitのコマンドをタブキーで補完してくれるgit-completion
- gitのリポジトリのステータスをプロンプトに表してくれるgit-prompt

ない方は下記のコマンドでinstallしてください。
```
curl -o .git-completion.sh https://raw.githubusercontent.com/git/git/master/contrib/completion/git-completion.bash
curl -o .git-prompt.sh https://raw.githubusercontent.com/git/git/master/contrib/completion/git-prompt.sh
```
```
source ~/.zsh/git-prompt.sh
fpath=(~/.zsh $fpath)
zstyle ':completion:*:*:git:*' script ~/.zsh/git-completion.bash
autoload -Uz compinit && compinit
autoload -Uz vcs_info
setopt prompt_subst
zstyle ':vcs_info:git:*' check-for-changes true
zstyle ':vcs_info:git:*' stagedstr "%F{magenta}!"
zstyle ':vcs_info:git:*' unstagedstr "%F{yellow}+"
zstyle ':vcs_info:*' formats "%F{cyan}%c%u[%b]%f"
zstyle ':vcs_info:*' actionformats '[%b|%a]'
precmd () { vcs_info }
PROMPT='
[%B%F{red}%n@%m%f%b:%F{green}%~%f]%F{cyan}$vcs_info_msg_0_%f
%F{yellow}$%f '
```
下記にgitのaliasをまとめました。
```
alias g='git'
alias gs='git status'
alias gb='git branch'
alias gc='git checkout'
alias gct='git commit'
alias gg='git grep'
alias ga='git add'
alias gd='git diff'
alias gl='git log'
alias gfo='git fetch origin'
alias gcm='git commit -m'
alias gpo='git push origin'
alias gpom='git push origin master'
alias gst='git stash'
alias gsl='git stash list'
alias gsp='git stash pop'
```

#### docker系
何かと長いdockerのコマンドもaliasにしておくと時短になって便利です。
```
alias d='docker'
alias dc='docker-compose'
alias dcnt='docker container'
alias dimg='docker image'
alias drun='docker container run —rm -d'
alias drunit='docker container run —rm -it'
```

つらつらと書きましたがちょっと見づらいと思うので[GitHub](https://github.com/taijuf212/dotfiles)に
- .zshrc
- install.sh

を置いておくので好きなように使ってください。


## まとめ
色々なカスタマイズを紹介しましたが、他にも色々な設定があるのでどんどん自分の使いやすいzshにしていきましょう。
aliasを登録するだけで時短になりますし、普段自分がよく使うコマンドなども登録していくと業務効率が上がると思います。

ということで、そんな弊社に興味を持った方がいればぜひ下記ページからご応募ください！

https://www.hrbrain.co.jp/recruit
楽しいペアプロ、ペアワーク

[DevLOVE Advent Calendar 2022](https://adventar.org/calendars/7767) 15日目です。

## この記事で言いたいこと

２０２２年過ごしていて、「ペアプロ、ペアワークって自分の思う在り方以上のものを引き出せる働き方だ！」というのを思うところがありました。

### 話すこと

- ペアで働くことで、個人の可能性はより引き出せるということ

### 話さないこと

- ペア、モブの違い
- ペアワークのやり方
- ペアワークによるプロジェクト、プロダクトへの貢献

## ペアプロ、ペアワークに関連して気になったインプット

### 「分人」という考え方

[あじゃてく読書会 #6 『私とは何か―「個人」から「分人」へ』](https://agiletechexpo.connpass.com/event/236361/) で紹介いただいた、  
[「私とは何か――「個人」から「分人」へ」](https://bookclub.kodansha.co.jp/product?item=0000210658) という本での気づきです。

簡単にこの本の内容を掻い摘んで書くと、以下のようなお話です。
- 「個人」と言っている中には、複数の「分人」が存在する。
- 「分人」は周囲との関係性の中で現れる。
    - 例えば、小学校の友だちと話してる時の自分と、仕事してる時の自分の性格は少し異なるのでは？
    - 小学校の友だち、仕事の同僚と3人で話すとき、戸惑う。それはどっちの分人が登場するか、迷っている状態。
- 「分人」は、自分で引き出したり選んだりするものではなく、関係の中から自然と現れる。
- 「分人」も、すべて自分として受け入れよう。

概念を表現してみた絵が、以下です。
伝わるか自信がありませんが、「私」が色々な人との間にある「分人」で構成されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286147/34bc56ff-bacb-d129-1d2e-39e64a02cc52.png)

つまり、ここで言いたいのは「出せる自分は、周りによって変わる」ということです。

### プロミスキャスペアリング

「1.5hごとにペアを入れ替えてみよう！」という考え方です。

https://medium.com/etermax-technology/promiscuous-pairing-and-beginners-mind-817dc152dfff

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286147/8c131a57-657d-2ae9-c147-e00af0a92251.png)

[Arlo Belshee の論文 Promiscuous Pairing and Beginner’s Mind](http://csis.pace.edu/~grossman/dcs/XR4-PromiscuousPairing.pdf)  をもとに、
「ベテランであっても、初心者の心を持つ状態がパフォーマンスが高い」とし、
そのためには 1.5時間ごとのペア交替が良いのではという提案です。

「初心者の心」とは、 先入観を持たず、オープンで熱心な状態を示します。

以下の鈴木俊隆さんの言葉が、考えの元として引用されています。

> 心が空っぽなら、何が起こっても大丈夫。
> 何でも受け入れられるから。
> 初心者の心には可能性が溢れているが、熟練者の心にはそれが少ない。

頻繁なペア交替により、「初心者の心」でワークに取り組める機会を増やす取り組みです。

## ペアプロ、ペアワークから得られること

以上を踏まえて、個人として得られることを 3点 挙げます。
- 個人で引き出せない自分で考えられる
- バイアスからより解放された自分で考えられる
- より楽しい！

### 個人で引き出せない自分で考えられる

分人は、個人のコントロールでなく、相手との関係によって出てくるというのは前述のとおりです。
個人ワークにも、個人の分人は登場します。しかし、別の人と会話する時の分人は現れません。

他の人との会話によって、自分の色々な分人からアイデアを出して考えましょう！

一方で、ペアを組む相手の分人を引き出す努力をしましょう。
特別なことではなく、たくさん話すことが大事なのだと思います。
「自分と一緒だから言ってくれること」が出てくるよう、
だんまりでもなく、形式的な話だけでもなく、
お互いの個性を感じられるよう発言し合うのがポイントです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286147/85be70ca-35a5-1b48-62a3-2bff4c7201c1.png)


### バイアスからより解放された自分で考えられる

自分で突き詰めてもうまくやりくりできる人もいますが、
人と一緒にやるからこそ緩急つけて考えることができます。

「プロミスキャスペアリング」が有効な時もありますし、
お互いに休憩を挟みながらやるだけでも効果あることも多いと思います。
(個人でやると、つい休憩を忘れたり、休憩を挟んでも考え続けて、先入観を外せないこともあり)

### より楽しい！

一人でたどり着けない考えが自分から出てくる。
煮詰まってもリフレッシュする仲間がいる。

これを「楽しい」と思うかは個人差はあると思いますが、楽しめる人も多いと思います。

## 最後に

個人に与える効果としてのペアプロ、ペアワークの話を書いてみました。
プロダクトに与える好影響の話で語られることが多い印象はありますが、
ワークする個人の観点でも改めて考える機会になればと思います。
Neovim入門メモ for Mac

## 概要
MacでNeoVimを動かすための手順メモです。

## Neovimをインストールする

Homebrewを使用
`brew install neovim`

## プラグインマネージャを入れる

`vim-plug`をインストールします。
プラグインマネージャでneovimの便利プラグインをインストールしたり管理することが簡単にできるので、入れておくと便利です。

https://github.com/junegunn/vim-plug


以下コマンドでインストール可能

`sh -c 'curl -fLo "${XDG_DATA_HOME:-$HOME/.local/share}"/nvim/site/autoload/plug.vim --create-dirs \
       https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim'`

## 設定ファイルの作成

vim-plugをインストールしている場合、以下のような形でプラグインを設定できる。

```vim
call plug#begin('~/.config/nvim/plugged')
Plug 'プラグイン名'
call plug#end()
```

プラグイン等の設定を`~/.config/nvim/init.vim`に記述する


```~/.config/nvim/init.vim
"行番号
set number
"インデントの設定
set softtabstop=4

call plug#begin('~/.config/nvim/plugged')
Plug 'vim-airline/vim-airline'
Plug 'vim-airline/vim-airline-themes'

call plug#end()
```

`set xxxx`のような設定はvimrcと同じ

https://qiita.com/iwaseasahi/items/0b2da68269397906c14c

https://qiita.com/KowerKoint/items/387074cf7022e2e0c8fe

## 好きなプラグインを入れる

色々プラグインがあるので、探して気に入ったものを入れてみよう

**Vim Airline**
ステータスバーをモダンなデザインにする

https://github.com/vim-airline

**Nerd Tree**
VSCodeみたいにファイルツリーを左側に表示させることができる

https://github.com/preservim/nerdtree



## 入れるプラグインに迷ったら参考にしたい記事



https://note.com/histone/n/na8ebb8a5909f

https://zenn.dev/yano/articles/vim_plugin_top_10
Azure Database for PostgreSQL(フレキシブルサーバー)を構築してみた。

# はじめに
Azure Database for PostgreSQL(フレキシブルサーバー)を構築する機会がありましたので、備忘録として構築手順をご紹介します。
(MSの公式ページに構築手順が載っていますが、一部割愛？されていて困ったので、同志の参考になれば幸いです。)

# フレキシブルサーバーの利点について
・フレキシブルサーバーは**ゾーン冗長(高可用性)構成**を組むことができるのが大きな利点。
・サーバーを**オンデマンドで停止/開始**することが可能。(サーバー停止によってコンピューティング課金が抑えられるのも利点)
・計画メンテナンスを**ユーザー側で任意の日時を指定**することが可能。

# 準備
PostgreSQLサーバーを構築するにあたって、プライベートDNSゾーンを事前に作成する必要があります。(※パブリックアクセスを使用する場合は不要です)

# 注意事項
・ デプロイタイプは「フレキシブルサーバー」です。
・ ネットワークアクセスは「プライベート アクセス(VNET 統合)」です。
・ データ暗号化キーは「サービスマネージドキー」を使用します。
※カスタマーマネージドキーを使用する場合、キーコンテナーの作成/紐づけが別途必要です。

# 構築手順
Azure portal上で「PostgreSQL」と検索し、「Azure Database for PostgreSQL」を押下する。
![検索.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3065056/7c506f71-28c5-1f8d-4258-d712bd9b19c5.png)

「+作成」ボタンを押下し、デプロイオプション「Azure Database for PostgreSQL」でリソースの種類「フレキシブルサーバー（推奨）」を選択し、「作成」を押下する。
![デプロイオプション.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3065056/b4ab12c5-09fd-d319-3019-026004182b85.png)

## 基本
以下の表を参考に各項目設定する。
| 項目 | 入力値 |
| :-- | :-- |
| サブスクリプション | 利用するサブスクリプション名 |
| リソースグループ | 利用したいサブスクリプション内の既存のリソースグループか新規でリソースグループを作成 |
| サーバー名 | 任意 |
| リージョン | ユーザーに近いリージョンが推奨 |
| PostgreSQLバージョン | 特定の要件がなければ最新バージョン |
| ワークロードの種類 | コンピューティング、ストレージの性能に対応するので要件に合わせて |
| 可用性ゾーン | 特定の要件がなければ既定値(優先設定なし) |
| 高可用性を有効にする | ゾーン冗長構成が必要であれば有効にする(ワークロードの種類によっては有効に出来ないので、注意) |
| 認証方法 | PostgreSQL の認証のみ |
| 管理者ユーザー名 | 任意 |
| パスワード | 任意 |
| パスワードの確認 | 任意 |

・「ワークロードの種類」については学習のためにPostgreSQLを構築する場合、一番安い「開発」を選択することをおすすめします。**但し、高可用性を有効にしたい場合は汎用以上のワークロードでないといけない点に注意です。**
・「認証方法」を「PostgreSQL と Azure Active Directory の認証」にするとユーザー認証が一元化出来て便利なので、他のリソースでもAzure Active Directory の認証を使用している環境であれば、利用すると管理が楽になります。

## ネットワーク
以下の表を参考に各項目設定する。

| 項目 | 入力値 |
| :-- | :-- |
| 接続方法 | プライベート アクセス (VNET 統合) |
| サブスクリプション | 基本で設定したものと同じ |
| 仮想ネットワーク | PostgreSQLを配置するVNET |
| サブネット | PostgreSQLを配置するsubnet |
| サブスクリプション | 基本で設定したものと同じ |
| プライベートDNSゾーン | 事前に作成したプライベートDNSゾーン |

## セキュリティ 
以下の表を参考に各項目設定する。
| 項目 | 入力値 |
| :-- | :-- |
| データ暗号化キー | サービスマネージドキー |

## タグ
リソースの識別をしやすくなるように、自身の環境に合わせてタグをつけましょう。

## 確認および作成
・最後に各設定値を確認します。
※この時点で入力値にエラーがあると「検証に失敗しました」と表示されます。
対象のタブにエラーアイコンが出来るので、確認しましょう。
以下のサンプル画像の場合、基本のところでエラーが出ていますね。
基本のところに戻って入力ミスを探しましょう！
![検証に失敗.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3065056/6de96a38-54ee-d3b9-67ae-2a3857cc37dc.png)

・確認完了したら「作成」ボタンを押下する。

・デプロイが終わってこのような表示がされれば、OKです。
![デプロイ完了.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3065056/0d49387e-6ee0-f1c8-dcaa-ee25bd6dcac9.png)

Azure Database for PostgreSQLの構築としては以上です！
構築後にサーバーパラメーター設定を考える必要がありますが、今回は割愛します…
jest react typescript descriptionの使い方

# 概要
descpitionを使います。
テストを一つにまとめることができます。
パラメーターテストに使えそう。

# 開発環境
IDE:GitHub CodeSpaces
OS:windows10
言語：TypeScript

├── @testing-library/jest-dom@5.16.5
├── @testing-library/react@13.4.0
├── @testing-library/user-event@13.5.0
├── @types/jest@29.2.3
├── @types/node@16.18.4
├── @types/react-dom@18.0.9
├── @types/react@18.0.25
├── jest@29.3.1
├── react-dom@18.2.0
├── react-scripts@5.0.1
├── react@18.2.0
├── UNMET DEPENDENCY test@jest
├── ts-jest@29.0.3
├── typescript@4.9.3
└── web-vitals@2.1.4


# 実装
大文字の間にスペースを入れる機能を実装します。
## プロダクトコード
``` App.tsx
import { replaceCamelWithSpaces} from './App'

export function replaceCamelWithSpaces(colorName: string){
	return colorName.replace(/\B([A-Z])\B/g," $1");
}

```


## テストコード
``` App.test.tsx
describe('spaces before camel-case capital letters',()=> {
	test('Works for no inner capital letters',() => {
		expect(replaceCamelWithSpaces('Red')).toBe('Red');
	});
	test('Works for one inner capital letter',() => {
		expect(replaceCamelWithSpaces('MidnightBlue')).toBe('Midnight Blue');
	});
	test('Works for multiple inner  capital letter',() => {
		expect(replaceCamelWithSpaces('MediumVioletRed')).toBe('Medium Violet Red');
	});
});

```

## 動画
文字間のスペースを消すとFailになることを確認できます。

![description.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/4d963854-2307-9314-363d-faaed62ac557.gif)


# 参考
Section2 25

https://www.udemy.com/course/react-testing-library/learn/lecture/24450676#content
【Laravel】ユーザーが選択した値を保持するoptionタグ生成（編集画面）

## ユーザーが選択した値を保持するoptionタグの生成
今回は都道府県をユーザーが登録し、
編集画面では登録画面で選択してDBに登録した値を保持した状態で編集画面を出したい。

事前に`config`配下にファイルを作っておいたので
これを使ってプルダウンを作っていきます。

```config/pulldown.php
<?php

return [
    'area' => [
        '選択してください' => '選択してください',
        '1' => '北海道',
        '2' => '青森県',
        '3' => '岩手県',
        '4' => '宮城県',
        '5' => '秋田県',
        '6' => '山形県',
        '7' => '福島県',
        '8' => '茨城県',
        '9' => '栃木県',
        '10' => '群馬県',
        '11' => '埼玉県',
        '12' => '千葉県',
        '13' => '東京都',
        '14' => '神奈川県',
        '15' => '新潟県',
        '16' => '富山県',
        '17' => '石川県',
        '18' => '福井県',
        '19' => '山梨県',
        '20' => '長野県',
        '21' => '岐阜県',
        '22' => '静岡県',
        '23' => '愛知県',
        '24' => '三重県',
        '25' => '滋賀県',
        '26' => '京都府',
        '27' => '大阪府',
        '28' => '兵庫県',
        '29' => '奈良県',
        '30' => '和歌山県',
        '31' => '鳥取県',
        '32' => '島根県',
        '33' => '岡山県',
        '34' => '広島県',
        '35' => '山口県',
        '36' => '徳島県',
        '37' => '香川県',
        '38' => '愛媛県',
        '39' => '高知県',
        '40' => '福岡県',
        '41' => '佐賀県',
        '42' => '長崎県',
        '43' => '熊本県',
        '44' => '大分県',
        '45' => '宮崎県',
        '46' => '鹿児島県',
        '47' => '沖縄県'
    ]
];
```

### 値を保持しないプルダウン

この書き方だと編集画面に移ったときに値が保持されず、
プルダウンの一番上にある`選択してください`が選択されてしまう。
```
<select class="form-control" id="area" name="area">
    @foreach(config('pulldown.area') as $key => $name)
        <option value="{{ $name }}">{{ $name }}</option>                
    @endforeach
</select>
```

### 値を保持するプルダウン
前提として、コントローラのupdeteメソッドの中に、
`$user->area = $request->area;` を記載している。
```
<select class="form-control" id="area" name="area">
    @foreach(config('pulldown.area') as $key => $name)
        <option value="{{ $name }}" @if(old('area', $user->area ?? '') == $name) selected @endif>{{ $name }}</option>
    @endforeach
</select>
```

これで編集画面において
プルダウンの値が保持された状態を作ることができる。

## 追記
laravel9より下記のような書き方も実装できるようになったそうです。
```
<select class="form-control" id="area" name="area">
    @foreach(config('pulldown.area') as $key => $name)
        <option value="{{ $name }}" @selected(old('area', $user->area) == $name)>{{ $name }}</option>
    @endforeach
</select>
```
Dockerを使ってFactorioのサーバを立てる

# Dockerのインストール


```
$ curl -fsSL https://get.docker.com | sudo sh
```

## 権限の付与

```
$ sudo usermod -aG docker $(whoami)
```

## 起動

```
$ docker run -d  -p 34197:34197/udp  -p 27015:27015/tcp   -v ~/factorio:/factorio   --name factorio   --restart=always  -it factoriotools/factorio
```

## ログの確認

```
$ docker logs factorio
```


## 再起動

バージョンアップなどの際には再起動を行います。

```
$ docker stop factorio ; docker rm factorio ; \
  sudo docker run -d  -p 34197:34197/udp  -p 27015:27015/tcp   -v ~/factorio:/factorio   --name factorio   --restart=always  -it factoriotools/factorio
```

## コンソールに入る
```
$ docker exec -it factorio /bin/bash
```
Androidのプロジェクトで横断的にビルド速度を集計できるようにした話

# 目的
- アプリ開発において必ず発生するビルドという過程。
このビルドの状況を可視化することで、開発の現状を認識する

# やったこと
- Droidkaigi2022 @komatatsuさんのセッション「[はじめようビルドメトリクス](https://www.docswell.com/s/komatatsu/ZJD91Z-getting_started_build_metrics)」を参考にgradleからビルド時間をGASで計測する仕組みを導入しています。
## 追加点
### 集計用パラメータの追加
- 追加でビルドしたプロダクトの情報を追加

### シートの挿入処理
- 計測処理を他のプロダクトでも気軽に導入してもらえるよう、導入ハードルを極力下げる目的でGASのendpointは同じものを流用しています。
プロダクト名ごとにシートがなければ挿入、あればそのまま記録することで、他プロダクトで導入する際は`build.gradle`への記述追加のみで対応が可能です。

```javascript
function getSheet(name){
  //同じ名前のシートがなければ作成
  var sheet = SpreadsheetApp.getActive().getSheetByName(name)
  if(sheet) {
    Logger.log("exist sheet:" + name)
    return sheet
  }

  sheet = SpreadsheetApp.getActiveSpreadsheet().insertSheet();
  sheet.setName(name);
  return sheet;
}
```

# 集計
- SpreadSheetにデータが保存できるようになったらあとは任意の形で加工していきます
- 具体的な値については省略してます

## プロダクト内での集計
- プロダクト内でのビルド回数及び平均時間を示したのが以下です。
![スクリーンショット 2022-12-15 17.48.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324924/341cdb8a-91d0-8a66-e4cf-e86180422ec8.png)
- メンバーそれぞれのビルドに加え、処理の早くないCirclrCiでのビルドも含まれるため、
  - メンバーのビルドはないけどGithubでマージを行ったためCIが走った（11/13

などのケースではビルド時間平均が非常に長くなっています。


## CircleCiの改善計測
- 実行者をCircleCiに絞って集計を行うことでCIの改善をグラフで可視化することができます。
![スクリーンショット 2022-12-15 17.35.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324924/1f00ef43-39bf-295b-7e49-ef65789c65ec.png)
添付のグラフにおいては
  - 11/13週から改善を行ったことからビルド時間が減少
  - 11/27週にすべての環境に適用されたためビルド時間が落ち着いた  
ということがわかります

## スペックでのビルド時間の違い
- フルビルドの回数にも依存しますが、平均ビルド時間を個人で集計し、私を1としてビルド時間比を計算してみました。
私の環境だとわかりやすくビルド時間がかかっています。
それに対して、新しいPCを支給されたCさんでは半分以下となっています
~~そろそろ新しいPCをお願いしたい~~

||ビルド時間比|
|---|---|
|私|1.000|
|Aさん|0.697|
|Bさん|0.679|
|Cさん|0.401|

# まとめ
- `Androidのプロジェクトで横断的にビルド速度を集計できるようにした話`というタイトルになっていますが、横断的な分析を行うためにはまだデータが溜まっていません。
具体的な実施は継続中
- GASのendpointに対してリクエストを行うことでビルド履歴を保存する処理自体はandroid以外でも応用が可能なので、他プラットフォームでも活かせそう
- 定期的に振り返ることで問題の検知につなげていきたい
大学生が0から始めたC言語 vol1.

##   大学生が0から始めたC言語
こんにちは。すっかり冬でマフラー解禁の季節になりました。卒論まで残すところあと２か月弱という過酷な状況に追い込まれている日々です泣
そんな限界大学生がC言語についてまとめたものを共有致します。だれかの助けになれば幸いです。

##    書き方ルール
・トークン：プログラムを構成する最小単位、ようするに単語
・フリーフォーマット（自由書式）：トークン同士をつなげて書いてはいけない
・文終わりに「;」をつける
・C言語では、/* */ で挟むことで、その間をコメントにできます。
## printf関数
文字列を表示させるための関数
```c
printf("文字列");
```

疑似命令
疑似命令とは、プログラムコードではない命令のこと。
#includeはprintf関数などの準備をする命令で、
この命令は機械語に翻訳されず、その前に処理される。

##    エスケープシーケンス
画面に文字を描画する際に改行をさせるためのもの
```c
"aaa\niii\n"
```
文字列の間にいれることで改行できる

##    数値
printf関数はあくまで文字列を表示する関数。数値を表示するには**出力変換指定子**をつかう。%d指定子を使う。
dはdecimal(十進法)という意味かも
```c
int main(void)
{
    printf("%d+%d=%d¥n", 1, 2, 3);
    return 0;
}
```
%dにそれぞれ順番に代入する
```c
#include <stdio.h>

int main(void)
{
    printf("%d\n", (1 + 2) * 3 / 2);
    return 0;
}
```
実行結果：4.5
このように勝手に演算子で表記すれば計算してくれる
また桁数を指定することも可能である。
```
%桁数d
```
`%5d`: 5桁として代入
このようにすることができる

##    いろんな数値
整数
10進数：先頭に０がつかない数
８進数：先頭に０がつく数
１６進数：先頭に0xがつく数
実数で計算したいとき
%f指定子を使う
fはfloat(浮動小数点)という意味かも
```
int main(void)
{

    printf("%f\n", 10.0 / 3.0);
    return 0;
}
```
実行結果
3.333333
Simulinkの固定小数点演算って速くね？

# 1. はじめに

こちらの記事[「FPGAオンボードメモリのデバッグ　～テストパターン生成/表示画面のキャプチャ～」](https://qiita.com/SacredTubes/items/96f0b41f900c6d556224)を書くために、MATLABで固定小数点データを行なったら、すごく遅かったので、そのソリューションをこちらの記事[「MATLABの固定小数点演算って時間かかりすぎじゃね？」](https://qiita.com/SacredTubes/items/10d9f2aa714d2970db9b)に書きました。

ただ、ソリューションであるfiaccelは、関数化とコンパイルしてから実行する必要があり、ひと手間かかって面倒でした。

コードを書いたらすぐに実行できる方法を模索したところ、Simulinkモデルで処理することで高速に実行できることがわかりましたので、やり方を説明したいと思います。

# 2. 固定小数点演算の内容

元のMATALBコードは、 [1024x768] 画素の画像データを、FPGAボードのDDRメモリに書き込む 4byte のデータに変換する内容です。

固定小数点演算は、8bitデータを連結して32bitにするだけの至って簡単な処理ですが、このコードを実行するのにMATLABだとなんと70分もかかってしまいます。

以下のコードで時間がかかっているのは、殆どがforループ内の固定小数点演算の部分です。


```matlab:画像データをメモリ書き込みデータに変換
imageSize = [768, 1024];  % v, h
nt8 = numerictype(0, 8, 0);
nt32 = numerictype(0, 32, 0);

inputImageP = imresize(imread('peppers.png'), imageSize);
figure, imshow(inputImageP), shg

% RGB => BGR
inputImagePP = inputImageP(:,:,[3 2 1]);
serialImageP = reshape(permute(inputImagePP, [3, 2, 1]), [prod(imageSize)*3, 1, 1]);
writeDataP = fi(zeros(1, prod(imageSize)*3/4), nt32);
for n = 0:length(serialImageP)/4-1
    writeDataP(n+1) = fi(bitconcat(...
          fi(serialImageP(n*4+4), nt8),...
          fi(serialImageP(n*4+3), nt8),...
          fi(serialImageP(n*4+2), nt8), ...
          fi(serialImageP(n*4+1), nt8)), nt32);
end
```

# 3. MATLABコードをSimulinkにコピペ

MATLABコードをSimulink上で実行するにはMATLAB Functionブロックを使用します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/477651/3b9ee949-714b-af95-c9cd-7c5e96987a41.png)


このブロックを開くとMATLABエディターが開くので、そこに上述のコードをコピペします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/477651/6a928ba1-6c54-c7fd-89e7-a97e4ba335f9.png)

Simulinkモデルの最上位階層は、MATLAB FunctionブロックをTo Workspaceブロックに接続しただけのシンプルな構成です。このTo Workspaceブロックは、SimulinkのシミュレーションデータをMATLABのワークスペースにエクスポートするためのブロックです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/477651/bf51d4e2-6aca-44f1-626f-2190b3e2bcb9.png)

処理をするのは1フレームのみなので、シミュレーション終了時間は [0] に設定しています。（Simulinkは時間 0 で最初の処理が実行され、以下シミュレーションステップごとの時間で処理が実行されます。）


# 4. Simulinkモデルの実行時間

以下のコマンドでSimulinkモデルを実行して時間測定しました。
` >> tic, sim(gcs), toc`
` 経過時間は 1.174739 秒です。`

MATLABで70分かかった処理が、Simulinkではfiaccelよりは遅いものの、十分に実用的な時間で処理が完了しています。

上記のSimulinkモデルで実行している内容が、以下の理由から少し大きめになっています。
* fiaccelコマンドで変換したコードよりも処理が多い
* fiaccelは予めコンパイルしてから、実行時間のみ測定しているが、Simulinkモデルはコンパイル時間も含まれる

しかし、fiaccel：0.046277秒と、Simulink 1.174739秒というのは、人間が認識する時間として実用上大差ないため、使い勝手の良いほうを使えば良いと思います。

# 5. 結論

***MATLABで時間のかかる固定小数点演算は、Simulink上でMATLAB Functionブロックを使うと、プリコンパイル実行されるため高速化できる。***

終わり
【論文要約】K-BERT: Enabling Language Representation with Knowledge Graph

## 概要
BERTのような事前に学習された言語表現モデルは、大規模なコーパスから一般的な言語表現を取得するが、ドメイン固有の知識はない。専門家はテキストを読む際に、関連する知識を用いて推論を行う。この機能を実現するために、我々は知識グラフ（KG）を用いた知識対応型言語表現モデル（K-BERT）を提案し、文の中にドメイン知識としてトリプルを注入する。しかし、知識を入れすぎると文の意味がずれてしまうことがあり、これを知識ノイズ（KN）問題と呼ぶ。KNを克服するために、K-BERTは、知識の影響を制限するために、softpositionと可視行列を導入している。K-BERTは、事前学習済みのBERTからモデルパラメータを読み込むことができるため、自ら事前学習せずにKGを搭載することで、容易にモデルへのドメイン知識の注入が可能である。我々の調査では、12の自然言語処理タスクにおいて有望な結果が得られている。特にドメイン固有タスク（金融、法律、医学など）において、K-BERTはBERTを大幅に上回り、専門家を必要とする知識駆動型問題の解決にK-BERTが優れていることが実証された。

## アーキテクチャ
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614092/aa02e2fd-73b8-7249-6ce2-11f45e3d93a2.png width=500>

### Knowledge layer
知識グラフをもとにセンテンス木に変換する。Figure 1の例では、Tim CookとBeijingについての知識が知識グラフから得られる。
### Embedding layer
**Soft-position embedding**
センテンス木はFigure 2のようにトークンの後ろに情報をくっつける形でトークン化する。しかし、このままでは文がおかしくなってしまう（これをKnowledge Noiseと呼ぶ）。そこで、position embeddingに工夫をして、センテンス木が分岐した地点でposition embeddingの番号も分岐するように設定する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614092/6276a7cf-a1e9-da0f-fcfa-bc7103b0b6cc.png)
**Seeing layer**
Figure 2の左下の図において、ChinaとAppleはまったく関係がない。そこで、Self-attentionを行う際に右下のように関係のないトークンは見えないようにマスクをかけて学習を行うようにする。

### Mask-Transformer Encoder
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614092/13a04655-45fc-9ada-4fa5-fba0248a5923.png width=500>

Figure 4のように分岐した部分から[CLS]に直接的に情報が伝わらないようにする。元の文に影響を与えないようにすることがモチベーション。

## 実験
**Pre-training corpora**
・WikiZh
・WebtextZh
**Knowledge graph**
・CN-DBpedia
・HowNet
・MedicalKG
**Baselines**
・BERT [Devlin et al., 2018]
・Our BERT：筆者が再度学習したもの

### Open-domain tasks
提案法とBERTを8つの中国語のopen-domain NLP tasksで実験した。

シングルセンテンスの分類問題
・Book_review：positive,negativeのレビュー
・Chnsenticorp：positive,negativeのホテルレビュー
・Shopping：positive,negativeのオンラインショッピングレビュー
・Weibo：positive,negativeのWeiboレビュー

2センテンス分類
・XNLI
・LCQMC

Q&A マッチングタスク
・NLPCC-DBQA

固有表現抽出
・MSRA-NER

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614092/7724b9e4-6776-1877-0056-2c254dde7103.png)

### Specific-domain tasks
特定のドメイン知識が必要な時に提案法は有効だと考えられる。次のような法律や金融などの特定ドメインのタスクで精度を調べる。
・Finance Q&A (質問応答選択)
・Law Q&A (質問応答選択)
・Finance NER
・Medicine NER

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614092/9da1bb33-91a2-9a2d-f27f-e6f576e92d36.png)
WindowsでNode.js環境の構築

windowsでnodejs環境を構築したときの備忘録

# chocolateyのインストール
chocolateyはwindowsのパッケージマネージャ、これを入れると色々便利。
`windows + R`でpowershellを指定して`ctr + shift + Enter`で管理者として実行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181686/dfd28495-bdf1-1b77-c751-9d31ea5b726b.png)

以下のコマンドを実行するとchocolateyがインストールされる
```bash
Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))
```

インストール確認
```bash
choco list -l
```
chocoコマンドで入れた一覧が見れる。Chocolateyが入っていればOK。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181686/75560a95-7200-3041-7795-1cda9ec831a6.png)

# nvmのインストール
nvmはnodejsのパッケージ管理マネージャ。nodejsのバージョンを簡単に切り替えられるようになる。
以下のコマンドでインストール可能。管理者権限で実行したpowershellでコマンドを叩くことに注意。
```bash
choco install nvm
```

```bash
nvm install {入れたいnodejsのversion}
```

```bash
nvm use {入れたversion}
```

# nvm useで exit status 5 or 145
それぞれの解決法
### exit status 5

Terminal(powershell等)を管理者権限で実行

### exit status 145

下記いずれかのフォルダが存在していればそれを削除

- C:\Program Files\nodejs
- C:\Program Files (x86)\nodejs

https://stackoverflow.com/questions/69949375/nvm-use-16-13-0-will-return-this-error-exit-status-145-the-directory-is-not

# yarnをインストール
yarnのインストールにはnpmが必要。
それぞれの説明は以下の記事が分かりやすい

https://qiita.com/Hai-dozo/items/90b852ac29b79a7ea02b

## npm（上記記事から抜粋）
- Node.jsをインストールすれば一緒にインストールされる。
- 2009年にNode.jsがリリースされた翌年にnpmがリリースされた。
## yarn（上記記事から抜粋）
- 2016年にリリース。npmと互換性があり、npmで使用していたプロジェクト設定ファイル（package.json）がそのまま使える。
- npmと比べてインストールが速い、セキュリティが高いという特徴がある。セキュリティが高いというのは、インストール時にパッケージが不正に変更されていないかなどをチェックサムを用いて検証することができ、安全なパッケージのインストールが可能であるということ。
- バージョン管理についても優れていて、yarnではプログラムのインストール後に、yarn.lockというファイルが作成され、それにはインストールしたプログラムが使用している別のプログラム（依存プログラム/パッケージ）のバージョンが明確に書き込まれている。
  - 依存プログラム/パッケージをその後再度インストールしてもバージョンの整合性が保たれるので、バージョン不一致でプロジェクトが動かなくなる危険性が無くなる。
- npm、homebrew、MacPortsからインストールできる。

## yarnのインストール
yarnのversionをnpmで管理するかchocolateyで管理するかの違いしかないので私はchocoからインストールしました
```bash
choco install yarn
```
npmから入れる場合は以下（chocoで入れてる場合は不要）
```bash
npm install -g yarn
```

# （おまけ）Nodejsのプロジェクトをyarnで作成

### プロジェクト作成
```bash
mkdir {プロジェクト名}
cd {プロジェクト名}
yarn init
```
これでpackage.json が作成される

### パッケージ追加
```bash
yarn add {入れたいpackage}
yarn add {入れたいpackage}@{version}
yarn add {入れたいpackage}@{tag}
```
Bubbleについての初歩的な知識

# ジャンル
ノーコード・ウエブ・アプリ制作

# プラットホーム
1. ウエブ

# 価格

1. Free
    - コアプラットフォーム機能
    - テスト開発のみ、アプリのリリースはできない
    - サーバー容量 1ユニット
    - ストレージ容量 0.5GB
    - Bubbleブランディング
    - コミュニティサポート
1. Personal ($25/月)
    - コアプラットフォーム + API連携
    - カスタムドメイン
    - サーバー容量 1ユニット
    - ストレージ容量 10GB
    - ワークフローのスケジュール設定　1ヶ月毎
    - CSVのインポート/エクスポート
    - バックアップ7日間
1. Professional ($115/月)
    - コアプラットフォーム + API連携
    - サーバー容量 3ユニット 拡張7ユニットまで
    - ストレージ容量 20GB
    - ワークフローのスケジュール設定　1日毎
    - バージョン管理　2バージョンまで
    - CSVのインポート/エクスポート
    - バックアップ30日間
1. Production ($475/月)
    - コアプラットフォーム + API連携
    - サーバー容量 10ユニット　拡張30ユニットまで
    - サーバー容量 50GB
    - ワークフローのスケジュール設定　1日毎
    - バージョン管理　2バージョンまで
    - CSVのインポート/エクスポート
    - バックアップ1年間
1. Custom (問い合わせ)
1. [Agency](https://bubble.io/agency) ($71/月)

　無料プランだと、お試しレベルです。

# 概要
　Bubbleは、2012年ニューヨークで、Emmanuel Straschnov と Josh Haas によって設立されました。2021年には、Fast 　Companyの最も革新的な企業の1つに選ばれ、2017年から2021年にかけて50％を超える成長をしています。

　Bubbleで使用されているビジュアル開発プラットフォームは、WixやSquarespaceなどのテンプレート志向のウェブサイトビルダーよりも高度な機能を持つアプリケーションを作成できます。Bubbleで、Twitterのようなソーシャルメディアサイトや、AirbnbやUberなどのマーケットプレイス、Instacartなどのウェブアプリケーションを、チュートリアルを使いながら構築することができます。また、Bubbleは独自のAPI、テンプレート、プラグインを提供しており、ユーザーは新しいサードパーティのテンプレート、プラグイン、サービスを作成し、販売しています。

# 機能
　Bubbleは高機能で、使いこなすにはかなりのボリュームを学習しなければなりません。ドキュメントは日本語訳されていません。
<img width="800" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864075/abab2bdc-58f7-5b71-94fe-a81b40c4632d.png"/>
　メニューなども全て日本語は使用できませんが、ページの言語として日本語を選択することも、日本語フォントの選択もできるので、日本語ページを作成するのは問題ないようです。
<img width="800" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864075/781e560b-8a3f-7903-c3a7-3e7e42532770.png"/>
<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864075/4a13c44a-7fd0-410e-d230-e10f0cb6254d.png"/>

 テンプレートを利用して作成することもできますが、比較的高機能なので、いきなりテンプレートを使って作成するのは難しいでしょう。
<img width="800" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864075/58410afc-6b3a-c277-e256-06d28338ed87.png"/>