OmniAICreator/Qiita-1.07M huggingface dataset:
Railsで前後の日付間の値の増減を抽出して保存する


## 要件
サーバ種別と台数が保存されたテーブルがもともとあった。で、日付の前後で差分があった場合のみ抜き出して別テーブルに入れておきたい。

## 使うモデル
以下のカラムを持つ`ServerCount`モデルを元に

|ServerCountモデル|サーバの台数を保持|
|---|---|
|server_type|サーバ種別（AppとかDBとか）|
|server_count|種別ごとのサーバの台数|
|created_at|Railsデフォルト。ここから日付ごとのサーバ台数がわかる|

| ServerIncrementモデル|サーバの増減を保持するモデル|
|---|---|
|server_type|サーバ種別（AppとかDBとか）|
|from_number|増減前のサーバの台数|
|to_number|増減後のサーバ台数|
|from_date|増減前の日付|
|to_date|増減後の日付|

```ruby:こんな感じで書いた
server_counts = ServerCount.all.order(created_at: :desc)
server_counts.each_cons(2) do |server| 
  next unless (server[0].server_count - server[1].server_count) != 0
  next unless server[0].server_type.eql? server[1].server_type
  ServerIncrement.find_or_create_by(
    server_type: server[0].server_type,
    from_number: server[0].server_count,
    to_number: server[1].server_count,
    from_date: server[0].created_at,
    to_date: server[1].created_at
  )
end
```

## 流れ
`each_cons`メソッドで２つずつレコードを抜き出して前後の値を比較して`0以外であり、かつ前後のサーバ種別が同じ`という条件をつける（これがないと違った種別のサーバ台数も比較してしまう）
そこから`find_or_created_byメソッド`で登録されていない場合のみレコード作成

# もっといいやり方があればコメントください！
scala MultiProjectでの直列テスト実行

久しぶりにscalaを書いてtest時のエラーが発生。
testを２回やると失敗する事が発生したのだけどよくあるパターン


## build.sbtのprojectのクラスの並列テスト実行抑制
```scala
parallelExecution in Test := false // DBの関係で今はfalseに
```

これは知ってたのだけど、現在作りかけのサンプルでMultiProjectで
DBアクセスをするとProject毎には↑を設定してもProject単位では並列でエラーになった。

## build.sbtのproject毎の並列テスト実行抑制
```scala
concurrentRestrictions in Global := Seq(Tags.limitAll(1))
```

ただこれMultiだとすべて直列になっちゃうのでテスト時間が増えちゃいます。

ただとりあえず今は！！ってなのでメモがてら投稿

ちなみに
- java11
- sbt1.2.8
最新とかそういうので発生してるかも知れないので記載
情報処理安全確保支援士 平成30年春 午後2問1

#設問1
**(1) 脆弱性の有無によってサーバからのレスポンスに違いがないから**
DOM型XSSの場合"#"以降の文字列はサーバに送信されません。
そのため、**サーバから見るとリクエスト、レスポンスの内容を見ても正規なのか、攻撃なのか判断ができません。**
レスポンスが返ってきたタイミングでブラウザに入っているJavascript等を利用して攻撃用スクリプトを実行します。

**(2) スクリプトを分析し、フラグメント識別子の値の変化による挙動を確認する。**
反射型XSSは攻撃スクリプトを含むデータを対象のWebに入力し、その結果、Webサイトに脆弱性があるかどうかを確認する。
しかし、DOM型XSSの場合、レスポンスに含まれないため脆弱性の有無が判断できない。
そのため、DOM型ではWebサイトのソースコードを分析し、"#"から始まるフラグメント識別子を利用したスクリプトの存在を確認する。
その後、スクリプトの挙動を確認することで脆弱性の有無を検知します。

**(3) Rポータルが利用しているスクリプトがCookieの値を利用している場合**
HttpOnly属性を指定すると、スクリプトからサーバ(もしくはWebブラウザ等)に保存されているCookieに参照できなくなります。
(document.cookieというメソッド?に格納されたCookieの参照をしなくなる。)

#設問2
**・踏み台サーバの操作記録機能によって、ログインした利用者のデスクトップ画面、実行したコマンド、及びキーボード入力を記録する。**
R団体では共通管理者アカウントが正しく利用されていることを確認できるように**踏み台サーバ**で証跡(ログ)を取っていました。
とっているログ、機能は表3のすぐ下に記載があるため、ほぼ丸パクリして解答すればよさそうです。

#設問3
**(1) a：WebAPサーバ b：DBサーバ c:ODBC ルール：9**
WebAPサーバとDBサーバのセグメントが分かれた場合、通信を行う際にFWを経由することになります。
WebAPサーバとDBサーバの通信ではODBCというものを用いて通信を行っているため、それを許可してあげる必要があります。
さらに、運用管理PCからFWを経由したDBサーバへの通信はなくなるため、フィルタリングルール:9も不要になります。

**(2) 人事総務課の職員が踏み台サーバを経由して、DBサーバに共通管理者アカウントでログインする行為**
DBサーバへのアクセスは「システム運用課員によるログインと、WebAPサーバからの接続」だけが許可されていました。
設問3(2)より、DBサーバがサーバセグメントに移動してきています。
問題文を見ると人事課の人事データ更新について詳細に記述されています。その中に、人事異動が大量に発生する場合、踏み台サーバから人事サーバにログインし、処理を行うとあります。
表3項番3を確認するとアクセス先はすべてのサーバが対象になっているため、サーバセグメントに移動してきたDBサーバも対象になります。
また、表3にはシステム企画課や設定第1課の管理者権限でのサーバセグメントへのアクセス許可はされていないため、解答にはなりません。

**(3) 検出事項：2**
設問3(2)を踏まえて、人事総務課の職員さんが踏み台サーバ経由でDBサーバへアクセスできることが可能であることがわかりました。
追加すべき問題点は管理者用アカウントが共通であることです。
その問題を記述しているのは**検出事項：2**です。

#設問4
**(1) 制作パートナに渡すCCIの数**
事前に確認する事項で、「e」の次には機密性の話をしているのでそれ以外で考えます。
図7はコンテナ方式について事細かに記載がありますが、CCIを必要な分だけ渡すと、フワッと書いてあります。
コンテナ方式は1度インストールしてしまえば他PCでの利用はできません(インストール自体は複数PCでも可能)
そのため、渡す数をはっきり決めておかないと不正利用につながる可能性も考えられます。

**(2) CCをインストールしたPCを協力者宛てに輸送**
これは解答を読んでも疑問が残ります。
パソコンを海外の協力者に輸送できるのならインストールしてしまう前に、CCIのメディアを輸送してしまえばいいような気がします。
これはちょっと確認中です。

**(3) DRMサーバへの通信を制作パートナのグローバルIPアドレスからだけに制限する。**
FWで行えるのはIPアドレス、ポート番号による制御くらいでWAFのようにパケットの中身を確認することはできません。
(ものによると思いますが・・・）
そのため、送信元IPアドレスが制作パートナのグローバルIPアドレスのみアクセス可能になるよう制御を掛けることがFWでできる対策だと考えられます。
GOで後出しじゃんけん

#初めに

業務でGoを使うことになったので勉強がてら作ってみた。

正直中身はごみです（笑）

自分の勉強のモチベにつながるんで適当に上げています。

#作ったもの

じゃんけんが出来るてきなやつ。

相手といい感じにじゃんけんしたかったけどうまくできる気がしなかったので後出しじゃんけんを作った。

自分が出したものに必ず勝つ選択肢をCPUが出す。


#コード

コードの全体像はこんな感じ


```go
package main

import "fmt"

func main() {
	fmt.Println("Game Start")

	RPS := [...]string{"Rock", "Paper", "Scissors"}
	var your_choice string
	var cpu_choice string
	var exit string

	for {
		start()
		fmt.Scan(&your_choice)

		if contains(RPS, your_choice) {
			fmt.Println("You Selected :", your_choice)
		} else {
			fmt.Println("Please Enter Valid Choice")
			continue
		}

		cpu_choice = win_pose(your_choice)
		fmt.Printf("CPU Selected : %v\n", cpu_choice)
		fmt.Println("CPU WIN")

		fmt.Println("Exit? enter(yes/no)")
		fmt.Scan(&exit)
		if exit == "yes" {
			break
		} else if exit == "no" {
			continue
		} else {
			fmt.Println("please enter yes or no")
		}
	}
}

func win_pose(choice string) string {
	var number int
	RPS := [...]string{"Rock", "Paper", "Scissors"}
	for i := 0; i < 3; i++ {
		if RPS[i] == choice {
			number = i
			break
		}
	}
	if number >= 2 {
		number = -1
	}
	return RPS[number+1]
}

func start() {
	fmt.Println("Select Your Choice")
	fmt.Println("1: Rock, 2: Paper, 3: Scissors")
}

func contains(s [3]string, e string) bool {
	for _, v := range s {
		if e == v {
			return true
		}
	}
	return false
}

```


#fmt.Scan()

fmt.Scan()でコンソールから打った文字を取得できます。

```
var str string 
fmt.Scan(&str)
```

とするとstrにいい感じに代入？されます。

#func contains()

どうやらGoには配列のなかに要素が含まれているか検証する関数が用意されていないようなので自分で作るしかないそうです。


http://gawawa124.hatenablog.com/entry/2015/04/08/193237

この記事を参考に

```go 
        if contains(RPS, your_choice) {
			fmt.Println("You Selected :", your_choice)
		} else {
			fmt.Println("Please Enter Valid Choice")
			continue
		}
```

この様にして指定された文字以外が入力されたら繰り返し入力画面に行くようにしました。


#おわりに

正直rubyと全くちがうのでとてもやりずらいですが慣れるまで頑張りたいと思います。
About vvvv.js / 環境構築

#What is vvvvjs?
・vvvvの皮を被った、なんか別物。笑
・node.js上で動いています。
・開発途上ではあるが、アップデートが少しずつされている。
・vvvvと挙動が異なるところも、多々ある。
・Onclickとか、ButtonのHTMLでつかえるものが多々ある
・___vvvvとちがってWindows Onlyじゃないよーーーー！___

#何ができるの？
vimeoの動画をぜひご覧ください！
https://vimeo.com/255544587
<img width="741" alt="スクリーンショット 2019-03-12 21.23.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/37495/651f12ec-35e5-d5fb-6665-1bfa30c59020.png">

#vvvv.jsの良いところ、悪いところ
###Good↑
・vvvvを習得したままwebへ考え方を移行できる
・ユーザーがめちゃくちゃ少ない。
　Developper コミュニティ：35人…。
　→ But…開発者は、すごく優しい！！
![image_preview.jpeg](https://qiita-image-store.s3.amazonaws.com/0/37495/5b186a29-4d5f-e4e3-8077-5860b136277b.jpeg)

###Bad↓
・情報が本当にない（公式のチュートリアルすら途中になっている。）
・ヘルプパッチがない

#関連Website
###vvvvjs公式ホームーページ
http://vvvvjs.com/
※公式ホームページ「Try it」より、環境構築せずに使用感を試せます。

###000.graphics
vvvv.jsの開発に関わっている000.graphicsのホームーページ。
質の高いサンプルなども上がっています。
http://000.graphics/tutorial/02_VVVV.js_Introduction.html

###vvvvjs Developper Support Community
めっちゃ優しいサポートコミュニティ！
https://riot.im/app/#/room/#vvvv.js:matrix.org

#Let's Setuppppp!!!
初学者向けに丁寧に書いているので、わかる人はバシバシ飛ばしてください。
（MacOSでセットアップした内容を記載しています。同様の手順でWindows10も問題なく動いておりました。）
##各種ダウンロード
###A. FireFox
公式は、Chrome対応と書いてますが、Chromeで動かないことが多く、
僕の環境ではFirefoxが安定的に動いてます。
（mac OS Mojave 10.14.2)
https://www.mozilla.org/ja/firefox/new/

###B. node.js
公式ホームページより
10.15.1 LTS は挙動確認済み
https://nodejs.org/ja/

###C. vvvvjs パッケージ
vvvv.jsのパッケージをダウンロードします。
公式のではなく、下記リポジトリの方が失敗なくインストールできました。
https://github.com/zauner/vvvv.js

#インストール
###1.zip解凍後、適当な場所へフォルダを移動
フォルダ名に " . " が入っているとパスがうまく通らない可能性もあるのでフォルダ名を変更してください。
ex) User / vvvv_dev / vvvvjs

