OmniAICreator/Qiita-1.07M huggingface dataset:
Goで標準入力がターミナルかどうかを判定する(Goで標準入力がファイルかどうかを判定する)

## 概要
Vim を起動する際に以下のように標準入力をファイルにすると警告が出ます。

```shell
$ vim < test.txt
Vim: Warning: Input is not from a terminal
...
...
```

テキストエディタやコマンドラインツールを作っていると標準入力がファイルかターミナルか知りたい場合があります。
今回はGoにおいてそれをどうやって実現するか書きます。

## 実践
まずは完成形から。
コードの仕様は以下の通りです。
1. 標準入力がターミナルの場合、固定文と引数を出力する。
2. 標準入力がファイルの場合、固定文とファイルの中身を出力する。

```
例)
$ go run main.go hoge fuga
from terminal
[hoge fuga]
$ go run main.go < test.txt
from not terminal
111
222
333
```

```golang
package main

import (
	"fmt"
	"io/ioutil"
	"os"
	"syscall"

	"golang.org/x/crypto/ssh/terminal"
)

func main() {
	if terminal.IsTerminal(syscall.Stdin) {
		fmt.Println("from terminal")
		fmt.Println(os.Args[1:])
	} else {
		fmt.Println("from not terminal")
		b, err := ioutil.ReadAll(os.Stdin)
		if err != nil {
			fmt.Println(err)
			os.Exit(0)
		}
		fmt.Println(string(b))
	}
}
```

