OmniAICreator/Qiita-1.07M huggingface dataset:
さくらのVPSにSSHでログインする

#はじめに
[さくらのVPSにUbuntu16.04 LTSをISOイメージインストールの方法でインストールする](http://qiita.com/fable_darts/items/17f7c90df5d7a2d5f640)の続きです。OSをインストールしてからローカル(自分のパソコン)の端末(Macでいうターミナル)を用いてSSH接続ができるまでの流れを書いていきます。
#環境
さくらVPSサーバー(OSはUbuntu16.04 LTS)
ローカルでは仮想マシン(Virtualbox)下でUbuntu14.04 LTSをインストールしていてそこの端末上でsshなどのコマンドを打っている。
#初期段階
OSのインストールが終わったあと端末上でssh接続しようとしました。
```ssh -l root IPアドレス```
のコマンドを打ちました。IPアドレスは契約した後に受信したメールに書いてありました。
しかしこれでは接続ができませんでした。というよりずっと処理中でエラーメッセージすら吐かなかったです。
#原因
~~契約したサーバ側でSSHサービス(sshd)が起動していなかった。sshdが起動していないとsshができないのです。カスタムOSインストールでUbuntuを入れたときは分かりませんが、ISOイメージインストールでUbuntu16.04 LTSを入れたときはsshdが起動していないみたいです。~~
前回の[さくらのVPSにUbuntu16.04 LTSをISOイメージインストールの方法でインストールする](http://qiita.com/fable_darts/items/17f7c90df5d7a2d5f640)で新しくOSをインストールしたので、そこで決めたユーザー名とパスワードでログインしなければいけなかった。
#基礎知識
設定に入る前に少し知識を洗っておきましょう。
##SSHとは
ネットワーク通信(ここではローカル側とサーバー側)を暗号化してくれるプロトコル。
##OpenSSHとは
SSHプロトコルを用いてネットワーク通信を行うソフトウェア。
##ローカルからサーバー側にSSHでログインするには
ホスト名とユーザー名の二つで認証を行う必要があります。その認証にあたって必要なことは具体的には以下の事です。
1. ローカル側にサーバーのホスト公開鍵を登録する
これは自動的にしてくれるので手動で何かしなくてもいいです。
2. ローカル側の公開鍵をサーバーに登録する
これは自動ではないので後述しますがコマンドを入力してやります。

2はユーザー認証に使うのですが、ローカル側の公開鍵をサーバーに登録せずにパスワード(OSインストールしたときに登録したパスワード)でユーザー認証をすますことも可能です。ただし、パスワード認証はパスワードが特定されて情報が漏洩する可能性が高いため、パスワード認証はあまり推奨できません。

#SSHの設定
まず、VNCコンソールを起動してその後に、sshdデーモンの設定ファイル(```/etc/ssh/sshd_config```)を開きましょう。

##ユーザー認証を、パスワード認証で許可する方法
- ```PasswordAuthentication yes```の文を追加しましょう。
- ファイルを保存して再起動しましょう。(```sudo reboot```とコマンドを打ってください。)

これで、パスワードを用いて認証ができるようになりました。
次にローカル側で端末を開きます。そしてその端末上で
**```ssh  ユーザー名@ホスト名 ``` と打ちましょう。これでつながったはずです。**
(以後VNCコンソールでなくてもローカル側でsshコマンドを打てばサーバーに接続できるようになった。)
ポート番号に関しては先ほど入力したポート番号です。ユーザー名は[さくらのVPSにUbuntu16.04 LTSをISOイメージインストールの方法でインストールする](http://qiita.com/fable_darts/items/17f7c90df5d7a2d5f640)で登録したユーザー名です。このコマンドを入力すると、パスワードが求められるのですが、これも前回登録したパスワードを用いてください。
##ユーザー認証を、公開鍵で許可する方法
パスワード入力は先述の通り、セキュリティー上の問題があるのでなるべく使わない方がよいとされていて公開鍵を用いるこっちの認証方法の方がよくとられます。ここからはローカル側とサーバー側でややこしくなりますがついてきてください。
###流れ
- 公開鍵の作成(ローカル側)
ローカル上で```ssh-keygen -t rsa```と入力しましょうenterキーを押していると```~/.ssh/```というディレクトリができてそこに```id_rsa```と```id_rsa.pub```ができるはずです。
- 公開鍵をサーバー側にのっける(sftp) まずローカル側で```~/.ssh/```ディレクトリに移動して、```sftp ユーザー名@ホスト名```とコマンドを打って、```id_rsa```と```id_rsa.pub```を```put```してください。
- サーバーにのっけられた公開鍵を登録する(サーバー側) ```ssh```でサーバーに接続した後に、ローカル側で転送された```id_rsa```と```id_rsa.pub```を```~/.ssh/```ディレクトリに移動させた後そのディレクトリ下で```cat id_rsa.pub >> authorized_keys```と打ってください。これで公開鍵が登録されたことになります。また、パスワード認証をするのをやめたいので、```/etc/ssh/ssh_config```ファイルの```PasswordAuthentication yes```をコメントアウトさせておきましょう。
- 公開鍵を認証エージェントに登録する(サーバー側) 認証エージェントというのは何かという説明の詳細はここでは省きますが簡単に言うならば、いちいちユーザーが秘密鍵を作るのを省略してくれるデーモンの事です。```~/.ssh/```ディレクトリの下で```ssh-agent bash```とコマンドを打ちましょう。そのあとは
    1. ssh-add // 認証エージェントに秘密鍵を登録する
    2. exit // 認証エージェントからログアウトする
###結果
以上によって、ローカル側から```ssh ユーザー名@ホスト名```と入力すると、パスワード認証を求められずに公開鍵認証を用いて、ssh接続できるようになりました。

#次回
次はセキュリティーの設定をやっていこうと思います。

#参考
[さくらのVPSにUbuntu 16.04をインストールして初期設定する](https://mlny.info/2016/04/ubuntu-xenial-on-sakura-vps/)
CircleCI 高速化のためにYarn を導入する


## yarn 

Facebookチームを中心に生まれた新しいパッケージマネージャー。

https://yarnpkg.com/

npm とちがって以下のような利点があるらしい

- lockfileによるバージョン固定
- セキュリティの向上
- 高速なインストール

一応npmにも`shrinkwrap`と言うかたちでバージョン固定はあるらしい。

セキュリティに関してはパッケージのチェックや、キャッシュの活用などがあるとのこと。

## Usage

Yarn は npm でインスール可能

```
npm i -g yarn
```

既存の npm プロジェクト上で `yarn install` すれば、`yarn.lock` ファイルが生成される。

なお `yarn i`はNG。代わりに、`yarn install`と等価な`yarn` が用意されている。

### パッケージの追加・削除

パッケージの追加削除には、`yarn add`や`yarn remove`を用いる

```
yarn add <packageName>
```

https://yarnpkg.com/en/docs/cli/add

```
yarn remove <packageName>
```

https://yarnpkg.com/en/docs/cli/remove

これらのコマンドは実行後に`package.json`と`yarn.lock`ファイルを更新してくれる。

### その他のコマンド

その他にも`init`や`run`などのコマンドも追加されているが、`npm`とどう違うのかよくわからない…

`yarn`を`npm`のエイリアスとして使用する場面を想定している…？

## CircleCI でYarnを使う

一応公式にもドキュメントがある。

https://circleci.com/docs/install-and-use-yarn/

以下のような`circle.yml`を構築することで、yarnの実行ファイルとモジュールのキャッシュを保持してくれるよう

````
machine:
  environment:
    YARN_VERSION: 0.18.1
    PATH: "${PATH}:${HOME}/.yarn/bin:${HOME}/${CIRCLE_PROJECT_REPONAME}/node_modules/.bin"

dependencies:
  pre:
    - |
      if [[ ! -e ~/.yarn/bin/yarn || $(yarn --version) != "${YARN_VERSION}" ]]; then
        echo "Download and install Yarn."
        curl -o- -L https://yarnpkg.com/install.sh | bash -s -- --version $YARN_VERSION
      else
        echo "The correct version of Yarn is already installed."
      fi
  override:
    - yarn install
  cache_directories:
    - ~/.yarn
    - ~/.cache/yarn

test:
  override:
    - yarn test

````
タスク一覧の履歴削除をするとonDestroyが呼ばれない

http://image.search.yahoo.co.jp/search?p=android+%E3%82%BF%E3%82%B9%E3%82%AF%E4%B8%80%E8%A6%A7&ei=UTF-8&fr=mozff
こういうので、ユーザーが履歴を削除すると、onDestroyが呼ばれません。
他にも、アプリを大量に立ち上げてアプリが強制的にkillされるときも呼ばれません。

プロセスがなんらかの要因でkillされる場合は呼ばれないようです。

なので、アプリが終了したときに何かしらの処理を行いたい場合は、onPauseで行うことが推奨されています。

では、onDestroyでは、どういった処理をするといいのでしょうか。
アウトオブメモリー回避用に、変数をnullにする処理はonDestroyでいいのでしょうか。

developerに、「バックグラウンドで実行しているスレッドがある場合、そのスレッドは onCreate() で作成され、onDestroy() で停止される場合があります。 」と書いてありました。
https://developer.android.com/guide/components/activities.html

日本語が変ですが、バックグラウンドで実行したスレッドは、明示的に止めましょう。onDestoryで。ということだと思います。

あと、アウトオブメモリーに関しては、プロセスがkillされている時点で、メモリに残ってなさそうなので、onDestroyまで処理が走ったときにnullにしておけばそこまで問題はなさそうです。
Golang + AWS lambda + Apex


全部試したいので同時に。

下記を参考に真似しつつ考える

Apexを使ってGoでlambdaを動かす - Qiita http://qiita.com/dora56/items/b3acb3f4e45e68dce6a8

設定の参考

Apex – Serverless Infrastructure http://apex.run/#aws-credentials

### init

$ apex init
が動かなかったけど、configの値を記載したら動いた

direnvでAWS_PROFILEを設定するようにもした。

### sample file & IAM

サンプルは全体をzipで落としてもサイズ的には小さかった。
コピーする時にはproject.jsonを削除してしまい、IAMのロールから該当箇所をコピーして解決。
apexはこのロールを作ってくれるのね。だからロールの権限を必要とするのか。なるほど。

AWSの権限設定についてもあまりわからないなかでインラインで設定することを覚えた。
下記をコピー。英語だけど、詳細を知りたい時にはここを見たほうがいいな。結構いろいろある。。
Apex – Serverless Infrastructure http://apex.run/#aws-credentials

ここまでで実行は出来た。
あとはgolangの処理をいじってみる感じかな。

## aws-cliのアカウント管理〜direnv

AWS CLI のprofileを簡単に切り替える - tail my trail
http://uorat.hatenablog.com/entry/2015/10/16/023008

Ansibleで、AWS profileを使ってアカウントごとのInventoryを簡単に生成する - Qiita
http://qiita.com/szk3/items/4f0935554acc18610775

direnvを使おう - Qiita
http://qiita.com/kompiro/items/5fc46089247a56243a62

ruby on rails - Setting 'EDITOR' or 'BUNDLER_EDITOR' environment variable - Stack Overflow
http://stackoverflow.com/questions/25084035/setting-editor-or-bundler-editor-environment-variable

いまさら direnv の解説 - Qiita
http://qiita.com/ngyuki/items/fda1bbf29384bef7a805


## 参考

PEG Linter ー peglint - Qiita
http://qiita.com/yhirose/items/322d5e81d98de7e7df9e

GolangとPEGで作る言語処理系 vol.1 - Qiita
http://qiita.com/erukiti/items/9e9cada94178ed10a1fa

aws labmbda golang - Google 検索
https://www.google.co.jp/search?num=100&safe=off&espv=2&q=aws+labmbda+golang&oq=aws+labmbda+golang&gs_l=serp.3...25714.26758.0.26853.7.6.0.0.0.0.0.0..0.0....0...1c.1.64.serp..7.0.0.c_scnkQIymc

Apexを使ってGoでlambdaを動かす - Qiita
http://qiita.com/dora56/items/b3acb3f4e45e68dce6a8

AWS LambdaでJavaとNode.jsとGoの簡易ベンチマークをしてみた。 - 谷本 心 in せろ部屋
http://d.hatena.ne.jp/cero-t/20160101/1451665326

AWS Lambdaの処理性能を言語毎に測ってみた - Taste of Tech Topics
http://acro-engineer.hatenablog.com/entry/2016/08/02/120000

AWS Lambda in Golang - Qiita
http://qiita.com/k_nishijima/items/39b7af26c3c245ae7240
Serverless FrameworkでLINE BOTへのメッセージをDynamoDBに保存するapiを作ってみる

#経緯
- ServerlessでChat Botを作る予定
- 今年中に記事を投稿したい

#事前準備
- Serverless Frameworkインストール
- AWSアカウント取得
 - AWS CLIインストールと設定
- LINEアカウント取得
 - Messaging APIを利用可能にする

#Serverless Frameworkのプロジェクト作成
```
$ mkdir test-api && cd test-api
$ serverless create --template aws-nodejs
```

#serverless.ymlの設定
```serverless.yml
service: test-api

provider:
  name: aws
  runtime: nodejs4.3
  stage: dev
  region: ap-northeast-1
  iamRoleStatements:
    - Effect: Allow
      Action:
        - dynamodb:PutItem
      Resource: '*'

functions:
  put:
    handler: handler.put
    events:
     - http:
         path: put
         method: post

resources:
  Resources:
    messagesTable:
      Type: AWS::DynamoDB::Table
      Properties:
        TableName: messagesTable
        AttributeDefinitions:
          - AttributeName: replyToken
            AttributeType: S
          - AttributeName: time
            AttributeType: N
        KeySchema:
          - AttributeName: replyToken
            KeyType: HASH
          - AttributeName: time
            KeyType: RANGE
        ProvisionedThroughput:
          ReadCapacityUnits: 1
          WriteCapacityUnits: 1
```

#Lambdaファンクション作成
```handler.js
'use strict';

const AWS = require('aws-sdk');
const dynamodb = new AWS.DynamoDB.DocumentClient();
const table = 'messagesTable';

module.exports.put = (event, context, callback) => {
	var date = new Date();
	var time = date.getTime();
	var body = JSON.parse(event.body);

	body.events.forEach(function(data) {
		var replyToken = data.replyToken;
		var message = data.message.text;
		var params = {
			TableName: table,
			Item: {
				replyToken: replyToken,
				time: time,
				message: message
			}
		};

		dynamodb.put(params, function(err) {

			if (err) {
				console.log(err);
			}
		});
	});

	callback(null, {statusCode: 200, body: JSON.stringify({})});
};
```

#AWSへデプロイ
```
$ serverless deploy
```

成功したらエンドポイントが取得できるのでメモ

```
endpoints:
  POST - https://xxx.amazonaws.com/dev/put
```

#LINE側設定
- Webhook送信:利用する
- Webhook URL:メモしたエンドポイントを指定

#以上です
あとは、LINEからBOTアカウントを友だち追加してトークよりメッセージを送信することで
DynamoDBにメッセージが保存されます。

#片づけ
```
$ serverless remove
```
【Ruby】クラスメソッドとインスタンスメソッドについてザクッと分かりやすく説明してみる

rubyにおけるクラスメソッド・インスタンスメソッドについて初心者向けに
ざくっと書いていきます。
プログラミング初めたての頃は「クラス」「インスタンス」「オブジェクト」・・・
と横文字がたくさん出てきて一瞬パニクり、さらにクラスメソッドとかいう
謎な言葉が出てくると嫌になりますよね。。。
でも、知ってしまえば「そんなことか」と思えるので今回はざっくりと説明します。

以下のコードを実行してみると違いが一発で分かります。

```Hoge.rb
class Hoge
 # インスタンスメソッドの定義
  def hoge
    p "インスタンスメソッド呼び出し成功"
  end
# クラスメソッドの定義
  def self.fuga
    p "クラスメソッド呼び出し成功"
  end
end

#インスタンスメソッドの呼び出し
Hoge.new.hoge

#インスタンスメソッドの呼び出しに失敗する
begin
  Hoge.hoge
rescue
  p "インスタンスメソッド呼び出し失敗"
end

#クラスメソッドの呼び出し
Hoge.fuga

#クラスメソッドの呼び出しに失敗する
begin
  Hoge.new.fuga
rescue
  p "クラスメソッド呼び出し失敗"
end
```

**実行結果**
<img width="253" alt="kekka.png" src="https://qiita-image-store.s3.amazonaws.com/0/137894/2cc18f4a-83a9-f6d2-4b78-8785dff4e99a.png">

* * *

以上の結果から、
**クラスメソッドはクラスオブジェクトから呼び出すことができるが、
インスタンスオブジェクトからは呼び出せない。
インスタンスメソッドはインスタンスオブジェクトから呼び出すことができるが、
クラスオブジェクトからは呼び出せない。　**

ということが分かります。
もう少し詳しく見ていきましょう

## インスタンスメソッド
```Hoge.rb
def hoge
   p "インスタンスメソッド呼び出し成功"
end
```

rubyを少しでも書いたことがあるなら見覚えはあると思います。
いわゆるメソッドを定義していますね。
何の気なしに書いてきましたが、実はこれはインスタンスメソッドを定義しています。
その名の通りインスタンスメソッドはインスタンスからのみ実行できます。
これだけ覚えておけばインスタンスメソッドについては十分です。

```Hoge.rb
# newされているのでインスタンスオブジェクトからメソッドを呼び出している
Hoge.new.hoge
# クラスオブジェクトからは呼び出せない
Hoge.hoge
```

## クラスメソッド

```Hoge.rb
def self.fuga
   p "クラスメソッド呼び出し成功"
 end
```

クラスメソッドには戸惑う方もいるかもしれません。
それも全てこの**self**のせい。
selfについて今説明するとややこしくなるので詳細には書きません。
この場合selfはHogeクラスを指します。
ですので

```Hoge.rb
def Hoge.fuga
  p "クラスメソッド呼び出し成功"
end
```
と書いても一緒です。
現段階ではこのような書き方のメソッドをクラスメソッドと認識しても問題ないかと思います。
※ただし、下記のようにメソッドの中でselfが使われてる場合はクラスメソッドではありませんので
注意してください。

```Fuga.rb
def piyo
   self.hoge
end
```
ちょっとややこしいかもしれませんがこれは
**メソッドpiyoを実行したインスタンスオブジェクトに定義されているhogeメソッドを実行する**
という意味になります。
selfはメソッドが呼び出されたオブジェクトを表しているんだなぁという理解でOKだと思います。
（この辺は別で詳細書きます）

まとめるとクラスメソッドはクラスオブジェクトからしか実行できず、
> def self.メソッド名
> def クラス名.メソッド名

の形式で書かれたメソッドだと覚えておけば十分でしょう。

## クラスメソッドとインスタンスメソッドの使い分け

この辺りはクラス設計のお話なのでなかなか難しいところで、意見が分かれるかもしれないので
あくまで一個人の考えとして捉えてください。
基本的には**インスタンスメソッドで全てまかなってみる**というのが根本的思想のように思います。
では、クラスメソッドはいつ使えばいいのかですが、これは
**新しいインスタンスを生成する**ときに使われることが多い印象です。
単純なwhereやfindでは作れない複雑な条件を書くときはクラスメソッドで記述して、
それをコントローラで呼び出すということがよく行われている気がします。

* * *

### まとめ

色々書きましたが

**クラスメソッドはクラスオブジェクトから呼び出すことができるが、
インスタンスオブジェクトからは呼び出せない。
インスタンスメソッドはインスタンスオブジェクトから呼び出すことができるが、
クラスオブジェクトからは呼び出せない。　**

これだけ覚えておけば初心者のうちはとりあえずOKかと思います。
なんとなくわかってきたら特異メソッドとかについて調べてみると面白いかもしれませんね。
position: fixedの子要素をスクロールできるようにする

位置を固定したいけど、中の要素はスクロールしたい時用の小技（ドロワーメニューとか）。

## デモ
<p data-height="265" data-theme-id="0" data-slug-hash="ZLzOOG" data-default-tab="html,result" data-user="negibouze" data-embed-version="2" data-pen-title="ZLzOOG" class="codepen">See the Pen <a href="http://codepen.io/negibouze/pen/ZLzOOG/">ZLzOOG</a> by Yoshiaki Itakura (<a href="http://codepen.io/negibouze">@negibouze</a>) on <a href="http://codepen.io">CodePen</a>.</p>
<script async src="https://production-assets.codepen.io/assets/embed/ei.js"></script>

## 実装（デモから抜粋）
やることは単純でスクロールさせたい要素に高さを指定してあげるだけです。

```
nav.right
  ul.scrollable
    li.item メニュー 01
    li.item メニュー 02
    li.item メニュー 03
    li.item メニュー 04
    li.item メニュー 05
    li.item メニュー 06
    li.item メニュー 07
    li.item メニュー 08
    li.item メニュー 09
    li.item メニュー 10
```

```
nav
  position fixed
  width 200px
  height 150px
  overflow hidden
  > ul
    width 100%
    padding 0 14px 0 0
    margin 0
    list-style none
    overflow-y auto
    background-color: #efefef;
    &.scrollable
      height 100% <- これだけ
    > li.item
      width 100%
      height 50px
      line-height 50px
      text-align center
      border-bottom solid 1px #c8c8c8
      cursor pointer
```
公式yumリポジトリで入れたElasticsearch 5.xの使用メモリを抑制するには

CentOS 7を入れた開発用の貧弱鯖(メモリなんと2GB)で公式yumリポジトリからElasticsearchの最新版を入れて起動したところメモリを食いつぶしてちょっとしたクエリを投げるたびにプロセスが落ちるという困ったことになりました

起動時のプロセス見たら-XmsオプションでJVMが2GBも確保してくださりやがってたので嫌な予感はしてたのですが・・・

で、ぐぐってみたのですが、起動スクリプトにES_HEAP_SIZEを云々という記述はよくあるものの、どうもこれには当てはまらず

最初から読んどけという公式ドキュメントにズバリなところがありました

[Set JVM heap size via jvm.options](https://www.elastic.co/guide/en/elasticsearch/reference/current/heap-size.html)



つまり、/etc/elasticsearch/jvm.optionsファイルに全部書いてあったっていう

```apache:/etc/elaasticsearch/jvm.options

## JVM configuration

################################################################
## IMPORTANT: JVM heap size
################################################################
##
## You should always set the min and max JVM heap
## size to the same value. For example, to set
## the heap to 4 GB, set:
##
## -Xms4g
## -Xmx4g
##
## See https://www.elastic.co/guide/en/elasticsearch/reference/current/heap-size.html
## for more information
##
################################################################

# Xms represents the initial size of total heap space
# Xmx represents the maximum size of total heap space

-Xms2g  # ここと
-Xmx2g  # ここ
```

ここをメモリに応じて1g/1mみたいな記法で書けばいい感じ
BLEセンサー（TI BLE Senser Tag）を使う

Windows IoT Core から BLE(Bluetooth Low Energy) を使う例として、テキサスインスツルメンツの Senser Tag を使ってみます。が、どうも調子（？）が悪いのかうまくつながりません。オンボードの BLE だと繋がらないし、RPi2 で繋がっていたバッファローの BLE ドングルでもうまくいかないので、参考程度にしてください。そこは、ほら、流行のキュレーションメディアっぽくということで。

# Bluetooth のペアリング

Windows IoT Core から BLE を使うときはあらかじめペアリングが必要になります。これは Windows 10 のときと同じですね。

![001.jpg](https://qiita-image-store.s3.amazonaws.com/0/32488/493842ec-ee1f-601d-73a6-875ea204c0d2.jpeg)

デバイスポータルで目的のデバイスを見つけて「Pair」をクリックして、PIN コードを入れます。

Windows IoT Core の設定からもペアリングができます。

![004.jpg](https://qiita-image-store.s3.amazonaws.com/0/32488/8d1c91ee-02e6-6b4a-24e1-3ae70f323b84.jpeg)


# BLE のサンプルを動かす

ここから、TI BLE Senser Tag を使うためのサンプルがダウンロードできます。

[samples/BluetoothGATT/CS at develop · ms-iot/samples](https://github.com/ms-iot/samples/tree/develop/BluetoothGATT/CS "samples/BluetoothGATT/CS at develop · ms-iot/samples")

実は、Windows 10 から Bluetooth の GATT を扱うのは結構大変で、下記のような GUID を設定しながらちまちまか動かす必要があります。おそらく、この大変さは Android や iPhone でも同じなんでしょうけど、適当な Java や Objective-C のライブラリを各BLEセンサーの会社がSDKとして提供されている分、楽だったりします。そういう点では、C# の場合は用意されていないことが多くて、仕様書を見ながらちまちま設定という手順が必要なる...みたいですね。

```csharp
const string SENSOR_GUID_PREFIX = "F000AA";
const string SENSOR_GUID_SUFFFIX = "0-0451-4000-B000-000000000000";
const string SENSOR_NOTIFICATION_GUID_SUFFFIX = "1-0451-4000-B000-000000000000";
const string SENSOR_ENABLE_GUID_SUFFFIX = "2-0451-4000-B000-000000000000";
const string SENSOR_PERIOD_GUID_SUFFFIX = "3-0451-4000-B000-000000000000";

const string BUTTONS_GUID_STR = "0000FFE0-0000-1000-8000-00805F9B34FB";
readonly Guid BUTTONS_GUID = new Guid(BUTTONS_GUID_STR);
readonly Guid BUTTONS_NOTIFICATION_GUID = new Guid("0000FFE1-0000-1000-8000-00805F9B34FB");

readonly Guid BAROMETER_CONFIGURATION_GUID = new Guid("F000AA42-0451-4000-B000-000000000000");
readonly Guid BAROMETER_CALIBRATION_GUID = new Guid("F000AA43-0451-4000-B000-000000000000");
```

上手く動くと、こんな風になります。きちんと繋がってはいませんが、ペアリングまではできています。

![002.jpg](https://qiita-image-store.s3.amazonaws.com/0/32488/cb1fcd7e-1885-edc0-5791-70cf5bd02ffd.jpeg)


一時期、BLEセンサーの類を「使い捨て」のように提案する場合もありましたが、Amazon Dash Button や IoT Hub などの登場を見れば、「非常にたくさんの BLE 機器を長く使う」ようにシフトされるのは明らかでしょう。BLE の場合 2,3年という長寿命の使い方ができることもあり、電池を含んだまま（あるいは太陽電池などを使って半永久的に）で「壊れるまで使い倒す」という昔ながらの機器の使い方ができると思われます。

Azure の場合は、<a href="https://yseosoft.wordpress.com/2016/12/14/iothub_devicemanage/">Azure IoT Hub のデバイス管理機能を利用する | 技術との戯れ</a> なものを使います。他にもいくつか IoT Hub があるので探してみてください。

# Bluetooth ありの PC の場合

アプリは UWP でできているので PC からも使えます。デスクトップ PC でも Bluetooth 4.0 なドングル（1,000円位です）を買って取り付けておくと使えます。

![003.jpg](https://qiita-image-store.s3.amazonaws.com/0/32488/dfa06e58-3708-3b45-5a04-9f6ca9d43c68.jpeg)

で、BLE 経由の GATT で使うと結構大変なので、古式ゆかしき BLE でシリアル通信を使うと楽です。これは別途解説していきましょう。
houstonでリッチ通知を送る


※追記(2017/01/15)
２年弱くらいぶりにhoustonの新バージョンがリリースされたのでこの記事の内容は不要になりました🎉
https://github.com/nomad/houston/releases/tag/v2.2.4

[houston](https://github.com/nomad/houston)はiOSアプリにプッシュ通知を送るためのgemですが、iOS10からのリッチ通知を試す際にも使ったところ下記のようなエラーが出ました。

```
undefined method `mutable_content=' for #<Houston::Notification:0x007f90889efa50> (NoMethodError)
```

リッチ通知を送信するために必要な`mutable-content: 1`を含める部分でエラーになってるようです。

READMEの通りやったのになんぞ？

ということで見てみたらどうも「README含めていくつかの新機能がmasterに取り込まれているが、RubyGemsへのリリース等が行なわれていない」という状態になっていたためのようでした。

RubyGems上での最新バージョンはだいぶ昔の2015/01/29にリリースされた2.2.3で(2016/12/31現在)、README通りの下記のコマンドではこの古いバージョンのhoustonがインストールされてしまいます。

```
$ gem install houston
```

このバージョンではリッチ通知を送るための`mutable_content`をセットするためのメソッドがまだありません。

ということでhoustonの最新のmasterをインストールしましょう！

GitHubのリポジトリからgemをinstallする'specific_install'というgemを使って下記のようにインストールします。

```
$ gem install specific_install
$ gem specific_install -l 'https://github.com/nomad/houston.git'

$ gem list houston   // houston (2.2.4)
```

これで無事リッチ通知もhoustonから送れるようになりました！

```ruby
require 'houston'

`Houston::Client.production`.
APN = Houston::Client.development
APN.certificate = File.read("./apple_push_notification.pem")

token = "<xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx>"

notification = Houston::Notification.new(device: token)
notification.alert = "落ち着つけ・・・\n『sushi』を数えて落ち着くんだ・・・"
notification.category = "myNotificationCategory"
notification.mutable_content = true

APN.push(notification)
```

（houstonもうリリースされないのかな・・・）
Debug C/C++ program online

Most programmers like to code and test small programs with online editors e.g. ideone.com codepad.org

But sometimes we face problem with program like below.
1. program result is not as expected
2. program received segmentation fault
3. infinite loops in program

In such cases, it is difficult to find out bug in program. Which need to be checked using debugger.

http://onlinegdb.com is such online debugger for C/C++ languages.
You can run and debug small programs online.
It lets you debug program via online command line gdb debugger.

Here is steps how to run program in debug mode via http://onlinegdb.com

1. Write Code
![Screenshot from 2016-12-31 12-18-42.png](https://qiita-image-store.s3.amazonaws.com/0/157571/2ed81f64-9aa9-9aca-9608-f8cc92b27c37.png)

2. Press "Debug" button. It will run program under debug mode and it will open gdb debug console window.
![Untitled design (6).jpg](https://qiita-image-store.s3.amazonaws.com/0/157571/d5b725be-4f55-a75c-fab3-5a20f1d8e256.jpeg)

3. Now we can enter gdb commands in debug console
![Screenshot from 2016-12-31 12-25-27.png](https://qiita-image-store.s3.amazonaws.com/0/157571/4f13cd2e-220c-119b-f089-0222767bff56.png)

Few notes about onlinegdb.com
1. Its command line debugger.
2. Programmer need to know basic gdb commands and how to use it.
3. Supported Languages are C/C++

This would be helpful for those programmers who face problem with program while testing code online.
太陽電池＋鉛蓄電池 で AC補充電なし で 有事に備える

# Overview

＃SWの話は一切ないです。

有事の際に、電力の確保が重要です。 3.11の時、停電に備えて、PCをSSD化、HDDのshutdownを最短タイマー時間にして運用し、かつ、結局、UPSも導入しました。

加えて、12Vのアウトドアバッテリーを購入し、常時ACアダプターで充電していました。 12Vは、車で使われており、シガーソケットがアウトドアバッテリーには搭載されているので、カー用品（インバーター含む）を流用できるので、有事にもある程度の備えになります。

鉛電池は、常時充電することができます。（Li-ionやNi-Hなどは、満充電保存はあまり適さないと言われています）。
(鉛電池は常に充電しておかないと、劣化が進むとも言われています。故に、アウトドアバッテリーの説明書にも、ACアダプターを常に繋いで電源供給してくださいと書かれています。)

問題は、使わないのに、ACを繋がなくてはいけなくてちょっともったいないなと。。。
(20VAのAC adaptorがついています。12V 800mA出力で）

![IMG_8849.JPG](https://qiita-image-store.s3.amazonaws.com/0/100425/83807d64-6b0f-bb16-1451-cb634616c766.jpeg)

というわけで、もう一つ購入していた太陽電池パネルと組み合わせて、充電し続けるようにしてみます。

* [アウトドアバッテリー](https://www.amazon.co.jp/dp/B000T0JNHC)
* [太陽電池](https://www.amazon.co.jp/gp/product/B00U3KAJSA)
* [DC-DC step up converter](https://www.amazon.co.jp/gp/product/B01D0WSBGY)

を組み合わせて、

![IMG_8888.JPG](https://qiita-image-store.s3.amazonaws.com/0/100425/874ed031-2b00-a409-7fdd-5f507222633b.jpeg)

![IMG_8890.JPG](https://qiita-image-store.s3.amazonaws.com/0/100425/6ec7c5dc-aae8-7fda-cfe3-299dc43c5511.jpeg)

こんな感じで、常時充電環境ができました。

DC12V7AHのバッテリー搭載とのことなので、84WHなので、そこそこの備えになりそうです。
密閉型のバッテリーなので、鉛電池の保守的なものは気にしなくて良さそうです。
Javaで西暦和暦混合出力

# 前説
西暦と和暦を並べて出すということはまあまあありそうな気がする。Excelでいうところの「yyyy(ggge)"年"mm"月"dd"日"」をJava的に出す。

```java8.java
JapaneseDate japdate = JapaneseDate.now();
DateTimeFormatter dtf1 = DateTimeFormatter.ofPattern("yyyy");
DateTimeFormatter dtf2 = DateTimeFormatter.ofPattern("'('Gyy')年'MM'月'dd'日'");
System.out.println(LocalDate.from(japdate).format(dtf1) + japdate.format(dtf2));
```
で、たぶんあっていると思う。
2017/01/17追加↓
あってなかった(汗)

```java8.java
JapaneseDate japdate = JapaneseDate.now();
DateTimeFormatter dtf3 = DateTimeFormatter.ofPattern("uuuu'('Gyy')年'MM'月'dd'日'");
System.out.println(japdate.format(dtf3));
```

「u」というパターン文字があり、そっちを使えば一発で行ける。ちゃんと進化してた。
2017/01/17追加↑


```java6.java
Locale loc = new Locale("ja", "JP", "JP");
Calendar cal = Calendar.getInstance(loc);
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy");
SimpleDateFormat sdf2 = new SimpleDateFormat("'('GGGGyyyy')年'MM'月'dd'日'", loc);
System.out.println(sdf1.format(cal.getTime()) + sdf2.format(cal.getTime()));
```
で、ひとまずあっているはず。

## 補足
CalendarのgetInstanceに日本的なロケールを渡すことで、グレゴリアンカレンダー(java.util.GregorianCalendar)ではなく、日本的帝国カレンダー(java.util.JapaneseImperialCalendar)を返却させることができるので、いわゆる日本の元号対応が可能になるという話。
元号の境目の解釈が微妙なので安易に使っちゃダメなんていう話もあった気がするが、基本的に最近の日付を出すならば問題はないという理解。


## 蛇足？
ただ、このロケールのコンストラクタに文字列を引き渡すのがなんとなく気持ち悪いので、単純に明示的に日本を渡すという

```
Locale loc = Locale.JAPAN;
Calendar cal = Calendar.getInstance(loc);
```

で、よいように思ったのだが、これでは日本的帝国カレンダーが返却されない。
理由は Locale.JAPAN.getVariant() が "JP" を返却しないから？

？

これ、そういうもの？なんか変？
Ruby on Rails ~お気に入り登録（ブックマーク）機能の実装（コードメモ）

◆イベント一覧から興味のあるイベントをお気に入り登録する機能！
すでに「favorite」というテーブルを作成していたため、
今回はお気に入り登録に使うテーブルは「clip」とする。

#1.モデルの作成。
```
$ bundle exec rails g model clips
```
生成されるファイル...
```
      invoke  active_record
      create    db/migrate/20161231060901_create_clips.rb
      create    app/models/clip.rb
      invoke    test_unit
      create      test/models/clip_test.rb
      create      test/fixtures/clips.yml
```
#2.アソシエーションの設定
```app/models/clip.rb
class Clip < ActiveRecord::Base
    belongs_to :user
    belongs_to :event
end
```
```app/models/event.rb
class Event < ActiveRecord::Base
    has_many :clips
    has_many :users, through: :clips
end
```
```app/models/user.rb
class User < ActiveRecord::Base
    has_many :clips, dependent: :destroy #この行を追記することで関連付くイベントが削除されるとclipも削除されます。
    has_many :events, through: :clips
end
```

#3.マイグレーションファイルの編集
```db/migrate/...
class CreateClips < ActiveRecord::Migration
  def change
    create_table :clips do |t|
      t.references :user, null:false
      t.references :event, null:false
      t.timestamps null: false
    end

    add_index :clips, :user_id
    add_index :clips, :event_id
  end
end
```

#4.テーブルの生成
```
$ bundle exec rake db:migrate
```
#5.routesの設定
```config/routes.rb
  resources :events do
    member do
      post "add", to: "clips#create"
    end
  end

  resources :clips, only: [:destroy]
```
#6.コントローラーの作成
```
$ bundle exec rails g controller clips
```
#7.コントローラーの編集
```app/controllers/clips_controller.rb
class ClipsController < ApplicationController
  def create


    @user_id = current_user.id
    @event_id = Event.find(params[:id]).id
    @clip = Clip.new(event_id: @event_id, user_id: @user_id)


      if @clip.save
        redirect_to user_path(current_user)
      end

  end

  def destroy
    @clip = Clip.find(params[:id])
    if @clip.destroy
      redirect_to user_path(current_user)
    end
  end

end
```
#8.viewの編集

```app/views/events/show.html.erb
      <div>
      <%= link_to "このイベントをクリップ", add_event_path(event), method: :post %>
      </div>
```
JekyllでテキストをHTML用にエスケープする

Twitter cardsを設定するためにこちらの記事を参考にテンプレートを書いた。

[Jekyll で作成したサイトを Twitter Card に対応させる](http://blog.kakeragames.com/2015/12/15/twitter-card-with-jekyll.html)

しかしこのまま使うとHTMLでエスケープすべき文字もそのまま埋め込まれてしまうため、うまく動かない時がある。

```html:うまく動かないパターン
<meta name="twitter:title" content="{{ page.title }}" />
```

## 具体例

たとえばこちらの記事のように、タイトルにセミコロンが入っていたりするとおかしくなる。

[Jekyllのtheme"minima"のハンバーガーメニューがiOSで動作しないバグ](https://kotet.github.io/jekyll/2016/11/29/hamburger-menu-not-working.html)

![Screenshot from 2016-12-31 14-52-55.png](https://qiita-image-store.s3.amazonaws.com/0/57768/fd319f4f-ea70-acdf-da23-5479cb960463.png)

![Screenshot from 2016-12-31 14-51-38.png](https://qiita-image-store.s3.amazonaws.com/0/57768/c833ef5d-46e9-f61b-0a92-41c7e50a61b1.png)

## | escape

escapeフィルタをつければ大丈夫。

```html:修正
<meta name="twitter:title" content="{{ page.title | escape}}" />
```

![Screenshot from 2016-12-31 15-31-44.png](https://qiita-image-store.s3.amazonaws.com/0/57768/1be5f1f0-3425-b702-4ec0-c2dac4df53dd.png)

![Screenshot from 2016-12-31 15-37-09.png](https://qiita-image-store.s3.amazonaws.com/0/57768/dec27d96-7b0a-3e6d-cb0e-595a2fae4729.png)

でもちょっとタイトルが長すぎるかもしれない。
無線化するために WiFi を使う

Raspberry Pi は有線LANのコネクタを持っていますが、USB に WiFi ドングルを刺すと WiFi が使えるようになります。利用できる WiFi ドングルには制限があるのですが（確かサポート一覧があったはず）。
Raspberry Pi 3 だとオンボードに WiFi と Bluetooth が乗っています。Windows IoT Core ではこれを使うことができます。

# WiFiConnect のサンプルを動かす

[samples/WiFiConnector/CS at develop · ms-iot/samples](https://github.com/ms-iot/samples/tree/develop/WiFiConnector/CS "samples/WiFiConnector/CS at develop · ms-iot/samples")

から WiFi に接続するためのサンプルがダウンロードできます。このサンプルは 動的に WiFi アクセスポイントにアクセスするためのものなので、通常は後述します。

![001.jpg](https://qiita-image-store.s3.amazonaws.com/0/32488/bf8ce10c-2cb4-2cdc-181c-b68938de4364.jpeg)

アクセスポイントのリストアップは、以下なところに書いてあります。

```csharp
private async void Button_Click(object sender, RoutedEventArgs e)
{
    await firstAdapter.ScanAsync();
    ConnectionBar.Visibility = Visibility.Collapsed;
    DisplayNetworkReport(firstAdapter.NetworkReport);
}

private void DisplayNetworkReport(WiFiNetworkReport report)
{
    rootPage.NotifyUser(string.Format("Network Report Timestamp: {0}", report.Timestamp), NotifyType.StatusMessage);

    ResultCollection.Clear();

    foreach (var network in report.AvailableNetworks)
    {
        ResultCollection.Add(new WiFiNetworkDisplay(network, firstAdapter));
    }
}
```

詳しい解説は以下なのですが、普段は必要ないかもしれません。

Wi-Fi Connector | Windows IoT
https://developer.microsoft.com/en-us/windows/iot/samples/wificonnector

# アクセスポイントに手動で接続する

実際はデバイスポータルを使ってアクセスポイントへ接続することが多いでしょう。

![002.jpg](https://qiita-image-store.s3.amazonaws.com/0/32488/10bae013-14f2-75df-eccd-30cc9ed5e497.jpeg)

Raspberry Pi 3 だとオンボードの WiFi（Boardcom 802.11n）を認識するので、このアダプタを使って接続します。Available networks で目的のアクセスポイントを選択して、パスワード等を入力します。

接続時の IP アドレスもこのページで確認ができます。
Androidの近接センサーアプリを作ってみました

### 前書き

趣味でAndroidアプリを開発しているものです！ハーフミラーディスプレーを作ろうと、近接センサーのアプリを開発して見ました。軽く便利なショートカットを書きつづ、近接センサーアプリの開発についてを議事録として残します。

### 開発環境

開発環境
* Android Studio 2.2.3
* Mac OSX Sierra

デバッグに使った実機
* Xperia(TM) ZL2 SOL25
* Android 5.0 lollipop

### Android Studioの便利なショートカット

ラブラリーをインポート - alt + Enter

![12月-30-2016 19-09-52.gif](https://qiita-image-store.s3.amazonaws.com/0/60849/0ad1b22c-00a7-93e7-0aa3-abc5a217a4ce.gif)

interfaceのabstractメソッドを自動追加 - Cmd + N でcode generateのメニューが開き、そのままiを打つと、implement methodsが絞られて↓キー移動しなくてもすぐ選択できます。

![12月-30-2016 19-12-28.gif](https://qiita-image-store.s3.amazonaws.com/0/60849/9058cda9-5554-ef2d-b1e3-8ec1cc57d1dc.gif)


### 近接センサーのコード

```java
public class MainActivity extends AppCompatActivity implements SensorEventListener {

    private SensorManager mSensorManager;
    private Sensor mProximity;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // センサーオブジェクトを取得
        mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);

        // 近接センサーのオブジェクトを取得
        mProximity = mSensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY);

    }

    @Override
    protected void onResume() {
        super.onResume();
　　　　　// 近接センサーを有効
        mSensorManager.registerListener(this, mProximity, SensorManager.SENSOR_DELAY_NORMAL);
    }

    @Override
    protected void onPause() {
        super.onPause();
        // 近接センサーを無効
        mSensorManager.unregisterListener(this);
    }

    @Override
    public void onSensorChanged(SensorEvent event) {
        if (event.sensor.getType() == Sensor.TYPE_PROXIMITY) {
            // values = 5 or 0
            if (event.values[0] > 0 ) {
                //near
                Toast.makeText(getApplicationContext(), "far", Toast.LENGTH_SHORT).show();
            } else {
                //far
                Toast.makeText(getApplicationContext(), "near", Toast.LENGTH_SHORT).show();
            }
        }
    }

    @Override
    public void onAccuracyChanged(Sensor sensor, int accuracy) {

    }
}
```

Githubにまとめました。
https://github.com/edisonthk/ProximitySensorTest

### 余談

Eclipseを使ってAndroid開発していた２年前のごろは Java Development Kit（以降、JDK）のインストールは必須でしたが、Android StudioはJDKなくても開発できました。ただし、 react nativeを使うと JDK のインストールは必須になります。
PythonでDB操作してd3で可視化してみる

かっぱ寿司をご存知でしょうか
安い値段で色々なネタのお寿司が食べれるお店です。この業界だと回転寿司は動的寿司とかDynamic寿司って呼ばれるそうですね
自分はこのかっぱ寿司がとても好きで特に厚焼き卵とたまご天が好きです。新幹線も好きです。
最近d3を触ってみたかったのでかっぱ寿司で触ってみました。

# 環境
* Python2.7
* PostgreSQL
* d3.js
* Vagrant

# 実装
[ソースコード](https://github.com/yamika/kappa_d3_example)
適当なデータが欲しかったのでcreatecsv.pyでランダムなデータを作りました
未成年なので酒があるドリンクは省きました。詳細はdata.csv
PostgreSQLにcsvを読み込ませて`select sum (price) , timestamp from kappa_count  order by timestamp;`などでまた新しいcsvを作る。
d3.jsで新しいcsvを読み込んでそれっぽい統計的なグラフを作って終わり。
![graph.png](https://qiita-image-store.s3.amazonaws.com/0/129377/fa54e6b9-a267-af76-63b0-b5b3cc9cdfd8.png)
適当なランダムデータを作るのはもっと効率のいいやり方があったかもしれない。
Check! Azure Bot Service で Slack へ連携する ～ 2016年12月版

こんにちは、 @dz_ こと大平かづみです。

大みそか、いかがお過ごしでしょうか？

Prologue - はじめに
====
前作の [Check! Bot Service と Cognitive Services を使って、チャットの発言のキーフレーズを知る](http://qiita.com/dz_/items/82fdb117c4921e87a580) の検証過程で Slack 連携を試した際、Bot Channel Connector が示す手順と、Slack 側のUIが異なりわかりにくかったので、手順をまとめておきます。

[2016年12月時点] Azure Bot Service から Slack に連携する
====

Bot Service で Slack のチャンネルを設定する
----
Azure Bot Service の「Channels」タブを開き、Slack の「add」をクリックします。ここで開いた画面を、「Bot Connector の画面」と表現して以下進めます。

![20161230_azure-bot-service_connect-to-slack_001.png](https://qiita-image-store.s3.amazonaws.com/0/3812/1cab942b-a24e-0e51-10d2-4e7a7b98e419.png)

「Login to Slack and crate a Slack Application for your bot」のプルダウンを開き、 https://api.slack.com/application/new を開きます。「Slack のアプリケーション設定画面」が開くので、「Crate New App」ボタンをクリックします。
![20161230_azure-bot-service_connect-to-slack_002.png](https://qiita-image-store.s3.amazonaws.com/0/3812/7888cea2-68c5-7174-22f6-7c6b73e1867a.png)

App Name や、対象となる Team を選択し、「Create App」ボタンをクリックして、アプリケーションを作成します。

![20161230_azure-bot-service_connect-to-slack_003.png](https://qiita-image-store.s3.amazonaws.com/0/3812/c857e7e5-442c-74c7-c396-f5dc23f2a024.png)

Bot Connector の画面に戻り、「Create application and set redirect URI」のプルダウンを開き、「Use this Redirect URI」の URI をコピーします。

そして、Slack のアプリケーション設定画面で「OAuth & Permissions」を開き、「Redirect URL(s)」の欄に貼り付け、「Save Changes」ボタンをクリックして保存します。

![20161230_azure-bot-service_connect-to-slack_004.png](https://qiita-image-store.s3.amazonaws.com/0/3812/72c21c92-f8d1-9165-a05d-af555baeac8c.png)

Bot Connector の画面に戻り、「Crate a Slack Bot」のプルダウンの指示に従い、Slack のアプリケーション設定画面で「Bot Users」を開きます。

「Add a Bot User」ボタンをクリックし、ボット名を入力して、「Add Bot User」でボットを追加してください。

![20161230_azure-bot-service_connect-to-slack_005.png](https://qiita-image-store.s3.amazonaws.com/0/3812/23236841-19c6-d1df-c8b6-3ffa46ea8284.png)

Bot Connector の画面に戻り、「Submit your Credentials」のプルダウンを開いておきます。

`Client Id` と `Client Secret` を、Slack のアプリケーション設定画面の「Basic Information」から取得し、貼り付けてください。貼り付け終えたら、「Submit Slack Credentials」ボタンをクリックします。

![20161230_azure-bot-service_connect-to-slack_006.png](https://qiita-image-store.s3.amazonaws.com/0/3812/beeec1aa-1f6f-5363-eb08-8a2f4508329d.png)

Slack 連携の認証を確認されるので、画面に従って認証してください。認証が終わったら、「Enable this bot on Slack」にチェックがついてることを確認し、「I'm done configuration Slack」をクリックして、連携作業を完了します。

![20161230_azure-bot-service_connect-to-slack_007.png](https://qiita-image-store.s3.amazonaws.com/0/3812/26c11cad-34c0-c471-5dd0-b10644dea460.png)

Slack からボットを利用する
----

作成したボットを利用するには、チャンネルン追加しましょう。すると、そのチャンネルで発言すると、ボットが反応するようになります！ヽ(☆’v\`)★’v\`)ﾉ


![20161230_azure-bot-service_connect-to-slack_008.png](https://qiita-image-store.s3.amazonaws.com/0/3812/88cb439a-1ebd-9023-3a73-fc9f14be99da.png)

Epilogue - おわりに
====
いずれ Bot Connector の手順が更新されると思いますが、その間、ご参考になれば幸いです。

そして、本記事にて、Qiita 100 記事達成！！

今年もたくさんの方々に出会うことができ、たくさん技術の話をすることができました！心からありがとうございます！
来年も、どうぞよろしくお願いいたします！(o･ω･o)ﾉﾞ
ruby/rails のversionを上げた際に Array values in the parameter to `Gem.paths=` are deprecated.　エラーが出た時

# issue

昔に作成したアプリケーションをruby2.4/rails4.7にて動かそうとした時に以下のエラーが発生

```
Array values in the parameter to `Gem.paths=` are deprecated.
Please use a String or nil.
.
.
.
An Array ({"GEM_PATH"=>["/Users/hogehoge/workspace/old_app/vendor/bundle/ruby/2.4.0"]}) was passed in from bin/rails:3:in `load'
	from /Users/hogehoge/workspace/old_app/bin/spring:13:in `<top (required)>'
	from bin/rails:3:in `load'
	from bin/rails:3:in `<main>'
```

# conclusion

springのbinstubを一旦削除し再作成

```zsh 

$ bundle update spring
$ bundle exec spring binstub --remove --all
$ bundle exec spring binstub --all
```

4.1からspringが標準で付属する様になったので、`bundle update`でspringがinstallされます。
一方で` rails new` 時とは違いspringのsetup処理がされないままになっていたのが原因の様です。

# 参考元
[rubygems/rubygems:issue 1551](https://github.com/rubygems/rubygems/issues/1551)
nginx proxyキャッシュまとめ

proxyキャッシュを設定した最小限のnginx.confはこんな感じ：

```nginx
http {
    # proxy_cache_pathとproxy_temp_pathは同じファイルシステム上に配置するのがパフォーマンス上よい
    # keys_zoneの1mは共有メモリのサイズ。1MiBあたり約8000個のキーを保持できるので、それほど大きくなくて良い
    # max_sizeは全キャッシュファイルのサイズ合計の上限
    # inactiveで指定した期間内にアクセスされなかったキャッシュファイルは、その有効期間に関わらず削除される（デフォルトで10分）
    proxy_cache_path /var/cache/nginx keys_zone=zone1:1m max_size=1g inactive=24h;
    proxy_temp_path  /var/cache/nginx_tmp;
    # オリジンから来るCache-Controlを無視する
    #proxy_ignore_headers Cache-Control;

    server {
        server_name _;
        listen 80;
        root /srv/http/;

        location ^~ /sinatra/ {
            proxy_set_header Host $http_host;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_pass http://localhost:9292/;
            proxy_cache zone1;
            #proxy_cache_valid 200 302 3s;
            # レスポンスヘッダにキャッシュヒットしたかどうかを含める
            add_header X-Nginx-Cache $upstream_cache_status;
        }   

    }   
}
```

キャッシュを設定する上で考えるポイントは

1. キャッシュの有効期間
2. キャッシュの最大容量

だと思う。

## 1. キャッシュ有効期間は`proxy_cache_valid`とオリジンが出す`Cache-Control`で決まる。

proxy_cache_validが無し、Cache-Controlが無し
→キャッシュされない

proxy_cache_validが有り、Cache-Controlが無し
→キャッシュされる

proxy_cache_validが無し、`Cache-Control: max-age=10, public, must-revalidate`
→キャッシュされる

proxy_cache_validが有り、`Cache-Control: max-age=10, public, must-revalidate`
→キャッシュされる。Cache-Controlで指定した有効期間が優先される。

nginxは基本的にオリジンが出す`Cache-Control`を見ている。`no-cache`や`private`が含まれているとキャッシュされないので、キャッシュさせたければ`proxy_ignore_headers Cache-Control;`を書くと良い。

`max-age`と`s-maxage`が同時に指定されている場合、`s-maxage`が優先される。
`s-maxage`の意味は、中間のプロキシに対してキャッシュの有効期限を指定する（オリジンとエンドクライアントの間にあるプロキシ全てに対して有効になるはず）。


## 2. 最大容量は`max_size`で決まる

cache manager processがファイルシステムを監視していて、容量が超えた場合は削除してくれる。

## その他注意点

- nginxには手動でキャッシュファイルを削除する仕組みはない
    - 削除したいときはrmコマンドを使う（ただし`/var/cache/nginx`ディレクトリ自体ではなく、その中身を削除する方がよいと思う）
- nginxを再起動してもキャッシュファイルは残る
- nginxを再起動すると、キャッシュディレクトリが存在しない場合は作成される（親ディレクトリに書き込み権限があれば）
AWS CLIでアカウントIDを取得する

シェルスクリプトで何かしたいとき、アカウントIDがさくっととれると助かる場合がありますよね :relaxed:
以下で取得可能です。

```sh
$ ACCOUNT_ID=`aws sts get-caller-identity --query 'Account' --output text`;
$ echo $ACCOUNT_ID;
123456789012
```

# 補足

`aws sts get-caller-identity` は、APIの呼び出しを行った IAM Identity の情報を返却します。
これを使うことで、どのアカウントで呼び出しがされたものかがわかるので、複数アカウントを使い分けているようなプロジェクトでも認証情報を別に管理する必要がなくなります。

## IAM User

```xml
<GetCallerIdentityResponse xmlns="https://sts.amazonaws.com/doc/2011-06-15/">
  <GetCallerIdentityResult>
    <Arn>arn:aws:iam::123456789012:user/Alice</Arn>
    <UserId>AKIAI44QH8DHBEXAMPLE</UserId>
    <Account>123456789012</Account>
  </GetCallerIdentityResult>
  <ResponseMetadata>
    <RequestId>01234567-89ab-cdef-0123-456789abcdef</RequestId>
  </ResponseMetadata>
</GetCallerIdentityResponse>
```

## AssumeRoleで取得したセッション場合

別のアカウントからAssumeRoleした場合は、Roleを引き受けた先のアカウントとなります。また、ARNではロール名、セッション名が含まれます。

```xml
<GetCallerIdentityResponse xmlns="https://sts.amazonaws.com/doc/2011-06-15/">
  <GetCallerIdentityResult>
     <Arn>arn:aws:sts::123456789012:assumed-role/my-role-name/my-role-session-name</Arn>
    <UserId>AKIAI44QH8DHBEXAMPLE:my-role-session-name</UserId>
    <Account>123456789012</Account>
  </GetCallerIdentityResult>
  <ResponseMetadata>
    <RequestId>01234567-89ab-cdef-0123-456789abcdef</RequestId>
  </ResponseMetadata>
</GetCallerIdentityResponse>
```

## GetFederationTokenで取得したセッションの場合

```xml
<GetCallerIdentityResponse xmlns="https://sts.amazonaws.com/doc/2011-06-15/">
  <GetCallerIdentityResult>
    <Arn>arn:aws:sts::123456789012:federated-user/my-federated-user-name</Arn>
    <UserId>123456789012:my-federated-user-name</UserId>
    <Account>123456789012</Account>
  </GetCallerIdentityResult>
  <ResponseMetadata>
    <RequestId>01234567-89ab-cdef-0123-456789abcdef</RequestId>
  </ResponseMetadata>
</GetCallerIdentityResponse>
```


# Ref

- http://docs.aws.amazon.com/cli/latest/reference/sts/get-caller-identity.html
- http://docs.aws.amazon.com/ja_jp/STS/latest/APIReference/API_GetCallerIdentity.html
AndroidでJINS MEME開発 #大晦日ハッカソン 2016

\#大晦日ハッカソン 2016 で JINS MEME を Android で使ったので、ビルド手順などのメモ。  
## アプリ登録
https://developers.jins.com/ja/login/
SDKを利用するためには アプリID / アプリSecret を取得する必要があるので developers.jins.com に アプリを登録する。
アプリ登録が済めば アプリID と アプリSecret が発行されます。

## SDKダウンロード
https://developers.jins.com/ja/sdks/android/
この記事を書いている時点では 1.1.5.zip がダウンロードされました。
展開して MemeLib.jar があることを確認する。

## Android Studioで新規プロジェクトを作成
ビルドするだけなら Empty project で 十分です。

## app/libs ディレクトリに MemeLib.jar をコピーする。
![スクリーンショット 2016-12-31 13.47.45.png](https://qiita-image-store.s3.amazonaws.com/0/100147/aa4525b0-5a9f-1608-6ad9-2703c7b1786d.png)

## AndroidManifest.xml に必須パーミンションを追加
パーミンション追加を忘れて実行するとアプリがクラッシュして少し悩みます。  
```xml
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
```

##JINS MEME SDKが Gson を使っているのでbuild.gradleのdependenciesに下記を追加
```compile 'com.google.code.gson:gson:2.4' ```
![スクリーンショット 2016-12-31 13.48.16.png](https://qiita-image-store.s3.amazonaws.com/0/100147/b815dc0b-797b-3d3c-6c7d-999eb6997713.png)

## MainActivity等に MemeLib の初期化コードを書いてビルドしてみる。
```java
public class MainActivity extends AppCompatActivity {
    //MEMEライブラリ
    MemeLib memeLib;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //MEMEライブラリを初期化
        //Config.MEME_APP_ID,Config.MEME_APP_SECREAT は サイトで取得したアプリID,アプリSecretを設定する
        MemeLib.setAppClientID(getApplicationContext(), Config.MEME_APP_ID, Config.MEME_APP_SECRET);
        memeLib = MemeLib.getInstance();
    }
}
```

## 実機で実行できるか試してみる。
無事起動するハズ。

## Android 6.0 以上の場合
BLEのスキャンに ACCESS_COARSE_LOCATION または ACCESS_FINE_LOCATION パーミンションが必要になる。どちらかのパーミンションを AndroidManifest.xml に追加したら、OSのアプリ設定で作ったアプリの位置情報の許可をONにする。
![2016-12-31 06.13.37.png](https://qiita-image-store.s3.amazonaws.com/0/100147/f86a706c-c5b3-a439-e255-f28ae47adc3b.png)
webpackを便利に使う小技

解決したよ。それにしても、loaderって、いくつあるんだ？？？

# 困ったときには、custom-loader!あとwebpack-stringify-loaders!

って、ほぼ黒魔法だけど。

```shell-session:install 
npm install --save-dev custom-loader
```

```js:webpack.config.js(before)
const stringify = require('webpack-stringify-loaders');

module.exports = {
  module: {
    loaders: [{
      test: /\.tag\.pug$/,
      exclude: /node_modules/,
      loader: stringify([{
        loader: 'riotjs',
      }, {
        loader: 'pug-html',
        query: {
          pretty: true,
          exports: false,
          plugins: ['pug-plugin-no-yield'],
        },
      }]),
    }, {
```

```js:webpack.config.js(before)
const stringify = require('webpack-stringify-loaders');

module.exports = {
  module: {
    loaders: [{
      test: /\.tag\.pug$/,
      exclude: /node_modules/,
      loader: stringify([{
        loader: 'riotjs',
      }, {
        loader: 'pug-html',
        query: {
          pretty: true,
          exports: false,
          plugins: ['pug-plugin-no-yield'],
        },
      }]),
    }, {
```

```js:webpack.config.js(after)
const customLoader = require('custom-loader');
const riot = require('riot-compiler');
const utils = require('loader-utils');

// customLoder.loadersに自分用のloader(riot)をぶら下げる。
// query.name='riot'とかすると自分のが呼べる。
customLoader.loaders.riot = function(source) {
  const query = utils.parseQuery(this.query);
  return riot.compile(source, query.options || {});
};

module.exports = {
  module: {
    loaders: [{
      test: /\.tag\.pug$/,
      exclude: /node_modules/,
      loader: stringify([{
        loader: 'custom',   // custom-loaderに追加した、
        query: {
          name: 'riot',     // riotが呼ぶ。
        },
      }, {
        loader: 'pug-html',
        query: {
          pretty: true,
          exports: false,
          plugins: ['pug-plugin-no-yield'],
        },
      }]),
    }, {
```

## おまけ：loaderの情報をdumpするloader

```
customLoader.loaders.dummy = function(source) {
  "version,context,request,query,data,cacheable,loaders,loaderIndex,resource,resourcePath,resourceQuery,value,inputValue,options,debug,minimize,sourceMap,target,webpack".split(",").forEach((name) => {
    console.log(name, this[name]);
  });
  "ext,name,path,folder".split(",").forEach((name) => {
    var value = utils.interpolateName(this, `[${name}]`, {context: this.options.context});
    console.log(name, value);
  });
  return source;
};
```

このあたりのパス名を組み立てて、ごにょごにょすれば、teeっぽく、中間の内容を書き出しておくこともできる。
＃デバッグの時しか使わないけどね......
スライサー（FDM式３Ｄプリンタ向け）の作成　其の１（概要）

* [スライサー（FDM式３Ｄプリンタ向け）の作成　目次](http://qiita.com/isTwt/items/5d40286eec73296ea790)

-----

# １．はじめに

* 2009年頃：３Ｄによるモデリングを趣味で始める。（[Shade3D](https://shade3d.jp/)）
* 2014年末頃：３Ｄプリンタに関する動画，記事，ツイート等により興味を持ち始める。
* 2015年初頭：[BONSAI LAB.のBS01+](https://www.bonsailab.asia/)を購入。スライサーとして[Simplify3D](https://www.simplify3d.com/)も同時購入。
* 2015年末頃：スライサーソフトの開発を開始。
* 2016年頭頃：ほぼ完成したものの、速度的に使い物にならず、放置。
* 2016年末頃：まとめ作成開始。

　３Ｄプリンタ購入後、スライサー用語（パラメータの意味）が掴めなく、試行錯誤していました。
　また、スライサーの出力結果に満足行かない部分（ここはコウ動いたらきれいに出せるのに）等が出てきました。
　元来プログラマーだったので、スライサーを自作してみようと考えに至ります。
　しかし、スライサーソフトの構造自体に関する記事を日本語で見つけることができず．．．どのようにスライスしているのだろうと悩んだ次第です。
　このまとめは、自身の今後の改良のため、また、他の方へ何かしらの情報提供が出来ればと思います。



# ２．３Ｄプリント時の流れ

![流れ.png](https://qiita-image-store.s3.amazonaws.com/0/157557/fdedb24c-5513-7dbf-3967-e42da12cb30e.png)

 
　３Ｄプリントするには

1. 出力対象となるモデルデータの作成（私の場合Shade3Dによるモデリング。他者による作成済データがある場合は不要）
　出力：ＳＴＬファイルなど

1. 作成したデータをスライサーソフト（私の場合はSimplify3D）によりスライス
　入力：ＳＴＬファイルなど　出力：G-Code（直接３Ｄプリンタに通信で送信することも）

1. ３Ｄプリント（私の場合、BS01+に搭載されたMarlin）
　入力：G-Code

　つまり、スライサーソフトは、モデルデータを読み込み、各種パラメータに従い、G-Codeを生成するソフトになります。

　今回作成したソフトは、ＳＴＬ形式のモデルデータを入力可能とし、G-Codeを出力します。

# ３．おわりに
　まずは、ソフト開発の経緯とスライサーソフトの超概要でした。
node_exporterをdocker swarmモードで使う

Prometheusが非常に良くできていて楽しい今日この頃。

node_exporterを `docker service --mode global`でnodeごとに立ち上げて `prometheus.yml`にて以下のようにjobを指定するとdnsのAレコードから適当に見つけてくれます。

```yaml
  - job_name: 'node-exporter'
    dns_sd_configs:
    - names:
      - 'tasks.node-exporter'
      type: 'A'
      port: 9100
```

ところが、Prometheusがnode_exporterに割り当てるinstanceラベルが曲者で、`10.0.0.44:9100`のようなIPアドレスとポート番号の組になってしまいます。
dockerコンテナのIPアドレスは再起動すると変わってしまう可能性があるので、データの一貫性が損なわれてしまいます。

現状では以下のような問題があり、Prometheus側に一貫性のあるinstanceラベルを割り振らせることが困難です。

* 現時点ではSwarmKit は SRVレコードを扱えない (See https://github.com/docker/docker/issues/24605)
* node_exporter 側で node名などのラベルをインジェクションする提案は蹴られて実装されていない (See https://github.com/prometheus/node_exporter/issues/319)
* Prometheus 側ではコンテナのIPアドレスからどのノードで動いているのかresolveする機能は実装されていない

ということで、現状の Prometheusとnode_exporterに以下のような機能を追加したバージョンを作成しました。

* node_exporter の起動オプション `--name /path/to/hostname_file` を追加。
    *  http://node-exporter:9100/name は`hostname_file`の中身の文字列をそのまま返す
    * `docker service create --mount type=bind,src=/etc/hostname,dst=/etc/host_hostname,ro=1` 的に mount して使用する事を想定。
* prometheus の設定ファイルの `dns_sd_configs:` に `name:` オプションを追加。
    * jobに対してinstanceラベルを直接問い合わせる
    * `name: "/name"` と指定する事を想定 `http://host:port/name` の応答をinstanceラベルとする
    
設定ファイルの例)

```yaml
  - job_name: 'node-exporter'
    dns_sd_configs:
    - names:
      - 'tasks.node-exporter'
      type: 'A'
      port: 9100
      name: "/name"
```     

*docker repositories*:
* https://hub.docker.com/r/s21g/prometheus/
* https://quay.io/repository/s21g/node-exporter

*github*:
* https://github.com/genki/prometheus
* https://github.com/genki/node_exporter
Anki を使って Ruby のメソッドを暗記する

## はじめに

私はクラスやメソッドをいちいち覚えていませんし、その必要性もそれほどないと思っています。基本的には必要に応じて調べればいいのです。

しかし覚えていた方が早いことは間違いありません。

それにちょっとした記憶の引っ掛かりで「ライブラリのメソッドであれができる」「このメソッドで気をつけるのはこの点」というのを知っていないと、そもそも調べることもせずに自前で実装したりして無駄なコストが発生していしまいます。

私は業務でメインにRubyを使っているわけではないので、コードを書くときに意外とこういうことで引っかかったりしたりします。

## Anki用のRuby組み込みライブラリのメソッドDeck

そこで Ruby 組み込みライブラリのメソッドを覚えるための[Anki](http://ankisrs.net/)のDeckを作ってみました。

https://ankiweb.net/shared/info/1076450249

[Anki](http://ankisrs.net/) は暗記を助けるサービスで問題をカード形式で出題してしてくれます。

特徴は[エビングハウスの忘却曲線](https://ja.wikipedia.org/wiki/%E5%BF%98%E5%8D%B4%E6%9B%B2%E7%B7%9A)に従って、しかるべきタイミングで暗記したカードを再出題してくれる点です。
そのおかげで効果的に復習でき暗記を助けてくれます。

サービスにはWeb, Windows, Mac, Linux, iOS, Andorid のアプリがありiOS以外は無料です。

暗記する問題は Deck という単位でまとまられており、言語などを中心に世界中のユーザーが様々な暗記データの Deck を共有しています。

この Anki で使える Ruby の組み込みメソッドの Deck を作成して共有しました。

## イメージ

### 出題画面
<img src="https://qiita-image-store.s3.amazonaws.com/0/10012/4827d90e-a461-3e6f-9967-dc35ab8efcde.png" width="300px">


### 解答画面
<img src="https://qiita-image-store.s3.amazonaws.com/0/10012/53060be6-9c21-a77f-baf4-d96db97c2f22.png" width="300px">
分からなければ赤色のボタン、分かれば緑色のボタン(7d)、楽勝なら一番右のボタン(16d)というような感じです。


## 感想 ##

本当に暗記する必要はないと思いますが、まあ記憶の取っ掛かりを作るにはいいと思います。

実際にやってみた感想ですが、組み込みメソッドよりも標準ライブラリの方が欲しかったかな。
あと公式からスクレイピングでデータを取得したのですが Rdoc から生成したほうがもっと汎用的だったなー、とも思いました。

ソースコード
https://github.com/ichiroc/rubydoc2anki
vim設定備忘録

# Ultimate Vimrc
https://github.com/amix/vimrc
便利パッケージや設定がまとまってるので最初に入れておくと便利。
(何故か[git-gutter](https://github.com/airblade/vim-gitgutter)は自分で再インストールする必要があった)

カスタマイズは、インデントの幅を２文字にしたりコードの折りたたみを無効にしているくらい。

# nerdtree-git-plugin
https://github.com/albfan/nerdtree-git-plugin
その名の通りnerd treeのgit plugin。
ファイルのgitステータスがツリー上でわかる。Atomからvimに乗り換えたのでこれがないと不安。
[オリジナル](https://github.com/Xuyuanp/nerdtree-git-plugin)じゃなくてフォークリポジトリを使ってるのは、.gitignoreのファイル・フォルダを隠してくれるから。