OmniAICreator/Qiita-1.07M huggingface dataset:
DBUnit - DatabaseOperationの挙動


# DBUnitとは
JavaでDBのテストを行う際に、データをよしなにやってくれるすごいやつです。
XMLとかExcelとかにデータを書いておくと、勝手にDBにデータを設定してくれます。
TRUNCATEとかINSERTとかUPDATEとかいろいろできます。


# 使用バージョン
|名称|バージョン|
|:--|:--|
|JDK|1.8.0_25|
|JUnit|4.12|
|DBUnit|2.5.1|


# 「データセット」とは？
DBUnitについて調べてて気になったのが「データセット」という単語。
DBUnitの説明に必ず出てくる割には、これがどういったものなのかぴったりくる説明がありませんでした。

これは、**テーブル名・カラム名・データ・主キー の情報のかたまり**です。

この情報は`IDataSet#getTableMetaData()`で取得できます。

ちなみに主キー情報はテーブルからデータを取得した時に設定されます。


# DatabaseOperationの挙動
DatabaseOperationについて試したり調べたりする機会があったのですが、現在のバージョンでは[Javadoc(英語)](http://dbunit.sourceforge.net/apidocs/org/dbunit/operation/DatabaseOperation.html)くらいしかいい資料がなかったのでまとめてみました。

もし外部キー制約違反や一意性制約違反が起こった場合は、`org.dbunit.DatabaseUnitException`が発生します。
この例外は、各DBMSの例外をラップしています。

全てのDatabaseOperationにおいて、外部キー制約違反となる場合は上記の例外が発生します。


## INSERT
* データセットのデータがDBにインサートされる。
* 実行した結果一意性制約違反となる場合は例外が発生する。
* DBに主キーが設定されていない場合も実行可能。

## CLEAN_INSERT
* データセットで指定したテーブルのデータが全て削除され、データセットのデータがDBにインサートされる。
* 実行した結果一意性制約違反となる場合は例外が発生する。
* DBに主キーが設定されていない場合も実行可能。

## DELETE
* データセットのデータと主キーが一致しているデータが削除される。
* DBに主キーが設定されていない場合は、例外`org.dbunit.dataset.NoPrimaryKeyException`が発生する。

## DELTE_ALL
* データセットで指定したテーブルの全データが削除される。
* データセットに入っている列名やデータの内容は関係ない。
* DBに主キーが設定されていない場合も実行可能。
* 「TRUNCATE_TABLE」と違い、低速だがロールバックが可能。（[http://dbunit.sourceforge.net/apidocs/org/dbunit/operation/DeleteAllOperation.html](http://dbunit.sourceforge.net/apidocs/org/dbunit/operation/DeleteAllOperation.html)）

## UPDATE
* データセットのデータと主キーが一致しているデータが更新される。
* DBに主キーが設定されていない場合は、例外`org.dbunit.dataset.NoPrimaryKeyException`が発生する。

## TRUNCATE_TABLE
* データセットで指定したテーブルの全データが削除される。
* データセットに入っている列名やデータの内容は関係ない。
* DBに主キーが設定されていない場合も実行可能。
* 「DELTE_ALL」と違い、高速だがロールバックが不可能。（[http://dbunit.sourceforge.net/apidocs/org/dbunit/operation/TruncateTableOperation.html](http://dbunit.sourceforge.net/apidocs/org/dbunit/operation/TruncateTableOperation.html)）

## REFRESH
* データセットのデータと主キーが一致しているデータが存在しない場合はインサートされ、存在する場合はデータセットの内容に更新される。
* DBに主キーが設定されていない場合は、例外`org.dbunit.dataset.NoPrimaryKeyException`が発生する。

## NONE
* 何もしない。
* プロパティの値によってDatabaseOperationを切り替えたい時に使うと便利。


# 補足
前のバージョン（いつかはわからない）だと「TRUNCATE_TABLE」でテーブル自体が消えてしまっていた？

DatabaseOperationを使用しただけでは、「テーブルの削除」「主キーの更新」等はできなさそうです。
DBUnitを使用した他のやりかたがあるのかは調べてません。

# 感想
テスト用途なのでCLEAN_INSERTとTRUNCATE_TABLEとNONEあたりが使えれば十分だと感じました。
How to Create Custom Page Template in WordPress

 Wordpress is very rapidly growing CMS in world.Today I am Going to tell about, How to Create Custom Page Template WordPress. With wordpress we can design a page with simple HTML/CSS, and installs it in our WordPress site. All that needed is to simply add the following code into the top of your custom HTML page and save it with .php extension.

<strong><?php /* Template Name: About*/ ?></strong>

After adding the code, save this page as about.php and upload it to your current theme folder (../wp-content/themes/your-theme-name).
Once the file is uploaded, create a new page and choose the template About under ‘Page Attributes’. Publish the page to see it live.

Visit official WordPress Codex for More Information Custom Page Templates

https://developer.wordpress.org/themes/template-files-section/page-template-files/page-templates/#Custom_Page_Template
Bigquery | ひとつのテーブルに対して、スキーマ定義の順序が違う bq load を --nosync で実行するとうまくいかなかった話

# 問題

諸事情により、ひとつのテーブルに対して「スキーマ定義の順番が違う」リソースを `bq load` する必要があった。

だが立て続けに `bq load --nosync` を実行すると、（スキーマ定義の順序違う）後半のロードはうまくいかない。
( JobHistory にエラーが出る )

```bash
bq load --nosync [BQ_TABLE_NAME] [RESOURCE_1] [SCHEMA_A]
bq load --nosync [BQ_TABLE_NAME] [RESOURCE_2] [SCHEMA_A]

(中略)

bq load --nosync [BQ_TABLE_NAME] [RESOURCE_11] [SCHEMA_B]
bq load --nosync [BQ_TABLE_NAME] [RESOURCE_12] [SCHEMA_B]
```

# 解決

結論としては、最初の `bq load` だけ `--nosync` オプションを外して、直列実行することで解決した。

```bash
bq load [BQ_TABLE_NAME] [RESOURCE_1] [schema_A.json]
bq load --nosync [BQ_TABLE_NAME] [RESOURCE_2] [schema_A.json]

(中略)

bq load --nosync [BQ_TABLE_NAME] [RESOURCE_11] [schema_B.json]
bq load --nosync [BQ_TABLE_NAME] [RESOURCE_12] [schema_B.json]
```

おそらくこうすると。

「最初の bq load が完了して、BQ側でスキーマが確定した後」に、 後続の bq load がおこなわれるため。
「スキーマ定義の順番」が食い違っていても、問題がなくなったと思われる。

BQ側でスキーマが確定していないのに、矛盾のあるスキーマ定義で `bq load --nosync` をおこなうとよろしくない模様。

# ちなみに

「スキーマ定義の順番が違う」というのは、こんな状態。

```schema_A.json
[
  {"name": "Job","type":"INTEGER"},
  {"name": "Name","type":"STRING"}
]
```

```schema_B.json
[
  {"name": "Name","type":"STRING"},
  {"name": "Job","type":"INTEGER"}
]
```











<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Wordpress で任意のテンプレート（共通パーツなど）をインクルードする

# まえがき
ソーシャルボタンとかグロナビとか、Wordpressで最初から定義されていないパーツを
header.php に全て記述するのは個人的にすきじゃないのでにインクルードする事にしていた。
実装するたびに関数何だっけってなって、都度ググってたのでメモする。


# インクルードさせるファイルを作る
クライアントにテンプレートファイルを触らせない場合や管理画面上で操作しない場合は、`wp_nav_menu();` を使わずに、テンプレートファイルに直接モジュールを記載する。

インクルードするファイルはテーマディレクトリに新たに「inc」フォルダなどを作り、そこで管理した方が、テーマディレクトリ内が見やすくなって個人的には好き。

ファイル名は `module.php` とする。
今回はグロナビを作るので `gnav.php` と命名。

```
/wp-content/themes/example/inc/gnav.php
```

仮に下記のコードとする。
※今時のサイトでは少ないシンプルな内容だけど、あくまで例なのでご勘弁

```php:gnav.php
<nav class="gnavWrap">
  <ul class="gnav">
    <li class="gnav_item"><a href="#">HOME</a></li>
    <li class="gnav_item"><a href="#">NAV01</a></li>
    <li class="gnav_item"><a href="#">NAV02</a></li>
    <li class="gnav_item"><a href="#">NAV03</a></li>
  </ul>
</nav>
```

# 作ったファイルをインクルードする
作成したファイルを `header.php` などにインクルードする。
コードの埋め込みはテンプレートタグを使う。
作ったファイルをインクルードさせたい箇所に下記を記載。

```php:header.php
<?php get_template_part('inc/gnav'); ?>
```

php の `include` や `include_once ` を使っても良いとは思うけど、俺は php出来ない君なので Wordpress の恩恵を受けさせてもらう。

# 参考サイト
<a href="https://goo.gl/Vx0jY0" target="_blank">WordPress Codex日本語版（関数リファレンス/get_template_part）</a>
Sublime Text(2)上のSublime Code IntelのMacにおけるデフォルトのショートカットキー【2016年6月現在】


## 注意
超自分用


##キー

### 自動補完
`.`（ピリオド）もしくは`::`（コロン2つ）で自動で開く

### 手動補完
`Ctrl + Shift + Space` で開く

### コードジャンプ
`Ctrl + タップ or マウスクリック`
or
`Ctrl + Command + Alt + Up`

### ジャンプ後戻る
`Ctrl + Command + Alt + Left`


## 参考
- [SublimeCodeIntel/SublimeCodeIntel: Full-featured code intelligence and smart autocomplete engine](https://github.com/SublimeCodeIntel/SublimeCodeIntel)
Overleafでスクリプトを実行する

Overleafで句読点「、。」をカンマ・ピリオド「，．」に自動的に置換したくなった。

Overleafはlatexmkrcを読み込んでくれるので、次のように書くと`latex`コマンドの実行時にスクリプトが実行され、ついでに代わりにplatexを読んでくれる。

```
$latex = "find . -type f -name '*.tex' -print0 | xargs -0 sed -i '' -e 's/、/，/g' -e 's/。/．/g'; platex";
```

Overleaf公式とこんなやり取りをしている人も見つけた。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="en" dir="ltr"><a href="https://twitter.com/michiexile">@michiexile</a> <a href="https://twitter.com/overleaf">@overleaf</a> <a href="https://twitter.com/FancyWriter">@FancyWriter</a> <a href="https://twitter.com/maradydd">@maradydd</a> Yes, you can, but it should not do any harm, because you are in your own (docker) container.</p>&mdash; John Lees-Miller (@jdleesmiller) <a href="https://twitter.com/jdleesmiller/status/666290083323097088">2015年11月16日</a></blockquote>

実際、上記のスクリプトを実行しても元のtexファイルは変更されないので、どこかにコピーしてからコンパイルしているはず。
なるほどなぁ。
bash / sh | 条件分岐の構文 ( if then else fi ) がどうしても脳に入ってこない時の考え方

# 結論

シェルスクリプトの条件分岐は **「構文ではなく命令だ」** と考えた方が理解しやすいと思う。

# 問題

シェルスクリプトの if 構文は、よく分からない。
変な箇所にセミコロンが入ってきたりする。

どう理解すれば良いのか。

# セミコロンを使わずに書く場合

セミコロンを使わなくても条件分岐は書ける。

```bash
if
  [ 1 -eq 1 ]
then
  echo 'You are the one!'
else
  echo 'You are one of the them!'
fi
```

# ワンライナーで書く場合 ( ただし zsh に限る )

上記の例を zsh のワインライナーで書くと、次のようになる。
前の例から、改行を全てセミコロンに変えただけのものだ。

```bash
if; [ 1 -eq 1 ]; then; echo 'You are the one!'; else; echo 'You are one of the them!'; fi;
```

# 分解

つまり。
以下のすべては、命令として出来ていると考えることが出来る。

- `if`
- `[ 1 -eq 1 ]`
- `then`
- `echo 'You are the one!'` 
- `else` 
- `echo 'You are one of the them!'`
- `fi` 

これは全体で「構文」を作っているというよりも、あくまでも独立した1行ずつの命令であるというイメージ。
この命令同士が影響しあって、結果的に「条件分岐」が出来ている。

# 補足

コメント欄も参照のこと。

# 環境

- sh 3.2








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
webpackでjsxファイルをJavaScriptにトランスパイルする


[webpack](https://webpack.github.io/)と[babel-loader](https://github.com/babel/babel-loader)を使ってReact用のjsxファイルを変換します。

# 使う道具

- webpack
- babel-loader
- babel-core (babel-loaderに必要です)
- [babel-plugin-transform-react-jsx](https://babeljs.io/docs/plugins/transform-react-jsx/)

# 対象

## jsxファイル

```jsx:index.jsx
const React = require('react')
const ReactDOM = require('react-dom')

const App = () => <div>Hello, world!</div>

ReactDOM.render(<App />, document.querySelector('#container'))
```
をwebpackを使ってJavaScriptにトランスパイルします。

## 読み込むhtmlファイル

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

# 手順

## 準備

`package.json`を作ります。

```
npm init -y
```

必要なnpmモジュールをインストールします。

```
npm i -D webpack babel-loader babel-core babel-plugin-transform-react-jsx react react-dom
```

webpackの設定ファイルを作ります。

```js:webpack.config.js
module.exports = {
  entry: './index.jsx', // エントリポイントのjsxファイル
  output: {
    filename: 'bundle.js' // 出力するファイル
  },
  module: {
    loaders: [{
      test: /\.jsx?$/, // 拡張子がjsxで
      exclude: /node_modules/, // node_modulesフォルダ配下でなければ
      loader: 'babel', // babel-loaderを使って変換する
      query: {
        plugins: ["transform-react-jsx"] // babelのtransform-react-jsxプラグインを使ってjsxを変換
      }
    }]
  }
}
```

## 実行

```
node_modules/webpack/bin/webpack.js
```

ブラウザで、index.htmlファイルを開いて`Hello, world!`が表示されたら、成功です。

# その他
以前は[jsx-loader](https://github.com/petehunt/jsx-loader)というローダーもありました。今は非推奨です。

# 参考
- [gulp + webpack + reactの最小構成 - Qiita](http://qiita.com/uryyyyyyy/items/6d7d29499efbca8c618e)
- [React x Webpackプロジェクトの雛形を作る](http://minotaur.badwitch.io/react-webpack-boilerplate/)
Ubuntu 16.04でシャットダウンがクソみたいに遅いとき

# シャットダウンが遅い…
Ubuntu 16.04にしてからというもの、シャットダウンに3分くらいかかっていた。
再起動の速さが気に入っていたのに、台無しである。

MacBook Airの2013 LateモデルにデュアルブートしているUbuntu 15.10を16.04にアップグレードした時からシャットダウンが激遅になってしまったので、原因を探ってみた。

シャットダウン中の「Ubuntu ●●●○」みたいな画面で⌘Rを押すと、CUI上でシャットダウンの状況が確認できる。

見てみると、次のようなエラーが起きていた。

# NTPがない
## エラー
```
[FAILED] Failed to start LSB: Start NTP daemon.
See 'systemctl status ntp.service' for details.
```

NTPはNetwork Time Protocolらしい。
systemctlでntp.serviceを探しても見つからなかった。

## 解決策
http://zeroset.mnim.org/2015/04/27/ubuntu-15-04-vivid-vervet-failed-to-start-lsb-start-ntp-daemon/ 
に従ってntpを入れると直った。

`sudo aptitude install ntp`

# CUPSのタイムアウトが長い
## エラー
```
[ *** ] A stop job is running for Make remote CUPS printers available locally (**s/ 1min 30s)
```

CUPSはBonjourみたいなやつで、勝手にネットワーク上のプリンタを探してきてくれるらしい。
カウントアップしていって、1min30sのタイムアウトになるまでシャットダウンされない。

## 解決策
ここに全く同じ問題が報告されていた。
http://askubuntu.com/questions/760952/slow-shutdown-on-ubuntu-16-04-lts-stopping-thermal-daemon-running-fit-make-remo

止めて良いのかよくわからなかったが、この通りにdisableしたら一瞬でシャットダウンされるようになった。

`sudo systemctl disable cups-browsed.service`

本当はタイムアウトを短くするのが良いんじゃない？と思ったが、
やり方が見つからなかったのでとりあえずこれでよしとする。
GroongaのJSONを整形して出力する方法

Groonga5.1.0より、Groongaの出力結果のJSONを見やすい形に整形する機能``--output_pretty yes``が追加されています。

http://groonga.org./ja/blog/2015/11/29/groonga-5.1.0.html

```bash
rm -f /tmp/db* ; groonga -n /tmp/db status --output_pretty yes
[
  [
    0,
    1465894286.521962,
    0.0001919269561767578
  ],
  {
    "alloc_count": 274,
    "starttime": 1465894286,
    "start_time": 1465894286,
    "uptime": 0,
    "version": "6.0.4-31-g7075f3b",
    "n_queries": 0,
    "cache_hit_rate": 0.0,
    "command_version": 1,
    "default_command_version": 1,
    "max_command_version": 3
  }
]
```

ちなみに、Groongaの対話モードはヒストリーが効かないなどつらいので、シェルから直接コマンドをうって試すことが多いです。
なお、この場合、シェルの解釈分、空白や括弧などで必要なエスケープが増えるので注意です。

さらにちなみに、Groonga 6.0.3からは``command version 3``なんてものもできており、これはarrayではなくオブジェクトリテラル形式で出力されるようです。

http://groonga.org./ja/blog/2016/05/29/groonga-6.0.3.html

```bash
 rm -f /tmp/db* ; groonga -n /tmp/db status --output_pretty yes --command_version 3
{
  "header": {
    "return_code": 0,
    "start_time": 1465894791.529904,
    "elapsed_time": 0.0006606578826904297
  },
  "body": {
    "alloc_count": 274,
    "starttime": 1465894791,
    "start_time": 1465894791,
    "uptime": 0,
    "version": "6.0.4-31-g7075f3b",
    "n_queries": 0,
    "cache_hit_rate": 0.0,
    "command_version": 3,
    "default_command_version": 1,
    "max_command_version": 3
  }
}
```

こんなところに書くのではなくドキュメントを書くべきなのですが、Groongaのドキュメントは腰を据えてやるぞって気にならないとなかなか書けないのがつらい。
AWS LambdaをPHPから発火

AWS LambdaをPHPから実行したかった話

## 結論から
### 公式ドキュメントを見れば基本的にそんなにつまづかない。
[公式ドキュメント](http://docs.aws.amazon.com/aws-sdk-php/v2/api/class-Aws.Lambda.LambdaClient.html)

## 実際のコード　(軽くマスキング)
```php:lambda.php
<?php
use Aws\Credentials\CredentialProvider;
use Aws\Lambda\LambdaClient;
use Aws\Lambda\Exception\LambdaException;

public function call_lambda () {
    try {
        $function_name = "function_name";
        $provider = CredentialProvider::defaultProvider();
        $client = LambdaClient::factory(array(
            "region"      => "region",
            "version"     => "version",
            "credentials" => $provider,
        ));
        $result = $client->invoke(array(
            'FunctionName' => $function_name, // REQUIRED
            'InvocationType' => 'Event',
            'LogType' => 'Tail',
        ));
    } catch (LambdaException $e) {
        throw $e;
    } catch (Exception $e) {
        throw $e;
    }
}

```

## 前提条件
aws configureでcredentialsが作成されている
参考サイト
http://dev.classmethod.jp/cloud/aws-cli-credential-config/
追記: 前提条件でaws configureとか書いたけどEC2上でPHPが動いてるのであれば、
EC2にIAMROLEが当たってればできるっぽい
RxJS と axios で非同期に WEB-API の結果を取得する簡単な例


前提として Browserify ＆ ES2015 な環境での例です。[RxJS](https://github.com/Reactive-Extensions/RxJS) および [axios](https://github.com/mzabriskie/axios) は `npm` でパッケージ管理している環境であれば、それぞれ `$ npm install rx`、`$ npm install axios` で導入できます。

> axios は `Promise` に対応した HTTP クライアントです。HTTP 通信だけのために jQuery を導入するのはあれなので。

例として [Qiita API v1](https://qiita.com/api/v1/docs) を利用して Qiita の新着投稿(10件) を取得するコードは次のようになります。

```javascript:
const Rx = require('rx'); // RxJS ライブラリの読み込み
const axios = require('axios'); // axios ライブラリの読み込み

// WEB-APIのベースURL(これは axios の機能)
axios.defaults.baseURL = 'http://qiita.com/api/v1'; 

// Qiita の新着投稿(10件) を取得して Rx のストリームへ流す
function getQiitaItems() {
  // Proimse を Obserbable に変換
  return Rx.Observable.fromPromise(axios.get('/items?per_page=10'));
}

// ストリームを購読
getQiitaItems()
  .subscribe((res) => {
    // 結果(10件)を forEach で順次処理
    res.data.forEach((item) => {
      // コンソールへ出力
      console.log(item.title);
    });
  });
```

### 結果：

![スクリーンショット 2016-06-14 16.46.59.png](https://qiita-image-store.s3.amazonaws.com/0/35733/1557edb9-1865-74f0-5c52-47b65fd9c767.png "スクリーンショット 2016-06-14 16.46.59.png")

## ほか

- RxJS を導入するのは冗長だという場合は、次のように普通に `Promise` で結果を受け取ればよいです。
	- むしろプロジェクト全体の方針として Rx を利用していない場合は、素直にこっちの方がいいかも。

	```javascript:
	const axios = require('axios');
	
	axios.defaults.baseURL = 'http://qiita.com/api/v1';
	
	axios.get('/items?per_page=10')
	  .then((res) => {
	    res.data.forEach((item) => {
	      console.log(item.title);
	    });
	  });
	```

- ソースコード全体はこちらに置いておきます。
	- [hkusu/rxjs-axios-sample (GitHub)](https://github.com/hkusu/rxjs-axios-sample)
Makefileをとりあえず使う

とりあえず一番簡単な例。インデントは必ず**タブ**にする。スペースだとダメ。

```mf:Makefile
# マクロ
COMMON_WORD="hello world"

#コマンド
up:
        echo "up ${COMMON_WORD}"
clean:
        echo "clean ${COMMON_WORD}"
```
グローバルナビなど（ul li a構成）に自動でクラス付与するjavascript（JQuery）

# 動機
グローバルナビに自動で[active]クラスを付与したかった。

# 方法
jqeruy(javascrip)を記載する

#コード
```js:test.js

$('ul.classname li a').each(function(){
  if($($(this))[0].href==String(window.location)) {
    $(this).parent().addClass('active');
  }
});
//二階層等にも適用
$('ul.clssname li ul li a').each(function(){
  if($($(this))[0].href==String(window.location)) {
    $(this).parent().addClass('active');
    $(this).parent().parent().show();
  }
});

```

# 不具合あったら教えて下さい。
jersey-mvc-jspで文字コードを変えたいとき

レガシーなサーブレットアプリケーションをjersey-mvc-jspで置き換えようとしてShift_JISでHTMLを吐かせる方法が分からなかった。
最終的にweb.xmlにこれでいけた。

 ```
<init-param>
    <param-name>jersey.config.server.mvc.encoding.jsp</param-name>
    <param-value>Shift_JIS</param-value>
</init-param>
 ```

ResourceConfigにこれでもよかった。

 ```
property(MvcFeature.ENCODING+".jsp", "Shift_JIS");
 ```

最初こう書いてハマった。

 ```
property(MvcFeature.ENCODING, "Shift_JIS");
 ```


JspMvcFeatureに

 ```
public static final String ENCODING = "jersey.config.server.mvc.encoding.jsp";
 ```

があればいいのに…


### 追記（2022/04/06）

当時気が付かなかったが↓の記事でバグについて触れられていた。
このアプリケーションはすでにビューをUTF-8に移行したけれど

https://qiita.com/opengl-8080/items/f4c25ad671e8a6dac743#26-%E3%82%88%E3%82%8A%E5%89%8D%E3%81%AE-jsp-%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB%E3%81%AB%E3%81%AF%E6%96%87%E5%AD%97%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E5%87%A6%E7%90%86%E3%81%A7%E3%83%90%E3%82%B0%E3%81%8C%E3%81%82%E3%82%8B
Djangoで本番環境にデプロイするときの、staticファイルの扱いについて



##djangoでローカル環境で作業していたものを本番環境で実行するときに、staticファイルが表示されなくなった。
その対処法。

- サーバー：nginx
- django1.9.2
- python3.5


###ルーティング系

```nginx.conf
#server{}の中に追記
    
    location / {
        root /home/hogehoge/hogehoge; #サーバー上でのアプリケーションディレクトリのパス
        proxy_pass http://127.0.0.1:8000;
    }
```
デプロイの時はこんな感じで設定した。


###デバッグモードを切る

settings.pyで、下記の内容を書き直す。

```python:settings.py
DEBUG = False
ALLOWED_HOSTS = ['127.0.0.1','任意のDNS']
STATIC_ROOT = "/home/hogehoge/hogehoge/static" #静的ファイルを置きたいパスを指定するみたい
# これに加えて、STATICFILES_DIRS = {…はコメントアウトするっぽい
```
このままだと、staticfileが非表示になってしまうので、

```
python manage.py collectstatic
```
を実行。
その後、nginxで設定を書き換える

```nginx.conf
#server{}の中に

location /static/ {
        alias /home/hogehoge/hogehoge/static/; #settings.pyで設定したのと同じ場所を記述
    }
```
こんな感じで書いておく。以上。
git configについて

いつも設定ファイルがどこにあるのかわからなくなるのでメモ。

## マシン全体（--systemオプション）
/usr/local/etc/gitconfig

...と思っていたが、zshにしたら/private/etc/gitconfigになっていた。。

## ユーザー単位（--global）
~/.gitconfig


## リポジトリ単位（--local）
(リポジトリのルート)/.git/config

## 設定ファイルがどこにあるかを知る
```bash
$ git config -e --system # これでマシン全体の設定ファイルが開かれるので、このファイルパスを見ればわかる
```
AngularJSでHTMLレンダリング時の変数の状態が見たい

AngularのHTMLレンダリング時に、変数の状態などをデバッガで見たいときの方法を紹介。

方法としては、Angularのdirectiveの一つである`ng-init`を利用します。
Controllerの中に適当なテスト用のメソッドを用意しておいて、`ng-init="ctrl.test()"`のように利用します。

以下サンプルコード。

```html
<!doctype html>
<html ng-app="app">
  <head>
    <meta charset="utf-8">
    <title>how to debug?</title>
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.6/angular.js"></script>
    <script>
      angular.module('app', []);
      class Hoge {
        constructor(){
          this.arr = [1,2,3];
        }
        test(item){
          console.log(item);
        }
      }
      angular.module('app').controller('Hoge', Hoge);
    </script>
  </head>
  <body>
  <div ng-controller="Hoge as ctrl">
    <ul>
      <li ng-repeat="item in ctrl.arr" ng-bind="item" ng-init="ctrl.test(item)"></li>
    </ul>
  </div>
</body>
</html>
```

上記のhtmlファイルを開くと開発者ツール上に1,2,3と表示されることが分かります。
`console.log()`にブレークポイントを置くもよし。

このやり方をするようになってから脳内デバッグしなきゃいけない時間が減ったので大変捗ってます。
docker-machine で作成した docker 用 VM 上の docker daemon の起動設定を変更する方法

# 概要

docker daemon の起動設定を変更する方法は[こちら](http://qiita.com/sugiyasu-qr/items/2d51c73429958166db98)の記事で触れましたが、docker machine で作成した VM 上で動く docker daemon の起動設定を変更する方法は少し異なりました。

# 例として docker0 インタフェースの設定を変更

docker daemon はデフォルトで docker0 のインタフェースを 172.17.x.x で作成します。これが他のサブネットと被ってしまうと、そのサブネットと通信できなくなってしまいます。
そのような場合には、docker daemon の起動設定を変更して、docker0 のアドレスを変更する必要があります。

## docker用 VM にログインする

Docker Toolbox をインストールして、Docker Quickstart Terminal を起動します。

VM にログインします。

```
$ docker-machine.exe ssh
```

root になります。

```
docker@default:~$ sudo su -
```

ifconfig を打つと、docker0 が 172.17.x.x を使用していることが分かります。

```
docker0   Link encap:Ethernet  HWaddr
          inet addr:172.17.0.1  Bcast:0.0.0.0  Mask:255.255.0.0
```

## 設定を変更する

設定ファイルは /var/lib/boot2docker/profile です。

```
echo 'EXTRA_ARGS="--bip 172.100.42.1/16"' >> /var/lib/boot2docker/profile
```

## docker daemon を再起動する

```
/etc/init.d/docker restart
```

ifconfig を打つと、サブネットの IP が変わっていることが分かります。

```
docker0   Link encap:Ethernet  HWaddr
          inet addr:172.100.42.1  Bcast:0.0.0.0  Mask:255.255.0.0
```


## 補足

boot2docker でも同様らしいです。
macOS Sierra Developer Preview をインストールする＠2016/06/14

## 前書き

私の環境なので他の環境では発生しない可能性があるので
参考程度に留めておいてください。


#インストール方法

https://developer.apple.com/develop/

このページのダウンロードタブから
macOS 10.12 betaをダウンロードする
※AppStoreが開いてそっちでやってくれる

あとは次へを適当に押すとインストールが完了する。
~~使用許諾契約をしっかり読まないとムカデ人間にされるので注意~~

![スクリーンショット 2016-06-14 14.46.53.png](https://qiita-image-store.s3.amazonaws.com/0/54922/7b80265f-dc8b-b181-d744-7264301a9e3e.png)



#不具合

- メールがアプデされる。ログイン情報を引き継がない（iCloudは大丈夫だった）
- Siriが長時間起動できない、気づいたらフリーズしている
- 起動時にマルチディスプレイが乱れた表示になる
- 通知機能が日本語と英語と中国語が混在している（翻訳未完了）


#メリット
人柱になれるだけでメリットはなし
自分用rubyメモ パターンマッチングについて(随時追記)

# パターンマッチングを試してみる

```rb:regexp.rb
p /abc/ =~ "AbCabcAB"
p /abc/i =~ "AbCabcAB"
p /abc/ =~ "foobar"
p Regexp.new("abc")
```
```:result
3
0
nil
/abc/
```

# 結論
* ``/パターン/ =~ "文字列"``の形で正規表現によるパターンマッチングが可能。
* ``/パターン/i``とすると、大文字小文字関係なくマッチングする。
* 見つからない場合``nil``を返す。rubyでは**０**や**-1**も**真値**になるのでそのままif文に突っ込もう！
* ``Regexp.new("文字列")``でパターンの部分を作成可能。
ruby インスタンス変数 自分用 メモ

' attr_accessor :name'
クラスにattr_accessorの後に変数を宣言することで
自動的にインスタンス変数の値を参照したり、変更するメソッドを定義することができる

クラス変数は@@で始まり、クラスが持つ変数


インスタンス変数：　＠name
ローカル変数：　name
メソッド：　self.name
WP-APIのスキーマにカスタムフィールドを追加する


![](https://www.evernote.com/l/ABV-gofRYP1B_qacDpJa3zLAKTG7ACmtyWsB/image.png)

WP-APIでは、デフォルトではカスタムフィールドは出力されません。

なぜかというとサードパーティのプラグインがいつの間にかセキュリティ的に重要な情報を出力している可能性があるからなんですよね。

ただし、カスタムフィールドを出力するプラグインを作るのはそれほど難しくありません。


```
<?php
/**
 * Plugin Name: Add Meta to REST-API
 * Author: Takayuki Miyauchi
 * Description: Example plugin that adds post meta to rest-api.
 */

add_action( 'rest_api_init',  function() {
	register_rest_field(
		'post',        // post type
		'post_meta',   // rest-apiに追加するキー
		array(
			'get_callback'	=> function(  $object, $field_name, $request  ) {
				// 出力したいカスタムフィールドのキーをここで定義
				$meta_fields = array(
					'color',
					'price',
				);
				$meta = array();
				foreach ( $meta_fields as $field ) {
					// バリデーションを一切してないので注意
					$meta[ $field ] = get_post_meta( $object[ 'id' ], $field, true );
				}
				return $meta;
			},
			'update_callback' => null,
			'schema'		  => null,
		)
	);
} );
```

上のコードの中の以下の部分で出力したいカスタムフィールドを配列で指定しています。

```
$meta_fields = array(
	'color',
	'price',
);
```

これをプラグインとして有効化してREST APIのエンドポイントにアクセスすると以下のような感じでJSONが出力されていることが確認できると思います。

```
"post_meta": {
  "color": "Red",
  "price": "123000"
},

```

[Paw](https://luckymarmot.com/ja/paw)というアプリで見るとこんな感じ。

![](https://www.evernote.com/l/ABXrSsYzixBJkqqmHvSsq4EHUVCZatn90-oB/image.png)
Android Emulatorで「問題が発生したため、OpenWnnを終了します。」と出ても諦めない

# 問題が発生したため、OpenWnnを終了します。
こいつ
　↓
<img width="200" alt="Screenshot_20160614-143607.png" src="https://qiita-image-store.s3.amazonaws.com/0/33505/0300c9e2-78c8-9bfb-8f1b-d2e4e14a1522.png">

原因は、日本語IMEのバグ？
https://code.google.com/p/android/issues/detail?id=207066

何とかしたい。
今回は、無理やり入れられる方法を試す。

# ADBKeyBoard
https://github.com/senzhk/ADBKeyBoard
ADBKeyBoardとは、ADBコマンドを使ってテキストを送信できるソフトウェアキーボードらしい。

## 導入
導入はわかりやすく [READMEに書いて](https://github.com/senzhk/ADBKeyBoard#build-and-install-apk) ある

## 設定
エミュレータの設定 → 言語と入力 → 現在のキーボード → ADB Keyboard
<img width="200" alt="Screenshot_20160614-150552.png" src="https://qiita-image-store.s3.amazonaws.com/0/33505/5ff1a9d0-bb5c-e7c5-2984-4a944885e183.png">
ADB Keyboardを ON にする

## 使い方
入力フィールドにフォーカスを当てると
<img width="200" alt="Screenshot_20160614-151853.gif" src="https://qiita-image-store.s3.amazonaws.com/0/33505/a81a59a8-0825-cc83-818d-c329ddc473cb.gif">
画面下部に「 ADB Keyboard {ON} 」と表示される。

ADBコマンドでテキストを送信する

```
$ adb shell am broadcast -a ADB_INPUT_TEXT --es msg 'はろーわーるど'
Broadcasting: Intent { act=ADB_INPUT_TEXT (has extras) }
Broadcast completed: result=0
```
<img width="200" alt="Screenshot_20160614-152403.png" src="https://qiita-image-store.s3.amazonaws.com/0/33505/9621993f-9d4e-c29d-3682-336f851e9fa4.png">

入力された！
Wordpressでカスタム投稿の特定のタームだけ出力する

# まえがき
半年近く Wordpress 触ってなかったら色々忘れてハマったのでメモ。
最終的に <a href="https://goo.gl/k7m1B9" target="_blank">Codex</a> を、ちゃんと見たら一発で解決したんだけど。。。

# 投稿データの配列を作成する
Wordpressでカスタム投稿タイプを作って、
特定のタクソノミーに属する特定のタームだけを出力したいという時は、
`get_posts` に下記のような配列を渡す。

```ｐｈｐ：example.php
<?php 
$customPostArg = array(
  'posts_per_page' => 5,
  'post_type'      => 'customposts',  // カスタム投稿タイプ名
  'tax_query'      => array(
    array(
      'taxonomy' => 'customposts_taxonomy',  // カスタムタクソノミー名
      'field'    => 'slug',  // ターム名を term_id,slug,name のどれで指定するか
      'terms'    => 'customposts_taxonomy_terms' // タクソノミーに属するターム名
    )
  )
);
$customPosts = get_posts($customPostArg);
?>
```

# 投稿データの配列に基いてループを作成する
あとは下記のように `foreach` で回してあげればイケる。
※記事へのパーマリンクとタイトルだけのシンプルなものだけど。

```ｐｈｐ：example.php
<?php if($customPosts): foreach ($customPosts as $post): setup_postdata( $post );  ?>
  <div><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></div>
<?php endforeach; endif; ?>
```
`foreach` 終わったあとに `wp_reset_postdata();` しなきゃダメなのかな？？
その辺はちょっとわからんです。


# 参考サイト
<a href="http://kotori-blog.com/wordpress/posttype_taxonomy/" target="_blank">カスタム投稿タイプとカスタムタクソノミーまとめ（KoToRi Blog）</a>
正直、なんとな〜くで作業していた、カスタム投稿タイプに付随するそれぞれのワードはここで理解した。


<a href="https://goo.gl/k7m1B9" target="_blank">WordPress Codex日本語版（テンプレートタグ/get_posts）</a>
お世話になってます。
本来ここちゃんと見れば大体の事はできるようなサイトになってるとは思うんだけどね。
英語読めれば英語版のが最新情報が掲載されていそうだけど、英語わかんねぇです。
タイピングソフトっぽい入力判定の考え方

お世話になります、野村です。
普段はSeleniumとかでWebブラウザやそれらドライバを使ってバックエンドのテストオペレーションを結合するテストアプリを作ったりしてます。

その過程で、どうしても分からないものがあったので皆さんのお力をお借りしたいです。

やりたいことは以下の通りです。
寿司打みたいなものを作る形になります。

https://twitter.com/nomura_games/status/742597195241656320

ユーザーの入力したキーを受け取って出力を返すシンプルなものですが、
判定の仕方についてスマートな方法はないものか考えています。
力技で解決することも可能ではありますが、条件分岐が凄まじいことになりそうなので
できたら回避をしたいと考えています。

今回は発火のタイミングや運用の話ではなく、条件分岐を簡単にする方法が欲しいです。
現状のやり方がマズいというのは何となく感じてはいますが、今回はそれらは変えられないものとさせてください。

回答でなくても、似たようなケースでお悩みの方がいれば、それはそれでお話を聞きたいです。
よろしくお願いします。

# 読了後いいね！をお願いします。
どれだけの方に読んでもらっているか知りたいので、お手数をおかけしますがご協力いただけると嬉しいです。
【論文シリーズ】積和ネットワークについて

## 原文
[積和ネットワーク：新しい深層学習装置(Sum-product networks: A new deep architecture)](http://goo.gl/KGCXBu)
Hoifung Poon and Pedro Domingos (2011)

## 1. 要約／背景
* 積和ネットワーク(SPN)は、グラフィカルモデルの積和アルゴリズムを利用した学習装置である。
* 他の深層ネットワークより、パラメータの設定数が少なくて済む。
* 積和アルゴリズムは、分配法則などを駆使して、和積の計算ステップを最適化する。





## 2. 骨子の理論
有向木という階層構造がコンセプトの中心になる。
入力層から、出力層へノードが移る過程を、節から枝葉に別れる形で表現している。
下図では、X1、X2という入力データが積み上がっていく過程を表している。
和は、多変数の場合分け、積は、そのまま積事象に対応している。
特徴として、「X1でない」という否定の情報も一データとして扱う点である。
それぞれのデータの事象の繋がり方が、結果的に多項式形式で表現され、繋がる重みが通例のwijに対応する。

![151127172501_1.JPG](https://qiita-image-store.s3.amazonaws.com/0/127228/5f86311a-e564-1766-6d71-27bb77232e9e.jpeg)

学習機構は、対数尤度からの推定、誤差逆伝播法を用いる。


## 3. モデル適用例
Caltech, Olivettiといった画像DBから画像認識テストを実施した。
下表は、画像の左部、下部のピクセル認識について、平均二乗誤差を示した。

![151127172501_2.JPG](https://qiita-image-store.s3.amazonaws.com/0/127228/16ba3c64-1104-0b28-7dd2-c38735c4b83c.jpeg)

驚くのが、DBMやDBNに比べて誤差が少ない点である。
著者の考察として、推論のアルゴリズムに違いがあるのではないか、ということだ。
ボルツマンマシンでは、計算過程で近似推定を使うが、SPNでは、完全計算による事後確率算出ができる。
RedisをCentOS 6.7で動かす

# 概要

RedisをCentOSに導入して、動かしてみる

Redis(Remote dictionary server)とは、メモリ上にKey-Valueストア（KVS）を構築することができるソフトウェアの一つ、とのこと。 セッション管理に使うための検証として、手元のVagrant環境に導入してみる。


# 環境
[vagrant@localhost ~]$ cat /etc/redhat-release
CentOS release 6.7 (Final)

Redisのバージョンは以下のリンクから、一番新しかった「redis-3.2.0.tar.gz」とした。
http://download.redis.io/releases/

# 導入

```shell-session

#GNU Compiler Collection（gcc）をインストールしておく
$ sudo yum install gcc

$ cd /usr/local/src/

$ sudo wget http://download.redis.io/releases/redis-3.2.0.tar.gz

$ ls
# tar xzf redis-3.2.0.tar.gz

$ sudo tar xzf redis-3.2.0.tar.gz
$ cd redis-3.2.0/

$ sudo make
$ sudo make install

$ which redis-cli
# /usr/local/bin/redis-cli 入った♪

$ sudo groupadd redis
$ sudo useradd -s /sbin/nologin -M -g redis redis

$ sudo mkdir /var/run/redis
$ sudo chmod 755 /var/run/redis
$ sudo chown redis:redis /var/run/redis

$ sudo mkdir /var/log/redis
$ sudo chmod 755 /var/log/redis
$ sudo chown redis:redis /var/log/redis

$ sudo mkdir /etc/redis
$ sudo chown redis.redis /etc/redis
$ sudo cp -p ./redis-3.2.0/redis.conf /etc/redis/redis.conf


# ここはそのまま参考サイトのものです ！
$ sudo vi /etc/redis/redis.conf
daemonize yes                         # デーモン起動にします
pidfile /var/run/redis/redis.pid      # redis プロセス番号を管理するファイル
port 6379                             # 起動ポート
bind 127.0.0.1                        # 接続サーバのIP制限（0.0.0.0=無制限）
loglevel notice                       # ログ出力レベル（debug/info/notice...）
logfile "/var/log/redis/redis.log"    # ログファイル
dbfilename "dump_redis.rdb"           # RDB（永続性担保のデータファイル）格納先
dir "/var/run/redis"                  # redis実行時のワークディレクトリ
requirepass hoge                      # パスワード（適当に変更してください）
maxclients 1024                       # 接続最大数（ulimit -n で確認してください）

# redis起動
$ sudo -u redis sh -c "/usr/local/bin/redis-server /etc/redis/redis.conf"

#redisに接続
$ /usr/local/bin/redis-cli -p 6379
127.0.0.1:6379> auth hoge
OK
127.0.0.1:6379> ping
PONG
127.0.0.1:6379> set aaaa bbbb
OK
127.0.0.1:6379> 
127.0.0.1:6379> get aaaa
"bbbb"

127.0.0.1:6379> exit

```



# 参考
・・・参考、というかそのままです。ありがとうございました。
[redis Setup（redisのセットアップ）](https://github.com/kurosawatsuyoshi/doshelper/wiki/1.-redis-Setup%EF%BC%88redis%E3%81%AE%E3%82%BB%E3%83%83%E3%83%88%E3%82%A2%E3%83%83%E3%83%97%EF%BC%89)

要件がElasticCache上のRedis利用だったので、以下も参考にしました。
[ステップ 5: クラスターのノードに接続する](https://docs.aws.amazon.com/ja_jp/AmazonElastiCache/latest/UserGuide/GettingStarted.ConnectToCacheNode.html)

redis 2.0.3 documentation
[コマンドリファレンス](http://redis.shibu.jp/commandreference/)
git cloneした後、git submodule update --init をいつも忘れる

今はさすがに覚えているんですが、
昔はファイル不足のchefのエラーで時間を無駄にしていました

Berkshelfを使うべきところかもしれませんが...

```
git clone --recursive <repository>
```

```--recursive```オプションで```clone```と同時に持ってこれます :laughing:
【論文シリーズ】画像・文字混合データをボルツマンマシンで学習する

## 原文
[DBMを用いた多形態データの学習(Multimodal Learning with Deep Boltzmann Machines)](http://goo.gl/Z4qVG5)
Nitish Srivastava (2012)



## 1. 要約／背景
* 画像と文字の混合データにDBMを適用したら、良好な結果を得られた。
* テキストと画像では抽出データの型が異なるため、もともと併用が難しい
> テキスト→語数カウントベクトルであり、成分は離散的かつスパースである。
> 画像→ピクセルに分割し、各点の輝度をベクトルにまとめる。

* SVMとLDA→混合データの認識に使われるが、教師データがない場合、特徴抽出ができない…

混合データによる学習イメージを下に示す。
画像をインプットした時に、意味(タグ登録してある)を選択識別する感じ。

![151126213536_1.JPG](https://qiita-image-store.s3.amazonaws.com/0/127228/efdcd3f5-159e-53c1-5c61-172bd174c901.jpeg)




## 2. 骨子の理論
分析過程の模式図を以下に示す。
ポイントは、画像の特徴とテキストの特徴をそれぞれ別のDBMで学習させることである。
その上で、統合DBMで総合的な特徴抽出をする。
![151126213536_2.JPG](https://qiita-image-store.s3.amazonaws.com/0/127228/a6f82e32-1d9d-b157-0184-c5901c126ec5.jpeg)


画像DBMとテキストDBMを統合する式は次のようになる。
(それぞれのボルツマン分布の定式化に特別な特徴はない)

```math
P({\bf v}^m, {\bf v}^t; \theta) = \sum_{{\bf h}_m^{(2)}, {\bf h}_t^{(2)}, {\bf h}^{(3)}}P({\bf h}_m^{(2)}, {\bf h}_t^{(2)}, {\bf h}^{(3)})\Big( \sum_{{\bf h}_m^{(1)}}P({\bf v}_m, {\bf h}_m^{(1)}, {\bf h}_m^{(2)})\Big)\Big( \sum_{{\bf h}_t^{(1)}}P({\bf v}_t, {\bf h}_t^{(1)}, {\bf h}_t^{(2)})\Big)
```

積形式において、
第一項：2つの隠れ変数の統合層における同時分布
第二項：画像DBMにおける変数の同時分布
第三項：テキストDBMにおける変数の同時分布
すなわち、以上のファクターの積が、Multimodalケースの可視変数のボルツマン分布になる。
計算テクニックとしては、MCMCと平均場近似を併用した。


## 3. モデル適用例
1000枚のテキスト画像混合データを用意し、38クラス分類を学習させる。
適合判定関数に、コサイン類似関数を用いる。
5000枚のテストデータを元に行った試験結果が下のようになる；

![151126213536_4.JPG](https://qiita-image-store.s3.amazonaws.com/0/127228/ab9ebfa5-3795-4561-e8da-8ebe10e56233.jpeg)
fluentdのmonitorのメトリクスをmackerelで見る


## td-agentの設定で`monitor`の記述をしておく

#### /etc/td-agent/td-agent.conf

```
<source>
  @id input
  @type forward
  port 24224
</source>

# monitor の設定を追加
<source>
  @type monitor_agent
  @id   monitor_agent
  bind 0.0.0.0
  port 24220
</source>

@include conf.d/foo.conf

```


## mackerel-agent-plugins をパッケージでインストールしてある状態で

> mackerel-agent-plugins-0.15.2-1.noarch 以上

#### /etc/mackerel-agent/conf.d/plugin-fluent-monitor.conf

```
[plugin.metrics.fluentd]
command = "/usr/local/bin/mackerel-plugin-fluentd"
```

こんな設定を入れておく、大切なのは必ず`@id`の設定を入れること。
じゃないと`object:3fec669d6ac4`のような値になってしまうので。
また、大量にあってどこか設定が足りないみたいな場合は

```
curl http://localhost:24220/api/plugins.json | jq . | less
```

とかでそのオブジェクトのIDを探せば設定箇所がわかるのでそれでつぶしていく。


## 結果

mackerelでfluentdのmonitorがホスト毎に確認できるようになる。

<img width="1254" alt="fluentd.png" src="https://qiita-image-store.s3.amazonaws.com/0/2248/5912717f-49c5-6ab7-a2d6-a63fccb2ce56.png">

これやってる記事が見つからなかったのでメモ程度に書いた。
さっそくバッファたまってるのが確認できたので問題を潰していく。
Javaの文字列比較(一致)

なんか久しぶりにやらかしたので忘れないために。
初投稿がこんな記事でいいのだろうか。

#Javaの文字列比較について
Javaで二つの文字が一致するかどうか比較する場合は==演算子じゃなくてequalsメソッドを使うってのは、少しJava勉強すれば分かる事だし、調べればすぐ分かる。
(これから言う事だってさらに少し調べるだけで意外と出てきたりしますが…)

でも、大概どこいっても固定文字列と比較する場合はやっておいた方がいい(と私が思う)事が書かれてない事が多い。  
自分でもこれどこで見たか忘れたくらいだけれど。

## 固定の文字は右か左か。
なんの事かと思うかもしれないが、固定の文字列と何が来るか分からないStringの変数を比較する場合、どちらを引数にするかで防げる事がある。

例えば、あるStringが送られてきてそれを特定の文字と比較する様な処理があった場合、下の例は少し問題がある。  
例1)

    public boolean isEqualsQiita(String str){
        return str.equals("Qiita");
    }

まぁ、単純すぎて見れば分かると思うが、引数で渡された文字列が"Qiita"かどうか確認する処理だ。  
そして次が私がやった方がいいと思うやり方。
例2)

    public boolean isEqualsQiita(String str){
        return "Qiita".equals(str);
    }

この二者はどちらが比較対象になるかの違いだけに見えて、大きな違いがある。

最初に挙げた例1では、引数のstrがnullだった場合にNullPointerExceptionが発生するのに対し、例2ではたとえnullがきたとしてもfalseが返るだけなのだ。

なるべく例外を発生させないプログラムを書こうとしたら、圧倒的に例2の方が優れているのは分かって頂けるのではないかと思う。

とか偉そうに述べながらも、自分もまだ染み付いてないせいか、これでエラー発生させるという事態が発生したので自戒の念も込めてorz

### コメントを色々頂きまして追記
私自身最近は大分勉強が疎かでこんな記事でいいのかと思ってましたが、やはりもっと勉強しないとだめですね。
実際良く考えて、例2の状態は例えるなら、try,catchでエラーをキャッチしたものの、printStackTraceだけ出してエラー握りつぶしてる状態に近いかもしれません。
**ちゃんと仕様を把握して、事前にnullチェックするなり、きちんとした対処をしましょう！**
Hubot-Slackの表示をリッチにする

Attachmentsを使います。

![Kobito.Xjdze4.png](https://qiita-image-store.s3.amazonaws.com/0/6892/6f5372bc-c9ef-91bf-b817-917d679d9e98.png "Kobito.Xjdze4.png")
こういうやつ。

## Hubotの実装


```coffeescript
module.exports = (robot) ->
  robot.respond /hogepiyo/, (msg) ->
    data =
      content:
        color: "00ff00"
        fallback: "Sumally ....."
        title: "Title...."
        title_link: "http://example.com"
        text: "Body ......."
        mrkdwn_in: ["text"]
      channel: msg.envelope.room
      username: "bot_name"
      icon_emoji: ":emoji:"
    robot.emit "slack.attachment", data
```

* color
	* メッセージの左に出るバーの色
	* 画像だと灰色の部分
* fallback
	* 通知をONにしている時に出るポップアップのメッセージ
* title
	* メッセージのタイトル
* title_link
	* メッセージのタイトル部分に貼られるリンク
* text
	* メッセージの本文
* channel
	* どこのチャンネルに投稿するか
	* `msg.envelope.room`にすると発言を拾ったページ
* username
	* 発言するユーザー名
	* 任意のユーザー名が使用できるっぽい
* icon_emoji
	* 発言するユーザーのアイコンをemojiから指定する
	* 任意のアイコンが指定できる
	* メッセージの内容によってアイコンを変えることもできる

詳細はこちら

* https://api.slack.com/docs/attachments
nmapでネットワーク脆弱性を調べる方法

nmapはスクリプトを指定し脆弱性を検査する機能があるので共有します。

NSEスクリプト
・https://nmap.org/book/nse-scripts.html

    /usr/share/nmap/nselib/

　に検査用のスクリプトが保存されています。

・新規のNSEスクリプトのダウンロードサイト

    https://nmap.org/nsedoc/scripts/
***
####ssl-poodleをnmapで調べる手順
***

1.https://nmap.org/nsedoc/scripts/から「ssl-poodle.html」を探してアクセス

    https://nmap.org/nsedoc/scripts/ssl-poodle.html

2.https://nmap.org/nsedoc/scripts/ssl-poodle.htmlからファイルのダウンロード

　ページ内の

    「Download: http://nmap.org/svn/scripts/ssl-poodle.nse」

　ファイルを「/usr/share/nmap/nselib/」にダウンロードします。

　ダウンロード例

    #cd /usr/share/nmap/nselib/
    #wget --no-check-certificate https://svn.nmap.org/nmap/scripts/ssl-poodle.nse

3.https://nmap.org/nsedoc/scripts/ssl-poodle.htmlのExample Usageを確認する

    #nmap -sV --version-light --script ssl-poodle -p 443 <host>

4.3を参考に検査を実行

    #nmap -sV --version-light --script ssl-poodle -p 443 127.0.0.1
    
    Starting Nmap 6.40 ( http://nmap.org ) at 2016-02-19 12:38 JST
    Nmap scan report for localhost (127.0.0.1)
    Host is up (0.000043s latency).
    PORT    STATE SERVICE  VERSION
    443/tcp open  ssl/http Apache httpd
    | ssl-poodle:
    |   VULNERABLE:
    |   SSL POODLE information leak
    |     State: LIKELY VULNERABLE
    |     IDs:  CVE:CVE-2014-3566  OSVDB:113251
    |     Description:
    |           The SSL protocol 3.0, as used in OpenSSL through 1.0.1i and
    |           other products, uses nondeterministic CBC padding, which makes it easier
    |           for man-in-the-middle attackers to obtain cleartext data via a
    |           padding-oracle attack, aka the "POODLE" issue.
    |     Disclosure date: 2014-10-14
    |     Check results:
    |       TLS_DHE_RSA_WITH_AES_128_CBC_SHA
    |       TLS_FALLBACK_SCSV properly implemented
    |     References:
    |       https://www.imperialviolet.org/2014/10/14/poodle.html
    |       http://osvdb.org/113251
    |       https://www.openssl.org/~bodo/ssl-poodle.pdf
    |_      http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2014-3566

※検査実行時に

    /usr/share/nmap/nse_main.lua:276: ./ssl-poodle.nse:3: module 'sslcert' not found:

のようなエラーが出る場合

    https://nmap.org/nsedoc/scripts/ssl-poodle.html内の
    Requires
    
    nmap
    shortport
    sslcert
    stdnse
    string
    table
    tls
    listop
    vulns

から不足しているファイルを

    「/usr/share/nmap/nselib/」

にダウンロードする必要があります。

例のエラーメッセージはsslcertというファイルが足りていません。
足りないファイルを取得する方法を記載します。

1. Requiresのsslcertをクリック（sslcertのページが開きます）
2. ソースファイルのURLを探す
    source: http://nmap.org/svn/nselib/sslcert.lua

3. wgetなどで「/usr/share/nmap/nselib/」にファイルをダウンロード
自分用rubyメモ ファイル操作(随時追記)

# ファイル操作も最低限覚える

```rb:read.rb
file = File.open("foo.txt")
file.each_line do |line|
    print line
end
file.close
```

```txt:foo.txt
foo bar 
foge
```

```:result
foo bar 
foge
```

# 結論
* 1行づつファイルから文字列を持ってくる。
bash / sh | OR な代入をする

`:-` を使う。

## 変数が定義されていない場合、右辺が代入される

```bash
variable=${variable1:-DEFAULT_TEXT}

echo $variable # => DEFAULT_TEXT
```

## 変数が空の場合も、右辺が代入される

```bash
variable=''
variable=${variable1:-DEFAULT_TEXT}

echo $variable # => DEFAULT_TEXT
```


## 既に変数に値ある場合は、代入はおこなわれない

```bash
variable=NOT_DEFAULT_TEXT
variable=${variable1:-DEFAULT_TEXT}

echo $variable # => NOT_DEFAULT_TEXT
```

## 既に存在する変数が 0 の場合も、代入はおこなわれない

```bash
variable=0
variable=${variable1:-DEFAULT_TEXT}

echo $variable # => 0
```


# 環境

- sh 3.2








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
横並びにした時に、改行せずにスクロールさせる方法

よく忘れるのでメモ。

```html
<div>
  <ul>
    <li>リスト1</li>
    <li>リスト2</li>
    <li>リスト3</li>
  </ul>
</div>
```

```css
div {
  width: 100px; /* 任意の数字 */
  overflow-x: scroll;
}
ul {
  white-space:nowrap;
}
li {
  display: inline-block;
  white-space:normal; /* なくても大丈夫nowrapでも */
}
```
【Ansible】Windows Server 2008をansibleから制御するためのできるだけ簡単な仕込み

# 1. はじめに
Windows Server 2012は、WinRMのセットアップさえやれば
Ansibleから制御可能です。ですが。

きっと日本中の情報システムにはまだまだ現役のWinServer2008がいることでしょう。
そいつらもAnsibleでまとめて面倒見てやりたいもんです。
Legacyな環境というのは残るんです。
安易にリプレイスできれば誰も悩みません。
そんなLegacy環境にすらモダンなオペ手法を用いることができてこそ我が正義。

でも、できるだけ簡単に…という気持ちで書きました。

2016.6.15追記
**記事内の「以下」に当たるURLを明示していませんでした。大変失礼しました。
読んでいただいた皆様、本当に申し訳ありません。。。**
※以下ってどこだよ、とか思わせてしまい…

# 2. 実行環境

|item|version|note|
|---|---|---|
|Windows|Windows Server 2008 R2 SP1|ふるい|
|PowerShell|4.0|もともとは2.0|
|Ansible|2.0.2.0|あまりこだわらず|

# 3. やること
※本記事は2016年6月時点で動作した手順です。

1. .NetFramework 4.5.2のインストール
2. Windows Management Framework 4.0のインストール
3. WinRMのセットアップ

この３手順です。
順に説明していきます。

(1) .NetFramework 4.5.2のインストール
オフラインインストーラを[ここ](https://www.microsoft.com/en-us/download/details.aspx?id=42642)より取得し、
制御したいWinServer上でダブルクリックです。
再起動は不要のようです。

(2) Windows Management Framework 4.0のインストール
本プログラムにPowerShell 4.0を含みます。
同じくオフラインインストーラを[ここ](https://www.microsoft.com/ja-jp/download/details.aspx?id=40855)より取得し、
制御したいWinServer上でダブルクリックです。
再起動が要ります。

本手順ではリンク先のダウンロードボタン押下後表示される一覧より
Windows6.1-KB2819745-x64-MultiPkg.msu
をダウンロードし、インストールしています。
参考記事: [PowerShell/Windows7にPowerShell4.0をインストールする手順](http://win.just4fun.biz/PowerShell/Windows7%E3%81%ABPowerShell4.0%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B%E6%89%8B%E9%A0%86.html)

WinServer2008R2SP1は、PowerShell5.0もサポートしているようですが
あまり深く考えず4.0を採用。

(3) WinRMのセットアップ
以下のコマンドをコマンドプロンプトで実行します。

```:cmd
> winrm quickconfig -q
> winrm set winrm/config/winrs @{MaxMemoryPerShellMB="512"}
> winrm set winrm/config @{MaxTimeoutms="1800000"}
> winrm set winrm/config/service @{AllowUnencrypted="true"}
> winrm set winrm/config/service/auth @{Basic="true"}
> sc config WinRM start= auto
```

4行目5行目はAnsible(がWinRMを用いて行う)の接続の仕方に関して設定してます。
参考記事: [コマンドプロンプトよりWinRM へ以下設定を追加](http://qiita.com/tbuchi888/items/c60025d68c8b49dbf6d1)


# 4. あとがき

AnsibleのWindows向けサポートは(おそらく)これから充実していくのだろー
と思われます。
翻ってWindowsなんて、という声も聞こえてきそうですが
Azureが好調そうなのでノウハウとして身につけておくのも
無駄ではないかな、的な思いがいたします。
※Azureをいじったことはない

あと、サーバにinternet reachabilityがねえとか
OSや環境の最新版ってナニみたいなマゾい環境でも
自動化、DevOps、めげずになんとかしたいですよね。
CentOS で yum install openssl-devel したら、 yum Protected multilib versions と言われた

そのままですが、 `openssl-devel` が入らなくてハマった話。

入らない＆削除できない！ってなりましたが、

```zsh
yum downgrade openssl
yum --enablerepo=centosplus install openssl-devel
```

でいけました。
ChefTips: Berkshelf で 特定バージョンのCookbookをダウンロード

Chef で使う Cookbook をダウンロードするとき、いくつかの選択肢がありますが、よく使うものの一つが Berkshelf です。多分。

## Berkshelf
[http://berkshelf.com](http://berkshelf.com)
Chef Cookbook の管理ソフト。依存するCookbookを supermarket や Github/Gitlab からダウンロードしてくれる。Ruby でいうところの Bundler。

## Berksfile での バージョン指定方法
Chef社が管理する chef supermarket から cookbook をダウンロードする時と、Github/Gitlab で管理されている cookbook をダウンロードする時とで少し表記が異なります。

慣例的に、Github/Gitlab では Cookbookのバージョンを tag で管理することが多いようです。そのため、Berksfile にも tag オプションで指定することにご注意ください。

```bash
$ cat Berksfile
source 'https://supermarket.getchef.com'

# from supermarket
cookbook 'lvm', '= 2.1.2'

# from Github / Gitlab
cookbook "firewalld-cookbook", git: "git@github.com:kentarok/firewalld-cookbook.git", tag: "v1.1.0"

metadata

$ chef exec berks vendor ./vendor
```

## バージョン指定の表記
ざっくりまとめると下記のように記述します。詳細は公式をご参照ください。

* Equal to (=)
* Greater than (>)
* Greater than equal to (<)
* Less than (<)
* Less than equal to (<=)
* Pessimistic (~>)

参考/引用: [About Cookbook Versions](https://docs.chef.io/cookbook_versions.html)




## git clone で ダウンロードする際の バージョン指定方法
参考までに、`git clone` では `-b` オプションでタグを指定します。ブランチ扱いなんでしょうか…。

```bash
$git clone -b v1.0.0 git@github.com:kentarok/firewalld-cookbook.git
```

## git コマンドでのタグ付与方法
github / gitlab WebGUIからタグを付与することもできますが、`git`コマンドで付与してあげるほうがお手軽なように思えます。

```bash
$ git tag -a "v2.0.0" -m "tag msg 2.0.0"
$ git tag
$ git push --tags
```

参考/引用: [Chef Berkshelf でのハマりどころメモ@Qiita](http://qiita.com/yuki-takei/items/f463b6040c309e2123b7)
JavaScript async/await simple example

```js
(async ()=> {
    const result = await asyncReturnSomething();
    console.log(result);
})();



function asyncReturnSomething() {
    return new Promise((resolve, reject)=> {
        setTimeout(()=> {
            resolve('Done!');
        }, 1000);
    });
}
```
(node v6.2.1では未実装?)
(babelでasync/awaitを使うには`"presets": ["stage-3"]`の指定が必要)
Excel2010 で作成したファイルの図形や画像が変形して表示される件の解決策

■前置き
こんにちは。                
みなさんは、Excelで作成して保存したファイルの図形や画像がファイルを開いた際に大きく変形していて困った経験はないでしょうか？             

私は、一時期、仕事で作成したExcelファイルの図形や画像が大きく変形してしまう現象に見舞われ、大いに悩まされました。             

以下に実例を示します。                

■画像変形の具体例
(1)正常な状態の画像
　　![Sample1.png](https://qiita-image-store.s3.amazonaws.com/0/125857/63e7a398-948e-4042-b575-cea94e896f01.png)

(2)明らかに変形した状態の画像
　　![Sample2.png](https://qiita-image-store.s3.amazonaws.com/0/125857/b874d091-b442-f9b9-33fa-0508f9f9af92.png)

この現象は、Excel2010 で拡張子（.xls）のファイルを開いた場合によく起こりました。

それで、いろいろと調べたり、周りの人に聞いたりして、ようやく原因を特定し、この問題を解決することができました。     

■解決策 
Excel2010 の オプション/詳細設定 の中に 「切り取り、コピー、貼り付け」というオプショングループがあるのですが、この中の「挿入したオブジェクトをセルと共に切り取り、コピー、並べ替えを行う」オプションのチェックが外れていると、上記のような画像が変形する現象となってしまいます。 

この「挿入したオブジェクトをセルと共に切り取り、コピー、並べ替えを行う」オプションの役割としては、エクセルのシート上でセルを範囲指定でコピーした際に、その選択したセルの中に含まれる図形や画像を一緒にコピーしてくれるという有難い機能です。       

このオプションのデフォルト値は「チェックあり」なので、敢えてチェックを外すということをしなければ特に問題はありません。

しかし、そのつもりはなくても、何かの拍子にこのオプションのチェックが外れてしまった場合には、「図形や画像を一緒にコピーしてくれない」ということ以外に、とても厄介なことが起こりますので、お気を付けください。


以上
VimでNERDTreeもまとめて閉じる

NERDTree以外に1つしかウィンドウを開いていないときにvimを終了したい ⇒ 2回終了コマンドを叩かないといけない。
これはめんどくさい！！

ということで一気にNERDTreeもまとめて閉じてくれるようにした。
ついでに```$ vim```（引数なし）で起動したときに自動で起動するようにした。

```ruby:.vimrc

"引数なしでvimを開いたらNERDTreeを起動、
"引数ありならNERDTreeは起動せず、引数で渡されたファイルを開く。
autocmd vimenter * if !argc() | NERDTree | endif

"他のバッファをすべて閉じた時にNERDTreeが開いていたらNERDTreeも一緒に閉じる。
autocmd bufenter * if (winnr("$") == 1 && exists("b:NERDTree") && b:NERDTree.isTabTree()) | q | endif
```

うん。地味だけど便利。
仕様書はメール本文を書くようなイメージで作成すべき

Howばかりが記載された設計書や仕様書は書いた本人しか理解できない。

いや、書いた本人ですら時間がたてば理解できなくなる。

メンバーに書き方を指導するときにどうやって表現するか迷ってたけど、タイトルの通りに説明するのが一番しっくりくる気がしたのでメモ。
C言語スタイルのfor文を無理矢理 Swift 2.2 で実装する


**Swift初学者の方はいますぐブラウザの戻るボタンを押してください。**

----

これが：

```swift:Before
for var i = 0; i < 5; i++ {
    // hoge
}
```

こうなる：

```swift:After
do { var i = 0; while i < 5 { defer { i += 1 }
    // hoge
}}
```

Swift界隈的には下品きわまりない方法なんだろうなという予想はしていますが、過去の複雑なC言語スタイルfor文を`for in`系で置き換えたときのエンバグが怖くて震える場合には、こうした手も有りかなとは思います。


例え話として、以下のようなソースを

```swift:Before
for var i = 0; i < n; i++ {
    // hoge    
}
```

こんな風に置き換えた場合、

```swift:After
for i in 0..<n {
    // hoge
}
```

前者であれば、nがマイナス値であってもプログラムは正常に動作しますが、後者の場合はランタイムエラーになってしまいます。

こういったエンバグを防ぐために、場合によっては先のようなwhileを使った置き換えは有用ではないでしょうか。
Unity-フェードインとフェードアウト

#はじめに
この記事はUnityを用いてFade in と Fade out を行うための記事です。
この作業に自分はそこそこ四苦八苦したのでまとめておきます。
Fade in と Fade out はゲームを作る際に場面転換（暗転・明転）によく使われる技術です。この記事を読んで自分の作品をグッとそれっぽくしよう！

#流れ
今回はFade out (暗転) を作ります。
Fade in と Fade out は色のついたオブジェクトをUI上に設置し、透明度を変化させて実装していきます。今後の説明をスムーズに行うためにまずは全体の流れを説明します。

1. 透明化させるオブジェクトを作成
2. 透明度を変化させるスクリプト(C#)を書く

以上の2ステップで解説していきたいと思います。


##1.透明化させるオブジェクトを作成
まずは透明化させるオブジェクトを作ります。
Hierarchy > Create > UI > Panel でPanelを作成してください。
次にPanelについてるImageコンポーンネントのColorの値を変更します。
暗転させたいのでRGBは(0,0,0),Aという値も0にしましょう。
このAという値はα値と呼ばれ、透明度を表します。0で完全に透明、255で完全に不透明となります。

<img width="534" alt="Panel1.png" src="https://qiita-image-store.s3.amazonaws.com/0/126820/12bc9b6a-2709-b496-ce3f-c009d1287a1e.png">

<img width="781" alt="Panel2png.png" src="https://qiita-image-store.s3.amazonaws.com/0/126820/37aa55e4-0c04-c09b-78e1-70d102c72af3.png">

最後にチェックとしてAを0にすると透明、Aを255にすると真っ黒になることを確認します。これで透明化させるオブジェクトは完成です。


##2. 透明度を変化させるスクリプト(C#)を書く
次に透明度を変更するためのスクリプトを作成します。
ここではスクリプトの名前をFadeScriptにしています。

```

using UnityEngine;
using System.Collections;
using UnityEngine.UI;     //UIを使用可能にする

public class FadeScript : MonoBehaviour {

```
最初はここですねスクリプトの1番上のやつです。
デフォルトでほぼ書かれていると思いますが、１箇所だけ書き足さなくてはいけません。```
using UnityEngine.UI;　　//UIを使用可能にする ```
ここですね。これはUIに関する部分を触るときに書かなくてはならないものです。あまり深くは考えずおもじない程度に認識しておいてください。

次はこちらです。

```
    public float speed = 0.01f;  //透明化の速さ
    float alfa;    //A値を操作するための変数
    float red, green, blue;    //RGBを操作するための変数
	 
        void Start () {
　　　　　//Panelの色を取得
	         red = GetComponent<Image>().color.r;
             green = GetComponent<Image>().color.g;
             blue = GetComponent<Image>().color.b;
	}
```
コメントアウトで書いてある通りですが、使用する変数を宣言しておきます。ポイントは全部floatで宣言してることくらいですかね。
余談ですが「using UnityEngine.UI;」を書き忘れると「GetComponent<Image>()」でエラーが出ます。

最後にこちらです。

```
void Update () {
        GetComponent<Image>().color = new Color(red, green, blue, alfa);
        alfa += speed;
	}
```

ここで注意しなければならないのが画面上でA値を変更するときは値の範囲は0~255ですがスクリプトから扱う場合は範囲が0~1となります。そのため、speedは小数で設定しています。
Update()が呼び出される度にA値が少しずつ高くなっていき次第に透明ではなくなってくわけですね。


以上で解説は終わりです。


#最後に
ここまで読んでいただきありがとうございます。
speedはpublicで宣言しているのでFade outの速さ細かいところはGUIからいじれます。
スクリプトもGUI操作もかなり簡単なものにしたので、様々な応用をしていただければ幸いです。
最後にスクリプトのまとめたものを貼っておきます。

```
using UnityEngine;
using System.Collections;
using UnityEngine.UI;

public class FadeScript : MonoBehaviour {
    float alfa;
    float speed = 0.01f;
    float red, green, blue;

	void Start () {
	    red = GetComponent<Image>().color.r;
        green = GetComponent<Image>().color.g;
        blue = GetComponent<Image>().color.b;
	}
	
	void Update () {
        GetComponent<Image>().color = new Color(red, green, blue, alfa);
        alfa += speed;
	}
```
zshに乗り換えてgit commit --amendをしたらエラーが起きたときの対処法

最近bashからzshにお試しで乗り換えたのですが、git管理で`git commit --amend`をすると以下のようなエラーが起きました。

```zsh
% git commit --amend                                                 [11:46:23]
error: cannot run /usr/local/bin/vim: No such file or directory
error: unable to start editor '/usr/local/bin/vim'
Please supply the message using either -m or -F option.
```

どうやら、`git commit --amend`を打つと、vimエディタを使うようなのですが、「vimが見つかりませんよー」と怒られているようです。
試しに下記コマンドでbashに戻して`git commit --amend`をすると問題なく動作します。

```bash
$ chsh -s /bin/bash
```
bashだとnanoエディタが開くようなので問題ないようですね。

##解決方法

`~/.gitconfig`でパスを通してあげれば解決します。
whichコマンドでvimの場所を特定します。

```zsh
% which vim
/usr/bin/vim
```

自分の場合は`/usr/bin/vim`でした。これを指定してあげればOKです。

自分の場合はsumlimeTextで編集したかったので、下記コマンドを打ちます。

```zsh
% open -a Sublime\ Text ~/.gitconfig
```

[core]配下にパスを通してあげます。

```sublime:sublime
[core]
  editor = /usr/bin/vim
```

これで解決するはずです。

##　訂正
コメントにご指摘いただいたとおり、`.zshrc`ファイルで指定されていました。私の場合.gitconfigファイルをいじる必要はなく、`.zshrc`ファイルに`/user/bin/vim`にパスを通してあげることで解決しました。

```.zshrc:.zshrc
export EDITOR=/usr/bin/vim
```