2.コマンドラインツールでの操作
mac：terminal
windows:コマンドプロンプト

2.terminal/コマンドプロンプトで上記フォルダへ移動 
ex)上記のフォルダで準備した場合
cd vvvv_dev
cd vvvvjs

3.vvvvjsフォルダ内で、”npm install”　コマンド入力

4.上記、エラーないかを確認
※Xcode/コマンドプロンプトが入ってなかったら、エラーがccdでる。

<img width="588" alt="スクリーンショット 2019-03-12 21.42.49.png" src="https://qiita-image-store.s3.amazonaws.com/0/37495/13d3f588-48d8-aa4a-d90c-ac9a79c47b20.png">

#動作確認1:vvvv.jsが動いているか確認
###FireFox上でvvvvjsを動かしてみる
1. terminalからcdコマンドでvvvvjsフォルダへ移動

2. “node server.js . -e” で起動
※ . -e はエディットモードでの起動という意味です。編集しない場合は、
"node server.js"でOK

<img width="539" alt="スクリーンショット 2019-03-12 21.45.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/37495/9ac118dd-23e3-abe0-faf0-f2c39cf5f230.png">


3. FireFoxにて、下記URLで動くか確認
http://localhost:5000/examples/01_canvas_arcs/
下記画像が出てればOK！！
<img width="632" alt="スクリーンショット 2019-03-12 21.48.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/37495/1e6c8330-8ef2-513c-0c40-bd8d83ca2b98.png">

#動作確認2:vvvv.jsが編集可能か確認
1. エディット用のパッチの展開
下記、URLをFireFoxで開く
localhost:5000/examples/01_canvas_arcs/#edit/example01.v4p

これは、User/vvvv_dev/vvvvjs/examples/01_canvas_arcsのフォルダ内のexample01.v4pを編集しているということになります。

2. パッチ画面でなんらか編集をする

3. ”Control + S” で保存を行う
ポップアップが出て、保存ができればOK
（MacでもControlを使います）

4.ウィンドを閉じる時は、”Command+W”
（こっちはMacはCommand+W/Winはcontorl+W）

<img width="1053" alt="スクリーンショット 2019-03-12 21.50.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/37495/d8849956-81f1-8a45-af2e-1eb3a501603d.png">

#セットアップ完了！
###Enjoy vvvv.js！！！！
基本操作などは、また別記事で！！

参考までに。
札幌市立大学クリエイティブコーディングスクールで実施したvvvv.jsワークショップの様子はこちら。
https://note.mu/junky/n/n9e40a24e7c0e
GCP で tensorflow 遊び4



