OmniAICreator/Qiita-1.07M huggingface dataset:
PHP の array_filter関数でゼロを残す方法


## 追記（2015/2/8）

コメントで指摘があった以下の部分を修正しました。

- 記事内の表記を「空文字」から「空文字列」へと修正、統一。
- 「除外するキーワードを指定する。」のタイトルを「削除するキーワードを指定する。」に変更。
- 「削除するキーワードを指定する。」のコードを適切なものに修正。
- 「除外するキーワードを指定する。（追記）」の項目を追加。
- 「除外するキーワードを複数指定する。」のコードを適切なものに修正。

具体的な修正部分については[変更履歴](http://qiita.com/mathlow/items/349e40bf8e4334225d92/revisions)をご覧ください。

## 配列から空文字列を削除したい。

PHPの配列で空文字列を削除したい場合、下記のコードでできます。

````php
$array = array('hoge', 100, '', '0', 0);
$array = array_filter($array);

# $array = ['hoge', 100];
````

空文字列だけを削除したいのに、````'0'```` と ````0```` も削除されてしまいます。

## 削除するキーワードを指定する。

先ほどの例から、空文字列だけを削除するコードは下記になります。

````php
$array = array('hoge', 100, '', '0', 0);
$array = array_filter($array, function ($k) {
  return $k !== '';
});

# $array = ['hoge', 100, '0', 0];
````

見事に ````'0'```` は残って空文字列が削除されました。

やったねたえちゃん！

## 除外するキーワードを指定する。（追記）

また、空文字列の他に ````FALSE```` や ````NULL```` も削除されて良いのであれば、更にシンプルに書くこともできます。
下記の場合、空文字列は削除されますが、````'0'```` と ````0```` が残ります。

````php
$array = array('hoge', 100, '', '0', 0);
$array = array_filter($array, 'strlen');

# $array = ['hoge', 100, '0', 0];
````


## 除外するキーワードを複数指定する。

複数の値を残したい場合、値チェックで ````in_array````関数を使えばOKです。

````php
$array = array('hoge', 100, '', '0', 0);
$array = array_filter($array, function($k) {
  if( in_array($k, array('0', 0), true) ) return true;
  return !empty($k);
});

# $array = ['hoge', 100, '0', 0];
````


## 参考リンク

- [PHP: array_filter - Manual](http://php.net/manual/ja/function.array-filter.php)
- [PHPでの空値の扱い～issetとemptyを比較する - 戦う葦　～ウェブリテラシー篇](http://d.hatena.ne.jp/tatakauashi/20080529/1212030859)
- [PHP: in_array - Manual](http://php.net/manual/ja/function.in-array.php)

## 参考リンク（追記）

- [PHPのin_arrayは罠が多いので注意喚起が必要 - Qiita](http://qiita.com/tadsan/items/2a4c3e6b0b74a408c038)
第28回オフラインリアルタイムどう書くの問題をRubyで解く

問題は
http://nabetani.sakura.ne.jp/hena/ord28spirwa/

```rb
def solve(q)
  ds,days = q.split(':')
  n,e,s,w = ds.split(',').map(&:to_i)
  done = [[0,0]]
  n.times{|i| done << [0,i+1]}
  e.times{|i| done << [i+1,0]}
  s.times{|i| done << [0,-i-1]}
  w.times{|i| done << [-i-1,0]}
  x,y = 1,1
  done << [1,1]
  d = :E
  days.to_i.times{
    case d
    when :E
      x += 1
      d = :S unless done.include?([x,y-1])
      d = :N if done.include?([x+1,y])
    when :S
      y -= 1
      d = :W unless done.include?([x-1,y])
      d = :E if done.include?([x,y-1])
    when :W
      x -= 1
      d = :N unless done.include?([x,y+1])
      d = :S if done.include?([x-1,y])
    when :N
      y += 1
      d = :E unless done.include?([x+1,y])
      d = :W if done.include?([x,y+1])
    end  
    done << [x, y]
  }
  d.to_s
end

DATA.readlines.each do |line|
  no,q,a = line.strip.split(/\s+/)
  ans = solve(q)
  print no + "\t" + ans
  puts ans == a ? ' o' : ' x'
end
__END__
0	2,3,5,4:85	S	 
1	1,2,3,4:1	E	 
2	1,2,3,4:2	S	 
3	1,2,3,4:3	S	 
4	1,2,3,4:4	W	 
5	1,2,3,4:27	E	 
6	1,2,3,4:63	E	 
7	1,2,3,4:40	W	 
8	1,4,3,2:40	S	 
9	3,3,3,3:30	S	 
10	3,3,3,3:31	E	 
11	3,3,3,3:32	E	 
12	3,3,3,3:70	S	 
13	3,3,3,3:71	E	 
14	3,3,3,3:72	E	 
15	1,1,1,1:7	N	 
16	1,2,1,1:7	W	 
17	1,6,1,1:7	S	 
18	1,8,1,1:7	E	 
19	1,1,1,1:30	N	 
20	1,2,1,1:30	W	 
21	1,5,1,1:30	S	 
22	1,8,1,1:30	E	 
23	9,9,9,9:99	W	 
24	5,6,3,8:3	E	 
25	5,8,1,1:11	W	 
26	2,8,1,2:18	S	 
27	3,2,3,1:20	N	 
28	3,3,8,1:28	N	 
29	2,5,1,2:32	E	 
30	2,5,1,6:33	E	 
31	1,2,5,7:34	N	 
32	3,6,5,6:36	E	 
33	6,2,8,1:39	S	 
34	3,1,2,3:41	W	 
35	1,1,3,4:45	W	 
36	1,3,1,2:46	N	 
37	4,4,4,4:49	W	 
38	3,1,4,4:55	N	 
39	6,6,2,1:56	W	 
40	3,2,1,2:59	S	 
41	2,7,7,1:60	S	 
42	3,1,1,1:63	N	 
43	4,6,4,1:78	E	 
44	7,5,3,6:79	W	 
45	7,8,3,1:81	E	 
46	3,2,5,2:82	S	 
47	1,1,3,4:84	N	 
48	7,4,1,5:88	S	 
49	3,6,5,3:89	S	 
50	1,4,2,3:92	N	 
51	1,3,4,5:93	W	 
52	2,4,8,1:94	W	 
53	3,6,1,7:99	S	 
```
浮動小数は曖昧に、他の型は正確に比較する

浮動小数はあいまいに比較したいけど他の型も比較したい。
そんな曖昧一致を実装する。

```cpp
#include <iostream>
#include <cmath>
#include <vector>
#include <type_traits>

template <typename A, typename B>
auto comp_arithmetic(A a, B b)
    -> typename std::enable_if<std::is_floating_point<decltype(a - b)>::value,
                               bool>::type {
  return std::abs(a - b) < 1e-10;
}

template <typename A, typename B>
auto comp_arithmetic(A a, B b)
    -> typename std::enable_if<!std::is_floating_point<decltype(a - b)>::value,
                               bool>::type {
  return a == b;
}

template <typename A, typename B>
auto comp(A a, B b)
    -> typename std::enable_if<
          std::is_arithmetic<A>::value &&std::is_arithmetic<B>::value,
          bool>::type {
  return comp_arithmetic(a, b);
}

template <typename A, typename B>
auto comp(A a, B b)
    -> typename std::enable_if<!std::is_arithmetic<A>::value ||
                                   !std::is_arithmetic<B>::value,
                               bool>::type {
  return a == b;
}

int main() {
  std::cout << comp(1, 1) << std::endl;
  std::cout << comp(1, 2) << std::endl;
  std::cout << comp(1., 1) << std::endl;
  std::cout << comp(1. + 1e-14, 1) << std::endl;

  std::vector<int> v(1), u(1);
  v[0] = 1;
  u[0] = 1;
  std::cout << comp(v, u) << std::endl;
  u[0] = 2;
  std::cout << comp(v, u) << std::endl;
  return 0;
}
```

[[Wandbox]三へ( へ՞ਊ ՞)へ ﾊｯﾊｯ](http://melpon.org/wandbox/permlink/riteGqBcY7OWoNWN)

ちょっと冗長になった
Regexp.unionで正規表現を結合する

最近知ったが非常に便利だと思った

```rb
REGEXP_INT = /\A\d+\Z/
REGEXP_EN  = /\A\w+\Z/

# 英数字のみ
p Regexp.union(REGEXP_INT, REGEXP_EN) =~ "123"     # => 0
p Regexp.union(REGEXP_INT, REGEXP_EN) =~ "abc"     # => 0
p Regexp.union(REGEXP_INT, REGEXP_EN) =~ "123abc"  # => 0
p Regexp.union(REGEXP_INT, REGEXP_EN) =~ "123-abc" # => nil
```

例えば正規表現のパターンを動的に配列に格納して使う事ができるので便利

```rb
# ある文字列から任意の単語を抽出する
str = "dog cat\npigdog mouse cat dog"
regexps = %w(dog cat).map {|s| Regexp.new(s)}

p str.scan(Regexp.union(*regexps))
# => ["dog", "cat", "dog", "cat", "dog"]

# おまけ（出現数カウント）
p str.scan(Regexp.union(*regexps)).group_by(&:itself).map{|k,v| [k.to_sym, v.size]}.to_h
# => {:dog=>3, :cat=>2}
```
bash > 複数ファイルの2列目だけを平均化 > コメントに早いバージョンあり > awk の連想配列を使う方法を教えていただきました

動作環境

    CentOS 6.5

300個近くあるファイルの2列目だけを平均化したい。

```in.001
0.0 3.14
1.0 2.71
2.0 6.022
```
などのファイルが`in.001`から`in.300`まで300個近くあるとする。
2列目(3.14, 2.71, 6.022)について全ファイルの平均を取りたい。

自分が作ったのは以下のスクリプト

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

#numcol=$(cat $1 | awk 'END{print NF}')
numline=$(cat $1 | awk 'END{print NR}')

#echo $numline $numcol

for idx in $(seq 1 $numline)
do #idx
indat=""	
for infile in $(echo $@)
do #infile
cond="NR==$idx"
line=$(awk $cond $infile)
xxx=$(echo $line | awk '{print $1}')
work=$(echo $line | awk '{print $2}')
indat="$indat $work"
done # infile

avg=$(echo $indat | awk '{for(i=1;i<=NF;i++){sum+=$i}; print sum/NF}')
echo $xxx $avg
done # idx
```

以下のように実行すると平均化されたものが出力される。

    $ bash avg_xxxfiles_exec in.*

問題はコーヒー1杯わかせるぐらい遅いこと。

<hr>
(追記)
実際に使うスクリプトはheliac2000さんがコメントされたawkの処理を使うと良い。こちらは瞬時に結果が出せる。
scalaz - Future

# Future

scalaz-concurrentのFutureを使ってみる。バージョンは7.1だ。

scala.concurrent.Futureと同じ意味だが、それの強化版だ。

[Futureのscaladoc](https://github.com/scalaz/scalaz/blob/series/7.1.x/concurrent/src/main/scala/scalaz/concurrent/Future.scala#L18)を見てみよう。

- [Trampoline](http://qiita.com/ryoppy@github/items/c03b47b34ddfd710809c)を使っているから、map/flatMapなモナディックな処理をしても一定のスタックしか使わない。
- scala-2.10のFutureと違って、[map/flatMapごとに新しくspawn](https://github.com/scala/scala/blob/2.11.x/src/library/scala/concurrent/Future.scala#L227-L258)しないし、ExecutionContextのimplicitも必要ない。

とのことらしい。

やたらscalaのFutureをdisっているので、scalazのFutureはより良いものなのだろう。

## 使ってみよう

まず確認用の関数を定義しておく。

```scala
def calc[A](a: A) = { Thread.sleep(1000); println(s"calc $a"); a }
```

Future.applyに処理を渡し、runで同期的に実行。(タイムアウトをつける場合はrunFor)

```scala
scala> Future(calc(1)).run
calc 1
res31: Int = 1
```

非同期で実行する場合は、start。

```scala
scala> Future(calc(1)).start
res32: scalaz.concurrent.Future[Int] = Suspend(<function0>)
calc 1
```

明示的だ。

onComplete的なことをしたい場合は、runAsync。

```scala
scala> Future(calc(1)).runAsync(i => println(s"i is $i"))
calc 1
i is 1
```

ここで一旦applyの定義を見てみよう。

```scala
/** Create a `Future` that will evaluate `a` using the given `ExecutorService`. */
  def apply[A](a: => A)(implicit pool: ExecutorService = Strategy.DefaultExecutorService): Future[A] = Async { cb =>
    pool.submit { new Callable[Unit] { def call = cb(a).run }}
  }
```

java.concurrentのを使っている。scalaのFutureと違いとても明確で分かりやすいコードだ。(scalaのFutureは謎に複雑で読むの辛い。Futureに限らないかもだけど...)

## 処理をつなげてみよう。

mapを使う。

```scala
scala> Future(calc(1)).map(i => calc(i + 1)).run
calc 1
calc 2
res22: Int = 2
```

順番に実行される。この辺の挙動はscalaのFutureと同じく、completeしてから次の処理が続く。

もちろんforもできる。

```scala
scala> for { a <- Future(calc(1)); b <- Future(calc(2)) } yield a + b
res39: scalaz.concurrent.Future[Int] = BindAsync(<function1>,<function1>)

scala> .start
res40: scalaz.concurrent.Future[Int] = Suspend(<function0>)

calc 1
calc 2
```

### 処理をまとめて受け取る。

Future.sequenceみたいに同時に走らせて結果をまとめるものもあった。

```scala
scala> Future.gatherUnordered( Future(calc(1)) :: Future(calc(2)) :: Nil ).run
calc 2
calc 1
res54: List[Int] = List(1, 2)
```

結果を合わせる。(Monoidのmappend)

```scala
scala> Future.futureInstance.aggregate( Future(calc(1)) :: Future(calc(2)) :: Nil ).run
calc 1
calc 2
res159: Int = 3
```

Future.futureInstanceはNondeterminismのインスタンスだ。

### まとめて結果を受け取り、順番通りに取得する。

both: 2つ並列に実行

```scala
scala> Future.futureInstance.both(Future(calc(1)), Future(calc(2))).run
calc 1
calc 2
res171: (Int, Int) = (1,2)
```

mapBoth: 2つ並列に実行後、callback関数を呼ぶ。

```scala
scala> Future.futureInstance.mapBoth(Future(calc(1)), Future(calc(2))) { case (a, b) => a + b }.run
calc 2
calc 1
res174: Int = 3
```

nmap3: 3つ並列に実行後、callback関数を呼ぶ。

```scala
scala> Future.futureInstance.nmap3(Future(calc(1)), Future(calc(2)), Future(calc(3))) { case (a, b, c) => a + b + c }.run
calc 1
calc 3
calc 2
res176: Int = 6
```

nmap6まである。

### 例外処理は含まない

scalazのFutureは例外処理を含まないので、scalaのFutureのように例外処理を扱いたいときは、Taskを使う。

次はTaskを見るとしよう。

今日はここまで。
Ionicの設定メモ [sass,coffee]

[Ionic](http://ionicframework.com/)はWebbaseのアプリを作るためフレームワークです．HTML,CSS,JavasciptでiOS，Androidのアプリを作ることができます．パフォーマンス的にはネイティブコードで書いたアプリより劣るという欠点がありますが，クロスプラッフォーム性，Web Viewの流用可という点も考えると使いドコロは一応あるでしょう．このIonicはアプリに必要な部品をフレームワーク側が提供してくれていて，割りと簡単にViewを作成することができます．

以下，初期設定のメモ．Ionicの標準だとsass,coffeeが含まれていないようだったので手動で設定しました．

# ionicのインストール
```bash
$ npm install -g cordova ionic
```

# scaffold
```bash
$ ionic start myApp sidemenu
$ cd myApp 
$ npm install
$ bower install
$ gulp install
$ ionic setup sass
$ ionic platform add ios

```
# js -> coffee変換

### coffeeの導入
```bash
$ npm install --save-dev coffee-script
$ npm install --save-dev gulp-coffee
$ npm install -g js2coffee
$ mkdir coffee
```

### gulpfile.jsを書き換える

```js
require('coffee-script/register');
require('./gulpfile.coffee');
```

### Compile

```bash
$ gulp coffee
```

### watch task にcoffeeを加える
gulpfile.coffee

```coffeescript
paths = sass: [ './scss/**/*.scss' ], coffee: ['./coffee/**/*.coffee']

gulp.task 'watch', ->
  gulp.watch paths.sass, [ 'sass' ]
  gulp.watch paths.coffee, ['coffee']
  return
```


### gitignoreに追記

```
www/js/*.js
www/css/*.css
www/lib/
```

# emulator
### ripple
```bash
$ npm install -g ripple-emulator
$ ripple emulate --path www/
```
### 標準
```bash
$ ionic emulate ios
```


screenshot:
![iOS Simulator Screen Shot Feb 5, 2015, 14.37.28.png](https://qiita-image-store.s3.amazonaws.com/0/46036/4240ac88-b813-766a-9b54-b44f03eaae7c.png)
# 参考
- [Ionic Framework+coffeescript](http://nel215.hatenablog.com/entry/2014/08/30/194400)
- [Getting Started with Ionic](http://ionicframework.com/getting-started/)
第28回オフラインリアルタイムどう書くの問題


オフラインでリアルタイムに「どう書く」をやるイベント( http://yhpg.doorkeeper.jp/events/19574 )を行っています。

問題は「十字の壁がそそり立つ世界の中を君は螺旋状に歩く」という名前で、詳細は
http://nabetani.sakura.ne.jp/hena/ord28spirwa/
です。

出題者の気分としては、問題を読み始めてから解けるまで1時間ぐらいあれば足りるかな、と思ってますが、ひとそれぞれで。

実装ができた方はこちらのコメント欄からリンクを張っていただくと見つけやすくて助かります。

似たような問題をもっと解きたいという方は、
https://nabetani.hatenadiary.com/entry/yhpg_list
に過去問リンク集がありますので、そちらをご覧になると良いと思います。
React0.13.0-beta.1でのComponentのES6 classでの継承とmixinが使えない理由


## mixinが使えない理由

```
(訳)

残念ながらReactではES6 class向けにmixinをサポートするつもりはありません。これはJavaScriptの文法的なコンセプトの目的を台無しにしたくないからです。

(訳注: JavaScriptでは)普遍的なmixinの実現方法がありません。実際、いくつかのmixinをサポートする方法が、今のES6の仕様からはドロップしています。いろんなライブラリが様々なセマンティクスを持っています。私達はES6のクラスにmixinを実装するためにはあなたができることは一つだけであるべきだと考えています。Reactは、(訳注: 他のライブラリと違って)なにもしないことを決めました。
```

React v0.13.0 Beta 1 | React http://facebook.github.io/react/blog/2015/01/27/react-v0.13.0-beta-1.html

JSXみたいな独自文法を作っといて今さら何をという気もするが、コレに関しては正しい姿勢な気はする。

## 継承を使う

mixin的な実装をするためにはどうしたらよいか？ たぶんオブジェクト指向的に継承で解決するのを意図していると思う。

coffeeのclass記法はes6と互換なんで(というか仕様の策定時期的にこちらがインスパイア元だと思うが)、coffeeでやった


```coffee
React = require 'react'

class ComponentBase extends React.Component
  componentWillMount: ->
    console.log 'bbb'

class A extends ComponentBase
  componentWillMount: ->
    super
    console.log 'aaa'

  render: ->
    React.createElement 'div', {}, 'hello'

console.log React.renderToString React.createFactory(A)({})
```

```
$ coffee scratch.coffee 
bbb
aaa
<div data-reactid=".cf68u4imtc" data-react-checksum="1161957053">hello</div>
```
Spring Boot + Thymeleafでサンプル作成


自分の備忘録として記述。

# やったこと
- Spring BootとThymeleafを使ったサンプル作成（Hello Worldの表示のみ）
- buildはgradle
- Thymeleafのtemplatesは任意のディレクトリ（≠ classpath:/resources/）

# 設定ファイル
## build.gradle
```` gradle
buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:1.1.10.RELEASE")
    }
}

apply plugin: 'java'
apply plugin: 'spring-boot'

sourceCompatibility = 1.8
version = '1.0'

jar {
    baseName = 'spring-boot-sample'
    version = '1.0.0'
}

repositories {
    mavenCentral()
}

dependencies {
    // for Spring Boot
    compile("org.springframework.boot:spring-boot-starter-web"){
        exclude module: "spring-boot-starter-tomcat"
    }
    compile("org.springframework.boot:spring-boot-starter-jetty")
    compile("org.springframework.boot:spring-boot-starter-actuator")

    // for Thymeleaf
    compile("org.thymeleaf:thymeleaf-spring4:2.1.4.RELEASE")

    // for Coomon Libraries
    compile("org.slf4j:slf4j-api:1.7.10")
    compile("org.slf4j:jcl-over-slf4j:1.7.10")
    compile("ch.qos.logback:logback-classic:1.1.2")
    compile("ch.qos.logback:logback-core:1.1.2")

    testCompile group: 'junit', name: 'junit', version: '4.11'
}
````
## application.properties
``` property
spring.thymeleaf.prefix=/WEB-INF/templates/
```

# ハマったこと
`spring.thymeleaf.prefix`で設定したディレクトリが「/」で終わってなくてもApplicationの起動自体はうまくいくものの

``` java
@RequestMapping("/")
public String index()
{
   return "index";
}
```

で実際にアクセスした際にindexが解決できないというエラーになった。
locationのチェックはするもののprefixはやっぱりprefixなんなんだね。。。
EclipseプラグインのTomcat Lancherを使用しない場合のコンテキスト定義の更新に関して(Mac)

# 実行環境

## 職場

* Windows 7
* Eclipse Luna(Pleiades)
* Tomcat 7
* JDK 7

## プライベート

* OS X 10.10
* Eclipse Luna
* Tomcat 7
* JDK 7

# 経緯

職場では指定されているためPleiades、プライベートでは素のEclipseを使っている。
Pleiadesを使っていればデフォルトで`Tomcat Launcher`が入っているが、素のEclipseはプラグインが入っていないため自身で導入する必要がある。(Pleiadesは便利だが、筆者自身使わないプラグインも大量に入っていてやたらリソースを食うため、プライベートでは使用していない) 素のEclipseに対し、Eclipse Marketplaceからプラグインをインストールして導入したのだが、Pleiadesで普通に使えていた`コンテキスト定義の更新` が都合良く動いてくれなかったため、仕方なく手動でTomcatのコンテキスト定義を更新しなくてはならなかった。 

# Tomcatのコンテキスト定義の変更手順

* `$CATALINA_HOME/conf/Catalina/localhost/`に`任意のコンテキスト名(Eclipseで作成したプロジェクト名等).xml`を作成する。

* 以下のコードをコピー&ペーストし、`{}`部分を変更する。 

``` xml:(Eclipseで作成したプロジェクト名等).xml
<Context path="/{任意のURL}" docBase="{アプリケーションファイルを設置するパス}">
</Context>
```

> (参考) オライリー社 詳解Tomcatより
> **path属性** : 適切なWebアプリケーションを選択するために、各リクエストURIの先頭に対応する、このWebアプリケーションのコンテキストパス。個々のホスト内のコンテキストパスは、すべて一意である必要がある。
> **docBase属性** : このWebアプリケーションのドキュメントベース(コンテキストルートとも呼ばれる)ディレクトリ、もしくは(もしこのWebアプリケーションがWARファイルから直接実行されている場合)Webアプリケーションアーカイブファイルのパス名。

* Tomcatを起動する

* `http://localhost:8080/{Context pathで定義した任意のURL}` にアクセスする。

## 具体的な手順

* `vim $CATALINA_HOME/conf/Catalina/localhost/testproject.xml`
* 以下のコードをペースト

``` xml:testproject.xml
<Context path="/testproject" docBase="~/workspace/testproject/src/main/webapp">
</Context>
```

* Tomcatを起動する
* `http://localhost:8080/testproject` にアクセスする。

職場の環境だと何ら問題なく、`パッケージエクスプローラー`の該当プロジェクトを右クリックして`コンテキスト定義を更新`で済んでいたが、自宅のMacで同様のことをしたい時にそもそも右クリックしてコンテキストメニューが出ないことがあった。 暫定対策として上記のことをやっていたが毎回やるとなると結構怠そうである。

# 参考

<a href="http://www.amazon.co.jp/gp/product/4873117054/ref=as_li_tf_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=4873117054&linkCode=as2&tag=nikuyoshi-22">詳解 Tomcat</a><img src="http://ir-jp.amazon-adsystem.com/e/ir?t=nikuyoshi-22&l=as2&o=9&a=4873117054" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />
RaspberryPi 2にSnappy Ubuntu Coreを入れてDockerを動かしたかった話

![1.png](https://qiita-image-store.s3.amazonaws.com/0/52054/1a244bbd-890a-d1e6-3578-1156a5b601d3.png)

RaspberryPi2が届いたので早速使ってみよう、と思ったところOSイメージに「SNAPPY UBUNTU CORE」が追加されていた。そもそもSnappy Ubuntu Coreについて知らなかったが、調べてみるとDockerがいい感じに動くということだったので、もしやRasPiでDocker動かせる？？と期待してやってみたメモ。

# 結論
出来なかった。

# 手順
OSイメージのダウンロード・書き込みまではそのまま。SDをRasPiに挿して起動。デフォルトのID・パスワードはubuntu・ubuntu。

とりあえず今までraspbianでやっていたのと同じように、avahi-daemonを入れようとするとsnappyコマンドが早速エラーになる。

```
ubuntu@localhost:~$ sudo snappy search avahi-daemon
Traceback (most recent call last):
  File "/usr/bin/snappy", line 25, in <module>
    status = Main().__main__()
  File "/usr/lib/python3/dist-packages/snappy/main.py", line 195, in __main__
    return callback(args)
  File "/usr/lib/python3/dist-packages/snappy/main.py", line 401, in _do_search
    results = ClickDataSource().search(args.args)
  File "/usr/lib/python3/dist-packages/snappy/click.py", line 100, in search
    results = repo.search(",".join(terms))
  File "/usr/lib/python3/dist-packages/click/repository.py", line 141, in search
    resp, raw_content = http_request(url, headers=get_store_headers())
  File "/usr/lib/python3/dist-packages/click/network.py", line 70, in http_request
    curl.perform()
```

どうやら[時刻が正しく設定されてないとエラーになるらしい](http://askubuntu.com/questions/581977/ubuntu-core-snappy-ssl-certificate-error)。確認してみると、

```
$ date
Thu Jan  1 00:10:19 UTC 1970
```

ああ...という感じになったので適当に設定。

```
sudo date 020716172015.00
```

するとエラーが出なくなった(パッケージは見つからないようだけど)。

```
ubuntu@localhost:~$ snappy search avahi-daemon
No matching packages found: avahi-daemon
```

とりあえず目的のdockerをインストール。

```
ubuntu@localhost:~$ sudo snappy search docker
No matching packages found: docker
```

無い。Google先生に聞いてみた
[Snappy Ubuntu Core, no Docker or Owncloud in 'store'](http://askubuntu.com/questions/582038/snappy-ubuntu-core-no-docker-or-owncloud-in-store)

> The packages are still available, but only for the amd64 architecture:

そうですか、失礼しました。

Snappy Ubuntu Coreをいまいち理解してないので、もう少し調べれば何か出来そうな気がするので頑張ります。

# 参考
http://askubuntu.com/questions/581977/ubuntu-core-snappy-ssl-certificate-error
http://askubuntu.com/questions/582038/snappy-ubuntu-core-no-docker-or-owncloud-in-store
http://dev.classmethod.jp/cloud/aws/snappy-ubuntu-core-on-ec2/
csv_wrap(std::cout, ",") << 1 << 2 << 3; で1,2,3と出力する

```cpp
csv_wrap(std::cout, ",") << 1 << 2 << 3;
```

で

```console
1,2,3
```

と表示できると幸せと感じるので以下のクラスを使っています：

```cpp
class csv_wrap {
  std::ostream &ost;
  std::string comma, endl;
  bool is_first;
  bool is_flush;

public:
  csv_wrap(std::ostream &ost, std::string comma, bool is_flush = true,
           std::string endl = "\n")
      : ost(ost), comma(comma), endl(endl), is_first(true), is_flush(is_flush) {
  }
  ~csv_wrap() {
    if (is_flush) {
      ost << endl << std::flush;
    } else {
      ost << endl;
    }
  }
  template <typename T> csv_wrap &operator<<(const T &val) {
    if (is_first) {
      ost << val;
      is_first = false;
    } else {
      ost << comma << val;
    }
    return *this;
  }
  csv_wrap &operator<<(std::ostream &(*pf)(std::ostream &)) {
    pf(ost);
    return *this;
  }
};
```

別の方法を御存じの方は教えて下さい。
React.jsでRailsのScaffoldを再現してみた

RailsのScaffoldで生成されるアプリケーションを、React.jsで再現させてみました。

Github: https://github.com/Peranikov/rails-scaffold-react
Demo: https://rails-scaffold-react.herokuapp.com/

## ソースコードについて

MITライセンスですので自由に改変してください。
もっとうまい人が書けば短くリファクタリングできると思います。PR歓迎です。
Fluxについては意識していません。(というかまだちゃんと理解していないです)

## 使用したライブラリなど

### react-rails

https://github.com/reactjs/react-rails

assets-compileでJSXをJSに変換してくれるgemです。`rails g react:install`とコマンドを打つことでapp/assets/javascripts/配下にcomponentsというディレクトリが生成されるので、React.jsのcomponentはここに配備するようにします。

また、React.jsの特徴であるserver-side renderingをRailsのhelperを通して実現できることも特徴です。


### Reactable

Official: http://glittershark.github.io/reactable/
Github: https://github.com/glittershark/reactable

TableをReact.jsのコンポーネントで提供してくれます。オブジェクトを引き渡すだけでカラムとデータを自動で表示してくれたり、ページネーションやフィルター、ソートも標準装備しているすごいやつです。

### react-router

https://github.com/rackt/react-router

React.jsでのルーティングを提供してくれます。'artiles/:id'などのパスにも対応できます。

## おまけ:使用していないライブラリなど

### react-bootstrap

Oficial: http://react-bootstrap.github.io/
Github: https://github.com/react-bootstrap/react-bootstrap

デザインまで手を加えようとしてやめました。別のプロダクトでは使用しています。
文字通り、BootstrapのデザインをReactのコンポーネントで提供してくれます。
公式サイトを見ていただければわかりますが、ほぼすべてのコンポーネントを再現してくれています。ありがたいです。
JAWS-UG さいたま支部 第５回勉強会


JAWS-UG さいたま支部 第５回勉強会に参加してきました。
http://jawsug-saitama.doorkeeper.jp/events/19854

| コンテンツ |発表者|
|---|---|
|[中継]東急ハンズが実践する小売り業界のクラウドパターン|ハンズラボ/長谷川さん|
|[中継]スシロー2015 クラウドファーストからクラウドネイティブへ|スシロー/田中さん|
|ACEを目指そう|cloudpack/古渡さん|

# 挨拶 JAWS-UG さいたま支部 山崎さん
* 目的別にグループ分け
* 自己紹介

# 東急ハンズが実践する小売り業界のクラウドパターン
## 東急ハンズ 長谷川さん
* なぜクラウドか？
 * 運用・保守がしたくない
 * データがなくならない
 * 負荷対策が楽

* コストのことは考えるのはやめよう
　* クラウド化はコスト削減ではない
　* オンプレではできなかったことをやるため 

## ハンズラボ 山崎さん
### 長谷川さんからの要求
* 画面見たらぱっと表示しろ
* データ更新は、なるはやね
* ブイーンといじったらスケールしろ
* 落とすな  
→ DynamoDBを採用

### POSデータを捌こう
* CSVデータを格納（JSON）
* 何回やっても同じ結果（再現性確保）
* エラーが起こっても原因が追えるようにする

### 開発
* ユニケージ開発手法
* フロントエンドはHTML5
* Immutable Infrastructure

# スシロー クラウドファーストからクラウドネイティブへ
## お皿にICタグをつけた
* 鮮度管理をするため
* 単品の売りあげが分かった
* オペレーションの改善ができた

## スシローの収益構造
* 原価率50%（廃棄込み）
* 廃棄を減らすには仕込みの適正化が必要

## レーン廃棄対策
* レーンに流す寿司の量  
　＝ 客数 × お客さんの食欲
* お客さんに人数を入れてもらう
 * どこに何人座っていて、何分経過したかを見ている
 * お客さんの食欲を管理
 * 流す量と場所を指示

## 歩留とパック廃棄を減らしたい
システムを使って業務改善（BPR）

## スシローの情シス
5人 / 1,300人
→ 情シスは外部ベンダーコントロールが主な業務

## クラウドファーストとは
クラウドサービスの採用を第一に検討する方針のこと

## BIの実験
AWSデビュー

* 40億件
* 3日
 * データ転送にかかった日数
* 10万円
 * 40億件の格納にかかった価格

AWSを使うと手軽にできる 

## クラウドネイティブ
クラウド利用を前提に考える

* Auto Scaleing DRなどを考えるとクラウド以外の選択肢はない
* スピード感からもクラウド以外の選択肢はない

## スシパスの企画
* 休日の待ち組数が多い
* 根本的な問題解決はできないが、体感待ち時間を短縮
* 予約とネット発券、2つの機能が必要
* 予約客、待ち客，保留客の３タイプのお客様の待ち行列を制御
* 待ち時間の予測とPush通知

## Kinesis
http://dev.classmethod.jp/cloud/aws/cm-regrowth-2014-kinesushi-kinesis/

## 参考
http://aws.amazon.com/jp/solutions/case-studies/akindo-sushiro/

# ACEを目指そう 古渡さん
* コアメンバーになるか立候補すべし
* 初心者向けでも全然OK

# 懇親会
* 自己紹介
 * コアメンバーの苦労話などなど
* インフラエンジニアあるある
* 東京に上京しない中小企業向けにクラウド移行について何かできないか
* 次の勉強会に向けて
Auto Layout で端末サイズに応じた View のサイズ調整


# やりたかったこと
Storyborad + Auto Layout による画面設計をしていて、とある View の高さを、iPhone5, iPhone6, iPhone6 Plus でそれぞれ 50, 100, 100 といったように変えたかった。

# 端末種別を区別する

下記のようなメソッドを用意して、戻り値によって端末サイズを判断する。
下記メソッドの場合、iPhone5, iPhone6, iPhone6 plus でそれぞれ、320, 375, 414 が返ってくる。

```swift
func getScreenWidth() -> CGFloat {
    let screenSize = UIScreen.mainScreen().bounds
    return screenSize.width
}
```

参考
http://stackoverflow.com/questions/24110762/swift-determine-ios-screen-size

# 制約をつける

Storyboard 上で高さに関する制約を削除し、プログラム内で対象の View に制約を追加する。

```swift
let height: CGFloat = 50

let constraint = NSLayoutConstraint(
    item: self.targetView,
    attribute: NSLayoutAttribute.Height,
    relatedBy: NSLayoutRelation.Equal,
    toItem: nil,
    attribute: NSLayoutAttribute.NotAnAttribute,
    multiplier: 1,
    constant: height)

self.targetView.addConstraint(constraint)
```

参考
http://stackoverflow.com/questions/26180822/swift-adding-constraints-programmatically
`bundle install` で入れるnokogiriにも、システムのlibxml2を使って欲しい


gemの依存関係ににnokogiriとかが入ってると、
普通に `bundle install` したときに、libxml2が無いって怒られる。


あちこち調べると、Homebrewでlibxml2入れてそれ使う、ってでてくるけど。
どうやらXcodeにlibxml2が入ってるらしいので、`brew link --force` とかで環境を汚したりはしたくない！
できるだけシステムのlibxml2を使いたい！！

# 環境
* MacOS X 10.10.2
* rbenv
* ruby 2.2.0
* Xcode Commandline toolsインストール済み

インストールしたいのは nokogiri (1.6.5)。
ちなみに記事を書いている時点でのnokogiriの最新は1.6.6.2。

# やりかた

```
$ bundle config build.nokogiri --use-system-libraries=true --with-xml2-include=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk/usr/include/libxml2
$ bundle install --path vendor/bundle
```

`bundle config` で、各gemのインストールオプションとか設定できるらしい。へー。

# 参考

* [nokogiri がlibxml2のせいでインストールできない](http://d.akiroom.com/2014-08/nokogiri-libxml2-version-2-6-21-or-later-is-required/)
VagrantでCentOS7環境構築してWebページみたらエラーになったとき

vagrantfile上でconfig.vm.network "192.168.33.10"のコメントアウトを外して、ブラウザからアクセスしたところ、
ページが見つかりません。

環境構築はドットインストールさんの[Vagrant入門](http://dotinstall.com/lessons/basic_vagrant)を参考にしてるので、詳しいところはそちらを確認ください。

動画みながら、同じように作業しましたが、
ブラウザからアクセスできません。

ミスしているのはfirewallを無効にする設定のようです。

```
$ sudo service iptables stop
Redirecting to /bin/systemctl stop  iptables.service

Failed to issue method call: Unit iptables.service not loaded.
```

CentOS7ではiptablesではなく、firewalldを使用するとのこと。

よって、上記コマンドではなく、下記コマンドを使用します。

```
$ sudo systemctl stop firewalld
```

これで、ブラウザから無事Hello worldをみることができました。
ソースコードの中でも絵文字を使う 🚀 #進捗を支える技術

Gitにおいて、[コミットコメントに絵文字を使おうぜ](https://atom.io/docs/v0.108.0/contributing#git-commit-messages)、というものや[GitHub issuesでも絵文字表記をする](http://qiita.com/tbpgr/items/f4d6c8e3e98e0bcabc48)、という話をよく聞きます。一方で本体となる**ソースコードの中で絵文字を使う**という話はあまり聞きません。ソースコードではプログラムには意味をもたないが人間には大きな意味をもつコメントを書けるのですから、**通常のコメントとともに絵文字を使うといいんじゃないかな**、という話です。

## 絵文字 emojiの有効性

上記の話の中での絵文字の使用を推奨する理由は、絵文字がテキストと比べてつぎのような特徴をもつためと考えられます。

* emojiは通常のテキストやテキストから連想できるイメージを反映している
    * :apple: ←これをみて何を考えましたか。多くの人が林檎を連想するはずです
    * 言語の壁を超えた「共通文字」
* テキストよりも少ない表示領域で、より多くの情報を提供することもできる
    * 例) Hello, world!（テキストでの表示）, Hello, :earth_asia:!
* カラーであることが多く、テキストのみの単色の中でも目立つ

## コメントを絵文字で装飾する

通常のテキストのみで[書かれたもの](https://gist.githubusercontent.com/uribo/8781f0377c0b8fccde3e/raw/84476a09fe5c596b015c7b62c6a155463e0c6a4f/without_emoji.R)と絵文字を[含めたもの](https://gist.githubusercontent.com/uribo/8781f0377c0b8fccde3e/raw/8d6935a7ec528204becc3debda71358f66451a40/with_emoji.R)を比べてみてください。絵文字の有無以外は同じソースコードです。

* [絵文字なし](https://gist.githubusercontent.com/uribo/8781f0377c0b8fccde3e/raw/84476a09fe5c596b015c7b62c6a155463e0c6a4f/without_emoji.R)
* [絵文字あり](https://gist.githubusercontent.com/uribo/8781f0377c0b8fccde3e/raw/8d6935a7ec528204becc3debda71358f66451a40/with_emoji.R)

好みの問題もありますが、絵文字を含めたソースコードのほうがコメントが、コメントの意味を理解しやすいです。またコメントはファイルの実行時には無視されるものですので、障害にはなりません。

処理ごとに使用する絵文字を統一していれば（画像ファイルとして保存する場合にはコメントで:art:、とか）、絵文字を検索対象とすることでその場所へジャンプすることもできます。

### 実際に使えそうな絵文字

統計解析などで用いられるRではどのような絵文字が使えそうか、ということを考えてみました。

* :wrench: -> 設定
* :package: -> 依存環境、パッケージ（ライブラリ）の読み込み
* :art: -> 作図
* :star: -> 必ず必要な処理
* :ghost: -> 無視しても良い（適宜コメントアウトすべき箇所）
* :bomb: -> 扱いに注意
* :construction: -> 改善予定・修正中
* :white_flower: -> 検定、モデルの実行

## 注意

かといって、絵文字の多用やコメント内容に沿わない絵文字の使用は混乱や誤解を招く危険があります。ソースコードを書くときの処理内容には、おそらくいくつかのパターンがあると思うので、そのパターンに応じて**[使用する絵文字を統一しておく](https://github.com/uribo/data_treatment/issues/3)**のが良いかと思います。

絵文字の意味は[Emojipedia](http://emojipedia.org)で調べると良いです。他の環境では絵文字がどのように見えるのかという比較もできます。

というわけでenjoy emoji!
小さく始める JavaScript のテスト

## JavaScript のテスト

書かないと怒られるし、書きたいとは思っているが、書くまでの敷居がやたらと高くなってしまった気がしている人へ。


## 最小のテスト

本質的にテストを書くのにフレームワークはいらない。 assertion だけあればいい。
isomorphic にしたいなら、 node の assert モジュールすら使わず console.assert だけで書ける。


```js
// assert
function assert(actual, expected) {
  console.log('.');
  console.assert(actual === expected, '\nact: ' + actual + '\nexp: ' + expected);
}

function TestSum() {
  assert(1+2, 3);
}

// exec
TestSum();
```

あとは普通にこのスクリプトを node/io で実行するか、ブラウザに読ませるだけでいい。

ちょっとしたスクリプトを書くだけでオーバーキルなものを選ぶ必要は、本来は無い。
目的はテストであって、テストモジュールを使う事ではない。
そこで手が止まるくらいなら、これで十分。


実例: [https://github.com/Jxck/URLSearchParams/blob/master/test/test.js]


## assert

個人的には assert は strictEqual だけあれば良いと思っているが、まあある程度便利メソッドがあっても良いとは思う。

node/io であれば assert が標準にあるのでそれを使う。
これを [ブラウザ用に移植](https://github.com/Jxck/assert) したものがあるので、ブラウザではそれを使う。


```js
var assert = assert || require('assert');

function TestSum() {
  assert.strictEqual(sum(1, 2), 3);
  assert.strictEqual(sum(0, 0), 0);
}

TestSum();
```

## テスティングフレームワーク

もっと大きくなる場合は、適切なフレームワークを入れる。広く使われているものを使う方がいい。

なによりも非同期テストが入ってくると上の方法は足りてない。

テストや各種レポータや、オプションが多い CLI、蓄積されたノウハウやという意味で個人的には mocha を勧める。他のでもいいけど、少なくとも今から QUnit を積極的に選ぶ理由は無いと思う。

mocha はテストの構造に関する責務を持つが、 assertion は持たない。
そこで expect や chai など色々あるが、個人的には上述の標準 assert で十分だと思う。

[mocha](http://mochajs.org/)

以降紹介するツールも、 mocha との連携方法が結構紹介されているという点も、長いものに巻かれるメリットと言える。


Github に置いた OSS なら [travis ci](https://travis-ci.org/recent) に繋ぐという話は今更しないで良さそう。


## ブラウザテスト

ブラウザを、しかも複数のブラウザをいちいち起動したり、更新するのは面倒なので、そこはツールでやる。おすすめは karma だが、まだ他にも選択肢があって個人的にも揺れている。

[karma](http://karma-runner.github.io/0.12/index.html)

Github に置いた OSS なら [browserstack](http://www.browserstack.com/) とかもありだと思う。


## カバレッジ

カバレッジをとるかどうかは別として、とる場合は karma なら簡単に istanbul が使える。
結果を html で吐くと、細かく解析される。

[karma-cverage](https://github.com/karma-runner/karma-coverage)

Github に置いた OSS なら [coveralls](https://coveralls.io/) もありっぽいが個人的には使ってない。


## 規模に合わせる

この辺まで来るともうビルドタスクとかも入り、設定ファイルも増えてきてるはず。
テスト自体が、複数環境や非同期やプリプロセスなどが入ってそもそも面倒なのが原因で、それらを個々のツールで解決するため、そうなるのは避けられない。

ただ、テスト自体やそれを実行する複雑な環境の構築が価値を生む訳ではないので、そこで手が止まるくらいなら、小さく始めてでもコードを書いた方が何倍も価値を生む。

一方で、コードベースが大きくなった時にきちんと基盤が整っていないと、割とすぐに破綻するのも事実。

今書いているコードの規模をきちんと把握し、適切な構成にするコストは、破綻してからなんとかするコストより絶対安いので、それをふまえて少しづつ手を入れて行くのが大切だと思う。

もしくは、どんな小さいプロジェクトでもすぐに完璧な環境が導入できるように、自分のスケルトンを用意しておいて、常に磨いておくという手もある。そういう人に、このエントリはいらないだろう。
Vim環境設定メモ 


## 環境
Mac

## プラグイン管理のためにNeobundleをインストール

```コマンド
mkdir -p ~/.vim/bundle
git clone https://github.com/Shougo/neobundle.vim ~/.vim/bundle/neobundle.vim
```

## プラグインや基本的な設定を追加

.vimrcに下記設定を追加

```.vimrc
"=========================
" 基本設定
"=========================
syntax on
colorscheme desert

" タブをスペース4つに
set tabstop=4
set autoindent
set expandtab
set shiftwidth=4

"=========================
" ショートカット
"=========================
"ctrl+eでNERDTreeを開く
nnoremap <silent><C-e> :NERDTreeToggle<CR>

"=========================
" Neobundle設定
"=========================
" bundleで管理するディレクトリを指定
set runtimepath+=~/.vim/bundle/neobundle.vim/

" Required:
call neobundle#begin(expand('~/.vim/bundle/'))

" neobundle自体をneobundleで管理
NeoBundleFetch 'Shougo/neobundle.vim'

"-------------------------
" 各種プラグライン
"-------------------------
" colorscheme
"NeoBundle 'w0ng/vim-hybrid'
"NeoBundle 'vim-scripts/twilight'
" エクスプローラー的なNERDTree
NeoBundle 'scrooloose/nerdtree'
" 入力保管
NeoBundle 'Townk/vim-autoclose'
" マークアップ用入力補完
NeoBundle 'mattn/emmet-vim'
" ソースコード実行
NeoBundle 'thinca/vim-quickrun'
" grep
NeoBundle 'grep.vim'

call neobundle#end()

" Required:
filetype plugin indent on

" 未インストールのプラグインがある場合、インストールするかを確認する
NeoBundleCheck
```

vim起動時にプラグインをインストールするか聞かれるのyでインストール
ransackerを使ってRansackの検索を拡張する

Ruby on Railsで検索機能を作る際に便利な[Ransack](https://github.com/activerecord-hackery/ransack)というgemがあります。複数の条件で検索する画面を作るときにとても役に立つライブラリなのですが、特殊な検索条件を指定しようとすると標準の機能では対応できないことがあります。

`ransacker`を使って検索機能を拡張することで、解決できる場合があります。

## Ransackで指定できない条件の例
### カラム同士の比較
注文テーブルに「納品予定日」と「納品日」というカラムがあって、納品日が納品予定日より後の日付になっているもの（納期遅れ）を抽出したい。
### イコールや範囲指定で表せない条件
年と月は指定せず、日の部分が１日のものを抽出したい。とか、金額が1,000の倍数になっているものを抽出したい。

## ransackerでできること
`ransacker`は、検索の対象となる項目を定義することができるメソッドです。SQL文のWHERER句に記述する条件の左側に相当する部分。Ransackの条件文でいうと、述語の前に来る部分を独自に定義することができます。

```text:SQL文のWHERE句
 NAME        LIKE    'hoge'
 ^^^^
[検索の対象] [演算子] [指定する値]
```
```text:Ransackの条件
NAME_LIKE: 'hoge'

NAME:[検索の対象]
LIKE:[述語]
`hoge':[指定する値]
```

上の「NAME」の部分には、多くの場合テーブルのカラム名が指定されます。これをカスタマイズして、独自の条件を定義するのが`ransacker`メソッドです。

これができると何が嬉しいかというと、これまで「**納品日** = ○○月○○日」としか書けなかった条件が、「**納品日と納品予定日の差** > 0日」とか、「**納品予定日の曜日** = 土日」みたいな条件が書けるようになります。

そして他の項目と一緒に`search_form_for`の中に検索条件の入力項目として並べることができます。

## ransackerの使い方
`ransacker`メソッドはモデルクラスに記述します。privateのところに書くのがいいようです。

### パラメータ
```rb
ransacker name, (option) {|parent| block}
```

#### name
検索対象につける名前です。ここでつけた名前がransackの条件文字列で使えるようになります。

#### オプション

|キー|内容|
|:--|:--|
|formatter|指定する値をフォーマットするブロック。省略すると値はそのまま渡されます。|
|type|検索対象の型を指定します。指定した値はこの型と一致するよう変換されます。デフォルトは文字列型です。|
|args|わかりません|
|callable|後述するブロックをオプションでも指定できます|

#### ブロック
検索対象を表すArelのNodeオブジェクトを返すブロックです。
パラメータには`parent`というものが渡されてきます。詳しいことはよくわかりませんが、こいつの`table`メソッドから、定義されたモデルの`Arel::Table`オブジェクトが手に入ります。なので、`parent.table[:attr_name]`を返すようにしておくと、指定した属性を表すNodeオブジェクトが検索対象になります。

このブロックの戻り値をカスタマイズして独自の検索対象を定義するわけですが、SQLを直接書いて指定することもできるので、Arelに詳しくない私でもなんとかなりました。

## 実装例
モデルクラスのprivate部分で`ransacker`を呼びます。

```rb:app/models/order.rb
class Order < ActiveRecord::Base

  ...

  private
    # 納品予定日の日部分(1〜31)を条件にする
    ransacker :appointed_day_of_month,
      formatter: -> v { format('%02d', v)} do |parent|
        Arel.sql("strftime('%d', appointed_date)")
      end 
end
```

`appointed_day_of_month`という名前で、納品日から日の部分を取得するSQL(WHERE句の左側になるところ)を定義しています。

```rb:コンソール
[26] pry(main)> Order.ransack(appointed_day_of_month_eq: 9).result
  Order Load (0.4ms)  SELECT "orders".* FROM "orders" WHERE strftime('%d', appointed_date) = '09'
```

実行すると上のようなSQLが発行されます。
`formatter`で0埋めの2桁に変換するProcを指定しているので、指定した`9`という値は`'09'`に変換されてSQLに渡ります。

```erb:app/views/order/index.html.erb
    <%= f.label :appointed_day_of_month_eq, '納品予定日（年月の指定なし）' %>
    <%= f.select :appointed_day_of_month_eq, [*1..31], include_blank: true %> 日 
```

上の例では述語として`eq`を使っていますが、`lt`や`gt`で以上や以下の条件でも同じように使えます。

## 他の例
### 注文日が月の最終日

```rb:app/models/orders.rb
    ransacker :appointed_date_is_last_day, type: :integer do |parent|
      Arel.sql(<<-EOSQL.gsub(/\n/,''))
        (date("orders"."appointed_date", 'start of month','+1 month','-1 day')
          == "orders"."appointed_date")
      EOSQL
    end 
```
### 納品日が納品予定日より後
Arelを使用した例。単純な変換ならこの`Arel::Nodes::InfixOperation`というものを使ってSQL直書きせずできました。

```rb:app/models/orders.rb
    ransacker :delivery_delayed, type: :integer do |parent|
      Arel::Nodes::InfixOperation.new('<',
        parent.table[:appointed_date], parent.table[:delivery_date])
    end
```
小さく始める isomorphic module pattern

## isomorphic

せっかく window や node/io の標準モジュールに依存していないロジックであれば、
ブラウザでも node/io で動くようにしておくと色々嬉しい。が軽視されている感がある。

俗に isomorphic な JavaScript と呼ばれている。
それを npm と bower で公開するのであれば、問題はモジュールシステムだ。


## 最小の isomorphic module pattern

一番シンプルで負荷の少ない方法。

まず、ライブラリを以下のように書く。

```js
// lib.js
function Lib() {
  // 変数は外に出さない
}

Lib.prototype.foo = function(){
  return "foo";
};

this.Lib = Lib; // point
```

それを以下のように使う。

```js
// main.js
var Lib = Lib || require('lib').Lib;

var lib = new Lib();
lib.foo(); // foo
```

これで node.js では普通に動く。

同じコードは HTML を以下のように書けば、ビルドなんかせず動く。

```html
<script src="lib.js"></script>
<script src="main.js"></script>
```

this は module.exports or window だということを利用している。
注意点としては、 Lib 関数の外にあるものは、 node ではモジュールローカルだが、ブラウザでは window に付いてしまう点とカバー範囲が window + commonjs という点。

実例: [https://github.com/Jxck/obtain-unicode/blob/master/obtain-unicode.js]

## UMD (Universal Module Definition)

上の例で足りない場合は、 UMD が検討できる。
おそらく名前としてはこちらの方が有名だろう。

以下にパターンが蓄積されている。

[github umdjs/umd](https://github.com/umdjs/umd)

いくつかあるが [returnExports.js](https://github.com/umdjs/umd/blob/master/returnExports.js) か [commonjsStrict.js](https://github.com/umdjs/umd/blob/master/commonjsStrict.js) あたりを使えば大抵足りる。(自分が書いたコードが自身が別のモジュールに依存しているかどうかによって色々変わる)

```js
// if the module has no dependencies, the above pattern can be simplified to
(function (root, factory) {
  if (typeof define === 'function' && define.amd) {
    // AMD
    define([], factory);
  } else if (typeof exports === 'object') {
    // commonjs
    module.exports = factory();
  } else {
    // Browser globals
    root.Lib = factory();
  }
})(this, function () {
  var bar = "bar"; // こういうのも隠される

  function Lib() {
  }

  Lib.prototype.foo = function(){
    return "foo";
  };

  return Lib; // point
});
```

特に AMD への対応もしたい場合や、モジュールローカル変数が window についてしまうのを防ぐための名前空間が欲しい場合などに使われる。

実例: [https://github.com/teppeis/htmlspecialchars/blob/master/index.js]

## Browserify / WebPack

依存が複雑になると解決が面倒になる場合がある。するとツールで解決する。

[Browserify](http://browserify.org/) は Node 標準モジュールも　isomorphic にしてしまい、 [WebPack](http://webpack.github.io/) は JS 以外の CSS なども含めて解決できるツールだが、両方ともその機能の一部を単なるモジュール解決ツールとして使われている。

どちらもやっているのは、ファイルの連結時に先の UMD の亜種でくるんでいるだけではある。

複数のディレクトリに分けたり、複数のモジュール間で複雑に依存が絡んでいる場合などに使うと良いと思う。

使わないで済む規模なら、個人的には避けたい。が ES6 modules がまだまだ先になりそうな現状、前述のパターンで辛い場合は使わざるを得ない。

実例: [https://github.com/twada/power-assert/blob/master/build/power-assert.js]


## ES6 modules

ES6 では待望の標準モジュールシステムが入りそうである。

```js
// lib.js
function Lib(){};

export Lib = Lib;
```

```js
// main.js
import { Lib } from 'lib';

var lib = new Lib();
```

実装されれば、これだけでブラウザでも node/io でも動く予定。

[ES6 modules final](http://www.2ality.com/2014/09/es6-modules-final.html)

人類の理想であり、救いであり、今はまだ夢である。
全ての混沌を解決してくれることを願い、首を長くして待つ。
既に同じ名前のファイルがある時は連番を付ける(黒魔術風味)

ファイルを保存する時に既に同じ名前のファイルがあった時は連番を付けたくなったので書いたコード

例えば
piyopiyo.jpgというファイルを作ろうとした時に既に同じ名前のファイルがあれば、piyopiyo(1).jpg、
piyopityo(1).jpgというファイルも既にあれば、piyopiyo(2).jpg
というように以下piyopiyo(i).jpgで被っている限りiを増やしていきます。


```rb
def avoid_conflict_name name
  i = (i || i = 0).succ while File.exist?(ret = "#{name}#{i ? "(#{i})" : ""}.jpg")
  ret
end
```

ちょっと黒い所が見えちゃってるけど気にしない♡ ※黒魔術は用法用量を守って正しく使いましょう。

　

```rb
i = (i || i = 0).succ
```

とか

初回のループでの

```rb
"#{name}#{i ? "(#{i})" : ""}.jpg"
```

のiとか

代入されていないのに使える変数の仕様は [IQ1450で美少女JSの先輩から、Rubyで無から有を生み出す方法を教わった](http://qiita.com/supermomonga/items/79d985f4dfd3603afffe) を見てね♡
Django: INSTALLED_APPS を動的に変更できるようにする


- Django実行中にアプリを追加するとか

# settings.py : local_settings.py を読みむ

- settings.py の最後に追加

~~~py
try:
    import local_settings
    globals().update(
        dict((k, v) for k, v in local_settings.__dict__.items()
             if not k.startswith('_'))
    )
except:
    pass
~~~    

# local\_settings.py: INSTALLED_APPSを動的に変更

- apps以下にカスタムアプリケーションがある

~~~
(wordpress)vagrant@10:~/projects/dynamics/web$ tree apps
apps
├── app1
│   ├── __init__.py
│   └── __init__.pyc
├── __init__.py
└── __init__.pyc

1 directory, 4 files
~~~

- local_settings.py で設定を修正する

~~~py
CUSTOM_APPS = (
    'dynamics',
   	# ....		# apps.* 以外のカスタムアプリ
)

from django.conf import Settings
from types import MethodType
import os

BASE_DIR = os.path.dirname(
	os.path.dirname(os.path.abspath(__file__)))
APPS_DIR = os.path.join(BASE_DIR, 'apps')


# 入れ替えメソッド定義
def _attr(self, name):
	# オリジナルの__getattribute__ を呼ぶ
    ret = super(type(self), self).__getattribute__(name)
    
    # INSTALLED_APPS だったら、 appsディレクトリ以下を追加
    if name == "INSTALLED_APPS":
        return ret + CUSTOM_APPS + tuple(
            "apps.{0}".format(d) for d in os.listdir(APPS_DIR)
            if os.path.isdir(os.path.join(APPS_DIR, d))
        )
    # それ以外は普通に返す
	retrun ret      

# メソッドを入れ替える
Settings.__getattribute__ = MethodType(_attr, None, Settings)
~~~
djangoのOneToOneFieldのrelation先のモデルはrelated_nameを引数として取る事ができない。

sqlalchemyとの違いにハマったのでメモ。

以下のようなモデルを前提にする。

```py
class User(models.Model):
    name = models.CharField(max_length=255, null=False, default="")

class UserProfile(models.Model):
    score = models.IntegerField(null=False, default=0)
    user = models.OneToOneField(User, related_name="profile")
```

UserとUserProfileが定義されていて。それらは1:1の関係になっている。
ここで以下のようにpropertyアクセスすることで関連するオブジェクトを取得できる。

```py
user = User.objects.get(id=1) 
user.profile # <UserProfile>

profile = UserProfile.objects.get(id=1)
profile.user # <User>
```

また、保存する時には途中でsaveしてあげる必要がある。

```py
user = User()
user.save()
profile = UserProfile(user=user)
profile.save()
```

以下はエラーになることに注意

```py
UserProfile().save()
```

理由は、テーブルのuser_idがnullになってしまうから。not null制約に引っかかるため。(OneToOneFieldを指定したクラスの変数に対応するフィールドにidが付加されるので、ここではuser_idがuserprofileテーブルに存在。テーブル上はforeignkey+unique constraint)

また以下の様なことができない。

```py
User(profile=profile)
```

related_nameはあくまで関連をたどることが可能なプロパティを生やすものであって、双方向に結びつくような特殊なカラムを抽象化した何かというわけではない。(一方sqlalchemyはrelated_nameに似た設定値をコンストラクタの引数として利用可能)

参考

- sqlalchemyの例 https://gist.github.com/podhmo/c2478dd83c673f8d70cc
- djangoの例 https://gist.github.com/podhmo/95cde3ea877672d4746c
Room でミーティングルームから開放されよう

[Room](https://room.co) というサービスをご存知でしょうか。Slack の Integration があり、Slack 上で

```
/room
```

と書くだけでいきなりビデオミーティングの部屋が出来てそのままブラウザで F2F ミーティングができるすごいやつです。今朝、 Room の CEO とまさに Room を使ってユーザーインタビューに答えたんですが、英語が苦手なせいでどれだけ Room が素晴らしいと思っているかを伝えきれなかったので、日本語圏の人に宣伝することで貢献しようと思います。

# 表情を見て話そう

英語が苦手な僕と日本語がわからない Room の中の人とでは、コミュニケーションが困難です。僕が『表情ってえーと英語でなんて言うんだっけ……』とか言ってても彼には僕が言葉に詰まっていることしか伝わりません。が、言葉に詰まっていることはちゃんと伝わります。

テキストベースのコミュニケーションは、明瞭で、高速で、多くの場合口頭での会話より吟味された言葉が交わされます。僕はこの点でチャットやブログ、Twitter などのテキストベースコミュニケーションを大変気に入っています。

ですが、言葉に詰まっている、悩んでいる、『元気だ』と言いつつも少しつかれた表情をしている。などという情報は、圧倒的に表情に詰まっています。チャットのレスポンスが遅い時、言葉に詰まっていると判断すべきか、画面の向こう側でオレンジジュースが机にぶちまけられたのかを知るすべはありませんが、ビデオミーティングならお菓子を食べて言葉を発せない膨らんだ頬を見ることは簡単です。

口頭での会話はしばしば話を脱線させ、まったく別の話題をどこからか呼び寄せます。浮ついた表情は会議から真剣味を奪い、硬い無表情はそれだけで同席者を萎縮させるでしょう。テキストベースならこんなことはありません。伝えるべき情報を伝え、伝えなくてもいい情報を伝えずに済みます。

どちらも一長一短で、どちらの方が優れているかという話ではありません。どちらも損なわれてはいけないということです。

表情を見て話すためだけに電車に乗ったり、厚手のコートを着こむ必要はなく、Room で十分に相手の表情を見ながら冗談を交わすことは可能です。例えば趣味のプロジェクトについての相談だったり、夜の一人飲みに相手が欲しいなら、カフェも居酒屋も必要なく、ブラウザと手元のドリンクだけですぐさま始められる選択肢があるということを、覚えておいてください。


# 同じものを見よう

Room には、標準で Screen Share 機能が備わっています。デスクトップ全体をシェアするのも、特定のアプリケーションのウィンドウをシェアするのも簡単です。特別な操作は特に必要ありません。

現実の会議室だと、プロジェクターを使って壁面に画面を見せたりしますよね。ああいう感覚です。同じ画面をみんなで見ながら一つのことについて話し合うのは、とても楽しい体験です。最近だと Quick Time で iOS デバイスの画面をキャプチャすることができるようになったので、手元の iOS デバイスをいじりながら、こういう動きだよと説明することだって出来ます。

スクリーンショットの画像をそのままアップロードできないのは Room の少し残念なところですが、それはフィードバックしておいたので、彼らが価値を感じてくれれば遠くないうちに実装されるかと思います(DropBox 経由なら今でもファイルシェアが出来ます)。

# いいとこどりしよう

Room の画面右には、テキストチャットがついています。簡単なテキストチャットですが、これは実に良く会話をサポートしてくれます。

URL やメールアドレスを口頭で伝えた経験はありますか？僕はありますが、毎回二度としたくないと後悔します。ぺたっとチャットに URL を貼ったら、『今貼った URL なんだけれど』と会話をよどみなく続けることが出来ます。今回のユーザーインタビューでも、これはとてもよく機能してくれました。主に、僕の発音が原因で相手が聞き取れなかった単語を補足としてチャットで伝えるという方法で。

口頭会話のためのチャットが Slack にどんどん流れてしまうと、意味の分からないログが蓄積されて混乱の元になります。一度お使いいただければ、口頭のためのテキストチャットが標準で用意されているのは、こんなに便利だったんだと気づいてもらえるでしょう。

# 『まずは、サインアップします』

自分がいくつの Web サービスのアカウントを持っているか数えたことはありますか？サインアップに慣れすぎてしまったせいで、アカウントを求められることに疑問を覚えなくなって久しいですが、 Room はアカウントがなくてもいきなりビデオミーティングルームに入ることが出来ます。

パソコンに明るくない同僚と遠隔でぱぱっと口頭で相談したいとき、これは非常に便利です。始めたいのは会話であって、アカウントのパスワードを新しく考える事ではありませんからね。

# 会話しよう

ということで、Room の宣伝記事でした。興味があるけど一人でビデオミーティングするのはちょっと……という時は Twitter などで僕に Room の URL を送ってくれれば、手すきの時なら少しお話したり出来ますから、気軽にお声がけください。晩酌のお誘いも受け付けております。

みんなで楽しい雑談をしましょう！
Browserifyの運用 〜 bundleを分ける


Browserify使いはじめてしばらくたって、自分なりのコツがつかめてきた気がするのでまとめてみます。

まず今回のコンテキストとしては画面遷移をそれなりに含み、同じモジュールを各画面で使う前提。
SPAだとちょっと考え方が変わるかもしれません。

## 【対策以前】全部をbundleすると太る

Browserify覚えてしばらくは、ページ毎の実行部分も含めてbundle.jsにひとまとめしてたけど、各ページ共通部分があるにもかかわらず別ファイルになってしまい、ブラウザキャッシュも生かせず、ファイルサイズも肥大化して微妙だなぁと感じていました。ビルドも毎回でgulpタスクも重くなりがちでした。

- 共通部分も別々のファイル
- ブラウザキャッシュ活かせない
- ファイルサイズ肥大化
- ビルド重め

### ファイル配置例

```
.
├── node_modules
│   ├── knockout
│   └── underscore
├── public
│   ├── index.html
│   └── static
│       └── js
│           ├── bundle1.js 
│           └── bundle2.js // bundle1と同じものが多く含まれている！
└── src
    ├── MyModule.js // 自作モジュール
    ├── page1.js // ページ固有のロジック
    └── page2.js // ページ固有のロジック
```

### src/app.js

```
// src/page*.js
(function(){
var ko = require('knockout');
var _ = require('underscore');
var myModule = reqire('./src/MyModule.js');

// ページ固有の処理

})()
```
### browserifyコマンド

```
// app.jsそのものをbundle
browserify src/page1.js > public/static/js/bundle1.js
// 別ページなら別bundle
browserify src/page2.js > public/static/js/bundle2.js
```


## 【対策】共有部分だけbundle

browserifyはbundleしたモジュール類を他のファイルからrequireで呼びだせるので、共通モジュールをbundleしたファイルと、各ページ固有ロジックを記述したファイルにわけることにしました。
そうすることで共有ファイルはブラウザキャッシュを活かせるし、各ページ固有のファイルサイズは小さくなります。requireするものが全部共有ファイルに入っているならば、ビルドも必要ありません。


- 共通部分だけを一つのbundleファイルにする
- 他のscriptからrequireで呼び出せる
- ブラウザキャッシュ活かせる
- ファイルサイズ縮小
- ビルド頻度・重さ減少

### ファイル配置例

```
.
├── node_modules
│   ├── knockout
│   └── underscore
├── public
│   ├── index.html
│   └── static
│       └── js
│           ├── bundle.js
│           ├── page1.js
│           └── page2.js
└── src
    └── MyModule.js
```

今回の例だとapp.jsでrequireするファイルはすべてbundle.jsに入っているので、app.jsをbrowserifyにかける必要はありません。そのまま`public/staic/js`に配置します。

### browserifyコマンド

外部からrequireできるbundleを作る方法です。自作モジュール(`src/MyModule.js`)にモジュール名を割り当ててあげることで、モジュール名で呼び出せるようになるのがポイントです。

```
browserify -r knockout -r underscore -r ./src/MyModule.js:MyModule > public/static/js/bundle.js
```

同じことをgulpタスクで書くと以下。やはり`{expose: 'MyModule'}`で自作モジュールに名前をつけてあげるのがポイントです。

#### gulp taskバージョン

```
var browserify = require('browserify');
var source = require('vinyl-source-stream');

gulp.task('build', function() {
  return browserify()
    .require('underscore')
    .require('knockout')
    .require('./src/MyModule.js', {expose: 'MyModule'})
    .bundle()
    .pipe(source('bundle.js'))
    .pipe(gulp.dest('./public/static/js/'));
});
```


### public/static/js/page*.js

```
// src/app.js
(function(){
var ko = require('knockout'); // requireが使える
var _ = require('underscore');  // bundle.jsから読んでいる
var MyModule = reqire('MyModule'); //設定した名前で呼び出せる

// ページ固有の処理

})()
```


### htmlで呼び出し

```
<script src="static/js/bundle.js"></script>
<script src="static/js/page*.js"></script>
```

別ファイルからrequireする方法は[BrowserifyのDocumentの割と最初のほうに書いてある](https://github.com/substack/node-browserify#external-requires)ので、最初からちゃんと読み込んで使っていればこうしてたかな、という感じもしますが最近やっと気がついたので。

もっといい運用あるよとか、ご意見ありましたらお願いします。
Goのテンプレートでカスタム関数を定義するメモ

ただのメモだ。

```go:template.go
package main

import (
	"fmt"
	"os"
	"text/template"
	"time"
)

func isotime(layout string) string {
	now := time.Now()
	return now.Format(layout)
}

func timestamp() string {
	return time.Now().Format("20060102030405")
}

func main() {
	tmplText1 := "Path is: /path/to/{{isotime `20060102030405`}}\n"
	tmplText2 := "Path is: /path/to/{{timestamp}}\n"

	funcMap := template.FuncMap{
		"isotime":   isotime,
		"timestamp": timestamp,
	}

	t1, err := template.New("isotime").Funcs(funcMap).Parse(tmplText1)
	if err != nil {
		fmt.Printf("execution: %s", err)
	}
	err = t1.Execute(os.Stdout, "")
	if err != nil {
		fmt.Printf("execution: %s", err)
	}

	t2, err := template.New("timestamp").Funcs(funcMap).Parse(tmplText2)
	if err != nil {
		fmt.Printf("execution: %s", err)
	}
	err = t2.Execute(os.Stdout, "")
	if err != nil {
		fmt.Printf("execution: %s", err)
	}
}
```
Symfony2.7 新機能 - Twigがファーストクラスへ昇進

Symfony2.7 (Long Term Support) が近づいているので、バージョンアップに向け、いろいろ調査中である。

New in Symfony 記事シリーズによると、`twig` が、抽象化レイヤーである `templating` サービスを呼び出さずに利用できるようになるとこのと。

http://symfony.com/blog/new-in-symfony-2-7-twig-as-a-first-class-citizen

Symfony2.6 までは、`templating` サービス登録時に、`templating.engine` に `twig` を指定することによって Twig の機能を利用できた。
Symfony2.7 からは、 `templating` サービスの設定を消すことができ、Twig を直接参照することができる。
Twigの直接利用により、抽象化レイヤーを使わないため、パフォーマンスに良い効果を与えるとのこと。`templating`サービスを止め、Twig を直接利用した場合、48クラスのロードが削減され、結果メモリを30%も削減することができるそう。

> For Symfony 3.0, I'd like to extract the Templating Component into an independent library (for the few people using PHP with Symfony) but I'd also like for Twig to be front and center in the framework. The good news is that most of the work has already been done in Symfony 2.7.


とあるように、Symfony3.0 では、Templating コンポーネントを依存から外すことを計画しているようで、Twig を中心に持っていくようだ。

とは言え、現状は今までの `templating` が消えてなくなるわけではなそうなので、移行時はそのまま使い、新しく `twig` テンプレートエンジンを使った、Symfony プロジェクトを始める場合は、この方法を使うことがパフォーマンスにとって効果的かもしれない。

現時点では `Controller::render()` は、`template` を[経由している](https://github.com/symfony/FrameworkBundle/blob/2.7/Controller/Controller.php#L175)ので、この機能を活かすには、 `Controller::render()` は使うなということになるのだろうか。