OmniAICreator/Qiita-1.07M huggingface dataset:
Vagrant上のCentOSにNode.jsをインストール

http://nodejs.jp/
http://nodejs.org/

Node.jsっていまいち意味がわからないんですよね。
ESとかv8ってなんだよ。

http://nodejs.jp/nodejs.org_ja/
> Node.jsは高速でスケーラブルなネットワークアプリケーションを 簡単に構築するためにChrome の JavaScript 実行環境 上に構築されたプラットフォームです。 

http://ja.wikipedia.org/wiki/Node.js
> Node.js はイベント化された入出力を扱うUnix系プラットフォーム上のサーバーサイドJavaScript環境である

日本語でおｋ

[とりあえずVagrant](http://qiita.com/rana_kualu/items/51a7db79ff5891c8a69f)を起動。


## nodebrewをインストール

https://github.com/hokaccha/nodebrew
nodebrewはNode.js専用のバージョン管理ツールらしい。
ヘルプに従ってインストール。

```bash
$ cd .
$ curl -L git.io/nodebrew | perl - setup

> Bareword found where operator expected at - line 3, near "400 Bad" (Missing operator before Bad?)
> Bareword found where operator expected at - line 6, near "<p>Your" (Missing operator before Your?)
> syntax error at - line 2, near "html>"
> Execution of - aborted due to compilation errors.
```

あれ？
何故かワンライナーが使えないので[手動でゲット](http://git.io/nodebrew)。

```bash
$ wget git.io/nodebrew
$ perl nodebrew setup

> install nodebrew in $HOME/.nodebrew
> Add path: export PATH=$HOME/.nodebrew/current/bin:$PATH
```

インストールされたバージョンは0.7.4だった。


## nodebrewパスの追加

インストールの最後にexportしろやと言われたので実行。

```bash
$ export PATH=$HOME/.nodebrew/current/bin:$PATH
```

ついでに.bashrcにも入れとく。

```bash
$ vi .bashrc
```

`export PATH=$HOME/.nodebrew/current/bin:$PATH`を追加。

```bash
$ source ~/.bashrc
$ nodebrew help
```

コマンドが見つかりませんと言われなくなったら成功。


## Node.jsをインストール

全てnodebrewにお任せ。

```bash
# nodebrew自身を更新
$ nodebrew selfupdate
# 全バージョンを確認
$ nodebrew ls-remote
# 最新安定版をインストールする。コンパイルが遅い。
$ nodebrew install stable
# 最新安定版のコンパイル済のを入れてくれるらしい。早い。
$ nodebrew install-binary stable
# 使用するバージョンを選択
$ nodebrew use v0.10.29
# インストールされているバージョンを確認。currentが現在有効なバージョン。
$ nodebrew ls
```

[install-binary stable](http://webtech-walker.com/archive/2012/12/nodebrew_update.html)した。

実行時点での最新安定版はv0.10.29。

動作確認。

```bash
$ node -v
> v0.10.29
```

インストールできた。
ここまで管理者権限を一切使ってないのが不思議。


## JavaScriptファイルを作成

適当な場所にexample.jsを作成。
特にDocumentRoot以下とかでなくてもいい。
というかNode.jsはApacheやnginxと同等のWebサーバ的なものだったようだ。
ここまで進めてきて初めて知る真実。

中身は[基礎から学ぶNode.js](http://gihyo.jp/dev/serial/01/nodejs/0001)の流用。

```js
var http = require('http');
http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello World\n');
}).listen(1337, "192.168.33.10");
console.log('Server running');
```

極普通のJavaScriptである。
起動。

```bash
$ node path/to/example.js
> Server running
```

Node.jsが起動して192.168.33.10:1337を待ち受けるようになった。
簡単。
何故1337かは不明。

VirtualBox内のゲストOSのブラウザから192.168.33.10:1337にアクセス。

```html
Hello World
```

正常に動作した。

ホストOSのWindowsから192.168.33.10:1337にアクセス。

```html
このウェブページにアクセスできません
```

あれ？


## iptables編集

```bash
# service iptables stop
```

Windowsから192.168.33.10:1337にアクセス。

```html
Hello World
```

行けた。
iptablesで1337番ポートが塞がれていたせいだった。
単にオフにするとセキュリティ的に困るので、必要なポートだけ空ける。

```bash
# iptables -I INPUT 7 -p tcp --dport 1337 -j ACCEPT
# service iptables save
# service iptables restart
```

"7"は環境によって違う可能性があり、REJECTと書いてある行を指定する。
REJECTの直前にACCEPT行が挿入され、ポート1337が使えるようになった。

## おわりに

これでサーバサイドJavaScriptが書けるようになった。
が、特段JavaScriptが得意ってわけでもないし特にやりたいこともなかったので何をやったらいいのかわからない。
submodule の向き先 url を変更する



* `.gitmodules` の向き先を新しい url に書き換える


```bash
[submodule "lib/hoge"]
        path = lib/hoge
-       url = git@github.com:8mamo10/old.git
+       url = git@github.com:8mamo10/new.git

```

* この段階で `.git/config` を確認すると、まだ向き先が古いまま

```bash
[submodule "lib/hoge"]
        url = git@github.com:8mamo10/old.git
```

* sync コマンドを叩く

```bash
$ git submodule sync
Synchronizing submodule url for 'lib/hoge'
```

* `.git/config` の向き先が更新される

```bash
[submodule "lib/hoge"]
        url = git@github.com:8mamo10/new.git
```

* 動作確認がてら submodule update でもしてみると、変更後の url から fetch してくれるはず

```bash
git submodule update
```
DOMを縦の中央位置に置く方法


僕は今までDOMを中央位置に配置する際、

```
position: absolute;
top: 50%;
height: 200px;
margin-top: -100px;
```

というように、絶対位置でまず top: 50%; に配置したあと、
ネガティブマージンを使ってそのDOMの高さの半分だけ上に引き戻すという手法を使っていた。


しかし、もっとスマートなやりかたとして、

```
position: absolute;
top: 0;
bottom: 0;
height: 200px;
```

というように、position: absolute 指定した上で
top: 0; bottom: 0; とすることでも解決できる模様。

こっちのほうがスマート。
JSLintをignoreさせたいとき


外部ライブラリで定義されているクラス等を使う時、JS Linterがundefined警告をしてくる。

そんなときはその箇所だけJS Lintをignoreさせてあげましょう。

```
/* jshint ignore:start */
var engine = new RainyDay();
/* jshint ignore:end */
```

こんな感じ。
Qiita新着投稿100件のタグをd3.jsのForceレイアウトで表示 その２

[前回](http://qiita.com/tag1216/items/b7f846af66db30b8c393)のデモを変更して、タグの他に投稿も表示するようにしてみた。
四角のノードがタグ、円形のノードが投稿を表している。
各ノードはそれぞれのページへのリンクになっているので、クリックすると各ページを表示するようにしてある。

デモ
http://bl.ocks.org/tag1216/raw/76e6bba3fd1784eba83c/
ソース
http://bl.ocks.org/tag1216/76e6bba3fd1784eba83c/

![qiita-tag-force2.png](https://qiita-image-store.s3.amazonaws.com/0/35192/2ce09963-8ff4-f16d-61a4-dbe1919b83c5.png)

# 前回からの変更点

* 前回はタグのみをノードとして表示していたが、今回はタグの他に投稿もノードとして表示するようにした。
* タグノードにはタグのアイコン、投稿ノードには投稿者のユーザーアイコンを表示するようにした。
* ページ表示時にQiitaAPIでデータを取得する際に若干時間がかかるので、上部にメッセージを表示してみた。
* 前回は全データを一度に表示していたが、今回は1件ずつウェイトを入れて追加するようにしてみた。
iTunes Connectの4.7-inchと5.5-inchのStore提出画像の注意点

4.7-inchと5.5-inchのStore用に画像をアップロードした時に、以下のエラーでアップロードすることが出来ませんでした。

### 警告
`スクリーンショットにアルファチャンネルや透過を含めることができません。`

![new_itunes_connect.png](https://qiita-image-store.s3.amazonaws.com/0/38822/a6c66692-72e4-bbe4-5c84-8c9c7be3d31e.png)

### 解決策
- Macのプレビューの書き出しの時にアルファのチェックボックスを外す

![スクリーンショット 2014-09-15 20.24.01.png](https://qiita-image-store.s3.amazonaws.com/0/38822/2fb78daf-843b-a03e-0003-2a09051e9b78.png)

- Photoshop等で保存する時に、透過オプションを外す

以上のどちらかを行えば問題無くアップロード出来るようになります。
また、同様にアイコン画像に関しても透過する必要が無くなったみたいです。

### 参考
- [対処方法｜スクリーンショットにアルファチャンネルや透過を含めることはできません | ハナウタブログ](http://hnut.co.jp/blog/iphone/793)
Ruby | Collection Pipeline でランク集計を実装する

# Ruby | Collection Pipeline でランク集計を実装する

## 概要
Collection Pipeline でランク集計を実装します

Martin Fowler 氏の下記ページを参考にしました。
[Collection Pipeline](http://martinfowler.com/articles/collection-pipeline/)

## サンプル
### 仕様
プログラム言語に関するアンケートを行ったとします。
解答は言語名で記述されています。

言語でグループ化して、言語ごとの投票数を集計し、

* 言語別投票数の降順、言語名の昇順でソート
* 結果を Markdown （GitHub Flavored Markdown） の表形式で出力する

### 入力データ

~~~
Ruby
Ruby
Ruby
Java
JavaScript
C++
Ruby
Python
Bash
Ruby
Ruby
Perl
C
VB
PHP
JavaScript
VB
Java
JavaScript
Ruby
C
Pascal
PHP
Java
Python
Ruby
Python
C++
C
Java
Java
Python
Mathematica
JavaScript
PHP
Java
C
Scala
C
C
~~~

### プログラム

~~~ruby
require 'tbpgr_utils'

langs ="Ruby
Ruby
Ruby
Java
JavaScript
C++
Ruby
Python
Bash
Ruby
Ruby
Perl
C
VB
PHP
JavaScript
VB
Java
JavaScript
Ruby
C
Pascal
PHP
Java
Python
Ruby
Python
C++
C
Java
Java
Python
Mathematica
JavaScript
PHP
Java
C
Scala
C
C
"

def group_ranked_list(ary)
  list = ary.group_by.with_index(1) { |e|e }
    .map { |k, v| {language: k, count: v.size} }
    .sort { |a, b|
      (-(a[:count] <=> b[:count])).nonzero? ||
      a[:language] <=> b[:language]
    }.map { |e|e.values }
    rank(list)
end

def rank(ary)
  rank_count = 1
  [*0..(ary.size - 1)].each_with_object([]) do |i, memo|
    rank_count += 1 if i.nonzero? && (ary[i - 1].last != ary[i].last)
    memo << [rank_count] + ary[i]
  end
end

def headers
  <<-EOS
|Rank|Language|Count|
|:--|:--|:--|
  EOS
end

answer_langs = langs.each_line.map(&:chomp)

print headers + group_ranked_list(answer_langs).to_table(:left)

__END__
Array#to_table は TbpgrUtils gem (自作 gem) のメソッド。
二次元配列を Markdown のテーブルフォーマットに変換します。
TbpgrUtils は私の遊び場的ユーティリティ。実用性はない。
~~~

※多分もっと良い書き方があるでしょう。

## 出力

~~~markdown
|Rank|Language|Count|
|:--|:--|:--|
|1|Ruby       |8|
|2|C          |6|
|2|Java       |6|
|3|JavaScript |4|
|3|Python     |4|
|4|PHP        |3|
|5|C++        |2|
|5|VB         |2|
|6|Bash       |1|
|6|Mathematica|1|
|6|Pascal     |1|
|6|Perl       |1|
|6|Scala      |1|
~~~

## 出力を実際に Markdown として Qiita に貼り付け

|Rank|Language|Count|
|:--|:--|:--|
|1|Ruby       |8|
|2|C          |6|
|2|Java       |6|
|3|JavaScript |4|
|3|Python     |4|
|4|PHP        |3|
|5|C++        |2|
|5|VB         |2|
|6|Bash       |1|
|6|Mathematica|1|
|6|Pascal     |1|
|6|Perl       |1|
|6|Scala      |1|

## 参照
* Martin Fowler Collection Pipeline
    http://martinfowler.com/articles/collection-pipeline/

* tbpgr_utils gem
    https://github.com/tbpgr/tbpgr_utils
[Vim] ctrlp.vim で表示されるファイル一覧を更新する

Ctrl + p で ctrlp.vim を起動したあと、F5 キーを押すことでファイル一覧が更新されます。

下記を参考にしました。ありがとうございます。
http://stackoverflow.com/questions/8663829/vim-ctrlp-vim-plugin-how-to-rescan-files
Install Nginx(1.6.1)/PHP(5.6.0)/PHP-FPM/Redis(2.8.13)/MariaDB(10.1) on CentOS 7

#1. Install Nginx/PHP/PHP-FPM

First setup new packages source repos.

Remi Dependency on CentOS 7 and Red Hat (RHEL) 7

```
rpm -Uvh http://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-1.noarch.rpm
```

CentOS 7 and Red Hat (RHEL) 7

```
rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
```

Create file `/etc/yum.repos.d/nginx.repo` and add following content to repo file:

```
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=0
enabled=1
```

Then install nginx and php.

```
yum --enablerepo=remi,remi-php56 install nginx php-fpm php-common

yum --enablerepo=remi,remi-php56 install php-opcache php-pecl-apcu php-cli php-pear php-pdo php-mysqlnd php-pgsql php-pecl-mongo php-pecl-sqlite php-pecl-memcache php-pecl-memcached php-gd php-mbstring php-mcrypt php-xml

yum --enablerepo=remi,remi-php56 install php-redis

```

Last start all the services:

```
service php-fpm start
service nginx start
service redis start
```

Set SELinux to permissive mode:

```
setenforce 0 
```

#2. Install MariaDB

Remove old packages if alread installed before.

> yum remove mysql* mysql-server mysql-devel mysql-libs
> or yum remove  mariadb-libs-1:5.5.37-1.el7_0.x86_64

Then run commands to install MariaDB 10.1.

```
yum install MariaDB-server MariaDB-client
```

If no error raised, then start MariaDB:

```
/etc/init.d/mysql start
```


#3. Open ports for incoming requests

First run `iptables --line -vnL` to find the line number of the `REJECT` rule:

```
# iptables --line -vnL
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination
1    48563   67M ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            ctstate RELATED,ESTABLISHED
2       21  1434 ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0
3     101K 8704K INPUT_direct  all  --  *      *       0.0.0.0/0            0.0.0.0/0
4     101K 8704K INPUT_ZONES_SOURCE  all  --  *      *       0.0.0.0/0            0.0.0.0/0
5     101K 8704K INPUT_ZONES  all  --  *      *       0.0.0.0/0            0.0.0.0/0
6        0     0 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0
7     101K 8704K REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-host-prohibited
```

Here the number is 7 , So the new iptables rule will be:

```
iptables -I INPUT 7 -i em4 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT

iptables -I INPUT 7 -i em4 -p tcp --dport 3306 -m state --state NEW,ESTABLISHED -j ACCEPT
```

Don't forget to specify correct network interface if yours is not `em4`.


***reference:***

1. http://www.if-not-true-then-false.com/2011/install-nginx-php-fpm-on-fedora-centos-red-hat-rhel/
2. http://www.binarytides.com/open-http-port-iptables-centos/
3. http://www.unixmen.com/install-lemp-nginx-with-mariadb-and-php-on-centos-6/
Clojureの基本練習

Clojureの練習でAOJの簡単な問題を解いています．
より良い解法とかありましたら是非教えてくださいm(_ _)m

#No.0000 九九を表示させるプログラム(QQ)

標準出力で以下のように出力する

```
1x1=1
1x2=2
.
.
.
9x8=72
9x9=81
```

九九の結果を出すだけならforのリスト内包表記で簡単です．

```clj
(for [x (range 1 10)
      y (range 1 10)]
 (* x y))
```
とすると

```
(1 2 3 4 5 6 7 8 9 2 4 6 8 ... 54 63 72 81)
```

みたいなリストが得られます．今回は一行ずつ改行しながら出力したいのでprintlnをつけてみます

```clj
(for [x (range 1 10)
      y (range 1 10)]
 (println x "x" y "=" (* x y)))
```
とやってみましたが，結果は

```
(1 x 1 = 1
1 x 2 = 2
1 x 3 = 3
1 x 4 = 4
1 x 5 = 5
1 x 6 = 6
1 x 7 = 7
1 x 8 = 8
1 x 9 = 9
nil nil nil nil nil nil nil nil 2 x 1 = 2
2 x 2 = 4
2 x 3 = 6
2 x 4 = 8
.
.
.
8 x 7 = 56
8 x 8 = 64
8 x 9 = 72
nil nil nil nil nil nil nil nil nil 9 x 1 = 9
9 x 2 = 18
9 x 3 = 27
9 x 4 = 36
9 x 5 = 45
9 x 6 = 54
9 x 7 = 63
9 x 8 = 72
9 x 9 = 81

nil nil nil nil nil nil nil nil nil nil)
```
これってprintlnが返してるnilが毎回出ちゃってるのかな?よくわからん．
nilが入らないようにする方法をTwitterで呟いたら教えていただきました．ありがとうございます．

<blockquote class="twitter-tweet" lang="ja"><p><a href="https://twitter.com/ayihis">@ayihis</a>&#10;(println&#10; (clojure.string/join&#10; &quot;\n&quot;&#10; (for [x (range 1 10)&#10; y (range 1 10)]&#10; (str x &quot;*&quot; y &quot;=&quot; (* x y)))))</p>&mdash; か (@ka_) <a href="https://twitter.com/ka_/status/511145938077769729">2014, 9月 14</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet" lang="ja"><p><a href="https://twitter.com/ayihis">@ayihis</a> <a href="https://twitter.com/ka_">@ka_</a> forの代わりにdoseqを使ってもできます (doseq [x (range 1 10), y (range 1 10)] (println x “*” y “=“ (* x y)))</p>&mdash; えいとす (a.k.a あちょす) (@athos0220) <a href="https://twitter.com/athos0220/status/511170783666647040">2014, 9月 14</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

1つ目の解決策はjoinを使って改行を差し込んでいくパターン．

```clj
(println
   (clojure.string/join
    "\n"
    (for [x (range 1 10)
          y (range 1 10)]
      (str x "x" y "=" (* x y)))))
```
2つ目の解決策はdoseqを使って繰り返し処理をするパターン

```clj
(doseq [x (range 1 10)
          y (range 1 10)]
    (println x "x" y "=" (* x y)))
```

#No.0002 数列のソートと出力(List of Top 3 Hills)

標準入力から，0 <= x <= 100000の範囲の数値を10個読み込み，大きい順に3つを出力する．

```
# sample input
1819
2003
876
2840
1723
1673
3776
2848
1592
922

# sample output
3776
2848
2840
```

よくわからなかったのが，「10行読み込む」という処理をどう書くか．doseqでループを10回して(lead-line)でなんとかした．

あと，出力するときに，リストでは無く，数値を一つずつ改行して出力しなきゃいけないのは．No0000で使った手を流用．

```clj
(import java.lang.Integer)

(def input (ref ()))

(defn add-input [ipt]
  (dosync (alter input conj ipt)))

(defn input-10-data []
  (doseq [x (range 10)]
    (add-input (Integer/parseInt (read-line)))))

(defn print-sorted-3-data []
  (println
   (clojure.string/join
    "\n"
    (take 3 (sort > (deref input))))))

(defn reset-input []
  (dosync (ref-set input ())))

(defn -main [& args]
  (input-10-data)
  (print-sorted-3-data))

```
FuelPHP & Twig で truncateフィルタを使う方法


概要
---
FuelPHPでテンプレートエンジンにTwigを使用していてtruncateフィルタを使いたくなったんだけどFuelPHPデフォルトでは使えず。ググってもこれといった資料が見つからず試行錯誤してなんとか使えるに至ったのでメモ。

やりたいこと
---
truncateは[こちら](https://github.com/fabpot/Twig-extensions/blob/master/lib/Twig/Extensions/Extension/Text.php)
こんな感じに長い文字列をview内で切り詰めたい

```twig
<span>{{ long_description|truncate(30) }}</span>
```

方法
---

### 1. twig/extensions をインストールする

```
$ php composer.phar require twig/extensions "~1.0"
```

### 2. config/parser.php を編集する

```php:fuel/app/config/parser.php
	'View_Twig' => array(

		....

		'extensions' => array(
			'Twig_Fuel_Extension',
			'Twig_Extensions_Extension_Text',  //追加！
		),
	),
```
[Git] 複数のコミットを一つにまとめるメモ


開発で行ったり来たりして結局コミットを一つにまとめたくなったら。

```
git rebase -i sample~3
```

これを実行すると、エディタが立ち上がって、sampleブランチの直近3個のコミットが見れます。
以下この3つのコミットを一つにまとめてみる。

```
pick 7625600 コミット1
pick 3942dac コミット2
pick 2eb7f04 コミット3
```

2行目以降の```pick```を全部```squash```に変更。

```
pick 7625600 コミット1
squash 3942dac コミット2
squash 2eb7f04 コミット3
```

保存するとエディタが立ち上がって、まとめたコミットメッセージを書けるので編集して保存で終了。
新しくなったiTunes Connectでのアプリの申請方法について

##新しいiTunes Connect

iPhone6, iPhone6 Plus や Apple Watchの発表会があった次の日から、iTunes Connectにも大きな変化がありました！
とりあえず、どんな感じか見てみましょう。

###はい、どーん！

![スクリーンショット 2014-09-15 15.15.17.png](https://qiita-image-store.s3.amazonaws.com/0/46227/36ad1e99-3e30-aacb-c1e4-c4f2d089d2bd.png)

###なんじゃこりゃー！
以前の見た目とは似ても似つかない感じになっちゃってますね（笑）

ページ内のテキストは日本語が多くなって、敷居が下がった感はありますが、、、

以前から使っている人からすると、変更されすぎてて涙目ですわー


##新しい申請方法

###１.アプリを登録する
Appの管理 -> 「＋」ボタンで新しく申請するアプリを登録します。
その後は、基本的なアプリの情報（タイトル、説明、検索キーワード、アイコン、スクリーンショット、レーティングなど）をすべて入力します。
入力内容を詳しく知りたい人は、以下のサイトを参考にしてください！

####iPhoneアプリ開発とアフィリエイトとFXby津軽為信
http://ameblo.jp/tsugarutamenobu/entry-11566208395.html

ここらへんは、前と同じですね！

###２.Xcodeからアプリを送信する
Xcodeで申請するアプリのプロジェクトを立ち上げ、ツールバーからProduct -> Archiveを選択します。
Archiveが完了したら、Validate -> Distribute でアプリをiTunes Connectに送信します。

いままでだと、ここまででアプリの申請が完了して、「Waiting For Review」になっていたのですが、新しい申請方法では、ここで完了ではありません。

###３.iTunes Connectでビルドを追加する
送信が完了すると、iTunes Connect -> Appの管理 -> 自分のアプリ に戻ります。
「ビルド」というところで先ほど送信したアプリのビルドプロジェクトを選択します。
この新しい方法については、以下のサイトでも教えてくれます！

####リニューアル後の iTunes Connect で新規バージョン追加時の注意点と手順
http://qiita.com/mox2/items/a9fe906f5f445dbeacce

ちなみに、再申請の際にビルドプロジェクトを上げ直す場合は、以下のサイトを参考にしましょう！

####【アプリ申請】iTunes Connectが新しくなった！！　申請取り下げバイナリの再アップする方法
http://bribser.co.jp/blog/new-itunes-connect/

ここまですると、ようやく「レビュー審査のために送信」が選択できます！
「Waiting For Review」まで、あと一歩です！

###４.IDFAの質問に答える
最後に、申請前にお決まりのIDFAの質問に答えます。
広告が無い場合は困らないのですが、広告をアプリ内に入れている場合は、以下のサイトを参考に答えましょう！

####アプリで飯を食う：iOSアプリ申請時のIDFAの質問はこう答えるべし-
http://kojisatoapp.blogspot.jp/2014/04/iosidfa.html

ここまですると、ようやく申請完了です！お疲れさまでした！

##参考にしたサイト一覧

####iPhoneアプリ開発とアフィリエイトとFXby津軽為信
http://ameblo.jp/tsugarutamenobu/entry-11566208395.html

####リニューアル後の iTunes Connect で新規バージョン追加時の注意点と手順
http://qiita.com/mox2/items/a9fe906f5f445dbeacce

####【アプリ申請】iTunes Connectが新しくなった！！　申請取り下げバイナリの再アップする方法
http://bribser.co.jp/blog/new-itunes-connect/

####アプリで飯を食う：iOSアプリ申請時のIDFAの質問はこう答えるべし-
http://kojisatoapp.blogspot.jp/2014/04/iosidfa.html
Swiftで文字列の分割と連結 (split & join)


NSString/NSArrayの時と比べると大分タイプ数が減ってすっきりしました。
joinとsplitはビルドイン関数になりました。

## 文字列の分割 split

```swift:NSArray(旧)
let csvRow = "one,two,three" as NSString
let cells = csvRow.componentsSeparatedByString(",")
// ["one","two","three"]
```

```swift:Array(新)
let csvRow = "one,two,three"
let cells = split(csvRow, { $0 == "," })
// ["one","two","three"]
```

## 文字列の連結 join

```swift:NSArray(旧)
let cells = ["one", "two", "three"] as NSArray
let csvRow = cells.componentsJoinedByString(",")
// "one,two,three"
```

```swift:Array(新)
let cells = ["one", "two", "three"]
let csvRow = join(",", cells)
// "one,two,three"
```
devise専用エラーをbootstrap3のエラーと同様に表示する

# やりたいこと

devise専用のエラー表示（devise_error_messages!）を、
他のalertと同じようにBootstrap3を利用した表示方法に置き換えたい。

![devise.jpg](https://qiita-image-store.s3.amazonaws.com/0/52535/891a5450-b634-0474-7cfb-d05c63b4e848.jpeg)

　▽　▽　▽　▽　▽　▽　▽　▽　▽　▽　▽　▽　▽

![bootstrap3.jpg](https://qiita-image-store.s3.amazonaws.com/0/52535/0739bcab-874e-29c1-77d5-9264dbbbecec.jpeg)



# 実装方法

deviseのヘルパーを作って"devise_error_messages!"をオーバーライドした箇所で整形。
あまりスマートではないかもしれませんが、これが一番簡単そうですね…。


```rb:app/helpers/devise_helper.rb
module DeviseHelper
  def devise_error_messages!
    return "" if resource.errors.empty?

    html = ""
    messages = resource.errors.full_messages.each do |errmsg|
      html += <<-EOF
      <div class="alert alert-danger alert-dismissible" role="alert">
        <button type="button" class="close" data-dismiss="alert">
          <span aria-hidden="true">&times;</span>
          <span class="sr-only">close</span>
        </button>
        #{errmsg}
      </div>
      EOF
    end
    html.html_safe
  end

  def devise_error_messages?
    resource.errors.empty? ? false : true
  end

end
```
milkcocoaを「DBをフロントに持ってきたオモチャ」だと思っている人はそろそろ認識を改めたほうが良いかもしれない

## tl;dr
　[@_sgtn](http://twitter.com/_sgtn)です。Dockerが既存のありふれた技術を組み合わせて利便性を向上させた結果、人気を博したのは記憶に新しいと思います。
　[milkcocoa](https://mlkcca.com)も同様にnodejs, mongodb, socketioを組み合わせてフロントエンドアーキテクチャの考え方を少しだけ変えうると思っているので、簡潔に紹介しようと思います。

![diagram](https://qiita-image-store.s3.amazonaws.com/0/54243/7cb14e20-23e4-e324-da12-e2a60094cd3a.png)
今日は[@syuhei_hiya](https://twitter.com/syuhei_hiya)が[cacooっぽいの](http://drawing.mlkcca-app.com/)を作ってました。1日1プロトタイプですね。

## 知っておいてもらいたい4つの関数
### dataStore.query({}).done(function(){})
　ユーザーが初めてそのSPA(シングルページアプリケーション)に訪れた際に、レンダリングするデータを取得する役割を持つパターンが多いです。そのデータストアから全てのデータを取得します。

### dataStore.push()
　データの保存に使用します。マウスイベントの全てを保存しても全く問題のないタフな奴です。

### dataStore.send()
　ユーザー間でオブジェクトの位置情報やアクションを共有する際に利用するパターンが多いです。socket.ioを用いて他のブラウザに約20~100msでデータを送信します。

### dataStore.on(event, function(e){})
　あるユーザーのイベントのコールバック関数を、milkcocoaでコネクションを確立している全てのユーザーで実行したいときに使用するパターンが多いです。pushイベントやsendイベントを監視しているクライアントだけがデータを受信できます。

## これらの関数が何を抽象化して新しい概念を生んだか
　milkcocoaが生んだ概念は２つあります。ひとつは、イベントの全ユーザーでの共有が当たり前のように簡単になったことです。あるユーザーが起こしたイベントを、そのSPAを仕様する全てのユーザーでリアルタイムに共有するためのバックエンドを作るのは骨が折れます。少なくとも日曜日のハッカソンで利用するような代物ではありませんでした。しかし、[mikumap](http://mikumap.mlkcca-app.com)や[milkchat](http://milkchat.herokuapp.com/)のように、数日で作るカジュアルなアプリに当たり前のように取り入れることが可能になりました。「DOMイベントをひとつのブラウザだけのものとせず、全てのユーザーで共有した」とも言えるかもしれません。

　もうひとつは、データの階層化がフロントエンドエンジニアが片手間に行えるほどに容易になったことです。mikumapの[FF7板](http://mikumap.mlkcca-app.com/mikumap.html#ff7)などを見ていただきたいのですが、URLのハッシュ値で板を区別しています。このハッシュ値がひとつのデータストアに対応しているので、板のデータを区別し、新しい板を簡単に作成し、板ごとにアクセス権限を付与するなどが直感的に理解できるようになりました。フロントエンドエンジニアとバックエンドエンジニアの境目を少なくすることで、より柔軟でアイデアを殺さないプログラミングスタイルが実現できると思っています。

![mikumap](https://qiita-image-store.s3.amazonaws.com/0/54243/a7c314ad-e3db-5c62-4a89-cb55d8c83aaf.png)

## 道具は思考を支配する。
　自分が何を使えるかは、無意識にアイデアの限界を決めます。もし、何か制限があって諦めていることがあるなら、[milkcocoa](https://mlkcca.com)で遊んでみて、新しいパラダイムを吸収してみるのも一興かと思います。

P.S. プロフェッショナル版を開発中です
Calendar Resourceの予定

Google AppsにはGoogle Calendar Resource（会議室や、プロジェクタなどの設備情報）という機能があります。個人のカレンダーの招待者として設備を招待すると、設備の利用状況を管理できるというものです。さらに、設備自身もカレンダーを持っており、この設備カレンダーには設備を招待した各個人の予定が配置され、設備がいつ誰の予定で使用されるのか、を確認できます。

## 設備カレンダーに予定を作成するには？

冒頭に述べた仕様です。

* 個人の予定に設備を招待する
* 招待された設備は、他の予定に同時刻使われていなければ、自動的に招待に応じる（Acceptする）
* 設備カレンダーの予定として見えるようになる

余談：個人の予定と設備カレンダーの予定は、APIの内部的には別のIDがふられます。

## 個人の予定に招待する以外の方法で設備カレンダーに予定を作成する

管理者権限をもったユーザであれば、設備カレンダーを自身のカレンダーとして登録することで、UIから直接設備カレンダーに予約を作成する事ができます。

APIで使用するときには、管理者権限を持ったユーザによる認可操作、またはService Account（Domain Wide Delegation）を使って、操作ユーザとして管理者権限を持ったユーザを設定すれば、設備カレンダーに予定を作成できます。

Google Calendarの正しい使い方ではないと思いますが、別のカレンダーシステムからの移行などでアカウントとカレンダーが完全に一致しないが設備カレンダーのみは利用したい、といった時に使えそうです。
フィボナッチ数個の要素からなる木を表す非正則な代数的データ型

非正則データ型 (non-regular data type) というのは、再帰的な代数的データ型のうち、定義において自身を呼び出すときの引数が左辺と異なるものです。下の例では、左辺では `F a b` ですが右辺では引数が変わり `F b (a,b)` となっています。

非正則データ型は単純ですが奥が深いです。昔から知られているものだと[完全二分木やドブラウン (de Bruijn) インデックスのラムダ項](http://www.cs.ox.ac.uk/richard.bird/online/BirdMeertens98Nested.pdf)、最近だと[フリーアプリカティヴ](http://hackage.haskell.org/package/free/docs/Control-Applicative-Free.html) や [FunList](http://twanvl.nl/blog/haskell/non-regular1) や [Bazaar](https://hackage.haskell.org/package/lens/docs/Control-Lens-Internal-Bazaar.html) などが有名です。ちなみに完全二分木は[『関数プログラミングの楽しみ』第10章](http://www.soi.city.ac.uk/~ross/papers/fop.html)でバタフライ回路の記述のために、アローと組み合わせて活用されています。

いろいろ別のことを考えていたらそういえば完全二分木だけでなくてフィボナッチ数個の要素からなる木も作れるな、と思って書いてみました。実用例は思いつきませんが、複数引数の非正則データ型の例として参考になるかもしれません。

```hs
-- fibonacci-number-element tree
newtype Fib a = Fib {unFib :: F a a}
data F a b = DoneF b | MoreF (F b (a, b))

-- binary tree
data Bin a = Leaf a | Node (Bin a) (Bin a)
instance Functor Bin where
	fmap f (Leaf a) = Leaf (f a)
	fmap f (Node l r) = Node (fmap f l) (fmap f r)
join :: Bin (Bin a) -> Bin a
join (Leaf b) = b
join (Node l r) = Node (join l) (join r)

-- fmap for fibonacci-number-element tree
instance Functor Fib where
	fmap f (Fib x) = Fib (bimap f f x)
bimap :: (a -> a') -> (b -> b') -> F a b -> F a' b'
bimap g h (DoneF b) = DoneF (h b)
bimap g h (MoreF x) = MoreF (bimap h (\(a,b) -> (g a, h b)) x)

-- fibonacci-number-element tree to binary tree
treeifyFib :: Fib a -> Bin a
treeifyFib = fmap (\e -> case e of Left a -> a; Right a -> a) . treeifyF . unFib
treeifyF :: F a b -> Bin (Either a b)
treeifyF (DoneF b) = Leaf (Right b)
treeifyF (MoreF f) = join $ fmap (\e -> case e of
	Left b -> Leaf (Right b); Right (a,b) -> Node (Leaf (Left a))
	(Leaf (Right b))) (treeifyF f)
```

ghci で型を確かめてみると、要素の数が確かにフィボナッチ数個になっています。

```hs
> :t Fib . MoreF . MoreF . MoreF . MoreF . MoreF . DoneF
Fib . MoreF . MoreF . MoreF . MoreF . MoreF . DoneF
  :: (((a, a), (a, (a, a))), ((a, (a, a)), ((a, a), (a, (a, a)))))
     -> Fib a
```
POSIX_ME_HARDER

[POSIX_ME_HARDER](http://wiki.wlug.org.nz/POSIX_ME_HARDER) という古いjargonがある。POSIX的に正しい挙動をさせるたい時に設定する環境変数だったらしいが、後に`POSIXLY_CORRECT`という名前に置き換えられた。

この`POSIXLY_CORRECT`は現在でも有効のようだ。例えば、`df`はデフォルトでブロック数を1KiB単位で表示するが、`POSIXLY_CORRECT`ありだと512B単位で表示するようになる。

```shell-session
$ rpm -qf $(which df)
coreutils-8.21-13.fc19.x86_64
$ df
Filesystem     1K-blocks    Used Available Use% Mounted on
/dev/sda3       30310428 7381132  21366572  26% /
devtmpfs         1019716       0   1019716   0% /dev
tmpfs            1025140       0   1025140   0% /dev/shm
tmpfs            1025140     288   1024852   1% /run
tmpfs            1025140       0   1025140   0% /sys/fs/cgroup
tmpfs            1025140       4   1025136   1% /tmp
/dev/sda1         487652   91254    366702  20% /boot
$ env POSIXLY_CORRECT= df
Filesystem     512B-blocks     Used Available Use% Mounted on
/dev/sda3         60620856 14762264  42733144  26% /
devtmpfs           2039432        0   2039432   0% /dev
tmpfs              2050280        0   2050280   0% /dev/shm
tmpfs              2050280      576   2049704   1% /run
tmpfs              2050280        0   2050280   0% /sys/fs/cgroup
tmpfs              2050280        8   2050272   1% /tmp
/dev/sda1           975304   182508    733404  20% /boot
$ env POSIX_ME_HARDER= df
Filesystem     1K-blocks    Used Available Use% Mounted on
/dev/sda3       30310428 7381132  21366572  26% /
devtmpfs         1019716       0   1019716   0% /dev
tmpfs            1025140       0   1025140   0% /dev/shm
tmpfs            1025140     288   1024852   1% /run
tmpfs            1025140       0   1025140   0% /sys/fs/cgroup
tmpfs            1025140       4   1025136   1% /tmp
/dev/sda1         487652   91254    366702  20% /boot
```

`POSIX_ME_HARDER`は効かなかった。
cocos2d-xのHttpClientがSSL証明書のチェックをできるようにした

本家にプルリク出したらマージされました。
https://github.com/cocos2d/cocos2d-x/pull/8029

cocos2d-xのHttpClientは、内部で使用しているcurlのオプションでSSL証明書のチェックが無効化されていたので、これを有効化できるようにしました。

```cpp
auto path = FileUtils::getInstance()->fullPathForFilename("cacert.pem");
HttpClient::getInstance()->setSSLVerification(path);
```

こうすると、ローカルに持っているSSLのルート証明書を使って、ちゃんと意図したサーバーに接続しようとしているかを検証できます。
UPDATE文の評価順序

#目的
MariaDB,PostgreSQLのUPDATE文の挙動の違いを見る

環境
OS:Ubuntu14.04
DB:MariaDB 10.0.11 InnoDB、 PostgreSQL 9.3.5
thinkpad T440p

#テーブルとデータ

```create_data.sql
CREATE TABLE IF NOT EXISTS hoge(
       id SERIAL,
       col1 INT NOT NULL DEFAULT 0,
       col2 INT NOT NULL DEFAULT 0,
       col3 INT NOT NULL DEFAULT 0,
       PRIMARY KEY (id)
);

INSERT IGNORE INTO hoge (col1,col2,col3) VALUES (1,10,100);
```

#PostgreSQL

```
test=# select * from hoge;
 id | col1 | col2 | col3 
----+------+------+------
  1 |    1 |   10 |  100
(1 row)

test=# BEGIN;
BEGIN
test=# UPDATE hoge SET col1=col1+1,col2=col1+col2,col3=col2+col3;
UPDATE 1
test=# select * from hoge;
 id | col1 | col2 | col3 
----+------+------+------
  1 |    2 |   11 |  110
(1 row)

test=# ROLLBACK;
ROLLBACK
```

#MariaDB

```
MariaDB [test]> select * from hoge;
+----+------+------+------+
| id | col1 | col2 | col3 |
+----+------+------+------+
|  1 |    1 |   10 |  100 |
+----+------+------+------+
1 row in set (0.00 sec)

MariaDB [test]> 
MariaDB [test]> BEGIN;
Query OK, 0 rows affected (0.00 sec)

MariaDB [test]> update hoge set col1=col1+1, col2=col1+col2, col3=col2+col3;
Query OK, 1 row affected (0.01 sec)
Rows matched: 1  Changed: 1  Warnings: 0

MariaDB [test]> select * from hoge;
+----+------+------+------+
| id | col1 | col2 | col3 |
+----+------+------+------+
|  1 |    2 |   12 |  112 |
+----+------+------+------+
1 row in set (0.00 sec)

MariaDB [test]> ROLLBACK;
Query OK, 0 rows affected (0.02 sec)
```

#結果
PostgreSQLはupdateを評価する際に自身の更新が見えないようになっているのに対して
MariaDBでは左から右へ評価されているので結果が異なります。
SQL92の13.10では「6) The value expressions are effectively evaluated for each row of T before updating any row of T.」と書かれているのでPostgreSQLのほうが標準SQLの動作と一致しています。
http://www.contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt

MySQLでも「Single-table UPDATE assignments are generally evaluated from left to right.　This behavior differs from standard SQL. 」と書かれているのでMariaDBと同様の結果になります
http://dev.mysql.com/doc/refman/5.6/en/update.html
APIから受け取ったDictionaryの「__default」


APIにリクエストして返り値を受け取っている。

```objc
NSString *json = [[NSString alloc] initWithData:【DATA】 encoding:NSUTF8StringEncoding];
NSURL *url = [NSURL URLWithString:@"【URL】"];
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url];
[request setHTTPMethod:@"POST"];

NSString *body = [NSString stringWithFormat:@"RegisterData=%@",json];

[request setHTTPBody:[body dataUsingEncoding:NSUTF8StringEncoding]];

NSData *response = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];

NSDictionary *info = [NSJSONSerialization JSONObjectWithData:response options:0 error:nil];

NSLog(@"%@", info);
```

返り値の中身

```
2014-0X-XX 16:15:14.299 XXXX[7768:60b] {
    error = 0;
    isSuccess = 1;
    memberInfo =     {
        birthday =         {
            "__default" = "1980/07/01";
        };
    };
    status = 200;
}
```

この、**"__default"** ってなんでつくんだろう・・

### 解決
API側でPHPを使っているのですが、Splモジュールの影響でした（汗

```php
$birthday    = new \SplString($args['birthday']);

return [
    'isSuccess'  => $result,
        'memberInfo' => [
            'birthday'   => $birthday,
        ],
    ];
```

こんなんしていたので・・・
（しかも、値の内容のテスト書いてなかった・・・）

```php
$birthday = $args['birthday'];
new \SplString($birthday);

return [
    'isSuccess'  => $result,
        'memberInfo' => [
            'birthday'   => $birthday,
        ],
    ];
```

こんな感じに修正
Redcarpetの:fenced_code_blocksが有効にならなくてちょっとハマった


- [vmg/redcarpet](https://github.com/vmg/redcarpet/)

RedcarpetはマークダウンをパースしてHTMLを出力するのに使うgem。

# 動作確認

## 入れる
```bash
gem install redcarpet
```

## 使う

```pry
[2] pry(main)> require 'redcarpet'
=> true
[3] pry(main)> Redcarpet
=> Redcarpet
[4] pry(main)> text = "# Markdown\nMarkdown is great."
=> "# Markdown\nMarkdown is great."
[6] pry(main)> renderer = Redcarpet::Render::HTML.new
=> #<Redcarpet::Render::HTML:0x007fc54ce196f0>
[7] pry(main)> markdown_parser = Redcarpet::Markdown.new(renderer, extensions = {})
=> #<Redcarpet::Markdown:0x007fc54cc28af8 @renderer=#<Redcarpet::Render::HTML:0x007fc54ce196f0>>
[8] pry(main)> markdown_parser.render(text)
=> "<h1>Markdown</h1>\n\n<p>Markdown is great.</p>\n"
```

# 何をしているのか
目的は、マークダウンテキストからHTMLへの変換。ちゃんと、`markdown_parser.render(text)`でHTMLが返ってきてる。

このサンプルではオブジェクトを２つ作っていて、１つは`Redcarpet::Render::HTML`というHTMLを描画するためのオブジェクト。もう１つは、`Redcarpet::Markdown`というマークダウンをパースするためのオブジェクト。

パーサーのインスタンスを作るときにレンダラーのオブジェクトを渡している。レンダラーにはHTMLを描画する時のオプションを渡せて、パーサーの２つ目の引数にはパースする時のオプションを渡せる。

____

実はさっきまでちょっとハマってた。パーサーに渡すはずのオプションをレンダラーに渡していて、「あれー、適用されないなーおかしいなー。」とか頭抱えていた。情けない。

```ruby:markdown.rb
def markdown(text)
  options = {
    fenced_code_blocks: true,
    ...
  }   

  extensions = { 
    ...
  }   
        
  renderer = Redcarpet::Render::HTML.new(options)
  markdown = Redcarpet::Markdown.new(renderer, extensions)
  markdown.render(text)
end
```
上のコードでは:fenced_code_blocksが有効にならない。このオプションはパーサーのコンストラクタに渡さないと。レンダラーじゃない。

ときどきこういう些細な勘違いで時間を浪費する。道具の役割をちゃんと把握しないとこういうことになるみたいな教訓得られてよかった。あと知りたいことはたいていREADMEに書いてあるので無駄にぐぐるのも良くないっぽい。
fcron使ってみた

[cron - ArchWiki](https://wiki.archlinux.org/index.php/cron)

ArchLinux触っていて驚くことに、cronが無い。
cronってcronだろ？という発想しかなかったので、cronって色々あるんだ・・・
というので驚いた。

## anacron

```bash:
yaourt anacron
```

* とりあえずanacron入れてみたが、systemctlでサービス登録方法がわからなかった。
  * `find /usr/lib/systemd/ -name "*cron*"`で.serviceがなかったので。。


## cronie

```bash:
pacman -Sy cronie
```

* サービス登録したが、crontabで編集したにもかかわらず実行されない・・・？

## fcron

```bash:インストール
pacman -Sy fcron
systemctl enable fcron
systemctl start fcron
```

crontab・・・は無いので、 fcrontabを使う。

```bash:一覧表示
$ fcrontab -l
2014-09-15 06:58:43  INFO listing vagrant's fcrontab
* * * * * date >> $HOME/a.txt
```

* $ fcrontab -e で編集。

```bash:
$ cat a.txt
Mon Sep 15 06:53:00 UTC 2014
Mon Sep 15 06:54:00 UTC 2014
Mon Sep 15 06:55:00 UTC 2014
Mon Sep 15 06:56:00 UTC 2014
Mon Sep 15 06:57:00 UTC 2014
Mon Sep 15 06:58:00 UTC 2014
Mon Sep 15 06:59:00 UTC 2014
```

動作していることを確認。
PHP can't access Redis server at localhost under CentOS 7

## Nginx's log

```php
2014/09/15 10:01:42 [error] 13068#0: *19 FastCGI sent in stderr: "PHP message: PHP Fatal error:  Uncaught exception 'RedisException' with message 'Redis server went away' in /opt/www/website/system/libraries/Redis.php:42
Stack trace:
#0 /opt/www/website/system/libraries/Redis.php(42): Redis->select(3)
#1 /opt/www/website/system/core/Loader.php(1133): CI_Redis->__construct(Array)

```

## Root cause

SELinux has banned the access from Nginx to Redis server.

## How to correct

```
# setsebool httpd_can_network_connect=1
```
classのコンストラクタの最初の引数グループがimplicitだった時の挙動

# 概要
classのコンストラクタ関数の最初の引数グループをimplicitなアレにしたらどうなるんだろう、と思ったので遊んでみた。

# case class

## 試したログ
```
$ scala
Welcome to Scala version 2.11.2 (Java HotSpot(TM) 64-Bit Server VM, Java 1.7.0_67).
Type in expressions to have them evaluated.
Type :help for more information.

scala> case class Hoge(implicit a:String)
defined class Hoge

scala> Hoge
res0: Hoge.type = Hoge     ### `Hoge`だとコンストラクタではなくオブジェクトとして認識される

scala> Hoge("str")         ### 直接指定してみる
<console>:10: error: too many arguments for method apply: ()(implicit a: String)Hoge in object Hoge
              Hoge("str")                         ### ↑コンストラクタのシグネチャがapply()(implicit a: String)になってる
                  ^

scala> Hoge()("str")       ### 試しにそのとおりにやってみる。
res2: Hoge = Hoge(str)     ### 動いた

scala> implicit val a = "implicit string"    ### implicit parameterを定義してやってみる
a: String = implicit string

scala> Hoge()
res3: Hoge = Hoge(implicit string)    ### 動いた
```

## 結果
case classのコンストラクタの最初の引数グループをimplicitにすると、勝手にcurry化されて2つ目の引数グループになる。
こういう場合、pattern matchってどうなるんだろう？と思って調べてみたら、implicitとか関係なくcurry化されたcase classは自動で`unapply`を実装して**くれない**らしい（＝そのままではpattern matchで使えない）

- http://stackoverflow.com/questions/7269698/case-classes-pattern-matching-and-curried-constructors-in-scala

自前でunapplyを実装すれば使える模様。

# caseじゃないclass
## 試したログ
```
$ scala
Welcome to Scala version 2.11.2 (Java HotSpot(TM) 64-Bit Server VM, Java 1.7.0_67).
Type in expressions to have them evaluated.
Type :help for more information.

scala> class Hoge(implicit val a:String)
defined class Hoge

scala> new Hoge
<console>:9: error: could not find implicit value for parameter a: String
              new Hoge
              ^
### implicit定義してないので当たり前

scala> new Hoge("str")    ### 直接指定してみる
<console>:9: error: too many arguments for constructor Hoge: ()(implicit a: String)Hoge
              new Hoge("str")                        ↑case classと同じく勝手にcurry化されてる
              ^

scala> new Hoge()("str")     ### 2つめの引数グループに直接指定。
res2: Hoge = Hoge@194527c6   ### 動いた。

scala> res2.a
res3: String = str    ### ちゃんと中身もある

scala> implicit val a = "implicit string"   ### implicit定義して試してみる
a: String = implicit string

scala> new Hoge()
res4: Hoge = Hoge@6963eb77    ### 普通に動く

scala> new Hoge
res5: Hoge = Hoge@78924119    ### もはや1つめのカッコも省略できる
```

## 結果
case classと同じ。

# 感想
勝手にcurry化されるのはびびった。ただ、こういうのは豆知識として知っておくのはいいけど、それを気にしないようなコードを書くように心がけよう。
あとimplicit云々関係なくコンストラクタがcurry化されてるとcase classでもパターンマッチが（自前でunapplyを書かない限り）使えず、case classの旨味がかなり減っちゃう。仮に自前でunapply書いたとしても、パターンマッチの書き方が混乱しそう。

あとcurry化した時の引数のカッコが分かれるやつを、「引数グループ」って表現したけど、それ専用の用語ってあるのかな。
foo, bar, baz の続き

1. foo
2. bar
3. baz
4. qux
5. quux
6. corge
7. grault
8. garply
9. waldo
10. fred
11. plugh
12. xyzzy
13. thud

なんと[RFC3092](http://www.rfc-editor.org/rfc/rfc3092.txt)できちんと説明されています！凄いですね！(ヒント: 日付)

[和訳](http://www.puni.net/~mimori/rfc/rfc3092.txt)もありますので読んでみると面白いでしょう．
Xcode5によるiOS8対応

iOS8のリリースが間近ですが、Xcode6への対応はお済みですか？
Xcode6にしたらビルドエラーを吐かれたり、改修後の十分な試験が行えないために、
Xcode5によるビルドでiOS8が問題なく動くようにしてiOS8リリースを迎える方もいらっしゃると思います。

iOS8で発生したデグレと、Xcode5による対応方法についてまとめました。

#ダイアログ表示のレイアウト崩れ
UIAlertViewのtitleをnilしている場合に、messageがダイアログに対して枠の上部ギリギリに表示されてしまい、かつ文字が太字で表示されてしまいます。
UIAlertViewの初期化時に

```objc
[[UIAlertView alloc] initWithTitle:nil message:@"さんぷる" delegate:...
```

のようにされている場合に発生します。

（iOS8からUIAlertViewがdeprecatedになり、
UIAlertControllerへの移行を推奨されていることは分かっていますが、）
Xcode5で対応する場合は以下がオススメです。

```objc
[[UIAlertView alloc] initWithTitle:@"" message:@"さんぷる" delegate:...
```

title箇所をnilから@""の空文字指定にすることです。
messageが短いと表示位置の崩れが少し残ってしまいますが、太字表示は解消されます。
iOS7以下への表示の変更もありません。


#アクションシートがiPadで表示されない
UIActionSheetがiPadで表示されない場合があります。

```objc
[actionsheet showInView:self.view];
```
のようにshowInViewにself.viewを指定するとiPad(iOS8)では表示されません。

```objc
[actionsheet showInView:self.button.view];
```
のように画面内のボタンなどのviewを指定してやると表示されるようになりました。

###※ iOS8 GMで本件は解消されました。
iOS8 beta5では発生していましたが、改修されたようです。
beta版って怖いですね。

※ただし、UIActionSheetにaddSubViewで様々なカスタマイズをされている場合には未だアクションシートが表示されなかったり、アプリが落ちたりするかもしれません。

#カメラのプライバシー設定
iOS8から「設定」「プライバシー」の項目に新たにカメラが追加されています。
カメラ機能を使用している場合は、以下のメソッドを使ってカメラ機能の許可状態を確認してください。

```objc
+ (AVAuthorizationStatus)authorizationStatusForMediaType:(NSString *)mediaType
```
このメソッド自体はiOS7から使用可能です。

iOS7ではmediaTypeにAVMediaTypeVideoを指定した場合、
常にAVAuthorizationStatusAuthorizedを返していましたが、
iOS8からカメラのプライバシー設定の判定用メソッドとして機能するようになったようです。

使用例：

```objc
AVAuthorizationStatus status = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeVideo];
    
switch (status) {
    case AVAuthorizationStatusRestricted:
    case AVAuthorizationStatusDenied:        // プライバシー設定でカメラが制限されている場合
        // 設定画面でプライバシー設定の変更をお願いする
        return;
            
    case AVAuthorizationStatusNotDetermined: // 初めてこのアプリでカメラ機能を使用する場合
        [AVCaptureDevice requestAccessForMediaType:AVMediaTypeVideo completionHandler:^(BOOL granted){
            if (granted) {
                // 許可された場合の処理
            } else {
                return;
            }
        }];
        break;
    case AVAuthorizationStatusAuthorized: // プライバシー設定でカメラの使用が許可されている場合
    default:
        break;
}

```
IPython Notebookのノートをバッチ処理化する


IPython Notebook、インタラクティブなデータ分析、プログラミング環境として非常に便利。そしてヘビーに使っているとバッチ処理の様なコードも書いて実行したくなる。ノートを保存した時の.ipynbファイルを実行する方法をまとめていく。まずは2つ。

## ipython nbconvertコマンドで.pyファイルを生成する

いつのまにかnbconvertがiPython本体に取り込まれていた。

```sh
ipython nbconvert mynote.ipynb --to=python
```

たとえば次の夜間バッチ処理的なノートを```nbconvert```にかけてみる。

![スクリーンショット 2014-09-15 15.28.15.png](https://qiita-image-store.s3.amazonaws.com/0/2130/416a2501-5d0d-8f5c-f01e-79746dff4bb4.png "スクリーンショット 2014-09-15 15.28.15.png")


生成後のソースは次の通り、プロファイルを指定したとしてもstartupスクリプトが含まれないのに注意。またpylabモード前提のコードは実質動かせないだろう。

```python
# coding: utf-8

# In[19]:

from pymongo import MongoClient
from datetime import timedelta, datetime


# In[26]:

# ローカルのMongoDBを処理する
con = MongoClient('localhost')
db = con['test']


# In[27]:

# 処理対象の日付 (0時以降に前日の集計を行なう)
process_date = datetime.now().date() - timedelta(days=1)
process_date


# In[28]:

xxx_count = 0
yyy_count = 0
with db.events.find({'time': {}}) as cur: # from-to指定は省略
    for doc in cur:
        pass
        # なんらかの集計


# In[ ]:

#  集計結果の更新
db.daily_state.update({'date': process_date}, {'$set': 'values': {
    'xxx_count': xxx_count,
    'yyy_count': yyy_count
}})

```

## runipyを使って、.ipynbファイルのまま実行する
paulgb/runipy
https://github.com/paulgb/runipy

.ipynbファイルをパースして中のPythonコードをipythonで順に実行していくというコマンド。

```sh
runipy mynote.ipynb
```

nbconvertと似ているが、実行後の結果をHTMLファイルとして出力できたりする。cronに仕込んで日次レポートを生成するといった用途に使える。コマンドラインからpythonスクリプト内で使う任意のパラメータも渡せる。しかし、IPythonのプロファイルを指定できないため、```ipython_notebook_config.py```の設定を駆使している場合は使いづらい。

Profileが指定できないのは不便という事で、forkして--profile-dirを指定できるようにしたバージョンはプルリク済み。

hagino3000/runipy
https://github.com/hagino3000/runipy


runipyについては開発が停滞しているように見えるので、使いたい人は全力でコミットするのが良さそう。
ラベルを使う基本（Cocos Code IDE, Lua言語）


Cocos Code IDEを使ってLua言語でラベルを使う基本をまとめました。

|実行環境、IDE|Cocos2d-xバージョン|言語|
|:--|:--|:--|
|Cocos Code IDE Mac OS X 1.0.0-RC2|Cocos2d-x V3.2|Lua言語|

## サンプルコード

プロジェクトを新規作成で作成します。（FileメニューのNew->Cocos Lua Project...から作成できます。）
プロジェクト名は適当につけてください。画面は縦画面(portrait)を指定します。

main.luaファイルを修正します。

```lua:main.lua/26行目
cc.Director:getInstance():getOpenGLView():setDesignResolutionSize(320, 480, 0) -- 縦画面用に(480, 320, 0)から(320, 480, 0)に変更
```

```lua:main.lua/31行目
--gameScene:playBgMusic() --使わないのでコメントアウト
```

GameScene.luaを書き換えます。

```lua:GameScene.lua
require "Cocos2d"
require "Cocos2dConstants"

local GameScene = class("GameScene",function()
    return cc.Scene:create()
end)

function GameScene.create()
    local scene = GameScene.new()
    local visibleSize = cc.Director:getInstance():getVisibleSize()

    local label = cc.Label:createWithSystemFont("Hello world !", "Arial", 18)
    label:setPosition(visibleSize.width/2, visibleSize.height/2)
    scene:addChild(label)

    return scene
end

return GameScene

```

画面中央に「Hello World !」の文字が表示されたと思います。

## システムフォントを使う

```lua:
local label = cc.Label:createWithSystemFont("Hello world !", "Arial", 18)
```

ラベルのサイズを指定すると、テキスト揃えを利用することができます。

```lua:
local label = cc.Label:createWithSystemFont("Hello world !", "Arial", 18, cc.size(200, 18), cc.TEXT_ALIGNMENT_CENTER, cc.VERTICAL_TEXT_ALIGNMENT_CENTER)
```

以下はテキスト揃えに使用できる定数です。

水平方向

- cc.TEXT_ALIGNMENT_LEFT（左揃え）
- cc.TEXT_ALIGNMENT_CENTER（中央揃え）
- cc.TEXT_ALIGNMENT_RIGHT（右揃え）

垂直方向

- cc.VERTICAL_TEXT_ALIGNMENT_TOP（上揃え）
- cc.VERTICAL_TEXT_ALIGNMENT_CENTER（中央揃え）
- cc.VERTICAL_TEXT_ALIGNMENT_BOTTOM（下揃え）

## フォントファイルから作成

PixelMplus（ピクセル・エムプラス）というフォントをお借りしてテストしました。

以下のサイトからダウンロードできます。
http://itouhiro.hatenablog.com/entry/20130602/font
使用の際、ライセンスはダウンロード先で必ず確認してください。

ここでの例では、resディレクトリにPixelMplus12-Regular.ttfフォントファイルを追加して使っています。

```lua:
-- ラベルのサイズを指定しない場合
local label = cc.Label:createWithTTF("Hello world !","res/PixelMplus12-Regular.ttf", 12)

-- サイズを指定する場合、左揃えや中央揃え等が使える
local label = cc.Label:createWithTTF("Hello world !","res/PixelMplus12-Regular.ttf", 12, cc.size(200,12), cc.TEXT_ALIGNMENT_LEFT, cc.VERTICAL_TEXT_ALIGNMENT_TOP)
```

## テキストの内容を変える

```lua:
label:setString("hello")
```

## 文字色を変える

```lua:
label:setColor(cc.c3b(255, 255, 0)) -- 黄色
```

## 文字を装飾する

createWithTTFで作成したラベルは装飾が可能です。

```lua:
label:enableGlow(cc.c4b(0, 0, 255, 255)) -- グロー （注意：下記参照）
label:enableOutline(cc.c4b(0, 0, 255, 255), 2) -- 縁取り 赤 幅2
label:enableShadow() -- 影
```

グローと縁取りはいっしょには使えないみたいです。
影の色や位置の変更方法がわかりませんでした。

## ビットマップフォントを使う

準備として、ビットマップフォントを作成しておきます。
ShoeBoxなどのソフトで作成することができます。

ShoeBoxはこちらからダウンロードできます。
http://renderhjs.net/shoebox/

ここでの例は、bmfont.fntとbmfont.pngをresディレクトリにコピーして使っています。

```lua:
local label = cc.Label:createWithBMFont("bmfont.fnt", "Hello world")
```
第23回オフラインリアルタイムどう書くの問題をHaskellで解く

[くねくね増加列](http://nabetani.sakura.ne.jp/hena/ord23snakemoinc/)の問題をHaskellで解きました。

単純に深さ優先探索で解いています。非効率な実装ですが、問題サイズが小さいのでよしとします、

```haskell
import qualified Data.Map as Map
import Data.Char

type Position = Int
type Value = Int
type Board = Map.Map Position Value

makeMap :: String -> Board
makeMap = foldl insert Map.empty
	where
		insert :: Board -> Char -> Board
		insert m c | c == '/' = m
		           | otherwise = Map.insert (Map.size m) (digitToInt c) m


nextPosition :: Board -> Position -> [Position]
nextPosition b p = [p' | p' <- around p, b Map.! p' > b Map.! p]
	where
		around :: Position -> [Position]
		around p | p `mod` 5 == 0 = [p' | p' <- [p - 5, p + 1, p + 5], p' >= 0, p' <= 24]
		around p | p `mod` 5 == 4 = [p' | p' <- [p - 5, p + 5, p - 1], p' >= 0, p' <= 24]
		around p | otherwise = [p' | p' <- [p - 5, p + 1, p + 5, p - 1], p' >= 0, p' <= 24]


search :: Board -> Int
search b = maximum $ map (search' b) [0..24]
	where 
		search' :: Board -> Position -> Int
		search' b p | nextPosition b p == [] = 1
		            | otherwise = 1 + (maximum $ map (search' b) (nextPosition b p))

main = do
	input <- getContents
	mapM test (lines input)
	where
		test :: String -> IO ()
		test s = do
			--putStr s
			let (x:y:[]) = words s
			putStr $ x ++ " "
			let out = (search . makeMap) x
			putStr $ show out ++ " "
			putStr $ y ++ " "
			putStrLn $ show (out == read y)

```
Goのメソッドは構造体以外にでも定義できるしそれが便利なこともよくある

いわゆる主流のオブジェクト指向言語しか知らない人からみると、クラスに相当するものはGoでは構造体で、メソッドに相当するのは構造体の型に対して定義されたメソッド、というように見えると思う。Goでコードを書いている時に、クラスという存在しない概念について考えても無意味なのだけど、頭のなかでそういうイメージで理解している場合、構造体以外の型にメソッドが定義できる意味がわからないと思う。

そこで、そういう人には多少目から鱗のような話かもしれないが、構造体以外にメソッドを定義して便利なケースをいくつか紹介したい。

## カウンタ

単純なカウンタを設計しているとしよう。カウンタが持つメソッドはaddとdecの2つだけで、それらのメソッドはカウンタ値を変更して、新しい値を返すものとしよう。カウンタを構造体を使って実装するとこういうふうになる。

```go
type counter struct {
	v int
}

func (c *counter) inc() int { c.v++; return c.v }
func (c *counter) dec() int { c.v--; return c.v }
```

上のコードは難しいものではないけど、よくよく考えてみれば要素が1つだけのstructというのは不要な抽象化だ。structというのは複数の値をまとめるものなのに、これには要素が1つだけしかないから、構造体は別に必要ではない。下のように書いたほうがシンプルになる。

```go
type counter int

func (c *counter) inc() int { *c++; return int(*c) }
func (c *counter) dec() int { *c--; return int(*c) }
```

Goの型システムに慣れていないとこのコードがきちんと動くのがピンとこないかもしれないけど、実際にこれはきちんと動くし、わかってみればこちらのほうがすっきりしていてよい。

## http.HandlerFunc

もう一つ例をあげてみよう。net/httpのHTTPハンドラのインターフェイスは次のように定義されている。

```go
type Handler interface {
	ServeHTTP(ResponseWriter, *Request)
}
```

つまりnet/httpのHTTPハンドラはどんな型でもいいのだけど、その型はServeHTTPという名前のメソッドを持っていなければいけなくて、第一引数がResponseWriter（HTTPレスポンスの出力先）、第二引数が*Request（HTTPリクエスト）ということになっている。この型の値をhttp.Handleに渡すだけであとはライブラリが勝手にこのメソッドを呼んでHTTPリクエストをハンドルしてくれることになっている。

では自分でHTTPハンドラを書きたくなった時にはどういうふうにすればよいのだろうか？ そういうときには、まず自分でHTTPハンドラの型を定義して、それにServeHTTPメソッドを定義することになるだろう。Hello worldを表示するHelloHandlerを定義してみよう。

```go
type HelloHandler struct {}

func (HelloHandler) ServeHTTP(w ResponseWriter, r *Request) {
	w.Write([]byte("Hello world"))
}
```

しかしまたもや上のstructはちょっとおかしな感じがする。要素が1つもないのだからわざわざそんなものを用意する必要はなさそうだ。とはいえ型を定義しないとメソッドは定義できないし、一方であえて構造体の中に入れなければいけないデータというものも見当たらない。どうすればよいのだろうか？

この場合には自分の型を関数として定義して、ServeHTTPはそれを呼ぶようにすると、いろいろなものがうまく収まる。

```go
type HelloHandler func(ResponseWriter, *Request)

func (f HelloHandler) ServeHTTP(w ResponseWriter, r *Request) {
	f(w, r)
}
```

あとは関数を定義してこのHelloHandler型の変数に入れる（あるいは単にその場で変換する）だけでよい。これでめでたしめでたし。

かというと実はこれでもまだ十分にシンプルにはなっていない。

HelloHandler型はHello Worldを表示するという具体的な関数と一切関係がなくなって、ただ関数をラップしてServeHTTPメソッドを足すだけの型になってしまった。ほかのどんなハンドラ関数もこれでラップすることができる。だから別にHelloといった名前を付ける必要はなくて、もっと一般的な名前にしたほうがよさそうだ。

実は上のHelloHandlerと同じメソッドを持つ同じ型がnet/httpにHandlerFuncという名前ですでに定義されている。これを使えば、自前のハンドラはただの関数として定義して、使うときにHandlerFuncに変換するだけでよくなる。

```go
// 自前のハンドラはただの関数
func hello(w ResponseWriter, r *Request) {
	w.Write([]byte("Hello world"))
}

func main() {
	// 型を変換する。直接http.HandlerFunc(hello)と書いてもよい
	var h http.HandlerFunc = hello
	http.Handle("/hello", h)
}
```

結局のところHTTPハンドラはただの関数にすぎない、というところまで単純化して書くことが可能になったわけだ。Goのシンプルな言語機能の組み合わせの妙というものを感じてもらえただろうか？
VimでPHPによく出てくるテキスト整形

PHPで開発している際によく見かけるテキストを整形する処理のチップスとなります。  

# 全般

CSV/TSV、リファクタリングなどで広く使えます。
vim-easy-alignのデフォルトとREADME.mdのサンプルの設定でも十分使えますが、
PHP様には一部不向きな点もあるため、適当に改良してあります。

``` vim:.vimrc
" vim-easy-align {{{
NeoBundleLazy 'junegunn/vim-easy-align', {
\    'autoload': {
\        'commands' : 'EasyAlign',},}
vnoremap <silent> <Leader>a :EasyAlign<CR>
let g:easy_align_delimiters = {
\    '=': {
\        'pattern': '===\|!==\|<=>\|\(&&\|||\|<<\|>>\)=\|=\~[#?]\?\|=>\|[:+/*!%^=><&|.-]\?=[#?]\?',
\        'left_margin': 1,
\        'right_margin': 1,
\        'stick_to_left': 0 },
\    '>': {
\        'pattern': '>>\|=>\|>', },
\    '/': {
\        'pattern':       '//\+\|/\*\|\*/',
\        'ignore_groups': ['String'], },
\    '#': {
\        'pattern':         '#\+',
\        'ignore_groups':   ['String'],
\        'delimiter_align': 'l', },
\    '$': {
\        'pattern':         '\((.*\)\@!$\(.*)\)\@!',
\        'ignore_groups':   ['String'],
\        'right_margin':  0,
\        'delimiter_align': 'l', },
\    ']': {
\        'pattern':       '[[\]]',
\        'left_margin':   0,
\        'right_margin':  0,
\        'stick_to_left': 0, },
\    ')': {
\        'pattern':       '[()]',
\        'left_margin':   0,
\        'right_margin':  0,
\        'stick_to_left': 0, },
\    'd': {
\        'pattern':      ' \(\S\+\s*[;=]\)\@=',
\        'left_margin':  0,
\        'right_margin': 0, }, }
"}}}
```

# JSON整形

Python の json.toolが便利なので活用します。ここではPHPを使用しません。

``` vim:.vimrc
nnoremap <Leader>json :execute '%!python -m json.tool'<CR>
```

# XML整形

OSに備わっているコマンドを活用します。ここではPHPを使用しません。

``` vim:.vimrc
nnoremap <Leader>xml  :execute '%!xmllint --noblanks --nowrap --encode UTF-8 --format %'<CR>
```

# SQL整形

(2015-07-04 追記)
使い勝手が悪かったので自作しました。(ドン)

``` vim:.vimrc
" vim-sqlfix {{{
NeoBundleLazy 'KazuakiM/vim-sqlfix', {'commands': 'Sqlfix'}
"}}}
```

# 複数行のテキストをクリップボードからVimに貼付

整形したテキストを別タブのVim等に貼り付ける、ブラウザからコピペする際に設定してあるとわりと便利です。
動作確認はMAC(iTerm2)で動作している事は確認していますが、Windows(Poderosa)では動作していません。

``` vim:.vimrc
nnoremap <silent><expr><Leader>v  ':set<Space>paste<CR><Insert><C-r>+<ESC>:set<Space>nopaste<CR>'
inoremap <silent><expr><C-v> '<ESC>:set<Space>paste<CR><Insert><C-r>+<ESC>:set<Space>nopaste<CR><Insert>'
```