OmniAICreator/Qiita-1.07M huggingface dataset:
docker-compose で Kafka の動作確認

docker-compose で Kafka の動作確認をしようとして、いつもハマるので基本的なやり方をメモしておく。

## 準備

ディレクトリを作って docker-compose.yml を書き込む。

```
$ mkdir kafka-test/
$ cd kafka-test/
$ vi docker-compose.yml
```

docker-compose.yml はこんな感じ。(`KAFKA_ADVERTISED_HOST_NAME` という環境変数の挙動がよく分かってなくていつもハマる。ちゃんと調べて理解しなきゃな…。)

```
version: '2'
services:
  zookeeper:
    image: wurstmeister/zookeeper
    ports:
      - "2181:2181"
  kafka:
    image: wurstmeister/kafka
    ports:
      - "9092"
    environment:
      KAFKA_ADVERTISED_HOST_NAME: 172.17.0.1
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
```

## Kafka/Zookeeper 起動

docker-compose up する。

```
$ docker-compose up -d
Creating network "kafkatest_default" with the default driver
Creating kafkatest_zookeeper_1
Creating kafkatest_kafka_1
```

ps でちゃんと立ち上がっていることを確認。

```
$ docker-compose ps
        Name                       Command               State                         Ports                        
-------------------------------------------------------------------------------------------------------------------
kafkatest_kafka_1       start-kafka.sh                   Up      0.0.0.0:32778->9092/tcp                            
kafkatest_zookeeper_1   /bin/sh -c /usr/sbin/sshd  ...   Up      0.0.0.0:2181->2181/tcp, 22/tcp, 2888/tcp, 3888/tcp
```

## 動作確認

ここでは公式のクイックスタートを参考に、基本的な操作を実行してみる。

トピック作成。

```
$ docker-compose exec kafka /opt/kafka/bin/kafka-topics.sh --create --zookeeper zookeeper:2181 --replication-factor 1 --partitions 1 --topic test
Created topic "test".
```

トピック一覧。

```
$ docker-compose exec kafka /opt/kafka/bin/kafka-topics.sh --list --zookeeper zookeeper:2181
test
```

メッセージ送信。

```
$ docker-compose exec kafka /opt/kafka/bin/kafka-console-producer.sh --broker-list kafka:9092 --topic test
test
test
test
```

メッセージ受信。

```
$ docker-compose exec kafka /opt/kafka/bin/kafka-console-consumer.sh --bootstrap-server kafka:9092 --tic test --from-beginning
test
test
test
```

以上です。

## 参考資料

