OmniAICreator/Qiita-1.07M huggingface dataset:
おうちハック: Bluetooth LED を 防犯ライト! 定期起動 スマホとの近接判定 Dashで物理スイッチ (俺scriptのservice化)

# Overview

以下のおうちハックをするにあたって、俺scriptのservice化をしたので、その説明。

* [Bluetooth LE (BLE) SATECHI LED電球 を Raspberry Pi3 から 制御](http://qiita.com/hidenorly/items/757ce2d949846e035bc2)
* [iPhoneなど Bluetooth が 近接した時、離れた時に、何かする](http://qiita.com/hidenorly/items/50615b208f74575bf6e4)
* [Raspberry Pi3 on Ubuntu Mate 16.04 で Amazon Dash を ただのIoTボタンとして使う](http://qiita.com/hidenorly/items/75634f00cda10a068d40)

を組み合わせて、Bluetooth LED を 防犯ライトにし、定期的な起動や、スマホが近づいたら防犯ライトを自動的にオフにしたり(自分がいるのに点灯とかするのはうざい。。。)、Amazon Dashボタンで、手動でOn/Offできるようにします。(Dashボタンを使うのは、物理ボタンがないと、スマホからアプリでライトをon/offするとか面倒だからです。やはり目の前にあるものは近くの物理的なもので操作したい。。。)

上を実現するために、 [Bluetooth LEDのOn/Offのscript](https://github.com/hidenorly/bleBulbDriver) に、toggle modeを用意し、[Dashボタンが押されたとき](https://github.com/hidenorly/DashBtnLauncher) に、toggleをできるようにし、 [スマホ近接判定とスケジュール起動](https://github.com/hidenorly/bt_proximity_monitor) しました。

# 構成物 を 定期的に起動させる

部品はこれまで、上のように作ってきたので、これを組み合わせるわけですが、このままだと、sshでhupでsudo実行する、rebootしたら、再度行うとか、面倒です。

というわけで、Raspberry Pi3 (私は Ubuntu Mate 16.04LTS を動かしています) でserviceとして定期的に動作させたくなってきます。

Ubuntuでは、systemdを使って、サービスを制御しています。

```
$ sudo systemctl status xxxx
```
みたいにして、statusを管理したり、enable/disable, start/stop/restartなどをできるようにしてみたいと思います。

## スマホなどBTデバイスの近接判定とスケジューラー

https://github.com/hidenorly/bt_proximity_monitor
に、インストーラーを用意したので、

```
$ sudo install.sh
```

でできるようにしてあります (実際に何をやっているかは次のnodeのサービス化のところで説明します)

```/opt/btproximity/rules.cfg 
[16:30-23:30 Mon Tue Wed Thu Fri Sat Sun]
#onStart
/root/bin/bleBulbDriver.rb allOn
#onEnd
/root/bin/bleBulbDriver.rb allOff
#onConnected
/root/bin/bleBulbDriver.rb allOff
#onDisconnected
/root/bin/bleBulbDriver.rb allOn
```

## Amazon Dash Button Launcher

https://github.com/hidenorly/DashBtnLauncher

### .serviceファイルの用意

```/etc/systemd/system``` に、以下のような```dashbtnlauncher.service``` を用意します。

```/etc/systemd/system/dashbtnlauncher.service
[Unit]
Description = Ble Button Controller with Dash Button

[Service]
ExecStart = /usr/local/bin/node /opt/DashBtnLauncher/DashBtnLauncher.js -b XX:XX:XX:XX:XX:XX -e /root/bin/bleBulbDriver.rb alltoggle
Restart = always
Type = simple

[Install]
WantedBy = multi-user.target
```

次に、systemdに認識させるために、

```
$ sudo systemctl enable dashbtnlauncher.service
```

をします。

```
$ sudo systemctl list-unit-files --type=service
```
とかでdashbtnlauncherが表示されればOkです。

実行は、
```
$ sudo systemctl start dashbtnlauncher.service
```
です。以後、システムを再起動しても、自動的に起動しているはずです。

動作しているかどうかは

```
$ sudo systemctl status dashbtnlauncher.service
```

のようにして、確かめられます。


このようにして、bleBulbDriver.rbにtoggle modeを用意するだけで、最初に書いたように、定期的にランプは付きますが、スマホが近接する状態では光らず、また、dash buttonを押すことで手動でon/offもできるようになりましたとさ。

以上、おうちはっくでした。
Perlで1レコード複数行のデータを処理するためのメモ

Perlを業務で扱って1年程なので、拙い記事になりますが、お手柔らかに。。。

### 経緯
---
現場でiniファイル型(1レコード複数行)ファイルを扱ったときに、kshコマンドで1レコード1行に変換するのが面倒だったので、Perlで処理したときのメモ。
ただし、誰も保守できないとのことで没になったが、今度自分が使う際のメモ程度に記載しておく。

### 使用した項目
---
+ **Perlの入力行セパレータ**

Perlでは、行を定義する際のセパレータとして、デフォルトの変数"**$/**"に改行文字が設定されている。1レコード複数行のデータを扱う際は、この変数を操作することで複数行を1レコードとして扱うことができる。

+ **パターンマッチの複数行モード**

パターンマッチ演算子の"**m**"を使うことにより、パターンマッチで複数行モードで行うことできる。


### 実際のサンプル
---
+ テキストサンプル

以下のようなiniファイル形式のテキストファイルを扱った。

``` sample.txt
#
# ID=HOGE1
#

ID=HOGE1
FILE=/HOGE/TO/PATH1.txt
GRP=FUGA1
END

#
# ID=HOGE2
#

ID=HOGE2
FILE=/HOGE/TO/PATH2.txt
GRP=FUGA2
END

#
# ID=HOGE
#

ID=HOGE3
FILE=/HOGE/TO/PATH3.txt
GRP=FUGA3
END

```

+ Perlコード

``` sample.pl
#! /usr/bin/perl
use strict;
use warnings;

# 引数を変数に格納
my $argument = $ARGV[0];

# 既存セパレータの退避(オプション)と新規セパレータの設定
my $oldsep = $/;
$/ = "END";

# ファイルを開き、複数行モードで処理
open my $fh,"<",$argument;
while(<$fh>){
	
	# 空行だけの行をスキップする	
	next if /^\n$/;
	
	# 改行を[,]に変換する
	$_ =~ s/\n/,/mg;
	
	# [,END]を削除する
	$_ =~ s/\,END//mg;
	
	# ヘッダー部分の削除
	$_ =~ s/^\,{0,2}\#.+\,{2}//mg;
	
	# ハッシュへ一括変換
	my %foo = split(/[=,]/,$_);
	
	while(my($key,$val) = each %foo){
		print "[key]:$key,[val]:$val\n";

	}
}
# ファイルを閉じる
close($fh);

# 既存セパレータに戻す
$/ = $oldsep;
```

### 結果
---
当たり前のようだが以下のような結果になった。
``` コマンド結果
$ ./untitled.pl ./test.txt
"key":FILE,"val":/HOGE/TO/PATH1.txt
"key":GRP,"val":FUGA1
"key":ID,"val":HOGE1
"key":FILE,"val":/HOGE/TO/PATH2.txt
"key":GRP,"val":FUGA2
"key":ID,"val":HOGE2
"key":GRP,"val":FUGA3
"key":ID,"val":HOGE3
"key":FILE,"val":/HOGE/TO/PATH3.txt
$
```

もう少し正規表現の部分をスマートにできればもう少し綺麗なコードになるかも。。。
むしろワンライナーでいけるな、これ。。。


### 参考サイト
+ [定義済みの変数(perldoc)](http://perldoc.jp/docs/perl/perlvar.pod)
+ [実践で役立つPerl正規表現 完全解説(サンプルコードPerl入門)](http://d.hatena.ne.jp/perlcodesample/20100827/1278596435)
git: 間違えて作成したリモートリポジトリを引越ししたい

#やりたいこと

git初心者です。

あるプロジェクトにおいて新規機能を追加するため、既存のリモートリポジトリに作成中の新規アプリケーションをプッシュしたかったのですが、手違いで新規リポジトリを作ってそちらに紐づけてしまいました。

ここからなんとか元のリモートリポジトリに紐付け直そうとして、色々とハマったので恥ずかしながら備忘録メモ。

以下ではアプリケーション名を`hogehoge`

当初プッシュを予定していたリポジトリを<https://github.com/foo/yotei.git>

今回間違って作成したリポジトリを<https://github.com/foo/new.git>

としておきます。

#解決のためにやったこと

<https://github.com/foo/yotei.git>をクローンして、`yotei`フォルダにアプリケーションフォルダ`hogehoge`ごと移動してコミットし直そうとしたのですが、うまく行きませんでした。

`hogehoge`フォルダが別のリモートリポジトリに紐づいているため、gitがスルーしてしまっているのかなと予想。

現在の紐付け先を変えるだけなら

`$git remote set_url`

というコマンドがあるのですが、すでに存在するリモートリポジトリに、自分が追加で作ったアプリケーションを追加でプッシュしたかったため、この方法でできるのか確信が持てず。
色々やっているうちにさらにややこしい事態を引き起こしそうになりやむなく断念。

#結論

大げさなやり方になってしまいましたが、これにて一応解決しました。

1.  まず予定していたリモートリポジトリ`yotei.git`をクローンする（実行済み）
2.  `yotei`ディレクトリに移動
3.  `$ git remote add temp_repository "https://github.com/foo/new.git"`<br/>
　　間違えて作成したリモートリポジトリをremoteに登録<br/>
4. `git pull temp_repository master`<br/>
　　上記リポジトリ`new.git`を、引越し先のマスターにプル

5.　`git add .`
6.　`git commit -m 'hogehogeをマージ'` <br />
　　コミットする
7.  `$ git remote rm temp_repository`
　　　temp_repositoryを削除
8.  `$ git push origin master --allow-unrelated-histories`

なお8で、普通に`$ git push origin master`とやれば念願のプッシュ完了・・のはずですが、ここで落とし穴。唐突な追加のせいか`fatal: refusing to merge unrelated histories`と怒られる。オプションをつけないとプッシュができないようです。

#今後に向けて
今回のケースだと、3-4が余計に感じる・・というか、完全に余計ですね・・（笑）
わざわざローカルリポジトリで作ったアプリケーションを再びリモートから取り寄せています。

mergeとか何か別のコマンドを使えば良いのかなあ、とも思いましたが確信がもてず。スマートなやり方がないのか検討したいです。ご存知でしたら教えていただければ幸いです。

git勉強したいと思います。

#参考にしたもの
ながらく路頭に迷っていた中、ここの方のエントリーが非常に参考になりました。
（ほとんど丸まま使わせていただきました。）

<http://qiita.com/tak74/items/b0d1cc92fd172468fbf3>

また、`unrelated histories`がどういうことか、については、stackoverflowに概念図付きの解説コメントがありました。

<http://stackoverflow.com/questions/39761024/refusing-to-merge-unrelated-histories-failure-while-pulling-to-recovered-repos>

ありがとうございました。
AWS IoTをPythonで簡単に始めるまで

# はじめに
https://aws.amazon.com/jp/iot/

Amazon Web Serviceの比較的新しいサービスであるAWS IoTですが、出始めということで日々進化しています。デバイスはなくともMacとPythonを使ってAWS IoTを体験していきたいと思います。

# AWS Consoleでのセットアップ
Amazon Web ServiceのコンソールでAWS IoTを選択し、Connectのメニューから"Configuring a device"を選択します。

<img width="965" alt="スクリーンショット 2017-01-08 11.42.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/85182/8a7a9c88-16e5-c077-37c2-4f84faa2380c.png">

Platformとして"Linux/OSX"を選択し、Pythonを選択します。

<img width="833" alt="スクリーンショット 2017-01-08 11.42.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/85182/26565abd-99a9-3408-2699-985a63defdbb.png">

Thingの名前はなんでもかまいませんが、ここでは"test_thing"にしました。"show optional configuration (this can be done later)"を選択するとThingにタイプや属性を付加できます。これは、後からThingを探しやすくするものですが、まずは必要ありません。

<img width="415" alt="スクリーンショット 2017-01-08 11.45.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/85182/979e53a3-4490-0bfa-062c-d6fbfc1cebec.png">

Thingの名前だけ設定するとそれに合わせて、クライアント証明書及びポリシーが作成されます。ここで作成されたクライアント証明書を用いれば、AWS IoTの機能をPythonアプリケーションからアクセスが可能となります。

"Linux/OSX"ボタンを押すとクライアント証明書や秘密鍵などの情報がダウンロードされます。

<img width="582" alt="スクリーンショット 2017-01-08 11.45.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/85182/8ba8098f-8156-7125-5c4e-bfec0542d415.png">

# Pythonアプリケーション
ダウンロードしたzipファイルの後の処理は、以下のような形になります。

<img width="687" alt="スクリーンショット 2017-01-08 11.46.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/85182/4165d4a5-2bb4-f99a-5972-a511bd1af94f.png">

私の環境では、./start.shでPermissionエラーになりました。サンプルの中で必要なライブラリをインストールしているもようなのですが、sudoをつけて再度実行したところ成功しました。

```bash
$ cd aws-iot-device-sdk-python/
$ sudo python setup.py install
```

# トラブルシューティング
もう一度start.shを使ってサンプルアプリを実行してみました。内部では、以下のようなコマンドでクライアント証明書、ルート証明書、秘密鍵を設定して実行しています。

```bash
python aws-iot-device-sdk-python/samples/basicPubSub/basicPubSub.py -e XXXXXXXX.iot.ap-northeast-1.amazonaws.com -r root-CA.crt -c test_thing.cert.pem -k test_thing.private.key
```

しかし残念ながら以下のようなエラーが発生しました。

```bash
ssl.SSLError: [SSL: UNKNOWN_PROTOCOL] unknown protocol (_ssl.c:590)
```

OpenSSLのバージョンが古いような感じなので、バージョンを変更してみました。
http://ytooyama.hatenadiary.jp/entry/2016/06/23/004429
https://teratail.com/questions/47299
http://stackoverflow.com/questions/35473033/how-to-fix-openssl-error-with-aws-cli-iot-api

# 動作確認
もう一度start.shを実行するとPythonアプリが以下のようなログメッセージを数秒に一度sdk/test/Pythonのtopicにメッセージの送受信を行う。

```bash
2017-01-08 16:54:54,102 - AWSIoTPythonSDK.core.protocol.mqttCore - DEBUG - Try to put a publish request 178 in the TCP stack.
2017-01-08 16:54:54,102 - AWSIoTPythonSDK.core.protocol.mqttCore - DEBUG - Publish request 178 succeeded.
Received a new message: 
New Message 176
from topic: 
sdk/test/Python
--------------
```
AWS IoTのダッシュボードで確認すると、以下のようにグラフが出力される。

<img width="788" alt="スクリーンショット 2017-01-08 17.02.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/85182/51b175e4-c336-fd0f-5cb9-20eef6ea528a.png">

# おわりに
デバイスがなくてもMacとPythonアプリだけでデバイスのエミュレーションができるので非常に便利です。AWS IoTがますます便利になっていますね。
Material Themeのコメントカラーを変える


SublimeText3 で[Material Theme](http://equinsuocha.io/material-theme/#/default)を使っています。
Darkerテーマのコメントが見づらいため変えているのですが、やり方を忘れてしまうのでメモ。

環境

- MaxOS 10.12.2

## 手順

変更するテーマをコピー

```
$ cd /Users/[UserName]/Library/Application Support/Sublime Text 3/Packages/User
$ curl https://raw.githubusercontent.com/equinusocio/material-theme/develop/schemes/Material-Theme-Darker.tmTheme > My-Material-Theme-Darker.tmTheme
```

コメントの色を変更

```diff:My-Material-Theme-Darker.tmTheme
<dict>
	<key>name</key>
	<string>Comments</string>
	<key>scope</key>
	<string>comment, punctuation.definition.comment</string>
	<key>settings</key>
	<dict>
		<key>fontStyle</key>
		<string>italic</string>
		<key>foreground</key>
-		<string>#4A4A4A</string>
+		<string>#80CBC4</string>
	</dict>
</dict>
```

Preferences.sublime-settingsに作成したテーマを設定

```json:Preferences.sublime-settings
{
	"color_scheme": "Packages/User/My-Material-Theme-Darker.tmTheme",
	"theme": "Material-Theme-Darker.sublime-theme",
	"material_theme_compact_sidebar": true,
	"material_theme_small_statusbar": true,
	"material_theme_small_tab": true,
}
```
Rails Engineで簡単にインストーラを作成する方法

Rails Engine(gem)を作成していると、導入の際、利用者(本体側)で何かと作業してもらわないといけないことが生じがちです。
migrationファイルのコピー、`rake db:migrate`の実行、本体側の`routes.rb`の書き換え......これらの作業を利用者に強いるのは、Rails Engine導入のハードルを上げることになりかねません。

ですが、もしも下記のようにコマンド一発で上記の作業をRails Engine側でやってくれるとすれば、利用者は楽になると思いませんか？

```
rails g (gem名):install
```


本記事では、foremというRails Engineのやり方を参考にして、Rails Engineでのインストーラ作成方法を紹介します。

forem: https://github.com/rubysherpas/forem


## install_generatorの作成

下記のように、`Rails::Generators::Base`を継承したクラスを作成します。
置き場所はlib以下のどこでもいいと思いますが、私はforemに習い、`lib/generators`以下に配置しています。

```ruby:install_generator.rb
require "rails/generators"

module OkuribitoRails
  class InstallGenerator < Rails::Generators::Base
    class_option "with-migrate", type: :boolean

    def start
      puts "Start installing OkuribitoRails..."
      puts "*" * 80 + "\n"
    end

    def install_migrations
      puts "Copying over OkuribitoRails migrations..."
      Dir.chdir(Rails.root) do
        `rake okuribito_rails:install:migrations`
      end
    end

    def run_migrations
      return unless options["with-migrate"]
      puts "Running rake db:migrate"
      `rake db:migrate`
    end

    def mount_engine
      puts "Insert routing..."
      route("mount OkuribitoRails::Engine, :at => '/okuribito_rails'")
    end

    def finished
      puts "\n" + ("*" * 80)
      puts "Done! OkuribitoRails has been successfully installed."
    end
  end
end
```

インストーラは、メソッドを定義した順番に実行されます。(定義したメソッドを呼び出すコードを書く必要がありません！)
私が理解している範囲で、やっていることを一つ一つ解説していきたいと思います。

### インストール開始(start)

何も説明することはありません。
今からインストール開始するよ、って標準出力しているだけですね。

### migrationファイルのコピー(install_migration)

本体側のrootディレクトリに移動しつつ、`rake okuribito_rails:install:migrations`を実行しています。
こうすることで、本体側の`db/migrate`以下に、Rails Engineのmigrationファイルが配置されます。
なお、二回以上実行されたとしても、同名のmigrationファイルが既にあるので、エラーや変な挙動を起こすことはありません。

### rake db:migrateの実行(run_migrations)

オプションが与えられていない場合、ガードして即メソッドを抜けるようにしています。
オプションの定義方法ですが、下記のように書くことができます。

```ruby
class_option "with-migrate", type: :boolean
```

こう書くことで、インストーラ実行時にオプションを与えられるようになります。
オプションを与えてインストーラを実行したい場合は、下記のようなコマンドとなります。

```
rails g (gem名):install --with-migrate
```

### routes.rbの書き換え(mount_engine)

これだけでよしなにroutes.rbに、Rails Engineのマウントを差し込んでくれます。

```ruby
route("mount OkuribitoRails::Engine, :at => '/okuribito_rails'")
```

二回以上インストーラが実行されたとしても、既にルーティングが定義されているので、エラーを起こしたり、重複定義したりすることはありません。
賢いですね。こういう便利な仕組みには積極的に乗っかっていきたい。

### インストール終了(finished)

開始同様、インストールが完了した旨を標準出力しているだけですね。

## 実行結果
作成したRails Engineをbundle installし終えた状態で、以下のようにコマンドを実行してみます。

```
$ rails g okuribito_rails:install --with-migrate
Start installing OkuribitoRails...
********************************************************************************
Copying over OkuribitoRails migrations...
Running rake db:migrate
Insert routing...
       route  mount OkuribitoRails::Engine, :at => '/okuribito_rails'

********************************************************************************
Done! OkuribitoRails has been successfully installed.
```

結果は端折りますが、無事にmigrationが実行され、routes.rbも書き換えられた状態になりました。

## おわりに

今回、Railsジェネレータの使い勝手を手っ取り早く感じていただくために、ミニマムな例で紹介させていただきました。
簡単にインストーラを作成できる、ということを感じていただけたのではないでしょうか。
Windows10 64bit Python3.5 へのKivyのインストール

## 概要
Windows10 64bit Python3.5 へKivyをインストールした際のメモ．

## 環境
- Windows 10 64bit
- Anaconda 64bit
- `conda create -n py35 python=3.5`で構築されたPython環境
    - pip                       9.0.1
    - python                    3.5.2
    - setuptools                27.2.0
    - vs2015_runtime            14.0.25123
    - wheel                     0.29.0


## Kivyのコンパイル済みWheel形式パッケージをダウンロード
※`conda install kivy`, `pip install kivy`ではエラーとなってしまいインストールできなかったので...．

- Kivy-1.9.1+sdl2-cp35-cp35m-win_amd64.whl
    - http://www.lfd.uci.edu/~gohlke/pythonlibs/#kivy


## ダウンロードしたWheel形式パッケージをインストール
※%HOMEPATH%\Downloadsに保存しています．

```bat:cmd.exe
>pip install %HOMEPATH%\Downloads\Kivy-1.9.1+sdl2-cp35-cp35m-win_amd64.whl

Processing %HOMEPATH%\downloads\kivy-1.9.1+sdl2-cp35-cp35m-win_amd64.whl
Collecting Kivy-Garden>=0.1.4 (from Kivy==1.9.1+sdl2)
Requirement already satisfied: requests in c:\program files\anaconda3\envs\py35\lib\site-packages (from Kivy-Garden>=0.1.4->Kivy==1.9.1+sdl2)
Installing collected packages: Kivy-Garden, Kivy
Successfully installed Kivy-1.9.1 Kivy-Garden-0.1.4
```

## 補足
オフライン環境の場合、`Kivy`をインストールする際に自動的に`Kivy-Garden`をダウンロード＆インストールしようとして`Kivy`のインストールに失敗するため、先に手動で`Kivy-Garden`のホイール形式パッケージをダウンロード＆インストールしておく必要があるみたいです．

- Kivy_Garden-0.1.4-py2.py3-none-any.whl
    - http://www.lfd.uci.edu/~gohlke/pythonlibs/#kivy-garden
- `pip install %HOMEPATH%\Downloads\Kivy_Garden-0.1.4-py2.py3-none-any.whl`


## 動作確認
https://kivy.org/ の example を実行してみます．

```python:test.py
from kivy.app import App
from kivy.uix.button import Button

class TestApp(App):
    def build(self):
        return Button(text='Hello World')

TestApp().run()
```

`python test.py`

![2017-01-08_16h45_28.png](https://qiita-image-store.s3.amazonaws.com/0/43136/0552f975-8663-6acf-f509-054050da945a.png)
レンタルサーバーへのgit導入記録：fatal: Unable to find remote helper for 'https'の対処


## 前書き

[XREA](https://www.xrea.com/) でサーバをお借りしたが、gitが入ってなかったので、導入しました。途中いろいろと詰まったので、やったことを記録しておきます。エラーが全て解消されたわけではないのですが、とりあえず使えるようにはなりました。

## 最初にやったこと「普通にソースを入手して手動コンパイル」

**以下は失敗したコマンド。成功？したコマンドは、「原因と修正」を参照**

```
$ wget --no-check-certificate https://www.kernel.org/pub/software/scm/git/git-2.11.0.tar.gz
$ tar zxf git-2.11.0.tar.gz
$ cd git-2.11.0/
$ ./configure --prefix=$HOME/local
$ gmake
$ gmake test
$ gmake install
```

### やっていること 

1. $HOME/local/src にgitのソースを引っ張ってくる
1. 展開
1. コンパイル&インストール

最後に`git version`とかして入っていそうだったので、安心してしまいました、、

## error箇所

gitを導入した翌日に、github上においてあるvimrc等の設定ファイルをcloneしようとすると次のようなエラーメッセージが表示されました！

```
$ git clone https://github.com/USERNAME/DIRNAME.git
$ fatal: Unable to find remote helper for 'https'
$ Clone of ‘https://github.com/USERNAME/DIRNAME.git’
```

## 原因と修正

色々とググってみたところ、原因は

>どうやらcurl-develパッケージが存在しないために、curl をリンクできていないようです。

なので、curl-develを導入

```
$ wget --no-check-certificate https://curl.haxx.se/download/curl-7.52.1.tar.gz
$ tar zxf curl-7.52.1.tar.gz
$ cd curl-7.52.1
$ ./configure --prefix=$HOME/local
$ gmake
$ gmake install
```

こっからgitをもう一回コンパイルし直しました！

```
$ cd $HOME/local/src/git-2.11.0/
$ ./configure --prefix=$HOME/local --with-curl
$ gmake
$ gmake test
$ gmake install
```

## 未解決の問題

これで、大丈夫かと思ったのですが、今度はこういうエラーが出るようになりました、、。

```
$ unable to get local issuer certificate
```

調べてみると原因はSSL証明書が古いせいっぽいのですが、よく分かりませんでした。ともかく、ca-bundle.crtに新しい証明書を追加すれば良さそう。ということで、ca-bundle.crtを探していたのですが、どこにも見つからなかった( ；∀；)

## 暫定的対処

仕方なく、今回は以下の暫定的対処でしのいでおります。

```
$ git config --global http.sslVerify false
```

ちなみに、お察しの通り、`wget` するときも当然エラーになるので、こちらは `--no-check-certificate` オプションで逃げています。さっさと解決して、この気持ち悪い状態を抜けたい、、

## 疑問

gitを導入するだけで、だいぶ大変だったのですが、途中で色んな疑問がわいたので、ここにメモして後から調べていこうと思います。

* `./configure` とか `gmake` とか、何となくは分かるけど、何をしているのかをしっかり理解したい
* `make` と `gmake` ってどう違うんだ？[^1]
* curl-develの導入って、要はcurlをlocalにインストールしてるだけなんだけど、それだったら最初から `--with-curl` オプションを付けてビルドしてればよかった？
* 普通って、どういうところにインストールするんだろ？ずっと `sudo apt` とかでやってきたから意識したことが無かった、、

たくさん勉強すべきことがありますね。にゃ～ん

## 参考資料

* gitの導入
    * http://wiki.exatto.org/index.php?Prog%2FGit%2FSetupXrea#c26b390e
    * http://dqn.sakusakutto.jp/2013/06/git_fatal_unable_to_find_remote_helper_for_https.html
    * http://www.linux-tech.info/%E3%83%84%E3%83%BC%E3%83%AB/entry-57.html
    
* CA証明書について
    * http://qiita.com/shimacpyon/items/1af6d1ed69f6ad54c73c
    * http://tetsuyai.hatenablog.com/entry/20110924/1316877887
    * http://d.hatena.ne.jp/kanonji/20111208/1323323155
    
## 更新記録

1. 1月8日　記事の投稿＆細部の修正
1. 1月8日　markdown修正
1. 1月9日　markdown修正

## 注釈

[^1]: [このページ](http://x68000.q-e-d.net/~68user/unix/pickup?gmake) を読んで大体のところは分かりました。が、serverはlinux系のはずなんだけど、どうして `gmake` が使えたんや？？まさか、linux系ではない？？？
eclipseのNEON以降でtomcatを設定する方法

どうやらeclipseNEONからTomcatの設定方法が変わっているようです。

<img width="439" alt="スクリーンショット 2017-01-08 15.55.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/98758/3a05ac52-aa3c-ead8-7e96-25136afb707d.png">

eclipseを立ち上げて「ヘルプ」を押す


<img width="483" alt="スクリーンショット 2017-01-08 15.56.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/98758/99116840-0c2f-c445-f0a4-eb2ae401b730.png">

eclipseマーケットプレイスを選択

<img width="555" alt="スクリーンショット 2017-01-08 15.58.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/98758/6fbb0e6f-58fb-80ca-19d1-8d738e2b6b9c.png">

tomcatを検索して「Eclipse Tomcat Plugin」を検索し、インストールボタンを押下



<img width="345" alt="スクリーンショット 2017-01-08 15.59.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/98758/34885ffc-e609-7977-fe9d-508a35020475.png">


シャキーン☆
文字列リテラル中に意図せずトライグラフが登場した場合の対処

Cプログラム中で文字列リテラル`"????-??-??"`を使いたくなったが、これを普通にコンパイルするとトライグラフと解釈されてしまう（なんと「`??-`」が一文字の扱いなのだ）。gcc限定のコードであればデフォルトでトライグラフ無効になっているので問題にはならないが、ポータビリティを考えるとあまり良くない。

解決策はWikipediaの「[Digraphs and trigraphs](https://en.wikipedia.org/wiki/Digraphs_and_trigraphs#C)」にも書いてある通り、次の2通りしかない。

```c
"???\?-?\?-??"
```

```c
"????""-??""-??"
```

読みやすい方でどうぞ。

# 参考URL

- [Trigraph - みねこあ](http://d.hatena.ne.jp/minekoa/20071130/1196436534)
- [ANSI C Trigraph - TAKESAKOのはてな出張所](http://d.hatena.ne.jp/TAKESAKO/20091013/1255413868)
- [trigraph - おろログ](http://d.hatena.ne.jp/ororog/20140608/1402232925)
teratermマクロで文字コードを指定する


callmenuで指定する（teratermのマニュアルにも記載がある）。
callmenuを使う前提として、teratermインストール時に **TTX Kanji Menu** を入れておく必要がある。

```
;callmenu 54010  ; [KanjiCode] Recv: Shift_JIS
;callmenu 54110  ; [KanjiCode] Send: Shift_JIS
;callmenu 54011  ; [KanjiCode] Recv: EUC-JP
;callmenu 54111  ; [KanjiCode] Send: EUC-JP
;callmenu 54012  ; [KanjiCode] Recv: JIS
;callmenu 54112  ; [KanjiCode] Send: JIS
callmenu 54013  ; [KanjiCode] Recv: UTF-8
callmenu 54113  ; [KanjiCode] Send: UTF-8
;callmenu 54014  ; [KanjiCode] Recv: UTF-8m
```
Xcodeの旧バージョンをインストールする方法

#はじめに
Xcodeを使用して開発をしていると、最近Swift3が出たこともあり、
過去のバージョンのXcodeを使用しなければならないという場面も少なくないと思います。

そこで、Xcode8.2.1をすでにmacにインストールしてある状態で、
Xcode7系を追加でインストールする方法を自分用のメモとしての意味も込めて記していきます。

#.dmgファイルをダウンロードする
Xcodeの旧バージョンをインストールする為に、まずは.dmgファイルをダウンロードする必要があります。
.dmgファイルは、以下のURLのページからダウンロードすることが可能です。

[https://developer.apple.com/download/more/](https://developer.apple.com/download/more/)

上記のURLのサイトを開き、以下の手順を実施します。
①ダウンロードしたいバージョンのXcodeを探して選択
②開いたプルダウンの中の「・・・.dmg」をクリックするとダウンロードが開始されます。

<img width="1199" alt="pastXcode02.png" src="https://qiita-image-store.s3.amazonaws.com/0/135729/3a2d25ba-3ddc-e6d0-109c-d1f586a45afb.png">

<img width="311" alt="pastXcode03.png" src="https://qiita-image-store.s3.amazonaws.com/0/135729/76d67d70-809d-68f4-260c-d8e0298d1907.png">

#.dmgファイルを実行する
.dmgファイルのダウンロードが完了したら、[Finder]>[ダウンロード]>[ダウンロードしたファイル]を選択してください。

<img width="766" alt="pastXcode04.png" src="https://qiita-image-store.s3.amazonaws.com/0/135729/8cebff6c-2d1b-2e3b-801e-e48065e26b70.png">

ファイルを選択すると、以下の画面が開きます。

<img width="609" alt="pastXcode05.png" src="https://qiita-image-store.s3.amazonaws.com/0/135729/cc2a3335-1cf7-cd81-5a14-43eda630a05d.png">

XcodeのアイコンをApplicationsアイコンへドラッグ&ドロップすると、インストールが開始されます。

この時すでにXcodeがPC内にインストールされているので、以下のようなポップアップが表示されます。
[両方とも残す]を選択してください。

<img width="397" alt="pastXcode06.png" src="https://qiita-image-store.s3.amazonaws.com/0/135729/556e123d-8959-2014-2ce7-26b96d530be0.png">

この動作が終了すると、以下のように『Xcode2』という名前で今回インストールしたバージョンのXcodeが保存されています。

<img width="770" alt="pastXcode08.png" src="https://qiita-image-store.s3.amazonaws.com/0/135729/1fbc49b4-1384-33cf-fc01-16d934ab0a5a.png">

実際に旧バージョンを使用する際は、以下のどちらでも使用可能です。
①既に作成されているプロジェクトファイルを選択し、[このアプリケーションで開く]で指定してファイルを開く方法
②アプリケーションフォルダやDocから直接選択してXcodeを開く方法

これで旧バージョンと最新バージョンのXcodeを併存させられました！！
Form,WPF->UWPで進歩するComboBox

####進歩するComboBox
WPFでComboBoxに選択した情報を表示する場合には、下記のように、ComboBoxの.Textに、stringを設定する必要があった。
<ComboBox x:Name="DevelopSelector">
 <RadioButton Content="Console" Checked="OnCheck"/>
 <RadioButton Content="WindowsForm" Checked="OnCheck"/>
 <RadioButton Content="WPF" Checked="OnCheck"/>
 <RadioButton Content="UWP" Checked="OnCheck"/>
</ComboBox>

private void OnCheck(object sender, RoutedEventArgs e) {
	RadioButton radiobutton = sender as RadioButton;
	DevelopSelector.SelectedItem = radiobutton;
	DevelopSelector.Text = radiobutton.Content.ToString();
}

SelectedItemで選択しても、自動的にその結果をComboBoxに表示してはくれなかったのだ。

####UWP
ところが、UWPでは、.Textがなくなっている。なくなっていてどう表示するのかと思ったら、
	DevelopSelector.SelectedItem = radiobutton;
とSelectedItemにItemを設定するだけでよくなったのだ。
これはちょっと楽。微妙に得した気分。
[AWS] Route53でAレコードのエイリアスを設定して、いくら待っても反映されなかった状態からの脱出

## 前提
Route53 + Cloudfront + ELB（Classic） + EC2（Rails） のネットワーク構成

## 現象
Cloundfrontで発行されるエンドポイントで疎通できるところまではできているのに
Route53で取得したドメインをAレコードのエイリアスで設定していくら待っても反映されないという現象に遭遇。
何もしても反映されず半日くらいもがいてました。

## 解決方法
どうやら以下を試したことが解決につながったようです。
それもしばらくは反映されず、諦めてその日は寝たんですが、翌日になって名前解決できるようになっていました。

http://stackoverflow.com/questions/27507899/amazon-route-53-alias-not-working

> 1. Click on "Hosted Zones"
2. Select your domain (example.com)
3. Select the "Record Set" with type NS
4. Copy each line item / name server from the value box
5. Now click on "Registered Domains"
6. Select your domain
7. Past each entry in the upper right hand corner

さらに簡単にまとめると

１. ここのValueのところをコピー

![nsrecord.png](https://qiita-image-store.s3.amazonaws.com/0/52847/83aaf732-ac17-8168-7e5a-a1aaeeabc795.png)

２. コピーしたNSのドメインを Name Serversに追加

![aws_route53_02.png](https://qiita-image-store.s3.amazonaws.com/0/52847/9897f16e-0338-7353-c3ab-b4efffbddffb.png)


※ 自分の場合はなぜか7個までしか設定できなかったので、やむを得ず既存のネームサーバードメインを1つ消しました。（どこからも復旧できなそうだったので念のため手元には控えてますが）

ちなみに試してだめだった事を覚えてる範囲で書き留めておきます・・・
 * Aレコードでのエイリアスはあきらめて、CNAMEにした
 * hosted zoneを作り直す
 * Cloudfrontのキャッシュクリア
 * Cloudfrontのディストリビューションを作り直す
 * S3バケットにAレコード・CNAMEで設定
 * 解決した上記の操作の逆にあたる、Registerd DomeinのName ServersをNSレコードとSOAレコードのValueに設定しなおす（そのときTTLは0にしていたと思います）
js バイナリからテキストへの変換

##お題
binaryデータをアルファベットへ変換する。

```js
function binaryConverter(str) {
//write your code.
}

binaryConverter("1001000 1100101 1101100 1101100 1101111 100000 1010111 1101111 1110010 1101100 1100100 100001");
//Hello World!
```

##使ったもの
split()
push()
fromCharCode()
[parseInt()](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/parseInt)
join()

##考え方
・split()で引数のバイナリをスペース部分で切り分ける。
・変換後の文字列を入れる配列を用意する。
・for文で先頭からparseInt(第二引数に2を設定)で10進数に変換する。その数値をfromCharCode()でアルファベットに変換する。
・用意した配列にpushした文字をjoin()して返しておわり。

##コード

```js
function binaryConverter(str) {
  biString = str.split(' ');
  uniString = [];

   for(i=0;i < biString.length;i++){
   uniString.push(String.fromCharCode(parseInt(biString[i], 2)));
  }
  return uniString.join('');
}

binaryConverter("1001000 1100101 1101100 1101100 1101111 100000 1010111 1101111 1110010 1101100 1100100 100001");
```

##短くしたコード

```js
function binaryConverter(str) {
  return String.fromCharCode(...str.split(" ").map(function(char){ return parseInt(char, 2); }));
}
```

###他にもコードが浮かんだ方、コメントお待ちしております。
Macでeclipseのpluginsフォルダがどこにあるかわからなくてはまった。(メモ)

windowsでは触ったことあったのだが、Macではじめてeclipseのインストールをする機会に恵まれてハマったのでメモとして投稿

eclipseのJava EE あたりをインストールすると、多くの人が日本語かパッチやらTomcatやらをpluginsフォルダに打ち込む必要があると思うのですが、その場所です。

私は、ユーザーフォルダの中のeclipseフォルダを見てpluginsフォルダがなくてもう一度インストールし直しましたw
これはワークスペース用のフォルダのためpluginsフォルダはありません。(インストールしたてのためわからなかった）

正解のたどり着き方は、
アプリのアイコンを右クリック
「パッケージの内容を表示」
を押すと連れて行ってくれる。

簡単なことだけど、時間を使ってしまったので、メモメモ
CakePHPのACLで嵌った

![image](https://qiita-image-store.s3.amazonaws.com/0/158639/dfd355ff-4634-166f-0103-bd73818f30df.png)

こういうやつ。ここでのErrorの文字はErrorコントローラに対してデータがおかしいよという意味なので例として良くないが（紛らわしい）。

acl関連のテーブルにデータが入っていないのが原因。
以下で直った。

```bash
# bin/cake acl create aco <コントローラ名> <メソッド名>
$ bin/cake acl create aco Error beforeRender
```
※画像にはないが、エラー文言の下にbeforeRenderのチェックボックスがある。

コントローラとメソッドは沢山あって大変だが、以下のコマンドで一括でデータを作成できる。

```bash
$ bin/cake acl_extras aco_sync
```
このコマンドを使っても漏れがあった場合は最初のコマンドで追加。

嵌りすぎ
プログラミング

#コンピュータに対して、してほしいことを伝えること。
こちらが使う言語が**"プログラミング言語"**であり、コンピュータが解する言語が**"マシン語"**である。
その間を取り持つ翻訳者が、**"コンパイラ"**、**"アセンブラ"**である。
普段我々が使う言語により近いものは、**"高水準言語"**と言われ、こちらのしたいことを簡単に（コンピュータのことをあまり考えずに）表記することができる。ただ欠点もあり、マシン語からはかなり遠い。なので翻訳を通すと、マシン語の表記量は膨大なものとなり、コンピュータの負担は増す。その逆も然りで、コンピュータの負担を減らそうとすれば、我々の負担が増えるのだ。現在は、コンピュータの高性能化が進み、コンピュータの負担もあまり考えなくて良くなってきているので、人間に優しい時代になってきていると言える。プログラミングの裾野も広がっているだろう。
#プログラミングのためには何を学ぶべきなのか。
##まず、プログラミング言語を学ぶことが必要なのはわかる。
これを知らなければコンピュータに意思を伝えることができない。この時、より人間の感覚に近い、高水準な言語から始めるのが楽だろう。現実の社会でも起きているが、翻訳者が優秀になり、意識しなくなれば、外国語（コンピュータの場合はマシン語）を習得しなくても問題はない。
##他者との共同作業の場合は話が違ってくる。
プログラミング言語はコンピュータとのやりとり以外にも、人間とのやりとりにも使われるのだ。その時、皆が使っている言語を知らなければ協力はできないし、**流行りの言語**を勉強しなければならないかもしれない。もしくは**昔広く使われていた言語**を習得しなければならないかも。
##コンピュータに何かしてほしい時に、コンピュータができることとできないことを知っておくのも重要だ。##
空を飛べといってもコンピュータは飛べない（飛べるコンピュータもあるかもしれない）。その時にコンピュータのできることを知っているとより自由にコンピュータを操作できる。コンピュータの構成や設計、OSなどの仕組みを知っていると良いだろう。
##データ構造とアルゴリズム##
コンピュータに対するイディオムのようなもの。コンピュータの考え方に即したもの。だが、実際に人が考える時にも同じようにできるのかもしれない。未だ僕はこれをうまく捉えられていないのかもしれない。
Raspberry PiでLピカ

Raspberry PiでLピカさせるための順序


## 準備するもの
 - Raspberry Pi2 Model B
 - microUSBケーブル
 - [USBシリアル変換ケーブル](https://www.amazon.co.jp/GAOHOU-ESA854-Raspberry-%E3%83%A9%E3%82%BA%E3%83%99%E3%83%AA%E3%83%BC%E3%83%91%E3%82%A4%E7%94%A8%E3%81%AE-USB%EF%BC%8DTTL%E3%82%B7%E3%83%AA%E3%82%A2%E3%83%AB%E3%82%B3%E3%83%B3%E3%82%BD%E3%83%BC%E3%83%AB%E3%81%AEUSB%E5%A4%89%E6%8F%9BCOM%E3%82%B1%E3%83%BC%E3%83%96%E3%83%AB%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB%E3%81%AE%E3%82%B1%E3%83%BC%E3%83%96%E3%83%AB/dp/B00K7YYFNM)
 - LED 1つ
 - ブレッドボード
 - ジャンパーワイヤー(オス-メス 2本)
 - 抵抗 330Ω

- - -

## Raspberry PiのGPIOのピン配置
![GPIO.jpg](https://qiita-image-store.s3.amazonaws.com/0/129517/f4f5ee99-a245-aa7a-5705-2ab063b2884b.jpeg)

今回使うのは32ピンのGPIO12と39ピンのGNDのみ

- - -

## 回路の作成

![sakura_ブレッドボード.jpg](https://qiita-image-store.s3.amazonaws.com/0/129517/420be803-9ea8-a973-9d45-e6da3d5eda09.jpeg)

- - -

## PCとRaspberry Piを接続

![2014-10-05_08_36_25.jpg](https://qiita-image-store.s3.amazonaws.com/0/129517/4b93549b-2556-eb66-37cd-c725546f0687.jpeg)

上記の画像のようにシリアルUSBケーブルとRaspberry Piを接続する

- - -

| シリアルUSBケーブル | Raspberry Pi  |
|:----------------:|:--------------:|
| 黒 : GND          |6番 : GND      |
| 白 : UART_RXD     |8番 : UART_TXD |
| 緑 : UART_TXD     |10番 : UART_RXD  |
| 赤 : 電源          |未接続         |

- - -

PCとRaspberry Piをお互い挿せたらターミナル画面で操作

```
$ sudo apt-get install screen
$ sudo screen /dev/ttyUSB0 115200
[sudo] password for name:[password]

---

Raspbian GNU/Linux 8 raspberrypi ttyAMA0

raspberrypi login: pi
Password: [password]

Last login: Thu Aug 25 13:18:26 JST 2016 on ttyAMA0
Linux raspberrypi 4.1.19-v7+ #858 SMP Tue Mar 15 15:56:00 GMT 2016 armv7l

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
pi@raspberrypi:~$

```

- - -

初期のRaspberry Piは

- ID pi
- password raspberry

出来るだけ最初に変更する

/dev/ttyUSBの数字を確認するには`ls -l /dev/ttyUSB*`を使用すれば現在使用してるUSBが出力されるので必要に応じてコマンドの変更をする

- - -

## Lピカのためのプログラム

- 点灯させる場合

```python:/home/pi/lpika.py
1 import RPi.GPIO as GPIO   # pythonで使用するGPIOのライブラリのインポート
2
3 GPIO.setmode(GPIO.BCM)    # ピンをGPIOで指定する宣言
4 GPIO.setup(12, GPIO.OUT)    # 出力するピンをGPIO12に指定
5
6 GPIO.output(12, GPIO.HIGH)   # GPIO12の出力を上げる(LEDを点灯させる場合)

```

- - -

- 消灯させる場合

```python:/home/pi/lpika.py
1 import RPi.GPIO as GPIO   # pythonで使用するGPIOのライブラリのインポート
2
3 GPIO.setmode(GPIO.BCM)    # ピンをGPIOで指定する宣言
4 GPIO.setup(12, GPIO.OUT)    # 出力するピンをGPIO12に指定
5 
6 GPIO.output(12, GPIO.LOW)    # GPIO12の出力を下げる(LEDを消灯させる場合)

```

- - -

出力するピンを指定する方法がGPIOとピン番号の2通りがある
GPIOで指定する場合
` GPIO.setmode(GPIO.BCM) `
ピン番号で指定する場合
` GPIO.setmode(GPIO.BOARD) `


- 点灯 → ピンの出力を上げる(HIGH)
- 消灯 → ピンの出力を下げる(LOW)

- - -

##実行
```
$ sudo python lpika.py
```
[Bitcoin]トランザクションIDを送ると確認数を返すLINE BOT

#概要
<img width="1000" alt="スクリーンショット 2017-01-08 11.10.47.png" src="http://i.imgur.com/67j7RYd.png">

ユーザーから送られてきたトランザクションIDをもとにbitFlyerの[chainFlyer API](https://chainflyer.bitflyer.jp/API/docs?lang=ja)を使ってトランザクション情報→確認数を取得、返信
#コード
```callback.rb
require 'sinatra'
require 'line/bot'
require 'json'
require 'open-uri'

def client
  @client ||= Line::Bot::Client.new { |config|
    config.channel_secret = ENV["LINE_CHANNEL_SECRET"]
    config.channel_token = ENV["LINE_CHANNEL_TOKEN"]
  }
end

post '/callback' do
  body = request.body.read
  signature = request.env['HTTP_X_LINE_SIGNATURE']
  unless client.validate_signature(body, signature)
    error 400 do 'Bad Request' end
  end
  events = client.parse_events_from(body)
  events.each { |event|
    case event
    when Line::Bot::Event::Message
      case event.type
      when Line::Bot::Event::MessageType::Text
        begin
          #ユーザーから送られてきたメッセージ
          events_message_text = JSON.parse(body)["events"][0]["message"]["text"]
          #送られてきたメッセージ=トランザクションIDをエンドポイントURLに結合し、トランザクションの情報を取得
          transaction_info = open("https://chainflyer.bitflyer.jp/v1/tx/"+events_message_text).read
          #確認数
          confirmed = JSON.parse(transaction_info)["confirmed"]
          message = {type:'text',text:confirmed}
        rescue
          #送られてきたメッセージがトランザクションIDでではない場合の処理
          message = {type:'text',text:"トランザクションが見つかりません"}
        end
        client.reply_message(event['replyToken'], message)
      end
    end
  }

  "OK"
end
```
【VBA】指定した範囲（セル上）にオブジェクトの作成


Excelでツールを作るときなど、ボタンとかテキストボックスが必要になることがあります。
数が少なければ手作業でやればいいですが、数が多い時はとても面倒…。

ちょっと、指定した範囲（セル上）にオブジェクトを貼る作業をVBAで自動化できないか。。。
いろいろと試してみたので、下記にまとめようと思います。


--

選択した範囲に、オブジェクト（ボタン）を貼り付けたい！！

![あいうえお.png](https://qiita-image-store.s3.amazonaws.com/0/33479/8e47ceae-9b78-be9c-a4d3-d07c1787db7a.png "あいうえお.png")


VBAで実現できました！！

````コマンド
Sub test()

    With ActiveSheet.Range("B2:F6")
         ActiveSheet.OLEObjects.Add ClassType:="Forms.CommandButton.1", Link:=False, DisplayAsIcon:=False, Left:=.Left, Top:=.Top, Width:=.Width, Height:=.Height
    End With

End Sub
````


![あいうえお.png](https://qiita-image-store.s3.amazonaws.com/0/33479/60c63b34-41c1-8e90-77e4-eb37609c45a2.png "あいうえお.png")
ＦｉｚｚＢｕｚｚ（糞コード）

```c#:Test.cs
using System;

name space FizzBuzz
{
class Program
{
static void Main(string[]args)
{
 for(int i=1; i<=100; i++)
{
  if(i%3==0 && i%5==0)
{
 Console.WriteLine("FizzBuzz");
}
else if(i%3==0)
{
Console.WriteLine("Fizz");
}
else if(i%5==0)
{
Console.WriteLine("Buzz");
}
else{
Console.WriteLine("{0}",i);
}
}
}
}
# WindowsでVagrant、VirtualBox、CnetOS


# インストール

## Vagrant

[HashiCorp Vagrant](https://www.vagrantup.com/)

## VirtualBox

[Oracle VirtualBox](https://www.virtualbox.org/)

## Box

[HashiCorp Atlas / Discover Vagrant Boxes](https://atlas.hashicorp.com/boxes/search)

[ユーザー登録を忘れずに！！](https://vagrantcloud.com/account/new)

# セットアップ

## 導入！

Proxy回避は何とか頑張る。。。

Vagrant Cloudにログイン

```Prompt
> vagrant login
もしくは、
> vagrant login --tokey ABCD1234
```

```Prompt
 > vagrant box add "bento/centos-6.7"
 
 > vagrant box list
bento/centos-6.7 (virtualbox, 2.2.7)
```

```Prompt
> cd C:\box
> mkdir centos6
> cd centos6
> vagrant init centos6
```

vagrantfileができるので、以下の内容のファイルにする。

```vagrantfile
Vagrant.configure(2) do |config|
  config.vm.define "controller" do |node|
        node.vm.box = "bento/centos-6.7"
        node.vm.hostname = "controller"
        node.vm.network :private_network, ip: "192.168.100.10"
        node.vm.network :forwarded_port, id: "ssh", guest: 22, host: 2210
  end
  config.vm.define "target" do |node|
        node.vm.box = "bento/centos-6.7"
        node.vm.hostname = "target"
        node.vm.network :private_network, ip: "192.168.100.20"
        node.vm.network :forwarded_port, id: "ssh", guest: 22, host: 2220
  end
end
```

## さぁ起動だ！

エラー出ちゃった。。。

```Prompt
> vagrant up
Bringing machine 'controller' up with 'virtualbox' provider...
Bringing machine 'target' up with 'virtualbox' provider...
==> controller: Importing base box 'bento/centos-6.7'...
==> controller: Matching MAC address for NAT networking...
==> controller: Checking if box 'bento/centos-6.7' is up to date...
==> controller: Setting the name of the VM: centos6_controller_1483845981881_27956
==> controller: Clearing any previously set network interfaces...
==> controller: Preparing network interfaces based on configuration...
    controller: Adapter 1: nat
    controller: Adapter 2: hostonly
==> controller: Forwarding ports...
    controller: 22 (guest) => 2210 (host) (adapter 1)
==> controller: Booting VM...
There was an error while executing `VBoxManage`, a CLI used by Vagrant
for controlling VirtualBox. The command and stderr is shown below.

Command: ["startvm", "2ac1cc30-9ae2-442b-973b-7bfac6de0840", "--type", "headless"]

Stderr: VBoxManage.exe: error: Failed to open/create the internal network 'HostInterfaceNetworking-VirtualBox Host-Only
Ethernet Adapter #3' (VERR_INTNET_FLT_IF_NOT_FOUND).
VBoxManage.exe: error: Failed to attach the network LUN (VERR_INTNET_FLT_IF_NOT_FOUND)
VBoxManage.exe: error: Details: code E_FAIL (0x80004005), component ConsoleWrap, interface IConsole
```
RMagickを使ってGIF生成


# ビジュアライズしたい。
[ライフゲーム](http://qiita.com/kumatoki/items/630eafb05209629412ac)
これをアニメーションするのにターミナルを使い、
それをttyrecで録画。ttygifでgif生成したのだけど、
イマイチかくかく。
ビジュアライズに限れば適当なplotを使えば良いのだろうけど、
gifも欲しい。ttygifの中身はImageMagickなわけだから、
直接使ってしまおうと。

# RMagick
ImageMagickのRuby binding

# 追記 new_imageを使おう
自前でtempfile使うより簡潔です。
new_imageしていくだけでGIFのワンフレーム追加できます。

```ruby
def make_gif(name = "", x = 0, y = 0, fps = 0, &d)
  m = Magick::ImageList.new
  (0..fps).each { |n|
    m.new_image(x,y)
    d.call(m,n)
  }

  m.write(name)
end
```

## make_gif
一時ファイルにワンフレームごと書き出し、
最後にそれらをひとつのGIFにまとめる。
非効率臭い。

```ruby:rmagick_make_gif
require "RMagick"
require "tempfile"

def make_gif(name = "", x = 0, y = 0, fps = 0, &d)
  tfs = (0..fps).map { |n|
    mi = Magick::Image.new(x,y)

    d.call(mi,n)
    tf = Tempfile.new(["draw_gif",".gif"])
    mi.write(tf.path)
    tf
  }

  Magick::ImageList.new(*tfs.map(&:path)).tap { |mil|
    mil.iterations = 10
    mil.write(name)
    tfs.each(&:close)
  }
end
```

## lifegame.rb

```ruby
require "./lifegame.rb"
require "./rmagick_make_gif.rb"

lg = Lifegame.new(300,300)
lg.random { (rand(2) + rand(2) + rand(2)) / 3 }

make_gif("lifegame.gif",300,300,100) { |m,n|
  lg.cells.each_with_index { |cy,iy|
    cy.each_with_index { |cx,ix|
      m.pixel_color(ix,iy,"black") if cx == 1
    }
  }
  lg.apply
}
```

![lifegame.gif](https://qiita-image-store.s3.amazonaws.com/0/154291/70586627-bcc8-c17d-87bb-9ca6dd8792eb.gif)

## cells
[一次元セルオートマトン](http://qiita.com/kumatoki/items/76f9c521d87a04a519d0)もついでに。
ルール９０です。

```ruby
require "./cells.rb"
require "./rmagick_make_gif.rb"

cs = Cells.new
bs = []
make_gif("cells.gif", 200,100,100) { |m,n|
  y = 0
  bs.push(cs.dup)
  bs.each { |cy|
    x = 0
    cy.cells.each { |cx|
      m.pixel_color(x,y,"black") if cx == 1
      x += 1
    }
    y += 1
  }
  cs.apply 90
}
```

![cells.gif](https://qiita-image-store.s3.amazonaws.com/0/154291/caf79dcb-c06e-e5cb-ca99-7dbcc54eb1f0.gif)

# end
ターミナルのテキスト表現のボリュームとは桁違いに多く出力できるので、
この例の場合はこちらを使う方が良いですね。
C#でSOAP呼び出しを行う

#始めに
C#でSOAP通信を行い、サーバーから取得した値をコンソールに出力するアプリケーションを作ってみます

#実装するモジュールの概略
##クライアント
Webサーバーから取得した値をコンソールに出力する単純なアプリケーションをC#で作ってみます
##Webアプリケーション
アプリケーションサーバーにGlassFish、アプリケーションはJava1.8で作成します
また、GlassFishにDB接続用のデータソース設定を行います
##DBサーバー
Oracle12cを使っています

#実装するモジュールの詳細について
##サーバーアプリの実装
```SimpleWeb.java
package simple;

import javax.jws.WebMethod;
import javax.jws.WebService;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;

import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.ArrayListHandler;
@WebService
public class SimpleWeb {
	   
	  @WebMethod
	  public String sayHello(String name) throws Exception{
          return _sayHello(name);
	  }
	  
	  private String _sayHello(String name)throws Exception{
		  try{
			  Context ctx = new InitialContext();
	          DataSource ds = (DataSource)ctx.lookup("jdbc/oracle12c");

	          return ((new QueryRunner())
	          .query(ds.getConnection(), //コネクションの取得
	          		"select EMP_ID,EMP_NAME from EMP",                 //実行するSQL  zzzz
	          		new ArrayListHandler())
	          .stream()
	          .filter(array->array[0].equals("001"))
	          .map(array -> String.format("従業員ID:%s:従業員名：%s",array[0],array[1]))
	          .collect(StringBuilder::new, StringBuilder::append, StringBuilder::append)
	          .toString());
		  }catch(Exception e){
			  e.printStackTrace();
			  return name;
		  }
		  
	  }
}
```
##クライアント(C#)のサービス参照の追加方法について
１．VisualStudioのソリューションエクスプローラーから「Service Reference」を選択し、「サービス参照の追加」を選択する
![image](https://qiita-image-store.s3.amazonaws.com/0/136860/d96bc934-d4fb-6667-37f0-323a6634b33f.png)

２．「アドレス」に参照先のURLを指定し、移動ボタンを押す
![image](https://qiita-image-store.s3.amazonaws.com/0/136860/28ad8424-8e86-2ef7-0a2d-a3be6550aa95.png)

３．「サービス」の欄に目的のWebサービスが表示されていることを確認する。
サービス名を変更したい場合は「名前空間」の値を変更する、
![image](https://qiita-image-store.s3.amazonaws.com/0/136860/13d7f8a0-4c1b-38be-956f-65b96aedeb88.png)


##クライアントの実装
```ConsoleApplication4.cs
using System;

namespace ConsoleApplication4
{
    class Program
    {
        static void Main(string[] args)
        {
            MyWebService.SimpleWebClient client = new MyWebService.SimpleWebClient();
            Console.WriteLine(client.sayHello("test"));

        }
    }
}
```
##Webアプリケーションから参照されるテーブル
![image](https://qiita-image-store.s3.amazonaws.com/0/136860/d7a89350-858c-3a4c-d8bb-d26b10cdf5c3.png)


##クライアントからサーバーアプリを呼び出した実行結果
![image](https://qiita-image-store.s3.amazonaws.com/0/136860/7408d6db-9212-beaf-4bde-8fb550553f98.png)
分析環境について考える（その４：postgreSQL+Pgadmin4のインストール）

# 前置き
- [ 分析環境について考える（その３：pyenv＋Anaconda[Python、R]＋jupyter＋Rstudioのインストール）](http://qiita.com/9en/items/981a4bed401065c63168) の続き
- VirtualBox環境でvagrantを利用してインストールを前提に記載

# 分析環境構築の流れ
- 以下流れで仮想環境を構築していく

| No. | 内容 |
|:---------:|:---------|
| 1 | [全体像](http://qiita.com/9en/items/28e178c919bf38fcbc4f) |
| 2 | [VirtualBox＋vagrantで仮想環境を構築](http://qiita.com/9en/items/82e52ca87a0eaa2aa270) |
| 3 | [pyenv＋Anaconda[Python、R]＋jupyter＋Rstudioのインストール](http://qiita.com/9en/items/981a4bed401065c63168) |
| 4 | [postgreSQL+Pgadmin4のインストール](http://qiita.com/9en/items/43d2306f7e7e968b72c4) |


# 環境
- ホストOS：Windows7(64bit)
- ゲストOS：Ubuntu14.04(64bit)

# ソフトウェアをインストールする
## 対象ソフトウェア
- PostgreSQL9.6
- Pgadmin4

## インストール方法
- Vagrantでプロビジョニングする

## プロビジョニングスクリプト
### PostgreSQLとPgadmin4をインストール
- wgetで最新版のPostgreSQLをダウンロード
- ロールは特に作成せず、postgresユーザにパスワードを付与する
- クライアントは、Pgadmin4を利用してブラウザ上で操作する
- データベースをマシン起動時に立ち上がるように「/etc/rc.local」に書き込む
※コードはprovision_libs.shに記載

```bash:provision_libs.sh
#!/bin/bash

# ==============================
# postgreSQL9.6のインストール
# ==============================
sudo add-apt-repository "deb http://apt.postgresql.org/pub/repos/apt/ trusty-pgdg main"
wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
sudo apt-get update
sudo apt-get install -y postgresql-9.6

# postgresユーザにパスワードを付与する
sudo su - postgres -c "psql -c \"alter role postgres with password 'postgres'\""

# リモート接続設定
sudo echo "listen_addresses='*'" >> /etc/postgresql/9.6/main/postgresql.conf

# ==============================
# Pgadmin4インストール
# ==============================

# パッケージインストール
conda install -y psycopg2
# pip upgrade
pip install --upgrade pip

# Pgadmin4インポート
wget https://ftp.postgresql.org/pub/pgadmin3/pgadmin4/v1.1/pip/pgadmin4-1.1-py3-none-any.whl
pip install pgadmin4-1.1-py3-none-any.whl
rm pgadmin4-1.1-py3-none-any.whl

# ファイルの編集
sed -i -e "s/DEFAULT_SERVER = 'localhost'/DEFAULT_SERVER = '0.0.0.0'/g" ./.pyenv/versions/anaconda3-4.2.0/lib/python3.5/site-packages/pgadmin4/config.py

```

## 初回起動時の設定
- Pgadmin4の初回起動時には、以下コマンドを実行して「Email address」と「Password」を入力する

```bash:Ubuntu
$ python /home/vagrant/.pyenv/versions/anaconda3-4.2.0/lib/python3.5/site-packages/pgadmin4/pgAdmin4.py
```

## 接続の確認
- 以下アドレスを入力し画面を表示
URL：http://192.168.33.10:5050/
- ログイン時に「Email address」と「Password」を入力

![pgadmin.png](https://qiita-image-store.s3.amazonaws.com/0/122979/926c1ca2-7698-ed57-96ab-da135f723cb3.png)

# 最後に
- マシン自動起動設定を有効にするために、再起動する

# その他
## パスワード認証の省略
- ホームディレクトリに以下ファイルを設定することで、ログイン時にパスワード認証を省略できる

```bash:.pgpass
# {ip}:{port}:{dbname}:{dbuser}:{password}
localhost:5432:test:test:test
```

# 参考
- http://qiita.com/Morihaya/items/8cb436bff6e8d1826a48
- http://hacknote.jp/archives/8270/
- http://www.dbonline.jp/postgresql/connect/index2.html
2017-01-08 考察 > 1つにすることの失敗 > Windows 10など

僕が過去に経験したもので、「１つにする」ことでいくつもの弊害があると感じている。

### 弊害

1. 1つのコミットで複数の処理をチェックインする
   - 変更箇所の把握が困難になる
2. 1つのソースファイルに多数の関数を実装する
   - ソース変更時に、複数タブでの表示がしにくい/工夫が必要
      - 保守時に無駄な時間を要する
3. 1つのPC上で多くの機能を動かす
   - そのPCに致命的なトラブルが起きた場合、復旧までの影響が甚大なものになる
4. 1つの場所に情報を集約する。トラブル時に情報利用ができなくなる
5. 1つのネットワークに依存して作業する。トラブル時にネットワークを必要とするサービスに影響が出る
6. 長時間かかる作業を1つの区切りで行うとする
   - 「メモリ不足エラーです」で作業が落ちたら全てが水の泡

### 対応案

上記のそれぞれに対する対応案。

1. 適度な大きさでのチェックインにする
2. 複数のソースファイルに分割する
3. 複数のPCでサービスを分散する
4. バックアップを取っておく。トラブル時に一時的に別の場所を利用可能にする
5. バックアップ用ネットワーク環境を持っておく
6. 区切りながら作業を行う

### 備考

「複数にする」ことで余分な費用コスト・時間コストは発生する。
トラブル時の影響のコストと対比して考える必要はある。

その他、作業の中で「１つ」になってしまっている環境は適宜改善を検討すべきだろう。

### 例外

唯一「１つ」にした方がいいこと。

その時々で行う作業。


### 検索用キーワード
(2018-12-21追加)

- 一つ
- Windows10

Windows10は今後も一つのバージョンでアップデートをし続けるのだろうか?
Windows10で情報検索する時「XXX Update」「YYY Update」と合わせて検索することになるだろう。
その場合、「XXX Update」の記載がない情報は、役に立たないどころか検索ノイズにすらなる。
Minitestで例外クラスとエラーメッセージを検証する方法


## Minitestで例外クラスとエラーメッセージを検証する方法

Minitestで例外クラスと例外メッセージを検証する場合は、`assert_raises`でまず例外クラスを検証し、その戻り値（例外オブジェクト）を使ってエラーメッセージを検証します。

以下はそのサンプルコードです。

次のようなクラスがあったとします。

```ruby
class Foo
  # 例外が発生するメソッド
  def self.boo!
    raise 'BOO!!'
  end
end
```

`boo!` メソッドを呼び出すとRuntimeErrorが発生し、なおかつそのエラーメッセージが"BOO!!"であることを検証する場合は次のようなコードを書きます。

```ruby
require 'minitest/autorun'

class FooTest < Minitest::Test
  def test_boo!
    # RuntimeErrorが発生することを検証
    e = assert_raises RuntimeError do
      Foo.boo!
    end
    
    # エラーメッセージを検証
    assert_equal 'BOO!!', e.message
  end
end
```

## よくある間違い

`assert_raises` の第2引数に文字列を渡してもエラーメッセージを検証したことにはなりません。
以下のコードは間違いです。


```ruby
require 'minitest/autorun'

class FooTest < Minitest::Test
  def test_boo!
    # このコードだと、エラーメッセージを検証できていない
    assert_raises RuntimeError, 'BOO!!' do
      Foo.boo!
    end
  end
end
```

`assert_raises` の第2引数は、検証が失敗したときに表示されるメッセージになります。
`assert_raises` 自体は例外クラスが一致するかどうかの検証しかしてくれません。

たとえば、次のように実際のエラーメッセージと異なる文字列を渡してもテストはパスします。

```ruby
require 'minitest/autorun'

class FooTest < Minitest::Test
  def test_boo!
    # 第2引数は検証失敗時の表示用メッセージなので、'BOO!!'でなくてもパスする
    assert_raises RuntimeError, 'HAHAHA!!' do
      Foo.boo!
    end
  end
end
```

これは「パスすべきでないテストがパスする問題（false positive）」につながるので要注意です。

同様に、次のコードも間違いです。

```ruby
require 'minitest/autorun'

class FooTest < Minitest::Test
  def test_boo!
    # これもやはりエラーメッセージを検証できていない
    assert_raises 'BOO!!' do
      Foo.boo!
    end
  end
end
```

例外クラスが省略された場合は、StandardErrorか、そのサブクラスの例外が発生した場合にパスします。
上のコードの`'BOO!!'`は例外クラスではなく文字列なので、先ほどと同様、検証失敗時に表示されるメッセージになります。

### さらに：コードを読んで仕様を理解する

Minitestの実装コードはシンプルなので、`assert_raises`メソッドのコードを読むと仕様の理解がさらに進むと思います。

https://github.com/seattlerb/minitest/blob/affa73bb933369b4774f166c3c1ae3ae8a22611d/lib/minitest/assertions.rb#L321

## 参考：RSpecの場合

RSpecであれば、`raise_error`マッチャを使って例外クラスとエラーメッセージを同時に検証できます。

```ruby
# 例外クラスとエラーメッセージを同時に検証する
expect { Foo.boo! }.to raise_error RuntimeError, 'BOO!!'
```

文字列だけを渡したときはエラーメッセージだけを検証したことになります。

```ruby
# エラーメッセージだけを検証する
expect { Foo.boo! }.to raise_error 'BOO!!'
```

次のようにブロックを使うと、例外オブジェクトを使って検証することもできます。

```ruby
expect { Foo.boo! }.to raise_error RuntimeError do |e|
  expect(e.message).to eq 'BOO!!'
end
```

ぱっと見、`raise_error` マッチャとMinitestの`assert_raises` メソッドと用途や構文が似ているので、同じように使えそうな気がしますが、実際は微妙に異なるので注意が必要です。
分析環境について考える（その１：全体像） ※2017年1月時点

# 前置き
- 本記事はあくまで個人の意見である
- 環境によってはもっと適する形があると思う
- 勉強不足のためもっとスマートな方法があるかもしれないです

# 分析環境構築の流れ
- 以下流れで仮想環境を構築していく

| No. | 内容 |
|:---------:|:---------|
| 1 | [全体像](http://qiita.com/9en/items/28e178c919bf38fcbc4f) |
| 2 | [VirtualBox＋vagrantで仮想環境を構築](http://qiita.com/9en/items/82e52ca87a0eaa2aa270) |
| 3 | [pyenv＋Anaconda[Python、R]＋jupyter＋Rstudioのインストール](http://qiita.com/9en/items/981a4bed401065c63168) |
| 4 | [postgreSQL+Pgadmin4のインストール](http://qiita.com/9en/items/43d2306f7e7e968b72c4) |

# どんな人向けか？
- 分析環境について考える際、**普段どのような働き方をしているか**で分析環境を考えた
- いろいろな働き方があるかとは思うが、今回は以下のような人向けの分析環境について考える

![働き方.png](https://qiita-image-store.s3.amazonaws.com/0/122979/74581318-8cfd-10d9-b331-266416ac6a71.png)

# 考えた結果
- 以下のような分析環境を考えた
※書けば書くほど複雑になって分かりにくい

![環境構築の全体像.png](https://qiita-image-store.s3.amazonaws.com/0/122979/3d05c018-7c9a-4b30-df44-2f318f46788f.png)

# 考えたこと
## 【１】なぜ仮想化なのか？
- 分析の実行環境はLinuxベースのサーバーへSSHすることが多そう
- ローカルにLinux環境を構築することで、手戻を少なくする
※具体的には以下のような手戻を経験したことがあるため

### 実務あるある①
- ノートPC環境はWindowsまたはMac
- 分析用サーバーにSSHすればLinux環境がある
- 分析用サーバーがあるとはいえ、まずはサーバー上で開発するよりローカルで開発したい
    - 理由①：変なコードを流して分析用サーバーを利用している人に迷惑をかけたくない
    - 理由②：結果を転送するのが面倒
    - 理由③：ぱっと分析したいときに、いちいちSSHするのが面倒
- ローカルで分析したコードを分析サーバーで実行するとエラーとなる
    - 原因①：パッケージがインストールされていない
    - 原因②：パッケージのバージョンが違う
    - 原因③：エンコード、改行コードが違う
- 分析用サーバーでトライ＆エラー

### 実務あるある②
- ノートPC環境はWindows
- ターミナル上で実行したいがMS-DOSが使いにくくCygwinを入れる
- ライブラリのインストールでつまずく
- 頑張ってググってとりあえず動かすことができるが、環境がめちゃくちゃになる
- CygwinにAnacondaを入れようとしてもうまく入らない
- あきらめてWindows環境で分析しターミナル上では動かさない
- 分析用サーバーでトライ＆エラー

## 【２】分析クライアントツール
- 個人的にRstudioのような分析環境が好き
- 好きな理由は以下の通り
    1. スクリプトの実行結果が別に表示される
    1. 行単位で実行可能
    1. マークダウンが書ける
    1. スライドショーができる
    1. 仮想環境と連携できる
    1. 環境構築が楽
- Pythonも同様の環境を探し以下まとめた
    ※調査不足の可能性あり

| ソフトウェア | 結果 | 1 | 2 | 3 | 4 | 5 | 6 | 備考 |
|:----------|:----------|:----------|:----------|:----------|:----------|:----------|:----------|:----------|
| Rodeo | × | 〇 | 〇 | △ | × | △ | 〇 | 公式ではマークダウン、サーバー指定できると記載があるがバージョン2.0.13でできなかった。 |
| Spyder | × | 〇 | 〇 | × | × | × | 〇 | 調査不足の可能性あり。 |
| PyCharm | × | 〇 | × | × | 〇 | 〇 | × | 調査不足の可能性あり。 |
| Jupyter | 〇 | × | 〇 | 〇 | 〇 | 〇 | 〇 | Rも同様の環境で利用可能。 <br> RISEを使うとスライドショーができる。 |
| Jupyter lab | × | × | 〇 | 〇 | 〇 | 〇 | 〇 | jupyterでできることは基本できそう。 <br> ターミナルとスクリプトは画面分割されているが結果がターミナルに反映されるわけではない。 <br> 今後に期待したい。 |

## 【３】ソフトウェアライセンス
- オープンソースのライセンスを利用する
- 利用する理由は以下の通り
    - アカデミックとの連携を考えると、有償の環境はなるべく避けたい
    - 有償ソフトウェア依存となりたくない

## 【４】その他ソフトウェアを選んだ理由
| ソフトウェア | 理由 |
|:----------|:----------|
| Windows | 周りにMSofficeユーザが少なくないため <br> （今回の場合Macでも同じような環境を構築可能） |
| Oracle VirtualBox | 既存PCで仮想環境を構築したかったため。 <br> Windows、Macどちらでも対応可能な仮想環境としたかったため。 <br> ※詳細は [仮想環境についてまとめてみる](http://qiita.com/9en/items/f4eab2f61485a9f3885a) にて記載 |
| vagrant | 同一の環境を配布するため。<br> 最近流行りのDockerも試したがいろいろ失敗してしまった。 <br> |
| Ubuntu | 分析サーバーのOSに合わせる <br>  ※最近の分析関連の記事はUbuntuが多い気がする。 |
| Anaconda | 必要なライブラリがまとまっており楽だから |
| Teraterm | 今まで使ってきたから |
| WinSCP | 他になにがあるのよくかわからないから |

# 参考
- http://www.datascientist.or.jp/news/2014/pdf/1210.pdf
- http://qiita.com/chiku_/items/29d8ffd4b2c13989a96b