OmniAICreator/Qiita-1.07M huggingface dataset:
Goのmodules を使い始めたばかりでbuild出来ずに困った話

# Go moduleを使い始めたばかりで`build`が通らず困った話
Hello Worldを終えて、少しすると、`main.go`で定義していた関数を別のディレクトリに切り出したくなる時がくると思います。
その時に`build`通らず、解決するのに時間がかかりました。
`go module`を使わず、`GOPATH`配下にプロジェクトのディレクトリを作る際と、`goのmodules`を使う時で外部パッケージの呼び出し方のパスの指定方法に違いがあります。現状、Web上の情報も古い情報の方が多く、
結構、盲点であると思いましたので、覚書として残します。



```bash:Goのバージョン
$ go version
>> go version go1.13.4 darwin/amd64
```

## 何が困ったか？

```bash
piyo
├── go.mod
├── go.sum
└── main.go
```

```go:main.go
package main
import "fmt"

main(){
    hoge()
    fuga()
    return nil
}

func hoge() {
    fmt.Println("hogehoge")
}

func fuga() {
    fmt.Println("fugafuga")
}
````
上記のようなプロジェクトを下記のように、関数を別のディレクトリへ分割したい。

```bash
piyo
├── go.mod
├── go.sum
├── main.go
└── cmd
    ├── hoge.go
    └── fuga.go
```
なので、次のようにファイルを分割した。

```go:main.go
package main
import (
    "fmt"
    "./cmd"
)
main(){
    cmd.hoge()
    cmd.fuga()
    return nil
}
```

```go:hoge.go
package cmd
func Hoge() { // パッケージ外部から呼ばれるので関数名の先頭を大文字にする。
    fmt.Println("hogehoge")
}
```
```go:fuga.go
package cmd
func Fuga() { // パッケージ外部から呼ばれるので関数名の先頭を大文字にする。
    fmt.Println("fugafuga")
}
```

ここで、`build`するとエラーが出て`build`出来ない！

```bash
$ go build
>> build _/Users/username/workspace_golang/github.com/username/piyo/cmd: cannot find module for path _/Users/username/workspace_golang/github.com/username/piyo/cmd
```

`... cannot find module for path ... `という事は、`piyo`ディレクトリを見つける事が出来ないという事っぽいけど。。。


***結論からいうと、importするパッケージを相対パスでは無く、絶対パスでしてすれば`build`が通りました！***

## もう少し詳しく再現してみる。

### Go modulesを使う

Goでは、modulesというものが`go 11.1`から使えるようになりました。

詳しい内容は、様々な記事や公式ドキュメントにありますが、今までと何が違うかというと`GOPATH`の外にいても外部のパッケージを使えるという事であると思います。

必ず`GOPATH`傘下にプロジェクトのディレクトリを作らなくてならないのは、不自由だなと思いますので、これはいいと取り入れて行きます。

```bash
$ mkdir workspace_golang
$ cd workspace_golang
$ mkdir piyo
$ cd piyo
$ go mod init github.com/username/piyo
```
このように`GOPATH`の外の`homeディレクトリ`直下に`workspace_golang`という勉強用ディレクトリを作成し、そこにプロジェクトのディレクリを作成しました。

## buildが通ったmain.go
```go:main.go
package main
import (
    "fmt"
    - "./cmd"
    + "github.com/username/piyo/cmd
)
main(){
    cmd.hoge()
    cmd.fuga()
    return nil
}
```

## 結論
***go moduleを使ったら外部パッケージから関数等を呼ぶときは絶対パスで呼ぶ！***
swift ドロワメニューに挑戦

SWRevealControllerによるドロワメニュー今回は導入してみました。
https://www.youtube.com/watch?v=EWDNScxZ0YU
上記youtubeを参考に作製(動物病院の獣医師さんの地域グループSNSを構想した例です。
![スクリーンショット 2019-11-07 1.36.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101462/0309d1f9-3f99-9bbb-6e8d-6afb6ca2eae6.png)
![スクリーンショット 2019-11-07 1.35.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101462/17d44938-e4ed-4751-d448-541dbad631c0.png)
Rubyでカイジの地下チンチロのアプリを作ってみた

最近カイジを見ていて、地下チンチロをRubyで試してみようと思い作成してみた。
もう少しスマートに改修したいところ。ご意見くださると幸いです。

##仕様要件
###ゲームのルールと仕様変更したところ
・親からサイコロを振る
　=>仕様上、一対一になるので親制度廃止
・手番になったら3個のサイコロをふる
・サイコロを振ってどんぶりの外に出た場合はションベンという
　=>仕様上、ションベンは廃止
・サイコロを振って出目がない場合は3回まで振り直しが可能
　=>仕様上、親は1回のみとなっている、子は出目がない場合なので、ヒフミが出たら振り直せない
・役によってペリカのやり取り金額が変わる
　=>ペリカは実装していない

###役の順位
1-1-1 役物・ピンゾロ
2-2-2 役物・ゾロ目
3-3-3 役物・ゾロ目
4-4-4 役物・ゾロ目
5-5-5 役物・ゾロ目
6-6-6 役物・ゾロ目
4-5-6 役物・シゴロ
6-x-x 通常の目・6の目
5-x-x 通常の目・5の目
4-x-x 通常の目・4の目
3-x-x 通常の目・3の目
2-x-x 通常の目・2の目
1-x-x 通常の目・1の目
x-y-z 目なし
1-2-3 負の役物・ヒフミ

##実際に書いてみた

```ruby:underground_chinchinloline.rb
# ダイスを振る
def dice_role
  dice_eye = []
  dice_sum = 0
  for i in 0..2 do
    dice_eye[i] = (rand 1..6)
  end
  puts "ダイスの目は #{dice_eye[0]}, #{dice_eye[1]}, #{dice_eye[2]} です"

  # 返す値は、ダイス×3の目と合計値なので4つの値を返す
  return dice_eye[0], dice_eye[1], dice_eye[2]
end

# 役物判定
def hand(a, b, c)
  if (a + b + c) == 3
    #1-1-1の組み合わせ => 必ず3になる
    puts "役物・ピンゾロ"
    return 40
  elsif [a, b, c].uniq.count == 1
    #共通の値を削除し、残った個数が1なら必ずゾロ目
    case a
    when 2
      #2-2-2の組み合わせ => 共通の値が2
      puts "役物・#{a}のゾロ目"
      return 35
    when 3
      #3-3-3の組み合わせ => 共通の値が3
      puts "役物・#{a}のゾロ目"
      return 34
    when 4
      #4-4-4の組み合わせ => 共通の値が4
      puts "役物・#{a}のゾロ目"
      return 33
    when 5
      #5-5-5の組み合わせ => 共通の値が5
      puts "役物・#{a}のゾロ目"
      return 32
    when 6
      #6-6-6の組み合わせ => 共通の値が6
      puts "役物・#{a}のゾロ目"
      return 31
    end
  elsif (a || b || c == 4) && ((a + b + c) == 15)
    #4-5-6の組み合わせ => 必ず4が存在し、必ず合計値が15になる
    puts "役物・シゴロ"
    return 20
  elsif (a || b || c == 1) && (a || b || c == 2) && ((a + b + c) == 6)
    #1-2-3の組み合わせ => 必ず1と2が存在し、必ず合計値が6になる != 1-1-4では該当しない
    puts "負の役物・ヒフミ"
    return 0
  elsif [a, b, c].uniq.count == 2
    #共通の値を削除し、残った個数が2なら必ず同じ目が存在する
    ary = [a, b, c]
    double = ary.group_by{ |e| e }.select { |k, v| v.size > 1 }.map(&:first)
    #重複した値を配列化、だが1つしか重複していないので、配列の最初の値が重複した値になる
    case double[0]
    when 6
      #6-x-xの組み合わせ
      puts "通常の目・6の目"
      return 16
    when 5
      #5-x-xの組み合わせ
      puts "通常の目・5の目"
      return 15
    when 4
      #4-x-xの組み合わせ
      puts "通常の目・4の目"
      return 14
    when 3
      #3-x-xの組み合わせ
      puts "通常の目・3の目"
      return 13
    when 2
      #2-x-xの組み合わせ
      puts "通常の目・2の目"
      return 12
    when 1
      #1-x-xの組み合わせ
      puts "通常の目・1の目"
      return 11
    end
  else
    #組み合わせが該当しない場合
    puts "目なし"
    return 1
  end
end

# 相手のターン
  puts "相手がダイスを振ります"
  e_dice = dice_role
  e_result = hand(e_dice[0], e_dice[1], e_dice[2])

# プレイヤーのターン
p_cnt = 3
until p_cnt == 0 do
  # プレイヤーのダイスロール
  puts "\nあなたがダイスを振ります"
  p_dice = dice_role
  p_result = hand(p_dice[0], p_dice[1], p_dice[2])

  # 振り直し判定
  p_cnt = p_cnt - 1
  if p_result > 1 || p_result == 0 || p_cnt == 0
    break
  end
end

# 勝敗判定
if e_result == p_result
  puts "\n引き分けです"
elsif e_result > p_result
  puts "\nあなたの負けです"
else
  puts "\nあなたの勝ちです"
end

