OmniAICreator/Qiita-1.07M huggingface dataset:
Bashだけで10進数からn進数(2～64進数)に変換する

# はじめに
10進数からn進数(2～64進数)に変換するBashスクリプトの関数です。今回は引数チェックも入れました。Bash 4.4.12で動作を確認しています。


# コード

``` conv_digit.sh
function conv_digit()
{
  local natural digit quotient surplus sign c64 result
  c64='0123456789abcdefghijklmnopqrstuvwxyz'\
'ABCDEFGHIJKLMNOPQRSTUVWXYZ@_'

  [[ -n ${1:-} ]] || return
  if [[ $1 =~ ^(\+?)([0-9]+)$ ]]
  then
    sign=${BASH_REMATCH[1]:-}
    natural=${BASH_REMATCH[2]};
    sign=${sign/+/}
  else
    echo "${FUNCNAME[0]}($1,$2): Arg 1 is invalid. call"\
      "from ${FUNCNAME[1]}():${BASH_LINENO[0]}">&2
    return 1
  fi
  if [[ -n ${2:-} ]]
  then
    if [[ $2 -lt 2 || $2 -gt 64 ]]
    then
      echo "${FUNCNAME[0]}($1,$2): Arg 2 is invalid. call"\
      "from ${FUNCNAME[1]}():${BASH_LINENO[0]}">&2
      return 1
    else
      digit=$2
    fi
  else
    digit=10
  fi
  echo -n ${sign:-}
  while :
  do
    surplus=$(($natural%$digit))
    natural=$(($natural/$digit))
    result=${c64:$surplus:1}${result:-}
    [[ $natural -eq 0 ]] && break
  done
  echo $result
}
```

# 使い方

``` .sh
$ . conv_digit.sh
$ conv_digit 17 2
10001
$ conv_digit 31 16
1f
$ conv_digit 31
31

```

n進数から10進数にするにはBashの組み込み機能で行なえます。

``` .sh
$ echo $((16#1f))
31
$ echo $((16#$(conv_digit 31 16)))
31
```

# 補足

第一引数は変換する10進自然数で、一般的な64ビット環境では0から2^63-1(=9223372036854775807）の範囲の整数となります。先頭に0がつく数字は8進数として認識されるようです。負値や小数は扱えません。指数表記はどうなるか不明です。
なお第二引数は進数を指定します。2から64の整数のみを指定でき、負の値や小数、指数表記はエラーになります。
負値も変換したい場合は、[Bashだけで16進数・10進数・2進数間の相互変換を行う](https://qiita.com/aachyee/items/23412da88ff86e45187c) をご覧ください。

# 諸注意

コードはご自由に使って頂いて構いませんが、使用する事のより発生するあらゆる事象に対して一切の保証や補償は致しません。
ServiceNow - テーブル情報の取得

##ServiceNowの標準テーブルの継承されていない列を取得するスクリプト（ユーザが作成されたテーブルではすべての列が表示されるので下の「ユーザテーブルに追加した列を取得」スクリプトを利用する）

```
var tableName = 'incident';

var grSys = new GlideRecord('sys_dictionary');
grSys.addEncodedQuery('name=' + tableName + '^internal_type!=collection^internal_typeISNOTEMPTY');
grSys.addOrderBy('column_label');
grSys.query();

while(grSys.next()) {
  gs.info(grSys.column_label + ',' + grSys.element + ',' + grSys.internal_type + ',' + grSys.reference + ',' + grSys.display + ',' + grSys.active + ',' + grSys.sys_created_by + ',' + grSys.sys_created_on);
}
```

##継承されている列も含めたすべてのテーブルの列を取得するスクリプト

```
var tableName = 'cmdb_ci_linux_server';

var tableUtil = new TableUtils(tableName);
var parentTables = tableUtil.getTables().toArray();

for (var i=0; i<parentTables.length; i++) {
  var table = parentTables[i];
  var grSys = new GlideRecord('sys_dictionary');
  grSys.addEncodedQuery('name=' + table + '^internal_type!=collection^internal_typeISNOTEMPTY');
  grSys.addOrderBy('column_label');
  grSys.query();

  while(grSys.next()) {
    gs.info(table + ',' + grSys.column_label + ',' + grSys.element + ',' + grSys.internal_type + ',' + grSys.reference + ',' + grSys.display + ',' + grSys.active + ',' + grSys.sys_created_by + ',' + grSys.sys_created_on);
  }
}
```
##ユーザテーブルに追加した列を取得

```
var tableName = 'u_test_extend';

var tableUtil = new TableUtils(tableName);
var parentTables = tableUtil.getTables().toArray();
parentTables.shift();

var parentColumns = [];
for (var i=0; i<parentTables.length; i++) {
  var table = parentTables[i];
  var grSysParent = new GlideRecord('sys_dictionary');
  grSysParent.addEncodedQuery('name=' + table + '^internal_type!=collection^internal_typeISNOTEMPTY');
  grSysParent.addOrderBy('column_label');
  grSysParent.query();

  while(grSysParent.next()) {
    parentColumns.push(grSysParent.element.toString());
  }
}

var grSysCustom = new GlideRecord('sys_dictionary');
grSysCustom.addEncodedQuery('name=' + tableName + '^internal_type!=collection^internal_typeISNOTEMPTY');
grSysCustom.addOrderBy('column_label');
grSysCustom.query();

var customTableColumns = [];
while(grSysCustom.next()) {
  customTableColumns.push(grSysCustom.element.toString());
}

for (var j=0; j<parentColumns.length; j++) {
  var x = customTableColumns.indexOf(parentColumns[j]);
  if (x > -1) {
    customTableColumns.splice(x,1);
   }
}

gs.info(customTableColumns);
```
【3D Segmetation】PointNet : Point CloudでのSegmentaionを感覚的に理解してみる


<h1>PointNetってなんぞや？</h1>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/439df62a-5a04-7299-ac19-97e1723c2fd2.png)

Point Cloudの3次元情報からClassification、Part Segmentation、Semantic Segmentation出来るPointNet。
2DのSemantic Segmentationをある程度知っていると理解しやすいかも。


<h1>アルゴリズム</h1>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/3fd8cd12-9cf5-78e6-6cf8-0f24c0701466.png)


<h2>input transform</h2>
T-Netで3x3のRotation Matrixを推定し、掛ける事でPoint Cloud全体を回転させることが出来る。
入力のPoint Cloudが回転しててもT-NetでRotation Matrixを求める事で、物体をいつも同じ姿勢(正面を向けるなど)に変換出来る。
そうやって正規化するのね。

<h2>Feature transform</h2>
input transformの特徴量版。

<h2>max pool</h2>
point全体から特徴量の一番高い値だけを抽出する。


<h2>classificatiopn</h2>
図のglobal featureをMLPに入力すれば、入力Point Cloudがなんの物体かClassification出来るのね。

<h2>segmentation</h2>
global featureとpoint cloud1つ1つのlocal featureを結語してMLPで学習させれば、3DのSemantic segmentationが出来る。



<h1>結論</h1>
・適当な自分はFully Connectedを重ねれば良いんじゃねっと思っていたのだが、そんな単純ではないのね。
・point cloudの順番によらなく、GlobalとLocalの情報を得られるようにする事がミソっぽい


<h1>参考文献</h1>
PointNet: Deep Learning on Point Sets for 3D Classification and Segmentation
https://arxiv.org/pdf/1612.00593.pdf
ServiceNow 便利サイト

ServiceNowでの開発でよく参照するページ集です。

##テーブル／コード操作
* GlideRecord<br/>https://developer.servicenow.com/dev.do#!/reference/api/orlando/server/no-namespace/c_GlideRecordScopedAPI
* GlideDateTime<br/>https://developer.servicenow.com/dev.do#!/reference/api/orlando/server/no-namespace/c_APIRef
* GlideDate<br/>https://developer.servicenow.com/dev.do#!/reference/api/orlando/server/no-namespace/c_GlideDateScopedAPI
* TableUtils<br/>https://developer.servicenow.com/dev.do#!/reference/api/orlando/server_legacy/c_TableUtilsAPI#r_TU-getTables

##API
* テーブルAPI<br/>https://developer.servicenow.com/dev.do#!/reference/api/orlando/rest/c_TableAPI
* 添付API<br/>https://developer.servicenow.com/dev.do#!/reference/api/orlando/rest/c_AttachmentAPI
* スクリプトAPI<br/>https://docs.servicenow.com/bundle/paris-application-development/page/integrate/custom-web-services/concept/c_CustomWebServices.html

##UI
* Jettyタグ<br/>https://docs.servicenow.com/bundle/orlando-application-development/page/script/general-scripting/concept/c_ExtensionsToJellySyntax.html#r_GDialogButtonsOkCancel
* spModal<br/>https://developer.servicenow.com/dev.do#!/reference/api/orlando/client/SPModal-API#SPM-prompt_S_S
Git リモートブランチを削除する

# 目的

- リモートブランチを削除する方法をまとめる

# 前提情報

- 紹介するコマンドを実行するとリモートブランチが即座に削除されるので注意する。

# 詳細

1. Git管理されているディレクトリに移動する。
2. 下記コマンドを実行してリモートブランチを削除する。（本コマンドを実行後すぐにリモートブランチが削除されるので注意すること）

    ```terminal
    $ git push --delete origin ブランチ名
    ```