今回、標準入力がターミナルかどうかを判定する肝となるのは`terminal.IsTerminal(syscall.Stdin)`の部分です([GoDoc](https://godoc.org/golang.org/x/crypto/ssh/terminal#IsTerminal))。
引数に対象となるファイルディスクリプタの番号をしていることによりファイルディスクリプタがターミナルかどうか判定してくれます。
標準入力のファイルディスクリプタの数値は固定で0なのでそれを指定します。



## 終わりに
過去に以下のような記事も投稿しています。一つ一つは簡単なことですが、これらの要素を組み合わせることにより自らの望むツールの実現に繋がるのでごましお程度に覚えといてください。
[Goでエスケープシーケンスを扱う(文字色、カーソル移動)](https://qiita.com/t0w4/items/a1b312693adb5e9d68c2)
[Goでターミナルのサイズに合わせて枠を表示し続ける](https://qiita.com/t0w4/items/29798299155713f15a83)
laravelでゲストログイン機能を作成

今やポートフォリオには必須の機能とされているゲストログイン機能を作成しました

環境
PHP 7.3.11
Laravel Framework 7.29.3

今回はLoginControllerをいじっていきます

```LoginController.php

//省略//

public function guestLogin() {
        $name = 'ゲスト';
        $password = 'guestpass';

        if(Auth::attempt(['name' => $name, 'password' => $password])) {
            return redirect('/home');
        }

        return redirect('/');
    }

```

Auth::attemptは引数に指定したレコードがDB内にあればtrue,そうでなければfalseを返す

今回は予めゲストログイン用のユーザーアカウントを作成しておき名前とパスワードをname,passwordに代入、
Auth::attemptメソッドの引数に指定すればもちろんtrueが帰ってくるので認証が成功し
/homeにリダイレクトされるといった感じです。


```web.php

Route::get('/login/guest', 'Auth\LoginController@guestLogin');

```

/login/guestを踏めばguestLoginメソッドが実行されます

```guestLoginComponent.vue

<template>
  <div>
    <a class="nav-link" @click="openModal">ゲストログイン</a>
    <div class="overlay" @click="closeModal" v-if="showContent">
      <div class="dialog" @click="stopEvent">
        <p class="borderbottom pt-2 pb-4">ゲストユーザーとしてこのサイトをお試しになれます</p>
        <p class="text-right pr-2">
          <a @click="closeModal" class="mr-4 black">キャンセル</a>
          <a href="/login/guest" class="ml-auto">ログイン</a>
        </p>
      </div>
    </div>
  </div>
</template>

<script>
   export default {
     data() {
       return {
         showContent: false
       }
     },

     methods:{
      stopEvent(){
        event.stopPropagation()
      },
      openModal(){
        this.showContent = true
      },
      closeModal(){
        this.showContent = false
      }
    }
  }
</script>


```

今回はゲストログインボタンを押したらダイアログが表示され「ログイン」をクリックしたらメソッドが発火するというデザインにしてみました。
Javascriptエラー問題集

##事前準備

ターミナル上で下記コマンドを実行してcloneする。

```
git clone https://github.com/Shu-Hos/ajax_app_error.git
cd chat-app_error
bundle install
yarn install
rails db:create
rails db:migrate
```

###問題１
新規投稿をしてもイベントが発火しません。
まずはこちらを解決しましょう！


###問題2
新規投稿をしようとすると添付画像のエラーが表示されます。
次はこちらの問題を解決してください。

![スクリーンショット 2020-12-06 19.42.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613200/881d7aa0-7567-0b63-633f-97ef23bb02a5.png)

<details><summary>ヒント</summary><div>
エラーの英文のしっかりと確認しましょう。
formText.value = "";に対して`Cannot set property value of null`と出ています。こちら翻訳するとnullのプロパティ値を設定できないという意味になります。こちらをヒントにプロパティ周りを確認してみると良さそうです。

</div></details>


###問題3
問題2のエラーが解決した後に再度新規投稿しても非同期ではUndefinedが出てしまい、一度リロードしないと投稿内容が反映されません。
こちらを修正して非同期で投稿ができるようにしましょう

![スクリーンショット 2020-12-06 19.50.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613200/75eff050-3588-6c65-6f92-1697c2789487.png)


<details><summary>ヒント</summary><div>
こちらエラーが出ずにUndefinedが出るということは、ajaxでレスポンスを受け取った後、新しい要素を作り出して表示するまでのプロセスのどこかに問題が潜んでいる可能性が高いです。


</div></details>


###問題4
残りはcheck機能のエラー問題です。
投稿をクリックしても色が変化せずに添付画像のエラーが出てしまいます。
こちら原因が２箇所あります。

![スクリーンショット 2020-12-06 21.40.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613200/0f0f1f3f-6d62-cba4-e03d-572e259257f2.png)


<details><summary>ヒント</summary><div>
こちら404(Not found)エラーが発生していることから、Ajax送信時に問題が起きている可能性が高いです。
ajaxの送信内容やコントローラー周りを疑ってみましょう。
コントローラーでbinding.pryを使用してみるのも良いかも知れません。
</div></details>


###問題5

![スクリーンショット 2020-12-06 22.02.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613200/402da732-76d0-c37c-64b5-6bbf97ef21d8.png)

エラーはでなくなりましたが投稿を何回クリックしても色が白に戻りません。
こちらがクリックする度に色がグレーと白が交互に変わるように修正してください。

<details><summary>ヒント</summary><div>
コンソールにエラーが出ていない＋グレーには色が変わるという部分から
レスポンスを受けとった後に問題が潜んでいる可能性が高そうです。
色はどのように変化させているのかロジックを深く考えてみましょう。
</div></details>

お疲れさまです！！
何かご不明点とかあれば、今後ぜひ教えてください！
AtCoder 緑(800)になるまでにやったこと

こんにちは、yukad2です。
この記事では私がAtCoderでRating:800になるまでに勉強したことをまとめています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/499004/140b0ef0-ed8c-e538-4b24-9221793e7667.png)


#0. 緑になってから

前回の記事([AtCoder 茶色(400)になるまでにやったこと](https://qiita.com/yukad2/items/9fb2ffa7137c13cd290a))のあと、ABC3完でレートが下がることがあったので、少しコンテストを中断していました。下がるとモチベーションも下がってしまうので、そのときに立てた戦略が以下になります。

1. ABCは4完40分を目標にする。
2. D問題が難しいとき(水色diff)もあるので3完20分を目標にする。速く解くことを意識。
3. ARCも2完30分でパフォーマンス1000ぐらいが出るので積極的に出る。

「パフォーマンス1000で安定する」ことを目標にしていました。これを実現するために、茶色diffは確実に解けるように練習しました。

#1. 勉強したこと
## 過去問
AtCoderProblemsのTrainingの[Medium100](https://kenkoooo.com/atcoder/#/training/Boot%20camp%20for%20Beginners/2)を上から順番にしていきました。茶色になったときには合計で36問解いていました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/499004/e72fcb46-3fb3-bf33-7a21-6e2ebc08b891.png)

##しゃくとり法
数列の部分を調べる問題で使います。この記事が参考になります。
[しゃくとり法 (尺取り法) の解説と、それを用いる問題のまとめ](https://qiita.com/drken/items/ecd1a472d3a0e7db8dce#1-%E3%81%97%E3%82%83%E3%81%8F%E3%81%A8%E3%82%8A%E6%B3%95%E3%81%A8%E3%81%AF)

##いもす法(累積和)
[ABC183 D - Water Heater](https://atcoder.jp/contests/abc183/tasks/abc183_d)で学習しました。
コンテスト中に似たようなものを地力実装しましたが、知っている方がきっと便利です。

[いもす法 - いもす研 (imos laboratory)](https://imoz.jp/algorithms/imos_method.html)

##グラフアルゴリズム
幅優先探索(BFS)と深さ優先探索(DFS)を勉強しました。
勉強しただけでコンテストで使ったのはBFSの1回だけです。(D問題でグラフ問題が全然出ない？)

##動的計画法
漸化式からコードにできなくて「あ～～～これは動的計画法でするんだろうな～～～わからん！」みたいになります。
フィボナッチぐらいはできるようになりました。

#2. 次にすること
卒業まで(あと1年と3ヶ月)に水色を目標にしているので精進を続けます。が、就活も始まってメンタル的にも時間的にもしんどくなっちゃってます。
## 勉強したいこと、できるようになりたいこと
- UnionFind木
- ダイクストラ法
- 蟻本中級編
- dpの300-500点問題を安定して解く
PythonとC++の中間言語を作ってみた(コード付き)

# まえがき
早く暖かくなってほしいがそういえばなんでうちにはこたつがないのか
疑問に思っているdangomushiです。

# 作ってみた

はい。いつものごとく何もやることがありませんので作ってみました。最近ファイルとかの
処理しかしてないんだが、、、、ｗ
気を取り直して、概要です。

## どんなん？
例えば、このコードは(C++に翻訳してそのコードを)実行できます。
~~どうしてもOmega言語にしたい筆者~~

~~~test.om
import "iostream"

use std;

def main() {
    print "OK";
    return;
}
~~~

これをpythonで読みこんでC++コードにすると

~~~cpp:test.cpp
#include "iostream"

using namespace std;

int main() {
    cout << "OK";
    return 0;
}
~~~

こうなる。
## コードです。

pythonコード

~~~python:main.py
import sys

class Read:
    def __init__(self):
        text = open(sys.argv[1])
        self.data = text.read()
        text.close()

    def ope(self):
        return self.data

    def run(self):
        return self.ope().replace("import", "#include").replace("return;", "return 0;").replace("def", "int").replace("print", "cout <<").replace("use", "using namespace")

class OmegaMain:
    def __init__(self):
        self.cpp = open(sys.argv[1].split(".")[0]+".cpp", "w", encoding="utf_8")
    def run(self):
        self.cpp.write(Read().run())
        self.cpp.close()

def main():
    OmegaMain().run()

if __name__ == '__main__':
    main()

~~~

今回は短いのでコードつき。

## まとめ

今回は、pythonとC++の中間言語を作りました。Githubに公開したら追記します。あんま意味ないと思うけど。
それでは、また次の記事でお会いしましょう！
さようなら！
Flutterで使える機械学習ライブラリ

# この記事
自然言語処理/画像認識/音声認識等をFlutter(Androidk及びiOSのみ)で使えるようにしたパッケージの機能の紹介します。
使い方や詳しい紹介はこの記事ではしないので公式やサンプルを参照してください。

## オールジャンル
### [mlkit](https://pub.dev/packages/mlkit)
#### 概要
Firebase ML Kitの機能を使えるようにしてくれる非公式プラグイン。
エッジ(デバイス/端末 以下エッジ)のみで動作します。
作者によれば非公式かつ開発中のためFlutter公式パッケージ([firebase_ml_vision](https://pub.dev/packages/firebase_ml_vision), [firebase_ml_custom](https://pub.dev/packages/firebase_ml_custom))の使用も検討して欲しいとのこと。

#### 機能
- 画像文字認識  
- 顔認識
    - 顔検出
    - 輪郭認識
- バーコードリーダー
- ラベル認識
- 言語識別
- カスタムモデル

#### 所感
使えるパッケージですが、もしこれらの機能を使うのであれば公式のものを使用してしまいます。


## 言語関連
### 言語翻訳
### [firebase_mlkit_language](https://pub.dev/packages/firebase_mlkit_language)
#### 概要
Firebase ML Kitの言語識別・翻訳の機能を使える非公式プラグイン。
エッジのみで動作します。
#### 機能
- 言語識別
- 言語翻訳

#### 所感
速度は早いですが翻訳の質がいまいちかなと思います。
感覚で言えばひと昔前の言語翻訳という印象です。
もしお金があってオンラインでの動作を考えているのであれば[Cloud Speeck API](https://cloud.google.com/speech-to-text/docs?hl=ja)等を使った方がいいかと思います。

## 音声関連

### 音声認識
### [speech_recognition](https://pub.dev/packages/speech_recognition)
**(注.)更新が2年前なので使用する場合は注意してください**

#### 概要
音声認識ができるパッケージ。
内部の処理にはネイティブのAPIを使用(AndroidはSpeechRecognizer、iOSはSpeech API)

#### 機能
- 音声認識(音声→文字列)    

#### 所感
iOSはエッジのみの動作は不可となります。
また開発で使いすぎると[こんな制限](https://stackoverflow.com/questions/39249003/speech-recognition-limits-for-ios-10#:~:text=The%20current%20rate%20limit%20for,audio%20associated%20with%20the%20request.)が発生することがありました。

### [flutter_tts](https://pub.dev/packages/flutter_tts)
#### 概要
テキストを読み上げしてくれるパッケージ。
内部の処理にはネィティブのAPIを使用(AndroidはTextToSpeech、iOSはSpeech Synthesis API)

#### 機能
- 音声認識(音声→文字列)

#### 所感
iOSはエッジのみの動作は不可となります。
また使いすぎると[こんな制限](https://stackoverflow.com/questions/39249003/speech-recognition-limits-for-ios-10#:~:text=The%20current%20rate%20limit%20for,audio%20associated%20with%20the%20request.)が発生することがありました。

## 画像関連
### [firebase_ml_vision](https://pub.dev/packages/firebase_ml_vision)
#### 概要
Firebase ML Kitの画像関連機能を使える公式プラグイン。
現在エッジ及びクラウド上(対応している機能のみ)での計算にｌ対応。

#### 機能
- 顔認識
    - 顔検出
    - 輪郭認識
- ラベル認識
- バーコードリーダー
- 画像文字認識

#### 所感
エッジでもサクサク動きます。

### [tflite](https://pub.dev/packages/tflite)
#### 概要
[Tensorflow lite API](https://www.tensorflow.org/lite?hl=ja)の機能が使えるプラグイン。Mobile NetやYOLO等の画像向けの機械学習を触ったことがある人にはおなじみのモデルが用意されてます。

#### 機能
- クラス認識
    - Mobile Net
- 物体認識
    - SSD・YOLO
- セグメンテーション
    - Deeplab
- 姿勢認識
    - PoseNet

#### 所感
こちらもサクサク動きます。

## その他
### [firebase_ml_custom](https://pub.dev/packages/firebase_ml_custom)
### 概要
Tensorflow Liteのカスタムモデルを最新の状態に維持してくれる公式パッケージです。
公式なので一応載せておきました。

# まとめ
Flutterで使える機械学習パッケージを紹介しました。
様々な機能があり、カスタムモデルもあるので一般的な用途であれば事足りるかと思います。

この記事では簡単な概要のみにとどまっています。
実際にプロダクトに組み込みこむ場合は仕様を知ること、ネットワークの制限、エッジでの処理速度等を考慮する必要があるかと思います。

最後にこの記事を読んだ人が参考になったら幸いです。
SSHキーの作成方法


SSHキーの作成方法をよく忘れるので残しておく。

# ED25519SSHキーを作成する場合

[ED25519キー](https://ed25519.cr.yp.to/)の方がRSAキーよりも安全でパフォーマンスが高いらしい。

```bash
# ED25519キー作成
$ ssh-keygen -t ed25519 -C "your_email@example.com"
```

# 【非推奨】RSASSHキーを作成する場合

:::note warn
注: Ed25519 アルゴリズムをサポートしていないレガシ システムを使っている場合は、以下を使います。
:::

```bash
# RSAキー作成
$ ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
```

# GithubにSSH接続する

### Mac側の設定

```bash
$ vim ~/.ssh/config
# 以下を追記する
Host *.github.com
  AddKeysToAgent yes
  UseKeychain yes
  IdentityFile ~/.ssh/{作成したSSHキーファイル名}
# 設定がうまくいっているかチェックする
$ ssh -T git@github.com
Hi takiguchi-yu! You\'ve successfully authenticated, but GitHub does not provide shell access.
# 上記以外のメッセージであれば、以下のコマンドで詳細を調べることができる
ssh -Tvvv git@github.com
```

### Github側の設定

```bash
# 公開鍵をコピーする
$ pbcopy < ~/.ssh/{作成したSSHキーファイル名}.pub
```

[こちら](https://github.com/settings/ssh/new) の Key のところに貼り付ける。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59081/aa67ac89-753f-dd4b-8a2e-7dbc2410c91b.png" width=300>

# 参考

https://docs.github.com/ja/authentication/connecting-to-github-with-ssh/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent
Blender: Make Planar Faces の機能と実装

この記事は Blender Advent Calendar 2020 6日目の記事です。

この記事ではメッシュを構成する四角ポリゴンやNゴンを平坦化する Make Planar Faces という機能と、その実装について説明します。
ソースコードは Blender 2.90.1 のものを参照しています。

## Make Planar Faces の機能の概要
4つ以上の頂点から構成される面[^1]（四角ポリゴンやNゴン）では、すべての頂点が同一平面[^1]上に存在するとは限りません。
たとえば、以下のような面では、すべての頂点を含むような平面は見つかりません。
![face1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479541/f83c267e-186f-83a2-117d-9b76ca656806.png)

Make Planar Faces は、このような歪んだ面を平坦な面に近づけます。[^2]
下図の灰色の面は黒い面に Factor=0.5 として Make Planar Faces を適用したもので、白色の面は黒い面に Factor=1.0 として Make Planar Faces を適用したものです。 
図を見るとわかるように、Factor=0.5 の面の各頂点は元の面と Factor=1.0 の面の対応する頂点のちょうど中間にあります。
![face2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479541/425a9662-3f73-4439-7d3d-22b399f22a78.png)

Factor で1回の操作で各頂点をその移動先へどの程度近づけるのかを指定し、Iteration でこの操作を何回繰り返すかを指定します。

## Make Planar Faces の機能の実装
機能の概要では「移動先に近づける」といった抽象的な表現を使いましたが、この節ではそれらの操作が具体的にどのような処理で実現されているのか説明します。

Make Planar Faces に直接対応する関数は `source/blender/editors/mesh/editmesh_tools.c` の `edbm_face_make_planar_exec()` に実装され、`source/blender/editors/mesh/mesh_ops.c` でメッシュに対する操作として登録されています。

`edbm_face_make_planar_exec()` では、複数のオブジェクトから[^3]それぞれのメッシュを取得して、それぞれのメッシュに対して、メッシュ内のそれぞれの面を平坦化する処理を行います。
メッシュ内のそれぞれの面を平坦化する処理は `blender/bmesh/operators/bmo_planar_faces.c` の `bmo_planar_faces_exec()` に実装されています。

### `bmo_planar_faces_exec()` の実装
Make Planar Faces の実際の処理にあたる `bmo_planar_faces_exec()`について説明します。

最初にメッシュ内の面を3頂点の面とそれ以外の面に分け、3頂点でない面に含まれる頂点の合計を計算します。
3頂点の面はもともと平坦なので、3頂点でない面と頂点を共有していない限り、3頂点の面に含まれる頂点は処理する必要がありません。

その他にいくつかの初期化処理が実行された後、面を平坦にする処理が始まります。
この処理は Iteration で指定された回数だけ繰り返されます。
面を平坦にする処理は以下のようなものです。

1. 処理する必要がない3頂点の面をスキップして、メッシュ中の各面に対して以下の処理をする
    1. 処理中の面と法線が同じで、処理中の面の幾何重心を含む平面を計算する[^4]
    2. 処理中の面の各頂点について以下の処理をする
        1. 未処理の場合、移動先の頂点を格納するメモリを確保し、移動元の頂点と関連付ける
        2. 移動先の頂点を計算する[^5]
        3. 移動先の頂点を移動元の頂点と関連付けられたメモリに保存する[^6]
2. 処理する必要がある面に含まれる各頂点に対して以下の処理をする
    1. 移動元の頂点から移動先の頂点への距離がεを超えていた場合
        1. この頂点を処理対象に再度追加する
        2. 移動元$v_1$と移動先$v_2$と Factor $k$ に対して結果 $v = (1-k)v_1 + kv_2$ を計算する[^7]
    2. 処理中の頂点を含む面すべてを処理対象に再度追加する
3. 2の1で移動元から移動先への距離がεを超えた頂点がひとつも無かった場合、Iteration で指定された回数を繰り返す前に終了する
4. 頂点の移動元と移動先の関連付けを初期化する

繰り返しが終了すると、メモリを開放して終了します。

## まとめ
実装を調べた時に書いたメモを整形して記事にしたら、何が書きたかったのかよく分からない記事になってしましました…

Make Planar Faces の実装やベクトル計算の実装を振り返ると、全体的に処理速度を意識した実装になっていたように思います。
重複した計算を避けたり、時間のかかる計算を避けたりするように実装されていました。
Blenderの起動や処理が速い背景には、こういった地道な高速化もあるようですね。

[^1]: 「面」と「平面」を区別して書いています。面は3つ以上の頂点と、それらを循環するようにつなぐ辺と、法線を持ちます。
[^2]: Make Planar Faces は、すべての頂点が正確に単一の平面に含まれるように変形するわけではなく、少しずつ平坦に近づけていきます。
[^3]: Blender 2.80 よりも古いバージョンでは選択中の単一のメッシュに対してしか適用できなかったようです。
[^4]: 平面は4つの浮動小数点数で表現されます。法線ベクトルのx, y, z要素と、原点から平面への距離に法線ベクトルの長さをかけた値が格納されています。
[^5]: 法線ベクトルに沿って頂点を移動させ、平面に最も近い点を計算します。平面がうまく表現されているので、簡単に計算できます。
[^6]: 他の面で同じ頂点が処理されていた場合、移動先の頂点が複数あることになります。メモリに保存される値はこれらの幾何重心を取るように計算されます。
[^7]: 結果として、$|v_1-v| : |v_2-v| = k : 1-k$ になります。
地図アプリ開発で React Hooks を利用して React コンポーネントを作成する。

本エントリーは [React Advent Calendar 2020 5日目](https://qiita.com/advent-calendar/2020/react)のエントリーです。

地図アプリの開発では、よく Google Maps API を使用するケースが多いと思いますが、最近は、Mapbox や ArcGIS、オープンソースを利用して開発するケースも増えてきています。今回は、ArcGIS の ArcGIS API for JavaScript で React を使ってみましたので、インストールから簡単な地図データの表示までを紹介したいと思います。 

詳細は以下に公開しています。
https://freedom-tech.hatenablog.com/entry/2020/12/06/214824
Commandまとめ

\![Mac OS X-10.15.7](<https://img.shields.io/badge/MacOSX-10.15.7-brightgreen>) \![ruby-2.7.1p83](<https://img.shields.io/badge/ruby-2.7.1p83-brightgreen>) 


# Command まとめ

忘れがちなコマンド


## emacs command:

| method  | 出力結果        |
|:--------|:----------------|
| C-spacs | コピペ          |
| C-w     | 選択範囲を切り取る|
| C-y     | 貼り付け        |
| M-w     | 選択範囲をコピー|


## emacs カーソル移動

| method | 出力結果   |
|:-------|:-----------|
| C-a    | 行の先頭に移動|
| C-e    | 行の末尾に移動|
| C-p    | 1行上に移動|
| C-n    | 1行下に移動|
| C-f    | 1文字前に移動|
| C-b    | 1文字後に移動|


## ruby 出力

| method | 出力結果               |
|:-------|:-----------------------|
| print  | 出力後改行されない     |
| puts   | 普通の出力             |
| p      | ダブルクォテーションが付く|
| pp     | ダブルクォテーションが付く|
| printf | 出力後改行されない     |


## ruby 入力

| method         | 出力結果                                                    |
|:---------------|:------------------------------------------------------------|
| ARGV[引数番号] | ruby プログラム名 引数[0]　引数[1]…　でコマンドライン引数を取得|
| gets           | キーボード入力を文字列で取得                                |
| gets.to\_i     | キーボード入力を整数で取得                                  |
| gets.to\_f     | キーボード入力を浮動小数点数で取得                          |



------
 - **source** ~/grad_members_20f/members/wjswnsrud12/memo.org
WebAPIの設計に力を入れよう


LITALICOの主にバックエンド側を担当しているエンジニア、@t-kontaです。
この記事は『[LITALICO Advent Calendar 2020](https://qiita.com/advent-calendar/2020/litalico)』8日目の記事です。

# はじめに

LITALICOでは福祉サービスに関連する請求業務を簡単に行えるよう支援するサービスを提供しています。障害福祉サービス等の報酬改定は原則3年に一度行われますので、システムもそれらに追随していく必要があります。

その為、当初から変化に強く、柔軟に壊しやすくという標語をあげてシステム開発に挑んできました。マイクロサービス的な構成を取り入れたものその一環です。

さて、来年度の法改正に伴う全容も見え始め、開発ではその予測と対策にてんやわんやな状況が続いています。報酬に関する計算が異なる為、年度ごとに処理を分ける必要があるのですが、WebAPIのエンドポイントをどのように扱うかといった議論もされました。

振り返ると、WebAPIの設計については注意を割くリソースが少し不足していたかもしれません。
そこで、WebAPIの設計を考える上でどうあるべきだったかという反省を踏まえて、設計で大切にしたいことを記しておこうと思います。


# WebAPI設計はアプリケーションの一部

ところでAPIとは何でしょう。
Application Programming Interface の略語だったりします。

自分は普段「IFさえ問題なければ何とかなる」という発言をたまにしますし、その辺りがどうなっているかという点に敏感です。コードレビューをする際に様々な観点はあると思いますが、そのオブジェクトがどのようなIFを持っているかを一番気にします。それさえ問題なければ中のコードがどんなに汚くても構まわないとすら思っています（最終的には一定の品質を期待します）。

なぜIFが大事かといえば、それが一度公開され場合に容易に変更が出来なくなるものだからです（[^1]）。内部的な変更は影響を局所化出来ますが、公開され利用され始めたAPIの変更は大きなコストを伴うものになってしまいます。

WebAPI、頭にWebとついており何となくプログラムを実行する為にアクセスするURI、ぐらいの印象があるかもしれません。しかし、APIである以上これはれっきとしたアプリケーションのIFなのです。

**WebAPIをただの玄関として捉えてしまったイメージ**
![WebAPI設計 - diagrams.net 2020-12-07 02-45-24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104643/2ecdc9c6-de7c-eee3-4ba6-4236de4964cf.png)


**しかし本来はWebAPIの設計を含めて一つのアプリケーション**

![WebAPI設計 - diagrams.net 2020-12-07 02-47-10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104643/6ec5aa44-e5d6-3201-dd77-94babf65accc.png)

**さらに発展させたイメージ**
![WebAPI設計 - diagrams.net 2020-12-07 02-48-21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104643/6614a32b-90b8-ada1-626d-18bf1d86d6cf.png)


web系のシステム開発では、APIのエンドポイントがどうあるべきかという議論が後回しになってしまう事が経験上多くありました。特に単体としては注意深く見ても、全体を俯瞰しての相互の影響、バランスを見るという観点が抜けてしまいがちな気がしています。


# API一覧を眺めてみることの重要性

API一覧がありそれを眺めていると、そのシステムにどのようなユースケースがあるのかをイメージ出来ます。さらにはそのシステムがどのような価値を提供しようとしてるのかも見えてきます。

自分が所属する開発部では、[Swagger](https://swagger.io/)や[apiDoc](https://apidocjs.com/)といったドキュメント生成ツールを活用しています。これらのツールは個別のAPIを詳細に見るにはとても優れているのですが、一覧性がやや悪いように思えます。

ドキュメント生成ツールを使用しつつ、それらから以下のように全体を一覧出来る仕組みを整えるとよいかもしれません。

|method|endpoint|目的|
| --- | --- | --- |
| GET | http://xxx/children | 児童一覧を取得する |
| GET | http://xxx/children/{code} | 児童を取得する |
| POST | http://xxx/children  | 児童を登録する |
| PUT | http://xxx/children/{code}  | 児童を編集する |


こうすることで、あるAPIがバランスを欠いてないか、目的が重複していないかといったチェックが出来るようになります。

特にREST APIを意識して開発する場合、endpointにリソースの情報が適切に表され、methodと対応して目的に合致しているかを見ます。なお、URI中のクエリーパラメーターは原則省略可能なものであり、それらが無くともmethodとendpointのみでAPIの性質が伝わるようにする必要があります。


# おわりに

とりあえず、API一覧とコール回数眺めていると何か楽しいです。
別の機会にもっと具体的な事例に踏み込めればと思います。

明日は @katzumi さんの記事です。
お楽しみに！


[^1]: ここでいう公開とは、ネット上での公開非公開ということではなく、自分以外の開発者やユーザーに認知され利用され始める状況を指しています。
EC2 から RDS(PostgreSQL) へ Zabbix 初期データを登録する

# 概要
RDS(PostgreSQL)をZabbixのDBとして利用する際、
Zabbix初期データの登録コマンドがわからず手間取ったので、その備忘。

# 環境
EC2(RHEL8)
RDS(PostgreSQL 12.4)
Zabbix 5.2

# 手順
## クライアントモジュールのインストール
<pre># dnf -y module install postgresql:12/client</pre>

## zabbixユーザおよびzabbix DB作成
[Zabbix公式ページ](https://www.zabbix.com/jp/download?zabbix=5.2&os_distribution=red_hat_enterprise_linux&os_version=8&db=postgresql&ws=apache)に書かれている以下のコマンドに該当する手順。
`# sudo -u postgres createuser --pwprompt zabbix`
`# sudo -u postgres createdb -O zabbix zabbix`

上記コマンドはPostgreSQLサーバがインストールされている場合のものなので、今回の構成では使用しない。
RDSへ接続を行い、ユーザとDBを作成する。
<pre># psql -h 【RDSのエンドポイント】 -U 【マスターユーザ名】 -d 【DB名】</pre>
作成前にユーザとDBの一覧を表示する。
<pre>
\> \du
\> \l
</pre>
zabbixユーザとzabbix DBを作成する。
<pre>
\> CREATE ROLE zabbix LOGIN PASSWORD '【RDSマスターユーザのパスワード】';
\> GRANT zabbix TO 【RDSマスターユーザ名】;
\> CREATE DETABASE zabbix OWNER zabbix;
</pre>
ユーザとDBの一覧を表示し、zabbixユーザとzabbix DBが作成されていることを確認する。
<pre>
\> \du
\> \l
</pre>

## Zabbix初期データ登録
Zabbix公式ページの初期データ登録コマンドでDB名を指している箇所をRDSへの接続コマンドに置き換える。
接続時のユーザ名とDB名は前述で作成したzabbixを指定する。
<pre># zcat /usr/share/doc/zabbix-server-pgsql*/create.sql.gz | sudo -u zabbix psql XXXXXXXXX.ap-northeast-1.rds.amazonaws.com -U zabbix -d zabbix</pre>

# 参照
その他、セキュリティグループ、confファイルなど、各種設定は以下の参照元と同じ。
[AWSのEC2とRDSを利用してZabbix4.2を導入する](https://qiita.com/yuichi1992_west/items/6c81a0e69ea9e7e86d83)
CentOS8上のDockerコンテナ内で「Errors during downloading metadata for repository 'AppStream」と出てyumやdnfが使えない

## 原因
リポジトリサーバの名前解決が失敗している

## dockerコンテナ内のDNSサーバを指定してあげる
- /etc/sysconfig/docker

```/etc/sysconfig/docker 
other_args="-dns 8.8.8.8″
```
First game production

#初めてのゲーム制作
UE4を使い始めてまだ日が浅いのですが、そろそろゲームを作りたいと思い、猫でも分かるシリーズをちょくちょく見させていただいておりました。

他にもYOUTUBEなどから初心者でも楽しめそうなものを探していたところ
「　びっとのゲーム制作ＣＨ　」　を拝見し、そこから真似て作ってみました。
リンク先　　　https://www.youtube.com/watch?v=gxiEd7hsV8Y

拝見してて解説がすごくわかりやすいので初心者でも入りやすかったです。
・PAWNてなに、生き物とか意思を持つもの、キャラクター。（イラスト入り）
・コンパイル、色々いい感じにして反映する奴。
・BLUEPRINT、enemy、敵の生き様。　（生き様とはなるほどという感じ）

以下はその中で使用したコマンド類。これだけで、そこそこのゲームができるUE4
やはりすごいと思います。（ブループリントの概念がやはり使いやすい。）

```
（敵の設定）
FloatingPawnMovement
AiMoveTo
GetPlayerPawn
EventTick
AddRelativeRotation
GetVelocity
CustomEvent
SpawnEmitterAtLocation
PlaySoundAtLocation
SphereOverlapActors
ForEachLoop
CastToPersonCharacter
DestroyActor
GetActorLocation
Normalize
OnComponentHit
CastToFirstPersonProjectile
```
![enemy.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/901468/23470bfd-b06e-0345-632d-45a23026a2e6.jpeg)

```
（マテリアル設定）　
カラー設定、変数、Multiplyの使い方がわからなかったが、なんとなく理解。
Time
Sine
Abs
Power
```

```
（敵の発生場所の設定）
EventBeginPlay
Delay
RndomFloatInRange
MakeTransform
```
![enemy_place.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/901468/1357cbac-54f5-c048-8a59-191d1343ad9f.jpeg)

```
（自分の挙動設定）
SetSimulatPhysics
AddForce
GetCurretLevelName
OpenLevel
```
![first_parson.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/901468/8b62d30f-25e6-fe49-6c95-951592bdbf48.jpeg)
　

これが参考にした作品
![01.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/901468/7c974287-85f7-f5c5-efca-1453f4cbe313.jpeg)
![02.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/901468/17e46e27-487f-bbd7-8dcd-c96c610ab828.jpeg)
そこから改良したのが私の作品です。
![UE4_001.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/901468/c039d765-a4af-5b4c-b233-1af677a1575b.jpeg)
![UE4_002.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/901468/1f346fb0-69b0-a395-1616-a0333a480f9d.jpeg)
　

この中には、猫でも分かるでご教授頂いた、平行移動と折返しの動きによるＢＰを入れて完成しました。
![UE4_003.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/901468/de3d8608-9fbe-94cb-56c6-9f2609470e08.jpeg)

MADEL
spider-tank
xyz-draft-punk-flying-rickshaw
old-industrial-pipe-pack-pbr
garbage-bin
truck-one-material


こんなに素晴らしいUE4。 
次はぷちコンに、チャレンジします。
　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　以上
Javascriptで括弧の中身の文字列を取得するメモ【2020】

[Javascriptで括弧の中身の文字列を取得するメモ](https://qiita.com/fuku2014/items/76880d70f68e1585d401)のアップデート版。

()の中身を取り出したい時。

```javascript
let str = "aaa(bbb)ccc";
console.log(str.match(/\((.+)\)/)[1]);

// output: bbb
```

{}の中身を取り出したい時。
([1]をなくせば様々な情報がセットで手に入ります。)

```javascript
let str = "aaa{bbb}ccc";
console.log(str.match(/\{(.+)\}/)[1]);

// output: bbb
```

{}で囲まれた複数の要素を取り出したい時。
(/gがあれば複数取得できます。)

```javascript
let str = "aaa{bbb}ccc{ddd}";
console.log(str.match(/\{.*?\}/g));

// output: (2) ["{bbb}", "{ddd}"]
```
情報源:[https://teratail.com/questions/156083]

{}で囲まれた複数の要素を取り出すんでなく、大きく取り出したい時。
(?があればできるだけ短いものを探索してくれるので上のような状態になります。)

```javascript
let str = "aaa{bbb}ccc{ddd}";
console.log(str.match(/\{.*\}/g));

// output: (2) ["{bbb}ccc{ddd}"]
```

もっと詳しく
---
[Javascript 正規表現入門](https://murashun.jp/blog/20190215-01.html)
【Docker】環境構築

#環境
- Ruby: 2.6.0
- Rails: 6.0.3
- MySQL
- MacOS

#Dockerの要約
##Dockerとは？
- `Docker Engine`を常駐させることで、ゲストOSを使用せず、ホストOSを基盤にミドルウェア以降を仮想環境（コンテナ）として起動する仕組み。
- ミドルウェア等の層をimageと呼び、`Docker Hub`で公開されている構成を流用したり、`Dockerfile`を用いて自身で新規作成する事もできる。
- `docker-compose.yml`に複数のコンテナ構成を記述することでこれらを一括起動できる。
- 流動データはコンテナ削除とともに消えるため、残したい場合にはホストのデータをコンテナにマウントする必要がある（`docker-compose.ymlに記述`）。



#手順
##1. Dockerfile・docker-compose.yml作成
```Dockerfile
FROM ruby:2.6.5
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs
WORKDIR /myapp
COPY Gemfile /myapp/Gemfile
COPY Gemfile.lock /myapp/Gemfile.lock
RUN gem install bundler:2.0.2 && bundle install
COPY . /myapp
```

[FROM] 使用するイメージとバージョン
[RUN] コマンドの実行
[WORKDIR] 作業ディレクトリ
[ADD] ファイルをコンテナへコピー
[EXPOSE] port番号
[CMD]　イメージ内部のソフトウェア実行（ここではRailsを指す）

```docker-compose.yml
version: '3'
services:
  db:
    image: mysql:5.6
    environment:
      MYSQL_ROOT_PASSWORD: password
      MYSQL_DATABASE: root
    volumes:
      - mysql-data:/var/lib/mysql
    ports:
      - "3306:3306"

  web:
    tty: true
    stdin_open: true
    build: .
    command: /bin/sh -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
    volumes:
      - .:/myapp
    ports:
      - "3000:3000"
    links:
      - db

volumes:
  mysql-data:
```
dbボリュームを設定しコンテナを終了してもデータをボリューム内に残すための記述。
appボリュームを設定しローカルにあるディレクトリをコンテナにマウントするための記述。
コマンドの`/bin/sh -c "rm -f tmp/pids/server.pid`に関しては、Pidファイル削除のために記述。起動時に残っているとエラーを吐くため削除が必要。自分で削除しても良いが、これを書けば起動時に自動で削除するようになる。



##2. database.yml
```database.yml
default: &default
  adapter: mysql2
  encoding: utf8
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: root
  password: password
  host: db
```

##3. エラーへの対処
trueをfalseに変更すると正常に動作する。
厳密な整合性のチェックをオフにする事でエラーを回避しているようです。
記述時点では、アプリケーション動作に問題は発生していません。

```
========================================
 Your Yarn packages are out of date!
 Please run `yarn install --check-files` to update.
========================================
```
```webpacker.yml
# Verifies that correct packages and versions are installed by inspecting package.json, yarn.lock, and node_modules
check_yarn_integrity: false
```



以上
macOS CatalinaでVPNが繋がらない / SSHがタイムアウトする

# 概要
macOS CatalinaやBig SurでゲートウェイがVPNにならないことがある
別の環境では上手くいっていた場合の、問題解決に向けた記事
いつの間にか、ネットワークのサービスの優先順位が有効になった可能性がある

# 環境
- macOS Catalina 10.15.7（19H2）
  - 問題が発生
- macOS Catalina 10.15.5
  - 問題なし

※ 厳密にはOSのバージョンが起因ではない可能性があります。

# VPN設定

VPNを利用していれば、大抵の場合接続元ホストがVPNサーバになるはずなので、

[確認くん](https://www.ugtop.com/spill.shtml)などで自分のリモートホストを確認します。

ここで想定しているホストになっている場合は、この記事の問題は関係ありません。

# ホストが違う場合

想定しているホストになっていない場合、以下を確認します。

システム環境設定 >> ネットワーク
![before.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275986/7505ffc8-b524-025a-638e-f425a17f63cd.png)
「すべてのトラフィックをVPN接続経由で送信」にチェックが入っていることを確認します。
ここにチェックがないと、VPNを経由せずデータが送信されることがあります。
![all_traffic.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275986/71be2473-9de7-bc9b-d9d4-b6a775b659ca.png)

# それでも解決しない場合

2時間くらい試行錯誤した結果、サービスの順序が優先度に関係ありそうということが分かりました。
Wi-Fi、Bluetooth PANなど並んでいる場所の下にある設定アイコンから「サービスの順序を設定」を選択します。
![settings.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275986/157ae551-feb0-20ff-a584-5e0f00613c4c.png)
いつも利用しているサービス`WiFi`より上にVPNを移動させます。
![order.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275986/01e2ce39-28f9-3425-5b3d-7615ba251473.png)
先頭にVPNがきました
![after.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275986/5e695e93-aa95-c72e-353a-2352222883ec.png)

これで確認くんのリモートホストが変更されました！

(´-`).｡oO （前のOSだと順序関係なく接続できたのに...）


# 発端
余談、読み物です。

マシン移行後、VPN経由でサーバにssh接続しようとしたらレスポンスが返ってこない...ということが発端でした。
そもそも、タイムアウトが75秒だったようで、エラーメッセージに気付きませんでした。
ssh hoge -vで詳細を出したり、config名を使わずに接続したり、id_rsaのパーミッションを確認したり無駄な時間を過ごしました。

ちなみに-vオプションは以下のようなdebug情報が表示されます。

```
ssh user@x.x.x.x -i ~/.ssh/id_rsa -p 22 -v

OpenSSH_8.1p1, LibreSSL 2.7.3
debug1: Reading configuration data /Users/user/.ssh/config
debug1: /Users/user/.ssh/config line 1: Applying options for *
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: /etc/ssh/ssh_config line 47: Applying options for *
debug1: Connecting to x.x.x.x [x.x.x.x] port .
debug1: connect to address x.x.x.x port 22: Operation timed out
ssh: connect to host x.x.x.x port 22: Operation timed out
```

タイムアウトということが分かってからは、原因の想定をつけやすくて助かりました。
Marketing Cloud の概要 ⇒ Marketing Cloud の基礎 ⇒ Marketing Cloud の最大活用

１．Marketing Cloud を使用すると何ができますか?
２．Marketing Cloud サービスを導入に役立てる最適な方法はどれですか?
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634241/f254c2a5-5949-4aa1-9c87-72db77906272.png)
モダン JavaScriptとは、初心者がまとめてみた

#はじめに
脱初心者にむけてアウトプットをしていこうと思って、
記事を書いております。
私は、まだ現場に出たことのない完全にど素人です。
間違ったことがありましたら、ぜひコメントいただけると幸いです。

#対象読者
 JavaScriptの基本的な文法を学んだ後に、VueやReact,
Angularを学ぼうと決めている方、
モダンな(流行しているもの) JavaScriptの開発について知りたい方。


#モダン JavaScriptとは？
私が知っている範囲内で説明すると
1. React、Vue、Angular、Riot等の仮想DOMを用いるライブラリ/フレームワーク。
2. パッケージマネージャ(npm,yarnなど)を使っている。
3. 主にES2015以降の記法を使っている
4. モジュールバンドラー(Webpackなど)を使用している
5. トランスパイラ(Babelなど)を使用している。

以上の5つがそれぞれ含まれている場合、モダンなJavaScriptの開発と言えるでしょう。
一つ一つ簡易的に紹介していこうと思います。

##仮想DOMとは
React、Vue、Angulerなど、人気のライブラリやフレームワークには共通して、仮想DOMという手法を使っている。
まず、DOMとはHTMLを構築する木構造のこと。
このDOMをJavaScriptのオブジェクトに再現して、リクエストがあった時にブラウザに反映させることができるのが仮想DOMである。


##パッケージマネージャとは（npm/yarn）
Node.jsが開発される前までは、一つのファイルに全ての処理を書いていたらしい、、そしてNode.jsが開発されてからは様々なフレームワークが開発され、それによって、プログラムの依存関係が問題になった。
この問題を解決したのがパッケージマネージャーである。
それぞれの依存関係を解決し、さらに、世界中の公開されているパッケージをコマンド一つで使えるようになった。
つまり、パッケージマネージャーとは、依存関係を勝手に解決してくれるもの。


#ES2015以降の記法とは
ESとはJavaScriptの標準規格です。（コードを書く時のルール）
その2015以降から様々な便利な機能が追加されました。
三つだけ紹介します、
詳しくは→https://qiita.com/soarflat/items/b251caf9cb59b72beb9b


##constとlet
letは再宣言が不可能。
constは再宣言と、再代入が不可能。
今までは変数宣言をする時に、varしかなかったため、間違えて変数を二重に定義してしまったりした。


##テンプレート文字列
``バッククォートで文字列を囲む。
${}を使えば、変数などを展開できる。


##アロー関数
functionを省略できる、
条件はあるが、return文も省略できる。


#モジュールバンドラとは(Webpackなど)
一言でいうなら、複数のファイルを一つにまとめてくれるもの。
そうすることで、読み込み速度が上がる。

#トランスパイラとは（Babel）
新しいJavaScriptの記法を古い記法に変換してくれるもの
JavaScriptはブラウザの言語なので、ブラウザによって表示できる記法が異なるため、必要らしい。




#終わり
筆者の解釈で書いているために、言葉足らずなところや、説明不足なところもあると思います。
なので、気兼ねなくコメントしていただければと思います。
また、これ以外にも、モダンJavaScriptの要素がありましたら、教えていただけると幸いです。

最後まで、読んでくださり、ありがとうございます。
【データベース】インデックスを理解する

## はじめに

先日、社内でインデックスについて話題になり、そのとき知ったことや調べたことを自分なりにまとめてみました。

間違っている部分などありましたらご指摘いただければと思います。

## インデックスってなに？

データベースにおけるインデックス（索引）とは、対象のカラム値を適切な順番に並び替えたデータのことです。インデックスを使用することで、特定のカラム値をすばやく見つけることができるようになります。

例えば次のようなテーブルから `Yuffie Kisaragi` を見つけようとしたとき、通常であれば name カラムを上から順番に見ていく必要があります。

| id | name | age |
|---|---|---|
|1  |Cloud Strife  |21  |
|2  |Barret Wallace  |35  |
|3  |Tifa Lockhart  |20  |
|4  |Aerith Gainsborough  |22  |
|5  |Red XIII  |48  |
|6  |Yuffie Kisaragi  |16  |
|7  |Cait Sith  |4  |
|8  |Vincent Valentine  |27  |
|9  |Cid Highwind  |32  |

このくらいのレコード数であれば簡単に検索することができますが、これが数十万、数百万となると検索に時間がかかってしまいます。

ここで、name 列にインデックスを貼るとどうなるでしょうか。

| id | name |
|---|---|
|4  |Aerith Gainsborough  |
|2  |Barret Wallace  |
|7  |Cait Sith  |
|9  |Cid Highwind  |
|1  |Cloud Strife  |
|5  |Red XIII  |
|3  |Tifa Lockhart  |
|6  |Yuffie Kisaragi  |
|8  |Vincent Valentine  |

name 列を a-z 順に並び替えた別のデータが作られました。

このようにデータが順番に並ぶことで、[B木](https://ja.wikipedia.org/wiki/B%E6%9C%A8)と呼ばれるデータ構造を利用したアルゴリズムが使えるようになり、高速な検索が可能になります。

ここで `Yuffie Kisaragi` を検索すると、B木アルゴリズムを使ってデータの位置をインデックスが教えてくれます。位置がわかればテーブルを見に行き、すばやくレコードを取得することができます。

ただし、name と age という２つの条件で検索を行いたい場合、両方のカラムにインデックスを貼らないと効果を発揮しません。複数の条件で検索する場合の速度を上げたい場合は、それらをまとめた複合インデックスを作る必要があります。

## すべてのカラムにインデックスを貼ればいいのでは？

インデックスのおかげで検索が速くなるとはいえ、すべての列にインデックスを貼ればいいというものでもありません。

### インデックスのデメリット

インデックスを貼った場合、対象となるカラムを並び替えた別のデータが作成されるため、レコードが追加されたらインデックスにも新しいデータを書き込む必要があります。

そのため、すべてのカラムにインデックスを貼ると検索は速くなりますが、挿入、更新、削除はインデックスのデータも書き換える必要があるため速度が落ちます。また、単純にデータ量が増えるため容量が圧迫されることにもなります。

インデックを貼る場合は、頻繁に検索される条件のカラムに絞る方が効果的です。

### レコード数が少ないと効果が薄い

当然かもしれませんが、レコード数が少ない場合はインデックスのありなしで速度に大きな違いは現れません。逆に上記のようなデメリットもあるため、レコード数の少ないテーブルにはインデックスを貼る必要はないでしょう。

### カーディナリティが低いと効果が薄い

カーディナリティが低いカラムへのインデックスは効果が薄いとされています。

カーディナリティとは、個人的には「選択肢の多さ」という意味合いで捉えています。例えば、性別のカラムがあった場合、そこに入る値は「男性」か「女性」の二択となり、選択肢は少なくカーディナリティが低いと言えます（性別＝生物学的な性別とします）。

例えば、従業員1万人が在籍する会社の従業員テーブルに「性別」カラムがあり、そこにインデックスを貼ったとします。

性別が「男性」の「山田太郎」さんを検索する場合、まずインデックスが貼られた「性別」カラムを検索します。この会社には男性が 6000 人在籍しており、インデックスを貼ったことで素早く 6000 人を絞り込むことができました。しかし、名前にインデックスが貼られていないため、残りの 6000 レコードは上から順番に検索する必要があり、結果的に時間がかかってしまいます。。

このようにカーディナリティの低いカラムはインデックスの効果が低いため、インデックスを貼るときはカーディナリティについても考慮する必要があります。

また複合インデックスを貼る場合はカーディナリティが高い順に検索がかかるように作るとパフォーマンスが向上します。上記の例でいえば「性別」→「名前」ではなく「名前」→「性別」の順に絞り込むようなインデックスがベターです（そもそも性別にインデックスは必要ないと思いますが）。

## まとめ

インデックスとは対象のカラム値を適切な順番に並び替えたデータのこと。

テーブルにインデックスを貼ることで、[B木](https://ja.wikipedia.org/wiki/B%E6%9C%A8)アルゴリズムを使った高速な検索が可能となる。

インデックスは闇雲に貼っても効果がなく、以下のようなテーブル、カラムを対象とすると効果的。

- 頻繁に検索されるテーブル
- レコード数が多いテーブル
- カーディナリティが高いカラム
Go言語についてと開発環境の準備

# はじめに
Go言語は、Googleが開発したオープンソースのプログラミング言語であり、シンプルで信頼性の高い効率的なソフトウェアを簡単に構築できます。Go言語は、コンパイル言語の中でも特にエラーを検出しやすく、多人数での開発で起こるような重大なミスが起きにくくなっています。その為、現在では多くのサービスや企業で取り入れられています。

その為、技術レベルで遅れないように今からGo言語を始めると良いと思います。
Go言語についてと開発環境の方法を学んだので、備忘録としてまとめます。

## Go言語とは
![go.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229633/9d061ef5-198e-f660-727d-8d9a1d6e56fd.jpeg)

Go言語は、静的型付け、コンパイル言語、メモリ安全性、ガベージコレクション、構造的型付け、CSPスタイルの並行性などの特徴を持ちます。Go言語のコンパイラ、ツール、およびソースコードは、すべてフリーかつオープンソースです。

**Github**
https://github.com/golang

マスコット・キャラクターはGopher（ホリネズミ）です。

## Go言語でできること
### WEBサーバーの構築
標準パッケージを使うことで、WEBサービスを動作させるサーバー構築をスムーズに行えうことも可能です。
### モバイルアプリケーション開発
モバイル開発向けのGo Mobileを使用する事で、Go言語でもiPhoneやAndroidのスマホアプリケーション開発に対応出来ます。
### コマンドラインインターフェース（CLI）で動作するツール作成
CLIで動作するアプリケーションもGo言語での開発に向いています。

Go言語のマルチプラットフォームに対応したクロスコンパイル機能があるので、どんな環境でも問題なく開発できる点が非常に優秀です。

## Go言語参考サイト

**A Tour of Go**
https://tour.golang.org/welcome/1
Go言語基礎文法を学ぶ事が出来ます。

**GoDoc**
https://godoc.org/
Go言語のパッケージを検索する事が出来ます。

## Go言語学習本

* [基礎からわかる Go言語](https://amzn.to/39O3rFI)
* [スターティングGo言語](https://amzn.to/39L5Sc3)
* [Go言語によるWebアプリケーション開発](https://amzn.to/2VHwm5M)
* [Goプログラミング実践入門　標準ライブラリでゼロからWebアプリを作る](https://amzn.to/37AfX8W)

# 環境構築

## 簡単な Hello world を実行してみる
Go言語で書いた簡単なコードを以下のサイトで確認する事が出来ます。
試しに Hello world を実行する事が出来ます。
https://play.golang.org/

**Hello world**

```
package main

import "fmt"

func main() {
    fmt.Println("Hello, World")
}
```

## 開発環境をPCに準備する
### Go言語ツールのインストール
以下のリンクからインストールする事が出来ます。
https://golang.org/doc/install

Macの場合、HomebrewでGoをインストールする事が出来ます。

```
$ brew install go
```

Go言語ツールのディレクトリを環境変数GOROOTに設定する必要があります。

```
export GOPATH=$HOME/.go
export PATH=$GOPATH/bin:$PATH
```

## dockerを使ったGoの開発環境構築する
### Golangのdockerイメージ取得
```
# Golangのdockerイメージ確認
docker search golang
# Golangのdockerイメージ取得
docker image pull golang:latest
```

### コンテナの起動と接続
コンテナを建てます。ファイルの編集をしやすいように、ホスト側ディレクトリをマウントしてコンテナ側（/go/src）と共有します。

```
# コンテナの起動
docker container run -dt -v $(pwd):/go/src --name golang_dev golang:latest

# コンテナへ接続
docker container exec -it golang_dev /bin/bash
```

# まとめ

Go言語を学び、Go言語の良さを感じ、次世代の開発でGoエンジニアが必ず重宝される時代がくると強く感じております。

<details><summary>プログラミング言語別年収</summary>
<div>
![go2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229633/8b1aa7b2-d4ab-b5dc-b141-06da70048378.jpeg)
> 引用：プログラミング言語別年収中央値を発表、求人検索エンジン「スタンバイ」調べ
https://www.bizreach.co.jp/pressroom/pressrelease/2018/0807.html
</div>

Go言語は、2009年にリリースされたばかりの若い言語でありながら、すでに様々な企業が取り入れようと動いていることで注目度は年々高くなっています。また、Googleが開発している言語であることも注目されている理由になってきます。

今後、様々な取り入れ方でシステムの効率化がGo言語によって行われると考えられます。
今からGo言語を始めると良いと感じています。
私のAsciidocテンプレート

# これは何？
Asciidocのテンプレートです。  
Asciidocが覚えられないので、一つのテンプレートを作りました。  
多分、まだ全然使いこなせていないので、随時更新すると思います。

# これ
```
// 文書属性
// 言語
:lang: ja 
// 文書タイプ（article/book/manpage）
:doctype: book
:toc: 
:toclevels: 3
:toc-title: 目次
:sectnums:
:sectnumlevels: 4
:sectlinks:
:imagesdir: ./image
:icons: font
:source-highlighter: coderay
:example-caption: 例
:table-caption: 表
:figure-caption: 図
:docname: = asciidocの使い方
:author: Ponpokopon
```
[Laravel][HTML] 戻るボタンを作って動かすとバリデーションが働いてしまう場合の対処

## 状況
Laravelに限った話ではないがLaravelを利用しているときに発生したことなので一応。
●こんな感じで書くと、普通のメニュー画面みたいなところでは問題なく動くが、

```php:anime-suko.php
<a href="/menu"><button>戻る</button></a>
```
これをフォームの中に書くと、今の画面に移動するわけではないのに何も入力しなくても勝手にバリデーションが発生してしまって移動してくれない。

## 解決方法
buttonタグのtypeをbuttonにする。こうしないと、HTMLの仕様的にこうしないと、type="submit"の扱いになるHTMLの仕様らしい。

```php:anime-suko.php
<a href="/menu"><button type="button">戻る</button></a>
```
SplunkのデータをPower BIで

## はじめに
 @maroon さんのQiita [Excel から Splunkデータにアクセスするには？ - Qiita](https://qiita.com/maroon/items/b37a568a96a7ff62269b)を参考に、SplunkとPower BIを接続して可視化してみました。

### 利用環境等
　以下の内容は、Splunk Enterprise無料版をPCにインストールして実行したものです。有料版のSplunkでも同様のことができます。
Splunk ODBC Driverは、[Splunk ODBC | Splunkbase](https://splunkbase.splunk.com/app/1606/)より、Windows 64bit版をダウンロードしてインストールします。

### サンプルログの準備
Splunkにログイン後、Splunk自体のログをサンプルとするため、サーチで

```
index="_internal" 
```

とし、右上から「テーブルビューの作成」とします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419691/e29e14df-f056-4afb-917a-fae3821fb8f9.png)

Power BIから接続して見せる項目を決定します。最終的に私は以下のようにしました。
保存したテーブルビューは上部メニューの「データセット」から呼び出せます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419691/c02a7d94-fe53-662a-a3a0-f920ae7cdb77.png)

### Power BI DesktopkからSplunkのテーブルに接続

データを取得でODBCに接続します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419691/6a7d3433-d995-75e7-f2a3-cd618702eae7.png)

「ODBCからインポート」で「Splunk」を指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419691/88e90d55-d0f6-b02a-a0e7-9965f63b929d.png)

ナビゲーターで対象のテーブルを特定し、（[読み込み]ではなく）[データの変換]を選択し、Power Query エディターを立ち上げます。
各項目のnull値等の部分を除くクリーニングを行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419691/2349b203-efd4-6903-ccb0-66d11d1cb147.png)

#### カレンダーテーブルの作成
　計算テーブル「カレンダー」を新しいテーブルとして作成します。


``` text:カレンダーテーブル
カレンダー =  // テーブル名は「カレンダー」
var BaseCalendar = CALENDARAUTO()
RETURN
GENERATE(
    BaseCalendar,
    var BaseDate = [Date]
    var YearNumber = YEAR(BaseDate)
    var MonthNumber = MONTH(BaseDate)
    var DateNumber = DAY(BaseDate)
    var DayNumber = WEEKDAY(BaseDate, 1)

    RETURN ROW(
        "年_番号", YearNumber,
        "年", FORMAT(BaseDate, "yyyy年"),
        "月_番号", MonthNumber,
        "月", FORMAT(BaseDate, "mm月"),
        "年月_番号", FORMAT(BaseDate, "yyyymm"),
        "年月", FORMAT(BaseDate, "yyyy年mm月"),
        "日_番号", DateNumber,
        "日", FORMAT(BaseDate, "dd日"),
        "曜日_番号", DayNumber,
        "曜日", SWITCH(DayNumber, 1, "日", 2, "月", 3, "火", 4, "水", 5, "木", 6, "金", 7, "土",""),
        "相対月数", DATEDIFF(TODAY(), BaseDate, MONTH)
    )
)
``` 

フィールドの表記を整えたりし、列で並べ替えを指定したり、日付テーブルとしてマークします。


モデリングビューで、Splunkのテーブルと紐付け等を行います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419691/cfbea173-a4ba-a4ff-6eea-a03a310d3a7b.png)

### Power BIで可視化する
　あとはいつも通りの可視化です。例として以下のようなビジュアルを作成しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419691/d245590a-133b-724c-2a32-74b7d5b44231.png)

[可視化したビジュアルをWebで共有する](https://ishiayaya.net/Splunk-PowerBI)こともできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419691/0127f23e-c3de-dfc6-46ef-38684edb8d86.png)



## おわりに
　SIEMの代表格であるSplunkの非構造データを、構造データ等を扱うBIの代表格であるPower BIで可視化するのは便利です。
　SPL疲れしたとき（私?w）で代表的なフィールドで概要をつかむ、ちょっと別方法で可視化をしたい、というときにはPower BIで見るとよいかなぁと考えています。
エラーを止めるな！

こんなコード書いたことある人多いと思います

```example.rb
counter = 0
begin
  some_function
rescue => e
  # なんか知らんけどたまにエラーになるから3回までやり直す
  counter += 1
  retry if counter <= 3
end
```

もっとひどい場合だとスルーしている場合も

```example.rb
counter = 0
begin
  some_function
rescue => e
  # なんか知らんけどたまにエラーになるけど、別処理でカバーしてるので無視
end
```

私も過去に**「絶対に問題ないはずなのに何故かたまにエラーになるクエリ」**などDBやKVSの接続周りで謎のエラーに悩まされ、retryでごまかしたことがあります。

こういう対処をすること自体は問題ないですが、その現象がどこにもアウトプットされていないことに問題があります。そのことを知っている人がチームから離れてしまった場合、引き継がれたメンバーはその問題に気づく余地がありません。その問題が後に大きな問題につながったりするかもしれません。または新しいメンバーがその解決方法を知っているかもしれません。人力による引き継ぎに頼るのではなく、起きている不具合は人の目に触れるところにアウトプットしなければいけません。

ということで、**現象が起きるのが稀ならEメール、頻繁ならエラーログなどで記録を残すようにしましょう**。

```example.rb
counter = 0
begin
  some_function
rescue => e
  # なんか知らんけどたまにエラーになるから3回までやり直す
  logger.warn "Unknown error at some_function (retry #{counter}) #{e}"
  counter += 1
  retry if counter <= 3
end
```

どんな些細なことでも、ログには常に残るようにしておくべきですね。
my note



# command:

linux command:
 cat ファイル確認
 rm　ファイル削除
 cp　ファイルをコピー
 mv  ファイルを移動（行き先が消える）

github
 git pull origin main ダウンロード
 git push origin main アップロード

emacs command:
 C-space コピペはじめ
 C-w 選択範囲を切り取る
 M-w 選択範囲をコピー
 C-y 貼り付け

 カーソル移動:
　C-p: 1 行上に移動
　C-n: 1 行下に移動
　C-f: 1 文字前に移動
　C-b: 1 文字後に移動
　C-a: 行の先頭に移動
　C-e: 行の末尾に移動
　M-f: 1 単語前に移動
　M-b: 1 単語後に移動
　C-v: 1 画面下に移動
　M-v: 1 画面上に移動
　M-<: バッファの先頭に移動
　M->: バッファの末尾に移動
　C-g: 現在の操作を終了


# ruby command:

出力
 p, print, puts
 .to\_i 整数
 .to\_f float

コマンドライン引数
 ARGV[0/1/2/&#x2026;]

if文
 if 条件1
  　実行文1
 elsif 条件2
  　実行文2
 else
　　実行文3
 end

loop文
[条件1, 条件2].each do|内容|
　実行内容
end

関数
　def 関数名(引数)
　　実行文
　　return 返り値
　end

クラス
　class クラス名 #クラス定義
　　def メソッド名 #メソッド定義
　　　メソッドの内容
　　end
　end

　class\_name = クラス名.new #インスタンス生成
　class\_name.メソッド名 #メソッド実行
　
　def initialize #コンストラクタ

　クラス継承
　　class クラス2 < クラス1 #クラス1を継承
　　　def メソッド1
　　　　メソッドの内容
　　　end
　　end



------
 - **source** ~/grad_members_20f/members/acoe5781/MyNote.org
Typescriptでグローバル変数(window.○○)

プロジェクトフォルダの中に@typesというディレクトリを作成し、
その中にglobal.d.tsというファイルを作成します。

####中身

```typescript:global.d.ts

import firebase from "firebase/app";//例

declare global {
    interface Window{
        firebaseApp: firebase.app.App//例
//この中に好きに定義する
    }
}
```

`interface Window` の中に含めたい変数をいれてから
window.○○のように使います。

####できない場合
tsconfig.jsonのfilesにglobal.d.tsを入れてください。

```json:tsconfig.json
{
    "省略":"",
    "files": [
        "@types/global.d.ts"
    ],
    "省略":""
}

```
Cockpitを使ってセッションを録画再生する


## コンポーネント

- tlog
    - 端末のs入出力を録画、再生
- SSSD
    - System Security Service Daemon
    - 認証系のデーモン
    - セッション録画対象のユーザーグループを指定する
- cockpit-session-recording
    - セッション録画用のGUI管理画面を提供する

## インストール

```
dnf -y install tlog cockpit-session-recording systemd-journal-remote
```

## 設定

- CockpitへログインしSession Recoding → SSSD ConfigrationをAllへ変更

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293481/aa2803e3-bf77-45fb-f021-4f8e01be31c3.png)



## 動作確認

### 一般ユーザーでSSHログイン
```
yuta:~ $ ssh yuta@192.168.11.223
yuta@192.168.11.223's password: 
Activate the web console with: systemctl enable --now cockpit.socket

Last login: Sun Dec  6 06:46:36 2020 from 192.168.11.3

ATTENTION! Your session is being recorded!

[yuta@localhost ~]$ 
[yuta@localhost ~]$ whoami 
yuta
[yuta@localhost ~]$ 
[yuta@localhost ~]$ echo aaa
aaa
[yuta@localhost ~]$ ログアウト

Connection to 192.168.11.223 closed.
```

### Cockpitで再生できる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293481/789259c9-193f-df17-3cf4-b0f3d33f3c83.png)

### コマンドラインから再生

- Journalに記録されている
- IDはセッションIDを指定する

```
tlog-play -r journal -M TLOG_REC=c6f9743ff7084f6e9456082e28ff7128-4f58-371f0
```
Firebase MLの顔認識がどこまで認識されるか調べてみた

こんにちは！[株式会社Diverse](https://diverse-inc.co.jp/)でQAを担当している[mu-suke](https://qiita.com/mu-suke08)です！

## これはなに？
Flutter x Firebase MLKitで作成した顔認識アプリでどこまで顔として認識したかを調べたものです


*前回の記事はこちらから

https://qiita.com/mu-suke08/items/8412cbf170fae33df25f

## この記事に書かれていること
### 書かれていること
- Firebaseを使った顔認識がどの画像まで認識するのか

### 書かれていないこと
- Firebaseの導入
- 実装に使用したコード(Githubは[こちら](https://github.com/mu-suke/ml_demo))


## 作ったもの
ギャラリーから選択した画像の顔認識をさせるアプリを作成しました
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316760/fe00ea97-336d-493d-b666-ffdc7f892287.gif" width=350 />

## 検証内容
1. ぼかしを入れていってどこまでが顔として認識されるのか
2. イラストの人物は認識されるのか
3. おまけ

### 検証結果の見方

| 名称 | 意味 |
|:-:|:-:|
|detected|顔認識できた|
|notFound|顔認識できなかった|

### 使用する画像
| ぼかしLv0 | ぼかしLv1 | ぼかしLv2 | ぼかしLv3 
:-: | :-: | :-: | :-: | :-: 
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316760/b9d85772-2eb1-e692-59b5-1d24c8b02cf0.jpeg" width=200 /> |<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316760/1a643718-f082-e6d1-e1d6-f97339e599f8.jpeg" width=200 /> |<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316760/91c06345-5050-0912-aabd-6652757433f9.jpeg" width=200 /> |<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316760/94d1a0cb-6651-e7c0-f481-383314628ac5.jpeg" width=200 />

| イラスト| おまけ |
:-: | :-:
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316760/a3304485-3796-d6ef-38d8-be139f0383c7.png" width=200 /> |<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316760/11636d1f-af81-f61e-18d9-59b29e64959b.jpeg" width=200 />


### ぼかし
**Level 0:ぼかしなし**
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316760/8d6b413d-d2cd-0d90-f01a-c8bb04e7fea4.jpeg" width=350 />

認識された
**Level 1:**
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316760/d9fa9700-92e5-272e-6a4b-5ef7584354f9.jpeg" width=350 />

認識された

**Level 2:**
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316760/04d79281-74e4-1898-d66e-dd7397a98fa0.jpeg" width=350 />

認識された

**Level 3:**
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316760/97742071-90f5-c3b6-f0a8-9ab4943629e0.jpeg" width=350 />

認識されず！
### イラスト
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316760/00565811-e5da-145c-0c41-ea98c60c56f5.jpeg" width=350 />

認識されず

### おまけ
コロナでマスク人口が増えているので試してみましたが結果は...
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316760/2b6986a0-7399-7336-f778-7f23683ef85f.jpeg" width=350 />

認識された！
## まとめ
今回はFirebaseのMLkitを使いましたがMSのAzureとかAmazonのRekognitionとかあるので、他との違いを調べてみるのも良さそうです。
今回何より驚いたのは、マスクつきで認識されたことです。
なにを持って認識したとしているのかが気になりました

次回は[SAMUKEI](https://qiita.com/SAMUKEI)さんです！お願いします！


## 参考
- 使用した画像元

https://thispersondoesnotexist.com/

- ソースコード

https://github.com/mu-suke/ml_demo

- 前回の記事

https://qiita.com/mu-suke08/items/8412cbf170fae33df25f
【Ruby】コントローラーでメソッドによるコード省略

**読んでなるほど！と思うのに、しばらくするとなんだっけ？ってなるシリーズその１**

・edit
・show
この２つのアクションの記述をぎゅっとコンパクトに。

使用するのは、
**before_action**
**onlyオプション**

```ruby:tweets_controller.rb
class TweetsController < ApplicationController

  def edit
    @tweet = Tweet.find(params[:id])
  end
#↑editの中身「@tweet = Tweet.find(params[:id])」と、
#↓showの中身が同一の記述になっている
  def show
    @tweet = Tweet.find(params[:id])
  end

  private
end
```


重複している部分を「**set_tweet**」として、privateメソッドに移し替える

```ruby:tweets_controller.rb
  private
 
 def set_tweet
    @tweet = Tweet.find(params[:id])
 end
```

**before_action**の記述方法

```ruby:tweets_controller.rb

before_action :処理させたいメソッド名

before_action :set_tweet, only: [:edit, :show]

```


最後にまとめると


```ruby:tweets_controller.rb

class TweetsController < ApplicationController
  before_action :set_tweet, only: [:edit, :show]

  def edit
  end

  def show
  end

  private

  def set_tweet
    @tweet = Tweet.find(params[:id])
  end
end

```


editとshowに入っていた
@tweet = Tweet.find(params[:id])
これをset_tweetとインスタンスで定義。
そして一番上で
:set_tweet, only: [:edit, :show]
としてeditとshowのみに使うようonlyオプションで指定