OmniAICreator/Qiita-1.07M huggingface dataset:
UISearchBarのカスタマイズ

UISearchBarのカスタマイズでいろいろ苦戦したので記録を残しておこうと思います。

## フォントの色を変更する
```objc
# UISearchBarのUITextFieldを取得する
UITextField *searchField = [self.searchBar valueForKey:@"_searchField"];
searchField.textColor = [UIColor whiteColor];
```
UISearchBarにはtintColorというプロパティがありますが、これを設定してもフォントの色は変わりません。
UISearchBarのサブビューのUITextFieldを取得して設定を行います。

## プレースホルダーのフォントの色を変更する
```objc
# UISearchBarのplaceholderを設定
UISearchBar *searchBar = [[UISearchBar alloc] init];
searchBar.placeholder = @"placeholder text";

# UISearchBarのUITextFieldを取得する
UITextField *searchField = [self.searchBar valueForKey:@"_searchField"];
searchField.attributedPlaceholder = [[NSAttributedString alloc] initWithString:searchBar.placeholder attributes:@{NSForegroundColorAttributeName:[UIColor whiteColor]}];
```
プレースホルダーのフォントの色を変更する場合もUITextFieldを取得する必要があります。
initWithString:attributes:のinitWithStringにはプレースホルダーに設定するテキストを指定します。

2箇所にプレースホルダーテキストを設定しているため、initWithString:attributes:だけでいい気もしますが、これだけだとプレースホルダーが表示されません。

## アイコンを変更する
```objc
# 虫眼鏡アイコンを変更
UIImage *searchIcon = [UIImage imageNamed:@"search"];
[self.searchBar setImage:searchIcon forSearchBarIcon:UISearchBarIconSearch state:UIControlStateNormal];

# クリアボタンを変更
searchIcon = [UIImage imageNamed:@"search_remove"];
NSData* searchIconData = [[NSData alloc] initWithData:UIImagePNGRepresentation(searchIcon)];
searchIcon = [[UIImage alloc] initWithData:searchIconData scale:5];
[self.searchBar setImage:searchIcon forSearchBarIcon:UISearchBarIconClear state:UIControlStateNormal];
```
アイコンを変更する場合は、UISearchBarのsetImage:forSearchBarIcon:state:UIControlStateNormalで設定します。
UIImageを作成して、アイコンと状態（highlightとかselectedとか）を選択して設定します。