vscodeのRemote-Containersでnginxを使おうとした時に困ったメモ

# やろうとしたこと
ワイ「**vscodeのRemote-Containers**と**Docker**でアプリ開発してみよ。まずは**nginx**からや。**Remote-ContainersもDockerもnginxも全然知らん**けどなんとかなるやろ」

# 起きたこと
以下のymlを用意し、`docker-compose up -d`すると、localhost:8080で別に用意したindex.htmlが表示されることを確認。

```docker:docker-compose.yml
version: '3.8'
services:
  web:
    image: nginx
    volumes:
      - .:/usr/share/nginx/html
    ports:
      - "8080:80"
```

が、同じものをvscodeのRemote-Containersで開いた場合、localhost:8080にアクセスしてもindex.htmlが表示されない。

Remote-Containers実行時に自動で作成される`./.devcontainer/docker-compose.yml`に`command: /bin/sh -c "while sleep 1000; do :; done"`行がデフォルトで記述されているのだが、この行があるとindex.htmlが表示されなくなる模様。

```txt:Remote-Containers実行後のディレクトリ構造
.devcontainer/          # Remote-Containers実行で自動生成
  devcontainer.json
  docker-compose.yml    # こいつにcommand行がある
docker-compose.yml
index.html
```

※ `command: (以下略)`が`./docker-compose.yml`に書かれていた場合もindex.htmlが表示されなくなる。

# なんで？
わからん...。

`command: /bin/sh -c "while sleep 1000; do :; done"`無しの`docker-compose.yml`でnginxコンテナを起動し、アタッチして同じsleepコマンドを叩くとちゃんと実行される（以下ログ）ので、コンテナ内で`command:`のコマンドでエラーが出ているわけではなさそう。

```shell
root@hoge:/workspace# /bin/sh -c "while sleep 1000; do :; done"
^C
root@hoge:/workspace# 
```

# なんか怪しいやついた
`docker ps --no-trunc`をやってみたところ、手動で`docker-compose up -d`やった時の`COMMAND`は`/docker-entrypoint.sh nginx -g 'daemon off;'`とのこと。これが`/bin/sh -c "while sleep 1000; do :; done"`によって上書きされるからか？

```
web_tmp > docker-compose up -d
Creating web_tmp_web_1 ... done
web_tmp >
web_tmp > docker ps --no-trunc
CONTAINER ID                                                       IMAGE               COMMAND
 CREATED             STATUS              PORTS                  NAMES
8f7c7a3300bd7e9894f387b39cc904776858893e337f849ecee5dd69e6ad9291   nginx               "/docker-entrypoint.sh nginx -g 'daemon off;'"  
 2 minutes ago       Up 2 minutes        0.0.0.0:8080->80/tcp   web_tmp_web_1
web_tmp > 
```

# ビンゴ
`docker-compose.yml`で`command: /docker-entrypoint.sh nginx -g 'daemon off;'`にしたら`index.html`が表示された。原因これだ！

デフォルトで暗黙的に実行されている`docker-entrypoint.sh`を別コマンドで上書きしてしまった結果、nginxのdaemonが起動しなくなったものと思われる。ひとまず解決した！やったー！！

# まとめ
- 事象 : nginxの`docker-compose.yml`に`command: /bin/sh -c "while sleep 1000; do :; done"`があるとindex.htmlが表示されなくなる
- 原因 : nginxコンテナを起動する時の`COMMAND`が、デフォルト(= `/docker-entrypoint.sh nginx -g 'daemon off;'`)から`/bin/sh -c "while sleep 1000; do :; done"`に上書きされてしまうため
- 対処 : すべての`docker-compose.yml`から `command:`をコメントアウトする。（あるいは、`command: /docker-entrypoint.sh nginx -g 'daemon off;'`にする。普通そんなことしないけど。）

# 参考
- [GitHub : docker-nginx/entrypoint.sh](https://github.com/sameersbn/docker-nginx/blob/master/entrypoint.sh)
- [StackOverFlow : nginx does not open localhost with VSCode Remote Containers Extension (docker compose)](https://stackoverflow.com/questions/59368396/nginx-does-not-open-localhost-with-vscode-remote-containerss-extension-docker-co)
nginxのエラー「413 Request Entity Too Large」の解決方法

# 前提開発環境
- AWSのEC2インスタンスを使用してデプロイ済み
- Ruby on Rails6で開発


# エラー概要
Rails6で投稿アプリを作成し、本番環境で投稿すると下記画像のエラーが発生しました。

![nginx.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638561/8b853cd6-80af-69ac-4f1a-486a78523e67.png)

画面を無駄に占有して**413 Request Entity Too Large**とエラーが発生しました。
もうちょっと控えめな自己主張をして頂きたいものです((((；ﾟДﾟ)))))))

**投稿した画像サイズが大きすぎる**と怒られています。
画像サイズの設定を変更する為にEC2へログインします。

```
恒例のコマンドです。
以下を順にローカルのターミナルに入力していく。

①mkdir ~/.ssh

②cd .ssh/

③lsコマンドで、EC2で作成済みの<鍵名>.pemが表示される。

④chmod 600 <鍵名>.pem

⑤ssh -i <鍵名>.pem ec2-user@<EC2で発行したElastic IP>

すると、

  __|  __|_  )
       _|  (     /   Amazon Linux 2 AMI
      ___|\___|___|

と、上記の表示が出てEC2へのログインが完了。
```

# viでnginxのファイル編集

今回はnginxの画像投稿許容サイズを引き上げる必要があります。
デフォルトが1MBまでなので、それ以上の容量を送信すると上記のエラーが起きます。

エラー解消の為に、Amazon Linuxに標準で装備されているテキストエディタ**vi**でファイル編集を行います。

```
EC2にログインしている状態で下記コマンドを実行する。
$ sudo vi /etc/nginx/nginx.conf
```

これで**vi**が起動して、さらに編集したいファイルが表示されますが、結構長い表記のファイルです。その中でhttp {}の中で追記を行います。

ファイル表示しただけでは編集できないので、「i」を押してinsertモードに切り替えてファイル編集を行いましょう。

```
# /etc/nginx/nginx.conf
....中略

http {
    ....  
    .... #中略

    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 4096;
    client_max_body_size 20M;　#この項目を追記します。
    ....
    server {
        ....
        ....
    }
　　　....以下省略
}
```
追記したら**「esc」を押してinsertモードを終了し、「:wq」で変更を保存します。**

ファイル編集は終わりましたが、あとは更新を反映させる必要があります。
今回のパターンは編集ファイルの反映が目的なので、**nginxの再起動でなくリロードを行います。**

```
sudo service nginx reload
```

これで**vi**ファイルへの編集が反映されたので、サイズが大きい画像サイズも送信が可能になります。**vi**にはまだまだ馴染みが薄いので、慣れていきたいところです。

# 追記　viの操作方法

viエディタで実際の設定ファイルを編集する場合の流れ

```
1.「通常モード」でファイルを開く
2.「インサートモード」でファイルを編集する
3.　再び「通常モード」へ移行し、「:wq」で保存して終了する
```

通常モード
viエディタには「通常モード」と「インサートモード」があります。
通常モードは、viエディタにコマンドを打つことでファイルを保存したりviコマンドを終了したりできます。

```
「通常モード」のコマンド

コマンド	説明
:w	作成・編集したファイルを保存します。
:q	viコマンドを終了します。
:q!	編集した内容を保存しないでviコマンドを強制終了します。
:wq	編集した内容を保存してviコマンドを強制終了します。
```

**i (インサートモード)
「通常モード」では、文字を入力することができません。文字を入力したい場合は、インサートモードにする必要が有ります。「I」キーを押すとインサートモードになり、文字の入力が可能です。**

 **Esc
Escキーを押すと通常モードに戻ります。**
Rubyで「フロイドの循環検出法」を実装

たまに使うことがあるので、作ったコードを記録しておく。またこの機会に、アルゴリズムの動作原理を自分なりにまとめて理解する。

## Rubyのコード

```ruby
# 漸化式 x_{n+1} = f(x_{n}) で与えられる列が循環を持つとき、
# 循環に入るまでの長さ l と循環の長さ m を測る
def find_cycle(x0, limit = nil, &f)
	# 循環検出の回数制限を設定（終端 nil または Float::INFINITY で無限）
	seq = 1..limit

	# step1: 循環を検出する
	x = y = x0
	k = seq.find { (x = f[x]) == (y = f[f[y]]) }
	raise "failed to detect a cycle" unless k

	# step2: 循環に入るまでの長さを測る
	x = x0
	l = (x == y) ? 0
	  : seq.find { (x = f[x]) == (y = f[y]) }

	# step3: 循環の長さを測る
	m = seq.find { (x = f[x]) == (y = f[f[y]]) }

	[l, m]
end

if $0 == __FILE__
	# テスト： x_{n+1} ≡ x_{n} * 2 (mod 360), x_{0} = 133
	l, m = find_cycle(133) { |x| x * 2 % 360 }
	p [l, m]

	# x_{l} == x_{l+m} （かつ x_{l-1} != x_{l+m-1} ）になるはず
	ary = (l + m).times.inject([133]) { |a, _| a << (a.last * 2 % 360) }
	ary.each_with_index { |x, i| puts "%3d %4d" % [i, x] }
end
```

