OmniAICreator/Qiita-1.07M huggingface dataset:
SFINAEを使ったメタ関数の作成

みなさんこんばんは。

今回はSFINAEを使ったメタ関数作成のひな形みたいなものを紹介したいと思います。

そのために、特定の型が定義されているかどうか調べるメタ関数と
特定のプロパティが定義されているかどうか調べるメタ関数を作りました。

```
// has_typeは引数にtypeが定義されているか調べる
has_type < std::true_type >  // std::true_typeを継承  ;typename std::true_type::type
has_type < int >             // std::false_typeを継承 ;int::typeはない

// has_valueは引数にvalueが定義されているか調べる
has_value < std::true_type > > // std::true_typeを継承  ;std::true_type::value
has_value < int > > 　　　　　　// std::false_typeを継承 ;int::valueはない
```

おそらくこれらを調べるメタ関数はSFINAEを使わないと作ることはできません（たぶん）。
さて、早速書いていきます……と言いたいところですが、下準備。
std::true_typeやstd::false_typeが型から値を生成するものだとしたら、その逆です。
値から型を生成するメタ関数です。

```
template < bool b >
struct meta_bool : std::true_type
{ // std::true_type
};
template <>
struct meta_bool < false >
  : std::false_type
{ // std::false_type
};
```

お待たせしました。
まずはhas_typeからです。

```
template < class Ty >
struct _has_type
{
private:
  template < class U >
  static auto confirm( U )
    -> decltype( std::declval < typename U::type >(), std::true_type() );
  static auto confirm( ... ) -> std::false_type;
public:
  enum : bool { value = decltype( confirm( std::declval< Ty >() ) )::value };
};
template < class Ty >
using has_type = meta_bool < _has_type < Ty >::value >;
```

_has_typeが実装になっています。
SFINAEは関数でしか働かないので、メンバ関数を使います。
なお、実際に呼び出すことはないので定義はありません。

```
template < class U >
static auto confirm( U )
  -> decltype( std::declval < typename U::type >(), std::true_type() );
```

ここがキモですね。
戻り値でSFINAEを使っています。

`decltype( std::declval < typename U::type >(), std::true_type() );`
左辺を無視するカンマ演算子(`,`)の仕様を利用しています。
decltypeの中身は値でなければならないので、`std::declval < typename U::type >()`としています。
U::type&&型の仮の値、ということになりますね。
カンマ演算子の性質を利用して、最終的には絶対にstd::true_typeが戻り値になるようになっています。
U::typeが無効なら（Uがtypeを持っていなければ）substitution faultが発生して次のconfirmを見に行きます。
`static auto confirm( ... ) -> std::false_type;`はどんな値も受け取れて、戻り値はstd::false_typeです。
すなわち、`enum : bool { value = decltype( confirm( std::declval< Ty >() ) )::value };`は
confirmにTy型の値を入れた時の戻り値の型(std::true_typeかstd::false_type)を得て、そのvalue(trueかfalse)をvalueに入れているということになります。

ふう。
meta_boolはtrueかfalseを入れるとstd::true_typeかstd::false_typeになりますので、これでhas_typeは完成です。

```
template < class Ty >
using has_type = meta_bool < _has_type < Ty >::value >;
```

次はvalueです。
これはプロパティを調べるので、少し変わってきますね。
とは言え、ほとんど変わることはありません。
むしろさっきより簡単になっています。

```
template < class Ty >
struct _has_value
{
private:
  template < class U >
  static auto confirm( U u ) ->
    decltype( u.value, std::true_type() );
  static auto confirm( ... ) -> std::false_type;
public:
  enum : bool { value = decltype( confirm( std::declval< Ty >() ) )::value };\
};
template < class Ty >
using has_value = rinse::meta_bool< _has_value< Ty >::value >;
```

以上です。
似た形になることがわかりますね。
実用では、これらをstd::enable_ifに使って、さらにSFINAEを利用するという形になりますかね。
マクロなんかでプロパティや型を調べるメタ関数を自動生成できるようにすると楽かもしれません。

