OmniAICreator/Qiita-1.07M huggingface dataset:
[LESS] LESSことはじめ

## あらまし

遅れ馳せながら、LESSを使ってみたぁい！！
ということで、基本的なところを押さえようとしておるところでございまして。

## 前提

- less.jsを使う。
- style.lessはstyle.cssから拡張子を変えてごにょごにょする。

## 書き方

```hoge.html
<link rel="stylesheet/less" type="text/css" href="styles.less" />
<script src="less.js" type="text/javascript"></script>
```

と、まぁ、この辺のことはね、検索したらぽんぽこ出てくるんですわ。
ただひとつ、引っ掛かったことがあって。

```hoge.css
@CHARSET "UTF-8";
```

これ。
CSSファイルの文字コードを指定するやつ。

普通にCSSとして使ってたときにはむしろ必要なものやったはずやのに、こいつのせいでエラーを吐きよる…あかん…あかんでぇ… (:3_ヽ)_ .

んで、こう言われますねんわ。

**ParseError: Unrecognised input**

と。
「変換しよおもたけど、なんや認識でけへんもんあんねんけど？」って。

多少LESSをかじったあとの人ならわかりはりまっしゃろ？
これ、**「変数と誤解されておかしなことになってる」**ってスンポーちゃいまっか？と。

というわけで…

# 全部消したれ (  ･`ω･´)ｗｗｗ

結局のところ、Parseのときに邪魔になるわ、Parse後の出力時はHTML自体のCharsetに準拠するわってことで…いらへんのですわ。

チャンチャン♪

あ、注意としては…
**消すのは「対象とするすべてのファイル」**なんで、見落とさへんように。
そう、コンパイルの対象とするなら、CSSファイルからも除去する必要があるってことですわ。

```hoge.html
<!-- 対象 -->
<link rel="stylesheet/less" type="text/css" href="styles.css" />
<!-- 非対象 -->
<link rel="stylesheet" type="text/css" href="styles.css" />
```

…むつかしわぁ (´･ω･｀)
新人あるある(Dosバッチお作法編 第二章)

未来の新人さんへおくるDosバッチお作法第二弾行きたいと思います

前回はechoについてちょろっと語りました

ログを残す際でおそらく詰まるかもねってことで書きました
今回はログもしかることながらおそらくみんなが詰まっただろう%ERRORLEVEL%について語って変数や戻り値に関して紹介していこうかなって思います

そもそも%ERRORLEVEL%ってなんぞっていう方向けにあっさり紹介
処理が正常終了したか異常終了したかの戻り値を数字にして教えてくれるイケメンのこと
こいつは結構お世話になるので覚えておいてください

では次に戻り値ってなんやねんって思う人多いと思います
研修中の私もそんな感じでした

戻り値とは処理が終わった際に結果を呼び出し元に渡す値のこと
たとえるなら「Aさんから頼まれたプリントのコピーが終わりました」って言って
コピーしたものを渡すって感じかな

プログラミングでは戻り値がないと大変です
処理を配列に入れられなかったりエラーメッセージが出なくてどこでエラーなのかがわからんってことにもなる…
あえて返さないって手もあるらしいけど教えられてないしそんな機会あるのか謎です

ではざっくり戻り値と%ERRORLEVEL%に関して簡単に説明したので
こいつの使い方について(超重要、メモの準備はいいかね)

%ERRORLEVEL%は直前の処理に対してのみ戻り値を入れてくれるものです
どういうことかわかんねえよって思うかと
最初これに私もつまづきましたからね

つまりこゆこと

echo 処理1を開始します
echo 処理1
   %ERRORLEVEL%
echo 処理1を終了します

こうやって書かないと処理1の戻り値が入ってきてくれないわけ
これが複数のプログラムをバッチファイルから動かそうと思った際に困るってわけ

つまり
echo 処理1を開始します
echo 処理1
echo 処理1を終了します
echo 処理2を開始します
echo 処理2
echo 処理2を終了します
    %ERRORLEVEL%
って書いちゃうとどの行に対して%ERRORLEVEL%の戻り値が入るでしょう





正解はecho 処理2を終了しますっていう処理に対しての戻り値が入ってきちゃいます
まとめて保持はできないよってことだね

カンのいい新人は変数であるので一つしか値を持つことができないって気づくやつがいると思う

なので正しくは
echo 処理1
    %ERRORLLEVEL%
echo 処理2
    %ERRORLEVEL%って書こうねってこと
でもこれじゃあ戻り値は一つしかないのにどやって区別するのって話になるよね

こうするといい

echo 処理1を開始します
echo 処理1
    %ERRORLEVEL%
if %ERRORLEVEL%==0 (
    echo 処理1が正常に終了しました
    echo 処理2に移行します
    echo 処理2
       %ERRORLEVEL%
    if %ERRORLEVEL%==0 (
        echo 処理が正常に終了しました
        exit /b 
　　) else (
        goto :Error
    )
) else (
    goto :Error
)

:Error

echo 処理が正常に終了できませんでした
exit /b 

説明しないといけないことが2点
goto文とexit /bについて
goto文はラベルっていう技で処理が共通しているときに処理を別にまとめておいてそこへ飛んでくださいって命令するやつ
ここでは異常終了が発生したらその場でプログラムを終了させるようにしてるってこと
例えば処理1で異常終了したら処理2にはいかないし処理1が正常終了して処理2が異常終了だった場合は処理2がどういうエラーなのかがわかるっていう作戦

ラベルはいろいろ使うこと多いので使えるようにしておくとすっきりするよ

次はexit /bについて
これはDosコマンドのexit と　オプションの/bの組み合わせ
exitコマンドで処理を終了する際に%ERRORLEVEL%の戻り値を返してオプションの/bで現在のバッチスクリプトを指定するってことしてます

つまり現在のバッチスクリプトを戻り値出して終了するよってこと

まって、バッチファイルってすぐcmdウィンドウ閉じちゃうじゃん
どこでその戻り値を確認すればいいのってことになるけど
カギは起動の仕方にありました

これも上司に教えてもらいました
①cmd起動
②start "Dosバッチ"

これだけ
このstartコマンドは別のウィンドウを開けてDosバッチを起動しまっせっていうコマンド
こうすることでログ見なくても実行結果がすぐわかるっていう開発で必須の知識

いろいろ新しいことも加えてしまって申し訳なかったがこういったことはよく出てくるし
知らないとググって定時来ちゃって残業っていうこともあるから各自で調べて理解を深めてください

あくまでお作法の紹介ってかんじなので

次回は今回あまり話せなかった変数についてのお作法紹介と行きますか
あれもこれも、Rubyではメソッド。

Rubyの世界では、普通の言語なら文法として実装してしまうものでも、**メソッド**になっていることがあります。

## 初級編

### `new`メソッド

多くの言語で`new`は演算子ですが、Rubyでは`Class`クラスのメソッドとなっています。`Object.new`のように書くので、これはメソッドだとわかりやすいと思います。

だからといって、自分で`new`を再実装することはないと思いますが、`private_class_method :new`とすれば、`new`メソッドを`private`にして、外部からかんたんに`new`できないようにできます。

## 中級編

### `attr_xxx`メソッド

