OmniAICreator/Qiita-1.07M huggingface dataset:
SpockのSNAPSHOTが動かなくなった場合の対処


GroovyのテストフレームワークSpockの最新版(開発版)は`1.0-groovy-2.3-SNAPSHOT`でしたが、先週末(2015/2/28-3/2)にSNAPSHOTが更新され、Gradle 2.2.1(で、`gradleApi()`をdependencyに入れている場合)ではtestタスクが失敗するようになりました。
`gradleApi()`は、プラグインを書くために使用しています。

こんな書き方の場合です。

```groovy
dependencies {
   compile gradleApi()
   compile localGroovy()
   :
   testCompile 'org.spockframework:spock-core:1.0-groovy-2.3-SNAPSHOT'
 }
```

`1.0-groovy-2.3-SNAPSHOT`がgroovy-all:2.3.10に依存するようになり、バージョンの競合が発生しているようです。

```
org.spockframework.util.InternalSpockError: Failed to instantiate spec 'XxxSpec'
:
Caused by: java.lang.ExceptionInInitializerError
:
Caused by: groovy.lang.GroovyRuntimeException: Conflicting module versions. Module [groovy-all is loaded in version 2.3.6 and you are trying to load version 2.3.10
```

最初は

```
compile localGroovy()
```

と書いているのが原因かと思い

```
compile 'org.codehaus.groovy:groovy-all:2.3.10'
```

としましたが変わらず、原因は`gradleApi()`のようでした。

以下のようにspockのdependencyから`groovy-all`を外してやれば、これまで通りに動くようになりました。

```groovy
dependencies {
   compile gradleApi()
   compile localGroovy()
   :
   testCompile ('org.spockframework:spock-core:1.0-groovy-2.3-SNAPSHOT') {
       exclude group: 'org.codehaus.groovy', module: 'groovy-all'
   }
 }
```

あるいは`transitive = false`でも問題なさそうです。

```groovy
dependencies {
   compile gradleApi()
   compile localGroovy()
   :
   testCompile ('org.spockframework:spock-core:1.0-groovy-2.3-SNAPSHOT') {
       transitive = false
   }
 }
```

なお、Groovy 2.4を使っている場合は、新しく追加された`1.0-groovy-2.4-SNAPSHOT`が使えます。

(2015/03/05 追記)
1.0の正式版がリリースされました。
上記の`1.0-groovy-2.3-SNAPSHOT`と`1.0-groovy-2.4-SNAPSHOT`は使えなくなっています。
`1.0-groovy-2.3`または`1.0-groovy-2.4`を使えば良さそうです。
CentOS7 firewall設定


## firewall有効化確認  
```bash
# systemctl list-unit-files | grep firewall  
> firewalld.service                           enabled
```

## http/httpsのアクセスを許可
```bash
# firewall-cmd --permanent --zone=public --add-service=https
# firewall-cmd --permanent --zone=public --add-service=http
```

## 設定反映
```bash
# firewall-cmd --reload 
```

## 設定確認(アクセスが許可されているサービス)
```bash
# firewall-cmd --list-service --zone=public 
>dhcpv6-client http https ssh
```
srcgenを使って poor man's fizzbuzz

