OmniAICreator/Qiita-1.07M huggingface dataset:
言語処理と統計

# 言語と統計

言語処理において統計が必要となる背景には、変異の存在と大量のデータ処理という二つの側面があります。

変異とはバリエーションとも言い、たとえば年齢や性別、出身地などによって用いる言葉が異なる、そのような差異を重視するときに統計が重要な役割を果たすことがあります。

言語と統計の関わりにはさまざまなパターンがあり、対象とする問題領域と手法に応じて統計の使い方も変わってきます。

## 大量データ処理と統計

自然言語処理のように工学的な見地から言語を取り扱う場合、コーパスと呼ばれる大量の言語データを用います。

例えばどの単語が何回出てくるかを数えるワードカウントという処理は、やることは単に数えるだけとはいえ、出現頻度を集計する統計処理であると言えます。

またある文書が与えられたとき、それがどういった分野に属するかを分類するといったときに、多変量解析などの手法が用いられます。

### 確率の定義

**試行 (trial)** とは同じ条件のもとで実験や観察をすることを言い、試行を繰り返したことで出てきた現象を **事象 (event)** と呼びます。これ以上わけることのできない事象を根源事象と言います。

事象 A が起こる確率を P(A) とし以下のように定義します。

```math
P(A) = \frac {A の起こる場合の数} {全体の場合の数}
```

このような定義は根源事象に基づいて考えています。しかし根源事象 (単集合) には場合の数が等しいこと、すなわち等確率がその前提に含まれています。根源事象が等確率であることを定義するためには確率が必要ですから、これでは定義が循環してしまいます。

そこで現実的な考え方として代わりに実際に試行を繰り返すことで確率を捉える経験的確率で定義します。

```math
P(A) = \frac {A の観測された回数} {試行をおこなった回数}
```

これは直感的です。たとえば、サイコロを 100 回振って奇数が出た回数が 49 回なら、奇数が出る確率は 49% となります。

言語処理において確率を算出する場合、このように経験的確率を取り扱うものであることが多いと言えます。

### 確率の範囲

どんな確率でも値は 0 から 1 の間に収まります。任意の事象 A について P(A) = 1 は必ず発生する、 P(A) = 0 は全く発生しないことを示します。

```math
0 \gt P(A) \gt 1
```

### 余事象

事象 A が起きない事象のことを A の **余事象 (complementary event)**  と呼びます。

```math
P(\overline{A}) = 1 - P(A)
```

### 条件付き確率

自然文書で「阜」という漢字の登場回数は非常に少ないでしょう。しかしながら「岐」という漢字の直後であれば「阜」が出現する確率は非常に高くなります。

このように、ある一定の条件の下では確率が大きく変動することがあります。このようなある条件の下での確率が「条件付き確率」です。

B を条件とする A の条件付き確率 P(A|B) は次のように定義されます。

```math
P(A \mid B) = \frac {P(A \cap B)} {P(B)} \\
ただし P(B) \neq 0
```

### 同時確率

事象 A と事象 B がどちらも起こることを次のように表します。

```math
A \cap B
```

あるいは P(A,B) とも表記します。この確率を A と B の **同時確率または結合確率 (joint probability)** と呼びます。

### 周辺確率

条件付き確率に大して、条件のない普通の確率を **周辺確率 (marginal probability)** と呼びます。

これは要するに P(A) と等価であり、条件付き確率との対比としての呼び名を付けたに過ぎません。

### ベイズの定理

確率の乗法定理が次のように求まります。

```math
P(A \cap B) = P(A \mid B)P(B) = P(B \mid A)P(A)
```

これを変形すると次のようにベイズの定理が得られます。

```math
P(B \mid A) = \frac {P(A \mid B)P(B)} {P(A)}
```

ベイズの定理は直接求めることの難しい P(B|A) を導くことができます。

### 独立

ある事象 A が起こる確率が他の事象 B に影響されないとき A と B は独立であると定義されます。

つまり

```math
P(A \mid B) = P(A)
```

となることを指します。しかしこの定義では P(B) = 0 のときに条件付き確率が定義できないため、独立も定義できなくなります。したがって独立とは

```math
P(A \cap B) = P(A)P(B)
```

となることであると定義します。

### 排反

事象 A も 事象 B も両方起こることがないことを排反と言います。すなわち排反とは

```math
P(A \cap B) = 0
```

となることを指します。

### 確率の加法定理

事象 A と事象 B の少なくとも一方が起きる確率について

```math
P(A \cup B) = P(A) + P(B) - P(A \cap B)
```

が成り立ちます。とくに A と B が排反であるとき

```math
P(A \cup B) = P(A) + P(B)
```

となります。

## まとめ

今回は言語現象を確率的にとらえるための確率の考え方について基礎的な定理をまとめました。
配列を1行にn個ずつ出力する


***
※3/18追記

* 大前提なはずのデータの宣言を間違っていたので修正．
* 上記に伴い各例修正
* コメントを参考に方法を一つ追加

***

　

1次元の配列xに対して，1行にdim個，line_num行出力する．

```fortran:プログラム骨組み
program main
  integer, parameter :: dim = 3, line_num = 51
  integer :: x(dim*line_num)

  open(11, file='data.dat', status='old')
  read(11,*) x
  close(11)
  
  !
  !  主にここに追記  
  !
  
end program main
```
　
要素をdim個改行をせずに出力し，その後に改行する方法

```fortran:二重ループを用いて
do i=0,line_num-1
   do l = 1, dim
      write(6, '(I4)', advance='no') x(i*dim+l)
   end do
   write(6, '()')
end do
```
　
無理矢理反復を使う方法（これより4つ目の方法を推奨）

```fortran:反復を用いて
do i=0,line_num-1
   write(6,'(1000I4)') x(i*dim+1:(i+1)*dim)
end do
```


反復の指定をとりあえず大きい値で指定してます．
実行時間的にも一つ目よりこっちのが早い．当然，dimが1000個を超えるとダメ．

書式を気にしないなら

```fortran:結局
do i=0,line_num-1
   write(6,*) x(i*dim+1:(i+1)*dim)
end do
```

これでいい．dimの制約もないし，こっちのが早い．

※コメントを参考に追記
出力formatをcharacterで定義する方法

```fortran:formatをcharacterとして定義
  character :: cdim*20 !これは宣言に
  
  write(cdim, *) dim
  cdim = '('//trim(adjustl(cdim))//'I4)'
  write(6, cdim) x
```
　 
これが一番よさげかな…？

~~ペーペーにはこんなもんですが，他にいい方法ないですかね？（反復に変数使う方法，調べても出てこない…）~~
-webkit-overflow-scrollingを指定するときについでにやっておいた方がいいこと

##追記
iOS9で試してみたら、効かなくなってました……。「一部の要素のスクロールがページ全体のスクロールに影響しない」って結構重要だったのに、残念です。iOS8については試していないのでわかりませんが、バグだったということでしょうか。

##以下本文

##スクロールできる要素の問題点
まず前提として、スクロールできる要素に対して`-webkit-overflow-scrolling: touch;`と指定すると慣性スクロールが実装できます。例としてグローバルメニューのようなものを作ってみます。

```html:html
<nav id="menu">
  <!-- 長いコンテンツ -->
</nav>
```
```css:css
#menu {
  position: fixed;
  top: 0;
  left: 0;
  height: 100%;
  overflow-y: auto;
  -webkit-overflow-scrolling: touch;
}
```

これでスクロールはしやすくなるのですが、このままでは『その要素が既に限界まで上／下にスクロールされている状態でさらに上／下までスクロールしようとすると、ページがスクロールされてしまう』という問題が残ります。
何を言ってるのかわかりづらいとは思いますが、ドロワーメニューなんかだと結構気になります。

