OmniAICreator/Qiita-1.07M huggingface dataset:
iOS 8でステータスバーを消す


iOS SDK 8.1, Swift 1.1, Xcode 6.1.1です。

1. Info.plistに `View controller-based status bar appearance` `YES` を追加する。
2. rootViewControllerがきちんと設定されているか確認する。
3. ステータスバーを消したいViewのViewControllerを`UIViewController:presentViewController`で表示する場合、大概UINavigationViewController挟んでるので、`navigationController.modalPresentationCapturesStatusBarAppearance = true`する。これがないと次に設定するメソッドがそもそも呼ばれない。
4. ステータスバーを消したいUIViewControllerのprefersStatusBarHiddenメソッドをオーバーライドしてtrueを返す。

rootViewControllerをプログラムから設定しなおす場合は次のように書くといいらしい。

```swift
let storyBoard = UIStoryboard(name: "Foo", bundle: nil)
let viewController = storyBoard.instantiateViewControllerWithIdentifier("Bar") as UIViewController
UIApplication.sharedApplication().keyWindow!.rootViewController = viewController
```

## 参考

http://anz-note.tumblr.com/post/62524756917/ios7-o
http://lab.dolice.net/blog/2013/09/25/objc-ios7-status-bar/
http://stackoverflow.com/questions/22653993/programatically-change-rootviewcontroller-of-storyboard

## P.S.

そして今は、NavigationBarが非表示のViewControllerからmodalを表示し、dismissして戻ってくるとステータスバーに食い込んでViewが表示される事象と戦っている。

## 追記

今このエントリを知りました（そして過去の自分がStockしていた）
http://qiita.com/makoto_kw/items/d7ed59aff27fb95c9fde
yrmcdsをAmazon Linuxで試してみる　其の①


先日、久々の更新があったようなので、少し試してみようと思う。


# yrmcdsとは？
サイボウズ社にて開発されているKVS。memcachedと互換性がある。
さらにレプリケーションや、オブジェクトの占有などの独自機能も備えているようだ。

詳しくは本家にて。
http://cybozu.github.io/yrmcds/html/#index


# インストール

以下が必要なようなので準備する。
・gcc-c++
・libatomic
・google-perftools
・google-perftools-devel


```
yum install gcc-c++
yum install libatomic.x86_64
wget ftp://ftp.pbone.net/mirror/ftp5.gwdg.de/pub/opensuse/repositories/home:/hmacht:/storage/CentOS_CentOS-6/x86_64/google-perftools-1.9.1-21.1.x86_64.rpm
rpm -ivh google-perftools-1.9.1-21.1.x86_64.rpm
wget ftp://ftp.pbone.net/mirror/ftp5.gwdg.de/pub/opensuse/repositories/home:/hmacht:/storage/CentOS_CentOS-6/x86_64/google-perftools-devel-1.9.1-21.1.x86_64.rpm
rpm -ivh google-perftools-devel-1.9.1-21.1.x86_64.rpm
```
google-perftoolsたちは、少し古いがrpmからインストールにしておく。

そして、yrmcdsのインストール。

```
wget https://github.com/cybozu/yrmcds/archive/v1.1.1.tar.gz
tar xvzf v1.1.1.tar.gz
cd yrmcds-1.1.1/
make
make install
```

注意点としては、`nogroup`といったグループにて動作するよう、Makefileなどに定義されている。Amazon Linuxではデフォルトにはそのようなグループはないため、インストールできない。
`nobody`に置き換えるようにした。

# 動作確認
起動して動作を確認してみる。

```
# /usr/local/sbin/yrmcdsd &
# telnet localhost 11211
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
stats
STAT pid 2578
STAT time 1425385609
STAT version yrmcds version 1.1.1
STAT pointer_size 64
STAT rusage_user 0:132000
STAT rusage_system 0:20000
STAT curr_connections 1
STAT total_connections 1
STAT curr_items 0
STAT total_items 0
STAT bytes 0
STAT limit_maxbytes 1073741824
STAT threads 10
STAT gc_count 3
STAT slaves 0
STAT last_expirations 0
STAT last_evictions 0
STAT evictions 0
STAT last_gc_elapsed 40918
STAT total_gc_elapsed 120571
END
get test
END
set test 0 0 4
hoge
STORED
get test
VALUE test 0 4
hoge
END
delete test
DELETED
get test
END
```

動いてるっぽい！
今日はとりあえずここまで。
Project Euler 31

問題
---
イギリスでは硬貨はポンド£とペンスpがあり，一般的に流通している硬貨は以下の8種類である.

1p, 2p, 5p, 10p, 20p, 50p, £1 (100p) and £2 (200p).

以下の方法で£2を作ることが可能である．

1×£1 + 1×50p + 2×20p + 1×5p + 1×2p + 3×1p

これらの硬貨を使って£2を作る方法は何通りあるか?
http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%2031

回答
---
再帰使えってっことですね。わかります。

```py
def count_methods(target, coins):
  if len(coins) == 0:
    return 1
  else:
    s = 0
    c = coins[0]
    q = (target // c) + 1
    for i in range(0,q):
      s += count_methods(target - c * i, coins[1:])
    return s
    
def main():
  TARGET = 200
  COINS = [200,100, 50, 20, 10, 5, 2]
  print count_methods(TARGET,COINS)

main()
```
MacのExcelでよく使うショートカット一覧とカスタマイズ例


MacのExcelはショートカットキーがWindowsと大幅に異なる上、デフォルトでは存在しないものも多くあります。そこで、普段の作業で必要不可欠なショートカットをまとめることにしました。

なお、(*)の付いているものは自分で設定する必要があるものです。設定は「ツール > ショートカットキーのユーザ設定...」にて行うことができます。

いったんは必要最小限のものを書いてみましたが、実際に運用しながら追加・修正していくつもりですので、ご意見・アドバイスなどあれば是非コメントを頂けると嬉しいです。

dotfiles的に管理できたらいいんだけどなぁ。

## 移動

|機能|ショートカットキー|設定項目（カスタマイズが必要な場合）|
|:---|:---|:---|
|隣のシートに移動|option + 矢印|
|今いるセル集合の終端に移動|command + 矢印|

※「今いるセル集合の終端に移動」は、現在地が「値あり」セルの場合は「連続する値ありセルの終端」、現在地が「値なし」セルの場合は「連続する値なしセルの終端」に移動します。

## 選択、コピー、ペースト、削除

|機能|ショートカットキー|設定項目（カスタマイズが必要な場合）|
|:---|:---|:---|
|コピー|command + c|
|ペースト|command + v|
|書式を選択してペースト|command + ctrl + v|
|値のペースト (*)|command + shift + v|編集 > 値のペースト
|書式のペースト (*)|command + option + v|編集 > 書式のペースト
|行選択|shift + space|
|列選択|ctrl + space|
|選択したセル/行/列を削除|ctrl + k|
|値を空にする (*)|command + delete|編集 > 数式と値のクリア

## セルの基本操作

|機能|ショートカットキー|設定項目（カスタマイズが必要な場合）|
|:---|:---|:---|
|編集モードに入る|ctrl + u|
|書式設定を開く|command + 1|
|ハイパーリンク設定を開く|command + k|
|セルを結合する (*)|command + shift + m|書式 > セルの結合
|セルの結合を解除する (*)|command + option + m|書式 > セル結合の解除

## 罫線

|機能|ショートカットキー|設定項目（カスタマイズが必要な場合）|
|:---|:---|:---|
|外枠罫線をひく|command + option + 0|
|内側罫線をひく (*)|command + option + 9|書式 > 内側罫線
|指定した辺に罫線をひく/外す|command + shift + 矢印|
|罫線を外す (*)|command + option + delete|書式 > 罫線の消去

## フォント・整列

|機能|ショートカットキー|設定項目（カスタマイズが必要な場合）|
|:---|:---|:---|
|フォントを大きく|command + .|
|フォントを小さく|command + ,|
|左揃え|command + l|
|中央揃え|command + e|
|右揃え|command + r|
zabbixとpg_monzで認証ありのpostgresqlを詳細監視

pg_monzはzabbixでPostgreSQLを監視するためのテンプレートです。
以下導入・設定方法は公式ページを参考に。

http://pg-monz.github.io/pg_monz/

主にZabbixのUserParameterで、psqlを用いて情報を取得しているようですが、
現段階ではパスワード認証に対応していないようです。

RDSなどどうしてもパスワード認証が必要なPostgreSQLサーバへの監視の場合は、
当然zabbixのログに

```
ユーザ postgres のパスワード:
psql: fe_sendauth: no password supplied
```

のようにエラーが出力されてしまいます。

そこで、pgpassを用いて対話的にパスワードが聞かれないよう設定をします。
http://www.postgresql.jp/document/9.3/html/libpq-pgpass.html

環境に合わせて、zabbixのホームディレクトリに
以下のように.pgpassを作成します。

```
vi /var/lib/zabbix/.pgpass
——————————————
localhost:5432:*:postgres:postgrespass
——————————————

chown zabbix. /var/lib/zabbix/.pgpass
chmod 600 /var/lib/zabbix/.pgpass
```

上記を設定すれば、
zabbixからパスワード認証付きのPostgreSQLの監視ができるようになります。

