OmniAICreator/Qiita-1.07M huggingface dataset:
Macの便利な小技集5選

ども。

普段仕事でMacを使っているのですが、便利な小技集をご紹介します。皆さんご存知の内容ばかりかもしれませんが。

## openコマンド
個人的にプログラム開発にすごく適したマシンだなって思ってるんですが、それに伴いターミナルで操作することが多いんです。でもやっぱりGUIの便利さには敵わないということでFinderを開くことも同じぐらいあります。

そのときにターミナルで今いるディレクトリをすぐさまFinderで開きたいケースあると思うんですが、そんなときに便利なのが```open```コマンドです。

```bash
$ open .
```
このコマンドを実行するとたちまちFinderが開きます。```open```コマンドは引数に指定されたディレクトリをFinderで開くというコマンドです。上記の例でいうと```.```が現在のディレクトリパスを示すので期待通りの結果になります。

もちろん```open```コマンドの引数に任意のディレクトリパスを指定することもできます。

```
$ open /Applicaiton
```

このように実行すればアプリケーションフォルダが開きます。

## zipcloakコマンド
続いてコマンドの2つめ```zipcloak```のご紹介です。これはzipファイルにパスワードを設定するためのコマンドです。zipファイルを作るフリーのアプリにも備わっているものもあるとは思いますが、いちいちアプリを起動する必要もなくコマンド1つでパスワードを設定することができます。

```
$ zipcloak 【zipファイルのパス】
```

これだけです。ファイルパスの指定がめんどくさいって方は、Finderで見えているzipファイルをターミナルにＤ＆Ｄしてみてください。ファイルパスが入力できると思います。

## Soptlight検索
これはMacの神機能だと思っています。画面右上に控えめに鎮座している虫メガネです。PC内のファイル検索もWeb検索もアプリケーションの起動も計算もなんでもできます。

1日に度々登場する機能なのでホットキーを割り当てています。確か初期状態ではctrl + spaceキーだったと思うんですが、IDEなどでよくサジェスト機能を呼び出すホットキーの設定とカブってるんです。なので、開発者の方は別のホットキーを割り当てることをオススメします。

ちなみに僕は左手だけで起動できることと、SpotlightのSをとって、ctrl + Sキーにしています。

## フォルダ移動
Windowsにはエクスプローラの上部分にフォルダパスが表示された箇所があると思います。そこにフォルダパスをコピペして移動することってよくありますよね。

たまにMacユーザーはフォルダパスを見ながら、一階層ずつFinderで移動しているのを見かけますが、Macにもちゃんと機能があるんです。

**安心してください。ありますよ。**

Finderを表示した状態でshift + cmd + Gキーでパスを入力するポップアップが現れます。そこに入力してエンターキーを押せば移動することができます。

ただターミナルのように物理的なパスではない点に注意です。例えばアプリケーションフォルダであれば物理パスは```/Application```ですが、論理パスは```/アプリケーション```となっています。

## 再変換
同音異義語の変換ミス。よくありません？最近はGoogle日本語入力の精度も上がってきたので、すごくいい感じで変換してくれるようになりましたが、それでもたまにはありますよね。

例えば、境界と協会や、解凍と回答など。まぁ削除して再入力すればいいんですが、Macには便利な機能がありまして。

入力中、確定させてしまった言葉のすぐ後ろにカーソルがある状態で**かな**キーをポンポンと2回押してください。確定させた言葉が変換中になります。直前に確定させた部分だけになるんですが、再度変換することができます。入力し直すよりも簡単で早いと思うので、使ってみてください。

## まとめ
まとめというほど、まとめる必要がない投稿ですが・・・

僕がよく使っているMacの便利な機能のご紹介でしたが、こういう機能を駆使して作業時間を短縮できるようになるといいですね。もっと他にも便利な小技があると思うので、こんなんあるよーって方は教えてください！

では。
オフラインリアルタイムどう書く E20 の実装例

問題：http://nabetani.sakura.ne.jp/hena/orde20maze/
実装リンク集：https://qiita.com/Nabetani/items/7baf181b4a1b7eacc79a

もともと ruby で書いていたんだけど、なんとなく python に移植した。

```python:python2or3
MAZE = """
01 2345 6 789A CD E FG JKLM
PQR ST UVW X YZ 06CIO 17 JPV
EK 39F RX GMSY 5B HNT """

def neibours(s):
  n=[ [MAZE[x-1],MAZE[x+1] ] for x in range(len(MAZE)) if MAZE[x]==s ]
  return [ x for x in sum(n,[]) if not x.isspace() ]

def solve(src):
  visited={}
  q=[ (src[0], 0) ]
  while True:
    cur, dist = q.pop(0)
    if cur in visited:
      continue
    visited[cur]=True
    for n in neibours(cur):
      if n==src[1]:
        return str(dist+1)
      if not( n in visited ):
        q.append( ( n, dist+1 ) )

def test( src, expected ):
  actual = solve( src )
  okay  =actual == expected
  print( repr( [ ( "ok" if okay else "**NG**"), src, actual, expected ] ) )

test( "DE", "13" );
test( "EK", "1" );
```

いつも通りテストケースの大半は省略。

画像で配布されている迷路をどうコード上に表現するかという問題。
私は、隣接セルが隣の文字になるような文字列を用意することにした。
上記の「`MAZE`」という文字列。

本来なら一旦 dict に入れたりして検索を早くするべきだけど、面倒なので毎回線形探索している。その分遅いけど、まあ今回の問題なら良いと思う。

あとは普通に幅優先探索で。
まあこの問題の場合は深さ優先でもうまくいくはずだけどね。
MacOSのスクリーンショットの保存先を変更する


私はしょっちゅうスクショをとってネットに上げたり友人に送信したりするのですが、デフォルト保存先がデスクトップなのでデスクトップがちらかっていくので保存先を変更しています


### ターミナル.appを開く

以下のコマンドで、保存先がホームディレクトリ配下のscreenshotフォルダになります

```shell-session
mkdir ~/screenshot
defaults write com.apple.screencapture location ~/screenshot
killall SystemUIServer
```


### スクショを撮る

矩形選択してスクショは `⌘+Shift+4` （ほぼこれしか使っていない)
ちなみに `⌘+Shift+Control+4`でクリップボードにコピーされるので、GitHubやQiitaの投稿フォームに直接Ctrl+Vで貼り付けられてすごく捗ります


#### 参照

- https://discussions.apple.com/docs/DOC-9081
勘違いして定時前に帰ってしまったので再発防止策を考えてみた


