OmniAICreator/Qiita-1.07M huggingface dataset:
Herokuの環境変数をアプリから変更する

この記事は [Heroku Advent Calendar 2015](http://qiita.com/advent-calendar/2015/heroku) の 24 日目の記事です。

## 事の始まり

少し前に、こんな疑問をTwitterで見つけまして。

<blockquote class="twitter-tweet" lang="ja"><p lang="ja" dir="ltr">【緩募】スクリプト上からHerokuの環境変数に書き込みってできないの</p>&mdash; らなとす (@Ranats85) <a href="https://twitter.com/Ranats85/status/666131041837408256">2015, 11月 16</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

（動いているアプリのスクリプトコードから変更出来るか、という意味も含めて解釈させていただきます）
ちょっと調べてみると、HerokuのAPI叩くと解決しそうでした。

https://devcenter.heroku.com/articles/platform-api-reference#config-vars

手元でcurlで叩いてみると環境編集の取得と作成（patchコマンドでも出来た）、編集が出来ました。
（削除に関しては不明）

## Faradayを使う

Faraday使うと普通にアプリ上から変更できるんじゃないかと思ったので、ちょっと検証してみました。

`rails new etmnk-config-test -d postgresql`

で作って、適当に `bundle exec rails g controller configvars` で環境変数をなんやかんやするためのコントローラ作ります。
（中身は後で追加）

```
#表示用
def index
end

# 変更用
def put
end
```

こんな感じでとりあえず作っといて、config/route.rbには

```
  root to: 'configvars#index'
  get '/configvars', to: 'configvars#index'
  patch '/configvars/:key/:value', to: 'configvars#put'
```

を追加しときます。
'/'もしくは'/configvars'で環境変数の一覧を表示し'/configvars/:key/:value'をpatchで指定することで、環境変数:keyに:valueの値を設定して追加します。

Gemfileはこんな感じに追記します。

```
gem 'faraday'
group :production do
  gem 'pg', '~> 0.15' # postgresは今回は別に使いません
  gem 'rails_12factor'
end
```

処理的にはこんな感じにしときます。説明のためいろいろ雑になってますが。

app/controllers/configvars_controller.rb

```
class ConfigvarsController < ApplicationController
  # 一覧表示用
  def index
    client = Faraday.new(:url => "https://api.heroku.com")
    res = client.get do |req|
      req.url '/apps/your-app/config-vars'
      req.headers['Content-Type'] = 'application/json'
      req.headers['Accept'] = "application/vnd.heroku+json; version=3"
      # 認証が必要なのでherokuアカウント情報をここで設定
      req.headers['Authorization'] = Base64.encode64('your-email' + ':' + 'your-pass')
    end
    @body = JSON.parse(res.body)
  end

  # 環境変数更新用(追加でも使う)
  def put
    # URLから設定情報を取る
    # /configvars/:key/:value
    # からkeyとvalueを取る
    key = params[:key]
    value = params[:value]
    confvalue = {}
    confvalue[key] = value
    client = Faraday.new(:url => "https://api.heroku.com")
    res = client.patch do |req|
      req.url '/apps/your-app/config-vars'
      req.headers['Content-Type'] = 'application/json'
      req.headers['Accept'] = "application/vnd.heroku+json; version=3"
      req.headers['Authorization'] = Base64.encode64('your-email' + ':' + 'your-pass')
      req.body = confvalue.to_json
    end

    redirect_to configvars_path
  end
end

```

画面側はこんな感じに。

app/views/configvars/index.html.erb

```
<% p @body%>

<%= link_to 'conf', 'configvars/hoge/huga', :method => :patch %>
```

注：　環境変数全部表示してしまうので、取り扱いには注意してください

今回いろいろ手抜きでURLに直接パラメータ突っ込んでます。リンクを叩くと環境変数hogeにhugaの値が設定されて追加されると思います。

明日は最終日です。 @ayuminさんお願いします。
CentOS6のメモリ状況のdstatプラグインを書いてみた

# CentOS6のメモリ状況のdstatプラグインを書いてみた

## 注意

Pythonは初心者です！

## 背景

↓の記事を参考にCentOS6のメモリ状況のdstatプラグインを書いてみました。

* [【RHEL】linuxのメモリ使用率(利用率)の計算方法 - のぴぴのメモ](http://nopipi.hatenablog.com/entry/2015/09/13/181026)

## ソース

```dstat_mymem.py
### Author: Tsuyoshi Sadakata

class dstat_plugin(dstat):
    """
    http://nopipi.hatenablog.com/entry/2015/09/13/181026
    """

    def __init__(self):
        self.name = 'mymem'
        self.nick = ('used(%)', 'total(kb)','used(kb)','avail(kb)',)
        self.vars = ('used_rate', 'total','used','avail',)
        self.type = 'd'
        self.width = 12
        self.scale = 0

    def extract(self):
        meminfo = dict((i.split()[0].rstrip(':'),int(i.split()[1])) for i in open('/proc/meminfo').readlines())
        self.val['total'] = meminfo['MemTotal']
        self.val['avail'] = meminfo['MemFree'] + meminfo['Active(file)'] + meminfo['Inactive(file)']
        self.val['used'] = self.val['total'] - self.val['avail']
        self.val['used_rate'] = 100*self.val['used']/self.val['total']

# vim:ts=4:sw=4:et
```

## インストール

「/usr/share/dstat/」以下に↑のソースを「dstat_mymem.py」というファイル名で保存してください。

## 実行

```
$ dstat --mymem
-----------------------mymem-----------------------
  used(%)     total(kb)     used(kb)    avail(kb)
          91       502040       458608        43432
          91       502040       458808        43232
          91       502040       458808        43232
          91       502040       458808        43232
```
KUSANAGI で FuelPHP を動かす

FuelPHP アドベントカレンダー24日目です。

## KUSANAGIとは

まずはじめに[KUSANAGI](http://kusanagi.tokyo/)について簡単に説明します。KUSANAGIは、プライム・ストラテジー会社が開発して公開している仮想マシン・イメージです。WordPressが高速に実行できるようにチューニングされているので、WordPressを使うときに非常に重宝しますが、WordPress以外のアプリケーションを動かすこともできます。WordPressに関しては[さくらクラウドにKUSANAGIをインストールしてみた](https://rescuework.nagoya/blog/kusanagi-sakura/)に書きましたので、そちらを参照してください。

### 様々なパブリッククラウドに対応
2015年12月24日時点で、下記のクラウドサービスに対応しています。

KUSANAGI for Microsoft Azure
KUSANAGI for SoftLayer
KUSANAGI for AWS
KUSANAGI for さくらのクラウド
KUSANAGI for ConoHa
KUSANAGI for Z.com
KUSANAGI for S-Port
KUSANAGI for IDCF クラウド

私は[さくらのクラウド](http://cloud.sakura.ad.jp/)を使っています。

### KUSANAGIのPHPバージョン

KUSANAGIでは、PHP5.6、PHP7、HHVMが用意されています。2015年12月時点でPHP7が用意されているイメージは、私が知っている範囲ではKUSANAGIだけですので、とても貴重だと思います。
複数のPHPバージョンが用意されているだけでなく、

kusanagi php7
kusanagi php-fpm
kusanagi hhvm

というコマンドを実行することで、切り替えることができます。php7を試してみて、やっぱりphp5.6にしよう、といったことも簡単に行うことができます。
早々にPHP7対応していただいたプライム・ストラテジーの皆様に感謝します。

## FuelPHPを動かしてみる

FuelPHPバージョン1.7.3をKUSANAGI上で動かしてみました。まずはphp5.6系の場合です。

![FuelPHP Framework.png](https://qiita-image-store.s3.amazonaws.com/0/31643/c0a376f8-7b33-2c77-5f5d-8d54dbaea203.png)

インターネット越しにアクセス、プロファイリング機能を有効にした状態で、上のような数字になります。FuelPHPは元々高速なほうですが、この数字はかなり速いと思われます。KUSANAGIを使うと、WordPress以外でも高速に使えるようです。

### FuelPHP1.7.3 + PHP7 は動かない

FuelPHP1.7.3は、PHP7に対応していません。PHP7で実行すると、下記のようにエラーとなります。

![FuelPHP Framework-php7.png](https://qiita-image-store.s3.amazonaws.com/0/31643/5ec2552f-6215-976d-9f5a-35ca630307ca.png)

Fatal error: Uncaught Error: Call to undefined method Error::shutdown_handler() in xxx.php:77 Stack trace: #0 [internal function]: {closure}() #1 {main} thrown in xxx.php on line 77

となります。PHP7でErrorクラスが導入されたため、FuelPHPの同名のクラスと名前が被ってしまったからのようです。詳細はFuelPHP Forumsの[Error handler error in PHP7](http://fuelphp.com/forums/discussion/13696/error-handler-error-in-php7)をご覧ください。

PHP7に対応したFuelPHP1.7.4は、現時点では準備中ですので、FuelPHP + PHP7 はもう少しお預けとなりそうです。
GitHub時代のパスワードを管理する技術

パスワードを`git commit` する前に検討したい、3つの回避方法

GitHub便利ですね。無料で自身のソースコードを管理できます。しかし無料プランだとソースコードは全世界に公開されてしまいます。有料プランですと月7 USドルでソースコードを非公開にできますが、結構お高めなので払っている人は少ないのではないでしょうか？

外部リソースにアクセスするプログラムを書いていると、config にパスワードを書いてしまいたい衝動に駆られます。しかし過去の事件について思いを馳せてみてください。クラウドサーバを生成する権限はお金になります。BitCoinマイニング目的でEC2 インスタンスを不正利用された事例は国内でも数件発生しています。本当にそのパスワードをconfig に書いて大丈夫でしょうか。

この記事ではgit にcommit しないで上手にパスワードを管理する技術について考えていきます。

# awsコマンドを使っている人は次のコマンドを試してみよう
Amazon Web Service ではローカルから簡単に各サービスを利用するためにawsコマンドが提供されています。利用している人は、次のコマンドを打ってみましょう。`cat ~/.aws/credentials` 

```shell-session
>>> cat ~/.aws/credentials
[default]
aws_access_key_id =  XXXXXXXXXXXXXXXXXXXXXZQ
aws_secret_access_key = XXXXXXXXXXXXXXXXXX8a
```

生パスワードで保存されています。何故でしょうか？これを単純に暗号化したところで難読化にしかならずセキュリティが担保されないためです。なぜならローカルで暗号化して保存したところで、AWSと通信してコマンドを送信する段階では手元で復号化して送信しているわけですから、技術的には誰でも容易に復号化可能なので暗号化する意味がないのです。

## `~/.aws/credentials` にパスワードを記録しない方法
`export AWS_CONFIG_FILE=~/path/to/aws.confg` と環境変数を利用すると安全に管理できるみたいです。（社内の有識者に教えてもらいました！）

参考:[HowTo: Install AWS CLI - Security Credentials](http://www.dowdandassociates.com/blog/content/howto-install-aws-cli-security-credentials/)




# パスワードをソースコードに記述しない3つの方法
pitライブラリを利用する方法、.gitignoreを利用する方法、環境変数にパスワードを書く方法の3つをリストアップしてみました。

## 1.pitを使ってパスワードを管理する
pit は有名なアカウント管理ライブラリです。Python Ruby perlでライブラリが存在します。pythonだと`~/.pit/default.yaml` に生パスワードが保存されます。

```shell-session:install
pip install pit
export EDITOR="vim"
```

```py:利用例,a.py
# -*- coding: utf-8 -*-
from pit import Pit

token = Pit.get('hipchat_v1',
                {'require': {'token': 'your hipchat access token API v1'}})
print(token)
```

最初に実行するとVimが起動されてパスワードの入力を求められます。入力したパスワードは`~/.pit/default.yaml` に保存されます。
![スクリーンショット 2015-12-24 17.36.16.png](https://qiita-image-store.s3.amazonaws.com/0/65312/b0d268b4-8682-b30a-00ee-2976b11f8db2.png)

2回目以降、パスワードを入力後は次の結果が返却されます。

```py:実行結果
>>>python a.py 
{'token': 'your token'}
```

## 2.gitignoreと importを使ってパスワードを管理する
password.py をサーバに設置して、.gitignore に設定しておいてconfファイルから読み込みを行います。

![スクリーンショット 2015-12-24 17.45.05.png](https://qiita-image-store.s3.amazonaws.com/0/65312/3502531c-b7fd-f5f6-c5d6-1cab5798bd65.png)

```py:password.py
# -*- coding: utf-8 -*-
PASSWORD = "HOGEHOGE"
```

```py:production_config.py
# -*- coding: utf-8 -*-
from password.password import *
print(PASSWORD)
```

```shell-session:実行結果
>>> python production_config.py 
HOGEHOGE
```


## 3.環境変数でパスワードを管理する
環境変数にパスワードを設定しておいて、os.env コマンドで読む方法です。利便性を考えると`.bash_profile` でパスワードを管理することになります。

```shell-session:パスワード設定
export PASSWORD="aiueo"
```

```py:production_config.py
# -*- coding: utf-8 -*-
from __future__ import absolute_import, unicode_literals
import os

print(os.environ.get('PASSWORD'))
```

```shell-session:実行結果
>>> python production_config.py
aiueo
```
#PostgreSQL の配列型カラムに値を追加または削除してUPDATE

## <i class="fa fa-comment-o"/> 背景

PostgreSQL 9.3.9 で配列型カラムに値を追加してUPDATEが必要そうになったときに調べたメモ。削除についても調べたのでメモ。

- 追加には**`array_append()`**
- 削除には**`array_remove()`**

## <i class="fa fa-code"/> 配列型`column`に`value`を追加してUPDATE

```sql:SQL
UPDATE table SET column = array_append(column, value);
```

## <i class="fa fa-code"/> `value`を含まない配列型`column`に`value`を追加してUPDATE

```sql:SQL
UPDATE table SET column = array_append(column, value) WHERE NOT (column @> ARRAY[value]);
```

## <i class="fa fa-code"/> 配列型`column`から`value`を削除してUPDATE

```sql:SQL
UPDATE table SET column = array_remove(column, value);
```

## <i class="fa fa-code"/> `value`を含む配列型`column`から`value`を削除してUPDATE

```sql:SQL
UPDATE table SET column = array_remove(column, value) WHERE column @> ARRAY[value];
```

## <i class="fa fa-file-text-o"/> 参考

- https://www.postgresql.jp/document/9.3/html/functions-array.html
- http://qiita.com/choplin/items/9d5e2ff8721fb9509bf8#2-1
[WIP] Puppetの書籍を2016年に出したい

Puppetアドベントカレンダー、25日目です。

この記事が公開される頃には、きっと無事24日分の記事が完成していることでしょう。前日の @zipper さん、たのみましたよ......。

最終日は、2015年のPuppetの状況を振り返り、そして勝手気ままな妄想をしたためたいと思います。

## Puppetの状況の整理

まず大前提として、Puppetは:

* 国内、海外共に大規模な実例もあり、充分に実績を持っているツールである
* 2015年末現在も活発に開発が続いている
* 公式の英語によるドキュメントが非常に充実している

以上のような理由により、OSSプロビジョニングツールの選択肢として普通に選ばれても問題のない、むしろ有利な面がたくさんあるツールです。

にもかかわらず、少なくとも現在の日本の開発現場においては若干手を出しづらい状況にある、という印象を持っています。

これには幾つかの理由があると思っています。

### 手に入る日本語情報が古い

検索すると、 [2007~08年のmizzyさんの記事](http://gihyo.jp/admin/serial/01/puppet) や [あんちぽさんの「入門Puppet」](http://www.amazon.co.jp/%E5%85%A5%E9%96%80Puppet-Automate-Your-Infrastructure-%E6%A0%97%E6%9E%97%E5%81%A5%E5%A4%AA%E9%83%8E-ebook/dp/B00CL92JC0) が最初の方に出てくると思います。これらの情報は偉大な仕事で（私自身もあんちぽ本でPuppetのとっかかりを作った人間です）はありますが、バージョン4も出て時間も経っている現在のPuppetの入門の資料にするにはいささか古いという面があります。

顕著に表れているのはディレクトリ構成の規約で、どちらの資料も、Puppet3.8以降で推奨される [Directory Environments](https://docs.puppetlabs.com/puppet/4.2/reference/environments_configuring.html#environmentpath) には対応していません。

### 独自の外部DSLの学習コストがある

もう一つが、Puppetが独自の外部DSLでサーバの状態を宣言するという戦略をとっていることです。

Chef/ItamaeのようにRubyの内部DSLでもなく、Ansibleのようにyamlでもない、 **Puppetのためだけに、全く独自の** 文法を学習する必要がある、ということは敷居の高さにつながっていると考えられます。

外部DSLであることは、[22日目にも述べた通り](http://qiita.com/udzura/items/ab1406413cb5e765ba29)、「完全に頭を切り替えられる」というメリットも大きいのですが、一つの言語を一から覚えるという学習コストは無視することはできないでしょう。

## この状況を打破したい→アドカレだ!!1

以上のようなつまるところ問題は純粋に、日本語情報が足りていれば解決すると考えています。Puppetの日本語情報は正直なところ質がどうこう、という以前のフェーズにいると考えられます。

あまりにも「いま、Puppetをどう使っているか」という素朴な記事、tips、感想がない（少なくとも探しづらい）ため、これから始める人にも、いまなんとなく流れで使っている人にも、もんやりとした不安感を与えているのかもしれません。

コミュニティというほどでもないですが、そういったゆるい紐帯といったものが、現代のOSSプロダクトの利用の際にはやっぱり必要だと思うわけです。

そのきっかけの一つに僭越ながらなれないかなあと思って、今年はPuppetアドベントカレンダーを主宰させていただきました。

## やっぱり単著だ!!1

もう一つPuppetをバーンと行かせるための策として、 **本を出せないか** と考えています。「入門Chef」がChefを皮切りにプロビジョニングツールを改めて見直すきっかけとなっていますし、まずはこの本を、と言えるものがあると便利だと思います。

以下は、筆者の内緒のリポジトリにある目次の案です。

```yaml
はじめに:
  - 1. この本の狙い
  - 2. 先ずは、触ってみよう
第一部 Puppet入門:
  - 3. あらためて、Puppetとは何か
  - 4. 基本的なマニフェストを作る
  - 5. リソースを使いこなす
第二部 Puppetによるサーバ構築実践:
  - 6. マニフェストを設計する
  - 7. サーバの具体的なロールを書いていく
  - 8. リファクタリングをする:
    - 依存関係を整理する
    - Defined Typesを使ってサーバの定義を抽象化する
  - 9. サーバの状態をテストする:
    - Serverspecの導入
第三部 Puppetserverの導入:
  - 10. Puppetserverを立ち上げる:
    - インストール
    - 設定項目
    - External Node Classifiers の利用
第四部 より高度な使い方 - 拡張、外部ツールとの連携:
  - 11. Hieraを使う
  - 12. Rubyによる拡張をする
  - 13. Dockerを用いてインフラCIをする
  - 14. Packerを用いて「ゴールデンイメージ」を作る
終わりに:
  - 15. 総括
  - 16. 参考資料
```

単にPuppetの紹介、入門書、あるいはレファレンスにとどまらず、Docker、ServerspecやPackerを中心としたHashiCorpのツールたちなど、オペレーション自動化の先端的なツールとサーバ自体とをつなぐ重要な役割を担うものとして、Puppetを解説できれば、ある程度の新規性はあるかな...と見ています。

無論、どういう方法で本にするのか、そもそも書けるのか、単著はつらいぞ...のような問題は山積みですが...。クリスマスなのでとにかくやりたいんだ！！！と叫んでみます。サンタさん、書く時間をください :santa: 

## 終わりに

同僚/元同僚にしつこく圧を与えた甲斐もあり、多くの人にご参加いただき、さらにはいままでに交流のなかったPuppeteerの皆さんにも記事を書いていただきました。前半は死ぬかと思いましたが、徐々に参加人数も増え、この通り無事完走できました（で、できたよね...この記事を書いている段階ではわからないのでした）。

本アドベントカレンダーにある通り、Puppetは奥深く、多機能で、そして様々なメリットのあるツールです。Infrastructure as a Code が叫ばれ、コンテナ、Docker、オーケストレーション、HashiCorp tools、Kubernatesと流行の技術がどんどんと出てきますが、その世界線に行く前提として、 **プロビジョニングのレイヤーを固める** ことが非常に重要だと筆者は考えています。

Puppetが、あなたの確実で手堅いプロビジョニングのための助けになると信じています。
WordPress初心者の理解を深める練習問題

サーバー借りて一度WordPressページ作った。
教科書的なものも一つ終えた。
でも、WordPressの事を理解したような気がしない。
そんな方にオススメなのが、
"WordPressのテーマを1から自分で作ってみる”練習問題です！

http://wp-principle.net/make-theme/
http://webdesignrecipes.com/first-time-wordpress-origin-theme/

WordPress、テーマ、自作、などで検索すると色々出てきます。
ぜひやってみましょう。追ってレポートまとめます。
app/assets/javascripts以下のJSを全てcommonjsのrequireに書き換える


仕事でgulpを使って僕がよくいじる一部のjsを高速でビルドできるようにしてみたのだが、JSをいじらない人の手元でなにかと差分がおかしくなったり、ビルドするタイミングを伝えないことで問題起きたり、その為に呼ばれて治すのがとにかくめんどくさかったため、思い切ってすべてのビルド工程をbrowserify_railsとbrowserify-incrementalと(そのtransform)に押し込んで、gulpを排除してみた。

そんで、browserify_rails は導入しただけだと嬉しさがあまりないので、スクリプトを書いて一気にcommonjsに置き換えることにした。

browserify_rails に関してはhokacchaさんの記事が便利。

[モダンJavaScript開発環境 on Rails - クックパッド開発者ブログ](http://techlife.cookpad.com/entry/2015/12/14/130041)

脇道にそれるが、僕は最初、これをbrowserifyを模した別の実装だと思ってスルーしていた。使ってみたら勘違いで、railsプロセスがbrowserify-incrementalを掴んで実行する実装で、それなりに便利だった

## 下準備

コミットログを見る限りこういうことをやったっぽい。

- js系のgem を除去(backbone-railsとか)
- browserify_rails の適用
    - babel6 環境の構築
    - browserify オプションを整える(既存のコードをparseするための coffeeifyとか)
- top level this の置き換え(this => window)
- top level var の置き換え(`var hoge` => `window.hoge = ...`)
- sprockets require はコードより後にないといけないので、並び替える
- SprocketsのJSTをとりあえず `require_tree ./t` してしまう(本当は削除したい)

注意: 元々npm環境はあったので色々はしょってると思う

## スクリプトを流す

babelで書いてた。browserify-rails のセットアップしていたら .babelrc はあると思うので割愛。preset-es2015があればよいはず。

```js
// $ npm install glob
// $ npm install babel-cli -g
// # Move to your Rails root and put this script
// $ babel-node sprockets2commonjs.js

let glob = require('glob')
let fs = require('fs')
let path = require('path')

const ROOT = "app/assets/javascripts"
const coffeeExpr = /#= require (.*)/g;
const jsExpr = /\/\/= require (.*)/g;
const coffeeCommentOut = "#";
const jsCommentOut = "//";

/* Ignore rules */
const whitelist = [
  "i18n"
];

/* Just comment out */
const commentOutList = [
  /^t\//,
  /^i18n\//
];

function convertSprocketPathToCommonjsPath(root, fpath, spath) {
  if (/^\./.test(spath)) {
    return spath;
  }
  let relToRoot = path.relative(fpath, root);
  let rel = path.join(relToRoot, spath).replace(/^(\.\.\/)/, "");
  return rel.indexOf("..") > -1 ? rel : "./" + rel;
}

function listIncludesPath (list, p) {
  for (let w of list) {
    if (
      (typeof w === "string") &&
      w === p
    ) {
      return true;
    } else if (
      (w instanceof RegExp) &&
      w.test(p)
    ) {
      return true;
    } else {
      continue
    }
  }
  return false
}

glob.sync(`${ROOT}/**/*`, {nodir: true}).forEach(f => {
  let c = fs.readFileSync(f).toString();
  const expr = (path.extname(f) === ".coffee") ? coffeeExpr : jsExpr
  const commentOut = (path.extname(f) === ".coffee") ? coffeeCommentOut : jsCommentOut
  let ret = c.replace(expr, (_, p) => {
    if (listIncludesPath(whitelist, p)) {
      return `${commentOut}= require ${p}`
    }
    if (listIncludesPath(commentOutList, p)) {
      return `${commentOut} require('${p}');`
    }
    return `require("${convertSprocketPathToCommonjsPath(ROOT, f, p)}");`
  });
  if (ret != c) {
    fs.writeFileSync(f, ret)
  }
});
```

非常に雑なので参考までに。このスクリプトは全ての require を 相対パスに変換しながら commonjs に置き換える。coffeeとjsに対応。(今回はこれだけしか要らなかったので)。発想はシンプルなので、ぶっちゃけrubyなりで書いた方がいいと思う。

実際には、このスクリプトで問題の全てを解決はしないと思う。流したあとに微調整が必要になるだろう。適当にスクリプトを書き換えるなり、返還後のものを微調整する必要がある。

## 感想戦

最初は手作業でやっていたのだが、書き換えてる最中にミスが頻発したり、書いてる間にどんどんコンフリクトしていったので、諦めて変換スクリプトを書いたが、それが正解だったと思う。下拵え => 変換スクリプトでコンフリクト耐性があった。

とはいえ、もともと全てのjsを1つに圧縮してしまっていたため、比較的楽だったとは思う。
Evernoteノート用のデザインパーツを作成する【コピペでOK】

# はじめに
皆さま、Evernoteはお使いでしょうか。
私はデザインやプログラムなどのスクラップをはじめ、勉強ログとしてもEvernoteを愛用しております。
そんな素敵なEvernoteですが、いかんせんデフォルトエディタの機能が少なく、見やすくキレイなノートを作成するのは困難です。個人的には特にリストの余白が少しもどかしいデス。

そこでノートを独自にカスタマイズできないかと調べ、コピペで使うためのテンプレとしてデザインのパーツを作成してみました。
完全に自分用ですが、何か使えることもあるかと思い簡単にまとめてみました。

> 動作はWebアプリ、デスクトップアプリ（Windows7/Evernote v5.9）で確認しています。



# ノートをカスタマイズする
Evernoteのノートの記述には、XHTMLをベースとした**ENML**というマークアップ言語が使用されています。基礎的なhtmlとcssの知識があれば難しいことはなく、以下のようなステップで簡単にノートを作成することができます。

1. .enexファイルを作成する
2. !DOCTYPEなど必要なタグを記述する
3. htmlを書き**style属性のインライン**で直接スタイルを指定する
4. Evernoteのファイル>インポートで読み込む（デスクトップ版）

> 一旦既存のノートを.enex形式でエクスポートしてそれを編集しても良いかと思います。

```ノートのサンプル.enex
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE en-export SYSTEM "http://xml.evernote.com/pub/evernote-export2.dtd">
<en-export>
<note><title>ノート作成用テンプレート</title><content><![CDATA[<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE en-note SYSTEM "http://xml.evernote.com/pub/enml2.dtd">
<en-note>

// 以下、自由にhtmlとstyleを追加していく
<div style="border:1px solid #ccc;">hoge</div>

</en-note>]]></content></note></en-export>
```

> **[補足]**
> 異なるクライアント間で同じようにレンダリングされることを保証するため、各パラグラフでは`<div>`でラップすることが推奨されています。詳しくは公式ドキュメントをご覧ください。
> https://dev.evernote.com/intl/jp/doc/articles/enml.php


## 注意事項
入力したタグに間違いがあった場合でも、インポート時に**成功したと表示されノートが生成されてしまいます**（バージョンやエラー内容によるのかもしれませんが）。そうなると同期の時に**同期されていないノート**として振り分けられてしまい、上手く処理されなくなってしまいます。
ヘルプ>アクティビティログよりエラー情報が見れますので、もし上手く行かない時はこちらがヒントになりそうです。

> **[補足]**
> XHTMLベースなので、`<br />`や`<hr />`といった空要素もきちんと `/ ` で閉じる必要があります。


**[作成したパーツのイメージ]**

![1.png](https://qiita-image-store.s3.amazonaws.com/0/58436/5464a0f3-1741-6314-653b-86b17438d86a.png)

![2.png](https://qiita-image-store.s3.amazonaws.com/0/58436/9cce5962-4146-e37f-1464-1a7a0bbf1524.png)




# テンプレートの使い方
インポートしたノートにて必要なものをコピペするだけです。

- 文字サイズや文字色などは、ペーストしたものからEvernoteのエディタで更に編集可能です
- コピー時に他スタイルを巻き込んで選択しないように、`<div><br /></div>`で前後に余白を持たせてやると良いかと思います
- アプリによってはタグに初期スタイルが自動設定されてしまうため、h1などはmargin:0;で打ち消した方が調整しやすいかもしれません

## 編集に役立つ機能（ショートカット）

- `Ctrl+Z` | `Ctrl+Y`: 編集の取り消し | やり直し
- `Shift+Enter`: スタイル内側に改行を入れる
- `Ctrl+Shift+V`: プレーン形式でペースト
- `Ctrl+Space`: 選択した範囲のスタイルを削除（※選択状態でないと全体が削除されるので注意）
- `Ctrl+Shift+Space`: 選択した範囲の書式設定を全て削除（タグごと全部消えるので注意）

> クライアントのアプリによってショートカットキーが異なったり、機能がないかもしれません

**[動作イメージ]**
![action.gif](https://qiita-image-store.s3.amazonaws.com/0/58436/be4b89e1-3401-eded-7338-a2504fe2990a.gif)


# デザインのサンプル
良く使いそうなパーツとして以下を作成してみました。※gistにソースコードをアップしているので、もし使えそうなものがあればお好きなようにしていただいて構いません https://gist.github.com/nekoneko-wanwan/55c7b2cbc937ab30286d

- テキスト装飾系
- 見出し
- 水平線
- リスト
- 定義リスト
- テーブル
- 強調するblock
- 補足的に使用するblock





# 終わりに
不満点としては、インラインでポチポチ書く必要がある・エクスポートせずにアプリ側で直接コードの確認（編集）ができない・スタイルが壊れやすいなどがあり、メンテナンスが面倒です。この辺りはそのうち改善されることを期待します。


```
／￣￣￣￣￣＼
| ・  Ｕ     |
| |ι        |つ
Ｕ｜｜￣￣｜｜
```
Electronでmrubyを動かす

# はじめに

Electronのレンダラーサイドでもmrubyが動きます。
ということを紹介する簡単な記事になります。

## Emscriptenの準備

HomebrewでもEmscriptenが用意されているようなので、
そちらを使う向きには、全く不要の作業。

### 古ければ新しくしておく

```bash
cd $(EMSDK_HOME)
./emsdk update
./emsdk install latest
./emsdk activate latest
```

### Emscripten SDKの環境変数設定

```bash
source ./emsdk_env.sh
```

## webrubyを入れる

ここからが本題、WebRubyにはGemが用意されているので、それを
インストールします。

```bash
gem install webruby
rbenv rehash  
```

## webrubyを使う

webruby newコマンドで
指定したプロジェクト名のフォルダが作成され。
app/app.rbに以下のようなコードが生成されます。
これを書き換えて、Electronで実行したいコードにします。

```rb
# This is the entrypoint file for webruby

5.times { puts 'Ruby is awesome!' }
```

その後、rakeコマンドでビルドすれば、
Emscripten SDKが使われて、c => js変換が行われ、
build/webruby.jsが作成されます。

```bash
webruby new ElectronMeetsMruby
cd ElectronMeetsMruby
rake
```

## Electronでmrubyを動かす

rakeコマンドで生成されるwebruby.jsは以下の様にブラウザで使うことが
前提のコードになっています

```html
<script src="./webruby.js"></script>
<script>
  const w = WEBRUBY();
 
  /* Runs embedded source code in mruby.js file. */
  w.run();
 
  w.close();
</script>
```

### コマンドラインでElectronを動かして、確認するには

以下の様にすることで、ElectronをNode.jsとしてコマンドラインで動かして、
そこで、mrubyを動かすことが可能になります。

```bash
cp build/webruby.js .
echo "(function (){const w = WEBRUBY();w.run();})();" >> webruby.js                            
ELECTRON_RUN_AS_NODE=1 electron webruby.js
```

## mrbgemをつかうには

以下の自分が書いた記事があります。通常のmrubyのbuild_config.rbに
記述する要領で、Rakefileを編集すれば良いようになっています。

当然ながら、Emscriptenでビルド可能なモジュールでないと、webrubyのビルドが出来ません。

- http://abrakatabura.hatenablog.com/entry/2014/02/02/164406

# 関連記事

- [Electronで自分のIPアドレスをLAN内のiPhoneに通知するには](/entry/2015/10/24/113659)
- [Raspberry Piの温度をgRPCを使ってElectronで作ったデスクトップマスコットに表示させた](/entry/2018/06/16/070747)
- [ElectronでWebGL(three.js)使ってデスクトップマスコット作った際に分かったこと](/entry/2016/01/09/134348)
- [ElectronでmacOSのDockやWindowsのタスクバーに独自のアイコンを表示するには - non vorrei lavorare](/entry/2018/08/20/202928)
- [Tensorflowのclassify_image.pyにElectronでGUIを被せてみた](/entry/2017/02/05/134054)
- [lisp版ElectronのCeramicを動かした](/entry/2015/09/08/071602)
Ubuntu 15.10でRAID6を組んだ時の記録

mdadmでRAID6を組んだ時の自分用メモ

```
history
sudo apt-get update
sudo apt-get install -y tmux
sudo apt-get install -y mdadm
sudo lsblk
sudo gdisk /dev/sdb
sudo gdisk /dev/sdc
sudo gdisk /dev/sdd
sudo gdisk /dev/sde
sudo gdisk /dev/sdf
x
z
y
y
sudo fdisk /dev/sdd
n
p
en
en
en
en
w
sudo mkfs.ext4 /dev/sdb1
mke2fs -t ext4 /dev/md0
sudo mount /dev/md0 md1
sudo su -
mdadm --detail --scan > sudo /etc/mdadm.conf
echo "/dev/md0            /home/vagrant          ext4      defaults    0 0" > /etc/fstab
```
( ˘ω˘).｡oO（Apple が用意したアラートを使うとメモリリークするのでやめよう...）

## 結論
表題の通り
`UIAlertView` や `UIAlertController` を使用しないで自作するか、
使用していないライブラリを使用しよう・・・
( ˘ω˘).｡oO（RINGO KUTABARE）

## 経緯
`UIAlertView` はリークするみたいだし（参考：http://mokyu.game-ss.com/it%E9%96%A2%E9%80%A3/uialertview%E3%81%AB%E3%81%A6%E3%83%A1%E3%83%A2%E3%83%AA%E3%83%AA%E3%83%BC%E3%82%AF%E7%99%BA%E7%94%9F-ios8-）
そもそも非推奨なので、`UIAlertController` を使おう

↓

```objc:MyViewController.m

- (void)doAlert
{
    //　考えうる限りの最小のアラート表示処理でテスト
    UIAlertController *ac = [UIAlertController alertControllerWithTitle:@"title" message:@"message" preferredStyle:UIAlertControllerStyleAlert];
    [ac addAction:[UIAlertAction actionWithTitle:@"ok" style:UIAlertActionStyleDefault handler:nil]];
    [self presentViewController:ac animated:YES completion:nil];
}
```

↓

`Instruments` で確認したら、OK 押した時に UIAlertView と同じくらいリークしてる・・・
変数 ac の代わりに `UIViewController` を設置した時は問題がない
(´･ω･\`)・・・？

↓

> http://stackoverflow.com/questions/26247221/ios-8-only-memory-leak-with-uialertcontroller-or-uiactionsheet/30312928#30312928

英語がちゃんと読めないけど、
UIAlertController でメモリリークが発生したけど、iOS のバグだよ（１年前）
ってことが書いてると思う　きっとそう
なんにせよ現状（２０１６年１週間前）で漏れてるわけで・・・もう解決策探すの嫌なわけで・・・

↓

(´；ω；\`)２度とアップルのアラートつかわん


## おまけ
一応 UIAlertController をプロパティに保存しといて破棄せずに呼び出す
なら、リークはしないでアラートを使用することができる
（presentViewController で呼んだアラートが破棄される時にリークしてんだね）

が、UIAlertController は タイトル、メッセージは変更できるが
`UIAlertAction` は 追加し続けることしかできない
だめだこりゃ
やりようはあるだろうけど、そこに労力をつぎ込むなら頭に書いた結論を遂行したほうが早い・・・

***

`Instruments` の出し方は、とりあえず `Xcode` でビルドして、`Debug Session` で `Memory` を開いて、
そこにある `Profile in Instruments` をクリックするとなんかウィンドウが開くよ
あとは上に書いてるコードを実行してアラートを開いたり閉じたりすれば、赤いチェックマークがついてリークしてるよってでるよ

これは iOS8.4 の端末ではできたんだけど
iOS9 の端末ではなぜかできなかったよ
検索かけたらまた
iOS9 のバグ
って感じの英語が見えたので俺は調べるのをやめたよ
もう俺は英語読みたくないんだ　やめてくれ( ˘ω˘)
仕事をちょっとハッピーにしよう！

こんにちは！

二回目の登場タケモトです :raising_hand: 

あ〜今日は会社に行きたくないなー、、、っていう日、誰にでもありますよね :-1: 
今回は私がちょっとテンションを上げるためにしていることをご紹介したいと思います :dizzy:


#いいにおいの香水 :pig_nose: 
今愛用しているのはレペットの香水です！
もぎたて果実の香りがします :speak_no_evil: 
同じ香りのボディクリームもデスクに常備して癒されています :see_no_evil: 
![41c0vBayWLL.jpg](https://qiita-image-store.s3.amazonaws.com/0/103803/9d096b26-ae1f-804a-c327-d70884581198.jpeg)


#かわいいネイル :nail_care: 
パソコン打つ度にテンションあがります！
ちなみに、季節感は無視するタイプです :triumph: 
![image1 (1).JPG](https://qiita-image-store.s3.amazonaws.com/0/103803/0693ee88-28d7-5d52-2049-b4ff78f034d1.jpeg)


#化粧直し不要のメイク道具 :crown: 
鏡を見てお化粧が崩れてるとテンション下がりますよね、、、 :scream: 
そこで！朝から夜まで化粧直しいらずの戦士たちをご紹介します :ok_woman: 
　　　
1.ルナソルのパウダーファンデーション
これはほんとにすごいです
毛穴が消滅します、そしてくずれない！
ただ、あまりカラーバリエーションが豊富でありません :crying_cat_face: 
![149109_xl.jpg](https://qiita-image-store.s3.amazonaws.com/0/103803/6149e58a-a06e-0d23-d34f-75a41b453cbd.jpeg)

　
2.エチュードハウスのBBパウダー :baby: 
これは本当に教えたくないですってくらい良いです
学生の時からずーっと使ってます :dancers: 
ふわふわ陶器肌になれます。
色は白めです
↑のルナソルを薄く塗って、このパウダーをふんわりのせると最強。
![2.jpg](https://qiita-image-store.s3.amazonaws.com/0/103803/af0281b9-4cb2-910d-1e86-24bdacfd5c85.jpeg)



3.マキアージュのチーク :blush: 
たくさん色があるので自分が好きな色を作れます！
そして夕方になっても色が落ちていません :+1: 

![193120_xl.jpg](https://qiita-image-store.s3.amazonaws.com/0/103803/52267ccb-47d8-eafc-7bb2-6e2ab6f55f8d.jpeg)

　
4.MACのアイシャドー(テンプティング) :eyes: 
これは何個リピートしたかわかりません、、、 :heart: 
ないと私の目は完成しません :collision: 
店頭でも売り切れの時も度々。
ただ、割と粉とびします :crying_cat_face: 
しかし発色最強、赤みも強すぎず彫りが作れます！
![sim.jpeg](https://qiita-image-store.s3.amazonaws.com/0/103803/aacd3104-f40a-d052-8851-bb9722cdbde7.jpeg)


5.JILL STUARTのラメ :princess: 
アイシャドウのベースにしても良いですし
仕上げにちょんちょんと乗せてもキラキラが主張されて良い感じです！
かわいいパッケージにいいにおいでいやされます :two_hearts: 
しかしきちんと閉めないと固まってしまうのでご注意を :sweat_drops: 
![114834.jpg](https://qiita-image-store.s3.amazonaws.com/0/103803/638d61f0-9d8e-dd94-0556-c9f645d2d6d5.jpeg)



#さいごに
おすすめはたくさんありますが厳選してご紹介しました :smiling_imp: 
そんなこんなでテンションがあがらない時もなんとか会社に来ています :dash: 

是非女子の皆様ご参考にしてみてください :innocent: :heartbeat: 
男性陣もプレゼントにいかがでしょう！？
きっと喜ばれますよ :cupid: 


それでは皆様良いお年を :pray:
選択したテキストでWeb検索を実施する際にハマったこと


`Intent.ACTION_WEB_SEARCH`を使用して、Web検索を簡単に実装することができます。
典型的なコードは以下のような感じになるかと思います。


```java
CharSequence selectedText = textView.getText()
        .subSequence(textView.getSelectionStart(), textView.getSelectionEnd());
Intent intent = new Intent(Intent.ACTION_WEB_SEARCH);
intent.putExtra(SearchManager.QUERY, selectedText);
startActivity(intent);
```

しかしこのコード、コンパイルこそ通るものの正常に動作しません。Google検索は起動されるが、選択したテキストによる検索が実行されないまま止まってしまうのです。

なんでかなあ〜？としばらくハマってしまったんですが、原因は`intent.putExtra`で渡す引数です。
１行目を以下のように修正すれば正常に動作しました。

```java
String selectedText = textView.getText()
        .subSequence(textView.getSelectionStart(), textView.getSelectionEnd())
        .toString();
...
```

要するに`intent.putExtra`には`CharSequence`ではなく`String`を渡さなければならないということです。`CharSequence`も渡せるし、`String implements CharSequence`なので問題ないと思い込んでました・・・。
CodeIgniter3にvlucas/phpdotenvをインストールする方法

## 概説
- ここでは[CodeIgniter](https://www.codeigniter.com/)に[PHP dotenv](https://github.com/vlucas/phpdotenv)を導入する方法を示します。

## 導入経緯
- DBの接続情報などcredentialな内容をGitHub上にコミットしている状態が気持ち悪かった。（プライベートリポジトリなんだけど）
- Webサーバーの環境変数でもよかったのだけど、CLI経由でDB接続している処理があり、.envに設定をまとめたかった。
- Laravelでは標準でバンドルされているのでなんだか悔しかった。

## 準備
- composer.jsonに `"vlucas/phpdotenv": "2.0.1"` を追記します。（※ここではcomposerの使い方については言及しません）

```json:composer.json
"require": {
  "codeigniter/framework": "3.0rc",
  ・
  ・
  省略
  ・
  ・
  "vlucas/phpdotenv": "2.0.1"
},
```

- 次に.envファイルを準備します。今回は、CodeIgniterのアプリケーションディレクトリ配下に以下のようなDB接続情報を記載したものを準備しました。

```.env:.env
DB_HOST="localhost"                                                                                         
DB_NAME="db_name"
DB_USER="db_user"
DB_PASS="db_pass"
```

- 利用するたびに `$dotenv->load();` を呼ぶのは面倒なので、今回は `core/MY_Controller.php` の__constructに以下のような感じで追記しました。（もっと良いやり方があれば教えて下さい）
- 上記のとおり、.envファイルをアプリケーションディレクトリの直下に配置したので、 `Dotenv\Dotenv` の引数に `APPPATH` を渡しています。

```PHP:core/MY_Controller.php
<?php
class MY_Controller extends CI_Controller
{
	public function __construct()
	{
		parent::__construct();
		$this->dotenv = new Dotenv\Dotenv(APPPATH);
		$this->dotenv->load();
	}
```

## 使い方
- 準備が整ったら、後は `getenv('DB_HOST')` のように呼び出すだけです。以下は `config/database.php` での使用例。
 
```PHP:config/database.php
$db['default'] = array(
	'dsn'	=> '',
	'hostname' => getenv('DB_HOST'),
	'username' => getenv('DB_USER'),
	'password' => getenv('DB_PASS'),
	'database' => getenv('DB_NAME'),
	・
	・
	省略
	・
	・
);
```

## 既にGitHubにcredentialな内容をコミットしちゃってる場合は？
- [GitHub にパスワードとかセンシティブなファイルを push してしまったときの対処法](http://qiita.com/dtan4/items/34e41e3bd40a43fd8cbf)を参考にするとよいと思います。
【今更】txt.gzを確認するのに解凍する必要なんて無かったんだ【驚愕】


    ----

    txt.gzを簡単に確認する方法なんて、昔はなかったんだ。
    知らなかった。
    そんな悲しいことをぼくは知らなかった。
    知らなかったんだ。

    「コマンドは、あるよ」
    彼女は言った。

    「ここに、あるよ」
    確かに、彼女はそう言った。
    zlessのあるOS。
    …それをいま、ぼくは使っていた。

    ----

# 圧縮テキストファイルを解凍せずに閲覧するzcat, zless, zmore

```
zcat misaki.txt.gz
zless mayu.txt.gz
zmore mio.txt.gz
```

# 比較もできるよzdiff, zcmp

```
zdiff nagamori.gz dayomon.gz
zcmp 乙女.gz 漢女.gz
```

## 注釈
普通にless,more,catでも確認できる環境があるそうで。
まずは試してみよう。最近のUNIXディストロなら出来そうだけど。確かMacターミナルでは出来た。

あと、これが出来るなら、あらゆるアプリのログを圧縮で出力すれば平和になるかも。
zfs,btrfsなどの重複排除機能を使ってなければの話ですが。
Linux Performance Analysis in 60,000 Milliseconds


よくまとまっているので要所を抜粋メモ

> In this post, the Netflix Performance Engineering team will show you the first 60 seconds of an optimized performance investigation at the command line, using standard Linux tools you should have available. 
> 
> - http://techblog.netflix.com/2015/11/linux-performance-analysis-in-60s.html

```
uptime
dmesg | tail
vmstat 1
mpstat -P ALL 1
pidstat 1
iostat -xz 1
free -m
sar -n DEV 1
sar -n TCP,ETCP 1
top
```

## uptime

- ロードアベレージを把握
- この値が高い場合はたいてい CPU デマンドな問題であることが多い
    - vmstat or mpstat で掘り下げる

## dmesg | tail

- システムメッセージを表示
- 何かエラーが出てる場合、大抵はパフォーマンスに影響が出ている
- 決してこのステップを飛ばしてはならない

## vmstat 1

- サーバの統計情報を1秒おきに表示
- チェックすべきもの
	- r
		- 実行待ちプロセス数。ロードアベレージが CPU デマンドなのかどうかを判断できる。
		- CPU 数よりもこの値が多ければサチってる。
	- free
		- フリーメモリの Kilo Bytes 量。充分に多いかを確認。
	- si, so
		- swap-in/out 数。ゼロではければメモリが足りてない。
	- us, sy, id, wa, st
		- 全 CPU 時間がどう使われているかのブレークダウン表示。
		- usertime, system time (kernel), idle, wait I/O, stolen
		- CPU がビジーであれば user, system 時間を確認して分析する
		- wait I/O が高ければディスクがボトルネック
		- system time は IO 処理に必要だが 20% をこえるような場合 kernel の IO 処理に何らかのムダが生じている
		- usertime が高くても CPU がサチってるとは限らない
			- その判断は r 列を見て行う

## mpstat -P ALL 1

- CPU 時間を各 CPU にブレークダウンして表示
- CPU が1つしか使われてなかったらアプリ側が活かしきれてない

## pidstat 1

- CPU を使ってるプロセスのサマリを出す
- top と違ってスクリーンがクリアされないので状態の遷移を確認できる

## iostat -xz 1

- ブロックデバイスの分析に使う
- 発行されたワークロードとその結果を見ることができる
- チェックすべきもの
	- r/s, w/s, rkB/s, wkB/s
		- デバイスに対して発行されたリードライト情報。
		- ワークロードの rw 特性をつかむ。
		- 問題が起きている場合はデバイスの特性にあってない要求が出されている。
	- await
		- IO にかかる平均時間のミリ秒表示。
		- 値が高い場合はデバイスがサチってるか問題が起きている。
	- avggu-sz
		- デバイスに発行されたリクエスト数の平均。
		- 1より大きい場合はサチっている
			- リクエストを並列処理できるデバイスであっても
	- %util
		- デバイスからレポートされた使用率。
		- 60% を超えていると多くの場合パフォーマンスが劣化する
			- デバイスにもよるが
- ストレージデバイスが複数のバックエンドディスクからなる論理ディスクの場合、100% の util は何らかの IO 処理が時間を使いきったということで、必ずしもバックエンドがサチってることを示さない
	- たいていは余力がある
- ディスク IO 性能が低いことが必ずしもアプリの問題ではないことに留意。
- 多くのアプリケーションには非同期 IO などのテクニックがある。

## free -m

- チェックすべきもの
	- buffers
		- ブロックデバイスの IO に用いるバッファキャッシュの量
	- cached
		- ファイルシステムにより利用されているページキャッシュの量
- 以上のパラメータが 0 付近であれば IO 負荷が高い
- ZFS on Linux は free の結果に正しいキャッシュ量を返さないので注意

## sar -n DEV 1

- ネットワーク・インタフェースのスループットを表示
- 限界に近づいてないか確認

## sar -n TCP,ETCP 1

- TCP メトリクスのサマリ表示
- チェックすべきもの
	- active/s
		- 張りに行っているセッションの数 / sec（outbound）
	- passive/s
		- 受けているセッションの数 / sec（inbound）
	- retrans/s
		- 再送数 / sec
- active, passive はざっくりとサーバの負荷を測るのに使う
	- localhost to localhost もカウントにはいるので「ざっくり」

## top

- これまで紹介してきたコマンドの結果を含む
- 時系列の変化を把握しづらい
- 更新をとめるには ctrl-s する
- 再開は ctrl-q
hubコマンド入れる(linux)


./script/buildとかしてるとエラー出た。
golang入れる必要あった。 1.4以上とのこと。
ubuntuのリポジトリのものは古かったので、他の人がメンテしているものを使う。
https://launchpad.net/~evarlast/+archive/ubuntu/golang1.5

## golang入れる

```bash
sudo add-apt-repository ppa:evarlast/golang1.5
sudo apt-get update
sudo apt-get install golang
```

## hubコマンドを入れる

rubygemsにあるhubコマンドは遅いのでこちらのものを利用しましょうとのこと。

path通ってるところ(今回は/usr/local/bin)に配置する

```bash
git clone https://github.com/github/hub.git
cd hub
./script/build
sudo cp hub /usr/local/bin/
```


## エイリアス張る
```bash
echo 'eval "$(hub alias -s)"' >> ~/.bash_profile
```

以上。詳しくはこちら(https://github.com/github/hub#commands)
Monacaでアプリを作ってリリースしてみた #1

基本的なHTML,JavaScriptの知識さえあればモバイルアプリをつくれてしまうサービス「[Monaca Cloud](https://ja.monaca.io/cloud.html)」このMonaca Cloudを使って、モバイルアプリを今までに作ったことがなかった自分がApp Storeにアプリをリリースするまでの勘所を紹介したいと思います。
ちなみに今回リリースしたアプリは「[麻雀収支W](https://itunes.apple.com/jp/app/ma-que-shou-zhiw/id1065333498?mt=8)」というツール系のアプリです。
![スクリーンショット 2015-12-24 15.59.38.png](https://qiita-image-store.s3.amazonaws.com/0/83679/aedaac9d-b76a-b3ad-3b6c-74b24c49cfaf.png)

それでは、本業以外の空いた時間でなにか自分でもこれから開発してみたいなーという方へ、少しでも足しになればと思い書いていきたいと思います！

#Monacaでアプリを作るメリット
iPhoneのネイティヴアプリであれば、もちろんXcodeを使って開発していくのが一般的かと思います。
新しくObjective-CやらSwiftやら学びつつやってもよかったのですが、~~言語取得がめんどくさいの~~でMonacaを使ってリリースしようと決めました。Monacaのどの辺が良かったのかを挙げていきます。
## Onsen UIがいけてる
AngularJSやjQueryと組み合わせて使えるUIフレームワークOnsen UIが標準搭載されていて、これがとにかくいけてます。
UIコンポーネントはタグで宣言できるので、難しいことは考えずにいけてるUIがつくれます。
詳しくは[こちら](http://ja.onsen.io/)
## デバッガーがいけてる
主に自分は、iPhoneアプリ開発をしましたがApp Storeからダウンロードできる[Monacaデバッガー](https://itunes.apple.com/jp/app/monaca/id550941371?mt=8)がとにかくイケてます。
ログインするだけで、開発中のアプリをロードして簡単にデバッグできます。
## ドキュメントが日本語！
ここ日本人なら結構感じるかと思いますが、ドキュメントがすべて英語だと~~読む気が起きない~~どうしても、翻訳コストがかかるかと思います。
Monacaを作ってるのは[アシアル株式会社](http://www.asial.co.jp/)という日本の企業なので、ドキュメントにブログに日本語の記事が豊富なのです！やったぜ！
#準備
Monacaのプロジェクトを開始する前にいくつか準備すべきものがあります。下記に挙げている物以外にも、アイコンを作成するツール（Inkscape）や、Apple Developer プログラムの登録が必要になってきますがそれは後々紹介したいと思います。
## Mac Book Air (13インチ) 購入
![ファイル 2015-12-24 16 15 27.jpeg](https://qiita-image-store.s3.amazonaws.com/0/106904/bb49b73f-f885-c6fb-390e-a5de27b9a410.jpeg)

これ結構大事です（笑）
なぜかというと、平日の業後や休日でアプリを作るという方であれば、仕事で疲れた身体に鞭を打ち、TVショーの誘惑に打ち勝ちながらアプリ制作に時間を割かなければいけません。
そんなモチベーションをあげるのにオススメなのが、MacBook。（決してステマではありません）Windows一筋で生きてきた自分がMacBook購入にいたった機能的背景からくる理由はいくつかあるのですがここでは割愛します。機能面はともかく、スタバでMacBookを開いただけで俄然モチベーションが俄然上がるという方にはとにかくオススメです。
少々値は張りますが自分への投資だと思って購入すると良いでしょう。
**＊機能的にもiPhoneアプリをリリースする手順の中で必要になってきます。**
## Monacaアカウント取得
[Monacaのページ](https://ja.monaca.io/)右上からサインアップをサクッとしましょう。
## アプリの構想を練る
方法はどんな形でも良いのですが、自分はノートにペンで書いて構想を練りました。
![写真 2015-12-24 15 53 31.jpg](https://qiita-image-store.s3.amazonaws.com/0/106904/94170d62-75dd-27f3-47f1-b49f852264fe.jpeg)

作っていくうちに仕様は大幅に変わりましたが基本的なコンセプトはこのノートをベースに作っていくので、誰向けにどんなアプリを作るのかというコンセプトと、大まかな仕様を書いておきます。

当初予定していた、Facebookログイン機能などはやろうと思うとできたのですがいかんせんログインするメリットがなかったので開発途中でとりやめました(^_^;)

アプリの構想を練ったら次回からは、実際にMonacaのアプリを開発した手順を追っていきたいと思います！

続く
atomの設定をバックアップできるパッケージ「sync-settings」が便利


OSのクリーンインストールやPC買い替え等でatomを再構築する時に便利なpackage[sync-settings]の紹介です。


packageだけの同期なら以下の方法があります。

[Atom の apm stars で興味のあるパッケージを管理する - Qiita](http://qiita.com/iorionda/items/4ce4954c2091d95124a0)


私もこの方法で再構築してみたのですが、スニペットが使えなくなってるのが地味に不便だったので導入してみました。

## sync-settings

[sync-settings(atom.io/packages)](https://atom.io/packages/sync-settings)

sync-settingsには主に4つの機能があります。

#### backup

以下をバックアップできます。
必要なものだけをバックアップすることもできます。

- installed packages
- user keymaps
- user styles
- user init script
- snippets
- user defined text files

#### restore

バックアップした設定を復旧できます。
必要なものだけを復旧することもできます。

#### view-backup

バックアップ済の設定を確認できます。

#### check-backup

新規のバックアップが無いか確認できます。

## 注意

githubのアカウントが必要です。
gistに設定データを置くことで同期が可能になります。

## 使い方

### インストール
atomの[preference - Install] から[sync-setting]で検索、もしくはコマンドラインから

```
apm install sync-settings
```

### 準備

1 - atomで[preference - Packages] と進み、sync-settingsのsettingsを開きます。
※ インストールした直後だとpackageが読み込まれていない場合があるので、settingsのボタンが無い時は[cmd+opt+ctrl+L]でリロードしてみてください。


2 - githubのアクセストークンを取得します。[ここをクリックすると以下の画面になります](https://github.com/settings/tokens/new)

![pic2015-12-23 21.36.04.png](https://qiita-image-store.s3.amazonaws.com/0/4784/74ca8edb-3b0d-7c7c-8d45-0087cad8fd12.png "pic2015-12-23 21.36.04.png")

githubのパスワードを入力してボタンを押します。
権限確認の画面になります。
[gist]だけにチェックを入れておけば大丈夫です。

[Token description]には[Atom Sync Settings]とでも入力しておけばOKです。

![pic2015-12-23 21.37.12.png](https://qiita-image-store.s3.amazonaws.com/0/4784/5dd67386-afca-d96c-7a8f-405f270c2a58.png "pic2015-12-23 21.37.12.png")

ボタンをクリックするとトークンが生成されるので、1の[Personal Access Token]の欄にコピペしてください。

![pic2015-12-23 21.39.05.png](https://qiita-image-store.s3.amazonaws.com/0/4784/2f98bc82-14c7-2ff3-a0e2-a7dd820bc516.png "pic2015-12-23 21.39.05.png")


3 - 新しいgistを作成します。[ここをクリック](https://gist.github.com/)

適当なファイル名を付けて、適当に中身を書いて[Create secret gist]のボタンを押せばOKです。
作成されたgistのページに飛ぶのでURLをチェックしてください。

```
https://gist.github.com/[アカウント名]/[gistID]
```

となっていますので、gistIDを1の[Gist Id]の欄にコピペしてください。

以上で設定は終わりです。

### バックアップ

- atomを開いて[shift+cmd+P]でコマンドパレットを開きます。
[sync]等と入力すればサジェストされるので[Sync Settings:Backup]を選択してください。
これでgistにバックアップが作成されます。

[Sync Settings:View Backup]で確認できます。

![pic2015-12-23 21.44.32.png](https://qiita-image-store.s3.amazonaws.com/0/4784/cdc9b7ac-d122-3039-8c77-db2082a6ec87.png "pic2015-12-23 21.44.32.png")

### リストア
バックアップと同様に[Sync Settings:Restore]を選択してください。
これでバックアップした設定が復旧できます。
Click Modular RouterでOpenCVを扱う

# 環境
- OSX 10.11.2
- click (Click) 2.1

# やり方
clickでOpenCVを使う
staticにリンクしてしまうのが楽

```
./configure CXXFLAGS="`pkg-config --cflags --libs opencv`"
```

あとは、

```
#include <opencv/cv.h>
```

したりする
MacでVirtualBoxが起動できない


[このフォーラム](https://www.virtualbox.org/ticket/7889)によると

"VERR_SUPLIB_OWNER_NOT_ROOT"　なんちゃらというエラーが出たら/Applications ディレクトリの権限がない可能性がある。

```sudo chown root /Applications```

で自分の場合は解決した。
OSX 10.11で確認。
MySQL5.7でSequel Proに接続できない時の対処法


さて、Sequel Proでも使うか...と思って接続しようとしたら何やらエラーが出て接続できなかったので、その対処法を残しておきます。

今回のエラーの原因はMySQLのバージョンが5.7.x系によるもので、わりとすぐに直りました。

```
$ mysql --version
mysql  Ver 14.14 Distrib 5.7.10, for osx10.10 (x86_64) using  EditLine wrapper
```

## 解決策

以下のコマンドでOKです。

```
$ mysql_upgrade -u root -p
$ mysql.server restart
```

おそらく、下のようなメッセージが表示されるはずです。


```
$ mysql_upgrade -u root -p
Enter password:
Checking if update is needed.
Checking server version.
Running queries to upgrade MySQL server.
Checking system database.
mysql.columns_priv                                 OK
mysql.db                                           OK
･･･
Upgrade process completed successfully.
Checking if update is needed.
```

これで無事、Sequel Proが使えるようになりました:+1: 

## 参考
- https://github.com/sequelpro/sequelpro/issues/2302
- https://dev.mysql.com/doc/refman/5.6/ja/mysql-upgrade.html
Vagrantでサーバー立ててActionCableを試してる時にRequest origin not allowedがでて辛い

rails5のベータ出ましたね。試したくなったので触ってたらハマったのでメモ。

## 結論

下記見ると一発だった。
https://github.com/rails/rails/tree/master/actioncable#allowed-request-origins

private_ipを設定していたから、つながらなかったんですね。。。

```text:本文
By default, Action Cable allows all requests from localhost:3000 when running in the development environment.
```

```text:意訳
environmentがdevelopmentの時は、localhost:3000からのすべての要求を許可します.
```

## エラー文

```text:ちょっと加工した
Started GET "/" [****] for 192.168.33.1 at 2015-12-24 +Request origin not allowed: http://192.168.33.10:3000
```

## 対応した方法

サンプルなのでどこからでも要求を許可するように、initializersにaction_cableの設定書きました。

```rb:config/initializers/action_cable.rb
# どっからでも許可するようにする
ActionCable.server.config.disable_request_forgery_protection = true
```

## 多分こうした方がいいかも

試してないのであれですが、nginxとか使っていい感じに中継してもらったりすると上記の設定必要なくなるかもしれないです。
為替のボラティリティはt分布？

# 概要
為替のボラティリティを任意の確率分布関数にフィッティングしてみる実験をします．
今回は2002年4月1日からのドル円レートを用いて実験しました．

# 使用データ&ソフトウェア
- みずほ銀行提供の外国為替公示相場ヒストリカルデータの日次データ(2002/4/1~)(http://www.mizuhobank.co.jp/rate/market/historical.html)
- Matlab R2015b

#結果
![為替のt分布.png](https://qiita-image-store.s3.amazonaws.com/0/95458/402c9714-b908-cc15-abe6-976c6e23ba97.png)
オレンジ色のヒストグラムが実際のボラティリティ，青線が t位置-スケール分布です．このt位置-スケール分布のパラメータは

    mu = 0.0063088
    sigma = 0.50046
    nu = 4.42082

となっております．驚くほどの一致度に背筋が凍りそうでした．
ちなみにパラメータの説明は
μ(mu): 位置パラメーター
σ(sigma): スケール パラメーター
ν(nu): 形状パラメーター
です．

![27years_usdjpy.png](https://qiita-image-store.s3.amazonaws.com/0/95458/8ef8c45f-c499-8af4-5918-6c6e177f7990.png)
上記の確率分布関数を用いて，ランダムウォークにより生成したn=10000までのレートの図です．
Smalltalkで迎える魅惑のクリスマス

明日がクリスマスなので、カウントダウンを行う簡単なプログラムを書いてみます。
なお処理系はまたまた[Pharo Smalltalk](http://pharo.org/)です。

```smalltalk
[ 
[DateAndTime current < '2015/12/25' asDateAndTime] whileTrue: [(Delay forSeconds: 1) wait].
font := LogicalFont familyName: 'Source Code Pro' pointSize: 18.
1 to: Display width do: [:x |
	Display getCanvas drawString: 'Merry Christmas!' at: x @ (Display height * x cos) font: font color: Color random.
].
] fork.
```

シンプルなプログラムなので解説はほぼ不要と思いますが、要は2015年12月25日になるまで、一秒待ちを続け、いざ時が来たら画面に派手な表示を行う処理を書いただけです。バックグラウンドで動くように、全体をforkしています。

Playground(ワークスペース)で"do it"(Alt or Cmd + d)した後、プロセスブラウザで、プロセスが動いていることを確認してみましょう。Worldメニューから"Tools"->"Process Browser"を選択します。

![open-process-browser.png](https://qiita-image-store.s3.amazonaws.com/0/61787/6f873eaf-05eb-e8c7-5338-b92522514e86.png)

もしくは```ProcessBrowser open```を"do it"しても良いです。

優先度40で動いているのがカウントダウンのプロセスです。ちなみに右クリックでサスペンドしたりなど、いろいろな操作ができますが、クリスマスが来るまでの辛抱なので放置しておきましょう。

![process-browser.png](https://qiita-image-store.s3.amazonaws.com/0/61787/07ee9a64-2bbd-2a64-966b-a23b9af14606.png)

Wolrldメニューから"Save"でイメージを保存しておけば、次回Pharoの起動時にも、このカウントダウンプロセスはちゃんと動いた状態になっています。動作中のプロセスを簡単にハイバネートできるのもSmalltalkの良いところですね。

さて、12/25日を迎えると、以下のような表示になるはずです。

Merry Christmas!!

![merry-christmas-pharo.png](https://qiita-image-store.s3.amazonaws.com/0/61787/e921a8a4-529e-909e-6eb1-19b03a443b12.png)

なお、表示を消すにはWorldメニューから"System"->"Restore display"、あるいは```Display restore```と書いて"do it"です。

今回はMorphなどを使わず、```Display getCanvas```でキャンバスを取り出し、```drawString:at:font:color:```で直接描くというアプローチを取っています。フォントサイズを大きくするなど、いろいろパラメータをいじってみると面白いでしょう。

では心ゆくまでSmalltalkを!!
ブランチを切り替えた時に submodule の commit がずれて苛つくのを post-checkout hook で解消する


`git submodule` を使っていて、 branch間で submodule で指し示してる commit がずれてたりすると、手元で branch を切り替えた時に submodule を充ててる path が git status に現れて（少なくとも自分は）いらつく。

`.git/hooks/post-checkout` に

```sh
#!/bin/sh

exec git submodule update
```

このように書いておけば、`git checkout` のたびに `git submodule update` が走るのでこの点解消される。
【embulk】mysql・Dynamodb・bigquery間のデータ転送を簡単に


# embulkとは

- オープンソースのバルクデータ転送ツール
- Fluentdのバルクデータ版
- プラグインの導入でどんなデータソースからも取得・追加できる

## どんなとき使うの？

- MySQLのデータ分析したいけど●千万件あってしんどいなー。BigQuery移せば楽そうだけど、移すのめんどいな。ダンプとかしないとだし。
- Dynamodbのデータって、指定したインデックスでしか検索できないから分析に使えないなー。BigQueryに移せば・・（以下同上）
- MySQLデータ、DynamoDBに移しておきたいなー。バックアップとして。

## 資料

よくわかるスライド
- [Embulk 20150411](http://www.slideshare.net/HiroshiNakamura/embulk-20150411)

## embulkのインストール方法

https://github.com/embulk/embulk#linux--mac--bsd に従う。

```
curl --create-dirs -o ~/.embulk/bin/embulk -L "http://dl.embulk.org/embulk-latest.jar"
chmod +x ~/.embulk/bin/embulk
echo 'export PATH="$HOME/.embulk/bin:$PATH"' >> ~/.bashrc
source ~/.bashrc
```

## JREのバージョンが古いというエラーの場合

下のようにjavaのバージョンが古いと怒られた場合：

```
[dev@util ~]$ embulk gem install embulk-input-mysql
Exception in thread "main" java.lang.UnsupportedClassVersionError: org/embulk/cli/Main : Unsupported major.minor version 51.0
	at java.lang.ClassLoader.defineClass1(Native Method)
	at java.lang.ClassLoader.defineClass(ClassLoader.java:643)
	at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
	at java.net.URLClassLoader.defineClass(URLClassLoader.java:277)
	at java.net.URLClassLoader.access$000(URLClassLoader.java:73)
	at java.net.URLClassLoader$1.run(URLClassLoader.java:212)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.net.URLClassLoader.findClass(URLClassLoader.java:205)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:323)
	at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:294)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:268)
Could not find the main class: org.embulk.cli.Main. Program will exit.
```

エラーメッセージからClassVersion=51が必要なので、JRE 1.7以上にバージョンを上げる必要がある。

```
yum search openjdk
sudo yum install java-1.8.0-openjdk
```

## プラグインの導入

```
embulk gem install embulk-input-mysql embulk-input-dynamodb, embulk-output-bigquery
```

## embulkの設定ファイルを書く

設定ファイルはどこに置いてもいい。

### mysqlのデータをbigqueryに移動する例:

```mysql_profile_to_bigquery.yml
in:
  type: mysql
  host: xxxxxxxxxx
  user: xxxxxxxxxx
  password: "xxxxxxxxxx"
  database: xxxxxxxxxx
  table: xxxxxxxxxx
out:
  type: bigquery
  service_account_email: xxxxxxxxxx@developer.gserviceaccount.com
  p12_keyfile_path: /path/to/cert.p12
  path_prefix: /tmp/embulk/mysql2bigquery/
  source_format: CSV
  file_ext: .csv
  delete_from_local_when_job_end: 1
  project: coupleslv
  dataset: profile
  auto_create_table: 1
  schema_path: /path/to/schema.json
  table: xxxxxxxxxx
  formatter:
    type: csv
    header_line: false
    timezone: Asia/Tokyo
```

- `service_account_email`, `p12_keyfile_path`は、fluent-plugin-bigqueryの`email`, `private_key_path`とそれぞれ同じ。
- 空のカラムがあってうまくいかない場合は、`ignore_unknown_values: 1`をつけてみる（ちゃんと入っているか確認）
- mysql pluginは、SQLをそのまま書くこともできる
- 中間ファイルのディレクトリはこちらで作ってあげる必要がある
- スキーマのjsonファイルも必要

## 実行する

中間ファイルのディレクトリを作って、実行する。なにこれめちゃ楽。

```
embulk run mysql_profile_to_bigquery.yml
```



# 参考

- [embulk-input-jdbc/embulk-input-mysql at master · embulk/embulk-input-jdbc](https://github.com/embulk/embulk-input-jdbc/tree/master/embulk-input-mysql)
- [sakama/embulk-output-bigquery](https://github.com/sakama/embulk-output-bigquery)
エラー時の備えその3(DNSキャッシュ機能)

# DNSキャッシュ機能
## 概要
DNSサーバの情報をキャッシュとしてROMAインスタンスが保存しておく機能
インスタンスがIPアドレスではなくHostName等で作成されている場合の為の機能

- ( romaA_10001みたいな)
![DNS_cash.png](https://qiita-image-store.s3.amazonaws.com/0/103558/1d6df662-7191-d1c8-8200-4944288b07c9.png)

## 動き
なんらかの理由でDNSサーバとのアクセスが出来なくなった場合、IPアドレスでもFQDNでもない名前のinstanceの場合、ROMAが別サーバにあるinstanceにアクセスできなくなってしまう
↓
これを防ぐため、ROMA起動時にDNSの情報をキャッシュとして各instanceに保持し、このデータを基に通信を行う
↓
不足の事態でDNSサーバがダウンしてもROMAのinstance間の通信は担保される!! 

## 使い方
### configで設定する方法
DNS_CAHINGの値をtrueにする

```rb:config.rb
.
.
# lookup hostname to the nameserver everytime or only first time.
# if set true, the result of lookup will keep.
DNS_CACHING = true
.
.
```

### 動的変更コマンド
ROMA起動後にROMAを止めずに変更したい場合は、以下のコマンドを実行

```
> switch_dns_caching [on|off]
```

# Example
## 条件
- IPアドレスでもFQDNでもない名前でインスタンスを作成する  (今回は以下のように作成)
- インスタンス
 - vm1_20001
 - vm1_20002
 - vm2_20001
 - vm2_20002
- サーバ
 - vm1( 192.168.223.2 )
 - vm1( 192.168.223.3 ) 
- /etc/hosts
以下のように追記

```
192.168.223.2 vm1
192.168.223.3 vm2
```

## 確認
### DNSキャッシュ機能offの場合

```rb:vm1サーバにて
# vi /etc/hosts
  ###以下の行を削除する
  192.168.223.3 vm2

$ telnet vm1 20001
> balse
  {"vm1_20002"=>"BYE", "vm2_20001"=>nil, "vm2_20002"=>nil, "vm1_20001"=>"BYE"}
```
自サーバ内のvm1のサーバはbalse(クラスター終了コマンド)を受け取っているが、vm2は送り先がわからずnilになっている

### DNSキャッシュ機能onの場合
```rb:vm1サーバにて
# vi /etc/hosts
  ###以下の行を削除する
  192.168.223.3 vm2

$ telnet vm1 20001
> balse
  {"vm1_20002"=>"BYE", "vm2_20001"=>nil, "vm2_20002"=>nil, "vm1_20001"=>"BYE"}
```
/etc/hostsを削除したが、instance自体にDNS情報を保存しているのでその情報に基づいてvm2にも正常にbalseコマンドを送ることができた!!
gitで誤ってmasterへcommit・pushまでしてしまったときの対処

「gitでミスってmasterにcommitした、さらにリモートまでpushしちゃった」なんてときの対処方法。resetも効かない、ブランチ戻す操作はしたくない場合に有効なものを実例と共に記載します。

## よくある作業風景
![git_1.png](https://qiita-image-store.s3.amazonaws.com/0/85138/12e71934-5c74-5ab8-1035-28578da5153e.png)

よくあるmasterとdevelopだけのシンプルな構成。developで開発しています。

## しまったやらかした
![git_2.png](https://qiita-image-store.s3.amazonaws.com/0/85138/6eb612b1-655d-bac0-33e7-5b55555ec80d.png)
`git commit`

developにcommitしたかったのに、間違ってmasterブランチにcommitしてしまいました。あろうことかリモートにpushまでしてしまいました。さっさと直さないと非難轟々です。

## 対処 : 手順1
![git_3.png](https://qiita-image-store.s3.amazonaws.com/0/85138/3899b87b-249b-22e8-ecb1-7551972290d8.png)
`git revert C4`

まずは慌てずにミスってcommitした内容をrevertしましょう。revertは「対象のコミットを打ち消すパッチ」を作るオプションです。
これで取り急ぎはmasterに間違って入ったcommit分がきえました。

## 対処 : 手順2
![git_4.png](https://qiita-image-store.s3.amazonaws.com/0/85138/e57ac061-3d29-42c8-a8e0-2b4d62bbf14f.png)
`git checkout develop`
`git cherry-pick C4`

次に本来commitするはずだったブランチ（今回はdevelop）に反映させましょう。developブランチで対象のcommitをcherry-pickしてください。

## 対処 : 手順3
![git_6.png](https://qiita-image-store.s3.amazonaws.com/0/85138/3445945b-d89b-521c-871e-00cacb59aae1.png)
`git cherry-pick C4'`
`git revert`

masterブランチでrevertした内容を取り込み、それを更にrevertして下さい。

やりがちなのがコレをしない場合。やらないと、最終的にmasterにdevelopをマージした際にC4'の内容が優先されてしまい、masterからC4が消えてしまいます。
ので、C4'を打ち消す内容をコミットしてやりましょう。

## 以上です。
![git_7.png](https://qiita-image-store.s3.amazonaws.com/0/85138/7fb66fe3-3720-b425-8730-cb1238f6afc8.png)

これでmasterにdevelopをマージしてもめでたく作業内容のC4,C5,C6がまとめてC7としてmasterに反映されましたね。



画像は[LearnGitBranching](http://k.swd.cc/learnGitBranching-ja/)で作ったものを少し加工して使わせていただきました。