OmniAICreator/Qiita-1.07M huggingface dataset:
C++でスマートポインタ使用時のコンストラクタでの例外処理

今さらですが、スマートポインタ使用時のコンストラクタでの例外処理についてよくわかっていないかったので実験してみました。スマートポインタについては[非常に詳しい説明](https://qiita.com/hmito/items/db3b14917120b285112f)がすでにあるので、ここではしません。C++11を想定しています。

# コンストラクタでの例外処理

コンストラクタ内で複数のリソースを動的に確保し、かつ、その際に例外が発生する可能性がある場合。例えば下のようなケース。

```C++

#include <iostream>
#include <string>

class Hoge
{

	std::string name;
public:
	Hoge(std::string name, bool irregular) : name(name)
	{
		std::cout << "Constructor, name = " << name << std::endl;
		if(irregular)
		{
			std::cout << "An exception will be thrown..." << std::endl;
			throw 1;
		}
	}

	~Hoge()
	{
		std::cout << "Destructor, name = " << name << std::endl;
	}
};

class HogeHoge
{
private:
	Hoge *hoge;
	Hoge *fuga;

public:
	HogeHoge()
		: hoge(nullptr), fuga(nullptr)
	{
		hoge = new Hoge("Hoge", false);
		fuga = new Hoge("Fuga", true); //例外が発生する		
	}

	~HogeHoge()
	{	
		delete hoge;
		delete fuga;
	}
};

int main(int argc, char* argv[])
{
	try
	{
		HogeHoge hoge;
	}
	catch(int e)
	{
		std::cout << "An exception is caught."<< std::endl;
	}

	return 0;
}

```

実行結果は次の通りです。

```
Constructor, name = Hoge
Constructor, name = Fuga
An exception will be thrown...
An exception is caught.
```

__コンストラクタで例外が発生するとデストラクタが呼び出されません。__なので、デストラクタに解放処理を書いていたとしても、例外が発生する前に確保したリソースが解放されません。

正しく処理しようとすると、Hogeクラスは下のようになるでしょうか？

```C++

class HogeHoge
{
private:
	Hoge *hoge;
	Hoge *fuga;

public:
	HogeHoge()
		: hoge(nullptr), fuga(nullptr)
	{
		try
		{
			hoge = new Hoge("Hoge", false);
			fuga = new Hoge("Fuga", true);
		}
		catch(...)
		{
			delete hoge;
			throw;
		}
	}

	~HogeHoge()
	{
		delete hoge;
		delete fuga;
	}
};

```

実行結果は次の通り。

```
Constructor, name = Hoge
Constructor, name = Fuga
An exception will be thrown...
Destructor, name = Hoge
An exception is caught.
```

確かに正しく解放できています。しかし、デストラクタと同じような処理をコンストラクタに入れたり、例外を再度投げたりと、ムダが多く間違えを起こしやすそうなコードです。

# スマートポインタを使う


```C++

#include <memory>

class HogeHoge
{
private:
	std::unique_ptr<Hoge> hoge;
	std::unique_ptr<Hoge> fuga;

public:
	HogeHoge()
	{
		hoge = std::unique_ptr<Hoge>(new Hoge("Hoge", false));
		fuga = std::unique_ptr<Hoge>(new Hoge("Fuga", true));
	}
};

```

実行結果は次の通り。

```
Constructor, name = Hoge
Constructor, name = Fuga
An exception will be thrown...
Destructor, name = Hoge
An exception is caught.
```

このように例外発生前に確保していたhogeに関するリソースが自動で解放されています。生のポインタを扱うよりシンプルです。

# できるだけ生のポインタは使わない方がよい

このようにスマートポインタを使うと、リソース管理で間違いが起こりづらいので、生のポインタはできるだけスマートポインタで隠蔽すべきなのだと実感しました。
bashの組み込みコマンド local について

# はじめに
本項ではbashの組み込みコマンドである `local` を扱います。
変数のスコープを関数内に限定するために使用しています。

## 執筆のきっかけ
執筆のきっかけは以下のようなシェルスクリプトを組んでいる際にはまったことです。

```bash:hoge.sh
function foo() {
        local hoge="$(curl http://localhost/testpage)"
        test "${?}" -ne 0 && return 1
        echo hoge
}

foo

exit ${?}
```

処理の流れは以下のようなものになります。

1. 関数内であるコマンドの処理結果を変数に格納
2. あるコマンドが失敗した場合、リターンコードに異常終了を表す数値（例では`1`）を返却し関数を抜ける
3. 成功した場合のみ、後続処理を行う。

※実際にやりたかったコマンドは`curl`ではなくミドルウェア製品独自のコマンドです。失敗する可能性があり、"${?}"に0以外が格納されるコマンドをイメージしてください。

## はまったこと
先述の `hoge.sh` は `curl http://localhost/testpage` が失敗しても `"${?}"` は**常に `0`が格納されます。**
よって、`return 1` が機能することはありませんでした。

## はまった原因
「`$?` は直前のコマンドの終了値を格納する」という定義の通り、bashの `local`コマンドの終了値を格納し続けていたため、`$?` が常に0になっていました。

# 対処方法
`man local` を参照すると「local [option] [name[=value] ...]」との記載があるので、変数名のみで宣言が可能そうと気づきました。
以下のようなスクリプトを作成、実行したところ、想定通りに動作しました。

```bash:local_test.sh
#!/bin/bash
## FUNCTIONS ##
function foo() {
        local hoge
        hoge="$(bash -c "exit 1")"
        local rc="${?}"
        echo "local.hoge: ${hoge}"
        echo "local.hoge.rc: ${rc}"
}

## MAIN ##
hoge="fugafuga"

foo

echo "global.hoge: ${hoge}"
```

```shell-session
$ ./test.sh
local.hoge:
local.hoge.rc: 1
global.hoge: fugafuga
```

# おわりに
些細なことですがバグの原因になるところでした。
`local` を利用して変数の宣言と同時にコマンドの出力を変数に代入しエラーハンドリングを行う場合は、「変数宣言」、「値の代入」を別々に行うことでコマンドのリターンコードを`"${?}"`で拾えるようになります。
【検討中】railsで関連付けさせた中間テーブルに値を入れたい（できれば一括で）

# 目的

railsで下記の形でtag_mapのmodelを作り、tag_mapに一括でインポートしたい。（現在模索中）

# model

```ruby:post.rb
class Post < ApplicationRecord
  has_many :tag_maps, dependent: :destroy, foreign_key: 'post_id'
  has_many :tags, through: :tag_maps

  def save_posts(savepost_tags)
  current_tags = self.tags.pluck(:name) unless self.tags.nil?
  old_tags = current_tags - savepost_tags
  new_tags = savepost_tags - current_tags

    # Destroy old taggings:
    old_tags.each do |old_name|
      self.tags.delete Tag.find_by(name:old_name)
    end

    # Create new taggings:
    new_tags.each do |new_name|
      post_tag = Tag.find_or_create_by(name:new_name)
      self.tags << post_tag
    end
  end
end
```
```ruby:tag.rb
class Tag < ApplicationRecord
  validates :name,presence:true,length:{maximum:50}
  has_many :tag_maps, dependent: :destroy, foreign_key: 'tag_id'
  has_many :posts, through: :tag_maps
end
```
```ruby:tag_map.rb
class TagMap < ApplicationRecord
  belongs_to :post
  belongs_to :tag
  validates :post_id,presence:true
  validates :tag_id,presence:true
end
```

# ダメだった方法

## 直接入力

tag_mapのdbに直接書き込むはtag_mapのpkが重複してしまうのでダメだった。actionrecordがおそらくthroughして向こう側で生成しないとpkを発行しないんだと思う。

## rails cでtagをcreate

tagをcreateすると重複しているのにもかかわらず違うレコードを作ってしまう。今回同じtagの場合、新しく作ってほしくないのでこれはダメ。

# 検討中

## tagに重複させる形でsaveできないか

## form通りに値を渡す
ファイルメーカー　開発スピードアップについてメモ_1

テスト用ファイルで開発したものをステージング環境に移行するときに効率良くするための方法です。
テスト環境で作成しまくっても、ステージング環境に持っていくとき、ほぼ同じ作業をしなければならないなんて馬鹿らしいと思っていたのですが、いつの間にか数々のワザを身に付けておりましたので、作業手順の備忘録として。
（もっと良い方法があるよという方、いらっしゃればぜひ教えてください！）


#１、テーブルデータのインポート
	テーブル・レコードの定義をインポートします。

#２、テーブルオカレンスを作成
	テスト環境と間違わないようにしましょう。

#３、レイアウトを作成
	テストファイルと同じレイアウト名にします。オブジェクトは後で作成します。

#４、スクリプトのコピぺ
	スクリプトワークスペースにおいて対象となるスクリプトをコピペします。

#５、レイアウトのコピペ
	パート（ヘッダ・ボディ・フッタなど）の高さと幅を合わせます。オブジェクトをコピペします。
	レイアウトオプションのトリガを設定

#６、完成
	動作確認もしっかり行いましょう
Mocha+Chai+SinonでPromiseの単体テストをするときはPromiseを返そう

# 結論
タイトルのとおりです。

# 背景
doneを使っていたら、`Unhandled promise rejection`ではまったのでその解消のため。

# 本文
Vueでのajax通信にはaxiosを使っています。
例えばajax通信でアイテムの情報を取得するitemsコンポーネントを考えます。

```js:items.vue
import axios from 'axios';
export default {
    data() {
        return {
            items: []
        };
    },
    methods: {
        fetchItems(){
            axios.get('/api/items').then((res) => {
                this.items = res.data;
            });
        },
    },
}
```

単体テストはMocha+Chai+Sinon+vue-test-utilsで書いてます。
以前までは以下のように書いていました。

```js:item.spec.js
import axios from 'axios';
import { shallow } from 'vue-test-utils';
import items from '@/items';

describe('items component', () => {
    it('fetchItemsでアイテム一覧が取得できる', (done) => {
        const items = [
            { id: 'Test' },
        ];

        const resolved = Promise.resolve({
            data: items,
        });

        sinon.stub(axios, 'get').withArgs('/api/items').returns(resolved);
        const wrapper = shallow(items);
        resolved.then(() => {
            expect(wrapper.vm.items).to.deep.equal(items);
            axios.get.restore();
            done();
        });
    });
});
```

しかし、このやり方だとresoleved.thenの内部でエラーが発生したとき(例えばexceptが失敗したとき)に`Unhandled promise rejection`が発生し、エラーが起きているのはわかってもその詳細がログに表示されませんでした。
doneを使った書き方は古いもののようで、以下のようにreturnでpromiseを戻すようにしたら内部で発生したエラーも表示されるようになりました。

```js:item.spec.js
        return resolved.then(() => {
            expect(wrapper.vm.items).to.deep.equal(items);
            axios.get.restore();
        });
````

doneは消しておかないと、単体テスト実行時に怒られます。


# 参考
[axiosを利用したVue componentのUnitTest](https://qiita.com/hypermkt/items/e9f34a89221c50de2094)
[MochaがPromisesのテストをサポートしました](http://efcl.info/2014/0314/res3708/)
Androidアプリケーション技術者認定試験ベーシックの試験範囲の知識をまとめた(9)

# GPSとセンサ

## GPS

### LocationManagerを取得する

android.locationパッケージのLocationManagerクラスで位置情報を取得できる。
ContextクラスのgetSystemServiceメソッドで取得できる。

### LocationListenerを実装する

位置情報を取得するにはLocationListenrインターフェースを実装する。
LocationManagerクラスのインスタンスに対して、位置情報の通知を要求する。

|||
|---|---|
|onLocationChanged|位置情報が変更された場合に呼び出される|
|onProviderDisabled|位置情報プロバイダが無効になった場合呼び出される|
|onProviderEnabled|位置情報プロバイダが有効になった場合に呼び出される|
|onStatusChanged|位置情報プロバイダのステータスが変更された場合に呼び出される|

### 位置情報を要求する

位置情報の更新を受け取るためには、LocationManagerクラスで用意されているrequestLocationUpdatesを呼び出す。
第一引数にはプロバイダ(GPSの場合はLocationManager.GPS_PROVIDERを指定、ネットワークの場合はLocationManager.NETWORK_PROVIDERを指定)、第二引数は取得する間隔(ミリ秒)、第三引数は通知される最小距離を指定(メートル)、第四引数にLocationListenerインターフェースを実装したクラスを指定。

位置情報の通知の停止には、removeUpdateメソッドを呼び出すことで止めることが出来る。

### 位置情報を取得する

位置情報に変化があった場合、実装したリスナーの各メソッドが呼び出される（onLocationChanged）。
その引数として、Locationクラスのインスタンスが渡される。そのgetterメソッドを使って位置情報が取得できる。

|||
|---|---|
|getLatitude()|緯度を取得|
|getLongtiude()|経度を取得|
|getAccuracy()|精度を取得|
|getAltitude()|高度を取得|
|getTime()|時刻を取得|
|getSpeed()|速度を取得|
|getBearing()|方向を取得|

### GPSの利用許可

マニフェストファイルにandroid.permission.ACCESS_COARSE_LOCATIONを指定する。
GPSを利用して精密に取得する場合は、android.permission.ACCESS_FINE_LOCATIONを指定する。
エミュレータを利用する場合はandroid.permission.ACCESS_MOCK_LOCATIONを指定する。

#### バッテリー消費にご用心！

GPSはバッテリー消費が早いので注意。常時取得するのではなく適切な間隔をあけるようにする。

## センサ

### SensorManagerを取得する

android.hardwareパッケージのSensorManagerクラスで端末に搭載している各種センサの情報を取得できる
Contextクラスの派生クラスのgetSystemServiceメソッドを呼び出すことで、SensorManagerのインスタンスが得られる

### 使用可能なセンサ

android.hardware.Sensorクラスで定数として定義されている

|||
|---|---|
|TYPE_ACCELEROMETER|加速度センサ|
|TYPE_ALL|使用できるすべてのセンサ|
|TYPE_AMBIENT_TEMPERATURE|温度センサ（APIレベル14以降）|
|TYPE_GRAVITY|重力センサ（APIレベル9以降）|
|TYPE_GYROSCOPE|ジャイロセンサ|
|TYPE_LIGHT|明るさセンサ|
|TYPE_LINEAR_ACCELERATION|線形加速度センサ（APIレベル9以降）|
|TYPE_MAGNETIC_FIELD|地磁気センサ|
|TYPE_ORIENTATION|傾きセンサ|
|TYPE_PRESSURE|圧力センサ|
|TYPE_PROXIMITY|近傍センサ|
|TYPE_RELATIVE_HUMIDITY|湿度センサ（APIレベル14以降）|
|TYPE_ROTATION_VECTOR|回転ベクトルセンサ（APIレベル9以降）|
|TYPE_TEMPERATURE|温度センサ（APIレベル14以降廃止）|

### Sensorクラスのインスタンスを取得する

センサから情報を取得するには、使用したいセンサに相当するSensorクラスのインスタンスを取得する。
SensorManagerクラスのgetSensorListメソッドに取得したいセンサーの定数を渡して呼び出すことで取得できる。

### センサの値を取得

SensorEventListenerというイベントリスナーのインターフェースを実装して、SensorManagerクラスのインスタンスに対してセンサ情報の変化の通知を要求する。

|||
|---|---|
|onSensorChanged|センサ情報に変化があった場合に呼び出される|
|onAccuracyChanged|センサの精度に変化があった場合に呼び出される

センサ情報に変化があった場合の通知を受け取るためにはSensorManagerクラスのregisterListenerメソッドを呼び出し。SensorEventListenerを登録する
第一引数はSensorListenerインターフェースを実装したインスタンス。第二引数はSensorのインスタンス。
第三引数は取得精度を指定する。

|||
|---|---|
|SENSOR_DELAY_FASTEST|可能な限り早くセンサデータを取得|
|SENSOR_DELAY_GAME|ゲームに適した速度|
|SENSOR_DELAY_NORMAL|通常。画面の向きの変化に適した速度|
|SENSOR_DELAY_UI|ユーザインターフェースに適した速度|

センサの通知が不要になった場合はunregisterListenerメソッドを呼び出すことで通知要求を止めることが出来る。
WebRTC SDPのタイプをチェックする。[CodePen埋め込みテスト] 

<p data-height="362" data-theme-id="0" data-slug-hash="aERyZq" data-default-tab="js,result" data-user="gtk2k" data-embed-version="2" data-pen-title="SDP Type Check" class="codepen">See the Pen <a href="https://codepen.io/gtk2k/pen/aERyZq/">SDP Type Check</a> by gtk2k (<a href="https://codepen.io/gtk2k">@gtk2k</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://production-assets.codepen.io/assets/embed/ei.js"></script>
Chromeでは64からクロスオリジンな\<iframe\>ではgUM()が使えないため何も表示されません。CodePenにアクセスしてください。
audioまたはvideoを複数トラックRTCPeerConnectionにaddTrack()して、createOffer()でできたSDPに`m=audio`または`m=video`が一つしかなければ`Plan B`、複数あれば`Unified Plan`と判断。
yarnで依存パッケージのライセンスを出力・保存する

*yarnバージョン：v1.3.2*

yarnには全依存パッケージのライセンス条項文を出力するというnpmには無い機能があります。
```yarn licenses generate-disclaimer```

普段の開発では使い所は無いですが、electron等で作ったアプリを配布時、ライセンスファイルを添付する際に便利です。

出力自体は上のコマンドでいけるものの、保存はどうするのか気になってましたが、標準出力なのでnode.jsだと以下のような感じで内容を保存することができます。

```license-output.js
const exec = require('child_process').exec;
const fs = require('fs');
const outputFilePath = "THIRD_PARTY_LICENSES.txt";

exec('yarn licenses generate-disclaimer --ignore-platform  --ignore-optional --ignore-engines', {maxBuffer: 400*1024}, (err, stdout, stderr)=> {
  if (err || stderr) {
    console.log("execエラー");
    throw err || stderr;
  };

  fs.writeFile(outputFilePath, stdout, (err)=> {
    if (err) {
      console.log("書き込みエラー");
      throw err;
    } else {
      console.log("完了!")
    }
  })
});
```

実行
```node license-output```

※ バッファオーバーエラーを防ぐため、オプションでmaxBufferの上限を上げてます。文書量に応じて適宜変えて下さい。
※ --ignore-なんちゃらのオプションは、冒頭に"info: ...The platform "win32" is incompatible with this module."みたいなエラー文が入ってしまうのを防ぐためにつけてます。
Mithrilのテスト(ospec)でhttpリクエストをモックする

Mithrilでテストを書く場合，付属しているものを使うのであれば ospec を使うことになります．

ospecで，HTTPリクエストをモックしたい場合，どのようにすればよいか，ということを解説します．

## 実装
まずは，HTTPリクエストを投げるコードを書いておきます．
今回はチュートリアルからコードを引っ張ってきます．

```javascript
const m = require('mithril');

var User = {
  list: [],
  current: {},
  load: function(id) {
    return m.request({
      method: 'GET',
      url: `https://rem-rest-api.herokuapp.com/api/users/:id`,
      data: {id},
      withCredentials: true
    })
    .then((res) => User.current = res);
  }
};

module.exports = User;
```

この `User.load` のテストを書く際に，HTTPリクエストをモックしたい．．．．といったケースを想像してください．

## テストを書く
さて，モックするに辺り必要になるのは以下の2点です．

* Mithrilで用意されているモック実装を読み込む
* ルート定義を行う

では，順番にやっていきます．

### Mithrilで用意されているモック実装を読み込む

ここは公式ドキュメントにあるとおりです．

```js
require('mithril/test-utils/browserMock')(global);
```

このようにしておけば，XHR等のモックが一通り定義されます．

### ルート定義を行う

`window.$defineRoutes` にモック関数を渡すことで，ある特定のURLへのリクエストに対するレスポンスをモックします．

例えば，`https://rem-rest-api.herokuapp.com/api/users/1`へのリクエストをモックする場合は以下のように書きます．

```js
window.$defineRoutes({
  'GET /api/users/1': function(req) {
    return {
      status: 200,
      responseText: JSON.stringify({
        id: 1,
        firstName: 'Peter',
        lastName: 'Mackenzie'
      })
    }
  }
});

```

`req` に渡されるのは`{url, query, body}`のようなオブジェクトです 

なお，

* `window.$defineRoutes` に渡す関数では非同期処理は行えないこと
* 内部で行われているのは単なる文字列比較であるため， `:id` 等のパラメータを含む場合は固定の値しか使えないこと

には注意が必要です．

## まとめ
以上の工程を一通り行い，テストを書くと以下のようになります．

`o('User.load')`で`Promise`を返すところがミソで，こうすると非同期処理の終了を待ってくれるようになります．

```js
const o = require('mithril/ospec/ospec');
require('mithril/test-utils/browserMock')(global);
const User = require('../src/models/User');

o.spec('Mock HTTP', function() {
  o('User.load', function() {
    window.$defineRoutes({
      'GET /api/users/1': function(req) {
        return {
          status: 200,
          responseText: JSON.stringify({
            id: 1,
            firstName: 'Peter',
            lastName: 'Mackenzie'
          })
        }
      }
    });
    return User.load(1)
      .then(function(res) {
        o(User.current.id).equals(1);
      });
  });
});
```
Swift：タッチイベントの際にタッチした座標を取得する方法２通り

#はじめに
タッチイベントの際指が触れている座標を知りたくなること、よくあると思います。備忘録としてタッチした座標を取得する方法を2通りまとめておきます。

#1つ目の方法：UIResponder編
タッチイベントといえば、`touchesBegan`、`touchesMoved`、`touchesEnded`三兄弟をよく使いますね。

##基本
```swift:
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
	let touch = touches.first! //このタッチイベントの場合確実に1つ以上タッチ点があるので`!`つけてOKです
	let location = touch.location(in: self.view) //in: には対象となるビューを入れます
	Swift.print(location)
}
```

##特定のビューに触れている全てのタッチ座標を調べたい場合
```swift:
@IBOutlet weak var myView: UIView!

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
	for touch in touches {
		let location = touch.location(in: myView)
		Swift.print(location)
	}
}
```

##全域の全てのタッチ座標を調べたい場合
```swift:
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
	if let allTouches = event?.allTouches {
		for touch in allTouches {
			let location = touch.location(in: self.view) //一番親のビュー
			Swift.print(location)
		}
	}
}
```

#2つ目の方法：UIControlEvents編
タッチイベントといえば、`touchUpInside`とか`touchDown`とかもありますよね。

```swift:
@IBOutlet weak var myBtn: UIButton!

init() { //ViewDidLoadとか何かしらの初期化フェーズにて
	myBtn.addTarget(self, action: #selector(self.down(_:forEvent:)), for: .touchUpInside)
}

@objc func down(_ sender: UIButton, forEvent event: UIEvent) {
	let touches = event.touches(for: sender)
	let location = touches!.first!.location(in: sender)
	Swift.print(location)
}
```

※Swift4から`#selector`使う時はメソッドに`@objc`を明示的につけなくてはならなくなったので注意
Railsにおけるパスワードの扱い方(BCrypt)

Rails開発においてbcryptを使用するため少し調べてみました。
筆者の環境はこんな感じです。

```
Ruby '2.4.1'
Rails '5.1.4'
bcrypt '3.1.11'
```

#BCryptとは
bcrypt(ビークリプト)とはBlowfish暗号に基づいて作られたパスワードハッシュ関数。
bcryptはsaltと呼ばれる短いランダムな文字列を末尾に加えて暗号化するため、レインボーテーブル(ハッシュ値に対して総当たりで平文を得ようとするもの)に対して強いという特徴があります。

#インストール方法
Gemfileに記述し、`$ bundle install`でインストールします。

```:Gemfile
gem 'bcrypt', '3.1.11'
```
#パスワードのハッシュ化
##has_secure_password
セキュアなパスワードの実装には、`has_secure_password`メソッドを使用します。セキュアなパスワードを実装したいモデルで以下のように記述するだけです。

```Ruby:hoge.rb
class Hoge < ApplicationRecord
  has_secure_password
end
```

こうすることで、Hogeモデルに`password`,`password_confirmation`属性が追加され(バリデーションも追加される)、`authenticate`メソッドが使えるようになります。

##password_digest属性の追加
ハッシュ化したパスワードですが、has_secure_passwordではデータベース内の`password_digest`という属性に保存できるようになります。(passwordではない点に注意)

そのため、データベースにpassword_digest属性を追加する必要があります。
以下のようにマイグレーションを生成してカラムを追加しましょう。

`$ rails generate migration add_password_digest_to_hoges password_digest:string`
`$ rails db:migrate`

ここで、マイグレーション名の末尾を`to_hoges`にすることでRailsによって自動的にhogesテーブルにカラムを追加するマイグレーションとなります。

#Viewの作成
あとはpasswordとpassword_confirmationをフォームで送るだけでbcryptが暗号化してくれるので、そのビューを作成します。以下はフォームの一例です。

```erb:app/views/hoges/form.html.erb
<%= form_for(@hoge) do |f| %>

  <%= f.label :password %>
  <%= f.password_field :password %>

  <%= f.label :password_confirmation %>
  <%= f.password_field :password_confirmation %>

<% end %>
```

これでフォームを送信すればpassword_digestに暗号化されたパスワードが入ります。
あとはパスワードを認証するだけです。

##authenticateメソッド
パスワードを認証するには、`authenticate`メソッドを利用します。
実装するのは簡単で、以下のように記述します。

```Ruby
@hoge.authenticate("foobar")
```

これで、もし@hoge（has_secure_passwordを追加したモデルのオブジェクト）のパスワードが`foobar`なら、これはtrueを返します。

#参考文献
[Ruby on Rails Tutorial 第6章](https://railstutorial.jp/chapters/modeling_users?version=5.1#sec-adding_a_secure_password)を参考にさせていただきました。


初投稿なので間違い等ございましたらご指摘いただけるとありがたいです。
golangでExcelの列番号を英文字にする

# モチベ

excelize の引数が列番号じゃなく英文字でしか渡せないのでコンバーターがほしかった。

https://github.com/360EntSecGroup-Skylar/excelize

まぁ、この辺りに答えはあったんですけど、自分でも作りたかった。

https://github.com/360EntSecGroup-Skylar/excelize/issues/132

というか PR送ったら取り込んでくれたりしないだろうか...

# 参考資料

Excel で列番号を英文字に変換する方法
https://support.microsoft.com/ja-jp/help/833402/how-to-convert-excel-column-numbers-into-alphabetical-characters

# コード

```go
package main

import (
	"fmt"
	"strconv"
)

func conv(i int) string {
	if i <= 0 {
		return ""
	}

	j := (i - 1) % 26
	l := "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
	s := conv((i - j) / 26)
	return s + string(l[j])
}

func GetAxis(row, col int) (string, error) {
	if col <= 0 {
		return "", fmt.Errorf("column value was invalid")
	}

	if row <= 0 {
		return "", fmt.Errorf("row value was invalid")
	}

	cstr := conv(col)
	rstr := strconv.Itoa(row)
	return cstr + rstr, nil
}

func main() {
	if axis, err := GetAxis(1, 1); err != nil {
		panic(err)
	} else {
		fmt.Println(axis) // A1
	}

	if axis, err := GetAxis(12, 26); err != nil {
		panic(err)
	} else {
		fmt.Println(axis) // Z12
	}

	if axis, err := GetAxis(123, 30); err != nil {
		panic(err)
	} else {
		fmt.Println(axis) // AD123
	}

	if axis, err := GetAxis(1234, 52); err != nil {
		panic(err)
	} else {
		fmt.Println(axis) // AZ1234
	}

	if axis, err := GetAxis(12345, 53); err != nil {
		panic(err)
	} else {
		fmt.Println(axis) // BA12345
	}

	if axis, err := GetAxis(123456, 864); err != nil {
		panic(err)
	} else {
		fmt.Println(axis) // AGF123456
	}

	if axis, err := GetAxis(12, 0); err != nil {
		fmt.Println(err)
	} else {
		fmt.Println(axis)
	}

	if axis, err := GetAxis(0, 1); err != nil {
		fmt.Println(err)
	} else {
		fmt.Println(axis)
	}
}

```
docker-composeでバッチを走らせる with Javaバッチ

Dockerはデーモンプロセスを立ち上げるだけが能ではありません。一度だけ実行するバッチも立ち上げるのも全然アリです。

ただ、 `docker` コマンドでコンテナを起動するのは辛いですね。バッチでも `docker-compose` を使いましょう。

今回はバッチとしてJavaで書かれた単純なCLIプログラムを動かしたいと思います。

## ソース

https://github.com/knjname/2018-02_DockerComposeBatchExample

ここからDLできます。

## 構成の紹介

### Java アプリ部分

適当にSpring bootで作った。下記のようなものを実行する。バッチの引数や環境変数をプリントするだけのものです。
  
  ```java
    // Spring boot で CommandLineRunner 噛ませた時のmain関数みたいなやつ
    @Override
    public void run(String[] args) throws Exception {
		System.out.println("Batch run!!!");
		System.out.println("  args: " + String.join(", ", args));
		System.out.println("  env: " + System.getenv("MY_ENV_VALUE"));
    }
  ```

どうでもいいですが、Javaでどうでもいいものを作る時は[Spring Bootを使いましょう。](https://start.spring.io/)

### Dockerfile 部分

前段(`... AS builder`)でビルドしたJARを後半のコンテナに取り込み、 `java -jar ビルドしたJAR` を動かす内容です。

```Dockerfile
FROM library/openjdk:9.0.1-11-jre-slim AS builder
ADD . /app
WORKDIR /app
RUN ./gradlew bootRepackage
RUN mv /app/build/libs/*.jar /app.jar

FROM library/openjdk:9.0.1-11-jre-slim
COPY --from=builder /app.jar /app.jar
ENTRYPOINT [ "java", "-jar", "/app.jar" ]
```

最後がENTRYPOINTになっているので、バッチに引数を渡すことができます。

### docker-compose.yml 部分

とりあえず `MY_ENV_VALUE` としてバッチへの環境変数を与えています。実際はデータベースの接続先とかを与えることになると思います。ほか、ボリューム指定としてバッチのファイル書き出しディレクトリとかもここで指定ですね。

```yaml:docker-compose.yml
version: "3.4"

services:

  batch:
    # 上記のDockerを docker build . -t myjavabatch でビルドした場合は image: myjavabatch とかになると思います
    build: ./
    environment:
      MY_ENV_VALUE: "foobarbaz"

# restart: always とか要らない
# ports: も要らない
# network_mode: "host" は指定してもデーモン類と違って特に問題ないはず。
# DockerのイメージはWebなどと兼用せず、バッチ専用のものを作ったほうがいいです。
```

## バッチの起動方法を探ってみる

いつものように、下記のように起動してはいけません。これではサービス（デーモン）の起動になってしまいます。

```
$ docker-compose up -d
```

バッチのような起動したい時に起動する、使い捨てのコンテナは下記のように `--rm` をつけて起動するのが基本です。

```
$ docker-compose run --rm batch バッチの引数
```

ついでにいうと、上記ではTTYをとれない場合(crontabからの実行など）、うまくいきません。 `-T` を指定してあげましょう。

```
$ docker-compose run --rm -T batch バッチの引数
```

しかし、まだこれでも罠があります。

`docker-compose run` は今のところ（2018/02/06時点）、コンテナ名を `ベースの名前_run_1` というように連番で採番しますが、 [`_1` が被って起動できないことがあります。](https://github.com/docker/compose/issues/1516)

コンテナ名が被らないように名前を乱数で明示的につけてあげましょう。

```
$ docker-compose run --rm -T --name `uuidgen` batch バッチの引数
```

これでバッチリです。

 * [`uuidgen` コマンド](https://linuxjm.osdn.jp/html/e2fsprogs/man1/uuidgen.1.html) を利用。
 * 敢えて同一の種類のバッチの名前を被せることで、二重起動を防ぐとかもできそうですが、ここでは触れません。

## ラッパシェルもほしいよね

上記のコマンドのラッパシェルも作ってあげましょう。

```bash:wrapper.sh
#!/bin/bash

docker-compose run --rm -T --name `uuidgen` batch "$@"
```

ラッパシェル経由でバッチを呼ばれば、バッチリです。 :smile_cat: 

```console
$ ./wrapper.sh my java batch is forever!!
```

さらにcronで定期実行したい人は `crontab -e` で下記のようなcronエントリを定義してあげましょう。

```bash:crontab
# /dev/null に捨てるのはやめましょう。最近のOSの場合は systemd-cat にあげたりしましょう。
0 * * * * cd /my/path/to/project && ./wrapper.sh my java batch is forever!!! 2>&1 | systemd-cat
```

## おわりに

docker-compose でバッチ実行も別に特殊なことではありません。（ではないと信じたい）

Let's challenge!!
動的に生成した値でセクション分けを行う

## 概要
CoreData内のデータを取得する際に、既存のデータを利用してセクション分けをしたい。
但し、`sectionNameKeyPath`に渡すために無駄にAttributeを増やしたくない。

CoreData内のデータ量を極力増やさずに、既存データを利用してセクション分けを行う手法を紹介する。






## 例
正確な時刻データから日付のみを抽出する。
それを`sectionNameKeyPath`に利用する。

大まかな手順は２つ。

1. NSManagedObjectのサブクラスに動的に値を取得するためのゲッタを定義する。
2. モデル定義を行っている`xcdatamodeld`ファイル内でTransientオプションを有効にする。


### ゲッタの定義
```swift
class Tweet: NSManagedObject {

    @NSManaged var text: String?
    @NSManaged var tweetId: String?
    @NSManaged var createdAt: NSDate?

    @objc var sectionDate: String {
        let dateFormatter = DateFormatter()
        dateFormatter.locale = NSLocale(localeIdentifier: "en_US") as Locale!
        dateFormatter.dateFormat = "yyyy/MM/dd"
        return dateFormatter.string(from: self.createdAt! as Date)
    }

```
ゲッタの定義時は`@objc`が必要なので注意。
`@objc`がないとセクション数が1となってしまう。


### Transientオプションの有効化

<img width="483" alt="Screen Shot 2018-02-06 at 2.04.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/37053/110f70db-f163-5aee-bd6f-91a01edc6c57.png">



---


これで準備は完了。

あとは`NSFetchedResultController`の初期化時に、`sectionNameKeyPath`として、`sectionDate`を渡してやればよい。


## 少し詳細な解説

### ゲッタの定義
`createdAt`には年月日時分秒を含めた正確な時刻情報が入っている。
このままでは`NSFetchedResultController`の`sectionNameKeyPath`に渡しても、セクション分けが細かくなりすぎてしまい、実用的ではない。

モデルクラスの中で`sectionDate`のゲッタを定義し、その中で`createdAt`から年月日の情報のみを抽出している。
これによって、`sectionNameKeyPath`に渡すのに有用な値が得られる。

### Transientの活用

`NSFetchedResultController`の初期化時に、`sectionNameKeyPath`として渡せるようにするために`xcdatamodeld`を修正している。
`Transient`を有効にすることで、データが永続化されないようにしている。
これによって、`sectionDate`が無駄にデータ量を増やすことはなくなる。


---


このページで説明した内容を用いてこのようなTableViewを利用可能。
(画像の一部を消しこんでいます)

![セクション分割の情報をオブジェクトから得ている例](https://qiita-image-store.s3.amazonaws.com/0/37053/46ee1306-a8e7-8062-ee87-495db3ddb288.png)








### 参考

https://stackoverflow.com/questions/44804683/nsfetchedresultscontroller-not-working-with-transient-properties
https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/CoreData/KeyConcepts.html
https://developer.apple.com/documentation/coredata/nsfetchedresultscontroller/1622282-init
ATOM　Package自作 Ω　-まとめ-　

今まで書いて来たことをまとめます。(真面目に。。。)
# ATOMについて
ATOMはGitにて作成されたOSSエディタである。


# 必要スキル
| スキル| 必要箇所|
|:--|:--|
|node.js|コードを書く際に使用。以前まではcoffie-scriptを推奨していたが、現在はnode.jsを推奨している。|
|json|各設定ファイルを記述する際に使用。|
|less(css)|GUI上のレイアウト及び装飾を指定する際に使用|
|html|レイアウト、及び表示テキストの要素を指定する際に使用。|

# 基本操作
##　パッケージの作成
### 手順
1.　Atomの起動
2.　menuより[packages]>[Package Generater]>[Generate Atom Package]を選択
3.　Enter Package Pathとポップアップが発生するので格納先path及びパッケージ名を指定し[Enter]を押下
### 注意事項
パッケージ名に先頭以外に大文字を使用すると[-]+小文字に変換される。

## デバックビューの表示
### GUI
menuより[View]>[Developer]>[Toggle Developer tools]を選択 
### ショートカットキー
| OS| キー|
|:--|:--|
|Windows|[Ctrl]+[Shift]+[F5]|
## モジュールインストール
### 手順
1. パッケージ格納場所へ移動
2. npm install -s [モジュール名]
### 注意点
PATHが通ってないない場合事前に通す。

# パッケージ構成
## 一覧
| ファイル名 | 概要 |
|:-:|:-:|
| keymaps  |  アクションに対するショートカットキーを設定するファイルを格納|
| lib  | メインスクリプトとかビューファイルとかが格納される  |
| menus  | ヘッダーに表示されるメニュー等を作成するファイルを格納  |
| spec  |  コードの検証用ツールが格納されている |
| styles| GUIを設定するlessファイルを格納  |
| package.json| パッケージの設定ファイル  |
| .gitignore| git上で管理する為の設定ファイル  |

## package.json
### 概要
パッケージ自体及び動作環境を定義する。
### 要素
| 要素 | 子要素 |説明|
|:-:|:-:|:--|
|name|-|パッケージの名称|
|main|-|mainスクリプトの場所|
|version|-|パッケージのバージョン|
|description|-|パッケージの説明|
|keywords|-|関連するタグ|
|activationCommands|-|実行するコマンド|
|-|atom-workspace|atom上にて実行するコマンド|
|repository|-|gitの格納URL|
|license|-|使用するライセンス(デフォルトだとMIT)|
|engines|-|動作する環境|
|-|atom|動作するATOMのバージョン|
|dependencies|-|依存性のあるモジュールの定義|
データベースの設計について

現在rails5でオリジナルアプリを作成中で、データベース設計で行き詰っています。

アプリの概要としては、当事者が２種類いて（法人ユーザと専門家）、法人ユーザーが投稿した質問に対して、専門家が回答の意思表示を行った上で、法人ユーザーと専門家の間でアプリ内メッセージ機能を用いて会話する、というものを想定しています（法人ユーザーは回答の意思表示を行った専門家とメッセージ可能で、専門家は回答の意思表示を行った質問について、その質問の法人とメッセージできるイメージ。回答の意思表示は、下記画像のRequestテーブルに専門家のフラグを立てた上で、その後CommentとResponseテーブルに格納された情報を法人ユーザーと専門家の各々のページで表示する）。

<img width="821" alt="Untitled.png" src="https://qiita-image-store.s3.amazonaws.com/0/236452/2c1868c4-4e74-b65c-b68f-3de516c834f0.png">

下記のデータベース設計で問題ないか、データベースに詳しい方に教えて頂きたい次第であります。問題がある設計でしたら、あるべきをご教示頂けると大変助かります。

当方プログラミング初心者で質問が拙く大変申し訳ありませんが、ご教授頂けますと大変助かります。
Atom package自作③-① -ファイル構成-package.json-

# 概要

前回にて、パッケージを作成するにあたっての基本的なATOMの操作は説明出来たかなと思う今日この頃
今回からは、まずpackageの主要ファイルについて説明していく。
まず、下記のファイルがデフォルトにて作成されているかと思うんだけど

|| ファイル名 | 概要 |
|:-:|:-:|:-:|
|| keymaps  |  アクションに対するショートカットキーを設定するファイルを格納|
|| lib  | メインスクリプトとかビューファイルとかが格納される  |
|| menus  | ヘッダーに表示されるメニュー等を作成するファイルを格納  |
|| spec  |  コードの検証用ツールが格納されている |
|| styles| GUIを設定するlessファイルを格納  |
|| package.json| パッケージの設定ファイル  |
|| .gitignore| git上で管理する為の設定ファイル  |

今回は、**[package.json]**について説明していくよぉ
※説明する順番は、記載された順番とは違うことはご了承願いたい。それは彼方の為を思っての事です。
メンヘラじゃないよー。押し付けちゃうよぉ　

# デフォルト　ソース
`
{
  "name": "areans",
  "main": "./lib/areans",
  "version": "0.0.0",
  "description": "A short description of your package",
  "keywords": [
  ],
  "activationCommands": {
    "atom-workspace": "areans:toggle"
  },
  "repository": "https://github.com/atom/areans",
  "license": "MIT",
  "engines": {
    "atom": ">=1.0.0 <2.0.0"
  },
  "dependencies": {
  }
}
`
# package.json
**[package.json]**こいつは言うなれば管理者。リーダー、、当パッケージを制御する大事なファイルだ！
このパッケージはどんな奴？とかどんな依存関係を抱えてる？とかこのファイルを見れば一発で判っちゃう
そんな、PMみたいな奴なんやで
そんな頼もしい彼の中身を解析していっちゃうよ

## 解析 
### name
ここではパッケージ自体の名前を定義する。ここで指定した名前で、将来パッケージを公開した時の名称となる。
### main
ここには、当パッケージのルートディレクトリを指定する。
### version
当パッケージのバージョンを記載する
### description
公開時の説明文を記載する。
### keywords
公開した時の、検索でマッチさせたいキーワードを列挙する。
### activationCommands
実行するコマンドをここにて管理する。
いくら正しくコードを書いてもここに記載がないと実効できないので注意！
### repository
GitHubにて管理される際のパッケージのURL
### license
使用するライセンスを定義する。
デフォルトでは**MIT**が設定されている。
MIT有名だよねーてかGit製だからねー
### engines
使用できるATOMについて定義している
#### atom
**engines**の要素
当パッケージがどのATOMで使用出来るかを記載する。
### dependencies
ここに依存性のあるモジュールを定義する。
前回話した**npm**コマンドにてオプション[**-s**]を指定した場合、ここに記述されていく。
#　まとめ
一旦デフォルトの要素だとこんな感じです。
jsonファイルだから結構判り易く記述されているから迷う事はないかなぁと思います。
(初心者なんでもしかしたら複雑に書いていかないといけないパターンがあるかもだけど。。。)
DockerのHEALTHCHECKの動きを理解する

Dockerfile には `HEALTHCHECK` という指定ができて、これによりコンテナにヘルスチェック機能をつけることができます。要するにコンテナが正常に起動しているかチェックできるということです。

具体的にはコンテナのステータス(`docker ps`)欄に下記のいずれかを追加することができます。 

1. `(health: starting)`: ヘルスチェック中...
2. `(healthy)`: ヘルス判定
3. `(unhealthy)`: ダメ

まあ追加できるだけで、上記の状態遷移とdocker-composeが連動したりなどはしません。 当然`depends_on`とかにも影響はありません…。（ちゃんと実用例はあるようなので、興味のある人は調べてね）

今回はそのヘルスチェックの動きを理解しようと思います。

## 準備

いちいちDockerイメージをビルドするのが面倒なので、下記のようなdocker-composeを用意しながら

```yaml:dockerhc/docker-compose.yml
version: "3.4"

services:
  a:
    image: ubuntu
    command: sleep 100000
    healthcheck:
      test: ["CMD", "false"]
      interval: "1s"
      timeout: "1s"
      retries: 0
      start_period: "100s" # since docker-compose 3.4
```

以下のコマンドで作り直したりして動作確認しましょう。

```console
$ docker-compose up -d --force-recreate

$ docker inspect dockerhc_a_1 | jq '.[0].State.Health.Log'
```

## で、結局どういう動きをするのか？

[Docker公式マニュアル](https://docs.docker.com/engine/reference/builder/#healthcheck) を読めばちゃんと書いてあるのですが、

1. コンテナ起動時から `interval` に指定した時間ごとにヘルスチェックコマンド(`test` に書いてあるもの)を実行。
    * exitコードはそれぞれ `0: 成功, 1: 失敗, 2: 予約済` を意味する。
    * timeout　内にヘルスチェックコマンドが終わらなくても失敗扱い。
2. とりあえず `start_period` 秒内は失敗しても失敗とカウントしない。
    * 成功した場合は `healthy` に移行。
3. `start_period` を脱した後、ヘルスチェック実行時に失敗した場合、 `unhealthy` に移行。
    * この時、 `retries` を指定していた場合は、 `retries` 回連続して失敗したらはじめて `unhealthy` 扱い。
4. その後も状態にかかわらず、ヘルスチェックを実行し続け、それぞれ失敗( `retries`回連続しての失敗 )・成功した場合に `healthy` / `unhealthy` に移行。

いったん、 `healthy` / `unhealthy` に移行しても、 **ヘルスチェック自体は `interval` に指定した間隔でコンテナが起動している限り永遠に続く** ことに留意しましょう。 

![image.png](https://qiita-image-store.s3.amazonaws.com/0/9619/3b73ac9b-1eef-f19e-f7d5-05d7d25aa3d9.png)


## 具体例を通して考える

たとえば、下記のような基準でウェブアプリをヘルスチェックする場合、

* 立ち上がるのに、30秒かかりそう
* 3回ぐらい失敗応答したら許さない
* 応答が5秒以上かかっても許さない
* ヘルスチェックは1分に1度ぐらいに押さえておきたい

下記のように書けばいいでしょう。

```yaml:docker-compose
    healthcheck:
      test: ["CMD-SHELL", "curl http://localhost/api/v1/echo || exit 1"] # exitコードは 0 or 1 に揃えておく。
      start_period: "30s" # 立ち上がるのに、30秒かかりそう
      retries: 3          # 3回ぐらい失敗応答したら許さない
      timeout: "5s"       # 応答が5秒以上かかっても許さない
      interval: "60s"     # ヘルスチェックは1分に1度ぐらいに押さえておきたい

# ↑ 当然 Dockerfile に書く時は Dockerfile の文法で同じことを書いてください。
```

## 使いどころを考える

素のままの Docker + docker-compose 構成の場合、Dockerコンテナがきちんと立ち上がっているか、人の手でチェックするよりは便利、程度ですかね。

使いどころ、難しいですね。定義されていないDockerイメージがほとんどだと思います。
【R】macOS "caret" インストール時に困ったこと 


# ‘ddalpha’ という名前のパッケージはありません

R version 3.4.3 (2017-11-30)
Platform: x86_64-apple-darwin15.6.0 (64-bit)
Running under: macOS High Sierra 10.13.3

`install.packages("caret")`

は問題なかったのですが、読み込んだときに以下のエラーメッセージが出ました。

```console.R
library(caret)
```

> エラー: package or namespace load failed for ‘caret’ in loadNamespace(j <- i[[1L]], c(lib.loc, .libPaths()), versionCheck = vI[[j]]):
  ‘ddalpha’ という名前のパッケージはありません 

何も考えず`ddalpha`をインストールしてみましたが、上記の問題は解決せず、


結果的に以下の質問にたどり着いて解決しました。

[OS X package installation depends on gfortran-4.8](https://stackoverflow.com/questions/23916219/os-x-package-installation-depends-on-gfortran-4-8)

[GFortran](https://ja.wikipedia.org/wiki/GFortran)がPCに導入されていないために、
`caret`の依存パッケージを読み込めなかったみたいです。


```terminal
brew install gcc
```

上記の一行をterminalで実行し`gfortran`のインストールが完了すると、無事`caret`を読み込むことができました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/143058/c657a953-df0d-8d1e-ffe0-5960ea97dc83.png)

参考になれば幸いです。

#参考
[The caret Package](http://topepo.github.io/caret/index.html)
[topepo/caret](https://github.com/topepo/caret)
[Caret package failed to install](https://stackoverflow.com/questions/46174574/caret-package-failed-to-install)
✩✩✩[OS X package installation depends on gfortran-4.8](https://stackoverflow.com/questions/23916219/os-x-package-installation-depends-on-gfortran-4-8)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/143058/f11f5d8c-c94c-1974-a7e8-a19e7c8f2084.png)
初めてのCassandra構築

#Cassandra構築

CentOS7
cassandra 3.0.15
を使って実施。

目標は構築したCassandraへDataStax製DevCenterで繋ぐところまで

初めてCassandraを構築して、設定ファイルでの注意点をメモ。

##cassandra.yamlの設定
Defaultからの変更点を記述

1. Password付きユーザを使いたい時
authenticator: PasswordAuthenticator
※管理ユーザへの初ログイン、新規ユーザ作成にはこの設定が必要です。
デフォルトの管理ユーザはuser:cassandra pass:cassandraとなります。

2. クラスタを組みたい時
seedsを設定するらしい。
seeds: ip1, ip2, ip3　※まだやっていない

3. 外部から接続する時(DevCenterなど)
rpc_address: "ipv4"
※この設定を行った場合、内部からの接続であっても
$ cqlsh "ipv4" -u cassandra
設定したrpc_address指定する必要がある。
localhostでは接続ができなかったので注意が必要。
start_rpcもtrueとして設定。

##cassandra-cliでの設定
cassandraの起動当初、cliで触ろうとしたが、
NEWS.txtに「Cassandra 2.2 以降なくなりました。代わりにcqlshを利用してください。」
とのことで、今後はcliではなくcqlshでCassandraを制御するそうです。
※「Cassandra実用システムインテグレーション」ではcliを推奨していた。出版が5年前で古い。
　本を選ぶ際もcliを使って説明している本はあまり良くないかもしれません。
Mac/node.jsインストール手順

さらのmacbookにnode.jsを入れた際の手順を残します。
同様の文献はありふれてますが、個人的な備忘も兼ねて投稿です。

■homebrew
macのソフトウェア導入を簡単にするパッケージ管理システム。

・インストールコマンド
`/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"`

■nodebrew
node.jsのバージョン管理のためのツール。
先ほどのhomebrewを使います。

・インストールコマンド
`brew install nodebrew`

・インストール確認コマンド
`nodebrew -v`
※バージョンが表示されればok

▼pathの通し方
nodebrewを使用する上で、環境パスを通して置くと便利です。

・設定コマンド
`echo 'export PATH=$PATH:$HOME/.nodebrew/current/bin' >> ~/.bash_profile`
※僕の場合、bashなので。実行後、再起動

▼セットアップ
以下の投稿にもある通り、セットアップしないとnode.jsインストールでエラーがでる。
[Homebrewからnodebrewをインストールして、Node.jsをインストールするまで](https://qiita.com/limonene/items/a10c2755dd2784357c43)

・セットアップコマンド
`nodebrew setup`

■node.js
nodebewリストからバージョンを選択するだけ。

・バージョンリスト表示コマンド
`nodebrew ls-remote`

・最新バージョンインストールコマンド
`nodebrew install-binary stable`
※stable : 安定板、latest : 最新版

・ダウンロードバージョンの確認
`nodebrew ls`


・バージョン設定コマンド
`nodebrew use バージョン`
※上記のダウンロードバージョンの確認より、使用可能なバージョンを確認ください。

・確認コマンド
`node -v`
`npm -v`
※node.js関連のパッケージ管理ツール

■余談
・シェル
入力をコンピュータに伝えるもの

・bash
シェルの一種、シェルの強化版

・シェルの種類
sh、bash 、csh、ksh、tcsh、zsh

シェルはログイン直後から動く。
ログイン時に起動するシェルをログインシェル。

「ログイン時：csh、途中：bash」という変更も可能。

・.bash_profile
ログインシェルがbashの状態で、ログインした時に読み込まれる設定ファイル

・.bashrc
画面上からbashに切り替えた際に、読み込まれる。
ログインシェルがbashでログインした際に、通常は読み込まれないが、.bach_profileに読み込むように記載されていば、読み込まれる。
クレジットカード不要で無料のサーバを手に入れる方法(IBM Bluemix)

#概要
IBMのクラウド(IBM Bluemix)が無料で使えるので、それを利用する。
他のクラウドでも無料枠はあるが、IBMクラウドの場合は、クレジットカードの登録が不要。
また、AWS等で無料枠を利用する際、一番怖いのは誤操作や、パスワードの流出によって、課金が発生してしまう事だが、Bluemixでは、専用のお試し用のアカウントを利用する事になるため、こういった事故は発生しない。
デメリットとしては、何日間か操作をしないと、サーバ自体が消えるが、検証用途に利用するのであれば十分利用できる。

##登録に必要な情報
メールアドレス、名前だけ！


##作成できるサーバとその制限
256MBメモリ
インスタンスは1つ

制限事項としては、以下の通り。
10日間 開発なしでアプリを自動停止
30日間 活動なしでサービスの自動削除


##実際に試してみる

#登録

こちらのURLから、サービスのTOPページに移動する。
https://www.ibm.com/cloud-computing/jp/ja/bluemix/lite-account/

##TOP画面

「ライト・アカウントを今すぐ登録」をクリックしてください。

![スクリーンショット 2018-02-06 0.20.41.png](https://qiita-image-store.s3.amazonaws.com/0/222043/4af256f1-7a0f-258d-e216-6e5b9e59fdd7.png)


##登録内容入力

メールと名前とパスワードだけ入れればOKです。

![スクリーンショット 2018-02-06 0.21.36.png](https://qiita-image-store.s3.amazonaws.com/0/222043/20213e83-bcd0-9f65-eb03-fe0a8a8fde78.png)


##受付完了

![スクリーンショット 2018-02-06 0.30.07.png](https://qiita-image-store.s3.amazonaws.com/0/222043/3d801393-1b4c-a880-90eb-9b8e8cfe89b7.png)

登録したアカウントに、確認メールがきているので、confirmボタンを押してください。


##登録完了

![スクリーンショット 2018-02-06 0.31.11.png](https://qiita-image-store.s3.amazonaws.com/0/222043/0cb5b432-9ffd-a502-10f3-9f7d3980a433.png)

##ログイン

ログインすると、以下のような画面になります。

![スクリーンショット 2018-02-06 0.37.09.png](https://qiita-image-store.s3.amazonaws.com/0/222043/8c4af14a-b8ae-40c2-a157-4939338d0de2.png)


左上の、三のボタンを押すと、メニューが出てきます。
ちゃんと、日本語化されててうまく利用できそうです。

![スクリーンショット 2018-02-06 0.40.30.png](https://qiita-image-store.s3.amazonaws.com/0/222043/60833bbb-0eeb-54ef-b10b-99d4d3c7885d.png)


##利用
続きは別記事を書きます。


##参照
http://itpro.nikkeibp.co.jp/atcl/news/17/102702548/?rt=nocnt
(Python)(jinja2) 設定ファイルの値をテンプレートに埋め込んで出力する方法

# やりたいこと

インフラエンジニアは、環境間で値だけが異なる設定ファイルをメンテナンスすることが多い。

そんなことを繰り返していると、次のようなことを考えるようになる。

  - 別ファイルに用意した設定値を、いい感じで設定ファイルに反映したい

今回は Python の jinja2 を使って、YAML の設定値を JSON に埋め込む方法を紹介したい。

# (裏の)やりたいこと

Python 系の記事を書くと、いいねがもらえるらしいので、本当かどうか確かめたい。

  - <https://qiita.com/phigasui/items/4ff61cfa3a6a32fd2121>

# yaml を jinja2 に流し込むサンプルコード

``` python
import sys, yaml, jinja2
_loader         = jinja2.FileSystemLoader("./", encoding='utf-8')
_environment    = jinja2.Environment(loader=_loader)
_template       = _environment.get_template(sys.argv[1])
sys.stdout.write(_template.render(yaml.load(sys.stdin)))
```

本コードは、YAML の値を標準出力から受け取り、第一引数で指定されたテンプレートファイルの中に埋め込んで出力する処理を行っている。

あとで利用するので、yaml_jinja2.py のファイル名で保存しておくこと。

# テキストの中に設定値を埋め込むサンプルスクリプト

``` bash
cat > param.yml <<'EOF'
---
hoge: HOGE
hage: HAGE
...
EOF

cat > template.j2 <<'EOF'
{{ hoge }} は、{{ hage }} だ。

EOF

cat param.yml \
  | python yaml_jinja2.py template.j2
rm param.yml template.j2
```

実行すると以下の出力を得る。

``` example
HOGE は、HAGE だ。
```

# JSON の中に設定を埋め込むサンプルスクリプト

``` bash
cat > param.yml <<'EOF'
---
hoge: HOGE
hage: HAGE
...
EOF

cat > template.j2 <<'EOF'
{
  "hoge": {{ hoge|tojson }}
  "hage": {{ hage|tojson }}
}

EOF

cat param.yml \
  | python yaml_jinja2.py template.j2
rm param.yml template.j2
```

実行すると以下の出力を得る。

ポイントは、テンプレートの中に記載している tojson というフィルターである。これを入れないと、いい感じには変換ができないので注意してほしい。

``` example
{
  "hoge": "HOGE"
  "hage": "HAGE"
}
```

# 今後にむけて

反響がよければ、配列の展開も説明する。

あと、出力の文言も見直すかを要検討。

# 参考情報

  - <https://blog.monophile.net/posts/20171127_yaml_jinja2.html>
postfixでメール誤送信を防ぐ為の設定

メールの誤送信を防ぐ為に行った設定がこちら。25番ポートを閉じてメールを送信できないようにしていた。

```bash
sudo iptables -A OUTPUT -p tcp -m tcp --dport 25 -j DROP
sudo service iptables save
```

# 問題点
メールのテストができない。メール送信エラーとなりアプリケーション上で正常系ルートに到達しない。

# 対策
postfixのメールリレー設定で特定のメールアドレスのみをsmtpで送信し、それ以外は破棄する。こうすることで、メールの送信処理自体は正常に行われるが、特定のアドレス以外はメールが到達することがなくなる。

# postfixの設定
Postfix ver 2.6.6
`@gmail.com`のみメール送信を許可する設定です。サクッと`sed`コマンドで追記します。

```bash
sudo sed -i -e "$ a transport_maps = hash:/etc/postfix/transport" /etc/postfix/main.cf
sudo sed -i -e "$ a gmail.com                  smtp:" /etc/postfix/transport
sudo sed -i -e "$ a localhost                 local:" /etc/postfix/transport
sudo sed -i -e "$ a localhost.localdomain     local:" /etc/postfix/transport
sudo sed -i -e "$ a *                       discard: \"discard received email\"" /etc/postfix/transport
sudo postmap /etc/postfix/transport
sudo service postfix reload
```

参考
[postfixでメール送信先ドメインを制限する](https://qiita.com/minamijoyo/items/d488966ebc1d36ea3586)
[postfixのsmtpd_recipient_restrictionsの宛先制限はsendmailコマンド使用時には有効にならない](http://hogem.hatenablog.com/entry/20110220/1298220311)
VisualStudioCodeのターミナルをAnacondaにする

#対象読者
VSCodeでpythonを書き、Anaconda環境で実行している方。

# 1. Anacondaプロンプトの起動スクリプト
以下の起動スクリプトを任意の場所に作成する。

``` cmd:Anaconda3.bat
C:\WINDOWS\System32\cmd.exe "/K" C:\ProgramData\Anaconda3\Scripts\activate.bat C:\ProgramData\Anaconda3
```

# 2.  VSCodeの設定
VSCode > ファイル > 基本設定 > 設定にて以下のように標準のシェルを上記のbatファイルに上書きする。

```script:ユーザー設定
（規定の設定を上書きするには、このファイル内に設定を挿入します。）
{
    "terminal.integrated.shell.windows": "C:\\ProgramData\\Anaconda3\\envs\\Anaconda3.bat",
}
```

# 3. 完成
Pythonコードの編集が終わったら Ctrl+@ でシェルを起動。
すると先ほどのbatファイルが起動し（少し時間がかかる）Anaconda環境でコードを実行できる。
VSCodeで開いているフォルダに自動で移動してくれるのですごく楽。

![2018-02-05 (1).png](https://qiita-image-store.s3.amazonaws.com/0/26413/cd048bf4-4075-9173-4022-425b968ec3f0.png)


#経緯
1. もともとはCygwin環境でPythonやってました。
2. しかしMatPlotlibを使ってグラフを描画させたいとなった時、GUI環境の導入ができませんでした。（私の環境構築力不足です。ほかのPCではうまくいくのに...となったり、手当たり次第にCygwinのX環境系をいれまくってみたり、よくわからないものをbuildしてみたり試みましたがだめでした。）
3. そしてAnacondaをやむなく導入しました。ファイルサイズでかいですがAnaconda良いですね。全部入りPythonって感じで。
2. CodingはVSCodeでやりたいのですが、Anacondaプロンプトウィンドウを実行のためだけに画面のどっかにおいておいて実行のたびにフォーカス移すのは面倒くさいです。で本記事にいたります。

#起動スクリプトはどこから
起動スクリプトはAnacondaプロンプトのショートカットを右クリックしてプロパティから取得しました。
オプションの意味は私ワカリマセン。
![2018-02-05 (2).png](https://qiita-image-store.s3.amazonaws.com/0/26413/600bd0b0-7df8-6d8d-20e7-5542f953d244.png)
pandasのデータフレームから外れ値を含む行を取り除く

データ解析を行う場合、外れ値を含んでいると相関係数などを求めたときにおかしな値が得られてしまうことがあります。今回はこの外れ値を含む行を取り除く関数を、pandasのdataframeを使用して紹介します。

参考：[Pandas で四分位数を基準に外れ値を NaN で埋める](https://qiita.com/kohei_kimura/items/75fdb4432a4491761719)


# 四分位範囲を基準に外れ値をNanで埋める関数
```python:outlier_iqr.py
def outlier_iqr(df):

    for i in range(len(df.columns)):
        
        # 列を抽出する
        col = df.iloc[:,i]
        
        # 四分位数
        q1 = col.describe()['25%']
        q3 = col.describe()['75%']
        iqr = q3 - q1 #四分位範囲

        # 外れ値の基準点
        outlier_min = q1 - (iqr) * 1.5
        outlier_max = q3 + (iqr) * 1.5

        # 範囲から外れている値を除く
        col[col < outlier_min] = None
        col[col > outlier_max] = None

    return df
```

# 2σを基準に外れ値をNanで埋める関数
```python:outlier_2s.py
def outlier_2s(df):

    for i in range(len(df.columns)):
        
        # 列を抽出する
        col = df.iloc[:,i]
        
        # 平均と標準偏差
        average = np.mean(col)
        sd = np.std(col)

        # 外れ値の基準点
        outlier_min = average - (sd) * 2
        outlier_max = average + (sd) * 2

        # 範囲から外れている値を除く
        col[col < outlier_min] = None
        col[col > outlier_max] = None

    return df
```

あとはNanを含む行を以下のコードで消してください。

    df.dropna(how='any', axis=0)
ちなみに列を消したい場合はaxis=1と指定してください。
#まとめ
今回は四分位範囲と2σを基準に外れ値を含む行を削除する方法を紹介させていただきました。
また、外れ値を取り除くのではなく、平均値や中央値などで穴埋めしたいという方もいらっしゃるかと思います。そんな方には以下のサイトが参考になるかと思いますので是非ご参照ください。
[pandasで欠損値NaNを除外（削除）・置換（穴埋め）する](https://note.nkmk.me/python-pandas-nan-dropna-fillna/)
C++における負の整数の割り算および余りについて

このメモはC++で整数`a`と`b`に対して `a / b` や `a % b` を実行する際、`a`か`b`が負の数だったときどうなるのかを調べてみた結果です。

ネット上のドキュメントを見ると、
Arithmetic operators - http://en.cppreference.com/w/cpp/language/operator_arithmetic
に書いてありました。その内容から引用すると、

- 割り算は実装依存の方向に丸められる。（C++11まで）
- 割り算は0の方へ丸められる（分数の部分は捨てる）。（C++11から）
- `a / b` が表現可能であれば `(a/b)*b + a%b == a` が成り立つ。

ということで、C++11以降に準拠しているコンパイラであれば負の整数で割り算や余りの計算ができるようです。

そこで、簡単な実験をしてみました。

    #include <iostream>

    void test(volatile int a, volatile int b) {
        volatile int res = a / b;
        std::cout << a << " / " << b << " = " << res << std::endl;
    }
    
    int main() {
        test(5, 3);
        test(5, -3);
        test(-5, 3);
        test(-5, -3);
    }

一応、コンパイル中でなく実行時に計算しておこうと思ったため `volatile` をつけています。

これを

- OS: Ubuntu 16.04
- コンパイラ: GCC 7.2.0
- オプション: -std=c++17

で実行した結果、

    5 / 3 = 1
    5 / -3 = -1
    -5 / 3 = -1
    -5 / -3 = 1

と予定通りの結果が返ってきました。
このようにコンパイラがしっかりしていれば負の整数でも気にせず計算はできるようです。（そう言いつつ自分は使っていない。）
AliExpress の Order detail を印刷しやすくするブックマークレット

AliExpressで仕入れたりしているが、クレジットカード決済した場合にその明細としてAliExpressのOrder detail画面を印刷しておきたい。

が、ItenaryとかReceiptとかPrint画面なんて親切な画面はなくて、INVOICEを信じろとしか書いてない。
困るので、印刷してもいい感じになるような画面にブックマークレットでやってやることにした。

```
javascript:!function(d,f,s){s=d.createElement("script");s.src="//j.mp/1bPoAXq";s.onload=function(){f(jQuery.noConflict(1))};d.body.appendChild(s)}(document,function($){$('.container.me-body-container,.header-wrap.container').css({'width':'980px','margin':'0'});$('#order-pnl,#fund-pnl').show();$('#top-lighthouse,#message-section,.site-footer,.footer-copywrite,.online-robot').hide();window.print();})
```

これをブックマークレット化すると、↓これが

![aliex1.png](https://qiita-image-store.s3.amazonaws.com/0/97659/3ac4392e-b926-366b-7418-7d3bb3d8c745.png)

↓こうなる

![aliex2.PNG](https://qiita-image-store.s3.amazonaws.com/0/97659/daf91441-b32f-3f62-0ba7-6d0cfa7f94b1.png)

ブックマークレットにするのは、ぐぐってくれ
Postgresqlでスーパーユーザー権限をもったユーザーを作成する

RailsをPostgreSQLと一緒に使い、マイグレーションなどの処理をしようとした際に`ActiveRecord::NoDatabaseError`として`FATAL: role "xxx" does not exist`のようなエラーに遭遇することがある。これは端的に言うとデータベースを操作するために必要なユーザー(role)が存在しないよという旨のエラーだ。これを解決するにはとりあえずスーパーユーザー権限をもったユーザーを作成してやればよい。

## 1. 対話型ターミナルにログイン
```sh
$ sudo -u postgres psql
```

## 2. スーパーユーザー権限のロールを作成
たとえば`izumisy`という名前のユーザーを作成する場合にはこのようにする。
 
```psql
postgres=# create role izumisy with superuser login password '';
```

## 3. ロール一覧で作成を確認
最後に`\du`でロールの一覧をチェックする。

```psql
postgres=# \du
                                    List of roles
 Role name  |                         Attributes                         | Member of
------------+------------------------------------------------------------+-----------
 izumisy    | Superuser                                                  | {}
 postgres   | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
```
問題なければ`\q`でターミナルを抜けておわり。
個人メモ（Python-Apacheログ取り込み）

とりあえずゴリ押しのPythonコード。
美しさはない。

~~~python
import pandas as pd
from urllib.parse import unquote 

# ファイルの場所
url = '/tmp/access.log'

# column定義
fields = ['host', 'identity', 'user', 'time_part1', 'time_part2', 'cmd_path_proto', 
          'http_code', 'response_bytes', 'referer', 'user_agent', 'unknown']

# データ読み込み
data = pd.read_csv(url, sep=' ', header=None, names=fields, na_values=['-'])

# 時刻列parse
time = data.time_part1 + data.time_part2
time_trimmed = time.map(lambda s: s.strip('[]').split('+')[0])
data['time'] = pd.to_datetime(time_trimmed, format='%d/%b/%Y:%H:%M:%S')

# コマンド列parse
data['command'], data['path'], data['protocol'] = zip(*data['cmd_path_proto'].str.split().tolist())
data['path'] = data['path'].map(lambda s: unquote(s))

# 不要列削除
data1 = data.drop(['time_part1', 'time_part2', 'cmd_path_proto'], axis=1)

# 空データ削除
data2 = data1.dropna(axis=1, how='all')
~~~
回帰分析の有意水準を寿司で表す

回帰分析の結果には、有意水準を簡潔に表現する記号として`＊`がよく添えられている。
だが、本質的にはどんな記号でもよいので、今回は🍣で有意性を表現してみる。

## texregパッケージ

今回はRの`texreg`パッケージを使用する。
`lm`などの回帰分析結果オブジェクトを引数に取り、LaTeXやhtml等の形式で分析結果を出力してくれる便利パッケージである。
`install.packages("texreg")`で難なくインストールできるはず。

## htmlregでの回帰分析表の出力

ナンセンスな分析だが、irisデータセットを用いて、`Petal.Length`を`Petal.Width`と`Sepal.Length`と`Sepal.Width`と`Species`で回帰した結果をhtml形式で出力する。
まずは普通にやってみる。

```R
library(texreg)
data("iris")
reg <- lm(data = iris,
          formula = Petal.Length ~ Petal.Width + Sepal.Length + Sepal.Width + Species)
htmlreg(l = reg,
        file = "reg_table.html")
```

`reg_table.html`にはこのように表示される。

![普通に回帰分析結果.PNG](https://qiita-image-store.s3.amazonaws.com/0/236071/ab0e7606-1cad-2cd7-2fdd-7b957f22e7df.png)


`star.symbol`オプションで有意水準を表す記号を変えられるので、
🍣のサロゲートペア文字列の10進表現である`&#127843`を指定してやれば、

```R
htmlreg(l = reg,
        file = "reg_table.html",
        star.symbol = "&#127843")
```

![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/236071/277d9c60-d0df-5d6d-5cfa-8be806048788.png)

🍣の花が咲く。

(texregやscreenregでのやり方はよくわかっていません)

## 参考

http://www.pandanoir.info/entry/2016/04/17/190000
ちょいメモ（個人メモ）

DBロードまではPythonを使わないほうが良いような予感がしてきた。
awk/sed/grepで対応したい。

項目抽出はこんな感じで狙い撃ちができる

~~~ bash
cat access.log | sed -E 's/^(.*) .* .* \[(.*)\] ".* (.*) .*" (.*) (.*) "(.*)" "(.*)"$/\1\t\2\t\3\t\4\t\5\t\6\t\7/g'
~~~

時間部分の編集をどうするかが課題。
時間編集はこれで行けそう

~~~ bash
cat access.log | sed -E 's/^(.*) .* .* \[(.*)\] ".* (.*) .*" (.*) (.*) "(.*)" "(.*)"$/\2/g'
↓
25/Jan/2018:13:22:24 +0900
awk '{print $1}' | awk -F':' '{print $1"/"$2":"$3":"$4}' | sed -e 's/Jan/01/g' | awk -F"/" '{print $3"/"$2"/"$1" "$4}'
↓
2018/01/25 17:38:01
~~~

とも思ったが特定の列のみにawk/sedを適用するとなると
コードを書かねばならぬ模様。であれば結局最初からPython使ってもいいんでは。。。の予感がしている。
【Drupal8】現在のURLパスを取得する

メモ：URLパスを取得する方法

```php:現在のURLパスを取得する
$request = \Drupal::request();
$request->getRequestUri（）;

or

\Drupal::request（）->getRequestUri（）;
```

他に`ホスト名`や`ポート`情報の取得などが可能です。

以下、提供されているメソッド一覧

```
    [0] => __construct
    [1] => initialize
    [2] => createFromGlobals
    [3] => create
    [4] => setFactory
    [5] => duplicate
    [6] => __clone
    [7] => __toString
    [8] => overrideGlobals
    [9] => setTrustedProxies
    [10] => getTrustedProxies
    [11] => setTrustedHosts
    [12] => getTrustedHosts
    [13] => setTrustedHeaderName
    [14] => getTrustedHeaderName
    [15] => normalizeQueryString
    [16] => enableHttpMethodParameterOverride
    [17] => getHttpMethodParameterOverride
    [18] => get
    [19] => getSession
    [20] => hasPreviousSession
    [21] => hasSession
    [22] => setSession
    [23] => getClientIps
    [24] => getClientIp
    [25] => getScriptName
    [26] => getPathInfo
    [27] => getBasePath
    [28] => getBaseUrl
    [29] => getScheme
    [30] => getPort
    [31] => getUser
    [32] => getPassword
    [33] => getUserInfo
    [34] => getHttpHost
    [35] => getRequestUri
    [36] => getSchemeAndHttpHost
    [37] => getUri
    [38] => getUriForPath
    [39] => getRelativeUriForPath
    [40] => getQueryString
    [41] => isSecure
    [42] => getHost
    [43] => setMethod
    [44] => getMethod
    [45] => getRealMethod
    [46] => getMimeType
    [47] => getFormat
    [48] => setFormat
    [49] => getRequestFormat
    [50] => setRequestFormat
    [51] => getContentType
    [52] => setDefaultLocale
    [53] => getDefaultLocale
    [54] => setLocale (link is external)
    [55] => getLocale
    [56] => isMethod
    [57] => isMethodSafe
    [58] => getContent
    [59] => getETags
    [60] => isNoCache
    [61] => getPreferredLanguage
    [62] => getLanguages
    [63] => getCharsets
    [64] => getEncodings
    [65] => getAcceptableContentTypes
    [66] => isXmlHttpRequest
```