OmniAICreator/Qiita-1.07M huggingface dataset:
[Ruby]firstとlastを使うメリット

# はじめに
[Array#first](https://docs.ruby-lang.org/ja/latest/method/Array/i/first.html)と[Array#last](https://docs.ruby-lang.org/ja/latest/method/Array/i/last.html)は`[0]`と`[-1]`で代用できます。
ちなみに、[[]](https://docs.ruby-lang.org/ja/latest/method/Array/i/=5b=5d.html)は[slice](https://docs.ruby-lang.org/ja/latest/method/Array/i/slice.html)のaliasです。

```ruby
arr = [0, 1, 2, 3, 4]

arr.first #=> 0
arr[0]    #=> 0

arr.last  #=> 4
arr[-1]   #=> 4

```

「`first`と`last`使わなくてもいいんじゃない？」って初心者のときは思ってました...

`first`と`last`を使うメリットについて、調べたこと、感じたことについてまとめてみました。


# firstとlastを使うメリット

## &修飾が使えるためシンプルに書ける
`&:メソッド名`でメソッドを呼ぶprocがブロックに変換されます。
この記法を使えば`map`をシンプルに書けます。


```ruby
arr = [['zero', 0], ['one', 1], ['two', 2]]

arr.map { |e| e[0] }  #=> ["zero", "one", "two"]
# シンプルに書ける
arr.map(&:first)      #=> ["zero", "one", "two"]

arr.map { |e| e[-1] } #=> [0, 1, 2]
# シンプルに書ける
arr.map(&:last)       #=> [0, 1, 2]
```
ただし、この記法だと引数は与えられません。

[Rubyの array.map(&:to_s) 記法を紐解く](https://qiita.com/kenzan100/items/6344766167299b9f7e91) 
[[初心者向け] RubyやRailsでリファクタリングに使えそうなイディオムとか便利メソッドとか](https://qiita.com/jnchito/items/dedb3b889ab226933ccf#%E9%85%8D%E5%88%97%E3%82%92%E9%A0%86%E7%95%AA%E3%81%AB%E5%87%A6%E7%90%86%E3%81%99%E3%82%8B%E3%81%A8%E3%81%8Dobjectmethod%E3%81%AE%E4%BB%A3%E3%82%8F%E3%82%8A%E3%81%ABmethod%E3%82%92%E4%BD%BF%E3%81%86)
を参考にしました。


## レシーバがnilの場合は`&.`でエラーを回避できる
`first`と`last`はメソッドであるため、レシーバが`nil`の場合でも、`&.`を使えばエラーを回避できます。
`&.`はSafe Navigation Operatorと呼ばれるもので、レシーバが`nil`ならそのまま`nil`を返します。
Ruby2.3から使えます。

```ruby
nil[0]     #=> NoMethodError: undefined method `[]' for nil:NilClass
nil.first  #=> NoMethodError: undefined method `first' for nil:NilClass
nil&.first #=> nil

nil[-1]    #=> NoMethodError: undefined method `[]' for nil:NilClass
nil.last   #=> NoMethodError: undefined method `last' for nil:NilClass
nil&.last  #=> nil

```
[Ruby の &. と #try の違い](secret-garden.hatenablog.com/entry/2016/09/02/000000) を参考にしました。

### `[]`でも`&.`が使える
一応、`[]`でも`&.`を使うことはできます。実用性はないですが...

```ruby
arr = [0, 1, 2, 3, 4]

arr[0]     #=> 0
# .と引数を使っても書ける
arr.[](0)  #=> 0

# &.を使う
arr&.[](0) #=> 0
nil&.[](0) #=> nil
```



## 引数を与える場合、直感的にわかりやすい
`first`と`last`は引数で何個の要素を取るか指定できます。

- `first(n)`とすれば、先頭からn個の要素を配列で返します。
- `last(n)`とすれば、末尾からn個の要素を配列で返します。

同じことを`[m, n]`で再現できます。

- `first(n)`は`[0, n]`と同じ
- `last(n)`は`[-1, n]`と同じ

`[0, n]`と`[-1, n]`はわかりにくい気がします。慣れれば気にならないかも...

```ruby
arr = [0, 1, 2, 3, 4]

# 先頭から数えて2つとる
arr.first(2) #=> [0, 1]
arr[0, 2]    #=> [0, 1]

# 末尾から数えて3つ取る
arr.last(3)  #=> [2, 3, 4]
arr[-1, 3]   #=> [2, 3, 4]
```

## コーディング規約で望ましい書き方とされている
[RuboCopのコーディング規約](https://github.com/fortissimo1997/ruby-style-guide/blob/japanese/README.ja.md#first-and-last)に`fitst`と`last`についての規約があります。

> 配列の最初や最後にアクセスしたいときは、 [0]や[-1]よりfirstやlastを使いましょう。

[こちら](https://techracho.bpsinc.jp/hachi8833/2017_03_27/37659#7-06)によると理由は、

> コード内でリテラルを書き散らすと一括変更やリファクタリングが面倒になるので、リテラルはなるべく1箇所にまとめるのが常道です。

だそうです。

ただし、これはRuboCopの規約を一例としてを示しただけなので、他の規約に従っても問題ないです。




# おわりに
間違っていることの指摘や、他にもメリットがあればコメントで教えていただけるとありがたいです。
Google Homeだけで嬉しくなったこと・やらなくてよくなったこと

# まえおき

* Google Homeを使い始めてから3ヵ月の感想です。
* Amazon Echoも試していますが、今回はGoogle Homeのみを通してのスマートスピーカーについて書いていきます。
* Nature RemoやIFTTTを使って家電の操作もしていますが、今回はGoogle Homeだけに閉じた話です。

# Google Homeを使う前の私

* 会話ができ、まるでもう一人の住人が自宅にいるように楽しめる。
* 音声だけで家電のあれやこれやを操作でき、魔法使い気分を味わえる。

# Google Homeを使ってみた私

* 過去の会話から類推してくれず、ただの一問一答で、会話の内容は育たない。
* 音声で家電を操作できるようになったのは嬉しかったけど、本当にすごいのはNature RemoやIFTTTだと思ってしまった。

# Google Homeに求めていたのは私を支えてくれること
もっといろいろ連携したり、カスタマイズすれば、可能性は広がりそうな記事をいくつか見かけましたが、私には、もし、それが動かない時の代替手段の手間が面倒に感じたり、動くように保守していくための労力が大きくなることばかり目についてしまい、あまり魅力を感じませんでした。

私が本当に求めていたのは、Google Homeを使う私が楽になる＝Google Homeが私を支えてくれることなのだと気付きました。（私がGoogle Homeを支えることではありませんでした）

# Google Homeで嬉しくなったこと
というわけで、以下、Google Homeだけでできる、ちょっと嬉しい、でもよく使うことを書いていきます。


## １）「ねぇGoogle、今何時？」
→ 今現在の時間を教えてくれます。

**◆嬉しくなったこと**
寝起きの虚ろな状態で、もう少し寝ていたいんだけど、時間が気になるときに、瞼を閉じたまま時間を確認することができます。もう少し眠れる時間があると分かったときは嬉しくなります。（が、油断するとそのまま寝坊します。）

**◆やらなくてよくなったこと**
目を開けて（開かない）、スマホを探して（見つからない）、時間を確認する必要がなくなりました。


## ２）「ねぇGoogle、今日の天気は？」
→ 天気と気温を教えてくれます。

**◆嬉しくなったこと**
出掛ける準備をしている時に、天気や温度がサクッと聞けると準備が捗って嬉しくなります。

**◆やらなくてよくなったこと**
スマホで天気を調べなくてもよくなりました。


## ３）「ねぇGoogle、3分でタイマーをセット」
→ 3分のタイマーが動き出し、3分経過するとアラーム音で教えてくれます。

**◆嬉しくなったこと**
カップ麺でお湯を注ぎながら、同時に、タイマーをセットする瞬間が嬉しくなります。

**◆やらなくてよくなったこと**
スマホでタイマーをセットする必要がなくなりました。

※「ねぇGoogle、あとどのくらい？」と尋ねると残り時間を教えてくれます。


## 4）「ねぇGoogle、スマホを探して？」
→ スマホから音を鳴らしてくれます。

**◆嬉しくなったこと**
どこに置いたか分からなくなったスマホがすぐに見つかるようになったので、スマホから音が聞こえた時に嬉しくなります。

**◆やらなくてよくなったこと**
スマホを探すという名の家宅捜査、もとい家宅荒らし。


# 雑感
他にもGoogle Homeだけでできることを知りたいですが、日常生活の行動の範疇を超えた振る舞いについては、私自身に興味が沸いてから考えます。ほんのちょっと嬉しくなれればいいんです。
FlaskでRest API(json形式)のファイルダウンロードを実現する方法

## 1. はじめに

今回はflaskで`Rest API(json形式)`におけるファイルダウンロードの方法について説明したいと思います。普通のファイルダウンロードについては[以前の記事](https://qiita.com/5zm/items/760000cf63b176be544c)を参照ください。
なお、クライアント側については「[Pythonのrequestsを利用してRest API(json形式)でファイルダウンロードする方法](https://qiita.com/5zm/items/d62df0e7b1d98348f983)」を参照ください。

## 2. ソースコード

```python:RestAPI(json形式)でファイルダウンロードさせる場合
# -*- coding: utf-8 -*-
from flask import Flask, make_response, jsonify
import base64

# ★ポイント1
# 2007 Office system ファイル形式の MIME タイプをサーバーで登録する
# https://technet.microsoft.com/ja-jp/library/ee309278(v=office.12).aspx
XLSX_MIMETYPE = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'

# flask
app = Flask(__name__, static_folder=None)

# rest api
# case 4 : json with base64 encoding
#   {
#     'fileName': 'ファイル名',
#     'contentType': 'mimetype',
#     'contentData': 'バイナリデータをbase64でエンコードしたascii文字列'
#   }
@app.route('/download/json', methods=['GET'])
def report4():

    # ★ポイント2
    downloadData = {
        'fileName': 'demo4.xlsx',
        'contentType': XLSX_MIMETYPE,
        # 'contentData': は別途設定
    }

    # ★ポイント3
    fileDataBinary = open('demo4.xlsx', 'rb').read()
    downloadData['contentData'] = base64.b64encode(fileDataBinary)

    # ★ポイント4
    return make_response(jsonify(downloadData))

# main
if __name__ == "__main__":
    print(app.url_map)
    app.run(host='localhost', port=3000)
```

**★ポイント1**
ファイルをダウンロードした際、クライアント側で適切にファイルを処理できるようにmimetypeを定義します。
Excelファイル（拡張子xlsx）のmimetypeは[マイクロソフトのサイト](https://technet.microsoft.com/ja-jp/library/ee309278(v=office.12).aspx)を参考にしました。

**★ポイント2**
ダウンロードデータを定義します。今回はタイトルにもあるようにjson形式（Dict）としました。contentDataフィールドはこの後、個別に設定します。

* fileNameフィールド　：　ダウンロードファイルのファイル名
* contentTypeフィールド　：　ダウンロードファイルのMIMEタイプ
* contentDataフィールド　：　ダウンロードファイルのファイルデータ

**★ポイント3**
今回の記事の最大ポイントです。jsonではバイナリデータを設定できないため、base64でエンコードしたascii文字列とします。
`base64.b64encode()`を利用してバイナリデータをエンコードします。

**★ポイント4**
通常の`Rest API`の場合と同様に`make_response()`と`jsonify()`を利用してレスポンスを作成するだけです。

## 3. さいごに

今回はflaskで`Rest API(json形式)`におけるファイルダウンロードの方法について説明しました。ポイントはファイルのバイナリデータをbase64でエンコードすることで、それ以外は特に変わったことはなかったと思います。
Laravel Specified key was too long; max key length is 767 bytes

# Laravelをローカル環境で開発した後に起こるアレ

keylengthが長すぎ問題。
厳密には`varchar(255)`が問題。

```
$table->string('name');
```

のような、デフォルトの設定がこうなっている。

> 原因

>1. Laravel5.4から標準charasetがutf8mb4に変わった

>標準charasetがutf8mb4となったことで1文字あたりの最大byte数が4bytesに増えた。

> 2. MySQLではユニーク制約を付けたカラムには767bytesまでしか入らない。

>MySQLではPRIMARY_KEYおよびUNIQUE_KEYを付けたカラムには最大767bytesまでしか入らないらしい。ver5.7.7以降だと解消されている模様。


## 対策

app\Providers\AppServiceProvider.php

のboot()を書き換える。


``` php|AppServiceProvider.php
use Illuminate\Support\Facades\Schema;

public function boot()
{
    Schema::defaultStringLength(191);
}
```

これで起動できる。
マイグレーションが進んでしまっている可能性があるので、MySQL上で

```
drop database hogehoge;
create database hogehoge;
```

したほうが早い。
カスタムToastを表示

# TODO
- 背景が色付き等、オリジナルのトーストを設定する

# 方法

```MainActivity.kt
    val toast = Toast(context)
    // customViewをオリジナルのviewに設定する
    val customView = layoutInflater.inflate(R.layout.cutom_view, null)
    toast.view = customView
    // xOffset:横位置, yOffset:高さ
    // xOffset=0にし、高さだけ指定すると中央に表示される
    toast.setGravity(Gravity.BOTTOM, xOffset, yOffset)
    toast.show()
```
Bitmapを好きなサイズに変更

# やりたいこと
- bitmapの大きさを固定値で指定したサイズで調整
- bitmapの大きさ比率で指定したサイズで調整

# 方法

## 固定値

```Fixed.kt
// fixedSize = 指定値
val bitmap = Bitmap.createScaledBitmap(bitmap, fixedSize, fixedSize, true)
```

## 比率

```Ratio.kt
val matrix = Matrix()
matrix.postScale(0.5f, 0.5f) // 0.5倍調整
val scaledBitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.width, bitmap.height, matrix, true)
```
最後の引数 `filter` はアンチエイリアスで補正を入れるかどうかの指定

# おまけ

回転

```Rotate.kt
val matrix = Matrix()
matrix.postRotate(rotate.toFloat()) // 回転値
val rotatedBitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.width, bitmap.height, matrix, true)
```
Golang入門（関数）

# Golangの関数について

Golangでは、Javaの様にclass内にメソッドを定義出来ないことは[以前の記事](https://qiita.com/skanehira/items/dfc0d18e9a782c84ff25)で書いたとおりです。

では、どのように構造体毎に関数を定義するのか？
と説明する前に、まず関数の実装について説明しますねー

```go:sample.go
package main

import "fmt"

func p(i interface{}) {
	fmt.Println(i)
}

func main() {
	p("It's sample function")
	p("Do you like Golang?")
}

```

```shell-session
MacBookPro:Qiita skanehira$ go run sample.go
It's sample function
Do you like Golang?
MacBookPro:Qiita skanehira$
```

上記は、渡された文字列を標準出力をするだけのシンプルな関数です。
見てわかるとおり、Golangでの関数の実装は以下の様になります。

```go
func 関数名 (引数 型)　{
    // do something
}
```

もちろん、戻り値も定義できます。

```go
package main

import "fmt"

func main() {
	fmt.Println(addOne(1))
}

func addOne(i int) int {
	return i + 1
}

```

```shell-session
MacBookPro:Qiita skanehira$ go run sample.go
2
MacBookPro:Qiita skanehira$
```

関数の後ろに戻り値の型を定義することで、
値を返却できる様になります。

```go
func 関数名 (引数 型) 型 {
    // do something
    return 値
}
```

複数の値を返却する時ときはこのように定義します。

```go
func 関数名 (引数 型) (型, 型) {
    // do something
    return 値, 値
}
```

言語経験がある方は、すーっと入ってくると思います。

# 構造体の関数について

関数定義の仕方を理解したところで、
以前の記事で触れた構造体の関数を定義の仕方について書いていきます。

と言っても簡単です。

```go
package main

import "fmt"

type Human struct {
	Name   string
	Age    int
	Weight float32
}

func (h Human) addWeight(f float32) float32 {
	return h.Weight + f
}

func main() {
	// インスタンス生成
	skanehira := Human{
		Name:   "skanehira",
		Age:    24,
		Weight: 60.6,
	}

	fmt.Printf("%#v \n", skanehira)
	skanehira.Weight = skanehira.addWeight(10)
	fmt.Printf("%#v \n", skanehira)
}

```

つまり、このようになりますね。

```go
type 構造体 struct {
    // フィールド定義
}

func (変数名 構造体) 関数名(変数名 型) 型 {
    // do something
    return 値
}
```

そう、関数の前に「(変数名 構造体)」を付け加えるだけです。
そうすることで、構造体と関数が紐付けられるのです。（正確な言い方がわからなくてごめんなさい）
このように定義すると、Humanのインスタンスが作られないと関数を使用できないのです。

個人的にJavaから入門したので、
このような書き方にすごく違和感を覚えましたが、
まぁ慣れですねー

上記の例は少し、わかりづらいかもですが、
アカウントのCRUDを当てはめて考えると少しイメージし易いかもしれないですね。

```go
package main

import "fmt"

type Account struct {
	ID       string
	Name     string
	Password string
}

// アカウント登録
func (account Account) Create() {
	db.Insert(account)
}

// アカウント情報更新
func (account Account) Update() Account {
	db.Update(account.ID, account)
	return account
}

// アカウント情報取得
func (account Account) Read() Account {
	db.Get(account.ID)
	return account
}

// アカウント削除
func (account Account) Delete() {
	db.Delete(account.ID)
}

func main() {
	account := Account{
		Name:     "skanehira",
		Password: "kanehira1005",
	}

	account.Create()
	account.Update()
	account.Read()
	account.Delete()
}
```

以上、Golangにおいての関数定義でした。
次回は、継承の概念がないGolangでの構造体拡張について書いていきますっ
AWS CloudFrontとLambda勉強まとめ

#CloudFront

・`CDN`
- Contents Delivery Network
- エッジのキャパシティを利用して効率的かつ高速にコンテンツ配信
→ユーザに最も近いサーバに誘導して、配信を高速化
→エッジサーバではコンテンツのキャッシングを行い、オリジンに負荷をかけない

・最適なエッジへの誘導方法
①ドメイン名問い合わせ（クライアント→DNS）
②IPアドレス問い合わせ（DNS→CloudFrontDNS）
③最適なEdgeアドレス応答（CloudFrontDNS→DNS）
④最適なEdgeへアクセス（クライアントからEdge）
⑤キャッシュがある場合：コンテンツ配信
キャッシュがない場合：オリジンサーバから取得

・CloudFront特徴
- 84拠点のエッジサーバ
- 予測不可能なスパイクアクセスへの対応
- ビルトインのセキュリティ機能（WAF連携、DDoS対策）
- 充実したレポート

・動的コンテンツ：ELBでEC2に負荷分散。HTML
静的コンテンツ：S3などで保存

・84エッジロケーション→11リージョナルキャッシュ→オリジン
→オリジンに対するコンテンツ取得を削減

・`CloudFront Distribution`
- ドメインごとに割り当てられるCloudFrontの設定
- 40Gbpsもしくは100,000RPSを超える場合上限申請必要
- HTTP/2対応
- IPv6対応
- CNAMEエイリアスを利用して独自ドメイン名の指定可能
→Route53と合わせた`Zone Apex（wwwがないもの）`も利用可能

・`Gzip圧縮機能`
エッジでコンテンツをGzip圧縮することでより高速にコンテンツ配信
※S3はGzip圧縮をサポートしていないので有効

・`キャッシュコントロール`
- キャッシュヒット率の向上がCDNのポイント
→URLおよび有効化したパラメータ値の完全一致でキャッシュが再利用

・`キャッシュの無効化`
コンテンツごとの無効化パス指定

・`ダイナミックコンテンツ機能`
オリジンサーバに対して下記情報をフォワードすることで、動的なページの配信にも対応
- ヘッダー（必要最小限）
- Cookie（Cookie名と値をセットでCloudFrontがキャッシュ）
- クエリ文字列パラメータの値

・`ダイナミックキャッシング`
リクエストパターンをもとにオリジンへのアクセスルールを個別指定可能

・`カスタムエラーページ`
`4xx系`：クライアントエラー。オリジン側で対処
`5xx系`：サーバエラー。CloudFrontで対処
参考URL：https://goo.gl/NcUQiY

・`読み取りタイムアウト`
CloudFrontがオリジンからの応答を待つ時間を指定
デフォルトは30秒

・`キープアライブタイムアウト`
接続を閉じる前に、CloudFrontがオリジンとの接続を維持する最大時間
デフォルトは5秒

・セキュリティ
- HTTPS対応
- SSL証明書
→専用IPアドレスSSL証明書には申請必要
- `ビューワーSSLセキュリティポリシー`
→クライアントとCloudFront間のSSL/TLSプロトコルとCipherの組み合わせを指定可能
- オリジン暗号化通信
- オリジンカスタムヘッダー
- `GEOリストリクション`
→地域情報でアクセス判定。制御されたアクセスには403を応答
- `署名付きURL`
→プライベートコンテンツ配信。
→署名付きURLを生成する認証サイトにクライアントから認証リクエスト
→認証サイトからEdgeにアクセス※署名付き出ない場合は、403を返す
-オリジンサーバーの保護
→Origin Access Identitiy(OAI)を利用
S3のバケットへのアクセスをCloudFrontからのみに制限
- AWS WAF連携
AWS ShieldによるDDoS攻撃対策
ブロック時は403応答
- AWS ShieldによるDDoS攻撃対策
デフォルトで有効

・CloudFrontレポート・アクセスログ機能
任意のS3バケットに出力可能

・CloudWatchアラームの活用
リアルタイム障害・異常検知

・S3オリジン自動キャッシュの無効化（Invalidation）
S3にアップロード→Lambdaファンクション呼び出し→CloudFront Invalidation APIの呼び出し→CloudFront上でキャッシュの無効化

# Lambda
高度にパーソナライズされたウェブサイト
ビューワーリクエストに応じたレスポンス生成
URLの書き換え
エッジでのアクセスコントロール
リモートネットワークの呼び出し

参考URL：https://www.slideshare.net/AmazonWebServicesJapan/aws-blackbelt-online-seminar-2017-amazon-cloudfront-aws-lambdaedge
コンビニ精算RTAをUMLのシーケンス図で書いてみる

# コンビニ精算RTAをUMLのシーケンス図で書いてみる
## 目的

- UMLの記述の練習をする
- 物事のモデル化をする、考える

## 注目した点

- 客⇔店員、店員⇔レジでタスクが分かれる
- 店員⇔レジのタスクが行われている間、客が次の準備をすることが出来る
- 精算には、品物のスキャン→ポイントカードのスキャン→精算の順序がある

## 完成したシーケンス図
![シーケンス図.png](https://qiita-image-store.s3.amazonaws.com/0/114324/a2c905db-21ee-f837-d4b4-933678f8f102.png)

### UML(PlantUML/VSCodeを利用)

```UML
@startuml
title シーケンス図
客 -> 店員: 品物を渡す
店員 --> レジ: 品物をスキャン
客 -> 店員: ポイントカードを渡す
店員 --> レジ: ポイントカードをスキャン
レジ --> 店員: ポイントカードを戻す
店員 -> 客: ポイントカードを受け取る
レジ -> 店員: 品物をレジ袋に入れる
客 --> 店員: 「支払いICカードで」
店員 --> レジ: ICカードの支払いに設定
店員 -> 客: レジ袋を受け取る
客 --> レジ: ICカードをタッチ
レジ --> 客: ICカード精算完了
店員 -> レジ: 精算完了ボタンを押す
レジ -> 店員: レシートを印刷
店員 -> 客: レシートを渡す
@enduml
```

## 実践してみた結果

- こちらの作業が終わって手持ち無沙汰になることもある
- 現金の場合もモデル図にしたい
- セルフレジではどうか
- ポイントカード、ICカードを置くだけのレジとかあっても良いかもしれない
VScodeにマテリアルテーマをインストールする

# 前置き
[Material Theme](https://marketplace.visualstudio.com/items?itemName=Equinusocio.vsc-material-theme)のページに書いてあることですが、オールイングリッシュで一抹の不安を抱いてる人に向けた記事です。

#インストールの手順
##1
まずVScode内でマテリアルテーマをインストールします。
環境によってコマンドが違うので以下参照。

- **Windows** → `Ctrl + P`
- **Mac** → `Command + P`
- **Linux** → `Ctrl+P`

これをタイプして、出てきた窓に

```
ext install vsc-material-theme
```
と入力しEnter。

##2

[vsc-material-theme](https://github.com/equinusocio/vsc-material-theme/releases/latest)のリポジトリに行き、最新版の.vsixファイルをインストール。
2018.1.22現在ではv1.3.0でした。
<img width="1085" alt="スクリーンショット 2018-01-22 19.32.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/143170/ded109b4-0568-0f6c-474b-e85290d56ea2.png">

##3

VScode内で

- **Windows** → `Ctrl +　Shift + P`
- **Mac** → `Command +　Shift + P`
- **Linux** → `Ctrl　+　Shift +　P`

を入力

するとコマンドパレットが開くので、そこで`shell command`と入力し、
<img width="612" alt="スクリーンショット 2018-01-22 19.36.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/143170/896c8f5f-19b6-9fba-89f7-b31a3448e96d.png">
画像の上のやつでEnter。

するとcodeコマンドが使えるようになるので、シェルで

```
code --install-extension /Path/To/vsc-material-theme-*.*.*.vsix
```

を実行。

```
Extension 'vsc-material-theme-1.3.0.vsix' was successfully installed!
```

と表示されたら成功。

##4
次にシェルで

```
git clone https://github.com/equinusocio/vsc-material-theme.git Equinusocio.vsc-material-theme
```
を実行

##5
これで9割完了！
あとは有効にするだけ


- **Windows** → `Ctrl +　Shift + P`
- **Mac** → `Command +　Shift + P`
- **Linux** → `Ctrl　+　Shift +　P`

これをタイプして、出てきた窓に
`theme`と打って`Preferences: Color Theme`を選択してください。

#おまけ: カラー変更

- **Windows** → `Ctrl +　Shift + P`
- **Mac** → `Command +　Shift + P`
- **Linux** → `Ctrl　+　Shift +　P`

をタイプして出てきた窓に
`Material Theme`と入力し、`Material Theme: Settings` → `Change color variant`と選択して、カラー一覧から好きな色を選択しましょう

#おまけ: アイコン変更
- **Windows** → `Ctrl +　Shift + P`
- **Mac** → `Command +　Shift + P`
- **Linux** → `Ctrl　+　Shift +　P`

で`icon theme`と入力し、`基本設定: ファイル アイコンのテーマ` → `Material Theme Icons`を選択

#最後に
更新されてるかもしれないから、不安なら[Material Theme](https://marketplace.visualstudio.com/items?itemName=Equinusocio.vsc-material-theme)をチェックしてもいいかもね
Gitで特定のブランチとの差分ソースをZipで出力する。

# Gitで親ブランチとの差分ソースをZipで出力する。

リリース時などに使うやつ。:writing_hand:(..　)メモメモ
比較ブランチが`develop`の場合のコマンドです。適宜変更してください。

```shell
git archive --format=zip --prefix=root/ HEAD `git diff --name-only MyBranch` -o archive.zip
```

## 20200330　追記 :pencil: 

上記コマンドだと、削除コミットなどがあった場合にファイルがないというエラーが発生するので、以下のほうがベネです。

```shell
git archive --format=zip HEAD `git diff develop --name-only --diff-filter=AM` -o archive.zip
```

`--diff-filter`でA(Add) と M(Modify)にフィルタしています。
Rustでジェネリクスを絡めた演算子オーバーロード

# はじめに
けっこうまえからRustという言語に注目している。
はっきりいってこの言語はGoやKotlinと比べとっつきづらいので流行ることはないと思うが、
面白い言語なのでひまなときさわったりする。

# 前提知識
とりあえずRustに関して私はチュートリアルを昔読んだ程度の知識しかありません。

# やりたいこと
むかしC++で書いた凸包計算アルゴリズムをRustで書いたらどうなるのか考えてみた。

まずPoint構造体が必要だったのだけど当時はテンプレートで書いていなかったためひとつの型しか扱えないコードになっていた。
そこで、新しくRustで書いてみるならばどうせならジェネリクスで書きたいと思ったのだ。

とうぜんPoint同士の演算も行いたい。しかしこれがチュートリアルやっただけでは少し難しそうだったのでいろいろ試すことになりました。


# 書いてみたコードと実行結果
```rust
use std::ops::{ Add, Sub };

// Point構造体
#[derive(Debug, Copy, Clone)]
struct Point<T> {
    x: T,  // x座標
    y: T,  // y座標
}

// +演算子オーバーロード
impl<T> Add for Point<T> where T: Add<Output=T> {
    type Output = Point<T>;

    fn add(self, other: Point<T>) -> Point<T> {
        Point { x: self.x + other.x, y: self.y + other.y }
    }
}

// -演算子オーバーロード
impl<T> Sub for Point<T> where T: Sub<Output=T> {
    type Output = Point<T>;

    fn sub(self, other: Point<T>) -> Point<T> {
        Point { x: self.x - other.x, y: self.y - other.y }
    }
}


fn main() {
    let a = Point { x: 2, y: 3 };
    let b = Point { x: 3, y: 4 };
    let c = a + b;
    let d = a - b;
    let e = Point { x: 2.0, y: 1.25 };
    let f = Point { x: 5.5, y: 4.0 };
    let g = e + f;

    println!("{:?}", c);
    println!("{:?}", d);
    println!("{:?}", g);
}
```

```txt:出力
Point { x: 5, y: 7 }
Point { x: -1, y: -1 }
Point { x: 7.5, y: 5.25 }
```

# コードの内容
AddトレイトとSubトレイトを用いて+、-の演算子をオーバーロードしました。

where句では型パラメタの制約を記述しています。
今回は型TがAddやSubトレイトを満たすように記述している感じだろうか。
どうも複数の書き方が可能らしく、わかりづらさが加速している。

# さいごに
これだけじゃさみしいのでこのコードを元にどんどん内容を発展させていきたいです。
Haskell で (a == 1 && a == 2 && a == 3) を真にする

Stack Overflow の記事 [Can (a ==1 && a== 2 && a==3) ever evaluate to true?
](https://stackoverflow.com/questions/48270127/can-a-1-a-2-a-3-ever-evaluate-to-true) が元ネタらしい。

このコードは数字を全て `a` と同じ値としてしまうという方針です。

```haskell
-- >>> main 
-- True
main :: IO ()
main = print (a == 1 && a == 2 && a == 3)

-- `A == A = True` となる普通の Eq インスタンスも導出する
data A = A deriving (Eq)

a :: A
a = A

instance Num A where
  -- `A` 型の整数リテラルは全て値 `A` として読む
  fromInteger _ = A
  -- のこりのメソッドはいらないので単に `undefined` にする
  (+) = undefined
  (*) = undefined
  abs = undefined
  signum = undefined
  negate = undefined
```
Golang入門（構造体）

# **Golangについて**
仕事でGolang少し使っていて、個人的好きになったので、
勉強として記事にまとめておきますっ

割と新しいけどフレームワークが充実しているあたり、
流行っている感じがしますねー（てか流行っている…？）

使っていて個人的な感想はこんな感じです。

・GCがあるのでメモリ管理はしなくて良いあたりが素敵b
・ポインタがぁぁああ（未だに曖昧なところがある）
・if文は括弧（）をつかないのか！？
・for文しかない…だと！？
・型は変数の後ろにつけるか？
・try...catchがない!?

Java、PHP、JavaScriptの経験しかないので、
最初は慣れなかったのですが、まぁ慣れです（笑）

ではでは、
入門編として
golangで無くてはならない構造体について書いていきますね。

# **構造体**
Golangでもっとも基本となる構造体です。
こんな感じで書きます。

```go:sample.go
package main

import "fmt"

// 構造体定義
type Human struct {
	Name   string
	Age    int
	Weight float32
}

func main() {
	// インスタンス生成
	skanehira := Human{
		Name:   "skanehira",
		Age:    24,
		Weight: 60.6,
	}

	fmt.Printf("%#v \n", skanehira)
}
```

```shell-session
MacBookPro:Qiita skanehira$ go build sample.go
MacBookPro:Qiita skanehira$ ./sample
main.Human{Name:"skanehira", Age:24, Weight:60.6}
MacBookPro:Qiita skanehira$
```

ちゃんと代入した変数が、出力されていますねー
シンプルで良いと思います。うん。

はじめは、Javaでいうとプロパティだけが詰まったclassと同じ感じかな？という印象です。

ただ、Golangには継承の概念も無ければ、
構造体の中に、メソッドを実装することも出来ないのです。

じゃあ、構造体を元に別の構造体を作ることも、
構造体毎にメソッドの実装もできないのか？
というとそんなことは無いですよっ

というわけで、次回は構造体の拡張とメソッドの実装について書いていきますねー
DynamoDBの特定テーブルをtruncateするためのシェルスクリプト

## 概要

DynamoDBの指定したテーブルをtruncateします。

## 注意事項

* batchWriteItemを使用していないためとても遅いです(要改善)。

## 前提条件

* aws cliがcredentialを含めて設定済みである必要があります。
* jqがインストール済みである必要があります。

## パラメータ

* $1: テーブル名
* $2: パーティションキーのAttribute name
* $3: ソートキーのAttribute name(オプション)

## シェルスクリプト

以下を任意のディレクトリに`truncate_dynamodb.sh`として保存してください。

```bash
#!/bin/sh

TABLE_NAME=$1
P_KEY=$2
S_KEY=$3
REGION=ap-northeast-1
TRUNCATE_LIST=/tmp/truncate.lst_$(date +%s)

if [ -z "$TABLE_NAME" ] || [ -z "$P_KEY" ]; then
        echo "truncate_dynamodb.sh [Table Name] [Partition Key] [Sort Key(Optional)]"
        exit 1;
fi

KEY_LIST="$P_KEY: .$P_KEY"

if [ -n "$S_KEY" ]; then
        KEY_LIST="$KEY_LIST, $S_KEY: .$S_KEY"
fi

echo "Key is '$KEY_LIST'"

aws --region ap-northeast-1 dynamodb scan --table-name $TABLE_NAME | jq -c ".Items[] | { $KEY_LIST  }" > $TRUNCATE_LIST

while read LINE
do
        COMMAND="aws --region "$REGION" dynamodb delete-item --table-name $TABLE_NAME --key "$LINE""
        $COMMAND
done < $TRUNCATE_LIST

rm $TRUNCATE_LIST
```
Docker上MongoDB=v3.6につながらない

# Docker上MongoDB=v3.6につながらない

## Issue
Docker上で動くMongoDBのバージョンを3.6に上げたら、他のコンテナからつなげなくなった

## Solution
MongoDBイメージのDockerfileの`CMD`をに`bind`を以下のように設定
`CMD [ "mongod", "--bind_ip", "0.0.0.0" ]`

## Background
c.f.
https://github.com/mvertes/docker-alpine-mongo/blob/master/Dockerfile
Django Admin: インスタンス権限設定

# はじめに
`django.contrib.admin.ModelAdmin`を作る時、
- `has_change_permission(request, obj=None)`
- `has_delete_permission(request, obj=None)`
上記2つのフックメソッドをオーバーライドすることで、ログインユーザやインスタンスに対して権限を設定することが可能です。
ですが、上記のフックはviewのfunctionとは違い、admin上で呼び出される個所が複数あるため、少し注意が必要です。

# Environments
- Python 3.6
- Django 1.11

# has_change_permission(request, obj=None)
このフックで`obj`にインスタンスが入ってるのは、インスタンスの変更フォームである、
`/admin/{{ app_label }}/{{ model_name }}/{{ object_id }}/change/`
のみです。
これ以外
- `/admin/`: 管理ページトップ
- `/admin/{{ app_label }}/`: appトップ
- `/admin/{{ app_label }}/{{ model_name }}/`: Modelのchangelist
上記3ヶ所で、`obj=None`として呼び出されますので、

```py3:admin.py
def has_change_permission(self, request, obj=None):
    has_perm = super().has_change_permission(request, obj)
    if isinstance(obj, self.model):
        return obj.user == request.user and has_perm
    return has_perm
```
こういう風に分岐が必要になります。

# has_delete_permission(request, obj=None)
`obj`に関しては`change`と同じですが、もう一つ。
Admin actionsとしてビルトインされてる`delete_selected`からこのフックが呼ばれる際、削除しようとする**個々のインスタンスに対する権限チェックをしない**ため、常に`obj=None`になるので

```py3:admin.py
has_perm = super().has_delete_permission(request, obj)
if request.POST.get('action') == 'delete_selected':
    selected_qs = self.model.objects.filter(pk__in=request.POST.getlist('_selected_action'))
    return all([o.user == request.user for o in selected_qs]) and has_perm
```
のような処理が必要です。

# 最後に
そもそも権限がないインスタンスは`get_queryset(request)`でリストから出さないようにしましょう。

# References
[Django Admin: has_delete_permission Ignored for “Delete” Action
](https://stackoverflow.com/questions/38127581/django-admin-has-delete-permission-ignored-for-delete-action)
Jenkins Pipeline から AWS SNS に publish する

Jenkins でのビルド失敗時に AWS SNS で通知を送りたかったので、そのために試行錯誤したメモ。

## AWS SNS について
Simple Notification Service の略で、通知を扱うための AWS のマネージドサービス。AWS SNS にメッセージを Publish することで、設定に応じてメールやチャットツールなどに通知を送ることができる。

AWS SNS の設定方法についてはググればたくさん出てくるので割愛する。

今回は、AWS SNS の Topic は既に作成済みという前提で話をする。

## Amazon SNS Build Notifier について
当初 [Amazon SNS Build Notifier](https://plugins.jenkins.io/snsnotify) というプラグインを使おうとしていたが、これは動かなかった。

リポジトリを見ると 2016 年以降メンテナンスされていないようだし、そもそも Pipeline に対応していないのかもしれない。

## Pipeline: AWS Steps を使う
[Pipeline: AWS Steps](https://plugins.jenkins.io/pipeline-aws) というプラグインの中に snsPublish という機能を見つけて「これはいけそうだぞ」と思って試してみたところ、できた。

Jenkins 公式がメンテしているし、現時点ではこれを使うのがベストっぽい。

## AWS の認証情報を設定する
いくつか方法があるが、ふたつ紹介する。

### `SNS:Publish` 権限のある IAM ロールを割り当てる
Jenkins サーバを Amazon EC2 で運用している場合はこの方法が最善だと思われる。

使用する SNS トピックに対して publish できる権限を付与した IAM ロールを作成し、Jenkins が動いている EC2 インスタンスに対して割り当てるだけ。

サーバ内に認証情報を置いておく必要が無いのでセキュア。

### Jenkins サーバ内に Credentials を設置する
Jenkins サーバが AWS 以外のサーバで動いている場合はこの方法をとるしかない。

Jenkins のビルドは `jenkins` ユーザが実行していたので、`jenkins` ユーザのホームディレクトリ以下の `.aws/credentials` に認証情報が保存されるようにする。

``` console
$ sudo su - jenkins
$ aws configure
```

同じサーバ内で AWS の認証情報が複数ある場合は、Pipeline 定義で [withAWS](https://github.com/jenkinsci/pipeline-aws-plugin#withaws) という step を挟むことで柔軟に認証情報を設定できるらしい。

## Pipeline 定義に通知設定を書く
以下のように書くと「ビルドが失敗した場合」に通知することができる。

``` groovy:Jenkinsfile
pipeline {
    stages {
        // 必ずコケるステージ
        stage('main') {
            steps {
                sh 'false'
            }
        }
    }
    post {
        failure {
            snsPublish(
                topicArn: 'arn:aws:sns:ap-northeast-1:000000000000:xxxxxxxx',
                subject: 'Build failed!',
                message: env.BUILD_URL,
            )
        }
    }
}
```

ビルドを実行すると、無事通知が届くと思う。

## 参考
- [Jenkins \- Pipelineで、ビルド後に通知を送る \| B SIDE](http://b-side.work/2017/04/jenkins-pipeline-post-notification/)
TEST

#matplotlib
-関数の定義

```python3
def MFe(x):
    return (1.0-0.5*x**1.5-0.5*x**2.5)**(1/3)

def BJ(x):
    return (2*J+1)/(2*J)*(1/np.tanh((2*J+1)*x/(2*J)))-1/(2*J)*(1/np.tanh(x/(2*J)))
```

-線種の定義

```python3
linestyles=[
    (0,()),
    (0,(1,1)),
    (0,(2,2)),
    (0,(3,3)),
    (0,(3,1,1,1)),
    (0,(2,2)),
]

from cycler import cycler
plt.rcParams['axes.prop_cycle'] = cycler('color', ['0', '0.5']) * cycler('linestyle', linestyles)
```
WSL上でReactNative開発はじめたらExpoがTimeout

# WSL上でReactNative開発はじめたらExpoがTimeout

## Issue
WSLでReactNativeの開発をはじめようと思い公式のGetting Startedを追っていったところ、実機でExpo使ってAppの確認ができずに死亡（ローカルネットワークのSocket Timeout）

## Solution
- `npm install -g create-react-native-app`
- `create-react-native-app /path/to/AwesomeProject`
- Expoのアカウント作成（https://expo.io）
- `npm install -g exp`
- `exp login` でExpoアカウントにLogin
- `cd /path/to/AwesomeProject`
- `exp start` （`npm start` の代わり）

## Backgronud
c.f.
https://forums.expo.io/t/expo-ide-with-window-bash/2103
Pythonステップアップ講座 ～文字列処理～

最近 Python 3.X に移行した。Python 2.X と比べて文字列回りも便利になっているのでまとめ。知識のアップデートにどうぞ。コメントも歓迎。 

# フォーマッティング

`Hello World` を出力してみよう。まずはシンプルに↓

```python
>>> h, w = "Hello", "World"
>>> h + ' ' + w
'Hello World'
```

Python 2ではこれが多いやり方だった↓

```python
>>> h, w = "Hello", "World"
>>> '%s %s' %(h,w)
'Hello World'
```

変数が多いとわかりずらいのでこんな書き方もできる↓

```python
>>> h, w = "Hello", "World"
>>> '%(h)s %(w)s' % locals()
'Hello World'
>>> '%(h)s %(w)s' % {"h":h, "w":w}
'Hello World'
```

format関数を使うのが Python3 での標準だと思う↓　よく読んでマスターしよう
https://docs.python.jp/3/library/string.html#format-string-syntax


```python
>>> h, w = "Hello", "World"
>>> "{} {}".format(h,w)
'Hello World'
>>> "{0} {1}".format(h,w)
'Hello World'
>>> "{h} {w}".format(h=h,w=w)
'Hello World'
>>> "{h} {w}".format(**locals())
'Hello World'
```

Python 3.6 だとこんな書き方もできる。めちゃくちゃ便利↓ 
https://docs.python.jp/3/reference/lexical_analysis.html#formatted-string-literals

```python
>>> h, w = "Hello", "World"
>>> f"{h} {w}"
'Hello World'
```

右づめ、ゼロパディング、3桁ごとのカンマ挿入、有効数字の指定なども当然できるので押さえておく↓

```python
>>> "{:>10}".format("Hello")
'     Hello'
>>> "{:05d}".format(10)
'00010'
>>> "{:,d}".format(10000)
'10,000'
>>> "{:.3f}".format(3.141592)
'3.142'
```

面白いのはオブジェクトを渡すことが出来る点。オブジェクトの `__str__()` を呼び出したり、 `__repr__()` を呼び出したりできる↓

```python
>>> class A(object):
...   def __str__(self): return "Hello World"
...   def __repr__(self): return "Hello"
...
>>> a = A()
>>> f"{a}"
'Hello World'
>>> f"{a!s}"
'Hello World'
>>> f"{a!r}"
'Hello'
```

f書式ではオブジェクトの変数も渡せる↓

```python
>>> a = type('',(),{})
>>> a.hello = "world"
>>> f"{a.hello}"
'world'
```

# マルチバイト・エンコーディング周り
python2で日本語を扱う場合こんな感じ

- スクリプト内でのマルチバイト文字
  - ファイル冒頭に `#coding:utf8` などエンコーディングを指定
  - u書式を使ってこんな感じで指定する `hello = u"こんにちは"`
  - こうやってもよいが、、、やめた方がいいかも `hello = "こんにちは".decode("utf8")`
- ストリームからのマルチバイトの入力
  - データを読んで`decode`を呼び出す: `data = open("a.text").read().decode("utf8")`
- ストリームへのマルチバイトの出力
  - エンコードして書き込み: `open("output.txt", "w").write(data.encode("utf8"))`

python3 ではマルチバイト対応ができている

- スクリプト内でのマルチバイト文字
  - ファイル冒頭に `#coding:utf8` などエンコーディングを指定
  - こんな感じで指定する `hello = "こんにちは"`
  - これはエラーになる。decodeは不要（もうされている） `hello = "こんにちは".decode("utf8")`
- ストリームからのマルチバイトの入力
  - ファイル開くときにエンコーディングの指定 `open("a.txt", encoding="utf8").read()`
- ストリームへのマルチバイトの出力
  - エンコードして書き込み: `a = open("text.txt", "w", encoding="utf8"); a.write("こんにちは"); a.close()`


力尽きたのでこの辺で。
Sublime Text 3 (Sublime Text 2) > Error > Errors occured while converting XXX with Shift_JIS encoding.

```txt:動作環境
Sublime Text 3, Build 3143
  + ConvertToUTF8 インストール済み

Sublime Text 2, v2.0.2 Build 2221
  + ConvertToUTF8 インストール済み
```

### エラー

Shift_JISのファイルを開こうとしていた。
Encodingを聞かれたので「Shift_JIS」を選択した。

下記のエラーが出た。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/0dfd8a37-5c6b-9c71-dc35-440dc6415489.png)

### 対処

Encodingの選択ダイアログにおいて「Shift_JIS」ではなく「CP932」を選択するとエラーは出なかった。

関連: [本当は怖くないCP932](https://qiita.com/kasei-san/items/cfb993786153231e5413)

対象ファイル以外は「Shift_JIS」で問題なく開く。
どのようにして、対象ファイルだけがCP932となってしまったのかは不明。
設計が破綻しにくいCSSの書き方

デザインと並行してコーディングを進めざるを得ない案件では、
デザインの全貌がわからないままコーディングを進めなくてはならない場合があるため、例外スタイルの多発でCSSが煩雑化し、設計が破綻しやすい。（デザイナー含む）

**デザイナー「このページだけ例外で、ボタンのmargin-topを○○pxにして欲しい。」× ∞**

そんな場合に例外スタイルを管理して、設計が破綻しにくく、効率良くコーディングを進めるCSSの書き方。

#基本設計
HTMLとCSSの基本設計。

###HTML
ページ識別用のclassを付与する。（CSSシグネチャ）
（例：`<body>`にclass="page-xxx"）

>CSSシグネチャとは、ページのbodyなどにidやclassを設定し、 CSSでページごとのスタイルの切り替えを行う手法です。



```html:a.html
<body class="page-a">
  <div class="foo">
    <p>ふー</p>
    <button class="btn" type="button">ボタン</button>
```

```html:b.html
<body class="page-b">
  <div class="bar">
    <p>ばー</p>
    <button class="btn" type="button">ボタン</button>
```

###CSS
CSS大きく分けて共通CSSとページ固有CSSの２つ。

```text:CSS構成
├── common.scss　…共通CSS
├── page-a.scss　…ページ固有CSS（例：aページ用CSS）
├── page-b.scss　…ページ固有CSS（例：bページ用CSS）
```

```scss:common.scss
// 例）共通ボタン コンポーネント ---------
.btn {
  margin-top: 10px;
  width: 100px;

  // バリエーション -------
  &.btn-s {
    margin-top: 5px;
    width: 50px;
  }

  &.btn-l {
    margin-top: 20px;
    width: 200px;
  }
}
```

```scss:page-a.scss
// 例）a.htmlにしかない要素
.foo {
  background: red;
  width: 500px;
}
```

#コーディングの進め方
デザイナー「ページAだけ例外でボタンのmargin-topを30pxにして欲しい。」

###Badパターン
**1.ページ固有CSSの記述する。**

```scss:page-a.scss
.hoge {
  background: red;
  width: 500px;
}

.btn {
  margin-top: 30px;
}
```

同じセレクターに対するスタイルを複数のCSSに記述すると、スタイルを俯瞰して見にくくなり、煩雑化して保守性が低くなる。


**2.共通CSSにバリエーションを増やす。**

```scss:common.scss
.btn {
  margin-top: 10px;
  width: 100px;

  // バリエーション -------
  &.btn-s {
    margin-top: 5px;
    width: 50px;
  }

  &.btn-l {
    margin-top: 20px;
    width: 200px;
  }

  &.btn-mt-l {
    margin-top: 30px;
  }
}
```

例外スタイルに対してバリエーションを増やすと、バリエーションの管理が煩雑化して保守性が低くなる。


###Goodパターン
**ページ識別用のclassで共通CSSを上書きする**

```scss:common.scss
.btn {
  margin-top: 10px;
  width: 100px;

  // バリエーション -------
  &.btn-s {
    margin-top: 5px;
    width: 50px;
  }

  &.btn-l {
    margin-top: 20px;
    width: 200px;
  }

  // 例外 ---------------
  .page-a & {
    margin-top: 30px;
  }
}
```

Goodパターンで制作を進めることで、例外スタイルを管理がしやすくなり、
以下のようなタイミングでスムーズにリファクタリングを実行できるようになる。


**リファクタリングを実行するタイミング**

```scss:common.scss
.btn {
  margin-top: 10px;
  width: 100px;

  // バリエーション -------
  &.btn-s {
    margin-top: 5px;
    width: 50px;
  }

  &.btn-l {
    margin-top: 20px;
    width: 200px;
  }

  // 例外 ---------------
  .page-a &,
  .page-c &,
  .page-d & { // ケース1
    margin-top: 30px;
  }

  .page-e & { // ケース2
    margin-top: 32px;
  }

  .page-f &,
  .page-g & { // ケース3
    margin-top: 50px;
  }
}
```

**ケース1**
3回以上同じパターンが出てきた場合、バリエーションとして設計し直す。

**ケース2**
プロパティの値が別のスタイルの僅差の場合、上記にスタイルに統合出来ないかデザイナーに確認する。

**ケース3**
3回以下の場合は、まだ例外としておく。

#まとめ
- 複数のCSSに同じセレクターのスタイルを書かない。
- 例外スタイルを俯瞰して管理する。
- 同じ例外スタイルが3回出てきた時にバリエーションとして整理する。

上記の３点を意識しておくことで、デザイン上で例外スタイルが多発しても設計が破綻しにくいCSSを書くことできる。
Windows7のログオン/オフをトリガーにPOSTイベントを投げる

# TL:DR
ログオン/オフ [^1]時にPower Shell Scriptを実行し、
 `Invoke-RestMethod` コマンドを用いてPOSTイベントを投げる

# 準備
1. Power Shell v3.0 をインストールする [^2]
2. Power Shell のセキュリティポリシを変更する [^3]

管理者権限でPowerShell起動後、以下のコマンドを実行する

```
Set-ExecutionPolicy RemoteSigned
```

# POSTイベントを投げるスクリプトの作成
任意のエディタで `<ファイル名>.ps1` を作成する。

```
Invoke-RestMethod -Uri "YOUR URL" -Method POST
```

# スクリプトを登録
## ファイル名を指定して実行
```
gpedit.msc
```
## 画像のようにログオン/オフのプロパティを開く
![image.png](https://qiita-image-store.s3.amazonaws.com/0/82600/749e07e5-65de-0db5-84d2-e88783f79894.png)

## スクリプトをディレクトリに配置
画像下側の「ファイルの表示」を押下後、エクスプローラが開く。
エクスプローラより開かれたディレクトリに Power Shell Script を配置する

## 登録
画像右側の「追加」を押下後、スクリプトを選択する。

[^1]: [スタートアップ、シャットダウン、ログオン、およびログオフのスクリプトを使用する](https://technet.microsoft.com/ja-jp/library/cc753404(v=ws.11).aspx)
[^2]: [Windows Power Shell 3.0 を Windows7 にインストールする手順](https://qiita.com/busonx/items/9e88804e6b85432e827a)
[^3]: [セキュリティポリシ変更](https://blog.putise.com/powershell%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%E3%81%AEps1-%E5%AE%9F%E8%A1%8C%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%84%E3%80%82%E5%AE%9F%E8%A1%8C%E3%81%A7%E3%81%8D%E3%82%8B%E3%82%88%E3%81%86)
angular-cliで'Cannot find module '@angular-devkit/core'のエラーが出るようになった。

# エラー内容

```
$ ng --version
Error: Cannot find module '@angular-devkit/core'
    at Function.Module._resolveFilename (module.js:485:15)
    at Function.Module._load (module.js:437:25)
    at Module.require (module.js:513:17)
    at require (internal/module.js:11:18)
    at Object.<anonymous> (/Users/homahi/workspace/rxjs/node_modules/@angular-devkit/schematics/src/tree/virtual.js:10:16)
    at Module._compile (module.js:569:30)
    at Object.Module._extensions..js (module.js:580:10)
    at Module.load (module.js:503:32)
    at tryModuleLoad (module.js:466:12)
    at Function.Module._load (module.js:458:3)
                                              
```
いつの間にかエラーが出るようになった

yarn時にもwarningが出てる

```
warning "@schematics/angular@0.1.16" has unmet peer dependency "@angular-devkit/core@0.0.28".
warning "@angular-devkit/schematics@0.0.51" has unmet peer dependency "@angular-devkit/core@0.0.28".
```

# 対策

Angular-Cliをバージョンアップ

```
$ npm uninstall -g @angular-cli
$ npm cache verify
$ npm install -g @angular/cli@latest
```

治った

```
% ng --version                                                                                                                                                                    ~/workspace homahi-2

    _                      _                 ____ _     ___
   / \   _ __   __ _ _   _| | __ _ _ __     / ___| |   |_ _|
  / △ \ | '_ \ / _` | | | | |/ _` | '__|   | |   | |    | |
 / ___ \| | | | (_| | |_| | | (_| | |      | |___| |___ | |
/_/   \_\_| |_|\__, |\__,_|_|\__,_|_|       \____|_____|___|
               |___/
    
Angular CLI: 1.6.5
Node: 8.1.2
OS: darwin x64
Angular: 
...

```
gmaps4railsのmockの作成の仕方

#　gmaps4railsでのrsepc

gmaps4railsは住所からgeocodeを特定のし、google_mapを表示出来るgemである

```Gemfile
gem "gmaps4rails"
gem "geocoder"
```

しかし、テスト(rspec)を書いていくと

```
 WebMock::NetConnectNotAllowedError:
       Real HTTP connections are disabled. Unregistered request: GET http://maps.googleapis.com/maps/api/geocode/json?address=%5B%22%E3%80%92222-0033%22%5D&language=en&sensor=false with headers {'Accept'=>'*/*', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'User-Agent'=>'Ruby'}

       You can stub this request with the following snippet:

       stub_request(:get, "http://maps.googleapis.com/maps/api/geocode/json?address=%5B%22%E3%80%92222-0033%22%5D&language=en&sensor=false").
         with(headers: {'Accept'=>'*/*', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'User-Agent'=>'Ruby'}).
         to_return(status: 200, body: "", headers: {})
```

→要はテストでは実際にhttpアクセスを使えないよとの事。
gem内で住所を取得するために、API通信をしているためだ。


# 対応方法

webmockを入れます。
→dummy_request的な事ができます。

```Gemfile
gem 'webmock'
```

下記のような感じで、createするまえに、stubを登録してあげることで
実際のAPIアクセスではなく、dummyのレスポンスが返ってきます。

```spec/factories/places.rb
require 'webmock'
  
FactoryBot.define do
  factory :place do
    sequence(:name) { |i| "会場名#{i}" }
    address { 
      %w(
      〒102-8321 東京都千代田区北の丸公園２−３
      〒222-0033 神奈川県横浜市港北区新横浜３丁目10番地
      〒540-0002 大阪府大阪市中央区大阪城3番1号
      ).sample(1)
    }

    before :create do |place| 
      WebMock.allow_net_connect!(:net_http_connect_on_start => true)
      WebMock.enable!
      WebMock.stub_request(:get, "http://freegeoip.net/json/76.24.18.47").
      with(:headers => {'Accept'=>'*/*',
        'User-Agent'=>'Ruby'}).
      to_return(:status => 200,
        :body => '{
          "ip":"76.24.18.47",
          "country_code":"US",
          "country_name":"United States",
          "region_code":"MA",
          "region_name":"Massachusetts",
          "city":"Cambridge",
          "zipcode":"02138",
          "latitude":42.38,
          "longitude":-71.1329,
          "metro_code":"506",
          "area_code":"617"}',
        :headers => {}
      )
    end
    
  end
end

```
Coursera DeepLearning Course3 Structuring Machine Learning Projects Week1 学習メモその1

**随時更新中**

# はじめに
この週では実際に機械学習・DeepLearnigの技術をプロジェクトに導入してシステムの開発・構築を進めていく際のノウハウを紹介している。


- Week1で学習すること
 - メトリクスの選定 
 - 訓練・テストデータセットの分割
 - 上限理論値(Bayes Error)の設定
 - Human Performanceを上回るには

# Setting up your goal
## Single Number Evaluation Metric
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">Single Number Evaluation Metric (C3W1L03) <a href="https://t.co/nGqalr8C4Y">https://t.co/nGqalr8C4Y</a> <a href="https://twitter.com/YouTube?ref_src=twsrc%5Etfw">@YouTube</a>さんから</p>&mdash; wakame (@wakame1367) <a href="https://twitter.com/wakame1367/status/955054919555231744?ref_src=twsrc%5Etfw">2018年1月21日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

F値(F1-Score)および再現率(Recall)、適合率(Precision)について、この講座では簡単な説明程度で済ませているため
復習したい場合は下記リンクが詳しい。
[F値 - 機械学習の「朱鷺の杜Wiki」](http://ibisforest.org/index.php?F%E5%80%A4)
[Coursera Machine Learning (6): 機械学習のモデル評価（交差検定、Bias & Variance、適合率 & 再現率）](https://qiita.com/katsu1110/items/97c3f98a987ea92b2cc1)

### ２値分類の場合

以下のような分類器A, Bがあり、どちらを正式採用するかで悩んだときは再現率と適合率、F値を求め
F値のそれぞれの値で分類器の優劣を判断する。

| 分類器 | 適合率[%] | 再現率[%] | F値[%] |
|:-:|:-:|:-:|:-:|
| A | 90  | 89  | 89.5 |
| B | 85  | 91  | 87.9 |
Development Set(= Cross Validation Set)と上記手順を用いて作業を加速させる。
JSONでPOSTしたものをpythonで使う方法

自作API(flask使用)を試す時にcurlを使ってJSONをPOSTしようと思ったらハマったのでメモ

まずcurlを使ってデータをPOSTするのに

```sh
curl http://localhost:8000/post_data -X POST -H "Content-Type: application/json" --data '{"key": "value"}'
```

ってやったら`b'{"key":"value"}'`の形でPOSTされる。
最初はここをあまり詳しく見ていなくて

```py
@app.route('/post_data', methods=['GET', 'POST'])
def check():
    if request.method == 'POST':
        data = request.data['key']
```

って使っていたのでエラーが出た。
curlのオプション指定が悪いのかなぁとか思ったけどこれ以外になさそうなので多分オプション指定は間違えていない。

```py
@app.route('/post_data', methods=['GET', 'POST'])
def check():
    if request.method == 'POST':
        data = request.data.decode('utf-8')
        data = json.loads(data)
        img_url = str(data['key'])
```

って感じでbytes型をstringに変換してそこからjsonに変換して使用。

### 追記(2020年5月13日)

記事投稿時(2018年1月)からflaskに触れておらず知らなかったのですが
今は

```py
@app.route('/post_data', methods=['GET', 'POST'])
def check():
    if request.method == 'POST':
        data = request.json['key']
```

こちらでいけるみたいです。(mimeがapplication/jsonで送られている場合)
これなら苦しまなさそう！
[参考](https://flask.palletsprojects.com/en/1.1.x/api/#flask.Request.json)
いまどきJavascript　基本の「き」

フロントエンド周りの用語は流行り廃りが激しいとよく言われますが、 
そもそもどんなものがあるのか、どんな特徴があるのかなど迷子になったので、 
自分なりに系統立てて理解するためにまとめてみました。

間違いがあればお気軽にコメントいただければと思います。
主に、Javascript周りをまとめていきます。

# Javascriptの仕様

Javascriptは歴史的にブラウザによる独自の拡張などが起きたため、  
標準化のため、ECMAScriptが開発されました。

|    公開日    |    バージョン    |
|:------------------|:------------------|
| 2009年12月             |      5        |
| 2011年6月 | 5.1|
| 2015年6月| 6(2015)|
| 2016年6月 | 2016  |
| 2017年6月 | 2017 |
|策定中|2018|

時々見かけるES5 やES6 というのはECMAScriptのバージョンで、 
上記の様に、バージョン6 (ES6) からバージョンに年号をつけることに変えたため、 
ES6 だけ、表記が ES6（ES2015)などと併記なっていることがあります。

# ブラウザのレンダリングとJavascriptエンジン
前提として、HTMLやCSSはブラウザのレンダリングエンジンが処理をし、 
JavascriptはJavascriptエンジンが解釈して実行します。
ブラウザごとの組み合わせは以下のようになっています。


|   ブラウザ | レンダリングエンジン|Javascriptエンジン|
|:------------------|:------------------|:------------------|
| Chrome   | 旧Webkit→Blink  |V8|
|Safari|WebKit|JavaScriptCore|
|Firefox|Gecko|SpiderMonkey|
|IE|Trident|Chakra|
|Edge |EdgeHTML|Chakra|


各エンジンごとに、若干解釈の仕方が違うため、 
この差異を埋めるために、書き方を工夫する必要があります。

# 差異を埋めるためのトランスパイラ
この差異を一つ一つ勉強しなくても良いように、
Javascriptのトランスパイラを利用し、ブラウザが解釈できる
生のJavascriptを生成します。 
(トランスパイラとはプログラミング言語で書かれたプログラムのソースコードを、 
別のプログラミング言語の同等のコードを目的コードとして生成する、ある種のコンパイラ)

前述のES6等の新しい仕様を安全に使うために
[Babel](https://babeljs.io/)  を利用します。


# Javascriptを生成できるスクリプト言語
素のJavascriptでは、クラスのサポートなどが特に無く、 様々な問題を抱えていたため(ES6以前)
その問題を解消するために、JavaScriptの代替(alternative)ということで「altJS」と呼ばれる言語が生まれました。

|  altJs 言語名 |特徴|
|:------------------|:------------------|
| TypeScript | 静的型付け機能|
| CoffeeScript   |シンプルでrubyライク|
| JSX (Dena社製)|静的型付け機能　速い|

# シンタックスとしてのJSX
altJSとしてのJSXとは別に、シンタックス(記法)としてJSXがあり、
JavaScriptを拡張した言語でReactに使われています。
これも同様に、JSXをJavascriptに変換する必要があります。

長くなったので基本の「ほ」みたいなのを後でまとめます。

モジュールバンドラ
タスクランナー
Package Manager
Frameworkなど。

読み物としてこちらもおすすめです。
https://medium.com/japan/2016%E5%B9%B4%E3%81%ABjavascript%E3%82%92%E5%AD%A6%E3%81%B6%E3%81%A8%E3%81%93%E3%82%93%E3%81%AA%E6%84%9F%E3%81%98-b969f5767d7c

# 参考記事
https://ja.wikipedia.org/wiki/ECMAScript
Roadmap to becoming a web developer in 2018
https://github.com/kamranahmedse/developer-roadmap
https://qiita.com/tuno-tky/items/74ca595a9232bcbcd727
https://qiita.com/kawax/items/d960a7d92b85dcd6e8c4
「JSX」って名前のものが色々あって混乱する
https://qiita.com/ConquestArrow/items/29fc478f48862a4d14fb
今更ながらブラウザの違いが気になったので、Chrome・Safari・Firefox・IEのエンジンを調べてみた
https://liginc.co.jp/348669
MySQL binlog を眺める

MySQL では binlog が replication の柱になっている。`mysqlbinlog` コマンドで[状態が確認できる](https://dev.mysql.com/doc/refman/5.7/en/mysqlbinlog-row-events.html)。

Group Replication での[設定](https://dev.mysql.com/doc/refman/5.7/en/group-replication-configuring-instances.html)を基本に、動作を確認してみる。

```test1.cnf
[mysqld]
basedir=/usr
datadir=/var/tmp/test1

port=24801
socket=/var/tmp/test1.sock

server_id=1
gtid_mode=ON
enforce_gtid_consistency=ON
master_info_repository=TABLE
relay_log_info_repository=TABLE
binlog_checksum=NONE
log_slave_updates=ON
log_bin=binlog
binlog_format=ROW

transaction_write_set_extraction=XXHASH64
loose-group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
loose-group_replication_start_on_boot=off
loose-group_replication_local_address="127.0.0.1:24901"
loose-group_replication_group_seeds= "127.0.0.1:24901,127.0.0.1:24902,127.0.0.1:24903"
loose-group_replication_bootstrap_group=off

binlog_rows_query_log_events=TRUE
```

簡単にセットアップするなら次の 2 行で（Ubuntu での下ごしらえ参照）。

```
mysqld --defaults-file=test1.cnf --initialize-insecure
mysqld --defaults-file=test1.cnf
```

mysqlbinlog でログを眺める。

- 通常はファイルを読み取って STDOUT に表示する。
- `-R` で remote server から読み取って STDOUT に表示するようにスイッチできる。接続先のオプションは必要。
    - `--raw` を付けると remote server から読み取ったものを再び手元のディスクに書き出せる。
    - `--stop-never` を付けるとストリーミング動作する。
- binlog の中身は `BINLOG` 文で入っている（[構文](https://dev.mysql.com/doc/refman/5.7/en/binlog.html)）。`BINLOG` 文の中身をさらに疑似 SQL にデコードして表示できる。

```
mysqlbinlog -vv -R --stop-never -S /var/tmp/test1.sock -uroot ""
```

binlog の動作モードで、組み合わせがいくつかあるので、要件は確認してからパターンを探すべし。

- SBR / RBR
- GTID : [解説](http://bizstation.hatenablog.com/entry/2016/05/19/091030)

## See also

- MySQL 5.7 source tree の中に `libbinlogstandalone` が準備されている。
    - この前身として `libbinlogevents` というライブラリが、かつて MySQL labs で公開されていた[らしい](http://tech.geniee.co.jp/entry/sync-mysql-binlog-to-cache)。
    - さらにその昔は [libreplication](https://launchpad.net/mysql-replication-listener) と呼ばれていたらしい。
    - `libreplication` の API は [binlog API](https://www.slideshare.net/mkindahl/binary-log-api-presentation-oscon-2011) とも呼ばれていた[らしい](https://www.slideshare.net/techblogyahoo/mysql-binlog-events-mysqluc15)。
    - で、`libbinlogstandalone` は、ソースからビルドするとライブラリが生成される。生成されるのだがインストールされない。パッケージでインストールではこれが入らないのが難点。
- [maxwell](http://maxwells-daemon.io/) という java で動作するプログラムがある。binlog のストリームを json ストリームとして眺めることもできる。
    - Java
    - 内部的には [mysql-binlog-connector-java](https://github.com/shyiko/mysql-binlog-connector-java) で接続している。
- [python-mysql-replication](https://github.com/noplay/python-mysql-replication)
    - python ライブラリ
    - pymysql 依存
    - これに依存したプロジェクト多数
- [kodama](https://github.com/y310/kodama)
    - ruby 実装
- [binlog-parser](https://github.com/zalora/binlog-parser)
    - golang 実装
    - outdated
    - 動作させられなかった
- [ybinlogp](https://github.com/Yelp/ybinlogp)
    - C 実装 make する
    - シンプルに binlog ファイルを読む機能のみ
    - テキスト出力も構造化されていない

## Ubuntu での下ごしらえ

Ubuntu mysql-server パッケージでバイナリを準備するのが簡単。ただしパッケージ版は mysqld の書き込み先が AppArmor で制限されている。上記の例を実行するには、いったん解除するのが簡単。

```
systemctl stop apparmor
/etc/init.d/apparmor teardown
```
GASのscript/project/user/documentという言葉の範囲について

## Script/Project/User/Document

GASのAPIにはそれぞれのクラス・メソッドに適応範囲を示す様な単語がついてるケースがある

|適応範囲を示す単語|たとえば|
|---|---|
|Script|PropertiesService.ScriptPropeties|
|Project|ScriptApp.getProjectTrigger|
|User|PropertiesService.UserProperties|
|Document|PropertiesService.DocumentPropeties|

## それぞれのスコープの説明

僕もいまいちわかってなかったんだけどいろいろ検証したのでその結果とそこからわかったことを書いときます。

* [propertyのスコープを検証したとき](https://qiita.com/nazomikan/items/55c9fd692b41c4d93c04)
* [triggerのスコープを検証したとき](https://qiita.com/nazomikan/items/36cff4b2ae50a83e29bf)

### Script

実行してるscriptに紐づくスコープ。
scriptをアドオン化して公開するなどした場合は、それをインストールした場合、全利用ユーザー間・全ドキュメント間で共有される空間になるので注意

### Project

Script x User的な感じのスコープ。
ユーザーごとにスコープはわかれるけど、その中でscriptが共通なら、たとえドキュメントが違っていても同じものを参照できる

### User

同一ユーザー内で共通化されるスコープ
ユーザーが同じなら、ドキュメントが違ってもscriptが違っても同じものを参照できる。

### Document

ドキュメントに紐づくスコープ
ユーザーが別でも同じドキュメントを見ていれば、そのユーザー間で共有できる。
ドキュメントが違ってれば参照できない。

## 最後に

間違ってたらおしえてください。
yahoo画像検索から画像をスクレイピングするRubyスクリプト

# スクリプトの概要
指定したワードでのyahoo画像検索の検索結果から、画像をスクレイピングして保存するRubyスクリプトです。元々、Pythonでこの処理を行うスクリプトを書かれている方がいらっしゃったので、同じ処理を行うスクリプトをRubyで書いてみました。

## 参考にしたページ
[Yahoo、Bing、Googleでの画像収集事情まとめ](https://qiita.com/ysdyt/items/565a0bf3228e12a2c503)
[スクレイピング初心者がpythonでかわいい猫ちゃん画像をコマンド一発でネットから収集してみた](http://karaage.hatenadiary.jp/entry/2017/08/23/073000)

# スクリプトのコード

```ruby:picture_from_yahoo.rb
#!/usr/bin/env ruby

require 'open-uri'
require 'nokogiri'

class Fetcher
  def initialize(ua='')
    @ua = ua
  end

  def fetch(url)
    p url
    html = open(url)
    body = html.read
    mime = html.content_type
    return body, mime
  end
end

$fetcher = Fetcher.new

def fetch_and_save_img(word)
  data_dir = word.to_s + '/'
  Dir.mkdir(data_dir) unless File.exist?(data_dir)

  img_url_list(word).each_with_index do |img_url,i|
    sleep(1)
    img, mime = $fetcher.fetch(img_url)
    next if mime.nil? or img.nil?
    ext = ''
    if mime.include?('jpeg')
      ext = '.jpg'
    elsif mime.include?('png')
      ext = '.png'
    elsif mime.include?('gif')
      ext = '.gif'
    else
      next
    end
    result_file_name = data_dir + i.to_s + ext
    File.open(result_file_name, 'w') do |file|
      file.puts(img)
    end
  end
end

def img_url_list(word)
  url = URI.escape("https://search.yahoo.co.jp/image/search?n=60&p=#{word}&search.x=1")
  content, mime = $fetcher.fetch(url)
  doc = Nokogiri::HTML.parse(content)
  a_list = doc.css('a[target="imagewin"]')
  # open-uriはリダイレクトに対応していない。エラーを回避するために、画像ファイルのリンクだけを抽出する
  # 重複要素も除いておく
  img_urls = a_list.map {|each| each.attr('href')}.select{|str| str.start_with?('http')}.select{|str| str.end_with?('jpg','png','gif')}.uniq
end

if ARGV[0].nil?
  puts "picture's word is not find."
  puts "ruby picture_from_yahoo.rb [word]"
  exit
end

word = ARGV[0]
fetch_and_save_img word
```
# 使い方
実行時に検索ワードを引数として渡すと、画像検索の検索結果の画像をディレクトリに保存してくれます。
```
./picture_from_yahoo.rb "猫"
```
AWSでhomebrew

AWSでhomebrewを使おうと思ってメモ。

## とりあえず検索して出たものを使ってみる

```
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```
Mac用のコードだったっぽい。アホすぎ。

でもなんか言われてる

```
See Linuxbrew: http://linuxbrew.sh/
```

[Linux brew](http://linuxbrew.sh/)をみてみよう

## コード書いてあるやん

```
sh -c "$(curl -fsSL https://raw.githubusercontent.com/Linuxbrew/install/master/install.sh)"

test -d ~/.linuxbrew && PATH="$HOME/.linuxbrew/bin:$HOME/.linuxbrew/sbin:$PATH"
test -d /home/linuxbrew/.linuxbrew && PATH="/home/linuxbrew/.linuxbrew/bin:/home/linuxbrew/.linuxbrew/sbin:$PATH"
test -r ~/.bash_profile && echo "export PATH='$(brew --prefix)/bin:$(brew --prefix)/sbin'":'"$PATH"' >>~/.bash_profile
echo "export PATH='$(brew --prefix)/bin:$(brew --prefix)/sbin'":'"$PATH"' >>~/.profile

brew install hello
```

たまたまルート権限で実行していたら怒られました。Don't run this as root!

```
brew
```

でhelpが出てきてたらインストール成功していると思います。

```
brew -v
```

でもいいです。