OmniAICreator/Qiita-1.07M huggingface dataset:
ActiveRecord::Baseメソッドの基本中の基本

Tweetモデルがありtweetsteテーブルがある場合。。。

```
Tweet.all
Tweet.new
Tweet.save

Tweet.create
Tweet.create(name: "takashi", text: "Nice to meet you!")

Tweet.find
tweet = Tweet.find(1)
#tweetにtweetsテーブルのID1の情報が代入されている状態。
Tweet.find(1)でももちろんOK

Tweet.find_by(name: 'tanaka')
とするとIDじゃなくても検索できるよ

Tweet.where(name: 'atsushi')
nameのカラムがatsushiのものを全部引っ張ってくる。

Tweet.limit(5)
tweetsテーブルから最初の５件を取得(IDが若い順)

tweets = Tweet.all
tweets.order('id DESC')
指定したレコードのカラムの中身の数値が大きい順にレコードを並び替え
つまりIDが大きい順に並ぶから最新のものから出るという事
DESC は降順の意味の Descending、ASC は昇順の意味の Ascending という英語の略です。

tweet = Tweet.find(3)
tweet.update(name: 'takeshi')
で情報の更新を行う。
```

<%= simple_format(引数) %>
①改行は<br/>を付与
②文字列を<p>で括る
javascriptでワンライナーでArray shuffle (2016年版)


小ネタ

たまに「じゃんけんする代わりぐらいなノリでワンライナーでシャッフルしたい！
rubyの`shuffle`ぐらいなやつでやりたい！でも手元にはchromeぐらいしかない！」

という事があるが、ぐぐってみると思ったほど自分にヒットするやり方が載ってなかったのでメモる。

