OmniAICreator/Qiita-1.07M huggingface dataset:
boto3でDynamoDBのセカンダリインデックスを使う

# DynamoDBのセカンダリインデックス

DynamoDBではセカンダリインデックスを使うことができます。詳しくは[この辺り](http://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/SecondaryIndexes.html)を参照してください。

## boto3からセカンダリインデックスでアイテムを探す

boto3からのアクセス方法が最初わからなかったので残しておきます。
グローバルセカンダリインデックスとして`second`が設定しているテーブルに対してアクセスします。

![DynamoDB · AWS Console 2017-04-05 18-25-13.png](https://qiita-image-store.s3.amazonaws.com/0/10236/6b8ed659-5fa8-0061-c899-94ead0cfe511.png)
![DynamoDB · AWS Console 2017-04-05 18-27-45.png](https://qiita-image-store.s3.amazonaws.com/0/10236/aa52c9aa-e13a-7d78-01ff-6e60915d76ea.png)


```
import boto3
from boto3.dynamodb.conditions import Key

dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table('test-table')

response = table.query(IndexName='second-index', KeyConditionExpression=Key('second').eq('hoge'))

print(response['Items'])

> [{'key': '1', 'second': 'hoge'}]

```

## 参考情報

[amazon web services - How do we query on a secondary index of dynamodb using boto3? - Stack Overflow](http://stackoverflow.com/questions/35758924/how-do-we-query-on-a-secondary-index-of-dynamodb-using-boto3)
javascriptでページトップへ実装の書き方

## 考え方
- オブジェクトの中に各メソッドを書く
- プロパティにjQueryオブジェクトやスクロール量を設定
- 初期化、エフェクト、イベントをメソッドで分ける
- settimeoutでスクロールイベントが終わったらボタンが表示される
- settimeoutでリサイズイベントが終わったらウィンドウ高さの値を取得
- initメソッドのプロパティの値でカスタマイズできるようにする(再利用性)

## 環境
- jQueryの記述あり
- ES6以前の書き方(thisとかvarとか)

## 書き方

``` javascript:javascript

var PageTop = {
  init: function(obj) {
    var self = this;
    self.targetElement = $('.PageTop');
    self.contentsHeight = $('html, body').height();
    self.windowHeight = $(window).height();
    self.scrollSpeed = obj.scrollSpeed;
    self.timerDisplay = obj.timerDisplay;
    self.setClickEvent();
    self.setScrollEvent();
  },
  animationPageToTop: function() {
    var self = this;
    $('html, body').animate({
      scrollTop: 0,
    }, self.scrollSpeed, 'swing');
  },
  animationHideBtn: function(obj) {
    var self = this;
    if (obj.Show) {
      self.targetElement.removeClass('Show');
      self.targetElement.addClass('Hide');
    }
  },
  animationShowBtn: function() {
    var self = this;
    self.targetElement.removeClass('Hide');
    self.targetElement.addClass('Show');
  },
  resizeEvent: function() { // windowリサイズしたときの高さ幅を取得
    var self = this;
    var timer = false; // リサイズ終了判定
    $(window).on('resize', function() {
      clearTimeout(timer);
      timer = setTimeout(function() { // リサイズが終わったら
        self.windowHeight = $(window).height();
        if (self.contentsHeight <= self.windowHeight) { // スクロールバーが非表示のときはページトップ画像を非表示
          if (self.targetElement.hasClass('Show')) { // .Hideのアニメーションの有効、無効を分岐
            self.animationHideBtn({ Show: true });
          } else {
            self.animationHideBtn({ Show: false });
          }
        }
      }, self.timerDisplay);
    });
  },
  setClickEvent: function() {
    var self = this;
    self.targetElement.find('a').on('click', function() {
      self.animationPageToTop(self.scrollSpeed);
    });
  },
  setScrollEvent: function() {
    var self = this;
    var timer = false;
    $(window).on('scroll', function() {
      clearTimeout(timer);
      timer = setTimeout(function() {
        self.resizeEvent();
        if (self.contentsHeight > self.windowHeight) { // ウィンドウ高さよりもコンテンツ高さ幅が短い場合は無効
          var scrollTop = $(window).scrollTop();
          // ウィンドウサイズの1/3以上スクロールしたらページトップ表示
          if (scrollTop > ($(window).height()) / 3) {
            self.animationShowBtn();
          // コンテンツの高さが短く、スクロール量が少ない場合の処理
          } else if (self.contentsHeight <= self.windowHeight + scrollTop) {
            self.animationShowBtn();
          // ページリロード時のページトップ画像のちらつきを解消
          } else {
            if (self.targetElement.hasClass('Show')) { // .ExHideのアニメーションの有効、無効を分岐
              self.animationHideBtn({ Show: true });
            } else {
              self.animationHideBtn({ Show: false });
            }
          }
        } else {
          return false;
        }
      },  self.timerDisplay);
    });
  }
};

PageTop.init({
  scrollSpeed: 500,
  timerDisplay: 300
});
          
```
Hello NEM! はじめまして！

(2019年1月に加筆修正したものをnemlogに掲載しています。そちらをご覧ください)

[Hello NEM! はじめまして！|暗号通貨 nemを使用した寄付機能付きブログコミュニケーションサービス](https://nemlog.nem.social/blog/9541)

はじめまして Taka Nobu です。
最近ブロックチェーンについて勉強を始めました。

といってもビットコインではなく、NEMという暗号通貨です。
何故ビットコインじゃないの？

いろいろいきさつはあるのですが、NEMが便利だったからです。
最近では、ビットコインじゃなくてNEMが広まればいいのに…と思うまでになりました。

それらの理由はこれからのエントリで触れていこうと思います。
とりあえず今日は所信表明。

もっと多くのエンジニアがNEMという暗号通貨に興味を持って新サービスを次々と生み出し
投資家の方がそれらの活動を支援する、新しい経済体系が生まれればと思います。

これからよろしくお願いします。

（追記）
とても素敵なツイートを発見したので、ここで引用させていただきます。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">いよいよブロックチェーンが、実用する時代が到来だね。アプリ開発に集中できる。ブロックチェーンは、インフラであり、プロトコル。<br><br>ウェブアプリ作るのに、HTTPやTCP/IPのコードを書かないのと一緒。<a href="https://twitter.com/hashtag/nem?src=hash">#nem</a> <a href="https://twitter.com/hashtag/xem?src=hash">#xem</a> <a href="https://twitter.com/hashtag/mijin?src=hash">#mijin</a> <a href="https://t.co/ta4IF1LrG2">https://t.co/ta4IF1LrG2</a></p>&mdash; KENJI TSUTSUMI (@maro_kt) <a href="https://twitter.com/maro_kt/status/865042689888210944">2017年5月18日</a></blockquote> <script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

----
以下のNEMアドレスは、全てNEM上でエンジニアが活動できるための資金に使用します。
これから私が書く記事に共感していただけましたら、ご寄附いただけると助かります。

NEM ADDRESS: NBZNQL-2JDWTG-UAW237-PXV4SS-XSPORY-43GUSW-GSB7
Amazonの購入確認画面で最適なポイントを付与するスニペット

超ニッチ。
Amazonゴールドカード会員用。
ただ単に合計額を20で割りきれるようにしているだけ（20 * 2.5% = 0.5で、切り上げで1ポイントになるから）。

ポイントに応じてmodの法の数値を変える。
ブックマークレットにするといいと思う。

```javascript
javascript:(function() {
	let price = +$(".grand-total-price strong").text().replace("￥ ", "").replace(/\D/g, "");
	let point = price % 20;

	if(point) {
		$("#spc-loyalty-points-input").val(point);
		$(".changePoints").click();
	}
})()
```


minified version

```javascript
javascript:(function(){let price=+$(".grand-total-price strong").text().replace("￥ ","").replace(/\D/g,"");let point=price %2520;if(point){$("#spc-loyalty-points-input").val(point);$(".changePoints").click();}})();
```
Unity5.5 衝突判定メモ

## 衝突判定メモ
Rigidbody2D,BoxCollider2Dの衝突判定に関して少し動作検証してみた。
当たり前の動作かもしれないけど、再確認。

**・オブジェクト**
プレイヤー、敵、地面、ゴール地点(旗)
すべてにRigidbody2D,BoxCollider2Dを付ける。

**・スクリプト**
適当に書いてプレイヤーが動くようにする。

## 挙動①
敵のBoxCollider2DのIsTriggerにチェックを入れると物理挙動は無視される。

**・想定挙動**
プレイヤーと敵の衝突時OnTriggerEnter2Dが呼ばれる。
敵は地面を無視して落下する。

**・実際の挙動**
プレイヤーと敵の衝突時OnTriggerEnter2Dが呼ばれる。
敵は地面を無視して落下した。

**・分かったこと**
IsTriggerにチェックを入れると物理挙動は無視されて、OnTriggerEnter2Dが呼ばれる。
Rigidbody2Dをゴール地点(旗)に付けている場合、落下して困るのでBodyTypeをKinematicにする。
それなら地面、ゴール地点(旗)はRigidbody2D要らないと思った。


## 挙動②
敵のBoxCollider2D　IsTriggerにチェックなし、物理挙動が有効になる。

**・想定挙動**
プレイヤーと敵の衝突時OnCollisionEnter2Dが呼ばれる
敵は地面で止まり落下しない。

**・実際の挙動**
プレイヤーと敵の衝突時OnCollisionEnter2Dが呼ばれる。
敵は地面で止まり落下しなかった。

**・分かったこと**
Is Triggerにチェックない場合、OnCollisionEnter2Dが呼ばれるのでこっちで衝突判定をする。
敵とか物理挙動させたい場合は、BoxCollider2DでIsTriggerにチェックをいれちゃダメ(落下するから)、あとBodyTypeをKinematicにすると動かなくなるからダメ。

## まとめ
**・敵など物理挙動をさせたいオブジェクト**
OnCollisionEnter2Dで衝突判定を行う。

|項目|設定値|
|:-:|:-:|
|BoxCollider2D|IsTriggerはチェックなし|
|Rigidbody2D|BodyTypeはDynamic|

**・ゴール地点(旗)など物理挙動不要なオブジェクト**
OnTriggerEnter2Dで衝突判定を行う。
物理挙動はいらないのでRigidbody2Dは無くてOKだと思う。
RealmのIDを自動採番（オートインクリメント）する方法

# はじめに
`Realm`には`auto increment`の機構がありません。
なので、僕なりに工夫したことを残しておきます。

なお、本コードはスレッドセーフで使うことを前提としています。
もし、非同期で同時のタイミングで保存する可能性がある場合は`synchronized`などの処理を施してください。

# コード
何はともあれコードは以下になります。

```swift
class RObject: Object {
    // ID
    dynamic var id = 0

    // データを保存。
    func save() {
        let realm = try! Realm()
        if realm.isInWriteTransaction {
            if self.id == 0 { self.id = self.createNewId() }
            realm.add(self, update: true)
        } else {
            try! realm.write {
                if self.id == 0 { self.id = self.createNewId() }
                realm.add(self, update: true)
            }
        }
    }
    
    // 新しいIDを採番します。
    private func createNewId() -> Int {
        let realm = try! Realm()
        return (realm.objects(type(of: self).self).sorted(byKeyPath: "id", ascending: false).first?.id ?? 0) + 1
    }
    
    // プライマリーキーの設定
    override static func primaryKey() -> String? {
        return "id"
    }
}
```

# 使い方
Modelオブジェクトを以下のように定義します。

```swift
class User: RObject {
    // 名前
    dynamic var name = ""
}
```

上記のクラスを保存する場合

```swift
let user = User()
user.name = "hoge"
user.save()
```

更新もしくは新規登録する場合

```swift
let realm = try! Realm()
let user = realm.objects(User.self).first ?? User()
try! realm.write {
    user.name = "hoge"
    user.save()
}
```

# 最後に
この方法を使えば全てのオブジェクトに`id`が自動的に付与されるので`Rails`のように使えます。（言い過ぎ
注意点として、現在のバージョン（2.5.0）の時点では親子関係があってもキャストができないので注意。
（`RObject`にキャストすることはないと思いますが、、、念のため）
【Atom】HTML 構文エラーを絶対に見逃さない！！

# 前提
1個もエラーを出さない！という意味ではなく、
あくまで**見逃さない**ということなので、許容とするものなどは各々でご判断ください。

# 使用するパッケージ
- linter-htmlhint
- w3c-validation

# linter-htmlhint
書きながらリアルタイムで構文エラーチェックをしてくれるパッケージです。
こちらを導入されている方は多いのではないでしょうか。

ただ、このパッケージではエラー判定をしてくれないものが稀に存在するようです。
今のところ確認出来ているのは、空白文字（U+000b）が紛れ込んでいた場合でもスルーされていました。

# w3c-validation
保存したタイミング（デフォルト設定）で構文エラーチェックをしてくれるパッケージです。
スルーされてしまったエラーを補うために導入してます。
（空白文字のエラー判定もちゃんと出ました）

なので、リアルタイムでの「linter-htmlhint」と保存時の「w3c-validation」で二重チェックを行っているということです。

# まとめ
色々なサイトを見ていると、
「あ～初歩的な構文エラーが出てる～」ってことがよくありますので、
そういう**もったいないミス**は機械的に防ぎましょう(-ω-)/
bashでカッコを駆使して例外処理してみる

Bashで少し細かい例外処理やtry-catch文っぽいことをしたかったのでメモ

## trapでいいんじゃないの？

trapを使うことで、コマンドがエラー復帰した際や、
Ctrl-Cで強制終了された際に実行される処理を定義できます。

```bash
#!/bin/bash
finalize(){
  echo "Finalization"
  exit 1
}

set -e
trap "finalize" ERR 2

コマンド１
コマンド２
コマンド３
コマンド４

```


しかし、こういう書き方は以下の欠点があると思ってます。

- 処理途中のコマンドで、エラー復帰を無視したい場合のコーディングが複雑
- エラー処理の振る舞いを、処理ごとに変えたい場合にわかりづらくなっていく

１点目に手っ取り早く解決するなら、下記のようなコードを書けば、
いいですが、直感的に理解しづらくなります（と私は感じました）。

```bash
#!/bin/bash
finalize(){
  echo "Finalization"
  exit 1
}

set -e
trap "finalize" ERR 2

コマンド１
コマンド２ || true ## コマンド２が失敗しても、正常復帰させる
コマンド３
コマンド４ || true ## コマンド４が失敗しても、正常復帰させる

```

2点めについては、下記のように書けばいいと思いますが、
どの行でどのtrapが実行されるのかわかりにくくなっていきそうです。。

```bash
set -e

hoge1(){

}
trap "hoge1" ERR

コマンド１
コマンド２
コマンド３
コマンド４

hoge2(){
}
trap "hoge2" ERR

コマンド５
コマンド６
コマンド７
コマンド８
```

## サブシェル()を駆使して、try-catchっぽく書く

というわけで、なんとかならないかな？と思ってたどり着いた方法が以下です。

```bash
#!/bin/bash

raise(){
   echo "raise exception"
   exit 1
}

# try
(
  コマンド１ || raise
  コマンド２
  コマンド３ || raise
  コマンド４
) || {
# catch
  echo "Finalization"
  exit 1
}

```
### 解説

`()`でくくると、その中身はサブシェルとして実行されます。

エラー復帰したら例外処理したいコマンドは`exit 1`させます。
それが、`コマンド１ || raise`の部分です。

`()`から抜けた後は、親シェルに`()`のリターンコードが返却されます。
0以外が返却された場合は、`||`でつなげた、catch部分の処理が動きます。


#### 余談

ちなみに `trap "finalize" ERR 2`すると、Ctrl-Cで終了した後にfinalizeが2回呼び出されました。Bashはまだまだ闇が深い...
さくらのVPSからクラウドはクローンできるけどVPSからVPSはクローンできないので無理やりRSYNCでコピーしてみた



##さくらのVPSで環境をまるごとコピーするためのrsyncコマンド
ということで以下のサイトというかgithubのコードを見つけたのですがこれだと大変なことになってしまったのでそちらのコメントにも書いていますが、そのまま実行してしまうとシステムがabortします。ログインできなくなります。
https://gist.github.com/poppen/2307504

というのは、/etc/sysconfig/network-scriptsもコピー対象になっていたからです。
※もしかしてOSがLinux系じゃないのかな。。。。

ちなみに、これを実験したのは、CentOS7でした。

そのファイルが書き換えられてしまうとipアドレスが変わってしまいます。
rsyncしている最中にIPがrsyncの元と同じになってしまいます。

ということで、正しくは以下の通りかな。

まだ修正ポイントがありそうなのですが、とりあえずIPさえ変更しなければログインできます。


```bash
rsync -rtlzvogpHAX --rsync-path="rsync" --delete --exclude /dev/ --exclude /etc/network/ --exclude networks --exclude hosts --exclude /boot/ --exclude /proc/ --exclude /sys/ --exclude /var/run/ --exclude /var/lock/ --exclude fstab --exclude /etc/sysconfig/network-scripts/ifcfg-eth0 --exclude ssh_host_* --block-size=4096 -e ssh / 999.999.999.999:/
```
Node.js + Express + あえてCloudant で REST APIを作成する（開発編①）


## はじめに
[Node.js + Express + あえてCloudant で REST APIを作成する（準備編）](http://qiita.com/rinaxsumomo/items/d40e3b95a14fd11638d5)の続きです。
expressコマンドでアプリケーションの雛形を作成し、準備編で作成したCloudantのサンプルDB（animaldb)への接続確認をします。

## Expressで雛形作成
コマンドの流れは以下の通りです。

```Expressコマンド
$ express appName
$ cd appName
$ ls
$ npm install
$ npm start
```

* 以下は実行例です。

![Kobito.s1VybM.png](https://qiita-image-store.s3.amazonaws.com/0/129662/454a1cb1-0c26-af32-dc5c-3e02bf8c0e3d.png "Kobito.s1VybM.png")

![Kobito.inBjNQ.png](https://qiita-image-store.s3.amazonaws.com/0/129662/4c31629a-1eb4-3b98-b693-8a0f625e758a.png "Kobito.inBjNQ.png")

![Kobito.htPlrz.png](https://qiita-image-store.s3.amazonaws.com/0/129662/4672b3db-f503-28c6-173f-fa6b34a9504a.png "Kobito.htPlrz.png")

![Kobito.4JZzjK.png](https://qiita-image-store.s3.amazonaws.com/0/129662/130ea1ff-e2b0-1bdf-8d7f-a8b9f48a4005.png "Kobito.4JZzjK.png")

* デフォルト・アプリケーションがポート番号3000で動いているのが確認できます。

![Kobito.tj7evv.png](https://qiita-image-store.s3.amazonaws.com/0/129662/d888c72c-5731-6ed1-6fea-4950bfa6c42c.png "Kobito.tj7evv.png")


## Cloudantへの接続確認
```認証設定

$ npm install dotenv //もし入っていなければ
$ echo "/.env"
$ echo "cloudant_username=xxxxxxxxx" > .env
$ echo "cloudant_password=yyyyyyyyy" >> .env

```

```Javascript:cloudantTest.js
var Cloudant = require('cloudant');
require('dotenv').load();
var me = process.env.cloudant_username;
var password = process.env.cloudant_password;

var cloudant = Cloudant({account:me, password:password});

cloudant.db.list(function(err, allDbs) {
 console.log('All my databases: %s', allDbs.join(', '))
});


```

```実行
$ node cloudantTest.js

```

* 以下は実行例です（いったんnodeコマンドで実行しています。）
	* 上記スクリプトは接続テスト目的のみで以降は使いません。
	* 準備編で作成したanimaldbも含まれていることがわかります。

![Kobito.j554Jm.png](https://qiita-image-store.s3.amazonaws.com/0/129662/447e5072-d34c-ef4c-0217-d125584b119d.png "Kobito.j554Jm.png")

## まとめ
以上で雛形作成と接続確認が完了しました。次回はCloudantドキュメントに対してCRUD操作を行うコードとAPI設計について書いていきます。


## 参考文献
* https://github.com/cloudant/nodejs-cloudant
GitHubから「.git」なしでリポジトリをエクスポートする。または、リポジトリのサブディレクトのみエクスポートする。

<div align="center">
  <a href="http://bit.ly/cyginst"><img width="426" height="67" src="https://raw.githubusercontent.com/javacommons/qiita/master/jc-banner-2017-0419-0240.gif" /></a>
</div>

<hr />

# **あまり知られてませんが、GitHub には「Subversionサポート」機能があります【脚注[^1]】**

[^1]: https://help.github.com/articles/support-for-subversion-clients/ 『Support for Subversion clients - GitHub User Documentation』

この機能を利用してリポジトリをエクスポートするには、Subversion **クライアント**(svnコマンド)がインストールされている必要があります。(後で本文に組み込みますが、**svnコマンドのインストール方法については、この記事のコメントに書き込みましたのでご覧ください**)
> - **Subversionのサーバーは要りません。svnコマンドが使えれば良いです…gitコマンド(gitクライアント)を使うのにgitサーバーを自分で立てる必要がないのと同じことです。**
>
> - GitHubのサーバーが**「Gitサーバー」兼「(仮想の)Subversionサーバー」として振る舞う**ということです。

[^2]: https://www.ibm.com/developerworks/jp/opensource/library/os-cloud-apache-thrift/ 『スケーラブルなクラウド・ソフトウェアの開発を Apache Thrift で単純化する』

## https://github.com/apache/thrift (**Apache Thrift**【脚注[^2]】)というリポジトリーがありますが、このリポジトリをサンプルとしてご説明します。

- リポジトリのmasterから、リポジトリ全体をエクスポートするには以下のコマンドを実行します。「thrift-master」というフォルダにエクスポートするコマンドです。

```
svn export https://github.com/apache/thrift/trunk thrift-master
```

- また、「Subversionサポート」機能では、**リポジトリのサブフォルダのみを取り出す**ことができます。

```
svn export https://github.com/apache/thrift/trunk/test thrift-master-test
```

- ブランチ(0.5.x)を指定してリポジトリ全体をエクスポートする例。

```
svn export https://github.com/apache/thrift/branches/0.5.x thrift-0.5.x
```

- ブランチ(0.5.x)のサブフォルダ(test)をエクスポートする例。

```
svn export https://github.com/apache/thrift/branches/0.5.x/test thrift-0.5.x-test
```

- タグを指定してリポジトリ全体をエクスポートする例。

```
svn export https://github.com/apache/thrift/tags/0.9.3 thrift-tag-0.9.3
```

- タグを指定してサブフォルダをエクスポートする例。

```
svn export https://github.com/apache/thrift/tags/0.9.3/test thrift-tag-0.9.3-test
```

# `#`**後で、校正・加筆するかもしれません。**

<table height="400" width="600"><tr><td>
😲<b>セーラームーン / ムーンライト伝説 (ユーロビート)ver.</b>
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">セーラームーン / ムーンライト伝説 (ユーロビート)ver.<a href="https://t.co/o91qCKNtAW">https://t.co/o91qCKNtAW</a></p>&mdash; JavaCommons (@javacommons) <a href="https://twitter.com/javacommons/status/849831235933224960">2017年4月6日</a></blockquote>
</td></tr></table>
Lambdaの開発環境を作る

# まずは開発言語を決める

開発環境は開発言語に左右されるので、まずは開発言語を決めます。

前提として、LambdaはNode.js、Java、C#、Pythonが利用できます。
Node.jsを使おうと思いますが、慣れ親しんだJavaも捨てがたいので、まずはJavaで動くものを作ってから同じ機能をNode.jsで書いてみようと思います。

言語がJavaに決まればIDEもEclipseで決まりです。
ということで日本語化されたEclipseを入手します（いつもお世話になっております）

Eclipse 4.6 NeonをインストールしたらAWS Toolkit for Eclipseのプラグインを導入します。

導入方法についてはAWS Toolkit for Eclipseで検索すればすぐ見つかるので、導入方法は割愛します。

# IAMからEclipse用のユーザを作成する。

AWS Toolkit for Eclipseを導入すると、EclipseからAWSにアクセスするためのアクセスキーIDと秘密アクセスキーの入力を求められます。

![4.eclipse設定.png](https://qiita-image-store.s3.amazonaws.com/0/169729/54200ad7-36d1-b101-3093-0414df3c60a8.png)



登録しておけば、ブラウザからAWSマネージメントコンソールを開かなくても、いろいろ出来るのでEclipse用のIAMユーザを作って登録しておきます。
※ユーザにどのような権限を付与しておけば良いかは後々書こうと思います。
macOS（あるいはOS X）のバージョン毎にインストールするライブラリを分岐する

## やりたいこと

Sierra(ProductVersion 10.12以降)だったら `cmd-eikana` をインストール。
それ以前は `karabiner` をインストールする的なことをやりたい。

## 結論

```bash
osVersion=$(sw_vers -productVersion)

if [[ "$osVersion" =~ "10.12" ]]; then
  brew cask install cmd-eikana
else
  brew cask install karabiner
fi
```

## 参考

[How to find out Mac OS X version from Terminal?](https://superuser.com/questions/75166/how-to-find-out-mac-os-x-version-from-terminal)
Go言語でfloatの乱数を範囲指定で生成する

randパッケージはIntn()で範囲指定の乱数を生成できるが，floatでは出来ないので下記のコードで生成する．

```main.go
package main

import (
	"fmt"
	"math/rand"
	"time"
)

func random(min, max float64) float64 {
	rand.Seed(time.Now().UnixNano())
	return rand.Float64()*(max-min) + min
}

func main() {
	max, min := 0.0, 5.0
	for i := 0; i < 5; i++ {
		fmt.Println(random(max, min))
	}
}
```

実行結果

```
$ go run main.go
4.5879148973737935
3.7805664986881684
0.4223481031130064
2.6733873103691015
4.961673820044476
```
postgresqlでのconnection timeout

## 症状

pgpool-IIをネットワークインターフェースごと落とした際に、connect_timeoutを設定していても
初回のクエリ実行でのみtimeoutがエラーが返ってこないという現象にあたったのでそれの対処方法
https://godoc.org/github.com/lib/pq

## 症状が出た時の環境
+ golang: 1.7系
+ ドライバ: lib/pq
+ pgpool-II: 3.6.1 
+ PostgreSQL: 9.5

## 対処方法
golangを1.8にバージョンアップして`QueryRowContext`を使う
https://golang.org/pkg/database/sql/#DB.QueryRowContext

QueryRow以外にもContext版があるのでそちらを使う

```go
//前の処理
//Timeout Contextを作成
ctx, cancel := context.WithTimeout(context.Background(), time.Second)
defer cancel()

errChan := make(chan error, 1)

query := "select name from user limit 1"
var name string

go func() {
 errChan <- db.QueryRowContext(ctx, query).Scan(&name)
}()

select {
case <-ctx.Done():
	err = ctx.Err()
	break
case err = <-errChan:
	break
}
//続きの処理
```
Node.js v7.6.0から使えるasync awaitをmochaでやってみた

```js
// sample functions
function resolveAfter2Seconds(x) {
  return new Promise(resolve => {
    setTimeout(() => {
      resolve(x);
    }, 2000);
  });
}
async function add2(x) {
  var a = await resolveAfter2Seconds(20);
  var b = await resolveAfter2Seconds(30);
  return x + a + b;
}

// mocha code
describe('hoge', () => {
  it('fuga', async () => {
    const v = await add2(10);
    require('assert')(v === 60);
  });
});

```

async awaitのサンプル関数は、いつもお世話になっている[mozillaさんのサイト](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/async_function)から引用させていただきました。（コピペすれば動くように書いてあります。）

ポイント的には、
・itでasyncファンクション使っている
・add2のasyncファンクションの返り値がnew Promiseしてないのに自動でPromiseオブジェクトになっている
ことですかね。

やってて気になったのは既存コードがPromise仕様じゃないと使いづらいのと、Node.jsのversionを最新に上げないといけないところですかね。
PostgreSQLのバージョンを確認する方法

`PostgreSQL`のバージョンが環境によって違うので、それに合わせた環境でDB作る必要がある。
その時に、このバージョンが何なのか分からなくなるのでメモ。

```
$ psql hogehoge
psql (9.5.6, サーバー 9.3.16)
```

これ、どっちが正しいの？
良く分からないのでが確実な方法を...

```
# SELECT version();
postgreSQL 9.3.16 on x86_64-unknown-linux-gnu, compiled by gcc (GCC) 4.8.5 2015
0623 (Red Hat 4.8.5-11), 64-bit
```

よし。これで確実だ！
【Atom】プロジェクトごとに FTP 設定をする方法

結論から書いてしまいますが、
Remote-FTP のコンフィグ設定はフォルダに紐づいているので、
各プロジェクトフォルダに各プロジェクトごとの設定ファイルを置いてあげれば OK です。

というのは、知っている人からしたら何てこと無い話かと思いますが、
僕も使うまでは個別設定出来ないと思っていましたし、あまりそういう風に書いてる記事も少ないので、知らない人向けに書いてみました。

そして、今回はその設定方法と Remote-FTP を便利に使うための方法を書いていきます。

# 使用するパッケージ
- project-manager
- Remote-FTP
- tool-bar
- flex-tool-bar

# project-manager
プロジェクト設定ができ、一発でフォルダを開くことが出来るパッケージです。

**設定方法**
1. ツールバーの「Packages」⇒「Project Manager」⇒「Edit Projects」を選択
2. 設定ファイルが開くので、以下のように設定

```cson:projects.cson
[
  {
    title: "PJ1"
    paths: [
      "C:\\Users\\hoge\\Documents\\pj1"
    ]
  }
  {
    title: "PJ2"
    paths: [
      "C:\\Users\\hoge\\Documents\\pj2"
    ]
  }
]
```
プロジェクトを開く場合は、Windows は「Alt+Shift+P」、Mac は「Ctrl+Command+P」で設定したプロジェクト一覧を開けますので、開きたいプロジェクトをクリックすれば OK です。

# Remote-FTP
FTP or FTPS / SFTP 接続設定が出来るパッケージです。

**設定方法**
1. プロジェクトごとに設定をしたいので、project-manager から接続設定をしたいプロジェクトを開く
2. ツールバーの「Packages」⇒「Remote-FTP」⇒FTP or FTPS の場合は「Create FTP config file」、SFTP の場合は「Create SFTP config file」を選択
3. 設定ファイルが開くので、必要な項目を入れて「connect」を選択して繋がったことを確認

通常の FTP 接続であれば、最低限以下の項目を入れてあげれば OK だと思います。

- host：ドメイン名/IPアドレス
- user：ユーザ名
- pass：パスワード
- remote：接続先のルートディレクトリ

ちなみにですが、自動でアップロードさせたくない場合は、
設定画面から「Auto Upload On Save」を「never」にしてください。

アップする際は、ファイルを右クリックして「Upload」を選択すれば OK です。

# tool-bar, flex-tool-bar
カスタマイズ出来るツールバーを追加することが出来るパッケージです。
このパッケージを使って、ツールバーに Remote-FTP での接続・切断ボタンを配置します。

参考サイト：http://rfs.jp/sb/atom-github/atom_package_remote_ftp.html

**設定方法**
1. 左上の歯車アイコン（Edit Tool Bar）を選択
2. 設定ファイルが開くので、以下の記述を追記

```cson:toolbar.cson
[
  # remote-ftpパッケージのパネル開閉
  {
    type: "button"
    icon: "cloud-upload"
    callback: "remote-ftp:toggle"
    tooltip: "リモートパネルの開閉"
  }
  # remote-ftpパッケージのリモートからの切断
  {
    type: "button"
    icon: "circle-slash"
    callback: "remote-ftp:disconnect"
    tooltip: "リモートから切断"
  }
]
```
これで歯車アイコンの右にボタンが追加されたかと思います。

# まとめ
Atom を使い始めてまだ日が浅いのですが、
何か使い勝手に困るたびにパッケージを調べてみると、意外と欲しいものが見つかったりして便利ですよね。

これは意外と知られてないけど便利！みたいなパッケージをご存知でしたら、ぜひ教えてくださいm(__)m
Apache Hadoop hadoop-openstack moduleのテストを回す


## 概要

[記事: Apache Hadoopのユニットテストを回す](http://qiita.com/ajis_ka/items/9e6e093311dfd2ae6b2b)の補足です。試行錯誤の結果ついにhadoop-openstack moduleのテストを回すことに成功したのでメモを共有します。

## おおまかな手順

1. Rackspace Cloudと契約する
2. auth-keys.xmlを記述する
3. テストを実行する

以下、各項目の詳細について説明します。

## Rackspace Cloudと契約する

自分でOpenStack Swiftを構築してもよいのですが、大変なのでRackspace Cloudを契約しましょう。[開発者におすすめされた](https://issues.apache.org/jira/browse/HADOOP-11614?focusedCommentId=15948668&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-15948668)ので、多分これが一番早いと思います。

> FWIW, the test setup costs ~20c/month, I have accounts with rackspace US and UK. It's not hard to set up. Openstack you can deploy locally; the external ones just give you different problems (auth, throttling,,,)

契約にはクレジットカードと電話番号が必要です。登録後すぐ使えるようになるわけではなく、電話をかけてアクティベーションする必要があることに注意です。もちろん英語です。今どきSMSじゃないのはつらいよ。

## auth-keys.xmlを記述する

公式ドキュメントを参考にauth-keys.xmlを記述します。このファイルが配置されていないと、テストが実行されません。

* http://hadoop.apache.org/docs/r3.0.0-alpha2/hadoop-openstack/index.html#Testing_the_hadoop-openstack_module

設定ファイルは以下のような感じになるかと思います。

```xml:hadoop-tools/hadoop-openstack/src/test/resources/auth-keys.xml
<configuration>
  <property>
    <name>test.fs.swift.name</name>
    <value>swift://<YOUR CONTAINERNAME>.rackspace/</value>
  </property>
  <property>
    <name>fs.swift.service.rackspace.auth.url</name>
    <value>https://auth.api.rackspacecloud.com/v2.0/tokens</value>
  </property>
  <property>
    <name>fs.swift.service.rackspace.username</name>
    <value>USE YOUR ACCOUNT NAME</value>
  </property>
  <property>
    <name>fs.swift.service.rackspace.region</name>
    <value>HKG</value>
  </property>
  <property>
    <name>fs.swift.service.rackspace.public</name>
    <value>true</value>
  </property>
  <property>
    <name>fs.swift.service.rackspace.apikey</name>
    <value>USE YOUR OWN APIKEY</value>
  </property>
</configuration>
```

`fs.swift.service.rackspace.public`の設定に気づくのに時間がかかった。デフォルトだと`false`で、private URLを利用する。Rackspace Cloud **から** テストする場合はそのままでOKだが、通常は手元の環境からテストを実行するので`true`に設定してpublic URLを使う必要がある。また、apikeyはRackspace Cloudにサインインして確認してください。

## テストを実行する

```
cd hadoop-tools/hadoop-openstack
mvn test
```

テストに利用するコンテナは存在しないか、空である必要があります。
よりプロっぽく見せるためのBootstrap使い方講座

#Bootstrapの功罪

便利ですよね、Bootstrap。
ガッチリレスポンシブしてくれてボタンとかフォームとかのパーツも揃っててサクッと高クオリティのWebページが作れるのは本当にすごい。

ただ、誰でもそれなりのものが作れる一方で誰が作っても似たようなデザインに陥りがちです。
処理が見えないバックエンドのプログラムではいくらフレームワークを使ってもぱっと見ではわかりにくいですが（.doみたいなのはありますが）、ユーザーの目に直接触れるフロント側だとこの**「ぱっと見」は馬鹿にできません。**
要は**似たようなサイトでおもんないなあ**と思われやすくなります。ひいては手抜きと思われても仕方ありません。プロダクトにこだわるのと同じくらい見せ方にもこだわってほしいというのが個人的な主張です。

画像加工や映像制作の分野ではいかにエフェクトをバレずに掛け合わせて美しく見せるかが大事なポイントのひとつです。この考え方に倣って、いかにもBootstrapデフォルトのクラスだけで作ったかのような雰囲気を**Bootstrap感**と定義し、デザインに明るくないエンジニアでもプロっぽいデザインを作るための心得を4つ書いてみます。

#前提
CSSレイアウトの知識（padding,margin,displayレベル）が必要です

#Bootstrap感をやっつけろ！

何はともあれまずは独自スタイルシートを作って読み込ませてください。

```html
<link href="css/bootstrap.min.css" type="text/css"  rel="stylesheet" />
<link href="css/style.css" type="text/css"  rel="stylesheet"/>
```

ありがたいことにHTML(JSPも含む)ではCSSを何枚読み込んでもいいことになっています。したがって基本方針として**Bootstrapの記述を独自CSSで上書き**していきます。
Bootstrapを書き換えても間違いではないですが、保守性や拡張性を考えると避けるべきだと思います。

##<その1> フォントを変える

フォントは大事です。Webページが喋ることができるとしたら、**フォントは声**です。
フォント自身がユーザーに意思を持って語りかけてくれます。フォントの選定は**コミュニケーション**なのです。

Bootstrapデフォルトのfont-familyタグは*Helvetica*というフォントを指定しています。これを変えるだけでもかなり見栄えが違います。
まずはh1タグのfont-familyタグから変えてみましょう。ゴシックか明朝か指定するだけでもいいですし、Googleフォントを使ってもいいでしょう。Googleフォントの使い方は[この辺](http://www.webdesignleaves.com/wp/htmlcss/1601/)を参考にしてください。

##<その2> 色を変える

カラーコーディネートはWebページにとって**ファッション**です。おしゃれなページはおしゃれなファッションをしていますし、ダサいページはダサいファッションをしています。
私見ですが、Webページにとってのダサいは「**単色もしくはビビッドな色だけで構成している**」か「**配色がセオリーに沿っていない**」の2パターンがほとんどではないかと思います。

配色理論は長くなりますので割愛しますが、先人が作り上げてきた**鉄板配色パターン**みたいなものが多くあります。[ここを参考に](https://blog.codecamp.jp/color_pattern)divにbackground-colorを乗せていろいろ試してみてください。
まずはデフォルトの背景色は使わず自分で配色を考える癖をつけることが第一歩です。


##<その3> margin、paddingを自分で整える

Bootstrapではよきにはからって余白を調整してレイアウトを組んでくれます。私はこれに問題があると思っています。
小説の世界では「行間を読む」とか「余白を読む」といった言葉があります。余白にはリズムを作る重要な役割があるのだと言われています。これに倣えば**余白とは呼吸**であると考えるべきではないでしょうか。
Webでも同様に余白は軽視されるべきではないと思います。

例えばnavbarタグには自動でmargin-bottomが30pxくらい付加されます。
Bootstrapの都合で呼吸を強いられるのです。これでは息苦しく感じます。この息苦しさがBootstrap感そのものです。
Bootstrap標準のクラスを適用したらブラウザの開発者ツールを使ってmarginとpaddingが適切かどうか必ずチェックを行うべきだと思います。

##<その4> 素材のまま使わない

デザインでコピペは致命的です。[ニュースになります](http://www.sponichi.co.jp/sports/news/2015/08/05/kiji/K20150805010872340.html)。まったく同じスタイルでの使いまわしは既視感を強く与えますので避けるべきだと思います。
面積が広いとなんとなく気が引けるところがあると思いますが、小さな部品であればまあそのままでもいいかなと思ってしまうのが人間の性です。具体的にはボタンです。

例えば色を変えてみたり、透過にしてみたり、ちょっと変えるだけで雰囲気はガラリと変わります。100%の使いまわしではなく一部書き換えて70%だけの使いまわしにするだけでもプロっぽさが出ると思います。

#最後に

デザインってハードル高そうですが、やってみると意外とするするできてしまって面白いです。
スタイルを自給自足するようになると作ってる感があって楽しくなると思うので、これを機にぜひ！
モデル検査SPINと統合環境jSpinとispinの導入

今回はMacに、モデル検査器`SPIN`をインストールし、その統合環境`jSpin`も導入します。

[追記1] Ubuntu on Windows(Windows10)へのspin導入
[追記2] jSpinとは異なる統合環境ispinのMacへの導入


# 0. 今回の環境 (前提)
- OS X EI Capitan "10.11.6"
- Homebrew  "1.1.12"
- Xcode & Xcode Command Line Tools 導入済 (gcc環境が必須)
- java 導入済

※. `gcc -v` と `java -version`でそれぞれ導入済であることを確認しておいて下さい。


# 1. モデル検査器「SPIN」導入
Homebrewで簡単にインストールできるので、以下のコマンドを打ちましょう。

```
$ brew install spin
```

その後`spin`や`which spin`でSPINコマンドが無事通っているかを確認してください。


# 2. 統合環境「jSpin」導入
次に、GUI環境で操作したいという方向けに、統合環境jSpinを導入します。

**1. ダウンロード**
https://code.google.com/archive/p/jspin/downloads から、「jspin-5-0.zip」をダウンロードし、解凍して下さい。



**2. 設定変更**
ダウンロードしてきたjSpinの設定ファイルを以下の手順で修正していきます。

***2-1. SPINのパス指定***
以下のコマンドでspinコマンドのパスを表示し、そのパスをコピーしてください。

```
$ which spin
```

先ほどインストールしたjSpinのフォルダのconfig.cfgを開き、
SPIN=の後に先ほどコピーしたSPINのパスをペースト(指定)してください。

**<指定例>**

```
SPIN=/usr/local/bin/spin
```

***2-2. gccのパス指定***
以下のコマンドでgccコマンドのパスを表示し、そのパスをコピーしてください。

```
$ which gcc
```

同じくconfig.cfgの
C_COMPILER=の後に先ほどコピーしたgccのパスをペースト(指定)してください。

**<指定例>**

```
C_COMPILER=/usr/bin/gcc
```


# 3. 「jSpin」動作確認
導入作業が全て終わったところで、`jSpin`が正常に動くかの動作確認をします。

`jSpin.jar`があるディレクトリに移り、以下のコマンドを実行してください。(もしくはjspin.jarをダブルクリック)

```
$ java -jar jspin.jar
```


`jspin`の起動後、`Open`でspin-examples内のcount.pmlなど、いずれかのpmlファイルを開き、`Check`, `Random`, `Verify`ボタンで、それぞれIOExceptionなどのエラーが出ずに実行できれば導入完了です。
<br/>
<br/>

*****  

# 【追記1】 Bash on Ubuntu on WindowsにSPIN導入

Bash on Ubuntu on WindowsにもSPINを導入する機会があったので一応追記。基本は[参考]http://herb.h.kobe-u.ac.jp/spin_install_document.html の通りにやれば導入できる。

## 0. 事前準備
```
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install build-essential
sudo apt-get install bison
sudo apt-get install default-jre
sudo apt-get install default-jdk
sudo apt-get install wget
```
でjavaやwget,gcc,makeなどをapt-getでinstall


## 1. SPINをdownload
```
wget http://spinroot.com/spin/Src/spin647.tar.gz
```

## 2. 解凍~makeまで
```
tar -xf spin647.tar.gz
cd Spin/Src6.4.7
make
sudo mv spin /usr/local/bin/spin
```
※. makeやyacc系のエラーが出てる場合は上述のbuild-essentialやbisonをapt-getでinstallするとできるかと思います

これでspinコマンドを打って実行できればOKです

<br/>

***** 

# 【追記2】Macへispin導入

前提として、spinは導入済。

## 1. ispinをdownload
http://spinroot.com/spin/Src/index.html のGUIsの「ispin.tcl」をdownload

## 2. 権限変更

ispin.tclがあるディレクトリに移動し、

```
chmod 755 ispin.tcl
```
を実行

## 3. 実行

```
wish ispin.tcl
```

※. 起動確認の参考 -> [こちら](http://herb.h.kobe-u.ac.jp/spin_install_document.html#test)を参考に起動確認

<br/>

***** 
# 【追記3】 その他参考

- 先日、previewでVSCodeのPromela拡張機能が出ていた<br/>
https://marketplace.visualstudio.com/items?itemName=dsvictor94.promela
django-slackを試してみた

Djangoでエラー発生したらslackに通知するのにお手軽なライブラリないかなーってぐぐってたら引っかかったので使ってみた。
最終的にはログはFluentdで集約して通知もやろうと思っているけど、今は開発中だけど社内には公開している状況でさっと実装できるなら当面はこれでしのごうかなっていう感覚での導入です。

## django-slackとは
↓django-slackってのはこいつ。
http://django-slack.readthedocs.io/

### なにができるのか
ざっくりいうと下記の２つ。

1. slack_message()でslackにメッセージを投稿できる。<br>http://django-slack.readthedocs.io/#richly-formatted-messages
2. Exceptionが発生したらslackにメッセージを投稿する。<br>http://django-slack.readthedocs.io/#logging-exceptions-to-slack

で、今回は後者のために使ってみる。

## 準備
slackに投稿するためのtokenを取得しておく。
test token使うかちゃんとbotsの設定するのかは個々のお好きにどうぞ。
https://api.slack.com/custom-integrations/legacy-tokens
https://slack.com/apps/A0F7YS25R-bots

## install
`pip install django-slack`

## 実装
settingsを変更するだけ。

### INSTALLED_APPSの追加
INSTALLED_APPSに`django_slack`を追加

```python
INSTALLED_APPS = [
    # ... some apps
    'django_slack',
]
```

### loggerの設定
SlackExceptionHandlerを追加してdjango loggerのhandlersに追加する。

```python
LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'filters': {
        'require_debug_false': {
            '()': 'django.utils.log.RequireDebugFalse',
        },
    },
    'handlers': {
        'slack_admins': {
            'level': 'ERROR',
            'filters': ['require_debug_false'],
            'class': 'django_slack.log.SlackExceptionHandler',
        },
    },
    'loggers': {
        'django': {
            'level': 'ERROR',
            'handlers': ['slack_admins'],
        },
    },
}
```
※ローカルの開発環境とかDBUG=Trueの環境のエラーはslackに流したくないので`require_debug_false`をfiltersに設定しておく。

### オプションの設定
tokenとかをオプションで指定する。

```python
SLACK_TOKEN = 'SOME_TOKEN'
SLACK_CHANNEL = '#PUBLIC_CHANNEL'
SLACK_USERNAME = 'USER-NAME'
SLACK_ICON_EMOJI = ':bangbang:'
SLACK_FAIL_SILENTLY = True
```

`SLACK_FAIL_SILENTLY`をFalseにするとchannelの指定を間違えたりして`SlackExceptionHandler`内でエラーが発生すると「エラー発生」→「slackに通知しなくちゃ」→「エラー発生」→「slackに通知しなくちゃ」といった具合に無限ループに陥ります。

他のオプションは下記参照。
http://django-slack.readthedocs.io/#configuration

## 疎通確認
`python manage.py shell`で以下を実行する。

```python
from django_slack import slack_message
slack_message('django_slack/exception.slack', {'text': 'hoge'})
```

指定のchannelに'hoge'と投稿されれば成功です。
ちなみにDEBUG=Trueの環境で疎通確認する場合は`SLACK_BACKEND = 'django_slack.backends.UrllibBackend'`を追加してください。
疎通確認に失敗した場合は`SLACK_FAIL_SILENTLY`を`True`にするとエラーが表示されるようになります。

## バージョン
Django==1.11
django-slack==5.8.0

## 感想
簡単に使えるのはいいね。
ただ`SLACK_FAIL_SILENTLY`をTrueにしたら本当に黙ってしまうのだけどせめてlogger('django_slack')でlog吐くようにして欲しいよね。
https://github.com/lamby/django-slack/blob/24ce48de96f561518e81aa3adef89c4f5f287707/django_slack/api.py#L132

基本的には本番環境で使うことはないと思うけど本番環境で使う場合はCeleryBackendなるものも用意されているみたいなのでそっちで非同期処理にしたほうが良さそう。

以上！
iOSのSafariでBack Forward Cacheにハマる

# iOSのSafariでBack Forward Cacheにハマる

## 背景

登録→確認→完了というオーソドックスな確認画面ありの登録フォームで、登録画面でのsubmit後の誤操作を防止するために、JavaScriptで動的に画面全体を透過divでロックする実装をしていました。

## 落とし穴

確認画面からSafariのブラウザの戻るで登録画面に戻るとBack Forward Cacheが発動して、フォームにデータが残った状態が復元されると同時に、透過divでの画面ロックも復元されて、何も操作を受け付けない状態にハマりました。(´・ω・`)

## 回避策

iOSのSafariではwindowのpageshowイベントでBack Forward Cacheから復元されたかどうかを検知できるようでしたので、例えばjQueryで以下のようにしてロックを解除する処理を追加しました。

```javascript
$(function () {
    $(window).on('pageshow', function(event) {
        if (event.originalEvent.persisted) {
            // ここにBack Forward Cacheから復元された際の処理を記述する
        }
    });
});

```
メモ: statのaccess/modify/changeの違い

statのaccess/modify/changeの違い

http://stackoverflow.com/questions/3385203/regarding-access-time-unix

```
last access: Time when file data last accessed. Changed by the mknod(2), utimes(2) and read(2) system calls.
last modified: Time when file data last modified. Changed by the mknod(2), utimes(2) and write(2) system calls.
last changed: Time when file status was last changed (inode data modification). Changed by the chmod(2), chown(2), link(2), mknod(2), rename(2), unlink(2), utimes(2) and write(2) system calls.
```
Postgresql on CentOS7

普段MariaDB使ってる自分用の備忘録用なので、詳細な解説は省略しています。

環境はCentOS7.3　Postgresql9.2

# インストール
## yumからインストール
```bash:
$ sudo yum install postgresql-server -y
```

## db初期化

```bash:
$ sudo postgresql-setup initdb
```

# anyhost

```
$ sudo vi /var/lib/pgsql/data/postgresql.conf
```
デフォルトはlocalhost


```
listen_addresses = '*'
```

## サーバー起動

```bash:
$ sudo systemctl start postgresql
```

※これが出るときは初期化忘れてたりするかも。

```
Apr  5 14:17:03 localhost postgresql-check-db-dir: "/var/lib/pgsql/data" is missing or empty.
Apr  5 14:17:03 localhost postgresql-check-db-dir: Use "postgresql-setup initdb" to initialize the database cluster.
```
# PSQL
## postgresユーザー（初期ユーザー）パスワード設定

※本番環境では設定しないほうが良い？
基本OSユーザーなので、`passwd`で変更。

```
$ sudo passwd postgres
```

## postgresuserでpsqlコマンド実行

```
$ psql
```
processingでアプリを起動

processingの実行中に何かのタイミングでPC内の別のアプリケーションを起動したい場合があります。
processingの実行と同時にGoogle Chromeが起動するようにしてみました。

~~~java

import java.io.IOException;

Runtime rt;

void setup () {

	size (800, 800);

	try {
		rt = Runtime.getRuntime ();
		rt.exec ("C:/Program Files (x86)/Google/Chrome/Application/chrome.exe");
	} catch (IOException ex) {
		ex.printStackTrace ();
    }

}

void draw () {
	
}

~~~
リダイレクト可否のrspecテストをrequestではなくcontrollerに書くと実行速度が速くなる場合がある

# 概要
* 表題通り
* rspec —profile で計測した

# 方法
* パラメータが間違っている時root_pathへリダイレクトするアクションを実装し、リダイレクトの可否を検証するテストコードをrequestとcontrollerにそれぞれ書いた。
* テストコードの動作速度を ``rspec —profile`` コマンドの出力で計測した。

# 結果
* 3回計測し平均値を算出しrequestとcontrollerのrspecの動作速度を比較したところ、controlerのテストコードの方が動作速度が短かった。
* リダイレクトと描画テスト間の動作速度を比較したところ、ページを描画するテストコードの方が速く実行されていた。
* entryページの描画についてはrequestとcontroller間で差異は認められなかった。

![Kobito.f1Rcg1.png](https://qiita-image-store.s3.amazonaws.com/0/124445/6720f8f2-ee78-4518-ad44-c7efa4245e2d.png "Kobito.f1Rcg1.png")

![Kobito.GmJDVw.png](https://qiita-image-store.s3.amazonaws.com/0/124445/a3cd94de-e82b-1efa-5a2f-6360c7abab86.png "Kobito.GmJDVw.png")

# 考察
* capybaraが遅いのかもしれない



# コード

## app側
* ``/users/entry/:token`` にアクセスしtokenが正しい時はそのまま描画し、間違っている時はroot_pathへリダイレクトするアクション

```app/controllers/users_controller.rb
class UsersController < ApplicationController

  def entry
    if token_valid?(params[:token])
      render :entry
    else
      redirect_to root_path
    end
  end
  
  private
  
  def token_valid?(token)
    if User.find_by(token: token).present?
      true
    else
      false
    end
  end
end
```


## rspec側
### factory
* tokenを持つuserのfactorygirlデータ

```spec/factories/user.rb
FactoryGirl.define do
  factory :user do
  	token: 'oooooooooo'
  end
end

```

### テストコード

* requestのrspec

```spec/requests/users_pages_spec.rb
require 'spec_helper'

describe 'entry page' do
  let(:user) { FactoryGirl.create(:user) }
  let(:valid_token) { user.token }
  let(:invalid_token) { 'xxxxxxxxxxxxx' }
  
  context '存在しないtokenでentryページにアクセスした場合' do
    it 'root_pathへリダイレクト' do
      visit users_entry_path(token: invalid_token)
      expect(current_path).to eq(root_path)
    end
  end
  context 'userに存在するtokenでentryページにアクセスした場合' do
    it 'entryページを描画' do
      visit users_entry_path(token: valid_token)
      expect(current_path).to eq(users_entry_path(token: valid_token))
    end
  end
end
```

controllerのrspec


```spec/controllers/users_controller_spec.rb
require 'spec_helper'

describe UsersController do
  let(:user) { FactoryGirl.create(:user) }
  let(:valid_token) { user.token }
  let(:invalid_token) { 'xxxxxxxxxxxxx' }
  
  context '存在しないtokenでentryページにアクセスした場合' do
    it 'root_pathへリダイレクト' do
      get :entry, token: invalid_token
      expect(response).to redirect_to root_path
    end
  end
  context 'userに存在するtokenでentryページにアクセスした場合' do
    it 'entryページを描画' do
      get :entry, token: valid_token
      expect(response).to render_template :entry
    end
  end
end

```
AirMac TimeCapsule 装置が見つからない時の注意(Windowsの方向け)

# AirMac TimeCapsuleを設定する
AirMacユーティリティは準備されている。
表示もされているし、ネットには繋がらないが、接続することはできる。
にもかかわらず、装置に接続できませんと言われた時の対処法

## とりあえず再起動
やってみましょう。
出荷時状態に戻すには、リセットボタン押しながら、電源接続10秒待機です。

# ipv6 設定の確認
私はこれで2時間無駄にしました。
理由は不明ですが、ipv6がオンになっていると装置に接続できないことがあるようです。

以上。
ネットワーク接続で時間を取られないようにするためのTipsでした。
PrometheusのLabelの値をGrafanaのSinglestatに表示する方法

# 前提

* Grafana 4以上

# 概要

次のようなメトリックを　mysqld_exporterで取得できます。
> mysql_version_info{innodb_version="5.6.23",instance="m.lenet.jp:9104",job="mysql",version="5.6.23-log",version_comment="MySQL Community Server (GPL)"}

例えば、innodb_versionをGrafanaのSinglestatで表示したいと思うかもしれません。

<img width="400" src="https://qiita-image-store.s3.amazonaws.com/0/65435/62073d4e-5238-7221-b561-fcce855a9389.png">

これがGrafana4から[可能](https://github.com/grafana/grafana/issues/5094)になっています。

# 手順

1. GrafanaでSinglestatを追加する
2. Optionsタブに移動し、ValueのStatで「name」をドロップダウンリストから選択する
3. MetricsタブのQueryに使用したいクエリを書く
4. Legend format に使用したい値のラベル名を記載する

今回の場合ですと、クエリに「mysql_version_info」と記載し、Legend formatに「{{innodb_version}}」と記載しました。

<img width="400" src="https://qiita-image-store.s3.amazonaws.com/0/65435/bbf9ef8b-465e-29fa-3cbc-7fb9fcd3e2f4.png">
たまに使いたくなるvimの設定一時変更コマンド一覧

相変わらず筆者自身のための備忘録です。
また見つけたら追記するかもしれません。

# set list / set nolist

非表示文字(タブ・改行等)の表示・非表示を切り替えます。
※`listchar`を設定していないとそもそも表示されません。

# set number / set nonumber

行番号の表示・非表示を切り替えます。

# set hlsearch / set nohlsearch

検索時ハイライトの表示・非表示を切り替えます。
※ただハイライトをリセットしたいだけなら`noh`の方が便利です。

# set paste / set nopaste

ペーストモードの有効・無効を切り替えます。
※ペーストモードにすると`autoindent`が無効になり貼り付けたテキストが崩れずに済みます。
(@dohq さんありがとうございます！)
railsのform_tagでデフォルト値を入れる方法

form_forは勝手に入れてくれるけど、form_tagは自分で渡す必要があるぽい。

# やり方は簡単
・第二引数に渡したい値を入れる。(text_field, text_areaとか）
・select_tagので、options_for_select使っている場合は、options_for_selectの中に第二引数として値を渡す。

# 参考例

Carモデルをいじりたいとき。

```
<%= form_tag path, method: 'patch' do %>
<%= text_area_tag :description, @car.description %>
<%= select_tag :type, options_for_select([['Sedan', 1], ['Eco', 2 ]], @car.type %>
```
fastaのデスクリプションを変更するスクリプト

#Descriptionが別ファイルになっているfasta問題
一部のデータベースではfastaにはIDだけを記述し、そのIDに対応するDescriptionは別ファイルになっていることがある。

<例>
http://genome.jgi.doe.gov/Creinhardtii/download/_JAMO/585473eb7ded5e78cff8c450/Creinhardtii_281_v5.5.annotation_info.txt?requestTime=1491367905



これは便利な事もあるが
AHRD (https://github.com/groupschoof/AHRD/blob/master/README.textile)
などをつかったアノテーションの最適化には不適当なので、
二つのファイルを融合する以下のスクリプトを書いた。



```py:fasta_annotation_merge.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-

#fasta_id項目をkeyにして、アノテーション情報を変更する

import sys
from Bio import SeqIO
import csv


fasta_in = sys.argv[1]                            #１番目の引数には、変更したいfastaファイルを指定する。
changer_in = sys.argv[2]                          #２番目の引数に タブ区切りされた　keyID \t Annotationを記述したファイルを指定

for q in open(changer_in, "r"):                     #アノテーション情報ファイルを開く
    change = q.split('\t')        #タブで区切ってchangeリストにいれる
    for record in SeqIO.parse(fasta_in, 'fasta'): #fastaファイルを開くSeqIOを使ってパースする(1項目づつ読み込む）
        id_part = record.id                       #fastaのID部分を読み込む
        seq = record.seq                          #fastanの配列部分を読み込む
        if id_part == change[0]:            #fastaファイルのidとchanger項目のid部分が一致したら。。
                fasta_seq = '>' + id_part + ' '+ change[1] + '\n' + seq + '\n'     #fasta形式に整えて
                print(fasta_seq)                  #標準出力にfastaを出力

```
Visual Studio CodeでHTMLの画像（イメージ）サイズ自動入力


## ファイル→基本設定→キーボードショートカット

```json
{
    "key": "ctrl+i",
    "command": "editor.emmet.action.updateImageSize",
    "when": "editorTextFocus"
}
```

キーマップの設定を上のように変更します。
<img>タグにカーソルを合わせてCTRL+Iを入力すると画像サイズが自動入力されます。
システムリプレース時のモデリングプロセスメモ

システムリプレース時のモデリング。最適な設計を目指す際に実践したプロセスのメモ

モデリング時に考慮したポイント
---
* RUP、Wirlpoolモデルを参考にし、反復的なプロセスを適用した。
* モデリングの際には完全な設計は存在しないという前提のもと、イテレーションを回す中で設計を精緻にしていくこととした。
* ASISの仕様についての分析についても、変化の激しい業界では次々と仕様変更が見込まれるため、完璧な分析は行わず、実際の開発時に吸収する方針とした。
* 実際の実装の段で設計と現実とのギャップは必ず生まれると考え、プロトタイプの作成をイテレーション内に組み込むこととした。


プロセス
---
![リプレイスモデリング.png](https://qiita-image-store.s3.amazonaws.com/0/169851/bd710c13-0b31-c691-383b-7704f771b4bd.png)


参考
---
[エリック・エヴァンスのドメイン駆動設計 (IT Architects’Archive ソフトウェア開発の実践)](https://www.amazon.co.jp/s/ref=nb_sb_noss?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&url=search-alias%3Daps&field-keywords=%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E9%A7%86%E5%8B%95%E3%81%9B%E3%81%91%E3%81%8D&rh=i%3Aaps%2Ck%3A%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E9%A7%86%E5%8B%95%E3%81%9B%E3%81%91%E3%81%8D)
[RUP in the dialogue with Scrum](https://www.ibm.com/developerworks/rational/library/feb05/krebs/)
[https://domainlanguage.com/ddd/whirlpool/](https://domainlanguage.com/ddd/whirlpool/)
Landscapeで複数のUbuntuコンピュータを管理する

# 背景
1,2台のサーバを管理する際は、それぞれサーバにログインして個別にパッケージの更新などをしていたが、3,4台くらいになるともう少しまとめて管理できないかなと思うようになった。そんな時に見つけたのが[Landscape](https://landscape.canonical.com/)。 Ubuntuを開発しているCanonicalが開発しているコンピュータの管理・監視ツール。１つのインスタンスで30000台までのコンピュータを扱えるらしい。そんなに高度なことはしないけど、これを使えばまとめてサーバの管理ができて便利そうなので試してみた。オンプレミスのサーバー群に対して利用する場合は、インストールできる台数などに制限があるが、無料で利用できる。

# Landscape serverのインストール
まず、コンピュータを管理・監視する`Landscape server`を管理・監視用のコンピュータにインストールする。2017年4月現在、17.03がUbuntu 16.04LTSに対する最新版のようだ。
https://help.landscape.canonical.com/

```bash:terminal
sudo add-apt-repository -u ppa:landscape/17.03
sudo apt update
sudo apt install landscape-server-quickstart
```

### 最初のユーザーを設定
Landscapeの最初のユーザーは自動的に"standalone"アカウントの管理者になる。これを作るにはLandscape serverをインストールしたコンピュータにブラウザで接続(`https://<servername>`)して、必要な情報を記入する。

# Landscpaeにコンピュータを登録
次に`Landscape server`に登録するコンピュータを設定する。まずは、`Landscpae-client`をインストール。

```bash:terminal
sudo apt update
sudo apt install landscape-client
```

次に、`landscape-server-quickstart`によって生成されるSSL証明書を登録するコンピュータにコピーする。SSL証明書は`landscape server`の`/etc/ssl/certs/`に`landscape_server.pem`と`landscape_server_ca.crt`としてある（どちらのファイルも同じ内容）。この証明書のパスを`landscape-client`の設定ファイルに書き加える。

```bash:設定ファイル（/etc/landscape/client.conf）に書き加える一行
ssl_public_key = /etc/landscape/landscape_server.pem
```

クライアントを設定し、Landscapeサーバーに登録する。

```bash:terminal
sudo landscape-config --account-name standalone --url https://<servername>/message-system --ping-url http://<servername>/ping
```

ここまで完了すれば、`https://<servername>/`から登録したコンピュータを管理・監視できる。

# 参考
https://landscape.canonical.com/
https://help.landscape.canonical.com/LDS/QuickstartDeployment17.03
http://askubuntu.com/questions/549809/how-do-i-install-landscape-for-personal-use
Dockerを使ってswagger.yamlをサクッとみる (swagger-ui 3.x)

## [swagger-uiの3.xが出ました](https://github.com/swagger-api/swagger-ui/releases/tag/v3.0.0)

個人的に大きく変わったなと思うポイントは、以下の二点です。

* YAMLの読み込みがサポートされた
    * swaggerのspecの書式はJSONとYAMLの２種類が用意されているのですが、swagger-ui 2.xではJSONしかサポートされていなかったので、YAMLをJSONに変換して読み込ませる必要がありました
* 見た目がガッツリ変わった
    * deprecatedとかが地味だったのがわかりやすく表現される様になりました

## ローカルで動かすのが楽になった

以前こんな記事を書きました。

* [SwaggerでAPIを定義してインタラクティブAPIドキュメントを見る](http://qiita.com/NewGyu/items/64adc3c5dd3ab8ad6087)
* [Dockerを使ってswagger.yamlをサクッとみる](http://qiita.com/NewGyu/items/08589572875467de5a1b)

このときに比べてswagger周辺のツール群も洗練されてきたので、それに合わせてさくっと見る方法の最新版を書きます。

### 公式Dockerイメージが有る

https://hub.docker.com/r/swaggerapi/swagger-ui/

Nginxで[index.html](https://github.com/swagger-api/swagger-ui/blob/master/dist/index.html)を表示するだけの簡単なものです。

```
$ docker run -p 8080:8080 swaggerapi/swagger-ui
```

### これを利用する

上記index.htmlでは下記のように初期表示はpetstoreのAPI定義となっています。

```html:index.html
  const ui = SwaggerUIBundle({
    url: "http://petstore.swagger.io/v2/swagger.json",
    dom_id: '#swagger-ui',
    presets: [
      SwaggerUIBundle.presets.apis,
      SwaggerUIStandalonePreset
    ],
    plugins: [
      SwaggerUIBundle.plugins.DownloadUrl
    ],
    layout: "StandaloneLayout"
  })
```

要するにここで指定されいるurl(=swagger specのURL)を任意の値に書き換えれば良いわけです。

ということで用意したのがこちらのdocker-compose定義です。

```yaml:docker-compose.yaml

version: "2"
services:
  swagger:
    image: swaggerapi/swagger-ui
    volumes:
      - ./sample.yaml:/usr/share/nginx/html/sample.yaml
    environment:
      API_URL: sample.yaml
    ports:
      - "8080:8080"
```

```shell-session:ディレクトリ構造

.
├── docker-compose.yaml
└── sample.yaml
```

ポイントはこれだけです。

1. 自分で書いたswagger定義をsample.yamlとして置く
2. sedコマンドでindex.htmlのurlを書き換える

2のurl文字列の置換は、公式Dockerイメージに含まれる[このdocker-run.sh](https://github.com/swagger-api/swagger-ui/blob/v3.0.10/docker-run.sh#L32-L38)で、`API_URL`という環境変数の値に置換されるようになっています。これに従い、docker-compose.yamlに環境変数`API_URL`を指定します。

そして、下記で起動すれば http://localhost:8080 でswaggerドキュメントを見ることができるでしょう。

```shell-session
$ docker-compose up
```
AutotoolsによるC/C++クロスビルド覚書き


Autotoolsでのクロスコンパイルで悪戦苦闘したためメモ

例としてyoctoのi.MX6(imx6dlsabresd)ビルド環境を用いてAutotoolsを使ってクロスビルドする。
yoctoで作成したツールチェインをインストールしてビルドするのが正規の手順だが今回は理由あって環境変数等を設定して無理やりビルドを実行する。

# 環境変数の設定

## SDKTARGETSYSROOT
必要ではないがsysrootのパスは繰り返し使用するため環境変数に設定しておく

```bash
$ export SDKTARGETSYSROOT=<yoctoパス>/build/tmp/sysroots/imx6sdsabresd
```

## PATH

gcc等のツールチェインがある場所を追記する。

```bash
$ export PATH=<yoctoパス>/build/tmp/sysroots/x86_64-linux/usr/bin/arm-poky-linux-gnueabi:$PATH
```

ターゲットマシンではなくビルドするPC上で動作するコマンドであるため、`SDKTARGETSYSROOT`に似ているが異なるので注意

## pkg-config関係

```bash
$ export PKG_CONFIG_SYSROOT_DIR=$SDKTARGETSYSROOT
$ export PKG_CONFIG_PATH=$SDKTARGETSYSROOT/usr/lib/pkgconfig
```

`PKG_CONFIG_SYSROOT_DIR`を設定すると`pkg-config`の結果にそのパスが付加されてくるので場合によっては不要かも

## ツールチェイン関係

```bash
$ export CC="arm-poky-linux-gnueabi-gcc  -march=armv7-a -mthumb-interwork -mfloat-abi=hard -mfpu=neon -mtune=cortex-a9 --sysroot=$SDKTARGETSYSROOT"
$ export CXX="arm-poky-linux-gnueabi-g++  -march=armv7-a -mthumb-interwork -mfloat-abi=hard -mfpu=neon -mtune=cortex-a9 --sysroot=$SDKTARGETSYSROOT"
$ export CPP="arm-poky-linux-gnueabi-gcc -E  -march=armv7-a -mthumb-interwork -mfloat-abi=hard -mfpu=neon -mtune=cortex-a9 --sysroot=$SDKTARGETSYSROOT"
$ export AS="arm-poky-linux-gnueabi-as "
$ export LD="arm-poky-linux-gnueabi-ld  --sysroot=$SDKTARGETSYSROOT"
$ export GDB=arm-poky-linux-gnueabi-gdb
$ export STRIP=arm-poky-linux-gnueabi-strip
$ export RANLIB=arm-poky-linux-gnueabi-ranlib
$ export OBJCOPY=arm-poky-linux-gnueabi-objcopy
$ export OBJDUMP=arm-poky-linux-gnueabi-objdump
$ export AR=arm-poky-linux-gnueabi-ar
$ export NM=arm-poky-linux-gnueabi-nm
$ export M4=m4
$ export CROSS_COMPILE=arm-poky-linux-gnueabi-
```

ターゲットとなるマシンによってオプションは異なるが`--sysroot=`は共通で必要になるはずである。

# ビルド

```bash
$ ./configure --host=arm-poky-linux-gnueabi --build=x86_64-linux --with-libtool-sysroot=$SDKTARGETSYSROOT --prefix=$SDKTARGETSYSROOT/usr
$ make
```

`--with-libtool-sysroot`のかわりに`--with-sysroot`のこともあるので`./configure --help`を要確認。
squidのユーザ追加メモ（Basic認証）

squidによるproxyサーバ構築中にユーザ追加でつまづいたのでメモとして残します。

#パスワードファイルの作成
パスワードファイルの所在については
/etc/squid/squid.conf
に記述しますが、ここでは
/etc/squid/passwd
とします。

```
htpasswd -c /etc/squid/passwd ユーザ名
```

#ユーザの追加

##普通に書いてみる

```
htpasswd /etc/squid/passwd ユーザ名
```

##ユーザ名に円マーク（バックスラッシュ、￥、\）がある場合

たとえば
aaa\bbb
というユーザを追加したい場合

```
htpasswd /etc/squid/passwd aaa\bbb		←これではダメ
htpasswd /etc/squid/passwd aaa\\bbb		←これが正しい
```

「￥」を2つ入力しないと「￥」がなくなります
（/etc/squid/passwdを開いて確認できます）

##ユーザ名に大文字がある場合

```
htpasswd /etc/squid/passwd AAA\\bbb
```

こんなユーザを追加し、/etc/squid/passwdを開くと・・・

```
cat /etc/squid/passwd

AAA\bbb			←もちろん大文字で登録されている
```

ですが、いざブラウザ等からBasic認証しようとしユーザ名に「AAA\bbb」と入力しても認証できず。。。
squidのログを見ると・・・

```
xxx.xxx.xxx.xxx - aaa\bbb [05/Apr/2017:20:57:13 +0900] "CONNECT xxx.xxx.xxx.xxx:443 HTTP/1.0" >Hs 15684 "-" "-" TCP_MISS:DIRECT
```

あれ？ユーザ名が小文字に・・・！？

よって、「AAA\bbb」ではなく「aaa\bbb」を登録するとBasic認証できました。
AndroidでTabのViewのインスタンスを参照する


こんにちはsekitakaです。

Androidアプリでタブに[ShowcaseView](https://github.com/amlcurran/ShowcaseView)のハイライトを設定する必要がありました。  
ShowcaseViewのハイライトを設定するには、対象のViewのインスタンスを指定する必要があり、各Tabの(Viewのサブクラスの)インスタンスを取得する方法を調べました。

```Java
TabLayout tabLayout = (TabLayout)findViewById(R.id.tab_layout);
ViewGroup viewGroup = (ViewGroup)tablayout.getChildAt(0); // 0固定でよい
int tabPosition = 0; // 取得したいタブのインデックス
View tabView = viewGroup.getChildAt(tabPosition); // タブのViewインスタンスを取得する
```