[GCP で tensorflow 遊び3](https://qiita.com/makainuma/items/11180a997f5790782721)の続き

# 概要

前回は、CNNに7チャンネルの画像の統計情報を連結してみた（CNN44）。
単純に画素値の平均・標準偏差をはっつけただけだったので、もう少し調整。

## CNN45

7チャンネルの画素値の平均・標準偏差については、それぞれで足して1になるように規格化（つまり相対値）。この他に、7チャンネル全画素合算での平均・標準偏差（絶対値）も追加してみる。

## CNN46
画素値のスケーリングを変更。これまでは、7チャンネルの最小・最大を[0, 1]にmapするように変換していたが、各チャンネル毎に、平均0.5, 標準偏差 0.5/3 となるように（±3σで[0,1]の範囲を意識している）してみる。

## CNN47
CNN46 と同じだけど、[0, 1] の範囲で crop。

## CNN48
CNN47 と同じだけど、各チャンネル毎の scaling ではなく、7チャンネルの平均・標準偏差を使って scaling。

# 結果

![CNN45_1.png](https://qiita-image-store.s3.amazonaws.com/0/170148/31d0285f-bb38-0c48-a5c2-f17894d0dfb5.png)

とくにどれがうまくいったということもなく。とくに 46, 47 は考えるだけ無駄でしたみたいな結果。

それはともかく、学習の進行に対してバラツキが大きくて、こんだけ学習させたんだから大丈夫みたいなことにならなそげ

![CNN45_2.png](https://qiita-image-store.s3.amazonaws.com/0/170148/7a7b97a6-ff13-ae2b-42c7-f57d86550596.png)

傾向としては上昇方向といってしまっていいのだろうか？

精度じゃなくて高速化を弄って遊んだ方が遊べるかもしれない
PRML演習問題1.2

![1章 序論-4.jpg](https://qiita-image-store.s3.amazonaws.com/0/221435/c58bc8b8-0383-41d9-9ed7-6fa50a723476.jpeg)
![1章 序論-5.jpg](https://qiita-image-store.s3.amazonaws.com/0/221435/cc72a584-2b8d-c463-8213-0fc27d95416b.jpeg)
サービスアカウントを利用してCloud SDK ツールを使う

`gcloud auth login` せずに `gcloud` を使用する場合、サービスアカウントを利用する方法があります。

サービスアカウントのJSONファイルは `/root/your_service_account.json` にあるものとします。

```
gcloud auth activate-service-account --key-file /root/your_service_account.json
gcloud config set project your_project
```

または、

```bash
export CLOUDSDK_CONFIG=/root/.config/gcloud
mkdir -p /root/.config/gcloud/configurations
echo "[auth]" > /root/.config/gcloud/configurations/config_default
echo "credential_file_override = /root/your_service_account.json" >> /root/.config/gcloud/configurations/config_default
gcloud config set project your_project
```

参考：https://github.com/GoogleCloudPlatform/cloud-sdk-docker/issues/152#event-1933393673
created_atをキーにした検索について


```rb
range = Date.yesterday.beginning_of_day..Date.yesterday.end_of_day
User.where(created_at: range)
```

こんな感じで細かく時間指定せずとも、検索できるんだね。

参考：https://qiita.com/ryonext/items/4ed2f7635135a7b388f3
SQLのインデックスとは

特定のカラムからデータを取得する際に、テーブルの中の特定のカラムのデータを複製し検索が行いやすいようにしたものです。

例えば、あるユーザーをバイネーム（名指し）で検索したい！となった際に、Usersテーブルのnameカラムにインデックスを張ってないと、プログラムは、Userテーブルのnameカラムを***上から順にみて***、そのユーザーのデータを取得します。もし、***これが1万人もしくはそれ以上の大量のデータを含むカラムだったらどうでしょう。すごく時間がかかりますね***。

Usersテーブルのnameカラムにindexを張ることで、アルファベット順にnameを並べ替え検索しやすいようにしてくれます。

データを検索するときに、目的のデータが見つかるまで***すべての行を一行ずつ調べていくよりも、索引を利用して目的の行の場所を見つけてからその行のデータを読み取る方が効率的***だという考えにより、非常によく用いられる方法です。

⇒
####例えば、名前の最初文字の行まで一気に飛んで、その中から、上から探していくってこと、かな?


参考
https://www.techscore.com/tech/sql/15_01.html/
https://qiita.com/seiya1121/items/fb074d727c6f40a55f22
【Blender】円からメッシュに変換してチューブを作る

環境メモ

⭐️Mac OS Mojave バージョン10.14
⭐️Blender v2.79.6
⭐️Mac Book

円からメッシュに変換してチューブを作る
<img width="1128" alt="スクリーンショット 2019-02-17 20.24.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/93155/e1eb4dca-dcdf-62a7-7339-50966c1f454c.png">

<img width="599" alt="スクリーンショット 2019-02-17 20.24.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/93155/5f020ea6-8c75-f9e0-f7e5-2655263a241d.png">

<font color="Magenta">画像が多いとQiitaの容量オーバーで画像が貼り付けられなくなるので</font>
詳細は、「はてなブログ」に記載してます↓
[かぴばらさんの覚書ブログ nonkapibara](https://nonkapibara.hatenablog.com/entry/2019/03/12/213023)



これを応用して、キャラクターの口を作りました。↓↓↓↓↓↓
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">BlenderからUnityへキャラクターを取り込んで<br>❤️マテリアル🧡をいろいろ変更してみたよぉ。<br>そしてUnityで✨弾ませてみた✨<br>（=＾0＾=）ｖ<a href="https://twitter.com/hashtag/Unity?src=hash&amp;ref_src=twsrc%5Etfw">#Unity</a> <a href="https://twitter.com/hashtag/Unity3d?src=hash&amp;ref_src=twsrc%5Etfw">#Unity3d</a> <a href="https://t.co/uPNPiD19I3">pic.twitter.com/uPNPiD19I3</a></p>&mdash; non (@nonnonkapibara) <a href="https://twitter.com/nonnonkapibara/status/1094639157761036288?ref_src=twsrc%5Etfw">2019年2月10日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
XMLファイルに記述したsymbolを読み込み=>TokenListにセット。

TokenListにsymbolをセットしておくき、それをQuotesProviderとかに読み込ませて、updateで値を取得する（ような感じ）


まず、簡単なxmlファイル

```sourceSymbol.xml
<root>
	<symbol>
		<name>7203-TS</name>
	</symbol>
	<symbol>
		<name>8798-TS</name>
	</symbol>
	<symbol>
		<name>4431-TS</name>
	</symbol>
	<symbol>
		<name>7048-TS</name>
	</symbol>
	<symbol>
		<name>7049-TS</name>
	</symbol>
	<symbol>
		<name>4293-JQ</name>
	</symbol>
</root>
```

で、これを読み込む関数ファイル

```$$getStringFromXML
using elsystem.xml;		//xml
using tsdata.common;	//TokenList
input:FILE_URL(string);

var:
	xmlDocument Doc(null),
	xmlElement root(null), 
	xmlnodelist xmlList(null), 
	bool filefound(true) , 
	int n(0), 
	TokenList tList(null),
	string ret("");

tList = TokenList.Create();
Doc = xmlDocument.Create();
filefound = true;

Try
	Doc.Load(FILE_URL);
catch(elsystem.io.FileNotFoundException ex)
	filefound = false;
end;
	
if filefound then begin

	root = doc.DocumentElement;
	xmlList = root.GetElementsByTagName("symbol");

end;

for n = 0 to xmlList.Count - 1 begin
	tList.add(xmlList.ItemOf[n].Item["name"].innertext);
end;

ret = tList.ToString();

$$getStringFromXML = ret;


```
Firestoreのインデックス除外設定は意味がある

Firestoreでデータゴリゴリ作ってたらこんなエラーが出ましたよ。

    too many builtin index entries for entity

インデックス作りすぎってこと？一つのドキュメントに大量にデータを登録するというテストを行なっていたのだが、ドキュメントは一つなのでインデックスは増えないと思うんだけどなあ。と思っていましたがどうやらマップの中のフィールドにもインデックスが自動で作成されるもよう。すごい。でもそのせいで制限に引っ掛かる。すごい迷惑。

具体的には以下のようなドキュメントがあった場合、nameやcreatedだけではなく、users[key].idにもusers[key].nameにもusers[key].birthdayにもusers[key].profileにもインデックスが作成されているということ。

```
{
    "name": "qiita",
    "created": "2019-03-11 20:37:10"
    "users": {
        "user01": {
            id: "user01",
            name: "yuiken",
            birthday: "1970-01-01 00:00:00",
            profile: "すごいけどすごい迷惑"
        },
        "user02": {},
        "user03": {},
        ,,,//たくさんあるということにする
    }
}
```

なのでusersの中が1000件とかあるとインデックスは1000 x フィールド数になってインデックス多すぎエラーが出てしまう。具体的な上限の数字はわかりませんが今回のテストでは2300 x 8ぐらいで上記のエラーが出ました。

Firebaseのコンソールでインデックスの除外設定が出来るので、usersのフィールド毎に設定します。上記のドキュメントがthreadコレクションにあるとしてusers[key].idのインデックスを設定するには下記のように入力します。

![スクリーンショット 2019-03-12 20.41.47.png](https://qiita-image-store.s3.amazonaws.com/0/164374/108a2297-5d36-abe2-2114-1d034542b608.png)

これでインデックス多すぎ制限を回避できました。よかったよかった。

これドキュメントあたったわけではなくて、テストしてみたらこういう結果だったという話なので、根拠はこの記事を書いた時の私の体験談のみ。あと、もちろんインデックス削除したら他にもいろいろ影響出ますのでよく考えてからどうぞ。以上よろしく！
Vue.jsとAnime.jsで数値アニメーション

#概要
数字がだんだん増える演出をVue.jsとAnime.jsを使用してつくった。

<p class="codepen" data-height="" data-theme-id="" data-default-tab="js,result" data-user="ymnk" data-slug-hash="qvPKYO" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid black; margin: 1em 0; padding: 1em;" data-pen-title="Vue.js Count Animation">
  <span>See the Pen <a href="https://codepen.io/ymnk/pen/qvPKYO/">
  Vue.js Count Animation</a> by T_Y (<a href="https://codepen.io/ymnk">@ymnk</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>


#説明
Anime.jsを使えば、オブジェクトの値に対してアニメーションをつけることができる。
https://animejs.com/documentation/#JSobject

Vue.jsでは実際の数値データ（num）と表示用の数値データ（count）を設定した。
変化の流れは以下の感じで。

1.numが変化
2.numをwatchで監視
3.countをアニメーション

filterでカンマの有無を切り替えたのはおまけ。
プログラミング学習記録24〜休眼日〜

##今日やったこと
- Progate HTML&CSS（初級編、中級編、上級編）そのまま復習

今日もちょっと目が疲れていたので、Progateのみです。

そのまま復習では全部で20分ぐらいで復習できるようになりました。

Udemyの講座で修羅場を超えたことにより、だいぶProgateが楽に感じるようになりました。
<br>
そして、今日は合間にしっかり寝たので、だいぶ目が回復しました。

プログラミング学習を進めるにあたって、目は一番大事なデバイスです。

しっかりとブルーライト対策、定期的な休憩で目を大事に学習を進めたいと思います。

もう少し暖かくなったら、外でプログラミングしてみるのもいいかもしれません。

明日からはまた本腰を入れて、学習を進めていきたいと思います。

おわり
AmazonLinux2 -bash: warning: setlocale: LC_TIME: cannot change locale (en_US.UTF-8): No such file or directoryの対応

# 概要

概要のエラーが発生した際の対象法を残したいと思います
詳しいエラーは下記になります

```
-bash: warning: setlocale: LC_TIME: cannot change locale (en_US.UTF-8): No such file or directory
-bash: warning: setlocale: LC_ALL: cannot change locale (en_US.UTF-8): No such file or directory
-bash: warning: setlocale: LC_CTYPE: cannot change locale (en_US.UTF-8): No such file or directory
```

# 原因

Ansible経由で`yum update`実行時に原因不明の接続断により、SSH接続する際に上記のようなエラーが表示されるようになった
後述にありますが、言語ファイルそのものが消えた
根本的な原因は不明です・・・

# やったこと

1. Qiita[CentOS7 LC_CTYPE: cannot change locale (UTF-8): No such file or directory](https://qiita.com/Kaisyou/items/9c2c5f5e1b28c24e91b7)を参考に環境変数を設定してみたが改善できず
2. `localectl set-locale LANG=en_US.utf8`を実行しても改善できず
3. `locale -a` を実行したところ以下のようにそもそも言語ファイルない！

    ```shell
    > locale -a

    locale: Cannot set LC_CTYPE to default locale: No such file or directory
    locale: Cannot set LC_MESSAGES to default locale: No such file or directory
    locale: Cannot set LC_COLLATE to default locale: No such file or directory
    C
    C.utf8
    POSIX
    ```
4. `/usr/lib/locale/locale-archive`がない！

## 解決法

ちょうど同じ種類のインスタンス（AmazonLinux2）があったので、言語ファイル`/usr/lib/locale/locale-archive`を転送して対応した

```
# 再度locale -aしてみる
> locale -a

aa_DJ
aa_DJ.iso88591
aa_DJ.utf8
aa_ER
aa_ER@saaho
aa_ER.utf8
aa_ER.utf8@saaho
aa_ET
aa_ET.utf8
af_ZA
af_ZA.iso88591
af_ZA.utf8
agr_PE
agr_PE.utf8
ak_GH
ak_GH.utf8
am_ET
am_ET.utf8
an_ES
an_ES.iso885915
an_ES.utf8
anp_IN
anp_IN.utf8
ar_AE
ar_AE.iso88596
ar_AE.utf8
ar_BH
~~省略~~
```

今回は言語ファイルを転送して対応したが、localdefコマンドで生成することで対応も可能なのか？
初心者がロリポップサーバにComposerをインストールしてcomposer -Vできるようにする

Laravelで遊ぶことにはまっています。
せっかくなのでロリポップのサーバを借りて、公開できるようにしたいなと思いました。

# Composerのインストール

[lolipopサーバで「Composer」をインストールする](http://www.plusair.jp/lolipop%E3%82%B5%E3%83%BC%E3%83%90%E3%81%A7%E3%80%8Ccomposer%E3%80%8D%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B/)
こちらの素敵な記事を参考にし、Composerをインストールをしました。
`php composer.phar composer -V`
コマンドにてバージョンの確認を行えるようになりました。

# 詰まった所
毎回打つのが大変！！
`composer`コマンドのみでシンプルに実行できるようにしたい！
しかし、パスの通し方がわからず、悪銭苦闘しました。

# パスを通すために考えた方法
```
$ export -p
...(省略)...
PATH=/usr/local/bin:/bin:/usr/bin:/PATH/TO/HOGE:/PATH/TO/HOGE:/PATH/TO/HOGE
```
現在パスが通っているディレクトリは、上記の通りということがわかりました。そこで、
`mv composer.phar /usr/local/bin `
`/usr/local/bin` 階層に、ファイルを移動させることにしました。

# 問題点
```
$ mv composer.phar /usr/local/bin 
mv: cannot create regular file `/usr/local/bin/composer.phar': Permission denied
```
ロリポップのサーバはroot権限がないため、実行できないのだそうです。

# 解決方法
新しくディレクトリを作成し、その中にファイルを移動させることにしました。

```
$ mkdir bin
$ export PATH=$PATH:bin
$ mv composer.phar bin
$ mv composer.phar composer
```
これで実行できるようになりました。

最後の最後まで、ファイル名を変更しないで実行してできないできないって唸っていました。
そりゃできませんね・・・笑
もくもく会場やtwitter上で教えてくださった皆様、本当にありがとうございました！

# 最後に
```
$ vi ~/.bash_profile
```
```ruby:~/.bash_profile
export PATH=$PATH:bin
```
```
$ source ~/.bash_profile
```
後でこれをやろうと思って忘れていました。
キリが良いところまで一気にやるのは本当に大事ですね・・・。
Twitter OAuth認証のCallBack時のエラー対応

運営サイトに初めてSNSログイン認証機能を実装しました。プラットフォームで実績のあるライブラリーを利用し、公式情報やネット参考情報を理解して構築しましたが、エラー解消までかなりの時間を要したので、その対処についてシェアします。

※いろいろ疑いましたが、正直、知見不足によるミスでした。。。

#構築中のウェブサービス
 「投票クイズメーカー SantaQ」https://www.santaq.com
　誰でも簡単に投票やクイズが作成できるコミュニケーションツールです。
  ログインなしでも基本機能が利用できますが、ログインするといろいろな便利機能が使えます。
  今回の記事はこのログイン機能の部分です。

#状況
・https://developer.twitter.com にてアプリを作成。
・ローカルの開発環境でcallbackurlを設定して開発。
・callbackは呼ばれるが認証失敗。

#原因分析
 ネットの様々な(玉石混交の)対処法に関する記事を参考に手を打ってみたがエラー解消に至らず(かなりの時間を浪費・・・)。
 ライブラリーのコードをトレースした結果、callback後のsessionがおかしいことが判明。
 なにげに昔から設定していたサーバサイドのsession設定のSameSite属性が原因だった。
 (参考：https://www.owasp.org/index.php/SameSite)

#対策
 SameSiteが'strict'だとcallback後のcookieが設定されないので、GETメソッドではセットされる'lax'を指定。
 この設定でうそのようにすんなり認証できるようになった。

#所感
 「OAuth認証、エラー」関連のネット情報ではSameSite属性での対処の記事は見つからなかった。初歩的すぎるんだろうけど。同じ状況の人の参考になれば幸いです。

以上です。
PyDevエディタの既定設定を調整してタブ内に表示されるファイル名をシンプルに表示する（パスを消す）

Djangoアプリケーションの開発にPyDevを使っていて何の不満もない（むしろ期待以上）だが、既定の設定でおかしなものがあったので修正。

# 問題の設定

それぞれのアプリケーションの models.py を開いた場合に、既定だと以下のような表示になる。カッコ内は親ディレクトリの物理フルパスが表示されていて無駄に長い。肝心の「どのアプリのmodels？」は識別できない。

![](https://i.gyazo.com/7f39faa10fc12ce46802ac68561d1be1.png)

# 改善

最初に設定変更した結果。期待どおり。

![](https://i.gyazo.com/4475c81068e33c06b8b0aef664778587.png)

設定箇所は ```Windowメニュー -> Preferences -> PyDev -> Editor -> Editor caption/icon``` で **Show as regular module** か **Show as regular module...**を選択する。

![](https://i.gyazo.com/68a05c9c4c0c529cced17cc41efb4e49.png)

ちなみにDjangoのアプリケーションはプロジェクトディレクトリに存在しなくてもよいので、それを考慮して「親ディレクトリ」を表示しているのかなと思われます。
No.045【Python】作業ディレクトリの取得および変更

![python-logo-master-v3-TM-flattened.png](https://qiita-image-store.s3.amazonaws.com/0/336067/8fb9f6aa-57f7-dc4b-b4bf-a648969d315c.png)

####今回は、作業ディレクトリの取得・変更ついて書いていきます。
I'll write about acquiring and changing current directories


###■ 作業ディレクトリの取得・確認
&emsp;To acquire and check current directories

     os.getcwd():作業ディレクトリの絶対パスを文字列として返す

```
>>> import os
>>> 
>>> path = os.getcwd()
>>> 
>>> print(path)
/Users/hauts5124/Documents
>>> 
>>> print(type(path))
<class 'str'>
>>> 
>>> # getcwd：get current working directoryの略
```

###■ 作業ディレクトリを変更: os.chdir()
&emsp;Change current directories

```
os.chdir()：作業ディレクトリを変更可能
引数に移動先パスを指定。絶対パス、相対パス双方可能
上の階層への移動は " ../ "
```

```
>>> os.chdir("../")
>>> 
>>> print(os.getcwd())
/Users/hauts5124
>>> 
>>> # chdir: chenge directoryの略
```

随時に更新していきますので、<br>定期的な購読をよろしくお願いします。
I'll update my article at all times.
So, please subscribe my articles from now on.

本記事について、<br>何か要望等ありましたら、気軽にメッセージをください！
If you have some requests, please leave some messages! by You-Tarin
障害をへらすための３つの戦略

## 概要

障害をへらすための方法は多数ありますが、
それを３つに分類してみました。

- 監視
- 自動テスト
- 冗長化

アプリケーション寄りかインフラ寄りかという軸を用意して、マトリックスにしました。
障害をへらすための既存の様々な手法をこれで分類できると思います。

<img width="667" alt="screenshot 2019-03-12 19.07.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/115870/558b1638-9936-e067-f639-8a697463a8a5.png">

これらをバランスよくブレンドすると低コストで障害を減らせると思います。

## 監視

監視は、デプロイ後かつ障害発生前に、少し未来の障害発生率の予測することで、対応の猶予を得る方法です。

## 自動テスト

自動テストは、デプロイ前に、デプロイ後の障害発生率の予測をすることで、対応の猶予を得る方法です。

## 冗長化

冗長化は、障害の原因が発生してもすぐ障害につながらないようにすることで、対応の猶予を得る方法です。
Python 3.8 では空dictが小さくなる

Python 3.7 では {} で作った空 dict よりも、 dict.clear() で作った空 dict の方が省メモリでした。

```
>>> import sys
>>> d = {}
>>> sys.getsizeof(d)
240
>>> d.clear()
>>> sys.getsizeof(d)
72
```

これは dict オブジェクトを新規作成するときに最小サイズのハッシュテーブルを確保し初期化するのに対して、 dict.clear() は shared key dict の仕組みを使って空 dict 専用の共有テーブル（書き込み禁止）を利用しているからです。

空の dict の数は無視できないくらいにはあるので、Python 3.8 で新規に dict オブジェクトを作るときも dict.clear() の結果と同じ共有領域を使うようにしました。

https://github.com/python/cpython/pull/1080

```
>>> import sys
>>> sys.getsizeof({})
64
```

なお Python 3.7 の dict.clear() のときよりも8バイト小さくなっていますが、これは GC ヘッダを削減した効果で、これも私の功績です（ドヤ）。
参照: https://speakerdeck.com/methane/compact-gc-head

さて、パッチ自体はすごくシンプルなんですが、もちろんコミットするのは簡単ではありません。新規オブジェクトを作ったあとすぐに要素を挿入するケースも多くあり、その場合は最初から専有の、要素を追加できる状態の領域を持っていたほうが高速です。

そのため [python/peformance](https://github.com/python/performance) というベンチマークスイートを実行し、性能が悪化しているベンチマークがあったら Linux の perf を駆使してそれが他の環境要因なのか今回の変更によるものなのかどうかを確認するといった地道な作業を裏でしています。
プログラミング学習 記録 Ruby メソッド

##setup

```ruby:setup.rb
def setup
  @foo = foo
end
```

**setup**メソッドは「**テスト実行時に自動的に読み込まれるメソッド**」である


#to_proc
Procオブジェクト、**to_proc**メソッドだが、理解が深まった。
まずprocオブジェクトを使うには引数の前に**&**を付けるのは知っていたが、理屈がわからなかった
例えばこれ

```
['foo', 'bar'].map(&:upcase)   #=> ["FOO", "BAR"]
```
この**(&:)**は単なる省略かなぁと思っていたが、背景には理屈があるらしい
Procオブジェクトは**シンボル(:)**にも適用されるが、上記の(&:upcase)はシンボル**(:upcase)**に対して**to_proc**メソッドが呼ばれ、
(:upcase)がProcオブジェクトに変換 -> (map)に渡される　

##余談
Proc.newとラムダ
ラムダは通常Proc.newに比べ引数の数の指定が厳しい

```
lambda_proc = -> (a,b) { a + b }
lambda_proc(20)       #=> エラー
lambda_proc(10,20,30) #=> エラー
lambda_proc(10,20)    #=> 30
```
embulk note

# S3 incremental

```yaml
in:
  type: s3
  bucket: [bucket]
  path_prefix: [prefix]
  ...
  incremental: true
  parser:
    ...
```

```shell
# 1st, diff.yaml empty file
embulk run hoge.yaml -c diff.yaml
# after ran, embulk write last_path to diff.yaml.
embulk run hoge.yaml -c diff.yaml 
# -o is will be deprecated option
```

# Out Postgres
https://github.com/embulk/embulk-output-jdbc/tree/master/embulk-output-postgresql
## truncate table before load
`before_load: [SQL]` ? 
mode: `truncate_insert` issued `delete from xxx` You can find it in logger-stdout.

# filter
## Column
https://github.com/sonots/embulk-filter-column

##
React.FC 型を拡張する

[雰囲気で使わない @types/react](https://qiita.com/Takepepe/items/0bbe4ab6ff4858a4e186) の続編です。自分もそうなのですが、多くのプロジェクトで styled-components が利用されているかと思います。この時、お決まりの様に `Props`型に `className?: string` を差し込んでいました。

```tsx
import * as React from 'react'

type Props = {
  className?: string
  label: string
  onClick: (props?: React.MouseEvent<HTMLButtonElement, MouseEvent>) => void
}

const View: React.FC<Props> = props => (
  <p className={props.className}>
    <button onClick={props.onClick}>{props.label}</button>
  </p>
)

export default styled(View)`
background-color: #f00;
`
```

これを省略するために、掲題の通り、`React.FC`型を拡張します。拡張といっても、別の型を用意して、declare module に新しい型を追加するだけです。まずは、`React.FC`型の元定義を確認。

```@types/react/index.d.ts
type FC<P = {}> = FunctionComponent<P>;
```

プロジェクトの任意の場所に、以下の通り定義を追加します。型名称は何でも良いのですが、`FCX`型とします。Intersection Types で `{ className?: string }` を注入します。

```src/type.ts
import * as React from 'react'
declare module 'react' {
  type FCX<P = {}> = FunctionComponent<P & { className?: string }>
}
```

## FCX型を使う

module の型定義に追加しているため、`React.FCX` で参照できます。これで、冗長な `className?: string` 宣言を省略できる様になりました :tada: 

```tsx
import * as React from 'react'

type Props = {
  label: string
  onClick: (props?: React.MouseEvent<HTMLButtonElement, MouseEvent>) => void
}

const View: React.FCX<Props> = props => (
  <p className={props.className}> {/* No Error! */}
    <button onClick={props.onClick}>{props.label}</button>
  </p>
)

export default styled(View)`
background-color: #f00;
`
```
GASを使ってConfluenceの記事を自動作成ーその１

#ConfluenceをGASを使って自動化してみてた～テンプレート情報取得
個人的にConfluenceで毎回MTGの議事録を作るのがめんどくさかったので、自動化することにしました。
定期的に議事録が作られて、MTG議事録のURLが返ってきたらうれしいなということで、

##やりたいこと
- ConfluenceからMTGのテンプレートの情報を取得
- テンプレート情報を使用して、新しいMTG議事録を作成し、URLを返す
- SlackへURLを通知する

##事前に準備するもの
- Googleのアカウント
- Confluence
  - グローバルテンプレートの準備
  - テンプレートID等を事前に準備しておく

##参考情報
Confluenceの開発者向け情報
https://developer.atlassian.com/cloud/confluence/rest/#api-template-page-get


### ①テンプレートの情報を取得する
Google spreadsheetに以下コードを記載する。

```javascript

//APIのベースURLを設定する
var API_BASE_URL = 'https://***.atlassian.net/wiki';

//tempaleteの情報を取得する
//templateの読み込み
function getTemplate(templateId){
   //アクセスするAPIのURLを設定する
  var api_url       = API_BASE_URL + '/rest/api/template/' + templateId;
  var response      = UrlFetchApp.fetch(api_url).getContentText('UTF-8')
  Logger.log(response);
//(1)
  var response_str  = JSON.stringify(response);
  var content_json  = JSON.parse(response_str);
  var body          = JSON.parse(content_json).body;
  Logger.log(body.storage.value);
  return body.storage.value; //(2)
}
```
このコードを実行すると、下図のようなレスポンスが返ってくる

```json

 {
    "templateId":"テンプレートのID",
    "name":"Meeting notes",
    "description":"",
    "labels":[],
    "templateType":"page",
    "body":
        {"storage":
            {"value":"<at:declarations /><ul><li><p><span>Tempalte</span></p></li>"}
         }
   }

```

(1)以降の処理は、responseからvalueの取り出しを行う処理。
(2)でのログの中身を確認してみると、以下のように表示される。

```
  <at:declarations /><ul><li><p><span>Template</span></p></li>
```
これで、テンプレート情報の取得の完了。次以降、この得られた情報を使う。

その２に続く～
任意の文字列を含むファイルを探す方法

# 背景
「文言変更しといて〜〜」みたいな依頼の時に、該当の文言を変更する機会が多い。
が、該当のファイルを見つけるための方法を毎回調べているので記載しようと思う。

# 目的
以下の2パターンに置いて該当のファイルを探し出せるコマンドを知ること。

1.ファイル名に任意の文言を含むケース
2.ファイルの中身に任意の文言を含むケース

# 1.ファイル名に任意の文言を含むケース

```
$ find {検索対象フォルダのパス} -type f -name "*{検索したい文字列}*"
```

# 2.ファイルの中身に任意の文言を含むケース

```
$ grep "{検索したい文字列}" -rl {検索対象フォルダのパス}
```
Pythonからb-PACでラベルを印刷する

#概要

+ b-PAC 
    + Brother製ラベルプリンタ用のSDK(COMコンポーネント)
    + 公式の対応プログラムは以下の通り
        + Visual C++
        + Visual Basic
        + VB Script(WSH)
        + VB Script(for IE)
        + Visual Basic .NET
        + Visual C#

公式で対応していなかったがPythonから印刷を試みる

#環境

+ windows10 Home
+ Python3(32bit) *後述
+ b-PAC SDK Ver.3.1/3.2(32bit版) *後述
+ ラベルプリンタ(TD4000)

#基本

PyWin32からCOMコンポーネントを叩く

```python
import win32com.client
doc = win32com.client.Dispatch('bpac.Document')
doc.Open(r"/your/directory/path/template.lbx")
doc.GetObject('object_name').text = 'python'

doc.StartPrint('hoge', 0x0)
doc.PrintOut(1, 0x0)
doc.EndPrint
```

0x0は公式のAPIリファレンスを見れば分かりますが，bpoDefaultです。

#ハマったところ
versionとbitの組み合わせでハマりました

#####公式注意書き

>1) b-PAC 3.1以降の“32bit版”か“64bit版”かの選択については、利用されるアプリケーションの≪稼働 bit版≫と合わせてください。
　Winodws OSが“64bit版”でも、アプリケーションが“64bit版”ではないケースがある為、ご注意ください。

>≪例 ≫ Windows 10：64bit版のOS環境で、Microsoft Excel を利用アプリケーションとする場合、下記の組合せになります。
>　　A) Excelが“32bit版”の場合　⇒　b-PACは“32bit版”
>　　B) Excelが“64bit版”の場合　⇒　b-PACは“64bit版”

これを読んで，当初Python3(64bit) + b-PAC(64bit)の環境を構築

しかし，印刷ができない(エラーコード : 11 0x0000000B - -  現在指定されている プリンターには対応していない )

?????? 

ラベルプリンタの対応表を見てみる

|  | b-PAC SDK Ver.3.1/3.2 (32bit版) | b-PAC SDK Ver.3.1/3.2 (64bit版) |
|:-:|:-:|:-:|
| TD-4100N  | ○  | -  |
| TD-4000  | ○  |  - |
| TD-2130N/2130NSA	  | ○  | ○ |


あーーー，ラベルプリンタがそもそも64bit版に対応していなかった

環境を再構築。

Python3(32bit) + b-PAC(32bit)

Pythonの32bitはcondaで構築 
[参考](https://qiita.com/flowphantom/items/940db2ec8327e2c48cb0)

これで無事Pythonからb-PACを用いてラベルプリンタで印刷することができました
openpyxlでセル幅を自動設定する

# Introduction

以下のような実験データファイル(test.xlsx)があるとします。

![スクリーンショット 2019-03-12 17.21.38.png](https://qiita-image-store.s3.amazonaws.com/0/335400/d7a07c78-b842-3bbe-677b-fbf9e6b60242.png)

開いてみると、4行D列目やE列目全体が、セルに収まりきらずに表示できていない部分があります。データの数がこれだけなら手作業でセルの幅を広げてもよいですが、一気に設定してしまいたいという気にもなりますね。

# スクリプトとその実行結果

この悩みを解消するスクリプトを以下に示します。

```python:sheet_width.py

'''
    sheet_width.py
    purpose: make new xlsx and set width automatically
'''

import openpyxl as xl


# set input file name
inputfile = 'test.xlsx'

# read input xlsx
wb1 = xl.load_workbook(filename=inputfile)
ws1 = wb1.worksheets[0]

# set column width
for col in ws1.columns:
    max_length = 0
    column = col[0].column
    
    for cell in col:
        if len(str(cell.value)) > max_length:
            max_length = len(str(cell.value))
        
    adjusted_width = (max_length + 2) * 1.2
    ws1.column_dimensions[column].width = adjusted_width

# save xlsx file
wb1.save(inputfile)
```

実行結果は以下のようになります。

![スクリーンショット 2019-03-12 17.28.03.png](https://qiita-image-store.s3.amazonaws.com/0/335400/fa66c112-413c-8932-fd3c-c6d105272720.png)

# スクリプト詳細

## 幅の指定

```python
ws1.column_dimensions[column].width = adjusted_width
```

でcolumn列の幅をadjusted_widthに指定しています。

## 幅を自動で設定するために

```python
# set column width
for col in ws1.columns:
    max_length = 0
    column = col[0].column
    
    for cell in col:
        if len(str(cell.value)) > max_length:
            max_length = len(str(cell.value))
        
    adjusted_width = (max_length + 2) * 1.2
```

`for col in ws1.columns:`で列によるループを行います。次にcolumn変数に`col[0].column`を代入することで、どの列のループを行なっているのかを記憶させます。次の`for cell in col:`でその列の中に含まれるセルに対しての繰り返しを行うことができます。`len(str(cell.value))`で、セルの値が文字列としてどのくらいの長さかを算出し、その最大値を見つけ出しています。最後にそれに余裕を持たせた値をadjust_widthとして代入しています。
簡易的な掲示板

簡易的な掲示板を作ってみました。

~~https://keizibandb.herokuapp.com/index.php~~

Github
~~https://github.com/azikuma/keizibandb_php~~

```php:index.php

<?php

function h($str) {
  return htmlspecialchars($str, ENT_QUOTES, 'UTF-8');
}

$db = parse_url($_SERVER['CLEARDB_DATABASE_URL']);
$db['dbname'] = ltrim($db['path'], '/');
$dsn = "mysql:host={$db['host']};dbname={$db['dbname']};charset=utf8";

try {
  // connect
  $pdo = new PDO($dsn, $db['user'], $db['pass']);
  $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
  $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);


} catch (PDOException $e) {
  echo $e->getMessage();
  exit;
}

if (isset($_POST['push'])) {
  $name = $_POST['name'];
  $comment = $_POST['comment'];
  $stmt = $pdo->prepare("INSERT INTO board (name, comment) VALUES (:name, :comment)");
  $stmt->bindParam(':name', $name, PDO::PARAM_STR);
  $stmt->bindParam(':comment', $comment, PDO::PARAM_STR);
  $stmt->execute();
  $pdo->query($stmt);
  header("Location: " . $_SERVER['PHP_SELF']);
}

?>

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>掲示板</title>
</head>
<body>
  <h1>掲示板</h1>
  <section>
    <h2>新規投稿</h2>
    <form action="" method="post">
      名前: <input type="text" name="name" value=""><br>
      本文: <input type="text" name="comment" value=""><br>
      <button type="submit" name="push">submit</button>
      <input type="hidden" name="token" value="<?= h(sha1(session_id())) ?>">
    </form>
  </section>
  <section>
    <h2>投稿一覧</h2>
    <?php
      $sql = "SELECT * FROM board ORDER BY id DESC";
      $rows = $pdo->query($sql);
      foreach ($rows as $row) {
        echo h($row['comment']).'('.h($row['name']).')';
        echo '<br>';
      }
    ?>
  </section>
</body>
</html>
```
今の開発環境について(Java8)

今年から現場が変わって
開発環境がいろいろ変わりました。

特に主張したい何かがあるわけじゃないけど
所感メモを残しておきます。

昨年に比べればだいぶ現代に近づけたかな・・・。

#Java6 → Java8
ZonedDateTimeとか
ラムダ式とか、Listのforeachとか
便利そうな機能が加わった。

が、まだ現場では使えてない。
クソみたいなfor文ぐるぐる書いちゃうので
早く慣れたい。

#SpringMVC→SpringBoot

旧Spring時代と比べ、大分良いです。
Java特有のお作法の厳しさがだいぶ軽くなります。

DIにふつーに@Autowiredしてもらえば
割と細かいことは意識しなくても動いてくれる感じステキ。

@Scope とか @SessionAttributes とか @Validated とか
便利なアノテーションもありがたいです。


#Lombok
アノテーションといえばコイツ。

getter/setterを自動で書いてくれるヤツ。
他にも便利なアノテーション揃ってる優れたヤツ。

なぜ前の現場でこれを使わせてくれなかったのか。
小一時間問い詰めたい。


#Eclipse
文字色がうまく治せない、
起動が遅いこと以外はそれほど不便を感じていないです。


#Gradle

ずっとantで苦しんできたので、
だいぶ楽ちんになりました。

一番ありがたいのは、新しい何か採用するとき。

みんなMavenかGradleは使っているので
新しいライブラリとか導入したいとき、
一行書くだけでOK！なパターンが頻出。

antは依存関係を自分で調べて、自分でbuildして
自分で落とし穴にハマっていかないとわからなかったのです。

落とし穴にハマった話（https://qiita.com/kugyu10/items/ab2df77c187b23bf6670）


#Thymeleaf
HTMLとJavaを分離できる！
これでみんな幸せ！

・・・とはならなかった！！

別に、Thymeleafでも、Viewに
ゴリゴリ書いちゃう人はいるのだ。

JSPよりはマシだけど。

CSSちゃんと書きません？さすがにもう読みにくいです。
Layout目的でiframe使うのもやめませんか？


#PostgreSQL
OracleのNullと''（空文字）をごっちゃに
する感じは苦手だったので、
ぼくはこっちのが好きです。

運用よりの人の話を聞いてみたい。


#MyBatis
O/R Mapper

うーん・・・悪くないんだけど・・・

Java現場あるあるなんだけど、
職場の制約や、いまいちなマッパーのため、
結局ゴリゴリやるしかない、ってなってしまう。

このserviceの醜いコード、
全部formからEntityに入れるだけだよね？
みたいな。

Mapper使うより、SQLゴリゴリ書いちゃう方が早い！って時に、
（テーブル設計が微妙だとよくある）ちゃんとその道が
用意されてるだけ良心的。


#足りないもの

##JUnit5/assertJ

テスト書かせて

##Spring AOP(spring-boot-starter-aop)
アスペクト指向プログラミング。

あ、アスペ？？？

例えば、「全コントローラのstartとendのloggingしたい！」
みたいなふるまいを
コントローラクラスをいじることなく
外から定義、実装できる仕組み。

`@Aspect`アノテーションで定義する。

DB設計で全テーブル「作成日付」「更新日付」「削除フラグ」
を持っている設計なんだけど、
Mapperでその実装とかなくて
アプリでそれを全部書くことになっている。
（そして、あっちこっちでそこそこ間違えている）

ここらへんもAOPで補完できるかもしれない。

既存のフレームワークやライブラリではちょっと不足してる箇所を
コレで補えたりすると幸せになれるかもしれない。

#まとめ
RailsのActiveRecordは神すぎた。
mac pyenvでPython 3.7.xをインストールしたらSQLite3がないと怒られたときのTips

# 自分の環境

```
* macOS mojave 10.14.2
* pyenv 1.2.9
* python 3.7.2
```


# 発生した現象

> WARNING: IPython History requires SQLite, your history will not be saved

macのpyenvでPython 3.7.2をインストール。
pipでipythonをインストール。
ipythonを起動したら、sqlite3がないと履歴を保存できない的なエラーが発生。
履歴機能が効かないのは困る。



# 解決方法
実は[公式レポジトリ](https://github.com/pyenv/pyenv/wiki/common-build-problems)に挙がっている。よくある問題みたい

## 1. Apple DeveloperからCommand Line ToolsをDL & インストール
DL元はここ。Appleのアカウントが必要。
https://developer.apple.com/download/more/?q=Command%20Line%20Tools

## 2. 1で取得したheadersをインストールし、pythonを再インストール

```
sudo installer -pkg /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg -target /

pyenv uninstall 3.7.x
pyenv install 3.7.x
pyenv global 3.7.x
pyenv rehash

ipython // ここでエラーがなくなるはず
```
Minikube環境構築手順(Windows10, VirtualBox利用)

## 前提

- Windows10 Proが導入された64bit PC

## 既知の問題

- Docker DesktopはHyper-Vを前提にしているため、起動時にはHyper-Vを有効にするようにBIOS, OSの設定変更が必要(Docker Desktopを導入するとCLIのDockerコマンドが導入されるため)
- 一方でMinikubeはHyper-Vでは起動しない（ドキュメント上は起動するはずだが原因不明）
- そこでDocker Desktop導入時のみHyper-Vを有効にして、導入が終わったらHyper-Vを無効化する方針をとる

## 導入するソフトウェア一覧

|名称|バージョン|説明|
|----|----|----|
|Docker Desktop|2.0.0.3|Windows用のDocker環境|
|Minikube|v0.35.0|簡単にKubernetesを導入できるパッケージ|
|VirtualBox|5.2.26|仮想化ソフトウェア|
|kubectl|v1.13.0|Kubernetesを操作するCommandLineツール|
|helm|2.13.0|コンテナ用のパッケージマネージャー|

## 1. BIOSでIntelの仮想化機能を有効化する

1. 次の手順などを参考にさせていただき、BIOS画面を表示させる.
https://freesoft.tvbok.com/win10/access_uefi_bios_setup.html
2. 仮想化機能を有効化する（Lenovo T470の場合は、 Security→Virtualizationを選択して、Intel Virtualization Technology, Intel VT-d FeatureをEnableにする)

## 2. Hyper-Vを有効化する

1. Windows10の設定から「Windowsの機能の有効化または無効化」を開く
2. Hyper-Vの機能にチェックを入れる

## 3. Docker Desktopの導入

1. 次のページから、インストーラーを入手する（要ユーザー登録）
2. https://hub.docker.com/editions/community/docker-ce-desktop-windows
2. インストーラーを実行する
3. インストール時に"Use Windows containers instead of Linux containers"にはチェックを入れないこと
4. Docker Desktopを起動するとタスクトレイにDockerのアイコンが表示されるので、右クリックして"Start Docker Desktop when you log in"のチェックを外す

## 4. Hyper-Vを無効化する

1. Windows10の設定から「Windowsの機能の有効化または無効化」を開く
2. Hyper-Vの機能のチェックを外す

## 5. kubectlコマンドの導入

1. ブラウザで以下のURLにアクセスしてツールをダウンロードする
https://storage.googleapis.com/kubernetes-release/release/v1.13.0/bin/windows/amd64/kubectl.exe
2. 適当なディレクトリに配置して、そのディレクトリにパスを通す

## 6. Minikubeの導入

1. ブラウザで以下のURLにアクセスしてツールをダウンロードする
https://storage.googleapis.com/minikube/releases/v0.35.0/minikube-windows-amd64.exe
2. 適当なディレクトリに配置して、そのディレクトリにパスを通す
3. ファイル名を`minikube.exe`に変更する（任意）
4. コマンドプロンプトを起動して`minikube start`というコマンドを実行する
5. エラーがなく完了したら、`minikube addons enable ingress`というコマンドを実行して、Ingressを有効化する
6. `minikube dashboard`というコマンドを実行し、ブラウザにダッシュボード画面が表示されれば導入完了。Ctrl+Cで終了する

## 7. Helmの導入

1. ブラウザで以下のURLにアクセスしてツールをダウンロードする
https://storage.googleapis.com/kubernetes-helm/helm-v2.13.0-windows-amd64.zip
2. zipを展開して`helm.exe`を適当なディレクトリに配置して、そのディレクトリにパスを通す
3. コマンドプロンプトで`helm init`というコマンドを実行する
4. 1分程度待って`helm version`というコマンドを実行し、ClientとServerのバージョンが表示されれば導入完了
slimでルーティングした上でルーティング済みのURLをすべて取得する方法

# サンプルソース
```
// Slimでルーティングする。
$app = new \Slim\App();
$app->get( '/home', function() { echo "ホームです。"; })
    ->via( 'GET', 'POST')
    ->name('home');

// \Slim\Routerからルーティング済みのURLをすべて取得
$namedRoute = array();
foreach ($app->router->getNamedRoutes() as $key => $route){
    $namedRoute[$key] = $route->getpattern();
}

// 出力する
var_dump($namedRoute);
exit;
```

# 出力結果
```
array(1) {
  ["home"]=> string(6) "/home"
}
```
個人開発に向けて、個人的に気になるGemを調べてみた 


初Qiita投稿です。
《[自己紹介兼ポートフォリオ](https://laneigef.github.io)》
昨日はRailsチュートリアルで出てきたエラーについて投稿あげようとしていましたが、
なぜか急にエラーが治ったという…
知り合いのエンジニアが「エンジニアあるあるなので気にしたら負け。」
と言われました。
ちなみにタイトルは《外国人が日本語版のRailsチュートリアルを学習してみた》です←
都内のとあるSES会社（在籍中は開発に携わるプロジェクトに参画できず）に勤め、今月末で退職予定です。
スキルとしてはProgate完走とRailsチュートリアルを学習中の程度です。

勉強進度：
Railsチュートリアル第11章完走（一周目）
学生の頃軽くHTMLやPHPをいじったことや実際サービスを運営した経験があるからか、特に挫折せず進めることができている気がします…
第10章からはよくわからない部分増えてきたが、一周目なので全体像を掴むためにそのまま進行。
　　　　　
前置きは以上、転職にも向けて、
数ヶ月前から猫カフェを探すマップのようなサービスを作ろうと思っています。
現在もこういうサービス（例：ねこのみせ）があるのですが、
更新停止になっているようですし、
自分でなんとかそれより良いものを作りたいと思い始めました。

と言っても、チュートリアルもまだ完走していないレベルです。
学習の気分転換を兼ねて、上記サービスを開発する際に役に立てそうなGemを調べてみした。

## ログイン周り
```
gem 'devise'
gem 'omniauth'
gem 'omniauth-twitter'
gem 'omniauth-facebook'
gem 'omniauth-plurk'
```
よく見かけるやつですね。
一番最後のは、主に台湾で使われているPlurkというSNSです。
（実は練習としてPlurk向けの質問箱のようなサービスも作ろうと思ってるので、とりあえず調べた）

## セキュリティ
```
gem 'bcrypt'
gem 'dotenv-rails'
```
bcryptはチュートリアルでもよく使っていましたね。
あと環境によって環境変数を管理するためのdotenv、
Githubにソースコードを公開する際にもAPIキーなどを公開しないように役に立ちそうです。
（参考：[API key等をgithubで公開しない方法](https://qiita.com/uma0317/items/e142661c004f68d858a5)）
## 画像処理・投稿
```
gem 'carrierwave'
gem 'rmagick'
```
お店の写真などをアップロードして保存するためですね。
（参考：[CarrierWaveとrmagickで画像アップロード機能を作る](https://pg-happy.jp/carrierwave-rmagic-uploader.html)）

## GoogleMap
```
gem 'geocoder'
gem 'gmaps4rails'
```
（参考：[Rails GoogleMap表示](https://qiita.com/yuki_chrono/items/a2638c33eedc3c036d01)）

## その他
```
gem 'rails-i18n'
```
日本語化対応にするには必要らしい、一応メモします。
（参考：[Railsのi18nによる日本語化対応](https://qiita.com/shi-ma-da/items/7e5c3d75c9a9f51abdd5)）
既存のアプリのRailsのバージョンをあげた際にrails sが立ち上がらない

Gemfileにて、gem 'rails'の後ろに何もつけないと、最新の状態のrailsがインストールされる！！

しかし、rails sをすると

```<top (required)>': undefined method `halt_callback_chains_on_return_false=' for ActiveSupport:Module (NoMethodError)
```
と言われる。
どうやらhalt_callback_chains_on_return_falseはRails 4との後方互換のためのメソッドで、定義されていないメソッドだと言われる。
なので
```config/initializers/new_framework_defaults.rb```の中の```halt_callback_chains_on_return_false```をコメントアウト！！

無事、rails sでサーバーが立ち上がった！！

追記:rails sをした時にlocal:3000にて
```Puma caught this error: Invalid option key: raise_on_unfiltered_parameters= (RuntimeError)
```
と表示されてしまったら

```config/initializers/new_framework_defaults.rb

Rails.application.config.action_controller.raise_on_unfiltered_parameters = true
```
をコメントアウトにすると解決！！

Rails 5.1から追加された設定らしい、、、
もそ、プログラミングを学ぶ【Ruby on Rails】〜before_actionとは？〜

相変わらずふわふわした認識でRails学習を進める もそ。
あまりの理解のできなさに、日本語の文章すら解読できず眠気が襲ってきます...。
強烈な眠気と戦いつつ、今日はbefore_actionについて書いていきます。

##まずは昨日のおさらい

昨日は[MVCについて学びました](https://qiita.com/moso/private/4a61da06c33fb019b7ab.)が、この処理の流れをまずはおさらい。

下の図は、昨日の説明図から一部を抜き出してもう一度図解しています。
ルーティングが指定した処理を、コントローラがアクションとして実行しようとしています。

![無題1139.jpeg](https://qiita-image-store.s3.amazonaws.com/0/372174/59ae0212-a5df-690e-f273-a5c7117f3f0f.jpeg)

controller.rbのコードが、それぞれのコントローラが実行するアクションになります。

##before_actionとは？

before_actionは、**コントローラが実行する優先順位の一番上に、実行したいアクションを実行します。**

Railsはマークダウン形式なので、基本的にコードは上から順に下へ向かって読み込まれ、実行されます。
このとき、コントローラの記述の上に

```
before_action :hoge, except: :index
```
このように記述すると、**indexアクション以外が実行される前にhogeが実行**されます。
図でイメージしてみるとこんな感じ。
最初に絶対「before_action」というスイッチを先に入れる処理をしてから、コントローラがアクションを起こしますよ〜と処理するメソッド、それがbefore_actionなのです。


![無題1138.jpeg](https://qiita-image-store.s3.amazonaws.com/0/372174/daa19e62-5b91-f91c-dd0a-b32d117a63e3.jpeg)


今後学習を進めたりアプリケーションを作ったりする際によく出てくるメソッドなので、よくよく頭に叩き込んでおきたいところ。

---
一向にカリキュラムが進まずRails地獄な気持ちですが、これが天国になる日は来るのでしょうか。
...もその迷走学習はまだまだ続く。
enebular(Node-RED)でSlackのユーザーの発話を取得する


SlackにBOTが投稿ではなく、SlackにBOTを常駐させて、ユーザーが投稿したものをハンドリングするやり方です。

## Slack BOTを作成

BOT作成といってもボタンぽちぽちでいけます。

[ボットユーザートークン](https://get.slack.help/hc/ja/articles/215770388-API-%E3%83%88%E3%83%BC%E3%82%AF%E3%83%B3%E3%81%AE%E7%94%9F%E6%88%90%E3%81%A8%E5%86%8D%E7%94%9F%E6%88%90#%E3%83%9C%E3%83%83%E3%83%88%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%83%88%E3%83%BC%E3%82%AF%E3%83%B3)から進みます。

![](https://i.gyazo.com/c61e2bb7b66053647663b47a0213caa6.png)

* `Bots`を選択

![](https://i.gyazo.com/210a33702491fc449a774d057a361220.png)

* `設定を追加`で進む

![](https://i.gyazo.com/a0594c24b89f47f339e82153eff8ed79.png)

* BOTのユーザー名を入力して進む。

![](https://i.gyazo.com/f71c3e2946b8579092105f5b40ac82e9.png)

## APIトークンをコピー

↑から進んだ先のページでトークンをコピーしてください。

![](https://i.gyazo.com/6b92940d0780130898b5e52688162963.png)

ちなみにこのページで、BOTのアイコンなどカスタマイズが出来ます。

## BOTを利用するチャンネルに招待

通常のSlackの操作でBOTをチャンネルに追加出来ます。

![](https://i.gyazo.com/d9a16246a26e4c274328a9ed715bb07e.png)

## enebular(Node-RED)で設定

* `Slack BoT In`ノードを追加します。

![](https://i.gyazo.com/f8b11c789b1f5cb6d777afbf2de4e1ac.gif)

* 設定にトークンと利用するチャンネル名(BOTを招待したチャンネル)を入れます。

![](https://i.gyazo.com/f03b687a1e5fa369475782654fa6fcf6.png)

## デバッグノードに追加して確認できます

![](https://i.gyazo.com/7d6520c1e38c12ef4e659825328ad366.png)

## Switchノードを追加してハンドリング

switchノードを挟めば、特定の文字が送られたら反応させる、なども簡単にできます。

![](https://i.gyazo.com/44513c1b6451991f2967576e577f6e0f.png)

![](https://i.gyazo.com/018f0963611eaa03cc4ecfe6a723ceb5.jpg)
IBM id の削除の仕方


# まずはここをみて、サポートの連絡先を把握

セルフサービスで削除はできないようなので、下記リンク先に掲載されているサポートに連絡します。

[IBMid worldwide help desk](https://www.ibm.com/ibmid/myibm/help/us/helpdesk.html)

# メールで削除を依頼を投げる

メールだと「Hours: 24x7」で受け付けているので便利です。
メールの場合は、以下のようなもので十分です。

> TO : erchelp@ca.ibm.com
> FROM : xxx@yyy.com 
> TITLE : Please delete my IBM id
> Please delete my IBM id, xxx@yyy.com 

削除したい IBM id のメールアドレスから送るようにしましょう。
全く異なるアドレスから連絡すると、以下のように注意されます。

>Could you please send us the deletion request from the associated e-mail in order to initiate deletion.

# チケットが発行される
すぐにサポートチケットが発行された旨の連絡がきます。

>Dear Sir/Madam,
>A Sev 3 ticket # INxxxxxxxx has been raised for the >deletion of IBM ID : xxx@yyy.com.

# 削除される事前確認メール
1〜2日くらいで届きます。

>From: ibacct@iam.ibm.com
Date: March 9, 2019 4:52:40 JST
To: xxx@yyy.com
Subject: Your IBM account is about to be deleted - PLEASE READ

>We have received a request to delete the account information associated with this ID:
xxx@yyy.com

>This information will be deleted within the next 30 days. If this request was made in error, please immediately contact our help desk.
Contact information can be found in https://www.ibm.com/ibmid/myibm/faq/us/faqhelp.html

# 削除された通知メール
その後、もう1〜2日すれば、これで削除完了です！

>IBM ID Deletion Notification;INxxxxxxxx
>The below IBM ID has been deleted as requested:
Your IBM ID: xxx@yyy.com
You may register for an new IBM ID at:
http://www.ibm.com/account/profile
Angular + Cordovaでスマホアプリ開発

Angular + Cordovaでスマホアプリを開発した際のメモ
記載中


## エミュレータでの実行


## 実機での実行

### iOS (iPhone)

Apple Developerとかその辺りが鬼門
Nativeで開発した経験があれば、それなりに上手く進めることが出来るはず

```
cordova platform add ios
cordova build ios --buildFlag='-UseModernBuildSystem=0’
cordova run ios --buildFlag='-UseModernBuildSystem=0'
```

ポイントとしては、``` --buildFlag='-UseModernBuildSystem=0' ```が重要で、これがないとビルドが通っても更新前の状態で実機にインストールされてしまう。
保存してビルドもしたのに何で？って状態になるので注意。

## アプリ公開（iOS）

platform/iosフォルダ内の[Project Name].xcodeprojファイルをXcodeで開く
Product > Archiveを選択
そこから次へを進めていくとアップロード完了できる
ただし、先にApp Store Connectでアプリを作成しておく必要がある
あと、Bundle IDを合わせておく必要もある

## TestFlightでの配信（内部テスター）

ここはCordova等とは関係ないが、念の為記載

[App Store Connect]()でアプリが作成されていることが前提だが、
そのアプリ内でユーザーを登録すればTestFlightにアプリが配信されるようになる。

マイApp -> TestFlightタブ　-> App Store Connectユーザーでテスターを追加
アプリがなければ、左上の「＋」ボタンでアプリを作成
Bundle IDは自分のアプリと合わせておくこと（.xcodeprojを開いてXcodeで確認できる）
【初心者向け】開発の時によく使うgitコマンド

### Gitコマンドの忘備録

#### git add

作業ディレクトリ（皆さんのパソコン）で変更したファイルをステージング環境にあげる

全部ファイルを上げたいときは

```
$ git add .
```
とする

ファイルを指定して上げたいときは

```
$ git add hoge.html
```
のようにファイル名を指定する。

Railsのプロジェクトとかだとこんな感じ。

```
$ git add app/views/admin/index.html
```

#### git commit 

ステージングに上がったファイルをgitリポジトリに保存する

```
$ git commit -m "commit_message" 
```

コミットメッセージはできるだけわかりやすく書いた方がいい。適当でもコミットはできるが、あとで見直した時に困る時があるので。

ちなみに、間違えてコミットメッセージを打ち間違えてしまった時には

```
$ git commit --amend -m "hogehoge"
```

とするとコミットメッセージを（上記の例の場合）"hogehoge"と変えることができる。

#### git push 

コミットした内容をリモートサーバーへ送信する。

これで晴れて、リモートリポジトリ上に変更を反映できます。

```
$ git push origin branch_name
```
このようにしてpushをします。

```
$ git push origin master
```
とするとmasterブランチ（大元のブランチ）に変更内容を反映することになります。

個人開発ならばmasterにpushすることはあるかもしれませんが、通常チーム開発ではブランチを切ることがほとんどなので

```
$ git push origin branch_name
```
のように書くことがほとんどでしょう。

さて、上記の3つで「変更の内容をリモートリポジトリに反映する」ということはできるようになりました。

もう少しその周りで知識として必要になることがあるのでみていきましょう。

#### git checkout

これについてはいくつか使用用途があるので、
・新しいブランチを作る
・別のブランチから特定のファイルを取ってくる
・ブランチを切り替える
・ファイルの変更をなかったことにする

といったよく使う方法について書きたいと思います。

**新しいブランチを作る**

```
$ git checkout -b branch_name
```
として新しくブランチを切ります。これで、その新しく作ったブランチに移動してくれるので便利です。

ちょっとした応用例として

```
$ git checkout -b hogehoge origin/fugafuga
```
とすると、
・hogehogeというブランチを作成
・すでにリモート上に上がっているfugafugaというブランチ名の内容を全て取ってくる
・そしてその内容をhogehogeブランチに取り込む

ということができます。（すごい便利だ・・・）

誰かの開発を引き継いだりする時に使ったりします。

**別のブランチから特定のファイルを取ってくる**
自分が開発するブランチには今はないけど、他の人が開発しているブランチにある機能があって、それを取り込んだ上で開発したい、といったようなケースです。

そんな時は

```
$ git checkout target_branch_name file_name
```
のようにするとファイルを取ってこれます。

少しわかりにくいので具体的な例を出しますと

今いるブランチの中に、dev_hogeというブランチの中にあるapp/views/admin/index.htmlというファイルを取ってきたい、という状況である時には

```
$ git checkout dev_hoge app/views/admin/index.html
```
とします。
注意しなくてはいけないのは、「今いる」ブランチにそのファイルの内容が取り込まれるので、事前にどのブランチにいるかを確認した上でやりましょう。

**ブランチを切り替える**
文字通り今いるブランチから別のブランチに移動して作業をしたいケースの時に使います

```
$ git checkout target_branch
```

**ファイルの変更をなかったことにする**
別ブランチで変更するべきファイルを、間違えて今のブランチで変更してしまった！などといったミスもあったりするので、変更した内容を元に戻すこともできます。

```
$ git checkout .
```
これで、ローカルでの変更をなかったことにできます。
ただ、これだと全てのファイルに対して変更がなかったことにされてしまうので、ファイルを指定して行いたい場合は

```
git checkout app/views/admin/index.html
```
のようにファイル名を指定します。

#### git branch
今あるブランチを出してくれます

```
$ git branch
```
これでローカルの方のブランチを表示してくれます。

リモートリポジトリのブランチをみたい場合は

```
$ git branch -r
```

とします。
どっちもみたい場合は

```
$ git branch -a
```

とします。

#### git diff
変更した内容の差分を見ることができます。

```
$ git diff
```
が基本となります。

```
$ git diff HEAD
```
で最新コミットと作業ツリーの差分を表示することができます。

また、変更したファイル名の確認をする場合は

```
$ git diff --name-only
```
とすれば変更があったファイル名を確認することができます。

他にもよく使うものが出てきたら更新します。