OmniAICreator/Qiita-1.07M huggingface dataset:
CUDAカーネル内での行列演算

CUDAカーネル内で行列やベクトルの演算が必要になった際、コードが複雑になりそうだったため、
以下の部品を作ってみた。動的配列を使いたかったが、メモリ確保に数十ミリ秒を要したため、
静的配列を用いた。このとき、サイズ変更に柔軟に対応するために、サイズをテンプレート引数
として与えるようにした。

いまのところ、メンバ関数は、転置と、掛け算と、3x3の逆行列で、いずれもCUDAカーネル内から
呼ぶことができる。

```C++
template<typename T, unsigned int w, unsigned int h> struct K_mat {
	T val[h][w];
	__device__ void transpose(const K_mat<T, h, w>& in) {
		for (unsigned int i = 0; i < h; i++) {
			for (unsigned int j = 0; j < w; j++) {
				val[i][j] = in.val[j][i];
			}
		}
	}
	template<unsigned int d> __device__ void mul(const K_mat<T, d, h>& in0, const K_mat<T, w, d>& in1) {
		for (unsigned int i = 0; i < h; i++) {
			for (unsigned int j = 0; j < w; j++) {
				val[i][j] = 0.0;
				for (unsigned int k = 0; k < d; k++) {
					val[i][j] = val[i][j] + in0.val[i][k] * in1.val[k][j];
				}
			}
		}
	}
	__device__ void inverse_3x3(const K_mat<T, h, w>& in) {
		float det = abs(in.val[0][0] * in.val[1][1] * in.val[2][2]
			          + in.val[0][1] * in.val[1][2] * in.val[2][0]
			          + in.val[0][2] * in.val[2][1] * in.val[1][0]
                      - in.val[0][2] * in.val[1][1] * in.val[2][0]
			          - in.val[0][0] * in.val[2][1] * in.val[1][2]
			          - in.val[0][1] * in.val[1][0] * in.val[2][2]);
		if (1e-7 < det) {  // machine epsilon of 32bit is 1.192e-7
			for (unsigned int i = 0; i < h; i++) {
				for (unsigned int j = 0; j < w; j++) {
					val[i][j] = in.val[(i + 1) % 3][(j + 1) % 3] * in.val[(i + 2) % 3][(j + 2) % 3]
						      - in.val[(i + 2) % 3][(j + 1) % 3] * in.val[(i + 1) % 3][(j + 2) % 3];
					val[i][j] = __fdividef(val[i][j], det);
				}
			}
		}
		else {
			for (unsigned int i = 0; i < h; i++) {
				for (unsigned int j = 0; j < w; j++) {
					val[i][j] = 0.0;
				}
			}
		}
	}
};
```

なお、上記コードは個人的な勉強のために作成。
（コピペして、機能を適宜追加し、ご自由に使ってください）
[Houdini]UI 文字やアイコンのサイズ変更方法

## 最近困ったこと
ディスプレイの解像度が大きかったため、
文字やアイコンのサイズが小さくて見づらかった。

## 解決法
1. UI設定画面を開く
・ショートカットの場合：「Ctrl」+「+」+「,」 
・画面上の場合：Edit ＞ Preferences ＞ General User Interface
![2022-08-22 (24).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2797498/1bc68877-b52d-3734-628c-c883f820e4e8.png)

2. Global UI Scaleを変更し、Accept押下
![aa.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2797498/85c55415-f18c-9d23-5386-e4a2e5075d6a.png)

3. Houdini再起動
駆け出しプログラマのAtCoder日記　１

# はじめに
はじめまして、SLOTREと申します。
最近、pythonのお勉強をはじめたばかりの駆け出し君です。
作りたいものもあるけれど、まずは基礎力をつけるために・アルゴリズムを理解するためにAtcoderで勉強をはじめてみました。
ぜひ、こうしたら良いよ！ってアドバイスあれば教えていただけるとありがたいです。

# やってみた問題
今日は初歩の初歩からやってみると言うことで、りんごさんが何個買えるかな？って感じの問題をやってみました！

