OmniAICreator/Qiita-1.07M huggingface dataset:
Node.js + Selenium 環境構築に関する個人的なメモ

# Node.js + Selenium 環境構築に関する個人的なメモ
Node.js と Selenium を組み合わせることで、任意のブラウザ上で UI テストを自動化することができる。

## _1. Java のインストール（1.8.0 update111）_
<https://java.com/ja/download/>

## _2. Java Deveropment Kit のインストール（1.8.0 update111）_
<http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html>

## _3. Node.js のインストール（v6.9.1 LTS）_ 
<https://nodejs.org/ja/>
インストール後、環境変数を設定してから以下のコマンドを実行し、バージョンが表示されればインストール成功。

```
node --version
```
### 環境変数の設定
システム環境変数 Path：C:\Program Files\nodejs\
ユーザー環境変数：PATH：C:\Users\ (userName) \AppData\Roaming\npm

## _4. selenium-webdriver のインストール（3.0.1）_
ブラウザの拡張機能や OS ネイティブの機能などを使用し、ブラウザを操作するライブラリ群、もしくはその仕組みのこと。

```
npm -g install selenium-webdriver
```

## _5. ライブラリ（mocha, expect.js）のインストール_

```
npm -g install mocha
npm -g install expect.js
```
mocha: テスティングフレームワーク
expect.js: アサーションライブラリ

## _6. Selenium Server のダウンロード_
Selenium の本体。
<http://www.seleniumhq.org/download/>

## _7. Seleinum Google Chrome Driver のダウンロード（2.25）_
<http://chromedriver.storage.googleapis.com/index.html>

## _8. Selenium Server の起動_
```
java  -Dwebdriver.chrome.driver=chromedriver -jar selenium-server-standalone-3.0.1.jar
```
※`-jar selenium-server-standalone-3.0.1.jar` が `-Dwebdriver.chrome.driver=chromedriver` よりも前にあるとうまくいかない。

## _9. テストコードの実行_
例では、実行時のオプション設定でタイムアウトの時間を 10000ms にし、test.js というテストコードを実行する。

```
mocha tests/test.js --timeout 10000
```

コマンドを実行するとテスト結果がコンソールに表示される。
　緑: OK
　赤: NG  

---
実行ディレクトリ

```
C:
　└ Users
　　└ xxx
　　　　└ AppData
　　　　　└ Roaming 
　　　　　　　└ npm 
　　　　　　　　└ node_modules
　　　　　　　　　　└ selenium
　　　　　　　　　　　├ chromedriver.exe
　　　　　　　　　　　├ test.js
　　　　　　　　　　　└ selenium-server-standalone-3.0.1.jar
```

## 参考資料 
<https://ics.media/entry/5759/2>
<https://solutionware.jp/blog/2016/03/30/selenium-webdriver%E3%81%A7%E5%AE%9F%E8%B7%B5%E7%9A%84%E3%83%86%E3%82%B9%E3%83%88%E3%82%B1%E3%83%BC%E3%82%B9%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B%EF%BC%88node-js%E7%B7%A8%EF%BC%89/>
<http://qiita.com/japboy/items/28d3313bf5c52ae7de42>
UIDatePickerのバグ？

# 検証コード

iOS 9.3.3 + Swift 2

```swift
class ViewController: UIViewController {

    let datePicker = UIDatePicker()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        datePicker.datePickerMode = .Date
        datePicker.center = self.view.center
        datePicker.date = NSDate(timeIntervalSince1970: 0)
        self.view.addSubview(datePicker)
    }
    
    override func viewWillLayoutSubviews() {
        super.viewWillLayoutSubviews()
        print(datePicker.date)
    }
}
```

# 西暦 → 和暦

## 起動時

```
1970-01-01 00:00:00 +0000
```

