OmniAICreator/Qiita-1.07M huggingface dataset:
Redisを使って雑に分散処理をする

みなさん雑に分散処理を実装したくなることありますよね？私はあります。

複数台のサーバに処理を分散して最後にそれらの結果をまとめて受け取ってごにょごにょするみたいなよくあるパターンです。

この手のものを実装しようとなると大抵KafkaみたいなメッセージングキューだったりStorm, Flinkみたいな分散処理エンジンを導入するわけですが、データは小さいしExactly Onceもフォールトトレラントもいらないみたいなケースでは解決したい問題に対して構成が重くなりがちです。

そんな時、Redis一つで雑に解決できたりするのでその方法を紹介します。

## Redisとは

[Redis](https://redis.io/)とはオープンソースのインメモリNoSQLで一般にKVSとしてキャッシュなどに使われることが多いです。

>Redis is an open source (BSD licensed), in-memory data structure store, used as a database, cache and message broker.

しかし、公式にもあるようにキャッシュだけでなく実は多様なデータ構造をサポートするデータベースやメッセージブローカーとして使うこともできます。

今回はそのサポートするデータ構造の一つであるList型とメッセージブローカーとしての機能のPub/Subを用いることで分散処理を実装していきます。

## アーキテクチャ

```
                                             rpop
                              +-------+   ---------->   +----------+
                   lpush      |       |     publish     | Worker 1 |
   +--------+   ---------->   |       |   <----------   +----------+
   | Master |    subscribe    | Redis |       rpop
   +--------+   <----------   |       |   ---------->   +----------+
                              |       |     publish     | Worker 2 |
                              +-------+   <----------   +----------+
```

List型をlpush, rpopでFIFOすることによってキューを実現し、Pub/Subで処理結果をMaster側へと戻しています。
それぞれはキーによって一意に識別されるため処理ごとにキーを分けることで複数の分散処理を繋ぎ合わせることも可能ですし、本末転倒ですがRedis Clusterを用いることでRedis自体をスケールさせることができます。
ただ雑な分散処理ゆえrpop後にWorkerが落ちてしまうと結果が欠損してしまうため、Master側でpublishされた結果を数えるなどしてそれを検知する実装は必須でしょう。

## サンプルコード

これ以上特に書くことがないのでRubyのサンプルコードを置いておきます。

Master側では `reduce` キーでsubscribeして分散数の結果を受け取ったら終了するようにしつつ、 `mapper` キーに分散処理したいジョブをlpushします。

```rb
# master.rb
require 'redis'

redis = Redis.new
queue = Redis.new

targets = 1..100

t = Thread.new do
  count = 0
  redis.subscribe('reduce') do |on|
    on.message do |channel, message|
      puts message
      count += 1
      redis.unsubscribe if count == targets.size
    end
  end
end

targets.each do |i|
  queue.lpush('mapper', i)
end

t.join
```

Worker側は先ほどの `mapper` キーのキューをひたすらポーリングすることでジョブを受け取り、それを処理して `reduce` キーにpublishして結果を返します。

```rb
# worker.rb
require 'redis'

redis = Redis.new

loop do
  job = redis.rpop('mapper')
  if job.nil?
    sleep 5
    next
  end
  dosomething = "mapped#{job}"
  redis.publish('reduce', dosomething)
end
```

これだけです。

## 最後に

実際に今回これを使って長らく直列実行されてきたrspecのテストを分散実行して高速化を実現しました。
テストの実行であればAt Least Onceでも許されますし求められる信頼性もそれほど高くありません。
既存のテスト分散処理フレームワークはいくつかありますが構成のシンプルさと汎用性を考えこれの採用に至りました。

求められる信頼性によってはこのくらい雑でも十分なケースもあると思うのでトレードオフを理解してうまく採用していけるといいのではないでしょうか。
Windows 10 ローカルに AWS S3 のクローン(minio)を手軽につくる

2017/12/10

Dockerのほうが動かなかったのでWSL側で動かしてみたらすぐにできたのでメモ。
(windowsでkitematic上で手軽に終えたかったのですが)

WSL: Windows Subsystem for Linux

（minioにたどり着くまでに、fakes3とs3ninjaをdockerで使ってみましたが、aws-sdkでput時にエラーが出たので乗り換えました）

## minio のインストールと起動まで

以下からLinux向けをダウンロード
https://github.com/minio/minio

- rootユーザーでやりましたが、rootである必要はないかも・・・

```
cd /root
wget https://dl.minio.io/server/minio/release/linux-amd64/minio

chmod +x minio
mkdir /minio_data

./minio server /root/minio_data
```

動作すると下記のような表示が出ます。

```
Created minio configuration file successfully at /root/.minio
Endpoint: ～省略～ http://127.0.0.1:9000
AccessKey: ～省略～
SecretKey: ～省略～

Browser Access: ～省略～ http://127.0.0.1:9000

Command-line Access: ～省略～ 

Object API (Amazon S3 compatible):
   Go:         https://docs.minio.io/docs/golang-client-quickstart-guide
   Java:       https://docs.minio.io/docs/java-client-quickstart-guide
   Python:     https://docs.minio.io/docs/python-client-quickstart-guide
   JavaScript: https://docs.minio.io/docs/javascript-client-quickstart-guide
   .NET:       https://docs.minio.io/docs/dotnet-client-quickstart-guide

Drive Capacity: 532 GiB Free, 910 GiB Total
```

## minio の UI を使ってみる

- ブラウザで ``http://127.0.0.1:9000`` にアクセス

![image.png](https://qiita-image-store.s3.amazonaws.com/0/216137/f45328e6-7cb5-0a6f-3c88-0857f06131a8.png)

- 上記のメッセージに出てきたアクセスキーとシークレットキーを入力してログイン

![image.png](https://qiita-image-store.s3.amazonaws.com/0/216137/897c3086-50fa-860c-db9e-2bee390bab26.png)

- バケットを作る （入力してenter）

![image.png](https://qiita-image-store.s3.amazonaws.com/0/216137/8e710e6c-5942-7773-9da5-fadc8d85f117.png)

- バケットを消す（消す機能はUIにない？）

仕方なく・・・ ``rm -rf`` で削除

```
# ll /root/minio_data/
合計 0
drwxrwxrwx 0 root root 4096 12月 11 01:17 ./
drwx------ 0 root root 4096 12月 11 00:50 ../
drwxrwxrwx 0 root root 4096 12月 11 00:57 .minio.sys/
drwxrwxrwx 0 root root 4096 12月 11 01:16 sample/
drwxrwxrwx 0 root root 4096 12月 11 01:17 sample2/
```

```
rm -rf /root/minio_data/sample2
```

ちゃんと消えました

## spring boot から minio にアクセスしてみたときのポイント

接続情報としては下記でOKでした(SDKバージョンなどで書き方は少し違いがあるかもしれません)

エンドポイント：``http://127.0.0.1:9000``
アクセスキーとシークレットキーは上記のもの

```
ClientConfiguration clientConfig = new ClientConfiguration();
clientConfig.setProtocol(Protocol.HTTP); <- ここがポイント！

EndpointConfiguration endpointConfiguration = new EndpointConfiguration("http://127.0.0.1:9000", null); <- ここがポイント！

AWSCredentials credentials = new BasicAWSCredentials(ACCESS_KEY, SECRET_KEY); <- ここがポイント！
AWSStaticCredentialsProvider credentialsProvider = new AWSStaticCredentialsProvider(credentials);

AmazonS3 client = AmazonS3ClientBuilder.standard()
                            .withCredentials(credentialsProvider)
                            .withClientConfiguration(clientConfig)
                            .withEndpointConfiguration(endpointConfiguration).build();
```

今日はここまで m(_ _)m
ズンドコ節で学ぶ、ErrbotのFlow機能

# （まえがき）

Errbotで命令を実装する際に、命令となる関数が引数として受け取るのは、「メッセージ全体」及び「それをパースしたもの」に限られます。
つまり、標準の命令ではステートレスなやりとりのみをすることになります。

そんな中、Errbotには**Flow**という機能が存在し、contextを引き回すことによるステートフルなコミュニケーションができるようになります。
で、雑に覚えて手軽っぽいので「ズンドコ節」をflowで実装してみようと思います。

# コード

https://gist.github.com/attakei/0f6b3d2cdab52b6c63faa1f9f02e1c42

# 動きの例

## 標準形

```
[@CHANGE_ME ➡ @errbot] >>> ズン
[@CHANGE_ME ➡ @errbot] [␍]
You are in the flow kiyoshi, you can continue with:
• ズン

[@CHANGE_ME ➡ @errbot] >>> ズン
[@CHANGE_ME ➡ @errbot] [␍]
You are in the flow kiyoshi, you can continue with:
• ズン
• ズンドコ

[@CHANGE_ME ➡ @errbot] >>> ズン
[@CHANGE_ME ➡ @errbot] [␍]
You are in the flow kiyoshi, you can continue with:
• ズン
• ズンドコ

[@CHANGE_ME ➡ @errbot] >>> ズンドコ
[@CHANGE_ME ➡ @errbot] [␍]
きよし！
```

## 数が足りない

```
[@CHANGE_ME ➡ @errbot] >>> ズン
[@CHANGE_ME ➡ @errbot] [␍]
You are in the flow kiyoshi, you can continue with:
• ズン

[@CHANGE_ME ➡ @errbot] >>> ズン
[@CHANGE_ME ➡ @errbot] [␍]
You are in the flow kiyoshi, you can continue with:
• ズン
• ズンドコ

[@CHANGE_ME ➡ @errbot] >>> ズンドコ
[@CHANGE_ME ➡ @errbot] [␍]
足りない！
```

## 数が多い

```
[@CHANGE_ME ➡ @errbot] >>> ズン
[@CHANGE_ME ➡ @errbot] [␍]
You are in the flow kiyoshi, you can continue with:
• ズン
You are in the flow kiyoshi, you can continue with:
• ズン
• ズンドコ

[@CHANGE_ME ➡ @errbot] >>> ズン
[@CHANGE_ME ➡ @errbot] [␍]
You are in the flow kiyoshi, you can continue with:
• ズン
• ズンドコ

[@CHANGE_ME ➡ @errbot] >>> ズン
[@CHANGE_ME ➡ @errbot] [␍]
You are in the flow kiyoshi, you can continue with:
• ズン
• ズンドコ

[@CHANGE_ME ➡ @errbot] >>> ズン
[@CHANGE_ME ➡ @errbot] [␍]
You are in the flow kiyoshi, you can continue with:
• ズン
• ズンドコ

[@CHANGE_ME ➡ @errbot] >>> ズンドコ
[@CHANGE_ME ➡ @errbot] [␍]
遅い！
```


# ソースの中身

## フローの方

Flowは`***.flow`ファイルと、それが参照している`**.py`ファイルがセットになってます。
(例：`kiyoshi.flow`と`kiyoshi_flows.py`)

![kiyoshi_flow.png](https://qiita-image-store.s3.amazonaws.com/0/6805/36e57105-b32d-2919-fdc8-663a4081be88.png)

* 最初の「ズン」を検知して、フロー開始
* フロー中は「ズン」を何回も受け付ける。途中から「ズンドコ」も受け付ける
* 「ズンドコ」を受け付けたら終了

フロー自体にはbotのコマンドを持たないので、プラグイン自体も定義してあげる必要があります。

## プラグインの方

```py3:kiyoshi.py
class Kiyoshi(BotPlugin):
    """
    Kiyoshi
    """
    @botmatch(r'^ズン$')
    def zun(self, msg, match):
        msg.ctx['zun'] = 1

    @botmatch(r'^ズン$', flow_only=True)
    def zun_re(self, msg, match):
        msg.ctx['zun'] += 1

    @botmatch(r'^ズンドコ$', flow_only=True)
    def kiyoshi(self, msg, match):
        if msg.ctx['zun'] == 3:
            msg.ctx['zun'] = -1
            return 'きよし！'
        if msg.ctx['zun'] < 3:
            return '足りない！'
        if msg.ctx['zun'] > 3:
            return '遅い！'
```

`Message`オブジェクトには`ctx`というプロパティがあり、flow内で値の引き渡しができます。
最初の「ズン」で初期化、以降は「ズン」と喋るたびにカウンターが増えていきます。
適当なタイミングで、「ズンドコ」と喋ると、「ズン」の個数に応じてbotが反応します。

なお、デコレータ内に`flow_only=True`と宣言することで、通常の命令としては機能しなくなります。

# 応用例

* `ctx`に設定情報を溜め込みつつ、セットアップを実行
    * Route53のレコードをまとめて登録とか
* `ctx`上に状態を管理しつつ、会話しながら情報を取得
    * 出発駅と到着駅を設定しながら、中継地点を入れ替えたりしつつ時刻表検索

それでは皆さん、よいズンドコ節を
Tokyo Gopher Hub を開催してみて

## 概要
- [Go の slack](https://gophers.slack.com) #tokyo チャネルで、英語話者向けの[Golang meetup](https://www.meetup.com/Tokyo-Golang-Developers/)が休眠していると話題が出る

- 自分が場所を貸すよと提案
- organizer の立候補が無かったので、とりあえず数回やってみるか、と開始

## 各回内容
### 2017/09/25
5/9名参加
特に発表形式では無く
ざっくり自己紹介と今取り組んでいるGo関係の話題

- [Ben Guild](https://twitter.com/benguild) さん
 - [Cafe Wifi](https://cafewifi.com/ja) サービス内容の紹介

- [Shawn Smith](https://twitter.com/shawnps)さん
 - [Production Go](https://leanpub.com/productiongo)を執筆中だよ
 - [goreportcard](https://goreportcard.com/)を作ってるよ

### 2017/10/30
5/5名参加
LTっぽくしてみる？ということで２名エントリーしてくれました

- Femi Ad さん
 - Docker swarm の紹介
 - [Katacode](https://www.katacoda.com/)がシチュエーションが用意されていてとっつきやすいよ

- David Przybilla　さん
 - Python から Go をはじめて一ヶ月の感想
 - stack trace ほしい. いやいや, err の中身で switch した方がどこで止まったかわかりやすいなど議論


### 2017/11/27
Machine learning with Go について話してみようかな

- 自分
 - 自分の英語力を過信していた；；
 - 首題の書籍について、概要と１章の内容をプレゼン
 - [Apache Arrow](https://arrow.apache.org/) について軽く触れる
 - [gophernotes](https://github.com/gopherdata/gophernotes) を紹介

## 感想
- 継続性や、集客を考えると、英語の得意な方にオーガナイズを協力してもらえるといいかな
- 少人数なので、活発な議論ができる
- パッと英語で出てこないことは、デモコードで伝えてしまえ
- standard library を読む回をやりたい

## これから
次回は、2017/12/18を予定 [meetup.com](https://www.meetup.com/Tokyo-Gopher-Hub/events/245305615/)
現時点で何も決まっていません！

緩くやっているので、ご興味のある方はご連絡いただければと思います
Scalaにおける型パラメータ基本構文

## 概要
Scalaで型パラメータ(ジェネリクス)という仕組みの基本構文について。

## 構文
* クラス|ケースクラス  
  ※ ケースクラスの場合は`case`キーワードを付けるだけ

```scala
class クラス名[ 型パラメ−タ ]( 引数名: 型パラメ−タ ) {
  def メソッド名( 引数名: 型パラメ−タ ): 戻り型 = { 処理 }
}
```

* トレイト

```scala
trait トレイト名[ 型パラメ−タ ] {
  def メソッド名( 引数名: 型パラメ−タ ): 型パラメ−タ = { 処理 }
}

class 利用クラス名 extends トレイト名 {
  def メソッド名( 引数: 型 ): 戻り型 = { 処理 }
}
```

* メソッド

```scala
def メソッド名[ 型パラメ−タ ]( 引数名: 型 ): 戻り型 = { 処理 }
```
C#のdllを呼び出す為に、テキストエディタでできる程度でASP.netページを用意する

普段、ASP.netを使っていないWebシステムで、C#のdllを呼び出す必要が出てきたけど、VisualStudioを使うほどではないので、テキストエディタでできる範囲でasp.netページを作った話。

Javaだと、JNIでJavaからC++を経由してC#を呼び出すことはできるみたいだけれども、動作保証外になりそうだしそこまでしたくはない。
Javaから呼び出すだけとは限らないので、使ったことないけど、そこだけasp.netページにしようと思った。

幸い、Windows、IISサーバは使えるけど、VisualStudioまで用意するのはメンドくさい。テキストエディタだけで動かしたい。
最近は、ASP.NET Coreらしいけど、NET Frameworkをサポートしていなくて,nugetから使う必要があるとのことでメンドくさい。
[ASP.NET Coreに、手持ちのライブラリを参照させる(1)](http://try-dot-net-core.hatenablog.com/entry/2016/12/10/135935)
１ページだけ動けばいいので、ASP.net MVCのことは考えない。
[ASP.NETからASP.NET Coreに移行した話](https://qiita.com/taiga_takahari/items/240a4b0453990db4005f)



１ファイルだけで直接出力する場合

```aspx-cs:test1.aspx

<%@ Page Language="C#" %>

<html>

     <head id="Head1" runat="server">

          <title></title>

     </head>


     <body>

          <form id="form1" runat="server">

               <h3>

                    <%="Hello World" %>

               </h3>

          </form>

     </body>

</html>




```

１ファイルだけで、コード部分とHTMLを分離して特定のしたラベルに出力する場合

```aspx-cs:test2.aspx

<%@ Page Language="C#" %>

<script runat="server">

 protected void Page_Load(Object source, EventArgs e) {

     MyLabel.Text = "Hello World！";

 }

</script>

<HTML>

<BODY>

 <asp:Label runat="server" id="MyLabel" />

</BODY>

</HTML>

```



HTML部分とコード部分を２ファイルにわける場合

呼び出したいdllは実行ファイルと同じディレクトリにbinフォルダを作ってその中に入れる。

```aspx-cs:test3.aspx


<%@ Page Language="C#" AutoEventWireup="true" CodeFile="test3.aspx.cs" Inherits="test3.CodeFile" %>

<!DOCTYPE html>



<html xmlns="http://www.w3.org/1999/xhtml">

<head runat="server">

    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

    <title></title>

</head>

<body>

    <form id="form1" runat="server">

        <div>

            <asp:Label ID="lbl" runat="server" Text="default" />

        </div>

    </form>

</body>

</html>

```


```c#:test3.aspx.cs


using System;

using System.IO;

using XXX.xxx; // 呼び出したい　dllの名前空間

namespace test3 {

    public partial class CodeFile : System.Web.UI.Page {

        protected void Page_Load(object sender, EventArgs e) {
            
            XXXXX xx = new XXXXX(); // 呼び出したいdllの呼び出し情報

            lbl.Text = "Hello World!";


        }
    }

}


```
XDでまとめてBehance

## まえがき
![image.png](https://qiita-image-store.s3.amazonaws.com/0/70116/97d8211c-6c3d-290e-f4a5-b9e05fc98666.png)
### Behanceとは
![image.png](https://qiita-image-store.s3.amazonaws.com/0/70116/e7156e1b-7299-10e2-aec4-e13642bd93b2.png)
<a href="https://www.behance.net/" target="_blank">https://www.behance.net/</a>

クリエイターやデザイナーのポートフォリオSNS。紹介型のDribbbleとは違って自分から登録ができる。

しかも、Adobeユーザーならば、Creative Cloudから直接コンテンツをアプロードできる作品を公開しやすい作りになっています。

データを追加できる箇所にカーソルをあわせると....
ツールチップが出現します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/70116/e1f3b3e6-ba72-b81a-68c5-6c5291c802ae.png)

CCの雲のアイコンをクリックすると、アセットが開きます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/70116/135b710c-fe61-dddf-5fd9-dfb152dcc93e.png)

なお、投稿するときは、外国のサービスなのでできれば英語メインにするといいと思います。コメントも説明も英語。「郷に入れば郷に従え」英語で書くと良いと思います。

## やってみたこと
他のBehanceユーザーがかっこよく自分でデザインしたサイトをパッケージングしてブランディングしているのを観て、憧れてしまいました。なので、早速、同じようなことをしてみてカッコよくなれるとは思えないですが、作ってみようと思いました。

### 作るコンテンツの内容を決める
何を作るのかを決めます。いつもやっていることと同じです。
身近だったり、作ってみたいなぁと思っていた題材が一番作りやすいので、
私は、家族が自主制作でカバンを作っていることもあり、素材も豊富にいただけそうでしたので、ショッピングサイトのデザインを作ってみようと決めました。
（※素材使うねと連絡は入れておきましょうー。）

### デザインします
いつも通り画面を作ります。
その時に、デザインに使ったタイポグラフィーやカラーをまとめたアートボードも作っておくとなお良いかも。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/70116/8aafbb7c-60a7-d40a-12bd-2aacb8387c5b.png)

### デザインした画面をXDでコラージュ
作った画面、カラーやタイポグラフィーをまとめたアートボードをデザインした画面と一緒にまとめます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/70116/79c9e9d2-ff54-3c15-b13f-49704443ca2a.png)

XDでLPを作るイメージで作業します。画面の内容なども簡単にカラーコンセプトとともにまとめるとちょっと感じ良い風になります。
今回は紺色を中心に色を揃えて、少し若いイメージにしたかったので色の濃い明るいピンク色を赤の代わりに採用したので、紺に色を揃えた赤はピンクの隣に。
文字は個人作品なので、個人的な趣味でFutura。高級感も残しつつ、親しみやすさを持たせたかったので可愛らしい印象も与えるフォントを選びました。などなど。

英語で文字や色を選んだ経緯やサイトのコンセプトとかもしっかり書ければ、なおのこと良いのだけど、英語力ないので　＞＜；
書けていません。


実際の投稿した画面
https://www.behance.net/gallery/58964563/Tirol-bag-online-shop

## まとめ
作った成果物をXDでまとめるのはやはりまとめやすいし、綺麗に仕上がるので、パッと見栄えもいいかも？！＾＾＊
 じっくり見られるように、あとは、デザイン力と企画力と綺麗にまとめられる能力を身につければ...。

さらに、え、英語力も...orz 

とりあえず、まだまだハードルは高い（＠＿＠....

でも、自分のためにもアウトプットをしてゆこうと考えていた背景もある中で、behanceに投稿するということで、誰かが見てくれている。評価やコメントをいただける。それによって、モチベーションが上がって制作意欲も出てきて良いサイクルが出来上がると思いました。

仕事や業務では携われるデザインのジャンルにとらわれやすいので、ポートフォリオに偏りが出てきると思います。
投稿することは、自主制作レベルだけど、新しい分野へのデザインのチャレンジもできますし、デザインをまとめる練習やブレインストーミングにつながるので、作った時のカラー選定やタイポグラフィーなどをまとめて、次の実践に備える気持ちで新しいクリエイティブへと繋がる土台固めを進んで学べる環境を自分で作れればと思っています。
無理のない程度でこれからもXDを活用して、少しづつ、少しづつ、投稿を続けたいと思います。
BLEをサポートした MicroPython `Bleson'

この記事は[MicroPython Advent Calendar 2017](https://qiita.com/advent-calendar/2017/micropython)の11日目の投稿です。昨日は [ken5owata](https://qiita.com/ken5owata)さん投稿の[micropythonでDHT11](http://ken5owata.hatenablog.com/entry/2017/12/10/120116)でした。DHT11は安くて温度も湿度も測れてよいのですが、精度がちょっとアレなので、そこ我慢できない方はDHT22 （価格はDHT11の３倍以上すると思います）をご検討ください。使い方はDHT11の場合とほぼ同じ(dht.DHT11 を dht.DHT２２とするだけ）です。

さて、今日は Bleson という micro:bit 用 MicroPython の亜種が登場したことについて書いてみます。

micro:bit は Nordic nRF51822 積んでいるのに、MicroPython からは BLE 使えなくて残念という話をよく聞きます。なぜ使えないかの事情は[ここ](http://microbit-micropython.readthedocs.io/ja/latest/ble.html)に書いてあります。要するにサポートするのはメモリが少なすぎるということでした。

そんな中、micro:bit 用 MicroPython の BLE サポートにかすかな光明がさしてきました。クロスプラットフォームの Python BLE ライブラリとして開発中の [Bleson](http://bleson.readthedocs.io/en/latest/index.html) が、サポートするプラットフォームに micro:bit を加えてきました。

といっても、既存の MicroPython に Bleson を載せたわけではなく、BLE サポートをオープンソースで実装したリアルタイムOS Apache MyNewt (nRF51822もサポート)の上に MicroPython を移植したものです。

現在のところは極初期のα版レベルで、ライブラリはぜんぜんなく(microbitモジュールもありません)、ファイルシステムもないのでプログラムの転送もできず、REPLでちまちまスクリプトを入力するしかありません。

インストール方法は[ここ](https://github.com/TheBubbleworks/micropython-mynewt-firmware)から .hex ファイルをダウンロードしてきて、いつものように MICROBIT ドライブにコピーしてやるだけです。シリアル経由で接続して REPL から操作します。サンプルコードは[ここ](http://bleson.readthedocs.io/en/latest/examples.html)にあります。Advertiser 　や　Beacon のサンプルは動くハズとのことで試しましたが、動くことを確認しました。

BLEをサポートする以上、既存の MicroPython のモジュールの機能のいくつかはあきらめないといけないと思いますが（個人的には、あのスピーチシンセサイザは要らない ;-）、Bleson の今後に大いに期待したいところではあります。
JavaScriptのDecoratorsでDependency Injectionの実例

# JavaScript Decoratorsについて
Decorators文法を使うことでクラスの内部実装を変更することなく、クラス変数やクラスメソッドを外部から拡張・上書きすることができます。
これはJavaなどでいうDI(Dependency Injection)に該当します。
[babel-plugin-transform-decorators-legacy](https://github.com/loganfsmyth/babel-plugin-transform-decorators-legacy)を使うことでDecoratorsを変換してくれます。

yarnインストール済み前提で、
下記コマンドでbabel-plugin-transform-decorators-legacyをインストールします。

```
$ yarn init -y
$ yarn add --dev babel-plugin-transform-decorators-legacy
```

Decoratorsのサンプルは以下となります。

```decorators.js
// 対象のクラス
@isTestable(true)
class MyClass { 
  
  @log('メソッドコール1')
  test1() {
    console.log('test1')
  }

  @log('メソッドコール2')
  test2(val1, val2) {
    console.log('test2',val1, val2)
  }
}

// クラスデコレーター定義
function isTestable(value) {
  return (target) => {
    return class extends target {
      constructor() {
        super()
        // 変数拡張
        this.isTestable = value
      }
      // メソッド拡張
      method() {
        console.log('テスト')
      }
    }
  }
}

// クラスメソッドデコレーター定義
function log(value){
  return (target, property, descriptor) => {
    const origin = descriptor.value
    descriptor.value = (...arg) => {
      console.log(value)
      origin(...arg)
    }
  }
}

const myclass = new MyClass()
// MyClassを直接操作せずにクラスデコレータから変数値を挿入する。
console.log(myclass.isTestable)
// MyClassを直接操作せずにクラスデコレータからメソッドを定義する。
myclass.method()
// MyClassを直接操作せずにクラスメソッドデコレータからメソッドをフックする。
myclass.test1()
// MyClassを直接操作せずにクラスメソッドデコレータからメソッドをフックする（引数付）
myclass.test2('a','b')
```

今回はCLIからトランスパイルするので.babelrcを作成します。

```.babelrc
{
 "plugins": ["transform-decorators-legacy"]
}
```

下記のコマンドでトランスパイルします。

```
babel --plugins transform-decorators-legacy decorator.js > compile.js
```

トランスパイル後のコードを実行すると、
MyClassのほうの実装を変更することなく、
decoratorsにより、クラスの拡張およびメソッドのフックがされていることが確認できます。

```
$ node compile.js 
true
テスト
メソッドコール1
test1
メソッドコール2
test2 a b
```
テスト計画を立てる目的

最近テスト計画を立てる機会が増えたので、そのときに考えたことや、思ったことを備忘録的にまとめて行こうと思います。
今回は、テスト計画を立てる目的について少し書こうと思います。

# なぜ計画を立てるのか
そもそも、なぜ計画を立てるのか、本質的な意味について改めて考えてみました。

どんな仕事でも「計画を立てる」ことは大切だと思います。
仕事には必ず不確実性や時間的制約が存在するので、計画通り進むことは稀です。  
例えば進捗が遅れた場合は、

- 全体的にどのぐらいの影響をあたえるのか
- どのぐらい作業が押しているのか
- 間に合わないなら、どのタイミングでスケジュールを再調整するのか 

など先のことが予測できていれば、先手をうって対応がとれます。
先のことを予測するためには、事前に全体のシミュレーションをすることが重要です。

事前に「なぜそれをするのか？（目的）」を見極めて、目的を達成するためのゴールを決める。
その上で全体的な流れをイメージをして、ゴールを達成するまでのシュミレーションを頭のなかで考えなければ、全体的な計画は立てれません。
頭の中でゴールまでの工程を想像することで、物事の順序や、予め整えておくべきものが明らかになると思います。
計画を立てずに本番に望むと「なぜ最初に気づかなかった」ということも起こりがちなのですが、事前にシュミレーションをすることで気づくこともできるでしょう。
それでも気付かず上手くいかなくなった場合は、目的を達成するために戦略や方針を微調整することも必要になるでしょう。
そのときに、本来の計画が明確になっていないと調整することが難しくなります。

少しまとめると計画を立てるということは、

* 先々起こるべきことを事前に明確にする
* 可能な限りシュミュレーションをして起こりうる事態に備える
* 不測の事態が起きた場合に、再調整するために必要な情報を残しておく

などのことから、立てた計画通りに行動することに意味があるわけではなく、計画を立てる行為自体に意味があるという考えに行き着きました。

# テスト計画を立てる目的

計画を立てる本質的な意味・目的について、なんとなく再認識できたので
次にテスト計画を立てる目的について少し考えてみました。

SQuBOK Guideでは、テスト計画を立てる目的がこのように書かれています。
> プロジェクトにおけるテスト活動の指針やプロセス、ゴールとそれに
至る手段を明確にし、実現可能な実施計画を作成し、テスト管理活動全般への情報を提供する。

うまく要約されているので、なんとなく分かった気でいましたが、ちゃんと理解しているか自信がなかったので、具体的にテスト計画を立てる上で決めることを書き出してみました。

# テスト計画で決めること
1. テストのコンテキスト
    - テストの目的や方針、テストアイテム、スコープ、制約や前提条件を定
義する
2. テストのコミュニケーション
    - テストを実施する上でのコミュニケーションルールを定義する
        - コミュニケーションルール:Bugや質問などの連絡方法、会議体
3. テストのリスク
    - プロジェクトリスク、プロダクトリスクと対策を定義する
        - プロジェクトリスク＝PJのマネジメントに関するリスク(リソース不足等)
        - プロダクトリスク＝テスト対象に関するリスク(機能が動かない)
4. テスト戦略
    - テストのプロセスや成果物、使用するテスト設計技法、開始・完了基準などを定義する
5. テストの活動と見積もり
    - タスクの洗い出しと工数の見積もりを定義する
6. 人材の配置
    - タスクに対して、人材の割り当てを定義する
7. スケジュール
    - スケジュールやマイルストーンを定義する


まだ大枠ですが書き出しみて分かったことですが、テスト計画を立てる目的は

- テストの戦略・段取り・成果物について事前に明確にする
- 可能な限りシュミュレーションをしてテストのリスクに備える
- 不測の事態が起きた場合に、再調整するために必要な情報を残しておく
- プロジェクトに関わる人・組織に必要な情報を伝えられる状態にする

主にこの４つの目的があるんだと思いました。
まだまだ思慮不足な部分があると思いますが、すこしづつ更新して行けたらと思います。


# 次回
テスト計画を立てる上で決めることについて、もう少し詳細に書いていこうと思います。
初心者の僕がReactNativeを触ってみて感じたこと

どうもみなさん、初めまして。nomuraです。
最近、寒くなって来てお布団が恋しい季節になってきました。北陸は今年も雪たくさん降るかな〜
関東、関西でも今年は北陸並の降雪量なんだとか。

まぁ、嘘なんですけどね。実際は知りません。

みなさまお体には気をつけて日々をお過ごしください。
今回、KIT developer advent calender にて枠を予約しましたので
僕が超初心者ながら触ってみて大変だったことだったり勉強になった記事などをあげながら
これから始めたいと思っている方達の手助けになるであろう記事を書いて行こうと思います。

# 初心者の僕がReactNativeを触ってみて感じたこと
さて、本題ですが以下にこの記事を読むに際のバックボーン等を整理して行きます。

### 本記事の対象としている人物像
- 今からプログラミング始めてみたい
- 初心者だけどReactNative触り始めることを悩んでいる
- HTML、CSSしか触ったことないよ

などなど、あげればキリがないですがいわゆる<font color="Red">**初心者**</font>向けです

### 実際に僕が触リ始めた時のレベルと背景
- HTML、CSSを触ったことあるくらい
- ３回生の六月ごろ、企業インターンの技術選考に提出する成果物としてReactNativeを使用しアプリケーションを制作するという課題が提示された

### 僕が触った結果
<font color="Red">**撃沈**</font>。何事にも学ぶ順序があると再認識

### そもそもReactNativeってなんだよって方
細かく言って行けば「JavaScriptが」とか「ライブラリが」とか「React.jsが」とか「FluxやReduxが」とかなんちゃらかんちゃら出て来ます。
本記事対象の方はとりあえず今はHTMLとCSSとJavaScriptが合体してios、Androidのアプリをどっちも作れるぐらいの認識をしておいてください。

これだけ聞くと「すごい！」、「かっこいい！」、「便利そう！」とか思うでしょう！！！

あえて言います

<font color="orange">フハハハハハハハハハハハ！貴様！世の中そんなに甘くないぞ！</font>

僕は初心者なりに「かけたらめっちゃかっこいいし便利＾＾」って思ってました。浅はかでしたね

### なにがきついの
これは調べたらすぐ出て来るとは思いますが

- 文献の少なさ
- 出て来た文献も英語のものが多い
- 過去の記事と今の書き方のギャップ
- 前提としてのios、Androidの理解の必要性
- 様々な事前知識の必要性

などなどと言った感じで初心者からみたReactNativeで何がきついかを全てあげることは難しいですね
少しもしくはそれなりに知識があるとそれほど怖いものではないかもしれませんが初心者からすると本当にいばらの道です

### それでも僕は、私は、、、、
まずはJavaScriptやReact.jsとかいろいろやってみてください。
ゲームで例えるならLv.1初期装備でいきなり中級ダンジョンに臨むようなものです。
基盤を築いてください。よりスムーズに学ぶためにも。

#### 僕の経験のようにすぐに初めて何か作らなければいけない方
いばらの道へようこそ

少しでもあなたたちの装備の足しになればと思う、以下に僕がお世話になった記事等を載せて行きます。
ぜひ、参考にしてください。

それと、とりあえずは公式のドキュメントが一番心強いです。
## 学ぶ上で参考になる記事
@naodroid様
[0から始めるjs未経験者向けReact Native入門
](https://qiita.com/naodroid/items/dcd3e7eb8454d5ae9a54)


@gonta616様
[React Native 一問一答](https://qiita.com/gonta616/items/59ca174ca5068a805a18)

@yukika様
[React Componentのライフサイクルのまとめと利用用途](https://qiita.com/yukika/items/1859743921a10d7e3e6b)

など素晴らしい先駆者様たちのたくさんの記事があります。

少しサンプルを書いてみたら設計の概念なども学ぶとよりスムーズに成長できるはずです。

僕は成長の鍵は**とにかく書く**ことだと思っています。
みなさんの健闘を祈ります。
BitVisorのvmmstatusの使い方

BitVisorのtools/vmmstatus-gtkおよびtools/vmmstatus-win32の使い方を紹介します。

# vmmstatusとは

VMMの状況を出力するツールです。

# VMM側設定

make configでCONFIG_STATUSをセットします。

```
$ make config
```

また、defconfigまたはbitvisor.confにて、vmm.status=1にします。

# tools/vmmstatus-gtkのビルド方法

gtk+2.0を使用していますので、必要なライブラリなどは事前にインストールしておきます。カレントディレクトリを移動して、./autogen.sh && makeで完了です。src/vmmstatus-gtkというファイルができます。

# tools/vmmstatus-win32のビルド方法

MinGWクロスコンパイラーを事前にインストールしておきます。カレントディレクトリを移動してmakeで完了です。vmmstatus.exeというファイルができます。

Makefileはコマンド等がUnix環境のGNU Make用になっていますので、Windowsで使用される場合は必要に応じて修正してください。

# 出力内容の追加方法

coreディレクトリにあるソースコードにおいて、

```c
#include "vmmcall_status.h"
```

としておいて、register_status_callback()関数にchar *(*func) (void)型の関数ポインターを渡して登録することができます。登録すると、vmmstatusのVMM呼び出しが来た時に、その関数ポインターの関数が呼び出されます。登録されている関数がすべて呼び出された後、返されたchar *型のポインターが指すUS ASCIIテキストが連結されて、vmmstatusのコマンドに返される仕組みになっています。通常staticの配列を返すように実装します。最後に'\n'を入れておきます。

本機能は、オーバーヘッドを調べたり、性能改善をしたりする際に、各処理の呼び出し回数などを数えて、それを定期的に取得して変化を見るのが目的です。そのような回数カウントは、複数の論理プロセッサから同時に実行される場所においては、asm_lock_incl()関数を使用するなどして、値が壊れないよう注意深く実装するのが普通です。これは、lock命令を使用するため性能に影響し、本機能を使用しない場合には消しておきたいものです。そのために、STATUS_UPDATEというマクロが用意されており、このマクロの引数に渡された文は、CONFIG_STATUSがセットされている場合にのみ展開されるようになっています。
dlib で　no attribute 'get_face_chips'　となったときに

画像認識・機械学習のライブラリdlibで顔位置の画像を取り出そうとして
ある状況で次のようにつまづいた。

備忘録としてメモを残す。

トラブルの内容

```
$ python
Python 2.7.12 (default, Nov 20 2017, 18:23:56) 
[GCC 5.4.0 20160609] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import dlib
>>> dlib.get_face_chips
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute 'get_face_chips'
>>> dlib.__version__
'19.7.0'
>>> dlib.__file__
'/usr/local/lib/python2.7/dist-packages/dlib/__init__.pyc'
>>> 
```

ちなみに、
dlibをgit clone した次のディレクトリでは問題を発生していない。

```
()/dlib/python_examples$ 
()/dlib/python_examples$ ./face_alignment.py shape_predictor_5_face_landmarks.dat ../examples/faces/bald_guys.jpg



()/dlib/python_examples$ python
Python 2.7.12 (default, Nov 20 2017, 18:23:56) 
[GCC 5.4.0 20160609] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import dlib
>>> dlib.get_face_chips
<Boost.Python.function object at 0x1d3d0b0>
>>> dlib.__version__
'19.7.99'
>>> dlib.__file__
'dlib.so'
>>> 
```

dlib をgit clone したディレクトリでの
```
$ sudo python setup.py install
```
だけでは不十分だった。


/usr/local/lib/python2.7/dist-packages$ echo dlib*
dlib dlib-19.7.0-py2.7.egg-info dlib-19.7.99-py2.7-linux-x86_64.egg
の中で、19.7.99の版だけ残して
dlib dlib-19.7.0-py2.7.egg-info
の２つをなくしてから
$ source ~/.bashrc
をすると解決した。

別な手法でインストールしたdlibが残っていて、その版にはget_face_chips()が含まれていなかったためと判明した。

付記
http://dlib.net/python/index.html
には
get_face_chips
get_face_chip
の記述はない。バージョンの違いによることだったのだろう。
pysparkでタイトル類似度を計測する

## 概要

大量のタイトルの類似度を測って、似ているタイトルのアイテムを列挙したい。
その場合、タイトルの類似度を図るために、(N*N)/2個のタイトルを比較しなければならない。

タイトルが増えていくと、一つのCPUだと辛くなるので、分散処理環境で並列に処理しようとおもい、pysparkで分散環境で出来ないか調査してみた。

コードはgistにあげている。

https://gist.github.com/shibacow/6a2bd3a85e738871a20bbdeba7767c4d#file-calc_sim-py

## 利用したソース

spark 2.2.1
hadoop 2.7

試したCSV

https://gist.github.com/shibacow/6a2bd3a85e738871a20bbdeba7767c4d#file-csv_sample-csv

結果

https://gist.github.com/shibacow/6a2bd3a85e738871a20bbdeba7767c4d#file-result

|cid_1|         title_1|cid_2|         title_2|         simularity|
|:----:|----------------:|:---:|:---------------:|:-------------------|
|    2|             いいい|    6|             あいう|0.33333333333333337|
|    2|             いいい|   10|    あいあいいいああうあいあ|               0.25|
|    2|             いいい|   11|あいあいうあいあうあいいあうあい|             0.1875|
|    2|             いいい|    4|             ああい|0.33333333333333337|
|    2|             いいい|    8|           ああいああ|0.19999999999999996|
|    2|             いいい|    5|             いいう| 0.6666666666666667|
|    2|             いいい|    9|    あいあいあいあいあいあい|               0.25|
| 6| あいう| 2| いいい|0.33333333333333337|

使ったシェル

https://gist.github.com/shibacow/6a2bd3a85e738871a20bbdeba7767c4d#file-lunch-sh

## 作ったコードのポイント

### リソースの読み込み。

```python
df1 = sqlContext.read.format("com.databricks.spark.csv").option("header", "true").load(sample.csv.gz)
```
csvを読み込む。 圧縮してても良い。

### 読み込んだデータフレームを並列処理できるようにパーティショニング

```python
df1 = df1.repartition(分割するサイズ).cache()
test1 = df1.take(1)
```

読み込んだデータフレームを分割する。本当は自動で分割してれるそうなのだが、この処理がないと1つのCPUしか使わなかったのでこの処理を入れた。本当に必要なのかよくわからない。

この登録を参考にした。

https://forums.databricks.com/questions/6747/how-do-i-get-a-cartesian-product-of-a-huge-dataset.html

### 文章の類似度を調べる

タイトルの類似度はリーベルシュタイン距離を測ることで調べた

```py
filter(1.0 - (func.levenshtein(df1.title_1,df2.title_2) / func.greatest(func.length(df1.title_1),func.length(df2.title_2))) > 0.75)\
```

1.0 - levenshtein(タイトル1,タイトル2) / max(タイトル1,タイトル2) で、0.0-1.0までの類似度が求められ、0.0が全く似ていない。1.0が一致するということらしい。

pysparkで２つの変数にmaxを取るのに、max(a,b)というものが使えなかった。その代わり、greatest(a,b)を使って、maxを取った。

## 結果の出力

```py
dfout.write.save('sampledir.',compression='snappy')
```
出力結果は `snappy.parquet`形式で出される。

## その他
### explain

```python
dfout.explain()
```
結果の表示

```
dfout.show(100)
```
ただし、日本語で表示する際には、例外が発生した。
pysparkでutf-8を出すためには、環境変数を指定する。

```
export PYTHONIOENCODING=utf8
```

## 集計結果

### EMRを使ってpysparkで11万件のタイトルを比較してみた。

[amazon EMR](https://aws.amazon.com/jp/emr/)を利用してpysparkの動かした。

11万件なので、組み合わせの数は、N*(N-1)になり、約121億件の組み合わせでタイトル類似度を測った。集計時間は、`m3.2xlarge`　5台で、7時間程度、金額にして35ドル程度かかった。

![pyspark.png](https://qiita-image-store.s3.amazonaws.com/0/26986/2abc066f-5ae5-1219-86df-8deba044f067.png)

## 別のアプローチ。

マシンを、5台借りて7時間かかるのは流石に辛いので、別のアプローチを取ってみた。
類似のタイトルを探せれば良いので、[simstring](http://www.chokkan.org/software/simstring/index.html.ja)を使って、類似タイトルを検索してみた。

上と同じデータセット11万件を使い、GCPのn2-standardで10分程度で集計が出来た。
どのくらいの制度が出ているかは今から確認するが、sparkだとお金がかかりすぎるので、こちらのアプローチをもう少しやってみたい。
スプレッドシートのオブジェクトにGASのスクリプトを割り当てる

スプレッドシート内のオブジェクトをクリックすると、GASが動くように設定する。

設定したいオブジェクトを選択肢、右上の「︙」をクリックする
<img width="531" alt="スクリーンショット 2017-12-11 0.26.43.png" src="https://qiita-image-store.s3.amazonaws.com/0/164308/0db20ac4-5d9c-1247-347d-c65b82af5548.png">

「スクリプトを割り当て」を選択
<img width="498" alt="スクリーンショット 2017-12-11 0.27.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/164308/8cf358d3-f5cf-790a-35fe-371d00dfcff0.png">

動かしたいGASのfunction名を登録して完了！
<img width="921" alt="スクリーンショット 2017-12-11 0.27.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/164308/edae4ca2-ffef-27a1-7808-91a5e025eb01.png">
WSLのopenSUSE Leap 42.3にDocker CEをインストールする

# 概要
Docker公式ドキュメントには、Docker EEをSUSE Linux Enterprise Server(SLES) 12.xにインストールする方法は書いてあるが、Docker CEをopenSUSEにインストールする手順がない。[^1]

そこで、Windows 10のWindows Subsystem for Linux (WSL)環境でDocker CEを入れる方法を調べてみた。

# 環境
* Windows 10 Fall Creators Update 1709 (16299.64)
* openSUSE Leap 42.3

openSUSEはMicrosoft Storeからインストールできる。


# 前提
WSL上ではdockerdは動かないので、Docker for Windowsなど別にDockerのホストを用意して接続する。

ホストとしてDocker for Windowsを利用する場合、
[WSL(Bash on Windows)でDockerを使用する - Qiita](https://qiita.com/yoichiwo7/items/0b2aaa3a8c26ce8e87fe)
が参考になる。

「WSL上のDockerインストール」の部分だけ当記事で読み替えればいい。

# Docker公式サイトからバイナリをインストールする場合

サポート外のプラットフォーム用の手順として、バイナリインストールの手順が以下にある。
[Install Docker CE from binaries | Docker Documentation](https://docs.docker.com/engine/installation/linux/docker-ce/binaries/)
最新版を使いたい場合などはこの手順が推奨。

バイナリは以下から選択する。
https://download.docker.com/linux/static/stable/x86_64/
（stable以外のedge,testは好みで）

```sh:例
$ wget https://download.docker.com/linux/static/stable/x86_64/docker-17.09.1-ce.tgz
$ tar xzvf docker-17.09.1-ce.tgz
$ sudo cp docker/* /usr/bin
$  docker version
Client:
 Version:      17.09.1-ce
 API version:  1.32
 Go version:   go1.8.3
 Git commit:   19e2cf6
 Built:        Thu Dec  7 22:21:47 2017
 OS/Arch:      linux/amd64
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
```

# zypperを使ってインストールする場合

openSUSEのパッケージ管理ツールであるzypperコマンドを利用する場合は、こちらの手順。
ただし、リポジトリに含まれるバージョンはちょっと古い。

まず、zypperにDockerのリポジトリを追加するため、以下のファルを任意のエディタ(Vim等)で作成する。

```sh:/etc/zypp/repos.d/docker.repo
[Virtualization_containers]
name=Virtualization:containers (openSUSE_Leap_42.3)
type=rpm-md
baseurl=http://download.opensuse.org/repositories/Virtualization:/containers/openSUSE_Leap_42.3/
gpgcheck=1
gpgkey=http://download.opensuse.org/repositories/Virtualization:/containers/openSUSE_Leap_42.3/repodata/repomd.xml.key
enabled=1
```

ファイル作成後、リポジトリの更新とdockerのインストールを行う。

```sh:
$ sudo zypper --gpg-auto-import-keys ref
$ sudo zypper -n in docker
$ docker version
Client:
 Version:      17.07.0-ce
 API version:  1.31
 Go version:   go1.8.5
 Git commit:   87847530f717
 Built:        Fri Dec  8 19:35:14 2017
 OS/Arch:      linux/amd64
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
```

zypperで使ってるオプション、コマンドの意味は[こちら](https://qiita.com/gentaro/items/5a955ad63463497752b4)。

# ホストへの接続
WSL側で`DOCKER_HOST`環境変数で接続先のホストを指定する。

```sh:
$ export DOCKER_HOST='tcp://localhost:2375'
```

必要に応じて`~/.bashrc`などに追記しておく。

```sh
$ echo "export DOCKER_HOST='tcp://localhost:2375'" >> ~/.bashrc
```


# 参考
[Installation Docker CE on openSUSE Leap 42.3](http://blog.sdmoko.net/installation-docker-ce-on-openSUSE-Leap-42-3.html)

# 関連記事
[【小ネタ】Docker for WindowsをWSLで使う一番楽な方法 - Qiita](https://qiita.com/gentaro/items/fd0c32af2b12033f9cae)
[Docker for WindowsをWSLから使う時のVolumeの扱い方 - Qiita](https://qiita.com/gentaro/items/7dec88e663f59b472de6)

[^1]: 2017/12/10 現在
Mac のスリープ／復帰時にスクリプトを実行する

sleepwatcher を利用すれば，Mac のスリープ／スリープ復帰時にスクリプトを実行することができる．

- 研究室・自宅間で移動する度に手動でネットワーク環境を切り替えるのが面倒なので，復帰時に接続しているアクセスポイントに応じて自動で切り替わるようにする．
- ディスクの取り出し操作をせずにバックアップ用のディスクが接続されたハブを抜くと不正な取り出しになってしまうので，スリープ時にアンマウントする．

## スリープ／復帰時に実行したいスクリプトを作成する
### ネットワーク環境を切り替える shell script を作成
```Users/hogetaro/Scripts/network-environment_auto-switcher.sh
#!/bin/sh
switchtolocation() {
  currentlocation=`networksetup -getcurrentlocation`
  if test $currentlocation = $1; then
    return
  fi
  scselect `scselect|grep ${1}|cut -b 4-40`
  osascript -e 'display notification "'"ネットワーク環境を「${1}」へ変更しました。"'" with title "'"${0##*/}"'" subtitle "'"${2}"'"'
}

ADAPTER=en0

sleep 5s

airportpower=`networksetup -getairportpower ${ADAPTER}|cut -d' ' -f4`
if test ${airportpower} = 'Off'; then
  echo 'Wifi is Off.'
  exit
fi

ssid=`networksetup -getairportnetwork ${ADAPTER}|cut -d':' -f2|cut -b 2-`
case "$ssid" in
  [自宅のSSID])
    switchtolocation [自宅のネットワーク環境名] ${ssid}
    ;;
  [会社のSSID])
    switchtolocation [会社のネットワーク環境名] ${ssid}
    ;;
  *)
    switchtolocation Automatic ${ssid}
    ;;
esac
```
- ファイルの置き場所はどこでも．
- アダプター名（`ADAPTER=en0`）の部分は，「このMacについて>システムレポート>ネットワーク>Wi-Fi」で確認したインターフェース名とする．
- 自分のSSID，ネットワーク環境名に編集する．[]は外す．
- `sleep 5s`で，端末がwifiネットワークに接続する前にスクリプトが走らないようにする．待機時間は適当なので調整してください．

### ディスクをアンマウントする shell script を作成

```Users/hogetaro/Scripts/disk_unmounter.sh
#!/bin/sh
diskutil unmount [diskname]
```
### 実行権限を付与
```
$ chmod u+x network-environment_auto-switcher.sh
$ chmod u+x disk_unmounter.sh
``` 

## sleepwatcher の設定
### sleepwawtcher をインストール
sleepwatcher を利用すると，スリープ前，復帰後にスクリプトを走らせることができる．

```
$ brew install sleepwatcher
```

### LaunchAgents 下にファイル作成

```Users/hogetaro/Library/LaunchAgents/before-sleep_after-awake.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>Label</key>
	<string>de.bernhard-baehr.sleepwatcher</string>
	<key>ProgramArguments</key>
	<array>
		<string>/usr/local/sbin/sleepwatcher</string>
		<string>-V</string>
        <string>-w /Users/hogetaro/Scripts/network-environment_auto-switcher.sh</string>
        <string>-s /Users/hogetaro/Scripts/disk_unmounter.sh</string>
	</array>
	<key>RunAtLoad</key>
	<true/>
	<key>KeepAlive</key>
	<true/>
</dict>
</plist>
```

- `-w`以降が復帰（Wake Up）時に実行するコマンド
- `-s`以降がスリープ（Sleep）時に実行するコマンド

### launchd に登録
```
$ launchctl load [path/]before-sleep_after-awake.plist
```

## 参考
- [Wifi接続先に応じてネットワーク環境設定を自動で切り替える](https://qiita.com/naname/items/3e69efb187be22109c69)
- [Mac OS X で ネットワークプロファイルをアクセスポイント名で自動切り替え](https://qiita.com/kobakou/items/93f18aac4334e87f6d04)
- [[Mac] スリープ復帰時に NAS を再接続する方法](http://blog.miyadi.net/archives/911)
- [Sleepwatcher 〜Macのスリープと復帰時にアクション実行を可能に　(2)実行編](http://www.jn1msd.net/lifeisrun/archives/2015-230/)
- [carlo/sleepwatcher_config](https://github.com/carlo/sleepwatcher_config/blob/master/de.bernhard-baehr.sleepwatcher.plist)
【メモ】zypperのオプション

openSUSEのパッケージ管理ツールのzypperで指定するオプション、コマンドについて、よく使いそうなものをメモ。

|オプション|説明|
|:--|:--|
|--gpg-auto-import-keys|新規リポジトリの署名を自動的に信頼する|
|-n (--non-interactive)|既定値を自動的に選択する（非対話モード）|

|コマンド|説明|
|:--|:--|
|lr (repos)|リポジトリ一覧|
|ar (addrepo)|リポジトリの追加|
|rr (removerepo)|リポジトリの削除|
|ref (refresh)|リポジトリのリフレッシュ(更新)|
|in (install) |パッケージのインストール|
|rm (remove)|パッケージの削除|
|up (update)|パッケージの更新|
|lu (list-updates)|利用可能なパッケージの更新一覧|
|patch|パッチのインストール|
|lp (list-patches)|利用可能なパッチ一覧|

個人的にたまにしか使わないと思うので、また調べた際に追記するかもしれない。
僕がpyenv+anaconda3+jupyter notebookを選んだ理由と、その導入

2017年12月から新しい職場に移り、開発環境設定周りを一から行ったので、忘れないように書き留めます。

自宅で使っているMacBooK Airのスペックは下記の通りです。(かなり古いです。)

```text
2011 MacBook Air 3,1
1.4 GHz Intel Core 2 Duo
2 GB 1067 MHz DDR3
128 GB SSD
High Sierra 10.13.2
```

とりあえず今回は
1. pyenvのインストール
2. anacondaのインストール
3. jupyter notebookの起動
まで、基本的なことを書きます。
jupyter notebookの設定や開発に使うvimの設定は次回以降説明します。

# なぜjupyter notebookを使うのか

一応そもそもの話をしておくと、仕事で分析周りのお仕事をしているので、機会学習やグラフ描画が手軽にできる環境を構築する必要がありました。

専門は分析基盤ですが、Redshift等にMacからSQLを発行する際に、ipython-sqlというツールを使えば便利なので、基盤の開発でも使ってます。

また現在GitHub上で簡単にNotebookを共有できるので、社内で分析やSQLを共有するという意味でも優れています。

# なぜpyenv+ anaconda3か

環境はpyenv+ anaconda3になります。

pyenvとanacondaを推奨しない議論もありましたが、
https://qiita.com/shibukawa/items/0daab479a2fd2cb8a0e7

分析基盤をやってきた印象としては

- ドライバの設定や踏み台サーバが絡みPython3ではSQLクエリが失敗するケースがある
- 分析周りで後々に必要となるOSパッケージが出てくる場合があり、その度にPythonのアンインストールとインストールを繰り返すことがある

などなどの理由があり、サクッと色んなPythonバージョンを入れられて、サクッと分析環境を作れる anacondaがいいかと思っています。あとローカルの環境をなるべく汚したくないですしね。

Python3系なのは、現在読み進めている
Fluent Python
https://www.google.co.jp/amp/s/www.oreilly.co.jp//books/9784873118178/mobile.html
という書籍がPython界のバイブルになるような気がしているので、それに合わせてです。前述したように、職場ではDB接続の関係上Python2系を余儀なくされることもあるので、どちらも使えるといいと思います。

# pyenvのインストール

まずCommand Line Tools for Xcodeをインストールします

```bash
~$ xcode-select --install
```
するとポップアップが出てきてますので、「インストール」を押してしばらく待ちましょう。

次にHomebrewをインストールします

```bash
~$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

pyenvをインストールします

```bash
~$ brew install pyenv
```

下記のように.bash_profileを編集して、pyenvの自動補完を有効にしましょう。

```bash
~$ echo -e 'if command -v pyenv 1>/dev/null 2>&1; then\n  eval "$(pyenv init -)"\nfi' >> ~/.bash_profile
```

最後に.bash_profileを読み込んで完了です。

```bash
~$ source .bash_profile
```

# anacondaのインストール

下記コマンドを発行してインストール可能なバージョンを調べます。

```bash
pyenv install --list
```

ここではanaconda3-4.0.0がanaconda3系の最新でしたので、これをインストールします。

```bash
~$ pyenv install anaconda3-4.0.0
```

インストールが完了するまで結構待ちますが、お風呂にでも入って待ちましょう。
インストールが完了したら、下記コマンドを実行してanaconda3を標準にします。

```bash
~$ pyenv global anaconda3-4.0.0
```

# jupyter notebookの起動

```bash
~$ jupyter notebook
```

でjupyter notebookを起動しましょう!
うまくいけばブラウザ上でjupyter notebookが立ち上がるはずです。


# 最後に

簡単にではありますが、mac上にjupyter notebookの環境を立上げる説明をしました。
ここから、どうやってjupyterをかっこよくしてくかなどの説明は次回以降行います。
よく使うLinuxコマンド

#全文検索

```
grep -ir [string]
```

#ヒアドキュメント

```
cat << EOS
hoge
fuga
piyo
EOS
```

リダイレクト含む

```
cat <<EOF > test
line1
line2
line3
EOF
```

#LISTENポート表示
a:すべてのポートを表示
l:LISTENポートのみ表示
u:UDPポート表示
t:TCPポート表示
n:ポートを番号で表示
4:IPv4のみ表示

```
ss -lutn4
```

#ポート開放（firewalld）

一時的なポート開放（443の場合）

```
# firewall-cmd --zone=public --add-port=443/tcp
```

恒久的なポート開放（443の場合）

```
# firewall-cmd --zone=public --add-port=443/tcp --permanent
```

リロード

```
# firewall-cmd --reload
```

設定確認

```
# firewall-cmd --list-all
```

#特定ポート疎通確認

curlを用いて特定ポート確認

```
# curl -v telnet://<hostname or ip address>:80
```
Rails5.1でform_withを利用した時にtext_fieldなどでid属性を自動生成してもらう方法

## 事の発端

Rails5.1から使えるform_withを使うと、f.text_fieldなどに今まで自動生成されていたid属性が生成されなくなる。
通常であればid属性が生成されなくても困らないかもしれないけど、f.labelと併用しているときにlabelのfor属性は自動生成されるが、それに対応するinputのid属性が生成されないので少し困った。

## 解決方法
自分でid属性を指定してもいいが、ちょっと長くて面倒なので自動で生成されるようにできないかを調べてみた。
するとtext_fieldなどにはskip_default_idsオプションがあり、skip_default_ids: falseと指定するとこれまで通りid属性が自動生成されるようになった。
(下記のようにf.label doでネストする方法もあるみたいだけど、今回はデザインの都合上この対応が取れなかったので。
https://github.com/rails/rails/issues/25197#issuecomment-231830219)

ただ、1つ１つに毎回skip_default_idsを指定するのは面倒なので、form_withにオプションで指定できるのではないかと思って調べてみたが、form_with内でskip_default_idsをtrueに指定するのがハードコードされていたのでRails5.1では１つ1つ指定するしかなさそう。。
https://github.com/rails/rails/blob/v5.1.4/actionview/lib/action_view/helpers/form_helper.rb#L745


## 補足
これはどうやらRails5.2になるとform_with_generates_remote_formsみたいに一括設定できるようになるっぽい。
https://github.com/rails/rails/commit/21cd5b3031b0c022439a88cb750c1e00cd07f1e3
煮詰まった時に使える！チームを助けるデザインレビュー

*こんにちは。デザイナーのヤマザキです。現在、私はグロービスで「[グロ放題](https://hodai.globis.co.jp/)」のUIデザイナーとして参加させていただいてます。「[グロ放題](https://hodai.globis.co.jp/)」はビジネススキルを学習できる動画サービスです。こちらでは、UXデザイナーとして参加してくれる方を絶賛募集中です。くわしくは[こちら](https://www.wantedly.com/projects/170462)。*

# 目次
1. はじめに
2. デザインレビューの型
3. メンバー構成
4. 仕組み化
5. まとめ

# はじめに
![aleks-dorohovich-26.jpg](https://qiita-image-store.s3.amazonaws.com/0/208223/591cdf47-54df-a658-20ef-79df018d9c41.jpeg)
デザインレビューは、一緒にサービスを構築する仲間をチームで助ける作業のことです。使い所としては、企画→基本設計→プロトタイプ→詳細設計→モック開発といった設計のプロセスで使用します。

煮詰まったり、ある程度複数のアイディアが固まってきたタイミングでデザインレビューを設定し、関係者を集めます。満たすべき項目をそれぞれの観点からフィードバックし、ある一定の基準を超えている事をチームで確認してから次のステップに進みます。また、後工程からの手戻りを防止するのに有効です。

# デザインレビューの型
デザインレビューは、企業において様々なフローが存在します。
はっきり言って決まった型はありません。

今回のレビュー項目はモバイル向けアプリの改修・新規開発を想定した初・中級者向けに作成しており、あくまで経験上での個人的観点から列挙していますので、参考程度に捉えていただけると幸いです。

# メンバー構成
どんなレビューをしたいかによって、多様な人材を揃えたり、人数を決定します。レビュー依頼側は大抵1〜2名なので基本レビュー側も2〜３名ほどが良いように感じています。たまに大規模な開発になると依頼者の他に見学者という名目で10名ほど追加で参加するケースもあります。

また、エキスパートレビューのように高い専門スキルを持った方にレビューを依頼する場合は、今回のようなデザインレビュールールは必要ないかもしれません。

# 仕組み化
![patrick-perkins-350622.jpg](https://qiita-image-store.s3.amazonaws.com/0/208223/cb512ff1-33cd-dfa5-1878-b0d5b8c566d8.jpeg)

今回は、デザインレビューの仕組みを構築する上で最低限必要になってくる4つの観点を箇条書きで書き連ねてみます。

## 代表的な４つの観点

### **1. プロジェクト全体**
- 全体設計
    **・**ビジネス視点の観点で考慮したい項目を洗い出す
    **・**ユーザー視点の観点で考慮したい項目を洗い出す
- デザイン、開発、ビジネス要件の視点
- バリューの確認

### **2. UX**
- 時間軸でサービス全体の利用体験を確認
- フロー毎（マーケティング、各チャネル、サービス品質、カスタマーサービスなど）の利用体験を確認
- 他にエクスペリエンスを確認する上で欠かせない条件を設定


### **3. APP**
- 企業、事業のAPPサービスとして外せない項目を設定
- APPサービスとして外せない項目を設定

### **4. その組織においての厳守したいデザインルール**
- デザイン原則を引用または設定
- ガイドラインの設定

# まとめ

レビュー項目が多いと大変ですし、最初はルールとにらめっこしながら客観的にサービスをチェックする時間が億劫になるかもしれません。しかし、レビューする側も慣れてくると、本質にたどり着くスピードも速くなっていきます。

私もそうですが、サービスを作っていると近視的になっていくことが多いです。そんなとき、気軽にデザインレビューできる仕組みがあれば、チームも自分も助けることができると考えています。特に、サービスの規模が大きくなっていけばいくほどデザインレビューは必要不可欠な第三の目になってくれるはずです(｡･ε･｡)
超速本にも載った New Relic のフロントエンド監視製品(主にNew Relic Browser)の紹介

New Relic Advent Calendar 2017 10日目。

昨日に引き続き「[超速！ Webページ速度改善ガイド](http://gihyo.jp/book/2017/978-4-7741-9400-4)」(通称、超速本)にあやかった内容。[昨日は人工(合成」モニタリング製品である New Relic Synthetics の話](https://qiita.com/kumatronik/items/d6b87e4641d59749a5f5)でした。

本日はその対となるサービスであるリアルユーザーモニタリング「[New Relic Browser](https://newrelic.degica.com/docs/browser/new-relic-browser/getting-started/introduction-new-relic-browser)」の話。

ちなみに、New Relic Browser のデータ収集には、超速本にもでてきた Navigation Timing API を使っている。詳しくは、[こちら](https://newrelic.degica.com/docs/browser/new-relic-browser/page-load-timing-resources/instrumentation-browser-monitoring)を参照。

## New Relic Browser 

昨日もちょろっと書いたけど、New Relic Browser は、リアルユーザーモニタリング製品。つまり、実際にウェブアプリにアクセスしたユーザーのブラウザ内のパフォーマンスを測定、分析するサービス。

![スクリーンショット_2017-12-10_17_35_23.png](https://qiita-image-store.s3.amazonaws.com/0/46003/d1daf0f7-667e-81b5-6f7a-487ac3bf5e25.png)
New Relic Browser の概要(Overview)ページ

具体的には、DOM 処理、レンダリング、ネットワーク、サーバーサイドアプリの処理時間を表示してくれたり、どのリソースの読み込みにどれくらいの時間がかかっているかを教えてくれる。Synthetics よりこっちのほうが、超速本に書いている内容が参考になるかもしれない。つまり、Google Chrome の DevTools 的内容が確認できるのが New Relic Browser。Chrome とかだと、あたりまえだけど、アクセスした自分の環境でのパフォーマンスしか見れないけど、New Relic Browser は、アプリにアクセスしてきたユーザーのブラウザ上のパフォーマンスが見れるのが大きく違うところ。

遅いページビュー順やスループットの多い順などでページビューを確認できる。

Google DevTools にあるような Network のような時系列でどのリソースがいつ読み込まれて、それにどれくらいの時間がかかったかを New Relic Browser の Session traces メニューで確認できる。

![test4.gif](https://qiita-image-store.s3.amazonaws.com/0/46003/e6866eee-45c4-670b-087d-0b294cedea61.gif)

また、実際のユーザーの情報を集めているので、ブラウザの種類、バージョン、場所での統計的な情報やそれを絞り込んだパフォーマンス分析もできる。(Chrome の平均処理時間とか、ある URL のモバイルからのアクセス数は？とか）

![スクリーンショット 2017-12-10 23.52.24.png](https://qiita-image-store.s3.amazonaws.com/0/46003/35b14310-971a-6430-bc43-609855c2e7aa.png)


## JavaScript エラーも見える

![スクリーンショット 2017-12-10 23.55.09.png](https://qiita-image-store.s3.amazonaws.com/0/46003/7899c6bb-9d01-cac2-f6a4-c1b5b442fc33.png)


## SPA にも対応

New Relic Browser は、SPA (シングルページアプリケーション） にも対応している。どういうことかというと、ページの表示された後の、ルート変更でのパフォーマンスも確認できる。

![スクリーンショット 2017-12-10 17.30.35.png](https://qiita-image-store.s3.amazonaws.com/0/46003/56a0928b-3add-1236-532a-fe692d50edba.png)
New Relic Browser の Overview ページ。SPA モードだと、ページの初期ロードのパフォーマンスとルート変更のパフォーマンスが両方が表示される。

SPA の計測については「[New Relic Browser: ページ読み込み、SPA(ルート変更)、Ajax リクエストの計測](https://qiita.com/kumatronik/items/acd60aa027a61d7728fd)」をご覧ください。

## 参考情報

この記事を読んで New Relic Browser に興味をもっていただけたら、是非以下の記事もご覧ください。

- [New Relic Browser : ユーザーのパフォーマンス(RUM)も計測できるよ](https://qiita.com/kumatronik/items/35f82746d5072001f566)
- [ドキュメント: New Relic Browser](https://newrelic.degica.com/docs/browser/new-relic-browser/getting-started/introduction-new-relic-browser)


## まとめ

New Relic Browser に興味をもっていただけたでしょうか？ 今回紹介した機能は主にPROユーザー向けとなります。プランや価格帯が気にある方は[こちらの記事](https://qiita.com/kumatronik/items/8cf6e077a4f0832f66a6)をご覧ください。

[超速本](http://gihyo.jp/book/2017/978-4-7741-9400-4)にも書いてあったけど、「Measure, Don't Guess」(推測するな計測せよ)を実践して、効率よいパフォーマンス改善のお供に New Relic Synthetics や Browser をよろしくお願いします。
LaravelでFacebookログインを実装しようとして失敗

[【Laravel】Facebookログインを実装する方法【コピペOK】](https://manablog.org/laravel_facebook_login/)

こちらを参考に進めたら詰みました。

最終更新日は2016/08なので、フォルダ構造とかは変わってるかも……とは覚悟していましたが、そもそもいろいろ違ったみたいです。

#configファイルの作成
app/configとなってますが、Laravel直下にあるconfigがそれっぽいのでそっちに作成しました。

```
$ vi config/facebook.php
$ cat config/facebook.php 
<?php
return array(
        'appId' => '[app_id]',
        'secret' => '[app_secret]'
    );
```

#DBの作成（エラー）
なんかエラー。

```
$ php artisan migrate:make create_users_table

                                          
  Command "migrate:make" is not defined.  
                                          
  Did you mean one of these?              
      migrate                             
      migrate:fresh                       
      migrate:install                     
      migrate:refresh                     
      migrate:reset                       
      migrate:rollback                    
      migrate:status  
```

調べます。

> [laravel - php artisan migrate:make create_mytable fails: "migrate:make" is not defined - Stack Overflow](https://stackoverflow.com/questions/25840643/php-artisan-migratemake-create-mytable-fails-migratemake-is-not-defined)

> The syntax has changed to php artisan make:migration.

magrate:makeじゃなくてmake:migrationらしいです。
なんか統合されたんですかね？

作成後、記載されている内容でファイルを編集します。


#モデルの作成
models……というのがわからないので調べました。

> [Eloquent：利用の開始 5.5 Laravel](https://readouble.com/laravel/5.5/ja/eloquent.html)

データベースの設定であるconfig/database.phpを設定してね、詳しくはこれ見てねとのこと。

> [データベース：利用開始 5.5 Laravel](https://readouble.com/laravel/5.5/ja/database.html#configuration)

こちらを見た感じだと、Homesteadで作ったローカルにつなぐならデフォルト設定のままで良い？っぽいのでそのままにします。

ただ、app/modelsが見つかりません。
それだけならいいんですが、そもそもどこにもそんなディレクトリはなさそうです。

で、また調べました。

> Laravelを学習し始めるとき、多くの開発者はmodelsディレクトリが存在しないことに戸惑います。しかし、意図的にこのディレクトリを用意していません。多くの別々の人達にとって、その意味合いは様々なため、"models"という言葉の定義は曖昧であることに私達は気づきました。ある開発者たちはすべてのビジネスロジックを総称してアプリケーションの「モデル」と呼び、一方で別の人達はリレーショナルデータベースに関連するクラスを「モデル」として参照しています。
> このため、私達はEloquentモデルをデフォルトではappディレクトリ下へ設置することを選択し、開発者自分が選んだどこか別の場所へ設置してもらうことにしました。

> [ディレクトリ構造 5.5 Laravel](https://readouble.com/laravel/5.5/ja/structure.html)

うっわ余計なことを。
というかそれならデフォルトをapp/modelsにしてくれればいいのに。
**そもそも『開発者自分が選んだどこか別の場所』に設置するのはいいけど、その設定はどこでするんでしょう……？**
勝手に探してくれるんですかね？

一応、そう信じてみることにして、app/modelsを作成します。

> まずはProfileモデルを作成します。
新規作成ファイル：app/models/People.php

……Profile.phpじゃなくて？　ん？

それともファイル名はどうでもいいんでしょうか……？

とりあえず信じてやってみることにします。

User.phpの方は……これだけじゃないですよね。
どう考えても&lt;?phpとか必要ですよね。
そもそもデフォルトでappにUser.phpがいるんですけど。

というわけで、modelsに移動させた上でUserクラスのなかに追記しました。


#ルーティングの設定
**app.routes.php……どれのことでしょう……。**

この手のことを書くのはweb.phpな気がするので、そちらに書いてみます。

**というかこの項と次の完成版はこちら、までの工程がぐっちゃぐちゃで話が見えません。**
コールバックを最低限の形にしておいて、次の項の形まで発展させたってことでしょうか？

とりあえず完成版は置いておいて、この通りにしてみました。

ブラウザで確認してみます……エラー。

    Class 'Facebook' not found

予想外なエラーが出ました。
**さっきのweb.phpのlogin/fbで使っているFacebookに対して、そんなもんねーぞと言われているようです。**

参考元の記事を見直すと、FacebookSDKのインストールをしてないような気が？
したのですが、そのインストールのコードを試したらout of dateとか言われてこれもエラー。

ちょっとわかんないですね……。

Good Game.