OmniAICreator/Qiita-1.07M huggingface dataset:
gsonの使い方

# 環境
Java:8
GSON:2.2.4

# 参考
https://github.com/google/gson

# GSONとは
* JavaのオブジェクトとJSON形式のデータを相互で変換するためのライブラリ
* シンプルなtoJson()とfromJson()メソッドで相互変換を実現する
* Javaのオブジェクトがネストしている構造でも変換を行える

# インストール

Gradleの場合

``` .gradle
dependencies {
    compile 'com.google.code.gson:gson:2.2.4'
}
```
Mavenの場合

``` .xml
<dependency>
      <groupId>com.google.code.gson</groupId>
      <artifactId>gson</artifactId>
      <version>2.2.4</version>
      <scope>compile</scope>
</dependency>
```

# 変換するJavaのクラス
今回はUserInfoクラスとCompanyクラスを使用する
CompanyクラスはUserInfoクラスのオブジェクトをListの形式で保持している
※これから表示するクラスのsetter、getterは省略する

``` UserInfo.java
public class UserInfo {
    private String name;
    private int age;

    @Override
    public String toString() {
        return "UserInfo{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
```

``` Company.java
public class Company {
    private String name;
    private List<UserInfo> userInfos;

    @Override
    public String toString() {
        return "Company{" +
                "name='" + name + '\'' +
                ", userInfos=" + userInfos +
                '}';
    }
}
```

# Java→JSON
JavaのオブジェクトをJSON形式に変換する方法

``` .java
Gson gson = new Gson();

UserInfo userInfo = new UserInfo();
userInfo.setAge(20);
userInfo.setName("カサレアル　太郎");
List<UserInfo> list = new ArrayList<>();
list.add(userInfo);

Company company = new Company();
company.setName("カサレアル");
company.setUserInfos(list);

String json = gson.toJson(company);
```
生成されるjsonは以下の通り

``` .json
{"name":"カサレアル","userInfos":[{"age":20,"name":"カサレアル　太郎"}]}
```

# JSONからJava(単一オブジェクト)
次のJSONをJavaのオブジェクトに変換する

``` .json
{"name":"カサレアル","userInfos":[{"age":20,"name":"カサレアル　太郎"}]}
```

``` .java
String json ="{\"name\":\"カサレアル\",\"userInfos\":[{\"age\":20,\"name\":\"カサレアル　太郎\"}]}";
Gson gson = new Gson();

Company company = gson.fromJson(json, Company.class);
``` 

# JSONからJava(コレクションオブジェクト)
以下のJSONをコレクションオブジェクトに変換する

``` .json
[
  {
    "name": "はじめての会社",
    "userInfos": [
      {
        "age": 16,
        "name": "山田　花子0"
      },
      {
        "age": 17,
        "name": "山田　花子1"
      }
    ]
  },
  {
    "name": "ふたつめの会社",
    "userInfos": [
      {
        "age": 16,
        "name": "山田　花子0"
      },
      {
        "age": 17,
        "name": "山田　花子1"
      },
      {
        "age": 18,
        "name": "山田　花子2"
      }
    ]
  }
]
```
``` .java
String json = "省略"
Gson gson = new Gson();
// 変換する型情報を用意する
Type listType = new TypeToken<List<Company>>(){}.getType();
List<Company> list = gson.fromJson(json, listType);
```

ここでのポイントは、変換前に変換後の型情報を生成する
変換処理の第２引数に用意した型を渡す
IoT Technology Conference powered by SORACOM if-up 2017（4/20） セッション資料

#IoT Technology Conference powered by SORACOM if-up 2017

https://if-up2017.soracom.jp/
資料のまとめ。