~~実はメソッドのものも作ってみようとしたのですが、引数の調べ方がパッと思い浮かばなかったのでこうすりゃいいんじゃねとかありましたらコメントをお願いします。~~
作りました。よろしければ合わせて読んでいただけると喜びます。=> [特定のメソッドの存在を調べるメタ関数](http://qiita.com/rinse_/items/a43ca5b9ea6df10ee40e)
CentOSにNginxをApacheと同居させる

# 前書き

どうせならNginxをリバースプロキシとして立てて、静的なコンテンツは全部Nginx、動的なコンテンツはApacheにパス、みたいな構成をやりたかったので。

# セットアップ

## 前準備

衝突を避けるためApacheのポートは前もって80番から変えておきます。

```
$ grep ^Listen /etc/httpd/conf/httpd.conf
Listen 8080
```

## インストール

```
$ sudo rpm -ivh http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm
$ cat /etc/yum.repos.d/nginx.repo
# nginx.repo

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

$ sudo yum install nginx
```

## 起動と確認

```
$ sudo service nginx start
```

ブラウザでアクセスして
「Welcome to nginx!」
って出てきたらOK。


## リバースプロキシ設定

```
$ sudo vim /etc/nginx/conf.d/reverse_proxy.conf
```

いろいろ試行錯誤しましたが、結局こんな感じで設定しました。

ちなみにdefault.confの中身は全部コメントアウトしました。

``` :/etc/nginx/conf.d/reverse_proxy.conf
server {
    listen      80;
    server_name localhost;

    error_page  404                 /e/404.html;
    error_page  500 502 503 504     /e/50x.html;

    location /e/ {
        root /usr/share/htdocs/error;
    }

    location / {
            proxy_pass http://127.0.0.1:8080;

            proxy_redirect                          off;
            proxy_set_header Host                   $host;
            proxy_set_header X-Real-IP              $remote_addr;
            proxy_set_header X-Forwarded-Host       $host;
            proxy_set_header X-Forwarded-Server     $host;
            proxy_set_header X-Forwarded-For        $proxy_add_x_forwarded_for;
    }

    location ~* ^/(static|icons)/ {
        root /usr/share/htdocs/default;
        index index.html;
    }
}
```

これでstaticとiconディレクトリ以下にアクセスした時はnginxが直接返し、それ以外のときはApacheに流す、の流れになった模様。
一応アクセスログも見て確認できました。

ちょっとエラーページ周りの設定が微妙だけど、そこは目を瞑る。
とりあえずデフォルトのエラーページ出したくなかったんや。。。

## mod_rpaf

このままだとApache側でアクセス元アドレスが取れないとか不都合が出るので、その辺りを修正していく。

```
$ sudo yum install httpd-devel

$ mkdir mod_rpaf-0.6
$ cd mod_rpaf-0.6
$ wget https://raw.github.com/ttkzw/mod_rpaf-0.6/master/mod_rpaf-2.0.c

$ sudo apxs -i -c -n mod_rpaf-2.0.so mod_rpaf-2.0.c
$ sudo vim /etc/httpd/conf.d/mod_rpaf.conf
$ sudo cat /etc/httpd/conf.d/mod_rpaf.conf
LoadModule rpaf_module modules/mod_rpaf-2.0.so
RPAFenable On
RPAFsethostname On
RPAFproxy_ips 127.0.0.1
RPAFheader X-Forwarded-For

$ sudo service httpd restart
```

# 完了

ひとまずこれでやりたかったことは完了。
案外うまくいくもんだなー、と思いつつセキュリティ的に何か見落としてないかとか色々心配ではある。

## 参考

http://qiita.com/monhan/items/013f1a4c1d7f26d0b755
SwiftプロジェクトでC++を使う方法メモ


SwiftプロジェクトでC++を使う場合、以下の手順を踏みます。

1. C++ファイル・ヘッダファイルを作成
2. 作ったC++ファイルをラップするObjective-C++ファイル・ヘッダーを作成
3. Objective-CブリッジヘッダでObjective-C++ファイルのヘッダーをインポート
4. swiftファイルからObjective-C++のコードを呼び出し

## C++ファイル・ヘッダファイルを作成
C++ファイル・ヘッダファイルを作成します。

```cpp:cpp.h
#ifndef __SwiftAndObjCpp__cpp__
#define __SwiftAndObjCpp__cpp__

#include <stdio.h>

class Cpp {
public:
    void run();
};

#endif /* defined(__SwiftAndObjCpp__cpp__) */
```

``` cpp:cpp.cpp
#include "cpp.h"

void Cpp::run() {
    printf("cpp run");
}
```


## 作ったC++ファイルをラップするObjective-C++ファイル・ヘッダーを作成

Objective-C++ファイル・ヘッダーファイルを作り、C++コードを呼び出します。

``` objc:objcpp.h
#ifndef SwiftAndObjCpp_objcpp_h
#define SwiftAndObjCpp_objcpp_h

#import <Foundation/Foundation.h>

@interface ObjCpp : NSObject
-(void)run;

@end

#endif
```

``` objc:objcpp.mm
#import <Foundation/Foundation.h>
#import "objcpp.h"
#import "cpp.h"

@implementation ObjCpp {
    Cpp *cpp;
}

-(id)init {
    self = [super init];
    cpp = new Cpp();
    return self;
}

-(void)dealloc {
    delete cpp;
    [super dealloc];
}

-(void)run {
    cpp->run();
}

@end
```
##Objective-CブリッジヘッダでObjective-C++ファイルのヘッダーをインポート

Objective-Cブリッジヘッダを作成し、Objective-C++ファイルのヘッダーをインポートします。

Objective-Cブリッジヘッダは、SwiftプロジェクトにObjective-Cファイルを追加する際のダイアログでOKを選択すると、自動で作成されます。

``` cpp:SwiftAndObjCpp-Bridging-Header.h
//
//  Use this file to import your target's public headers that you would like to expose to Swift.
//

#import "objcpp.h"
```

## swiftファイルからObjective-C++のコードを呼び出し
以上で、SwiftでC++のコードを呼び出す準備が整いました。

最後に、SwiftコードからObjective-Cのメソッドを呼び出します。
インポートは不要です。

```swift:ViewController.swift
import Cocoa

class ViewController: NSViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        
		 // Objective-C++メソッド呼び出し
        var objcpp = ObjCpp()
        objcpp.run()
    }
}
```
【objective-c】lineに投稿する（備忘録）

# xcodeでlineに投稿する

UIImageのlineImgを宣言して、UIImagePNGRepresentation(　)
　　　　　　　　　　　　　　　　　　　　　　　　　　　↑ここに入れた

```objc 
UIImage *lineImg = UIGraphicsGetImageFromCurrentImageContext() ;

UIPasteboard *pasteboard = [UIPasteboard generalPasteboard];
[pasteboard setData:UIImagePNGRepresentation(lineImg) forPasteboardType:@"public.png"];
NSString *LineUrlString = [NSString stringWithFormat:@"line://msg/image/%@", pasteboard.name];
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:LineUrlString]];

```





出典：
http://lab.dolice.net/blog/2013/06/29/objc-share-to-social/
CentOSにApacheを導入

# 前書き

そういえば自分でApache入れたことなかったなと思って。
過去に作ったHPは全部レンタルサーバなので最初から入ってたし、初期化前に使ってたときは立てなかったしで。

そんなこんなで調べつつインストールしてみました。
といっても大したことはやってないけども。

## インストール

```
$ sudo yum install httpd
$ httpd -v
```

設定ファイルを編集

```
$ sudo cp /etc/httpd/conf/httpd.conf /etc/httpd/conf/httpd.conf.org
$ sudo vim /etc/httpd/conf/httpd.conf
$ diff /etc/httpd/conf/httpd.conf.org /etc/httpd/conf/httpd.conf
44c44
< ServerTokens OS
---
> ServerTokens Prod
331c331
<     Options Indexes FollowSymLinks
---
>     Options -Indexes FollowSymLinks
536c536
< ServerSignature On
---
> ServerSignature Off
```

あと/etc/httpd/conf.d/welcome.conf の中身を全コメントアウト。

設定ファイル文法チェック。

```
$ apachectl configtest
Syntax OK
```

起動。

```
$ sudo service httpd start
Starting httpd:                                            [  OK  ]
```

自動起動設定。

    $ sudo chkconfig httpd on

とりあえずWebページはこれでアクセス可能。やったね！

起動は確認できたし、デフォルトで入ってるエイリアスの設定は全部コメントアウトしておく。
何してるのかよくわからないし、軽く見たところ必要性もなさそうだし。

## バーチャルホスト設定

バーチャルホストとは、同じサーバに対してアクセスしても、違うドメインであれば違う内容を表示できる仕組みのこと。

他にも色々あるが、ひとまずここでやろうとしているのはそういう設定である。

設定を追加する。

    $ sudo vim /etc/httpd/conf.d/virtual.conf
``` :/etc/httpd/conf.d/virtual.conf
NameVirtualHost *:80

<VirtualHost *:80>
    ServerName hogefuga.com
    DocumentRoot /var/www/html
</VirtualHost>

<VirtualHost *:80>
    ServerName hogefuga.sakura.ne.jp
    DocumentRoot /var/www/hogefuga
</VirtualHost>
```

バーチャルホストを設定すると、標準のDocumentRootは使用されなくなり、ホスト名を参照して決まるようになるという。

該当する設定がなかった場合は、最初に設定したバーチャルホストの設定が適用されるとのこと。

なので適当なホスト名でまずデフォルトの設定を書き、次に本命の設定を書いておく。

これで、ブラウザからIPでアクセスした場合と、ホスト名でアクセスした場合で違うルートディレクトリを使用することができる。


# 完了

無事にApache起動して、サイト閲覧できることも確認できたので、あとはコンテンツ作れば一応は公開できる状態に。

とはいっても、別に今回はコンテンツ公開がメインでやってるわけじゃないので、色々試してみる予定。初期化も楽だし。

## 作業過程で入れたyumパッケージ

一々は書かなかったけど、入れたやつをメモ。

```
$ sudo yum install tree
$ sudo yum install php php-mysql php-mbstring
```

## 参考

http://httpd.apache.org/docs/2.2/ja/vhosts/name-based.html
YAML でマッピングのマージ

PHP の Symfony Yaml 2.5.7 と、Ruby 2.1.5 の yaml で確認しています。

Ruby の yaml は Psych という libyaml のラッパーらしいので、libyaml が使われている場合は概ね同じなのではないでしょうか。

一方 PHP の Symfony Yaml はパーサが独自に実装されています。

---

次のようにマッピング(連想配列)のキー部分に `<<` を記述し、要素をマッピングのシーケンス(配列)にすると・・・

```yaml:input.yaml
<<:
  - a: 1
    b: 2
  - c: 3
    d: 4
e: 5
```

次のようにマッピングがマージされます。

```yaml:outout.yaml
a: 1
b: 2
c: 3
d: 4
e: 5
```

Ruby の yaml だとフロースタイルで次のようにも記述できました。

```yaml:input.yaml
{ <<: [ {a: 1, b: 2}, {c: 3, d: 4} ], e: 5 }
```

が、PHP の Symfony Yaml だとこの形式は "<<" というキーを持つ連想配列になってしまいました。

---

アンカーとエイリアスを組み合わせて、次のように使うと便利です。

```yaml
base: &base
  a: 1
  b: 2
  c: 3

ore:
  <<: [*base]
  a: 0

are:
  <<: [*base]
  x: 9
```

と、思ったら、次のようにも書けました。

```yaml
base: &base
  a: 1
  b: 2
  c: 3

ore:
  <<: *base
  a: 0

are:
  <<: *base
  x: 9
```

んん？

---

次の形式は PHP の Symfony Yaml だとマージされましたが、Ruby の yaml だとマージされませんでした。

```yaml
<<:
  a: 1
  b: 2
  c: 3
  d: 4
e: 5
```

次の形式は PHP も Ruby もマージされませんでした。

```yaml
{ <<: { a: 1, b: 2, c: 3, d: 4 }, e: 5 }
```

次の形式のようにエイリアスだと PHP でも Ruby でもマージされました。

```yaml
- base: &base
    a: 1
    b: 2
    c: 3
    d: 4

- <<: *base
  e: 5
```

フロースタイルだと Ruby ならマージされますが、PHP だとやっぱりマージされませんでした。

```yaml
- base: &base { a: 1, b: 2, c: 3, d: 4 }
- { <<: *base, e: 5 }
```

うーん？

---

よくわからないので YAML の仕様を確認しようとしたのですが、記述が見つかりませんでした。

 - [YAML Ain't Markup Language (YAML) Version 1.1](http://yaml.org/spec/current.html "YAML Ain't Markup Language (YAML) Version 1.1")

下記の記事によると・・・

 - [Today's HOGE(2006-11-06)](http://diary.atzm.org/20061106.html "Today's HOGE(2006-11-06)")

下記にちらっとだけ書かれていました。

 - [YAML Ain't Markup Language](http://www.yaml.org/refcard.html "YAML Ain't Markup Language")

るびまにも書かれていたようですが NoMethodError とかなっていて表示されていません。

- [Rubyist Magazine - プログラマーのための YAML 入門 (検証編)](http://magazine.rubyist.net/?0012-YAML#l17 "Rubyist Magazine - プログラマーのための YAML 入門 (検証編)")
Rails4でアクション毎に実行権限を設定する

以下の感じで設定をしてみました。

* `update`できれば`edit`を、`create`できれば`new`を実行できる
* ログインユーザ自身のレコードだけ`show`, `update`, `destroy`できる
* ログインしていれば`create`できる
* ログインユーザのレコードだけ`index`で一覧できる

```rb:app/policies/blog/site_policy.rb
class Blog::SitePolicy < ApplicationPolicy
  def index?
    !!user
  end

  def show?
    record.user == user
  end

  def create?
    !!user
  end

  def new?
    create?
  end

  def update?
    record.user == user
  end

  def edit?
    update?
  end

  def destroy?
    record.user == user
  end

  class Scope < Scope
    def resolve
      scope.where(user_id: user.id)
    end
  end
end
```

よく詳しくは[ブログ記事に載せたコントローラ側のコード](http://blog.enogineer.com/2014/11/22/rails-controller-policy/)もご覧ください。
sceneの描画を単一のShaderで置き換える

オブジェクトが水面に沈んでいくとき、
オブジェクトが水面に接した輪郭に沿って
波紋を広げたいな、と思ったのですが、そうすると
波紋の形状をレンダリングするときはShaderを
切り替える必要がありそうです。
どういったタイミングで切り替えたらいいんだろう、
と調べてみたら、ありました。

```
camera.SetReplacementShader
```

まんま願いをかなえてくれそうです。
とりあえず地面の高さでモデルをカットするようなシェーダーを用意して、

```
Shader "Custom/cutFaceEdge" {
  SubShader {
    Tags {  "RenderType" = "Opaque" "Queue" = "Geometry" }
           :
  } 
}
```

次に波紋用のオブジェクトを映すカメラ（RenderTexture用）内で
camera.SetReplacementShader()を呼びます。

```
	void Start () {
		camera.SetReplacementShader(repShader, "RenderType");
	}
```

第2引数は、もとのオブジェクトのマテリアルで用意したタグを使うようですが、
RenderType等あらかじめ用意されているタグでも良いようです。
その場合、もとのマテリアルが"RenderType" = "Opaque"なら
用意したシェーダーも"RenderType" = "Opaque"にする必要があります。

実行してみたら・・・
![01.gif](https://qiita-image-store.s3.amazonaws.com/0/59911/4e8bb733-5cc4-04e5-e651-7c8e69d44dbe.gif)
うまくいきました！

あとはカメラを水面に垂直にして、レンダリングしたイメージを波紋として使えば
いけるんじゃないかな？と思います。
Gnuplottexを使う際の注意点（texmf.cnfの設定）

LaTeXのgnuplottex.styを利用すると、LaTeXのソース内部に直接gnuplotソースを打ち込むことができ、LaTeXのコンパイル時に自動でgnuplotでグラフを生成してくれるようになります。ドキュメントとグラフのソースを一元化できて修正も楽になるので便利です。サンプルコードは以下の通りです。LaTeXとgnuplotがインストールされている必要があります。

```gnuplot.tex
\usepackage[dvipdfm]{graphicx}
\usepackage{gnuplottex}
\begin{document}
たとえばこんなかんじにグラフを挿入できます。

\begin{gnuplot}
       splot sin(x)*cos(y)
\end{gnuplot}

\end{document}
```

これを

```
$ platex --shell-escape gnuplot.tex
```
でコンパイルします。この`--shell-escape`は必須です。しかしこれだけでは、
`Package gnuplottex Warning: Please convert gnuplot-gnuplottex-fig1.gnuplot manually.`や`Permission denied`が発生することがあります。
これは、LaTeXからgnuplotを呼び出すときの実行権限のエラーが原因のようですので、
texmf.cnfを編集して、gnuplotを実行可能な外部プログラムとして指定しておく必要があります。texmf.cnfはたとえば`/usr/local/texlive/texmf-local/web2c`にあります(TeXLiveの場合)。

```texmf.cnf
shell_escape_commands = \
bibtex,bibtex8,bibtexu,pbibtex,upbibtex,biber,\
kpsewhich,\
makeindex,mendex,texindy,\
mpost,pmpost,\
repstopdf,epspdf,extractbb,gnuplot
```

以上はMac OS X Marvericksで試した結果です。
インポートしたEclipseプロジェクトが、プロジェクトエクスプローラーでフラット表示できないとき


# 原因

読み込んだパッケージがEclipseからみたときにJavaプロジェクトとして認識されていないときに起きる問題のようです。

# 解決方法

1. パッケージエクスプローラー -> 該当のJavaパッケージ　→　Configure（構成） →　Convert to Maven project (Mavenプロジェクトへ変換)
1. パッケージの表示をフラット表示に変更

![macPng 2014-11-23 14.36.15.png](https://qiita-image-store.s3.amazonaws.com/0/49263/c216d73a-f1b1-01bd-c785-1a9bc652c17d.png)
市松模様生成mixin

市松模様なデザインが来る事が多くなってきたので、簡単に実現する為の mixin を書いてみました。

`nth-child` 必須です。

```scss:mixin
@mixin pattern-check($color1:'#fff', $color2:'#000', $target:'.hoge', $col:4) {
	#{$target} {
		background-color:#{$color1};
	}

	@if $col % 2 == 0 {
		@for $i from 0 through floor(($col - 1) / 2) {
			&:nth-child(#{$col * 2}n + #{($i * 2) + 1}) ,
			&:nth-child(#{$col * 2}n + #{($i * 2) + $col + 2}) {
				#{$target} {
					background-color:#{$color2};
				}
			}
		}
	} @else {
		@for $i from 0 through floor(($col - 1) / 2) {
			@for $j from 0 through floor($col / 2) {
				&:nth-child(#{$col * 2}n + #{($col + 1) * $i + ($j * 2) + 1}) {
					#{$target} {
						background-color:#{$color2};
					}
				}
			}
		}
	}
}
```

## e.g.

```html
ul.list > li.list-item * 5
```

```scss
.list {
  @include pattern-check('red','blue','.list-item',5);
  display: table;
}

.list-item {
  display: table-cell;
}
```

第1引数が一番最初の色。
第2引数がその次に来る色。
第3引数は色を適応するターゲット指定。
第4引数は一行に何列あるのかの指定。

という感じです。
SwiftのREPLのメモ

### 概要
素早くSwiftを実行できる環境として、Playgroundが有名ですがRubyでいう所のirb的なREPLもあります。  

REPLはインタプリタ的に振る舞い、ステートメントの検証、評価、宣言を即時コンパイルして実行するとのこと。

* `swift`で起動、:quitかctl+Dで停止できる。
* 起動中は「:help」等「:」つきでコマンドを叩ける。
* 明示的に変数に代入しないと勝手に$R0のような変数に代入される。  
* letへの再代入、unwrapp忘れ等もちゃんとエラーになる。
* import FoundationすればNSUUIDとかも使える。  

### サンプル  

```swift
  1> "100".toInt()
$R0: Int? = 100
  2> var a = 250
a: Int = 250
  3> func sum(val1:Int, val2:Int)->Int{
  4.     return val1 + val2
  5. }
  6>
  7> sum(10, 20)
$R1: Int = 30
  8> let result = sum($R0, a)
repl.swift:8:18: error: value of optional type 'Int?' not unwrapped; did you mean to use '!' or '?'?
let result = sum($R0, a)
                 ^
                    !
  8> let result = sum($R0!, a)
  9.
result: Int = 350
  9> result = 500
repl.swift:9:8: error: cannot assign to 'let' value 'result'
result = 500
```

### 参考
[Introduction to the Swift REPL](https://developer.apple.com/swift/blog/?id=18)
色々できそう。↓
[コマンドライン（Command Line）プログラムとして使う [1]](http://blog.skipbit.jp/2014/08/swift-command-line-1.html)
連続値をまとめる

あるコマンド foo で、こんな出力がある

```bash
$ ./foo
"EB80"
"EB81"
"EB82"
"EB83"
"EB84"
"EB85"
"EB87"
"EB88"
"EB89"
"EB8A"
"EB8B"
"EB8D"
```

Unicodeの羅列なわけだけど、これが連続しているかどうかを確認したい。
普通に、Unixのコマンドで頑張ってみると

```bash
$ ./foo | tr -d '"' | (echo ibase=16; cat) | bc | awk 'last+1 == $0{last=$0; print "..."; next} {print last; last=$0; print $0} END {print last}' | uniq

60288
...
60293
60295
...
60299
60301
```

なんとかここまで来たが、この10進数を16進数に変換する処理がいまいちである。bcでやってみると、"..."の出力のせいでエラーになる(まあ、目的は達成している)

```bash
$ ./foo   | tr -d '"' | (echo ibase=16; cat) | bc | awk 'last+1 == $0{last=$0; print "..."; next} {print last; last=$0; print $0} END {print last}
' | uniq | (echo ibase=10; echo obase=16; cat) | bc

EB80
(standard_in) 5: syntax error
EB85
EB87
(standard_in) 8: syntax error
EB8B
EB8D
```

ruby で頑張ってみることにする。

まずは、連続値をうまく扱うクラスがあった方がいろいろとうれしいんじゃないかと思った。
(結構、大きくなったので保存のためにこの記事を書くことにした)

```ruby:discrete_range.rb 
#!/usr/bin/env ruby

class DiscreteRange
  include Enumerable

  def initialize(*arg)
    @ranges = []
    arg.each {|v| add v}
  end

  def add(v)
    entry = @ranges[-1]
    case entry
    when Range
      if !entry.exclude_end? && entry.last.succ == v
        @ranges[-1] = Range.new(entry.first, v)
      elsif entry.exclude_end? && entry.last == v
        @ranges[-1] = Range.new(entry.first, v)
      else
        @ranges.push v
      end
    else
      if entry.respond_to?(:succ) && entry.succ == v
        @ranges[-1] = Range.new(entry, v)
      else
        @ranges.push v
      end
    end
  end

  def each
    @ranges.each {|e|
      case e
      when Range
        e.each {|v|
          yield v
        }
      else
        yield e
      end
    }
  end

  def to_s
    @ranges.to_s
  end
end

if $0 == __FILE__
  dr = DiscreteRange.new(1,2,3,5)
  p dr      # => #<DiscreteRange:0x0000060042f5f8 @ranges=[1..3, 5]>
  p dr.to_a # => [1, 2, 3, 5]
  dr.add 6
  p dr      # => #<DiscreteRange:0x0000060042f238 @ranges=[1..3, 5..6]>
end
```

```bash
./foo | tr -d '"' | ruby -r./discrete_range.rb -e 'args = ARGF.readlines.map(&:chomp)' -e 'dr = DiscreteRange.new(*args)' -e 'puts dr'
["EB80".."EB85", "EB87".."EB89", "EB8A".."EB8B", "EB8D"]
```

たまたまいいサンプルを選んだが、EB89, EB8A は16進数で連続しているのにそう見なされていない。やっぱり10進数⇔16進数を相互変換するコマンドは欲しい。

とりあえずrubyで代用する

```bash
$ ./foo | tr -d '"' | ruby -ne 'puts $_.hex' | ruby -r./discrete_range.rb -e 'args = ARGF.readlines.map(&:chomp)' -e 'dr = DiscreteRange.new(*args)' -e 'puts dr' | ruby -pe '$_.gsub!(/\d+/) { $&.to_i.to_s(16).upcase }'
["EB80".."EB85", "EB87".."EB8B", "EB8D"]
```

もちろんパイプを使わずに全部一つのrubyでやってもいいが、Unix的哲学に反する気がするので、役割分担の意味でコマンドを分けている。

一応、rubyでやってみたがやはりワンライナーでは適材適所があると思う。

```bash
$ ./foo | ruby -r./discrete_range.rb -e 'args = ARGF.readlines.map {|v| v.delete("\"")}.map(&:hex)' -e 'dr = DiscreteRange.new(*args)' -e 'puts dr.to_s.gsub(/\d+/) { $&.to_i.to_s(16).upcase }'
[EB80..EB85, EB87..EB8B, EB8D]
```
ファイルローカル変数とディレクトリローカル変数を追加する。

ファイルローカル変数とディレクトリローカル変数の設定には専用のコマンドが用意されているので、それを使いましょう。

## ファイルローカル変数

Emacs のファイルローカル変数はファイル毎に設定を切り替えたいときに便利です。
しかし、ファイルの先頭に書くならまだしも、ファイルの最後書くのはちょっと面倒です。
たとえば、ruby-mode に書く場合は次のようになるでしょう。

```el
# Local Variables:
# yas-use-menu: t
# End:
```

このように、`Local Variables:` と `End:`、 さらには各行のコメント、と毎回タイプするのは面倒です。そこで標準で用意されているのが、`add-file-local-variable` コマンドです。`M-x add-file-local-variable` を実行すると、追加したい変数名と値をミニバッファで尋ねてくるので、それを入力すると上の例のようなファイルローカル変数の設定がバッファに挿入されます。コメントはバッファのメジャーモードに合わせて適切なものが選ばれるので便利です。ファイルローカル変数の書き方を覚えなくてもよいのも便利です。

複数のファイルローカル変数を設定したいときには、`add-file-local-variable` を繰り返し実行します。また、設定したファイルローカル変数を削除したいときには、これも専用のコマンド、`delete-file-local-variable` が用意されているので、これを使います。


## ディレクトリローカル変数

Emacs にはファイルローカル変数だけでなく、ディレクトリのファイル対して有効になるディレクトリローカル変数というのもあります。このファイルは各ディレクトリに `.dir-locals.el` という名前で作成し、メジャーモード毎に alist で設定するのですが、こんなの覚えてられません。ディレクトリローカル変数にも設定用に専用のコマンドが用意されているので、それを使いましょう。

+ 追加 ... `add-dir-local-variable`
+ 削除 ... `delete-local-variable`

## おわりに

ファイルローカル変数とディレクトリローカル変数を設定するためのコマンドを紹介しました。書き方を覚えてしまえば自分でタイプすることもできるのですが、私はそんなの覚えていられないので、コマンドで設定することにします。

+ ファイルローカル変数
  - `add-file-local-variable`
  - `delete-file-local-variable`
+ ディレクトリローカル変数
  - `add-dir-local-variable`
  - `delete-dir-local-variable`
なぜか boolean の validates ~ presence がいつもエラーになる

## Active Record の Validation

Ruby on Rails の Active Record にある validates って便利ですよね。

```ruby
class Person < ActiveRecord::Base
  validates :name, presence: true
end
```

というモデルがあったときに、`name` に値が入っているかをチェックしてくれて、ない場合にはエラーとかまっで設定してくれる。
便利 :+1:

## 値があるのにバリデーションが `false` ???

ただ、`boolean` のフィールドでこれを使った際にちょっとつまづきました。

```
class Person < ActiveRecord::Base
  validates :name, presence: true
  validates :has_glasses, presence: true
end
```

というモデルがあるとして、

```ruby
irb> person = Person.new(name: "Daisuke", has_glasses: false)
 => #<Person id: nil, name: "Daisuke", has_glasses: false>
irb> person.has_glasses
 => false
irb> person.valid?
=> false
```

と `false` の値が `has_glasses` に設定されているはずなのにバリデーションが通りません。

？？？

で、少し調べてみると、これ、実は `presence` の動作が（僕個人の意見として）直感的でないのが原因でした。

`presence` の動作を定義している [`ActiveModel::Validations::PresenceValidator`](https://sourcegraph.com/github.com/rails/rails@a501ae8f032d244779a2c46c104ad07d79fa2586/.tree/activemodel/lib/active_model/validations/presence.rb) を見ると

```ruby
class PresenceValidator < EachValidator
  def validate_each(record, attr_name, value)
    record.errors.add(attr_name, :blank, options) if value.blank?
  end
end
```

となっています。ここで注目すべきは `if value.blank?` です。ここで、`value` には `false` が入っているわけですが、そうなると…

```ruby
irb> value = false
=> false
irb> value.blank?
 => true
```

となり、エラーとして認識されてしまいます！

さらに掘り下げると、どうやら、この `blank?` メソッド、Rails のライブラリの1つである `ActiveSupport` で `Object` クラスに追加されているみたいです。

[Ruby on Rails API](http://api.rubyonrails.org/classes/Object.html#method-i-blank-3F) より

```ruby
def blank?
  respond_to?(:empty?) ? !!empty? : !self
end
```

`boolean` は `empty?` メソッドがないので、`!self` の結果、つまり `true` が返されます。

## 正しい Boolean フィールドのチェック方法

Booelan のバリデーションを行う場合には [`ActiveModel::Validations::InclusionValidator`](https://sourcegraph.com/github.com/rails/rails@a501ae8f032d244779a2c46c104ad07d79fa2586/.tree/activemodel/lib/active_model/validations/inclusion.rb) (`validates` に書くときは `inclusion`) を使って

```ruby:
validates :has_glasses, inclusion: [true, false]
```

とするのがいいらしいです。

## 参考リンク

[A Developer with a Pencil](http://devandpencil.herokuapp.com/blog/2013/08/11/rails-validates-presence-of-boolean-not-what-you-think)
ソート済み配列から指定した値に最も近い値を取り出す

lower_boundである数値を超えるイテレータを取り出した後，その1個手前の要素を取り出す．
さらに，2つの要素との距離を取り，最も小さい方を返す．
STLだとできないかなぁとか思っていたけれども，思いのほかできてしまったので嬉しい．
それだけ．

```cpp
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main()
{
	std::vector<float> v;
	for (int i = 0; i < 10; ++i) v.push_back(i);

	float val = 11;

	int back = std::lower_bound(v.begin() + 1, v.end() - 1, val) - v.begin();
	int front = back - 1;
	
	float x = v[front] - val;
	float y = v[back] - val;

	int near;
	if (x * x < y * y)
		near = front;
	else
		near = back;
	cout << v[near] << endl;

	return 0;
}
```
PhantomJSでの日本語文字化け

案の定、文字化けったので、[こちら](http://t-cyrill.hatenablog.jp/entry/2014/10/05/123803)を参考に２手順でした。

```
% cat /etc/lsb-release 
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=14.04
DISTRIB_CODENAME=trusty
DISTRIB_DESCRIPTION="Ubuntu 14.04.1 LTS"

% phantomjs -v
1.9.8

# フォントのインストール
% sudo apt-get install fonts-migmix      

# local.confの作成
% cat /etc/fonts/local.conf 
<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>
  <match target="pattern">
    <test qual="any" name="family">
      <string>serif</string>
    </test>
    <edit name="family" mode="assign" binding="strong">
      <string>MigMix 2P</string>
    </edit>
  </match>
</fontconfig>



```
データセンターでのラッキング作業

最近データセンターに入り浸っています。

## ラック搭載計画図

事前にラックに搭載する図を作っておくこと。テキストベースでも何でも良い。
ただ実際に搭載を始めると位置を変えたくなるのはある。
例えば1Uサーバが思ったより奥行きがあってケーブリングに支障をきたしそうな時とか。

## LANケーブル

* LANケーブルにプラスチックっぽいケーブルタグをつけると、ケーブルガイドに入れづらくなるので注意。
* LANケーブル両端にテプラを貼ると良い。
  * 6mmのテプラが調度良い。
  * ケーブルには`01`, `02`,,,の連番が良い。ホスト名や搭載位置などでは後で変わったりしてメンテが面倒のため。
  * また、これだとLANケーブルに調度良く一周出来る。
* ケーブルの色を2種類は用意しておくこと。

## 電力

* 最近のCPUは電力低いので電力不足になりにくい。
* 1Ux2台搭載して1U空ける、の繰り返しでようやくラックの推奨上限に達する程度。

## ケーブリング

* ケーブルガイドやケーブルフック、ケーブルバンドを多用することでケーブルが絡まりづらくなる。
* ケーブルにはあらかじめ両端にテプラを貼っておくこと。後から貼ろうとすると面倒になる。
* ラック左右のスペースはケーブルだらけになるため、極力床下に垂らすとよい。


## データセンタースタッフ

* 電源のリモートOFF/ONを依頼すると、確認手続きなどで30分は取られる。
  * 有事の際のシミュレーションしておくこと。
  * ラック図がないとリモートOFF/ON依頼にさらに時間が取られるので注意。
* 入館手続きが終われば割りと融通が効く。
  * 抜けなくなったLANケーブルを抜いてもらってみる。
  * 抜けなくなったサーバーレールを抜いてもらってみる。
  * テプラの作成依頼
  * もしかすると一人では降ろすのが難しいサーバを手伝ってくれるかも！？（これは試したことがない
* マウスとかドライバー、ケーブルタイ(ネジネジ)を貸してくれる。
* 予備機を隣に置いておいて、予備機にケーブル付け替えの依頼は有料。(保守契約となる)

## ホストOS

* データセンター内での作業時間を短縮するため、proxmoxやVMWare ESXiのように、インストールすればホストOSの設定を変更せずにすむものを使う。
* CentOSをインストールする場合kickstartの利用や編集、IPアドレスの設定など手間がかかる。

## RAID障害のテスト

* RAID構成のHDDを片方だけで起動させたりテストすること。
  * HDD差し込み口が左、右とある場合、右からだと起動できないサーバもある。
  * その場合、右のHDDを左に刺して起動させる。
[質問:解決済み] TCP/IP通信に関する質問です。


下記の３つのLinuxPCを使って、TCP/IPによるソケット通信のシステムを作成しました。
PC1: IP:192.168.0.1 Port: 20000 TCPサーバ
PC2: IP:192.168.0.2 Port: 20000 TCPサーバ
PC3: IP:192.168.0.3 Port:ランダム(クライアントなので) TCPクライアント

PC3をクライアントとして、同じポート番号を持つアプリが動いている
PC1とPC2に繋いで通信をする形です。
このシステムは問題なく動きました。

しかし、続いてPC1とPC2を一つのPCに(ハードウェアとして)まとめたくなったときに、
下記の条件があったとき、どのようにすれば良いでしょうか？
1. PC3のソフトウェアは一行も変更しない
2. PC1とPC2のソフトは変更してもよいが、同一のハードウェアになっても、それぞれのソケットに流れるデータは変わらないようにすること

一台のコンピュータにおいて、一つのNICに複数のIPをふることはできましたが、
単一OS上で、同じポート番号のソケットを作成するのはできないと思っています。
今のところ、一台のコンピュータで仮想マシンを二台立ち上げる方法を考えていますが、
それ以外に上手い方法はあるでしょうか？

非常に困っているため、是非力を貸してもらえると幸いです。
MiddlemanでLESSを使うときにやったこと


## gemのインストール

Gemfileに以下を追加

```:Gemfile
gem "less"

gem 'therubyracer'
```

## 有効化

```
$ bundle install
```

## middlemanの設定に追加

```ruby:config.rb
set :less
```

## stylesheetを適用するlayoutに追記
"site"はlessファイル名
source/stylesheet/site.lessと置く
`rel="stylesheet/less"`と書く必要はない

```:erb
<%= stylesheet_link_tag "site", {:rel=>"stylesheet", :media=>"all"} %>
```

```:slim
= stylesheet_link_tag "site", {:rel=>"stylesheet", :media=>"all"}
```

## 参考
*Middleman and Front-end Development*
[https://artminister.com/blog/middleman-front-end-development](https://artminister.com/blog/middleman-front-end-development)
URLエンコード・デコードする

# Webサーバーログ解析で使いたかった

Webサーバーのログを見ていると、検索ページからジャンプしてきている形跡があった。しかし、検索キーワードはURLエンコードされた状態であり、デコードしないとわからない。果たしてどんなキーワードなのか興味があった。

そこで、FreeBSDのportsに収録されている[urlendec](https://www.freshports.org/net/urlendec)というプログラムをサクっとインストールしようとしたら……

```bash:32ビット専用だった
# cd /usr/ports/net/urlendec
# make install
===>  urlendec-1.0 is only for i386, while you are running amd64.
*** [install] Error code 1

Stop in /usr/ports/net/urlendec.
# 
```
**これだから、POSIX準拠でないコマンドは信用ならんのじゃ!!!**

# しょーがないのでデコーダーを自作した

というわけでPOSIX原理主義全開で作った。UNIXならどこでも動くはずなので公開する。必要な方はコピペして使うといい。

```bash:urldecode
#! /bin/sh

case $# in
  0) cat -                   ;;
  *) for file in "$@"; do
       case "$file" in
         -)  :             ;;
         /*) :             ;;
         *)  file="./$file";;
       esac
       cat "$file"
     done                    ;;
esac |
exec env - awk '
BEGIN {
  # --- prepare
  LF  = sprintf("\n");
  OFS = "";
  ORS = "";
  # --- prepare decoding
  for (i=0; i<256; i++) {
    l  = sprintf("%c",i);
    k1 = sprintf("%02x",i);
    k2 = substr(k1,1,1) toupper(substr(k1,2,1));
    k3 = toupper(substr(k1,1,1)) substr(k1,2,1);
    k4 = toupper(k1);
    p2c[k1]=l;p2c[k2]=l;p2c[k3]=l;p2c[k4]=l;
  }
  # --- decode
  while (getline line) {
    gsub(/\+/, " ", line);
    while (length(line)) {
      if (match(line,/%[0-9A-Fa-f][0-9A-Fa-f]/)) {
        print substr(line,1,RSTART-1), p2c[substr(line,RSTART+1,2)];
        line = substr(line,RSTART+RLENGTH);
      } else {
        print line;
        break;
      }
    }
    print LF;
  }
}'
```

GNU版のsedを使えば簡単に書けるのは知っているけど、せっかく作るなら可搬性を高めたいのでPOSIXの範囲で作った。結局AWKにベッタリで、しかも全てをBEGINセクションで済ませるというAWKっぽくない使い方だけど、今回の目的では意味を成さないフィールド分割処理（`$0,$1,$2,……`を作る）が走らないようにするため。

## 使い方

[オリジナルのurldecode](http://www.whizkidtech.redprince.net/urlendec/)のような各種オプションには対応していないが、変換したいテキストデータを標準入力あるいはファイル（引数で指定）で与えるだけ。簡単でしょ。

# ついでにエンコーダーも作った

```bash:urlencode
#! /bin/sh

case $# in
  0) cat -                   ;;
  *) for file in "$@"; do
       case "$file" in
         -)  :             ;;
         /*) :             ;;
         *)  file="./$file";;
       esac
       cat "$file"
     done                    ;;
esac |
exec env - awk '
BEGIN {
  # --- prepare
  LF = sprintf("\n");
  OFS = "";
  ORS = "";
  # --- prepare encoding
  for(i= 0;i<256;i++){c2p[sprintf("%c",i)]=sprintf("%%%02X",i);}
  c2p[" "]="+";
  for(i=48;i< 58;i++){c2p[sprintf("%c",i)]=sprintf("%c",i);    }
  for(i=65;i< 91;i++){c2p[sprintf("%c",i)]=sprintf("%c",i);    }
  for(i=97;i<123;i++){c2p[sprintf("%c",i)]=sprintf("%c",i);    }
  c2p["-"]="-"; c2p["."]="."; c2p["_"]="_"; c2p["~"]="~";
  # --- encode
  while (getline line) {
    for (i=1; i<=length(line); i++) {
      print c2p[substr(line,i,1)];
    }
    print LF;
  }
}'
```

エンコードする必要のない文字（英数字や一部の記号）はそのまま流すようにしてある。

尚、データの与え方はデコーダーと同じ。
HomebrewでOpenLDAPをインストールする


ActiveDirectoryでユーザ認証するアプリを作りたくて、開発環境として手元にOpenLDAPをインストールしてみたらちょっと大変だったので作業メモ。

# 環境と関連リンク

* MacOSX 10.10.1 (Yosemite)

* https://github.com/IntersectAustralia/acdata/wiki/Setting-up-OpenLDAP

* https://github.com/Homebrew/homebrew-dupes/blob/master/openldap.rb

# インストール

```
% brew info openldap
openldap: stable 2.4.39
http://www.openldap.org/software/
/usr/local/Cellar/openldap/2.4.39 (131 files, 7.4M) *
  Built from source with: --with-berkeley-db
From: https://github.com/homebrew/homebrew-dupes/blob/master/openldap.rb
==> Dependencies
Required: openssl ✔
Optional: berkeley-db ✔
==> Options
--with-berkeley-db
        Build with berkeley-db support
--with-memberof
        Include memberof overlay
--with-sssvlv
        Enable server side sorting and virtual list view
```

```
% brew install homebrew/dupes/openldap --with-berkeley-db
```

## symlinkを作る

`slapd` は `libexec` にいるのが普通っぽいので、Homebrewの流儀に従ってディレクトリとsymlinkを作っておく。

```
% mkdir /usr/local/libexec 
% ln -s /usr/local/Cellar/openldap/2.4.39/libexec/slapd /usr/local/libexec
```

## 設定

OpenLDAPがインストールされるのはここ。

```
/usr/local/etc/openldap
```

### `slapd.conf`

#### `rootpw`

管理者パスワードを `slappasswd` で作成し、`slapd.conf` に書いておく。

```
% slappasswd
New password:
Re-enter new password:
{SSHA}+*******************************
```

#### `sufffix` , `rootdn`

手元で動かす用の設定をしておく。

* suffix
 * `dc=localhost`
* rootdn
 * `cn=admin,dc=localhost`

#### `slapd.conf`

最終的にこういう修正になる。

```slap.conf
suffix		"dc=localhost"
rootdn		"cn=admin,dc=localhost"
rootpw		{SSHA}+*******************************
```

### `DB_CONFIG`

`slapd.conf` には `directory	/usr/local/var/openldap-data` の指定がある。データディレクトリはここになる。

`DB_CONFIG.example` は `/usr/local/etc/openldap` にあるものと同一なのでrenameして使う。

```
% mv /usr/local/var/openldap-data/DB_CONFIG.example /usr/local/var/openldap-data/DB_CONFIG         
```

### id2entry.bdb

`openldap-data/` に `id2entry.bdb` が存在しないと `slapd` がスタートしない。

```
% slaptest
54701b7c bdb_db_open: database "dc=localhost": db_open(/usr/local/var/openldap-data/id2entry.bdb) failed: No such file or directory (2).
54701b7c backend_startup_one (type=bdb, suffix="dc=localhost"): bi_db_open failed! (2)
slap_startup failed (test would succeed using the -u switch)
```

同梱の `*.ldif` を `slapadd` してやると作成される。

```
% slapadd -l /usr/local/etc/openldap/schema/core.ldif
```

* before

```
% ls -1
DB_CONFIG                           
__db.001
__db.002
__db.003
alock
```

* after

```
% ls -1 
DB_CONFIG
__db.001
__db.002
__db.003
alock
dn2id.bdb
id2entry.bdb
log.0000000001
```

参考になりました :sushi:
http://hryksbt.b.sourceforge.jp/archives/421

## 起動

`slaptest` でOKが出たら起動する。

```
% slaptest
54701c89 bdb_monitor_db_open: monitoring disabled; configure monitor database to enable
config file testing succeeded
```

`monitoring disabled;` はとりあえず気にしなくてよい。

```
% sudo /usr/local/libexec/slapd
```

やったね！

# おまけ

一気に実行するスクリプトを書いた。この先ユーザ作ったりするので、進捗があったら追加していくよてい。

https://github.com/kwappa/ldap_toolkit
RubyMineで覚えておきたい、たったひとつのショートカットキー 


## はじめに
「最近RubyMineを使い始めたのですが、まだ全然使いこなせてなくて...」という方とお話する機会がありました。
どれくらいで使いこなせているか、そうでないかというのは正直よくわからない話ですが、「まずはこれだけ覚えておけばいいんじゃないかな？」というショートカットキーがひとつあったので、共有してみようと思います。


## 環境情報
MacOS Version : 10.9
RubyMine Version : 7.0 (and 6.x)
KeyMaps : Mac OSX 10.5+



## "アクションを探す" アクション

RubyMineで真っ先に覚えておきたいショートカットキーがひとつあります。
それは "Find Action" という RubyMineの "アクションを探す" アクションです。


| ショートカットキー | 効果 | ショートカット名|
|:-----------|:------------|:------------|
| command + shift + a | アクションを探す | Help > Find Acton... |


コード編集ビューでショートカットキーを実行するとキーワードを入力するウィンドウが表示されます。

![RubyMine.png](https://qiita-image-store.s3.amazonaws.com/0/11074/cc6d34dd-1725-956c-82db-e4088dd7a792.png "RubyMine.png")

たとえば Rails Consoleを実行したい場合は "console" とタイプしてみましょう。"console"に関係するアクションが表示されるので選択してEnterを押せば実行できます。
![RubyMine.png](https://qiita-image-store.s3.amazonaws.com/0/11074/3c7fd920-74fa-2f67-5249-c382291cac53.png "RubyMine.png")


Refactor関連のアクションを探したい時は "refa"くらいまで入力すればだいたい絞りこまれて表示されます。

このショートカットキーを実行すればメニューから探すよりは断然早くアクションを実行できます。さらに「いつもならショートカットキーを覚えているのにど忘れしたなぁ...」という場合でもある程度アクションの名前を覚えていれば探すことができます(アクションは英語名ですが、だいたい直感的に探せると思います)。


## ほかのショートカットキーは自分がよく探しているアクションから徐々に覚えていく
さらに「このアクション毎回探しているなぁー」と思ったらアクション名の右に表示されているショートカットキーを覚えておけば、次回からは探さずに直接ショートカットで呼び出せます。
たとえば Refactorアクショングループの Renameを呼びたしたいなら (Renameしたい箇所にカーソルをあわせて) "command + F6" で実行できるということです。

 # アクション名の右にショートカットキーが表示されていないものはショートカットキーの紐付けがない状態ですので、カスタマイズしたい場合は設定(Preference > Keymap)で登録する必要があります。

![RubyMine.png](https://qiita-image-store.s3.amazonaws.com/0/11074/e968ad70-671d-72a7-83ca-907a50d407bd.png "RubyMine.png")


## たとえばメソッド抽出リファクタリングしたい場合はこんな感じ


1. 対象のコードを選択します。　　　　　　　　　　　　　　　　　　　　
![RubyMine.png](https://qiita-image-store.s3.amazonaws.com/0/11074/04e7fe0c-1aa3-aeae-8303-f4f1590c23a6.png "RubyMine.png")

1. command + shift + a で Find Actionを実行して "refa"と入力
![RubyMine.png](https://qiita-image-store.s3.amazonaws.com/0/11074/0b9b03a8-6406-7442-bc1f-0cba6da3f12a.png "RubyMine.png")

1. Refactor this...を選択するとリファクタリングアクション選択できるので Methodを選択する
![RubyMine.png](https://qiita-image-store.s3.amazonaws.com/0/11074/934a14fd-b648-e9c4-dc5b-136c3e874ad6.png "RubyMine.png")

1. 新しいメソッド名を入力すると...
![RubyMine.png](https://qiita-image-store.s3.amazonaws.com/0/11074/2f852536-d8b2-0673-e8d4-141e7138f619.png "RubyMine.png")

1. メソッド抽出してくれる!!!
![RubyMine.png](https://qiita-image-store.s3.amazonaws.com/0/11074/27839ff5-dd51-4376-fea2-96e80237aead.png "RubyMine.png")


もちろんメソッド抽出リファクタリングのショートカットキー "command + option + M" を使えば 2. 3. のステップは省略できます。

## まとめ
まずはたったひとつのショートカットキーを覚えて 快適なRubyMine Lifeをスタートさせましょう。
よい RubyMine Lifeを !!


## ちなみに
ちなみにFind Actionアクションをメニューから探す場合はココにあります :p
![Help_と_Menubar.png](https://qiita-image-store.s3.amazonaws.com/0/11074/967c64d9-4ce0-4b75-929b-1e0262552b86.png "Help_と_Menubar.png")
R のラムダ式でプレースホルダを使えるようにする #rstatsj

※この記事をもとにパッケージを作成しました
[R にラムダ式を導入するパッケージ lambdaR を作った](http://d.hatena.ne.jp/hoxo_m/20141204/p1)

前回、R にラムダ式を導入するという話をしました。

- [R にラムダ式を導入する](http://qiita.com/hoxo_m/items/b095191db069c43ec1f1)

これにより、R でも次のようにラムダ式を使った書き方ができるようになりました。

```r:R
library(dplyr)
1:10 %>% Filter_(x: x %% 2 == 0) %>% Map_(x: x**2) %>% Reduce_(x,y: x+y)
```

ところで、Scala のラムダ式ではプレースホルダというものが使えます。
例えば、次のようなコードがあったとします。

```scala:Scala
(1 to 10).filter(x => x % 2 == 0)
```

```scala:結果
Vector(2, 4, 6, 8, 10)
```

実際に Scala でプログラミングする際には、このような場合にラムダ式をこういう書き方はしません。
なぜなら、プレースホルダを使って次のように簡潔に書けるからです。

```scala:Scala
(1 to 10).filter(_ % 2 == 0)
```

この `_` をプレースホルダと言って、受け取った変数がここに代入される感じで使えるという非常に便利な機能です。

これを R でも使えるようにできないでしょうか？
というわけで、前回の `lambda()` 関数を次のように書き換えてみました。

```r:R
lambda <- function(..., envir = parent.frame()) {
  if(!require(stringr)) stop("Please install.packages('stringr')")
  if(!require(lazyeval)) stop("Please install.packages('lazyeval')")
  args <- lazyeval::lazy_dots(...)
  args_len <- length(args)
  args <- Map(function(x) x$expr, args)
  vars <- unlist(Map(function(x) deparse(x), args[-length(args)]))
  expr <- as.character(args[length(args)])
  if(args_len == 0) {
    function() {}
  } else if(args_len == 1 && !stringr::str_detect(expr, ":")) {
    if(stringr::str_detect(expr, "\\._")) {
      var_count <- stringr::str_count(expr, "\\._")
      vars <- paste0("x", seq_len(var_count))
      expr <- Reduce(function(expr,var) stringr::str_replace(expr, "\\._", var), vars, expr)
      vars_str = paste0(vars, collapse=",")
      func_str <- sprintf("function(%s) %s", vars_str, expr)
      eval(parse(text=func_str), envir = envir)
    } else {
      func <- eval(args[[1]], envir = envir)
      if(is.function(func)) {
        func
      } else {
        func_str <- sprintf("function() %s", expr)
        eval(parse(text=func_str), envir = envir)
      }
    }
  } else {
    expr <- stringr::str_split(expr, ":")[[1]]
    var <- expr[1]
    expr <- paste0(expr[-1], collapse=":")
    vars <- ifelse(is.null(vars), 
                   var, 
                   paste(paste(vars, collapse=","), var, sep=","))
    fun_str <- sprintf("function(%s) %s", vars, expr)
    eval(parse(text=fun_str), envir = envir)
  }
}
```

これを使えば、ラムダ式でプレースホルダとして `._` が使えるようになります。

```r:R
lambda(._ + 1)
lambda(._ + ._)
```

```r:結果
function(x1) x1 + 1
function(x1,x2) x1 + x2
```

これで、冒頭に紹介したコードは次のように書けるようになりました。

```r:R
1:10 %>% Filter_(._ %% 2 == 0) %>% Map_(._ ** 2) %>% Reduce_(._ + ._)
```

気持ちいいー！

3つの書き方を比較してみましょう。

```r:R
library(dplyr)
# 無名関数
1:10 %>% Filter(function(x) x %% 2 == 0, .) %>% Map(function(x) x ** 2, .) %>% Reduce(function(x,y) x + y, .)
# ラムダ式
1:10 %>% Filter_(x: x %% 2 == 0) %>% Map_(x: x ** 2) %>% Reduce_(x,y: x + y)
# プレースホルダ
1:10 %>% Filter_(._ %% 2 == 0) %>% Map_(._ ** 2) %>% Reduce_(._ + ._)
```

やはりプレースホルダがあると便利ですね！

### 追記

こういう書き方もできます。

```r:R
is_even <- lambda(._ %% 2 == 0)
square <- lambda(._ ** 2)
add <- lambda(._ + ._)
1:10 %>% Filter_(is_even) %>% Map_(square) %>% Reduce_(add)
```

```:結果
 220
```
Rubymotion × Parse.comでPush通知が上手くいかない時の解決法


基本的にはXcodeでやっている時と同じ。

[iosでpush通知を使う手順［parseに登録/push通知の音を設定etc..］【初心者向け】](http://qiita.com/moriyaman/items/6d5aa1f3de0a3e742a5c)

が、何回やっても上手くいかない。
push通知を許可するかどうかのnotificationまでは出せるのに、Parse側ではdeviceを検知してくれない。。。

いろいろググっているとこRakefileに設定をかかないといけないらしい。


###before
```
 app.name = 'HogeApp'
 app.identifier = 'com.atrae'
 app.provisioning_profile = ''
```

###after
```
 app.name = 'HogeApp'
 app.identifier = 'com.atrae'
 app.provisioning_profile = ''
 app.entitlements['aps-environment'] = 'development' # 開発中なので
 app.entitlements['get-task-allow'] = true     
```

でget-task-allowってなんだよって[ドキュメント](http://www.rubymotion.com/developer-center/guides/project-management/)みてみると、

```
Motion::Project::App.setup do |app|
  # ...
  app.development do
    # This entitlement is required during development but must not be used for release.
    app.entitlements['get-task-allow'] = true
  end
end
      
```

開発する間はtrueで設定しておく必要があるのか。。。
Blue Tooth Low Energy モジュール BLE112 の breakout基板 REBLE112FR を Mac でシリアルデバッグする


#はじめに
REBLE112FRの開発環境としてシリアルデバッグ環境の用意についての自分のための備忘録です。この拙いレポートがどなたかのご参考になることがあれば望外の喜びです

#登場人物の説明
Bluegiga 社製の Blue Tooth Low Enegy (BLE) モジュール [BLE112](https://www.bluegiga.com/en-US/products/bluetooth-4.0-modules/ble112-bluetooth--smart-module/)はサービスの定義は XML で、ロジックをbgscript という Basic ライクな言語で書けるので手軽です。

BLE112 の BreakOut Board は [Jeff Rowberg](http://www.inmojo.com/store/jeff-rowberg/item/ble112-bluetooth-low-energy-breakout/)さんのとかいろいろありますが、Running Electronics さんの [REBLE112FR](http://www.runele.com/ca1/23/)も比較的安価で、バッテリーフォルダーも実装されてて便利です。

[TTL-232R-3V3](http://akizukidenshi.com/catalog/g/gM-05840/) は、3.3V系のTTLをUSBと変換してくれる万能ケーブルで、これ一本で [Mac から Raspberry Pi を制御したり](http://foldrr.hatenablog.com/entry/2013/10/13/202044)と大変便利です。同様のモジュールに aitendo の[USB-TTL2303-5P](http://www.aitendo.com/product/7298)とかがあります。

#接続方法
## REBLE112RF のピン配列
まず、BLE112 の usart のピン配列は[こちら](https://bluegiga.zendesk.com/entries/23142196-BLE112-USART-UART-and-SPI-configuration)になります。ALT1かALT2かでピンがちがいますので、hardware.xml の usart 要素を確認します

```xml:例：hardware.xml
    <usart channel="1" alternate="1" baud="115200" endpoint="none" flow="false" />
```
上の例では channel=1, altername=1 (ついでにボーレートは115200です。この値はあとで Mac と接続するさいに利用します)
ですので、ピンは以下になります
P0-5 RX
P0-4 TX
P0-3 RT
P0-2 CT

BLE112のピンはREBLE112RF では[このように](http://thumb.fc2.com/120x120/cache.cart-imgs/user_img/runningele/38fce71f0c0010d9435155db0fdc5b9b.jpg) 2.54mmピッチのスルーホールに実装されているのでICクリップで繋ぎます

##TTL-232R-3V3 のピン配列
[TTL-232R-3V3](http://akizukidenshi.com/catalog/g/gM-05840/)にある通り、このような[ピン配列](http://akizukidenshi.com/download/img/ttl-232r_pin.jpg)になっています。

##REBLE112FR と TTL-232R-3V3 との接続
REBLE112FRとTTL-232R-3V3 をクロス結合します。つまりお互いのRXとTXを、RTとCTを繋ぎます。ここで TTL-232R-3V3 のGND と 5Vはどこにも繋ぎません。続けて説明しますが REBLE112FRには CC Debugger 経由で USB から給電します
ls
## REBLE112FR への給電
REBLE112FR で Serial デバッグをする際、CC Debugger を介して 給電します。CC Debugger と繋がっていれば REBLE112FR のスイッチは on/off どちらであっても給電されているようです。

## TTL-232R-3V3 と Mac との接続
後は[こちら](http://foldrr.hatenablog.com/entry/2013/10/13/202044)で Raspberry Pi と繋げているのとほぼ同じで
1. TTL-232R-3V3 を USB で Mac に繋ぐ
2. ターミナルを開く
3. ls /dev/tty.usb* で、tty のデバイス名を調べる。以下、tty.usbserial-FTGCT1MXだったとして
4. screen /dev/tty.usbserial-FTGCT1MX 115200
5. 終了は CNTL+a CNTL+¥

これで通信開始です。bgscript で以下のように書いた内容が Mac のターミナルに出力されます

```bgscript:例
    call system_endpoint_tx(system_endpoint_uart1, 13, "Scanning...\r\n")
```

# 参考完成写真
![2014-11-22 12.21.33.png](https://qiita-image-store.s3.amazonaws.com/0/46544/84e0c719-311a-dbe3-ee43-47c8f597e92d.png "2014-11-22 12.21.33.png")


ケーブルがごちゃごちゃしてて全然参考になってない気が...
SwiftでNSUIntegerをIntにキャストする

基本的なことだとは思いますが、少しハマったのでメモ。

```swift
// Realmのメソッド
let resuls: RLMResults = Book.allObjects()
let int = Int(bitPattern: results.count)
```

Objective-CのライブラリなんかをSwiftで使うとたまに使う場面が出てくるんじゃないでしょうか。
返り値がNSUIntegerだとSwiftでIntにキャストしようとしても`'UInt' is not convertible to 'Int'`とエラーが発生してキャストできません。
(SwiftではNSUIntegerはUIntとなるのかな？)

```swift
let int = results.count as Int
// 'UInt' is not convertible to 'Int'
```

Int(bitPattern:)を使うことでIntへのキャストが可能です。
psvn.elで空白を含むユーザ名に対処する

githubのおかげもあり、オープンソースの世界ではソフト開発のバージョン管理にはgitがメジャーになっていますが、会社などのクローズな環境での開発では、まだまだsubversionが使われていると思います。Emacsのsubversionフロントエンドと言えば、長年愛用しているのが[psvn.el](http://www.xsteve.at/prg/emacs)ですが、(個人的に) 一番困るのが空白を含むユーザ名 (svn:author) を正しく扱えないこと。psvn.elのFAQにも一番最初に書いてあるくらいなので、多分困っているのは私だけではないはず...

そのFAQの通り一応対処法は用意してあって、_svn-user-names-including-blanks_ に空白を含むユーザ名を列挙して _svn-pre-parse-status-hook_ に設定すれば回避できます。ただ、この方法だとユーザ名ごとにいちいち追加していかなければならず、メンバーが多い場合には非常に面倒です。そこで、ある程度は自動的に判断して回避できるように、psvn.elを弄ってみました。

psvn.elは `svn status -v` の出力を取り込んでいるので、そのフォーマットを確認してみました。

```
              1234     1234 alpha22jp    file1.txt
              1234     1212 Nanashino Gonbei file2.txt
              1234      689 Ai Ueo       file3.txt
```

のように、ユーザ名のcolumnは12文字分が確保されていて、その後空白1つを挟んでファイルパスのcolumnになります。ユーザ名が12文字より短い場合は空白で埋められ、長い場合はその分ファイルパスのcolumnが後ろにずらされます。つまり、ユーザ名のcolumnの先頭から12文字分の間に '文字' '空白' '文字' のパターンがあれば、それはユーザ名の中の空白と判断してよいと言えます。ということで `svn status -v` の結果を処理する _svn-parse-status-result_ 関数に以下のようなコードを入れることで、うまく対応できました。

```el:psvn.el
          (let (line limit)
            (setq limit (svn-point-at-eol))
            (setq line (buffer-substring-no-properties (point) limit))
            (when (> (length (split-string line)) 4)
              (save-excursion
                (when
                    (re-search-forward "\\([-?]\\|[0-9]+\\) +\\([-?]\\|[0-9]+\\)" limit t)
                  ;; length of author column is at least 12 chars
                  (setq limit (+ (point) 12))
                  (while (re-search-forward "\\(\\w\\) \\(\\w\\)" limit t)
                    (replace-match "\\1.\\2"))))))
```

もちろん、これで対処しきれないケースもありますが、名字と名前の間の空白という典型的なケースは殆ど大丈夫なので、それから漏れるものは個別に _svn-user-names-including-blanks_ に登録するという運用で問題ないでしょう。

上記変更を入れたpsvn.elは、[こちら](https://github.com/alpha22jp/psvn)に上げてあるのでご利用下さい。EmacsWikiにある[subversion 1.7以降への対応パッチ](http://www.emacswiki.org/emacs/psvn.el.patch)も当ててあります。
Fedora Atomic でも Cockpit を使ってみました

[Atomic HostのCockpitを使ってDockerコンテナを操作 - tsunokawaのはてなダイアリー](http://tsunokawa.hatenablog.com/entry/2014/11/19/144017)
というエントリーを読ませて頂いて、Fedora Atomic でも試してみました。

```rb:Vagrantfile
VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.define "fedora-atomic"

  config.vm.hostname = "fedora-atomic"

  config.vm.box = "yungsang/fedora-atomic"

  config.vm.box_version = ">= 1.4.0"

  config.vm.network :forwarded_port, guest: 9090, host: 9090
end
```

```bash
$ vagrant up
$ open http://localhost:9090/
```

オレオレ認証をくぐるとログイン画面が表示されます。

![cockpit.png](https://qiita-image-store.s3.amazonaws.com/0/1932/33a2489f-4f92-733b-c894-c3e27e55f602.png)


| User name | Password |
|-----------|----------|
| root      | vagrant  |
| vagrant   | vagrant  |

`vagrant` でもログイン出来ますが、操作出来る内容が制限されます。
<del>上記のエントリーにも書いてありましたが、`root` でないと Docker の操作も出来ません。</del>

あとは上記エントリーと同様に Web UI が使えます。
フールプルーフプログラミング

#フールプルーフとは
どんな操作ミスをしても安全が損なわれず危険な事態を避けるような設計である。
ただしこれはユーザが守られるのであって開発者は守られない。
フールプルーフをプログラミングに導入し開発者の安全を守るための方法を考える。

#開発者のリスクは何か
ここで言うリスクは訴訟リスク、損害賠償リスクである。賠償せねばならないようなバグは発生させてはいけない。
また、強いクレームが来る様なバグも避けなければならない。
しかしバグは無くせない。ならばどうすればいいか？

#バグの隠蔽
ユーザが見るのは結果である。内部構造は関係ないので計算結果の表示段階で正当性をチェックし表示する。
文字列であれば、文字化けは絶対避けねばならないし、数値なら範囲チェックが必要である。
ユーザがそれがソフトの異常どころか品質に疑問を抱くような表示は絶対に避けるべきである。
内部構造がどんなにバグっていても表示段階で空文字や0にでも置き換えれば最悪の事態は避けられる。
ユーザに簡単なミスと誤認識させることが出来ればリスクは下がる。
例外やら何やらが表示されるような状態は問題外である。

#表示を先行させる
ユーザの目に付く表示部が重要であるため、先に表示部を作り内部構造なんて捨てて入力と出力が繋がる状態を実現した方がよい。
先に内部構造を作った所で表示部分が無いなら単体テストもやりにくいし、バグを発見しにくいこともある。

#ファジーな設計
ファジーと言う言葉が死語になって久しいが、プログラムはファジーである方がよい。
ごちゃごちゃした設定が必要なんて時間の無駄である。
デフォルトでなんかよさげな表示をするように設計しておくと、後半は凄く楽である。
何もしなくてもよさげな結果が出せるプログラムこそ求めるものである。
そして、良くない結果に対して蓋をして見せないようにするのである。

#操作制限
ここがホントのフールプルーフだが、実際は未定義状態であることが多い。
そのため、入力制限をどうするかを事前に文書化しておかないと1円60万株とか困ったことになる。
あれは取り消しが出来ないことが問題だったけど、入力自体をどうにか制限すべきだったろう。
最悪の事態に対してどうするかを協議して決めておくしかリスクを回避する方法は無い。

#フールプルーフプログラミング
バグの隠蔽やファジーな設計でリスクの無いプログラミングをしよう。
DOSバッチでよく使うメモ

#Intro
DOSバッチ書く際によく使うものたちの自分用メモです
DOSは覚えられません。
随時更新します

#メモ

####エコーオフ
```bat
@echo off
```

####変数遅延展開
FORやIFなど条件ブロックで変数使うときに利用します

```bat
set enabledelayedexpansion

rem 変数を条件,ブロックで使うときは%hoge%でなく!hoge!にする
```

####バッチパラメータ(引数のパスとか)のまとめ
```bat
rem 実行バッチそのもの
%0

rem 第一引数そのもの
%1

rem #####以下第一引数(%1)を例に記載#####

rem "とかを外して展開
%~1

rem ドライブ名
%~d1

rem ディレクトリ名のみ
%~p1

rem ファイル名(拡張子なし)
%~n1

rem ディレクトリまでのフルパス
%~dp1

rem 拡張子のみ
%~x1
```

####batを実行するディレクトリに移動
```bat
cd %~dp0
```

####日付取得系
```bat
set dt=%date%
rem 年
set year=%dt:~-10,4%
rem 月
set month=%dt:~-5,2%
rem 日
set day=%dt:~-2,2%
rem 一発
echo %date:~-10,4%%date:~-5,2%%date:~-2,2%
```

####時間取得系
```bat
rem 先頭を0埋めする(時間が一桁台の場合)
set timetmp=%time: =0%
rem 時間
set hour=%timetmp:~0,2%
rem 分
set minites=%timetmp:~3,2%
rem 秒
set sec=%timetmp:~6,2%
```

####配下のファイルリスト表示(ディレクトリ付き)
```bat
dir /s /b /a-d 

rem csvとsqlを探す
dir *.sql *.csv /s/ b/ /a-d
```

####標準出力とエラーをログに書き出す
```bat
hoge.bat > hoge.log 2>&1
```

####簡単な実行正否の判断
```bat
rem 処理が失敗(実行コード0以外のとき)に処理をする
del none.txt || echo failed

rem 処理が成功(実行コード0のとき)に処理をする
del exists.txt && echo success
```
【メモ】クラスのプライベート変数を作ったつもりが

ただの失敗談です


```js

var Hoge = (function(){

  /**
   * @private
   */
  var _foo = 0;

  /**
   * @constructor
   */
  function Hoge(){
    this.foo = _foo++;
  }
  
  return Hoge;
}());

```

というコード。
実際に外からアクセスできない、という意味で変数`_foo`はプライベート変数です。

```js

new Hoge; // this.foo: 0
new Hoge; // this.foo: 1
new Hoge; // this.foo: 2

```

最近他の言語を書いていませんが、たいていの言語の場合は`this.foo`は全て0ではないでしょうか？

クロージャの仕様からくるものだと思うのですが、結構気づくまで時間がかかりました。
まさか各インスタンス、同じ変数参照しにいってたとは…。

外からアクセスはさせたくない、けど複数インスタンスから参照したい変数を書く場合は、気をつけないといけないですね。


---


追記：

実はこういうことやっていた時に「あれ？」ってなって、一部切り抜いて、
こちらにメモ書きした次第です。
ちなみにこちらは違う方法で解決いたしました。

http://jsdo.it/ryokio0129/iVc5j

@LightSpeedC さん、@think49 さん、ありがとうございます。
時に @LightSpeedC さんには以前、恐れ多くも私の記事を見てのあの記事をお書きになり、
「おおおお…っ（尊敬）」な眼差しで読んでいたのですが、身になっておらずスミマセン…orz

ともあれ、また色々と試してみます。
メモ書きに対して色々お言葉をいただけて本当ありがとうございます。

---

追記2：

1年も前に既にそういう記事がQiitaにありました…orz

http://qiita.com/opengl-8080/items/11866b120b6a95d60257

というかオライリーの本にも書いてあったんですね…orz
PhantomJSでunderscore.jsを利用する

includeJsかなーと思ったら違いました・・・

```coffeescript:hello_underscore.coffee
_ = require("./underscore-min.js")

a = [1,2,3,4,5]
_.each( a , (v) ->
	console.log "hello #{v}"
)

tmpl = _.template("""
<% for (x in ary) { %>	<td><%= x %></td>\
<% } %>
""")

console.log tmpl(ary:a)

phantom.exit()
/*
hello 1
hello 2
hello 3
hello 4
hello 5
	<td>0</td>
	<td>1</td>
	<td>2</td>
	<td>3</td>
	<td>4</td>
*/

```