exit
```
##ソースコードで使ったもの
後でまとめます

・for文、順続きの数値の指定
・if文、case文、uniq、group by、select、size、map
・until文、break
・defでメソッド定義
outsystemsで、処理の回数を指定してループ（For Each）を回したい

# やったこと
outsystemsで、**処理の回数を指定**してループを回す方法を2通り考えてみた

# 記事を書こうと思ったきっかけ
処理したいリストがあるわけではなく、「単純に5回だけループを回したいんだよなあ」って時に、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/471875/047611d5-c2e9-a213-c363-3da7d81cc17e.png)
こいつではできないので（引数にRecordListが必要だから）ちょっと悩んだからです




以下、1を5回足すという単純な例で説明していきます

# パターン1
if文で実装する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/471875/570b5c07-2406-4f40-8c55-0bd0e36d6bb1.png)

これは「フローチャート　for文」でググるとすぐにわかりました
たまにoutsystemsの実装でわからなくなったら、「フローチャート」で検索したりします

# パターン2
以下のように、**指定した幅の連番が格納されるリスト**を生成するアクション（Rangeアクション）を作って、その戻り値をFor Eachに渡す

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/471875/8eebbd02-3086-561c-619c-87ababa10cb2.png)

連番を生成するアクションを以下のように作りました（こっちは結局if文でループさせているんですけどね）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/471875/3baa1e5c-d22a-6999-ab6d-6c3f57a71211.png)


個人的にはパターン2のほうが読みやすいですが、人によるんでしょうかね？
でもパターン2だと速度が遅くなりそう…
(追記) [実行時間を比較してみた](https://qiita.com/oyuchan/items/3d412befa4cdd13ff08b)

あと、パターン1だと、iの足し忘れとか条件の書き間違いによる無限ループが怖いです（私は絶対にやる自信があります）


# 注意すること
パターン2での話ですが、RecordListの引数のところで、以下のような渡し方をしてしまうと、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/471875/8347c42b-1a2b-9741-ea51-8784b3cb235a.png)
一回ループが回る毎に、このRangeアクションが実行されてしまって無限ループに陥ります
こういう実装ができないようにするためにも、RangeアクションのFunctionプロパティはNoにしといたほうがいいかもしれません
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/471875/abdb18f5-50a9-6e3c-3fab-f70487db0bee.png)



# そもそも
私が知らないだけで、for文のもっといい書き方があるかもしれません
知ってる人がいたら教えてほしいです
[SwiftUI]iPadでActionSheetが使えないという事実をねじ伏せる

SwiftUIにはActionSheetというクラスがあり、文字通りUIAlertControllerのactionSheetスタイルを表示することが出来ます。
しかし、iPadではこれを使うと

```
*** Terminating app due to uncaught exception 'NSGenericException', reason: 'Your application has presented a UIAlertController (<UIAlertController: 0x7fb7118d8200>) of style UIAlertControllerStyleActionSheet from _TtGC7SwiftUI19UIHostingControllerGV11SwiftUIFlux13StoreProviderV9NightfoxS8AppStateVS3_10RouterView__ (<_TtGC7SwiftUI19UIHostingControllerGV11SwiftUIFlux13StoreProviderV9NightfoxS8AppStateVS3_10RouterView__: 0x7fb711503250>). The modalPresentationStyle of a UIAlertController with this style is UIModalPresentationPopover. You must provide location information for this popover through the alert controller's popoverPresentationController. You must provide either a sourceView and sourceRect or a barButtonItem.  If this information is not known when you present the alert controller, you may provide it in the UIPopoverPresentationControllerDelegate method -prepareForPopoverPresentation.'
*** First throw call stack:
```

というメッセージが出て**クラッシュ**します。
このワークアラウンドとしてAlertを使うことも出来るのですが、こちらは

`Alert(title: Text, primaryButton: Alert.Button, secondaryButton: Alert.Button`

といった２つのボタンしか設定出来ません。

まぁでもおそらく内部的にUIAlertControllerのイニシャライザを叩いていると思うので、必ずalertスタイルにすれば行けるはずです。

```swift

extension UIAlertController {
    static func forceAlertStyle() {
        let originalSelector = #selector(UIAlertController.init(title:message:preferredStyle:))
        let swizzledSelector = #selector(UIAlertController.nfs_init(title:message:preferredStyle:))
        
        let originalMethod = class_getClassMethod(UIAlertController.self, originalSelector)!
        let swizzledMethod = class_getClassMethod(UIAlertController.self, swizzledSelector)!
        
        method_exchangeImplementations(originalMethod, swizzledMethod)
    }
    
    @objc class func nfs_init(title: String?, message: String?, preferredStyle: UIAlertController.Style) -> UIAlertController {
        return UIAlertController.nfs_init(title: title, message: message, preferredStyle: .alert)
    }
}
```

<img width="283" alt="スクリーンショット 2019-11-07 1.09.04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24979/988edde8-768f-5e9e-8b8d-809ea9e308f7.png">

こんな感じでいけました。
PythonのコンソールをUNKOまみれにする

[「文科省のPythonはPythonじゃねぇ」](https://qiita.com/nagataaaas/items/ba33c4c4e0df0b5aa0c4)で知ったのですが、Pythonは組み込み関数も上書きできるんですね。
で、調べてみると、```builtins.()```で元の組み込み関数も呼び出せると。
ということは、プログラムの先頭あたりにでも

```
import builtins
def print(str):
    builtins.print('UNKO')
```
といれておけば、何をprint()しても
![2019-11-07_010140.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/db344bff-5515-43b4-dfb0-88c62809297c.png)
こうなります。
今更人に聞けない Git と Github の 違いとは？

# 目的

- GitとGithubについて明確に答えられないことに危機感を覚えたためまとめる。



# 両者を一言で言うと？

- Git: ソースコードのバージョン管理を行うツールのお名前である。
- Github: Gitを使用した便利なWebサービスのお名前である。

# もう少し特徴を深掘る

- Git
    - 分散型のバージョン管理システムと呼ばれるものである。
    - バージョン情報を蓄積させておくリポジトリがリモートとローカルに存在する。
    - リモートとローカルで別々にリポジトリを管理することにより、オフライン環境ではローカルリポジトリでバージョン管理し、オンラインになったタイミングでリモートリポジトリに修正を加えることができる。
    - イントラ内にGitのリモートリポジトリを保持したサーバがあった場合、外部からのアクセスができないこともある。
    - リーナス・ベネディクト・トーバルズさんが考えて作った。(Linuxカーネルの親)
 
- Github
    - リモートリポジトリはクラウド上に存在する。
    - クラウド上のリポジトリはどこからでもアクセス可能である。
    - Gitには無い便利機能が多数存在する。
    - 基本的な概念はGitと共通である。


# 簡単なまとめ

- Git: 古の頃からの分散型バージョン管理システムである。
- Github: Gitをより便利にしたものであり、リモートリポジトリをクラウド上に設置している。Gitには無い便利機能も多数存在する。
蟻本　2－4　二分探索木の復習

プログラミングコンテストチャレンジブック（通称”蟻本”）の気になった項目を見ていきます。
素人の解説なので分かりにくい or 誤った説明があれば教えてくださいm(__)m
AtCoder社サイトのAPG4bをひと通り読んだくらいの方を対象に書いています（自分がそうなので）。
今回は二分探索木です。やや長いです。
◆二分探索木
…二分木の一種です。すべてのノードについて、左の子以下のノードの数字は自分の数字よりすべて小さく、右の子以下のノードの数字は自分の数字よりすべて大きいという構造をしています。
↓実装です。

```c++:qiita.c++
//ノードを表す構造体を作ります。
//valはノードの数字です。
//lch(left child),rch(right child)はそれぞれノードの子を意味します。
struct node{
  int val;
//ポインタ変数の設置 *lch,*rch（lch,rchはアドレスを意味します）。
  node *lch,*rch;
};

//ノードpに数xを追加します（pはアドレス）。
node *insert(node *p,int x){
//ノードpのアドレスが無い場合（つまりノードpがないとき）
  if(p == NULL){
//新たにnew nodeというノードを作り、アドレスをqとします。
    node *q = new node;
//「->」はアロー演算子です。q->valはqが指す構造体の変数valを指します。
//qのノードの数字をxとします。
    q->val = x;
//ノードqの左の子、右の子のアドレスは設定しません。
    q->lch = q->rch = NULL;
//追加した数字xのノードであるqのアドレスを返します。
    return q;
  }
//pのアドレスが存在する場合
  else {
//xがノードpの数字より小さい場合、ノードpの左の子ノードにxを追加します。
    if(x < p->val) p->lch = insert(p->lch,x);
//xがノードpの数字以上の場合、ノードpの右の子ノードにxを追加します。
    else p->rch = insert(p->rch,x);
//pのアドレスを返します。
    return p;
  }
}

//ノードpの数字がxかどうかを判定します。
bool find(node *p,int x){
//pのアドレスがない場合、falseを返します。
  if(p == NULL) return false;
//ノードpの数字がxのとき、trueを返します。
  else if (x == p->val) return true;
//ノードpの数字よりもxが小さいとき、ノードpの左の子ノードの数字を調べます。
  else if(x < p->val) return find(p->lch,x);
//ノードpの数字よりもxが大きいとき、ノードpの右の子ノードの数字を調べます。
  else return find(p->rch,x);
}

//ノードpの数字を調べ、xであれば消去します。
//pの代わりに入ったノードのアドレスを返します。
node *remove(node *p,int x){
//pのアドレスが無い場合、消去できません。
  if(p == NULL) return NULL;
//ノードpの数字よりもxが小さいとき、ノードpの左の子ノードの数字を調べます。
//xであれば消去します。
  else if(x < p->val) p->lch = remove(p->lch,x);
//ノードpの数字よりもxが大きいとき、同じ操作をノードpの右の子に対して行います。
  else if(x > p->val) p->rch = remove(p->rch,x);
//ノードpの数字がxであり、ノードpの左の子が無い場合
  else if(p->lch == NULL){
//ノードpの左の子qを作ります。
    node *q = p->lch;
//qの右の子としてpの右の子を指定します。
    q->rch = p->rch;
//ノードpを消去し、qのアドレスを返します。
    delete p;
    return q;
  }
//ノードpの数字がxであり、ノードpの左の子が存在する場合
  else {
//ノードqをnode型の変数として設定します。
    node *q;
//for文を作り、ノードpの左の子以下で最も大きいノードを見つけます（↓手順）。
//q = p->lchは初期値。
//for内の操作を行った後、qの右の子に移ります。
//qの右の子の右の子が無くなるまで繰り返します。
//よく目にする「for(int i=0;i<n;i++)」と比べればすぐ理解できます。
    for(q = p->lch; q->rch->rch != NULL; q = q->rch);

//ノードqの右の子の右の子が無くなったとき
//ノードrをノードqの右の子とします（このrはノードpが消去された場所に行きます）。
    node *r = q->rch;
//rが無くなるので、代わりにqの右の子にr->lchを設定します。
    q->rch = r->lch;
//rはノードpが消去された場所に行くので、rの左、右の子はpの左、右の子とします。
    r->lch = p->lch;
    r->rch = p->rch;
//pを消去し、rのアドレスを返します。
    delete p;
    return r;
  }
  return p;
}
```
学習記録＃6

#今日やったこと

- 手慣らしタイピング：IDOLiSH7「Viva! Fantastic Life!!!!!!!」
- progate：RubyⅣ-6まで

####ひとこと
文法からちょっとだけ使ってみる段階に入ってきたのでわくわく。
体調整えるためにペース落としてたけど明日からは戻せそう。

##progate：RubyⅣ-6まで
○戻り値
return 値　でメソッドの呼び出し元に戻り値が返る。真偽値を返すメソッドはメソッド名？表記にするのが慣習　

○クラスとインスタンス
オブジェクト指向でよく聞くやつ。設計書と実体。工場みたいで楽しい。
【Kotlin】KTypeからKClassを取得する

# やること
`Kotlin`のリフレクションで取れる`KType`から`KClass`を取得します。

# やり方
例として、ラムダから引数の`KClass`を取る例を示します。

```kotlin
val lambda: (String?) -> Any? = { /* ラムダの内容は省略 */ }
val reflect: KFunction<Any?> = lambda.reflect()!!

val kType: KType = reflect.parameters.first().type
val classifier = type.classifier!!

// 実際にはKClass<String>が取れる
val kClass: KClass<*> = classifier as KClass<*>
```

実際には`KClass<String>`が取れてしまって（= `nullability`の情報が消えて）いますが、一応`KClass`が取得できました。

# 参考にさせて頂いた記事
- [reflection \- Kotlin \- KClass<\*> from KType \- Stack Overflow](https://stackoverflow.com/questions/56686420/kotlin-kclass-from-ktype/56686703)
GoogleAppsScriptでURL外形監視する


## 概要
入門監視や[Webサービスを支えるモニタリング](https://soudai.hatenablog.com/entry/webservice-monitoring)にて、URL外形監視からモニタリングするという話がありました。

URL外形監視をやるに辺り、モニタリングサービス（ex. StatusCake, Mackerel）で行えますが、今回はお手軽にGoogleAppsScript
（以下GAS）でやってみようと思います。

## 実装
実際に書いてみたコードは下記になります。
コードは単純にステータスコードが200以外なら、異常と捉えてSlackに通知する実装になります。

単純に問題を検知するなら、これくらいでも良いかなと思います。
あとはこれをスケジュール実行することで、定期的に状態をチェックすることができます。

また、このエンドポイントをページではなく、healthエンドポイントにすれば、定期的にシステム全体の監視もできると思います。
※入門監視7章で紹介されています

```Javascript
var END_POINT = "URL";
var SLACK_INCOMING_URL = 'ウェブフックURL';

function main() {
  var message = '';
  var result = UrlFetchApp.fetch(END_POINT, { muteHttpExceptions:true }).getResponseCode();
  if (result !== 200) {
    message = 'ページにアクセスできません。';
    sendSlack(message);
  }
}

function sendSlack(message) {
  var jsonData = {
    text: message,
  }
  
  payload = JSON.stringify(jsonData);
  options = {
    "method" : "post",
    "contentType" : "application/json",
    "payload" : payload
  };
  
  UrlFetchApp.fetch(SLACK_INCOMING_URL, options)
}
```

## まとめ
GASでステータスコードを見るというアプローチで、外形監視をやってみました。
単純な方法に見えますが、あると便利だなという感覚でした。

以上、最後まで見ていただきありがとうございました。
root権限なしでsquidを起動する on Fedora 27

squidをコンパイルするには、そもそもg++が必要で、gccの中のg++をインストールためにはまずg++が必要というループで詰んだ。
別のcppコンパイラをインストールすれば良いのだろうけど、もう嫌になってRPMを無理やり動かした話。

http://rpm.pbone.net/
のsearchから、Fedora 27にチェックを入れて、squid周りのRPMをダウンロード。
squid-4.0.23-2.fc27.x86_64.rpm
libecap-1.0.1-1.fc27.x86_64.rpm
の2つは必要だと思う。

ダウンロードしたら、適当なフォルダを作ってその中で、

```
rpm2cpio path_to/squid-4.0.23-2.fc27.x86_64.rpm|cpio -id
rpm2cpio path_to/libecap-1.0.1-1.fc27.x86_64.rpm|cpio -id
```
とやってファイルを取り出す。
そしたら、その中のetc/squid/squid.confに次の行を追加する。

```
mime_table /home/user/squid/etc/squid/mime.conf
unlinkd_program /home/user/squid/usr/lib64/squid/unlinkd
logfile_daemon /home/user/squid/usr/lib64/squid/log_file_daemon
icon_directory /home/user/squid/usr/share/squid/icons
cache_log /home/user/squid/var/log/squid/cache.log
pid_filename none
cache_access_log /home/user/squid/var/log/squid/access.log
```
もしsshをconnect proxyで転送したいなら下記の設定を上のほうに追加しておく。

```
acl SSL_ports port 22
acl Safe_ports port 22
```
そしたら、次のコマンドで起動できる。

```
LD_LIBRARY_PATH=/home/usr/squid/usr/lib64:$LD_LIBRARY_PATH /home/user/squid/usr/sbin/squid -f /home/user/squid/etc/squid/squid.conf -N -d 1
```
Redash AMI を利用した時に「504 Gateway Time-out」が出たら。

# 概要

## 確認事項


1. セキュリティグループの設定が問題なし
2. IAMロール周りも問題なし
3. SSHができる
4. 内部でdocker-composeも問題なく実行されている

なのにでる。

# 原因

単純にリソースが足りないっぽい。

# 対策

t2.micro インスタンスをt2.smallインスタンスに変更したところ解決

# もっと早く解決するための意識改善

- メモリ不足のログが出ているログか、timeoutの時に疑うポイントにリソース不足がなかったので、次回以降については、そのログからリソース不足を疑うようにする。
- t2.microのメモリの仕様を知らなかった。わずか1GB。これ知ってれば、docker-compose によるリソース不足を真っ先に疑えたはず。仕様を先に今後は整理する。


# 参考

https://stackoverflow.com/questions/43690262/how-do-i-upgrade-from-t2-micro-to-t2-small-at-the-moment-of-expiration
MySQL はWHERE 句の検索条件をあまりに多く指定するとインデックスを使わずフルスキャンしてしまう

表題通り，WHERE 句にあまりにたくさんの検索条件を指定するとフルスキャンしちゃうので SELECT のクエリは細切れに出しましょう．

[公式ドキュメント](https://dev.mysql.com/doc/refman/8.0/en/where-optimization.html)いわく，

> Each table index is queried, and the best index is used unless the optimizer believes that it is more efficient to use a table scan. At one time, a scan was used based on whether the best index spanned more than 30% of the table, but a fixed percentage no longer determines the choice between using an index or a scan. The optimizer now is more complex and bases its estimate on additional factors such as table size, number of rows, and I/O block size.

とのことです．
大事なのは最後の文で，ざっくり言うと「クエリオプティマイザはテーブルサイズとか列数とか IO のブロックサイズとかを見てインデックスを使うかフルスキャンするか決めます」ということです．
昔はテーブル全体の 30% 以上を舐めそうだったらフルスキャンするようにしてたみたいでググるとその手の解説も出てくるけど，今は上のようにもっと色々考えてるみたいです．

問い合わせ数を多くするコストよりもフルスキャンをさせてしまうコストの方が大きい場合が多いと思うので，オプティマイザのお気持ちを忖度してクエリを作ると良いみたいです．
UnityのEventHandleをアサインするときタイプについて

Functionを選択するとき上にはDynamic、つまりこのコンポーネントの値をりようする。
反対に、下にはStatic、選択するとパラメータを入力できるTextFieldを表示する。
名前通り、送っている値はずっと変わっていません。

最初はどんな問題だがわからなくてすごく簡単です。一応めもにする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82426/396c6bd9-7b67-1393-8b8d-6aeaa893688e.png)
【SwiftUI】ListとForEachの挙動について...

# はじめに

※これは個人的なイメージです:thinking:
あんまりわかっていないので、指摘、助言、批評など絶賛募集中です！

## 問題
以下のように実装した場合

```swift
struct ContentView: View {
    var body: some View {
        List(0..<3) {(row: Int) in
            Text("Row \(row)")
                .listRowBackground(Color.blue)
        }
    }
}
```
![スクリーンショット 2019-11-06 23.09.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/171702/6e1bb909-c852-5cc9-73da-98862531ffbc.png)
ご覧の通り、.listRowBackground(Color.blue)がListのcellに反映されていません:sob:
## List + ForEachで対応した場合
```swift
struct ContentView: View {
    var body: some View {
        List {
            ForEach(0..<3) {(row: Int) in
                Text("Row \(row)")
                    .listRowBackground(Color.blue)
            }
        }
    }
}
```
![スクリーンショット 2019-11-06 23.12.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/171702/4417f76d-a1a1-e2e7-8923-9587c5fbbf05.png)
ちゃんと.listRowBackground(Color.blue)が効いている！
何故なのか？:confounded:


## 別例:rolling_eyes:
　このように実装した場合

```swift
struct ContentView: View {
    var body: some View {
        List (0..<3) {(row: Int) in
            Text("Row \(row)")
            Spacer()
            Text("hoge")
        }
    }
}
```

以下のように表示されます。
![スクリーンショット 2019-11-06 23.20.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/171702/a923c1ac-b209-52a7-4d33-0879f5ef0c26.png)

つまり、Listのみの場合TableViewの1行の中のViewとして扱われているイメージ！
![名称未設定アートワーク 2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/171702/66bd1fbb-214d-0f73-f7b0-5661a7c096fb.png)

一方、ForEachと組み合わせた場合

```swift
struct ContentView: View {
    var body: some View {
        List {
            ForEach(0..<3) {(row: Int) in
                Text("Row \(row)")
                Spacer()
                Text("hoge")
            }
        }
    }
}
```
以下のように表示されます。

![スクリーンショット 2019-11-06 23.19.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/171702/29d8bd4f-cb28-5701-7b24-44abf7992787.png)

これは、下図のようにclosureから複数のViewを作成しているためだと思われます。
![名称未設定アートワーク 1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/171702/c54e1bcd-0e63-e0e3-65c4-7fb852515c78.png)



# 最終的な着地点
+ Listは1つのカラムを返す
+ ListとForEachを組み合わせることで、動的にViewを提供することができるようになる
![名称未設定アートワーク.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/171702/7005cd9e-1ae5-08d5-6566-9a976bee73ef.png)

#　参考URL
+ [List SwiftUI]( https://developer.apple.com/documentation/swiftui/list)
+ [ForEach SwiftUI] (https://developer.apple.com/documentation/swiftui/foreach)
+ [What is the difference between List and ForEach in SwiftUI? ](https://stackoverflow.com/questions/56535326/what-is-the-difference-between-list-and-foreach-in-swiftui)
Debianの作業用パソコン インストールと設定したときのメモ

#経緯
シングルボードコンピュータを使っていると、作業がLinux前提になってることが割とあります。Windowsでもできなくないと思うのですが、クロスコンパイラ環境作ったり、仮想マシンを作ったりだと面倒くさいので、安いノートパソコンをAmazon.co.jpで調達して、プレインストールのOSを削除＆Debianのインストールと設定していきます。

と言っても、いろんなキーワードでググって、いろんな方のサイトを参考に、他力本願で普通のパソコンとして使えるまでの設定します。
その後は、ケースバイケースでOSから再インストールして作っていくと思うので、そのときはその時に。

#インストールメディアを作成
Debianのサイトでインストール用ISOを落として、DVDに焼いてもいいですが、板がもったいないので、USBに書き込みます。これはFedora Media Writerで書き込みました。Win32ImageWriterとかいろいろアプリがあるので、そこは自由に。
自分の場合は、スタートメニューに入っていて、他にもあるアプリに比べて、早く見つかったので。。。

あと、余談ですが、USBメモリを再利用しようとしたとき、フォーマットもなにもできなくなりましたが、USBメモリを物理フォーマットすることで解決。無事捨てる必要がなくなりました。

#インストール
作成したUSBメモリを使用して、LiveUSB機能で普通にインストールします。
安いパソコンはUSキーボードが多いので、日本語キーボードにならないよう、気をつけます
忘れて、パスワードに記号を使おうものなら、致命的ですね。

Debianをインストールするとき、パーティションを自動でやってもらえなかったので、GPartedを入れて、とりあえず、消して、自動でやりました。（正直、自動で全部消してパーティションを切り直してほしい。）

#日本語入力をできるようにする
USキーボードを選んだためか、日本語入力できませんでした。
なので、以下のサイトを参考に使えるようにします。

>Debian系の日本語入力をFcitx & Mozcにする | Cloud-Work.net
>https://cloud-work.net/linux/fcitx-mozc/

最後の「キーボード - 日本語」にすると、日本語キーボード扱いになるので、インストール時に折角USキーボードにしたのに、意味がなくなります。

#ホームディレクトリの日本語フォルダ名を変更する
フォルダを日本語の名称にするのは、勘弁いただきたい。
プログラムが触るようなフォルダ名（ディレクトリ名）・ファイル名に英語以外を使うのはいかがなものか。

なので、英語表記に戻します。

>「デスクトップ」等のディレクトリ名を英語にする - Qiita
>https://qiita.com/take5249/items/13ada73bbd01ee12a2c3

このような手順があるということは、やっぱり、直接変更はダメなのでしょう。

#無線LANが使えない。。。
ここまで書いておきながら、実はこの時点で無線LANが使えない状態でした。
なので、使えるようにします。
ちなみに、一番ここで悩みました。

今度は、こちらの方の記事で参考にされたページを参考にしました。

>Debianをインストール中 - Qiita
>https://qiita.com/mbamba/items/688fce136851a44afd02#firmware-realtek%E3%81%AE%E8%A8%AD%E5%AE%9A
>
> で参考にされた
>Possible missing firmware update in debian 9.4 - Unix & Linux Stack Exchange
>https://unix.stackexchange.com/questions/445673/possible-missing-firmware-update-in-debian-9-4

こちらの記事では、「deb ... stretch main」を「deb ... stretch main contrib non-free」にするのですが、バージョンが違うので、ちょっと違いました。
要は、「(コードネーム) main」となっている行に「contrib non-free」とするようですので、「(コードネーム)-updates」となっている行は対象外のようで。

あとは同じように

```
#apt-get update
#apt-get install -y firmware-linux firmware-realtek
#update-initramfs -u
```

プロンプトが戻れば再起動します。それまで適用されなかったので。。。

今回、Realtek社のRTL8723BSのアダプタが搭載されている機器でしたが、ググってもなかなか情報が出てこず、「[Firmware-realtek Download (DEB)](https://pkgs.org/download/firmware-realtek)」のようなページを見つけ、どうやって適用したらよいか悩んでいました。

#さいごに
ようやく、いい感じに使えるようになりましたが、サウンドがならない。作業パソコンとして使いたいのに。音楽が聞けないなんて。。。改善せねば。

(2019/11/18 追記)
サウンドの再生ができるようになりました。[Debianの作業用パソコン インストールと設定したときのメモ　その２〜サウンド編〜](https://qiita.com/tsuka_hoshi/items/283cb23bd8afed3bf8f9)
バイオインフォ（に限らないけど）の人が docker for Mac で、よくひっかかるところ

# バイオインフォ（に限らないけど）の人が docker for Mac で、よくひっかかるところ

よく聞くので、記事にしてみました。

# 最初に

この記事は、[Workflow Advent Calendar 2019 \- Qiita](https://qiita.com/advent-calendar/2019/workflow) と、[バイオインフォマティクス Advent Calendar 2019 \- Qiita](https://qiita.com/advent-calendar/2019/bioinfo) の５日目の記事です。

# 内容

## Mac上に、CPUもメモリも十分あるのに、なぜかエラーになる問題

他の環境で実行したところ、CPUは1コアしか使わないし、メモリも `4GB` もあれば十分、自分の Mac には `8GB` のメモリがあるので、問題なく動くはず。
しかし実行すると動かない。

このようなケースの

### 解決策、 Docker for Mac のメモリ設定を見直す

Docker for Mac の設定で、メモリの割当が2GBがデフォルトだったかなとおもいます。
なので、それを引き上げてあげれば解決することが多いです。

この問題は、だいたい１度解決すると、ずっと発生しないのですが、
`新しく買い替えたとき` に再度発生することがあるようです。

困っている人がいたら、以下のように聞いてあげると良いかもしれません。

```
Macじゃなくて、Docker for Mac のメモリの割当はいくつになっていますか？
```

## Mac で動いていた、別環境の Linux で実行したら、自分で消せないファイルができる問題

### 解決策、-u $(id -u):$(id -g) をつけて実行してみる。

ざっくりいうとMac 上では、dockerで生成したファイルは、自分のユーザの権限でMac上にできあがります。

Linuxに持っていったら場合に、消せないファイルができるというのは、`root`権限で、ファイルが出来上がってしまうということで、自分の権限では消せないということが発生します。

その場合は、実行するときに、 docker の `-u` オプションで、自分の `UID` と `GID` を指定してあげるとよいとおもいます。

消せなくなったファイルについては、別コンテナを立ち上げて消して上げればよいのではないかと思います。
Serverless Frameworkでevent scheduleをステージ毎に切り替える

## 環境

* Serverless Framework

## やりたいこと

CloudWatch Eventの定期実行をステージングでは手動実行、本番では定期実行させたいということがあったので、備忘録として残しておきます。

## serverless.yml

至って簡単です。

```yaml

service: hoge

provider:
  name: aws
  runtime: nodejs8.10
  stage: ${opt:stage, self:custom.defaultStage}
  region: ap-northeast-1

custom:
  defaultStage: dev
  schedule_active:
    dev: "false"
    prod: "true"
    default: "false"

functions:
  hello:
    handler: handler.hello
    events:
      - schedule:
        rate: rate(30 minutes)
        enabled: ${self:custom.schedule_active.${opt:stage, self:custom.defaultStage}, self:custom.schedule_active.default}
```

上記で通常はscheduleを実行しないで、prod環境の時だけ、定期実行を行うように出来ます。
`sls deploy --stage prod` でデプロイすればOK
EMTalk#1に参加してきました！

# はじめに
[EM Talk #1 〜エンジニア採用編〜](https://mercari.connpass.com/event/153015/) に参加してきました。
イベント名の通り、EMが集うイベントですが、自分はEMではありません...(あれ？)

とはいえ、

```
概要
---
EM Talkは、
組織づくりに携わるエンジニアたちが集まり、知見を共有しあうことを目的とした勉強会です。 

組織づくりに欠かせない採用・育成・配属・評価・制度などについて、
過去の事例・失敗談・成功談・現在の取り組みを共有し、交流会で参加者同士の親睦を深めます。 

第一回目は「エンジニア採用」をテーマに、メルペイのEMによるトークセッションや、
DMM・GREE・スマートニュースの方をお招きしたパネルディスカッションを実施いたします。
```

概要を読んだら、自分が会社で行ってる業務との親和性も高く、
イベントの趣旨・そしてゲストの凄さに興味が湧き、参加することにしました。

# 印象に残ったところ
全体的に「これはSNSで話さないで！」 話が多かったので、あまり書けることがありません...

## Twitterはこんな感じです。
[Twitter#EMTalk](https://twitter.com/search?q=%23EMTalk)

## 当日の流れはこんな感じでした。
1. メルペイ EM 石川さんのトークセッション
2. GREE CTO 藤本さんのトークセッション
3. パネルディスカッション（前半）
4. パネルディスカッション（後半）

トークセッションは各社の取り組みをパワポで紹介してくれました。
内容は浅く広くな印象ですが、とても整理されていてわかりやすかったです。
パワポの中身をみていると、どこの会社もやっていそうなことでしたが、
藤本さんがトークセッションで冒頭に話していた内容がその通りだなと思いました。
**「 採用は王道がない
　時間と手間をかけるだけ進む
　手を抜いたら絶対うまく進まない
　最大化されるようにお金と時間をかける
　銀の弾丸なし、でもやれば上がる 」**
(メモなので一部表現はあってないかもしれません..)

あと、採用手法で面白かったのは...
**採用したい気持ちを持ったエンジニアが外部のイベントで登壇して有名になってプレゼンスを上げる。
これが効率的（DMM松本さん）**

## アンチパターン紹介で印象に残ったところ
会社がめっちゃ成長するときはめっちゃ採用する
そうすると、カルチャーばらつく。
エンジニアの閾値が下がる..給与ねじれる、さらにいろいろ大変になる。
なので、
対処法はカルチャーとバリューに対してブレない、そこにリンクする人を採用する

## エンジニア採用時にみている点で印象に残ったところ
・物事に理由があるかを聞く
・ちゃんと議論ができるやつは大事
・エンジニアの議論は正解がないから、負けない議論をするやつがいると進まない
・ゴールに向かって、どうすればいいかを考えれるのは大事
・多様性を認める、同様性に向かわせるは違う
・正直者かどうか、自己認識と差分を見えているかどうか

# 終わりに
知識や他社事例という点で学ぶことが多いEMTalkで参加して本当に良かったです。
でも、一番刺激を受けたのは各社のCTOやEMのメンバーが自分の会社、グループを本当によくするために
全熱量をかけていることを感じられた事が一番良かったです。
拙い文章ですが、イベントの良さが伝われば幸いです。

# 追加
セッションの記事が公開されてました！
[前編](https://mercan.mercari.com/articles/19597/)
[後編](https://mercan.mercari.com/articles/19653/)
Rails +MySQLのプロジェクトをherokuへデプロイ

RailsのデフォルトDBはSQLiteですが、
MySQLにしたものとして先に進めます
MySQL導入方法
https://qiita.com/shigeshige/items/02ce019e02bcfff14b9b
今回はheorkuへ会員登録したものとして先に進めます


##production環境
実際にHerokuでデプロイした後もMySQLで動くようにします

###デフォルトでfalseとなっている以下の箇所をtrueに変更
Railsは本番環境での動的な画像の表示がデフォルトでオフになっています。

```Gemfile:config/environments/production.rb
# 以下の箇所を変更
config.assets.compile = true
config.assets.initialize_on_precompile=false
```
heroku だと、 sqlite3 がビルドできないので、開発環境でだけ使うよ、っていう宣言が必要
　(heroku では、 production の gem だけビルドされる)

↓を削除し

```gemfile:Gemfile

gem 'sqlite3'
```

代わりに↓を挿入する

```gemfile:Gemfile

gem 'sqlite3', group: [:development, :test]
gem 'mysql2'
```

※　Rails 5以降の場合はrails_12factorは不要のようです
参考記事（ありがとうございます）
https://qiita.com/jnchito/items/54eb7b3df322fc86675e

```
$ bundle install
コミットしておきます
```


###Heroku作成
```
$ heroku create
$ git push heroku master
```

###cleardbアドオンを追加
後述するアドオンの追加のところで、Herokuにクレジットカード情報を登録しておく必要がある（お金はかかりません）ので、登録しておいてください。

```
$ heroku addons:create cleardb:ignite
```

###heroku-postgresqlアドオンを削除

```
$ heroku addons:destroy heroku-postgresql -a <アプリ名>
```

###DATABASE_URLを編集

```
$ heroku config | grep CLEARDB_DATABASE_URL
CLEARDB_DATABASE_URL:mysql2://<ユーザー名>:<パスワード>@<ホスト名>/<データベース名>?reconnect=true

```




###環境変数を設定
それぞれを設定する

```
DATABASE_URLをmysql2に書き換えてください

heroku config:add DATABASE_URL='mysql2://<ユーザー名>:<パスワード>@<ホスト名>/<データベース名>?reconnect=true'
```

```
heroku config:add DB_USERNAME='<ユーザー名>'
heroku config:add DB_PASSWORD='<パスワード>'
heroku config:add DB_HOSTNAME='<ホスト名>'
heroku config:add DB_NAME='<データベース名>'
heroku config:add DB_PORT='3306'
```

```
heroku config
で確認できます
```

###database.ymlに設定


```Gemfile:database.yml
production:
  <<: *default
  database: <%= ENV['DB_NAME'] %> 
  username: <%= ENV['DB_USERNAME'] %>
  password: <%= ENV['DB_PASSWORD'] %>
```



###Herokuにデプロイ
```
$ git push heroku master

$ heroku run rake db:create
$ heroku run rake db:migrate

テストデータがある場合
$ heroku run rake db:seed
$ heroku open
```

でデプロイできました！！！
色々とうまくいかない場合もありましたがなんとかできました
参考になれば幸いです
Goのポインタのポインタ

この記事は Go7 Advent Calendar 2019 の 6 日目の記事です。

### はじめに

Go では[ポインタ型](https://golang.org/ref/spec#Pointer_types)としてポインタを扱うことができます。Go のポインタのポインタの Tips を共有します。Devquizです。

Q: 以下はの標準出力はいずれも ``**Num`` 型の値を表示しますが、`1`, `2`, `3` それぞれで何がどのように表示されるでしょうか？？

```go
package main

import (
	"fmt"
)

type Num struct {
	i int
}

func main() {
	np := &Num{i: 3}

	// 1: main 関数での出力
	fmt.Printf("%p\n", &np)
	
	// 2: pointer 関数での出力
	pointer(np)
	
	// 3: pointerpointer 関数での出力
	pointerpointer(&np)
}

func pointer(np *Num) {
	fmt.Printf("%p\n", &np)
}

func pointerpointer(npp **Num) {
	fmt.Printf("%p\n", npp)
}
```
　
　
　
　
　
　
　
　
　
　
　　
　
　
　
　
　
　
　
　
　　
　
　
　
　
　
　
　
　
　　
　
　
　
　
　
　
　
　
　　
　
　
　
　
　
　
　
　
　　
　
　
　
　
　
　
　
　
　
　
　
　
　　
　
　
　
　
　
　
### 答え

```
0x40c138
0x40c148
0x40c138
```

https://play.golang.org/p/lJdJAX9fpEp

`**Num` 型だけど全部同じアドレスではないです。(それはそうなのですが)

### 何を表示しているのか

何を表示しているのか順番に確認していきましょう。

#### 1: main 関数での出力

まず `np := &Num{i: 3}` についてです。これは無名変数 `Num{i: 3}` へのポインタです。コンパイラによって最適化されない限り、仮想メモリ上に確保されます、メモリ構造を簡易的に図にすると以下になっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89391/682dda01-49d6-1e02-5cfe-d59ed11e75c6.png)

`Num{i: 3}` もメモリ上に確保されています。Go Playground で `fmt.Printf("%p\n", np)` としてポインタのアドレスを確認してみます。

```diff
func main() {
	np := &Num{i: 3}
	fmt.Printf("%p\n", &np)
+	fmt.Printf("%p\n", np) // 0x40e020
	pointer(np)
	pointerpointer(&np)
}
```

すると `0x40e020` であることが分かります。

https://play.golang.org/p/qweDeErKUFR

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89391/7f48a7e1-150f-95b5-db1b-7962a279cb7f.png)

よって以下では `**Num` 型の変数 `0x40c138` が出力されることになります。

```go
fmt.Printf("%p\n", &np)
```

#### 2: pointer 関数での出力

以下の関数について考えてみます。ここでは `*Num` を引数として渡しています。`*Num` は何だったかというと `Num` のアドレスを保持している変数でした。ポインターで示している **アドレスは値で渡されます**。よってアドレスの値を格納する変数は、元の変数を格納しているアドレスとは別にメモリ上に確保されます。

よって以下では `0x40c138` ではなく別のアドレス値 `0x40c148` が出力されています。

```go
func pointer(np *Num) {
	fmt.Printf("%p\n", &np)
}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89391/27d77a58-9510-5730-3a51-2e07a5fc6229.png)

