OmniAICreator/Qiita-1.07M huggingface dataset:
Golangのflagパッケージの使い方(最小限の知識)

flagパッケージはコマンドラインのフラグを解析するのに便利なパッケージです。

## flagパッケージをインポートする
```go
import "flag"
```

## フラグの値を格納する変数を定義する

### 関数外で定義する場合の書き方
後述するinit()のXxxVar()で変数にバインドする場合はフラグを格納するための変数を用意する。

```go
var boolFlag bool
var intFlag int
var strFlag string
```

### 関数内で定義する書き方
後述するinit()のXxxVar()で変数にバインドしなかった場合はポインタとなる。

```go
  boolPtr := flag.Bool("b", false, "真偽値の値の例")
  intPtr := flag.Int("i", 0, "数値の場合の例")
  strPtr := flag.String("s", "", "文字列の場合の例")
```


## フラグの初期化
init() はmain()が呼ばれる前に実行される。
main内に記述したflag.Parse()によって変数に指定されたフラグの値が入るが、initの時点ではまだ変数には値が入っていない状態。
そのためここではフラグの値を格納するためのポインタを予約するだけの挙動となる。
XxxVar()で変数にバインドする。引数には変数のポインタ、フラグの名前、デフォルト値、使い方の説明を記述する。

```go
func init() {
  flag.BoolVar(&boolFlag, "b", false, "真偽値の値を指定")
  flag.IntVar(&intFlag, "i", 0, "数値の値を指定")
  flag.StringVar(&strFlag, "s", "", "文字列の値を指定")
}
```


## フラグの解析と取得
flag.Parse()を呼ぶことでコマンドラインの引数のフラグが解析され、フラグが変数にバインドされる。

```go
flag.Parse()
```
これ以降、変数からフラグの値を取得できるようになる。


## コマンドラインでの実行例
### ソースファイルから実行する場合
```
# フラグの指定なし
go run flagsample.go

# フラグの指定あり
go run flagsample.go -b
go run flagsample.go -b -i=1 -s=a
```

### バイナリファイルから実行する場合
```
# プログラムをコンパイルし、
go build flagsample.go
# その後バイナリを実行する。
./flagsample -b -i=1 -s=a
```


## ソースの全体像
関数外で定義する場合の書き方

```go
package main

import (
  "flag"
  "fmt"
)

var boolFlag bool
var intFlag int
var strFlag string

func init() {
  flag.BoolVar(&boolFlag, "b", false, "真偽値の値の例")
  flag.IntVar(&intFlag, "i", 0, "数値の場合の例")
  flag.StringVar(&strFlag, "s", "", "文字列の場合の例")
}

func main() {
  flag.Parse()

  fmt.Println(boolFlag)
  fmt.Println(intFlag)
  fmt.Println(strFlag)
}
```

関数内で定義する書き方

```go
package main

import (
  "flag"
  "fmt"
)

func main() {
  boolPtr := flag.Bool("b", false, "真偽値の値の例")
  intPtr := flag.Int("i", 0, "数値の場合の例")
  strPtr := flag.String("s", "", "文字列の場合の例")

  flag.Parse()

  fmt.Println(*boolPtr)
  fmt.Println(*intPtr)
  fmt.Println(*strPtr)
}
```

