OmniAICreator/Qiita-1.07M huggingface dataset:
Excel 2013 > セルの背景色を塗ったり、塗りつぶしなしにしたり > 手順の考察

```txt:動作確認
Office2013
Windows 8.1 pro
```

自分の仕事の中で以下のような作業をよくする。

A. 特定のセルに異なる色を付ける
B. 色の付け間違いをした時に「塗りつぶしなし」にする

作業Aと作業Bを行き来するときに無駄が多い。

その理由として、「色を付けた」時と「塗りつぶしなし」にした時に「その状態を保持」してしまうため。

以下は作業の具体例。

1. 特定のセルをオレンジ色に塗る
   - 色がオレンジになる
2. 余分なセルの色を「塗りつぶしなし」にする
   - 色がない状態になる
3. 別のセルをオレンジに塗る
   - <font color=red>色をオレンジに選択しなおす必要がある</font>

2の作業を一番最後に回すくらいしか、作業の改善方法が見つかっていない。
同じ色を塗り続けるにはCtrl+Yを使っているが、色がない状態になってしまうと、これは有効ではなくなる。

理想としては、ショートカットで2の手順を一時的にしつつ、色パレットの色はオレンジのままであること。


## ショートカット

関連ショートカットは以下であるが、これを使ったとしても上記の問題はなくならない。

### セルに色を塗る

- Alt + H + H
- 矢印キーで指定の色に移動
- Enter

マウス操作と比べて早いかは微妙

### セルの色を「塗りつぶしなし」にする

- Alt + H + H + N

こちらは速い。

参考 http://qiita.com/ystg/items/5b59df9c8d11594be225

## 現状の最適解

現在知っている知識での最適解

1. 色1を塗る (例: オレンジ)
   - セルを選択し、マウスで色パレットからオレンジを選択
   - 以降のセルはCtrl+Yで塗る
       - 左手 Ctrl+Y
       - 右手 マウス, の組合せが速い
2. 色2を塗る (例: 緑)
   - セルを選択し、マウスで色パレットから緑を選択
   - 以降のセルはCtrl+Yで塗る
3. 塗りつぶしなしにする
   - 余分なセルを選択し、Alt + H + H + N
   - 以降のセルはCtrl+Yで塗りつぶし解除する
  
一番最後の手段としては、「ショートカットの登録」。
UI 平均分佈 和 layout_weight - Android

今天想要在 Android 上達到「平均分佈按鈕」這件事，
於是就在 linear layout 裡面放了兩顆按鈕。

放失敗之後，
就去查一下要怎麼達成這個 layout 

## 設定權重

