OmniAICreator/Qiita-1.07M huggingface dataset:
Android Tips in potatotips#25

# Abstract
Fringe81 さんで開催された [potatotips #25](https://github.com/potatotips/potatotips/wiki/potatotips-25) (iOS/Android開発Tips共有会) に、
Androidブログまとめ枠として参加してきたのでここに書き留めます。

# Tips

## Android開発する時のtips
資料: [僕がAndroid開発する時にちょっと便利だと思うtips](http://www.slideshare.net/masatakakono1/androidtips-56996395)
開発環境: AndroidStudio, GitHub

* Github上のプルリクをAndroidStudioでちょっと動かしたい時。 Chrome Extension などが必要
* AndroidStudio 上のこのコードをGithub上でちょっと人に見て欲しい時
* IdeaVim が最高。AndroidStudio でのショートカット紹介
* ADM の ヒエラルキービューは id の確認をするのに便利


## Androidでカスタムキーボードやってみた
* カスタムキーボードを作ったのでコードを大公開（資料は探し中）
* Fringe81, mikan さん等に関わってきました
* シェアハウスを出るので住民募集中
* tomosooon として Twitter や GitHub で活動していく予定


## RxJava modules
資料: [RxJava modules](https://speakerdeck.com/petitviolet/rxjava-modules)

* RxJavaString split/join など文字列に関する便利機能
* RxJavaMath average/min/max..などちょっとした計算に
* RxJavaDebug debug hookで subscribeしたところ/Observable などを覗く
* RxJavaJoins == zip?


## RxAnimation
* RxAnimation というライブラリについて
* Animation Animator 同じように使える　(Kotlin Version有)
* Animation Animator を Combine を使って混在させることができる


## Fastlane for Android
資料: [Fastlane for Androidによる継続的デリバリー](http://www.slideshare.net/nafu003/fastlane-for-android)

* fastlane for Android が出たということで
* fastlane + circleCI + fabric 
* GooglePlay Console にアップもできる


## Google Training Best Practices
参考: [Training - Getting Started](http://developer.android.com/intl/ja/training/index.html)
実は出してる Best Practices。主に for Performance について
* Avoid getter/setter でいいらしい


# 懇親会
ビールとピザとおつまみをおいしくいただきました。

# 所感
発表中は割と笑いが取りやすい雰囲気でした。
初めての potatotips参加で人見知り発動して一言もしゃべらずに帰ることを予感してましたが、
すぐに懇親会が始まり発表者に質問もしやすかったです。
逆に発表者が発表中に疑問点を投げかけることもあり、
そんなフランクさ等も相まってpotatotipsシステムすごいと思いました。
Postfixに入れたSSL証明書の更新手順

Postfixに入れたSSL証明書の更新を行ったので、そのときの作業ログです。

# 環境
更新に必要なものは以下になります。
ファイル名は適宜読み替えてください。
また、PostfixはCentOSで動かしているとします。

|更新に必要なもの|ファイル名|
|:--------|:---------------|
|証明書    |server.crt|
|秘密鍵    |private.key    |
|中間証明書|intermediate.crt|

# 手順
## 1. 中間証明書を証明書にくっつける
```bash:
cat intermediate.crt >> server.crt # 順番に気を付けること
```

## 2. 設定ファイルの更新

```bash:/etc/postfix/main.cf
# 証明書, 秘密鍵の場所は適宜読み替えて
smtpd_tls_cert_file = /etc/postfix/server.crt
smtpd_tls_key_file = /etc/postfix/private.key
```

## 3. Postfixの再起動
```bash:
sudo service postfix restart
```

## 4. 確認
SMTPSの場合になりますが、以下のコマンドで証明書の情報を確認。

```bash:
openssl s_client -connect localhost:465 -showcerts
```

一応実際にメールも送ってみて、正しく届けばおｋ。
rubyからmac上で実行中のアプリケーションを操作

# やりたいこと

* MacOS上で動いているアプリケーションに、rubyスクリプトからテキスト送ったりしたい
* AppleScriptを使用する際は、アプリケーション名がわからない場合でもなんとかしたい

# rb-appscript(gem)

gemがあったので使ってみる。
 [rb-appscript](https://rubygems.org/gems/rb-appscript/versions/0.6.1)

## インストール

```bash
$ gem install rb-appscript
```
で使えるようになる、、、はずだった。

```
*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of necessary
libraries and/or headers.  Check the mkmf.log file for more details.  You may
need configuration options.

Provided configuration options:
        --with-opt-dir
        --without-opt-dir
        --with-opt-include
        --without-opt-include=${opt-dir}/include
        --with-opt-lib
        --without-opt-lib=${opt-dir}/lib
        --with-make-prog
        --without-make-prog
        --srcdir=.
        --curdir
        --ruby=$HOME/.rbenv/versions/2.3.0/bin/$(RUBY_BASE_NAME)
extconf.rb:44:in `<main>': uninitialized constant Config (NameError)

extconf failed, exit code 1
```

ううむ。何かConfigっちゅうのが気に食わないらしい。
調べてみると、Ruby2.2以降にこのgemが対応できていないらしい。
[rb-appscriptのGithub Issue](https://github.com/mattneub/appscript/issues/12)

## 使い方
ruby2.1以下だと

```ruby
require "rubygems"
require "appscript"
include Appscript

app("TextEdit").activate
app("System Events").keystroke("send text message!")
```
こんな感じで使えるらしい。最近rubyバージョン上げたばっかりだったので残念。
gemの修正リクエストも出ているので、2.2以降は待った方が良さそう。

# gemを使わない方法

は、この辺りを参考にrubyからシェルコマンド実行させる感じで出来そう。
[RubyからMacの通知センターで通知する簡単な方法 (AppleScript)](http://qiita.com/zakuroishikuro/items/cfba3e7734036e389768)

## アプリケーション名を指定して操作

立ち上がっているAtomにテキストを入力するスクリプトを書いてみた。無事こっちは動きました。

```rb:write-to-atom.rb
`osascript -e '
  tell application "Atom"
    activate
    tell application "System Events"
      keystroke "send to this message to Atom."
    end tell
  end tell'`
```

## アプリケーション名が不明な場合の対応(pidを使用)

`tell application`でアプリケーション名を指定しなくてはいけないのですが、今回処理したかったapplication名がどうしてもわからず。
pidだけはなんとか取得できたので、それを使ってapplicationをactivateする方法。

```rb:write-to-specified-from-pid-app.rb
`osascript -e '
tell application "System Events"
  set frontmost of the first process whose unix id is "#{pid}" to true
  keystroke "send to this message to #{pid} app."
end tell'`
```

この方法を探すのに、結構苦労しました。

# 参考サイト
* [How to send keyboard and mouse commands to the underlying operating system using Ruby?](http://stackoverflow.com/questions/1446327/how-to-send-keyboard-and-mouse-commands-to-the-underlying-operating-system-using)
* [How to activate Mac OS X application with a given process ID?](http://stackoverflow.com/questions/2296812/how-to-activate-mac-os-x-application-with-a-given-process-id)

# 動作検証環境
* Mac OS X 10.9.5
* ruby 2.3.0
ansible依存性確認

ansible 1.9の依存性確認

```
[root@node3 ~]# yum deplist ansible
読み込んだプラグイン:fastestmirror
base                                                                                                          | 3.6 kB  00:00:00     
epel/x86_64/metalink                                                                                          | 6.1 kB  00:00:00     
epel                                                                                                          | 4.3 kB  00:00:00     
extras                                                                                                        | 3.4 kB  00:00:00     
updates                                                                                                       | 3.4 kB  00:00:00     
(1/3): epel/x86_64/group_gz                                                                                   | 169 kB  00:00:00     
(2/3): epel/x86_64/updateinfo                                                                                 | 456 kB  00:00:00     
(3/3): epel/x86_64/primary_db                                                                                 | 3.7 MB  00:00:02     
Loading mirror speeds from cached hostfile
 * base: www.ftp.ne.jp
 * epel: ftp.riken.jp
 * extras: www.ftp.ne.jp
 * updates: www.ftp.ne.jp
パッケージ    : ansible.noarch 1.9.4-1.el7
  依存性      : /usr/bin/python
   provider: python.x86_64 2.7.5-34.el7
  依存性      : PyYAML
   provider: PyYAML.x86_64 3.10-11.el7
  依存性      : python(abi) = 2.7
   provider: python.x86_64 2.7.5-34.el7
  依存性      : python-httplib2
   provider: python-httplib2.noarch 0.7.7-3.el7
  依存性      : python-jinja2
   provider: python-jinja2.noarch 2.7.2-2.el7
  依存性      : python-keyczar
   provider: python-keyczar.noarch 0.71c-2.el7
  依存性      : python-paramiko
   provider: python-paramiko.noarch 1.15.1-1.el7
  依存性      : python-setuptools
   provider: python-setuptools.noarch 0.9.8-4.el7
  依存性      : sshpass
   provider: sshpass.x86_64 1.05-5.el7
[root@node3 ~]#
```
redisが使用しているメモリ容量の確認方法

redisが使用しているメモリを確認したい時、redis-info cliのMemoryのそれぞれの項目の意味で説明をまとめる。


```
redis-cli info
```
 

# Memory

```
used_memory:1004464
used_memory_human:980.92K
used_memory_rss:1765376
used_memory_peak:1004464
used_memory_peak_human:980.92K
used_memory_lua:35840
mem_fragmentation_ratio:1.76
mem_allocator:libc
```
 

1. used_memory : redisによって割り当てられた総バイト数
1. used_memory_human：単位表示（人間が読める型式の表現）
1. used_memory_rss：OSから見たときのRedisによって割り当てられたバイト数
1. used_memory_peak：Redisが消費する最大メモリ
1. used_memory_peak_human：単位表示（人間が読める型式の表現）
1. used_memory_lua：Luaのエンジンが使用するバイト数
1. mem_fragmentation_ratio：used_memory_rssとused_memory間の比率
1. mem_allocator:libc：メモリアロケータ
【Vim】複数行の最後尾に同じ文字を挿入したい場合

プログラムコードやテンプレートなどで
複数行の最後尾に同じ文字を手っ取り早く挿入する方法

さきほど、素晴らしいご指摘をいただいたのですが
誤操作で記事そのもの削除してしまいました。
改めて、書き直します。

例）以下の```<tr><td>```の対となるタグ```</tr></td>```を最後尾に挿入する場合

```
<table>
<tr><td>商品1
<tr><td>商品2
<tr><td>商品3
<tr><td>商品10
<tr><td>商品11
<tr><td>商品12
<tr><td>商品13
<table>
```

↓↓↓↓↓↓

```
<table>
<tr><td>商品1</td></tr>
<tr><td>商品2</td></tr>
<tr><td>商品3</td></tr>
<tr><td>商品10</td></tr>
<tr><td>商品11</td></tr>
<tr><td>商品12</td></tr>
<tr><td>商品13</td></tr>
<table>
```

こちらの方が早いです。

```
:2,8s@$@<\/td><\/tr>@
```


先程はビジュアルコードの矩形でやりましたが
視覚的にやるのであれば
現在のカーソルから範囲を指定すればよいだけ。

```
:.,.+7s/$/<\/td><\/tr>/
```

ありがとうございました。


追記

念のため、ビジュアルモード矩形での手順も記載しておきます。

1. ctl + v  ：　開始行でビジュアルモードの矩形にして
1. 最終行までカーソル移動
1. $：で最後尾までカーソル移動
1. shift + a ：挿入モードに切り替え
1. ```</td></tr>```と入力
1. escape：通常モード
【AWS】EC2で構築したLinuxサーバを停止し忘れるのでCronでshutdownするように仕掛けてみた


今後のためにメモメモ。。。

昔、サーバを停止忘れて課金されてことがあったので、Cronに頼ることに。。。
他のやり方もあるはずだけど、今回はCronでのやり方をメモメモ。

-

# 0.設定

````コマンド
[root@ip-172-31-30-138 ~]# crontab -l
SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/opt/aws/bin:/root/bin:/opt/aws/bin
MAILTO=""
0 0 * * * shutdown -h now  2>&1
````

上のように設定すればOK！！！！
[Python]Matplotlibで線グラフを描画する方法

線グラフを書くにはplotを使う。
以下にいくつかの例を示す。

## 簡単な線グラフの描画
plot(x,y)のようにx,yの値を別々に渡す。
パラメータlinestyleで線のスタイルが指定できる。

```python
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import norm

fig = plt.figure()
ax = fig.add_subplot(1,1,1)

x = np.linspace(-6,6,1000)

ax.plot(x,norm.pdf(x, loc=0.0, scale=1.0), color='black',  linestyle='solid')
ax.plot(x,norm.pdf(x, loc=0.0, scale=0.5), color='black',  linestyle='dashed')
ax.plot(x,norm.pdf(x, loc=0.0, scale=0.25), color='black', linestyle='dashdot')

ax.set_title('First line plot')
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.grid(True)
fig.show()
```
![plot_01.png](https://qiita-image-store.s3.amazonaws.com/0/100523/6c32bc52-e557-f3ae-dcae-b52aedef2625.png)

## 線の太さの変更
linewidthで線の太さが変えられる。

```python
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import norm

fig = plt.figure()
ax = fig.add_subplot(1,1,1)

x = np.linspace(-6,6,1000)

ax.plot(x,norm.pdf(x, loc=0.0, scale=1.0), color='black',  linestyle='solid', linewidth = 3.0, label='line1')
ax.plot(x,norm.pdf(x, loc=0.0, scale=0.5), color='black',  linestyle='dashed',linewidth = 1.0, label='line2')
ax.plot(x,norm.pdf(x, loc=0.0, scale=0.25), color='black', linestyle='dashdot', linewidth = 0.5,label='line3')

ax.set_title('Second line plot')
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.legend()
ax.grid(True)
fig.show()
```
![plot_02.png](https://qiita-image-store.s3.amazonaws.com/0/100523/ea496b29-c014-547a-b111-34c0ff650de0.png)

## 線の色の変更
線の色はcolorで変える。

```python
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import norm

fig = plt.figure()
ax = fig.add_subplot(1,1,1)

x = np.linspace(-6,6,1000)

ax.plot(x,norm.pdf(x, loc=0.0, scale=1.0), color='red',  linestyle='solid', linewidth = 1.0)
ax.plot(x,norm.pdf(x, loc=0.0, scale=0.5), color='green',linestyle='solid',linewidth = 1.0)
ax.plot(x,norm.pdf(x, loc=0.0, scale=0.25), color='blue', linestyle='solid', linewidth = 1.0)

ax.set_title('Third line plot')
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.grid(True)
fig.show()
```
![plot_03.png](https://qiita-image-store.s3.amazonaws.com/0/100523/f9064b82-a4f5-89a3-888e-a32a02ed8388.png)

## markerの描画
markerを指定すると線グラフのデータの場所にmarkerが描画される。
データが多い場合は、下の線のようにmarkerで線が見えなくなる。
markeveryを指定することで何個間隔でmarkerを描画するか指定できる。

```python
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import norm

fig = plt.figure()
ax = fig.add_subplot(1,1,1)

x = np.linspace(-6,6,1000)

ax.plot(x,norm.pdf(x, loc=0.0, scale=1.0), color='black',  linestyle='solid', linewidth = 1.0, marker='o')
ax.plot(x,0.5 + norm.pdf(x, loc=0.0, scale=1.0), color='black',  linestyle='solid', linewidth = 1.0, marker='o', markevery = 50)

ax.set_title('4th line plot')
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.grid(True)
fig.show()
```
![plot_04.png](https://qiita-image-store.s3.amazonaws.com/0/100523/edf66b0c-2803-6104-13ff-ef5840d311c1.png)

markerの代表的なもの

| marker | description |
|:---|:---|
|.| point |
|o| circle |
|v|下三角|
|^|上三角|
|s|四角|
|+|plus|
|x|cross|
|*|star|

http://matplotlib.org/api/markers_api.html
underscoreコードリーディング（lastIndexOf）

underscoreに詳しくないので、勉強半分でソースコードを読む。



##利用するバージョン
[underscore.js(v1.8.3)](https://github.com/jashkenas/underscore/tree/1.8.3)


##indexOfとは


###[underscorejs.orgのlastIndexOf](http://underscorejs.org/#lastIndexOf)

こんな説明。
>####_.lastIndexOf(array, value, [fromIndex]) 
>Returns the index of the last occurrence of value in the array, or -1 if value is not present.
>Pass fromIndex to start your search at a given index.


```javascript

_.lastIndexOf([1, 2, 3, 1, 2, 3], 2);
=> 4

```
------------- 
arrayの中でvalueが最後に出現するvalueのindexを返します。
もしvalueがarrayの中に存在しなかった場合は-1を返します。
fromIndexを渡すと、その箇所からの検索を開始します。


###[underscore.lastIndexOf](https://github.com/jashkenas/underscore/blob/1.8.3/underscore.js#L673)
コード的にはこのあたり。

```javascript

_.lastIndexOf = createIndexFinder(-1, _.findLastIndex);
  
```

_.lastIndexOf自体はcreateIndexFinderに値を渡しているのみ。(indexOfと同様)

[createIndexFinder](https://github.com/jashkenas/underscore/blob/1.8.3/underscore.js#L643)は以下

```javascript
  // Generator function to create the indexOf and lastIndexOf functions
  function createIndexFinder(dir, predicateFind, sortedIndex) {
    return function(array, item, idx) {
      var i = 0, length = getLength(array);
      if (typeof idx == 'number') {
        if (dir > 0) {
            i = idx >= 0 ? idx : Math.max(idx + length, i);
        } else {
            length = idx >= 0 ? Math.min(idx + 1, length) : idx + length + 1;
        }
      } else if (sortedIndex && idx && length) {
        idx = sortedIndex(array, item);
        return array[idx] === item ? idx : -1;
      }
      if (item !== item) {
        idx = predicateFind(slice.call(array, i, length), _.isNaN);
        return idx >= 0 ? idx + i : -1;
      }
      for (idx = dir > 0 ? i : length - 1; idx >= 0 && idx < length; idx += dir) {
        if (array[idx] === item) return idx;
      }
      return -1;
    };
  }
```
_.lastIndexOfの場合はdirに-11、predocateFindに_.findLastIndexが入る。
var dir=-1, predicateFind = _.lastIndexOf, sortedIndex = undefined;な状態で入る

返されるのは関数で、array,item,idxの3つの引数を持つ関数を返す。

つまりこうなる


```javascript

    return function(array, item, idx) {

      var i = 0, length = getLength(array);
      if (typeof idx == 'number') {
        length = idx >= 0 ? Math.min(idx + 1, length) : idx + length + 1;
      }
      
      if (item !== item) {
        idx = _.lastIndexOf(slice.call(array, i, length), _.isNaN);
        return idx >= 0 ? idx + i : -1;
      }
      for (idx = length - 1; idx >= 0 && idx < length; idx += -1) {
        if (array[idx] === item) return idx;
      }
      return -1;
    };
```

for文用のiとarrayのlengthを格納した変数lengthを定義する。
idxがnumberだった場合、dirは-1なので、
length = idx >= 0 ? Math.min(idx + 1, length) : idx + length + 1;
に入る。

idxが0以上の場合はMath.min(idx + 1, length) 
そうでない場合はidx + length + 1;
がlengthに代入される。(ここまでfor文で探査されることとなる)

itemがitemじゃない場合（？）は
arrayをi番目からlength番目までsliceし、それをisNaNがマッチするまで_.findLastIndexにかけ、マッチした箇所をidxに代入する。
idxが0以上だったら（マッチしてる箇所があったら）idx+iを、そうでない場合は-1を返す。


それら全てに当てはまらなかった場合は、dir=-1なので、idxにlength -1 を代入し、idxが0以上かつidxがlengthに達するまで、i--する。
その中で、array[idx]がitemとマッチした場合はそのidxを返す。

これらに全て合致しなかった場合は-1を返す。
【AWS】EC2でLinuxサーバ立てた時にタイムゾーンの直し方


-

また使うかもしれないのでメモメモ。。。

たまにEC2でLinuxサーバを構築しますが、時刻が…

````
[root@ip-172-31-30-138 ~]# date
Wed Jan 13 09:23:10 EST 2016
[root@ip-172-31-30-138 ~]# 
````

ってことが良くありますね。。。
サーバを落とし忘れることが多々あるので、Cronを仕込んで自動的に指定時刻になったらサーバを `shutdown` させたいのです。

ただ、タイムゾーンが `JST` でないと設定面倒なので直します。
というか直し方覚えれるか怪しいので、ログとして残そうと思います。

今回は、下記の記事を参考にしました。
[【Linux】タイムゾーン(Timezone)の変更](http://qiita.com/azusanakano/items/b39bd22504313884a7c3)

-

# 0.事前確認

設定する前はどうなっているか確認してみます。

````
[root@ip-172-31-30-138 ~]# date
Wed Jan 13 09:23:10 EST 2016
[root@ip-172-31-30-138 ~]# 
````

上記のようにタイムゾーンが `EST` になってしまっています…

これを `JST` にしたいのです。。。。

-

# 1.設定変更
## 1.1.タイムゾーンファイルの差し替え

````コマンド
# cp -p /etc/localtime /etc/localtime.org
# ln -sf  /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
````

上記の差し替えすると、即座にタイムゾーンが変わります！！

````実際のログ
# cp -p /etc/localtime /etc/localtime.org
# ln -sf  /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
# date
Wed Jan 13 23:26:36 JST 2016
````

はい、うまくいきました！！
ただし、このままだと再起動時にまたもとに戻ってしまう可能性があるので、恒久対応が必要ですが、私は特に必要ないのでやりません。

恒久対応のやり方が気になる人は下記を確認してみてください！！
[【Linux】タイムゾーン(Timezone)の変更](http://qiita.com/azusanakano/items/b39bd22504313884a7c3)



-

へばな。
AngularJSでサクッとダイアログ


AngularJSでのダイアログではUI Bootstrapが使えるようです。

[UI Bootstrap](https://angular-ui.github.io/bootstrap/)

以前は"\$modal","\$modalInstance"という名前で扱っていましたが、現在では"\$uibModal","\$uibModalInstance"という名前に変更されたようです。
下記のような感じで、必要ライブラリを読み込みます。

```
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script>
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/js/bootstrap.min.js"></script>
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.8/angular.min.js"></script>
    <script src="ui-bootstrap-tpls-0.14.3.min.js"></script>
```

#導入
moduleで"ui.bootstrap"を読み込みます。

```
angular.module('DialogSample', ['ui.bootstrap']);
```

#ダイアログの表示
```
function($scope, $uibModal){
:
//open
var modalInstance = $uibModal.open({
	templateUrl: 'dialog.html',
    controller : 'DialogController',
    backdrop   : true,
    scope      : $scope,
    resolve: {
        params:function(){
            return {
              title:'DialogSample',
              message:'Take it easy!'
            };
        }
    }});
//set callback
modalInstance.result.then(
    function(result){
        $scope.result = result;
        $scope.event = "close";
    },
    function(result){
        $scope.result = result;
        $scope.event = "dismiss";
    });
}
```
表示するためには"\$uibModal.open"を呼び出します。
表示用のレイアウトが記述されているHTMLと、それに紐付けるコントローラーを指定できます。
backdropは背景のことです。falseにすると背景が非表示になり、背景部分をクリックしてもダイアログは閉じません。
'static'を指定した場合は、背景は表示されますが、クリックしても閉じなくなります。
resolveには、ダイアログ側に引数を渡すことができるパラメータです。

また、open関数の戻り値に対し、result.then()関数を呼び出し関数を設定しておくと、ダイアログが閉じた時のイベントが検知できます。

#ダイアログ側

```
angular.module('DialogSample').controller('DialogController', ['$scope', '$uibModalInstance',　'params',
      function($scope, $uibModalInstance, params){

        $scope.title = params.title;
        $scope.message = params.message;
        $scope.pressClose = function(){
          $uibModalInstance.close('done');
        };
        $scope.pressDismiss = function(){
          $uibModalInstance.dismiss('done');
        };

      }]);
```
ダイアログを閉じるために、"\$uibModalInstance"を設定します。
また、open関数のresolveに設定した引数名を指定することで、それ経由でパラメータを受け取ることができます。

ダイアログを閉じるには、"$uibModalInstance"のcloseまたdismiss関数を呼び出しますが、ここに入れたオブジェクトはresult.then関数に設定した関数内で受け取ることができます。

closeを呼び出した場合は、result.then関数の第一引数に設定した関数が、dismissを呼び出した場合はresult.then関数の第二引数に設定した関数が呼び出されます。

背景クリック時はdismiss呼び出し時と同じ関数が呼び出されます。
背景クリック時には引数には"backdrop click"という文字列が渡されるようです。

下記にソースコードを置いています。
https://github.com/ExistMikan/AngularJSDialogSample/blob/master/index.html
Docker on Macな環境でMacのディレクトリをコンテナにマウントする仕組み

___注意___
この記事は古いです。「Docker for Mac」ではなく「Docker Toolbox」+「Virtual Box」によるDocker環境について記述しています。
<hr>

MacへのDockerのインストール記事を読んで、MacでDockerを試していたところ、不思議な現象に遭遇しました。

docker runのときに-vオプションでホストのディレクトリをコンテナにマウントできるのですが、
このオプションを使ってMacのファイルシステムをコンテナにマウントできてしまったのです。
しかし、これはおかしな動作です。
MacではVirtualBox上にDockerホストを立ち上げるため、Mac自身のファイルシステムをマウントできないはずだからです。

このコマンドを打ってみたところ、見事にMacのディレクトリがコンテナにマウントされていました。
vimでファイルを作成したり編集してみてもしっかりと互いに反映されます。

```bash
docker run -v /Users/hoge/docker-storage:/storage -ti centos /bin/bash
```

そんな馬鹿なと思い頭がこんがらがること１０分。もしやと気づきました。
VirtualBox上のDockerホストとなっている仮想マシンの設定をみてみると、/Usersが共有ディレクトリに設定されていました。

Docker on Macな環境では、どうやら/Usersはデフォルトで共有ディレクトリとなるようです。
気づけば本当に簡単なことでした。

いやしかし便利だなこれ。

##参考

Mac OS X へのDockerのインストール方法
http://qiita.com/hshimo/items/e24b1fbfbf775ec7c941
Rails で任意の Header の値を Cookie として扱う

Unity で `WWW` や `UnityWebRequest` などの機能を使って HTTP リクエストする際、Cookie を操作することができなくてセッションの維持に困ったので、サーバー側で以下の Rack middleware を作って使うことで問題を解決しました（Unity で Cookie 対応のアセットを使うとか他にもいろいろやりようはあると思いますが、今回はそうしなかった）。

https://github.com/shiwano/rack-merge-cookies

手順としては、

```rb
gem 'rack-merge-cookies'
```

を Gem ファイルに追加し、`bundle install`。

```rb
config.middleware.insert_before(ActionDispatch::Cookies, Rack::MergeCookies, header_name: 'X-COOKIE')
```

上記の記述を `config/application.rb` に追加すれば、X-Cookie の値を Cookie として取り扱うことができるようになります。

通常の Web アプリケーション開発でこのようなことに困ることはないと思いますが、もし同様の事例で困った方がいたら試してもらえれば (´・ω・`)
UIWebViewでHeaderを設定する方法

UIWebViewでHeaderに値を足してたんだけど
shouldStartLoadWithRequestで
```objc:sample
[request setValue:@"1" forHTTPHeaderField: @"aaa"];
[_webview loadRequest:request];
```
ってゆう感じでやってたんですが、このやり方だとiFrameでyoutubeが埋め込まれてる場合にyoutubeが表示されないので調べ直した。
まずなんで表示されないかはわからなかった別にiframeってGET通信でいいだろうし、Chromeの「ModHeader」で同じヘッダー付けてサイト表示した場合は問題なかった。
didFailLoadWithErrorに入ってきたので通信キャンセルされてそうだった。

で他にいい方法あるかなーって調べた結果
[iOS UIWebViewでrequest http header をカスタムする方法](http://qiita.com/hikaruna/items/ba9fd3286d7265620914)
ってのが見つかり
```objc:sample
-(NSURLRequest*) uiWebView:(id)webView
                  resource:(id)identifier
           willSendRequest:(NSURLRequest *)request
          redirectResponse:(NSURLResponse *)redirectResponse
            fromDataSource:(id)dataSource
```
という隠されたdeledateがあり確かに処理として通ってて、多分ついてる。※通信結果までは確認してません。
これならメソッドも書き換わらないし、便利ですね。
youtubeのiframeも無事表示されました。
CallConnectの出来ること、出来ないこと


Twilioを使ったサービスCallConnectで出来ること、出来ないことをまとめました。

#出来ること
##最初にどんな要件か聞いて、担当者の番号に振り分けることができる
自動音声を設定することができ、着電時にお客様に自動音声を聞いてもらい、番号入力の操作を行ってもらうことで、要件を先に知ってから、適した相手に振り分けることができるので効率的に電話を取ることができます。

##携帯電話とほぼ同じ機能をサービス内で利用することができる
通話履歴の確認、アドレス帳登録ができます。CSVでデータの入出力が可能。他のサービスとの連携も可能。

##通話内容を聞き直すことができる
お客様とどのような会話をしたか確認が出来たり、電話応対のマナー指導などができます。

##電話後に簡単な処理を行える
電話が終わるたびにPOSTしたり、Slackなどの他のアプリに通知したりすることができます。

#出来ないこと(まだ私が活用できていないだけかも・・)

##自動音声の設定を1つしか作ることができない。
自動音声の次に自動音声・・・というような設定ができないため、複雑なフローを作ることができません。
例：
営業への電話か、技術的な電話か
↓
担当はAさんかBさんか
などのフローを作成することができません。


#終わりに
簡単にまとめましたが、ブラウザ上で電話応対ができるようになることがとても革新的だと思います。
自動音声の設定や、webhookがフロー内で利用できるようになり、複雑なフローが作成できるようになれば、とても幅が広がり、今までのコールセンターのシェアを獲得できそうな気がします。


※注意
上記内容は2016/1/13時点で、私が確認できた機能の一部です。新しく可能になったり、廃止された内容があるかもしれませんのでご了承ください。
ELBとCloudFrontで同じSSL証明書を使う方法

ワイルドカード証明書を利用する場合、ELBとCloudFrontで同じSSL証明書を利用する場合がありますが、AWSマネジメントコンソールのELBメニューからSSL証明書を登録してもCloudFrontのCustom SSL Certificateプルダウンリストには表示されません。

![cloudfront_no_sslcert.PNG](https://qiita-image-store.s3.amazonaws.com/0/38162/0c0ed291-1fdb-7347-fb55-b7e4fb5f102b.png)

CloudFrontでSSL証明書を利用する場合、AWS CLIで登録する必要があります。（--path /cloudfront オプションが必要）

```
aws iam upload-server-certificate \
--server-certificate-name <任意のサーバ証明書識別名> \
--certificate-body file://<サーバ証明書のパス> \
--private-key file://<秘密鍵のパス> \
--certificate-chain file://<中間CA証明書のパス> \
--path /cloudfront/
```

以下のコマンドで正しくアップロードが完了したことを確認できます。

```
aws iam get-server-certificate --server-certificate-name <任意のサーバ証明書識別名>
```

上記コマンド登録した証明書は、ELB側にも登録されますので、ELBとCloudFront両方で同じSSL証明書を利用する場合は、AWS CLIでSSL証明書を登録しましょう。

※ELBで登録してしまったSSL証明書は以下のコマンドで削除できます。

```
aws iam list-server-certificates 
aws iam delete-server-certificate --server-certificate-name <任意のサーバ証明書識別名>
```
sitecake

### オープンソースハックず　-open source Hack's-

# 経緯

何か新しいことはじめたいと思い、自分ができること＋αで、オープンソースなどをひたすらハック続けていきます。
説明の中で操作方法や解説などが間違っていましたら、
お手数ですが、コメントなどからご指摘いただけますと幸いです。

それでは、今回一発目は、「SiteCake[サイトケーキ]」を紹介したいと思います。

---

# SiteCake (サイトケーキ)
![スクリーンショット 2016-01-19 3.42.08.png](https://qiita-image-store.s3.amazonaws.com/0/12007/d27a1f11-4ebc-66ea-0200-9910fb55250f.png)

[SiteCake](http://sitecake.com/)とは...Drag & dropをはじめとした操作でデータベースの更新レスといったシンプルにCMS(Simple CMS for your HTML website)で、ブラウザから直接HTMLファイルを操作可能となっている。
ただいろいろと構築条件はあるが、PHPで構成されているのため、基本的にはApacheなどのサーバー上でPHPが動けば、ローカルでも実装は可能です。
今回のテストもローカル上(MacPC)で試してみました。

今回は、簡単な実装方法を取り入れるため、[MAMP](https://www.mamp.info/)を使い、
デフォルトのフォルダーに実行ファイルを置いてみました。
必要なファイルとしては、「sitecake」「sitecake.php」が必要となり、こちらから無料で[ダウンロード](http://sitecake.com/download.html)が可能です。

```lang:folder
/htdocs
　├/css
　├/images
　├/js
　├/sitecake　<
　├index.html
　└sitecake.php <
```
HTMLファイルへ編集したいタグの箇所に、魔法の呪文を挿入します。
「class="sc-content"」こちらは、クラス指定で編集したい箇所にのみ入れてください。

これで一通り下準備ができました。
続いて、MAPAを起動します。

全てがデフォルトであれば、「[http://localhost:8888/sitecake.php](http://localhost:8888/sitecake.php)」で接続が可能です。

こちらのファイルへアクセスしたら、「admin」とパスを入力し、編集モードへ移行できます。
こちらが[操作時](https://www.youtube.com/watch?v=Idt1oYXF5N4)の動画となります。

ざっくりとした使用感は、イメージデータなどの再配置やアルバイトで初心者を使ってる方などにちょいイジさせてみたい場合などで活躍するのではないかと思います。

また使い方によっては、顧客の要望などでブログ機能を取り入れてほしいなどでも大いに役立つのではないでしょうか。

如何でしたか。
なお、今後はただの紹介だけではなく、実践を交えた何かも含め、記載してまいります。

それでは、また。
PS3で急にHDMI画面が映らなくなった時の対処法

たまに起こる割に解決法調べるのが毎回手間なのでメモ。

# 症状
- PS3起動時にディスプレイ側もHDMI接続の認識はしている。
- しかし、PS3のメニュー画面は一切表示されない。
- HDMIケーブルを使わず、端子を変えてAV接続にすると映る（解像度は大幅に落ちる）。

# 解決法
予めPS3本体とテレビの電源は切っておくこと。

1. 一度PS3とディスプレイ（テレビ）のコンセントをぬいてHDMIをつなぎなおす。
2. 両方のコンセントを差し、ディスプレイの電源を付ける。その後、PS3の電源を5秒押し続ける。
3. 押した時と5秒後に「ピッ」と鳴るので、2回鳴ったら手を離す。
4. ディスプレイに映る！！
5. HDMI周りの設定画面が出てくるので、改めてOKを押して完了。

## 短縮版
これだけでも改善するケースがある。
あらかじめPS3とテレビの電源を切っておくこと。

1. テレビのコンセントを抜いて刺す。
2. テレビとPS3の電源をつける。

# 備考
電源を5秒押すのは[公式サポート](https://support.jp.playstation.com/app/answers/detail/a_id/298/~/ps3%26reg%3B-%E3%81%A8%E3%83%86%E3%83%AC%E3%83%93%E3%82%92-hdmi-%E3%82%B1%E3%83%BC%E3%83%96%E3%83%AB%E3%81%A7%E6%8E%A5%E7%B6%9A%E3%81%97%E3%81%9F%E3%81%8C%E3%80%81%E6%98%A0%E5%83%8F%E3%81%8C%E5%87%BA%E5%8A%9B%E3%81%95%E3%82%8C%E3%81%BE%E3%81%9B%E3%82%93)にも書いてあるのだが、これ単体では上手く行かないケースがある。
コンセント抜き差しも重要なようだが（多分何らかのリセットが働いている）、技術的にはどう絡んでいるのかよく分かっていない。
とにかく治るもんは治る。
AWSの仮想MFAデバイスを紛失してしまったときの対応

**AWSの仮想MFAデバイスとして利用していたスマートフォンを紛失してしまい、コンソールにログインできなくなってしまったときの対応内容です。**
<ol>
<li>MFAサポートから申請
以下のURLより、サポートを申請します。
https://aws.amazon.com/forms/aws-mfa-support

- Problem with Authentication Device：
紛失なので、「My device was lost, stolen or damaged」を選択。

- Primary Phone Number：
電話番号を入力。この番号に、サポートから電話が掛かってきます。

- Country associated with your phone number
「日本」を選択。
</li>

<li>電話で本人確認（英語）
申請から数分後、サポートから英語で電話が掛かってきて、本人確認を行います。
9割方何を言っているのか分かりませんでしたが……、以下のような対応を行いました。

- AWSアカウントに紐付いているメールアドレスを伝える

- メールに記載されたPIN番号を伝える

>Hello,

>Here is the unique PIN I spoke of on the phone: 1234A

>Best regards,

>Christopher J
>http://aws.amazon.com

電話で伝えたメールアドレス宛てに上記のようなメールが届くので、「1234A」と読み上げます。すると「MFAを解除したからログインしてみてくれ」と言われた気がするので、無事にログインできることを確認して「I can log in to the AWS, thank you!」と言いました。
英語の会話なんてしたことなかったのでかなり四苦八苦しましたが、「Sorry, I don't speak English.」と伝えると「じゃあ、ゆっくり話すね」と丁寧に対応して頂き、何とかなりました。
</li>
UITabBarItemが暗い！UITabBarItemのデフォルト色を変更する方法（swift 2.0)


UIToolBarで実装してたものをUITabBarで実装しなおしたら、なぜか中のボタンが暗くなったので、その対応方法


## UITabBarItemは勝手に色づけされるのが原因
UITabBarItemは選択時にimage tintで指定されている色（デフォルトは青）で表示され、非表示時にはグレーで表示される。
非表示の時の色を指定するプロパティを見つけられなかったので、今回は画像のrenderingオプションを付けることで対応した

## imageWithRenderingMode(UIImageRenderingMode.AlwaysOriginal)で暗くなるのを防ぐ

defaultの画像に `imageWithRenderingMode(UIImageRenderingMode.AlwaysOriginal)` を付与することで、勝手にグレーに色づけされることを防ぐ

```
searchViewController.tabBarItem = 
UITabBarItem.init(
  title: "", 
  image: UIImage.init(named: "default.png")?.imageWithRenderingMode(UIImageRenderingMode.AlwaysOriginal),
  selectedImage: UIImage.init(named: "selected.png")
)
```
Rails(mac OSX / CentOS)でsocketがないよって言われた時のもろもろ

・趣旨〜
rails初心者として環境構築からどハマりしてたんですがどこもdatabase.ymlをいじれと書くばかりなのが多かった（し、自分がハマったのはそこではなかった）ためtipsをこちらに備忘録ついでに書きたいと思います。。。

・対象者〜
$rails new hogehoge -d mysql
とコンソールを叩いてrailsアプリを作ったはいいけどいざscaffoldを組んだりactiverecordを使おうとしたりしたら"Can't connect to local MySQL server through socket '/tmp/mysql.sock'"みたいに優しく諭されてしまった人向け

それでは以下本文です。

まず、ソケットがないよと怒られた時はmysqlサーバが動いていない（というか入っていない）可能性があります。
$ps ax | grep mysqld
でgrep以外のプロセスが走っているかどうかを確認してください。これで走ってなかったらmysqlサーバそのものが動いていないのでいくらactiverecord-mysql2-adapterとかGemfileに設定書き込んでbundleしてもmysqlはウンともスンとも言いません。
逆に言えば
(mac)$sudo brew install mysql
(CentOS)http://qiita.com/yusukaaay/items/20fd649dde9857b46ac5
みたいな感じでmysqlを入れて
$mysql.server start
とか打ち込んでやれば動きます。

上記以外でなぜかソケットがないよ！っていう人はそれこそconfig内のdatabase.ymlの設定間違いだったり、ソケットだけなぜか本当になかったりするんだと思いますので、参考リンクのあたりを読んでいただければと。

書いてみればものすごいアホなことなんですが、ハマっているうちはなかなかわからなかったので、、、

以下、参考リンク

http://totutotu.hatenablog.com/entry/2015/04/06/%E3%80%90Rails%E3%80%91%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB%E3%83%9B%E3%82%B9%E3%83%88%E3%81%A7mysql.sock%E3%81%8C%E3%81%AA%E3%81%84%E3%81%A3%E3%81%A6%E3%82%A8%E3%83%A9%E3%83%BC

http://sawara.me/mysql/2073/

http://www.hi-ho.ne.jp/tsumiki/book_sup2.html

http://qiita.com/hkusu/items/cda3e8461e7a46ecf25d

http://stackoverflow.com/questions/748478/cannot-find-mysql-sock


おまけ

ちなみにこれでちゃんとmysql自体が動くようになっても、そのままscaffoldしてrakeでmigrateしようとするとはねられます。一度mysqlに接続してmigrate先となるdbを作成してからscaffoldするようにしましょう。
IntelliJ IDEA コネタメモ

Eclipse + Mavenばかりだった筆者が、IntelliJ IDEA + Gradleをやってみた時調べたコネタ集です。Windows版です。(適宜更新します。)　自己学習ノートのように書いていきます。

# Gradleプロジェクトで、dependencies を手で追加したとき、その内容をIDEAに反映させる。

右端のメニューから、Gradleを開いてrefreshボタンを押す。

![refresh.gradle.png](https://qiita-image-store.s3.amazonaws.com/0/44538/ea09ca4a-cd22-9b19-abb4-b17ad9aacf39.png)

# フォント変更

1. Ctrl + alt + sを押下 (Settingsの画面を開く)
2. Editor > Colors & Fonts > Font を選ぶ
3. Scheme: の右のsave as をクリックし、新しく作る。名前は適宜設定する。
4. Primay Font に好みのものを設定　Consolas とか

ついでに、
Editor>　General の 
Mouse にある、
Change font size (Zoom) with Ctrl + Mouse Wheel 
にチェックを入れておくと、フォントサイズ変更が楽にできる。

プレゼンで、ライブコーディングする人は使いこなすと便利かも。(大きさを簡単に調整できて)

# importの最適化

Ctrl + Alt + o 

# importの最適化で、ワイルドカード (*をつかったパッケージ全部import) をやらないようにする。

1. Ctrl + alt + sを押下
2. editor > Code Style > Java　のImports タブ　を開く。
3. Class count to use import with "*" に、大きい数を入れておく。

参考
http://stackoverflow.com/questions/3348816/intellij-never-use-wildcard-imports

# 複数ソースを同時に表示

こちら参照
http://huge.mints.ne.jp/08/2013/it_technique/72/

# 別のアプリからペーストしたい

こちら参照
http://meleap124.blogspot.jp/2015/04/intellij-idea.html

# 現在の行の内容を移動させたい。

Ctrl + Shift + カーソルキー上下

Eclipse では　alt + カーソル上下だったもの。複数行選択されている場合の挙動がEclipseと異なるので注意。（IntelliJ はブロック単位で移動？）

# ソースコードの整形

Ctrl + Alt + l 　（エル）

# クラスのアウトライン表示

Ctrl +　F12

# テストケースの自動生成

Ctrl + Shift + T

本当は、テストケースクラスを表示させるコマンドだが、ない場合は新規作成ダイアログが表示される。


# メソッドの呼び出し元の検索

Ctrl + Alt + h



http://tubolabo.hatenablog.com/entry/20120225/1330185960

# ReDo

Ctrl + Shift + z

Ctrl + y ではないので、注意。
キー割り当て変えたい人は、こちらが参考になる？
http://stackoverflow.com/questions/25244475/how-to-configure-intellij-redo-action-for-ctrly-instead-of-ctrlshiftz

# Java => Kotlin へのコード変換 (convert Java file to Kotlin file)

Ctrl + Alt + Shift + k

ファイルの配置場所は変えず、内容とファイルの拡張子(`.java` -> `.kt`)を変更する挙動になる。 コード変換の精度はそこそこ良い。gitとして変更履歴を残したい場合は一工夫要るかも。
テキストファイル内の特定の行以降の文字列をファイル名として、その後ろにフォルダ名を付加したい。

オリジナルのイメージファイルがフォルダ内（仮にorgとします）にあり、そのイメージファイルを分割したイメージファイルが1,2,3というフォルダ内に存在します。
1,2,3のフォルダ内のイメージは全て00000001.tifのようになっています。
ここまでは作成された状態で来るため手を出せない状態です。
イメージ的には下記のような形です。

after配下の1,2,3の各フォルダ内にあるtifファイルを→以降のオリジナルファイル名＋フォルダ名を付与したいです。
オリジナルのファイル名はorgフォルダ内から取得するかinfo.txtの15行目以降にも書かれていました。
Windowsの基本的な環境しか使用できない環境ですのでなんとかバッチファイルで対応したいと考えています。
最初はorgフォルダ内をdir /b でリスト化しようとしましたがうまくいかずお知恵を貸していただきたいです。

　org 
　├ 123456789-0001.tif
　├ 123456789-0002.tif
　├ 123456789-0003.tif
　├ 123456789-0004.tif
　└ 123456789-0005.tif

　after
　　├ 1
　　｜├ 00000001.tif → 123456789-0001-1.tif
　　｜├ 00000002.tif → 123456789-0002-1.tif
　　｜├ 00000003.tif → 123456789-0003-1.tif
　　｜├ 00000004.tif → 123456789-0004-1.tif
　　｜└ 00000005.tif → 123456789-0005-1.tif
　　└ 2
　　｜├ 00000001.tif → 123456789-0001-2.tif
　　｜├ 00000002.tif → 123456789-0002-2.tif
　　｜├ 00000003.tif → 123456789-0003-2.tif
　　｜├ 00000004.tif → 123456789-0004-2.tif
　　｜└ 00000005.tif → 123456789-0005-2.tif
　　└ 3
　　｜├ 00000001.tif → 123456789-0001-3.tif
　　｜├ 00000002.tif → 123456789-0002-3.tif
　　｜├ 00000003.tif → 123456789-0003-3.tif
　　｜├ 00000004.tif → 123456789-0004-3.tif
　　｜└ 00000005.tif → 123456789-0005-3.tif
　　└ info.txt
サーバでローカルホストやローカルエリアにしかアクセスを許可していないWebアプリに、SSH + SOCKSプロキシ経由でアクセスする。Selenium Python + Fabric でちゃちゃっと

セキュリティのため、ローカルホストやローカルネットワークにしかアクセスを許可していない Web アプリってあると思います。

例えば、オフィスで起動している社内サーバ。Jenkinsとか。Wikiとか。サーバ監視ツールとか。
例えば、本番環境で起動している Docker コンテナの中で動いているWebツールとか。

それらに、SSH経由で外からアクセスする方法です。

私の場合は、elasticsearch の head プラグインのWeb管理画面を起動しているのですが、ローカルホストからしかアクセスを許可してませんので、外からアクセスするには一工夫必要です。

そんな時に便利なのが SOCKS プロキシ。

# SOCKS プロキシとは

乱暴にいうと、プロキシ接続先のサーバ上でブラウザを起動したような使用感となります。

ブラウザからのすべてのアクセスは、ポートを限定することなくすべてプロキシサーバ上からのリクエストとなります。

クライアントは Firefox に入ってますし、サーバは OpenSSH に組み込まれていますので、別途ソフトウェアのインストールは不要です。

まじ便利。

# プロキシサーバの準備

OpenSSH から使えますので、ssh クライアントの -D オプションでローカルポートを指定するだけです。

```
$ ssh -D 10080 user@example.com
```

実行すると、普通に SSH クライアントが起動しますが、このクライアントの実行中はローカルの 10080 ポートをリッスンします。

# ブラウザの設定

Firefox の場合、環境設定 →詳細 → ネットワーク → 接続 (プロキシ云々) の「接続設定」から指定します。

![スクリーンショット 2016-01-13 20.52.12.png](https://qiita-image-store.s3.amazonaws.com/0/68302/2dbf022b-fca3-a9a5-0448-514c9393f6f0.png)

SOCKSホストを 127.0.0.1 、ポートを 10080 とすれば、先ほど起動した SSH クライアントが準備したポートを使いますので、これで SSH 接続先からリクエストするようになります。

# 自動でやる

さて、これを毎回オンオフするのはちょっと面倒ですね。簡単に設定する Firefox プラグインなどあるかもしれませんが、私は Selenium からやってます。

Python の場合は

```bash
$ pip install selenium
```

```python
from selenium import webdriver
profile = webdriver.FirefoxProfile()
profile.set_preference('network.proxy.type', 1)
profile.set_preference('network.proxy.socks', '127.0.0.1')
profile.set_preference('network.proxy.socks_port', 10080)
profile.set_preference('network.proxy.no_proxies_on', '')

driver = webdriver.Firefox(firefox_profile=profile)
driver.get('http://example.com')
```

このコードを実行すると、プロキシが設定された Firefox がポコっと起動します。

いつも使っている Firefox とは完全に別設定で起動するため、いつもの設定を壊すことはありません。

(ちなみに、set_preference の引数は、Firefox の `about:config` のキーです。)

※ Firefox を終了させないままいくつも起動すると、mac のドックが Firefox だらけになるので、溜まってきたら

```bash
$ killall firefox-bin
```

でやっつけられます。

# python fabric でやる

python の fabric でデプロイしてる方は、fabric のタスクを作ると便利です。

こんな感じでどうでしょう。

```python
@runs_once
def elasticsearch_head():
    """
    リモートサーバの Elasticsearch head を見る
    """
    from threading import Timer
    from selenium import webdriver

    def open_firefox():
        profile = webdriver.FirefoxProfile()
        profile.set_preference('network.proxy.type', 1)
        profile.set_preference('network.proxy.socks', '127.0.0.1')
        profile.set_preference('network.proxy.socks_port', 10080)
        profile.set_preference('network.proxy.no_proxies_on', '')

        driver = webdriver.Firefox(firefox_profile=profile)
        driver.get('127.0.0.1:9200/_plugin/head/')

    t = Timer(0.5, open_firefox)
    t.start()

    # SOCKS の SSHトンネルを作る
    local('ssh -D 10080 {}@{}'.format(env.user, env.hosts[0]))
```

こう作っておけば

```bash
$ fab develop elasticsearch_head
```

みたいな感じで、Webアプリが見れるわけです。
Haskellで群論の代表的な代数的構造を学ぶための記事を書いた

# Haskellで群論の代表的な代数的構造を学ぶための記事を書いた

　当記事はGitBookで公開しています。

[Haskellでわかる群論の代数的構造](https://www.gitbook.com/book/aiya000/haskell_de_groupstructure/details)

## 趣旨
　Haskellの表現力を用いて、代数的構造の性質と満たすべき法則を示す。

## 範囲
　半群とモノイドと群。

## 例
```haskell
import Test.QuickCheck

-- 半群型クラス
class Semigroup a where
  sappend :: a -> a -> a

-- 半群の満たすべき法則 ( 結合律 )
sgLaw :: (Semigroup a, Eq a) => a -> a -> a -> Bool
sgLaw x y z = (x `sappend` y) `sappend` z == x `sappend` (y `sappend` z)

-- 半群インスタンスの例
instance Semigroup Int where
  sappend = (*)

-- Semigroup Intが半群であることのテスト
sgTest1 :: IO ()
sgTest1 = let sgLaw' = sgLaw :: Int -> Int -> Int -> Bool  -- QuickCheckのために単相化
          in quickCheck sgLaw'
```

## 本音
　最近憂鬱だったので、3連休を有用なものにしたかった…のでざらっと書いてみた。
ちょっと働くの疲れたので誰か助けて。
皆アイシテルウウ。

[Haskellでわかる群論の代数的構造](https://www.gitbook.com/book/aiya000/haskell_de_groupstructure/details)
"ターゲット／アクションパターンデザイン"ってなに？

"ターゲット／アクションパターンデザイン"というキーワードがわからなかったため、備忘録として残しておきます。
内容は引用元の方から写させていただいております。

>ボタンを押したら画面が切り替わるというパターンは多い。

>このとき、押されたボタン自身に画面を切り替える機能を持たせるより、 ボタンにはボタンが押されたという通知だけおこなわせ、 画面の切り替えは通知を受けた側が担当した方が汎用性がある。

>このようなパターンを「ターゲット／アクションパターンデザイン」と呼ぶ。

>![引用画像](https://camo.githubusercontent.com/8c4e31b1f3a436c8e2bc58d3441c9314e76dfea2/68747470733a2f2f7261772e6769746875622e636f6d2f776565642f4f626a6563746976652d432f6d61737465722f3134303330342d2545332538322542462545332538332542432545332538322542312545332538322539392545332538332538332545332538332538382545462542432538462545332538322541322545332538322541462545332538322542372545332538332541372545332538332542332545332538332538462545332538322539412545332538322542462545332538332542432545332538332542332545332538332538362545332538322539392545332538322542352545332538322539392545332538322541342545332538332542332e706e67)

[引用元:weed/Objective-C/wiki](https://github.com/weed/Objective-C/wiki/%E3%82%BF%E3%83%BC%E3%82%B2%E3%83%83%E3%83%88%EF%BC%8F%E3%82%A2%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3)
はじめてのLinux(環境構築)


「プログラミング初心者は早めにLinux(黒い画面)に慣れておけ！！！」みたいな高圧的な記事をインターネットでよく目にするので早速入門してみました。  
  
普段、利用しているWindows,Mac OS XなどにLinux環境を用意するにはいくつか方法があるみたいなのですが、今回は1番簡単そうな方法でLinux環境を構築します。  

## VirtualBoxのインストール  
まず、仮想化ソフトウェアである[Oracle VM VirtualBox](https://www.virtualbox.org/)をダウンロード。`Downloads`からリンクを辿って自分のOS環境に合わせてダウンロードしましょう。  
ダウンロードが終了したらセットアップファイルを起動し画面の指示にしたがって`Next`をクリックでOK。設定はデフォルトでもかまわないと思います。  

##CentOSのイメージファイルのダウンロード  
次はVirtualBoxにCentOSをインストールするためにCentOSのイメージファイル(ISOファイル)をダウンロードします。  
[CentOS](https://www.centos.org/)のトップ`Get CentOS Now`>`DVD ISO`をクリックするとISOイメージを配布しているミラーサイト一覧にたどり着きます。  
英語のページ飛ばされてン...!?となりますがjpドメインがついてるリンクならどれでもいいのでクリックしてISOイメージをダウンロードします。**なお、ISOイメージは約4GBの容量があるので注意してください。**  

##VirtualBoxで仮想マシンを作成  
イメージファイルがダウンロードできたらVirtualBoxを起動します。  
画面上の`新規`で仮想マシンを作成。  
`名前`に任意の名前を入力、`タイプ`Linuxを選択、`バージョン`Red Hat(64bit)を選択。  
`次へ`をクリックし表示される項目を選択しましょう。  
`メモリーサイズ``ファイルの場所とサイズ`ではデフォルトだと少しさみしいので自分のPCスペックに合わせて調節しましょう。  
「起動ディスクの選択」画面にたどり着いたら、フォルダマークみたいなアイコンをクリックして先ほどダウンロードしたISOファイルを指定して`起動`をクリック。  

##CentOSのインストール  
CentOSのインストラーが起動したら一番上の`Install CentOS`をエンターキーで選択。  
ここからマウスカーソルが仮想マシンのウインドウから出せなくなりますがホストキーを入力すれば解決します。  
Windowsは右のCtrlキー、Macは左のCommandキーです。  
続いてインストールの概要画面が表示されたら、「ソフトウェアの選択」、「ネットワークとホスト名」を設定します。  
まず「ソフトウェア選択」をクリック。`サーバー(GUI使用)`>`完了`を選択。  
次に「ネットワークとホスト名」をクリック。`イーサネットをオン`>`完了`を選択。  
以上で設定は終了なので、右下の「インストールの開始」をクリック。  
インストール中に「rootパスワード」、「ユーザーの作成」を行う。  
ここで作成したrootパスワードとユーザーのパスワードは、きちんと覚えておきましょう。  
インストールが完了すると画面右下に`再起動`ボタンが出現するのでクリックして再起動しましょう。  
CentOSが立ち上がったら環境構築完了です。
【CSS3】画面横幅を100%にしたいときに有効な手段

### html5でフロントを作っていて、画面横幅にスクロールバーが出て気持ち悪かったので、対処した方法を自分用にメモ

## 現象
* 手がけている画面の端にマージンが表示されているが、画面幅を収めたい
* 横スクロールバーが表示されている

## 対策
* ルート要素にCSS要素 overflow-x: hiddenを追加する

## 対処コード
```css:front.html

html {
    overflow-x: hidden;
}

```

## 結果
画面幅を100%にすることができ、余計なスクロールバーが出なくなった。

## 備考
http://momdo.github.io/css2/visufx.html#overflow

上記のリファレンスに
>hidden
この値は、コンテンツが切り抜かれ、スクロールなしのユーザーインターフェースが切り抜く要素の外側でコンテンツを閲覧するために提供されるべきであることを指示する。

なので、今回の件ではルート要素に指定してあげることで、要素の外側を切り取って表示してくれるという解釈。
`select` helper に css の class を指定する

Rails の `select` helper を用いて、`select` タグに class `select-content` を指定したい場合があるかと思います。

その場合、例えば下記のように指定したのでは、`select` タグに `select-content` class は当てられません。

```rb
      .some-content-area
        = f.label :some_id, 'Some Id'
        = f.select :some_id, SomeThing.pluck(:name, :id), class: "select-content"
```

何故かと言うと、`select` helper は引数を2つ受け取り、1つ目が `select` helper 自体の option で、2つ目が html option となっているためです。

よって、css の class を当てたい場合は html option に指定してあげる必要があります。
下記に例を記載します。

```rb
      .some-content-area
        = f.label :some_id, 'Some Id'
        = f.select :some_id, SomeThing.pluck(:name, :id), {}, class: "select-content"
```

1つ目の option に `{}` を指定し、2つ目の html option に `class: "select-content"` を指定しています。
こうすることで、`select` helper に css class を当てることができます。


## ref.

* http://api.rubyonrails.org/classes/ActionView/Helpers/FormOptionsHelper.html#method-i-select
* http://stackoverflow.com/a/4081944/4156302
Go言語でのベンチマーク（補足）

## はじめに

https://developers.eure.jp/tech/go-benchmark-evaluation/
弊社の社内ブログでGo言語によるベンチマークを書きましたが、あまり長々書けなかったのでここでフィボナッチ数（goroutine）の補足をします。

ベンチマークの導入やベンチマークの実行コマンドなどは上の記事を是非参照してください。

## リポジトリ

今回のベンチマークで使用したリポジトリは[こちら](https://github.com/eure/go-benchmark)です。

## 書いたフィボナッチ数を求めるコード

### フィボナッチ数とは

```math
F_{n} = F_{n-1} + F_{n-2}\ \ (n \gt 2)\\
F_1 = 1, F_0 = 0
```

で求められる数列です。今回は4つの関数を用意しました。

### For文でループする

```go:FibonacciLoop
// FibonacciLoop returns a fibonacci value.
// The function is using loop to calculate.
func FibonacciLoop(n int) int {
	if n < 2 {
		return n
	}
	f1, f0 := 1, 0
	fn := f1 + f0
	for i := n; i >= 2; i-- {
		fn = f1 + f0
		f1, f0 = fn, f1
	}
	return fn
}
```

再帰式とはなんなのか、そういったものを考えずにFor文でループを回す形式です。
あまり綺麗なコードには見えないですが、実は一番効率が良いです。

### Fibonacciといったら再帰式

```go:FibonacciRecursive
// FibonacciRecursive returns a fibonacci value
// The function is recursively defined to calculate.
func FibonacciRecursive(n int) int {
	if n < 2 {
		return n
	}
	return FibonacciRecursive(n-1) + FibonacciRecursive(n-2)
}
```

すごく簡潔です。とても見やすいですが、関数オーバーヘッドに処理時間を食われている印象。

### 再帰式を並行処理する

goroutineの登場です。

```go:FibonacciRecursiveGoRoutine
// FibonacciRecursiveGoRoutine returns a fibonacci value
// The function is recursively defined with go routine to calculate.
func FibonacciRecursiveGoRoutine(n int) int {
	if n < 2 {
		return n
	}

	chf1, chf0 := make(chan int), make(chan int)

	go func(f chan int) {
		f <- FibonacciRecursive(n - 1)
	}(chf1)
	go func(f chan int) {
		f <- FibonacciRecursive(n - 2)
	}(chf0)

	f1, f0 := <-chf1, <-chf0

	return f1 + f0
}
```

Fibonacciを求めるときに、2つの再帰式を用いるので、それぞれを並行で処理しています。
メモリ確保や無駄な処理が増えているので**遅い**です。


### もっと再帰式を並行処理にしよう

```go:FibonacciRecursiveContinuousGoRoutine
// FibonacciRecursiveContinuousGoRoutine returns a fibonacci value
// The function is recursively defined with go routine continuously
// to calculate.
func FibonacciRecursiveContinuousGoRoutine(n int) int {
	if n < 2 {
		return n
	}

	chf1, chf0 := make(chan int), make(chan int)

	go func(f chan int) {
		f <- FibonacciRecursiveContinuousGoRoutine(n - 1)
	}(chf1)
	go func(f chan int) {
		f <- FibonacciRecursiveContinuousGoRoutine(n - 2)
	}(chf0)

	f1, f0 := <-chf1, <-chf0

	return f1 + f0
}
```

再帰式を呼ぶ度に並行処理として実行しています。
一体、いくつのgoroutineを走らせれば気が済むのか、と言った感じです。そして、かなり**遅い**です。

## 何が言いたかったか

「推測するな、計測せよ」の通り、goroutineを実装して処理を並行化するのが速いとは限らないです。また、正当法な印象の強い再帰式もForループには勝てていません。

フィボナッチ数の計算という例題ではありふれたものですが、実際の実行速度を知らない方も居たでしょうから是非これを良い機会に「推測せず、計測」しましょう。


## `go test -bench . -benchmem` の結果

```
$ go test -bench . -benchmem
PASS
BenchmarkFibonacciLoop                          100000000               12.2 ns/op             0 B/op          0 allocs/op
BenchmarkFibonacciRecursive                      3000000               436 ns/op               0 B/op          0 allocs/op
BenchmarkFibonacciRecursiveGoRoutine             1000000              1815 ns/op             192 B/op          2 allocs/op
BenchmarkFibonacciRecursiveContinuousGoRoutine           10000            130769 ns/op           16896 B/op        176 allocs/op
ok      github.com/eure/go-benchmark/fibonacci  6.255s
```
AJAXのコールバック呼び出し順序

jquery1.8からsuccessとかerrorとかcompleteとかが非推奨となったらしい。
書き方まとめるついでに、呼び出し順をメモ。
こんなajaxの場合。

```js
    $.ajax({ type: 'post',
        url: 'appmigration/test.json',
        data: [{'key': 'hoge'}], // {'name': 'key', 'value': 'hoge'} とも書ける
        dataType: 'json',
        beforeSend: function() {
            alert('before');
        },
        statusCode: {
            200: function() {
                alert('200');
            },
            400: function() {
                alert('400');
            }
        }
    }).done(function(data){
        alert('done');
    }).fail(function(data){
        alert('fail');
    }).always(function(data){
        alert('always');
    });
```

before -> done -> always -> 200となる。
Use delegate in Swift


1 declare a protocol in Class A:

```Swift
protocol ScrollerBarDelegate: NSObjectProtocol {
    func buttonAtIndexPressed(index: NSInteger)
}
```

2  decalre a property member in Class A:

***Warning: There must be a `weak` before the property member!!!otherwise, there will be a retain cycle problem.***

```Swift
weak var delegate  : ScrollerBarDelegate?
```

3 find the place in Class A where you want to trigger the delegate function.

```Swift
// 按钮触发方法
func funcBtnPressed(sender: UIButton) {
        funcIndex = sender.tag - 1991
        self.delegate?.buttonAtIndexPressed(funcIndex!)
    }
```

4 conform to Protocol in Class B.

```Swift
class NewsViewController: UIViewController, ScrollerBarDelegate {
	//
}
```

5 set the object's delegate in Class B:

```Swift
bar!.delegate = self
```

6 complete the function in delegate in Class B:

```Swift
// MARK: - 协议方法
    func buttonAtIndexPressed(index: NSInteger) {
        //
        print(index)
    }
```
Alcatrazのインストール時にmktempで怒られた・・

```
$ curl -fsSL https://raw.githubusercontent.com/supermarin/Alcatraz/deploy/Scripts/install.sh | sh
mktemp: too few X's in template ‘com.mneorr.Alcatraz’
```

Homebrewでcoreutilsをインストールしてたのが原因みたい
参考: [can't install on OS X 10.11.2 and Xcode 7.2](https://github.com/alcatraz/Alcatraz/issues/403)

ということで、`brew uninstall coreutils`で解決
（なんでcoreutilsをHomebrewでインストールしてたのかは覚えてない・・・）
最適化バグですか？ いいえ未定義の挙動です。

最適化なしだと期待通りに動くけど、最適化すると期待と異なる動作する例をいくつか。最適化機能のバグ？ と思いきや、実は未定義の挙動となるパターンを踏んでいるだけという。
どれも有名なものだけど、筆者周囲ではハマる人が相変わらず多いので投稿。

実行例はすべて x86-64 な Linux で行った結果です。

## 符号付き整数をオーバーフローを検出しようと思ったのに

コンパイラ: gcc-4.9.3, clang-3.6.2
最適化オプション: -O2

プログラムの第一引数に `INT_MAX` の値を指定して実行してみましょう。
表示される整数は、 n + 1 < n となっているのに、n + 1 > n のルートを通ります。

```c
#include <stdio.h>
#include <stdlib.h>


int main(int argc, char *argv[])
{
    if(argc <= 1)
    {
        fprintf(stderr, "usage: %s <number>\n", argv[0]);
        return 1;
    }

    int n = strtol(argv[1], NULL, 0);
    if(n + 1 > n)
    {
        printf("%d > %d\n", n + 1, n);
    }
    else
    {
        printf("%d < %d [Overflow!]\n", n + 1, n);
    }

    return 0;
}
```

実行例:
>     $ ./a.out 0x7fffffff
>     -2147483648 > 2147483647

**符号付き整数の演算がオーバーフローした場合の結果は未定義です。**
なお、 `n` の型を `unsigned` にして、第一引数を `UINT_MAX` の値にした場合はオーバーフローが検出されます。(符号なし整数のオーバーフローについては既定があります)

## その参照先、変更したハズでは？

コンパイラ: gcc-4.9.3, clang-3.6.2
最適化オプション: -O2

```c
#include <stdio.h>
#include <stdint.h>
#include <inttypes.h>


void f(uint16_t *x, uint32_t *y)
{
    x[0] = 0x1111;
    x[1] = 0x2222;
    *y = 0x33333333;

    printf("x[0] = %"PRIx16", x[1] = %"PRIx16", *y = %"PRIx32"\n",
            x[0], x[1], *y);
}


int main(int argc, char *argv[])
{
    uint32_t a = 0x55555555;
    f((uint16_t *)&a, &a);
    return 0;
}
```

実行例:
>     $ ./a.out
>     x[0] = 1111, x[1] = 2222, *y = 33333333

`x[0]` と `x[1]`、上書きされて0x3333になったんじゃないの？

**同じ領域を全く異なる型でアクセスするのは未定義です。**
正確に説明するとややこしいけど、大雑把に言うとそんな感じ。「Cは高級アセンブラだ！」とか言ってるとこれにハマること多し。
なお`char`、`signed char`、`unsigned char` でのアクセスは例外的にOK。

## ヌルポで落ちないの？
ちょいと毛色を変えて、あからさまにダメなコードだけど、どのようにダメになるかが斜め上になるパターン。

コンパイラ: clang-3.6.2
最適化オプション: -O2

```c
#include <stdio.h>

int n;
static int *p = NULL;

void f(void)
{
    p = &n;
}

int main(int argc, char *argv[])
{
    n = argc;
    printf("p = %p, *p = %d\n", p, *p);

    return 0;
}
```

実行例:

>     $ ./a.out
>     p = (nil), *p = 1
>     $ echo $?
>     0
>     $ ./a.out a
>     p = (nil), *p = 2
>     $ echo $?
>     0

`NULL` のくせに `n` の内容を表示しつつ正常終了しちゃった。

**ヌルポインターに対するアクセス結果はあくまで未定義です。メモリ保護機能があるOSであってもアクセス違反例外が起こるなんて保証はありません。[^1]**

[^1]: もうちょっと正確に言うと、ヌルポインターに対するアクセスが発生するようなコードをコンパイル・実行した結果が未定義なのであって、本当にヌルポインターに対するアクセスが発生したらしっかりアクセス違反例外が起こるのでその点はご安心を。

## こいつらでハマる例はないかな？

割とやらかすけど、規格を読んでみると未定義。でも実際にハマるパターン (処理系、ソース) が思い付かないもの。何か面白い例はないかな？

 - `void *` と関数ポインタの相互変換。[^2]
 - ひとつの集成体に含まれないふたつのオブジェクトのアドレスの大小比較 [^3]
 - 配列の範囲 (ひとつ後ろを含む) を超えるポインタ加減算。


[^2]: POSIX では、 `void *` → 関数ポインタの変換が特例で認められています。
[^3]: C では未定義ですが、 C++ では未既定です。
Wi-Fiモジュール【ESP8266】でIoTデビュー！(Lチカ編)

## :kobito: 準備するもの
すべて秋月電子で揃えることが出来ました＊
1.  [Wi-Fiモジュール](http://akizukidenshi.com/catalog/g/gK-09758/)
2.  [USBシリアル変換モジュール](http://akizukidenshi.com/catalog/g/gK-01977/)
3. ブレッドボード
4. ジャンパーコード
5. LED(Lチカ確認用)
6. USBケーブル(miniBタイプ)
7. 三端子レギュレータ(3.3V)
8. ArduinoIDE(インストールする)
マイはんだゴテを持っていないので、秋葉原のはんだ付けカフェや高架下のAssemblageではんだ付けをしました。

## :kobito: 手順
1. Wi-Fiモジュールとピンヘッダをハンダ付けする。
2. ブレッドボードにWi-Fiモジュール(ESP8266)とUSBシリアル変換モジュールをさす。
3. USBケーブルでUSBシリアル変換モジュールとPCをつなぐ。
4. USBシリアル変換モジュールのTXDとESP8266のRXDをつなぐ。
5. USBシリアル変換モジュールのRXDとESP8266のTXDをつなぐ。
6. USBシリアル変換モジュールとESP8266のGNDを全てブレッドボードのマイナスにつなぐ。

### :kobito: 書き込みモード(UartDownLoadMode)に入る
1. 手順6のあと、IO2をブレッドボードのプラスにつなぐ。
2. IO0とIO15とRSTをブレッドボードのマイナスにつなぐ。
3. ArduinoIDEを開く。
4. プログラムを書く。
5. 書き込みボタンを押すと同時にRSTとGND(マイナス)を繋いでいるコードをはずす。

### :kobito: :kobito: :kobito: ポイント
私は何度もArduinoIDEからプログラムを書き込むところで引っかかりました。
"書き込みボタンを押すと同時にRSTとGND(マイナス)を繋いでいるコードをはずす。"
という所がとても大切です！！！！！