## アルゴリズムの仕組み

以下のグラフ（ l = 11, m = 8 ）の図で説明する。

![floyd.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/127130/671b4b55-2959-8f1b-3d6e-74ad0c22afad.png)

循環節のノードを円形に配置し、非循環節はノードが揃うように「巻き付けて」いる。結果として **m の倍数番目のノード（ 0, m, 2m ）は円の中心から見て同じ方向に並んでいる**。

- step1: 循環を検出する
	- `x` と `y` は共にスタート地点（ノード 0 、値 `x0` ）から始める
	- `x` は1つずつ、 `y` は2つずつ進める
		- `x` が1周してノード m に来れば `y` は2周してノード 2m に来る
		- このように、 **`x` と `y` はノード 0 と同じ方向で必ず並ぶ**
	- `x` が循環に入ればいつか必ず `y` が追いつき `x == y` になる
		- この位置はやはりノード 0 と同じ方向、つまり **m の倍数**
		- あくまで m の倍数であり、循環の長さ m そのものではない可能性があることに注意
- step2: 循環に入るまでの長さを測る
	- `x` だけスタート地点に戻し、 `y` はstep1終了時（循環節にある m の倍数のノード）から続ける
	- `x` も `y` も1つずつ進める
		- 円の中心から見て `x` と `y` は常に同じ方向にいて並走する
	- すると、循環に入った瞬間（ノード l ）で必ず `x == y` になる
- step3: 循環の長さを測る
	- `x` と `y` は共に循環の中（簡単なのはstep2終了時）から始める
	- `x` は1つずつ、 `y` は2つずつ進める
	- この場合、step1と異なり `x` が*ちょうど1周*で必ず `x == y` になる

## 参考

* [フロイドの循環検出法 - Wikipedia](https://ja.wikipedia.org/wiki/フロイドの循環検出法)
* [Rでフロイドの循環検出法を可視化する - Qiita](https://qiita.com/nozma/items/bfa3e089cd432b74c10d)
GitHubでフォークしてクローンする

## フォークを使うとき
他の人のリモートリポジトリに編集を加えたいとき、いったんフォークで自分のアカウントにコピーしてくることで、元のリポジトリに影響を与えずに編集することができます。
このように、作業をリモートリポジトリのソースから始める場合に使われます。

OSSなどの不特定多数の人が開発するようなリポジトリでは、フォークしてから作業をすることで、意図しないコミットを防ぎます。対して会社組織などでの開発では、わざわざフォークする手間を省き直接プルリクを送る、というワークフローが多いようです。

ローカル環境から作業を開始する場合は、管理したいディレクトリで「git init」してリポジトリを作成してから始めます。

## フォークする(Fork)
フォークとは他の人のリポジトリを自分のアカウントへ複製することです。
英語の「Fork」とは日本語で「分岐する」という意味です。食器のフォークも途中で分かれているのでそのイメージと同じです。



### githubからフォークする例
フォークしたいリポジトリで、「Fork」ボタンをクリック。

|![5F88DC6D-2B38-43E5-A03D-9165CA7E9429.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538652/fd32dc92-58a6-07b9-eda8-ced44dd96ff5.png)|
|:--|

これだけでフォーク終わりです。あっけない…！
このように、自分のアカウントにリポジトリがコピーされました。

|![4AE3699D-16CB-4A4E-AB74-FC52B1498753.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538652/345ad56f-8e14-a062-393a-0c9dc1d48c45.png)|
|:--|


## クローンする(Clone)
自分のアカウントのリポジトリで「Code」というボタンをクリックします。
転送プロトコルを「HTTPS」「SSH」「GitHub CLI」の中から選べますが「HTTPS」にしてURLをコピーします。(バインダーのようなアイコンをクリックするだけでクリップボードにコピーされます)
<img width="450" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538652/b4238f70-9e02-be2c-81d7-1b2e7b82e3d1.png">

### ソースツリーを使いローカルにクローンする場合
![3E9BA699-8FB8-4DB6-8F26-2A59F815829D.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538652/9ec1334a-4f3f-146a-9275-fa3cf65f66ec.png)
<img width="450" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538652/eb17a858-8526-be96-2bce-817847349a1c.png">

### gitコマンドでの場合
```
git clone <クローンしたいリポジトリのURL> <クローン先のディレクトリ(省略可)>
```
コピーしてきたいディレクトリに移動して、`git clone <先ほどコピーしたURL>`を実行すると、そのディレクトリに、リポジトリと同じ名前のフォルダが作成されファイルがコピーされてきます。

## 作業する
これで開発を始める準備ができました。
ブランチを切って作業を行います。

## 参考
- [Git - Git リポジトリの取得](https://git-scm.com/book/ja/v2/Git-%E3%81%AE%E5%9F%BA%E6%9C%AC-Git-%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA%E3%81%AE%E5%8F%96%E5%BE%97)
- [git cloneで環境構築!リポジトリをクローンしよう | 侍エンジニア塾ブログ（Samurai Blog） - プログラミング入門者向けサイト](https://www.sejuku.net/blog/71436)
スクラム開発とは

今回はスクラム開発について調べた事をまとめてみます。

### スクラム開発とは？
###### [アジャイル開発手法](https://qiita.com/yuka-f/items/bb93337f4446114e178e)のひとつ。（小さな機能単位でリリースをする形式）
    スプリントやイベントをなんども繰り返して
    プロダクトとチームを改良しながら進めていく開発手法
##### [ウォーターフォール](https://qiita.com/yuka-f/items/bb93337f4446114e178e)開発（仕様、要件を決めてから実装⇨テストを行う）と遂になる

### スクラム開発での役割
・プロダクトオーナー
⇨開発されるプロダクトに責任あり。開発する機能の優先順位を決めて行ったりする
・スクラムマスター
⇨スクラムを回す責任あるプロダクトオーナーや開発チームの支援を行なっている
・開発チーム
⇨実際に開発するチーム。４人〜８人

### イベントについて
###### １〜２週間の期間で、あるスプリントを繰り返して開発を繰り返す
**1.デイリースクラム**
⇨[スプリント](https://it-trend.jp/development_tools/article/32-0022)の中でも毎日行うもの(朝会のようなイメージ)スプリントの中で行うことが全て書かれているスプリントバックログを使って行われる

    -スプリントバックログ内容-
    ・to do.doing.done　に別れている
    ・実現したい機能単位でタスクが洗い出されている

    -使用法-
    下記の様にタスクを動かす
    前日行った事 ＝ doing ⇨ done
    当日行う事 ＝ to do ⇨ doing

**2.リファインメント(見積もりの事)**
プロダクトオーナーが今後のやる事をプロダクトログに優先順位ごとに並べたのを
開発チームで*ポイント*という概念で見積もっていく
**-注意点-**
**認識のすり合わせをする事**
プロダクトオーナーには機能の確認を
開発チームでは開発の流れの確認を
しっかりすり合わせて確認することが大切

**3.スプリントレビュー**
⇨プロダクトオーナーの思っているものができているかを確認する事が目的
スプリントで出来上がった成果を開発チームとして見せる

**4.スプリントプランニング**
プロダクトバックログを元に次のスプリントで行う開発の計画を立てる
繰り返したスプリントによって消費できるポイントの数（ベロシティ）が見えてくるので、ベロシティを参考にしながらどこまでできるのかを話し合っていく

**5.スプリントレトロスペクティブ(振り返りの事)**
個人ではなくチームでのスプリント内で起きた良い点、悪い点を振り返る
悪かったところは次の改善点もあげる。

以上でスクラム開発、アジャイル開発についての記事です。
参考になる共有になりましたら嬉しく思います。
[VSCode拡張機能] PHP Intelephense の再インデックス実行方法

# 再インデックス実行方法
1. VSCode上で`Ctr` + `Shift` +`P` または `F1` を押してすべてのコマンドを表示
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531730/40fdad8e-b75a-e32e-feb0-49b6d2ab1a4d.png)
2. 入力欄に `intelephense: Index workspace` と入力し `Enter` キーを押下
3. 再度インデックスが構築されるので完了まで待つ

以上。

## コマンド補足
一応このコマンドについてはPHP Intelephenseの拡張機能ページ「機能のコントリビューション」タブで確認できる。
説明がかなり簡素ですが・・・
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531730/628acb9d-668d-0567-a3e8-de9be37b0e28.png)


# あとがき
これにたどり着くまで、ずいぶんと生産性の悪い作業をしておりました。
なぜかたびたび壊れるんですよね・・・Intelephenseのインデックス情報。

PHP Intelephenseを再インストールしてもうまくインデックスが再作成されずに「なぜだー！」と憤慨してましたが、これで`Undefined`の赤波線から解放されました。
PM理論にリーダシップの「P機能」と「M機能」

応用情報技術者平成28年春期 午前75

リーダに求められる機能としてPM理論がある。P機能(Performance function)が大きく，M機能(Maintenance function)が小さいリーダのタイプはどれか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/5c6be7bf-110c-27d1-42d6-777bce8012e6.png)


１、PM理論(ピーエムりろん)とは、
リーダシップは「P機能」と「M機能」という2つの柱で構成されているとする理論で、2つの機能の強弱の組合せでリーダのタイプを類型化して表します。

・P機能(Performance function)
　計画立案、指示、叱咤などによってチームの生産性を高め、目標達成に向けてチームをけん引していく能力

・M機能(Maintenance function)
　チーム構成員同士の人間関係を良好に保ち、チームワークを深める能力
各機能が強い場合を大文字(P,M)、弱い場合を小文字(p,m)で表し、その組合せで4つのタイプに当てはめます。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/5b2f6c5e-d6c0-0022-2ec1-1c5fba5883fb.png)


参照：
https://www.ap-siken.com/kakomon/28_haru/q75.html
SRI(Socially Responsible Investment)　社会的責任投資

応用情報技術者平成28年春期 午前70

SRI(Socially Responsible Investment)を説明したものはどれか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/9aecdfee-f4f6-ce86-146b-2dd62f70e3af.png)