![西暦](https://qiita-image-store.s3.amazonaws.com/0/18828/3da8bb17-c0f0-8f8f-95e1-c7177e4f6928.png)

## 和暦に変更

* 変更前にDatePickerを触らない

```
1970-01-01 00:00:00 +0000
```

![触らず和暦](https://qiita-image-store.s3.amazonaws.com/0/18828/b43af93a-b0bb-bda5-8dfb-087b04b833c7.png)

年がおかしい。（正しくは昭和45年）
月と日がグレーになっている。

* 変更前にDatePickerを触る（ちょっとズラして元に戻す）

```
2619-01-01 00:00:00 +0000
```

![触って和暦](https://qiita-image-store.s3.amazonaws.com/0/18828/2a34b9de-05dd-d615-995b-f36c1e30947e.png)

`.date`が変更されている。
年がおかしい。（正しくは平成631年）
月と日がグレーになっている。

# 和暦 → 西暦

## 起動時

```
1970-01-01 00:00:00 +0000
```

![和暦](https://qiita-image-store.s3.amazonaws.com/0/18828/1a0f0c44-2577-61ca-43cd-0a9db51de131.png)

## 西暦に変更

* 変更前にDatePickerを触らない

```
1970-01-01 00:00:00 +0000
```

![触らず西暦](https://qiita-image-store.s3.amazonaws.com/0/18828/f3644f18-ad21-6665-cd21-a0c264ab87a1.png)

年がおかしい。（正しくは1970年）

* 変更前にDatePickerを触る（ちょっとズラして元に戻す）

```
0044-12-31 23:41:01 +0000
```

![触って西暦](https://qiita-image-store.s3.amazonaws.com/0/18828/4a82b135-9776-fab0-8da5-7f16677bb8c5.png)

`.date`が変更されている。
年がおかしい。というか西暦44年は表示できない。

# 対策

## autoupdatingCurrent...()

```swift
datePicker.locale = NSLocale.autoupdatingCurrentLocale()
datePicker.calendar = NSCalendar.autoupdatingCurrentCalendar()
datePicker.calendar.locale = NSLocale.autoupdatingCurrentLocale()
```

DatePickerの表示がおかしいのはちょっと直った。（一部グレー化のみ）

## LocaleとCalendarの再設定

viewWillLayoutSubviews()の中でLocaleとCalendarを再設定。

```swift
datePicker.locale = NSLocale.currentLocale()
datePicker.calendar = NSCalendar.currentCalendar()
```

DatePickerの表示がおかしいのは直った。（1年ずれと一部グレー化）
`.date`が変更されるのは直らない。

## dateを保存しておいて再設定する

valueChanged()で保存しておいて、viewWillLayoutSubviews()で再設定。

```swift
var latestDate = NSDate(timeIntervalSince1970: 0)

override func viewDidLoad() {
    :
    datePicker.addTarget(self, action: #selector(ViewController.valueChanged(_:)), forControlEvents: .ValueChanged)
    :
}

override func viewWillLayoutSubviews() {
    super.viewWillLayoutSubviews()
    //再設定
    datePicker.locale = NSLocale.currentLocale()
    datePicker.calendar = NSCalendar.currentCalendar()
    datePicker.date = latestDate
}

func valueChanged(sender: UIDatePicker) {
    //保存
    latestDate = sender.date
}
```

これで直った。

# おしまい

標準アプリでもおかしくなる。（リマインダーとヘルスケアで確認）
どうもバグくさい。
新規事業でRailsアプリケーションを作る際の確認事項とチーム作り

# 複数人での開発でも指針を保てるようにgemを入れる
bullet
rubocop
minitestかrspec
draperを入れたり、service層validator層を使うか考えて入れてしまうとよいかもしれない
admin機能にはrails engine使っちゃうのがよいかも

# railsとrubyのバージョンアップがしやすいように考える
rails5のapi versionを使うかどうか考える
gemをどのくらい使うかはそのgemの完成度というよりはrailsやrubyのバージョンアップの障壁にならないかを基準にする。バージョンアップの障壁になる場合は自前でライブラリを作成する

# CI
slackは使いたい
Circle CIやJenkinsなどを導入する

# OO設計やレビュー方針などをすり合わせる
http://qiita.com/tos-miyake/items/8dffb16273726f538d49
https://gist.github.com/sunaot/2937524

# レビュー
- テストでコードを担保する(テストが重くならないように気を付ける、必要の無いまたは効果の低いテストは書かない、人の命・決済・セキュリティの担保・サービスが止まらないこと・どれが条件であるかよく考える)
- コメントに絶対直して欲しい・余裕があれば直して欲しい・直す必要はないが参考など付けてマージまでのスピードを上げる

# チーム
- githubフローの目的は全員のコード品質の向上と成長のためのものであることを伝える
- 一ヶ月でレビュー出来るようになって欲しいと伝える
- 任せてもよいと思えたらスクラムやチーム開発を辞めて、単独開発をやったほうが楽しいのではないかと考えている
- コードリーディングや学習をメインの課題とする、開発は二の次、理想は9:1くらい、開発力が向上しても実力がついたと勘違いせずレビューなどに時間を取られないようにして研鑽に励む
- テストやOO指向は学んだり、議論しないと身につかないので意識して議論するようにする
- クソみたいなコードを書かず、クソみたいな時間を取らない、両立してこそのエンジニアリング
- 全て書き直してもよいという姿勢でコーディングする
- そもそも何のために働くのかをよく考えてもらう、その目的が技術向上に結びつかない人は一緒に働きたくない
- やるかどうかを見当し始めてはいけない、やったことを分析してやるかやらないかを決めるべきだ、先にやるには個人個人が高い倫理感を持って仕事に取り組まなくてはいけない

# インフラ
- レプリケーションをする
- シャーディング
- コスト計算やmemory, cpuの見方、計算を出来る

# awsやgcp,herokuなどのcloudサービスを使う
- production, staging、developmentなどに分ける

# ログの収集をする
- accessログ、アプリケーションログをとる
- hadoopサーバーを立てる

# サーバーの監視をする
- new_relicなど入れる
- moninやcloudforecastなどをいれる

# 統計を取る
- SpreadSheetを活用する
- Bigquery, pythonやrでの分析を行う
- 機械学習やDeep Learningをする

# 攻撃対策
- rackなどrailsのmiddlewareに詳しくなる
- ネットワークの監視や対策を知る

# 期限について
- 開発に終わりはないが、終わりがないことを前提に開発していると間延びしてしまうので工夫する
- 1週間かかることを1日でやることは難しいと思われるが、6ヶ月かかることを1ヶ月でやることはできそうである

# VRやECやメディア
- ネットビジネスであることを理解し、コンテンツやプラットフォーム自体の質を上げる
- ユーザーをよく見る
- アプリ、SNS、SEO、広告を深く理解する

# IoTやtoBの技術
- そもそもプロトタイプを完成させる
- 安さが競争優位につながるのでコストをおさえ続ける、工場生産のコネクションなど外交力も重要といえる
- ユーザーを見すぎてはいけない

# エンジニアとして
市場規模や投資に関して正しい知識を持つ
市場の価格を知りコストを抑える
トレンドを抑える
技術的に出来ないことを知っていることがエンジニアリングではなく、あらゆるトレードオフを改善するのがエンジニアリングであることを常に心がける

# サイエンティストとして
トレンドに左右されないように論文なども興味を持ってみるようにする
新たな分野や技術を学び、発明し発展させる

# 人類として
言葉尻に囚われず、チームメンバーや顧客、ユーザーの言いたいことを思いやる
[Qiita]トップページにいいねリストへのリンクがあったらいいのにね

こんな感じになると思っていました...
----
![iine161208.png](https://qiita-image-store.s3.amazonaws.com/0/67318/1810fe44-e887-4fae-98a3-adc0e4f3c51a.png)

//関連//
----
http://qiita.com/gimupop/items/be53044143a9a3e90a4b#comment-f9439ea315359d307a2e
http://qiita.com/akira-hamada/items/b099f1b22abaf58d8828
[iOS]MetalでGPUコンピューティング(5) MTLLibrary


この記事は、Metal Advent Calendar2016の8日目です。

これまで、MetalのGPUコンピューティングについて解説記事を書いてきました。
[[iOS] MetalでGPUコンピューティング (1) 最小限のコードの記述と特性の把握](http://qiita.com/yuky_az/items/ece9b64befc635e89f1a)
[[iOS] MetalでGPUコンピューティング (2) 群知能](http://qiita.com/yuky_az/items/ce5920f28c08e743418b#_reference-cc4434da198d861bba61)
[[iOS] MetalでGPUコンピューティング (3) MTLDevice](http://qiita.com/yuky_az/items/1992daff208223468e70)
[[iOS] MetalでGPUコンピューティング (4) MTKView](http://qiita.com/yuky_az/items/http://qiita.com/yuky_az/items/a2556edcfa417b7d912c)
 本記事では、前回に引き続きAppleが提供するサンプルコードの解説を行います。

扱うサンプルコードは、前回と同じ[ライフゲーム](https://ja.wikipedia.org/wiki/%E3%83%A9%E3%82%A4%E3%83%95%E3%82%B2%E3%83%BC%E3%83%A0)のアプリ、MetalGameOfLifeです。
 [MetalGameOfLife](https://developer.apple.com/library/content/samplecode/MetalGameOfLife/Introduction/Intro.html)

![IMG_5933.PNG](https://qiita-image-store.s3.amazonaws.com/0/35297/fa9b4e62-91a6-83fb-c60c-3666fc44fdf1.png "IMG_5933.PNG")
（実行画面）

今回は、サンプルコード内の[MTLLibrary](https://developer.apple.com/reference/metal/mtllibrary)について解説を行います。
MTLLibraryを用いることでGPU側の言語Metal shading languageの関数を、CPU側の言語Objective-CやSwiftで扱うことが可能になります。

MTLLibraryはクラスではなくプロトコルです。
MTLLibraryに従うオブジェクトは、Metal shading languangeのソースコードを含んでいます。 シェーダーファイル内にあるソースコードはビルド時にコンパイルされ、文字列で書かれたMSLのコードはランタイム時にコンパイルされます。
MTLLibraryのオブジェクトを生成するためには、MTLDeviceのメソッドを用います。

コンパイル済みのバイナリからライブラリを作る場合は、以下のメソッドのどれかを用います。

+ newDefaultLibrary()
+ makeLibrary(filepath:)
+ makeLibrary(data:)

また、ランタイムでテキストからコンパイルしライブラリを作る場合は、以下のメソッドのどれかを用います。

+ makeLibrary(source:options:completionHandler:)
+ makeLibrary(source:options:)



繰り返しになるのですが、このサンプルコードは、主に以下のファイルで構成されています。

AAPLRender.h
AAPLRender.m
AAPLViewController.h
AAPLViewController.m
Sharder.metal

このうち、AAPLRender.mには並列コンピューティング及び描画のCPU側のロジックが、Shader.metalには頂点シェーダー、フラグメントシェーダー、GPUコンピューティング用のシェーダーが書かれています。

ここからは、サンプルコード内におけるMTLLibraryの使用箇所を解説していきます。
AAPLRender.mに以下の記述があります。

```Objective-C: AAPLRender.m
@property (nonatomic, strong) id<MTLLibrary> library;    
...
_library = [_device newDefaultLibrary];
```

MTLDeviceのnewDefaultLibraryメソッドにより、ライブラリが生成されています。
このサンプルコードでは、コンパイル済みのバイナリからライブラリの生成を行なっている訳です。

以下のコードでは、頂点シェーダー及びフラグメントシェーダーのコンパイル済みの関数を、MTLFunctionに従うオブジェクトに格納しています。

```Objective-C:AAPLRender.m
    id<MTLFunction> vertexProgram = [_library newFunctionWithName:@"lighting_vertex"];
    id<MTLFunction> fragmentProgram = [_library newFunctionWithName:@"lighting_fragment"];
```

@"lighting_vertex"、及び@"lighting_fragment"はShader.metal内に記述されている関数名です。

また、以下のコードでは、コンピューティング用のコンパイル済みの関数を、MTLComputePipelineDescriptorクラスのオブジェクトのプロパティに設定しています。

```Objective-C:AAPLRender.m
descriptor.computeFunction = [_library newFunctionWithName:@"game_of_life"];
...
descriptor.computeFunction = [_library newFunctionWithName:@"activate_random_neighbors"];

```

@"game_of_life"、及び@"activate_random_neighbors"はShader.metal内に記述されている関数名です。

このように、MTLLibraryはMetal shading languageの関数を扱うためのインターフェイスの役割を果たしているのです。

今回はライフゲームのサンプルコード内におけるMTLLibraryの解説を行いました。
次回以降、さらに他の箇所についての解説を行なっていきます。
ChefでHubotをインストールする


コマンドラインでのインストールと同様のことをChefで行おうとしたときに、対話式の部分で躓いたのでそのときのメモ。
※Node.jsがインストールされている前提です。
## コマンドラインでインストール

```
$npm install -g yo generator-hubot hubot coffee-script
$yo hubot
```
このときに対話式でいくつか入力を求められます。
Owner : 制作者のメールアドレス
Bot name : 生成するHubotの名前
Description : 生成するHubotの説明
Bot adapter : 使用するアダプタ
## Chefでインストール
chefで対話式のインストーラを扱う場合はexpectと使うと自動入力してくれる。

```rb
cookbook_file "/tmp/yo_hubot.sh" do
  mode "755"
  source "your_directory/yo_hubot.sh"
end

execute "install hubot" do
  not_if "which hubot"
  command "npm install -g yo generator-hubot hubot coffee-script"
  notifies :run, "execute[yo_hubot]"
end

execute "yo_hubot" do
  action :nothing
  command "/tmp/yo_hubot.sh"
end
```
```bash:yo_hubot.sh
#!/bin/bash
expect -c '
spawn yo hubot
set timeout -1
expect {
  -regexp ".*Y/n.*" {
    exp_send "n\r"
    -regexp ".*Owner.*" {
      exp_send "your e-mail adress\r"
    }
  }
  -regexp ".*Owner.*" {
    exp_send "your e-mail adress\r"
  }
}
expect {
  -regexp ".*Bot name.*" {
    exp_send "your bot name\r"
  }
}
expect {
  -regexp ".*Description.*" {
    exp_send "your bot description\r"
  }
}
expect {
  -regexp ".*Bot adapter.*" {
    exp_send "use adapter name\r"
  }
}
expect eof
'
```
何か間違ってるとかこっちの方がいいとかありましたらお願いします。
dplyrとRedshiftの連携


dplyrとデータベースのつなぎ方は下記リンク先に乗っていたが、
RedShiftはなかったので調べた。
[dplyrとデータベース](http://rpubs.com/dichika/dplyr_db)


正確な情報は下記公式リンクから
[Connecting R with Amazon Redshift](https://aws.amazon.com/jp/blogs/big-data/connecting-r-with-amazon-redshift/)

#1.もろもろの情報を入れてRedShiftと繋ぐ
```
# now run analyses with the dplyr package on Amazon Redshift
install.packages("dplyr")
library(dplyr)
library(RPostgreSQL)
#myRedshift <- src_postgres("<DBNAME>",
#	host = "<ENDPOINT>,
#	port = <PORT>,
#	user = "<USER<",
#	password = "<PW>")
myRedshift <- src_postgres('demo',
host = 'redshiftdemo.ckffhmu2rolb.eu-west-1.redshift.amazonaws.com',
port = 5439,
user = "markus", 
password = "XXX")
```



#2.tbl関数でテーブルオブジェクト作成
```
# create table reference
flights <- tbl(myRedshift, "flights")

# simple and default R commands analyzing data frames
dim(flights)
colnames(flights)
head(flights)

#the summarize command reduces grouped data to a single row.
summarize(flights, avgdelay=mean(arrdelay))
summarize(flights, avgdelay=max(arrdelay))
```
テーブルオブジェクト作成時点ではデータはメモリーにロードされていない。
オブジェクトに対し何らかの処理を実行した時点でSQLが走る。



#3.あとはdplyrでお好きに！
```
flights %>%
filter(depdelay-arrdelay>60) %>%
select(tailnum, depdelay, arrdelay, dest)
```
















便利！
Terraform のとてもざっくりとした概要（うっかり本番環境を破壊しないための知識）

Terraform をはじめて使う人向けのとてもざっくりとした概要。うっかり本番環境のリソースを消し飛ばさないために、最低限の知っておくと良いんじゃないかと思われることを書きました。

_※Terraform はAWS 以外にも対応しています_

# TL;DR

- `terraform plan` を確認後、 `terraform apply` でAWSリソースの反映を行います
- AWS リソースの実態ではなく、ステートファイル (`terraform.tfstate`) の内容の方が重要です
- 職人の手により追加されたAWS リソースを取り込む際に、うっかり `terraform apply` するとAWS リソースがニフラムします


# 大まかなTerraform の動作

Terraform で環境構築する流れは、

1. Terraform ファイルを書く
2. `terraform plan` で変更内容を確認する
    - 目を凝らして変な差分がないかよく確認することを推奨します
3. `terraform apply` で変更内容をﾄﾞｰﾝと反映する

です。

## サンプル

![image](https://qiita-image-store.s3.amazonaws.com/0/257/ad56272e-820e-38c5-122d-8e301cf54721.png)

こんな感じの状態で、 `terraform plan` すると、

![image](https://qiita-image-store.s3.amazonaws.com/0/257/e2a976ef-d1b3-7d76-e8b2-183406e53cec.png)

となり（この時点ではまだ更新されない）、 `terraform apply` すると、

![image](https://qiita-image-store.s3.amazonaws.com/0/257/87ca4566-1496-0c92-7bbe-077f2b114820.png)

となります。

具体的な記述方法や、他コマンドは公式ドキュメントを参照してください。
https://www.terraform.io/docs/index.html


## ポイント

`terraform apply` は、Terraform ファイル (`*.tf`) の定義とステートファイル (`*.tfstate`) の内容の差分がなくなるようにAWS 上のリソースが変更されます


## 注意が必要な状態

### AWS 上にリソースが存在するが、ステートファイルには記述されていない

上記のサンプル図のS3 がこの状態です。

Terraform 管理されていないリソースなので、Terraform から変更ができません。特段、気をつけることはありませんが、Terraform の定義とAWS リソースの実態が衝突して `terraform apply` が失敗する事があります。

例えば、すでに存在しているS3 バケットと同じ名称のS3 バケットをTerraform に定義した場合など。


### AWS 上にリソースが存在し、ステートファイルにも記述されているが、Terraform ファイルには未定義

上記のサンプル図のRDS がこの状態です。
（Terraform を使ってAWS リソースを削除する場合に発生します）

削除するつもりでこの状態になるのは問題がありません。ただし、職人の熟練した技（AWS マネジメントコンソール）により追加されたAWS リソースをあとからTerraform 管理する際にこの状態が一時的に発生します。


#### AWS 上の既存リソースをTerraform に取り込む手順

:construction_worker: 職人の熟練した技をTerraform で再現するには少々手間がかかります

1. `terraform import` でAWS リソースの実態からステートファイルを生成する
2. `terraform state mv` などで、該当リソースの定義コードの配置を調整する
3. `terraform plan` の差分がなくなる様に、Terraform コードを記述する

この一連の作業の途中で、うっかり `terraform apply` するとTerraform に取り込みたかったはずのAWS リソースが吹っ飛びます。取り込みたいのはきっと production 環境のリソースですので、それは大変なことになります。 :fearful: 


# おわりに

大事なことなのでもう一度言いますが、ステートファイルの中身がめっちゃ重要。
とても大事なので、LiB ではステートファイルをバージョニング設定したS3 で管理してます。

_Terraform のAdvent Calendar が見当たらなかったけど、人気ないのかな..._
littleBitsでレジっぽく商品をスキャンする

こんにちは。mfunakiと申します。SAPという会社でDigital Transformationでビジネスを変える！との旗印のもと、デザイン思考のワークショップをファシリテートする中で、出てきたアイデアからBusiness Model Canvasを使ってビジネスモデルを導き出したり、(SAPではExperience Prototypingという言い方をしますが)完成度としてはLo-Fiな(最終プロダクトほどの完成度でなくとも)顧客体験を検証できるようなプロトタイプをクイックにお客さんと作るなんてお仕事をしています。平たく言うと、「アイデアが良いだの悪いだの評価するのはやめようぜ。プロトがイケてるイケてないを評価してクイックにバージョンアップ重ねていこうよ」と言い続けるお仕事です。
## littleBitsらしさ
さて、みなさんの考えるlittleBitsらしさって何でしょう？ 私にとっては、「磁石でくっついたり離れたりする(しかもいったん電源切ったりしなくていい)」というところです。littleBitsアドベントカレンダーに何回か書かせていただければと思いますが、まずは、PostIt感覚で張り替え(つなぎ変え)が気軽にできる利点を生かしたサンプルをご紹介させていただければと思います。

## littleBitsを使った簡易レジの材料
ICタグでもバーコードでも何でもいいのですが、商品情報を読み取るようなレジを作っていきたいと思います。とはいうものの、littleBitsにはバーコードリーダーbitがあるわけでも、RFIDリーダーbitがあるわけでもないので、Arduino bitを使ってちょっと工夫してみます。
材料はこちら。
* p1 power x 1 (および電池、電池ケーブル)
* w1 wire x 5
* w2 branch x 1
* w6 arduino x 1
* w7 fork x 1
* i1 slide switch x 3 (説明する上で見やすいのでslide使っていますが、実際にはi6 dimmer x 3のほうが良いと思います)
* o14 bright led x 3

これらのbitを次の写真に挙げるようにつなげます。
![IMG_20161208_083040.jpg](https://qiita-image-store.s3.amazonaws.com/0/19248/7184a1c4-b192-9d2b-68e1-9c3b8ba2e836.jpeg)

## プログラミング
Arduino bitにはこんなプログラムを流し込みます。

```c
boolean LED1 = false;
boolean LED2 = false;
boolean LED3 = false;

void setup(){

  pinMode(1, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(9, OUTPUT);
  
  digitalWrite(1, LOW);
  digitalWrite(5, LOW);
  digitalWrite(9, LOW);
}

void loop(){
  Serial.begin(115200);
  
  int pot = analogRead(A0);
  int val = float(pot)/1023.5 * 99.9;
  
  delay(10);
    
  checkVal(val);
}


void checkVal(int v) {
   if (v >= 0 && v <= 25) { LED1 = false; LED2 = false; LED3 = false; } 
   if (v > 25 && v <= 50) { LED1 = true;  LED2 = false; LED3 = false; }
   if (v > 50 && v <= 75) { LED1 = false; LED2 = true;  LED3 = false; }
   if (v > 75 && v <= 99) { LED1 = false; LED2 = false; LED3 = true;  }
   
   if (LED1) {digitalWrite(1, HIGH);} else {digitalWrite(1, LOW);}
   if (LED2) {analogWrite(5, v);  } else {analogWrite(5, 0);}
   if (LED3) {analogWrite(9, v);  } else {analogWrite(9, 0);}
}
```
簡単に言えば、Arduinoのアナログ入力(a0)に入った値によって、４つの状態(オフ、値１、値２、値３)に場合分けし、３つのLEDをオン、オフするというものです。入力の値はslide switchやdimmerを使いますが、値にはアナログなゆらぎがあるので、幅を持たせるようにしています。

slide switchをスライドさせながら、出力される値の増減に応じてLEDが付いたり消えたりする動きをご覧ください。

[![littleBits - Arduino使ってLED順番にチカチカ](http://img.youtube.com/vi/77mPCQrezPQ/0.jpg)](http://www.youtube.com/watch?v=77mPCQrezPQ)

## 品物スキャン
スライドのさせ具合を変えたslide switchを３種類用意して、つなぎ変えることで、品物スキャン的な動作をさせることができます。ここでは、イチゴ、ブドウ、
オレンジに対応するslide switchをArduinoにつなげることで、対応するLEDが光っています。

[![littleBits - マグネット使って品物スキャン](http://img.youtube.com/vi/icAmGnTIDtY/0.jpg)](http://www.youtube.com/watch?v=icAmGnTIDtY)

## さらに発展させるには
今回のサンプルでは、３つまでの品物のそれぞれについてLEDの点滅分けをしてみたわけですが、さらなる発展としては、
* 点滅分けではなく、number bit(o21)に値段を表示させる
* number bitを2つ接続し、スキャン(接続)した品物の値段、および合計金額を表示させる
* 品物のスキャン(接続)時にbuzzer(o6)から音を出す
* cloudBit(w20)でクラウドにつなぎ、購買履歴からリコメンデーションする

ほかにもいろいろ考えてプロトタイピングしてみていただければと思います。

## 昔話
以前はp1 power, p3 usb powerの他にp2 coin batteryというのがあったので、バッテリー＋dimmerでもっとこじんまり、かつワイヤレスな品物実装ができたのですが、どこに行ってしまったんでしょうかね？

それではまたどこかでお会いしましょう。さようなら！
FuelPHPでORMのモデル関係においてconditionsを使用してみる

## はじめに
ORMを使用した場合でモデル関係で条件を付与してデータを取得したかったのでそのメモになります。以下がわかりやすかったです。感謝!
参考：[FuelPHPのORMでconditionsを持ったRelationの書き方。](http://madroom-project.blogspot.jp/2012/10/fuelphpormconditionsrelation.html)


環境
Amazon Linux
FuelPHP 1.8

## 詳細
----

#### テーブル構成
例えばテーブル構成が以下のような場合

###### Aテーブル

| APKey | field1 |
|:----:|:------:|
| 1 | dog | 
| 2 | cat | 
| 3 | bard | 

###### Bテーブル

| BPKey | APKey | field1 |
|:----:|:------:|:------:|
| 1 |1| pochi | 
| 2 |1| hana | 
| 3 |2| momo | 
| 4 |2| nyanko | 
| 5 |2| tama | 
| 6 |3| momo | 

条件を付与するにはconditionsを追加すればOKです。

```php
class Model_Atable extends \Orm\Model {
        :
	protected static $_has_many = array(
            'bTable'  => array(
                'model_to'          => 'bTable'
            ,   'key_from'          => 'APKey'
            ,   'key_to'            => 'APKey'
            ,   'cascade_save'      => false
            ,   'cascade_delete'    => false
            ,   'conditions'        => array(
    	           'where'     => array(array('field1','=','momo'))
    	        ,  'order_by'  => array('BPKey'   => 'asc')
                )
            )
	);
```

#### 結果

とりあえずタスクで実行するやつ書きます。

```php
<?php
namespace Fuel\Tasks;
class Ormtest {
    public function run($arg) {
        $query = Model_Atable::query();
        $query->related("bTable");
        $rows = $query->get();
        print_r($rows);
    }
}
```

結果

```
$ oil refine Ormtest
Array
(
    [0] => Array
        (
            [APKey] => 1
            [field1] => dog
            [bTable] => Array
            (
            )
        )
    [1] => Array
        (
            [APKey] => 2
            [field1] => cat
            [bTable] => Array
            (
                [0] => Array
                    (
                         [BPKey] => 3
                         [APKey] => 2
                         [field1] => momo
                    )
            )
        )
    [2] => Array
        (
            [APKey] => 3
            [field1] => bard
            [bTable] => Array
            (
                [0] => Array
                    (
                         [BPKey] => 6
                         [APKey] => 3
                         [field1] => momo
                    )
            )
        )
)
```

## あとがき
条件式の値をconst定義から取ろうとしたらクエリーの解析でカラムフィールドと間違えられて少しはまりました。
実値にすれば問題なくできました。この部分が少しはまったくらいでした。

## その他
参考
[FuelPHPのORMでconditionsを持ったRelationの書き方。](http://madroom-project.blogspot.jp/2012/10/fuelphpormconditionsrelation.html)
Movable Type 用テーマ 「Initio」のご紹介

この記事は、2016年 Movable Type Advent Calendar 7日目の記事です。

久々に、Movable Type 用のテーマを「Initio」を作成しましたので、ご紹介します。

https://github.com/Nick-smallworld/mt-theme-Initio

Creative Commons 3.0で配布します。商用、個人利用などに自由にお使いください。

![initio.png](https://qiita-image-store.s3.amazonaws.com/0/83767/c5d8f66e-a294-26a6-12bd-d073dd2230ae.png)


## これは何?

Movable Type 用のデザインテーマです。
このCreative Commons Licenceで配布されているテンプレート「Inito」を元に、Movbale Type用にカスタマイズしています。

http://www.gettemplate.com/info/initio/

## どうやってインストールするの?

ダウンロード後、zipファイルを解凍して、Movable Type のthemes ディレクトリ配下に「initio」フォルダをアップロードしてください。

https://www.movabletype.jp/documentation/mt6/design/themes/

## 勝手に使ってよいの？

はい、個人利用、ビジネス利用などに、ご自由にお使いください。

## ライセンス

Initio のライセンスを引き継ぎ、Creative Commons 3.0 とします。
テンプレート下部にある「GetTemplate」の文字は消去できません。
詳細については、以下をご覧ください。

https://creativecommons.org/licenses/by/3.0/
http://www.gettemplate.com/info/initio/


## 特徴は？

インストールすると、OGP用のカスタムフィールドが自動的に設定されます。OGP画像を挿入すると、トップページ及び記事の詳細ページに画像が表示されます。

BootStrapベースなので、慣れている方はカスタマイズしやすいと思います。

Initioには、今回テーマに使用したテンプレート以外にも、2カラムのページデザインなど、いくつかの雛形があるので、拡張できます。

ウェブサイトや個人メディアの素材用として作成したため、コメントや検索などのインタラクティブな機能はつけていません。利用する際はカスタマイズしてご利用ください。

## 自分もテーマを作ってみたい！

Movable Type のドキュメントサイトに、テーマの開発に関する技術ドキュメントがありますので、ぜひチャレンジしてみてください！

https://www.movabletype.jp/documentation/#designer-guide

## バグがあったよ！

アドベントカレンダーに間に合わせるようと頑張ったのですが、細かいところにバグが存在する可能性があります。修正して、もしよければプルリクエストください (^^;
独自ドメインでの静的コンテンツの配信

# 概要
S3へアップロードした静的コンテンツを、CloudFront経由で配信。
Route53で取得した独自ドメインでサブドメインを含まないドメイン名を使用。

# S3
## バケット作成
1. [S3 Management Console](https://console.aws.amazon.com/s3/) へ遷移。
1. 「バケットを作成」ボタンを押下。
1. バケット名を入力。
1. 「作成」ボタンを押下。
1. バケットが作成される。

## 静的コンテンツアップロード
1. 作成したバケットを選択。
1. 「アップロード」ボタンを押下。
1. 「ここにアップロードするファイルとフォルダーをドラッグアンドドロップします。」へ、index.htmlなどをドラッグ・アンド・ドロップ。
1. (必要に応じて)「詳細の設定」ボタンを押下し、「低冗長化ストレージを使用」を選択。
1. 「アップロードの開始」ボタンを押下。
1. 静的コンテンツがアップロードされる。

# CloudFront
## Distribution作成
1. [AWS CloudFront Management Console](https://console.aws.amazon.com/cloudfront/) へ遷移。
1. 「Create Distribution」ボタンを押下。
1. Webの「Get Started」ボタンを押下。
1. Origin Domain Nameで作成したバケットを選択。
1. Restrict Bucket Accessを「Yes」に変更。
1. Origin Access Identityを「Create a New Identity」に変更。
1. Grant Read Permissions on Bucketを「Yes, Update Bucket Policy」に変更。
1. Alternate Domain Names(CNAMEs)にドメイン名を入力。
1. (必要に応じて)Default Root Objectにindex.htmlを入力。
1. 「Create Distribution」ボタンを押下。
1. Statusが「In Progress」から「Deployed」に変われば完了(10分以上かかるかも)

# Route 53
## ドメイン取得(確認)
1. [Route 53 Management Console](https://console.aws.amazon.com/route53/) へ遷移。
1. Registered domains を選択。
1. 取得したドメインがあることを確認。

## 設定
1. Hosted zones を選択。
1. 取得したドメインがあるので選択。
1. NSとSOAがあることを確認。
1. 「Create Record Set」ボタンを押下。
1. サブドメインを含まない「zone apex」のため、Nameはそのまま。
1. Typeもそのまま。
1. Aliasを「Yes」に変更。
1. Alias Targetに生成した「xxxxxxxxxxxxxx.cloudfront.net」を設定。
1. 「Save Record Set」ボタンを押下。
1. ブラウザからこのドメインへアクセスすると表示される。

# お礼
tsukapah様のお陰で無事配信できました。
ありがとうございました。
docker-compose stop したらエラーになり、ゾンビプロセスが残ってdocker-compose upできなくなった話

# docker-compose up できなくなった

docker-compose stopをしたら下記のようなエラーに遭遇した

```
$ docker-compose stop
Stopping docker_nginx_1 ... 
Stopping docker_php_1 ... 
Stopping docker_php_1 ... error
Stopping docker_redis_1 ... error

ERROR: for docker_nginx_1  UnixHTTPConnectionPool(host='localhost', port=None): Read timed out. (read timeout=70)
Traceback (most recent call last):
  File "<string>", line 3, in <module>
  File "compose/cli/main.py", line 61, in main
  File "compose/cli/main.py", line 113, in perform_command
  File "contextlib.py", line 35, in __exit__
  File "compose/cli/errors.py", line 56, in handle_connection_errors
TypeError: log_timeout_error() takes exactly 1 argument (0 given)
docker-compose returned -1
```

```
# docker-compose ps
```
しても、同じエラー...

# 解決までの流れ


## netstat -untap でdockerのportの状態を調べる。
```
# netstat -untap
root      1497  0.0  0.0      0     0 ?        Z    06:31   0:00 [docker-proxy] <defunct>
root      1520  0.0  0.0      0     0 ?        Z    06:31   0:00 [docker-proxy] <defunct>
root      1529  0.0  0.0      0     0 ?        Z    06:31   0:00 [docker-proxy] <defunct>
```
なんかいる。。。
おそらく通常は

```
# netstat -untap
tcp6       0      0 :::80                   :::*                    LISTEN      25238/docker-proxy
tcp6       0      0 :::443                  :::*                    LISTEN      25230/docker-proxy
```
こんな感じでコンテナのポートと紐付いている（と思っている）。

docker-stopしたのに port80や443などと紐付いていたであろうdocker-proxyが残ってた場合は下に続く。
（そうじゃない場合は、下記対応では解決できないかもしれないです）

```
# ps -aux | grep docker
```

で、docker-proxyがコンテナに紐付かず、stopしたのに残っているプロセスがないか探す。
ゾンビ化してるプロセスがあったら、そいつの親となっているプロセスを`kill`する。

その後

```
# docker-compose up -d
```

すれば、解決！


まだまだdockerにはなれず、つまるところが多い、、
そもそもこんなことにならないように、設定しておけるところとかあるのだろうか？
Qiita記事をマークダウンで見ることができるようになってました


歯車ボタンのメニューの中にMarkdownで本文を見るというメニューが増えていました。
また、URLの末尾に`.md`をつけても記事の本文をマークダウンで見ることができるようです。

![スクリーンショット 2016-12-08 10.30.56.png](https://qiita-image-store.s3.amazonaws.com/0/74551/92be3173-94af-700d-433b-9d4e7ab47bd1.png "スクリーンショット 2016-12-08 10.30.56.png")
【ワンライナ】PostgreSQLドキュメントの翻訳で、他の人が未着手のものを確認する

この記事は[PostgreSQL Advent Calendar 2016](http://qiita.com/advent-calendar/2016/postgresql)の 6日目の記事です。
昨日はkaigaiさんの[Beyond the 1GB limitation of varlena](http://kaigai.hatenablog.com/entry/2016/12/04/223826)でした。
明日はU_ikkiさんの[バックアップユーティリティ barman 2.0 の新機能について](http://qiita.com/U_ikki/items/8c326cc0f89052ea6276)です。

# PostgreSQL寄りの自己紹介
書くのが遅くなってスミマセン(汗)。@Uemmra3と言います。
中国地方DB勉強会のスタッフです。鳥取県米子市で開催する時の主催スタッフやっています。元職業プログラマーの自分にとって、RDBMSの内部の話やトレンドの話は新鮮です。JPUGとの関わりなくては中国地方DB勉強会は成り立たないですね。いつもありがとうございます。
ちなみにお隣の島根県では松江市と出雲市で開催されていて、懇親会で壮大さんや斉藤さんや豪華スピーカーと飲んだりします。本当は鳥取県の東部(鳥取市)で開催する事で(他の人を巻き込んで)ラクをしたいのですが、鳥取市だと他地域からのアクセスが悪い(例えば、松江-米子は約30分、松江-鳥取は鈍行だと2時間以上、特急だと1時間30分以上)のもあって米子で続けています。
あと最近は、Mozilla技術のイベントに参加する事が多いのと、Mozilla関連のドキュメントを翻訳する活動をしています。Qiitaには(Markdownには)不慣れな所があります。

# 本題
PostgreSQLドキュメントの翻訳で、他の人が未着手のものを確認したい
[コチラ](https://github.com/pgsql-jp/jpug-doc/wiki/%E3%83%89%E3%82%AD%E3%83%A5%E3%83%A1%E3%83%B3%E3%83%88%E7%BF%BB%E8%A8%B3%E6%8B%85%E5%BD%93%E3%83%AA%E3%82%B9%E3%83%889.6)にあるwikiを手元にcloneしておいて確認する

## 確認環境
Windows 7 32bit上のGit bash
(Git-1.8.5.2-preview20131230)

# スクリプト

```bash
egrep -v '訳に影響なし|翻訳部分変更無し|マージ済' ドキュメント翻訳担当リスト9.6.md
```

# 結果

> ## 担当者表
> 
> 2016年9月10日翻訳開始
> 
> `|ファイル名|担当者|進捗|備考|
> |:--|:--|:--|:--
> ||||
> |[monitoring.sgml](https://pgsql-jp.github.io/jpug-doc/9.6.0/html/monitoring.html)|垣谷|pr739（前半）pr750（後半）||
> |[mvcc.sgml](https://pgsql-jp.github.io/jpug-doc/9.6.0/html/mvcc.html)|千田|PR#764||
> |[pgtrgm.sgml](https://pgsql-jp.github.io/jpug-doc/9.6.0/html/pgtrgm.html)|石井|pr773||
> |[pltcl.sgml](https://pgsql-jp.github.io/jpug-doc/9.6.0/html/pltcl.html)|高塚|pr775|変更あり,9.6.1更新なし|
> |[ref/alter_extension.sgml](https://pgsql-jp.github.io/jpug-doc/9.6.0/html/sql-alterextension.html)|松田|-|961更新あり|
> |[release-9.1.sgml](https://pgsql-jp.github.io/jpug-doc/9.6.0/html/release-9-1.html)|小泉|変更無し|961更新あり|
> |[release-9.2.sgml](https://pgsql-jp.github.io/jpug-doc/9.6.0/html/release-9-2.html)|小泉|変更無し|961更新あり|
> |[release-9.3.sgml](https://pgsql-jp.github.io/jpug-doc/9.6.0/html/release-9-3.html)|小泉|変更無し|961更新あり|
> |[release-9.4.sgml](https://pgsql-jp.github.io/jpug-doc/9.6.0/html/release-9-4.html)|小泉|変更無し|961更新あり|
> |[release-9.5.sgml](https://pgsql-jp.github.io/jpug-doc/9.6.0/html/release-9-5.html)|小泉|変更無し|961更新あり|
> 
> (後略)

# 終わりに
今回未着手のものがあれば、訳してみようかと思ったのですが、結果を見た限り着手済みのものばかりのようでした。そのへんは追い追いやってみたいと思います。SGMLと戦うのは大変そうですが…。
あとこのMarkDownの中に「担当者表」と「貢献者リスト」があるのですが、「担当者表」だけを拾うようにしたい。ブックマークレットなど、ブラウザで確認できる形にしても良いかも。
クリスマスも近づいて来ました。来年もPostgreSQLが色んな進化をとげていくのを楽しみにしたいと思います。では。
Vagrant upでのエラー

Vagrantfileを作って、vagrant up をしたら、エラーになって起動できなかった。


```
vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: You assigned a static IP ending in ".1" to this machine.
==> default: This is very often used by the router and can cause the
==> default: network to not work properly. If the network doesn't work
==> default: properly, try changing this IP.
==> default: Importing base box 'bento/centos-7.2'...
==> default: Matching MAC address for NAT networking...
==> default: You assigned a static IP ending in ".1" to this machine.
==> default: This is very often used by the router and can cause the
==> default: network to not work properly. If the network doesn't work
==> default: properly, try changing this IP.
==> default: Checking if box 'bento/centos-7.2' is up to date...
==> default: Setting the name of the VM: DRBD84-CentOS7-Vagrant_default_1481156483725_36997
==> default: Fixed port collision for 22 => 2222. Now on port 2200.
==> default: Clearing any previously set network interfaces...
==> default: Preparing network interfaces based on configuration...
    default: Adapter 1: nat
    default: Adapter 2: hostonly
    default: Adapter 3: hostonly
    default: Adapter 4: bridged
==> default: Forwarding ports...
    default: 22 (guest) => 2200 (host) (adapter 1)
==> default: Running 'pre-boot' VM customizations...
==> default: Booting VM...
==> default: Waiting for machine to boot. This may take a few minutes...
    default: SSH address: 127.0.0.1:2200
    default: SSH username: vagrant
    default: SSH auth method: private key
    default: Warning: Remote connection disconnect. Retrying...
    default: Warning: Remote connection disconnect. Retrying...
    default: Warning: Remote connection disconnect. Retrying...
Timed out while waiting for the machine to boot. This means that
Vagrant was unable to communicate with the guest machine within
the configured ("config.vm.boot_timeout" value) time period.

If you look above, you should be able to see the error(s) that
Vagrant had when attempting to connect to the machine. These errors
are usually good hints as to what may be wrong.

If you're using a custom box, make sure that networking is properly
working and you're able to connect to the machine. It is a common
problem that networking isn't setup properly in these boxes.
Verify that authentication configurations are also setup properly,
as well.

If the box appears to be booting properly, you may want to increase
the timeout ("config.vm.boot_timeout") value.
```


どうやら、ネットワークの設定部分でおかしいようだったので、コメントアウトしてみたら、ビンゴ！

```
#config.vm.network "private_network", type: "dhcp"
 config.vm.network "private_network", ip: "192.168.56.105"
#config.vm.network "private_network", ip: "10.0.30.1", virtualbox__intnet: "eth1"
#config.vm.network "private_network", ip: "10.0.31.1", virtualbox__intnet: "eth2"
```

このエラー内容をみると、どうも起動するときに、ネットワークの接続確認をしているようにみえる。
設定には注意がいりそう。
rubocopがエラーになる（`require': cannot load such file -- rubocop-rspec）

##### <i class="fa fa-exclamation-triangle" aria-hidden="true"></i> エラー内容

```
$ rubocop

/Users/user_name/.rbenv/versions/2.3.1/lib/ruby/2.3.0/rubygems/core_ext/kernel_require.rb:55:in `require': cannot load such file -- rubocop-rspec (LoadError)
  from /Users/user_name/.rbenv/versions/2.3.1/lib/ruby/2.3.0/rubygems/core_ext/kernel_require.rb:55:in `require'
  from /Users/user_name/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/rubocop-0.46.0/lib/rubocop/config_loader_resolver.rb:15:in `block in resolve_requires'
  from /Users/user_name/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/rubocop-0.46.0/lib/rubocop/config_loader_resolver.rb:11:in `each'
  from /Users/user_name/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/rubocop-0.46.0/lib/rubocop/config_loader_resolver.rb:11:in `resolve_requires'
  from /Users/user_name/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/rubocop-0.46.0/lib/rubocop/config_loader.rb:40:in `load_file'
  from /Users/user_name/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/rubocop-0.46.0/lib/rubocop/config_loader.rb:105:in `configuration_from_file'
  from /Users/user_name/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/rubocop-0.46.0/lib/rubocop/config_store.rb:44:in `for'
  from /Users/user_name/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/rubocop-0.46.0/lib/rubocop/cli.rb:93:in `apply_default_formatter'
  from /Users/user_name/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/rubocop-0.46.0/lib/rubocop/cli.rb:25:in `run'
  from /Users/user_name/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/rubocop-0.46.0/bin/rubocop:13:in `block in <top (required)>'
  from /Users/user_name/.rbenv/versions/2.3.1/lib/ruby/2.3.0/benchmark.rb:308:in `realtime'
  from /Users/user_name/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/rubocop-0.46.0/bin/rubocop:12:in `<top (required)>'
  from /Users/user_name/.rbenv/versions/2.3.1/bin/rubocop:23:in `load'
  from /Users/user_name/.rbenv/versions/2.3.1/bin/rubocop:23:in `<main>'
```

##### <i class="fa fa-smile-o" aria-hidden="true"></i> 解決策

`.rubocop.yml`の

```rb
require: rubocop-rspec
```

という記述を以下に変更する

```
AllCops:
  Include:
    - rubocop-rspec
```

##### <i class="fa fa-heart" aria-hidden="true"></i> Thanks

https://github.com/bbatsov/rubocop/issues/2937#issuecomment-195481152



##### <i class="fa fa-diamond" aria-hidden="true"></i> version


```
$ ruby -v
ruby 2.3.1p112 (2016-04-26 revision 54768) [x86_64-darwin15]

$ rubocop -v
0.46.0
```
AWSでSSL証明書を作ってELBに設定する

# 概要

AWSのCertificate ManagerでSSL証明書を作って、Elastic Load Balancing(ELB)に設定することで、証明書の費用が実質無料でセキュアなサイトが用意できます。
導入のお手軽さと費用を抑えられるメリットがあり、本番稼働環境は勿論、検証環境とかで一時的に検証したい時も便利ですね。

[AWS公式のサービス説明ページ](https://aws.amazon.com/jp/certificate-manager/)にも詳しい説明がありますが、ざっくりとした仕様を以下にまとめます。(2016/11現在の情報です)

## 暗号化レベル
- 鍵の暗号化方式：RSA
- 鍵長：2048bit
- ハッシュアルゴリズム：SHA256
- 証明書の認証局（CA）：Amazon

## 認証レベル
- ドメイン認証(当該ドメインの管理者が発行していることを示す)

## 利用料
- 無料(但しAWSのELBでの利用に限る)

## 期限・更新について
- 証明書の有効期間は13ヶ月
- 失効60日前に自動更新される

# 設定手順

では、実際にAWSでSSL証明書を作ってELBに設定していきます。

## 前提
- ドメインが用意されていること
- ドメインの管理者アドレスのメールを受信できること

## AWSで証明書を作る
- AWSマネジメントコンソールのサービス一覧ページで「Certificate Manager」と入力して「Certificate Manager」のページを表示。  
※ELB作ってるリージョンと同じリージョンで証明書を作ってください。  
　  
- 「ステップ1:ドメイン名の追加」画面でドメイン名を入力する。  
※既に1つ以上の証明書が管理されている場合は、一覧ページの左上に「証明書のリクエスト」ボタンがあるのでクリックすると、「ステップ1:ドメイン名の追加」画面に飛びます。  
　  
- 「確認とリクエスト」を行うと、入力したドメインの管理者アドレスにメールが飛ぶ。  
　  
- 届いたメールのURLクリック
「Certificate approval for ドメイン名」のメールが来るので、メール内の「Amazon Certificate Approvals」をクリックして承認する。  
　  
- Certificate Managerページの証明書一覧に証明書が作られる。  
種類：Amazon が発行 となっている。  
有効期間の終了時刻：13ヶ月後の日付が設定される。  

## ELBのリスナー設定に証明書を設定
ELBのリスナー設定を追加します。
※ここでは、既にHTTP(80)→HTTP(80)の設定があり、新たにHTTPS用の設定を追加する場合を例に取ります。

### ELB側でhttpsでアクセスを受け、各サーバとhttpで通信する場合
![2016-12-08_084344.png](https://qiita-image-store.s3.amazonaws.com/0/128331/3edc5550-200a-eba0-c59b-3e9900b6edc4.png)

- リスナー設定にHTTPS(443)→HTTP(80)の設定を追加し、証明書欄にて「AWS 証明書マネージャ (ACM) から、既存の証明書を選択する」を選び、さきほど作成した証明書を設定。  
※なお、Webサーバ側にはhttpで飛んで行くので、ApacheにSSL関連の設定は不要。  
![2016-12-08_085910.png](https://qiita-image-store.s3.amazonaws.com/0/128331/e73e87a6-f0d6-4777-bd90-599895273b68.png)

### ELB側でhttpsでアクセスを受け、各サーバとhttpsで通信する場合
![2016-12-08_084352.png](https://qiita-image-store.s3.amazonaws.com/0/128331/b0df6298-2d5b-ac8d-a22c-bbb743cc1573.png)

- HTTPS(443)→HTTP(443)の設定を追加し、証明書欄にて「AWS 証明書マネージャ (ACM) から、既存の証明書を選択する」を選び、さきほど作成した証明書を設定。   
※なお、Webサーバ側にはhttpsで飛んで行くので、ApacheにSSL関連の設定が必要。   
![2016-12-08_090103.png](https://qiita-image-store.s3.amazonaws.com/0/128331/adc4fe8c-7b3d-36e2-a2eb-89d9a0ce3366.png)
  
# おわりに
AWSでSSL証明書が無料で、しかも自動更新で使えると聞いて、最初は「え！何かの罠なの！？」と疑ってしまいましたｗ
これでオレオレ証明書とか面倒くさいことしなくて済む…！
ありがたやありがたや…。

# 参考にしたURL
[［ACM］AWSの無料SSL証明書サービスCertificate Manager について調べてみた ｜ Developers.IO](http://dev.classmethod.jp/cloud/aws/check_acm_specification/)
ありがとうございました！
オセロのAI作ってみた

# はじめに
アドベントカレンダーに初めて参加します！
大学２年生の時にオセロの必勝法を探そうと全件探索のプログラムを書いたことをきっかけにオセロのAIを作り始めました。
今まで作ってきたAIは、ランダムで打つAI、アルファーベータ法と評価関数を用いたAI、原子モンテカルロ法、ニューラルネットワークで評価関数を作成したAI、DQNを使ったAIとかれこれたくさんあります。
昔作ったのはソースコードどこにいったか分からないのでご了承を。
今回はDeep Learningを用いたものだけに焦点を当てて紹介していきます。
それでは、AIについて話していきたいと思います！

# アーキテクチャ
ソースコードは[ここ](https://github.com/tOba1357/DeepLearningOthello)にあります。
私が作ったプログラムはjavaとpythonの両方で書かれています。
javaにはAIとオセロのゲームのアルゴリズム、pythonにはニューラルネットワークのモデルがあります。
javaで棋譜の生成（学習データ用）、pythonとTensorflowを用いてニューラルネットワークの最適化を行っています。
理由は初めにjavaでDeep Learningを用いていないAIをつくっていため、Tensorflowを使おうと思った時に、全部pythonに書き換えるのがめんどくさかったので、[Thrift](https://thrift.apache.org/)という多言語間で通信できるツールを用いてjava -> pythonという形をとっています。

# 評価方法
私自身オセロが強くないので評価方法に困っていました。
定量評価するために、打てるところをランダムに打つAIにどのくらい負けないのかを評価基準としています。
ちなみに原子モンテカルロ法でプレイアウト200回だと、勝率57％になります。

# ニューラルネットワークを用いたAI
盤面の評価にニューラルネットワークを用いたAIについて紹介します。
一日動かして勝率は99％近くまで行きました。
ニューラルネットワークの入力は盤面で8*8のどこに黒石が置かれているかと、白石が置かれているのかの128サイズ。
出力は勝つ確率、負ける確率、引き分ける確率の３サイズでソフトマックス関数を使っています。
ニューラルネットワークのハイパーパラメータは

* 中間層 128*5
* 活性化関数 ReLU
* ドロップアウト なし
* 損失関数　二乗誤差
* 最適化関数　再急降下法
* 学習率　0.1

となります。
学習のデータの作成は同じニューラルネットを使ったAI同士の棋譜と、定期的に評価するのでその時に負けた棋譜を用いています。
AIは次の盤面の一覧から一番勝ちそうな手（1-負ける確率を評価関数としている）を選んでいる。
ただし10回に1回はランダムな手を選んでいる。
このAI同士で100回戦わせた棋譜を用いて学習している。
これに加えて、100回戦わせて学習させるを１０回繰り返したところで、評価（ランダムなAIと対戦）して負けた棋譜をその後の１０回の学習全てに加えて学習させています。
一日走らせると大体46手以降の勝ち筋は見えているようで、それ以前はほぼ同じ勝率をかえしています。

# DQN
最近DQNでAIをつくりなおしました。
使ったテクニック

* ε-greedy
* neural fitted Q
* 体験再生

AlphaGoでは黒白空白の3つの入力をとっていると聞いたので、真似して8*8*3の192にしました。
自分の石が白か黒かという情報も入れたほうがいいのかな？とおもい、白と黒の2を足して入力サイズは194としました。
出力は8*8のどこに打つかなので64サイズ。値は-1~1の間にするために活性化関数をtanhにしました。
ハイパーパラメータは

* 中間層 200 * 3
* 活性化関数　ReLU
* ドロップアウト 0.9
* 初期学習率 0.2 1000setpごとに*0.97
* 勾配の最大値を4で固定
* 最適化関数 Adam
* 損失関数 二条誤差

打てない手に関しては-1でで埋めてあげました。（打てない手を打って負けるという学習はしてない）
結果は、、、、学習しませんでした。
損失が小さいと思い、二条誤差の平均ではなく、最大値にしてみたのですが（Q*のアップデートは一箇所だけなので）うまく行かなかったです。
原因は現在調査中です。

# 今後
CNN使ってみたらもっとつよくなるのでは？と最近思い始めました。
昔はCNNは画像のズレとかに対応するために生まれたと聞いて、オセロって一個ずれたらだいぶ違うから使うのはまずくない？とおもっていたのですが、オセロも隣接している石ほど関係性が高くなるので、CNNを使うともっと効率的に学習できるのではないのかなと思いまいした。
今度はDQN + CNNでオセロのAI作って見たいと思います！
D3.js　JSONデータを読み込む

### この記事でやること

* D3.jsでJSON形式のデータを読み込みます
    * 元データ：JSONファイル（別ファイルに分割）
    * ファイルはUTF-8で記述しましょう
* 読み込んだデータを一行ずつ表示します

### ソースコード

#### HTML

```html:index.html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>D3.js JSONファイルを読み込む</title>
</head>
<body>
<!-- 一覧表の描画先-->
<div id="data"></div>
</body>
<!-- D3.js -->
<script src="https://d3js.org/d3.v4.min.js"></script>
<!-- 本体処理 -->
<script src="main.js"></script>
</html>
```

#### JavaScript
d3.json()で読み込みを行った時点でJavaScriptオブジェクトとしての扱いとなります。
この例ならばdata()に配列部分を渡すようにするなどして、階層の変更に対応すれば良いということになります。

```javascript:main.js
// 読み込みデータファイル
var DATA_FILE_PATH = './data.json';
// 一覧描画先
var TARGET_ELEMENT_ID = '#data';
// 項目名：漢字表記
var COL_KANJI = 'kanji';
// 項目名：かな表記
var COL_KANA = 'kana';
// 項目名：色ID
var COL_COLOR_ID = 'color';

drawTable();

/**
 * データ一覧の描画
 */
function drawTable() {
    d3.json(DATA_FILE_PATH, function(error, root) {
        // 第2引数のrootが読み込んだJSONの最上位になる
        // ここでは色関連情報の配列を取得した形になる
        
        d3.select(TARGET_ELEMENT_ID)
            .append('div')
            .selectAll()
            .data(root)
            .enter()
            .append('div')
            .text(function (dataRow) {
                // 読み込んだデータを参照する場合はコールバック関数を通す
                return dataRow[COL_KANJI]
                + '（' + dataRow[COL_KANA] + '）'
                + '：' + dataRow[COL_COLOR_ID];
            });
    });
}

```

#### データファイル（JSON）
```javascript:data.json
[
    {
        "kanji": "青",
        "kana": "あお",
        "color": "blue"
    },
    {
        "kanji": "赤",
        "kana": "あか",
        "color": "red"
    },
    {
        "kanji": "緑",
        "kana": "みどり",
        "color": "green"
    }
]
```
New RelicとMackerel

サーバー監視と言えば、New RelicとMackerelかなと思います。
比較してみました。

#New Relic
7つのサービス群からなる監視サービスである。
パフォーマンス監視と障害監視はサービスが分かれている等、やりたい事にマッチするサービスを選定する必要がある。
サービスが多く高価で、マニュアルが英語なためか日本語の情報がMackerelに比べると少ない。

##サービス紹介
1.	New Relic APM 
アプリケーションのパフォーマンス監視サービス。
いわゆるNew Relicという名前でイメージされるサービスである。エージェントを監視対象のサーバーにデプロイすれば、SQLコスト、NWのトラフィック、APIコスト等を見る事が出来る。

2.	New Relic Browser
ブラウザのパフォーマンス監視サービス
Google Analyticsの様なサービスであり、HTMLにJSを埋め込みデータを送信する。
New Relic APMがデプロイされたサーバーに置かれたHTMLには、自動でJSが埋め込まれる。

3.	New Relic Servers
サーバーのパフォーマンス監視サービス
CPUやメモリ、ディスク使用量の測定が出来る。

4.	New Relic Mobile
モバイルアプリ(iOS, Android)のパフォーマンス監視サービス。
アプリやネットワークのパフォーマンス、メモリ使用状況、クラッシュレポート など、OS、デバイス ごとにみることが出来る。また、アプリの各バージョンごとの、新規インストール率、更新率、エラー率などを比較できる機能もあり、機能追加の効果測定を行う事が出来る。

5.	New Relic Synthetics (シンセティクス）
Webアプリ、サイトの疎通、障害監視サービス。
外部から、Web アプリやサービスの状態管理が行える。
サービス起動確認の自動化が期待出来る。

6.	New Relic Plugins
サードパーティによる各種プラグイン
Visual Studioで言うnugetの様なサービスである。

7.	New Relic Insights (インサイト）
リアルタイム分析ツール(ダッシュボード）
New Relic製品群を利用して蓄積されたデータを、NRQLというクエリを書いて可視化するダッシュボードサービス。非エンジニアの方にもご利用いただけますという謳い文句があり、タブローの様なサービスである。

総評
アプリケーションサービスのみならず、外形監視やリッチなダッシュボード等のサービスが魅力である。
ただし、New Relic製品によって蓄積されたデータしか分析出来ない・競合ツールを推進しているグループが存在しているので製品の力を最大限利用するには大きな労力がかかると思われる。

#Mackerel
##サービス紹介
サーバー監視、アプリケーションのパフォーマンス監視を行うサービス。
Mackerelで出来る事は全てNew Relicでも出来るが、UI画像を見る限りより直感的でとっつきやすそうな印象。
何でも出来るNew Relicに対して、あくまで監視に特化したサービスである印象を受ける。

Mackerelの特徴 
	将来予測機能というユーザーが設定した閾値に到達しそうな時期を予測する機能がある。
	監視ルールをコードにて制御出来るため、Git等でコード管理が行える。
	Androidアプリがストアに存在しており、スマホからの操作も可能。
	日本語のドキュメントが豊富。

総評
とっつきやすさでは国産のサービスであるMackerelに軍配が上がる。ロールでサーバー群を管理出来るため、サーバー台数が頻繁に変わる環境が得意と謳っているが、環境によっては活かせない可能性がある。
Twitterのつぶやきを一度に大量取得する

#はじめに
TwitterのAPIが使えること前提です(すみません)
ツイートを使っていろいろしたいのに、データ収集に苦労しているという人のための記事です。
#目的
TwitterのAPIsearchを使って普通にツイート検索をしようとすると上位100件までしか取得できない。
しかしツイート1つひとつに当てられているIDをたどることで過去1週間以内までのツイートを取得することができる。
以下がその検索プログラムである。

```tweet_search.py
# -*- coding:utf-8 -*-
import tweepy

def search_tweet(api):
    print('最新のつぶやきから出力')
    print('検索ページ：1')
    tweet_data = api.search(q=' ', count=100)
    for tweet in tweet_data:
            print(tweet.text)
            print('************************************************\n')
    next_max_id = tweet_data[-1].id
    for i in range(2, 11):
        print('検索ページ：' + str(i))
        tweet_data = api.search(q=' ', count=100, max_id=next_max_id-1)
        next_max_id = tweet_data[-1].id
        for tweet in tweet_data:
            print(tweet.text)
            print('************************************************\n')

if '__name__' == '__main__':
    consumer_key = "XXXXXXXXXXXXXXXXXXXXXXX"
    consumer_secret = "XXXXXXXXXXXXXXXXXXXXXXXX"
    access_token = "XXXXXXXXXXXXXXXXXXXXXXXXXXXX"
    access_token_secret = "XXXXXXXXXXXXXXXXXXXXXXXXXX"
    auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
    auth.set_access_token(access_token, access_token_secret)
    api = tweepy.API(auth)
    search_tweet(api)
```

仕組みを簡単に説明すると
・すべてのツイートには必ずツイートID(すべて数字)が当てられている。
・そのIDは最新のツイートほど大きな値になっている（例えば最新のツイートのIDを7000とするとひとつ前のツイートのIDは6999となる)。
・通常のAPIsearchは最新のツイートから順に過去のツイートへと遡っていく。
・そしてAPIsearchにはmax_idという引数があり、このIDを指定することでこの値以下のツイートに限定して検索することができる

これら4点を利用すると「ツイートIDが7000以下から検索する」という処理が可能になる。

つまり
1.ツイートを100件取得する
2.100件目のIDを保存
3.そのIDより値以下から検索する(1に戻る)

これを繰り返すことで無限に過去ツイートを取得し続けることができる！
・・・と言いたいところだが、APIで取得できるのは残念ながら一週間以内のツイートと限定されているため、無限ではない。
とはいえ普通にAPIsearchを使うよりは収集できるツイート数は圧倒的に増える。


以上です。
ユニバーサルWindowsプラットフォーム (UWP)のアプリケーションでプライベートなネットワークを有効にする。

## 開発環境
- Windows 10 Professional 64bit
- Visual Studio 2015 Community

## 動作環境
- Windows 8.1 Pro 64bit

## 事象
動作環境にて、プライベートネットワーク内にあるアプリケーションサーバーにhttp通信した際、「An error occurred while sending the request. 」が返ってきた。

## 対策
プライベートネットワークの通信を許可したところ、エラーが解消した。
設定手順は下記の通りとなる。
1.プロジェクトのプロパティを表示する
2.アプリケーション->パッケージマニフェストを選択する
![printScreen 2016-12-08 8.36.36.png](https://qiita-image-store.s3.amazonaws.com/0/103774/eb8b755f-9f24-3393-da00-c4f4b0880b4a.png)
<br>
3.機能タブの「プライベートネットワーク（クライアントとサーバー）」にチェックを入れる
![printScreen 2016-12-07 13.20.28.png](https://qiita-image-store.s3.amazonaws.com/0/103774/bc1edaa4-bf00-5233-623c-3bdcd9f9784e.png)

## 感想
他にマイクや位置情報、Webカメラといった機能もあるので、必要に応じて選択する必要がありそう。
Windows Server コンテナーのまとめ

# gloops AdventCalendar 8日目

[gloops advent calendar](http://qiita.com/advent-calendar/2016/gloops) 8日目です:santa_tone2:
7日目は新卒の今川君の「[スプレットシートでSlack連携](http://qiita.com/t_imagawa/items/c438cd7db622a2475580)」でした。

本来であれば、Windows Serverコンテナーのネットワークやセキュリティ（Active Directory連携）について
書く予定でした。
本日開催の「[AWS - Windows Users Meetup #1](https://awswinuser.connpass.com/event/43517/)」での登壇資料作成で
手が回らなかったので、登壇資料を掲載するにとどめたいと思います。

# スライド
<div style="width: 608px; max-width: 100%; margin-bottom:5px;"><a href="https://docs.com/takahito-yamato/4794/windows-server-2016-container" title="Windows Server 2016 Container" target="_blank" style="font-family: 'Segoe UI'; font-size: 13px; text-decoration: none; margin-left:18px ">Windows Server 2016 Container</a><span style="font-family: 'Segoe UI'; font-size: 13px ">—</span><a href="https://docs.com/takahito-yamato" target="_blank" style="font-family: 'Segoe UI'; font-size: 13px; text-decoration: none ">Takahito Yamatoya</a></div><iframe src="https://docs.com/d/embed/D25192114-9323-8713-8820-000460498183%7eM21ca95d8-8094-4c4e-abce-5d59cb776dc7" frameborder="0" scrolling="no" width="608px" height="378px" style="max-width:100%" allowfullscreen="False"></iframe>
TAPL8-2.数(NB)のための型付け規則

```math
\begin{array}{l}
新しい構文形式\\
\begin{array}{llr}
\bbox[lightgray]T ::= & …   & \hspace{90px}型：\\
      & \bbox[lightgray]{Nat} & 自然数型\\
\end{array}\\
\\
\begin{array}{cr}
新しい型付け規則 & \bbox[3px,border:1px solid black]{t : T}\\

\bbox[lightgray]{0 : Nat} & \text{(T-Zero)}\\

\bbox[lightgray]{\dfrac{t_1 : Nat}
{succ\;t_1 : Nat}} & \text{(T-Succ)}\\

\bbox[lightgray]{\dfrac{t_1 : Nat}
{pred\;t_1 : Nat}} & \text{(T-Pred)}\\

\bbox[lightgray]{\dfrac{t_1 : Nat}
{iszero\;t_1 : Bool}} & \text{(T-IsZero)}\\
\end{array}\\

\end{array}
```

```prolog:tapl08_2.pl
/*
構文

t ::=                項：
　true               定数真
　false              定数偽
　if(t,t,t)          条件式
  0                  定数ゼロ
  succ(t)            後者値
  pred(t)            前者値

v::=                 値：
　true               定数真
　false              定数偽
  nv                 数値
nv ::=               数値：
  0                  ゼロ
  succ(nv)           後者値

Ty ::= … 型：
  nat                自然数型

*/
:- op(900, xfx, [ : ]).
:- op(910, fx, [ ⊢ ]).
:- op(920, xfx, [ ==>, ==>> ]).
:- op(1200, xfx, [ -- ]).
:- style_check(-singleton).
term_expansion(A -- B, B :- A).

t(true).
t(false).
t(if(T1,T2,T3)) :- t(T1),t(T2),t(T3).
t(0).
t(succ(T)) :- t(T).
t(pred(T)) :- t(T).
v(true).
v(false).
v(NV) :- nv(NV).
nv(0).
nv(succ(NV)) :- nv(NV).

% 評価 t ==> t’

if(true, T2,T3) ==> T2.         % (E-IfTrue)
if(false,T2,T3) ==> T3.         % (E-IfFalse)

T1 ==> T1_
--%------------------------------ (E-If)
if(T1,T2,T3) ==> if(T1_,T2,T3).

T1 ==> T1_
--%---------------------------------- (E-Succ)
succ(T1) ==> succ(T1_).

pred(0) ==> 0.                      % (E-PredZero)

nv(NV1)
--%---------------------------------- (E-PredSucc)
pred(succ(NV1)) ==> NV1.

T1 ==> T1_
--%---------------------------------- (E-Pred)
pred(T1) ==> pred(T1_).

iszero(0) ==> true.                 % (E-IsZeroZero)

nv(NV1)
--%---------------------------------- (E-IsZeroSucc)
iszero(succ(NV1)) ==> false.

T1 ==> T1_
--%---------------------------------- (E-Zero)
iszero(T1) ==> iszero(T1_).

% 型付け規則 t : T

⊢ true : bool.                    % (T-True)

⊢ false : bool.                   % (T-False)

⊢ T1 : bool, ⊢ T2 : Ty, ⊢ T3 : Ty 
--%-------------------------------- (T-If)
⊢ if(T1,T2,T3) : Ty.

⊢ 0 : nat.                        % (T-Zero)

⊢ T1 : nat
--%-------------------------------- (T-Succ)
⊢ succ(T1) : nat.

⊢ T1 : nat
--%-------------------------------- (T-Pred)
⊢ pred(T1) : nat.

⊢ T1 : nat
--%-------------------------------- (T-IsZero)
⊢ iszero(T1) : bool.

T ==>> T3 :- T ==> T2, T2 ==>> T3.
T ==>> T.

run(T) :- ⊢ T : Ty, T ==>> T2, writeln(T:Ty==>>T2).

:- run(true).
:- run(if(true,false,true)).
:- run(if(false,false,true)).
:- run(if(if(true,false,true),if(true,false,true),if(true,false,true))).
:- run(0).
:- run(succ(0)).
:- run(pred(succ(0))).
:- run(iszero(pred(succ(0)))).
:- run(iszero(succ(0))).
:- halt.
```
ゼロ秒思考を読んだ感想とやってみた感想

#ゼロ秒思考とは
もやもやとした気持ちをその場で言葉にし、考えを深められるようになると、考えが進むだけでなく、スピードアップしていく。問題の本質と全体像を押さえた確実な対策が打てるようになる。そうした思考の「質」と「スピード」、双方の到達点が「ゼロ秒思考」。

#ゼロ秒思考を作るメモ
ゼロ秒思考を身につけるためにやることがこのメモです。
内容は仕事のことに関してからプライベートなことまで、自由に書いてかまいません。本文は４行から６行で１行につき２０文字から３０文字程度、これを１分で書きます。

#実際にメモを書いてみて
1分以内に書くのが難しかったです。常に手を動かしていないとあの分量は１分では書けないなと思いました。１分を意識することで考えるスピードを養うことにつながっていくんですね。
まだ１分以内では書けていません。
あとは1日１０個メモを書くのがルールなんですが、これも難しかったです。
数日で１０個書けなくなりました。
いかに自分が考えていないかということがよくわかりました。
メモを書くというだけでここまで出来てないことが浮き彫りになってくるのかと
驚きました。

この記事を書くために読み返してみました。
すると１回目に読んだ時には気付けなかったことがたくさん出てきました。
なので今なら前回より書ける気がするのでもう一度やってみようと思います。
（実は最近はメモを書けてませんでした。。。）