![image01.png](https://qiita-image-store.s3.amazonaws.com/0/62215/9212e6e7-d860-57df-886f-e24cf9854c40.png)

[デモを見る](https://jsfiddle.net/vmqpwouf/embedded/result/)
スクロールしやすい大きさにズームしてから、一番上までスクロールされていることを確認して、さらに上までスクロールしてみてください。ページごと動くと思います（なお自分がやってみた限りでは、一回ピンチアウトしないとどっちにしろスクロールが効かない）。

##対処法

以下のような二重の構造にすると、これを防ぐことができます。

```html:html
<nav id="menu-outer">
  <div id="menu-inner">
    <!-- 長いコンテンツ -->
  </div>
</nav>
```
```css:css
/* 外枠はそのまま */
#menu-outer {
  position: fixed;
  top: 0;
  left: 0;
  height: 100%;
  overflow-y: auto;
  -webkit-overflow-scrolling: touch;
}

/* 内枠を追加 */
#menu-inner {
  width: 100%;
  height: 100%;
  overflow-y: auto;
}
```

![image02.png](https://qiita-image-store.s3.amazonaws.com/0/62215/8a8a984a-11e8-0cb8-abaf-40d7b67c9251.png)

[デモを見る](https://jsfiddle.net/x6qowguf/embedded/result/)
先ほどと同じようにズームしてから、さらに上までスクロールしてみてください。ページごとは動かず、ちゃんと下方向に引っ張られると思います（こちらも一回ピンチアウトしないとスクロールが効かない）。

##その他

個人的に結構気になっていて、JavaScriptを使って試行錯誤していたのですが、結局これが一番最適な方法だと思います。調べてみてもこの問題について書かれているサイトがなかった（というよりどう検索すればいいのかわからなかった）ので、ここに書き記すことにしました。
最初に記した通りiOSでしか確認していませんので、Androidだとどうなるかはわかりません。
ちなみに、[Google+のモバイルサイト](https://plus.google.com/app/basic/stream)でも同じような方法を使っているようです。

##編集履歴
2015.6.14

- デモを追加（viewportが設定できない上にiframeなのでどうしても微妙になる）
- 構造をわかりやすく

2016.3.7
PDCA as a Game

PDCA as a Game
====

このエントリは [アジャイルCasual Advent Calendar 2014](http://qiita.com/advent-calendar/2014/agile_casual) の 8 日目のエントリです。

前回は [shin_semiya さんの「時は80年代、仕様は変化することがわかった」](http://shinsemiya.hatenadiary.jp/entry/2014/12/04/200620) でした。
なぜアジャイル宣言が生まれたのかという、そもそも論の前提となるウォーターフォールモデルの欠陥を解説する、良エントリでした。
アジャイル宣言が解決したかったものをもう一度見直す、良いきっかけになったのでは無いでしょうか？

さて、 8 日目は PDCA サイクルのあるあると、対応策になり得る考えを導入してみたいと思います。

PDCA サイクルのよく見る光景
----

PDCA サイクル自体については 2 日目のエントリである [a_suenami さんの「速く回す人」と「少なく回す人」](http://a-suenami.hatenablog.com/entry/2014/12/02/215658) を参照していただくとして、PDCA サイクルはまわすもの、すなわち繰り返し実践するものだと言う点は、特に反論無く受け入れられていると思います。

しかし、PDサイクル...つまり、Check と Act の抜けたサイクルになってしまった経験は無いでしょうか？

著者は、PDCA サイクルを導入したは良いものの、Check や Act がおざなりになってしまうことを何度か経験しました。読者の皆様はいかがでしょうか？

なぜ Check がおざなりになってしまうのでしょうか？

1 つには既に行ったことの反省よりも、次にやるべきことの重要度が高そうに見えるというのがあります。また、特に問題が起きていないように感じられるのに、反省をするというのも面白くないというのも確かでしょう。Check の重要度については、頭では理解していても納得できないというのも１つの意見です。
PDCA サイクルの提唱者であるデミング自身も、後に Check の重要さをより強調すべく PDSA サイクルへと名称を変更しています。

PDCA as a Game
----

発想を逆転させれば、Check がしたくなるような仕組みがあれば、 PDCA サイクルの Check や Act が上手くまわるかもしれません。そのための手段として、 **ゲーミフィケーション** を導入してみるのはいかがでしょうか。

コスティキャンは、ゲームを「 *充分な情報の下に行われた意思決定を持って、プレイヤーが与えられた資源を管理しつつ自ら参加し、立ちはだかる障害物を乗り越えて目標達成を目指す* 」ものだとしました。
PDCA サイクルの 1 サイクルは、チーム一丸となって、ゴールを設定し、そこに向かって進んでいき、評価されるという一連の流れでもありますので、一種のゲームとみなせると思います。

うまくゲーム化することで、チームメンバーが楽しんで PDCA サイクルをまわせるようにしむけられるかもしれません。


サンプルゲーム: UX改善王への道
----

ひとつ、サンプルゲームを示してみます。

この、「UX改善王への道」は、ある Web サービスの運営チームとして、最も良い UX 改善案を提案したメンバーを決めるゲームです。
Web サービスのディレクターまたはプロダクトオーナーが、ゲームマスターになり、その他のメンバーはプレイヤーとなります。

Check をしないと報酬が得られなくすることで、 Check の活性化を促します。
また、 Check の指標を Planning 時に明確にすることで、PDCA サイクルの精度向上も狙えます。

### Planning

プレイヤーは UX 改善案を１つ考えます。このとき、チームに提供されている各種 KPI のうち、どの指標を改善するかを同時に決めます。
ゲームマスターは、実装難易度やビジネス要件をもとに、「報酬ポイント」を設定します。

### Do

UX 改善案を具体的な仕様に落とし、実装をし、サービスに適用します。

### Check

Planning 時に設定した指標が改善されたか確認します。改善されていれば、ゲームマスターはその提案者に「報酬ポイント」を付与します。

### 見える化・ランキング・報酬・バッジ　

チームの壁などにポスターを張っておき、メンバーの「報酬ポイント」等を張り出します。また、一定ポイントや KPI の種類に応じてバッジを付与するのも良いでしょう。一定ポイントを超えることで、食事など報酬をだすのも工夫の１つです。

まとめ
----

PDCA サイクルで軽視されがちな Check 作業。この作業を、ゲームのゴール、すなわち楽しい作業にすることによって、 Check したくなるようする、そのための手法として、ゲーミフィケーションの導入を提案しつつ、１つのゲームをサンプルとして提示してみました。

ぜひ、仕事もゲームとして、楽しんでみてください。
コールバックを使わずに、RubyでHTTPリクエストを並列発行する方法

次のようなユースケースで、HTTPリクエストを並列発行したいことがあるでしょう。

* URLのコンテンツ内容の監視（Webレスポンス監視）
* コンテンツの応答監視（ページの更新チェック）
* Webページのクロール（スクレイピング）

非同期処理と言ったらコールバックですね。ただ、コールバック地獄は避けたい。
そんな時には次のようにEventMachineとFiberを用いると、読みやすい非同期処理の実装が出来ます。

## URLの数だけ並列実行する方法

とにかく速いですが、URLリストが増えた場合には次の問題が起きうるので注意が必要です。

* ファイルディスクリプタの上限を叩く可能性
* 接続先Webサーバの最大同時接続数を使い果たす可能性
* NATルータ機器を通してインターネットに出ている場合には、そのNATテーブルが溢れる可能性
* スパイク的なリクエストを発生させることで、下りネットワーク帯域を埋め尽くす可能性

```ruby
require 'em-synchrony'
require 'em-synchrony/em-http'

urls = %w[
  http://localhost:3000/?page=1
  http://localhost:3000/?page=2
  http://localhost:3000/?page=3
  http://localhost:3000/?page=4
  http://localhost:3000/?page=5
  http://localhost:3000/?page=6
]

# カウンターを初期化
pending = urls.size

EM.synchrony do
  urls.each do |url|

    # 軽量スレッドであるFiberを呼び出す
    Fiber.new do
    
      # HTTPリクエストを発行する
      http = EM::HttpRequest.new(url).post :body => request_body

      # それぞれのURL取得後に実行する処理
      # これらはそれぞれのリクエストが入り交じること無く実行されます
      puts url
      puts http.response_header        # HTPレスポンスヘッダ
      puts http.response_header.status # HTPレスポンスコードを出力
      puts http.response               # HTPレスポンスボディ

      # カウンターをデクリメントする
      pending -= 1

      # 最後の実行時にEventMachineを止める
      EM.stop if pending == 0
    end.resume
  end  
end

# 全ての処理が終わったらこちらの処理が走ります
puts "All requests has finished."
```

## 最大並列実行数を指定してHTTPリクエストを発行する方法

サーバやネットワークに優しく通信をするコードは次の通りです。

```ruby
require 'em-synchrony'
require 'em-synchrony/em-http'
require 'em-synchrony/fiber_iterator'

urls = %w[
  http://localhost:3000/?page=1
  http://localhost:3000/?page=2
  http://localhost:3000/?page=3
  http://localhost:3000/?page=4
  http://localhost:3000/?page=5
  http://localhost:3000/?page=6
]

EM.synchrony do
  # 並列実行数
  concurrency = 2

  # FiberIteratorを用いて非同期処理らしさを隠す
  EM::Synchrony::FiberIterator.new(urls, concurrency).each do |url|

    # HTTPリクエストを発行する
    http = EM::HttpRequest.new(url).get
    ## もしここでPOST通信する際には、内容を:bodyに渡します
    ## http = EM::HttpRequest.new(url).post :body => { name: 'hoge' }

    # それぞれのURL取得後に実行する処理
    # これらはそれぞれのリクエストが入り交じること無く実行されます
    puts url
    puts http.response_header        # HTPレスポンスヘッダ
    puts http.response_header.status # HTPレスポンスコードを出力
    puts http.response               # HTPレスポンスボディ
  end

  # 全ての処理が終わったらこちらの処理が走ります
  puts "All requests has finished."

  # EventMachineを止めます
  EM.stop
end
```

不備等ございましたら是非、編集リクエストなどからお知らせ頂けると幸いです。

## 参考サイト

* Em synchrony について<br />
http://www.slideshare.net/cuzic/em-synchrony
milkcocoaで接続出来るドメインを制限してみる。


## milkcocoaのセキュリティ
milkcocoaはどのドメインでもローカルアクセスでも同じようにsocketを共有することが出来ます。
その分どこからでもデータアクセス出来ちゃうのでセキュリティを考える必要があります。

##　特定のドメインからのみアクセス出来るようにしてみる。

https://mlkcca.com/document/security.html

**ホスト名:ポート名** という形で記述します。

デフォルトは`*:*`と書いてありますが、全てのドメインの全てのポートからのアクセスを許可するという意味です。

参考: https://groups.google.com/forum/#!topic/mlkcca/ES761LniyGA


## n0bisuke.github.ioからのアクセスを許可する

![](http://i.gyazo.com/fbe30b47371c150e607f5b255012dc52.png)

この場合は`n0bisuke.github.io:*`と書けば大丈夫です。

###ローカルホストなど別のドメインからアクセスすると以下のようにはじかれます。
![](http://i.gyazo.com/8c17d524ccfa0fc8b5e5f29d984d70b0.png)

```
GET https://io-li36vxsy5.mlkcca.com/socket.io/?EIO=2&transport=polling&t=1418029280309-0 400 (Bad Request) 
```
Selenium IDEで繰り返し処理を実装して、提案資料作成に集中しよう


お疲れ様です。ジャックです。記念すべき第2回目の投稿は、みんな大好きSeleniumです。
ふとした瞬間にSeleniumを使う機会ってありますよね。
もう数100件のデータを手作業で登録するとか日が暮れてしまいます。その作業時間だけで提案資料いくつ書けるんだよっていう話です。

## まずは、Selenium IDEをインストールする
下記URLよりアドオンをインストールしてください。
https://addons.mozilla.org/ja/firefox/addon/selenium-expert-selenium-ide/

## SelBlocksもインストールする
Selenium IDE for Firefoxで繰り返し処理を利用する際には、SelBlocksをインストールする必要があります。
https://addons.mozilla.org/ja/firefox/addon/selenium-ide-sel-blocks/

これで準備万端ですね。Seleniumの詳しい使い方は割愛します（おい笑

## 使ってみる
例えば、registerページへ遷移して、メールアドレスを登録するテストケースを考えてみます。
hoge1@test.com 〜 hoge10@test.com の計10アカウントをを繰り返し登録するテストケースは、下記のようになります。

![loop.png](https://qiita-image-store.s3.amazonaws.com/0/41823/b6c1f5a6-7db3-3ec3-e541-ecb087b3fcca.png "loop.png")

一応、ソースコードも記載しておきます。

```
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head profile="http://selenium-ide.openqa.org/profiles/test-case">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<link rel="selenium.base" href="対象テストURLを指定" />
<title>New Test</title>
</head>
<body>
<table cellpadding="1" cellspacing="1" border="1">
<thead>
<tr><td rowspan="1" colspan="3">New Test</td></tr>
</thead><tbody>
<tr>
	<td>for</td>
	<td>i=1; i &lt;= 10; i++</td>
	<td>i</td>
</tr>
<tr>
	<td>open</td>
	<td>/register</td>
	<td></td>
</tr>
<tr>
	<td>type</td>
	<td>id=email</td>
	<td>hoge${i}@test.com</td>
</tr>
<tr>
	<td>clickAndWait</td>
	<td>name=submit</td>
	<td></td>
</tr>
<tr>
	<td>endFor</td>
	<td></td>
	<td></td>
</tr>

</tbody></table>
</body>
</html>
```

あとはひたすらループを回して放置です。実際はもっと複雑なテストケースを記載したりするんですが、今回はサンプルという事で勘弁してください。
これで提案資料の作成に集中できますね。めでたしめでたし。
YosemiteのTerminalがコマンド完了時に点滅するのを止める

### 概要

これまで、コマンド実行完了時にTerminalはオーディオベルを鳴らしてくれてましたがYosemiteになってからビジュアルベルと言って画面が点滅してお知らせしてくれるようになったみたいです。

特に必要ないし鬱陶しいので以下の方法で消しました。

### 点滅（ビジュアルベル）を消す手順

ターミナルの環境設定を開いて、「プロファイル」→「詳細」タブでチェックを外すといちいち点滅してくれたりしないので快適になりました。

![スクリーンショット 2014-12-08 17.44.12.png](https://qiita-image-store.s3.amazonaws.com/0/30355/2a1537eb-3e90-b9e5-1cbe-19178667bb19.png)
AWSで地域制限を利用した際のSorryページパターン

##AWSで地域制限を利用した際のSorryページパターン

Route53にてGeoDNSを使用した際、
他国からのアクセスはDNS名前解決ができないため、クライアントは名前解決のエラーとなってしまいます。

そのため、DefaultLocationを設定しS3への転送を行う構成を組んでみた。

##構成図

例：
 `www.test.com` へ日本からアクセスした際は、日本用に登録されているDNSレコード情報を返しインスタンスへアクセスできる。
 `www.test.com` へその他の国からアクセスした際は、S3(WebHosting設定)のSorryページが表示される。

![地域制限Sorryページ.png](https://qiita-image-store.s3.amazonaws.com/0/49877/8dd2b3a0-dcae-21f2-3b55-17ba89b1fae5.png)


##etc
Route53,GeoDNSを利用すれば、綺麗にインターネットを辞めることができる。

注意としては、名前解決に制限をかけるためHosts等を設定した場合は回避することができる。
Mac OS下Open MPI的安装及使用方法


1. 在http://www.open-mpi.org/上下载最新版Open MPI源代码。

 

2. 配置编译选项 (编译为32位代码)

    cd openmpi-1.4.2

    ./configure CFLAGS=-m32 CXXFLAGS=-m32 FFLAGS=-m32 FCFLAGS=-m32

 

3. 编译

    make

 

4.  安装

     sudo make install

     Open MPI将缺省安装在/usr/local/include, /usr/local/bin, /usr/local/lib中。

 

5. 编译并行程序

    mpif90/mpif77/mpicc/mpicxx 源文件

 

6. 运行并行程序

    mpirun -n 4 执行程序

    其中选项 -n 指定计算使用的进程总数。
ChromeでHTMLを編集しよう！

ChromeデベロッパーツールがHTMLエディターとして使えると聞いたので試してみました。

## 忙しい人のための概略

1. HTMLファイルをChromeで開く
2. デベロッパーツールを出す
3. HTMLファイルが入っているフォルダをデベロッパーツール上にドラッグする
4. ローカルファイルへのフルリクエストを許可する
5. HTMLファイルを右クリックしてMap to file system resource...を選択
6. 対応するファイル名を選択
7. デベロッパーツールを再起動する
8. **編集開始！**

## 図解

### 1. HTMLファイルをChromeで開く

HTMLファイルをChromeで普通に開きます。この例では`D:\Projects\HelloWorld`がプロジェクトフォルダです。

![ローカル](https://qiita-image-store.s3.amazonaws.com/0/56668/b7278491-a6f1-59a9-3d57-36ba4358ae6e.png)
![Chromeで開く](https://qiita-image-store.s3.amazonaws.com/0/56668/4e7a0afc-6ca1-f75b-8b3b-6b4df8d51f3e.png)

### 2. デベロッパーツールを出す

`F12`を押してデベロッパーツールを表示します。そしてSourcesをクリックします。

![2.png](https://qiita-image-store.s3.amazonaws.com/0/56668/9e0b3b1f-faee-dd8b-96c3-f5f436b5afa0.png)

### 3. HTMLファイルが入っているフォルダをデベロッパーツール上にドラッグする

![3.png](https://qiita-image-store.s3.amazonaws.com/0/56668/e6072aa2-3b58-3b72-8a95-3ea7140f4e33.png)

HTMLファイル自体**ではなく**、その**親のフォルダ**をドラッグしてください。

### 4. ローカルファイルへのフルリクエストを許可する

![4.png](https://qiita-image-store.s3.amazonaws.com/0/56668/108ada18-cf0c-3549-d699-790aac1cc1ba.png)

許可を押すと、下にドラッグしたフォルダが追加されます。
うっかり拒否してしまった場合はもう一度3に戻ってください。

### 5. HTMLファイルを右クリックしてMap to file system resource...を選択

新しく表れたプロジェクトフォルダ**ではなく**、file://から始まってる方のツリーの下のHTMLファイルです。
![5.png](https://qiita-image-store.s3.amazonaws.com/0/56668/624c9683-053f-fb8d-1ce3-793ae920e01a.png)

### 6. 対応するファイル名を選択

![6.png](https://qiita-image-store.s3.amazonaws.com/0/56668/1b73eae7-2661-56f7-b2e7-0c49a0b31bac.png)

複数のフォルダを登録している場合、同名のファイルが複数表示されることがあります。その場合は適切なものを選択してください。

### 7. デベロッパーツールを再起動する

確認ダイアログが出るのでOKをクリックします。
![7.png](https://qiita-image-store.s3.amazonaws.com/0/56668/5eed0fe1-bbfb-dd6d-3197-8527fee75b11.png)

デベロッパーツールのみが再起動します。すると先ほどSources内にあったfile://で始まっていた階層が消えています。
![7.5.png](https://qiita-image-store.s3.amazonaws.com/0/56668/b96dbcee-0086-7155-a638-772417a7ce3b.png)

### 8. 編集開始！

ここまでやればSourcesタブ内で直接ファイルが編集できるようになります。試しに1行書き加えてみましょう。
![8.png](https://qiita-image-store.s3.amazonaws.com/0/56668/9427c170-9720-417a-d37a-00b2fc08f5c8.png)
![9.png](https://qiita-image-store.s3.amazonaws.com/0/56668/c387f71b-3cf9-eb77-8e0c-349745a8ec25.png)

ElementsタブでHTMLを書き換えた時のようにいじったそばからリアルタイムに反映するわけではないですが、編集と表示が一画面にまとまるので操作はしやすいと思います。もちろんHTMLだけじゃなく、CSSやJSも編集可能です。
個人的にはHTMLよりもJSエディタとしての方が魅力を感じます。なぜなら**エディター上で直接ブレークポイントが打てる**からです！
![10.png](https://qiita-image-store.s3.amazonaws.com/0/56668/4c9a6869-e02d-d50b-169a-527bb9f2f9da.png)

こちらもその場でリアルタイムにスクリプトが書き換えられるわけではないですが、Alt+Tabでウィンドウ間を行ったり来たりしないでF5更新ができるのは便利だと思います。
javascript：既存の関数を拡張する（処理を追加する）

＜例＞aaa()という関数を拡張し、bbb()という関数の処理を追加しています。


```js:使用方法
var aaa = function(){
 alert("aaa");
}

var bbb = function(){
 alert("bbb");
}

var old = aaa;
aaa = function(){
	old();
	bbb();
}

// 実行
aaa();
```
DartのMixinsとオーバーライド

# DartのMixinについておさらい
「多重継承のようなもの」を実現するための仕組み。その名の通りクラスを混ぜるようなイメージで、親子関係ではない。

Mixinを使うには`with`を使います。Mixinは継承と同時にしか行えないので、Mixinだけをしたい場合は`extends Object with`のように、`Object`を明示的に継承します。

簡単なサンプル

```dart
class Mixin {
  void foo() {
    print("foo on Mixin");
  }
}

abstract class SomeBase {
  void bar() {
    print("bar on Base");
  }
}

class SomeClass extends SomeBase with Mixin {
}

void main() {
  var some = new SomeClass();
  some.foo();
  some.bar();
}
```

SomeClassでは何の宣言もしていないがMixinの`foo`と継承元の`bar`が呼び出せるようになっています。

```
foo on Mixin
bar on Base
```

任意のクラスをMixinしているかどうかは継承と同様に`is`で判定できます。

```dart
...
void main() {
  var some = new SomeClass();
  print(some is SomeClass);
  print(some is SomeBase);
  print(some is Mixin);
}
```

```
true
true
true
```

# オーバーライドはMixinが優先される
上の例で、SomeBaseにも`foo`メソッドがあったらどうなるでしょうか

```dart
class Mixin {
  void foo() {
    print("foo on Mixin");
  }
}

abstract class SomeBase {
  void foo() {
    print("foo on Base");
  }
}

...
```

このように継承元とMixinに同じ名前のメソッドがある場合はMixinのほうが優先されます。

```
foo on Mixin
```

ちなみに、継承元とMixinの`foo`メソッドの引数が違う場合も引数に関係なくMixin側が優先されるので、次のコードはエラーとなります。

```dart
class Mixin {
  void foo(arg) {
    print("foo on Mixin");
  }
}

...

void main() {
  var some = new SomeClass();
  some.foo();
}
```

```
Unhandled exception:
Class 'SomeClass' has no instance method 'foo' with matching arguments.

NoSuchMethodError: incorrect number of arguments passed to method named 'foo'
Receiver: Instance of 'SomeClass'
Tried calling: foo()
Found: foo(arg)
...
```

継承とMixinではMixinが優先されますが、具象クラスにも`foo`がある場合は当然そちらが優先されます。

```dart
...

class SomeClass extends SomeBase with Mixin {
  void foo() {
    print("foo on Class");
  }
}

...
```

```
foo on Class
````

# superの参照先
オーバーライドの優先順位からもわかるように、superの参照先も優先順位はMixinが先です。

```dart
...

class SomeClass extends SomeBase with Mixin {
  void foo() {
    print("foo on Class");
    super.foo();
  }
}

...
```

この場合はまずSomeClassの`foo`が呼ばれ、その中でsuperによってMixinの`foo`が呼び出されます

```
foo on Class
foo on Mixin
```

必ずMixinを参照するわけではなく、優先順位が上というだけなので、Mixinには無いメソッドはSomeBaseから探されます。ただしコンストラクタの場合は、「Mixinは明示的コンストラクタを持ってはいけない」という規則があるので確実に継承元のコンストラクタが呼び出されます。

```dart
...

abstract class SomeBase {
  SomeBase() {
    print("base constractor");
  }
  ...  
}

class SomeClass extends SomeBase with Mixin {
  SomeClass(): super();
  ...
}
...
```

```
base constractor
foo on Class
foo on Mixin
```

# 複数Mixinは後ろが優先
Mixinは継承と違っていくつでも追加することができますが、この際のオーバーライドの優先順位は「後ろに書かれたものが優先」です。

```dart
class Mixin2 {
  void foo() {
    print("foo on Mixin2");
  }
}

class Mixin1 {
  void foo() {
    print("foo on Mixin1");
  }
}
...

class SomeClass extends SomeBase with Mixin1, Mixin2 {
  ...
}
...
```

```
foo on Class
foo on Mixin2
```

`with`の書き方によって挙動が変わってしまうので、内部のメソッド衝突には気をつけましょう。

# まとめ
- オーバーライドの優先順位は そのクラス自身 > Mixin > 継承元
- Mixinの中では後ろのほうが優先される

Mixinについては上記の内容も含めその利点など公式ドキュメントにまとめられています。
https://www.dartlang.org/articles/mixins/
さくらのVPSで.htaccessが動かなくて困っている君へ

# 概要
httpd.confで`AllowOverride All`にしたのに.htaccessが全然動かない悲しみを解決したのでメモです。

## 結論
httpd.conf内に設定がひとつだと思うな！！！

普通に行くと

```
# AllowOverride controls what directives may be placed in .htaccess files.
# It can be "All", "None", or any combination of the keywords:
#   Options FileInfo AuthConfig Limit
#
    AllowOverride All
```

だけで終えてしまうのですが、実際は以下の大ボスがいます。

```
<Directory />
    Options FollowSymLinks
    AllowOverride All
</Directory>
```
vimをご利用の方は`/AllowOverride`で検索してみましょう。次の検索結果へはnを押せば進めます。きっと幸せになれることでしょう。
cordova middleman 開発環境構築


※まだ未検証なので参考程度にしてください

## 注意点
* cordovaはグローバルインストールしないと上手く動かなかったのでグローバルインストール
* middlemanはローカルインストール
* cordovaプロジェクト直下にmiddlemanプロジェクトを配置するスタイル
* .gitignoreはcordova用とmiddleman用をそれぞれ直下に配置
* middlemanの出力先をcordovaのwwwに変更
* nodebrew環境想定
* rbenv環境想定

## ツールのインストール
```bash
npm install -g cordova


gem install middleman
gem install middleman-slim # slimのテンプレートを使う例です
```

## cordova作業ディレクトリの設定
```bash
cordova create test com.example 'Test'

cd test

# cordova platforms add android
# cordova platforms add ios
# 上記コマンドで自動生成されるためgit管理はしない
echo '/platforms' >> .gitignore
echo '/plugins/android.json' >> .gitignore
echo '/plugins/ios.json' >> .gitignore


echo '/www' >> .gitignore # www はmiddlemanが自動出力されるため想定なのでgit管理しない
rm -rf www

# nodebrewにディレクトリ毎のバージョン指定の機構があるわけではないが
#.node-versionファイルを出力することで
# ほかメンバーが以下のコマンドで同じバージョンを利用できるようになる
# nodebrew install `cat .node-version`
# nodebrew use `cat .node-version`
node -v > .node-version

# npmグローバルインストールなので、独自ファイルでcordovaのバージョンを共有
# 他のメンバーが以下のコマンドで同じバージョンを利用でいるようになる
# npm install -g cordove@`cat .cordova-version`
cordova -v >> .cordova-version

```

## middleman作業ディレクトリの設定
```bash
middleman init middleman --template=slim --skip-bundle

cd middleman

bundle install --path=vendor/bundle
echo '/vendor/bundle' >> .gitignore

bundle install --binstubs
echo '/bin' >> .gitignore

# middman出力先をcordova用のディレクトリに指定
echo "set :build_dir, '../www'" >> config.rb

rbenv local `rbenv version` # rubyのバージョンを共有(※rbenv想定です)

```
AndroidStudioで保存時に自動整形+import整理する（作業時間2分）

Commitする前に毎回`Command+Option+L`でフォーマット整形して`Control+Option+O`でimport整理するの面倒だったので、保存時に自動的にフォーマット整形+import整理するようにしてみました。

AndroidStudioのマクロ機能を使って2分でできたので手順をメモしておきます。

 

##1. マクロ記録開始

AndroidStudioには、一連の操作を登録できるマクロ機能があります。

`Android Studio > Edit > Macros > Start Macro Recording`を押したあと操作して、終わったら`Stop Macro Recording`を押すだけです。

まずは、`Start Macro Recording`をクリックします。

 

##2. マクロの登録

今回は、`Reformat Code、Optimize Import`、`Save All`の操作を記録したいので

`Code > Reformat Code`をクリックしたあと、`Code > Optimize Import`をクリックします。

`Optimize Import`をクリックしたあとでダイアログが表示された時は、ダイアログの中の`Rearrange entries`にチェックを入れてRunボタンを押してください。

![android_studio_1.png](https://qiita-image-store.s3.amazonaws.com/0/15267/946a855c-92f8-3920-cbc3-acf06aa9317a.png "android_studio_1.png")

最後に、`File > Save All`をクリックすればマクロの操作は終了です。

 

##3. マクロの保存

`Macros > Stop Macro Recording`をクリックしてマクロの登録を終了します。マクロに名前をつけるよう言われるので、適当な名前をつけてください。

![android_studio_2.png](https://qiita-image-store.s3.amazonaws.com/0/15267/a3259673-86c2-51aa-35ba-2697696f1c61.png "android_studio_2.png")



##4. ショートカットキーのバインド

保存は`Command+S`でやるので、ショートカットキーを変更しておきます。

`Android Studio > Preferences > Keymap > Macros`から、先ほど作ったマクロを選択して右クリック。
`Add Keyboard Shortcut`で`Command+S`をバインドします。元のキーバインドを消していいかという警告が出ると思うので、OKを押してください。

![android_studio3.png](https://qiita-image-store.s3.amazonaws.com/0/15267/d42c4ea9-aa73-d7c8-74d8-777efcd0af13.png "android_studio3.png")

 
##5. マクロのエクスポート

以上で保存時に自動的にフォーマットがかかるはずです。もしチーム全体でこのマクロの設定を共有したい場合は、設定をエクスポート・インポートすることができます。

`Android Studio > File > Export Settings`をクリックします。ダイアログに、どの設定をエクスポートするかチェックボックスが並んでいるので、`Macros`だけ選択して他はクリアします。`Key maps`も選んでもいいのですが、独自にキーバインドしている人の設定とコンフリクトする可能性があるので外しておきました。

OKを押すとsettings.jarというファイルをエクスポートできるので、チームメンバーに渡して、`Android Studio > File > Import Settings`からマクロをインポートしてもらいましょう。


以上！コードが自動的に読みやすくなっていい感じです。
マクロ機能はもっと使いこなせば色々捗りそうです。
hubot --createで怒られた


Hubotと戯れようと思ってローカル環境にHubotくんを連れてきて、「さてあいさつすっか」と思ったら怒られたのでメモ。

##環境
Vagrant上のCentOS(v7.0.1406)に、Node.js(v0.10.33)とredis(v2.8.18)をインストール済。


##つまづいたところ
一番最初にHubotくんをお迎えするディレクトリを構築する`hubot --create`を打ち込んだところ

```
$ hubot --create firsthubot
'hubot --create' is deprecated. Use the yeoman generator instead:
    npm install -g yo generator-hubot
    mkdir -p firsthubot
    yo hubot
See https://github.com/github/hubot/blob/master/docs/README.md for more details on getting started.
```

Readmeをちゃんと読めコノヤロウと三行半をたたきつけられた。


###しょうがないのでReadmeを読む。

>Once node and npm are ready, we can install the hubot generator:

なんかhubotジェネレータとやらもいれないとだめそうだ。

```
$ npm install -g yo generator-hubot
```

いれた。
そしたら次にこんな記述が。

>This will give us the hubot yeoman generator. Now we can make a new directory, and generate a new instance of hubot in it. 

```
$ mkdir myhubot
$ cd myhubot
$ yo hubot
```

まじすか。`--create`でいっぱつでやってくれるんじゃないんですか。そこんとこどうなんですか。

##で、Yoした。

```
$ yo hubot
```

```
                     _____________________________  
                    /                             \ 
   //\              |      Extracting input for    |
  ////\    _____    |   self-replication process   |
 //////\  /_____\   \                             / 
 ======= |[^_/\_]|   /----------------------------  
  |   | _|___@@__|__                                
  +===+/  ///     \_\                               
   | |_\ /// HUBOT/\\                             
   |___/\//      /  \\                            
         \      /   +---+                            
          \____/    |   |                            
           | //|    +===+                            
            \//      |xx|                            

```

###なんかイケてるロボットがでてきた！


`hubot --create`ができない理由がなんとなく突き止められてないので、知っている方いたらご教授ください。

##※追記
単に`hubot --create`が非推奨になっていたようです。
こちらに詳しく書いてありました。
http://qiita.com/bouzuya/items/11c0c6da2b3ad54b827f
isOOOなメソッドにデバッグ仕込みタイ

Booleanを返すメソッドがいっぱりありました。

```
isFoo(a) && isBar(b) && isPiyo(c) && ...
```

実行してるみるとどこかでこけました。

どこでこけたか分かりません。辛いです。

できるだけ元の実装を変えずにデバッグを仕込めたら嬉しいです。

↓にはしたくないです。

```
val a = isFoo(a)
if (!a) { logger.debug("isFoo is false..")
...
```

↓ちと辛いです。

```
def isFoo(a) = {
  val result = 
  if (result) logger.debug("foo")
  result
}
```

↓のようにしてみました。

```
implicit class DebuggableBoolean(val bool: Boolean) extends AnyVal {
  def debug(f: Boolean => String)(implicit logger: Logger): Boolean = {
    logger.debug(f(bool)); bool
  }
}

def isFoo(a: Int): Boolean = {
  ...
} debug { b => s"isFoo($a) is $b" }
```

もとの実装を汚さずにdebugが仕込めました。
CoreOSで突然sshログインできなくなった時の対処法

[Customizing the SSH Daemon - CoreOS](https://coreos.com/docs/cluster-management/setup/customizing-sshd/)

この記事を読んでcloud-configを利用してCoreOSのsshポートを変更したところ、リブートがかかったタイミングでsshdが起動中にこけるようになりました。
CoreOSのインストール時に公開鍵認証しか設定していなかったのでサーバ終了かと思いましたが、案外なんとかなったので備忘録として書いておきます。
環境はCoreOS 494.4.0、Conoha VPS上で動かしています。

## 解決策

1. Web コンソールに接続して再起動
1. GRUBのプロンプトに出たら `e` を押してオプション変更画面に移行
1. 最終行 ( `linux$` で始まる ) の終わりに ` coreos.autologin=tty1` を追加
1. `Ctrl-X` を入力して起動
1. `core` としてログインできるので、 `/var/lib/coreos-install/user_data` のsshのポート設定部分を以下のように編集して再起動

```yaml:user_data
coreos:
  units:
  - name: sshd.socket
    content: |
      [Socket]
      ListenStream=<任意のポート>
      Accept=yes
      FreeBind=true
```

## 参考
[Boot Into Single User Mode (Reset Root Password) - VULTR.com](https://www.vultr.com/docs/boot-into-single-user-mode-reset-root-password)
[change ssh port? · Issue #57 · coreos/bugs · GitHub](https://github.com/coreos/bugs/issues/57)
Data visualization とCivic techの切ってもきれない関係

Code for Japan の柴田です。
この記事はデータ・ビジュアライゼーションにまつわる実践的なノウハウやツールなどを投稿する Data Visualization Advent Calendar の8日目のための原稿です。他の記事は
http://qiita.com/advent-calendar/2014/dataviz
の一覧から見れるようになっており、日ごとに記事が増えていく予定です。

まず、Civic techとは何かということについて簡単に紹介をさせていただきます。21世紀型の民主主義、新しい公共、ガヴァメント2.0などと密接に結びついた概念であるCivic techは、身のまわりの地域課題を市民自らが持つテクノロジーで解決していこうという考え方です。

従来、市民は行政サービスの享受者であり、サービスを提供するのは行政側だけであるという一方通行の考え方でした。しかしながら、21世紀になってますます多様化する地域課題を解決するには行政だけの知識・力ではいかんともしがたく、ここに市民自らが考え、市民自らの力で出来る事は自分の力でやるというアイデアが出てきました。

また、テクノロジーの進歩はあらゆる市民が身近に技術のパワーを得ることを可能にしましたが、行政側では規制などにより、その進歩になかなか追いつくことが出来ていません。むしろ、市民がパーソナルに使っているツール（クラウドベースアプリやスマホなど）のほうが、行政で使用される堅牢ではあるが技術革新に乏しいシステムよりも数段、進んだテクノロジーとなってしまっています。

さらに、行政の持つデータをかつての情報公開法のようにプル型の形ではなく、原則公開、むしろプッシュ型として市民や民間で活用していこうというオープンデータの流れも同時に発生しています。21世紀に入り情報社会から知識社会に移行して知識やデータは社会をささえる新たなリソースとなりました。そこでは爆発的に増加していくありとあらゆるデータを公開、適切に処理することにより、事実を元にした判断を行いよりよい政策や課題解決につなげていこうという動きが当然のものとなります。

このCivic techを支えるテクノロジーにはいくつかの技術的要素があります。大きくわけて
（１）．Webサービスをさせるテクノロジ（JavaScript等）
（２）．オープンデータにアクセスするテクノロジ（APIアクセス、SPARQL等）
（３）．データビジュアリゼーションテクノロジ
（４）．地図空間情報テクノロジー

オープンデータにアクセスし（２）、これを解析、整形してWebサービスやスマホアプリの形で簡単に市民にアクセスできるようにする（１）。さらにこの際、より良いUXとして（３）や（４）のテクノロジを欠かす事はできません。これらの技術を用いることによって膨大な情報を整形して見やすく市民に表示することができます。結果、データや事実を元に身近な地域課題を解決する際に適切な判断が可能になります。

2014年、日本ではまだオープンデータ自体も端緒についたばかりです。当然、Data Visualizationもまだアドホックにデータを解析し、表示させてみるという例が多いかと思います。これが、2015年にはオープンデータを定期的に取得し行政サービスのパフォーマンスを常時表示するダッシュボードのような事例が増えてくると考えています。もちろん、データを表示させるだけではなく、パラメータを変化させることで結果のシミュレートが出来るような機能も必須となるに違いありません。

来年2015年の年末には、どんなダッシュボードサービスが揃っているのか、今から楽しみです。

それでは、皆さま良いホリデーシーズンをお迎えください。
Android Studio で JDK を設定する

# はじめに

Android Studio で JDK を指定する方法について。
Android API Level 21 (Lolipop) では JDK 1.7 が必要だが、特に OS X Mavericks 以前では 1.6 であることが多く、アップデート作業が必要になる。この作業手順が少々面倒だったのでメモ代わりとしてここに記載する。
Yosemite では始めからバンドルされているようなのでこの作業自体が不要かもしれない。

# JDK をインストールする

OS X の場合、JDK 1.7 からは Apple がカスタム版を提供しなくなったので、Oracle から手に入れる必要がある。
http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html

## バージョン確認

```
$ java -version
```


# JDK を指定する

`File` > `Project Structure` > `SDK Location` > `JDK location`
で JDK のパスを指定する。

このような感じにすれば良いらしい。
`/Library/Java/JavaVirtualMachines/jdk1.7.0_71.jdk/Contents/Home`

ちなみに、Apple 版 Java と Oracle 版 Java のインストール先ディレクトリは異なる。なお、Java Preference.app は廃止され、システム環境設定の「Java」からランタイム設定が可能になっている。

- Apple: /System/Library/Java/JavaVirtualMachines/
- Oracle:/Library/Java/JavaVirtualMachines/

# Java Compiler を指定する

`File` > `Other Settings` > `Default Settings` > `Compiler` > `Java Compiler` > `Project bytecode version`
を `1.7` にする。

# build.gradle

もしかしたら gradle の設定が追加で必要になるかもしれない。

```:build.gradle
compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_7
    targetCompatibility JavaVersion.VERSION_1_7
}
```
最新のGitで2014年を振り返る、ver2.0-ver2.2 までの注目すべき変更点


はい、2014年も終わるということで。最新版の2.2を含んだ2.0 ~ 2.2で追加された注目機能をいくつか紹介したいと思います。なんといっても今年はメジャーバージョンアップのあった年ですからね。

## 2.0:git push のデフォルトオプションの変更
これは2.0の有名な変更点ですね。`matching` から `simple` に変更されました。ちょっとわかりにくい部分だと思うので詳しく説明します。

※ちなみに自分はそのどちらでもない `nothing` を利用しています。

### matching
> 今までのデフォルト、ローカルとリモートのブランチ名が同一であればすべてがpush対象

というものです。昔からgit使っている人は、「そのブランチpushしたかった訳じゃないんだよ！」という苦い思い出がある方もいるのではないでしょうかｗ

### upstream
`simple`を説明するためには、これを説明したほうがいいかもしれません。

> upstreamが設定されている場合、そこにpushする。

というものです。自分は以前はこれを使っていました。

### simple
> upstreamが設定されていて、同名ブランチの場合のみpushする。

というものです。

```
git push -u origin feature/hogehoge
```

みたいに1度pushすると、set upstreamされます。すでにリモートブランチが存在する場合は、

```
git pull; git checkout feature/hogehoge
```

だけすれば、upstreamした状態で新しいブランチをcheckoutしてくれます。

※他にもset upstreamする方法はありますが一番簡単な方法だけ紹介しておきます。

### nothing
一応、自分が利用している設定も紹介しておきます。

> その名の通り、何もしない

`git push` なんて省略せず毎度ちゃんと

```
git push origin feature/hogehoge
```

するぜ！という宣言になりますね。面倒に思われるかもしれませんが、安心できるし自分はなんだかんだでずっとこうやってます。（オススメはしませんｗ）

### よくわからないよ。という人は。
```
git push -n
```
という --dry-run オプションで実際にpushせず、結果を出力だけすることができるので、試してみてください。

## 2.0:git add -A
> パス指定無しの `git add -A` をサブディレクトリ内で実行したとしても、ツリー全体を処理する

というものですね。もしもカレントディレクトリを指定したい場合はピリオドを追加して下さい。

```
git add -A .
```

※git add -u も同じ挙動に変更されています。

これにより、以下の挙動も同じになるので注意してください。

```
git add <path>
```

```
git add -A <path>
```

余談ですが、 `-A` というオプションのタイプが苦手で自分は `--all` の方を利用していますｗ

## 2.0:git pull --ff-onlyのconfig化

`git pull` をfast-forwardのみにしたい場合、`git pull --ff-only` と打つ必要がありましたが、 `pull.ff` 設定をしておくことでデフォルト設定として振る舞えるようになりました。

案外知られてないし、嬉しい人多いのではないでしょうか？

## 2.1: vimdiff3サポート
vimmerは嬉しい。git mergetoolでvimdiff3をサポートするようになりました。

## 2.1: git grep フルパス出力
気づいている人は気づいている。git grepのデフォルトがフルパス出力になりました。

相対パスを想定していた人は、ハマる可能性のある変更点ですね。

git側も「注意してくれ」って言っているので、ご注意を。

## 2.1: git config tag.sort サポート
2.0でgit tag --listのソートオプションが増えましたが、それを tag.sort設定できるようになりました。

```例
git config --global tag.sort version:refname
```

## 2.2: git config --edit --global
上記コマンド実行時に、設定ファイルがない場合はスケルトンファイルを元にした設定ファイルが生成されるようになりました。

## 2.2: git mergetool の一時ファイル
一時ファイルの作成周りも改善されました、一時ディレクトリ配下に作成されるようになったり、一時ディレクトリ自体の命名規約も変更になっています。

## 今年の流れや印象
ReleaseNoteを眺めてみると、`git log` や `git grep`の改善が目立ちますね。あとは署名系でしょうか。もちろん最適化による高速化も多く行われています。個人的に、git blameやgit diffはよく使うコマンドなので改善されるのは嬉しいですね。

ぜひ 他のReleaseNotesも見てみて下さい。日本人のメンテナもいたり、今回紹介した内容がほんの一部ということがわかるくらい、多くの改善内容が見れて楽しいですよ。

- [git/Documentation/RelNotes at master · git/git](https://github.com/git/git/tree/master/Documentation/RelNotes)

基本的には後方互換性のあるリリース内容ですが、Gitのすごいところは、互換性がない場合でもWarningやオプション、config設定などで困らないようにする「おもてなしの心」みたいなものが多く感じられるところです。

ドキュメントも丁寧でGitを愛する理由のひとつと言ってもいいかもしれません。

## 終わりに
はい、いかがでしょう。みなさんちゃんと最新のgit使っていますか？もしまだ2.2使ってない！という方がいましたら今すぐ最新のgitにしてみてください。（homebrew使っている場合は、`2.1.3` になるらしいです。）

大丈夫、もし困ってもgitconfigでちゃんと設定すれば、ほとんどが昔のままのgitとして使うことができますから安心してください。

ツッコミあればコメントよろしくお願いします！
SublimeTextとGistを連携するプラグイン

この記事は[SublimeText Advent Calendar 2014](http://qiita.com/advent-calendar/2014/sublimetext)の8日目の記事です。

普段の開発では

- iOS: Xcode/AppCode
- Android: IntelliJ
- それ以外: **Vim**

を使用しているため、SublimeTextを使用することが**全く**ないです。

そんな私がSublimeTextを使うとしたら[Gist連携プラグイン](https://github.com/condemil/Gist)かなと思ったので、これを紹介します。


## Gist連携プラグイン

プラグインのリポジトリは[ここ](https://github.com/condemil/Gist)にあります。説明もここに載っています。

### インストール

インストールは楽をしたいので、パッケージコントロールからインストールします。

`⌘`+`Shift`+`p`を入力してコマンドパレットを開き、`install`を入力後に`Gist`と打ってそれをインストールしてください。

https://github.com/condemil/Gist#package-control

### 設定

Gistプラグインを使用するための設定をします。

プラグインを使用するにはGitHubのApplicationトークンが必要なため、そのトークンをAPI経由で取得します。

まず、ターミナルを開き

```bash
curl -v -u USERNAME -X POST https://api.github.com/authorizations --data "{\"scopes\":[\"gist\"], \"note\": \"SublimeText 2/3 Gist plugin\"}"
```

を叩きます。（`USERNAME`はあなたのGitHubのユーザー名を指定してください）

https://github.com/condemil/Gist#api

GitHubのパスワードを対話式に聞かれるので、パスワードを送信するとJSONが返却され、`token`という名前をキーとして、その値にトークンが入っています。

次に、`Preferences` -> `Package Settings` -> `Gist` -> `Settings -User`を開き、先ほどのトークンを設定します。

```json
{
    "token": "HERE IS YOUR APPLICATION TOKEN."
}
```

他にもオプションを設定できますが、これだけで動きます。

https://github.com/condemil/Gist#options


### 使い方

`⌘`+`Shift`+`p`を入力してコマンドパレットを開き、`Gist`と打つと色々出てきます。

- Public/Private Gistの作成 `Gist: Create Public/Private Gist`
- 既存のGistを開く `Gist: Open Gist`
- Gistの更新 `Gist: Update File`

などなど

#### キーバインド

プラグインの方でデフォルトにキーバインドも用意されています。

https://github.com/condemil/Gist#default-key-bindings


## ちなみに

Vimにもプラグインあります。

https://github.com/mattn/gist-vim
[PotgreSQL]基本コマンド備忘録

#コマンド

表示系は末尾に+をつけると詳細表示になる



##db接続

```psql

//psql -U ユーザ名 データベース名
# psql -U postgres testdb
Welcome to psql 8.3.15, the PostgreSQL interactive terminal.

```

##遠隔接続

```
#psql -h 10.3.2.223 -p 5432 -U postgres -W  sampledb

```

##データベースリスト出力

```psql
#\list
        List of databases
   Name    |  Owner   | Encoding
-----------+----------+----------
 sampledb  |  testuser    | UTF8
```

##データベースに接続

```psql
#\c sampledb
You are now connected to database "sampledb".

```

##テーブル確認

```psql
# \d
                List of relations
 Schema |       Name        |   Type   |  Owner
--------+-------------------+----------+----------
 public | goods             | table    | postgres
 public | goods_id_seq      | sequence | postgres
 public | items             | table    | postgres
 public | items_id_seq      | sequence | postgres
 public | schema_migrations | table    | postgres
(5 rows)

```

##インデックス確認

```psql

# \di
                                   List of relations
 Schema |           Name           | Type  |  Owner   |       Table       | Description
--------+--------------------------+-------+----------+-------------------+-------------
 public | goods_pkey               | index | postgres | goods             |
 public | items_pkey               | index | postgres | items             |
 public | unique_schema_migrations | index | postgres | schema_migrations |
(3 rows)

```

##表領域リスト出力

```psql
#\db
       List of tablespaces
    Name    |  Owner   | Location
------------+----------+----------
 pg_default | postgres |
 pg_global  | postgres |
(2 rows)

```

##データベースサイズ確認

```psql

select datid,datname from pg_stat_database;
 datid |  datname
-------+-----------
     1 | template1
 11510 | template0
 11511 | postgres
 16385 | sampledb
(4 rows)

```

OS側で確認

```
#cd /usr/local/pgsql/data
#ls base
1  11510  11511  16385
```
##パスワードリセット

```
#alter role postgres with password 'password';

```

#外部接続設定
下記設定ファイルを記載し、リスタート
参考：http://rina.jpn.ph/~rance/linux/postgresql/connect.html

```file:/usr/local/pgsql/data/postgresql.conf
listen_addresses = 'localaddr' ← DBサーバのインタフェースIP
port 5432
```
どのサーバ

```file:/usr/local/pgsql/data/pg_hba.conf

host    all         all         10.3.2.0/24           md5

```
サーバリスタート

```

# /etc/rc.d/init.d/pgsql restart


```
Kodak PIXPRO SP360を試してみました。

今回は、Kodakさんから発売されたPIXPRO SP360を試してみました。
![-1.jpg](https://qiita-image-store.s3.amazonaws.com/0/38279/5af3bc31-4516-21fb-54b5-b236ea9fa39a.jpeg)
RecボタンやModeボタンなどがあり、操作はGoPROを意識しているような感じがあり、慣れている人には便利だと思います。

ドーム型のふたを開けるとこんな感じです。
![-2.jpg](https://qiita-image-store.s3.amazonaws.com/0/38279/342b0ff1-b0eb-caf5-a47b-3b7c5a97bf14.jpeg)



PCやスマホからコントロールする事ができるのと
プレビューをしながら作業できるのが利点になります。
GoPro6台と比べると撮影から映像化までの速度が格段に違います。
地面まで撮影したい場合は、2台使って別のソフトで調整が必要になります。
GoPROの方は逆に高解像度というのが売りになります。

ソフトウェアのダウンロード先
http://kodakcamera.jkiltd.com/AsiaOceania/jp/support/downloads.php

こちらを「pixpro_sp360_mac_pc.zip」をダウンロードしましょう！

PCは、usbでも接続できるようですがwifi接続を選択しました。特に問題がなければ以下のような画面になります。

PC画面
![スクリーンショット 2014-12-08 15.03.00.png](https://qiita-image-store.s3.amazonaws.com/0/38279/ffd97ec8-84cd-2cea-45fe-51c788fe6925.png)

SP画面
![-1.png](https://qiita-image-store.s3.amazonaws.com/0/38279/be793d1c-8169-136d-092c-d2433b997ede.png)

これでRECさえしてしまえば撮影できます。
たったこれだけの作業で撮影できてしまうのは脅威的ですね！
使い分けが重要だと思いますが
一つの選択しとしてはとても良いのではないでしょうか？

サンプル動画
開始から５分で撮影できました。
http://youtu.be/knJudNRFR9M
Slack を日米全社員で使っている話

<img width="500" src="https://qiita-image-store.s3.amazonaws.com/0/10941/ef9f8128-1d99-6a03-020b-60090dd3622c.png">

こんにちは。[SmartNews](https://www.smartnews.com) の町野です。
このエントリは [Slack Advent Calendar 2014](http://qiita.com/advent-calendar/2014/slack) の８日目になります。

## はじめに

[SmartNews](https://about.smartnews.com) では、今年の１１月から、チャットツールを [HipChat](https://www.hipchat.com) から [Slack](https://www.slack.com) に移行しました。HipChat の時は基本エンジニアしか使っていなかったのですが、今回の移行のタイミングで、エンジニアだけでなく、ビジネスやコーポレートの人間まで使うようになりました。更には、米国のサンフランシスコやニューヨークにいるメンバーも含めて、**日米全社員が、同じチームとして Slack を使っています**。

（ちなみに、メモ共有ツールとして、[Qiita:Team](https://teams.qiita.com) も全社員で使っています。お世話になっております）
（先日、SmartNews の [Qiita Organization](http://qiita.com/organizations/smartnews) も開設させてもらいました。お世話になっております）

## HipChat から Slack に移行した理由

一番大きな理由は、Restricted Accounts, Guest Accounts といった機能により、**チャンネル毎にアクセス制限をかけられる**という点でした。HipChat にも Guest Access という機能はあるのですが、これは URL を知ってれば誰でもアクセスできてしまうパブリックなもので、要件に合いません。社外の方との仕事のコミュニケーションが増えていくと、こうした制限がかけられないことがネックになります。

他にも、他サービスのとの連携機能が充実しているとか、メンションの通知レベルがチャンネル毎に細かく指定できるとか、Slack は後発のサービスだけあって痒い所に手が届く感じがよかったです。個人的には、Slack では発言にユーザのアイコンが出るのが好きです。

<img width="500" src="https://qiita-image-store.s3.amazonaws.com/0/10941/1147d0e9-a8d2-5cb5-042f-15aa2e730972.png">


## サービス連携
GitHub, Travis CI, Datadog などの開発系サービスや Qiita:Team のような情報共有サービス、カスタマーサポートのための Zendesk など、様々なサービスを Slack と連携させています。ほとんどのサービスはデフォルトでインテグレーション機能が用意されているのが嬉しいです。

デフォルトの連携機能は用意されていませんが、App Store / Google Play でのレビューも Slack に流して皆で日々チェックしています。ちょっと前まで自前でストアのレビューをスクレイピングして流していましたが、メンテが大変なので、今は [AppFigures](https://appfigures.com) と [Zapier](https://zapier.com) を組み合わせて実現しています。

<img width="500" src="https://qiita-image-store.s3.amazonaws.com/0/10941/4030ce5d-f15f-7265-8935-ed90a76afe63.png">


## 遊び心重要

<img width="400" src="https://qiita-image-store.s3.amazonaws.com/0/10941/08d31987-7e46-3f63-af19-c63584c5d8c2.png">

１日中、気を張っていたら疲れますよね。弊社では、雑談用のチャンネルを用意することはもちろん、カスタム絵文字をたくさん登録したり、[Hubot](https://hubot.github.com) で chikyubot という[地球くん](https://twitter.com/chikyukun)のボットを作ったりと、いろいろ遊んでいます。

<img width="500" src="https://qiita-image-store.s3.amazonaws.com/0/10941/bf77d62a-ee83-7da3-5dd2-5066f67accbc.png">

chikyubot は、どんどん育てていきたいなと思っているのですが、個人的に作りたいなと思っているのは、**「このメンバーで」「この時間に」「ここのお店に」ランチを食べにいけ**といってくれるようなご飯レコメンデーションシステムです。各人の好みと履歴を加味した、スーパーインテリジェントなシステムを妄想しています。

（[SmartNews では、複数人で行けばランチは無料！](http://about.smartnews.com/ja/careers/)）

## おわりに

今回、全社員が１つの Slack アカウントを使うようにしたことで、いわゆる社内の見える化が進んだなーという実感があります。会社の人数が増えてくると「最近何してるのか全然知らない人」っていうのがどうしても出てきてしまうものですが、**同じ Slack に皆がいることによって、「他のチームって何をしてるんだろう？」と思ったときに、気軽に覗けます。**

最近よく言われますが、社内コミュニケーションは、「基本的にクローズドで、共有すべきものを共有する（ホワイトリスト形式）」よりも、 基本的にオープンで、どうしてもダメなものだけ隠す（ブラックリスト形式） の方がいいですね。

**社内の情報は極力手軽で一カ所にオープンに。そして情報は基本自らとりに行くもの。**って考え方でやってます。
assembleコマンドのショートカット


Gradleでapkをビルドする場合、ターミナル上からコマンドでビルドできます。
コマンドが長くて面倒だと思ってたのですが、短くする方法があったのでメモです。

その方法なのですが、[Android Gradle Pluginのページ](http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Android-tasks)にcamel case shortcutsとして紹介されていました。
例えば、assembleReleaseの場合

```bash
$ ./gradlew aR
```
```bash
$ ./gradlew asR
```
```bash
$ ./gradlew aRe
```
のように書くことで実行できます。
assembleDebugなどでも同様に実行可能ですが、aDでマッチするタスクが複数ある(androidDependenciesなど)ため注意が必要です。

```bash
$ ./gradlew aDeb
```
これでassembleDebugが実行できました。
React.jsのComponent Lifecycle

今回はComponentのlifecycleについて書きたいと思います。

React.jsではComponentの状態の変化に合わせて色々メソッドを呼んでくれるのでそれに合わせて初期化や後始末な処理を書くことが出来ます。

よく使うのは`componentDidMount`や`componentWillUnmount`辺りです。
イベントの登録を`componentDidMount`でやって`componentWillUnmount`で解除するというのがよく使うパターンだと思います。


## componentWillMount()

ComponentがDOMツリーに追加される前に一度だけ呼ばれます。
なので初期化処理を行うのに適しています。

この中で`setState`するとrender時にまとめて行われます。

**server-side rendering**時にも呼ばれるのでどちらでも動くコードである必要があります。


## componentDidMount()

ComponentがDOMツリーに追加された状態で呼ばれるのでDOMに関わる初期化処理を行いたい時に便利です。
componentWillMountと違い**server-side rendering**の時には呼ばれません。

DOMを扱う処理のほか、AjaxリクエストやsetIntervalの登録などの**server-side rendering**時には必要ない初期化処理についてはこの中でやることになります。


## componentWillReceiveProps(nextProps)

Propが更新される時に呼ばれます。ちなみにComponentが新しくDOMツリーに追加される時には呼ばれません。
親ComponentのStateがPropとして渡されていて、その値が変化した時に画面の表示以外で何かしたいときに使う感じです。Notification的な？

後はPropの値に応じてStateの値を更新したいようなときに使います。


## shouldComponentUpdate()

これだけは他のlifecycleメソッドと違い、`true`か`false`を返す必要があります。
Componentがrerenderされる前に呼ばれ、`false`を返すとVirtualDOMの比較を行わずにrerenderもされなくなります。
なので独自でPropやStateを比較するような処理を実装することで無駄な計算をなくし、Performanceの向上を行うことを目的に実装します。

デフォルトでは常に`true`を返すようになっているので常にrerenderされます。
また、`forceUpdate`という強制的にrerenderするメソッドもあるのですがそれが呼ばれた場合にはこのメソッドは呼ばれません。

PropやStateを完全にImmutableなデータにして単純なObjectの比較にすることが可能になります。

```js
shouldComponentUpdate: function(nextProps, nextState) {
  return nextProps.user !== this.props.user || nextState.user !== this.state.user;
}
```


## componentWillUpdate(nextProps, nextState)

Componentが更新する前に呼ばれます。初回時には呼ばれません。
この中で`setState`を呼ぶことは出来ないのでPropの値を元に`setState`したいような場合は`componentWillReceiveProps`を使います。


## componentDidUpdate(prevProps, prevState)

Componentが更新された後に呼ばれます。初回時には呼ばれません。
DOMの変化にフックして何かしたい場合に使うと便利です。


## componentWillUnmount()

ComponentがDOMから削除される時に呼ばれます。
イベントの解除などクリーンアップ処理をしたいような場合に使うと便利です。
ComponentDidMountで登録したTimerの処理やDOMのイベントはここで解除するべきです。


## おまけ

### isMounted

例えばAjaxリクエストしてその結果をsetStateすることはよくあると思いますが、その時にリクエストが帰ってきた時にはすでにComponentがUnmountされていることもあり得ます。
その時に`setState`や`forceUpdate`を呼んでしまうとエラーになるので`isMounted()`でガードしておく必要があります。

```js
componentDidMount() {
  request.get('/path/to/api', res => {
    if (this.isMounted()) {
      this.setState({data: res.body.data});
    }
  });
}
```

-------

今回はComponentのLifecycleについて紹介しました。
明日は、Eventについて書きたいと思います。
[xcode] "process launch failed timed out waiting for app to launch"のエラー対処方法

xcodeからアプリを実機で試していたら、
"process launch failed timed out waiting for app to launch"
というエラーで全然起動が出来ませんでした。

調べてみると、Code SigningのProvisioning Profileが正しくなかった(Distributionにしていた)のが原因でした。

<strong>target --&gt; Build Settings --&gt; Code Signing</strong>

を正しくDevelopmentのものに変更することで解消できました。
AWS ELBからapacheのログに408が大量に出る対処

apacheログに大量の408が発生していました。
<pre class="lang:default decode:true">172.31.13.188 - - [24/Oct/2014:17:08:58 +0900] "-" 408 - "-" "-" 42 - -
172.31.13.188 - - [24/Oct/2014:17:08:58 +0900] "-" 408 - "-" "-" 18 - -
172.31.13.188 - - [24/Oct/2014:17:08:58 +0900] "-" 408 - "-" "-" 40 - -
172.31.13.188 - - [24/Oct/2014:17:08:58 +0900] "-" 408 - "-" "-" 21 - -
172.31.13.188 - - [24/Oct/2014:17:09:03 +0900] "-" 408 - "-" "-" 161 - -
172.31.13.188 - - [24/Oct/2014:17:09:03 +0900] "-" 408 - "-" "-" 114 - -</pre>
408とはRequest Time-outとのこと。

幾つか調べて最終的にはhttpd.confに下記設定を追加しました。
<pre class="lang:default decode:true">RequestReadTimeout header=0 body=0</pre>
対処としては以上です。

下記記事を参考にさせていただきました。
<a href="http://qiita.com/ionis_h/items/6eeccc4cab88b31d0ae8" target="_blank">ELBからの通信で408が多発する</a>
この記事に詳細は説明されていますが、ELBのConnection Settings: Idle Timeoutを30に設定しても改善が見られず。一旦RequestReadTimeout header=0 body=0で対応して様子を見ることにしました。

他に適切な対処方法が分かる方いましたらコメントください！
BootstrapのGlyphiconsが表示されない対処法(クロスオリジンリクエスト)

Bootstrapでフォントを使ったアイコンを出せるGlyphiconsですが、Xになって表示されない事がありました。

ChromeのDeveloper Toolで確認するとコンソールにエラーが出ています。
<blockquote>Font from origin 'https://aaaaaa.com' has been blocked from loading by Cross-Origin Resource Sharing policy: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'https://bbbbbb.com' is therefore not allowed access.</blockquote>
ちなみにFirefoxのエラーは
<blockquote>クロスオリジンリクエストをブロック: 同一生成元ポリシーにより、https://aaaaaa.com/fonts/glyphicons-halflings-regular.woff にあるリモートリソースの読み込みを拒否します。リソースを同一ドメインに移動するか、CORS を有効にすると解決できます。</blockquote>
これはクロスドメインからのアクセスができないというエラーです。
その場合の対処方法はクロスドメインからのアクセス許可をする必要があります。
<h2>.htaccessに設定する（自サーバーの場合）</h2>
fontsディレクトリが置いてあるディレクトリに下記記述した.htaccessを設置してください。
<pre class="lang:apache decode:true" title=".htaccess">&lt;FilesMatch "\\.(ttf|otf|eot|woff)$"&gt;
  &lt;IfModule mod_headers.c&gt;
    Header set Access-Control-Allow-Origin "\*"
  &lt;/IfModule&gt;
&lt;/FilesMatch&gt;</pre>
<h2>Cloudfront・S3の場合</h2>
弊社はcloudfrontを使っていたため、上記の.htaccessによる設定ができません。
その場合はs3のCORS Configurationを設定する必要があります。
<ol>
	<li>該当のS3のバケットを選択</li>
	<li>Propatiesを開く</li>
	<li>Permissionを選択</li>
	<li>Edit CORS Configurationを以下のような設定にします。
<pre class="lang:default decode:true">&lt;CORSConfiguration&gt;
    &lt;CORSRule&gt;
        &lt;AllowedOrigin&gt;*&lt;/AllowedOrigin&gt;
        &lt;AllowedMethod&gt;GET&lt;/AllowedMethod&gt;
        &lt;MaxAgeSeconds&gt;3000&lt;/MaxAgeSeconds&gt;
        &lt;AllowedHeader&gt;Authorization&lt;/AllowedHeader&gt;
    &lt;/CORSRule&gt;
&lt;/CORSConfiguration&gt;</pre>
ただ弊社は固定のドメインからのアクセスだったので、 &lt;AllowedOrigin&gt;*.example.com&lt;/AllowedOrigin&gt;のようにドメイン指定しました。</li>
	<li>Cloudfront側でinvalidationsを実行してキャッシュをクリアしていきます。（Cloudfrontの場合）</li>
</ol>
以上で指定ドメインからのアクセスが許可されるようになりました。