OmniAICreator/Qiita-1.07M huggingface dataset:
Windows版Atomにauto-sasscompileをインストールする：補足

WindowsのAtomにauto-sasscompileを[weblifetimes.comの記事](http://weblifetimes.com/atom-sassautocompile/)を参考にインストールしようとした時に、ちょっと躓いたので、補足として記事に残しておこうと思います。

読みやすくするために一部記事が重複していますが、ご了承ください。

## インストールに必要なもの
- node.js
- node-sass

### node-sassのインストールに必要なもの
- python 2.7
- C++ Build tools

## node.jsをインストールする

[nodejs.org](https://nodejs.org/ja/) から、node.jsをダウンロードしてインストールする

<img width="1661" alt="スクリーンショット 2017-07-19 22.30.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/79673/028194f7-7a5b-e7a5-62b1-6c9ac86a384f.png">

筆者は**LTS**を使用しました。

### インストール後の確認

```
node -v
npm -v
```

両方ともバージョンが表示されればOKです。

## node-sassのインストール
とりあえず以下のコマンドでインストールを試みます。


```
npm install -g node-sass
```

うまくインストールできたら、**Atomのsass-autocompileパッケージをインストールする**まで進んでください。

エラーになった場合
- **Python2**が見つからない
- **VBuild.exe**が見つからない
のどちらかのエラーが出ている可能性が高いです。

エラーの出力量が多いので、探すのに少し手間取るかもしれません。


- Python2が見つからない場合は、**Python2.7**(python2系の最新)をインストールします
- VBuild.exeが見つからない場合は、**VC++ Build Tool**をインストールします


### python2.7のインストール

- [python.org](https://www.python.org/downloads/) からpython2.7をインストールします


![スクリーンショット 2017-07-14 15.13.17.png](https://qiita-image-store.s3.amazonaws.com/0/79673/ec494ef4-86d2-ef3e-bd86-318c7ed23881.png)

画面キャプチャがMac OSになっていますが、Windowsに読み替えてください。


- インストール後に、npmのconfigにpythonの設定を行います
以下のコマンドで設定します

```
npm config set python python2.7
```

### VC++ Build Toolsをインストールする

- [landinghub.visualstudio.com](http://landinghub.visualstudio.com/visual-cpp-build-tools) から**VC++ Build Tools**をインストールします

![CBuildTools.png](https://qiita-image-store.s3.amazonaws.com/0/79673/75ca891c-425d-6328-d165-1532c33f2879.png)


- ここでは、2015年版をインストールしたものとしてコマンド例を記述します


## 再度node-sassのインストールを試みる


```
npm install -g node-sass
```

- VC++ Build Toolsをインストールした場合はコンパイラのバージョンを指定してインストールします

```
npm install -g node-sass --msvs_version=2015
```

インストールが成功したらバージョンを確認します

```
node-sass -v
```


## Atomのsass-autocompileパッケージをインストールする


この手順は、[weblifetimes.comの記事](http://weblifetimes.com/atom-sassautocompile/)の**sass-autocompileのインストール**セクションに則って行なってください。


### 必要に応じてMapファイルの作成にチェックを入れる

- atomの環境設定からsass-autocompileのパッケージの設定を開き、Build Source Mapにチェックを入れる

<img width="828" alt="turn_on_build_map.png" src="https://qiita-image-store.s3.amazonaws.com/0/79673/3ac4f3f0-0f54-a7a4-e810-4cacde40fc0d.png">
Raspberry Pi1(たぶんZeroも可)でGoogle Assistantを試す

Raspberry Pi3じゃなくてもGoogle Assistantができるみたいなので、Raspberry Pi1で試してみました。
たぶんZeroでもできると思います。
(Zero W買えませんでした)

Python全くわかりませんが、手順に沿ったらできました。
「OK Google」は対応してないのかな？

## 参考サイト

* https://github.com/googlesamples/assistant-sdk-python/tree/master/google-assistant-sdk/googlesamples/assistant/grpc
* https://pypi.python.org/pypi/google-assistant-sdk

## ハードウェア

* Raspberry pi1
* スピーカー　…　100均で買った
* マイク　…　LogicoolのWebcam C200が手元にあった


## セットアップ

### Install Python 3

```bash
$ sudo apt-get update
$ sudo apt-get install python3 python3-venv
```

### 作業用ディレクトリの作成

```bash
$ cd ~
$ mkdir MyGoogleHome
$ cd MyGoogleHome
```

### Create a new virtual environment (recommended):

```bash
$ python3 -m venv env
$ env/bin/python -m pip install --upgrade pip setuptools
$ source env/bin/activate
```

### OAuthクライアントIDの作成とJSONファイルの入手

https://developers.google.com/assistant/sdk/prototype/getting-started-other-platforms/config-dev-project-and-account
を参考に、`client_secret_<client-id>.json`を入手。

### Authorization

```bash
$ pip install --upgrade google-auth-oauthlib[tool]
$ google-oauthlib-tool --client-secrets [jsonファイル] --scope https://www.googleapis.com/auth/assistant-sdk-prototype --save --headless
```

コマンド実行後、「このURLにアクセスしてね」的なメッセージが出力され、コードの入力待ち状態になります。
ブラウザでURLにアクセスし、指示に従ってコードを入手。入手したコードをターミナルに貼り付ける。

### サンプルプログラムの入手

```bash
$ sudo apt-get install portaudio19-dev libffi-dev libssl-dev
$ pip install --upgrade google-assistant-sdk[samples]
```
おそらく、google-assistant-sdkそのものもダウンロードしてくると思われます。
結構時間かかります。。。

### サンプル実行

```bash
$ googlesamples-assistant-pushtotalk
```

```
$ googlesamples-assistant-pushtotalk 
INFO:root:Connecting to embeddedassistant.googleapis.com
Press Enter to send a new request...　←エンターを入力して英語で質問開始。
INFO:root:Recording audio request.
INFO:root:End of audio request detected
INFO:root:Transcript of user request: "who is the first American President".　←自動で質問が終わったことを検知して、質問した内容が出力
INFO:root:Playing assistant response.　←音声出力
INFO:root:Finished playing assistant response.
Press Enter to send a new request...　←エンター待ちになって、繰り返す
```

すごーい

### 終わりに

英語が喋れなので、AndroidのGoogle翻訳アプリに喋ってもらいました。
文学部出身のズブの素人がIT業界に就職してからやってきたこと


# はじめに

IT企業を訪れる就活生や、入りたての新人なら少なからず「自分文系なんすけどやっていけますかね...」という思いがあるかと思います。
**文学部西洋史学科**という技術的バックボーンが一切感じられない出身ながらどうにかこうにかやってきた軌跡を紹介することで、不安を解消するとともに今後の参考にしていただけたらと思います。

結論から言っちゃうと、文系だから無理ってことは全くないです。
とはいえ学生の頃から色々やってた人にはスタート地点で差をつけられてるので、そこを埋めたいならそれなりの努力は必要です。

# 参考までに当方スペック

- 三十路手前のナウなヤング
- 上述の通り文学部出身でプログラミングなどの知識0でIT業界に飛び込む
	- 学生時代はエクセルでマクロ組んでる人を神だと思ってた
	- Ctl + C, Ctl + Vでコピペ出来ることを社会人になってから知った
- 新天地を求めて新卒で入った会社からわずか1年半で華麗に転職
	- 同期の度肝を抜く
- 今では10人弱程度のチームのリーダー的立場
	- 開発環境構築したりしてる
	- コードレビューで偉そうなこと言っちゃったりしてる
- AWSとかバリバリ使っちゃってる
- SlackにBotを追加して遊んだりしてる

# 1. 何か資格をとってみる

ITの世界に飛び込んだばかりの頃、本当に何も知らなかったのでとりあえず何か資格の勉強をして知識をつけようと思い、手始めに **ITパスポート**の勉強を始めました。
IT業界で戦ってきた戦士たちからしたら「ITパスポート?まあ何も無いよりはマシなんじゃないwww?」と鼻で笑いたくなるでしょうし、今の私からしてもITパスポートでドヤ顔されたらリアクションに困るのですが、重要なのは **空き時間でちょっと勉強する**といったことに体を慣らしたことかと思います。

その後に基本情報技術者、応用情報技術者も取りましたが、資格を取る上で勉強した内容そのものが今役に立ってるかというと正直微妙なところです。しかし大事なのは **自分の時間の一部を勉強に割く**ことへの抵抗を早いうちに削ぎ落としておくことです。
極端な例を出すなら、「仕事の後はダチと飲みっしょwww」「土日はダチと飲みっしょwww」って感じのノリの生活を数年続けた後で「空いた時間は勉強に充てよう!」と一念発起するのは相当辛いかと思います。

私の場合は幸いなことに数えられないほどの友人[^1]に恵まれていたので、勉強は暇つぶし感覚です。

# 2. ググる とにかくググる その先でさらにググる

仕事をしてる上でわからないことに出くわしたらまずググります。明らかに所属している会社やチームの特殊事情が絡んでたら大人しく先輩や上司に聞きますが、そうでなければまずググります。それはもう、[それだけで記事が一本かけちゃうぐらいに](http://qiita.com/Mic-U/items/f9de1c08c47c50620905)。

ここで大事なのは **必要な情報だけに集中しすぎないこと** です。
何を言ってるのかというと、ググった先にたどり着いたのがQiitaなら目当ての記事だけでなくちらっと人気の記事とかも覗いてみたり、たどり着いたのがブログの記事ならサイドバーにあるリンクとかをちらっと見てみるのです。
そうすると、「なんかこの単語よく見かけるなぁ」ということがあるかと思います。そうやって目についた単語をさらに調べて見たりすると自分の今やってる分野に囚われずに色々なものに触れられます。

# 3. 手を動かす

エンジニア生活を続けるほど痛感しますが、やはり **自分で手を動かすことほど身につくことはありません**。
例えばプログラミング言語を何か勉強してみるにしても、書籍やネットの記事を見て済ませるのとHello Worldだけでも実際に書いてみるのとは大きく違います。

# 4. 師匠を見つける

手本にすべき師匠がいると捗ります。
別に面と向かって「弟子にしてください!」と言う必要はありませんが、できれば身近なところで「すごい人」を見つけましょう。勉強会などに出て外のコミュニティで探すのもいいかもしれません。

良い師匠を見つけたら何かしら師匠の真似をしてみましょう。
例えば師匠の作ったソフトであったり、休日の過ごし方であったりです。

私は2年ほど前にお世話になった師匠から開発環境をパクりました。
[vagrant](https://www.vagrantup.com)で仮想マシンを操作し、[ansible](https://www.ansible.com)でプロビジョンをし、開発補助に[gulp](http://gulpjs.com)のタスクとかをバリバリ使ってた環境でした。
最初はよくわからないままコピペするところから始め、次に公式のドキュメントを読んだりググったりして内容を理解することに努め、そのあとは「TypeScript使ってみてぇなぁ」とか「webpackってのがナウいらしいなぁ」とか考えながらそれをベースにアレンジを加えていくようにしました。
いわゆる「守破離」と言うやつですね。全くの0から独力でスキルを身に付けるのは辛いので、まずはすごい人の真似をするところから始めましょう。

# 5. 発信してみる

自分の勉強したことやノウハウをQiitaなりブログなりで発信するのはとても良いことです。
人のためになるからというのもありますが、それ以上に自分のためになることが多いです。
なぜなら、知識やノウハウを文章として簡潔にまとめるにはかなり正確な理解が要求されるからです。
何かしら記事を書こうとすると **わかってるつもりだったけど全然わかってなかった**ことに気づかされます。また、発信する以上ガセネタを流してしまうことは極力避けたいので、念のため調べ直したりすることで勘違いが明らかになったりすることもあります。

「インターネッツに晒すのは怖いお...」と言う方は[こちらの記事](http://qiita.com/Bakudankun/items/740ac8ba1395fe4e40a6)を参考に身内にしか見れないWikiを立てて、そこに投稿すると言うのもありかもしれません。

[^1]: ゼロは数えられません
「bash -x sample.sh」のデバッグ情報は標準エラー出力に出力されている


シェルスクリプト内で実行されたコマンドとその結果をすべて出力してくれるのが`bash`の`-x`オプション。「わざわざロギングをコーディングするほどではないが、とはいえログが何もないのはなんとなく気が引ける」場合、あるいは「書いたシェルスクリプトをデバッグしたい」場合などにわたしはよく使います。

さて`bash -x sample.sh`とターミナルに打ち込んだとして、__出力される情報をターミナルで目検するだけではなく、ログファイルなどに保存しておきたい__という場合にはどうすればよいでしょうか? 

答えは簡単。__`bash -x`が吐き出すデバッグ情報は実のところ標準エラー出力に出力されています。__よってそのデバッグ情報をファイルに保持したいという場合は、たとえば以下のようにして標準エラー出力を目的のファイルへリダイレクトしてやればよいということになります。

```bash
bash -x sample.sh &> sample.log
```

以上、ちょっとしたTIPSでした(´・ω・｀)
UIImageView で cornerRadius と Shadow を同時に使いたい

UIImageView で角丸にしたい場合、これで実現できます。

```swift
let imageView = UIImageView()
imageView.layer.cornerRadius = 10
imageView.clipsToBounds = true
```

Shadow をつけるためにはこうですね、簡単です。

```swift
let imageView = UIImageView()
imageView.layer.cornerRadius = 10
imageView.layer.shadowColor = UIColor.black.cgColor
imageView.layer.shadowOffset = .zero
imageView.layer.shadowOpacity = 0.3
imageView.layer.shadowRadius = 4
```

しかし、 どちらもやろうとするとうまくいきません。

## 単純にどちらもやろうとしてみる

単純にどちらも合わせてみました。

```swift
let imageView = UIImageView()
imageView.layer.cornerRadius = 10
imageView.clipsToBounds = true
imageView.layer.shadowColor = UIColor.black.cgColor
imageView.layer.shadowOffset = .zero
imageView.layer.shadowOpacity = 0.3
imageView.layer.shadowRadius = 4
```

![2017-07-19 22.07.12.png](https://qiita-image-store.s3.amazonaws.com/0/5678/7c2c7252-f2e6-afcd-735d-da43ed483531.png)

ただの角丸として表示されています :angry: 

`cornerRadius` のためには `clipsToBounds = true` が必要なのですが、これは領域外の表示を切り捨てるオプションです。つまり Shadow も切り捨てられてしまうわけです。

## `clipsToBounds = false` にしてみる

```swift
let imageView = UIImageView()
imageView.layer.cornerRadius = 10
imageView.clipsToBounds = false // デフォルトでも　false
imageView.layer.shadowColor = UIColor.black.cgColor
imageView.layer.shadowOffset = .zero
imageView.layer.shadowOpacity = 0.3
imageView.layer.shadowRadius = 4
```

![2017-07-19 22.07.39.png](https://qiita-image-store.s3.amazonaws.com/0/5678/6870594f-e2d9-46af-5269-ad3ce7d1e2c1.png)

今度は `cornerRadius` が無効化されていまいました :cry:

## shadow 専用 View を作る

月並みですが、 Shadow を表示するだけの UIView と UIImageView を別で作るようにしました。

```swift
let imageView = UIImageView()
albumImageView.layer.cornerRadius = 10
albumImageView.clipsToBounds = true

let shadowView = UIView()
shadowView.layer.cornerRadius = 10
shadowView.layer.shadowColor = UIColor.black.cgColor
shadowView.layer.shadowOffset = .zero
shadowView.layer.shadowOpacity = 0.3
shadowView.layer.shadowRadius = 4

addSubView(shadowView)
addSubView(imageView)
```

![2017-07-19 22.08.18.png](https://qiita-image-store.s3.amazonaws.com/0/5678/ea58d10b-81b7-e247-9eff-ac30d9ec501a.png)

うまく表示されました :tada:

### 他の方法

UIImageView だと `clipsToBounds = true` しないと角丸が無効化されましたが、 UIView では `clipsToBounds = false` でも角丸になるようです。

[Bynomial Code » Fun with layers](http://bynomial.com/blog/?p=52) で
 UIView の backgroundColor に UIImage を指定して Radius, Shadow を実現するサンプルがあります。

個人的な意見ですが、 backgroundColor に画像をセットするよりは役割の違う View を2つ作った方がわかりやすい気がしました。
tempuraでI18nする

現在ClojureScriptで作っている物の国際化が必要なのでサクっと名前だけ知ってた[tempura](https://github.com/ptaoussanis/tempura)というライブラリを使ってみた。

## 特徴
- 簡単に使える
- 動的に文字列を生成できる
- 文字列以外も返却できる
- インラインでフォールバックを指定できるので段階的に導入できる

## インストール

`:dependencies`に`[com.taoensso/tempura "1.1.2"]`を追加する。

## 用意するもの
辞書的なデータを用意する

```clj
(def dict
  {:en {:foo "en foo"
        :dynamic-foo "foo %1 %2"}
   :jp {:foo "jp foo"}})
```

## 使い方

```clj
(require '[taoensso.tempura :refer [tr]])

(tr {:dict dict} [:en] [:foo])
=> "en foo"

(tr {:dict dict} [:jp] [:foo])
=> "jp foo"

(tr {:dict dict} [:en] [:dynamic-foo] ["bar" "baz"])
=> "foo bar baz"
```

他にも色々便利そうな使い方があったが、必要だったのは上記だけだった。
興味があれば[README](https://github.com/ptaoussanis/tempura)が詳しいのでそちらを参照すると良いかもしれない。

## 感想
- 覚えることが少ないので使い勝手が良いと感じた
- `"foo %1 %2"`の様に動的に文字列を多言語化できるのは便利だった。
使われて無さそうだけどやっぱり使われているクラス

こういうのに時間を取られるとヽ(･ω･)/ｽﾞｺｰってなるのでメモっておく。

# 対象読者
autoloaderの使われていないようなレガシーなシステムでの罠のお話しです。そんなに古臭いシステムを触らない場合は読んでも得るものはありません。
新規で作るシステムは一般的にrequire_onceを使うよりオートローダを使うほうがよいでしょう。記述も簡潔だし、PHPはPSRに従っていれば恩恵が得られるエコシステムになっているためです。

- [PHP: クラスのオートローディング \- Manual](http://php.net/manual/ja/language.oop5.autoload.php)
- [PHP: The Right Way：依存関係の管理](http://ja.phptherightway.com/#dependency_management) 

# 呼び出し側ファイルに定義されているクラスをrequireされるファイルのクラスが利用している場合
## 使われてないように見えるクラスがあるよー
Backpack.phpでは、冒頭でServalクラスをrequireしています。
このファイルはBackpackクラスとUnyaクラスが同居しています。Unyaクラスは `Unya::nya()` という静的メソッドをもっていますね。一見するとこのUnyaクラスは利用されていないように見えます。

```php:Backpack.php
<?php

require_once __DIR__ . '/Serval.php';

class Backpack {
    public function echi(){
        $serval = new Serval();
        $serval->berk();
    }
}

class Unya { // 使われていない？
    static public function nya(){
        echo 'unya nya nya nya nya nya nya' . PHP_EOL;
    }
}

$backpack = new Backpack();
$backpack->echi();
```
## requireされた側に定義がないよー？
requireされた側のServal.phpです。何もrequireしていませんが、静的メソッドを呼んでいます。

```php:Serval.php
<?php

class Serval {
    public function berk(){
        Unya::nya(); // 定義はどこに？
    }
}
```

UnyaクラスはBackpack.phpで定義されていました。
まさか そんな 🍌

## 動くんですか？
```zsh
$ php Backpack.php
unya nya nya nya nya nya nya
```
はい（例の顔）

## 何故動くのか
Backpack.phpは冒頭でServal.phpをrequireしています。
`require_once`によってServal.phpが読み込まれることで、`$serval->berk()`が実行される際にはすべてのクラスが揃っており、エラーなく実行できます。
一見利用されていないようにみえたUnyaクラスはこのようにして利用されていました。
（このような抽象度で）動くことを理解するのは別に難しくはないのですが、はじめてみた時にびっくりしたのでメモ。

## 教訓：クラスを利用する側が利用するファイルをrequireするようにして下さい
ついで単一のファイルに複数のクラスを定義するのもなるべく避けて下さい。
【超初心者向け】AWSでたてたnginxサーバーにドメインを設定する

# はじめに
[(下準備編)世界一丁寧なAWS解説。EC2を利用して、RailsアプリをAWSにあげるまで](http://qiita.com/naoki_mochizuki/items/f795fe3e661a3349a7ce)

上記の記事を読んで、Railsアプリケーションサーバーを立てました。
しかし、URLがElastic IPのIPアドレスになったままです。
独自ドメインでアプリをリリースしたいと思い、そこまでの手順をまとめました。
基本的に上記の記事の補足なので、AWSでデプロイしたい！とお考えの方は、
[(デプロイ編②)世界一丁寧なAWS解説。EC2を利用して、RailsアプリをAWSにあげるまで](http://qiita.com/naoki_mochizuki/items/5a1757d222806cbe0cd1)
までお読みください。

# ドメイン取得

[ドメイン名を登録する](https://aws.amazon.com/jp/getting-started/tutorials/get-a-domain/)

AWS公式リファレンスにドメインの取得方法が書いてあります。
「ステップ 2: ドメイン名を登録する」をご覧ください。

まずは、Route 53 コンソールに入って、「Domain Registration」をクリックします。

次に、希望のドメイン名を入力します。
`.io`や`.jp`など人気ドメインは高いです。
他の人に使用されていなければ、ドメインを取得することができます。

次に個人情報入力の画面が出てきます。
電話番号が国際電話番号だったり、住所を欧米式だったりして、見慣れない人もいるかもしれませんが
特に問題はないでしょう。

最後に「Completed Purchase」をクリックして、購入完了です。
個人情報に入力したメールアドレスにメールがきているので、確認してリンクをクリックして有効化しましょう。

# DNS設定

[ドメイン名を登録する](https://aws.amazon.com/jp/getting-started/tutorials/get-a-domain/)

リファレンスの「Step 3: DNS を設定する」に進みます。
今回取得したドメインは「静的IPアドレス」です。

Route 53 コンソールの [Hosted Zones] 部分を開きます。
そこに先ほど取得したドメイン名があるはずです。
これをクリックします。

[Create Record Set] ボタンをクリックします。ウィンドウの右側の [Name] テキストボックスに「www」と入力します。ステップ 1 で作成した Elastic IP アドレスを [Value] ボックスに入力してから、[Create] をクリックします。

ここまででDNS設定は完了です。
ほぼリファレンス通りですが、nginx側の設定が完了していません。
この時点では、リファレンス通りに固定ドメインに接続しようとしても応答がありません。

# nginxの設定

confファイルのserver_nameで、nginxのサーバーの名前をドメインと同じにしてあげましょう

```shell-session
[user|~]$ cd /etc/nginx/conf.d/
[user|conf.d]$ sudo vi xxx.conf #xxxは自分のアプリケーション名でファイル名変更
```

```xxx.conf
  server_name www.hello-ruby.net;(#アプリの固定ドメインに変更してください)
```

変更点は上記のみ
あとはnginxの再起動を行いましょう

```shell-session
[user|~]$ sudo service nginx restart
```

これでお待ちかね、ブラウザのURLバーに取得したドメインを入力しましょう。
繋がりましたかね?
知識がないと、ここまでいくのが大変ですよね!
jQueryでイベントの順番を入れ替える

プログラムを書いている中で、既存の登録済みのイベントの前に自分で実装したイベントを実行する必要があったので、そのやり方をメモとして書いてみた。
なるべくならこういうことがない方がいいけれど。

# ※注意
動作の保証は致しません。
参考程度に見て頂ければと思います。

# 書いたもの

HTML

```html
<div>
  <button id="test" type="submit" name="button">ボタン</button>
</div>
```

JavaScript

```js
// あらかじめ登録
$("button#test").on('click', function(){
  console.log("Hello");
});

// 入れ替えここから
var allEvents = $._data($('button#test').get(0), "events");
var clickHandler = allEvents.click[0].handler;
$("button#test").off('click', clickHandler);
$("button#test").on('click', function() {
  console.log("Hello World");
});
$("button#test").on('click', clickHandler);
```

結局は単純な入れ替えっぽくなった。
FIRフィルタをPythonとＣ言語で実装する

#概要
信号処理にノイズ除去という視点でフィルタがよく使われる。その中でも一番シンプルなFIRフィルタをPythonとC言語で実装する。Pythonベースでフィルタの評価を行なった上で、その結果をC言語ベースのアプリケーションに組み込む流れを想定する。

#Pythonコード
以下にscipyを使用したFIRフィルタの実装を示す。元信号`x`は乱数とし、`scipy.signal.firwin`によってフィルタ係数を求める。scipyによるフィルタ適用後の信号`y`及び、べた打ちによるフィルタ適用後の信号`d`を比較する。

```
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#

import numpy as np
import scipy.signal
from pylab import *
import csv
import matplotlib.pyplot as plt

#xはなんでもいい
x = np.random.rand(512)
plt.plot(x)
plt.show()

fs = 512 #サンプリング周波数
nyq = fs / 2.0  #ナイキスト周波数

# フィルタの設計
f1 = 1 / nyq      #カットオフ周波数1
f2 = 30.0 / nyq      #カットオフ周波数2
numtaps = 255       #フィルタ係数の数(奇数)

b = scipy.signal.firwin(numtaps, f1)                         # ローパス
#b = scipy.signal.firwin(numtaps, f2, pass_zero=False)        # ハイパス
#b = scipy.signal.firwin(numtaps, [f1, f2], pass_zero=False) # バンドパス

#フィルタ係数の保存
with open('coeff.csv', 'w') as f:
    writer = csv.writer(f, lineterminator='\n') # 改行コード（\n）を指定しておく
    writer.writerow(b)

# scipyによるFIRフィルタ
y = scipy.signal.lfilter(b, 1, x)     
               
# ベタ書きによるFIRフィルタ
d = np.zeros(fs)

for i in range(len(x)):
    d[i] = 0
    for j in range(len(b)):
        if(i-j)>=0:
            d[i] += b[j]*x[i-j]
    
plt.plot(y,color='r')
plt.plot(d,color='b')
plt.show()
```

元信号

![x.png](https://qiita-image-store.s3.amazonaws.com/0/175647/c47d0aa2-e1ae-d803-7f5f-2f8b3c7052a7.png)


フィルタ適用後（赤:y, 青:d）

![low.png](https://qiita-image-store.s3.amazonaws.com/0/175647/6a8b7f75-90de-bb54-0d6a-9b7e7d9e290c.png)


#Cコード
Python上でのべた打ち結果が正しければ、C言語コードに落とし込む。少々雑だが、`b`には、Pythonコードで生成したcoeff.csvの配列を格納する。csv形式で保存してあるので、テキストエディタ等で開けば、そのままコピー&ペーストで貼り付けられる。

```

    int sampleRate = 512

    x= // 雑だがｘを適当に記述する

    float* filteredData = (float*)malloc(sizeof(float)*512);
    
    float b[] = {} //雑だが、Pythonで作成したcoeff.csvの中身を括弧内に挿入する
    
    for(int i=0;i<sampleRate;i++){
        float d = 0;
        for(int j=0; j<(sizeof b)/(sizeof b[0]); j++){
            if((i-j)>=0){
                d += b[j]*x[i-j];
            }
        }
        filteredData[i]=d;
    }

    free(filteredData)
```

非常に単純だが備忘録程度なのでお許しを、FIRフィルタってどうやって実装するんだっけ？という人の助けになれば。
CSSでコードブロックの行番号を表示する

# 
`Qiita API`から取得した投稿内容を自分のサイトに表示するときコードブロックに行番号を表示させたかったので、JavaScriptを使わず実装する方法を考えた。

```HTML:APIで取得した内容の一部
<div class="code-frame" data-lang="JavaScript">
<div class="code-lang"><span class="bold">app.js</span></div>
<div class="highlight"><pre><span></span>  <span class="k">for</span><span class="p">(</span><span class="kd">let</span> <span class="nx">url</span> <span class="k">of</span> <span class="nx">urls</span><span class="p">){</span>
    <span class="nx">await</span> <span class="nx">chromy</span><span class="p">.</span><span class="kr">goto</span><span class="p">(</span><span class="nx">url</span><span class="p">)</span>
<span class="line-numbers-rows"><span></span><span></span></span></pre></div>
</div>
```

# 目標

* `pre`要素の左側に行番号を表示
* コードをコピーする時に邪魔にならない
* できれば`JavaScript`は使いたくない

イメージは下記URLの通り。
https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Lists_and_Counters/Using_CSS_counters

#実装方法

## HTML
```HTML:HTML
<pre>
    # 1行目
    # 2行目
    # 3行目
    <div class="line-numbers"><span></span><span></span><span></span></div>
</pre>
```
`pre`要素の中なので改行や空白がそのまま表示されるので注意。
`<div class="line-numbers">`内に行数分だけ`<span></span>`を設置する。あまりスマートでは無いのでJavaScriptかテンプレートエンジンで行数分ループするのがよさそう

```python3:Pythonだとこんな感じ
print('<div class="line-numbers">'+'<span></span>'*3+'<div>')
```

## CSS
```CSS:CSS
pre {
    position: relative;
    padding: 20px 50px;
}

.line-numbers {
    position: absolute;
    top: 0;
    left: 0;
    padding: 20px 5px;
    -webkit-user-select: none;
    -moz-user-select: none;
    -ms-user-select: none;
    user-select: none;
    border-right: 1px solid #999;
    width: 50px;
}

.line-numbers > span {
    float: left;
    display: block;
    counter-increment: linenumber;
    text-align: right;
    width: 100%;
}

.line-numbers > span::after {
    content: counter(linenumber);
}
```
JavaScriptを使わずに行番号を加算していくのに`CSS counters`を使って実装した。
`counter-increment: linenumber;`でlinenumber変数を加算して疑似要素の`::after`の中に`content: counter(linenumber);`で表示させる。


# 表示結果
<img width="250" src="https://qiita-image-store.s3.amazonaws.com/0/5295/3b3a1d97-17a7-fb41-30fa-5211146fc311.png">

# コード全体
```HTML:index.html
<html>
<body>


<pre>
    <span># 1行目</span>
    <span># 2行目</span>
    <span># 3行目</span>
    <div class="line-numbers"><span></span><span></span><span></span></div>
</pre>


<style>
body{
    margin:50px;
    background:#ddd;
}
pre {
    position: relative;
    padding: 20px 50px;
}

.line-numbers {
    position: absolute;
    top: 0;
    left: 0;
    padding: 20px 5px;
    -webkit-user-select: none;
    -moz-user-select: none;
    -ms-user-select: none;
    user-select: none;
    border-right: 1px solid #999;
    width: 50px;
}

.line-numbers > span {
    float: left;
    display: block;
    counter-increment: linenumber;
    text-align: right;
    width: 100%;
}

.line-numbers > span::after {
    content: counter(linenumber);
}
</style>


</body>
</html>
```
Officeアドインの開発を試してみる方法

# はじめに
残念ながら、Napa Office 365 開発ツールが、2017年3月31日で引退してしまいました。
しかし、2017年4月18日に、Microsoft CorporationがリリースしたOfficeアドインがあります。
# その名は、Script Lab, a Microsoft Garage project
Officeストアから入手できます。
[Script Lab, a Microsoft Garage project](https://store.office.com/ja-jp/app.aspx?assetid=WA104380862&ui=ja-JP&rs=ja-JP&ad=JP&appredirect=false)
アドインでアドイン開発の体験ができます！？信じがたい。。。

## どのアプリケーションで動作する
Excel、PowerPoint、Project、Word上で動作します。
次の画面は、Word2013でのサンプルリストの一部画面です
![20170718ScriptLab002.png](https://qiita-image-store.s3.amazonaws.com/0/192012/a437bb33-93b4-a02c-305d-77a7b402b07a.png)

この画面でScript(この画面では、TypeScript)、Template(HTML)、Style(CSS)プログラミングを行います。
![20170718ScriptLab003.png](https://qiita-image-store.s3.amazonaws.com/0/192012/39d2a3b5-8873-7655-7183-45063ccf2953.png)
Napa Office 365開発ツールのような画面です

## 何ができる？
Officeストアに掲載されている概要には、ざっくり言えば

Office JavaScript APIを試してみてください

 - コードスニペットの作成と編集ができます
 - 作成したスニペットをRunボタンで即座に実行できます
 - サンプルの選択が素早くできます
 - 作成したスニペットをGitHub Gistにセーブ、共有できます
 - IntelliSenseが使えます
 - TypeScriptを試せます
 - アドインのプロトタイプ開発として使えます

といったことが書いてあります。

ほんの少しだけ触ってみました。
Napa Office 365開発ツールのようにプログラミングできます。
Runすれば、アドインの動作を確認できます。
Share →Export for publishing で、zip形式の圧縮ファイルを保存できます。

![20170718ScriptLab004.png](https://qiita-image-store.s3.amazonaws.com/0/192012/850ef75e-41bc-c102-2b02-5131f54d12ff.png)


圧縮ファイルの中身は、HTMLドキュメント（Run時の作業ウィンドウ画面）、MXLドキュメント（マニフェスト）、YAMLファイル（snipet data）、MDファイル（README.md）の４つです。 

![20170718ScriptLab005.png](https://qiita-image-store.s3.amazonaws.com/0/192012/2387a346-5ec9-1a77-8cb4-1997d1631194.png)

手持ちのWord、ExcelどころかWord Online、Excel OnlineからでもOfficeアドインのプログラミングが体験できるとは、このアドイン、アドインらしからぬアドインで驚きました。

# まとめ
Visual StudioでOfficeアドインを新しいプロジェクトで作成すると、サンプルプログラムが生成されますが、ひとつだけで他のサンプルプログラムは、ダウンロードするなり、ひと手間がありました。
Script Labでは、サンプルが複数用意されているので、一覧から選択して、どのような動作かをすぐに確かめることができます。
Visual Studioといった開発ツール不要でプログラミングできるので、手軽に使えます。
しかし、このままでは販売者ダッシュボードへ申請できないので、プロトタイプ開発、自分で使うアドイン開発としての使い方といったところでしょうか。
もっとも、IntelliSenseが使えたり、HTML、CSS、JavaScriptでプログラミングできるので、初めてプログラミングを体験する方やプログラム経験者にとってもサブ開発ツールのように使える感じがしました。

# 参考
[Script Lab, a Microsoft Garage project](https://store.office.com/ja-jp/app.aspx?assetid=WA104380862&ui=ja-JP&rs=ja-JP&ad=JP&appredirect=false)
[Microsoft Garage, Script Lab - an Office add-in](https://www.microsoft.com/en-us/garage/profiles/script-lab/)

# おわりに
Officeアドインは、その存在自体は知られているけれど、活用されていない状況を象徴するように、このScript Labの存在も気づかれていない感じがしましたので、ご紹介しました。

最後までお読みいただきありがとうございました。
犬と猫を見分けるコンペティションの受賞者モデル


精度を上げたい時用の参考にメモ。

<hr>
#4位のモデル
http://blog.kaggle.com/2017/04/03/dogs-vs-cats-redux-playground-competition-winners-interview-bojan-tunguz/

この方も過去のコンペを参考にしたそうです。
https://www.kaggle.com/c/the-nature-conservancy-fisheries-monitoring
https://www.kaggle.com/c/the-nature-conservancy-fisheries-monitoring
https://www.kaggle.com/c/state-farm-distracted-driver-detection
https://www.kaggle.com/c/yelp-restaurant-photo-classification

#前処理と特徴エンジニアリングについて
前処理と特徴エンジニアリングにはほとんど時間をかけなかった。
トリミング、シャーリング、回転、フリップなど、たくさんの画像をオーギュメンテーションした。

#学習方法について
Kerasのシンプルな畳み込みニューラルネットワーク（CNN）を最初から構築しましたが、ほとんどの場合、VGG16、VGG19、Inception V3、Xception、およびResNetsのさまざまなモデルを使用しました。
アンサンブルとスタッキングがすごい。


![Untitled-Diagram-copy.jpg](https://qiita-image-store.s3.amazonaws.com/0/64334/cf5eb119-ef5a-6ac3-a4b3-79adc9a37f3b.jpeg)

weighted average：重要度を加味した平均を加重平均
http://mathwords.net/kajuheikin
scaled weighted average：って何だろ。。


<hr>
#3位のモデル
http://blog.kaggle.com/2017/04/20/dogs-vs-cats-redux-playground-competition-3rd-place-interview-marco-lugo/

この方はこれを受講してた。
http://www.fast.ai/


スタンフォードのCS231nコースのオンラインノート
kaggle winerインタビュー
http://blog.kaggle.com/category/winners-interviews/
など参考にした。

#前処理について
無作為にデータを分割して、訓練セットのわずか8％を含む検証セットを作成。
必要に応じてデータを破棄あるは正規化、増加させた。

#学習について
VGG16 ImageNetに事前訓練し、微調整。
ResNet50 ImageNetに事前訓練し、微調整。
ConvNetについてはスルー。。。
ゼロから訓練を受けたResNet50。
3つのXceptionモデルImageNetに事前訓練し、微調整。
事前訓練InceptionV3、Resnet50、VGG16、Xception、lightGBM及び5層ニューラルネットワークから抽出された特徴。

InceptionV3はgooglenetから進化してきた。仮面ライダーv3みたいなイメージ。
XceptionはInceptionの層を分けることで、計算処理を早めたようなイメージを持ってる。
LightGBMはxgboostみたいなやつ。
http://qiita.com/TomokIshii/items/3729c1b9c658cc48b5cb

![KaggleDiagram.png](https://qiita-image-store.s3.amazonaws.com/0/64334/6f9bc6f4-77e5-a97f-1491-f3c34125e12b.png)

比較的低レベルのモデルをミックスすることによる効果に驚いた。
ReLUからLeaky ReLU、Randomized Leaky ReLUに変えることで大きな影響があった。
ラップする関数のシグネチャを維持したラッパーを作成する方法

特に関数デコレータでは、引数として受け取った修飾する関数をラップする関数を作成して返すことがよくありますが、ラップする関数のシグネチャをラップされる関数と同じにしたい時があります。
Python 3.4以降では、標準ライブラリfunctoolsが提供するwrapsというデコレータを使ってこの実装が可能です。

以下の例では、デコレータ`args_as_ints`で修飾後の`funny_function`(つまり`functools.wraps`で修飾後の`wrapper`)は、修飾される関数`funny_function`と同じシグネチャを持ちますが、全ての引数を`int`に変換して元の関数を同じ計算を行います。

```py3:
# Source: https://stackoverflow.com/questions/147816/preserving-signatures-of-decorated-functions

import functools

def args_as_ints(func):
    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        args = [int(x) for x in args]
        kwargs = dict((k, int(v)) for k, v in kwargs.items())
        return func(*args, **kwargs)
    return wrapper

@args_as_ints
def funny_function(x, y, z=3):
    """Computes x*y + 2*z"""
    return x*y + 2*z
```
修飾された後の`funny_function`には、`__wrapped__`というメンバーがあり、元々の関数が保持されています。

関数のシグネチャを調べるには、標準ライブラリinspectを用います。inspectで提供されている`signature`関数を用いると、関数のシグネチャを、`Signature`オブジェクトとして取り出すことができます。次のコードでは、`funny_function`のシグネチャが、修飾前後で同じであることを確かめています。

```pycon:
>>> from inspect import signature
>>> str(signature(funny_function))
'(x, y, z=3)'
>>> signature(funny_function) == signature(funny_function.__wrapped__)
True
```
dockerのお勉強1


## 環境変数

dockerのコンテナ実行時にLANGなどの環境変数を設定する方法 - Qiita
http://qiita.com/yuki2006/items/6cea8c352e38f047b52a

`-e`オプション、envファイル

## 使い捨てコンテナ

Dockerコンテナの起動と廃棄 | Think IT（シンクイット）
https://thinkit.co.jp/story/2015/09/08/6383

> 再び利用せずに、即座に破棄したい場合もあります。この場合は、dockerコマンドに--rmオプションを付与します。

## いめーじのぜいじゃくせいすきゃん

そんなのあるのね。

Clairをインストールして、Dockerイメージの脆弱性スキャンをする手順 - うなの日記
http://unageanu.hatenablog.com/entry/2016/03/06/133450

## postgresql

library/postgres - Docker Hub
https://hub.docker.com/_/postgres/

## postgresql client

Docker で使えるデータベースの Web GUI まとめ - Qiita
http://qiita.com/yamitzky/items/74fdf31570e2e9a6f287

## postgresql with sslmode

nimbustech/postgres-ssl - Docker Hub
https://hub.docker.com/r/nimbustech/postgres-ssl/

## docker machine

リモートサーバーをもっている場合だけかと思ったらvirtualboxを利用して、
ローカルネットワーク上に簡単につくれるみたい。便利かも。

Docker Machine をローカル VM で始めるには — Docker-docs-ja 1.13.RC ドキュメント
http://docs.docker.jp/machine/get-started.html

きっかけはgoの環境づくり。

Docker内のGo製Webアプリをソース変更後リロードするだけで確認できるようにする | フリップフラップ
http://blog.flup.jp/2016/02/18/golang_docker_hot_reload/

ipの確認はinspectでできる

docker inspectでDockerコンテナの情報を取得する - $shibayu36->blog;
http://blog.shibayu36.org/entry/2013/12/28/145019

docker machineじゃなくてこっちにコンテナが作られてた

Docker for Mac上のコンテナから、Mac上のアプリケーションに簡単に接続する方法 - Qiita
http://qiita.com/Asayu123/items/ccfe4ccfc417ce57f445

alpine linuxというセキュアで小さなlinuxを使うとサイズがかなり削減できるのね。

Alpine Linux で Docker イメージを劇的に小さくする - Qiita
http://qiita.com/asakaguchi/items/484ba262965ef3823f61

## sshdを導入（debian/ubuntu）

sshする必要がないなら不要。。

sshできるdockerコンテナをつくるために最低限必要なこと - kotaroito's notes
http://kotaroito.hatenablog.com/entry/2016/03/07/094423

## docker compose

exposeはコンテナでの共有用のポートをホストにマッピングする
portは公開する用にホストへのマッピング
linkを使うと、毎度立ち上げるたびにipが動的に変わるのに影響されずに別のサービスを呼び出せる

```yaml
golang:
  # postgreコンテナのエイリアスdbを定義
  links:
    - postgresql:db
  # 内部用のポート指定にすること
  environment:
    POSTGRESQL_URI: "postgres://docker:docker@db:5432/docker?sslmode=disable"
```

Docker Compose - docker-compose.yml リファレンス - Qiita
http://qiita.com/zembutsu/items/9e9d80e05e36e882caaa

## docker-compose logs -f

ログを`tail -f`の用に表示できる
RSpecを勉強しよう。

RSpecについてメンターに質問したことをまとめてみたいと思います。

# everyday Rails
オススメの本ありますか?? と聞いたら教えてくれました。
作者はrails界で有名な伊藤さんという方らしい。
有料ですが余裕があったら読んでみたいな。

everyday Rails
https://leanpub.com/everydayrailsrspec-jp

# qiitaオススメ記事
上記、伊藤さんのqiitaです。
RSpecについてまとまった量の情報が掲載されています。
http://qiita.com/jnchito/items/42193d066bd61c740612

# 以上です！
簡潔ですが、以上です！
RSpecについて知りたければ上の書籍を当たってみてください、ということでした。
ruby on railsでECサイトを作るヒント。

某学校の最終課題でECサイトを作っています。
メンターさんから聞いた話ですが、大切なことなのでまとめておきます。

# solidusを使う? 使わない?
ECサイト用のフレームワーク、spreeの後継solidusというものがあるそうです。
結論からいうと、後々でアプリケーション固有の機能を実装しようと思った時に不便な為、最初から自分で1から構築したほうがカスタマイズしやすいとのこと。

# 個別の機能でGEMに頼るべき？
詳しくは調べていませんが、もし全部じゃなくとも個別の機能で何らかのGEMを導入する場合。
プロトタイプを作ってみて弊害が生まれないかを確認、それから使用するべきだそうです。
当たり前といえば当たり前ですね。

# 国内サービスではpay.jpを埋め込むことが多い。
https://pay.jp/
ちょっと調べてみましたが、決済機能のAPIだそうです。
手数料は取られますが、簡単に実装できて実にスムーズに決済ができるようです。
やってみたいと思います！
VagrantfileでOSを判断する方法

Vagrantfileを書いているときにOSによって処理を変えたい場合があります。
たとえばsynced_folderのtypeをwindowsの場合だけ変更したいときが
それに該当します。
こういった場合には、Vagrantfileの先頭にメソッドを追加することで、
そのメソッドを利用して、Vagrantfile内でOSの判断が出来るようになります。

# Vagrantfileの作成
Vagrantfileはrubyのスクリプトなので、Vagrantfileの先頭に以下のような
記述を追加します。

```ruby:Vagrantfile
module OS
  def OS.windows?
    Vagrant::Util::Platform.windows?
  end

  def OS.mac?
    (/darwin/ =~ Vagrant::Util::Platform.platform) != nil
  end
  
  def OS.unix?
    !Vagrant::Util::Platform.platform
  end

  def OS.linux?
    OS.unix? and not OS.mac?
  end
end
```

あとは、Vagrant,configureのブロックの中でそのメソッドを使うことで
OSによって処理を切り分けることが出来ます。以下の例ではOSによって
synced_folderの方法を変えています。


```ruby:Vagrantfile
module OS
  def OS.windows?
    (/mingw/ =~ RUBY_PLATFORM) != nil
  end
  ...
中略
  ...
end

Vagrant.configure("2") do |config|
  
  config.vm.box = "ubuntu/trusty64"
  config.vm.network "private_network", type: "dhcp"
  if OS.windows?
    config.winnfsd.uid = 1000
    config.winnfsd.gid = 1000
    config.vm.synced_folder ".", "/vagrant", type: "nfs"
  elsif OS.mac?
    config.vm.synced_folder ".", "/vagrant"
  else
    config.vm.synced_folder ".", "/vagrant", type: "nfs"
  end
end

```

# ファイルの分割
Vagrantfileの先頭にmoduleがあると、Vagrantの設定の内容が見づらくなって
しまうので、moduleの部分を別のファイルに切り出して、Vagrantfileと
同じ階層に置きます。
あとはVagrantfileの先頭でそのファイルを読み込むことで、moduleのメソッド
が使えるようになります。

```ruby:Vagrantfile
load File.expand_path("os.rb") if File.exists?("os.rb")

Vagrant.configure("2") do |config|
  ...
中略
  ...
end
```
GCP Container Engine クラスタ Kubernetesのバージョンを1.7.0にバージョンUPするとingressがエラーになる

# GCP Container Engine クラスタ Kubernetesのバージョンを1.7.0にバージョンUPするとingressがエラーになる

## エラーの内容
```
kubectl describe ingress


googleapi: Error 403: Insufficient Permission, insufficientPermissions
```

## 原因
- Kubernetesバージョン1.7.0のバグらしい
- 独自のnetworkでingressを構築すると、このバグに遭遇するらしい

## 対応
- 1.6系に戻す(マスタをバージョンUPしてる場合は詰むのでクラスタ作り直しが早い)

## 参考
https://github.com/kubernetes/ingress/issues/975

バージョンUPする際は、1.7.0などのキリの良いバージョンは避けた方が良いかも
とてもすごくわかりやすい「ポインタ」或いは「参照型」の説明

# ■まえがき
ぼくが以前いた会社で**「参照型と値型の違いが良く解らない」**という新人君に説明した時の事を、Twitterで呟いたところ非常に解り易いと反響を貰った事がある。
せっかくQiitaを始めたので、こんな小ネタなんかも加筆修正して纏めてみようかと。
*（Twitter制限で140字以内に纏めてましたし）*


# ■さっそく本題

ぼくが当時した説明はこんな感じです。
*※もちろん、新人向けの簡単な説明なので、メモリ管理の厳密な所とかは端折ってますよ*

## かんたんな説明

まずエクスプローラを立ち上げて、適当なフォルダを開きます。

> 「これがまぁ、メモリ領域だとして。」

でもってメモ帳を立ち上げて*（別にSakuraでも秀丸でも何でも良いよ！）*、適当な文面を打ち込んで先のフォルダに保存します。

> 「これがデータね。newでインスタンス作ったと思えば良い。」

次に、新しいフォルダを開き、

1. 保存したテキストファイルを単純にコピーします。
1. 保存したテキストファイルのショートカットを作成します。

> 「こっちのコピーしてきたのが『値型』で、ショートカットの方が『参照型』ね。」

## 更に解説。

これだけでピンと来てくれる子は中々いないと思うので、以下の説明を続けます。
*（相手の反応を伺って、説明を続けるか切り上げるかは要判断）*

> 「コピーもショートカットも、ダブルクリックしてテキスト開いたら同じ内容が出て来るじゃん？
> そういう意味では、どちらも『同じデータを持っている』と言えるので、この段階では特に違いは無い。」
> 
> 「開いて見るだけ、つまり『参照』するだけなら両者の違いは（ほぼ）無い。
> この段階で違うとしたらメモリの（この場合はHDD容量）の消費量だけ。」
> 
> 「じゃあ、値型と参照型で何が決定的に違うかと言うと、それは『参照』の時じゃなく『編集』の時。
> つまりこのメモ帳を開いている状態で、文章を書き換えて保存した時の影響度が違う。」


ここまで言えば頭の回転の早い子は大体理解してくれると思います。


> 「単純にファイルをコピーした場合、元のデータと同じ内容を持っている新しいファイルが作られる。
> これをプログラムに置き換えると、新しいメモリ領域に元のデータの完全な複製が出来上がる訳だ。
> 元のデータとは別な所に独立した形でデータが作られるので、コピーした方を弄っても元のデータには影響が出ない。」
> 
> 「対してショートカットを作った場合、実際にはファイルが作られる訳では無く、ファイルの場所だけ控えた形になる。
> これをプログラムに置き換えると、元のデータの複製が作られる訳じゃなく、元のデータがメモリ上のどこにあるかだけを記憶する。
> この『どこにあるか』をアドレス、インスタンス参照、ポインタなんて言ったりするが、とりあえず全部同じものだと思っとけ。」
> 
> 「で、この『どこにあるか』と言う情報は、元のデータの複製を作るよりも遥かにデータ量が小さい。
> 例えば、ここに家が建ってたとして、全く同じ家を新しく建てるのと住所だけ控えるのとでは全然話が違うだろ？
> これが家じゃなくてマンションや高層ビルだったら更に大変な事だが、住所だけなら大した話ではない。
> つまり省エネ、省コストなんだな。プログラム的に言えばメモリの節約になる。」

相手の理解の色が広がったら、ざっくり纏めます。

>「これが、値型と参照型の違い。」

> 「簡単に纏めるとこう。
> 値型は完全なコピーが作られる。その分メモリを消費するが、データの書き換えがコピー元に影響を出さずに済む。
> 参照型はショートカットみたいなもの。メモリの節約になるが、同じものを共有するのでデータの書き換えが全体に影響する。」
> 
> 
> 「どっちが良いとか悪いとかじゃなくて、適材適所、目的と手段の話になる。
> データを編集まで含めて共有したいのであれば参照型が適しているし、
> データのコピーを与えたいがそれぞれ独立して編集したい場合は値型が欲しくなる。」
> 
> 「厳密に言えば参照型で値型的コピーを作る事も可能だし、
> イミュータブル、不変オブジェクトと言うクラスの作り方もあるし、
> 難しい話をしていくとまだ色々とあるけどな。」

***

ちょっとこの文章だけだと解り難い気もしますが、実際にエクスプローラ上でファイル操作して見せながら説明すればきっと理解してくれると思います。


# ■あとがき
この説明が通り易かったのは哀しいかなもう昔の話。

この説明をした当時はまだスマホが出始めで、持っている人もまだ少ない時期でした。
しかし今はもう端末所有事情が変わっており、持ってるのはスマホやタブレットのみでPCを持っていないと言う人も増えています。

そんな最近のスマホ世代の新人相手に、エクスプローラを使って説明した所でピンと来ないよなぁ、、、。

今の子にも通じる、何かいい説明方法は無いかなぁ？
（´・ω・｀）
javascriptの後置インクリメントが「加算する前の値」を返さない件

　先日、
　
[非推奨だった bool 型に対するインクリメント演算子を削除 - cpprefjp C++日本語リファレンス](https://cpprefjp.github.io/lang/cpp17/remove_deprecated_increment_of_bool.html)
　
　という記事を読みまして、そこで紹介されていたバッドコードをなんとなくjavascriptで試してみました。

```js
b = false;
function f(b){
  return b;
}
f(b++);
```

　そしたら`0`が返ってきまして。
　MDNに
> オペランドの後に演算子を置く（例：x++）後置記法で使った場合、加算する前の値を返します。
[算術演算子 - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Arithmetic_Operators)

　とあったもんですから、えー、型キャストしちゃうのなんで？　と思ってES6の解説を見ましたら、

> 1.    Let lhs be the result of evaluating LeftHandSideExpression.
1. Let oldValue be ToNumber(GetValue(lhs)).
1. ReturnIfAbrupt(oldValue).
1. Let newValue be the result of adding the value 1 to oldValue, using the same rules as for the + operator (see 12.7.5).
1. Let status be PutValue(lhs, newValue).
1. ReturnIfAbrupt(status).
1. Return oldValue.
>
[ECMAScript 2015 Language Specification – ECMA-262 6th Edition](https://www.ecma-international.org/ecma-262/6.0/#sec-postfix-increment-operator)

　とのこと。「数値型に返還したものを`oldValue`に入れ、`oldValue`に1足したものを`newValue`に入れて、`oldValue`を返し、`newValue`を変数に入れる」ということらしいです。
　なので、「加算する前の値」というより、「加算する前の数値化した値」を返すってことですね

　そういうわけで、後置インクリメントは数値キャストに使えますね。

```js
b='0x100';
b+++44; // 300
```

　`LeftHandSideExpression`に対してしか書けないのでリテラルに対して使えず、かつ変数とかの内容を破壊してしまうので、使いたい場面が全く思いつかない、というのがちょっと残念ですが。
　
　
***
初めてのQiita記事を書きましたが、こんな感じでいいんですかねー？
GraphQLってどうだろう。

# APIサーバー

JSON API サーバーを開発するとき、クライアントはHTTPリクエストを発信し、サーバーは応答をJSON表現のデータ構造で返す。

![alt](http://yuml.me/diagram/plain/class/[Server]<HTTP[Client],[Client]<JSON[Server])

このようなAPIの設計について、従来はRESTがよいとされてきた。
facebookが提案するGraphQLというものが、Github API v4 に採用されるなど実績がつまれてきたので調べてみた。


# REST api おさらい

Ruby on railsのリソース表現にも採用され、こうした特長がある。

- RESTの原則
  - (Uniform Interface) 情報の操作は、すべてHTTPメソッド(GET, POST, PUT, DELETE)でおこなう。
  - (Addressability) リクエストのＵＲＬによって、提供する情報がひとつに定まる。
  - (Stateless) サーバーは状態をもたない。
  - (Connectability) 応答する情報に、別の情報へのリンクを含めることができる。 

- RESTの性質
  - GETリクエストは再実行に対して安全である。
  - PUT等のリクエストは再実行しても指示以上の動作をおこさない（べき等と呼ぶ）
  - サーバーはリソースごとに固有のURLをもち、メソッドによって操作が決まる。

- RESTの実際
  - とはいえ、必要な情報をかき集めるためには、普通はindexなどのREST外URLも使うよ。


# GraphQL api

GraphQL では、応答のデータ構造はリクエストが決定する。
RESTが取り組んできたUniform Interface、Addressability、については修正される。

- GraphQLの原則
  - あらゆるGraphQLのリクエストと、応答を引き受ける、唯一のURLを提供する。
  - 仕様化されたクエリ言語で情報を請求したり、操作を請求したりする。

- GraphQLの性質
  - 個々のリクエストにあわせて通信内容を絞り込むので、最小限の通信サイズとなる。
  - 必要な多数のリソースを、関連づいた形式でまとめて取得する。
  - 書き込み系処理の仕様変更をサーバーで吸収しやすい。


# GraphQL ⇔ REST

REST、GraphQL でアクセスするAPI サーバーを想像してみた。
> ![alt](http://yuml.me/diagram/plain/class/[A]<>1 a-bs *[B],[B]<>1 b-cs *[C])
> ※ [graphql-ruby](https://github.com/rmosolgo/graphql-ruby) で構築した場合

このとき、開発者は下表のような量のコードを記述する。（[graphql-ruby IDL](https://github.com/rmosolgo/graphql-ruby/pull/789)が採用されると、記述はシンプルになりそう。）

|                     |   単位 | GraphQL | REST           |
|:--------------------|:------:|--------:|---------------:|
| config/routes.rb    |   行   |       1 |              3 | 
| app/controllers/*   | action |       1 | 5 * 3 + 1 = 16 |
| app/models/*        | class  |       3 |              3 |
| app/graphql/*       | schema |       1 |              0 |
| app/graphql/types/* | type   |       5 |              0 |
| n+1 対策 (lazy)     | class  |       2 |              0 |

RESTでは、同コントローラークラスのactionに処理を記述する。共通部分は private method にまとめるか、 modelに追い出すリファクタリングをしていく。
比べてGraphQLでは、Fieldのresolveに処理を記述する。共通部分は主にmodelへ追い出すリファクタリングをする。
また、n+1回DB問い合わせをしてしまう問題をチューニングするため、lazy_resolve インターフェースに従うキャッシュを実装する。


# GraphQL 導入方法

Ruby on Rails へ GraphQLを導入するには

> gem "graphql"
> gem "graphql-batch"
> gem "graphiql-rails"

``` bash
rails generate graphql:install --batch --schema=#{AppName}Schema
rails g graphql:function #{function_name}
rails g graphql:mutation #{mutation_name}
rails g graphql:loader
```

# 書き方

参考になるサンプル。 https://github.com/joe-re/sample-graphql-on-ruby
Schema、query type、 mutation type を構築する。
実務では、それらが持つfieldは、のtype定義は、modelごとにファイルを用意して管理するとよい。

- Schema
  - query
     - field
         - type
         - argument
         - resolve
  - mutation
     - field
         - type
         - argument
         - resolve

# 参考

http://graphql-ruby.org/
https://github.com/graphql/graphiql
http://mgiroux.me/2015/getting-started-with-rails-graphql-relay/
Rubyの配列で使えるメソッド、二次元配列の使い方


最近Rubyのアルゴリズム問題をよくといているので、メモ用に残しておきたいと思います。

もっと良いやり方あるぞ！他にも良い使い方あるぞって方がいたらぜひ教えて欲しいです！！




#配列

##ターミナルから文字を入力し、配列を作成

```index.rb
ary = gets.split
#=> ターミナルでa b cと入力
p ary #=> ["a", "b", "c"]
```

###split

これを書くことにより、スペースを区切り文字として扱ってくれている。また，先頭・末尾の空白文字列を取り除きます。
（この空白文字は改行も含みます）
>split == split(" ")の挙動をしてくれている


１引数に正規表現を渡すことで、そのパターンにマッチした文字列で区切ったり、第２引数に分割制限の値を渡すことで、分割個数を制限することができます

```index.rb
ary = "aaa"
p ary.split("")
#=> ["a","a","a"]　1文字ごとに区切る

ary = "aaaaa"
p ary.split("", 3 )
#=> ["a", "a", "aaa"]　第2引数で個数を3個に制限
```

##配列の中にある要素の使い方

###要素の出し入れ

```index.rb
ary = ["a","b","c"]
p ary[0]
#=> "a"

ary = ["a","b","c"]
ary[1] = "d"
p ary
#=> ["a", "d", "c"] #上書きされる

ary = ["a","b","c"]
ary[1,0] = "d"
p ary
#=> ["a", "d", "b", "c"] #上書きされない

```

###配列の数、要素の長さ

```index.rb
ary = ["aaaaa","aa","aaa"]
p ary.length
#=> 3 #配列の要素数

p ary[0].length
#=> 5 #配列の一番目にある文字の長さ
```

###要素の特定、検索、場所

```index.rb
#include?は要素の皆無を調べる
ary = ["a","b","c"]
p ary.include?("a")
#=>true
p ary.include?("d")
#=>false

#findは要素を探して取り出す
ary = [1,3,6,8]
p ary.find{|n| n % 3 == 0 }
#=> 3 #3で割り切れるものを一個しか返さない

p ary.find_all{|n| n % 3 == 0 }
#0> [3,6] #3で割り切れるもの全て返す

ary = ["a","ab","cc","ac","ds"]
p ary.find_all{|n| n.include?("a")}
#=>["a", "ab", "ac"] #aと含まれているものを返す

#indexは要素の位置を教えてくれる
ary = ["a","b","c"]
p ary.index("b")
#=> 1
```

###要素を結合させる

```
ary = ["a","b","c"]
p ary.join
#=> "abc" #配列の中にある要素を全て結合

p ary.join(",")
#=> "a,b,c" #引数を指定するとそれを区切り文字とする
```


###要素を順番に取り出して使う

```
ary = ["a","b","c"]

ary.each do |n|
  puts n
end
#=>"a","b","c"と順番に出力される
```

参考にしたサイト一覧
http://www.sejuku.net/blog/11843#index
http://ref.xaio.jp/ruby

#多次元配列

##多次元配列の作り方

```index.rb
ary = Array.new(3)
p ary
#=> [nil,nil,nil] 

ary = Array.new(3, Array.new(3, "a") )
#=>[[nil, nil, nil], [nil, nil, nil], [nil, nil, nil]]
#これで2次元配列ができる

ary = Array.new(3, Array.new(3, "a") )
#=>[["a", "a", "a"], ["a", "a", "a"], ["a", "a", "a"]]
#第二引数に要素を指定できる
```

##要素の追加

```index.rb
ary = Array.new(3, Array.new(3, "a") )
ary[0][0] = 1
p ary
#=> [[1, "a", "a"], [1, "a", "a"], [1, "a", "a"]]

ary = Array.new(3).map{Array.new(3,0)}
ary[0][0] = 1
p ary
#=> [[1, "a", "a"], ["a", "a", "a"], ["a", "a", "a"]]

```

>上記の原因は全て同じオブジェクトとして認識されているため
>そこでmapメソッドを使って別々のオブジェクトとして初期化

```index.rb
ary = Array.new(3, Array.new(3, "a") )
p ary.map(&:object_id) #idを調べる
#=>[70167967248120, 70167967248120, 70167967248120]
```

<h5>同じobject_idが出るためmapで別々のオブジェクトに作り変える</h5>

```index.rb
ary = Array.new(3).map{Array.new(3,0)}
p ary(&:object_id)
#=> [70190754844300, 70190754844200, 70190754844140]
```

下記のサイトを見ておお！ってなりました。
http://simanman.hatenablog.com/entry/2013/06/24/200306

<br>
ちなみにmap抜かしても同義になるので、そこはまだ謎です。

```
ary = Array.new(3){Array.new(3,0)}
p ary.map(&:object_id)
#=> [70322091142940, 70322091142840, 70322091142800]
```
Kotlin data classのhashCodeの実装

#### **きっかけ**

[Hashableを誤解していました](https://speakerdeck.com/takasek/20170619-number-potatotips)
こちらの記事を読んで、そういえばkotlinのdata classの**hashCode**はどういう実装になっているのかふと気になったので調べてみました。

#### **hashCode3行おさらい**
> Effective Java 第3章 項目9 45Pの要約
> 
* **equalsで比較されるオブジェクトが変更されない限り、hashCodeメソッドは常に同じ整数結果を返さなければならない**  
* **equalsでtrueならばhashCodeは同じ整数結果でなければならない**
* **equalsでfalseならばhashCodeは別々の整数結果であることが望ましい(重複可)**



#### **[KotlinのData Classesのドキュメント](https://kotlinlang.org/docs/reference/data-classes.html)**

では以下のように記述してあります。

```
The compiler automatically derives the following members from all properties
declared in the primary constructor
「コンパイラは、プライマリコンストラクタで宣言されたすべてのプロパティから次のメンバーを自動的
に派生させます」

-equals()/hashCode() pair
-toString()
-componentN() functions
-copy()
```

#### **どう実装しているかについては書いていないのでシンプルなdata classのバイトコードをデコンパイルしてみた**

```kotlin
data class Sample(val id: Int, val title: String, val desc: String)
					↓

					↓
/*hashCodeのデコンパイル結果*/
public int hashCode() {
  return (this.id * 31 + (this.title != null?this.title.hashCode():0)) * 31
   + (this.desc != null?this.desc.hashCode():0);
}
```

###### 特徴
1. プロパティが複数ある場合、末尾以外のプロパティに**31**を掛ける(参照型とプリミティブ型の順番によって掛け方が若干変化する)
2. 参照型の場合はnullかどうかで、0かそのインスタンスのhashCodeを返す


#####**31という数字について**
**Effective Java**に以下の記述があります。

> Effective Java 第3章 項目9 48P
> 
>> 乗数31は、それが奇数の素数なので選ばれています。もし、その乗数が偶数で乗算がオーバーフローしたとしたら、2を掛けることはシフトするのと同じですので、情報が失われることになります。素数を使用することの利点は、あまり明確ではありませんが、素数が伝統的です。31の素晴らしい特性は、より良いパフォーマンスのために、乗算がシフトと減算で置き換えられることです。すなわち、31 * i == (i << 5) - i です。最新のJVMは、この種の最適化を自動的に行います。


#### **まとめ**

誰得な情報かわかりませんが、個人的な備忘録を兼ねて残しておきたいと思います。。
Effective Java定期的に読み直そうと思います。
Railsを4.2.8にしたら、RoadieでHTMLメールが送れなかった話

# 環境
Railsを4.1.7から、4.2.8に上げた
Ruby 2.4.1

[roadie-rails](https://github.com/Mange/roadie-rails)は、HTMLメールのcssインライン化をやりやすくするgemです。

# erroe文
```
Roadie::ProvidersFailed: Could not find stylesheet "email.css": All providers failed
```

# 解決方法
mailer.html.slimに記述していた、cssの指定方法が悪かったです。

```
link rel="stylesheet" href="email.css"
```

↑これを、
↓にします。

```
 = stylesheet_link_tag 'email'
```

# ちなみに、
ちゃんと本家のドキュメントに書いてあることでした。
しかし、どうして今まで動作していたのか不明です。。。
はじめてのLinuxディレクトリ構造

# はじめに

Windowsユーザーであれば当りまえの話だが、Cドライブの配下にWindowsフォルダがある。OSの動作に関する重要なファイルが沢山あるので、まず触ることはない。見向きすることもない。下手に触ってしまうものなら、OSが起動しなくなる羽目にあう可能性もある。

Linuxにも同じように初心者触るべからずのディレクトリがいくつかある。

# 各ディレクトリの役割

### /bin

CLIで利用するコマンドが格納されているのがこのディレクトリ。ここだけではないらしいが、Linuxシステムが動作するために、重要なコマンドがここに沢山格納されている。下手に触るべからず。

### /dev

名前からして想像できるが、ディバイスに関するファイルが格納されている。様々なハードのドライバに関するファイルだろう。/binと同様、触る可能性は低いと考えられる。

### /etc

その他、エトセトラ。Linuxの各種設定ファイル（コンフィグともいう）が置かれているのがここ。環境設定やパラメータを変更する場合は、ここにあるファイルを触ることになる。なにかとお世話になりそうだ。

### /home

ホームディレクトリが作成される。自由にフォルダを作って遊びたい場合はここに作るべし。

### /sbin

/binとよく似ている。管理者用のコマンドが置かれているのがここ。ここも/binと同じように下手に触ってはいけない。

### /tmp

テンポラリファイル。アプリが処理を実行する時にテンプ的に使われる。基本的に不要なファイルが溜まっていくことになるので、自動で定期的に削除してくれるみたいだ。ここで重要なファイルを管理してはいけない。

### /usr

アプリをインストールした際は、このディレクトリ配下にインストールされる。WindowsでいうProgram Filesに該当するディレクトリと考えていいだろう。

### /var

variable（変化可能）という意味。常に更新される類のファイルがここに置かれる。ログファイル、メールファイルなどが該当する。ログなので長い間使っていると、容量がひっ迫するので注意が必要になってくる。
Goのタグは英語じゃなくてもOK

GoはUTF-8で解釈するので、多分大丈夫だろうと思ったけど、試したことはなかった。
質問されたので試してみた。

https://play.golang.org/p/CY8SljMInD

```
package main

import (
	"fmt"
	"encoding/json"
)

var tj = `{
  "english": "foo",
  "日本語": "テスト",
  "훈민정음": "안녕하세요",
  "اللغة العربية": "صباح الخير"
}`

type testStruct struct {
	English string `json:"english"`
	Japanese string `json:"日本語"`
	Korean string `json:"훈민정음"`
	Arabic string `json:"اللغة العربية"`
}

func main() {
	var v testStruct
	json.Unmarshal([]byte(tj), &v)
	fmt.Printf("%#v\n", v)
	b, _ := json.Marshal(v)
	fmt.Printf("%s\n", string(b))
}

```

結果：できた。

```
main.testStruct{English:"foo", Japanese:"テスト", Korean:"안녕하세요", Arabic:"صباح الخير"}
{"english":"foo","日本語":"テスト","훈민정음":"안녕하세요","اللغة العربية":"صباح الخير"}
```

韓国大好きっ子だと思われないようにアラビア語もやってみたけど、対応してた。すごい！！
Go PlayGroundでやるとアラビア語はきちんと右から左になるようになっていた。
すごいけど、見づらい！！

> 補足
> 全角記号がタグに含まれてると解釈してくれないもよう。
> バグなのか仕様なのかは、関連事項が記載されているドキュメントが見つからなかったので不明
Cythonを使いたい場合はpython-devも入れる

Cythonを使いたい場合はpython-devも入れる。

```
sudo apt-get install python-dev
sudo apt-get install python3-dev
```

でなければ

```
fatal error: Python.h: そのようなファイルやディレクトリはありません
 #include "Python.h"
                    ^
compilation terminated.
```

で止まる
Docker Composeまとめ

## 構成ファイル（docker-compose.yml）の構文

|構文|説明|
|:--|:--|
|image|ベースイメージの指定|
|build|Dockerfileの指定|
|command|コンテナ内で動かすコマンドの指定|
|links|コンテナ間リンクの指定|
|external_links|コンテナ間リンクの指定（外部）|
|ports|公開ポートの指定|
|expose|コンテナの内部のみに公開するポートの指定|
|volumes|ボリュームの指定|
|volumes_from|すべてのボリュームのマウント指定|
|enviroment|環境変数の指定|
|env_file|環境変数ファイルの読み込み|
|container_name|コンテナ名の指定|
|labels|コンテナのラベル設定|

## Docker Composeコマンド

|サブコマンド|説明|
|:--|:--|
|up|コンテナの生成/起動|
|scale|生成するコンテナ数の指定|
|ps|コンテナの一覧表示|
|logs|コンテナログ出力|
|run|コンテナの実行|
|start|コンテナの起動|
|stop|コンテナの停止|
|restart|コンテナの再起動|
|kill|実行中のコンテナの強制停止|
|rm|コンテナの削除|
ブックマークレットでmarkdown用のリンクを生成する

最近他のWebページへのリンクを含む記事をmarkdownで書くことが頓に多いのですが、そのページのタイトルでリンクを作ることが多いことといちいちURLとタイトルをコピペするのが面倒になってきたのでとりあえずサクッとブックマークレットにしました。

今時ブックマークレットとか流石に古臭過ぎてどうかと思うけど、今時のやり方とかあるのだろうか…？

*※ 以下の手順のショートカットキーなどはMacOS + Google Chromeの場合です。*

## おもむろに⌘+dでブックマークBookmark Addedする

![image.png](https://qiita-image-store.s3.amazonaws.com/0/18007/ec83f8aa-e0a4-018b-9810-015ccf196194.png)

## Edit...を押してブックマークの詳細編集画面を開く

<img width="472" alt="87316959-33d2-c5ae-e51b-2b5c4f4692af.png" src="https://qiita-image-store.s3.amazonaws.com/0/18007/82838a38-1c00-cb55-d79b-49fd673f9b25.png">

## NameとURLを編集する

Nameを「create md link」とか「mdリンク生成」とか適当に付けます。

URLには以下の文字列をコピペします。

```js
javascript:(function(){window.prompt("リンク文字列作成DONE","["+document.title+"]("+location.href+")");})();
```

<img width="472" alt="Screen Shot 2017-07-19 at 16.57.49.png" src="https://qiita-image-store.s3.amazonaws.com/0/18007/8d5ce360-ae05-1713-4821-77c4c7f60a0a.png">


そしたら自分の使いやすい場所（Bookmark Bar等）に保存。

## 実際に使ってみる

作成したブックマークレットをクリックすると生成されたリンク文字列にフォーカスが当たった状態でpromptが出て来る。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/18007/b45ae785-0b01-1723-3d81-8082b51a051d.png)

これで今開いてるページのリンクをmarkdownで書いてる記事に貼りたくなったら

1. リンクをクリック
2. ⌘+c
3. escapeキーを押下

でOKになった。

おしまい。

## 追記

[頂いたコメント](http://qiita.com/kyo_nanba/items/81d81164360347fb3732#comment-2944bf80cbd5a9229e18)を試してみたところ、以下のJSを使うことで、わざわざpromptを表示して⌘+cしてescapeすることなくクリップボードにコピーされました。

```js
javascript:(function(){const e=document.createElement('input');e.value=`[${document.title}](${location.href})`;document.querySelector('body').append(e);e.select();document.execCommand('copy');e.remove();})();
```

素晴らしい。これでブックマークレットを起動するだけになったので手順が3つから1つになりました。しかも描画がないので一瞬。

@Nawada さんありがとうございます！
Python3のpipを導入後にPython2のpipを導入しようとして拒否される場合

Python3はpipとpip3が使えますが、Python2でpipを導入後にpip3を導入してしまうと
上書きされることがあります。

```
$ sudo python get-pip.py
Requirement already up-to-date: pip in /usr/local/lib/python2.7/dist-packages
```

--ignore-installedをつけると無理やり入る。

```
$ sudo python get-pip.py --ignore-installed
Collecting pip
  Using cached pip-9.0.1-py2.py3-none-any.whl
Installing collected packages: pip
Successfully installed pip-9.0.1
```

```
$ pip -V
pip 9.0.1 from /usr/local/lib/python2.7/dist-packages (python 2.7)
$ pip3 -V
pip 9.0.1 from /usr/local/lib/python3.5/dist-packages (python 3.5)

```