OmniAICreator/Qiita-1.07M huggingface dataset:
sqliteのload_extensionsをPyramidで使う

SQLiteでは数学関数や統計関数などを使うには拡張ライブラリを使う必要があるがPyramidから使うにはちょっと工夫がいった。

# 拡張の導入
以下のURLから extension-functions.c をダウンロードする。
* https://www.sqlite.org/contrib
次に共有ライブラリの作成をする。

```
gcc -fPIC -shared /home/takaki/Desktop/extension-functions.c -o libsqlitefunctions.so
```

sqliteを起動して以下のようにできれば拡張ライブラリはOK。

```
$ sqlite3 
SQLite version 3.13.0 2016-05-18 10:57:30
Enter ".help" for usage hints.
Connected to a transient in-memory database.
Use ".open FILENAME" to reopen on a persistent database.
sqlite> select load_extension('./libsqlitefunctions.so');

sqlite> select sin(3.14/2);
0.999999682931835
sqlite> 
```

# Pyramidからの呼出
通常の雛形ファイルから以下のような変更をする。

```python:model/__init__.py
def get_session_factory(engine):
    @event.listens_for(engine, "connect")
    def connect(dbapi_connection, connection_rec):
        dbapi_connection.enable_load_extension(True)
        dbapi_connection.execute("SELECT load_extension('{0}');".format(FULL_PATH_OF_LIB))
    factory = sessionmaker()
    factory.configure(bind=engine)
    return factory
```

* http://abrightersun.de/blog/spatialite-and-sqlalchemy.html
* https://code.ffdn.org/FFDN/ffdn-db/src/master/ffdnispdb/__init__.py
"オブジェクト指向"と"良い会社"って似てると思いません?

# 想像してください
- あなたは会社で働くエンジニア
- 役員や営業、総務や開発などいろんな人が働いている会社で働いています

# 世界観を感じてください
- インタフェース: 人対人のコミュニケーション
- プロパティ: 仕事のメモとか道具
- インスタンスメソッド: 仕事道具を使う
- クラス名: その人の役職や業種
- インスタンス: *あなたと置き換えられる人材*

# イケてない会社だと
- ある人に仕事を依頼したくても、その人とのコミュニケーションには難がある
- 仕事の頼み方が雑で何度も質問する
- 仕事が全然終わらなくて苛々する
- 出来た仕事が想像してた内容と違ってた
- 仲介業者なのに、下請け先の不備をお客さんにそのままありのまま伝える
	- ex. あなたは家を建てたいと思い仲介業者に注文をしたら、「ネジが足りないから作れませんでした」という返答が返ってくる。

# イケてないコードに置き換えられる
- あるクラスに処理を委譲したくても、委譲するために渡すパラメータ等の用意がメッチャ大変
- 渡したパラメータに不備があってちょくちょく、呼び出し元に戻る
- あるサービスに仕事を依頼したが、レスポンスが遅くてボトルネックになってる
- 返ってきた値がTrueだったり、nilだったり[]だったりする
- 一番下のレイヤーの処理で落ちて、一気にControllerまで戻る

# イケている会社とは
- 失敗したら上司に報告し、改善方法を提示、新たにチャレンジ...
- 仕事の役割が明確かつ、インプットとアウトプットも明確だと、働きやすい
- 仕事の役割が明確なので、人材の置き換えが可能

# イケているコードとは
- エラーを吐いても、上のレイヤーにあるクラスに投げ、その後の処理を任せられる
- コードの役割が明確なので、自分の仕事の修正で他の仕事に影響が出ることが少ない
- 急な仕様変更があっても、そこだけコードを書けばいい。

# ちなみにベンチャー企業だと？
- 規模の小さいコードとして見てみると...
- 社長が買い出しに行く -> rootにあるクラスが何でもやってる
- 誰が何をやっているかわからん -> どこでなんの処理してるかわからん
- 規模が小さいコードなら、それでも対応できますね。

# お客さんとしても
- ミスの多い会社に仕事は任せられない -> バグの多いサービスは利用されない
- 時間がかかる会社に仕事は任せられない -> 処理の遅いプログラムは使われない

# 恐怖
- つまり、オブジェクト思考っぽくコードを書けない人がオブジェクト指向を勉強すると、仕事も効率的になるかもしれない
- 一番下のレイヤーにいる人は、往々にして仕事のしわ寄せが来る
	- 新入社員は、花見の準備をしたり、呑み会のセッティグをしたりする。
- なので、オブジェクト"思考"になることは大事ですね。
- "オブジェクト指向で学ぶ現代社会の縮図"

ありがとうございました。
BeagleBoneBlackで湿度センサー


今回使用する湿度センサーは **MCP9700** です。

MCP9700のピンを文字が見える部分を正面からみとき、左から0番、1番、2ばんとします。それぞれのピンの役割は以下のようになります。

 - 0番
  電源供給のためのピンです(VDD) 
  2.3V~5.5V
  

 - 1番
  観測データが送られてきます。こちらは温度の高さや低さを電圧の高さ・低さで示す。アナログ出力をおこなうピンです。
データシートをみるとMCP9700の出力は100mVから1.75Vのようですね。
 - 2番 
  最後はグランドです。
  

ラズベリーパイの場合アナログ入力ができるピンがないのでA/Dコンバータを使用しなければなりませんが、BeagleBoneBlackの場合アナログ入力を行えます。そのため、アナログ入力ができるピンを利用します。BeagleBOneBlackのアナログ入力の最大電圧は1.8Vなので余裕で使用できす。
下の表のように入力できるところがあります！

|Name|PIN|PIN|Name|
|:--|:--|:--|:--|
|GPIO|31|32|VDD-ADC|
|A-In4|33|34|A-GND|
|A-In6|35|36|A-In5|
|A-In2|37|38|A-In3|
|A-In0|39|40|A-In1|


##温度を求める

データシートを参考に温度を求めます。

Vout = 温度計数 * 周囲温度 + 0度の時の出力電圧
周囲温度 = (Vout - 0度の時の出力電圧) / 温度計数

Vout = 100mV ~ 1.75V
温度計数 = 10.0mV
0度の時 =  500mV

##PIN配置

|Name|PIN|
|:--|:--|
|VDD|P9_3|
|Vout|P9_40|
|GND|P9_34|

##コード

```
import Adafruit_BBIO.ADC as ADC

PIN = "P9_40"
ADC.setup()

value = ADC.read(PIN)
#value = value * 1.8 #1.8V
value = value * 1800 #1.8V = 1800mV
print(value, "mV")

temp = value - 500 # 500mV = 0 degree voltage
temp = temp / 10 #10mV = Temperature coefficient
tempC = round(temp, 2)
print(tempC, "degrees Celsius")


# translation to Fahrenheit temperature
tempF = (temp * 9 / 5) + 32
tempF = round(tempF, 2)
print(tempF, "degrees[Fahrenheit]")
```

 
##参考サイト

 - http://windvoice.hatenablog.jp/entry/2015/03/01/092225


#####データシート
 - http://akizukidenshi.com/download/mcp9700.pdf

#####ADCドキュメント

 - https://learn.adafruit.com/setting-up-io-python-library-on-beaglebone-black/adc
PhpStormライセンス更新方法（結構古いバージョンなんで再インストールして更新）

※結構古いバージョンからメジャーアップデートする場合

