OmniAICreator/Qiita-1.07M huggingface dataset:
Perl, Python 及び Ruby スクリプトにおける正しいshebangの書き方

Unix系OSでは、スクリプトの`#!`から始まる一行目(shebangと呼ばれる)によって、起動するインタプリタを指定することができる。以下は[Wikipedia](http://ja.wikipedia.org/wiki/%E3%82%B7%E3%83%90%E3%83%B3_%28Unix%29)から拝借した例である。

```sh:example1.sh
#! /bin/sh
echo 'Hello world!'
```

このshebangにはOSによって制約があったり解釈がまちまちであったりといろいろと厄介なことが起こる。

 - [本の虫 : Shebangという謎な事実上業界標準について](http://cpplover.blogspot.de/2013/08/shebang.html)
 - [Stack Overflow : how to use multiple arguments with a shebang (i.e. #!)?](http://stackoverflow.com/questions/4303128/how-to-use-multiple-arguments-with-a-shebang-i-e)
 - [Stack Overflow : Perl: Shebang (space?) “#! ”?](http://stackoverflow.com/questions/10197690/perl-shebang-space)
 - [The #! magic, details about the shebang/hash-bang mechanism](http://www.in-ulm.de/~mascheck/various/shebang/)

それはさておき、Rubyを起動するには、

```ruby:example1.rb
#! /usr/bin/ruby
puts 'Hello world!'
```

のように書かれるが、Rubyが`/usr/bin/ruby`にあるとは限らない。システムによってはひょっとすると`/usr/local/bin/ruby`にあるかもしれない。この問題を避けるために、しばしば`env`コマンドが使われる。

```ruby:example2.rb
#! /usr/bin/env ruby
puts 'Hello world!'
```

これは大多数の環境で上手く動くと思われるが、しかし世の中には`/usr/bin/env`が存在しないようなOSが存在する。([卜部昌平のあまりreblogしないtumblr : #!/usr/bin/env](http://shyouhei.tumblr.com/post/587310084/usr-bin-env))

結論として、こんな風に書くと良いらしい。([Ruby 1.8.7 リファレンスマニュアル : Rubyの起動 ](http://docs.ruby-lang.org/ja/1.8.7/doc/spec=2frubycmd.html))

```ruby:example3.rb
#! /bin/sh
exec ruby -S -x "$0" "$@"
#! ruby
```

起動された`sh`は2行目の`exec`でRubyに飛び、Rubyは3行目までを読み飛ばすという寸法である。

同じことをPythonでは以下のようにする。([effbot.org : How do I make a Python script executable on Unix?](http://effbot.org/pyfaq/how-do-i-make-a-python-script-executable-on-unix.htm))

```python:example.py
#! /bin/sh
""":"
exec python "$0" ${1+"$@"}
"""

__doc__ = """The above defines the script's __doc__ string. You can fix it by like this."""
```
`sh`にとって2行目は`:`なので無害、3行目の`exec`でPythonに飛び、Pythonは2行目から4行目までを文字列リテラルとみなす、という塩梅である。

一方、Perl使いはこうした。([The Magic Perl Header](https://pts.github.io/Magic.Perl.Header/))

```perl:example.pl
#! /bin/sh
eval '(exit $?0)' && eval 'PERL_BADLANG=x;PATH="$PATH:.";export PERL_BADLANG\
;exec perl -x -S -- "$0" ${1+"$@"};#'if 0;eval 'setenv PERL_BADLANG x\
;setenv PATH "$PATH":.;exec perl -x -S -- "$0" $argv:q;#'.q
#!perl -w
+push@INC,'.';$0=~/(.*)/s;do(index($1,"/")<0?"./$1":$1);die$@if$@__END__+if 0
;#Don't touch/remove lines 1--7: https://pts.github.io/Magic.Perl.Header
```

**追記 (2015/10/21)**

上記のPythonの例は[pep257](https://pypi.python.org/pypi/pep257)に引っかかるようだ。なので、このチェックをすり抜けるようにしてみた。

```python:example2.py
#!/bin/sh
""":" .

exec python "$0" "$@"
"""

__doc__ = """
The above defines the script's __doc__ string. You can fix it by like this."""
```
Visual Studio で表示中のファイルをソリューションエクスプローラーに同期する設定

Visual Studio と Eclipse どちらでも、エクスプローラーにあるツールバーの矢印ボタンを押せば、表示中のファイルの場所をエクスプローラー上で表示してくれます。

![2014-06-21_16h01_44_062114_050239_PM.jpg](https://qiita-image-store.s3.amazonaws.com/0/46109/ec719bce-4d61-03da-e2d2-4bbd1ba53fb1.jpeg)　　![2014-06-21_16h34_00_062114_045917_PM.jpg](https://qiita-image-store.s3.amazonaws.com/0/46109/24c0c766-c593-eb62-559c-90fef9975c9c.jpeg)

__ところが Visual Studio と Eclipse ではこのボタンの挙動が少し異なり__、Eclipse ではボタンを押したら、表示されたファイルはエクスプローラーに同期されるようになりますが、 __Visual Studio ではボタンを押した時のみ同期される__仕組みであり、別のファイルを表示してもエクスプローラーは同期してくれません。個人的には Eclipse の方の挙動が好きです。

Visual Studio には常に同期する機能はオプションで設定できるようになっていて、 Tools > Options... を開いて __Projects and Solutions > General__ の __Track Active Item in Solution Explorer__  にチェックを入れると、表示が同期されるようになります。

![2014-06-21_15h58_28_062114_050108_PM.jpg](https://qiita-image-store.s3.amazonaws.com/0/46109/eb182c58-9d8f-af52-926f-2385c2b174d1.jpeg)
IOS8 アプリ開発日誌

## prolog

Appleの新言語Swiftを利用してIOS8で動作するアプリを完成するまでの開発日誌です。
本人もIOSアプリ未経験者なので初級的な内容となるかと思いますが知識共有の意味でこれから連載しますのでよろしくお願いいたします。

## xcode

+ [IOS8アプリ開発環境構築](http://qiita.com/kilhyungdoo/items/c8774a794c7855c260fd)
+ [
xcode6 beta2 + github でソース管理 その1(リモートリポジトリにソースをアップロード)](http://qiita.com/kilhyungdoo/items/f645187deb2bcee03a28)
+ [
xcode6 beta2 + github でソース管理 その2(リモートリポジトリからXcodeにソースをダウンロード)](http://qiita.com/kilhyungdoo/items/7bce28780fc8cd3ee0e8)
+ [xcodeにiOS Frameworkを追加する方法](http://qiita.com/kilhyungdoo/items/93662c81751b669b1e3d)

## cocoa

+ [Single View Application Project - ViewController.swiftの解説](http://qiita.com/kilhyungdoo/items/faf19ffa38eb8a1e6756)

## swift

+ [変数定義、引用](http://qiita.com/kilhyungdoo/items/ac45c54c79114f0254eb)
+ [ios8 beta5 変更点](http://qiita.com/kilhyungdoo/items/fdb5314d04beee1c7060)


## アプリ例

+ [twitterアプリ作成](http://qiita.com/kilhyungdoo/items/dcdcf9cecea6d78f1093)

## その他

+ [おすすめSwift講座Youtube動画まとめ](http://qiita.com/kilhyungdoo/items/87925af62d0f4e6b7dd7)
IOS8アプリ開発環境構築

## 必要なもの

+ Apple Developer ID　(ユーザー登録必須)
+ Mac

## xcode6のインストール

iOS Dev Centerページに移動し、ログインする。
https://developer.apple.com/devcenter/ios/index.action

iOS 8 beta 2タブに切り替え、xcode 6 beta 2をダウンロードする。
※ 約2.5GB　wifi環境で40分程度でダウンロード完了

![スクリーンショット 2014-06-21 12.09.37.png](https://qiita-image-store.s3.amazonaws.com/0/46268/7659a909-6a65-306b-a7ca-4a51970d3c8b.png)

ダウンロードしたxcode_6_beta_2.dmgをダブルクリックでインストールモーダル表示。
ApplicationフォルダにXcode6-beta2をドラック。

![スクリーンショット 2014-06-21 16.34.45.png](https://qiita-image-store.s3.amazonaws.com/0/46268/77793dfc-186b-38f4-73d5-0acf6a31b844.png)

xcode6がアプリケーションフォルダに展開される。展開後の容量：5.16GB
アプリケーションフォルダを開き、Xcode6-Beta2アプリをダブルクリック。
確認ページから開くをクリック
![スクリーンショット 2014-06-21 16.44.47.png](https://qiita-image-store.s3.amazonaws.com/0/46268/61b93156-5586-d9f9-573e-d7566d4c036b.png)

アプリインストール同意画面からAgree
![スクリーンショット 2014-06-21 16.49.08.png](https://qiita-image-store.s3.amazonaws.com/0/46268/1168c88d-c4a0-10cf-d22a-1c014723458d.png)

Xcode6 Beta2インストール完了！！
![スクリーンショット 2014-06-21 16.53.23.png](https://qiita-image-store.s3.amazonaws.com/0/46268/5002e7db-2c73-63ca-dd70-e9108603956f.png)

これでSwiftが使える環境が整えました。
お疲れさまでした！！


[IOS8アプリ開発日誌掲載中！！](http://qiita.com/kilhyungdoo/items/087dcbf971ac5e05d3f0)
Sphinx(latex→PDF)で余計な空白ページを消す方法

LaTeXのjsbookクラスでは、各章のタイトルが奇数ページから始まるように空白ページを自動的に入れてくれる。

製本前提の印刷ならこれで構わないが、主にPDFで見る人向けの場合は「何、このやたら多い空白ページ？」と言われてしまう。

そういう時は、``latex_elements``に下記を追加する。

```lang:conf.py
...
latex_elements = {
...
'extraclassoptions': 'openany',
...
}
```

もっとお手軽に、下記のようにすれば、本のような装丁ではなくレポート形式の印刷で出てくれますので、こちらのほうがいいかも。

```lang:conf.py
latex_elements = {
...
'extraclassoptions': 'report',
...
}
```
WindowsでSass&Compassの導入手順

# Rubyインストール

まずは、現在ルビーがーインストールされているからを
コマンドラインから確認

```
ruby -v
```

以下からインストラーをダウンロード
http://rubyinstaller.org/downloads/

インストールを実行する。
オプションにチェックを入れると環境変数 PATH の設定もインストーラーが行ってくれる。

インストールが完了したら、確認。

コマンドラインから 確認

```
ruby -v
```

# Sassのインストール

まずは現在インストールされているか確認

```
sass -v
```

インストールは以下のコマンドにて

```
gem install sass
```

sassコマンドにてバージョンを確認

```
sass -v
```

# Sassのアップデート

まずgem をアップデート

```
gem update --system
```

Sassのアツプデート

```
gem update sass
```

# Compassのインストール・アップデート

```
gem install compass
```

```
compass -v
```

```
gem update compass
```
LT資料 (夏のDNS祭り 2014 ～入門セミナ＆ハンズオン～)


* [夏のDNS祭り 2014 ～入門セミナ＆ハンズオン～ - connpass](http://rack.connpass.com/event/7024/)
* 2014/07/05(土) 17:40 ~　17:50

## [Tips - MindMap](http://www.mindmeister.com/359570180/)

---

## Web系,社内インフラ担当向けTips紹介

<br>

### @tukiyo3

* 去年からWebサーバ保守と社内インフラ担当
* そこで得たDNS関連のTipsを紹介します

---

Tips 1/5


## DNSサーバのメリット

1. .ssh/configが短くかける
  * HostName行が不要
1. 全サーバにhosts記入の運用から開放
1. 外からと同じアドレスでアクセス可能
1. サイト閲覧ブロック
  * DNSサーバで特定サイトを別IP指定

---

## 簡単なキャッシュDNSサーバ

<br>

## powerdns-recursor

* /etc/hosts に記述してrestartだけ!

---

## 
簡単
DNSサーバ
## tinydns


記述がちょっと分かりづらい

    +       : lookup domainname -> ip
    @ mx    : smaller num is high priority
    ' txt   : spf record
    ^ PTR   : lookup ip -> domainname
    C CNAME : alias

---

Tips 2/5

## 日本語ドメイン

* Googleの検索順位がリンク数から「誰が書いたか」重視に変更のため
  * 日本語ドメインでSEO対策になるかも！？

* URLの記述をxn--から始まる英数字に変換
  * ﾕﾆ(o´∀｀)σ)´Д`；)ﾌﾟﾆ

---

## Apache設定例

    <VirtualHost *:80>
        ServerName xn--88jzah.jp
    
---

Tips 3/5

## DNSによるメールの<br>トラブル

---

## メールが届かない

spamhausに登録されると<br>
hotmail,icloudに届かない

<br>

## 確認方法

```bash:確認方法
dig +short 55.44.33.22.zen.spamhaus.org
```

応答があれば登録されている<br>
(22.33.44.55は自身のサーバ)<br>

---

## 迷惑メールになる

<br>

## 原因

* spf登録外のIPからメールを送信していた

---

Tips 4/5

# 監視

---

## メール監視
<br>
## pflogsumm

* メールが届かなかったときのエラー
* メール送受信数の把握
  * 先日、自動返信し合っている問題を発見

---

## ログ全般監視
<br>
## logwatch

  * サーバの状態が把握できます
  * DNS問い合わせログなどを表示

---

## リアルタイム監視
<br>
## tenshi

  * 特定のログ出力があれば即座にメール通知

---

# 障害検知

* メールだと埋もれてしまう

---

## 重要なメール受信時自動で携帯に電話

  * (nagios + procmail + Asterisk + 050plus)

---

Tips 5/5

## whois

* 様々な情報を検索可
  * グローバルIPの範囲
  * 所属する人名一覧
  * 電話番号、メールアドレス、住所

* whois代理公開 (お名前.com)

* whois.jpが2015年にUTF8対応。

---

# その他Tips

<a href="http://qiita.com/tukiyo3/items/18411315a05b80e574bc" target="qiita">Tips一覧</a>
のリンク説明
MindMapのリンクをクリックすると個別記事に飛びます

---

## cli_searcher実演

    ./cli_searcher --check_openresolver
    ./cli_searcher --check_globalip
    ./cli_searcher --dig_color slashdot.jp
    ./cli_searcher --dig_all slashdot.jp./cli_searcher --dig_all slashdot.jp
    ./cli_searcher --whois_jp_contact yahoo.co.jp
    ./cli_searcher --whois_jp_contact sakura.ad.jp
    ./cli_searcher --jobtalk
---

ご清聴ありがとうございました。
C# プロパティのSetアクセサを使わないという提案

C#のプロパティって便利ですよね。

VisualStudioでpropまで打ってTab,Tabってやれば

```c#
public int MyProperty { get; set; }
```

まで自動で作ってくれるので楽なんですけど、このプロパティのsetアクセサを（Binding目的以外で）使うのをやめて、必要な場合はSetHoge(int value)みたいなメソッドにしませんかという提案。

以下理由です。

##IDEで追いづらい
VisualStudioで「すべての参照の検索」から、setしてる箇所だけを抽出することができない。（実は方法ある？）

setアクセサを別メソッドにしておけば、そのメソッドに対する参照だけ抽出できるので
そのほうが管理しやすいと思う。

##Bindingで更新されるものと区別がつかない
xaml系アプリに限った話になるけど、プロパティはBinding用のI/Fとしても使われるので、setアクセサがpublicになっていたときに、それがViewからバインド経由で更新するためなのか、コードで更新するためなのかがわからない。

setアクセサがメソッドになっていれば、それがBindingから更新されるものではないことが一目でわかる。


##そもそもオブジェクトが不変でない
プロパティに外から値をsetするような設計は、そもそもあまり望ましくない。
理想的には、コンストラクタで値を渡した後はもう不変の状態にしておきたい。

不変なプロパティを↓のようにprivateなsetアクセサで表現することもあると思うが、

```c#:Person.cs
public string Name { get; private set; }

public Person(string name)
{
    this.Name = name;
}
```

不変だということを保証するなら、本当は↓のように書くほうが良いと思う（ちょっと冗長になるけど）。

```C#:Person.cs
private readonly string _name;

public string Name
{
    get
    {
        return _name;
    }
}

public Person(string name)
{
    this._name = name;
}
```


##まとめ

+ プロパティはBindingで使用する場合のみsetアクセサを設ける
+ クラス外から値を更新したい場合はSetメソッドで表現する
+ 不変な値はreadonlyフィールドに保持し、getアクセサのみを設ける

というのはいかがでしょうか（弱気）
【php】フォルダの生成と削除による排他制御


```php:mutex.php
<?php

/*

参考

PHP ～排他制御～
http://www.web-sky.org/program/php/php_mutex.html

*/

define("limit",15);

class mutex{

	// @brief ミューテックス名
	private $name;
	/// @brief ロックインターバル
	private $interval;
	/// @brief 内部で使用するロック名
	private $lock_name;
	//number of trials
	private $ctr=0;

	function __construct($name, $interval) {
		$this->name = $name;
		$this->interval = $interval;
		//絶対パスでないとダメ
		$this->lock_name = "C:/xampp/htdocs/sample/tmp/tmp___".$name."___.lock";
	}

	function __destruct() {
		$this->unlock();
	}

	public function get_ctr() {
		return $this->ctr;
	}

        //ロックする
	//limit回失敗するまでロックを試みる
	public function lock() {

		while (1)
		{
			$this->ctr+=1;
			if (@mkdir ($this->lock_name, 0777))
			{
		  		break;
			}
			else
			{
				if($this->ctr==limit)
				{
					//limit回失敗
					//ロック失敗
					return true;
				}
				sleep ($this->interval);
			}
		}

		//ロック成功
		return false;
	}

        //ロックする(ロックを試みて失敗したら直ぐに戻る)
	public function trylock()
	{

		if(is_dir($this->lock_name))
		{
                 	//ロック状態(フォルダが存在する)
			//ロック失敗
                 	return true;
                }
		else
		{
                 	if(@mkdir ($this->lock_name, 0777))
			{
				//ロック成功
                          	return false;
                 	}
		 	else
		 	{
		  		//ロック失敗
		  		return true;
		  	}
		}
	}
	
	//ロック解除
	public function	unlock()
	{

		if (@rmdir($this->lock_name))
		{
			//ロック解除成功
			return false;
		}
		//ロック解除失敗
		return true;
	}

}

?>

```


```php:test.php

<?php

include "mutex.php";

//排他制御
$haita=new mutex("test",2);
//ロックを1回だけ試みる
$flag_try_lock=$haita->trylock();

 if($flag_try_lock)
 {
  //ロック失敗
  //ロックをlimit回試みる
  $flag_lock=$haita->lock();
  $ctr=$haita->get_ctr();
  echo "Number Of Trials:".$ctr."<br/>\n";
 }
 else
 {
  $flag_lock=false;
 }

 if($flag_lock)
 {
  echo "Lock Failure!  Server too busy! Please try again!<br/>\n";
 }
 else
 {
  echo "Lock Success!<br/>\n";
 }

 //排他制御 ロック解除
 if($haita->unlock())
 {
  echo "Unlock Failure!<br/>\n";
 }
 else
 {
  echo "Unlodk Success!<br/>\n";
 }

?>

```


##環境
OS:windows7 32bit (自作機)
xampp windows版1.74
PHP Version 5.3.5

##解説
C:/xampp/htdocs/sample/mutex.php
C:/xampp/htdocs/sample/test.php
とする。
フォルダ生成でロックし、フォルダ削除でロック解除する。
PHP ～排他制御～
http://www.web-sky.org/program/php/php_mutex.html
にあったものを改造した。

 __今まではうまくいっていると思っていましたが読み込み途中にブラウザを閉じられた場合に unlock () されない場合が存在するようです。これは C++ にあるデストラクタがあれば問題ないと思われますが PHP にはそれが無いので回避する事は無理なようです。__

と作者が言っているが、phpにデストラクタが使えるようになったので、デストラクタでunlockすると、読み込み途中でブラウザが閉じられた時や、読み込み途中にLANケーブルが引っこ抜かれたときに対応できるはず。

しかし、phpは詳しくないので本当にこれで排他制御できるか自信がありません。
コメントください。

##関連
【php】destructでのrmdirでフォルダ削除失敗と対策 
http://qiita.com/kyoshiro-obj/items/7203c3e710c389ea99b0

##参考文献
PHP ～排他制御～
http://www.web-sky.org/program/php/php_mutex.html
railsでseedデータを簡単に取り込む



本記事の動作環境は以下の通りです。

```
ruby 2.1.2p95
rails 3.2.17
```

seedデータの取り込みがカオスになっていた問題を解消した事例を紹介します。

`db/seed_datas/`に配置したcsvをシードデータとしてデータベースに取り込んでいます。

例えばこんなcsvをdelete-insertしたい場合

| id | name |
|:---|-----:|
| 1  |   ほげ|
| 2  |   ふが|

以前は各テーブルごとに下のような記述をして取り込んでいました。

```ruby:seeds.rb
require 'csv'

TestTables.delete_all
test_tables_csv = CSV.readlines("db/seed_datas/test_tables.csv")
test_tables_csv.shift # 1行目はフィールド名なのでとばす
test_tables_csv.each do |row|
  record      = TestTables.new
  record.id   = row[0]
  record.name = row[1]
  record.save!
end
```

テーブルひとつひとつに対して毎回この記述を書くのは面倒ですし、
事故も発生するので、下のようにすっきり記述するためのモジュールを作りました。

```ruby:seeds.rb
include SeedModule

SeedModule.import("test_tables", delete_all: true)
```

モジュールの中身はこんな感じ
（実際にはこの2倍くらいコードがあるんですが外部公表用に削っています。）

```ruby:seed_module.rb
require 'csv'

module SeedModule

  DEFAULT_ENCODING  = 'utf-8'
  DEFAULT_SEED_PATH = './db/seed_datas/'

  @@encoding     = DEFAULT_ENCODING
  @@seed_path    = DEFAULT_SEED_PATH
  @@table_name   = nil
  @@model        = nil

  def self.import(table_name, before_options = {}, after_options = {}, import_options = {})
    @@table_name = table_name
    @@model      = Module.const_get(table_name.camelcase)
    @@encoding   = import_options[:encoding] || DEFAULT_ENCODING

    exec_options(before_options, :BEFORE) if before_options.present?

    import_all

    exec_options(after_options, :AFTER) if after_options.present?
  end

  def self.exec_options(options, timing)
    options.each do |option, value|
      case option
        when :truncate
          next unless value # valueがtrueの場合のみ実行する
          sql = "TRUNCATE TABLE "+@@table_name+";"
          ActiveRecord::Base.connection.execute(sql)
          msg = "全てのレコードを削除:"+sql
        when :delete_all
          next unless value # valueがtrueの場合のみ実行する
          @@model.delete_all
          msg = "全てのレコードを削除"
        when :delete_before
          @@model.delete_all(["id <= " + value.to_s])
          msg = "ID#{value}以下のレコードを削除"
        else
          raise "[#{@@table_name}]#{timing} : 存在しないオプション #{option}"
      end

      puts "[#{@@table_name}]#{timing} : #{msg}"
    end
  end
  private_class_method :exec_options

  def self.import_all
    rows, fields = retrieve_rows_and_fields_from_csv

    rows.each do |row|
      next if row[0].blank? # IDの列が空の行は無視する
      record = @@model.find_or_initialize_by_id(row[0])
      fields.each_with_index do |field, i|
        next if field.blank?
        record.send(field+"=", row[i])
      end
      record.save!
    end

    puts "[#{@@table_name}]Import : #{rows.size} records"
  end
  private_class_method :import_all

  def self.retrieve_rows_and_fields_from_csv
    rows = CSV.read(@@seed_path + @@table_name + ".csv", encoding: @@encoding)
    # CSVの１行目からフィールド名を取得して取り除く
    fields = rows.shift

    return [rows, fields]
  end
  private_class_method :retrieve_rows_and_fields_from_csv

end
```
Clojureによる遺伝的アルゴリズムの実装

[マッチ箱の脳(AI)](http://www.amazon.co.jp/%E3%83%9E%E3%83%83%E3%83%81%E7%AE%B1%E3%81%AE%E8%84%B3-AI-%E2%80%95%E4%BD%BF%E3%81%88%E3%82%8B%E4%BA%BA%E5%B7%A5%E7%9F%A5%E8%83%BD%E3%81%AE%E3%81%8A%E8%A9%B1-%E6%A3%AE%E5%B7%9D-%E5%B9%B8%E4%BA%BA/dp/4883170802)のお題をClojureで解いてみる。  
まずは一番初めの遺伝的アルゴリズム(Genetic Algorithm)  

マッチ箱は使わないので、以下のような仕様でプログラムを作ってみます。  

* 遺伝子の世代交代を繰り返し三択問題を10個解くのに優良な遺伝子を残すプログラム
* 三択問題の解答はあらかじめ定数で与えておく。
* 各個体は三択問題への解答と対応する数字を10個遺伝子として持っている。
* 問題に対して100点満点の解答を行う個体が出現するまで世代交代を繰り返し、繰り返した個体数を得る。

世代交代は以下のように行うものとします。

* 各個体の採点を行い、成績上位の2個体が親となる。
* 親の各個体の遺伝子を適当な位置で分割し、それぞれ交換したものを子供とする。(2個体ができる)
* 子供の遺伝子は10個の中から適当なものが突然変異する。
* 成績順位下位の2個体は淘汰される。(子供と入れ替わる)

実際作ってみたコードはこんな感じ

```clj
; 正解
(def right-answers [0 2 1 2 1 2 1 2 0 0])
 
; 個体を作る
(defn create-individual []
  (repeatedly 10 #(+ (rand-int 3))))
 
; 個体の採点をする
(defn score-generic [gen]
  (* 10 (count (filter true? (map = gen right-answers)))))

; 遺伝子を突然変異させる
(defn mutate [gen]
  (let [n (rand-int 11)]
    ; nが10の場合は突然変異しない
    (if (= n 10) gen
      (assoc (vec gen) n (rand-int 3)))))

; 遺伝子の交叉を行う
(defn cross [p1 p2]
  (let [cross-point (+ 2 (rand-int 10))]
   (if (> cross-point 9) [p1 p2]
     (let [c1 (concat (take cross-point p1) (take-last (- 10 cross-point) p2))
      c2 (concat (take cross-point p2) (take-last (- 10 cross-point) p1))]
     [c1 c2]
     ))))

; 引数で与えられた各個体の採点を行い、世代交代を繰り返す。
; 成績順位の上位2個体が親となり最下位の2個体は淘汰される。
; 100点満点の個体が現れた時点で処理を終了し、世代数を返す
(defn generate [gens]
  (loop [gens gens generation 1]
    ; まず、成績順にソートする
    (let [sorted-gens (sort-by score-generic > gens)]
      ; 100点の個体がいたら世代数を返却する
      (if (= (apply max (map score-generic sorted-gens)) 100) generation
        ; 成績上位の2個体で交叉と突然変異を行い、子供の個体を二つ作り、成績下位の2個体と入れ替える
        (let [[c1 c2] (map mutate (apply cross (take 2 sorted-gens)))]
          (recur (-> (drop-last 2 sorted-gens)
                   (conj c1)
                   (conj c2))
                 (inc generation)))))))
```
100個の個体で試してみるには

```
=> (generate
     (repeatedly 100 create-individual))
```

で100点の個体を得るまでに世代交代を繰り返した数を返してくれる。
試してみると、generateに与える個体数が多いほど優良個体が現れるまでの世代交代の数は少なくなる傾向がある、ということがわかります。   
100万個くらいの個体を与えた時の計算速度が遅いのがちょっと気に入らない。
Light TableでClojureの関数ソースを見るショートカット

作れます♪

```clj
"alt-s" [:editor.sublime.selectNextOccurrence (:eval.custom "(with-out-str (clojure.repl/source __SELECTION__))"  {:verbatim true})]
```

をUser keymapに設定しておけば、
カーソル位置の関数のソースが`alt-s`でインライン表示されます。

ソース表示したい関数名に記号が入っている場合（zero?など）、`:editor.sublime.selectNextOccurrence`の部分では適切に選択できないので、自分で関数名の部分を選択してから実行する必要があります。
暗号文２

　う〜ん、最後掛けたのを割って、１足したのを掛けるってのがゴリ押し感満載だけど、オーダは線形分しかないからわりと耐久性があると思われる

```java:
public class Cryptography {
	
	long encrypt(int[] numbers) {
		//1 ~ 1000だから出来る方法
		//例えば、要素の中に０とかがあるとこの方法は無理
		//といっても、今回の問題で要素範囲は1~1000だし、かけ算する問題だからあまりそういったケースは無いと思われる。
		//負の値でも、１回掛けてもう一回割るだけなのできちんと正しい値に戻る
		long multiple = 1;
		int min = Integer.MAX_VALUE;
		for(int r = 0; r < numbers.length; r++) {
			min = Math.min(min, numbers[r]);
			multiple *= numbers[r];
		}
		multiple /= min;
		multiple *= (min + 1);
		return(multiple);
	}
	
	void doIt() {
		int[] numbers = {1, 1, 1, 1};
		System.out.println(encrypt(numbers));
	}
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		new Cryptography().doIt();
	}
}
```

・・・俺、なんで毎回ソート忘れんだろ（不思議）
jQuery Plugin パラメーターの代わりにdata属性で代用できるプラグイン


site: http://develo.org/jquery.dataExtend
GitHub: https://github.com/kamem/jquery.dataExtend

プラグインを複数のページなどで違う動作をしたい場合に
わざわざjsを用意して指定し直さないければいけないのが煩わしいと思っていたので
かわりにdata-*で指定したパラメーターを使うことができるjQuery プラグインを作りました。

[DEMO]
[DEMO]: http://github.develo.org/jquery.dataExtend/

仕様
-----
* 下記のようなプラグインがあった場合に

		$('.tab').tab{
			timer: 1000,
			num: 1,
			isSessionStorage: true
		};

* 下記のようにHTMLのdata属性を代わりに使うことができます。

		<p class="tab" data-timer="1000" data-num="1" is-session-storage="true">


使い方
-----
1. スクリプトの記述（プラグインの後にjquery.dataExtend.jsを読むこむ）

		<script src="js/jquery.js"></script>
		<script src="js/jquery.tab.js"></script>
		<script src="js/jquery.dataExtend.js"></script>

2. $('適応したいタグ').dataExtemd('プラグイン名');

		<script>
		$(function(){
			$('.nav').dataExtend('tab');
		});
		</script>

3. HTMLにdata属性を記述する（キャメルケースの場合「-」でつなげる）※ is-session-storage = isSessionStorage

		<p class="tab" data-timer="1000" data-num="1" is-session-storage="true">
whoisの使い方(.jpドメイン)

# 普通の使い方

```bash:ドメイン名から調べる
whois test.jp
```

```bash:IPアドレスから調べる
whois $(dig +short test.jp)
```

# IPアドレス割り当て範囲を調べる

```bash:
whois $(dig +short test.jp) | grep inetnum | tail -n 1
```

# 住所、電話を調べる

参考: [JPRS WHOIS表示変更について | 2014年 | JPドメイン名についてのお知らせ | 新着情報一覧 | JPRS](http://jprs.jp/whatsnew/notice/2014/20140319-whois.html)

* 2015年1月18日（日）にwhois.jprs.jpの結果がsjisからutf8に変更される。
* whois2013.jprs.jpは2015年1月18日（日）までの移行期間用デモサイト。2015年7月頃終了予定。

```bash:whois.jprs.jpを使う
# sjis
whois -h whois.jprs.jp test.jp
# 英語
whois -h whois.jprs.jp test.jp/e
```

```bash:whois2013.jprs.jpを使う
# utf8
whois -h whois2013.jprs.jp test.jp
# 英語
whois -h whois2013.jprs.jp test.jp/e
# TYPE指定
whois -h whois2013.jprs.jp "DOM test.jp"
whois -h whois2013.jprs.jp "DOM test.jp/e"
```

# 管理者連絡窓口,技術連絡担当者を調べる

```bash:whois.nic.ad.jpを使う
whois -h whois.nic.ad.jp $(dig +short test.jp)
```
シェルで glob 結果を事前に確認する方法

`bash` や `zsh` の一般的なキー割り当てだと `C-x g` (Control を押しながら x を押して Control を離して g) で展開結果を確認できます。

Tab キーだとコマンドライン中に展開されてしまいますが、`C-x g` だと確認だけ出来ます。

詳細は [シェルで glob 結果を事前に確認する方法](http://blog.n-z.jp/blog/2014-06-21-confirm-glob.html "シェルで glob 結果を事前に確認する方法") を参照してください。
競合サイトを探す (Gethoneybadger)

chrome拡張機能で[Gethoneybadger](https://chrome.google.com/webstore/detail/gethoneybadger/lghkpiminfjebgiflcclpkipidkkdikb/related)というのを発見した。

似たサイトの検索もできる。
自分のサイトでこれを使うと競合が見つかるでしょう。
RuboCop | Style/CaseIndentation IndentWhenRelativeTo

# RuboCop | Style/CaseIndentation IndentWhenRelativeTo

## 概要

RuboCopの「Style/CaseIndentation IndentWhenRelativeTo」警告について。

when のインデントを case と end どちらに合わせるかを設定します。

### 設定値一覧

|設定対象|設定値|内容|デフォルト|
|:-------|:-----|:---|:--------:|
|IndentWhenRelativeTo|case|whenをcaseに合わせてインデントする|○|
|IndentWhenRelativeTo|end|whenをendに合わせてインデントする|--|

## CaseIndentation IndentWhenRelativeTo

各設定値（braces, no_braces）での検証結果をまとめます。

### 検証プログラム

indent_when_relative_to.rb

~~~ruby
i = 1
rets = case i
       when 1
         print '1'
       when 2
         print '2'
       when 3..4
         print '3..4'
       end

print rets

rets = case i
       when 1
         print '1'
       when 2
         print '2'
       when 3..4
         print '3..4'
end

print rets

rets = case i
  when 1
    print '1'
  when 2
    print '2'
  when 3..4
    print '3..4'
end

print rets

rets = case i
when 1
  print '1'
when 2
  print '2'
when 3..4
  print '3..4'
end

print rets
~~~

### 実行結果 case の場合

.rubocop.yml

※明示的に設定しているが、デフォルト値なので何も設定しなくてもよい

~~~yaml
CaseIndentation:
  IndentWhenRelativeTo: 'case'
  IndentOneStep: false
~~~

~~~bash
$ rubocop
Inspecting 1 file
C

Offenses:

indent_when_relative_to.rb:25:3: C: Indent when as deep as case.
  when 1
  ^^^^
indent_when_relative_to.rb:27:3: C: Indent when as deep as case.
  when 2
  ^^^^
indent_when_relative_to.rb:29:3: C: Indent when as deep as case.
  when 3..4
  ^^^^
indent_when_relative_to.rb:36:1: C: Indent when as deep as case.
when 1
^^^^
indent_when_relative_to.rb:38:1: C: Indent when as deep as case.
when 2
^^^^
indent_when_relative_to.rb:40:1: C: Indent when as deep as case.
when 3..4
^^^^

1 file inspected, 6 offenses detected
~~~

### 実行結果 end の場合

.rubocop.yml

~~~yaml
CaseIndentation:
  IndentWhenRelativeTo: 'end'
  IndentOneStep: false
~~~

~~~bash
$ rubocop
Inspecting 1 file
C

Offenses:

indent_when_relative_to.rb:14:8: C: Indent when as deep as end.
       when 1
       ^^^^
indent_when_relative_to.rb:16:8: C: Indent when as deep as end.
       when 2
       ^^^^
indent_when_relative_to.rb:18:8: C: Indent when as deep as end.
       when 3..4
       ^^^^
indent_when_relative_to.rb:25:3: C: Indent when as deep as end.
  when 1
  ^^^^
indent_when_relative_to.rb:27:3: C: Indent when as deep as end.
  when 2
  ^^^^
indent_when_relative_to.rb:29:3: C: Indent when as deep as end.
  when 3..4
  ^^^^

1 file inspected, 6 offenses detected
~~~
楽しいパーティ２

　う〜ん。計算量省こうとしてミスった感があるなぁ・・・。ただのforにした方が見やすくてミスも少なそう。

```java:
import java.util.*;
public class InterestingParty_2 {
	
	int bestInvitation(String[] first, String[] second) {
		HashMap<String, String> hm = new HashMap<String, String>();
		for(int r = 0; r < first.length; r++) {
			hm.put(first[r], second[r]);
		}
		int[] count = new int[first.length * 2];
		for(int r = 0; r < first.length; r++) {
			for(int c = 0; c < second.length; c++) {
				if(r == c) continue;
				if(first[r] == first[c] || first[r] == hm.get(first[c])) count[r]++;
			}
			for(int c = 0; c < second.length; c++) {
				if(r == c) continue;
				if(hm.get(first[r]) == first[c] || hm.get(first[r]) == hm.get(first[c])) count[r + 4]++;
			}
			count[r]++;
			count[r + 4]++;
		}
		int ans = Integer.MIN_VALUE;
		for(int r = 0; r < count.length; r++) {
			ans = Math.max(ans, count[r]);
		}
		return(ans);
	}
	
	void doIt() {
		String[] first = {"s", "pro", "cob", "mon"};
		String[] second = {"pyth", "pyth", "ana", "pyth"};
		
		System.out.println(bestInvitation(first, second));
	}
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		new InterestingParty_2().doIt();
	}

}

```

　あ、ここおかしいとか遠慮なくどんどん突っ込んでくださると嬉しいです！（≧▽≦）b
count逐次最大値入れてきゃ、配列にしなくていいじゃん
俺馬鹿だぁ・・・
【まとめ】RMarkdown2で何が変わったのか？


もう**全てRMarkdownでいいんじゃないかな**、最近そんな気がします。

先日、[RStudio]()がv0.98.932に更新されて、公式ブログにてRMarkdown2への対応が[取り上げられて](http://blog.rstudio.org/2014/06/18/r-markdown-v2/)いましたね。旧RMarkdownから新しいRMarkdownで何が変わったのか、という点を個人的にまとめてみます。勉強不足（特にRの中身的な話）なところはコメントなどで指摘してくださると助かります。

細かいところは**習うより慣れろ**の精神でとにかく使ってみる、[公式ページ](http://rmarkdown.rstudio.com/)のマニュアルを読むなどしてください。最後にあげた参考ページもとても良いです。

## RMarkdownとは？

その名の通り、MarkdownでR言語のスクリプトの実行とコメントの記述ができる拡張子です。Rのスクリプトや出力結果、プロットした図とコメントを一括して記述できることに利点があると思います。

また、RStudioの機能を使えば、簡単に`.Rmd`から`.html`, `.md`への変換が可能です。なお、ここではRStudioの機能を使ったRMarkdownの話に限定しています。

ちなみに、RMarkdownで`.pdf`や`.docx`に変換する際には別途pandocをインストールしている必要があります。

## v1からv2での大きな変更点

1. `.Rprofile`の設定は読み込まれず、使用するパッケージや設定のための関数は`.Rmd`内で記述する必要がある。
1.  従来の`.Rmd`ファイルに加え（通常の書類とプレゼンテーション形式）、Shiny形式のファイルとテンプレートファイルから作成できるようになった。
    * `.Rmd`ファイルを新規作成したときにタイトルと著者名を任意で書けるようになった。
    * プレゼンテーション形式としてBeamerだけでなくHTML5に対応したiosslide、reveal.jsが選べるようになった。
1. knitしたときの出力結果として<del>`.md`が排除され</del>、`.html`, `.pdf`(LaTeX/PDF), （みんなだいすき（棒））`.docx`の3ファイルから選べるようになった。
    * `.html`での出力形式には通常のものに加え、
1. `.html`で出力したときに保存される図のパスの初期値が`figure/`以下でなくなった。

### [公式ページ](http://rmarkdown.rstudio.com/authoring_migrating_from_v1.html)で書かれていること
    
* 上付き文字の構文がちょっと変わった（`superscript^2^)`）
* LaTeXでのワードプレススタイルの数式構文はサポートされなくなった
* HTMLの構文内にあるmarkdownも表示される
* knitrキャッシュに関して... `inputfile_cache`のようにキャッシュファイルがそれぞれ作成するようにしなければいけなくなった。

### headerの変更

`.Rmd`ファイルを新規作成するとこんな感じ。こちらのheaderのoutput以下をいじくることでいろいろと変更ができます。

```{r}
---
title: "Untitled"
author: "author name"
output: html_document
---
```

ちなみに従来はこんなんでした。

```{r}
Untitled
===================================
```

### output: html_documentの設定

テーマ（CSS）やハイライトのスタイルを細かく指定できます。テーマを指定することで`.html`の見た目（CSS）が変更されます。使用可能なテーマは`default`, `cerulean`, `journal`, `flatly`, `readable`, `spacelab`, `united`, `cosmo`があります。

```{r}
---
title: "Untitled"
output: 
  html_document:
    theme: united
    highlight: tango
    toc: true
      toc_depth: 2
---
```

それぞれのテーマで表示するとこんな感じになります。英語だとばっちりきまりますね、日本語の場合は、次の俺俺CSSにしたほうが無難そうです...。

![rmarkdown-theme.png](https://qiita-image-store.s3.amazonaws.com/0/19462/899876d9-1355-62ca-6599-2bb21a691bb5.png "rmarkdown-theme.png")


俺俺CSSで表示させたい場合（styles.cssの読み込み）

```{r}
title: "Untitled"
output:
  html_document:
    theme: null
    highlight: null
    css: styles.css
```

細かいことは公式のマニュアル嫁。...時間があればまとめたいです。


## その他

### knitr開発者のYihui Xieさんによる[RMarkdown2の紹介](http://vimeo.com/94181521)



### 従来のRMarkdownがヨカッタヨ！という場合

コメントアウトで対応できる模様。

```{r}
<!-- rmarkdown v1 -->
```

## 参考

* [Using R Markdown – RStudio Support](https://support.rstudio.com/hc/en-us/articles/200552086-Using-R-Markdown)
* [R Markdown — Dynamic Documents for R](http://rmarkdown.rstudio.com/)
* [R Markdown v2](http://blog.rstudio.org/2014/06/18/r-markdown-v2/)
* [RStudioでKnit HTML](http://plaza.umin.ac.jp/~takeshou/R/RmdToHTML.html)
* [rmarkdownパッケージで楽々ドキュメント生成](http://kohske.github.io/R/rmarkdown/)
* [R markdown(knitr)パッケージのchunk optionまとめ - My Life as a Mock Quant](http://d.hatena.ne.jp/teramonagi/20130615/1371303616)
Tooltip のカスタマイズ

# 課題
browser (Chrome) での
　　title 属性 の tooltip　表示
　　jquery での tooltip 表示
ともに満足できる表現ではない。

[tooltip-000.html](https://github.com/katoy/tooltip/blob/master/tooltip-000.html) を chrome (35.0.1916.153 on MacOSX 10.9.3) で操作した アニメーション gif.

![tooltip-000.gif](https://raw.githubusercontent.com/katoy/tooltip/master/tooltip-000.gif)


## 次のことを実現したい。
- 表示フォントを指定する (等幅フォントに)
- 長い文字列を適宜 折り返し表示させる。
- 角丸にする。


# 対処

- css で .ui-tooltip に　等幅フォントを指定する。
- 折り返し方法を指定する。
- corner-round を指定する。

    .ui-tooltip {
      font-family: Osaka-mono, "Osaka-等幅", "ＭＳ ゴシック", monospace;
      font-size: 20px;
      width: 240px;
      word-wrap: break-word;
      border-radius: 6px;
      background: #FEFFED;
    }

~~(windows の IE で意図したような動作になるかは不明。 IE 環境がないので確認できない... )~~　(IE での動作は VirtualBox を使って確認した)  

[tooltip-001.html](https://github.com/katoy/tooltip/blob/master/tooltip-001.html) を chrome (35.0.1916.153 on MacOSX 10.9.3) で操作した アニメーション gif.
![tooltip-001.gif](https://raw.githubusercontent.com/katoy/tooltip/master/tooltip-001.gif)

IE10 で操作した アニメーション gif.
![tooltip-001-IE10.gif](https://raw.githubusercontent.com/katoy/tooltip/master/tooltip-001-IE10.gif)

IE11 で操作した アニメーション gif.
![tooltip-001-IE11.gif](https://raw.githubusercontent.com/katoy/tooltip/master/tooltip-001-IE11.gif)


# 付録

## bootstrap の tooltip とそのカスタマイズ

[https://github.com/katoy/tooltip/blob/master/tooltip-001-bootstrap.html] を chrome (35.0.1916.153 on MacOSX 10.9.3) で操作した アニメーション gif.
![tooltip-001.gif](https://raw.githubusercontent.com/katoy/tooltip/master/tooltip-001-bootstrap.gif)

## css だけで tooltip

[https://github.com/katoy/tooltip/blob/master/tooltip-001-css.html] を chrome (35.0.1916.153 on MacOSX 10.9.3) で操作した アニメーション gif.
![tooltip-001.gif](https://raw.githubusercontent.com/katoy/tooltip/master/tooltip-001-css.gif)

# 参考

- http://qiita.com/suzukima/items/be1ab67e0a9c9b11a8ef
> OSXのChrome/Safariにて、全角幅=2半角幅で等幅表示するためのCSS

- http://weblan3.com/css/word-break.php
> word-break - 文の改行の仕方について指定する

- http://www.cssportal.com/css-tooltip-generator/
> CSS Tooltip Generator
`Npm link` for real-time development of node dependencies


This is something that many people probably already know, but I'm going to write about it since I haven't seen anything really obvious on the internet.

Npm-link lets you use symbolic links from your package to anywhere else you choose to link to the package. You can run `npm link` in your package and then run `npm link my-package` in whatever project you want to use it.

That's it! Now for a silly project involving this...

# Example Time

Anyone who's seen my other articles probably knows that I like Github's Atom.io way too much for stupid reasons. Good news! There's a plug-in that I love using called `atom-spotify`, but I want to add some extra features to it. Let's get started.

##Setup

`apm` is the Atom Package Manager, which works almost exactly like `npm`. First, we will have to have our repository checked out: 

    $ git clone https://github.com/kimagure/atom-spotify

Once we have that checked out, we need to `cd` in and install dependencies like any node project.

    $ apm install
    Installing modules ✓

Next, link it in apm by running `apm link`. You'll see something like this:

	$ apm link
    /Users/jwoo/.atom/packages/atom-spotify -> /Users/jwoo/github/atom-spotify

Cool. Start up `atom` and take a look.

![atom-spotify in action](https://qiita-image-store.s3.amazonaws.com/0/42481/a2d61f38-d803-9be9-584b-77dffde01850.png "Screen Shot 2014-06-20 at 10.31.10 PM.png")

##Workflow

As you can see, it works! Now, if you change something in here, your changes will be automatically reflected in the `.atom/packages/atom-spotify` directory, so you can use this to make changes that you can see and use right as you make the changes!

E.g. if we change `Now Playing` and `Paused` to something silly like `ぷれいちゅうです〜` and `ポーズしていまーす〜` and save and reload (ctrl+opt+cmd+L), we will see that the status bar changes (i.e. with 'Show Play Icon As Text' on):

Before:
![Screen Shot 2014-06-20 at 10.39.55 PM.png](https://qiita-image-store.s3.amazonaws.com/0/42481/713522f7-1dda-d620-a7dd-14cf8cbdd18b.png "Screen Shot 2014-06-20 at 10.39.55 PM.png")


After:
![Screen Shot 2014-06-20 at 10.40.59 PM.png](https://qiita-image-store.s3.amazonaws.com/0/42481/18caa125-97db-b1af-0adb-622a6c8d0955.png "Screen Shot 2014-06-20 at 10.40.59 PM.png")

# Conclusion

Ain't that something? You can apply the same thing in your node projects, but with one big difference: `npm link` creates the symlink for use in projects but requires you link to the project specifically. `npm link` in `my-super-project` requires a corresponding `npm link my-super-project` in `my-other-project-that-depends-on-my-super-project`.

Now you can develop on multiple interdependent projects with no problem! Cool stuff.
pyramid で 設定ファイルを読み込むコマンドの作り方

# pyramid で 設定ファイルを読み込むコマンドの作り方

pyramidは実行する際に設定ファイルを引数として取るコマンドがデフォルトで提供されている。(e.g. pserve, proutes ...)
既存のコマンドは、設定ファイルに書かれた内容をparserで読み込む以上のことをしてくれている。

自分で新しいコマンドを作成する際にも同様のことを行いたい。
このようなときには、pyramid.paster.bootstrap以下の関数を使う。

## pyramid.paster.bootstrap

pyramid.paster.bootstrapは設定ファイルのパスを引数に取り、設定ファイルに書かれたエントリーポイントに登録されている関数(通常はappのmain())を実行してくれる。実行した後戻り値のappなどを持つ辞書を返す。

### bootstrapで呼ばれる関数

development.ini が以下の様に書かれている時

```
[app:main]
use = egg:qiita

```

setup.pyでエントリーポイントが登録されているので。

```
setup(name='qiita',
...
      entry_points="""\
      [paste.app_factory]
      main = qiita:main
      """,
...
)
```

qiita.main()が呼ばれる。

## 設定ファイルを読み込むコマンドを作成する方法

以下のようなファイル構造で設定ファイルを読み込むコマンドを作成する方法。
```
$ tree
.
|-- development.ini
|-- production.ini
|-- qiita
|   |-- __init__.py
|   |-- scripts.py
|   `-- views.py
`-- setup.py
```

qiita/scripts.pyに作成するコマンドの実装を書く。
bootstrapを利用して以下の様に作成。
今回はbootstrapの戻り値をprintするだけのコマンド。

```py
# -*- coding:utf-8 -*-
from pyramid.paster import bootstrap
import sys
import pprint


def sample(args=sys.argv):
    config_path = sys.argv[1]
    env = bootstrap(config_path)
    pprint.pprint(env)
```

setup.pyにconsole_scriptsの記述追加する。
qiita-sampleという名前で登録することにする。

```py
setup(name='qiita',
...
      entry_points="""\
      [paste.app_factory]
      main = qiita:main
      [console_scripts]
      qiita-sample = qiita.scripts:sample
      """,
...
)
```

setup.pyでインストールし直した後、登録したqiita-sampleが使えるようになる。
設定ファイルを指定してqiita-sampleを実行するとappをloadingした環境が手に入る。

```bash
$ python setup.py develop
$ qiita-sample development.ini
{'app': <pyramid.router.Router object at 0x10edd2990>,
 'closer': <function prepare.<locals>.closer at 0x10f30e440>,
 'registry': <Registry qiita>,
 'request': <Request at 0x10e140d90 GET http://localhost/>,
 'root': <pyramid.traversal.DefaultRootFactory object at 0x10ede9f10>,
 'root_factory': <class 'pyramid.traversal.DefaultRootFactory'>}
```


## 参考

* [pyramid.paster — The Pyramid Web Framework v1.5.1](http://docs.pylonsproject.org/projects/pyramid/en/latest/api/paster.html)
gruntで独自のタスクを追加する方法

http://gruntjs.com/creating-tasks#basic-tasks に書いてあった

gruntのタスク追加をする場合、大抵どこかで提供されているモジュールを使うが
どうしても独自の処理のタスクを追加したい場合は
自分で独自のタスクを`grunt.registerTask` に設定することができる。

```js
grunt.registerTask("タスク名", ["タスクの説明", ] "実行する関数")
```

## 使い方

```js:Gruntfile.js
  grunt.registerTask('task1', 'A sample task1', function() {
    grunt.log.writeln(this.name +  ': running');
  });
```

実行すると

```bash
% grunt task1
Running "task1" task
task1: running # grunt.log.writeln() で出力される部分
```

非同期処理が中に入る場合は `async()`で、コールバック関数を取得する

```js:Gruntfile.js
  grunt.registerTask('task2', 'A sample task2', function() {
    var self = this;
    var done = this.async();

    setTimeout(function() {
      grunt.log.writeln(self.name +  ': running');
      done();
    }, 1000);
  });
```

タスク内で使える関数は http://gruntjs.com/inside-tasks あたりに。
`grunt.log` などの関数は http://gruntjs.com/api/grunt あたりに書いてある。
CentOS6をzabbixで監視する

既存のzabbixサーバがある環境で、zabbix-agentをインストールして、監視対象とする。

## zabbix-agentのインストール
標準のyumリポジトリにはパッケージが無いので、zabbixリポジトリを使えるようにする。

```console
# rpm -ivh http://repo.zabbix.com/zabbix/2.0/rhel/6/x86_64/zabbix-release-2.0-1.el6.noarch.rpm
```

```console
# yum install -y zabbix-agent
```

サーバ側に併せて特定リビジョン入れるなら↓(Z,Xを合わせる)

```console
# yum install -y zabbix-agent-2.0.Z-X.el6
```

## 監視できるようにその他設定
### agentが見るサーバの設定
```bash:/etc/zabbix/zabbix-agentd.conf
85
86  Server=サーバのIP/Hostname
87
.
.
126
127 ServerActive=サーバのIP/Hostname
128
.
.
137
138 Hostname=自身のHostname
139
.
.
```

### zabbix-agentの起動と自動起動の設定
```console
# service zabbix-agent status
zabbix_agentd は停止しています
# service zabbix-agent start
Starting Zabbix agent:                                     [  OK  ]
# service zabbix-agent status
zabbix_agentd (pid 10113 10112 10111 10110 10109 10107) を実行中...

# chkconfig zabbix-agent --list
zabbix-agent    0:off   1:off   2:off   3:off   4:off   5:off   6:off
# chkconfig zabbix-agent on
# chkconfig zabbix-agent --list
zabbix-agent    0:off   1:off   2:on    3:on    4:on    5:on    6:off
```

### firewall(iptables)の設定
```bash:/etc/sysconfig/iptables
# ↓をREJECT行の前に入れておく
-A INPUT -p tcp --dport 10050 -j ACCEPT
```

あとは、サーバ側でホスト追加すればOK
コンテナが溜まってしまって全部消したい時

昨日からDockerを触り始めたのですが、何かと試行錯誤をしていると、ローカルにコンテナが大量にたまってきて、『まとめて消したいな・・・』って思う事があると思います。

![スクリーンショット（2014-06-21 9.34.39）.png](https://qiita-image-store.s3.amazonaws.com/0/23194/dc6e0de3-6186-a5e1-c0c1-814c95add57c.png)

そんな時は下記でまとめて消してしまいましょう

```bash
docker rm `docker ps -aq`
```

スッキリします（＾＾

![スクリーンショット（2014-06-21 9.46.18）.png](https://qiita-image-store.s3.amazonaws.com/0/23194/5142cb58-19eb-e7cf-2391-02a64087788d.png)
node.jsでローカルIPアドレスの取得


メモ

```:js
var os = require('os');
console.log(getLocalAddress());

function getLocalAddress() {
	var ifacesObj = {}
	ifacesObj.ipv4 = [];
	ifacesObj.ipv6 = [];
	var interfaces = os.networkInterfaces();
	
	for (var dev in interfaces) {
		interfaces[dev].forEach(function(details){
			if (!details.internal){
				switch(details.family){
					case "IPv4":
						ifacesObj.ipv4.push({name:dev, address:details.address});
					break;
					case "IPv6":
						ifacesObj.ipv6.push({name:dev, address:details.address})
					break;
				}
			}
		});
	}
	return ifacesObj;
};
```
Rで等方的ガウスカーネルを用いたNadaraya-Watsonモデルによる回帰

PRML図6.3と同様に、Nadaraya-Watsonモデル（カーネル回帰）により、以下を図示します。

- 回帰関数（条件付き期待値） $E[t|x]=\sum_{n=1}^Nk(x,x_n)t_n$
- 条件付き確率密度 $p(t|x)=\frac{1}{(2\pi\sigma^2)^{1/2}}\sum_{n=1}^{N}\exp(-\frac{(t-t_n)^2}{2\sigma^2})k(x,x_n)$
- 条件付き分散 $Var(t|x)=\sum_{n=1}^N(\sigma^2+t_n^2)k(x,x_n)-E[t|x]^2$

また、各観測点に関連付けられたカーネル関数 $k(x,x_n)$ も図示します。

なお、条件付き確率密度、条件付き分散は、演習6.18と同じく、分散を$\sigma^2$とする等方的ガウス分布 $f(x,t)$ によるカーネル $k(x,x_n)$ を用いて求めています。

```math
f(x,t)=N((x,t)^T|\mathbf{0},\sigma^2\mathbf{I})=\frac{1}{2\pi\sigma^2}\exp(-\frac{x^2+t^2}{2\sigma^2}) \\
g(x)=\int f(x,t) dt \\
k(x,x_n)=\frac{g(x-x_n)}{\sum_m g(x-x_m)}
```

![26.NadarayaWatson.png](https://qiita-image-store.s3.amazonaws.com/0/12670/7aebd549-8035-f0a3-b049-3abdb3037340.png)


```r
frame()
set.seed(0)
par(mfrow=c(3, 2))
par(mar=c(2, 2, 1, 0.1))
par(mgp=c(1, 0.2, 0))
xrange <- c(-0.1, 1.1)
yrange <- c(-1.5, 1.5)
xcell <- seq(xrange[1], xrange[2], .01)
ycell <- seq(yrange[1], yrange[2], .01)
colors <- rainbow(450)[256:1]
N <- 10
x <- seq(0, 1, 1 / (N - 1))
#y <- rnorm(length(x), sin(2 * pi * x), 0.2)
y <- c(0.4, 0.8, 1.1, 1.0, 0, 0.1, -1, -0.5, -0.6, 0.3)  

doplot <- function(sigma) {
	
	# g(x)
	g <- function(x) {
		1 / sqrt(2 * pi * sigma ^ 2) * exp(-x ^ 2 / (2 * sigma ^ 2))
	}
	
	# k(x, x_n)
	kernel <- Vectorize(function(xx, xn) {
		g(xx - xn) / sum(g(xx - x))
	})
	
	# E[t|x]
	estimate <- Vectorize(function(xx) {
		sum(kernel(xx, x) * y)
	})
	
	# p(t|x)
	p <- Vectorize(function(xx, yy) {
		1 / sqrt(2 * pi * sigma ^ 2) * sum(exp(-(yy - y) ^ 2 / (2 * sigma ^ 2)) * kernel(xx, x))
	})
	
	# Var(t|x)
	variance <- Vectorize(function(xx) {
		sum((sigma ^ 2 + y ^ 2) * kernel(xx, x)) - estimate(xx) ^ 2
	})

	# k(x, xn)の描画
	for (n in 1:N) {
		if (n > 1) {
			par(new=T)
		}
		xn <- x[n]
		curve(kernel(x, xn), xlim=c(-0.1, 1.1), ylim=c(-0.1, 1.1), 
			xlab=ifelse(n == 1, "x", ""), ylab="", axes=(n == 1), col=n)
	}
	title(bquote(paste(k(x, x[n]), ~ sigma, "=", .(sigma))))

	# p(t|x)の描画
	plot(x, y, xlim=xrange, ylim=yrange, xlab="x", ylab="t")
	image(xcell, ycell, outer(xcell, ycell, p), xlim=xrange, ylim=yrange, col=colors, axes=F, add=T)
	
	# 観測点の描画
	par(new=T)
	plot(x, y, xlim=xrange, ylim=yrange, xlab="", ylab="", axes=F)
	
	# E[t|x], Var(t|x)の描画
	par(new=T)
	curve(estimate, xlim=xrange, ylim=yrange, xlab="", ylab="", axes=F, col=2)
	hi <- function(xx){ estimate(xx) + sqrt(variance(xx)) * 2 }
	lo <- function(xx){ estimate(xx) - sqrt(variance(xx)) * 2 }
	par(new=T)
	curve(hi, xlim=xrange, ylim=yrange, xlab="", ylab="", axes=F, col=7)
	par(new=T)
	curve(lo, xlim=xrange, ylim=yrange, xlab="", ylab="", axes=F, col=7)

	legend("bottomleft", c(
		expression("E[t|x]"), 
		expression("E[t|x]" %+-% 2 * sqrt("Var[t|x]"))
		), col=c(2, 7), lty=1, bg="gray")
	title(bquote(paste("p(t|x)", ~ sigma, "=", .(sigma))))

	# p(t|x)のtに関する積分が1であることを、いくつかのxで確認
	for (xx in seq(0, 1, 0.1)) {
		cat(paste0(
			"integral(p(t|x=", xx ,")dt)=", 
			sum(sapply(seq(-10, 10, 0.01), function(yy) { p(xx, yy) * 0.01 })),
			"\n"
			))
	}
}

doplot(0.02)
doplot(0.06)
doplot(0.1)
```
黒帯のためのLOOP(2)

はじめに
========

この連載ではCommon LispのLOOPマクロをサンプルを使って紹介する。
LOOPマクロは (clライブラリをロードすることで) Emacs Lispでも利用可能である。

【[Common Lisp: loopマクロ用法抄](http://smpl.seesaa.net/article/29800843.html)より引用】
> Grahamの _ANSI Common Lisp_ では嫌われていて碌に説明のないloopマクロ。一方、 _実践Common Lisp_ では対照的に好んで用いられていて、全編に渡って頻繁に使われている。しかしloopマクロは難しいという意識があるのかその説明は第22章とかなり後回しにされており、ちぐはぐな感を受ける。ここでは、 **黒帯のためのLOOP** という題のつけられたその章で解説されているloopマクロの用法を整理してみた。
> 
> _ANSI Common Lisp_ での黒魔術扱いに敬遠していたloopマクロだったが、こうして整理してみるとそれほど難しく考えずとも便利に使うことができそうだ。
> 
> [実践Common Lisp](http://www.amazon.co.jp/exec/obidos/ASIN/4274067211/)
> 作者: Peter Seibel,佐野匡俊,水丸淳,園城雅之,金子祐介
> 出版社/メーカー: オーム社
> 発売日: 2008/07/26
> メディア: 単行本（ソフトカバー）

今回は…
========

今回は、LOOP マクロに関する Emacs Lisp と Common Lisp の非互換性について紹介します。

## ベクターのリードシンタックスの違い

* 厳密には、LOOPマクロ自体の違いではないですが…

```cl:CLISPの場合
CLISP> (loop for i across #(1 2 3) do (print i))

1
2
3
⇒NIL
```

```el:ELISPの場合
ELISP> (require 'cl)
ELISP> (loop for i across [1 2 3] do (print i))
1
2
3
⇒nil
```

## 値の累積(accumulation)に関する違い

* Emacs Lisp では、以下のように concat (文字列の結合) accumulation が使えます。

```el:ELISPのみ
ELISP> (require 'cl)
ELISP> (loop for str in '("A" "B" "C")
             for sep = "" then ","
             concat sep
             concat str)
⇒"A,B,C"
```

最後に
======

他にも非互換等ありましたらコメントか https://twitter.com/akmiyoshi までお願いします。
Vagrant packageで複製したboxのSSHレスポンスが遅い

# Vagrant packageで複製したboxのSSHレスポンスが遅い
らしい。ってまだ遭遇したことがないけどメモ
> [Vagrant packageで複製したboxのSSHレスポンスが遅い](http://blog.chacrue.com/posts/2014/slow-response-vagrant/)
> [/sbin/ifup eth1 2> /dev/null #1777](https://github.com/mitchellh/vagrant/issues/1777)
Vagrant の環境を複製する

# Vagrant の環境を複製する
そのまんまなんですけど。Vagrant の box として用意されているOSは、タイムゾーンが UTC になっているので JST に変更したりユーザを追加したり・・・と VM を作成する毎に設定するのが面倒な場合は複製してしまうのが簡単。そんなメモ。
ちなみにいい感じに作った vm をパッケージ化してもいいしそこらへんは自由度が高いと思いますが、完全に自動化＆最新化したいと考えているなら [Chef Solo](http://www.amazon.co.jp/%E5%85%A5%E9%96%80Chef-Solo-Infrastructure-as-Code-ebook/dp/B00BSPH158) を使う手もあります。

## 手順は、以下のとおり
1. 複製ベースとなる `Vagrantfile` があるフォルダに移動する。
2. パッケージ化コマンド ```vagrant package``` または ```vagrant package [vm name] --output [output.box]``` を実行する。
3. 作成したパッケージを追加 ```vagrant box add``` する。
3. ```box_url``` で上記パッケージを指定する。

## 具体的な手順
まずベースとなる OS を Vagrant の box からチョイスしそこに自分なりにカスタマイズした物をパッケージ化（box化）→boxを使用するという流れ。

### ベースとなる vm の作成と環境設定
[Chocolatey + VirtualBox + Vagrant の簡単セットアップ （Windows）](http://qiita.com/murachi1208/items/5b429cb7cedf76164e67)を参考にしながら ベースとなる vm を作成します。作成が終了したら タイムゾーンを JST に変更したりユーザを追加したり ```yum -y update``` したり環境設定を行います。

### パッケージ化コマンドの実行
```vagrant package``` コマンドでパッケージ出力します。
ベースとなる vm の名前を **centos65base** として話を進めます。


```lang:command
c:\> vagrant package centos65base --output centos65base.box
==> redm: Clearing any previously set forwarded ports...
==> redm: Exporting VM...
```

ちなみに複数のvmを立ち上げてる場合は、```This command requires a specific VM name to target in a multi-VM environment.``` というエラーになるのでbaseを指定する。

```lang:command
c:\> vagrant package basecentos66 centos66base --output centos66base.box
==> redm: Clearing any previously set forwarded ports...
==> redm: Exporting VM...
```


### box の登録

```lang:command
c:\> vagrant box add centos65base c:\<boxの場所>\centos65base.box
c:\> vagrant box list
cantos65base (virtualbox, 0)
```

### box を使用する
ここからは通常とおり。

```lang:command
c:\> vagrant init centos65base
```

または ```config.vm.box = "centos65base"```と指定するだけ。

### ホスト名に "_" を使用すると・・・
vm のホスト名を「centos6_5_base」と指定したら ```vagrant up``` で怒られました。 :tired_face: 注意されますねｗ

```lang:error
Bringing machine 'default' up with 'virtualbox' provider...
There are errors in the configuration of this machine. Please fix
the following errors and try again:

vm:
* The hostname set for the VM should only contain letters, numbers,
hyphens or dots. It cannot start with a hyphen or dot.
```
RaspberryPiのシリアル接続


--------------------------------------------------------------------------------
<Raspberry Pi>
Raspberry Pi Model-B
SDカード: Transcend SDHCカード 8GB Class10(TS8GSDHC10E)
OS: raspbian (2014-01-07-wheezy-raspbian)

<クライアント>
Surface Pro 2
OS: Windows 8.1
ターミナルソフト: TeraTerm 4.82

<その他>
FTDI USBシリアル変換アダプター(5V/3.3V切り替え機能付き)
ジャンパワイヤ オス-メス
USBケーブル(A-MicroB)
電源一式(5V-1A microUSB)

--------------------------------------------------------------------------------
(1) Raspberry Piの準備

OSインストール済みのSDカードを刺します。
OSインストールの方法はいずれ。

(2) FTDI USBシリアル変換アダプターの準備

この製品は5V/3.3V切り替え機能がついている。
購入直後は5Vに設定されていたので、
ジャンパブロックを3.3Vの方に設置する必要がある。

(3)クライアントPCの準備

TeraTermをインストールしていない場合はインストールする。

TeraTermダウンロード
http://sourceforge.jp/projects/ttssh2/

(4) Raspberry Pi と FTDI USBシリアル変換アダプタの接続

ジャンパピンでの接続なので慣れてない人は注意。
USBシリアル変換アダプタの方はオス、Raspberry Piの方はメス。
接続は以下の3本。

・シリアル変換アダプタの GND とGPIOの 6番(Ground)
・シリアル変換アダプタの TX とGPIOの 10番(RXD)
・シリアル変換アダプタの RX とGPIOの 8番(TXD)
![シリアル結線.jpg](https://qiita-image-store.s3.amazonaws.com/0/45890/e38a3eb2-ade7-ae81-b5d4-90eff05d4f44.jpeg)

(5) FTDI USBシリアル変換アダプタとクライアントPCの接続

USBケーブルでシリアル変換アダプタとPCを接続すると
Windows Updateで自動的にドライバがインストールされる。
うまくいかない場合や自動的に取りに行けない環境の場合は
主導でドライバをインストールする必要がある。

ドライバダウンロード
http://www.ftdichip.com/Drivers/VCP.htm


(6) Raspberry Piの起動

a. クライアントPCでTeraTerm起動。
b. COMポートを選択。複数ある場合はUSBシリアル変換で追加されたものを確認して選択すること。
c. メニューから「設定」→「シリアルポート」を選択し、ボー・レートを「115200」に設定して「OK」ボタンをクリックする。
d. Raspberry Piの電源を入れる。電源スイッチはないのでケーブルを接続するのみ。
e. TeraTermにメッセージが出力されれば、シリアル接続は成功。



--------------------------------------------------------------------------------
<使用したもの>

[SDカード](http://www.amazon.co.jp/dp/B003VNKNEG/ref=as_sl_pc_tf_lc?tag=tamamius05-22&camp=1027&creative=7407&linkCode=as4&creativeASIN=B003VNKNEG&adid=1FCFMK4QTMK70H76MBZ8&&ref-refURL=http%3A%2F%2Frcm-fe.amazon-adsystem.com%2Fe%2Fcm%3Flt1%3D_blank%26bc1%3D000000%26IS2%3D1%26bg1%3DFFFFFF%26fc1%3D000000%26lc1%3D0000FF%26t%3Dtamamius05-22%26o%3D9%26p%3D8%26l%3Das4%26m%3Damazon%26f%3Difr%26ref%3Dss_til%26asins%3DB003VNKNEG)
[FTDI USBシリアル変換アダプタ](http://www.amazon.co.jp/dp/B009AME9R4/ref=as_sl_pc_tf_lc?tag=tamamius05-22&camp=1027&creative=7407&linkCode=as4&creativeASIN=B009AME9R4&adid=0EXM2M0F2D9JMZ4Q53YR&&ref-refURL=http%3A%2F%2Frcm-fe.amazon-adsystem.com%2Fe%2Fcm%3Flt1%3D_blank%26bc1%3D000000%26IS2%3D1%26bg1%3DFFFFFF%26fc1%3D000000%26lc1%3D0000FF%26t%3Dtamamius05-22%26o%3D9%26p%3D8%26l%3Das4%26m%3Damazon%26f%3Difr%26ref%3Dss_til%26asins%3DB009AME9R4)
[ジャンパワイヤ](http://www.amazon.co.jp/dp/B0079BW7O0/ref=as_sl_pc_tf_lc?tag=tamamius05-22&camp=1027&creative=7407&linkCode=as4&creativeASIN=B0079BW7O0&adid=1RTD6F6697VYPGJ41V5H&&ref-refURL=http%3A%2F%2Frcm-fe.amazon-adsystem.com%2Fe%2Fcm%3Flt1%3D_blank%26bc1%3D000000%26IS2%3D1%26bg1%3DFFFFFF%26fc1%3D000000%26lc1%3D0000FF%26t%3Dtamamius05-22%26o%3D9%26p%3D8%26l%3Das4%26m%3Damazon%26f%3Difr%26ref%3Dss_til%26asins%3DB0079BW7O0)
Ubuntu ServerでOpenSSLのバージョンを1.0.1hにする

### スクリプトの実行

```bash
#!/bin/bash

sudo apt-get update
wget http://www.openssl.org/source/openssl-1.0.1h.tar.gz
tar xvfz openssl-1.0.1h.tar.gz
cd openssl-1.0.1h
./config --prefix=/usr --openssldir=/usr/share/ssl shared
make
make test
sudo make install
sudo apt-get update
sudo apt-get -y upgrade openssl
```

再起動を行う。

### OpenSSLバージョンの確認
```
$ openssl version
OpenSSL 1.0.1h 5 Jun 2014
```

上記のように表示されればOK