この記事は[富士通クラウドテクノロジーズ Advent Calendar 2017](https://qiita.com/advent-calendar/2017/fjct) 3日目の記事です。
2日目は@hunter9xさんの「[logstashのPersistent queuesとBackpressureの紹介](https://qiita.com/hunter9x/items/3147c65f33a8435ca878)」という記事でした。
4日目は@herietさんの「[Prometheusのexporterを作ってニフクラRDBを監視する](https://qiita.com/advent-calendar/2017/fjct)」です。


# 勘違いして定時前に帰った

ある日のこと。スプリントレビューを終え、今日も一仕事やり終えたという思いを胸に打刻を済ませて退社。
電車がいつもより空いているなーと思いふと時計を見てみるとそこには17:25という文字が。
時計の時間がずれたのだと信じ電車のモニターに映る時間を確認すると変わらず17:25。
何ということか。定時を過ぎたと勘違いして、**定時前に帰ってしまったのだ。**
今思い返すと帰り際にお疲れ様ですと言ったときの周囲の反応がいつもと違っていたような...

# 再発防止策の検討
打刻を忘れることの防止策であれば、定時になったら打刻を促す通知をSlackに設定をするなどの対処法があります。
（打刻を忘れるケースは一般的に起こりやすいのかweb検索すると対策がたくさん出てくる）
しかし定時前に誤って退社してしまうパターンの対策方法は調べても全く出てこなかったので独自の方法を編み出すことにしました。

1. 定時になったらSlack通知
    * そもそも定時前に帰ってしまうと意味がないので却下
2. 勤務時間中と定時後のデスクトップ壁紙を切り替えるスクリプトを設定
    * 壁紙に注意を向けなければ有効ではないので却下
3. 勤務時間中に打刻しようとすると警告するスクリプトを設定
    * 普段意識していなくても自動的に対処できるため今回はこれを採用

# 勤務時間中に打刻システムにアクセスしたら警告させる
勤務時間中に打刻システムにアクセスすると警告するという要件を実現するため、今回は [Tampermonkey](http://tampermonkey.net/)を使用しました。
Tampermonkeyはユーザースクリプトを実行することができるブラウザ拡張機能です。
同じような拡張機能はたくさんあるのですが、こちらはChromeやSafariなど様々なブラウザに対応していて先月公開されたFirefox Quantum（Firefox 57）でも利用できるのでおすすめです。

## Tampermonkeyのインストールと設定
### 1. Tampermonkeyのインストール
http://tampermonkey.net/ からインストール
![1.png](https://qiita-image-store.s3.amazonaws.com/0/164730/f88ff1b5-59e5-85fe-6cd3-4d3c7b739db5.png)



### 2. スクリプトの追加
「新規スクリプトを追加...」を選択してスクリプトを追加します。
下記のスクリプトでは9:00-17:45の間に https://fjct.fujitsu.com/ へアクセスすると警告が出されます
※ 実際に使用するときは打刻システムのURLを設定しています

```js
// ==UserScript==
// @name         Check for working hours
// @namespace    https://fjct.fujitsu.com/
// @version      0.1
// @description  勤務時間中に設定URLへアクセスした場合に警告します
// @author       You
// @match        https://fjct.fujitsu.com/
// @grant        none
// ==/UserScript==

let onDuty = function(){
    let currentTime = new Date();
    let startingTime = new Date();
    startingTime.setHours(9);
    startingTime.setMinutes(0);
    startingTime.setSeconds(0);
    let quittingTime = new Date();
    quittingTime.setHours(17);
    quittingTime.setMinutes(45);
    quittingTime.setSeconds(0);
    if(startingTime <= currentTime && (currentTime < quittingTime)){
        alert('あれ？もう帰るの？');
    }
};

window.onload = onDuty;
```

入力後、保存をすれば自動的に有効になります。
![2.png](https://qiita-image-store.s3.amazonaws.com/0/164730/d9111109-d62e-9064-947e-b589c7517475.png)

### 3. 設定したURLにアクセス
設定時刻中にアクセスすると警告が表示されます。
![3.png](https://qiita-image-store.s3.amazonaws.com/0/164730/7f566031-fc83-abeb-6520-483b594387b5.png)


# さいごに
このスクリプトのおかげもあってかあれから一度も定時前に帰ることはなくなりました！
今回はアラート用にTampermonkeyを使用しましたが、ユーザースクリプトはwebページの変更にこそ真価を発揮するのでいろいろ試してみると面白いかもしれないですね。

今日は勤務時間中の打刻監視でしたが、明日は@herietさんのもっと真面目な監視の話です。
お楽しみに！
Mac OS Sierra HighでTexshopが動かない。助けてください

Mac OS sierra highのした後に、Texshopで以下のエラーが出てきてPDF出力できません。
mktexpk: don't know how to create bitmap font for rml.
mktexpk: perhaps rml is missing from the map file.
kpathsea: Appending font creation commands to missfont.log.

dvipdfmx:warning: Could not locate a virtual/physical font for TFM "rml".
dvipdfmx:warning: >> There are no valid font mapping entry for this font.
dvipdfmx:warning: >> Font file name "rml" was assumed but failed to locate that font.
dvipdfmx:fatal: Cannot proceed without .vf or "physical" font for PDF output...

Output file removed.

どなたかどうやったら解決できるか教えてくださいm(_ _)m
留年がかかったレポートを提出しなきゃいけないんです。お願いします。
Cloud Functions for Firebase + Realtime Database での ref を整理する

Cloud Functions を書いてると、 `event.data.ref`, `event.data.parent.ref`, `event.data.adminRef` とか色々出てきてややこしいので整理した。

[公式の例](https://firebase.google.com/docs/functions/database-events?hl=ja) で、 `/messages/{pushId}/original` の変更を検知したケースで考えてみる。

```javascript
exports.makeUppercase = functions.database.ref('/messages/{pushId}/original')
    .onWrite(event => {
      const original = event.data.val();
      const uppercase = original.toUpperCase();
      return event.data.ref.parent.child('uppercase').set(uppercase);
    })
```

## event.data.ref

```javascript
// read
event.data.ref.once('value').then((snapshot) => {
    console.log('ref:', snapshot.val());
    // -> ref: messsage
})

// write
event.data.ref.set('newValue')

// update
event.data.ref.parent.update({'original': 'newValue'})
```

`event.data.ref` で取れるのは `event.data.val()` と同じもの。

write はそのまま `ref.set('newValue')` でいけるのだが、 `ref.update('newValue')` とするとエラーが帰ってくるので `ref.parent.update({key: value})` とする必要があり、ややこしい。
エラーはこういうのが出る: `Error: Firebase.update failed: First argument  must be an object containing the children to replace.`

\* 参考: [Interface: DeltaSnapshot#ref](https://firebase.google.com/docs/reference/functions/functions.database.DeltaSnapshot?hl=ja#ref)

## event.data.adminRef

```javascript
// read
event.data.adminRef.once('value').then((snapshot) => {
    console.log('ref:', snapshot.val())
    // -> adminRef: message
})

// write
event.data.adminRef.set('newValue')

// update
event.data.adminRef.parent.update({'original': 'newValue'})
```

adminRef は基本的に ref と同じものだが、権限が強いという違いがある。
権限を絞っていると ref だと取得できないデータもあるが、 adminRef だと取得できる。基本的に ref を使った方が事故を防げそう。

\* 参考: [Interface: DeltaSnapshot#adminRef](https://firebase.google.com/docs/reference/functions/functions.database.DeltaSnapshot?hl=ja#adminRef)

## event.data.ref.parent

```javascript
// read
event.data.ref.parent.once('value').then((snapshot) => {
    console.log('parent:', snapshot.val())
    // -> parent: parent: { original: 'message' }
})

// write
event.data.ref.parent.child('original').set('newValue')

// update
event.data.ref.parent.update({'original': 'newValue'})
```

`/messages/{pushId}/original` の1つ上の階層、つまり `messages/{pushId}` の Object を取得する。

write の場合は `parent.child('key').set('hoge')` のように、どの子要素に書き込むのか指定する必要がある。
update は ref の時と同じ。

## おわり

update のところがややこしい。
整理するとそんな難しくなくて当然なんだけど、開発中はどれがどうなってるのか混乱してしまった。
CodePipelineで作る変更管理パイプライン

この記事は「Opt Technologies Advent Calendar 2017」2日目となります。

## はじめに

こんにちは、mshibuyaです。
今回は以前よりあたためていた「変更管理パイプライン」の導入に向け、AWS CodePipeline/CodeBuildを触る機会がありましたので内容をご紹介したいと思います。

## 変更管理パイプラインとは

オライリー社より出ている「[Infrastructure as Code](https://www.oreilly.co.jp/books/9784873117966/)」12章に出てくる概念で、雑にいうとインフラコードのデプロイパイプラインです。

ソースとなるコードリポジトリへコミットされたインフラコードの変更に対し、流れるように

- 自動化されたテスト
- 自動化されたデプロイ
- 変更内容のチェックおよび承認

などを組み合わせ、動作環境への反映までを行うフローをつくることで、本番環境への変更の反映をスムーズに行える仕組みとなります。

これを活用することで、

- 変更のデリバリーの省力化
- 手作業によるインフラ変更の防止（自動化されたパイプラインに乗せる方が楽になれば、皆そうするようになる）
- デプロイ作業の均質化（手作業によるミスの防止）
- トレーサビリティの向上

など、様々なメリットを享受できるようになります。いいですねー

## 試した内容

ここでは実現可能性の検証ということで、次のようなパイプラインを作成しました。

- GitHubリポジトリの変更を検知
- CodeBuildによりCloudFormation Template JSONを生成
- 得られたTemplate JSONによりCloudFormation Stack更新

<img width="262" alt="codepipeline.png" src="https://qiita-image-store.s3.amazonaws.com/0/27474/9d82bd73-b957-58d7-0b0c-7208c892b5d9.png">


## はまりどころ

CodePipelineからCloudFormationスタック更新をしようとして、次のようなエラーに遭遇しました

```
Template exceeds maximum length of 51200 bytes
```

CloudFormationでは通常テンプレートの上限サイズが51,200bytesとなっており、S3にテンプレートを一度アップロードして渡すことによりその制約を回避し460,800bytesまでのサイズが扱えるのですが、CodePipelineからはS3にアップロードしての渡し方が行えないとのこと。
https://forums.aws.amazon.com/thread.jspa?messageID=785905&tstart=0

これ普通に困りますね…なんとかして欲しいです。上記スレッドで提案されている回避策は「CodeBuildからS3にアップロードしてCloudFormation適用する」みたいな感じで…まぁ、確かにそれで動くでしょうけど。。。

## 今後

わりとイメージしていた通りのことが出来る見通しは立ったので、次は実際にステージング環境での運用をはじめたいなーと思っております。
進展があったらまたご報告したいです！
blockcypher apiメモ

#環境
言語:php

#BlockcypherAPIを通じて、HDウォレットでアドレス発行をするまで

##(1)BlockcypherライブラリをComposerダウンロード

```
$composer require "blockcypher/php-client:*"
```

##(2)（後々のことも考え）BlockCypherクラスを作る

```php

//ライブラリの場所を指定
use blockcypher 

class BlockCypher{
  
  private $token = BLOCKCYPHER_TOKEN;
  private $apiContext;

  function __construct($network,$coin){

    $this->apiContext = new \BlockCypher\Rest\ApiContext(
                        new \BlockCypher\Auth\SimpleTokenCredential($this->token),
                        $network,
                        $coin
                      );

   $this->apiContext->setConfig(
                          array(
                            'mode' => 'sandbox',
                          　'log.LogEnabled' => true,
                          　'log.FileName' => 'BlockCypher.log',
                          　'log.LogLevel' => 'DEBUG'
                        )
                      );
  }
}
```

##(3)HDWalletを登録するメソッドを作成

```php

public function createHDWallet($name,$xPub,$subChainIndex=array()){

　$wallet = new \BlockCypher\Api\HDWallet();
　$wallet -> setName($name);
　$wallet -> setExtendedPublicKey($xPub);

  if(!empty($subChainIndex)){
  　$wallet -> setSubchainIndexes($subChainIndex);
  }

  $walletClient = new \BlockCypher\Client\HDWalletClient($this->apiContext);
  $createWallet = $walletClient -> create($wallet);

  return $createWallet;
}
```

##(4)拡張公開鍵の取得

Electrum,TREZOR、Copay、bcwalletなどで拡張公開鍵を取得。
ちなみにBIP39に従ったHDウォレットを用意すること。

大抵のHDウォレット階層は、
m/44'/1'/0 になっている。

##(5)登録する

```php
$network = 'test3'; //　メインネット: 'main' , テストネット: 'test3'
$coin    = 'btc' ;
$blockcypher = new BlockCypher($network,$coin);

//(5)で取得した拡張公開鍵
$xpub = 'tpub123456789....';

//HDウォレットの階層を示すindex
$subchainIndex = array(0,0);　// m/44'/1'/0'の場合

echo $blockcypher->createHDWallet('walletName',$xpub,$subchainIndex);
```

##(6)アドレスを発行するメソッドを作る

```php
public function generateAddress(){

 $addressClient = new \BlockCypher\Client\AddressClient($this->apiContext);

 try {
  $addressKeyChain = $addressClient->generateAddress();
 } catch (Exception $ex) {
  throw new InternalErrorException();
 }
 return $addressKeyChain;
}
```

##(7)アドレスを発行する

```php
$newAddrInfo = [];
$new = json_decode($blockcypher-> deriveHDAddress(BLOCKCYPHER_WALLET))->chains[0];

$chain_address = $new->chain_addresses[0];
$newAddrInfo["btc_addr"] = $chain_address->address;
$newAddrInfo["pubkey"] = $chain_address->public;
$newAddrInfo["path"] = $chain_address->path;

var_dump($newAddrInfo); 
//array(3) { ["btc_addr"]=> string(34) "n1JAkBPeVdnZsj5QAMU2Zh4BMmNALZTQKb" ["pubkey"]=> string(66) "03a5e87c89c43e154083ca9e438db6d5bcb1b160bb4103ed043f67db5e1b3886de" ["path"]=> string(5) "m/0/0" } 

```

最後の表示されるアドレスが、(4)で用意したウォレットの受信アドレスと同一のものであればOK。
Goで設定ファイルに環境変数書きたい気がする

# 環境変数を書きたい

yamlかなにかのファイルにアプリケーションの設定値を書くとき、環境変数も一緒に書けたらいいのに・・・と思うことはないでしょうか。そういうときこの方法ならいけるんじゃないか、という話です。最初に言っておくと実用性は不明です。

# 方法

yamlで設定を書きます。$始まりが環境変数で、それが設定されていない場合は|で区切って右側の文字列を設定値に使用する、という感じ。

```go
yml := `
password: $DBPASS|mypass
user: $DBUSER|root
name: $DBNAME|db_dev
host: $DBHOST|localhost
`
```

stringのnamed typeを作ります。

```go
type F string
```

yamlを受けるstructを作ります。

```go
type dbSetting struct {
	Password F
	User     F
	Name     F
	Host     F
}
```

受けます。

```go
conf := dbSetting{}
yaml.Unmarshal([]byte(yml), &conf)
```

Fにはレシーバメソッドを作ってあります。
こんな感じで。

```go
func (f *F) Val() (string, error) {
	// 空文字だったらエラー
	if f.raw() == "" {
		return "", errors.New("value not set")
	}

	// sep == "|" で分解
	pieces := strings.Split(f.raw(), sep)
	for _, p := range pieces {
		// $から始まる = 環境変数
		if strings.HasPrefix(p, envvarPrefix) {
			// 環境変数が見つかったらそれを返す
			if env, ok := os.LookupEnv(strings.TrimLeft(p, envvarPrefix)); ok {
				return env, nil
			}
			continue
		}
		// 環境変数が見つからない || 普通の文字列の場合
		return p, nil
	}
	return "", errors.New("value not set")
}
```

ということで設定ファイルから環境変数の値を取得することができました :tada:

```go
conf.Password.Val()
```

# 作ってみた
confieldという名前です。書いてはみたものの自分でも実践で試していないので使い勝手はわかりません。
https://github.com/seihmd/confield
Unityのチーム開発でSourceTreeを用いたGitHubの準備をした話

# はじめに
GitHubを一人で扱う分には慣れてきたが、チームで使ったことの無い人向けの記事です。
筆者自身準備にそこそこ困ったのでまとめておきます。

前提条件として以下を挙げますのでご容赦ください。

- GitHubのアカウントを持っている
- Unityで開発する
- SourceTreeを使える

# 準備
前提条件とは言え、ここで放置してはあまりにも無責任なので手引きのみしておきます。

- GitHubのアカウントを持っている
→　　

- Unityで開発する 
→ 頑張って!(^^)! 

- SourceTreeを使える
→



# GitHubのチームを作る

まずはGithubのチームを作ります。
無課金でもできるので安心してください。

マイページの右上の▼からNew organizationを選択してください。
<img width="365" alt="スクリーンショット (11).png" src="https://qiita-image-store.s3.amazonaws.com/0/126820/8fcc7f6d-07ae-df51-30aa-4bb0cce736d3.png">

続いて、必要情報を記入していきます。
<img width="578" alt="スクリーンショット (7).png" src="https://qiita-image-store.s3.amazonaws.com/0/126820/bd06ee0e-6035-a7b3-ee3e-d0a83a8efb40.png">

<img width="382" alt="スクリーンショット (8).png" src="https://qiita-image-store.s3.amazonaws.com/0/126820/f1b817b1-bce6-a85d-07d8-b92cf9d06279.png">

記入が終わったら、最後にCreate organizationをクリックします。これでチームの作成が完了しました。

次は作ったチームにメンバーを入れていきましょう。

記入枠がありますので、そこにGithubのアカウント名もしくはGithubに登録しているメールアドレスを入力します。

招待された側にGithubからのチーム招待メールが届いているはずなので承認しましょう。
これをメンバー全員分行えばチーム完成です。


# gitignoreを入れる

チームは完成しましたが、このまま開発を始めてはエラーを履いてしまいます。
Githubにアップロードすべきでない情報までアップロードされてしまうためです。
これをケアするには「.gitignore」というファイルをUnityのプロジェクトに仕込みます。.gitignoreの入手に関しては各自行ってください。

.gitignoreを置く位置ですが画像の場所に置いてください。

<img width="526" alt="スクリーンショット (13).png" src="https://qiita-image-store.s3.amazonaws.com/0/126820/b2f9956d-6db5-3497-b743-6f70e364ae54.png">

はい。これでGithubにアップロードする際に無駄なファイルがアップロードされないようになりました。


# まとめ

お疲れ様です。
これですべての準備が完了です。

あとはいつも通りにクローンして使ってあげれば利用できるかと思われます。筆者はこれでできました。
Dockerを利用してrstanがすぐ使えるRStudio Serverの構築2017年版

この記事は、[Stan Advent Calendar 2017](https://qiita.com/advent-calendar/2017/stan)の4日目の記事です。

タイトルのまんまで、さらに言うと[昨年のStan Advent Calender](https://qiita.com/kazutan/items/f1447cbabed8d4dd50b8)の今年版です。「ぞうさんそれは手抜きすぎだろ…」と言われそうですが、**1年もあればR界隈いろいろ変わります**。てことでいろいろ修正しました。

## Dockerの導入方法やコンテナの立て方

省略します。このあたりは[昨年の記事](https://qiita.com/kazutan/items/f1447cbabed8d4dd50b8)を参照してください。使い方自体は変わってないです。変わったのは中身になります。

## rstan用コンテナと特徴

あまりコンテナのリポジトリを増やしすぎるのの好みではなかったので、昨年作った`kazutan/stan-d:latest`のコンテナを見直して修正しました。

- [GitHubリポジトリ](https://github.com/kazutan/stan-d)(Dockerfile)
- [DockerHub](https://hub.docker.com/r/kazutan/stan-d/)

### rstan関連のパッケージが既に入ってる

rstanパッケージはもちろんですが，以下のパッケージがプリインストールされています:

- ggmcmc
- rstanarm
- bayesplot
- brms
- tidybayes

多分これで基本OKだと思うのですが，もし「こういうのも追加して!」というのがありましたらお知らせください。

### 最新のtidyverseパッケージ群

`rocker/tidyverse`をベースにしているので，tidyverseなパッケージは全部入りしてます。dplyrやtidyr, ggplot2などはもちろん色々はいってます。

また，`rocker/tidyverse`のコンテナが更新されたならば，自動的にrebuildするようにしているので，最新のtidyverseを試してみたい方にもうってつけです。

### rmarkdownやshinyなども入ってる

ドキュメンテーションに必須なrmarkdownも入ってます。またshinyや関連パッケージも組み込まれています。なので何も考えずにするっとレポーティングできます。いいですね。ただし，texは組み込んでいないのでpdf出力は使えません。あしからず。

### RStudio Server v1.1が使える

最新の安定版が自動的に使えます。またServer版なので，Windows/Linuxのデスクトップ版で問題になっていたViewerの弱さが改善されています。つまり**tubeplayR**が使えます。快適ですね。

### 日本語対応済

日本語用フォントをインストールして，言語やタイムゾーンも設定してます。

## 分析環境を仮想化していこう

これからは環境を仮想化し，再現性の高めていくのが望ましいと思います。またこのようなコンテナを使えばあっという間にRとStanの環境を構築できます。ぜひ活用してみてください。

**Enjoy!**
ReactNativeにおけるパフォーマンスチューニング（計測編）

### 前置き
Progateではネイティブアプリ（2017/12/4時点では未リリース）をReactNativeを用いて開発しています。

ここに記載した内容はほとんどwebでのReact開発にも適用できる内容ですが、せっかくなのでまだネット上の知見が少ないReactNative開発を想定して進めていきます。

パフォーマンスチューニングにおける鉄則「**推測するな、計測せよ**」に基いて、ReactNativeアプリにおいて計測しながらボトルネックを突き止め、改善する方法について書きます。

## シミュレータでのPerf Monitor
「なんかここタップした時の挙動重いな、、、？」などと思ったら、まずはざっくりと状況を定量的に把握しましょう。
幸いReactNativeにはデフォルトで簡単なPerformance監視ツールがついています。

シミュレータ上で「Command + D」を押すと以下のような画面がでてきますね。
![commandD-big.png](https://qiita-image-store.s3.amazonaws.com/0/21920/a0f018e8-7b93-c933-3910-a0e21e6b3378.png)

さらに「Show Perf Monitor」を押すと以下のようなMonitorを表示できます。
<img width="261" alt="perf_monitor.png" src="https://qiita-image-store.s3.amazonaws.com/0/21920/3f7dbaff-3858-d5e4-3f56-24224bfa9656.png">

ReactNative開発においてパフォーマンスをチューニングするときは、まずは一番右の「JS」の欄を見てください。
この数値は「**0 - 60**」の範囲でリアルタイムに変わっていき、**JSの処理が重いときほど、値が0に近づいていきます**。

アプリの動作がもっさりしているときは、ここの値に現れることがほとんどで、30以下くらいの値になったりします。
逆にここの値が60に近いのに動作がもっさりする場合は、JS以外の要因を疑いましょう。
ここではJSがボトルネックだったと仮定して、さらに細かな分析をする方法を見てみましょう。


## Chromeのデバッグツールによるプロファイリング
具体的にJSのどこの処理がボトルネックになっているかを突き止めるには、**GoogleChromeのperformance計測ツール**を使うとよいです。（ReactNative開発のいいところは、webでの開発体験に極めて近い所ですね。）
先程と同様にシミュレータ上で「Command + D」を押して、「Debug JS Remotely」を押すと、Chromeが開かれますね。
そこで以下のPerformanceタブを使います。
<img width="1276" alt="スクリーンショット 2017-12-02 16.25.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/21920/669430fb-3bd8-fc82-24d4-2759672d2237.png">

「Command + E」を押すと、プロファイリングが始まります。
プロファイル中にシミュレータ上で「もっさりする導線」を踏み、それからプロファイルを停止してください。

プロファイル結果には、**どんな処理が走って、それぞれどのくらい時間がかかったか**が表示されます。

実際に開発中のProgateアプリでは、「エディタへの入力動作がもっさりする」という問題が発生していて、その時にプロファイルした結果が以下でした。
![33113671-cd1ff0b8-cf9c-11e7-8e77-809364be931a.png](https://qiita-image-store.s3.amazonaws.com/0/21920/d07574fe-7756-f91e-d9bf-10fe33b698fe.png)

詳細は控えますが、要するに**実際に必要な処理の50倍くらいの処理が走っていました**。

ここまで原因が特定できてこれば、この無駄な処理が走らないようにすれば、チューニング完了です。

こちらのケースでは、無駄なReactコンポーネントのレンダリングが発生していることが原因でした。
Reactを用いて開発しているケースではよくあることですね。

このようなケースの場合、どのような改善を施せばよいのか。
それはまた別の機会に書ければと思います。

※ちなみに本記事の内容は以下の記事の簡約みたいなものなので、詳しく知りたい人はこちらの記事を見てみてください。

* https://facebook.github.io/react-native/docs/performance.html
BoUoWでファイルマネージャ（GUI）を使い、Windows上のファイルにアクセスする。。

これも備忘録。

環境は、
Windows10
bash on ubuntu on windows(gensim Doc2Vecで日本語処理したいため)
python3


BoUoW側からWinodws10上のファイルをGUIでコピー等したく、いろいろ調べてみると「Nautilus」というものが感覚的に使えそう。


インストール。
---
bash上で、

```
sudo apt install nautilus
```

起動
---

Windo0ws10上「Xアイコン」をクリックで、Xmingを起動。

~~basu上で、~~

```
$ export DISPLAY=localhost:0.0
$ xeyes &
$ DISPLAY=localhost:0.0 nautilus
```

~~nautilusが起動しました。(;´∀｀)~~

（追記開始　20171203）
なお、僕の場合、nautilusを起動してから、テキストエディタを立ち上げ、日本語で編集する場合がほとんどなので、nautilusの起動コマンドは、以下のほうが良いようです。

```
$ export DISPLAY=localhost:0.0
$ xeyes &
$ DISPLAY=localhost:0.0 XMODIFIERS="@im=uim" GTK_IM_MODULE=uim QT_IM_MODULE=uim nautilus &
```

nautilusが起動しました。(;´∀｀)
テキストディタのgeditでにゅほんご入力も可能です。

（追記終了　20171203）


nautilusでWondws上のファイルを参照するには、左側の「Computer」の中の「mnt」をクリックすると、「c」などのWindows上のドライブ名が表示されます。

nautilusを使って、Windows上のテキストファイルをコピーして、BoUoW上にコピーしてみたところ、テキストファイルを開くことはできました(´▽｀)

以上です。
チームにChatOpsをなめらかに浸透させる

[グロービス Advent Calendar 2017](https://qiita.com/advent-calendar/2017/globis) の2日目です。

この記事では、所属するチームでChatOpsを導入する際にハードルになる
**「どうすればChatOpsがチームに広く浸透するのか？」**
について自分がよくやっていることを共有します。

## なぜChatOpsを導入するのか
事業がある程度長く続くと、必ず非効率な運用や属人化している運用が生まれます。
事業のメンバーは入れ替わるものであり、属人化のリスクは避けるべきです。

ChatOpsは属人化を解消するための有効な選択肢のひとつです。

### ChatOpsのメリット
チャットという常に見える化されているインターフェース上で運用を行うことで、
**特定の個人やエンジニアに依存しない運用** が可能になります。

- チャット上に運用の過去ログがすべて残るため、引き継ぎやすい
- 運用を他人に渡したあとも常に可視化されているため、間違いを指摘しやすい

## いかになめらかにChatOpsを浸透させるか
いくらChatOpsを導入しても、自分しか使い方を知らなければ意味がありません。
エンジニアなら勝手に使いはじめるかもしれませんが、それ以外のメンバーにも使って欲しい場合、少し工夫する必要があります。

Botを利用したChatOpsを浸透させたいなら、
**Botを話しかけやすい存在に感じてもらう必要があります。**

### 安全に使えることをアピールする
そもそもエンジニア以外のメンバーは、コマンドでの命令に慣れていないことが多いです。
管理画面であれば~~たとえバグだらけの管理画面でも~~躊躇なく使える人でも、
Bot相手だと変な結果が帰ってこないか心配して使ってくれません。

ある程度どんな使い方をしても問題ないようにチャットでの運用を設計した上で、
**安全に使えることを積極的にアピール**していく必要があります。

わざと間違ったコマンドを叩いて、問題が起きないことを見せるのもありです。

### 自分から積極的に使う
Botは画面が無いので、新機能を追加しても使わなければ誰にも気付いてもらえません。
人の多いチャットで自分から使いまくることで認知度向上を目指します.

軽くコマンドを投げていいんだ、という印象がつくまで続けます。

### 親しみやすいキャラ付け
Botにユニークな名前をつけるのはエンジニアの遊び心ですが、
メンバーが親しみを感じてくれる効果もあると思っています。

業務にまったく関係ない遊び機能も、気軽に話しかけるきっかけになってくれます。
[ruboty-talk](https://github.com/r7kamura/ruboty-talk) などを入れておくと、Botと雜談できるだけでなく、
コマンドをtypoしても雜談が始まるので面白いです。

![bot.png](https://qiita-image-store.s3.amazonaws.com/0/19366/a9381f8f-c7c0-0d9a-ed78-7bdefc98c40c.png)

## おわりに
ChatOpsを上手く導入して、
長期的に運用がスムーズに回る仕組みを作っていきましょう！
チャットツールの心がけ


AdventCalendarな時期がやってきました。
AdventCalendarの記事を書くと、もうすぐ一年が終わるんだなーと感じますね。
~~ちなみに自分12月は師走ならぬ死走(デスマーチ)です。~~

# 概要

昨今、チャットツールを開発に取り入れていないプロジェクトの方が少なくなってきたのではないでしょうか？
自分のプロジェクトでもチャットツールにはSlackを利用しています。

**チャットツールは便利で自由な反面ある程度ルールがないとカオスになる傾向にあります。**
今回は自分の中で心がけるようにしているルールを紹介したいと思います。

※利用するチャットツールとしてSlackを基準に話しています。ただそんなに技術的な話ではないので他のチャットツールでも使えるかと思います。

# 結論

- [ドキュメントとして使わない](https://qiita.com/NorsteinBekkler/private/67477b716998514765c4#%E3%83%89%E3%82%AD%E3%83%A5%E3%83%A1%E3%83%B3%E3%83%88%E3%81%A8%E3%81%97%E3%81%A6%E4%BD%BF%E3%82%8F%E3%81%AA%E3%81%84)
- [複数の議論が走らないようにする](https://qiita.com/NorsteinBekkler/private/67477b716998514765c4#%E8%A4%87%E6%95%B0%E3%81%AE%E8%AD%B0%E8%AB%96%E3%81%8C%E8%B5%B0%E3%82%89%E3%81%AA%E3%81%84%E3%82%88%E3%81%86%E3%81%AB%E3%81%99%E3%82%8B)
- [通知と議論が混ざらないようにする](https://qiita.com/NorsteinBekkler/private/67477b716998514765c4#%E9%80%9A%E7%9F%A5%E3%81%A8%E8%AD%B0%E8%AB%96%E3%81%8C%E6%B7%B7%E3%81%96%E3%82%89%E3%81%AA%E3%81%84%E3%82%88%E3%81%86%E3%81%AB%E3%81%99%E3%82%8B)

## ドキュメントとして使わない

もちろん議論をする場所としてチャットは適切ですが、**その結果はチャット上ではなくwikiやissueに書いて残した方が良いです。**
チャットツールはタイムライン形式でバンバン流れていってしまうので遡るが大変です。
検索やピン留等の機能はありますが、記録を残すという意味で使うには少し使いづらいかと思います。

自分がよくやるのは議論したチャットのリンクをwikiやissueに貼っておき、こんな感じで決まったんだなーというのをわかるようにしています。

↓議論してた箇所、始まりの議論からリンクをコピー
<img width="982" alt="スクリーンショット 2017-12-02 22.28.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/56178/8e7ed322-eb9d-3605-e663-0c23ba13519a.png">

文書としてはesaに記載
<img width="833" alt="スクリーンショット 2017-12-02 22.35.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/56178/402b41bd-5c1f-ea32-e0d9-48081fc9bb95.png">

## 複数の議論が走らないようにする

例えば

- パターン1
  - Zプロジェクトについて話している時に、別の人がXプロジェクトの議論を始めてしまい複数の会話が始まる
- パターン2
  - Aさん、Bさんがある不具合についてチャットで議論している時に、Cさん、Dさんが違う不具合の議論を始めてしまい複数の会話が始まる

### パターン1について 

チャンネルで話す内容の粒度(ジャンルとか)が決まっていないことで起きる問題です。
この問題はある固有のチャンネルを作ることで解決できます。
今回の場合であれば、**Xプロジェクトチャンネル**と**Zプロジェクトチャンネル**を作ることでこの問題は回避できます。
当然、それぞれのチャンネルではそのチャンネルにあった内容のみを発言するようにします。

### パターン2について

これはチャンネルで話す内容はあっているが複数の内容が走ってしまうことで起きる問題です。
自分はこう言う場合は**スレッド**機能を使い回避しています。

こんな感じで議論が長くなりそうなものは**スレッド**で議論するようにしています。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/56178/3591d9bc-f36f-69dd-977c-18c36ae05c86.png)


## 通知と議論が混ざらないようにする

ここでいう通知はクラッシュ通知やインフラエラー通知など、監視通知をさしています。
通知のチャンネルではあくまで通知を見るだけにしています。
議論等はIssueトラッカーを使いそちらで対応するようにすることで、通知と議論が混ざらずみやすいチャンネルになります。

ただ対処したのかどうかわかるようにリアクションをつけたり対応するissueのリンクをスレッドに貼ったりはしています。
![スクリーンショット 2017-12-02 23.41.26.png](https://qiita-image-store.s3.amazonaws.com/0/56178/98d00fed-5468-5215-4788-9a82de09c5e3.png)

# まとめ

チャットツールは便利で自由な反面ルールがないとカオスになりがちです。
ここであげたルールあくまで自分たちのプロジェクトではうまくいっているという話なので、各プロジェクト、環境に合わせて運用していきましょう。

いいコミュニケーションで良い開発を！:smiley:
vim で一発でコメントアウトする

## コメントアウトする(`#`追加)

```vim
noremap <S-s> k$ i#<esc>
```


これはインデントを無視して行の一番左側に`#`を追加するというもの。
言語によってはこの部分を`//`とかに返る必要あり。
普段 shift+s は使わないので、こちらをコメントアウト用に使うことにした。

## コメントアウト取り消し(行頭の一文字削除)

```vim
noremap s k$ x<esc>
```

こちらも普段使わない s を割り当てた。
オフラインリアルタイムどう書くE20 の問題


オフラインでリアルタイムに「どう書く」をやるイベント( https://yhpg.doorkeeper.jp/events/67049 )を行っています。

問題は「迷路」という名前で、詳細は
http://nabetani.sakura.ne.jp/hena/orde20maze/
です。

出題者の気分としては、問題を読み始めてから解けるまで1時間あればなんとかなると思ってますが、ひとそれぞれで。

実装ができた方はこちらのコメント欄からリンクを張っていただくと見つけやすくて助かります。

似たような問題をもっと解きたいという方は、
https://nabetani.hatenadiary.com/entry/yhpg_list
に過去問リンク集がありますので、そちらをご覧になると良いと思います。
[Weekly] GitHubで人気のオープンソースTOP５🌟

11月11日〜18日の間に、GitHubで公開されているオープンソースの中で最もStarが付いたプロジェクトを紹介していきます🌟

![20171120121745.png](https://qiita-image-store.s3.amazonaws.com/0/200848/54223431-300e-cf64-8b25-8fd3a02e89ce.png)


# No.1
#### git-flight-rules
gitのフライトルール
https://github.com/k88hudson/git-flight-rules

# No.2
#### state-of-the-art-result-for-machine-learning-problems  
すべての機械学習の問題について、最先端技術（SoTA）結果の提供
https://github.com/RedditSota/state-of-the-art-result-for-machine-learning-problems



# No.3  
#### nodebestpractices  
最大のNode.JSベストプラクティスのリスト
https://github.com/i0natan/nodebestpractices

# No.4  
#### js-code-to-svg-flowchart  
任意のJavaScriptコードを美しいSVGフローチャートに変換する視覚化ライブラリ
https://github.com/Bogdan-Lyashenko/js-code-to-svg-flowchart 
  
# No.5  
#### tensorflow  
スケーラブルな機械学習のためのデータフローグラフを使用したComputation
https://github.com/tensorflow/tensorflow
vim で挿入モードのまま左右に移動する

### 方法
以下を .vimrc に追加することで、ctrl+h で左に移動、ctrl+l で右に移動できるようになる。

```vim
inoremap ^H ^[ha
inoremap ^L ^[la
```

### 解説
ctrl+h を押したときに`挿入モード離脱->左に移動->挿入モードに戻る`という動作をするようにしている。


### 追記
コメントにて教えていただいたことをふまえ、わかりやすく修正。

```vim
inoremap <C-h> <Left>
inoremap <C-l> <Right>
```
1分あれば十分、最高のdubパッケージ設定（D言語くんもいるよ）

# はじめに
今年やって最高にエモかったdubパッケージの設定をご紹介します。

手前みそですが、D言語アドベントカレンダーで公開された設定記事の応用編になります。

- ちょっと便利なdubパッケージの作り方紹介（copyFilesでWindowsでも快適な開発をする）
    - [https://qiita.com/lempiji/items/74c78e0240e5d6ab6dd4](https://qiita.com/lempiji/items/74c78e0240e5d6ab6dd4)

Windows開発で Visual Studio Code を使っていますが、基本的にOS問いません。
なお、動画中の補完などはcode-dというプラグインのおかげです。最高。


とまぁ、もう見てもらうのが一番速いと思うので、以下ご参照ください！

# 設定手順

コマンドプロンプトで適当にディレクトリを作って、パッケージとして初期化します。

![20171202_153707.gif](https://qiita-image-store.s3.amazonaws.com/0/11612/3bbc0514-845c-4a5b-d3ca-765e6f01a637.gif)
（20秒弱）

ここで Visual Studio Code を起動して、設定を追加、実行


![20171202_154638.gif](https://qiita-image-store.s3.amazonaws.com/0/11612/b688394e-e2b7-6f07-5a9c-5656137900aa.gif)
（ビルドと実行含めて30秒くらい）

# 設定内容
以上、`preGenerateCommands`を設定してビルド時にD言語くんを走らせる設定でした。
追加した内容は以下の通りです。

```json
{
  "preGenerateCommands": [
    "dub fetch dl",
    "dub run dl"
  ]
}
```

`dub fetch dl`で`dl`というパッケージをダウンロードし、`dub run dl`で実行する設定です。

こちらのdlパッケージは[2016年のD言語くんアドベントカレンダー記事](https://qiita.com/lempiji/items/03629cd46fcbd948ca41)で自作したものです。
Windowsのコマンドプロンプトだとエスケープシーケンスの兼ね合いで表示が崩れるので、開発は Visual Studio Code がおすすめですよ！（コマンドプロンプトでなければ多分だいたいOK）

# まとめ
D言語くん最高にウザかわいい！

邪魔！！このあと10秒で消した！！！！
PostgreSQL 10パラメータ差分

# はじめに
にゃーん
この記事は、[PostgreSQL 10全部ぬこ Advent Calendar 2017](https://qiita.com/advent-calendar/2017/pg10-nuko-only) の8日目のエントリです。

# PostgreSQLパラメータの差分をとってみる
毎回、新バージョンのベータ版がでそうな時期に、PostgreSQLパラメータの調査をするんだけど、そのときに前バージョンとの比較も実施する。
比較方法として最初に思いつくのは```SHOW ALL```で、前バージョンと新バージョンの出力結果をとって、その差分を見るというものだが、意外とこの方法は面倒くさい。
というのは、```SHOW ALL```では、name(パラメータ名)、setting(設定値)、description(説明)を表示するのだが、パラメータ名や設定値に変更がなくとも、説明の変更が入ることがあり、それが差分として出力されてしまう。また、説明の変更により1行の最大長が変わると、diffとるときに全体に影響が出かねない。面倒な。

なので、自分で差分を調査する場合には、psqlをつかって、以下のような手順でpg_settingsカタログを直接SELECTで参照することが多い。

* 前バージョン、新バージョンそれぞれinitdbしておき、パラメータを変更せずに起動する。
   * portの差分はでるが、それは既知のことなので差分としては無視できる。
* psql上で差分をとる
   * psqlに特権ユーザでログインする
   * \a メタコマンドでnoalign設定にする。
   * \o filename で出力結果をファイルに出力する。
   * ```SELECT name, setting, source, enumbals FROM pg_settings ORDER BY name```を実行する。
* 前バージョン・新バージョン上で差分を取得し、diff等で差分をとってみる。

この方式だとdescriptionの差分は対象にならない。今回は追加されたパラメータ名や、設定値のデフォルトを対象に差分を見ていく。

# PostgreSQL 9.6とPostgreSQL 10のパラメータ差分

|パラメータ名|区分|変更内容|
|:--|:-- |:--|
|enable_gathermerge|パラメータ追加|パラレルクエリ関連のパラメータ|
|hot_standby|デフォルト値変更|off -> on|
|log_directory|デフォルト値変更|'pg_log' -> 'log'|
|log_line_prefix|デフォルト値変更| '' -> '%m [%p] '
|max_logical_replication_workers|パラメータ追加|デフォルト値は4|
|max_parallel_workers|パラメータ追加|デフォルト値は8|
|max_parallel_workers_per_gather|デフォルト値変更|0 -> 2|
|max_pred_locks_per_page|パラメータ追加||
|max_pred_locks_per_relation|パラメータ追加||
|max_replication_slots|デフォル値値変更|0 -> 10|
|max_sync_workers_per_subscription|パラメータ追加||
|max_wal_senders|デフォルト値変更|0 -> 10|
|max_wal_size|デフォルト値変更|64 -> 1024|
|min_parallel_relation_size|パラメータ削除|min_parallel_index_scan_sizeとmin_parallel_table_scan_sizeに分離|
|min_parallel_index_scan_size|パラメータ追加||
|min_parallel_table_scan_size|パラメータ追加||
|min_wal_size|デフォルト値変更|5 -> 80|
|password_encryption|デフォルト値変更|on -> md5, 型もbooleanからenumに変更されている|
|sql_inheritance|パラメータ削除||
|ssl_dh_params_file|パラメータ追加||
|wal_consistency_checking|パラメータ追加||
|wal_level|デフォルト値変更|minimal -> replica|

今回も新規機能の追加によって増えたパラメータや、パラメータの細分化により削除＆追加されたものもあるが、デフォルト値変更も結構多い。
特徴としては、

* パラレルクエリ
* ストリーミングレプリケーション

に関するパラメータのデフォルト値が変更され、デフォルトのままでも上記の高度な機能を利用可能にしていることが挙げられる。

# おわりに
今日はちょい手抜きです。たまにはそんな日があってもいいよね？

# 参考：該当するリリースノート
本エントリに関連するPostgreSQL 10リリースノートの記載です。

E.2.2. Migration to Version 10

> * Increase the size of the default DH parameters used for OpenSSL ephemeral DH ciphers to 2048 bits (Heikki Linnakangas)
> * Remove sql_inheritance server parameter (Robert Haas)

E.2.3.1.1. Parallel Queries

> * Add max_parallel_workers server parameter to limit the number of worker processes that can be used for query parallelism

E.2.3.1.3. Locking

> * Allow tuning of predicate lock promotion thresholds (Dagfinn Ilmari Mannsåker)

E.2.3.1.9.1. Write-Ahead Log (WAL)

> * Add wal_consistency_checking server parameter to add details to WAL that can be sanity-checked on the standby (Kuntal Ghosh, Robert Haas)

E.2.3.2. Replication and Recovery

> * Reduce configuration changes necessary to perform streaming backup and replication (Magnus Hagander, Dang Minh Huong)
AnacondaのQT Designer

# Anaconda/Pythonのバージョン
インストールしたバージョンは下記の通り

Anaconda 5.0.1 For Windows
Python 3.6 version

# QT Designerの場所
C:\ProgramData\Anaconda3\Library\bin\designer.exe
"C:\ProgramData\Anaconda3"はデフォルトのままインストールした場合

# uiファイルからpyファイルへの変換
pyuic5 （パスが通っているので何処からでも実行可能）
Vimium-FF で Firefox Quantum を Vimperator っぽく使う

[Firefox](https://www.mozilla.org/ja/firefox/) の新バージョン、Firefox Quantum がリリースされましたね。
私は Firefox のアドオン [Vimperator](https://addons.mozilla.org/en-US/firefox/addon/vimperator/) を使っていたのですが、今回のアップデートで Vimperator は Legacy なアドオンとなってしまいました。

何か代わりになるものを見つけなくては! と思いアドオンを探したところ、[Vimium-FF](https://addons.mozilla.org/en-US/firefox/addon/vimium-ff/) に落ち着きました。元々 [Google Chrome](https://www.google.co.jp/chrome/browser/desktop/index.html) の [Vimium](https://chrome.google.com/webstore/detail/vimium/dbepggeogbaibhgnhhndojpepiihcmeb) エクステンションをカスタマイズして使っていたので、同じ設定内容を使えるということが一番のポイントになりました。

Vimium, Vimium-FF デフォルトのキーマップは Vimperator とは異なるのですが、Vimperator でよく使っているキーマップにカスタマイズしてみたので紹介します。

# カスタマイズ例
### 設定方法
* ツールバーの Vimium アイコンをクリック
* ポップアップ左下の options リンクをクリック
* Custom key mappings に次の内容を入力して Save

### Custom key mappings
```
# Insert your preferred key mappings here.
# Exit insert mode
map <c-[> exitInsertMode

# Scrolling
map <c-d> scrollPageDown
map <c-u> scrollPageUp
map <c-f> scrollFullPageDown
map <c-b> scrollFullPageUp

# History and tabs
map <c-o> goBack
map <c-i> goForward
map <c-n> nextTab
map <c-p> previousTab
unmap x
unmap d
map d removeTab
unmap X
unmap u
map u restoreTab
map g^ firstTab

# Buffer information
unmap gs
unmap gf
map gf toggleViewSource

# Motion commands
map 0 scrollToLeft
map $ scrollToRight

# Getting help
map :h showHelp
map <F1> showHelp
```

Google Chrome では Vimium を、Firefox では Vimperator と使い分けていたのですが、ブラウザを切り替える度に少し意識して操作する必要がありました。今回 Vimium, Vimium-FF で Firefox Quantum、Google Chrome 両方で同じ設定を利用するようになり、ブラウザの切り替えを意識せず操作できるようになりました。

Firefox Quantum にアップデート後に Vimperator ライクなアドオンを探している方、Vimium-FF おすすめですよ!

# リンク
* [Firefox](https://www.mozilla.org/ja/firefox/)
* [Vimperator](https://addons.mozilla.org/en-US/firefox/addon/vimperator/) 
* [Vimium-FF](https://addons.mozilla.org/en-US/firefox/addon/vimium-ff/)
* [Google Chrome](https://www.google.co.jp/chrome/browser/desktop/index.html)
* [Vimium](https://chrome.google.com/webstore/detail/vimium/dbepggeogbaibhgnhhndojpepiihcmeb)
jaeger-client-goでZipkinトランスポートを使う方法

[`transport/zipkin/example_test.go`](https://github.com/jaegertracing/jaeger-client-go/blob/d4bdc58310bbed1afd2357e442bdc6ece3d489b6/transport/zipkin/example_test.go#L29-L32)を参考に、以下のようにZipkinへのReporterをTracerに設定する。

```golang
transport, err := zipkin.NewHTTPTransport(
    "http://169.254.123.123:9411/api/v1/spans",
    zipkin.HTTPBatchSize(10),
    zipkin.HTTPLogger(jlog.StdLogger),
)
if err != nil {
    log.Fatalf("Cannot initialize Zipkin HTTP transport: %v", err)
    }
tracer, closer := jaeger.NewTracer(
    "my-service-name",
    jaeger.NewConstSampler(true),
    jaeger.NewRemoteReporter(transport, nil),
)
defer closer.Close()
opentracing.SetGlobalTracer(tracer)
```

ポイントは、

- jaeger.NewTracerにはReporter（Spanを送るコンポーネント)を設定できる
- `jaeger.NewRemoteReporter(transport, nil)`で`transport`経由でネットワーク越しにSpanを送るReporterをつくれる
- `zipkin.NewHTTPTransport`でZipkin HTTP Endpoint宛のTransportをつくれる
- `zipkin.NewHTTPTransport`の第一引数にZipkin HTTP EndpointのURLを指定する

Zipkin HTTP EndpointのURLは基本的に、`http://$ZIPKIN_HOST:9411/api/v1/spans`
という形式になるはず。

# 応用

- [Kubernetesにdd-agent + dd-zipkin-proxyをデプロイする](https://qiita.com/mumoshu/items/079dbd17af8433ba3749)場合、Zipkin HTTP Endpoint URLは`http://$MAGIC_IP:9411/api/v1/spans` のようにする
    - Zipkin HTTP Endpointを各ノードに起き、$MAGIC_IPへアクセスすると各ノードのZipkin HTTP EndpointにDNATされるようにしておく
現場で使うDB2コマンド

##はじめに
普段使いのコマンドをまとめてみました。
分類は後で変えるかも。
※{INSTALL_DIR}：
　インストールディレクトリ。/opt/IBM/db2/Vx.x/　のようなパス。
※2017/12/2 ご指摘いただいた箇所を一部修正しました。

##専用のスクリプトを使用するもの
ライセンス情報取得
`{INSTALL_DIR}/adm/db2licm -l`

DBバージョン取得
`{INSTALL_DIR}/bin/db2level`

インスタンス一覧
`{INSTALL_DIR}/bin/db2ilist`

##db2用コマンドを使用するもの
*※db2コマンドを実行可能なユーザであることが前提*
DB一覧
`db2 list db directory`

DB一覧（アクティブなもの）
`db2 list active database`

テーブルスペース情報
`db2 list tablespaces show detail`

インスタンスレベルのレジストリ確認
`db2set -all`

DB2インスタンス起動
`db2start`

DB2インスタンス停止
`db2stop force`

データベース接続
db2 connect to {DB名} user {username} using {password}

データベース活性化
`db2 "activate database {DB名} user {username} using {password}`

データベース非活性化
`db2 "deactivate database {DB名} user {username} using {password}`

##パラメータ操作関連
データベースマネージャ情報(インスタンスレベルのパラメータ)取得
`db2 get dbm cfg`

データベースマネージャ情報(インスタンスレベルのパラメータ)更新
`db2 update dbm cfg using {パラメータ名} {更新値}`

データベース情報(各データベースレベルのパラメータ)取得
`db2 get db cfg for [DB名]`
または
`db2 get database configuration for [DB名]`

データベース情報(各データベースレベルのパラメータ)更新
`db2 update db cfg for [DB名] using {パラメータ名} {値}`


##SQLを使用するもの
スキーマ一覧
`SELECT SCHEMANAME,OWNER FROM SYSCAT.SCHEMATA`
Wordpressの管理画面にアクセスしようすると/wp-admin/install.phpにリダイレクトされる

いつの間にか、管理画面にアクセスしようとすると、`wp-admin/install.php`にリダイレクトされ、下記の様ん画面が表示され、「ログイン」を押してもログイン画面にいけない症状になりました。

<img width="807" alt="screenshot 2017-12-02 15.31.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/4404/6530e985-ee17-6ddb-ccae-c02f383ee5cb.png">

```
すでにインストールされています
すでに WordPress をインストール済みのようです。再インストールするには、まず以前のデータベーステーブルを削除してください。
```

原因は、よくわからないのですがphpMyAdminから「テーブルの最適化」をすると治りました。

[こちらの記事](https://webkaru.net/mysql/phpmyadmin-optimize-database/)には、「オーバーヘッド」が溜まっている場合に有効とあるのですが、確認したところでは全てのテーブルで「-」でした。でも、ものは試して、全テーブルを選択して「テーブルを最適化」すると、治りました。

謎…。

このところ、CoreserverでDBが勝手にUTF-8からEUCに変わっていたり、不可解なことが多いのでかんれんがあるのかしら…？
イーサリアムとビットコインの比較

**そもそも根本的に全然違う**

## 根本的な違い
- ビットコインは、ブロックチェーンで構築していますが、仮想通貨（しかも１つしかない）に特化している
- イーサリアムは、最初から「分散アプリケーションのプラットフォーム」として設計されている
- なので、アカウントの残高を照会するの処理は全然違う、詳細お話は、参考記事どうぞ　[イーサリアムの残高照会「アカウント」とは　＜ビットコインとの違い＞ - とってもやさしいビットコイン](http://www.tottemoyasashiibitcoin.net/entry/2017/10/14/185918)

## スマートコントラクトアカウント
- ビットコインは、~~1種類のアカウントしかない~~ そもそもアカウントという概念はなく、単にアドレスを持っている。とあるアドレスの残高を確認したい場合、そのアドレス宛に送金した金額とそのアドレスから別アドレスに送信した金額を合算して残高を表示するだけ。
- イーサリアム上では、**アカウント** という概念があってアカウント毎に残高、nonce、コード、ストレージを持ってます。普通のアカウント（外部所有アカウント: EOA (Externally-owned Account)）とコントラクトアカウント（Contract Account）2種類あります。
    - 普通のアカウントは、ビットコインのアカウントと同じ、送金などができます
    - コントラクトアカウントはキモです。
- コントラクトアカウントは、残高以外、実行できるプログラムコード（厳密に言うとコンパイル済みのバイナリコード）を持っている
- コントラクトアカウントに送金すると、特定な関数（無名関数）が呼びされ、そこに定義されている処理が実行される（たとえば、受け取ったETHをオーナーアカウントに転送するとか、だれからどのぐらいをもらったかを記録しておくとか）
- 送金以外、そのコントラクトの情報を知っている場合、定義されている関数を呼び出すのもできる
- コントラクト関数実行については、書き込みがある場合、ブロックチェーンに書き込むので、マイニングが必要になるが、読み取るだけなら、マイニング不要

## GASという発明
- ビットコインもスマートコントラクトがありますが、チューリング不完全であり、繰り返しさえできない。なぜかと言うと、ノードがトランザクションを計算する際無限ループがあると、簡単にネットワーク全体のDDOS攻撃になってしまうので、それを避けるために敢えてチューリング不完全にしている
- この問題に対するイーサリアムの回答は、GASである
- イーサリアム上でトランザクションを計算する際、各計算のステップ毎に課金される、その課金の単位はGAS。
- トランザクションを作成する時は、GASの上限指定は必須です。
- 実際トランザクションを計算する時、各計算ステップ毎の必要なGASを集計する
    - 合計値はGAS上限値を超えてなければ計算し、処理を実行する（結果をブロックチェーンい書き込むとか）
    - GAS上限値を超えた場合、その場で停止し、処理を実行しない、トランザクションがブロックチェーンに書き込まれない。ただ、計算に掛かる費用（GAS）は送信者に戻さない

## 参考記事
- [技術者向け Ethereumの基礎知識 (イーサリアム、エセリウム) | block-chain.jp](http://block-chain.jp/tech/ethereum-basics-for-engineer/)
- [イーサリアムの残高照会「アカウント」とは　＜ビットコインとの違い＞ - とってもやさしいビットコイン](http://www.tottemoyasashiibitcoin.net/entry/2017/10/14/185918)
青空文庫のごく簡単な紹介

こちらは「青空文庫 Advent Calendar 2017」の第1日目の記事で、青空文庫の「Advent Calendar」の記事としても初めての記事です。Qiita に書ける記事ならどんな内容でも歓迎で、参加者を募集しております。

# 青空文庫とは

1997年7月7日に生まれたインターネット上の図書館です。代表者はいません。主な蔵書は著作権の保護期間を過ぎた作品です。

これ以上の情報は以下をご覧ください。

* [青空文庫編 青空文庫早わかり](http://www.aozora.gr.jp/guide/aozora_bunko_hayawakari.html)
* [青空文庫編 青空文庫ＦＡＱ](http://www.aozora.gr.jp/guide/aozora_bunko_faq.html)
* [aozorahack](http://aozorahack.org/)

プログラマ向けの用途としては自然言語処理のためのコーパス（言語資源）として使うことが多いです。

## データで見る青空文庫

http://www.aozora.gr.jp/index_pages/person_all.html で公開されているデータを利用しています。

* 手元の2年ほど古いデータを使用しているため、最新版では少し異なるかもしれません。
* 底本情報を削除していない状態でデータを使っています。

### 収録作品数

#### 2017/12/2 時点
14477作品（著作権なし：14192、著作権あり：285）

#### 手元のやや古いデータ
13087作品（著作権なし：12838、著作権あり：249）


### ジャンル（[日本十進分類法](https://ja.wikipedia.org/wiki/%E6%97%A5%E6%9C%AC%E5%8D%81%E9%80%B2%E5%88%86%E9%A1%9E%E6%B3%95)）別作品数

グラフを描こうかと思ったのですが、NDCの分類記号と分類名のテーブルを作る時間がありませんでした。以下のリンク先がよくまとまっているのでご覧ください。

[青空文庫の分析（作品のNDC分類及び作品数の多い著者）](http://dac01.sakura.ne.jp/projects/misc/statics_aozora.html)

### 字数

[箱ひげ図の描画ができるWebサービス](http://keisan.casio.jp/exec/system/14030554020131)を利用して、NDCが「913」（文学 日本文学 小説、物語）の作品とその児童向け作品（NDC:K913）で比較してみました。結果、以下のことが分かりました。

* 大半の作品（作品数の75%）より極端に長い作品が存在する。
* 当然ながら児童向けの作品のほうが短い傾向にある。

![スクリーンショット 2017-12-02 5.53.15.png](https://qiita-image-store.s3.amazonaws.com/0/28110/12138c00-c958-de88-b7ba-3b4f8c61f212.png)

最短の作品：夢野久作『[医者と病人](http://www.aozora.gr.jp/cards/000096/card46717.html)』
最長の作品：宮本百合子『[道標](http://www.aozora.gr.jp/cards/000311/card2012.html)』

#### 常用漢字率

|NDC|常用漢字|常用外漢字|常用漢字率|
|-----|----------|----------|------|
|913  |23152471字|11405210字|67.00%|
|K913 |1567554字 |1203481字 |56.57%|

予想に反して児童向け作品のほうが常用漢字率が低いという結果になりました!?

集計スクリプト：

```perl
#!/usr/bin/env perl

use strict;
use warnings;
use utf8;
use open qw/:utf8 :std/;
use DBI;
use feature qw/say/;
use Lingua::JA::KanjiTable;

my $db = DBI->connect('dbi:SQLite:dbname=bunko.sqlite3', '', '', {
    RaiseError     => 1,
    sqlite_unicode => 1,
});

my $sth = $db->prepare(q|SELECT text_raw_utf8 FROM work JOIN NDC ON work.id = NDC.work_id WHERE ndc = 'K913'|);
$sth->execute;

my $joyo_count = 0;
my $joyogai_count = 0;

while (my $row = $sth->fetchrow_hashref) {
    for my $chr (split(//, $row->{text_raw_utf8})) {
        if ($chr =~ /\p{Han}/) {
            if ($chr =~ /\p{InJoyoKanji}/) {
                $joyo_count++;
            }
            else {
                $joyogai_count++;
            }
        }
    }
}

say "常用漢字：${joyo_count}字";
say "常用外漢字：${joyogai_count}字";

say '常用漢字率：' . sprintf('%.2f', $joyo_count / ($joyo_count + $joyogai_count) * 100) . '%';
```

# 書いて思ったこと
* NDCの分類番号と分類名の変換ライブラリが欲しい。
* Qiitaの記事である以上、プログラミングよりの技術記事でならねばならないのが枷になりそう。

12月2日は @takahashim さんの「[aozora2htmlのご紹介](https://qiita.com/takahashim/items/83706685ba1721f61eec)」です!
Ripple Developer Center メモ

#Transaction Timeline(トランザクションの流れ)
1. あるアカウントがトランザクションを作成し，署名する。
2. そのアカウントは，ネットワーク(Rippleネットワーク)に候補トランザクションとして，そのトランザクションを提出(送信)する。
3. トランザクションの検証と合意を経て，トランザクションは台帳に組み込まれる。
検証に失敗したトランザクションでさえも台帳に組み込まれる(このあたりはビットコインと異なるところですね。ネットワークに多量のトランザクションを与え，攻撃することを防ぐ機能がこれにあたると推測しています)。
4. そのトランザクションは検証された台帳に含まれ，台帳の状態に反映される。トランザクションの結果は，暫定的な状態ではなく不変なものとなる(このあたりもビットコインと異なるところで，複数回の検証を待たずにトランザクションが確定されることを表していると思われる)。

#翻訳元はこちら
https://ripple.com/build/reliable-transaction-submission/
Rで音声信号処理(1)

# はじめに
音声信号処理をRでやっている人が少なそうなので，気が向いた時に書いてみたい。便利だよ。

# Rの基礎知識
は，あると想定しております

# Waveファイルの扱い
## パッケージ導入
Waveファイルを扱うには，tuneR パッケージを使う。

```R:
install.packages("tuneR")
```

で導入しておこう。
## 読み書き
Waveファイルを読むのは`readWave()`，書くのは`writeWave()`

```R:
library(tuneR)
w <- readWave("foo.wav")
writeWave(w,"foo2.wav")
```

`readWave()`が返すのは（元のWaveが2チャンネル以下の場合）Waveオブジェクト。

* `w@left` は左チャネル（1番目のチャネル）の値を表すベクトル
* `w@right` は右チャネル（2番目のチャネル）の値を表すベクトル
* `w@stereo` は1チャネル信号なら FALSE，2チャネル信号なら TRUE
* `w@samp.rate` はサンプリング周波数
* `w@bit` は量子化ビット数
* `w@pcm` はPCM形式かどうか（PCMでなければ浮動小数系列）

`w@left`を取り出して使えば，音データをサンプル値列として使うことができる。Matlabと違って，読んだ時点で正規化は行われないので，16ビット量子化なら-32768～32767の値を持つ。

MP3ファイルは読むことだけできる。関数は`readMP3(filename)`

# 再生・表示
`play(w)` で外部の再生アプリを呼び出して音を再生する(Windowsの場合にはMedia Playerが呼ばれる）。アプリを終了しないとRに制御が戻らない。再生に使うアプリは`getWavPlayer()`でチェックでき，`setWavPlayer()`で指定ができる。

`plot(w)`で波形を表示する。サンプルを1点ずつ表示しているわけではなく，長い波形でも高速に描画する。

# 基本的な操作

* `channel(w,"left")` 特定のチャネルを選ぶ。結果もWaveオブジェクト
* `extractWave(w,from=0,to=1,xunit="time")` 音声きりだし。fromとtoで始点と終点を指定。`xunit="time"`だと時間（秒），`xunit="samples"`だとサンプル数として始点と終点の数字を解釈する。
* `Wave(vector,samp.rate=16000,bit=16)` ベクトルをWaveオブジェクトに変換する。

# こんなこともできる
## スペクトル分析

* `powspec(vector,sr=samplingrate,wintime=0.25,steptime=0.10,dither=FALSE)` 
パワースペクトル計算。窓関数はハミング
* `audspec(powerspectrum,sr=samplingrate,fbtype="bark")` 聴覚スペクトルの計算。入力はパワースペクトル
* `melfcc(w)` MFCC計算。そのままだとHTKとは若干定義の違う計算をする。パラメータを調整することでHTK互換にすることが可能（やりかたはマニュアルに書いてある）。
* `deltas(x,w=windowlength)` Δ係数の計算。`windowlength`は計算のフレーム幅（デフォルトは9）。これを使うと，次のような感じでMFCC+Δが計算できる。

```R:
mfc <- melfcc(w)
mfc <- cbind(mfc,deltas(mfc))
```
Javaによるカルマンフィルターの実装方法

なんでもフィルタリングできて手軽に実装できるカルマンフィルター！
Javaでの実装例がなかったのでメモとして書いておきます。



```java
    public static void main(String[] args){
        ArrayList<Double> result = new ArrayList<Double>();
        double now = 0;
        double xPre = 0;
        double pPre = 0;
        double  sigmaW = 0;
        double sigmaV = 0;
        //引数指定　1 sigmaW , 2 sigmaV
        sigmaW = Integer.parseInt("5");
        sigmaV = Integer.parseInt("50");
        Scanner sc  = new Scanner(System.in);
        while(true){

            now = sc.nextDouble();
            if(now == -1){
                break;
            }
            double xForecast = xPre;
            double pForecast = pPre + sigmaW;
            double KGain = pForecast/(pForecast + sigmaV);
            double  xFiltered = (xForecast + KGain*(now - xForecast));
            double pFiletered = (1-KGain) * pForecast;
            result.add(xFiltered);
            System.out.println(xFiltered);
            xPre = xFiltered;
            pPre = pFiletered;
        }
        System.out.println("-------------------------------");
        for(Double out : result){
            System.out.println(out);

        }

    }
```

sigmaWとsigmaVの組み合わせによってフィルタリングの度合いが変わってきます。

これを利用してAPI化することによって様々な数値をフィルタリングさせることができます。

ここではリストとして出力しているがリアルタイムで値を出力させることもできます。
照度センサを用いた鍵の状態把握装置を作ってみた（node.js初心者の備忘録）

#1.概要

![image.png](https://qiita-image-store.s3.amazonaws.com/0/217539/6e37c5d8-7bfd-b477-01b7-fc10db73b0b2.png)

上司「はい」（おもむろに赤い四角いものを配っていく）
ぼく「これは…」
上司「このセンサを使って二ヶ月で面白いもの作ってよ」
ぼく「…（なんだろうこれ…）」

以下に二ヶ月間の備忘録とその成果を記す

#2.備忘録
###2.1 センサをいじってみて（node.js初心者が詰まったところ）

 どうやらこのセンサはtexas instrumentsが出しているセンサで，node.jsで実装されていることが分かりました．

　とりあえずセンサを使うので連続して値を取りたいなと考えコードをいじりましたが，javascript触ったことなかったのでまずコードの見方がわかりませんでした．

![image.png](https://qiita-image-store.s3.amazonaws.com/0/217539/c1edf4a7-b9ba-0051-6c15-27cf7b676bfe.png)


まずはasyncの説明です


asyncはjavascriptに同期的な仕組みを提供するメソッド群です．今回はたくさんあるメソッドの中でasync.seriesというものを使用しています．

async.seriesの仕様は↓を参考にしてください，要は順番に動きます．
http://qiita.com/takeharu/items/84ffbee23b8edcbb2e21


asyncはコールバックの記述方法を簡略化する目的で使用されるようです．詳しくはコールバック地獄とかで調べてみてください．
async.seriesは引数に，関数の入った配列（要素は何個でも良い）を取り順に実行します．
今回は関数に名前が付いていませんが無名関数というやつで，他で呼び出さないので名前をつけていないのでしょう．


基本はコールバックなので，配列内の関数の引数にはcallback変数を記述し，関数内でcallback();を使用し次の関数を呼び出しています．
↓のリンクがわかりやすかったです．
http://nkmrkisk.com/archives/1157

###2.2センサーから値を連続して取る際の問題点
　センサーから値を連続して取るならfor文を使いたくなりますが，forループでは問題が発生します（理由は割愛）．
　
　またasync.foreverメソッドという同期処理内でのループ処理をサポートするメソッドも存在していますが，引数に関数を一つしか取れないため，今回の実装にはそぐわなかったです．

仕様↓
https://techacademy.jp/magazine/5537
使用例↓
http://tomosoft.jp/design/?p=6060

![image.png](https://qiita-image-store.s3.amazonaws.com/0/217539/889ae16e-7a88-8e98-c141-6030f76bcafa.png)

実装してみると無事にデータが取れデータが取れました．

#3 成果

二ヶ月間考えた結果，ドアの鍵の状態を判定する装置が完成した．

・センサから光の強さを判定
・光の強さをデータベースに保存（node.jsのデータベースで実装↓）https://realm.io/jp/blog/first-object-database-realm-node-js-server/
・センサ値に以上があれば自分のメールアドレスに異常を送信（pythonで実装，今回は割愛）

形はこんな感じ．

![image.png](https://qiita-image-store.s3.amazonaws.com/0/217539/4479e8f8-757a-aa88-b402-6f20879c1282.png)
 
そして結果はこれ，不恰好だけど正しく判定できてる

<img width="990" alt="スクリーンショット 0029-12-02 午後2.36.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/217539/e8fe0254-1c0c-29d1-c987-6315d3a3ce52.png">

#4 まとめ

　IoTが流行りだが，自分でそれを形にしようと思うと意外とアイデアが出てこないものだと感じた．
　実務以外の活動を通して，node.jsやrealmに触れられ，新しい言語やソフトウェアに触れられ貴重な経験だった
　node.js初心者がつまずく非同期処理や，同じセンサをこれから使う人たちの助けになれば幸いです．