OmniAICreator/Qiita-1.07M huggingface dataset:
flush in Clojure print and println

[Compojure](https://github.com/weavejester/compojure)を使っていて標準出力にログが出力されないことがあった。はじめは以下のように書いていた。

```clj
(ns hello-world.core
  (:require [compojure.core :refer :all]
            [compojure.route :as route]))

(defroutes app
  (GET "/" [] "<h1>Hello World</h1>")
  (GET "/debug" []
    (print "debug") ;; これが表示されない :(
    "This is debug")
  (route/not-found "<h1>Page not found</h1>"))
```

ところがこれは出力されなかった。少し調べてみて[この記事](http://grokbase.com/t/gg/compojure/119ppmeay6/where-are-the-message-produced-by-printf-in-a-compojure-project)を見つけた。どうやら`flush`の問題らしい。printは内部的にはflushをしていないのでこれを呼ぶだけだと直ちに標準出力からdebugログが見られるわけじゃない。

`println`で書き換えてみるとうまくいった。

```clj

(defroutes app
  (GET "/debug" []
    (println "debug")
    "This is debug")
```

実際ソースを見てみるとflushしていることがわかる。

```clj
user=> (source print)
(defn print
  "Prints the object(s) to the output stream that is the current value
  of *out*.  print and println produce output for human consumption."
  {:added "1.0"
   :static true}
  [& more]
    (binding [*print-readably* nil]
      (apply pr more)))
```

`print`は内部的に`pr`を使ってる。

```clj
user=> (source println)
(defn println
  "Same as print followed by (newline)"
  {:added "1.0"
   :static true}
  [& more]
    (binding [*print-readably* nil]
      (apply prn more)))
```

`println`は`prn`を使ってる。

`pr`と`prn`関数を見比べてみる。

```clj

user=> (source pr)
(defn pr
  "Prints the object(s) to the output stream that is the current value
  of *out*.  Prints the object(s), separated by spaces if there is
  more than one.  By default, pr and prn print in a way that objects
  can be read by the reader"
  {:dynamic true
   :added "1.0"}
  ([] nil)
  ([x]
     (pr-on x *out*))
  ([x & more]
   (pr x)
   (. *out* (append \space)) ;; とくにflushを呼んでいるわけではなさそう
   (if-let [nmore (next more)]
     (recur (first more) nmore)
     (apply pr more))))

user=> (source prn)
(defn prn
  "Same as pr followed by (newline). Observes *flush-on-newline*"
  {:added "1.0"
   :static true}
  [& more]
    (apply pr more) ;; 実際の表示にはprを使ってる
    (newline)
    (when *flush-on-newline*
      (flush)))  ;; 確かにここでflushをしている
```

debug用だったら`println`をいつも使うようにしておいた方が困惑しなさそう。

参照：
http://grokbase.com/t/gg/compojure/119ppmeay6/where-are-the-message-produced-by-printf-in-a-compojure-project
bash > 乱数を得る > シェル変数RANDOMを使う

動作確認

    CentOS 6.5

bashで乱数を得たい。
シェル変数RANDOMを使うと0-32767までの整数が得られる。

```bash:int_rand_exec
#!/bin/env bash

for idx in $(seq 1 100)
do
  echo $RANDOM
done
```

実数の乱数を得たい場合は

```bash:real_rand_exec
#!/bin/env bash

MAX_VAL=100.0

for idx in $(seq 1 100)
do
  echo "$RANDOM*$MAX_VAL/32768" | bc -l
done
```
のようにRANDOMの値を変更すればいい。


Link: [こちら](http://d.hatena.ne.jp/anmino/20091017/1255705586)が参考になりました。
Project Euler 14

問題
----
正の整数に以下の式で繰り返し生成する数列を定義する.

n → n/2 (n が偶数)

n → 3n + 1 (n が奇数)

13からはじめるとこの数列は以下のようになる.

13 → 40 → 20 → 10 → 5 → 16 → 8 → 4 → 2 → 1
13から1まで10個の項になる. この数列はどのような数字からはじめても最終的には 1 になると考えられているが, まだそのことは証明されていない(コラッツ問題)

さて, 100万未満の数字の中でどの数字からはじめれば最長の数列を生成するか.

注意: 数列の途中で100万以上になってもよい
http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%2014

回答方針
----

13 → 40 → 20 → 10 → 5 → 16 → 8 → 4 → 2 → 1

の数列で言うと、13で生成される数列の長さは、40で生成される数列の長さに1を足したものである。
つまり、13で生成される数列の長さは、再帰的に求められる。また、途中の結果を記憶しておくことで、計算量を削減することができる。

コード
----

```py
def next(n):
  if n % 2:
    return n*3 + 1
  else:
    return n / 2

def add(dict,n1):
  n2 = next(n1)
  if not n2 in dict:
    dict = add(dict,n2)
  dict[n1] = dict[n2]+1
  return dict

def main():
  dict = {1:1}
  (max_i,max) = (1,1)
  for i in range(2,10**6):
    if not i in dict:
      dict = add(dict,i)
    if dict[i] > max:
      (max_i,max) = (i,dict[i])
  print  (max_i,max)
```

結果
----
2.87secと鬼のように遅い結果となった。ネットを検索してみたところ、ある一定数より大きい数字(100万)については記憶しないようにすることにより、速度を向上させているコードがあった。
PHPでFactoryパターン

もはや知らずしらずのうちに使っていてもおかしくないほど多用されているファクトリーパターン。私もようやくソースコードの中でいきなり`new XXX`をすることに気持ち悪さを覚えてくるようになりましたが、まさに気持ち悪い理由の解決策がファクトリーパターンです。

気持ち悪い理由は明確で、ソースコードのあちこちで`new XXX`をすると`XXX`内の設計が変わったときに、すべての`new XXX`を調べだしていちいち変更しなくてはいけないからです。

そのため`new XXX`をする部分を1箇所（これがファクトリー、工場と呼ばれる所以ですが）にまとめたものがFactoryパターンです。

```php:Automobile.php
class Automoblie
{
   $vehicleMake;
   $vehicleModel;

   public function __construct($make, $model)
   {
      $this->vehicleMake = $make;
      $this->vehicleModel = $model;
   }

   public getName()
   {
      return $vehicleMake . ' ' . $vehicleModel; 
   } 
}
```

こんな自動車の設計書があったとします。この自動車を生成する工場をつくります。

```php:AutomobileFactory.php
public static function create($make, $model)
{
   return new Automobile($make, $model);
}
```

こんなかんじですね。`new`が一箇所にまとまっているため、何か変更があった場合もFactoryに変更を加えればokです。
実際の呼び出しはこんなかんじ。

```php:index.php
$automobile = AutomobileFactory::create('ブガッティ'、'ヴァイロン');
echo $automobile->getName();  // ブガッティ ヴァイロン
```

オブジェクト作成の初期化が煩雑になったときもFactoryパターンをつかっていると、一箇所にまとまるので楽、という特典もあります。
Azure WebSites サイト拡張機能 EventViewer でeventlog.xmlを見る

AzureWebsitesのASP.NET アプリケーションで
エラーなどログをeventlog.xmlに残しておいたものを
閲覧するサイト拡張機能です。


ここに英語の紹介がありました。
http://blogs.msdn.com/b/waws/archive/2014/09/24/azure-website-siteextension-to-view-eventlogs.aspx

まずは、新ポータルでWebサイトを開いて・・・拡張機能を選択
![002.png](https://qiita-image-store.s3.amazonaws.com/0/58908/5d334556-8bfd-c1ec-ae78-ff7a6b90dfb9.png)

拡張機能の追加で、Eventviewerを追加する
![001.png](https://qiita-image-store.s3.amazonaws.com/0/58908/6345aa66-68ec-780e-ed27-80ad7f943c0a.png)

こんな感じ
![003.png](https://qiita-image-store.s3.amazonaws.com/0/58908/831583b3-cc59-7c19-00d1-1b10a1ebf075.png)

https://{自分のサイト名}.scm.azurewebsites.net/
にアクセス！
Site Extensions を選択して、Eventviwerの再生ボタンのリンクをたどる
新ポータルを使わなくても、
https://{自分のサイト名}.scm.azurewebsites.net/SiteExtensions/
でインストールできる模様。ただしその場合、Restartさせることを忘れないようにする。

![004.png](https://qiita-image-store.s3.amazonaws.com/0/58908/81372e50-15bd-37bc-6508-4039eae5c48b.png)

IIS時代に見たことあるようなものが見えてきました。
![005.png](https://qiita-image-store.s3.amazonaws.com/0/58908/f982156a-7a12-5f94-20de-30aab1b490c3.png)
FOS4G NA 2015 "Web Mapping Day" の概要

FOS4G NA 2015 "Web Mapping Day" が非常に重要なイベントであると思うので、公表されているスケジュールを写経してみた。

原典：https://2015.foss4g-na.org/conference/schedule/session/2015-03-12

# Leaflet, WebGL そしてウェブ地図の未来
Vladimir Agafonkin
Leaflet は FOSS4G ライブラリの中で最もポピュラーである。だが WebGL やクライアントサイドベクトル地図、Leafletと同種のライブラリによって、Leafletの残り寿命は短いと思う人もいる。
だがLeafletはカッティングエッジな技術と共存できないだろうか。近未来のウェブ地図のランドスケープはどのようになっているだろうか。次の大きなちゃれんじはなんだろうか。これは Leaflet の開発者・メンテナ兼 Mapbox GL JS のコアデベロッパのトークであろう。

# GL地図の地図学デザイン - ズームレベルやラスタタイルを越えて
Nicki Dlugash
クライアントサイドベクトルレンダリングによりシームレスズームや360度回転等の流動性が加わった。同じ地図がシームレスにスタイルを変える事もできる。これらによって新しい地図学のパラダイムが生まれる。GL styling と CartoCSS の根本的な違いを技術面とデザイン面から説明する。など。
c.f. Mapbox GL
https://www.mapbox.com/mapbox-gl/

# D3.js で美しい地図をデザインする
Michael Bowman
D3.js の基礎を説明したあと、コロプレス、点密度、比例シンボル等の主題図について説明する。すべての地図とコードはgithubに公開する。

# ベクトルタイルのいま
Dane Springmeyer
ベクトルタイルは地理空間情報をウェブで高速・効率的・柔軟に共有する方法を提供する。Mapboxによるベクトルタイル仕様の最新状況を説明する。ベクトルタイルを作成・利用・変換する新しい又は既存のオープンソース実装について説明し、復号・レンダリングで最良のパフォーマンスを実現するための助言を行う。

# MapGuide を CesiumJS に接続する
Gordon Luckett
mapguide-rest を使って MapGuide から CesiumJS に CZML フォーマットを使って接続する方法を説明する。

# Cesium による時間方向の可視化
Matthew Amato
Cesium の時間方向に動的なアーキテクチャを説明し、CZMLやKMLによる時間データを利用するデモを説明する。GeoJSONやTopoJSONに時間要素を加える方法についても議論する。

# CartoDB の外での Torque を用いたタイムラプス地図アニメーション
Kathryn Killebrew
Torqueライブラリを使ってアニメーションする方法を説明する。
ฅ(・ω・ฅ){ EA (Emoji Art) でサザンイマジネーション 第6回 お題「 トライアングルアタック 」 } #esa_io

## <i class="fa fa-image" style="font-size:1em;"></i> 概要
Ascii Art ならぬ EA (Emoji Art) で 3 x 3 の絵を作る。

## <i class="fa fa-history" style="font-size:1em;"></i> 経緯
CodeIQ で <i class="fa fa-external-link" style="font-size:1em;"></i> [Emoji-サザンイマジネーション](https://codeiq.jp/ace/tbpgr_badge/q1323)
という問題の出題を始めました。

Emoji で 3 x 3 の絵を作るプログラムを作成する問題です。

この問題のフィードバック時に、解答者の 3 x 3 の Emoji に対して、
3 x 3 の Emoji でフィードバックする、という試みをしています。
これが結構楽しかったので、 Qiita 上でも出題期間中 ( ～ 2015年3月6日) は
1日1お題くらいやってみたいな、と思いました。

最近の チャットツール とか GitHub とか、多くのツールが Emoji をサポートしてるので
面白いものを作っておくと、開発メンバー間のコミュニケーションツールとして使えそうですよね。

Emoji のリストと対応サービスはこちらで確認。
<i class="fa fa-external-link" style="font-size:1em;"></i> [EMOJI CHEAT SHEET](http://www.emoji-cheat-sheet.com/)

## :flower_playing_cards: 作品 「 トライアングルアタック 」

### パオラ、カチュア、エスト

:deciduous_tree::racehorse::deciduous_tree:
:racehorse::dragon::racehorse:
:sparkles::sparkles::sparkles:

### サジ、マジ、バーツ

:deciduous_tree::feelsgood::deciduous_tree:
:finnadie::dragon::suspect:
:sparkles::sparkles::sparkles:

## :books: 関連情報
* <i class="fa fa-external-link-square" style="font-size:1em;"></i> [emoji 関連記事](http://qiita.com/tbpgr/items/b32c83e2f3f348a4ce0a)
Playのrouteを編集しても反映されない時の解決方法

routeの内容は以下の通り。

```lang:route
GET     /                           controllers.Application.index
GET     /login                      controllers.com.jsms.Login.login
GET     /assets/*file               controllers.Assets.at(path="/public", file)
```


localhost:9000/loginへのアクセスはパターンに合致するはずなのに、以下のエラー。
![WS000028.JPG](https://qiita-image-store.s3.amazonaws.com/0/64360/8cb10b00-eb11-8ffe-91db-b19953a219a4.jpeg)



routeを変更しても反映されない時はactivatorでcleanすれば良いらしい。
　[app] $ clean
　[app] $ compile
　[app] $ run
　
　

これで追加したURLパターンが認識されるようになる。
２時間ほど無駄にしてしまった・・・
球面上の（地理座標）点集合に対する近傍探索

こんにちは。
球面上の（地理座標）点の集合 $\\{(\lambda_i,\,\phi_i),\, i=0,1,2,...,n-1\\}$に対して、そのうちの一点を中心とする指定半径の円内に含まれる他の点を探索することを考えます。これを、全ての点に対してそのような部分集合を作る問題を計算してみました。結果例（ $i$ の部分集合）は、

```
$ ./neighbors.py -n 10000
[[0, 69, 1720, 7675, 8172, 9198], [1, 1167, 4385, 5063, 7716, 9184], [2, 2129, 4849, 7180], [3, 374, 753, 1039, 1506, 3230, 7188, 7433], [4, 2836, 4777, 7088, 9563], [5, 2936], [6, 9214, 9839], [7, 3288, 3762, 8710]]
```

```python:neighbors.py 
#!/usr/bin/env python
# -*- coding: utf-8 -*-

from __future__ import print_function
import numpy as np
import scipy
from scipy import spatial

DEGREE = scipy.pi / 180
RE = 6378137.0  # GRS80

def mercator_projection(lon, lat):
    lon, lat = [x * DEGREE for x in [lon, lat]]
    return lon, scipy.log(scipy.tan(lat/2+scipy.pi/4))

def neighbors(points, radius):
    r = radius / RE
    points = [mercator_projection(*p) for p in points]
    tree = spatial.cKDTree(points)
    neigh = [tree.query_ball_point([x, y], r*scipy.cosh(y)) for x, y in points]
    return neigh

def labelsorted(labels, i):
    def key(x):
        if x == i: return -1
        return x
    return sorted(labels, key=key)

import sys
n = int(sys.argv[2]) if len(sys.argv) > 2 and sys.argv[1]=='-n' else 10000
radius = 1e3  # 1 km
n_print = 8
d = 4e-6 * radius * scipy.sqrt(n)
points = np.random.uniform(low=-1,high=1,size=(n,2))*d + [135, 35]  # lon, lat
neigh = neighbors(points, radius)
print([labelsorted(x, i) for i, x in enumerate(neigh[:n_print])])
```
opsworksでnginxのログをltsvで出力する

# 場面

* nginxのログをtd-agentでtailするときにltsvにしたい

# 見るところ

* log_formatの定義箇所
    * https://github.com/aws/opsworks-cookbooks/blob/release-chef-11.10/nginx/templates/default/nginx.conf.erb#L15-L17

* 定義したlog_formatを呼び出す箇所
    * https://github.com/aws/opsworks-cookbooks/blob/release-chef-11.10/unicorn/templates/default/nginx_unicorn_web_app.erb#L9-L15

# やってみる

stack settingsのcustom jsonいじるだけでできる。必要なのは2点。

* `node[:nginx][:log_format]["<my_log_format_name>"] = "<my_log_format_definition>"` に値を入れてlog_formatを定義する

* `@application[:log_format] = ["<my_log_format_name>"]` に値を入れて、定義したlog_formatを利用する


```json
{
  "nginx": {
    "log_format": {
      "ltsv": "'time:$time_iso8601\\trequest_method:$request_method\\trequest_uri:$request_uri\\tstatus:$status\\tbody_bytes_sent:$body_bytes_sent\\trequest_time:$request_time\\thttp_referer:$http_referer\\thttp_user_agent:$http_user_agent\\thttp_x_forwarded_for:$http_x_forwarded_for'"
    }
  },
  "deploy": {
    "<my_application>": {
      "log_format": ["ltsv"],
      ...
    }
  }
}
```

これでnginxのログをltsvで出力できる
お名前.comのVPSのUbuntu14.04でシリアルコンソールを有効化する

お名前.com の VPS のシリアルコンソールは、ttyS0 での接続となる。
Ubuntuは、デフォルトでは ttyS0 を開けていないため、開ける。
ちなみに、お名前.com のコントロールパネルからの接続はtty1。

#ttyS0有効化
ttyS0 の設定ファイルを作成する。

```
$ sudo touch /etc/init/ttyS0.conf
```

ttyS0.conf の中身は以下。

```
start on stopped rc RUNLEVEL=[2345]
stop on runlevel [!2345]

respawn
exec /sbin/getty -8 115200 ttyS0
```

早速、ttyS0 をオープンする。

```
$ sudo start ttyS0
```

これで TeraTerm からの SSH でシリアルコンソールに接続できるようになる。

#OS起動時の画面出力を ttyS0 にする

GRUB の設定を変更する。

```
$ sudo vi /etc/default/grub
```

コメントアウトの箇所を以下のように変更。

```
#GRUB_CMDLINE_LINUX=""
GRUB_CMDLINE_LINUX="console=tty1 console=ttyS0,115200n8r"
#GRUB_TERMINAL=console
GRUB_TERMINAL=serial
GRUB_SERIAL_COMMAND="serial --unit=0 --speed=115200 --word=8 --parity=no --stop=
1"
```

編集後、grup-update する。

```
$ sudo update-grub
```

#(参考)TeraTerm からシリアルコンソールに接続する

コントロールパネルから、SSH Private Key を DL する。

```
vpsXXXXXXXXX-XXX.key
```

同じく、コントロールパネルに記載されている、ユーザ名でログインする。
「RSA/DSA/ECDSA/ED25519鍵を使う」の箇所に、Private Key を指定する。

パスフレーズは空のまま、接続する。


# Ubuntu Server 18.04 LTS の場合(Update)
Ubuntu Server 18.04 LTSでは、以下を実施するのみで良くなった。
/etc/default/grubを編集する。変更箇所のみ記載。

~~~ 
#GRUB_CMDLINE_LINUX=""
GRUB_CMDLINE_LINUX="console=tty1 console=ttyS0,115200"

#GRUB_TERMINAL=console
GRUB_TERMINAL="console serial"
GRUB_SERIAL_COMMAND="serial --speed=115200 --unit=0 --word=8 --parity=no --stop=1"
~~~

Update-grubをして、Rebootする

~~~
$ sudo update-grub
$ sync;sync;sync
$ sudo reboot
~~~

以上。
C#のnamespaceって共通メソッド的に使ってね❤️と言う意味ではナイト思う。

#UnityなのにJava的なプロジェクトでを見てぽか〜ん。

どういう事かと言うと、C#のnamespace宣言？を乱用して、あたかも共通クラス的なことを乱立させた結果、Unityのプロジェクトビューで検索するとControllerとかがめっちゃいっぱいある事象に遭遇しまんた。

クソなソースコードをコピーして、作ったので簡単でしょ？
**ふぁ。**なソシャゲーの引き継ぎあるあるです。

#何処がクソか。
まずは、他人のソースコードをあまり見ていないところ。このコーディング方法が正しいと思い込んでいる。実際に修正方法をライブで見せていただいたが、Unity使っているのにMacのFinderを開いて元ソースコードをコピーし、くそソースコードを量産していた。

#こんなので、ソースコードを後から見る人が追うの大変だと、思わないの？。

![スクリーンショット 2015-02-28 0.35.54.png](https://qiita-image-store.s3.amazonaws.com/0/25895/a6724da8-9b79-de88-032b-e122bf6dad3c.png)

Unityのプロジェクトビューの検索結果ですが、どういう事かと言うと、実はそれぞれのCSファイルは、namespaceで別の宣言扱いになっている。

こんな感じ

Controller.cs
namespace Common.A {
    public class Controller : MonoBehaver {
}
}

Controller.cs
namespace Common.B {
    public class Controller : MonoBehaver {
}
}

ImportantOther.cs
public class ImportantOther : MonoBehaver {
    void Start () {
        Common.A.Controller();
    }
}
LittleImportantOther.cs
public class LittleImportantOther : MonoBehaver {
    void Start () {
        Common.B.Controller();
    }
}

単純なこぴぺの積み重ねが、作った本人も把握できないクソなプロジェクトを別の人種が引き継いでいますと言うお話。作りの考えかたがちがうんだよなー。

**そもそもnamespaceの使い方が違う気がするぞ。興味本位でその方法つかってね？**

**なんの言語でもそうだけど言語仕様を悪用する人が多すぎね。それ、お前が作るの簡単なだけだから！**

#大量生産大量消費的な生産方法は過去の遺物で、汎用的なソースコードってそういうことじゃ〜無いから。
Projecet Euler 12 割り算をせずに約数の個数を求める。

問題
----

三角数の数列は自然数の和で表わされ, 7番目の三角数は 1 + 2 + 3 + 4 + 5 + 6 + 7 = 28 である. 三角数の最初の10項は:

1, 3, 6, 10, 15, 21, 28, 36, 45, 55, ...
となる.

最初の7項について, その約数を列挙すると, 以下のとおり.

 1: 1
 3: 1,3
 6: 1,2,3,6
10: 1,2,5,10
15: 1,3,5,15
21: 1,3,7,21
28: 1,2,4,7,14,28

これから, 7番目の三角数である28は, 5個より多く約数をもつ最初の三角数であることが分かる.

では, 500個より多く約数をもつ最初の三角数はいくつか.
http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%2012

数学的考察
----
三角数というと難しげだが、要は三角数とは1からnまでの自然数の和で表される数である。
1からnまでの自然数の和は、以下の公式で表される。

```
n * (n+1) /2
```

そして、nと(n+1)とは互いに素（共通の素因数を持たない。）であるから、n/2とn+1またはnと(n+1)/2も互いに素である。n/2とn+1とすべきか、nと(n+1)/2とすべきかはいずれが偶数かによる。
互いに素な自然数n1,n2をかけあわせた数の約数の個数は、n1の約数の個数とn2の約数の個数とを掛け合わせた数に等しい。

回答方針1
----
上記のような数学的考察に基づき、以下のようなアルゴリズムで本問の回答を行う。
1. mymathを使って素数のリストを作る。
　mymath.py
　http://qiita.com/cof/items/45d3823c3d71e7e22920
2. 約数の個数が500以内であるうちはループ ループ内では変数nを1 から順に増加させる。
3. n+1について偶数か否かを判定した上で、素数リストを使ってn+1または(n+1)/2の素因数分解を行う。
4. 得られた素因数を下にn+1の約数の数を求め、以前に記憶していたnの約数の数と掛け合わせる。
5. かけあわせた数を約数の数として記憶、2に戻る。

コード
----
 
```py
import mymath

def cof():
  pri = mymath.get_primes(10**4)
  n = 1
  num_fac = 1
  lim = 500
  n1_fac =  mymath.get_number_of_factor(n,pri)
  while num_fac < lim:
    n += 1
    if (n+1)%2:
      n2_fac =  mymath.get_number_of_factor(n+1,pri)
    else:
      n2_fac =  mymath.get_number_of_factor((n+1)/2,pri)
    num_fac = n1_fac * n2_fac
    n1_fac = n2_fac
  print n * (n+1) / 2
```

問題の発覚と新たな気づき
----

実行してみたところ、1回の実行に1.62秒と、うんこレベルで遅い。
どうにかして高速化できないかと考えてみたところ、そもそも因数分解をしていることが遅い原因ではないか、ということに気がついた。
エラトステネスと同様の手法によって、割り算をせずに、各数の約数を求められることに気がついた。

回答方針2
----
より詳しくは、
1. それぞれの数ごとにリストを作る。
 [[],[],・・・]
2. 1から適当な数までループし、対象の数の倍数の位置に当該対象の数を要素として追加する。
　例えば、2が対象の数であれば、
 [[].[1],[1],[1],[1]←倍数の4に対応するリストに2を追加する、以下、6,8,10と同様。
3. 2を繰り返すと、あら不思議、対応する数の真の約数リストが出来上がります。
 [[].[1],[1],[1],[1,2],[1],[1,2,3],[1],[1,2,4],[1,3],[1,2,5],...]
4. この約数リストを基に、回答方針1にあるnの約数の個数等を求める。

コード
----

以下の関数をmymathに追加。

```py
def factor_seq(max):
  ret = [[0]]
  for i in range(max):
    ret += [[1]]
  seq = range(max+1)
  for i in seq[2:max//2+1]:
    for j in seq[i*2::i]:
      ret[j] += [i]
  return ret
```

上記を使ってコードディング

```py
def cof2():
  fq = mymath2.factor_seq(10**5)
  n = 1
  num_fac = 1
  lim = 500
  n1_fac = len(fq[n])
  while num_fac < lim:
    n += 1
    if (n+1)%2:
      n2_fac =  len(fq[n+1])
    else:
      n2_fac =  len(fq[(n+1)/2])
    num_fac = n1_fac * n2_fac
    n1_fac = n2_fac
  print n * (n+1) / 2
```

結果、640msと、一応なんとか我慢できるレベルにはなった。たぶん、factor_seqで`ret[j] += [i]`を`ret[j] += 1`に変えれば約数の個数が求められるので、それを利用するともっと早くなると思う。
JavaScript で addClass / removeClass

あと addClass と removeClass も面倒くさいなぁ・・
<br/>

これでいいか・・

```js:
Element.prototype.hasClass = function(className){
    var classArray = this.className.split(' ');
    return classArray.indexOf(className) >= 0;
}
Element.prototype.addClass = function(className){
    if(!this.hasClass(className)){
        var classArray = this.className.split(' ');
        classArray.push(className);
        this.className = classArray.join(' ');
    }
    return this;
}
Element.prototype.removeClass = function(className){
    var classArray = this.className.split(' ');
    var index = classArray.indexOf(className);
    if(index >= 0){
        classArray.splice(index, 1);
        this.className = classArray.join(' ');
    }
    return this;
}
Element.prototype.toggleClass = function(className){
  this.hasClass(className) ? this.removeClass(className) : this.addClass(className);
} 
```
ストアカテゴリ一覧API

ストアカテゴリー一覧APIで
page_keyを指定しても、どうしても第一階層のカテゴリしか返ってきません。
多分page_keyが認識されていないと思われます。
どこか間違っているのでしょうか？

https://circus.shopping.yahooapis.jp/ShoppingWebService/V1/stCategoryList?page_key=a5aba5caa5&seller_id=storeid

ちなみに、商品登録APIなど利用中しています。
viewDidLoadとviewWillAppearの役割例

## viewDidLoad
* 各viewを構成する。
* see: https://developer.apple.com/library/ios/featuredarticles/ViewControllerPGforiPhoneOS/ViewControllerPGforiOS.pdf

> Table 4-1
> Methods: viewDidLoad
... By the time this method is called, your view objects are guaranteed to exist and to be in a known good state.

```
- (void)viewDidLoad {
    [super viewDidLoad];
    [self setupView];
}
```

* UITabBarControllerなどで、複数のUIViewControllerをインスタンス化する際、viewDidLoadは呼ばれる。表示されるかどうかわからない各画面のリソースを取得するのは冗長であるため、ここでリソースの取得は行わない。

## viewWillAppear:animated
* 各リソース(data, image etc..)の取得を行う。(非同期で)

```
- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    [self updateView];
}
```

* 画面表示のリロード(Pull To Refreshなどによる)は、このupdateViewを再度呼ぶ。
JavaScript で prependChild

昔を思い出しながら、ピュアJSのリハビリ中・・・

Element.prototype.appendChild はあっても、Element.prototype.prependChild はない・・・脳がすっかり jQuery に甘やかされてしまったみたいです。
<br/>
とりあえずこんな感じで汚染すれば良いかな？

```js:
Element.prototype.prependChild = function(el){
    this.insertBefore(el, this.firstChild)
}
```
<br/>
こう使う

```js:
parentElement.prependChild(childElement);
```
Clojureでクリップボードを使ってみる

Clojureでクリップボードを使うのは簡単にできます。

```clj:clipboard.clj
(ns use-clipboard.core
  (:import [java.awt Toolkit]
           [java.awt.datatransfer Clipboard DataFlavor StringSelection]))

(def ^Clipboard clip (.getSystemClipboard (Toolkit/getDefaultToolkit)))

(defn get-string []
  (when (.isDataFlavorAvailable clip DataFlavor/stringFlavor)
    (.getData clip DataFlavor/stringFlavor)))

(defn get-filelist []
  (when (.isDataFlavorAvailable clip DataFlavor/javaFileListFlavor)
    (.getData clip DataFlavor/javaFileListFlavor)))

(defn set-string [s]
  (let [ss (StringSelection. (print-str s))]
    (.setContents clip ss ss)))
```

上記`get-string`では`java.lang.String`が返り、`get-filelist`では`java.util.List<java.io.File>`が返ります。

Excelのセルをコピーしたものも`get-string`で取れるので何かと便利です。

上記には実装してませんが、他にもImage（コピーしている画像）を取得したり、クリップボードの変化の監視ができたりするようです。
Docker-Composeで複数サービスをLink使わずに立ち上げる。

# Docker-Composeでちょいと複雑なサービスをLink使わずに立ち上げる。
## はじめに
現在自前のVPS環境にて以下の様な環境を作っています.

![構成図](https://chart.googleapis.com/chart?chl=+digraph+irc+%7B%0D%0A+++user+-%3E+shout+%5Blabel+%3D+%22port%3A9000%22%5D%0D%0A+++user+-%3E+znc++%5Blabel+%3D+%22port%3A16667%22%5D%0D%0A+++shout+-%3E+znc+%5Blabel+%3D+%22port%3A16667%22%5D%0D%0A+++znc+-%3E+bitlbee+%5Blabel+%3D+%22port%3A6667%22%5D%0D%0A%7D&cht=gv)

外からはircクライアントから直でzncに接続、もしくはsshトンネル使った上で[shout](http://shout-irc.com/)で接続。
その上でzncは非公開のbitlbeeにアクセスしているという感じです。

んで、この環境を最近Dockerに移行したのですが、以外にめんどくさいのがコンテナ間通信。
Dockerの基本は-linkを使って環境変数をベースに設定を書き換えるという形になるのですが、複数コンテナを立ち上げてクラスタするわけでもないのにいちいちShell書くのもなぁ…と思っていたところ、[この投稿](http://qiita.com/ohac/items/19075f6a35e95d0e08fa)を見て、「お、これなら簡単やん」ということでdocker-compose.ymlを作ってみました。

## 基本構造

コンテナ間の構造はこんな感じ

![コンテナ構造](https://chart.googleapis.com/chart?chl=+digraph+irc+%7B%0D%0A+++host+-%3E+net_irc+%5Blabel+%3D+%22port%3A9000%2Cport%3A16667%22%5D%0D%0A+++net_irc+-%3E+shout++%5Blabel+%3D+%22expose%3A9000%22%5D%0D%0A+++net_irc+-%3E+znc+%5Blabel+%3D+%22expose%3A16667%22%5D%0D%0A+++net_irc+-%3E+bitlbee+%5Blabel+%3D+%22expose%3A6667%22%5D%0D%0A%7D&cht=gv)

net_ircというコンテナを[この投稿](http://qiita.com/ohac/items/19075f6a35e95d0e08fa)を参考にbusyboxで作成。
その他をnet: "container:ner_irc"と指定されたコンテナのネットワークに相乗りさせて、コンテナ間はポート指定で通信するというものです。
現在のdocker-composeはnet指定にサービス名を使えない
（現在pr:#686で議論はされている模様）ので、net_ircについては直接dockerから作成して、そののちにdocker-compose upするという方式を取ることで実現しました。

## 実際のコード

```shell-session:起動スクリプト
docker-compose stop
docker stop net_irc
docker rm net_irc
docker run --name net_irc -d -t -p 16667:16667 -p 127.0.0.1:9000:9000 busybox
docker-compose up -d
```

```yaml:docker-compose.yml
znc:
  image: jimeh/znc
  expose:
   - "16667"
  volumes:
   - $HOME/.znc:/znc-data
  net: "container:net_irc"
bitlbee:
  image: aostanin/bitlbee
  expose:
   - "6667"
  volumes:
   - $HOME/.bitlbee:/data
  net: "container:net_irc"
shout:
  image:  cha2maru/shout
  expose:
   - "9000"
  volumes:
   - $HOME/.shout:/root/.shout
  net: "container:net_irc"
  command: shout
```

## やってみて
dockerはpオプションで解放する際にIP制限をしないとufwを超えてポートが解放されてしまうので、個人用のサービスを立ち上げる時にはまずどのポートをどのIPに解放するのかを専用のコンテナで設定して、そのうえでnet: "container:name"でネットワークを共有するというのは確認の上でもいいのかなと思いました。

docker-composeのバージョンアップが来て、net: containerの指定にservice名が使えるようになったらよりシンプルにできるので、バージョンアップを楽しみに待ちたいと思います。
Fortran 用の Makefile の書き方

# はじめに
Fortran 90 がこの世に出てからずいぶん経つけど、make のデフォルトルールはモダンな Fortran に対応してないよね。だったら自分で書くしかないんだけど、みたところあまり情報が出回ってないみたい。

いつもながら今さら感があるのだけれどちょっと整理してみようか。

# Fortran のモジュール
Fortran に触れたことない人向けに簡単に説明しておくと、Fortran 90 以降のモダンな Fortran (FORTRAN 77 などと区別するために1文字目のみ大文字で書く) では「モジュール」っていうものが導入された。

モジュールの詳しい説明は省くけど、分割コンパイルと関連させて使うことが多くて、例えば submod というモジュールを submod.f90 で定義して別のファイル main.f90 のルーチンから submod に定義されたサブルーチンや変数を参照したりする。

そして submod.f90 をコンパイルするとオブジェクトファイル submod.o と、モジュール中間ファイル submod.mod ていうのができるんだ。submod.mod っていうのは乱暴に言うと C でいうヘッダファイルみたいな役割をするもんだと思ってほしい。

で、main.f90 をコンパイルするときには submod.mod が必要になるっていうわけだ。ルーチンとかの実体がある submod.o はなくてもコンパイルできる (もちろん実行ファイルを作るときには必要)。

submod.f90 が修正されてもそのインターフェースに変更がなければ submod.mod は変わらない。だからそれを参照する main.f90 も再コンパイルの必要がないってわけだ。FORTRAN 77 の時代とは打って変わって Fortran もモダンになったね。


# Makefile に対する要件

make のデフォルトルールに Fortran 90 用の定義を追加して、プロジェクトの固有の記述量は減らしたいところ。

先の例でいうと submod.o とsubmod.mod は submod.f90 から作られる。だからそういうルールを書けばいい…って言いたいところだけどそうは問屋が卸さない。

```mf:不適切な記述
submod.mod: submod.f90
    gfortran -c $<
```

依存関係的にはそうなんだけど、submod.mod は submod.f90 を再コンパイルしても更新されるとは限らない。内容に変更なければ更新されないんだ。上のように単純に submod.mod を submod.f90 に依存させると submod.mod が更新されずに submod.f90 より古いファイルの状態になって、make を実行するたびにコンパイルが実行されてしまう場合が発生する。

そこでちょっと工夫が必要になる。

```mf:modの依存関係を工夫
submod.o: submod.f90
    gfortran -c $<

submod.mod: submod.f90 submod.o
    @:
```

submod.f90 から submod.o を作成するルールは通常のものだから説明は不要だろう。

ここで重要なのは submod.mod と submod.o のルール。: は何もしないコマンド。末尾に挙げた参考リンクだと true を使ってたりするけれどここでは Windows でも使える : にした。

この submod.mod のルールでは submod.mod が生成されないのだけれど、もう一つの submod.o を作成するときに submod.mod が生成される。じゃあ submod.mod のルールは要らないんじゃないかと思うかもしれないけれどそうではない。

下の例を見てほしい。

```mf:main.oの依存関係
main.o: main.f90 submod.mod
    gfortran -c $<
```

main.o は main.f90 と submod.mod に依存するのでこのような記述になる。

ここで submod.mod のルールがないと submod.mod が見つからなくて make が終了してしまう。先のルールにより submod.o が参照され、submod.f90 のコンパイルが実行される (そして submod.mod も生成される)。 


# デフォルトルール

Makefile はできるだけデフォルトルールを有効活用するようにしたほうが記述量も減り管理のミスもなくなる。デフォルトルールが存在しない場合は可能であればデフォルトルールを追加する形で設定するとよい。

gmake のデフォルトルールは -p オプションで確認できる。FORTRAN 77 用のデフォルトルールが存在するのでそれを参考に定義するのがよいだろう。

先の .mod のルールも反映させると下のようになる。

```mk:Fortran用のデフォルトルール
FC = gfortran

.SUFFIXES: .f90
 
%.o: %.f90
    $(COMPILE.f) $(OUTPUT_OPTION) $<
 
%.mod: %.f90 %.o
    @:
```

こうしておくとプロジェクト固有の定義は下のように書ける。

```mk:プロジェクト固有の定義
TARGET = sample
OBJS = main.o submod.o

$(TARGET): $(OBJS)
    $(LINK.f) $^ $(LOADLIBES) $(LDLIBS) -o $@
 
main.o: submod.mod 
```

main.o と submod.mod の依存関係がシンプルに記述できてるのがわかるだろうか。


# まとめ

まとめると下のようになる。もちろんデフォルトルールを別ファイルにしてインクルードしてもよい。

```mk:Makefileの全体
FC = gfortran

TARGET = sample
OBJS = main.o submod.o

.SUFFIXES: .f90

%.o: %.f90
    $(COMPILE.f) $(OUTPUT_OPTION) $<

%.mod: %.f90 %.o
    @:

$(TARGET): $(OBJS)
    $(LINK.f) $^ $(LOADLIBES) $(LDLIBS) -o $@

main.o: submod.mod 
```

# おわりに

Makefile で Fortran の .mod ファイルを扱うこの手法は自分の発案ではないのだけれど、ネットにまとまった情報が少なかったり記述にミスがあったりしてるので混乱するよねーって思った。

単に需要がないだけかもしれないけど Fortran でプログラムを組む際の助けになればいいんじゃないかな?

# 参考

http://d.hatena.ne.jp/pyridoxin/20110726/1311691190
http://lagrange.mechse.illinois.edu/f90_mod_deps/
Please run "git flow init" first.

SourceTreeでGit Flowを使用していて、いつのまにか下記のエラーが出ていたのでその時の対処法

<b>Please run "git flow init" first.</b>

##リポジトリ設定を表示
![SourceTree_gitflowinit.jpg](https://qiita-image-store.s3.amazonaws.com/0/21343/5ab73d59-6fd0-43d7-cb6d-cb200297da7a.jpeg)

##設定ファイルを編集
下記の記述を削除
```
[gitflow "branch"]
	master = master
	develop = develop
[gitflow "prefix"]
	feature = feature/
	release = release/
	hotfix = hotfix/
	support = support/
	versiontag = 
```

##リポジトリを初期化
リポジトリ　→　Git Flow → リポジトリを初期化
![SourceTree_gitflowinit2.jpg](https://qiita-image-store.s3.amazonaws.com/0/21343/2e9289eb-d8b4-f7a3-adc2-e413dd2cac86.jpeg)
shift-jis でもOKなnodeの簡易サーバー

# http-server で SJISサイトがNG

[http-server](https://www.npmjs.com/package/http-server) がよく簡易サーバーとして挙げられることが多いんですが、Node.jsは基本的にUTF-8推奨です。http-serverだと、完全に文字化けします。

[node-static](https://www.npmjs.com/package/node-static)をお使いください。

```bash
$ npm install node-static -g
$ static
```

http://0.0.0.0:8080 とか、http://localhost:8080 で文字化けしない。

---

本日は以上です。
１つのURLに対して実際に参照するファイルを特定条件で切り分ける

どうしてRewriteCondちゃんとRewriteRuleちゃんはなかなか言うこと聞いてくれないのか。
ちょっと複雑なルールの指定や置換をしようとするとすぐ暴走するわりにはデバッグが超絶しにくくてハマるで有名なmod_rewriteさんとの奮闘記です。
簡単なものに関しては便利だけど、ちょっと複雑なことをするとすぐ泥沼になるあたりJavaScript先生と似ているきがする。

# お題
<pre>
1. iPhoneかiPodのアクセスのときのみimage/配下のリクエストをiOS_image/配下にある同名ファイルに読み替える。
2. iOS_image/ 側に同名ファイルが存在しなければそのまま表示 (404等にはしない)
3. どんだけURLとしてディレクトリ掘られててもファイル名のみ見て判断する。

例)
  状況:
    htdocs/
      + index.php
      + image/
        + favicon.jpg
        + nullpo.png
      + iOS_image/
        + favicon.jpg
  URL:
    http://example.com/image/favicon.jpg
      → iOS_image/favicon.jpg を表示
    http://example.com/image/nullpo.png
      → image/nullpo.png を表示
    http://example.com/image/a/b/favicon.jpg
      → iOS_image/favicon.jpg を表示 (a/b/ のディレクトリは無視)
</pre>

## こんなかんじにつくってみました
記事内でだんだん作ってくほど文章達者ではないので先にどん

```apache:htdocs/.htaccess
RewriteEngine On

SetEnvIf Request_URI "^/image/(.*/)*(.*)$" ImageFile=$2

RewriteCond %{REQUEST_URI} ^/image/
RewriteCond %{HTTP_USER_AGENT} (iPod|iPhone)
RewriteCond %{DOCUMENT_ROOT}/iOS_image/%{ENV:ImageFile} -f
RewriteRule ^.*$ /iOS_image/%{ENV:ImageFile} [L]
```

## 小細工たち
### SetEnvIf
地味に仕様として面倒だったのが、"ディレクトリ階層が可変" なこと。
ずっと

```apache
RewriteCond %{REQUEST_URI} ^/image/
```

から続く先をこねくり回してたんですが、どうにもファイル名だけ抜き出して存在チェックするっていうCondにつなげられない・・。というところで小一時間悩んでたどり着いたのが環境変数使っちゃう小細工。
CondやRuleの中で ```%{ENV:variable}``` で参照できるので、事前にパターンマッチ使って入れときます。
### %{HTTP_USER_AGENT}
ユーザーエージェント。詐称余裕でしたとか言ってはいけない。
まぁでも昨今はWiFi環境とかもあるし、頑張ってネットワークで判定したとしても、ガラケーならまだしもスマホアクセスとPCアクセスを完全に判定するのって無理よね。・・・無理よね？
### %{DOCUMENT_ROOT}
最初、

```apache
RewriteCond iOS_images/%{ENV:ImageFile} -f
# とか
RewriteCond /iOS_images/%{ENV:ImageFile} -f
```

こんな感じで書いてたんですが、マッチしてくんなくてなんだろうと思ったら絶対パスで書かないとうまくいかないみたい。どこがカレントになってるんじゃろか・・。

### [L] フラグ
おわる。
正直RewriteCond/RewriteRuleって入れ子っぽくかけないからどこがどこまでかかってるのかわからないよね・・。

## 応用
上記コードの RewriteCond ～ RewriteRule のセットを何個も書けば、iPhoneだけじゃなくてAndroidはコレ、ガラケーはコッチ、ついでにChrome使ってる輩はコッチだ、みたいなこともできます。

## 見えない小細工
### Rewriteのデバッグログ
自分の中では、RewriteCond がどこまでちゃんとマッチしているかとかサーバ変数に何が入っているのかとかを単純にechoとかできないのがハマる原因の大半を占めてるんですが、その辺をいいかんじにデバッグ出力してくれるオプションがあるので設定します。

```apache
# Rewrite DEBUG
RewriteLog "/tmp/apache_rewrite_debug.log"
RewriteLogLevel 4
```

LevelはMAXで9ですが、4がRewriteCondで比較している変数内容とパターンを出力してくれるのでその辺がよさげかと。わりとわさわさ出てくるので用が済んだら元に戻しましょう。

また、こちらは.htaccessではなくてhttpd.conf本体にしか書けないようですので、追記したらrestartしてあげましょう。

で、内容をみるとわかるんですが、ヘッダが異様に長くて
醜い
見難いので、tail -f でチェックするときはsedもかましてある程度省略してあげると見やすいです。

```bash
~$ tail -f /tmp/apache_rewrite_debug.log  | sed "s/^.*initial\]//"
```

### ブレイクポイントを作り出す
上記のデバッグログを出せばどこのマッチが失敗してるか等はわかりますが、たとえば他にもルールが大量にあり、別のものにマッチしてしまってリダイレクトされてしまう、等のいろいろな弊害があって、phpで言う ```exit;``` みたいな強制終了みたいなものをしたくなったときはこんなおまじない。

```apache
RewriteRule . / [F]
```

```[F]``` フラグで強制的に変換を打ち切ってforbiddenを返します。たとえば、

```apache
RewriteCond (なにか条件1)
RewriteRule . / [F]
RewriteCond (なにか条件2)
```

ってやってブラウザリロードして403を確認したら次は、

```apache
RewriteCond (なにか条件1)
RewriteCond (なにか条件2)
RewriteRule . / [F]
```

って移動してリロードしたら403にならない！ってなったら条件2が何かおかしいっていうことがわかります。

# 参考文献
わからないことがあるといつもググるけど、巡り巡って結局ココが最強なんだと思う。
http://httpd.apache.org/docs/2.2/ja/mod/mod_rewrite.html#rewritecond

# さいごに
Rewrite って地味に打ちにくくてこまる。
Selenium IDEでclickコマンドを記録したときの注意事項

##### click コマンドを記録したときの注意事項 #####
Selenium IDEでリンクをクリックする操作は、click コマンドで記録されるので
これを clickAndWait コマンドに変更する

##### 変更する理由 #####
click コマンドだと、クリック操作だけで次のコマンドが即実行されてしまう。
新しいWebページの読込みが終わるまで次のコマンドを実行しないようにするためは、clickAndWait コマンドに変更する必要がある

click コマンドの後に、次のコマンドが実行されないよう
都度 pauseコマンドを入れてたのですが、その必要はなさそうです。

よく調べてみたら、以下URL（日本語リファレンス）にも同じ内容が記述されていました。
http://oss.infoscience.co.jp/seleniumhq/docs/03_selenium_ide.html
ER Master を利用してデータベースの初期化を自動化する

# ER Master は超便利なツールだ
[ユカイ、ツーカイ、カイハツ環境！（11）：DB設計の神ツール「ERMaster」なら、ここまでできる (1/3) - ＠IT](http://www.atmarkit.co.jp/ait/articles/1001/21/news128.html)

ER Master は超便利なツールだ。

わかりやすく超便利だ。
![erm.PNG](https://qiita-image-store.s3.amazonaws.com/0/43205/8e437dbe-c89b-863e-dce2-6725127c8895.png)

Eclipse のプラグインとして提供されているので、特に Java 開発者であれば一度は使ってみたほうがいい。神ツールと呼ばれるのにも納得すると思う。

# ER Master を利用したスキーマの再構成
そんな ER Master は DDL、DML のエクスポートにも対応しているのだが、これは Ant から実行することもできる。

これを利用してデータベースの状態を初期化することができる。以下の例はデータベースに H2 Database を使用。

```xml:build.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE project>
<project>

	<property name="sql_dir" location="build/erm" />
	<property name="erm" location="sample.erm" />
	<property name="ddl" value="create-schema.sql" />
	<property name="dml_name" value="initialization" />

	<target name="resetDB">
		<!-- スキーマ構築 DDL の作成 -->
		<ermaster.ddl diagramFile="${erm}" outputfile="${sql_dir}/${ddl}" />

		<!-- 初期データ登録スクリプトの作成 -->
		<ermaster.testdata diagramfile="${erm}" outputdir="${sql_dir}" format="0">
			<testdata name="${dml_name}" />
		</ermaster.testdata>

		<!-- スキーマ構築スクリプトの実行 -->
		<exec executable="java">
			<arg line="-cp lib/h2-1.4.185.jar" />
			<arg value="org.h2.tools.RunScript" />
			<arg line="-url jdbc:h2:~/test" />
			<arg line="-script ${sql_dir}/${ddl}" />
			<arg value="-continueOnError" />
		</exec>

		<!-- 初期データ登録スクリプトの実行 -->
		<exec executable="java">
			<arg line="-cp lib/h2-1.4.185.jar" />
			<arg value="org.h2.tools.RunScript" />
			<arg line="-url jdbc:h2:~/test" />
			<arg line="-script ${sql_dir}/${dml_name}.sql" />
		</exec>
	</target>

</project>
```

Eclipse 上から`resetDB`ターゲットを実行することで、ER Master に登録されたデータから自動的に DDL、DML を作成して実行してくれる。

※事前に公式サイトの設定に従って、[必要な設定](http://ermaster.sourceforge.net/content/manual/ja/index.html#31.2.)は行っておく必要はある。

## 使いどころ
- スキーマが確定していないので、開発しながら決めていきたい。
- テーブルに初期データを登録したい。

こういう場面は往々にしてある。もちろん開発フレームワークがこれを実現してくれる場合もあるだろうけれど、なかなかそうでないことも多いだろう。そういう場合には使えると思う。
MySQLでBLOB/TEXT型カラムにインデックスを作成してみる

## インデックス作成

まず、MySQLで下記のHOGEテーブルのHOGEカラムにインデックスを作成してみます。

* HOGEテーブル
<pre>
| hoge  | CREATE TABLE `hoge` (
  `ID` int(11) NOT NULL,
  `HOGE` text NOT NULL,
  `VERSION` int(11) NOT NULL,
  PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
</pre>
* インデックス作成用SQL
<pre>
# ALTER TABLE HOGE ADD INDEX hoge_idx(HOGE);
</pre>

## エラー発生

インデックスを張ろうとしたところ、下記のようなエラーが発生。
<pre>
mysql> ALTER TABLE HOGE ADD INDEX hoge_idx(HOGE);
ERROR 1170 (42000): BLOB/TEXT column 'HOGE' used in key specification without a key length
</pre>

このエラーは、MySQLがBLOB型もしくはTEXT型(これらに順ずるTINYTEXT型やLONGTEXT型を含む)のような可変長カラムでは、その先頭から最大255文字分しかインデックスできないという制約から来ているようです。

## 解決策

BLOB型またはTEXT型の場合は、インデックス作成時にキー長を明示してあげる必要があります。
<pre># ALTER TABLE HOGE ADD INDEX hoge_idx(HOGE(255));</pre>

　
以上、TEXT型のカラムにインデックスを追加しようとした時に躓いた内容でした。
改行を含む履歴を peco で絞り込み・選択する zsh widget

# はじめに

peco は改行で入力を分ける為、改行が含まれた履歴を絞り込み・選択しようとすると単一の履歴であっても別々のアイテムとして扱われてしまい、意図した操作が行えない。

そこで、改行をヌル文字等で置換して一行にまとめたものを peco に入力。その後、peco の出力を入力時とは逆に置換することで打開を図る。

# 方法

以下を .zshrc 等の任意の設定ファイルに記載する。

[peco_select_history](https://gist.github.com/waltarix/93535792ad9cc3e9e709)

```zsh
whence peco &>/dev/null && function {
	function peco_select_history {
		emulate -L zsh

		local delimiter=$'\0; \0' newline=$'\n'

		BUFFER=${"$(print -rl ${history//$newline/$delimiter} | peco --query "$LBUFFER")"//$delimiter/$newline}
		CURSOR=$#BUFFER
		zle -Rc
		zle reset-prompt
	}
	zle -N peco_select_history
	bindkey "^Xh" peco_select_history
}
```

* キーバインドはお好みで
* 元の履歴中に `\0; \0` が存在すると → あっ…(察し)
Project Euler 11 「格子内の最大の積」

上の 20×20 の格子のうち, 斜めに並んだ4つの数字が赤くマークされている.
(数字略)
それらの数字の積は 26 × 63 × 78 × 14 = 1788696 となる.

上の 20×20 の格子のうち, 上下左右斜めのいずれかの方向で連続する4つの数字の積のうち最大のものはいくつか?

http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%2011

ひとまず、縦横斜めを走査して4の数の積を返す関数を書いてみた。
どうやるのが最善か思いつかなかったけど、とりあえずフラグで走査する方向を決めるようにした。
縦や横や斜めで動作限界が異なるけど、いちいちその動作限界を書くのがめんどくさかったので、例外が発生したら-1を返すようにした。

```
def f(ls,m,n,flag):
  ret = 1
  try:
    for i in range(0,4):
      if flag == 'hori':
        ret *= ls[m][n+i]
      elif flag == 'ver':
        ret *= ls[m+i][n]
      elif flag == 'rdia':
        ret *= ls[m+i][n+i]
      else:
        ret *= ls[m+i][n-i]
  except:
    ret = -1
  return ret 
```

あとは特にいうこともなく終了。

```
def text2list(text,ln="\n",s=' '):
  L = text.split(ln)
  ls = [ e.split(s) for e in L if len(e.split(s))>0 ]
  if len(ls[0]):
    ls.pop(0)
  if len(ls[-1]):
    ls.pop(-1)
  ret = [ map(lambda x: int(x), e) for e in ls ]
  return ret


def main():
  text = '''
08 02 22 97 38 15 00 40 00 75 04 05 07 78 52 12 50 77 91 08
49 49 99 40 17 81 18 57 60 87 17 40 98 43 69 48 04 56 62 00
81 49 31 73 55 79 14 29 93 71 40 67 53 88 30 03 49 13 36 65
52 70 95 23 04 60 11 42 69 24 68 56 01 32 56 71 37 02 36 91
22 31 16 71 51 67 63 89 41 92 36 54 22 40 40 28 66 33 13 80
24 47 32 60 99 03 45 02 44 75 33 53 78 36 84 20 35 17 12 50
32 98 81 28 64 23 67 10 26 38 40 67 59 54 70 66 18 38 64 70
67 26 20 68 02 62 12 20 95 63 94 39 63 08 40 91 66 49 94 21
24 55 58 05 66 73 99 26 97 17 78 78 96 83 14 88 34 89 63 72
21 36 23 09 75 00 76 44 20 45 35 14 00 61 33 97 34 31 33 95
78 17 53 28 22 75 31 67 15 94 03 80 04 62 16 14 09 53 56 92
16 39 05 42 96 35 31 47 55 58 88 24 00 17 54 24 36 29 85 57
86 56 00 48 35 71 89 07 05 44 44 37 44 60 21 58 51 54 17 58
19 80 81 68 05 94 47 69 28 73 92 13 86 52 17 77 04 89 55 40
04 52 08 83 97 35 99 16 07 97 57 32 16 26 26 79 33 27 98 66
88 36 68 87 57 62 20 72 03 46 33 67 46 55 12 32 63 93 53 69
04 42 16 73 38 25 39 11 24 94 72 18 08 46 29 32 40 62 76 36
20 69 36 41 72 30 23 88 34 62 99 69 82 67 59 85 74 04 36 16
20 73 35 29 78 31 90 01 74 31 49 71 48 86 81 16 23 57 05 54
01 70 54 71 83 51 54 69 16 92 33 48 61 43 52 01 89 19 67 48
'''

  ls = text2list(text)
  flag_list = ['hori', 'ver', 'rdia','ldia']
  seq = range(0,20)
  ans = {'max':0,'m':0,'n':0,'flag':''}
  for m in seq:
    for n in seq:
      for flag in flag_list:
        ret = f(ls,m,n,flag)
        if ret > ans['max']:
          ans =  {'max':ret,'m':m,'n':n,'flag':flag}
  print max
```

高速化をするとすれば、n1 n2 n3 n4 n5 という列に対し、n1*n2*n3*n4の計算結果をn1で割り、n5を掛けるくらいだろうか。仮にやっても対して早くならなそうな気がする。（むしろ遅くなりそう）
IchigoJam で3分タイマー

## IchigoJamでタイマー

IchigoJam については[IchigoJam の紹介と OS X で使う方法のまとめ](http://qiita.com/ynomura/items/a047df1efbf984827a2c)で紹介していますが、そのキャラクター表示のディスプレィで数字を大きく表示するタイマーを作ってみました。

### 実はパクリ
数字を大きく表示する部分は、Facebook内のグループ「IchigoJam-FAN」の Hidetaka Hayakawa さん作成の「時計」から、時間のカウントダウン部分は 志賀 慶一 さんの「3分タイマー」からパクりました。
なので、このプログラムをソースを公開することにしました。

### スクリーンショット
![3minTimer1.png](https://qiita-image-store.s3.amazonaws.com/0/16491/7f40a163-be21-2bae-888d-7fff4f3713f3.png)

![3minTimer2.png](https://qiita-image-store.s3.amazonaws.com/0/16491/1b844340-5af7-e70d-7a33-66517747ca7b.png)

### プログラムのソース
10 行の T=3 が3分を指定していますので、この数値を変えるとタイマーの時間を変えられます。
圧電サウンダが付いていたら、420行のREMを消すとブザーも鳴らせます。

```basic:3minTimer.bas
5 REM 3min Timer By Y.NOMURA
10 T=3:C=60
20 [0]=31599:[1]=4681:[2]=29671:[3]=29647:[4]=23497
30 [5]=31183:[6]=31215:[7]=29257:[8]=31727:[9]=31695:[10]=0
40 CLS:CLT:LED 0:M=3:S=0:H=M:B=S
50 GOSUB250:LC13,9:? CHR$(1):LC13,11:? CHR$(1):GOSUB200
60 W=T*60*C-TICK()
70 IF W<=0 GOTO 400
80 S=W/C:M=S/60:S=S%60
90 IF H>M THEN H=M:GOSUB250
100 IF B<>S THEN B=S:GOSUB200
110 GOTO 60

200 IF S<10 N=0:X=15:GOSUB 300
220 IF S>=10 N=S/10:X=15:GOSUB 300
230 N=S%10:X=19:GOSUB 300:RETURN

250 X=8:N=M%10:GOSUB 300:RETURN

300 D=[N]>>12&7:LC X,8:?CHR$(D&4>0);CHR$(D&2>0);CHR$(D&1);
310 D=[N]>>9&7:LC X,9:?CHR$(D&4>0);CHR$(D&2>0);CHR$(D&1);
320 D=[N]>>6&7:LC X,10:?CHR$(D&4>0);CHR$(D&2>0);CHR$(D&1);
330 D=[N]>>3&7:LC X,11:?CHR$(D&4>0);CHR$(D&2>0);CHR$(D&1);
340 D=[N]>>0&7:LC X,12:?CHR$(D&4>0);CHR$(D&2>0);CHR$(D&1);:RETURN

400 LC10,15:?"TIME UP!"
410 I=0
420 LED(I&1):REM BEEP(2)
430 IF I<10 THEN I=I+1:WAIT(30):GOTO 420
440 LED 0
450 END

```
Project Euler 10 「素数の和」

10以下の素数の和は 2 + 3 + 5 + 7 = 17 である.

200万以下の全ての素数の和を求めよ.
http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%2010

以前作ったmymathを使ってサクッと書いた。(296ms)
http://qiita.com/cof/items/45d3823c3d71e7e22920

素数を求めるアルゴリズムは、mymathに書いてあるが、次の通り
1. エラストテネスの篩を使い、素数番目がTrue,素数以外番目がFalseとなるブーリアンのリストを作る。
2. そのリストから素数のリストを、リスト内包表記で作成する。

そして、作った素数のリスト(下記のpri['list'])をsum()で合計する。

```
import mymath
import mytime
import math
def cof():
    target = 2 * (10**6)
    pri = mymath.get_primes(target)
    print sum(pri['list'])
```

次のようなアルゴリズムの方が早いのかとおもったけど、遅かった。（420ms）リストがブーリアンか数字かで処理速度が異なる模様。
1. 数字列のリストを作成する。 [0,0,2,3,4,5,6,7,8,9,10,‥] (予め1は0にしておく。
2. 素数についてループし、数字列に含まれる素数の倍数を0にする。[0,0,2,3,0,5,0,7,0,0,0,‥] 
3. 残ったリストのsum()をとる。

```
def cof2():
    target = 2 * (10**6)
    L = [0,0]+range(2,target+1)
    L[4::2] = [0] * (len(L[4::2]))
    p=3
    p_max = int(math.sqrt(target))
    while p<=p_max:
        if L[p]:
            L[p*2::p] = [0] * (len(L[p*2::p]))
        p+=2
    L.remove(0)
    print sum(L)
```

正解者掲示板で他の人はどんなコード書いているのかと見たところ、Fri, 3 May 2013, 19:14に投稿されたLucy_Hedgehog氏のコードはすごかった。自宅で実行してみたところ15msで求められた。本人の説明もコードもよく理解できなかったが、エラトステネスとは別のアルゴリズム（素数数え上げアルゴリズムに類似）で行っているようだった。
リアクティブプログラミングの学習にはReactive Koans がとてもよい件

巷ではRxﾎｹﾞやらRFPやらといった言葉を目にすることが多くなりました。

詳しいことはわからんが､どうやらイベントドリブンのコードを気持ちよく書きたい!という時にぴったりということまでわかったところで､どうやって覚えようかなー｡｡｡とWebをさまよっていたところ[Rx で Koan した](http://steps.dodgson.org/b/2014/10/01/playing-with-rx-koans/)にたどり着きました｡

なるほどとっても覚えやすい!というのでこちらでも紹介します｡

## Reactive Koans ってこんな感じ
虫食いになってるコードのセットを落としてきて､穴埋めしながらReactive Extensionsの仕組みや使い方を順番に覚えられるようになっています｡
#### 例えばこんな感じ
```csharp
[TestMethod]
public void ExplainSomething()
{
  var ___ = "Please fill in the blank.";
  var aNumber = 10;
  var anotherNumber = 5;
  Assert.AreEqual(___, aNumber + anotherNumber);   // ____ のところを修正する
}
```

一問ごとにテストケースになっていて､最初何もせずに走らせるとテストがコケてメッセージに"空白を埋めろ!"と出てきます｡
言われたとおり虫食い(`___`)を直して再実行､見事テストをパス!という感じで進めていきます｡

結構細かく問題が分かれていて､一歩ずつ進めていけるような構成になっているので無理なく進められます｡
何より手とコードを動かしながら進められるというのがとてもいいです｡

#### やり方
Reactive Koansは[Visual Studio](http://www.visualstudio.com/)のプロジェクト形式で以下のサイトからDLできます｡導入方法や実行方法も記載されています｡
http://rxkoans.codeplex.com/

導入といってもVSから落としたプロジェクトを開いて､テスト実行って押すだけなんですけどね｡[Visual Studio](http://www.visualstudio.com/)もコミュニティエディションなら無料なのでレッツトライ｡

Reactive KoansはC#でできてます｡
RxﾎｹﾞはJavaとかJSとかも似たような仕組みになっている(らしい)ので､最終的にC#以外でリアクティブするにしても､基礎を覚えるにはやってみて損はないんじゃないかなーと､個人的に思っています｡
(私もRxJavaを使おうと思っています)

## Koansとは? = 書きながら進めるチュートリアル
KoansというのはいわゆるZen Wordsの一つで､語源は悟りをひらくための課題のようなものだそうです｡
(参考:http://ja.wikipedia.org/wiki/%E5%85%AC%E6%A1%88)

Code Koansと調べるといくつかほかにもあるようです｡[RxJS](https://github.com/Reactive-Extensions/RxJSKoans)とか｡
Qiitaにも紹介されているものもありますね
http://qiita.com/esehara@github/items/4183f1dcee9a82ac2c6b

参考
[Rx で Koan した](http://steps.dodgson.org/b/2014/10/01/playing-with-rx-koans/)

それでは
Enjoy Reactive Life!
Monoをコンパイルしてインストールする自動Shell

#CentOS6.X系にMonoをコンパイルしてインストールするまでのまとめShell


```bash:monoinstall.sh
#!/bin/bash
#TAG="タグ名"
TAG=mono-3.12.0.77
DIR=`dirname "${0}"`
cd ${DIR}
mkdir monotemp
cd monotemp
yum install autoconf libtool automake gcc gcc-c++ gettext wget git -y
git clone https://github.com/mono/mono.git
cd mono/
sh autogen.sh
git checkout ${TAG}
make get-monolite-latest
make
make install
mono -V
```
#インストール確認
インストール終了でバージョンを表示しています。
>Mono JIT compiler version 3.12.0 ((no/de2f33f 2015年  2月 27日 金曜日 21:20:59 JST)
>Copyright (C) 2002-2014 Novell, Inc, Xamarin Inc and Contributors. www.mono-project.com
>        TLS:           __thread
>        SIGSEGV:       altstack
>        Notifications: epoll
>        Architecture:  amd64
>        Disabled:      none
>        Misc:          softdebug
>        LLVM:          supported, not enabled.
>        GC:            sgen

#Monoテストコード
csファイルの作成
>vi qiita.cs

```csharp:qiita.cs
class TestClass
{
    static void Main(string[] args)
    {
               System.Console.WriteLine("Hello Mono!!");
    }
}
```
コンパイルと実行
>mcs qiita.cs
>mono qiita.exe
localhostでGoogleAnalyticsの挙動を確認する


## モチベーション
Google Analyticsに設定した目標などが正しく計測できているか、localhostで確認したい。

## 方法
[高度な設定 - ウェブ トラッキング（analytics.js）](https://developers.google.com/analytics/devguides/collection/analyticsjs/advanced?hl=ja)

```js
ga('create', 'UA-XXXX-Y', {
  'cookieDomain': 'none'
});
```
と設定するだけでOK。

GAの操作画面でプロパティのURLを変えるように指示する解説記事もあるけど、設定しなくても計測はできる。
ちなみにUser IDとかも取っている場合は、下記みたいな感じで書けば良い。

```js
ga('create', 'UA-XXXX-Y', {
  'cookieDomain': 'none',
  'userId': 'hashed_user_id'
});
```

## 注意点

### リアルタイム機能
動作の確認は実際、リアルタイム機能を用いて行うと思う。
自分の環境では、GAとlocalhostを同じブラウザで開いていると、計測されないという問題が起きていた。
ただchromeでGA開いて、firefoxでlocalhost開くとかすると、ちゃんと拾えているので、計測できてないと感じる人は試してみると良い。

### リファラースパム
localで開発していても、GA上にアクセスが来ているように見えることがある。
これはリファラースパムというもので、GA運用者が訪問者の訪問元のリンクを踏み、ショッピングサイトなどに誘導させることを狙っているスパムだ。トラッキングコードが利用されているみたいで、実際にアクセスが来ているわけではないので、本番環境でnginxの設定で弾くとかできず、余計に質が悪い。
対応策としては、フィルタを設定するか、ビュー設定のボットのフィルタリングで「既知のボットやスパイダーからのヒットをすべて除外します」にチェックを入れておけば、ある程度防ぐことができる。

## 参考
[高度な設定 - ウェブ トラッキング（analytics.js）](https://developers.google.com/analytics/devguides/collection/analyticsjs/advanced?hl=ja)
Arduino Leonardoが脚光を浴びた日（なんにもオチのない話）

## Microだとちょっと。。。

昨日のこと、[Arduino Micro](http://arduino.cc/en/Main/arduinoBoardMicro)を使って[コレ（なんちゃってデバイス連携）](http://qiita.com/tadfmac/items/f169efa60ca13ef32f3a)用デバイスを作ってました。はい。大好きw

使ってたセンサーはコレ。

[焦電センサー SE-10](http://akizukidenshi.com/catalog/g/gM-02471/)

しかし。。。。なんか、安定して使えません。

なんでだろ？と思って、基板をにらめっこしてると、どうやら電源ラインに[78L05](http://www.alldatasheet.com/datasheet-pdf/pdf/138840/JIANGSU/CJ78L05-SOT-89.html)がついてる模様。
。。。ということは、アレですね。7Vくらい与えないとダメということですよね。

秋月の説明書には、5Vで使う場合は78L05をバイパスしろと書いてある。そりゃそーだ。
しかし、バイパスしても、安定した5Vじゃないとだめと書いてある。そりゃそうだよなー。

一応Microちゃん、VINついてるんだけど、ACアダプタが刺さるわけじゃなく、外部電源入れるのちょっと面倒ですね。弱点をつかれました。なんてこと！

## UNOでやってみるとセンサー動いた。でもコレだとだめ。

他のArduinoは[Arduino UNO Rev.3](http://arduino.cc/en/Main/ArduinoBoardUno)しか持ってませんが、コレにはACアダプタが刺さります。自宅に転がってた12V1AのACアダプタを繋いで、VINから電源をとってセンサーを繋いでみたところ、案の定センサーはキビキビ反応してくれるようになりました！

むー、しかし、これ（UNO）だとArduinoだけだとキーボードにできない、という問題があります（LUFAでATmega16u2書き換えれば別だけど、そこまで面倒なことをやって「なんちゃって」をやるなんて。。アホですよね。。。）

## というわけで、Leonardoちゃん発注！

Arduino UNOとArduino Microどっちも持ってるにも関わらず、どっちも巧く使えないなんて、初ですよ！こんなこと！
というわけで、今回必要になったのは、UNOとMicroの中間のような仕様の[Arduino Leonardo](http://arduino.cc/en/Main/ArduinoBoardLeonardo)です。

ATmega32u4搭載の大きい方。
通常、小は大を兼ねる！で、いまいち何に使うんだろ？と思ってたこの子！私の中でいきなり脚光をあびる！

届くの楽しみです。（なんにもオチなしw）

## これだけだとヒドいので、最後に比較表を

|項目|[Arduino UNO](http://arduino.cc/en/Main/ArduinoBoardUno)|[Arduino Micro](http://arduino.cc/en/Main/arduinoBoardMicro)|[Arduino Leonardo](http://arduino.cc/en/Main/ArduinoBoardLeonardo)|
|:----|:---:|:---:|:---:|
|ACアダプタ|○7-12V|×|○7-12V|
||![uno](http://img.dfm.lrv.jp/arduino/ArduinoUno_R3_thumb.jpg)|![micro](http://img.dfm.lrv.jp/arduino/ArduinoMicro_thumb.jpg)|![leonardo](http://img.dfm.lrv.jp/arduino/Leonardo_thumb_a.jpg)|
|マイコン|ATmega328(+ATmega16u2)|ATmega32u4|ATmega32u4|
|keyboard/Mouse|×|○|○|
|デジタルIO|14|20|20|
|アナログIO|6|12|12|
|FlashROM|32kb(Bootloader0.5kb)|32kb(Bootloader4kb)|32kb(Bootloader4kb)|
|SRAM|2kb|2.5kb|2.5kb|
|EEPROM|1kb|1kb|1kb|
|Clock|16Mhz|16Mhz|16Mhz|

独断と偏見の特徴など

#### Arduino Micro

よいところ

- UNOと比べるとIOが多い
- KeyboardやMouseデバイスが簡単に作れる
- 小さい！

いやなところ

- 小さいくせにIOが多すぎる（ちょっとしたことに使いたいときに、Microの場合みずらくて面倒）
- なぜかピンヘッダなし版がない！そのうえピンが太くてブレッドボードに刺すとなかなか抜けない！というかブレッドボードが無いといきなり使いにくくなる！
- ACアダプタがさせない！（今回追加）

#### Arduino UNO

よいところ

- マイコン2つ搭載！いじれば結構いろいろできる。
- DIP版を買うと、これだけでDIP版ATmega8系を量産できる。
- とにかく情報が豊富
- ACアダプタが刺さる！

いやなところ

- MicroやLeonardoと比べるとIOが少ない
- KeyboardやMouseデバイスが簡単には作れない
- (私はそんなにイヤじゃないけど)標準USB-Type B

#### Arduino Leonardo

よいところ

- UNOと比べるとIOが多い
- KeyboardやMouseデバイスが簡単に作れる
- ACアダプタが刺さる！
- ピンヘッダなし版がうってる！

いやなところ

- Microと比べると大きい
- 存在感ないw

## というわけで使ってみます。

Arduinoばっかこんなにどーすんだよ。。。とうのは置いといてw
違うコンテキストから生成したモデルインスタンス間でリレーションは作れない

違うコンテキストから生成したモデルインスタンス間でリレーションは作れないです。


やろうとすると

```
Illegal attempt to establish a relationship 'belongs_to' between objects in different contexts
```

になります。

ところで、appDelegate.swiftに定義されたコンテキストを、
コアデータを使いたい処理で

```
let appDel : AppDelegate = UIApplication.sharedApplication().delegate as AppDelegate
let context : NSManagedObjectContext
...

```
のように呼び出すのが嫌だったので

http://qiita.com/susieyy/items/acb3bc80a1dafe64cffd

を参考に、シングルトンクラスでコアデータを操作するようのクラスModelUtilを作って、

ModelUtil.sharedInstance.insertObject(..)

のように呼び出すように書いているのですが、
弊害とかあるのでしょうか。


（今回のエラーは、このシングルトンクラスで作成したコンテキストと、appDelegateに残したままだったコンテキストで生成したモデル同士でリレーションを作ろうとしてエラーになりました。）
activeadminのTips

## 既存の認証実装が存在してbefore_actionで呼ばれるのを/adminで回避する方法

`config/initializers/active_admin.rb`に下記を追加しましょう。Rails4はbefore_actionに変わりましたが、active_adminはbefore_filterのままなのが嵌まりどころです。

```
config.skip_before_filter :do_something_awesome
```

以下、追記していく予定です。
おまえは今まで打ったコマンドの回数をおぼえているのか

この記事では普段自分がシェル上でどんなコマンドをどれくらい打っているかを集計する方法を紹介します。

プログラマたるもの手でコマンドを打つときのタイプ数はできるだけ減らしたいものですが「まず敵を知れ」ということで、さっそく見て行きましょう。


# よく使うコマンドを集計する

このようなワンライナーを使います。

```sh
history | awk '{ print $2 }' | sort | uniq -c | awk '$1>1' | sort -r | head
```

すると、下記のように標準出力に表示されます。

```sh:stdout
1874 g
 572 ls
 485 git
 466 ssh
 231 vim
 210 cd
 210 rsync
```

だいたいの人は `git` や `cd`, `ls` あたりのコマンドが上位になったんじゃないかと思います。
「うわっ…私の `cd` 多すぎ…?」と思った方は、

* `cd` で頑張らずに [jump コマンド](https://github.com/rupa/z) で一気に移動する

などで、タイプ数を減らしてみるとよいかもしれません。


# git のサブコマンドを集計する
`git` は超頻出だったのでサブコマンドも確認することにしましょう[^1]。

```sh
history | awk '{ $1="";print }' | awk '$1=="g" || $1=="git" { print $2 }' | sort | uniq -c | awk '$1>1' | sort -r
```

```sh:stdout
 724 s
 424 d
 299 ci
 169 l
 139 add
 131 push
  71 stash

# 以下略
```

このように集計結果が表示されるかと思います。
Gitコマンドをできるだけ打たないようにするには次のようなアプローチが考えられます。

* gitconfig に [alias を設定](https://gist.github.com/teppeis/4117588#gitconfig) してみる
* IDEなどのGUIを使う


# それでは
よければコメント欄で集計結果をさらしてみてください。

Have fun!


[^1]: 筆者の使っている oh-my-zsh デフォルトの `g` alias も考慮してあります