#### 3: pointerpointer 関数での出力

以下は `Num` のポインターへのポインターでした。図にするとわかりやすいです。 

```go
func pointerpointer(npp **Num) {
	fmt.Printf("%p\n", npp)
}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89391/4850f78a-ef03-26d3-2b36-9bb61f078a93.png)

この `**Num` の値を格納する変数もメモリ上に確保されているので、そのアドレスを表示することができます。これも Go Playground に追加して確認しておきます。

```diff
func pointerpointer(npp **Num) {
	fmt.Printf("%p\n", npp)
+	fmt.Printf("%p\n", &npp) // 0x40c150
}
```

https://play.golang.org/p/9Ygqrowzylr

すると `0x40c150` であることが分かります。つまり以下です。こちらも 2 の場合と同様にもとのアドレス `0x40c138` とは別のアドレス `0x40c150` が割り当てられていることがわかります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89391/f854044c-4114-01e0-4ab1-d3c489cd18fb.png)

### まとめ

- ポインタ値は値

### 参考

- [In Go, is a structure pointer not a reference type?](https://stackoverflow.com/questions/59041891/in-go-is-a-structure-pointer-not-a-reference-type)
Herokuでデプロイした際にApplication error（エラーコードH10 (App crashed)）が出た時の対処法

#環境

Ruby 2.6.3
Rails 5.2.3

#  現象

Railsアプリケーションを作成後、Herokuへデプロイした際に以下画像のエラーが発生。
その際の対処法を備忘録として残しておきます。

![https___qiita-image-store.s3.amazonaws.com_0_110452_526e9c21-ec79-5305-c7e5-b536f689a3c4.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/512331/7d3b5b37-7478-fa14-0d3d-6cf01949dbfd.jpeg)

#　【対処方法】エラーの原因を把握する

以下コードで状況を把握します。

```
$ heroku logs --tail
```



エラーコードが確認できました。

```
2019-11-26T05:06:44.357974+00:00 heroku[router]: at=error code=H10 desc="App crashed" method=GET path="/" host=agile-meadow-66722.herokuapp.com request_id=e2c36b19-f3d1-4544-9f84-5ddcb7027cd2 fwd="219.113.146.130" dyno= connect= service= status=503 bytes= protocol=https
2019-11-26T05:06:44.823379+00:00 heroku[router]: at=error code=H10 desc="App crashed" method=GET path="/favicon.ico" host=agile-meadow-66722.herokuapp.com request_id=c5d323a0-b4be-497c-847b-2d3ebf4942d0 fwd="219.113.146.130" dyno= connect= service= status=503 bytes= protocol=https
```



エラーコードの中身を読んでみると、code=H10でApp crashedとのこと。
ネットで調べてみたところ、以下のようにリスタートすれば直ることもあると情報があったため試しました。

```
$ heroku restart -app
```
もしくは

```
$ heroku restart -app application_name
```

しかし、こちらを試してもエラーのままでした。



# コンソールを開いて詳細エラー情報を確認する。


エラーの詳細内容を確かめるために以下コードでHeroku上でコンソールを開きました。

```
$ heroku run rails c
```


すると、以下エラーコードが出てきました。


```
Error loading the 'sqlite3' Active Record adapter. Missing a gem it depends on? sqlite3 is not part of the bundle. Add it to your Gemfile. (LoadError)
```

sqlite3がバンドルされていない？Gemfileに加えろとの指示。
しかし、sqlite3は本番環境に対応していません。

どうやらrails newの時点でpostgresqlの指定を忘れていてsqlite3がデータベース作成時に指定されていたみたいです・・・

アプリ作成初期段階の凡ミスでエラーが発生することになりました。


## SQLite3からPostgreSQLに変換

※参照
https://qiita.com/isotai/items/67bafc37a16ea5de5e3b

上記記事を参考にし、
datebase.ymlのsqlite3時点の記載内容を全て消し、
postgresql指定でrails newした場合の記載に変更しました。


gemfileに以下を追加しました。

```
gem 'pg', '>= 0.18', '< 2.0'
```



以上。
Node.jsでGlobal Secondary Indexを使用して特定条件のレコードを抽出する

## 環境

* Nodejs
* AWS Lambda
* AWS DynamoDB

## はじめに

DynamoDBではパーティションキーもしくはレンジキーを使用してしか基本的には抽出が出来ないのですが、任意のキーを元に抽出を行いたいという時は、Global Secondary Index（以下GSI）を使用する事で任意のキーでレコードを抽出することが出来ます。

## 注意点

以下の点に気をつける必要があります。
* GSIは1テーブルにつき20件までしか作成出来ない
* GSIのキーに指定出来るカラムのデータ型は文字列、数値、バイナリのいずれかである必要があります
* Serverless Frameworkではまだそこまで自由なGSIは作成出来ないようなので、DynamoDBコンソールからGSIを作成する必要がある（ハッシュキー or レンジキー以外でのGSIの作成がうまくいかなかった）

例えばboolean型のカラムをキーにGSIは作成出来ません（私がやろうとしていました...）

参考情報：
* [DynamoDB での制限](https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/Limits.html#limits-secondary-indexes)

## 前提

適当ですが、以下のような`Users`テーブルがあるとします。

| カラム名 | データ型 | キー |
|:-------|--------:|:----:|
| username | string | hash |
| age | integer | range |
| isPremier | integer | |

`isPremier`カラムは`0`か`1`が整数で入るとします。
そして`isPremier`が`0`のレコードを全件取得したいというのが実現したいことです。

## 動作サンプルの手順

1. AWS DynamoDB ConsoleからGSIを作成
2. queryを行うLambdaを作成

## AWS DynamoDB ConsoleからGSIを作成

AWSのDynamoDB Consoleページ > テーブル > インデックス にアクセスします

そして`インデックスの作成`ボタンから新規のGSIを以下のように作成します。

![スクリーンショット 2019-11-26 23.30.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19716/729c37e4-f1e0-bf5d-85f0-92e05c42b231.png)

## queryを行うLambdaを作成

NodejsでLambda関数を作成します。
先ほど作成したGSIの以下の情報を使用します。
* テーブル名：`Users`
* インデックス名：`isPremier-index`
抽出条件は`isPremier`が0のレコードを全件取得

```javascript
const AWS = require('aws-sdk')
const DynamoDB = new AWS.DynamoDB.DocumentClient({region: "ap-northeast-1"})

