OmniAICreator/Qiita-1.07M huggingface dataset:
一連の入力が完了したらユーザーがバックボタンを押してもう一度入力できないようにする方法


ユーザーに簡単な入力をお願いして入力後完了画面に遷移した状態の時に、同じユーザーにまた入力をしてほしくない時がありますよね？たとえば、ユーザーIDを発行する画面とか。

そんな時に以前の画面に戻れなくする簡単便利なJavaScriptを教えてもらったので共有しておきます。

まず、答えだけ書いておくと、
```<script>window.onunload=function(){};</script>
<script>window.history.forward();</script>```
を以前の画面のベースとなるテンプレートファイルの先頭に `<script>` タグに囲んで入れてあげるだけです。

解説です。
forward関数定義を調べればすぐにわかりますが、単純に、ブラウザの履歴から次のURLをロードするだけの関数です。

つまり、初めての入力時にはブラウザの履歴には次のURLがないのでこのscriptが発火しても問題なく、入力終了時にはすでに完了画面がブラウザの履歴には残っているので、このテンプレートをレンダリングする際に履歴上の次である現在の完了画面に移動する、というscriptです。

これは現在の環境(Mac OSX 10.10.3, Chrome（Version 47.0.2526.73 (64-bit)）では問題無いなく動作します。問題はSafariだと([cacheが見えてしまうために](http://note.chiebukuro.yahoo.co.jp/detail/n226501))期待どおりに動作せず、戻りたくない画面に戻ってしまいます。つまり、クロスブラウザだと期待どおりに動作しないのです。

これを解消するためにunloadイベントがあればブラウザにキャッシュをしない性質を利用して、空関数を呼び出す、 `window.onunload=function(){};` コードを先に実行させてあげましょうね、というお話でした。

[2015 tech-yuruyuru アドベントカレンダー](http://connpass.com/event/22759/)20日目の記事として書いています。
ReactJS + Flumpt のカウンターのサンプルその1


## 目的

[Flumpt](https://github.com/mizchi/flumpt) がどのようなものか知るためにちょっと触ってみる。

追記：[その2](http://qiita.com/cortyuming/items/eae29da1c9fd9971c4f3)

## ファイル構成

```
.
├── dest
│   └── app.js
├── index.html
├── package.json
└── src
    └── app.jsx
```

## package


```pacage.json
{
  "devDependencies": {
    "babel-preset-es2015": "^6.3.13",
    "babel-preset-react": "^6.3.13",
    "babelify": "^7.2.0",
    "browserify": "^12.0.1",
    "watchify": "^3.6.1"
  },
  "scripts": {
    "build": "browserify src/app.jsx -o dest/app.js -t [ babelify --presets [ es2015 react ] ]",
    "watch": "watchify -t [ babelify --presets [ es2015 react ] ] src/app.jsx -o dest/app.js -v"
  },
  "dependencies": {
    "flumpt": "^0.1.3",
    "flux": "^2.1.1",
    "react": "^0.14.3",
    "react-dom": "^0.14.3"
  }
}
```

## 実行

```
$ npm install
$ npm run build
$ npm run watch

```

## code

```src/app.jsx
'use strict';

import * as React from 'react';  //eslint-disable-line
import {Flux, Component} from 'flumpt';
import {render} from 'react-dom';


class CounterComponent extends Component {
  render() {
    return (
      <div>
        <p>count: {this.props.count}</p>
        <div>
          <button onClick={() => this.dispatch('increment')}>+1</button>
          <button onClick={() => this.dispatch('decrement')}>-1</button>
        </div>
      </div>
    );
  }
}


class App extends Flux {
  subscribe() {
    this.on('increment', () => {
      this.update(({count}) => {
        return {count: count + 1};
      });
    });
    this.on('decrement', () => {
      this.update(({count}) => {
        return {count: count - 1};
      });
    });
  }
  render(state) {
    return <CounterComponent {...state}/>;
  }
}

const app = new App({
  renderer: el => {
    render(el, document.querySelector('.js-container'));
  },
  initialState: {count: 0},
  middlewares: [
    // logger
    (state) => {
      console.log(state);
      return state;
    }
  ]
});

app.update(_initialState => (_initialState));
```

## 表示

```
$ python -m SimpleHTTPServer 8000
```

- http://localhost:8000

![スクリーンショット 2015-11-07 14.48.21.png](https://qiita-image-store.s3.amazonaws.com/0/41656/b7055cbf-05b3-2817-c15f-20cbbea0c1e9.png "スクリーンショット 2015-11-07 14.48.21.png")



## 感想

- 書いてみたら思っていたよりシンプルでなかなか書きやすく良い感じかもしれない。
- `import * as React from 'react';` の　`*` を書かない書き方にできないかしら？
- 最終行の `app.update(_initialState => (_initialState));` の書き方これでいいのかしら？

## 追記

### 2015-12-27

テストを追加してみた

 - [Reactjs のテストを karma + karma-fixture + mocha + power-assert で書いてみる](http://qiita.com/cortyuming/items/f4ec3bfd97647f3812d8)


## 参考

- https://github.com/mizchi/flumpt
- http://qiita.com/mizchi/items/79673c4d406cc85b44aa
DeNA × Sansan iOS Engineer Night に行ってきた

#DeNA × Sansan iOS Engineer Night  
2015/10/22
http://connpass.com/event/21159/
遅ればせながらメモを投稿

#Swift Class or Struct
Akifumi @DeNA
## Classの問題点
+ 暗黙の共有（参照型のため）  
+ 継承問題  
+ 型ロスト、ダウンキャストでロストする  

##Struct
Class:参照型  
Struct:値型

StructでもProtocolを継承できる。

## Swiftはプロトコル指向言語である。Classの問題点に悩まされずに済むので使ってみましょう。

#iOS9 ショートカット
金子拓司 @Sansan
##Home screen quick actions
ホーム画面で3D Touch使うと出てくる  

### Static quick actions  
- ユーザーの状態に依存しないアクション
- インストールすると使える
- 固定のアクション  

### Dynamic quick actions  
- ユーザーの状態に依存するアクション
- 起動しないと使えない
- 起動しないと更新されない
- version info をplistに保存しておくとよい  

##Search API
- Spotlight API
- 検索indexにデータを追加する  
  CSSearchableItemとか
- Spotlightからのアプリの起動

## ショートカット作り過ぎると
- UIApplicationDelegateが肥大化する
- リファクタリングする
- 目的の画面に至るまでに、複雑な画面遷移が必要になる。  
- Modalで画面を出しても支障ないのなら、そうする。

#Xcode７ Tips
Koji @DeNA
##Storyboard Reference
複数人で触るとコンフリクトする悩みから解放  
Editor -> Refactor Storyboard

##UIStackView
AutoLayoutの制約を何個も使わなくていいから楽。  
左から右にStackViewを積む
##ExtraView
##UI Test
- テストコードをswiftで書ける
- シュミレーターでの動作を記録して、テストコードを生成してくれる

##Swift
playgroundでライブコーディング
###try catch
- try? try!
- type safe
- guard  
if文をスッキリ書き換えられる
- デフォルト引数の補完がよくなった

## Bundle Identifier  
Build Settingsに追加された。Debugとか構成ごとに自在に変えられるので便利。

#iOS Refactoring
Sansan @kazu0620

## Anti Pattern
- 命名が悪い. btn
- マジックナンバー  
　enum使おう
- CGRectMakeFrame  
動的なviewでもstoryboard、Auto Layout で意外といける
- modeが大すぎ、８個？ 過剰な分岐が必要になる
- クラスの名前が抽象的。責務を限定して、分かりやすい名前にする。

### Fat ViewController
- 行数が多すぎ
- Modelで切り出す
- Viewで切り出す
- チュートリアルやガイダンスの状態管理を別のモデルクラスで切り出す
- 複数のmodelを書き換える。serviceクラスを使う

### AppDelegateの肥大化
NSNotificationは各View Controllerで
###  Fat Storyboard
###  Notification, Delegate, KeyObserver 
通知元と通知先の関係を考える.  
1対1か、1対N か

###  悪いコードを放置しない  
- ボーイスカウトルール
FuelPHPのモデル名からModel_接頭辞をはずす

この記事は[FuelPHP Advent Calendar 2015](http://qiita.com/advent-calendar/2015/fuelphp)の21日目になります。
カレンダーに空きがあったので初投稿です。
モデル名からModel_接頭辞をはずす方法について書きます。

FuelPHPの規約ではモデル名にはModel_接頭辞（prefix）を付けることになっています。
（oilコマンドでモデルを生成してもクラス名にはModel_が付加されます）
下記はコントローラーでモデルを使う例です。この程度なら全然平気ですが

```php:controller/samples.php
public action_index()
{
    $samples = Model_Sample::test();
    //以下略
}
```

実際は何度もモデルのメソッドを呼び出すことになります。
さらにモデルに定数なんぞ定義した日には一気に胃もたれ感が...

```php
//つらい
$posts = Model_Post::lists($user_id, Model_Post::ONLY_DRAFT);
//こう使いたい
$posts = Post::lists($user_id, Post::ONLY_DRAFT);
```

Model_はずしたい、はずそう・・・はずしましょう！
方法は3通りあるので順に記載していきます。

##1.モデルをclasses直下に配置する方法
#####手順
1. クラス名からModel_をはずす
2. ファイルをmodelディレクトリからclasses直下に移す

#####特徴
○ 一番簡単
× classesが散らかるのでモデルの数が多いと管理が面倒



##2.モデルにnamespaceを指定する方法
#####手順
1. クラス名からModel_をはずす
2. クラスにnamespace Modelを追加する

#####特徴
○ modelディレクトリはそのままでOK
× namespaceが変わるので\忘れなどに注意


```php:model/sample.php
namespace Model;

//Orm\Modelではダメ
class Sample extends \Orm\Model
{
    public static function test()
    {
        //Arrではダメ
        return \Arr::pluck($items, $label);
    }
}

//使用する側のコントローラーはこんな感じで
use Model\Sample

$samples = Sample::find('all');
```

##3.bootstrapでオートロードのパスを指定する方法
#####手順
1. クラス名からModel_をはずす
2. bootstrap.phpでパスを指定する

```php:bootstrap.php
\Autoloader::add_classes(array(
    'Sample'  => APPPATH.'classes/model/sample.php',
    'User'    => APPPATH.'classes/model/user.php',
    'Comment' => APPPATH.'classes/model/comment.php',
));
```
#####特徴
○ ファイル構成を変更しなくて良い
× モデルを増やすたびにbootstrapに登録する必要がある

以上3通りでした。個人的にはパターン3が好きです。
Fuelを使い始めてからしばらくはModel_を外せると知りませんでした。
（改めてしっかり公式のモデルのページを見たら先頭のほうにさらっとパターン2の方法が…）
http://fuelphp.jp/docs/1.8/general/models.html

Fuelの規約的には「モデルだからクラス名はModel_Sample」だけど
オートローダー的には「ModelディレクトリにあるSampleクラスだからクラス名はModel_Sample」ってことなんですね。
コントローラーからModel_が一掃されて見通しがとても良くなりました。
Model_にもやもやしている人はぜひ一度お試しを。

ちなみに[FuelPHP Advent Calendar 2015](http://qiita.com/advent-calendar/2015/fuelphp)は後1日空きがあるようです、あるようです。
node-red用websocketブリッヂ その2

#概要
node-redのwebsocketからmilkcocoaにつなぐ、ブリッヂをjsdo.it上に構築した。
ライブラリーは、milkcocoa.jsを使った。
#写真
![websocket.jpg](https://qiita-image-store.s3.amazonaws.com/0/18104/2b8288e9-179c-f320-7f41-c39983ca0385.jpeg)

#サンプルコード
```
var red;
var mlk;
var ds;
function setup() {
    var url = "flagi9edsvtg.mlkcca.com";
    red = new WebSocket("ws://node-red/test0");
    red.onmessage = function(e) {
        //alert("red received data : " + e.data);
        ds.push({
            content: "ohisama",
            date: new Date().getTime()
        });
    };
    mlk = new MilkCocoa(url);
    var ds = mlk.dataStore("message");
    ds.on("push", function(e) {
        //alert("ds on");
        red.send("ohisama");
    });
}
setup();
```
SlackのnotificationsにSnoozeがあることに気がついた

いつからあったのかわからないがいつの間にかあった。
![スクリーンショット 2015-12-19 19.14.47.png](https://qiita-image-store.s3.amazonaws.com/0/27949/d731c9f6-e6a6-2017-d29e-765abc0955f7.png)

クリックしてみたらこのように
![スクリーンショット 2015-12-19 19.16.22.png](https://qiita-image-store.s3.amazonaws.com/0/27949/f1e55d61-e8f7-a6f6-3d21-a453214515fe.png)
Snooze機能だそうです。
ためにしに20minutesを選んでみると
![スクリーンショット 2015-12-19 19.18.13.png](https://qiita-image-store.s3.amazonaws.com/0/27949/c6947eef-1449-1790-4bfa-72f27658183f.png)
見た目もわかりやすく変わって設定できました。
別のユーザーから何度かSnoozeの設定したユーザーを呼んでみましたがデスクトップやモバイルへ通知されませんでした。
とても静か。

Turn OFFをクリックすれば解除できてAdjust timeから変更できるようです。
また、IDの所に小さく「z」が表示されていて他ユーザーからでもSnooze状態なのがわかるようです。

それとDo Not Disturb scheduleから
![スクリーンショット 2015-12-19 19.29.41.png](https://qiita-image-store.s3.amazonaws.com/0/27949/34ff11a6-25e6-066f-c48a-a775a814500e.png)
自動的に通知が来ない時間を設定することが出来るようにもなっていました。

これらをうまく使えば集中して作業したい時に煩わしい@channelや@hereから開放されるかもしれませんね。

と下書きを終えたら[Slackに気を取られすぎる問題とその解決](http://hogesuke.hateblo.jp/entry/slack-problem)を見つけました。
こちらは未読もなくなるようですので気になる人はこちらの方がいいですね。
Dvorakキーボードについて

Dvorak Advent Calendar 21日目．

-----

## Dvorakキーボードについて

H/Wとして最初からDvorakキーボードを用意できればソフト側の設定は後々気になったところだけやればいいと思いますので，比較的入手し易いDvorak配列のキーボードを紹介します．

- Kinesis
- Type Matrix 格子配列キーボード
- ErgoDox, ErgoDox EZ


### Kinesis Advantage Qwerty/Dvorak

![](http://edikun.ocnk.net/data/edikun/product/KB500USB-QD.jpg)

[Advantage for PC & Mac - Kinesis Corporation » Kinesis Corporation » Where comfort and productivity go hand in hand.](http://www.kinesis-ergo.com/shop/advantage-for-pc-mac/)

$325.00（国内代理店価格 ¥42,480）

[QWERTY/Dvorak Keycap Set - Kinesis Corporation » Kinesis Corporation » Where comfort and productivity go hand in hand.](http://www.kinesis-ergo.com/shop/qwertydvorak-keycaps/)


見た目がアレですが，人間工学デザイン（エルゴノミック）なやつで，腱鞘炎の方もよく使われています．
これに慣れると他のキーボードが触れなくなるとも言われています．
このKinesisシリーズにはDvorak配列のキーボードがあり，キートップにはDvorakとQwertyの両方が印字されているので，
初心者にもオススメです．日本に正規代理店もあり，安心できます．

[Kinesis Advantage Qwerty/Dvorak Switchable, USB, Contoured Keyboard【キネシス コンタードキーボード アドバンテージDvorakモデル】\[KB500USB/QD\]](http://edikun.ocnk.net/product/64)


### TypeMatrix 2030

![](http://www.typematrix.com/images/bepo/2030usb_us_dvorak_703x289.png)

[TypeMatrix and DVORAK](http://www.typematrix.com/dvorak/)

$120

TypeMatrixも見た目クセのあるキーボードですが，キーを覚えやすい格子配列 [要出展] で真ん中に装飾キーがあり
打鍵のし易さをレイアウトレベルで考えられています．

こちらもDvorak初心者にはオススメです

TypeMatrix 2030はQweryとDvorakをキーボードのスイッチで切り替えられるので客先常駐エンジニアなどにもオススメです．

ただ，注意点と言うか個人的感想を…

パンタグラフ式の薄型で携行には良いのですが長時間の打鍵で手指が疲れるので私は使っていません（捨てました）
あと，TypeMatrix 2030にはキートップ印字されたキーボードカバーも売っていますが，表面のゴムが手指に引っ掛かるので全くオススメできません．
キーボード自体のキートップ印字もQwertyかDvorakで選択できますが，迷うようであればQwertyをオススメします． \*



### ErgoDox

![](http://ergodox.org/Images/ErgoDox_001_L.png)

[ErgoDox.org - Home Page](http://ergodox.org/)

上級者向けです．
オープンソースのキーボードになります．本来は各自で部品や工具を調達してはんだ付けしてソースを焼きこんで使います．
キーボードレイアウトを自分で全て設定できるのも強みです．5万前後掛かると思います．
時々，海外ではKitで買えますが，はんだ付けなどのスキルが必要なので中々買えない人も多いと思います．


#### ErgoDox EZ

そこで，最近クラウドファンディング（[Indiegogo](https://www.indiegogo.com/)）で成功したErgoDox EZが良い感じです．


![](https://c1.iggcdn.com/indiegogo-media-prod-cld/image/upload/c_limit,w_620/v1447294843/dm3omkn8mc9ybwk5yeqj.jpg)


[ErgoDox EZ: An incredible mechanical keyboard | Indiegogo](https://www.indiegogo.com/projects/ergodox-ez-an-incredible-mechanical-keyboard#/)

$240 + 送料

ErgoDoxの見た目そのままに（一部改良等を施していますが）安価に完成品が買えるのは非常にありがたいです．

![](https://pbs.twimg.com/media/CWgxGPCUEAAOW2p.jpg)

最近届きました．足は別売りですが，付けた方が絶対いいです（見た目でなく使い勝手の話）
ErgoDox同様にレイアウトを設定して書き込む事ができます（デフォルトはQwertyです）


…他にもいくつかありますが，比較的入手し易く初心者向け？のモノを選んでみました（値段は無視）

-----

\* Qwerty印字のキーボードの方が良い理由：

- 第三者がQwertyで打てる
- Qwerty印字の位置でDvorak配列が覚えられる（Qwertyから乗り換える際に便利）
Java8のコレクション操作

Java8で追加されたメソッドを使用してコレクション操作を行います。
androidだと、RxJavaとRetrolambdaを使用して同じような事が出来るそうです。

####使用するコレクション
`final List<String> names = Arrays.asList("aaa", "bbb1", "bbb2", "c", "d1", "d2", "e");`

# 要素を１つ選択

Optionalを使用することで、このコードを読む人に「結果値が返されない場合がある」ことを明確に示します。
filter()メソッドを使用して、目的のパターンに合致する要素をすべて抜き出し、findFirst()メソッドでコレクションの最初の値を取得します。


```lang:sample.java
public static void pickName (
            final List<String> names, final String startingLetter) {
        final Optional<String> foundName = names.stream()
                                                .filter(name ->name.startsWith(startingLetter))
                                                .findFirst();
        System.out.println(String.format("条件が一致する最初の要素（検索文字:要素） %s: %s", 
        							startingLetter, foundName.orElse("見つかりません")));
    }
```

######Optional
Optionalは、インスタンスが存在しない場合に別の値をセットする使い方の他、値が存在する場合にのみOptionalにラムダ式を実行させることもできます。
`foundName.ifPresent(name -> System.out.println("name: "+ name));`

# コレクションを集約

####合計
mapToInt()メソッドで各要素の文字数を数値に変換し、sum()メソッドで合計します。

```lang:sample.java
System.out.println("コレクションの合計文字数: " + 
    	names.stream()
    		.mapToInt(name -> name.length())
    		.sum());
```

####比較
コレクション内の最も長い名前から、最初の要素が選択されます。
reduce()メソッドは、２つの要素を比較し、その結果を次の要素と比較のために渡すという処理をコレクション内の最後の要素まで繰り返します。

```lang:sample.java
final Optional<String> aLongName = names.stream()
        								.reduce((name1, name2) -> name1.length() >= name2.length() ? name1 : name2);
aLongName.ifPresent(name -> System.out.println(String.format("最も長い名前: %s", name)));
```
######その他のメソッド
sum()以外にもmax()、min()、sorted()、average()などの集約用メソッドが用意されています。

# 要素の結合
大文字に変換し、カンマ区切りで出力します。
map()で変換されたリストでcollect()を呼び出し、Collectorsクラスのjoining()で文字列を結合しています。

```lang:sample.java
System.out.println(
        names.stream()
        	.map(String::toUpperCase)
        	.collect(joining(", ")));
```
hyperでcookieを覚えたリダイレクトに対応させる

この記事は、Rustアドベントカレンダー21日目の記事です。

## はじめに
この記事は、

- Rust 1.5
- hyper 0.6.15
- cookie 0.1
- url

の環境においての説明を行っています。

## hyper

[hyper](https://github.com/hyperium/hyper) は github上で星を1300集めているHTTP通信を行うためのライブラリです。今回はこのライブラリの話をしようと思います。

## hyperでリダイレクト時にCookieが含まれない

hyperを使い、外部に対して通信を行う処理を書いていたのですが、リダイレクトを行う必要がある時にうまくcookieを覚えてくれないことに気づきました。hyper自体にcookieを扱う機能は用意されているのですが、一回のリクエストに対してどんなCookieを与えるか ということであり `Set-Cookie` には対応していないようです。

また勉強不足なのかもしれませんが、現時点において、Githubで[SetCookie](https://github.com/hyperium/hyper/search?utf8=%E2%9C%93&q=SetCookie&type=Code)で検索しても、あまりHITしません。

## Set-Cookie を処理する
hyperでCookieを保持するには、サーバーから送られてきたレスポンスヘッダに含まれる`Set-Cookie`を処理する必要があります。今回はこれを、hyper自体を書き換えず、hyperのラッパーCrateを作成して対応することにしました。

なので正確にはhyperに対応させるのではなく、hyperの管理しているheaderをラッパーCrateが管理し、その際にSet-Cookieを処理するということになります。

```rust
let res = self.client
              .post(url)
              .body(&request_body.to_owned())
              .headers(self.headers.clone())
              .send();
```

上記はhyperの例です。resにはOption<[Response](http://hyper.rs/hyper/hyper/client/response/struct.Response.html)>が返っています。

[Response](http://hyper.rs/hyper/hyper/client/response/struct.Response.html)は、フィールドに、[headers](http://hyper.rs/hyper/hyper/header/struct.Headers.html) を持っています。この[headers](http://hyper.rs/hyper/hyper/header/struct.Headers.html)に含まれる、`Set-Cookie`を抽出し、ラッパーCrateのheadersに上書きすることを繰り返すことで、cookieを覚えさせる事ができます。

## リダイレクトさせる

標準のhyperはデフォルトでリダイレクトに対応していますが、Cookieを覚えてくれないのでhyperのリダイレクト機能をオフにします。

```rust
self.client.set_redirect_policy(RedirectPolicy::FollowNone);
```
リダイレクトポリシーを`FollowNone`にすることで、自動的にリダイレクトしなくなります。

後は、[Response](http://hyper.rs/hyper/hyper/client/response/struct.Response.html)のフィールドのstatusを見て、再帰処理によってリダイレクトを行うと良いです。

```rust
if res.unwrap().status == StatusCode::MovedPermanently || v.status == StatusCode::Found {
}
```

## サンプルコード

ここまでの処理を [サンプルコード](https://github.com/nacika-ins/hyper_ex) にして公開しました。セキュリティリスクをほとんど考えてないので、使用は自己責任でお願いします。また、ライセンスはパブリックドメインです。ご自由にお使いください。
Swiftのメソッド記法をまとめてみた

### 引数・返り値のあるメソッド

```swift
func method(intValue: Int) -> Bool {
    return true
}
method(1)
```

### 引数・返り値がないメソッド

```swift
func method() {
}
method()
```

### 引数が複数あるメソッド

```swift
func method(intValue1: Int, intValue2: Int) {
}
method(1, intValue2: 2) // 2つ目以降の引数にはラベルが必要になる
```

### 引数のラベルを省略する
_を使うとintValue2を省略できます。

```swift
func method(intValue1: Int, _ intValue2: Int) {
}
method(1, 2)
```

### 第一引数もラベル必須にする

```swift
// Swift1.2までは method(#intValue1: Int, intValue2: Int)みたいな書き方もできた
func method(intValue1 intValue1: Int, intValue2: Int) {
}
method(intValue1: 1, intValue2: 2)
```

### デフォルト引数
#### 全ての引数を省略

```swift
func method(intValue1: Int = 0, intValue2: Int = 1) {
}
method()
```

#### 第一引数だけ省略

```swift
func method(intValue1: Int = 0, intValue2: Int = 1) {
}
method(intValue2: 2)
```

#### 真ん中の引数だけ省略

```swift
func method(intValue1: Int = 0, intValue2: Int = 1, intValue3: Int = 2) {
}
method(1, intValue3: 2)
```

### 可変長引数

```swift
func method(intValue1: Int, intValue2: Int...) {
    print(intValue2) // [2, 3, 4, 5]、配列になっている
}
method(1, intValue2: 2, 3, 4, 5)
```

可変長引数はデフォルト値を持てません。

```swift
// 下2つはエラー
func method(intValue1: Int, intValue2: Int... = [1, 2, 3]) {}
func method(intValue1: Int, intValue2: Int... = 1) {}
```

### エラーをthrowし得るメソッド

```swift
enum MyError: ErrorType { case A, B, C }

func method(intValue1: Int, intValue2: Int) throws {
    throw MyError.A
}
try? method(1, intValue2: 2)
```

### 参照渡し

```swift
var intValue = 1
func method(intValue1: Int, inout intValue2: Int) {
    intValue2 = 2
}
method(1, intValue2: &intValue)
print(intValue) // → 2
```

### カリー化
残念ながらSwift3からはなくなってしまうみたいです。

```swift
func method(intValue1: Int)(intValue2: Int) {
}
method(1)(intValue2: 2)
```

### 引数の遅延実行(@autoclosure)

```swift
func method(intValue1: Int, @autoclosure intValue2: () -> Int) {
    intValue2()
}
method(1, intValue2: 2)
```

autoclosureはこちらで詳しく書いてみました。
[autoclosureというマニアックで少し面白い機能](http://qiita.com/shimesaba/items/b1baced2ec3d9244b2c9)

### Genericsを使ったメソッド
Genericsを使えばメソッドに好きな型の値を入れる事ができます。

```swift
func method<T>(value: T) {
    print(value)
}
method([1, 2, 3])
method("String")
```

Protocolを使って制限をかける事ができます。

```swift
func method<T: CollectionType>(value: T) {
    print(value)
}
method([1, 2, 3]) 
method("String") // → エラー
```

whereを使っても同じ結果になります。

```swift
func method<T where T: CollectionType>(value: T) {
    print(value)
}
method([1, 2, 3])
```

### 引数にブロックを渡す

```swift
func method(intValue1: Int, block1: () -> Int) {
}
method(1, block1: { return 1 })
```

最後の引数がブロックの場合はブロックを()の外に出せます。

```swift
func method(intValue1: Int, block1: () -> Int) {
}
method(1) { return 1 }
```

引数がブロック1つの場合は()も省略できます。

```swift
func method(block: () -> Int) {
}
method { return 1 }
```

### エラーを投げ得るブロックを引数にする

```swift
enum MyError: ErrorType { case A, B, C }

func method(block: () throws -> Int) {
}
method {
    throw MyError.A
    return 1
}
```
Elasticsearch2.xのAggregationの概要まとめ

##目次
- Aggregation 2.x
- Metrics Aggregations
- Bucket Aggregations
- Pipeline Aggregations
- まとめ
- おまけ

##Aggregation 2.x
インデックスに対して検索を行うと検索条件に一致したドキュメントの集合「hits」が得られます。hitsに含まれるドキュメントが持つ情報を集計するのがaggregationの機能です。[公式のドキュメント](https://www.elastic.co/guide/en/elasticsearch/reference/2.1/search-aggregations.html)(執筆時点で2.1が最新)ではMetrics Aggregations, Bucket Aggregations, Pipeline Aggregationsの3種類に分類されています。

今更ではあるのですが、私はこれまでなんとなく使っていただけだったので全体像をイメージできるようにまとめておこうと思います。

##Metrics Aggregations
「それぞれのドキュメントが持つ**値**を**集計**する」というような説明になっています。

- 値：それぞれのドキュメントのfieldに格納された値、もしくはscriptingによって生成された値 
- 集計：最大値、最小値、合計など、それぞれのaggregationによって異なる

[scripted metrics aggregation](https://www.elastic.co/guide/en/elasticsearch/reference/2.1/search-aggregations-metrics-scripted-metric-aggregation.html)のドキュメントがそのものズバリなのですが、集計処理というのはMapReduceに相当する処理がされているようです。分散して保持しているデータを集計するので当然ではあるのですが、ドキュメントのlistに対してmap関数、reduce関数を適用する処理であると理解しておくのがわかりやすそうです。

- 値：document_idからfieldの値(もしくはscriptingの結果)へのmap関数により取得
- 集計：値を集計するreduce関数


##Bucket Aggregations
公式ドキュメントには「値を集計するのではなく**buckets of documents**を作成する」とあります。bucketというのは特定の条件で絞り込まれたドキュメントの集合であり、hits(検索結果のドキュメント集合)の部分集合になります。時系列データをkibanaで可視化している人にはお馴染みのdate histogram aggregationは```timestamp```などの値が特定の範囲にあるドキュメントをbucketとして纏めあげています。
bucketを作るだけで集計はまた別になるのですがbucket aggregationに属するaggregationでは基本的にはbucketに含まれるドキュメントの数を返しているようです。

```hits(document list) -> bucket list -> doc_count list```

bucketがhitsの部分集合であるということは、hitsと同様にbucketに含まれるドキュメントを対象にaggregationを行うこともできるということになります。それが```sub aggregation```と呼ばれているものになります。

一方、bucket listに対して(bucketを単位として)Map/Reduceの処理を行うのが```pipeline aggregation```です。

- bucket内でaggregation：sub aggregation
- bucket間でaggregation：pipeline aggregation



##Pipeline Aggregations
bucket aggregationで得られたbucket listに対してaggregationを行うもので、```parent pipeline aggregation```と```sibling pipeline aggregation```の2種類があります。
bucket listを受けてもう一度bucket listを返すのが```parent```で、Reduce処理された値を返すのが```sibling```ということのようです。

- parent pipeline aggregation：bucket list -> bucket list
- sibling pipeline aggregation：bucket list -> value

Elastic{on} Tour Tokyoでもチラっと紹介されていた```derivative aggregation```はbucket間の増分を算出する```sibling pipeline aggregation```です。階差数列をイメージするとわかりやすいのですが、数列(bucket list)を受けてまた数列(bucket list)を返す構造になります。
おそらく[この記事](https://www.elastic.co/blog/out-of-this-world-aggregations)で紹介されていたものだと思います。時系列順の**距離データ**に```derivativea aggregation```を使うことで**速度(距離の増分)**を算出し、さらにもう一度使うことで**加速度(速度の増分)**を出す、という例でした。

もう1例として、```date histogram aggregation``` > ```avg aggregation```というsub aggregationの結果を```max bucket aggregation```に繋いだ場合、**指定した値の平均値が最も高い期間(とその値)**が得られます。こちらはbucket listを受けて値を返す```parent pipeline aggregation```です。

##まとめ
図解も使用例もない記事になってしまいました。advent calendarの記事ではありますが、できればこれからも加筆していければ良いなと思っています。来年はソースコードを読みながらElasticsearchとLuceneの理解を深めるのが目標です。

##[おまけ] Elastic{on} Tour Tokyoの感想を少々

####Senseを使おう
大谷さんが説明されていたものですが、あまり使っている人がいなかったようですね。超便利なので使える環境にいるのであればすぐにでも導入しましょう。世界が変わります。

####検索の速度について
基調講演を聞いていて、shay氏は検索の速度に強いこだわりがあるのだと感じました。また、Goldman SachsのIan Maclean氏が発表の中で「処理速度が上がったことで、新しいアイデアが生まれた」と言っていたのが印象に残っています。速度というのは量的な変化ではなく、時に質的な変化をもたらすのだということを心に留めておこうと思っています。
「マネージャー」という名の答えがない仕事のための読書

最近はマネージャーをやらせていただいていて、会社でコーディングをやれていません。危機感を感じる毎日ですが、プライベートで自分のサービスを作っています。来年はクラウドソーシングでもう何個かサービスを作ってやります。

そこで、私にとってのみなさんがやっている「プログラミング」と同義なコトとは何か？を考えてみる。・・・よくわからない。自分が何に貢献しているかを考えると、うーんでなります。思い出してみると、常に色々なことを考え続けていて、読んでる本も多様になってきました。今はポエムしか書けないですね。

人や組織と対峙するということは、それこそカオス、感情や苦しみに対して答えのない質問に答え続けることになります。ほぼうまくいかない。成功の定義も曖昧。でも続けていくと変化はする。そのなかで何をするのか？もう考え続けるしかない。

だから本を読む。自分以外が体験していること、経験していることを取り込む。ノウハウとして蓄積するというよりは、ビーカーに入っている青い色の水に、違う色の水をスポイトで入れて、多様でかつ違う色に水を変化させるイメージ。ということで、ここ最近読んだ本を紹介してみる。

- [シンギュラリティ大学が教える飛躍する方法-ビジネスを指数関数的に急成長させる](http://www.amazon.co.jp/dp/B013DKMNPI)
 - 日本企業は営業文化が強く、積み上げで業績を上げようとしますが、例えばGoogleのような企業は組織の作り方の発想が違い、予測不可能な前提で組織を作っていく、という話し。こういう会社で働きたい。
- [はじめてのリーダー論](http://www.amazon.co.jp/dp/B00GSRFU8G)
 - 思い返すと初めてではない感じはしますが、体系的に書いてあり、わかりやすかったです。リーダーというのは、資質も大きいでしょうが、考え方や姿勢を変え、スキルとも言えると思います。私は資質が無いので、学ぶことが必要です。
- [人生を変える言葉2000](http://www.amazon.co.jp/dp/479162324X)
 - 多分、時期によって刺さる言葉が変わりそう。いい言葉がたくさんあるが、ちょっと多すぎるかな。。。読みにくい。
- [新しい道徳](http://www.amazon.co.jp/dp/4344028155)
 - ビートたけしさんの本。道徳なんて教えるもんじゃない、みたいな話し。押し付けるもんじゃないと。そう思う。
- [コーチングの基本](http://www.amazon.co.jp/dp/4534045832)
 - これも体系的に書いてあり、わかりやすい。一つ一つを少しずつ現場に活かしていきたい。答えは必ず自分の中にある。他人から与えられるものじゃないと思う。
- [21世紀のビジネスにデザイン思考が必要な理由](http://www.amazon.co.jp/dp/4844374214)
 - この本はとても良かった。複雑で答えがない世の中、どう考えればいいかの入り口となっている。左脳から右脳へ。ロジカルに組み立てるだけではなく、全体から答えを出していく。物事が複雑すぎて、ロジカルだけでは限界がある。行ったり来たりが必要だと思う。
- [まずルールを破れ](http://www.amazon.co.jp/dp/4532148677)
 - これは本質的。わかるよわかる！でもそんなことやったら困難だらけや！と思いつつ、やらないと意味なし。ルールは変えられないという思い込みを突破しよう。
- [世界で戦うプロダクトマネージャーになるための本](http://www.amazon.co.jp/dp/4839951772)
 - リアルな話も多くて良かった。PMはコンピュータサイエンスを学んでるべき、という言葉が多くのことを語っていると思う。
- [チームが機能するとはどういうことか](http://www.amazon.co.jp/dp/4862761828)
 - 言わずもがな。3回目読書中。これは絶対読まないと。飛躍する方法とも繋がるが、答えがなく複雑な問題に対峙するには、チームの作り方を変えないと成果には近づけない。同感なんだけども、組織的には難しいんだな、これが。日本はこの考え方で組織運営をしている会社が本当に少ないのではないだろうか。
- [リーダーシップからフォロワーシップへ-カリスマリーダー不要の組織づくりとは](http://www.amazon.co.jp/dp/4484092042)
 - これもかなりおすすめ。答えがなく複雑な問題に対峙するには、フォロワーシップだと思う。難しいけども挑戦しがいがある。なんか同じ言葉を何度も言ってるな。。。
- [ユーザビリティエンジニアリング](http://www.amazon.co.jp/dp/4274214834)
 - これはヒアリングをするために読んだ本。体系的なノウハウがまとめられている。
- [Wabi-Sabi わびさびを読み解く](http://www.amazon.co.jp/dp/4861009138)
 - わびさびの精神的価値（万物は無常である、万物は不完全である、万物は未完成である）、これってアジャイルとかリーンの考え方じゃないですか？日本人の感覚って先進的だと思う。あ、そもそも日本の考え方が源流の一つでもありますね。
- [昭和史](http://www.amazon.co.jp/dp/4582766714)
 - これは…。日本人が今も昔も全然変わってないという話で興味深い。二度とこうならないためには、「世間」でなく「自分の考え」で動く人が増える必要がありそう。

結構読んでるなと思うと同時に、偏ったジャンルだなと思った。これはあまり良くないですね。毎日正解が見えない中、一つ一つの判断をするためには、もっと多くの考え方に触れねばならぬ。今まで失敗もたくさんしてきた。少しでも組織を良くしたい。成果を出したい。仲間たちがコーディングして価値を出しやすい環境を作っていきたい。常に向上、でも一歩一歩ですね。

この内容、プログラミングとは関係ないよね。消される気がする。消されたらごめんなさい。とりあえずアドベントカレンダー向けに書いてみました。
Rails5.0betaを使ってみた

[rails 5.0betaが出た](http://weblog.rubyonrails.org/2015/12/18/Rails-5-0-beta1/)そうなので、手元のプロジェクトに入れてみた。
当然動かなかったわけだけど、同じようなことをやってみたい人はいると思うので手順をメモ。

# 手順

```shell-session
[mogya@hoge]$ rbenv install 2.2.2
[mogya@hoge]$ rbenv local 2.2.2
[mogya@hoge]$ ruby -v
ruby 2.2.2p95 (2015-04-13 revision 50295) [x86_64-darwin15]
```

Gemfileを書き換える

```diff
diff --git a/Gemfile b/Gemfile
index 4c00c20..6d29c4d 100644
--- a/Gemfile
+++ b/Gemfile
@@ -1,6 +1,6 @@
 source 'https://rubygems.org'

-gem 'rails', '4.2.1'
+gem 'rails', github: "rails/rails"
 gem 'dotenv-rails'
```

update

```shell-session
[mogya@hoge]$ bundle update
Using rake 10.4.2
:
Installing eventmachine 1.0.8 with native extensions

Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

    /Users/daisuke/.rbenv/versions/2.2.2/bin/ruby -r ./siteconf20151220-46706-19pf4dk.rb extconf.rb
checking for rb_trap_immediate in ruby.h,rubysig.h... no
checking for rb_thread_blocking_region()... no
:
creating Makefile

make "DESTDIR=" clean

make "DESTDIR="
compiling binder.cpp
In file included from binder.cpp:20:
./project.h:116:10: fatal error: 'openssl/ssl.h' file not found
#include <openssl/ssl.h>
         ^
1 error generated.
make: *** [binder.o] Error 1

make failed, exit code 2

Gem files will remain installed in ~/hoge/vendor/bundle/rails5/ruby/2.2.0/gems/eventmachine-1.0.8 for inspection.
Results logged to ~/hoge/vendor/bundle/rails5/ruby/2.2.0/extensions/x86_64-darwin-15/2.2.0-static/eventmachine-1.0.8/gem_make.out
```

[ruby - gem eventmachine fatal error: 'openssl/ssl.h' file not found - Stack Overflow](http://stackoverflow.com/questions/30818391/gem-eventmachine-fatal-error-openssl-ssl-h-file-not-found)

```shell-session
[mogya@hoge]$ bundle config build.eventmachine --with-cppflags=-I$(brew --prefix openssl)/include
[mogya@hoge]$ bundle update
Fetching git://github.com/rails/rails.git
Fetching gem metadata from https://rubygems.org/.........
Fetching version metadata from https://rubygems.org/...
Fetching dependency metadata from https://rubygems.org/..
Resolving dependencies...................................................
:
Installing eventmachine 1.0.8 with native extensions
:
Installing rspec-rails 3.1.0 (was 3.4.0)
:
Using devise 3.5.3
Using rails 5.0.0.beta1 (was 4.2.1) from git://github.com/rails/rails.git (at master@b691d62)
:
Bundle updated!
```

インストール完了。

# 走らせてみる

```sh
[mogya@hoge]$ bundle exec rspec
DEPRECATION WARNING: alias_method_chain is deprecated. Please, use Module#prepend instead. From module, you can access the original method using super. (called from <class:RouteSet> at ~/hoge/vendor/bundle/rails5/ruby/2.2.0/gems/devise-3.5.3/lib/devise/rails/routes.rb:27)
DEPRECATION WARNING: Accessing mime types via constants is deprecated. Please change `Mime::HTML` to `Mime[:html]`. (called from <class:Request> at ~/hoge/vendor/bundle/rails5/ruby/2.2.0/gems/web-console-2.2.1/lib/web_console/request.rb:7)
:
```

Deviceが対応していないらしい。そりゃまあそうだよね。

git見ると[rails5対応のブランチ](https://github.com/plataformatec/devise/pull/3714)がスタートしてるっぽいけど、この調子で依存ライブラリ全部見ていくのは流石に辛いのでいったん撤退。
HTTP/2　簡易まとめ

[WEB+DB PRESS Vol.89](http://gihyo.jp/magazine/wdpress/archive/2015/vol89) から抜粋

##理想のHTTPプロトコル
- 使用可能なバンド幅を100%使い切る
- CSS,JavaScriptといったWebページのレイアウトに不可欠なファイル群（ブロッキングアセット）を最優先で配信する
- レイアウト完了後に描画してもよい画像のようなアセットファイル（ノンブロッキングアセット）については、ブロッキングアセットのあとに配信する

##HTTP/2の技術要素
- 多重化
- 並行リクエスト数の上限
- ヘッダ圧縮
- 優先度制御
- サーバープッシュ   

これらにより理想的なプロトコルを実現している。

## その他
- gRPC: HTTP/2をベースとしたRemoteProcedureCall
- QUIC: HTTP/2の各フレームをUDPパケットとして送受信する。TCPより安定する。
1関数だけexportする場合の.d.tsファイルの書き方

Visual Studio Codeを使ってJavaScriptだけ書くつもりだったのですが、TypeScriptの型情報があればIntelliSenseも便利に使えるということで、npmで使おうとしたモジュールに`.d.ts`ファイルを用意してみることにしました。ただ、正しく動作させる方法がわからず、見様見真似で動くものにした、という感じです。

# 使ってみたnpmモジュール
また例によってパズルソルバーを作っていたのですが、その過程で「タテヨコにつながったマスの範囲」を調べる必要が出てきました。どこかに適当なライブラリはないかと探してみると、[n-dimensional-flood-fill](https://www.npmjs.com/package/n-dimensional-flood-fill)というのが見つかりました。

これは、`require`すると、**1つの関数**が現れます。そして、そこにオプションを指定すると、返り値としてつながったものの座標の配列が来る、という流れになっています。

# 型宣言を作ってみる
まずは、引数と返り値の型宣言をしてみましたが、こちらはすんなり書けました。

```ts:引数の型宣言
interface NDimensionalFloodFillOptions<T>{
	/**
	 * function getting a value from specified position.
	 */
    getter: (...position: number[]) => T;
	/** 
	 * initial position for flooding
	 */
    seed: number[];
	/**
	 * a callback called when one cell is flooded. (optional)
	 */
    onFlood?: (...position: number[]) => any;
	/**
	 * a callback called when one cell is marked as boundary. (optional)
	 */
    onBoundary?: (...position: number[]) => any;
	/**
	 * a callcack deciding whether two cells are equal.
	 * default: comparison by ===
	 */
    equals?: (arg1: T, arg2: T) => boolean;
	/** true if floodable to diagonal cells. (default: false) */
    diagonals?: boolean;
}
```

なお、`getter`で取ってくるものと、`equals`で比較評価するものは同じ型のはずなので、`<T>`でジェネリクスとしています。また、`on***`の返り値は特に使わないので、チェック不要ということで`any`としています。

```ts:返り値の型宣言
interface NDimensionalFloodFillResult{
    flooded: number[][];
    boundaries: number[][];
}
```

「`n`次元」という処理内容の都合上、一部の配列の要素数は同じと決まってくるのですが、それをTypeScript上で表現する方法は見つかりませんでした。

# エクスポートするものの宣言…どうする？
そして、本題の関数について宣言してみるとこんな感じになります。

```ts:関数の宣言
declare function floodFill<T>(options: NDimensionalFloodFillOptions<T>) : NDimensionalFloodFillResult;
```

ところが、これをモジュールでエクスポートしようとするとさあ大変でした。コンパイルが通らないとか、モジュールから直接関数にならずに、`.floodFill`として置かれてしまうなど、なかなかうまく行きませんでした。結局、関数である`$`をエクスポートしているjQueryの定義ファイルを参考に、関数でなくインターフェースとして用意してみることにしました。

```ts:とりあえずこんな形に
interface NDimensionalFloodFillFunction{
	<T>(options: NDimensionalFloodFillOptions<T>) : NDimensionalFloodFillResult;
}

declare var floodFill: NDimensionalFloodFillFunction;

declare module "n-dimensional-flood-fill"{
    export = floodFill;
}
```

とすることで、とりあえずVisual Studio Codeでは使えるようになりました。ただ、この宣言だとグローバルに`floodFill`がいるということになってしまって、その不都合は残ったままとなっています。
Go言語でサーボモータをキュイキュイ動かす


[Goその2アドベントカレンダー](http://qiita.com/advent-calendar/2015/go2)の記事です。

こんにちは、 @n0bisukeです。
前回GoでIoTっぽいことしてる記事を書きました。([GoからBLE制御でPLAYBULB Candleの操作をしてみる](http://qiita.com/n0bisuke/items/d3966b11b2e9143d6651))

今日はGobotを使ってArduinoをGo言語で制御してサーボモータを回してみます。
(ちなみにタイトルは参考サイトの表現を真似しています笑)

## 環境

僕の環境はこんな感じです。

* Arduino uno
* サーボモータSG90
* Go1.5
* Mac OSX 10.10

### サーボモータSG90
1個400円です。 http://amzn.to/1kaoapq
![](https://i.gyazo.com/8f03fb5931b05f8d0b16ec728144f32d.png)


参考記事を元に線をつなげてみます。

* 茶色: GND
* 赤: 電源
* 黄: 信号

ということなので、Arduino側には

* 茶色: GND
* 赤: 5v
* 黄: DIGITAL 3ピン (任意の箇所でOKです)

こんな感じでつなげます。

> 参考: [Arduinoでサーボモータをキュイキュイ動かす！](http://marupeke296.com/EL_Ard_No9_ServoMotor.html)

### 接続イメージ

Mac ---(USB)--> Arduino -----> SG90

![](https://i.gyazo.com/bd3067d32ac8323ed34ac2744cbd137b.png)

こんな感じの接続の仕方になります。

## Gobotでサーボモータ制御

[こちら](http://gobot.io/documentation/drivers/servo/)にサンプルが載っています。

```bash
$ go get github.com/hybridgroup/gobot && go install github.com/hybridgroup/platforms/gpio
```

go getとinstallをしておきましょう。

### MacとArduinoの接続ポートの確認

```
$ ls /dev/tty.*
/dev/tty.Bluetooth-Incoming-Port
/dev/tty.n0bisuke-WirelessiAP
/dev/tty.Bluetooth-Modem
/dev/tty.usbmodem1411
/dev/tty.Sphero-RRY-AMP-SPP
```

ここに出てくる`/dev/tty.usbmodem1411`が怪しいですね。この1411などの数字は自分の環境に合わせてください。サンプルで`"/dev/ttyACM0"`となってる部分を各自の環境に合わせて変更します。

### servo.go

`gpio.NewServoDriver(firmataAdaptor, "servo", "3")`の3はピンの番号です。
サンプルでは3となっているので、そのまま3番ピンにSG90から伸びているオレンジ色の線をつなげてあげます。

```servo.go
package main

import (
  "fmt"
  "time"

  "github.com/hybridgroup/gobot"
  "github.com/hybridgroup/gobot/platforms/firmata"
  "github.com/hybridgroup/gobot/platforms/gpio"
)

func main() {
  gbot := gobot.NewGobot()

  firmataAdaptor := firmata.NewFirmataAdaptor("firmata", "/dev/tty.usbmodem1411")
  servo := gpio.NewServoDriver(firmataAdaptor, "servo", "3")

  work := func() {
    gobot.Every(1*time.Second, func() {
      i := uint8(gobot.Rand(180))
      fmt.Println("Turning", i)
      servo.Move(i)
    })
  }

  robot := gobot.NewRobot("servoBot",
    []gobot.Connection{firmataAdaptor},
    []gobot.Device{servo},
    work,
  )

  gbot.AddRobot(robot)
  gbot.Start()
}
```

これでOKです。
あとは実行しましょう。

```bash
$ go run servo.go
```

こんな感じで毎秒ランダムにモーターが回るのが確認できると思います。
![](https://i.gyazo.com/070816ec36558d953ef28c5c347bc280.gif)

##まとめ

GPIO制御が出来ると可能性広がりますね。
何気にサーボモータを操作したのは他の言語とか含めて初めてです。
(今まではセンサー類しか使ってなかった)

結局何を作るか考えてないのでアイディア募集します笑
それでは :)
Rubyで標準入力を扱う方法（テストしやすさ重視）

PaizaやCodeIQのようなコードを書いてアピール出来る系の転職サイトが流行ってますね。
あまり社外にアピールできるような実績もないエンジニアとしては、ぜひとも活用していきたいところ。

この手のサイトのパターンとして、標準入力を読ませて、処理結果を返す、というのが一般的のようです。
入力が数値一つだけなら簡単なのですが、複数行出てくる場合の対応方法とテスト方法をメモしておきます。

# 標準入力を読みこませる

これは何を使ってもいいと思うのですが、

STDIN, $stdin, gets etc...

私はこうしてます。

```rb
args = $stdin.readlines.map{|s| s.chomp!}
```

すると、テストデータを

```
args = ["4", "0 0 1 0", "0 1 1 0", "0 1 0 1", "1 1 1 0", "3", "0 1 1", "0 1 0", "1 1 1"]
```

こんな感じで用意できます。

もっとスマートな定石があったらどなたか教えてくれると嬉しいです。
サイトに載ってる標準入力のサンプルがアレだったので。。。
新 HP Stream11にLinux（Xubuntu）インストール

Qiita初投稿です。

手頃な価格と強烈な青色と各種インストール記事に触発されて購入を考えた頃には既にディスコンというイベントに遭遇したのが10月。
その直後にマイナーチェンジしたモデルの発売と、購入するも発送待ちを喰らいながらゲットしたのが12月。
ということで表題作業の備忘録として。
（12/26追記あり）

* 製品情報 →  [Stream 11-r000](http://h50146.www5.hp.com/directplus/personal/notebooks/dp_stream11_r000/ "Stream 11-r000 製品詳細・スペック - ノートパソコン・PC通販 | 日本HP")

# 事前準備

Windowsはつかいません。ということで早速、手元に以下のものを用意

* HP Stream11
* インストールメディア作成機（MacBookAirを使用）
* USBスティック
* インストールに使うISO ([Xubuntu 15.10](http://xubuntu.org/news/release/15-10/ "15.10 « Releases « Xubuntu")) 
* [UNetbootin](http://unetbootin.github.io/ "UNetbootin - Homepage and Downloads")

ターゲットはXubuntuの最新版、15.10。
i386ではなくamd64をダウンロードすること（ここで唯一嵌った）

UNetBootinを起動、ISOを指定してUSBへ展開。
OS XのUnetbootinでUSBスティックがみえない場合は、USBスティックにexFATでボリューム名をFAT32（ここ大事）として作成すればよい模様。

## EFIメモ

EFI機への導入が初めてのため（数年ぶりのLinux）、知らなかったポイントをメモ（間違いがあるかも）。
UEFIはBIOSに代わるシステム機構で基本的には64bit。ただし、一部ハードは32bitのUEFIを持つ。

Linuxの場合、カーネルとの対応関係は以下の通り

* 32bitカーネル： 32bit UEFI
* 64bitカーネル： 64bit UEFI、32bit UEFI（EFI mixed modeというものを使うらしい）

このため、i386でのインストールは断念…

# インストール

下準備さえできていれば特にハマりどころもなく、あっさりと完了

* USBスティックをStream11に刺して起動
* 起動画面でESCキー連打してEFIのメニューへ
* F9でEFIのブート選択画面を表示
* USBがリストに表示されていれば選択
* 以下、お好きなように

インストール完了後にアップデートして更新した状態のカーネルは以下の通り

> 4.2.0-22-generic #27-Ubuntu SMP 

Xubuntuの青いテーマが本体とマッチしてピッタリです。

## （追記）ブート順設定
WindowsのEFI（/dev/mmcblk0p1）を残していた場合、そのままではそちらがブートの優先度が高い。
変更を行うにはBIOS設定画面でUEFI Boot OrderでOSブート設定を選択してF5/F6キーで変更してF10でサブメニューを抜ける。Enterキーではサブメニューを抜けられないし、ESCキーでは変更をキャンセルされるので注意。


# ネットワーク

## WIFI

カーネルバージョンが上がったためか、以前の記事にあるようなトラブルも今のところは特に何もせず接続OK。
詳細を確認すると、旧機種の蟹さん（rtlほにゃほにゃ）ではなくWIFI/BTいずれもintelチップに変更されているようです（ドライバはiwlwifi）。

## BT pan

上記の通り、Bluetoothモジュールもintelチップとなっている模様。
Androidスマホでのテザリング確認済。

DNSのみ反映されない？
→ 最近のネットワーク設定機構を理解していないので暫定で8.8.8.8を設定。解決策探索中 
→ （追記）再度の接続では普通に127.0,1,1でDNSが反映されました。
* [127.0.1.1って何 - DB@WEB](http://dbweb.0258.net/wiki.cgi?page=127.0.1.1%A4%C3%A4%C6%B2%BF "127.0.1.1って何 - DB@WEB")

# その他ハードウェア

## キーボード

上段のファンクションキーは基本的に機能する模様。以下については確認済

* F2：輝度ダウン（最低輝度では非表示になる）
* F3：輝度アップ
* F4：外部出力設定（アプリが起動）
* F6：ミュート
* F7：音量ダウン
* F8：音量アップ
* F12：機内モード

（追記）
fnキーを押さなくともOSからファンクションキーとしてみえるようにする
→ BIOS設定で[Action Keys Mode]をDisabeledに

## タッチパッド

機能に問題はないが、タッチの認識が繊細すぎて意図しないタッチが多発
→ 回避策を探索中

最低限の対策として「マウスとタッチパッド」設定から「タイプ中はタッチパッドを無効にする」にチェック
（「スクロールを反転する」にもチェックするのはos xに慣れてしまった報い……）

# その他ソフトウェア

日本語入力 → インストール時に日本語選択でmozcが導入

# 所感

ハードとして気になるのはタッチパッドの問題のみ。
キー入力もすこぶる快適。
バッテリ持ち等については今後確認していく予定…

# 旧モデルでの参考記事

残念ながら（？）旧モデルでのハマりどころであったネットワーク周りは蟹さんの呪縛から逃れてしまったので、影響ないのですが、これらの記事が無ければ購入しなかったと思いますので、その敬意も込めた参考情報として。

* [Linux - HP Stream 11にAntergosをインストールしてすこぶる快適になっている話 - Qiita](http://qiita.com/ka_/items/146340c995afb43bc5a5 "Linux - HP Stream 11にAntergosをインストールしてすこぶる快適になっている話 - Qiita")
* [HP Stream 11にUbuntuをインストールしてすこぶる快適になっている話 - Qiita](http://qiita.com/ka_/items/671bc04e7ee28c92cdf8 "HP Stream 11にUbuntuをインストールしてすこぶる快適になっている話 - Qiita")
* [まさおのブログ (表): HP Stream 11 に Ubuntu 14.04 LTS (64bit) をインストール](http://masaoo.blogspot.jp/2015/01/hp-stream-11-ubuntu-1404-lts-64bit.html "まさおのブログ (表): HP Stream 11 に Ubuntu 14.04 LTS (64bit) をインストール")
vagrant init からnode.js実行まで

vagrantでCentOSをセットアップし、node.jsを実行する時、
毎回ホストマシンと仮想マシンの共有のところで詰まるのでメモ。

1.仮想マシンを作成するディレクトリを作成
2.ターミナルを起動して1.のディレクトリに移動
3.$ vagrant init
4.Vagrntfileを編集
  # config.vm.box = "base"
  config.vm.box = "puphpet/centos65-x64"
5.$ vagrant up
6.$ vagrant ssh
7.$ curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.25.3/install.sh | bash
8.シェルを再起動
9.仮想マシンに再起動
10.$ nvm install v0.12.4
11.$ nvm alias default v0.12.4
12.nodeのバージョンを確認
   $ node -v
13.$ sudo visudo
14.一つ目の変更点（env_resetを無効に）
   Defaults env_reset
    ↓
   Defaults !env_reset
15.二つ目の変更点（HOMEを追加）
   # Defaults env_keep += "HOME"
    ↓ 
   Defaults env_keep += "HOME"
16.三つ目の変更点（パスを書き換えない）
   Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin
    ↓
   # Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin
17.「:wq」で保存して終了
18.$ sudo yum install git
19.Vagrantfileを編集。設定ファイルの行末にある「end」より上に記述
　　config.vm.network "forwarded_port", guest:80, host:8081
　　config.vm.network "private_network", ip: "192.168.33.10"
20.ホストマシンと仮想マシンでフォルダを共有する
　　config.vm.synced_folder "work/", "/vagrant"
21.$ vagrant reload
   なぜか、# SHELLとの間に１行空行をいれないとエラーになった
22.$ vagrant ssh
23.$ npm install request
24.CentOSにわかりやすいエディターをインストール
   $ sudo yum install nano
25.「~/.bash_profile」を編集
　　$ nano ~/.bash_profile
	---------
	# npmのグローバルインストール先を指定
	export NODE_PATH=/usr/lib/node_modules

	# cronの編集にnanoを利用する
	export EDITOR=nano
	---------
26.work配下に実行ファイルを配置
27.$ vagrant reload
28.$ vagrant ssh
29.$ cd vagrant　で20で共有にしたホストマシンのディレクトリが観れるようになる
CollapsingToolbarLayoutを使ったスクロール時のエフェクトについて


CollapsingToolbarLayoutを使って、スクロール時に[ツールバーの部分が伸縮するようなエフェクト](https://guides.codepath.com/android/Handling-Scrolls-with-CoordinatorLayout#creating-parallax-animations)を実現できる。
しかしながら若干注意点があり、意外と日本語のブログ等には載っていなかったのでメモ。

このエフェクトはRecyclerViewやNestedScrollViewなどの **nested scrolling** が有効な物のみ
正常に動作する。
LayoutクラスやListViewに 

```xml
app:layout_behavior="@string/appbar_scrolling_view_behavior" 
``` 

をつけたところで動いたりはしない。

この情報が抜けているブログが多かったので最初はハマってしまった。
ListViewでも 

```java
ListView#setNestedScrollingEnabled(boolean)
```

でtrueを設定すれば動くが、APIレベルが21と高く、4.x系もサポートしたい場合は
RecyclerViewを使ってリストを実装するしか無いようです。

大体の使いかた自体はググると色々サンプルがでるのでそちらを参照。
App Streamingの紹介＆試してみようとした話

# 概要
- App Streamingについての日本語の記事がほとんどなかったので紹介します
- その名の通り、アプリをストリーミングで使えるようになります
- ついでに試してみようとしましたがうまく行きませんでした :crying_cat_face: 

# App Streamingとは
その名の通り、アプリをストリーミングで使えるようになる代物です。
百聞は一見に如かず、（恐らく）初出であるGoogle Inside Searchブログ[2015/11/18の記事](http://insidesearch.blogspot.jp/2015/11/new-ways-to-find-and-stream-app-content.html)にあるgif画像を見てみましょう。
（gif画像が7.6MBありQiitaには貼れませんでした・・・）

"hotel right now in chicago"と検索すると、Hotel Tonightアプリのリンクがトップに出てきました。
リンクには"Stream"という文字があります。
それをタップすると、Hotel Tonightアプリをインストールしていないにも関わらずアプリが使える（しかもシカゴのホテル一覧を表示してくれる）ではありませんか！
これまではGoogle Playに飛ばされてアプリをダウンロードしないといけなかった上に、起動直後に検索ワードに合致したコンテンツが出てくる訳では無かったので、ユーザー体験は雲泥の差です[^1]。

[^1]: 通信が遅かったら体験も何もあったものじゃないし、何より通信量が凄いことになるじゃないか、と思われるかもしれませんが、今の所は強いWi-Fi接続状態でないと使えません。App Streamingを使える条件の詳細は後述。

# 広告での活用例
上では検索結果でのストリーミングでしたが、活用例をもう一つ紹介しましょう。
広告でApp Streamingを使い、アプリをその場で試してもらうことができます。

（恐らく）初出はGoogle Inside AdWordsブログ[2015/12/3の記事](http://adwords.blogspot.jp/2015/12/trial-run-ads-interactive-interstitials-beta.html)で、これも記事中にgif画像があります。
記事中に3つgif画像がありますが、1つ目がApp Streamingを使った例です[^2]。

[^2]: 記事自体は「新しいインタラクティブ広告について」で、2つ目と3つ目のgifはHTML5を使ったインタラクティブ広告の紹介です。

# 使える条件
App Streaming、凄いですね。今すぐ試してみたいところですが、公式ブログを読む限りいくつか条件があるようです。
また、懸念点もあります。通信が遅かったらユーザー体験の向上も何もありません。何より通信量を馬鹿食いしそうです。

[この辺](http://marketingland.com/google-app-streaming-web-of-apps-152449)や[この辺](http://www.bbc.com/news/technology-34878872)も参照しつつ使える条件をまとめてみます。

- Android 5 or 6
- 強いWi-Fi接続
- 端末の言語設定はEnglish (US)
- アメリカ国内にいる[^3]
- Googleアプリを使う（Chromeじゃ駄目！）
- 現状の対象アプリはHotel Tonightなど数種類のみ
- 対象アプリが端末にインストールされていない

利用条件を「強いWi-Fi接続がある時のみ」とすることで、とりあえず上述の懸念は回避されそうです。

[^3]: どうやらIPアドレスでの判定を意味しているようです。


# 日本からでも使えないか試してみた
日本でApp Streamingが普通に使えるようになるのはまだまだ先のようですが、工夫すれば使えるんじゃないの？と思い試してみました。

- 使う端末はNexus 5, Android 6.0.1です
- Wi-Fiの強度は常に最大を保ちます
- 端末の言語を"English (United States)"にします
- BBCの記事の言う「アメリカ国内にいる」という条件は曖昧なので、とりあえず無視します
- Hotel Tonightが検索結果に出るようにします
 - 上述のgifと同じ"hotel right now in chicago"ではHotel Tonightがうまく出なかったので、"hotel tonight in chicago"で検索しました

まずは上記の条件で試してみます。

<img src="https://i.gyazo.com/e07c06c109392b646d17e9cf7f90a40b.png" width="45%" />

予想通りですがうまく行きません。「アメリカ国内にいる」と判定されていないようです。

今度は、アクセス元のIPアドレスで判定しているんだろうというアタリを付け、Proxyを噛ませてみます。
Google PlayでProxyアプリが沢山あるので、評価の良いものをいくつか試してアメリカのサーバを経由し検索します。

<img src="https://i.gyazo.com/a9cc603b97303b110f93ad267e514255.png" width="45%" />

キター！確かに"Stream"の文字が！早速タップします。

<img src="https://i.gyazo.com/198d13115cd8dc9cba8a6c9d7a4f2569.png" width="45%" />

何・・・だと・・・？
時間を置いてからアクセスすれば使えるかもしれないですが、今の所はどうしようもありません。残念 :cry: 





ファイルの内容を表示


Linux標準教科書読んでまとめる

http://www.lpi.or.jp/linuxtext/text.shtml

# ファイルの内容を表示(cat)
```
cat ファイル名
```

オプション

|オプション| 概要 |
|----------|--------|
| -n       | 行番号を付加して表示 |


## ページャを使った表示

```
more ファイル名
less ファイル名
```

### moreコマンド操作

|操作| 内容 |
|----------|--------|
| スペース       | 次のページに進む |
| b       | 次のページに進む |
| f       | 次のページに進む |
| /単語       | 単語を検索 nキーで次の結果 |
| q      | ページャをコマンドで終了 |

### lessコマンド操作

|操作| 内容 |
|----------|--------|
| スペース       | 次のページに進む |
| b       | 次のページに進む |
| f       | 次のページに進む |
| ↑       | 前の行に進む |
| ↓       | 次の行に進む |
| /単語    | 単語を検索 nキーで次の結果 |
| q      | ページャをコマンドで終了 |
PostifxでDKIM認証する

## プラグインのインストール
```
apt-get install opendkim opendkim-tools
```

## 設定ファイルの修正
```
vi /etc/opendkim.conf
以下が有効になるように修正する。

Syslog                  yes
LogWhy                  yes
UMask                   022
UserID                  opendkim:opendkim
Domain                  メールドメイン
KeyFile                 /etc/postfix/dkim/20151119.private
Selector                maildkim
SOCKET                  inet:8891@localhost
Mode                    sv
OversignHeaders         From
SignatureAlgorithm      rsa-sha256
Canonicalization        relaxed/simple
SigningTable            refile:/etc/postfix/dkim/SigningTable
KeyTable                refile:/etc/postfix/dkim/KeyTable
ExternalIgnoreList      refile:/etc/postfix/dkim/TrustedHosts
InternalHosts           refile:/etc/postfix/dkim/TrustedHosts
```

## inetSocketの追加
```
vi /etc/default/opendkim
SOCKET="inet:8891@localhost" # listen on loopback on port 12345
```

## DKIM鍵の作成
```
mkdir /etc/postfix/dkim

opendkim-genkey -D /etc/postfix/dkim -d メールドメイン -s maildkim
 ※maildkimはSelector名
/etc/postfix/dkim内に「maildkim.private」と「maildkim.txt」が作成される
```

## リストファイルの作成
```
vi /etc/postfix/dkim/KeyTable
書き方
Selector名._domainkey.メールドメイン メールドメイン:Selector名:/etc/postfix/dkim/Selector名.private
例）
maildkim._domainkey.hoge.com hoge.com:maildkim:/etc/postfix/dkim/maildkim.private
```
```
vi /etc/postfix/dkim/SigningTable
書き方
*@メールドメイン     Selector名._domainkey.メールドメイン
例)
*@hoge.com     maildkim._domainkey.hoge.com
```
```
vi /etc/postfix/dkim/TrustedHosts
127.0.0.1
メールドメイン
```

## postfix設定ファイル修正
```
vi /etc/postfix/main.cf
以下を追記する
#-------------------------------------#
# DKIM
#-------------------------------------#
milter_default_action = accept
milter_protocol = 2
smtpd_milters = inet:localhost:8891
non_smtpd_milters = inet:localhost:8891
```

## postfix再起動
```
service postfix restart
```

## DNSへ登録する
### レコード情報の確認
```
cat /etc/postfix/dkim/maildkim.txt
20151119._domainkey     IN      TXT     ( "v=DKIM1; k=rsa; "
          "p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDfPR2a～
```
### 一般的なDNSサーバーへのレコード登録
```
20151119._domainkey.hoge.com	IN	TXT	v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDfPR2a～
_adsp._domainkey.hoge.com	IN	TXT	dkim=unknown
```
フィボナッチ列フラクタル（Mathematicaショートフラクタルシリーズ）

## はじめに

カレンダーの穴が空いてしまったので、
Mathematicaショートフラクタルシリーズを1日限定で復活というか継続します。

## 今回のテーマ

第6回は[フィボナッチ列フラクタル](http://azisava.sakura.ne.jp/math/fibonacci_word.html)。
[フィボナッチ列](https://ja.wikipedia.org/wiki/%E3%83%95%E3%82%A3%E3%83%9C%E3%83%8A%E3%83%83%E3%83%81%E5%88%97)自体マイナーなのですが、それを使ったフラクタル図形で、比較的最近発見されたものなので、文献も少ないです。
ということで、本シリーズのスタメンからは外したのですが、僕自身も研究が浅いながら奥深いのでご紹介します。

さっき見つけたばかりでまだちゃんと読んでませんが、こちらにもMathematicaでの実装が見られます。
[HULINKS | Mathematica ジャーナル | フィボナッチ列フラクタルの性質および一般化](http://www.hulinks.co.jp/mj/mj_1402.html)

## ほぼ完成形

```mathematica:fibonacci_word_fractal.nb
w = Flatten[Nest[{#, #[[1]]} &, {1, 0}, 20]];
ListPlot[{Re[#], Im[#]} & /@ 
  Accumulate[
    Join[
      {0}, 
      I^Accumulate[Join[{1}, w*(-1)^Mod[Range[Length[w]], 2]]]
    ]
  ], 
  Joined -> True,
  AspectRatio -> Automatic
]
```


## 生成過程

```
In[1] := w = Flatten[Nest[{#, #[[1]]} &, {1, 0}, 5]];
Out[1] := {1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1}
```

これでフィボナッチ列が得られます。
[オンライン整数列大辞典のフィボナッチ列のページ](http://oeis.org/A003849)にも同様のMathematicaコードを載せましたが、僕が実装したこのショートコードが功を奏しています。

フィボナッチ列フラクタルのルール（奇数偶数描画規則と呼ぶらしい）をアレンジした

- 0なら直進
- 1で偶数番目なら右折
- 1で奇数番目なら左折

を適用させ、曲がるルール（→偏角）を取得します。

```
In[2] := Accumulate[Join[{1}, w*(-1)^Mod[Range[Length[w]], 2]]]
Out[2] := {1, 0, 0, -1, 0, 0, 1, 1, 2, 1, 1, 0, 1, 1, 2, 2, 3, 2, 2, 1, 1, 0}
```

これを $\frac\pi2$ 倍したのが偏角リストです。

あとは以下のリストをさらに``Accumulate``すれば点列が得られます。

```
In[3] := I^Accumulate[Join[{1}, w*(-1)^Mod[Range[Length[w]], 2]]]
Out[3] := {I, 1, 1, -I, 1, 1, I, I, -1, I, I, 1, I, I, -1, -1, -I, -1, -1, I, I,
  1}
```

## ショートコード化

- ワンライナー化
- ``Accumulate``は``FoldList``に
- 点列の個数はマジックナンバー（``Fibonacci[23] == 28657``）に
- Modなしでも問題なかったので外した

で、121文字の以下のショートコードができました。

```mathematica:fibonacci_word_fractal_short.nb
Graphics[Line[{Re[#],Im[#]}&/@FoldList[Plus,0,I^FoldList[Plus,1,Flatten[Nest[{#,#[[1]]}&,{1,0},20]]*(-1)^Range[28657]]]]]
```

<blockquote class="twitter-tweet" lang="ja"><p lang="en" dir="ltr"><a href="https://twitter.com/butchi_y">@butchi_y</a> (More info: <a href="https://t.co/HBUuaZOB3w">https://t.co/HBUuaZOB3w</a>) <a href="https://twitter.com/hashtag/wolframlang?src=hash">#wolframlang</a> <a href="https://t.co/0WibHKECC2">pic.twitter.com/0WibHKECC2</a></p>&mdash; Tweet-a-Program (@wolframtap) <a href="https://twitter.com/wolframtap/status/678548581721227264">2015, 12月 20</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>


## 明日は

後出しですが、明日はかなりすごいMathematica使いの[Dyunamis](http://qiita.com/Dyunamis)さんです。