１、SRI(Socially Responsible Investment)は、
社会的責任投資と訳され、企業への株式投資の際に、財務的分析に加えて、企業の環境対応や社会的活動(CSR活動)などの評価、つまり企業の社会的責任の評価を加味して投資先企業を決定し、かつ責任ある株主として行動する投資手法です。

２、
・企業が社会的責任を果たすために，環境保護への投資を行う。
　→×。CSR活動の説明です。

・先端技術開発への貢献度が高いベンチャ企業に対して，投資を行う。
　→×。ベンチャー投資の説明です。

・地域経済の活性化のために，大型の公共事業への投資を積極的に行う。
　→×。コミュニティ投資の説明です。


参照：
https://www.ap-siken.com/kakomon/28_haru/q74.html
shellscriptでrootで実行(sudo)を強制する

果たしてそれがいいことなのかどうかは別として。。。

## 確認環境

- Ubuntu 20.04

```bash:sudo-sample.sh
#!/bin/bash

[ "$(id -u)" != "0" ] && exec sudo "$0" "$@"
whoami
echo "$0"
echo "$@"
```
【実務未経験】初学者が0から学ぶTypeScript②

参考：[TypeScriptの型入門](https://qiita.com/uhyo/items/e2fdef2d3236b9bfe74a "Qiita"),　[TypeScript Deep Dive 日本語版](https://typescript-jp.gitbook.io/deep-dive/)
前回：[【実務未経験】初学者が0から学ぶTypeScript①](https://qiita.com/Kashiwaya123/items/9821070b1eab0cde3cdd)
※もし私の記事に誤りがありましたら、ご教示いただけますと幸いです。
##オブジェクト型とinterface構文
**interface**という構文を使うことで、オブジェクトとプロパティが持つ**値**にも型をつけれる。

>interface　：接合部分、接触面、接点、仲立ち、連絡（係）、橋渡し（役）


今回は、色々な生き物の、種類`(name)`体長`(size)`オスかどうか`(male)`の値をプロパティとしてもつ`CreatureData`というオブジェクト型を作ってみました。

```ts
interface CreatureData {
  name: string;
  size: number;
  male: boolean;
}
```

---
体長100cmのオスのマグロならこんな感じ

```ts
interface CreatureData {
  name: string;
  size: number;
  male: boolean;
}
const tuna: CreatureData {
  name: "tuna",
  size: 100,
  male: true,
}
```

---
性別を持たない体長5cmのかたつむりだと・・・
（かたつむりって性別がないんだって）

```ts
interface CreatureData {
  name: string;
  size: number;
  male: boolean;
}
const snail: CreatureData {
  name: "snail",
  size: 5,
}
//定数snailにはmaleプロパティが無い為型エラー
```

---
今度はオスかメスかわからない生き物にも型をつけたいので、`CreatureData2`というオブジェクト型も追加してみました。

さらに最初にいたマグロと同じ体長のマグロをもう1尾発見したのですが、今度のは損傷が激しく性別が判断できませんでした。このマグロは`CreatureData2`型をもつ定数`damageTuna`として`tuna`オブジェクトを代入して扱ってみましょう。

```ts
interface CreatureData {
  name: string;
  size: number;
  male: boolean;
}

interface CreatureData2 {
  name: string;
  size: number;
}

const tuna: CreatureData {
  name: "tuna",
  size: 100,
  male: true,
}
const damageTuna: CreatureData2 = tuna;
```

**負傷したマグロ****「**定数`damageTuna`は`CreatureData2`型なんだから`CreatureData`型の定数`tuna`を代入したら型エラーになるんじゃ？（かたつむりの例でダメって言ってなかった？）**」**

TypeScriptは**構造的部分型**っていう仕組みを採用していて、この場合`CreatureData`は`CreatureData2`の**部分型**として問題なく動作するんだって！！

代入する定数の型が、新しく宣言した定数の部分型に当たる場合はこんな使い方ができるみたい。

次回: [【実務未経験】初学者が0から学ぶTypeScript③](https://qiita.com/Kashiwaya123/items/e68fb85d8558bd7f9c51)
物体検出とSemanticSegmentationと深度推定の関係がわからなくなってきた？？？

#概要
「物体検出」と「SemanticSegmentation」と「深度推定」の関係がわからなくなってきた。

物体検出
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342207/0f0462af-cce6-4d17-a38a-69b4732d216e.png)
（出典:http://image-net.org/challenges/LSVRC/2014/)

SemanticSegmentation
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342207/6f430f45-1005-1270-428a-0ab95816d79a.png)
(出典；http://host.robots.ox.ac.uk/pascal/VOC/voc2012/segexamples/index.html）

深度推定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342207/5021f785-2046-d30c-4977-f5346f86afea.png)
（出典：https://github.com/iro-cp/FCRN-DepthPrediction）

#わからないこと
##物体検出 ⇒　SemanticSegmentation
物体検出の結果をもとに、というか、物体検出し、それの表現としてSemanticSegmentationがあるというと多少語弊があるかもしれないが、ここの関係はいいとして。。。

##SemanticSegmentation　⇒　物体検出
SemanticSegmentationで、ピクセルレベルまで、分析がしっかりできているが、
これを、物体検出に再度反映して、
物体検出の精度に貢献できないのか:question:【疑問１】

##深度推定 ⇒　SemanticSegmentation
SemanticSegmentationの最初のほう(2015年？）のネットワークモデルであるU-NETでは、深度推定は利用されていないが、その後のSemanticSegmentationの発展版では、深度推定の技術が使われている:question::question::question:【疑問２】

##SemanticSegmentation ⇒深度推定
一旦、SemanticSegmentationで処理をして、それをもとに、深度推定したりしないのか:question:【疑問３】

##SemanticSegmentation の使い道
SemanticSegmentationは、ピクセルレベルで区別して、
さて、
ユーザに対して、どのような機能が提供できているのか:question:【疑問４】
何に使えるの:question::question::question:【疑問５】
既に何に使えているの:question:【疑問６】

#上記疑問への回答
逐次（多少、答えがわかったら）、別途、記載します。

#まとめ
特にありません。コメントなどあればお願いします。
PHPでコードを書いていたら突如画面が真っ白になった時の話し

# はじめに

釣りみたいなタイトルですがパソコンの不備などで起きた事象ではなく、しっかりとプログラミングを書いてエラーが発生した事で起きた現象です。笑

#原因
結論から申しますと、
この現象の原因は、**exit文を記述する位置に問題がありました。**

エラー内容は以下の通り日本語にすると
「fetchというメンバー関数はありません」と怒られています。
（おそらく当時のコードはexit文の後にDB操作をしていたのでしょう）

```
Fatal error: Uncaught Error: Call to a member function fetch() on bool in 
階層フォルダ\階層ファイル Stack trace: #0 {main} thrown in 
階層フォルダ\階層ファイル on line 21

```

#exit文とは
スクリプトを強制終了させる文です。

```
exit;//処理の終了
exit ('ここで終了');//処理の終了
exit (0);//処理の終了
```

exit文は、スクリプトの処理を「exit;」と記述した箇所で終了させます。exitは言語構造です。文字列や数値などのステータスを指定しない場合は、「 ( ) 括弧 」無しで記述できます。

私は1番上以外の記述はした事がないです。

#解決策

**ブラウザの画面が真っ白になった場合は、exit文の位置をみてみましょう。**

見方は簡単でその後の処理は行われないと考えればOKです笑

**※記述した箇所でスクリプトが強制的に終了しているため、コードの書き方によっては、エラー文が発生せずにただただ画面が真っ白い状態になる事もあると思います。**

#焦らないで
私は当時PHPを触り始めて間もない頃だったので、ブラウザと一緒に頭も真っ白になりました。

ただし、落ち着いて起きている現象やエラーを理解して行けばその先には必ず成長が待っています。今回は私自身過去のエラーの中でインパクトのあったものを取り上げましたが、**課題解決の根本的な方法は一緒だと思います。**

私も他人いとやかく言える技術レベルではありませんが焦らず一歩づつ共に成長していきましょう。




#参考URL

[URL]https://teratail.com/questions/11286
【Mac】基本ショートカットキー

Macを操作するときの基本ショートカットキー操作です。
-
ほぼ全てのエディターで共通だと思われるキー操作です。まずはこれを叩き込む。


| 操作                 | 内容                                      | 
| -------------------- | ----------------------------------------- | 
| command + 矢印       | 文末まで移動                              | 
| ctrl + x             | カット                                    | 
| 単語をダブルクリック | 1単語を指定                               | 
| トリプルクリック     | 1行を指定                                 | 
| Ctrl + v             | 貼り付け                                  | 
| Ctrl + a             | 全選択                                    | 
| Ctrl + s             | 上書き保存（タブに*がついていたら未保存） | 
| Ctrl + w             | 閉じる                                    | 
| Ctrl + z             | 一つ戻る                                  | 
| Ctrl + Shift + z     | 一つ進む                                  |
Bulmaをカスタマイズしてビルドする

# Bulmaをカスタマイズしてビルドする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304938/65573558-0911-e20c-d85a-ba3af8bb2ec5.png)
私は、Bulmaのシステム自体は好きなのですが、角が丸すぎる点が気に入りません。

幸い、Bulmaは、ユーザーがかんたんにカスタマイズできるよう設計されていますので、
角丸を小さくした、カスタムBulmaのCSSファイルを作っていきます。

# ①Bulmaのダウンロード
## Bulmaのダウンロード方法１・zipでダウンロード（おすすめ）
git clone はドキュメントなどついてくるので、コンパイルするだけなら公式のzipがおすすめです。

Tags · jgthms/bulma
https://github.com/jgthms/bulma/tags

から好きなバージョンを選んでダウンロード＆展開します。

## Bulmaのダウンロード方法２・git clone
ドキュメントなどついてくるのでおすすめしません。

```bash
#全部クローン（重い）
git clone https://github.com/jgthms/bulma.git
cd bulma
git checkout -b my0.9.1 refs/tags/0.9.1
#or
#特定のバージョンのみクローン（軽い）
git clone https://github.com/jgthms/bulma.git -b 0.9.1 --depth 1
cd bulma
```

# ②npm install で開発に必要なモジュールをインストール

```bash
npm install
```

# ③Bulmaをカスタム
bulma.sassを開き、Bulmaをカスタムしていきます。
※bulma-rtl.sassは、右から左に表示する言語用(RTL:Right To Left)

↓ここにカスタムできるsass変数の一覧があります。これを参考に編集していきます。
With node-sass | Bulma: Free, open source, and modern CSS framework based on Flexbox
https://bulma.io/documentation/customize/variables/

今回は、Bulmaの角丸を修正したいため、radiusがらみの変数をカスタマイズしてみました。

```sass:myBulma.sass
@charset "utf-8"

// 追記 ///////////////////////////
$radius-small:      1px;
$radius:            2px;
$radius-large:      3px;
///////////////////////////////////

/*! bulma.io v0.9.1 | MIT License | github.com/jgthms/bulma */
@import "sass/utilities/_all"
@import "sass/base/_all"
@import "sass/elements/_all"
@import "sass/form/_all"
@import "sass/components/_all"
@import "sass/grid/_all"
@import "sass/helpers/_all"
@import "sass/layout/_all"
```

# ④Bulmaをビルド

```bash
#ビルドしたcssを出力する./cssフォルダに、もともとのBulmaが入っているので削除
npm run clean
#ビルド
npm run build
# RTLバージョンをコンパイルしたい人は以下も実行
# npm run rtl
```
成功していれば、bulma.css、bulma.css.map、bulma.min.cssの３つのファイルが生成されます。
<img width="200" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304938/406a537e-99c8-24e2-b2e6-904757656ea8.png">
このbulma.cssもしくはbulma.min.cssをサイトに読み込めば、カスタマイズしたBulmaをサイトに適応できます。

# 意図したとおりに変更されているか確認

ルートに以下の簡単なhtmlファイルを作り、動作を確認してみます。

```html:test.html
<html>
  <head>
    <meta charset="UTF-8">
    <link rel="stylesheet" href="./css/bulma.min.css">
    <!-- <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bulma@0.9.1/css/bulma.min.css"> -->
  </head>
  <body>
    <div>
      <div class="column">
        <a class="button is-primary">Button</a>
      </div>
  </body>
</html>
```

Before: 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304938/65573558-0911-e20c-d85a-ba3af8bb2ec5.png)
After:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304938/b467838f-748b-908b-52cd-669fd1c196c9.png)