クリアボタンの設定時にわざわざNSDataに変換してからUIImageに戻すというなんとも無駄そうなことをしていますが、クリアボタンを設定すると下の画像のようにサイズが合いません。
![スクリーンショット-2015-10-10-18.59.09.png](https://qiita-image-store.s3.amazonaws.com/0/60326/f96ac59f-cd95-2dbf-75ae-f38b8c1775d6.png)
そこでinitWithData:scale:を使って画像のscaleを調整することで、丁度良いサイズで表示されるように設定しています。

### 追記
サイズがおかしくなるのはUIControlStateNormalのときだけみたいです。
UIControlStateHighlightedにscaleを変更した画像を設定しても反映されませんでした。
UIControlStateHighlightedにはscaleを変更する前の画像するようにしましょう。

## まとめ
UISearchBarのカスタマイズといってもフォントの色とかアイコンを変更するなどたいしたことではありませんが、思ったよりもサクッとできるようにできていません。UITextFieldを取得するにもプロパティとして定義されていないため、上記のような方法で取得するしかありません。
間違いなどもっと簡単にできるなどありましたら教えていただけるとうれしいです。

### 参考
[UISearchBar Class Reference](https://developer.apple.com/library/ios/documentation/UIKit/Reference/UISearchBar_Class/)
[ UIImage Class Reference](https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIImage_Class/#//apple_ref/c/tdef/UIImageResizingMode)
[UISearchBar change placeholder color](http://stackoverflow.com/questions/11827585/uisearchbar-change-placeholder-color)
スマホの通知を PC で受け取れる PushBullet が便利

こんにちは。エクセルソフトの田淵です。

<blockquote class="twitter-tweet" lang="ja"><p lang="ja" dir="ltr">多分、「通知」の問題が大きいですね。スマホに通知が来るとチラ見してそのまま返信したりしちゃう。その通知分をわざわざPCで見直すの面倒だし。ただ、PCの方が圧倒的に入力が速いので悩ましいです。</p>&mdash; 田淵 義人＠エクセルソフト (@ytabuchi) <a href="https://twitter.com/ytabuchi/status/652702382896254976">2015, 10月 10</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

こんな話をしていたら、[PushBullet](https://www.pushbullet.com) というのが良いよ！と教えていただきまして。
(Windows 10 で Chrome の通知を OS でハンドル出来るか？はちょっと分かりません…)

詳しい使い方とか設定方法は [PushBullet(プッシュバレット)の使い方と設定方法まとめ。ファイル、URL、地図、メモなどあらゆるものをPCからAndroidに送ることができ、Androidの通知をPCにもポップアップ通知できるサービス。](http://androidlover.net/apps/file/pushbullet.html) を見ていただければと思うんですが、通知転送機能を使ってみみたところ大変良さそうでしたのでエントリーに残しておきます。

### Android の通知を Windows に送る

Android の通知を Windows に送信できます。iOS の場合は送付先が Mac だけっぽいのでここでは割愛します。

インストールして起動して、Google アカウントか facebook アカウントでログインすると(インストール時だったかもしれません。すみません。)、**通知をフックするか** の許可を求められます。

<img src="http://cdn-ak.f.st-hatena.com/images/fotolife/y/ytabuchi/20151010/20151010183449.png" width="300" />

(Android はこういう所が自由だから好きです。)

この設定は `設定 > 音と通知 > 通知へのアクセス` (Android 6.0 Marshmallow をインストールした Nexus 5 の場合) にあります。

<img src="http://cdn-ak.f.st-hatena.com/images/fotolife/y/ytabuchi/20151010/20151010184502.png" width="300" />

で、フックを許可したら、アプリ側で **どのアプリの通知をフックするか？** を選択します。

<img src="http://cdn-ak.f.st-hatena.com/images/fotolife/y/ytabuchi/20151010/20151010183413.png" width="300" />

<img src="http://cdn-ak.f.st-hatena.com/images/fotolife/y/ytabuchi/20151010/20151010183422.png" width="300" />

Twitter とか facebook とかだけにして、Inbox/Gmail は通知しないとかも出来ますね。(Android はこういう所が自由だから好きです。)

### iOS 版

iOS 版は `iOS to Mac Notification` ってのがあるのでそれで Mac 側で受け取れるみたい。使ってる方は通知をアプリごとにフィルタ出来るか教えてください。

<img src="http://cdn-ak.f.st-hatena.com/images/fotolife/y/ytabuchi/20151010/20151010190120.png" width="300" />

<img src="http://cdn-ak.f.st-hatena.com/images/fotolife/y/ytabuchi/20151010/20151010190237.png" width="300" />



### Windows の通知はこんな感じ

<img src="http://cdn-ak.f.st-hatena.com/images/fotolife/y/ytabuchi/20151010/20151010184828.png" width="450" />

素晴らしいですね。集中したい時は通知画面の `XXX の通知をミュート` をクリックしてオフにしても良いですし、Chrome の拡張機能の設定画面で `1時間スヌーズ` ってのがありますので、スヌーズしても良いですね。

<img src="http://cdn-ak.f.st-hatena.com/images/fotolife/y/ytabuchi/20151010/20151010185514.png" width="450" />

これでスマホを見る回数が減って、効率よくお仕事ができそうです！

以上です。
Ubuntu 18.04 LTSにKNP, JUMAN, CRF++をインストールする方法

Ubuntu 18.04 LTSにKNP, JUMAN, CRF++をインストールする方法についてまとめてみます。

#必要なパッケージのインストール
2. [checkinstall, ccacheを用いてUbuntuにソフトウェアをインストールする方法 - Qiitaの必要なパッケージのインストール](http://qiita.com/SUZUKI_Masaya/items/bd03f39e20a1a8f7f4f6#%E5%BF%85%E8%A6%81%E3%81%AA%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)に従って、必要なパッケージのインストールを行います。
1. `sudo apt install libcdb-dev libjuman zlib1g-dev libboost-dev`を実行し、必要なパッケージをインストールします。

#JUMANのインストール
APTで提供されているJUMANは、KNPのインストールで必要なファイルが不足しているため、サイトからダウンロードしたものをインストールします。

1. [JUMAN](http://nlp.ist.i.kyoto-u.ac.jp/?JUMAN)(bzip2圧縮)をダウンロードします。
1. 適当なディレクトリに解凍します。
2. [checkinstall, ccacheを用いてUbuntuにソフトウェアをインストールする方法 - Qiitaのソフトウェアのインストール](http://qiita.com/SUZUKI_Masaya/items/bd03f39e20a1a8f7f4f6#%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)に従ってインストールを行います。

#KNPのインストール
5. [KNP](http://nlp.ist.i.kyoto-u.ac.jp/?KNP)(bzip2圧縮)をダウンロードします。
1. 適当なディレクトリに解凍します。
2. [auto-apt, checkinstall, ccacheを用いてUbuntuにソフトウェアをインストールする方法 - Qiitaのソフトウェアのインストール](http://qiita.com/SUZUKI_Masaya/items/bd03f39e20a1a8f7f4f6#%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)に従ってインストールを行います。<br>※途中でかなりの待ち時間が発生しますが、焦らずゆっくりと待ちましょう。

#動作確認
`echo "麻生太郎はコーヒーを買って飲んだ。" | juman | knp -simple -anaphora`を実行し、次のように出力されれば、インストール成功です。

```
# S-ID:1 KNP:KNP:4.16-CF1.1 DATE:2015/11/17 SCORE:-16.31767
* 3D <体言><係:未格>
+ 1D <係:文節内><体言><NE内:PERSON><EID:0>
麻生 あそう 麻生 名詞 6 人名 5 * 0 * 0 "人名:日本:姓:135:0.00166 疑似代表表記 代表表記:麻生/あそう" <NE:PERSON:B>
+ 4D <体言><係:未格><NE:PERSON:麻生太郎><EID:1>
太郎 たろう 太郎 名詞 6 人名 5 * 0 * 0 "人名:日本:名:45:0.00106 疑似代表表記 代表表記:太郎/たろう" <係:未格><NE:PERSON:E>
は は は 助詞 9 副助詞 2 * 0 * 0 NIL
* 3D <体言><係:ヲ格>
+ 4D <体言><係:ヲ格><EID:2>
コーヒー こーひー コーヒー 名詞 6 普通名詞 1 * 0 * 0 "代表表記:珈琲/こーひー カテゴリ:人工物-食べ物 ドメイン:料理・食事" <係:ヲ格>
を を を 助詞 9 格助詞 1 * 0 * 0 NIL
* 3D <用言:動><係:連用>
+ 4D <用言:動><係:連用><EID:3><述語項構造:買う/かう:動2:ガ/O/麻生太郎/1;ヲ/O/コーヒー/2>
買って かって 買う 動詞 2 * 0 子音動詞ワ行 12 タ系連用テ形 14 "代表表記:買う/かう ドメイン:家庭・暮らし;ビジネス 反義:動詞:売る/うる"
* -1D <用言:動><係:文末>
+ -1D <用言:動><係:文末><EID:4><述語項構造:飲む/のむ:動1:ガ/N/麻生太郎/1;ヲ/C/コーヒー/2>
飲んだ のんだ 飲む 動詞 2 * 0 子音動詞マ行 9 タ形 10 "代表表記:飲む/のむ ドメイン:料理・食事"
。 。 。 特殊 1 句点 1 * 0 * 0 NIL
EOS
```

#注意点
`{KNPの解凍先ディレクトリ}/knp-4.16/crf/template` (固有表現抽出モデル学習用テンプレート) はインストールされないので、解凍したディレクトリ(`{KNPの解凍先ディレクトリ}/knp-4.16/`) を消さないようにしてください。

#関連記事
* [KNPでの固有表現抽出モデル生成・テスト - Qiita](http://qiita.com/SUZUKI_Masaya/items/90a00bdc782da30ff0dd)
* [Ubuntu 18.04 LTSにJUMAN++をインストールする方法 - Qiita](http://qiita.com/SUZUKI_Masaya/items/29c81d037cdf7d37b900)
* [Ubuntu 18.04 LTSにKyteaをインストールする方法 - Qiita](http://qiita.com/SUZUKI_Masaya/items/f5c4118bff616d94c230)
* [JUMAN++をPythonから使う - Qiita](http://qiita.com/riverwell/items/7a85ebf95647eaf18a6c)

#参考文献
* [KNP MEMO](http://fvcrc.i.nagoya-u.ac.jp/~sasano/knp/)
* [Ubuntuで足りないファイルがどのパッケージにあるか調べる方法 - 組み込みの人。](http://d.hatena.ne.jp/embedded/20081101/p3)
【Rails・Ruby】 オブジェクト指向


## オブジェクト

 オブジェクトとは、現実世界に存在するあらゆく「もの」や「概念」のことである。  ```
 例）人間 / 車 / クラス など 
```

また、実際にコードに当てはめて考えた場合、以下のuserがオブジェクトとなる。

```
class Test
def index
	user = User.all
	user.find(1)
end
end
```

## クラス
クラスとは、共通の性質を併せ持つオブジェクトをまとめた抽象概念である。

```
 例）
 オブジェクト : Aさん / Bさん
 クラス : 3年4組 / 男性 / 運動部
```

また、railsの場合、以下classで定義されている全体がクラスということになる。

```
class Test
def class_test
end	
end
```


## クラスメソッド
クラスに直接働きかけるメソッドのこと。また、 class << クラス名 or self　で括った中のものがクラスメソッドとなり、それ以外はすべてインスタンスメソッド扱いになる。
 
```
class << self
def class_test
end
end
```

## インスタンス
クラスを型とした場合、インスタンスはその実際の値であったり、データのことを指す。例えば、クラスのインスタンスはオブジェクトである。


## インスタンスメソッド
インスタンスに働きかけるメソッド
以下の場合、配列のインスタンスに対してindexメソッドを働かせている

```
['1','2','3'].index(1)
```


## インスタンス変数
- クラスから生成されるオブジェクトごとに固有のものである。

```
class Test
def new
	@test = Test.new
end
end
```

## レシーバ
 あるオブジェクトに対して、メソッドを実行しようとした場合、そのメソッドの働きかけるオブジェクトのことをレシーバという。以下のコードの場合だと、配列部分がレシーバとなる。

``` 
['1','2','3'].index(1)
```

## self
- メソッドを実行したときに、そのメソッドを実行しているオブジェクトを参照することができる。
- レシーバとの違いは、レシーバはメソッドの働きかける先のオブジェクトの呼び方で、selfは働きかける先のオブジェクトに実際にコード上で参照することである。
- メソッドを呼び出したとき、すべてのインスタンス変数は、selfのインスタンス変数となる。また、selfを明示せずメソッドを呼び出した場合、すべてselfに対するメソッドになるし、レシーバを他のオブジェクトを指定して、呼び出した場合、そのオブジェクトのメソッドとなる。

```例1
class Test < ActiveRecord::Base
def class_test
end
# class_testはインスタンスメソッド
	
def self.class_test
end
# self.class_testはクラスメソッド
end
```

```例2
class Test < ActiveRecord::Base
def class_test
end
# インスタンスメソッド
	
def self.class_test
end
# クラスメソッド
	
def test
	self.class_test
	# インスタンスメソッドのclass_testが呼び出される
	class_test
	# インスタンスメソッドのclass_testが呼び出される
	self.class.class_test
	# クラスメソッドのclass_testが呼び出される
end
end
```

〜例3のcontrollerと例4のmodelの関係が対応している時〜

```例3
class Test < AppricationController
def index
	@instance_test = Text.class_method(test_id)
end
end
```

```例4
class Text < ActiveRecord::Base
def self.class_method(test_id)
	where(id: test_id)
end
end
```
上記のようにcontroller内のコードを仮にmodelに分割した場合、model内のclass_methodはクラスメソッドになるので、Testクラスのメソッドという扱いになる。よって、controller側で使用したい場合は、クラスを指定したうえ（今回だと、Test）で、メソッド名を書くことで（class_method）動かすことができる。

## private関数
-  privateメソッドを呼び出す時は、レシーバを指定することができない
- 自分（self）以外のオブジェクトのメソッドを呼び出すときには、オブジェクトをレシーバとして明示する必要がある

```
class Test
def new
	self.private_test
end

private
	 
	def private_test
		p 'private test is success!!'
	end
end
```

上記のような場合は、private関数内のメソッドを呼び出すことはできない。
Oracle Certified Java Programmer, Gold SE 7の勉強のためのクラス図

Oracle Certified Java Programmer, Gold SE 7　の勉強をするときに作成したクラス図です。

ちなみに、もうSE 8 の試験が始まっているため、今SE 7 を受ける必要はありません。
私はまだSE 8を触れていないので、SE 7 を受けています。


この資料は私が必要と感じた継承関係などをまとめた資料になります。
そのため、記載されていないクラスが出題される可能性もあります。


クラス図の作成はAstahで行いました。

# コレクション
![collection.png](https://qiita-image-store.s3.amazonaws.com/0/84075/fe868987-5f4c-9dc3-b3e5-11c75ca1a738.png)



# 例外関係
![thowable.png](https://qiita-image-store.s3.amazonaws.com/0/84075/03a23d2e-fb33-6126-57c7-75d6cdd1240a.png)
技術英語 > If I'm interpreting his data correctly, ...

@ Stat Trek Voyager > CATHEXIS

調査について報告しているトム・パリスが

> If I'm interpreting his data correctly, ...

<hr>
correctly関連で思い出すのは以下

http://qiita.com/7of9/items/73d455a31e60fd763d98
> I would like to make sure if I understand you correctly.

<hr>
Mac の Postfix で「Domain of sender address does not resolve」→ myhostname 設定しろ

Mac の Postfix でメールを送りたくて SMTP サーバーの設定をしていて、いざ送るぞというときに、 `/var/log/mail.log` に下記のような感じで出ていました。

```
Oct 10 17:58:45 machine postfix/smtp[12994]: E3DD1EECDA: to=<youcune@me.com>, relay=host[addr]:port, delay=1069, delays=1061/0.08/1.3/6.5, dsn=4.1.8, status=deferred (host host[addr] said: 451 4.1.8 Domain of sender address user@machine.local does not resolve (in reply to MAIL FROM command))
```

From に指定されている「xxx.local」が解決できないのが原因ぽいです。 Mac の `mail` コマンドは From がコマンドからは指定できなさげなので、

```bash
$ sudo vi /etc/postfix/main.cf
```

して

```
myhostname = youcube.jp
```

のように解決できるホスト名にしたところメールが送れるようになりました。
El Capitanでbold指定のフォントが太い

##現象
El Capitanにアップデートすると、`font-weight:bold`に指定されたフォントが太くなる。本来これは正しい挙動であるということを最初に断っておく。
ここでは、その原因と解決方法を記す。

YosemiteまではW6で表示されていたが、El CapitanになってW7となった。
![ヒラギノ角ゴW6/W7](https://qiita-image-store.s3.amazonaws.com/0/38428/2cc471fd-a5a5-837a-57ef-68179cf25043.png)

日本のウェブサイトではあまり無いが、GitHubなど海外サービスを使っているとよくこの現象に遭遇する。これはCSSの指定の違いによる。日本では

```css
font-family: Verdana, "Hiragino Kaku Gothic ProN", Meiryo, sans-serif;
```
などという設定が多く、W7が含まれていない「ヒラギノ角ゴ ProN」が指定されている[^1]。一方で、海外サービスなどは

```css:
font-family: Helvetica, Arial, sans-serif;
```
としか指定されておらず、Macでは自動的に「ヒラギノ角ゴ」が表示されるようになっている。

##原因
El Capitanになって「ヒラギノ角ゴシック」がW0からW9まで搭載されたため。（今まではW3とW6のみ）

`font-weight: bold`についての説明を[MDN](https://developer.mozilla.org/ja/docs/Web/CSS/font-weight)から引用する。
> **bold**
> 太字での表示となります。700 に相当します。殆どのブラウザで見出しタグや strong 要素などのデフォルトスタイルとしてこの値が指定されています。

ここにあるように、`font-weight: bold`に指定された文字はウェイト700のフォントで表示される。Yosemiteまではウェイト700（=W7）の「ヒラギノ角ゴ」が搭載されていなかったため、W6のフォントが表示されていた。

##解決方法
正しい挙動であることはわかっていても、慣れとは怖いものでつい違和感を感じてしまう。ここでは、W7で表示された`font-weight: bold`指定のフォントを、W6に置き換える方法を紹介する。

使うのは以下の二つ。他のブラウザでも、CSSを置き換える拡張機能があればOK。
- Google Chrome
- [Stylish](https://chrome.google.com/webstore/detail/stylish/fjnbnpbmkenffdnngjfgmeleoegfcffe)

手順は
1. Stylishの設定画面を開く
2. 以下のコードを貼り付けて保存

```css:hiragino.css
@font-face {
    font-family: sans-serif;
    src: local(HiraginoSans-W3);
    font-weight: normal;
}
@font-face {
    font-family: sans-serif;
    src: local(HiraginoSans-W6);
    font-weight: bold;
}
```
必要に応じて設定は変えてください。

##注釈
[^1]:「ヒラギノ角ゴシック」と「ヒラギノ角ゴシック ProN」は区別される。El Capitanでこの二つは共存している。

##参考
[font-weight - CSS | MDN](https://developer.mozilla.org/ja/docs/Web/CSS/font-weight)
[CSSでヒラギノ角ゴシックのウェイトを指定する方法 - M59のブログ](http://mandel59.hateblo.jp/entry/2015/10/03/205229)
[Elixir+Phoenix]FullCalendarを使ってカレンダーを表示する

# Goal
Phoenix-Framework上でFullCalendar(js)を動作させる。  

# Dev-Environment
OS: Windows8.1
Erlang: Eshell V7.1, OTP-Version 18.1
Elixir: v1.1.1
Phoenix Framework: v1.0.3
PostgreSQL: postgres (PostgreSQL) 9.4.4
FullCalendar: v2.4.0

# Wait a minute
FullCalendar(js)を使って、カレンダーを表示してみます。  

# Index
FullCalendar with Phoenix-Framework
|> Before you start
|> Placement of files
|> Let's run!!

## Before you start
プロジェクトの準備とFullCalendarのダウンロードを行います。  

プロジェクトの準備。  

Example:

```cmd
>cd path/to/create/project
>mix phoenix.new full_calendar_sample
>cd full_calendar_sample
>mix ecto.create
>mix phoenix.server
Ctrl+C
```

FullCalendarのダウンロード。  

以下の公式サイトよりダウンロードして下さい。
FullCalendar Download: [http://fullcalendar.io/download/](http://fullcalendar.io/download/)

私がダウンロードしたのは、v2.4.0です。  

## Placement of files
FullCalendarのファイルをPhoenix-Frameworkへ配置します。  

配置するファイルは5つです。  

- fullcalendar-2.4.0/fullcalendar.js
- fullcalendar-2.4.0/fullcalendar.min.css
- fullcalendar-2.4.0/lib/jquery.min.js
- fullcalendar-2.4.0/lib/moment.min.js
- fullcalendar-2.4.0/lang/ja.js (任意、日本語表示したい場合)

プロジェクトに以下のように配置して下さい。  

Example:

```txt
full_calendar_sample
|
priv
  |
  static
    |
    |-css
    |  |-fullcalendar.min.css
    |
    |-js
       |-fullcalendar.js
       |-jquery.min.js
       |-moment.min.js
       |-ja.js (任意、日本語表示したい場合)
```

これで配置完了です。  

## Let's run!!
お待ちかねのカレンダーを出してみましょう。  

cssとjsの読み込みをレイアウトテンプレートで行います。  

web/templates/layout/app.html.eex

```html
<!DOCTYPE html>
<html lang="en">
  <head>
    ...
    <link rel="stylesheet" href="<%= static_path(@conn, "/css/fullcalendar.min.css") %>">

    <script src="<%= static_path(@conn, "/js/jquery.min.js") %>"></script>
    <script src="<%= static_path(@conn, "/js/moment.min.js") %>"></script>
    <script src="<%= static_path(@conn, "/js/fullcalendar.js") %>"></script>
    <script src="<%= static_path(@conn, "/js/ja.js") %>"></script>
  </head>

  ...
</html>
```

デフォルトで配置されているindexテンプレートを以下のように変更します。  

web/templates/page/index.html.eex

```html
<script language="JavaScript">
$(document).ready(function() {
  $('#calendar').fullCalendar({

  });
});
</script>

<div id="calendar"></div>
```

基本的な使い方は公式サイトのUsageを見て下さい。  
参考: [http://fullcalendar.io/docs/usage/](http://fullcalendar.io/docs/usage/)  

試しにカレンダーでイベント(予定)を表示してみます。  

web/templates/page/index.html.eex

```html
<script language="JavaScript">
$(document).ready(function() {
  $('#calendar').fullCalendar({
    events: [
        {
          title: 'サンプル1',
          start: '2015-10-15'
        },
        {
          title: 'サンプル2',
          start: '2015-10-16',
          end: '2015-10-18'
        },
        {
          title: 'サンプル3',
          start: '2015-10-18',
          url: "http://www.google.co.jp"
        },
        {
          title: 'サンプル4',
          start: '2015-10-01',
          end: '2015-10-07'
        }
      ]
  });
});
</script>

<div id="calendar"></div>
```

# Speaking to oneself
割かし簡単に動いた。  
取り急ぎ最初の使い方まで。  

# Bibliography
[FullCalendar](http://fullcalendar.io/)
dockerでnginx + apache2 + wildflyの環境構築手順

# 概要
以前、[ubuntuにnginx + apache2 + wildflyの環境構築手順](http://qiita.com/sat8bit/items/0014b529abd04b474a37)を書いたが、あまりに面倒なので色々調べてたらdockerでインストールできることがわかったのでやってみる手順。

## 構成
```
./
|- wildfly-app/
|  |- Dockerfile
|  `- wildfly-app.war
|
|- nginx/
|  |- Dockerfile
|  `- wildfly-app.local.conf
`- apache2/
```

## dockerのインストール
割愛

## wildfly-appの設定と起動
Dockerfileは以下。

```bash:wildfly-app/Dockerfile
# jboss/wildflyをインストール
FROM jboss/wildfly

# アプリケーションファイルを追加
ADD wildfly-app.war /opt/jboss/wildfly/standalone/deployments/
```

以下が実行するコマンド。

```bash
## 移動
$ cd wildfly-app

## build. イメージ名は sat8bit/wildfly-app
$ docker build -t sat8bit/wildfly-app

## run. コンテナ名は wildfly-app.local
$ docker run -d -it --name wildfly-app.local sat8bit/wildfly-app
```

ここまでで、`wildfly-app.local` という名前がついた docker の container で wildfly が立ち上がった。

## nginxの設定と起動

```nginx:nginx/wildfly-app.local.conf
server {
    # master.application.domainへのアクセスの設定
    server_name master.application.domain;
    location / {
        # アプリケーションを起動したdockerで設定したnameをホスト名に設定する
        proxy_pass http://wildfly-app.local:8080/;
    }
}
```

```bash:nginx/Dockerfile
# nginxをインストール
FROM nginx

# 設定ファイルを追加
ADD wildfly-app.local.conf /etc/nginx/conf.d/
```

以下が実行するコマンド。

```bash
## 移動
$ cd nginx

## build. イメージ名は sat8bit/nginx
$ docker build -t sat8bit/nginx

## run.
### --link で同じdocker上で動いている別のコンテナに紐付ける
### -p でホストOSの80番ポートをこのcontainerの80番に繋ぐ
$ docker run -d -it --link wildfly-app.local:wildfly-app.local -p 80:80 sat8bit/nginx
```

これで、ホストOSの80番からnginxの80番ポートに繋がり、nginxの設定でwildfly-app.localの8080にproxyされる構成ができた。

## apache2

apache2のコンテナ作って、それ用のnginxのconfファイルを追加してあげればapache2の方もできそう。

## その他

dockerの操作を適当にメモする。

```bash
# 動いているコンテナを知りたい場合は
docker ps

# 動いてないコンテナも含める場合は
docker ps -a

# イメージを見る場合は
docker images

# 名前がついていないイメージも全部見る場合は
docker images -a

# 動いているコンテナを止める場合は docker psからコンテナIDを取得して
docker stop <CONTAINER_ID>

# コンテナを削除するには、コンテナを止めたあとに
docker rm <CONTAINER_ID>

# イメージを削除する場合は、docker imagesからイメージIDを取得して
docker rmi <IMAGE_ID>
```
Amazon ECSでオートスケールを実装する


# はじめに
[クラスメソッドさんの記事](http://dev.classmethod.jp/cloud/ecs-integrate-autoscaling-by-lambda/)を参考にAmazon ECSでオートスケールを実装する。
この記事の通りに設定していけば問題はないが，1点サービスを相対的に+1/-1しかできない部分を改善した。

# SNSで送られてくるメッセージの確認
実際に送られくるSNSを確認するためにログに出力（```console.log(event.Records[0].Sns);```）すると以下の情報が送られてきていることがわかる。

```
{ Type: 'Notification', MessageId: 'XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX', TopicArn: 'arn:aws:sns:ap-northeast-1:XXXXXXXXXXXX:test', Subject: 'Auto Scaling: launch', Message: '{"StatusCode":"InProgress","Service":"AWS Auto Scaling","AutoScalingGroupName":"EC2ContainerService-default-XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX-EcsInstanceAsg-XXXXXXXXXXXX","Description":"Launching a new EC2 instance: i-XXXXXXXX","ActivityId":"XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX","Event":"autoscaling:EC2_INSTANCE_LAUNCH","Details":{"Availability Zone":"ap-northeast-1a","Subnet ID":"subnet-XXXXXXXX"},"AutoScalingGroupARN":"arn:aws:autoscaling:ap-northeast-1:XXXXXXXXXXXX:autoScalingGroup: XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX:autoScalingGroupName/EC2ContainerService-default-XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX-EcsInstanceAsg-XXXXXXXXXXXX","Progress":50,"Time":"2015-10-10T03:31:23.470Z","AccountId":"XXXXXXXXXXXX","RequestId":"XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX","StatusMessage":"","EndTime":"2015-10-10T03:31:23.470Z","EC2InstanceId":"i-5cb264f9","StartTime":"2015-10-10T03:30:20.410Z","Cause":"At 2015-10-10T03:29:53Z a user request executed policy scale-out changing the desired capacity from 2 to 4. At 2015-10-10T03:30:18Z an instance was started in response to a difference between desired and actual capacity, increasing the capacity from 2 to 4."}', Timestamp: '2015-10-10T03:31:23.503Z', SignatureVersion: '1', Signature: 'XXXXXXXXXXXX', SigningCertUrl: 'https://sns.ap-northeast-1.amazonaws.com/XXXXXXXXXXXX.pem', UnsubscribeUrl: 'https://sns.ap-northeast-1.amazonaws.com/?Action=Unsubscribe&SubscriptionArn=arn:aws:sns:ap-northeast-1:XXXXXXXXXXXX:test:XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX', MessageAttributes: {} }
```
記事ではSNSのSubjectに含まれる launch/termination を検出してそれぞれ +1/-1 を行なってた。
ここで本文であるMassageに注目するとJSONになっていてわかり辛いが以下のように書かれている。

```
"Cause":"At 2015-10-10T03:29:53Z a user request executed policy scale-out changing the desired capacity from 2 to 4. At 2015-10-10T03:30:18Z an instance was started in response to a difference between desired and actual capacity, increasing the capacity from 2 to 4."
```

このメッセージからAuto Scaling後のcapacityを知ることができそうだ。前半はdesired capacityで後半が実際のcapacityになっているように読める。

# Capacityの取得
SNSの本文にcapacityが記載されていることがわかったので正規表現を使ってcapacityを取得する。

```javascript
var matches = JSON.parse(event.Records[0].Sns.Message).Cause.match(/the capacity from (\d+) to (\d+)./);
  
var currentCapacity = parseInt(matches[1]);
var desiredCapacity = parseInt(matches[2]);
```

capacityが取得できたのでこれをECSのServiceのdesiredCountにすればよい。
コードの全体は[クラスメソッドさんの記事](http://dev.classmethod.jp/cloud/ecs-integrate-autoscaling-by-lambda/)にあるので割愛。

# まとめ
SNSの本文からAuto ScalingのCapacityが取得できることがわかったので，これをECSのServiceのdesiredCountすることでAuto ScalingとServiceを連動できるようにした。
この方法はクラスタ内の80%でServiceを起動するなどの応用もできると思う。
仕事で使えるGitHub絵文字の使用例

絵文字はチームのコミュニケーションを円滑にしてくれます。自分がよく使う絵文字を書いてみます。

# レビュー

## レビュー依頼
お願いします! :pray: 

## レビュー立候補
レビューします! :raising_hand: 
確認します! :eyes: 
確認します!(やや上から目線w) :smoking: :trollface: 

## 褒める
すばらしい! :+1: 
問題ないです! :ok_woman: 
OKです! :ok_hand: 
おめでとう! :tada: :congratulations: 
速くなりましたね! :bullettrain_side: 

## どや感 :muscle: 
直したらできました! :muscle: 

## お礼 :bow:
ご対応ありがとうございました。:bow:

# バグ
動かない :scream: 
バグ発見しました :astonished: 
落ちました :tired_face: 
何もしていないのに落ちるようになりました :innocent: 

# お金
昇給きたあああああ! :moneybag: :chart_with_upwards_trend: 

#トイレ
トイレで遅れます :poop: :sweat_drops: 

# 退勤
お先に失礼します! :running: 
お疲れ様でした! :wave:
git コミットログの書き換え


### コミットログの書き換え

```bash
git commit --amend
```

revision が書き換わるので注意。
```
  commit 7825f0fa9e89704be8859442a6590c89672019a2
  aaa
  commit 439cff3d94444685579e2e0b6a9fd8325ce4f3f7
  bbb
```

### コミットの所有者（メールアドレス）と日付の書き換え

```bash
git commit --amend --reset-author
```
### コミットログのまとめ

```bash
git rebase -i HEAD~
```
して、エディタでまとめたいコミットを fixup or squash を選択

fixup はコミットログを削除
squash はログを書き換えられる

### autosquash

コミットログの先頭に fixup! または squash! をつけておき、まとめたいコミットと
同じコミットログをかいておく。

```bash
git rebase -i HEAD~ --autosquash
```

で、コミット選択画面で自動的に squash または fixed を指定できる

```bash
git config --global --add rebase.autosquash true
```

で、`rebase -i` のときに自動的に `--autosquash` をつけてくれる。

なお、コミットするときに `--fixup` または `--squash`をつけると対象のコミットのメッセージをコピー＋先頭に fixup! または squash! をつけてくれる。

直前のコミットとまとめたいのならば

```
$ git commit --fixup=HEAD
$ git rebase -i HEAD~ --autosquash
```
アプリをアップロードしたらPotential Loss of Keychain Access


# アプリをアップロードしたらPotential Loss of Keychain Access

## 起きた現象

新バージョンのアプリをアーカイブして、Xcode 7.0.1のオーガナイザからUpload to App Store...でアップロードしたら、Potential Loss of Keychain Accessという警告が出るようになってしまいました。

## 原因のようなもの

アップロードするときのProvisioning Profileの指定が、今まではアプリごとのストア用プロビジョニング(XC:アプリバンドル名 とか)だったはずのところが、いつの間にか XC:* というワイルドカードIDのプロビジョニングが指定されてしまうようになっていました。

さらに、XC:アプリバンドル名 に紐づいているApp IDのプレフィックスと、XC:* に紐づいているXcode iOS Wildcard App IDという名前のApp IDのプレフィックスが異なっていました。

何かの拍子に意図していないプロビジョニングが指定されるようになってしまい、そのプロビジョニングのプレフィックスも意図したものと異なるために、Potential Loss of Keychain Accessが出るということのようです。

## 自己解決できた

1. デベロッパーサイトのCertificates, Identifiers & Profilesでの作業
  - Xcode iOS Wildcard App IDを削除しました。
  - Xcode iOS Wildcard App IDに紐づいているプロビジョニングを全て削除しました。
2. Xcodeの環境設定での作業
  - Accountsから辿って行ってディスク上のプロビジョニングファイルを全て削除しました。
  - プロビジョニングファイルをダウンロードし直しました。
3. Xcodeのプロジェクトでの作業
  - プロジェクト設定のTermの値がエラーになるので、Fix Issueします。
4. デベロッパーサイトのCertificates, Identifiers & Profilesで確認
  - 新しいXcode iOS Wildcard App IDが生成されていました。
  - 新しいXcode iOS Wildcard App IDに紐づいているプロビジョニングも生成されていました。
  - Xcode iOS Wildcard App IDのプレフィックスが他のApp IDと同じになっていました。
5. Xcodeのプロジェクトでの作業
  - Buildの値を更新しました。(忘れるとアップロードでエラーになります)
  - 改めてアーカイブしました。
6. Xcodeのオーガナイザでの作業
  - 新しいアーカイブをアップロードすると今度は警告を受けずに完了しました。

## なんだったのか

使っている人が気付かない何かよくない環境かタイミングの時にXcodeのApp IDとプロビジョニングの自動作成が実行されてしまった、ということらしいです。謎。

以上です。
再帰的にtar.gzを展開する

誰だ tar.gz の中に tar.gz を格納した奴。

```bash
#!/bin/sh

set -eu

isTarGz() {
    # tar.gz 形式のファイルパスだけを透過するフィルタ
    if [ ! -p /dev/stdin ]; then
        echo -n ''
        return 0
    fi

    cat - | while read line; do
        if [ -f $line ]; then
            if [[ $line =~ tar.gz$ ]]; then
                echo $line
            fi
        fi
    done
    return 0
}
isNotTarGz() {
    # tar.gz 形式のファイルパスだけを透過しないフィルタ
    if [ ! -p /dev/stdin ]; then
        echo -n ''
        return 0
    fi

    cat - | while read line; do
        if [ -f $line ]; then
            if [[ $line =~ tar.gz$ ]]; then
                :
            else
                echo $line
            fi
        else
            echo $line
        fi
    done
    return 0
}
isNotDirectory() {
    # ディレクトリパスだけを透過しないフィルタ
    if [ ! -p /dev/stdin ]; then
        echo -n ''
        return 0
    fi

    cat - | while read line; do
        if [ ! -d $line ]; then
            echo $line
        fi
    done
    return 0
}
cleanUp() {
    # 一時ファイルを削除する
    rm $items $targz $buffer
}

items=$(mktemp)
targz=$(mktemp)
buffer=$(mktemp)

trap 'cleanUp; exit 1' 1 2 3 15

tar xvzf $1 > $buffer
cat $buffer | isTarGz > $targz
cat $buffer | isNotTarGz > $items
echo -n '' > $buffer

while [ -s $targz ]; do
    cat $targz | while read line; do
        dir=$(dirname $line)
        tar xvzf $line -C $dir | xargs -I@ echo $dir/@ >> $buffer

        # tar.gz から出てきた tar.gz は削除する
        rm $line
    done
    cat $buffer | isTarGz > $targz
    cat $buffer | isNotTarGz >> $items
    echo -n '' > $buffer
done

# 結果を標準出力に流す
cat $items | sort -u | isNotDirectory

cleanUp
```
PHPでオブジェクトを連想配列に変換するのはarrayキャストが速い

PHPでオブジェクトを連想配列に変換させるのは

```php
$array = json_decode(json_encode($object), true);
```

こんなふうに`json_decode()`と`json_encode()`を駆使してたのですが、arrayでキャストする方法を(今更ながら)知りました。

で、ついでだからjson関数で変換する方法とarrayキャストする方法で速度比較を行ってみました。

```php:cast.php
<?php

class hoge {
	public $prop0 = 0;
	public $prop1 = 'value1';
}

for ($i = 0; $i < 1000000; $i++) {
	$object = new hoge();
	$array = (array)$object;
	$value = $array['prop0'];
}
```

```php:json.php
<?php

class hoge {
	public $prop0 = 0;
	public $prop1 = 'value1';
}

for ($i = 0; $i < 1000000; $i++) {
	$object = new hoge();
	$array = json_decode(json_encode($object), true);
	$value = $array['prop0'];
}
```
このように`hoge`クラスをnewしたあとにarrayでキャストするcast.php、`json_decode()`と`json_encode()`で変換するjson.phpを用意して、timeコマンドで実行時間を計ってみました。以下結果。

```shell-session
$ time php cast.php
php cast.php  0.57s user 0.01s system 99% cpu 0.583 total
```
```shell-session
$ time php json.php
php json.php  2.72s user 0.02s system 99% cpu 2.740 total
```

当たり前ですけれど、関数を2つ使うjson.phpのほうが圧倒的に遅いですね。
nginx で cookie の値に応じて処理

民間にできることは民間で、フロントエンドに出来ることはフロントエンドで。

cookie の `hoge` に fuga という値があった場合は別のページに飛ばす

```nginx
if ($cookie_hoge = 'fuga') {
    return 301 /another_page_url;
}
```

hoge になんかの値が入ってるときは別のページに飛ばす

```nginx
if ($cookie_hoge != '') {
    return 301 /another_page_url;
}
```

nginx の if 文は驚くほど機能が少ない (and も else もない) ので大したことは出来ないが、バックエンドの負荷を減らすことは出来そう。
Heroku コマンド・設定 メモメモ

Herokuに入門してみたもののHerokuのコマンドというのがよくわからず、しかもたまにしか使わないためにほとんど覚えないというジレンマがあります(☝ ՞ਊ ՞)

![寿司ゆき:faint](https://d1zd1v0cxnbx2w.cloudfront.net/images/sets/sushiyuki/76.png) 

# ログインとログアウト

```bash:ログイン
heroku login
Enter your Heroku credentials.
Email: メールアドレス
Password (typing will be hidden): 
Authentication successful.
```

```bash:ログアウト
heroku logout
Local credentials cleared.
```

# アプリケーションをブラウザで確認

```bash:ブラウザで開く
heroku open
```

# ログの確認

```bash:ログ確認
heroku logs
```
リアルタイムで見たいときは`--tail`を付けるのですが、`-t`でも同じです。

```bash:ログ確認（リアルタイム）
heroku logs -t

or 

heroku logs --tail
```
ただ、Railsの初期設定ですとHerokuでエラーログがあまり出力されません。

```bash:少ないログ情報
2015-10-22T10:26:47.269081+00:00 heroku[router]: at=info method=GET path="/events/new" host=pugiemonn.com request_id=71c60a15-0d60-4449-a63b-e8ab4483e4f4 fwd="118.243.227.82" dyno=web.1 connect=1ms service=57ms status=500 bytes=1754
```
これにはGemfileに`gem 'rails_12factor'`と書いてデプロイすれば良いようです。

# ステータス確認

```bash:アプリステータス確認
heroku ps
```

# Postgresにログイン
herokuのデータベースはPostgresです。SQLなどでデータベースの中身を見たい場合は`pg:psql`コマンドを使用します。

```bash:Postgresにログイン
heroku pg:psql
```

ただしローカルにpsqlがインストールされていないといけないです。
PostgreSQLをSQLから使うときは、[PostgreSQLとMySQLの基本的なコマンドを比較](http://qiita.com/pugiemonn/items/75870ece3c8476bcb1c8) を参考にします。

# コマンドを実行
Heroku上でコマンドを実行するには`heroku run`を使用します。

```bash:コマンドを実行
heroku run "コマンド"
```

```bash:lsコマンド実行例
heroku run "ls" --app pugiemonn
Running `ls` attached to terminal... up, run.4839
app  bin  config  config.ru  db  Gemfile  Gemfile.lock	lib  log  public  Rakefile  README.md  README.rdoc  spec  tmp  vendor
```

## Rails console の実行例

```bash:console
heroku run rails c
```


## rakeコマンドの実行例

```bash:rakeコマンドを実行
heroku run bundle exec rake db:migrate
```

# 環境変数

```bash:環境変数の確認
heroku config
```

## 環境変数の追加
```bash:環境変数の追加
heroku config:set PASSWORD=hogepiyopassword
```
PASSWORDというパスワードを設定する例です。

## タイムゾーンの変更
日本時間にするには以下

```bash:環境変数の追加
heroku config:add TZ=Asia/Tokyo
```


# ドメイン設定の確認
Herokuのアプリごとにどんなドメインが振られているか確認できます。

```bash:ドメインの確認
heroku domains
```

```bash:ドメインの表示例
heroku domains --app pugiemonn-com
=== pugiemonn-com Heroku Domain
pugiemonn-com.herokuapp.com

=== pugiemonn-com Custom Domains
Domain Name    DNS Target
─────────────  ──────────────────────────────────
pugiemonn.com  pugiemonn-com.herokuapp.com
```

# アドオン
アドオンを確認する場合は、`addons`を使用します。

```bash:アドオンの確認
heroku addons
```

```bash:アドオン追加
heroku addons:add アドオン名
```

# 複数アプリ一覧を確認

```bash:herokuのアプリ一覧を表示
heroku list
```

# 複数アプリケーションの利用
Herokuのアプリケーションはつい増えてしまいます。アプリを複数指定し切り替えるにはオプションを指定します。

## アプリの指定

```bash:アプリ名を指定してコマンド実行
heroku コマンド --app アプリ名
```

# 参考
* <a href="http://qiita.com/pugiemonn/items/af2bbd93549db67af04e" >heroku pg:psqlでsh: psql: command not foundと言われたけれど、ローカルにPostgreSQLを入れたら直りました。</a>
* http://qiita.com/icb54615/items/209ab6dc646bfc7f9432
* http://qiita.com/pugiemonn/items/7cb39cfac40394e4372e
ImageMagick 画像中に文字を入れる

ImageMagickにて、画像中の指定位置に文字列を書き込む方法を記述する。その際、フォント名を指定する。

使用バージョン

* ImageMagick 6.9.1-4 Q16

コマンド例
`convert -size 640x400 -depth 8 gray:circle_640x400.raw -fill #101010 +antialias -font "Meiryo-&-Meiryo-Italic-&-Meiryo-UI-&-Meiryo-UI-Italic" -gravity South -annotate +0+32 "グレーの円" -depth 8 gray:circle_640x400_text.raw`

# 位置指定
`-gravity`オプションを使用する。
画像上側を北(`North`)、下側を南(`South`)、左側を西(`West`)、右側を東(`East`)として、この組み合わせで指定する。
中央は`Center`と指定する。

本例では`-gravity South`を指定しており、下側中央配置である。

# 文字列を書き込む
`-annotate`オプションを使用する。

## 座標指定
`{+|-}tx{+|-}ty`にて指定する。原点(画像の左上)からの相対位置を示す。
Xの正方向は右側、Yの正方向は上側である。
`-gravity`オプション指定があるときは、その指定からの相対位置となる。

## 文字列
位置指定の後に配置する。ダブルクォーテーションで囲むことで、半角スペースを含んだ文字列を指定できる。

# フォント指定
`-annotate`の**前で**`-font`オプションを使用する。
使用できるフォントの一覧を次のコマンドで確認できる。
`convert -list font`

```
> convert -list font

Path: Windows Fonts
  Font: Arial
    family: Arial
    style: Normal
    stretch: Normal
    weight: 400
    glyphs: c:\windows\fonts\arial.ttf
  Font: Arial-Black
    family: Arial
    style: Normal
    stretch: Normal
    weight: 900
    glyphs: c:\windows\fonts\ariblk.ttf
(以下略)
```

この、`Font: `の後の文字列を`-font`オプションで指定する。

フォントサイズの指定には、`-pointsize`オプションを指定する。

```
-font "Meiryo-&-Meiryo-Italic-&-Meiryo-UI-&-Meiryo-UI-Italic" -pointsize 16
```

# その他
## -fill オプション
書き込む文字列の画素値を指定する。

## +antialiasオプション
文字のアンチエイリアスをOFFにする。
PostgreSQLで必要なテーブルのinsert文だけ生成する方法

チームで開発していると、部分的にデータベースをマージしたい状況があるかと思います。軽く日本語でググっても出てこなかったので、メモ。

1. ```su - ユーザ名```　（パスワード忘れた時はrootで入って、```su ユーザ名```）
1. ``pwd``でパスを確認する
2. Finderなどで確認したパスに移動し、「情報をみる」>（ロックを解除し、該当フォルダに対してsuで指定したユーザ名の読み書き権限を付与）
1. ターミナルからコマンドを打つ
```sql
pg_dump --table=テーブル名 --data-only --column-inserts データベース名 > ./出力ファイル名
```
1. ```pwd``で確認したパスにsql文が生成されます
2. 必要に応じて、ユーザに付与した読み書き権限を元に戻す


## 追記

- serialにしているカラムについては、そのままInsertするとトラブルが起きるはずなので、テキスト置き換えの作業は必要。外部キーも同様。
ggplotで数値軸の下限値(or上限値)だけを指定したい

**2016/04/12追記: ggplot2 v2.1.0にて動作を確認しました**

## Q
数値軸の下限を0にして、上限は設定しないというのはできないのでしょうか。例えば以下のようなコードのイメジです:


```r:NG_example.R
+ scale_y_continuous(minlim=0)
```

## A
1.0.0以降のバージョンであれば、下限値・上限値を設定するところに`NA`が使えます。以下をサンプルに設定します:


```r:base_example.R
library(ggplot2)
ggplot(mtcars, aes(wt, mpg)) +
  geom_point()
```

![base_example.R-1.png](https://qiita-image-store.s3.amazonaws.com/0/35118/35605669-282a-2817-7988-ec6f0fade8d2.png)

これに、`scale_y_continuous(limits = c(0, NA))`を加えます:

```r:OK_example.R
ggplot(mtcars, aes(wt, mpg)) +
  geom_point() + 
  scale_y_continuous(limits = c(0, NA))
```

![OK_example.R-1.png](https://qiita-image-store.s3.amazonaws.com/0/35118/854fc27e-9158-d275-7229-0dc44897cf31.png)

また、`ylim(c(0, NA))`でも指定可能ですし、x軸についても同様です:


```r:OK_example2.R
ggplot(mtcars, aes(wt, mpg)) +
  geom_point() + 
  ylim(c(0, NA)) +
  xlim(c(-2, NA))
```

![OK_example2.R-1.png](https://qiita-image-store.s3.amazonaws.com/0/35118/a0f28707-e580-1fd5-a254-2a022350a982.png)


0.9.xのバージョンを使っている場合は、`expand_limits(y=0)`が使用可能です:

```r:OK_example3.R
ggplot(mtcars, aes(wt, mpg)) +
  geom_point() + 
  expand_limits(y=0)
```

![OK_example3.R-1.png](https://qiita-image-store.s3.amazonaws.com/0/35118/7d668510-7e8f-674b-980d-875c3f02fb6a.png)

もし1.0.0以降を使用しているなら、わかりやすさも含めて前者の方法を用いるといいでしょう。

## 参考
この記事は、StackOverflowに投稿された以下の記事を参考に翻訳し、一部内容を変更して作成しました:

- [r - set only lower bound of a limit for ggplot - Stack Overflow](http://stackoverflow.com/questions/11214012/set-only-lower-bound-of-a-limit-for-ggplot)
WordPressの管理者アイコンをSimple Local Avatarsプラグインで変更しました。

WordPressの管理者アイコンはデフォルトでは変更できませんでした。

# Simple Local Avatarsプラグインをインストール
プラグインの新規追加から[Simple Local Avatars](https://ja.wordpress.org/plugins/simple-local-avatars/)をインストールします。

# プロフィール編集画面からアバターをアップロード
プロフィール編集画面からアバターが変更できるようになっています。
![スクリーンショット 2015-10-10 10.03.57.png](https://qiita-image-store.s3.amazonaws.com/0/1624/155ab6cb-bfe4-d2c7-5901-67c3756cfb4f.png)

これは便利(((((((((((っ･ω･)っ
INotifyPropertyChanged をつけたクラスのシリアライズが出来ない場合

例えばこんなクラスがあります。

```C#:CustomClass
        [Serializable]
        public class CustomClass : INotifyPropertyChanged
        {
            private bool _checkbox;
            public int Value { get; set; }
            public bool Checkbox
            {
                get
                {
                    return _checkbox;
                }
                set
                {
                    _checkbox = value;
                    NotifyPropertyChanged("Checkbox");
                }
            }

            public int SecondValue { get; set; }
            public string Text { get; set; }
            public event PropertyChangedEventHandler PropertyChanged;　///エラーが起きる箇所
            private void NotifyPropertyChanged(String info)
            {
                if (PropertyChanged != null)
                {
                    PropertyChanged(this, new PropertyChangedEventArgs(info));
                }
            }
        }
```

これをコンパイルすると、
public event PropertyChangedEventHandler PropertyChanged;
がシリアライズ出来ないとしてエラーが発生します。

このために、event部分をNonSerializedに指定する必要があるのですが、

```C#:CustomClass
        [Serializable]
        public class CustomClass : INotifyPropertyChanged
        {
            private bool _checkbox;
            public int Value { get; set; }
            public bool Checkbox
            {
                get
                {
                    return _checkbox;
                }
                set
                {
                    _checkbox = value;
                    NotifyPropertyChanged("Checkbox");
                }
            }

            public int SecondValue { get; set; }
            public string Text { get; set; }
            [NonSerialized] ///変更点ここ
            public event PropertyChangedEventHandler PropertyChanged;
            private void NotifyPropertyChanged(String info)
            {
                if (PropertyChanged != null)
                {
                    PropertyChanged(this, new PropertyChangedEventArgs(info));
                }
            }
        }
```

とやるとまたしてもエラーが起きます。
NonSerializedがフィールドタイプではない、と怒られるので、フィールドタイプとしてきちんと指定する必要があります。

```C#:CustomClass
        [Serializable]
        public class CustomClass : INotifyPropertyChanged
        {
            private bool _checkbox;
            public int Value { get; set; }
            public bool Checkbox
            {
                get
                {
                    return _checkbox;
                }
                set
                {
                    _checkbox = value;
                    NotifyPropertyChanged("Checkbox");
                }
            }

            public int SecondValue { get; set; }
            public string Text { get; set; }
            [field: NonSerialized] ///変更点ここ
            public event PropertyChangedEventHandler PropertyChanged;
            private void NotifyPropertyChanged(String info)
            {
                if (PropertyChanged != null)
                {
                    PropertyChanged(this, new PropertyChangedEventArgs(info));
                }
            }
        }
```

これで INotifyPropertyChanged のあるクラスのシリアライズが出来ます。
Static Cells時の選択色を変更する

ViewDidLoad時に以下のコードを書く

```objc


UIView *backgroundSelectedCell = [[UIView alloc] init];
[backgroundSelectedCell setBackgroundColor:[UIColor colorWithRed:130/256.0 green:169/256.0 blue:171/256.0 alpha:1.0]];

for (int section = 0; section < [self.tableView numberOfSections]; section++)
    for (int row = 0; row < [self.tableView numberOfRowsInSection:section]; row++)
    {
        NSIndexPath* cellPath = [NSIndexPath indexPathForRow:row inSection:section];
        UITableViewCell* cell = [self.tableView cellForRowAtIndexPath:cellPath];

        [cell setSelectedBackgroundView:backgroundSelectedCell];
    }  
```

引用元:[How to change background selected color storyboard static cells](http://stackoverflow.com/questions/8850501/how-to-change-background-selected-color-storyboard-static-cells)

キャッシュが云々というコメントはあるけど、スクロールしない場合問題はないと思う。
rbenvが ruby_rbenvに変わったって言うから変えたらハマった人へ

```
In your Berksfile, you have:
  cookbook 'rbenv'
But that cookbook is actually named 'ruby_rbenv'
This can cause potentially unwanted side-effects in the future.
NOTE: If you do not explicitly set the 'name' attribute in the metadata, the name of the directory will be used instead. This is often a cause of confusion for dependency solving.
```

というエラーメッセージが出てきたので何も考えずに`Berksfile`の中の名前変えたらめんどくさい目にあったのでメモ。

### 原因

[Cookbook Name Changed, Version not Incremented · Issue #126 · chef-rbenv/ruby_rbenv](https://github.com/chef-rbenv/ruby_rbenv/issues/126)

意訳：名前変えたのにバージョン変えてないってどういうことだよ！？


### 対策

[uninitialized constant Chef::Resource::RbenvRehash · Issue #127 · chef-rbenv/ruby_rbenv](https://github.com/chef-rbenv/ruby_rbenv/issues/127)

tag指定で動くバージョンをインストールしましょう。

```:Berksfile
cookbook 'rbenv', github: 'chef-rbenv/ruby_rbenv', tag: 'v0.8.0'
```
How to Prepare for Java Developer Interview Questions

Java developer jobs mainly include four or five technical rounds plus last hr or behavioral round . So we can conclude it is not easy to land job as a java developer. 

How to Prepare:

1. Search on the internet sites  like <a href="glassdoor.com">glassdoor</a> , what questions are generally asked by the potential employer for the position you will be getting interviewed.

2. Prepare a schedule to prepare for the interview.

3. If you are running out of time , then cover the most important java topics first like java collections  .

4. Following links are really helpful for you all , if the time is not in your side.

<a href="javahungry.blogspot.com/2013/06/top-25-most-frequently-asked-core-java.html">Java interview questions for experienced</a>

<a href ="javahungry.blogspot.com/2014/04/top-15-must-prepare-behavioral-interview-questions-and-answers-hr-round-non-technical.html">Behavioral Interview Questions</a>


Please do let me know if you have any questions .

Best Wishes 

Java Hungry Team
iOS9 不具合 (?) CSS・javascript フロントエンド的にはまった点

iOS9になって、それまで問題なく表示されていたウェブページが崩れたりと不具合が出たので、備忘録的なまとめ。

## 1. 「position:absolute;」で画面外に出ている要素によって表示崩れ

現象としては下記のような感じです。
BOX2はアニメーションで画面外から横からアニメーションでスライドインする想定で作られていました。「position:absolute;」で指定されているBOX2がなぜかiOS9.Xのsafariだと、表示領域が確保されてしまうのかわかりませんが、画面全体が縮小されてBOX2も表示されてしまいました。。。
![IMG_1062_s.png](https://qiita-image-store.s3.amazonaws.com/0/88968/3fa82c1a-0067-af59-a98a-c24548ebb80d.png)　![IMG_1061_s.png](https://qiita-image-store.s3.amazonaws.com/0/88968/6cfd0438-6238-1e9f-23de-c5f58f7ec938.png)

■解決策
CSSでbodyに下記を追加

```lang:hoge.css
body{
    position:relative;
    width: 100%;
    overflow-x:hidden;
}
```

## 2. テキスト入力ができなくなった...(?)

これはおそらく、そのサイトのCSSの設定がそもそもよくなく、iOS9だと影響を受けたのではないかと（推測）
下記CSSを追加して解決。。。

```lang:hoge.css
input{
    -webkit-user-select: auto;
}
```

## 3. require.jsでときどきモジュール読み込み時にtimeout

これも原因は不明。。。
下記設定を追加したら、とりあえず発生しなくなりました。
（waitSecondsはデフォルトで7秒だそうです。）

```lang:hoge.js
require.config({
    //色々な設定   
    ...,

    waitSeconds: 0
});
```


===============================
OnederAppliよろしくお願い致します！
＞<a href="http://onederappli.jp">ホームページ</a>
＞<a href="https://itunes.apple.com/jp/artist/koike-jun/id999607803">iPhoneアプリ</a>
＞<a href="https://play.google.com/store/apps/developer?id=OnederAppli">Androidアプリ</a>
gretel のパンくずリストの情報をtitleタグでも使う


[gretel](https://github.com/lassebunk/gretel)を使ってパンくずリストを作っていたところ、この情報をtitleタグに表示できたら便利だと思いました。似た情報を二重管理せずにすみます。

## 普通に gretel のパンくずリストの情報を定義しておく
```ruby:config/breadcrumbs.rb
crumb :root do
  link 'ホーム', root_path
end

crumb :users do
  link 'ユーザーリスト', users_path
end

crumb :user do |user|
  link user.name, user_path(user)
  parent :users
end
```

## パンくずリストをタイトルタグに流用するための仕組み
```ruby:app/views/layouts/application.html.haml
!!!
%html
  %head
    %title= content_for?(:title) ? yield(:title) : "MyApp"
    -# 以下省略
```

```ruby
  # こんなメソッドを作って gretel のヘルパーメソッド breadcrumb の代わりに使う
  def breadcrumb_with_title(*args)
    breadcrumb(*args)
    # タイトルが明示的に指定されてなければ、パンくずリストのテキストを使う
    content_for(:title, "#{breadcrumbs.links.last.text} | MyApp") unless content_for?(:title)
  end
```

## 各ページでは breadcrumb の代わりに breadcrumb_with_title を使う

```ruby:app/views/users/index.html.haml
- breadcrumb_with_title :users
-# (以下省略)
```

```ruby:app/views/users/show.html.haml
- breadcrumb_with_title :user, @user
-# (以下省略)
```

パンくずリストとは違うタイトルをつけたければ、 content_for で明示的に指定する。

```ruby:app/views/users/index.html.haml
- content_for :title, 'なんか違うタイトル'
- breadcrumb_with_title :users
-# (以下省略)
```

## 余談
gretelのヘルパーメソッドの名前が似てて間違えそうになる。

- breadcrumb ページのパンくずを指定する
- breadcrumbs パンくずリストをレンダリングする

よく間違う人がいるのか、[間違ってませんか？ってエラーメッセージを出すようになっている](https://github.com/lassebunk/gretel/blob/a2872e7bb50e7aa85b7eb44a7e779ec4e0d43a22/lib/gretel/view_helpers.rb#L12)。
gulp-compassのエラー時に、browser-syncによるリロードが止まる問題の解決方法

gulpでソースファイルに変更があった際、gulp-plumberを通したwatchタスク後にコールバックでbrowser-syncによるリロードをさせてましたが、
gulp-compassのエラー時のみ、リロードがされずに処理が止まる問題に悩まされていました。
scssファイルの変更は頻繁に確認するのでけっこう厄介な問題でしたが、最近解決したのでその方法を記しておこうと思います。

#### 各プラグインのバージョン
gulp@3.8.11(CLI, localともに)
gulp-compass@2.1.0
gulp-plumber@1.0.1
browser-sync@2.9.10

## 原因
gulp-plumberに適切なエラー処理を書いてなかったのが原因でした。
gulp-plumberは特にエラー処理を指定しなくても動作することが多いですが、
gulp-compassと併用する際には以下のようにエラーハンドラを記述しないといけないようです。

```js:gulpfile.js
var compass = require('gulp-compass'),
    plumber = require('gulp-plumber');

gulp.task('compass', function() {
  gulp.src('./src/*.scss')
     //.pipe(plumber()) // NG
    .pipe(plumber({ // OK
      errorHandler: function (error) {
        console.log(error.message);
        this.emit('end');
    }}))
    .pipe(compass({
      css: 'src/css',
      sass: 'src/sass',
    }))
    .pipe(gulp.dest('dist/assets/css'));
});
```

（あとで調べたら[gulp-compass公式の下の方](https://www.npmjs.com/package/gulp-compass)にplumberとの使い方が書いてあったのに気づきました…）

正直なところ、仕組みはよく分かってないのですが、this.emit('end')によって一旦watchタスクを終了させている？のがポイントのようです。

### 追記
後にgulp-lessでも似たようなエラーに遭遇し、同様の方法によって解決しました。
おまじない的な感じで、とりあえず上記エラーハンドラを書いておくといいのかもしれません。
MacにCudaをインストールする

環境:GeForce搭載のMacbook Pro, OSX10.11


##Driver + Toolkitをインストール

ここからダウンロード(downloadとかいてるところ)
https://developer.nvidia.com/cuda-toolkit

自分の場合は選択肢は
Mac OSX, x86_64, 10.11, local
を選んだ


##パスを通す

~/.bashrcに以下を記述

```~/.bashrc
## cuda
export PATH=/Developer/NVIDIA/CUDA-7.5/bin:$PATH
export DYLD_LIBRARY_PATH=/Developer/NVIDIA/CUDA-7.5/lib:$DYLD_LIBRARY_PATH
```

インストールが上手く行ったかのテストは以下を参考
https://hnakamur.github.io/blog/2015/07/25/setup_cuda_on_macbook_pro_with_geforce/

##pycudaを入れる

```
cd ~/Download
git clone http://git.tiker.net/trees/pycuda.git
cd pycuda
python configure.py
```

pycudaの下にあるsiteconf.pyを以下のように修正

```siteconf.py
BOOST_INC_DIR = ['/usr/local/Cellar/boost/1.58.0/include']
BOOST_LIB_DIR = ['usr/local/Cellar/boost/1.58.0/lib']
BOOST_COMPILER = 'gcc49'
USE_SHIPPED_BOOST = True
BOOST_PYTHON_LIBNAME = ['boost_python-mt']
BOOST_THREAD_LIBNAME = ['boost_thread-mt']
CUDA_TRACE = False
CUDA_ROOT = '/usr/local/cuda'
CUDA_ENABLE_GL = False
CUDA_ENABLE_CURAND = True
CUDADRV_LIB_DIR = ['${CUDA_ROOT}/lib']
CUDADRV_LIBNAME = ['cuda']
CUDART_LIB_DIR = ['${CUDA_ROOT}/lib']
CUDART_LIBNAME = ['cudart']
CURAND_LIB_DIR = ['${CUDA_ROOT}/lib']
CURAND_LIBNAME = ['curand']
CXXFLAGS = ['-arch', 'x86_64', '-mmacosx-version-min=10.7', '-isysroot', '/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk']
LDFLAGS = ['-F/Library/Frameworks', '-arch', 'x86_64', '-mmacosx-version-min=10.7', '-isysroot', '/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk']
```

ここは自分の環境に合わせて変更してください
最初の２行はboostライブラリがある場所を指定してください
最後の２行はXcodeの設定にやバージョンに合わせてください


```
cd ~/Download/pycuda
git clone git://github.com/inducer/compyte.git
```
pycudaをインストール

```
cd ~/Download/pycuda
sudo make
sudo make install
```


##pycudaが入ったかの確認

一度ターミナルを再起動して

```
python
>>> import pycuda.autoinit
>>>
```
のようにエラーが出なければうまく行ってる


参考http://sukehirodiary.seesaa.net/article/422737834.html
git stash したファイルを選択的に適用・保存する方法


## 文脈

```git flow``` に則った並行開発をしていると feature ブランチで作業中に develop ブランチをマージすることがよくありますが、このとき ```git stash``` を使用している方は多いと思います。
マージ完了後にもとの作業に戻ろうとしたり、あるいは別ブランチで退避したファイルを適用したい場合に ```git stash pop``` あるいは ```git stash apply``` することになりますが、これらのコマンドは退避したファイル全てを適用しようとするので、都合が悪いことがあります。
そのようなときは下記のように ```git checkout``` を使えば良いことに気づいたのでメモしておきます。(stash を対象に ```git checkout``` できることに気づかなかった...)

## 適用

```
git checkout stash@{0} -- <filename>
```

## 保存

```
git show stash@{0}:<full/filename>  >  <newfile>
```

## 参考

[How to apply files from stash selectively?](https://answers.atlassian.com/questions/65418/how-to-apply-files-from-stash-selectively)
MySQLの出力を表形式のままリダイレクトしたい


## やりたいこと

例えば、MySQLのデータベース一覧を表示してみる。

```sh
$ mysql -e 'show databases'
+--------------------+
| Database           |
+--------------------+
| my_database1       |
| my_database2       |
| my_database3       |
| my_database4       |
+--------------------+
```

表形式で出力される。
これをこのままファイルに保存したい。
で、リダイレクトしたら

```sh
$ mysql -e 'show databases' > output
$ cat output
Database
my_database1
my_database2
my_database3
my_database4
```

？？？

期待しているのと違うんですけど。

## 原因は
これはどうもMySQLがisatty()で出力先を判断しているため。

isatty()
http://linuxjm.osdn.jp/html/LDP_man-pages/man3/isatty.3.html


出力先がttyか否かを判断して、出力形式を変化させてる。

## isatty()を上書き

そこでLD_PRELOADを使ってisattyをすげ替えてしまう。

まず、1を返却するisatty()の共有ライブラリを作成

```sh
$ echo 'int isatty(int fd){return 1;}'|gcc -xc -shared -o tmp.so -
$ ls
tmp.so
```

LD_PRELOADに作成したtmp.soを指定して実行。
なお、LD_LIBRARY_PATHにはtmp.soのあるカレントディレクトリを追加。

```sh
$ LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH LD_PRELOAD=tmp.so mysql -e 'show databases' > output
$ cat output
+--------------------+
| Database           |
+--------------------+
| my_database1       |
| my_database2       |
| my_database3       |
| my_database4       |
+--------------------+
```
 
あ、できた