OmniAICreator/Qiita-1.07M huggingface dataset:
ObjC to Swift : [[NSViewController alloc] init]


Objective-C

```Objective-C
ViewController * viewController = [[ViewController alloc] init];
```

```ViewController.m
- (id) init
{
	self = [super initWithNibName: @"nibName"
                           bundle: nil];
	return self;
}

```

Swift

```Swift
let viewController = ViewController()
```

```ViewController.swift
override init!( nibName nibNameOrNil: String?,
               bundle nibBundleOrNil: NSBundle? )
{
    super.init( nibName: nibNameOrNil,
                 bundle: nibBundleOrNil )
}

convenience init()
{
    self.init( nibName: "nibName",
                bundle: nil )
}

required init?( coder: NSCoder )
{
	fatalError( "not implemented" )
}

```
ObjC to Swift : Using NSString function in Swift String


Objective-C

```Objective-C
NSString * string = [[NSString alloc] initWithData : data
                                          encoding : NSUTF8StringEncoding];
```

Swift

```Swift
var string: String?		// below method may return nil
string = ( NSString( data: data, encoding: NSUTF8StringEncoding ) as! String )
```
複数のCSVをnode.jsでまとめてパースして一つにして出力する

Googleさんのモバイルフレンドリーアップデートで検索順位の推移をWebmaster Toolsから日別で取得してきたんだけど、推移を見るためにvlookupをコピペしまくるのが面倒だったのでnode.jsの勉強もかねて実装。

``` sh:実行方法
node convert.js output.csv // 出力先は指定しないとconvined.csvに
```

各csvにキー（この場合はdate）を付与してパース、読み込み終了をpromiseで取得してconbinedに収納されたjsonのリストをごにょごにょして、klist経由でアウトプットファイルに出力。

CSVファイルの入出力とタスク制御までできたのでPromiseの中身を書き換えれば、いろんな集計の下準備の雛形的に使える……といいな。