[srcgen](https://github.com/tomerfiliba/srcgen) を使って頭の悪いまじめな人が書くfizzbuzzを生成する。

```py3
# -*- coding:utf-8 -*-
from srcgen.python import PythonModule

m = PythonModule()


def fizzbuzz(i):
    r = []
    if i % 3 == 0:
        r.append("fizz")
    if i % 5 == 0:
        r.append("buzz")
    return "".join(r) if r else i


def genfizzbuzz(m, beg, end):
    def genfn():
        with m.def_("fizzbuzz", "n"):
            with m.if_("n == {}".format(beg)):
                m.return_(repr(fizzbuzz(beg)))

            for i in range(beg + 1, end + 1):
                with m.elif_("n == {}".format(i)):
                    m.return_(repr(fizzbuzz(i)))

            with m.else_():
                m.raise_("NotImplementedError('hmm')")

    def genmain():
        with m.if_("__name__ == '__main__'"):
            m.import_("sys")
            m.stmt("print(fizzbuzz(int(sys.argv[1])))")
    genfn()
    genmain()
    return m


if __name__ == "__main__":
    import sys
    try:
        beg, end = sys.argv[1:]
    except ValueError:
        beg, end = 1, 100
    m = PythonModule()
    print(genfizzbuzz(m, int(beg), int(end)))
```

使い方

```bash
$ python poormans_fizzbuzz.py 1 100 > fizzbuzz.py
$ python fizzbuzz.py 3
fizz
```
## 生成されたコード

```py3
def fizzbuzz(n):
    if n == 1:
        return 1
    elif n == 2:
        return 2
    elif n == 3:
        return 'fizz'
    elif n == 4:
        return 4
    elif n == 5:
        return 'buzz'
    elif n == 6:
 # ... 省略
    elif n == 100:
        return 'buzz'
    else:
        raise NotImplementedError('hmm')

if __name__ == '__main__':
    import sys
    print(fizzbuzz(int(sys.argv[1])))
```

## appendix

何か関数が大きすぎると解析の途中で失敗する？

```bash
$ python poormans_fizzbuzz.py 1 10000 > fizzbuzz.py
$ python fizzbuzz.py 
RuntimeError: maximum recursion depth exceeded during compilation
```
Boost.Logの使い方 (4. cmakeによるコンパイル)

1. [概略](https://qiita.com/termoshtt/items/071fcefef4720dcd790d)
2. [ログの収集](https://qiita.com/termoshtt/items/ee9a6df5d4a5f30a86f6)
3. [ログの出力](https://qiita.com/termoshtt/items/6b25084556f8a69239cb)
4. [cmakeによるコンパイル](https://qiita.com/termoshtt/items/9c856562fe8a8c42560c)

今回はcmakeによるコンパイルについてです。


compile with cmake
------------------

Boost.Logのコンパイルは面倒との意見が散見されます。
公式はbjamを使用するようにと書いていますが、
ここではcmakeを使用したコンパイルについて説明します。

私のサンプルコード[termoshtt/boost_log_sample](https://github.com/termoshtt/boost_log_sample)よりCMakeLists.txtを抜粋します：

```cmake:CMakeLists.txt
cmake_minimum_required(VERSION 2.8)
find_package(Boost COMPONENTS thread system log log_setup REQUIRED)
find_package(Threads)
include_directories(${Boost_INCLUDE_DIRS})
```

Boost.Logは1.54よりBoost本体に含まれていますので、
上述のようにcmakeで簡単に検出できます。
Boost.Threadをリンクする必要があるので、Threadsも同時にfindしておきます。

注意としてはBoost.Logのコンパイル時に動的リンクを行うためのフラグを指定する必要がある点です：

```
add_definitions("-DBOOST_LOG_DYN_LINK")
```

これであとは`target_link_libraries`で`${Boost_LIBRARIES}`と`${CMAKE_THREAD_LIBS_INIT}`をリンクするか、

```cmake
macro(link_boost_log target)
  target_link_libraries(${target} ${Boost_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT})
endmacro(link_boost_log)
```

のようなマクロを組めば完了です。
SwiftでJSONを使ってみた


今までObjective-cでJSONをやっていたんですが、
Swiftをそろそろやってみようと思い調べながらやってみましたのでメモついでに書き込みます。

## 共通定数クラス
取得先のURLは共通定数クラスに定義したいので以下のようにしました。
（他にいい書き方ないのかな。。。）

```swift:Const.swift
import Foundation

class const {
    /** JSON用URL */
    struct jsonUrl {
        static let hoge = "http://hoge.com/hoge.json"
        ・
        ・
        ・
    }
}
```


## JSONを取得してログに出してみる

### JSONのサンプル
取得するJSONのサンプルは以下の通りです。

```json
{
  "items" : [
    {
      "title" : "hogeeeeee",
      "image" : "http://hoge.co.jp/hogeeee.jpg",
      "release" : "2015-03-01T00:00:00+00:00",
      "auth" : "保毛保毛"
    },
    ・
    ・
    ・
   ]
}
```


### 定数を取得
先ほど *Const.swift* で定義した値を使って`NSData`型で取得します。

```swift:リクエストのURL
var strJsonUrl = const.jsonUrl.hoge
var jsonData = NSData(contentsOfURL: NSURL(string: strJsonUrl)!)
```

### Swiftで単純にやってみた
キー`items`の中にあるリストから１つ目を取得し、その中のキー`title`のValueを取得してみます。

```swift
let jsonMap:NSDictionary = NSJSONSerialization.JSONObjectWithData(jsonData!,options: NSJSONReadingOptions.AllowFragments, error: nil) as NSDictionary
if let itemsArray = jsonMap["items"] as? NSArray {
    if let firstItem = itemsArray[0] as? NSDictionary {
        if let item = firstItem["title"] as? NSString {
            println(item)
        }
    }
}
```
面倒すね。。

```log:結果
hogeeeeee
```

### SwiftyJSONを使ってみた
SwiftyJSONを取得します。
実際に使うのは *Source* ディレクトリの中にある *SwiftyJSON.swift* のみです。
そのままプロジェクトにドラッグアンドドロップで取り込みます。

```cmd:GitHub
git clone https://github.com/SwiftyJSON/SwiftyJSON.git
```
ソースは以下のとおりです。

```swift
let json = JSON(data:jsonData!)
println(json)
if let title = json["items"][0]["title"].string {
    println(title)
}

```

とっても簡単！
SwiftyJSONがすげー！って記事をいくつか見たんですが、半信半疑でやった結果
やっぱりすげー！でした。

## 参考

* [[Swift] JSONを簡単に扱う為のライブラリ SwiftyJSONのサンプル - Developers.io](http://dev.classmethod.jp/smartphone/iphone/swiftyjson/)
* [SwiftでJSONを扱うライブラリ SwiftyJSON | json-swift - 定食屋おろポン](http://oropon.hatenablog.com/entry/2014/06/27/015824)

※サイトに記載されてるままではOptionalでエラーになってしまいました。
Boost.Logの使い方(2. ログの収集)

1. [概略](https://qiita.com/termoshtt/items/071fcefef4720dcd790d)
2. [ログの収集](https://qiita.com/termoshtt/items/ee9a6df5d4a5f30a86f6)
3. [ログの出力](https://qiita.com/termoshtt/items/6b25084556f8a69239cb)
4. [cmakeによるコンパイル](https://qiita.com/termoshtt/items/9c856562fe8a8c42560c)


今回はログの収集についてです。

# 状況設定

ログを取るためにライブラリを使用する必要があるのは、複数のモジュールがあるときに
特定のモジュールからのログを選り分けたりする必要がある場合です。
最小の状況設定として以下の場合を考えます。

```
CMakeLists.txt
mod1/CMakeLists.txt
     func.hpp
     func1.cpp
     func2.cpp
     logger.cpp
client.cpp
```

あるモジュール`mod1`を`client.cpp`から使う場合を考えます。
また全てcmakeを使用してコンパイルします。

尚文章中に出現する略したnamespaceは以下の通りです：

```cpp
namespace logging = boost::log;
namespace keywords = logging::keywords;
namespace sinks = logging::sinks;
namespace src = logging::sources;
namespace attrs = logging::attributes;
namespace expr = logging::expressions;
```

またサンプルコードは[termoshtt/boost_log_sample](https://github.com/termoshtt/boost_log_sample)にあります。

# loggerの定義

自作loggerを作る事によって、そのloggerによって収集されるログに情報を付加できます。
以下で深刻度付きのloggerを生成します

```cpp:mod1/func.hpp
namespace mod1 {
enum severity_level { debug, info, warning, error, critical };
BOOST_LOG_INLINE_GLOBAL_LOGGER_DEFAULT(
    logger,                                                 // loggerの名称
    boost::log::sources::severity_logger_mt<severity_level> // loggerの型
    );
} // namespace mod1
```

これで`mod1::logger`が定義されます。
これは例えば以下のように使います。

```cpp:mod1/func1.cpp
namespace mod1 {
void func1() {
  auto &lg = logger::get();
  BOOST_LOG_SEV(lg, info) << "info in mod1::func1";
}
} // namespace mod1
```

loggerの実体は`::get()`で取得します。
`BOOST_LOG_SEV`は深刻度と一緒にログを記録するためのマクロです。
`info`は`mod1::info`な事に注意してください。

## Tag, Scopeの追加

Boost.Logでは別のloggerで収集されたログは全て同じようにsinkに送られます。
つまりデフォルトではどのloggerから出力されたのかわかりません。
そこでloggerに、そのloggerで収集されたログに情報を付加する設定をします。

```cpp:mod1/logger.cpp
namespace mod1 {
void init() {
  auto &lg = logger::get();
  lg.add_attribute("Tag", attrs::constant<std::string>("mod1"));
  lg.add_attribute("Scope", attrs::named_scope());
}
} // namespace mod1
```

モジュール自体の初期化コードでloggerを設定します。
これで`mod1::logger`を通して収集されたログにはタグ"mod1"が付きます。

またログがどの関数で収集されたか、さらに言えばどのif文等のどのスコープで出力されたか、
というのは重要な情報である場合が多いです。
これを保持するのが`Scope`です。
これは常に値が一定("mod1")のタグと異なり、収集されるログ毎に値が変化します。

```cpp:mod1/func1.cpp
namespace mod1 {

void func1(bool flag) {
  BOOST_LOG_FUNCTION(); // Scopeに関数名(void func1(boo))を登録する
  auto &lg = logger::get();
  if (flag) {
    BOOST_LOG_NAMED_SCOPE("true case"); // Scopeに入った事を記録する
    BOOST_LOG_SEV(lg, info) << "flag is true";
  } else {
    BOOST_LOG_NAMED_SCOPE("false case"); // Scopeに入った事を記録する
    BOOST_LOG_SEV(lg, info) << "flag is false";
  }
  BOOST_LOG_SEV(lg, error) << "Some error occurs!!";
}

} // namespace mod1
```

# まとめ
これでモジュール中でログを収集する事が可能になりました。
trivialの場合と比べるとloggerを作る必要があるため、少し面倒ですが、
といっても数行追加するだけで済みました。
付加情報はloggingライブラリには必須なので、是非導入しましょう。
次回は収集したログを出力する方法をまとめます。
activerecord-postgis-adapterでカラムをGeography型に変換


activerecord-postgis-adapterをRails4.2に対応している3系にアップデートしたらtypeをしていてgeography型のつもりがgeometry型になっているカラムがあった。

これが原因でエラーが発生したためマイグレーションを書いた。

この時のchange_columnする際の型指定の方法の例。

```
change_column :post_photos, :geog, 'geography(Point,4326)', null: false
```

良い方法がわからなかったので文字列で指定した。
うまく動いている。`null: false` はオプションをつける例としてつけた。
Project Euler 33

問題
---
49/98は面白い分数である.「分子と分母からそれぞれ9を取り除くと, 49/98 = 4/8 となり, 簡単な形にすることができる」と経験の浅い数学者が誤って思い込んでしまうかもしれないからである. (方法は正しくないが，49/98の場合にはたまたま正しい約分になってしまう．)

我々は 30/50 = 3/5 のようなタイプは自明な例だとする.

このような分数のうち, 1より小さく分子・分母がともに2桁の数になるような自明でないものは, 4個ある.

その4個の分数の積が約分された形で与えられたとき, 分母の値を答えよ.
http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%2033

回答
---
2つの分数a1/b1, a2/b2の値が同じ　
→　a1//gcd(a1, b1) == a2//gcd(a2,b2) and b1//gcd(a1, b1) == b2//gcd(a2,b2)
分数a/bの約分
→　(a//gcd(a,b)) / (b//gcd(a,b))

上記事実を元に適当にコーディングした。そのうち直したい（＝やらない）


```py
def gcd(m,n):
  if m < n:
    (m,n) = (n,m)
  while n != 0:
    (m,n) = (n,m%n)
  return m
  
def main():
  seq = range(11,100)
  ans_x = 1
  ans_y = 1
  for i in seq:
    for j in seq[i+1:]:
      for (x, y) in delete_same_number(i,j):
        x, y = int(x), int(y)
        if x == 0 or y == 0:
          break

        gcd1 = gcd(i,j)
        gcd2 = gcd(x,y)
        if (i//gcd1 == x//gcd2) and (j//gcd1 == y//gcd2):
          if (i%10) == 0 or (j%10) == 0:
            pass
          else:
            ans_x *= x//gcd2
            ans_y *= y//gcd2
  print ans_y//gcd(ans_x,ans_y)

def delete_same_number(i,j):
  s1 = str(i)
  s2 = str(j)
  if s1[0] == s2[0]:
    yield (s1[1], s2[1])
  if s1[0] == s2[1]:
    yield (s1[1], s2[0])
  if s1[1] == s2[0]:
    yield (s1[0], s2[1])
  if s1[1] == s2[1]:
    yield (s1[0], s2[0])
  yield ('0','0')
main()
```
Rails on Tiles

```Source.cpp
#include "Header.h"

RailsOnTiles::RailsOnTiles()
{
	m_direction = NORTH;
	m_tile = B;
}

void RailsOnTiles::placeInfoChange(TILENUMBER outside1, TILENUMBER outside2, TILENUMBER outside3, DIRECTIONS direction, TILEMOVE tilemove)
{
	if(m_tile == outside1 || m_tile == outside2 || m_tile == outside3){
		m_direction = OutSide;
		return;
	}
	m_direction = direction;
	m_tile = (TILENUMBER)((int)m_tile + tilemove);
}

void RailsOnTiles::moveUpper()
{
	placeInfoChange(A, B, C, SOUTH, UPPER);
}

void RailsOnTiles::moveLeft()
{
	placeInfoChange(A, D, G, EAST, LEFT);
}

void RailsOnTiles::moveRight()
{
	placeInfoChange(C, F, I, WEST, RIGHT);
}

void RailsOnTiles::moveUnder()
{
	placeInfoChange(G, H, I, NORTH, UNDER);
}

void RailsOnTiles::tile0Course()
{
	switch(m_direction){
		case EAST	:	moveLeft();	break;
		case SOUTH	:	moveUpper();break;
		case WEST	:	moveRight();break;
		case NORTH	:	moveUnder();
	}
}

void RailsOnTiles::tile1Course()
{
	switch(m_direction){
		case EAST	:	moveUpper();break;
		case SOUTH	:	moveLeft(); break;
		case WEST	:	moveUnder();break;
		case NORTH	:	moveRight();
	}
}

void RailsOnTiles::tile2Course()
{	
	switch(m_direction){
		case EAST	:	moveUnder();break;
		case SOUTH	:	moveRight();break;
		case WEST	:	moveUpper();break;
		case NORTH	:	moveLeft();
	}
}

const char RailsOnTiles::moveTile(int& tileType)
{
	switch(tileType){
		case 0	:	tile0Course(); break;
		case 1	:	tile1Course(); break;
		case 2	:	tile2Course();
	}
	return m_tile + 'A';
}

const std::string RailsOnTiles::solve(const std::string& input)
{
	std::string result = "B";
	while(m_direction != OutSide){
		int tileType = input.at(m_tile) - '0';
		result += moveTile(tileType);
	}
	result.erase(--result.end());
	return result;
}


void test(const std::string& input, const std::string& output)
{
	static int testNumber = 1;
	RailsOnTiles ROT;
	std::string result = ROT.solve(input);
	std::cout << testNumber << ":" << result << " 正解は " << output << std::endl;
	if(result != output){
		std::cout << "test is NG!" << std::endl;
	}
	testNumber++;
}

int main()
{
	test("101221102","BEDGHIFEH");
	return 0;
}
```

```Header.h
#ifndef _HEADER_H
#define _HEADER_H

#include<iostream>
#include<string>

class RailsOnTiles
{
public:
	RailsOnTiles();
	const std::string solve(const std::string& input);

private:
	enum DIRECTIONS{ EAST, SOUTH, WEST, NORTH ,OutSide};
	enum TILEMOVE{UPPER = -3, LEFT = -1, RIGHT = 1, UNDER = 3};
	enum TILENUMBER{A, B, C, D, E, F, G, H, I};
	DIRECTIONS m_direction;
	TILENUMBER m_tile;

	const char moveTile(int& tileType);
	void moveUpper();
	void moveLeft();
	void moveRight();
	void moveUnder();
	void tile0Course();
	void tile1Course();
	void tile2Course();
	void placeInfoChange(TILENUMBER outside1, TILENUMBER outside2, TILENUMBER outside3, DIRECTIONS direction, TILEMOVE tilemove);
};

#endif

```
【岩井さん勉強会#3】宿題の復習、Gitについて

#1.宿題の復習（アプリ作成報告）
勉強会も第3回になりました。
今回は宿題の提出→アプリのソースコードチェックをまず始めにやりました。

### 1.1 挑戦したアプリ達
宿題として3つのアプリ作成に挑戦しました。
まず1つ目お手本にしたのがこれ。
→[Swiftで初めて動きのあるゲームを開発する人向けチュートリアル(なんとかストライクを例にStep by Step解説)](http://avier.hateblo.jp/entry/2014/09/22/100201)

まだ僕にとってはちょっとレベルが高かったです。
コピペでつくろうとしたけど、コードの意味とかもよくわかってない時点で
ちょっとエラーになるとどこが悪かったんだ？
と振り返ってもさっぱり。

もう一度振り出しに戻っても違うところでエラーになる...あれこれで、
1つ目のアプリは諦めました(笑)

次、2つ目。
これです。
→[【初心者】iPhoneアプリを作ってみる【講座】](http://www.gadget2ch.com/archives/37101993.html)

おみくじアプリを作る講座。2chに載ってました。

お、これなら簡単そうだ！


作ってる途中で気が付きました。

…あれ？これObject-Cじゃね？


ということで途中であきらめて←

最終的にこれにいきつきました。
3つ目。
「画面にプログラムでこんにちはと表示する」
→[次回記事参照](http://qiita.com/tamoryo37/items/e7351fca835ac165437e)


これだ！
と思いました。

まずPC初心者はコードもわからなければ、
プログラミングの基礎的な構成もわからない。

そこで、体系的に基礎からゆっくり学ぶのが一番の近道だなと思いました。
（頭の良いいわゆる天才くんたちはネットとかで検索しながらでも大丈夫だと思う）


###1.2 岩井さんソースコード解説
1つ目のアプリ「なんとかストライク」の解説で、
Swiftで使われる「Optional Value」というものが出てきました。

###1.3 Optional Value（オプショナル値）
SwiftにはOptional Valueというものが存在します。

Optional Value・・・アプリがクラッシュするのを防ぐ安全機能。

「`?`」や「`!`」を使う書き方で、エラーが出やすくつまづきやすいところみたいです。
「そもそも、Swiftにはどうしてこんな機能があるの？」
って調べたら、危険性なプログラムを書くとその場でエラー表示をしてくれるという、
「Xcodeが、プログラマーをアシストしてくれる安全機能」ってことでした（本に書いてあった）

####1.3.1 Optional Value「`?`」
「`?`」は、「この変数には、`nil`が入る場合があるかも？」という場合に使います。
「データによっては`nil`が入る可能性があるから、Xcodeはエラー出さなくていいよ」
って時に使います。


####1.3.2 Optional Value「`!`」
「!」は、「この変数には、`nil`が入っていないことを証明するよ！」という場合に使います。
「この変数にnilが入らないようにしてるし、もし`nil`が入ったら使わないようなプログラムを書いてるから大丈夫だよ！」
って時に使います。

＊`nil`・・・値の決まってない空のデータ。=`null`

Optional Valueの変数を作るときや、具体的な使い方については
それだけで1記事くらいの記事になるので書いてみようと思います。てへぺろ

ちなみにこちらの記事わかりやすかったです。
[[Swift] Swiftのoptional valueの便利さ /「?」と「!」でより堅牢なコードへ](http://qiita.com/nori0620/items/afa94cc42f3233f54bdc)

#2.Gitって？
予習はこのサイトでしました。
[サルでもわかるGit入門](http://www.backlog.jp/git-guide/)

確かにサルでもわかるかも！
ってくらいわかりやすかったです。

Gitはファイルやソースコードなどのバージョン（更新履歴など）を管理するためのシステムです。
SVNとの大きな違いは、個人の作業もバージョン管理できる点です。

リモートリポジトリとローカルリポジトリがあり、
個人の作業はローカルリポジトリに保存（commit）、共有したいときはリモートリポジトリに保存（push）します。

図にするとこんな感じ
![Untitled1.png](https://qiita-image-store.s3.amazonaws.com/0/68268/d6ccd70b-add8-6c7c-0da9-320037dcef05.png)


#3.まとめ
今回もたくさん勉强になりましたー！

宿題は
□Gitで運用できるようにする
□アプリ開発の教科書を進める

ありがとうございます。それでは。
jQueryに特定の値を受け渡す方法


<h3>jQueryで、画像の生の値を取得したい</h3>
WordPressを使ったサイトを構築したときのお話。
クライアント側の画面サイズと、元画像のアスペクト比を使用して、表示領域のサイズを変える処理が必要になりました。

<h3>付帯条件</h3>
１：処理の負荷は軽く。
２：実装はできるだけ簡潔に
３：できるかぎりサーバ側で処理させたい。

<h3>結論から言えば、PHPでアスペクト比を算出。</h3>

jQuery側で元画像のオブジェクトを生成し、そこから幅と高さを取得し、アスペクト比を算出・・・と考えましたが、

ときどきうまく取得できないことがある。
コールバックを使っても良いのですが

「欲しいのは、画像の元データのアスペクト比」であることに立ち返り、

サーバサイドで、アスペクト比を算出することに。
で、hiddenタグ使って値を受け渡しました。

吐き出されるソースはあまり綺麗ではありませんが、
簡潔ではあります。

※hiddenタグ内のアスペクトに異常な値を入れても、
個人情報の漏洩などには繋がりにくいので、その点はあまり害がないです。
Edison XDK使わずにLチカ

自分用 edison メモ
XDK使わずにLチカ

## ファームウェアアップデート
Rel-2-BETA-WW0515（2015/03/03時点の最新バージョン
http://www.intel.com/support/edison/sb/CS-035180.htm

[Flashing Edison (wired) - Mac](https://communities.intel.com/docs/DOC-23193) とか見ながら頑張る

## シリアル接続
```shell-session
me@local:~$ screen /dev/cu.usbserial-AJ035HIP 115200 -L

Poky (Yocto Project Reference Distro) 1.6.1 edison ttyMFD2

edison login: root

root@edison:~# cat /etc/version
weekly-120
```

`weekly-120` ならR2最新

## セットアップ
パスワードとか、wifiとか

```shell-session
root@edison:~# configure_edison --setup
```
セットアップが終われば http://edison.local でアクセスできるようになる

## opkg update & upgrade
```shell-session
root@edison:~# vi /etc/opkg/base-feeds.conf
src/gz all http://repo.opkg.net/edison/repo/all
src/gz edison http://repo.opkg.net/edison/repo/edison
src/gz core2-32 http://repo.opkg.net/edison/repo/core2-32

root@edison:~# vi /etc/opkg/intel-iotdk.conf
src intel-iotdk http://iotdk.intel.com/repos/1.1/intelgalactic
src intel-all http://iotdk.intel.com/repos/1.1/iotdk/all
src intel-i586 http://iotdk.intel.com/repos/1.1/iotdk/i586
src intel-x86 http://iotdk.intel.com/repos/1.1/iotdk/x86

root@edison:~# opkg update
root@edison:~# opkg upgrade
```

## mraa
nodeでLチカ（without XDK

```shell-session
root@edison:~# opkg install git
root@edison:~# git clone https://github.com/intel-iot-devkit/mraa.git
root@edison:~# node mraa/examples/javascript/Blink-IO.js
```

## gpio
ArduinoオンボードLED（13PIN）を操作、`1` でON、`0` でOFF

```shell-session
root@edison:~# echo "1" > /sys/class/gpio/gpio40/value
root@edison:~# echo "0" > /sys/class/gpio/gpio40/value
```
[Shield pin GPIO mapping](http://kei-sakaki.jp/2015/02/28/read-for-intel-edison-kit-for-arduino-hardware-guide-331191-007-japanese/#331191-007-2.1 Shield pin GPIO mapping) を参考に

## 参考にしたqiita
* http://qiita.com/yoneken/items/1b24f0dd8ae00579a0c2
* http://qiita.com/nenjiru/items/efa78b6685a4f62d3f7e
エクセルのシート切り替えのショートカットキーをシンプル(Ctrl+jとCtrl+k)にできたお話

# お知らせ
最終的にマウスの進む・戻るボタンにシート切り替えを割り当てるのが
私に最も最適な設定でした。詳細は下記を参照似ていただきたく。
http://exsoul.hatenablog.com/entry/2015/03/11/002825

# 背景
エクセルのシート切り替えのショートカットキーはCtrl＋PgUp or PgDn ですが、
ノートPCだったりするとFnキー押さないといけなかったり、そもそもキー配置的に押しにくいです(個人的感想)
なので、簡単に押せるショートカットにしたいと思い経ちました。

# 環境
Windows7
Excel2010

# 想定していた解決案

* ショートカットキーの変更(最もシンプル)
* 任意のソフトにおけるショートカットキーバインドの変更
* エクセルマクロ(最終手段)

# 結論
エクセルマクロで実現しました。

ただし、実際に編集、作成するエクセルにマクロを組み込むことは可能な限り避けたかったので、
**個人用マクロブック**というものを使用しました。

## 個人用マクロブックとは
自身の環境でエクセルを作成・編集する場合のみに適用されるマクロを記述するため専用の
エクセルブックのことです。
これを使用することで、たとえ通常マクロ実行不可のｘｌｓｘ拡張子のエクセルでもマクロが実行できます。
(セキュリティの設定によるかもしれません)

## 実施した内容
* エクセルを起動
* リボンのウインドウタブ > 再表示 で PERSONAL.XLSB を選択
* 開発タブよりVB編集画面を開き、上記のブックに標準モジュールを追加
* 標準モジュールに以下を追記
 
```
Sub NextSheetActive()
    Set SH = ActiveSheet
    On Error Resume Next
    ''右のシートへ。末尾なら最初に
    If ActiveSheet.Name = Sheets(Sheets.Count).Name Then
        Sheets(1).Activate
    Else
        ''非表示のシートは飛ばす
        Do While SH.Next.Visible <> xlSheetVisible
            If Err <> 0 Then Exit Do
            Set SH = SH.Next
        Loop
            If SH.Next.Visible <> xlSheetVisible And SH.Next.Name = Sheets(Sheets.Count).Name Then
                Sheets(1).Activate
            Else
                SH.Next.Activate
            End If
        On Error GoTo 0
    End If
End Sub

Sub PreviousSheetActive()
    Set SH = ActiveSheet
    On Error Resume Next
     ''左のシートへ。最初なら末尾に
    If ActiveSheet.Name = Sheets(1).Name Then
        Sheets(Sheets.Count).Activate
    Else
        ''非表示のシートは飛ばす
        Do While SH.Previous.Visible <> xlSheetVisible
            If Err <> 0 Then Exit Do
            Set SH = SH.Previous
        Loop
            If SH.Previous.Visible <> xlSheetVisible And SH.Previous.Name = Sheets(1).Name Then
                Sheets(Sheets.Count).Activate
            Else
                SH.Previous.Activate
            End If
        On Error GoTo 0
    End If
End Sub
```

* 開発タブ > マクロ で作成した2つのマクロにショートカットを割り当てる

私はCtrl＋jとCtrl+kを設定しました。
Ctrl＋kは既存でリンクの作成が割りあたっていますが今まで使ったこともないショートカットキーなので
迷わず上書きです。

* 表示されていたPERSONAL.XLSBを保存し非表示に戻す。
* エクセルを閉じる(PERSONAL.XLSBについてのメッセージがでてくるはず)

# 感想
すこぶる楽になりました。
あのわずらわしかったシート切り替えがホームポジション上でできるようになりました。
既存のエクセルでも使用できますし、作成エクセルにマクロも残らないので影響もありません。
大満足です。

# 補足
マクロのショートカットはCtrl(＋Shift)＋英数字しか割り当てられません。
VBでショートカット登録をコーディングすればAltなども使えるようになるみたいです。
私も最初はAlt+jを想定していました。
が、VBでの追加が必要なことと、Altキーがエクセルのキー操作のホットキーになっているのでやめました。

# 参考にさせて頂いたサイト
http://kokodane.com/macro10.htm
https://support.office.com/ja-jp/article/Excel-%E3%81%AE%E3%82%B7%E3%83%A7%E3%83%BC%E3%83%88%E3%82%AB%E3%83%83%E3%83%88-%E3%82%AD%E3%83%BC-6a4319ef-8ea9-45d1-bd98-f238bf953ba6?ui=ja-JP&rs=ja-JP&ad=JP
http://www.moug.net/tech/exvba/0040030.html
Rails4 + Cells 4系 : ハマりポイントと回避策をまとめてみた。 

# cells とは
cells は、controller と view をパッケージングしてまとめるための gem です。cells を利用することで、関連の強い controller内の処理 と view をパッケージングすることができ、再利用性やコードの見通しがよくなります。

例えば、ポップアップ画面やサイドバーを実装するときに有効です。cells の利用シーンについては、以下の記事が詳しいです。
http://qiita.com/hanzochang/items/374c31d026d55d0b49f0

# cells3.x と cells4.x の違い
cells は 3.x と 4.x があるのですが、これらは大きく異なります。4.x では ActionView の機能を include するのをやめています。結果、描画速度が向上しています。しかし、一方で、ActionView の便利な機能がデフォルトでは使えなくなっています。

# cells4.x でハマった点まとめ
ActionView を切った結果、cells4.x にはけっこうハマりポイントがあります。以下の点でハマりました... けっこうハマりました。そこで私と同じ苦労をする人が減るように、ハマった点をカバーできる application_cell.rb を公開します。

* devise の helper が使えない
* image_path が使えない
* form_for が使えない
* fields_for が使えない
* i18n が使えない
* flash が使えない

```rb:cells/application_cell.rb
class ApplicationCell < Cell::ViewModel

  # 独自の helper
  include ApplicationHelper

  # 認証系 のhelper
  include DeviseHelper

  # gem の helper
  include FontAwesome::Rails::IconHelper
  include BreadcrumbsOnRails::ControllerMixin::HelperMethods
  include LazyHighCharts::LayoutHelper

  # asset 関連（image_path）
  include ActionView::Helpers::AssetUrlHelper
  include Sprockets::Rails::Helper
  ## asset の探索範囲を指定
  self.assets_prefix      = Rails.application.config.assets.prefix
  self.assets_environment = Rails.application.assets
  ## asset に digest が付与されるようにする
  self.digest_assets      = Rails.application.config.assets[:digest]

  # form 関連
  include ActionView::RecordIdentifier
  include ActionView::Helpers::FormHelper
  include ActionView::Helpers::FormOptionsHelper

  ## form_for の内部で利用しているため include
  String.send :include, ActionView::Helpers::TextHelper
  String.send :include, ActionView::Context

  ## form_for の返り値が escape されてしまうので override 
  def form_for(model, options, &block)
    raw(super)
  end

  ## fields_for の返り値が escape されてしまうので override 
  def fields_for(model, &block)
    raw(super)
  end

  # i18n 関連
  include ActionView::Helpers::TranslationHelper

  def scope_key_by_partial(key)
    if key.to_s.first=="."
      "cells.#{self.class.to_s.underscore}#{key}"
    else
      key
    end
  end

  # model が複数の場合のエイリアス
  def models
    model
  end

  # flash にアクセスできるように
  def flash
    parent_controller.flash
  end

end
```
.batで迷宮入り

　ネットワーク関連、ファイル管理関連その他で活躍するbatファイル先生で、少し遊んでみようと思います。

　迷宮入りなどと言っておきながら、中身は**ただの迷路**です。

　正方形の迷路で、だんだん大きくなっていきます(7*7~47*47)。操作はWASDのみ。マップ全部が表示されるわけではなく常に7*7の範囲しか表示しないため、だんだん気が狂いそうになります。
　まだまだ発展の余地のあるプログラムですが、バッチファイルでこんな酔狂をやってみるのも結構楽しいです。皆さんもぜひ！~~（現在は麻雀AI作りで四苦八苦。無理。）~~

```lang:迷路.bat
@echo off
setlocal enabledelayedexpansion
title 迷路
:top
set lv=0
cls
echo 迷路
echo.
echo  1.Start
echo  0.Exit
choice /c 10 /n
if %errorlevel% == 2 exit

:start
if %lv% == 10 goto clear
set /a lv+=1
set /a num=lv*4+7
set /a startx=2,starty=2,goalx=num-1,goaly=num-1
set nowx=2
set nowy=2
mode con:cols=20 lines=12
set loop1=0

:setfield1
cls 
echo 構築中(%loop1%/%num%)
if %loop1% == %num% set loop1=0&goto edit1
set /a loop1+=1
set loop2=0

:setfield2
set /a loop2+=1
set cell[%loop1%][%loop2%]=■
set /a loop1judge=loop1%%2
set /a loop2judge=loop2%%2
if %loop2% geq 2 if %loop2% lss %num% if %loop1judge% == 0 set cell[%loop1%][%loop2%]=　
if %loop1% geq 2 if %loop1% lss %num% if %loop2judge% == 0 set cell[%loop1%][%loop2%]=　
if %loop2% == %num% goto setfield1
goto setfield2

:edit1
set /a loop1+=1
set /a x=loop1*2+1
if %x% == %num% goto echo1
set loop2=0
:edit2
set /a loop2+=1
set /a y=loop2*2+1
if %y% == %num% goto edit1
set /a vector=%random%*4/32767+1
if %vector% == 4 if %x% geq 5 set /a vector=%random%*3/32767+1
if %vector% == 1 set /a subjectx=x,subjecty=y-1
if %vector% == 2 set /a subjectx=x+1,subjecty=y
if %vector% == 3 set /a subjectx=x,subjecty=y+1
if %vector% == 4 set /a subjectx=x-1,subjecty=y
set cell[%subjectx%][%subjecty%]=■
goto edit2

:echo1
set cell[%startx%][%starty%]=Ｓ
set cell[%goalx%][%goaly%]=Ｇ
set nowcell=cell[%nowx%][%nowy%]
set /a echocellx=nowx-3
set /a echocelly=nowy-3
set /a echolimit=num-6
if %echocellx% leq 0 set echocellx=1
if %echocelly% leq 0 set echocelly=1
if %echocellx% gtr %echolimit%  set echocellx=%echolimit%
if %echocelly% gtr %echolimit%  set echocelly=%echolimit%
set /a loop1=echocellx-1
set /a echomaxx=echocellx+6
set /a echomaxy=echocelly+6

set %nowcell%=○

:echo2
set /a loop1+=1
set cell%loop1%=
for /l %%i in (%echocelly%,1,%echomaxy%) do set cell%loop1%=!cell%loop1%!!cell[%loop1%][%%i]!
set cell%loop1%=｜!cell%loop1%!｜
if %echomaxx% == %loop1% goto echo3
goto echo2

:echo3
cls
echo  Lv:%lv%(%num%*%num%)
echo 　―――――――
for /l %%i in (%echocellx%,1,%echomaxx%) do echo !cell%%i!
echo 　―――――――
choice /c wdsa /n >nul
set action=%errorlevel%
if %action% == 1 set /a movex=nowx-1,movey=nowy
if %action% == 2 set /a movex=nowx,movey=nowy+1
if %action% == 3 set /a movex=nowx+1,movey=nowy
if %action% == 4 set /a movex=nowx,movey=nowy-1
if !cell[%movex%][%movey%]! == ■ goto echo3
if %action% == 1 set /a movex-=1
if %action% == 2 set /a movey+=1
if %action% == 3 set /a movex+=1
if %action% == 4 set /a movey-=1
set %nowcell%=　
set nowx=%movex%
set nowy=%movey%
if [%nowx%][%nowy%] == [%goalx%][%goaly%] goto goal
goto echo1

:goal
cls
echo goal^!^!
timeout /t 1 /nobreak >nul
echo.
echo go to next stage!
pause >nul
goto start

:clear
cls
echo clear^!^!
echo.
echo お疲れ様でした！
pause >nul
goto top
```

以上です。不具合・感想などありましたら、是非コメントにて。
JSON文字列をシェル上で整形する方法

Python2.6以上の環境であれば下記のコマンドで整形してくれます。

```
$ echo '{"hoge": 1, "fuga": ["a", "b", "c"], "piyo": {"a": ["d", "e", "f"]}}' | python -mjson.tool
{
    "fuga": [
        "a",
        "b",
        "c"
    ],
    "hoge": 1,
    "piyo": {
        "a": [
            "d",
            "e",
            "f"
        ]
    }
}
```

パースエラーも発見できます。

```
$ echo '{
    "hoge": "a"
    "fuga": "b"
}' | python -mjson.tool
Expecting , delimiter: line 3 column 5 (char 22)
```

参考：
http://docs.python.jp/2.6/library/json.html
Playground で UICollectionView の Cell の調整をする



# UICollectionViewCell をカスタマイズする

[Playground で UITableView の Cell の調整をする](http://qiita.com/takecian/items/b23bcf207325b02798d6) の UICollectionView バージョンです。

CustomCollectionViewCell の内容を書き換えて完成したらプロジェクトのカスタムセルにコピペします。

Playground って便利ですね。

```
import UIKit
import XCPlayground

class CustomCollectionViewCell: UICollectionViewCell{
    
    override init(frame: CGRect){
        super.init(frame: frame)

        // ここを書き換えることで UI の調整をする
        var label = UILabel(frame: CGRectMake(0, 0, 30, 30))
        label.text = "test"
        label.backgroundColor = UIColor.whiteColor()
        self.contentView.addSubview(label)
    }
    
    required init(coder aDecoder: NSCoder){
        super.init(coder: aDecoder)
    }
}

class CollectionViewController: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource {
    
    var collectionView: UICollectionView!
    let items = ["Item 1", "Item 2", "Item 3"]
    
    override func viewDidLoad() {
        super.viewDidLoad()
        self.view.frame = CGRect(x: 0, y: 0, width: 320, height: 480)
        
        let flowLayout = UICollectionViewFlowLayout()
        flowLayout.scrollDirection = .Vertical
        flowLayout.minimumInteritemSpacing = 5.0
        flowLayout.minimumLineSpacing = 5.0
        flowLayout.itemSize = CGSizeMake(40, 40)
        
        self.collectionView = UICollectionView(frame: self.view.frame, collectionViewLayout: flowLayout)
        self.collectionView.registerClass(CustomCollectionViewCell.self, forCellWithReuseIdentifier: "cell")
        self.collectionView.dataSource = self
        self.collectionView.backgroundColor = UIColor.whiteColor()
        self.view.addSubview(self.collectionView)
    }
    
    func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCellWithReuseIdentifier("cell", forIndexPath: indexPath) as UICollectionViewCell
        cell.backgroundColor = UIColor.redColor()
        return cell
    }
    
    func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int {
        return 1
    }
    
    func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return 42
    }
}

var ctrl2 = CollectionViewController()
XCPShowView("Playground collection view", ctrl2.view)
```
型クラス`Num` は `Eq` ではない 

学習の素材は、
[すごいHaskellたのしく学ぼう!](http://www.amazon.co.jp/すごいHaskellたのしく学ぼう-Miran-Lipovača/dp/4274068854)

> この表記は、私見・感想です。

## `Num`のインスタンスは当然のように等値比較できると思っていたが

サンプルコードを試していると、手本どおりにもかかわらずエラーになるプログラムがあった。

```hs
finiteRandoms :: (RandomGen g, Random a, Num n) => n -> g -> ([a], g)
finiteRandoms 0 gen = ([], gen)
finiteRandoms n gen =
    let (value, newGen) = random gen
        (restOfValue, finalGen) = finiteRandoms (n-1) newGen
    in (value:restOfValue, finalGen)
```

これは有限のリストと乱数ジェネレータを返す関数だが、このままGHCiにロードしようとすると、

```hs
randomTest.hs:14:15:
    Could not deduce (Eq n) arising from the literal ‘0’
    from the context (RandomGen g, Random a, Num n)
      bound by the type signature for
                 finiteRandoms :: (RandomGen g, Random a, Num n) =>
                                  n -> g -> ([a], g)
      at randomTest.hs:13:18-69
    Possible fix:
      add (Eq n) to the context of
        the type signature for
          finiteRandoms :: (RandomGen g, Random a, Num n) =>
                           n -> g -> ([a], g)
    In the pattern: 0
    In an equation for ‘finiteRandoms’: finiteRandoms 0 gen = ([], gen)
Failed, modules loaded: none.
```

といったエラーがでた。
リテラルの`0` をパターンマッチで使っているが、型制約を見ても`Eq` 型クラスであることを推論できなかった、という内容となっている。

**`Num` は等値比較を要件としていない** 。したがって、パターンマッチに数値リテラルを使うならば、その型は`Eq` のインスタンスでなくてはならない。この場合は`Eq a` という型制約を追加すると、エラーを解消することができる。


## 参考サイト

stackoverflow:[Haskell error: “Could not deduce (Eq a) arising from the literal ‘0’”](http://stackoverflow.com/questions/26456179/haskell-error-could-not-deduce-eq-a-arising-from-the-literal-0)
Playground で UITableView の Cell の調整をする


# UITableViewCell をカスタマイズする

Playground 上で UITableView の Cell のカスタマイズをやってみました。
実機やシミュレータで UI を確認しながら調整するより簡単にできます。

手順は以下のとおりです。

## 1. Playground を開く。

File -> New -> Playground で Playground を開きます。

## 2. ソースコードを貼り付ける。

下記コードを Playground に貼り付けます。コードの内容は ViewController 上に UITableView を表示するというシンプルなコードです。
表示する Cell の内容は CustomTableViewCell に記述。

```
import UIKit
import XCPlayground

class CustomTableViewCell: UITableViewCell{
    override func setNeedsLayout() {
        super.setNeedsLayout()
        
        // ここを書き換えることで UI の調整をする
        var label = UILabel(frame: CGRectMake(100, 10, 200, 50))
        label.text = "test label"
        self.addSubview(label)
    }
}

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
    
    var tableView: UITableView!
    let items = ["Item 1", "Item 2", "Item 3"]
    
    override func viewDidLoad() {
        super.viewDidLoad()
        self.view.frame = CGRect(x: 0, y: 0, width: 320, height: 480)
        self.tableView = UITableView(frame:self.view.frame)
        self.tableView!.dataSource = self
        self.tableView!.registerClass(UITableViewCell.self, forCellReuseIdentifier: "cell")
        self.view.addSubview(self.tableView)
    }

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int{
        return self.items.count;
    }
    
    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell{
        var cell = CustomTableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: "cell")
        let text = self.items[indexPath.row]
        cell.textLabel?.text = text
        return cell
    }
}

var ctrl = ViewController()
XCPShowView("Playground tableview", ctrl.view)

```

## 3. Playground 上に UI を表示する

Playground の評価結果の横に出ている丸いアイコンをクリックすると UI が表示されるようになります。

![スクリーンショット 2015-03-03 10.36.38.png](https://qiita-image-store.s3.amazonaws.com/0/27210/93cf5e63-75a6-cbd9-fea8-4a3c74c81687.png "スクリーンショット 2015-03-03 10.36.38.png")


![スクリーンショット 2015-03-03 10.36.56.png](https://qiita-image-store.s3.amazonaws.com/0/27210/b866749f-7f34-c7b0-85bf-2744878f6111.png "スクリーンショット 2015-03-03 10.36.56.png")

## 4. コードを書き換えて微調整

Custom の UITableViewCell の内容を書き換えて変更したい UI になるように変更します。
例えば label の背景を緑にする、というコードを追加します。

```
        label.backgroundColor = UIColor.greenColor()
```

すると下記のように変更が自動的に反映されます。

![スクリーンショット 2015-03-03 10.37.39.png](https://qiita-image-store.s3.amazonaws.com/0/27210/2d076839-defe-a9c3-b17c-8ca8aeaf3cb5.png "スクリーンショット 2015-03-03 10.37.39.png")

Playground で Custom Cell の調整をして、完成してからプロジェクトにコピペすると便利です。

UICollectionView の Cell の調整をするサンプルは[こちら](http://qiita.com/takecian/items/1f55c8a968e17f49ba23)です。
Chef Development Kit (chefdk) をローカルインストールする

## chefdk の ローカルインストール
資材はどうしても必要なのでオンラインでダウンロードしたものをサーバに配置する。（今回はwgetしちゃってます）
※「$」でコンソール書いてますけどrootで作業してます（#だとコメントアウトとわかりづらいので）

```

$ wget https://opscode-omnibus-packages.s3.amazonaws.com/el/6/x86_64/chefdk-0.4.0-1.x86_64.rpm
$ rpm -Uvh chefdk-0.4.0-1.x86_64.rpm

$ chef --version
Chef Development Kit Version: 0.4.0

$ chef generate repo chef-repo
Compiling Cookbooks...
以下略

$ cd chef-repo/
$ vi centos.json
{ "run_list": "recipe[echo]" }

$ knife cookbook create echo -o cookbooks
$ vi cookbooks/echo/recipes/default.rb
#
# Cookbook Name:: echo
# Recipe:: default
#
# Copyright 2015, YOUR_COMPANY_NAME
#
# All rights reserved - Do Not Redistribute
#

script "echo test" do
  interpreter "bash"
  user "root"
  code <<-EOL
    echo "ECHOTEST" >> /tmp/echo.log
    cat /tmp/echo.log
  EOL
end

$ ls -l /tmp/
total 0

$ chef-client -z -j centos.json
[2015-03-03T14:50:21+00:00] WARN: No config file found or specified on command line, using command line options.
Starting Chef Client, version 12.0.3
resolving cookbooks for run list: ["echo"]
Synchronizing Cookbooks:
  - echo
Compiling Cookbooks...
Converging 1 resources
Recipe: echo::default
  * script[echo test] action run
    - execute "bash"  "/tmp/chef-script20150303-4755-ydbzl"

Running handlers:
Running handlers complete
Chef Client finished, 1/1 resources updated in 3.085442146 seconds

$ ls -l /tmp/
total 4
-rw-r--r--. 1 root root 9 2015-03-03 14:50 echo.log

$ cat /tmp/echo.log
ECHOTEST

$ ls -l nodes/xxxx.json
$ cat nodes/xxxx.json
以下略


$ knife configure
$ cat /root/.chef/knife.rb
log_level                :info
log_location             STDOUT
node_name                'root'
client_key               '/root/.chef/root.pem'
validation_client_name   'chef-validator'
validation_key           '/etc/chef-server/chef-validator.pem'
chef_server_url          'https://xxxx:443'
syntax_check_cache_path  '/root/.chef/syntax_check_cache'

$ vi /root/.chef/knife.rb
log_level                :info
log_location             STDOUT
node_name                'root'
syntax_check_cache_path  '/root/.chef/syntax_check_cache'


$ knife node list -z
xxxx

$ knife node show xxxx -z
以下略

$ knife cookbook list -z
echo   0.1.0

```

## 参考
・http://www.creationline.com/lab/6380
・http://www.sawanoboly.net/blog/2014/11/25/chef-solo-zero-knife-solo-zero
Pleiades All in One 4.4 Javadoc(ファイルヘッダ)のショートカットエラー

Pleiades4.4 を使ってみたらファイルヘッダのJavadoc挿入のショートカットAlt+Shift+jでエラーが発生している...
詳しくないので知っている方がいたら教えてほしいでです！

○ ダウンロードversion
Pleiades All in One 4.4.1.v20140926

○ エラー内容
"メンバーに Javadoc コメントを付加" 中に内部エラーが発生しました。
org.eclipse.jdt.internal.core.PackageDeclaration cannot be cast to org.eclipse.jdt.core.IMember
Project Euler 32

問題
---
すべての桁に 1 から n が一度だけ使われている数をn桁の数がパンデジタル (pandigital) であるということにしよう: 例えば5桁の数 15234 は1から5のパンデジタルである.

7254 は面白い性質を持っている. 39 × 186 = 7254 と書け, 掛けられる数, 掛ける数, 積が1から9のパンデジタルとなる.

掛けられる数/掛ける数/積が1から9のパンデジタルとなるような積の総和を求めよ.

HINT: いくつかの積は, 1通り以上の掛けられる数/掛ける数/積の組み合わせを持つが1回だけ数え上げよ.
http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%2032

回答
---
パンデジタル数は、その意義から9!通り存在する。つまり、0から9!未満の10進数は、パンデジタル数のそれぞれと対応する。
この9!未満の10進数をパンデジタル数に変換し、当該パンデジタル数を分割して条件を満たしているか否かを判定することにより、答えを求める。また、HINTに着目し、積の値を記憶して同一の計算を排除する。（先に単に積だけを抽出する関数を作る方が多分効率が良い。
なお、簡単な考察から求めるべき積が3桁にはなりえないし、5桁にもなりえないことはわかるので、以下のコードでは4桁に決め打っている。

```py
import math
def create_pandigital(target,n,seeds):

  ret = ''
  while n > 0:
    kaijo = math.factorial(int(n))
    (q, r) = (target//kaijo, target%kaijo)
    ret += str(seeds.pop(q))
    target = r
    n -= 1
  return ret + str(seeds[0])

def main():
  N = 10
  MAX = math.factorial(int(N-1))
  ans = 0
  seeds = []
  seq = range(1,N)
  ls = []
  for target in range(3,MAX):
    seeds[:] = seq
    n = N - 2
    pan =  create_pandigital(target, n, seeds)

    for i in range(1,4):
      if not (pan[:4] in ls) and int(pan[:4]) == (int(pan[4:4+i+1]) * int(pan[4+i+1:])):
        ls.append(pan[:4])
        ans += int(pan[:4])
        break
  print ans

main()
```
Gitで間違えたメールアドレスを設定してコミットしてしまったときの対処

### 経緯
- メールアドレスが間違った状態でgitを使っていたところContributionsの色が付かなくなる事案が発生（赤枠のところ）
- 今月は毎日commitするぞい！と思ってたので悲しい

![スクリーンショット 2015-03-03 23.52.18.png](https://qiita-image-store.s3.amazonaws.com/0/63145/c8adb42b-b179-e715-5a0f-e199f44aec8a.png)

### 対応方法
- そんなときにこのコマンドを使えば、メアドを正しいものに戻せました

```
git filter-branch --commit-filter '
        if [ "$GIT_COMMITTER_EMAIL" = "tjinjin@example.com" ];
        then
                GIT_COMMITTER_NAME="tjinjin"
                GIT_COMMITTER_EMAIL="tjinjin@example.jp"
                GIT_AUTHOR_EMAIL="tjinjin@example.jp"
                git commit-tree "$@"
        else
                git commit-tree "$@"
        fi' -- --all

```
今回の場合はGIT_COMMITTER_EMAILが誤っているものを変更しています。この部分を変更すればいろいろできそうですね。

### 注意事項
修正後はforce pushするので使い方にはご注意ください。
ファクトリメソッドを使ってAkkaのメモリリークを防ぐ

[Effective Akka](http://shop.oreilly.com/product/0636920028789.do)にコンパニオンオブジェクトのファクトリメソッドを使ってPropsのインスタンスを作ることでメモリリークに対処できる、といった記述があってピンと来なかったので試してみた。  

#### リークするサンプル
```scala
package leak.sample

import java.lang.management.ManagementFactory

import akka.actor.{Actor, ActorSystem, Props}

object FactoryActorApp extends App {
  val system = ActorSystem()
  println("Creating instances.")
  for (i <- 1 to 100000) {
    system.actorOf(Props[SourceFActor]) ! "foo"
  }
  val pid = ManagementFactory.getRuntimeMXBean.getName.split('@').head
  println("Created instances.")
  println(s"jmap -histo:live ${pid}")
}

class SourceFActor extends Actor {
  val i = 1
  
  def receive = {
    case "foo" =>
      context.system.actorOf(Props(new TargetNActor(i)))
      context.stop(self)
  }
}

object TargetFActor {
  def props(n: Int) = Props(classOf[TargetFActor], n)
}

class TargetFActor(n: Int) extends Actor {
  def receive = {
    case "bar" => println(n)
  }
}
```
これを実行してコンソールから以下のコマンドをたたいてオブジェクトの数を確認する。
(findのところはunixではgrepとかにする。)

```
> jmap -histo:live 4024 | find "sample"
  14:        100000        2400000  leak.sample.SourceNActor
  15:        100000        2400000  leak.sample.TargetNActor
  16:        100000        1600000  leak.sample.SourceNActor$$anonfun$receive$1
  17:        100000        1600000  leak.sample.SourceNActor$$anonfun$receive$1$$anonfun$applyOrElse$1
  18:        100000        1600000  leak.sample.TargetNActor$$anonfun$receive$2
 344:             1             40  leak.sample.NewActorApp$
 617:             1             16  leak.sample.NewActorApp$delayedInit$body
```


#### リークしないサンプル
```scala
package leak.sample

import java.lang.management.ManagementFactory

import akka.actor.{Actor, ActorSystem, Props}

object NewActorApp extends App {
  val system = ActorSystem()
  println("Creating instances.")
  for (i <- 1 to 100000) {
    system.actorOf(Props[SourceNActor]) ! "foo"
  }
  val pid = ManagementFactory.getRuntimeMXBean.getName.split('@').head
  println("Created instances.")
  println(s"jmap -histo:live ${pid}")
}

class SourceNActor extends Actor {
  val i = 1
  
  def receive = {
    case "foo" =>
      context.system.actorOf(TargetFActor.props(i))
      context.stop(self)
  }
}

class TargetNActor(n: Int) extends Actor {
  def receive = {
    case "bar" => println(n)
  }
}
```

同じようにjmapする。

```
>jmap -histo:live 3868 | find "sample"
  15:        100000        2400000  leak.sample.TargetFActor
  17:        100000        1600000  leak.sample.TargetFActor$$anonfun$receive$2
 340:             1             40  leak.sample.FactoryActorApp$
 616:             1             16  leak.sample.FactoryActorApp$delayedInit$body
 617:             1             16  leak.sample.TargetFActor$
```

リークする方のサンプルではSourceXXActorのインスタンスが残ってしまっている。
これはPropsのコンストラクタの引数が名前渡しになっていて実は引数の値と共に呼び出し元のActorの参照を渡してしまっているのが原因らしい。

名前渡し危険、というわけではないだろうからもう少し調べる必要がありそう。
【トラブルシューティング】docker-registry-frontendの導入で困ったところ

Dockerのプライベートレジストリをウェブから見れるようにするdocker-registry-frontendを導入した際に発生した問題のトラブルシューティングです。

##ENV_DOCKER_REGISTRY_HOSTにはlocahostは指定できない
考えてみれば当たり前なんですが一度やってしまいました。
ENV_DOCKER_REGISTRY_HOSTはDockerコンテナ内からレジストリにアクセスできるホスト名を指定する必要があります。
僕は面倒なのでレジストリを起動しているDockerホストのIPを直に指定しました。

##リバースプロキシからフロントエンドに繋げるときはサブディレクトリを指定しない
http://example.com/docker-frontend/ でアクセスできるようにしようとか最初考えると思いますが動きません。
面倒ですがサブドメインを作るなどしてルートのパスからフロントエンドにアクセスできるようにしないと動作しません。(2015/03/03現在)

###原因
Dockerコンテナ自身がレジストリへのプロキシとなることでAjaxでAPIにアクセスしているみたいなのですが、このときにサブディレクトリを考慮していないため、http://example.com/docker-frontend/v1/search というパスでアクセスすべきところを http://example.com/v1/search でアクセスしてしまっているためです。

GitHubのIssueで同じように悩んでいる方がいるのですが、英語できないので教えてあげられない。。。
追記： 頑張って投稿してみた。意味わかんねぇとか言われたらどうしよう。。。
Macでmysqlを使えるようにする


##手順
* Homebrewにてインストールしていきます。

```
$ brew update
$ brew install mysql

```

```
$ mysql.server start

Starting MySQL
. SUCCESS! 

```

* 接続確認

```
$ mysql -uroot
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 17
Server version: 5.6.23 Homebrew

Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> exit
Bye
```

## mysql_secure_installationを使ってみる

できることは以下

* rootユーザーのパスワード設定
* アノニマスユーザーの削除
* rootユーザーのリモートログイン禁止
* テスト用データーベースの削除
* 変更した情報の再読み込み

```
$ mysql_secure_installation

```

今のパスワードを訊かれます。何もパスワード設定していないため、
そのままエンター

```
Enter current password for root (enter for none):
OK, successfully used password, moving on...
```

rootパスワードを設定します。

```
Set root password? [Y/n] y
New password:
Re-enter new password:
Password updated successfully!
Reloading privilege tables..
 ... Success!
```

後は、全部yでokです！！


改めてログイン

```
$mysql -uroot -p[今回設定したパスワード]

```

お疲れ様でした。
HandsontableをjQuery Freeなスタイルで使ってみる

スプレッドシート風テーブル表示を行うJavaScriptライブラリ [Handsontable](http://handsontable.com/ "Handsontable") 。
機能的にはもっと豪華なものがあるが、シンプルな使い勝手とセルを選択して内容をコピーするとそのままExcelに張り込める形になるあたりが同僚に評価されていることもありちょっとしたブラウザベースのツールでよく使っている。

久々に新規ツールを書くことになって最新版を見に行ったら0.12からjQuery Freeになったとか。
（有力なフレームワークの選択肢が増えたこともあって自分のウォッチしている範囲のライブラリでもjQuery離れが進んでいるのを感じる）

普段の書き方をjQuery Freeなスタイルに置き換えてみる。といっても見かけはほぼ変わらない。
なおhandsontable.full.cssおよびhandsontable.full.jsは同じディレクトリに置いているものとする。

```html:example.html
<!DOCTYPE html>
<html>
<head>
<meta charset='utf-8'>
<title>example</title>
<link rel='stylesheet' href='./handsontable.full.css' />
</head>
<body>
  <div id='sheet'></div>
<script type='text/javascript' src='./handsontable.full.js'></script>
<script type='text/javascript'>
var data = [
    { id: 1, name: '太郎', age: 20, link: '<a href="http://example.com/member/1">プロフィール</a>' },
    { id: 2, name: '次郎', age: 20, link: '<a href="http://example.com/member/2">プロフィール</a>' },
    { id: 3, name: '三郎', age: 20, link: '<a href="http://example.com/member/3">プロフィール</a>' }
  ];

var container = document.getElementById('sheet');
var configure = function() {
  var columnSettings = [
    { width: 64, head: 'ID', setting: {data: 'id', type: 'numeric', readOnly: true} },
    { width: 80, head: '名前', setting: {data: 'name'} },
    { width: 80, head: '年齢', setting: {data: 'age', type: 'numeric'} },
    { width: 160, head: '', setting: {data: 'link', renderer: 'html', readOnly: true} }
  ];
  return {
    data: [],
    rowHeight: 24,
    colWidths: columnSettings.map(function(e) { return e.width; }),
    colHeaders: columnSettings.map(function(e) { return e.head; }),
    columns: columnSettings.map(function(e) { return e.setting; }),
    contextMenu: true
  };
};

var hot = new Handsontable(container, configure());
hot.loadData(data);
</script>
</body>
</html>
```
Handsontableは公式のサンプルがそろっているほうだと思うのであまり困ることはないと思う。

上記のサンプルでちょっと工夫しているポイントは

* カラムの幅情報や見出しの組み合わせをわかりやすくするために設定情報をいったん配列に格納してmapで取り出している
* configure()が送り返す設定のうちdataは空の配列にしている
* dataの設定はloadData()であとから行う

あたりか。
dataをいったん空にしておきあとからloadData()で流し込んでいるのはデータが増えたときにページネーションをするケースにおいて構造を移行しやすくするための布石。
もちろん初期状態でデータを流し込んでいてもよいのだが、サーバーから逐次データを引っ張ってくるのであればデータ設定部分を一貫した操作で行えるほうがよいと思っている。
Twitter風LaunchAnimationを作った

# Twitter風LaunchAnimationとは

Twitterアプリを立ち上げたときのアニメーションのこと
![launch_animation.gif](https://qiita-image-store.s3.amazonaws.com/0/32599/0363ec94-9932-1734-08d0-da3ed8d55584.gif)

# 作りかた

ざっくり言うと
1. ViewControllerの遷移アニメーションを記述するクラスで、
2. 遷移先のViewControllerをTwitterアイコンの形にマスクして
3. 縮小拡大するアニメーションを書く
という感じです


## 1. ViewControllerの遷移アニメーションを記述する

iOS7からViewControllerの遷移アニメーションを記述できるようになったのでそれを利用します。custom transitionと呼ばれています。ネットで適当なサンプル拾って動かしてみると理解しやすいと思います。
例えば http://www.appdesignvault.com/custom-transition-ios-7/ とか

## 2. layer.maskを使う

CALayerのmaskプロパティにCALayerのインスタンスを代入するとその形状どおりにマスクされます。layer.maskを使って、遷移先画面をTwitterアイコンの領域だけ見えるようにします。
参考 http://lab.spec5zigen.com/archives/calayer/

```
CALayer *maskLayer = [CALayer layer];
maskLayer.contents = (id)[UIImage imageNamed:@"twitter"].CGImage;
maskLayer.contentsScale = [UIScreen mainScreen].scale;
CGFloat iconSize = 96;
maskLayer.frame = CGRectMake(toView.center.x - iconSize/2 , toView.center.y - iconSize / 2, iconSize, iconSize);
toView.layer.mask = maskLayer;
```

## 3. keyframe & scale animation

キーフレームアニメーションで時間ごとのアニメーションを指定します。scaleを使ってmasklayerを縮小させたり拡大させたりします。

```
CAKeyframeAnimation *animation= [CAKeyframeAnimation animationWithKeyPath:@"transform.scale"];
animation.keyTimes = @[@0.0, @0.3, @1.0];
animation.values = @[
    [NSValue valueWithCATransform3D:CATransform3DIdentity],
    [NSValue valueWithCATransform3D:CATransform3DMakeScale(0.7, 0.7, 1.0)],
    [NSValue valueWithCATransform3D:CATransform3DMakeScale(70, 70, 1.0)]
];
CAMediaTimingFunction *linear= [CAMediaTimingFunction functionWithName: kCAMediaTimingFunctionLinear];
CAMediaTimingFunction *easein= [CAMediaTimingFunction functionWithName: kCAMediaTimingFunctionEaseIn];
animation.timingFunctions = @[linear, linear, easein];
```


## サンプルコード

https://github.com/TomohikoSato/LaunchAnimation