問題文 [A-Apple](https://atcoder.jp/contests/abc265/tasks/abc265_a)
果物屋さんでりんごが売られています。
あなたは次の操作を好きな順で好きなだけ繰り返すことができます。

X 円を払ってりんごを 1 個手に入れる。
Y 円を払ってりんごを 3 個手に入れる。
りんごをちょうど N 個手に入れるには最低何円必要ですか？

# コード
まずは、僕が書いたコードです。
```python3:Apple.py
import numpy as np
#----変数定義----
numbers = input() #初期入力
#そのままだとsplitしてもstr型で分かれてしまうので、np.arrayにしてまとめてintにして分ける
number_array = np.array(numbers.split(" "), dtype = np.int)
one_apple = number_array[0]
three_apple = number_array[1]
want = number_array[2]
#買うのに必要な代金合計
charge = 0 

#---処理部分---

#リンゴを1個買う場合と3個買う場合のコスパを比較、そもそも3個以上買う必要があるか確認
if one_apple > three_apple / 3 and want >= 3:
  #3個未満になるまでループ
  for i in range(want) :
    charge += three_apple
    want -= 3
    if want < 3:
      break

#3個未満買えば良い場合
for i in range(want):
  charge += one_apple
  want -= 1
  if want == 0:
    break

print(charge)
```

# 考え方
競技プログラミングというものらしく、入力が与えられるそうなので、まずは脳死でそれぞれの値を入れる箱を作っていきました。
で、最初は3個以上買いたい場合はそのまま3個未満になるためにループさせてましたが、問題文をよく読むとコスパも考えないといけなかった・・・
そのため、コスパを考えてループ処理をさせるようにしました。
Twitterに対してtweepyを使って、Pythonでツィートする

# はじめに
Twitterに対して、tweepyというpythonのモジュールを使って、ツィートする方法を説明します。
初めてのQitaの投稿になります。
これから少しずつでも投稿して、技術力を伸ばしていけたらと思います。

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

```
pip install tweepy
```
## サンプルコード
```python:tweet.py
import tweepy

def twitter_bot() -> None:
    # XXXXXXXXXXXXXXXXXXには自分のコードを設定してください
    ck = 'XXXXXXXXXXXXXXXXXX'
    cs = 'XXXXXXXXXXXXXXXXXX'
    at = 'XXXXXXXXXXXXXXXXXX'
    ats = 'XXXXXXXXXXXXXXXXXX'

    client = tweepy.Client(consumer_key=ck, consumer_secret=cs,
                           access_token=at, access_token_secret=ats)

    client.create_tweet(text='ツイート文 #test #漫画')


if __name__ == '__main__':
    twitter_bot()
```
## ハッシュタグの設定の仕方
create_tweetの中に、タグとして定義したい内容に対して、# をつける

```
    client.create_tweet(text='ツイート文 #アニメ #漫画')
```
## twitterでツィートした際イメージ
実際の[ツィッター](https://twitter.com/arice_booker) をのせておきます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188891/c922b579-eea2-9f08-1994-57740608a9d5.png)

## 今後やりたいこと
定期バッチを作成して、自動ツイートする仕組みを今度作成してみようと思います
あと、勉強がてら作成しているReactの画面をのせておきます（この内容も後日記事にしてみようと思います
気軽にコメントや、改善点などもらえるとうれしいです:relaxed:
[React × Firebase](https://booklibrary-24d10.web.app/) 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188891/c4bc5854-9fc5-f362-135e-1a9a467ef284.png)
WEBリモコンで操作するラズパイラジオ

# はじめに
●WEBリモコンで操作するラズパイラジオ
TakutoYoshikaiさんの下記の記事を参考にWEBリモコンで操作するラズパイラジオを作成しました。

[2分でPCにWebリモコンを実装できるライブラリ「rcjs」でラズパイ操作してみた](https://qiita.com/TakutoYoshikai/items/1ba2d1f603573b06e7c8)
![スクリーンショット 2022-08-22 210642.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222582/22d788db-8ecf-0369-4502-b530dbcc829a.jpeg)


# WEBリモコンで操作するラズパイラジオプログラム
(index.js)

```JavaScript
const Remocon = require("rcjs");

const remocon = new Remocon();

const execSync = require("child_process").execSync;

remocon.addButton("停止", function() {
  execSync("killall ffplay mpv >> /dev/null 2>&1 &");
});
remocon.addButton("TBSラジオ", function() {
  execSync("killall ffplay mpv >> /dev/null 2>&1 &");
  execSync("/home/pi/radiko.sh -t radiko -s TBS >> /dev/null 2>&1 &");
});
remocon.addButton("文化放送", function() {
  execSync("killall ffplay mpv >> /dev/null 2>&1 &");
  execSync("/home/pi/radiko.sh -t radiko -s QRR >> /dev/null 2>&1 &");
});
remocon.addButton("ニッポン放送", function() {
  execSync("killall ffplay mpv >> /dev/null 2>&1 &");
  execSync("/home/pi/radiko.sh -t radiko -s LFR >> /dev/null 2>&1 &");
});
remocon.addButton("ラジオ日本", function() {
  execSync("killall ffplay mpv >> /dev/null 2>&1 &");
  execSync("/home/pi/radiko.sh -t radiko -s JORF >> /dev/null 2>&1 &");
});
remocon.addButton("BAYFM78", function() {
  execSync("killall ffplay mpv >> /dev/null 2>&1 &");
  execSync("/home/pi/radiko.sh -t radiko -s BAYFM78 >> /dev/null 2>&1 &");
});
remocon.addButton("NACK5", function() {
  execSync("killall ffplay mpv >> /dev/null 2>&1 &");
  execSync("/home/pi/radiko.sh -t radiko -s NACK5 >> /dev/null 2>&1 &");
});
remocon.addButton("TOKYO FM", function() {
  execSync("killall ffplay mpv >> /dev/null 2>&1 &");
  execSync("/home/pi/radiko.sh -t radiko -s FMT >> /dev/null 2>&1 &");
});
remocon.addButton("J-WAVE", function() {
  execSync("killall ffplay mpv >> /dev/null 2>&1 &");
  execSync("/home/pi/radiko.sh -t radiko -s FMJ >> /dev/null 2>&1 &");
});
remocon.addButton("FMヨコハマ", function() {
  execSync("killall ffplay mpv >> /dev/null 2>&1 &");
  execSync("/home/pi/radiko.sh -t radiko -s YFM >> /dev/null 2>&1 &");
});
remocon.addButton("放送大学", function() {
  execSync("killall ffplay mpv >> /dev/null 2>&1 &");
  execSync("/home/pi/radiko.sh -t radiko -s HOUSOU-DAIGAKU >> /dev/null 2>&1 &");
});
remocon.addButton("InterFM897", function() {
  execSync("killall ffplay mpv >> /dev/null 2>&1 &");
  execSync("/home/pi/radiko.sh -t radiko -s INT >> /dev/null 2>&1 &");
});
remocon.addButton("茨城放送", function() {
  execSync("killall ffplay mpv >> /dev/null 2>&1 &");
  execSync("/home/pi/radiko.sh -t radiko -s IBS >> /dev/null 2>&1 &");
});
remocon.addButton("NHK第一", function() {
  execSync("killall ffplay mpv >> /dev/null 2>&1 &");
  execSync("/home/pi/radiko.sh -t radiko -s JOAK >> /dev/null 2>&1 &");
});
remocon.addButton("NHK第二", function() {
  execSync("killall ffplay mpv >> /dev/null 2>&1 &");
  execSync("mpv https://radio-stream.nhk.jp/hls/live/2023501/nhkradiruakr2/master.m3u8  >> /dev/null 2>&1 &");
});
remocon.addButton("NHK FM", function() {

```
すべてのプリフィックスがハーシャッド数

### 【例題】

> **それ自身を含むすべてのプリフィックスがハーシャッド数で数字和が初めて50を超える数を求めよ**

#### ハーシャッド数

[ハーシャッド数(Wikipedia)](https://ja.wikipedia.org/wiki/%E3%83%8F%E3%83%BC%E3%82%B7%E3%83%A3%E3%83%83%E3%83%89%E6%95%B0)とはあまりなじみのない数ですが一言で言うと「数字和で割り切れる」数のことです。

この例題ではそれ自身だけでなくすべてのプリフィックスがハーシャッド数となる数字を探すことが求められています。例として2478は以下のようにすべてのプリフィックスがハーシャッド数になっています。

```math 
2 / 2 = 1 \\
24 / 6 = 4 \\
247 / 13 = 19 \\
2478 / 21 = 118 \\
```

単純に1からチェックしていってもそう簡単には数字和が50にはならないことが分かります。
そこで考え方を逆にして一桁のハーシャッド数（1,2,3,4,...,9）の右に数字を加えて行ってハーシャッド数になればまた継続して次のハーシャッド数を求めるようにしました。　実装はQueueを使って幅優先探索を行っています。

答えは19桁とかなり大きな数になりました。

```python
import queue

DS = 50
q = queue.Queue()
for i in range(1,10):  # (n, ds) initial vaules: single digit numbers
  q.put((i,i))
ans = 0
while not q.empty():
  (n,ds) = q.get()
  for i in range(10):
    n1, ds1 = n*10+i, ds+i  # add one digit
    if n1 % ds1 == 0:       # Harshad number?
      if ds1 >= 50:         # if digit sum > 50, answer found
        q.queue.clear()
        print(n1,ds1)
      else: 
        q.put((n1,ds1))
        #print(n1,ds1)

print(f"Answer = {ans}")
# 2040084800080000847 53
```

この考え方はProject Euler, Problem 387: Harshad Numbersを解くのに役に立ちます。

（開発環境：Google Colab）
GoのswaggerでAPIを登録しているのにAPI一覧が表示されない

# はじめに

GoでSwaggerを利用したのですが、APIを設定しているのに表示されなくなったのでまとめていきます
始めて利用する際に起きそうな現象でしたので参考になればと思います

# 問題

APIを1つ登録していたのですが、そのAPIが突如表示されなくなりました
とくにエラーがでているわけでもない、変なコードを加えたり修正したりした記憶がなく困りました

# 解決方法

コメントしている位置が原因でした

これがAPIが表示されないコードで
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/810513/c706107a-ddc7-7868-36be-47e2c19cf963.png)

これが修正後のコードです
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/810513/3606056b-ae46-91f5-79d2-763a22b2c107.png)

コメントと関数の間に改行をはさんでいたのが原因でした

# おわりに

Swaggerの設定が案外時間がかかって難しかったですが、何とか使えるようになったのでよかったです
MaxScriptで参照オブジェクトのトランスフォームを取得が出来なかった話

3DS Maxの作業中に、オブジェクトの数が多くなりすぎてシーンが重くなる為、オブジェクトを外部参照に置き換えて運用する必要がありました。
その際に、MaxScriptで、ポイントヘルパー(Point)のトランスフォームを取得していた箇所が、外部参照オブジェクト(XRefObject)だと上手く行かず、ハマった為にメモとして残しておきます。


# 使用したオブジェクト

使用したオブジェクトのモディファイアは、以下の画像の通りです。特に特別変なモディファイアが入っている事はありません。
JT_rock1_root_002オブジェクト(外部参照オブジェクト)は、JT_rock1_root_001オブジェクト(ポイントオブジェクト)を外部参照にして配置しているだけで同じものです。

* 【ポイントオブジェクト】JT_rock1_root_001オブジェクト
![Pointオブジェクト.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/153021/c4f3c619-b04d-b0ed-e0ab-7c52060bed97.png)

* 【外部参照オブジェクト】JT_rock1_root_002オブジェクト
![XRefObjectオブジェクト.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/153021/537816ee-f5ec-4806-f3ce-3bd8ef1b85fd.png)



# トランスフォームを取得する

MaxScriptのオブジェクトには、トランスフォームに関する情報を取得する方法として、下の方法があります。

|プロパティ|
|:--|
| ＄.toransform.position/rotation/scale|
| ＄.position/rotation/scale|

＄ は、何らかのオブジェクトです。
＄.toransformは、行列(3x3の浮動小数点数)になっています。


# 問題

直面した問題の原因としては、大きく二つありました。

 - 外部参照オブジェクト(XRefObject)の ＄.position / ＄.rotation / ＄.scale が正しく取れない
 - \\$.rotation と $.transform.rotation がw成分以外**逆になったクォータニオンが返って来ている**

Point型とXRefObject型のトランスフォームをダンプしてみた結果が下の画像です。
赤い枠は、座標成分で、緑の枠は、回転成分です。

![スクリーンショット 2022-08-22 195846.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/153021/8bacb688-a3c1-0cdb-994c-4e44baf32918.png)

まず、Point型の座標成分は、『＄.position』でも『＄.toransform.position』でも、一致している事が読み取れます。
また、回転成分も同じく、『＄.rotation』でも『＄.toransform.rotation』を使用しても、一致しています。

では、外部参照オブジェクトを見ていきます。
XRefObject型の座標成分は、『＄.toransform.position』では、正しい数値を返しているみたいですが、『＄.position』では、(0,0,0)を返しており、正しく座標情報を返していません。
また、回転成分も同じく、『＄.toransform.rotation』と『$.rotation』の結果が一致しておらず、どちらの情報を信じていいのか判断付きません。


# 原因

* 座標成分

＄.toransform.position から読み取れる数値が正しい事が分かった為、こちらをそのまま使用しています。

* 回転成分

< XRefObject >.transform.rotationのxyz成分が反転したクォータニオンを返している事が分かりました。[こちら](https://discourse.techart.online/t/3ds-max-transform-rotation-issues/926)を参考にしました。
その為、< XRefObject >.transform.rotationの符号を反転して使用する事で解決しました。

* 拡大・縮小成分

補足調査で、scaleについても検証しましたが、rotationの用に符号が反転した成分を返す事は無かった為、そのまま使用しています。


### 参考

　* https://discourse.techart.online/t/3ds-max-transform-rotation-issues/926
GOのSwaggerでPostのFormデータを設定できるようにしたい

# はじめに

Goのgin-swaggerを設定する際にswaggerを始めて設定した私がつまづいた箇所があったのでまとめます

# 問題

gin-swaggerを利用してPOSTのAPIを登録しました
そのAPIでは`form-data`として`email`と`password`を受け取ります

いくつかの記事をみると`query`の設定の仕方は以下のようになっていました

```
// @param none query string false "必須ではありません。"
```

しかし、`form-data`を設定する方法がなかなか検索で出てこなかくて困りました

# 解決方法

Goは公式ドキュメントを読むと解決することが多く、今回はまさに[公式ドキュメント](https://github.com/swaggo/swag)に書いてありました

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/810513/ba0ca1b1-5272-59e5-8625-8e06f339fd2c.png)

parameterには`query`か`formData`を設定するとありました

```
// @param email formData string true "メールアドレス"
// @param password formData string true "パスワード"
```

と設定したところフォームデータを利用することができました

# おわりに

Goをやっていると公式ドキュメントで実装をしようという気持ちが強まります
今期は公式ドキュメントを最初に見るエンジニアになりたいと思います
【Swift】配列を文字列の長さ順に並び替える方法

# はじめに
同じことをやる方がいると思うので記事にしておきます。

# 並び替え方法
```swift
var array = ["キリン", "ゾウ", "シマウマ", "アライグマ"]
array.sort { $0.count > $1.count }

print(array)
// ["アライグマ", "シマウマ", "キリン", "ゾウ"]
```

# おわり
`$0`とか`$1`がなんなのか全く分かってません笑
今週の学び　第12回

# 今週の学び


jQueryなど

- prop()

  - HTML 要素に付与されている「id・class・name」などの属性や「checked・selected」などのプロパティを取得できる

- 文字列結合
  - let address = '東京都' + '千代田区';
    console.log(address);
    > > 東京都千代田区
    > > のように、+演算子を使用して複数の文字列を 1 つに連結できる

- 連想配列

  - 連想配列とは自動的に割り当てられる数字をキーとして持つかわりに、自由に任意の文字列を割り振ることができる配列のこと
    キーを任意に指定できることによって、そこに格納されている値が何のことであるかということがより簡単に連想できるようになっている

- Math.floor
  - 対象の値の小数点以下を切り捨てる

- .map()

  - ループ処理に使う

- $("セレクタ , セレクタ")
  - 複数のセレクタを,（カンマ）で区切って記述することで、各セレクタにマッチしたもの全てを選択

- 関数

  - 仮引数 (parameter)：関数を定義する際に指定し、関数呼び出し時に渡された値が入る変数
    実引数 (argument)：関数を呼び出す際に指定し、関数呼び出し時に渡される実際の値

    function example(a) { // 仮引数
    console.log(a);
    }

    example(1); // 実引数

    などと使う

- if 文

  - 事象の分岐が 2 択なら片方の処理だけ書くことで、もう片方は else を書かなくても処理される

- グローバル関数
  - ルーレットやランダムの数字などは初期値 0 でグローバル関数にしておく

- indexOf

  - 指定した値が含まれる場合にはその要素のインデックスを、含まれない場合には -1 を返す

- includes
  - 文字列や配列の中に引数で指定した値が含まれているかをチェックするメソッド
    調べたい対象に対して、含まれているか調べたい値を指定する
    調べたい値が含まれる場合には true を、含まれない場合には false を返す

- if 文は 0 かそうでないかを見てる

  - roulette_number === 11 || 22|| 33|| ← ダメ

  roulette_number === 11 || ←○
  roulette_number === 22 ||
  roulette_number === 33 ||
  roulette_number === 44 ||
  roulette_number === 55 ||
  roulette_number === 66 ||
  roulette_number === 77 ||
  roulette_number === 88 ||
  roulette_number === 99


- Math.floor
  - オブジェクトは大文字にする

- 文字列結合
  - console.log("#" + $(this).prop("id") + "\_remain");
  真ん中の$(this)など、何を取得するかが重要

# まとめ

時間が経つと、忘れてしまうものもあるので、しっかり覚えておく
GoのSwaggerでFailed to load API definitionエラーが発生する

# はじめに

仕事でGo開発を始めてREST APIのためにgin-swaggerを導入したのですが、記事通りにやってエラーが発生しました
そこで2度同じ現象につまづいたのでまとめていきます

# 問題

gin-swaggerを設定してブラウザを開いたところ以下の画面になりました

```
Failed to load API definition
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/810513/b9b5252d-3792-44a5-017a-6b13819c97a5.png)
[こちらから引用](https://www.thecodebuzz.com/resolved-failed-to-load-api-definition-undefined-swagger-v1-swagger-json/)

# 解決方法

これは`doc`をインポートしていないことで、swaggerがswaggerに関する設定ファイルを読み込めていないことで起きていました。

インポートに以下を追加したら動きました


```
import (
    "sample-go/docs" # 追加
```

ここで`sample-go`は`go.mod`に設定している名前です。各自読み替えてください

# 参考

https://www.thecodebuzz.com/resolved-failed-to-load-api-definition-undefined-swagger-v1-swagger-json/
【Go/Gin】手早くサイトを作るチートシート

# はじめに
とりあえず手早くサイトを作りたい、話はそれからだ、という人向けにGo, Ginを用いて手早くサイトを作るチートシートをここに残します。

# まずはGinのインストール
コマンドプロントで下記を入力。
```
go get github.com/gin-gonic/gin
```

# mainテンプレート
まずは基本骨格です。これをベースに味付けしていきます。
```Go:main.go
package main

import (
	"github.com/gin-gonic/gin"
)

func main() {
	router := gin.Default()
	router.LoadHTMLGlob("templates/*.html")

	//トップページ
	router.GET("/", func(ctx *gin.Context) {
		ctx.HTML(200, "top.html", gin.H{
		})
	})

	router.Run()
}
```
main.goと同じ階層にtemplatesディレクトリを作成し、その中に"top.html"を入れてください。
![66.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2602537/c162e720-02e1-77b5-6ab2-a7817e7974f4.png)
すると"top.html"の内容がまず最初に表示されます。

# GoからHTMLに数値を渡す
Page1を作成します
このページはGoから数値を受け取ります。

次のスクリプトを、
```Go: main.go
//トップページ
router.GET("/", func(ctx *gin.Context) {
	ctx.HTML(200, "top.html", gin.H{
	})
})
```
の下（上でもいいですけど）に追加してください。
```Go:main.go
router.GET("/page1", func(ctx *gin.Context) {
	ctx.HTML(200, "page1.html", gin.H{
        "v1":"a",
        "v2":"b",
	})
})
```

下記page1.htmlもtop.htmlと同じくtemplatesディレクトリに入れてください。
```HTML:page1.html
<!DOCTYPE html>
<html lang="jp">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    {{.v1}}
    {{.v2}}
</body>
</html>
```
`(サイトのURL)/page1`にアクセスすると、page1.htmlが表示されますが、{{}}で囲まれた部分がGoで書いた数値に置き換わります。<strong>詳しくは「Go テンプレート」で検索！</strong>

# URLを分解する
同じようなサイトを、IDによって分けたいとき、ありますよね。
次のように再現できます。
```Go:main.go
router.GET("/page2/:id", func(ctx *gin.Context) {
    n := ctx.Param("id")
	ctx.HTML(200, "page2.html", gin.H{
	})
})
```
上記のnに:idの値が代入されます。
例えば
`(サイト名)/page2/5`
にアクセスすると、nに5が代入されます。

# HTMLのフォームの内容を受け取る
下記のようなサイトを考えます。
```HTML:page3
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <form method="post" action="/page3/submit">
        <p>Value 1
            <input type="text" name="value" size="30">
        </p>

        <p><input type="submit" value="Send"></p>
    </form>
</body>
</html>
```
こんなページです。
![67.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2602537/4e1f4531-d289-2c13-bb92-c54ef6097fe9.png)
`Send`ボタンを押すと
`(サイト名)/page3/submit`
にリダイレクトします。

その処理はこちら。
```Go:main.go
//page3を映す分
router.GET("/page3", func(ctx *gin.Context) {
	ctx.HTML(200, "page3.html", gin.H{
	})
})

//page3の内容を受け取る
router.POST("/page3/submit", func(ctx *gin.Context) {
	value := ctx.PostForm("value")

    //page3にリダイレクト（これがないと真っ白のページで止まる）
	ctx.Redirect(302, "/page3")
})
```
このようにすると、フォームの内容を受け取れます。
上記の例だと、inputのnameがvalueなので、`ctx.PostForm("value")`にそれが格納されます。
iMacの使用中の問題を解決する

## iMacの使用中の問題を解決する

iMac(27inch)の使用を1年間続けるにあたって不満点が大きく二つ出てきました。
- 画面がデカすぎて目が疲れる
- 足が弱すぎてぐらつく

これらを解決するために撮った策

## 画面デカすぎ問題

1.　メガネの度数を弱める　=>効果なし
2.　机の奥行きを工夫する　=>費用がかかる
3. retinaディスプレイの解像度を調整　=>最高
3. 
　　との結果でしたので画面の解像度を調整することで満足しました。

システム環境設定より、ディスプレイを選択後、解像度メニューでサイズ調整を押下します。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1514897/4b873c60-e757-da30-131d-aa67dbd68153.png" width=50%>

🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉🎉

## ぐらつき問題

これから試す策
- 台座と壁に固形物を押し込んで固定する(積み木とか....ださi....)
- 机の足に耐震用の足の固定器具を取り付けて地面との接地面を増やす
- 机を買い替える😭
Goで go invalid memory address or nil pointer dereference エラーが発生する

# はじめに

最近Goを仕事で初めて、色々な記事を参考にREST APIを作成していました
そこで変数のポインタに関するエラーが発生したのでまとめます

初心者ならやりそうなミスだと思うので多くの方の参考になればと思います

# 問題

以下のコードで変数DB(gorm)の初期設定を行いました

```go:base.go
var DB *gorm.DB
var err error

func init() {
	checkDB()
	dsn := config.Config.DBName
	DB, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
	if err != nil {
		log.Fatalln(err)
	}
	migrate(DB)
}
```

そしてそこで設定した変数DBを利用して以下の関数でユーザーを取得します

```go:user.go
func GetUserByEmail(e string) User {
	user := User{}
	DB.Where("Email = ?", e).First(&user)
	return user
}
```

この関数を実行すると以下のエラーが発生しました

```
go invalid memory address or nil pointer dereference DB
```

`DB`の値がnilになっているというエラーでした
base.goでgormを使った初期化をDBに代入しているのになぜかわかりませんでした

# 解決方法

base.goのコードを変更して解決しました

```
DB, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
↓
DB, err = gorm.Open(mysql.Open(dsn), &gorm.Config{})
```

エラーが出るコードではDBに代入しているのではなく、DBというスコープ内だけで有効な変数を新規で作成し(グローバルのDBとは違うメモリを参照)、user.goで参照しているDBと異なっていました

# おわりに

新しい変数が出たら`:=`を利用してしまう考えになっていたのが原因でした
今後は気を付けていきたいです

# 参考

https://teratail.com/questions/368001
discordのwebhookはdiscord.pyで楽して作ろう

こんにちは！beatbox4108です。
ところで、discordにはwebhookという機能があるのはご存じですか？
discordのwebhookは、認証なしで、簡単なHTTPリクエストだけで、
特定のチャンネルにメッセージを送信する機能です。
ですが、APIはbotと比べると簡単ですが、やっぱり面倒くさいのが事実。
ってことで、今回はpython用のdiscordAPIラッパーのdiscord.pyを使って、簡単にメッセージを送信してみましょう！

# [Webhookの作成方法](https://support.discord.com/hc/ja/articles/228383668-%E3%82%BF%E3%82%A4%E3%83%88%E3%83%AB-Webhooks%E3%81%B8%E3%81%AE%E5%BA%8F%E7%AB%A0)は、[こちら](https://support.discord.com/hc/ja/articles/228383668-%E3%82%BF%E3%82%A4%E3%83%88%E3%83%AB-Webhooks%E3%81%B8%E3%81%AE%E5%BA%8F%E7%AB%A0)を参照してください。

# コードの土台
```python3
from discord import Webhook
import asyncio
import aiohttp

async def webhook():
    async with aiohttp.ClientSession() as session:
        webhook = Webhook.from_url("webhook url here", session=session)
        #コード
loop=asyncio.get_event_loop()
loop.run_until_complete(webhook())
```
([APIリファレンス](https://discordpy.readthedocs.io/ja/stable/api.html#webhook:~:text=from%20discord%20import%20Webhook%0Aimport%20aiohttp%0A%0Aasync%20def%20foo()%3A%0A%20%20%20%20async%20with%20aiohttp.ClientSession()%20as%20session%3A%0A%20%20%20%20%20%20%20%20webhook%20%3D%20Webhook.from_url(%27url%2Dhere%27%2C%20session%3Dsession)%0A%20%20%20%20%20%20%20%20await%20webhook.send(%27Hello%20World%27%2C%20username%3D%27Foo%27))の内容を少し改変したコードです。)

# メッセージを送信する
```python3
await webhook.send("Hello world")
```
これを土台の`#コード`の部分に書けば、簡単にメッセージを送信できます。
超簡単。discord.pyを触ったことある人なら慣れてるコード。

* * * 
いかがだったでしょうか？
embeds引数などを使えば、埋め込みも簡単に作れてしまいます！
気になったら調べてみてください！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/672153/bc7e86a4-ac64-6da6-bc90-f1dc48a25f48.png)

### 追記
ごめんなさい、記事のタグが間違ってました...
storybookをインストールするとPermissionエラー

# はじめに

この記事は2022年8月にまとめていた「細かいつまずいたことをメモしておく(8月編)をそれぞれ投稿した内容になります
解決方法が最新でない可能性もありますのでご了承ください

# 問題

コンテナの中でstorybookをインストールしました

```
$ npx -p @storybook/cli sb init
```

すると

```
permission /tmp/65...
```

のようなエラーが発生
だいたいこれ形はnode_moduleが悪いので、yarn installとnpm updateをしたところエラーは変わらず

# 解決方法

インストールを以下のコマンドに変更したところyarn installが走ってうまくいった

```
$ npm install -g @storybook/cli
$ sb init
```

# 参考

https://github.com/storybookjs/storybook/issues/10544

https://tech-mr-myself.hatenablog.com/entry/2020/02/05/214226
tsxでインターフェイス 'JSX.IntrinsicElements' が存在しない

# はじめに

この記事は2022年8月にまとめていた「細かいつまずいたことをメモしておく(8月編)をそれぞれ投稿した内容になります
解決方法が最新でない可能性もありますのでご了承ください

# 問題

App.tsxをVSCodeで開くと以下のエラーがでた

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/810513/b82fa922-ced4-0bb7-312f-5e04c38b211c.png)

エラーの内容は以下の通り

```
インターフェイス 'JSX.IntrinsicElements' が存在しないため、暗黙的に JSX 要素の型は 'any' になります。ts(7026)
モジュール 'react/jsx-runtime' またはそれに対応する型宣言が見つかりません。ts(2307)
```

```
モジュール 'react' またはそれに対応する型宣言が見つかりません。ts(2307)
```

別のディレクトリ(プロジェクト)にあるApp.tsxは問題なかった

# 解決方法

原因は`node_modules`がなかったことでした
クローンしたので`yarn install`する必要がありました
TypeScriptとNext.jsでプロジェクトを構築する

# はじめに
TypeScriptとNext.jsの開発環境を構築する際のまとめ

# Next.jsのプロジェクト作成
作成したいディレクトリで以下のコマンドを実行。
```
$ npx create-next-app@latest --ts
Need to install the following packages:
 create-next-app
OK to proceed?(y)   y
✔︎ what is your project named? ...[プロジェクト名を入力する]
```
</br>
これでプロジェクト作成が完了。
作成したプロジェクトに移動する。
`$ cd [プロジェクト名]`

この状態で以下のコマンドで一度開発サーバーを起動し、http://localhost:3000 にアクセスしてページが表示されるか確認する。
`$ npm run dev`
![スクリーンショット 2022-08-22 19.44.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2802994/466f0f7c-5ae3-b010-2962-8640a6e9373d.png)
# ファイルの整理
プロジェクト作成直後はpagesがルートに存在するため、srcディレクトリを作成する。
そして、pagesとstyleをsrcディレクトリの中に移動する。
以下のプロジェクト構成になったら準備完了。
```
|-----README.md
|-----next-env.d.ts
|-----next.config.js
|-----package-lock.json
|-----package.json
|-----public
      |-----favicon.ico
      |-----vercel.svg
|-----src
|     |-----pages
|     |     |-----_app.tsx
|     |     |-----api
|     |     |     |-----hello.ts
|     |     |-----index.tsx
|     |-----style
|     |-----Home.module.css
|     |-----globals.css
|-----tsconfig.json
```
# ビルド準備
このままだとビルドができないのでtsconfig.jsonを編集する。
1.baseUrlをsrcに指定するために追記。
2.型チェックを行うためにstrictオプションをtrueにする。
```tsconfig.json
{
  "compilerOptions": {
    "target": "es5",
    "lib": ["dom", "dom.iterable", "esnext"],
    "allowJs": true,
    "skipLibCheck": true,
    "strict": true,
    "forceConsistentCasingInFileNames": true,
    "noEmit": true,
    "esModuleInterop": true,
    "module": "esnext",
    "moduleResolution": "node",
    "resolveJsonModule": true,
    "isolatedModules": true,
    "jsx": "preserve",
    "incremental": true,
    "baseUrl": "src"
  },
  "include": ["next-env.d.ts",
              "**/*.ts",
              "**/*.tsx"],
  "exclude": ["node_modules"]
}
```
Serverless frameworkでGoをデプロイしたらPath errorが発生する

# はじめに

この記事は2022年8月にまとめていた「細かいつまずいたことをメモしておく(8月編)をそれぞれ投稿した内容になります
解決方法が最新でない可能性もありますのでご了承ください

# 問題

https://blog.mmmcorp.co.jp/blog/2020/06/07/aws-lambda-with-golang-gin/

https://zenn.dev/sti320a/articles/f60aa3ef305075

この記事をみて設定をしていたがいざデプロイすると以下のエラーが発生

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/810513/982f825a-772f-921b-3286-d61806242e96.png)

# 解決方法

```Makefile
build:
	go mod download
	env CGO_ENABLED=0 GOARCH=amd64 GOOS=linux go build -ldflags="-s -w" -o bin/main handler/main.go
```

```
set GOOS=linux
set GOARCH=amd64
set CGO_ENABLED=0
```
これを追加すればできた
`CGO_ENABLE`も追加しないとできなかった


# 参考

https://stackoverflow.com/questions/58133166/error-fork-exec-var-task-main-no-such-file-or-directory-while-executing-aws
vim-plugでE117 Uknown function plug#beginまたはUknown function plug#end

# はじめに

この記事は2022年8月にまとめていた「細かいつまずいたことをメモしておく(8月編)をそれぞれ投稿した内容になります
解決方法が最新でない可能性もありますのでご了承ください

# 問題

vim-plugをWSL2(Ubuntu20.04)に手順通りにインストールしたが読み込みでエラーが出てしまう

```
E117 Uknown function plug#beginまたはUknown function plug#end
```

ファイルはしっかりあることを確認している

# 解決方法

これは権限の問題でWSL2はユーザーでログインするためroot権限のファイルをvimで読み込むことができなかった
権限を付与することで解決した

```
$ sudo chown ユーザー名:グループ名 -R ./.vim/*
```
【VSCode】おすすめ拡張機能まとめ

# はじめに
VSCode（VisualStudioCode）を使用して開発を行う上で便利だった拡張機能を紹介します。
後半ではVue.js/Nuxt開発者向けの拡張機能も紹介しています。

# この記事の対象者
- VSCodeを使っている人
- VSCodeの拡張機能をあまり使いこなせていないと思う人
- Vue.jsの開発をしている人

## 基本編
#### Prettier

コード整形をしてくれます。これがないと生きていけないレベルです（大袈裟）
PHPやTailwindなどは初期装備では対応していないので、別途プラグインを追加する必要がありますが、プラグインが豊富なのでとっても便利。プロジェクトのpackage.jsonに入れることで、プロジェクト間のソースコードが整います。

https://prettier.io/

https://prettier.io/docs/en/plugins.html

#### ESLint 

JavaScript のための静的検証ツールです。
コードを実行する前に明らかなバグを見つけたり、括弧やスペースの使い方などのスタイルを統一したりするのに役立ちます。
開発環境に合わせた細かい設定もできます。

https://marketplace.visualstudio.com/items?itemName=dbaeumer.vscode-eslint

#### Auto Close Tag

開始タグを書いたタイミングで自動で閉じタグを作成してくれる拡張機能です。
私は初期設定のままですが、開始タグ作成時ではなく`</`を書いたタイミングで閉じタグを作成するなどの設定もできるそうです。
（あらかじめ書いたテキストの両側にタグを追加したい時はこの設定の方が便利かも…）

https://marketplace.visualstudio.com/items?itemName=formulahendry.auto-close-tag

#### Auto Rename Tag

開始タグの名前を変更すると自動的に終了タグもリネームしてくれる便利機能です。
コピペする必要もないし、変更し忘れることも、開始タグと閉じタグでタイポをすることもないのでかなり重宝しています。

https://marketplace.visualstudio.com/items?itemName=formulahendry.auto-rename-tag

#### Code Spell Cheker

タイプミスをお知らせしてくれる拡張機能です。英単語として間違っている箇所には青い波線が出ます。
これを使うようになって「ちゃんと書いたはずなのになんか動かない…（タイポが原因）」ということが激減しました。

https://marketplace.visualstudio.com/items?itemName=streetsidesoftware.code-spell-checker

#### Tabnine

AIが学習してソースコードの補完をしてくれる拡張機能です。
Githubで公開されている約200万のソースファイルを参考にし、機械学習モデル（GPT-2）を使うことでオートコンプリートを提供しているそうです。
Tabnineの候補だけでソースが書けちゃうこともあるくらいすごい機能です。
※誤って選択したものも学習してしまい、候補として出してくるので注意です、私は`width`と`window`で引っ掛かりました。

https://www.tabnine.com/

#### GitLens

Gitとの連携をしてくれて、誰がいつそのファイルを変更したのかを出してくれます。
また、過去の変更履歴もVSCodeから確認できるようになります。

https://marketplace.visualstudio.com/items?itemName=eamodio.gitlens


## Vue開発向け

#### Vetur

VSCodeのデフォルトの設定では、Vueに対してシンタックスハイライトが適用されないので、別途拡張機能をインストールする必要があります。
これがないと真っ白になってしまうので必須の拡張機能だと思っています。

 https://marketplace.visualstudio.com/items?itemName=octref.vetur


#### Vue Snippets

>スニペットとは一般的に「断片」という意味になりますが、IT用語としてはプログラミングなどで再利用可能なソースコードを表します。
スニペットを用意しておくと、必要な時に必要なソースコードを簡単に呼び出して展開することが可能となりますので、作業効率を上げることができます。


キーボードのユーザ辞書のようなもので、事前に登録した内容をショートカットキーのような感覚で呼び出せます。毎回コピペをするのも大変なので、助かっています。

https://marketplace.visualstudio.com/items?itemName=sdras.vue-vscode-snippets

https://marketplace.visualstudio.com/items?itemName=inu1255.easy-snippet

これはVueに対応しているものですが、VSCodeに直接スニペットを登録することも可能だそうです。

【参考サイト】
[VSCodeに独自のコードスニペットを登録する](https://blanche-toile.com/web/vscode-snippets)


## おまけ

#### vscode-pets

画面に猫やトトロを飼うことができます。可愛いので息抜きにどうぞ。

https://marketplace.visualstudio.com/items?itemName=tonybaloney.vscode-pets


#### VSCode Themes

VSCodeのテーマの拡張機能一覧サイトです。自分好みのテーマを探して拡張機能を入れれば見やすさと可愛さで開発効率が上がります◎

https://vscodethemes.com/

# おわりに
VSCodeを使っていて便利だな、と思うものをまとめてみました。
拡張機能の使いこなしかたで作業効率が大幅に変わるので、どんどんカスタマイズして使いやすいエディターにしていきましょう〜！



【参考サイト】
[ESLint 最初の一歩](https://qiita.com/mysticatea/items/f523dab04a25f617c87d)
youtube apiが突然403エラーを返す

# はじめに

この記事は2022年8月にまとめていた「細かいつまずいたことをメモしておく(8月編)をそれぞれ投稿した内容になります
解決方法が最新でない可能性もありますのでご了承ください

# 問題

ずっとAPIをつなげていたのに突然403を返してくるようになった

# 解決方法

原因は不明だが新規プロジェクトを作ってYoutube Data v3を再度有効にして認証キーを作成したら治った

# 参考

https://www.youtube.com/watch?v=RxN62ZzetwA
CSSのコンパイルで{": expected "}"

# はじめに

この記事は2022年8月にまとめていた「細かいつまずいたことをメモしておく(8月編)をそれぞれ投稿した内容になります
解決方法が最新でない可能性もありますのでご了承ください

# 問題

以下のファイルをReactで読み込むようにしていたのですがどうしても`{": expected "}"`というエラーが発生する

```Header.module.sass
.header {
	position: fixed;
	left: 0;
	top: 0;
	display: flex;
	height: 56px;
	width: 100%;
	background-color: #202020;
	a {
		color: white;
		font-size: 1.2rem;
		line-height: 56px;
		padding-left: 1rem;
		text-decoration: none;
	}
	.item {
		&:first-child {
			flex-grow: 1;
		}
		&:last-child {
			flex-grow: 2;
		}
	}
}
```

```js:Header.js
import Style from './Header.module.scss'

const Header = () => {
	return (
		<div className={Style.header}>
(略)
```

# 解決方法

拡張子が`sass`になっていて正しくは`scss`だった
直したらうまく動いた。そもそも書き方が二つではかなり違う

# 参考

https://qiita.com/naoki-funawatari/items/15819d0523448c8a8e95
未経験転職2年のエンジニアが考える「良いチーム」とは？

# はじめに
エンジニアになっていつの間にか2年が経とうとしております。
この２年間で、いろんなチームに所属させていただきましたし、周りの社員がいろんなチームに所属しているのを横目で見てきました。
こういったいろんな人と仕事ができるのは、受託企業の魅力の一つだなと感じる今日この頃です。

独学で勉強している時と、実際に仕事をするのとでの大きな違いの一つが、**「チームで仕事を進める」** ということです。

一緒に働くメンバーがどんな人か。自分の直属の上司がどんな人か。
それによってエンジニアという仕事の楽しさも180度変わると言っても過言ではありません。

最初に参加したプロジェクトがイマイチだったがゆえに、挫折をしてしまうという人も少なくないだろうと思います。
これからエンジニアになろうという人、なりたてほやほやの人に向けて、そんなところばかりじゃないよということを知ってもらえれば幸いです。


## 拘束時間が短い (無駄なミーティングがない)
これは個人的に非常に大切なポイント。
大企業であるほど、拘束時間が長くなりがちというイメージがあります。
もちろんミーティングを開催すること自体がダメというわけではないですが、本当にそれだけ時間をとる価値がある内容なのか？本当にそのメンバーでやるべきミーティングなのか？
そこがちゃんと考えられておらず、ただただミーテイングが開かれているケースが多々あります。
「質の良いアウトプットをする」という目的からいつの間にか逸脱して、自己満足のためのミーティングになってしまっていることが多いので、必要最低限のミーティングになっているチームは比較的良いチームだと思います。

もちろん、ちゃんと自立して動けるメンバーで構成されている必要はあり、メンバー構成によることではあるので一概には言えないですが。
聞かなくても良いミーティングに出ているばかりで、実装がなかなか終わらない、、というような本末転倒なチームには気をつけましょう。

## 心理的安全性が高い
活発なコミュニケーションがある。わからない時にすぐにお互いにコミュニケーションが取れるかどうか。というのは良いチームかどうかのひとつのポイントだと思います。
自分で考えるよりも、聞いた方が早いというのは往々にしてあります。チームとしても作業スピードが上がりますし、個人としても分からなくてモヤモヤするような時間がなくなり快適に仕事を進められます。

**気軽に質問ができる。**
こうした心理的安全性は、主にPMの人の性格が一番大きく影響しているなと感じます。
あるいは、一人でもすごく積極的にコミュニケーションをとる人がいると、つられて皆コミュニケーションをとるようになる気がします。
そんな雰囲気のチームに入れたらすごくラッキーですし、逆にそうでない雰囲気の時でも、自分が積極的にコミュニケーションをとっていけば、チームの文化も変わっていくかもしれません。

## PMに技術的知識が深い
これもたまにあるのですが、リーダーの技術的知識がないと、話がまとまっていきません。
また、メンバーが入れ替わった時に、過去になぜこんな仕様にしたのか？が誰にもわからない。というような状態になってしまうことがあります。

PMが実際にコードを書いて実装する必要はないと思いますが、技術選定であったり工数の見積もり、作業の役割において、技術的な下地がないとチームをマネジメントしていくのは至難です。もちろん細かい専門知識がある必要はないです、が何でもかんでもチームのエンジニアに聞かないと判断できないというPMは。。近づくなかれです。

そんなプロジェクトに入ってしまった時は、自分が技術的な知識をつけて、いち早くPMに提案できるような立場になっていけるかが大切です。
環境は変えられませんが、自分がどう動くかは変えることができます。

## まとめ
悪いチームというテーマで書いてみましたが、悪いチームに入るのが必ずしも悪いとも限りません。もっとこうしたら良いのに、というポイントが見つかることで今後に繋がったり、そのチームをよくしていくにはどうして行けば良いのかを考えることは、将来自分でチームを作っていくことを考えると絶対にプラスになるからです。

この記事を読んで、
最初に入ったチームに関しては、良いか悪いかどうかの判断がつかないです。そのチームの良し悪しによって、この仕事自体が嫌だなと思う人が少しでも減れば幸いです。
また、「自分が所属しているチームももっとこうしていきたいな」と考えるきっかけになれば、書いた甲斐ありました。

弊社では基本的に受託開発がメインになっています。
が、理不尽なチームであれば社長がしっかりと社員を守ってくれる会社です。
自分のように未経験からエンジニアに転職した社員がほとんどでもあります。
絶賛、新卒・中途採用を実施していますので、ご興味ある方は[こちら](https://www.recruit.nuco.co.jp/)から。
Androidで保険業界の単語帳をつくる vol.0

# この記事について
この記事ではAndroidアプリ開発未経験である私が簡単な単語帳の開発とGoogle Playへのリリースまでを記事にしてまとめていきたいと思ってます。
自分のアウトプット兼学習教材みたいなものです。

# なんで保険業界？
自分自身保険業界に身を置く人間なのですが、専門用語がとにかくたくさんある、、、
保険はその業界で働いている人だけではなく、生きている限り全員関わるものなので、会って損することはないかなと思いました。かなりニッチなものですが、、、
単語帳なんて学習用にみんな開発しそうだし、ニッチなほうがいいでしょ！

少し真面目なことを言うと、義務教育の中で金融教育が実施され始めた時代背景とかもあり、
保険という金融商品をもっと知っていく必要があるのではないかなと思ってます。
その一歩としてこういう単語帳があってもいいんじゃないかなと考えてます^^

# とりあえずやってみる
Googleが提供している学習教材とかやってみたけど、実際に自分が作りたいもの作ってるほうが身につくと思うのでとりあえず開発してみる。
Goでgooseコマンドを打っても実行できない

# はじめに

この記事は2022年8月にまとめていた「細かいつまずいたことをメモしておく(8月編)をそれぞれ投稿した内容になります
解決方法が最新でない可能性もありますのでご了承ください

# 問題

```
$ go install github.com/pressly/goose/v3/cmd/goose@latest
```

https://github.com/pressly/goose

で`goose`をいれて、`goose status`を叩いても実行ができず`goose help`と同じ内容がでる
/dbに`dbconf.yml`を設定しているがそれが読み込まれていないようだった

# 調査

以下のコマンドでgooseを実行すると成功した

```
$ goose mysql "root:password@tcp(db:3306)/techblog?parseTime=true" status
```

これは

```
goose mysql "ユーザー名:パスワード@tcp(ホスト名:3306)/DB名?parseTime=true
```
と読み替える

ただし以下の不満点があった

- ログにパスワードが残るの
- コマンドが長く打つのが大変
- インストールに30分も時間がかかった
- dbconf.ymlは読み込まれていない

# 解決方法

gooseには`オリジナル`と`fork`した2つが存在するようで、`dbconf.ymlを設定するのは別のほうのgoose`だった

今回想定していたgooseはこちらだった

https://bitbucket.org/liamstask/goose/src/master/

こちらをインストールする

```
$ go install bitbucket.org/liamstask/goose/cmd/goose@latest
```

すると`db/dbconf.yml`が読み込まれて`goose status`が動いた

ちなみに私の環境ではgccがないためインストールエラーになったので

```
$ apk add alpine-sdk
```

も実行した


# 参考

https://qiita.com/b_a_a_d_o/items/519dbc58760c95b45912
TypeScriptでuuidをインストールしているのにCannot find module 'uuid'

# はじめに

この記事は2022年8月にまとめていた「細かいつまずいたことをメモしておく(8月編)をそれぞれ投稿した内容になります
解決方法が最新でない可能性もありますのでご了承ください

# 問題

TypeScriptの環境で以下のコマンドでuuidをインストールしているのにエラーが消えなかった

```
# 以下をインストールしたがエラーは消えなかった
$ npm install uuid@8.3.2
$ npm install uuid
$ npm install -g uuid
```

# 解決方法

TypeScriptを利用しているなら以下のコマンドで定義ファイルをインストールする必要がある

```
$ npm install --save-dev @types/uuid
```
Nuxt.js(3) で作ったアプリをAWS Lambda 1つで公開する

# 備忘録

```nuxt.config.ts
export default defineNuxtConfig({
    nitro: {
        preset: "aws-lambda",
        serveStatic: true,
    },
})
```

Lambda Functions URLを使用する
APIGateWayでもできるらしいのだが、自分の場合上手くいかなかった。
※.output/public/_nuxt配下のアセットの公開がAPI GateWayの場合UrlにStageの値が入る為、上手く折り合いをつけれなかった
解消出来たらよりいいのになと思っています。

https://github.com/nuxt/framework/issues/3586

```serverless.yml
service: nitro-sample

provider:
  name: aws
  runtime: nodejs16.x
  region: ap-northeast-1

package:
  patterns:
    - "!**"
    - ".output/**"

functions:
  foo:
    handler: .output/server/index.handler
    timeout: 30
    url: true # Lambda Function URLを使う

```

外部に公開することが前提の物なら楽に作れて便利ですね。
GoのPostでBindJSONで値が取得できない

# はじめに

この記事は2022年8月にまとめていた「細かいつまずいたことをメモしておく(8月編)をそれぞれ投稿した内容になります
解決方法が最新でない可能性もありますのでご了承ください

# 問題

以下の記事を参考にPOSTを作成していたがPostmanで送った値が取得できなかった

https://qiita.com/katsuomi/items/d1e6625ae9a5b663e11f

# 解決方法

ここで私が解決に至った手順を載せる

## 1. 構造体にJsonで送る際の名前を設定する

```go:model.go
type Item struct {
    Title       string `json:"title"`
    Description string `json:"description"`
}
```

`josn:"title"`のようにつけないとPostmanのデータで`title`というKeyで送ることができない(Tが大文字で構造体には設定されているため)

## 2. PostmanではJSONで送信する必要がある

これがかなり沼ってしまった
最初PostmanでParamsやBody(form-data)でデータを送っていたがBindJSONをするなら`Body(raw)`で送る必要があった

```
{
  "title": "test",
  "description": "test2"
}
```

そして落とし穴は`テキストをJSONに変更`することだった
ここを変更しないと`Content-Type：application/json`で送られないので値が読み取れない

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/810513/12f81386-99e5-b073-5a27-a398a0e51794.png)

# 参考

https://qiita.com/shiei_kawa/items/eddf48287455380f618f
GoのAPIにReactのAxiosでアクセスするとエラーになる

# はじめに

この記事は2022年9月にまとめていた「細かいつまずいたことをメモしておく(9月編)をそれぞれ投稿した内容になります
解決方法が最新でない可能性もありますのでご了承ください

# 問題

Goで作成したユーザー一覧をJSONで返すAPIにReactでAxiosを使ってアクセスするとエラーになってしまった

# 解決方法

CROS?という方は以下の動画をまずみましょう

https://www.youtube.com/watch?v=8fE2TmbPqlU

ここではginを利用している場合の解決策を載せる
原因はGo側にあるのでReactの立っているlocalhost:3000からのアクセスを許可するように設定してあげたらアクセスができた

```go:main.go
func main() {
	r := gin.Default()

	r.Use(cors.New(cors.Config{
    AllowOrigins: []string{
        'http://localhost:3000',
    },
    // アクセスを許可したいHTTPメソッド(以下の例だとPUTやDELETEはアクセスできません)
    AllowMethods: []string{
        "POST",
        "GET",
        "OPTIONS",
    },
  }))

(省略)

```

`AllowMethods`も追加しないとエラーが発生するので追加しています

また`cors`を`go get`で入れる必要がある

```
$ go get github.com/gin-contrib/cors
```

# 参考

https://ti-tomo-knowledge.hatenablog.com/entry/2020/06/15/213401
Reactのnpx create-react-appでパーミッションエラー

# はじめに

この記事は2022年9月にまとめていた「細かいつまずいたことをメモしておく(9月編)をそれぞれ投稿した内容になります
解決方法が最新でない可能性もありますのでご了承ください

# 問題

DockerでNode.jsの環境を作成してコンテナ上で
`npx create-react-app my-app`としたところ

```
/tmp/npx665626933.sh: 2: create-react-app: Permission denied
```

というエラーが発生した

# 解決方法

以下のコマンドで成功した

```
$ npm install -g create-react-app && create-react-app my-app
```

# 問題再び

TypeScript環境をつくろうと以下のコマンドをコンテナ上で叩いた

```
$ npx create-react-app app --template typescript
```

そしてやはりエラーがでてしまった

```
https://www.google.com/search?q=Aborting+installation.+npm+install+--no-audit+--save+--save-exact+--loglevel+error+react+react-dom+react-scripts%400.9.x+has+failed&oq=a&aqs=chrome.1.69i57j69i59l3j69i60l3j69i65.2924j0j7&sourceid=chrome&ie=UTF-8
だったり
上と同じエラーだったり
```

# 解決方法再び

色々調べていると以下の記事を発見

https://zenn.dev/jpn_asane/scraps/a1ba294bf29b53

記事によるとコンテナ上のcreate-react-appは安定しないのでローカルでやったほうがよいとのことだった

ちなみ以下の記事だとコンテナ上で問題なくできるので(node14なら)不思議ではあるが一度きりなのでローカルでやろうと思う


# 参考

https://qiita.com/kashimuuuuu/items/b5f35057dfe1980d053a
Ruby3.1を触ってみる(error_highlight)

# 0. はじめに

[前回](https://qiita.com/Satoooon/items/734ef8cdecba2725943f) に引き続きRuby 3.1の新機能について動かしながら紹介しようと思います。

今回は error_highlight になります

# 1. リリースノートを見てみる
> error_highlightという組み込みgemが導入されました。これにより、バックトレース中でエラーが発生した詳細な位置が表示されます。
このgemはデフォルトで有効になっています。--disable-error_highlightコマンドラインオプションを指定することで無効化できます。詳しくはruby/error_highlightリポジトリを見てください。

引用: https://www.ruby-lang.org/ja/news/2021/12/25/ruby-3-1-0-released/
# 2. 触ってみる

使い方を [README](https://github.com/ruby/error_highlight) を拝見しながら触ってみます

```sample_1.rb
puts hoge
```

上記ファイルを実行した結果は以下のようになります。
ここを見るとエラー箇所の位置が表示されるようになりました

```
$ ruby sample_1.rb
sample_1.rb:1:in `<main>': undefined local variable or method `hoge' for main:Object (NameError)

puts hoge
     ^^^^
```

上記と同じファイルを以前のバージョンで実行した場合は以下のような出力になります。
こうして比べてみると違いがはっきり分かるかと思います

```
$ ruby sample_1.rb
Traceback (most recent call last):
sample_1.rb:1:in `<main>': undefined local variable or method `hoge' for main:Object (NameError)
```

## その他

ただ、どのようなエラーでも位置が表示される訳ではありません
例えば `ZeroDivisionError` などは3.1でも位置の表示はまだされないようです。
エラー位置の表示される詳しいエラーについては確認した方が良いと思います！

```
$ ruby sample_2.rb
sample_2.rb:1:in `/': divided by 0 (ZeroDivisionError)
        from sample_2.rb:1:in `<main>'
```

# 3. 最後に

今回は error highlight でエラー箇所を見やすい形で紹介しました。
今回の動作確認する上で使用したコードは以下で公開しておきます！


[2_error_highlight](https://github.com/saku888/ruby_3_1_sandbox/tree/main/2_error_highlight)
consult-project-bufferでvcに登録されたファイルを全部出す

[Emacsの次世代ミニバッファ補完UI](https://blog.tomoya.dev/posts/a-new-wave-has-arrived-at-emacs/) を読んでvertico/consultの環境に移行して半年ばかり。それ以前はivy/counselを使ってきましたがどうもしっくり来なかったので乗り換えました。こちらの操作性はとてもよくて気に入っています。anythingに始まったミニバッファ補完UIの旅はここに落ち着きそうです。

それで一点だけどうしても不満だったのが `M-x consult-project-buffer` の動作でした。プロジェクトに関するバッファとファイルを絞り込みの対象にするのですが、ファイルが「プロジェクト内にある以前開いたことのあるファイル (recentf)」を対象にするのです。「プロジェクト内にあるgit等vcに登録された全ファイル」ではないのです。

一から作っていったツリーならそれでもいいのですが、`git clone` してきたツリーだったり、`rails new` などで配置したファイルだったりすると `find-file` で探し回らなければなりません。

ところでvertico/consultがインストールされた状態で `M-x project-find-file` を行うとvc管理下にあるファイルが絞り込みの対象になります。このソースを consult のソースにして `M-x consult-project-buffer` のソースリスト (`consult-project-buffer-sources`) に加えてやればよいかと思いました。ついでに `recentf` はいらなくなるので外しました。

ということで快適になりました。

```elisp
(defvar my-consult--source-project-file
  `(:name "Project Whole File"
          :narrow   (?p . "Project")
          :category file
          :face     consult-file
          :history  file-name-history
          :state    ,#'consult--file-state
          :new      ,#'consult--file-action
          :items
          ,(lambda ()
             (let ((current-project (project-current)))
               (if current-project
                   (project-files current-project)
                 nil))))
  "Project file candidate source for `project-files'.")
(add-to-list 'consult-buffer-sources 'my-consult--source-project-file t)
(setq consult-project-buffer-sources
      (list
       `(:hidden nil :narrow ?b ,@consult--source-project-buffer)
       `(:hidden nil :narrow ?f ,@my-consult--source-project-file)))
```
バッファオーバーフローについて調べてみた

## そもそもバッファとは
バッファの元々の意味は「緩衝」です。バッファオーバーフローのバッファとは「バッファメモリ」のことを指し、**一時的にデータを保管しておく領域**のことです。

プログラムがもつ領域は実行命令が格納されているコード領域、プログラムの戻り先などプログラム実行のための一時的な情報が格納されているスタック領域、計算や操作のためのデータを格納するヒープ領域の3つにわかれます。このうち、**スタックとヒープを合わせた領域**を**バッファ**と言います。

## バッファオーバーフローとは
CやC++などで作成されたプログラムにおいて、バッファの許容量を超えてデータが入力されることで**メモリ領域が溢れてしまうバグ**のことです。
バッファオーバーフローによる攻撃を受けると、実行中のプログラムが強制停止させられたり、悪意のあるコードが実行されDoS攻撃の踏み台にされたり、管理者権限が乗っ取られたりといった被害を受ける可能性があります。

**■ Dos攻撃との違い**
大量にデータを送りつける攻撃として、DoS攻撃があります。
それぞれの違いを簡単にいうと、「バッファオーバーフロー」はコンピューターの内部への攻撃に利用され「DoS」は外部から過剰に負荷を与える攻撃です。

「バッファオーバーフロー」は前述の通りソフトウェアの脆弱性を突く攻撃のことで、コンピューターが確保しているメモリ領域を越えたデータが送られ、このデータに悪意のあるコードが含まれることにより、プログラムの誤動作などを起こす攻撃です。
それに対して「DoS」は、外部のサーバなどに負荷をかけるために大量のデータを送る攻撃手法です。


## バッファオーバーフローによる被害例
- 2000年中央省庁のホームページ改ざん
科学技術庁のホームページの改ざんやデーターの削除などに始まり、合計で24省庁のホームページが改ざんされました。これは、バッファーオーバーフローによる管理権限の乗っ取りが原因となって発生したみたいです。
- 2015年1月にFacebookのサービス停止

## 対策

**■ 開発者側の対策:**
- バッファオーバーフローを発生させる可能性のある関数の使用は気をつける（C言語のscanf関数など）
- バッファのサイズをチェックする関数を使用する（C言語のstrncpyなど）
- ソースコード記述時には常にデータの長さを意識する
- 対策されたランタイムライブラリを使用する
- 目視およびソースコード検索ツールによる脆弱性のチェック
- 領域あふれの問題を検出するデバッグを念入りに行う

などの対策が必要なようです。

現在のWebアプリケーションのほとんどは、PHPやJavaなどの直接メモリを操作できない言語が使われており、バッファオーバーフローの脆弱性の影響を受ける可能性は低いと言われています。

**■ 利用者側の対策:**
- OSやアプリケーションは常にアップデートして最新の状態に保つ
- 修正パッチは速やかに適用する
- ネットワーク監視機能などを備えたセキュリティソフトの導入

などが有効なようです！
## さいごに
普段CやC++をさわることはないのですが、メモリ領域を直接操作する際には気をつけなきゃと思いました！
エクスプロイトについて調べてみた

## エクスプロイトとは
エクスプロイト (英: exploit)
名詞では手柄、功績等の意味があるようですが、
動詞の**悪用する、〔人から〕絞り取る、〔人の弱みなどに〕付け込む**が今回の記事の意味に合っていそうです。

セキュリティー上の解釈としては『脆弱性』『弱点』『突破口』　ゲームなどでは『バグを利用した裏技』の意味として使用されます。
『サイバー攻撃をするために脆弱性を悪用して作成されたコードそのもの』としても使用されます。(エクスプロイトコードとも呼ばれる)


## 具体的に
OSやソフトウェア、ハードウェアの脆弱性を利用してコンピュータやスマートフォンで不正なスクリプトやプログラムを実行させます。
手段としてはローカルとリモートからの２パターンあり、ほとんどのエクスプロイトは、リモートに分類されるスパムやフィッシングメールを介して送り込まれます。


**例:**
悪意あるエクスプロイトコードが仕込まれたサイトにアクセスしたとき
一見無害そうで実は悪質なコードが隠されたファイルを開いたとき

**小話：**
エクスプロイト(脆弱性)をメーカーは買取をしています。
例えばAppleのiOSのエクスプロイトを種類によっては100万ドル(1~2億円)以上の報奨金を出してでもエクスプロイトを集めようとしています。
エクスプロイトを買い取って悪用する人もいることや、損害の大きさから高額の報奨金になるのでしょう。


## 対策
- **開発者**
ほとんどのエクスプロイトはソフトウェア開発会社による不具合、脆弱性によるもの。エクスプロイトを除去する責任は開発会社にあります。
脆弱性を生まないように開発のなるべく早い段階からセキュリティーが確保することや、オリジナルで作り込んだ部分が多ければ多いほど、脆弱性が生じやすくなるといわれるので既存の機能を使用し、適切な設計を導入、修正しやすいコード作りを行うことも重要です。

- **利用者**
利用する側は常に最新のニュースを入手するよう心掛けること、セキュリティ製品を導入することでカバーすることが可能になり、最新の攻撃にも対応しやすくなります。利用するソフトウェアは最新の状態に保ち、最新のセキュリティパッチが利用可能になったら、直ちにすべてインストールしましょう。


## まとめ
素人なりに感じたことは下記２点です。
**利用するソフトウェアは最新にすること**
**利用してもらう、開発しているソフトウェアがあれば脆弱性に気をつけ、発見次第修正しリリースすること**

以上、ありがとうございました。
Falco Ruleを紹介するシリーズ - Terminal shell in container

本シリーズでは、ランタイム脅威検知のデファクトスタンダードである<a href=https://falco.org/ target=new>Falco</a>の検知Ruleを、１つの記事で１つ紹介していきます。
Falco自体の概要を知りたい方は<a href=https://sysdig.jp/blog/intro-runtime-security-falco/ target=new>こちらのブログ記事</a>をご参照ください。
今回ご紹介する検知Ruleは<b>「Terminal shell in container」</b>です。
# Rule記述
```
- rule: Terminal shell in container
  desc: A shell was used as the entrypoint/exec point into a container with an attached terminal.
  condition: >
    spawned_process and container
    and shell_procs and proc.tty != 0
    and container_entrypoint
    and not user_expected_terminal_shell_in_container_conditions
  output: >
    A shell was spawned in a container with an attached terminal (user=%user.name user_loginuid=%user.loginuid %container.info
    shell=%proc.name parent=%proc.pname cmdline=%proc.cmdline terminal=%proc.tty container_id=%container.id image=%container.image.repository)
  priority: NOTICE
  tags: [container, shell, mitre_execution]
```
# Rule概要
コンテ内でターミナルシェルが使用されたことを検知します。
コンテナはイミュータブル（変更不可）として取り扱うことが望ましいため、一般的にコンテナ内でターミナルシェルを起動することはありません（もちろん例外もあり、構成管理ソフトウェアなどがシェルを起動するのは予期された動作となります）。
コンテナの設定変更やアップデートを行う場合には、新たにコンテナイメージを作成し、デプロイする運用が一般的です。
そのため、コンテナ内でシェルが起動した場合、攻撃者が何らかの不正行為を行う目的でシェルを起動させた可能性があり、このRuleを使うことで検知可能です。

# Condition（条件）
`spawned_process and container
    and shell_procs and proc.tty != 0
    and container_entrypoint`
ノードではなくコンテナ内で、シェルのプロセスがエントリーポイントとして新たにターミナルで起動された場合で

かつ

`and not user_expected_terminal_shell_in_container_conditions`
あらかじめユーザーが定義した、予期されたコンテナ内でのターミナルシェル起動の条件には合致しない場合

# Output（出力）
コンテナ内のターミナルでシェルが起動されました。

`%user.name`
ユーザー名

`%user.loginuid`
ユーザーのログインUID

`%container.info`
コンテナ情報

`%proc.name`
プロセス名

`%proc.pname`
親プロセス名

`%proc.cmdline`
コマンドライン

`%proc.tty`
ターミナル

`%container.id`
コンテナID

`%container.image.repository`
コンテナイメージリポジトリ
Typescriptのkeyや型を定義・使用する時に便利な構文（Type Operatorなど）


実装しててたまに便利に使えている構文の正しい名前と公式ドキュメントのセット。ほぼ個人メモ。

# Spread syntax (...)
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_syntax

Array/Objectにて列挙してくれる。javascriptの範囲。

## 例
```typescript
type InstantNoodle = {
  productName: string;
  companyName: string;
  price: number;
}

type CapNoodle = InstantNoodle & {
  flavor: string;
}
const makeCapNoodle = (variables: { noodle: InstantNoodle, flavor: string }): CapNoodle => {
  const { noodle, flavor } = variables;
  return {
    ...noodle,
    flavor
  }
}
```

# Keyof Type Operator
https://www.typescriptlang.org/docs/handbook/2/keyof-types.html

Objectのkeyを取ってきてくれる。typescriptの範囲。
## 例
```typescript
type InstantNoodle = {
  productName: string;
  companyName: string;
  price: number;
}
type CapNoodle = InstantNoodle & {
  flavor: string;
}

// 'productName' | 'companyName' | 'price' | 'flavor' 
type CapNoodleKeys = keyof CapNoodle
```

# Indexed Access Types

https://www.typescriptlang.org/docs/handbook/2/indexed-access-types.html

nestされた型の中を掘り出すのに有効。typescriptの範囲。

## 例
```typescript
type InstantNoodle = {
  productName: string;
  companyName: string;
  price: number;
}

type InstantNoodleSet = {
  noodleSet: InstantNoodle[]
  discountPrice: number
}

// instantNoodleSet.noodleSet[0]と同じ＝InstantNoodle
type NoodleInfo = InstantNoodleSet['noodleSet'][0]
```
これだけだと「え？ InstantNoodle使えば良くない？」となるがcodegenなどのType自動生成を使って開発してると役に立ったりする。
人間国社会人村で生きていくために~社会人基礎コミュニケーション編~ 

## はじめに
エンジニアになろうと思う皆さんはまず技術の勉強をしようと考えると思います。 
私もそうでした。  
ですが、現実はそう甘くなく、技術の勉強の前に、社会人として、人間とコミュニケーションを取る一人間として必要なことがあったのです。  
新卒4ヶ月半の私が、4ヶ月半前に戻れたら伝えたかったことをここに書き記します。  
(これから新卒になる人達、エンジニアになりたい人たちの道標になれば嬉しいです。)  


## 社会人基礎力の基礎(人間とコミュニケーションを取るために)
### PREP法で話す
これは有名な話ですね。
簡単に言えば結論から話す話し方を指します。
これができるだけで社会人部族に仲間として認めてもらえ、コミュニケーションがかなりスムーズになるので、早めに身に着けて仲良くなりましょう！🐵

 使い方葉以下の通りです。
- 結論（Point）
- 理由（Reason）
- 具体例（Example）
- 再度結論Point）

### 質問はする時も答える時も簡潔に！
人間はよく質問をし、よく質問に答えます。
仕事をしていて、半分以上の会話のきっかけはこの質問と言って過言ではないでしょう
そんな多くある質問のなかで、
例えば、あなたが誰かに朝ごはんには何を食べたかと聞くとしましょう。
その回答として、相手は朝ごはんに何を食べたかではなく、朝ごはんを食べることの重要性や朝ごはんの歴史を語りだしたとします。
早く質問の答えを出してほしいと思いますよね？
ですが、相手はこの答えを説明するには歴史や重要性を理解してもらう必要性があると言います。
理解できるかどうかは答えを聞いてからこちらが判断できるため、まず答えを聞きたいものです。
逆もしかりで、忙しい相手に質問をするときにわざわざ歴史や重要性を説くことは双方にとって無駄になる場合が多く、
一言で答えられる質問や、YES,NOで答えられる質問を用意して上げれば、1単語以内にに相手の時間を短縮出来ます。
必ず意識しましょう。


## 基礎プラスアルファ！
ここからはプラスアルファです。
社会人村で人間とコミュニケーションができる様になったら。
部族の長を目指して自分を磨いていきましょう。


### 仮説を上司に相談しOKが出てから行動する
#### 仮説を持つことの重要性
仮説を持つことはとても重要です。
上司の言いなりになり仕事をするのも手ですが、それでは一生言われた通りにしか動けない人間になってしまいます。
間違えてもいいので、自分なりに考え、答えを出す訓練をしましょう。最初は間違いばかりでも大丈夫です。精度は上がるはずです。

#### 仮説をすぐ行動に移さない
上司の時間も無駄に出来ないですが、基本的に自分の時間も無駄にしてはいけません。
自分が仮説を持って動くのは良いことですが、その仮設がまるまる間違っていたときにその間行動した時間と労力は無駄になってしまいます。
動く前にまず上司に相談し、この方向で動いて良いかを確認しましょう。

### 仮説のOKを貰えて行動する際の注意事項
#### 期限と成果物のすり合わせをしよう
頼まれていたと思っていたことをやっていて意気揚々と提出したら、全く違うことをやっていたなんてことは最初のうちに経験することがあります。
しかも期限を聞かなかったがばっかりに他の仕事をしていたら、こっちの方がよっぽど重要だったなんてことも。
そんなことにならないためにも、期限と成果物のイメージは最初に行い、途中経過報告のタイミングや、その時の達成度なども確認しておくとGoodです。
3日の100点より1日の60点となんかの本に書いてあった気がします。
60点は恥ずかしいですが、期限内に終わらせるためにはプライドも捨てて一旦確認してもらいましょう。
方向転換ができる(必要かもしれない)し、未来はきっと明るいはずです。

### まとめ
人間国社会人村での生活を送るため、強いては長になるための心積もりを記してみました。
私もまだまだこの村ではぺえぺえですが、いつか立派な長になるために頑張るのでみなさんもがんばりましょう。

弊社は未経験からエンジニアになったメンバーが活躍している会社です。
未経験者の新卒・中途採用も実施しています。ご興味ある方は[こちら](https://www.recruit.nuco.co.jp/)から。
WSL上でのgit cloneが失敗する時に確認すべきこと

環境構築しようとしたらWSL上でのgit cloneでコケて小一時間ハマったのでメモ

 - Windows10
 - WSL2
 - Ubuntu-20.04

git clone　すると以下のようなメッセージが出る
```
error: RPC failed; result=56, HTTP code = 200
fatal: The remote end hung up unexpectedly
fatal: early EOF
fatal: index-pack failed
```

ネットで調べるとみんなbufferを増やせと書いている
```
git config --global http.postBuffer 524288000
```

が、自分の場合はこれやっても解決しなかった。


どうやら、特定のWifiチップセットとドライバーにてWSLでこの問題が発生する模様
わかるかいそんなもん

https://github.com/microsoft/WSL/issues/4253

ドライバー更新で治るらしいが、自分の場合は有線接続でクローンしたらいけた。