OmniAICreator/Qiita-1.07M huggingface dataset:
Consumer-Driven Contracts testingを徹底解説！

この記事は [リクルートライフスタイル Advent Calendar 2016](http://qiita.com/advent-calendar/2016/recruitlifestyle) の14日目の記事です。

## はじめに

みなさんmicroserviceを進めていますか？
リクルートライフスタイルでも徐々にmicroserviceの流れが押し寄せつつあります。
今回はそんなmicroserviceに役立つConsumer-Driven Contract testingというテスト方法について書こうと思います。

本当はライブラリを使って実演までしたかったのですが…この記事の量が多くなってしまい、趣旨がずれてしまうので別の機会に書こうと思います。

## microserviceのテストの問題点

microserviceのテストの問題点についてこれから説明していきます。

まずは複数のmicroserviceでできた以下のようなサービスがあるとします。

<img width="657" alt="スクリーンショット 2016-12-13 16.29.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/110216/eb6be7ef-eafd-daef-edee-913350980cf5.png">

さて、ここでv1というmicroserviceに対してテストをしよう、と考えた場合、どうしますか？
以下のような方法が思いつくと思います。

* 全てのmicroserviceをデプロイしてEtoEテストをする
* 他のサービスをスタブ化して単体テストをする


### 全てのmicroserviceをデプロイしてEtoEテストをする
#### メリット
* 本番同等をテストすることができる
* 本物のmicroservice間の連携をテストすることができる

#### デメリット
* 1つのmicroserviceをテストしたいだけなので、他の全てのmicroserviceとそれに紐づくDBをデプロイする必要がある
* １つのmicroserviceをテストしている間は、他のmicroserviceをテストすることができない
* テスト時間がかかる
* フィードバックが非常に遅い
* デバッグが大変（他のmicroserviceが原因かもしれない。。。）

### 他のサービスをスタブ化して単体テストをする
#### メリット
* フィードバックが非常に早い
* インフラ（インスタンス、デプロイなど）の必要がない

#### デメリット
* 単体テストを正常に終了しても、本番環境（もしくは検証用の環境）にデプロイしたら落ちる可能性がある
* 呼び出し先のmicroserviceに変更があった場合に、変更による影響を単体テストでは検知できない

このようにどちらの方法であったとしても、デメリットが大きく、
実現性がない、もしくはテストが効果的でないという状態になってしまうかと思います。

これらの問題への対策がConsumer-Driven Contract testingになります。

## Consumer-Driven Contract testingとは

Consumer-Driven Contract(以後はCDC）は以下のようにConsumerとProdiverの間で結ぶ契約（Contract）になります。
CosumerがContractを定義し、ProviderはContractを守るようにしなければなりません。

<img width="576" alt="スクリーンショット 2016-12-13 16.19.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/110216/ac025ab7-aa5c-c3b4-1fec-dd5ca172de79.png">

ここでConsumerはサービスを受ける側、Providerはサービスを提供する側になります。
Consumer=client,Provider=serverといいかえることもできると思います。

CDC testingは上記の考えにもとづいたテスト方法で、

1. Conumerは期待するリクエスト/レスポンスをContractとして定義、ConsumerはContractを前提にモック化してテストを実施  
![スクリーンショット 2016-12-13 18.41.41.png](https://qiita-image-store.s3.amazonaws.com/0/110216/360d267e-6dde-f1d4-2340-cea2c8fd10d2.png)  

2. ProviderはConsumerとContractを合意

3. ProviderはContractが守られていることを示すテストを実施  

![スクリーンショット 2016-12-13 18.42.05.png](https://qiita-image-store.s3.amazonaws.com/0/110216/b86c9870-b5a2-f354-2e86-068cec988919.png)


このようにContractを元にテスト実施することで、Consumer,Providerの連携を含めたテストが可能となり、microservice間のテストをフィードバック早く実施できるようになります。

#### ライブラリ
代表的なライブラリに[Pact](https://github.com/realestate-com-au/pact),[Spring Cloud Contract](https://cloud.spring.io/spring-cloud-contract/)などがあります。

#### 補足
CDC testingは、技術トレンドを評価するThoughtWorksの2016年版でAdopt（企業での使用が推奨されることを意味する）とされているぐらい、標準的になりつつあるテスト方法です。
ぜひ使っていってください。
https://www.thoughtworks.com/radar/techniques/consumer-driven-contract-testing

## 参考
http://martinfowler.com/articles/consumerDrivenContracts.html
https://cloud.spring.io/spring-cloud-contract/spring-cloud-contract.html
http://www.slideshare.net/makingx/consumer-driven-contracts-rest-api-m3tech
edeliverとconsulを使ったphoenix applicationのdeploy

[Elixir Advent Calendar 2016](http://qiita.com/advent-calendar/2016/elixir) 14日目です。

現在開発しているphoenixのプロジェクトで使用しているedeliverとconsul+strecherを使ったdeploy構成を簡単に紹介したいと思います。

### [edeliver](https://github.com/boldpoker/edeliver)

edeliverはelixir/erlangで使えるbuild&deployツールです。

build部分はexrmやdistilleryをwrapして、gitを使ったAuto Versioningやupgrade buildサポート機能を提供してくれます。
deploy部分は、buildしたpackageをリリースタイプを指定することで、ローカル保存、S3にアップロード、stagingまたはproduction環境へのdeployなどの動作を実行することができます。
興味が出たら[wiki](https://github.com/boldpoker/edeliver/wiki)にいろいろ書いてあるのでそちらを見るのがいいと思います。

deploy部分はコードを見ると結構思い切りがいい書き方がされているので(褒め言葉)、build部分だけ利用してconsulと組み合わせることでdeployすることにしました。

Versioningは基本的にstop/startやblue/greenで運用しているような環境ではversion更新が問題になることはないのですが、upgradeを実施しようとするとincrementalなVersioningが必要になってきます。
applicationのversionは基本はmix.exsの中に記載して更新しますが、細かいreleaseを何回も行うような環境だと、release branchにマージするたびにversionを更新しないといけません。

edeliverではgitのcommit-countやrevisionを利用して、バージョニングのルールに違反しないようなバージョン番号を発行してbuildに含めてくれます。（[このあたりのルール](http://semver.org/lang/ja/#spec-item-10)を使用)
現在自分たちの環境で使用しているAUTO_VERSIONの設定は

```
AUTO_VERSION="git-commit-count-branch+git-revision"
```
(git-commit-countとgit-commit-count-branchは別物なので注意)

また、upgrade buildを作成するためにはupgrade前のbuildが必要になるのですが、以前の作成時のrevision番号を指定するだけで、2回build作成が走るので時間はかかりますがクリーンな環境からでもupgrade buildを行うことができます。

distilleryを使う場合に`mix release.init`で前もって`rel/config.exs`を作っておく必要があります。
upgrade buildを作成するためにはその内部に

```
environment :plan do
  set include_erts: true
  set cookie: :"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
end
```
で、`include_erts`を`true`にしておく必要があります。

### [consul](https://www.consul.io/) + [stretcher](https://github.com/fujiwara/stretcher)

consulのイベント検出を利用してpull型の配送を行うための組み合わせになります。
詳しく知りたい方は[本家の記事](http://techblog.kayac.com/10_stretcher.html)を参照していただければと思います。

## build + deployの流れ

build処理とdeploy処理にわけて実行しています。

build処理はおおざっぱに言うと、buildして精製物をS3に置く処理になっていて、

1. edeliver用のconfigをビルド環境用のものに取り替える
  + edeliverが.deliver/configが直接読むので、環境ごとに切り替える必要があった
2. S3上に`lock`を取得する
3. S3上から`current_relase`を取得する
  + `current_release`は現在deployされて動いているbuildの情報を記載してあるyml
  + 存在しない場合は`build release`を実行する
  + 存在する場合は`build upgrade`を実行する
4. 作成したビルドをS3にアップロード
5. stretcher用のmanifestファイルを作成してS3に配置
  + start_manifest, restart_manifest, (upgrade_manifest)の3つを前もって作成しておく
6. 作成したビルドのバージョン等を`latest_build`に記載してS3上にupload
7. S3上の`lock`を解放

上記の処理を実行しています。

deploy処理は最新のbuildをappサーバに配布する処理で、start|restart|upgradeのリリースタイプを指定しています

1. S3上の`current_release`、`latest_build`とリリースタイプの組み合わせから整合性をチェック
  + release buildに対してupgradeじゃないかとか、release_buildとversionが変わらないなど...
2. S3上に`lock`を取得する
3. consulにeventを発行
  + リリースタイプに対応するmanifestを一緒に渡してstretcherの挙動を制御しています
4. `current_release`を更新
5. S3上の`lock`を解放

上記のような仕組みでdeployを実行しています。

開発ステージごとにいくつかの共有環境があるので、buildや管理用のファイルはbucketやパスで分離されており、自分の反映したい環境にslackで実行依頼を投げてhubotを介して、jenkins内のdocker containerでbuildとdeployを実行しています

###なんでこんな構成にしたのか

APIをメインとしたリクエストのみの場合、containerを使ったdeployの仕組みをとったほうが容易だと思います。
ただphoenixの一つの魅力であるphoenix channelのsocket接続を切断せずに継続的デプロイを実施したいと考えていて、とりあえず試行錯誤している段階です。

hot deployはやはりまだ試行錯誤している段階で、安定しているとは言えていない状況です。
ただもう少しノウハウ等がたまってきたらまた共有していきたいなと思っています。
Mithril.jsにはCoffeeがよく似合う

こちらはLivesense Advent Calendar 14日目の記事です。

こんにちは！転職ドラフトプロジェクトを担当しております、raamenです。
今更感もありますが、皆さんはjavascriptフレームワークは何を使っていますか？

当プロダクトはMithril.jsを主に使用しています。
Mithril.jsの良さは既に各所で語られているので、今日は1点だけその良さをご紹介したいと思います。

# Mithril.jsってなに？

Mithiril.jsはいわゆる仮想DOMを採用したクライアントサイドjavascript MVCフレームワークです。
MVCとか言ってますがview以外は好きにやれって感じのゆるいフレームワークなので、APIを5個くらい覚えれば動くものが作れます。
細かいことは[日本語サイト](http://mithril-ja.js.org/)でも見といて。

# Coffeeで書くとviewが書きやすい

Mithril.jsのメリットとして何よりも大きく感じているのはこれです。
「CoffeeScriptでViewが書きやすい。特にRails開発者なら制御構造が直感的に書ける」です。
物は試しで「コメントが投稿できて、そのコメントにいいねをつけたり外せたりする」アプリケーションを書いてみます。


```coffeescript
class Comment
  constructor: ->
    @like = false
    @body = m.prop('')
  isLike: ->
    @like
  doLike: ->
    @like = true
  doUnlike: ->
    @like = false
  isValidLength: ->
    1 <= @body().length && @body().length <= 1000

vm = 
  init: ->
    vm.comments = []
    vm.newComment = new Comment
  createNewComment: ->
    m.request(
      # サーバサイドに送信するやつ
    ).then ->
      vm.comments.push @newComment
      vm.newComment = new Comment
  
component = 
  controller: ->
    vm.init()
  view: (ctrl) ->
    m('.comment-list', [
      vm.comments.map (comment) ->
        m('.comment', [
          m('p', comment.body())
          m('.button-group', [
            # コメントもこんな感じで書ける
            if comment.isLike()
              m('button', { onclick: comment.doUnlike.bind(comment) }, 'いいね済み')
            else
              m('button', { onclick: comment.doLike.bind(comment) }, 'いいね')
          ])
        ])
      m('.comment-form', [
        m('textarea', { oninput: m.withAttr('value', vm.newComment.body), value: vm.newComment.body() })
        # 何も書いてなかったり文字数オーバーしてたらボタンを押せなくするぞ
        if vm.newComment.isValidLength()
          m('button', { onclick: vm.createNewComment.bind(vm) }, '投稿する')
        else
          m('button', { disabled: 'disabled' }, '投稿する')
      ])
    ])

m.mount(document.getElementById('app'), component)

```

![capture.gif](https://qiita-image-store.s3.amazonaws.com/0/54564/944d0bcb-5d74-08fb-de72-bb2d769857ee.gif)


流石Mithril.js。MVCフレームワークと言いつつViewModelが出てきてもなんともないぜ。

さて、モデルとかコントローラとかその辺は置いといて、viewを見て下さい。
普段hamlとかslimでviewを書いてる方なら直感的にどう動くかわかると思います。

仮想DOM系のフレームワークは条件分岐や繰返し等の制御構造が独自のディレクティブで分かりづらく学習コストが高かったり、思いっきりロジックを書かなきゃいけなかったりしてシンドイなーと思っていたのですが、coffeeで書くMithril.jsはとても楽だと思います。
モデル部分はcoffeeで書くメリットあんまりないのでes6併用で書くのをおすすめです。

導入も学習もviewの記述も簡単だけど強力なので、興味をお持ちになられましたら、一度使ってみて下さい。

# おまけ

ちなみに使ったAPIは以下の5つだけ。学習コスト低い！

* m
* m.mount
* m.withAttr
* m.prop
* m.request
digisparkでサーボを動かす

2021.1.24: 引っ張り出して来て触ってみた

200円ほどでamazonで買ったdigispark でサーボを動かしてみる。

## 方針

- fast pwm modeを使ってみる
[参考](http://www.re-innovation.co.uk/web12/index.php/en/blog-75/305-fast-pwm-on-attiny85)
- PB0とPB1で２つのサーボを制御する
- attiny85のTimer0を使う
- PB0: OC0A, PB1: OC0B
- clock 16MHzなのでPWMの周期は16000000/1024/256=61Hz(16.4ms)になる
(一般的なサーボの駆動は50Hz(20ms))
- サーボへのパルス幅は1.5±0.5msなので、制御可能なレジスタの値は24±8

　　-> 実制御して確認したら8〜36までは動いた（150度くらいの変域になる）

(ヌルヌルとは動かない、周期を短くしてもサーボが動くならば細かくできるけど、、、今後の課題)

## 材料

- [digisparkのバッタモン](https://www.amazon.co.jp/HiLetgo-Digispark-Kickstarter-ATTINY85-%E8%B6%85%E5%B0%8F%E5%9E%8BArduino%E4%BA%92%E6%8F%9B/dp/B00VM5M4W4) (動かなかったのでチップ交換して最新のmicronucleusを焼いてある)
![IMG_5658.JPG](https://qiita-image-store.s3.amazonaws.com/0/92080/ab2afebc-49ea-e5c6-e509-5a7bd4f21185.jpeg)

- [小型サーボ TG9e](https://www.amazon.co.jp/Turnigy-TG9e-1-5kg-0-10sec-%E3%83%9E%E3%82%A4%E3%82%AF%E3%83%AD%E3%82%B5%E3%83%BC%E3%83%9C/dp/B00VL70FMO)
  - 赤:VCC -> 5V
  - 茶:GND -> GND
  - 橙:PWM -> P1につなぐ

### 注意点

- MacBook Mid 2009 (El Captin) + Arduino 1.6.13ではUSB Hubを使わないと書き込みができなかった
  -> USB延長ケーブルを使えば認識できそう
- Edison(ubilinux)ではudev ruleを追加しないといけない [参考](https://digistump.com/wiki/digispark/tutorials/linuxtroubleshooting)
(追加しておかないと、arduino IDEでもmicronucleusでもうまくいかない)
- delay()は使えないので、

```
#include <until/delay.h>
#define F_CPU 16000000
...

_delay_ms(1000);
```
を使う

- pinMode(1, OUTPUT)が必要

## レジスタの設定
- TCCR0A
  - COM0A = 2 (fast pwm mode, OC0A enable)
  - COM0B = 2 (fast pwm mode, OC0B enable)
  - WGM0 = 3 (fast pwm mode, 0xFFで1周期)
- TCCR0B
  - WGM02 = 0 (fast pwm mode, 0xFFで1周期)
  - CS0 = 5 (プリスケーラ 1024)
- OCR0A :
  PB0の出力のdutyを設定
- OCR0B :
  PB1の出力のdutyを設定

## ソースコード
``` :ino
#include <avr/io.h>
#include <util/delay.h>

#define F_CPU 16000000

#define COM0A 6
#define COM0B 4
#define WGM0 0
#define WGM02 3
#define CS0 0

void setup() {
  // put your setup code here, to run once:

  /*
    TCCR0A
        COM0A = 2 (fast pwm mode, OC0A enable)
        COM0B = 2 (fast pwm mode, OC0B enable)
        WGM0 = 2 (fast pwm mode, 0xFFで1周期)
    TCCR0B
        WGM02 = 0 (fast pwm mode, 0xFFで1周期)
        CS0 = 5 (プリスケーラ 1024)
   */
  
   TCCR0A = (2 << COM0A) | (2 << COM0B) | (3 << WGM0);
   TCCR0B = (0 << WGM02) | (5 << CS0);
    
   pinMode(0, OUTPUT);
   pinMode(1, OUTPUT);
}

void loop() {
  // put your main code here, to run repeatedly:

  OCR0B = 16;
  _delay_ms(2000);

  OCR0B = 24;
  _delay_ms(2000);
  
  OCR0B = 32;
  _delay_ms(2000);

  OCR0B = 24;
  _delay_ms(2000);
}
```
さくっとバイナリ配布できるmemcachedを作る

## バイナリ配布したい

CentOS6をminimal(最小構成)でインストールした状態で使える memcached 欲しいですよね。
さくっとバイナリ配布したい。

そのビルド方法です。（以下、2016/12/13現在の話です)

## yumで入るmemcachedの依存関係

```
# ldd /usr/bin/memcached
	linux-vdso.so.1 =>  (0x00007fffab5ff000)
	libevent-1.4.so.2 => /usr/lib64/libevent-1.4.so.2 (0x00007f7ee6219000)
	libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f7ee5ffc000)
	libc.so.6 => /lib64/libc.so.6 (0x00007f7ee5c67000)
	libnsl.so.1 => /lib64/libnsl.so.1 (0x00007f7ee5a4e000)
	librt.so.1 => /lib64/librt.so.1 (0x00007f7ee5846000)
	libresolv.so.2 => /lib64/libresolv.so.2 (0x00007f7ee562b000)
	/lib64/ld-linux-x86-64.so.2 (0x00007f7ee6441000)
```

`libevent` 以外は minimalに含まれますね。では libenvetだけ static linkしましょう。

## libeventを disable-sharedでビルド

https://github.com/libevent/libevent/releases から `v1.4.x`の最新をとってきます。

```
wget -O- https://github.com/libevent/libevent/archive/release-1.4.15-stable.tar.gz|tar xvfz -

cd libevent-release-1.4.15-stable
./autogen.sh
./configure --disble-shared
make
```

## memcachedをビルド

http://memcached.org/ からソースを取ってきます。

```
wget -O- http://www.memcached.org/files/memcached-1.4.33.tar.gz | tar xvfz -

cd memcached-1.4.33
./configure --with-libevent=../libevent-release-1.4.15-stable/.libs
make
```

## できた！

```
# ldd ./memcached
	linux-vdso.so.1 =>  (0x00007fffc33ff000)
	librt.so.1 => /lib64/librt.so.1 (0x00007f8e073b6000)
	libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f8e07198000)
	libc.so.6 => /lib64/libc.so.6 (0x00007f8e06e04000)
	/lib64/ld-linux-x86-64.so.2 (0x00007f8e075cb000)
```

minimalなサーバーにこのバイナリ１つだけ送って、さくっと動きます。便利ですね。
【Python入門】split関数で文字列の分割の仕方

※こちらの記事は、プロスタ編集部が現在大変人気の高いPythonの文法記事を公開することで、皆様の学習にお役に立ちたい意図で投稿しております。
参考サイト：[【Python入門】split関数で文字列の分割の仕方](http://programming-study.com/technology/python-split-2/)


#【Python入門】split関数で文字列の分割の仕方

数字、アルファベットや記号などが入り混じった文字列を、ある規則に従って、切り分けてリスト化してくれるのが、split 関数です。
文字列を区切るようなプログラムをゼロから書こうとすると非常に煩雑で、入門者にとってはそれを書くだけでも下手すると１日かかってしまうような大変な作業になってしまう可能性があります。
Split 関数はそういった煩雑さから、解放してくれるとても便利な関数です。これを知っているだけでも作業効率がだいぶ変わりますよ。

目次
1 [split関数の基本的な使い方](##split関数の基本的な使い方)
2 [区切り方の応用編](##区切り方の応用編)
3 [rsplit 関数](##rsplit 関数)


##split関数の基本的な使い方

たとえば、自分で作ったデータが以下のように「 , 」で区切られている場合を考えましょう。

```
>>> print test
orange,apple,banana,strawberry
```

文字列名.split(“ 区切り文字 ”) とすることで、区切り文字で区切られたリストを得る事が出来ます。

```
>>> test.split(",") # test というリストを 区切り文字” , ” で区切る
['orange', 'apple', 'banana', 'strawberry']
```

また区切り文字がスペースや、改行、タブであるときは、特に区切り文字を指定しなくても、区切ることができます。

```
>>> test = "orange apple banana strawberry"
>>> test.split()　# 引数に何も指定しない場合、スペースやタブ等で自動的に区切る
['orange', 'apple', 'banana', 'strawberry']
```

これを使うと例えば、区切り文字に２つのスペースが入っていたとしても、綺麗に分割する事が出来ます。

```
>>> test = "2016  November  15" # スペース２つで区切られている。
>>> test.split() # 
['2016', 'November', '15'] 
```

このように分割したい文字の間に、複数個の区切り文字があったとしてもこれで簡単に対応できますね。


##区切り方の応用編

更に、例えば「2番目までは区切って、3個目以降は区切らない」といった混みいった事をしたい場合は以下のように行う事が出来ます。

```
>>> test = "orange,apple,banana,strawberry"
>>> test.split(",", 2) # 2回目までは区切って、３個目以降は区切らない。
['orange', 'apple', 'banana,strawberry']
```


それでは区切り文字は指定せずに、１番目のみ区切りたいというときはどうすればよいでしょう。
例えば、以下のようにしてみたところエラーがでてきてしまいました。


```
>>> test = "2016  November  15"　# スペース２つで区切られている。
>>> test.split(1) # １番目のみ区切りたかったのですが。。。
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: expected a character buffer object
```

Python 的には split 関数の最初の引数は、区切り文字をしていしないとどうやらダメなようです。

この場合、「ユーザー側からは区切り文字は露わに指定しませんよ」ということを意味するために、None を用います。

```
>>> test = "2016  November  15"　# スペース２つで区切られている。
>>> test.split(None,1)
['2016', 'November  15']
```


このようにすることで無事に１番目のみを分割する事が出来ました。

##rsplit 関数

またsplit 関数と姉妹関係にあたる rsplit 関数もご紹介します。
rsplit は基本的には splitと同じです。しかし、splitは区切る順序は文字列最初からでしたが、rsplitは区切る順序が文字列の最後からになります。
余談ですが、rsplitの 「r」 は文字列の右側からというright、もしくは後ろという意味のrearから来ていると思われます。

では実際に行ってみましょう。

```
>>> test = "orange,apple,banana,strawberry"
>>> test.rsplit(",") # “,” で区切る。区切る数に制限は設けない
['orange', 'apple', 'banana', 'strawberry']
```

このようにrsplit の引数に区切り文字だけ与えた場合は、rsplit関数 = split 関数となります。
それでは、さらに区切る数を引数( = 2) として追加します。

```
>>> test = "orange,apple,banana,strawberry"
>>> test.rsplit(",",2)
['orange,apple', 'banana', 'strawberry']
```

たしかに後ろから２番目までが区切られている事がわかりますね。

さらに区切り文字は、１文字である必要はありません。文字列でも全く問題なく、split 関数と rsplit 関数は機能します。

```
>>> test = "orangehogeapplehogebananahogestrawberry" 
>>> test.split("hoge")  # hoge という文字列が区切り文字に対応する
['orange', 'apple', 'banana', 'strawberry']
```
ESP8266の電源にスイッチングレギュレータを使うことのススメ

[ESP8266/ESP-wroom-02 Advent Calendar 2016](http://qiita.com/advent-calendar/2016/esp8266) の枠が空いているので調子こいて小ネタを投稿しています。。。

***

ESP8266を使用する回路で、電源によく使われるのがリニアレギュレータ（三端子レギュレータ）です。

安くて安定した電源を供給してくれる便利な部品なのですが、一つ欠点があります。それは**発熱**することです。

入力5Vから3.3Vを作って、75mAぐらいの電流(ESP8266の起動後平常時の電流)を流す、という分には大丈夫なのですが、入力が5Vではなく12Vから、となると発熱が気になってきます。

リニアレギュレータは、入力と出力の電位差を熱に変えることで出力電圧を作っています。式で書くと、(入力電圧-出力電圧)×電流 の熱が出ます。

計算例

入力5V ESP8266平常時(75mA)
(5-3.3)×0.075 = **0.1275[W]**

入力5V ESP8266ピーク時(350mA)
(5-3.3)×0.35 = **0.595[W]**

入力12V ESP8266平常時(75mA)
(12-3.3)×0.075 = **0.6525[W]**

入力12V ESP8266ピーク時(350mA)
(12-3.3)×0.35 = **3.045[W]**

ヒートシンクなしで使えるのが1Wぐらいなので、12V入力でのピーク時には持ちこたえられません。ピーク電流をしょっちゅう使うわけではないのでまあ大丈夫かもしれませんが、「ケースなしで、間欠的に負荷をかける状態ならなんとかイケるかも」というギリギリの状態です。

もちろん、ヒートシンクを付ければオッケーなんですが、それよりも電源部品を変えたほうがいいですよーというお話です。

#スイッチングレギュレータ

スイッチングレギュレータは、効率8～9割ぐらいで電圧を変換しれくれます。

仕組みは、、、バッサリ省略！

効率が高いということは、発熱も少ないということです。

例としてはコレ。

![M-07178.jpg](https://qiita-image-store.s3.amazonaws.com/0/104360/67280f75-279c-b7eb-f58e-d59acad6d3ec.jpeg)

秋月電子で買えます。

http://akizukidenshi.com/catalog/g/gM-07178/

500mAまで流せるので、ESP8266にピッタリです。

三端子レギュレータと置き換えて使用することができます。

欠点としては、ちょっと値段が高いというのと、ちょっとノイズがでるというのがります。

ノイズに関しては、デジタル回路ならまったく問題ないレベルです。オーディオ回路には不向きかもしれません。

#特徴まとめ

##リニアレギュレータ
〇安価
〇低ノイズ
△発熱する

##スイッチングレギュレータ
△高価
△ノイズが出る
〇発熱少ない
初めてのvimプラグイン作成 - 最小限なvimプラグイン

どうも、凡人です。
以前から作ってみたかったvimプラグインを作ってみました。

<!--more-->

# 最小限なvimプラグイン
やはり何事も、非常に簡単なものから始めるのがいいと思います。
ということで、死ぬほど簡単な処理を実行するだけのvimプラグインを作るとしましょう。

## 最小限なスクリプト
今回作るプラグインは、vimのノーマルモード時に[z]キーを押すと、"Hello World"が表示されるだけのプラグインです。スクリプトは次のようになります。

<pre>scriptencoding utf-8
:nmap z :echo "Hello World!"&lt;CR>
</pre>

"scriptencoding"は、エンコーディング指定です。ここではutf-8を指定しています。
さすがにこれは必要かなと思い、設定しました。

## プラグインの名前決め
適当に"helloworld-vim"とします。

## フォルダとファイルの用意
最小限のファイルとフォルダを用意しましょう。

    helloworld-vim
          +- plugin
              +- helloworld-vim
    

## GitHubへアップロード
上記のファイルとフォルダでgitのリポジトリを作成し、GitHubへアップロードします。

<https://github.com/bonjin6770/helloworld-vim>

## プラグインとして設定する
私はプラグイン管理にNeoBundleを使っているので、vimrcに次の記述を追加します。

<pre>NeoBundle 'bonjin6770/helloworld-vim'
</pre>

## プラグインのインストール
プラグインをインストールします。

<pre>:NeoBundleInstall
</pre>

## プラグインの実行
vimのノーマルモード時に、[z]キーを押します。

<img width="624" alt="スクリーンショット 2016-12-13 23.35.49.png" src="https://qiita-image-store.s3.amazonaws.com/0/13989/68145836-449c-b9a7-d14b-71b34165ba1a.png">


どうやら成功したようです。 
スクリーンショットを撮ってて「これ意味あるのかな」ってこんなに思ったのは初めてです。

# まとめ
「vimプラグインを作る」という目的が達成できた以外、何の価値もないプラグインが誕生しました。

 [1]: http://blog.bonjin.net/wp-content/uploads/2016/12/684f04676ac90220b93e2940376d2c8a.png
13と色にまつわる話

# はじめに
これは、[Visual Basic Advent Calendar 2016](http://qiita.com/advent-calendar/2016/vb)の13日目の記事です。

13日は欧米では忌み日ってことで空き日でもいいかなって思ったのですが、13日が忌み日ってどういうことなんだろうと思って、あえて書くことにしました。

# 13日はなぜ忌み日
日本では、映画の「13日の金曜日」が有名なだけで13日がどうこうは無いですよね。
いろいろ諸説があるようです。参照：[13日の金曜日はなぜ不吉なの？ - GIZMODE](http://www.gizmodo.jp/2014/06/13_13.html)

>１．「１３」日
>
>１３の方に意味があります。「１３日」という特定の日（たとえばＡＣ２０年３月１３日、とかそういう意味の特定の日）があったわけではありません。単純に数字に意味があります。
これは、イエスキリストが最後の晩餐、すなわち処刑される前夜に行った、弟子たちとの晩餐のおり、１３人目の弟子である「ユダ」が裏切ったため、処刑が行われた、というところから「１３」が忌むべきもの、とされたといわれています＊。
なお「忌べきもの」と「不吉なもの」は直接イコールではないことはお分かりでしょう。
>
>２．金曜日
>
>イエスキリストが処刑されたのが金曜日です。
なぜ金曜日だということが分かっているか、ですが、聖書にそう書いてあるから、という単純なもの。
出展:[１３日の金曜日は何故不吉？ - 教えて！goo](http://oshiete.goo.ne.jp/qa/778920.html)

ちなみにキリストが処刑されたのはゴルゴダの丘で、これはあのゴルゴ13の由来にもなっているそうです。

# Visual Basicとの関連
13日というより、13という番号に意味があることが分かりました。
Visual BasicがC#より勝っているのは、歴史があるということで製品が多く出ています。
面倒なので.NET以降にしています。

|製品名|バージョン|内部バージョン|リリース|
|:--|:--|:--|:--|
|Visual Basic .NET|2002|7.0|2002年|
|Visual Basic .NET 2003|2003|7.1|2003年|
|Visual Basic 2005|2005|8.0|2005年|
|Visual Basic 2008|2008|9.0|2007年|
|Visual Basic 2010|2010|10.0|2010年|
|Visual Basic 2012|2012|11.0|2012年|
|Visual Basic 2013|2013|12.0|2013年|
|Visual Basic 2015|2015|14.0|2015年|

内部バージョンを見てみましょう。内部バージョン13は[忌み番](https://ja.wikipedia.org/wiki/%E3%82%B8%E3%83%B3%E3%82%AF%E3%82%B9)のためスキップされているのです。

これ以外でも、Office製品を参照する際のライブラリのバージョンも同様です。

|製品名|ライブラリバージョン|
|:--|:--|
|Excel2003|Microsoft Excel 11.0 Object Library|
|Excel2007|Microsoft Excel 12.0 Object Library|
|Excel2010|Microsoft Excel 14.0 Object Library|
|Excel2013|Microsoft Excel 15.0 Object Library|
|Excel2016|Microsoft Excel 16.0 Object Library|

# 色について
13の話だけでは物足りないので色について少し書きます。

下図は国ごとの色のイメージです。参照：[Colours-in-cultures:informationisbeautiful.net](http://www.informationisbeautiful.net/visualizations/colours-in-cultures/)
![Colors.png](https://qiita-image-store.s3.amazonaws.com/0/14053/ce3ad54b-1c71-e54c-aa54-751c372385e5.png)
見方として日本はBで外側から2番目です。
1.怒り(Anger)で赤、4.不幸(Bad Luck)が黒、38.幸福(Happiness)は黄色です。

[何故海外アニメで悪役が使う魔法は緑なの？](http://togetter.com/li/25448)
西洋ではエイリアンとかゲームでも血の色は緑色なんです。日本では緑色は森林などでいいイメージだけど、西洋では悪魔と死とか毒のイメージが強いということです。

スマホアプリなどで海外向けにもリリースすることがあるかと思いますが、色についても考慮するといいでしょう。

# 最後に
大企業であるマイクロソフトであっても、ジンクスは取るんですよね。
emmetの連番の振り方について

# emmetの連番の振り方について

## この記事で記載すること
割と力技でもできて、忘れがちなemmetでの連番の振り方について記載します。

具体的には、
まず、
* 基本的な記法

また応用編として、

* 0埋め(たとえば01)にする方法
* 1ではなくほかの数値からのスタート方法
* 降順での連番の振り方

について記載していきたいと思います。

## はじめに
htmlおよびcssを速やかに記載する記法の一つにemmetがあります。こちらの記法を用いることで速やかに正確なコーディングができますが、記法の知識がないばかりに結局手打ちで打ち込んでしまい、スピード感が失われる場合もあります。その具体例として、例えば、画像名などに連番をふることがあげられます。今回はその連番についての知識です。以下ではその方法についてご紹介させていただきます。

### 基本的な記法
まず、基本的な記法についてです。**半角のドルマーク($)** を用いることで連番を振ることができます。
たとえば、listタグでそれぞれのリストに展開後「list+連番」のidを振ってみます。

```
ul>li#list$*5
```

【展開後】
```
<ul>
  <li id="list1"></li>
  <li id="list2"></li>
  <li id="list3"></li>
  <li id="list4"></li>
  <li id="list5"></li>
</ul>
```
このように手打ちならば、チクチク変更しなければ、ならないコードを$マークを使って速やかに記載することができました。
## emmetで連番記法の応用編
以下ではこの記法の応用編をご紹介したいと思います。

### 【応用編1】0埋め(たとえば01)にする方法

**$を連ねること**で連ねた数だけ0埋めをすることができます。
(例)
```
ul>li#list$$*10
```
【展開後】
```
<ul>
  <li id="list01"></li>
  <li id="list02"></li>
  <li id="list03"></li>
  <li id="list04"></li>
  <li id="list05"></li>
  <li id="list06"></li>
  <li id="list07"></li>
  <li id="list08"></li>
  <li id="list09"></li>
  <li id="list10"></li>
</ul>
```

### 【応用編2】1ではなくほかの数値からのスタート方法
**$@(はじめたい数値)**で1以外の番号から連番をスタートすることができます
(例 リストのidを5から連番でふりたい場合)

```
ul>li#list$@5*10
```

【展開後】
```
<ul>
  <li id="list5"></li>
  <li id="list6"></li>
  <li id="list7"></li>
  <li id="list8"></li>
  <li id="list9"></li>
  <li id="list10"></li>
  <li id="list11"></li>
  <li id="list12"></li>
  <li id="list13"></li>
  <li id="list14"></li>
</ul>
```
### 【応用編3】降順での連番の振り方
$のあとに**@-**を付けてください。

(例)
```
ul>li#list$@-*10
```
【展開後】
```
<ul>
  <li id="list10"></li>
  <li id="list9"></li>
  <li id="list8"></li>
  <li id="list7"></li>
  <li id="list6"></li>
  <li id="list5"></li>
  <li id="list4"></li>
  <li id="list3"></li>
  <li id="list2"></li>
  <li id="list1"></li>
</ul>
```
### まとめ
今回は、emmetの連番についての記法について記載させていただきました。
基本は **半角のドルマーク($) 、またドルマークのあとに@(-または数値)で**、1以外の数で連番、降順にすることができました。
もしよろしければぜひこちらの記法、ご活用いただけたら幸いです。

本文、お読みいただき、ありがとうございました。
js 文字列を指定回数くりかえす

##文字列を指定回数くりかえす。負の数の場合は空文字を返す。

```script.js
function repeatStringNumTimes(str, num) {
//write your code.
}
repeatStringNumTimes("abc", 3) //"abcabcabc"
```

出力結果　例

```script.js
repeatStringNumTimes("abc", 3) //"abcabcabc"
repeatStringNumTimes("abc", 4) // "abcabcabcabc"
repeatStringNumTimes("abc", 1) // "abc"
repeatStringNumTimes("*", 8) // "********"
repeatStringNumTimes("abc", -2) // ""
```

##何も考えずに書いたコード

```script.js
function repeatStringNumTimes(str, num) {
  var arr = [];
   for(var i = 0; i< num; i++){
     arr.push(str);
   }
  return arr.join("");
}
```

##工夫したコード
```script.js
function repeatStringNumTimes(str, num) {
    return num > 0 ? str.repeat(num) : '';
}
```

##考え方
numが正の数かどうか判定し、trueならrepeat(num)を返す。
falseなら空文字を返す。

もっと簡潔に美しくかけるよ！という方、コメントお待ちしております。


##参考リンク
[repeat()](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/String/repeat)
[三項演算子](https://developer.mozilla.org/ja/docs/JavaScript/Reference/Operators/Conditional_Operator)
ElectronのexecuteJavaScriptに動的なスクリプトを実行させるためのワンライナー


## 問題

Electronの webContents.executeJavascript は、stringでjavascriptコードを受け取る。
例えば **IDとパスワードを渡してログインしたい** と思った時にこれがちょっと工夫が必要だった。

## 結論

こんな関数を用意するだけでいけた！

```js
const wrap = (fn, ...args) => `(${fn.toString()})(${args.map( arg => `"${arg}"` ).join(',')})`
```


### 使い方はこんな具合

```js

const webview = document.querySelector("#browser")

// webviewで実行したい関数
const input = (name, pass) => {
  document.querySelector("#username").value = name
  document.querySelector("#password").value = pass
  document.querySelector("#login").click()
}

// wrap!
const scr = wrap(input, "my-name", "my-password")

webview.addEventListener('did-finish-load', (e) => {
	// execute!
    webview.executeJavaScript(scr, () => {
     ....
    }) 
}
```


### 解説など

ワンライナーって言いたかっただけの理由で一行で書いてみたが、わかりやすく書くとこんな感じになる。

```js
const wrap = (fn, ...args) => {
  const callArgs = args.map( arg => `"${arg}"` ).join(',')
  const functionString = fn.toString()
  return `(${functionString})(${callArgs})`
}
```

wrapで作られた`scr`の変数はこんな感じになっている。

```js
((name, pass) => {
  document.querySelector("#username").value = name
  document.querySelector("#password").value = pass
  document.querySelector("#login").click()
})("my-name", "my-password")
```

* `(function(){})()`みたいな即時関数で囲む
* `Function.toString()`で関数の文字列を取り出している
* ES2015構文大活躍
    * `...args`でその後の引数をquoteで囲んで、即時関数の引数にしている。
        * [spread演算子](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Spread_operator)で受け取っているのはわりと好み。別に第二引数を配列にしてても良かったとは思う。
    * templateリテラリ大活躍

下記あたりを参考に思いついた

* [electronのwebview.executeJavaScriptで書くjavascriptを見やすくしてみた](http://qiita.com/FaithnhMaster/items/ead9ed07205537d53069)
* [segmentio/nightmare:lib/javascript.js](https://github.com/segmentio/nightmare/blob/443cb4439d80bebc48135e824df71f283aac3833/lib/javascript.js)
[備忘録]ターミナルでTabキーを押下することで入力補完してくれるように変更する方法

# はじめに
Windowsのコマンドプロンプトで作業するときは、
入力補完をTabキーを押下することで行ってくれるのですが、
Macのターミナルでも同じことができないか。
それを調べたら分かったので備忘録として記述します。

<参考にしたサイト及びブログ>
・ [Mac のターミナルで Windows のようにタブキーで入力補完する方法](http://ameblo.jp/nekocat2/entry-11539657198.html)
・ [7.8. /etc/inputrc ファイルの生成](http://lfsbookja.osdn.jp/7.6.ja/chapter07/inputrc.html)

# 結論
内容の結論としては、`.inputrc`というファイルを作成し、
そのファイルに以下の内容を記述することで実現できます。
(以下の内容は、「[Mac のターミナルで Windows のようにタブキーで入力補完する方法](http://ameblo.jp/nekocat2/entry-11539657198.html)」より)

```text:.inputrc
set completion-ignore-case on
TAB: menu-complete
```

そして、このファイルをどこに作成するかで使用できるユーザが変わります。
**1. 特定のユーザだけに使わせたい場合**
そのユーザのホームディレクトリ`/Users/(ユーザ名)`に作成します。
**2. 全ユーザに使わせたい場合**
`/etc`ディレクトリ内に作成します。

# 説明

まず、`.inputrc`というファイルは何者かということについて、
「[7.8. /etc/inputrc ファイルの生成](http://lfsbookja.osdn.jp/7.6.ja/chapter07/inputrc.html)」というサイトで以下のように説明されていました。

> inputrc ファイルはキーボードに応じたキーボードマップを定めます。 このファイルは入力に関連するライブラリ Readline が利用するもので、このライブラリは Bash などのシェルから呼び出されます。

つまり、こいつを設定することによってキーボードからの入力によって
必要なプログラム（今回は入力補完）が動くという仕組みらしい。
（「[キーバインド (key binding)](http://e-words.jp/w/%E3%82%AD%E3%83%BC%E3%83%90%E3%82%A4%E3%83%B3%E3%83%89.html)」を設定するファイルということ。）

***

さて、次に`.inputrc`に書いた内容についてですが、
まず一行目

```text:.inputrc(1行目)
set completion-ignore-case on
```

これは、GNUの公式サイトのドキュメント([Bash Reference Manual: Readline Init File](https://www.gnu.org/software/bash/manual/html_node/Readline-Init-File.html))に書かれていました。

> **completion-ignore-case**
If set to ‘on’, Readline performs filename matching and completion in a case-insensitive fashion. The default value is ‘off’.

つまり、簡単にいうと
`completion-ignore-case`を`on`に設定すると、大文字小文字を区別しないで入力補完をしてくれるとのこと。ただし、初期設定では、`off`だけどね。
(`off`だと大文字小文字を区別することになるとのこと。)

そして2行目、

```text:.inputrc(2行目)
TAB: menu-complete
```

これで、TABキーに「メニューを使って補完する」ということを割り当てているらしい。

他にも補完方法については指定できるらしい。「[Ubuntu Serverで最低限追記しておきたい設定](https://gist.github.com/arosh/3563719)」で書かれている方がいるのでそちらを参照してください。

# おまけ
**<`.inputrc`ファイル関係について書いているサイトのリンク>**
・ [bash - .inputrcでキーバインドを編集する](http://blog.livedoor.jp/add20/archives/4554645.html)
・ [.inputrc - teratermで日本語入力ができない場合](http://www.ksknet.net/freebsd/inputrc_terater.html)
・ [Bash Reference Manual: Readline Init File](https://www.gnu.org/software/bash/manual/html_node/Readline-Init-File.html)
・ [Readline](https://wiki.archlinuxjp.org/index.php/Readline)
・ [Ubuntu Serverで最低限追記しておきたい設定](https://gist.github.com/arosh/3563719)
IEにでHTML5のmainを使う際の注意

HTML5の要素であるmainを使用した際に起きた注意点を紹介します。

## 注意点
mainタグを使用する際は

```
main {
  display: block;
}
```

をかけてあげる

## 理由
IEではmainタグのデフォルトに設定されているdisplayがinlineのため
マイクロサービスについて興味がある


ざっと、いろいろ眺めた。結構奥深い。。（ほぼ眺めただけ。）

- マイクロサービスってなんなのか？
- マイクロサービスをたくさん作ってデメリットが大きかった話。
- コレオグラフィ。
- マイクロサービスアーキテクチャを採用した際に関わるいろんな技術（mountebankってなんかすごそう）や関連書籍。

粒度や規模によってはそれなりにコストを意識した設計が求められそう。
眺めていると、面白いけど規模が大きい。
私が求めてるのは、マイクロじゃなくサービス分割かな。。なんて印象。
	
	「マイクロサービス」の検索結果 - Qiita
	http://qiita.com/search?q=%E3%83%9E%E3%82%A4%E3%82%AF%E3%83%AD%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9
	
	マイクロサービスに関する15件の投稿 - Qiita
	http://qiita.com/tags/%E3%83%9E%E3%82%A4%E3%82%AF%E3%83%AD%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9
	
	サービス分割とデータ統合アーキテクチャに関する考察 - Qiita
	http://qiita.com/yebihara/items/8a849f611e4a41cf47e4
	
	書籍「マイクロサービスアーキテクチャ」まとめ（前編） - Qiita
	http://qiita.com/crossroad0201/items/23864b3b177fb1fce966
	
	書籍「マイクロサービスアーキテクチャ」まとめ（後編） - Qiita
	http://qiita.com/crossroad0201/items/2d115daeddbc884adfc5
	
	マイクロサービス・アーキテクチャのメリット／デメリットまとめ - Qiita
	http://qiita.com/hhayakaw/items/f5d9c0de71f2a509350c
	
	マイクロサービスアーキテクチャ とは何か
	http://www.slideshare.net/yusuke/msa-share-02?next_slideshow=1
	
	マイクロサービスについてザックリとまとめてみる - Qiita
	http://qiita.com/Iwark/items/6c362fd6b695a5792246
	
	bbyars/mountebank: Over the wire test doubles
	https://github.com/bbyars/mountebank
	
	マイクロサービスアーキテクチャに関する4件の投稿 - Qiita
	http://qiita.com/tags/%E3%83%9E%E3%82%A4%E3%82%AF%E3%83%AD%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%81%E3%83%A3
	
	マイクロサービスアーキテクチャにおけるオーケストレーションとコレオグラフィ - Qiita
	http://qiita.com/kawasima/items/17475a993e03f249a077
	
	O'Reilly Japan - マイクロサービスアーキテクチャ
	https://www.oreilly.co.jp/books/9784873117607/
	
	マイクロサービスを一言で表すと何なのか - Qiita
	http://qiita.com/qsona/items/d879f5e1f12cb6499987


そして、「マイクロサービス」じゃなくてもいい感覚については「サービス指向アーキテクチャー（SOA）」との比較で言い表されたりするものらしい。（モノリシックは旧来の（？）一枚岩のサービス構成。）
でも、現代的なソフトウェア設計の課題の一つなのだな。

	マイクロサービス - Google 検索
	https://www.google.co.jp/search?sourceid=chrome-psyapi2&ion=1&espv=2&ie=UTF-8&q=%E3%83%9E%E3%82%A4%E3%82%AF%E3%83%AD%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9&oq=%E3%83%9E%E3%82%A4%E3%82%AF%E3%83%AD%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9&aqs=chrome..69i57j69i59j0l4.1966j0j7
	
	マイクロサービスの終焉 | 開発手法・プロジェクト管理 | POSTD
	http://postd.cc/the-end-of-microservices/
	
	マイクロサービス（Microservices） | NTTデータ
	http://www.nttdata.com/jp/ja/insights/trend_keyword/2015072301.html
	
	マイクロサービス化が進む背景について考えてみた
	https://gist.github.com/everpeace/c40b69eff6636b9ec2f9
	
	マイクロサービス、SOA、API：味方か敵か
	https://www.ibm.com/developerworks/jp/websphere/library/techarticles/soa_microservices_architecture/

今の所、いろんな記事のまとめとして「マイクロサービスの終焉」の記事がしっくりする。挿絵も面白いし。
PYNQ-Z1ボードのLED/スイッチ/ボタンをいじってみる

FPGAに行く前にまずはボード上の周辺機器を操作の仕方を調べました。内容的には
https://pynq.readthedocs.io/en/latest/5_programming_onboard.html
を試してみた感じです。

ボード上の右下にある

- LD0-5
- SW0,1
- BTN0-3

がデフォルトでボード上に実装されているI/O機器です。Lチカしたりスイッチで操作したりしてみましょう。
コードはすべてJupyter notebookから実行します。まずは必要なライブラリをimportします。

```python
from pynq import Overlay
from pynq.board import LED
from pynq.board import Switch
from pynq.board import Button

Overlay("base.bit").download()
```

LD0を操作してみます

```python
led0 = LED(0)
led0.on()
```

一番右下のLEDが点灯したと思います。`led0.off()` で消えます。pythonにはsleep関数があるのでLチカしてみましょう。

```python
import time

for i in range(20):
    led0.toggle()
    time.sleep(0.1)
```

次はスイッチの値を読み込んでみます。まずはSW0のオブジェクトを作って

```python
swt0 = Switch(0)
```

値を読み込みます

```python
swt0.read()
```

ボード上のSW0の上下を操作しながら何度か実行してみると0や1が読み込めると思います。以下のコードを実行するとスイッチの上下でLチカするLEDを切り替えてくれます。

```python
led0 = LED(0)
led1 = LED(1)
swt0 = Switch(0)

for i in range(100):
    if swt0.read()==0:
        led0.on()
    else:
        led1.on()
    time.sleep(0.1)
    led0.off()
    led1.off()
    time.sleep(0.1)
```

ボタンの場合も同様に`Button(n)`でオブジェクトを取得し、`read`関数で値を読み込めます。以下のコードではボタンを押している間、対応するLEDを点灯します。

```python
leds = [LED(0),LED(1),LED(2),LED(3)]
btns = [Button(0),Button(1),Button(2),Button(3)]

for i in range(100):
    for j in range(4):
        if btns[j].read():
            leds[j].on()
        else:
            leds[j].off()
    time.sleep(0.1)
```

以上がPYNQ-Z1ボード上でのLED/スイッチ/ボタンの操作方法です。pynqはボードだけでなく、このようなAPIも提供してくれているので手軽に試してみることができます。
http://qiita.com/takushi-m@github/items/54e8c654ae74d786550d
では購入して動作させるところまでを解説しているので参考にしてみてください。
[C#] 連番の作成 (Enumerable.Rangeの利用）

C#でPythonでの `range` のように連番を利用したいときのメモ（けっこう忘れるので）

`Enumerable.Range` を使用する。

# 基本的な使い方

例えば 0 ~ 99 までの連番がほしいときは以下のようにする。

```csharp:連番の作成(int)
// 第一引数が初期値で、第二引数は繰り返し回数になる。1ずつインクリメントされる。
Enumerable.Range(0, 100)
```

`IEnumerable<T>`が返るため、foreachで利用することができる。

```csharp:foreachでの利用例
foreach(var i in Enumerable.Range(0,10))
{
    Console.WriteLine(i);
}
```

# LINQと組み合わせて使う

これぐらいだと別に通常のfor文と大差ないが、`Enumerable`ではLINQの利用ができる。

```csharp:連番の作成(0~90)
foreach(var i in Enumerable.Range(0, 10).Select(x => x * 10))
{
    Console.WriteLine(i);
}
```

```csharp:連番を利用した文字列の作成（奇数のみ）
foreach(var i in Enumerable.Range(0, 10).Where(x => x % 2 != 0).Select(x => String.Format("{0} 回目", x)))
{
    Console.WriteLine(i);
}
```
メールプロトコルに関係するセキュリティ技術たち

この投稿は[SFC-RG Advent Calendar 2016](http://www.adventar.org/calendars/1413)の10日目です。

# はじめに
研究ネタに困り日本にインターネットを引いたIP原理主義者がゴロゴロいる研究室でCCNの研究をしようか某B3の学生は血迷っていた。そこで神のように舞い降りた新婚ホヤホヤの指導教官から「SMTP-STSっていうのあるよ！」の一声でメールサーバ間通信の研究をすることを決意した。ちなみにこのSMTP-STS、日本語文献がほとんどないのである！
<img width="797" alt="スクリーンショット 2016-12-07 17.29.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/114861/adb5b0ee-031f-69eb-7c4c-49fec6ee15f2.png">
Googleの日本語検索結果のうち上位3/4が私と指導教官である。

前書きがとても長くなったが、本稿はSMTP-STSを研究するにあたり~~一夜漬けで覚えた~~学習したメールプロトコル関連のセキュリティ技術についての~~クイックリファレンス~~、もとい覚え書になる。

# STARTTLS拡張とSMTP over TLS
## SMTP over TLS
メールソフト、メールサーバ間の通信をSSL/TLSを利用して暗号化するセキュリティ機構。465番ポートを使用し、通信の全行程が暗号化される。クライアントと送信先サーバがover TLSに対応していても、先の中継サーバが対応していないと暗号化通信できないため普及が進んでいなかった。
しかしGoogle様がGmailを常時SSL化をサポートしたのでGmail内通信だと常に暗号化されている。Google様はしゅごい。
## STARTTLS拡張
通信はじめに相手サーバがTLS/SSLに対応しているかネゴシエーションしてから通信経路を暗号化するセキュリティ機構。ポートは587。途中から平文通信を暗号化通信に切り替えるのがSMTP over TLSとの違い。

### 問題
だがどちらにしろ現状だと自分からネクストホップのサーバまでのTLS経路しか確認できず、図のような感じになっている。(だからSMTP-STSが必要なんです)
Google様は常時SSL化してるから例外です。
<img width="594" alt="スクリーンショット 2016-12-13 21.00.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/114861/89775a41-1f6e-0a8a-df16-ef7ea88fa503.png">

## SMTP-STS
それを解決するのがSMTPS-STS(SMTP Strict Trasport Security)！
なうで[IETF UTA Working Group](https://datatracker.ietf.org/doc/draft-ietf-uta-mta-sts/)で審議されているとってもナウい技術なのだ！
先述の技術は全て日和見暗号なので[能動的攻撃](https://ja.wikipedia.org/wiki/日和見暗号化)には弱い。特に中間者攻撃には脆弱である。自分とメールサーバ間が暗号化されていたとしてもこんな感じに攻撃されてしまう。
<img width="532" alt="スクリーンショット 2016-12-13 22.12.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/114861/d98e609a-9809-ecea-6cc7-4bb4cc9aec80.png">
それを防ぐセキュリティ機構がSMTS-STSである。主な機能は２つに集約される。

- メールを送る際にTLS上でメールが送信できることを確認/宣言する
- セキュアにメールが送信できない場合はリポートを返す

この２つの機能でSTARTTLS等で壁になっていたMTA間の通信の秘匿性をカバーする。
そもそもDNSポイズニングがあるだろうとかいう指摘もあるが、それはSMTP-STSのカバーする範囲ではなく、DANEでサーバの応答性は担保する。
これで安心してメールが遅れるね、たえちゃん！


# メール自体の暗号化
hogehoge(今週にはかく。。。。)




# 参考
上野宣. (2005)『[今夜わかるメールプロトコル](http://www.shoeisha.co.jp/book/detail/9784798109411)』 翔泳社.
とってもいい本なのに絶版になっている。翔泳社さん、再販してくれ〜
digicert. [TLS/SSLで電子メールの安全性を高める](https://rms-digicert.ne.jp/howto/basis/mail_tls_ssl.html)
Symantech. [POP over SSL/SMTP over SSL](https://www.symantec.com/ja/jp/page.jsp?id=ssl-pop-over)
IBM. [STARTTLS 拡張を使用して SMTP セッションを保護する](https://www.ibm.com/support/knowledgecenter/ja/SSKTMJ_8.5.3/com.ibm.help.domino.admin85.doc/H_SUPPORTING_THE_STARTTLS_COMMAND_STEPS.html)
Wikipedia. [STARTTLS](https://ja.wikipedia.org/wiki/STARTTLS) (論文じゃないからwikipediaでも許してちょ〜)
Qiitaのタグのアイコンについて

ご存知のように、Qiitaは記事にタグをつけてカテゴリ分けすることができます。

この記事にも「Qiita」のタグがついています。

タグの名前の横になにやらアイコンが表示されていると思います。実はこのアイコンは（勝手に）変更することができます。

タグのページ（`http://qiita.com/tags/<タグ名>`）の上部にあるアイコンをクリックするとアイコンを変更できるのですが、いくつかの注意点があります。

* 画像は32px*32pxに圧縮されるので大きい画像アップしても意味ない。
* 圧縮後は潰れた感じになるので細かい画像は載せない。
* 透過背景は黒背景になるので不自然。白い背景にしてからアップロードする。

などです。

マイナーなタグはアイコンがついてないのもあるので気づいたらつけていくようにしたいです。
最速で日本語環境のMySQL Dockerコンテナを建てる方法

#はじめに
MySQLの公式Dockerイメージは文字コードがlatin1だったり、タイムゾーンがTSだったり、localeがPOSIXだったりと、日本語環境で使うにはかなり不自由な感じです。
以下のdocker-compose.ymlを使うことで日本語環境をすぐに建てることが可能です。
最速で日本語環境を使いたい人はこちらをベースにしてみてください。


#ファイル
以下のような構成を想定しています。

```
C:.
├─Dockerfile-MySQL
├─docker-compose.yml
└─db
```

```dockerfile:Dockerfile-MySQL
# Dockerfile_MySQL
FROM mysql:5.6

# Set debian default locale to ja_JP.UTF-8
RUN apt-get update && \
    apt-get install -y locales && \
    rm -rf /var/lib/apt/lists/* && \
    echo "ja_JP.UTF-8 UTF-8" > /etc/locale.gen && \
    locale-gen ja_JP.UTF-8
ENV LC_ALL ja_JP.UTF-8

# Set MySQL character
RUN { \
    echo '[mysqld]'; \
    echo 'character-set-server=utf8mb4'; \
    echo 'collation-server=utf8mb4_general_ci'; \
    echo '[client]'; \
    echo 'default-character-set=utf8mb4'; \
} > /etc/mysql/conf.d/charset.cnf
```

```dockerfile:docker-compose.yml
mysql:
  build: .
  dockerfile: Dockerfile-MySQL
  environment:
    MYSQL_ROOT_PASSWORD: root         #rootユーザ用のパスワード
    MYSQL_USER: user1                 #作業ユーザ名
    MYSQL_PASSWORD: user1password     #作業ユーザ用のパスワード
    MYSQL_DATABASE: development_db    #作成するDB名
    TZ: "Asia/Tokyo"
  ports:
    - 3306:3306
  volumes:
    - ./db:/var/lib/mysql
```

#起動方法
docker-compose.ymlを置いたカレントディレクトリでビルドして、起動します。

```bash
> docker-compose build
〜(省略)〜
Successfully built ba1d6a842af7

> docker-compose up -d
Creating mysql_1

>docker-compose ps
     Name                   Command               State           Ports
--------------------------------------------------------------------------------
mysql_1   docker-entrypoint.sh mysqld      Up      0.0.0.0:3306->3306/tcp
```

日本語環境のMySQLコンテナが出来上がりです。


#お好みで
docker-compose.ymlに記載している```MYSQL_ROOT_PASSWORD```,```MYSQL_USER```,```MYSQL_PASSWORD```,```MYSQL_DATABASE```は使いたい内容に書き換えてみてください。
炎の型工房 火の型 11日目 :　下ごしらえが大事!!：Pongを作ろう -2-

[<ruby>炎<rt>ほのお</rt></ruby>の<ruby>型<rt>かた</rt></ruby><ruby>工房 <rt>こうぼう</rt></ruby>ScratchとDartでゲームプログラム<ruby>入門<rt>にゅうもん</rt></ruby> Advent Calendar 2016](http://qiita.com/advent-calendar/2016/firefirestyle-studio)
の<ruby>記事<rt>きじ</rt></ruby>です


<img width="500" alt="magic.png" src="https://qiita-image-store.s3.amazonaws.com/0/54192/6d8b097a-3d16-657e-c325-1277bee46b77.png">


<ruby>火<rt>ひ</rt></ruby>の<ruby>魔法<rt>まほう</rt></ruby>も

<ruby>水<rt>みず</rt></ruby>の<ruby>魔法<rt>まほう</rt></ruby>も

<ruby>下<rt>した</rt></ruby>ごしらえが<ruby>大事<rt>だいじ</rt></ruby>



　
### <ruby>四角形<rt>しかっけい</rt></ruby>を<ruby>書<rt>か</rt></ruby>いてみましょう
<ruby>定義<rt>ていぎ</rt></ruby>とペンを<ruby>利用<rt>りよう</rt></ruby>して、 <ruby>四角形<rt>しかっけい</rt></ruby>を<ruby>書<rt>か</rt></ruby>いてみましょう


#### <ruby>定義<rt>ていぎ</rt></ruby>を<ruby>作成<rt>さくせい</rt></ruby>する

<img width="334" alt="v001.png" src="https://qiita-image-store.s3.amazonaws.com/0/54192/b5e50eba-742e-2856-246d-01439084c5c8.png">


1. その<ruby>他<rt>た</rt></ruby>をクリック
2. ブロックを<ruby>作<rt>つく</rt></ruby>る

<img width="334" alt="v002.png" src="https://qiita-image-store.s3.amazonaws.com/0/54192/ee867cea-42d3-4655-c92c-b10737ae807e.png">


1. オプションをクリック

<img width="334" alt="v003.png" src="https://qiita-image-store.s3.amazonaws.com/0/54192/09763d32-6c86-0dda-e9f7-db4aa846d884.png">


1. <ruby>定義名<rt>ていぎめい</rt></ruby>を<ruby>入力<rt>にゅうりょく</rt></ruby>
2. <ruby>数値<rt>すうち</rt></ruby>の<ruby>引数<rt>ひきすう</rt></ruby>を<ruby>追加<rt>ついか</rt></ruby>をクリックして、x,y,w,h,r,g,b を<ruby>追加<rt>ついか</rt></ruby>する
3. <ruby>画面<rt>がめん</rt></ruby>を<ruby>再描画<rt>さいびょうが</rt></ruby>せずに<ruby>実行<rt>じっこう</rt></ruby>するにチェックを入れる
4. OK ボタンをクリック

<img width="334" alt="v004.png" src="https://qiita-image-store.s3.amazonaws.com/0/54192/4d9326c1-afce-11fd-04a6-f1a8fa055719.png">


#### コードを書く
<img width="369" alt="v005.png" src="https://qiita-image-store.s3.amazonaws.com/0/54192/a883e60e-c50e-4115-21f7-e274248dc925.png">


#### 動作確認してみる
https://scratch.mit.edu/projects/135933828/

<img width="334" alt="v006.png" src="https://qiita-image-store.s3.amazonaws.com/0/54192/9157932e-e2e6-7c70-f422-52dfd5699c3a.png">


1. <ruby>旗<rt>はた</rt></ruby>をクリックすると<ruby>四角形<rt>しかっけい</rt></ruby>が<ruby>描画<rt>びょうが</rt></ruby>されること




　

### <ruby>試<rt>ため</rt></ruby>してみよう
<ruby>作成<rt>さくせい</rt></ruby>した、<ruby>定義<rt>ていぎ</rt></ruby>を<ruby>利用<rt>りよう</rt></ruby>してみよう。

* <ruby>作成<rt>さくせい</rt></ruby>した<ruby>定義<rt>ていぎ</rt></ruby>を<ruby>使<rt>つか</rt></ruby>って、<ruby>四角形<rt>しかっけい</rt></ruby>をたくさん<ruby>書<rt>か</rt></ruby>いてみるとか

https://scratch.mit.edu/projects/136158231/

<img width="334" alt="v007.png" src="https://qiita-image-store.s3.amazonaws.com/0/54192/02692fa3-a118-ee16-cd0c-897fdd42e88e.png">



## Thanks
<div>
ここまで、<ruby>読<rt>よ</rt></ruby>んでくれてありがとう!!
</div>
<div>
では、<ruby>次回<rt>じかい</rt><ruby>、また
<ruby>会<rt>あ</rt></ruby>えることを、
<ruby>楽<rt>たの</rt></ruby>しみにしています。
</div>

そして、<ruby>次回<rt>じかい</rt></ruby>は、<ruby>今回作成<rt>こんかいさくせい</rt></ruby>したコードを<ruby>利用<rt>りよう</rt></ruby>して、コートを<ruby>作成<rt>さくせい</rt></ruby>します。

<div>
ではでは
</div>
urdfdom_pyパッケージの使い方

# urdfdom_pyパッケージの使い方

###### 動作環境
* kinetic
* Ubuntu 16.04

### 1. パッケージのインストール

下記のコマンドを実行する.

```bash
$ sudo apt-get install ros-kinetic-urdfdom-py # kinetic以外はその名前で指定する
```

### 2. URDFの中身をprintするコマンドを使ってみる.

```bash
$ rosrun urdfdom_py display_urdf XXX/XXX.urdf # XXXには対応するディレクトリとファイル名を入れる.
```
>urdfdom_py パッケージが見つからない時はroscoreを再起動などすると見つかることがある.

### 3. pythonスクリプトから実行してみる.

```py:show_urdf.py
import roslib; roslib.load_manifest('urdfdom_py')
import rospy
# Import the module
from urdf_parser_py.urdf import URDF
# Load the module from a file.
# Pro: no need to have a roscore running.
# Cons: using hardcoded file location is not portable.
robot = URDF.from_xml_file("../urdf/XXX.urdf")
```
上記スクリプトを作成し以下のコマンドで実行できる.
 
```bash
$ python show_urdf.py
```

# 参考資料
* http://answers.ros.org/question/233251/cmake-error-not-able-to-run-catkin_make/
* http://wiki.ros.org/action/login/urdfdom_py
AWS EC2に設定してHTTP2の効果を実感した

[mediba advent calendar 2016](http://qiita.com/advent-calendar/2016/mediba) 14日目の記事です。

サーバサイドpushが出来たり、画像やCSSのダウンロードをするときに順番待ちをしなくて良くなり、表示速度が早くなる！
というHTTP2を今更ながら体感したく、昨日[あだちんも紹介してくれた](http://ceblog.mediba.jp/post/154398927492/)検証/研究用のAWSインスタンスに設定して動作を見てみました。

もちろん今ではCloudFrontを用意してポチッとやればHTTP2通信してくれるようになったわけですが、
そこはフロントエンジニアとはいえど自前で一度くらいは構築しておきたいと、興味本位で実施しました。

# 環境
## サーバ
- AWS t2.small

## OS
- AmazonLinux

## M/W
- nginx/1.10.1
- OpenSSL 1.0.2j 26 Sep 2016

# やったこと
## nginxのVerUp

nginxは[1.9.5以降HTTP2対応](https://nginx.org/en/docs/http/ngx_http_v2_module.html)とのことでした。
とりあえず楽にやってしまおうと、
```sudo yum search nginx```
したところAmazonレポジトリに1.10.1がありました。

しかしHTTP2の動作にはOpenSSL1.0.2以上が必要で、nginxをリンクしてコンパイルする必要があります。
AmazonレポジトリではOpenSSLが1.0.1であり、nginxもこれを使ってコンパイルされていました。
そこでOpenSSLをVerUpすることにしました。

## OpenSSLのVerUp

yumではインストール出来ないのでコンパイルしました。

```
wget https://www.openssl.org/source/openssl-1.0.2-latest.tar.gz
sudo tar -zxf openssl-1.0.2-latest.tar.gz 
    〜略〜
$ openssl version
OpenSSL 1.0.2j  26 Sep 2016
```

### nginxのVerUp（再）

当然、VerUpしたOpenSSLをつかってコンパイルしなくてはなりませんのでyumは使いません。
ソースコードをダウンロードしてコンパイル、上書きインストールしました。

```
sudo ./configure --prefix=/usr/share/nginx --with-http_ssl_module --with-http_v2_module --with-stream_ssl_module  --with-openssl=/usr/local/src/openssl-1.0.2j 
```
コンパイルオプションは色々省略しています。

### conf書き換え
confでSSLを有効とし、（元から設定済みでした）
HTTP2を設定しました。

> HTTP2は仕様上http通信でも有効になるのですが、ブラウザ側でhttpsの場合のみ有効になるように実装されておりSSL設定が必要になります。

```
server {
    listen       80;
    listen       8080;
    listen       443 ssl http2 default_server;
    server_name  xxxx.mediba.jp;
    #server_name  localhost;

    ssl on;
    ssl_certificate /etc/letsencrypt/live/xxxx.mediba.jp/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/xxxx.mediba.jp/privkey.pem;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;
    ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';
    〜略〜
}
```

### reload

```
    $ sudo /etc/init.d/nginx configtest
    $ sudo /etc/init.d/nginx reload
    nginx を再読み込み中:                                      [  OK  ]
```

### 動作確認
https://xxxx.mediba.jp/test/ua.php

![xxxx.png](https://qiita-image-store.s3.amazonaws.com/0/147466/d3acf513-f493-00b9-4654-a99a886532e5.png)

Protocolがh2（http2）になっていることが確認できました。

> 思ったより簡単にサーバの設定ができました。
> nginxの設定だけなので実際には色々考慮する必要があるのだろうと思います。
> コンパイルは久々にやったのでダルかったです。。。

## HTTP2の威力を見てみる

画像がたくさんあるページを用意し、アクセスしてみました。

### HTTP1.1でアクセス
![2016-10-06_10.33.39.png](https://qiita-image-store.s3.amazonaws.com/0/147466/84319ea7-6bdd-f04e-05c4-f88fa2304a55.png)



### HTTP２でアクセス
![2016-10-06_10.34.22.png](https://qiita-image-store.s3.amazonaws.com/0/147466/b2b13c11-906d-5156-ff0f-e82e7dc97c4b.png)

### 結果
ネットワークやサーバの負荷、環境の違いがありますので単純な速度比較は出来ませんが、
http2では、http1.1で発生しているセッション数上限によるQueueing（透明なところ）がなくなり、
画像を並列にダウンロードしていることがわかります。

今回のアクセスでは最大500msecのQueueingが発生しており、これが無くなるとして単純に0.5秒高速化できるはずです。
かなりの効果が見込めますね！
R: chartr で文字の１対１変換

文字列の変換は`sub`, `gsub`を通常使うが、１文字ずつの交換なら`chartr`が便利。

    chartr("at", "en", "what")
    #[1] "when"

日本語もいける。

    chartr("あいうえお", "アイウエオ", "あうんのこきゅう")
    #[1] "アウんのこきゅウ"
インタフェースの実装がラムダになるまで

#はじめに
この記事はラムダ弱者へのアップグレード記事です。
SE7まででも使える「匿名クラス」と、SE8の機能「ラムダ式」を比較します。

というのも、ラムダ式は「匿名関数」あるいは「無名関数」と呼ばれることもあり、匿名クラスとよく似た概念なのです。[^1]

[^1]: 厳密には「ラムダ関数」と「匿名関数」がイコールであり、ラムダ式はラムダ関数の記法のこと。

匿名クラスとラムダ式（匿名関数）の違いはざっくり言うと「クラスかメソッドか」で、匿名のクラスを定義するものが匿名クラス、匿名のメソッドを定義するものがラムダ式（匿名関数）という理解でほとんど問題ないと思います。


#前提

素数判定を行うメソッドを持つインタフェースがあるとする。

```java:Primes.java
public interface Primes {
    boolean isPrime(Integer param);
}
```

#普通の実装クラス
ふつーにimplementsするとこう。

```java:PrimesImpl.java
public class PrimesImpl implements Primes {

    @Override
    public boolean isPrime(Integer param) {
        for (int i = 2; i < param; i++) {
            if (param % i == 0) {
                return false;
            }
        }
        return true;
    }
}
```
呼び出し方はこう。ニューする。

```java:Main.java
public class Main {
    public static void main(String[] args) {
        System.out.println(new PrimesImpl().isPrime(7));
    }
}
```

#匿名クラスによる実装
匿名クラスを使うとこう。

```java:Main.java
public class Main {
    public static void main(String[] args) {
        Primes primesInner = new Primes() {
            @Override public boolean isPrime(Integer param) {
                for (int i = 2; i < param; i++) {
                    if (param % i == 0) {
                        return false;
                    }
                }
                return true;
            }
        };
        System.out.println(primesInner.isPrime(7));
    }
}
```

中でクラスをニューしながら実装してるからMainクラスONLY。

#ラムダ式による実装
ラムダ式を使うとこう。

```java:Main.java
public class Main {
    public static void main(String[] args) {
        Primes primesLambda = param -> {
            for (int i = 2; i < param; i++) {
                if (param % i == 0) {
                    return false;
                }
            }
            return true;
        };
        System.out.println(primesLambda.isPrime(7));
    }
}
```

匿名クラスよりちょっと省略されてる。

メソッド名も消える。これはPrimesインタフェースが関数インタフェースの要件を満たしているから。「関数インタフェース=実装すべきメソッドは必ずひとつ」なので、メソッドは自明。

ちなみに、Primesが関数インタフェースでなかったら（実装すべきメソッドがひとつでなかったら）、ラムダ式では複数のメソッド実装ができなくてコンパイルエラー。

引数と戻り値は型推論ががんばる。

#おまけ
ラムダラムダさせるとこう。

```java:Main.java
public class Main {
    public static void main(String[] args) {
        Primes primesFunction = param -> IntStream.range(2, param).noneMatch(i -> (param % i) == 0);
        System.out.println(primesFunction.isPrime(7));
    }
}
```

メンテできないから書くな！と怒られるやつ。


以上
なにか間違ってたらおしえてください！！！


###参考
[きしだのはてな Java8 Lambdaの文法拡張まとめ](http://d.hatena.ne.jp/nowokay/20130824)