於是就查到有個 `layout_weight` 屬性 （[參考](https://developer.android.com/guide/topics/ui/layout/linear.html#Weight)）

如果需要再 linear layout 裡面平均分佈的話，
需要把 UI 元件加上 

```
layout_weight="1"
```

設定的值（在這裡就是那個 `"1"` ）
就是代表這個子 UI 在這個 layout 裡面分佈的大小；

當數值越大，佔據的空間就會越大，
預設則是 0

## 實例

我有一個 leaner layout ， 裡面想要水平分佈兩個按鈕，分別是 submit 和 cancel ，就可以這樣寫：

``` xml
<LinearLayout
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <Button
        android:text="Submit"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"/>

    <Button
        android:text="Cancel"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"/>

</LinearLayout>
```

結果圖：

<img width="50%" alt="水平排列" src="https://qiita-image-store.s3.amazonaws.com/0/41979/831d9c3e-b685-c1d5-575d-0e09b550ea87.png">


## 不同排列方向

根據 Android 的官方文件，
如果要讓子畫面能夠分佈一樣的空間

### 水平排列

如果是在 horizontal linear layout ，

- `android:layout_width="0dp"` - 寬要設成 `0dp`
- `android:layout_weight="1"`

### 垂直排列

反之在 vertical linear layout 的時候，

- `android:layout_height="0dp"` - 高要設成 `0dp`
- `android:layout_weight="1"`

## 執行環境

- Android Studio 2.2.2
- Android 7.0 (API level 24)
go1.7.3 の go コマンドを gdb でデバッグする

# はじめに

go は基本的に最適化を行ってビルドが行われる. ゆえに実行された関数や変数の値はレジスタへ保存されるため, 最適化を無効化し, それぞれの値の情報を見られるようにするため,

    go build -gcflags '-N -l’ sample.go

を行う必要がある.
今回のデバッグは go1.7.3 を使用する.
# go1.4 のビルド
後々 `$GOROOT_BOOTSTRAP` が必要になるため,

    git clone -b release-branch.go1.4 https://go.googlesource.com/go $HOME/go1.4
    cd $HOME/go1.4/src
    ./make.bash

を行う.  
  go1.7.3 の `./all.bash` の `$GOROOT_BOOTSTRAP` のデフォルト値は `$HOME/go1.4` である.

# go1.7.3 の `go` コマンドのビルド
現時点(2016-11-04)で最新の安定されたバージョンをビルドする.

    git clone -b release-branch.go1.7 https://github.com/golang/go.git && cd go/src

  デバッグ用として今回のターゲットである `go` コマンドのビルドを行う.

    $ ./make.bash
    $ export GOROOT=$HOME/go
    $ cd cmd/go && go build -gcflags '-N -l' -o ../../../bin/go
    $ cd ../../../bin

これで `gdb` を用いてデバッグを行うことができる.
その前に何かソースコードを生成する.

```go:main.go
package main

func main() {
    title := "Hello, World"
    println(title)
}
```
これをビルドするように `gdb` を実行する.

    $ gdb ./go

この時,

    Reading symbols from ./go...done.
    Loading Go Runtime support

のように表示されていれば成功である.

    (gdb) b main.main
    (gdb) r build ./main.go


# 参考
- https://golang.org/doc/gdb
- https://golang.org/doc/install/sourcec
- https://astaxie.gitbooks.io/build-web-application-with-golang/content/ja/11.2.html
[Rails]部分テンプレートをヘルパーから使用する

# 目的
ビューをすっきりさせるため、部分テンプレートの繰り返しをヘルパーメソッドにする

* ヘルパーメソッド利用前

```views/items/index.html.erb
<% items.each do |item| %>
<%= render partial: "shared/item", locals: {item: item} %>
<% end %>
```

* ヘルパーメソッド利用後

```views/items/index.html.erb
<%= item_partials %>
```

とっても、すっきり。

# コード
* Itemテーブル（コードは省略）
item.nameには以下のようなデータが入力されている。
[![https://gyazo.com/ee2e953578945e017794465208cd0074](https://i.gyazo.com/ee2e953578945e017794465208cd0074.png)](https://gyazo.com/ee2e953578945e017794465208cd0074)



* 部分テンプレート


```views/shared/_item.html.erb
<hr>
<strong>item.nameは「<%= item.name %>」です。</strong>
<hr>
```

* ヘルパー

```helpers/items_helper.rb
module ItemsHelper
  def item_partials
    items = Item.all # 全データ出力
    html_text = ''
    items.each do |item|
      html_text += render(partial: 'shared/item', locals: {item: item})
    end
    return raw(html_text) # htmlをエスケープしないで出力
  end
end

```

* ビューからヘルパーを呼び出す

```views/items/index.html.erb
<h3>ヘルパーから部分テンプレートを出力</h3>
<%= item_partials %>  
```

# 結果
以下のような出力が得られる。

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


# 解説
* 部分テンプレートを1回だけ出力するのであれば、 ``render(partial: 'shared/item', locals: {item: item})``をreturnするだけでも良い。しかし、eachなどで、2回以上部分テンプレートを出力するの場合は、一度string形式にして、足し合わせないとうまくいかない。（ ``html += render(partial: ....``の箇所）

# 応用
* ヘルパーメソッドに、部分テンプレート名などを渡せるように、引数を仕込むと汎用性が上がります。（ ``item_partials(template: 'item.html')``と ``render(partial: "shared/#{template}", locals: {item: item})`` に書き換えて、（ ``<%= item_partials(template'item') %>`` ）で呼び出すとか。

# 参考
* [自前でActionView::Baseを使ってrenderする時の罠](http://qiita.com/blueplanet/items/645f54eb1ca0a020f652)
外部サーバーからMySQLに接続する権限を付与する

AppサーバとMySQLサーバが別サーバで動いている場合、アクセス権限が無いとMySQLに接続ができません。

# 接続が許可されているホストを確認
```sql

mysql> SELECT host FROM mysql.user;
+---------------+
| host          |
+---------------+
| 127.0.0.1     |
| localhost     |
+---------------+
```

ローカルからしか許可されてない

# Appサーバーも許可ホストに追加する
```sql
GRANT ALL PRIVILEGES ON *.* TO {MySQLのユーザ名}@'AppサーバーのIP' IDENTIFIED BY '{MySQLのパスワード}' WITH GRANT OPTION;
```

※ 今回は全権与えてるので、自分の環境に応じて変更が必要

## 確認
```sql
mysql> SELECT host FROM mysql.user;
+---------------+
| host          |
+---------------+
| 127.0.0.1     |
| localhost     |
| AppサーバーのIP |
+---------------+
```
Redux-FormでStateが更新されたタイミングでRenderする

Redux-Formは無駄な再描画を防ぐために、`shouldComponentUpdate`で更新されたpropsを見て再描画するか判断しています。

*reduxForm.js*

```
shouldComponentUpdate(nextProps) {
  if (!config.pure) return true
  return Object.keys(nextProps).some(prop => {
      // useful to debug rerenders
      // if (!plain.deepEqual(this.props[ prop ], nextProps[ prop ])) {
      //   console.info(prop, 'changed', this.props[ prop ], '==>', nextProps[ prop ])
      // }
      return !~propsToNotUpdateFor.indexOf(prop) && !deepEqual(this.props[ prop ], nextProps[ prop ])
  })
}
```

`config.pure`が`true`の場合だけ上記の判定を行っているので、
以下のように宣言することでStateが変わると必ず再描画されるようになります。

```
export default reduxForm({
  form: 'post',
  pure: false,
})(PostForm)
```
UserAgentで表示を変更する(rails)


```applicaiton_helper.rb
def check_user_agent?
  ua = request.env["HTTP_USER_AGENT"]
  ua.include?('Mobile') || ua.include?('Android') ? true : false
end
```

request.env["HTTP_USER_AGENT"]には、iphoneの場合Mobileという文字列が、Androidの場合Androidという文字列が入ります。


```hogehoge.html.erb
<% if check_user_agent? %>
  スマホの場合
<% else %>
  PCの場合
<% end %>

```
rake taskの処理本体は他のとこに書いたほうがよさげ

例えば、現在より前のレッスンを削除する処理をrakeタスクで書きたいとき、

```lib/tasks/delete_past.rake
namespace :delete_past do
  desc '過去のlessonを削除する'
  task lessons: :environment do
    Lesson.where( 'finish_datetime < ?', Time.zone.now).delete_all
  end
end
```

上のように、rakeに処理を書いていました。
しかし

```lesson.rb
class Lesson < ActiveRecord::Base

  def self.delete_past
    where( 'finish_datetime < ?', Time.zone.now).delete_all
  end
end
```

```delete_past.rake
namespace :delete_past do
  desc '過去のlessonを削除する'
  task lessons: :environment do
    Lesson.delete_past
  end
end
```

このように（今回の場合は）モデルに処理を書いて、taskでは呼び出すだけにしたほうがよさげだと思った。

### メリット
タスクが読みやすくなる。
テストがしやすい。
コードの場所が直感的に理解しやすくなる。
普通にwebアプリケーション上からも実行しやすい。

### デメリット
モデルがfatになる。
リセットCSSの意味とコード

#リセットCSSの意味
webサイトやwebアプリケーションをブラウザで表示させる時には、ブラウザを使う。

ブラウザはgoogle chomeやInternet ExploreやSafariやFireFoxなど、様々なものがある。

ここで問題が生じる。
各ブラウザによって、自分が作成したサイトやアプリが、意図したレイアウトと異なってしまうことがある。

それを防ぐのが、リセットCSS。
どのブラウザでも、そのような齟齬が起きないように初期設定をする。

#コード
(これを残しておくために本記事を残しておくようなものw)

```
body {
  background-color: #f0f0f0;
  font-size: 14px;
  color: #333;
  margin: 0 auto;
}

h1,h2,h3,h4,h5,h6,p {
  padding: 10px 0;
  margin: 0;
}
```

CSSを書き始める前に、定型として上のコードを貼ろう！
Gatlingによるcsrf対策の突破法

#背景

以前アプリのチューニングを行った際、Gatlingを用いて負荷テストを実施しました。
※Gatlingの詳細や細かい使い方は公式ドキュメントを参照ください。

Gatlingのレコード機能を使えば、GUIで行った操作を記録し、自動でコードに落とし込んでくれます。

しかし、csrfトークンの値など、動的に値が変化していくものについては、その操作を記録した時点での値で固定されてしまいます。アプリ側のcsrf対策を切れれば話は早いのですが、そういうわけにもいきません。なんとかこのcstfトークンをシナリオ実行中に自動で取得し、動的にその値を変更させながらシナリオを実行させる必要があります。

今回実際にいろいろとやってみて、かなりハマってしまったので備忘録的に残しておきます。

#やりたいこと

csrfトークンの値を動的に取得し、アプリケーションのcsrf対策をONにしたままgatlingのシナリオを実施したい

#今回実行した操作の流れ
- アプリケーションにログインする(ログインのエンドポイントに対しPOSTリクエストを投げる)
  - レスポンスヘッダにcstfトークンが含まれるので、コイツを取得する
- ログイン後、トップページからコメントを投稿
  - 上記で取得したcsrfトークンを用いて投稿処理を行う
  

最終的に出来上がったソースコードの雰囲気はこんな感じ

```scala
val httpProtocol = http
    .baseURL("https://dummy-domain")
    #その他の設定
    .disableFollowRedirect

val $token = "${csrf_token2(0)}"
    
#headersの設定など
    
.exec(http("ログイン")
  .post("/dummy/login")
  .check(headerRegex("Set-Cookie", "dummy_csrf_token=(.*); path").findAll.saveAs("csrf_token2"))
  .check(status.is(302))
  .formParam("email", "dummy_address")
  .formParam("password", "dummy_password")
  .formParam("dummy_token", "${csrf_token}"))
.exec(http("トップ画面")
  .get("/dummy/top"))
.exec(http("投稿")
  .post("/dummt/post")
  .body(StringBody(s"""{"body":"テスト, "dummy_csrf_token":"$token"}""" )).asJSON)
```

やりたいことをもう少し具体的にすると、

- /dummy/loginに対してPOSTを投げた時に返ってくるレスポンスヘッダのSet−Cookieの値を取得し、保存すること

となります。

#やり方

公式ドキュメントを見れば、以下のように書いてあります。

```scala
.headerRegex(headerName, pattern)
```

よってこのheaderRegexを使えば、レスポンスヘッダの中身を取得できる様子。なので今回は

```scala
.check(headerRegex("Set-Cookie", "dummy_csrf_token=(.*);").saveAs("csrf_token"))
```

みたいな感じで指定してやればcsrfトークンの値を取れると思っていました。

#ハマッた内容
##Set-Cookie(同じheaderName)が複数ある場合、.findAllを指定する必要がある

今回、ログインのPOSTに対するレスポンスヘッダにはSet-Cookieが複数存在し、上記のやり方だとそのうちの一つしか取得できないことがわかりました。
なのでSet−Cookieの値全てを取得し、そのうちdummy_csrf_tokenの値を正規表現で抽出する必要があります。

```scala
.check(headerRegex("Set-Cookie", "dummy_csrf_token=(.*);").findAll.saveAs("csrf_token"))
```

このように.findAllを使えば該当する全てのheaderNameの値を取得できるようになります。
この時、取得した値は配列で返ってくるので、呼び出しの形を配列に変える必要があります。

```scala
val $token = "${csrf_token2(0)}"
```

##ログイン後に自動でリダイレクトしないようにする必要がある

これでいけるようになったかと思いきや、なかなかうまくいきません。

```scala
.post("/dummy/login")
.check(headerRegex("Set-Cookie", "dummy_csrf_token=(.*); path").findAll.saveAs("csrf_token2"))
```

一見これでPOSTリクエストに対するレスポンスヘッダのSet-Cookieの値をとってきてくれそうですが、どうやらログイン直後のリダイレクト先へのGETリクエストに対するレスポンスヘッダの値を見ているようでした。

gatlingではリダイレクトのステータスコードを受け取ると、自動でリダイレクト先のURLにGETでアクセスしてくれます。
なので、httpProtocolに.disableFollowRedirectを付与し、自動でリダイレクトしないように設定する必要があります。

```scala
val httpProtocol = http
    .baseURL("https://dummy-domain")
    ...
    .disableFollowRedirect
```

こうするとリダイレクトのステータスコードを受け取っても、自動でリダイレクトしないようになります。
これでPOSTリクエストに対するレスポンスヘッダの値にアクセスできるようになりました。

もう一つ注意点として、自動リダイレクトを切ると、操作としてはきちんとログインできているのですが、gatlingの見かけ上はfailとなってしまいます。なので受け取ったステータスコードは300系であってますよ、ということをgatlingに教えてやる必要があります。これは.checkのstatus.isを使えば問題ありません。

```scala
.post("/dummy/login")
.check(headerRegex("Set-Cookie", "dummy_csrf_token=(.*); path").findAll.saveAs("csrf_token2"))
.check(status.is(302))
```

#最後に
JMeterかGatlingか結構迷ったのですが、慣れてしまえばGatlingが使いやすいのかなあという感じがしました（ほとんどJMeter使ってないのであれですが）。
単一ファイルコンポーネントで使用するときのvue-validator

[v2.1.6](https://github.com/vuejs/vue-validator/releases/tag/v2.1.6)を使用。
v2.1.7だとビルドミス？っているらしく、サンプル含め動作しなかった。

まず症状として、単一ファイルコンポーネントでvue-validatorを使用すると動作しない。
エラーを見ると内部で保持しているvalidateに使用する関数がうまく参照側へ引き継げていないよう。

完全なFixではないと思うが
2行ほどコードを足すとエラーは回避できたようなので、そのコードを置いておく。

```js

var BaseValidation = function () {
  function BaseValidation(field, model, vm, el, scope, validator, filters, detectBlur, detectChange) {
    babelHelpers.classCallCheck(this, BaseValidation);

    this.field = field;
    this.touched = false;
    this.dirty = false;
    this.modified = false;

    this._modified = false;
    this._model = model;
    this._filters = filters;
    this._validator = validator;
    this._vm = vm;
    this._el = el;
    this._forScope = scope;
    this._init = this._getValue(el);
    this._validators = {};
    this._detectBlur = detectBlur;
    this._detectChange = detectChange;
    this._classes = {};

    // validatorsが正常に引き継がれないのでextendする
    var extend = exports$1.Vue.util.extend;
    this._vm.$options.validators = extend(this._vm.$options.validators || Object.create(null), exports$1.Vue.options.validators);
  }

```
暗黙の型変換と実数の振る舞い　Javaの問題をTypeScriptにしてみる  6-3

次のプログラムの『』に入るコードとして正しいものを選びなさい。(2つ選択)

```java:java.java
public class Main{
 public static void main(String[] args){
　Sample s = new Sample();
    『　　　』result = s.divide(10,2);
      System.out.println(result);
 }
}

public class Sample{
     float divide(int a,int b){
        return (float)a / (float)b;
     }
}

```

A.int
B.float
C.double
D.String
E.var
F.dim

答えはBC

divideメソッドの戻り値がfloatになっているので、受ける側の変数の型はfloatになります。また、doubleはfloatから暗黙的に型変換されるのでdoubleでも可能です。

これをTypeScriptにすると、

```ts:TypeScript.ts
class Sample{
     divide(a:number ,b:number):number{
        return a / b;
     }
}

var s:Sample = new Sample();
var result:number  = s.divide(10,2);
console.log(result);

```
となります。
TypeScriptには整数・実数の区分けがないため、全てnumberで表現します。
Android Studio でプロジェクト名・パッケージ名を変更する

Androidプロジェクト名、パッケージ名を含み全て名前を変更したい。
Android Studioで簡単に変更出来るだろうと容易な気持ちでしたが何気に手順が必要だったのでメモ

###①パッケージ名を変更
```AndroidManifest.xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="jp.co.hoge">
```
###②build.gradleを編集する
```build.gradle
android {
    defaultConfig {
        applicationId "jp.co.hoge"
    }
}
```
###③Gradle Syncを行う
###④パッケージ名とソースディレクトリのリファクタ
「Project」をAndroidビューにし、パッケージ名を右クリック
・【Refactor】→【Rename】（Rename package)
・【Refactor】→【Rename】（Rename directory)

###⑤AndroidStudioを閉じる
###⑥各種命名を変更する
・プロジェクトディレクトリの名前変更
・プロジェクト直下の"xxx.iml"を"hoge.iml"に変更

以上

###参考
http://qiita.com/nusa/items/413c8a131ebc451e80f8
http://qiita.com/le_skamba/items/f838fe51a3396c26a262
UIScrollViewのclipToBoundsはデフォでtrue


![スクリーンショット 2016-11-04 17.54.05.png](https://qiita-image-store.s3.amazonaws.com/0/10826/8f15ecd0-13e8-cb8d-4546-5bdea84dc094.png)

**まじか。**


いや、たしかにそれが普通か。
だってScrollViewだもんな。

CollectionViewをスクロールさせずに使う場合にハマったので注意しよう。
Ruby | pry でファイルに書いたクラスを読み込んでテストする

# 手順

## 適当に ruby ファイルを作る

```rb:/tmp/example.rb
class Example
  def self.yes
    puts 'YES!'
  end
end
```

## pry を立ち上げて先程の require する

```bash
$ pry
```

```rb
 [1] pry(main)> require '/tmp/example'
=> true
```

## メソッドを実行する

```rb
[2] pry(main)> Example.yes
YES!
```

# 環境

- Pry version 0.10.4 on Ruby 2.3.1








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
UIColorで設定した色よりも暗くなる。P3ディスプレイに対応する。

# 環境
- iMac 5kディスプレイ
- MacOS: 10.11.6
- Xcode:8.0
- swift3
- シュミレータ

# UIColorで設定した色よりもシュミレータの色が暗い
```
UIColor(red: 255/255.0, green: 105/255.0, blue: 180/255.0, alpha: 1.0)
```

![スクリーンショット 2016-11-04 12.50.14.png](https://qiita-image-store.s3.amazonaws.com/0/50839/b2b534b7-b6f6-6026-8cec-b6143787e53c.png)


# P3ディスプレイって？

> 現在、Appleが「P3ディスプレイ」を採用している端末は非常に少ない。同ディスプレイを搭載しているのは「iMac 5Kディスプレイモデル」「iMac 4Kディスプレイモデル」そして9.7インチ型「iPad Pro」の3モデルのみだ。
> https://corriente.top/post-14720/

iPhone7もP3ディスプレイ。

# 解決策
UIColorにiOS10から新しいイニシャライザが追加されたみたい。
```
UIColor(displayP3Red: 255/255.0, green: 105/255.0, blue: 180/255.0, alpha: 1.0)
```
実機での色の変化はまだ未確認です。わかったら追記します。
floatをdoubleにキャストすると計算誤差が発生する

floatは有効桁数が7桁なのでそれ以上の有効桁数を持つdoubleに変換すると誤差が出る。

```java
float fl = 20.6f;
system.out.println(fl);   // 20.6
system.out.println((double) fl);   // 20.600000381469727
```
プリミティブ型だしなんかしら用意された解決方法があんだろうと思い探してみた。

#### 解決案1 `Float.doubleValue()`を使う

```java
float fl = 20.6f;
system.out.println(fl);   // 20.6
system.out.println(((Float) fl).doubleValue());   // 20.600000381469727
```

このメソッド必要ある？

#### 解決案2 一度BigDecimalに変換する
```java
float fl = 20.6f;
system.out.println(fl);   // 20.6
system.out.println(new BigDecimal(fl).doubleValue());   // 20.600000381469727
```

後で確認したらBigDecimalに変換した時点で誤差ってた。
float型を受け取るコンストラクタが無いんだから当たり前でした。

#### 解決案3 一度Stringに変換する
```java
float fl = 20.6f;
system.out.println(fl);   // 20.6
system.out.println(Double.parseDouble(((Float) fl).toString()));   // 20.6
```

できました。
floatの値が大きくなって指数表記になってもちゃんとparseしてくれる。
でもなんか負けた気がする。

他には有効桁数が7桁なんだから8桁目を四捨五入するのもありなのかな。
めんどくさくなりそうなので試してないです。

ネットを探してもなかなかこれについて触れているところがない。まあ普通最初からdoubleかBigDecimal使うしなぁ。

今回は外注先が作ったコードでfloatをdoubleにキャストしているところがあって、直させるために調べたんだけどその解決案が文字列に変換ってなんかかっこ悪いなあ。
Commit履歴のAuthor情報、及びCommitter情報を更新する

Gitで複数アカウントを使い分けていたら、
間違えてCommit -> Pushしてしまい
色々とヤバいことになってしまったので
今後同じような問題に直面した人用に修正方法をまとめておきます

# 基本的なCommitter設定の更新方法
#### 特定のディレクトリでの設定更新
```
git config user.name <name>
git config user.email <email>
```

#### 全体の設定更新
```
git config --global user.name <name>
git config --global user.email <email>
```

（今後のコミットのCommitter情報は上記で更新されるが、
　すでにコミット済みのモノの情報は変わらないので注意）

# コミット済みのコミット情報を更新する

現状のブランチの全てのコミット情報を更新する場合

```
git filter-branch -f --env-filter '
GIT_AUTHOR_NAME='<name>';
GIT_AUTHOR_EMAIL='<email>';
GIT_COMMITTER_NAME='<name>';
GIT_COMMITTER_EMAIL='<email>'
' HEAD
```

現状のブランチの指定のコミット範囲のコミット情報を更新する
※以下の例では直近10コミット

```
git filter-branch -f --env-filter '
GIT_AUTHOR_NAME='<name>';
GIT_AUTHOR_EMAIL='<email>';
GIT_COMMITTER_NAME='<name>';
GIT_COMMITTER_EMAIL='<email>'
' HEAD~10...HEAD
```

#### 特定の条件のコミットのみ書き換える
現状のブランチの全てのコミット情報を更新する場合

```
git filter-branch --commit-filter '
if [ "$GIT_COMMITTER_NAME" = "<oldName>" ];
then
GIT_AUTHOR_NAME="<newName>";
GIT_AUTHOR_EMAIL="<newEmail>";
GIT_COMMITTER_NAME="<newName>";
GIT_COMMITTER_EMAIL="<newEmail>";
git commit-tree "$@";
else
git commit-tree "$@";
fi' HEAD
```

現状のブランチの指定のコミット範囲のコミット情報を更新する
※以下の例では直近10コミット

```
git filter-branch --commit-filter '
if [ "$GIT_COMMITTER_NAME" = "<oldName>" ];
then
GIT_AUTHOR_NAME="<newName>";
GIT_AUTHOR_EMAIL="<newEmail>";
GIT_COMMITTER_NAME="<newName>";
GIT_COMMITTER_EMAIL="<newEmail>";
git commit-tree "$@";
else
git commit-tree "$@";
fi' HEAD~10..HEAD
```

仕様できる定数名に関しては、以下を参照
https://www.kernel.org/pub/software/scm/git/docs/git-commit-tree.html

# 更新したコミットを（強制的に）Pushする
すでにpush済みのコミットを変更した場合、
普通にpushしようとすると以下のようなメッセージで弾かれる

```
git push origin <branchName>
To <originUrl>
 ! [rejected]        <branchName> -> <branchName> (non-fast-forward)
error: failed to push some refs to '<originUrl>'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
```

そのような場合、```-f```オプションをつけて強制的にpushする
※```-f```オプションは乱用すると色々と大変な状態になるので、ご利用は計画的に

```
git push -f origin <branchName>
```

# unrelated histories について
コミット情報を変更し、強制的にpushした場合、
ブランチ同士の連携が取れなくなることがある

例）
1. AブランチからBブランチをチェックアウト
2. AブランチのCommit/Author情報を全て変更
3. Aブランチを```push -f```
4. BブランチにAブランチをマージする
5. 以下のメッセージが表示され、マージに失敗

```
git merge --no-ff <BranchA>
fatal: refusing to merge unrelated histories
```

その場合、```--allow-unrelated-histories```オプションを駆使するか、
Bブランチも同じようにCommit/Author情報を全て変更して```push -f```すると
再度AブランチとBブランチの連携が取れるようになります

※正攻法ではないため、バックアップを取った上での対応をお願いします
Deep Learning > youtube > 異なるネットワークの使用例 @ Deep Learning SIMPLIFIED

LSTMで検索して偶然見つけた。
https://www.youtube.com/watch?v=JjZDoojyzXQ

3分ばかりのDeep Learning関連のビデオ。
英語も聞きやすく、内容も分かりやすい。

- How to choose a Deep Net?
- UNLABELLED
   - RBM
   - Autoencoders
- LABELLED
   - RNTN
   - Recurrent Net
   - DBN
   - ConvNet
- Classification
   - MLP/RELI
   - Deep Belief Net
   - Recurrent Net

Deep Learning SIMPLIFIED関連の他のビデオもざっと見るのに良い。
https://www.youtube.com/playlist?list=PLjJh1vlSEYgvGod9wWiydumYl8hOXixNu

### 余談

LSTMの使用例でsine curveを学習するコードを見たことがある。ビデオを見る限りではLSTMでは時系列データの「次」を回答できるように、としているようだ。
LSTMを使ってsine curveを学習するのは、「周期関数だから」というイメージを持った。

自分が目指しているsystem of linear equationsの係数(周期関数ではない)はLSTMが最適なネットかは不明。
Power Loadの回帰をRNNで学習している例があったが、これは周期関数ではなかった。
ESP8266のWebServerでArduinoのプログラムをかけるようにしてみた

日本での発売から一年がたち多数の作例が出てくる「ESP8266」(ESP-WROOM-02)をもっと使いこなしてみませんか？
今回はWebServer上で動くArduino簡易エディタを実装したのでその話をしてみようと思います。
まだGithubで実装途中なので、よければプルリクしてもらえるとうれしいです。

基本的にはNefryベースですが、普通のESP8266でも動くのでぜひためしてみてください。
#ちょこっと宣伝
ところどころで出てくるESP8266の基板ですが、私が作成した「Nefry」(ねふりー)という基板を使っています。

**[dotstudio](https://dotstud.io/projects/nefry-connect-internet/)さんにて販売中です！！**

![](https://qiita-image-store.s3.amazonaws.com/0/97208/95705e6e-e8e8-9f9d-6778-7de63860a01e.jpeg)
USBに直接繋げられたり、Webページ上でWiFiの設定やESP8266の端末設定ができるようになっていたりとESP8266をより簡単に扱えるものになっています。

詳しくはLigブログで記事をいくつか載せていますのでご覧ください。

[自作したオリジナルIoTデバイス「Nefry」とインターネットを繋いでみた](http://liginc.co.jp/236620)

[Webサービス同士を連携できる「IFTTT」と自作IoTデバイスを繋いで生活を便利にしてみた](http://liginc.co.jp/263899)

#どんなことができるの？

Arduinoで一般的な**digitalRead,digitalWrite,analogRead,analogWrite,delay**をWebページで入力すると実際のハードウエアを動かすことができるようになります。
Nefryだと**Nefry.setLed**関数が追加で使えるようになります。
具体例としてこんなイメージです。下のプログラムをWebページで入力すると…

```
digitalWrite(D5,HIGH);
delay(1000);
digitalWrite(D5,LOW);
delay(1000);
digitalWrite(D5,HIGH);
delay(1000);
digitalWrite(D5,LOW);
delay(1000);
```

<blockquote class="twitter-video" data-lang="ja"><p lang="ja" dir="ltr"><a href="https://twitter.com/hashtag/Nefry?src=hash">#Nefry</a> (esp8266内蔵)のwebserverでプログラムの簡易エディタ作ってみた！<br><br>ちゃんとwebページでコードを変更すると動作が変わるようになってる<br>digitalwriteでピンを変更するとledの光り方をかえられる！ <a href="https://t.co/3ox5HSCkYd">pic.twitter.com/3ox5HSCkYd</a></p>&mdash; わみ (@wamisnet) <a href="https://twitter.com/wamisnet/status/789064728051986432">2016年10月20日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

といった風に手軽にプログラムを書き換えて遊ぶことができるようになっています。
for文などの繰り返し文の実装がまだのため、あまり良い書き方ではありませんが、今後の実装で対応していこうと思います。

#ArduinoIDEでの書き方

ライブラリとして作成したので簡単に説明していこうと思います。使い方としては、easyEditerで書いたプログラムが動いてしてほしいところに```editer.setTrigger();```を置くイメージですね。

ESP8266：https://github.com/wamisnet/easyEditor
Nefry：https://github.com/Nefry-Community/easyEditor

```cpp

#include<easyEditer.h>
easyEditer editer;

/*
   easyEditerを試してみるサンプルプログラム
   2016/10/20
*/

void setup() {
  editer.begin("NefryEditer");//easyEditerを使えるようにします。
}

void loop() {
  if (Nefry.push_SW()) {
    //NefryのSWを押したときにeasyEditerを実行します。
    editer.setTrigger();//easyEditerを使えるようにします。
  }
}
```

beginでWebページを作成します。beginの引数はページの名前になります。
今回のプログラムはNefry専用のものとなっています、SWを押したときにeasyEditerで書いたプログラムが動作するようになっています。

#まとめ
簡易エディタをつくってみて、この手軽に試せる感じはすごくいいなと思いました。
まだまだ発展途中ですが、応援していただけるとありがたいです。
デリゲートパターンの流れ図を描いてみた

![アクティビティ図0.png](https://qiita-image-store.s3.amazonaws.com/0/12939/6057be84-594b-1399-cdfb-561bc7d12c6a.png)


![コミュニケーション図0.png](https://qiita-image-store.s3.amazonaws.com/0/12939/f2596c82-bd2b-2d37-bdcb-f4ef86ad0c61.png)


いくつかのページを参照してデリゲートパターンを初めて実装したのですが、ページによって説明が異なっていて、プログラムが動くまで時間がかかりました。

これから実装する方の参考になればありがたいです。また、初めての実装なので、おかしい点があればご指摘いただけると幸いです。

以下のコードの括弧数字の部分が最初のアクティビティ図の数字と対応しています。

```swift:GraphViewController
import UIKit

// （１）
protocol GraphViewDelegate: class {  // ※
    // （２）
    func onModelUpdated(newValue: Float) -> Void
}

class GraphViewController: UIViewController {
    ...
    weak var delegate: GraphViewDelegate?  // （３）
    ...
    // セグエを使ってインスタンスを取得する
    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        if segue.identifier == "Plot" {
            //（４）
            let plotViewController = segue.destinationViewController as! PlotViewController
            // （５）
            self.delegate = plotViewController
        }
    }
 
    // モデルが変化するたびに走る
    override func observeValueForKeyPath(...
        let newValue = ...
        delegate!.onModelUpdated(newValue)  // （６）（７）
    }
}
```

※delegateをweakで宣言する際にprotocolにclassを継承する理由 - Qiita http://qiita.com/yimajo/items/892bd2fe1ccb808ffe49

```swift:PlotViewController
import UIKit

// （８）
class PlotViewController: UIViewController, GraphViewDelegate {
    ...
    func onModelUpdated(newValue: Float) {  // （９）
        ...
    }
}
```

ちなみに細かいことですが`GraphViewDelegate`の代わりに`GraphViewControllerDelegate`にしたらエラーになりました。謎…

```swift:GraphViewController
self.delegate = plotViewController
```

> Cannot assign value of type 'PlotViewController' to type 'GraphViewControllerDelegate?'

よろしくお願いします。

---
ブログやっています：http://weed.nagoya
Golang製DBマイグレーションツールgoose + MySQLを試してみた

# gooseとは

Golang製のDBマイグレーションツール
https://bitbucket.org/liamstask/goose/

# なんでgoose？

プロジェクトのプログラムとは離した状態でマイグレーションを導入したかった。プロジェクトごとにマイグレーション手段が変わるのが嫌だったから。
SQLをそのまま書けるので学習コストが高くなさそう。
Golang製のツールを使ってみたかった。

# 導入まで

参考: http://enomotodev.github.io/post/use-goose/

goは導入済みとして

```
$ go get bitbucket.org/liamstask/goose/cmd/goose
```

```
$ goose

goose is a database migration management system for Go projects.

Usage:
    goose [options] <subcommand> [subcommand options]

Options:
  -env string
    	which DB environment to use (default "development")
  -path string

▽
    	folder containing db info (default "db")
  -pgschema string
    	which postgres-schema to migrate (default = none)

Commands:
    up         Migrate the DB to the most recent version available
    down       Roll back the version by 1
    redo       Re-run the latest migration
    status     dump the migration status for the current DB
    create     Create the scaffolding for a new migration
    dbversion  Print the current version of the database
```

# 疎通確認する

設定ファイルを作って疎通確認まで
設定ファイルはサンプルをコピーしてくる

```
$ mkdir db
$ cd db/
$ cp $GOPATH/src/bitbucket.org/liamstask/goose/db-sample/dbconf.yml ./
```

とりあえずdevelopmentだけ書き換えてみる
MySQLを使うのでdriverを変える
接続設定を書き換える。 [db_name], [user_name], [password] を適宜書き換えてください。

```:dbconf.yml
development:
    driver: mymysql
    open: tcp:localhost:3306*[db_name]/[user_name]/[password]
```

下記のように返ってくればとりあえず疎通はOK。

```
$ goose status
goose: status for environment 'development'
    Applied At                  Migration
    =======================================
```

# 使ってみる

上記で作ったconf入りのdbディレクトリの一階層上で実行します。(./db/dbconf.ymlを読むため)

Usersテーブルを試しに作ってみます。

```
$ goose create createUsers sql
goose: created /srv/qiitarank/db/migrations/20161104023332_createUsers.sql
```

```goose create [マイグレーション名] sql``` でマイグレーション用SQLファイルを作ってくれます。
sqlを外すとgoファイルを作ります(SQLで書きたいので今回は省略）。

```sql

-- +goose Up
-- SQL in section 'Up' is executed when this migration is applied


-- +goose Down
-- SQL section 'Down' is executed when this migration is rolled back

```

上記のようなファイルができますので、あとはSQLを書くだけです。
```+goose Up``` 以下にUp時に実行するSQL
```+goose Down``` 以下にDown時に実行するSQL
を記述します。

```sql

-- +goose Up
-- SQL in section 'Up' is executed when this migration is applied
CREATE TABLE users (
    id varchar(255) NOT NULL,
    name varchar(255) NOT NULL,
    PRIMARY KEY(id)
);

-- +goose Down
-- SQL section 'Down' is executed when this migration is rolled back
DROP TABLE users;

```

テーブルを作成する処理をUpに、削除する処理をDownに記述しました。
```goose up```を叩いて、Upの処理を実行します。

```
$ goose up
goose: migrating db environment 'development', current version: 20161027112322, target: 20161104023332
OK    20161104023332_createUsers.sql
```

これで ```+goose Up``` に記述されたSQLが実行されてテーブルが作成されます。

```goose down``` を叩くと、Downの処理が実行されます。

```
$ goose down
goose: migrating db environment 'development', current version: 20161104023332, target: 20161027112322
OK    20161104023332_createTable.sql
```

# まとめ

* gooseの利用は簡単
* SQLを書けばいいので想定通り学習コストは低い
* 今回試してないが環境ごとの設定記述も可能なので十分使えそう。
fix undefined symbol

http://stackoverflow.com/questions/27054737/how-to-fix-symbol-lookup-error-undefined-symbol-errors-in-a-cluster-environment

```bash
vagrant@precise64:~/data/libmagic$ LD_LIBRARY_PATH=./src/.libs/ ./4
Getting magic from 518
```

```bash
vagrant@precise64:~/data/libmagic$ ./4
./4: symbol lookup error: ./4: undefined symbol: magic_version
```
フロントエンド演出：ふわふわ浮遊する動きの作り方

# 演出の雰囲気を紹介する記事です

僕は元々Flash使いで、よくバナーやフルFlashサイトの制作をやっていました。最近は時代の流れでJSでUIの演出やその他もろもろのエフェクトを作っています。

昔に比べて「フロントエンド」という領域も広くなり、あまり演出の制作を担当しない方もいると思います。中には動きを作るのは苦手という方もいらっしゃるかもしれません。

あまりQiita向きじゃないかもしれませんが、いままでやってきた演出作りのコツ？ のようなものを少しずつ公開していきたいなと考えています:grinning:

特にソースコードなどは紹介しません。JSでもCSSでも使えるように**雰囲気**をお伝えできればと思います。演出づくりはその雰囲気で作っていくものなので（ここはビビビッと出てきてサッと消える感じなどなど）。

因みに、今回掲載する素材は[Animate CC](http://www.adobe.com/jp/products/animate.html)で作成しました。

# ふわふわ浮遊する動き

本記事のゴールは次のような動きです。ふわふわと浮遊している感じです。

![anime1.gif](https://qiita-image-store.s3.amazonaws.com/0/55103/8024f1b0-5f4a-99d2-a0cc-0a4d89f47009.gif)

# 大切なのはイージング

イージングとは、アニメーションのスタートからゴールまでをどのくらいの変化量・スピード感（だんだんはやくなる、だんだん遅くなるなど）のことです。イージングにはさまざまなパターンがあるので、[Easing Function 早見表](http://easings.net/ja)が参考になります。

イージングを設定しない（等速で変化する）と動きに引っかかりがでてしまいます。

![anime2.gif](https://qiita-image-store.s3.amazonaws.com/0/55103/0a7ca0c1-889f-d222-f353-edf3475befad.gif)

# つくりかた

このふわふわの動きのつくりかたです。まず、この動きを4つに分けます。

1. 中心から上へ移動
2. 上から中心へ移動
3. 中心から下へ移動
4. 下から中心へ移動

それぞれにイージングを設定します。イージングは基本的にイーズイン（だんだん速く）とイーズアウト（だんだん遅く）の2パターンです。上の4つの段階にそれぞれイージングを設定します。

1. 中心から上へ移動：だんだん遅く（イーズアウト）
2. 上から中心へ移動：だんだん速く（イーズイン）
3. 中心から下へ移動：だんだん遅く（イーズアウト）
4. 下から中心へ移動：だんだん速く（イーズイン）

次のように設定します（解説のためにスローモーションにしています）。

![anime3.gif](https://qiita-image-store.s3.amazonaws.com/0/55103/9d9a71d4-f6a9-f280-af32-ac5462accf1d.gif)

# 演出づくりはイージングの使いかたに慣れること

僕は「演出づくりはイージングの使いかたに慣れること」と考えています。この記事の反応が良ければ別パターンも紹介できればと思います:grin:
Elm内にtwitterボタン等scriptタグがあるものを貼る

HTMLをElmに変換するサイト[html-to-elm](https://github.com/mbylstra/html-to-elm)というのがあって、知ってると便利です。自分はBootstrapを使う時に、HTMLのサンプルコードを変換する時に使いました。

話は変わりますが、twitterボタンをElm内に設置したいと思い上記を使いました。でもtwitterボタン等埋め込むHTMLにはscriptタグがあり、ElmのHTMLライブラリにscriptタグが無いのですべて変換できません。

scriptタグを自分で作ってみます。

```elm
import Html exposing (..)
import Html.Attributes exposing (..)

script_ : List (Attribute msg) -> List (Html msg) -> Html msg
script_ =
    Html.node "script"

```

twitterボタンはElmでは以下のようになりました。動きました。

```elm

socialTwitterButton =
    div []
        [ a
            [ class "twitter-follow-button"
            , attribute "data-show-count" "false"
            , href "https://twitter.com/joo_ex"
            ]
            [ text "Follow @joo_ex" ]
        , script_ []
            [ text "!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0],p=/^http:/.test(d.location)?'http':'https';\n                     if(!d.getElementById(id)){js=d.createElement(s);\n                     js.id=id;\n                     js.src=p+'://platform.twitter.com/widgets.js';\n                     fjs.parentNode.insertBefore(js,fjs);\n                     }}(document, 'script', 'twitter-wjs');"
            ]
        ]
```
gRPC Ruby

# 動機
- gRPC の記事が意外と少ない
- [公式のチュートリアル](http://www.grpc.io/docs/tutorials/basic/ruby.html)が英語だし微妙に間違っている
- Ruby でやる方法もしっかり整理してお役にたちたい

# 環境
- macOS Sierra 10.12.1
- Ruby 2.3.1p112
- Homebrew

# 準備
## Protocol Buffers
- [公式のリリース](https://github.com/google/protobuf/releases)からダウンロードでも良いが、Homebrew で楽する
  - `brew install protobuf` 
- Gem をインストール
- [公式の説明だと grpc だけで良さげな感じだがウソである](https://github.com/grpc/grpc/blob/v1.0.0/INSTALL.md)
  - `grpc` に加え `grpc-tool` も必要

# ソース生成
- ここも更新されていないために間違っているのかプラグインは `grpc_ruby_plugin` ではない
  - `grpc-tool` に付属の `grpc_tools_ruby_protoc_plugin` が正解

[公式のココのコードはこうなる](http://www.grpc.io/docs/tutorials/basic/ruby.html#generating-client-and-server-code)

```
protoc -I ../../protos --ruby_out=../lib --grpc_out=../lib --plugin=protoc-gen-grpc=`which grpc_tools_ruby_protoc_plugin` ../../protos/route_guide.proto
```

# 余談
- Windows だと DevKit に依存しているので芳しくない
- `gem install grpc --platform=ruby` だと[インストールに失敗する](https://github.com/grpc/grpc/issues/5998)
- 現状だと Gem 付きで配布するには厳しいと思う
Thymeleaf 3.0でのHTML5 data属性の書き方

Thymeleaf 2.1まで、HTML5のdata-*属性を使うには`th:attr`を使うか、[thymeleaf-extras-data-attribute](https://github.com/mxab/thymeleaf-extras-data-attribute)などの拡張を使う必要がありました。

しかし、Thymeleaf 3.0からは、これらの拡張は必要ありません！単に`th:data-foo`または`data-th-data-foo` ([HTML5フレンドリーな属性や要素名のサポート](http://www.thymeleaf.org/doc/tutorials/2.1/usingthymeleaf_ja.html#html5フレンドリーな属性や要素名のサポート)機能)と書くだけで良くなりました。

こう書くと

```html
<p th:data-foo="${foo}" data-th-data-baa="${baa}"></p>
```

こうなります。

```html
<p data-foo="fooval" data-baa="baaval"></p>
```
便利ですね！

ネタとしては以上です。以下ソースコードを見てみましょう。

Thymeleaf 3.0で追加された `StandardDefaultAttributesTagProcessor`がそれです。コンストラクタを見ると、優先度最低で、プレフィクスにマッチする全ての属性を引っかけるようになっているのが分かります。（`PRECEDENCE`は`Integer.MAX_VALUE`です）

```java:StandardDefaultAttributesTagProcessor.java
public StandardDefaultAttributesTagProcessor(final TemplateMode templateMode, final String dialectPrefix) {
    super(templateMode, PRECEDENCE);
    this.dialectPrefix = dialectPrefix;
    this.matchingAttributeName = MatchingAttributeName.forAllAttributesWithPrefix(getTemplateMode(), dialectPrefix);
}
```

Thymeleafは登録されている複数のProcessorを上から順に処理していきます。`th:alt`などProcessorが定義されているものはそれらで処理され、こぼれ落ちたものがこの`StandardDefaultAttributesTagProcessor`で処理されるわけですね。

また、マッチ対象が`MatchingAttributeName.forAllAttributesWithPrefix(getTemplateMode(), dialectPrefix)`となっています。これはつまり、最初に書いたような`data-*`属性はもちろん、`th:hoge`でも`data-th-ng-click`でも、Thymeleafのプレフィクスから始まってさえいれば、好きな属性値が使い放題なわけですね！
LaravelでDBを使わずにベーシック認証をかける


デフォルトでできるらしいけど、emailからカスタマイズしたせいか動かなかったし、ベーシック認証でDB使うのがなんか嫌だったので、下記の方法で実装。

## composerでbasic-authをインストール
```
$ composer require olssonm/l5-very-basic-auth
```

## config/app.phpを編集
```php
'providers' => [
    Olssonm\VeryBasicAuth\VeryBasicAuthServiceProvider::class
]
```

config/very_basic_auth.phpができるので、これを編集。

```bash
$ php artisan vendor:publish
```

## 環境によってベーシック認証をかけるかを設定する
とりあえず、本番以外ではベーシック認証をかけるように設定した。ID/PWもここで設定する。

```php
<?php

    /**
     * Configuration for the "HTTP Very Basic Auth"-middleware
     */
    return [
        // Username
        'user'              => 'fuga',

        // Password
        'password'          => 'hoge',

        // Environments where the middleware is active
        'envs'              => [
            'local',
            'dev',
            'development',
            'staging',
            // 'production',
            'testing'
        ],

        // Message to display if the user "opts out"/clicks "cancel"
        'error_message'     => 'You have to supply your credentials to access this resource.'
    ];
```
Laravel5.3でSSL通信を強制する


他のフレームワークではBefore Filterで実装するが、Laravelはmiddlewareで実装する。

```bash
$ php artisan make:middleware HttpsProtocol
```

本番とステージング環境でSSL通信を強制する。

```php
<?php

namespace App\Http\Middleware;

use Closure;

class HttpsProtocol
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
      if (!$request->secure() && config('app.env') === 'production' || config('app.env') === 'staging') {
          return redirect()->secure($request->getRequestUri());
      }

      return $next($request);
    }
}

```

Kernelに登録

```php
protected $middleware = [
  \App\Http\Middleware\HttpsProtocol::class,
];
```

## ELBだとリダイレクトしまくる問題
ELBを噛ませていると、ELB(Port:443)→EC2(Port:80)のため、```$request->secure()```が効かなくなってしまう。EC2も443にしてしまう手もあるが、それができない場合は```$_SERVER[“HTTP_X_FORWARDED_PROTO”]```が```https```であるかをチェックすればいいらしい。

```php
if (config('app.env') === 'production' || config('app.env') === 'staging') {
  if ($_SERVER["HTTP_X_FORWARDED_PROTO"] != 'https') {
    return redirect()->secure($request->getRequestUri());
  }
}
```

続いてApp\Providers\AppServiceProviderの```boot()```に以下を追加
※5.4の場合は`forceSchema`ではなく`forceScheme`にする必要がある
http://qiita.com/sawadashota/items/79b74592b7d9800868f8

```php
if (config('app.env') === 'production' || config('app.env') === 'staging') {
  \URL::forceSchema('https');
}
```


※ productionとstagingはELBが必ず噛んでいる想定です。ELBを噛んでいない場合は```$_SERVER["HTTP_X_FORWARDED_PROTO"]```の値が存在しないので、エラーになります。


# 参考
http://stackoverflow.com/questions/28402726/laravel-5-redirect-to-https
https://cloudpack.media/525
組合せ最適化 - 最小カット問題

[典型問題と実行方法](0f6c1a4415d196e64314)の[最大流問題](http://qiita.com/Saito
Tsutomu/items/80e70da6717acacefa00)と双対関係にあり、[最大フロー最小カット定理](https://ja.wikipedia.org/wiki/%E6%9C%80%E5%A4%A7%E3%83%95%E3%83%AD%E3%83%BC%E6%9C%80%E5%B0%8F%E3%82%AB%E3%83%83%E3%83%88%E5%AE%9A%E7%90%86)が成り立つ

## 最小カット問題
グラフ$G=(V,E)$の最大流に対し、始点$v_s \in V$(ソース)と終点$v_t \in V$(シンク)を分ける2つのグループを考え、両端が両グループに属する辺の流量の和が最小となるグループ分け(カットとよぶ)を求めよ。

## 実行方法
```text:usage
Signature: nx.minimum_cut(G, s, t, capacity='capacity', flow_func=None, **kwargs)
Docstring:
Compute the value and the node partition of a minimum (s, t)-cut.
```
```python:python
# CSVデータ
import pandas as pd, networkx as nx
from ortoolpy import graph_from_table, networkx_draw
tbn = pd.read_csv('data/node0.csv')
tbe = pd.read_csv('data/edge0.csv')
g = graph_from_table(tbn, tbe)
networkx_draw(g)
nx.minimum_cut(g, 5, 2)
>>>
(6, ({0, 1, 3, 4, 5}, {2}))
```

ノード2とそれ以外で分けられて、最小カットは6となる。

![image](https://qiita-image-store.s3.amazonaws.com/0/13955/3abf4149-a710-0d7d-27de-657fcf6fb45d.png)

```python:python
# 乱数データ
import networkx as nx, matplotlib.pyplot as plt
from ortoolpy import networkx_draw
g = nx.random_graphs.fast_gnp_random_graph(10, 0.3, 1)
for i, j in g.edges():
    g.adj[i][j]['capacity'] = 1
pos = networkx_draw(g, nx.spring_layout(g))
nx.draw_networkx_edges(g, pos)
nx.minimum_cut(g, 5, 6)
>>>
(3, ({2, 5}, {0, 1, 3, 4, 6, 7, 8, 9}))
```

![image](https://qiita-image-store.s3.amazonaws.com/0/13955/11dbf41f-102a-53f4-9e1f-78bd973eb6ab.png)


##データ
- [data/node0.csv](https://dl.dropboxusercontent.com/u/35689878/data/node0.csv)
- [data/edge0.csv](https://dl.dropboxusercontent.com/u/35689878/data/edge0.csv)
ドメインが失効してしまうとどうなるか

# 概要
普通ドメインは自動更新ですし、不要なドメインを放置してわざと失効させるのはよくあると思いますが「必要なドメインの更新を忘れていて、且つ救済期限を過ぎた」という事案は案外少ないのではないでしょうか。
今回私物のドメインでやらかしてしまったため復旧までの経緯をここに記したいと思います。


# 環境
* Value Domainで取得した .info ドメイン
* ネームサーバーはRoute53


# 発覚までの流れ
* ある日友人から「送信したメールがエラーになってしまう」との連絡あり
* メールサーバーが両系共に落ちて何らかの理由により警報が上がらなかったのかと思いZabbixにログインしようとするもなぜかタイムアウト
* ZabbixサーバーにSSHでログインするも正常に稼働している模様
* DNSサーバーのトラブルを疑いRoute53の障害情報を参照するも正常
* レジストラー側の問題かと思い障害情報を参照するも正常
* nslookupを行うと想定していた Timeout ではなく Non-existent domain のエラー
  * ここでようやくドメイン失効に思い至る
* メールボックスをひっくり返して「更新のお知らせ」を発掘
* ／(^q^)＼


# 対処
* とりあえずValue Domainにログインして更新を試みるも謎のエラーが発生
* サポートにチケットを起票し問い合わせると以下の回答
  * 復旧期限を過ぎておりユーザーに所有権が無い redemption period 状態
  * 現状はレジストラーが態度を保留しているが、今後解放され再度取得可能になるか、もしくはオークション売却、個別交渉による売却等が考えられる（人気・希少性のあるドメインだとレジストラーが手放したがらないらしい）
  * Value Domainが復活の交渉を代行することも可能だが確実ではない
  * 交渉の成功率は90％前後と見込まれる
  * 交渉を希望する場合は手数料32,400円（TLDによって異なる）が必要


# 判断
元々大して重要な使い方をしていたわけではなく、学習・玩具用として使っていたため32,400円をかける価値は無いと判断し放置。
人気があるわけでもないはずなのでそのうちリリースされるだろう。


# 原因
クレジットカードの番号が変わったことを失念しており、ドメインの更新が行われず期限切れになってしまいました。
普段仕事用アドレス以外はメールを見る習慣が無いため期限切れの通知メールを見つけられませんでした……。


# その後
週1くらいの頻度で新規登録ができないか確認していたところ、凡そ1か月を過ぎたところで再度登録できるようになっていたため再取得しました。
Route53のレコードはずっと放置していたためネームサーバーを更新した途端メールやら何やらが一斉に復旧（と同時にZabbixからメール＆Slack通知爆撃が発生（笑））
お金がかかったり交渉やら何やら色々と面倒事が発生するため失効には十分注意しましょう。
ずぼらな人はZabbix等で確実に見るところへ通知するようにしてもいいかもしれませんね。


# 追記(2016/11/04)
Zabbixはエージェントからの自動登録を行っておりIPアドレス直指定の監視だったため、ドメイン失効後もアラートがあがりませんでした
ZSHをホームディレクトリにインストール

ホームディレクトリにZSHを入れようとしてはまったので、メモ。
参考サイトの方法を組み合わせたらできた。

## ローカルへのインストール場所などを作成

```bash
mkdir -p $HOME/apps/src
```

## ncursesをインストール

```bash
cd $HOME/apps/src
curl -L 'ftp://ftp.gnu.org/gnu/ncurses/ncurses-6.0.tar.gz' | tar -zx
cd ncurses-6.0
./configure --prefix=$HOME/apps --with-shared --enable-widec
make
make install
```

### コンパイルオプションについて

* `with-shared`を付けないと`ZSH`を`make`する時に、使うライブラリに`-fPIC`付けろと怒られる。
* `enable-widec`は、参考サイトに書いてあったからつけた。マルチバイト対応っぽい？


## ZSHをインストール

```bash
cd $HOME/apps/src
curl -L 'http://www.zsh.org/pub/zsh-5.2.tar.xz' | tar -Jx
cd zsh-5.2
./configure --prefix=$HOME/apps --enable-cflags="-I$HOME/apps/include" --enable-cppflags="-I$HOME/apps/include" --enable-ldflags="-L$HOME/apps/lib"  --enable-multibyte --enable-locale --enable-pcre --with-tcsetpgrp
make
make install
```

### コンパイルオプションについて

* 共有場所以外のライブラリを使う際には、`enable-cflags`とかで指定できるらしい。
* `--with-tcsetpgrp`を付けないとtcsetpgrpが使えないエラーが出る
 * ncursesにsharedオプションを付けていないと何故か出なかった気がする。
* あとはマルチバイト対応とか。

## 起動

```bash
LD_LIBRARY_PATH=$HOME/apps/lib zsh
```

### 解説

ライブラリの場所指定しないといけない。
.bashrcとかに追加しといた方が良さそう。

## 参考

http://qiita.com/sifue/items/1dd6c01f9e3a333cf3f0
http://tm.root-n.com/unix:zsh:install_5_0_2
http://loumo.jp/wp/archive/20130327221828/
EC2にrails+unicorn+nginxの環境構築@2016.11.4

## nginxのインストール
[nginx] Amazon Linuxにnginxをインストールする (nginx本家パッケージ) by @tcsh on @Qiita http://qiita.com/tcsh/items/ab40d61944f4ab5ecd8d


## RubyとRailsをインストールする
Amazon LinuxにRuby on Rails環境構築(rbenv + ruby-build + Ruby 2.2.1 + Rails 4.2.1インストール) by @na0AaooQ on @Qiita http://qiita.com/na0AaooQ/items/5bd62e630a2faf051a52

参考：
3分でできるRailsダウングレード by @hassasa3 on @Qiita http://qiita.com/Hassan/items/eef26c870eb26a0c68e0

## unicornの設定
Rails 4.2 + Unicorn + Nginx でアプリケーションサーバの構築 by @salinger001101 on @Qiita http://qiita.com/Salinger/items/5350b23f8b4e0dcdbe23
VBの無名関数（デリゲート）サンプルメモ

#概要
またもやクソ投稿でもうしわけない。
１つの関数内で使い回したいちっちゃなロジックが欲しいなと思ったとき、外部にPrivateとかで関数を作ると１つのクラス内でPrivateが増殖しちゃうので、Javascriptみたいに無名関数（デリゲート）を作ります。
その時のメモ的なものです。

#サンプル

##VB

コンソールアプリで下記を作成。
[MSDN Func(Of T, TResult) Delegate](https://msdn.microsoft.com/en-us/library/bb549151.aspx)

```vb
Module Module1

	Sub Main()
		Dim list As New List(Of String)

		Dim TestFunc As Func(Of List(Of String), List(Of String)) = _
		 (Function(p_ As List(Of String)) As List(Of String)
			  Dim a As New List(Of String)

			  For Each p As String In p_
				  list.Add(p)
				  a.Add(p & "!")
			  Next

			  Return a
		  End Function)

		Console.WriteLine("*************")
		For Each a As String In list
			Console.WriteLine(a)
		Next

		Console.WriteLine("setTest")
		For Each a As String In TestFunc(New List(Of String) From {"a", "b", "c"})
			Console.WriteLine(a)
		Next

		Console.WriteLine("dim list")
		For Each a As String In list
			Console.WriteLine(a)
		Next

	End Sub

End Module
```

実行結果
（知らない人が身近にいたので、、、コンソールは実行するとEnd Subでプロセス自体終了しますが、`Ctrl + F5`すれば止まります。）

![result.png](https://qiita-image-store.s3.amazonaws.com/0/32577/8ca39ea6-63ec-832a-441f-a4546a6b5954.png)

##js

jQuery.eachとかやっちゃったので、jQueryのサイトとかでコンソール開いてコピペして下さい。

```js
var list = [];
var TestFunc = function(p_){
	var a = [];

	jQuery.each(p_, function(i, v){
		list.push(v);
		a.push(v + '!');
	});

	return a;
};

console.log('*************');
console.log(list);

console.log('setTest');
console.log(TestFunc(['a', 'b', 'c']));

console.log('list');
console.log(list);
```

実行結果

![result.png](https://qiita-image-store.s3.amazonaws.com/0/32577/d8360ccd-546f-63bc-dc74-a0f5f3eaceb9.png)
OWASP ZAPでwebアプリケーションの脆弱性診断

OWASP ZAPというツールでwebアプリケーションの脆弱性診断を実施した。

OWASP ZAPとは、「ZAP is an easy to use integrated penetration testing tool for finding vulnerabilities in web applications.」ということなので、プラットフォーム診断は別のツールで行う必要がありそう。

いろいろなテストの実行方法があるようだが、今回はブラウザのプロキシに設定してテストを実行した。

# 手順

## ダウンロード&インストール

https://github.com/zaproxy/zaproxy/wiki/Downloads

上記からダウンロードし、インストール。今回はMacにインストールした。

## 証明書を設定

![スクリーンショット 2016-11-04 午前9.08.17.png](https://qiita-image-store.s3.amazonaws.com/0/37872/a548ab8e-ece4-afb0-452b-e25ca7ce7318.png)

ローカルプロキシ経由でSSLを利用しているサイトにアクセスする為に証明書をインストールする。
右ペインのSaveボタンをクリックし保存した証明書をブラウザにインストール。

## 起動しproxyの設定を確認

![スクリーンショット 2016-11-04 午前8.59.23.png](https://qiita-image-store.s3.amazonaws.com/0/37872/72f2fabd-e200-a7b3-47bb-e82f63937103.png)

デフォルトでは8080番ポートが指定されている。今回はそのまま利用した。

## ブラウザのproxy設定

設定したローカルプロキシをブラウザに設定する。

## テスト実施

proxyを設定したブラウザでテスト対象のサイトにアクセスし、テストしたいページを開く。

## テスト結果の確認

下のAlertsペインに結果が表示される。

![スクリーンショット 2016-11-04 午前9.00.11.png](https://qiita-image-store.s3.amazonaws.com/0/37872/582b0bcf-fef7-ff41-198d-cb77545b991c.png)

# 公式へのリンク

https://www.owasp.org/index.php/OWASP_Zed_Attack_Proxy_Project

https://github.com/zaproxy/zap-core-help/wiki
superはそのクラスのスーパークラス

クラスのコンストラクタ内に、super();という記述が入っていたので調べてみた。

AS3ドキュメントには、以下のように書かれているらしい。
 コンストラクタは、super() ステートメントを使用して直接のスーパークラスのコンストラクタを明示的に呼び出すことができます。スーパークラスのコンストラクタを明示的に呼び出さない場合は、コンパイラによってコンストラクタ本体の最初のステートメントの前に呼び出しが自動的に挿入されます
↓
以下のように解釈
superを書いておけば、明示的にスーパークラスのコンストラクタを呼び出せる
superを書いていなければ、コンパイラによってコンストラクタ本体の最初が呼び出される前に、スーパークラスのコンストラクタが呼び出されます。

そもそもsuperは、スーパークラスを意味していて、
super.メソッド名;で、スーパークラスのメソッドを実行。
super();で、スーパークラスのコンストラクタを呼び出すなどを行えるそうだ。
win10 > 黒い画面で丸いものがクルクルし続ける > その場しのぎ | 設定変更

```txt:動作環境
Windows 10
ドメイン参加している
```

### 状況

PCの電源をONにすると、白丸が円形状に並んだ状態でクルクルし続ける。
5分経ってもそこから変化しない。

### その場しのぎ

- PCの電源を落とす
- ネットワークケーブルを抜く
- PCの電源を入れる
  - ログイン画面が表示される
- ネットワークケーブルを挿す

上記でログイン画面が出るまでに2回の{PC電源OFF, PC電源ON}をした。それが有効だったかは不明。

ネットワークケーブルを抜いたのは、過去にWindows7でも同じような症状が出て、偶然試した方法として有効だった(と思われる)ため。

### 設定変更

「高速スタートアップを有効にする」のチェックを外す。

設定方法は以下が参考になりました。

https://i-bitzedge.com/tips/how-to-turn-off-fast-start-up-on-windows-10

情報感謝です。
vmdebootstrap

## 参考

* [Deploying a KVM (x86_64) Device — LAVA Server 2016.9 documentation](https://lava.debian.net/static/docs/v1/kvm-deploy.html)
* [sourCEntral - VMDEBOOTSTRAP](http://man.m.sourcentral.org/debian-unstable/8+vmdebootstrap)

## 使い方

```bash:
apt install -y vmdebootstrap
```

```bash:debian-jessie
sudo vmdebootstrap \
 --image="jessie_1gb.img" \
 --mirror="http://ftp.jp.debian.org/debian" \
 −−distribution="jessie" \
 --verbose \
 --serial-console \
 --enable-dhcp
```

```
sudo chmod a+w jessie_1gb.img
```

```bash:起動
qemu-system-x86_64 \
 -m 1024 -enable-kvm \
 -drive format=raw,file="jessie_1gb.img",if=virtio \
 -redir tcp:2222::22
```

ネットワーク設定どうやるんだっけな・・・

```
ssh -p 2222 localhost
```

とりあえずProxyサーバを立ち上げて通信できた。 

* [たった200行でProxyが動作するPythonProxyを拡張してアクセス拒否機能を追加しました。 - Qiita](http://qiita.com/tukiyo3/items/999427a86248abc9a874)

```bash:
export HTTP_PROXY="10.0.2.2:8080"
wget http://yahoo.co.jp
```


----


* ubuntuの作成は失敗した

```bash:
Creating disk image
Creating partitions
Installing MBR
Creating filesystem ext4
Mounting /dev/mapper/loop0p1 on /tmp/tmpSJY4io
Debootstrapping stable [amd64]
EEEK! Something bad happened...
command failed: ['debootstrap', u'--arch=amd64', u'--include=linux-image-amd64,acpid', 'stable', '/tmp/tmpSJY4io', 'http://archive.ubuntu.com/ubuntu']
W: Cannot check Release signature; keyring file not available /usr/share/keyrings/debian-archive-keyring.gpg
I: Retrieving InRelease 
I: Failed to retrieve InRelease
I: Retrieving Release 
E: Failed getting release file http://archive.ubuntu.com/ubuntu/dists/stable/Release


Cleaning up
ERROR: command failed: ['debootstrap', u'--arch=amd64', u'--include=linux-image-amd64,acpid', 'stable', '/tmp/tmpSJY4io', 'http://archive.ubuntu.com/ubuntu']
W: Cannot check Release signature; keyring file not available /usr/share/keyrings/debian-archive-keyring.gpg
I: Retrieving InRelease 
I: Failed to retrieve InRelease
I: Retrieving Release 
E: Failed getting release file http://archive.ubuntu.com/ubuntu/dists/stable/Release
```
技術英語 > You don't need to learn how to fix defects; you need to learn how to avoid them [in the first place].

@ Code Complete (No. 17387 / 36077)

> You don't need to learn how to fix defects; you need to learn how to avoid them <font color=red>in the first place</font>.

http://ejje.weblio.jp/content/in+the+first+place
> 第一に、まず、そもそも

上記の文章では「そもそも(最初から)」という意味で使われていそう。
html内のaタグをクリックで 常に新しいタブで開くbaseタグ

* html内のaタグをクリックで 常に新しいタブで開く

## header内に記載

* [HTML base target Attribute](http://www.w3schools.com/tags/att_base_target.asp)

```html
<head>
<base target="_blank">
</head> 
```

## 注意点

```html
<a href="#jump">aaa</a>
```

も新しいウィンドウで開いてしまう。

対策知っている方教えてください。

コメント欄参照
Twitch 英語でチャットが来た時の対処

# 英語でチャットが来た時の対処

## Googleで翻訳と検索

1. 翻訳で検索
2. 日本語を翻訳する設定にする
![image](https://qiita-image-store.s3.amazonaws.com/0/111261/4670be68-c3c8-724a-2ed6-98d3b5333b1e.png)

## 日本語を入力して英語を翻訳する
左側のテキスト欄に翻訳してほしい日本語を入力する。
![image](https://qiita-image-store.s3.amazonaws.com/0/111261/806eebf8-7466-41f7-fd7e-d7bb263696c1.png)

## マイクを使って日本語を翻訳する
配信の際にマイクが設定されているのであれば、マイクアイコンをクリックして日本語を話しかける。
英語に翻訳された後に、英語で発音してくれる。
一石二鳥だし、認識もすごくよかった。
![image](https://qiita-image-store.s3.amazonaws.com/0/111261/ac46fa39-c019-9b7d-2230-4b770b3aa889.png)
シェルって何なのって人たちへ＃002

#対象
環境問わず(winは仮想ね)、上司、先輩に「シェル勉強しなさい。」と脅された、または諭された人たち。（負けんな）

##解説
```1.sh
#!/bin/bash
echo "Hello sh!"
exit 0
```

作業フォルダを作成し、セーブしたら　
bash 1.sh

簡単ですね。

で、シェルの種類なのだが、実は色々あります。
ここは好みがわかれる。宗教に近い。
個人的には昔懐かしいcシェル好きです。
でも、今はbashでいいと思います。
特にあなた！！いいですか？とにかくbash!!

で、ここまで来てすまないんだけど、こちら素晴らしい記事です。
http://qiita.com/zayarwinttun/items/0dae4cb66d8f4bd2a337