新しいPhpStormをダウンロードする
[Download PhpStormページ](https://www.jetbrains.com/phpstorm/download/index.html)

または

Homebrewで（phpstormのコマンドを探してから）インストール

  ```ターミナル
brew search phpstorm

brew install Caskroom/cask/phpstorm
  ```

↓
↓
↓
ダウンロードしたPhoStormを開く
![PhpStormアイコン](https://qiita-image-store.s3.amazonaws.com/0/40940/ea7642f1-b551-681d-5c50-715a71c0e778.png "PhpStormアイコン")

↓
↓
↓

利用規約画面や、最初に前の設定を読み込みますか？と聞かれる
↓
↓
↓

購入したPhpStormライセンスを入れる画面になる
![PhpStormライセンス入力](https://qiita-image-store.s3.amazonaws.com/0/40940/f361eba9-1437-0c0d-dde6-05ae0f6d546b.png "PhpStormライセンス入力")

↓
↓
↓

licenseを入れると、アカウントの仕組みが変わったから（？）か、
使用者の名前とメールアドレスを入れる欄が出る
↓
↓
↓

入力すると、新ライセンスコードがもらえる（キャプチャはコードは消してます）
![PhpStorm新ライセンスコード](https://qiita-image-store.s3.amazonaws.com/0/40940/656a556f-427c-8696-7003-f76b5712f822.png "PhpStorm新ライセンスコード")

↓
↓
↓

完了！立ち上がった！
![PhpStorm開始画面](https://qiita-image-store.s3.amazonaws.com/0/40940/f3cf2814-eb6c-3126-b7fb-0b41d05da3e4.png "PhpStorm開始画面")
redux-sagaの channel を使って同時実行数制御をする

# はじめに

[redux-sagaで非同期処理と戦う - API呼び出しのスロットリング](http://qiita.com/kuy/items/716affc808ebb3e1e8ac#api%E5%91%BC%E3%81%B3%E5%87%BA%E3%81%97%E3%81%AE%E3%82%B9%E3%83%AD%E3%83%83%E3%83%88%E3%83%AA%E3%83%B3%E3%82%B0)では同時実行数制御を`put`と`get`、二重ループで実装されていたが、redux-sagaの`channel`を利用することでも同様のことができたので紹介する。

# channelによる制御方法

実はズバリやりたいことが [redux-sagaのドキュメント - 3.11. Using Channels > Using channels to communicate between Sagas](http://yelouafi.github.io/redux-saga/docs/advanced/Channels.html) に書いてある。

やることは、

1. `channel` を生成する。生成した`channel`オブジェクトがキューになる。
2. 同時実行数の数だけタスクを`fork`しておく。この際、生成した`channel`オブジェクトをそのタスクに渡しておく。このタスクがワーカースレッドのように動作する。
3. タスクの処理では、引数で受け取った`channel`オブジェクトから`take`で待つ。`take`で取れたらやりたい処理(同時実行数制御をかけたい重い処理など)を実行し、終了後また`take`で待つ。
4. ワーカースレッドとは別に、処理の受付を`takeEvery`で行い、`put`で第一引数に先ほどの`channel`、第二引数に渡したい任意データを指定して実行する。そうすると、3の`take`の戻り値として任意データが渡されつつ、処理がワーカースレッドに引き継がれるイメージ。

コード例は下記のとおり。なお、[redux-sagaのドキュメントにあるコード例](http://yelouafi.github.io/redux-saga/docs/advanced/Channels.html)だと`takeEvery`の箇所は`while`で単純に`take`、`put`を繰り返しているだけだが、私の環境だと`take`の取りこぼしが発生するケースがあったため`takeEvery`に変えている(`takeEvery`だと今のところ取りこぼしはない)。

## コード例

```js
// 重い非同期処理のダミー実装
function heavyProcess() {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve(true);
    }, 2000);
  });
}

function* watchRequests() {
  // channelの生成
  const chan = yield call(channel);

  // 同時実行数分forkする (ワーカースレッドを立ち上げるイメージ)
  for (let i = 0; i < 3; i++) {
    yield fork(handleRequest, chan);
  }

  // forkしたスレッドに処理を委譲させるだけの処理をtakeEveryで実行させる
  // 'request'アクションが来たらワーカースレッドにディスパッチするだけの受付スレッドを作成するイメージ
  yield * takeEvery('request', function*(action) {
    yield put(chan, action);
  });
}

// ワーカースレッドの処理
function* handleRequest(chan) {
  while (true) {
    const action = yield take(chan);

    console.log('start: ', action.payload.id);
    yield call(heavyProcess);
    console.log('end: ', action.payload.id);
  }
}

function* saga() {
  yield fork(watchRequests);
}

const sagaMiddleware = createSagaMiddleware();
const store = Redux.createStore(
  () => {},
  Redux.applyMiddleware(sagaMiddleware)
)
sagaMiddleware.run(saga);

// 'request'アクションを大量に実行
for (let i = 0; i < 20; i++) {
  store.dispatch({
    type: 'request',
    payload: {
      id: i
    }
  });
}
```


## 実行例

例では同時実行数は3にしているので、3つずつ動作していることが分かる。

```bash
start:  0
start:  1
start:  2
end:  0
start:  3
end:  1
start:  4
end:  2
start:  5
end:  3
start:  6
end:  4
start:  7
end:  5
start:  8
...
```

なお、サンプルコードは [JSFiddle](http://jsfiddle.net/wadahiro/1x9tnhdb/) でChromeなら動かせます。
react-chartjsでChart.js v2のクリックイベントを扱う


# 背景
1. [react-chartjsの使い方](http://qiita.com/ledsun/items/2158eb46eec10283e4ab)で、react-chartjsとChart.js v1を組み合わせた時のクリックイベントの扱い方を書きました。
1. [Chart.js v2でのクリックイベントの扱い方](http://qiita.com/ledsun/items/c59546fa7e756e2d3bc0)でChart.js v2でクリックイベントの扱い方が変わったことを書きました。
1. [react-chartjsを使って積み上げグラフを描く](http://qiita.com/ledsun/items/05d6d2725864488029bb)で、recat-chartjsでChart.js v2を使う方法を書きました。

# 要約
全部まとめて、react-chartjsでChart.js v2のクリックイベントを扱う方法です。

# サンプルコード
## index.jsx

```index.jsx
const React = require('react')
const ReactDOM = require('react-dom')
const {Bar} = require("react-chartjs")

const chartData = {
  "labels": [
    "January",
    "February",
    "March",
    "April",
    "May",
    "June",
    "July"
  ],
  "datasets": [
    {
      "label": "Dataset 1",
      "backgroundColor": "rgba(220,220,220,0.5)",
      "data": [
        3,
        -27,
        -46,
        56,
        -87,
        -82,
        86
      ]
    }, {
      "label": "Dataset 2",
      "backgroundColor": "rgba(151,187,205,0.5)",
      "data": [
        -88,
        -78,
        74,
        -32,
        35,
        29,
        62
      ]
    }
  ]
}

const App = React.createClass({
  handleClick(e) {
    const chart = this.Bar.getChart()
    console.log(chart.getElementsAtEvent(e))
  },
  render() {
    return <Bar data={chartData} onClick={this.handleClick} ref={(ref) => this.Bar = ref}/>
  }
})

ReactDOM.render(
  <App/>, document.querySelector('#container'))
```

## v2での変更点

### v1では

```js
this.Line.getPointsAtEvent(e)
```

のようにChartコンポーネントのメソッドとして`getPointsAtEvent`や`getBarsAtEvent`メソッドを呼べました。

### v2では


```js
const chart = this.Bar.getChart()
chart.getElementsAtEvent(e)
```

v2向けの`react-chartjs`には同様のメソッドはありません。
一度`getChart`メソッドでChart.jsのオブジェクトを取得し


のように、`getElementsAtEvent`メソッドを使って値を取得します。
取得した値はChart.jsのオブジェクトです。
[Chart.js v2でのクリックイベントの扱い方](http://qiita.com/ledsun/items/c59546fa7e756e2d3bc0)を参考にしてください。

# 動かすには

## index.html
```html:index.html
<!DOCTYPE html>
<html>
  <body>
    <div id="container">
    </div>
    <script src="bundle.js"></script>
  </body>
</html>
```

## ビルド
babelの設定ファイルを作ります。

```js:.babelrc
{
  "plugins": ["transform-react-jsx"]
}
```

browserifyでビルドします。

```
npm init -y
npm i -D browserify babelify babel-plugin-transform-react-jsx react react-dom chart.js
npm i -D react-chartjs@git://github.com/reactjs/react-chartjs.git#chartjs-v2
node_modules/browserify/bin/cmd.js -t babelify index.jsx -o bundle.js
```

react-chartjsのインストール時にgitのブランチを指定します。

# 今後の動向

v2向けのreact-chartjsは開発中です。
今後、Recatコンポーネントに`getElementAtEvent`、`getElementsAtEvent`メソッドが生えるかもしれません。

[Issue](https://github.com/jhudson8/react-chartjs/issues/120)を作りました。
このIssueを追えば今後の動向がわかることを期待しています。
【WordPress】記事の自動保存、リビジョン機能をオフにして、ついでに古いリビジョンを削除

#【WordPress】記事の自動保存、リビジョン機能を止めて、ついでに古いリビジョンを削除

***Wordpressのパフォーマンス向上。上記を実現するのに便利なプラグインが出ているが、Wordpress内部で実際どのような設定を持っているのか調べるため、手動で行うことにした。
ちなみに、便利なプラグインは以下。
[Revision Control](https://ja.wordpress.org/plugins/revision-control/)***

・自動保存機能をオフにする。
テーマのfunction.phpに、以下を記述

```lang:function.php
<?php

〜〜省略〜〜

function autosave_off() {
	wp_deregister_script('autosave');
}
add_action( 'wp_print_scripts', 'autosave_off' );
```
これで自動保存機能がオフになります。
勝手に保存処理が動くことも無くなるので記事入力中動作が軽くなるかと思います。

・リビジョンをオフにする。
wp-config.phpの、
require_once(ABSPATH . 'wp-settings.php');
の前に以下を記述。
後に記述するとエラーが起きます！

```lang:wp-config.php
define('WP_POST_REVISIONS', false );

/** Sets up WordPress vars and included files. */
require_once(ABSPATH . 'wp-settings.php');
```

これでリビジョン機能がオフになります。

・DBに溜まった不要なリビジョンを削除する。

まず、何か起きても大丈夫なようにDBのバックアップを取っておく。

リビジョンデータは直接SQLを叩いてdeleteします。
プラグインを使ってMySqlに接続してもいいですし、コンソールからMySqlに接続してもOK。
SQLはこんな感じ。

```
DELETE FROM wp_posts WHERE post_status = 'inherit' AND post_type = 'revision';
```
これで溜まっていたリビジョンが消えてDBも軽くなったはずです。
[Oracle database 12c]　ネットワークサービス名の登録、だいたいリスナの登録

## Oracle ネットワークの構成による他のデータベースへの接続

### tnsname.oraの編集

|設定項目|設定値|
|:---|:---|
|ネットワークサービス名|TEST_NET|
|プロトコル|TCP|
|ホスト名|node2.oracle12c.jp|
|ポート番号|1521|
|サービス名|orcl|

```
$ vi $ORACLE_HOME/network/admin/tnsnames.ora
```

```
# $ORACLE_HOME/network/admin/tnsnames.ora
TEST_NET =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = node2.oracle12c.jp)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = orcl)
    )
  )
```

### ネットワーク構成変更のテスト

```
$ sqlplus system/oracle_4U@test_net
SQL> SELECT instance_name,host_name FROM v$instance;

INSTANCE_NAME HOST_NAME
------------- ---------
orcl          node2.oracle12c.jp

```

## 代替リスナの作成

### 新しいリスナーの登録
- 1561番ポートを使用するリスナを作成する

```
$ vim $ORACLE_HOME/network/admin/listener.ora
```

```
# $ORACLE_HOME/network/admin/listener.ora
LISTENER2 =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = node2.oracle12c.jp)(PORT = 1561))
  )

ADR_BASE_LISTENER2 = /u01/app/oracle
```

### リスナーのサービス名の登録
- デフォルトリスナーと新たに追加されたリスナー両方にサービス名を登録する

```
$ vim $ORACLE_HOME/network/admin/tnsnames.ora
```

```
# $ORACLE_HOME/network/admin/tnsnames.ora
LISTENER2 =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = locahost)(PORT = 1561))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = orcl)
    )
  )

LISTENER1 =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = orcl)
    )
  )

```

### リスナーの起動

```
$ lsnrctl start listener2
```

### リスナーをデータベースに認識させる
- ORACLE_SIDが対象のデーターベース名になるようにする

```
$ sqlplus / as sysdba
SQL> show parameter local_listener
SQL> sho parameter local_listener

NAME           TYPE   VALUE
----           ----   -----
local_listener string LISTENER1

SQL> ALTER SYSTEM SET local_listener=LISTENER,LISTENER2 SCOPE=BOTH;
SQL> sho parameter local_listener

NAME           TYPE   VALUE
----           ----   -----
local_listener string LISTENER1,LISTENER2

```

### リスナーのステータス確認

```
$ lsnrctl status LISTENER2
```
Bluemix上のNode-redでLine botのValidationを行うTips

#前提：
Bluemixアカウント持っている事
Juzzhubとつなげている事↓
https://www.ibm.com/developerworks/jp/cloud/library/cl-poseidon2-app/
LINE Botを作っていること
Node-redが使用可能な事


#中身

###設定ファイル修正
（設定ファイル修正は、JuzzHubでやればブラウザオンリーでカンタンですよ。）

```js:bluemix-settings.js
    functionGlobalContext: {
		crypto: require( "crypto" ) 
		process: process
    },
```

http://stackoverflow.com/questions/37121402/how-to-get-user-defined-variables-in-node-red-app-in-bluemix
http://qiita.com/joeartsea/items/b5e8e14498f3098990c3
によると、bluemix-settings.jsのGlobalcontextに入れたものにアクセスするには、context.globalの下みれば良い。
HMACを使うためには、cryptoが必要です。
かつ、X-Line-Channel-Secretをソースコードにベタ書きするのが嫌なので環境変数に入れて使いたいので、processが必要です。（ここはベタ書き派な人は不要）


###環境変数の追加
ダッシュボードの環境変数画面で以下をそれぞれ追加。値はLINEから貰った内容を入れましょう。-（ハイフン）が入ると呼び出すときになんかダメだったのでハイフン抜きにしました。（まだこの辺は不慣れです）

```
XLineChannelID
XLineChannelSecret
XLineTrustedUserWithACL
```


###Function Node作成
http://dev.classmethod.jp/cloud/build-line-bot-api-using-lambda/
↑これ神！`msg.payload`をそのまま`hmac.update`しようとしても結果が全然ちがった。多分データ取り出すときの微妙な話だろうと思って散々調べて、このサイトみて同じようにやったら動いた。ここでかなりハマった。

結果的に、以下の様なFunctionNodeを追加して`msg.validation`に入れた値と`msg.req.headers.x-line-channelsignature`の値をSwitchNodeとかで比較したらValidation出来ます。

```js
const hmac = context.global.crypto.createHmac( 'sha256' , context.global.process.env.XLineChannelSecret );
hmac.update( Buffer(JSON.stringify(msg.payload), 'utf8') );
var calcResult = hmac.digest('base64');

msg.validation = calcResult;
```

以上です。


再現用のJSONを貼っておきます。

```
[{"id":"abedd440.742ec","type":"http in","z":"7e7669e.258d498","name":"Callback","url":"/callback","method":"post","swaggerDoc":"","x":75,"y":112,"wires":[["943f3bcb.08ff6","67c4fc9.4bf7704"]]},{"id":"943f3bcb.08ff6","type":"debug","z":"7e7669e.258d498","name":"","active":true,"console":"false","complete":"req.headers.x-line-channelsignature","x":389,"y":165,"wires":[]},{"id":"67c4fc9.4bf7704","type":"function","z":"7e7669e.258d498","name":"validation","func":"const hmac = context.global.crypto.createHmac( 'sha256' , context.global.process.env.XLineChannelSecret );\nhmac.update( Buffer(JSON.stringify(msg.payload), 'utf8') );\nvar calcResult = hmac.digest('base64');\n\nmsg.validation = calcResult;\n\nreturn msg;","outputs":1,"noerr":0,"x":260,"y":240,"wires":[["9175c10b.130798"]]},{"id":"9175c10b.130798","type":"switch","z":"7e7669e.258d498","name":"validation switch","property":"validation","propertyType":"msg","rules":[{"t":"eq","v":"req.headers.x-line-channelsignature","vt":"msg"}],"checkall":"true","outputs":1,"x":420,"y":240,"wires":[["a532532b.79b0e"]]},{"id":"a532532b.79b0e","type":"debug","z":"7e7669e.258d498","name":"","active":true,"console":"false","complete":"validation","x":612,"y":245,"wires":[]}]
```

##その他

http://qiita.com/yoichiro6642/items/6d4c7309210af20a5c8f
こちらに書いてある、まずQueueに入れるってのも（パフォーマンス検証したわけじゃないですが）結構カンタンに実装出来たので別途記事を上げます。
Windowsでgit cloneすると変更していないのに差分が出る

# 結論から言うと、改行コードがCRLFに自動変換されていた

## 2箇所変える必要があった

### git configを書き換える

```bash
git config --global core.autoCRLF false
```

### あればですが、.gitattrivbutesを書き換える。（PHPのLaravelの雛形にはデフォルトで置いてあります。。。）

```bash:.gitattributes
* text=auto
```

↑この行を消した。

[gitattributesの公式ドキュメント](http://git-scm.com/docs/gitattributes)

## 感想

そうか、２段トラップだったのか。。。

cloneした時点で差分出るんだから、Gitが
犯人なのは明白だったはずなのに、
「Gitは悪く無い・味方のはずだ！！」という先入観から、
真犯人の特定に時間が掛かったパティーン。
GitBookのPDF出力で日本語フォントをIPAGothicにする

※GitBook 3.1.1 時点のものです


GitBook https://www.gitbook.com/
はmarkdownで書いてcommitしたドキュメントをいい感じにWeb,PDF,ePubで出力してくれる。
しかし最近のGitBookのバージョン (3.0以降という話も? → https://github.com/azu/JavaScript-Plugin-Architecture/issues/106 ) では、PDFで出力したときに、日本語部分のほとんどの文字が中国語用のフォントになってしまう。

出力されたPDFを見ると `IPAGothic` は含まれているようなので、これをデフォルトフォントとして指定すると、この問題は回避できる。

Bookの `/book.json` (編集画面の `Edit Book Configuration` から飛べる) に下記の設定を追加してビルドを待つ。

```json
{
  "pdf": {
    "fontFamily": "IPAGothic"
  }
}
```

他の設定項目: https://github.com/GitbookIO/gitbook/blob/master/docs/config.md


ちなみに、PDFの埋め込みフォントは `% strings [pdfファイル] | grep -i FontName` または Adobe Reader で開いて `Properties` で表示できる。
devise_token_authにパッチを当てた話

# 概要

Railsアプリをサブディレクトリで動かすと`devise_token_auth`がうまく動作しなくなったのでパッチを当てた。

# パッチの場所

https://github.com/yebisu14/devise_token_auth

# 詳細

## 動機

Railsアプリ（JSONAPIオンリー）をnginxのリバースプロキシの背後で動かそうとすると、グーグルでのログインができなくなった。

## 環境

使用しているgem（関係がありそうなもののみ抜粋）：

+ rails (4.2.6)
+ devise (4.1.1)
+ omniauth-google-oauth2 (0.4.1)
+ devise_token_auth (0.1.37)

いずれも設定はほとんど初期値のまま。

## 原因

調査の結果、Railsアプリをサブディレクトリで動かしており、そのサブディレクトリの部分が`devise_token_auth`が生成するリダイレクト先URLに含まれていないことが原因だと判明。
Railsにはサブディレクトリで動作させるためのオプションがあるのだが、`devise_token_auth`のリダイレクトの書き方が絶対パスっぽい書き方になっており、サブディレクトリ部分を無視するようになっていた。
さらに、グーグルからリダイレクトされたあとの処理でも`request.host_with_port`などを使ってURLを生成しており、そこでもサブディレクトリ部分が無視されていた。

## 解決策

オプションではどうにもならなかったのでパッチを当てた。
パッチの内容は[該当コミット](https://github.com/yebisu14/devise_token_auth/commit/a703e96afe942d564de62035f960c99e7ff993fb)を参照。

## 参考資料

http://qiita.com/61503891/items/732d9c123c39e35e97eb
http://guides.rubyonrails.org/configuring.html#deploy-to-a-subdirectory-relative-url-root
Linux 上でファイル中の文字列一括置換 (sed)

試した中で、これが一番上手く行った(バックアップファイルも作られないし綺麗)ので、メモ。

ディレクトリがあっても、再帰的に処理される。

```sh
find . -type f -exec sed -i 's/foo/bar/g' {} +
```

以下のStack Exchange回答から引用した。
http://unix.stackexchange.com/questions/112023/how-can-i-replace-a-string-in-a-files?answertab=votes#tab-top
Swift Internal Introduces サポートページ

技術書典でSwiftの電子書籍をリリースする予定です。
質疑応答等あれば、こちらのコメント欄から質問頂ければ。
大きなトピック等であれば独立した記事にして回答したいと思います。

目次:

    はじめに
        ライセンス
        前提条件
        本書の構成
        用語
        お断り
    Swiftのソースコードと構成
        Swiftのビルドと環境構築
        Swiftのプロジェクトの構成
        Swiftのソースコードの構成
    Swift Overview
        Swiftとは
        SwiftとLLVM
        SwiftとClang
        swiftcのコンパイラアーキテクチャ
        swiftcの中間成果物を確認するためのコマンドラインオプション
        swiftcをコントロールするオプション
    Swift Frontend
        Frontendの主制御
        Parsingの概要
        token一覧
        SIL(Swift Intermediate Language)
        SIL変換後の最適化
        Coreライブラリのattributeと最適化
    Swift Backend
        Backendの主制御
        Swift固有のLLVMによる最適化
        LLVM IRをオブジェクトに埋め込むembed-bitcode機能
        embed-bitcodeとLTO
    Swift Runtime
        SwiftのRuntimeライブラリ
        SymbolからRuntimeFunctionのソースコードを探す
        RuntimeFunctionの機能分類と代表的なもの
        リソース管理
        参照カウント/Ownership
        COWの実装
        実行時型情報
        SwiftのABIと後方互換性
    Swift OptimizationTips
        最適化オプション
        Reducing Dynamic Dispatch
        Generics
        Protocol
        Protocol Extension
        注意事項
    おわりに
        あとがき
        著者
        参考文献とか
        変更履歴
Jenkins 2.0 アップデート(ubuntu)

パイプラインってすごいらしい！
使うぜ2.0

Jenkins2.0はJenkins 1.x系との完全な互換らしいので、2.0にアップデート。

## 構成
OS : ubuntu14.04
Jenkins : 1.651.3


## まずはJenkinsを停止

```
$ sudo service jenkins stop
```

## warの置き換え

warの場所は、設定ファイルに書いてあります

```
$ vim /etc/default/jenkins
```

```
20 # location of the jenkins war file
21 JENKINS_WAR=/usr/share/$NAME/$NAME.war
22 
```

## warのbackup & 取得

```
$ cd /usr/share/jenkins/
$ jenkins.war jenkins.war.old
$ sudo wget http://mirrors.jenkins-ci.org/war/latest/jenkins.war
```

## jenkins 起動

```
$ sudo service jenkins start
 * Starting Jenkins Continuous Integration Server jenkins                                                                      [ OK ] 
$ 
```


## アクセス
アクセスして終了  
以外と簡単w

パイプライン使うぞぉおおおおお
[baserCMS] フロント認証

# フロント認証

baserCMSでは、フロントサイドの認証機能のAPIを提供しており、比較的簡単に、ログイン認証が必要なコンテンツの作成が行えます。
今回は、フロントサイド全てのコンテンツに認証をかける前提にて開発例をご紹介します。

## ログインページの準備とログイングループ、ユーザーの追加
### 基本設定
フロント認証の基本設定は、baserCMSが提供する設定ファイルで行います。 
```/app/Config/setting.php``` に次のコードを記述します。

<pre><code class= "php">
<?php
$config['BcAuthPrefix'] = array(
    'front' => array(
        // 認証名
        'name'            => 'フロント',    
        // ログイン完了後にリダイレクトするURL
        'loginRedirect'    => '/',
        // ユーザー管理に利用するモデル
        'userModel'        => 'User',
        // ログイン画面のURL
        'loginAction'    => '/users/login',
        // ログアウトを実行するURL
        'logoutAction'    => '/users/logout',
        // ツールバーの利用可否
        'toolbar'        => true,
        // セッションキー（デフォルトは管理システムと同じキー）
        // セッションキーは任意の文字列を利用してください。利用するサイト名やプロジェクト名が良いのではないかと思います。
        'sessionKey'    => 'ProjectName'
    )
);
</pre></code>

このコードは、```/lib/Baser/Config/setting.php``` に記載されており、そのファイルに記載されている設定は、全て、 ```/app/Config/setting.php``` で上書き可能です。


### 認証グループ設定
次に管理システムにログインし、フロントサイドにログインする事ができるユーザーグループを作成します。
基本設定を行った事で、ユーザーグループの追加画面に、「認証プレフィックス設定」という項目が表示されていますので、「フロント」にチェックを入れて保存します。
　
### ユーザー追加
認証グループ設定で追加したユーザーグループに所属するユーザーを作成します。
　
### ログインページの確認
http://[baserCMSの設置場所]/users/login にアクセスし、ログインページが表示され、先ほど追加したユーザーでログインができる事を確認します。
　

## 認証チェックとリジェクト処理
これまでの作業でログインページの準備とログイン処理は実装が完了しましたが、フロントサイドにおいて認証をかけているわけでないので、ログインせずともフロントサイドにアクセスできてしまいます。

次に、 ```AppController``` を利用して、認証チェックと非認証時のリジェクト処理を記述します。
今回は、```AppController::beforeFilter()``` において、認証が完了しているかをチェックし、完了していない場合は、ログインページにリダイレクトする前提として次のようなコードを ```/app/Controller/AppController.php``` に記述します。

<pre><code class= "php">
<?php
App::uses('BcAppController', 'Controller');
class AppController extends BcAppController {
    public function beforeFilter() {
        parent::beforeFilter();
        if(BcUtil::isAdminSystem()) {
            return;
        }
        // フィードの場合はスルー（管理画面のダッシュボードで読み込まれているため）
        if(preg_match('/^feed\//', $this->request->url)) {
            return;
        }
        // 認証クラスがない場合はスルー
        if(!isset($this->BcAuth)) {
            return;
        }
        // ログイン画面の場合はスルー
        if(('/' . $this->request->url) == $this->BcAuth->loginAction) {
            return;
        }
        // パスワードリセット画面の場合はスルー
        if(($this->request->url) == 'users/reset_password') {
            return;
        }
        // リクエストアクションの場合はスルー
        if($this->request->is('requested')) {
            return;
        }
        // 認証されていない場合はログイン画面にリダイレクト
        if(!$this->BcAuth->user()) {
            $this->redirect($this->BcAuth->loginAction);
        }
    }
}
</pre></code>
これで、フロントサイドにアクセスした際、ログインが完了していないとログインページにリダイレクトする仕組みが出来上がりました。
コンテンツ毎に、認証をかけたいような場合には、 ```$this->request->url``` に現在のURL情報が入ってきますので、それを元に、振り分け処理を記述しましょう。
　
## キャッシュの設定
固定ページはビューキャッシュを利用する為、キャッシュのチェックをオフにしないと、認証がかかっていてもキャッシュを利用して表示されてしまいます。キャッシュをオフにするには、 ```/app/Config/install.php``` にて、キャッシュをオフに設定します。

<pre><code class= "php">Configure::write('Cache.check', false);</pre></code>
[baserCMS][CakePHP] 固定ページへのメールフォーム埋め込み

## 固定ページへのメールフォーム埋め込み

CakePHPでは、Controller::requestAction() で、任意の場所からコントローラのアクションを呼び出し、アクションからのデータを返す事ができますが、メールフォームを呼び出した場合、SecurityComponent 用のセキュリティトークンがうまく生成されません。その場合、フォームを送信した際にシステムエラーとなってしまいます。

メールフォームを固定ページより呼び出すには、セキュリティトークンを正常に生成する為に Javascript で実装します。

```
（実装例）

<script>
     $(function(){
          $.get($("#BaseUrl").html() + '/contact/index', function(result){
               $("#MailForm").html(result);
          });
     });
</script>
<div id="BaseUrl" style="display: none"><?php echo $this->request->base ?></div>
<div id="MailForm"></div>
```
Python Django チュートリアルまとめ


勉強会用に作ったチュートリアル資料のまとめです．

# 本家
Django1.9のドキュメントが日本語化されているので，まずはそちらに目を通したほうがいいと思います．

- ドキュメントTOP
https://docs.djangoproject.com/ja/1.9/


# 書いたもの（チュートリアル関係）

## チートシート

http://qiita.com/maisuto/items/bcdb0fd6c63cf0c544d6

プログラムをする時に印刷して手元に置いとくためのpdfファイル

## エラーまとめ

https://qiita.com/maisuto/items/58225754fcac5911e7e2

## チュートリアルのチュートリアル
http://qiita.com/maisuto/items/d7e8cf0b5649f545ddb6

チュートリアルの使い方，進め方の説明などを書いてます．  
gitでソースを管理していますので，この記事に目を通しておけばチュートリアルを途中から実施できるはずです． ...たぶん

## Python Django チュートリアル(1)
http://qiita.com/maisuto/items/d01e2cca63c8e5b2c18c

空の状態からdjangoプロジェクトを作成していく方法を書いてます．
djangoではまずプロジェクトを作り，そこにアプリを追加していきます．
本家チュートリアルの投票アプリを用意し，データベースへテーブルを作成するところまで説明してます．

## Python Django チュートリアル(2)
http://qiita.com/maisuto/items/357d13027e4fe5e10618

django標準で用意されている管理サイトについて説明してます．
管理サイトのカスタマイズについても若干記述．

## Python Django チュートリアル(3)
http://qiita.com/maisuto/items/eece9d880d94fd241a0d

view, template, urlについての説明です．
MVCモデルでいう，VCの部分です．
（ただしV相当はdjangoでいうtemplate，C相当はdjangoでいうviewです）


## Python Django チュートリアル(4)
http://qiita.com/maisuto/items/fef306bafc57f218794d

投稿用フォームの用意（html）と，クラスベースビューの紹介をしています．

## Python Django チュートリアル(5)
http://qiita.com/maisuto/items/33dfeb58f5953d1c5fdf

チュートリアル4で行ったフォームをFormクラスを使うように書き換え，
view関数をクラスベースビューに置き換えています．

## Python Django チュートリアル(6)
http://qiita.com/maisuto/items/86add9263a641899b1e3

Bootstrapというデザインテンプレートを使い，デザインを綺麗にしています．

## Python Django チュートリアル(7)
http://qiita.com/maisuto/items/cce169a2455b116e2f82

testについての説明です．
[本家チュートリアルの5]の部分(https://docs.djangoproject.com/ja/1.9/intro/tutorial05/)です．

## Python Django チュートリアル(8)
http://qiita.com/maisuto/items/7aec76e6f6fb906bfffa

Modelについての補足説明と，拡張ライブラリの紹介，shellでの操作等を書いてます．

## Ubuntuサーバへのdjangoアプリdeploy方法
http://qiita.com/maisuto/items/e4e69e34fb00dac8170a

作ったアプリケーションのdeploy方法です．

---
# 書いたもの（チュートリアル SPA編）
しばらく放ったらかしにしてる間にDjangoのバージョンが2になったり，ウェブアプリの作り方がSPAが主流になりつつあるので，
Django2とvuejsを使用して新しく0から書き直しました．

## Python Django チュートリアル SPA編(1)
https://qiita.com/maisuto/items/4671ded9ec1ff329ca98

Django側の準備．
Modelのソースコードを本家チュートリアルからコピペして，DjangoRESTFrameworkでAPI化，っていうのをサクッとやってます．
書いてから思いましたが，データ(API)が必要になってから書き始めたほうがよかったですね...


## Python Django チュートリアル SPA編(2)
https://qiita.com/maisuto/items/2bf1b072f189a65d6f6e

Vueでの開発準備と，簡単な動作確認まで．
nodeやnpmのインストール方法についてはすっ飛ばしてます．

## Python Django チュートリアル SPA編(3)
https://qiita.com/maisuto/items/54ca10fce5f1d9b5ae7c

Vueの簡単な説明，Django側でAPIの調整，質問一覧の表示など．

## Python Django チュートリアル SPA編(4)
https://qiita.com/maisuto/items/9c44a914dae57bf187f9

投票用APIの追加，フロント側のAPIをプラグイン化．

## Python Django チュートリアル SPA編(5)
https://qiita.com/maisuto/items/41d30abe51f802e8dbf0

tokenの発行用APIとログイン画面追加．

## Python Django チュートリアル SPA編(6)
https://qiita.com/maisuto/items/b867d0f1dce3ba9f2169

vuex使ったログイン情報の共有化，ログイン状態の復元．
Check! Azure DocumentDB REST API のユーザー取得で署名が一致しない場合の対処

こんにちは、オークファンの @dz_ こと大平かづみです。

Prologue - はじめに
====
[Azure DocumentDB](https://azure.microsoft.com/ja-jp/services/documentdb/ "DocumentDB—高い処理能力、世界規模の NoSQL | Microsoft Azure") は、ドキュメントの他に「ユーザー」も扱うことができます。

そこで PHP から REST API を使って利用したところ、 ユーザーの取得時に「MAC 署名が一致しない」というエラーが発生し、しばらく悩みました。

解決方法がわかったので、ご紹介します。


エラー内容
=========
今回、MAC署名が一致しないエラーが発生したのは、以下の `users` の **取得** するURIでした。

エラーを確認した URI
------------------

- `GET` [/dbs/{db-id}/users](https://msdn.microsoft.com/en-us/library/azure/mt489063.aspx "List Users - Documentation - Microsoft Azure DocumentDB")
- `GET` [/dbs/{db-id}/users/{user-name}](https://msdn.microsoft.com/en-us/library/azure/mt489068.aspx "Get a User - Documentation - Microsoft Azure DocumentDB")

エラーの内容
-----------
```json
{
  "code": "Unauthorized",
  "message": "Message: {\"Errors\":[\"The MAC signature found in the HTTP request is not the same as the computed signature. Server used following string to sign - 'get\\nusers\\xxxxxxx==\\nwed, 22 jun 2016 05:00:38 gmt\\n\\n'\"]}\r\nActivityId: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx, Request URI: /apps/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/services/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/partitions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/replicas/xxxxxxxxxxxxxxxxxxx"
}
```

ちなみに、取得は失敗するが、書込みは成功します。また、他の `dbs` `colls` `docs` の取得や書込みは、問題ありません。

原因
====
今回のエラーの原因は、使うキーの選択が誤っていました。

どういうことかといいますと、DocumentDB には、下図のようにマスターキーの他に、 *読み取り専用キー* があります。
![20160622_documentdb_001.png](https://qiita-image-store.s3.amazonaws.com/0/3812/cd056dc9-9383-dc3c-68d2-e952e887a84c.png)

私は読み取りの時にはこの *読み取り専用キー* を利用しています。

が、しかし！

ユーザーの取得については、読み取り専用キーではなく **マスターキー** を用いなければならないことがわかりました。

なお、キーの詳細に関しては、 [DocumentDB のデータへのアクセスをセキュリティで保護する方法](https://azure.microsoft.com/ja-jp/documentation/articles/documentdb-secure-access-to-data/ "DocumentDB のデータへのアクセスをセキュリティで保護する方法 | Microsoft Azure") をご参照ください。

対処
====
ということで、ユーザーの取得（一覧、単体）では、 **マスターキー** を使いましょう。

Epilogue - おわりに
====
調べていると、リソーストークンというものも便利そうです。適材適所で利用できるよう工夫してみます。
javascript の event.target の event が globalで見れるのはIE,Safari,ChromeでFirefoxは見れない。



IE11とChromeとSafariで以下のコードが動くので、Firefoxでも動くと思っていたら、動かなかったので泣きました。
globalでeventが取れるのは、IEで実装されていたのをChromeやSafariが真似たものでW3Cの仕様ではないみたいです。（よくしらんけど）

```うごかない.html
// ... snip 
function blurDeUgoku (){
    var val = $(event.target).val();
    console.log(val);
}

$(".input-text").blur(function(){
    blurDeUgoku();
});

// ... snip 

<body>
<input type="text" class="input-text"/>

// ... snip 
```

```うごくよ.html
// ... snip 
function blurDeUgoku (event){
    var val = $(event.target).val();
    console.log(val);
}

$(".input-text").blur(function(event){
    blurDeUgoku(event);
});

// ... snip 
<body>
<input type="text" class="input-text"/>

// ... snip 
```

動くほうがは、eventを全部引数で渡しています。
こんな風にすると

```
if( !event ) event = window.event;
```

イベントが取れるよって書いてありましたが、Firefoxの34.0.5では動きませんでした。

参考にしたURL：
[ stackoverflow.com | event object not defined only with Firefox (IE and Chrome works) [duplicate]](
http://stackoverflow.com/questions/25775587/event-object-not-defined-only-with-firefox-ie-and-chrome-works)

[ stackoverflow.com | event.target not working on Firefox](
http://stackoverflow.com/questions/7457260/event-target-not-working-on-firefox)
食べ◯グなどのようにレビューの平均点を星型で出す方法


```Ruby:models/restaurant.rb

  has_many :reviews
  has_many :users, through: :reviews

  def average_rate
    average = self.users.pluck(:rate).sum / self.users.count
  end
end
```


```Ruby:views/
<% star = restaurant.reviews.average(:rate).to_i %>
<span class="star"><% star.times do %>★<% end %></span>
    <%= restaurant.reviews.average(:rate) %>点（<%= restaurant.reviews.count %>）
```
nginxでリバースプロキシを実装するときのserver_nameディレクティブのメモ

##メモ

- nginx.confのserverブロックでリクエストを振り分けるサーバを定義する
- 複数のサーバにリクエストを振り分ける場合にどのサーバに振り分けるかの要因に用いられる
- HTTPヘッダのHost値を見て判定される
- 下記の順番で採用される
- ワイルドカードや正規表現も使える
- どれにもマッチしなかったらdefault_serverが指定されているサーバが採用される。それも無かったら一番上のブロックが採用される（らしい。検証の結果）

```
1. exact name
2. longest wildcard name starting with an asterisk, e.g. “*.example.org”
3. longest wildcard name ending with an asterisk, e.g. “mail.*”
4. first matching regular expression (in order of appearance in a configuration file)
```

##検証

環境はその時の。

```nginx:nginx.conf
server {
         listen 8082;
         server_name www.hoge.click;
         location / {
                proxy_pass http://10.0.2.124/index.click;
         }
}

server {
         listen 8082;
         server_name www.hoge.de;
         location / {
               proxy_pass http://10.0.2.124/index.de;
       }
 }

server {
        listen 8082 default_server;
        server_name localhost;
        location / {
               proxy_pass http://10.0.2.124/index.html;
        }
}
```

- http://www3.hoge.click:80802/
    - index.clickが表示される
- http://www3.hoge.de:8082/
    - index.deが表示される
- http://x.x.x.x:8082/  (IPでの指定)
    - index.htmlが表示される

## 参考
Server names http://nginx.org/en/docs/http/server_names.html
「はじめてのSpring Boot」を最新版1.3.5で試す時の注意点

[はじめてのSpring Boot―「Spring Framework」で簡単Javaアプリ開発] (https://www.amazon.co.jp/dp/4777518655/ref=cm_sw_r_tw_dp_YX4AxbFVHMQZA) を1.3.5で試す時の個人的なメモです。

# Spring Security
バージョンが上がっているので、ThymeleafのSpring Securityプラグインもバージョンが上がっている。
参考：[Spring Boot 1.3 リリースノート和訳](http://blog.afnf.net/blog/77)

## 書籍に書かれている内容
※この記述のままでも、<version>要素が必須というエラーになる。

```xml
<dependency>
    <groupId>org.thymeleaf.extras</groupId>
    <artifactId>thymeleaf-extras-springsecurity3</artifactId>
</dependency>
```

## 以下に書き換える。
```xml
<dependency>
    <groupId>org.thymeleaf.extras</groupId>
    <artifactId>thymeleaf-extras-springsecurity4</artifactId>
</dependency>
```

書き換えないと、3.5章で書かれているログインユーザー名を出してみよう、のところで"dukeさんログイン中。"と出てしまう。
[Laravel5] キューされたジョブの実行完了のログ



初投稿です。

通常のLaravelのログファイルとは別に、キューされたジョブの実行完了時に
月単位でのログを取りたかったので、以下のようにしてみました。


```php:config/app.php
    'queue_logs' => [
        'dir_name'  => 'queue_logs', // ジョブ実行完了のログ出力ディレクトリ名
        'file_name' => 'queue-laravel',   // ジョブ実行完了のログ出力ファイル名
    ],
```



```app/Providers/AppServiceProvider.php
<?php
namespace App\Providers;
use Queue;
use Storage;
use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{

    /**
     * アプリケーションサービスの初期化処理
     *
     * @return void
     */
    public function boot ()
    {
        // ジョブ実行完了のログ
        Queue::after(function ($connection, $job, $data) {

            $command = unserialize($data['data']['command']);

            // ログを出力するディスク情報取得
            $disk = Storage::disk('logs');
            $dir_name = config('app.queue_logs.dir_name', 'queue_logs');
            $file_name = config('app.queue_logs.file_name', 'queue-laravel')."-".date('Y-m').".log";

            // ログ出力
            $message = "[".date('Y-m-d H:i:s')."] [".get_class($command)."] complete.";
            $disk->append($dir_name."/".$file_name, $message);

        });
    }
```



```storage/logs/queue_logs/queue-laravel-2016-06.log`
[2016-06-23 11:54:18] [App\Jobs\sendReminderEmail] complete.
```


> 参考
> [キュー 5.1 Laravel ジョブイベント](http://readouble.com/laravel/5/1/ja/queues.html#job-events)
検索結果をハイライト表示したい、なんてね。

## 簡単な検索機能の結果をハイライト表示したい。
そう、切に思った。梅雨時の午後。

やってみよう。

１.ハイライト用のプラグインをぶち込む。（jQuery入っていない場合はjQueryもぶち込んで。）

jquery-highlight-5　というプラグインを使うよ。

``` highlight.html
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="jquery-highlight-5s.js"></script>
```

2.CSSを準備
ハイライトされた時の見た目をCSSで書いておく。

``` highlight.css
.highlight{
  background-color:yellow #色は自由にお決めになって。
}
```

3.ハイライト！！

例えば、検索結果(``` class:result ```)の中から、検索したワード(```keyword```)をハイライトしたい時

``` highlight.html
#検索した文字列を取得
keyword = $(".keyword").val();

$(function{
  $(#result).highlight(keyword);
});
```

おまけ
ハイライトを除去！

``` highlight.html
$(function{
  $(#result).removeHighlight();
});
```
---

本家サイトはこちら
[highlight-5s](
http://johannburkard.de/blog/programming/javascript/highlight-javascript-text-higlighting-jquery-plugin.html)
Java で改行をまたいで正規表現を適用する


(?m) を付けるのがポイント。

```java
// expected
// <html><style>style1\nstyle2</style><body>body</body></html>
// <html><body>body</body></html>
String str = "<html><style>style1\nstyle2</style><body>body</body></html>";
String regex = "<style>(?m).+?</style>";
Pattern p = Pattern.compile(regex, Pattern.DOTALL);

Matcher m = p.matcher(str);
String result = m.replaceFirst("");
System.err.println(result); // <html><body>body</body></html>

```
[memo] AngularJs ngOptions プルダウンのリストで一部項目だけdisableにしたい

# こんな時に
- 時と場合で一部使えない項目と使える項目がある。
- バグではないという意味も込めて、リストから消したくない。
- 「こういう項目もある」という事を分からせることで、全体を理解させる。

# 書き方

## まずセレクト全体をdisableにする場合
```
<div ng-init="list=[
  {status: 1, text: 'Yes'},
  {status: 2, text: 'No'},
]"></div>

<select ng-model="input.status" ng-options="data.status as data.text for ( dataIndex, data ) in list" ng-disabled=" (ここに条件式) ">
  <option value="">---</option>
</select>
```
- <select>タグの中に `ng-disable=""` と条件式を記述するもしくは `disabled` と記述する。

## プルダウンの一部項目だけdisableにする場合
```
<div ng-init="list=[
  {status: 1, text: 'Yes'},
  {status: 2, text: 'No'},
]"></div>

<select ng-model="input.status" ng-options="data.status as data.text disable when (ここに条件式) for ( dataIndex, data ) in list">
  <option value="">---</option>
</select>
```

- ng-optionsの中に `disable when` を入れてそのあとに条件式を置くだけ
- 条件式は `()` で囲んで複数の条件も可能
【PHP】チェックボックスの値を受け取る

**2017年1月27日追記**
Googleのアクセス解析を見たら、僕が書いた記事の中で、意外にもこの記事が一番アクセス数が多いです。
全然「いいね」や「ストック」もされてませんが、この記事だけで月間2,000ページビュー以上あります。
おそらく、Qiitaユーザーでもない通りすがりの方が見てくれているのかと思います。
**今まで覚書のように要点のみ書いていましたが、アクセスする方も多いので、より詳説に書き直しました。**
**この記事を読んでもわからないことがあれば、コメントください。**

#**そもそもPOSTやGETって何？**

POSTやGETについて理解していない方は、下記が参考になります。

+ [【PHP超入門】HTTP（GET・POST）について](http://qiita.com/7968/items/4bf4d6f28284146c288f)

#**チェックボックスを配列にするには？**

HTML側で name を記述するときに `[]` を最後に付けると配列になります。
下記のように `food[]` のようにします。

```html:html
<h2>好きな食べものは？</h2>
<form method="post" action="">
	<input type="checkbox" name="food[]" value="寿司"> 寿司　
	<input type="checkbox" name="food[]" value="天ぷら"> 天ぷら　
	<input type="checkbox" name="food[]" value="芸者"> 芸者　
</form>
```

#**チェックボックスの値はどのように取得するの？**

`[]` を付けることで、PHP側で配列として受け取れます。
先ほどと同じように下記の HTML があったとします。

```html:html
<h2>好きな食べものは？</h2>
<form method="post" action="">
	<input type="checkbox" name="food[]" value="寿司"> 寿司　
	<input type="checkbox" name="food[]" value="天ぷら"> 天ぷら　
	<input type="checkbox" name="food[]" value="芸者"> 芸者　
</form>
```

`method` に `post` と記述しておりますので、postメソッドで送られてきます。
postメソッドについて理解していない方は、先ほどの [【PHP超入門】HTTP（GET・POST）について](http://qiita.com/7968/items/4bf4d6f28284146c288f) をご覧ください。
`$_POST['food']` にチェックボックスの値が配列として格納されています。
それを下記のように変数に代入するだけでチェックボックスの値を受け取れます。

```php:php
<?php
$food = $_POST['food'];
```

既に配列になっているので、変数に代入するときにfor文とか使う必要はありません。
試しに先ほどの変数 `$food` を `var_dump($food)` してみると下記のように配列になっているのが確認できます。

```php:php
array(3) {
  [0]=>
  string(6) "寿司"
  [1]=>
  string(9) "天ぷら"
  [2]=>
  string(6) "芸者"
}
```

ここではわかりやすくするために、`$_POST['food']` の値をそのまま `$food` という変数に代入しましたが、この方法はダメです。
なぜなら、GETやPOSTなどで送られくる値は、偽装可能なためです。
チェックボックスやプルダウンだと、こちらで用意した値した送られてこないと思いがちですが、GETやPOSTなどで送られくる値は、全て偽装可能なため信用できません。
先ほどの例で言うと、寿司、天ぷら、芸者 以外の値が送られてくることもあります。
そこら辺についても [【PHP超入門】HTTP（GET・POST）について](http://qiita.com/7968/items/4bf4d6f28284146c288f) で説明されているので、理解していない方はご覧ください。

#**じゃあどうやって確認するの？**

値のチェックの仕方は、 mpyw 氏の「
[$_GET, $_POSTなどを受け取る際の処理](http://qiita.com/mpyw/items/2f9955db1c02eeef43ea)」が詳説ですが、僕なりに説明してみます。

今回、配列として受け取ります。
受け取るときに未定義またはNULLではないか、また配列かどうかを確認します。
未定義またはNULLではないかを確認するには `isset()` 関数を使います。
配列かどうかは `is_array()` 関数を使います。
if文を使い、値を確認し、未定義でもNULLでもなく、配列だった場合に `$food = $_POST['food'];` として値を受け取ります。

```php:php
<?php
if (isset($_POST['food']) && is_array($_POST['food'])) {
    $food = $_POST['food'];
}
```

配列はアロー演算子 `=>` を使うので、少し難しいです。
配列を文字列にすることもできます。

#**どうやって文字列にするの？**

`implode`関数使えば、配列を文字列にしてくれます。
受け取るときに`implode`関数を使いましょう。

```php:php
<?php
if (isset($_POST['food']) && is_array($_POST['food'])) {
    $food = implode("、", $_POST["food"]);
}
```

これで `、` で区切った文字列として受け取れます。
全てにチェックがあった場合は `寿司、天ぷら、芸者` という文字列として受け取ります。

# **一番伝えたいこと**

この記事を見てる方は、メールフォームや掲示板などのWebアプリケーションを作りたいと考えている初学者の方かと思います。
Webアプリケーションを作るのにセキュリティ対策が欠かせません。
先ほど紹介した下記は必ず見るようにしてください。

+ [【PHP超入門】HTTP（GET・POST）について](http://qiita.com/7968/items/4bf4d6f28284146c288f)
+ [$_GET, $_POSTなどを受け取る際の処理](http://qiita.com/mpyw/items/2f9955db1c02eeef43ea)

セキュリティに関して体系的に学びたいなら、下記の書籍がお勧めです。

* [体系的に学ぶ 安全なWebアプリケーションの作り方 第2版](https://amzn.to/2PXUjDV)

セキュリティ対策について、必ず学ぶようにしてください。
[jQuery] フォームのリセットボタンを設置する

DBの値をWebフォームで編集させる際、jQueryで変更取消ボタンを設置したのでメモ

ラジオボタンとチェックボックスの周りでちょい苦戦した。
ページロードした後に以下で値のバックアップを取る。

```javascript:
$("select, textarea, input").each(function() { 
	if(this.type === 'radio' || this.type === 'checkbox') { // radio ボタン, checkbox用
		this._unchangeVal = $(this).attr("checked");
	} else {
		this._unchangeVal =  $(this).val();
	}
});
```

`this.hoge` で各domオブジェクト？ごとに値を保持しておくのがミソ。 
ラジオボタンとチェックボックスでは各ボタン/ボックスごとの値保持しておいて、リセット時にそれぞれ保持しておいた値に戻してあげればいい。

`attr` 使ってるのはjQueryの古い環境だったから。最近のバージョンなら`prop`使うべきかも。
リセットボタンのイベント中の処理は以下で。

```javascript:
$("select, textarea, input").each(function() { 
	if(this.type === 'radio' || this.type === 'checkbox') { // radio, checkbox 用
		$(this).attr("checked", this._unchangeVal);
	} else {
		$(this).val(this._unchangeVal);
	}
});
```

いじょー。
CloudStack (IDCFクラウド) で cloud-init を使う


# 概要

CloudStack で cloud-init を使用する際の構築手順とメモ。

IDCFクラウド標準？（おすすめテンプレート）の CentOS 7.2 では cloud-init インストールしただけでは、正常動作しなかった※ので構築手順を記録しておく。

※cloud-init から META DATA サーバにアクセスできないエラーが発生

**原因**
CloudStack では VR が dpcp, META DATA サーバの役割も持っており、cloud-init が user_data を取得する際に、`/var/lib/dhclient/dhclient-eth0.leases` ファイルから META DATA サーバのアドレスを取得している。

IDCFクラウド標準の CentOS 7.2 テンプレートでは、NetworkManager が有効になっており、NetworkManager でセットアップされた場合上記ファイルが作成されないため、cloud-init が META DATA サーバの情報取得出来ずにエラーが発生していた。

# 環境
 - CloudStack 4.3.0.3 (IDCFクラウド)
 - CentOS 7.2 64-bit

# インストール手順

**cloud-init インストール**

```
# yum install cloud-init
```

**cloud-init datasource 設定**
以下のファイルを新規作成

```:/etc/cloud/cloud.cfg.d/99_cloudstack.cfg
datasource:
  CloudStack: {}
  None: {}
datasource_list:
  - CloudStack
```

**cloud-init 有効化**

```
# systemctl enable cloud-config
# systemctl enable cloud-init
# systemctl enable cloud-final
```

# Interface 設定

**IF 名の変更**
GRUB_CMDLINE_LINUX のオプションに net.ifnames=0 を追記

```:/etc/default/grub
GRUB_CMDLINE_LINUX="rd.lvm.lv=centos/swap vconsole.font=latarcyrhebsun16 vconsole.keymap=jp106 rd.lvm.lv=centos/root crashkernel=auto net.ifnames=0 rhgb quiet"
```

**grub へ反映**

```
# grub2-mkconfig -o /boot/grub2/grub.cfg 
```

**IF 設定**
以下ファイルを新規作成

```:/etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE="eth0"
BOOTPROTO="dhcp"
IPV6INIT="yes"
MTU="1500"
NM_CONTROLLED="no"
ONBOOT="yes"
TYPE="Ethernet"
```

**NetworkManager 削除**

```
# yum -y remove NetworkManager
```

**network service 有効化**

```
# chkconfig network on
```

**再起動**

```
# reboot
```

以上


# IDCF コミュニティテンプレート

毎回やるのは面倒なのでテンプレート化 + 公開してみた
![01.png](https://qiita-image-store.s3.amazonaws.com/0/105824/714fcff6-130b-eb31-81b5-46ec8876419a.png)


- テンプレート名： CentOS 7.2 64bit with cloud-init

**使用上の注意点**
以下の制約があり、user_data へ引き渡すデータサイズは固定になるため、特定の環境下でしか使えない。
(ホスト名とか文字数が変わる環境下では、毎回改行の追加・削除等でバイト数を調整する必要がある。)

> **Base64エンコード前のデータのバイト数が3の倍数ではない場合、正常に認識できない**

[IDCFクラウド公式ブログ記事](http://blog.idcf.jp/entry/cloud/coreos/) より。

ちなみに terraform でインスタンス作成しようとしたときは以下のエラーとなる。

```
Error applying plan:

1 error(s) occurred:

* cloudstack_instance.default: Error creating the new instance test-01: CloudStack API error 400 (CSExceptionErrorCode: 9999): deployVirtualMachine accepts only userdata which size is multiples of 3 bytes before base64 encoding.
```

user_data を Base64エンコードした際のパディング（ ケツに `=` が含まれるとダメ）が影響していると思われるが、正直使い物にならないのでなんとかして欲しい。


```:OKパターン
$ base64 default.yml | tr -d "\n" ;echo ""
I2Nsb3VkLWNvbmZpZwoKd3JpdGVfZmlsZXM6CiAgLSBwYXRoOiAvZXRjL3N5c2NvbmZpZy9tYWNrZXJlbC1hZ2VudAogICAgY29udGVudDogfAogICAgICBPVEhFUl9PUFRTPSItcm9sZT1zaG93cm9vbToke3NoYXJkfSIKICAgICAgQVVUT19SRVRJUkVNRU5UPTEKCgpydW5jbWQ6CiAgLSBzZXJ2aWNlIG1hY2tlcmVsLWFnZW50IHJlc3RhcnQK
```

```:NGパターン
$ base64 cloud-config.yml | tr -d "\n" ;echo ""
I2Nsb3VkLWNvbmZpZwoKd3JpdGVfZmlsZXM6CiAgLSBwYXRoOiAvZXRjL3N5c2NvbmZpZy9tYWNrZXJlbC1hZ2VudAogICAgY29udGVudDogfAogICAgICBPVEhFUl9PUFRTPSItcm9sZT1zaG93cm9vbToke3NoYXJkfSIKICAgICAgQVVUT19SRVRJUkVNRU5UPTEKCnJ1bmNtZDoKICAtIHNlcnZpY2UgbWFja2VyZWwtYWdlbnQgcmVzdGFydAo=
```
c++ builder XE4, 10.2 Tokyo > TTimer > 1秒ごとの処理 (等時性は悪い)

```txt:動作確認
C++ Builder XE4
RAD Studio 10.2 Tokyo Update 2 (追記: 2017/12/27)
```


条件

- 簡易実装としてTTimerを使う
- 秒の飛びを発生させないこと

TTimerのIntervalは500msecにする (1秒間に2回のトライ)。
Timer1Timerの処理で秒の値をチェックする以下のように実装する。

```Unit1.cpp
#include <DateUtils.hpp>

// 中略

void __fastcall TMainForm::Timer1Timer(TObject *Sender)
{
	static WORD preSec = 60;

	WORD curSec = SecondOf(Now());

	if (curSec == preSec) {
		return;
	}

	preSec = curSec;

	String msg = DateTimeToStr(Now());
	msg = msg + L"," + MilliSecondOf(Now());
	Memo1->Lines->Add(msg);
}
```

```txt:結果
2016/06/23 15:34:38,357
2016/06/23 15:34:39,373
2016/06/23 15:34:40,386
2016/06/23 15:34:41,401
2016/06/23 15:34:42,415
2016/06/23 15:34:43,427
2016/06/23 15:34:44,442
2016/06/23 15:34:45,455
2016/06/23 15:34:46,469
2016/06/23 15:34:47,483
2016/06/23 15:34:48,498
2016/06/23 15:34:49,5
2016/06/23 15:34:50,13
2016/06/23 15:34:51,26
2016/06/23 15:34:52,41
2016/06/23 15:34:53,62
2016/06/23 15:34:54,69
2016/06/23 15:34:55,85
2016/06/23 15:34:56,100
2016/06/23 15:34:57,109
2016/06/23 15:34:58,139
2016/06/23 15:34:59,153
```

右側のミリ秒の表示を見ると分かるように、かなり等時性の精度は悪い。ときどき500mse程度の間隔になる (15:34:49の処理)。

前回の処理から今回の処理を常に1000msec ± 100msecなどで実行したい場合は別の実装(TThreadを使うなど)が必要。

Timer1->Enable = falseしてからtrueにした時の整合性についてはきちんとはしていない (static宣言)。
メモ：Untracked working tree file '' would be overwritten by merge.

マージしたい

よくUntracked working tree file '' would be overwritten by merge.
というエラーが出る。

よく使う解決方法

git add * 
（それか　git add -f *）
git merge origin/master



「とりあえず作業状態を一時保存（マージコミット）してプッシュ
$ git add .
$ git commit
$ git push <リモート名> <マージ作業中のブランチ名>
H2O.ai 導入メモ

# 環境
OS X Yosemite

# Download手順
以下のページからダウンロードし、解凍するだけです。
https://h2o-release.s3.amazonaws.com/h2o/rel-tukey/2/index.html

ダウンロードした先のディレクトリに移動し、解凍します。

```cd ~/Downloads
unzip h2o-3.8.0.2.zip
cd h2o-3.8.0.2
```

# H2Oを立ち上げる
以下のコマンドでH2Oを起動します。javaを事前にインストールしておく必要があります。

```java -jar h2o.jar```

terminalを起動させたままにし、以下URLにアクセスしてください。
http://localhost:54321/

これでH2Oが立ち上がりました。
プログラミング初心者がWebサービスをリリースするにあたって

# はじめに
- 非エンジニアですが、Railsを用いてWebサービスをリリースすることができました
- その過程で思ったことを記載させていただきます
- Qiitaスライドモードがリリースされたのでここぞとばかりに使ってみました。
- こちらの資料は[Ruby / Rails ビギナーズ勉強会 第１４回 ](https://coedo-rails.doorkeeper.jp/events/45634)の発表資料になります（一部修正）

---
#目次
- 開発について
- デザインについて
- その他、SNS運用について

---
# 開発について

---
# リリースまでの流れ
- 2015年6月に8日間スクールに通いRuby on Railsを学ぶ。
- その後あまり触れず、Swiftに手を出したりする。
- 2016年1月よりサービス開発を開始。
- 5月にリリース。

---
# 非エンジニアの方がプログラミングに手を出すにあたって
- 最初は対面式のスクールに通うのが良いのでは
- 環境構築で挫折することが多かった
- 「わからないところはググればどうにかできる」を経験し、自走できるように。

---
# 開発の管理について
- なに作らなくてはいけないか（直さなくてはいけないか）、多すぎてわからなくなる
- 開発が進んでいる実感を持てない
- macのNumbers(エクセル)で管理をしていました。
![サンプル画像.png](https://qiita-image-store.s3.amazonaws.com/0/82763/3912a13d-7852-1013-6975-e2426b542eeb.png)

---
- ツールはたくさんあると思うので探してみていただけますと。
- 思いつくタスクをひたすら列挙。その上で、リリースに最低限必要な機能に着手。
    - 精神的に良い
        - しなくてはいけないことは沢山ある
        - 書き出すと気分がラクになる
    - タスクの整理も初心者には難しい
- 何が開発できたかがわかると、進んでいることを実感できる

---
# リリースまでに開発する範囲
- とことん最小限の機能に絞る
- 自分の意図していない機能が褒められたり、予想していない機能が必要とされていたり
- 思考しすぎないことも大切
- リリースしてからわかることが多いので、まずはリリース
    - もしくは沢山の人にテストしてもらう

---
# テストについて
- テストは書かずに開発
- 勿論書いたほうがいい
- 一方で振り返ってみると書いてたら挫折していた気もします
- 繰り返しとなりますが、バグに気づけないこともあるので、もちろん書いたほうがいいと思います。

---
# 質問について
- StackOverFlowの日本語サイトに数回させていただきました。
- 丁寧にご回答いただける。大感謝。
- 質問する際は体裁などに気をつけながら丁寧に。
- もちろん自分で調べてから不明点を明確に

---
# アウトプットについて
- 自分の頭の整理のためにもQiitaなどに投稿するといいかと思います
    - 自分の知識・経験がどの程度興味を持たれるものかも伺える

---
# デザインについて

---
# デザイン（素材等）
- 書籍
    -  ノンデザイナーズデザインブック

---
![41nvddaG9BL._SX349_BO1,204,203,200_.jpg](https://images-na.ssl-images-amazon.com/images/I/41nvddaG9BL.jpg)

---
- ノンデザイナーズデザインブック
    - 基本的なデザインの思考方法を学べる
    - 具体例が多く参考になる（カラー）

---
- サービスに必要な画像
    - ロゴ
    - SNSアイコン
    - トップ画像
    - no_image画像

---
- ツール
    - [sketch](https://www.sketchapp.com/) のみ

---
![249a5afd717a54d73811aaaea06a03e5.png](https://qiita-image-store.s3.amazonaws.com/0/82763/cc4dd54a-0d14-fb75-3378-40f13aa55682.png)

---
- 1時間ぐらい下記のまとめを参考に手を動かしたら、いじれるようになりました。
    - [エンジニアのための「Sketch入門！」　1時間コース](http://qiita.com/st5757/items/663f17756d61aa8e8ea3)
- 簡単。感覚的に操作できた。
- 無料期間が長い
- $99なら安いのでは？

---
#その他

---
# SNSアカウント運用
- 事前に始め、リリース日までにフォロワー数を増やせると良い
- ツール
    - [buffer](https://buffer.com/)
        - fbとtwitterに一括投稿
        - 投稿予約の設定ができる。
        - 簡単なアナリティクス機能(RT数、クリック数など)

---
- サービス内容によってはSNSが肝
- （何がユーザーに求められているか）

---
# 活動場所について
- 「必ず作業できる場所」を作る
- カフェだと、席が空いてないことや電波が不調なことがあったり
- ザッカーバーグの「いつも同じTシャツ」
- コワーキングスペースなどを契約することをオススメ。

---
# おわりに
- プログラミング学習は語学学習に近い？
- どれぐらい自分ができるようになったかはわかりづらい
- 振り返ってみると前よりは成長しているように思える
- 毎日少しでもコードを書く

---
# ありがとうございました
Elixir の HTTPoison で 非同期通信してみる

`HTTPoison` で 非同期通信する場合は `receive do `を利用する。
また再帰で結果を更新する。

```
  def send(url, json, headers) do
    process = spawn fn -> looper end
    HTTPoison.post!(url, json, headers, [stream_to: process]) 
  end
  
  defp looper(code \\ 200, headers \\ "", payload \\ "") do
    receive do
      %HTTPoison.AsyncStatus{id: reference, code: code} -> 
        looper(code)
      %HTTPoison.AsyncHeaders{id: reference, headers: headers} -> 
        looper(code, headers)
      %HTTPoison.AsyncChunk{chunk: chunk} -> 
        looper(code, headers, chunk)
      %HTTPoison.AsyncEnd{id: reference} -> 
        # do something ...
    end
  end
```

参考リンク
https://hexdocs.pm/httpoison/overview.html