module.exports.hello = async (event, context) => {
  try {
    const params = {
      TableName: 'Users', // テーブル名
      IndexName: 'isPremier-index', // 作成したGSI名
      KeyConditionExpression: '#indexKey = :indexValue', // 条件を指定
      ExpressionAttributeNames : {
        "#indexKey"  : 'isPremier' // GSIの作成時に指定したキー名を設定
      },
      ExpressionAttributeValues: {
        ':indexValue': 0 // isPremierの0を抽出
      }
    }
    let items = [] // 抽出したレコードを格納するための空の配列を定義

    const query = async () => {
      console.log('start query')
      let result = await DynamoDB.query(params).promise()
      items.push(...result.Items)

      // LastEvaluatedKeyが存在していたら再帰的にqueryを実行
      if(result.LastEvaluatedKey){
        params.ExclusiveStartKey = result.LastEvaluatedKey
        await query()
      }
    }
    await query()
    console.log(`Execution result: ${items.length}`)
  } catch (err) {
    console.error(`[Error]: ${JSON.stringify(err)}`)
    return err
  }
}
```

以上で条件にあったレコードを全件取得出来ます。
ベイズ確率に関するメモ書き

Udemyの[ベイズ推定とグラフィカルモデル：コンピュータビジョン基礎1](https://www.udemy.com/course/computervision/learn/lecture/607964#overview)を受講しているときのメモ.

# 1. ベイズ確率について
機械学習のモデルを確率モデルとして表現するには，ベイズ推定の知識が必要. 
まずは，それらの意味を確認する．


## 1.1. 確率と同時確率

- 確率変数:xが起こる頻度を指す
 
```math
Pr(x)
```

- 同時確率変数: 事象xと事象yが同時に起こる頻度を指す

```math
Pr(x, y)
```
- 周辺化: この同時確率変数の中の事象の一つを合計すると1変数の確率変数に変わる．

```math
Pr(x) = \int Pr(x, y) dy
```

## 1.2. 条件付き確率

- 事象xが起きるときに，事象yが起こる確率を指す．

```math
Pr(y|x)
```

- この条件付き確率は，下式で表現できる．
- 意味: 事象xが起きるときに，事象yが起こる確率と事象xが起こる時の確率をかけ合わせると事象xと事象yが同時に起こる確率

```math
Pr(x, y) = Pr(y|x)Pr(x) \\
```
- 同様に，事象yが起きたときの事象xが起こる確率も表現できる. 

```math
Pr(x, y) = Pr(x|y)Pr(y)
```

## 1.4 ベイズ確率について
1.3の条件付き確率を定義した．

```math
Pr(x, y) = Pr(y|x)Pr(x)　\\
Pr(x, y) = Pr(x|y)Pr(y) 
```

- 上の二つの条件を組み合わせたものが，下式であり，これをベイズの定理と呼ぶ. 

```math
Pr(y|x) = \frac{Pr(x|y)Pr(y)}{Pr(x)}
```

# 2. ベイズ推定


ベイズの定理を利用して，とある事象が起きた場合の事象の変化を確率的に推定すること

## ベイズ推定の考え方: 
![undefined]()
- $Pr(y)$: 事象xが起きる前の，事象yの確率
（事前確率, prior probability）

- $Pr(y|x)$: 事象xが起きた後での, 事象yの確率
（事後確率，条件付き確率, posterior probability，conditional probability）

ベイズの定理を使えば，事後確率 $P(y|x)$ は下記に従って計算できる. 

```math
Pr(y|x) = \frac{Pr(x|y)Pr(y)}{Pr(x)}
```

すなわち，事象xに関するデータが得られたとすると, それを反映し, 尤度$ Pr(x|y)$を求める．
そして，求めた尤度$Pr(x|y)$と事象yの事前確率から, 事後確率を推定．
また，$Pr(x)$は，正規化項目なので無視していい

## 何が面白いの？
- この事前確率，尤度，事後確率の関係性が機械学習に多いに関係する．
- 機械学習って尤度を求める方法の一つって捉えてもいい
【Salesforce】Salesforce Extensions for VS CodeのDiff機能を使えるようにする


VisualStudioCodeの拡張機能[Salesforce Extensions for VS Code](https://marketplace.visualstudio.com/items?itemName=salesforce.salesforcedx-vscode)でSalesforceの環境に接続していると、コンテキストメニューに接続環境とローカルの差分チェックが行えるコマンド`SFDX:Diff File Against Org`が表示されています。
![diff01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/528296/3ccdfd02-7b62-fc44-5543-a7cfc785ec4e.png)

ですが、Salesforce CLIのインストールから初期構築した状態ではプラグインが存在しない為、実行するとエラーが発生します。
![diff02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/528296/7f405d2d-c9a8-d181-e9d4-9e06befe4b20.png)
そのため、プラグインをSalesforce CLIにインストールする必要があります。

##◆インストール手順
１.コマンドプロンプト（PowerShellでも可）で以下のコマンドを実行します

```
sfdx plugins:install @salesforce/sfdx-diff
```

２.インストールするのか聞かれるので、`y`を入力して実行するとインストールが始まります

```
This plugin is not digitally signed and its authenticity cannot be verified. Continue installation y/n?:y
```

３．インストールが完了したら以下のコマンドを実行して`@salesforce/sfdx-diff`が表示されていればインストール成功です

```
sfdx plugins
```

![diff06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/528296/ecd1e019-415d-7f1f-8b30-994b4c2ede4c.png)


インストール完了後、VisualStudioCodeを起動してコンテキストメニューから`SFDX:Diff File Against Org`実行すると接続環境とローカルの差分確認をすることができます。
![diff07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/528296/5daf1ffe-5ea2-09be-f58b-ae1d0014239e.png)

接続環境側に追加の差分がある場合はWinMergeのようにボタンで差分を反映することができないので、手動でローカル側にコピーしてくる必要があるので注意が必要です。

##◆参考
・[Source Diff](https://developer.salesforce.com/tools/vscode/en/user-guide/source-diff/)
shell やlinuxでファイル名の特殊文字をエスケープしたい！

タイトルそのままlinuxコマンドで

##問題

```bash
wc -l  /var/tmp/20191126-(2,135,397個)テストファイル.csv
```
のように「20191126-(2,135,397個)ファイル.csv」ファイルの行数を取得しようとしたらエラー

```bash