## 参考
- [サンプルで学ぶ Go 言語：Command-Line Flags](https://www.spinute.org/go-by-example/command-line-flags.html)
- [flag - The Go Programming Language](https://golang.org/pkg/flag/)
- [flag パッケージ - golang.jp](http://golang.jp/pkg/flag)
LINEで画像にある日本語を認識しよう

# モチベーション
日本で働いている私にとっては辞書は一番使っているプログラムです。
もちろん、わからない単語がたくさんあります。普通、わからない単語があったら、単語をコピーして辞書にペーストしますが、時々写真にある単語に対して大変になりました。その漢字一つ一つを手で描けなければなりません。
で、今回、写真のテキストをAIで認識してもらって、デジタルの文字コードに変換するLINE BOTを作りましょう。

#　概要

![illustration.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521590/027d5352-1efa-46c4-2d02-90dcf68da57d.png)

## 要素
今回のシステムは要素が3つあります

+ クライアント：これユーザにつながる場所です。テキストの写真をアップロードして結果が表示されるところです。今回使いたいサービスはLine Botです。
+ サーバー：クライアントから画像をもらって、OCRサービスに送って、結果を処理してクライアントに送るところです。
+ OCRサービス：OCR(Optical Character Recognition:光学文字認識)とは、活字の文書の画像（通常イメージスキャナーで取り込まれる）を文字コードの列に変換するソフトウェアである(ソース：ウィキペディア)。

## フロー
①　サーバーはLineAPIでユーザーが送ったもらった画像を読んで、ファイルを保存するステップです。
②　ステップ1のファイルをグーグルのOCRサービスに送ります。
③　グーグルのレスポンスから必要部分を抽出します。
④　ステップ3の結果をLineAPIでユーザーに返信します。

# コード
```javascript

'use strict';

const fs = require('fs');
const keyConfig = require('./config');
const express = require('express');
const bodyParser = require('body-parser');
const request = require('request');
const app = express();
app.use(bodyParser.json());
const line = require('@line/bot-sdk');
const vision = require('@google-cloud/vision');

const PORT = process.env.PORT || 3000;
const config = {
    channelSecret: keyConfig.line.channelSecret,
    channelAccessToken: keyConfig.line.channelAccessToken
};

const lineClient = new line.Client(config);

async function googleOCR(fileName, token) {
    const googleClient = new vision.ImageAnnotatorClient();

    googleClient.documentTextDetection(fileName)
    .then(response => {
        return lineClient.replyMessage(token, {
            type: 'text',
            text: response[0].fullTextAnnotation.text
        });
    })
    .catch(err => {
        console.error(err);
    });
};

const sampleFunction = async (event) => {
    const options = {
        url: `https://api.line.me/v2/bot/message/${event.message.id}/content`,
        method: 'get',
        headers: {
            'Authorization': 'Bearer ' + keyConfig.line.channelAccessToken,
        },
        encoding: null
    };
    const fileName = './image.jpg';

    request(options, function(error, response, body) {
        if (!error && response.statusCode == 200) { 
            fs.writeFileSync(fileName, new Buffer.from(body), 'binary');
            console.log('file saved');
        }
    });

    return googleOCR(fileName, event.replyToken);
};

async function handleEvent(event) {
    if(event.message.type !== 'image') {
        return;
    }
    return sampleFunction(event);
}


app.post('/webhook', (req, res) => {
    Promise.all(req.body.events.map(handleEvent)).then((result) => res.json(result));
});

app.listen(PORT);
console.log(`ポート${PORT}番でExpressサーバーを実行中です…`);
```

# 結果
![結果](https://media.giphy.com/media/Kxr4bvb2GIvFNwXiK9/giphy.gif)


参考：
[LINE BOTからNode.jsで画像を受け取って保存する](https://qiita.com/n0bisuke/items/17c795fea4c2b5571ce0)
[Google Nodejs API](https://googleapis.dev/nodejs/vision/latest/)
Ruby 標準入力と様々なメソッド

# はいじめに
これは学習用のメモになります。

# 標準入力とは?
もともとはLINUXなどのUnix系OSで用意されていた仕組みです。
標準入力に対応するようにプログラムを作っておけば、プログラム実行時に、ファイルを読み込んだり、キーボードからデータを読み込んだり、パラメータを指定したりというように、入力先を切り替えることができます。

## getsメソッド
標準入力から一行入力

```
line = gets
puts line
```

## to_iメソッド
標準入力から一行読み込み、整数に変換

```
line = gets.to.i
puts line

//入力された数字が出力される
```
```
例題）
標準入力で2つの整数が2行で与えられます。
1つ目の数値から２つ目の数値までを、1ずつ増加させながら、1行ずつ順番に出力するプログラムを作成してください。たとえば、3と5という数値が与えられた場合、次のように出力します。

3
4
5
```
```
num1 = gets.to_i
num2 = gets.to_i
for i in num1..num2
    puts i
end
```
### ＊　to_sメソッド
データを文字列に変換する

### ＊　to_fメソッド
データを小数点付きに変換すること
## chompメソッド
文字列の末尾の改行コードを取り除きます

```
line = gets.chomp
puts = "#{line}は、スライムを攻撃した"       //改行コードを取り除いた状態で出力される
```

## splitメソッド
splitメソッドとは簡単に言うと`文字列を分割して配列`にするためのメソッドです。

```
str = "samurai engineer blog"
 
array = str.split
 
p array
```
[実行結果]

```
["samurai", "engineer", "blog"]
```

### 区切り文字を指定して分割する方法
```
文字列.split(区切り文字)

str = "samurai,engineer,blog"
 
array = str.split(",")
 
p array
```

[実行結果]

```
["samurai", "engineer", "blog"]
```

## timesメソッド
「times」メソッドは、変数に「0」から「対象のオブジェクトが持つ数値 - 1」を順に代入しながら「{」から「}」までの処理(又は「do」から「end」までの処理)を実行します。1回繰り返す毎に1ずつ数値は増加します。(「|変数|」の部分は省略可能です)。

```
オブジェクト.times do |変数|
  実行する処理1
  実行する処理2
end
```

## lengthメソッド
lengthとは「長さ」の事です。Rubyでlengthは「文字列の長さ」と「配列の長さ(配列の要素の数)」を 調べるためのメソッドです。

「文字列の長さ」を調べる際のlenghtメソッドを使う方法と「 配列の長さ」を調べる際のlenghtメソッドを使う方法それぞれ説明します。

「文字列の長さ」を調べる際のlenghtメソッドを使う方法

```
str = '123456789'
str.length
# => 9
 ```

「配列の長さ」を調べる際のlenghtメソッドを使う方法

```
data = [1,2,3,4,5,6,7,8,9]
data.length
# => 9
```

# 最後に
この他にも様々なメソッドあると思います。
日々更新していこうと思います。
また、間違っているところがあればご指摘していただけると幸いです。
教師なし学習1　基礎編

[Aidemy](https://aidemy.net/)　2020/10/28
#はじめに
　こんにちは、んがょぺです！バリバリの文系ですが、AIの可能性に興味を持ったのがきっかけで、AI特化型スクール「Aidemy」に通い、勉強しています。ここで得られた知識を皆さんと共有したいと思い、Qiitaでまとめています。以前のまとめ記事も多くの方に読んでいただけてとても嬉しいです。ありがとうございます！
　今回は、教師なし学習の投稿になります。どうぞよろしくお願いします。

＊本記事は「Aidemy」での学習内容を「自分の言葉で」まとめたものになります。表現の間違いや勘違いを含む可能性があります。ご了承ください。

今回学ぶこと
・教師なし学習について
・教師なし学習の種類
・数学的な事前知識

#教師なし学習
##教師なし学習とは
・教師あり学習は、クラスラベルと呼ばれる「答え」が与えられて学習が行われるが、教師なし学習はこの答えを渡さず、コンピュータ自身が判断して学習するものである。
・今回は、この教師なし学習の中の__「クラスタリング」__と__「主成分分析」__という手法について学ぶ。

##クラスタリング
・クラスタリングとは、__データを塊（クラスター）ごとに分割する__手法である。
・クラスタリングの一手法である__「k-means法」__は、__人がクラスターの個数を決め__、コンピュータがその個数になるようにデータを分割するものである。
・また、k-means法では「重心」と呼ばれる点の位置が適切になるように学習し、これに基づいてクラスタリングを行う。

##主成分分析
・主成分分析とは、__データの次元を減らして（次元削減）一つのグラフに情報を集約させる__手法である。
・主成分分析では、データの特徴を特に示す（主成分）軸を学習し、定めるという流れで行われる。
・例えば、「年齢、身長、体重」の3つの異なるデータから軸を定め、「個人データ」という形で2次元のグラフで表すというものが挙げられる。

#教師なし学習の事前知識
##ユークリッド距離
・二次元空間上の二点(x1,x2),(y1,y2)間の座標距離は
$\sqrt{(x_1-y_1)^2+(x_2-y_2)^2}$
で求めることができる。
・同様にn次元空間上の2点(x1,x2...xn),(y1,y2...yn)間の距離は
__$\sqrt{(x_1-y_1)^2+(x_2-y_2)^2+...+(x_n-y_n)^2}$__
で求められる。この距離のことを__ユークリッド距離(ノルム)__という。

・以下のように、NumPyでユークリッド距離を求められる。(__np.linalg.norm()__ は「()内の二乗の和」を表す)

![スクリーンショット 2020-10-28 23.05.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698700/32911cc2-5947-a3c1-d4cf-6f3bab73df9e.png)

##コサイン類似度
・二つのベクトルがどのぐらい似ているかを評価するとき、__「長さ」と「方向」__の類似性から判断される。
・このうち方向に注目すると、二つのベクトルの作る角度__「θ」__が小さければ小さいほど類似性が高いと言える。
・θの求め方としては、ベクトルの内積の公式　$\vec{a} \cdot \vec{b} = |\vec{a}|\, |\vec{b}| \, \mathrm{cos}\theta$　を発展させて、cosθを求めることでわかる。この手法のことを__「コサイン類似度」__という。
・この時のcosθであるが、__cosθは値が大きいほどθが小さくなる__ことに注意。
・また、コサイン類似度もn次元のデータに対応している。

・コードでは、NumPyで求めることができる。(__np.dot()__は「各要素の積の総和」を表す（以下で言うと、1*2+2*3+3*4）)

![スクリーンショット 2020-10-28 23.06.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698700/cd112825-192d-6a2f-e7bb-7da713c7e9e4.png)

#まとめ
・__教師なし学習__は正解ラベルを渡さずにコンピュータ自身が判断し学習する手法である。
・教師なし学習には「__クラスタリング__」と「__主成分分析__」がある。前者はデータをクラスターごとに分割する手法であり、後者は、次元削減することで一つのグラフに情報を集約させる手法である。
・教師なし学習では、「__ユークリッド距離（ノルム）__」や「__コサイン類似度__」でデータの類似性などを判断することがある。

今回は以上です。最後まで読んでいただき、ありがとうございました。
教師あり学習(回帰)　2　応用編

[Aidemy](https://aidemy.net/)　2020/10/28
#はじめに
　こんにちは、んがょぺです！バリバリの文系ですが、AIの可能性に興味を持ったのがきっかけで、AI特化型スクール「Aidemy」に通い、勉強しています。ここで得られた知識を皆さんと共有したいと思い、Qiitaでまとめています。以前のまとめ記事も多くの方に読んでいただけてとても嬉しいです。ありがとうございます！
　今回は、教師あり学習の二つ目の投稿になります。どうぞよろしくお願いします。

＊本記事は「Aidemy」での学習内容を「自分の言葉で」まとめたものになります。表現の間違いや勘違いを含む可能性があります。ご了承ください。

今回学ぶこと
・モデルの汎化について

#モデルの汎化
##(復習)汎化とは
・回帰分析での予測は関数に基づいたものであるが、実際の価格変動には幅があり、入力データが同じでも結果が異なることもままある。
・このような前提のもとで、モデルが過去のデータを信頼しすぎると予測が破綻してしまうことになる。これを過学習と言い、過学習を防ぐことを汎化という。

##正則化
・線形回帰における汎化の手段として、__正則化__というものが用いられる。正則化とは、__モデルの複雑性にペナルティを設け、モデルを一般化しようとする__ことである。
・正則化には__「L1正則化」__と__「L2正則化」__の2種類がある。
・L1正則化とは、__予測に対する影響が小さいであろうデータの係数を0に近づける__ことで、余分な情報を削減して正則化を行う。
・L2正則化とは、__係数の大きさに制限を設けることで__、過学習を防いで正則化を行う。

##ラッソ回帰
・__ラッソ回帰__とは、L1正則化を使う回帰モデルを指す。
・L1正則化は、余分な情報が多い時に高い効果があるので、例えば__データ数（行数）に対するパラメータ数（列数）が多いとき__などにラッソ回帰が使われる。
・ラッソ回帰の使い方は、__model=Lasso()__のようにすれば良い。

##リッジ回帰
・__リッジ回帰__とは、L2正則化を使う回帰モデルを指す。
・L2正則化は、係数の範囲に上限ができるため、汎化されやすい。
・リッジ回帰の使い方は、__model=Ridge()__のようにすれば良い。

##ElasticNet回帰
・__ElasticNet回帰__とは、L1正則化とL2正則化を組み合わせて使う回帰モデルを指す。
・L1正則化の__情報を取捨選択してくれる点__と、L2正則化の__汎化されやすい点__を持つので、メリットが大きい。
・ElasticNet回帰の使い方は、__model=ElasticNet()__とすれば良い。
・また、引数に__「l1_ratio=0.3」__などのように指定すれば、L1正則化とL2正則化の割合を指定できる。

・以上3つの回帰モデルを実行![スクリーンショット 2020-10-28 22.59.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698700/7aa30b99-e728-d0ab-7ade-8603f2fcca23.png)

・結果![スクリーンショット 2020-10-28 22.58.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698700/7994a0d0-686a-64f1-ee41-ca25cb2e5832.png)


#まとめ
・線形回帰における汎化の手段には、__正則化__がある。
・正則化には__L1正則化とL2正則化__があり、前者を使った回帰が__ラッソ回帰__、後者が__リッジ回帰__、両方を使った回帰が__ElasticNet回帰__と呼ばれる。

今回は以上です。最後まで読んでいただき、ありがとうございました。
教師あり学習(回帰)1　基礎編

[Aidemy](https://aidemy.net/)　2020/10/28
#はじめに
　こんにちは、んがょぺです！バリバリの文系ですが、AIの可能性に興味を持ったのがきっかけで、AI特化型スクール「Aidemy」に通い、勉強しています。ここで得られた知識を皆さんと共有したいと思い、Qiitaでまとめています。以前のまとめ記事も多くの方に読んでいただけてとても嬉しいです。ありがとうございます！
　今回は、教師あり学習（回帰）の一つ目の投稿になります。どうぞよろしくお願いします。

＊本記事は「Aidemy」での学習内容を「自分の言葉で」まとめたものになります。表現の間違いや勘違いを含む可能性があります。ご了承ください。

今回学ぶこと
・教師あり学習（回帰）について
・線形回帰の方法

#教師あり学習（回帰）
##(復習)機械学習の手法
・機械学習には3つの手法がある。「教師あり学習」「教師なし学習」「強化学習」である。
・このうち、教師あり学習は「分類」「回帰」の二つに分けられる。今回学ぶ回帰は、__株価や時価などの連続値を予測する。__

#線形回帰
##線形回帰とは
・線形回帰とは、__既に分かっているデータの式（グラフ＝線形）から、その先のデータの動きを予測する__ものである。この時のグラフは必ず直線（一次関数）になる。

##決定係数
・__決定係数__とは、線形回帰で予測したデータと実際のデータがどのぐらい一致しているかを示すものである。
・教師あり学習に使われるscikit-learnのおいては決定係数は__0〜1の値をとる__。数値が大きいほど一致度は高いと言える。
・決定係数を出力するときは__print(model.score(test_X,test_y))__のようにすれば良い。

##線形単回帰
・線形単回帰とは、__1つの予測したいデータ(y)を1つのデータ(x)から求める線形回帰__のことである。
・すなわち、データが「y=ax+b」で表せると仮定して、__aとbを推測する__ことを指す。
・aとbの推測には、一つには、__最小二乗法__というものが使われる。これは、__実際のyと推定するy（つまりax+b）の差の二乗の総和が最小になる__ようなaとbを設定するというものである。
・この方法で差を二乗するのは、データの正負を考慮しなくて良いからである。

・線形（単）回帰を使うには、__「model=LinearRegression()」__のようにすればよい。

・線形単回帰の実行![スクリーンショット 2020-10-28 22.51.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698700/81a106d8-132a-1d47-1c60-aeb09af5f07b.png)

##線形重回帰
・__線形重回帰__とは、予測したいデータが1つ(y)に対し、__予測に用いるデータが複数個(x1,x2...)__となる線形回帰のことである。
・すなわち、データが「y = a1x1 + a2x2... +b」で表せると仮定して、aとbを推測することを指す。
・線形重回帰でも、aとbの予測は最小二乗法で行われる。
・また、使うのも、LinearRegression（）で良い。単回帰か重回帰を自動で判断してくれる。

・線形重回帰の実行![スクリーンショット 2020-10-28 22.52.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698700/e8978f4f-77ce-3b68-24fd-8d851359c030.png)

#まとめ
・教師あり学習（回帰）の一つである線形回帰とは、既に分かっているデータの式（グラフ＝線形）から、その先のデータの動きを予測するものである。
・線形回帰には、予測するものが一つである「線形単回帰」と複数である「線形重回帰」がある。

今回は以上です。最後まで読んでいただき、ありがとうございました。
Mockitoと仲良くなろうとしたお話

# Mokitと仲良くなろうとしたお話
初投稿です。
皆さんは「Mockito」使っていますか？

業務でAndroid Studioを使用してアプリケーションを作成し、UnitTestを行う際にMockitoとケンカしたので、Mockitoと仲良くするため、そして自分の備忘録として投稿します。

# 使用環境
- macOS Catalina(10.15.6)
- Android Studio 4.0.1
- Android 9.0(sdk:28)
- Mockito Core 3.5.9
- Mockito Inline 3.5.9
- Robolectric 4.3.1

# Mockitoとケンカした部分について
作成していたアプリケーションはaidlでインターフェースの提供を受けており、サービスとのbindを行うアプリケーションでした。
初めはRobolectricの`ShadowApplication.setComponentNameAndServiceForBindService()`を使用してMock化したIBinderを渡していましたが、`IBinder.Stub.asInterface()`でインターフェースを取り出す際に別のオブジェクトになってしまうため、うまくMock化できていませんでした。
(単純に自分のMockの仕方が悪かったのかもしれないです。)

Mockito 3.4.0からstaticなメソッドもMock化できるようになったようなのですが、Webに有益な情報が見つからなかったので、以下に示します。

# staticなメソッドのMock化方法
`IBinder.Stub.asInterface()`など、staticなメソッドのMock化方法です。
以下のような使い方でMock化できます。

    final IMyService mockMyService = mock(IMyService.class); // ⭐︎1
    try(final MockedStatic<IMyService.Stub> mockedStatic = mockStatic(IMyService.Stub.class)) {
        // ↓IMyService.Stub.asInterface()の戻り値がmock化したIMyService(⭐︎1)になります。
        mockedStatic.when(() -> IMyService.Stub.asInterface(any())).thenReturn(mockMyService);
        // 以下でActivity内などでbindService()してテストしてください。
        final ActivityController<MainActivity> controller = buildActivity(MainActivity.class);
        controller.create;
        ...
    }

上記操作を行うことで、staticなメソッドのMock化ができます。
なお、上記では`try-with-resources`で記載しているのですが、`try-with-resources`で記載しない場合は、close()を行ってください。

    final MockedStatic<IMyService.Stub> mockedStatic = mockStatic(IMyService.Stub.class);
    ...
    mockedStatic.close();

# ついでに
メソッド内で`new`されるクラスのMock化もMockitoでできます。

    final MockedConstruction<SubClass> mockedConstruction = mockConstruction(SubClass.class);
    // 以下でnewされたクラスを取得することができます
    // 取得したクラスはMock化されているので、when()を使って戻り値などを変化させることができます。
    List<SubClass> constructed = mockedConstruction.constructed();
    mockedConstruction.close();

# 最後に
初投稿なのでうまく説明できているか正直自信がありません。
少しでも誰かのためになれれば幸いです。
今回紹介したMock化方法はほんの一部です。
`MockedStatic`も`MockedConstruction`もコンストラクタが何種類か存在するので、[Mockitoの公式ドキュメント](https://javadoc.io/static/org.mockito/mockito-core/3.5.9/org/mockito/Mockito.html)を参考にしつつ、Android StudioなどのIDEで色々と試してみてください。
Golangのerrorとpanic

#### The art of programing
業務ロジックにエラーブロックが沢山の場合がよく見られる
例えば以下の関数を順次に呼ぶ

``` go
func first() error {return nil}
func second() error {return nil}
func third() error {return nil}
func fourth() error {return nil}
func fifth() error {return nil}
```

**error**を判断する書き方は、
なに？眩暈しちゃった。。。

``` go
func Do() error {
    var err error
    if err = first(); err == nil {
        if err = second(); err == nil {
            if err = third(); err == nil {
                if err = fourth(); err == nil {
                    if err = fifth(); err == nil {
                        return nil
                    }
                }
            }
        }
    }
    return err
}
```

実際の仕事にはフラットな方が多くて、

``` go
func Do() error {
    var err error
    if err = first(); err != nil {
        return err
    }
    if err = second(); err != nil {
        return err
    }
    if err = third(); err != nil {
        return err
    }
    if err = fourth(); err != nil {
        return err
    }
    if err = fifth(); err != nil {
        return err
    }
    return nil
}
```

さ、**panic**を使えば、

``` go
func Do2() (err error) {
    defer func(){
        if r:= recover() ; r!= nil{
            err = fmt.Errorf("Error: %+v", r)
        }
    }()
    first2()
    second2()
    third2()
    fourth2()
    fifth2()
    return
}
```
[Rails]Rspecを使ったテストコード

#はじめに
Rspecを導入し、テストコードを書いてみようと思います。
コマンドはdocker環境のコマンドを使う。

#Gemの導入

```
group :development, :test do
  gem 'rspec-rails'
  gem 'factory_bot_rails'
  gem 'faker', "~> 2.8"
end
```

`docker-compose run web bundle install`
`docker-compose build `
インストール完了。

#Rspecの設定

`docker-compose run webrails g rspec:install`
上記コマンドを行うと、下記ファイルが生成される。

```
create  .rspec
create  spec
create  spec/spec_helper.rb
create  spec/rails_helper.rb
```

```
.rspc
--format documentation
```

#コード作成

```spec/models/user_spec.rb
require 'rails_helper'

describe User do
  describe '#create' do

    it "usernameとemail,passwordとpassword_comnfirmationが存在すれば登録できること" do
      user = build(:user)
      expect(user).to be_valid
    end

    it  "usernameがない場合は登録できないこと" do 
      user = build(:user, username: nil)
      user.valid?
      expect(user.errors[:username]).to include("can't be blank")
    end

    it  "emailがない場合は登録できないこと" do 
      user = build(:user, email: nil)
      user.valid?
      expect(user.errors[:email]).to include("can't be blank")
    end

    it  "passwordがない場合は登録できないこと" do 
      user = build(:user, password: nil)
      user.valid?
      expect(user.errors[:password]).to include("can't be blank")
    end

    it  "passwordが存在してもpassword_confirmationがない場合は登録できないこと" do 
      user = build(:user, password_confirmation: "")
      user.valid?
      expect(user.errors[:password_confirmation]).to include("doesn't match Password")
    end

    it  "重複したemailがある場合は登録できないこと" do
      user = create(:user)
      another_user = build(:user, email: user.email)
      another_user.valid?
      expect(another_user.errors[:email]).to include("has already been taken")
    end

    it  "passwordが６文字以上であれば登録できること" do
      user = build(:user, password: "000000", password_confirmation: "000000")
      expect(user).to be_valid
    end

    it  "passwordが5文字以下であれば登録できないこと" do
      user = build(:user, password: "00000", password_confirmation: "00000")
      user.valid?
      expect(user.errors[:password]).to include("is too short (minimum is 6 characters)")
    end:grin:

  end
end
```

```spec/factories/users.rb
FactoryBot.define do
  factory :user do
    username                 {"aaa"}
    password                 {"000000"}
    password_confirmation    {"000000"}
    sequence(:email)     {Faker::Internet.email}
  end
end
```
`docker-compose run web bundle exec rspec`

```
8 examples, 0 failures
```
となれば、テストはうまく通過している。

#おわりに
今回はRspecを使ったテストの入りを行いました。
今後、コントローラーのテストも行っていきます。
最後まで読んでいただきありがとうございます:grin:
古いPCでもWSL2動いた

## はじめに

おじさんがもっているVAIO Tap21はかなり古いパスコンですが、Windows10がフリーでリリースされたときにOSをWin10にupdate し、今でも使っています。これにこの度、WSL2 (Windows Subsystem as Linux 2)を入れたのでメモしておきます。

大きなはまりポイントはありませんでした。小さなはまりポイントは

- WSLを有効にした後の再起動は必要なのに気づくのに数分かかった
- power shell からubuntu への立ち上げは "wsl"であることに気づくのに３０秒くらいかかった。

くらいです。びっくりポイントは、

- Windows ターミナルという便利そうなソフトがある。使えるかも！！＞

でした。

これらは以下の指示通りに行った結果です。何と簡単な。

[Windows 10 用 Windows Subsystem for Linux のインストール ガイド](https://docs.microsoft.com/ja-jp/windows/wsl/install-win10)

## 手順メモ

### Power shell でコマンドを実行します。

管理者権限でpower shell を立ち上げます。スタートのプログラムで「Windows Power Shell」から右クリックによる「管理者権限として実行する」でできました。

```
PS> dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
PS> dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
```

実行後は再起動させます。この再起動がないと次のinstall 作業に進めません。
なお、私のマシンはWindows update をしていたの再起動は１回でしたが、古い場合はWindows のversion を上げるためにupdate と再起動が必要かもしれません。

### Linux カーネル更新プログラム パッケージを実行

ガイドにあるリンクから wsl_update_x86.msi ダウンロードして実行します。
これでWSL2が入ったのかな？使用するversion をWSL2にします。

```
PS> wsl --set-default-version 2
```

### Windows Store から好きなLinux distribution をインストール

私は Ubuntu20.04 を入れました。

```
PS > wsl --list --verbose
  NAME            STATE           VERSION
* Ubuntu-20.04    Running         2
PS > wsl --set-version Ubuntu-20.04 2
変換中です。この処理には数分かかることがあります...
WSL 2 との主な違いについては、https://aka.ms/wsl2 を参照してください
ディストリビューションは既に、要求されているバージョンです。
```

### Windows ターミナルをインストール

初めてインストールしたので詳しくは全く知りませんが、便利そうです。<br>
メモ(Windows Docs)：[Windows ターミナルをインストールしてセットアップする](https://docs.microsoft.com/ja-jp/windows/terminal/get-started)

とりあえず、

- Ctrl + T で 新しいTab
- power shell で　``` wsl ``` と打つとUbuntu に変わる。
- C:\Users\tarou が /mnt/c/Users/tarou になる

ということはすぐにわかりました。

## おわりに

とりあえず、この古いマシンで使えそうなのでよかったです。
他のwindows マシンではpower shell と WSL1 との使い分けができておらず、設定が混同していました。それはそのままなのかな。例えば、docker はubuntu で動かすservice なのかdocker for windows なのか、Google Cloud SDKはlinxuなのかwindosなのか、など。それは同じようですが、とりあえずこれを使って開発を進めていこうと思います。
(2020/10/12)
[Swift]UISearchBarの使い方

#今回の題
SearchBarに入力された値の取り方をアウトプットします。
delegateの理解なども含めた内容です。

間違いや誤った解釈がありましたら、優しくコメントにてお教えいただけると助かります！！🙇‍♀️

##コード
storyboardにUISearchBarを配置し、ViewControllerと繋げた以下の状態から始めます。

```swift
import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var searchField: UISearchBar!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
    }
}
```

###１ ViewControllerに`UISearchBarDelegate`プロコトルを適用させる

```swift
class ViewController: UIViewController, UISearchBarDelegate {
````

余談ですが、初めてこの部分を見たとき、

`あれ、プロトコルを適用させたらそのプロトコルに定義されているメソッドや、プロパティを全部このクラスで定義しないとエラーになるんじゃ……。`

と思ったのですが、どうやら`オプショナルメソッド`なるものがあり、そういったメソッドの実装に関してはoptinal(任意)なそうです。

###２ delegataプロパティに、このクラス自体を代入する

```swift
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        searchField.delegate = self //　追記
    }
```
こうすることで、SearchBarで起きたイベントをこのクラスで受け取り、処理できるようになります。

また、`UISearchBarクラスのdelegataプロパティには、UISearchBarDelegateプロトコルを適用したクラスでなければ代入できません。`
![スクリーンショット 2020-10-12 17.58.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/546124/36f51370-34bb-4bd2-5894-3e8bb07fc621.png)
１でこのクラスにUISearchBarDelegateプロトコルを適用させたのはこの為です。

###３ 入力値を受け取る
入力後に`検索`が押されたら処理を実行させたいので、以下のメソッドを使います。
![スクリーンショット 2020-10-12 22.29.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/546124/a902861d-c6a6-24c7-ec42-eed5e2130f2c.png)
メソッド名わかりやすーーー。

```swift
    func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {
        // キーボードを閉じる
        view.endEditing(true)
        // 入力された値がnilでなければif文のブロック内の処理を実行
        if let word = searchBar.text {
            // デバッグエリアに出力
            print(word)
        }
    }
```

searchBarSearchButtonClickedメソッドの引数searchBarはUISearchBarクラスのインスタンスで、`textプロパティに入力値を保持しています`。
textプロパティはオプショナル型なので入力値の存在確認(Unwrap)を`if let文`で行なってから処理を行うようにしています。

これで完成です。

###全体図
```swift

import UIKit

class ViewController: UIViewController, UISearchBarDelegate {

    @IBOutlet weak var searchField: UISearchBar!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        searchField.delegate = self
    }
    
    func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {
        view.endEditing(true)
        if let word = searchBar.text {
            print(word)
        }
    }
}
```


#一言
楽しみながらswift学習中です。

基本的な構文は[こちら](https://qiita.com/kuzira_vimmer/items/daf27f0a1ad061d20173)(随時更新)にまとめています。
マクロあれこれ


```VBA:test.vba

Sub FindStrCol(Day2 As String)
    MsgBox "Day2=" & Day2 & VarType(Day2)

Dim txt As String
    txt = Day2

Dim lngYLine As Long
    Dim intXLine As Integer
    Dim Obj As Object
    
'        With Workbooks("Book2.xlsm").Worksheets("sheet1")
    Set Obj = Workbooks("Book2.xlsm").Worksheets("Sheet1").Cells.Find(What:="Day2", LookAt:=xlWhole, SearchOrder:=xlByRows)


    
    If Obj Is Nothing Then
        MsgBox Day2 & "は見つかりませんでした。"
    Else
        lngYLine = Worksheets("Sheet1").Cells.Find("診察", LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlByRows).Row
        intXLine = Worksheets("Sheet1").Cells.Find("診察", LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlByRows).Column
        MsgBox Day2 & "は、" + CStr(lngYLine) + "行目の" _
                + CStr(intXLine) + "列目にあります"
    End If

'        End With

End Sub



Private Sub FindExaminatin(x As Integer)
    With Workbooks("Book2.xlsm").Worksheets("sheet1")
        Dim i As Long
        Dim j As Long
        j = 1
            
        With Sheet1.UsedRange
            MaxRow = .Rows.Count
            MaxCol = .Columns.Count
        End With
            
            For i = 1 To MaxRow
                If .Cells(i, x).Value = "診察" Then
                    Sheet2.Cells(j + 1, 1) = .Cells(i, 1).Value
                    MsgBox "診察の文字列が" & i & "列に見つかりました。"
                    j = j + 1
                End If
            Next i
    End With
End Sub




Private Sub FindDate(a As String)
    Dim x As Integer

    With Workbooks("Book2.xlsm").Worksheets("Sheet1")
        Dim i As Long
        
        With Sheet1.UsedRange
            MaxRow = .Rows.Count
            MaxCol = .Columns.Count
        End With
        
        For x = 1 To MaxCol
            If .Cells(1, x).Value = a Then
                FindExaminatin (x)
                MsgBox a & "が" & x & " 列に見つかりました。"
        Exit For
            End If
        Next
    End With
End Sub



Private Sub Worksheet_Change(ByVal Target As Range)
    Dim Target2 As String
    
    
    If Intersect(Target, Range("E1:E1")) Is Nothing Then
        Exit Sub
    Else
        If IsDate(Target) Then
            Range("A2:A65535").Clear
            Target2 = CStr(Target)
            MsgBox Target2 & "を検索します"
        Else
            MsgBox Target & "E1の入力値が日付の形式ではありません"
            Exit Sub
        End If
    End If
    Call FindDate(Target2)
    Call FindStrCol(Target2)
End Sub

```
Qiita APIをgoから叩いてみた

## はじめに
Go言語を勉強しなければという使命感にかられ、遊んでみることにしました。

## golang + Qiita API
### 環境
・ go version go1.13 darwin/amd64

### URIと機能
|Path |HTTPメソッド  |機能  |
|---|---|---|
|/qiita/api/v1/user-info | GET |指定されたユーザの記事一覧を、作成日時の降順で返します。  |


### 使用パッケージ
**・　gin**
ginは、go製のWebフレームワークです。jsonレスポンス処理機能も持っている優れものです。

```
go get github.com/gin-gonic/gin
```

### ファイル構成

```
❯ tree .
.
├── main.go
└── src
    └── controller
        └── controller.go

2 directories, 2 files
```

### controller
mainから呼び出すタスク処理をまとめています。

```controller.go
package controller

import (
	"encoding/json"
	"io/ioutil"
	"log"
	"net/http"
	"time"

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

type Item struct {
	Title     string    `json:"title"`
	CreatedAt time.Time `json:"created_at"`
}

// Qiita APIを叩く
func QiitaGET(c *gin.Context) {
	resp, err := http.Get("http://qiita.com/api/v2/users/{自身のアカウント名}/items?page=1&per_page=10")
	if err != nil {
		log.Fatal(err)
	}
	defer resp.Body.Close()
	body, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		log.Fatal(err)
	}

	var data []Item

	if err := json.Unmarshal(body, &data); err != nil {
		log.Fatal(err)
	}

	c.JSON(http.StatusOK, gin.H{"item": data})
}
```

### main
メイン処理を記述しました。

```main.go
package main

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

func main() {
	router := gin.Default()

	v1 := router.Group("/qiita/api/v1")
	{
		v1.GET("/user-info", controller.QiitaGET)
	}
	router.Run(":9000")
}

```

### 実行

```
❯ go run main.go
[GIN-debug] [WARNING] Creating an Engine instance with the Logger and Recovery middleware already attached.

[GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production.
 - using env:   export GIN_MODE=release
 - using code:  gin.SetMode(gin.ReleaseMode)

[GIN-debug] GET    /qiita/api/v1/user-info   --> _/Users/********/Desktop/Qiita_PoC_API/src/controller.QiitaGET (3 handlers)
[GIN-debug] Listening and serving HTTP on :9000
```

APIを叩く際には、postManを使用しました。 
![スクリーンショット 2020-10-12 23.22.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563635/d6a00ef9-8019-cc36-073a-74fa554079c3.png)


## 参考
[Qiita API](https://qiita.com/api/v2/docs#%E3%82%B0%E3%83%AB%E3%83%BC%E3%83%97)
【PHP】strstr()　と strtr()　の合わせ技で、文字列内の複数文字を置換する

# こんな時に使えます
とあるDBのテーブル内で、複数の要素（例でいうと、職業とステータス）が、
ひとつの文字列に連結されてしまっている場合に、
・分離して
・区切りに使われている記号を取り除いて
・取得

ができる。

# 実例

```
$sample_text = "勇者[HP300]"
```
## 分離する

```PHP

$sample_text_extract = strstr($sample_text, '[');  
// 変数の中身は、[HP300]という文字列

```

【解説】
strstr()
https://www.php.net/manual/ja/function.strstr.php

第一引数：対象の文字列
第二引数：検索したい文字
返り値：　**検索したい文字を含んだ、文末までの文字列** 


## 区切りに使われている文字を取り除く

```PHP
$replace = [
    '[' => '',
    ']' => ''
];

$sample_text_trimmed = strtr($sample_text_extract, $replace);
// 変数の中身は、HP３００　という文字列


```

【解説】
strtr（）
https://www.php.net/manual/ja/function.strtr.php

第一引数：対象の文字列
第二引数：置換before/after（**※配列形式で複数指定可**)

※公式ドキュメントでは、小文字を大文字に置換するやり方が紹介されています。
 バイト数の大きいものが優先される等ルールがあるようです。

```
<?php
$trans = array("h" => "-", "hello" => "hi", "hi" => "hello");
echo strtr("hi all, I said hello", $trans);
?>

// 結果： hello all, I said hi

```

> 引数を二つだけ渡す場合は、二番目の引数を array('from' => 'to', ...) 形式の配列にしなければなりません。 返される値は文字列で、もとの文字列中にある配列のキーと同じ部分を対応する値で置換したものとなります。 一番長いキーから順に調べます。一度部分文字列の置換を行うと、 置換後の文字列がさらに置換の対象となることはありません。

# 筆者コメント
私は、例のように、
・文字列が記号で囲まれて
・かつ他の文字列と連結して、
・ひとつのカラムに保存されている
というデータを取り出す必要性があり、この合わせ技を使いました。
他にもいろんな使い方ができそうですので、何かのヒントになれば幸いです。
サクラエディタにおける文字列置換キーマクロ作成

処理結果の検証用に文字列置換キーマクロを作ってので、必要なものだけに絞った記事にします
随時更新予定。

##文字列置換(パターン別）

- ***位置***
    - ^　行頭 
    - $　行末　※改行コードの場合で捕まえることが多い 

- ***エスケープ ￥ 特殊文字を文字として扱う場合はエスケープします　***

    - \\\　円マーク
    - \[\] \(\)　この辺の構文で使う文字もエスケープ必須

-  ***正規表現文字***
    - \n　LF 
    - \r\n　CRLF
    - \t　　タブ 

- ***基本***
    - []　文字集合（文字クラス）　"azeivdあいう"から半角a-zを消したいなど :[a-z]
    - ()　式集合（グループ）　"abcabc"といった文字の繰り返しを検索するなど :(abc)

- ***文字集合（文字クラス）***

    - [^ァ-タダ-ヶ]　カタカナ以外のキャラクタ
    - [0-9a-zA-Z] 半角英数
    - [ぁ-ん]     ひらがな。

- ***繰り返し***
    -  * 直前のパターンの0回以上の繰り返し ※検索文字の結合時に、その部分がなくても許容にする
    -  + 直前のパターンの0回以上の繰り返し


##整形コマンド（ソート、重複行削除）　※重複行削除はソート後
 (alt) + A 
 (alt) + M 

##キーマクロ作成方法　
①　キーマクロの記録　(Shift) + (ctrl) + M
②　キーマクロの保存　(ctrl) + M　※再利用するときは保存時
③　キーマクロの読込　(ctrl) + L　※保存したものを利用する時
④　キーマクロの実行　(Shift) + (ctrl) + L

##サンプル

```
＜その１＞
***start***
#この文字列を拾い方はこちら。末尾に改行コードを入れるのがみそ
\*\*\*start\*\*\*\n 

＜その２＞
m:1234567<tab>エラーコードです
#この文字列の<tab>までの拾い方はこちら。<tab>はタブです。文字列ではありせん。
#^で先頭指定をしているのがみそ
^m: [0-9]+\t
 
＜その３＞
てすと;
test;
テスト・・ー;
#複数行があったときにカタカナだけを残したいとき。
#行は分けたままにしたいので;はこの後別でとる。^で以外にしているのがみそ
[^ァ-タダ-ヶー・\;]+\n

```

###参考

---

 こちらの記事を参考にさせていただきました。有難うございました。
[　　文字一覧 (かな) ※UTF-8] 
(https://tools.m-bsys.com/data/charlist_kana.php)
[　　サクラエディタで使える正規表現のメモ]
(https://qiita.com/toyokky/items/881e1d55a4a11969ebf3)
[　　サクラエディタで利用可能な正規表現]
(https://sakura-editor.github.io/help/HLP000089.html)
JavaScriptのイベントオブジェクトmemo

# JavaScriptのイベントオブジェクトって？
イベントリスナーやイベントハンドラーは、引数としてイベントオブジェクトを受け取ります。
DOMで発生したイベントは、イベントオブジェクトを使用して、プロパティー（情報）を取得したり、メソッドを使用して値を操作することができます。

例えば、keydownイベントのイベントオブジェクトはこんな感じ
![スクリーンショット 2021-04-13 10.26.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/291576/86a434f8-62cf-300e-c19e-a49ce99fc596.png)
eでkeydownイベントオブジェクトを受け取ったとすると、
e.typeで"keydown"というvalueを受け取れるということです。


# 具体的に何ができるの？
- typeプロパティ...イベントの種類は何か分かる（clike, mouseoverなど）
- targetプロパティ...イベント発生元の要素を取得できる
- clientX, clientY...イベントが発生した、ブラウザ上での座標を取得できる
- keyプロパティ...押下されたキーボードのキーの値を取得できる

などなど

# イベントオブジェクトを取得するには？
イベントリスナーに引数を指定するだけです。
慣例的に`e`や`ev`がよく使われます。

# 書き方例
```
document.getElementById('item').addEventListener('keydown', function(e) {
  console.log('キーコードは' + e.keyCode + 'です'), false);
});
```

# おまけ
クリックイベント等でリロードされてしまう時などは、イベントハンドラーでイベントオブジェクトを受け取って、preventDefault()をするとリロードされてしまうなどがなくなる

```
xxx.addEventListener('click', function(e) {
  e.preventDefault();
}
```
rustで作ったツールをシングルバイナリにするまでメモ

まずは https://doc.rust-jp.rs/book/second-edition/ch01-03-hello-cargo.html
を参考にインストールから実装方法の確認までを行う

## rustインストール

```shell
$ curl https://sh.rustup.rs -sSf | sh
```

```shell
$ export PATH="$HOME/.cargo/bin:$PATH"
```

をbashrcもしくはbash_profileにセットしておく

## 実装

```shell
$ cargo new hoge_project --bin
$ cd hoge_project
```

そして`src/main.rs`に実装していく。

あとは`Cargo.toml`に依存ライブラリを追加し読み込むように設定したりする

```shell
$ cargo build
```

するとbuildできるので`target/debug` 生成された `hoge_project` バイナリ実行できる

なお、これらをまとめて `$ cargo run`にて実行できるのでそれでもよい。

実装完了したらあとはこれをバイナリとして配布できるようにする。

## シングルバイナリ化

https://qiita.com/sile/items/e9d331b3b06565728d1d#追記-2016-05-30

```shell
$ rustup target add x86_64-unknown-linux-musl
$ cargo build --release --target=x86_64-unknown-linux-musl
```

これで行けたのかな・・・・？？

`target/release` に生成されたバイナリファイルを
gitプロジェクトの直下にbinディレクトリ用意して設置して上げておいた（これでいいのかな？）
X Window Systemとは？

- Linuxとは独立したソフトウェアで、`GUI環境を提供するウィンドウシステム`のこと。「X」と略されることが多い。

- 現在はほとんどのUnix系システムで標準的に採用されている。

- X Window Systemはクライアント・サーバーモデルを採用している。`通常のクライアント・サーバーモデルとは逆で、ユーザーが直接操作する側がサーバー（Xサーバー）で、リモートで動作する側がクライアント（Xクライアント）となる。`（これは、X Window Systemの機能を提供する側か、利用する側かという視点で見ている為）

#Xサーバーとは

- ユーザーが操作したキーボードやマウスのイベントをXクライアントに伝える。また、Xクライアントから送られてきた描画命令を解釈してディスプレイに表示する役目もある。つまりXサーバーは、ユーザーとアプリケーションとの間を取り持っている。


#Xクライアントとは

- XクライアントはXサーバーに対して文字やグラフィックスの描画命令を発行したり、Xサーバーからキーボードやマウスの入力のイベントを受け取って動作する。

#XサーバーとXクライアントの通信について

- XクライアントとXサーバの間の通信には、**`「Xプロトコル」`**というOSに依存しない規約を用いている。

#X Server Systemて使われるウィンドウマネージャーとは

- X Server SystemによるGUI環境は、実際には`「ウィンドウマネージャー」`と呼ばれるフロントエンドプログラムを使うことで提供される。このウィンドウマネージャーにはいくつか種類があり、その中から自分の好みにあったGUIを選択することができる。


参考サイト：http://www.astec-x.com/FAQ/aboutx.html
Mac ターミナルでタイマー（シェル芸

あ！腕時計と携帯をどっちも別の場所に置いてきてしまった，しかし10分お昼寝がしたい……と思った。Macが手元にあったので，チャチャっとワンライナーでこう書いた。
```sleep 600;for i in {1..35};do say -v Karen "Wake up";done```
600秒置いた後，35回Karenさんが"Wake up"と言ってくれる。

(補足)
オーストラリア英語ですが，Karenさんいい声だよね。おすすめ。入れてない人は次の方法で入れられます：
https://www.nobuhirosaijo.com/tech-gym2018/say-command-in-mac
JavaScriptで毎秒カウントダウンを自動更新する方法

まず、htmlの中にテキストとspan idでtextContentでJSで取得したデータを置き換える要素を作っておきます。

```
<p id="timer">知ってました？大阪万博まであと<span id="day"></span>日<span id="hour"></span>時間<span id="min"></span>分<span id="sec"></span>秒</p>

```
次に、関数countdownを作っていきます。引数はdue(意味：期限）です。

```
function countdown(due){
    const now=new Date();
    const rest =due.getTime()-now.getTime();
    const sec =Math.floor(rest/1000)%60;
    const min =Math.floor(rest/1000/60)%60;
    const hours=Math.floor(rest/1000/60/60)%24;
    const days=Math.floor(rest/1000/60/60/24);
    const count=[days,hours,min,sec];
    return count;
    
    }
```
まず、Dateオブジェクトのインスタンス化をする。
rest(意味：残り)にdue(つまり、期限）オブジェクトにgetTime()メソッドで1970年１月１日０：００からの時間をミリ秒で取得。
そこから、今の時間までのミリ秒を引いて代入する。
const count =[day,hours,min,sec];
は配列で、この後インデックス番号を使って呼び出すときに使う。
そして、return count;でcount配列を呼び出す。
次は、目標の時間を設定する。

```
    const goal =new Date(2025,4,3)
```
これは、定数goalにDateオブジェクトを使って日時を設定している。
＜日時を設定した状態でDateオブジェクトを初期化（つまりインスタンス化）する＞
new Date(年、月、日、時、分、秒、ミリ秒);
注意点：月は0が１月、1が２月、2が３月というふうにコンピュータとこちらが表示させたい月に１ヶ月のズレがある。
この場合、new Date(2025,4,3)となっているがこの場合コンピュータ側の4なので、こちら側の5月になる。

```
    function recalc(){
        const counter=countdown(goal);
        document.getElementById('day').textContent=counter[0];
        document.getElementById('hour').textContent=counter[1];
        document.getElementById('min').textContent=counter[2];
        document.getElementById('sec').textContent=counter[3];

        refresh();
    }
```
この関数内では、定数counterに上で定義したcountdown(due)関数の引数dueに一つ上で定義したgoal=new Date(2025,4,3)を代入して、関数recalc()関数　return count;でcount=[days,hours,min,sec]を返す。
そして、一番上で書いたコードにcounter配列をインデックス番号で指定して書き換える。
その後にrefresh()関数を呼び出す。しかし、refresh()関数はまだ作っていないのでこのあと説明する。
次はrefresh()関数を定義する。

```
    function refresh(){
        setTimeout(recalc,1000);

    }
```
setTimeout()メソッドは指定した関数名を()を付けずに指定して、カンマの後ろに指定した数値ミリ秒後にもう一度指定した関数を呼び出すというもの。
つまり
setTimeout(関数名,ミリ秒);
つまり、recalc()関数の最後でrefresh()関数を呼び出すということは、１秒毎にrefresh()関数からまたrecalc()関数を呼び出して、そのrecalc関数内でまたrefresh()関数を呼び出しているということ。

```
    recalc();
```
そして最後にrecalc()関数を呼び出している。
参考：JavaScript超入門書p１５４〜
クラウドIDE：Ruby on RailsチュートリアルでHerokuがインストールできなかった件


Ruby on Railsのチュートリアルで、Herokuをインストールしようとしたら、以下のエラーが出て進まなかった件。
調べても何が悪いのかよくわからなかった(ﾟ∀ﾟ)。
`bash: /home/ec2-user/.profile: Permission denied`

実行コマンドはチュートリアルに記載してあった下記の通り。
`source <(curl -sL https://cdn.learnenough.com/heroku_install)`

## 環境
・AWS,Cloud9の統合環境（クラウド統合環境）

## 対処
解決方法をググっても特に見つからなかった＼(^o^)／。

Heroku CLIをインストールするらしいので、Heroku CLIのインストール方法を確認した。
書いてあるコマンドで、チュートリアル以外のコマンドでインストールできないか調べた。
https://devcenter.heroku.com/articles/heroku-cli

下の方にnpmコマンドを使ってもインストールできることが書いてある。
インストールの注意文を見ると、「npm」と「node」が入っているのが前提のインストール方法なのだそうだ。
>This installation method is required for users on ARM and BSD. You must have node and npm installed already.
`npm install -g heroku`

というわけでクラウドIDEに入っているかを確認した。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565426/280d749e-cdb4-9c43-76e4-52933274a0b5.png)![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565426/930e56a6-c8f2-2bdb-a363-a86e15d7046e.png)
どちらも入っているらしいので、ダメ元で記載されていたコマンドを使ったらインストールができた。
もし詰まっていたら、一度この方法を試してみてください。（役に立つかはわからないけど）
レスポンシブWebデザイン

#概要
レスポンシブWebデザインについて説明します。様々なブラウザで表示する際に必要となります。

目次

- レスポンシブWebデザインとは
- viewportの設定
- メディアクエリーとは
- ブレークポイント



#レスポンシブWebデザインとは
レスポンシブWebデザインとは、表示領域に合わせ見え方が変わるようにデザインされたWebサイトのこと。
例えば、パソコンとスマートフォンだとデバイスの表示領域が違い、パソコン用の表示領域のWebサイトをスマートフォンで見ると文字が小さく見にくかったりする。このような場合に、レスポンシブWebデザインを使うと、コンテンツは変更せずにWebの見え方を変えることが出来る。

#viewportの設定(HTML)
レスポンシブWebデザインを適用するのに必要な手順①
viewportとは、様々なデバイスにおける表示領域のこと。これを設定しないと、上記に記載したようにスマートフォンで見た際に文字が小さくなったりする。
HTML内のhead内に< meta >タグを記述して表示領域の横幅を合わせる。

```html:hello.html
<meta name="viewport" content="width=device-width,initial-scale=1">
```

この処理により、スマートフォンで見た時も文字が大きくなっており、見やすくなる。
ただし、この設定だけではレイアウトが崩れていたりするので、調整が必要。この調整で利用するのがメディアクエリー

#メディアクエリーとは(css)
レスポンシブWebデザインを適用するのに必要な手順②
Webページが表示される画面の表示領域に合わせてCSSを切り替える機能。
メディアクエリーをCSSに記載することでレスポンシブWebデザインの細かい設定が可能となる。
書き方：@mediaとCSSに記述し、その後ろに画面の表示領域サイズを記述する

```css:hello.css
/* レスポンシブWebデザイン(モバイル版)
-------------------------------------------------------------------*/

@media (max-width: 600px){
  .title{
    font-size: 3px;
  }
```

上記の場合、max-width: 600pxなので画面の表示領域幅が最大600pxの時、{}の中のスタイルが適用される。(今回の場合はフォントサイズを3pxにするという設定)
このmax-width: 600pxの画面サイズの切り替えポイントをブレークポイントという。

#ブレークポイント
画面のサイズによってCSSを切り替える際の切り替えポイントをブレークポイントという。スマートフォンの画面幅の大きさも機種によって様々、また都度変わるために、このブレークポイント！という決まったサイズはない。大体のスマートフォンの画面幅をカバーしているのが600pxだと考えた。

以上です。様々なデバイスでの最適なサイズに調整出来ます。最後まで見てくださりありがとうございました。
Heroku+Laravel+MySQL+AWS S3（画像）でのデプロイ①

#はじめに
あまりにデプロイに苦労したため、自分メモを主に記録を残しておきます。
初心者なので、なにかありましたらご指摘いただけましたら嬉しいです。
下準備として、Herokuのユーザー登録が完了しているgit環境済みとします。


##Herokuに新規アプリケーションを作成する
まず、右上の「new」→「create new app」を選択し、アプリケーションを作成する。今回は、「samplehoge0105」とする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554341/87633f20-439c-6202-64f6-f266c1c1a504.png)

##MySQLの用意（ClearDB)
###clearDBを登録
MySQLを使うために、Herokuの「Resources」のAddoneより「clearDB　MySQL」を選択し、下記の無料プランを選択し、登録する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554341/92dfac72-623a-2f6f-d61c-f833708fe004.png)

###clearDBをLaravelで使用できるように環境設定
まず、「settings」の「Reveal config Vars」を選択する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554341/2ec959d4-bc6f-3576-9d34-f76f1e293209.png)
すると、下記の箇所に環境設定に必要な情報が入ってくるため、控えておく
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554341/6366b61e-df2f-5bfd-467a-9fad60da4e9f.png)
上記で控えた情報を、下記のように設定していく。

　mysql://(ユーザ名):(パスワード)@(ホスト)/(DB名)?reconnect=true

```heroku:
DB_CONNECTION=mysql 
DB_HOST=ホスト
DB_DATABASE=DB名
DB_USERNAME=ユーザ名
DB_PASSWORD=パスワード
APP_KEY=base64:--------
APP_URL=https://(herokuアプリケーション名)samplehoge0105.herokuapp.com
```

※APP_KEYは取得できます。herokuでlaravelを使うために設定してください。

```laravle
php artisan key:generate --show
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554341/e53ec89c-8ebb-35f6-9da6-50e3aa2ded70.png)


###herokuでphpを使えるようにする
「setting」→「Buildpacks」でphpを選択し、追加する。
この際、nodeを利用している場合はここで追加しておく。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554341/4ecb5a21-d3c9-eaad-70d7-404b44822fce.png)

###package.jsonおよび、AppServiceProvider.phpに追加
1. laravelのプロジェクトの「package.json」ファイルに下記項目を追加する

```laravel
"scripts":{
"heroku-postbuild": "npm run prod",`(←この行のみ追加）
```

2. laravelのプロジェクトの「app/Providers/AppServiceProvider.php」に下記項目に変更

```laravel
use Illuminate\Support\Facades\Schema;
public function boot()
{
	Schema::defaultStringLength(191);
}
```

##Procfileを作成する
laravelプロジェクトの直下に、procfile（拡張子なし）を作成し、下記内容を記入します。

```laravel
web: vendor/bin/heroku-php-apache2 public/
```
※herokuを動かすために、必要なファイルになります。必ず用意してください。

##httpsにするために
laravelでは、デフォルト設定では、httpでの動作とされるため、laravelプロジェクト内の「App\Http\Middlewar\TrustProxies」の設定を変える必要があります。

```laravel
class TrustProxies extends Middleware
{
protected $proxies = '*';（←ここの変更)
```



##herokuへデプロイしていく
ここまで下準備ができたら、デプロイしていきます。
下記コマンドを順番にうっていきます。

```laravel
$heroku login (herokuへログイン、別ウィンドウでherokuが立ち上がるので、ログインしてください)
$git init （git管理していたら不要です)
$git add . 
$git commit -m "コミットメッセージ"
$heroku git:remote -a samplehoge0105（herokuのアプリケーション名)
$git push heroku master　(これでデプロイSTART)
```

##データベースのテーブルを作成する
ここで、やっとmigrationします（ここまではやらない方が無難です）

```laravel
$heroku run php artisan migrate
```

##デプロイ完成
https://(herokuアプリ名）samplehoge0105.herokuapp.comで確認する



この後、画像の投稿に関して続きます。
【圏論】Qiitaに可換図式を入れる方法を調査【結論：画像入れろ】

# はじめに

Qiita記事で圏論関係の記事を書いてみたくて可換図式を入れ込む方法を調べてみました。

QiitaではMathjaxというJavaScriptのライブラリが使えるようになっているので、そこでサポートされているLaTexパッケージAMScdを使って可換図式を描画できます。

が、このAMScdが貧弱……

ちょっとした図なら綺麗ですが、如何せん図が命の圏論の話をするには少し力不足感が否めません。

そこでなんとかQiitaでうまく可換図式を入れ込む方法を調べていたのですが、

***結論：ローカルのLaTexで描いて貼れ***

というところに落ち着きました。

やっぱりTexにはかないませんね。

というわけで今回は`\usepackage[all]{xy}`がかなり良かったというお話です。

# xypicパッケージが良い

xypicパッケージを使うにはプリアンブルで`\usepackage[all]{xy}`を宣言しておきます。

たとえば、今回ぼくが練習に作ったファイルはこんな感じ。

```tex:Category.tex
\documentclass[12pt]{jarticle}
  \usepackage{amsmath,amssymb}
  \usepackage{amsfonts}
  \usepackage[all]{xy}

\begin{document}

\[
  \xymatrix{
    A \ar[r]^{f} \ar[d]_{g} & B \ar[d] \\
    C \ar[r] & D
  }
\]

\end{document}
```
　
こいつを実行した結果がこんな感じ。

![図式の例１.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698217/964f932b-1920-241f-cfce-49cd43d47b1b.png)

悪くないですね。

# ペイントで必要部分を切り取る

こういう手作業は本来なら嫌なのですが、背に腹は代えられません。

大きさを統一的に管理する方法として、

「***AtomでLaTexからPDFをビルドしたときに表示されるPDFウィンド幅の3分の1くらいの大きさで図を表示し、スクリーンショット***」

が現時点での現実的な解決策かなと思います。

![Atomでの表示例.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698217/b331a19a-95c6-2191-9f45-a2a1a89bd162.png)

ここで、次の赤線の範囲で切り取る感じですね。

![Atomでの表示例2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698217/9f4172e9-dee6-6012-c55d-b6406b2c281d.png)

しばらくこの運用でやっていこうと思います。

# さいごに

今日は記事を書くための準備記事になってしまいました。

明日以降、がっちり圏論記事を書いていこうと思います。
ChromeDevTool便利機能


## 選択している要素をキャプチャする

### ChromeDevToolのElementsタブで要素を選択

![スクリーンショット 2020-10-12 21.58.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237394/99c01475-6a12-b315-b9e8-f98d71515c5b.png)

---

### 要素の左側にある三点リーダー「...」をクリック
「Capture node screenshot」をクリック

![スクリーンショット 2020-10-12 22.00.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237394/3c20f4f9-03d9-c006-2442-677e41c36ff5.png)

---

### PNG形式で選択した要素の画像がDLされます。

![www.amazon.co.jp_b_ref=gwd_pd20lu_node=4483321051&pf_rd_r=JN59QNYEW3WR2EVYV0VY&pf_rd_p=9bbab559-c8f2-452f-8924-6445fee641a9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237394/02ccfdb6-87af-455f-a670-7b9f65c47662.png)
HTMLでdivを乱用するのは良くない

#プログラミング勉強日記
2020年10月12日
HTMLでコードを書くときにdivタグをよく使ってしまっていたがよくないと知ったのでその理由をまとめる。

#そもそもdivタグとは
　divタグはdivisionの略語で、`<div>`で囲った部分をブロックレベル要素としてグループ化することができる。divタグを使うことでCSSでレイアウトをそろえることができる。

#divタグを多用するのはよくない理由

- Webページの読み込み速度が低下
- CSSでスタイルを変えるのが大変になる
- JavaScriptで要素を参照するときの読み込み速度が低下

　divタグを多用されている場合は、ブラウザの技術が各要素を特定するのに時間がかかるので、Webページの読み込みの速度が遅くなる。
　また、idやclass属性を増えるのでCSSでスタイルを変えることも難しくなってしまう。また、JavaScriptで要素を参照する際にも処理能力が必要になるので、処理が遅れることがある。

#正しいdivタグの使い方

- 分割の目的や要素を集合化したいときに使用する
- 複数の要素が並んでいる場合にまとめる
- 他のタグを使う

　divタグではなくulタグやliタグを使って表現することでも簡潔に表すことができる。そのため、用途にあったタグの使い方をすることが大切。

#参考文献
[divの解説](https://html-coding.co.jp/annex/dictionary/html/div/)
[HTMLでdivが多いソースをおすすめしない理由を現役デザイナーが解説【初心者向け】](https://techacademy.jp/magazine/28724)
動画を挿入する方法

#トップページなどに動画を挿入する方法
##GIF
###https://gyazo.com/3015a8b1f689153dcfe7fcb308d483bb
![6582025a04cb61be20a4cabc8a556419.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/725167/cc8863f2-143e-204e-5af2-292b13d9de8e.png)

#下記コード
```java:index.html
<div class="bg-video-wrap">
  <p>Brilliant Blue</p>
  <video src="images/foreign.mp4" autoplay loop muted>
  </video>
</div>
```
```java:css
.bg-video-wrap {
  position: relative;
}
p {
  font-family: serif;          
  color: #fff;
  font-size: 400%;
  position: absolute;
  left: 30%;
  top: 100px;
  z-index: 1;
}
```
#以上です！
##状況に応じてCSSは各自変更して使って下さい！
##<font color="Red">foreign.mp4</font>の部分は各々、ダウンロードや作った動画の名前を決めると思うのでそれを当てはめて下さい！おそらく末尾はmp4でもmovでもどちらでも挿入できます！
##現場からは以上です！
LaravelでMVCを利用してとりあえず表示させてみる


【概要】
----------------------------------------
<b>1.ルーティングの設定</b>

<b>2.コントローラーの設定</b>

<b>3.ビューの設定</b>

<b>4.開発環境</b>



1.ルーティングの設定
----------------------------------------

```php:routes/web.php
Route::get('hoge', 'App\Http\Controllers\HogeController@index' );
```
ここで、Route::get('hoge', 'HogeController@index' );とすると、
”Target class [HogeController] does not exist”となってしまうので、最初からパスをコーディングしました。

<br>
2.コントローラーの設定
----------------------------------------
```php:app/Http/Controllers/HogeControllers.php
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class HogeController extends Controller
{
    public function index() #---❶
    {
        return view('hoge.index'); #---❷
    }
}

```
❶：ここでindexアクションを定義しています。
❷：hogeフォルダのindex.phpファイルに返り値としてレンダリングするようにしています。

<br>
3.ビューの設定
----------------------------------------

```php:resources/views/hoge/index.php
<html>
<head>
  <title>Hoge/Index</title>
</head>
<body>
  <h1>Index</h1>
  <p>HOGEHOGE</p>
</body>
</html>
```

簡単なHTML文しか書いていません。
「blade」テンプレートエンジンはまた後日説明します。
<br>

1~3を通じて下記が表記できます。
http://localhost:8000/hoge

![スクリーンショット 2020-10-13 0.32.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686400/8248637f-402f-0c43-12d9-006913faa177.png)


4.開発環境
----------------------------------------
PHP 7.4.10
Laravel 8.9.0
Apache  2.4.41
<br>
【Vue.js】画像の遅延読み込みを実現する為にvue-lazyloadを導入してみた

実務でフロントのパフォーマンス改善を仰せつかり、
試行錯誤する中で、学習の一環で個人アプリに[vue-lazyload](https://github.com/hilongjw/vue-lazyload)と言うライブラリを導入してみた。

他にもいくつかvueでLazyLoad出来るライブラリがあるので、後日そっちも試してみたい。

## Lazy Load
Lazy Loadとは、画像やiframeなどコンテンツがブラウザの表示領域内に存在するものだけをロードし、領域外のコンテンツはロードしないことで、画面表示を高速化する仕組みのことです。

## 環境
vue.js 2.6.12
vue-lazyload 1.3.3

## 実装
まずはライブラリをインストールします。

```
$ npm install vue-lazyload -D
```

CDNでもOKです。

```
<script src=”https://unpkg.com/vue-lazyload/vue-lazyload.js"></script>
```

エントリーポイントでインポートして必要に応じてオプションを設定しておきます。

```app.js
import VueLazyload from 'vue-lazyload'

Vue.use(VueLazyload, {
  preLoad: // 事前ロードする高さの割合指定
  error: //エラー時に表示する画像指定する
  loading: // ロード中に表示する画像指定する
  attempt: // ロード失敗した時のリトライの上限指定
  listenEvents: // 遅延読み込みを起動するためのイベント
  adapter: // 要素の属性を動的に切り替えたい時に使用
  filter: // 画像を動的に切り替えたい時に使用
  throttleWait: // 遅延の待機時間
})
```

Lazy Loadさせたいimg要素にv-lazyディレクティブ的なもので画像パスを指定するだけと簡単です。

```card.vue
<li v-for="item in items" :key="item">
  <img class="card-main-img" v-lazy="item.imageUrl">
</li>
```

実装イメージ。
分かりづらいですが、ロード中の画像にNoImageを設定しています。


![jWsEyGD1vOdE0wKNuZKH1602506098-1602506114.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531606/253bd00f-de05-50ce-5654-35389adc97d0.gif)
RubyでDIしてみた


## DIとは
dependency injection (依存性注入)のこと

外からconstractorにobject渡せるようにすることで依存を避けようっていうもの

## 実装
Interactorを例に書いていく
[dry-container](https://dry-rb.org/gems/dry-container/0.8/)と[dry-auto_inject](https://dry-rb.org/gems/dry-auto_inject/0.6)を使ってDIしてみた

### DIしてない版
```not_di.rb

module Interactor
  class FindUser
    def initialize(params)
      @params = params
    end

    def call
      user_repo = UserRepository.new
      user_repo.by_pk(@params[:id])
    end
  end
end

```
UserRepositoryに依存しているのがわかる

### dry-container使わない版
```pure-di.rb

module Interactor
  class FindUser
    def initialize(params: {}, user_repo: UserRepository.new)
      @params = params
      @user_repo = user_repo
    end

    def call
      @user_repo.by_pk(@params[:id])
    end
  end
end
```

initializdの引数がでっかくなってみづらいコードになりがち
これありますねぇ

### dry-container版
```dry-di.rb
module Container
  module FindUser
    extend Dry::Container::Mixin

    # 注入するobjectを登録していく
    # blockでdefaultのobjectを宣言できる
    register "params"

    register "user_repo" do
      UserRepository.new
    end
  end
end


module Interactor
  class FindUser
    Import = Dry::AutoInject(Container::FindUser)
    # includeしたものをmethodで呼び出せるようになる
    include Import["params", "user_repo"]

    def call
      user_repo.by_pk(params[:id])
    end
  end
end
```

コードは増えたけど責務を切り分けることで見通しがよくなった

InteractorがContainerに依存していて、呼び出す人(Controllerとか)もContainerに依存しているので
いい感じに依存性を逆転させることができた

before: controller -> interactor
after: controller -> container <- interactor


## 何が嬉しいのか

- コードがスッキリする

initializeをcontainerに委託することでinteractorの責務が減った
classあたりの責務は減らしていきたい

- 単体テストが簡単にできる

InteractorのテストをDB用意しないでできる
上の例だと `by_pk(id)` に反応するobject渡せば良い

```test.rb
User = Struct.new(:id, :name, :age)

class TestUserRepo
  def by_pk(id)
    User.new(id, "tarou", 20)
  end
end

params = { id: 1 }
user_repo = TestUserRepo.new
input = { params: params, user_repo: user_repo }

Interactor::FindUser.new(input).call
```
みたいにできる