OmniAICreator/Qiita-1.07M huggingface dataset:
mysql5.7 にて初期クライアント立ち上げ時に管理者権限でないと入れない対応

# 概要
mysql5.7インストール後、初期設定のため

```
$ mysql -uroot -p
```
にてmysqlクライアントにアクセスしようとしたところ、

```
$ mysql -u root -p                                                                                                                                                       
Enter password:                                                                                                                                                                                           
ERROR 1698 (28000): Access denied for user 'root'@'localhost'
```
と怒られる。

その際の対応方法を記載する。

# 対応
`sudo` や `su -` を利用して管理者権限でmysqlクライアントを起動する。

```
$ sudo mysql
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 18
Server version: 5.7.26-0ubuntu0.18.04.1 (Ubuntu)

Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>
```

その後、以下のクエリを実行してsudoがなくても入れるようになる。

```
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '[:your_password]';
```

完了
Switch式に変換できるSwitch文を探す

# この記事はなに

[JJUG CCC 2019 Spring](http://www.java-users.jp/ccc2019spring/#/)で発表した、[今日から始めるカジュアルなソースコード解析](https://speakerdeck.com/akiragoto/jjug-ccc-2019-spring)という発表の中身で説明したユースケースの詳細版です。

# 概要

Java 12からSwitch式がプレビュー機能として追加されました。
Switchを式として扱えるので代入文の右辺値などに書くことができます。

詳細は[こちらの記事](https://qiita.com/nowokay/items/0e860819b6ffb1aca90a)が非常にわかりやすいです。

プログラミング言語に新しい構文が追加された時、私は「で、実際どれぐらい使い道あるの???」とよく思います。

今回はそんな疑問を解消しつつ知的好奇心を満たすため、Switch式に変換できるSwitch文を実際のソースコードから探してみたいと思います。

# 検索処理の概要

ソースコードの検索にはソースコード解析技術を用います。

具体的には、[JavaParser](https://github.com/javaparser/javaparser)というライブラリを使用して構文解析を行い、生成された抽象構文木に対して検索処理を実行します。

今回は「Switch式に変換できるSwitch文」というのを以下のように考え、条件にマッチするSwitch文を検索しました。
※ この条件は厳密ではありません。あくまで大まかに検索するための条件です。

- 2つの文からなるCASEは必ず`代入文+return`か`代入文+break`でなくてはならない。
- 2つの文からなるCASEは少なくとも1つ存在しなければならない。
- 1つの文からなるCASEは必ず`return`か`break`でなくてはならない。
- 1つも文を持たないCASEはいくら存在してもよい。
- 3つ以上の文をもつCASEは存在してはならない。
- 代入文の左辺の変数はすべて同じ変数でなければならない。

解析に使用したソースコードは[こちら](https://github.com/AkiraGoto/jjug_ccc_2019_spring_usecase_1)です。

# 検索対象

GitHub上のJavaプロジェクトのうちスターが多い順に100個取得して、それらを対象にしました。
検索クエリは下記のとおりです。

```
curl -o github_java_top100.json "https://api.github.com/search/repositories?q=stars:>0+language:Java&sort=stars&order=desc&page=1&per_page=100"
```

調査対象は2019年2月頃取得したので、現在のスター順とは異なる可能性があります。
また、プロジェクトがどういうものか、アーカイブされているのかなどは一切考慮していません。

# 検索結果

- Javaファイル：120,996 ファイル
- 処理時間：約20分
- 見つかったSwitch文：639 個

検索結果をマークダウン形式でまとめたものは[こちら](https://github.com/AkiraGoto/jjug_ccc_2019_spring_usecase_1/blob/master/result/result.md)です。

全ての検索結果を確認できてはいませんが、ざっと見ると意図通りに検索ができているように思います。
下記に2つほど、いい感じの検索結果を例示します。


Android-PullToRefreshプロジェクトの[PullToRefreshBase.java](https://github.com/chrisbanes/Android-PullToRefresh/blob/master/library/src/com/handmark/pulltorefresh/library/PullToRefreshBase.java#L1254)より

```
switch(getPullToRefreshScrollDirection()) {
    case HORIZONTAL:
        oldScrollValue = getScrollX();
        break;
    case VERTICAL:
    default:
        oldScrollValue = getScrollY();
        break;
}
```

jenkinsプロジェクトの[RunParameterDefinition.java](https://github.com/jenkinsci/jenkins/blob/master/core/src/main/java/hudson/model/RunParameterDefinition.java#L176)より

```
switch(getFilter()) {
    case COMPLETED:
        lastBuild = project.getLastCompletedBuild();
        break;
    case SUCCESSFUL:
        lastBuild = project.getLastSuccessfulBuild();
        break;
    case STABLE:
        lastBuild = project.getLastStableBuild();
        break;
    default:
        lastBuild = project.getLastBuild();
        break;
}
```

# まとめ

今回はSwitch式に変換できるSwitch文を探すということで、実際にGitHub上のプロジェクトのソースコードに対して検索処理を実行してみました。

個人的には思ったよりたくさん変換できる箇所があるんだなという感触です。

今後はぜひ使えるところでSwitch式を活用していきましょう。
picoCTF writeup (hertz 2)

与えられたポートでサーバにアクセスすると，暗号文が送られてくる．
リダイレクトでテキストに保存する．

```bash
nc 2018shell.picoctf.com 39961 > tmp.txt
```

中身を見ると，換字式暗号であるが，シーザー暗号やヴィジュネル暗号ではないみたい．
1文字ずつ対応表を作っていく．
フラグの形は`picoCTF{hoge}`なので，{}の直前に使われている文字は変換できる．

| 変換前 | y | l | g | u | v | a |
|:-----:|:-:|:-:|:-:|:-:|:-:|:-:|
| 変換後 | p | i | c | o | t | f |

以降は英文であることを考慮して地道に変換していく．
Pololu 3pi Robot 勉強ノート【目次】

Pololu 3pi Robot を使ってマイコンの勉強をしようと思う。


# Pololu 公式ドキュメント

## 3pi Robot 関連
### ユーザーズガイド
Pololu 3pi Robot User’s Guide
https://www.pololu.com/docs/0J21
(非公式日本語訳)
https://qiita.com/kurapooh/private/695d3119e7ba40dd8ab4

### 回路図
Pololu 3pi Robot Simplified Schematic Diagram
https://www.pololu.com/docs/0J21/5.e
(PDF版)
https://www.pololu.com/file/0J119/3pi_schematic.pdf

Pin Assignment Tables
https://www.pololu.com/docs/0J21/9


## AVR Library 関連
### ライブラリ・リファレンス
Pololu AVR Library Command Reference
https://www.pololu.com/docs/0J18

### ライブラリ・ユーザーズガイド
Pololu AVR C/C++ Library User’s Guide
https://www.pololu.com/docs/0J20

### (Atmel資料) AVR ソフトウェア・ユーザーズガイド
AVR42787: AVR Software User Guide
http://ww1.microchip.com/downloads/en/AppNotes/Atmel-42787-AVR-Software-User-Guide_ApplicationNote_AVR42787.pdf


# マイコン (ATmega328P) 関連ドキュメント

## ハードウェア・マニュアル
megaAVR&reg; Data Sheet - ATmega48A/PA/88A/PA/168A/PA/328/P
http://ww1.microchip.com/downloads/en/DeviceDoc/ATmega48A-PA-88A-PA-168A-PA-328-P-DS-DS40002061A.pdf



# 勉強ノート

準備中
【目次】記事リスト

Qiita 始めました。


# Pololu 3pi Robot
## 勉強ノート
* [Pololu 3pi Robot 勉強ノート](https://qiita.com/kurapooh/items/2fb5f9ec90a5d6aa6798)

## ドキュメント(日本語訳)
* [Pololu 3pi Robot ユーザーズガイド 日本語訳](https://qiita.com/kurapooh/items/695d3119e7ba40dd8ab4)


# アプリ設定
* [クイックアクセスツールバーのオススメ設定 (Excel)](https://qiita.com/kurapooh/items/8a5485b8c09df0191b73)
* [サクラエディタ 設定メモ](https://qiita.com/kurapooh/items/c77366eef833fe3d9ead)


# 簡易ツール
* [【SendTo】ファイルを新しいプロセスで開く＋読み取り専用で開く(Excel/Word)](https://qiita.com/kurapooh/items/3d3348a63469897c7166)
* [【SendTo】ネットワークドライブ上のパスをフルパス(UNCパス)に変換する
](https://qiita.com/kurapooh/items/03c4a989208b6bc4f84f)
* [【SendTo】非表示シートを一括表示(Excel)](https://qiita.com/kurapooh/items/a728d9025a05fb73be60)
* [【SendTo】パスワードを一括設定/解除する(Excel/Word/PowerPoint)](https://qiita.com/kurapooh/items/0f110a8e5f4ec2acc2d6)


# 未分類
* [「○」と「〇」は違う文字です。](https://qiita.com/kurapooh/items/944c485c7c994f0de3eb)


# Qiita
* [アカウントページ](https://qiita.com/kurapooh)
* [限定共有記事を全体公開するとURLはどう変わるか](https://qiita.com/kurapooh/items/b02d92ed0e490ddaba2c)
AWS Glueで "No enum constant com.amazonaws.services.glue.FileFormat.DYNAMODB"

AWS Glueジョブを作成しようとした時、以下のようなエラーが出ることがある。

```bash
No enum constant com.amazonaws.services.glue.FileFormat.DYNAMODB
```

# 原因
データターゲットにDynamoDBを指定しているから

# 対策
データターゲットをDynamoDB以外のものとする

# 所感
データソースがDynamoDBだとデフォルトでデータターゲットもDynamoDBとなる? 自動で入力されていた。
自動で入力されていたのに上記のエラーが出る辺り、実にAWSらしい。
【ラビットチャレンジ】 応用数学 第二章 確率・統計 レポート

#確率
##頻度確率（客観確率）
発生する頻度．
例：10本のうち1本だけ当たりのクジの当選確率は10%．
　　1回引く当たり0.1回当たっているという考え．
　　実験的に確かめられる．
##ベイズ確率（主観確率）
信念の度合い．
例：あなたは40%の確率でインフルエンザですという確率．
　　あなたは一人しかいないので，実験的に確かめられない．

#条件付き確率
ある事象$X=x$が与えられた下で，$Y=y$となる確率．
$$P(Y=y|X=x) = \frac{P(Y=y,X=x)}{P(X=x)}$$

#独立な事象の同時確率
お互いに因果関係のない事象$X=x$と事象$Y=y$が同時に発生する確率．
$$P(X=x,Y=y)=P(X=x)P(Y=y)=P(Y=y,X=x)$$

#ベイズ則
事象$X=x$と事象$Y=y$に対して，
$$P(X=x|Y=y)P(Y=y)=P(Y=y|X=x)P(X=x)$$

#確率変数と確率分布
##確率変数
- 事象と結び付けられた数値．
- 事象そのものを指すと解釈する場合も多い．

##確率分布
- 事象の発生する確率の分布．
- 離散値であれば表に示せる．

#期待値
その分布における確率変数の，平均の値 or 「ありえそう」な値．
事象$x$に対して，確率変数を$f(x)$，確率を$P(x)$とすると，
期待値は，$E(f)$は，

- 確率変数が離散値の場合，
$$E(f) = \sum_{k=1}^n P(X=x_k)f(X=x_k)$$
- 確率変数が連続する値の場合，
$$E(f) = \int P(X=x_k)f(X=x_k)dx$$

#分散と共分散
##分散
データの散らばり具合を表す．データの各々の値が，期待値からどれだけずれているのかを平均したもの．言い換えると，どれだけ期待通りになるかを表す．
分散$Var(f)$は，

```math
\begin{align}
Var(f)&=E\Bigl(\bigl(f(X=x)-E(f)\bigr)^2\Bigr)\\
&=E\bigl(f^2(X=x)\bigr)-\bigl(E(f)\bigr)^2
\end{align}
```

絶対値を取ると面倒なので，２乗をとっている．分散の単位が元のデータの２乗になってしまうので，平方根を取る：偏差．

式変形は，期待値の線形性による．

##共分散
２つのデータ系列の傾向の違いを表す．（正確に相関を表すわけではないが，傾向はつかめる．円のように点対称のデータではきれいな相関があるがゼロになる．）
- 正の値を取れば似た傾向．
- 負の値を取れば逆の傾向．
- ゼロを取れば関係性に乏しい．
共分散$Cov(f)$は，

```math
\begin{align}
Cov(f,g)&=E\Bigl(\bigl(f(X=x)-E(f)\bigr)\bigl(g(Y=x)-E(g)\bigr)\Bigr)\\
&=E\bigl(fg\bigr)-E(f)E(g)
\end{align}
```

$f$と$g$のスケールを合わせるために，$Cov$を$f$，$g$のそれぞれの標準偏差の積で割る．その値を相関係数という．

#様々な確率分布
##ベルヌーイ分布
２種類のみの結果しか得られない試行の結果を0,1で表した分布．$\mu$は1の確率．
$$f(x) = x$$$$P(x|\mu)=\mu^x(1-\mu)^{1-x}$$すべての試行はベルヌーイ分布で表せる．
AとA以外，A以外=BとB以外，B以外=CとC以外，$\cdots$．

##カテゴリカル分布（マルチヌーイ分布）
複数種の結果が得られる場合．$n$種類の結果が得られるとすると，

$$P(X=x)=\sum_{k=1}^n\lambda_k^{[x=k]}$$ただし，

```math
[x＝k] = \left\{
\begin{array}{ll}
1 & (x=k) \\
0 & (x \neq k)
\end{array}
\right.
```
##二項分布
ベルヌーイ分布の多試行版．
$n$回試行して$x$回，確率$\lambda$の事象が起こる確率は

```math
\begin{align}
P(x|\lambda,n)&=\frac{n!}{x!(n-x)!}\lambda ^x(1-\lambda )^{n-x} \\\\
&={}_xC_r \lambda ^x(1-\lambda )^{n-x}
\end{align}
```

##ガウス分布
釣鐘型の連続分布
$$\mathscr{N}(x;\mu,\sigma^2)=\sqrt{\frac{1}{2\pi\sigma ^2}}\exp{\Bigl(-\frac{1}{2\sigma ^2}(x-\mu)^2}\Bigr)$$確率分布なので，全体で$1$となる．そのように係数が決められている．

<br>
<br> 

[DeepLearning ラビットチャレンジ](http://ai999.careers/rabbit/　"ラビットチャレンジリンク")
<img src="http://ai999.careers/tools/wp/wp-content/uploads/2018/12/card.png" width=50%>
今度こそ動いた :-）

# 大文字じゃないとダメらしい
- [前日のエラー](https://qiita.com/ouraboros/items/1a846e15fd64f1e23f39#%E4%BA%88%E7%B4%84%E8%AA%9E%E3%82%92%E3%82%84%E3%82%81%E3%81%A6%E3%81%BF%E3%82%8B)を元に改めてやってみる
- `main.go`を書き直してみるも同じエラーが表示された
- エラー内容で検索してみると、`fmt.Println`で表示させようとしているファイル名の先頭が小文字なのがいけないらしい事が分かった（参照したサイトは[こちら](http://horie1024.hatenablog.com/entry/2014/08/25/012123)）

# やった、動いた！
- サイトに書いてある通りファイル名の先頭を大文字にしたら動いた！
- ダメだった時の記述


```
package sort

func  beerfamous() string {
  return "Superdry"
}

package sort

func  sakefamous() string {
  return "kikumasamune"
}

package sort

func whiskeyfamous() string {
  return "ardbeg"
}
```

- 動いた時の記述　※上段のファイルに比べて`****famous()`の先頭が大文字に変わっています

```
func Beerfamous() string {
    return "Superdry"
}
package sort
func Sakefamous() string {
    return "kikumasamune"
}
package sort
func Whiskeyfamous() string {
    return "ardbeg"
}
```

- 動いた時の出力結果

```
$ go run main.go 
Superdry
kikumasamune
ardbeg
```

# まとめ
- たかが大文字、されど大文字
- コンピュータは難しい、でも動くとやっぱり嬉しい :-)
MoviePyで音量を元に動画編集

#概要
ゲーム実況みたいな長尺の動画って編集するの大変です。

例
https://youtu.be/2aBizw3AqR0

ゲーム実況の場合、凄い雑に言うと、音が大きい所ってそこそこ目立つシーンだと思います。
ので、音量を元に自動で動画編集できたら良いな、と思ってやってみました。

#準備
私が調べた限り、プログラムで手軽に動画編集するのは、以下が一番簡単そうでした。
MoviePy
https://zulko.github.io/moviepy/

#実装
```py
import numpy as np
import matplotlib.pyplot as plt
from moviepy.editor import *

name = '2019-04-03 23-51-38.mp4' # 入力動画
size = 1000000000 # 音量読込
threshold = 0.4 # 音量閾値(0～1)
plot = False # 波形表示切替
length = 0.5 # カット基点からの前後長

# 動画を開いて閾値取得
video = VideoFileClip(name, audio_buffersize=size)
buffer = video.audio.reader.buffer
threshold = buffer.max() * threshold

# 各値表示
print('duration : ' + str(video.duration))
print('audio_fps : ' + str(video.audio.fps))
print('max : ' + str(buffer.max()))
print('mean : ' + str(buffer.mean()))
print('threshold : ' +  str(threshold))

if plot:
    # 波形表示
    plt.plot(buffer)
    plt.show()

clips = {}
count = 0
index = 0
while True:
    # 有効シーン有無確認
    where = np.where(buffer[index:] > threshold)
    if len(where[0]) < 1:
        break

    # 有効シーン位置出しと次出し設定
    where = where[0][0] + index
    print('where : ' +  str(where))
    index = int(video.audio.fps * length + where)

    # カット編集
    anchor = where / video.audio.fps
    clips[count] = video.subclip(anchor - length, anchor + length)
    count += 1

# 繋げて出力
videos = [clips[i] for i in range(count)]
result = concatenate(videos)
result.write_videofile("result.mp4")
```
sizeに頭の悪い値が入ってますがテキトウです。
変更しそうなのはname, threshold, length辺りだと思います。
thresholdの値が大きければ、より大きい音の所を抽出します。
lengthは前後長なので2倍の時間がトリミングされます。(0.5なら1秒)

#結果
<blockquote class="twitter-tweet" data-conversation="none" data-lang="ja"><p lang="cy" dir="ltr">© Unity Technologies Japan／UCL <a href="https://t.co/wjyEWZKn5F">pic.twitter.com/wjyEWZKn5F</a></p>&mdash; 120/偽葵/青ユニ (@120byte) <a href="https://twitter.com/120byte/status/1129418806302892032?ref_src=twsrc%5Etfw">2019年5月17日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
途中ダブったりしてますが、まぁ、概ね良いので無視してます。
だいたい笑いと叫びが取れます。欲しいわけじゃないですが、舌打ちとか咳払いも目立ちますね。

#参考
https://githubja.com/zulko/moviepy
https://stackoverflow.com/questions/28758474/how-to-concatenate-videos-in-moviepy
micro:bitで電池の電圧を計測する

#概要
micro:bitを電池チェッカーとして使用するために単純なテストを行いました。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">micro:bitで電池の電圧を計測。<br>テスター 1500mv<br>micro:bit 1571mv<br>を表示<a href="https://twitter.com/hashtag/microbit?src=hash&amp;ref_src=twsrc%5Etfw">#microbit</a> <a href="https://t.co/m3PgpWvybZ">pic.twitter.com/m3PgpWvybZ</a></p>&mdash; keicafeblack (@keicafeblack) <a href="https://twitter.com/keicafeblack/status/1129407709399244800?ref_src=twsrc%5Etfw">2019年5月17日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

#ブロックプログラミング
![PG.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181708/dc387f23-dc77-48ad-50c2-7f5cd3f1f17c.jpeg)

電圧を、0～1023の値(0～3.3V)として読み取ることができるので、
入力：0～1023
出力：0～3300mV
として表示しています。

[参考：サヌキテックネット](https://sanuki-tech.net/micro-bit/overview/hardware-front/)

#コード
```Vchecker.js
basic.forever(function () {
    basic.showNumber(Math.round(Math.map(pins.analogReadPin(AnalogPin.P0), 0, 1023, 0, 3300)))
    basic.pause(2000)
})

```

#参考）電池を外した状態の表示
０にはならず、下記の状態でした。
テスター：292mv
micro:bit：516mv
【RSS】記事引っ張ってニュースアプリ作ってみた①モデル作成~タスク処理まで

RSSを用いて記事を外部から取得する方法でオリジナルニュースアプリを作成。
忘れないように処理ごとに分けて自分用に記録。
使うモデルは２つ(feedモデル→記事カテゴリー/entryモデル→記事)

####①feedモデル作成 (RSSのURL（カテゴリー別)を入れておく用)
```
$rails g model feed name url description:text 
$rake db:migrate
```

####②entryモデル作成(取得する記事が更新されていくモデル)
```
$rails g model entry title published:datetime content:text url author feed_id:integer
$rake db:migrate
```

####③アソシエーションを定義 (親：feed, 子：entry)
feedモデル

```
has_many :entries, dependent: :destroy
```
entryモデル

```
belongs_to :feed
```


####④feedモデルにカテゴリをあらかじめ設定してしまう(仮データ作成用にgem 'seed_fu'使用)
db/fixtures/development/feeds.rb

```
Feed.seed do |s|
  s.name ="Today"
  s.url ="http://rss.--------------.xml"       ※記事URLを指定
  s.description ="Today"
end
```


####⑤gem 'feedjira'をインストール

####⑥記事を取得するためのrakeタスク作成 (modelにあらかじめ登録していたURLから取得できるように！)
lib/task/news_rakeに以下を記述


```
namespace :news do
  task feeds: [:environment] do
    Feed.all.each do |feed|
      content = Feedjira::Feed.fetch_and_parse feed.url
      content.entries.each do |entry|
        local_entry = feed.entries.where(title: entry.title).first_or_initialize
        local_entry.update_attributes(content: entry.content, author: entry.author, url: entry.url, published: entry.published)
        p "Newsed Entry - #{entry.title}"
      end
      p "Newsed Feed - #{feed.name}"
    end
  end
end
```


↓
※だがしかし、、、これだと反応しない！
gem 'feedjira'の仕様が変わって、```fetch_and_parse```のfetch部分が働いてないようだ・・・。
[参考URL]https://github.com/feedjira/feedjira
ということで、gemを使って記事を引っ張ってくるようにする。

####⑦gem 'httparty'をインストール(これで記事持ってこれる!)

```
namespace :news do
  task feeds: [:environment] do
    Feed.all.each do |feed|
      xml= HTTParty.get(feed.url).body
      content = Feedjira::Feed.parse xml
      content.entries.each do |entry|
        local_entry = feed.entries.where(title: entry.title).first_or_initialize
        local_entry.update_attributes(content: entry.content, author: entry.author, url: entry.url, published: entry.published)
        p "Newsed Entry - #{entry.title}"
      end
      p "Newsed Feed - #{feed.name}"
    end
  end
end
```

####⑧タスク実行
```
$rails db:migrate:reset
$rails db:seed_fu
$rake news:feeds
```


[RSS機能実装参考URL] http://www.tom08.net/entry/2017/01/04/160933
rails appにbootstrap４を導入したいがエラー続きで動かない

railsにbootstrapを導入しようと色々と試しているのですが、エラー続きでうまく表示することができません。

混乱してなにをどうしてよいのかわかりません。
お力を下さい。
お願いいたします。
①HTML
<img width="576" alt="1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325065/31253e4c-ad0a-c936-bbf4-bcf0017633e3.png">
<img width="576" alt="2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325065/1ee30a98-e2d5-9f5d-0aa2-a575db493eed.png">
<img width="576" alt="3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325065/7cf2428c-0d06-db7b-988f-3c0772be3ed5.png">

②Gemfile
<img width="576" alt="4.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325065/4e4edd5d-ba15-8d86-15d7-45360b4986d0.png">

③styleseet　名前を変更してｓを追加しています。
<img width="691" alt="5.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325065/99b6bd30-eedf-ee74-00ff-40f1c4261d70.png">

宜しくお願いします。
gitコマンド - branch作ってプッシュする手順

それするのに必要そうなコマンドと流れのメモ。クローンしてディレクトリ入った後のことです。

branch確認

```
git branch -a
```
ローカルbranch作成

```
git branch first_branch
```

branch移動

```
git checkout first_branch
```

#### ※そしてソース編集

リモートbranch登録

```
git push origin first_branch
```

branchステータス確認

```
git status
```

branch編集内容確認

```
git diff
```

branchファイル追加

```
git add ファイル名
git commit
git push
```

おまけ - SSL証明書エラーを回避 (最初にやっとくもん笑)

```
git config --global http.sslVerify false
```

おまけ - git logを一つにまとめる

```
１．コメントのidを一覧表示
git log --oneline
56ff7fc first commit
3a4d26f test
8d238dd test
d31d913 test
d3ef00d test
5c735a5 test
f189291 test
44974c6 config file first commit
5cb3a02 add README
 
２．コメントをまとめる（最初は全部 pick なので 一番最初以外全部 s にして保存）
git rebase -i 5cb3a02 ←まとめたいコメントの開始のid
pick 44974c6 config file first commit
s f189291 test
s 5c735a5 test
s d3ef00d test
s d31d913 test
s 8d238dd test
s 3a4d26f test
s 56ff7fc first commit
 
------------------------------------
p, pick = use commit
r, reword = use commit, but edit the commit message
e, edit = use commit, but stop for amending
s, squash = use commit, but meld into previous commit
f, fixup = like "squash", but discard this commit's log message
x, exec = run command (the rest of the line) using shell
------------------------------------

editorが立ち上げるのでコメントを入れて保存
 
３．gitにプッシュする
git push -f
```
EtherIPトンネルの動作をパケットキャプチャして確認する

https://qiita.com/kure/items/2bc048f6ddff8de03c65
の続き。

# EtherIPについてのメモ

> 受信したイーサネットフレームを、IPネットワーク上に構成したトンネルを経由してブリッジ転送する機能

参考URL（3）からの引用

- 単体では暗号化機能は無い
- セッション管理機能は無い

## 動作イメージ
離れたネットワーク同士をトンネルを介してブリッジ接続するイメージ。端末からは、相手端末が同一LAN上に存在しているかのように動作する。ARPも通常のように解決される。
ブリッジについては参考URL(4)が分かりやすい。


![概要図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50690/45b4b144-5f70-df24-a17a-0ab8f998cd66.png)

# 検証
## 概要
- NECのIX2015、2台でトンネルを構成する
- 間に[以前の記事](https://qiita.com/kure/items/2bc048f6ddff8de03c65)で使用したNETGEAR GS105Eを配置し、ミラーリングを行い、パケットキャプチャする

## 構成
構成図は以下の通り
![構成図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50690/a7003978-004b-5241-39d1-f05e15a9a4e0.png)

## キャプチャ結果
### エンド端末

- エンド端末から送信されるデータは宛先端末のIPアドレス/MACアドレス
    - MACアドレスはARPで解決済み
    - エンド端末はトンネル構成は意識されず、同一LAN内に送信するかのように送信されている

![ScreenClip.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50690/40c3d7fe-b9cb-1118-d8ab-75b89ba389c5.png)


### 経路上（ミラーリングポート）

- カプセル化されたデータ（画像的には下部）に元々のパケットのヘッダがある
- 付与されたIPヘッダのプロトコル番号は97(EtherIP)
- 付与されたEther/IPヘッダの宛先等はトンネルを構成するノード同士の通信に使用される実ヘッダ

![ScreenClip.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50690/3dfb7775-ff78-d051-a0c5-ccbe9f7af3d1.png)


# 参考URL
★RFC
(1)RFC 3378 - EtherIP: Tunneling Ethernet Frames in IP Datagrams https://tools.ietf.org/html/rfc3378

★RFCの日本語訳例
(2)RFC3378 EtherIP：ＩＰデータグラム内のトンネルイーサネットフレーム http://www5d.biglobe.ne.jp/stssk/rfc/rfc3378j.html

★NECさんのFAQ。他のトンネルプロトコルとの違いもあり分かりやすい。
(3)Ethernet over IP機能 : FAQ : UNIVERGE IXシリーズ | NEC https://jpn.nec.com/univerge/ix/faq/etherip.html

★ブリッジの解説が非常にわかりやすい
(4)ネットワーク機器講座｜スイッチ編 https://www.allied-telesis.co.jp/library/nw_guide/device/switch.html#002

※設定ログ
https://gist.github.com/kuredev/e036802d11c39f0791d4e12e4400b4f3
ハッピーな開発🎉をするための、プロジェクトにおける要件定義の役割

何かサービスを開発する時に、以下のような状態に陥ることがあります。

- 「要求」だとか「要件」が曖昧なまま開発に入ってしまう
- 形だけの要件定義書を作り、開発に入ると見返さない(形骸化してしまう)

このような状態になってしまうと、大体は大きな手戻りが発生したりプロジェクトに損失を与えてしまいます。
これを防ぐためにも、要件定義の役割と重要性を理解しておくことは大事です。

「タクシー配車アプリを開発する」というプロジェクトを例に出しながら考えてみます

## 要求・要件・仕様の違い
ざっくりとですが、プロジェクトを始める際には**要求・要件・仕様**の3つを考える必要があります。

### 要求とは
要求とは、**「ユーザーがサービスで実現したいこと」**です。
タクシー配車アプリでは「手軽に近くのタクシーを呼びたい」など。
ニーズとウォンツのような話だと、ニーズ(=目的)ということになります。

### 要件とは
要件とは、**「どのようなサービスを開発するか」**です。
例では「現在地から近いタクシーを探せる」「目的地の位置情報をマップで入力できる」など。
ニーズとウォンツでは、ウォンツ(=手段)ということになります。

### 仕様とは
仕様とは、**「サービスの制約や実現手段」**です。
例では「GPSで位置情報を取得、3km以内のタクシーを対象とする」「検索時のレスポンスは2秒以内」など。

## 要件定義の役割とは
要件定義とは、その名の通り上記で言う「要件」を定義するものです (要求や詳細な仕様を決めることも含めて要件定義と言う場合もあります)。

要件定義の役割とは、**「ビジネスサイドとエンジニアサイドの橋渡し」**になります。
![Untitled Diagram.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/196629/335431d0-afa7-ed68-48e8-b3a93ad23195.png)

よく次のようなことが起きます
「プロダクトオーナーが、開発中のサービスで〇〇をやりたいと言って、それを口頭で聞いたエンジニアが上手い具合に解釈して実装した」
これでは、後々に仕様変更で苦しむ未来が見えますね…

本来、プロダクトオーナー(ビジネスサイドの人間)のやるべきことは、**サービスで実現したい事とビジネス上のKPIやKGIを設定し、そこに責任を持つこと**です。
つまり、要件が要求を満たしていることについて合意が取れれば、それより下の工程について関わる必要はありません。

そして、開発チーム(エンジニアサイドの人間)のやるべきことは、**サービスに必要な要件を元に、詳細な仕様やアーキテクチャを決め、それの実装に責任を持つこと**です。
テストを書く時も、仕様及び要件さえ満たせていればいいので「ユーザーが実現したいことは…」などと悩む時間は必要ないはずです。
そもそもビジネスサイドとの合意が取れているので、要件さえ満たしていればリリース可能と言うことになります。

この**両者の認識を擦り合わせて、合意を取るための行為が「要件定義」**となります。
このようにレイヤーをしっかり区別することで、各ステークホルダの責務を明確にすることができます。


要件定義でしっかり要件を明文化しておくことで、テストを書いたりレビューをする際も要件定義書を参照することで悩む必要が無くなります。
チームメンバーの能力とリソースを最大限に生かして、生産性の高いハッピーな開発🍻を行うためにも要件定義はしっかりやりましょう！！


要件定義フレームワークの例でRDRAというものを紹介しています
[「リレーションシップ駆動要件分析(RDRA)」](https://qiita.com/tatane616/items/f7f4e5ad818fe8b125d6)
RSpec + SimpleCov で計測したカバレッジレポートをGitlab Pagesにホスティングする

# RSpec + SimpleCov で計測したカバレッジレポートをGitlab Pagesにホスティングする

## やること

- [simplecov](https://github.com/colszowka/simplecov)で、[rspec](https://github.com/rspec/rspec) で実行したテストのカバレッジレポートを出力する
- 出力したカバレッジレポートをGitlab Pagesにホスティングする
- 以下のようにプロジェクトにバッジを表示し、一目でカバレッジが分かるようにする
<img width="500" alt="スクリーンショット 2019-05-17 22.38.04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202164/34474cfe-7567-9035-1f54-f595d31733cb.png">

## 手順

### rspecとsimplecovを導入する

すでに導入済みの場合は、適宜飛ばしてください。

#### gemをインストール

```ruby:Gemfile
gem 'rspec'
gem 'simplecov'
```
```
$ bundle install
```

#### `spec_helper.rb` に`simplecov`を読み込む設定を追記

```ruby:spec_helper.rb
require 'simplecov'
SimpleCov.start
```

### `.gitlab-ci.yml` に`pages`ジョブを追加

`pages`ジョブを追加します。
基本的には以下のような流れになります。

```yaml:.gitlab-ci.yml
image: ruby:2.6

before_script:
  - bundle install

pages:
  stage: deploy
  script:
    - bundle exec rspec
    - mv coverage public
  coverage: '/\(\d+.\d+\%\) covered/'
  artifacts:
    paths:
      - public
  only:
    - master
```

Gitlab Pagesではpublicディレクトリの内容をホスティングしますが、
Railsの場合はpublicフォルダを使用しているかと思うので、`coverage`を`public`に移動する前に、
以下のようにpublicディレクトリを避けるとよいと思います。

```yaml:.gitlab-ci.yml
  script:
    - bundle exec rspec
    - mv public .public # publicディレクトリを避ける
    - mv coverage public
```

以下行はあっても無くてもよいと思いますが、書いておくと、
ジョブの出力結果のサイドバーにカバレッジが表示されるようになるみたいです。

```yaml:.gitlab-ci.yml
  coverage: '/\(\d+.\d+\%\) covered/' # Job出力結果から正規表現でカバレッジを取得する
```

<img width="293" alt="スクリーンショット 2019-05-17 22.59.27.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202164/39fcf52b-260f-93d9-913b-df71e8eff8e0.png">

### 頑張ってテスト書く :innocent: 

### commit & push :tada:

### バッジ表示の設定

#### テストカバレッジ解析の設定

`Settings` > `CI / CD` > `General pipelines` > `Test coverage parsing`
を開くと、`Simplecov (Ruby) `のexampleが書いてあるので、言われるがままに貼り付けて保存してみます。
※Jobの出力結果からカバレッジを拾うための正規表現です。

<img width="1156" alt="スクリーンショット 2019-05-17 23.18.43.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202164/67d83c75-5c0f-17d9-ff30-2a90101dbfa0.png">

#### プロジェクトにラベルを追加する

`Settings` > `General` > `Badges`
を開き、プロジェクトのバッジを登録します。

`Link`: バッジのリンク先（デプロイしたカバレッジレポートのURL）
`https://グループ名.gitlab.com/プロジェクト名` のようになります。
`Settings` > `Pages` で確認できます。

`Badge image URL`: バッジ画像のURL
`https://gitlab.com/グループ名/プロジェクト名/badges/ブランチ名/coverage.svg` のようになります。

<img width="1159" alt="スクリーンショット 2019-05-17 23.23.40.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202164/d3eb6348-49ab-6e47-ba6f-2dd4ce0a9c94.png">

#### ゴール :tada:

これでプロジェクトのトップページにバッジが表示されるようになります！
バッジをクリックすると、カバレッジレポートが表示されます。
便利 :relaxed:

<img width="500" alt="スクリーンショット 2019-05-17 22.38.04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202164/34474cfe-7567-9035-1f54-f595d31733cb.png">

一度設定すれば`master`にマージするたびにテストが自動実行されてカバレッジレポートが残るため、とても便利に使っています！
目に見える場所に数値があると、テストを書くのが楽しくなります:blush:

最後までお読みいただき、ありがとうございました。

### サンプルプロジェクト

サンプルプロジェクトを以下に置いておきますので、ご参考までに。。
https://gitlab.com/kazenomachi/coverage_sample
ASP.NET coreでConoHaDB(mariaDB)を操作する。

## 前提条件  
ConoHaDBでデータベースを作成済み  
ASP.NET core アプリケーションのプロジェクトをVisual Studioで作成済み

# 準備
## EF Core ツールのインストール
データベースのスキャフォールディングに利用します。  
NuGetから最新版をダウンロードしてください。  
[__Microsoft.EntityFrameworkCore.Tools__](https://www.nuget.org/packages/Microsoft.EntityFrameworkCore.Tools/)

## データベースプロバイダーのインストール  
ConoHaDBではmariaDBが採用されています。  
なので、プロバイダーには [__Pomelo.EntityFrameworkCore.MySql__](https://www.nuget.org/packages/Pomelo.EntityFrameworkCore.MySql/) を使用することにします。  
NuGetパッケージマネージャーから最新版をインストールして下さい。  

# スキャフォールディング
## ConoHaDBの設定
まずConoHaの方でアクセス用ユーザーの作成をします。  
ユーザー情報は「__一般ユーザー__」、接続許可ホストは __%__ にしてください。 

データベース名、接続ポート, ホスト名のグローバルネットワークの値をメモしておいて下さい。

## VisualStudio側の作業
ツール -> NuGetパッケージマネージャ -> パッケージマネージャコンソール を起動してください。
コンソールで次のコマンド  

```
Scaffold-DbContext "Server={グローバルネットワークの値},{ポート番号};Database={データベース名};User={ユーザー名};Password={パスワード};" "Pomelo.EntityFrameworkCore.MySql"
``` 
を入力してEnter。  
しばらくすると、モデルクラスが作成されます。

# データベースにアクセスしてみる
なんちゃらdatabaseContextクラスを利用します。このクラスはIDisposableインターフェースを実装しているので、usingステートメントが使えます。

例:Userデータを保存するデータベースの場合  

## データ追加
```csharp:add_sample
using (var database = new HogedatabaseContext())
{
    await database.User.AddAsync(new User());
    await database.SaveChangesAsync();
}
```

## 変更
```csharp:change_sample
using (var database = new HogedatabaseContext())
{
    User currentData = database.User.First();

    if(currentData != null){
        currentData.Data = new User();
        await database.SaveChangesAsync();
    }
}
```

## 削除
```csharp:remove_sample
using (var database = new HogedatabaseContext())
{
    User currentData = database.User.First();

    if(currentData != null){
        database.User.Remove(currentData);
        await database.SaveChangesAsync();
    }
}
```

***
## 参考資料
[既存のデータベースを使用した ASP.NET Core での EF Core の概要](https://docs.microsoft.com/ja-jp/ef/core/get-started/aspnetcore/existing-db)  
[Pomelo.EntityFrameworkCore.MySql](https://github.com/PomeloFoundation/Pomelo.EntityFrameworkCore.MySql)  
["EF Core ツール リファレンス (パッケージ マネージャー コンソール) - EF Core](https://docs.microsoft.com/ja-jp/ef/core/miscellaneous/cli/powershell#scaffold-dbcontext)
VirutalBoxの時刻を修正するスクリプト

現場ではVirutalBoxを立ち上げて開発を行っておりますが、時間が経つとホストマシンの時刻とズレてしまいます。
その際に瞬時に修正するスクリプトです。
※現場の先輩エンジニアからいただいたスクリプトです。

```bash
#!/bin/bash

sudo date -s "$(curl -s --head http://google.com | grep ^Date: | sed 's/Date: //g')"
```
【決定木学習モデル】Pythonのscikit-learn使て、アヤメ（iris）データセットを分類

自分のブログの記事で、ここも投稿します。
ブログの方が読みやすいと思います。

site: http://kura.gq/machine-learning/decision-tree-python-sklearn/133/05/

課題の目的
Pythonのscikit-learn使て、決定⽊学習モデルを実行します。具体的には、決定⽊学習モデルを習って、デモのアヤメ（iris）データセットを分類して、結果を表示します。

解説 
アイリス（iris）データセットとは
アイリスのデータセットはよく知られたデータセットです。sklearnパッケージの中には、このデータセットがあります。「¥sklearn¥datasets¥data¥iris.csv」で見つけました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/351977/286b44ba-9506-79e2-cccf-a82cbec6664b.png)


このデータセットには、データポイントが150個で、各データポイントには4つの変数があります。AからDまでは、ガクの長さ、ガクの幅、花弁の長さ、花弁の幅ということです。Eは花の種類で、この中で、0はsetosa、1はversicolor、2はvirginicaです。

scikit-learnの機能
scikit-learn のDecisionTreeClassifierは、決定⽊学習モデル使て、データセットに対して分類できるクラスです。 入力は「n_samples、n_features」を使用して、「n_samples」はトレーニングサンプルで、「n_features」はクラスラベルです。

例の実装
環境構築
Python3の中に、scikit-learnをインストールします。結果の可視化のため、Graphvizをインストールします。

具体的には、Graphvizはここに(https://graphviz.gitlab.io/download/)ダウンロードして、インストールします。

そして、パッケージのscikit-learn、Graphviz、pydotplusをインストールします。pycharmの場合は、ここまではいいです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/351977/8ad97a15-af1f-d0d6-c265-319f94327093.png)


パケージをロード
``` 
from sklearn.datasets import load_iris
from sklearn import tree
import pydotplus
import os
os.environ["PATH"] += os.pathsep + 'C:¥Program Files(x86)¥Graphviz2.38¥bin¥'
``` 
アイリスのデータを読み込み、決定⽊学習モデルを使用してモデルを習って取得します。
``` 
iris = load_iris()
clf = tree.DecisionTreeClassifier().fit(iris.data, iris.target)
``` 
モデルをドットファイルiris.dotに保存します。
``` 
with open("iris.dot", 'w') as f:
    f = tree.export_graphviz(clf, out_file=f)
``` 
結果の可視化
``` 
dot_data = tree.export_graphviz(clf, out_file=None)
graph = pydotplus.graph_from_dot_data(dot_data)
graph.write_pdf("iris.pdf")
``` 
結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/351977/20a1285f-4469-b0d7-382d-369af658f115.png)


結果の解説：

X[0]からX[3]までは、ガクの長さ、ガクの幅、花弁の長さ、花弁の幅です。sampleは、このノード上のデータポイントの数です。valueは、このノード上のデータポイントの種類です。例えば、[0, 47, 1]とは、setosaは0個、versicolorは47個、virginicaは1個です。

決定木の意味は、次の例で説明されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/351977/8a329aa4-25af-c264-66b4-dd72345f0868.png)


データポイント一つにとって、もし：
花弁の長さ　＜＝　2.45　は　False、
そして、花弁の幅      ＜＝　1.75　は　False、
そして、花弁の長さ   ＜＝　4.85　は　True、
そして、ガクの幅      ＜＝　3.10　は　True、
このデータポイントはvirginicaです。
今更ながら Ruby on Rails Tutorial をやってみた (その13)

## この記事について…

普段はRuby on Railsと無縁なプログラマなんですが、今更ながら**面白そう**という単純な理由から[**Ruby on Rails Tutorial**](https://railstutorial.jp/)をやってみようと思い立ちました。今回は[前回の記事](https://qiita.com/hideki0145/items/97a85e2ded3cd5918ff8)の続きで第13章をやっていきます。
尚、Rails 5.1に対応した第4版を用いて、かつHyper-V上にインストールしたUbuntu 18.04の環境で進めていきます。

## 第13章 ユーザーのマイクロポスト

この章ではユーザーが短いメッセージを投稿できるよう、マイクロポスト機能を追加します。更に章の終盤では短いメッセージだけではなく画像も添付できるように改修します。

### CarrierWaveでアップロードしたファイルの保存先を変えるには

```ruby:app/uploaders/picture_uploader.rb
  .
  .
  # アップロードファイルの保存先ディレクトリは上書き可能
  # 下記はデフォルトの保存先  
  def store_dir
    "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
  end
  .
  .
```

チュートリアル中の上記メソッド定義によってアップロードファイルの保存先ディレクトリを指定していますが、
このディレクトリは`public/`以下に生成されたと思います。

例えば`public/uploads/...`ではなく`uploads/...`ディレクトリにファイルを保存したい場合、`CarrierWave.configure`の値を次のようなファイルを新規作成することで変更する必要があります。

```ruby:config/initializers/carrierwave.rb
CarrierWave.configure do |config|
  config.root = Rails.root
end
```

この設定の後、railsを再起動してアップロード処理を行うと`uploads/...`にファイルがアップロードされることが確認できると思います。

しかし、これだけではマイクロポストフィードに正しく画像は表示されません。
`public/`以下に生成していた時と違い、Rails.root以下に生成した場合は読み取り権限が与えられていない為です。

そこで、`AttachmentsController`を新規に作成して正しく読み取りできるようにしてみます。

```ruby:app/controllers/attachments_controller.rb
class AttachmentsController < ApplicationController
  def show
    full_path = "#{Rails.root}#{params[:path]}"
    image = File.binread(full_path)
    send_data image, disposition: 'inline'
  end
end
```

```ruby:config/routes.rb
Rails.application.routes.draw do
  .
  .
  .
  get 'attachments/show'
end
```

```erb:app/views/microposts/_micropost.html.erb
  .
  .
  <span class="content">
    <%= micropost.content %>
    <%= image_tag url_for(controller: :attachments,
      action: :show,
      path: micropost.picture.url) if micropost.picture? %>
  </span>
  .
  .
```

これで、`public/`以下に生成しなくても大丈夫です。
また、`AttachmentsController`を改修すれば、特定の条件を満たす場合のみ読み取り権限を与える等の機能を実装することもできます。

> 参考
> CarrierWaveでUploaderごとに保存するディレクトリを変える
> https://qiita.com/shuyuhey/items/92721e2fb6573d946a8c
> Rails 3.2 で CarrierWave を使う時に public 以下にファイルを置きたくない場合
> https://spitfire-tree.hatenadiary.org/entry/20120127/1327660951


それでは、次回 第14章から再開したいと思います。
minitestからRSpecへテストコードを変換した

## まとめ

https://github.com/kinushu/minitest_to_rspec
使って
mt2rspec --rails source_file [target_file]
実行。
ただ手作業での変換もどうしても必要です。

## やったこと

minitestでテスト書かれていたプロジェクト、RSpecの仕組み使いたいところもでてきたため、
えいやっとRSpecに変更しようと思い、
他にやっている人おられるか探してみたけどそんなに情報がなさそう…

GitHub を漁ると、おお
https://github.com/jaredbeck/minitest_to_rspec
いいではないですか。（もうメンテされてなさそうだけど、しょうがない）

```
# test/**/*_test.rb 
# それぞれに
mt2rspec --rails source_file [target_file]
# を適用していきます。
```

日本語がUTF-8のコードポイントのテキストになってしまう現象あったため、

```Ruby
UTF8_SYMBOL = 'utf-8'.freeze
UTF8_CODEPOINT_REG = /\\u([0-9a-fA-F]{4})/i
UTF8_CODEPOINT_REG2 = %r<\\u{([0-9a-fA-F]{4})}>

def convert_utf_codep_to_original_text(tgt_s)
  reg = UTF8_CODEPOINT_REG
  res = tgt_s.gsub(reg) { |s| s.match(reg)[1].to_i(16).chr(UTF8_SYMBOL) }

  reg = UTF8_CODEPOINT_REG2
  res = res.gsub(reg) { |s| s.match(reg)[1].to_i(16).chr(UTF8_SYMBOL) }

  return res
end
```
な感じで変換していく。

また、matcherが対応していないもので、対応できそうなところはforkして対応してみました。
https://github.com/kinushu/minitest_to_rspec
assert_not, assert_not_nil の対応を追記しました。

でも自動変換できないところはまだあるので、もう手動で書き換えしました。
C-First(RL78/G14)でμT-Kernel2.0を動かしてみる

■はじめに
リアルタイムOSのμT-Kernel 2.0に興味を持つと、最初の開発環境の候補はIoT-Engine開発キットになりますが、20万円の価格ですと、個人ではなかなか手が出しにくいです。

次の候補のマイコンボードの「C-First」は、Cプログラミング教科書が付いて、8,640円とだいぶハードルが下がります。
C-Firstには、ルネサス製のRL78/G14のCPUとLED,スイッチ,温度センサ,照度センサ,加速度センサなどが実装されており,μT-Kernel 2.0を初めて試してみるには手頃な環境です。

C-Firstを触ってみた時の手順について、忘備録代わりにまとめます。

■モノの入手

◇「基板付きキット 絵解きマイコンCプログラミング教科書」を購入し、マイコンのC-Firstを入手する
https://www.amazon.co.jp/dp/4789845273/

・C-First単品も購入できますが、C-Firstのハードウェア仕様も書かれている、Cプログラミング教科書も一緒に購入することを強くお勧めします。
　例えば、入出力モード指定用の「ポート・モード・レジスタ」や入出力データを読み書き用の「ポート・レジスタ」の、メモリマップ上のアドレスなどの情報が記載されているためです。
　なお、教員・学生は発売元のCQ出版より、アカデミック価格(8,640円→5,400円)で入手できるようです。
https://shop.cqpub.co.jp/hanbai/books/45/45271/45271-1.pdf

◇C-First用のμT-Kernelのソースコードをダウンロードする
http://www.tron.org/download/

・「RL78(C-First)対応μT-Kernel2.0」を選択する
・「ボックスに入れる」ボタンを押す
・「申請手続き開始」ボタンを押す
・「新規のお客様」で必要事項を記入しアカウントを入手する
・アカウントでログインする
・ライセンスに同意し、利用目的のチェックを入れる。
・「続ける」の先の画面でダウンロードを実施する。
・ダウンロードしたソースコード(zipファイル)を任意のフォルダに展開する


◇統合開発環境 (IAR Embedded Workbench)の評価版を入手する
注: 以下、IAR Embedded Workbenchを

https://www.iar.com/jp/iar-embedded-workbench/#!?architecture=RL78

・「RL78無償評価版をダウンロードする」を選択
・「ダウンロード」を選択
・ダウンロードしたインストーラのexeファイルを実行する
・「IAR Embedded Workbench Renesas RL78用のインストール」を選択する
・インストール後に、「IAR Embedded Workbench」を起動する
・初回のライセンス画面で、［IAR システムズに登録し
て評価用ライセンスを入手］を選択し、インターネット経由で評価用ライセンスのオンライン登録をする
・登録アドレスに以下の題名のメールが届く
登録確認のお願い： IAR Embedded Workbench for Renesas RL78, 16K KickStart Edition, v. 4.10
・メール本文のURLをクリックすると、「ライセンス番号」が表示されるので、ライセンス画面に入力する


■ 開発環境の準備
◇C-Firstと開発用PCの接続
・「基板付きキット 絵解きマイコンCプログラミング教科書」に含まれるC-Firstのマイコンと開発用のPCを付属のUSBケーブルで繋ぐ。C-FirstのPOWERのオレンジのLEDが光ることを確認する

■ μT-Kernel2.0のビルド
・ダウンロードしたμT-Kernel2.0のzipファイルを展開したフォルダに移動する
・展開したzipの中のEWRL78\utkernel_source\ide\ewの下のC_First.ewwをダブルクリックして、「IAR Embedded Workbench」を起動する
・「プロジェクト」メニューの「ダウンロードしてデバック」を選択するかCtrl-Dを押してビルド(メイク)を開始する

・もしビルド中に以下の「致命的なエラー」が出力された場合は、C-First本体のSW3とSW4の両方のスイッチを、右のVCOM側から左のOCD側に動かしてから、Ctrl-Dでビルドを再実行する
　「致命的なエラー: CPU@@@@@@@@@@@@@.@@@B
Communication error. Check your hardware configuration.
  You might also select 'Erase flash before next ID check' in the Hardware Setup dialog box.」

注：　SW3とSW4のスイッチの操作については、ソースコードのzipファイルの中のRL78(C-First)対応μT-Kernel2.0取扱説明書(EWRL78).pdfに記載されていることがあとからわかったが、エラーメッセージでググっても見つからないので注意。

・「デバック」メニューの「実行」の選択またはF5キーを押すとサンプルプログラム(※)が実行され、LED0が点滅する
  ※: kernel\usermain\usermain_sample.c
・「デバック」メニューの「ブレーク」を選択すると、サンプルプログラムが停止する

■周辺機能レジスタの定義
・周辺レジスタ(例えばLED0のポートレジスタの"P1")は、ior5f104.le.hのヘッダファイルに定義されている。
・「ファイル」画面のusermain_sample.cの前の"+"をクリックして"-"に開くと、インクルードしているヘッダファイルの一覧が開かれる。
・ior5f104le.hをダブルクリックで参照画面を開き、Ctrl-Fで検索ダイアログを表示し、例えば"P1"で検索を続けると、定義がみつかる。
Vue.jsのcomputedな変数がリアクティブじゃなかった時の話

#はじめに
まだまだVue.jsの修行中ですが、もうホントのホントに初心者だった頃、vueファイル内のgetter関数([算出プロパティ](https://jp.vuejs.org/v2/guide/computed.html))がうまく機能しなくて悩んだ時の解決方法です。

console.log()などにエラーを吐いてくれたら原因を辿れるのですが、これはエラーが出なかったので四苦八苦していました。

#結論
リアクティブに動作してほしい変数は、初期化しておきましょう
（storeにあろうが、localにあろうが関係なし）

#getter関数が動かないよ・・・

ステート保存された変数をvueファイルから読み出す時、次のように書くと思います。
（Vue.js + JavaScriptにおける`computed`（算出プロパティ）に相当するものが、TypeScriptの場合は次のように`get`で書けますね）

```{hoge.vue}
<script lang="ts">
  ...
  get storedIds(): number[] {
    return this.$store.state.hoge.ids
  }
</script>
```

で、上のように書いた時、hogeステート内の変数idsに変更があった場合に、対応するvueファイルにも即座に反映されてリアクティブに描画させたいな、と思っていました。

が、実際には動作しません。

リアクティブに動かないどころが、うんともすんとも言いません。
おまけに、consoleにもエラーが出てこないので原因がわからずに困っていました。

##初期化を
上の例ではstore内の変数を、getter関数を介してvueファイル内で使用するところを書いていますが、これはstoreとは関係なく、例えば次のようにvueファイル内で完結していても同じです。

```{hogehoge.vue}
<template lang="ts">
  <div>{{ val2 }}</div>
  <input type="number" v-model="val1">
</template>

<script>
  ...
  val1!: number; // <- 初期化されていない

  get val2(): number {
    return this.val1 * 2;
  }
</script>
```
　
この例で、次のようにすれば`val1`や`val2`はリアクティブになり、`input`から操作できるようになります。

```{hogehoge.vue}
<script lang="ts">
  ...
  val1: number = 1
  ...
</script>
```
　

最初に初期化しなくても、ライフサイクルフック内で初期化されても問題ありません。

```{hogehoge.vue}
<script lang="ts">
  ...
  val1!: number; // <- 初期化されていない

  created() {
    this.val1 = 1;
  }
  ...
</script>
```
#ということで
とにかく初期化さえされていればgetter関数でリアクティブに動作するので、ここだけ気をつけましょう。

単純な話でしたね。でも、単純なほど初心者にとっては（中級者以上にとっても？）デバッグが難しいこともまた事実かもしれません。

私の場合、getter関数内で参照していた変数がstore内にあった（別のファイルにあった）ので気づくのが遅くなってしまいました。

　

GitHubのスター数が伸び盛りのVue.jsで、しかもTypeScriptを使ってフロントをいじるようになりました。
JSと違ってTSの場合、ググってもドキュメントが少ないので気になることがあれば記事にして残していこうと思います。

以上、記念すべき **Qiita初投稿** でした！
今後とも、よろしくお願いします！！
20190517 Ques No.13

# Outline
第13回 Ques が「アップデート時における品質活動」のテーマで行われました。
今回、楽天が発表する機会を頂き、「Struggles and challenges in STLC」というタイトルで発表しました

<IMG SRC="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267085/e33e87cb-bc5c-e72f-9bb8-2850a6c830d8.png" width=80%>

登壇者
　藤原　 　QA Manager
　Sonal　　Test Analyst
　江村　　  Test Automation

Ques portal
https://quesqa.com/

Ques event entry
https://techplay.jp/event/726076

<A HREF="https://www.slideshare.net/SadaakiEmura/struggles-and-challenges-in-stlc-in-ques-no13/SadaakiEmura/struggles-and-challenges-in-stlc-in-ques-no13"><IMG SRC="https://image.slidesharecdn.com/20190517ques13rakuten-190517074445/95/slide-1-1024.jpg" width=80%></A>


# Out Presentation Topic

## 短納期のプロジェクトのSTLC (Software Testing Life Cycle)において２つの課題
・よく仕様変更が発生
・テスト自動化でカバーする期間的困難

## Struggle 1 
よく仕様変更が発生するプロジェクトに対してのsolutionとしてRTM (Requirement Traceability matrix)を用いている
これは基本的に仕様とテストケースを紐づけるツール

<IMG SRC="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267085/592455c5-f8c8-4dba-3fb3-fa23cfc46557.png" Width=80%>

RTMの大きなメリットとして
・仕様が変更しても、どのテストケースに影響があるか可視化できる
・仕様に対してどのテストケースが漏れているかが可視化できる

これにより、１－２週間のSTLCにおいても仕様変更が発生する場合でもカバーしている

## Struggle 2
テスト自動化を１－２週間のSTLCに対応するには大きく３つ困難がある

・自動化は変更がよく入る部分は向かないというが、そこを対象にしなければならない
・自動化のコーディングは、テスト環境が整ってからなので、期間が短い
・期間とリソースの問題

この条件でどのようにしたか？

マニュアルと自動化のレスポンシビリティを明確化し、リグレッションテストの適用範囲をさだめたこと。

■マニュアルテスト
・既存機能で改修の入った部分、新規機能をすべてカバーする
・既存機能で改修の入ってない部分はカバーしない

■自動化テスト
・既存機能で改修の入った部分を期間内に改修し、GREENになるように対応する
・既存機能で改修の入ってない部分は、これまで通りリグレッションテストする（とくに作業発生しない）
・新規機能に関してはpriorityを低くし、このプロジェクト期間に対応を目指さない。次回以降のリグレッションテストとして考える

<IMG SRC="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267085/899cf0ee-9623-2916-c9d6-fa1265cbd117.png" width=80%>

このやりかたによって、マニュアル、自動化テストの最適化により短い期間のプロジェクトを遅れることなく対応するようにしている



<IMG SRC="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267085/ec785ee5-688a-7283-1945-8500592cff5e.png" width=80%>

※発表者とぱんだは関係ありませんｗ


# update 6/3
Quesにて、レポートが上がってました。
こちらもぜひ見てください
https://quesqa.com/ques13-report/
Pythonでリコール情報をスクレイピングしてmongoDBに保存

#概要
PythonのライブラリBeautifulsoupを使ってリコール情報をスクレイピング。
・スクレイピング対象サイト
　消費者庁リコール情報サイト　[https://www.recall.caa.go.jp/](https://www.recall.caa.go.jp/)
このページのから特定メーカーの家電に関するリコール情報をスクレイピングしてmongoDBに保存する。

#最初に確認
サイトの利用規約ページを確認してスクレイピングしても問題が無いかを確認。
[消費者庁リコール情報サイト　このサイトについて](https://www.recall.caa.go.jp/about/)
>当ウェブサイトで公開している情報（以下「コンテンツ」といいます。）は、どなたでも以下の １）～６）に従って、複製、公衆送信、翻訳・変形等の翻案等、自由に利用できます。商用利用も可能です。

大丈夫そう。
#ライブラリのインポート
必要なライブラリをインポート。

```python
import requests
from bs4 import BeautifulSoup
from pymongo import MongoClient
```


#ページ件数をスクレイピング
今回のページでは家電カテゴリを選択すると`https://www.recall.caa.go.jp/result/index.php`というphpに`screenkbn=01&category=2`とパラメータが渡された。このページのhtmlからページの全件数をスクレイピングして取得する。

```python
url_get = "https://www.recall.caa.go.jp/result/index.php?screenkbn=01&category=2"
html = requests.get(url_get)
bsObj = BeautifulSoup(html.text,"html.parser")
for link in bsObj.findAll("p"):
    text = str(link.get_text())
    if "件中" in text:
        page = text.split("件中")[0]
```

#特定メーカーの情報をスクレイピング
今回は特定メーカーの情報のみ欲しいので、下記URLで特定メーカーの名前で検索。
[https://www.recall.caa.go.jp/result/index.php?screenkbn=01&category=2](https://www.recall.caa.go.jp/result/index.php?screenkbn=01&category=2)
しかし、表示されるURLは`https://www.recall.caa.go.jp/result/index.php`で、正しいhtmlが取得できない。パラメータはPOSTされているみたい。
そこでChromeデベロッパーツールで中身を確認し、POSTして無事にhtmlを取得。
あとは欲しい情報が含まれるタグをみつけてスクレイピングしてmongoDBに保存する形式に整形する。

```python
url_post = "https://www.recall.caa.go.jp/result/index.php"
payload = {'search':'特定メーカーの名前', 'category':'2','screenkbn':'01','viewCountdden':page}
html = requests.post(url_post, data=payload)
bsObj = BeautifulSoup(html.text,"html.parser")
for link in bsObj.findAll("tr"):
    i = 0
    title = ""
    publicationDate = ""
    startDate = ""
    url = ""
    # tdタグ
    for link_info in link.findAll("td"):
        a = link_info.findAll("a")
        link = str(link_info.findAll("p"))
        link_array = link.split("\"")
        # URLの取得
        if len(link_array) > 1:
            url = "https://www.recall.caa.go.jp" + link_array[1]
        text = link_info.get_text()
        # 件名の取得
        if i == 2:
            title = str(text)
        # 掲載日の取得
        if i == 3:
            publicationDate = text
        # 対応開始日の取得
        if i == 4:
            startDate = text
        i += 1
    # mongoDBに保存する形式に整形
    data = {"title":title, "publicationDate":publicationDate, "startDate":startDate, "url":url}
    save_data(data)
```
#mongoDBに保存
PymongoでデータをローカルのmongoDBに保存。

```python
def save_data(data):
    client = MongoClient('localhost', 27017)
    db = client.db
    co = db.recall_info
    co.insert(data)
```

#参考文献
Beaurifulsoupについての記事
[https://qiita.com/itkr/items/513318a9b5b92bd56185]
(https://qiita.com/itkr/items/513318a9b5b92bd56185)
ChromeデべロッパーツールでPOSTされたデータの中身を確認する方法
[https://www.tsukimi.net/chrome-developer-tools_post.html](https://www.tsukimi.net/chrome-developer-tools_post.html)
PyMongo - MongoDB API
[https://api.mongodb.com/python/current/](https://api.mongodb.com/python/current/)
[Heroku] We're sorry, but something went wrong, Completed 500 Internal Server Error, ActiveRecord::StatementInvalid


#前提
Rails5.2
Heroku

####Herokuで「We're sorry, but something went wrong」が発生。

# エラーの内容

Heroku openして、ログインした後、投稿ページに遷移しようとすると、
下記のエラーが発生。
#### 「We're sorry, but something went wrong」

$ heroku logs

でエラー内容チェックすると、下記の内容が表示された。
```Processing by ListingsController#new as
User Load (1.4ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT $2  [["id", 1], ["LIMIT", 1]]
Completed 500 Internal Server Error in 147ms (ActiveRecord: 37.2ms)
ActiveRecord::StatementInvalid (PG::UndefinedTable: ERROR:  relation "clips" does not exist..........```

#エラーの説明

```Completed 500 Internal Server Error in...```
＝＞ 内部でエラーが発生している。コードの記述方法に問題がありそう。。。
＝＞ このエラーの**前に記載されているログ**に問題がある！
```Processing by ListingsController#new...```
＝＞ Listings ControllerのNEWアクションに問題がありそう。。。

#エラーの原因であるコード


```app/controllers/listings_controllers.rb
  def new
    @listing = current_user.listings.new
  end
```

#解決策
```app/controllers/listings_controllers.rb
  def new
    @listing = current_user
    @listing = Listing.new
  end
```

#参考URL
https://qiita.com/bSRATulen2N90kL/items/42d8cff51e2927a4ef94
Itermの設定

vimの設定の覚書。

# .vimrc
vimの先駆者たちから設定を拝借しました。

以下の記事を参照 
https://qiita.com/morikooooo/items/9fd41bcd8d1ce9170301 
http://mimaken.hatenablog.com/entry/2016/12/19/105721 


```vim:~/.vimrc
" setting
"文字コードをUFT-8に設定
set fenc=utf-8
" バックアップファイルを作らない
set nobackup
" スワップファイルを作らない
set noswapfile
" 編集中のファイルが変更されたら自動で読み直す
set autoread
" バッファが編集中でもその他のファイルを開けるように
set hidden
" 入力中のコマンドをステータスに表示する
set showcmd


" 見た目系
" 行番号を表示
set number
" 現在の行を強調表示
set cursorline
" 現在の行を強調表示（縦）
set cursorcolumn
" 行末の1文字先までカーソルを移動できるように
set virtualedit=onemore
" インデントはスマートインデント
set smartindent
" ビープ音を可視化
set visualbell
" 括弧入力時の対応する括弧を表示
set showmatch
" ステータスラインを常に表示
set laststatus=2
" コマンドラインの補完
set wildmode=list:longest
" 折り返し時に表示行単位での移動できるようにする
nnoremap j gj
nnoremap k gk
" シンタックスハイライトの有効化
syntax enable


" Tab系
" 不可視文字を可視化(タブが「▸-」と表示される)
set list listchars=tab:\▸\-
" Tab文字を半角スペースにする
set expandtab
" 行頭以外のTab文字の表示幅（スペースいくつ分）
set tabstop=2
" 行頭でのTab文字の表示幅
set shiftwidth=2


" 検索系
" 検索文字列が小文字の場合は大文字小文字を区別なく検索する
set ignorecase
" 検索文字列に大文字が含まれている場合は区別して検索する
set smartcase
" 検索文字列入力時に順次対象文字列にヒットさせる
set incsearch
" 検索時に最後まで行ったら最初に戻る
set wrapscan
" 検索語をハイライト表示
set hlsearch
" ESC連打でハイライト解除
nmap <Esc><Esc> :nohlsearch<CR><Esc>
```

# カラースキーム(Iceberg)の設定
githubからファイルを取得して指定のフォルダへ保存。

```terminal:
$ mkdir -p ~/.vim/colors
$ git clone https://github.com/cocopon/iceberg.vim
$ mv ~/iceberg.vim/colors/iceberg.vim  ~/.vim/colors
```

vimの設定ファイルにカラースキームの設定を記述

```vim:~/.vimrc
syntax on
colorscheme iceberg
```

以上で見易いvimライフが送れます。
【快適】MacのスクショのプレビューをOFFにする方法

## 【快適】MacのスクショのプレビューをOFFにする方法
macOS Mojaveでスクリーンショット撮ったとき右下に滞留する仕様がありますが、これはOFFにすることが出来ます。
プログラミングの状況を誰かと共有するときや、作業メモ代わりにスクショをすることはよくありますよね。

1: Command + Shift + 5

2: 下のパネルから「オプション」をクリック
 
3: 「フローティングサムネールを表示」のチェックを外す

これで出来ます。

参考
https://twitter.com/hajipion/status/1127419397373456384

## 終わりに
私は現在、Web3のサービスの開発をしています。詳しくはこちらの記事をご覧下さい。
        [無料でイーサリアムが当たる、Web3時代の寄付サイトを作った話](https://note.com/kenroda/n/n814347fbdcd7)
【Docker】プロセスの状態がExit１でコンテナ内へSSH接続ができない時に改善した方法

# はじめに
私がDockerで初めて作業した時につまずいた事象なので、共有させていただきます。
また、詳しい障害切り分けができていません。
初心者のため間違い等ございましたらアドバイス等よろしくお願いいたします。

# Dcckerコンテナ内での作業をしようとすると
```shell
$ docker-compose up -d
$ docker-compose exec <サービス名> bash
```
本来であれば、上記のコマンドで正常にコンテナ内へSSH接続できて作業できるはず。
しかし、SSH接続が急に終わってしまい接続できない状況。
とりあえず、実行中のプロセスを確認することにしました。

```shell
$ docker-compose ps
        Name              Command            State          
----------------------------------------------------------
pompom_mysql_1       docker-entrypoint.sh      Up      
                     mysqld                                    
pompom_pompom_1      prehook bundle install    Exit 1      
                     -j3 ...                                                 
pompom_redis_1       docker-entrypoint.sh      Up      
                     redis ...                   
```

ん？本来Stateが「UP」になるところが「Exit 1」となっている！
どうやらこのサービスが上手く動いていないことが原因のようです。
より詳しい原因切り分けのため、
`docker-compose logs` で`pompom_1`に該当するエラーを探してみたが分からない状態に（汗
最終手段として、一度ボリュームを綺麗に掃除して立ち上げて見てみることに。

```shell
#コンテナのサービスを停止・イメージやボリュームを削除
$ docker-compose down
#不要ボリューム等の一括削除
#docker system pruneではボリュームまでは削除してくれない
$ docker system prune --volumes
#起動前にイメージを構築してから、コンテナを作成し起動する
$ docker-compose up --build         
```
しばらく構築処理が実行されるのを待ち、
再びSSH接続を試みると全て「UP」の状態になりました。

```shell
$ docker-compose ps
        Name              Command            State          
----------------------------------------------------------
pompom_mysql_1       docker-entrypoint.sh      Up      
                     mysqld                                    
pompom_pompom_1      prehook bundle install    Up      
                     -j3 ...                                                 
pompom_redis_1       docker-entrypoint.sh      Up      
                     redis ...                   
```

# 結論
今までできていたDockerの処理に不具合が発生した場合は、
`docker-compose ps`や`docker-compose logs`で障害切り分けをしてみる。
私の場合、調べても障害の原因・切り分けができなかったため、
とりあえずという感覚で（本当はいけない行為だと思います）
最終手段としてボリュームを削除して再構築してみて、現象改善しました。
ボリュームの圧迫や何かの動作がキッカケでコケていたのだと考えます。
また、`Dockerfile.dev`等に修正点があるのかもしれません。
これからも、修正するべき点を探していきます。
同じような障害で作業が止まっている方の解決につながればと思います。
[Linux] tar とは？

# はじめに
基本的なもの、よく使うものだけまとめました。

#tarとは・・・？
Linuxのコマンドで、アーカイブファイルを作成、展開するためのもです。
ソースからPHPやRuby、Apacheなどをインストールする際に使います。

#アーカイブファイルとは？
複数のファイルを一つにまとめたもので、ファイルをまとめて保存したり、配布する際に用いるファイルです。

#主な使い方
gzip式でファイルを、XXXX.tgzに圧縮。

```
tar -czvf XXXX.tgz ファイル
```
|オプション | 内容 |
|:-----------|------------:|:------------:|
| -c    |      ファイルを作成 |    
|-z    |   gzipで圧縮 |      |
| -v  |   詳しく出力  |       |
| -f  |   ファイル名を指定 |       |


gzipファイル（XXXX.tgz）を展開

```
tar -xzvf XXXX.tgz 
```

|オプション | 内容 |
|:-----------|------------:|:------------:|
| -x  |      ファイルを展開|    
|-z    |   gzipで圧縮 |      |
| -v  |   詳しく出力  |       |
| -f  |   ファイル名を指定 |       |


#参考

[【 tar 】コマンド――アーカイブファイルを作成する／展開する](https://www.atmarkit.co.jp/ait/articles/1608/15/news015.html)
[tarコマンドについて詳しくまとめました 【Linuxコマンド集】](https://eng-entrance.com/linux-command-tar)
Linuxコマンドの出力結果が長すぎて見出しが流れる場合の対処法

たとえば

```bash
ps -ef
```

とか

```bash
netstat -anp
```
とかやると出力が多すぎて、`| grep ~`とか使ってみたい情報だけ抽出するんだけど、
そうすると先頭行が消えてしまい、どの列が何を表しているのかわからなくなってしまうことがよくある。（新人ゆえ）

そんなとき、とりあえず出力が大量に出てギョッとしない方法を知ったので、備忘録として残す。

# | less する

たとえば

``` bash
ps -ef | less
```
とか

``` bash
netstat -anp | less
```

とかやると出力がページャで表示されるのでとても見やすい。
`| grep ~`で抽出してたのは、forward slash → / 使って検索すればよい。