-bash: syntax error near unexpected token `('
```
シンタックスエラーだと。。。

##解決策

どうやら「(」が特殊文字でエスケープする必要があるとのこと

ファイル名をシングルクォートで囲めばOK!

```bash

wc -l  '/var/tmp/20191126-(2,135,397個)テストファイル.csv'
```

PHPであれば、、

```php
$filePath = '/var/tmp/20191126-(2,135,397個)テストファイル.csv'

$totalRows = exec("wc -l '${filePath}'");
```

これで正常にできるはず


かんたん


参考
https://qiita.com/cocodrips/items/bb3640a9834c8978d48a
RubyとAWS LambdaでサクッとSlackへポストしてみる

とりあえずAWS Lambdaを動かしてみたかった。
試しなのでブラウザ上で完結するようにしたが、割と時間がかかった。


## 関数の作成
(AWSアカウントを作成してAWSコンソールにサインインするところまでは省略)

サービス一覧から「Lambda」 → 「関数」 → 「関数の作成」を選択。

関数の作成画面では「一から作成」を選択。関数名は任意。
ランタイムはRuby2.5 (2019/11/26現在) を選択。
ロールはデフォルトのまま。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182050/418a2e9a-29b2-ce14-e7f6-c8b2bf83cf1f.png)

「関数を作成」ボタンを選択すれば関数が作成され、編集画面へ遷移する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182050/e5274217-09f7-45e8-1f10-c5d48e9d6e75.png)