これでRDS for PostgreSQLの監視をzabbixで！
map(), reduce(), filter(), 再帰を使ってFizzBuzzを書く

map(), reduce(), filter(), 再帰の練習がてら、map(), reduce(), filter(), 再帰を使ってFizzBuzzを書いてみた。

まずはfizzbuzz(n)関数を作ってみた。

```py
def fizzbuzz(n):
  if (n % 15) == 0:
    return "FizzBuzz"
  elif (n % 3) == 0:
    return "Fizz"
  elif (n % 5) == 0:
    return "Buzz"
  else:
    return str(n)
```

mapは単に上記関数を呼ぶだけ。

```py
for s in map(fizzbuzz,range(1,101)):
  print s
```

reduce()については、mrg関数を作ってみた。

```py
def mrg(msg,n):
  msg = str(msg)
  if msg == '0':
    return str(fizzbuzz(n))
  else:
    return msg + '\n' + str(fizzbuzz(n))
print reduce(mrg,range(0,101))
```

filter()については、かなり強引に書いてみた。上手い書き方ないかな。

```py
ls = range(1,101)
msg = range(1,101)
for i in filter(lambda x: (x%3)==0,ls):
  msg[i-1] = "Fizz"
for i in  filter(lambda x: (x%5)==0,ls):
  if msg[i-1] == "Fizz":
    msg[i-1] += "Buzz"
  else:
    msg[i-1] = "Buzz"

for s in msg:
  print s
```

そして再帰。forがない分、これが一番シンプルに見える。

```py
START = 1
FINISH = 100
def fzbz(n):
  if n == FINISH:
    return fizzbuzz(n)
  else:
    return fizzbuzz(n)+"\n"+fzbz(n+1)
print fzbz(START)
```
tmpwatchコマンドで定期的にファイルを削除する。



# tmpwatchコマンドとは



## 使い所
- ある一定の時間を過ぎたファイルやディレクトリを削除したい時
- 一時ファイルを定期的に削除したい時
- 定期的に◯時間アクセスがないログファイルとかを削除したい時

etc...


# 使い方
```
$ tmpwatch [option] [hours] [dirs]
```
dirsの指定にはワイルドカード(*)が使える。


## 一定期間アクセスがないファイルを削除する

240時間アクセスが無い/tmp/下のファイルを削除。

```
$ tmpwatch 240 /tmp
```

## 一定期間過ぎたファイルやディレクトリを削除する


更新日が720時間以上古いファイルを削除

```
$ tmpwatch -m 720 /path/to/log
```

### ディレクトリは除外したい場合は-d

/tmp内で最終更新から240時間たったファイルを削除。ただしディレクトリは削除しない。

```
$ tmpwatch -m 240 -d /tmp
```


## 特定のディレクトリは除外

/tmpディレクトリ内の/tmp/hoge以外のファイルを対象として、24時間アクセスのないものを削除

```
$ tmpwatch 24 /tmp -x /tmp/hoge
```

## オプション一覧

- -u, –atime –アクセス時刻
- -m, –mtime –更新時刻
- -c, –ctime –ステータス変更時刻
- -M, –dirmtime –ディレクトリ更新時刻
- -a, –all –種類に関わらずすべてのファイルを削除する
- -d, –nodirs –ディレクトリは削除しない
- -f, –force –root権限なくても削除を行う
- -l, –nosymlinks — シンポリックリンクは削除しない
- -q, –quiet –コマンドライン表示しない（エラー時のみ表示）
- -s, –fuser –fuserコマンドを使ってファイル状態を確認
- -t, –test –テストモード(実際削除処理は走らない)
- -U, –exclude-user=user –指定するユーザのファイルを削除対象外
- -v, –verbose –詳細モード
- -x, –exclude=path –指定するファイル・フォルダを削除対象外にする

