OmniAICreator/Qiita-1.07M huggingface dataset:
Objective-Cの依存関係を視覚化


参考リンクのメモ。
書いたコードの構造を眺めてみて反省してみたり書きなおしてみたりする。
[Doxygen](http://www.doxygen.jp/)で見る手もあるが、事前の設定とかがそれなりの手間だったりするので、サックリと見たいときにはこれで。


## objc_dep + Graphviz 

- [nst/objc_dep](https://github.com/nst/objc_dep)

- [Objective-C - Xcodeプロジェクト内のクラスの依存関係を図示する - Qiita](http://qiita.com/shu223/items/170b899df86952544c17)

- [Objective-Cのクラスの依存関係を画像ファイルに出力 | 三度の飯とエレクトロン](http://blog.katty.in/2443)


### objc_dep
`$ python [objc_dep.py] [対象プロジェクトのディレクトリ] > [出力先・ファイル名].dot`

### graphviz

brewでgraphvizをインストール後、Applicationフォルダからのリンクを生成しておく。

`$ brew install graphviz --with-app`
graphvizはinstall済みだったので、`reinstall`とした。

`$ brew linkapps Cellar/graphviz/2.38.0/Graphviz.app/`


Graphviz.app実行するとFinderから選べ的な状態なるので、生成した.dotファイルを選択。

青線：相互にImportしている
赤線：.pchからのImport

Graphvizのコマンドラインから画像として出力
現状確認〜改善後の確認としてBefore/After的に撮っておくのがよいかも

- [Command-line Usage](http://www.graphviz.org/doc/info/command.html)


## D3.js

- [Objective-Cのクラスの依存関係を「D3.js」でビジュアライズするライブラリ - Over&Out その後](http://d.hatena.ne.jp/shu223/20140309/1394388414)

こちらも試してみたい。

###追記

- [Objc-dependency-visualizer](http://paultaykalo.github.io/objc-dependency-visualizer/)

最初に`generate-objc-dependencies-to-json.rb`を実行した際に出てくるクラスがなんだか少ないなーと思ったら、テスト用のビルド結果が解析対象になっていた。
最後にビルドされた結果を元に依存関係の解析が行われる様子。
clean後に実行用のリビルドしてから再解析したら結果見れた。
[Word VBA]ソースコードをフォーマットする


わけあって、私の仕事では、Word文書やPowerPoint文書にソースコードを貼ることが多い。
苦痛。

と思ってたら、
[Microsoft Wordでソースコードをきれいに書く](http://blog.livedoor.jp/cielo_cielo/archives/54586527.html)
なんて記事が。

というわけで、Word VBAです。これを使えば、Eclipseからwordに貼り付けたコードをそのまま
行番号付きでフォーマットできます。Eclipseで見たままのコードが、Word上でもフォーマットされて表示できる。
表形式にフォーマットするので、そのままPowerPointにも貼り付けられます。
あー、楽になった。

```VB
Sub PPCode()

    ActiveDocument.Select

    Dim codelines As Paragraphs
    Set codelines = Selection.Paragraphs
    
    Selection.Copy
    
    Dim lines As Long
    lines = codelines.Count
    
    Dim lineNumber As Integer
    lineNumber = 1
    
    Dim myTable As Table
    Set myTable = ActiveDocument.Tables.Add(ActiveDocument.Range(0, 0), lines, 2, wdWord9TableBehavior)
            
    myTable.Columns(1).Width = 30
    myTable.Columns(1).Select
    Selection.ParagraphFormat.Alignment = wdAlignParagraphRight
    Selection.Font.Color = wdColorAutomatic
    myTable.Columns(2).Width = 400
                
    Call SetTablelines(myTable)
                
    For lineNumber = 1 To lines
        myTable.Cell(lineNumber, 1).Range.Text = lineNumber
    Next lineNumber
    
    myTable.Columns(2).Select
    Selection.Paste
    
    For Each s In ActiveDocument.Sentences
        s.Select
        If Selection.Information(wdWithInTable) = False Then
            Selection.Delete
        End If
    Next s
    
End Sub

Private Sub SetTablelines(ByRef myTable As Table)
'
' Macro1 Macro
'
'
    With myTable
        With .Borders(wdBorderLeft)
            .LineStyle = wdLineStyleSingle
            .LineWidth = wdLineWidth050pt
            .Color = wdColorAutomatic
        End With
        With .Borders(wdBorderRight)
            .LineStyle = wdLineStyleSingle
            .LineWidth = wdLineWidth050pt
            .Color = wdColorAutomatic
        End With
        With .Borders(wdBorderTop)
            .LineStyle = wdLineStyleSingle
            .LineWidth = wdLineWidth050pt
            .Color = wdColorAutomatic
        End With
        With .Borders(wdBorderBottom)
            .LineStyle = wdLineStyleSingle
            .LineWidth = wdLineWidth050pt
            .Color = wdColorAutomatic
        End With
        .Borders(wdBorderHorizontal).LineStyle = wdLineStyleNone
        With .Borders(wdBorderVertical)
            .LineStyle = wdLineStyleSingle
            .LineWidth = wdLineWidth050pt
            .Color = wdColorAutomatic
        End With
        .Borders(wdBorderDiagonalDown).LineStyle = wdLineStyleNone
        .Borders(wdBorderDiagonalUp).LineStyle = wdLineStyleNone
        .Borders.Shadow = False
    End With
    With Options
        .DefaultBorderLineStyle = wdLineStyleSingle
        .DefaultBorderLineWidth = wdLineWidth050pt
        .DefaultBorderColor = wdColorAutomatic
    End With
End Sub
```
質問：Rubyで、Hashのkeyが存在しないときに、keyごとに空配列を与えたい


# 1.

Hash.new([])を使うと、keyが存在しないときに空配列を値にすることができるけれど、それはすべてのkeyで共有されてしまうオブジェクトなので、以下のようなことが起きてしまう。

```
h = Hash.new([])
h["foo"] << 123
h["foo"] << 456
h["baa"] << 1111
h["baa"] << 2222
p h["foo"] #=> [123, 456, 1111, 2222]
p h["baa"] #=> [123, 456, 1111, 2222]
````

# 2.

次のようにブロックを使えば、keyが存在しないときにkeyごとに別の空配列を値にできる。これをやりたい。

```
h = Hash.new { |hash,key| hash[key] = [] }
h["foo"] << 123
h["foo"] << 456
h["baa"] << 1111
h["baa"] << 2222
p h["foo"] #=> [123, 456]
p h["baa"] #=> [1111, 2222]
````

# 質問

みなさんは、上の2.のようなことをやりたいときに、Hash.new { |hash,key| hash[key] = [] } のように書きますか？

何かイディオムがありそうだけれど、見つけられなかったので質問しました。ご教示いただければ感謝です。
MACのfinderでdotfileを見えるように


~/.vagrant.dの中のファイルをファイルサーバーにコピーしとこうと思ったらfinderの中に表示されてない事に気づいた。
面倒だったのでターミナルでcpしてたんだけど、ファイルサーバー（samba）でマウントする度にディレクトリ探すのが面倒だったのでfinderで表示できるようにした

###2021/01/25 追記
MacのSierra以降では「Cmd+Shift+dot」のショートカットキーで見えるようにできることが可能でした！
コメントありがとうございます！！

###方法

http://inforati.jp/apple/mac-tips-techniques/system-hints/how-to-show-hidden-file-or-folder-of-macos.html
ここを見た。

dotfileを見えるようにする

```bash
defaults write com.apple.finder AppleShowAllFiles -boolean true
killall Finder
```

元に戻す

```bash
defaults delete com.apple.finder AppleShowAllFiles
killall Finder
```


ターミナルからやるしかないんかな？
NSDateで月末月初 ※ただしGMTに注意


今月初から末までのデータを取得するために、月初と月末日を取得するためにこんな感じのコードを書きました。

```objectivec
    NSDate *date = [NSDate date];
    NSLog(@"date = %@",date);
    NSCalendar *calendar = [NSCalendar currentCalendar];
    calendar.locale = [NSLocale currentLocale];
    NSDateComponents *comp =  [calendar components:NSYearCalendarUnit
                               | NSMonthCalendarUnit
                               | NSDayCalendarUnit
                               | NSHourCalendarUnit
                               | NSMinuteCalendarUnit
                               | NSSecondCalendarUnit
                                          fromDate:date];
    comp.day    = 1;
    comp.hour   = 0;
    comp.minute = 0;
    comp.second = 0;
    NSDate *monthBeginningDate =  [calendar dateFromComponents:comp];
    NSLog(@"monthBeginningDate = %@",monthBeginningDate);
    NSLog(@"monthBeginningDate = %@",[monthBeginningDate descriptionWithLocale:[NSLocale currentLocale]]);
    
    NSRange range = [calendar rangeOfUnit:NSDayCalendarUnit inUnit:NSMonthCalendarUnit forDate:date];
    int lastDay =  range.length;
    comp.day = lastDay;
    NSDate *monthEndingDate = [calendar dateFromComponents:comp];
    NSLog(@"monthEndingDate = %@",monthEndingDate);
    NSLog(@"monthEndingDate = %@",[monthEndingDate descriptionWithLocale:[NSLocale currentLocale]]);

```

注意点としては、NSDateは単純にログ出力すると、グリニッジ標準時で日付が出力されます。
なので、例えば2014年の5月の月初と月末を取得すると、
月初=2014-04-30 15:00:00 +0000
月末=2014-05-30 15:00:00 +0000
となってしまいますが、これはバグっているからではなく、グリニッジ標準時標準時換算であるためです。
（恥ずかしながら、これでちょっと混乱してハマってしまいました）

ロケール付きで出力すると、このように期待した日付が取得できている事が確認できます。
Thursday, May 1, 2014 at 12:00:00 AM Japan Standard Time
Saturday, May 31, 2014 at 12:00:00 AM Japan Standard Time
cocos2d-js で多角形をレンダリングする

多角形を表示する際には DrawNodeCanvas あるいは DrawNodeWebGL を用いる．

ドキュメント [DrawNodeCanvas](http://www.cocos2d-x.org/reference/html5-js/V2.2.3/symbols/cc.DrawNodeCanvas.html) [DrawNodeWebGL](http://www.cocos2d-x.org/reference/html5-js/V2.2.3/symbols/cc.DrawNodeWebGL.html)

ここでは DrawNodeCanvas を用いる．

下記コードは http://qiita.com/nise_nabe/items/2271296bf24584e74a13 からの差分．

## 内容

コード片

 src/myApp.js を下記のように書く． DrawNodeCanvas の drawPoly() を用いるために cc.Point の配列を作る．この配列の内容にしたがってパスが記述される


```js
var MyLayer = cc.Layer.extend({
    init:function () {
        this._super();
        var size = cc.Director.getInstance().getWinSize();

        var polygon = new cc.DrawNodeCanvas();
        var points = [ 
            new cc.Point(0, 0), 
            new cc.Point(200, 0), 
            new cc.Point(200, 200),
        ];  
        polygon.drawPoly(points);
        this.addChild(polygon);
    }   
});

var MyScene = cc.Scene.extend({
    onEnter:function () {
        this._super();
        var layer = new MyLayer();
        this.addChild(layer);
        layer.init();
    }
});
```


DrawNodeCanvas を使った場合に `Uncaught TypeError: undefined is not a function` というエラーが出るため ctx.beginPath() がないというエラーが出る場合がある．

エラー箇所

```
bower_components/cocos2d-html5/cocos2d/shape_nodes/CCDrawNode.js
499         ctx.beginPath();
```

その場合は cocos2d.js で renderMode を 1 (Canvas only) にすれば動いた．
0 の場合でも動くものがあるので何らかの条件で Default の設定が影響している？


```diff
diff --git a/cocos2d.js b/cocos2d.js
index 344ebf6..cc83864 100644
--- a/cocos2d.js
+++ b/cocos2d.js
@@ -33,7 +33,7 @@
         showFPS:true,
         loadExtension:false,
         frameRate:60,
-        renderMode:0,       //Choose of RenderMode: 0(default), 1(Canvas only), 2(WebGL only)
+        renderMode:1,       //Choose of RenderMode: 0(default), 1(Canvas only), 2(WebGL only)
         tag:'gameCanvas', //the dom element to run cocos2d on
         engineDir:'bower_components/cocos2d-html5/cocos2d/',
         //SingleEngineFile:'',
```

うまく動くと下記のように表示される．

![screenshot 2014-05-04 21.47.32.png](https://qiita-image-store.s3.amazonaws.com/0/6975/2f71ddbf-37cd-ab4e-54a9-9443503e0183.png)
herokuのpostgreSQLのDBにローカル環境からSQLを実行する。

めっちゃ初歩な内容。

まずローカル環境にheroku-toolbeltが入ってるか確認する。
`heroku version`で確認できる。

```shell-session
$ heroku version                                          
heroku-toolbelt/3.7.2 (x86_64-linux) ruby/2.1.1
```
はいってたら次にすすむ。$RAILS_ROOTの場所で下記を実行した。

```shell-session
$heroku pg:psql
```

```
$ heroku pg:psql
---> Connecting to HEROKU_POSTGRESQL_BLACK_URL (DATABASE_URL)                                                         psql (9.2.6, server 9.3.4)                                                                 WARNING: psql version 9.2, server version 9.3.                                                                            Some psql features might not work.                                                                  SSL connection (cipher: DHE-RSA-AES256-SHA, bits: 256)                                                                                                             
Type "help" for help.
```
ログインできた。なんかでたけど気にしない。
事前にinsert文のみを記述したsqlファイルをプロジェクト直下あげておく。
{RAILS_ROOT}/insert.sql
としておく。
ファイルの読み込みは`\i filename`でいいらしい。

```
=> \i insert.sql
```
これで挿入がされていれば`INSERT 01`１みたいなラインが挿入件数分表示されます。
おわったら、ちゃんとレコードが挿入されたか確認しましょう。
（レコード件数や内容の正誤の確認もやりましよう。）
RabbitMQ3.3.xでweb管理ツールにログインできないときの対処法

久しぶりにRabbitMQを触ってみたら、バージョンが3.3.1になっていました。
私は2.x系までしか触っていなかったのでいくつか違いに躓きました。
忘れないようにメモしておきます。

### 1. web管理ツールにguestでログインできない

これ嘘です。
同サーバ内(localhost)からだったらアクセスできます。
別サーバにRabbitMQたててweb管理ツールに`guest/guest`でアクセスすると認証エラーが発生します。

![rabbit_login.png](https://qiita-image-store.s3.amazonaws.com/0/31408/16654f82-5f6a-2bc2-2b9e-0401ee368e18.png)

[Breaking things with RabbitMQ 3.3](http://www.rabbitmq.com/access-control.html)の`"guest" user can only connect via localhost`に書いてありました。

RabbitMQ3.3.0から`guest`ユーザでのアクセスはlocalhostからに限られるようになったそうです。

なので、別のユーザを作ってあげれば良いわけです。

```zsh
# ユーザを作成
rabbitmqctl -n <node> add_user <ユーザ名> <パスワード>
# rabbitmqctl -n bunny@dev2 add_user admin admin で作りました。
# パーミッションを設定
rabbitmqctl -n <node> set_permissions <ユーザ名> <conf> <write> <read>
# rabbitmqctl -n bunny@dev2 set_permissions admin ".*" ".*" ".*" で作りました。
# ロールを設定
rabbitmqctl -n <node> set_user_tags <ユーザ名> <role>
# rabbitmqctl -n bunny@dev2 set_user_tags admin administrator で作りました。
```

これで`admin`ユーザでログインできるようになります。

![rabbit_ov.png](https://qiita-image-store.s3.amazonaws.com/0/31408/9f791099-844c-f05e-b4bf-f695cf0bfad7.png)

### 2. web管理ツールのポートがかわった

ポートも変わっていました。

3.3.0以前は`http://server:55672/`でアクセスしていたのですが、`15672`に変更になっていました。

これからは
`http://server:15672/`
です。

### 3. 正しいUTF-8以外のバイトコードをうけつけなくなった

これも、[Breaking things with RabbitMQ 3.3](http://www.rabbitmq.com/access-control.html)が元ネタです。

UTF-8として正しくないバイトコードメッセージはdropすると・・・つまり破棄しちゃうってことですよね。おそろしいΣ(￣□￣; )
NLTKのplotで日本語を使う方法

#出力結果
![figure_1.gif](https://qiita-image-store.s3.amazonaws.com/0/38787/139645c3-e5dd-a3bc-6520-5c55493c283f.gif)

#概要
NLTK(自然言語処理用ライブラリ)のplot機能(グラフ出力)で、日本語が使えるようにする。
[オライリー本「入門 自然言語処理」](http://www.amazon.co.jp/exec/obidos/ASIN/4873114705/ikomadiary-22/)（[->英語版[無料]](http://www.nltk.org/book/)）の[Python による日本語自然言語処理](http://nltk.googlecode.com/svn/trunk/doc/book-jp/ch12.html)の章で、
"ただし、 matplotlib では、標準では日本語が文字化けしてしまうことに注意。"とあるが、
対処法が見当たらないので、自前で対処した。

#前提知識
[ -> Python による日本語自然言語処理](http://nltk.googlecode.com/svn/trunk/doc/book-jp/ch12.html)

#環境
LinuxMint13(Ubuntu12.04)

#コード
```py:NLTK日本語plot.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import sys
reload(sys)
sys.setdefaultencoding('UTF-8')

import MeCab
import nltk
from numpy import *
from nltk.corpus.reader import *
from nltk.corpus.reader.util import *
from nltk.text import Text
import jptokenizer

### matplotデフォルトフォントの指定 ### ←ポイント1：明示的に日本語フォントを指定
import matplotlib
import matplotlib.font_manager as font_manager
#TTFファイル(フォント)のアドレスを指定
font_path = '/usr/share/fonts/truetype/fonts-japanese-gothic.ttf'
#フォントの詳細情報を取得
font_prop = font_manager.FontProperties(fname = font_path)
#フォントの名前を使い、matplotのデフォルトフォントに指定
matplotlib.rcParams['font.family'] = font_prop.get_name()

### 日本語コーパス(unicode)の作成 ### ←ポイント2：単語群はunicodeで管理
#コーパスを読み込み
jp_sent_tokenizer = nltk.RegexpTokenizer(u'[^　「」！？。]*[！？。]')
reader = PlaintextCorpusReader("/home/ユーザ/デスクトップ", r'NKMK.txt',
                                encoding='utf-8',
                                para_block_reader=read_line_block,
                                sent_tokenizer=jp_sent_tokenizer,
                                word_tokenizer=jptokenizer.JPMeCabTokenizer())
#コーパスからunicode指定で単語群を取得
nkmk = Text(unicode(w) for w in reader.words())

### 描画 ### ←ポイント3：引数もunicodeで指定
nkmk.dispersion_plot([u'にこ',u'真姫',u'ここあ',u'こころ'])
```

#解説
（ソース内コメント参照）

#課題
ConditionalFreqDist.plot()のラベルは日本語化できない。
/usr/local/lib/python2.7/dist-packages/nltk/probability.pyを読むと、
"kwargs['label'] = str(condition)"（1790行目）となっている。
つまり、ラベルの文字列はstr()関数を通して出力されるので、日本語は確実に化ける。
修正方法は先の行を"kwargs['label'] = unicode(condition)"にする事となる。
同様のケースがあった場合は、同様にライブラリに手を加える必要があると思われる。

[修正前]
![figure_2.jpeg](https://qiita-image-store.s3.amazonaws.com/0/38787/627eddcb-ead9-d85d-785e-be1872a33d82.jpeg)

[修正後]
![figure_3.jpg](https://qiita-image-store.s3.amazonaws.com/0/38787/79c48817-7f80-f3c2-1ff2-2c68db26e155.jpeg)

#参考サイト
[ -> Matplotlibにおける日本語について](http://nbviewer.ipython.org/gist/mkatsura/6129979)
[ -> nltk.FreqDist および nltk.ConditionalFreqDist の plot() で日本語を出力させる方法 - (主に)プログラミングのメモ](http://yoshihikomuto.hatenablog.jp/entry/2012/12/27/134202)
ツナでもわかるmruby [3回目：数値]


![ツナ_ウイスキー.jpg](https://qiita-image-store.s3.amazonaws.com/0/13835/f0f1a07b-f1a7-8504-0f25-28dd5cfe5610.jpeg "ツナ_ウイスキー.jpg")


写真は我が家の猫、ツナです。最近風邪を引きましたが、どうにか熱も下がってきました(´ω`)

[2回目](http://qiita.com/hiroeorz@github/items/69de85b52f854542557f)の文字列に続き、今回からは数値関係をさらっと学びます。
以下は全て、mrubyに含まれる対話型のRubyシェルmirbから直接試す事ができます。


```
$ mirb
mirb  Embeddable Interactive Ruby Shell

>
```

## 数値

####四則演算

四則演算は期待通りの動作。だいたいRubyと同じみたいです。

```ruby:mirb
1 + 2     #=> 3
2 - 1     #=> 1
1 - 3     #=> -2
1.0 + 2.1 #=> 3.10
1 + 2.1   #=> 3.10
4 / 2     #=> 2.0
2 / 3     #=>0.66666666666666
2 % 3     #=> 2

```

ひとつRubyと違う点は整数同士の割り切れる割り算であっても、返り値はFloatです。

> Ruby 2.1.1

>```ruby:irb
>4 / 2 #=> 2
>```

> mruby

>```ruby:mirb
>4 / 2 #=> 2.0
>```

>整数の結果が得たい場合は<code>div</code>を使用します。

>```ruby:mirb
>4.div 2 #=> 2
>4.div 3 #=> 1
>```

####数値を割った商と余りを配列にして返す

```ruby:mirb
10.divmod 3 #=> [3, 1]
```

mrubyもRubyと同様、配列の戻り値に対してパターンマッチが使えるので、次のように受け取ると<code>a, b</code>に商と余りがそれぞれ入ります。

```ruby:mirb
a,b = 10.divmod 3

a #=> 3
b #=> 1
```

####数値から文字列への変換

```ruby:mirb
3.to_s #=> "3"
```

####文字列から数値への変換

Integerへの変換

```ruby:mirb
"3".to_i #=> 3
```

Floatへの変換

```ruby:mirb
"3".to_f #=> 3.0
```

####絶対値の取得

絶対値

```ruby:mirb
-3.abs #=> 3
```

> 絶対値の2乗を返す<code>abs2</code>はmrubyでは実装されていないようです。

####切り上げ、切り捨て等
自身と等しいか、より大きな整数のうち最小の整数を取得

```ruby:mirb
3.2.ceil  #=>  4
3.0.ceil  #=>  3
-3.2.ceil #=> -3
```

自身と等しいかより小さな整数のうち最大の整数を取得

```ruby:mirb
3.2.floor  #=>  3
3.0.floor  #=>  3
-3.2.floor #=> -4
```

自身と最も近い整数を取得

```ruby:mirb
3.2.round #=> 3
3.7.round #=> 4
3.5.round #=> 4
```
> 0.5は1に、-0.5は-1にまるめられる。

```ruby:mirb
0.5.round  #=>  1
-0.5.round #=> -1
```

0から自身までの整数で、自身に一番近い整数を取得

```ruby:mirb
3.2.truncate  #=>  3
3.7.truncate  #=>  3
-3.2.truncate #=> -3
```

####ゼロかどうかを判定する

```ruby:mirb
a = 0
a.zero?
(mirb):32: undefined method 'zero?' for 0 (NoMethodError)

```

おや、<code>zero?</code>はないみたいです。まあ<code>a == 0</code>で事足りますけどね。

####16進数

16進数を表現する場合は数値の前に<code>0x</code>をつけます。

```ruby:mirb
0x10 #=> 16
0xff #=> 255
```

####2進数

2進数を表現する場合は数値の前に<code>0b</code>をつけます。

```ruby:mirb
0b11111111 #=> 255
0b01111111 #=> 127
```

####8進数
8進数を表現する場合は数値の前に<code>0o</code>をつけます。

```ruby:mirb
0o10 #=> 8
0o11 #=> 9
```

####ビット演算

Webアプリで使う事は殆どないだろうけど組込みでは使いそうなイメージのあるビット演算。

左方向ビットシフト

```ruby:mirb
a = 1  #        0001
a << 1 #=> 2    0010
a << 2 #=> 4    0100
a << 3 #=> 8    1000
```

右方向ビットシフト

```ruby:mirb
a = 8  #        1000
a >> 1 #=> 4    0100
a >> 2 #=> 2    0010
a >> 3 #=> 1    0001
a >> 4 #=> 0    0000
```

ビットのandをとる

```ruby:mirb
0b0011 & 0b0010 #=> 2    0010
```

ビットのorをとる

```ruby:mirb
0b0011 | 0b1010 #=> 11   1011
```

きりがないので、これくらいで... Rubyのリファレンスマニュアルに書いてある事は大部分がそのまま使えるようです。ただし一部<code>zero?</code>がない、<code>/</code>で割り算した結果の型がRubyとは異なるなどの違いが有るようです。

>以前ここに書いていたバイナリデータフォマットの実装は別の回に移動しました。
> [ツナでもわかるmruby [4回目：バイナリデータフォーマットの実装]](http://qiita.com/hiroeorz@github/items/27e0866f493e0e7a65c5)
Lokkaをheroku上で起動する手順

```bash
# とりあえずcloneでDL
git clone git://github.com/lokka/lokka.git app_name

# bundleインストール
bundle install --without=production:sqlite:mysql --path=vender/bundler
# DB設定
bundle exec rake db:setup
# サーバ起動 ( http://localhost:9292/ )
bundle exec rackup

# Heroku アプリ作成
heroku create app_name
# Heroku Add-on追加
heroku addons:add heroku-postgresql:dev
# DB設定編集（上記で表示された環境変数追加）
vi database.default.yml

# デプロイ
git add .
git commit -m '1st commit'
git push heroku master
heroku run rake db:setup

# 確認
heroku pg:info
heroku open

# 画面上で
# ユーザの作成
# テストユーザの削除

# ドメインの追加
heroku domains:add domain_name
# DNSの設定変更(R53利用)
# http://www.workabroad.jp/posts/2002
```
Safariで開いたflvとかのキャッシュの場所（OS X Mavericksの場合）

MavericksになってからSafariで読み込んだflvとかのcache場所が若干変更されてました。といっても前とほとんど同じで

> /private/var/folders/XX/YYYYYYYYYY/T/WebKitPlugin-ZZZZZZ

の中です。foldersの中には"zz"という名前のフォルダとそうじゃないフォルダの2つ（ともにアルファベット2文字です）があると思います。zzじゃない方はマシンによって名前が違うようです。なのでXXの部分はzzじゃない方と思ってください。あとYYYYYYYYYYやZZZZZZの部分はアルファベットと数字の羅列になっています。

flvのキャッシュはFlashTmp.WWWWWWという名前で保存されています。WWWWWWはアルファベットと数字6文字です。このファイルの名前を適当につけて拡張子を.flvにしてください。

"WebKitPlugin"で始まるフォルダはSafariの終了時に破棄され、ZZZZZZの部分が異なるフォルダが起動時に新たにつくらます。なのでFinderのサイドバーに登録する場合はその一つ上のTフォルダを登録するのが良いと思います。
動画におけるパターン認識学習 その1 Field of Pattern Recognition


#背景
* 動画における、任意のパターン認識を目指して、学習していきます。
* メジャーな画像の顔認識では、Facebookが開発しているDeepFaceや、Sky Biometryが提供しているクラウドベースの顔認識API(!)https://www.skybiometry.com/ があったりしますが、この記事の対象は、もっと手を動かしながら技術を理解したい人向けです。

#学習素材
* __OpenCV__: CVは、Computer Visionの略。当時インテルに在籍していた __Gary Bradsky__によって始められた、画像認識ライブラリです。 __数百を超える画像処理アルゴリズム__が使えるらしいです。OpenCV 2.x系は、C++の上に作られているそうです。
* __Python 2.7__: 自分のMacに入っていたので。また、OpenCVのドキュメントが充実していた言語で、(Rubyやってる)自分が取っ付きやすそうだったので。
* ffmpeg: OpenCVで動画を処理させるために必要なエンコーディングなどしてくれる。OpenCVを触るにあたって、必須ではありません。

#学習の進め方
* http://docs.opencv.org/trunk/doc/py_tutorials/py_tutorials.html に書いてあるものをつまみ食いする。

#OpenCVのインストール方法 (2014/5)  *Mac OS X, Mountain Lion*

* 基本、Homebrewで。
* brew doctorで出るwarningとか消す
* brew tap homebrew/science
* brew install opencv --with-ffmpeg
* export PYTHONPATH=/usr/local/lib/python2.7/site-packages:$PYTHONPATH
* python consoleで、 import cvが通ったら、成功

http://www.jeffreythompson.org/blog/2013/08/22/update-installing-opencv-on-mac-mountain-lion/ 参考


#動画の再生

* 下記サンプルでは、毎フレームをグレースケールに変換しながら再生してます。

```python
import numpy as np
import cv2

cap = cv2.VideoCapture('動画へのフルパス')

while(cap.isOpened()):
    ret, frame = cap.read()

    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    cv2.imshow('frame',gray)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()
```

* __自分の環境では、フルパスでないと怒られました__

http://docs.opencv.org/trunk/doc/py_tutorials/py_gui/py_video_display/py_video_display.html#display-video


#動画内のオブジェクトトラッキング（追跡）

##MeanShiftアルゴリズム
* 画像の中で、トラッキングしたいエリアの初期座標を与える
* そのエリアを、特徴付ける点の集合として考える（なので、画像処理重要）
* 任意のフレームを考える
* 現在のエリアの中心を計算する
* 現在のエリア内にある、カウントする特徴点の集合の重心(Centroid)を計算する
* エリアの中心と、特徴点の重心が一致していない場合、重心と中心が一致するように、エリアを移動させる
* これを繰り返し、実際に（誤差が十分に少ない状態で）重心と中心が一致した位置を、現在のフレームに置けるオブジェクトの位置を考える

##現在のソースコード

```python
import numpy as np
import cv2

cap = cv2.VideoCapture('動画へのフルパス')

ret,frame = cap.read()

r,h,c,w = 150,90,650,125
track_window = (c,r,w,h)

roi = frame[r:r+h, c:c+w]
hsv_roi = cv2.cvtColor(roi,cv2.COLOR_BGR2HSV)
mask = cv2.inRange(hsv_roi, np.array((0.,60.,32.)), np.array((180.,255.,255.)))
roi_hist = cv2.calcHist([hsv_roi],[0],mask,[180],[0,180])
cv2.normalize(roi_hist,roi_hist,0,255,cv2.NORM_MINMAX)


term_crit = ( cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 10, 1 )

while(1):
  ret,frame = cap.read()

  if ret == True:
    hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
    dst = cv2.calcBackProject([hsv],[0],roi_hist,[0,180],1)

    ret,track_window = cv2.meanShift(dst, track_window, term_crit)

    x,y,w,h = track_window
    img2 = cv2.rectangle(frame,(x,y),(x+w,y+h),255,2)
    cv2.imshow('img2',frame)

    k = cv2.waitKey(60) & 0xff
    if k == 27:
      break
    else:
      cv2.imwrite(chr(k)+".jpg",img2)

  else:
    break

cv2.destroyAllWindows()
cap.release()
```
DragonflyBSD で supservisord を起動するまで

DragonflyBSD で supservisord を起動するまで．

DPorts で supervisor をインストールする．

```bash
$ pkg search supervisor
py27-supervisor-3.0_1,1
$ sudo pkg install py27-supervisor
```

このまま起動しても動かないので起動スクリプトの中身を確認すると以下のようにある．supervisord_enable を設定する必要があるらしい．

```
/usr/local/etc/rc.d/supervisord
  9 # Add the following line to /etc/rc.conf.local or /etc/rc.conf
 10 # to enable supervisord:
 11 #
 12 # supervisord_enable="bool"     Set to NO by default.
 13 #                               Set it to YES to enable supervisord.
 14 # supervisord_config (patch):   Set to /usr/local/etc/supervisord.conf by default.
 15 # supervisord_user (username):  Set to root by default.
```

rc.conf と rc.conf.local の使い分けはよくわかってないがとりあえず rc.conf.local に追加．

```bash
$ sudo vim /etc/rc.conf.local
$ cat /etc/rc.conf.local 
supervisord_enable="YES"
```

下記のように起動．

```bash
$ sudo service supervisord start
Starting supervisord.
```

動いていることを確認．

```bash
$ pgrep -fl supervisord
5490 /usr/local/bin/python2.7 /usr/local/bin/supervisord -u root -c /usr/local/etc/supervisord.conf
```
Cacti - Tholdプラグインでメール通知できるマクロまとめ


ちょっと送信内容を確認する必要が出てきたので、まとめておく。
内容の箇所は、実際の表示を確認しながら自分の言葉で書いているので、違う部分があるかも。。。

## バージョン
Tholdプラグイン　：　0.4.1

## 内容

|マクロ|内容|
|:--:|:--|
|\<DESCRIPTION>|Deviceに登録した名前|
|\<HOSTNAME>|Deviceに登録したIP or Domain|
|\<TIME>|Unix time|
|\<URL>|アラートを検知したURL|
|\<GRAPHID>|グラフID|
|\<CURRENTVALUE> |現在の値|
|\<THRESHOLDNAME>|Thold設定した箇所の名前　例). Device登録名 - Used Space - /home|
|\<DSNAME>|閾値設定した内容　例). hdd_used|
|\<SUBJECT>|詳細説明　例). 閾値を上回った、下回った|
|\<GRAPH>|グラフが添付される(はず...)|

なお、本文は"255 Char MAX"(255文字)まで記載できる。
nuwk!とvue.jsでらくらくデスクトップtodoアプリ


javascriptでデスクトップアプリが作れるnode-webkitのビルドツールnuwk!と、超軽量MVVMフレームワークのvue.jsを使ってデモアプリを作ってみました

[airtoxin/MiniTodo](https://github.com/airtoxin/MiniTodo)

![app.png](https://qiita-image-store.s3.amazonaws.com/0/22102/38f51032-0802-3541-9001-4c9d2a3f90ba.png "app.png")

見た目…

# 準備
1. node.jsをインストールしてnpmが使えるようにする
2. node-webkitとnuwk!をインストール
3. vue.jsのmin.jsをダウンロード
4. nuwk!を開いて新規プロジェクトを作成

ここまででnuwk!がHello Worldのテンプレートを作ってくれるので、満足するまでそれらをいじってから`Build project`すればBuildディレクトリにappとしてアプリケーションが作られます。
![nuwk.png](https://qiita-image-store.s3.amazonaws.com/0/22102/e353559b-07a1-5006-4405-dc76ba0b27bc.png "nuwk.png")

# テンプレート部分
Appディレクトリ中のindex.htmlを編集します。

```html:index.html
<link rel="stylesheet" type="text/css" href="./css/main.css" media="all">

<div id="todo">
    <h1>{{title}}</h1>
    <input type="text" placeholder="input todo" v-model="newTodoName" v-on="keyup: addTodo() | key enter"/>
    <ul>
        <li v-repeat="todos" v-on="click: done = !done" class="{{done ? 'done' : ''}}">
            <p>{{todoName}} <button v-on="click: removeTodo( this )">remove</button></p>
        </li>
    </ul>
    <button v-on="click: removeAll()">remove all done</button>
</div>

<script type="text/javascript" src="./js/vue.min.js"></script>
<script type="text/javascript" src="./js/main.js"></script>

```

{{}}のヒゲ記法の所はvueが自身のモデルに持っているデータを勝手にアタッチしてくれるので、リアルタイムに置き換わります。
v-model属性でvueにデータをバインディングでき、v-on属性でイベントをバインディングできます。
v-repeat属性はhandlebarsのeachみたいな感じで、モデル中の配列を指定するとそれぞれのオブジェクトを取り出して処理することができるようになります。
詳しくは[公式を](http://vuejs.org/guide/)

# ロジック部分
Appディレクトリ下にjsディレクトリを作りそこに配置しました。
npmで入れるモジュールもここでnpmします。
今回はunderscoreを使うので`npm install --save underscore`を実行。
あとは落としてきたvue.min.jsを置いてから、
ロジック部分のjsを

```js:main.js
var _    = require( 'underscore' );
var Todo = require( './js/todo' );

var demo = new Vue({
    el: '#todo',
    data: {
        title: 'MiniTodo',
        newTodoName: '',
        todos: []
    },
    methods: {
        addTodo: function () {
            if ( this.newTodoName === '' ) return;
            this.todos.push( new Todo( this.newTodoName ) );
            this.newTodoName = '';
        },
        removeTodo: function ( data ) {
            this.todos.splice( data.$index, 1 );
        },
        removeAll: function () {
            this.todos = _.filter( this.todos, function ( todo ) { return todo.done === false; } );
        }
    }
});
```

```js:todo.js
module.exports = function ( todoName ) {
	this.done     = false;
	this.todoName = todoName;
}
```
って感じで作成。
Vueのel属性にバインディングしたい範囲を指定します。

requireする時のパスはhtmlから呼び出したjsはそのhtmlからの相対パスに、それ以外はそのファイル自身からの相対パスで呼ばないと行けないっぽいです。
この辺のコンテキストが混ざっててちょっと混乱するかもしれません。
[Differences of JavaScript contexts ](https://github.com/rogerwang/node-webkit/wiki/Differences-of-JavaScript-contexts)

# デザイン部分
Appディレクトリ下にcssディレクトリを作りそこに配置しました。

```css:main.css
body {
    font-family: Helvetica Neue, Arial, sans-serif;
}

li.done {
    text-decoration: line-through;
}
```

# ビルド
nuwk!で`Build project`するとBuildディレクトリ中に.app形式でアプリがビルドされます。
ダブルクリックで実行される！
すごい！

# まとめ
+ 60分くらいでデスクトップアプリできちゃうのすごい
+ アプリがめちゃくちゃでかい(70MBくらい)
subViewでCALayerのdelegate=selfがエラーになる件について


![スクリーンショット 2014-05-04 17.03.21.png](https://qiita-image-store.s3.amazonaws.com/0/40693/c49c5bf4-63fb-691a-3510-731dbe3682ac.png "スクリーンショット 2014-05-04 17.03.21.png")


意外と解決策が分かるまで時間がかかったので。
CALayer上でCoreGraphicsを使おうとすると以下のようにdrawLayerをオーバーライドしてそこに描画する。更にsetNeedsDisplayで再描画してやる必要がある。
その際、CALayerのdelegateを自身にセットするとBAD_ACCESSエラーが発生する。

```SubView.m

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        self.layer.backgroundColor = [UIColor clearColor].CGColor;
        _sublayer = [CALayer layer];
        _sublayer.delegate = self;
        _sublayer.frame = CGRectMake(100, 100, 200, 200);
        [self.layer addSublayer:_sublayer];
        [_sublayer setNeedsDisplay];
    }
    return self;
}

- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)context {

// Drawing code

}

```

同じ処理をRootViewController内でやると問題ない。

解決策
http://stackoverflow.com/questions/2015353/using-calayer-delegate

delegate先のクラスを用意してやれば良い。そこでdrawLayerを呼び出す。

```SubView.h
#import <UIKit/UIKit.h>
#import <QuartzCore/QuartzCore.h>

//追加
@interface MyLayerDelegate : NSObject
@end
//追加ここまで

@interface SubView : UIView
@property(weak, nonatomic) CALayer *sublayer;
@property(strong, nonatomic) MyLayerDelegate *mylayerDelegate; //追加

@end

```

```SubView.m
//追加
@implementation MyLayerDelegate
- (void)drawLayer:(CALayer*)layer inContext:(CGContextRef)context
{
    CGContextMoveToPoint(context, 30, 30);  // 始点
    CGContextAddLineToPoint(context, 100, 100);  // 終点
    CGContextStrokePath(context);  // 描画！
    
    UIGraphicsPushContext( context ); //UIBezierPathに必須
    UIBezierPath *circle = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(20,20,50,50)];
    
    CGColorRef color = [[UIColor blueColor] CGColor];
    CGContextSetShadowWithColor(context, CGSizeZero, 20.0f, color);
    
    CGContextSetFillColorWithColor(context, [UIColor blueColor].CGColor);
    [circle fill];
    UIGraphicsPopContext(); //UIBezierPathに必須    
}
@end
//追加ここまで

@implementation SubView


- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        _mylayerDelegate = [MyLayerDelegate alloc];
        self.layer.backgroundColor = [UIColor clearColor].CGColor;
        _sublayer = [CALayer layer];
        //delegate先をselfではなく用意したクラスにする
        _sublayer.delegate = _mylayerDelegate;
        _sublayer.frame = CGRectMake(100, 100, 200, 200);
        [self.layer addSublayer:_sublayer];
        [_sublayer setNeedsDisplay];
    }
    return self;
}

```

なお、上記のサブクラス内でBezierPathを使おうとするとエラーになるので実行前にUIGraphicsPushContext、実行後にUIGraphicsPopContextを呼び出す必要がある。
私のCoffeeScriptをコンパイルする方法の変遷

私が本格的にJavaScriptを使いだしたのは今から二年ほど前です。
当時はBackboneでMVCをしよう。という記事が流行っていたと思います。

そんな頃からの変遷です。

# CoffeeScriptをコンパイルしよう

CoffeeScriptを使うにはJavaScriptにコンパイルする必要があります。
でもそのやり方は様々です。

そんなカオスなコンパイルの数々を紹介します。

# まずは簡単ブラウザコンパイルで試してみよう
```html:ブラウザでコンパイル
<script type="text/javascript" src="https://github.com/jashkenas/coffee-script/blob/master/extras/coffee-script.js"></script>
<script type="text/coffeescript">
  class Person
    echo: () -> "hello"

  person = new Person()
  console.log(person.echo())
</script>
```
うんうん、動くじゃないか。
本番では使わないようにとかあるけど、パフォーマンスも問題ないぞこれ。

# RequireCSを使う
簡単なプログラムを組むならブラウザでコンパイルさせる方法が一番楽だけど
今回のシステムではクライアントはすべてJSのみ。
となるとファイル数が多くなるのでnamespaceを使う必要がある。

当時話題になっていたRequireJSを使ってみよう。

```coffeescript:app/models/person.coffee
define [], () ->
  class Person
    constructor: (@name, @age) ->
    
    echo: () ->
      "Hello #{@name}"
```
```html:main.html
<script type="text/coffeescript">
  require ["cs!app/models/person"], (Person) ->
    person = new Person()
    console.log(person.echo)
</script>
```

# Gruntを使う
RequireCSで特に不満はなかった。
だけどたまにエラーでコンパイルできないことがあるんです。
AMDで読み込んでいる関係でコンパイルに時間がかかった場合、タイムアウトでも起きているのでしょう。

どうやら他にもコンパイルする方法があるのでにGrunt.jsを使ってみることにする。

```coffeescript:Grunt.coffee
module.exports = (grunt) ->
  grunt.loadNpmTasks("grunt-contrib-coffee")
  grunt.loadNpmTasks("grunt-contrib-watch")

 coffee:
   compile:
     expand: true
     cwd: "src/coffee"
     src: ['**/*.coffee']
     dest: 'dest/coffee'
     ext: '.js'

  watch:
    coffee:
      files: ["src/coffee/**/*.coffee"]
      tasks: ["coffee"]
```
うむ、悪くない。
でもwatchの挙動がなんかおかしい。
フォルダを増やしたり、消したりするとwatchから外れるぞ・・・。

# FileWatcherを使う
WebStormにFileWatcherという機能があるらしいぞ。

```text:FileWatcherの設定
Argumentsに以下を入力
--compile --map $FileName$

Output paths to refreshに以下を入力
$FileNameWithoutExtension$.js:$FileNameWithoutExtension$.map
```
同じフォルダに出力してファイル数が大変なことになるが
追加も削除もできるしこれでいこう。

というわけで今回のプロジェクトではこいつを採用しました。

# Mincerを使う
こいつはAsset PipelineをNodeで実装したライブラリです。
どうせサーバーに乗っけて開発も行うんだから
サーバーとくっついてた方が楽じゃね？ってことで最近触ってます。
requireも行えるので便利といえば便利かと思います。
フォルダの追加削除の動きはちょっと怪しいです。

```text:Mincerを使う
mincer --include assets/javascripts

以下にアクセス
localhost:3000/assets/javascripts/main.coffee または main.js
```

# 結局どれ使えばいいの？
今のところの正解はMincerかと思ってます。
が、違うサーバーで開発したいとなった場合にはFileWatcherなのかな？

まだ答えが出てないので投げやりですが、好きなのでいいです。
どれも改良されていきますので、いずれ不満もなくなると思います。

# CoffeeScript使うのがめんどくさくない？
めんどくさいです。ものすごくめんどくさいです。
でも誰がめんどくさいのか。
それは最初に規定部分を作るあなただけです。
他のプログラマはあなたが作成した手順書に従って設定をするだけなのです。

ソースコードを保守するのは？
あなたです。
なので文法が気に食わない場合は使わない選択もありです。

あなたじゃないなら保守する人の意見を大切にしてあげてください。

# 願望
CoffeeScriptかDartかまあなんでもいいんですけど、AltJS系統がブラウザでそのまま食えるようになればいいですけどねー。

SourceMapがサポートされたのもその一歩だと思うので、各ベンダーには頑張って頂きたいところです。
Object#tapでローカル変数を減らす。

Object#tapを知らなかったのでメモ。

[Class: Object (Ruby 2.1.1) #tap](http://ruby-doc.org/core-2.1.1/Object.html#method-i-tap)

```rb:tap.rb
class Object
  def tap
    yield(self)
    self
  end
end
```

上記のとおり、ブロックにselfを渡してselfを返すメソッド。
tapは「盗聴」という意味なのでオブジェクトの中身を覗き見るためのメソッドなんだと思う。[1,2,3].tap { |ary| puts ary } みたいな。
で、これをうまく使えば一時的な変数を減らせる。

たとえば下記のようなメソッドを


```rb:fizzbuzz.rb
def fizzbuzz(n)
  ret = ""
  ret << "Fizz" if n % 3 == 0
  ret << "Buzz" if n % 5 == 0
  ret.empty? ? n : ret
end
```

tapを使えばこんな感じで書き換えられる。

```rb:fizzbuzz_with_tap.rb
def fizzbuzz(n)
  "".tap do |ret|
    ret << "Fizz" if n % 3 == 0
    ret << "Buzz" if n % 5 == 0
    break n if ret.empty?
  end
end
```

ブロック変数、つまりtapのレシーバに対して破壊的変更を加えてやるというのがポイントだと思う。もっとも、breakを使えばその引数を戻り値にできる。
もっと面白い使い方もできるようだけど、やりすぎると理解しにくいコードになるのでほどほどに。

### メリット
- ローカル変数を減らせる。

### デメリット
- tapを知らない人が読んだらtapを調べるコストがかかる。

### 参考サイト
- [tapかわいいよtap - (rubikitch loves (Emacs Ruby CUI Books))](http://d.hatena.ne.jp/rubikitch/20080502/tap)
- [TapがRubyの新たな制御構造の世界を開く
](http://melborne.github.io/2012/10/29/rubys-new-control-structure-by-tap-and-break/)
RaspberryPiにoctoPrintを入れて3DPrinter ATOMをスタンドアローン稼働させるまでの流れ


##はじめに
3DPrinter ATOMを動かすにはPCが常に占有状態になるため、RaspberryPiにWEBベースのプリントアプリ(octoPrint)を入れてスタンドアローン化を図りました。

##インストール
前提としてデフォルトユーザpiにて作業するものとします。


octoprintのwikiにはpySerialのパッチ当て手順があるが現在は不要なようです。
(自分の場合はずっとrasberyPiを放置していたためOSを更新するところからスタートします。)

### OctPrintのインストール

```bash:os更新
sudo apt-get update
sudo apt-get upgrade
sudo apt-get dist-upgrade
```

git経由でインストールの実行


```bash:インストール
cd ~
sudo apt-get install python-pip python-dev git
git clone https://github.com/foosel/OctoPrint.git
cd OctoPrint
sudo pip install -r requirements.txt
```

piユーザにttyとdialoutのグループを追加

```bash:グループの設定
sudo usermod -a -G tty pi
sudo usermod -a -G dialout pi
```

以下のコマンドでテスト実行
実行前にatomの電源を入れてラズパイにUSB接続しておきます。

```bash:テスト
pi@raspberrypi ~/OctoPrint $ ./run
 * Running on http://0.0.0.0:5000/
```

あとはラズパイにport5000でアクセスしてブラウザ操作できることを確認して下さい

### カメラも使う
カメラを使うことで外部から監視も可能になるようです。
使わないならこの章の手順は不要です

なおカメラは通常のWEB Cameraの場合はUVC対応のモデルである必要があります。自分はamazonで一番安いの(C270)を買いました


```bash:手順
cd ~
sudo apt-get install subversion libjpeg8-dev imagemagick libav-tools cmake
git clone https://github.com/jacksonliam/mjpg-streamer.git
cd mjpg-streamer/mjpg-streamer-experimental
make
```

試しに実行します

```bash:手順
cd ~/mjpg-streamer/mjpg-streamer-experimental
#WebCameraを接続する場合
./mjpg_streamer -i "./input_uvc.so" -o "./output_http.so"

# rasberyPi cameraの場合
./mjpg_streamer -i "./input_raspicam.so" -o "./output_http.so"
 
```

port8080にてアクセス確認してみてください

``` http://<rasberyPiのip>:8080?action=snapshot ```


octoprintにログインしてカメラの関連付けを行います。
octprintにログインしてsettings->Webcamにアクセスし以下のように設定します。

| 設定箇所 | 入力内容 |
|:------------|------------:|
| Stream Url|http://[rasberyPiのip]:8080/?action=stream |
| Snapshot URL |http://[rasberyPiのip]:8080/?action=snapshot |



### 自動実行のためのスクリプトを作成
スクリプトを作成します。

```bash:手順
mkdir ~/bin
cd ~/bin
touch octprint.sh
chmod +x octprint.sh

```

octprint.shを編集します

```bash:octprint.sh

#!/bin/sh
OCTOPRINT_HOME=/home/pi/OctoPrint
MJPEG_STREAMER_HOME=/home/pi/mjpg-streamer/mjpg-streamer-experimental

# カメラを使わない場合は以降は不要です　↓↓↓
# start mjpeg streamer

# UVC対応 WebCameraの場合 
$MJPEG_STREAMER_HOME/mjpg_streamer -i "$MJPEG_STREAMER_HOME/input_uvc.so" -o "$MJPEG_STREAMER_HOME/output_http.so" &

# rasberyPi cameraの場合
#$MJPEG_STREAMER_HOME/mjpg_streamer -i "$MJPEG_STREAMER_HOME/input_raspicam.so" -o "$MJPEG_STREAMER_HOME/output_http.so" &


#カメラを使わない場合はここまで不要です ↑↑↑

# start the webui
$OCTOPRINT_HOME/run --daemon start
```

上記スクリプトを自動実行されるように設定します。

```bash:手順
sudo nano /etc/rc.local
```


```bash:/etc/rc.local

# By default this script does nothing.

# Print the IP address
_IP=$(hostname -I) || true
if [ "$_IP" ]; then
  printf "My IP address is %s\n" "$_IP"
fi

##追加箇所ここから↓↓↓↓↓
sudo -u pi /home/pi/bin/octoprint.sh
##追加箇所ここまで↑↑↑↑↑

exit 0
```

``` sudo reboot ``` で再起動後に自動で実行されることを確認して下さい





##参考情報
https://github.com/foosel/OctoPrint/wiki/Setup-on-a-Raspberry-Pi-running-Raspbian
http://arms22.blog91.fc2.com/blog-entry-521.html
jstree プラグインの利用例


# 課題

Rails4 の画面で、 Tree 表示 UI を使いたくなった。
そこで jstree という plugin を使う練習をしてみた。
  
  jstree: http://www.jstree.com/  

  <pre>...
  jsTree is jquery plugin, that provides interactive trees. It is absolutely free, open source and distributed under the MIT license. 
...</pre>

# 成果

練習の成果は以下に置いた。
https://github.com/katoy/rails-jstree

## スクリーンショット：
![](https://raw.githubusercontent.com/katoy/rails-jstree/master/screenshots/RailsTreejs.png)


4 つの利用例が画面上には示されている。

## ファイルブラウザもどき

- ajax で フォルダのファイル一覧や、ファイル内容を取得する。
- フォルダとファイルで icon を変化させる。
- ストライプ表示

TODO:
  png, gif ファイルを選択したら、画像を inline で表示させる。

## ネストしたハッシュを tree  表示

## erb 中に記載した html の ＜ui＞ ＜li＞ を tree 表示

## erb 中に記載した json を tree 表示
sphinxでdocstringから自動でドキュメント生成


個人メモ．

[参考] http://tell-k.hatenablog.com/entry/2012/01/17/002542



```
$ sphinx-apidoc -F -o docs/ apps/ 
```

-F: はsphinxドキュメントを１から作る．
-f: 上書き．

conf.pyの

``` python:conf.py
#sys.path.insert(0, os.path.abspath('.'))
```
コメントアウトを外して，パスを設定する．
OpenSSLとhexdumpを使用して16進数表現された乱数を生成する


例えば，200バイト分を生成したい場合:

	$ openssl rand 200 | hexdump -ve '1/1 "%02x"'

# References
* [OpenSSLとhexdumpで，固定長の乱数を16進数表現で得る - 数と符号と計算機とFreeBSD - freebsdグループ](http://freebsd.g.hatena.ne.jp/TELL/20080709/p1 "OpenSSLとhexdumpで，固定長の乱数を16進数表現で得る - 数と符号と計算機とFreeBSD - freebsdグループ")
PuTTY+Cygterm

適当にファイルパスを変更すること。以下では、

* PuTTY は C:\Program Files\PuTTY\putty.exe にある。
* Cygwin は C:\Cygwin\ に入っている。
* Cygterm は /usr/local/cygterm/ (C:\Cygwin/usr/local/cygterm/) に入れる。ついでに起動スクリプトもここに入れる。

**PuTTYの入手**

本家 : http://www.chiark.greenend.org.uk/~sgtatham/putty/
ICE IV : http://ice.hotmint.com/putty/

**Cygtermの入手**

http://sourceforge.jp/projects/ttssh2/scm/svn/tree/head/trunk/cygterm/

**Cygtermをmakeしてインストール**

```shell-session
install -d /usr/local/cygterm
make install BINDIR=/usr/local/cygterm
```

**cygtermの設定**

```text:cygterm.cfg
TERM = C:\Program Files\PuTTY\putty.exe -load "cygterm" -telnet %s -P %d
#TERM_TYPE = xterm
#TERM_TYPE = putty-256color
PORT_START = 20000
PORT_RANGE = 40
SHELL = auto
#LOGIN_SHELL = Yes
LOGIN_SHELL = No
HOME_CHDIR = No
SSH_AGENT_PROXY = No
ENV_1 = TERM=putty-256color
```

Cygwin64だとTERM_TYPEが効かなかった(?)のでENV_1でターミナルタイプを無理矢理設定した。

**PuTTY側にcygtermという名前で設定を作る**

| パラメータ名        | 値         |
|--------------------|-----------|
| Host Name          | localhost |
| Connection type    | Raw       |
| Local echo         | Force off |
| Local line editing | Force off |
| The Backspace key  | Control-H |
| The function keys and keypad | Linux |
| Remote character set | UTF-8 (CJK) |

**起動スクリプト**

```js:cygterm_here.js
var wsh = new ActiveXObject("WScript.Shell");
var env = wsh.Environment("Process");
env("PATH") += ";C:\\\\Cygwin\\\\bin";
var opts = "";
if (WScript.Arguments.length > 0) {
  wsh.CurrentDirectory = WScript.Arguments(0);
} else {
  opts = " -cd";
}
wsh.Run("C:\\\\Cygwin\\\\usr\\\\local\\\\cygterm\\\\cygterm.exe" + opts);
```

好みにより、グローバルに環境変数を設定する代わりにここでCygwinのパスを設定している。
この.jsファイルをクリックするとCygtermが$HOMEから起動するはず。

**エクスプローラの右クリックに登録**

ついでに [エクスプローラの右クリックメニューをカスタマイズする](http://qiita.com/tueda/items/0036ee8e9280f70f04f0) のように.regファイルを作った。

```registry:term_here.reg
Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Folder\shell\term_here]
@="ターミナルを開く(&T)"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Folder\shell\term_here\command]
@="wscript C:\\\\Cygwin\\\\usr\\\\local\\\\cygterm\\\\cygterm_here.js \\"%L\\""

[HKEY_CLASSES_ROOT\Directory\Background\shell\term_here]
@="ターミナルを開く(&T)"

[HKEY_CLASSES_ROOT\Directory\Background\shell\term_here\command]
@="wscript wscript C:\\\\Cygwin\\\\usr\\\\local\\\\cygterm\\\\cygterm_here.js \\"%V\\""
```

**dup**

次のようなシェルスクリプトをどこかに置いておくと、ターミナルウィンドウをたくさん増やせて便利だと思う。

```bash:dup
#!/bin/sh
exec wscript 'C:\\Cygwin\\usr\\local\\cygterm\\cygterm_here.js' "`cygpath -w \\"\\`pwd\\`\\"`"
```

**追記 (2016/5/17)**

Cygwin 2.5.1 (x86) と Cygterm 1.07_28 でビルド時エラー。`cygterm.cc`に

```
#define _XOPEN_SOURCE
#define _BSD_SOURCE
```

が要るような(?) また、GNU screen 上で `Ctrl+Left` の `Ctrl` が効いてない(?) 

<!-- (保留)
**UPDATE (2016/5/29)**

```:.inputrc
"\eOD": backward-word
"\eOC": forward-word
```
と `Disable application cursor keys mode`をチェックで解決した。
http://serverfault.com/questions/130128/using-ctrl-arrow-keys-with-putty-and-screen
-->
JavaScript の構文拡張: TypeScript (基本型)

TypeScript はマイクロソフトによって開発されたフリーでオープンソースのプログラミング言語である。TypeScript は JavaScript に使用するかどうかが任意の静的型付けとクラスベースオブジェクト指向を加えたスーパーセットとなっている。C# のリードアーキテクトであるアンダース・ヘルスバーグが TypeScript の開発に関わっている。
TypeScript は JavaScript の構文の拡張なので、既存の JavaScript のプログラムにわずかな修正を加えるだけでTypeScriptとして動作する。 TypeScript は大規模なアプリケーションの開発のために設計されており、互換性を確保するためコンパイルすると JavaScript を出力する。
TypeScriptは既存のJavaScriptライブラリに型情報を加えることのできるヘッダファイルをサポートしており、jQuery や Node.jsといったよく知られたライブラリに対しても型情報の恩恵をもたらすことができる。

↓ http://www.typescriptlang.org/Handbook#basic-types

TypeScript では(JavaScript とは違って)変数や関数の戻り値に型を指定することができます(指定しないこともできますが JavaScript と同じセマンティクスにするためには any という型指定を明示的にする必要があることがあります)。
以下の例は基本型(Basic Types)と呼ばれるものです。(1)はブーリアン値、(2)は数値、(3)は文字列の型を持つ変数を定義すると同時に値を代入しています。(コードA)

```ts:app.ts(コードA)
// Boolean
//(1)
var isDone: boolean = false;

//Number
//(2)
var height: number = 6;

//String
//(3)
var name: string = "bob";
name = 'smith';
```

コードBの(4)では、JavaScript と同じように型を指定しないで変数を定義しています。
しかしながら「height = "XYZ";」の行で「Cannot convert 'string' to 'number'.」というエラーが出てしまいます。
これは TypeScript の型推論が(1行目で)働いて height は数値型であるとコンパイラが決めつけてしまったためです。

```ts:app.ts(コードB)
//(4)
var height = 6;
height = "XYZ";
```

もし数値も文字列も代入する必要がある場合には型として any を指定します(コードC)。これで2行目でエラーがでなくなりました。

```ts:app.ts(コードC)
//(5)
var height: any = 6;
height = "XYZ";
```

↓ http://www.typescriptlang.org/Handbook#basic-types-array

TypeScript は JavaScript と同様に値の配列(Array)を扱うことができます。
配列型の記述は2通りのやり方で行うことができます。

* 最初は(6)のように要素の型に"[]"を続けて記述するやり方です。

* もう1つの方法はジェネリック配列型(Array<要素型>)を用いるやり方です((7)を参照)。

```ts:app.ts(コードD)
//Array
//(6)
var list: number[] = [1, 2, 3];
//(7)
var list: Array<number> = [1, 2, 3];
```

JavaScript の標準のデータ型セットに対する有用な追加事項は、”enum”(列挙型) です。C# のような言語と同様に enum は 数値の集合により親しみやすい名前を与える方法です(コードE)。

* デフォルトでは(8)のように enum はメンバーの番号付けを0から開始します。(つまり、Color.Red が0となる)
* (9)の例では最初のメンバーの値を明示的に指定することで、0ではなく1から番号付けを開始することもできます。
* さらに、(10)のように enum のすべてのメンバーの値を指定することもできます。

```ts:app.ts(コードE)
//Enum
//(8)
enum Color { Red, Green, Blue };
var c1: Color = Color.Green;

//(9)
enum Color2 { Red = 1, Green, Blue };
var c2: Color2 = Color2.Green;

//(10)
enum Color3 { Red = 10, Green = 20, Blue = 40 };
var c3: Color3 = Color3.Green;
alert(Color3[Color3.Blue]); // "Blue" と表示される
```

* "void" は、値を返さない関数の戻り値型として用います(コードF)。

```ts:app.ts(コードF)
//Void
//(11)
function warnUser(): void {
    alert("This is my warning message");
}
```

## 参考

* [JavaScriptのクラス定義を簡単にする](http://qiita.com/akmiyoshi/items/5fde6be4a9191221eaea)
踏み台サーバを経由した多段SSHのやり方

時々必要になってその度にググってるんだけど自分用にまとめメモ

**追記2015-10-15:** [最強の多段SSH設定](http://qiita.com/kawaz/items/a0151d3aa2b6f9c4b3b8) も出来たので合わせて読んでみてください。

# ケース1

## サーバ構成
よくある↓こんな構成を想定

```text
     [MyPC]
       ｜        
＿人人人人人人人人＿
＞ インターネット ＜
￣Y^Y^Y^Y^Y^Y^Y^￣
       ｜        
       ｜(EIP:54.178.xxx.yyy)
┌─ [projectX-bastion] ─┐
           │
＿人 人＿   ├ [projectX-web1] (10.123.1.80)
＞ VPC ＜  └ [projectX-web2] (10.123.2.80)
￣Y^ Y^￣
```

## 接続情報
こんな情報が与えられて、どのサーバも authorized_keys とかを勝手に修正しちゃいけないとする。

- projectX-bastion
    - ユーザ: bastion
    - 秘密鍵: projectX-bastion.pem（サーバ情報と一緒にもらった鍵ファイル）
- projectX-web1,2
    - ユーザ: www
    - 秘密鍵: bastion@projectX-bastion:~/.ssh/id_rsa（サーバ管理者によって設定済み）
    - sudo用パスワード: A89j4LeZ

## 多段SSH設定

MyPC にこんな設定を書いておく。

```text:~/ssh/config
Host projectX-bastion
  User bastion
  IdentityFile ~/.ssh/keys/projectX-bastion.pem
  Hostname 54.178.xxx.yyy
Host projectX-web1 projectX-web2
  User www
  # bastion@project-bastion:~/.ssh/id_rsa からローカルにコピーしておく
  IdentityFile ~/.ssh/keys/projectX-bastion-id_rsa.pem
  #old style: ProxyCommand ssh projectX-bastion nc %h %p
  ProxyCommand ssh -W %h:%p projectX-bastion
  LocalCommand echo "## sudo用パスワード: A89j4LeZ"
Host projectX-web1
  Hostname 10.123.1.80
Host projectX-web2
  Hostname 10.123.2.80
```

この設定を書いておけば、それぞれのサーバへは以下のように接続できる。bash-completionが入っていれば projectX-* というホスト名でTAB補完も効く。

```text:
$ ssh projectX-bastion
$ ssh projectX-web1
$ ssh projectX-web2
```

### 補足

__ProxyCommand__について、昔は`nc`コマンドを使う設定を書いてたが、最近はsshの-Wオプションを使えばbastionサーバ上へのncのインストールが不要になるので、最近は-Wの方をを使うようになりました。

__LocalCommand__について、www@projectX-web1,2サーバ上ではsudoが使えることになってますが、パスワードを毎度調べるのが面倒な時は自分用にメモ表示させることがあります。このへんは以前、[sshの接続先毎にメモを表示させる - Qiita](http://qiita.com/kawaz/items/67c00a7fe9de45e0128a)に書きました。

__IdentityFile__について、webへの接続用のIdentityFileはホントはbastionのid_rsaをローカルに持ってこずに、`ssh -t projectX-bastion ssh www@10.123.10.80`と同様の動作にするのが理想だったんですが、ProxyCommandを使う場合はbastionはあくまで通信路のProxyをしてるだけで終着サーバへの接続はMyPCから直接行われるという考え方なので、bastion上の鍵をローカルに持ってきておくしかありませんでした。
コレについてもっと良いやり方があるよ、って人はコメント頂けると嬉しいです。

__bastion__というサーバ名について、昔は中継サーバの意味としてstepとかrelayとかgatewayとかっていうサフィックスを使ってたんだけど、AWS Certificationの試験を英語で受けてると問題文でしばしばbastion serverっていう呼び方が出てきて、英単語の知識が乏しかった僕はそのサーバの役割の意味がよくわからず誤答して点数を落とすということをやらかした苦い経験から、Amazonがbastion使うんなら自分でも踏み台サーバの名前で使うことにしようと思い、最近使うようになりましたｗ（実際のところbastionは中継っていうよりもちっと広く外部から直接アクセス可能なDMZサーバな感じの単語かな）


# ケース2
ケース1の bastion や web1,2 サーバの authorized_keys にそれぞれMyPCの公開鍵を登録して良い状況ならそれが一番らくだと思います。その場合上記設定の IdentityFile の設定、しいては余計な鍵ファイルの管理も不要になります。
クロージャってなんぞ、ついて

http://qiita.com/tadsan/items/cf30eb45312b498c97b0
試してみた。あとで更新します。

```rb:実行するrubyスクリプト
class A
  def initialize (arg)
    @x = arg.upcase
  end

  def call
    return @x
  end
end

B = ->(arg){
  x = arg.upcase
  func = ->{
    return x
  }
  return func
}

a1 = A.new("foo")
p a1.call
b1 = B.("foo")
p b1.call
a2 = A.new("bar")
p a2.call
b2 = B.("baz")
p b2.call
```

```rb:上記スクリプトをirbで実行した結果
$ irb
2.1.1 :001 > class A
2.1.1 :002?>     def initialize (arg)
2.1.1 :003?>         @x = arg.upcase
2.1.1 :004?>       end
2.1.1 :005?>   
2.1.1 :006 >       def call
2.1.1 :007?>         return @x
2.1.1 :008?>       end
2.1.1 :009?>   end
 => :call 
2.1.1 :010 > 
2.1.1 :011 >   B = ->(arg){
2.1.1 :012 >       x = arg.upcase
2.1.1 :013?>     func = ->{
2.1.1 :014 >           return x
2.1.1 :015?>       }
2.1.1 :016?>     return func
2.1.1 :017?>   }
 => #<Proc:0x0000000115ad50@(irb):11 (lambda)> 
2.1.1 :018 > 
2.1.1 :019 >   a1 = A.new("foo")
 => #<A:0x00000001142cc8 @x="FOO"> 
2.1.1 :020 > p a1.call
"FOO"
 => "FOO" 
2.1.1 :021 > b1 = B.("foo")
 => #<Proc:0x00000001116bf0@(irb):13 (lambda)> 
2.1.1 :022 > p b1.call
"FOO"
 => "FOO" 
2.1.1 :023 > a2 = A.new("bar")
 => #<A:0x000000010ecad0 @x="BAR"> 
2.1.1 :024 > p a2.call
"BAR"
 => "BAR" 
2.1.1 :025 > b2 = B.("baz")
 => #<Proc:0x000000010cf250@(irb):13 (lambda)> 
2.1.1 :026 > p b2.call
"BAZ"
 => "BAZ" 
```
ChefのCronリソースがPredefined scheduling指定に対応した

<!-- permanent -->

`@reboot`とかのアレ。Chef-Clientの`11.12`以降(多分)で実装されています。

[Cron#Predefined_scheduling_definitions | Wikipedia](http://en.wikipedia.org/wiki/Cron#Predefined_scheduling_definitions)


## レシピサンプル

リブート時を指定してジョブを登録するには`time` Resource Attributeを使ってこうする。

```ruby:cron.rb
cron 'at_reboot' do
  command '/bin/true'
  time :reboot
end
```

## chef-applyで試してみる

```shell:chef-apply_stdout
$ chef-client -v
Chef: 11.12.4


$ sudo chef-apply cron.rb 
Recipe: (chef-apply cookbook)::(chef-apply recipe)
  * cron[at_reboot] action create
    - add crontab entry for cron[at_reboot]
```

エントリーを確認すると、`@reboot`なジョブが。

```
$ sudo crontab -l -u root
# Chef Name: at_reboot
@reboot /bin/true
```

指定できるのは次の通り。

```
SPECIAL_TIME_VALUES = [:reboot, :yearly, :annually, :monthly, :weekly, :daily, :midnight, :hourly]
```

## 消せない件

Amazon linux+omunibus installのchef-clientで試してるんですが、`action :delete`でジョブがちゃんと消えない。

```
$ sudo chef-apply cron.rb 
Recipe: (chef-apply cookbook)::(chef-apply recipe)
  * cron[at_reboot] action delete
    - save unmodified crontab

## ?? unmodified ??

$ sudo crontab -l -u root
@reboot /bin/true
```

マークだけ消えた。改行の扱い周りだと思うので、原因調べて治したいとこです。
Cocoaにおけるクラスクラスタとは

## 公式ドキュメント
[クラスクラスタ](https://developer.apple.com/jp/documentation/Cocoa/Conceptual/CocoaFundamentals/CocoaObjects/chapter_3_section_9.html)

## 一言で言うなら
抽象ファクトリを使った、 **実装最適化** のためのテクニックです。

通常ファクトリパターンは、「同じインタフェイスで使える、 **異なる振る舞い** をする実装」を呼び出す場合に使われます。これに対して、クラスクラスタは「同じインタフェイスで使える、 **同じ振る舞い** をする実装」を呼び出すために使われます。

[Cocoaにおけるデザインパターンの応用](https://developer.apple.com/jp/documentation/Cocoa/Conceptual/CocoaFundamentals/CocoaDesignPatterns/chapter_5_section_3.html#//apple_ref/doc/uid/TP40002974-CH6-DontLinkElementID_16)

```text
Cocoaにおけるクラスクラスタの使用は、データ格納域が状況に応じて変化する可能性のあるオブジェクトの生成に限定されています。Foundationフレームワークには、NSString、NSData、NSDictionary、NSSet、NSArrayの各オブジェクトに対応したクラスクラスタがあります。
```