Material Designのようなスッキリしたボタンになりました。
色なども変更できますので、いろいろ試してオリジナリティのあるサイトを作る助けになればと思います。
Next.jsでClassless CSSを適用する

# Next.jsでClassless CSS
Next.jsでClassless CSSを適用する機会があったので記しておきます。

## Classless CSSとは
class属性（やid属性）をセレクタで使用してスタイルを適用するのがCSSの基本ですが、
Classless CSSはclass属性を使用せずhtmlのタグを使用するだけでスタイルを適用することができるCSSのフレームワークです。

種類もかなり豊富です。
https://github.com/dbohdan/classless-css

Classless CSSのいいところは手軽に使うことができる点です。
htmlのタグを書くだけなのでクラス名やコンポーネントの使い方を覚える必要がありません。

以下、[new.css](https://newcss.net/)の例ですがタグに直接スタイルが適用されています。

<img title="new.css" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137875/59a1335f-ee65-3295-2bad-1fdf5f82af7c.png" width="75%">

さっそく次から使ってみます。


## ①　グローバルに適用

まずは`yarn`で持ってきます。

```sh
yarn add @exampledev/new.css
```

Next.jsでページ全体に適用させたい時は`pages/_app.tsx`に以下を記載します。

```tsx:_app.tsx
import { AppProps } from 'next/app';
import '@exampledev/new.css';

export default function App({ Component, pageProps }: AppProps) {
  return <Component {...pageProps} />;
}
```

これでどのページのhtmlタグにもスタイルが適用されます。

_app.tsxについては以下が詳しいです。

- https://tyotto-good.com/blog/next-document-app
- https://www.kohei.dev/posts/7-tips-of-next-js-9-with-typescript?hl=ja-JP

## ②　個別ページに適用

個別のページだけに適用したい場合、そのままimportしようとしても以下のエラーが発生します。

> Global CSS cannot be imported from files other than your Custom <App>. Please move all global CSS imports to pages/_app.tsx. Or convert the import to Component-Level CSS (CSS Modules).

グローバルに適用するCSSは_app.tsxで読み込めということらしいです。
適用するcssファイルをcssを配置するフォルダに持ってきて使う、とかで回避できそうですがその方法はちょっと微妙。

なので結局`next/head`の\<Head>コンポーネントを使って\<head>の中身を変更することでスタイルを適用させることができました。

```tsx:sample.tsx
import Head from 'next/head';

const Sample = () => {
  return (
    <html>
      <Head>
        <link
          rel="stylesheet"
          href="https://cdn.jsdelivr.net/npm/@exampledev/new.css@1/new.min.css"
        />
      </Head>
      <body>
        <header>
          <h1>About</h1>
        </header>
        <div>
          <details>
            <summary>Sample</summary>
            <p>This is sample.</p>
          </details>
        </div>
      </body>
    </html>
  );
};

export default Sample;
```

## まとめ

結局細かい調整したくなるので普通に.css作るかstyled-componentのようなCSS in JS使うケースが多くNext.jsでClasslessCSS使うケースってあまり多くないのかなと思いました。

ただ今回はたまたまNext.jsかつClassless CSS（の②のケース）で実装する必要があったのでちょっと悩みながら進めたのですが、もっと綺麗なやり方があれば教えていただきたいです。
アソシエーション（1対1）！！

#アソシエーション？

簡単に説明するとモデルを利用したテーブル同士の関連付けのことですね。
テーブル同士で関連付けておき、一方のモデルからもう一方のモデルに
アクセスできるようにするためということですね。

#関連付けを行う理由
Railsでは、「関連付け(アソシエーション: association)」とは2つの
Active Recordモデル同士の繋がりのことですね。

2つモデルの間には関連付けを行なう必要がありますが、
その理由を知っていますか？

それはですね、関連付けを行う事でコードの共通操作をより
シンプルで簡単にできるからなんです。

#アソシエーション（1対1）定義の際に使用するメソッド

###has_oneメソッド

**アソシエーションが１対１の時に使われます。**
**注意点としては、親モデル側に「has_one」の記述を、
子モデル側に「belongs_to」を書きます。**

<font color="Tomato">「belongs_to」メソッドについては下記のURLに説明がありますので、
そちらを参考にして下さい。今回は説明を省きます。</font>

[belongs_toメソッド参考記事](https://qiita.com/Lotuswhite/items/3812a8e08ba250a1d8d3)

まとめると下記のようになりますね。

![has_one.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/762918/97a04c98-4c18-dc0c-368a-25c3eb3eae0e.png)



今回、説明する上で下記のアソシエーション（関係）で記述例を
載せていきます。

                    userとaddress	       １対１



#アソシエーションの定義記述方法

先に**Userモデル**の記述例を載せていきます。

```例:/models/user.rb
class User < ApplicationRecord

   has_one :address
end
```

書き方としましては、has_one :モデル名（単数形）
**<font color="Orange">今回は「１対１」のためモデル名は単数形になります。</font>**

Userモデルの記述は以上です。

次は、**addressモデル**の記述にいきましょう。

```例:/models/address.rb
class Address < ApplicationRecord

　　belongs_to :user

end
```

書き方としましては、 belong_to :モデル名（単数形）　になります。

これで、Userモデルとaddressモデル間のアソシエーションができましたね。

#まとめ
**「１対１」のアソシエーションには、has_oneを用いましょう！！
「１対１」を記述する際は、「１対多」・「多対多」などのように
 モデル名が複数形ではなく、単数形で記述するのであまり気を付けなくても
大丈夫ですね笑**

これまでで、「１対１」・「１対多」の説明をさせて頂いたので残りは
「多対多」になりますね。

***これで「１対１」のアソシエーションの定義の仕方などわかって頂けたら嬉しいです。
ご覧頂きありがとうございました。***

####以上。
3軸ロボットアームの順運動学・逆運動学

このようなロボットを考える．座標系は下図の通り．

![ぷにぷに数式解説画像.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149593/67f2b430-60c7-a071-9c79-3ecdad009510.png)
<font color="red">※　軸1の中心をロボット原点とする．</font>


# 順運動学
ロボットの3軸それぞれの番号を$n$とする．

```math
n = 0,1,2
```

このとき，根本のヨー角に取り付けられたモータを0番目，根元のピッチ角に取り付けられたモータを1番目，残りのピッチ角に取り付けられたモータを2番目とする．



各軸の現在角$\theta_{n}$，リンクの長さ$L_1$，$L_2$が既知であり，ロボット原点からアーム先端までの距離$\mathbf{d}=[d_{x},d_{y},d_{z}]$を求めた場合は以下の順運動学式で求められる．

```math
\begin{array}{}

L_{xy} &= L_1 \cos{\theta_1} + L_2 \cos{(\theta_1 + \theta_2)}\\
d_{x} &= L_{xy} \cos{\theta_0} \\
d_{y} &= L_{xy} \sin{\theta_0} \\
d_{z} &= L_1 \sin{\theta_1} + L_2 \sin{(\theta_1 + \theta_2)}

\end{array}
```

# 逆運動学

逆に，ロボット原点からアーム先端までの距離$\mathbf{d}=[d_{x},d_{y},d_{z}]$から各軸の角度$\theta_{n}$を求めたい場合は以下の逆運動学式を用いる．

```math
\begin{array}{}
\theta_{0} & = \; \; \; 
\tan^{-1}(\frac{d_{y}}{d_{x}}) \\

\theta_{1} & = 
-{\cos^{-1}(\frac{d_{x}^2 + d_{y}^2  + d_{z}^2 - L_1^2 - L_2^2 }{2L_1L_2})}\\

\theta_{2} & =
-\sin^{-1}(\frac{L_1 + L_2\cos(\theta_{1})}{\sqrt{d_{x}^2 + d_{y}^2  + d_{z}^2}}) + \tan^{-1}\frac{d_{z}}{\sqrt{d_{x}^2 + d_{y}^2}} + \frac{1}{2}\pi
\end{array}
```
ユーザー画像編集時にプレビューを表示する

#はじめに

ユーザーの画像変更時に、ファイルは上げたもののはっきり変更されてるのかどうかが分かりづらかったため、jQueryを使ってうまいことプレビュー表示させるようにした（フロント苦手、、、）。

ruby 2.6.3
rails 6.0.3
アップローダー ActiveStorage
jQuary

#概要

###やりたい挙動
ファイルアップロード前：既にユーザーに紐づいている画像をプレビュー表示
ファイルアップロード後：既にユーザーに紐づいている画像の表示を非表示にして、
　　　　　　　　　　　　新たな画像ファイルをプレビュー表示

###実装ファイル一覧
users
①edit.html.slim
②_form.html.slim（form部分だけ切り出して使用。全てeditに書いても問題ありません。）
③javascripts/app/users/edit.js


#実装

```edit.html.slim
- content_for :title
  = I18n.t 'helpers.title.edit', model: t_model(:user), name: @user.name

== render 'form', model: @user
```

```_form.html.slim
= render 'shared/validation_messages', model: model
= simple_form_for model, html: { class: 'form-horizontal js-editing' } do |f|

  .page-content.container.profile_edit
    .card
      .card-header
        h5.card-title
          | 基本情報
      .card-body.p-3.ibox-content
        .no-padding.no-margins
          .circle-avatar
            img src="#" id="avatar_img_prev" class="d-none"
            - if model.image.attached?
              = image_tag(model.image, class: 'avatar_present_img')
            - else
              = image_tag("defaurt-user.png", class: "avatar_present_img")
          |
          br
          = f.file_field :image, id: "post_img"

          = f.input :name, placeholder: '山田 花子'
　　　　　　/ 以下略
```




```javascripts/app/users/edit.js
/* global $ */

$(function() {
  function readURL(input) {
    if (input.files && input.files[0]) {
      var reader = new FileReader();

      reader.onload = function (e) {
        $('#avatar_img_prev').attr('src', e.target.result);
      };
      reader.readAsDataURL(input.files[0]);
    }
  }

  $("#post_img").change(function(){
    $('#avatar_img_prev').removeClass('d-none');
    $('.avatar_present_img').remove();
    readURL(this);
  });
}());

```

#やっててつまづいたとこ

・slim記法での`img`の書き方は`img src: "~~", id: "~~"`ではなく、`img src="~~" id="~~"`と書く（滅多に書かないから分からなかった、、、）。

・`img src="#" id="avatar_img_prev" class="hidden"`のclassがうまく反映されなかったため、`class="d-none"`に変更　→　効いた

・jQuaryをform.slim上に書いてうまく反映されなかったため、ちゃんとjsファイルに書き直した。

#参考

[【Rails5】アップロードした画像を即時プレビューする](https://remonote.jp/rails-image-preview-jquery)

[Webアプリ tsunagaru をリリースしました [4] ActiveStorage から CarrierWave への移行](https://note.com/artefactnote/n/n71fa2f4c8b2b)

[Bootstrap4 displayクラスの使い方を徹底解説](https://webst8.com/blog/bootstrap4-display/)

[html.erbファイルでjs直書きでその中にrubyのコードを埋め込んでいる状態のものをslimに置き換えるときの書き方](https://qiita.com/masamitsu-konya/items/84ef7a63333b66713512)
【Unity】他のゲームオブジェクトの子オブジェクトをスクリプトで操作する方法

![ezgif.com-gif-maker.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/688851/382153b7-1b18-9554-aa1b-7efbe7587bdb.gif)

今回はゲームオブジェクトから他のゲームオブジェクトの子オブジェクトの色を変えてみる。


![“shot” 2020-10-09 1.06.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/688851/8a933f9e-87fc-8cdd-6071-f16daf12d776.png)

最初に空のゲームオブジェクトを作る。
キューブを作り、さらにその下にキューブをつける。
名前は「cube1」とした。

スクリプトを書く。
今回はインスペクターで指定したオブジェクトの子オブジェクトのRendererにアクセスする。

```
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class TestScript : MonoBehaviour
{

    public GameObject obj;

    Renderer renderercolor;

    void Start()
    {
        renderercolor = obj.transform.Find("cube1").gameObject.GetComponent<Renderer>();
    }

    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            renderercolor.material.color = new Color(1f, 0.0f, 0.0f, 0.0f);

        }
    }
}
```


```
renderercolor = obj.transform.Find("cube1").gameObject.GetComponent<Renderer>();
```

ここの部分でpublicで指定したゲームオブジェクトの子オブジェクトを見つけてRendererをGetComponentし、変数に入れる。Find（""）のカッコの中にはアクセスする子オブジェクトの名前を入れる。


できたら空のゲームオブジェクトにつける。

![“shot” 2020-10-09 1.07.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/688851/6443c163-bc68-03d7-a3a4-608cf98c9785.png)


再生し、クリックすると赤色になる。
キューブにマテリアルをつけるのを忘れずに！
[rails]タグのランキング機能



今日ポートフォリオにタグ付け機能を追加し、ランキングを作ったので
アウトプットします。

タグ付け機能はformオブジェクトを使いました。
まずtweetコントローラーにこのように記述します。

 ```tweets_controller.rb
def rank
   @tag_ranks = TweetTag.find( TweetTagRelation.group(:tweet_tag_id).order('count(tweet_tag_id)desc').limit(4).pluck(:tweet_tag_id))
 end
```

pluckって何・・・・って思ったので調べてみると
公式では
pluckは、1つのモデルで使用されているテーブルからカラム (1つでも複数でも可) を取得するクエリを送信するのに使用できます。引数としてカラム名のリストを与えると、指定したカラムの値の配列を、対応するデータ型で返します。

 だそうです。

pluckの引数にtweet_tag_id（これは中間テーブルのタグのカラム）をとることで中身が取得できます。


次にviewです tweetsの配下にファイルを作ってこのように記述してください

```rank.html.erb
<div class="rank-tag-all">
        <% @tag_ranks.each.with_index(1) do |tag,i| %>
          <div class="rank-tag-num">第<%= i %>位 </div> 
          <div class="rank-tag"><%= tag.name%></div>
        <%end%>
</div>

```

with_index(1)を書いて第二引数をとることで順位が表示されます。



雑談
かなり眠いので簡素的にかきました。。。
もっと早い時間にqiitaを書く予定を立てようと思います...
:nxdomainのエラーをなんとかしたときの備忘録

```
[error] Postgrex.Protocol (#PID<0.3778.0>) failed to connect: ** (DBConnection.ConnectionError) tcp connect (postgres:5432): non-existing domain - :nxdomain
```
をなんとかする方法についてちょっと手こずったので書きます。

最初は

```elixir
  1 import Config
  2
  3 config :milk, Milk.Repo,
  4   adapter: Ecto.Adapters.Postgres,
  5   username: "postgres",
  6   password: "postgres",
  7   database: "milk_dev",
  8   hostname: "postgres",
  9   port: 5432,
 10   pool_size: 10
```

こんな感じで書いていたのですが、上記のエラーがずっと発生してしまっていました。
自分の`/etc/hosts`にはlocalhostに関する記述くらいしか書いていないせいなのか、

```elixir
  1 import Config
  2
  3 config :milk, Milk.Repo,
  4   adapter: Ecto.Adapters.Postgres,
  5   username: "postgres",
  6   password: "postgres",
  7   database: "milk_dev",
  8   hostname: "localhost",
  9   port: 5432,
 10   pool_size: 10
```

hostnameをこのように変更すると動くようになりました。
`/etc/hosts`とかhostnameがポイントかもしれません。
（babel7）トランスパイルでCannot read property 'bindings' of nullと出る

下記のエラーが npm run watch ーpollで表示される

```
npm run watch --poll

ERROR in ./resources/js/app.js
Module build failed (from ./node_modules/babel-loader/lib/index.js):
TypeError: /Users/project/resources/js/app.js: Cannot read property 'bindings' of null
    at Scope.moveBindingTo (/Users/project/node_modules/@babel/traverse/lib/scope/index.js:929:13)
    
```

この記事を調べると、
https://stackoverflow.com/questions/52092739/upgrade-to-babel-7-cannot-read-property-bindings-of-null

先のトラブルシューティングで入れたライブラリが古かったようで、

```
npm install babel-preset-env --save-dev
```

がまずかったようでした。

## 対応: アンインストールと.babelrcを編集

アンインストール

```
npm uninstall babel-preset-env
```
.babelrcを編集

```.babelrc
{ "presets": ["@babel/preset-env"] }
```

```
npm run watch --poll

       Asset     Size   Chunks             Chunk Names
/css/app.css  178 KiB  /js/app  [emitted]  /js/app
  /js/app.js  1.5 MiB  /js/app  [emitted]  /js/app


```
VueでURLをフォームに入力してリスト表示したもののリンクを有効にしたい！！

こんばんは！
今日は、<b>個人的に面白いこと</b>を学んだので、備忘録も兼ねて、まとめてみます！
まだまだ初心者の身なので、本当に、<b>個人的に</b>面白いことですよ！

で、その面白いことっていうのが、タイトルにあるように、
<b>「URLをフォームに入力してリスト表示したものを、クリックしたら、ちゃんとそのURLのページ(サイト)に遷移させたい！！っていう時のやり方」</b>
です！

※Vue CLIを利用しています。

# 完成形
まず、実装完了した完成形からお見せします。
以下の画像のように、下線付きでURLが表示されるようにします！
上部の入力フォームからURL等入力して、直下にリスト表示するという仕様です。デザインの関係でテーブルになってますが、リストでも同じです。

![スクリーンショット 2020-10-08 23.09.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619752/f3de9a68-d728-d75f-5be5-caa2bebb5958.png)

URLに下線が入っていて、検索できるようになっていますね。

# 実装方法
それでは、実装方法を記述していきます。
実装にあたって、以下の投稿を参考にしました！
<a href="https://qiita.com/ITmanbow/items/860bfd40f2e355b1ede5">
v-bindでaタグの属性値を動的に表現する。 ❏Vue.js❏</a>

ディレクティブの中でも、<b>引数を取ることができる</b>v-bindを利用します。
<a href="https://jp.vuejs.org/v2/guide/syntax.html#%E5%BC%95%E6%95%B0">Vue.js公式テンプレート構文</a>

## 通常の場合
HTML部分では、

```HTML
<a v-bind:href="url"> ... </a>
```
のように、記述します。
hrefという引数を取っています。
この引数hrefに、urlの値を渡します。
urlの値を渡すことで、リンクを有効にすることができるという仕組みです。
いつもの、HTMLでURLを渡す時と同じですね。

```HTML
<a href="https://google.com">Google</a>
```
aタグのhrefにURLを記述し渡すことで、リンクが有効になりますよね。
それと同じことをVueでやっているのです。
(v-bindでは、省略記法で、:hrefで表記可能です。)

次に、Vue部分では、

```Vue.js
new Vue({
  el: "#app",
  data: {
    url: "https://google.com"
  }
})
```
のように記述すれば、URLがクリックしたら、反応するようになります。

## ユーザがフォームに入力したURLの場合は？？
今回、私が実装したいのは、上で例示したような書き方では実装できませんでした。
ユーザによる入力なので、ユーザによって使用するURLも異なります。
そんな時、どうするのか...
まず、Vue部分は、一部省略していますが、以下になります。
ここでは、url関連部分がどうなっているのかだけ注目して頂いたら良いかなと思います。

```Vue.js
export default {
  // 省略
  data() {
    return {
      name: '',
      area: '',
      progress: '',
      url: '' // ここ注目！
    }
  },
  methods: {
    onclick() {
      this.$store.commit('addCompanies', {
        company: {
          name: this.name,
          area: this.area,
          progress: this.progress,
          url: this.url // ここ注目！
        },
      })
      this.name = '';
      this.area = '';
      this.progress = '';
      this.url = ''; // ここ注目！
    },
  // 省略
}
```
一般的な、フォーム入力からリストに追加し、表示するための処理ですね。
そして、肝心なHTML部分が以下になります。

```HTML
<a :href="company.url" target="_blank" rel="noopener noreferrer">
  {{ company.url }}
</a>
```
aタグで囲われた、Mustache構文(二重中括弧)で記述されたデータバインディング部分に注目して下さい。
データバインディングは、プロパティの値を展開する際に行いますよね。
ユーザが入力したURLを、urlプロパティを展開することで、プロパティの中身を取り出します。
だから、リストに<b>テキスト</b>として、<b>表示される</b>ようになるのです。

このURLリンクを有効にするために、周りのaタグがあるのです。
それでは、aタグ部分に注目してみて下さい。
最初に例示したように、v-bind:hrefが省略記法で書かれているのがわかります。
hrefは、引数でしたね。
今回は、この引数hrefに、ユーザ任意のURLの値を渡す必要があります。

その方法は、
<b>Mustache構文で、URLをテキスト展開するために利用した、company.urlプロパティを引数hrefに渡すのです。</b>

これで、ユーザが入力した任意のURLでリンクが有効になります。

データバインディングにおいて、動的に表示を変化させる時と原理は同じ。
今回の例で言うと、Mustache構文内のcompany.urlプロパティの値が変更されれば、表示される値も変わりますよね。

URLのリンクの有効化でも、
<b>company.urlプロパティが変更されると、hrefに渡すURLの値が変わり、遷移させるURLも変える必要がありますよね。</b>

ユーザが値を入力し、submitすることで、nullになっていたプロパティにユーザが入力した値が渡され、そこで、プロパティが変更されます。

これで、任意のURLもリンクを有効にすることが無事、できました！
めでたし、めでたし！

長くなりましたが、ここまで読んでくださり、ありがとうございました。
何かあれば、コメントでお願い致します。

# 参考資料
<a href="https://qiita.com/ITmanbow/items/860bfd40f2e355b1ede5">
v-bindでaタグの属性値を動的に表現する。 ❏Vue.js❏</a>

<a href="https://jp.vuejs.org/v2/guide/syntax.html">Vue.js公式テンプレート構文</a>
AWS香港リージョンをつかってEC2からS3にファイルを送信時にエラーが発生して解消した話

タイトルの通りです。

#実行コマンド
```
aws s3 cp /home/ubuntu/gomi.txt s3://bucket-name/gomi.txt
```
#エラー

```
The ap-east-1 location constraint is incompatible for the region specific endpoint this request was sent to
```

#修正内容
sourceとtargetを明示する必要があるようです。

```
aws s3 cp /home/ubuntu/gomi.txt s3://bucket-name/gomi.txt --region ap-east-1 --source-region ap-east-1
```
#参考資料
https://github.com/aws/aws-cli/issues/4174
karabinerが反応しなくなったときの再起動スクリプト

# 背景
Macを起動時、まれにkarabinerが反応しなくなる

# 原因?
↓のようにEventでエラーがでてる。
![スクリーンショット 2020-10-09 0.25.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12759/94541dbf-beb5-99ee-e54e-f73262e32eeb.png)

# 対策
ネットで拾ってきたスクリプトを入力すると解決する。
同時にDockerがハングアウトするから、どうも、Dockerの立ち上がりとブッキングしているっぽい。

```shell
KARABINER_ELEMENTS_PATH="/Applications/Karabiner-Elements.app"

echo "Killing Karabiner & associated processes"
sudo pkill -f Karabiner -9 # Kills the main Karabiner UI
sudo pkill -f karabiner -9 # Kills the background processes

echo "Starting Karabiner-Elements... It may be up to a minute after opening Karabiner-Elements before your custom keys activate."
open $KARABINER_ELEMENTS_PATH # Open it back up!
```
【Unity】インスペクターで指定したオーディオをマウスクリックで再生する方法（自分用）



```
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class TestScript : MonoBehaviour
{
    AudioSource audioSource;

    public AudioClip sound;


    void Start()
    {
        audioSource = GetComponent<AudioSource>();
    }

    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            audioSource.PlayOneShot(sound);
        }
    }
}
```


AudioSource型の変数とオーディオのデータを格納する変数をpublicで作る。
その後Getcomponentし、左クリック処理の中に

```
audioSource.PlayOneShot(sound);
```
を入れれば左クリックをしたらインスペクターで指定したオーディオが起動する。
以上。
Railsで簡単にプルダウンを作る方法

#簡単にプルダウンを作る方法
##使用するディレクトリ(私の場合)⚠️命名はご自身で
* ビューファイル(new.html.erb)
* コントローラー(mentors.controller.rb)
* モデル(sukill_id.rb)

#目指す完成形
![95c0f8244478d3536e6dd971b06a4a0f.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/725167/6a3c13ed-7a4f-50c3-c242-f44aa4eb0877.png)

#まずビューファイルから(どこからでもいい)
##1.こういうパターンや
```java:new.html.erb
<select>
          <option>チャットするユーザーを選択してください</option>
          <option>ユーザー1</option>
          <option>ユーザー2</option>
        </select>
```
##2.こういうパターンもある
```java:new.html.erb
  <div class="mentors-detail">
   <div class="form">
     <div class="weight-bold-text">
       スキル
       <span class="indispensable">必須</span>
     </div>
     <%= f.collection_select(:skill_id, Skill.all, :id, :name, {}, {class:"select-box", id:"mentor-skill"}) %>
　　　</div>
```
##今回は2の<font color="Red">f.collection_select</font>を使用してプルダウンを作成します！
###6行目で「:skill_id, Skill.all」となっていますがこれは<font color="Red">選択したいプルダウンの内容は「skill_idモデル」から</font>選ぶわけなので次はモデルの中身を書いていきます！
# モデル作成
```java:skill_id.rb
class Skill < ActiveHash::Base
  self.data = [
    { id: 1, name: '--' },
    { id: 2, name: 'HTML•CSS' },
    { id: 3, name: 'Ruby' },
    { id: 4, name: 'Javascript' },
    { id: 5, name: 'PHP' },
    { id: 6, name: 'Python' },
    { id: 7, name: 'SQL' },
    { id: 8, name: 'GO' },
  ]
end
```
##あとはコントローラーにnewアクションやらcreateアクションを記述してルーティングやパスをrails routesで確認しながら記述すれば出来上がり！
![95c0f8244478d3536e6dd971b06a4a0f.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/725167/e2c3c049-6d7c-f342-08e2-8ba8c04e7f9a.png)
#まとめ
#CSSの部分は省きましたが多分こんな感じ(ここはご自身でやってみてください)
```java:new.css

.mentors-detail {
  display: flex;
  justify-content: space-between;
  padding: 2vh 0;
}

.mentors-detail>.form {
  width: 300px;
  padding: 2vh 0;
}

.select-box {
  margin: 2vh 0;
}
```
##現場からは以上です！
【備忘録】Next.jsのアプリを動かしたときにnpm script使用時の警告

#プログラミング勉強日記
2020年10月9日
nodistの環境でアプリを起動したときに警告が出てしまっていたのでそれの解決方法を記録する。

#警告の内容
　`npm run dev`で実行すると以下のような警告が出てしまった。警告を無視しても動かすことはできた。

```
PS C:\Users\myblog> npm run dev
npm WARN lifecycle The node binary used for scripts is C:\Program Files (x86)\Nodist\bin\node.exe but npm is using C:\Program Files (x86)\Nodist\v-x64\12.18.4\node.exe itself. Use the `--scripts-prepend-node-path` option to include the path for the node binary npm was executed with.

> myblog@0.1.0 dev C:\Users\myblog
> next dev
```


#解決方法
　警告メッセージのところに`--script-prepend-node-path`のオプションを使うとあるように使ったら見事に警告が消えた。

```
npm config set scripts-prepend-node-path true
````
Rubyの&って真逆の2つの意味を持つよねって話

ここでの&はビット演算子ではなくProc関連で出てくるアレのことです。
知ってる人にとっては当たり前のことかもしれませんが、自分的にわかりやすい（それでいて他にこういう書き方をしてる記事がなかった）ので書き留めておきます。

# そもそも&と言えば
ブロックをProcオブジェクトに変換する記法です。最も単純な例で

```Ruby
def test(&fun)
    fun.call
end

test { p 1 } #=> 1
```

これは1と表示されます。
・ブロック { p 1 } がfunに渡される
・このfunは&によってProcオブジェクトに変換される。
・そのため、funはProcのメソッドの1つであるcallを用いた呼び出しを受け付けるようになる
という算段ですね。

ちなみに本題からは外れますが、Rubyでは
・「yieldとは&引数で生成されたProcを.callする略記法である」
・「yieldに渡す&引数Procはメソッド定義行で省略して構わない」
と定められていますので、上記は

```Ruby
def test
    yield
end

test { p 1 } #=> 1
```
でもOKです。しんぷる！

# では、次は？

```Ruby
def test(&fun)
    fun.call
end

proc = Proc.new { p 1 }
test &proc #=> 1
```

これも1と表示されます。
ここで最初私は、
「（この部分は間違いです）&はProcへの変換のおまじないだから、もともとProcのものに&をつけても相変わらずProcのままで、&procでも&funでもProcオブジェクトが渡されてるのかな」
と思いました。

上記が正しければ、片方の&を取り払っても問題ないはずですね。ずっとProcが渡されているはずですから。
実際にやってみると…

```Ruby
def test(fun)
    fun.call
end

proc = Proc.new { p 1 }
test &proc
#=> wrong number of arguments(given 0, expected 1)
```

あれ？エラーですね。
何が起こったのでしょう。試しに&procのクラスを調べてみましょうか。

```Ruby
proc = Proc.new { p 1 }
p proc.class #=> Proc
# p (&proc).class #=> syntax Error
```

どうやらprocと&procは別物。&procは.classそのものを受け付けないようです。
それもそのはず。実は、&procは__オブジェクトですらない__からです。
[Ruby公式ドキュメント](https://docs.ruby-lang.org/ja/latest/class/Proc.html)には、

>ブロック付きメソッドに対して Proc オブジェクトを `&' を指定して渡すと
>呼び出しブロックのように動作します。

と、ちゃんと書かれておりました。そして、Rubyでブロックはオブジェクトではありません（逆に言えば、ブロックをオブジェクトとして扱いたいという欲求から出てきたのがProcなのだと思います）。

こうして、&には__二つの意味__があることがわかります。
・ブロックからProcオブジェクトへの変換
・Procオブジェクトからブロックへの変換
真逆ですね。

うーん…正直奇妙に思えましたが、慣れるとこれがむしろしっくりくるのでしょうか。

# 余談
上でエラーになったコードですが、そもそも&を使わずにProc状態でどんどん受け渡せば問題なく動きます。

```Ruby
def test(fun)
    fun.call
end

proc = Proc.new { p 1 }
test proc #=> 1
```

随分すっきりしました。
&を使わない引数なら、複数のProcも問題なく受け渡せます(&付き仮引数の場合はメソッドにつき1つだけと決められている)。

```Ruby
def test(one, two)
    one.call
    two.call
end

proc1 = Proc.new { p 1 }
proc2 = Proc.new { p 2 }

test proc1, proc2
#=> 1
#   2
```
こうしてみると、仕様上は、Procでないブロックを定義せずとも十分言語として機能するということになりそうです。

しかし、やっぱりRubyっぽくmapなどには直接ブロックを渡したいですし、先に述べたyield記法は捨てがたい。とすると可読性の上で&は大事ですので、コイツとは末永く付き合っていくことになりそうだな、と思ったのでした。
そこで付き合うコツとして、&の意味が文脈で変わってくるので、（これはすべての型やクラスに言えることかとは思いますが）プログラムの中で「これは今Procとブロックのどちらなのか」を常に把握するのが大事なのかな、というのが今の考えです。

# 参考
大変参考になりました。ありがとうございました。
[Ruby block/proc/lambdaの使いどころ](https://qiita.com/kidach1/items/15cfee9ec66804c3afd2)
[Procを制する者がRubyを制す（嘘）](https://melborne.github.io/2014/04/28/proc-is-the-path-to-understand-ruby/)
コントローラー、ルーティングの同時作成

'''
rails g controller 作成したいコントローラー名　index

・コントローラー作成時に、コントローラー名に続けてアクション名を指定。
これにより、コントローラーの作成だけでなく。

messagesコントローラーにindexアクションが作られる。
viewsのmessagesフォルダにindex.html.erbファイルが作られる。

・ルートパスをルーティングに記述する。
root to:"コントローラー名#アクション名"