## 関数の実行
とりあえずサンプルを動かしてみる。
右上の「テスト」を選択し、「イベント名」を適当に入力して作成する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182050/a3233c0c-5db2-7f60-7319-07f88c58cb48.png)

作成したイベント名が表示されていることを確認したら、「テスト」を押せば関数が動く。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182050/91bc04dd-1b98-c5cb-eb34-6a8218b66a96.png)



## Slackのincoming-webhookの設定
Slackにポストするためにwebhookを設定する。
(このあたりは初回設定時とそれ以外で表示が異なるかもしれない)

通知したいチャンネルの設定アイコン → 「アプリを追加する」を選択して、「incoming-webhook」で検索。
ブラウザ側でAppディレクトリへ遷移するはずなので、「Slackに追加」を選択。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182050/fb775d23-8dc2-d426-718f-18a05427d7bf.png)

webhookを追加するチャンネルを選択して、「Incoming Webhookインテグレーションの追加」を選択。
webhook URLが作成されるので、これをコピーしておく。
(このときに簡単な使い方なども表示されるので読むといいかも)


## LambdaからSlackへポストする
作成したLambda関数からポストしてみる。
試すだけなので、`net/http`を利用。
`use_ssl = true`を設定しないとBad Requestとなる。

```rb
require 'json'
require "net/http"

URL = "https://hooks.slack.com/services/*******"

def lambda_handler(event:, context:)
    uri = URI.parse(URL)
    http = Net::HTTP.new(uri.host, uri.port)
    http.use_ssl = true
    http.post(uri.path, { text: "hello from lambda." }.to_json)
end
```