入力ファイルは[Google Webmaster Tools](https://www.google.com/webmasters/tools/home?hl=ja&pli=1)の"検索トラフィック">"検索クエリ"で日付を１日ずつにしてCSVにアウトプット。

文字コードはutf-8のままなので、エクセルで読み込むには文字コードをshift-jisに変換する必要あり。ファイルリストもコマンドラインで渡せるようにしようぜ…と思いつつ未実装。

``` json:package.json
{
  "devDependencies": {
    "csv-parse": "^0.1.1",
    "json2csv": "^2.2.1",
    "lodash": "^3.7.0"
  }
}
```

``` javascript:convert.js
(function() {
  "use strict";

  require('events').EventEmitter.prototype._maxListeners = 100;
  
  var fs = require('fs');
  var _ = require('lodash');
  var parse = require('csv-parse');
  var json2csv = require('json2csv');

  var conbined = [];

  var dist = process.argv[2] || "conbined.csv";
  var files = [
    {'file': './your-site-name_20150505T000000Z_TopSearchQueries_20150414-20150414.csv', 'date': '20140414'},
    {'file': './your-site-name_20150505T000000Z_TopSearchQueries_20150421-20150421.csv', 'date': '20140421'},
    {'file': './your-site-name_20150505T000000Z_TopSearchQueries_20150428-20150428.csv', 'date': '20140428'}
  ];

  var tasks = _.map(files, function(file) {
    // make tasks from list of files to parse csv
    return new Promise(function(resolve, reject) {

      var output = [];

      var parser = parse({}, function(err, data) {
        var fr = data.shift();
        data = _.map(data, function(arr) {
          return _.object(fr, arr);
        });
        output.push(data);
      });

      var s = fs.createReadStream(file.file);
      var p =  s.pipe(parser);
      p.on('end', function() {

        output = _.map(output[0], function(obj) {
          obj.date = file.date;
          return obj;
        });
        conbined.push(output);
        resolve();
      });
    });
  });

  Promise.all(tasks).then(function(x) {
    var klist = [];
    conbined = _.flatten(conbined);

    // use conbined and output to klist
    conbined = _.map(conbined, function(obj) {
      var date = obj.date;
      var ret = {};
      ret["検索キーワード"] = obj["検索キーワード"];
      ret["表示回数-"+date] = obj["表示回数"];
      ret["クリック数-"+date] = obj["クリック数"];
      ret["CTR-"+date] = obj["CTR"];
      ret["平均掲載順位-"+date] = obj["平均掲載順位"];
      return ret;
    });

    conbined = _.groupBy(conbined, function(obj){
      return obj["検索キーワード"];
    });

    _.each(conbined, function(word) {
      var ret = {};
      _.each(word, function(col) {
        ret = _.extend(ret,col);
      });
      klist.push(ret);
    });

    // output to csv
    var keys = _.keys(klist[0]);
    console.log(keys);
    json2csv({data: klist, fields: keys}, function(err, csv) {
      if(err) {
        console.error(err);
      }
      fs.writeFile(dist, csv);
    });
  });

})();
```
ObjC to Swift : NSOrderedAscending, NSOrderedSame, NSOrderedDescending


Objective-C

```Objective-C
NSDate * pastDate;
NSDate * futureDate;

BOOL correctOrder = ( [futureDate compare: pastDate] == NSOrderedDescending );
```

Swift

```Swift
let pastDate: NSDate
let futureDate: NSDate

let correctOrder = ( futureDate.compare( pastDate ) == NSComparisonResult.OrderedDescending )

or

let correctOrder = ( futureDate.compare( pastDate ) == .OrderedDescending )
```
newusersコマンドを使ってお手軽に大量のアカウントを作成する方法

#newusersコマンドについて
Linux上で新規ユーザを追加する際には、通常はuseraddコマンドや、あるいは対話的にユーザを作成することができるadduserコマンドを用います。

しかし、大量のユーザを同時に作成する際にはこれらのコマンドをバッチ処理するようなスクリプトを記述しなければならず、手間がかかります。そのような場合にはユーザの新規作成や情報更新をバッチ処理で行うためのコマンド newusersを使ったほうが容易です。

>newusers  はユーザ名と平文パスワードとの組を記したファイルを読み、 その情報をもとに既存のユーザ情報の変更や新規ユーザの作成を行う。 このファイルの書式は、  下記の点を除き標準的なパスワードファイル (passwd(5) 参照)と同じである。
[Man page of NEWUSERS](http://linuxjm.sourceforge.jp/html/shadow/man8/newusers.8.html)

newusersに読ませるファイルの形式は/etc/passwdの書式に近く、

>ユーザ名:パスワード:ユーザID:グループID:フルネーム:ホームディレクトリ:ログインシェル

のようにユーザアカウントの様々な情報を":"で区切ったものです。
ユーザIDやグループIDが空欄となっている場合、それらは自動で設定されます。
実際に読み込ませるファイルの例を挙げればこのようになります。

>foo:passwd1::::/home/foo:/bin/bash
>hoo:passwd2::::/home/hoo:/bin/bash
...

ただし、useraddなどでは/etc/skelにあるホームディレクトリのひな形となるファイルを新規作成したホームディレクトリにコピーする機能があるのですが、それがnewusersではないため、それらのコピーが必要ならば他の方法で行う必要があります。
[一括ユーザ作成コマンド、newusers - satakesatakeの日記 - nextstageoneグループ](https://nextstageone.g.hatena.ne.jp/satakesatake/20101222/1293008090)

また、newusersは特に指定されなければパスワードの暗号化に/etc/login.defsで指定されているENCRYPT_METHODを用います。この値によってパスワードを保存する際に用いられる暗号化形式が決まるのですが、制限がなければこれをSHA256またはSHA512に変更することを強く薦めます。
\# DESとかだと、先頭8文字しか見なかったりします。

# 具体的な方法
例えば10個のアカウントを作るとなったときにどのようにするのがよいか、という一例です。
自分が行った作業のメモとして書いておきます。

1.表計算ソフトでアカウントのリストを作成する

|ユーザ名|パスワード|ユーザID|グループID|フルネーム|ホームディレクトリ|ログインシェル|
|:----------|:-----------|:----------|:-------|:-------|:-------|:-------|

上の表をコピーして表の一番上に貼り付けて、アカウントのリストを作成します。
パスワードは次で設定するため空欄にしておきます。

2.パスワードのリストを作成し貼り付ける
次に設定するパスワードのリストを作成します。
仮パスワードを設定し配布後に各自変更させるという方法を取ったため、ランダムなパスワードを設定しました。
[pwgen](http://pwgen-win.sourceforge.net/)コマンドを使用するのがお手軽でよいかと思います。

```bash
$ pwgen 8 10 -1 -B                     
aiKieju4
Jo7Ya9za
ooz4waD3
aatohXu4
Zahde7ee
pheQu3ae
ao4Thaim
aoPah7jo
Rei4ceiy
aiboh4iW
```

これをそのまま表に貼り付けます。
この表はアカウントを配布する際にも用いるため、慎重に保管し配布終了後速やかに削除しましょう。

3.CSVファイルで出力する
これをCSVファイルで出力し、一行目を削除し区切り文字を":"に変更すれば
すぐにnewusersで使える形式になります。

4.newusersコマンドを用いてユーザを追加する
使用したファイルにはパスワードが含まれているため取り扱いには注意しましょう。
activerecord-sqlite3-adapter のインストールについて

久しぶりに、Rubyを使ったらエラーが出てしまいました。

下記の記事にあるように、バージョンを下げてください。

Ruby 2.0 には問題があり sqlite3 は起動できない
1.9.3 では正常に動きます。

http://stackoverflow.com/questions/16512908/could-not-find-a-valid-gem-install-activerecord-sqlite3-adapter

1.9.3 のリンクは下記です。

https://s3.amazonaws.com/railsinstaller/Windows/railsinstaller-2.2.5.exe
AnsibleでDockerコンテナを起動するまでのPlaybook

# Playbookのすにぺっと
タイトルの通りのすにぺっと。pipのところがイマイチですが、ひとまずこれで通った。以下はVirtualBox上のVMをvagrant upした後に適用したもの。

* 対象ホスト：Ubuntu14.04
* Dockerをインストール
* Dockerイメージの起動

```sample.yml
---
- hosts: all

  vars:
    myuser: docker

  user: vagrant
  sudo: yes

  tasks:
  - name: Install python-pip
    apt: pkg=python-pip state=latest update_cache=yes

  - name: Install Docker
    shell: wget -qO- https://get.docker.com/ | sh  creates=/etc/default/docker

  - name: Add a docker user
    user: name={{myuser}} shell=/bin/bash password=$1$3FCsXQtq$EKWn6gqWXj6Gto9ogr.1s. groups=sudo,docker append=yes
  - name: Set a public key for docker user
    authorized_key: user={{myuser}} key="{{ lookup('file','./files/secret.key.pub') }}"

  - name: Upgrade pip
    command: /usr/bin/easy_install -U pip
  - name: install docker-py # 1.2.x has a bug
    pip: name=docker-py version=1.1.0

  - name: Run a phusion/baseimage container
    docker:
      name: test-container
      image: phusion/baseimage:latest
      pull: missing
      command: "/bin/bash"
      state: started
      tty: True
```

**ansible-playbook** の完了後、コンテナが起動した。

```
docker@vagrant-ubuntu-trusty-64:~$ docker ps
CONTAINER ID        IMAGE                      COMMAND             CREATED             STATUS              PORTS               NAMES
25b9a48b3568        phusion/baseimage:latest   "/bin/bash"         52 seconds ago      Up 51 seconds                           test-container
docker@vagrant-ubuntu-trusty-64:~$

docker@vagrant-ubuntu-trusty-64:~$ docker exec -it test-container bash
root@25b9a48b3568:/#
```

# 考察中

コンテナのビルドはDockerfileでやらせて（作っておいて）、AnsibleはRunだけさせるような感じがシンプルかな。コンテナに対してもAnsibleでプロビジョンするのもできなくないけど、わかりずらくそこはダルそう。できるだけ運用なんかシンプルな方がいい。

# 参考

* http://docs.ansible.com/docker_module.html
ObjC to Swift : [NSString length]


Objective-C

```Objective-C
NSString * someString = @"Some string";
NSUInteger length = someString.length;
```

Swift 2.0

```Swift
let swiftString = "Swift string type"
let length = swiftString.characters.count
```

Swift 1.2

```Swift
let swiftString = "Swift string type"
let length = count( swiftString )

let nsString: NSString = "NSString type"
let nsLength = nsString.length
```
ObjC to Swift : [NSString isEqualsToString:]


Objective-C

```Objective-C
NSString * stringA = @"String A";
NSString * stringB = @"String B";

BOOL isEqual = [stringA isEqualsToString: stringB];
```

Swift

```Swift
let stringA = "String A"
let stringB = "String B"

let isEqual = ( stringA == stringB )
```
Dockerコンテナのようなランダムに名前を生成する name コマンドを作った（？）

“Dockerコンテナのような"とタイトルには書いたが、まんまDockerで使われているLibraryをコマンド化しただけのもの。果たして、作ったと言っていいのか疑わしいレベル。

イマ作っているアプリケーションでランダムな名前ユーザのディレクトリを幾つか作る必要があった。Alice, Bob, Carol, Daveと作っていっても良かったんだけど、味気がない。Dockerコンテナはランダムに名前つけてたということを思い出したため、これを利用しようと思った。

結果として、[Dockerコンテナのおもしろい名前](http://deeeet.com/writing/2014/07/15/docker-container-name/)で書かれていることが全てで、フラグつけてラップしただけのコマンドである（もうすでにありそう）。

リポジトリは[GitHub: ringohub/name](https://github.com/ringohub/name)で公開してます。

## Install

`go get github.com/ringohub/name`

## Usage

```bash
$ name -h
Usage of name:
  -n=1: Number of generate names
$ name
jolly_kirch
$ name -n 5
sleepy_pare
tender_carson
kickass_bartik
happy_meitner
agitated_pike
```

## References

- [Dockerコンテナのおもしろい名前](http://deeeet.com/writing/2014/07/15/docker-container-name/)
- [docker/pkg/namesgenerator](https://github.com/docker/docker/tree/master/pkg/namesgenerator)
railsメモ

## プロジェクト
```bash
rails new testApp
cd testApp
bundle install
rake db:create
```

## モデル作成
```bash
rails g model Post title:string content:text
rake db:migrate
```

## コントローラ作成
```bash
rails g controller Posts
```


## 起動
rails s

## ファイル
- db/migrate/*.rb

## scaffold
```bash
rails g scaffold Piza memo:string eated_at:date
rake db:migrate
```

```bash
rails destroy scaffold Piza
```

## migration
```bash
rake db:reset  … drop,create,migrate
rake db:setup
rake db:migrate
rake db:create
rake db:migrate:reset … いろいろ消す
```

```bash
rails generate migration AddNameToEvents name:string
rake db:migrate
rake db:rollback
```

## ドキュメント
```bash
rake doc:app
```

## ルート確認
```bash
$ rake routes
   Prefix Verb   URI Pattern               Controller#Action
    users GET    /users(.:format)          users#index
          POST   /users(.:format)          users#create
 new_user GET    /users/new(.:format)      users#new
edit_user GET    /users/:id/edit(.:format) users#edit
     user GET    /users/:id(.:format)      users#show
          PATCH  /users/:id(.:format)      users#update
          PUT    /users/:id(.:format)      users#update
          DELETE /users/:id(.:format)      users#destroy
```
Git のサブモジュールってどんなもの？

いろんなサイトを見てもピンとこなかったので、検証して自分なりにまとめてみました。
間違いなどあればご指摘いただけるとありがたいです。

#サブモジュールとは？
**「特定のリポジトリ」**の**「特定のコミット」**をリポジトリ内の特定のディレクトリに紐付ける仕組みです。
そのため、以下のように普段のリポジトリ操作の挙動とは異なる点が多々あります。

* サブモジュール内は独立したリポジトリになっている。
* サブモジュールを更新するとバージョン管理外のファイルが全て消えてしまう。
* サブモジュール更新直後はブランチがない状態(no branch)になる。
* サブモジュールを追加したリポジトリ内でプッシュ、プルなどの操作を行っても、サブモジュールにはその操作が反映されない。

もしサブモジュールを扱うのであれば、これらの挙動の違いは把握しておく必要があります。

#TortoiseGit でサブモジュールを操作する
##サブモジュールを追加するには？
以下の手順でサブモジュールを追加できます。

0. 「右クリック > TortoiseGit > サブモジュールの追加」を選択します。
0. 「リポジトリ」には、サブモジュールとして追加したいリモートリポジトリのアドレスを、<br>
「パス」にはサブモジュールを入れるフォルダのパスを入力します。<br>
また、任意のブランチを指定したい場合は「ブランチ」にチェックを入れ、ブランチ名を入力します。<br>
<br>
入力が完了したら、「OK」を押します。
0. 先ほどの「パス」で指定したディレクトリと、.gitsubmodule というファイルが追加されるので、それらをコミット、プッシュします。

##サブモジュールを更新にするには？
サブモジュールを最新の状態にしたい場合、もしくはクローン直後でサブモジュールが空の場合は以下の手順でサブモジュールを更新します。

0. 「右クリック > TortoiseGit > サブモジュールのアップデート」を選択します。
0. 更新したいサブモジュールとオプションを選択して、「OK」を押します。<br>
その際、**「リモート追跡ブランチ」**のチェックのあり/なしでサブモジュールの中身が以下のように変化します。<br>
<br>
「チェックなし」：**サブモジュールを作った時のコミット**になる。<br>
「チェックあり」：**最新コミット**になる。<br>

更新後は no branch 状態になるので、サブモジュールのリモートリポジトリに対して操作を行いたい場合は任意のブランチに切り替える必要があります。

##クローン時にサブモジュールを更新するには？
クローンする際、「再帰的」にチェックを入れると、紐付けられているサブモジュールの更新をクローン処理中に行います。

ただし、ここで行われる更新は**「サブモジュールを作った時のコミットにする」**だけですので、最新コミットにしたい場合は別途サブモジュールの更新を行う必要があります。
##サブモジュールを削除するには？
TortoiseGit では削除ができないので、git と同じ手順で削除します。

0. .gitsubmodule から削除したいモジュールの情報を削除する。
0. .git/config から削除したいモジュールの情報を削除する。
0. コマンドラインや bash から **git rm --cache [サブモジュールのディレクトリパス]** を実行して、サブモジュールのディレクトリを削除し、コミット、プッシュする。

##サブモジュールのリポジトリに対して操作を行うには？
コミット、プル、プッシュ、ブランチの切り替えなど、普段行っているリポジトリ操作をサブモジュールのリポジトリに対して行うには、以下のようにします。

* サブモジュールフォルダを選択した状態で「右クリック > TortoiseGit」
* サブモジュールフォルダ以下の階層を開いた状態で「右クリック > TortoiseGit」

逆に、以下のリポジトリ操作を行っても、サブモジュールのリモートリポジトリには一切影響を与えません。

* サブモジュールフォルダ以外を選択している状態で「右クリック > TortoiseGit」
* サブモジュールフォルダ外の階層を開いた状態で「右クリック > TortoiseGit」

#参考サイト
* 6.6 Git のさまざまなツール - サブモジュール
http://qiita.com/ma2saka/items/4bd00ef6f8c240847807
<br>

* Git Submodules: コアコンセプト、ワークフロー、コツ
http://japan.blogs.atlassian.com/2013/07/git-submodules-workflows-tips/
<br>


* 自分が必要とする最低限の git submodule の知識
http://qiita.com/ma2saka/items/4bd00ef6f8c240847807
<br>


* git submodule 使い方
http://transitive.info/article/git/command/submodule/
Stateモナドを手で簡約してみたりしていた


「モナド則だけみつめていたい」をつくった時の没ネタです。

Stateモナドを簡約すると何がおきてるかわかりやすいかなと思ったけど説明できるほどわかりやすくならなかった。

とりあえず、Stateモナドの定義

```haskell
newtype State s a = State { runState :: (s -> (a,s)) } 
 
instance Monad (State s) where 
    return a        = State $ \s -> (a,s)
    (State x) >>= f = State $ \s -> let (v,s') = x s in runState (f v) s' 
```
    
    
とりあえず、モナド則

1. join . fmap join = join . join
2. join . fmap return = join . return = id
3. return . f = fmap f . return
4. join . fmap (fmap f) = fmap f . join


# return 1

State (\s1 -> (1, s1))

# return (return 1)

State (\s2 -> (return 1, s2))
State (\s2 -> (State (\s1 -> (1,s1)) ,s2))

# join (return (return 1))

(return (return 1)) >>= id
State (\s2 -> (State (\s1 -> (1,s1)) ,s2)) >>= id
State $ (\s3 -> let (v,s3') = (\s2 -> (State (\s1 -> (1,s1)) ,s2)) s3 in runState (id v) s3')
State $ (\s3 -> let (v,s3') = (State (\s1 -> (1,s1)), s3) in runState v s3')
State (\s3 -> runState ((State (\s1 -> (1,s1))) s3
State (\s2 -> (\s1 -> (1,s1)) s2)
State (\s2 -> (1, s2))


参考文献

* http://ja.wikibooks.org/wiki/Haskell/%E5%9C%8F%E8%AB%96#.E3.83.A2.E3.83.8A.E3.83.89.E5.89.87.E3.81.A8.E3.81.9D.E3.81.AE.E9.87.8D.E8.A6.81.E6.80.A7
* http://www.sampou.org/haskell/a-a-monads/html/statemonad.html
Xcodeでgithubのリポジトリにpushできない

Xcodeでgithubのリポジトリにpushできない
↓
pushすると
“origin/master” is not a valid remote branch to pull from. Please choose a different remote branch.
と怒られる
pullもできない。
↓
http://stackoverflow.com/questions/14452245/cant-push-pull-to-from-brand-new-repository-hooked-up-to-xcode
ありがたい記事
↓
リポジトリ新規作成時にREADMEを作らないで作成
↓
うまくいった
AWS S3 でリダイレクトの設定


S3 でホストしている静的 Web サイトのリニューアルを実施し、一部 URL が変更になりました。そこで、旧ページから新ページに 301 リダイレクトを設定したくなりました。

[AWS マネージメントコンソールの日本語対応](http://aws.typepad.com/aws_japan/2015/04/mgmt-console-japanese.html)がされたので手順は日本語で書きます。

S3 の Management Console のバケットの一覧から「静的ウェブサイトホスティング」を選択し、「リダイレクトルールを編集する」を押します。

![20150503112013.png](https://qiita-image-store.s3.amazonaws.com/0/19478/40affeb3-779e-8c59-dfdc-edc3987ee0c9.png "20150503112013.png")

そこで出てきたテキストエリアに、リダイレクトルールの XML を書いていきます。具体的には下記のように、設定したい数だけ `<RoutingRule>` 要素を増やしていくことになります。

```xml
<RoutingRules>
    <RoutingRule>
        <Condition>
            <KeyPrefixEquals>old-page-1.html</KeyPrefixEquals>
        </Condition>
        <Redirect>
            <ReplaceKeyPrefixWith>new-page-1/</ReplaceKeyPrefixWith>
            <HttpRedirectCode>301</HttpRedirectCode>
        </Redirect>
    </RoutingRule>
    <RoutingRule>
        <Condition>
            <KeyPrefixEquals>old-page-2.html</KeyPrefixEquals>
        </Condition>
        <Redirect>
            <ReplaceKeyPrefixWith>new-page-2/</ReplaceKeyPrefixWith>
            <HttpRedirectCode>301</HttpRedirectCode>
        </Redirect>
    </RoutingRule>
</RoutingRules>

```

今回の案件では [Middleman](https://middlemanapp.com/jp/) を使っていたので、 builder で生成させてみました。

```rb:routing-rules.xml.builder
mappings = {
  'old-page-1.html' => 'new-page-1/',
  'old-page-2.html' => 'new-page-2/',
}

xml.RoutingRules do |routing_rules|
  mappings.each do |from, to|
    routing_rules.RoutingRule do |routing_rule|
      routing_rule.Condition do |condition|
        condition.KeyPrefixEquals from
      end
      routing_rule.Redirect do |redirect|
        redirect.ReplaceKeyPrefixWith to
        redirect.HttpRedirectCode 301
      end
    end
  end
end
```


詳しくは下記に仕様があります。

- [バケットをウェブサイトホスティング用に設定 - Amazon Simple Storage Service](http://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/HowDoIWebsiteConfiguration.html)

賛否あるかとは思いますが、日本人のぼくにとって日本語で使えるツールやドキュメントが増えていくのは良いことですねー。
ファイル名一覧ファイルに記載された全ファイルをgrep

```text:list.txt
/abc/def/hogehoge.txt
/abc/def/fuga fuga.txt
```

```bash:コマンド
cat list.txt | while read line
do
  grep -n "keyword" "$line" /dev/null
done
```

- /dev/null はファイル名を表示するため。
- -n は行番号を表示するため。
- ファイルパス内にスペース等が含まれていることを考え、クォーテーションで囲む。
Ubuntu Makeについて

Ubuntu Makeについてまとめてみます。
#Ubuntu Makeとは
　Ubuntuでは、Ubuntu自体のリリースに合わせてパッケージが更新される場合がほとんどです。これは、新しいバージョンのUbuntuがリリースされるまでパッケージが更新されないということを意味し、最新の環境を求められることが多い開発環境においてはマイナスとなります。
　そこで、Ubuntuのパッケージ管理システムであるAPTとは独立した形で、最新の開発環境をインストール・管理するためのツールとしてできたのがUbuntu Makeです。
#Ubuntu Makeのインストール
* __【Ubuntu 14.10以前のバージョンのみ】__<br>以下のコマンドを入力し、PPAを追加します。

```
sudo add-apt-repository ppa:ubuntu-desktop/ubuntu-make
sudo apt update
```

* 以下のコマンドを入力し、Ubuntu Makeをインストールします。

```
sudo apt install ubuntu-make qemu-kvm
```
#Ubuntu Makeの使い方
　Ubuntu Makeのコマンド名は``umake``です。
　基本的に``umake {フレームワーク名} {オプション}``といった感じで指定します。フレームワークが開発環境の大雑把なくくり、オプションが具体的な開発環境、といった理解で良いかと思います。フレームワーク名やオプションについては、``umake --help``で確認してください。

#インストール
Visual Studio Codeをインストールする場合を例に取ると、次のようになります。

```
umake ide visual-studio-code
```

#アンインストール
末尾に`-r`オプションを付加します。
Visual Studio Codeをアンインストールする場合を例に取ると、次のようになります。

```
umake ide visual-studio-code -r
```

#参考文献
[第372回　Ubuntu Makeで簡単にAndroid開発環境を構築する：Ubuntu Weekly Recipe｜gihyo.jp … 技術評論社](http://gihyo.jp/admin/serial/01/ubuntu-recipe/0372)
pythonの組み込み関数iterとzipを組み合わせると

頭の体操にどうぞ。

以下を実行すると、

```
list = [0, 1, 2, 3]
iter_list = iter(list)
for i, j in zip(iter_list, iter_list):
    print(i, j)
```

答えは

```
0 1
2 3
```
技術英語 > [Easy] with that chair. > Be careful with that chair.

引用: オックスフォード現代英英辞典

> Easy with that chair-one of its legs is loose.

この場合、Easyは「not difficult」の意味でなく「be careful」になる。

装置の搬入などで作業者の一人が「Easy. Easy.」など言っているのが以前あった。この時は「？」であったが、「Be careful」の意味だったので納得。

Easilyの場合は「carefully」の意味にはならない。
secureCoding > 任意精度(bignum)演算 > メモリを必要に応じて動的に確保することで、値を正しく表現するために必要な幅を用意する

引用: C/C++ セキュアコーディング 第2版 by Robert C. Seacordら

[シニアエンジニアの庵](http://sehermitage.web.fc2.com/etc/bignum.html)
> OpenSSL ライブラリには，RSA や DH などの公開鍵暗号アルゴリズムを実現するために多倍長整数演算のライブラリ関数が用意されている (crypto ライブラリ：OpenSSL bn(3)を参照)

[How Big is a Bignum?]
(http://patshaughnessy.net/2014/1/9/how-big-is-a-bignum)
> For most Ruby developers, therefore, the Bignum class is a dark, unfamiliar corner of the language.
secureCoding > 型の幅 (width) > w(type) | N > 型を表現するのに必要なパディング以外のビットの数

引用: C/C++ セキュアコーディング 第2版 by Robert C. Seacordら

> これはw(type)あるいは単にNで表される

w(type)で検索しても情報が見つからなかった。こういうキーワードを１文字で表現しているのはまずいなあと思う。
secureCoding > 拡張指数型 > キーワード以外の、予約された識別子を持つ

引用: C/C++ セキュアコーディング 第2版 by Robert C. Seacordら

> C言語には複数の標準整数型があり（キーワードで指定された名前を持つ)、また処理系においてその他の拡張整数型（キーワード以外の、予約された識別子を持つ）を定義することができる。いずれも標準ヘッダにおける型宣言に含めることができる。

拡張整数型の例としては__int8, __in16, __int32, __int64などがある。
[参考: atwiki](http://www37.atwiki.jp/visualstudio/pages/38.html)
RustでMecabを使う

## 必要なもの

### mecab-rs

[rust-mecab](https://github.com/tychosci/rust-mecab) を試してみたのですが、動かなかったため、[mecab-rs](https://github.com/tsurai/mecab-rs) を使うことにしました。

cargoで入れる事ができます。

## cargo.toml

```toml:./cargo.toml
[dependencies.mecab]
git = "https://github.com/tsurai/mecab-rs"
```

## 依存関係

```
# for ubuntu
sudo apt-get install -y mecab
sudo apt-get install -y mecab-ipadic-utf8
sudo apt-get install -y libmecab-dev

```

## コード

```rust:./example/mecab.rs
extern crate mecab;
use mecab::Node;
use mecab::Tagger;


fn main () {

    let mecab: Tagger = mecab::Tagger::new("");
    let input = "今日はいい天気";
    println!("input: {}", input);

    let mut node: mecab::Node = mecab.parse_to_node(&input);

    println!("output :");
    loop {
        match node.next() {
            Some(n) => {
                println!("{}", n.surface);
                node = n;

            }
            None => break
        }
    }
}
```

## 実行

```bash
cargo test && ./target/debug/examples/mecab
```

## 注意点
- mac と ubuntuで動作テストを行いましたが、macではうまく動きませんでした。(「Illegal instruction: 4」エラーが発生)
Range オブジェクトの exclude_end? (ドット3つ表記) について

# (1..9) と (1...10)

Ruby で Range オブジェクトを作成する場合によく使われる記法として `(開始)..(終了)` って表現があります。そして忘れがちですが `(開始)...(終了)` といったドット3つの初期化方法もあります。

```rb
(1..9)   # 1..9
(1...10) # 1...10
```

そして、上記の `1..9` と `1...10` の 2つのオブジェクトは、意味的には同じように感じますが比較すると false を返します。

```rb
(1..9).to_a == (1...10).to_a # true
(1..9) == (1...10)           # false
```

上記は厳密に違う意味があるオブジェクトで、具体的には `exclude_end?` ってフラグを持ってます。これは `Range.new` の第三引数でも指定出来ます。

```rb
Range.new(1, 9)        # 1..9
Range.new(1, 9, false) # 1..9
Range.new(1, 9, true)  # 1...9
(1..9).exclude_end?    # false
(1...10).exclude_end?  # true
```

# usecase

`Range` を作るとき、end 側の指定で `hoge - 1` みたいにわざわざ 1つ減算して与えるくらいならば、
ドット3つ付けて exclude_end な `Range` を作るとシンプルな記述になる場合があります。

```rb
n = 4
s = "hogehoge"

puts s[0..(n-1)] # こっちより...
puts s[0...n]    # こっちの方が意図が伝わりやすい(か?)
```

```rb
require 'date'
d = Date.new(2013, 4)

# 翌月1日を含まない範囲、すなわち当月の範囲の日付配列
(d...(d >> 1)).map(&:to_s)
# => [ "2013-04-01","2013-04-02","2013-04-03",..."2013-04-30"]
```

ActiveRecord で範囲を指定する際にも終端を含めない条件を生成できます。

```rb
Table.where(id: (1..10)).to_sql
# {途中省略} FROM `tables` WHERE `tables`.`id` BETWEEN 1 AND 10
Table.where(id: (1...10)).to_sql
# {途中省略} FROM `tables`  WHERE (`tables`.`id` >= 1 AND `tables`.`id` < 10)
```
GWだからReact.jsを勉強する

# React.jsが熱い
先日のQCONで伊藤さんの講演を聞いて以来、気になっていたReact.jsですが、書籍を読みながら戯れようかと思っています。今年のGWはReactで遊ぶぞーと思ってます。

# React.js
## Webコンポーネント的な位置づけとしてのReact.js
表示とイベントを固めて維持できる。使い方次第は関数的にも利用できるというところがまずは気に入ったので、そこから。

### JSX
DeNAさんのJSXと異なるJSXです。ややっこしいｗ　render関数が楽になるのでそのまま使うことに。gulpを使ったほうがいいかなと思いつつ、Reactにはまる前に環境にはまりそうだったのでブラウザで解釈させることに。やや時間かかるので、実際はプリコンパイルします。

#### JSXをブラウザ使う方法
JSXをブラウザで使うには、以下のような宣言をします。Reactも使うので一緒に。

```html:index.html
    <script src="http://fb.me/react-0.12.1.js"></script>
    <script src="http://fb.me/JSXTransformer-0.12.1.js"></script>
```

JSXを使っているスクリプトファイルは、type=text/jsxとすることで変換をしてくれます。

### コンポーネントファイルとアプリケーションファイルに分割
これが流儀に反しているかわかりませんが、コンポーネント定義ファイルとHTMLとのマッピングを分けました。（React.renderを別ファイルにしたということです）

```html:index.html
    <script type="text/jsx" src="js/component.js"></script>
    <script type="text/jsx" src="js/app.js" ></script>
```

#### コンポーネントファイル
トグルボタンでも作ってみようと思い、ボタンとスイッチの状態を表す領域をひとつのコンポーネントとしてみました。

```js:component.js
var ButtonComponent = React.createClass({

    getInitialState: function () {
        return {
            value: "スイッチオフ",
            toggle: false
        };
    },

    render: function () {
        return <div><input type='button' onClick={this.handleClick} value='押してください' />
            <span> {this.state.value}</span></div>;
    },

    handleClick: function () {
        console.log(this.state.toggle);
        if(this.state.toggle){
            this.setState({value: "スイッチオフ",toggle:false});
        }else{
             this.setState({value: "スイッチオン",toggle:true});
        }

    }

});
```

コンポーネントはReact.createClassで作成します。

#### アプリケーションファイル（勝手にそう命名）

```js:app.js
React.render(<ButtonComponent/>, document.body);
```
作成したButtonComponentを<body>タグにマッピングしました。

これで表示されることになります。

## Formの取り扱い
書籍としてはFormの取り扱いを読みましたがテストプログラムがまだなので、それは明日に。
Play Framework使用開始時にactivatorがインストールするライブラリの場所

WindowsでPlay Frameworkをactivator経由でインストールした時に勝手に色々インストールされるライブラリの場所について記述。

最新版(2.3)のPlay Frameworkをactivator経由でインストールする場合以下のコマンドステップを踏む必要があるがどのタイミングでも結構な時間のかかるダウンロードをし始める。

![activator.png](https://qiita-image-store.s3.amazonaws.com/0/36931/41f2e9eb-86ef-bd06-39b5-cf74028c41cb.png)


インストールされるパスはWindowsの場合%UserProfile%であり、ユーザーのホームディレクトリである。
初回のactivator runが完了した時のダウンロード後のディスクサイズは*330M*を超える。

|パス|サイズ|説明|
|:--|:--|:--|
|%UserProfile%.ivy2|231MB|ライブラリjarはだいたいここにインストールされる|
|%UserProfile%.sbt|81MB|scalaのライブラリはここにインストールされる|
|%UserProfile%.activator|178KB|playのテンプレートファイルがインストールされる|
watchify つかうときはフォルダ名に (  ) 使っちゃダメ

watchify を `/home/hogehoge/Dropbox (Personal)/some/project/` とかってフォルダでやろうとすると、ファイル変更してもいっさいイベントが発生しなくて使い物にならない。

これは [watchify](https://github.com/substack/watchify) の制限というよりは、その内部でファイルの変更を監視するのにつかわれてる [chokidar](https://github.com/paulmillr/chokidar) の問題。chokidar が監視対象のパスを処理するときにつかってる [glob-parent](https://github.com/es128/glob-parent) が `()` を glob の一部として取り除いちゃうことが原因。

Dropbox を Personal と Business 両方でつかってると `Dropbox (Personal)` ってのと `Dropbox (hogehoge)` っていうのができるんだけど、このフォルダの下で作業すると↑の問題にひっかかって watchify できない。めんどい。そしてこのフォルダ名変えられないっぽい？
【Java】自分用AtCoderのテンプレート

# 背景
いつも社長さんの使われているC#テンプレートを使っていました。
しかし、下記理由があるためJavaの勉強も兼ねて書き直してみました。

* WindowsはiMacにしかインストールしていなく帰省中はMBAしか使えない。
* Xamarinは使っていて変な感じがする(やっぱりVisual Studioがいい)。
* MBAはSSD128GBのためWindowsをインストールすると容量のやりくりが厳しい。
* Javaなら前にちょっと書いたことある（安易な考え１）。
* eclipseならMacとWindowsのどちらでも使えるので良さそう（安易な考え２）。

# コード
普段、Javaで書かないので良い書き方かどうか自信ないですが、
今のところ使えているので良しとしました。
　→書き直しただけでテストしてません。

eclipseだと、`System.console().readLine()`が使えない？ようであるため、`BufferedReader`を使いました。
また、`Close()`のタイミングは、`br.readLine()`の直後にやると、2回目の`br.readLine()`の時にIOException(Stream Closed)が出てしまうため`Object#finalize()`が呼ばれる時にしました。

これで大丈夫か詳しい方教えてください。。。
[【Java】ファイナライザ（デストラクタっぽい機能を実装する）](http://blog.livedoor.jp/mitsu_aki/archives/11448914.html "【Java】ファイナライザ（デストラクタっぽい機能を実装する）")


```java:Main.java
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class Main {

	private static Scanner sc;
	
	public static void main(String[] args) {
		Main instance = new Main();
		sc = instance.new Scanner();
		instance.solve();
	}

	private void solve() {
		try {
			System.out.println();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	private class Scanner {
		String[] s;
		int i;
		BufferedReader br;
		String regex = " ";

		public Scanner() {
			s = new String[0];
			i = 0;
			br = new BufferedReader(new InputStreamReader(System.in));
		}

		@Override
		protected void finalize() throws Throwable {
			try {
				super.finalize();
			} finally {
				destruction();
			}
		}

		private void destruction() throws IOException {
			if (br != null)	br.close();
		}

		public String next() throws IOException {
			if (i < s.length) return s[i++];
			String st = br.readLine();
			while (st == "") st = br.readLine();
			s = st.split(regex, 0);
			i = 0;
			return s[i++];
		}

		public int nextInt() throws NumberFormatException, IOException {
			return Integer.parseInt(next());
		}

		public Long nextLong() throws NumberFormatException, IOException {
			return Long.parseLong(next());
		}

		public Double nextDouble() throws NumberFormatException, IOException {
			return Double.parseDouble(next());
		}
	}
}

```

# 使い方
インナークラスの*Scanner*はC++の`std::cin`と同じような動きをします。
Scannerクラスでは、行が変わっても`next()`や`nextInt()`などを呼び続けるだけで値を取得できます。

以下の入力(区切り文字は半角スペース)を読み込む際の処理をC++とJavaで記載します。

```
2
3 4
```
**C++の場合**

```cpp:Main.cpp
#include <iostream>
using namespace std;

int main(){
    int a,b,c; 
    cin >> a;   // a = 2
    cin >> b;   // b = 3
    cin >> c;   // c = 4
    return 0;
}
```
**Javaのテンプレートの場合(長いので読み込み部分だけ)**

```java:Main.java
    private void solve() {
        try {
            int a,b,c;
            a = sc.nextInt();   // a = 2
            b = sc.nextInt();   // b = 3
            c = sc.nextInt();   // c = 4
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
```

# まとめ
AtCoderにJavaで参加しやすくなった。
Arduinoで書き込みエラー : programmer is not responding

# Arduinoで書き込みできなくなった原因をメモ

Arduino自体はちゃんと認識できている。

![ポート_と_ツール_と_Menubar.png](https://qiita-image-store.s3.amazonaws.com/0/41889/e2ad4366-992a-a663-d091-0941d2dce360.png)

マイコンに書き込もうとすると、以下のようなエラー

```
avrdude: stk500_getsync() attempt 1 of 10: not in sync: resp=0x00
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 2 of 10: not in sync: resp=0x00
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 3 of 10: not in sync: resp=0x00
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 4 of 10: not in sync: resp=0x00
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 5 of 10: not in sync: resp=0x00
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 6 of 10: not in sync: resp=0x00
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 7 of 10: not in sync: resp=0x00
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 8 of 10: not in sync: resp=0x00
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 9 of 10: not in sync: resp=0x00
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 10 of 10: not in sync: resp=0x00
```

念のため、PC再起動したり、Arduino抜き差ししてもダメだった。

```
avrdude: stk500_recv(): programmer is not responding
```

どうやら書き込みにいってはいるが、返事がないということみたい。

Arduinoに入出力しているものを全てはずして、マイコンだけで書き込みしてみる。
**(Arduinoのリセットボタンも押す) ←重要**

すると、問題なく書き込み成功。

原因判明。どうやらBLEモジュールなどで、D0(RX)ピンやD1(TX)ピンに頻繁にアクセスするコードを書いていたり、D0(RX)ピンやD1(TX)ピンとの交信中に書き込みを行おうとするとこのエラーが発生するみたい。

![ArduinoUno_R3_Front_450px.jpg](https://qiita-image-store.s3.amazonaws.com/0/41889/6644de97-b38d-8271-aded-8a9111797a21.jpeg)

解決策としては、D0(RX)ピンやD1(TX)ピンとの接続を外して書き込みをするといい。
すでに書き込み済みの場合はリセット必要。

おわり
RealmでNSArrayをプロパティに指定する

NSArrayをプロパティに指定すると

```
*** Terminating app due to uncaught exception 'RLMException', reason: ''NSArray' is not supported as an RLMObject property. All properties must be primitives, NSString, NSDate, NSData, RLMArray, or subclasses of RLMObject. See http://realm.io/docs/cocoa/api/Classes/RLMObject.html for more information.'
```

と言われます。

```
「例外エラーで落としたよ。NSArrayはRLMObjectのプロパティとしてサポートしてないよ。プロパティはNSString、NSDate、NSData、RLMArray、それかRLMObjectのサブクラスにしてね。というかドキュメント読んでね。」
```

と、要約するとこんな感じかと思います。

文中のRLMArray、これちょっと今回の問題に関わりありそうですね。Arrayって書いてあるし。

RLMArrayの使い方ですが、NSArrayと置き換えてしまって大丈夫です。が、ちゃんと中身にどんなのが入るかは教えてね。ってことらしいです。

まずはbooksという配列を持つLibraryモデルを例に実装してみましょう。

```objc:Library.h
@interface Library : NSObject
@property (nonatomic) NSArray *books;
@end
```
ライブラリのimportはpchでしているので省略しますね。

これをRealmに対応させるには、まずはBookモデルを作ります。
ファイルが増えるのが嫌ならLibrary.h上に作ってしまっても良いですよ。
次の例はLibrary.h上にbookモデルを作っている例です。

```objc:Library.h
@interface Book : RLMObject
@property NSString *title;
@end
RLM_ARRAY_TYPE(Book)

@interface Library : NSObject
@property (nonatomic) NSArray *books;
@end
```

これでtitleのプロパティを持つBookモデルが出来上がりました。
実際は色々他にもプロパティを持つかと思いますが、ここでは簡単にタイトルだけとします。

次に、LibraryモデルのbooksプロパティをRLMArrayに変えます。
同時にLibraryモデルをNSObjectからRLMObjectのサブクラスに変更します。

```objc:Library.h
@interface Book : RLMObject
@property NSString *title;
@end
RLM_ARRAY_TYPE(Book)

@interface Library : RLMObject
@property (nonatomic) RLMArray *books;
@end
```

そして、booksがbookモデルの集合だということを指定します。

```objc:Library.h
@interface Book : RLMObject
@property NSString *title;
@end
RLM_ARRAY_TYPE(Book)

@interface Library : RLMObject
@property (nonatomic) RLMArray<Book> *books;
@end
```
これでNSArrayの書き換えは完了です。

以下はイニシャライザでbooksにbookオブジェクトを生成して入れていくサンプルです。

```objc:Library.h
@interface Book : RLMObject
@property NSString *title;
@end
RLM_ARRAY_TYPE(Book)

@interface Library : RLMObject
-(instancetype)initWithTitlesArray:(NSArray*)titles;
@property (nonatomic) RLMArray<Book> *books;
@end
```

ヘッダーにイニシャライザを実装して…

```objc:Library.m
#import "Library.h"

@implementation Book
@end

@implementation Library
-(instancetype)initWithTitlesArray:(NSArray*)titles{
    self = [super init];
    if (self) {        
        for (NSString*title in titles) {
            Book*book = [Book new];
            book.title = title
            [_books addObject:book];
        }
    }
    return self;
}
@end
```

これで完了です。
github.ioでユーザーのWebページを公開する

GitHubでは、アカウントを持っていればWebページを公開できます。ここでは、ユーザーの（つまり自分自身の）ページを公開しようと思います。

ドメインは、<ユーザーID>.github.io になります。私の場合はユーザーIDが yoshikyoto なので、yoshikyoto.github.io となります。かなりイケてるドメインです。


作り方は簡単です。GitHubで、<ユーザー名>.github.io というリポジトリを作るだけです。![スクリーンショット 2015-05-03 2.28.23.png](https://qiita-image-store.s3.amazonaws.com/0/29024/1846531c-10e5-1b84-f0d1-91af9110ea43.png)

ここに適当にhtmlをpushすると、それだけで公開できます。
<ユーザー名>.github.io にアクセスしてみましょう。

ページの管理もgitでできて非常に便利です。
masterブランチの最新版が公開されるようになっているみたいです。
CSSもJSも使えます。PHPとかは確認してないけど流石に無理なのかな？でも個人のページを公開するためなら使えると思います。ぜひ使いましょう。
ESP8266のファームウェアを引っこ抜く

……という夢を見よう。

なんかいまいちATコマンドが使えたり使えなかったりするようなので、[ファームウェアを更新](http://qiita.com/masato/items/3f386dbc600c1cd840f4)してみたいものの、念のため購入時のファームウェアを引っこ抜いて保全しておきたい。

[electrodragon.com](http://www.electrodragon.com/w/ESP8266_Firmware) の ESP Flash Download Tool の画面を見る限り、焼きこむことしかできなさそうなので、[ESPTool](https://github.com/themadinventor/esptool/)を見てみると、 read_flash というコマンドがあって、これで引っこ抜けそうな感じなので、やってみる。

# 配線
ファームをやりとりするには、GPIO0 を GND に落としておく。
RST を GND にちょいっと落とすことでESPToolのコマンドを受け付けるようになる。

# ESPToolで引っこ抜く
1. pythonランタイムを[python.org](https://www.python.org/downloads/)から入手してインストールしておく。
2. easy_install pyserial とやって pyserialライブラリを取得しておく。
3. [ESPTool](https://github.com/themadinventor/esptool/) をダウンロードする。
4. こんな感じで引っこ抜く:
```esptool.py -p COM6 -b 9600 read_flash 0x000000 0x88ff original.bin```

サイズは適当。0x88ffというのは、後述するファームのサイズよりちょっと多めの値。

# 中身は?
AT+GMR の応答が `0018000902-AI03` という文字列だったので、きっと [ai-thinker firmware](https://drive.google.com/folderview?id=0B_ctPy0pJuW6d1FqM1lvSkJmNU0&usp=sharing) にある "ESP8266_AT_V00180902_04 (0018000902-AI03)_unconfirm version.bin" だろう、と思ってバイナリ比較してみたら、完全に一致する。

これで何かあっても元に戻せるね。
UniRxのシンプルなサンプル その3(FirstとTake)

[UniRxのシンプルなサンプルの取扱説明書](http://qiita.com/Marimoiro/items/b0c66c6c22cf58bde049)
[前(WhereとSelect)](http://qiita.com/Marimoiro/items/5127e34de0f80e6e33fc)
[次(SkipとSkipWhile)](http://qiita.com/Marimoiro/items/de9daf28532049b5195b)
# 最初の方だけ実行するメソッド #
だんだんRxの便利な機能になっていきます。
今回はIEnumerableのLINQではあまり使う頻度の高くないFirstとかTakeです。
(特にTakeって使うことあるんだろうか…？)

一転してRxではとても便利なメソッドになります。
これらは最初の一回だけ実行したいとか最初の数回だけ実行したいとか、そういうことをしたいときに大活躍します。

例えば最初の一回だけしか反応してほしくない送信ボタン
例えばHPが0になったら当たり処理をしてほしくないオブジェクト
とかで使えそうです。

## 前準備 ##
例によって例のごとくTakeWhileとTakeとFirstを作ってそれぞれのSampleスクリプト貼っつけてます。
![スクリーンショット 2015-05-03 01.34.17.png](https://qiita-image-store.s3.amazonaws.com/0/77177/f79336be-bc5b-cfd4-025e-7da8bd325639.png)


## First ##
Firstは100Frame後に1回だけ1.5f右に移動するオブジェクトにしてみます。
コードはこちら

```csharp:FirstSample
using UnityEngine;
using System.Collections;
using UniRx;
using UniRx.Triggers;

public class First : Base
{

    // Use this for initialization
    void Start()
    {
        gameObject.transform.position = new Vector2(0, 1f);

        //クリックされたら右に1.5動かす(但し1回だけ)
        this.UpdateAsObservable()
            .First(l => Input.GetMouseButton(0))
            .Subscribe(l => Move(1.5f, 0));
    }
}

```
今回から初期位置は直接代入します。

First<T>(Func<T, bool> predicate)を使うと指定したpredicateに合致した値を最初の1回だけその先にプッシュします。
なのでInput.GetMouseButton(0)がtrueになった後にこのオブジェクトは1回だけ1.5f移動します。
（Firstには引数を取らないオーバーロードもあってWhereと組み合わせたりイベントの最初の一回というのを実現したりできます。）

## Take ##
次に最初の数回だけ処理をしたいという要望に答えてくれるTakeです。

こちらは100Frameの間だけ0.01f移動するようにします。

```csharp:TakeSample
using UnityEngine;
using System.Collections;
using UniRx;
using UniRx.Triggers;

public class TakeSample : Base {

	// Use this for initialization
	void Start () {
        gameObject.transform.position = new Vector2(0, 0.5f);

        //Takeで最初の100回以外はカット
        this.UpdateAsObservable()
            .Take(100)
            .Subscribe(l => Move(0.01f, 0));
	}
	
}


```

Take(int n)はプッシュされてきた最初のn回だけプッシュしてくれます。
実際は次のTakeWhileとか紹介はしないけどTakeUnitilとかのほうがいっぱい使いそうです。

## TakeWhile ##
TakeWhileは指定した条件が真である間値をプッシュし続けてくれる便利なメソッドです。
今回はxが2を超えるまで右に移動するGameObjectを作ります。

```csharp:TakeWhileSample
using UnityEngine;
using System.Collections;
using UniRx;
using UniRx.Triggers;

public class TakeWhile : Base
{
    // Use this for initialization
    void Start()
    {
        gameObject.transform.position = new Vector2(0, 1.5f);

        //Takeでxが2を超えたらそれ以降はカット
        this.UpdateAsObservable()
            .TakeWhile(l => gameObject.transform.position.x <= 2)
            .Subscribe(l => Move(0.01f, 0));
    }

}

```

TakeWhile<T>(Func<T, bool> predicate)はpredicateが合致するまで流れてきた値をプッシュし続けます。
なので上記はのコードはl => gameObject.transform.position.x <= 2を満たすまではSubscribeに行きますが、それ以降はSubscribeに値が伝わらないので結果としてx==2くらいで動きが停止することになります。

## 実行結果 ##
というわけでそれぞれのオブジェクトの停止した場所はこんなかんじになります。

![スクリーンショット 2015-05-03 02.12.23.png](https://qiita-image-store.s3.amazonaws.com/0/77177/b5a0277c-c65f-52e3-9eb0-abd50def2be3.png)

今回はここまで
golang導入の備忘録


## Go Install
https://golang.org/doc/install

`$ vi .zshrc`

```bash:.zshrc
export PATH=$PATH:/usr/local/go/bin
export GOPATH=~/gocode
export PATH=$PATH:$GOPATH/bin
```
`$ source .zshrc`

`$ vi hello.go`

```go:hello.go
package main
import "fmt"

func main(){
fmt.Printf("hello world\n")
}
```
`$ go run hello.go`

## 学習
* [A Tour of Go](http://go-tour-jp.appspot.com/#1)

# Revel Tutorial参照
[Revel Tutorial](https://revel.github.io/tutorial/index.html)

## Getting started

`$ go get github.com/revel/revel`
`$ go get github.com/revel/cmd/revel`

`$ revel help`

## Creating a new Revel app

`$ cd $GOPATH`
`$ revel new myapp`

`$ revel run myapp`

http://localhost:9000/ 

## Revel 学習

* [The request flow](https://revel.github.io/tutorial/requestflow.html)
* [The 'Hello World' app](
https://revel.github.io/tutorial/firstapp.html)

## Revel Sample
https://revel.github.io/samples/index.html
Riot.jsのカスタムタグを使わずに、divタグでmountして使う方法

Riot.jsは今流行りのReact.jsライクで比べて軽量なライブラリーです。
React.jsに比べてシンプルで簡単に導入できるので、Reactには興味あるけどなんか難しそうって方にもおすすめなライブラリー。

詳しくはこちら↓
> [Riot公式](https://muut.com/riotjs/)
> [Riot.js 2.0 情報まとめ](http://qiita.com/cognitom/items/54ae38c9a50dbbe28367)

Riot.jsを使っている中で
ちょっとネックになるのがカスタムタグの存在です。

例えばこんなソースコード場合、

```html
<body>
  <hello></hello>

  <script src="https://cdnjs.cloudflare.com/ajax/libs/riot/2.0.15/riot+compiler.min.js"></script>
  <script type="riot/tag">
    <hello>
      <h1>{ title }</h1>

      this.title = "hello world!"
    </hello>
  </script>
  <script>
    riot.mount("hello")
  </script>
</body>
```

この場合は実行すると\<hello\>タグの{title}部分に"hello world!"という文字列に流し込まれます。

この\<hello\>の部分がRiot.jsで使われるカスタムタグになります。
しかし、HTML的に気持ち悪い部分です。IE対応もめんどくさい・・・


そこで、Riot.jsではちゃんと通常のHTMLのタグでもmountingできるような機能が用意されています。

```html
<body>
<div id="hello"></div>
<div class="world"></div>

<script src="https://cdnjs.cloudflare.com/ajax/libs/riot/2.0.15/riot+compiler.min.js"></script>
<script type="riot/tag">
  <hello>
    <h1>{ title }</h1>

    this.title = "hello world!"
  </hello>
</script>
<script>
  riot.mount("#hello", "hello")
  riot.mount(".world", "hello")
</script>
</body>
```

riot.mount()の第１引数にセレクター、第２引数にriotのカスタムタグを指定することで対応可能です。
セレクターにはjQueryのようにidは『#』、classは『.』から始まるものが使えます。

こんな感じで、Riot.jsのカスタムタグを使わずに普通のdivタグでmountして使うことができました。


ちなみに

```js
  riot.mount("#hello, .world", "hello")
```
のようにまとめて書くこともでできます。
MacのCommandキーが押しにくいのでKarabinerでカスタマイズ

# Commandキーの位置
ずっとWindowsを使ってきたので、MacのCommandキーが押しにくくてイライラすることがよくあります。
特に問題なのがアンドゥのCommand+Zとコピペで使うCommand+X, Command+C, Command+Vです。使用頻度が高いのにもっとも押しにくくて困ります。

Windowsでは左下にあるCtrlキーを小指で押していますが、Commandキーを小指で押すわけにはいきません。
自分が使っているのはJISキーボードなので左手親指で押すにしても親指をすごく曲げて押さないといけません。

システム環境設定で左下のCapsキーをCommandキーに入れ替えれば済む話ではあるのですが、自分の場合はVMWare Fusion上でWindowsを使っているので左下のキーはControlキーになっていないと困るのです。

# Karabinerで解決
下の記事を見つけたのでその通りにやってみました。

[Macで「command」キーを押したつもりが、「かな」だったことってありませんか。Karabinerでキーカスタマイズすると快適ですよ。](http://kumiko-jp.com/archives/32580.html)

英数キーにCommandキーの機能を持たせることができるのでだいぶ楽になりました。
しかもちゃんと英数キーとしても機能するのですごく便利ですよ。

# 参考リンク
[Karabiner - OS X用のソフトウェア](https://pqrs.org/osx/karabiner/index.html.ja)
RustでMySQLを使う

# rustでmysql接続を行う
Rust言語は、このまま開発が順調に行けば、5月15日に1.0 stableがリリースされます。
Rust言語はメモリ管理にガベージコレクションを使わずに、安全なメモリ管理が出来るように設計されたコンパイル言語で、ほぼC言語に近い実装になります。言語仕様の特徴としては、クラスがなく、その代わり構造体とTrait(型クラスを実現します)があり、データ構造自体にメソッドを持たせることが出来るので、副作用がない開発が出来ます。

## Cargo.toml
mysqlの接続には、`rust-mysql-simple` が必要になります。

```toml:Cargo.toml
[package]
name = "mysql-test"
version = "0.1.0"
authors = ["example <name@example.com>"]

[dependencies.mysql]
git = "https://github.com/blackbeam/rust-mysql-simple"

```

## 依存関連

ビルドに下記のライブラリが必要です。

```bash:ubuntu
sudo apt-get install -y build-essential
sudo apt-get install -y libssl-dev
sudo apt-get install -y cmake
```

```bash:centos
sudo yum install -y libssl-dev cmake gcc openssl-devel
```

cmakeは必要だったか忘れましたが・・念のため入れておきます。

## サンプル

```mysql:mysql_schema
CREATE TABLE `test` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  KEY `id` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8;
```

```rust:examples/mysql.rs
// mysql接続設定
fn get_opts() -> MyOpts {
    let opts = MyOpts {
        user: Some("root".to_string()),
        pass: Some("root".to_string()),
        db_name: Some("test".to_string()),
        ..Default::default()
    };
    return opts;
}

// main
fn main() {

    let opts = get_opts();
    let pool = pool::MyPool::new(opts).unwrap();
    let mut stmt = pool.prepare("select * from test;").unwrap();
    let result = stmt.execute(&[]).unwrap();
    for row in result {
        match row {
            Ok(v) => {
                let name = from_value::<Vec<u8>>(&v[1]);
                let name = String::from_utf8(name).unwrap();
                println!("id: {}, name: {}",  from_value::<i32>(&v[0]), name );
            },
            Err(e) => println!("error! => {:?}", e)
        }
    }

}
```

## 実行
`cargo test`を実行することにより、`examples`フォルダに入っているコードがビルドされます

```
cargo test && ./target/debug/examples/mysql
```

## 最後に思ったことなど

- osxとubuntu両方で試しましたが、ubuntuでしかうまく行きませんでした。osxだとビルドに癖がある様子。
- ミュータブル変数なのにあとから変数の内容を書き換えていない場合warnが出るRust言語は素晴らしかった
- `cargo test` は本来 `src/lib.rs` に書かれているテストと `tests/*.rs` を実行するものですが、 `examples` も一緒にコンパイルしてバイナリを履いてくれる機能もあり、嬉しい。
- Option型はScalaやSwiftで見かけましたが、Result型もあるんですね。エラーハンドリングがやりやすいです。
- `.unwrap()`でオプショナル型から中身を取り出せるのいいですね。
- `let name`を何度も定義できる・・・？！ これ、Rustではよくサンプルコードで見かけます。
- poolをcloneして、スレッドプログラミングすることもできるそうです。すごい。。
- コメント欄でこういう方法もあるよ！こういう実装すると便利だよ！みたいなのありましたら、教えてください！

## 2015-09-29 追記
Rust1.3だと上記のコードがコンパイル通らないようです。
修正版はコメント欄参照です。
ubuntu14.04にLaravelをインストールして初期画面表示まで

OS： ubuntu-ja-14.04-desktop-amd64.iso
仮想サーバ：VMware Player
用途：ローカル開発環境

仮想サーバへのOSインストール完了後から。
ubuntu の terminalにて

    sudo apt-get update

    sudo apt-get install ssh

ifconfigでIPアドレスを調べ、TeraTermで接続。引き続き下記を実施。

    sudo apt-get install tasksel

LAMPのインストール。

    sudo tasksel install lamp-server

mysqlのrootのパスワードを聞かれるので入力。

ここで、Apacheを起動して、アクセスを確認しておく。

    sudo /etc/init.d/apache2 start


http://192.168.1.150
にアクセスして、Ubuntuのデフォルトページが見えればOK。

    sudo apt-get install curl

コンポーザのインストール

    curl -sS https://getcomposer.org/installer | php
    sudo mv composer.phar /usr/local/bin/composer
    composer global require "laravel/installer=~1.1"

mcryptのインストールと設定

    sudo apt-get install php5-mcrypt
    sudo php5enmod mcrypt
    sudo vi /etc/php5/apache2/php.ini

mcrypt.modes_dir を下記に書き換える。

    mcrypt.modes_dir=/usr/share/bash-completion/completions/mcrypt

Apacheを再起動する。

    sudo /etc/init.d/apache2 restart

パスの設定

    PATH=$PATH:~/.composer/vendor/bin
    export PATH

プロジェクト作成

    composer create-project laravel-ja/laravel engineer-japan --prefer-dist

コマンドを実行した場所に、ディレクトリ engineer-japan が作成される。

ドキュメントルートの変更

    sudo vi /etc/apache2/sites-enabled/000-default.conf

000-default.conf の

    DocumentRoot /var/www/html 

を

    DocumentRoot /home/yamato/engineer-japan/public

に書き換える。

    sudo vi /etc/apache2/apache2.conf

apache2.conf に下記を追加する。

    <Directory /home/yamato/engineer-japan/public/>
        Options Indexes FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>

Apacheを再起動する。

    sudo /etc/init.d/apache2 restart

パーミッションを変更する

    sudo chmod -R 777 /home/yamato/engineer-japan/app/storage/

mod_rewrite を有効にする

    sudo a2enmod rewrite

.htaccess を書き換える。

    sudo vi /home/yamato/engineer-japan/public/.htaccess

下記のように書き換える。

    <IfModule mod_rewrite.c>
    Options +FollowSymLinks
    RewriteEngine On

    # Redirect Trailing Slashes...
    # RewriteRule ^(.*)/$ /$1 [L,R=301]

    # Handle Front Controller...
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^ index.php [L]
    </IfModule>

Apacheを再起動する。

    sudo /etc/init.d/apache2 restart

http://192.168.1.150/
にアクセスして、You have arrived. と表示されたらOK。

引き続き、phpMyAdmin のインストール。

    sudo apt-get install phpmyadmin

apache2, No を選択。

    sudo vi /etc/apache2/apache2.conf

最下行に以下を追記。

    Include /etc/phpmyadmin/apache.conf

Apacheを再起動する。

    sudo /etc/init.d/apache2 restart

http://192.168.1.150/phpmyadmin
にアクセスできればOK。
Meraki の気になる機能

## 概要
CISCO が買収した「Meraki」シリーズというWi-Fiアクセスポイントが色々できて楽しいため、書いてみました。

おおむねチェックひとつで導入できる簡単設計。
主に飲食店など来客の多い場所向け機能ですが、位置情報収集など、どこでも使えそうな機能も。

## Sign-on編

### Sign-on with FaceBook Wi-Fi
Facebookで認証。
SSIDにアクセスするとFaceBookページが開かれ、そこにチェックインするとWi-Fiに接続できるようになる。

### Sign-on with SMS Authentication
携帯の電話番号で認証。
電話番号をMerakiへ送ると、SNSで認証キーを発送してくれるので、それでサインオンする。
Twilioアカウントの登録が必要。
− Twilio：電話操作用のAPI

### Billing (paid access)
クレジットカードかプリペイドカードで承認。
支払い毎の利用期間や例外ユーザなども割と簡単に登録できる。
難点はJPYに対応してないとこですかね…

## 機器管理編

### CMX
Connected Mobile Experience の略。
Cisco謹製の、Wi-Fiアクセスポイントを用いた位置情報収集・解析ソリューション。

### RTLS
Real Time Locating Systems(リアルタイム位置情報システム) の略。
以下のシステムに対応

- Ekahau RTLS
- Aeroscout RTLS

### SAML SSO 
Security Assertion Markup Language（SAML）
Single Sign-On（SSO）の略。
まだベータ版機能。

## おわりに
まだざっと見ただけですので、取りこぼしがあるかと思います。
他に面白そうな機能をご存知でしたら、ぜひ教えてください。
Swiftでobjc_setAssociatedObjectのパラメータにclosureを使う時

#Swiftでruntimeのobjc_setAssociatedObject()のパラメータにclosureを使う時 
runtimeのパラメータにclosureを設定する時の方法を記す。

## 何故ビルドエラーになるのか？
SwiftではclosureがAnyObjectでないため。一方`objc_setAssociatedObject`は第一引数にAnyObject型を要求する。ゆえに設定するとビルドエラーとなり設定できない。

```objc:例
static char const * const Tag = "Tag";

- (void)hoge
{
    Block block = ^(BOOL isConnected) {
      is (isConnected) {
        NSLog(@"connected")
      } else {
        NSLog(@"not connected")
      }
    };
    objc_setAssociatedObject(block, Tag, @1, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}

```
## 対応方法
Swiftに於いて、ジェネリクスをもつBlockクラスを設け、そのプロパティとしてclosureを設定する。
そして、closureをfを設ける（詳細下記）。

```swift
class Block<T> {
    let f : T
    init (_ f: T) { self.f = f }
}
```

```swift
typealias Block = Bool -> Void

let block: Block = { isConnected -> Void in
    if isConnected {
        println("connected")
    } else {
        println("not connected")
    }
    block(portConnected)
 }
var closure = Block(block)
var tag = "Tag"
var hoge = "hoge"
objc_setAssociatedObject(closure, &tag, hoge, UInt(OBJC_ASSOCIATION_RETAIN_NONATOMIC));
```