* [Apache Kafka](https://kafka.apache.org/quickstart)
初めての英語での5分間のライトニングスピーチに備えてやった事3つ

Tech Talk Tokyoで登壇してきたのでメモ。
https://techtalktokyo.doorkeeper.jp/events/55361 
このイベントはテクノロジーを通して、
日本人のみならずエンジニアと交流を深めるというのが目的。

今回登壇する機会を頂いたので登壇した。
プレゼンの時間は5分。まさにライトニングトーク

# なぜプレゼンを引き受けたか。

　インプットだけでなくアウトプットする側になりたかった。
　サッと終わらせてフリータイムの時に質問と一緒に話しかけてもらえればラッキー。

# 資料
今回の資料の位置づけは資料自体がメインではなく、プレゼン自体がメイン。
資料はあくまでも補足として作った。
（その為、説明無しにプレゼン資料見ても、ただ絵が並んでるだけでよくわからないと思う）
http://www.slideshare.net/ssuser101a2f/transition-to-highspeed-wordpress-using-kusanagi

# 最初に考えたこと
いったい5分で何が話せるのか。

## 何について話すか。
むしろ言わないことを決めた。

- 詳しい話は言わない
   → ５分間のスピーチは概要に徹して、詳しい話はマンツーマンで話したい為。
- コードは出来る限り見せない
   → エンジニアじゃない人もいるかもしれない。
- 押し付けない
   →　あくまでも一つの提案として。多様性は重要。

## 避けたいこと。
　英語で失敗したくない。なるべくシンプルにまとめたい。

# 今回のテーマ
WORDPRESSを高速化した話にした。
幅広い選択肢があることを共有したい。

# 初めての英語での5分間のライトニングスピーチに備えてやった事3つ
- 5分の中の時間配分
　いったい5分で何が話せるのか。
　5分でざっと話すには、古典的なフレームワークであろう「起承転結」に乗っかった方が楽だ。
　
　現在の環境 1m
　課題の説明 30s
　解決した方法 2m
　課題 1m
　まとめ 30s
　
　に決めた。


- 英語のブラッシュアップ
　とにかくレアジョブ英会話( https://www.rarejob.com/ ) でブラッシュアップした。
　Google Docsでたたき台を作ってSkypeで資料を共有。フィリピン人講師に見て添削してもらいながらプレゼンの練習をした。
　
　5分間のプレゼンのために、12時間は準備に費やした。
　（資料作成 2時間、レアジョブレッスン 10時間→約20レッスン）
　
　先生に言っておいてよかったこと。
　プレゼンの練習中は間違った英語があっても、いちいち遮られたくない
　間違ってたらチャットボックスに書いて欲しいというと、
　先生はしっかりプレゼンを聞いてくれた上で、直すべき所をチャットに書いてくれる。
　
　先生は全員エンジニアではない（もちろん中にはエンジニアもいる）
　そのため、客観的な意見をもらえる
　
　「その部分は淡々と言うと退屈になりがちだから、感情（emotion）を込めて言った方がいい」
　「もっとゆっくり話した方がいい」など。
　英語でのプレゼンは初めてだったしプレゼンで発表する。
　と言うことだけに集中してしまうと、淡々と言っただけでつまらないものになってしまう。
　母国語ではない発表だからこそ、第三者の意見って重要だ。

- 練習練習練習・・・
　あとは何度も繰り返し、資料と内容を叩き込んでいく・・・。
　

# 当日受けた質問
　
　なぜわざわざサーバー立てて作ってるの？
　HOSTINGサービスでアウトソースすれば？
　https://wpengine.com/
　とかあるよ

　あくまでも既存のWORDPRESSのリプレイスを目的としていて、
　新しくサービスを使うという所までは至っていなかった。
　KUSANAGIを導入して実現出来たことは大きく2つ

- 新しく予算を組まなくても、現在の予算内で高速化の対応ができた。
- サーバリソースが最適化され、複数のWORDPRESSを1台に入れてもリソース的に問題にならず、且つ煩雑化させることなく集約することができた。
　

# まとめ
　英語でも日本語でもプレゼンの大きな流れは当然変わらない。
　その為、いったんいつも通り資料を作って、
　先生にSkype越しにファイルを共有して、英語でのプレゼンの練習と資料のブラッシュアップを同時に行った。
　あとは回数を重ねて、スライドが出てきたら、その時に言うべき英語も口からでるくらいになるまでのレッスン回数は、だいたい20回かかった。
　オンライン英会話で教材使って勉強したりフリーカンバーセーションするレッスンが一般的だけど、プレゼン資料を作ることで先生と共有して一緒に作り上げていくというのは新しい活用の仕方だと思う。
JenkinsのHockeyappプラグインを使ってiosビルドをHockeyにあげるとtimeoutが発生するときの対処方法

# 現象

* *.ipaのアップロードが無事に成功するが、*.dSYM.zipを上げるとき ```java.net.SocketTimeoutException: Read timed out``` が発生する
* *.dSYM.zipのアップロード自体が成功している模様、ただしhockeyからのレスがなかなかこなくてtimeoutになる（っぽい）

# 原因

* そもそも *.dSYM.zip がデカい
* 推測ですがhockeyがdSYMを受け取ってから展開したり処理しているので、時間がかかる
* hockeyappのjenkinsプラグインのソースをざっくりみてみたら、httpclientのsocket timeoutのデフォの設定値が 60000ms になってるらしい
 * けど実際、timeoutになるhockeyからの応答の待ち時間は約10分程度、らしい。そのへんよくわからん

# 対処

* ジョブのビルド手順内の設定ではなく、ここ

```
1. Jenkinsの管理
2. システムの管理
3. Default HockeyApp Configuration
4. HTTP Client Timeout： これを大きくする、1800 （30分）とか。単位秒。
GuzzleHttpのClientでリクエスト送る時に、証明書の検証を回避する方法

Qiita慣れていないため、見にくい所あったらすみません…。

・Laravel 5.3
・Guzzle 6.2

GuzzleHttpのClientを使ってとあるフロントサーバにアクセスに行く際に、開発中はレスポンスが返ってきてたのに、テストになるとなぜかエラーが出てしまってレスポンスが返って来なくなったので、メモ。

##原因
結論から言うと、テストではフロントサーバに自己証明書を使ったSSLを導入していたため、でした。

どうやらGuzzleHttpのClientがcURLを叩く際に証明書の検証をしているらしく、自己証明だからダメっす、と言われていたようです。

##解決策
やりたかったのは至極単純で、

```php
$client = new GuzzleHttp\Client(['base_uri' => 'https://' . なんかドメイン . '/']);
$response = $client->request('get', '/check');
```

こんな感じなんですが、動かすと

```
cURL error 60: Peer's certificate issuer has been marked as not trusted by the user. (see http://curl.haxx.se/libcurl/c/libcurl-errors.html)
```

Laravelログにこんなのが出てました。

で、調べてみるとClientがcURLを叩く際に証明書の検証はデフォルトではそれがオンになっているらしい。それをオフにすることで、無事にレスポンスが返って来るようになりました。

```php
$response = $client->request('get', '/check', ['verify' => false]);
```

テストで確認出来たら、コミットする時に外すの忘れないようにしないと…。

##参考
▼本家ドキュメント
http://docs.guzzlephp.org/en/latest/request-options.html#verify

▼参考サイト
http://qiita.com/k-holy/items/4362b8cce85642e477ec
Processing的なことをjavascriptで書く時はp5.jsでやればよさげ.

タンブラーで眺めてたら幾何学模様のgifアニメーションが目について自分でも作りたいと昨日思ったので学習し始めます．
https://www.tumblr.com/search/processing
##p5.jsについて
- レファレンス読みにくい
https://p5js.org/reference/
- CDNからのリンク.
https://cdnjs.com/libraries/p5.js

##パーティクルとかをクラスで書きたい
でベースになるの書いたのでjsdo.itに上げたのがこちら.
http://jsdo.it/moc0311/WNYK

```javascript:
function setup() {
    createCanvas(250, 250); //キャンバスサイズ
    frameRate(1); //フレームレート
}

function draw() {
    background(204); //背景を灰色に設定
    for (var i = 0; i < 10; i++) {
        var p = new Dot();
        p.display();
    }
}

var Dot = function() {
    this.x1 = random(0, width);
    this.y1 = random(0, height);
};

//白い点(2pixel)で描画.
Dot.prototype.display = function() {
    stroke(255);
    ellipse(this.x1, this.y1, 2, 2);
};

//ログ
Dot.prototype.log = function() {
    stroke(0);
    text("x1:" + this.x1, 5, 15);
    text("y1:" + this.y1, 5, 30);
};

```


####参考URL
MDN-オブジェクト指向 JavaScript 入門
https://developer.mozilla.org/ja/docs/Web/JavaScript/Introduction_to_Object-Oriented_JavaScript
Google流 JavaScript におけるクラス定義の実現方法
http://www.yunabe.jp/docs/javascript_class_in_google.html

##Atomで書く時便利なパケ
- p5xjs-autocomplete
https://atom.io/packages/p5xjs-autocomplete
p5.js用入力補完パッケージ.

- atom-html-preview
https://atom.io/packages/atom-html-preview
HTMLプレビュー.
【メモ】Docker + Crowi に関するメモ書き

docker+crowi を入れようとして、以下の記事を参考にやってみたところ、２カ所はまった。

[DockerfileでCrowiのビルドとDocker ComposeでCrowiの実行](http://qiita.com/nooby/items/1a176b43a72905b9f93c)

動作環境: Ubuntu 16.04 LTS


##docker-compose で version 2 を動かせない。

```
docker-compose up
```
以下のエラーを吐いて止まる。

```console
ERROR: In file './docker-compose.yml' service 'version' doesn't have any configuration options. All top level keys in your docker-compose.yml must map to a dictionary of configuration options.
```

これは、apt-getでインストールしたdocker-composeが古いためらしいので、
[GitのDockerサイト](https://github.com/docker/compose/releases/)に従い新しいものをゲットした。
具体的には、

```console:
curl -L https://github.com/docker/compose/releases/download/1.10.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
```
を実施。うちの環境ではpathが通っていないので、その後下記を実行して置き換えた。

```console:
mv /usr/bin/docker-compose /usr/bin/docker-compose.org
ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
```
##Upstartが接続を拒否する
```
docker-compose up
```
がまたエラーを吐いて止まる。

```console
Unable to connect to Upstart: Failed to connect to socket /com/ubuntu/upstart: Connection refused
```
versionエラーは回避したものの、次はDockerが起動しないっぽい。
そこでここを参考にした。[DockerのUbuntuイメージでMySQLを動かしたい](http://n8.hatenablog.com/entry/2013/08/19/155751)

```console
dpkg-divert --local --rename --add /sbin/initctl
ls -l /sbin/initctl          # ここの2行は確認
ls -l /sbin/initctl.distrib  #
ln -s /bin/true /sbin/initctl
```
これでやっと

```
docker-compose up
```
が動作し、Crowiが使えた。
Amazon Linux上にPython3.6.0の環境を導入する

# 目的
* Amazon Linuxへ、システムに影響のないように、現時点で最新のPython3.6.0を導入します。
* Pythonの環境切り替えにvirtualenvを使用します。
* コンパイルはインスタンススペックによりますが、5分ぐらいの作業です。
* （実際はAmazonLinuxに特化した部分はありません）
* [Amazon Linux上にPython3.5.2の環境を導入する](http://qiita.com/shinsaka/items/d9df609b81ab1170487e) のPython3.6.0版です。基本的に手順は同じになります。

# 準備
* Amazon LinuxインスタンスをLaunchし、sshログインできるようにしておきます。

# 手順
## 必要パッケージをインストール
* ソースからビルドするので必要パッケージをインストールします。
* sqlite-develを入れておくと、ipythonのヒストリーを保持してくれます。

```
$ sudo yum -y groupinstall 'Development tools'
$ sudo yum -y install openssl-devel sqlite-devel
```

## Python3.6.0をビルド
* ソースをダウンロードしてコンパイルします。
* インストール先はログインユーザーのホームディレクトリ内とします。

```
$ mkdir ~/src
$ cd ~/src
$ wget https://www.python.org/ftp/python/3.6.0/Python-3.6.0.tgz
$ tar zxvf Python-3.6.0.tgz
$ cd Python-3.6.0
$ ./configure --prefix=$HOME/local/myPython-3.6.0
$ make
$ make install
```

## virtualenvをインストール
* Python環境を切り替える仕組みとして使用する virtualenvをインストールします。
* これはAmazon Linux標準のPython2.7.x環境にインストールします。

```
$ sudo pip install --upgrade virtualenv
```

## 環境切り替え設定
* ローカルPython環境を設定します。（最初だけ）
* 指定したディレクトリが新たに設定したPython環境のトップディレクトリになります。
* 試したところ、virtualenvのパスが狂ってしまうようなので絶対パス指定で記述しています（alternatives関連？）。ログインし直せば大丈夫そうなのでインストール時だけの現象なきがしています。

```
$ /usr/local/bin/virtualenv --python $HOME/local/myPython-3.6.0/bin/python3.6 $HOME/py360
```


## 切り替え確認
* virtualenvで作成されたactivateスクリプトを実行することでPython3.6.0に切り替わります。
* プロンプト先頭に環境を示す文字列（ディレクトリ名）が追加されます。

```
$ source $HOME/py360/bin/activate
(py360)$ python --version
Python 3.6.0
```

* 元の環境(Python2.7.x)に戻る場合は下記コマンドを使用します。

```
(py360)$ deactivate
$ python --version
Python 2.7.12
```

## デフォルトでPython3.6.0にする
* ログイン時にPython3.6.0環境に切り替えるようにします。

```
$ echo 'source $HOME/py360/bin/activate' >> ~/.bash_profile
```

## 切り替えコマンドをaliasにしておく
* 頻繁に環境を行ったり来たりするとコマンドが面倒なのでalias設定しています。

```
$ echo 'alias p3="source $HOME/py360/bin/activate"' >> ~/.bash_profile
```
Luigiの構成要素について

Luigiを構成する要素について、自分の中での整理の意味も込めて、書き出してみたいと思います。
随時、書き足していきます。
勘違いしている部分もあるかもしれないため、ご指摘いただけると幸いです。

# タスク
- ワークフローを構成する処理の単位。
- タスク同士はワークフローにおいて、依存関係にある。
- タスク間で受け渡されるデータは、パラメータとターゲットの二種類。
- タスクの成功は、output()メソッドで指定したターゲットへのファイル作成。
- タスクの失敗は、タスク内における例外発生。
- タスクの成功によって生成されるファイルはチェックポイントとしても利用され、そのファイルが存在する場合には、そのタスクは何もせず、成功扱いとして処理される。
- 依存先タスクのoutput()メソッドで返却したターゲットには、依存元タスクからinput()メソッドとしてアクセスすることができる。

# ターゲット
- 各種ファイルシステムへのアクセスを提供するためのインタフェース。
- open時のモードに応じてバッファリーダ/ライタや特定のファイルシステムに接続するためのクライアントを提供する機構を内包している。
- 実際にファイルにアクセスする際には、フォーマットが用いられる。

# フォーマット
- 各種ファイルへのアクセス方法を提供するためのインタフェース。
- ターゲットのopen()時のモードによって、書き込み/読み込みのための処理を提供する。

# 依存について
- 通常の依存と動的依存の二種類がある。
- 通常の依存は、プログラム時に依存関係が静的に形成できる依存に用いる＝行われるタスク数が事前に分かっている場合など。
- 動的依存は、プログラム時に依存関係が形成できない場合に用いる＝行われるタスク数がそのタスクのinput()で引き渡されるデータに応じる場合など。
ショートカットを活用しよう - 14 - Win + U

# <kbd><kbd>Win</kbd> + <kbd>U</kbd></kbd> の効果
コンピューターの簡易操作センターを表示します。
![image](https://qiita-image-store.s3.amazonaws.com/0/156225/3fa8dc0b-c6b2-072b-edad-b173a51d6d50.png)

XPの頃はユーザー補助機能でしたでしょうか。
『[ショートカットを活用しよう - 11 - Win + + - Qiita](http://qiita.com/rrryutaro/items/15b048396dcd5fed1705#_reference-95df94bd86814eff9329)』で紹介した、拡大鏡などもここから表示できます。

主に体の不自由な方に向けて、操作方法を提供したり、画面表示をみやすくするなどの機能郡です。

各項目を選択すると詳細な設定が表示されます。
また、その設定項目で各機能を呼び出すショートカットのON/OFFなどが行えます。

例えば、ハイコントラストの切り替えは<kbd>左<kbd>Alt</kbd> + 左<kbd>Shift</kbd> + <kbd>PrintScreen</kbd></kbd>で行えますが、これを無効にすることも出来ます。
ハイコントラストの切り替えには数秒時間がかかりますが、普段目にしないのと、利用用途によってはテーマを設定しておくことで使えるかもしれません。
また、アプリケーションの開発でハイコントラストでの見栄えの定義をする必要がある場合、頻繁に利用することもあるかと思います。

上記画面がこのようになります。
![image](https://qiita-image-store.s3.amazonaws.com/0/156225/e52535c9-8191-792a-e699-e1856d1510c9.png)

その他、例えばキーのボードの設定は次のようになっています。
![image](https://qiita-image-store.s3.amazonaws.com/0/156225/72d54fe8-9765-72eb-4572-48162e775a1d.png)

この内[固定キー機能を有効にする]にチェックを付けると、説明にあるとおり、ショートカットの操作を同時ではなく、一つずつキーを押すことで機能させることが出来るようになります。

このように、各種機能や、それを呼び出すショートカットもわかったりしますので一通り、見てみるのもよいかもしれません。

以上

|前回|方針|次回|
|:--|:--:|--:|
|[<kbd><kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>Esc</kbd></kbd>](http://qiita.com/rrryutaro/items/a5219344d8cf51af1261)|[記事の方針](http://qiita.com/rrryutaro/items/74d60a6e31ff149c5710)|[<kbd><kbd>Ctrl</kbd> + <kbd>(矢印キー, Home, End, PageUp, PageDown)</kbd></kbd>](http://qiita.com/rrryutaro/items/c3abbc5cab26cfbc6743)|
Python > list > extend() or +=

@ Introducing Python: Modern Computing in Simple Packages by Bill Lubanovic
(No. 1233 / 12833)

extend()もしくは`+=`にてlistを追加する例があった。

ideoneでコードを作ってみた。

http://ideone.com/CVLeBv

```py
alist = ['7of9', 'Kim', 'Janeway']
print(alist)
alist.extend(["B'Elanna"])
print(alist)
alist += ['Chakotay']
print(alist)
```

```txt:結果
Success	time: 0 memory: 9024 signal:0
['7of9', 'Kim', 'Janeway']
['7of9', 'Kim', 'Janeway', "B'Elanna"]
['7of9', 'Kim', 'Janeway', "B'Elanna", 'Chakotay']
```

一つの処理に対して二つの方法(extend() or +=)が提供されている。

コード書式の一貫性を持つ時の選択肢があることは有効なのかもしれない。
Teratermでホストによって背景色や書式を変える

# 前置き
- ネットの記事は全体の設定のうち部分的記載している記事などがあるものの、一通りの流れが記載された記事が見当たりませんでした。
- そのため自分が設定する際に困ったことなどをまとめました。

# 背景
- ローカルに作った仮想環境とサーバーにある本番環境がある
- 本番にもいくつか種類がある
- 同時に複数のターミナルを立ち上げるとどれで作業しているのかわからなくなる

# 設定の流れ
1. 背景色や書式の設定ファイルの作成
2. マクロの作成
3. ショートカットキーの作成

# 1.背景色や書式の設定ファイルの作成
**要点をまとめます**
- フォントの設定は、ログイン後 [設定]タブ → [フォント]
- 背景色の設定は、ログイン後 [設定]タブ → [ウィンドウ]
- 設定の保存は、 [設定]タブ → [設定の保存]

※最後の設定の保存を押さないと次回起動時に初期設定に戻ってしまいます。
※設定にのめりこみ意外と忘れがち。

詳細は以下サイトがわかりやすいです
- http://www.j-oosk.com/teraterm/configuration/86/

# 2.マクロの作成
色を変えるためにteratermのマクロ機能を使います。
マクロの機能で「ホスト」「ユーザ」「パスワード」をスクリプトに記載し自動ログインできるようにします。
その際、設定ファイルを紐づけることで、環境に応じて設定を変えます。
いろいろ調べた結果、個人的にはこれが一番わかりやすいサイトでした。
こちらを参考に自分の設定を記載します。
- http://qiita.com/backgroundcolor/items/df2ed5d40e8960e72ee4

## 注意点
このファイルの保存する際の拡張子は「.ttl」
「.ttl」ファイルの文字コードは「SJIS」　※でないと文字化けします
「.ttl」ファイルの保存先は次に出てくる「ttpmacro.exe」と同じパスに置く（このへんC:\Program Files (x86)\teraterm）
書式を設定している「.INI」ファイルも「ttpmacro.exe」と同じパスに置く
「.ttl」ファイルに記載するパスワードなど、エスケープが必要なケースがある　※かなり昔のバージョンならエスケープがいらないが最新のバージョンはエスケープが必要

# 3.ショートカットキーの作成
マクロ機能を使って立ち上げるのは、通常のexeファイルを使うとマクロを起動させるまで手順が多いです。
そこでマクロ起動用のexeファイルを利用して、一発でマクロを起動させます。
マクロ起動用のexeファイルは、「ttpmacro.exe」です。
まず、このファイルのショートカットキーを作成します。
その後、プロパティを開きリンク先に以下のようにマクロファイルのパスを追記します。
※マクロファイルを参考まで「aaaaa.ttl」とする。（名前はなんでもよい）

```
"C:\Program Files (x86)\teraterm\ttpmacro.exe" "/V" "C:\Program Files (x86)\teraterm\aaaaa.ttl"
```

ここでマクロ起動用のexeファイルとマクロ設定ファイルが紐づけされます。
あとはこのショートカットをダブルクリックし、自分の立ち上げたい環境を選択すればOKです。
参考にした資料は以下です。（後半のほう）

- http://www.j-oosk.com/teraterm/macro/173/
負荷試験でつかう想定値が大きすぎるとどうなる？~~大は小を兼ねるのか~~

#はじめに
昨年、「 [はじめてのAPIサーバー負荷試験で得た最低限の負荷試験知識](http://qiita.com/kinpira/items/66d8f07f9425cb81cf59)」という記事を投稿しましたが、あれに追記する意味合いでこの記事をかきました。

今回のテーマは負荷試験でつかう想定値は大きければ大きい程良いよね！っていう意見に対して考えた事をまとめます。

#大は小を兼ねる意見
負荷をかける時の目安として、想定値を出すという話しを前回の「はじめてのAPIサーバー負荷試験で得た最低限の負荷試験知識」で書きましたが、 想定値とはリリース後に大きな負荷にも耐えられる環境を作る為の指標になります。

そこで、こんなやり取りがあったとします。

ある日、負荷試験をする為に想定値を出した資料を見ていると、負荷試験のゴールである目標値が大きい事に気がつきました。
自分:「この、目標値の計算の元になっているDAUの想定値が大きい気がするのですが、この数値は正しいですか？」
相手:「正直、正しいかどうかはわからないですが、これだけ捌ければ爆発的にヒットした場合も耐えられるだろうと数値になっています」
自分:「んーそれは大きすぎる気がしますね」
相手:「しかし、これだけ耐えられれば安心できるので、なんの問題も無いようにおもうのですが？」
自分:「んー...(うまく説明できない...)」

この時、悶々としながらも 「これだけ捌ければ爆発的にヒットした場合も耐えられるだろう」 という言葉に確かにそうだなーと思いました。
まさに大は小を兼ねるという意見です。

しかし！それではダメなのです。
ちゃんと現実的な想定値を出す事は大事なのです！
では、なぜ想定値が多いとダメなのかを考えたので、まとめてみます。

#なぜダメなのか？

## 修正コストがかかる
まず、サーバー1台あたりのスループットが出た所で、必要台数分を掛け算した分だけスループットが出るわけではありません。

実際には増やせば増やす程、コネクションだったりロックだったりデータ量だったり、色々な所が原因で劣化は起きます。
そのため、想定値を膨大な数値で出した時に、どこかに問題がおきてうまく捌けなくなる事もあるかと思います。

しかし、もしかしたら正確な想定値なら問題なく捌けるかもしれません。
想定数が大きすぎて問題が起きている可能性を考えた時に、本当に修正コストをかけるべきかどうかが問題になります。
クラウドサーバー等の場合、負荷試験環境を維持しているだけでも多額の費用がかかるので、ここは極力必要以上な時間とコストはかけたく無い所です。

まぁ、時間と予算が潤沢にあるならば話しは別ですが。。。


##ロングラン試験の結果にも影響
これは上の「修正コストがかかる」の内容と一緒ですが、台数が多い事で想定よりも劣化が早く現れ、修正してからまたロングランテストの繰り返しになります。
かなり時間のかかる工程ですが、想定数の算出はここにも影響してくる事が考えられます。
かなりの時間とコストがかかってしまう事が考えられますね。

まぁ、ここも時間と予算が潤沢にあるならば無問題ですが。。。

##正確に必要なスペックを算出できない。
例えばAWSなどのクラウドサーバーの場合、必要なスペックによってインスタンスサイズを決定します。
だいたいは負荷試験の結果によってインスタンスサイズを決めると思うのですが、ここでも想定数の見積もりが多すぎると、インスタンスサイズの選定を見誤ってしまいます。
そうすると、実運用時に必要以上のスペックの環境を運用する事になり、無駄に出費が多くなってしまいます。
これは、リリース後にも響いてくる事なので、影響度は大きいと思います。



と考えをまとめましたが、こんな風に特にコストが増えるというデメリットが大きいです。

#どうやって算出すれば良いの？
想定数が大きい事で抱える問題が分かった時に疑問に感じるのは、「大きすぎない想定値ってなんなのさ！」って事だと思います。
ここで言える事は、大きすぎない想定値とは現実的に無難な数値であると言う事です。(苦笑)

例えば新規のアプリで、プロモーションもなにもしないのに、「想定DAUがうん百万で、目標RPMが100万RPMです！」って言うのはあり得ないです。
この数値に時間とコストをつぎ込んでも、杞憂に終わるでしょう。

どういうプロモーションをうち、どれくらいの流入を見込んでいるのか、そこをしっかり加味した上での数値なら、それが一番現実的な数字なんだと思います。

#まとめ
結論、負荷試験に使う想定値は大きければ大きい程良いわけではありません。
持て余す程の時間と潤沢な資金があれば別ですが。。。

基本的には限られた時間とコストで負荷試験を行いたいというのが一般的だと思います。
必要以上の準備をしても無駄にコストと時間がかかってしまうというデメリットを考え、どれだけ現実に近い想定を出し、コストと時間の節約を行いつつ、安全性を担保できるかが勝負になってきます。

もしかしたら、経験を積めば積む程現実的な数値がだせるのかな〜？と思いつつ、今後も負荷試験については学んで行こうと思います。
【Blender】複数頂点の頂点ウェイトを一括で消す方法

#概要
![Blender 2017-02-02 06.30.29.png](https://qiita-image-store.s3.amazonaws.com/0/36154/bed02e4a-789b-75e5-3b3b-9f0d2bddcbd5.png)

頂点ウェイトの画面で頂点を複数選択して頂点ウェイトの×ボタンを押しても
最後に選択した頂点しか消えない。

ここでは複数の頂点ウェイトを消す方法を紹介する。
(自分用メモなので突っ込みはお控えください:smirk:)

#環境
blender 2.77a

#手順
頂点ウェイトを設定した後に以下の画面の赤枠ボタンを押すと頂点を選択することができる。

![Blender 2017-02-02 06.27.53.png](https://qiita-image-store.s3.amazonaws.com/0/36154/09cdcc50-b150-1b6e-b656-53b7bba3db54.png)

頂点を選択するとプロパティパネルにて頂点ウェイトの数値を調整するエリアが表示される。
![Blender 2017-02-02 06.30.29.png](https://qiita-image-store.s3.amazonaws.com/0/36154/bed02e4a-789b-75e5-3b3b-9f0d2bddcbd5.png)

初めにも書いたように複数の頂点を選択して×ボタンを押しても
最後に選択した頂点しか反映されない。
(ガッテム!!:rage:)

複数を一括して消すには以下の手順を踏む。

プロパティエディターの頂点グループにて
消したい頂点グループを選択する。
![Blender 2017-02-02 06.37.59.png](https://qiita-image-store.s3.amazonaws.com/0/36154/e92bfd53-598e-4286-ed6e-d32dabf639c6.png)

赤枠のようにウェイトを0に設定して「割り当て」ボタン押す。
これで複数の頂点のウェイトを一括して変更することができる。

0を指定したので頂点ウェイトは0に設定されたが
プロパティエリアの頂点エリアの情報にボーンの情報が残ってしまう。

![Blender 2017-02-02 06.42.01.png](https://qiita-image-store.s3.amazonaws.com/0/36154/c481be76-4b7b-3e52-6469-7877beaf04fd.png)

この状態からツールシェルフから「クリーン」ボタンを押す。
![Blender 2017-02-02 06.43.57.png](https://qiita-image-store.s3.amazonaws.com/0/36154/60dcc6ba-a6a5-f657-035f-2c21b41b134b.png)

制限のところを0に設定すれば0のウェイトがまとめて削除される。
技術英語 > does something to it

@ Introducing Python: Modern Computing in Simple Packages by Bill Lubanovic
(No. 1042 / 12833)

```
>>> setup = 'a duck goes into a bar...'
>>> setup.strip('.')
'a duck goes into a bar'
```

> Each example just takes the value of setup, **<font color=red>does something to it</font>**, and returns the result as a new string.

意訳「各例はsetupの値を取り、何かをして、結果を新しいstringとして返す」
ユーザビリティ評価手法のまとめ

# はじめに

ここではシステムのユーザビリティ評価手法をまとめます。

ユーザビリティ評価手法を知ることで、使いやすいユーザインタフェース（UI）の評価ポイントを理解し、基本的なユーザビリティを備えたシステムを開発できるようになると考えます。


# 定義

## ユーザビリティ

ユーザビリティにはいくつか考え方がありますが、ISO9241-11:1998（Ergonomic requirements for office work with visual display terminals (VDTs) - Part 11: Guidance on usability）の定義が一般的です。

> 「ある製品が、指定されたユーザによって、指定された利用状況下で、指定された目的を達成するために用いられる際の、有効さ、効率およびユーザの満足度」
> 
> - 有効さ（effectiveness）：ユーザが指定された目標をを達成する上での正確さと完全さ
> - 効率（efficiency）：ユーザが目標を達成する際に正確さと完全さに費やした資源
> - 満足度（satisfaction）：不快さのないこと、および製品使用に対しての肯定的な態度
> - 利用状況（context of use）：ユーザ、仕事、装置（ハードウェア、ソフトウェアおよび資材）、並びに製品が使用される物理的及び社会的環境

システムのユーザビリティは、ユーザ、利用状況、目的に依存し、有効さ（ユーザが目標を達成できるか）、効率（ユーザが最小の時間や負荷で目標を達成できるか）、満足度（ユーザが不快感なく目標を達成できるか）の3つの指標で評価できる、という考え方です。

![01.png](https://qiita-image-store.s3.amazonaws.com/0/62652/41bfabb8-96ab-cbd9-799d-535602df8c03.png)
（人間中心設計の基礎　（HCDライブラリー　第1巻）より抜粋）

## ユーザエクスペリエンス（UX）

ユーザビリティに近い概念にUXがあります。UXにもいくつか考え方がありますが、その一つにISO9241-210:2010（Ergonomics of human–system interaction —　Part 210:　Human-centred design for interactive systems）の定義があります。

> 「製品やシステムやサービスを利用した時、および／またはその利用を予測した時に生じる人々の知覚や反応のこと」
> 
> - 補足1：UXとは、利用の前、最中、その後に生じるユーザの感情、信念、嗜好、知覚、生理学的・心理学的な反応、行動や達成などすべてを含む。
> - 補足2：UXは、ブランドイメージ、知覚、機能、システム性能，対話行動や対話システムの補助機能、以前の経験から生じるユーザの内的・身体的状態、態度、技能や性格、および利用状況の結果である。
> - 補足3：ユーザの個人的目標という観点から考えた時には、ユーザビリティは典型的にUXに結びついた知覚や感情的側面を含む。ユーザビリティの評価基準はUXの諸側面を評価するのに用いることができる。

UXにはユーザビリティほどの市民権を得た定義はありませんが、(1)主観性、(2)消費者とユーザを対象とする（製品ライフサイクルのすべてを包含する長期的レンジのものである）、(3)品質特性と感性特性の関与、といった点がポイントのようです。

# ユーザビリティ評価の実施タイミング

ISO9241-210:2010には人間中心設計（HCD）の方法論がまとめられています。その中にあるHCDプロセス上で、ユーザビリティ評価を実施するタイミングは3点あります。

![02.png](https://qiita-image-store.s3.amazonaws.com/0/62652/c1983143-8c62-25bb-299a-1c098bf867a2.png)
（人間中心設計の基礎　（HCDライブラリー　第1巻）より抜粋）

# ユーザビリティ評価手法

## 分類

### 目的による分類

- 形成的評価：開発中のシステムのユーザビリティの問題点を把握する。
- 総括的評価：開発が完了したシステムのユーザビリティの度合いを確認する。

ユーザビリティ評価では、形成的評価が重要とされています。

### 手法による分類

- 分析的手法：ユーザビリティの専門家が自らの知識や経験に基づいて評価する。
    - 主観的、時間やコストが小さい、評価範囲が広い、開発の初期でも評価できる、という特徴がある。
- 実験的手法：実際のユーザのデータに基づいて評価する。
    - 客観的、時間やコストが大きい、評価範囲が狭い、評価にはプロトタイプが必要、という特徴がある。

ユーザビリティ評価では、分析的手法と実験的手法は補完関係にあるとされています。

## 評価手法

### 分析的手法

#### ヒューリスティック評価

基本的なUI設計原則（ヒューリスティック）に基づいて評価する手法です。ヒューリスティックはいくつか提案されていますが、ヤコブ・ニールセンによるものが有名です。

#### 認知的ウォークスルー

タスクを設定し、ユーザの認知モデルに基づいて評価する手法です。「ユーザの技能や経験」、「タスク」、タスクを実行するための「操作手順と画面」を定義し、ユーザがタスクを実行する時の認知モデル：「目標設定」，「目標実現手段の探索」，「目標実現手段の選択」，「目標実現状態の評価」に照らして評価します。

### 実験的手法

#### 思考発話法

タスクを設定し、ユーザに考えていることを話してもらいながらタスクを実行してもらうことで、ユーザビリティ上の問題点を抽出します。

#### 回顧法

タスクを設定し、ユーザにタスクを実行してもらった後でインタビューすることで、ユーザビリティ上の問題点を抽出します。

#### パフォーマンス測定

タスクを設定し、ユーザにタスクを実行してもらった後で、タスク達成率やタスク達成時間、アンケートに基づく主観的満足度を評価します。

---

**参考文献**

1. 人間中心設計の基礎　（HCDライブラリー　第1巻） 
2. ユーザビリティエンジニアリング ― ユーザエクスペリエンスのための調査、設計、評価手法
備忘録：Outlook 2010/2013/2016 の設定を移行する方法

Outlookの設定だけバックアップしたんだけど・・・
--
PCやOSの入れ替えで、それまで使っていたOfficeの設定(メールサーバーへの接続情報など)を新しい環境へそのまま移行したい場合が結構あります。(えっないって？)
そんな時、ググってもメールデータの移行の記事ばかりで、肝心の設定移行について書かれたサイトが非常に少ないのでここにまとめときます。
※逆にメールデータのお引越しの話はありません。。。

基本的に、移行元のあるレジストリキー以下をエクスポートして、移行先へインポートしてあげるだけで移行完了です。

|Outlook|レジストリキー|
|:-----:|:------------|
|Outlook 2010|HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Windows Messaging Subsystem\Profiles\Outlook|
|Outlook 2013|HKEY_CURRENT_USER\Software\Microsoft\Office\15.0\Outlook\Profiles\Outlook|
|Outlook 2016|HKEY_CURRENT_USER\Software\Microsoft\Office\16.0\Outlook\Profiles\Outlook|
|Outlook for Office 365|同上

レジストリをエクスポートする方法
--
レジストリエディタの UI からたどってエクスポートしてもいいですが、キーがわかりきっているときはコマンドラインのほうが便利(管理者権限が必要です)
```
C:\Users\hoge> regedit /e office_setting.reg {上記レジストリキー名}
```
コマンドプロンプトで上記コマンドを実行するとカレントフォルダにoffice_setting.regというファイルが生成され、上記レジストリキー配下のレジストリデータがエクスポートされます。

このoffice_setting.regを引っ越し先の環境にコピーして、ダブルクリックしてインポートすれば移行完了。
念のため、インポートするまえに、バックアップを取っておくことをお忘れなく。

注意
--
このファイルはメール設定の塊なので、**取扱注意**。
移行が終わったらさっさと削除しましょう。
他人の手に渡るとメールをぶっこ抜かれることになりますので。。。
Upgrade Aironet T5508 firmware

# Summary

<pre>
    使用しているコントローラのコンフィギュレーションのバックアップを TFTP サーバにアップロードします。

    コントローラで 802.11a と 802.11b/g のネットワークをディセーブルにします。

    コントローラでプライマリ イメージをアップグレードします。

    コントローラでブート イメージをアップグレードします。

    注： これは、WiSM、3750G Wireless LAN Controller、および 4400 シリーズのコントローラでは、4.1 へのアップグレードに必要な手順です。

    コントローラで 802.11a と 802.11b/g のネットワークを再度イネーブルにします。
</pre>

## Operation Manual

### Check System, Version
<pre>
 # show sysinfo
</pre>
### Check Wlan ID & status
<pre>
 # show wlan summary
</pre>
### Back up Configuration
<pre>
 # transfer upload mode tftp
 # transfer upload datatype config
 # transfer upload <serverip>
 # transfer upload path <server-path-to-file>
 # transfer upload filename <filename>
 # transfer upload start
  Mode............................................. TFTP  
  TFTP Server IP................................... 10.10.10.4
  TFTP Path........................................ Config/
  TFTP Filename.................................... AS_4402_4_2_55_8_Config.xml
  Data Type........................................ Config File 
  Encryption....................................... Disabled
  **************************************************
  ***  WARNING: Config File Encryption Disabled  ***
  **************************************************
  Are you sure you want to start? (y/N) y
  File transfer operation completed successfully.
</pre>
###  Upgrade Firmware
 *  Disable 802.11a/n and 802.11b/g/n 
 *  Disable WLAN
  * config wlan disable <wlan_id>
### Download firmware
<pre>
 # transfer download mode tftp
 # transfer download datatype code
 # transfer download serverip <server-ip-address>
 # transfer download filename <filename>
 # transfer download path <server-path-to-file>
</pre>
### Check start up Image
<pre>
 # show boot
</pre>

## Technical Document

### Save(Download) config

* http://www.cisco.com/cisco/web/support/JP/docs/WL/WLLANCntrller/5500WLCntrllers/CG/003/b_cg73_chapter_01010.html?bid=0900e4b182f76b39#ID2223


### Boot from backup Image

<pre>
コントローラを AC 電源に接続すると、起動スクリプトおよび電源投入時自己診断テストが実行されて、システムが初期化されます。 この間に Esc キーを押すと、ブートローダの [Boot Options] メニューが表示されます。 5500 および Flex 7500 シリーズのコントローラのメニュー オプションは、他のコントローラ プラットフォームとは異なります。
5500 シリーズ コントローラのブートローダ メニューは次のようになっています。

Boot Options
Please choose an option from below:
 1. Run primary image
 2. Run backup image
 3. Change active boot image
 4. Clear Configuration
 5. Format FLASH Drive
	6. Manually update images
Please enter your choice:
</pre>

* http://www.cisco.com/cisco/web/support/JP/106/1065/1065346_backup-image-wlc.html


## Link

### Wlan

* http://www.cisco.com/cisco/web/support/JP/docs/WL/WLLANCntrller/5500WLCntrllers/CG/004/b_cg74_CONSOLIDATED_chapter_01000100.html?bid=0900e4b1832d0da7#ID182

### Firmup

* http://www.cisco.com/cisco/web/support/JP/docs/WL/WLLANCntrller/5500WLCntrllers/CG/003/b_cg73_chapter_01010.html?bid=0900e4b182f76b39
* http://hikaku-server.com/cisco/entry312.html
* http://ry.tl/wlc.html

### Commando reference

* http://www.cisco.com/c/en/us/td/docs/wireless/access_point/12-4_10b_JA/command/reference/cr2410b/cr12410b-chap2.html
matplotlibでマーカーを枠線より上に表示する

# デモ
|Before|After|
|:-:|:-:|
|![clip_on_0.png](https://qiita-image-store.s3.amazonaws.com/0/40987/2ed067b2-d4c5-8ed8-d27a-bd63afb3ddad.png)|![clip_on_1.png](https://qiita-image-store.s3.amazonaws.com/0/40987/025b4aeb-c119-579d-78ed-80e8258b7210.png)|

# 方法
`plot`に、`clip_on=False`を追加。

```py:demo.py
import numpy as np
import matplotlib.pyplot as plt

x = np.arange(4)
y = np.cos(x)

plt.plot(x, y, "o-", clip_on=False)
plt.xlim(0, 3)
plt.ylim(-1, 1)
```

# 注意
`clip_on=False`で、範囲指定ミスるとこうなる。つまり、`clip_on=False`ではみ出しOKな状態になってる。

![Unknown.png](https://qiita-image-store.s3.amazonaws.com/0/40987/dd2de2a4-e8db-3858-3258-2cb626436a31.png)

```py
import numpy as np
import matplotlib.pyplot as plt

x = np.arange(10)
y = np.cos(x)

plt.plot(x, y, "o-", clip_on=False)
plt.xlim(0, 3)
plt.ylim(-1, 1)
```

# 参考
python - How do I let my matplotlib plot go beyond the axes? - Stack Overflow
http://stackoverflow.com/questions/9912206/how-do-i-let-my-matplotlib-plot-go-beyond-the-axes
Ubuntu 16.04 LTS にGoogle ChromeをPPAからインストール

# インストール
Google Chrome PPAからインストールを行う

```
wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | sudo apt-key add - 
sudo sh -c 'echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google.list'

sudo apt-get update 
sudo apt-get install google-chrome-stable
```

インストールするパッケージを`google-chrome-beta`にすれば、ベータ版がインストールできる。

## 注意点

インストール後に

```
/etc/apt/sources.list.d/google-chrome.list
```

が作られて、

```
/etc/apt/sources.list.d/google.list
```

と重複していると怒られるので、気になる場合は、どちらかを消した方が良さそうです。

## 参考

* https://www.ubuntuupdates.org/ppa/google_chrome
絶対にUTF-8の1バイト目にならない文字一覧

| 文字の範囲     | 1バイト目になる| 備考 |
|:-------------|:---:|-----------------|
| 0x00 - 0x7F  | ○ | 1バイト文字そのもの　　　　　　|
| 0x80 - 0xBF  | - | 2-4バイト文字の2バイト目以降でのみ出現 |
| 0xC0 - 0xC1  | - | 冗長表現を許さないのであれば絶対に出現しない |
| 0xC2 - 0xDF  | ○ | 2バイト文字の1バイト目 |
| 0xE0 - 0xEF  | ○ | 3バイト文字の1バイト目 |
| 0xF0         | ○ | 4バイト文字の1バイト目 |
| 0xF1 - 0xF2  | - | 追加面第4面から第11面の1バイト目に対応、通常は出現しない |
| 0xF3         | ○ | 4バイト文字の1バイト目<br>（漢字用の異体字セレクタなどで使われる可能性がある） |
| 0xF4         | - | 追加面第16面の1バイト目に対応、通常は出現しない |
| 0xF5 - 0xFF  | - | UTF-8として絶対に出現しない |

つまり、UTF-8の1バイト目になり得る文字は0x00-0x7Fおよび0xC2-0xF0,0xF3の176文字、なり得ない文字は残りの80文字。
rails + RSpec + CircleCI + codecov でテストカバレッジを可視化してみた


## 環境
ruby 2.2.6
rails 4.2.0
rspec-rails 3.5.2
simplecov 0.13.0
codecov 0.1.9

## 事前準備

CircleCIの登録
codecovの登録→リポジトリ登録

特につまづくとこはないと思う。

CircleCI導入はいろんな人が書いてるのでそちらにお任せして割愛。

## 「カバレッジ出力＋codecovへのアップロード」するための修正

```Gemfile
group :test do
  gem 'simplecov', :require => false
  gem 'codecov', :require => false
end
```


```spec/spec_helper.rb
require 'simplecov'

# save to CircleCI's artifacts directory if we're on CircleCI
if ENV['CIRCLE_ARTIFACTS']
  dir = File.join(ENV['CIRCLE_ARTIFACTS'], "coverage")
  SimpleCov.coverage_dir(dir)
end

SimpleCov.start

# ここのifはローカルでテスト走らせる時に実行したくないから。もっといい方法あると思う
if ENV['CIRCLE_ARTIFACTS']
  require 'codecov'
  SimpleCov.formatter = SimpleCov::Formatter::Codecov
end
```

codecov.ymlは作成なし。デフォルト設定のまま。
設定変えることもできるらしいけど今回はパス
https://docs.codecov.io/docs/codecov-yaml

## 結果

codecovみたらしっかり連携されてた

![codecov_screen_shot](https://lh3.googleusercontent.com/T6ptYpyR1kt78dRZW9AxEyJY0uKmiyB4n8miMCsO96B7UeNP9ibYgBeumNlM07Tr6WRIwh_j1mJWkfZGrzVfPLYzdeh-QzSl-lXmtId0i7KNN-NjxEYMgxR93znMSipCFlKpQQJmYvhIC5aYD9ttxZf57JbrBXfLb2ZlHD_e3hApqNEgVdOPetutsJthLTGs45DgDKx6u5M6UXwxDrpMOwl9Fmk4dJAPxgcjfy6BXgTg2imBAky1PG5VsmT3Kb9oHfWoQwElVGjPL5GODxwLsWv8ZBLBtaBfIqOQkpLnY0MVjm2b4eJcRH3EJG7Ha2-HMxRCMewjMPd4Pn3xXmjr5w9Wkez0mzPRDCY12b2WRvHRBFfFb2ZsuC240BFoldZ0-tgqD_a1ek68QGf_0mtbwdgP_k11YUq2avAI_xhmQp9uaxhaFJWoI2Hn9_O5y57twZkPU_nflIp5r-4sqOz8jQvlXkd70zPAxWu2Lj-W02-V5Jw9XwVhPC9lytgDU2HvLl1_UvXg_NCtNYjWT6C4Hi8rcuOoZ7N4wYAJDmo4zxB_ANfUCi4pilcgU5WkeSGjGKooGPFCpzpZMqAQfo1jsxj-tFRuJfd0GTna-QfUNSiqrgWI6oxilN3J4uEniIAh5E1WTNyssIblpFryiHZGRbRj4fgp8UM156f5NmEgsg=w2308-h518-no)

ちなみにcodecovに連携する設定をしていないと、CircleCI側のARTIFACTSタブでカバレッジレポートが見れる。まあ推移とか見れる分codecovの方がいいのかな。もう少し使ってみないとなんとも言えない。

上の画像ではカバレッジレポートの対象にconfigやらspecが入っているけど、

```
SimpleCov.start do
    add_filter "/config/"
    add_filter "/spec/"
end
```

ってやれば除外もできる。


## うーん

#### codecovのアップローダscriptが上手く動かなかった...
https://docs.codecov.io/docs/about-the-codecov-bash-uploader

CircleCIのdocにもcodecovと連携する時は使ってねって書いてるんだけど、動かしてみるとcoverageファイルが見つかりませんと出てしまう。
何か心当たりある人おしえて下さい＞＜
https://circleci.com/docs/code-coverage/

#### ビルドログがCircleCI側にしかない

あくまでカバレッジレポート可視化サービスなので。
テストが失敗してようが通ってようが関係ないっちゃないな。

## おわり

今回連携したのが真新しいリポジトリだったので、コードを書いていくと楽しくなるのかなと思いました（小学生並み）
node.js で社会性フィルター

# はじめまして
@albno273 と申します。
以前から[はてなブログ](http://albno273.hatenablog.com/)の方でちょっとした備忘録を日記と混ぜて投稿していたのですが、今後は Qiita に備忘録、はてなブログに日記を書くことにしました。
ウケがよかったものについてはブログからこちらに移植しようと考えています。
ちなみに [Twitter](https://twitter.com/albNo273) もあります。
よろしくお願いします。

# 社会性フィルター
Qiita で最初の記事を書くにあたってネタを探していたところ、
[【にゃーん】社会性フィルターをPython3で実装する / Qiita](http://qiita.com/Selene-Misso/items/84845bb4aeb1b3da17a2)
というのがあり、ついでに今自分が置かれている状況が死ぬほどつらいので写経代わりに node.js で作ってみました。

# つくった
ソース: [GitHub](https://github.com/albno273/meow)
follow: --- は適宜自分の ID に書き換えてください。

```js
var twitter = require('twitter');
var confu = require('confu');

var conf = confu('.', 'config', 'key.json');
var client = new twitter({
	consumer_key: conf.test.cons_key,
	consumer_secret: conf.test.cons_sec,
	access_token_key: conf.test.acc_token,
	access_token_secret: conf.test.acc_token_sec
});

var filter = ['つらい', '死にたい', '死ね', '殺す', '疲れた'];
var count = 1;

console.log('Sociality filter activated.');
client.stream('statuses/filter', { follow: --- }, function (stream) {

	stream.on('data', function (tweet) {
		var text = tweet.text;
		var id = tweet.id_str;
		var i = filter.length;

		while (i--) {
			if (text.indexOf(filter[i]) !== -1) {

				console.log('Negative word(s) detected!')
				console.log('catch: ' + filter[i]);
				setTimeout(function () {
					client.post('statuses/destroy/' + id, function (err, rep) {
						if (!err) {
							console.log('Delete succeeded.');
							setTimeout(function () {
								var tweet_body = 'にゃーん (通算' + count + '回目)';
								client.post('statuses/update',
									{ status: tweet_body },
									function (err, rep) {
										if (!err) {
											console.log('Tweet succeeded. Meow!');
											count++;
										} else {
											console.log('Tweet failed...');
											console.log(err);
										}
									});
							}, 1000);
						} else {
							console.log('Delete failed...');
							console.log(err);
						}
					});
				}, 1000);

				break;
			}
		}
	});

	stream.on('error', function (error) {
		console.log(error);
	});

});
```

ネストが綺麗ですね(すっとぼけ)。

# 実行してみる
![meow.gif](https://qiita-image-store.s3.amazonaws.com/0/163084/544b7938-6e7f-4d18-fa0a-7c63bef33099.gif)

# 考察
- 企業の人事に見られても恥ずかしくない Twitter が実現
- フィルタリングする語句をどのように選ぶか考える必要がある
    - ひたすらデータベースを増やしていく
    - ネガポジ判定
    - みんなから募るとか

# 感想
にゃーん(早く合否知らせてくれ)
調教済み環境で楽するMarkdown->TeX論文&アブスト

# はじめに
この記事は人間の頭にUSBがささるようになるまで必要な記事
Markdownで論文書いてみたいなって興味のある人は推奨

ただ、私から言えることは一言だけ…
**Markdown&Pandocで楽はできない**

Pandoc(執筆時Ver.1.19.1)のMarkdown->LaTeX はまだ完成度が高くない
変換後のtexデータを後処理するスクリプトやプログラムが書ける知識があれば… という程度
自分はPythonで調教しました

調教済み環境であらかた作成し、微修正を直接texコードでするならば少し楽できるかもしれない

# 何が必要か 
* TeXLive: https://www.tug.org/texlive/
* Atom: https://atom.io/
* Pandoc: http://pandoc.org/installing.html
* Python3: https://www.python.org/downloads/
* 調教済み環境: https://github.com/TenteEEEE/latex_sample
* Pandocに負けない意志

# インストールと設定
TeXLive, Atom, Pandocは何も考えずNextを押してインストールしよう

Atomに追加導入が必要なパッケージは無い
ただ、最低限おすすめしたいのはterminal-panel, markdown-preview-plus
関係ないけどgitを使う人はgit-plusもおすすめ

あとは調教済み環境をクローンしてWindowsの人はbatを実行すればOK
Linuxの人はbash用にちょっと書き換えれば済むはず

# 2017/02/16 追加機能
調教スクリプトの更新をしました。
使用例は調教済み環境の/src/friends.mdを参照。

## PDFのページ指定に対応
"Page:"で指定する

```markdown:test.md
Page:1

![図の名前](sample.pdf){width=16cm}
```

表に対してFigure環境を使った場合、自動で連番がふられる。
開始番号はPageで指定した番号から。

```markdown:test.md
Figure:図用のテーブル．(a)sample1，(b)sample2\label{fig:a}

Page:1

|||
|:-:|:-:|
|![](sample.pdf){width=8cm}|![](sample.pdf){width=8cm}|
|(a)|(b)|
```

```latex:out.tex
\begin{figure}[ht]
\centering
\begin{tabular}[]{@{}cc@{}}

\includegraphics[page=1, width=8.00000cm]{sample.pdf} &
\includegraphics[page=2, width=8.00000cm]{sample.pdf}\\
(a) & (b)\\

\end{tabular}
\caption{図用のテーブル．(a)sample1，(b)sample2\label{fig:a}}
\end{figure}
```


## けものフレンズ言葉に対応
勝手にルールを追加して、あなたも論文ごとジャパリパークへ入園してね！
単純な置換だから、構文とか考えたいすごーい人はぜひ実装してね！

```markdown:test.md
ジャパリパークへようこそ！
ついにけものフレンズ言葉に対応したんだ！
これを見てるってことは、君も論文の迷い子のフレンズなんだね！
結果は図をみてみてー！
ボキャブラリーはまだ少ないんだ！
```
```latex:out.tex
ジャパリパークへようこそ．
ついにけものフレンズ言葉に対応した．
これを見てるってことは、君も論文の迷い子の関係がある．
結果は図に示す．
ボキャブラリーはまだ少ない．
```


# 小技
## ・章番号をつけたくない(section*)
{.unnumbered}をつける

```markdown:test.md
# はじめに {.unnumbered}
```

## ・図に大きさを指定したい
Scaleは指定できない

```markdown:test.md
![図の名前](sample.png){width=16cm}
![図の名前\label{fig:a}](sample.png){height=12cm}
```
## ・TableにCaptionをつける
```markdown:test.md
Table:ここがCaption

|カラム1|カラム2|
|------|------|
|hoge  |hoge  |
```

## ・Labelをつける
基本的にはCaptionに連続してlabelをtexのコードで書く
Pandocの拡張パッケージ(crossref)も公開されているけど、たぶんこれが一番楽

```markdown:test.md
![図の名前\label{fig:a}](sample.png){width=16cm}

Table:ここがCaption\label{tab:a}

|カラム1|カラム2|
|------|------|
|hoge  |hoge  |
```

## ・図を横に並べたい
Table内で図を貼れば良いが、枠線が入るので自前スクリプトで対応
使い方はTableのCaptionをFigureで命名する

```markdown:test.md
Figure:図用のテーブル．(a)sample1，(b)sample2\label{fig:a}

|||
|:-:|:-:|
|![](sample1.png){width=8cm}|![](sample2.png){width=8cm}|
|(a)|(b)|
```

## ・それでもPandocの変換に30分ハマったら
texを書こう
幸せになれるよ

# 痒いところに手が届かない
### ・Table内の\multicolumn(Excelならセルの結合)に対応しない
そもそもMarkdown記法にない
自前実装するか、texを直接Markdownに書くか
今は後者を強く推奨

# まとめ
修論や卒論で忙しい時期ですが強く生きましょう
WIP: `git rebase` を Git Object から考察する

多分巷で噂になっているであろう[SVN脳の方が書いた記事](http://qiita.com/kaityo256/items/81e7951a1ca2706955a4)を読んで、
「あれ？ Git もチェンジセットの保存じゃなくてスナップショットの保存だよね？」とか
「え、むしろ SVN もスナップショットの保存をベースとした SCM だったんか！」とか
「多分何が本当に違うって、branch の概念なんだろうな」とか色々な気づきを得ることができたわけですが、

> それで「git rebase -iにおけるsquashとは、途中の不要なコミットを単に削除することだ」と思ったりする。そうするとコミットの順番を並び替えたりできることの説明がつかず、結局「rebaseはわからん」と匙を投げることになる。

の

> そうするとコミットの順番を並び替えたりできることの説明がつかず、結局「rebaseはわからん」と匙を投げることになる。

という部分に関しては完全に同意で、よくわかっていなかったので、せっかくなので学ぼうと思った。

## サンプルを用意する
こんなコミットログの

```bash
$ git log --oneline -4 --reverse
0c7eac5 :tada: initialize sample code
3dbaf33 :+1: add new function A
57bb9d1 :+1: add new function B
4573e7d :+1: add new function C
```

こんな Diff の

```diff
takayukioda@peach$ git log --oneline -4 -p --reverse
0c7eac5 :tada: initialize sample code
diff --git a/rebase.go b/rebase.go
new file mode 100644
index 0000000..d4a6957
--- /dev/null
+++ b/rebase.go
@@ -0,0 +1,9 @@
+package main
+
+import (
+ "fmt"
+)
+
+func main() {
+ fmt.Println("Learn about `git rebase`")
+}
3dbaf33 :+1: add new function A
diff --git a/rebase.go b/rebase.go
index d4a6957..6c950cb 100644
--- a/rebase.go
+++ b/rebase.go
@@ -6,4 +6,9 @@ import (

 func main() {
        fmt.Println("Learn about `git rebase`")
+ A()
+}
+
+func A() {
+ fmt.Println("Commit A")
 }
57bb9d1 :+1: add new function B
diff --git a/rebase.go b/rebase.go
index 6c950cb..290eace 100644
--- a/rebase.go
+++ b/rebase.go
@@ -7,8 +7,13 @@ import (
 func main() {
        fmt.Println("Learn about `git rebase`")
        A()
+ B()
 }

 func A() {
        fmt.Println("Commit A")
 }
+
+func B() {
+ fmt.Println("Commit B")
+}
4573e7d :+1: add new function C
diff --git a/rebase.go b/rebase.go
index 290eace..62f2470 100644
--- a/rebase.go
+++ b/rebase.go
@@ -8,6 +8,7 @@ func main() {
        fmt.Println("Learn about `git rebase`")
        A()
        B()
+ C()
 }

 func A() {
@@ -17,3 +18,7 @@ func A() {
 func B() {
        fmt.Println("Commit B")
 }
+
+func C() {
+ fmt.Println("Commit C")
+}
```

最終的にはこんなファイルを用意してみた

```go
package main

import (
	"fmt"
)

func main() {
	fmt.Println("Learn about `git rebase`")
	A()
	B()
	C()
}

func A() {
	fmt.Println("Commit A")
}

func B() {
	fmt.Println("Commit B")
}

func C() {
	fmt.Println("Commit C")
}
```

ら
フッツーにコンフリクト起きて「あっ」ってなったのでもう一回サンプル作り直してきます←

rebase を  Git Object から理解できたら、結構イケるんじゃないかと思っているから頑張る
GNU grep の Perl正規表現でマッチング部分取り出し

こんにちは。
GNU grep は Perl正規表現が可能なので、マッチング部分取り出しが楽です。
全 *.html ファイル内から、mapbox-gl.js のバージョン番号を抜き出すことに使ってみました（hist コマンドは自作[^1]）。

```console
$ ggrep -ohP "(?<=v0\.)\d\d\.\d(?=/mapbox-gl.js)" *.html | hist -k1r
 32.1   1 #
 31.0  12 ############
 29.0   7 #######
 25.0   1 #
```

mac に GNU grep をインストールして使いました。

```console
$ brew install homebrew/dupes/grep
$ ggrep -V | head -n 1
ggrep (GNU grep) 2.27
```
-------------

[^1]: [コマンドライン上でヒストグラム値（頻度数）を求める](http://qiita.com/kkdd/items/88581a2d04843c3c7ce7)
Unityエディタが突然起動しなくなった時

# Unityさんが突然の死
ある日、PCを起動してUnityを起動させようとしたところ、Unityのsplashが表示された後に「UnityEditorが動作を停止しました」とダイアログが出てくるようになってしました。
以降、どんなVersionにしてみても以前のように元気に起動してくれることはなくなってしまいました。南無

無事、解決はしたのですが色々調べても解決したという記事がUnityの公式FAQでも出てこなかったので同じ悩みの方が出たときのために残しておきます

環境としては
Windows10
Unity5.x

##発生した現象
C:\Users\ユーザ名\AppData\Local\Unity\Editor\Editor.log
をのぞいてみたところ以下のクラッシュログが書かれていました。

```
Crash!!!
SymInit: Symbol-SearchPath: 'C:/Program Files/Unity/Editor/Data/MonoEmbedRuntime;.;C:\Program Files\Unity\Editor;C:\Program Files\Unity\Editor;C:\WINDOWS;C:\WINDOWS\system32;SRV*C:\websymbols*http://msdl.microsoft.com/download/symbols;', symOptions: 530, UserName:（以下略
```

[今回の症状としてはこちらの投稿と同様](https://forum.unity3d.com/threads/unity-5-crash-before-project-screen.342862/)




## 試したが効果なかったこと
・Unityの再インストール
・別のVersionを再インストール
・PCのUnity関連キャッシュファイルの削除
・管理者権限で実行
・ウイルスセキュリティソフトの検査対象から除外
・とりあえず祈りながらPC再起動

上記のことをしても僕の場合は改善はしませんでした。


## 解決方法と原因
色々な方々に聞いたりして調べたところ、最近インストールしたフリーソフトが悪さをしていそうだったので、コントロールパネルからプログラムのアンインストールを選択

インストール日でソートし、順にみて行ったところ全くインストールした覚えのないソフトが、、
「Baidu The Desktop Weather」
という~~マルウェア~~フリーソフトですね。
こちらをアンインストールしたところUnityさんが息を吹き返しました。
どうやらこの~~スパイウェア~~フリーソフトのなんらかのファイルがUnityさんと相性が悪かった模様
ほかの方に聞いたところ、GOM Playerをインストールしたら似た状況に遭遇したこともあるそうなのでこの症状が出たら最近インストールしたソフトをかたっぱしからアンインストールするのが吉っぽいですね。

~~Baiduとかに引っかかってエンジニアとして恥ずかしくないの？とか言われるかもしれませんけどたまにありますよね、こういうの~~
sympyで円と円の交点

```python
#sympyで円と円の交点
import sympy.geometry as sg

center = sg.Point(0,0)
radius = 10
circle1 = sg.Circle(center, radius)

center = sg.Point(10,0)
radius = 10
circle2 = sg.Circle(center, radius)

result = sg.intersection(circle1,circle2 )

print(result)
print(len(result))
print(float(result[0].x),float(result[0].y),float(result[1].x),float(result[1].y))

#(結果)#pycharm
#[Point2D(5, 5*sqrt(3)), Point2D(5, -5*sqrt(3))]
#2
#5.0 8.660254037844387 5.0 -8.660254037844387
#
#(結果)#SymPy Live　Online Shell#精度がいいかも 
#http://live.sympy.org/
#[Point2D(5, 5*sqrt(3)), Point2D(5, -5*sqrt(3))] 
#2 
#(5.0, 8.6602540378443873, 5.0, -8.6602540378443873)
#
# (参考)#Pythonで円とか線とか線分の交点を求める＋普通の値に戻す
# http://kamiwo-koete.hatenablog.jp/entry/2014/12/23/193018
```

# 参考
3次元:3つの球の交点計算

https://qiita.com/mrrclb48z/items/2bece4f967bcd3bf126a
digdag + Embulkでファイル名を維持したままファイルを圧縮して転送

#digdag + Embulkでファイル名を維持したままファイルを圧縮して転送

##はじめに
時刻ごとに吐かれる大量のログデータを再利用やエビデンスも兼ねて圧縮して転送したい
現在は自作のシェルを用いてバッチ処理で行なっているが、負荷が高く時間もかかるのでEmbulkを用いてそれらを軽減したいと思った
Embulkだけでは時刻の入ったファイル名を維持したまま転送することができないが、digdagと組み合わせることで出来る

##概要
digdagでファイル名を取得し、Embulkに変数として渡すことでファイル名を保持したまま圧縮、転送する

##ディレクトリ構造
　├ compress.dig
　├ compress_config.yml
　├ scripts
　　　└ \__init__.py

##digdagの設定ファイル
digdagではPythonのAPIを用いて圧縮するファイル名を取得する

```yaml:compress.dig
##転送元ディレクトリからファイル一覧を取得
+getCompressFiles:
  py>: scripts.Compress.getCompressFiles
  
##ファイルを順番に圧縮して転送
+compress:
  for_each>:
    file: ${files}
  _do:
    sh>: embulk compress_config.yml
```

```py3:scripts/__init__.py
import digdag
import os

class Compress(object):
    def getCompressFiles(self):
        digdag.env.store({'files':os.listdir('転送元ディレクトリ')})
```

##Embulkの設定ファイル
Embulk側ではguessした後の設定ファイルを、digdagの変数を読み込むように編集する

```yaml:compress_config.yml
exec:
  min_output_tasks: 1           #ファイルを最終的に一つにする

in:
  type: file
  path_prefix: '転送元ディレクトリ'\${file}
  parser:
    charset: UTF-8
    newline: CRLF
    type: csv
    delimiter: "\t"
    quote: '"'
    escape: '"'
    trim_if_not_quoted: false
    skip_header_lines: 1
    allow_extra_columns: false
    allow_optional_columns: false
    columns:
    - {name: dt, type: string}  #以降のカラムは省略
out:
  type: file
  path_prefix: '転送先ディレクトリ'\${file}
  sequence_format: ""
  file_ext: .gz                 #今回はgzipに圧縮するので、拡張子にgzをつける
  formatter:
    type: csv
    delimiter: "\t"
    newline: CRLF
    newline_in_field: LF
    charset: UTF-8
    quote_policy: MINIMAL
    quote: '"'
    escape: "\\"
    null_string: "\\N"
  encoders:
  - {type: gzip, level: 6}
```

##参考
digdag
http://docs.digdag.io/
embulk
http://www.embulk.org/docs/
Require.jsでJSTをモジュールとして読み込む

#概要
Gruntのプラグインgrunt-contrib-jstをインストール、require.jsから詠み込もうしたらうまくいかなかったので
解決方法と、その他調べたことを書く。

#解決方法
結果から言うとJSTがAMDに対応していなかった （わけではないでしょう。　これは後述）
ので、require_config.jsに以下の記述を追加。


```
	paths: {
	    templates: [
		    '../jst/templates'
		]
	},
	shim : {
            templates: {
      	        exports: 'JST' //　そのライブラリがグローバル変数として定義しているオブジェクトの名前を指定する
    	    },
	}
```

まとめると
・ shim で AMD に対応していないライブラリについての定義を記述する。
・ exports で、そのライブラリがグローバル変数として定義しているオブジェクトの名前を指定する。
・ require() による依存関係の解決のときには、ここで指定したオブジェクトが渡されることになる。

#疑問点
・grunt-contrib-jstはAMD対応しているようです。[このサイト](https://log.shinofara.xyz/2013/12/07/requirejs%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB%E7%AE%A1%E7%90%86/)で　```amd: true```というオプションが紹介されています。
以下のよう

```
module.exports = function(grunt) {

  grunt.initConfig({

    pkg: grunt.file.readJSON('package.json'),

    jst: {
      compile: {
        options: {
            //trueでdefine falseで通常
          amd: true,
          templateSettings: {
            interpolate : /\{\{(.+?)\}\}/g
          },
          processName: function(filename) {
            return filename.replace(/(src\/templates\/|.html)/g, '');
          }
        },
        files: {
          'src/javascripts/templates/templates.js': [
            'src/templates/**/*.html'
          ]
        }
      }
    },

    watch: {
      scripts: {
        files: ['src/templates/**/*.html'],
        tasks: ['jst'],
        options: {
          spawn: false,
        },
      },
    }

  });

  grunt.loadNpmTasks('grunt-contrib-jst');
  grunt.loadNpmTasks('grunt-contrib-watch');
}
```

試したけどうまくいかない。
多分Gruntfile.jsでのoptionsの記述方法が間違っているのか。（ちゃんと調べてないから）

＊参考
[このGist](https://github.com/gruntjs/grunt-contrib-jst/issues/48)もJSTがうまく読み込めない問題について
言及している。
Docker 備忘録 #01 よく使うコマンド

最近Dockerを使うことが増えてきたので . 
基本的な使い方のメモ程度に . 

# コンテナの作成、起動 . 
` $ docker run <オプション> <イメージ名> コマンド ` . 
例: ubuntuコンテナを作る . 
` $ docker run -it ubuntu /bin/bash ` . 
###オプション 
    -i : 標準入力
    -t : ttyの割当
    - d : コンテナをバックグラウンドで実行
    - p : ホスト側とのポート接続 ex. -p ホスト:コンテナ 
    - e : コンテナに環境変数を設定 ex. -e 環境変数名=値 
    --name : コンテナに名前をつける ex. --nama コンテナ名 
    --link : コンテナ同士を連携させる ex. --link リンクさせたいコンテナ名:エイリアス
  
例: ubuntuのコンテナをコンテナ名ubuntu、ポート8080と80を接続、bashを起動させる . 
` $ docker run -it -p 8080:80 --name ubuntu /bin/bash ` . 

# コンテナの確認 . 
#### 起動中のコンテナの確認 . 
`$ docker ps` . 
#### すべてのコンテナの確認 . 
` $ docker ps -a`

#  作成済みのコンテナの起動 . 
` $ docker start <コンテナ名 or コンテナID> `

# 起動中のコンテナの停止 . 
`$ docker stop <コンテナ名or コンテナID>` . 
### 起動中のすべてのコンテナを停止させる . 
`` $ docker stop `docker ps -q` `` .  

# 起動中のコンテナへ接続 . 
` $ docker exec オプション <コンテナ名 or コンテナID> コマンド ` . 
例: 起動中のコンテナ（コンテナ名:ubuntu)への接続、bashを起動 . 
` $ docker exec ubuntu /bin/bash` . 

# コンテナイメージの取得 . 
基本的には[DockerHub](https://hub.docker.com/)から取得される . 
`$ docker pull イメージ名:タグ名` . 
例:ubuntu14.04 のイメージを取得する . 
` $ docker pull ubuntu:14.04` . 

`docker pull` をせずに `docker run`をした場合はコンテナ作成時にイメージを取得する . 
# Dockerイメージの確認 . 
`docker pull` または作成したイメージの確認 . 
` $ docker images ` . 

# コンテナの削除 . 
` $ docker rm <コンテナ名 or コンテナID>` . 

# Dockerイメージの削除 . 
` $ docker rmi <イメージ名:タグ> . 

# ホスト側とコンテナでファイルをコピーする
###### ホストからコンテナへ  
` $ docker cp ファイル名 <コンテナ名 or コンテナID>:ディレクトリ/ファイル名 `
例:ホスト側ファイル:hoge.txt を コンテナ名:ubuntu ファイルディレクトリtmp/hoge.txt へコピー
` $ docker cp hoge.txt ubuntu:tmp/hoge.txt`  

###### コンテナからホストへ  
` $ docker cp  <コンテナ名 or コンテナID>:ディレクトリ/ファイル名 ホスト側ファイル名 ` 
例:コンテナ名:ubuntu ファイルディレクトリtmp/hoge.txtをホスト側ファイル:hoge.txt　へコピー
` $ docker cp ubuntu:tmp/hoge.txt hoge.txt`
# Dockerイメージの作成(コミット) . 
` $ docker commit コンテナ名 イメージ名` . 
例: コンテナ名:ubuntu を イメージ名:myubuntu タグ:01 でイメージを作る . 
` $ docker commit ubuntu myubuntu:01` . 

# 作成したイメージをDockerHubにプッシュする . 
1. DockerHubでアカウントを作成 . 
2. DockcerでDockerHubにログインする . 
 ` $ docker login`

3. イメージの作成 `$ docker commit  コンテナ名 DockerHubのID/イメージ名` . 
 例: ユーザー名:hoge コンテナ名:ubuntu イメージ名:myubuntu タグ:01 . 
 ` $ docker commit ubuntu hoge/myubuntu:01` . 
4. DockerHubへプッシュする . 
 ` $ docker push hoge/myubuntu:01` . 

以上、だいたい自分がよく使うDockerのコマンド