修正後、「保存」 → 「テスト」 と選択するとリクエストが実行される。
正常に処理された場合、Slackに通知が飛ぶ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182050/4d978f29-2f46-1f39-904f-181945fd37ba.png)



## その他

Lambda自体は無料枠に収まったが、ログを保存するS3の料金が僅かながら発生していた。
回避方法などあるかもしれないが、気にならない程度だったので今回は無視。

次は何らかのトリガーで実行する部分と変数を渡す部分を調べる。
処理を分岐する-if文-

##　条件分岐構文
JavaScriptには二つの中から片方を選択するする**if文**と複数の選択肢の中から、１つの選択肢を選ぶ**switch文**の二つが条件分岐構文として用意されています。

### if命令
if文とは、もし○○だったら、△△せよ、さもなくば××を行えというように与えられた値を条件式で比較し『true（真）/false（偽）』を判断します。
JavaScriptの世界ではtrue（真）/false（偽）の事を真偽値もしくはBooleanとも呼ばれます。
if文の基本的な構文は下記となります。

```js
if(条件式){
 //条件がtrueの時の処理
}else{
 //条件がfalseの時の処理
}
```

falseの時の処理がない場合はtureの時の処理のみ記述しfalse部分の処理を省略することが出来ます。

```js
if(条件式){
 //条件がtrueの時の処理
}
```

次に具体的なサンプルコードを見てみます。

```js
let num = 25;

if( num < 50 ){
	console.log('numは50以下です');
}else{
	console.log('numは50以上です')
}
```

変数numに格納されている値が50以下か50以上かを判断するための式となっています。
numの値は25なのでif文はtrueと判断され一つ目の処理が行われます。

### 複数の分岐処理ができるelse if

elseの代わりに`else if`と書くことで分岐条件を追記していくことが可能です。

```js

let num = 25;

if( num > 100 ){
	console.log('numは100以上です');
}else if( num > 50 ){
    console.log('numは50以上です');
}else{
	console.log('numは50以下です');
}
```

`else if`は必要に応じ増やすことが可能の様です。

今回記事を書くにあたり下記のページ、書籍を参考にさせて頂きました。
https://jsprimer.net/
https://ja.javascript.info/
https://gihyo.jp/book/2016/978-4-7741-8411-1
Raspberry Pi ZeroのGPIOを使ってブラシレスモーターを制御する

# Raspberry Pi Zeroでブラシレスモーターを制御する

## 概要
ちょっと思うところがあって、市販のブラシレスモーターをRPi Zeroを使って制御してみました。

