OmniAICreator/Qiita-1.07M huggingface dataset:
macから複数のサーバに同じコマンドを一気に実行する

#### 前置き

普段から仕事で、各webサーバのアクセスログとかアプリケーションログを見たりって仕事をする機会があります。

うちはまだwebサーバが4台なので、仕方なく1台ずつsshで接続して、各種ログディレクトリに移動してgrepしたり、tailfで眺めてたりしてました。

手順で言うとこんな感じです。

1. itermを開き、`Command+d`と`Command+Shift+d`でいい感じに画面を4分割する
2. webサーバに接続 × 4
3. パスワード入力 × 4
4. ログディレクトリに移動
5. grepする

かなり面倒だし、移動するにも時間かかるし、手が疲れるしで最悪です。
4台なのでまだなんとかなってますが、これが40台になったらさすがに無理でしょう。。

#### 本題

で、そろそろ本気で、`macから複数のサーバに一括で接続して同じコマンドを実行する方法`がないかを探す事にしました。

で、出てきた答えの1つが[csshx](https://code.google.com/p/csshx/)です。
使い方は超簡単

* 1. csshxをインストール

```
brew install csshx
```

* 2. 使ってみる

```bash
csshx --login {ユーザ名} {webサーバ1のホスト} {webサーバ2のホスト} {webサーバ3のホスト} {webサーバ4のホスト}
```

これを実行すると、４台分のターミナルが別windowで立ち上がり、パスワード入力待ちの状態になってます。
で、キーボードでパスワードを入力すると、全部のサーバに同じパスワードが入力されます。
あとは適当にコマンドを入力してみると、４台に同じコマンドが入力されていき、同じコマンドを実行することが出来ます。

超楽！最高ｗｗｗｗ
以上です。
watchkitで秒針を表示する（CGContextStrokePath）

WatchKitの時計（アナログ表示）に関するサンプルが少なかったので
迷えるエンジニア達のためにアップします。 => <a href="https://github.com/TECHFUND/Watch">Githubはコチラ</a>
※今回のアプリは秒針のみ表示しているシンプル版です

<h3>完成イメージ</h3>
最初の数秒のイメージです（実際にはぐるぐる回ります）。
![watch.gif](https://qiita-image-store.s3.amazonaws.com/0/44837/9a79bc91-f986-1deb-5d09-5e829a56864b.gif)

<h3>0.準備</h3>
・WatchKit ExtensionをAdd Targetします
※Xcode6.2beta以上である必要があります
Target > Add Target > メニュー内のApple WatchにあるWatchKit Appを選択してNext > Finish
・Interface.Storyboardにimageを設置してIBOutletします
```@IBOutlet weak var dynamicImage: WKInterfaceImage!```

<h3>1.タイマー</h3>
1秒ごとに表示を更新するためタイマーを利用します

```lang:InterfaceController.swift
    override func willActivate() {
        super.willActivate()

        // タイマー（1秒毎）
        var timer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: "update", userInfo: nil, repeats: true)
    }

    // 1秒毎に行う処理
    func update() {

    }
```

<h3>2.秒針の座標を計算</h3>
日付（秒）の値とradian,sin,cosを使って計算します。
時計のサイズを(100px,100px)とし、中心を(50px, 50px)としています。
update()内に記載します。

```lang:InterfaceController.swift
        let now = NSDate() // 現在日時の取得
        
        let dateFormatter = NSDateFormatter()
        dateFormatter.locale = NSLocale(localeIdentifier: "en_US") // ロケールの設定
        dateFormatter.dateFormat = "ss" // 日付フォーマットの設定
        var sec = dateFormatter.stringFromDate(now) // 現在時刻の取得
        
        // 秒針の設定
        var angle: Double = Double(sec.toInt()!)    // 数値に変換
        var mRad = -90 * M_PI / 180;    // ベースの針の長さ
        var pi:Double = M_PI * 2    // 直径
        var x = 50 + 50.0 * cos(angle * pi / 60.0 + mRad)   // x座標（時計の中心座標50 + 秒針の長さ50.0 * cos）
        var y = 50 + 50.0 * sin(angle * pi / 60.0 + mRad)   // y座標（時計の中心座標50 + 秒針の長さ50.0 * sin）
        var x_float:CGFloat = CGFloat(x)    // 表示用の型に変換
        var y_float:CGFloat = CGFloat(y)    // 表示用の型に変換
```

<h3>3.描画</h3>
CGContextStrokePathとUIGraphicsGetImageFromCurrentImageContextを使います。
描画を画像化してimageに表示しています。
update()内に追記します。

```lang:InterfaceController.swift
        // コンテキストを設定
        UIGraphicsBeginImageContextWithOptions(CGSizeMake(100, 100), false, 0)
        let context = UIGraphicsGetCurrentContext()
        
        // 秒針（直線）の描画
        CGContextSetLineWidth(context, 1.0);   // 線の太さ
        CGContextSetRGBStrokeColor(context, 1, 1, 1, 1) // 線の色(白)
        CGContextMoveToPoint(context, 50, 50);  // 始点（中心点）
        CGContextAddLineToPoint(context, x_float, y_float);  // 終点（計算した値）
        CGContextStrokePath(context);  // 描画
        
        // 描画した画像をスクリーンショットとして保存
        let secondHandImage = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        
        // 1秒毎に画像（秒針）を更新
        dynamicImage.setImage(secondHandImage)
```

<h3>参考サイト</h3>
Obj−Cで書かれている方です。座標計算部分を参考にさせていただきました。
<a href="http://marunouchi-tech.i-studio.co.jp/747/">Apple Watchの開発が出来るようになったので「Watchkit」でアナログ時計を作ってみた | 丸ノ内テックブログ</a>

<h3>Github</h3>
下記よりダウンロードできます。
https://github.com/TECHFUND/Watch
cakePHP2系列でページネーションを行うときに注意すべき点


##要点
paginatorComponentを利用する。
つまり、$this->Paginator 経由でやりくりする。

##前提

本記事で取り扱うcakePHPのバージョンはcakePHP2系列の話です。

##注意点
cakePHPにはページネーションの実装が2つ存在します。

1. (おそらく)Controllerへの実装
2. Componentへの実装 

これらの違いを意識してサンプルコードを読まないと、思ったようにコードが動かずに頭を悩ませます。


##対策
新しい実装はComponentの方の実装なのでそれを利用します。

[Pagination cakePHP2 cookbook](http://book.cakephp.org/2.0/en/core-libraries/components/pagination.html)

以上から適当に抜粋して利用方法を記載します。

##準備

ページネーションを利用したいコントローラー内でPaginatorコンポーネントの利用を宣言します。

```
public $components = array('Paginator');
```

##設定と利用

データ取得の設定は以下のように行います。

```
public function index(){
    $this->Paginator->setting = array('必要な設定');
    $this->set('page',$this->Paginator->paginate('対象モデル'));
}
```

また複数のモデルに対してページネーションを行いたい場合は

```
public function index(){
    $this->Paginator->setting['対象モデル1'] = array('必要な設定');
    $this->Paginator->setting['対象モデル2'] = array('必要な設定');
    
    $this->set('page1',$this->Paginator->paginate('対象モデル1'));
    $this->set('page2',$this->Paginator->paginate('対象モデル2'));
}
```
iTerm2+Powerlineを簡単に設定する方法


Powerlineとは

![powerline.png](https://qiita-image-store.s3.amazonaws.com/0/42743/bb929c4c-5050-be93-2a70-03f750a88b55.png "powerline.png")

Terminal上をこんな感じにしてくれて
階層やブランチを見やすく表示してくれるもの

インストール方法が載ってる記事も割とあるけどめんどくさかったので
中でも簡単なものを紹介


## 環境
- mac Mavericks
- bash


## インストール
git からインストーラをとってくる

	git clone https://github.com/temperman/powerline-shell-installer
インストーラを起動

	./powerline-shell-installer/bin/ps-install

iTermの環境設定
Profiles > Text の __Regular Font__ と __Non-ASCII Font__を
__for Powerline__ と最後に付いているフォントに設定（powerとかで検索するといい）
![font.png](https://qiita-image-store.s3.amazonaws.com/0/42743/3bf62b7a-5f2a-e0f0-7aeb-8ef879513850.png "font.png")

最後に再起動（しなくてもうまくいくこともある）

だけ！


## 参考
https://github.com/temperman/powerline-shell-installer
別のrepositoryAでやった全く同じ作業を別のrepositoryBでもやりたい

## 想定

パスが同じ

## repositoryA でやった作業を repositoryB でもやりたい

```
git cd repositoryB
git remote add repositoryA git@example.com:repositoryA.git
```

repositoryAから持ってきたいcommitを確認する

```
git log --remotes=repositoryA
```

↓が対象コミットとする

```
commit fc355e43ba8963232f71fe2c69b27697bcb36a05
```

持ってきたいcommitをcherry-pickする(-xをつけることでどっから持ってきたかの追跡可能とする)

```
git cherry-pick fc355e43ba8963232f71fe2c69b27697bcb36a05 -x
```

## 整理すると

* gitでは別のリポジトリをremote登録することが出来る
* パスが同じであれば、git-cherry-pickの適用が可能

## 結論

便利！
mysqlにmackerel用のユーザを作成して、ステータスを確認する


### mackerel-plugin-mysql用ユーザーの作成

```mysql
mysql>grant select on mysql.* to 'mackerel'@'127.0.0.1' identified by 'mackerel_password';
mysql>grant replication client on *.* to 'mackerel'@'127.0.0.1' identified by 'mackerel_password';
mysql>grant process on *.* to 'mackerel'@'127.0.0.1' identified by 'mackerel_password';
mysql>grant select on mysql.* to 'mackerel'@'localhost' identified by 'mackerel_password';
mysql>grant replication client on *.* to 'mackerel'@'localhost' identified by 'mackerel_password';
mysql>grant process on *.* to 'mackerel'@'localhost' identified by 'mackerel_password';
```

```sh
/usr/local/bin/mackerel-plugin-mysql -username=mackerel -password=mackerel_password
```
httptestでエラーを返したい時

テスト用のモックサーバーを作るために
`httptest.NewServer()`作ったときのエラーの作り方。

```go
  ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
    w.WriteHeader(http.StatusBadRequest)
    fmt.Fprint(w, "Bad Request")
  }))
  defer ts.Close()
```

Headerへの書き込みより先に、Bodyの書き込みをしてはいけない。

```go:ダメ
  ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
    fmt.Fprint(w, "Bad Request")
    w.WriteHeader(http.StatusBadRequest)
}
```
ファイルの更新日時でソートする


ファイルを更新日時でソートします。



### Python 版

```python:mtime.py
# coding: utf-8

import os
import time
import datetime

def sort_mtime(rootdir):
    xs = []
    for root, dir, files in os.walk(rootdir):
        for f in files:
            path = os.path.join(root, f)
            xs.append((os.path.getmtime(path), path))

    for mtime, path in sorted(xs):
        name = os.path.basename(path)
        t = datetime.datetime.fromtimestamp(mtime)
        print(t, name)

def main():
    sort_mtime('.')

if __name__ == '__main__':
    main()
```

実行結果です。

```bash:
% python3 mtime.py
2015-01-17 13:52:15 mtime.py
2015-01-17 13:58:36 readme.md
2015-01-17 14:17:48 mtime.rb
```

### Ruby 版

```ruby:mtime.rb
require 'find'

def sort_mtime(rootdir)
  xs = []
  Find.find(rootdir) { |f|
    xs << [File::mtime(f), f] if File::file?(f)
  }
  xs.sort.each { |mtime, f|
    puts "#{mtime} #{f}"
  }
end

if __FILE__ == $0
  sort_mtime('.')
end
```

実行結果です。


```bash:
% ruby mtime.rb
2015-01-17 13:52:15 +0900 ./mtime.py
2015-01-17 13:58:36 +0900 ./readme.md
2015-01-17 14:17:48 +0900 ./mtime.rb
```
フラクタルで木を書く

そういえば書いたことなかったのでやってみた。

## 概念

- 何度再帰するか決める(depth)
- 座標を指定する(x1, y1)
- 方向を指定する(θ)
- x1, y1から、その方向に線を引く(x2, y2)
- 再帰回数が残っていれば、引いた先(x2, y2) から、任意の角rとして θ-r, θ+r方向へ線を引く

## コード

注意: 伸ばす長さ、角度に乱数が入っている

```coffeescript
{sin, cos, PI} = Math

drawLine = (ctx, p1, p2) ->
  ctx.beginPath();
  ctx.strokeStyle = 'gray'
  ctx.moveTo(p1.x, p1.y);
  ctx.lineTo(p2.x, p2.y);
  ctx.stroke();

drawTree = (
  ctx     # canvas context
  x1, y1  # position
  len     # length of node
  stand   # current dir
  depth   # recursion count
) ->
  rl = Math.abs(0.5 - Math.random()) * len
  x2 = x1 + rl * cos(stand)
  y2 = y1 + rl * sin(stand)
  drawLine(ctx, {x: x1, y: y1}, {x: x2, y: y2})
  if depth > 0
    diffdir = Math.random() * PI / 6
    drawTree(ctx, x2, y2, len, stand + diffdir, depth-1)
    drawTree(ctx, x2, y2, len, stand - diffdir, depth-1)

window.addEventListener 'load', ->
  canvas = document.createElement 'canvas'
  canvas.width=800
  canvas.height=600
  document.body.appendChild(canvas)
  ctx = canvas.getContext('2d')
  for x in [1..30]
    drawTree(ctx, 600*Math.random(), 400*Math.random(), 20, -PI/2, 8)
```

## 結果

![](http://i.gyazo.com/0606486a0587b4285c116b138a62bc55.png)
OCLint&XCodeを用いたObjective-Cの静的解析

# OCLintとは
Objective-Cの静的解析ツール。
JavaのCheckStyleみたく、コードの問題点を教えてくれる。
本稿ではXCodeから使用できるようにする。

[OClint公式サイト](http://oclint.org/)

# インストール＆設定

## xctoolのインストール
※ Homebrewインストール済みとします。

```
$ brew install xctool
```

## OCLintのインストール

1. ダウンロード
	http://oclint.org/downloads.html

2. 配置
	oclint-0.8.1フォルダを/usr/local などに移動する（例./usr/local/oclint-0.8.1/)。

## XCodeの設定

1. 対象のProjectを選択する。
2. 左下の「+」をクリックする。 
![1-2.png](https://qiita-image-store.s3.amazonaws.com/0/16996/0454a543-aa82-0824-8a3c-b7879adeca50.png)
3. iOS - Other - Aggregateを選択して、Nextをクリックする。
![3.png](https://qiita-image-store.s3.amazonaws.com/0/16996/9d65ba4b-3513-0a35-a95a-ef88ae2ffb33.png)
4. Projectが対象のプロジェクトになっていることを確認し、Product NameにOCLintと入力し、Finishをクリックする。
![4.png](https://qiita-image-store.s3.amazonaws.com/0/16996/c4740291-09ca-8e65-d654-3c42da2dd2f9.png)
5. TARGETSからOCLintを選択する。
6. Build Phasesを選択する。
![5-6.png](https://qiita-image-store.s3.amazonaws.com/0/16996/356dd75e-0463-c81c-51fa-a060f3fb58c7.png)
7. 左上の「+」をクリックし、「New Run Script Phase」を選択する。
![7.png](https://qiita-image-store.s3.amazonaws.com/0/16996/610a160c-6264-be17-9d83-cac825469cbc.png)
8. Run Scriptに以下を記述する(変数を適切に設定する）。
	* PROJECT … プロジェクトファイル名
	* SCHEME … ターゲットスキーム(大抵はプロジェクト名と同じかと）
	* XCTOOL …  xctoolが格納されている場所。Homebrewでインストールしていれば/usr/local/bin
	* OCLINT_HOME … oclintのインストール場所。

```
PROJECT=ProjectName
SCHEME=${PROJECT}

XCTOOL=/usr/local/bin
export PATH=$XCTOOL:$PATH
OCLINT_HOME=/usr/local/oclint-0.8.1
export PATH=$OCLINT_HOME/bin:$PATH

xctool -project ${SRCROOT}/${PROJECT}.xcodeproj -scheme ${SCHEME} -reporter json-compilation-database:compile_commands.json clean
xctool -project ${SRCROOT}/${PROJECT}.xcodeproj -scheme ${SCHEME} -reporter json-compilation-database:compile_commands.json build

oclint-json-compilation-database | sed 's/\(.*\.\m\{1,2\}:[0-9]*:[0-9]*:\)/\1 warning:/'
```

# 実行
1. 左上からOCLintターゲットを選択し、Buildする（時間かかる）。
![lint.png](https://qiita-image-store.s3.amazonaws.com/0/16996/45b87f4e-e4ec-3103-8eb9-83a991ed67c5.png)

# 治したいところ
ソースフォルダにcompile_commands.jsonが生成されてしまう。
消せばいいんだけど、$(TARGET_TEMP_DIR)でできないか。
John the Ripperのインストール方法

※下記、rootユーザーで行う

* wget http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm
* rpm -ivh rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm
* yum install john

* cp /etc/john.conf  /etc/john.conf.org
* vim /etc/john.conf

```
#.include <dynamic.conf>
```

※下記、動確
* unshadow /etc/passwd /etc/shadow > passwdfile
* john --users=[ユーザー名称] --single　--show passwdfile
遠い世界の数式


いつものように正規表現使うよろしくない解法。

```rb:evalex.rb
#!/usr/bin/ruby
#http://nabetani.sakura.ne.jp/kanagawa.rb/evalex/

AddSub = Regexp.compile(/^(.*?)([0-9,-]+)([+Z])([0-9,-]+)(.*)$/)
MulDiv = Regexp.compile(/^(.*?)([0-9,-]+)([*])([0-9,-]+)(.*)$/)
And = Regexp.compile(/^(.*?)([0-9,-]+)([\&])([0-9,-]+)(.*)$/)
Or = Regexp.compile(/^(.*?)([0-9,-]+)([\|])([0-9,-]+)(.*)$/)

def process(s)
	#analyze parens
	bidx=s.index("(")
	while bidx
		count=1
		eidx=bidx+1
		while count!=0
			count+=1 if s[eidx,1]=='('
			count-=1 if s[eidx,1]==')'
			eidx+=1
		end
		s=s[0,bidx]+process(s[bidx+1...eidx-1])+s[eidx..-1]
		bidx=s.index("(")
	end

	while m=Or.match(s)
		if m[3]=='|'
			s=m[1]+(m[2].to_i|m[4].to_i).to_s+m[5]
		end
	end

	while m=And.match(s)
		if m[3]=='&'
			s=m[1]+(m[2].to_i&m[4].to_i).to_s+m[5]
		end
	end

	while m=AddSub.match(s)
		if m[3]=='+'
			s=m[1]+(m[2].to_i+m[4].to_i).to_s+m[5]
		else
			s=m[1]+(m[2].to_i-m[4].to_i).to_s+m[5]
		end
	end

	while m=MulDiv.match(s)
		if m[3]=='*'
			s=m[1]+(m[2].to_i*m[4].to_i).to_s+m[5]
		end
	end
	s
end

while gets
	puts process($_.chomp.tr('-','Z')) # 引き算は出現しないので必要ない処理だけど、まあ…
end
```
現役学生と将来のプログラマのためのProcessing#2


#目的
現役の専門学校学生さん達にProcesingを学んでもらうために記述しています。
ついでに、将来のプログラマ、教育に関わっている人達に何かの助けになるといいな。
processingはもっと評価されていいと思う。

#前提

https://processing.org/download/?processing
![kobito.1421330011.865512.png](https://qiita-image-store.s3.amazonaws.com/0/33317/706723c5-00a7-847f-54d2-7abb6f34dfa2.png "kobito.1421330011.865512.png")

http://qiita.com/ggggnonaka/items/5d66d555a398d55f6b28

#今回の目標
言語の追加

##言語の追加
画面右上　Add modeから追加して再起動。
![スクリーンショット 2015-01-17 13.14.26.png](https://qiita-image-store.s3.amazonaws.com/0/33317/9cbcc004-8706-01b6-81f2-ecf518040097.png "スクリーンショット 2015-01-17 13.14.26.png")

processingを再起動して下さい。


##おまけ
サンプルを少し変更。
![スクリーンショット 2015-01-17 13.29.33.png](https://qiita-image-store.s3.amazonaws.com/0/33317/0213052f-df9d-fcd2-8eec-e30f94f76443.png "スクリーンショット 2015-01-17 13.29.33.png")

```PDE:Letters.pde
/**
 * Letters. 
 * 
 * Draws letters to the screen. This requires loading a font, 
 * setting the font, and then drawing the letters.
 */

PFont f;

void setup() {
  size(640, 360);
  background(0);

  // Create the font
  printArray(PFont.list());
  f = createFont("Georgia", 20);
  textFont(f);
  textAlign(CENTER, CENTER);
} 

void draw() {
  background(0,60,0);

  // Set the left and top margin
  int margin = 10;
  translate(margin*4, margin*4);

  int gap = 46;
  int counter = 35;
  
  for (int y = 0; y < height-gap; y += gap) {
    for (int x = 0; x < width-gap; x += gap) {

      char letter = char(counter);
      
      if (letter == 'A' || letter == 'E' || letter == 'I' || letter == 'O' || letter == 'U') {
        fill(255, 204, 0);
      } 
      else {
        fill(255);
      }

      // Draw the letter to the screen
      text(letter, x, y);

      // Increment the counter
      counter++;
    }
  }
}
```
Qiita:Teamと個人アカウントを切り替えるベストプラクティス(Chrome)

Qiita:Teamを会社で使っている場合、Qiitaに個人アカウントで投稿するときはいちいちログアウトしなければならず、面倒な思いをしていました。

Chromeのユーザ切り替え機能を使うと、Cookieも分けて管理してくれて便利ということを知ったので紹介します。

1. ユーザ切り替えを選択する
Chromeのタイトルバー右にユーザ切り替えボタンがあります。
![Screen Shot 2015-01-17 at 12.31.59.png](https://qiita-image-store.s3.amazonaws.com/0/882/79e9bfad-a732-3507-8afc-8ca0ec2e7a2a.png)

2. ユーザを追加する
ユーザの追加には別のGoogleアカウントが必要です。
![Screen Shot 2015-01-17 at 12.32.16.png](https://qiita-image-store.s3.amazonaws.com/0/882/8bd327fa-da2d-714e-1cdd-0b1d92919bd7.png)

Windowの行き来が面倒ですが、ログアウトしてログインするよりはマシでした。

Qiita以外にも複数アカウントを切り替えたい場合はオススメです。
Linux MintしてXPを削除

超初心者なのであちこちでつまっています＞＜
ということで手順の忘備録。

まずなぜMintなのかということで、
[Ubuntu を使うなら、Linux Mint の方が良いよね？](http://linuxmintjp.jimdo.com)
ということらしい。ちょうどXPがあったのでMint入れてみることにしました。

## ダウンロード
注）
1.どの環境でもおすすめなのは MATE、
マシンのスペックが良く、最先端な環境を求めるなら Cinnamon 
2.[no codecs ではないバージョンを Torrent を使用して .iso 入手すると
日本では法律に接触する恐れがあるため、行わない](http://linuxmintjp.jimdo.com/インストール/)

ダウンロードはここからして
[Linux Mint 17.1 "Rebecca" - MATE no-codecs (32-bit) ](http://www.linuxmint.com/download.php)

[ユーザーズガイド](http://linuxmint-jp.net/documentation/MATE/japanese_17.0.pdf)
によるとダウンロードには１時間かかるとありましたが、５分位でおわりましたよ？あれ？ 

Macでターミナルを起動して一応MD5を確認。

` openssl md5 downloads/linuxmint-17.1-mate-nocodecs-32bit.iso`

表示されました

![スクリーンショット 2015-01-17 12.23.14.png](https://qiita-image-store.s3.amazonaws.com/0/64664/1e48078d-1c82-3ae8-68c8-d42777d402d9.png)

ダウンロードサイトの署名と一致しました。OKみたいです。

## DVDにISOを書き込む

Winを使うことが多く知らなかったのですが、Macで.isoファイルを焼くのは簡単だったのですね！

[ドラッグ＆ドロップするだけ！Macで.isoファイルをCD/DVDに焼く方法](http://gori.me/mac/15101)

5分位で完成！

## Linux Mintをインストール

あとはインストールだけ！と思ったらココで立ち往生。
画面に点々のようなものが表示され初期画面からいっこうにインストール進みません。何度やってもウンウンうなるだけ。というので調べたらここに記述あり→[Linux Mint に関する Q&A](http://linuxmintjp.jimdo.com/q-a/) 

**機種によっては 17・17.1 で起動が困難になったり、
起動できても動作がおかしくなる場合もあります。
特に XP で比較的古い機種では 17・17.1 が正常に動作しない場合があります。**


そこで[Linux Mint 13](http://www.linuxmint.com/edition.php?id=109) をダウンロードし直し焼き直し。

こんどはユーザーズガイドの通りさくさく進みました。

![linuxmint.jpg](https://qiita-image-store.s3.amazonaws.com/0/64664/d18d535a-4a48-fc29-99e0-b2ccd0c1a38b.jpeg)

他のOSとの共存を聞かれたのでXPはバッサリと。
Dockerで複数コンテナ間のネットワーク共有

Dockerでいろいろ実験するときに便利かも。

まずはこれから使いそうなポートをいくつか開けたbusyboxを立ち上げる。
この例では80(http), 443(https), 4567(sinatra), 9292(rackup), 6379(redis)を開けている。
名前は打ちやすいようにbbにしておく。

    docker run --name bb -d -t -p 80:80 -p 443:443 -p 4567:4567 -p 9292:9292 -p 6379:6379 busybox

redisを立ち上げる例。名前はrdと短くしておく。
データはカレントディレクトリのv/rdに置くルールにする。

    docker run --name rd -d --net container:bb -v $PWD/v/rd:/data redis redis-server --appendonly yes

nginxを立ち上げる例。

    docker run --name nx -d --net container:bb nginx

うまく動かないときはリスタート。

    docker restart nx

設定ファイルなどのありかを検索。

    docker export nx | tar t | grep nginx

設定ファイルを入手。

    docker export nx | tar x etc/nginx

自分の運用ルールに合わせてファイルを移動。

    sudo mv etc/nginx v/nx
    rm -fr etc

設定を好きなように変更する。

    vi v/nx/conf.d/default.conf

設定を有効にするためにリスタート。

    docker stop nx
    docker rm nx
    docker run --name nx -d --net container:bb -v $PWD/v/nx:/etc/nginx nginx

Ubuntuを立ち上げて、rubyとかいろいろ入れてsinatraアプリを書いたりしてもよい。

    docker run --name st --net container:bb -it ubuntu
    apt-get install -y ruby curl
    gem install sinatra
    cat > test.rb
    get '/' do
    'hello world'
    end
    ^D
    ruby -rsinatra test.rb -o 0.0.0.0 &
    curl localhost:4567

nginxからsinatraアプリへリバースプロキシを設定、みたいな手順。
diffやexportを使って、変更箇所を整理してDockerfileに仕立てれば完成。

    docker diff st
    docker export st | tar t
短縮URLをお手軽に展開する for Python

Twitter APIから帰ってくるexpanded_urlはまったくもって当てにならないので，自力で展開する．

やること自体は非常に簡単で，単にurllib2を使うだけである．

```lang:expand_url.py
import urllib2

short_url = 'http://t.co/MmQomeme8u'
expand_url = urllib2.urlopen(short_url).geturl()

print expand_url
```

```
# python expand_url.py
http://www.huffingtonpost.jp/tabirai-okinawa/-_285_b_6483010.html?ncid=tweetlnkjphpmg00000001
```

ただ，この方法も万能ではない．JavaScriptを用いたリダイレクトには対応していないっぽい．

urllib2 geturl() does not work for some url redirects
http://stackoverflow.com/questions/14319771/urllib2-geturl-does-not-work-for-some-url-redirects
JDepends

from. [Yukiの枝折 - JDepends](http://yuki312.blogspot.jp/2015/01/jdepends.html)

はじめに.
---
Javaパッケージ単位でメトリクス計測するにはJDependが使える. 
JDependは次のメトリクスを計測する.

 - 抽象クラスの数(AC: Abstract Classes)
 - 具象クラスの数(CC: Concrete Classes)
 - 1パッケージに依存する他パッケージの数(Ca: Afferent Couplings)
 - パッケージが依存する他パッケージの数(Ce: Efferent Couplings)
 - 抽象度合(A: Abstractness )
 - 不安定性(I: Instability)
 - 距離(D: Distance)


Afferent Couplings
---
Ca値. この値が大きいほど当該パッケージが他パッケージから参照されている. 
Ca値の高いパッケージに対する変更は他パッケージへの変更波及性が高くなる傾向にある. 


Efferent Couplings
---
Ce値. この値が大きいほど当該パッケージが他パッケージを参照している.
Ce値の高いパッケージは他パッケージの変更による影響を受けやすい傾向にある. 


Abstractness
---
A値. 当該パッケージが内包する抽象クラスorインタフェースの度合い. 
`A = AC / (AC + CC)`で求められる. 
A値の高いパッケージは外部への変更波及性が小さくなる傾向にある. 
もう1つの観点として, 当該パッケージのCa値が低い場合, 抽象度を高くする必要性は低いと言える. 


Instability
---
I値. 当該パッケージの不安定度合い. 当該パッケージが変更を必要とされる頻度である. 
`I = Ce / (Ce + Ca)`で求められる. 
I値が大きい程, 他パッケージに依存しており, I値が低い程, 他パッケージから依存されていることを
意味する. 
この値が大きい程, 外部の変更による影響を受けやすく, 当該パッケージも変更が必要となりやすい傾向にある. 
この値が小さい程, 外部に与える影響が高いため当該パッケージの変更には注意する必要がある. 


Distance
---
D値. 当該パッケージが他パッケージとどの程度隔離されているかの度合い. 
`D = abs((A + I) - 1)`で求められる. 
メトリクス計測ではこのD値が重要な指標となる. 

いくつかのメトリクスを見てみる. 

A = 0, I = 1, Ce = 8, Ca = 0
パッケージの抽象可はされていないものの, Caが0であるため変更波及性は低く, このパッケージは変更しやすい. 
D値は0となり, パッケージの状態は良好といえる. 

A = 0.4, I = 0.6, Ce = 3, Ca = 2
不安定性がやや高いものの, 抽象度合いも確保されているため, 外部に与える影響は少なく済む. 
D値は0となり, パッケージの状態は良好といえる. 

A = 0, I = 0.2, Ce = 1, Ca = 4
全く抽象化されていないパッケージ. Ca値が高く外部からの依存度合いも高い.
そのため, 当該パッケージを変更することによる変更波及性は高くなってしまう. 
D値は0.8となり, パッケージの状態は悪いといえる. 

A = 0.6, I = 1
当該パッケージは外部から依存されていないにも関わらず抽象度合が高いことを示す. 
D値は0.6となり, パッケージの状態は改善の余地があるといえる. 

一般的に, 依存されている度合い(Ca値)の高いパッケージは抽象度を高くする方が好まれる(.結果, D値が低くなる)


Gradle
---
```gradle
apply plugin: 'jdepend'

task(jdepend, type: JDepend) {
    classesDir = file('build/intermediates/classes/debug/')
    reports {
        xml.enabled false
        text.enabled true
    }
}
```

参考
---

[JDependsExtension](http://gradle.monochromeroad.com/docs/dsl/org.gradle.api.plugins.quality.JDependExtension.html)
[SystemVerilog]動的二次元配列の初期化とかparameterとか。

Twitterでやり取りしててちょっと思い出したのでメモと考えたこと。

シミュレーションを軽くするために動的配列をよく使うのであるが、二次元配列を初期化している例があまり書かれていなかったので書いてみた。

```sv
class PIX_t;

  // ---------------------------------------------------------------------------
  // members
  // ---------------------------------------------------------------------------
  int    WIDTH, HEIGHT;
  logic  [47:0] pix [][];

  // ---------------------------------------------------------------------------
  // constructor
  // ---------------------------------------------------------------------------
   function new (int w, h);
     WIDTH  = w;
     HEIGHT = h;
     pix    = new[WIDTH];
     foreach(pix[i])
       pix[i] = new[HEIGHT];
   endfunction

endclass

module tb();

  parameter int WIDTH  = 3840;
  parameter int HEIGHT = 2160;

  PIX_t pix;

  initial
    pix = new(WIDTH, HEIGHT);

endmodule
```

`foreach`を使用する。残念ながら一発で初期化はできない。

用途によっては、動的配列ではなく`parameter`で配列を確保する方がコンパクトで良さそう。

```sv
class PIX_t #(parameter int WIDTH = 1920, HEIGHT = 1080);

  // ---------------------------------------------------------------------------
  // members
  // ---------------------------------------------------------------------------
  logic  [47:0] pix [WIDTH][HEIGHT];

  // ---------------------------------------------------------------------------
  // constructor
  // ---------------------------------------------------------------------------
   function new (logic [47:0] p = 48'hFF_FF_FF_FF_FF_FF);
     for (int x=0; x<WIDTH; x++)
       for (int y=0; y<HEIGHT; y++)
         pix[x][y] = p;
   endfunction

endclass

module tb();

  parameter int  WIDTH  = 3840;
  parameter int  HEIGHT = 2160;

  PIX_t #(WIDTH, HEIGHT) pix;

  initial
    pix = new();

endmodule
```

ただし、`parameter`によるインスタンス方法は、渡す引数の場所によってはうまくいかない場合があるので悩ましいところ。
Rubyで超シンプルなBitcoinのtickerを作った

# あいさつ

最近Bitcoin始めたんですが、使っている所が指値出来なくて軽くプログラムを組む中で、

tickerを作りコレは公開出来そうだったのでgemにしてみました.

# Rubitcoin

Rubitcoin って名前かなり気に入っている、読み方はルビットコイン〜〜

### [Github](https://github.com/gogotanaka/rubitcoin)

### [Rubygems](https://rubygems.org/gems/rubitcoin)


    $ gem install rubitcoin

または


```rb:Gemfile
gem 'rubitcoin'
```

    $ bundle


# 使い方

```rb
require 'rubitcoin'

# 引数を渡さなければUSドル
Rubitcoin.fetch
#=> {:high=>220.0, :low=>196.0, :avg=>208.0, :vol=>4663985.33289, :vol_cur=>22407.9454, :last=>210.01, :buy=>210.01, :sell=>209.925, :updated=>1421464571.0}

Rubitcoin.high
#=> 223.15

Rubitcoin.last
#=> 222.15

# 通貨は英数字３文字で指定可能
Rubitcoin.fetch(:rur)
#=> {:high=>15120.05664, :low=>13800.0, :avg=>14460.02832, :vol=>5735982.89998, :vol_cur=>394.4822, :last=>14600.0, :buy=>14640.0, :sell=>14445.4708, :updated=>1421464501.0}

Rubitcoin.high(:rur)
#=> 15120.05664

# fetch Rubitcoin.call にaliasあり
Rubitcoin.(:eur)
#=> {:high=>193.09383, :low=>173.13251, :avg=>183.11317, :vol=>21602.3727, :vol_cur=>117.53392, :last=>184.96301, :buy=>184.96301, :sell=>183.09709, :updated=>1421465049.0}
....
```

# rubitcoin コマンド

gem を入れるとrubitcoinコマンドも一緒に入ってきます

    $ rubitcoin

価格に変動があればfetchして表示してくれます.


![Screenshot 2015-01-16 20.21.41.png](https://qiita-image-store.s3.amazonaws.com/0/30440/0371ae9a-1aeb-7811-9314-eb9337e51a33.png)


データは https://btc-e.com/api/3 から頂いています.
Ubuntu14.04にmikutter3.2.2をインストールする

Ubuntu14.04では、APTの標準リポジトリにmikutterが用意されているのですが、概してバージョンが古いので、手動でインストールした方が最新の環境を使えます。
そこで、手動でmikutter3.2.2をインストールする方法を紹介したいと思います。

#依存関係にあるソフトウェアのインストール
サードパーティ製のリポジトリから最新のrubyをインストールし、bundleをインストールします。

```
sudo apt-add-repository ppa:brightbox/ruby-ng
sudo apt update
sudo apt upgrade
sudo apt install g++ ruby2.1 ruby2.1-dev
sudo gem install bundle
```

#mikutterのインストール
1. http://mikutter.hachune.net/download からmikutter3.2.2をダウンロードし、適当なディレクトリに展開します。
2. カレントディレクトリを移動します。

```
cd {展開先のディレクトリ}
```

2. 必要なライブラリをインストールします。

```
bundle install
```

1. mikutter.rbを実行可能にします。

```
chmod +x ./mikutter.rb
```

1. プラグインディレクトリ`~/.mikutter/plugin/`を作成します。

1. 以下の内容のファイルを`~/.local/share/applications`に配置し、Unityのランチャーにmikutter3.2.2を追加します(ユーザ名の部分は適宜変えてください)。

```mikutter.desktop
[Desktop Entry]
Name=Mikutter
Exec=ruby /home/{ユーザ名}/mikutter/mikutter.rb
Terminal=false
Type=Application
Icon=/home/{ユーザ名}/mikutter/core/skin/data/icon.png
```
#インストール完了
これでUnityのランチャーから実行できるようになりました。
プラグインは、プラグインディレクトリ`~/.mikutter/plugin/`に入れて、mikutter3.2.2を再起動すれば適用されます([mikutterプラグインメモ - Togetterまとめ](http://togetter.com/li/768349)に便利なプラグインがたくさん紹介されています)。

#参考文献
[[Ubuntu14.04]Mikutter3のインストール | Aruneko的PCのような何か](http://www.aruneko.net/archives/1077)
PerlっぽいフィルタプログラムをPythonで書きやすくするモジュールfileinput

個人的にPerlに惹かれるところって`while (<>)`を使ってフィルタプログラムを簡単に書けるところだと思うんですよね。

```pl
#!/usr/bin/perl

while (<>) {
  y/a-z/A-Z/;
  print;
}
```

これだけで小文字を大文字にするフィルタプログラムが完成。引数で何個でもファイルが指定できるし、無引数なら標準入力から読み込むような挙動になります。

```
$ echo hoge | ./toupper.pl
HOGE
$ ./toupper.pl hoge.txt hoge2.txt
HOGE
HOGE2
$
```

実は、fileinputモジュールを使えばPythonでも同じことができます。

```py
#!/usr/bin/python
import fileinput

for line in fileinput.input():
    sys.stdout.write(line.upper())
```

ファイル名として「-」を指定すると標準入力の意味になるところまで一緒です。

参照：https://docs.python.org/2/library/fileinput.html
ListViewのdividerに余白をつける

ListViewのdividerに余白をつける方法です。

![2015-01-17_01_35_14.png](https://qiita-image-store.s3.amazonaws.com/0/15267/7eebf478-f89f-d5d7-561f-50b71b78758f.png "2015-01-17_01_35_14.png")

#dividerのdrawableを作成
`res/drawable/`にdivider用のxmlを作成します。

```res/drawable/divider.xml
<?xml version="1.0" encoding="utf-8"?>
<inset xmlns:android="http://schemas.android.com/apk/res/android"
    android:insetLeft="16dp"
    android:insetRight="16dp">

    <shape>
        <solid android:color="#EEEEEE" />
        <corners android:radius="1dp" />
    </shape>

</inset>
```

#ListViewのdivider属性にセット
作成したxmlを、ListViewのdivider属性にセットします。

```xml
<ListView
    android:divider="@drawable/divider"
    android:dividerHeight="1dp"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />
```

参考 : [How to assign padding to Listview item divider line](http://stackoverflow.com/questions/14054364/how-to-assign-padding-to-listview-item-divider-line?lq=1)
アンダースコア「 _ 」で始まるオブジェクトへのSQL実行

## 経緯
環境：Oracle 11g

DDLに不備があり
DB構築の際に先頭がアンダースコアから始まるトリガーが作成されてしまい(コンパイルエラーになるオブジェクト)、参照しているテーブルにデータがインサートできない事象が発生。
テストの為に一時的に無効にしようとしたが

`ALTER TRIGGER トリガー名 DISABLE` 

SQL解析の段階で先頭にアンダースコアが含まれる為にSQL実行エラーになる。
トリガーの削除も同様にダメだった。

`DROP TRIGGER トリガー名` 

## 解決策
ダブルクォーテーション `"` でトリガー名をかこってSQL実施

`ALTER TRIGGER "トリガー名" DISABLE`

TRIGGERだけでなくアンダースコアから始まる他のオブジェクトでも同じ。
解決してくれたオラクルマスター曰く、
「オブジェクト作成失敗時に `_ + オブジェクト名` なオブジェクトが作成される場合がある」とかなんとか



忘れそうなのでメモ。
Golangでメソッドチェーン


もっといい方法があるかと思いますが

##シンプルに

```golang
package main

import (
	"fmt"
)

type Term struct {
}

func (e *Term)ex1() *Term {
	fmt.Println("1")
	return e
}

func (e *Term)ex2() *Term {
	fmt.Println("2")
	return e
}


func (e *Term)ex3() *Term {
	fmt.Println("3")
	return e
}

func main() {
	e := &Term{}
	e.ex1().ex2().ex3()
}

```

##たとえばデータベース操作で

エラー処理、セッション関係と実際の処理は省いています

```golang
package main

type DbTerm struct {
	dbName string
	tableName string
}

func Db(dbName string) *DbTerm {
	term := &DbTerm{dbName, ""}
	return term
}

func (e *DbTerm) Table(tableName string) *DbTerm {
	term := &DbTerm{e.dbName, tableName}
	return term
}

func (e *DbTerm) Insert(data map[string]interface{}) error {
	//Insert処理
}

func main() {

	data := map[string]interface{} {"testkey":"testvalue"}
	
	err := Db("testdb").Table("testtable").Insert(data)
	
	if err != nil ...
}

```
OS X 10.10 Yosemiteにgcc, gfortranをインストール

OS X 10.10 YosemiteにMacPortsからgcc, gfortranをインストールする手順．

1. XcodeとXcode Command Line Toolsのインストール．
    App StoreよりXcodeをインストールする．
    Command Line ToolsはXcode 6.*では
         $ xcode-select --install
    と実行するとダイアログが表示されるので，"インストール"をクリック．

2. Xcodeライセンス条項に同意
    Xcodeを一度起動するか、ターミナルより
          $ sudo xcodebuild -license
   と実行し，ライセンス条項に同意する．

3. MacPortsのインストール
    MacPorts のページから，Yosemiteに対応したインストーラをダウンロードしてインストール．

4. MacPortsでgccをインストール
    ターミナルで以下のコマンドを実行する。
         $ sudo port install gcc49
         $ sudo port select gcc mp-gcc49
gccのビルドに掛かる時間はマシンのスペックによるが、1時間以上掛かる場合もある。

5. gcc, gfortranのバージョンを確認
    ターミナルで
        gcc -v
        gfortran -v
「predictions from the GeoHipster crowd」要点


「What will be hot in geo in 2015 — predictions from the GeoHipster crowd」
http://geohipster.com/2014/12/27/will-hot-geo-2015-predictions-geohipster-crowd/
の要点（技術関係を中心に拾ったものだけ）を書き出してみる。

- QGIS が地図作成（cartography）に使われる。そのための拡張が行われる。
- モバイルの測位機能を使ったモバイルマッピング・トラッキングソリューションが出る。
- 自動運転の関係で LiDAR やデータ収集が進展する。
- indoor mapping が再び出てくる。
- e-paper 時計に地図が出る。
- 他産業がジオを追従した結果、当該産業ではGISは不要だということが明らかになる。ドメインスペシフィックなニーズには"just enough geo"が対応することになる。「“Enterprise GIS” is really only relevant to GIS enterprises.」
- (tmcw)「何でも屋」段階を脱した会社がキラーアプリを作って包括契約に動き、教育やサポートのための人的基盤を構築する。
- (tmcw)スレッド、クラウド、GPUの新技術に対応した対抗馬がGDAL/PostGIS/Mapnikスタックを脅かす。
- (tmcw)ベクトルタイルが遂に広く入手可能になり、サーバサイドスタックにあったものの多くをクライアントサイドが食う。
- Esriがpay-for-playオプションを一般に提供する。
- UAVがレンズと処理可能データとの経路を短縮する。まずは災害対応で、そして農業分野で。
- The architectural paradigm driving all this is very cloud- and horizontal-scaling-oriented: everything has to be chopped into tiny pieces, everything has to be embarrassingly parallel, everything is a URL, and everything Has-To-Be-In-JavaScript. 最近の JavaScript の奔流は、2000年代初期における Java のジオでの奔流に似ている。
- Javaのときと同じく、JavaScript ソリューションの爆発的増加は、JavaScript ソリューションの大量絶滅を伴う。JavaScript ベースのアーキテクチャは、時代遅れと評価されるときがくる。
- 撮像と画像処理のコストが減少する。
- 地図表現をともなわないジオが増える。（地図もいずれ戻ってくる）
- コンシューマの位置の常時取得が前提となるソリューションが増加する。
- OSM へのデータ流入について more and more best practices and robust toolchains will emerge.

注目プロジェクト
==
- Leaflet
- ID
- geojson.io
- Turf
- Carmen
標準地図18兄弟（作りかけ）


国土地理院の電子地形図（タイル）「標準地図」をズームレベルごとに理解する試み。作りかけ。ズームレベルごとの感覚を養成することが目的。

ゼロ
==
全世界を含む唯一のタイル
縮尺は5億分の1に相当するという。
<img src="http://cyberjapandata.gsi.go.jp/xyz/std/0/0/0.png"></img>

ワン
==
大陸レベルのタイル
<img src="http://cyberjapandata.gsi.go.jp/xyz/std/1/1/0.png"></img>

ツー
==
<img src="http://cyberjapandata.gsi.go.jp/xyz/std/2/3/1.png"></img>

スリー
==
<img src="http://cyberjapandata.gsi.go.jp/xyz/std/3/7/3.png"></img>

フォー
==
<img src="http://cyberjapandata.gsi.go.jp/xyz/std/4/14/6.png"></img>

ファイブ
==
<img src="http://cyberjapandata.gsi.go.jp/xyz/std/5/28/12.png"></img>

シックス
==
<img src="http://cyberjapandata.gsi.go.jp/xyz/std/6/56/25.png"></img>

セブン
==
<img src="http://cyberjapandata.gsi.go.jp/xyz/std/7/113/50.png"></img>

エイト
==
<img src="http://cyberjapandata.gsi.go.jp/xyz/std/8/226/101.png"></img>

ナイン
==
広域をカバーするのに適するタイル。
ディスプレイ縮尺としては、このあたりが100万分の1。
<img src="http://cyberjapandata.gsi.go.jp/xyz/std/9/453/202.png"></img>

テン
==
<img src="http://cyberjapandata.gsi.go.jp/xyz/std/10/906/404.png"></img>

イレブン
==
エリアをカバーするのに適するファイル。
<img src="http://cyberjapandata.gsi.go.jp/xyz/std/11/1813/808.png"></img>

トゥエルヴ
==
<img src="http://cyberjapandata.gsi.go.jp/xyz/std/12/3626/1617.png"></img>

サーティーン
==
町村単位で見るのに適するタイル
<img src="http://cyberjapandata.gsi.go.jp/xyz/std/13/7252/3234.png"></img>

フォーティーン
==
ブラウザで現地ベースの地図編集をするには最小のズームレベル
内容面から言って5万分の1相当、と言えるのではないだろうか。
<img src="http://cyberjapandata.gsi.go.jp/xyz/std/14/14505/6469.png"></img>

フィフティーン
==
内容面から言って2万5千分の1相当、と言えるタイル。
ウェブ地図がなんとか成立するためには、ズームレベル15の提供までは必須なのではないかと考えられる。
<img src="http://cyberjapandata.gsi.go.jp/xyz/std/15/29011/12938.png"></img>

シックスティーン
==
細かな道路が分かってくるレベルのタイル。
<img src="http://cyberjapandata.gsi.go.jp/xyz/std/16/58022/25877.png"></img>

セブンティーン
==
<img src="http://cyberjapandata.gsi.go.jp/xyz/std/17/116045/51755.png"></img>

エイティーン
==
<img src="http://cyberjapandata.gsi.go.jp/xyz/std/18/232090/103513.png"></img>


参考資料
==
http://wiki.openstreetmap.org/wiki/Zoom_levels
ズームレベルと縮尺の関係が柔らかく記載されている。縮尺については、赤道、0.3 mm / pixelを想定しての記載であるとのこと。
chef の rpm_package リソースで http 経由で rpm をインストールする

chef の rpm_package リソースで http 経由で rpm をインストールしようと

```rb
rpm_package 'xxx' do
  source 'http://xxx/xxx.rpm'
end
```

としたができなかった。コードを読むと、どうやら chef のロジックに `File.exist?(@resource.source)` のような余計なチェックが入っているようで、そこで弾かれてしまっているようだ。

そこで、http 経由で rpm をインストールできるようにしたのでメモ。

# その１ - remote_file でファイルを落としてくる

`remote_file` で http 経由でファイルを落として来て、それを `rpm_package` で入れる。

そういう definitions を定義してしまえばよい。

コードはこちらにある => https://gist.github.com/sonots/c538cb368b3c2b366632

# その２ - rpm_package のロジックを変える

rpm_package をカスタムして、HTTP 指定の場合は `File.exists?` チェックしないようにする。

コードはこちらにある => https://gist.github.com/sonots/7def97e78bc7e04847eb

# おわりに

個人的には、複数のリソースを１度に動かしとログにたくさん結果が出てしまうので、１つのリソースで完結する２の方が気に入っている。

ただ、ホントは rpm コマンドを叩く前に、HTTP HEAD でファイルの存在確認をしたほうが良くって、まだそこができてない。そこを実装したら PR 送れる。FTP のパターンもあってめんどくさい。

追記: まだチェックはいれてないけど、とりあえずプルリった => https://github.com/opscode/chef/pull/2770
ハーバード大のStatistics and R for the Life Sciencesをオンラインで

Just info.で恐縮ですが、ハーバード大の統計のコースがオンラインで受けられるっぽいです。
元ネタは[SimplyStats](http://simplystatistics.org/2015/01/12/statistics-and-r-for-the-life-sciences-new-harvardx-course-starts-january-19/)からです。
統計といっても、公衆衛生学の教授がコーススタッフだったりするので、皆様の普段の活動領域とはかなり異なるかも知れませんが。。。

<授業内容一覧>
・Statistics and R for the Life Sciences
・Introduction to Linear Models and Matrix Algebra
・Advanced Statistics for the Life Sciences
・Introduction to Bioconductor
・Case study: RNA-seq data analysis
・Case study: Variant Discovery and Genotyping
・Case study: ChIP-seq data analysis
・Case study: DNA methylation data analysis

ご興味ある方はどうぞ。
GeoJSON + style

GeoJSON CSS http://wiki.openstreetmap.org/wiki/Geojson_CSS が考えていることが、geojson-with-style https://github.com/gsi-cyberjapan/geojson-with-style-spec が考えていることとほとんど同じ。

https://github.com/albburtsev/Leaflet.geojsonCSS もある。GeoJSON CSS がまだ息をしているならば合流を試みたいもの。

文法の違いはいつでも吸収できるので置いておいて、デザイン上の違いは、GeoJSON_CSS は SVG に依拠しているが、geojson-with-style は Leaflet に依拠していること。双方の良い面と悪い面を代表している。

やりたいことは、「KML で出来ていることをできるようにする」という同じことだと思う。また、Leaflet と SVG（というより HTML）の「特別な関係」を考えると、SVG 依拠と HTML 依拠は、語彙の部分ではほとんど同じになる。cross-library になるか cross-browser-implementation になるか、SVG よりもハイレベルへの対応可能性を残すか殺すか、といった思想の相違のみである。
【GCD】実行キューのラベルを取得する

iOS の GCD で処理を実行したときに、「本当にこのキューで実行されてるのかな？」と確認したくなったときに、実行キューのラベルを確認する方法。

ここでいう「ラベル」とは、

```objc
dispatch_queue_t queue = dispatch_queue_create("com.shu223.hoge", DISPATCH_QUEUE_SERIAL);
```

みたいに `dispatch_queue_create()` で**キューを生成する際に第1引数に指定する文字列**です。

##dispatch_queue_get_label

ラベルを取得するには、`dispatch_queue_get_label()` という関数が使用できます。

```objc
// Create a GCD object:
dispatch_queue_t someQueue = dispatch_queue_create("someQueue", nil);

// put a block on the queue, the queue retains the block.
dispatch_async(someQueue, ^{
    // capture the GCD object inside the block,
    // the block retains the queue and BAM! retain cycle!
    const char *label = dispatch_queue_get_label(someQueue);
    NSLog(@"%s", label);
});
```

（参考：[http://amattn.com/p/grand_central_dispatch_gcd_summary_syntax_best_practices.html](http://amattn.com/p/grand_central_dispatch_gcd_summary_syntax_best_practices.html)）


##DISPATCH_CURRENT_QUEUE_LABEL

ただ、`dispatch_queue_get_label` だと、引数にキューを渡さないといけないので、 `dispatch_async` でディスパッチしたわけじゃない場合に困る。


たとえば Core Bluetooth でセントラルマネージャのイベントディスパッチ用のキューを次のように指定した場合。

```objc
// キューを保持するプロパティ
@property (nonatomic, strong) dispatch_queue_t centralQueue;
```

```objc
// セントラルのイベントをディスパッチするキューの作成
self.centralQueue = dispatch_queue_create("com.shu223.BLEExample", DISPATCH_QUEUE_SERIAL);

// キューを指定してセントラルマネージャを初期化
self.centralManager = [[CBCentralManager alloc] initWithDelegate:self
                                                           queue:self.centralQueue];
```

各種デリゲートメソッドが呼ばれるときに、実行キューがちゃんと指定したものかどうかを確認したい、でも「現在実行しているキューのオブジェクトの取得方法」がよくわからん。。


・・・前置きが長くなりましたが、`DISPATCH_CURRENT_QUEUE_LABEL` を使用して次のようにすればOKでした。

```objc
const char *label = dispatch_queue_get_label(DISPATCH_CURRENT_QUEUE_LABEL);
NSLog(@"実行キュー: %s", label);
```


先のCore Bluetoothのセントラルマネージャの例でいえば、こんな感じで実行キューを確認できます。

```objc
- (void)   centralManager:(CBCentralManager *)central
    didDiscoverPeripheral:(CBPeripheral *)peripheral
        advertisementData:(NSDictionary *)advertisementData
                     RSSI:(NSNumber *)RSSI
{
    const char *label = dispatch_queue_get_label(DISPATCH_CURRENT_QUEUE_LABEL);
    NSLog(@"実行キュー: %s", label);
}
```

###Swiftの場合

```swift:swift2
let label = dispatch_queue_get_label(DISPATCH_CURRENT_QUEUE_LABEL)
print(String(format: "queue label: %s", label))
```

```swift:swift3
let label = String(validatingUTF8: __dispatch_queue_get_label(nil))!
print(String(format: "queue label: %s", label))
```

ちなみに

```
print("queue label: \(label)")
```

だけだとちゃんと文字列として表示してくれませんでした。


##参考

- http://amattn.com/p/grand_central_dispatch_gcd_summary_syntax_best_practices.html
- queue.h （GCDのヘッダ）
数学ガールの秘密ノート第102回をC++で実装


https://cakes.mu/posts/8032

-2進数法の話。
unsigned intとsigned intの暗黙的変換が必要なのでRubyは使えず。
以下のソースコードの0xaaaaaaaaについて。0xaaaaaaaa+(0xaaaaaaaa>>1)==0xffffffff、すなわち-1になる。

```cpp:mathgirl_note102.cpp
#include <iostream>
#include <sstream>
#include <iomanip>
#include <string>
//最初の方法
std::string negabinary(int n){
	std::string s;
	do{
		//q=n div -2
		//r=n mod -2
		int r=n&1;
		int q=(n-r)/-2;
		s=std::string(1,'0'+r)+s;
		n=q;
	}while(n!=0);
	return s;
}

//対称3進数との関連
std::string trinary_rec(int n){
	int r=n%3;
	int q=n/3;
	if(r==2)q++;
	return (q!=0 ? trinary_rec(q) : std::string())+"0+-"[r];
}
std::string negabinary_rec(int n){
	int r=n&1;
	//C++だと負数の除算は絶対値が少ない方に丸められる
	//int q=n/-2;
	//if(r==1)q++;
	int q=(n-r)/-2;
	return (q!=0 ? negabinary_rec(q) : std::string())+"01"[r];
}

//ビット演算
std::string negabinary_without_loop(int n){
	int x=n+0xaaaaaaaa;
	int y=x^0xaaaaaaaa;

	//以下は表示のために必要。変数yは求める数を数値として保持している
	std::string s;
	do{
		s=std::string(1,(y&1)+'0')+s;
		y>>=1;
	}while(y!=0);
	return s;
}

int main(){
	for(int i=0;i<23;i++)std::cout<<negabinary_without_loop(i)<<std::endl;
}
```
enchant.jsとtmlib.jsを使ったゲーム作成フレームワーク「enforce」waitjob()について

# @waitjob() について
このゲームフレームワークの重要な機能として、

* @waitjob()
* @nextjob()

の2つがありますが、この「**@waitjob()**」の意味が分からないとよく言われるので解説しておきます。

**例１**

```coffeescript
switch @_processnumber
    when 0
        @xs = 4
        @waitjob(1)
    when 1
        @xs = 0
        @waitjob(1)
    when 2
        @xs = -4
        @waitjob(1)
    when 3
        @xs = 0
```
この例で説明していきます。
まず「**when 0**」で「**@xs**」に4が代入されます。
この処理でこのキャラクターは右へ4ピクセルづつ毎フレーム移動します。
この「**4ピクセルづつ移動**」をどれくらいの時間実行するのかを指定するのが「**@waitjob(n)**」です。
「**@waitjob(1)**」とすることによって、「**@xs = 4**」の状態のまま1秒間処理されます。
もし、「**@xs = 4**」の下に「**@ys = 4**」も書いておいた場合、1秒間斜め右下へ移動し続けます。
そして、1秒経過すると「**@_processnumber**」が「**@waitjob()**」を実行した時の数字からインクリメントされた値になるので、次の「**when 1**」が実行されます。
「**when 1**」では、「**xs = 0**」として「**@waitjob(1)**」となっているので、1秒間静止したままになります。
すると1秒後に「**when 2**」が実行されるので、今度は左へ1秒間移動する………という流れになります。
これが、「**@waitjob()**」の動きになります。

「**@nextjob()**」は単純に、「**@_processnumber**」をインクリメントするメソッドになります。
実行すると強制的にswitchの次のwhenが実行されるようになります。

この、behavior内で実行される処理を制御する「**@_processnumber**」は、

* @waitjob()
* @nextjob()
* @setProcessNumber()

以外で値が変化することはありません。

---

[enforceチュートリアル一覧](http://qiita.com/digitarhythm/items/9e75c871f5ce582a4d01)
Blender基本操作

日本語表記で説明しています.
特に説明がない場合は3Dビューでの操作としています.
Windows版です.

####様々な選択方法
[Blender]様々な選択方法(http://qiita.com/okuhiiro/items/8fdeba3dcdeaa23dc1ac)

---

####マテリアル


---

####テクスチャ関係

[Blender] テクスチャ関係(http://qiita.com/okuhiiro/items/1926de1024bb837967e0)

---

####頂点を作成
EditModeで
**Ctrl** + *左クリック*

---

####辺を作成
EditModeで辺をひきたい2点を選択して
**f**

---

####面を作成
EditModeで面を作成したい複数点を選択して
**f**

選択した点の数により三角形や四角形の面が張られる.

---

####頂点を結合
EditModeで結合したい頂点を選択して
**Alt + m** → *結合方法を選択*

---

####オブジェクト分離
EditModeで分離したいMeshを選択して
**p** → **選択物**

---

###オブジェクト結合
ObjectModeで結合したいオブジェクトを選択して
**Ctr + j**

注意点として最後に選択したオブジェクト統合されます.
ピボットポイントなども最後に選択したオブジェクトになります.

---

###オブジェクト追加
ObjectModeで
**Shift + a** → *追加する形状の選択*

EditModeでもこの操作は可能であるが、オブジェクト追加でなく、Editしているオブジェクトに追加されることとなるので注意.

---

###複数の頂点をX位置を0にする
EditModeでX位置を0にしたい複数の頂点を選択して
*プロパティバー* → *トランスフォームをグローバルに* → *X:0にする* → **Enter**

主にX軸でミラーする場合に使います.
もちろんy、z軸でもできます.

---

###ミラーモディファイアの適用
ObjectModeでミラー対象のオブジェクトを選択して
*プロパティウィンドウ* → *モディファイア アイコン* → *追加* → *ミラー*

ミラーの対象オブジェクトの原点を基準に行われる.
オブジェクトが位置・回転などがおかしいと意図しないミラーがおこなわれるため、適用やクリアを行うとよい.

---


---
開発用PC と dockerコンテナ との距離がグッと近づく 2つの架け橋

この投稿は、wordpress のプラグイン開発環境を docker 上に構築することを題材として、boot2docker および docker のネットワークや共有ディスクの理解を深めることを目的としています。

boot2docker 上で docker コンテナを稼働させるときに、開発用PC から docker コンテナまでの間に距離を感じている方は、この **2つの架け橋** によって、グッと距離が近くに感じられるようになるハズです。

なお、docker や boot2docker のインストール方法などについては記載しておりません。

# 開発用PC と dockerコンテナ の距離感
やりたいことはシンプルなのですが、開発用PC と dockerコンテナ の間に仮想化が2階層はいってくると、とたんに距離を感じてしまいます。

## サーバー構成と要件

- wordpress が動作する Webサーバー 1台
- wordpress のデータを保持する DBサーバー 1台
- 上記の Webサーバー と DBサーバー を連携させます。
- 開発用PC から wordpress のサイトにブラウザでアクセスできること。
- 開発用PC から wordpress のプラグイン関連ファイルの読み書きできること。

![やりたいことのイメージ.png](https://qiita-image-store.s3.amazonaws.com/0/31521/64a26993-db0a-e549-65a3-820ea704cb93.png)

やりたいことは、とてもシンプルです！
ところが、いざ docker で環境を構築しようとすると…。


## 構築する環境

- Webサーバー と DBサーバー は、dockerコンテナ として構築します。
- 開発用PC は Linux ではないため、boot2docker を使用します。

![仮想化による距離感.png](https://qiita-image-store.s3.amazonaws.com/0/31521/96dd2911-95a5-bb3b-5471-f21a7ad5304f.png)

こうなると、開発用PC から dockerコンテナ まで、少し距離を感じてきませんか？

 - 開発用PC のブラウザから、どうやって dockerコンテナ内の wordpress にアクセスしようか…。
 - 開発用PC から、どうやって docker コンテナ内の plugins フォルダを読み書きしようか…。

# さあ、橋を架けましょう

次のたった2行の docker コマンドだけで、環境構築が完了してしまいます。

```shell-session
boot2docker$ docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=mysecretpassword -d mysql
boot2docker$ docker run --name some-wordpress --link some-mysql:mysql -d -p 80:80 -v /c/Users/someone/plugins:/var/www/html/wp-content/plugins wordpress
```
いったい、何が起きているのでしょうか？
docker コマンド内のオプション指定が、どこのリンクに影響しているのかを確認してみてください。

![架け橋のイメージ.png](https://qiita-image-store.s3.amazonaws.com/0/31521/6c6aac40-f9fe-5fc5-fffb-47388df9827f.png)

さらに距離を近づけてくれているのが、boot2docker の **Host only interface** と **自動マウントされる共有フォルダ** です。（特に何も設定することなく、有効になっているハズです）

 - Host only interface のおかげで、ポートフォワードの設定をすることなく、dockerコンテナが公開しているポートへ 開発用PC から接続できます。
 - 自動マウントされる共有フォルダのおかげで、コンテナ内 と 開発用PC の両方から同一フォルダを参照できるようになります。（開発用PC の C:\Users\ が、boot2docker の LinuxVM 上の /c/Users/ に自動マウントされています）

## 実際にアクセスするには

### wordpress のサイトにブラウザからアクセスするには

開発用PC 上で、boot2docker.exe コマンドを使って、Host only interface の IPアドレス を調べてください。

```shell-session
PC> boot2docker.exe ip
The VM's Host only interface IP address is: 192.168.xxx.xxx
```
ブラウザから http://192.168.xxx.xxx/ にアクセスすれば、dockerコンテナ上の wordpress サイトを参照できます。

### wordpress の plugin フォルダを読み書きするには

開発用PC の ```C:\Users\someone\plugins``` を読み書きすれば、docker コンテナ内の plugins フォルダの内容も変更されます。

# まとめ

Linux ではない 開発用PC で docker を使用する場合に感じられる距離感を、2つの架け橋（**ネットワークの架け橋** と **フォルダ共有の架け橋**）を使うことで、グッと近づけることができたと思います。設定自体も **dockerコマンド 2行だけ** なので、気楽に試すことができます。いろいろ応用してみてください。
圏論のモナドの法則からHaskellでよくみる形のモナド則を導き出す

# 関手

関手$F$は、次の法則を満たします。

```math
F(f \circ g) = F(f) \circ F(g) \\
F(1_A) = 1_{F(A)}
```

`fmap`は関手です<sup>[追記]<a id="ref-1" href="#note-1">1</a>[/追記]</sup>。つまり、次の法則が成り立ちます。

```
fmap (f . g) = fmap f . fmap g -- 合成の保存
fmap id = id                   -- 恒等射の保存
```

また、`id`や`fmap . fmap`も関手です。

# モナド

モナド$(T, \eta, \mu)$の自然変換$\eta$と$\mu$は、それぞれHaskellの`return`と`join`に相当します。

```math
\mu_A \circ \mu_{T(A)} = \mu_A \circ T(\mu_A) \\
\mu_A \circ \eta_{T(A)} = 1_{T(A)} = \mu_A \circ T(\eta_A)
```

という法則は、Haskellで言えば

```
join . join = join . fmap join
join . return = id = join . fmap return
```

です。

Haskellの`>>=`演算子は、`join`と`fmap`を使って次のように定義できます。

```
m >>= f = join (fmap f m)
```

# 自然変換

自然変換$\theta_A : F(A) \rightarrow G(A)$は、次の法則（自然性）を満たします。

```math
\theta_B \circ F(f) = G(f) \circ \theta_A
```

`return`と`join`も自然変換なので、自然性が成り立ちます。

```
return . id f = fmap f . return
join . (fmap . fmap) f = fmap f . join
```

# モナド則

以上のことから、次のモナド則を導いてみます。(出典: [The monad laws](http://www.sampou.org/haskell/a-a-monads/html/laws.html))

```
1. return x >>= f = f x
2. m >>= return = m
3. (m >>= f) >>= g = m >>= (\x -> f x >>= g)
```

## 1. `return x >>= f = f x`

```
return x >>= f
= join (fmap f (return x))      -- (>>=)の定義を展開
= (join . fmap f . return) x    -- 関数の合成を使った形に書き換え
= (join . return . id f) x      -- returnの自然性
= (id . id f) x                 -- join . return = id
= f x
```

## 2. `m >>= return = m`

```
m >>= return
= join (fmap return m)      -- (>>=)の定義を展開
= (join . fmap return) m    -- 関数の合成を使った形に書き換え
= id m                      -- join . fmap return = id
= m
```

## 3. `(m >>= f) >>= g = m >>= (\x -> f x >>= g)`

```
(m >>= f) >>= g
= join (fmap g (join (fmap f m)))                -- (>>=)の定義を展開
= (join . fmap g . join . fmap f) m              -- 関数の合成を使った形に書き換え
= (join . join . fmap (fmap g) . fmap f) m       -- joinの自然性
= (join . fmap join . fmap (fmap g) . fmap f) m  -- join . join = join . fmap join
= (join . fmap (join . fmap g . f)) m            -- 合成の保存
= join (fmap (join . fmap g . f) m)              -- 関数の合成の展開
= m >>= (join . fmap g . f)                      -- (>>=)の定義を使った書き換え
= m >>= (\x -> (join . fmap g . f) x)            -- η変換の逆
= m >>= (\x -> (join (fmap g (f x))))            -- 関数の合成の展開
= m >>= (\x -> f x >>= g)                        -- (>>=)の定義を使った書き換え
```

以上より、モナドについて、上記3つのモナド則が満たされることがわかりました。

TODO: その逆、モナド則を満たすならモナドであることを示す。

<a id="note-1" href="#ref-1">1</a>. [追記]ここのところについて、[関数で関手が表現できるって変でしょ、どういう仕掛けかな？ - 檜山正幸のキマイラ飼育記](http://d.hatena.ne.jp/m-hiyama/20110111/1294706817)が分かりやすく解説しています。[/追記]
PlayFrameworkのテスト用PhantomJSを自動インストールする

PhantomJSをいちいちインストールするのがめんどくさいため、自動的にやるプラグイン[sbt-phantomjs](https://github.com/saturday06/sbt-phantomjs)を作りました。そいつのPlayFrameworkへの適用方法を解説します。

まずは、sbt-phantomjsプラグインをプロジェクトに追加します。

```scala:project/plugins.sbt
addSbtPlugin("jp.leafytree.sbt" % "sbt-phantomjs" % "0.1.4")
```

次に、追加したプラグインを有効化します。

```diff:build.sbt
-lazy val myApp = (project in file(".")).enablePlugins(PlayScala)
+lazy val myApp = (project in file(".")).enablePlugins(PlayScala, PhantomJs)
```

次に、SeleniumのPhantomJS Driverを追加します。

```scala:build.sbt
libraryDependencies += "com.github.detro.ghostdriver" % "phantomjsdriver" % "1.1.0" % "test"
```

次に、下記設定を追加します。これはPhantomJSを自動でインストールしつつPhantomJSDriver用のインストール先情報をテスト実行時のJava VMのプロパティへ設定します<sub><a href="#1">1</a></sub>

```scala:build.sbt
javaOptions in Test ++= PhantomJs.setup(baseDirectory.value)
```

最後に、PhantomJS Driverを使ったテストコードを書きます

```scala:test/IntegrationSpec.scala
import org.junit.runner._
import org.openqa.selenium.phantomjs.PhantomJSDriver
import org.specs2.mutable._
import org.specs2.runner._
import play.api.test._

@RunWith(classOf[JUnitRunner])
class IntegrationSpec extends Specification {
  "Application" should {
    "work from within a browser" in new WithBrowser(webDriver = WebDriverFactory(classOf[PhantomJSDriver])) {
      browser.goTo("http://localhost:" + port)
      browser.pageSource must contain("Hello, PhantomJS World")
    }
  }
}
```

下記のように動くはず！

```shell-session
$ sbt test
[info] IntegrationSpec
[info]
[info] Application should
[info] + work from within a browser
[info]
[info] Total for specification IntegrationSpec
[info] Finished in 3 seconds, 779 ms
[info] 1 example, 0 failure, 0 error
[info] Passed: Total 1, Failed 0, Errors 0, Passed 1
[success] Total time: 18 s, completed 2015/01/17 2:39:21
```

完全に動作するサンプルはGitHubに置いてあります ⇒ https://github.com/saturday06/sbt-phantomjs/tree/master/sample/playframework

- - - 

<a name="1">1.</a> この処理は、将来僕が「PhantomJS Driverが動作する環境のjavaOptionsを自動判定して自動的にプロパティを追加する」やり方を発見しプラグインに反映した場合不要になると思います。