Rubyの場合、インスタンス変数を直接`public`にすることはできないので、読み書きするだけのメソッドが必要になることがあります。それをかんたんに実装できるのが`attr_reader`や`attr_accessor`などのメソッド群です。Rubyでは[クラス定義内もコード実行が行われる](http://qiita.com/jkr_2255/items/a188b51c2fad4ef1578c)ので、「メソッド定義をするメソッド」をこの場で使えるのです（これはその気になれば自分で実装できます）。

### `public`/`private`/`protected`

他の言語と動作が違うことで有名なRubyのアクセス制御ですが、実はこれらもメソッドです。とは言え、メソッドして意識しておくような場面も、`private(*methods)`のように引数をsplatするときぐらいだとは思います。

## 上級編

### `Kernel`のメソッド群

`Kernel`というモジュールがあって、これは`Object`に`include`されています。ということで、ここに定義されたメソッドはレシーバー無しで使えます。ただ、[リストを見てみれば](https://docs.ruby-lang.org/ja/latest/class/Kernel.html)「これもメソッドだったの？」と言うものが目白押しです。

* `block_given?`…メソッドにブロックが与えられたか判定する
* `exit`…Rubyを終了する
* `p`/`putc`/`puts`…標準出力する
* `proc`…`Proc`を作成する
* `raise`…例外を投げる
* `require`…ライブラリを読み込む

「メソッドである」ことで注意しないといけないシチュエーションが2つあって、「同名のメソッドを定義したクラスの中」や、「`Object`の上位にある`BasicObject`から継承したクラスの中」では、これらが（普通に呼ぶだけでは）使えません。例外を投げるのにも`::Kernel.raise`とする必要があります。
物理エンジンmujoco登録の仕方


# はじめに
OpenAI gymとかで、mujoco使おうとした時に、Licenseないよって怒られます。
そう、mujocoは登録しないと使用できないのです...

2017/08/31時点でのmujocoのLicense料金は以下のような感じになってます。
学生の人だったら1年無料で試せますね！
![スクリーンショット 2017-08-31 22.30.37.png](https://qiita-image-store.s3.amazonaws.com/0/177228/2ef95857-5f66-5961-c49a-a1e3857957ea.png "スクリーンショット 2017-08-31 22.30.37.png")

ちなみに、もっとこうした方が記事見やすくなるよなどご指摘ございましたらどんどん仰って頂けると嬉しいです！


# mujoco登録の仕方
## 学生じゃない方
[mujocoのサイト](https://www.roboti.us/license.html)に行って、「MuJoCo Pro Trial License: 30 days」って所で、名前とメールアドレス・coumputer idを登録します。

computer idは、mujocoを使用したいコンピュータのOSに対応したgetidファイルを以下の画像の青くなってるリンク(Win32とかLinuxとか書いてある箇所）をDL(getid_os名ってファイルがDLされます)して、実行するとゲットできます。
![スクリーンショット 2017-08-31 22.36.37.png](https://qiita-image-store.s3.amazonaws.com/0/177228/84960668-7a0a-65e0-496b-e5ece2b04811.png "スクリーンショット 2017-08-31 22.36.37.png")
getidファイルの実行の仕方は、この記事の後ろ辺りに書いてあります！

## 学生の方
[mujocoのサイト](https://www.roboti.us/license.html)に行って、「MuJoCo Pro Personal License: 1 year」って所で名前とメールアドレス・大学名とかを登録します。
「Student」にチェック入れるのを忘れないようにしてください！
(その際、メールアドレスは大学のメールアドレスを使ってください)


登録した情報が正しければ、2日以内に登録したメールアドレスにAccount Numberと電子Licenseが付与されたメールが届きます。

その後、[mujocoのサイト](https://www.roboti.us/license.html)でAccount NumberとComputer idを登録すれば完了です。
**※ 学生Licenseだと、１台のコンピュータでしかmujocoを使用できないので、EC2インスタンスで使いたいのに間違ってローカルPCのidを登録しちゃった...なんてことがないように注意してください。**
（サイト内「MuJoCo Pro Personal License: 1 year」の以下の箇所で登録します）
<img width="1081" alt="2017-08-31 22 18 52" src="https://user-images.githubusercontent.com/24610237/29925165-6ee60106-8e9a-11e7-82ce-4b7ec45bd3c9.png">

computer idは、mujocoを使用したいコンピュータのOSに対応したgetidファイルを以下の画像の青くなってるリンク(Win32とかLinuxとか書いてある箇所）をDL(getid_os名ってファイルがDLされます)して、実行するとゲットできます。

## getidファイル 実行の仕方
※自分は、macで試したのでgetid_osxファイルを使いました。

まず、chmodで **ファイルに実行権限を与えます。** 

```bash: 
$ chmod +x getid_osx
```

したら実行できるようになるので、

```bash:
$ ./getid_osx
```

と打てば、computer idをゲットできます。


参考までに実行結果は以下のような感じになります。

```shell-session:
$ ./getid_osx

Your MuJoCo computer id is:

   ************************　 ← computer idが出てくる。

Please send this string to Roboti LLC to generate activation key.

Press Enter to exit...

```

# 最後に
需要あるかわかりませんが、mujocoの登録の仕方を書いてある記事が見当たらなかったので書かせていただきました。

お役に立てば幸いです！！
Wireshark で独自プロトコルを解析 (dissector with Lua)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/10713/d927e4da-7b00-c93d-636f-160f273476e7.png)

Wiresharkは有名なパケット解析ソフトです。
このソフト、独自プロトコルをparseする拡張をプログラミングで作ることができます！

## 独自のバイナリプロトコル
例として、図のようなプロトコルをWiresharkでparseできるようにします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/10713/5bfea952-353f-8c8f-fafe-55fa88b36de6.png)

### Wireshark拡張 Luaスクリプト
Luaというスクリプト言語で記述して、以下の場所に配置すると動きます。

| 環境 | .lua ファイルの配置場所 |
|:----|:-----------------------|
|Windows| %APPDATA%/Wireshark/plugins|
|Mac/Linux| ~/.config/wireshark/plugins |


### Luaソースコード

```lua
my_proto = Proto("my_proto","My Protocol (description)")

my_proto.fields.len = ProtoField.uint16("my_proto.len","Len")
my_proto.fields.data = ProtoField.bytes("my_proto.data","Data", base.SPACE)

function my_proto.dissector(buffer, pinfo, tree)
    pinfo.cols.protocol = "MYPROTO"

    local subtree = tree:add(my_proto, buffer(), "My Protocol")
    local len = buffer(0, 2):le_uint() -- le_ はリトルエンディアン
    local data = buffer(2, len)

    local packet_id = data(0, 4):le_uint()
    
    subtree:add_le(my_proto.fields.len, len) -- le_ はリトルエンディアン
    subtree:add(my_proto.fields.data, data)
end

-- TCP port 20000 を自動的にmy_protoと解釈する
tcp_table = DissectorTable.get("tcp.port")
tcp_table:add(20000, my_proto)
```

### Wiresharkで実際にみてみる

先頭に長さ: 5 を付加した `hello` という5文字を送ってみました。
Protocol欄が **MYPROTO** になり、TCPの下に **My Protocol** のツリーができています！

![image.png](https://qiita-image-store.s3.amazonaws.com/0/10713/4f653ff9-7480-d1fe-56a6-31f753fb055c.png)


## 用語
**pinfo**, **subtree**, **buffer** はWiresharkのUIに表示される部分を表しています。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/10713/d953d6d6-b088-8808-cbc6-2512a33ee29c.png)

## 情報の集め方
Wiresharkで独自プロトコル定義を作るなんて、そんなにメジャーなことではないと思うので情報が少ないです。
Luaから呼び出す関数などは以下の公式ドキュメントがものすごく役立ちました。

**Wireshark’s Lua API Reference Manual**
https://www.wireshark.org/docs/wsdg_html_chunked/wsluarm_modules.html

あとは実際に書かれた .lua ファイルの例を読むと具体的でわかりやすいと思います。
このWireshark拡張は Dissector という名前らしいので、 `dissector example` 等で検索すると少しあります。

以下の LLUDP Dissector はかなり複雑な解析まで書かれているので、応用できそうです。

**LLUDP Dissector**
http://opensimulator.org/wiki/LLUDP_Dissector
macOS, OSX 上の phpenv で "configure: error: OpenSSL version 1.0.1 or greater required." とかで error となった時の対処方法

久しぶりに phpenv で任意のバージョンをインストールしようとしたら "configure: error: OpenSSL version 1.0.1 or greater required." で error となった。

もう何番煎じなのかわからんぐらいにみんな書いてるけど…

対象方法をメモ。

## 前提

OSX, brew から openssl 入れてる

※多分 macOS でも同じはず。

## 結論

以下のように `PHP_BUILD_CONFIGURE_OPTS` を用いて、パラメーターを追加してやりましょう。

```bash
$ PHP_BUILD_CONFIGURE_OPTS="--with-openssl=$(brew --prefix openssl)" phpenv install 7.1.8
```

※多分、その他の依存でも同じようにパラメーターを追加することで解決するやつがあると思うけど、取り敢えず略。

## 起きた状況

おもむろに `$ phpenv install 7.1.8` って叩いたら、 `configure: error: OpenSSL version 1.0.1 or greater required.` でビルドが止まった。

openssl は以前に brew からインストールした記憶があるので確認。

```bash
$ brew list openssl
/usr/local/Cellar/openssl/1.0.2l/.bottle/etc/ (8 files)
/usr/local/Cellar/openssl/1.0.2l/bin/c_rehash
/usr/local/Cellar/openssl/1.0.2l/bin/openssl
/usr/local/Cellar/openssl/1.0.2l/include/openssl/ (75 files)
/usr/local/Cellar/openssl/1.0.2l/lib/libcrypto.1.0.0.dylib
/usr/local/Cellar/openssl/1.0.2l/lib/libssl.1.0.0.dylib
/usr/local/Cellar/openssl/1.0.2l/lib/engines/ (12 files)
/usr/local/Cellar/openssl/1.0.2l/lib/pkgconfig/ (3 files)
/usr/local/Cellar/openssl/1.0.2l/lib/ (4 other files)
/usr/local/Cellar/openssl/1.0.2l/share/man/ (1597 files)
```

1.0.2l が入ってる。

が、ビルドエラー。

なので、 `$ brew link openssl` を試みた。

```bash
$ brew link openssl
Warning: Refusing to link: openssl
Linking keg-only openssl means you may end up linking against the insecure,
deprecated system OpenSSL while using the headers from Homebrew's openssl.
Instead, pass the full include/library paths to your compiler e.g.:
  -I/usr/local/opt/openssl/include -L/usr/local/opt/openssl/lib
```

link 出来ないんですって。

なので、コンパイラにパスを教えてねって。

`.bash_profile` とかで PATH の優先順を変える方法もあるけど、なんか嫌。

というわけで、前述の `PHP_BUILD_CONFIGURE_OPTS` を用いた。

というメモ。
webpackをつかってdjangoでbootstrap4をはじめる

bootstrap4がベータになっているのでそろそろ触り始めようと思いました。webpackを使ってみようと思います

[公式のガイド](https://getbootstrap.com/docs/4.0/getting-started/webpack/)

django上で動かしてみたいと思います。[この投稿](http://qiita.com/nakapython/items/a81825aeb67c32232fb5)の内容とけっこうかぶっています

### npmパッケージのインストール

Djangoのプロジェクトディレクトリに移動する。必要なnpmパッケージをインストールする

```
npm init -f
npm install --save-dev webpack webpack-bundle-tracker jquery popper.js style-loader css-loader bootstrap@4.0.0-beta
```
### webpack.config.jsを作成・編集

webpackの設定ファイルであるwebpack.config.jsを作成・編集する

```
touch webpack.config.js
```

```js:webpack.config.js
var path = require("path")
var webpack = require('webpack')
var BundleTracker = require('webpack-bundle-tracker')

module.exports = {
  context: __dirname,

  entry: './assets/js/main.js', // これがエントリーポイント

  output: { // コンパイルされたファイルの設定
      path: path.resolve('./assets/bundles/'),
      filename: "[name]-[hash].js",
  },

  plugins: [
    new BundleTracker({filename: './webpack-stats.json'}),
    new webpack.ProvidePlugin({
        $: 'jquery',
        jQuery: 'jquery',
        'window.jQuery': 'jquery',
        Popper: ['popper.js', 'default'],
    })
  ],

  module: {
 　loaders: [
  　{
   　test: /\.css$/,
   　use: [ 'style-loader', 'css-loader' ]
  　},
 ],
},
}
```
### エントリーポイントのmain.jsを作成・編集

```
mkdir -p assets/js
touch assets/js/main.js
```
内容は下記

```js:assets/js/main.js
import 'bootstrap';
import 'bootstrap/dist/css/bootstrap.min.css';
```

### コンパイル

```
./node_modules/.bin/webpack --config webpack.config.js
```

これでwebpack.config.jsのoutputで指定したとおり、assets/bundles/に「main-(ハッシュ値).js」というファイルができます。

## Djangoの設定

### django-webpack-loaderのインストール

```
pip install django-webpack-loader
```

settings.pyを設定します

```py:settings.py

...

STATICFILES_DIRS = (
    os.path.join(BASE_DIR, 'assets'), 
)

...

WEBPACK_LOADER = {
    'DEFAULT': {
        'BUNDLE_DIR_NAME': 'bundles/',
        'STATS_FILE': os.path.join(BASE_DIR, 'webpack-stats.json'),
    }
}

...

INSTALLED_APPS = (
 ...
 'webpack_loader',
)
```
### テンプレートの書き方

```html+django
{% load render_bundle from webpack_loader %}
<!DOCTYPE html>
<html>
 <head>
   <meta charset="utf-8">
   <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
 </head>
 <body>
　<div class="alert alert-success" role="alert">
  　<h4 class="alert-heading">Well done!</h4>
  　<p>Bootstrap4をmezzanine上で動かしています</p>
  　<hr>
  　<p class="mb-0">webpackを使っています</p>
　</div>
 
　{% render_bundle 'main' %}

 </body>
```

{% render_bundle 'main'%}のところにコンパイルされたjsがはいります。
mapを使った色の管理


Demo : https://codepen.io/mo4_9/pen/oeQyKN

色情報をまとめる

```scss
$colors: (
    1: (
        main1: #ff0000,
        main2: #F96565,
        sub1: #FFBC00,
        sub2: #FFD564,
    ),
    2: (
        main1: #39FF00,
        main2: #82FF5F,
        sub1: #00F1FF,
        sub2: #64F6FF,
    ),
    3: (
        main1: #1500FF,
        main2: #6355FF,
        sub1: #FF00AC,
        sub2: #FF5DCA,
    ),
);
```

`data-week`の値を変更すると全体の色が変わる

```scss
@each $key, $color in $colors {
    .wrapper[data-week="#{$key}"]{
        $main1-color: map-get(map-get($colors,$key),main1);
        $main2-color: map-get(map-get($colors,$key),main2);
        $sub1-color: map-get(map-get($colors,$key),sub1);
        $sub2-color: map-get(map-get($colors,$key),sub2);
        // color
        .wc_c_m1{ color: $main1-color; }
        .wc_c_m2{ color: $main2-color; }
        .wc_c_s1{ color: $sub1-color; }
        .wc_c_s2{ color: $sub2-color; }
        // background-color
        .wc_b_m1{ background-color: $main1-color; }
        .wc_b_m2{ background-color: $main2-color; }
        .wc_b_s1{ background-color: $sub1-color; }
        .wc_b_s2{ background-color: $sub2-color; }
        // linear-gradient
        .wc_lg_m1{ background-image: linear-gradient($main1-color, $main2-color); }
        .wc_lg_m2{ background-image: linear-gradient($main2-color, $main1-color); }
        .wc_lg_s1{ background-image: linear-gradient($sub1-color, $sub2-color); }
        .wc_lg_s2{ background-image: linear-gradient($sub2-color, $sub1-color); }
    }
}
```

> 参考
[Sass 3.3で追加された新しいデータタイプ「マップ」まとめ解説](https://html5experts.jp/kosei27/3727/)
開発環境メモ(mac)

インターンなどでmacを借りて環境設定することが何回かあったのでメモ_φ(･_･
「最低限これだけはやっとけ！」って設定のみ書くことにします。
(エディタについては戦争が起こりそうなので触れません)

# 前提
## OS
> macOS シリーズ対象

# ここから下で設定
# システム環境設定
#### [キーボード]->[ショートカット]
アプリケーション内でウィンドウを切り替える
> 「次のウィンドウを操作対象にする」 を "Cmd+Esc" に

#### [キーボード]->[入力ソース]
ライブ変換が邪魔なのでオフに
> 「ライブ変換」 を "オフ" に

バックスラッシュを入力できるように
> 「"¥"キーで入力する文字」 を "\" に

# ターミナル設定
## iTerm2をインストール
ここからダウンロード・インストール
> https://www.iterm2.com/

## ~/.bash_profile 設定
ターミナル起動時に"~/.bashrc"を読みこむように
"~/.bash_profile"が無かったら作成
あったら追記

    # ~/.bash_profile
    if [ -f ~/.bashrc ]; then
        . ~/.bashrc
    fi

## ~/.bashrc 設定
"~/.bashrc"が無かったら作成


## lsコマンド設定
パーミッションによって色を変える

    alias ls='ls -G'

alias(詳細表示)

    alias ll='ls -lh'

alias(詳細表示+隠しファイル・ディレクトリ表示)

    alias lla='ls -lha'

背景が黒だとディレクトリが青で表示されて見づらいのでディレクトリがシアンで表示されるように

    export LSCOLORS=gxfxcxdxbxegedabagacad


## gitコマンド補完設定

"git-completion.bash"を見つける

    sudo find / -name git-completion.bash

シェルを開いたときに"git-completion.bash"を実行するように
"~/.bashrc"に追記


    # 見つけたpathを指定
    source /path/to/git-completion.bash

    # 自分の場合はこうでした
    source /Library/Developer/CommandLineTools/usr/share/git-core/git-completion.bash

## sshコマンド補完設定
bash-completionをインストール

    brew install bash-completion

"~/.bashrc"に追記

    source /usr/local/etc/bash_completion

## カレントディレクトリをプロンプトに表示

"~/.bashrc"に追記
お好みで

    # 改行なし
    PS1='\[\e[36m\]\w \[\e[1;37m\]\u$ '
    # 改行あり
    PS1='\[\e[36m\][\w]\n\[\e[1;37m\]\u$ '


# ~/.bashrc まとめ

    # ls
    alias ls='ls -G'
    alias ll='ls -lh'
    alias lla='ls -lha'
    export LSCOLORS=gxfxcxdxbxegedabagacad

    # git-completion
    source /Library/Developer/CommandLineTools/usr/share/git-core/git-completion.bash

    # ssh completion
    source /usr/local/etc/bash_completion

    # プロンプト
    ## 改行なし
    PS1='\[\e[36m\]\w \[\e[1;37m\]\u$ '
    ## 改行あり
    PS1='\[\e[36m\][\w]\n\[\e[1;37m\]\u$ '


# キーボードの感度設定
"システム環境設定 > キーボード" で
「キーのリピート」と「リピート入力認識までの時間」を最速にする。

# 参考
* [sshのhost名を自動補完させる](http://qiita.com/soramugi/items/846e6eac0ce1d3dc1e42)
* [Linuxのプロンプトの表示を変更する](http://qiita.com/katsukii/items/da37d1fdf974bd0e4c2f)
* [Linuxで、bash プロンプトを素敵で実用的なものに変更する](https://jp.linux.com/news/linuxcom-exclusive/416957-lco20140519)

# 終わりに
よりよい設定があったら適宜更新していきます。
間違いや改善案があったらどんどん教えてください。
泣いてよろこびます。
pp4(python power for anything)  

# 代入文の羅列でデータファイル
Salome-mecaやFreeCADなどのpythonを組み込んだソフトやjsonなどで、プログラミング言語の代入文の羅列でデータを定義できるようにする方法は、だいぶ昔に考えた。
その時CPANにpp4ってスクリプトを登録した。

pp4は、perl power for anythingtte意味でつけた名前。

代入文の羅列したファイルをデータファイルの書式として採用するだけで、構造を持ったデータでもファイル書式を検討したり、データ読み込みルーチンを書かずに済む利点があるのだけど、pp4ではコマンドラインやファイルのパス名からのマッチングからデータを定義する機能を持たせた。
これがあると、パラメーターを変えて複数のケースの計算を実施するのに、パラメーター定義をパス名に含んだディレクトリを作るだけで自動化が出来る様になる。
関連パラメーターがパス名に入っているので、該当のケースのディレクトリも見つけ易い。

pythonの勉強がてら、pp4をpythonで書き直そうか思案中。名前はpp4のままで良いしね。
Redis ClusterのマネジメントツールReddieがすごい

# Reddieとは
2017年8月17日にbeta版がリリースされた、マネジメントツール(公式的にはcompanion app)。
https://get-reddie.com/
twitter: https://twitter.com/ReddieApp

# 何が出来るのか
**トップページに動画のデモがあるので、それを見てみるのがオススメです**
**またDEMOページでは、実際に動かすことも出来ます**

- Redis Clusterのmaster-slaveを可視化できる
  - Drag&Dropでslaveの付け替えが出来る
  - 新規にnodeを追加できる
- Web上から全nodeの設定変更が出来る
- Web上からリシャーディングが出来る
- Web上からSLOWLOGが見える
- 死活監視やメモリやNW IOなどのリアルタイム可視化

# 個人的嬉しポイント
- 認証付きのRedis Clsuterにも対応している
  - 公式のredis-trib.rbですら対応してないのに！
- 複数のRedis Clusterを管理する前提のUIになっている
- docker pullして、docker runするだけで良い
- ドキュメントがとにかくよく出来ている
- beta版は、無料でProの機能を利用できる
- ツールの利用に簡単なパスワードを設定出来る

# 個人的残念ポイント
- Clusterごとにパスワードを設定出来ない

# まとめ
Redis Clusterを運用しているなら、
とにかくサイトに行って、DEMOだけでもいじってみるべき。
※ 利用規約やプライバシーポリシーなどは、各人の責任で同意してください
wordpressプラグインの「Smart Custom Fields（SCF）」の出力方法

## 繰り返しなしの出力

### テキスト

```出力.php
// Smart Custom Fields　の値を呼びだす
// SCF::get( '設定した名前' )
<?php 
$text= SCF::get( 'text' );
echo $text;
?>
```

### 画像

画像のURLを取得してimgタグに出力する

```出力.php
<?php 
// SCF::get_post_meta($post->ID, '設定した名前', 画像サイズ)
 $img = get_post_meta($post->ID, 'img', true);
?>
<img src="<?php echo wp_get_attachment_url($img) ?>" alt="">
```

### 入力された値がない場合
投稿画面から入力されてない場合は「div」ごと表示しない

```出力.php
テキストを呼び出し
<?php $text= SCF::get( 'text' );?>

<?php if(!empty($text)):?>
	<div>
		<?php echo $text; ?>
	</div>
<?php endif;?>


画像を呼び出し
<?php $img = get_post_meta($post->ID, 'img', true);?>

<?php if(!empty($img)):?>
	<div>
		<img src="<?php echo wp_get_attachment_url($img) ?>">
	</div>
<?php endif;?>


画像を呼び出し（繰り返し時）
グループ配列を呼び出して、ファイル名がない場合は出力しない処理
<?php $img_group = SCF::get( '繰り返すグループ名' );?>
<?php $img_group = SCF::get( 'img_group' );?>

<?php if(!empty($field_group[0]['img'])):?>
	<div>
		<?php
		foreach ( $field_group as $fields ) {
			$image = get_post_meta($post->ID, 'img', true);
			$imageItem = wp_get_attachment_image_src($image, 'thumbnail');
			?>
			<img src="<?php echo wp_get_attachment_url($imageItem) ;?>">
			<?php } ?>
		</div>
<?php endif;?>
```



## 繰り返しありの出力


### 画像

画像を繰り返すグループ名（配列）を呼び出して、foreachでimgごとのURLを出力する

```出力.php
<?php 
// SCF::get( '繰り返すグループ名' )
 $img_group = SCF::get( 'img_group' );

foreach ( $img_group as $fields ) {

// get_post_meta($post->ID, '設定した名前', 画像サイズ);
$img = get_post_meta($post->ID, 'img', true);
$imageItem = wp_get_attachment_image_src($img, 'thumbnail');
?>

<img src="<?php echo wp_get_attachment_url($imageItem[0]) ;?>">

<?php } ?>

```
たまに使うDOSコマンドまとめ


たまにしか使わないので、覚えるほどではない（覚えていない）コマンドをまとめます。
なんかこれ、前も調べたな…みたいなものをまとめたいです。
※随時追加予定です。

## ファイルを結合する
大量のcsvファイルなどをまとめます

```
>type data\aaa.csv
1111,2222,3333

>type data\bbb.csv
1111,2222,3333

>type data\*.csv > output.csv

>type output.csv
1111,2222,3333
1111,2222,3333
```

ポイントは入力ファイルと同じフォルダに出力ファイルを作成すると、作成途中のファイルも対象に含まれてしまい、期待した結果とならないことです。
ワイルドカードに一致しないように、拡張子を変えるか、出力ファイルのフォルダを別にします。

## 参考
手軽にファイルウォッチと変更時に走るコマンド定義できるWatchの紹介

golang でTDDしようと思ってあれこれ調べてたら見つけました
gulpとかgruntよりも手軽にファイルウォッチャーが使えます

## Watch(ファイルウォッチャー)の追加

`$ go get github.com/eaburns/Watch`
`$ cd projectDir/`
`$ Watch -t go test`

これでファイルの変更時にgo testが走るので
いちいちテストコマンドを打たなくて済む

エディター内のターミナルで立ち上げておけば
開発が多少楽になるんじゃないかと

## 参考
http://go-talks.appspot.com/github.com/campoy/todo/talk/talk.slide#1
Puppeteerを使って指定したDOMのみのスクリーンショットを取得する

噂のHeadless Chrome ライブラリ `Puppeteer` を使って
指定したDOMのみのスクリーンショットを取得してみました。

実は以前同じことを `Nigthmare.js`を使ってやろうとしたのですが
うまく行かず諦めてしまいましたが
`Puppeteer`で試してみたらすんなり実現できました :ok_hand:

# コード

```js:app.js
const puppeteer = require('puppeteer');

(async () => {
  const browser = await puppeteer.launch({headless: true});
  const page = await browser.newPage();

  const targetElementSelector = '#tw-container'

  await page.goto('https://google.co.jp')
  await page.type('pupperteer 翻訳')
  await page.click('#tsf > div.tsf-p > div.jsb > center > input[type="submit"]:nth-child(1)')

  await page.waitForSelector(targetElementSelector)

  await page.screenshot({path: 'page-ss.png'})

  const clip = await page.evaluate(s => {
    const el = document.querySelector(s)
    
    // エレメントの高さと位置を取得
    const { width, height, top: y, left: x } = el.getBoundingClientRect()
    return { width, height, x, y }
  }, targetElementSelector)

  // スクリーンショットに位置と大きさを指定してclipする
  await page.screenshot({ clip, path: 'tw-container-ss.png' })

  browser.close();
})();

```

googleで`puppeteer 翻訳` と検索し、
検索結果画面の翻訳結果を表示している部分のみのスクリーンショットを取得するコードになります

~~ウィンドウのスクロールはAPIでは提供されていないようなので
evalueate 内で実行しています~~

(2017/09/18 追記)
@akameco さんにコメントで情報いただいて
画面内でスクロールさせて大きさを変更するのではなく
スクリーンショットから指定したDOMの位置と大きさを指定するように
修正しました。

参考: http://qiita.com/akameco/items/2bb90da68deb0e67d9a2#_reference-d4735b07e7ac27ea55b4

# 取得したスクリーンショット

|▽page-ss.png|▽tw-container-ss.png|
|:----------:|:-----------:|
|![page-ss.png](https://qiita-image-store.s3.amazonaws.com/0/55219/2469b046-1102-5f53-50f5-9244d5904462.png)|![tw-container-ss.png](https://qiita-image-store.s3.amazonaws.com/0/55219/faf5f62b-405f-e37e-8584-491f1c0fcb07.png)|


指定したところだけキレイにスクリーンショットがとれています:sparkles:
(~~どうでもいいですけどpuppeteerの日本語訳かっけぇ!~~)
【WSL】ApacheやSSHなどサービスが起動しない【Bash on Ubuntu on Windows】

Windows10上で簡単にUbuntu環境が扱えて、Apache等コマンドライン上で動作するソフトウェアなら多くのパッケージが動くなど何かと話題のこれ、ハマりました。

# 問題概要
下記のようにApacheやSSHなど各種サービスが起動できない。

```bash:Apacheのエラーの例
$ sudo apachectl start
[sudo] userのパスワード：
apache2: ../sysdeps/posix/getaddrinfo.c:2603: getaddrinfo: Assertion `IN6_IS_ADDR_V4MAPPED (sin6->sin6_addr.s6_addr32)`
failed.
Action 'start' failed.
The Apache error log may have more information.
```

# ネット上の情報
- UbuntuのIPv6を無効にしてみたら
- Windows側のIPv6を無効にしてみたら
- Windows側のVMwareやVirutalBoxのアダプタ無効にしたら動いた
- （中国国内で中国製の）VPNソフトウェアを消したら動いた
- （中国国内で中国製の）ウイルス対策ソフトウェアを無効にしたら動いた
- ファイアウォールを無効化
- **クリーンインストールで直った**

クリーンインストールという手段は試したくなかったものの、結局どれもうまくいかず、PCのリフレッシュを行ったら動くようになった。

# 原因
やはりネットワーク関連のソフトウェアが不具合を引き起こしているらしく、自分の環境ではnetworxという通信速度・通信量測定のソフトウェアが原因だった。これをインストールした瞬間に上記のエラーを吐くようになり、アンインストールで改善した。
初めてWSLを使った人がこのエラーに出会ったら、ドライバを必要とするソフトウェアを中心にネットワーク関連のソフトウェアをあぶり出して一つずつアンインストール→確認するしかないかもしれない。

にしても、殆どネイティブ動作と変わらない速度でUbuntuが小窓で動くのは楽しいですね！！
PythonでDI(Dependency Injection)

# PythonでDIする
需要はなさそうですが、たまたまPythonでDIする方法を調べたので、、、

## いくつかの選択肢
- [Injector](https://github.com/alecthomas/injector)
(ドキュメントは[こちら](http://injector.readthedocs.io/en/latest/api.html#injector.ClassProvider))
- [Inject](https://github.com/ivankorobkov/python-inject)
([日本語の記事](http://qiita.com/ledmonster/items/3b108be6f0967bfe1093)がありました)
- [siringa](https://github.com/h2non/siringa)(ドキュメントは[こちら](http://siringa.readthedocs.io/en/latest/examples.html))
- [di-py](https://github.com/telefonicaid/di-py)

Injectは２０１５年で開発が止まっているようです。
di-pyはあまりドキュメントが充実していないようです。
siringaは型ヒントをごにょごにょしてInjectするちょっと変態チックなやり方だったので避けました。

消去法でInjectorを試してみました。

## Injectorの特徴
ドキュメントでも説明されてますが、[Google Guice](https://github.com/google/guice)ライクなフレームワークになっています。
Google Guiceの説明はこの方の記事がわかりやすかったです。
[Google Guice 使い方メモ](http://qiita.com/opengl-8080/items/6fb69cd2493e149cac3a)

InjectやModule、Providerなどの用語もGoogle Guiceとほぼ同じなので、先にGuiceを理解する方がわかりやすいかもしれません。
(やはり型ヒントがあるとはいえ、スクリプト言語でDIをするのは理解するまでがしんどかったです)

## 実装例
###インスタンスをDIする
```py3:todo_usecase.py

@singleton
class TodoUseCase:

    def register(self, todo: Todo) - > None:
        print("call todo_usecase.register")

```
```py3:todo_controller.py

@singleton
class TodoController:

    @inject
    def __init__(self, todo_usecase: TodoUseCase) -> None:
        self.todo_usecase = todo_usecase

    def create_todo(self, todo: Todo) -> None:
        self.todo_usecase.register(todo)

if __name__=='__main__':
    injector = Injector()
    todo_controller: TodoController = injector.get(TodoController)

    todo: Todo = Todo()

    todo_controller.create_todo(todo)
```
通常のインスタンスをDIする場合は`@Inject`だけで勝手にDIしてくれます。
デフォルトではシングルトンではなく、`@singleton`を付与することでシングルトンになるらしいです。(Guiceもデフォルトではシングルトンではない)

###実装クラスのインスタンスをDIする
```py3:todo_repository.py

class TodoRepository:

    @abstractmethod
    def register(self, todo: Todo) -> None:
        raise NotImplementedError

```
```py3:todo_datasource.py

class TodoDataSource(TodoRepository):

    def register(self, todo: Todo) -> None:
        print("call todo_datasource.register")

```
```py3:todo_usecase.py

@singleton
class TodoUseCase:

　　　　　　　　@inject
    def __init__(self, todo_repository: TodoRepository) -> None:
        self.todo_repository = todo_repository

    def register(self, todo: Todo) -> None:
        self.todo_repository.register(todo=todo)

class TodoDIModule(Module):
    def configure(self, binder):
        binder.bind(TodoRepository, to=TodoDataSource, scope=singleton)

if __name__=='__main__':
    injector = Injector([TodoDIModule()])
    todo_use_case: TodoUseCase = injector.get(TodoUseCase)

    todo: Todo = Todo()

    todo_use_case.register(todo)
```
ポイントはModuleの実装クラスでDIの設定をするところです。
シングルトンにする方法はModuleでscopeを指定することでもできるらしいです。

以上です。
[Objective-C]NSDictionaryに添字アクセスした際にクラッシュする

Objective-CでiOSアプリを作ってる時にサーバからJSON形式で渡されて来たデータをNSDictionaryに保管したのち、添字アクセスでデータを取り出そうとしたら暗黙的に型変換がおきてクラッシュするという事象が確認できた。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/129665/79be33a1-76bb-6c7a-a940-cbcb835cfe3c.png)

- 該当のソース

``` 
// コールバックでJSONデータ受信
- (void)onReceived:(NSDictionary *)dict {
    NSDictionary *dataDict = dict[@"data"];
    NSArray *data1         = dataDict[@"data1"];
    NSArray *data2         = dataDict[@"data2"];
                                       ・
                                       ・
                                       ・
```
このdict[@"data"]をdataDictに添字アクセスで格納しようとすると、勝手にNS(CF)Stringとして暗黙変換されてしまい、NSStringにobjectForKeyedSubscriptなんてメソッドはないからそこでunrecognized selectorエラーで落ちる。
※必ず落ちるわけではないのがこれがまた厄介。

そこで、添字アクセスをやめてみたら該当のエラーが発生しなくなった。

```
// コールバックでJSONデータ受信
- (void)onReceived:(NSDictionary *)dict {
    NSDictionary *dataDict = (NSDictionary *)[dict objectForKey:@"data"];
    NSArray *data1         = (NSArray *)[dataDict objectForKey:@"data1"];
    NSArray *data2         = (NSArray *)[dataDict objectForKey:@"data2"];
                                       ・
                                       ・
                                       ・
```

原因はわからないが、公式の言語仕様である添字アクセスでこういうバグは辛い。
個人的には「とりあえずやってみる精神の塊」であるObjective-Cは好きだが、余計なことはしないでほしいと痛切に思った。

原因を知ってる方がいらっしゃいましたらぜひ教えてください。
Scalaをはじめる

Scala流行ってるらしい。
ということで、Scalaをはじめてみる。

Scalaをはじめるのってややこしそうって思ってたけど、全然楽だった。
一応備忘録的に書き残しておく。

# 環境
OSはWindows10 x64 Pro。
開発環境としては、IntelliJを使うか、コマンドラインでsbt(Scala build tool)を使うみたい。
僕はVisual Studio Codeがお気に入りなので、sbtで環境構築をする。

手順は基本的に以下の通り。
https://www.scala-lang.org/download/

# 環境構築
## JDKインストール
JDKをインストールする。バージョンは1.8以上が必要になる。
パスとか通しておくこと。
http://www.oracle.com/technetwork/java/javase/downloads/index.html

下記でバージョンを確認できる。

```
javac -version
```

## sbtインストール
sbtをインストールする。
下記からインストーラーを取得し、インストールする。
僕が入れたときは、バージョンは0.13.13だった。(インストーラーは0.13.16って書いてあった)
http://www.scala-sbt.org/0.13/docs/Installing-sbt-on-Windows.html

下記でバージョンを確認できる。

```
sbt sbt-version
```

## VSCodeの拡張機能インストール
VSCodeのScalaの拡張機能をインストールする。
今回は「Scala Language Server」をインストールした。

# プロジェクト作成
プロジェクトを作成するディレクトリに移動する。

下記を実行する。

```
sbt new sbt/scala-seed.g8
```

しばらくすると、「name [My Something Project]:」と表示されるので、プロジェクト名を入力する。
入力したプロジェクト名のディレクトリが追加される。

# 実行
プロジェクト名のディレクトリに移動する。
下記を実行し、VS Codeを起動する。

```
code .
```

src/main/scala/example以下に、ひな形のHello.scalaが存在している。

VS Codeのターミナルで、プロジェクト名のディレクトリに移動する。
下記を実行する。

```
sbt
```

しばらくすると入力を受け付けるようになるので、下記を実行する。

```
run
```

下記が表示されていれば成功。

```
[info] Running example.Hello
hello
```

下記で終了する。

```
exit
```
Djangoの初期データ投入機能についてメモ


## fixture というものがある

詳しくはここ[Djangoのドキュメント](https://docs.djangoproject.com/en/1.11/howto/initial-data/)

JSON, XML, YAMLで書ける

## 使い方

### 1. このような構造にする

```
.
└── mysite
    ├── db.sqlite3
    ├── manage.py
    ├── mysite
    │   ├── settings.py
    │   ├── urls.py
    │   └── wsgi.py
    └── polls
        ├── __init__.py
        ├── admin.py
        ├── apps.py
        ├── migrations
        ├── models.py
        ├── templates
        ├── tests.py
        ├── urls.py
        ├── views.py
        └── fixtures # 追加
```

### 2. fixturesディレクトリに投入したいデータを書いたJSONファイル追加

```
fixtures
├── data1.json
├── data2.json
├── data3.json
└── data4.json
```

### 3. loaddata を使って読み込む

```python
$ python manage.py loaddata polls/fixtures/data1.json
```

### 4. 反対にDBのデータを出力したいときは dumpdata を使う

```python
$ python manage.py dumpdata --indent=2 --format=json polls.modelname > polls/fixtures/data.json
```

日本語が含まれている場合、エスケープされてしまうので、エスケープされたままだと困る場合は変換する必要がある。
Cloud9でpython3を動かす時にやっておきたいこと


何かちょっとしたものを試作する時によくcloud9( https://c9.io/ )にお世話になっているのですが、期間が空いてしまうと初期設定の手順を忘れてしまうので忘備録としてまとめます。

# 注意事項
- このメモは2017/08/31時点のCloud9(Version 3.1.3765)を対象にしています。
    - (Cloud9のバージョンは画面上部のメニュー[Cloud9]→[About Cloud9]から確認できます。)
- https://c9.io/new にてテンプレート:Pythonを選んだ場合の設定手順を書いています。Blank、Django等他のテンプレートを選んだ場合については特別考慮していません。
- **AWS版cloud9と設定が異なる箇所があります。**
   - AWS版を利用される際はこちらの記事を参照願います。[[バッドノウハウ]webプログラミング初学者がAWS Cloud9でPython3を使う](https://qiita.com/h008/items/f3e3faeab9271ed0a1df)

# 初期設定としてやっていること

以下、workspaceをテンプレート:Pythonで新規作成してからの作業内容です。

## workspaceの設定をpython3向けに切り替える
 画面上部のメニュー[Cloud9]→[Preferences]、または[Ctrl]+[,]からworkspaceの設定を開き、  [PROJECT SETTINGS]→[Python Support]と選び、[Python Version]を"Python 3"に切り替えます(下図参照)。
  ![workspace.png](https://qiita-image-store.s3.amazonaws.com/0/199752/c83b9763-f4a8-53ef-b0b0-78832b574157.png)
  
## リンクをpython2->python3に切り替える
cloud9のデフォルトはpython2なのでpython3に切り替えます。

``` bash:デフォルトのpython,pipの状態
$ python --version
Python 2.7.6
$ which python
/usr/bin/python
$ readlink -f /usr/bin/python
/usr/bin/python2.7
$ pip --version
pip 1.5.4 from /usr/lib/python2.7/dist-packages (python 2.7)
```

``` bash:python3へのリンク張替え
$ sudo mv /usr/bin/python /usr/bin/python2
$ sudo ln -s /usr/bin/python3 /usr/bin/python
```

``` bash:変更後のpython,pipの状態
$ python --version
Python 3.4.3
$ readlink -f /usr/bin/python
/usr/bin/python3.4
$ pip --version
pip 1.5.4 from /usr/lib/python3/dist-packages (python 3.4)
```
python3になっていることが確認できました！

## pipをキレイにする(optional)
いっぱい用意されていても(下記参照)使わないものも多いので、僕の場合はpipを一度空にしてから作業しています。

```txt:requirements.txt(初期設定)
Pillow==2.3.0
chardet==2.2.1
colorama==0.2.5
decorator==3.4.0
html5lib==0.999
ipython==1.2.1
matplotlib==1.3.1
nose==1.3.1
numpy==1.8.2
pycurl==7.19.3
pygobject==3.12.0
pyparsing==2.0.1
python-apt==0.9.3.5ubuntu2
python-dateutil==2.0
pytz==2012c
requests==2.2.1
scipy==0.13.3
simplegeneric==0.8.1
six==1.5.2
tornado==3.1.1
unattended-upgrades==0.1
urllib3==1.7.1
wheel==0.24.0
```

```bash:pipをキレイにする
sudo pip install --upgrade pip
pip freeze > requirements.txt
sudo pip uninstall -r requirements.txt
```

# まとめ
cloud9でpython3を実行するためにworkspaceの設定とpythonのリンクを張り替えました。また、必要に応じてpipの中身を空にしました。

# 備考
pipをキレイにするならテンプレートをBlankして始めた方が良いかもしれません。
Angular4(over2~)のロケールとPipe

# Angular4(over2~)のロケール


## ローケルとは
> ロケールとは、ソフトウェアに内蔵される、言語や国・地域ごとに異なる単位、記号、日付、通貨などの表記規則の集合。または単に、利用する言語や国・地域の指定。多くのソフトウェアやプログラミング言語は、使用する言語とともにロケールを設定し、ロケールで定められた方式に基づいてデータの表記や処理を行う。

引用元 : [ロケール（ロカール）とは - IT用語辞典](http://e-words.jp/w/%E3%83%AD%E3%82%B1%E3%83%BC%E3%83%AB.html)

つまり、各国・地域などによって異なる諸々の表記方法であり、今回はこれを設定する。

## ローケルとPipe
Angularの[Pipe](https://angular.io/guide/pipes)では、このローケルの設定によって、処理結果が異なるものが多々存在する。

## DatePipe
[DatePipe](https://angular.io/api/common/DatePipe)もローケルの設定によって、処理結果が変わるPipeの1つである。
例えば、ロケールを設定しないで、以下のコードを実行する。

```js:app.component.ts
import {Component} from '@angular/core';

@Component({
  selector: 'app-root',
  template: `<p class="today">
本日は、{{today | date}} だ
</p>
`,
  styles: [`
.today{background-color:yellow}
`]
})
export class AppComponent {
  today = Date.now();
}
```

すると、表示される画面は以下のようになる。
![スクリーンショット 2017-08-30 13.01.34.png](https://qiita-image-store.s3.amazonaws.com/0/145611/ce49e744-bb57-8c62-8dc8-e035b6a9420c.png)



### Angularのアプリケーションにロケールを設定する
[LOCALE_ID](https://angular.io/api/core/LOCALE_ID)を使用し、アプリケーションにロケールを設定する。
LOCALE_IDをprovideする際にuseValueでLocaleIdを与えると、アプリケーションのロケールがLocaleIdで渡されたものに設定される

### 実際にやってみた
今回は、ロケールを日本に設定してみる。
app.module.tsのproviderでLOCALE_IDをprovideする際にuseValueで与えるLocaleIdを `ja-JP` (日本)にする。
実際のコードは以下。

```js:app.module.ts
import {BrowserModule} from '@angular/platform-browser';
import {NgModule, LOCALE_ID} from '@angular/core';
import {AppComponent} from './app.component';

@NgModule({
  declarations: [
    AppComponent
  ],
  imports: [
    BrowserModule],
  providers: [{provide: LOCALE_ID, useValue: 'ja-JP'}],
  bootstrap: [AppComponent]
})
export class AppModule {
}
```

componentは先ほどと変わらず以下のようなものにする。

```js:app.component.ts
import {Component} from '@angular/core';

@Component({
  selector: 'app-root',
  template: `<p class="today">
本日は、{{today | date}} だ
</p>
`,
  styles: [`
.today{background-color:yellow}
`]
})
export class AppComponent {
  today = Date.now();
}
```

#### 実行結果
実行すると以下のようになり、ロケールが日本になったため、同じコードでもDataPipeで変換された後の値が変化していることがわかる。

![スクリーンショット 2017-08-30 13.16.31.png](https://qiita-image-store.s3.amazonaws.com/0/145611/14b61ce0-65d2-f8a6-cd63-8135599e0aa2.png)


## 参考文献
山田 祥寛(2017/8/4)『Angularアプリケーションプログラミング』 技術評論社

## 参考にさせていただいたサイト
 [ロケール（ロカール）とは - IT用語辞典](http://e-words.jp/w/%E3%83%AD%E3%82%B1%E3%83%BC%E3%83%AB.html)
[Angular - Pipes](https://angular.io/guide/pipes)
[DatePipe](https://angular.io/api/common/DatePipe)
[LOCALE_ID](https://angular.io/api/core/LOCALE_ID)

※ ブログでも同一の投稿を行っている
[Angular4(over2~)のロケールとPipe](http://sekky0905.hatenablog.com/entry/2017/08/31/Angular4%28over2~%29%E3%81%AE%E3%83%AD%E3%82%B1%E3%83%BC%E3%83%AB%E3%81%A8Pipe)
WordPressで詰まったことメモ


## 発生した問題
+ 自作テーマを作っている時、なぜか更新が反映されなかった

## やったこと
+ キャッシュ系のプラグインを入れているか確認した
	+ 入れていなかった
+ クッキーを削除してみた
	+ 反映されず
+ キャッシュを消してみた
	+ 無事反映された

## まとめ
+ 更新ボタン押しても更新されなかったらキャッシュ消す
pandasで複数ラインプロットするときのTips

## はじめに
毎回調べるので。

`subplots=True` のときにax配列渡すとよしなにサブプロットしてくれるのと、 `cmap` 指定でラインごとに色変えるとかはあんまり情報出てこないので、誰かの役に立つかも。

## よくつかうやつ
```py
import matplotlib.pyplot as plt
from matplotlib import cm

_, ax = plt.subplots(2,1, figsize=(16, 8))
df.plot(
    grid=True, # グリッドつける
    style='-', # ラインスタイルの指定
    cmap=cm.tab20, # ラインのcolormapを変更
    subplots=True, # ラインごとにsubplotを分ける
    ax=axes, # カラム数とlen(axes)があっていれば、よしなにサブプロットしてくれる
)
plt.show()
```

## カラーマップ
- [color example code: colormaps_reference.py — Matplotlib 2.0.2 documentation](https://matplotlib.org/examples/color/colormaps_reference.html)

## 追記

- `cm.tab20` の代わりに `cm.get_cmap("tab20")` が使える。
- `plt.plot` 等のcolorでは `cm.tab20.colors[n]` が使える。
ちょっとずつ読むドメイン駆動設計 第一部 ドメインモデルを機能させる 第ニ章 コミニュケーションと言語の使い方1

# コミュニケーションに関わるすべてにモデルを浸透させる

> - ドメインモデルは、ソフトウェアプロジェクトにおける共通言語のコアとなることができる。
> - モデルを最大限に有効活用するには、コミュニケーションのためのあらゆる媒体にモデルを浸透させる必要がある。
>
> (第二章 序文より)

モデルとは何か、ということは[第一章で説明](http://qiita.com/YasuhiroKimesawa/items/386b43d684518656fd10)されていました。
モデルはある問題を解決するために抽象化されたものであり、それは実装とは切り離せないものでもあるので、自ずとプロジェクトにおける、コミュニケーションに関わるすべてにモデルの用語が登場するということですね。

と、わかっていてもなかなか難しいこともあると思います。
別ドメインの同義語を使ったり、製品名を使ったり、似た言葉だがちょっと意味の異なる言葉を使ったり・・・

最近感じているコツなのですが、
- **全員いる場で学習し、合意する**
- **合意した、してもらったふりをしない**

上記のことを守ると、自然とモデルの用語が会話のなかでも使われると実感しています。

きちんと全員で学習しないと、ソースコード上では使われるけど、会話には出てこないので、実装と概念が乖離していく。
そうすると、会話から該当のソースコードが思い浮かばず、ビジネスのルールなどは毎度ソースコードを調べてこうなってます(そしてそれが正しいかはわからない)みたいな複雑な会話になる。。。ということに陥りやすいです。

ですので、まず全員のいる場で「違和感」がないことをきちんと合意し、モデルにする。それだけで、結構会話の中でもモデルの用語が出てきます。

なので、**コミュニケーションにモデルが必要というよりは、モデルのためにコミュニケーションが必要**という感じがしています。

コミュニケーションに関わるすべてにモデルを浸透させるには、コミュニケーションが必要
【VBA】セルおよびフォントの配色

|ColorIndex|配色|16進数|RGB関数|
|:--|:--|:---|:---|:--|
|1|黒|#000000|RGB(0,0,0)|0|
|2|白|#FFFFFF|RGB(255,255,255)|16777215|
|3|赤|#FF0000|RGB(255,0,0)|255|
|4|明るい緑|#00FF00|RGB(0,255,0)|65280|
|5|青|#0000FF|RGB(0,0,255)|16711680|
|6|黄|#FFFF00|RGB(255,255,0)|65535|
|7|ﾋﾟﾝｸ|#FF00FF|RGB(255,0,255)|16711935|
|8|水色|#00FFFF|RGB(0,255,255)|16776960|
|9|濃い赤|#800000|RGB(128,0,0)|128|
|10|緑|#008000|RGB(0,128,0)|32768|
|11|濃い青|#000080|RGB(0,0,128)|8388608|
|12|濃い黄|#808000|RGB(128,128,0)|32896|
|13|紫|#800080|RGB(128,0,128)|8388736|
|14|青緑|#008080|RGB(0,128,128)|8421376|
|15|25%灰色|#C0C0C0|RGB(192,192,192)|12632256|
|16|50%灰色|#808080|RGB(128,128,128)|8421504|
|17|ｸﾞﾚｰ|#9999FF|RGB(153,153,255)|16751001|
|18|ﾌﾟﾗﾑ|#993366|RGB(153,51,102)|6697881|
|19|ｱｲﾎﾞﾘｰ|#FFFFCC|RGB(255,255,204)|13434879|
|20|薄い水色|#CCFFFF|RGB(204,255,255)|16777164|
|21|濃い紫|#660066|RGB(102,0,102)|6684774|
|22|ｺｰﾗﾙ|#FF8080|RGB(255,128,128)|8421631|
|23|ｵｰｼｬﾝﾌﾞﾙｰ|#0066CC|RGB(0,102,204)|13395456|
|24|ｱｲｽﾌﾞﾙｰ|#CCCCFF|RGB(204,204,255)|16764108|
|25|濃い青|#000080|RGB(0,0,128)|8388608|
|26|ﾋﾟﾝｸ|#FF00FF|RGB(255,0,255)|16711935|
|27|黄|#FFFF00|RGB(255,255,0)|65535|
|28|水色|#0000FF|RGB(0,255,255)|16776960|
|29|紫|#800080|RGB(128,0,128)|8388736|
|30|濃い赤|#800000|RGB(128,0,0)|128|
|31|青緑|#008080|RGB(0,128,128)|8421376|
|32|青|#0000FF|RGB(0,0,255)|16711680|
|33|ｽｶｲﾌﾞﾙｰ|#00CCFF|RGB(0,204,255)|16763904|
|34|薄い水色|#CCFFFF|RGB(204,255,255)|16777164|
|35|薄い緑|#CCFFCC|RGB(204,255,204)|13434828|
|36|薄い黄|#FFFF99|RGB(255,255,153)|10092543|
|37|ﾍﾟｰﾙﾌﾞﾙｰ|#99CCFF|RGB(153,204,255)|16764057|
|38|ﾛｰｽﾞ|#FF99CC|RGB(255,153,204)|13408767|
|39|ﾗﾍﾞﾝﾀﾞｰ|#CC99FF|RGB(204,153,255)|16751052|
|40|ﾍﾞｰｼﾞｭ|#FFCC99|RGB(255,204,153)|10079487|
|41|薄い青|#3366FF|RGB(51,102,255)|16737843|
|42|ｱｸｱ|#33CCCC|RGB(51,204,204)|13421619|
|43|ﾗｲﾑ|#99CC00|RGB(153,204,0)|52377|
|44|ｺﾞｰﾙﾄﾞ|#FFCC00|RGB(255,204,0)|52479|
|45|薄いｵﾚﾝｼﾞ|#FF9900|RGB(255,153,0)|39423|
|46|ｵﾚﾝｼﾞ|#FF6600|RGB(255,102,0)|26367|
|47|ﾌﾞﾙｰｸﾞﾚｰ|#666699|RGB(102,102,153)|10053222|
|48|40%灰色|#969696|RGB(150,150,150)|9868950|
|49|濃い青緑|#003366|RGB(0,51,102)|6697728|
|50|ｼｰｸｸﾞﾘｰﾝ|#339966|RGB(51,153,102)|6723891|
|51|濃い緑|#003300|RGB(0,51,0)|13056|
|52|ｵﾘｰﾌﾞ|#333300|RGB(51,51,0)|13107|
|53|茶|#993300|RGB(153,51,0)|13209|
|54|ﾌﾟﾗﾑ|#993366|RGB(153,51,102)|6697881|
|55|ｲﾝﾃﾞｨｺﾞ|#333399|RGB(51,51,153)|10040115|
|56|80%灰色|#333333|RGB(51,51,51)|3355443
【VBA】よく使う型

|型名|型名指定文字|格納できるデータ|
|:--|:--|:---|
|ブール型|Boolean|TrueまたはFalse|
|バイト型|Byte|0～255までの整数|
|整数型|Integer|-32,768～32,767の整数|
|長整数型|Long|-2,147,483,648～2,147,483,647の整数|
|通貨型|Currency|-922,337,203,685,477.5808～922,337,203,685,477.5807の固定小数点数|
|単精度浮動小数点数型|Single|負の値：約-3.4×10(38乗)～-1.4×10(-45乗)、正の値：約1.4×10(-45乗)～1.8×10(38乗)|
|倍精度浮動小数点数型|Double|負の値：約-1.8×10(308乗)～-4.0×10(-324乗)、正の値：約4.9×10(-324乗)～1.8×10(308乗)|
|日付型|Date|日付：西暦100年1月1日～西暦9999年12月31日、時刻：0:00:00～23:59:59|
|文字列型|String|任意の長さの文字列|
|オブジェクト型|Object|オブジェクト|
|バリアント型|Variant|すべてのデータ|
bip32のパスメモ

# bip32 wallet

m / account' / change / address_index

```:例
m/0'/0/0
```

# bip44 wallet

m / purpose' / coin_type' / account' / change / address_index

```:例
m/44'/0'/0'/0/0
```



# P2WPKH(segwit)

m / purpose' / coin_type' / account' / change / address_index

```:例
m/49'/0'/0'/0/0
```
Docker コンテナ上で wkhtmltopdf を動かす

# はじめに
HTML を PDF に変換してくれる [wkhtmltopdf](https://wkhtmltopdf.org/) は便利ですがインストールがちょっと面倒です。そこで Docker で動かせたら便利そうだなと思い、試してみました。

# 方法

まず `Dockerfile` と `docker-compose.yml` を用意します。

```Dockerfile:Dockerfile
FROM ubuntu:14.04

RUN apt-get update -qq \
 && apt-get install -y \
      build-essential \
      xorg \
      libssl-dev \
      libxrender-dev \
      wget \
      unzip \
      gdebi \
 && apt-get autoremove \
 && apt-get clean

WORKDIR /opt

# wkhtmltopdf をインストールする。
ENV WKHTMLTOPDF_VERSION 0.12.4
RUN wget https://github.com/wkhtmltopdf/wkhtmltopdf/releases/download/${WKHTMLTOPDF_VERSION}/wkhtmltox-${WKHTMLTOPDF_VERSION}_linux-generic-amd64.tar.xz
RUN tar vxfJ wkhtmltox-${WKHTMLTOPDF_VERSION}_linux-generic-amd64.tar.xz \
 && ln -s /opt/wkhtmltox/bin/wkhtmltopdf /usr/bin/wkhtmltopdf

# 日本語フォントとして Noto Fonts をインストールする。
RUN wget https://noto-website.storage.googleapis.com/pkgs/Noto-unhinted.zip \
 && unzip -d NotoSansJapanese Noto-unhinted.zip \
 && mkdir -p /usr/share/fonts/opentype \
 && mv -fv ./NotoSansJapanese /usr/share/fonts/opentype/NotoSansJapanese \
 && rm -rfv Noto-unhinted.zip \
 && fc-cache -fv
```

```docker-compose.yml
version: '3.3'
services:
  wkhtmltopdf:
    build: .
    volumes:
      - .:/opt/data-volume
    working_dir: /opt/data-volume
    entrypoint:
      - wkhtmltopdf
    command:
      - -h
```

そしてイメージをビルドした後 (非常に時間がかかります :sweat_drops:) 、コンテナ内で `wkhtmltopdf` を実行します。なお、わざわざ `docker-compose` を利用しているのは、コンテナ起動時のボリュームの指定などをコマンドライン引数で指定するのではなく、設定ファイルに書いておきたかったためです。

```
$ docker-compose build
$ docker-compose run wkhtmltopdf http://www.google.com google.pdf
```

上記のコマンドを実行することで、カレントディレクトリに PDF が出力されます。日本語も正しく表示されています :tada:

![スクリーンショット 2017-08-31 18.50.23.png](https://qiita-image-store.s3.amazonaws.com/0/6697/1087d2b2-44c6-760d-bb18-44163cddf091.png)
フレームワークのバージョンアップ時に便利なsbt設定(エラーや警告が多すぎてコンソールが見難い対策)

play framework などをバージョンアップする際、とりあえず build.sbt などを修正した後 sbt のコンソールから `~test:compile` してエラーを治していくと思うのですが、大量に警告とエラーが出てスクロールするのが大変、ということがあるかと思います。そういうときは sbt のコンソールから

```scala
// エラー5件目で止める
set maxErrors := 5
// エラーしか表示しない（警告を表示しない）
set logLevel := Level.Error
// watchからの実行前に毎回画面をクリアする
set triggeredMessage := Watched.clearWhenTriggered
```

を実行しておくと、画面に表示される情報が抑止されていい感じになります。
OpsworksでRailsの変更が反映されない

# 背景

masterに変更を加えてopsworksからデプロイしたのに、何故が変更が反映されていませんでした。  
デプロイのstatusはsuccessfulになっているのに、どうして？・・・

# おそらくの原因

詳しくはわかっていませんが、unicornの古いプロセスがそのまま動いていました。  
てっきり削除されるものかと思ったんですが、何故こいつが生きていたのかは不明です。

# 対応方法

何はともあれ古いプロセスを削除しました。

```bash
$ ps aux | grep unicorn
deploy   11111  0.7  6.5 1111111 111111 ?      Sl   17:56   0:03 unicorn_rails master --env production --daemonize -c /srv/www/xxxxxxxx/shared/config/unicorn.conf
deploy   12222  3.3  9.8 1222222 222222 ?      Sl   18:02   0:03 unicorn_rails worker[1] --env production --daemonize -c /srv/www/xxxxxxxx/shared/config/unicorn.conf
deploy   13333  2.2  7.3 1333333 333333 ?      Sl   18:02   0:02 unicorn_rails worker[0] --env production --daemonize -c /srv/www/xxxxxxxx/shared/config/unicorn.conf
deploy   14444  0.0  0.1 1444444  9999 pts/3    S+   18:04   0:00 grep --color=auto unicorn
$ kill -QUIT 11111
```

そのあとにunicornを再起動しました。

```bash
$ /srv/www/xxxxxxx/shared/scripts/unicorn restart
```

これで解決しました。
ちゃんと変更が反映されました。

---

備忘録として残しておきます。
もし同じような現象に悩む人の役に立つことを祈ります。
BuddyPressのグループページでメンバーの拡張プロフィールの内容を出力する


WordPressなんて触ったことないのにサイトを作ることになって少しハマったのでメモ。

## BuddyPressのグループ（固定ページ）
BuddyPressの固定ページではメンバーが一覧表示されますが、
デフォルトでの表示項目は下記のみです。

- アバター画像
- 名前（メンバーの個人ページへのリンク）
- 最終ログイン

こんな感じ。
![スクリーンショット 2017-08-31 18.48.45.png](https://qiita-image-store.s3.amazonaws.com/0/29971/c7ba4220-b931-93f5-5b06-51eed1dc5631.png "スクリーンショット 2017-08-31 18.48.45.png")


## 拡張プロフィールの任意の内容の追加
BuddyPressでは拡張プロフィールで自由に項目を追加することが出来ます。
例えば「好きな食べ物」という項目を追加して、グループページのメンバー一覧に表示させます。

### テンプレートファイルの編集
下記のファイルを編集します。
`wp-content/plugins/buddypress/bp-templates/bp-legacy/buddypress/groups/single/members.php`


拡張プロフィールの「好きな食べ物」を表示するには下記のコードを追加します。

```php:members.php
<div><?php echo xprofile_get_field_data('好きな食べ物' ,bp_get_member_user_id()); ?></div>
```

こんな感じになります。
![スクリーンショット 2017-08-31 18.46.16.png](https://qiita-image-store.s3.amazonaws.com/0/29971/1f5c2963-cbb4-e57b-e70f-72fa6eac9112.png "スクリーンショット 2017-08-31 18.46.16.png")

あとはCSSを調整するなりして見た目を整えればOK。


## 注意点&質問
先に述べたファイルを直接書き換えると、プラグインをアップデートした時に上書きされてしまう気がする。
テンプレートの安全な編集方法ご存知の方はコメントいただけると幸いです。。
MacOSでJDK8が重い問題

# 背景

MacBook Pro (2016年Touch Barモデル)を使って、Eclipseで開発しているのですが、Java1.8の起動がめっちゃ遅い...。
私の場合、Spring BootでMaven -> Compile -> Tomcat Run -> Test のような事をやっているのですが、Tomcatの起動に時間がかかり過ぎちゃう。イライラ。
なんとかならないかなと思って調べていたら、解決する方法があったのでこの記事を書きました。

これの原因は、stackoverflowに情報がありますので、詳しくはそちらを参照してください。

InetAddress.getLocalHost() slow to run (30+ seconds)
https://stackoverflow.com/questions/33289695/inetaddress-getlocalhost-slow-to-run-30-seconds/40487173?stw=2#40487173

# 解決方法

ターミナルを起動して、Macのホスト名を確認します。

```MacBook-Pro:~ hogehoge$ hostname```
MacBook-Pro.local　←これが返ってきます

あとは、hostsファイルに ```MacBook-Pro.local``` を追記しましょう。
これだけで起動が速くなるはずです。

※ 以下は一例ですので、そのままコピペしないようにお願いします。

```text:/etc/hosts
127.0.0.1   localhost MacBook-Pro.local
::1         localhost MacBook-Pro.local
```


私が使っているJavaは以下の通りです。

```
$ java -version
java version "1.8.0_121"
Java(TM) SE Runtime Environment (build 1.8.0_121-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.121-b13, mixed mode)
```
PhpStormのDeployment>MappingsタブでLocal path '[my local path]' is out of project. と出てしまう。

PhpStormでは「ファイルに変更があった際にサーバ上のファイルを自動的に更新してくれる」という機能がある。

File>Settings>Deployment>Mappingsタブで

`▲！Local path '[my local path]' is out of project. `

というエラーが出るとき。

これは、Projectの対象範囲にそのディレクトリがないということなので、
File>Openで、プロジェクトにそのディレクトリを追加してやればよい。
AtomのSpecをjasmine2で動かす

いまだにAtomは、Specにjasmine1.3と使っています。
jasmineを覚えようと思いましたが、古い仕様を覚える気にはならないので最新バージョンを使える方法を調べました。
この記事では、CoffeeScriptを使わずにJavaScriptを使います。

# カスタムテストランナーとして`atom-jasmine2-test-runner`を登録

現状、jasmine2を動かすには、カスタムテストランナーとしてjasmine2を動かせるランナーを作って渡してやる必要があるようです。
自作のランナーを作成するのは大変なので既存のランナーを使います。
npmパッケージに[`atom-jasmine2-test-runner`](https://www.npmjs.com/package/atom-jasmine2-test-runner)がありますのでそれを使います。

一番簡単な使い方は、`package.json`に以下を記述することです。

```json:package.json
{
  "name": "my-package",
  // ...
  "atomTestRunner": "atom-jasmine2-test-runner",
  "devDependencies": {
    "atom-jasmine2-test-runner": "^1.1.2"
  }
}
```

package.jsonを上記のように更新したら、一度Atomを終了して再度`Dev mode`で開きなおしてください。
一度終了させるのは、`atom-jasmine2-test-runner`のドキュメントにもあるように`package.json`の内容がキャッシュされていて反映されない場合があるからです。
また、`Dev mode`で開くのは"devDependencies"を更新するためです。

`Dev mode`で開きなおしたらCommand Paletteから`Update Package Dependencies: Update`を実行し、外部依存関係を更新します。
これでjasmine2が動くようになります。

# 動作テスト

動作テストとして、specフォルダに以下のようなファイルを作ってやります。
(jasmineのintroduction.jsから取ってきましたが、ちょっと実行時間が長いです)
作成したらCommand Paletteから`Window: Run Package Specs`を実行することでSpecが動きます。
正常に終了したらjasmine2が動いています。

```javascript:spec/my-package-spec.js
describe("Asynchronous specs", function() {
  var value;

  beforeEach(function(done) {
    setTimeout(function() {
      value = 0;
      done();
    }, 1);
  });

  it("should support async execution of test preparation and expectations", function(done) {
    value++;
    expect(value).toBeGreaterThan(0);
    done();
  });

  describe("long asynchronous specs", function() {
    beforeEach(function(done) {
      done();
    }, 1000);

    it("takes a long time", function(done) {
      setTimeout(function() {
        done();
      }, 9000);
    }, 10000);

    afterEach(function(done) {
      done();
    }, 1000);
  });

  describe("A spec using done.fail", function() {
    var foo = function(x, callBack1, callBack2) {
      if (x) {
        setTimeout(callBack1, 0);
      } else {
        setTimeout(callBack2, 0);
      }
    };

    it("should not call the second callBack", function(done) {
      foo(true,
        done,
        function() {
          done.fail("Second callback has been called");
        }
      );
    });
  });
});
```

# パッケージをアクティベートする

参考: [How do I activate a package in specs?](https://discuss.atom.io/t/how-do-i-activate-a-package-in-specs/18766)

## no activateCommands

アクティベートコマンドが登録されていない場合は、以下のようになります。

```javascript
describe("package activation", () => {
  beforeEach((done) => {
    atom.package.activatePackage("package-name").then(done);
  });
  it("do some tests", () => {
    expect(true).toEqual(true);
  });
});
```

## have activateCommands

登録されている場合は、以下のようになります。
ここでは、`package-name:toggle`でアクティベートされるとします。

```javascript
describe("package activation", () => {
  beforeEach((done) => {
    let workspaceElement = atom.views.getView(atom.workspace);
    let activationPromise = atom.packages.activatePackage("package-name");
    atom.commands.dispatch(workspaceElement, "package-name:toggle");
    activationPromise.then(done);
  });

  it("do some tests", () => {
    expect(true).toEqual(true);
  });
});
```