## 構成
* Raspberry Pi Zero W 
(https://www.amazon.co.jp/gp/product/B0799FCCWS/) 
* 適当なブラシレスモーターとESC(スピードコントローラー)セット
(参考: https://www.amazon.co.jp/gp/product/B01MTCBO7D/)
* 適当なバッテリー

![IMG_20191018_212638-01-small.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538088/7c6c655d-befe-fcd2-b21b-561bc9f0d955.jpeg)


## 接続

1. モーターとESCを繋ぐ。3本線があるが、適当に繋いでも回転が逆になるだけなので大丈夫。
2. ESCとRPiを繋ぐ。コネクターに3本入っているが、真ん中の線は使わない。黒い線と反対側の何色かのもう一本を使う。黒い方を適当なGNDに、色がついている方を適当なGPIOに繋ぐ。GPIOは後でプログラムで指定するので、何番かをメモっておく。
ピンアサイン参考: https://www.raspberrypi.org/documentation/usage/gpio/
3. いざ動作確認する段階でバッテリーを繋ぐ。何が起こるかわからないので、安全なバッテリーを推奨。例ではそのへんに転がっていたウナギ型のLiFeを利用。普通はウナギリフェなんて転がってはいないので注意。

## プログラミング

とりあえずパルス幅を指定してやり、少しずつ回すのを繰り返す。

### サンプルソースコード
```python
import pigpio
import time
motor_pin = 27 #メモしたGPIO番号

pi = pigpio.pi()

for i in range(3):
        pi.set_servo_pulsewidth(motor_pin, 1500) 
        time.sleep(1)
        pi.set_servo_pulsewidth(motor_pin, 1600) 
        time.sleep(1)
        pi.set_servo_pulsewidth(motor_pin, 1700) 
        time.sleep(1)
        pi.set_servo_pulsewidth(motor_pin, 1800) 
        time.sleep(1)
        pi.set_servo_pulsewidth(motor_pin, 1900) 
        time.sleep(1)
        pi.set_servo_pulsewidth(motor_pin, 2000) 
        time.sleep(1)
        

pi.set_servo_pulsewidth(motor_pin, 0) 
pi.stop()
```

### 解説
```
pi.set_servo_pulsewidth(motor_pin, 1500) 
time.sleep(1)
```
motor_pinでGPIO番号を指定し、パルス幅を数値で指定する。
指定できる値範囲がどこからどこまでかは、ESCの仕様による。
ESCの仕様がわからない場合は手探りで探すしかない。
このESCでは、1500ぐらいから2000ぐらいまで指定できた。
sleepで、次の状態までの持続時間を指定する。


```
pi.set_servo_pulsewidth(motor_pin, 0) 
```
止める場合は、こんな記述をしないとうまくいかなかった気がする。
いらなかったかも。まあおまじない的な。

ESCによっては、動かす前におまじないが必要なものもあるらしい。
それはESCの仕様を調べるしかない。

## まとめ

という感じで、めちゃくちゃ簡単にブラシレスモーターを制御できた。
ただし、既存のESCを使ってのパルスと時間の制御になるので、厳密なブラシレスモーターの制御とは言えないかも。本来は、ESCの機能をそのものをRPiで制御したい。

ちなみにこのブラシレスモーターは、中身が回るのではなく、外側のガワが回るので、固定しないとめっちゃ暴れる（笑）中央のローターが回るモーターを使ったほうが安全だと思う。

RPiを使ってモーターを制御すると、目に見えて制御できてる！！という達成感が得られるので、プログラミングの勉強にもおススメ。このブラシレスモーターとESCのセットは1000円ぐらいで買えるので、下手な電子工作キットなどを買うより安価に楽しめると思う。
Gitのpush/pull等でパスワードを聞かれないようにする

gitのpushやpullするときに毎回パスワードきかれるので `ssh-agent` を使って入力を省略できるようにする。

1. ssh-agent起動 : ``eval `ssh-agent` ``
1. ssh-agent起動確認 : `ps -ef | grep ssh-agent`
1. SSH鍵を登録 : `ssh-add ~/.ssh/id_rsa`
1. パスフレーズを聞かれるので入力する

これでSSHキーが登録されて、毎回パスフレーズを聞かれることがなくなる。

ただし、ログアウトするとパスフレーズが消え去るので、またパスフレーズ入力が再発する。対策は検討中。
【Linuxコマンド】Linuxコマンドのパイプ

# コマンド1 | コマンド2という風に

Linuxコマンドの基本であるパイプ。
コマンド1 | コマンド2 という風に書いて、
複数コマンドを組み合わせて使えます。

コマンド1によってターミナルに表示される文字に対して、
コマンド2を実行します。

## 具体例

### ls | wc -l

```terminal
ls | wc -l
```

lsコマンドは存在するファイルを表示するコマンド。
wcコマンドは行数、文字数を表示するコマンド、
-lは行のみを表示するオプション。

lsコマンドでファイルを全て表示して、
wc -lコマンドで行数を表示する。
このように組み合わせて、ファイル数を数えるといった使い方が出来ます。


### grep 文字列 ファイル名 | 文字列 ファイル名

```terminal
grep 文字列 ファイル名 | 文字列 ファイル名
```

```terminal
grep c 101.cpp | grep d 101.cpp 
```

grepコマンドは文字列を、入力したファイル名のファイルから見つけて、
該当する行を表示してくれます。
この例ではgrepを2回使っています。

なので、先に入力したgrepコマンドで101.cppからcを含む行を表示。
表示された文字に対して後から入力したgrepコマンドで101.cppからdを含む行を表示。
結果的に101.cppからcとdを含んだ行を抽出して表示してくれます。

# コマンドは3つ以上でも使える
先に書いたように、表示された内容に対してコマンドを実行するだけ。
なので

```terminal
コマンド1 | コマンド2 | コマンド3 | コマンド4 | コマンド5...
```

という風に大量のコマンドを繋げることも可能。
例にあげたコマンド以外でももちろん利用できます。

標準であるコマンドとパイプを使えば
ターミナル操作で殆どのことができるので、
使ったことがなければ是非活用してください。
Gitのコマンド With 英単語

この記事は[こちらのブログ記事](https://yk0807.com/techblog/2019/11/26/git%e3%81%ae%e3%82%b3%e3%83%9e%e3%83%b3%e3%83%89-with-%e8%8b%b1%e5%8d%98%e8%aa%9e/)をQiitaに移したものです。

普段よく使っているGitコマンド。でも、意外とその意味については十分に理解していないのかもしれません。というのも、Gitのオプションの単語で日常あまり使わないなーという単語が結構あるような気がします。
今回はGitのコマンドに出てくる単語を<a href="https://dictionary.goo.ne.jp/ej/">Gooのオンライン英和辞典</a>で調べてみようと思います。

<strong><a href="https://dictionary.goo.ne.jp/word/en/commit/#ej-17795">commit</a> 身を委ねる、引き渡す、約束させる</strong>
<strong>git add （変更したファイル名）</strong>で変更をインデックスに上げて、<strong>git commit -m "コメント"</strong>でインデックスに上がっている変更を確定させるというのは基本中の基本。
で、commitを調べると、身を委ねるとか引き渡すとかの他に（犯罪を）犯すとか物騒な意味も。まあGitのコマンドの場合は変更内容をリポジトリに引き渡すとかそんな感じだろう。
余談だけど、ライザップのCMで良く言っている「結果にコミット」は、どちらかというと約束させるとかに近いのかな。

<strong><a href="https://dictionary.goo.ne.jp/word/en/amend">amend</a> 訂正する、改良する、修理する</strong>
上のgit commitで変更内容をコメントとともにリポジトリに渡したはいいが、コメントに間違ったことを書いてしまったとか、たまにありますよね。こんな時は<strong>git commit --amend</strong>と打つと、エディタが開いてコメントを訂正することができます。１番目の意味そのまんまですね、変なコメントが残ったままだと何かと格好悪いので、コメントを間違えた！という時はこのコマンドを使いましょう。

<strong><a href="https://dictionary.goo.ne.jp/word/en/revert">revert</a> （元の習慣・状態・話題などに）戻る，（元の考え・議論に）立ち帰る，戻る，（…を）顧みる，回顧する</strong>
上のamendはコミットコメントを修正するものですが、コミットそのものをなかったことにしたい場合もあります（なるべく避けたいケースですが）。そんな場合は<strong>git revert ***（コミットID）</strong>でコミットを打ち消します。この場合は、まさに元の状態に戻るという意味ですね。

<strong><a href="https://dictionary.goo.ne.jp/word/en/stash/#ej-81067">stash</a>  …を（秘密の場所に）しまっておく，かたづけておく，隠しておく</strong>
作業の途中で別のブランチに切り替えて作業したりするときに現在の変更を一時的に退避しておくときに<strong>git stash</strong>を使います。stashの詳しい使い方は<a href="https://qiita.com/fukajun/items/41288806e4733cb9c342">この記事</a>が参考になります。
秘密の場所というと大げさですが、一時的に別の場所にしまっておくという感じですね。

<strong><a href="https://dictionary.goo.ne.jp/word/en/fetch/#ej-31125">fetch</a> 行って取ってくる、奪い取る、もたらす</strong>
最近だとgit pull origin masterでリモートブランチの中身をローカルに取り込んで更新することが多いので<strong>git fetch</strong>はそんなに使うことはないのですが、git fetchでリモートの更新内容をローカルに持ってきて、git merge origin masterで持ってきた内容に更新するということなので、意味は知っておいたほうがいいと思います。
fetchという単語は色々な意味があるようですが、この場合は行って取ってくるに近いですね。

<strong><a href="https://eow.alc.co.jp/search?q=rebase">rebase</a> 新しいベース［土台・基準レベル］を～に設定する</strong>
この単語はGooのオンライン辞典ではなかったので、アルクの英辞郎 on the webで調べました。
チーム開発ではよく使うコマンドで、マスターブランチ（例えばdevelopとします）を他の人が更新したとき、<strong>git rebase develop</strong>で更新内容を自分が今いるブランチに取り込んで、自分のブランチを最新のdevelopから派生したようにすることです。詳細な説明は<a href="https://qiita.com/310ma3/items/e0ec74b47c6c219f2a8b">こちらの記事</a>をみてください。
英単語としてはそんなに使う単語ではないようですが、新しいベースに設定するという意味を見ると、なるほどという感じですね。
それ以外だと、歯科医が義歯の交換をするなどの意味で使うようです。

gitのコマンドの意味を正しく理解してより正確に使えるようにして、ついでに英語にも強くなりたいですね。