OmniAICreator/Qiita-1.07M huggingface dataset:
iHaskellを試してみる


# iHaskellとは

iHaskell は [Jupyter](http://jupyter.org/)用のカーネルの一つです。
Jupyter Notebookで**Haskell**が利用できます。

---

## Jupyterとは

Juyter NotebookはWebアプリケーションで共有するためのの文書作成アプリケーション

文書内には実行できるコードを書いて、数式を表示したり、可視化したりとか、対話可能なウィジェットを表示することも可能。

---

## iPythonとは


以前はiPythonというプロジェクトだったようですが、Python限らずに使えるようになってJupyterになったみたいです。(知らんけど)

iPythonはPryのPython版のイメージ。(個人のイメージ)

---

## Jupyterの普及

プログラマー以外が使うツールとして普及してきているイメージがあります。(要出典)
特にR言語を活用していた領域にJupyter Notebookが侵食してきているようにみえてます。(感想)

---

## Jupyterを試す

Juypter試すだけなら[公式のお試しページ](https://try.jupyter.org/)で試すことができます。
もちろん(?) iHaskell もつかえます

---

# 使える言語

* Scala (Sparkとの統合がある)
* Bash  (お、おう)
* Haskell
* Julia    (科学技術で人気でてきている)
* Python 2  (扱いやすい汎用言語)
* Python 3  (扱いやすい汎用言語) 
* R        (もともとデータサイエンスで人気ある)
* Ruby     (扱いやすい汎用言語の対抗馬)

Jupyterの機能に対して需要がある言語が用意されているのが伺えます

---

# iHaskellの利用

---

## iHaskellのインストール

dockerを使うと簡単に試せます。

```sh
docker run -it -v "${PWD}:/notebooks" -p "8081:8888" gibiansky/ihaskell:latest
```

http://localhost:8081 にアクセス。

---

## 基本的な使い方

`h`でヘルプが表示される。

viっぽいキーバインド

–--

## デモ

(あとでgistのリンクがあるのでdemoの内容はそっちで)

---

## ihaskellで表示できるデータ型

型クラス`IHaskellDisplay`のインスタンスであれば表示可能。

デフォルトで `IO a` `Display`  `DisplayData` `[a]`なんかを表示できる。


https://github.com/gibiansky/IHaskell/tree/master/ihaskell-display

---

# gistでプレビュー

ipynbファイルはGitHubでプレビューできる。
gistも。

https://gist.github.com/eiel/7de62ec8f36d1667a79968c30629fc40

---

# Google Claud Datalab でプレビュー

DatalabはJupyterをベースにBigQueryなどGoogle Cloud Platform(以下GCP)と連携できるようにカスタマイズされたもの。
表示もカスタマイズされていて、素のJupyterより綺麗。

Google Chatring Apisにアクセスするchartコマンドが用意されている。

stack driverにアクセスしてインスタンスのレポートをだしたりもできる。

iHaskellを動かすことはできないけどプレビューはできる。

---

## Google Cloud Datalabのローカル起動

GCPのプロジェクトIDが必要。

```
docker run -it -p "127.0.0.1:8081:8080" -v "${HOME}:/content" \
   -e "PROJECT_ID=${PROJECT_ID}" \
   gcr.io/cloud-datalab/datalab:local
```

http://localhost:8081 にアクセス。

---

![Kobito.w6Ur0J.png](https://qiita-image-store.s3.amazonaws.com/0/5840/2b353ebb-c74d-3860-e5c4-55c41a6af486.png "Kobito.w6Ur0J.png")


---

# まとめ

つかってみると人気があるのはわかる気がする。
エディターwith対話環境という感じ。

ページャーをOFFにしたときの表示がバグってるのがつらい。

GHC 8系はPull Requestはきてるけどまだ未対応

# リソース

## Makefile

docker起動するのにつかった

```Makefile
IMAGE := eiel/ihaskell
PORT := 80
VOLUME := /home/docker-user
PROJECT_ID := <project-id>

.PHONY: ihaskell
ihaskell:
        docker run -it -v $(VOLUME):/notebooks -p $(PORT):8888 $(IMAGE)

.PHONY: datalab
datalab:
        docker run -it -p $(PORT):8080 -v "$(VOLUME):/content" \
   -e "PROJECT_ID=$(PROJECT_ID)" \
   gcr.io/cloud-datalab/datalab:local
```


## Dockerfile

R言語いれただけ eiel/ihaskell にpush済み

```
FROM gibiansky/ihaskell:latest

RUN apt-get update && \
    apt-get install -y \
            r-base
  && rm -rf /var/lib/apt/lists/*
```
インストールしたGitを使用する前に最初に1回だけする設定

## ユーザの設定, checkoutのエイリアスcoの設定

~~~
git config --global user.name "Your Name"
git config --global user.email your.email@example.com
git config --global alias.co checkout
~~~

特に3つ目は ```git checkout```を```git co```と省略できるようになるので便利です。
Galaxy PenSDKを使う3回目

SpenSurfaceViewを使うとSpenpenがいないので、ブラシの選択方法が少し異なります。

```java:.java
        SpenPenManager penManager = new SpenPenManager(mContext);
        List<SpenPenInfo> penList = penManager.getPenInfoList();
        SpenSettingPenInfo penInfo = new SpenSettingPenInfo();
        for (SpenPenInfo info : penList) {
            if (info.name.equalsIgnoreCase("Brush")) {
                penInfo.name = info.className;
                break;
            }
        }
        penInfo.color = Color.BLUE;
        penInfo.size = 10;
        mSpenSurfaceView.setPenSettingInfo(penInfo);
```
色と、サイズも一緒に変更ができる。
penInfoの中にある変数をいじると設定ができそうだけど、リファレンスの中にはこの項目が存在しなかった。


続いて、画像として保存をする時に描画領域だけでなく背景のキャンバスも一緒に取得ができてしまうので、
背景のキャンバスを透過させる処理を考える。

```java:.java
 mSpenPageDoc = mSpenNoteDoc.appendPage();
mSpenPageDoc.setBackgroundColor(Color.TRANSPARENT);
```

みたいな形でTRANSPARENTを指定するが黒い背景になってしまう。
ここでsurfaceViewを使っているので、それに合うようにTransparentの時に透過をさせる処理を追加する

```java:.java
　　　　 mSpenSurfaceView = new SpenSurfaceView(mContext);
        mSpenSurfaceView.setZOrderOnTop(true);    // necessary
        SurfaceHolder sfhTrackHolder = mSpenSurfaceView.getHolder();
        sfhTrackHolder.setFormat(PixelFormat.TRANSPARENT);
```


これで書いたデータのみを透過させる事ができた。


このデータをbitmapとして、出力する方法が

```java:.java
Bitmap imgBitmap = mSpenSurfaceView.captureCurrentView(true);
```

3回で、とりあえず、SDK周りの使用は基本ができたかなと。
R / 統計 > 切片を0とした回帰直線の式

```txt:動作環境
RStudio 0.99.903 on Windows 7 pro
R version 3.3.1
```

R機能マップ 
http://qiita.com/7of9/items/0f911bcb95d3a8bbd703

渡された資料の中の計算式に基づくC実装とExcel, Rの回帰直線の式の傾きを比較していた。

- ExcelとRの回帰直線の係数は合う
- C実装のものだけ値が違う

使用しているデータは同じ。

違いは以下だと気づいた。

- 通常の回帰直線
- 切片を0とした回帰直線

Rのlsfitを使ってもだめなわけだ。

「切片を0とした回帰直線」の式は、以下のPDF内の式(1)の上にあるaハットとして定義されている。
http://sgulrep.sgu.ac.jp/dspace/bitstream/10742/1711/1/JK-33-027.pdf

```math
切片を0とした回帰直線の傾きの式 \\
a_1 = \frac{\sum x_i y_i}{\sum x_i x_i}
```

一方で通常の回帰直線の傾きは[参考](http://www.cc.u-ryukyu.ac.jp/~fukami/p0.pdf)によると以下。

```math
通常の回帰直線の傾きの式 \\
a_2 = \frac{N\sum x_i y_i - \sum x_i \sum y_i}{N\sum x_i x_i - {(\sum x_i)}^2}
```

Excelの方でSUMPRODUCT()を使ってsum(xx)とsum(xy)を計算し、「切片を0とした回帰直線」の傾きを求めたら、C実装と整合した。
Rの方でも以下の計算で整合した。

```R
> sum(newx$V1*newx$V2)/sum(newx$V1*newx$V1)
[1] -5906.378
```

### learned a lesson

次回、傾きの値が合わない状況に出くわしたら、このあたりを確認することにした。
TensorFlow製アート・音楽生成プロジェクト「magenta」で曲を作ってみる。

# はじめに
[magenta](https://magenta.tensorflow.org/)はGoogleBrainチームの作っているアート・音楽の生成プロジェクトです。
この記事では、magentaの[GitHubレポジトリ](https://github.com/tensorflow/magenta)に書いてある内容をもとに曲を作ってみます。
なお、環境はMacです。

# Docker を起動する
magentaはDockerイメージが上がってます。
下記のコマンドをterminalで叩くと、Dockerコンテナを起動することができます。

```
docker run -it -p 6006:6006 -v /tmp/magenta:/magenta-data tensorflow/magenta
```

Dockerを起動すると、Macの`/tmp/magenta`　とDockerコンテナ内の`/magenta-data`が同期され、ファイルのやり取りができるようになります。
なお、Dockerコンテナ内の`/magenta-data`配下のデータのみしか保存されないようです。

ちなみにDocker のインストールがまだの方は下記から。
[Install Docker Engine](https://docs.docker.com/engine/installation/)


# 作曲してみる
上記のDockerコンテナにはすでに学習済みのモデルが入っています。

下記のコマンドをDocker上で叩くと、曲が生成されます。

```
bazel run //magenta/models/lookback_rnn:lookback_rnn_generate -- \
--bundle_file=/magenta-models/lookback_rnn.mag \
--output_dir=/magenta-data/lookback_rnn/generated \
--num_outputs=10 \
--num_steps=128 \
--primer_melody="[60]"
```


なお、現在(2016/10/1時点)magentaのモデルとしては3つ準備されています。
・[LookBack RNN、Attention RNN](https://magenta.tensorflow.org/2016/07/15/lookback-rnn-attention-rnn/)
・[Basic RNN](https://magenta.tensorflow.org/2016/06/10/recurrent-neural-network-generation-tutorial/)

上記のコマンドではこのうち、LookBack RNNの学習済みモデルを用いて曲を作っています。
他のモデルのものも準備されているので、例えば下記のコマンドを叩けば、attentionRNNでの学習済みモデルを用いて作曲が可能です。

```
bazel run //magenta/models/attention_rnn:attention_rnn_generate -- \
--bundle_file=/magenta-models/attention_rnn.mag \
--output_dir=/magenta-data/attention_rnn/generated \
--num_outputs=10 \
--num_steps=128 \
--primer_melody="[60]"
```

# 聞いてみる
上記のコマンドでは数秒の曲が10パターン作成されます。

曲はDockerの`/magenta-data`配下に作成され、Macの`/tmp/magenta`配下に同期されます。
曲を適当な場所に移動して再生してみてください。

なお、MIDIファイルの再生にはアプリが必要ですが、私は下記を利用しています。
[Aria MAESTOSA](http://ariamaestosa.sourceforge.net/)

曲を再生する分には十分ですが、他におすすめがあったら教えていただけますとありがたいです。

# 今後

ここでは学習済みモデルを使い短い楽曲を作る、ということをやってみました。
引き続き、自分の選んだ楽曲での学習から、作曲までやってみたいと思います。

ありがとうございました。
録画映像の向きを変える

以下の例では録画映像を`LandscapeLeft`にしている。

```swift
let captureVideoLayer: AVCaptureVideoPreviewLayer = 
    AVCaptureVideoPreviewLayer.init(session: captureSession)

captureVideoLayer.connection.videoOrientation = 
    AVCaptureVideoOrientation.LandscapeLeft
```

---
ブログやっています：http://weed.nagoya
Ruby on Railsの gemについて調べてみた

## よく使うgemをまとめてみた

  - sass-rails : railsでsassが使えるようになる  
  - uglifier : jsを圧縮してくれる (.min.jsみたいなイメージ)
  - coffee-rails : coffeeが使えるようになる
  - jquery-rails : jQueryが使えるようになる
  - turbolinks : ページ遷移をAjaxに置き換えることで色々高速化する
  - jbuilder: 入力を与えるといい感じにjsonを返してくれる
  - sdoc: RDocコメントからHTMLのAPIドキュメントを作ってくれる
　　

  - sqlite3: 簡易DB
  - byebug: デバッガー
  - web-console: ブラウザでコンソールが見える。
  - spring: コマンドを実行するための待ち時間を短縮
  - minitest-reporters: テストの結果をプログレスバーでパーセント表示してくれる
  - mini_backtrace: わからん
  - guard-minitest: 自動テスト
　　

  - pg: ポスグレ
  - rails_12factor: herokuのログ出力等

## gemインストールの方法
~~~sh:コマンド
bundle install # 全部入れる

bundle install --without production
# production以外を全部入れる。一度実行すると以降は bundle install でも同じ動作をする

~~~

## Gemfileの例
~~~ruby:Gemfile
source 'https://rubygems.org'


# Bundle edge Rails instead: gem 'rails', github: 'rails/rails'
gem 'rails', '4.2.5'
# Use SCSS for stylesheets
gem 'sass-rails', '5.0.2'
# Use Uglifier as compressor for JavaScript assets
gem 'uglifier', '2.5.3'
# Use CoffeeScript for .coffee assets and views
gem 'coffee-rails', '4.1.0'
# See https://github.com/rails/execjs#readme for more supported runtimes
# gem 'therubyracer', platforms: :ruby

# Use jquery as the JavaScript library
gem 'jquery-rails', '4.0.3'
# Turbolinks makes following links in your web application faster. Read more: https://github.com/rails/turbolinks
gem 'turbolinks', '2.3.0'
# Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder
gem 'jbuilder', '2.2.3'
# bundle exec rake doc:rails generates the API under doc/api.
gem 'sdoc', '0.4.0', group: :doc

# Use ActiveModel has_secure_password
# gem 'bcrypt', '~> 3.1.7'

# Use Unicorn as the app server
# gem 'unicorn'

# Use Capistrano for deployment
# gem 'capistrano-rails', group: :development

group :development, :test do
  gem 'sqlite3',     '1.3.9'
  gem 'byebug',      '3.4.0'
  gem 'web-console', '2.0.0.beta3'
  gem 'spring',      '1.1.3'
end

group :test do
  gem 'minitest-reporters', '1.0.5'
  gem 'mini_backtrace',     '0.1.3'
  gem 'guard-minitest',     '2.3.1'
end

group :production do
  gem 'pg',             '0.17.1'
  gem 'rails_12factor', '0.0.2'
end
~~~
オフラインリアルタイムどう書くE08 の問題

@Nabetani さんが主催するオフラインでリアルタイムに「どう書く」をやるイベント( https://yhpg.doorkeeper.jp/events/51818 )で問題を出させてもらいました。
問題は「白黒陣取りゲーム」という名前で、詳細は
http://mtsmfm.github.io/2016/10/01/doukaku-e08.html
です。
実装ができた方はこちらのコメント欄からリンクを張っていただくと見つけやすくて助かります。
似たような問題をもっと解きたいという方は、Doorkeeper の コミュニティページ
http://yhpg.doorkeeper.jp/
に @Nabetani さんの過去問リンク集がありますので、そちらをご覧になると良いと思います。
python でコマンドライン引数をパースする

Q: python では、コマンドライン引数をパースするには？
A: ArgumentParserを使う選択肢がありました。

下記のコードをみると後でみても説明はほぼ要らないでしょうと。
このパーサーは、引数をパースして辞書にしてくれます。

```py3
#!/usr/local/bin/python3

import argparse

parser = argparse.ArgumentParser(description = "description goes here")
parser.add_argument("-i", type=str, help = "help text goes here. This option is required", required=True)
parser.add_argument("-o", type=str, help = "help text goes here. This option is optional", required=False)

#command_arguments is dictinary
command_arguments = parser.parse_args()

ivariable = command_arguments.i
print(ivariable)

```

実行例もあれば、もっとわかりやすそう。

```
$ python3 test.py -i www
www

$ python3 test.py -i www -o asd
www

$ python3 test.py -i www -o 
usage: test.py [-h] -i I [-o O]
test.py: error: argument -o: expected one argument

$ python3 test.py
usage: test.py [-h] -i I [-o O]
test.py: error: the following arguments are required: -i

$ python3 test.py -i
usage: test.py [-h] -i I [-o O]
test.py: error: argument -i: expected one argument

$
[自分用メモ] Unityのエディタ拡張時に選択しているAssetsのフォルダのパスを取得する

#内容
プロジェクトビューでAssetsフォルダ配下で現在選択しているフォルダのパスを取得する方法

#テスト環境
Unity5.4.0p4
Windows10

#実装

```csharp:
foreach (Object obj in Selection.GetFiltered(typeof(DefaultAsset), SelectionMode.DeepAssets))
{
    if (obj is DefaultAsset)
    {
        string path = AssetDatabase.GetAssetPath(obj);

        if(AssetDatabase.IsValidFolder(path))
        {
            Debug.Log("Valid folder. " + path);
        }
    }
}
```
全く新しい銀行を１から作るために必要な技術 （Monzo公式ブログより）

<img width="1159" alt="スクリーンショット 2016-10-01 2.34.26 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/135431/986bce4d-a4f1-20e7-e1f8-c8438835a90a.png">

## あらまし
今年（2016年）８月１０日、イギリスで全く新しい銀行が誕生しました。
[イギリスの金融当局、PRA](https://register.fca.org.uk/ShPo_FirmDetailsPage?id=001b000002syvKiAAI) が、「[Monzo Bank Ltd](https://monzo.com)」を制限付きで認可。２０１５年２月に設立以来、別のカード会社と提携してプリペイドカードを発行し、その利用状況をスマホ等で即時に確認できるサービスを限られた顧客に提供してきましたが、これから当局との調整を進め、２０１７年前半を目処に銀行としての業務を開始すべく準備を進めるとのことです。

## 技術要素
過去にUberの競合であるHailoや、イギリスのオンラインカラオケサービス等でエンジニアを務め、現在 Monzo の Head of Engineering である [Oliver Beattie](https://uk.linkedin.com/in/obeattie)氏が、公式ブログで「[Building a Modern Bank Backend](https://monzo.com/blog/2016/09/19/building-a-modern-bank-backend/)」と題し、技術要素についての説明をしているので、その内容を簡単に紹介します。
### マイクロサービスアーキテクチャ
世界各国に２４時間サービスを提供するため、夜間バッチは不可能。SPOFも排除する必要。また、各国の様々なユーザの要望に柔軟に、即時に対応できるため、そして、スケーラブルである必要から、はじめからマイクロサービスとして設計している。ベータ版開始時点では１００のサービス、現在では１５０のサービスが稼働中とのこと。
### クラスタ管理
耐障害性、スケーラビリティの確保のため、クラスタ管理は重要。過去にはMesos、 Marathon を利用していたが、最近 CoreOS上のKubernetesに切り替え。インフラコストは４分の１になったとのこと。
### 多言語対応
低レイテンシ等の理由からGo言語を主に使っていくが、プロプライエタリ、オープンソースの様々なソリューションを利用するため、多様な開発者を取り込むためには、多言語対応が重要。Dockerによりサービスのカプセル化は可能になったが、共通ライブラリを複数言語で管理していくのは大変なことになるため、共通コードそのものを、サービスとして独立化。分散ロックをRPCで取得するようにしている。今後DB,メッセージキューといった「共通インフラ」をすべてサービスとして提供する構想があり、現時点でJava, Python, Scalaでサービス開発ができているとのこと。
### RPC
複数の言語間の接続は、標準ライブラリが揃っているHTTPがよいが、堅牢なマイクロサービスの構築には、下記のような課題があり、検討の結果、Finagle と linkerdを利用中。

 - ロードバランス
 - 自動リトライ
 - 接続プール
 - ルーティング

### 非同期メッセージング
下記理由により、Kafka を利用。他のメッセージキューと違い、事実上の分散コミットログの構造をしているので。

 - 高可用性：受信側の状態（障害等）に関わらずでも送信側は１度送信すればよい。
 - スケーラブル：サービスを止めずに水平展開可能
 - 完全性：ノードが落ちてもデータが消えない。受信側が死んでも再送できる。
 - 再現性：過去のある時点からメッセージを再送可能
 - １回「以上」の配送保証：必ずメッセージが配送されること。複数送信を完全に防ぐのは難しいが、通常時は１回のみ配送されるべき。
 
## 日本語の関連記事

[「恐竜」銀行にうんざり？－バンカーらしくない29歳にお任せ - Bloobmerg](https://www.bloomberg.co.jp/news/articles/2015-08-23/-29-)
[ついにロンドンで生まれた「アプリ銀行」の世界 - マネーフォワード公式ブログ](https://moneyforward.com/mf_blog/20150703/ldn/)

## 参考にしたページ

https://en.wikipedia.org/wiki/Monzo_(bank)
https://monzo.com/blog/2016/08/11/we-are-now-a-bank/
R > データ操作 / データフレーム > read.tableで読込んだリストの特定行を削除する > x[-6,] / x[-5:-7]

```txt:動作環境
RStudio 0.99.903 on Windows 7 pro
R version 3.3.1
```

R機能マップ 
http://qiita.com/7of9/items/0f911bcb95d3a8bbd703

read.table()で読込んだリストの特定行を削除する。

参考 http://maoringo.blogspot.jp/2010/11/r.html

実際に6行目を削除してみる。

```R
> x
            V1            V2
1 9.999999e-09 -6.519855e-05
2 2.250000e-08 -1.055390e-05
3 6.249999e-08 -7.502142e-04
4 8.999999e-08 -2.667132e-04
5 1.225000e-07  1.113380e-04
6 2.025000e-07  1.148488e-04
7 2.500000e-07  1.298595e-05
> x[-6,]
            V1            V2
1 9.999999e-09 -6.519855e-05
2 2.250000e-08 -1.055390e-05
3 6.249999e-08 -7.502142e-04
4 8.999999e-08 -2.667132e-04
5 1.225000e-07  1.113380e-04
7 2.500000e-07  1.298595e-05
```

5行目から7行目の削除は以下。

```R
> x[-5:-7,]
            V1            V2
1 9.999999e-09 -6.519855e-05
2 2.250000e-08 -1.055390e-05
3 6.249999e-08 -7.502142e-04
4 8.999999e-08 -2.667132e-04
```
[Android Studio]Unregistered VCS root detectedを解決する


# Env
- macOS 10.11.3
- AndroidStudio 2.2

# What happened

こいつが立ち上げる度に出てくる

![スクリーンショット 2016-10-01 15.42.41.png](https://qiita-image-store.s3.amazonaws.com/0/132627/4bac0566-323d-6583-4ba5-71a17da97e06.png "スクリーンショット 2016-10-01 15.42.41.png")
# Solution

メニューから
VCS -> Enable Version Control Integration...を選択

![スクリーンショット 2016-10-01 15.52.24.png](https://qiita-image-store.s3.amazonaws.com/0/132627/86371cb2-661f-2867-84d5-2ea7e0761775.png "スクリーンショット 2016-10-01 15.52.24.png")

Gitを選択して[OK]

![スクリーンショット 2016-10-01 15.53.18.png](https://qiita-image-store.s3.amazonaws.com/0/132627/69a37454-9bcb-5aa3-070b-07ece4cecf8d.png "スクリーンショット 2016-10-01 15.53.18.png")
Matlabの現在のフォルダーに「処理中...」というのが出て動作が遅くなる問題の対処法

Matlabの現在のフォルダーに以下のような「処理中...」というのが出てきて動作が遅くなった場合．

![スクリーンショット 2016-10-01 15.44.36.png](https://qiita-image-store.s3.amazonaws.com/0/26972/77cb1cc1-84b1-ab62-5197-6d9a560e5c99.png)

MATLAB > 設定 > 一般 > ソース管理 でソース管理システムが有効になっているはずなので，なしに設定する．
Net_TokyoTyrantでエラーが出てしまいます。

現在、Net_TokyoTyrantを利用してphpからデータベースを操作しているのですが、頻繁に書き込みを行うと下記のエラーが出て、データベースが落ちてしまいます。

Fatal error: Uncaught exception 'Net_TokyoTyrantNetworkException' with message '111, Connection refused' in /usr/share/pear/Net/TokyoTyrant.php:53 Stack trace: #0

また、TokyoTyrant.phpの53行目付近は下記の通りです。

４８： public function connect(＄server, ＄port, ＄timeout = 10)
４９： {
５０： 　　＄this->close();
５１： 　　＄this->socket = @fsockopen(＄server,＄port, ＄this->errorNo, ＄errorMessage, ＄timeout);
５２： 　　if (! ＄this->socket) {
５３： 　　　　　　　throw new Net_TokyoTyrantNetworkException(sprintf('%s, %s', ＄this->errorNo, ＄errorMessage));
５４： 　　}
５５： 　　＄this->connect = true;
５６： }

何か解決方法はないでしょうか？
よろしくお願い致します。
「お使いの起動ディスクはほとんど一杯です」とエラーが出たときの対処法

以下のコマンドで容量の大きいファイルを探すことができます．
(この場合は5GB以上のファイル)

```
sudo du -g -x -d 5 / | awk '$1 >= 5{print}'
```
iOSエンジニアのAndroidアプリ開発備忘録


![iOSエンジニアのAndroidアプリ開発奮闘記.png](https://qiita-image-store.s3.amazonaws.com/0/41522/d71f9337-04e2-aac3-67f4-0172a0f05bf2.png "iOSエンジニアのAndroidアプリ開発奮闘記.png")


# はじめに
僕は2012年頃から4年ほどiOSエンジニアとして仕事をしました。
今年にSIerに転職をし、3ヶ月間ほどAndroidアプリ開発を担当させて頂きました。
本記事は、そのAndroidアプリ開発で短期間ではありますが得た知識について備忘録的ににまとめものになります。

- 殴り書きです。まとめとか言っておいてまとまってないです。ごめんなさい
- 理解の不十分な箇所、誤りなどがあった場合はご指摘頂けると幸いです

# 対象読者
備忘録のため、主に自分。
とはいえ、iOSアプリの開発は一通りやり、Androidアプリ開発に興味がある or これから始めるなどといった方で「iOSの場合はxxxだけど、Androidの場合でどうやってやるの？」といった疑問を持っている方の手助けに少しでもなれば良いな思っています。

# まとめテーマ
まとめたいものがたくさんあって、Androidアプリ開発そのものと直接的に関係のない GA、GCM 周りは少し脱線気味な気もしますが。。
書いていて膨大になりすぎたので記事を分けました。リンクになっていないところは執筆中です。

- [Swift、Kotlinの構文比較編](http://qiita.com/RyoAbe/private/2b0ded05c5c5a585a879)
- [Xcode、Android Studio 比較編](http://qiita.com/RyoAbe/private/26d173b8145c15f146dd)
- [Androidアプリを Gradle DeployGate Plugin を使って簡単公開](http://qiita.com/RyoAbe/items/97f230361fa79da004cd)
- [Androidアプリ開発における Google Cloud Messaging や Analytics の設定方法や手順についての備忘録](http://qiita.com/RyoAbe/items/534ade82e303f75ef7e4)
- [Androidアプリ開発における build.gradle のビルドタイプごと設定やディレクトリ構成についての備忘録](http://qiita.com/RyoAbe/items/b835c33409a003462eb9)
- はじめての RxJava 編
- retrofit でハマった編
- Realm でハマった編
サーバにOS再インストールしたら同じホストにsshつなげなくなったとき

#sshつながらぬ
後輩たちが練習のためにちょいちょいサーバにOSをインストール→同じホスト名でWebサーバ構築をやるが，
そのたびにsshがなんかエラーでて繋がらなくなる

具体的にはなんかこんな感じ
![image](https://qiita-image-store.s3.amazonaws.com/0/88792/02fb8d1c-d33c-2767-cb7c-3f42bb936887.png)

これは, ./sshディレクトリの中のknown_hostのそのホスト名の行を消せばいい
`#vim ~/.ssh/known_host`
で
で，ホスト名の行を削除
VPN接続したら、インターネットに繋がらなくなった時の対処方法

OpenVPNやTunnelblickを使って、VPNに繋がったはいいけど、インターネットに繋がらなくなることがあります。

参考：Tunnelblick - [Troubleshooting DNS Problems - If OpenVPN is connected to the server but you can't access the Internet](https://tunnelblick.net/cConnectedBut.html#if-openvpn-is-connected-to-the-server-but-you-cant-access-the-internet)

まず、DNSが原因かを調べます。IPアドレスとホスト名で、pingをやってみます。

```
$ ping 216.58.197.206
$ ping google.com
```

GoogleのIPアドレスに接続でき、google.comに接続できなければ、原因はDNSです。Googleの[public DNS](https://developers.google.com/speed/public-dns)か[OpenDNS](https://www.opendns.com/)を使うように、DNSサーバのリストの末尾に以下を追加します。

* 8.8.8.8
* 8.8.4.4
* 208.67.222.222
* 208.67.220.220

OSXの場合の例です。

![network.png](https://qiita-image-store.s3.amazonaws.com/0/10290/d0cd0077-67db-3f25-078d-29a0c73caca3.png)

DNS以外が原因でプロキシ経由でインターネット接続しているなら、プロキシ自動設定ファイル(.pac)の使用を止めて、常に同じプロキシサーバを使用するように設定してみると良いです。

それ以外なら、ググって頑張ってください。
mern-starterを取り急ぎherokuで実行させる方法


「MongoDB + Express + React + nodeの良いboilerplateないかな〜。。」

「[mern-starter](https://github.com/Hashnode/mern-starter)があるじゃないか！」

と思ったけどherokuでどうやって実行させるんだろ〜、とあれこれやったのでその備忘です。

＜注意＞以下手順を行なった時のmern-starterのバージョンは`2.0.0`です。

## 手順
### webpackをdevDependenciesからdependenciesに持ってくる
```package.json
"webpack": "2.1.0-beta.8",
```
を`"devDependencies"`から`"dependencies"`に移動。
なぜかwebpackがserver.bundle.js（ビルドされたサーバーサイドのファイル）でrequireされているため。

### クライアントでbuildする
```Shell
$ npm run clean
$ npm run build
$ npm run build:server
```
distフォルダが作成され、その下にクライアント・サーバー両方のファイルがビルドされて配置される。

### distフォルダを.gitignoreから外す
```.gitignore
dist
```
をコメントアウトまたは削除する。
一つ前の手順で作ったファイルをherokuにあげるため。

### Procfileの作成
```Procfile
web: npm run start:prod
```
これによりherokuで`NODE_ENV=production`という環境変数を設定した状態でサーバーが起動される。

### MONGO_URLをMONGODB_URIに変更する
```server/config.js
  mongoURL: process.env.MONGO_URL || 'mongodb://localhost:27017/mern-starter',
```
の`MONGO_URL`を`MONGODB_URI`に書き換える。
herokuで使うmLab MongoDBアドオンがURLの環境変数として`MONGODB_URI`を自動で設定するため。

### herokuのappを設定
```Shell
$ heroku create [app_name]
$ heroku addons:create mongolab:sandbox --app [app_name]
```
でherokuのappを作成してMongoDBのアドオンを追加。

### herokuにpushする
```Shell
$ git add .
$ git commit -anm "first commit"
$ git push heroku master
```

### 以上
https://[app_name].herokuapp.com/
にアクセスして確認する。

## 環境
端末はMacBook Air(macOS Sierra)です。

```Shell
$ sw_vers -productVersion
10.12
$ npm -v
3.8.3
$ node -v
v5.10.1
```
Galaxy PenSDKを使う２回目

前回の記事の反響のなかったけど、引き続き、実装をしてみる

[Samusung PenSDK を使う](http://qiita.com/shunjiro/items/08f50c825181bb5bf49f)

SpenSurfaceViewを使って描画を行うのが主流になってきて、前回利用していたSPenPenとかいう、名前が適当すぎるクラスもそんなに使われていないようです。

```java:MainActivity.java
        Spen spenPackage = new Spen();
        try {
            spenPackage.initialize(this);
        } catch (Exception e1) {}

```
利用の設定は、前回と同様ですが、コンストラクタ的にいれておくだけで大丈夫です！


描画用のSpenSurfaceViewはこんな感じ。

```java:MainActivity.java

　　　　mSpenSurfaceView = new SpenSurfaceView(mContext);
        if (mSpenSurfaceView == null) {
            
        }
        spenViewLayout.addView(mSpenSurfaceView);
```
SpenNoteDocとSpenPageDocを作る。背景画像の色以外は案外と定型のような気がする。

```java:MainActivity.java
　　　　Display display = getWindowManager().getDefaultDisplay();
        Rect rect = new Rect();
        display.getRectSize(rect);
        try {
            mSpenNoteDoc = new SpenNoteDoc(mContext, rect.width(), rect.height());
        } catch (Exception e) {}
        
        mSpenPageDoc = mSpenNoteDoc.appendPage();
        mSpenPageDoc.setBackgroundColor(0xFFD6E6F5);
        mSpenPageDoc.clearHistory();
```


結びつける
```java:MainActivity.java
mSpenSurfaceView.setPageDoc(mSpenPageDoc, true);
```

で状態と行う事を設定ができるので、普通の描画はストローク、ボタン押しながらは消しゴムみたいな設定は

```java:MainActivity.java
mSpenSurfaceView.setToolTypeAction(SpenSurfaceView.TOOL_PEN_BUTTON, SpenSurfaceView.ACTION_ERASER);
mSpenSurfaceView.setToolTypeAction(SpenSurfaceView.TOOL_SPEN, SpenSurfaceView.ACTION_STROKE);
```

色と太さの変更とかは

```java:MainActivity.java
　　　　 SpenSettingPenInfo penInfo = new SpenSettingPenInfo();
        penInfo.color = Color.BLUE;
        penInfo.size = 40;
        mSpenSurfaceView.setPenSettingInfo(penInfo);
```

みたいな感じで編集ができる
jenkins+selenium webdriver+rubyによるE2Eテストの自動化

#背景
E2Eテストをselenium webdriver + ruby(rspec)で書き、jenkinsを使って特定のタイミングで自動実行してくれるような環境を作りにいきます

#今回やること
今回は手動でjenkinsのビルド実行を開始し、テストが正しく動くことを確認するところまでをやっていきます。

#やり方
##ruby(rspec)によるテストコードの準備

- bundleのインストール

```
gem install bundler
```

- bundleの初期化

```
bundle init
```

- Gemfileにインストールするgemを追加
    - 今回はrspecとselenium-webdriverをインストールします

```
    # frozen_string_literal: true
    source "https://rubygems.org"
    
    gem "selenium-webdriver"
    gem "rspec"
    # gem "rails"
```

- gemのインストール

```
    bundle install --path vendor/bundle
```

- テストファイルの作成

```
    mkdir spec
    touch hoge_spec.rb
```

- テストコードの作成

```
    require 'selenium-webdriver'
    
    describe 'test' do
      it 'login' do
        driver = Selenium::WebDriver.for :firefox
        driver.get "https://dummy_domain/login"
    
        dummy_name = driver.find_element(:dummy_name, 'dummy_name')
        dummy_name.send_keys('dummy_name')
    
        login = driver.find_element(:dummy_button, 'dummy_button').click
      end
    end
```

- テストコードの実行(ちゃんと動くかどうかの確認)

```
    bundle exec rspec
```

##jenkinsの設定

- jenkinsのインストール

```
brew install jenkins 
```

- jenkinsの起動

```
brew services start jenkins
```

- localhost:8080へアクセス


- フリースタイル・プロジェクトのビルドを選択
- ソースコード管理→Git→Repository URLに先ほど作成したrspecのコードがあるディレクトリを設定
- ビルド環境→rbenv build wrapper
  - The Ruby Version→端末にインストールされているrubyのバージョンを指定
  - Preinstall gem list→高度な設定→RBENV_ROOTを$HOME/.rbenv-jenkinsにする
    - 参考：[Jenkinsでrubyのビルドでハマった点](http://qiita.com/kitaro_tn/items/22fd3830ba9a85ad5320)
- ビルド→シェルスクリプトに次のコードを記述

```
    bundle install
    bundle exec rspec
```

- ビルドの実行

- 青色になれば成功、赤色になれば失敗
  - #xx→コンソール出力でテスト結果の詳細が確認可能
Laravel Artisan のテンプレート


````
#!/usr/bin/env php
<?php

use Symfony\Component\Console\Input\ArgvInput;
use Symfony\Component\Console\Output\ConsoleOutput;
use Laravel\Lumen\Application;
use Laravel\Lumen\Console\Kernel;
use Illuminate\Console\Scheduling\Schedule;

$app = require __DIR__.'/backend/bootstrap.php';

$app->singleton(
    \Illuminate\Contracts\Console\Kernel::class,
    function()use($app){
        return new class($app) extends Kernel{
           public $commands = [
           ];
           /**
            * Define the application's command schedule.
            *
            * @param  \Illuminate\Console\Scheduling\Schedule  $schedule
            * @return void
            */
           protected function schedule(Schedule $schedule)
           {
               //
           }
        };
    }
);

$kernel = $app->make(
    'Illuminate\Contracts\Console\Kernel'
);

exit($kernel->handle(new ArgvInput, new ConsoleOutput));
````
初めてのAndroidアプリ開発ープログラミングの基本（その3）

東北TECH道場の参加者向けに作成したハンズオンのその２です。
その１は[こちら](http://qiita.com/ktaka/items/8cc997e464442aae4e18)
その2は[こちら](http://qiita.com/ktaka/items/ce6ddb76b2ba81d80c88)

---
##睡眠導入アプリのつづき
その2では画像を表示したり音声が再生できるようにしました。
このアプリに機能を追加してみましょう。

---
##睡眠導入アプリに機能を追加する

例えば、眠るまでに何回羊を数えたか残したい。

アプリを使うシチュエーションを考えてみましょう。

このアプリを使う場所は？
⇒ ベッドや布団の上。

アプリを使う状況は？
⇒ 眠れないとき

眠れなくて、羊が一匹、羊が二匹....と数えているうちにいつの間にか寝ている...はず。

---
ということは...

このアプリで羊が一匹、羊が二匹と数えるということは画面をタップすること。
その後に寝るということは、画面をタップしなくなる。

画面をタップしなくなるということは、通常の設定ならスマートフォンは画面が消えてスリープ状態になる。

眠るまでに何回羊を数えたかを残すには、このスリープ状態に入る時までに何回数えたかを記録すれば良いのではないだろうか？

---
##スリープ状態に入る時ってアプリで検出出来るの？
⇒ 出来ます。
スリープに入る時はActivityのonPause() が呼び出されます。

試してみましょう。
（端末のスリープに入るまでの時間を確認しておきましょう。若しくは端末のスリープボタンを押すことでもOKです）

---
##MyActivity.java に次のコードを追加します
スリープに入る時に呼び出される処理です。

```java
    @Override
    protected void onPause() {
        super.onPause();
        Log.i("onPause", "眠るまでの回数=" + sheepCount);
    }
```
追加する場所に気をつけましょう。
Activityの { } で囲まれた中で、且つ onCreate() の { } の外です。

---
自分でもう眠りそうだと思ったらスリープボタンを押す、若しくはいつの間にか寝て画面をタップしなくなったら端末がスリープ状態になり、この onPause() が呼ばれるはずです。

---
##MyActivity.java に次のコードを追加します

スリープから回復してきた時に呼び出される処理です。

```java
    @Override
    protected void onResume() {
        super.onResume();
        textView.setText("前回は" + sheepCount + "回羊を数えました。");
    }
```

アプリを実行して何回か羊を数えた後にスリープボタンを押してスリープさせて、再びスリープボタンを押して回復した時の表示を確認してみましょう。

---
##ちょっと実験

アプリを一旦終了させて、再び起動します。
次の2つの場合でそれぞれやってみましょう。
- ホームボタンを押した時
- バックボタンを押した時

---

ホームボタンを押した時は羊を数えた回数が残っていたが、バックボタンを押した時は0に戻っていたのではないでしょうか。

---
##アプリが終了しても値を残すことが出来るようにする方法。

SharedPreferences というクラスを使うと出来ます。

---
値を保存する：
MyActivity.java に次のコードを追加します。

```diff
@Override
    protected void onPause() {
        super.onPause();
        Log.i("onPause", "眠るまでの回数=" + sheepCount);
+        SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this);
+        sp.edit().putInt("SheepCount", sheepCount).commit();
    }

```

---
値を読み出す：
MyActivity.java に次のコードを追加します。

```diff
    @Override
    protected void onResume() {
        super.onResume();
+        SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this);
+        int count = sp.getInt("SheepCount", -1);
+        if (count >= 0) {
+            textView.setText("前回は" + count + "回羊を数えました。");
+        }
    }
```

---
#実行して値が残っているか試してみましょう

---

---
## Androidアプリのライフサイクル

![alt](https://developer.android.com/images/activity_lifecycle.png)
---
zipファイルをunzipした際に「~ extra bytes at beginning or within zipfile」と言われて展開できなかった際の対処法

## 実行環境
- OS
    - Mac OS X El Capitan

## 対処法
```
tar xvf hoge.zip
```
で展開出来る。
## 参考リンク
[Mac で Raspbian Jessie を MicroSD に書き込んだ](http://qiita.com/ikai/items/f7f2f31a00cd2279f963 "Mac で Raspbian Jessie を MicroSD に書き込んだ")
UE4の立体視環境で左右の目それぞれに別のオブジェクトを表示する方法

# はじめに
あまり需要なさそうですが、メモ程度に書いておきます。エンジンコードいじらないと実現できないと思っていたので、プラグインでできて大変嬉しいです。

## UE4の立体視環境
この記事中で「UE4の立体視環境」とは、

- ヘッドマウントディスプレイ(HMD)(Rift, Viveなど)を用いたVR環境
- Stereo Panorama Movie Capture Pluginを使って作成できる立体視全球静止画/動画(Spherical Stereo Image/Movie)

のことを指しています。
NVIDIA 3D VISIONなどはおそらくUE4そのものが非対応、未対応です。

## 左右の目それぞれに別のオブジェクトを表示する
「左右の目それぞれに別のオブジェクトを表示する」とは、例えば、左目には球を表示し、右目には三角錐を表示するようなことを指しています。
しかし、左右の目それぞれに別のオブジェクトを表示するというのは、VRではタブー中のタブーですので、応用できる範囲は限られていると思います。
その限られた応用として、立体視静止画や立体視動画を表示して、3Dムービー映画館や立体視美術館を作ることができます。

# 準備
## UE4のバージョン
バージョンは4.13を使用しています。これは新しくなったMedia Frameworkを使用するためです。動画を表示しない場合は、Stereo Panorama Movie Capture Pluginが含まれていれば4.12以下でも構いません。
また、プロジェクトはスターターコンテンツ有りで作成してください。(なくても代替物はあります。)

## Stereo Panorama Movie Capture Plugin
Edit -> Plugins -> Movie CaptureカテゴリにあるStereo Panorama Movie Capture Pluginを有効にします。このプラグインに、今回使用する重要なコンポーネントが含まれています。(Stereo Static Mesh Component)
有効にしたあと、UE4を再起動します。

今回、UE4そのものの操作方法やVRヘッドマウントディスプレイの使用方法やStereo Panorama Movie Capture Pluginの本来の使用方法は解説しません。


# 手順
[]内は命名例です。

## 1 BP作成

適当な新規フォルダ[StereoStaticMeshTest]にBlueprint(Actor)[3DImage]を作成します。

## 2 立体視画像の用意

左目用 [0000_L.png]
![0000_L.png](https://qiita-image-store.s3.amazonaws.com/0/34714/91d7978a-8d4a-c50b-3e44-1a10efb41f0a.png)

右目用 [0000_R.png]
![0000_R.png](https://qiita-image-store.s3.amazonaws.com/0/34714/58d3017c-f910-da41-b43d-fd8c79200e45.png)
この２つの画像をダウンロードして、それぞれ名前をわかりやすく変更し、StereoStaticMeshTestフォルダに放り込みます。(なんかよくわからない画像ですが、ステレオ立体視画像になっています。)
その後右クリックメニューからマテリアルを作成(Create Material)してください。

## 3 ブルプリをパチ組み
1で作成した3DImageブループリントを開き、Stereo Static Mesh Componentを2つ追加します。Default Scene RootにはScene Componentを入れておきましょう。
![スクリーンショット 2016-10-01 10.27.39.png](https://qiita-image-store.s3.amazonaws.com/0/34714/be41d038-1415-ae48-866a-2863f163014d.png)
2つのStereo Static Mesh Componentはわかりやすいように、それぞれ[Left][Right]に名前を変更します。
Rightを選択して、Detailタブ -> Sprite -> Eye to Render を LEft Eye から Right Eyeに変更します。

LeftとRightの両方に、Detailタブ -> Static Mesh -> Static Meshにスターターコンテンツにあるプレーン(Content -> StarterContent -> Shapes -> Shaple_Plane)を設定します。両方X軸を90度回転させ、Y軸Scaleを0.5625に設定します。(Transform -> Rotation, Scale)
スターターコンテンツがない場合はCubeあたりを選べば良いです。

LeftのMaterialに0000_L_MatをRightのMaterialに0000_R_Matを設定します。

![スクリーンショット 2016-10-01 12.05.29.png](https://qiita-image-store.s3.amazonaws.com/0/34714/5828f567-db8a-6fcd-d78f-4517df5ba78c.png)


これで終わりです。あとはレベルに配置して、VRHMDを使うか、全球立体視静止画等を作成すると確認できるはずです。
![スクリーンショット 2016-10-01 11.56.27.png](https://qiita-image-store.s3.amazonaws.com/0/34714/618376d1-eb25-15df-4291-ec95f1a36706.png)
(平行法で立体視してみるとどんな感じかわかりますよ。)

## 立体視動画の場合
https://docs.unrealengine.com/latest/INT/Engine/MediaFramework/HowTo/FileMediaSource/index.html
こちらを参考に動画のマテリアルを作成し、適用するとできます。
git add --all; git commit -m 'first commit'; git push --all を省略化する

# はじめに
Gitでの追加、コミット、プッシュのコマンドが長いのでZshで省略可しました。
下記のようなコードを一発で打ちたいです。

```zsh
$ git add --all; git commit -m 'first commit'; git push --all
```

これを

```zsh
$ ga -m 'first commit'
```

こんな感じに省略化します。


簡単なコミット方法を身近なエンジニアに聞いてみましたが「エイリアス化じゃない？」ということだったのでエイリアス化して、その後でコミットメッセージを付けるために関数化しました。

# 導入方法

コードです。

```zsh:git-add-all-git-commit-git-push-all.zsh
#!/usr/bin/env zsh

# git add --all; git commit -m 'first commit'; git push --allgit add --all; git commit -m 'first commit'; git push --all をしてくれるコマンド

# Thanks @link http://qiita.com/mollifier/items/eba71bc33bb7e3b76233
# Thanks @link http://qiita.com/petitviolet/items/b1e8b5139169dd530919
# Thanks @link http://qiita.com/mollifier/items/6fdeff2750fe80f830c8

# Usage: ga [-m|--message message]
function ga() {
  local -A opthash
  local MESSAGE
  zparseopts -D -A opthash -- -help h -message: m:
  if [[ -n "${opthash[(i)--help]}" ]]; then
    echo 'Usage: ga [-m|--message message]'
    return 0
  fi
  if [[ -n "${opthash[(i)-h]}" ]]; then
    echo 'Usage: ga [-m|--message message]'
    return 0
  fi

  if [[ -n "${opthash[(i)--message]}" ]]; then
     MESSAGE=${opthash[--message]}
  fi
  if [[ -n "${opthash[(i)-m]}" ]]; then
     MESSAGE=${opthash[-m]}
  fi
  if [[ $MESSAGE ]] then
     CMD="git add --all; git commit -m '${MESSAGE}'; git push --all"
  else
     CMD="git add --all; git commit -m 'Automatically commit'; git push --all"
  fi
  eval ${CMD}
}

_gacmd() {
  _arguments \
  -m'[commit message]' \
  --message'[commit message]'
}

compdef _gacmd ga
```

ファイルを作って

```zsh
$ source git-add-all-git-commit-git-push-all.zsh
```

sourceで読ませます。

でもsourceは良くないらしいので、将来的には他の方法にしたいです。

> zsh で source して使うプラグインを作るのは止めにしよう
> http://qiita.com/mollifier/items/6fdeff2750fe80f830c8

githubにコードを置いてみました。名前が長いのは当てつけです。
> https://github.com/yousan/git-add-all-git-commit-git-push-all

# 使い方

```zsh
$ ga
```

と打つだけでadd, コミット、プッシュをしてくれます。
このままだとコミットメッセージが自動で付いてしまいますが、`-m`オプションを付けるとコミットメッセージも指定出来ます。

```zsh
$ ga -m 'hoge message'
```
Ruby のプログラム実行時に DNS resolver を切り替えるやつ

- [[Ruby] 例えば、DNS Resolver をすげかえる - sonots:blog](http://blog.livedoor.jp/sonots/archives/38822072.html)

[sonots/resolver_replace](https://github.com/sonots/resolver_replace) を使ってみたら再帰して too many open files になったので別の方法を探る事に。といっても、Ruby に付いてくる [`resolv-replace`](https://github.com/ruby/ruby/blob/trunk/lib/resolv-replace.rb) を使うだけで良かった。

DNS サーバ
----

[ioquatix/rubydns](https://github.com/ioquatix/rubydns) を使って、 `*.dev` なドメインを `127.0.0.1` として解決し、それ以外は上流に任せるという DNS サーバを書く。以下は rubydns の README ほぼそのまま。

```ruby
#!/usr/bin/env ruby
require 'rubydns'

# Use upstream DNS for name resolution.
upstream = RubyDNS::Resolver.new([[:udp, '8.8.8.8', 53], [:tcp, '8.8.8.8', 53]])

# Start the RubyDNS server
RubyDNS.run_server(listen: [[:udp, '0.0.0.0', 5300], [:tcp, '0.0.0.0', 5300]]) do
  match(/\.dev/, Resolv::DNS::Resource::IN::A) do |transaction|
    transaction.respond!('127.0.0.1')
  end

  # Default DNS handler
  otherwise do |transaction|
    transaction.passthrough!(upstream)
  end
end
```

WEB サーバ
----

DNS resolver が変更できているか確認するために、ローカルホストで適当なウェブサーバを動かす。

```
require 'sinatra'

get '/' do
  'OK'
end
```

検証
----

以下の様なスクリプトで、プログラム中でのみ DNS resolver を変更できるかを確認。

```ruby
require 'resolv'
require 'resolv-replace'
require 'open-uri'

resolver = Resolv::DNS.new(nameserver_port: [['127.0.0.1', 5300]])
Resolv::DefaultResolver.replace_resolvers([Resolv::Hosts.new, resolver])

puts open('http://hoge.dev:4567').read
```

- `Resolv::DNS` で任意の DNS サーバのインスタンスを作り、 `Resolv::DefaultResolver.replace_resolvers` で `Resolv::DefaultResolver` の中身を入れ替える
- `resolv-replace.rb` をロードしていれば、モンキーパッチによってソケットの `#getaddress` が `Resolv::DefaultResolver` を使って名前解決する様になる
    - なお、 `#gethostbyname` などは対象外なので、ホストで設定されている DNS resolver を使い続ける
- `Resolv::DefaultResolver` はソケットの `#getaddress` のレシーバ
Go 製コマンドラインツールの Stdin, Stdout, Stderr をテストする

コマンドラインツールを作成すると、Stdin,Stdout,Stderr を扱うときがあって、それらのテストをやろうとした時どうすればいいのか考えますよね。
今回もツールを作っててハマったので記録しておきます。
# 構造体に io.Reader, io.Writer を定義する

例えば

```go:person.go
type Person struct {
    Stdin     io.Reader
    Stdout    io.Writer
    Stderr    io.Writer
}

func New() *Person {
    return &Person{
        Stdin:  os.Stdin,
        Stdout: os.Stdout,
        Stderr: os.Stderr,
    }
}
```

のような感じで構造体に定義しておきます。
こうすることで、

    person := person.New()

のようなコードを書いたとして標準入力なら

    scanner := bufio.NewScanner(person.Stdin)

標準出力なら

    person.Stdout.Write([]byte("Hello"))

といったコードを書くことができます。

# テストを書く

上記のような構造体を使うことで、Stdin,Stdout,Stderr のテストを次のように行うことができます。ポイントはそのまま　os.Stdin, os.Stdout, os.Stderr を使うのではなく、別の io.Reader, io.Writer に置き換えることでテストが可能になります。
この時、bytes.Buffer を使うと便利です。

```go:person_test.go

import (
    "fmt"
    "bytes"
    "scanner"
    "testing"
)

func TestPerson(t *testing.T) {
    // 別の io.Reader, io.Writer に置き換える
    expected := "Hello"
    input := bytes.NewBufferString(expected + "\n")
    output := new(bytes.Buffer)
    person := &Person{
        Stdin:  input,
        Stdout: output,
        Stderr: output,
    }

    // standard output
    fmt.Fprint(person.Stdout, expected)
    if expected != output.String() {
        t.Errorf("got: %s, expected: %s", output.String(), expected)
    }

    // standard input
    scanner := bufio.NewScanner(person.Stdin)
    for scanner.Scan() {
        text := scanner.Text()
        if expected != text {
            t.Errorf("got: %s, expected: %s", text, expected)
        }
    }
}
```

stdout では `fmt.Fprint()` で `person.Stdout` に書き込んだ文字列を `output` 変数を通じて取り出しています。`output.String()`
stdin では `bytes.NewBufferString()` で書き込んだ文字列を `scanner := bufio.NewScanner(person.Stdin)` から `scanner.Text()` を通じて取得しています。

今回はこのような感じでテストしました。
間違っているところや直した方ががいいポイントがあれば、是非教えてください!!
【Bash】ファイルの中身をN行おきに出力する

```awk 'NR%N==0' hoge.txt```
※Nには任意の数字が入る。
## 例
1から10までの数字が書き込まれているファイルがあるとする。

```number.txt
1
2
3
4
5
6
7
8
9
10
```
```
awk 'NR%2==0' number.txt
# => 2, 4, 6, 8, 10
awk 'NR%3==0' number.txt
# => 3, 6, 9
awk 'NR%4==0' number.txt
# => 4, 8
awk 'NR%5==0' number.txt
# => 5, 10
```
#rrggbbaaのaaを10進数にする


[#rrggbbaa](https://drafts.csswg.org/css-color-4/#hex-notation)に[iOS10 (Safari 10.0) が対応](https://developer.apple.com/library/content/releasenotes/General/WhatsNewInSafari/Articles/Safari_10_0.html)したらしい。


```css
#0000ffcc //rgb(0 0 100% / 80%)
```
みたいなやつ。HEXに不透明度がつく。

ただ、不透明度も16進数で書かないといけない。
でも、デザインデータは0〜100%の不透明度でやってきますよね。

## 計算

なので、[10進数/16進数対応表](http://www16.plala.or.jp/fm677/16hex.htm)を参考に`aa`を%にする数字をわりだした。
小数点.19608とか余ってしまうんだけど、それは誤差ということで。

```計算式
10進数 / 255 * 100
```

### 結果

- 10% `1A`
- 20% `33`
- 30% `4D`
- 40% `66`
- 50% `80`
- 60% `99`
- 70% `B3`
- 80% `CC`
- 90% `E6`


うむ。これは覚えられない。


## 結論

RGBaでいいかな。
Sublime Text の [In-Dec-Value](https://packagecontrol.io/packages/Inc-Dec-Value) とか使ってると HEX と RGBa をすぐ変換できるし、その方が楽。
LINE Notifyをとりあえず使ってみる

# LINE Notifyをとりあえずに使ってみる

LINE Notifyにより簡単にLINE通知の実装が可能になったのでpythonで動くプログラムを作ってみた

# 手順

1. Line Developerにログイン　https://notify-bot.line.me/ja/　

2. 画面右上からマイページに行きトークンを発行

3.LINE Notifyアカウントを選択したグループに招待 

4.アクセストークンを書き換えプラグラムを実行

`python line_notify.py hello`
 
以上

## プログラム

※　python2系

```python:line_notify.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
LINE NotifyをPythonから使う
"""

import urllib
import urllib2
import os,sys

url = "https://notify-api.line.me/api/notify"
message = sys.argv[1]
params = {"message":message}
params = urllib.urlencode(params)

req = urllib2.Request(url)
# ヘッダ設定
req.add_header("Authorization","Bearer "+os.environ["LINE_ACCESS_TOKEN"])
# パラメータ設定
req.add_data(params)


res = urllib2.urlopen(req)
r = res.read()
print(r)
```

### curlでもっと簡単に試せる

`curl -X POST -H 'Authorization: Bearer <アクセストークン>' -F 'message=<メッセージ>' https://notify-api.line.me/api/notify`

***
### 参考

LINE Notify公式
> https://notify-bot.line.me/ja/

公式ドキュメント
> https://notify-bot.line.me/static/pdf/line-notify-api.pdf
Ubuntu14.04 64bit(trusty)でHandbrake(disable gtk x265)をCompileした時のエラー対応(opus not found)

#必要なライブラリのインストール
```bash
sudo apt-get update
sudo apt-get -y install git subversion yasm build-essential autoconf libtool zlib1g-dev libbz2-dev libxml2-dev libogg-dev libtheora-dev libvorbis-dev libsamplerate-dev libfribidi-dev libfreetype6-dev libfontconfig1-dev libass-dev libjansson-dev libmp3lame-dev libx264-dev zip unzip tar gzip
```

#エンコード中に「Segmantation Fault」が出力されて失敗するためにlibx264を別でビルド&インストール
```bash
sudo apt-get -y build-dep libx264-142
sudo apt-get -y source libx264-142
cd x264-0.142.2389+git956c8d8
sudo ./configure --enable-static --enable-shared --extra-cflags=-fno-aggressive-loop-optimizations
sudo make -j8
sudo cp libx264.so.142 /usr/lib/x86_64-linux-gnu/
```

#Handbrakeビルド
```bash
git clone https://github.com/HandBrake/HandBrake.git hb
cd hb
./configure --disable-gtk --disable-x265
cd build
sudo make -j8
```

#コンパイル中に以下のエラーが出るので個別に対処
```bash
ERROR: opus not found
/usr/bin/ld: -lharfbuzz not found
```

#libopusを手動でビルド&インストール
handbrakeのソースフォルダ配下「/contrib/libopus」に移動して以下を実行

```bash
cat module.defs
～
LIBOPUS.FETCH.url = http://download.handbrake.fr/contrib/opus-1.1.3.tar.gz
～
wget http://download.handbrake.fr/contrib/opus-1.1.3.tar.gz
tar zxvf opus-1.1.3.tar.gz
cd opus-1.1.3
./configure
make -j12 && make install
```

#libharfbuzz-devをインストール
```bash
apt-get install libharfbuzz-dev
```

#再度ビルド&インストール
```bash
cd build
sudo make -j8 && make install
HandBrakeCLI --version
[11:29:37] hb_init: starting libhb thread
[11:29:37] thread 7f4cd8333700 started ("libhb")
HandBrake 20160929182728-d398531-master
```
Windows10をクリーンインストールしてCentOS5.5 を入れるときにハマったこと

# Windows10 => CentOS5.5
さて、タイトルのとおりですが、色々あってWindows10 がプリインストールされたマシンをクリーンインストールして、CentOS5.5 を入れることになりました。
その中で数か所ハマったところがあるので残しておきます。

##　目次
- CentOS5.5 の入手経路 (未解決)
- インストールできなかった原因 (解決)
- SystemRescueCd の使用 (成功)

# CentOS5.5 ってどっから入手できるんだっけ？

最初のハマリポイントは、OSの入手方法です。
実は、以前
http://blog.fusic.co.jp/archives/3796/
を参考に、CentOS6.6 を使ってvagrant box を作ったことがありました。
なので、`liveDVD.iso`ファイルをネットから探してくれば良いということを知っていました。

ところが、
- [理化学研究所](http://ftp.riken.jp/Linux/centos/5.5/)
- [国立大学法人　北陸先端科学技術大学院大学](http://ftp.jaist.ac.jp/pub/Linux/CentOS/5.5/)
- [山形大学](http://ftp.yz.yamagata-u.ac.jp/pub/linux/centos/5.5/)

という感じで、どこにも置いてないんですね。
どこも、`Readme` だけのもぬけの殻。

http://qiita.com/timothy_o/items/d7d7b8de23b426eddf2f
をみつけて探してみても、
http://archive.kernel.org/centos-vault/5.5/isos/x86_64/
`liveDVD.iso` がない。

結局、僕は会社にあった秘伝の"CentOS5.5 install disk"を見つけて使いました。
歴史って大事だなと感じました。

もし秘伝のDVD がない人は、liveCD.iso とかからがんばってください。
その方法についてはここでは触れません。

# インストールでハマった

DVD を手に入れたので、Bios を立ち上げてドライブ起動順を切り替えました。
ついでに、BIOSの設定で、SafeMode なるものがあったのでdisable にし、
UEFI モード とかいう設定をオフにしました。

そのまま、設定を保存し言われるままに作業を進めました。
しかし、ついにインストールと言うところになって、またしてもエラーが発生しました。

以下、会話の流れです。

```
`全てのパーティションを削除して上書きする(英語は忘れた)`を選択

"ほんと？" => YES

設定とかいじる？ => NO
```
そして、エラー。。。
エラー。。。。。。。。。。。。
![IMG_0464.JPG](https://qiita-image-store.s3.amazonaws.com/0/115634/4bc223bf-fd1b-a669-80d2-58381bd47a16.jpeg)

なんかパーティションのフォーマットが違ってるからインストールできないということらしい。

エラーメッセージを超意訳すると、

```
Windows10がインストールされているマシンのパーティションフォーマットは `GPT` だが、
CentOS5系 が採用しているフォーマットは`MBR`だから書き込めないよ
```
という感じです。(後半は書いていないけど、結局フォーマットを変更することにより解決した。)

ということで、もう一度windows を立ち上げ直し、バックアップディスクを作成し(最初にしておいたほうが良い)、
SystemRescueCd
https://www.system-rescue-cd.org/SystemRescueCd_Homepage
というソフトを空のDVD に書き込みました。
後述しますが、SystemRescueCd は、ファイルのパーティションを変更するのに用いました。

その後、PC をrebootし、 SystemRescueCd をboot しました。
起動したら、`startx` というコマンドを打ち、GUI を立ち上げました。

そして、GUI でGParted というソフトフェアを起動しました。
メニューの中から、
`Device` => `create partition table` というのを選択し、
セレクトボックスの中から、`msdos`を選択しました。

これにより、パーティションが変更されたようです。
本当に一瞬で終わりました。
ちなみに、この操作を行った瞬間、データは壊れてしまうらしいです。

その後、もう一度PC をreboot し、Disk を入れ替え、CentOS5.5 のインストールを行いました。
今度は無事成功でした。

# まとめ
ということで、新しいマシンに古いCentOS を入れるときには
パーティションに気をつけなくてはいけないようです。

サーバーの知識がほとんど無いので、間違ったことを書いている部分もあるかと思いますが、
コメントや編集リクエストでご指摘いただけたらと思います。
よろしくお願いします。
めざせpythonライブラリマスター （67）httpie

#【ライブラリ説明】
　HTTPリクエストを投げられる

#【コマンド】
　`http [flags] [METHOD] URL [ITEM [ITEM]]`

　pythonのIDE Spyder で実行しましたが、時間が経っても応答しませんでした。
　そのためUbuntuで実行しました。

　(実行コマンド)　`http httpie.org`

　(結果)　　　　　<img width="293" alt="http.png" src="https://qiita-image-store.s3.amazonaws.com/0/121997/b916b8ff-82a8-f19f-4e8a-31b634506751.png">


#【参考サイト】
　[github](https://github.com/jkbrzt/httpie)
Expressでシンプルなファイルアップロード

Expressをapiサーバーとして使おうとして、画像ファイルをクライアントからPOSTで送る時にハマりました。

## bodyParserではなくmulterを使う
Expressの知識がなくてbodyParserがJSONにしか対応しないようになっていたことを知りませんでした。
そこでmulterというミドルウェアを使います。
https://github.com/expressjs/multer

## multerでハマった
↓これにハマっていた
http://banseivlog.hatenablog.jp/entry/2016/07/29/191114

ですが、よくよく見てみたらREADMEにmulterの使い方ががっつり書いてあるんですね。
https://github.com/expressjs/multer#usage


## サンプル

単純にファイルをアップロードするサンプルです。
https://github.com/SatoshiKawabata/express-upload-file

### アップロードフォーム
フォームは[views/index.ejs](https://github.com/SatoshiKawabata/express-upload-file/blob/master/views/index.ejs#L10-L16)です。

```html:index.ejs
<form 
  method="POST"
  enctype="multipart/form-data"
  action="/upload">
  <input type="file" name="thumbnail"></input>
  <input type="submit"></input>
</form>
```
### upload.js
multerを使っているのは[routes/upload.js](
https://github.com/SatoshiKawabata/express-upload-file/blob/master/routes/upload.js#L4)です。
[ここ](https://github.com/SatoshiKawabata/express-upload-file/blob/master/routes/upload.js#L8)でファイルを受け取れるようにしています。

```javascript:upload.js
router.post('/', upload.fields([ { name: 'thumbnail' } ]), function(req, res, next) {
  console.log(req.files); // req.filesにアップロードされたデータが入ってきます。
}
```

アップロードされた`req.files.thumbnail[0]`のプロパティ

```javascript:
{destination:"./uploads/"
encoding:"7bit"
fieldname:"thumbnail"
filename:"7df615fa5b9accdf22b9471ee26ecb70"
mimetype:"image/png"
originalname:"  test.png"
path:"uploads/7df615fa5b9accdf22b9471ee26ecb70"
size:178923
```
MSC-MOD20 > 空き容量確認コマンド > 3行の応答がある > 後ろ2行は連続している / 終端は0x0A

```txt:動作確認
ESP8266 (気圧計で使用したユニバーサル基板: I2Cを4.7kでプルアップ)
SDモジュール: MSC-MOD20 ( http://www.microtechnica-shop.jp/shopdetail/000000000026/ )
Analog Discovery 2 (以下AD2)
```

MSC-MOD20にはmicroSDの空き容量を確認するコマンドがある。
コマンドは「K M:」。

## マニュアル記載の応答文字列

その応答は「MSC-MOD20ユーザガイド」を見ると以下のようになっている。

```txt:
!00
$ssssssssssssssss
!00
```

- 1つ目はコマンドを受けたことに対するACK
- 2つ目は空き容量 (sに数値が入る)
- 3つ目は空き容量取得後のACK

## 読取りしてみた

上記の応答に対して、以下のような実装をした。

- 0x00(応答なし)が返るまでの読取りをする
- その処理を3回繰返した

読取りの結果が以下。
「1:5」という記載は1つ目で5文字までの文字を読取っていることを示す。

```txt:
1:5,!00
2:27,$000000006E170000
!00

!00

3:0,
```
(補足 > `2:27,`の表示の後に単独で`!00`が表示されているのはメモリ割当てが少ないために生じているバグだった。)

2回目の読取りでは3回目の!00まで読取ってしまっている。

## 応答文字列(+補足)

```txt:
!00
$ssssssssssssssss
!00
```

応答は上記であるが、以下の補足事項が分かった。

1. 1行目は終端(0x00)で切れる
2. 2行目は終端(0x00)で切れず、即座に3行目が送信される

このような応答に合わせた実装にしないといけない。

## Analog Discovery2でキャプチャ

2行目の終端は0x0Aなのか0x0Dなのか。
「MSC-MOD20ユーザガイド」のp8に以下の記載がある。

> 戻り値の終端はキャリッジリターン(0x0D)ではなく、ラインフィード(0x0A)なのでご注意ください。

Analog Discovery2でキャプチャした。
setup: http://qiita.com/7of9/items/1c40de42ab2647918140

http://qiita.com/7of9/items/81b3948715751b8347ca
に記載の方法で0x0Aでロジック取込みを止めるようにした。


![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/cf46ea5b-7ce4-d882-45f7-591c6694f832.png)

赤枠右側は3行目の`!00` (h21, h30, h30)なので、2行目の終端は0x0Aで判断できることを確認した。

アスキーコード一覧
http://www9.plala.or.jp/sgwr-t/c_sub/ascii.html
ログイン前にbashの環境変数を設定するsshワンライナー

# やったこと
LANGとかPATHとかbash入ってからexportしそうなやつを、ログイン前にsshコマンドのオプションとして指定してログインする。
(ログイン後に環境変数をexportとかしないで済む)

```bash
# ログイン前
[user@client ~]$ ssh -t (IP) "bash -c 'export LANG=C;export PATH=$PATH:/usr/local/foo/bin:/usr/local/bar/bin;bash';"

# ログイン後
[user@server ~]$ env |grep -e LANG -e PATH
PATH=(もともとあったの):/usr/local/foo/bin:/usr/local/bar/bin
LANG=C
# 反映されてる!!
```
なんか黒魔術感あるけど、サーバがたくさんあって毎度.bashrcを配布するのめんどくさかったりする時便利。
もっと簡単な方法がすごくある気がすごくするけど考えない考えない。

# よくわかる?解説

あれこれ試したらできたので定かではないが、雑に言うとsshで仮想端末ありでbashを単発実行して、その実行の中で環境変数設定して、その上でさらに対話モードのbashを実行してる。

```bash
# ざっくりコマンドの意味
$ ssh -t (IP) "bash -c 'export LANG=C;export PATH=$PATH:/usr/local/foo/bin:/usr/local/bar/bin;bash';"
	ssh -t (IP):仮想端末割当てログイン
		bash -c '...':後ろのコマンドを単発実行
			export ...;bash:環境変数指定して、bashをさらに対話モードで開く
```

それでは試行錯誤の流れを追ってみよう。

まず、ssh (IP) "コマンド"のよくあるのだと端末というかシェルがリモート上に行ってしまい見えない

```bash
[user@client ~]$ ssh (IP) "bash;export LANG=C"
# シェル返ってこない
```

そこでsshに-tつけるとシェルが返ってくる。が、LANG反映されてない。

```bash
[user@client ~]$ ssh -t (IP) "bash;export LANG=C"
[user@server ~]$
# シェル返ってくる(ログインできる)

[user@server ~]$ env |grep LANG
LANG=en_US.UTF-8
# デフォルトのまま
```

これは、bashが終わったらexportするからなので、するとbash起動した上でexportする必要がある。
("bash&&export LANG=C"とかでも当然だめ)

なので、bashをあれこれ試行錯誤してみる。

まず、bashから環境変数指定するため、bash -cするとこうなる。

```bash
$ bash -c 'export LANG=C;echo $LANG';
C
$ echo $LANG
ja_JP.UTF-8
# bash -cの中でだけLANGが有効になって、手元のbashには反映されてない。 

```

ただ、これでは単発処理で終わってしまうので、対話モードの追いbash。

```bash

$ bash -c 'export LANG=C;echo $LANG;bash';
C
$ echo $LANG
C
# できた。 (本来bashして新しいシェルプロセスに入ってからexportするのを再現できてる。)

```

あとは全部つなげて、最初のものができあがる。

```bash
# ログイン前
[user@client ~]$ ssh -t (IP) "bash -c 'export LANG=C;export PATH=$PATH:/usr/local/foo/bin:/usr/local/bar/bin;bash';"

# ログイン後
[user@server ~]$ env |grep -e LANG -e PATH
PATH=(もともとあったの):/usr/local/foo/bin:/usr/local/bar/bin
LANG=C
# 反映されてる!!
```

なお、踏み台サーバにIPだけ引数にしたスクリプトでも置いておけば(カスタムsshスクリプト)、特定にログインする時便利だなと。

以上。
AWS AuroraでMaxScaleの(Read/Write split)がうまく起動しなかった

[MaxScale](https://github.com/mariadb-corporation/MaxScale)でRead/Write splitを使っていたが、AWSのAuroraにしたところ
master、slaveの判断をMaxScaleの方でできなくなったのでmaxscale起動時にmaster,slave設定を手動で行う。

### maxscale.conf

masterとslave(Auroraだとwriter、reader)サーバの設定の箇所

```
[m_shard1]
type=server
address=server-1
port=3306
protocol=MySQLBackend

[s_shard1]
type=server
address=server-2
port=3306
protocol=MySQLBackend
```
### maxscale_start.sh

server名の先頭がm_だったらmaster、s_だったらslaveとする。

```
maxscale
sleep 5
for server in `maxadmin list servers | grep 3306 | awk '{print $1}'`
do
  i=`echo $server | cut -c 1`
  [ "x$i" = "xm_" ] && maxadmin set server $server master
  [ "x$i" = "xs_" ] && maxadmin set server $server slave
done
```
めざせpythonライブラリマスター （66）youtube-dl

#【ライブラリ説明】
　youtubeの動画をダウンロードできる

#【コマンド】
　`youtube-dl [OPTIONS] URL [URL...]`

　オプションの数が多い！

#【参考サイト】
 [github](https://github.com/rg3/youtube-dl)
[CURL]連番になっているファイルをコマンド1行でDL

PDFが20個に分割されてるよ。DLだりー。
CURLで解決です。


## 1.png 〜 151.pngまでダウンロードしたいとき
```bash
curl -O "http://examle.com/[1-151].png"
```

## 001.png 〜 151.pngまでダウンロードしたいとき
```bash
curl -O "http://examle.com/[1-151].png"
```

以上です。
非常に簡単です。