[cronへの登録はこちらを参照](http://qiita.com/katsukii/items/d5f90a6e4592d1414f99)
企画をもう１歩ブラッシュアップする方法


# まえふり
企画をしていると、自分はそれなりにちゃんと考えて持っていったものなのに、
**方向性はこれで。次回の会議はこれをブラッシュアップしたものを持ってきてもらって検討しましょう**
なんて言われることが多々あります。


で、帰ってきて思うんですね。
「これ以上、どこを深堀りすればいいんだ」「ブラッシュアップってなんだよ」と。

そういうときにオススメの手法がこれです。

# 手順１：審査員になってダメ出しする

自分で作った企画ですが、一旦自分で考えたということは忘れましょう。
そして、自分が審査員（もしくは上司やクライアント）だったつもりになって、そこにこの企画が提出されたとします。

審査員なので、思う存分ダメ出ししましょう。

* 優等生の模範解答みたいだけど、それって本当にユーザーは面白いと思うの？
* そんなに思い通りに行動してくれないよね、実際。
* たくさんユーザーがいれば成立するかもしれないけど、最初はユーザー0人じゃん。そう考えるとつまらないよね。
* 最初の１回はそうかもしれないけど、2回めアクセスしようと思ってくれる？
* 考え方は面白いんだけど、それって実現できるの？
* その利用シーンでは、スマホ起動するヒマないよね。
* もう他のサービスで良いものあるじゃん。わざわざ新しいの使わずにそっち使うよね。
* などなど

たくさんあればあるほど良いです。
上から目線で、容赦なく。

# 手順２：ダメ出しを解決していく

手順１で出てきたダメ出しは、企画として弱いところです。
つまりダメ出しができちゃう企画だから、ブラッシュアップして持ってこいと言われるんですね。

なので、自分出したダメ出しを１つ１つ考えましょう。解消するにはどうするか。
いままでは考えてなかったけど、こうすれば面白いと思ってくれるんじゃないか。
たしかにあのタイミングでスマホを操作するのは難しいから、あとから操作できるようにしよう。


そして、出来る限りたくさんのダメ出しを解消する。理想はすべてを潰すことです。

# 手順３：前提と矛盾・崩壊していないか再確認

夢中になって考えをふくらませると、思いもよらぬ方向に進んで
たしかに良くなっていくことも多いのですが、
そもそもの目的とズレてしまうこともあります。

せっかく考えた企画も、ズレてしまえば採用されません。

一度クールダウンして、前提に沿っているかを見返しましょう。

# さいごに

ブラッシュアップしろと言われたことを漠然と捉えてしまうと
その企画を掘り下げ良くしていくのではなく、
**単にもっと何かを付け加えてみる**ということに陥ってしまうことがよくあります。

そうなってしまうと、次回の会議で提出しても
確かに枚数は多くなってるしたくさん書いてあるんだけど
別に良くなってるわけでもないね。もう少し煮詰めてみましょうか。
と、また同じことを繰り返すことになり、ずっと産みの苦しみを味わうことになります。

そうならないためにも、審査員になりきってみることをオススメします。
UbuntuサーバにMySQLクライアント(mysql-clientのmysqlコマンド)をインストールする

はじめに
===

Ubuntu Server 14.04 LTSサーバに対して、MySQLクライアント(mysql-clientパッケージのmysqlコマンド バージョン5.5.41)をインストールする手順です。

対象環境
===

MySQLクライアント(mysqlコマンド)をインストールする環境です。

・64bit版 Ubuntu Server 14.04 LTS (3.13.0-44-generic)

Ubuntuサーバに対するMySQLクライアントインストール手順
===

**(1) Ubuntuサーバにログインし、root権限を持つユーザにスイッチします。**

```
ubuntu@example-ubuntu-server:~$ sudo su -
sudo: unable to resolve host example-ubuntu-server
root@example-ubuntu-server:~#

root@example-ubuntu-server:~# id
uid=0(root) gid=0(root) groups=0(root)
root@example-ubuntu-server:~#
```

**(2) UbuntuサーバにMySQLクライアント(mysqlコマンド)をインストールします。**

```
root@example-ubuntu-server:~# uname -a
Linux example-ubuntu-server 3.13.0-44-generic #73-Ubuntu SMP Tue Dec 16 00:22:43 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
root@example-ubuntu-server:~#
```

```
root@example-ubuntu-server:~# apt-get -y install mysql-client

　 (中略)
The following NEW packages will be installed:
  libdbd-mysql-perl libdbi-perl libmysqlclient18 libterm-readkey-perl
  mysql-client mysql-client-5.5 mysql-client-core-5.5 mysql-common
　 (中略)

Setting up mysql-client-5.5 (5.5.41-0ubuntu0.14.04.1) ...
Setting up mysql-client (5.5.41-0ubuntu0.14.04.1) ...
Processing triggers for libc-bin (2.19-0ubuntu6.5) ...
root@example-ubuntu-server:~#
```

**(3) MySQLクライアント(mysqlコマンド)がインストールされた事を確認します。**

```
root@example-ubuntu-server:~# which mysql
/usr/bin/mysql

root@example-ubuntu-server:~# mysql --version
mysql  Ver 14.14 Distrib 5.5.41, for debian-linux-gnu (x86_64) using readline 6.3
root@example-ubuntu-server:~#
```

**(4) Ubuntuサーバにインストールしたmysqlコマンドを実行し、MySQLサーバへ接続出来るかテストします。**

```
root@example-ubuntu-server:~# mysql -u [MySQLユーザ名] --password="[MySQLユーザのパスワード]" -h [MySQLサーバのIPアドレス] example_schema

　(中略)
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| example_schema     |
+--------------------+
2 rows in set (0.00 sec)

mysql>
mysql> SELECT * FROM `example_schema`.`example_table`;
+------+------+
| id   | name |
+------+------+
|    1 | test |
|    2 | test |
+------+------+
2 rows in set (0.19 sec)

mysql> INSERT INTO `example_schema`.`example_table`( id, name ) VALUES( 3, 'test' );
Query OK, 1 row affected (0.01 sec)

mysql> SELECT * FROM `example_schema`.`example_table`;
+------+------+
| id   | name |
+------+------+
|    1 | test |
|    2 | test |
|    3 | test |
+------+------+
3 rows in set (0.01 sec)

mysql> \q
Bye
root@example-ubuntu-server:~#
```

MySQLサーバへ接続出来れば、Ubuntuサーバへのmysqlコマンドのインストールは完了です。

***

以上になります。
Google Play Games plugin for Unityを使う

UnityでGoogle Play Gamesが利用できるプラグイン [Google Play Games plugin for Unity](https://github.com/playgameservices/play-games-plugin-for-unity) を使ってみたので、忘備録もかねて。
この記事では、"Invitation"、"Create or Join a Room" と "Real-Time Multiplayer" まわりについて書きます。
導入などの準備はすっ飛ばしますのでその辺は [Unity Google Play Services まとめ - tetu式](http://stickpan.hatenablog.com/entry/2014/02/24/133411) や [play games plugin for Unityを使ってみよう（Android版） - テラシュールブログ](http://tsubakit1.hateblo.jp/entry/20131217/1387281360) などの記事を参考にするといいと思います。
なお、この記事を書いている時点でバージョンは0.9.12です。

**この記事は未完です。少しずつ書いていきます。**

# Invitation（招待）
文字通りほかのユーザーをゲームに招待する機能です。招待を承諾するとそのままマルチプレイヤーへ遷移するような設計になっています。

## ユーザーを招待する
[Create with invitation screen](https://github.com/playgameservices/play-games-plugin-for-unity/blob/master/RTMP.md#create-with-invitation-screen) より

```csharp
const int MinOpponents = 1, MaxOpponents = 3;
const int GameVariant = 0;
PlayGamesPlatform.Instance.RealTime.CreateWithInvitationScreen(MinOpponents, MaxOpponents, GameVariant, listener);
```
* MinOpponents : 最小の相手プレイヤーの人数
* MaxOpponents : 最大の相手プレイヤーの人数
* GameVariant : 招待したいゲームモードのタイプ、これはゲーム側で自由に設定
* listener : RealTimeMultiplayerListenerインターフェイスを実装したクラス、実装については後ほど

このメソッドを呼び出すとこんな画面が出ます。
![invitation1.png](https://qiita-image-store.s3.amazonaws.com/0/71117/947489f9-311f-2187-806c-a367b5311b38.png)

## 招待を受ける
### inbox（招待の履歴のようなもの？）から受ける
ゲームをプレイしていないとき招待を受けると、通知領域に通知&inboxに保存されます。

[Accept from inbox](https://github.com/playgameservices/play-games-plugin-for-unity/blob/master/RTMP.md#accept-from-inbox) より

```csharp
PlayGamesPlatform.Instance.RealTime.AcceptFromInbox(listener);
```
* listener : RealTimeMultiplayerListenerインターフェイスを実装したクラス、実装については後ほど

このメソッドを呼び出すとこんな画面が出ます。
![invitation2.png](https://qiita-image-store.s3.amazonaws.com/0/71117/6b81af57-1015-5250-b7e8-4aaebde1c6aa.png)

### ゲーム中に受ける
招待を受けるために、招待が来た場合のコールバックメソッドを登録しておきましょう。
以下のコードを `PlayGamesPlatform.Activate();`の前に記述します。

```csharp
var config = new PlayGamesClientConfiguration.Builder()
.WithInvitationDelegate(OnReceivedInvitation) //招待を受けるとOnReceivedInvitationが呼ばれる
.Build();

PlayGamesPlatform.InitializeInstance(config);
```
`OnReceivedInvitation`の構文は `void OnReceivedInvitation(Invitation invitation, bool shouldAutoAccept)` です。
`OnReceivedInvitation` に渡される `Invitation` クラスには `Variant` プロパティがあり、ここに `GameVariant` の値が格納されています。

## 招待を拒否する

```csharp
PlayGamesPlatform.Instance.RealTime.DeclineInvitation(invitationId);
```
* invitationId : 招待を受けた時に渡されたInvitationクラスのInvitationIdプロパティを渡す

# ランダムマッチ
* また今度更新します。
MySQLのコマンドラインで入力をキャンセルする

# \cを入力して改行
MySQLのコマンドラインで、
入力途中でコマンドを取り消したい場合、以下の方法があります。
お好みの方法を選択しましょう。

1. backspaceですべて消す（改行が入ってると対応できない）
2. 諦めてコロン（;）を入力する（エラーが発生して気分が悪い）
3. Ctrl-Cでmysqlを強制的に抜ける（もう一回ログインしなおし）
4. ウインドウを閉じる（ダイアログがうざい上に、もう一度繋ぎ直し）
5. PCの電源ボタンを7秒以上押し続ける（。。。）
6. \cを入力してスマートに取り消す

```
mysql> ls
    -> \c
mysql>
```

helpに書いてありました。

```
clear     (\c) Clear the current input statement.
```
jsdoでスタックマシンをホスティングした。

皆さんは、スタックマシン知ってますか、使った事ありますか。
実物を用意しました。

```
push  "x"
push  "ok"
set
end
```

このコードで、"ok"が表示されます。

```
  push  "x"
  push  "9 / 3 = "
  push  "9"
  push  "3"
  /
  add
  set
  end
```

このコードで"9 / 3 = 3"が表示されます。
[実行](http://jsdo.it/ohisama1/5rr0)

仕掛けは、flash　VMを利用しています。

```
  push  "x"
  push  ""
  set  
  push  "i"
  push  "0"
  set
loop  push  "i"
  push  "i"
  get
  ++
  set
  get
  push  "x"
  push  "x"
  get
  push  "i"
  get
  add
  set
  push  "x"
  push  "x"
  get
  push  " "
  add
  set  
  push  "i"
  get
  push  "100"
  >
  !
  if  skip
  jp  loop
skip  end
```

このコードで1から100が表示されます。
[実行](http://jsdo.it/ohisama1/hHLk)

がんばって、fizzbuzzを作りました。

```
  push  "x"
  push  ""
  set  
  push  "i"
  push  "0"
  set
loop  push  "i"
  push  "i"
  get
  ++
  set
  get
  push  "i"  
  get
  push  "15"
  %
  push  "1"
  \>
  if  skip2  
  push  "i"  
  get
  push  "5"
  %
  push  "1"
  \>
  if  skip1
  push  "i"  
  get
  push  "3"
  %
  push  "1"
  \>
  if  skip0
  push  "x"
  push  "x"
  get
  push  "i"
  get
  add
  set
  push  "x"
  push  "x"
  get
  push  " "
  jp  skip3
skip0  push  "x"
  push  "x"
  get
  push  "fizz "
  jp  skip3
skip1  push  "x"
  push  "x"
  get
  push  "buzz "
  jp  skip3
skip2  push  "x"
  push  "x"
  get
  push  "fizzbuzz "
skip3  add
  set
  push  "i"
  get
  push  "100"
  \>
  if  loop
  end
```

[実行](http://jsdo.it/ohisama1/1Wjf)
docs.fluentd.orgからの日本語ドキュメントの削除

[Remove multi language page from official site. #160](https://github.com/fluent/fluentd-docs/pull/160)

というパッチを今日マージしました．

## 背景

fluentd-docsは[docs.fluentd.org](http://docs.fluentd.org/)のリポジトリです．前は英語しかなく，各言語の翻訳バージョンが欲しいという要望があったので(特に日本語)，複数言語を表示出来るように少し前にしました．

ただ，Fluentdの開発者達は基本英語でドキュメントを書くのと，逐一日本語へ翻訳するのはかなりのコストなので，日本語への翻訳はコントリビューションベースという感じになりました．
サポートした最初の頃は良かったんですが，Fluentd本体の進化にともない英語のドキュメントが更新される一方，日本語への翻訳ペースは全然追いつかないようになっていました(ほぼmazgiさん一人に頼り切りになってました)．

## 問題点

分かるとは思いますが，日本の方は日本語で書かれたドキュメントがあれば大抵そちらをまず読みます．で，さらにそれが本家にあればそれを最新だと思います．TwitterやWebに上がる記事を見ていると，古い日本語のページを見て「こういう機能ないのか」と外部プラグインを探したりなど，「今ならこういうのがあります！」と指摘することがちょくちょくありました．

コアの部分とかは大きく変わっていないので，その辺の翻訳された記事は問題がない一方で，運用や使いやすさに関わるパラメータなどの更新が全然追いついてないのがかなり悩ましい問題でした．

## 解決策がない

実のところ，ソフトウェアに慣れてくるとそれらに関わる説明とかは英語でも問題がなくなるというのがよくあります．実際さまざまなソフトウェアのドキュメントは基本的に英語版が最新で，正確性を求めてそちらを読む人が多いのも事実です(ドキュメントが簡単な表現でベタに書かれているのも一因だとは思いますが)．
Fluentdみたいな規模が大きくないソフトウェアで，翻訳系のコントリビューションが維持されないのはこの辺の難しさがあるからだと思います．fluentd-docsも，他の言語をサポートしていれば削除はしなかった可能性はありますが，実際非英語圏で専用ページが出来たのは日本だけで，他の人達は英語ページで問題がない感じです．

ブログとかであれば書かれた日が載ってますし，最新だとどうだろうと公式ドキュメントを参照するという流れが期待できますが，公式ドキュメントが古いとそこから次に行くところはありません．

ということで，今後の無用なトラブルを避けるためにも，本家からは日本語のドキュメントを削除しました．企業から選任をつけずにこの手の翻訳でうまく行っている所って，あるのであればどういう仕組みで運用しているのか気になるところです．

## 日本語ページの作り方

docs.fluentd.orgからは日本語ページを削除しましたが，他言語対応のコードそのものはまだ残っています．なので，`app.rb`内にある`$DEFAULT_LANGUAGE`を`en`以外にすれば，その設定されたディレクトリ内のコンテンツを読むため(例えば`ja`にすれば`ja`ディレクトリ)，リポジトリをforkしてそこを変更すれば，簡単に日本語版を立ち上げることはできるはずです．
この辺のコードに問題があれば，issueを立ててもらえれば対応します．

## まとめ

docs.fluentd.org/jaにアクセスしても英語ページにリダイレクトするだけになりました，ということでした．
SlackのIncoming Webhooksにポストするだけの簡単なRubyスクリプト


```ruby:post_to_slack.rb
require 'net/http'
require 'uri'
require 'json'

uri = URI.parse("https://hooks.slack.com/services/...(あたなのWebhook URL)")
payload = {
  text: "テストメッセージ",
  channel: "#random",
  username: "bot",
  icon_emoji: ":ghost:"
}

Net::HTTP.post_form(uri, { payload: payload.to_json })
```
Laravel5でSHA1のHasherを作成する

Laravel5でのデフォルトの認証はpassword_hashメソッドを用いたBcryptHasherなので、それをSHA1のHasherに変更する。

## 作成するファイル
- SHAHasher.php
- SHAHashServiceProvider.php

場所はお好みで。今回はこんな感じ。

```
app/Libraries/SHAHasher.php
app/Providers/SHAHashServiceProvider.php
```

### SHAHasher.php
まずはHasherクラスを作成します。

```app/Libraries/SHAHasher.php
<?php namespace App\Libraries;

use RuntimeException;
use Illuminate\Contracts\Hashing\Hasher as HasherContract;

class SHAHasher implements HasherContract {

		const SALT = 'hogehoge';

        /**
         * Hash the given value.
         *
         * @param  string  $value
         * @param  array   $options
         * @return string
         *
         * @throws \RuntimeException
         */
        public function make($value, array $options = array())
        {
                return hash('sha1', self::SALT . $value);
        }

        /**
         * Check the given plain value against a hash.
         *
         * @param  string  $value
         * @param  string  $hashedValue
         * @param  array   $options
         * @return bool
         */
        public function check($value, $hashedValue, array $options = array())
        {
                return $this->make($value) === $hashedValue;
        }

        /**
         * Check if the given hash has been hashed using the given options.
         *
         * @param  string  $hashedValue
         * @param  array   $options
         * @return bool
         */
        public function needsRehash($hashedValue, array $options = array())
        {
                return false;
        }

}
```

HasherContractはHasherのInterfaceです。
needsRehashは本来Laravel5で使用されているHasherはBcryptHasherなので存在しますが、SHA1の場合不要なのでfalseを返しておきます。

### SHAHashServiceProvider.php
Laravelに読み込ませるため、ServiceProviderを作成します。

```app/Providers/SHAHashServiceProvider.php
<?php namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use App\Libraries\SHAHasher;

class SHAHashServiceProvider extends ServiceProvider {

        /**
         * Indicates if loading of the provider is deferred.
         *
         * @var bool
         */
        protected $defer = true;

        /**
         * Register the service provider.
         *
         * @return void
         */
        public function register()
        {
                $this->app->singleton('hash', function() { return new SHAHasher; });
        }

        /**
         * Get the services provided by the provider.
         *
         * @return array
         */
        public function provides()
        {
                return array('hash');
        }

}
```

通常使用されているHashServiceProviderのregisterで返却されているのがBcryptHasherからSHAHasherに変更されているだけです。簡単ですね。

最後にconfig/app.phpに書かれているHashServiceProviderを上で作ったSHAHashServiceProviderに変更します。

```config/app.php
+ //'Illuminate\Hashing\HashServiceProvider',
+ 'App\Providers\SHAHashServiceProvider',
```

これでLaravel5でSHA1のHasherが使用可能です。
CakePHPではデフォルトがSHA1でSALTとつなぎ合わせてHashしているのでこれで認証が可能になります。
rails + unicorn + nginx 環境を apache bench で負荷テスト

## 注意点：「Non-2xx responses」の数に注意しないといけない
- http://simosan.minibird.jp/wordpress/rails/unicorn%E3%81%A8nginx%E3%81%AE%E7%B5%84%E3%81%BF%E5%90%88%E3%82%8F%E3%81%9B%E3%83%91%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%B3%E3%82%B9%E6%94%B9%E5%96%84/
- 上記URLで、2000req/sec が出たと言っているが、これはアプリケーション側が死んでnginxが502を返しているだけの可能性が高い
- apache benchの結果の出力の`Non-2xx responses`は、2xx系でないステータスコードの数を表すので、その項目も注意して見る
- 高負荷状況で502が返ってくる場合は、unicornのbacklog設定と、linuxのsysctlの設定を見直す。参考：http://stackoverflow.com/questions/15477740/bad-gateway-errors-at-load-on-nginx-unicorn-rails-3-app
 
## テスト実施
### テスト環境

- rails 4.1.2
- unicorn 4.8.3
- nginx 1.7.6
- DB: Mysql (RDSのm3.large)
- サーバ1台(awsのm3.large)
- viewの内容（標準的なウェブサイトのトップページのイメージ）
- DBアクセスはindexを使ったselectを数件のみ。
- viewのキャッシュなし
- abコマンド: ab -n 3000 -c 500 #{url}

### テスト結果
上記の設定だと、50req/secくらいになった。
viewのレンダリングが遅いので、viewを細かくキャッシュして、200req/secくらいが限界な気がする。
600req/sec くらいは簡単にいくよ！って人がいたら、コメントに書いてもらえると嬉しいです。
MacOS XでVagrantにCentOS入れ、Railsアプリ制作、Heroku公開 -独自box作成-

# Vagrant の box を新規作成

MacOS X Yosemite で Heroku にアプリを公開するまでの環境構築を何回かに分けて書きます。

vol.01 [VirtualBox インストール編](http://qiita.com/hirolog/items/560ce489dce08f555876) 
vol.02 [Vagrant インストール編](http://qiita.com/hirolog/items/79c294da5225827f3f75)
vol.03 [Vagrant box作成編](http://qiita.com/hirolog/items/a57692eae892e7cdb6a7)
vol.04 [VagrantのCentOS 6.5 仮想マシン(box）起動まで](http://qiita.com/hirolog/items/0603c0b8a8c7b89a0cd4)
vol.05 [Rails 開発環境準備](http://qiita.com/hirolog/items/759f15ce91ce4e783091)
vol.06 [Git 環境を整備](http://qiita.com/hirolog/items/b2a117402c6cc0d02829)

も合わせてお読み下さい。（というか、先にこれらの操作が必要です）

さて、ここまでの設定は一般的なものなので、この仮想マシンは今後も汎用的に使えそうです。

ここで少し脱線して、現在の状況を新しい boxファイル にして保存しておきましょう。この操作をパッケージ化と呼ぶようです。
VirtualBoxの機能を使って現在のスナップショットを作ることもできますが、boxにしておくと後々で便利な可能性あります。

## オリジナルの box化 方法

vagrantにログイン中の場合、ログアウトして仮想マシンも落としましょう。

```
exit
(Vagrantを抜けたら）
vagrant halt
```

このまま **Vagrantfile があるディレクトリ**で、

```
vagrant package
```

と入力すると、package.box というファイルが出来上がります（けっこう待ちます）。
lsコマンドで確認すると、package.boxというファイルが確認できると思います。ファイルが多いなら grep で絞り込んで表示。

```
ls | grep box$
```

出来上がった package.box を適当な名前を付けて、どこかの保存しておきましょう。

```
mv package.box centos65-x86_64-20140116_rails.box
```

今後、この box を使う場合には [vol.03 Vagrant box作成編](http://qiita.com/hirolog/items/a57692eae892e7cdb6a7) に記載したように

```
vagrant box add [BOX名] [.boxファイルのある場所]
```

でOKです。BOX名はファイルパスを入れてください。.boxファイルと同じフォルダにいるなら、

```
vagrant box add centos65-x86_64-20140116_rails centos65-x86_64-20140116_rails.box
```

でOKです。

```
vagrant box list
```

で box が追加されたかどうか確認できます。

なお、.boxファイルは大きいので何度も作成して保存しておくような使い方はしないと思います。
バージョン管理的なことをしたいなら、VirtualBoxを立ち上げてスナップショットを取る方が良いです。

### キーワード

* MacOS X
* VirtualBox
* Vagrant
* CentOS
* Ruby on Rails
* RVM (Ruby Version Manager)
* Heroku
apache Directoryディレクティブのルーティング順


CakePHPの環境で、webroot配下以外に静的コンテンツを設置したいという案件があり、ちょこっとはまったのでメモ。

内容は、Directoryディレクティブの内容が複数マッチするリクエストの場合に、どれがマッチするかという話です。

```apacheのドキュメントによると
マージの順番は以下のようになっています:

<Directory> (正規表現無し) と .htaccess を同時に (.htaccess が許可されていれば、それが <Directory> を上書きします)
<DirectoryMatch> (と <Directory ~>
<Files> と <FilesMatch> を同時に
<Location> と <LocationMatch> を同時に
<Directory> 以外は、それぞれのグループは設定ファイルに現れた順番に処理されます。 <Directory> (上のグループ 1) はディレクトリが短いものから長いものへと処理されます。ですから、 例えば <Directory /var/web/dir1> は <Directory /var/web/dir/subdir> の前に処理されます。複数の <Directory> セクションが 同じディレクトリに 適用される場合は、設定ファイル中の順番に従って処理されます。 Include によって挿入された設定は 挿入しているファイルの Include ディレクティブの位置にあったかのように扱われます。

<VirtualHost> セクション中のセクションは バーチャルホストの定義の外側の対応するセクションの 後に適用されます。これによりバーチャルホストが メインのサーバ設定を上書きできるようなります。

```

######つまり、<Directory>ディレクティブに複数マッチする処理があった場合は、パスが短いものから順に処理されていくという話なので、最優先されるのは一番長いパスのものらしい。

###検証の結果からいうと、パスが一番長いものが最優先(上書き)されるけど事前に通ったディレクティブ処理も効く=同じディレクティブの記載がある場合のみ上書きされという意味でパスが長いものが優先されるという事だった。

【apacheディレクティブ一覧】
http://httpd.apache.org/docs/2.0/ja/mod/core.html#options

ということで、実際に試してみた。

##テストケース
今回は、下記のようなリクエストで、[/test/app/View/test1]配下に置かれた静的コンテンツを返したいとする。
http://localhost/test1/sample.html

##まずは、失敗作
cakeなので、ルーティングの為のリライトを標準通りに書いた下記のhttpd.confに、Aliasで該当パスを追加してみたところ、リライトが効いていて404が返る。
あれ、パスが長いものが適用されるんじゃなかったのか。。?

```httpd.conf
<Directory /test/app/>
  RewriteEngine On
  RewriteRule ^$ webroot/    [L]
  RewriteRule (.*) webroot/$1 [L]
</Directory>


<Directory /test/app/webroot/>
  RewriteEngine On
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteRule ^ index.php [L]
  RewriteCond %{THE_REQUEST} "^(.+?) (.*?)/app/webroot/(.*?) (.+?)$"
  RewriteRule ^(.*?)$ %2/%3 [R=302,L]
</Directory>

Alias /test1   /test/app/View/test1
<Directory /test/app/View/test1>
  AllowOverride none
  Options -Indexes FollowSymLinks
</Directory>

```

##これが正解
RewriteEngineをオーバーライドしないと上の処理が効くので、cake用のルーティングが行われて404が返るという事だったらしい。

```httpd.conf
<Directory /test/app/>
  RewriteEngine On
  RewriteRule ^$ webroot/    [L]
  RewriteRule (.*) webroot/$1 [L]
</Directory>


<Directory /test/app/webroot/>
  RewriteEngine On
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteRule ^ index.php [L]
  RewriteCond %{THE_REQUEST} "^(.+?) (.*?)/app/webroot/(.*?) (.+?)$"
  RewriteRule ^(.*?)$ %2/%3 [R=302,L]
</Directory>

Alias /test1   /test/app/View/test1
<Directory /test/app/View/test1>
  RewriteEngine On
  RewriteRule ^(.*)$ $1
  AllowOverride none
  Options -Indexes FollowSymLinks
</Directory>

```
ネーミングのルール

よく忘れるのでメモ．

# ネーミング全般

[メソッド名をシンプルにするために、知っておくと便利な英語のprefixとsuffix](http://blog.codic.jp/2014/12/22/shoud-know-prefix-suffix-for-naming/)
[クラスの命名のアンチパターン](http://qiita.com/magicant/items/8134edf969f9629fa66e)
[データ構造とメソッドのネーミング](http://blog.codic.jp/2015/02/10/data-structure-and-naming/)
[関数名によく使われる英単語（動詞）の意味とニュアンス](http://php-archive.net/php/words-in-function-names/)
[モデルやメソッドに名前を付けるときは英語の品詞に気をつけよう](http://qiita.com/jnchito/items/459d58ba652bf4763820)

## JavaScript
[Airbnb JavaScript スタイルガイド(){};](http://mitsuruog.github.io/javacript-style-guide/)
イディオムも含めて記述．Good, Badの記述もあり，禁則事項も記述されているので規約として使いやすい．
[JavaScriptにおける命名規則の個人的まとめ](http://analogic.jp/naming-convention/)
[MDN JavaScript style guide](https://developer.mozilla.org/ja/docs/JavaScript_style_guide)
[IT戦記 | サイボウズで学んだこと](http://d.hatena.ne.jp/amachang/20100917/1284700700)
ネーミングを含めた開発ノウハウが入っている．
スクリーンショットを撮って日付のディレクトリに連番で保存するスクリプト

スクリーンショットを撮る機会はなかなか多いと思うのですが、皆さんはどのようにされているでしょうか。Linuxでは[shutter](http://shutter-project.org/)というアプリケーションがスクリーンショットを撮るのには使いやすいかなぁと思うんですが、保存する際には毎回どこに保存するか指定しなければならず、僕の場合日付ごとにファイルを分けたいので、少し不便でした。それで、今回シェルスクリプトで簡単に書いてみました。必要なパッケージはimagemagickです。


下のスクリプトを

```
sh ~/bin/screenshot.sh
```

のようにオプション無しで実行すると、`rootdir`に指定したディレクトリ(下の例の場合`$HOME/Workspace/blog`)の中に、今日の日付のディレクトリがない場合には今日の日付を名前にしたディレクトリを作成し、その中に"screen_001.jpg"のように名前をつけて画面全体のスクリーンショットを保存します。ディレクトリの中に、同じ形式で名前が付けられたファイルがあった際には、その数字を読み取って、一番数の大きいものよりさらに一つ大きい数字をつけて保存します。

実際に使っていくとディレクトリ構造はこんな感じになっていきます。

![screen_001.jpg](https://qiita-image-store.s3.amazonaws.com/0/54869/31334120-9f7d-6593-f45f-92f18884fb34.jpeg)

保存が終わったら`notify-send`で保存したことを通知します。Macでは他の通知スクリプトがあると思うので、適宜そちらを使えば良いかと思います。


![screen_008.jpg](https://qiita-image-store.s3.amazonaws.com/0/54869/42649bde-8e08-faf5-5878-7fcbaffbb157.jpeg)

右上に通知が表示されています。

また、基本的にキーボード・ショートカットとして使うことを考えているので、コマンドラインから使う場面はあまり考えていないのですが、一応オプションを与えることもできます。"d"で(日付のディレクトリのかわりに)保存するディレクトリを絶対パスで指定することができます。"o"で保存する画像ファイルの名前を指定することができます。

ちなみに僕の場合はキーボードのPrintScreenを押した時は画面全体、Shiftを押しながらPrintScreenを押した時には範囲指定でスクリーンショットを撮るようにしています。

``` sh:screenshot.sh
#!/bin/sh
#

get_dir=false
get_name=false
rootdir=$HOME/Workspace/blog

if [ $# -le 0 ]; then
    while getopts d:o: OPT
    do
      case $OPT in
        "d" ) get_dir=true
              dir="$OPTARG" ;;
        "o" ) get_name=true
              name="$OPTARG" ;;
          * ) exit 1 ;;
      esac
    done
fi

# スクリーンショットを保存するディレクトリを設定
if ! $get_dir; then
    if [ ! -e $rootdir ]; then
        echo "There is no directory named: $rootdir"
        exit 1
    fi
    daydir=`date +%Y-%m-%d`
    dir=$rootdir/$daydir
fi

# ファイル名を設定
if ! $get_name; then
    if [ ! -e $dir ]; then
        mkdir $dir
        i=1
    else
        i=`expr $(ls $dir | sed -n 's/screen_\([0-9]\{3\}\).jpg/\1/p' | tail -n 1) + 1`
    fi
    name=$(printf screen_%03d.jpg $i)
fi

import -window root -quality 0 $dir/$name
# 範囲選択 (別ファイルに分けてもよい)
# import -quality 0 $dir/$name

notify-send "Screenshot has been made" "saved: $dir/$name"

exit 0
```

画像の加工や、ちゃんと名前をつけるなら,あとから手動でやらないといけないけど、とりあえず何も考えずにスクショを撮れるのは楽です。
StumpWMでtwmnを使う

StumpWMで通知のために[twmn](https://github.com/sboli/twmn)を使う方法のメモ。  

直接twmndを実行することもできるが、それをするとloadrcするたびにデーモンが新規で立ち上がってtwmndプロセスが大量発生する問題が発生するので以下のような補助スクリプトを組んで間接的に起動する。保存場所は割と適当なので任意に。 

尚、twmnはgithubから取ってくるなりArchならyaourtで入れるなりしてインストール済みとする。PATHは#p"/usr/bin/twmnd"に入ってるとする。

```sh:~/.stumpwm.d/helper/twmn/run.sh
#!/bin/sh

TWMND_PID=`ps aux | grep -v grep | grep twmnd | awk '{print $2}' | tr -d "\n"`
TWMND_COMMAND="/usr/bin/twmnd"

if test -x $TWMND_COMMAND ;then
    if test -z $TWMND_PID; then
        exec $TWMND_COMMAND
    else
        kill $TWMND_PID && exec $TWMND_COMMAND
    fi
else
    echo "twmnd command not found"
fi
```

で、~/.stumpwm.d/init.lispに以下を追記する。  

```cl:~/.stumpwm.d/init.lisp
;;; -*- Lisp -*-
(in-package :stumpwm)

(defvar *stumpwm-rc-directory*
  (merge-pathnames #p".stumpwm.d/" (user-homedir-pathname)))

;; blah blah blah

(cl-user::process-pid (run-shell-command (namestring
                                          (merge-pathnames #p"helper/twmn/run.sh"
                                                           *stumpwm-rc-directory*)
                                          ) nil))
```

追記: twmndが動いているとEmacsでalert.elなどを使っても通知できるようになるのでいろいろ便利に使えそうです。
MacOS XでVagrantにCentOS入れ、Railsアプリ制作、Heroku公開 vol.06

# Git 環境を整備

MacOS X Yosemite で Heroku にアプリを公開するまでの環境構築を何回かに分けて書きます。

vol.01 [VirtualBox インストール編](http://qiita.com/hirolog/items/560ce489dce08f555876) 
vol.02 [Vagrant インストール編](http://qiita.com/hirolog/items/79c294da5225827f3f75)
vol.03 [Vagrant box作成編](http://qiita.com/hirolog/items/a57692eae892e7cdb6a7)
vol.04 [VagrantのCentOS 6.5 仮想マシン(box）起動まで](http://qiita.com/hirolog/items/0603c0b8a8c7b89a0cd4)
vol.05 [Rails 開発環境準備](http://qiita.com/hirolog/items/759f15ce91ce4e783091)

も合わせてお読み下さい。（というか、先にこれらの操作が必要です）

さて、Herokuにアップするには Git の環境を整えておく必要あります。
Railsでアプリを作る前にも、Gitのようなバージョン管理の仕組みを導入しておいた方が良いでしょう。

## デフォルトの Git をアンインストール

```
git --version
```

で、現在のバージョンを確認します。おそらく、1.7.1辺りが入っていると思いますが、これはけっこう古いので Heroku では対応してません。
アンインストールしましょう。

```
sudo yum remove -y git
```

Gitを最新にするにはファイルを取ってきて make install しないとダメなようです。
色々とサーバの環境設定が先に必要です。

まずはファイルを持ってくるコマンド(wget)を入れます（そこからかい...）。

```
sudo yum -y install wget
```

次のURLで Git の最新版を確認しましょう。

[Git-core の最新版を探す](https://www.kernel.org/pub/software/scm/git/)

2015/03/01現在では、2.3.1が最新のようです。srcを置くディレクトリに移動し、[git-2.3.1.tar.gz]のURLをコピーして以下のような手順で進みます。
ディレクトリ移動、ファイル取得、解凍、元ファイル削除、できたディレクトリに移動、の順です。

※ 以下の情報は古かったです


```
cd /usr/local/src
sudo wget https://git-core.googlecode.com/files/git-1.9.0.tar.gz
sudo tar zvxf git-1.9.0.tar.gz
sudo rm git-1.9.0.tar.gz
cd git-1.9.0
```

※ こちらの方が最新です（2016.02.25 現在）

```
cd /usr/local/src
sudo wget https://www.kernel.org/pub/software/scm/git/git-2.7.2.tar.gz 
sudo tar zvxf git-2.7.2.tar.gz 
sudo rm git-2.7.2.tar.gz 
cd git-2.7.2
```

この後、configureを実行しても以下のようなエラーで止まることがあります。

```
Can't locate ExtUtils/MakeMaker.pm in @INC (@INC contains: /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at Makefile.PL line 3.
BEGIN failed--compilation aborted at Makefile.PL line 3.
make[1]: *** [perl.mak] Error 2
make: *** [perl/perl.mak] Error 2
```

なので、インストールするには先にコンパイルに必要なperl関連のものを入れてから configure、make、install の順です。よくわからない人はこのまま実行してください。

```
sudo yum -y install curl-devel
sudo yum -y install perl-ExtUtils-MakeMaker
sudo yum -y install zlib-devel
sudo yum -y install gcc
sudo yum -y install openssl-devel
sudo yum -y install gettext-devel
sudo ./configure --prefix=/usr/local/
sudo make prefix=/usr/local all
sudo make prefix=/usr/local install
```

※ 2016.02.08
zlibがないというエラーが出る事があるので、zlibのインストールも追加

* 2016.02.25
環境によっては CC でコンパイルエラーや、openssl周辺でエラーが出るのでこれも追加

これでインストール完了なので、バージョンを確認してみます。

```
git --version
```

gitのバージョンが表示されなかったら、アレコレ確認するより前にいったん Vagrant を exit して再度ログインして確認してみてください。

```
exit
(Vagrantを抜けて、Macのターミナル上で再度）
vagrant ssh
git --version
```

git version 2.3.1のように表示されれば完了です。

### キーワード

* MacOS X
* VirtualBox
* Vagrant
* CentOS
* Ruby on Rails
* RVM (Ruby Version Manager)
* Heroku
PHPSTORMで一括置換

#大量のファイルを一気に置換
日々の業務で数十個に及ぶファイルを書き換えなきゃいけない。なーんてことありますよね。
そんなときはPHPSTORMを使おう。

##なにがいいの？
* 指定ディレクトリ以下を一気に置換してくれる。
* 正規表現を使ってざっくりと指定できる。（諸刃の剣
* 置換する部分をずらーっと並べて、置換したいラインだけ選択できる。

##どうやってやるの？
通常の置換は command + Rで出てきますが、
一括置換をする場合は Shift + command + Rです。

ショートカット変更してる場合はPreferences開いて、検索窓に"replace in path"と入力すれば多分でてきます。

##つかえる機能

#### Text to find 
探すテキストを入れます。Optionsにチェックを入れる事で正規表現で検索したりもできます。

#### Replace With
Text to findで一致した部分に、ここで表記したテキストが置換されます。

* * *
### Options ([PHPSTORMのdoc](https://www.jetbrains.com/phpstorm/help/find-and-replace-in-path.html)を雑に和訳)
#### **Case sensitive**
検索時に小文字と大文字の区別をつけます。

#### **Preserve case**
一致した文章の最初の文字と同じ形式にして置換します。
Replace withに"yourtest"と入れた時、MyTestはYourtestに置き換わります。
Case sensitiveかRegular expressionsにチェックが入っている場合は無効。

このオプションはReplace in Path(一括置換)の時のみ有効です。

#### **Whole words only (多分はやい)**
単語全体にマッチします。
スペース、タブ、句読点（カンマとかピリオドとかかな）や特殊文字で分割されている文字列などです。
\*単語全体なのでcutで検索した場合はcutyやcuttingなどは引っかからなくなります。

Regular expressionsにチェックを入れてる場合は無効です。

#### **Regular expressions**
検索パターンが正規表現として扱われます。
チェックボックスの隣の[Help]を押せば正規表現のシンタックスが見れます。

#### **Context**
use this drop-down list to confine the search to a certain context, for example:

* **anywhere**　（PHPSTORM7にはないぽい）

全部探します。

* **In comments**　（PHPSTORM7だとComments only）

コメント部分のみ検索をかけます。他の部分では何も起こりません。（いいね

* **In string literals**　（PHPSTORM7だとString literals only）

文字型の部分のみ検索をかけます。

```php
$text = 'textここの文字型のtextだけ検索します'
```

* **Except...**　（PHPSTORM7にはないぽい）

上のIn commentsとIn string literals以外です。
コメントアウトされている部分と文字型は検索対象にならないという事だと思います。

* * *

#### Scope
ここはざっくりいきます。

* Whole project

プロジェクト全体ですね。

* Recursively

ここに入力したディレクトリ以下全てを検索します。

* Custom

カスタムスコープを使って検索する。同じ階層にあるディレクトリを複数個やりたい時はここ使うっぽいです。詳しくは[doc](https://www.jetbrains.com/phpstorm/help/scopes.html)みてちょ。

* * *
### File name filter
File maskを使って調べたいファイルの種類を限定できます。
*.phpにするとphpファイルのみ検索がかかります。ワイルドカードには\*と?を含みます。
複数指定する場合は、カンマでつなげてください。
*.php,*.html,*.txt

* * *
###　なんか良い使い方ない？

* スクレイピングしてきたHTMLがたくさんあって、しかもフッターのデザイン全部変えるのかよ、みたいな時

```html
<!-- header start -->
<header>
    div>ul>li>a
</header>
<!-- header end -->
```
みたいなパターンだと正規表現で一発解決ですね。
\<\!\-\-header start[\s\S]*header end\-\-\>こんな感じのをText to findにぶちこんで、Replace withに

```html
<!-- header start -->
<header>
    nav>ul>li>a
</header>
<!-- header end -->
```

みたいなのを **ワンライナー** にして（？！）Replace withにいれてあげましょう。

実はワンライナーにするときに前の一括置換のときにRegular expressionにチェックが入っている場合、ワンライナーにしたいものをPHPSTORM上でコピーしてから
command + shift + Rで一括置換してくれると正規表現でワンライナー化したやつがText to findに生成されるんです。
これをReplace withに置いてあげればすぐですね。
（Text Areaでやる方法はないのかな、こわいです）
VagrantでSSHが繋がらない

# 目的

Vagrantで仮想マシンを立ち上げる（`vagrant up`）

# 環境
* Windows7 Professional / 64bit
* VirtualBoxインストール済
* Vagrantインストール済

# 問題

SSHが繋がらない

# 対策

BIOS設定画面でVirtual Technologyを有効にする（intelの場合）
または、
BIOS設定画面でSecure Virtual Machine Modeを有効にする（AMDの場合）
新しいTestflightでGmailに招待状を送ってハマった


Internal Testersにアカウントを登録して「招待」までよかったが、Gmailへ招待送った時にTestflightアプリにテストしたいアプリが出てこない。

何度やってもうまくいかないと途方にくれいていたのですが、色々と試した結果以下の方法で解決できた。

つまり、
Gmailへ招待 -> iPhone Gmail App -> 招待メール -> Testflight
だとアプリが表示されないことがある？？？

###解決方法

1. SafariでItunes Storeにログイン
2. SafariでGmailにログイン
3. Safariで開いたGmailで受信した招待メールからTestflightへ接続

そしたらTestflightにアプリ一覧が出てきた。こんなことってあるのでしょうか？テスターのメールアドレスが招待したメールアドレスと表示アドレスが違うなど、何やら色々とバグがありそうな気がする。大分時間がとられてしまった。そもそも、解決になっているのかすら不明。

他に同様のケースにぶつかった方がいれば教えてもらいたい。
PUSH通知の確認を再度表示したい


アプリをアンインストール後、すぐに同じアプリをインストールしても通知の表示確認のダイアログは表示されず引き継がれる。

通知の確認を表示するには、アンインストール後1日以上経過する必要がある。

すぐに確認するためには

1. アプリをアンインストール
2. デバイスの電源OFF/ON
3. デバイスの日付を1日進める
4. デバイスの電源OFF/ON
5. アプリをインストール

という手順を踏む

# 参考

Troubleshooting Push Notifications
https://developer.apple.com/library/ios/technotes/tn2265/_index.html#//apple_ref/doc/uid/DTS40010376-CH1-TNTAG42
[python]rdflibを使って自作FusekiサーバにRDFトリプルを追加する方法

rdflibの扱い方を把握し切れてないので、暫定的な処理
[rdflibドキュメント](http://rdflib.readthedocs.org/en/latest/index.html)
＊事前にFusekiサーバを起動
`fuseki-server --mem --update --desc [ttl_file] /dataset` 

FusekiサーバにRDFトリプルを追加するコード

```python:rdf2fuseki.py
import rdflib
from rdflib import Graph,URIRef

if __name__ == '__main__':

    # 追加するRDFトリプルの用意
    bob    = URIRef("http://example.org#bob")
    like   = URIRef("http://example.org#like")
    tomato = URIRef("http://example.org#tomato")

    # Endpointの用意
    endpoint = r"http://localhost:3030/ds/query"
    store = sparqlstore.SPARQLUpdateStore()
    store.open((endpoint,r"http://localhost:3030/ds/update"))
    
    # 追加するGraph
    default_graph = URIRef('http://example.org/default-graph')
    ng = Graph(store, identifier=default_graph)
    ng.add((bob, like, tomato)) #RDFトリプルに追加

```

RDFトリプルは追加されるが、以下の警告がでるので改善が必要
```
WARN : Unrecognize request parameter (ignored): output
WARN : Unrecognize request parameter (ignored): format
WARN : Unrecognize request parameter (ignored): results
```
CocosConsoleの使い方

CocosConsoleはゲーム内にTCPサーバを立てネットワーク越しに実行中のゲームと通信する機能で、タッチイベントの発行やノードツリーの出力などができます。cocos2d-xに標準で搭載されており、CocosCodeIDEなどから利用されています。既存のコマンドを使用するだけでなく独自のコマンドを追加することも可能なので、デバッグや自動テストなど様々な応用が可能です。

## 初期化
ConsoleのインスタンスにはDirector経由でアクセスでき、listenOnTCPで接続を待機します。

```cpp
Console *_console = Director::getInstance()->getConsole();
_console->listenOnTCP(6010);
```

ゲーム内で上記コードが実行されていれば、あとはTCPで接続すればいいので、例えば対話的にコマンドを実行するpythonコードは以下のようになります。

```py:cocos_client.py
import os
import sys
from socket import *
from threading import Thread

CMD_PORT = 6010
BUFFER = 1024

cmdSocket = None

def receiver():
    while True:
        res = cmdSocket.recv(BUFFER)
        if len(res) == 0: break
        print(res)

if __name__ == "__main__":
    cmdSocket = socket(AF_INET, SOCK_STREAM)
    cmdSocket.connect((sys.argv[1], CMD_PORT))
    Thread(target = receiver).start()
    try:
        while True:
            cmdSocket.send(raw_input() + '\n')
    except:
        pass
    cmdSocket.send('exit\n')
    cmdSocket.close()
```

ゲームをエミュレータで実行している場合、localhostを指定すれば接続できます。

```shell-session
$ python cocos_client.py localhost
> 

```

## 代表的なコマンド
標準で搭載されているコマンドをいくつか紹介します

### help
登録されているコマンドとそのヘルプを一覧で表示します。

```shell-session
> 
help

Available commands:
	allocator		Display allocator diagnostics for all allocators
	config			Print the Configuration object
	debugmsg		Whether or not to forward the debug messages on the console. Args: [on | off]
	director		director commands, type -h or [director help] to list supported directives
...
```

### debugmsg
デバッグメッセージを受信します。cocos2d::logで出力されるメッセージが表示されるようになります。

```shell-session
>
debugmsg on
>
cocos2d: fullPathForFilename: No file found at src/main.luac. Possible missing file.

[LUA-print] [INFO]

[LUA-print] [INFO] # DEBUG                        = 2
[LUA-print] [INFO] #
[LUA-print] [INFO] # device.platform              = ios
[LUA-print] [INFO] # device.model                 = unknown
[LUA-print] [INFO] # device.language              = en
...
```

### scenegraph
現在のシーングラフをテキストで出力します。各文字列はNodeクラスのgetDescriptionで返される値を表示しているため、このメソッドを上書きすると独自の形式で表示できます。

```shell-session
> 
scenegraph
>
 <Scene | tag = -1>
- <Node | Tag = -1
- <Node | Tag = -1
-- <Sprite | Tag = -1, TextureID = 9>
-- <Menu | Tag = -1>
--- <MenuItem | tag = -1>
---- <Sprite | Tag = 1, TextureID = 10>
---- <Sprite | Tag = 2, TextureID = 10>
-- <Layer | Tag = -1>
Total Nodes: 9
```

### touch
画面をタッチします。オプションでスワイプも可能です。

```shell-session
> 
touch tap 100 100
> 
touch swipe 100 100 200 100
> 
```

その他、標準で搭載されているコマンドはこの辺りで一覧されています。
https://github.com/cocos2d/cocos2d-x/blob/cocos2d-x-3.4/cocos/base/CCConsole.cpp#L290

## コマンドの拡張
コマンドは独自に定義することもできます。例えば実行中のスクリーンショットを撮ってそのファイルパスを返すコマンドを登録するのは次のようになります。

```cpp
#include <sys/socket.h>

...

auto name = "ss";
auto help = "take screen shot";
auto callback = [](int fd, const string& args) {
    utils::captureScreen([fd](bool succeed, const string &outputFile) {
        send(fd, outputFile.c_str(), outputFile.size(), 0);
    }, "ss.png");
};
Director::getInstance()->getConsole()->addCommand({name, help, callback});
```
memcachedコマンド操作


##telnetで接続
```console:
# telnet localhost 11211
Trying ::1...
Connected to localhost.
Escape character is '^]'.

```

##データの格納
```console:
set key1 0 0 6
value1
STORED
```

ワンライナー

```
(echo "set key1 0 0 6"; sleep 0.5s; echo "value1"; sleep 0.5s;) | telnet localhost 11211
```

##データの取得
```console:
get key1
VALUE key1 0 6
value1
END
```

ワンライナー

```
(echo "get key1"; sleep 0.5s;) | telnet localhost 11211
```

##データの書換
```console:
replace key1 0 0 6
value2
STORED
```

##格納されているデータの後ろに追記
```console:
append key1 0 0 6
value3
STORED
get key1
VALUE key1 0 12
value2value3
```

##格納されているデータの前に追記
```console:
prepend key1 0 0 6
value1
STORED
get key1
VALUE key1 0 18
value1value2value3
END
```

##データの削除
```console:
delete key1
DELETED
```

##データの加算/減算
```console:
set key1 0 0 3
100
STORED
incr key1 1000
1100
decr key1 2000
0
delete key1
DELETED
```

##切断
```console:
quit
Connection closed by foreign host.
#
```

## キー一覧

```
#!/bin/bash -eu

IFS=$'\n'

hosts=(
  localhost
)

ports=(
  11211
  11212
  11213
)

for host in ${hosts[@]}; do
  for port in ${ports[@]}; do
    keys=()   
    echo "host:${host}:${port}"
    set +e
    items=$((echo 'stats items'; sleep 0.5s;) | telnet ${host} ${port} 2>/dev/null | egrep 'items:[0-9]+:number [0-9]+')
    set -e
    for item in ${items[@]}; do
      items=$(echo $item | perl -pe 's/^STAT items:([0-9]+):.+$/$1/')
      number=$(echo $item | perl -pe 's/^.+ ([0-9]+)$/$1/')
      keys+=($((echo "stats cachedump $items $number"; sleep 0.5s;) | telnet ${host} ${port} 2>/dev/null | egrep -v 'END|^Escape.+|^Trying.+|^Connected.+'))
    done

    for key in "${keys[@]+"${keys[@]}"}"; do
      echo $key | perl -pe 's/^ITEM (.+)?/$1/'
    done
  done
done
```
Web Audio APIを使ってブラウザで音楽を楽しむためのライブラリ、neume.jsを触ってみる

### ブラウザでも音が鳴るなにかをやりたくなったので

Web Audio APIは正直めんどくさい。

たとえば。

- [Web Audio APIの基礎](http://www.html5rocks.com/ja/tutorials/webaudio/intro/)
- [2 つの時計のお話 - Web Audio の正確なスケジューリングについて](http://www.html5rocks.com/ja/tutorials/audio/scheduling/)

。。。。ごめんなさい。難しくて、何書いてるか、ぜんぜんわかりません。。。。

というわけで、「私はWeb Audioはわからない！」と堂々と生きてきたわけですが、心の中では、「簡単に使える良いライブラリは無いものか？」と思い続けていたわけです。

そりゃ、音出せれば楽しいに決まってますからね！
ある日（結構前）、どこからか天の声が聞こえてきました。

「[neume.js](https://github.com/mohayonao/neume.js)使えや」

。。。。声が聞こえてきてから半年くらい経った気がするけど思い出して触ってみることにしましたw

## neume.jsとは

[@モハヨナオ](https://twitter.com/mohayonao)さんが作ってる、ブラウザで音楽を作るためのライブラリだそうな！

[neume.js - library for web audio programming「音の鳴るブログ」by モハヨナオさん](http://mohayonao.hatenablog.com/entry/2014/09/29/123242)で紹介されている。

[Githubのリポジトリはコチラ](https://github.com/mohayonao/neume.js)

Blogには、素のWeb Audio APIと比べると、音を鳴らすための処理がとても短く書ける、と書いてある。

確かに短い！ 22行が7行になってる。1/3！

オーディオ処理が判らない私にとっては、やはり身体で覚えるしかない！

サンプルを触りながら少しづつ覚えたいと思います。

### かっこいいサンプル

- [neume.js / Sine Storm](http://mohayonao.github.io/neume.js/examples/sine-storm.html)

サイン波が複雑に絡む心地よい音響作品。ビジュアルもかっこいいです。

- [neume.js / Buffer Work](http://mohayonao.github.io/neume.js/examples/buffer-work.html)

いわゆる「スライサー」ってやつですね。JavaScriptだけでやってるなんてスゴイ！


## [一番簡単そうなサンプル「metronome.html」を見てみる](https://github.com/mohayonao/neume.js/tree/master/examples/metronome.html)

すごそうなサンプルは、コードもすごそうなので、一番簡単そうな[metronome.html](https://github.com/mohayonao/neume.js/tree/master/examples/metronome.html)を見てみることにしました。

### 初期化 

これは、お決まりっぽいですね。

```js
var neu = neume(new AudioContext());
```

### 音を出す`neu.Synth()`

`metronome.html`では、`Sine()`という関数で、「ポン」という音を出す処理を作ってから、`neu.Synth()`に渡すこと音を出しているようです。

```js
neu.Synth(Sine, freq, dur).start(e.playbackTime);
```

`Sine()`の中身を見は下記のようになっています。

```js
function Sine($, freq, dur) {
  return $("sin", { freq: freq })
    .$("xline", { dur: dur }).on("end", $.stop);
}
```

`$("sin", { freq: freq })`の部分が、サイン波オシレータ、`$("xline", { dur: dur })`の部分が、時間で音量が変わる部分（？）、最後の`on("end", $.stop)`の部分が、音が鳴り終わったときに呼ばれる処理のようです。

試しに、`"xline"`の部分を、`"line"`に変えたら、音が滑らかに変化せずに、『ブチ』っと切れるようになりました。

また、`return $("sin", { freq: freq });` だけにすると、音が止まらなくなります。
（音量によっては耳がぁ！ってなるのでオススメはしませんw）

いろいろ実験して覚えていくと良さそうですね。


### タイミングよく音を出す`neu.Interval()`

neume.jsには、スケジューラも用意されているようです。
シーケンサーみたいなのが簡単に作れそうな気がしてきましたw

```js
timer = neu.Interval("4n", function(){
	
}).start();
```

上記のように書けば、定期的に指定した関数が呼び出されるみたいです。
試しに、`"4n"`を`"16n"`とかに変更してみると、細かく呼ばれるように。

たぶん`4n`とかって、「1小節につき4回呼ぶ」的な意味だと思う。

テンポはどーやって変えるのかな？と思い、`neu`オブジェクトを覗いてみたら、`neu.bpm`というプロパティが！

```
neu.bpm = 200;
```

と設定すればテンポも変えられるようです！
（デフォルトは120みたいです）

## 今日はここまで

今日はここまでです。

サンプルを触っただけですが、音が出るってやはり楽しい！
音が出せただけで感動。。。
引き続きさわってみようと思います！

[@モハヨナオ](https://twitter.com/mohayonao)さん、ありがとうございます！！！！
1日でsocket.ioを使ったゲームを作ってみた

## 概要

![スクリーンショット 2015-03-03 16.29.37.png](https://qiita-image-store.s3.amazonaws.com/0/32851/4e820199-60d3-b127-b2e8-93d3d079a75f.png)

[Rising Sun](http://rising.yudo.jp)

ただタップするだけのゲームです！
社内ハッカソンとして5名体制1日で作った、今のところ技術デモな感じのものです
こんなものも作れるのかー程度に参考にしていただけたらと思います

[Yudo](http://yudo.jp) がリリースをしています

## 使っているもの

socket.ioをフル活用しています
サーバーサイドはNode,クライアントはほぼ素のjavascriptと言った感じ

### サーバーサイド
[Node.js](http://nodejs.org)
[Socket.io](http://socket.io)
[Redis](http://redis.io)

### クライアントサイド
HTML5,CSS3,Canvas.. etc
[Socket.io](http://socket.io)
[jQuery](http://jquery.com)
[Remodal](http://vodkabears.github.io/remodal/)

## もう少し詳しく

チャットの部分はすごく簡単で、

```js:server.js
var io = require('socket.io');
socket.on('message', function(data) { // クライアントから'message'でdataを受け取った際のハンドラ
    io.emit('message', message); // すべてのクライアントへ送信
});
```

```js:client.js
var socket = io(SERVER_HOST); // サーバーと接続

// 送信処理
$('form').submit(function(){ // formのsubmitが押された時
    socket.emit('message', $('#input').val()); // サーバーへ'message'として#inputの内容を送信
    return false;
});

// 受信処理
socket.on('message', function(data) { //'message'でデータが来た時
    $('#message-box').append(data);  // #message-boxに追加
});
```

くらいのコードで、ほとんど完成してしまいます
（実際には、escape等の処理があるので簡略化したものですが

基本的にWebSocketの技術を利用していますが、対応していないブラウザ等にはCommet等の旧来技術を利用してくれ、
（かつそれを隠蔽してくれていて）とても優秀です
もちろん、モバイル等のプラットフォームでも問題なく使用出来ました

また、あるユーザーがタップした際に、他のユーザーはリアルタイムに見ることができるのですが、
チャットと同様に、tapされた際のイベントをサーバー経由で配信しています

## 最後に

socket.ioすごく便利です
リアルタイムWEBを実現する、現状で最良の手段ではないでしょうか
導入等も簡単にできるのでぜひぜひ導入を検討していただきたい&広めて行きたい次第です