|カテゴリ|セッション|発表者（敬称略）|リンク|
|-----|-------|-----|:--:|
|キーノート|SORACOM Inside|ソラコム 安川 健太|[資料](https://www.slideshare.net/SORACOM/ifup-2017-soracom-inside)|
|キーノート|キーノートパネル|アーム 内海 弦<br>LINE 砂金 信一郎<br>Ruby開発者 まつもとゆきひろ<br>ソラコム 玉川 憲|[資料](https://www.slideshare.net/SORACOM/ifup-2017-soracom-inside)|
|セッション1|A1：IoT通信の選択肢とLoRaWANに見るデバイス開発のポイント|ソラコム　大槻 健|[資料](https://www.slideshare.net/SORACOM/ifup-2017-a1iotlorawan)|
|セッション1|B1：エッジヘビーコンピューティングと機械学習|Preferred Networks　田中 大輔|[資料(1)](https://www.slideshare.net/SORACOM/ifup-2017-b1)<br>[資料(2)](https://www.slideshare.net/pfi/ss-75251599)|
|セッション2|A2：コネクティビティのビジネス実装|WAmazing 舘野 祐一<br>ライナフ　滝沢 潔|[資料](https://www.slideshare.net/SORACOM/ifup-2017-a2)|
|セッション2|B2：デバイスデザインパターン〜ユースケース別デバイス選定〜|インフォキューブ LAFLA　田中 大輔<br>ザイマックスアルファ　 作元 研一|資料|
|セッション3|A3：業務システムとの連携〜閉域網とクラウド〜|小松製作所　根本 雄一<br>ハンズラボ 平井 俊之|[資料(1)](https://www.slideshare.net/SORACOM/ifup-2017-a3)<br>[資料(2)](https://www.slideshare.net/hiraitosihiyuki/ss-75250658)|
|セッション3|B3：GPSとIoT〜位置情報取得で押さえるポイント〜|フレクト 佐藤 正士<br>デザイニウム 前田 諭志|[資料](https://www.slideshare.net/SORACOM/ifup-2017-b3gpsiot)|
|セッション4|A4：カメラデバイスとクラウド〜スムーズな連携のために〜|プラネックスコミュニケーションズ 中林 千晴<br>ABEJA 河崎 敏弥|資料|
|セッション4|B4：Using Soracom in Smart Buildings|ソラコム Alexis Susset|[資料](https://www.slideshare.net/SORACOM/ifup-2017-b4using-soracom-in-smart-buildings)|
pyenvでPythonをインストールする


## 条件
* Mac OS Sierra
* [anyenv](https://github.com/riywo/anyenv)をインストール済

## インストール手順

pyenvのインストール＆パスの設定

```
$ anyenv install pyenv
$ echo 'eval "$(pyenv init -)"' >> ~/.bash_profile
$ source ~/.bash_profile
```

Pythonのインストール

```
#インストール可能なVer.の確認
$ pyenv install --list

# 最新の安定板をインストール
$ pyenv install 3.6.1

# インストールしたVer.をglobalにする
$ pyenv global 3.6.1
$ pyenv versions
  system
* 3.6.1
```

Pythonの動作確認

```
$ python
Python 3.6.1 (default, Apr 20 2017, 11:16:55) 
[GCC 4.2.1 Compatible Apple LLVM 8.1.0 (clang-802.0.42)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> exit()
```
Ubuntu-ゲストOSとホストOS(Windows10)のファイル共有

メモ

#VietualBox
ホスト側で任意の場所に共有したいフォルダの作成
ここではNAMEフォルダを作成したとする
VietualBoxの設定
設定 -> 共有フォルダ
右のボタンから新規共有フォルダの追加
追加したNAMEフォルダを選択
チェックボックスに「自動マウント」、「永続化する」するにチェック
してOKを押し前の画面へ戻るそしてOKを押して戻る

#Ubuntu
ターミナルから
`sudo mkdir /mnt/sync`
`sudo chmod 777 /mnt/sync`
`sudo mount -t vboxsf sync /mnt/sync/` 

以上で共有できるようになる
Trelloライクなプロジェクト管理OSS入れてみたよ - restya

# restyaとは？

trelloのOSS版って感じ。trelloよりも高機能で、JIRAのようなアジャイルやるには物足りないぐらいの位置付け。
v4.0.2からはだいぶ使いやすくなったと思ってる。

## ツールとかURLとか
restya install guide: http://restya.com/board/install
restya docker install guide: https://github.com/namikingsoft/docker-restyaboard

## 始める前に

- GCEにコンテナつくってインスタンス立ち上げる
- docker / docker-compose のインスコ
- selinux切っておく

## restya dockerのインスコ

githubをcloneする

```bash
git clone https://github.com/namikingsoft/docker-restyaboard.git
cd docker-restyaboard
fig up -d
```

これで終わり！


### 罠に引っかかったら
---
##### 罠1　elasticsearchが動かない

<img width="977" alt="06B47081-F3C8-4254-ACD3-097C0C7A5CBB.png" src="https://qiita-image-store.s3.amazonaws.com/0/41763/d686b3b6-87bc-382f-54be-2f50871b3dfe.png">

これはたぶんサーバのスペックがしょぼいからだと思われる。。。
elasticsearchは2台でクラウド構成になっている。
だからしょぼいサーバではメモリが足りなくなってスレッドが起動できずにいる。
自分はGCPの一番小さいインスタンスで動かそうとして諦めました・・・。

どうしても小さいインスタンスで動かしたい！
そんな時は、wekan（TrelloライクなOSSその2）いれたらいいよ；；

##### 罠2　nginxが403を吐く
/usr/local/share/htmlの実行権限がないから。
docker-entrypoint.shに chmod 777 /usr/local/share/html -R とでも書いておけばOK
「オフラインリアルタイムどう書くF03の問題」をRで解く

「正八角形の分割 2017.4.19 問題」[問題はこちら](http://nabetani.sakura.ne.jp/hena/ordf04octsp/) [qiita記事はこちら](http://qiita.com/Nabetani/items/8ead5622e192d9655cf5)

Rで解きました。線を引く場所を求めて、差を計算する方式です。
途中、原点を通る線分が１つに融合するケースがあるのが注意点でした。

```r
# answer to http://nabetani.sakura.ne.jp/hena/ordf04octsp/

solve <- function(n)
{
  # which power of 2 is on?
  # if n = 165, then x = [0,2,5,7], meaning
  # 165 = 2^0 + 2^2 + 2^5 + 2^7
  n <- as.integer(n)
  x <- which(as.integer(intToBits(n)) > 0) - 1
  # if there is no "on", then there is no boundary,
  # hence octagon remains.
  if (length(x)==0) return('8')
    
  # append the 8 + x[1] to the end
  # this helps to compute the last polygon shape by diff() function
  x <- c(x, 8+x[1])
  
  ans <- diff(x)+2
  # be careful, if diff is 4, then two segments continuous
  # so loses one edge
  ans <- ans - as.integer(diff(x)==4) 
  
  # sort, concatenate, and return
  paste0(sort(ans), collapse='')
}


test <- function(a, b)
{
  ans <- solve(a)
  
  cat(sprintf('input=%3s expected=%9s result=%9s', a, b, ans))
  if (ans != b) cat('\t!NG!')
  cat('\n')
}

main <- function()
{
  test( "165", "3445" )    
  test( "80", "48" )    
  test( "255", "33333333" )    
  test( "68", "55" )    
  test( "200", "355" )    
  test( "82", "455" )    
  test( "164", "455" )    
  test( "73", "455" )    
  test( "146", "455" )    
  test( "37", "455" )    
  test( "74", "455" )    
  test( "148", "455" )    
  test( "41", "455" )    
  test( "38", "355" )    
  test( "76", "355" )    
  test( "152", "355" )    
  test( "49", "355" )    
  test( "98", "355" )    
  test( "196", "355" )    
  test( "137", "355" )    
  test( "19", "355" )    
  test( "20", "48" )    
  test( "9", "57" )    
  test( "209", "3345" )    
  test( "121", "33345" )    
  test( "239", "3333334" )    
  test( "26", "347" )    
  test( "111", "333344" )    
  test( "95", "333344" )    
  test( "85", "4444" )    
  test( "24", "39" )    
  test( "97", "347" )    
  test( "234", "33444" )    
  test( "59", "33345" )    
  test( "187", "333344" )    
  test( "34", "55" )    
  test( "249", "333335" )    
  test( "43", "3445" )    
  test( "143", "33335" )    
  test( "28", "338" )    
  test( "79", "33345" )    
  test( "173", "33444" )    
  test( "55", "33345" )    
  test( "77", "3445" )    
  test( "35", "355" )    
  test( "153", "3355" )    
  test( "30", "3337" )    
  test( "228", "3355" )    
  test( "177", "3345" )    
  test( "162", "445" )    
  test( "184", "3345" )
}

main()
```
【読書ノート】《C# in Depth》～5 デリゲート

デリゲート（delegate: 代表、委譲、委託）とは、メソッドを参照するための型です。 C言語やC++言語の勉強をしたことがある人には、 「デリゲートとは関数ポインターや関数オブジェクトをオブジェクト指向に適するように拡張したもの」 と言った方が分かりやすいかもしれません。

宣言

```csharp
delegate void StringProcessor(string input);
```



C#3のデリゲートの書き方がシンプルです

```csharp
Func<int, int, string> func = (x,y) => (x*y).ToString();
Console.WriteLine(func(5,20));
```
Func<int, int, string>はジェネリックデリゲート型です。


定義済みデリゲートには大きく2種類あります。
”Action”と”Func”です。
”Action”が戻り値なしのデリゲートで
”Func”が戻り値を持つデリゲートとなります。
引数はそれぞれ4つまで対応しているみたいです。

```csharp
public void SampleMethod()
        {
            //引数void、戻り値void
            Action act1 = () =>
                {
                    Console.WriteLine("");
                };

            //引数string、戻り値void
            Action<string> act2 = (string value) =>
                {
                    Console.WriteLine(value);
                };

            //引数int,int、戻り値string
            Func<int, int, string> funcAdd = (x, y) =>
                {
                    return (x + y).ToString();
                };

            //呼び出し
            act1();
            act2("");
            string answer = funcAdd(1, 2);
        }
```
メソッドの中にメソッドを定義することができるじゃん！！
Lua言語みたいな感じですね！
[初心者必見] tryとtry!の違い + ぼっちメソッド

今回はよく使用する try と try! の違いについて、あまり違いを把握していないで、それぞれのメソッドを使っている人もいるのかなと思い、書きました。

まずは、tryメソッドについて書きます。
# try

tryメソッドは、 ActiveSupport から提供されているメソッドです。
tryで渡されたメソッドが存在しているのであればそれを呼び出し、なければ nil を返すメソッドです。
まずは実際にtryメソッドを使わないコードを通して見てみましょう。

```ruby
@event = Event.create(content: 'test')

# 上の content の値を取得したいとします。
@event.content
=> "test"

# しかし、これではもし@event が nil の際に undefined method error が生じてしまいます。
@event = nil
@event.content
NoMethodError: undefined method `content' for nil:NilClass

# 上記のエラー対策には、以下のコードで対応できます。
@event && @event.content
```

上記を簡単に書けるようにしてくれるのがtryメソッドです。

```ruby
@event.try(:content)
=> "test"
```

このように書くとtryメソッドを説明すると、tryメソッド良いな!!早速使ってみよう！！となるのですが、実は弱点もあります。
それはtryメソッドで nil を返した際に、対象のオブジェクトが nil なのか それとも使用したメソッドが nil なのか把握できないことです。
実際のコードで確認してみましょう。

```ruby
@event = nil
@event.try(:content)
=> nil

# メソッド名が contentのはずが contnt になっている。
@event.try(:contnt)
=> nil
```

上記のように nil が返りエラーが生じた際に、考えられる原因が複数存在します。
複雑なコードになってくると、上記のようなエラーを特定するのに時間がかかってしまいます。
これを解消できるメソッドとして、try!メソッドが挙げられます。

# try!

```ruby
@event = nil
@event.try!(:content)
=> nil

# メソッド名が contentのはずが contnt になっている。
@event.try(:contnt)
NoMethodError: undefined method `contnt'
```

このように書くことによって、メソッド名が異なっている際は、 NoMethodError で落とすことが出来ます。
メソッド名が異なる場合は、エラーとして落とした方が良いと思うので、是非 try!メソッドを使ってみましょう。

と言いたいところなんですが、、、実は、try! よりもおすすめなメソッドがあります。
それは通称 ぼっちメソッドと言われるものです。


![スクリーンショット 2017-04-20 14.28.12.png](https://qiita-image-store.s3.amazonaws.com/0/117317/8c413445-6242-c7a0-5200-1311120e5385.png)


# ぼっちメソッド

ぼっちメソッドとは、一体何でしょうか。実は、rubyでtry!と同じ動きをするメソッドです。
ruby2.3から使えるようになりました。
これは、rubyで提供されているものなのでrailsではなくても使用することができます。かつ、rubyで提供されているので、パフォーマンスもtry!よりは良いです。

なぜぼっちメソッドというのかといいますと `&.`と記述する & が上の写真のぼっち(の子)と似ているからですw
実際のコードで見てみましょう。

```ruby
@event&.content
=> "test"

@event = nil
@event&.content
=> nil

# メソッド名が contentのはずが contnt になっている。
@event&.contnt
NoMethodError: undefined method `contnt'
```

# まとめ

|  | try | try! |    ぼっちメソッド    |
|:------------:|:---:|:--------------------------------:|:------------:|
|対象のオブジェクトが nil|nil|nil|nil|
|引数のメソッドが存在しない|nil|undefined method error|undefined method error|

上記のような結論になります。是非参考にしてみてください:smile:
技術書読書会 #5 Infrastructure as Code

# 技術書読書会 #5 Infrastructure as Code

## 読書会とは
「あなたが知識を増やさないということは、実は知識を減らしていることになる。」ユダヤ人の格言です。

技術書を最後まで読み切る事は意外と大変です。一人なら無理だけどみんなの力があればできるかも・・・。
そんなことを誰が思たのか、ともあれそんな気持ちに賛同したメンバーが１冊の技術書を読み込むという結構ハードルの高いことにチャレンジをしていきます。

## 技術書読書会の進め方
eXtreme Readingの方式で進めていきます。

### 実施方法
以下の流れで読書をしていきます。

```
1. 0分～5分間で、今回読み進める章/節を発表する
2. 15分～30分間で、読書
3. 5分～10分間で、ディスカッション
4. 1～3を時間分繰り返す
5. まとめ
```

今回の読書会は、所要時間30分で以下の配分で行いました。

```
1. 5分間で、今回読み進める章/節を発表する
2. 15分間、読書
3. 5分間、ディスカッション
4. 10分間、まとめ
```

### 利点
eXtreme Readingの利点です。

- 事前の準備がいらない。
- ディカッションをすることにより理解を深める事ができる。参加者全体の理解度の底上げが期待できる。
- 時間を区切って進行するので、読書の進捗が一定となり本の読み終わり時期を予測することができる
- みんなでやればなんとかなる


## 今回読む書籍
[Infrastructure as Code ―クラウドにおけるサーバ管理の原則とプラクティス](
https://www.amazon.co.jp/Infrastructure-Code-%E3%82%AF%E3%83%A9%E3%82%A6%E3%83%89%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B%E3%82%B5%E3%83%BC%E3%83%90%E7%AE%A1%E7%90%86%E3%81%AE%E5%8E%9F%E5%89%87%E3%81%A8%E3%83%97%E3%83%A9%E3%82%AF%E3%83%86%E3%82%A3%E3%82%B9-Kief-Morris/dp/4873117968/ref=sr_1_1?ie=UTF8&qid=1491455639&sr=8-1&keywords=Infrastructure+as+Code)

## 参加人数
6人

## 所要時間
30分

## 進捗
3 - 3.1.4.1

## ディスカッション

### 3.1.1 要件：スクリプトで操作できるインターフェース
岡　複数のサービスを統合するときに中がわかっていないといけないのかなと

### 3.1.2 要件：コマンドラインツールの無人モード
飯　他のツールやスクリプトから入力を取り出せなければならない。とはどういうことなのか？
岡　言語依存しないとかかと
岡　認証部分は大事かと思った
岡　最後のコマンドラインツールを組み合わせて利用するというのは不変なのかなと

### 3.1.3 要件：無人実行のサポート
岡　ここ結構重要なのかなと
峯　パラメータ化につてい、本番用と開発用で定義ファイルを分けている。本番環境と同じ構成で開発していくとお金がかかるから
峯　定義ファイルをどのように分けるかが運用のポイントになるのかと

### 3.1.4 要件：設定ファイルの外在化
岡　これって、設定ファイルを外にだすだけなんじゃないの
岡　3.1.4.1 標準VCSツールについては、そろそろ準備していきたいと思っていた。ansibleの構成定義ファイルにしてもgit管理でやっていきたい。
岡　前の章でもあったけど、構成定義ファイル自体がドキュメントになっていく。

## 気づき

## まとめ
集音マイクもうまくいかなかった。さてどうするか？
Javascriptで処理のスタック

最近、react,fluxの案件にアサインされました。
こんなコードを見つけました。

```javascript
    // セッションストレージからデータ取得
    const storageData = セッションストレージから取得する関数
    if (storageData !== undefined) {
      Promise.resolve().then(() => {
        // 取得したデータをStoreに保管
        AppDispatcher.dispatch({
          type: ActionTypes.SET_HOGE,
          data: storageData,
        });
      });
      return;
    }
```

`Promise.resolve()`いる？
私はそう思いました。
結果、必要でした。

componentでは以下のような処理が行われていました。

```javascript
  componentWillMount() {
    this.setState({
      data: [],
    });
  }

 componentWillReceiveProps(nextProps) {
    const { obj } = nextProps;

    const list = obj.map((data, index) => (
      {
       　　データの整形処理
      }
    ));
    this.setState({
      data: list,
    });
  }

  return (
    this.state.dataを表示
  );

```

そうなんです、初期状態はstateが空なんです。
propsが更新されたら、stateを更新して、そこでやっとデータが表示されるわけです。
mountされる時は componentWillReceiveProps が呼ばれないので、stateはからのまま。
なので、`Promise.resolve()`で一旦データを渡す処理をスタックして、componentをmountさせてからデータを渡す処理を実行させて、componentWillReceivePropsを実行させるわけです。

わかりにくくて申し訳ないです。
自分用のメモなのでそこらへんは勘弁してくだせえ。

私が思ったこと：
スタックが目的なら`setTimeout({},0);`でよくない？
そっちの方がわかりやすくない？
Promiseの方がナウいのかな？


初めてのReactむずい
eshell でも Git リポジトリのトップレベルディレクトリに cd する

zsh で Git リポジトリのトップレベル ディレクトリに cd するプラグイン  http://qiita.com/mollifier/items/cf0263dccc112ab8b87d
が、ものすごい便利なので eshell でも動くのをこしらました。

```~/.emacs.d/init.el
(defun eshell/i ()
  ".gitのあるディレクトリまで上がる"
  (insert (concat "cd " (locate-dominating-file default-directory ".git")))
  (eshell-send-input))
```

これで `i` だけで .git のあるところまで cd できます。
`eshell/i` の i を変更するとコマンド名が変更できます。
enum の整数値を取得する

# 方法

## Rails 4

[ActiveRecord::AttributeMethods#[]](http://api.rubyonrails.org/classes/ActiveRecord/AttributeMethods.html#method-i-5B-5D) あるいは
[ActiveRecord::AttributeMethods::Read#read_attribute](http://api.rubyonrails.org/classes/ActiveRecord/AttributeMethods/Read.html#method-i-read_attribute) を使います。

```rb
# Rails 4.2.8
class Conversation < ActiveRecord::Base
  enum status: [:active, :archived]
end

conversation.status #=> "archived"

conversation[:status] #=> 1
conversation.read_attribute(:status) #=> 1

conversation.read_attribute_before_type_cast(:status) #=> "1"
conversation.status_before_type_cast #=> "archived"
```

## Rails 5

前述した Rails 4 の方法では整数値が取得できなくなりました。代わりに [ActiveRecord::AttributeMethods::BeforeTypeCast#read_attribute_before_type_cast](http://api.rubyonrails.org/classes/ActiveRecord/AttributeMethods/BeforeTypeCast.html#method-i-read_attribute_before_type_cast) あるいは
`%{カラム名}_before_type_cast` という名前のメソッドを使います。

```rb
# Rails 5.0.2
class Conversation < ActiveRecord::Base
  enum status: [:active, :archived]
end

conversation.status #=> "archived"

conversation[:status] #=> "archived" 
conversation.read_attribute(:status) #=> "archived"

conversation.read_attribute_before_type_cast(:status) #=> 1
conversation.status_before_type_cast #=> 1
```

Rails 4 とかなり振る舞いが変わっているので、注意が必要ですね。

# 参考

* [ActiveRecord::AttributeMethods](http://api.rubyonrails.org/classes/ActiveRecord/AttributeMethods.html)
* [ActiveRecord::AttributeMethods::BeforeTypeCast](http://api.rubyonrails.org/classes/ActiveRecord/AttributeMethods/BeforeTypeCast.html)
* [ActiveRecord::Enum](http://api.rubyonrails.org/classes/ActiveRecord/Enum.html)
the multiplayer mode of the game (メモ)

AWSから個人のAWSアカウント向けにきていたGameLiftに関するアンケートの質問の一つに
「あなたの開発しているゲームのマルチプレイヤーモードを一番よく表すのはどれ？」という質問があって
「PvPはあるけどマルチプレイヤーじゃ無い」「そもそも言ってることが全然わからない」ぐぬぬ
となったので悔しいからメモ


Which of these best describes the multiplayer mode of the game you primarily work on? (check all that apply)

- Asynchronous - A game that connects players, but doesn't require simultaneous play. (e.g. Words with Friends)
- Turned Based - A game where players take turns during gameplay. (e.g. Sid Meier's Civilization)
- Persistent - A game that continues to exist and develop even if the player is not playing. (e.g. World of Warcraft)
- Session Based - A game that has matches that begin and end. (e.g. Counter-Strike: Global Offensive)
- My game does not have a multiplayer mode
- Other:


アンケートで「導入に好意的ですか？」に「はい」でも「いいえ」でもなくNewtralと答えたら理由を聞かれたので、[GDCで説明を聞いて不安に思った点](http://qiita.com/sitopp/items/4f04404bcfd6b15402e6#amazon-gamelift)があると送っておいた。後で猛然と反発が送られてくることを希望。
micro:bit シリアル・データ通信設定

#目的
micro:bitに限らず、センサー等からの入力データを元にプログラムを組むとなれば、その値を監視したり、おおよその値を知りたいものです。micro:bitおよび日本語版互換機のchibi:bitで、シリアル通信をする方法の解説（備忘録）です。

#環境
Windows 10です。

#手順
[micro:bit ドキュメンテーション](https://www.microbit.co.uk/td/serial-library) の手順に従います。
![image](https://qiita-image-store.s3.amazonaws.com/0/103139/57e4f8e6-278a-2f24-770f-c4cd98180611.png)

#ステップ１ Windows用シリアル・ポート・ドライバーをインストールする
https://developer.mbed.org/handbook/Windows-serial-configuration
![image](https://qiita-image-store.s3.amazonaws.com/0/103139/ae0c21cd-6ceb-a450-e034-af2868bcf3a8.png)


#ステップ２ Windowsのデバイス・マネージャーでCOMポート番号を確認
![image](https://qiita-image-store.s3.amazonaws.com/0/103139/84a391dc-0421-1fcf-a37b-f25ecba2be3f.png)

#ステップ３ Puttyでセッション開始
![image](https://qiita-image-store.s3.amazonaws.com/0/103139/2ff4e50d-6285-3cfd-92bb-0478c13d0ac6.png)

#ステップ４ micro:bit のプログラムからシリアル通信を行う
![image](https://qiita-image-store.s3.amazonaws.com/0/103139/42d961b8-31a6-6585-768e-8a7282b783ae.png)
この場合、加速度センサーのX軸（micro:bitを両手で持った時、右と左への傾き）の値を0.1秒置きに書き込む。下はブロック・コードをJavaScriptとして表示した場合。

```js
let item = 0
basic.forever(() => {
    item = input.acceleration(Dimension.X)
    basic.pause(100)
    serial.writeValue("x", item)
})
```

完了しました。
miroro:bitを水平に保つと、値は０。右に傾けると0から1024（垂直になった状態での最大値）の値をとります。左に傾けると、同様に0からー1024の間の値を取ります。左に傾けるとマイナスの値です。
![image](https://qiita-image-store.s3.amazonaws.com/0/103139/c775d423-a3e5-6601-30fc-6531654791c4.png)

センサーとの組み合わせが楽になりました♪
gulp-ejsの3.0.x系では<%= filename %>を使えなくなった気がする。


2系と3系の違いのメモ

```2.3.0
.pipe(ejs({},{ext: '.html'}))
```

```3.0.x
.pipe(ejs({},{},{ext: '.html'}))
```

gulp-dataを使う

http://qiita.com/nibushibu/items/d1d9325a61520dc8c422
Google Cloud Container Builderでassets:precompile結果をbucketにupload

google cloud storageに静的なassetファイルをuploadしておくことによって簡単にCDN化ができるためbuild processに組み込んでしまう。

ポイントは`asset-precompile`の部分で
buildしたcontainerを立ち上げるときに `-v`で build中のworkspaceをmountしてやること

1. docker build
2. assets:precompileを実行してbuild実行中の /workspaceに書き込む
3. gsutlでcp

~~~
steps:
- id: 'build-master'
  name: 'gcr.io/cloud-builders/docker'
  args: ['build', '-t', 'gcr.io/$PROJECT_ID/app:$REVISION_ID', '.']
- id: 'asset-precompile'
  name: 'gcr.io/cloud-builders/docker'
  args: ['run', '-v', '/workspace/assets-output:/app/public/assets', 'gcr.io/$PROJECT_ID/app:$REVISION_ID', 'bundle', 'exec', 'rake', 'assets:precompile']
- id: 'upload-asset'
  name: 'gcr.io/cloud-builders/gsutil'
  args: ['cp', '-r', '/workspace/assets-output/*', 'gs://${YOUR_BUCKET}/assets']
~~~


### 参考

http://qiita.com/yanana/items/5492d880827aa880064c
Google Cloud Container BuilderからGKE(kubectl)を操作したい

 Google Cloud Container BuilderからGKE(kubectl)を操作したい

この辺の話です
https://github.com/GoogleCloudPlatform/cloud-builders/issues/22
https://github.com/GoogleCloudPlatform/cloud-builders/pull/2
https://gist.github.com/Philmod/290fdabf386646dbbc0b57b00952b944

GKE上で動いてるcontainerをGoogle Cloud Container Builder(以下GCCB)でbuildしたimageで自動更新したいなというのが出発点。

# まずは手順

1. gcloud commandでclusterに接続するための秘密鍵と証明書をexportしておく
2. 同一GCP projectのcloud storageに配置しておく
3. cloudbuild.yamlを書く

## 1. 秘密鍵と証明書をexport

[これをみてよろしくやる](http://qiita.com/Sho2010@github/items/c5e2411a7ee109a1830c)

## 2. 同一GCP projectのcloud storageに配置しておく

1. で作成したファイルをstorageに配置する

これは特別困ることもないはず普通にbucket作ってuploadするだけ
※ permissionにだけは注意


## 3. cloudbuild.yaml


ポイントは

* 更新するイメージをimagesで自動pushされる前に明示的にpush
* gcloud container起動後にkubectlをinstall
* cluster接続用のファイルをcloud storageからgsutilでcopy

~~~
steps:
- id: 'build-master'
  name: 'gcr.io/cloud-builders/docker'
  args: ['build', '-t', 'gcr.io/$PROJECT_ID/app:$REVISION_ID', '.']
- id: 'push'
  name: 'gcr.io/cloud-builders/docker'
  args: ['push', 'gcr.io/$PROJECT_ID/app:$REVISION_ID']
- id: 'upgrade-server'
  name: 'gcr.io/cloud-builders/gcloud'
  entrypoint: 'bash'
  args:
  - '-c'
  - |
    gcloud components install kubectl
    gsutil cp gs://${YOUR_BUCKET}/ca.pem .
    gsutil cp gs://${YOUR_BUCKET}/client.pem .
    gsutil cp gs://${YOUR_BUCKET}/key.rsa .
    kubectl set image deployment/app app=gcr.io/$PROJECT_ID/app:$REVISION_ID --server https://xxx.xxx.xxx.xxx --client-certificate=client.pem --client-key=key.rsa --certificate-authority=ca.pem
~~~

kubectl install済みのcontainerをpushしておいたほうが手っ取り早いけどサンプルとして書いてます。

- - -

# このやり方の問題点とか疑問

~~GCCBではpush後のstepが定義できないため、明示的にgcr.ioにpushしてしまっている。(imagesで成果物を指定してる前に 二重pushが発生する)~~

※コメントを頂いて修正
`images` を書かなければ二重pushは防げる

### そもそもとしてGCCBをCIのような使い方していいものか？

恐らくGCCBではcontainerをbuildすること以外を目的をしておらず
build, push後に何かしたければせっかくpub/subにtopic作ってあるんだから、そこの通知を使って他でやれよってことなんだと思います。(どうなんだろ？)

その考え方自体は妥当性があると思っているので、
pub/sub triggerでCloudFunctionsを起動してなんとか出来ないと模索していたのですが、CloudFunctions上からGKE(kubernetes)のclusterを操作するのができなくはないのですが
 [すごくめんどくさいんです](https://gist.github.com/Philmod/290fdabf386646dbbc0b57b00952b944)


issueやPRを追っている限りGCCBでkubectlを使えるようにする予定はあるみたいなのでそこら辺に期待したいです。

今回作業して欲しいなって思った機能としては

* CloudFunctionsから楽にGKEを操作したい
* GCCB imagesのpush後step
  * そもそもGCCBをCIとして使おうという考え方が良くない？
Vagrant上のVMへのmecab-ipadic-neologdのインストールが失敗する時

MeCab用のすごい辞書として有名な [mecab-ipadic-neologd](https://github.com/neologd/mecab-ipadic-neologd)を[Vagrant](https://www.vagrantup.com/)上のUbuntuにインストールしようとしたところ、次のようなエラーが発生しました。

```
(前略)
terminate called after throwing an instance of 'std::bad_alloc'
  what():  std::bad_alloc
reading ./mecab-user-dict-seed.20170417.csv ... /home/ubuntu/mecab-ipadic-neologd/bin/../libexec/make-mecab-ipadic-neologd.sh: line 492: 2130 Aborted                 (core dumped) ${MECAB_LIBEXEC_DIR}/mecab-dict-index -f UTF8 -t UTF8
```

`std::bad_alloc`とあるので、どうやらメモリ不足のようですね。
`Vagrantfile`を編集して、VMに割当るメモリの量を増やしてみましょう。
私は次のようにして4GBを割当ることにしました。(当初1GBにしてみましたが足りませんでした)

```
Vagrant.configure("2") do |config|
  config.vm.box = "ubuntu/xenial64"
  config.vm.provider :virtualbox do |vb|
    vb.customize ["modifyvm", :id, "--memory", 4096]
  end
end
```

`Vagrantfile`を編集したら`vagrant reload`でVMを再起動して`vagrant ssh`でログインしたのちに`free -mh`と打ってメモリの空き容量を確認してみます。

```
              total        used        free      shared  buff/cache   available
Mem:           3.9G         47M        1.3G        5.8M        2.5G        3.6G
Swap:            0B          0B          0B
```

こんな感じで十分な空きが確保できました。
再び`$ ./bin/install-mecab-ipadic-neologd -n`と打って、インストールを始めてみます。
すると今度は、

```
(前略)
[install-mecab-ipadic-NEologd] : Usage of mecab-ipadic-NEologd is here.
Usage:
    $ mecab -d /usr/lib/mecab/dic/mecab-ipadic-neologd ...

[install-mecab-ipadic-NEologd] : Finish..
[install-mecab-ipadic-NEologd] : Finish..
```

うまくいきました。
flyway commnad line MySQL


flywayをcommand lineで使う時の方法

公式見ればいいけど一応メモ
[First steps: command line](https://flywaydb.org/getstarted/firststeps/commandline "First steps: command line")

## 手順

MySQLとjavaのインストールは済んでいるのが前提

1. `wget https://repo1.maven.org/maven2/org/flywaydb/flyway-commandline/4.1.2/flyway-commandline-4.1.2-windows-x64.zip`
2. `unzip flyway-commandline-4.1.2-windows-x64.zip`
3. `cd flyway-4.1.2/`
4. `vim conf/flyway.conf`
5. `vim sql/V1__Create_person_table.sql `
6. `./flyway migrate`


### 4の中身

接続設定を追記

```
flyway.url=jdbc:mysql://localhost/your_db_name
flyway.user=your_user_name
flyway.password=your_password
```

### 5の中身

実際にテーブルを作成していくときのSQL文

```
create table PERSON (
    ID int not null,
    NAME varchar(100) not null
);
```



6まで実行することでMySQLにPERSONテーブルが作成されます
新しい変更やテーブル追加をしたい場合はもう一度`./flyway migrate`を実行
tftpでバックアップ

サーバが起動中だけファイルをtftpで引き渡すスクリプト。

```
#!/bin/sh

HOST="192.168.1.1"
DIR="/tmp"
FILE="morimori.log"

if [ -f ${DIR}/${FILE} ]; then

ping -c 1 ${HOST} > /dev/null

if [ $? == 0 ]; then
cd ${DIR}
echo "bin
put ${FILE}
quit" | tftp ${HOST} >/dev/null 2>&1
fi

fi
```

サーバ側でputできるように設定しておく必要があります。

このスクリプトをnobodyのcrontabに入れたら動きませんでした。

```
ping: ssend socket: Operation not permitted
```

他のcrontabに入れました。
Safariでマウスオーバーした時、アニメーション中テキストがにじむ時の解決方法


ボタンなどをマウスオーバーした時に透過させるようなアニメーションを実装すると、
Safariの場合ライブテキストがアニメーション中ぼけてしまうため、
以下を指定します。

```
html {
  -webkit-font-smoothing: subpixel-antialiased;
}
```

`-webkit-font-smoothing: antialiased;` を指定するとフォント全体が細くなってしまいます。
Tumblrから画像をタグ検索するhubot scriptを作る


# はじめに
[2017年から始めるjavascript勉強ノート](http://qiita.com/ne-peer/items/6acd5493eeadae9ab759)で多少の理解ができたので、
かんたんなhubot scriptを作ってみようと思います。

hubotにもともとあるGoogleから画像検索する hubot-google-images は非常に優秀なんですが、
たまにはTumblrで共有されるような（おもにイラスト）コンテンツをslackで取得したいなぁ
となったので作ることにしました。

ちなみに今回はTumblrの[タグ検索API](https://www.tumblr.com/docs/en/api/v2#tagged-method)を使わせていただくことにしました。
Tumblr様は色々APIを用意してくれてるので、他にもっとよいやつがあるかも。

完成品は [Githubのここにあります。](https://github.com/ne-peer/dia/blob/master/scripts/tumblr-tag.js)

# つくる
## 1. Tumblr に登録し、APIキーを取得する
TumblrのAPIの利用はかなり敷居が低く、すぐに使えるようになります。
[ここを参考](https://syncer.jp/tumblr-api-matome)に会員登録とアプリケーション登録を済ませます。 **OAuth認証の手順は不要です。**

コンシューマキーだけメモっておきましょう。

## 2. APIを叩いてみる
では早速タグ検索のAPIを叩いてみましょう。
`https://api.tumblr.com/v2/tagged?api_key={コンシューマキー}&tag=cat`

この例では `tag=cat` としているので "cat" のタグが付いてる投稿がjson形式で返ってきます。

他のオプションで `limit` で取得件数を制限したり（デフォルト=20, 最大20）
`before` で投稿日時を指定できます。

## 3. jsonを解析してbotに発言させる
レスポンスから画像のURLを抽出します。

当初はjsonの `post_url` を返すように作っていたのですが
Slackに表示される画像サムネイルの表示サイズが小さかったり、
投稿の閲覧に制限があると表示できなかったりしていたので
`photos.original_size` を返却するようにしました。

今回は画像を表示させるスクリプトなので前述のようにしましたが、
投稿を返させたい場合は `post_url` やその他もろもろの情報を抜き出しても良いかもしれません。

返却レスポンスは [公式のここ](https://www.tumblr.com/docs/en/api/v2#common-fields) にあります。

## 4. うごかしてみる
![20170420_tumblr-search.png](https://qiita-image-store.s3.amazonaws.com/0/167943/e4ba6cdd-06b6-69bd-163a-bbeeea7936ce.png)

いいかんじ！

# まとめ
ほとんどロジックを考えてコーディングすることはありませんでしたが、
jsonや配列の扱いの扱いの基礎練習ができて程良い練習になりました。

まだまだおもしろいAPIを探して放浪します。

# 参考
TumblrAPIについて: [Tumblr APIでwebサービスを作りたい全ての人に向けて書きました](https://syncer.jp/tumblr-api-matome)
Windows10 IoT Coreで日本語音声認識  その1（準備編）

Windows10 IoT Coreの最新版（Build 15063）で日本語用音声認識エンジンが正式に利用できるようになりました。
Cortanaも利用できるようになっているのですが、まだ日本語には対応していないようです。

今回の記事ではRPi3に音声認識エンジン（音声合成エンジンも含んでいたりします）のインストールまで説明します。

#ダウンロード&インストール
1.Microsoft Download Centerから「Windows10 IoT Core packages」を[ダウンロード](https://www.microsoft.com/en-us/download/details.aspx?id=55031)します。
2.ダウンロードしたファイルをマウントします。（isoファイルなのでダブルクリックでマウントできます）
![1.PNG](https://qiita-image-store.s3.amazonaws.com/0/62606/7376df00-0ca7-4923-3e3a-711a3a8768bf.png)

3.マウントしたディスク内の3つのインストーラーの内「Windows_10_IoT_Core_ARM_Packages.msi」をダブルクリックします。
![2.PNG](https://qiita-image-store.s3.amazonaws.com/0/62606/0da82773-b71e-90c4-6d28-a526ace7feea.png)

4.インストールします。
![3.PNG](https://qiita-image-store.s3.amazonaws.com/0/62606/339868af-424a-c6ef-649c-d8ce84e993ed.png)


#コピー&アップデート
1.「C:\Program Files (x86)\Windows Kits\10\MSPackages\retail\arm\fre」フォルダ内にある「Microsoft-Windows-OneCore-Microsoft-SpeechData-ja-JP-Package.cab」ファイルをRPi3にコピーします。コピー先は「C:\Users\Public」フォルダがいいでしょう。

2.PowerShellかターミナルソフトでRPi3に接続します。

3.先ほど言語パッケージファイルをコピーしたフォルダに移動します。

4.続いてコマンドプロンプトで以下のコマンドを実行します。
　　・applyupdate -stage Microsoft-Windows-OneCore-Microsoft-SpeechData-ja-JP-Package.cab
　　・applyupdate -commit

5.RPi3を再起動します。

以上で音声認識エンジンのインストールができました。

ちなみに現在インストールできる言語パッケージは13種類（en-USは元々インストール済み）あります。
・ドイツ語(de-DE)
・カナダ英語(en-CA)
・イギリス英語(en-GB)
・アメリカ英語(en-US)
・スペイン語(es-ES)
・メキシコスペイン語(es-MX)
・カナダフランス語(fr-CA)
・フランス語(fr-FR)
・イタリア語(it-IT)
・日本語(ja-JP)
・中国語(zh-CN)
・香港中国語(zh-HK)
・台湾中国語(zn-TW)

その他の言語パッケージも同様の方法でインストールできます。
CircleCI(1.0)でPython2,3を共存させる

# 20171116追記
下記の記述はCircleCI1.0系についての内容です
2.0については全く別の仕組みになっているため当てはまりません

# circle.yml
machineセクションでpyenvを両バージョンで書けばOK
対応しているバージョンは[こちら](https://circleci.com/docs/1.0/build-image-trusty/)

```yaml
machine:
  post:
    - pyenv global 2.7.11 3.6.1
```


# 使用方法
python, pipコマンドの後ろに 3 を付けると3系での実行になる。

```shell-session
ubuntu@box832:~$ python -V
Python 2.7.11
ubuntu@box832:~$ python3 -V
Python 3.6.1
ubuntu@box832:~$ pip -V
pip 7.1.2 from /opt/circleci/python/2.7.11/lib/python2.7/site-packages (python 2.7)
ubuntu@box832:~$ pip3 -V
pip 9.0.1 from /opt/circleci/python/3.6.1/lib/python3.6/site-packages (python 3.6)
```

# ダメなパターン
下記のような指定をすると3系のみの仮想環境で実行されてしまうので2系が必要なコマンド（GAEのappcfg.pyとか）が失敗してしまう。

```yaml
machine:
  python:
    version: 3.6.1
```
しきい値でデータを分割

# 昇順のデータに対し、複数のしきい値で、しきい値数＋1個に分割する

```py3:python3
import numpy as np, pandas as pd
def partition(attr, ths, tgt=None):
    if tgt is None:
        tgt = attr
    elif isinstance(attr, pd.DataFrame):
        tgt = attr[tgt]
    po = 0
    for th in ths:
        pr = po
        while tgt[po] < th:
            po += 1
        yield tgt[pr:po]
    yield tgt[po:]
# def partition(arr, ths, tgt=None):
#     if tgt is None:
#         tgt = arr
#     elif isinstance(arr, pd.DataFrame):
#         tgt = arr[tgt]
#     r = []
#     pr = 0
#     for th in ths:
#         po = ilen(takewhile(lambda i: i < th, tgt[pr:]))+pr
#         r.append(arr[pr:po])
#         pr = po
#     r.append(arr[po:])
#     return r

from IPython.display import display
for i in partition(range(1,11), [3,6]):
    display(i)
for i in partition(np.arange(1,11), [3,6]):
    display(i)
for i in partition(pd.Series(np.arange(1,11)), [3,6]):
    display(i)
for i in partition(pd.DataFrame(np.arange(1,11)), [3,6], 0):
    display(i)
>>>
range(1, 3)
range(3, 6)
range(6, 11)

array([1, 2])
array([3, 4, 5])
array([ 6,  7,  8,  9, 10])

0    1
1    2
dtype: int32
2    3
3    4
4    5
dtype: int32
5     6
6     7
7     8
8     9
9    10
dtype: int32
```

<div>
<table>
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>0</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>0</th>
      <td>1</td>
    </tr>
    <tr>
      <th>1</th>
      <td>2</td>
    </tr>
  </tbody>
</table>
</div>
<div>
<table>
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>0</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>2</th>
      <td>3</td>
    </tr>
    <tr>
      <th>3</th>
      <td>4</td>
    </tr>
    <tr>
      <th>4</th>
      <td>5</td>
    </tr>
  </tbody>
</table>
</div>
<div>
<table>
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>0</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>5</th>
      <td>6</td>
    </tr>
    <tr>
      <th>6</th>
      <td>7</td>
    </tr>
    <tr>
      <th>7</th>
      <td>8</td>
    </tr>
    <tr>
      <th>8</th>
      <td>9</td>
    </tr>
    <tr>
      <th>9</th>
      <td>10</td>
    </tr>
  </tbody>
</table>
</div>

コメント部分は、「[NumPyでしきい値以上の位置を求める - Qiita](http://qiita.com/SaitoTsutomu/items/4254f4ba417b91bacd22)」を参考に作ったものだが、数が少なければ、単純にwhileの方が早かったので、差し替えた。

以上
モナコインをcpuminerで掘ってみる


ビットコインを始めたつもりが気付いたら、モナコインにたどり着いていた。。( ﾟдﾟ)ﾊｯ!

# 前提
- 適当なモナコインウォレットを作っておく
- centos
- cpu使います
- pool使います

# 掘る準備
### 失敗編
はじめはmacのcpuで掘ってみようと思って試してみてたが、ビルドがうまくいかず辞めたので、そちらもメモっておく。

こちらのcpuminerを利用した。（cpuminerのfork?などたくさんあって、それぞれ満たしてる形式違って名前同じで少し困った）
https://github.com/pooler/cpuminer

READMEに

```
Dependencies:
	libcurl			http://curl.haxx.se/libcurl/
	jansson			http://www.digip.org/jansson/
		(jansson is included in-tree)
```

と書かれているので、入れる。brewで入る。あと、gccとか。

入れて、ビルド。

```bash
$ ./build.sh
```

が、失敗。
READMEをよく見ると、

```
Basic *nix build instructions:
	./autogen.sh	# only needed if building from git repo
	./nomacro.pl	# only needed if building on Mac OS X or with Clang
	./configure CFLAGS="-O3" # Make sure -O3 is an O and not a zero!
	make
```

と書かれていたので、こっちを試す。が、こちらも失敗。
エラーメッセージに、

```
checking whether the C compiler works... no
```

など書かれていて、この辺り調べるに、macのデフォがclangを使うようになっていて、brewで入れたgccを使うようにpath変えたりすれば良さそうだけど、突然思い立ってcentosで試すことに。(macでcpuminer使ってる人でうまくできてる人いたらコメントで教えてください:pray:)

参考（この辺やればいけそう）：
- [OSX の gcc を変更した話](http://qiita.com/Hiroki11x/items/261612c142da176bbba5)
- [OS X El Capitanにgccを入れてシンボリックリンクを作成【なれない日記20160706】](http://www.ketsuago.com/entry/2016/07/07/003437)

### 成功編
こちらのcpuminerを使うことにした。
https://github.com/tpruvot/cpuminer-multi
Lyra2REv2のアルゴリズムに対応してるものを選べばどれでも良さそう、たぶん。

```
Dependencies

libcurl http://curl.haxx.se/libcurl/
jansson http://www.digip.org/jansson/ (jansson source is included in-tree)
openssl libcrypto https://www.openssl.org/
pthreads
zlib (for curl/ssl)
```

とあるので、それらを入れていく。
あと、pthreadsとあるので、php周りのものも入れてみた。
一通り入れたら、`./build.sh`
これでうまくビルドできてたら、`cpuminer`ができてるはず。
poolはどこでもいいけど、vippoolでやった場合は、

```
./cpuminer -a lyra2rev2 -o stratum+tcp://vippool.net:8888 -u Weblogin.WorkerName -p WorkerPassword
```

で掘り始められる！ :tada: 

# 参考
以下、参考にさせてもらいました。
- [Monacoin の新アルゴリズム「Lyra2REv2」での採掘方法](https://blog.visvirial.com/articles/499#_cpuminer-multi)
- [CLOUDATCOSTでMONAコインを掘ってみる](http://www.zinntikumugai.com/2017/01/06/-1590-/)
- [[monacoin] 一度コイン採掘とやらをやってみたかったので、モナーコインでやってみた](http://d.hatena.ne.jp/kinneko/20140223/p1)
Facebook F8 2017 Keynoteの AR Camera Effectについて 思った事


F8 2017 Keynote
https://developers.facebook.com/videos/f8-2017/f8-2017-keynote/
のなかから、冒頭の35分くらいまでの間の、ARカメラに関するトピックスにサッカーネタがちょっとでて面白かったのでメモを。


（F8二日目の脳直結テキスト入力にもぶっとびましたが、それはまた後で）


## AR Camera Effect×マンチェスターユナイテッドの実例

関連記事
http://jp.techcrunch.com/2017/04/19/20170418facebook-camera-effects-platform/
「例えば、マンチェスターユナイテッドとは、サッカーの試合の情報を取得し、「GOOAAALL!」の画像と観客の声援を追加するエフェクトを用意した。」

KeyNoteの32分20秒あたりにも
「マンユナイテッドのゴールを喜ぶ人々にARでエフェクトを加えてある映像」のデモが流れている。以下スクショ。
![スクリーンショット 2017-04-19 15.34.13.png](https://qiita-image-store.s3.amazonaws.com/0/173392/678f4da2-3118-a24f-f58c-a957ad2f0d1a.png)


さらに人々の映像の右側に、開発ツール「AR Studio」の中で使っている機能の一覧が書かれている。
FACE TRACKING
SCRIPTING
DATA INTEGRATION
FRONT AND BACk CAMERA
TRIGGERED AUDIO

FACE TRACKINGという字が見える。個人認証ではない顔の判別とはこれだろう。
この機能は、どういう風に使うのだろうか。妄想してみる。


- パブで試合を見る
- マンユナイテッドがゴールしそうな瞬間にFacebookカメラを起動して動画撮影開始
- ズラタンがゴール
- 喜んでいる人が写り込む
- ここで喜んでいる人々の顔をARマーカーとして、おもむろに「ManUnitedのAR」が長き眠りから目覚め、「GOAAALL」の文字や紙吹雪や、リアルタイムのスタッツが合成されて動画の中に映り込む
- そのままFacebookに動画を公開

Bパターン

- パブで試合を見る
- マンユナイテッドがゴールした瞬間を動画とっておく
- ManUnitedのARアプリで「Gooaaal AR」を呼び出して、試合結果一覧から、どの試合の何分の誰のゴールかをタッチする
- にぎやかしたい動画を写真フォルダから選ぶ
- 「Gooaaal AR」はFacebook AR Studioのエフェクト機能をつかって「GOAAALL」の文字や紙吹雪を動画の中にいれこむ。Face Trackingをつかって、顔の部分にパーティ帽子をかぶせたり、首にマフラーを巻いたりする。
- 以下同文

Bパターンのほうがまだあり得る気がします。


## 今現在のFacebookアプリのカメラ機能への組み込み状況

facebookアプリでカメラを使うことなどないので何処にあるのかわからなかったが、左上のカメラアイコンからカメラ機能を初めて起動してみたところ、スナップチャットのスタンプをパクっていた。しかもダサくて残念。
Snapchatパイセンと比較してみる。

**facebook**

<img width="375" alt="IMG_9964.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/173392/3e0d5d14-d679-caf4-1572-49b2b257974d.png">

へー(΄◉◞౪◟◉｀)

**SnapChatパイセン**
<img width="375" alt="IMG_9966.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/173392/95b0d334-9a4e-0ba9-02b8-ca7ba6cedb36.png">

イースターか。
ベンゲルとベルカンプのうさ耳眼鏡ツーショットって破壊力あるなぁ。


## AR Studio 

開発者向け開発ツールのクローズドベータの事前登録ができるので登録した。何がもらえるのか楽しみ。
https://developers.facebook.com/blog/post/2017/04/18/Introducing-Camera-Effects-Platform/
エフェクトを作るツールだったらガッカリだけど、ARマーカーと連動できるとか、APIのエンドポイントが登録できたらいいな。


## ついでにカメラ用のフレーム登録もしてみた
https://www.facebook.com/fbcameraeffects/home/
何か登録できるようになってたので、WENGER IN！という文字をフレームに申請してみた。結果は１週間後に出るらしい。座して待とう。合格したらFacebookの写真撮影時に選べるようになるぞ。全世界で。

こういうPNG
↓
<img src="https://qiita-image-store.s3.amazonaws.com/0/173392/ae0961a1-cf63-8f3e-9980-1bbf6c2536c0.png" width=200>
私はベンゲルには経営陣として残ってほしいです。

#　
### どうでもいい話
関係ないけど、このKeynoteではマンユナイテッド対レアルマドリーの試合を映してるが、CLだとして、マンユナイテッドは今年はEL、去年はグループステージ敗退だから、..いつの？:sweat_smile:

### どうでもいい話２
[KeyNote](https://developers.facebook.com/videos/f8-2017/f8-2017-keynote/)の説明が一行だけ、
Mark Zuckerberg and other Facebook leaders talk about the future of artificial intelligence and virtual reality.ってあるけど、冒頭のザッカーバーグの超ドヤ顔プレゼン、Argumented Realityの単語が抜けてますがな。スタッフ残念やな。

### 人類滅亡
キーノートの45分あたりから流れる、Facebook×アバター×VRのプレゼン動画がやばい。
家をでなくて済んでしまい、セクロスもしなくなり、人類は滅亡すると思いました。

以上！
Windowsからmacへ浮気した時のショートカット備忘録

# Windows歴21年、mac歴6ヶ月のショートカットメモ。

起動中のアプリ切り替え（Ctrl + tab）や、Chromeブラウザでのタブ切り替えなど。

## 全般
| 機能              | Windows           | mac                | 備考              |
|:-----------------|:------------------|:-------------------|:-----------------|
| 起動中のアプリ切り替え | Ctrl + tab | ⌘[^1] + tab | WinとMacでは微妙に違う[^2] |
| カレントアプリ切り替え | Alt + tab | ⌘ + fn + F1 |  |
| 起動中のアプリ表示（1） | 不明 | control + ↑ |  |
| 起動中のアプリ表示（2） | 不明 | F3 |  |
| DescTop表示 | Windowsキー + d | ⌘ + F3 |  |
| ページ先頭 | Ctrl + Home | ⌘ + ↑ |  |
| ページ終端 | Ctrl + End | ⌘ + ↓ |  |
| Page Up | Page Up | option + ↑ |  |
| Page Down | Page Down | option + ↓ |  |
| 行の先頭 | Home | ⌘ + ← |  |
| 行の終端 | End | ⌘ + → |  |
| 単語単位カーソル移動 | Ctrl + → | option + → | ←ボタンも同様 |



## Chrome
| 機能              | Windows           | mac                | 備考              |
|:-----------------|:------------------|:-------------------|:-----------------|
| デベロッパーツール  | F12 | ⌘ + alt + J |  |
| 右タブへ切り替え | Alt + tab | control + tab | macはキー割り当てを変更すると良いと思う[^4] |
| 右タブへ切り替え | Alt + tab | control + fn + ↑ |  |
| 右タブへ切り替え | Alt + tab | ⌘ + alt + → |  |
| 左タブへ切り替え | Alt + shift + tab | control + shift + tab |  |
| 左タブへ切り替え | Alt + shift + tab | control + fn + ↓ |  |
| 左タブへ切り替え | Alt + shift + tab | ⌘ + alt + ← |  |
| ○番目タブ切り替え | Ctrl + 数字 | ⌘ + 数字 |  |
| アドレスバーへカーソル移動 | Alt + D | ⌘ + L |  |
| アドレスバーから検索 | Ctrl + K | ⌘ + alt + F |  |
| ヒストリバック | Alt + ← | ⌘ + ← |  |
| ヒストリバック | Alt + ← | ⌘ + [ |  |
| ヒストリフロント[^3] | Alt + → | ⌘ + → |  |
| ヒストリフロント[^3] | Alt + → | ⌘ + ] |  |


[^1]: commandボタン。
[^2]: Windowsは複数の同一アプリケーションも選択ができ、Macはアプリケーション単位で選択できる。<br />例えば、ChromeとExcelが２つのファイルを開いていた場合、Windowsでは、Chrome, Excel1, Excel2が選択でき、Macでは、ChromeとExcelが選択できる。
[^3]: ヒストリフロントというかどうかは知らないw
[^4]: システム環境設定 → キーボード → ショートカット → キーボード → 次のウィンドウを操作対象にする
自分メモ：文字列の中に「?」があるかどうか判定

ついでに「?」が何個あるかも出す。

```sample.js
$(function(){
  if('http://google.com'.match(/[¥?]/g)){
    console.log('http://google.com'.match(/[¥?]/g).length);
  }else{
    console.log(0);
  };
});

```

matchで対象文字列に検索対象があるかどうかを判定。
あれば配列として、なければnullが返される。
で、nullならば0を返すようにしたものが上記。

さすがに冗長なコードなのでそれっぽくまとめると

```refactoring.js
$(function(){
  var hits = 'http://google.com'.match(/[¥?]/g);
  var result = hits ? hits.length : 0;
  console.log(result);
});
```
こんな感じで着地（謎）
TensorFlow 環境構築 on windows

CentOS6上にtensorflowをインストールするのにすっかりハマってしまい、諦めてwindowsにインストールした話。

思っていたより簡単に環境構築出来たので方法を共有します。

## python (anaconda)のインストール

以下のサイトからwindows用のインストーラをダウンロードし、インストールします。

[Anaconda](https://www.continuum.io/downloads)

インストールが終わったら、windowsのコマンドプロンプトからanacondaとpythonのバージョンを確認します。

```
anaconda -V

#=> anaconda-script.py Command line client (version 1.6.0)

python --version

#=> Python 3.6.0 :: Anaconda 4.3.1 (64-bit)
```

## condaコマンドで仮想環境の作成

以下のコマンドで「tf_env」という名前の仮想環境を作ります。

```
conda create -n tf_env anaconda python=3.5
```

* 2017/4/17時点でのpythonの最新版はバージョン3.6ですが、tensorflowが対応していないため、3.5を指定しておきます。
* anacondaを指定すると、いろいろインストールされて時間がかかります。numpyとmatplotlibだけでいいなら、``conda create -n num_env numpy matplotlib python=3.5`` という指定もできます。
* ``conda info -e``で作成した環境の一覧を表示できます

## 作成した仮想環境を使う

以下のコマンドで作成した仮想環境に入ります。

```
activate tf_env
```

仮想環境内では、pythonのバージョンが指定したものになっているはずです。

```
python --version

#=>Python 3.5.2 :: Anaconda 4.3.1 (64-bit)
```

仮想環境から出るときは、``deactivate``コマンドです。

## tensorflowのインストール＆動作確認
``pip install tensorflow``コマンドでtensorflowをインストールします。

インストール完了後、``python``コマンドで対話モードに入ります（コマンドプロンプトに「>>>」が表示される）。そこで以下のコマンドでtensorflowをインポートします。

```
import tensorflow as tf
```

試しに使ってみます。

```
node1 = tf.constant(3)
node2 = tf.constant(4)
node3 = tf.add(node1, node2)
sess = tf.Session()
sess.run(node3)

#=> 7
```

問題なく動きました。


* 2017/11/07追記

以下のブログにTensorFlowの入門記事を書きました。
http://www.uosansatox.biz/entry/2017/09/20/190000
EC2-ローカル間でのファイル転送

# ３行で分かるあらすじ
1. EC2内でエクスポートしたsqlファイルをローカルに転送させたかった。
2. FileZillaでSFTPを使って転送しようとしたが、なぜかsqlファイルが表示されなかった。
3. 表示されない原因調べるのも馬鹿らしいのでscpで転送した。

# 環境
ローカル：Mac
Amazon EC2：Amazon Linux

# EC2 → ローカル 転送
scp -i [公開鍵ファイルのパス] [ユーザ名@ドメイン]:[送信元EC2ファイルパス] [転送先ローカルファイルパス]

```shell-session
# 例
scp -i /keys/hoge.pem user@ec2-xxxx.com:/sqls/hoge.sql /Desktop
```

# ローカル → EC2 転送
scp -i [公開鍵ファイルのパス] [送信元先ローカルファイルパス] [ユーザ名@ドメイン]:[転送先EC2ファイルパス] 

```shell-session
# 例
scp -i /keys/hoge.pem /Desktop/hoge.sql user@ec2-xxxx.com:/sqls
```
# まとめ
エンジニアたるものGUIばかりに頼っていてはいけないな！な！（戒め）
Cron が走っているかどうか確認する


## RHEL/CentOS v4.x/5.x/6.x and Fedora Linux (古いバージョン)

### crond が動いているかどうか

```
service crond status
```

### crond 動いていなかったら

```
sudo chkconfig crond on
sudo service crond start
```


## CentOS/RHEL v7.x+/Ubuntu 最新

### crond が動いているかどうか

```
systemctl status crond.service
```

### crond 動いていなかったら

```
sudo systemctl enable crond.service
sudo systemctl start crond.service
```

## crond ログの確認

```
tail -f /var/log/cron
```

以上
Mysql の master がログファイルのディスクフルが原因で死んでいた時の対処

# 背景
ほったらかしにしていたログファイルがいつの間にかいっぱいになっていて、ディスクフルにより master の Mysql が死んでいた。slave はディスク容量は余裕があり生きてはいるもののエラーが出ていた。
## ログファイルを空っぽに
```
$ sudo echo -n > ログファイル
```
## Mysql 起動
死んでることを確認して起動

```
$ sudo service mysqld start
```
## slave の状態を確認
```
> show slave status \G;
*************************** 1. row ***************************
               Slave_IO_State:
                  Master_Host: xxx.xxx.xxx.xxx
                (中略)
                Last_IO_Errno: 1236
                Last_IO_Error: Got fatal error 1236 from master when reading data from binary log: 'binlog truncated in the middle of event; consider out of disk space on master; the first event...
```
Error 1236 でうまくいっていないことがわかる。
バイナリログから master の情報を読む時にエラーが出たよって内容らしい。
今回は master が一晩死んでいたので、バイナリログの情報がずれまくっている。
## master のバイナリログを確認
masterで下記を実行して、File と Position を取得

```
 > show master status;
```
## slave に取得したFile と Position を反映
```
> stop slave;
Query OK, 0 rows affected (0.02 sec)

> CHANGE MASTER TO MASTER_HOST='xxx.xxx.xxx.xxx', MASTER_LOG_FILE='取得したFile名', MASTER_LOG_POS=取得したPosition;
Query OK, 0 rows affected (0.05 sec)

> start slave;
Query OK, 0 rows affected (0.00 sec)

> show slave status \G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: xxx.xxx.xxx.xxx
                (中略)
                Last_IO_Errno: 0
                Last_IO_Error:
```
## master で slave が存在するか確認
```
> show slave hosts;
+-----------+------+------+-----------+
| Server_id | Host | Port | Master_id |
+-----------+------+------+-----------+
|        18 |      | 3306 |        17 |
+-----------+------+------+-----------+
```
成功！
次はログローテートかな
php 多次元配列になったstdClassをArrayにキャストする

## 背景
これを

```
[
        (int) 0 => object(stdClass) {
                id => 1
                name => 'taro'
        },
        (int) 1 => object(stdClass) {
                id => 2
                name => 'jiro'
        }
]
```
こうしたい

```
[
        (int) 0 => [
                'id' => 1,
                'name' => 'taro',
        ],
        (int) 1 => [
                'id' => 2,
                'name' => 'jiro',
       ]
] 
```

## 環境
```
$ php -v
PHP 5.6.14 (cli) (built: Sep 30 2015 14:07:43)
Copyright (c) 1997-2015 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2015 Zend Technologies
```

## 結果
これだけ

```php
$array = json_decode(json_encode($stdArray), true);
```

やっていることは単純で一度jsonにエンコードした後、配列形式にデコードしている。
`json_decode` の第二引数に `true` を指定することで配列形式にデコードしてくれる。


### 参考にさせて頂いたURL
http://php.net/manual/ja/function.json-encode.php
http://php.net/manual/ja/function.json-decode.php
【WebSphere Liberty Hints & Tips】ログの言語を変更する方法


## はじめに
WebSphere Libertyが出力するログの言語はデフォルトでOSのロケールに沿って出力されます。例えば日本語設定になっている環境でしたら日本語でログが出力されます。
場合によっては英語でログを出力したい（トラブルなどでサポートへ送付するケースなど）ときもあるので、その方法を備忘録として残します。

## 使用環境
* Mac OS X El Capitan
* Liberty 17.0.0.1
* Oracle JDK 8

## 方法＆確認
### Liberty環境全体に設定したい場合
1. \<wlp.install.dir>/etc ディレクトリにjvm.optionsファイルを作成
	* etcディレクトリは導入時に自動作成されないので自分で作成
2. 上記ファイルに以下を記述

```jvm.options
-Duser.language=en
```
3.　サーバー(JVM)を再起動する

```サーバー停止＆開始
$ ./server stop serverName
$ ./server start serverName
```

4.　\<wlp.user.dir>/servers/serverName/logsに出力されるログが英語になっていることを確認
![Kobito.phLoVO.png](https://qiita-image-store.s3.amazonaws.com/0/129662/43f6bf48-ffce-2eca-c00a-c8fdacc63ed1.png "Kobito.phLoVO.png")


### 特定のサーバー（JVM）にのみ設定したい場合
1.　\<wlp.user.dir>/servers/serverName ディレクトリにjvm.optionsファイルを作成
2.　ファイルに記述する内容を今度はフランス語にしてみる

```jvm.options
-Duser.language=fr
```

3.　サーバー（JVM）を上記手順と同じように再起動する
4.　\<wlp.user.dir>/servers/serverName/logsに出力されるログがフランス語になっていることを確認
![Kobito.qqTWbv.png](https://qiita-image-store.s3.amazonaws.com/0/129662/6a8fac6f-9cbf-ca36-d826-51d477c42943.png "Kobito.qqTWbv.png")

5.　なおjvm.optionsが両方存在する場合、\<wlp.user.dir>/servers/serverName/jvm.optionsが使用される

## まとめ
以上でWebSphere Libertyにおけるログの言語を変更する方法を記載しました。

## 参考情報
* https://www.ibm.com/support/knowledgecenter/ja/SSEQTP_8.5.5/com.ibm.websphere.wlp.doc/ae/twlp_admin_customvars.html
* http://www.mysphere.com.br/change-the-log-language-on-websphere-liberty-profile/
* http://sebastiankapciakblog.blogspot.jp/2012/09/libert-profile-locale-setting.html
[Windows][batch] リストからディレクトリを生成する

すごい今更な技術ですけど、以前作ったのが発掘されたのでメモ。

`dirlist.txt` に列挙している名前でカレントディレクトリにディレクトリを生成するbatchファイル

```bat:DIRCREATE.bat
for /F "delims=" %%a in ('type "%~dp0dirlist.txt"') do md "%~dp0%%~a"
```

# 実行例

・dirlist.txtを更新

```text:dirlist.txt
100.AAA
200.BBB
200.CCC
200.CCC\100.DDD
```

・`DIRCREATE.bat` をダブルクリックして実行
・ディレクトリが生成される

```
100.AAA
200.BBB
200.CCC
200.CCC\100.DDD
```
Jenkins install エラー (Unsupported major.minor version 52)


## ec2にJenkinsを入れた時の話
Jenkinsをインストールし起動してみると  `jenkins 503 service unavailable` 

`/var/log/jenkins/jenkins.log` を見ると↓のエラー分が出た

```
Caused by: Java.lang.UnsupportedClassVersionError: jenkins/util/SystemProperties : Unsupported major.minor version 52.
```

## 原因
JavaのVersionが古いらしい
 `version 52.` は Java 8だそう
[Unsupported major.minor version 51.0 = Java7 以上使え](http://qiita.com/seratch@github/items/731b69d3edabe9c8bc0d)

## 解決策
JavaのVersionを8に上げる

```
$ sudo yum -y install java-1.8.0-openjdk-devel  
$ sudo alternatives --config java
> Java 8 を選ぶ
$ java -version
> java 8になっていることを確認
```

Jenkinsにアクセスして動作していることを確認

おめでとう！
これでJenkinsおじさんをこき使うことができるようになりました