OmniAICreator/Qiita-1.07M huggingface dataset:
【Haskell】SublimeText2 + REPL 初期設定まとめ

すこしハマった、関数型言語Haskellの開発環境構築のメモ。

#Haskell Platform

[ここ](https://www.haskell.org/platform/mac.html)からdmgファイルをダウンロードし、インストールする。


#Sublime Text 2

エディタは[これ](http://www.sublimetext.com/dev)を使用する。

#Package Control

- SublimeText2 を起動する
- [View]->[Show Console] からコンソールを開く

![e76f44e42ed04da3fc3760454ee67685.png](https://qiita-image-store.s3.amazonaws.com/0/31862/e8814d16-a6c5-7a0e-6dd8-1da475317dee.png)

- コンソールに下記のコマンドを入力し、実行

```
import urllib2,os;pf='Package Control.sublime-package';ipp=sublime.installed_packages_path();os.makedirs(ipp) if not os.path.exists(ipp) else None;open(os.path.join(ipp,pf),'wb').write(urllib2.urlopen('http://sublime.wbond.net/'+pf.replace(' ','%20')).read())
```

- SublimeText2を再起動
- [Preference]->[Package Control]->[Package Control] \(= Command + Shift + p でも同様)

![b7425bcd1c2c4e928a9586be35a43881.png](https://qiita-image-store.s3.amazonaws.com/0/31862/fa15f1eb-366c-f322-2da1-c8177edfb714.png)

#SublimeREPL

- 「Install Packege」と入力しEnter、さらに「SublimeREPL」を入力しインストール

![a1c89dbb3efd12ace9665b5a54462b4d.png](https://qiita-image-store.s3.amazonaws.com/0/31862/cc0f0e49-9bdb-df04-bbda-e3f73d70256e.png)

- SublimeText2を再起動
- [Preference]->[Package Settings]->[SublimeREPL]->[Setting - User]に、GHCのパスを記述

```
"default_extend_env": {
 "PATH": "{PATH}:/usr/bin"
}
```

#コード実行

- 画面分割（command + shift + option + 2）
- [Tools]->[SublimeREPL]->[Haskell]から、haskellコンソールを開く

![fcaffe5637ca59bff39a9c4aeece8f58.png](https://qiita-image-store.s3.amazonaws.com/0/31862/fd0292f2-5d02-7164-3f77-43ab9e42437e.png)

- 「.hs」形式のファイルを作成し、コードを記述する
- 「control + , (カンマ) → l (エル)」選択行の実行できる


#すごい Haskell 楽しく学ぼう

すごいH本で、読書会をやってる。
英語版は無料 → [Learn You a Haskell for Great Good!](http://learnyouahaskell.com/)
ブラウザによって挙動の違うjavascriptに出会ったときの話

## 何が起きた？

javascriptのDate()関数が、IEとChromeで異なる動きをする。

このおかげでjqplotにも派生エラー。jqplotのsetDate()にDate()を渡すとIEだけおかしな動きをした。

## じゃあどうした？

Date()を使わず、setDate()には文字列を渡した。

## なんのために？

ブラウザ依存で発生するエラーを抑止するため

もしかしたらsetDate()にも似たような問題があるかもしれないけど、そのときはそのとき。

__削れるものは削るに限る。__
いろんなスクリプトでワンライナー足し算

先日会社のチャットでワンライナー足し算大会になったので覚え書き的に残します。

# お題
以下のファイルに記載されている1 - 5の数字を足す

```
$ cat num.txt
1
2
3
4
5
```

# ShellScript
```
$ xargs < num.txt
1 2 3 4 5
$ xargs < num.txt | tr ' ' '+'
1+2+3+4+5
$ xargs < num.txt | tr ' ' '+' | bc
15
```

```
$ awk '{a=a+$0}END{print a}' < num.txt
15
```

```
$ S=0;while read N; do S=`expr "$N" "+" "$S"` ; done < num.txt ; echo $S
15
```

```
$ xargs < num.txt
1 2 3 4 5
$ xargs -n 1 < num.txt
1
2
3
4
5
$ xargs -n 1 seq < num.txt
1
1
2
1
2
3
1
2
3
4
1
2
3
4
5
$ xargs -n 1 seq < num.txt | wc -l
      15
```

```
$ cat num.txt | datamash sum 1
15
```

# Perl
```
$ perl -nale 'for(@F[0]){$sum+=$_}END{print $sum}' num.txt
15
```

```
$ perl -nE '$sum+=$_;END{say $sum}' num.txt
15
```

# PHP
```
$ php -R '$a=$a+$argn;echo $a;echo "\n";' < num.txt | tail -n 1 
15
```

```
$ php -r "echo array_sum(file('num.txt'));"
15
```

# Ruby
```
$ ruby -e 'puts ARGF.map(&:to_i).reduce(:+)' num.txt
15
```

```
$ ruby -ne 'BEGIN{$sum = 0}; $sum += $_.to_i; END{puts $sum}' num.txt
15
```

```
$ ruby -e 'p eval([*$<]* ".+")' num.txt
15
```

# Python
```
$ python -c "import sys, operator;print reduce(operator.add, map(int, sys.stdin.readlines()))" < num.txt
15
```

```
$ python -c "print eval('+'.join(open('num.txt').read().split()))"
15
```
gulpタスク実行中にエラーが出たらデスクトップ通知を出す


`watch`しながら作業してるときにコンパイルエラーなんかが起こってたときに、ターミナルにエラーメッセージが出てるけど気づけないときがあったので通知を導入した。

## gulp-notifyを使う

* [gulp-notify](https://www.npmjs.org/package/gulp-notify)
* [gulp-plumber](https://www.npmjs.org/package/gulp-plumber)

エラーが出たときにgulpを終了させない`gulp-plumber`と、通知を出す`gulp-notify`を使う。

`gulp-plumber`はタスク実行中に`error`イベントが発生したときに実行する`errorHandler`を指定することができる。`errorHandler`にnotifyを指定すれば通知を出せる。

## gulpfile

CoffeeScriptのコンパイルを例に。

```javascript
var gulp = require('gulp');
var plumber = require('gulp-plumber');
var notify = require('gulp-notify');
var coffee = require('gulp-coffee');

gulp.task('coffee', function() {
	return gulp.src('src/coffee/**/*.coffee')
		.pipe(plumber({errorHandler: notify.onError('<%= error.message %>')})
		.pipe(coffee())
		.pipe(gulp.dest('app/assets/js');
});
```

`plumber()`を挟むときに一緒に`{errorHandler: notify.onError('<%= error.message %>')}`を引数にしておく。


### エラーが出ると通知

`watch`しつつ上記タスクが実行されたときにコンパイルエラーが出ると通知が出る。

![2014-08-13 06_50_51.gif](https://qiita-image-store.s3.amazonaws.com/0/17969/83ac0e71-4da1-0945-fe3c-b480bab1fa81.gif "2014-08-13 06_50_51.gif")


簡単便利。

---

## node-notifierを使う

`node-notifier`を使う。こっちは`error`じゃないときでも好きなとこで通知を出せる。

* [node-notifier](https://www.npmjs.org/package/node-notifier)


### gulpfile

```javascript
var gulp = require('gulp');
var plumber = require('gulp-plumber');
var coffee = require('gulp-coffee');
var Notifier = require('node-notifier');
var notifier = new Notifier();

var errorHandler = function(error) {
		notifier.notify({
			message: error.message,
			title: error.plugin,
			sound: 'Glass'
		});
	};

gulp.task('coffee', function() {
	return gulp.src('src/coffee/**/*.coffee')
		.pipe(plumber({errorHandler: errorHandler)})
		.pipe(coffee())
		.pipe(gulp.dest('app/assets/js');
});
```

タスク実行してエラーが出ると ﾁｰﾝ♪ という音とともに通知が出る。`sound`に指定出来る音は

```
ls /System/Library/Sounds
```
で出てくるファイル名が指定できる。指定できるオプションは他にも色々あって[node-notifier](https://www.npmjs.org/package/node-notifier)のページで確認できる。

> notifier.notify({
  "title": "Phil Coulson",
  "subtitle": "Agent of S.H.I.E.L.D.",
  "message": "If I come out, will you shoot me? 'Cause then I won't come out.",
  "sound": "Funk", // case sensitive
  "contentImage": __dirname + "/coulson.jpg",
  "appIcon": __dirname + "/coulson.jpg",
  "open": "file://" + __dirname + "/coulson.jpg"
});


`node-notifier`の場合はエラーハンドリングに限らず、タスクが終わったときに通知出したり色々とカスタマイズできる。
ssh config を汚さずに Ansible で Vagrant ホストを扱う

<kbd>vagrant ssh-config >> ~/.ssh/config</kbd> はイヤだというときに。
ansible.cfg を使う。

```cfg:ansible.cfg
[defaults]
hostfile = .vagrant/provisioners/ansible/inventory/vagrant_ansible_inventory
remote_user = vagrant
private_key_file = ~/.vagrant.d/insecure_private_key
host_key_checking = False
```

inventory には Vagrant が作成するものを使う。

ただし ansible provisioner を走らせないと Vagrant は inventory を生成してくれない。
http://qiita.com/janus_wel/items/cf5e0cf41ad771f92038 のように素直に provisioner を使えない場合は以下のようなダミーを使って生成させる。

```yml:generate-inventory.yml
--- # generate ansible inventory file with Vagrant
- hosts: default
  tasks:
    - name: ping
      action: ping
```

で、こう。

```ruby:Vagrantfile
  config.vm.provision "ansible" do |ansible|
    ansible.host_key_checking = false
    ansible.playbook = "generate-inventory.yml"
  end
```

これで何も考えずに <kbd>ansible-playbook playbook.yml</kbd> できる。
ansible-playbook の最後で serverspec を走らせる

TDD なサーバー構築をするんなら変更を加えたら強制的にテストまで走らせたい。
じゃあ ansible-playbook の最後で走らせればいいじゃない。

```yml:serverspec.yml
---
- hosts: default
  roles:
    - common
    - web
  post_tasks:
    - name: run serverspec
      shell: cd /path/to/serverspec && bundle exec rake serverspec
      delegate_to: 127.0.0.1
      changed_when: false
```

という感じで post_tasks につっこんでおく。

post_tasks だと handler の実行後に動くのが保証されるので service の restart があっても問題なくテストが走る。
FFTWのインストールにはまりかけたので忘備録

このサイトを参考にFFTWをVisual Studioで使えるようにしてみた．

http://www.slis.tsukuba.ac.jp/~fujisawa.makoto.fu/cgi-bin/wiki/index.php?FFTW

続きはそのうち書く．まずは忘れないように．
Ansible で Vagrant ホストを再起動する

たとえば SELinux の設定をいじりたいとき。

wait_for で待つ方法だと ansible-playbook が再起動以降でコケたり共有フォルダーがマウントされなくなったりとダメ。

<kbd>vagrant reload</kbd> を使う。

```yml:reboot-vagrant.yml
---
- name: reboot vagrant host
  command: 'vagrant reload'
  delegate_to: 127.0.0.1
  changed_when: false
```

こんな感じでファイルとして切り出しておいて、再起動が必要なところで include 。

```yml:disable-selinux.yml
---
- name: disable SELinux
  sudo: yes
  selinux: state=disabled

- include: util/reboot.yml
```

ローカルのコマンドが終わるのを待つわけで、非同期ではないので wait_for は不要。

注意点として、 Vagrant ホストで Vagrant のプロセスが走っている際中は <kbd>vagrant reload</kbd> が使えないみたいなので Vagrant provisioner からはこの方法を使えない。素直に ansible-playbook から起動しよう。
Fortran で Quine

#Fortran での自己出力プログラム
Fortran でも自己出力プログラムは昔から色々なものがあるので、少し毛色を変えてみようと思いました。自己出力プログラムでは、出力の反復が必要になりますが、それをFORMAT 文の繰り返しによって実現しています。

しかし、いまいちアイデアが無かったので、インチキ臭い手法を使いました。整数を Fortmat で文字で出力させる事自体は問題ないと思うのですが、８バイト長整数を使ってコンパイラに判断させています。また一行の長さも Fortran の規約を破っています。

Intel Fortran v.14 でコンパイルできています。
###プログラム
```fortran
print"(a,2(a6'7000883504211391088,43114511741484,48525234743591,1684956475')a)",7000883504211391088,43114511741484,48525234743591,1684956475;end
```
###出力
```
print"(a,2(a6'7000883504211391088,43114511741484,48525234743591,1684956475')a)",7000883504211391088,43114511741484,48525234743591,1684956475;end
続行するには何かキーを押してください . . .
```
##解説
それぞれの整数を文字として解釈して出力させると以下のようになります。
###プログラム
```fortran
    program self
      implicit none
      print "(a8)", 7000883504211391088 ! print"(a
      print "(a6)", 43114511741484      ! ,2(a6'
      print "(a6)", 48525234743591      ! ')a)",
      print "(a4)", 1684956475          ! ;end  
      stop
    end program self
```
###出力　
```
print"(a
,2(a6'
')a)",
;end
続行するには何かキーを押してください . . .
```
はじめの二つが頭部のPRINT命令、次がフォーマットとデータの境界の記号、残りが尾部のEND文に対応しています。
阿部寛のホームページをPHPでDOMる

# HTML を正しい文字コードで DOMDocument にしたい

DOMDocument が勝手に meta 検出してくれたら良いのだけど。
とりあえず自前で文字コード検出して、うまく変換して、DOMDocument を作る実験。

阿部寛のホームページが安定して昔ながらの文字コードを使ってくれているので実験材料に良い。
http://abehiroshi.la.coocan.jp/

```html:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=x-sjis">
<title>阿部寛のホームページ</title>
</head>
<frameset cols=18,82>
  <frame src=menu.htm marginheight=0 marginwidth=0 scrolling=auto name=left>
  <frame src=top.htm marginheight=0 marginwidth=0 scrolling=auto name=right>
</frameset><noframes></noframes>
```

そもそも frame が懐かしい。

# 作成したコード
```php:
<?php
// HTML全体からtitleを取得
function html2title($html){
	// まずは UTF-8 で決め打ち
	$htmlEncoded = mb_convert_encoding($html, 'HTML-ENTITIES', 'UTF-8');
	$doc = new DOMDocument();
	@$doc->loadHTML($htmlEncoded);

	// metaからcharset検出
	$charset = '';
	$elements = $doc->getElementsByTagName("meta");
	for($i = 0; $i < $elements->length; $i++){
		$e = $elements->item($i);

		// charset属性をチェック
		// <meta charset="utf-8"/>
		$node = $e->attributes->getNamedItem("charset");
		if($node){
			$charset = $node->nodeValue;
			break;
		}

		// http-equiv属性をチェック
		// <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
		$node = $e->attributes->getNamedItem("http-equiv");
		if($node && strcasecmp($node->nodeValue, 'content-type') == 0){
			$node = $e->attributes->getNamedItem("content");
			if($node && preg_match('/[\; ]charset ?\= ?([A-Za-z0-9\-\_]+)/', $node->nodeValue, $m)){
				$charset = $m[1];
				break;
			}
			continue;
		}
	}

	// 検出されたcharsetがUTF-8じゃなかったら
	if($charset !== '' && !preg_match('/^utf\-?8$/i', $charset)){
		// 文字コード変換し直して
		$htmlEncoded = mb_convert_encoding($html, 'HTML-ENTITIES', $charset);
		// DOMも構築し直す
		$doc = new DOMDocument();
		@$doc->loadHTML($htmlEncoded);
	}

	// title取得
	$elements = $doc->getElementsByTagName("title");
	for($i = 0; $i < $elements->length; $i++){
		$e = $elements->item($i);
		return $e->textContent;
	}

	// titleが見つからなかった場合
	return false;
}

// -- -- 実験コード -- -- //
// x-sjis の例
$body = file_get_contents("http://abehiroshi.la.coocan.jp/");
$title = html2title($body);
echo "title = $title\n";

// euc-jp の例
$body = file_get_contents("http://d.hatena.ne.jp/");
$title = html2title($body);
echo "title = $title\n";

// Shift_JIS の例
$body = file_get_contents("http://www.tohoho-web.com/www.htm");
$title = html2title($body);
echo "title = $title\n";

// UTF-8 の例
$body = file_get_contents("http://qiita.com/");
$title = html2title($body);
echo "title = $title\n";
```

# 実行結果
```
title = 阿部寛のホームページ
title = はてなダイアリー - 写真・画像・動画付き日記を無料で
title = とほほのＷＷＷ入門
title = Qiita - プログラマの技術情報共有サービス
```

はてなダイアリーがいまだに euc-jp だったというのが意外。

# 関連
- [PHP - DOMDocument::loadHTML が meta の charset を解釈してくれない問題と対策 - Qiita](http://qiita.com/kobake@github/items/3c5d09f9584a8786339d)

# おわり
おそらくこれまでに何千人もが同じようなコード書いてるような気がするわけで、
DRY原則に真っ向から立ち向かってしまっている感なんだけど、
良いサンプルが見つからなかったので自分で作ってしまった。

もっとスマートな（というかデファクトでかつ安心できる）方法があれば知りたいです。。。
Middleman + Marionette.js で eco テンプレートを使うためのセットアップ最短ステップ

前提: [Middleman で Marionette.js を使うためのセットアップ最短ステップ](http://qiita.com/kyanny/items/5ee78a1f59db856c7d58) が完了していること

* 1. Gemfile に以下を追記

```rb
gem 'ejs'
gem 'eco'
```

* 2. source/javascripts/templates 以下に適当なテンプレートファイルを `*.jst.eco` というファイル名で作成

```erb
# source/javascripts/welcome_view.jst.eco

<p>Hello World</p>
```

* 3. source/javascripts/all.js に以下を追記

```js
//= require_tree ./templates # require_tree . より先に読み込むこと

//= require_tree .
```

* 4. source/javascripts/application.js.coffee 的なファイルにいろいろ実装

```coffeescript
class WelcomeView extends Marionette.LayoutView

  # JST['...'] というヘルパーは sprockets によって提供される
  # JST['...'] は関数を返す
  # その関数を呼び出すと指定のパスにあるテンプレートの文字列を返す
  # 
  # class WelcomeView extends ... でクラスが定義されるとき
  # JST['...'] も呼び出されるので、この application.js.coffee が
  # 実行されるより先にテンプレートを読み込んでおく必要があった
  template: JST['templates/welcome_view']

App = window.App = new Marionette.Application
App.addRegions
  mainRegion: '.welcome'

App.addInitializer ->
  welcomeView = new WelcomeView
  App.mainRegion.show welcomeView

$ ->
  window.App.start()
```
rails開発環境アップデート

***


##gemの更新
1.とりあえず、バージョンを確認する
>gem update -v

2.以下のコマンドをぶち込む。
>sudo gem update --system

3.とりあえず、バージョンを確認する
>gem update -v

4.railsをインストールする。
>sudo gem install rails 

###作ったはよいがこいつの意識がないだけでした。
多分マシン自体の環境を変える時に「sudo」が必要になる。
※Super User Do = スーパーユーザー
Vagrantを使うために最低限知っておきたいこと（自分用）

自分か他の誰かがVagranfileを作れば、それを使い回すだけで同じ開発環境が手に入る。
「私のマシンでは動く」というバグからおさらばできる。
vagrantがどういうものかは他の記事を読んでもらうとしてここではよく使うコマンドをのせていきます！


<h2>起動</h2>

```vagrant init 任意の名前　仮想OSのURL```といった具合だ。

例として、

```vagrant init centos-6-x64 http://puppet-vagrant-boxes.puppetlabs.com/centos-64-x64-vbox4210.box```



上記のコマンドでvagrantfileができる。そして

```vagrant up```

すると、仮想サーバーが立ち上がる。便利。

```vagrant ssh```

で仮想サーバーに接続できる。本当に便利。

抜けるときは```exit```で抜けることができる

一応仮想OSサーバーのURLも載せておく。
http://www.vagrantbox.es/

<h2>停止</h2>

```vagrant halt```でvagrantが停止するよ。

<h2>vagrantの状態確認</h2>

```vagrant status```

で現在のvagrantの状態が確認できる。runningだったり、stopだったり。

<h2>box</h2>

基本的には上記に書いてあることでいけるが、vagrantにはboxというものがある。

仮想マシンを素早くクローンするためのものって感じです。

実は

```vagrant init centos-6-x64 http://puppet-vagrant-boxes.puppetlabs.com/centos-64-x64-vbox4210.box```

このコマンドを実行した時点でboxが作成されています。

```vagrant box list```

このコマンドで現在あるbox一覧を見ることができます。

boxの追加は

```vagrant box add centos-6-x64 http://puppet-vagrant-boxes.puppetlabs.com/centos-64-x64-vbox4210.box```

もうおわかりだと思うが

```vagrant box add 任意の名前　仮想OSのURL```

である。

boxを使用するときは```Vagrantfile```を開いて、以下のように内容を変更しましょう。

```Vagrant.configure("2") do |config|
  config.vm.box = "box addしたときの名前"
end```

で、```vagrant up```で仮想サーバーを立ち上げて

```vagrant ssh```で接続！

<h2>destroyする</h2>
仮想サーバーを立ち上げてapacheなりtomcatなりmysqlなりをインストールしまくったとしても、

```vagrant destroy```

で一発でまっさらな状態に戻せる。

<h2>Vagrantプログラムの削除</h2>
Windowsでは、コントロールパネルの「プログラムの追加と削除」からアンインストールします。

Mac OS Xでは、```/Applications/Vagrant```ディレクトリと```/usr/bin/vagrant```ファイルを削除します。

Linuxでは、```/opt/vagrant```ディレクトリと```/usr/bin/vagrant```ファイルを削除します。

<h2>ユーザーデータの削除</h2>
すべてのプラットフォームにおいて、ユーザデータを削除するには~/.vagrant.dディレクトリを削除します。

<h2>最後に</h2>
vagrantは日本語ドキュメントがあって、すごい読みやすいのでそっちを見るとより深く理解できますよ！

http://lab.raqda.com/vagrant/
Markdownで表の記載をするときにできるシンプルな工夫


Markdownで表を描くときに罫線を間違えたり、改行がわかりにくくなったりするという課題がある。『[Markdownで表の記載をするときにイラッとした経験のある人集まれ]』の投稿者の方が整形するツールを作りたくなるのも共感できる。こちらのツールを使うと改行できるようなので、セルに改行を含む表はこのツールをつかってみるといいかもしれない。

改行がないような単純な表を作るときに、個人的にやってる方法は

1. エクセルで表を作る
2. 罫線の列を作る
3. Kobito等にコピペ
4. ヘッダの罫線を書く

というもの。

こちらのGIFアニメがそれをやっている様子。


![markdown-table.gif](https://qiita-image-store.s3.amazonaws.com/0/889/6f330a10-23b6-c49a-3870-39c05646090e.gif "markdown-table.gif")


単純な表であれば直接Markdownで表を描くよりも多少は楽になると思う。



[Markdownで表の記載をするときにイラッとした経験のある人集まれ]: http://qiita.com/taruhachi/items/5bd18d7de4c3fa40dd23
Middleman で Marionette.js を使うためのセットアップ最短ステップ

* 1. `middleman init testapp`
* 2. Gemfile に以下を追記

```rb
source 'https://rails-assets.org'
gem 'rails-assets-marionette'
```

* 3. source/javascripts/all.js に以下を追記

```js
//= require jquery
//= require underscore
//= require backbone
//= require backbone.wreqr
//= require backbone.babysitter
//= require marionette

//= require_tree . # この行は元からある
```

* 4. `middleman server` してから JavaScript Console で `new Marionette.Application()` してオブジェクトが作れたら ok
Install Oracle Database Client Library on RHEL 5.6


## Configurations

- RHEL 5.6 running on VMware Fusion 6.0
- OS X 10.9.4 running on MacBook Pro 13" as a host

## Objective

- To install Oracle database client library on RHEL 5.6

## Problem(s)

For some reasons, the installer would not start because `DISPLAY` environment variable was not set correctly.

## Fix

### XQuartz

1. From OS X, start XQuartz
2. Start `xterm` from XQuartz and enter `xhost +` to disable access control

### RHEL

1. Start RHEL 5.6 from VMware Fusion
2. From OS X host, run `ssh -X vagrant@192.168.26.128`
3. Check `DISPLAY` variable by running `echo ${DISPLAY}`
4. Run `xclock` from RHEL 5.6

> NOTE: `DISPLAY` variable should already be set automatically. Mine was set like this: `DISPLAY=localhost:10.0`

## Lesson Learned

As you can see from the above, I did not need to _manually_ set `DISPLAY` variable at all. It was my mistake to blindly follow instructions given by Oracle. I set the `DISPLAY` variable to some other value, which prevented the installer from working.

In the case of running remote X11 applications on OS X, try connecting it by running `ssh -X`.
linux ディレクトリ構成


/	　	ルートディレクトリ
├	/bin	基本コマンド
├	/boot	起動に必要なファイル
├	/dev	デバイスファイル
├	/etc	設定ファイル
├	/home（オプション）	ユーザーのホームディレクトリ
├	/lib	共有ライブラリ
├	/lib<qual>（オプション）	　
├	/mnt	一時的なマウントポイント
├	/opt	追加アプリケーション
├	/proc（Linux固有）	プロセス情報など
├	/root（オプション）	root用ホームディレクトリ
├	/sbin	システム管理用コマンドなど
├	/tmp	一時的なファイル
├	/usr	各種プログラムなど
└	/var	変更されるデータ
UIWebViewに表示されているXMLソースコードを取得する方法

# 概要

UIWebViewに表示されているXMLのソースコードを取得する方法をメモ。
(HTMLの取得方法はすぐ見つかったのですが、XMLの方は少し探す必要があったので)

## HTMLの場合

まずは、HTMLソースを取得する方法。

```objectivec:
NSString *fullHtml = [webView stringByEvaluatingJavaScriptFromString:@"document.getElementsByTagName('html')[0].outerHTML"];
```

## XMLの場合

XMLのソースコードを取得する方法。

```objectivec:
NSString *webViewBody = [webView stringByEvaluatingJavaScriptFromString: @"(new XMLSerializer()).serializeToString(document);"];
```

# 参考にさせていただいたページ

* [WebViewで表示しているHTMLのソースを表示する方法 - hachinoBlog](http://hachinobu.hateblo.jp/entry/2014/03/26/134330)
* [javascript - How to get xml source code from UIWebView? - Stack Overflow](http://stackoverflow.com/questions/4840282/how-to-get-xml-source-code-from-uiwebview)

以上
Swiftの継承についての簡単な整理


##プロトコルのイニシャライザとクラスのイニシャライザ##

前回に続いて、クラス`MySuper`にクラス自身のイニシャライザを追加してみた。
`protocol`で宣言したイニシャライザ`init(srt)`は、修飾子`required`が必要となる。

```MySuper.swift
import Foundation

class MySuper:MyProtocol{
    //プロトコルに宣言したinit(str)
	required init(str: String) {
        NSLog("MySuperクラスのrequired init(%@)", str)
    }
    //デフォルトのイニシャライザinit()
    init()
    {
        NSLog("MySuperクラスのデフォルトinit()")
    }
    
    func protocolFunction01() {
        NSLog("MySuperクラスのFunction01")
    }

    func protocolFunction02() {
        NSLog("MySuperクラスのFunction02")
    }
}
```


そこで、さらに子クラス`MyParent`を作ってみる。

余談だが、下記のエラーが起きる。

`Overriding declaration requires an 'override' keyword`

![スクリーンショット 2014-08-12 23.42.47.png](https://qiita-image-store.s3.amazonaws.com/0/3184/2bea1c06-8b3d-f438-dae2-e30cf6b9cbb0.png "スクリーンショット 2014-08-12 23.42.47.png")

どうやら`override`修飾子が必要なようである。
そこで、適切に`override`修飾子を付加してあげる。


```MyParent.swift
import Foundation

class MyParent: MySuper{
    required init(str: String)
    {
        super.init(str: str)
        NSLog("MyParentクラスのrequired init(%@)", str)
    }
    
    override init()
    {
        super.init()
        NSLog("MyParentクラスのoverride init()")
    }
}
```


##クラスのインスタンス化##

ここでいよいよ`ViewController`で、`MyParent`クラスをインスタンス化してみる。

```ViewController.swift
import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        
        var myParent:MyParent = MyParent()
        
    }
}
```

コンソール結果は思った通りの結果に。

![スクリーンショット 2014-08-13 0.09.40.png](https://qiita-image-store.s3.amazonaws.com/0/3184/3d718d0a-7038-3ff1-14ef-6a9a3f7928c2.png "スクリーンショット 2014-08-13 0.09.40.png")

ちなみに、`String`をパラメータとする`init(str)`で初期化する場合。

```ViewController.swift
import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        
        var myParent:MyParent = MyParent(str: "ほげほげ")
        
    }
}
```

![スクリーンショット 2014-08-13 0.21.28.png](https://qiita-image-store.s3.amazonaws.com/0/3184/547309ff-c52a-ec92-a2cc-e81e0a2ae16c.png "スクリーンショット 2014-08-13 0.21.28.png")
コンソール結果は、2段ほげほげ。

さらに、さらに子クラス`MyChild`を作ってみる。

```MyChild.swift
import Foundation

class MyChild: MyParent{
    required init(str: String)
    {
        super.init(str: str)
        NSLog("MyChildクラスのrequired init(%@)", str)
    }
    
    override init()
    {
        super.init()
        NSLog("MyChildクラスのoverride init()")
    }
}
```

```ViewController.swift
import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        
        //var myParent:MyParent = MyParent(str: "ほげほげ")
        var myChild:MyChild = MyChild(str: "ふがふが")
        
    }
}
```

コンソール結果は、3段ふがふが。

![スクリーンショット 2014-08-13 0.27.43.png](https://qiita-image-store.s3.amazonaws.com/0/3184/71bb2ed6-b9db-ac56-d236-f083fe19df67.png "スクリーンショット 2014-08-13 0.27.43.png")

ここまでは予想通り。w
slackと連携するhubotをherokuで動かす


簡易メモです

### 参考
http://nanapi.co.jp/blog/2014/06/04/slack_with_hubot/
https://github.com/tinyspeck/hubot-slack

### 1.hubotのインストール

```
brew install node redis
redis-server &
npm install -g hubot coffee-script
hubot --create sample-bot # sample-botは任意
```

### 2.hubotのslackアダプタをインストール

```
npm install hubot-slack --save
```

### 3.Procfileを編集

```
web: bin/hubot --adapter slack
```

### 4.herokuにデプロイ

```
heroku create sample-bot # sample-botは任意。
git push heroku master
heroku addons:add rediscloud
heroku ps:scale web=1
```

### 5.slackでhubotを有効化
* [こちら](https://loupe.slack.com/services/new)からhubotを有効化
* HUBOT_SLACK_TOKEN、HUBOT_SLACK_TEAMを控える
* Hubot URLにherokuのURLを指定

### 6.herokuのconfigを変更
```
heroku config:add HEROKU_URL=http://sample-bot.herokuapp.com # herokuのURL
heroku config:add HUBOT_SLACK_TOKEN=**************** # 5で控えたトークン
heroku config:add HUBOT_SLACK_TEAM=****** # 5で控えたチーム名
heroku config:add HUBOT_SLACK_BOTNAME=sample-bot # sample-botは任意。bot名
```
行き詰まった時にやってみること


1. 速攻終わりそうな簡単なタスクに取りかかる
2. 紙とペンで図を描く
3. トイレに行く
4. コーヒー/お茶を入れる
5. 甘いものを食べる
6. 誰かに話しかける
7. 音楽を流す
8. パソコンを再起動する
9. 窓を開けてみる
10. 30秒間目をつぶってみる
11. シャワーを浴びる
12. 散歩する
AWSのセキュリティグループにセキュリティグループを指定した時の落とし穴

AWS の Security Group って便利ですよね！って思ってた昨日までの自分を殴りたい。

# Summary
- セキュリティグループにセキュリティグループを指定する場合、その設定が適用される場合と適用されない場合がある。
- 適用される/されない は、相手のインスタンスのリージョンと接続時のホスト名で変わる。

| Region | PublicIP | PublicDNS | PrivateIP |
|:--|:--|:--|:--|
| Same | × | ○ | ○ |
| Different | × | × | × |
※ ○：適用される/ ×：適用されない

# Details 

## 前提

- AWS で EC2 インスタンスを起動すると `PublicIP`/`PublicDNS`/`PrivateIP` がふられる。
- `PublicIP` インターネット（外部）に公開されてるIP。例）54.123.456.78
- `PublicDNS` DNSに登録されるホスト名。例）ec2-54-123-456-78.region.compute.amazonaws.com
- `PrivateIP` AWSのネットワーク内のみで使えるIP。例） 172.17.123.45
- 異なるリージョン間では、`PrivateIP`は使えない。名前解決するとプライベートIP出てくるけど。そんなの関係ない。

## きっかけ

EC2のセキュリティグループ設定を、必要最低限のネットワークに限定したい。
セキュリティグループにはIPアドレスも指定できますが、基本的に冗長構成組んでるとサーバ台数増えてくので、IPアドレスをいちいち設定してらんない。

そのためにAWSには素敵な仕組みがあって、セキュリティグループにセキュリティグループを設定できる。

Webサーバ群は、管理サーバ群からのSSH接続を許可します、みたいな。

なので仮に Webサーバ群にEC2を増やしても、そのインスタンスを Webサーバ群のセキュリティグループにさえ紐付ければ、特に気にする必要はないという素敵設定です。

が。落とし穴があった。

## 何が起きたか？

セキュリティグループを指定しているのに、繋がらない・・・！

仮に接続元サーバAと接続先Bがあって、それぞれにセキュリティグループ `SG-A` と `SG-B` が設定されているとする。
そして `SG-B` の Inbound に `SG-A` の 12345 番を許可してみる。


```bash
# A:* => B:12345 via privateIP
$ telnet private-IP-B 12345
Trying private-IP-B ...
Connected to private-IP-B.
Escape character is '^]'.
```

うん。問題ない。

ところが、privateIP => publicIP に変えてみると

```bash
# A:* => B:12345 via publicIP
$ telnet public-IP-B 12345
Trying public-IP-B ...
telnet: Unable to connect to remote host: Connection timed out
```

通らない。。。
もしや外部に一旦出てる？かと思い名前解決してみる。

```bash
$ nslookup public-IP-B

Server:		172.31.0.2
Address:	172.31.0.2#53

Non-authoritative answer:
B-IP-public.in-addr.arpa	name = public-IP-B.ap-northeast-1.compute.amazonaws.com.

Authoritative answers can be found from:
```

あれ、、なんか変なのでてきた。これは所謂 `publicDNS` というやつではないか。
更に名前解決してみる。

```bash
$ nslookup public-IP-B.ap-northeast-1.compute.amazonaws.com

Server:		172.31.0.2
Address:	172.31.0.2#53

Non-authoritative answer:
Name:	public-IP-B.ap-northeast-1.compute.amazonaws.com
Address: private-IP-B # あれ？
```

`privateIP` 引けてんじゃん。。。`publicIP` だとひけないのに！なんでや！

試しに `publicDNS` で接続にトライ。

```bash
$ telnet public-IP-B.ap-northeast-1.compute.amazonaws.com 12345
Trying public-IP-B.ap-northeast-1.compute.amazonaws.com ...
Connected to public-IP-B.ap-northeast-1.compute.amazonaws.com.
Escape character is '^]'.
```

どりゃあああ！(ノ｀Д´)ノ彡┻━┻
繋がってるじゃねえか。

つまり、 `publicIP` だと `publicDNS` までしか変換できず、結果として一旦外に出る模様。
当然のことながら、外に出た場合はセキュリティグループは適用外になってしまう。。。

## 調べてみた

どうやら、仕様。
https://forums.aws.amazon.com/thread.jspa?threadID=81025
https://forums.aws.amazon.com/thread.jspa?threadID=113766
IPython Notebook の使いどころ

[昨日](http://qiita.com/ynakayama/items/a159544f9d4c83d52cee)は IPython について触れましたが、この IPython には Web ベースの IPython Notebook という機能があります。

これも IPython の目玉機能のひとつなのですが、ちょうどタイムリーなことに[グノシーの中の人が記事を公開してる](http://nbviewer.ipython.org/gist/shunsukeaihara/dc2552453e1272866e2a)のでこちらを一読すると良いかと思います。詳細な解説はリンク先を読めばだいたい良い感じなので本機能の説明としては書くことがありませんね。

## IPython Notebook の特徴

ただ筆者は普段使う環境としてはやはりターミナルから IPython を起動する方法を利用しています。いくつか理由はありますが主に以下の通りです。

1. IPython Notebook はたまに動作が不安定なことがある
2. C-r によるコード履歴のインクリメンタルサーチなどいくつかターミナルの強力な機能を使えない
3. キーボードだけで完全に制御できるターミナルの快適さ

特に 1. は致命的で、インタラクティブシェルに打ち込んだ履歴を喪失したり、思考の中断につながったりするので、作業効率に対する影響大かと思います。

そうはいっても IPython Notebook にも出番はあります。筆者は IPython Notebook の使いどころとして以下を挙げます。

* プレゼンテーション
* グラフの描画とその細かい調整

特に最近の Python のカンファレンスでは発表者が IPython Notebook を使うという光景はポピュラーです。ウェブで対話的に操作できる UI を持っているというのは便利でしょう。

起動方法としては次のようにコマンド引数を利用します。

```zsh
ipython notebook --pylab inline
```

ただし --pylab オプションは推奨しないという意見もありますのであわせて参考にしてください。
http://quant-econ.net/matplotlib.html
http://carreau.github.io/posts/10-No-PyLab-Thanks.ipynb.html

![1.png](https://qiita-image-store.s3.amazonaws.com/0/38501/574d159f-2975-6026-23e3-c6a471f28100.png)

この画面から New Notebook をクリックすると新しいノートを作成することができます。

### インラインでの画像表示

inline で plt.show() などのときに生成されるグラフを表示することができます。

![2.png](https://qiita-image-store.s3.amazonaws.com/0/38501/35a36dcc-31e0-274a-7b4e-0386e8d022d2.png)

こういった機能は確かに便利です。特にデータセットがどのようなグラフを生成するか、まだ見当があまり付かない段階で、視覚的に表示を確認しながら訴求力のあるプロッティングを模索したいときに便利でしょう。

### ターミナルベースでの IPython によるプロッティングの試行

ただし、それがターミナルから起動した普通の IPython で出来ないかというとそんなことはありません。 plt.show() のかわりに plt.savefig("1.png") などをコードとして利用すれば良いのです。

たとえばモニターを別に用意して、そちらに [gthumb](https://wiki.gnome.org/Apps/gthumb) などの画像ビューワーで画像を表示しておきます。こうすれば GNU/Linux の場合、計算で画像を更新するたびにそれが即座かつ自動的に新しい画像に切り替わります。こうすればターミナルベースでの IPython でも IPython Notebook と変わらない効率性を実現することができます。

## まとめ

IPython Notebook について大まかに説明しました。場合によってはこれも併用すると便利でしょう。
pythonで外部のシェルスクリプトやコマンドを実行する方法

pythonで外部のシェルスクリプトやコマンドを実行する方法です。  

今回はpythonのコードに入力されたIPアドレスが正しいかをチェックする「ip-address_check.sh 」を実行してその結果を格納して表示する動作を想定しています。  
    
外部のシェルスクリプトを実行するとなると２パターンあるのですが返り値が違います。  

1. os.system('ls -la')
　　コマンドが成功すれば0が返ってきます。

2.  commands.getoutput("ls -la")
　　実際に実行した結果が返ってきます。
  
```
#!/usr/bin/env python

import commands

check = commands.getoutput("./ip-address_check.sh 192.168.1.1")

print check
```

ip-address_checkでは書式に問題なければOKを返すように作成されていますので、この場合print checkによりpythonの出力結果としてもOKが出力されます。

意外とコマンドを忘れがちなのでメモしておきます。

<hr>
python歴半年になったので読んだ参考書を晒してみる
http://komeiy.hatenablog.com/entry/2014/11/28/223223
なぜ implicit conversion を定義するのに import scala.language.implicitConversions が必要なのか

implicit conversion を使ったらこんな warning が出たので、理由を調べた。

```txt
[warn] .../Main.scala:8: implicit conversion method toMyRichString should be enabled
[warn] by making the implicit value scala.language.implicitConversions visible.
[warn] This can be achieved by adding the import clause 'import scala.language.implicitConversions'
[warn] or by setting the compiler option -language:implicitConversions.
[warn] See the Scala docs for value scala.language.implicitConversions for a discussion
[warn] why the feature should be explicitly enabled.
```

ググったところ、SIP-18 に理由が書いてあった。

https://docs.google.com/document/d/1nlkvpoIRkx7at1qJEZafJwthZ3GeIklTFhqmXMvTX9Q

- implicit conversion の過剰な使用は多くの落とし穴を作ることになる。
- implicit conversion はとても強力だし、その効果が理解しやすいので、過剰に使われやすい。
- implicit parameter を使ったほうが implicit conversion を使うよりも多くの場面で良い設計になる。

ということで、「使い過ぎないように」というわりと普通な理由だった。
3番目の implicit parameter を使ったほうが良いっていうのはどういうことだろう…。
phusion/baseimage-dockerでcronが動かない問題


baseimage-dockerって何？ってのは[1]で説明されているので飛ばします。
今回はbaseimage-dockerをベースにDockerfile作ってたらcronが動かなくてハマったのでここで共有しておきます。
結論から言うと/sbin/my_initを動かしていなかったせいでcronが動いていませんでした。
このmy_initはbaseimage-dockerで使われているinitシステムで、pythonで書かれているスクリプト。実行するとbaseimage-dockerの起動スクリプトとかいくつかのサービス(cron含む)を起動し、更には引数に指定したコマンドも実行してくれる。

自分はpostgresqlをbaseimage-docker上で動かそうと思い[3]のDockerfileに従って書いてたら見事にCMDを上書きしてしまい/sbin/my_initが動いていなかった。
[4]で似たような現象に遭遇してる人を見つけ、コメントでmy_init動いてねんじゃね？ってので自分のミスに気がついた。
以下のようにCMDを/sbin/my_initに戻して引数経由でpostgresqlを動かすようにして見事解決.

```bash:Dockerfile
CMD ["/sbin/my_init", "<postgres動かす為のスクリプト>"]
```

[1] Docker 初心者は phusion/baseimage-docker を使おう - diaspora
http://blog.kakipo.com/use-phusion-baseimage-docker/

[2] phusion/baseimage-docker - github
https://github.com/phusion/baseimage-docker

[3] Dockerizing a PostgreSQL service
http://docs.docker.com/examples/postgresql_service/

[4] cron deamon not working - phusion/baseimage-docker github
https://github.com/phusion/baseimage-docker/issues/115
rubyで通信系の関数(Net関数)を使うときに気をつけること


### textからhrefを見つける方法
* httpとhttpsを含むurlを取得

```
text.scan(URI.regexp(['http', 'https'])) do
    p URI.parse($&).to_s
end
```

### UserAgentをつける方法
```
uri = URI.parse(url)
res = Net::HTTP.start(uri.host, uri.port) do |http|
    http.get(uri.path, {'User-Agent' => UrlConcern::USER_AGENT})
end
```

### イレギュラーなURIのパースについて
* ``http:/``をopenするとTypeErrorが起きる

```
URI.parse("http:/").open
-> TypeError: no implicit conversion of nil into String
```

* ``http:``や``http://``だとInvalidURIErrorが起きる

```
URI.parse("http:").open
-> URI::InvalidURIError: bad URI(absolute but no path)
URI.parse("http://").open
-> URI::InvalidURIError: bad URI(absolute but no path)
```

* 存在しないパスの場合

```
URI.parse("http://example.com").open
-> SocketError: getaddrinfo: nodename nor servname provided, or not known
```

### httpからhttpsにredirectする際のエラー
* httpからhttpsへのredirectは禁止されている
* open_uri_redirectionsを利用すると、セキュアでなくなるが、redirectができるようになる
* https://github.com/jaimeiniesta/open_uri_redirections
* http://stackoverflow.com/questions/10013293/open-uri-is-not-redirecing-http-to-https
* https://bugs.ruby-lang.org/issues/859
* https://gist.github.com/zaius/1271420

```
RuntimeError: redirection forbidden: http://**** -> https://****
```

### httpsのデータを取得するとき
* use_sslのオプションをつける必要がある 
* http://stackoverflow.com/questions/5244887/eoferror-end-of-file-reached-issue-with-nethttp

```
uri = URI.parse(url)
res = Net::HTTP.start(uri.host, uri.port, use_ssl: true) do |http|
    http.get(uri.path)
end
```

### uriがparseできるかどうか

```
if url =~ URI::regexp
    # Correct URL
end
```

* http://stackoverflow.com/questions/1805761/check-if-url-is-valid-ruby
CoreOS ITproでお勉強

軽量Linuxの新顔「CoreOS」を体験
http://itpro.nikkeibp.co.jp/atcl/watcher/14/334361/080500024/?ST=oss&P=2
こちらのページをなぞるようにハンズオン。ページと異なるところは、VirtualBox上にCoreOSをインストールするところ。

VirtualBoxを使用する場合、ホスト→リモートのssh接続に設定を要します。（Ubuntu→CoreOS）

手っ取り早い方法は次の通り。
1. VirtualBox　設定ボタン
2. ネットワーク→アダプター1タブ→高度→ポートフォワーディング
3. ポートフォワーディングルールに追加。

| 名前 | プロトコル | ホストIP | ホストポート | ゲストIP | ゲストポート |
|-----------|------------|------------|------------|------------|------------|
|ssh|TCP||2222||22|

接続する際はこちらのコマンドで。（localhostは本当に"localhost"という文字列）

```bash:
$ ssh core@localhost -p 2222
```
接続前にあらかじめCoreOSの方でユーザ「core」へパスワードを設定しておくこと。

この設定でITproの設定をなぞることに成功。dockerもnginxも詳細は分からないので、これ以上は進めず。勉強用の環境構築という感じ。
Rspec の warning を消す


### 問題

次のようにWarningがたくさんでて邪魔なので消すには。。。

```shell
$ bundle exec rspec
|| /Users/user/work/rails/testapp2/vendor/bundle/ruby/2.1.0/gems/mysql2-0.3.16/lib/mysql2/error.rb:22: warning: method redefined; discarding old sql_state=
|| /Users/user/work/rails/testapp2/vendor/bundle/ruby/2.1.0/gems/sass-3.2.19/lib/sass/version.rb:5: warning: loading in progress, circular require considered harmful - /User
...
``` 

### 解決方法

[app_root]/.rspec の --warnings を削除するだけ。

ただし、Rubyの警告は全て出力されなくなる。

### 参照

Rails4 の RSpec でたくさんエラーがでる
http://stackoverflow.com/questions/24003316/guard-with-rspec-on-rails-4-giving-a-lot-of-warnings

Spec 実行時に Rubyのwarning を止めるには
http://stackoverflow.com/questions/5591509/suppress-ruby-warnings-when-running-specs

RSpec で Warnings をテストするには
http://stackoverflow.com/questions/5449187/test-for-warnings-using-rspec

stderr をフックして出力してしまうらしい
Linuxでのgit logの文字化け

# 動作環境
OS：CentOS64
Git: version 1.7.1

# 状況
sshでリモートのLinuxに接続し、git logを表示すると文字化けする。
正確には文字化けでなく、

```
<E3><83><87><E3><83><BC><E3><82><BF><E3><83><99><E3>
```

といった感じでエンコードが出来ていない。

# 解決策
## 対応その1：ロケールの変更
`localedef -f UTF-8 -i ja_JP ja_JP`でlocaleを日本に変更

⇒結果：治らない

## 対応その2： quotepathにfalseを設定
quotepathをfalseにすることで、出力をエスケープしない設定になるらしい。
ぐぐるとよく出てくるのはこれによる対応。

⇒結果：治らない

## 解決策：lessの設定をutf-8に変更する
結局、`git log`によるページャはlessで表示されており、その文字コードがutf-8に設定されていないのが原因だった。

```
export LESSCHARSET=utf-8
```

これで環境変数にlessの文字コードを設定するとちゃんと表示されるようになりました。
Goのインタフェースとその実装、およびstructへの埋め込み

# RubyのModuleのように

* インタフェースの実装をStructに埋め込む

```go:i_f.go
package main

import "fmt"

// 料理を作るI/F
type Cooker interface {
  Cook() string
}

// 塗るI/F
type Painter interface {
  Paint() string
}

// 働くI/F
type Worker interface {
  Work() string
}

// 家庭料理を作ることによってCookerI/Fを実装
type HomeCooker struct{}

func (c *HomeCooker) Cook() string {
  return "簡単な料理を作ります。"
}

// 日曜大工レベルでPainterI/Fを実装
type SundayPainter struct{}

func (p *SundayPainter) Paint() string {
  return "日曜大工レベルでペンキを塗ります。"
}

// 会社で働いてWorkerI/Fを実装
type OfficeWorker struct{}

func (w *OfficeWorker) Work() string {
  return "会社で仕事をします。"
}

/*
*  お父さんStructは
*    CookerI/Fの任意の実装
*    PainterI/Fの任意の実装
*    WorkerI/Fの任意の実装
*  をコンポジションする
 */
type Father struct {
  Name string
  Cooker
  Painter
  Worker
}

// ふつうのお父さん
func NewGenericFather() *Father {
  return &Father{
    "ふつうのお父さん",
    // 一般的な実装を持っている
    &HomeCooker{},
    &SundayPainter{},
    &OfficeWorker{},
  }
}

// クッキングパパ
type CookingPapa struct {
  Name string
  Painter
  Worker
}

func NewCookingPapa() *CookingPapa {
  return &CookingPapa{
    "クッキングパパ",
    // CookerI/Fは自分自身で実装する
    // PainterI/FとWorkerI/Fは一般的な実装を借りる
    &SundayPainter{},
    &OfficeWorker{},
  }
}

func (cp *CookingPapa) Cook() string {
  return "なんか工夫したりしてすごい料理を作ります。"
}

/*
* いろんなことをする時に
* Fatherオブジェクトではなく
* 何かしたいことが出来る（責務を持った）
* interfaceを引数に取る
 */
func MakeDinner(c Cooker) string {
  return c.Cook()
}

func RepairRoof(p Painter) string {
  return p.Paint()
}

func GetMoney(w Worker) string {
  return w.Work()
}

func main() {
  gf := NewGenericFather()
  fmt.Println(gf.Name)
  fmt.Println("- ", MakeDinner(gf))
  fmt.Println("- ", RepairRoof(gf))
  fmt.Println("- ", GetMoney(gf))

  cp := NewCookingPapa()
  fmt.Println(cp.Name)
  fmt.Println("- ", MakeDinner(cp))
  fmt.Println("- ", RepairRoof(cp))
  fmt.Println("- ", GetMoney(cp))
}
```
seq2gif | seq2gif で出力するアニーションGIFの繰り返し回数を設定する

# seq2gif | seq2gif で出力するアニーションGIFの繰り返し回数を設定する

## 概要
seq2gif で出力するアニーションGIFの繰り返し回数を設定します

* -r 繰り返し回数。デフォルトは0（無限）

## 試行
### コマンドの保存

~~~
$ ttyrec repeat_count

$ echo start
start
$ seq 5 | figlet
 _
/ |
| |
| |
|_|

 ____
|___ \
  __) |
 / __/
|_____|

 _____
|___ /
  |_ \
 ___) |
|____/

 _  _
| || |
| || |_
|__   _|
   |_|

 ____
| ___|
|___ \
 ___) |
|____/

$ echo end
end
$

# Ctrl + D で保存終了
~~~

### デフォルトでアニメーションGIF生成

~~~bash
seq2gif < repeat_count > repeat_count.gif
~~~

![repeat_count.gif](https://qiita-image-store.s3.amazonaws.com/0/43480/7dcc6269-5a5f-f9c2-d5e3-2ef9e1fd1a8c.gif)

### 繰り返し回数3でアニメーションGIF生成

~~~bash
$ seq2gif -r 3 < repeat_count > repeat_count_3.gif
~~~

![repeat_count_3.gif](https://qiita-image-store.s3.amazonaws.com/0/43480/0977db3f-1cd9-f43e-a102-4bde5f1759b8.gif)

## 参照
https://github.com/saitoha/seq2gif
seq2gif | seq2gif で出力するアニメーションGIFの色を設定する

# seq2gif | seq2gif で出力するアニメーションGIFの色を設定する

## 概要
seq2gif で出力するアニメーションGIFの色を設定します

* -f オプションで前景色( foreground )を設定。デフォルトは 7。白。
* -b オプションで背景色( background )を設定。デフォルトは 0。黒。
* -c オプションでカーソル色( background )を設定。デフォルトは 2。緑。

## 試行
### コマンドの保存

~~~
$ ttyrec color

$ echo start
start
$ seq 5 | figlet
 _
/ |
| |
| |
|_|

 ____
|___ \
  __) |
 / __/
|_____|

 _____
|___ /
  |_ \
 ___) |
|____/

 _  _
| || |
| || |_
|__   _|
   |_|

 ____
| ___|
|___ \
 ___) |
|____/

$ echo end
end
$

# Ctrl + D で保存終了
~~~

### デフォルトでアニメーションGIF生成

~~~bash
seq2gif < color > default.gif
~~~

![color.gif](https://qiita-image-store.s3.amazonaws.com/0/43480/7e991408-ba96-5d68-2f6b-feac8b0fc5d0.gif)

### 背景:黒、前景:緑、カーソル:白 でアニメーションGIF生成

~~~bash
$ seq2gif -b 0 -f 2 -c 7 < color > color_b0f2c7.gif
~~~

![color_b0f2c7.gif](https://qiita-image-store.s3.amazonaws.com/0/43480/8314ff0f-5f45-0e82-c614-eba38883302b.gif)

## 参照
https://github.com/saitoha/seq2gif
seq2gif | seq2gif で出力するアニメーションGIFの高さ・幅を設定する

# seq2gif | seq2gif で出力するアニメーションGIFの高さ・幅を設定する

## 概要
seq2gif で出力するアニーションGIFの高さ・幅を設定します

* -w オプションで幅を設定。デフォルトは80
* -h オプションで高を設定。デフォルトは24

## 試行
### コマンドの保存

~~~
$ ttyrec hw_setting

$ echo start
start
$ seq 5 | figlet
 _
/ |
| |
| |
|_|

 ____
|___ \
  __) |
 / __/
|_____|

 _____
|___ /
  |_ \
 ___) |
|____/

 _  _
| || |
| || |_
|__   _|
   |_|

 ____
| ___|
|___ \
 ___) |
|____/

$ echo end
end
$

# Ctrl + D で保存終了
~~~

### デフォルトでアニメーションGIF生成

~~~bash
$ seq2gif < hw_setting > default.gif
~~~

![default.gif](https://qiita-image-store.s3.amazonaws.com/0/43480/31385ebd-80ce-fb8b-d07e-ec217329306f.gif)

### w100 * h40 でアニメーションGIF生成

~~~bash
$ seq2gif -w 100 -h 40 < hw_setting > 100_40.gif
~~~

![100_40.gif](https://qiita-image-store.s3.amazonaws.com/0/43480/3b6da681-8052-7510-5588-23783f176cbf.gif)

## 参照
https://github.com/saitoha/seq2gif
初めてAmazon Route53を利用して便利さがわかった

[BIND](http://www.isc.org/downloads/bind/)から[Amazon Route 53](http://aws.amazon.com/jp/route53/)に移行してみたので、以下手順。

## Hosted Zoneの作成
1. [Amazon Route53のコンソール](https://console.aws.amazon.com/route53/)にログインする。
1. `Create Hosted Zone`をクリックする。  
Domain Name: itayan.xyz   
Comment: (任意) 
1. `Create`をクリックする。
1. デフォルトでSOAレコードとNSレコードの2つが作成される。

## レジストラのネームサーバの変更
1. 作成されたNSレコードを参照し、ドメインを管理しているレジストラのネームサーバに登録をする。
2. ネームサーバが登録されたことを確認する。

		$ whois itayan.xyz | grep "^Name Server"
		Name Server:NS-1005.AWSDNS-61.NET
		Name Server:NS-217.AWSDNS-27.COM
		Name Server:NS-1602.AWSDNS-08.CO.UK
		Name Server:NS-1306.AWSDNS-35.ORG

**例：ムームードメインでネームサーバの登録をする。**
1. コントロールパネルにログインし、ドメイン管理メニュー > ネームサーバ設定変更をクリックする。
2. 対象ドメインのネームサーバ設定変更をクリックする。
![Screen Shot 2014-08-09 at 9.01.17 AM.png](https://qiita-image-store.s3.amazonaws.com/0/2555/0c4a7f31-767d-7f94-837e-343286a0f64e.png "Screen Shot 2014-08-09 at 9.01.17 AM.png")
3. 取得したドメインで使用するをクリックし、4つのネームサーバを入力する。
4. ネームサーバ設定変更をクリックする。
![Screen Shot 2014-08-09 at 9.08.45 AM.png](https://qiita-image-store.s3.amazonaws.com/0/2555/eefff5eb-5354-d55c-8344-3335c244b7a9.png "Screen Shot 2014-08-09 at 9.08.45 AM.png")
5. 確認のダイヤログが表示されるのでOKをクリックする。


## Aレコードの追加
1. 対象ドメインを選択し、`Go to Record Sets`をクリックする。
1. `Create Record Set`をクリックする。  
Name: www.itayan.xyz.  
Type: A-IPv4 address  
Value: 49.212.41.218
1. `Create`をクリックする。

## 正引きの確認
名前が引けることを確認する。

	$ dig www.itayan.xyz
	;; ANSWER SECTION:
	www.itayan.xyz.		273	IN	A	49.212.41.218

## 料金

気になる料金ですが、

**ホストゾーン**

|ホストゾーンごと|説明|
|---|---|
|$0.50 / 月|最初の25ホストゾーンまで|
|$0.10 / 月|それ以上のホストゾーン|

**クエリ**

|100万クエリごと|説明|
|---|---|
|$0.40 / 月|最初の10億クエリまで / 月|
|$0.20 / 月|それ以上のクエリ / 月|

なので、かなり安い。

### 参考リンク

- [Migrating DNS Service for an Existing Domain to Amazon Route 53 - Amazon Route 53](http://docs.aws.amazon.com/Route53/latest/DeveloperGuide/MigratingDNS.html)
- [Amazon Route 53 料金表](http://aws.amazon.com/jp/route53/pricing/)
seq2gif | seq2gif をインストールして ttyrec で保存した操作記録からアニメーションGIFを生成する

# seq2gif | seq2gif をインストールして ttyrec で保存した操作記録からアニメーションGIFを生成する

## 概要
seq2gif をインストールして ttyrec で保存した操作記録からアニメーションGIFを生成します。

## 環境
* Windows7 + Cygwin
* ttyrec はインストール済み

ttyrecのインストールについてはこちら
=> [ttyrec | 端末操作を保存、再生するツール ttyrec を Cygwin 環境にインストール](http://qiita.com/tbpgr/items/1ea3e4a758191ab8972e)

## 手順

~~~bash
$ cd ~/

# 今回は ~/seq2gif をベースに作業しますが、好きな場所で make してください
$ mkdir seq2gif
$ git clone https://github.com/saitoha/seq2gif.git
$ cd seq2gif
$ ./configure
$ make

$ cp seq2gif.exe /usr/local/bin/
~~~

* インストールの確認をします

~~~bash
$ seq2gif -V
seq2gif 0.10.3
# : 以下略
~~~

## アニメーションGIFを作成してみる

### ttyrec で操作を記録します

※最後のコマンドの後に1回改行を入れておかないと、GIF生成時に出力されなくなる模様

~~~bash
$ ttyrec

# 以下、 ttyrec で保存するコマンド
$ echo hoge
hoge
$ cal
      8月 2014
日 月 火 水 木 金 土
                1  2
 3  4  5  6  7  8  9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
$ echo hige
hige
$
$

# Ctrl + D で保存完了
~~~

### アニメーションGIFの生成

一瞬で実行が終わります。超簡単。

~~~
$ seq2gif < ttyrecord > record.gif
~~~

###　出力したGIFを確認

![record.gif](https://qiita-image-store.s3.amazonaws.com/0/43480/eba5400b-7498-1859-5927-7019842ad6a2.gif)

## 参照
https://github.com/saitoha/seq2gif
ttyrec | 端末操作を保存、再生するツール ttyrec を Cygwin 環境にインストール

# ttyrec | 端末操作を保存、再生するツール ttyrec を Cygwin 環境にインストール

## 概要
端末操作を保存、再生するツール *ttyrec* を Cygwin 環境にインストールします。

※インストールの目的は, cygwin 環境で *percol* のスクリーンキャプチャをとるためです。

## 手順

* *ttyrec* の tar を取得、解凍してパッチをあてます

~~~bash
$ cd ~/
$ mkdir ttyrec
$ cd ttyrec
$ mkdir src
$ mkdir compile
$ cd src
$ wget http://0xcc.net/ttyrec/ttyrec-1.0.8.tar.gz
$ wget http://mitsuki.engawa.org/image/ttyrec-1.0.8-cygwin-patch
$ cd ../compile
$ tar zxvf ../src/ttyrec-1.0.8.tar.gz
$ cd ttyrec-1.0.8/
$ patch < ../../src/ttyrec-1.0.8-cygwin-patch
~~~

* bashを利用したいので、 ttyrec.c を編集して shell ではなく bash を利用するようにします。

~~~c:ttyrec.c
@@ -159,7 +159,7 @@ main(argc, argv)

        shell = getenv("SHELL");
        if (shell == NULL)
-               shell = "/bin/sh";
+               shell = "/user/bin/bash";

        getmaster();
        fixtty();
~~~

* makeします。

~~~
$ make

$ cp ttyrec.exe /usr/local/bin/
$ cp ttyplay.exe /usr/local/bin/
$ cp ttytime.exe /usr/local/bin/
~~~

## 確認

~~~bash
# 操作保存: ファイル名を指定しないと、./ttyrecord に保存される
$ ttyrec

# 操作例
$ echo hoge
hoge

$ cal
      8月 2014
日 月 火 水 木 金 土
                1  2
 3  4  5  6  7  8  9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31

# Ctrl + D で操作の保存終了

# 操作再生
$ ttyplay ttyrecord

# 保存した操作が再生されます
$ echo hoge
hoge

$ cal
      8月 2014
日 月 火 水 木 金 土
                1  2
 3  4  5  6  7  8  9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31

# 操作再生(2倍速)
$ ttyplay -s 2.0 ttyrecord

# 保存した操作が2倍速で再生されます
$ echo hoge
hoge

$ cal
      8月 2014
日 月 火 水 木 金 土
                1  2
 3  4  5  6  7  8  9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
~~~

## 参照
http://0xcc.net/ttyrec/
https://github.com/mjording/ttyrec
Aterm(WR8165N)のSSIDに全角文字を使いたい


## 課題

Aterm(WR8165N)のSSIDに使える半角英数、半角記号のみで、全角は使えない。

![Blank_Skitch_Document.png](https://qiita-image-store.s3.amazonaws.com/0/889/4db0f467-4bdf-6e6a-deeb-0d9f2a223e74.png "Blank_Skitch_Document.png")

## 全角文字を使いたい

http://192.168.10.1/wlbasic.htm ページのバリデーションはJavaScriptで行っている。`includeHalfWidth2` という関数が半角文字だけで構成されているかを判定する関数。もし、これがいつも `true` を返す関数だったらな〜。

```js
function includeHalfWidth2(str)
{
	return true;
}
```

あと、Atermの管理画面の文字コードはEUC-JPだが、これがUTF-8だったらいいのに。Chromeで文字コードをUTF-8にしてもフォーム送信できるかな？

もしもJavaScriptの言語仕様で定義済みの関数を上書きできたりしないかぎり、このバリデーションは突破できない(あっ…
Percol | percol レシピ | インタラクティブに cd を使う

# Percol | percol レシピ | インタラクティブに cd を使う

## 概要
インタラクティブに cd を使う

## pcd (percol cd)

* 利用している bash の環境の ~/.bashrc に下記を追加する

~~~
alias pcd='cd `ls -1 | percol`'
~~~

* エイリアスを有効化します

~~~bash
. ~/.bashrc
~~~

* 検証用にRubyでディレクトリを生成

~~~ruby
dirname_bases = %w{ hoge hige hage }
prefixes = [*0..9]
sufixes = [*0..9]

30.times do
  dir = "#{prefixes.sample}_#{dirname_bases.sample}_#{sufixes.sample}"
  next if Dir.exist?(dir)
  Dir.mkdir(dir)
end
~~~

* 生成したディレクトリの確認

~~~
$ tree
┗ test
    ┣ 0_hage_1
    ┣ 0_hige_3
    ┣ 0_hige_4
    ┣ 1_hage_4
    ┣ 1_hage_6
    ┣ 1_hoge_2
    ┣ 2_hage_4
    ┣ 2_hoge_8
    ┣ 3_hage_2
    ┣ 3_hage_8
    ┣ 3_hige_4
    ┣ 3_hoge_5
    ┣ 4_hage_0
    ┣ 4_hige_9
    ┣ 4_hoge_9
    ┣ 5_hage_2
    ┣ 5_hoge_4
    ┣ 6_hage_4
    ┣ 6_hage_8
    ┣ 6_hige_5
    ┣ 6_hige_6
    ┣ 6_hoge_2
    ┣ 6_hoge_7
    ┣ 7_hage_0
    ┣ 8_hage_1
    ┣ 8_hage_2
    ┣ 8_hage_5
    ┣ 8_hige_1
    ┗ 9_hige_5
~~~

* pcd を使って 6_hige_5 ディレクトリへ移動してみます

~~~bash
$ pcd

QUERY>                                                              (1/29) [1/1]
0_hage_1/
0_hige_3/
0_hige_4/
1_hage_4/
1_hage_6/
1_hoge_2/
2_hage_4/
2_hoge_8/
3_hage_2/
3_hage_8/
3_hige_4/
3_hoge_5/
4_hage_0/
4_hige_9/
4_hoge_9/
5_hage_2/
5_hoge_4/
6_hage_4/
6_hage_8/
6_hige_5/
6_hige_6/
6_hoge_2/
6_hoge_7/
7_hage_0/
8_hage_1/
8_hage_2/
8_hage_5/
8_hige_1/
9_hige_5/

QUERY> hige_5                                                         (1/1)[1/1]
6_hige_5/

$ ruby -e "p Dir.pwd.split('/').last"
"6_hige_5"
~~~

## 上記操作のアニメーションGIF

* pcd コマンドを実行した後にカーソルが妙な動きをしてますが、アニメーションGIF作成時の問題で、
    実際に操作しているときは妙な動きはしてません。

![pcd.gif](https://qiita-image-store.s3.amazonaws.com/0/43480/fe969939-c0c4-6b69-d730-fafc8f1af387.gif)
Swiftコンパイラの暴走バグ回避 (Xcode6 Beta5)


そのうち治ると思うのですが一応メモしておきます．

ループをアンロールしてみて気づいたのですが，例えば：

```swift
var c = [b[0] + 1, b[1] + 1, b[2] + 1, b[3] + 1, b[4] + 1, b[5] + 1, b[6] + 1, b[7] + 1]
```
とか

```swift
var v = [0] + c[1] + c[2] + c[3] + c[4] + c[5] + c[6] + c[7]
```
のようなコードを書くとコンパイル時間がありえないほど（指数オーダー？）長くなってしまいます．
なんだかよく分かりませんが， ~~識別子かリテラル以外の式が~~ 項としていっぱい並ぶとAST的にダメっぽいです．
今のところ，せいぜい3つの項にしておいたほうが無難なようですね．4つだと少し重くなります．



```swift
var v = c[0] + c[1] + c[2] 
v += c[3] + c[4] + c[5]
v += c[6] + c[7]

```
としておくと一瞬でコンパイルできます．

＜追記＞
リテラル使ってもこういうのはダメですね．

```swift
var v = Int(2 + 1 + 1 + 4 + 4 + 2 + 2 + 2 + 4)
```
IPアドレスを固定するとvagrant upする度にネットワークカードがどんどん増えてく

# 環境
windows8.1 pro
Vagrant 1.6.3
virtualbox 4.3.14r95030

# 困ったこと
以下のような設定をしてIPアドレスを固定しようとするとvagrant upやvagrant reloadする度にネットワークカードが増えていく・・・

``` Vagrantfile
config.vm.network 'private_network', ip: '192.168.21.2'
```

# 原因
VagrantはVirtualBoxのインターフェースから同じセグメントのネットワークカードを検索しそれを利用しようとするが、
存在しない場合にVagrantが作成しそれを利用する。

この時に作成されるネットワークカードに正しく設定が反映されていないため、次にvagrant up等を行った際に、また存在しない物としてまた作成する・・・というのを繰り返しているようです。

# 解決方法(暫定)
## ネットワークカードの状態を表示する
`ipconfig /all`
おそらく169.254.*.*というアドレスが割り当てられているはず。
イーサネットアダプターの名前(ローカル エリア接続 2とか)を覚えておきましょう

>ちなみにこれは有効なIPアドレスが無いときに自動で割り当てられるアドレス
DHCPサーバーが死んでる場合などに自動で割り当てられます


VirtualBox上での名前も確認しておきます。GUIの設定から確認してもOKです。
`VBoxManage list hostonlyifs`
> VBoxManageコマンドはVirtualBoxのインストールフォルダにあります

設定したいアダプタのVirtualBox Host-Only Ethernet Adapter [#2～]のようなやつを覚えておきましょう

## ipv6を無効にする
チェックを外しておく
![ipv4.png](https://qiita-image-store.s3.amazonaws.com/0/44786/4e8e98fc-93b3-628f-d4b4-82d9f71bff3f.png)

## IPアドレスの割当を確認する
以下のコマンドで割り当てを確認します。
`netsh interface ipv4 show ipaddresses`
![before.png](https://qiita-image-store.s3.amazonaws.com/0/44786/c7ed3b93-8d93-6d39-e0a4-a32f4dc5a0ff.png)

## IPアドレスを割り当てる
host-onlyネットワークにIPアドレスを指定する
以下のコマンドでネットワークカードにIPを指定します。
`VBoxManage hostonlyif ipconfig "VirtualBox Host-Only Ethernet Adapter #2" --ip 192.168.21.250 --netmask 255.255.255.0`

## IPアドレスが割り当てられたかを確認します
netsh interface ipv4 show ipaddresses
![after.png](https://qiita-image-store.s3.amazonaws.com/0/44786/0096d808-9269-0e13-0a25-1620e1be52d0.png)

この状態で暫く放置すると仮承諾が設定に変わり169.254.*.*が消え静的アドレスのセットはこれで完了です。

# 蛇足
そもそも静的IPのアドレスはすぐにはIPCONFIGなどで確認出来ないということが理解出来ていませんでした。
`静的アドレスせっと！→反映されねぇ！→むきーもう一回だ！`
のように何度もセットしたことで正確なIP指定が出来ておらず更に泥沼にハマっていました。
IPの割り当て設定を確認しながら設定していくことが重要だなと学習しました

# その他
変なIPアドレスが設定されてしまった場合は以下のコマンドで削除できます
`netsh interface ipv4 delete address name=75 192.168.21.2`
Window7でRStanのインストール時にはまったところ

はじめてQiitaで投稿させていただきます。

## モチベーション
今から少し前のことになりますが、
仕事でRを使っていて、stanを使ってみたくなりました。
理由は仕事でMCMC使えたら面白そうですし、今後の仕事でも統計モデリングが重要になると思ったからです。
（結果的に、この時点で所属していた会社では使いませんでした :droplet: ）


## Stanについては
[Stan: Project Home Page](http://mc-stan.org/)

基本的に
https://github.com/stan-dev/rstan/wiki/RStan-Getting-Started
の通りに行えばいいと思います。

他にも説明や手順などを丁寧に記載したブログが多数ありますので、
詳しくはそちらも参照されたほうがいいです。

## はまった点
以下、たぶん関係したことです。
・Rは3.0.2にバージョンアップしたほうがいいです。
・失敗したらRを再起動．RStudioではなく，"R"のほうで作業をしたほうがいいです。

Rtoolsをいれて、RからC++をコンパイルできるようにする。
rstanが依存している”Rcpp”、”inline”packagesを入れて、うまくコンパイルできるかどうか試す。

RStanをinstallする。
CYGWIN worning が出たら環境変数の設定の処方箋を試す。


### 環境情報
R version 3.0.2 (2013-09-25)
win7 の 32-bit
rstan_2.0.0 Rcpp_0.10.5 inline_0.3.13 devtools_1.3