---
※ ワンライナーでやるために`sort`を利用しているが、[Array#sort実装のshuffleは偏る](http://qiita.com/minodisk/items/94b6287468d0e165f6d9) らしいので、
今回の方法はくじ引きの代わりぐらいに留めて、ちゃんとしたい場合はlodashなどのライブラリを利用するほうが良い。

### やり方

```js
["apple", "banana", "orange"].sort( () => Math.random() - 0.5)

// 一人だけ選びたいならこんな感じ
["apple", "banana", "orange"].sort( () => Math.random() - 0.5)[0]

// 複数人選びたいならこんな感じ
["apple", "banana", "orange"].sort( () => Math.random() - 0.5).splice(0,2)
```

`sort`時に`Math.random()`の返す乱数を元に `true / false`をテキトーに返す。
`Math.random()`はseedを設定したり出来ないので、再現性があるようなコードではないので、production利用用途とかならもうちょっと別な手法のほうが良いだろう。


手元にIEしかない！という時はarrow functionやめればいける。

```js
["apple", "banana", "orange"].sort( function(){ return Math.random() - 0.5 })
```

数列をshuffleしたいならこんな感じ。魔術感出てきた。

```js
[...Array(3).keys()].sort( () => Math.random() - 0.5)
```
(参考: http://rochefort.hatenablog.com/entry/2015/01/08/005043)
Action Cable でプログレスバーを更新する

# 概要

こんにちは、QUANON です。

Rails 5 の Action Cable の登場により、Rails アプリケーションの可能性がぐっと広がりましたね。今回はその Action Cable のシンプルな利用例を 1 つご紹介したいと思います。

# 利用例

サーバ側で何か重い処理を実行しており、その進捗率を逐次ユーザに伝えることができれば便利ですよね。例えば「ユーザから大量データの CSV ファイルの生成リクエストを受け付けて、その生成状況を画面上のプログレスバーにリアルタイムで表示する」などです。クライアントから Ajax 通信でサーバに進捗率を定期的に問い合わせ、その結果を受けてプログレスバーを更新することも可能ですが、できればもっとスマートな方法を選びたいですね。

そこで Action Cable の出番です。WebSocket を使って、サーバからクライアントに直接進捗率を送ってみます。

なお、プログレスバーの HTML はこんな感じです。[Bootstrap 4](http://v4-alpha.getbootstrap.com/) の[プログレスバー](http://v4-alpha.getbootstrap.com/components/progress/)を使用しています。

```html
<div class="progress-percentage text-xs-center">0%</div>
<progress class="progress progress-striped" max="100" value="0"></progress>
```

また Action Cable 自体についての説明やセットアップ方法については省略します。

最初に Channel クラスを作成します。まずサーバ側です。

```app/channels/progresses_channel.rb
class ProgressesChannel < ApplicationCable::Channel
  def follow(data)
    stream_from("progresses:#{data['progress_id'].to_i}")
  end
end
```

次にクライアント側です。

```app/assets/javascripts/channels/progresses.coffee
App.progresses = App.cable.subscriptions.create 'ProgressesChannel',
  connected: ->
    @install()
    @follow()

  received: (data) ->
    $('.progress-percentage').text("#{data.percent}%")
    $('progress').prop('value', data.percent)

  follow: ->
    # 例示のため、購読対象の識別子 (progress_id) は決め打ち
    @perform('follow', progress_id: 1)

  install: ->
    $(document).on('page:change', -> App.progresses.follow())
```

実装が終わったら Rails サーバを起動します。ここでは Action Cable サーバは Rails サーバに組み込まれていることを想定します (別のサーバとして起動することも可能なため) 。動作確認のため、別途 Rails コンソールも起動します。ここで注意点ですが、開発環境のデフォルトの[サブスクリプションアダプタ](http://railsguides.jp/action_cable_overview.html#%E3%82%B5%E3%83%96%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%A2%E3%83%80%E3%83%97%E3%82%BF)は `async` です。これでは同一のプロセスからの `broadcast` しか有効になりません。つまり Action Cable サーバと別プロセスである Rails コンソールから `broadcast` を実行しても何も起きません。そこで [Redis](http://redis.io/) を使うように設定しておきます。

```config/cable.yml
development:
  adapter: redis
  url: redis://localhost:6379
```

では Rails コンソールから `broadcast` を実行してみます。今回の例では、

```rb
ActionCable.server.broadcast('progresses:1', percent: 64)
```

のようなコードを実行します。

![progress.gif](https://qiita-image-store.s3.amazonaws.com/0/6697/3e91ee6d-b695-b3b7-d041-92139cf3d6d3.gif)

Rails コンソールで実行したコードと画面のプログレスバーが同期しているのが分かります。

実際は ActiveJob を利用して、バックグラウンドジョブの中で `broadcast` を実行することになると思います。

# 感想

Action Cable は様々な場面で役立ちそうですし、なによりリアルタイムに動く様子は実装していて非常に楽しいです。Rails 5 は最高ですね :blush::two_hearts: 
皆さんも是非 Action Cable をエンジョイしてみてください。
Reactで描画回数を制限する（ためのHOCを作った）

## 起こった問題
Reactでグラフを表示するライブラリを用いて、現在の状態をリアルタイムで表示するアプリケーションを作ったが、いかにも描画が追いついてなさそうな感じになった。

## 原因
- ライブラリの描画コストが高すぎる。
- Propsの変更頻度が割と高い。

## 解決策
グラフ以外の部分は普通に描画できているのでストア側でなんとかする必要はない。
だから問題のコンポーネントだけ描画回数を制限すれば良い。

## 調査
いろいろ探したけど、良さそうな実現方法を見つけることができなかった。
だから作ることにした。

## 作った
```js
import throttle from 'react-throttle-render';
const wrappedComponent = throttle(component, 50);
```
これで、この`component`は最低50msの間隔を空けて更新されるようになる。

### やってること
`shouldComponentUpdate`でいろいろやっているだけで、特殊なことは何もしていない。

### パッケージ化の理由
バイト先で「Reactでグラフを表示するライブラリを用いて、現在の状態をリアルタイムで表示するアプリケーション」を量産していて、これからも作り続けていくことになりそうなのでパッケージ化した。

### どういう時に役に立つか
- 特定のコンポーネントだけ重い時。
- 単純に負荷軽減をしたい時。

## その他あまり関係のないこと
一応、テンポが良い記事を目指して書いてみたつもり。（あまりたくさん書きたくなかっただけ。）

## リンク
npm: [![npm version](https://badge.fury.io/js/react-throttle-render.svg)](https://badge.fury.io/js/react-throttle-render)
github: [ryo33/react-throttle-render](https://github.com/ryo33/react-throttle-render)
さくらのクラウド：サーバのクローンでネットワークに繋がらなくなった時の対応

# 初めに

今回、さくらのクラウドでサーバのクローンを作ってみました。よく考えずに、全く設定を変えずにストレージ内容そのままのクローンをつくると外部から接続できなくなったときの対応した手順です。

# 暫定対応

とりあえずSSHが繋がらないと話にならないので、ブラウザでさくらのクラウドの管理画面にアクセスし、該当するサーバのコンソールにアクセスする。

コンソール画面にアクセスし、まず ufw を確認、OpenSSHがあり、sshdも動いているので問題なし。

```
ufw app list
```

ping 等をしてみるとどこにもアクセスできないので、netstat -r で確認すると、何も設定されていない。なので、管理画面のサーバの情報を参考に、route コマンドで設定しようとすると、eth0 がないとのメッセージが出る

```
route add -net XXX.YYY.ZZZ.0 netmask 255.255.255.0 eth0
SIOCADDRT: No such device
```

疑問に思いつつ ifocinfg -a で確認すると、eth0 がなく、eth1 がある。試しに eth1 に設定すると外部から無事sshなどのアクセスができるようになった。

```
route add -net XXX.YYY.ZZZ.0 netmask 255.255.255.0 eth1
route add defalt gw XXX.YYY.ZZZ.1 eth1
```

とりあえずの危機は脱したが、まだ eth0 はない。

# eth0の設定

ネットワークインターフェースの設定ファイルを確認すると、クローン前の情報のままだった。eth0に正しいアドレスに書き換えて再起動する。

```
vi /etc/network/interfaces
reboot
```

でも相変わらず、eth1に割り当たる。なので、dmesg で起動時のログを確認すると以下のように、eth0 が eth1 にリネームされていることがわかった。

```
[    2.075860] IPv6: ADDRCONF(NETDEV_UP): eth0: link is not ready
[    2.573261] systemd-udevd[299]: renamed network interface eth0 to eth1
```

この原因についてネット上を検索してみると、Macアドレスが競合してる可能性が考えられるらしい。というので、udevのルールファイル
```
/etc/udev/rules.d/70-persistent-net.rules 
```
を見るとしっかり eth0 にクローン前の、eth1 には、ifconfig -a で確認できるMACアドレスになっていました。NICは一つしかつかわないので、eth0 に、正しいMACアドレスを設定。

```
# PCI device 0x1af4:/sys/devices/pci0000:00/0000:00:03.0/virtio0 (virtio-pci)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="9c:a3:ba:aa:bb:cc", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"
```

こでで再起動すれば無事、eth0で使えるようになった。

## 蛇足

ついでにホストネームの変更（/etc/hostname）と、名前解決（/etc/hosts）も直しておく。

# 結論

ストレージの内容そのままにクローンのサーバをつくると。元の設定が競合して問題になることがある。当然といえば、当然の話なのだが、今回はうっかりしていました。

理由を考えると、AWSのEC2のDuplicationと同じ感覚でクローン操作したのが一因かもしれない、AWSの場合、IPアドレスはデフォルトではDHCPで設定されるのでとりあえず繋がっていた。もっとも、AWSのEC2はコンソールにアクセスはできないので、SSHが繋がらなくなると直接手を出せなくなってしまいます。ブートに使うEBSを、他のEC2にマウントして編集という技もありますが。

# 参考

* https://unix.stackexchange.com/questions/91085/udev-renaming-my-network-interface
Ecto Model をMemcachedとかにキャッシュしてみる

# Ecto Model をキャッシュする
ここでは [memcache_client](https://github.com/tsharju/memcache_client) を使います。
## 例えばこんなUserモデルがあります
```ex
defmodule Models.User do
  use Web, :model

  schema "users" do
    field :username, :string
    field :email, :string

    timestamps
  end

  @required_fields ~w(username email)
  @optional_fields ~w()

  @doc """
  Creates a changeset based on the `model` and `params`.
  If no params are provided, an invalid changeset is returned
  with no validation performed.
  """
  def changeset(model, params \\ :empty) do
    model
    |> cast(params, @required_fields, @optional_fields)
  end
end
```
## Userをそのまま入れてみます
```iex
iex(1)> user = %Models.User{}
%Models.User{__meta__: #Ecto.Schema.Metadata<:built>, username: nil, email: nil, inserted_at: nil, updated_at: nil}

iex(2)> Memcache.Client.set("key", user)
** (ArgumentError) argument error
    (memcache_client) lib/memcache_client.ex:253: Memcache.Client.store_request/4
    (memcache_client) lib/memcache_client.ex:242: Memcache.Client.do_store/4
```
普通に入れてもそのままではエラーが起きます。
## バイナリに変換してセットする
```iex
iex(3)> data = :erlang.term_to_binary(user)
<<131, 116, 0, 0, 0, 17, 100, 0, 8, 95, 95, 109, 101, 116, 97, 95, 95, 116, 0,
  0, 0, 4, 100, 0, 10, 95, 95, 115, 116, 114, 117, 99, 116, 95, 95, 100, 0, 27,
  69, 108, 105, 120, 105, 114, 46, 69, 99, 116, 111, 46, ...>>

iex(4)> Memcache.Client.set("key", data)
%Memcache.Client.Response{cas: 1, data_type: nil, extras: "", key: "",
 status: :ok, value: ""}
```
## ゲット時はバイナリから Ecto Model に変換します
```iex
iex(5)> response = Memcache.Client.get("key")
%Memcache.Client.Response{cas: 1, data_type: 0, extras: <<0, 0, 0, 0>>, key: "",
 status: :ok,
 value: <<131, 116, 0, 0, 0, 17, 100, 0, 8, 95, 95, 109, 101, 116, 97, 95, 95,
   116, 0, 0, 0, 4, 100, 0, 10, 95, 95, 115, 116, 114, 117, 99, 116, 95, 95,
   100, 0, 27, 69, 108, 105, 120, 105, 114, 46, ...>>}

iex(6)> user = :erlang.binary_to_term(response.value)
%Models.User{__meta__: #Ecto.Schema.Metadata<:built>, username: nil, email: nil, inserted_at: nil, updated_at: nil}
```

バイナリにしてしまえばMapでもStructでも何でもmemcacheやredisにセット出来るようになります。
check_boxで複数のデータをまとめて削除する方法


##index上でcheck_box_tagを用いてデータを複数まとめて削除する方法をまとめます。


今回はデータの一覧が表示されているindexで削除をしてみます。

```ruby:index.html.slim

= form_tag({ controller: :regular_debit_accounts, action: :destroy_all },method: 'delete') do # form_tagは何も指定しないとcreateが実行されてしまうので、method等は指定してあげてください

 - @regular_debit_accounts.each do |regular|
        tr
          td = check_box_tag "deletes[#{ regular.id }]", regular.id # checkしたものに対してidを持たせます

  = submit_tag '一括削除!'

```

```rb
#htmlで確認してみると、check_box_tagでは例えば値がこのように入っています。

input type="checkbox" name="deletes[10]" id="deletes_10" value="10"

```


次にコントローラーで一括削除の処理

```ruby:regular_debit_accounts_controller.rb
  def destroy_all
    checked_data = params[:deletes].keys # ここでcheckされたデータを受け取っています。
    if RegularDebitAccount.destroy(checked_data)
      redirect_to regular_debit_accounts_path
    else
      render action: 'index'
    end
  end
```
ルーティング=> index上で削除を実行するのでidとかは必要ありません

```ruby:routes.rb

  delete :regular_debit_accounts, to: 'regular_debit_accounts#destroy_all'
```

こちら参考にさせていただきました.
http://railsguides.jp/form_helpers.html
http://d.hatena.ne.jp/gedit/20090618/1245320340
Bootstrap Tooltip を地図のマーカー ラベルにしてみる

[Bootstrap Tooltip](http://getbootstrap.com/javascript/#tooltips) はよくご存知だと思います。これね。

![スクリーンショット 2016-08-26 20.07.40.png](https://qiita-image-store.s3.amazonaws.com/0/81547/1d4e5db2-ae22-3691-8dd6-b11caa5e5c23.png)

これを [Leaflet.js](http://leafletjs.com) のマーカーのラベル表示に応用します。
Leafle.js のプラグインにはラベル表示のためのライブラリがいくつかありますが、もし Bootstrap を併用することが前提であれば、この方法を使えばわざわざプラグインを採用せずにラベル表示を実現できますよ。

![スクリーンショット 2016-08-26 20.10.27.png](https://qiita-image-store.s3.amazonaws.com/0/81547/c755aa31-4d21-957a-4a85-fb91012fa5d5.png)

### Bootstrap Tooltip

Bootstrap Tooltip は DOM に必要な属性を与えてあげて、JS で初期化するだけです。
下のコードは Bootstrap ページに載ってるスニペットそのままです。

```html
<button type="button" class="btn btn-default" data-toggle="tooltip" data-placement="top" title="Tooltip on top">Tooltip on top</button>
```

```js
$(function () {
  $('[data-toggle="tooltip"]').tooltip()
})
```

### Leaflet マーカーへの適用

Leaflet.js のマーカーももちろん DOM を持ってますから、同じ要領でやればマーカーに tooltip を適用できます。
下のコードは GeoJSON で読み込んだ複数マーカーに対して tooltip を適用する場合の実装例です。
簡単で便利なので、ぜひやってみてください。

```js
var geojson = L.geoJson(data).addTo(map);
// GeoJSON の各マーカーをループ処理で参照
geojson.eachLayer(function (layer) {
  // マーカーの DOM 要素
  var markerElm = $(layer._icon);
  // Bootstrap tooltip 適用のための属性を追加
  markerElm.attr({
    'data-toggle': 'tooltip',
    'data-placement': 'top'
  });
  // マーカー要素の tooltip 初期化と属性データを表示テキストに指定
  markerElm.tooltip({ title: layer.feature.properties['場所名'], container: 'body' });
});
```

実際に動くデモとコードはこちらにあるので併せてご覧ください。
今回の実装は No.22 の Bootstrap Tooltip です。

http://muxlab.github.io/map-effects-100/
Rubyでハッシュの値を元に内訳を再構成する

以下のように、日時で入れ子になったハッシュの値にAとBが含まれるとき、Aの日時、Bの日時の一覧が欲しくなったので、ハッシュをこねくり回して目的のデータを作成したい。

```ruby:input
{ "2016-08-15" => { "18:00" => "A", "19:00" => "B", "20:00" => "A" },
  "2016-08-16" => { "19:00" => "A" } }
```

```ruby:output
{ "A" => ["2016-08-15 18:00", "2016-08-15 20:00", "2016-08-16 19:00"],
  "B" => ["2016-08-15 19:00"] }
```

### 結論
だいぶ長いが1行で書ける。

```ruby:
    input.map{ |date, daily_hash| daily_hash.inject({}) { |h,(time,v)| (h[v] ||= []) << "#{date} #{time}"; h }  }
      .inject({}){|result, part| result.merge(part){ |_, v, v2| v + v2 } }
```

…さすがに重たいので順を追って解説する。

### 解説

#### 外側のmap

細かい処理をhogeに書き換えるとこう。

```ruby:
input.map{ |date, daily_hash| daily_hash.hoge }
```

まず、`input`を`map`することで、日付ごとに入れ子になったハッシュが1つづつ取り出されて`date`、 `daily_hash`に格納される。

```
# 1回目： date = "2016-08-15", daily_hash = { "18:00" => "A", "19:00" => "B", "20:00" => "A" }
# 2回目： date = "2016-08-16", daily_hash = { "19:00" => "A" } 
```

この`daily_hash`を1つめの`inject`でこねくり回して目的のデータにしていく。

#### 1つめのinject
```ruby:
daily_hash.inject({}) { |h,(time,v)| (h[v] ||= []) << "#{date} #{time}"; h }  }
```
`inject`は初期値に対して畳み込みを行っていく。
この場合は空のハッシュが初期値であり、ブロックの`h`に呼び出されるので、ここに値を追加していきたい。`daily_hash`の値`v`をキーとして、日付`date`と時刻`time`から日時の文字列をつくり、配列`h[v]`に追加していく。`date`は`daily_hash`と同じブロックで取得している。
初期値を定義しないと`h[v]`が`nil`の状態で`<<`はできないので、`h[v] ||= []`で初期化している。
ブロックの中の最後の評価値が`inject`で畳み込まれていくので、セミコロンで区切って最後に`h`を呼んでいる。
8月15日ぶんのデータのみ細かく内訳を追っていこう。

```
# 初期値：{}
# 1回目： { "A" => ["2015-08-15 18:00"] }
# 2回目： { "A" => ["2015-08-15 18:00"], "B" => ["2015-08-15 19:00"] }
# 3回目： { "A" => ["2015-08-15 18:00", "2015-08-15 20:00"], "B" => ["2015-08-15 19:00"] }
```

#### 2つめのinject
map〜1つめの`inject`を`fuga`に置き換えるとこうなる。

```ruby:
input.fuga.inject({}){|result, part| result.merge(part){ |_, v, v2| v + v2 } }
```

まず、`input.fuga`は以下の様な状態になっている。

```ruby:
[{ "A" => ["2015-08-15 18:00", "2015-08-15 20:00"], "B" => ["2015-08-15 19:00"] }, { "A" => ["2015-08-16 19:00"] }]
```

これを`inject`を使って`Hash.merge`で畳み込んでいき、ハッシュの配列を1つの配列に統合する。
ここで、`merge`にブロックが与えられているのはハッシュの重複対策である。もしこれがなかったとしたら、ハッシュを結合する時に重複したキー`A`の値が上書きされてしまい、最終データは以下のようになってしまう。

```ruby:wrong_output
{ "A" => ["2016-08-16 19:00"], "B" => ["2016-08-15 19:00"] }
```

それでは困るので、キーが重複した場合は競合する値の`v`と`v2`を足して新しい配列を作る。前の処理で空の配列は初期化されているのでここでは`+`ができないケースを考える必要はない。

### 参考資料
- http://qiita.com/friedeggs@github/items/3b26d46d27e6dd02633f
- http://rubytips86.hatenablog.com/entry/2014/03/20/131901
ガトリングトーク


## Scala困った

### Scalaコンパイル遅い問題

- セプテーニオリジナル
	- 金の弾丸
- オプト
	- CIに時間がかかる
	- 並列にテストしたりしても胃共通のところで時間がかかる
	- CI早くする銀の弾丸求む
- CyverZ
	- MacBookProフルスペックを子宮
	- フルビルド走らなければそんなに気にならない

### SparkでSerializableじゃないオブジェクト転送してしまう

扱いがむずい

オブジェクトがどこで送られるのか理解が難しかった

### Scalaコード読みにくい

背景にある概念を自分が知らないだけな事も大あるので勉強しよう

### 初期のScalaコードツラい

Overwatchチーム

### Playframeworkバージョンアップツラい

HikariCPになって早くなった
1ヶ月くらい修正にかかった

### DAO実装ボイラープレート化

Scalaプロダクト2，3コ立ち上がったところで似たような実装がいっぱいあった

sbt-dao-generator

## DDDの困った

ユビキタス言語普及しない

せぷおり
言語の制定パターン
実装者が決め手レビューでもっむ

根気よく訂正しまくる。
何回も間違うとユビキタス言語が間違っている可能性

クラス定義に言葉の歴史を記述

オプト
良い名前は難しい
コンテキストも関わるので、殿名前が良いかは難しい
大事なのは対話を続けること
名前の変更が簡単な設計になっていること
が大事

さいばー
リーダー的立場の人が話し続ける

### アーキテクチャ選定に困る

課題解決のためのアーキテクチャを目指す
Scalaで学ぶヘキサゴナルアーキテクチャ実戦入門

参照用のモデルが増えて管理コストがかかる
CQRSを考察中

プロダクト感コラボができない
スクラムチームが肥大化

境界づけられたコンテキスト→マイクロサービス化

アプリの課題
アプリの肥大化
新しい技術を導入しづらい

オプト
まともに動くモノが作れそう
費用対効果が亜高い
保守せい高い、わかりやすい
両方を達成→ムリゲー

さいばーぜっと

最新DDDアーキテクチャとAkkaでの実装ヒント


## インフラの困った

EMRツラい
オプト

### Jenkinsおじさん

プロジェクトごとにJenkinsが活躍
バッチ処理にもJenkinsおじさん


### サブスクリプション導入大変

利用者じゃないとわからない
エンジニアマネージャが決裁権を持つ

## テストの困った

### Redshift依存のクエリテストが難しい

ローカルで実行環境作れない
Redshiftしかない機能をどうテストするのか
テストしてなかったら、本番でやってみたらあバグってたりとかよくあった。

## コードに落とし込む時に工夫していること

実装時に言葉以外の実装がないか気をつけてる
ドメイン層に
日本語で決める→英語で決める

## チームの困った

### レビューが大変

新人エンジニアのプルリクエスト入門
プルリクエストを利用した開発ワークフロー

## リスク

技術的負債が残る場合、リスクがあると言うことを関係者できっちり握った上で進める

## 急いで作れvsちゃんとつくる

**面白いと思って仕事しているときが一番パフォーマンスが良い**

## 新人

本を読む
好きな方法で掲示板を実装
レビュー通か
DDD本を読む
掲示板でDDDで作り直す
レビューーを突破する
Rで集計表

Rで大量の数値データを集計する方法。
通常はカテゴリカル化＆summaryで事足りるが、カテゴリー数が極度に多いとそれが通用しなくなるので、以下のような面倒な方法によるしかない。

```
filename="hogehoge.txt" #change the filename here
filename2=paste(filename,"_summary.txt",sep="")
read.table(filename) -> data
h <- hist(data$V1,breaks=seq(min(data$V1)-0.5,max(data$V1)+0.5,1))
write.table(h$counts,filename2,quote=F,append=F,sep="\t")
```
Jupyter(IPython)でNoteBookをモジュールとしてインポートする方法

Jupyterを使っていると別のnotebook(ipynbファイル）の関数や結果を使いまわしたくなりますよね。pythonモジュールとしてインポートする方法が公式にあったので紹介します。
（今後何回も使いそうなので自分の備忘録の意味も込めて）

公式のサイトの例:
http://jupyter-notebook.readthedocs.io/en/latest/examples/Notebook/Importing%20Notebooks.html

やり方としてはnotebookを実行して結果をモジュールとして登録して、sys.meta_pathを使ってimportをフックして呼び出します。
importが呼ばれた時点でnotebookは実行されますが、元の状態を変えないようになっているので安心してください。

以下コードです。

```
import io, os, sys, types
from IPython import get_ipython
from nbformat import read
from IPython.core.interactiveshell import InteractiveShell

def find_notebook(fullname, path=None):
    name = fullname.rsplit('.', 1)[-1]
    if not path:
        path = ['']
    for d in path:
        nb_path = os.path.join(d, name + ".ipynb")
        if os.path.isfile(nb_path):
            return nb_path
        nb_path = nb_path.replace("_", " ")
        if os.path.isfile(nb_path):
            return nb_path

class NotebookLoader(object):
    def __init__(self, path=None):
        self.shell = InteractiveShell.instance()
        self.path = path

    def load_module(self, fullname):
        path = find_notebook(fullname, self.path)
        with io.open(path, 'r', encoding='utf-8') as f:
            nb = read(f, 4)
        mod = types.ModuleType(fullname)
        mod.__file__ = path
        mod.__loader__ = self
        mod.__dict__['get_ipython'] = get_ipython
        sys.modules[fullname] = mod
        save_user_ns = self.shell.user_ns
        self.shell.user_ns = mod.__dict__
        try:
          for cell in nb.cells:
            if cell.cell_type == 'code':
                code = self.shell.input_transformer_manager.transform_cell(cell.source)
                exec(code, mod.__dict__)
        finally:
            self.shell.user_ns = save_user_ns
        return mod

class NotebookFinder(object):
    def __init__(self):
        self.loaders = {}

    def find_module(self, fullname, path=None):
        nb_path = find_notebook(fullname, path)
        if not nb_path:
            return
        key = path
        if path:
            key = os.path.sep.join(path)
        if key not in self.loaders:
            self.loaders[key] = NotebookLoader(path)
        return self.loaders[key]
```
これをnotebookutil.pyなどとして保存します。使うときは

```
import sys
import notebookutil as nbu
sys.meta_path.append(nbu.NotebookFinder())
```
とすれば、notebookをimportすることができます。

```
import mynotebook
```

関数やクラスが使えるのはもちろんですが、実際にnotebookを実行しているので変数なども実行時の値を持ったままimportできます。超便利！！

また、実行しているのでprintやplt.showなどが表示されていますが、notebookをimportしているセルをもう一度実行すれば見えなくなります。

これでより快適なJupyterライフが送れそうです。
括弧なんて省略できらぁっ！って人へ

# <font color='red'>こりゃあ面白いRubyistだぜ</font>

<font color='deeppink'>こりゃあどうしても括弧を使わずにプログラムを書いてもらおう。</font>

タイトルは煽りです。括弧を使わずに書くことに慣れすぎて思わぬところで意図しない結果になってしまうという`defined?`の注意点を書きます。

```rb
if defined? foo && foo.is_a? Array
    p 'true'
else
    p 'false'
end
```

さて、これを実行するとどうなるか・・・？

## <font color='teal'>*`foo`が定義されてない時点で`defined?`が`nil`を返すから"false"が出力されるに決まってらぁ！*</font>

そうはいかないぜ食いしんぼうさん。これは**syntax error**になります。なぜかは後で説明しますがsyntax errorを解消するには`is_a?`の引数を括弧で囲ってあげます。

```rb
if defined? foo && foo.is_a?(Array)
    p 'true'
else
    p 'false'
end
```
さて、これを実行するとどうなるか。

## <font color='teal'>*`foo`が定義されてない時点で`defined?`が`nil`を返すから"false"が出力されるに決まってらぁ！*</font>
いいえ、違います。
実はこれ"**true**"が出力されます。

`defined?`についておさらいすると、`defined?`は定義されていない式を与えると`nil`を返します。定義されている場合は評価した式の種別を文字列で返します。`true`ではありません文字列です。文字列が`true`として評価されるだけです。

例えば`defined? foo`を実行すると`foo`が定義されていなければ`nil`, `foo`が定義されていれば`"local-variable"`を返します。

さてなぜこのような結果になるかというと`defined? foo && foo.is_a?(Array)`は括弧がないため`foo`ではなく**`foo && foo.is_a?(Array)`**を評価していることになるからです。

つまり`foo`という変数が定義されているかではなく**`foo && foo.is_a?(Array)`**という式が定義されているか意味になり、これは`foo`が定義されているかどうかに関わらず`nil`でなく`"expression"`を返します。
<font color="gray">*※式が定義されているかという言葉を使いましたが`defined?`にどんな式を与えても`"expression"`を返すようです。*</font>

これでなぜ`if defined? foo && foo.is_a? Array`がsyntax errorになるかわかりましたね。**`foo && foo.is_a? Array`**という式は正しいRubyの書き方ではないからです。

ですのでこのように括弧を使えば意図したとおりの結果になります。

```rb
if defined?(foo) && foo.is_a?(Array)
    p 'true'
else
    p 'false'
end
```


### ついでなのでもう一点罠を

```rb
if false
    foo = []
end

if defined? foo
    p 'true'
else
    p 'false'
end
```
さて、これを実行するとどうなるか。

## <font color='teal'>*`if`が`false`に固定されていて`foo`に配列が代入されることはあり得ないから、定義されていない変数`foo`を`defined?`で評価すると`nil`を返し"false"が出力されるに決まってらぁ！*</font>

違います。実はこれも"**true**"が出力されます。`foo`への代入(ローカル変数`foo`の宣言)があると例え`if`で分岐されず`[]`が代入されなくても`foo`は宣言済みとして`nil`が入るからです。

以上、知らないとハマる`defined?`の罠でした！

### <font color='red'>**え！！括弧を使わずにプログラムを！？**</font>

*できらぁっ！*
Slim 3 Framework いまさらVagrant環境にインストールしてみる。その１

# さくっとフレームワークを使うときslimがいいらしい
php でとりあえずさくっとプログラムを作りたいがスクラッチだとなー、でも軽量な[フレームワークなんかないか～な](http://eng-entrance.com/php_framework)と探していたら[slim](http://www.slimframework.com/)がいいよっていうのを聞いたのでインストールしてみた。

> [Slim 3 Frameworkリリースされたので、ざっと紹介](http://qiita.com/asaokamei/items/f915a625cb4d3f9b38de)

## php は、5.5以上を使うとのこと
php 5.3でいいやと思っていたら[サポート期間切れて](https://www.wikiwand.com/en/PHP#/Release_history)いるのね知らなかった。いまどきだと 5.6 or 7.0 がいいみたいですな。

# インストール
php 7.0 を[手順に従ってインストール](http://qiita.com/ozawan/items/caf6e7ddec7c6b31f01e)してみる。MySQLのアクセスしたいのでpdoもいれてみる（もしかしたらフレームワークで用意されているのかもしれないけど…）。Apache2 もインストールされる。

```text
# yum install epel-release
# rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
# yum install --enablerepo=remi,remi-php70 php php-devel php-mbstring php-pdo php-gd php-mysqlnd unzip
```

composer もインストール

```text
# curl -s https://getcomposer.org/installer | php
# mv composer.phar /usr/local/bin/composer
```

# 早速 slim をインスコ
本家の [User Guide Installation](http://www.slimframework.com/docs/start/installation.html) 手順に従ってやってみる。

```text
$ mkdir slim; cd slim
$ composer require slim/slim "^3.0"

./composer.json has been created
Loading composer repositories with package information
Updating dependencies (including require-dev)
  - Installing container-interop/container-interop (1.1.0)
    Downloading: 100%         

  - Installing nikic/fast-route (v1.0.1)
    Downloading: 100%         

  - Installing psr/http-message (1.0.1)
    Downloading: 100%         

  - Installing pimple/pimple (v3.0.2)
    Downloading: 100%         

  - Installing slim/slim (3.5.0)
    Downloading: 100%         

Writing lock file
Generating autoload files
```

## とりあえずslim動作確認

```
$ cp ./vendor/slim/slim/example/index.php .
$ php -S localhost:8000 -t .
```

下記のコマンドを実行して動作確認する。

```
$ curl http://localhost:8000
$ curl http://localhost:8000/hello
$ curl http://localhost:8000/hello/hage
```
# Web Service化
本家の [User Guide Web Service](http://www.slimframework.com/docs/start/web-servers.html#apache-configuration) 手順に従ってやってみる。apache のバーチャルホスト設定共にやってみる。

まずslimの移動

```
# mv /home/vagrant/slim /var/www
# mkdir -p /var/www/slim/public
# cp -p /var/www/slim/vendor/slim/slim/example/index.php /var/www/slim/public/
```

apache のバーチャルホスト設定 ```slim3.conf``` つーファイルで作ってみたりする。

```text
Listen 8080
NameVirtualHost *:8080
<VirtualHost *:8080>
  ServerName slim3
  DocumentRoot /var/www/slim/public
  ErrorLog /var/log/httpd/slim.error.log
  CustomLog /var/log/httpd/slim.access.log combined
  LogLevel warn
  <Directory /var/www/slim/public>
    AllowOverride All
  </Directory>
</VirtualHost>
```

.htaccess も設定するってことで。こちらは ./vendor/slim/slim/example/.htaccess を参考にするとよいかも。

```
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^ index.php [QSA,L]
```

apache を再起動して確認。

終わり、これだけで使えるのかー。しかもslimのサイトシンプルでいいわ。

次回、MySQLアクセスしたデータの表示とかやってみる。
Railsで「Cannot render console from Allowed networks」と言われたら

開発環境でVagrantやDockerを使っていて、Railsで"Cannot render console from Allowed networks: 127.0.0.1, ::1, 127.0.0.0/127.255.255.255"と言われた場合は、config/environments/development.rbに下記を追加します。

```rb:config/environments/development.rb
  config.web_console.whitelisted_ips = '0.0.0.0/0'
```
Rails: deviseでユーザ編集画面のパスワード入力を任意にする

* deviseを使っている
* adminユーザに全ユーザのアカウント管理画面を作っている
* adminはユーザのパスワードを知らないので、現在のパスワードの入力なしにユーザのパスワードを変更できるようにしたい


```rb:controllers/users_controller.rb
  def update
    p user_params
    respond_to do |format|
      if @user.update_without_current_password(user_params)
        format.html { redirect_to @user, notice: 'User was successfully updated.' }
        format.json { render :show, status: :ok, location: @user }
      else
        format.html { render :edit }
        format.json { render json: @user.errors, status: :unprocessable_entity }
      end
    end
  end
```

Userモデルに下記メソッドを追加:

```rb:models/user.rb
  def update_without_current_password(params, *options)
    params.delete(:current_password)

    if params[:password].blank?
      params.delete(:password)
      params.delete(:password_confirmation) if params[:password_confirmation].blank?
    end

    clean_up_passwords
    update_attributes(params, *options)
  end
```

deviseのデフォルトで[`update_with_password`]というメソッドもあるが、これは現在のパスワードを必須とするものなので、上記のように自前で実装する外ない様子。

[`update_with_password`]: https://github.com/plataformatec/devise/blob/master/lib/devise/models/database_authenticatable.rb#L56

[deviseで現在のパスワード無しでuserを更新する - komagataのブログ](http://docs.komagata.org/4911)
Cocoaの機能を使ってRemindersで新規リマインダーを作成するAppleScript


* Reminders.appにはAppleScript用語辞書があり、リマインダーを作成できる
* Cocoaでは`EKEventStore`クラスと`EKReminder`クラスを使ってリマインダーを作成する
* 下2つのAppleScriptは同じ操作
	* Cocoaの機能を使った方はReminders.appを起動しなくても使える


```make_new_reminder_from_pure_AppleScript.scpt
tell application "Reminders"
	make new reminder at default list with properties {name:"New Reminder from pure AppleScript"}
end tell
```


```make_new_reminder_from_ASObjC.scpt
use framework "EventKit"

set eventStore to current application's EKEventStore's alloc()'s initWithAccessToEntityTypes:(current application's EKEntityMaskReminder)
set reminder to current application's EKReminder's reminderWithEventStore:eventStore
set reminder's title to "New Reminder from ASObjC"
set reminder's calendar to eventStore's defaultCalendarForNewReminders
eventStore's saveReminder:reminder commit:true |error|:(missing value)
```


## 更新履歴

* 2016-08-26: pure AppleScript版とASObjC版を作成
Xamarin.iOS でインターネット通信が可能かを取得する

Xamarin.iOS で、「端末からインターネット通信が可能か？」を調べたい。

Objective-C だと [Reachability](https://github.com/tonymillion/Reachability)、swift だと [Reachability.swift](https://github.com/ashleymills/Reachability.swift) を使うようだけど、 Xamarin.iOS ではどうするか？

* [Swift でネットワーク状況を調べる - メモ用紙](http://d.hatena.ne.jp/scientre/20150527/get_network_status_in_swift)

Bindingライブラリがあるのかな？と思ったら、サンプルで C# のソースコードが提供されていた。

* [Detect if Network is Available - Xamarin](https://developer.xamarin.com/recipes/ios/network/reachability/detect_if_network_is_available/)

の [``reachability.cs``](https://github.com/xamarin/monotouch-samples/blob/master/ReachabilitySample/reachability.cs) がそれ。
（名前から察して Reachability.swift を C# で書きなおしたもの？詳しくは見てないけど。）

で、このサンプルの ``Reachability`` を使うと、以下のような感じで、「インターネット通信が可能か？」を調べられる。

```C#
public bool IsNetworkAvailable
{
    get
    {
        return Reachability.InternetConnectionStatus() != NetworkStatus.NotReachable;
    }
}
```

WiFi とかセルラーとか細かいステータスもあるので、あとはコードを見てください。
自称SeleniumBuilder使いの私が、SeleniumIDEで同じ事が出来ないか調べてみた


SeleniumBuilderがFirefox48系に淘汰されたため、これを機会にIDEに乗り換えることにしました。
とはいえ、既存のシステムを改修する必要があるため、色々と問題になりそうな部分を調査してみます。

今回のテーマはこちら

- フレームの切り替え
- ウィンドウ(タブ含む）の切り替え

たぶん沼だと思います。

# 前提条件
フロントをFrameで作るな！
と言いたい所ですが、これは出来ないものとしてください…


# 調査環境

- Firefox46.0.1
- SeleniumIDE2.1.1.1-signed
- SeleniumBuilder2.3.5

# 本題：フレーム
ログインしてその先のフレームページのリンクをクリックして
フレームのレイアウトイメージとしてはこんな感じ

- (root)
	- main
		- nav
		- contains

思わず画面ごと叩き割りたくなりますが、ここはぐっと堪えます。
こういうレイアウトの画面に対してSeleniumIDEからアプローチします。

（作るのが面倒だったので某サイトさまのページレイアウトをローカルに作成して使用しています）

## Selenium IDE

![ide.png](https://qiita-image-store.s3.amazonaws.com/0/122800/61a93d07-9e62-5e4e-26a4-3b9ac1a39a50.png)
## Selenium Builder

![builder.png](https://qiita-image-store.s3.amazonaws.com/0/122800/babab318-045b-6b25-7263-b0ac205e532f.png)

# 本題：ウィンドウ
では、同じようにウィンドウを使ってみましょう。

## Selenium IDE

色々やってうまくいかなかったので、秘伝のタレをいただきました！
[もぎゃろぐ さま](http://blog.mogya.com/2009/07/selenuimtarget-blank.html)

![windowide.png](https://qiita-image-store.s3.amazonaws.com/0/122800/f2b14512-0e41-454c-184b-9196927d199d.png)

## Selenium Builder
コツはswitchToWindowByIndex。ウィンドウの変更ではうまく出来ません（名前がないため）
![windowbuilder.png](https://qiita-image-store.s3.amazonaws.com/0/122800/5a5c6821-fd2f-8154-634c-8f26f9f1fed1.png)

とりあえずこれで行けるっちゃ行けます。
たぶん秘伝のタレをいい感じに使えばBuilderでも使えるんじゃないでしょうか。
（需要があるかどうかは別として）

とはいえ、フレームやウィンドウの処理はホント魔窟です…
可能ならdivなりsectionなりで組み替えて欲しいです…

# 補足
ビデンスを取得するという意味では、これらの方法では結構怪しいです。
試しに取れるのか検証してみました。
（面倒なのでこれまたコンテンツ丸コピしちゃってます。画面が見えるとアレなのでなんとなく雰囲気を感じ取ってください）

## frame

### Selenium IDE
キャプチャソースです。
![captIDE.png](https://qiita-image-store.s3.amazonaws.com/0/122800/7e71d6e9-33f9-ce47-dde8-35eab4f5ba80.png)

outframe
![outframe.png](https://qiita-image-store.s3.amazonaws.com/0/122800/bacbc677-7e27-d1f4-ba42-69c50373acc5.png)

inframe
![inframe.png](https://qiita-image-store.s3.amazonaws.com/0/122800/1f0358c7-5374-0f88-36b1-33708071912c.png)

何となく分かりますかね？
outframeの外側がinframeに見つからないのを雰囲気で感じてもらえれば。

### Selenium Builder
こちらはどのパターンでもIDEのoutframeと同じ結果を返します。

![captBuilder.png](https://qiita-image-store.s3.amazonaws.com/0/122800/0dc04182-d65a-d41c-8a4b-a178826db9d1.png)

## window
### Selenium IDE
秘伝のタレの味が強すぎたようです。ちょっとエビデンスとして使用するのは辛いレベル。
黒塗りは私がやったのではありません。

![bokashi.png](https://qiita-image-store.s3.amazonaws.com/0/122800/8fd313c2-2908-9823-beca-c2ac99585479.png)

### Selenium Builder
想定していた結果はこちら。
背景黒にならず、きちんと取れている事を確認します（ボカシてるので確認も何もないですが）

![outframe.png](https://qiita-image-store.s3.amazonaws.com/0/122800/bacbc677-7e27-d1f4-ba42-69c50373acc5.png)

# まとめ

エビデンス取得を考慮する場合（というか大半？）は吟味したほうがいいです。
場合によっては外から画面キャプチャ撮るぐらいの方がいいかもしれませんね。

[→書きました。
SeleniumIDE・Builderのイケてないキャプチャ機能を改修する](http://qiita.com/nomurasan/items/21c9dabe898dfebe2a5c)

# 読了後いいね！をお願いします。
どれだけの方に読んでもらっているか知りたいので、お手数をおかけしますがご協力いただけると嬉しいです。
[他にも応用できます]SeleniumIDE・Builderのイケてないキャプチャ機能を改修する


画面だけを見てバリデーションできたらいいんですが、Seleniumの画面以外を見る必要があるテストケースの場合に使えます。
Seleniumのキャプチャ機能はあくまでもSeleniumが持っているページオブジェクトの情報しか見れないんですよね。
それってどうなの？というシーンがあった時に使えるテクニックです。

# 前提条件
マルチモニターで実施しないでください。winshotの仕様（？）でスクリーンショットが撮れません。
PrintScreenキーとはまた違うのかな、という気がします。

# 環境
## Selenium側
Firefox46.0.1
SeleniumIDE2.1.1.1-signed
SeleniumBuilder2.3.5
（アウトプットできればなんでもいいです）

## 環境側
windows系(検証環境はwindows10)
FWatch：ファイルの出力を監視してコマンドを実行します
winshot：今ディスプレイ（モニター）で見えている画面を撮ります

# ダウンロードなど
この辺からどうぞ
[FWatch ファイル監視について](http://fwatch.osdn.jp/)
[窓の杜](http://forest.watch.impress.co.jp/library/software/winshot/)

# 実施手順
まずはサクッとインストールしてください。
**インストール先はProgram Files...ではないほうが良いです。半角スペースがエラーの原因になります。**

FWatchから設定します。
まずは開きましょう。アプリを間違えないでください。

![fwatch.png](https://qiita-image-store.s3.amazonaws.com/0/122800/97f70d99-cfa4-8059-5a92-c7f7d831c560.png)

追加ボタンをポチッと

![fwatch_add.png](https://qiita-image-store.s3.amazonaws.com/0/122800/3492390a-171f-981e-a0a8-1672d5609e02.png)

監視するフォルダにseleniumでcaptを撮るフォルダ
アプリケーションのパスに実行するコマンドを入れます。
ここではbatですね。

# batでwinshotを実行する
batの中身はこれです。

```
C:\winshot\WinShot.exe -J -D -X
```

## 参考
[Windowsでコマンドを使って画面キャプチャする方法](http://anosonote.hatenablog.com/entry/2015/07/13/205726)

# 使ってみよう！
とりあえず、なんちゃってで実施しましょうか。
監視フォルダに設定した場所に新しくファイルを作るなりコピーするなりやってみてください。
そうすると、FWatchが動いてアプリケーションのbatをキックし、winshotを実行すると思います。
winshotで取得したファイルはwinshotのインストールフォルダに保存されます。

# seleniumで連携しよう！
手作業でファイルを置きましたが、今度はSelenium側の設定をしましょう。
これは敢えて手順とか書きません。出来ますよね？

# ファイルがスタックされる
WSxxxxxx.JPGでどんどんファイルがたまってくるんですが、なんのこっちゃ分からんです、という状況になります、たぶん。
bat側にテストファイルを理解できるようにしてあげるのが良いでしょう。

Atest_EOF.pngみたいな名前でSeleniumからキャプチャファイルを吐き出して、batはファイル名にEOF.pngが含まれていたら、今まで取得したものをまとめてフォルダ管理する、とか出来るといい感じになります。
フォルダ名はとりあえずAtest_YYYYmmddHHMMSSとかにすると重複することがないでしょう。
（本当はいいネーミングが欲しいんですが、とりあえず暫定で）

# では、やってみましょう
batの中身を色々といい感じに改修していい感じに見せてる例
（全部echoでごまかしてますが、こういう運用とかはいいと思います）

![command.png](https://qiita-image-store.s3.amazonaws.com/0/122800/03e305ee-cbd9-c03b-e91f-0a13ca960665.png)

なんかコマンドエラーになってますが、特に意味はありません。

# まとめ
今回はSeleniumで運用しましたが、FWatchからのwinshotは汎用性高いです。
Linuxシステムで.lockファイルとかつくる仕組みは結構ありますが、考え方はそれに近くて、ファイルを検知したらキックするというだけでかなり価値が高いのではないでしょうか？

windowsでもcronみたいな事を手軽に出来るというのはなかなかない気がします。
この方法もいいですが、もっとスマートな方法もありそうな気がします。

# 読了後いいね！をお願いします。
どれだけの方に読んでもらっているか知りたいので、お手数をおかけしますがご協力いただけると嬉しいです。
Puttyをカスタマイズ

この記事はwindows7で設定した時のものです。
###1.Puttyをインストール
今回は「PuTTY 0.60 ごった煮版 2007年8月6日版」をベースとして開発されている、「iceiv+putty」をインストール。手順は公式ホームページを参照。
http://ice.hotmint.com/putty/

###2.背景を透明化
「カテゴリ」→「ウィンドウ」→「半透明」で背景を透明化できます。
個人的には値を「80」くらいにするのがベストでした。
![image](https://qiita-image-store.s3.amazonaws.com/0/126548/c4798295-5054-46c3-1ec8-d707adf94a2e.png)

※vimを開くとカラースキームの背景色になるので別途プラグインを入れる必要があります。
NeoBundleもしくはdeinが入っている場合は以下で導入可能！（以下の例はNeoBundleの場合です。）

```ruby:.vimrc
" 背景透明化
NeoBundle 'miyakogi/seiya.vim'
let g:seiya_auto_enable=1
```


###3.フォントを変更
まずはお好みのフォントを容易。
私はプログラミング用フォントとして人気のRictyの姉妹フォントの「Ricty Diminished」を使用しています。
https://github.com/mzyy94/RictyDiminished-for-Powerline

↑のgithubからZipをダウンロードしてきて好みのフォントをインストールするだけ。
今回は「RictyDiminished-Bold.ttf」を使用。

※サンプル
![image](https://qiita-image-store.s3.amazonaws.com/0/126548/c7779558-cbd4-1799-e90f-77f5fffda688.png)

フォントをインストールしたらPuttyで設定するだけ。
「カテゴリ」→「ウィンドウ」→「外観」でフォントの設定ができます。
![image](https://qiita-image-store.s3.amazonaws.com/0/126548/02cbe338-5f6c-3724-4444-a38e06e7cd03.png)
localhost（PC側）にiOSやAndroidのシミュレータから繋ぐ方法


現在僕はネットを解約してネットが使えない状況なので、
ネットに繋がっていない状態でもどうにかiOSとAPIの開発したいと思い、
調べたところ、意外にあっさり出来たのでメモ。

# やりたいこと
* iOSシミュレータからPHPのビルトインサーバへアクセスしたい
* ルータを使わずにMac一台で完結させたい

# 環境
* Xcode:v7.3.1
* Mac:OS X EI Capitan

# 方法
LAN経由でやっているところが多かったので、
難しいのかなと思ったのですが、やってみたら簡単でした。

'Hello World'が無事に取得できることを目標にします。

```php:test.php
<?php
$json = json_encode('hello world');
echo $json;
```

`localhost:8001`でウェブサーバを起動（PHPでやります）

```
 php -S localhost:8001
```

iOSシミュレータ側で通信する際のIPアドレスに`localhost:8001`を指定
viewDidLoad()へ下記のコードを記述。（Alamofire導入済みを想定。AFNetworkingとかでもおk）

```swift:ViewController.swift
Alamofire.request(.GET, "http://localhost:8001/test.php")
                .responseJSON { response in
                    
                    switch response.result {
                    case .Success(let value):
                        print(JSON(value).stringValue)
                        break
                    case .Failure:
                        print("fail")
                    }
            }
```

あとは起動すれば...

![スクリーンショット 2016-08-26 10.46.34.png](https://qiita-image-store.s3.amazonaws.com/0/120969/a908d0c0-a764-f75a-5e08-caa6b1cb1ad6.png "スクリーンショット 2016-08-26 10.46.34.png")

出来ました！やった！

でも、これどうやってシミュレータがネットに繋がっているのかという疑問が出てきました...。
機会があったら調べてみます。

# 参考
大変参考になりました！Androidシミュレータでもできるみたいです！Androidシミュレータからは10.0.2.2でPCホストへ接続できるみたいです。
* https://ultimate-ez.com/2014/03/25/3530/
UILabelのフォントサイズを現在のフォントサイズを元に変更する



UILabelで現在のフォントサイズを元に,フォントサイズを変更したい場合の解決策.
# 方法
UIFontでは,現在のフォントサイズは```pointSize```で取得することができます.
フォントサイズだけを変更するために,```UIFont```の```fontWithSize```を使うことで,サイズだけ変更した```UIFont```のインスタンスを利用します.

``` swift
let label : UILabel = UILabel()
label.font = UIFont.systemFontOfSize(20)

//現在のラベルのフォントサイズを取得
let beforeFontPoint: CGFloat = label.font.pointSize
let afterFontPoint: CGFloat = beforeFontPoint * 0.8

//新しいフォントサイズの反映
label.font = label.font.fontWithSize(afterFontPoint)
print(label.font.pointSize) // 16
```

# まとめ
フォントサイズを明示的に変更したい場合は有効と思われます.
もっといい方法があれば教えて下さい.
# 参考
- UIFont Class Reference
    - https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIFont_Class/index.html
仮想環境 既存LVを拡張

# はじめに
うちの環境にちょうど良くマッチする拡張手順がなかったので、
色々参考に作成

# 環境
RHEL6

#やりかた
fdiskでパーティション作成

```
# fdisk -l

ディスク /dev/sdb: 59.1 GB, 59055800320 バイト
ヘッド 64, セクタ 32, シリンダ 56320
Units = シリンダ数 of 2048 * 512 = 1048576 バイト
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O size (minimum/optimal): 512 bytes / 512 bytes
ディスク識別子: 0x00000000
```

```
# fdisk /dev/sdb

コマンド (m でヘルプ): n
コマンドアクション
   e   拡張
   p   基本パーティション (1-4)
p
パーティション番号 (1-4): 1
最初 シリンダ (1-56320, default 1): 1
Last シリンダ, +シリンダ数 or +size{K,M,G} (1-56320, default 56320):
Using default value 56320

コマンド (m でヘルプ): t
選択した領域 1
16進数コード (L コマンドでコードリスト表示): 8e
領域のシステムタイプを 1 から 8e (Linux LVM) に変更しました

コマンド (m でヘルプ): w
パーティションテーブルは変更されました！

ioctl() を呼び出してパーティションテーブルを再読込みします。
ディスクを同期しています。
```

```
# fdisk /dev/sdb

コマンド (m でヘルプ): p

ディスク /dev/sdb: 59.1 GB, 59055800320 バイト
ヘッド 64, セクタ 32, シリンダ 56320
Units = シリンダ数 of 2048 * 512 = 1048576 バイト
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O size (minimum/optimal): 512 bytes / 512 bytes
ディスク識別子: 0x472c739f

デバイス ブート      始点        終点     ブロック   Id  システム
/dev/sdb1               1       56320    57671664   8e  Linux LVM
```

pvcreateでPV作成

```
# pvcreate /dev/sdb1
  Physical volume "/dev/sdb1" successfully created
```

vgextendでVG拡張

```
# vgextend VolGroup00 /dev/sdb1
  Volume group "VolGroup00" successfully extended
```
  
lvextendでLV拡張

```
# lvextend -l +100%FREE /dev/mapper/VolGroup00-LogVol02
  Size of logical volume VolGroup00/LogVol02 changed from 26.75 GiB (856 extents) to 81.72 GiB (2615 extents).
  Logical volume LogVol02 successfully resized.
```

resize2fsでファイルシステム拡張

```
# resize2fs /dev/mapper/VolGroup00-LogVol02
resize2fs 1.41.12 (17-May-2010)
Filesystem at /dev/mapper/VolGroup00-LogVol02 is mounted on /; on-line resizing required
old desc_blocks = 2, new_desc_blocks = 6
Performing an on-line resize of /dev/mapper/VolGroup00-LogVol02 to 21422080 (4k) blocks.
The filesystem on /dev/mapper/VolGroup00-LogVol02 is now 21422080 blocks long.
```

以上
CoffeeScriptとES6のアローの違い

```
x => {}
```

と書いたとき、当たり前だけどCoffeeScriptとES6とで挙動は違う。

CoffeeScriptではxという関数の実行になる。

```
x((function(_this) {
  return function() {
    return {};
  };
})(this));
```

ES6ならxを引数に持つ無名関数の作成。

```
(function (x) {});
```

Rubyでもそうだけど、引数（が存在するとき）のかっこを省略しても可読性が下がるだけで、あまりいいことがない。

```
x(() => {})
```

```
(x) => {}
```

これならどちらの言語でも（ほとんど）同じ意味。
よりまともなVim環境を求めて

# 概要
各項目は、それぞれの参考記事の方が内容が詳しかったり、より便利にできる方法が書いてある。
ここでは、基本的な使い方と最低限やっておきたい設定を書いていきつつ、より良い環境への道標を残すことを目的とする。
記事としての体裁は最低限整えてあるが、口頭説明の資料という立ち位置にある。

また、対象環境はUbuntuとする。


# ctags
定義元に飛ぶ時にいちいちgrepなんてしていられない！
IDEみたいにVimにも定義元に飛ぶ機能がある。
この機能は`ctags`というコマンドに切り出されている。

## インストール
```sh
sudo apt-get install exuberant-ctags
```

## ctagsの設定
ユーザディレクトリに設定ファイルを配置すれば`ctags`コマンドを打つだけでいつものオプションがついた状態にできて便利。

```:~/.ctags
--append=no
--recurse=yes
--sort=yes
--tag-relative
--exclude=*.js
```

かわいそうだけど、自分が触る範囲ではJavaScriptのファイルを除外しないと重すぎてやばいことになるから除外している。
ここはもっと良い感じにできるはず。

## 使い方
通常は、プロジェクトのルートにて`ctags`コマンドを実行するだけで準備が整う。
実行したディレクトリに`tags`フィアルが作成される。
このファイルに、クラス名やメソッド名の定義元情報が記載される。

Vimにて、定義元に飛びたいクラス名とかメソッド名とかにカーソルが載った状態で`<C-]>`で定義元に飛ぶことができる。
（ちなみに、`<C-o>`でジャンプを戻る、`<C-i>`でジャンプを進むことができる。）

## ＋α

ctagsでは型を良い感じに考慮してくれているわけではないので、同じ名前のメソッドが複数のクラスにて実装されている時に困る。
デフォルトの`<C-]>`では、`tags`の中で最初にマッチした場所[要出典]へ飛んでしまう。
勝手に1つ目に飛ぶのではなく、選択させてほしい。
そういう時は、`g<C-]>`を使う。
マッピングを変えておけば忘れることもなくて便利。

```vim:~/.vimrc
nnoremap <C-]> g<C-]>
```

## より便利な使い方
このままでは、手動で`ctags`コマンドを実行しないかぎり定義情報がが更新されないため、何らかのタイミングで実行してあげる必要がある。
そこまで自動でやる場合は参考記事へ。

## 参考
- http://qiita.com/soramugi/items/f918020c2b3f48c93bf3


# gitで変更がある行を簡単に知る
IDEのエディタでは、変更があった行に印がついて簡単にわかるようになっている。
これはVimでもプラグインを入れれば実現できる。

## インストール
```vim:~/.vimrc
# NeoBundleを使う場合
NeoBundle 'airblade/vim-gitgutter'

# deinを使う場合
call dein#add('airblade/vim-gitgutter')
```

## 使い方
何もしなくてOK。
行番号の左側に表示が出るだけ。
どこが編集されたのか、ぱっとわかって地味に便利。

| 表示 | 意味               |
|------|--------------------|
| `+`  | 追加された行       |
| `~`  | 編集された行       |
| `-`  | 行の間が削除された |

## 参考
- https://github.com/airblade/vim-gitgutter


# gitのdiffをVim上で見つつ編集する
編集中、変更前の状態が見たかったり、特定の部分だけ元に戻したくなったりする。
こういう時にぱぱっとVim上だけで綺麗にdiffを見たり、別の歴史からコピーしてきたりできる。

## インストール
```vim:~/.vimrc
# NeoBundleを使う場合
NeoBundle 'tpope/vim-fugitive'

# deinを使う場合
call dein#add('tpope/vim-fugitive')
```

## 使い方
作業中のdiffを見るときは`:Gdiff`とコマンドを実行するだけ。
左右に分割され、変更前と変更後を同時に見ながら編集ができる。
この時、変更箇所が圧倒的に見やすく、ファイルを保存するたびに表示が更新され、リアルタイムでdiffを見ながら作業できる。
まるでIDEのdiffモードのような感覚。

## プラグインの他の機能
例えば`:Gdiff master`と実行すると、現在のファイルの状態とmasterを比較することもできる。

`:Gblame`を実行するとVim内で`git blame`が見れ、普通に実行した時よりも視認性が大幅に向上する。
blame中に特定の行でエンターを押すと、その行を変更したコミットに飛ぶことができる。
変更の意図を負う際に非常に役に立つ。

## 参考
- http://qiita.com/tashua314/items/35521f9bada5fe00cca7
- https://github.com/tpope/vim-fugitive


# 簡単にコメントアウト/解除する
IDEには普通は付いている機能。
手動でコメントにするのはバカバカしい。

## インストール
```vim:~/.vimrc
# NeoBundleを使う場合
NeoBundle 'tpope/vim-commentary'

# deinを使う場合
call dein#add('tpope/vim-commentary')
```

## 使い方
デフォルトでは`gcc`にマッピングされている。
ノーマルモードで`gcc`を押すたびにコメントアウト/解除が入れ替わる。

複数行選択してから`gc`で、複数行のコメントアウト/解除の入れ替えができる。

## 参考
- https://github.com/tpope/vim-commentary


# Vimの正規表現意味不明だからPerlの正規表現が使いたい
本当に覚えにくいし地味に違って辛い。

## インストール
```vim:~/.vimrc
# NeoBundleを使う場合
NeoBundle 'othree/eregex.vim'

# deinを使う場合
call dein#add('othree/eregex.vim')
```

## 使い方
### 検索

`/`の代わりに`:M/`を使う。
MはMatchのMと覚えれば良さそう。

### 置換

`:s//`の代わりに`:S//`を使う。


## 今回は
ひとまずここらへんまでで
Laravel5で緯度経度(double precision型)のバリデーションの書き方

### 答え

```
'latitude' => ['required','numeric','regex:/^[-]?((([0-8]?[0-9])(\.[0-9]{6}))|90(\.0{6})?)$/'], // 緯度
'longitude' => ['required','numeric','regex:/^[-]?(((([1][0-7][0-9])|([0-9]?[0-9]))(\.[0-9]{6}))|180(\.0{6})?)$/'], // 経度
```

### ヒット例

上記のバリデーションで、以下の文字列にヒットするはず

緯度 -89.999999 ~ 89.999999 または -90.000000 または 90.000000
経度 -179.999999 ~ 179.999999 または -180.000000 または 180.000000

geometry型ではなく、double precision型。うちではそういう方針だったので。

### エラー例

次のような文字列を入力すると弾かれれば期待動作。

緯度 -99.999999, 90, 90.00, 90.000001, 89.999999999999
経度 -999.999999, 180, 180.00, 180.000001, 179.9999999999

### ポイント

* バリデーションを配列にしていること

```
'latitude' => [], // ←これ。[]
```

これがないと、「preg_match(): No ending delimiter '/' found」みたいなエラーが出るはず。

### 型の作り方

なお、double precision型はマイグレーションファイルに次のように記述することで生成できる

```
$table->float('latitude')->nullable();
$table->float('longitude')->nullable();
```

今回、マップ機能を実装することになり、Google Map APIを使うことになったのでメモ。

### 追記：Viewで小数点以下を表示させる

上記のバリデーションにより、緯度経度の入力が可能にはなったが、
小数点以下が全て0の場合(90.000000)は0が省略されてしまう(90で表示される)。
その状態で何もせず登録しようとすれば、バリデーションに引っかかってしまうので、小数点以下6ケタも表示されるように修正する

##### Modelを修正

```

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Tests extends Model
{
    public function getLatitudeAttribute($latitude)
    {
        return $this->attributes['latitude'] = sprintf('%s', number_format($latitude, 6));
    }
    public function getLongitudeAttribute($longitude)
    {
        return $this->attributes['longitude'] = sprintf('%s', number_format($longitude, 6));
    }
}

```

関数名は必ず「get~~Attribute」にすること。
~~の部分は必ず大文字で始める。区切り文字も大文字にする。
「hoge_hoge」とかならgetHogeHogeAttribute($hoge)になる。
この小数点以下の表示はこのモデルを使用する全てのViewで表示されるようになる。
Haskellの(>>)ってもしかしてすごい便利じゃない？

# Haskellの(>>)ってもしかしてすごい便利じゃない？

```haskell
(>>) :: Monad m => m a -> m b -> m b
```

- 今までの印象
    - 型からして明らかに常に右を取る
    - do式ののりづけ関数
- 今回気づいたこと
    - 値の世界について言及されていないから、左の値を取ることがある
        - `m >> n = n`といった法則は要求されてない


## 事の発端
　事の発端は`MonadThrow`の`(>>)`の要請するこの法則を見た時に気づきを得た。

```haskell
throwM x >> y = throwM x
```

`Maybe`や`Either e`も`MonadThrow`インスタンスなので、上記の法則を満たすっぽい！  
例えば`Maybe`はこう

```haskell
Nothing >> Just 10 = Nothing
```

`Either`はこう。

```haskell
Left "error" >> Right 10 = Left "error"
```

これってすごい便利じゃない？


## 活用する

```haskell
hoge :: IO a  -- 例外を発する可能性がある
foo  :: IO b  -- 例外を発する可能性がある
bar  :: IO c  -- 例外を発する可能性がある
```

このような関数があった時、こんな`main`は嫌だよね！！ X(

```haskell
main :: IO ()
main = do
  x <- try hoge
  y <- try foo
  z <- try bar
  -- いずれかで例外が発生していればプログラムを終了したい
  case x of
    Left  e -> print (e :: SomeException)
    Right _ ->
      case y of
        Left  e' -> print (e' :: SomeException)
        Right _  ->
          case z of
            Left  e'' -> print (e'' :: SomeException)
            Right _   -> putStrLn "The program is succeed"
```

こうする。

```haskell
main :: IO ()
main = do
  x <- try hoge
  y <- try foo
  z <- try bar
  -- いずれかで例外が発生していればプログラムを終了したい
  let a = x >> y >> z
  case a of
    Left e  -> print (e :: SomeException)
    Right _ -> putStrLn "The program is succeed"
```

これ

```haskell
x >> y >> z
```

は、単なるこんな感じの`integrate`関数の略記バージョンだ！ :D

```haskell
integrate :: Either e a1 -> Either e a2 -> Either e a3 -> Either e a3
integrate e1 e2 e3 = do
  x <- e1
  y <- e2
  z <- e3
  return z
```


実際に試す用のコードを載っけておくね。

```haskell
import Control.Monad.Catch (try, SomeException)

hoge :: IO Int  -- 例外を発する可能性がある
hoge = return 10
foo  :: IO Char  -- 例外を発する可能性がある
foo = fail "foo is failed"
bar  :: IO Bool  -- 例外を発する可能性がある
bar = return True

main :: IO ()
main = do
  x <- try hoge
  y <- try foo
  z <- try bar
  -- いずれかで例外が発生していればプログラムを終了したい
  let a = x >> y >> z
  case a of
    Left e  -> print (e :: SomeException)
    Right _ -> putStrLn "The program is succeed"

```


## 応用
　こんなこともできる :D

```haskell
firstLeftOrLastRight :: [Either e a] -> Either e a
firstLeftOrLastRight = foldr1 (>>)

main :: IO ()
main = do
  let rights   = [Right 1, Right 2, Right 3, Right 4] :: [Either String Int]
  let someLeft = [Right 1, Right 2, Left "oops!", Right 4]
  print $ foldr1 (>>) rights
  print $ foldr1 (>>) someLeft
```


便利！！
CsvHelperでのcsv読み込みを、Genericsを使って汎用化

C#でcsvを読み込む時に、使いやすいのが*CsvHelper*というモジュール。
以前、CsvHelperの備忘録を書いたのですが、汎用的でなかったので、改善

以前の記事
>[CsvHelper覚え書き](http://qiita.com/kyo-bad/items/e9d51790673086c69603)

今回は、有名なIrisデータセットの読み込み例

CsvHelperで、csvのListを作るには、

- csvのカラム情報をもったクラスを作ること

```csharp
class Iris
{
    public double SepalLength { get; set; }
    public double SepalWidth { get; set; }
    public double PetalLength { get; set; }
    public double PetalWidth { get; set; }
    public string Species { get; set; }
}
```

- ```CsvHelper.Configuration.CsvClassMap<Iris>```を継承したマッピングクラスを作ること

```csharp
class CreateMap : CsvHelper.Configuration.CsvClassMap<Iris>
{
    public CreateMap()
    {
        Map(x => x.SepalLength).Index(0);
        Map(x => x.SepalWidth).Index(1);
        Map(x => x.PetalLength).Index(2);
        Map(x => x.PetalWidth).Index(3);
        Map(x => x.Species).Index(4);
    }
}
```

が条件だった。これを、汎用的に読み込むために、ジェネリクスを使って関数化する。

```csharp
/// <summary>
/// Reads the csv.
/// </summary>
/// <returns>The csv.</returns>
/// <param name="filename">ファイル名</param>
/// <typeparam name="T">CSVのカラム情報.</typeparam>
/// <typeparam name="M">Mapper</typeparam>
public static List<T> ReadCsv<T, M>(string filename) where M: CsvHelper.Configuration.CsvClassMap<T>
{
    using (var parse = new CsvHelper.CsvReader(new StreamReader(filename)))
    {
        parse.Configuration.HasHeaderRecord = false;
        parse.Configuration.RegisterClassMap<M>();
        List<T> data = parse.GetRecords<T>().ToList();
        return data;
    }
}
```

こうすることで、``T``と``M``に型を指定するだけで、様々なcsvファイルの読み込みが可能となる
AWS lambda から MSSQLのRDSインスタンスに接続する(python)

#はじめに
SQL ServerのRDSインスタンスにlambdaから接続する方法です。
Webでは情報が欠落してたり、手順が複雑であったりするので、これをもう少し簡単にセットアップできる手順です。 

#前提条件
lambdaファンクションは、pythonで書きます。
ライブラリには、[pymssql](http://www.pymssql.org/en/latest/) を使います。

#レシピ
## 環境作り
### 1. LinuxのEC2インスタンスを作る
無料利用枠の分でOKです。
私が使ったのは下のインスタンスです。
> Amazon Linux AMI 2016.03.3 (HVM), SSD Volume Type - ami-374db956

lambdaのベースはご存知の通り、[Amazon Linux](https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/current-supported-versions.html) です。 EC2上で環境をセットアップして必要なファイルを収集します。

### 2. 　必要なライブラリをインストールする
MSSQLには、つまるところODBCで接続します。
linuxでODBCを利用するために1.で作成したインスタンスに以下のライブラリをインストールします。

* unixODBC
* unixODBC-devel
* freetds
* freetds-devel
* pymssql

利用したいpymssqlがfreetdsに依存しています。
freetdsはunixODBCに依存してるので、これらが必要になります。

以下の要領でインストールします。
> $> sudo yum install unixODBC, unixODBC-devel, freetds, freetds-devel
> $> pip install pymssql

### 3. pymssql で接続を確認する
インストールが済んだので、一旦接続を確認します。
コンソールで確認する場合の例を示します。

> $> python
> $> import pymssql
> $> server = "___hostname of SQL Server(RDS)___"
> $> user = "___your username___"
> $> password = "___your password___"
> $> dbname = "___your dbname___"
> $> connection = pymssql.connect(server, user, password, dbname)
> $> cursor = cunnection.cursor()
> $> cursor.execute("select @@VERSION")
> $> cursor.fetchone()

接続したRDSのバージョンが表示されればOKです。

## 必要なファイルを抽出する
lambdaにアップロードするファイルを抽出します。

> _ディレクトリ 1_
> /usr/local/lib64/python2.7/site-packages
> _ファイル_
> _mssql.so  pymssql-2.1.3.egg-info  pymssql.so
pymssqlをビルドしたときにできるファイル群です。


> _ディレクトリ 2_
> /usr/lib64
> _ファイル 2_
> libsybdb.so.5.0.0
> __[重要] libsybdb.so.5.0.0は、libsybdb.so.５ にリネームします。__

これらのファイルとlambdaファンクションをzipに固めて、lambdaにアップすればOKです。

#mac os(Sierra)のpymssql インストール(ローカル環境の構築)
> brew install homebrew/versions/freetds091
> pip install pymssql

> ローカルの環境変数をwrapしてくれるので、pytestの時に重宝する。
[pytest-env](https://github.com/MobileDynasty/pytest-env)

これで、lambdaからMS SQLServerインスタンスへの接続も怖く無いですねw