OmniAICreator/Qiita-1.07M huggingface dataset:
iOSアプリ開発:リポジトリにファイル追加

※個人で管理しているHPに引っ越ししました。
リンク切れ等考慮して本ページは残しておきますが、今後は[HP](https://kittenkitten.net/2014/05/17/ios_dev_repo_file_add/)のほうで更新します。

Prj1というフォルダがあり、その下に追加したいファイルがある。
と言う前提で記述しています。

※コミットしていません。追加のみの方法です。

##ターナルで行う
ターミナルを起動

``
cd Prj1
/Applications/Xcode.app/Contents/Developer/usr/bin/git add .
``

##Xcodeで行う
``Project Navigator``上からPrj1フォルダを選択し右クリック、``Source Control``->``Add``

他にも方法あれば…教えてください！
vagrantをwindowsで使う時のコマンドパス

いつからこうなったかは、わからないし、対応している人は多いと思うので、メモとして。

Vagrant が box を展開するにtarを使います。
ただ、これが`tar.exe`ではなく`bsdtar.exe`で、これは`Vagrant/embedded/mingw/bin`にはいっています。

`Vagrant/embedded/mingw/mingw32env.cmd` を使うなら、問題ないようですが、素だと`vagrant package`とか`vagrant init xxx/yyy;vagrant up`でダウンロードとかした時にトラブります。

エラーメッセージとしては@hrixさんがコメントしている
> "The executable 'bsdtar' Vagrant is trying to run was not"

です。

かといって無条件にパスに追加すると、自前で用意したコマンドとかちあったりするので、PATHの最後に以下のように追加しておくのがオススメ。

```bat
PATH=%PATH%;c\tools\Vagrant\embedded\mingw\bin;c\tools\Vagrant\bin
```

アップデートしたら、Vagrant/binが最後になっちゃったけど、まあいいか。
あと、実際はシステムのプロパティで最後に追加ですけど。

すくなくとも1.6.1では問題になったので、自分は予防的に残しておくことにします。
というか、1.5くらいの時は別に問題なかった気がする...

**追記**
現在(1.6.3)で自分の所では問題が出ていません...1.6.0-1.6.2くらいの一過性だったのかな?
NokogiriとNattoで、Webページ内の単語を抽出する

##NokogiriとNattoについて

Rubyを使ってWebページの解析がしたいときは、[Nokogiri](http://nokogiri.org/)と[Natto](http://rubydoc.info/gems/natto/)というgemが非常に便利です。

Nokogiriは、xml/htmlの解析モジュールで、libxml2が入ってないとインストールがうまくいきません。Xcodeにくっついてくるlibxml2はちょっと古いらしいので、homebrewで入れ直すのもアリかもしれません。
参考：[nokogiriとlibxml2とhomebrew](http://qiita.com/ohataken/items/9d6d4e31615021cf016d)

Nattoは、形態素解析エンジンのMeCabをrubyから使うためのインタフェースです。MeCabがインストールされていることが前提になりますので、homebrewなどでインストールしてください。
参考：[rubyのmecabバインディングnattoを使う](http://qiita.com/k-shogo/items/0f8a98c52913c729c7eb)


##Webページ内の単語を抽出する
実際に、NokogiriとNattoを使ってWebページ内に出現する名詞をカウントするサンプルを紹介します。

```rb:main.rb
#coding:utf-8

require 'nokogiri'
require 'open-uri'
require 'natto'

nm = Natto::MeCab.new
wordHash = {}

doc = Nokogiri::HTML(open('http:/example.com')) do |config|
  config.noblanks
end

doc.search("script").each do |script|
  script.content = "" ##scriptタグの中身を空にする
end

doc.css('body').each do |elm|
  text = elm.content.gsub(/(\t|\s|\n|\r|\f|\v)/,"")
  nm.parse(text) do |n|
    wordHash[n.surface] ? wordHash[n.surface] += 1 : wordHash[n.surface] = 1 if n.feature.match("名詞")
  end
end

p wordHash

```

上から順番にいきます。まず、必要なgemをrequireしています。```open-uri```は、Webページのデータを取得するのに必要です。

```rb:require
require 'nokogiri'
require 'open-uri'
require 'natto'
```

形態素解析をするためのNattoインスタンスと、単語をカウントするためのwordHashを作ります。

```rb:morpheme
nm = Natto::MeCab.new
wordHash = {}
```

open-uriを使ってWebページを取得し、NokogiriのHTMLパース機能を使ってhtmlドキュメントを取得します。オプションで「空白だけのテキスト要素を抜く」的なものがあったので入れてみましたが、なくても多分大丈夫です。```doc```の中には、NokogiriのXML/HTML要素インスタンス（Nokogiri::XML::Element, Nokogiri::HTML::Element など）が入ります。

```rb:html_parse
doc = Nokogiri::HTML(open('http://example.com/')) do |config|
  config.noblanks
end
```

取得したhtmlドキュメントの中には、scriptタグがあるかもしれません。邪魔なので中身を空にしてやります。```search```メソッドを使って、ブロック引数```script```の```content```に空白文字を代入すればOKです。

```rb:blank_script_tag
doc.search("script").each do |script|
  script.content = "" ##scriptタグの中身を空にする
end
```

仕上げです。```css```メソッドを使って、body要素の中身を解析します。body内の子要素一つ一つを```elm```に入れ、順番に処理します。タブ文字などの空白文字があると上手く形態素解析ができないため、```gsub```ですべて空文字列に置き換えます。それをNattoインスタンスの```nm```に```parse```させ、名詞の場合のみカウントします。初出の名詞、つまり```wordHash[n.surface]```が定義されていない場合は```wordHash[n.surface]=1```で項目の初期化を、すでに一度出ている名詞ならば```wordHash[n.surface]+=1```でカウンターの数を一つ増やすようにしています。

```rb:count_words
doc.css('body').each do |elm|
  text = elm.content.gsub(/(\t|\s|\n|\r|\f|\v)/,"")
  nm.parse(text) do |n|
    wordHash[n.surface] ? wordHash[n.surface] += 1 : wordHash[n.surface] = 1 if n.feature.match("名詞")
  end
end
```
これで、```wordHash```の中にはページ内の名詞出現回数の解析結果が入っているはずです。

```rb:preview
p wordHash
```

前はmecab-rubyが使いづらくてよく困ったものですが、だいぶ楽にできるようになって嬉しい限りです。
iOSアプリ開発:画像追加

※個人で管理しているHPに引っ越ししました。
リンク切れ等考慮して本ページは残しておきますが、今後は[HP](https://kittenkitten.net/2014/05/17/ios_dev_image_add/)のほうで更新します。

初めまして。

iOS向けアプリ開発を久々にやって、見事にハマりました。

画像を新規で1枚用意し、プログラムで読み込むファイル名を追加し…
そこまでは大丈夫でした。

実行したら、下記のようにエラーが出てしまいました。
※エラー内容の後半の数字は、glGetErrorの値です。

```
glGenerateMipmap 1282(0x502)
```


ファイル名が違うのか、プロジェクトフォルダに入っているか確認。
そこで、プロジェクト(Xcode)に追加していなかった事に気付きました。

``Xcodeの左ペインにあるProject Navigatorの追加したいファイルがある階層を右クリック``->``Add Files to "プロジェクト名" ...``->``追加したいファイルを選択しAdd``

これでプロジェクトに追加され、実行したらエラー出ませんでした。


結構忘れる事が多いため、自分のためにもメモしていこうと思いました。
Enumerizeを数値型カラムで使う

railsのModelで列挙型を扱うのに、gemのenumerizeが便利です。
しかし、あまり使い方を扱った日本語の記事が無い……。

最近だと、去年(2013年)8月にQiitaのエントリーがありました。
[Enumerize 使い方 - Qiita](http://qiita.com/dahugani/items/53ee7ec7b6126f519a3c)

が、この記事だと文字列型のカラムで使う場合しか書いてありません。
数値型カラムをフラグのように使っているレコードでこのgemを使う方法を書いておきます。

# String型以外のカラムで使う

例えば以下のようなテーブルを、SQLの参考書などで見かけたことがある方も多いのではないでしょうか。

| カラム名 | 型 | 説明 |
| ------- | ---|-----|
| code | char(8) | 従業員コード |
| name | varchar(64) | 氏名（苗字+名前） |
| sex | integer | 性別。-1:不明、0:男性、1:女性、99:その他|
| enter_at | date | 入社年度 |

ArctiveRecordなどでレコード取得した際に、「性別が0なら男で、1なら女で…」という処理を実装する時にenumerizeが活躍します。

```employee.rb
class Employee < ActiveRecord::Base
  extend Enumerize
  enumerize :sex, in: {unkown: -1, male: 0, female: 1, other: 99}, scope: :having_status
end
```
```rb
Employee.with_sex(:male)
#=> SELECT "employees".* FROM "employees" WHERE "users"."sex" IN (0)

person = Employee.first
person.male?    #=> false
person.female?  #=> true
person.sex_text #=> 女  // i18nの設定が必要
```

便利ですね！

カラムに配列を使ったり、i18nと連動したり、railsのviewにラジオボタンを作ったりなど。
他にもいろいろな使い方があります
詳しくは[enumerize - Github](https://github.com/brainspec/enumerize)のREADMEを見てください。

(2014/06/22追記)
* Rails4.1からはModelに[enum](http://edgeapi.rubyonrails.org/classes/ActiveRecord/Enum.html)という機能を使って列挙型を表せるようになりました
* 「そもそもActiveRecordじゃなくて、普通のrubyスクリプトで列挙型使いたいんだけど……」という人は[inum](https://github.com/alfa-jpn/inum)が便利だと思います

# 日本語参考サイト
* [Enumerize 使い方 - Qiita](http://qiita.com/dahugani/items/53ee7ec7b6126f519a3c)
* [RubyでEnumを使いたかったらenumerizeAdd - リア充爆発日記](http://d.hatena.ne.jp/ria10/20131206/1386340066)
Install MiniDLNA 1.1.1 on CentOS 6.5

## Install dependencies

```bash
$ sudo rpm -Uvh http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm
$ sudo rpm --import http://apt.sw.be/RPM-GPG-KEY.dag.txt
$ sudo yum install {flac,libogg,libid3tag,libexif,sqlite,ffmpeg,libvorbis,libjpeg}-devel gcc
```

## Install MiniDLNA

```bash
$ yum install http://repo.iotti.biz/CentOS/6/x86_64/minidlna-1.1.1-1.el6.lux.1.x86_64.rpm
$ chmod 755 /etc/init.d/minidlna /var/log/minidlna /var/cache/minidlna
$ rm /var/cache/minidlna/files.db
```

## Configuration

```bash
$ cp /etc/minidlna.conf /etc/minidlna.conf.orig
$ vi /etc/minidlna.conf
$ diff /etc/minidlna.conf.orig /etc/minidlna.conf
18c18,19
< media_dir=/opt
---
> media_dir=V,/mnt/data/fs-media/Movie
> media_dir=A,/mnt/data/fs-media/Music
21c22
< #friendly_name=My DLNA Server
---
> friendly_name=DLNA Server
```

## Add minidlna user to a group which has a permission of media directories

```bash
$ ls -l /mnt/data/fs-media/
total 16
drwxrwx---. 15 example_user example_group 4096 May  8 02:20 Movie
drwxrwx---.  5 example_user example_group 4096 May 10 10:23 Music
$ id minidlna
uid=495(minidlna) gid=495(minidlna) groups=495(minidlna)
$ usermod -G example_group minidlna
$ id minidlna
uid=495(minidlna) gid=495(minidlna) groups=495(minidlna),500(example_group)
```


## Register init script

```bash
$ chkconfig --add minidlnad
$ chkconfig --list | grep minidlnad
minidlnad      	0:off	1:off	2:off	3:on	4:on	5:on	6:off
$ service minidlnad start
```
ExcelからJSON

# 概要
ExcelファイルをJSON化するRubyスクリプトを作った。コードは[こちら](https://gist.github.com/oinariman/eca97eb195740aeca65e)。

# 使用例

## Excelファイル例

ファイル名 crimes.xls

シート1:「犯罪」

|罪状	|判決	|罰金|
|-------|-------|----|
|のぞき	|死刑	|5000|
|スリ	|死刑	|10000|
|ひったくり	|死刑	|100000|
|ねずみ講	|死刑	|1000000|

シート2: 「犯罪者」

|名前	|経歴|
|-------|----|
|容疑者A	|のぞき,スリ|
|容疑者B	|スリ|
|容疑者C	|ねずみ講,スリ|

シート3: 「!判決」

|判決|
|----|
|無罪|
|死刑|

## 実行

```
$ ruby x2j.rb crimes.xls
```

## 結果

```json:犯罪.json
[{"罪状":"のぞき","判決":"死刑","罰金":5000.0},{"罪状":"スリ","判決":"死刑","罰金":10000.0},{"罪状":"ひったくり","判決
":"死刑","罰金":100000.0},{"罪状":"ねずみ講","判決":"死刑","罰金":1000000.0}]
```

```json:犯罪者.json
[{"名前":"容疑者A","経歴":["のぞき","スリ"]},{"名前":"容疑者B","経歴":"スリ"},{"名前":"容疑者C","経歴":["ねずみ講","ス
リ"]}]
```

# 仕様
* シートごとに1ファイル生成される。
* 先頭に"!"が付いた名前のシートは処理対象とされない。
* 1行目の各列をキーとした辞書の配列が作られる。
* セルの中身がCSVの場合、配列に変換される。

# 経緯
ゲームアプリ用のデータ作成のために、スプレッドシートからJSON書き出す仕組みが欲しかった。Googleスプレッドシートの内容をGoogle Apps Script(JavaScript)でJSONに変換するしくみを作って使っていたが、手元のファイルで管理したくなった。

[[Ruby]RubyでExcelをつかう[Rails]](http://qiita.com/stkn_bb/items/bf302cc47e9bd69aaa73)を読んで、Rubyで簡単にできそうだったのでやってみた。

作ったあとで、[Rento83 • Excelのデーターをjson形式やcsv形式になおしてくれる便利なサービス](http://rento83.com/post/37761218050/excel-json-csv)の記事で[Mr. Data Converter](http://shancarter.github.io/mr-data-converter/)を知った。高機能で目的にも合致している。ただし、Excelファイルから手でコピペしないと使えない。
git で shallow clone

git clone に時間がかかる場合、--depth を指定して浅く clone すると早い

通常

```bash
$ time git clone git@github.com:ruby/ruby.git
128.44s user 37.45s system 94% cpu 2:55.36 total
```

depth 指定

```bash
$ time git clone --depth=1 git@github.com:ruby/ruby.git
1.26s user 1.42s system 20% cpu 12.964 total
```

早い！

git log で見た時に commit log が depth で指定した数だけになっている。ローカルへの commit log をそれだけしか積まないので早くなるのだ。svn 的だ。

注意：ただし、このレポジトリから push はできなくなるので、用途は限定的だ。手元に素早く持ってきたいだけの場合に使う。Jenkins とか CI 環境で使うとよさそう。

### branch

あとこれはおまけだけど、clone してから `git checkout -b ブランチ名 origin/ブランチ名` で branch を切り替えるよりも、clone 時に --branch でブランチ名を指定しつつ、--single-branch オプションを使うと早い。

```bash
$ git clone --depth=1 --branch ruby_2_1 --single-branch git@github.com:ruby/ruby.git
```

みたいな。CI だと branch 指定するしね。


追記：良いエントリがあったのでリンク貼っておく。合わせて読みたい: [巨大なリポジトリを Git で上手く扱う方法](http://japan.blogs.atlassian.com/2014/05/handle-big-repositories-git/)
キー値コーディング（KVC）について理解する

キー値コーディング（KVC）とは、キー情報を用いてオブジェクトのプロパティへとアクセスする
方法のこと。

やり方は
・値を取り出すとき
`[obj valueForKey:"キー名"]`
・値をセットするとき
`[obj setValue:"値" forKey:"キー名"]`
を使う。

詳細objective-c2.0によると、
キー値コーディングの機能としては
1.キーとなる文字列は実行中に決定されてもよい。
2.プロパティへの実際のアクセス方法は利用者側から見えない
ということがあげられていた。
文字列を仲立ちとしたアクセスができるというところが
キー値コーディングの強みということかな。

※実用レベルでどう使われているか不明な点も多いので
もしご存知の方いましたらサンプルコードとか
教えて頂けると嬉しいです。

参考までに検証用に用いたコードを以下に示す。

```objc:main.m
#import <Foundation/Foundation.h>

@interface Foo : NSObject
{
    NSString* bar;
}
@property(weak,nonatomic) NSString* huga;
@property(weak,readonly,nonatomic) NSString* foobar;
@end

@implementation Foo
@synthesize huga;
@dynamic foobar;
-(NSString *)foobar
{
    return [huga stringByAppendingString:@"foobar"];
}
@end

int main()
{
    Foo *foo = [[Foo alloc] init];
    
    //普通のアクセサメソッドを使ったアクセス
    foo.huga=@"foofoo";
    NSLog(@"normal:%@",[foo huga]);
    
    //KVCによるアクセス
    [foo setValue:@"hogehoge" forKey:@"huga"];
    NSLog(@"KVC:%@",[foo valueForKey:@"huga"]);
    
    //アクセサメソッドがないインスタンス変数へのKVCでのアクセス
    [foo setValue:@"barbar" forKey:@"bar"];
    NSLog(@"アクセサメソッドなしKVC:%@",[foo valueForKey:@"bar"]);
    
    //独自定義されたアクセサメソッドへのKVCでのアクセス
    NSLog(@"original accessor method KVC:%@",[foo valueForKey:@"foobar"]);
    
    //キーとなる文字列は実行中に決定されてもよい
    NSArray *keys = @[@"huga",@"bar",@"foobar"];
    int index = arc4random() % 3;
    NSLog(@"key:%@,dynamic KVC:%@",keys[index],[foo valueForKey:keys[index]]);
    
    return 0;
}
```
Eclipseの設定(Macバージョン)

・ショートカットキーの作成
プログラムを書いて[実行]するのを自分の好きなショートカットキーで行う。
Eclipseを起動し、command+shift+Lを二回押す。![スクリーンショット 2014-05-17 14.10.20.png](https://qiita-image-store.s3.amazonaws.com/0/44144/0cbcde88-83ee-c0c6-603a-1538ea13102e.png)
するとこんな画面が出てきます。

検索部分で[run]と検索し、下にスクールすると[Run]と出てくるのでそこをクリック。
Bindinの部分を自分の好きなショートカットキーに変更！完成！
![スクリーンショット 2014-05-17 14.11.39.png](https://qiita-image-store.s3.amazonaws.com/0/44144/3e4d0b6b-142f-c8c0-435b-49e14f7110c2.png)






・コード補完のショートカットキー作成
上記と同じでcommad+Shif+Lを二回押す。
![スクリーンショット 2014-05-17 14.34.56.png](https://qiita-image-store.s3.amazonaws.com/0/44144/0313e394-4db0-0c30-9736-394ef738a79d.png)
検索で[contens]と検索。一番上の[contens assist]を選択し、Bindinを変更。
OK!






・右に行数を表示
デフォルトだと表示されていない。
![スクリーンショット 2014-05-17 14.23.26.png](https://qiita-image-store.s3.amazonaws.com/0/44144/4c6c3b99-2509-2375-4b83-4778977cd9a9.png)


左上の[Eclipse] > [環境設定]でこんな画面が出てくる。
![スクリーンショット 2014-05-17 14.25.51.png](https://qiita-image-store.s3.amazonaws.com/0/44144/479b0dcc-ea9c-84ab-2295-7466a8872b02.png)


General > Editors > TextEditorswo選択し、右の[Show line numbers]にクリックを入れる。
すると・・・
![スクリーンショット 2014-05-17 14.28.52.png](https://qiita-image-store.s3.amazonaws.com/0/44144/358abd57-e9f9-9320-f40b-9d22aba0a23f.png)


出た！
OracleでSQLの実行計画を調べる３つの方法まとめ

ブログに書いたよ。
<a href="http://replication.hatenablog.com/entry/2014/05/17/135224">OracleでSQLの実行計画を調べる３つの方法まとめ - 大人になったら肺呼吸＠はてブロ</a> <a href="http://b.hatena.ne.jp/entry/replication.hatenablog.com/entry/2014/05/17/135224"><img src="http://b.hatena.ne.jp/entry/image/http://replication.hatenablog.com/entry/2014/05/17/135224" alt="はてなブックマーク - OracleでSQLの実行計画を調べる３つの方法まとめ - 大人になったら肺呼吸＠はてブロ" border="0" /></a>
NSClassFromStringを利用して、静的ライブラリからクラスをインスタンス化しようとしてnilが帰ってくる場合

ちゃんと、プロジェクトに組み込んで、ヘッダー検索パスにも、パスを追加してるのに、NSClassFromString が nil を返してインスタンス化できない現象に遭遇しました。

解決策は、このサイトを参考

[NSClassFromString returns nil](http://stackoverflow.com/questions/2227085/nsclassfromstring-returns-nil)

つまり、
静的ライブラリからクラスをインスタンス化しようとしている場合は、「他のリンカフラグ」ビルド設定に "-ObjCの" フラグを追加する必要があります。
「iOSアプリ開発でZXingObjCを使ってQRコードを読み取る」をやってみた

仕事でQRコードを使ったアプリ開発の案件があったので、

以下のサイトを参考して、サンプルを作成していたが、

そのままでは、うまくいかなかった

 
[iOSアプリ開発でZXingObjCを使ってQRコードを読み取る](http://dev.classmethod.jp/smartphone/iphone/ios-zxingobjc21-qrcode-decode/)
 
ZXingObjC は、最新の3.0.1を使用
 

まず、

```objc:ViewController.h
#import <ZXingObjC/ZXingObjC.h> 
```

ここで、「file not found」エラーが出たので、

 

Xcodeのヘッダー検索パスに、

「ZXingObjC」のフォルダまでのパスを入れる

私は、サンプルプロジェクトの直下にいれたので、

以下のように設定しました。

$(SRCROOT)/ZXingObjC-master

 

これで、ビルドは出来るようになったが、

QRコードを読み取ろうとしても

 

ZXCaptureDelegate のデリゲートメソッド

 

 
```objc:ZXCaptureDelegate.h
- (void)captureResult:(ZXCapture *)capture result:(ZXResult *)result;
```

が反応しない。
ソースを追っていくと、

ZXCapture.m の

```objc:ZXCapture.m
if (NSClassFromString(@"ZXMultiFormatReader")) {

      _reader = [NSClassFromString(@"ZXMultiFormatReader") performSelector:@selector(reader)];

  }
```

この部分で、if文の中に入って来てない。

つまり、ZXMultiFormatReader クラスが読みに行けてない。

いろいろ調べてると、

[NSClassFromStringを利用して、静的ライブラリからクラスをインスタンス化しようとしてnilが帰ってくる場合](http://qiita.com/sxrun/items/1d01083f6367124daeaa)

こういうことだったみたい。
これで、無事にQRコードの読み取りがちゃんと出来るようになりました！
Cocoa Controlsまとめ

# すぐに使える！Cocoa Controls
[Cocoa Controls](http://www.cocoacontrols.com/)で紹介されているiOSコンポーネントの中から、個人的にすぐに使えそうなコンポーネントをまとめておく。

## JSQMessagesViewController
Line風タイムラインが必要な場合に使えそうなUIコンポーネント。
[JSQMessagesViewController for iOS](https://www.cocoacontrols.com/controls/jsqmessagesviewcontroller)

![screenshot0.png](https://qiita-image-store.s3.amazonaws.com/0/39445/7358db00-e2ab-4ef8-84a6-663161bc93d5.png)

CocoaPodsの使い方は[ココ](http://qiita.com/stkn_bb/items/479bcdf91cff2634ffb1) を参照。

## POVoiceHUD
Google音声認識風ダイアログ。マイク入力をファイルに保存する。音声処理部は用途に応じて実装し直そう。
[POVoiceHUD for iOS](https://www.cocoacontrols.com/controls/povoicehud)

![original.png](https://qiita-image-store.s3.amazonaws.com/0/39445/e1c73cd6-cd6a-4e4e-2184-ad903dfdf269.png)
heroku openのエラー

heroku へデプロイして
本番環境でサンプルアプリケーションが動作しているか確かめる

`$ heroku open`

エラーがでた

Application Error
`An error occurred in the application and your page could not be served. Please try again in a few moments.
If you are the application owner, check your logs for details.`

ので、内容を見てみる
`$ heroku logs`

`at=error code=H10 desc="App crashed" method=GET path=/ host=obscure-dawn-8322.herokuapp.com request_id=6d9685c0-3c3d-418e-a570-c5cee9a2085d fwd="133.31.219.68" dyno= connect= service= status=503 bytes=
`


再起動
`
・heroku ps:restart web.1
・heroku ps
`
しても変わらず・・

`$heroku logs --tail`

`2014-05-17T04:20:52.779552+00:00 heroku[run.4846]: State changed from starting to up
2014-05-17T04:20:52.675062+00:00 heroku[run.4846]: Awaiting client
2014-05-17T04:21:24.116094+00:00 heroku[run.4846]: State changed from up to complete
2014-05-17T04:21:22.677803+00:00 heroku[run.4846]: Error R13 (Attach error) -> Failed to attach to process
2014-05-17T04:21:24.112800+00:00 heroku[run.4846]: Process exited with status 128`


これを参考にしたが、timeout になってしまっている

http://stackoverflow.com/questions/14892200/cant-heroku-run-rake-db-migrate-through-my-app

http://stackoverflow.com/questions/7546803/heroku-run-console-returns-error-connecting-to-process

`$ heroku run:detached rake db:migrate`
`$ heroku run rails console`

``Running `rails console` attached to terminal... 
up, run.3424
 !    
 !    Timeout awaiting process
``
timeout になってしまっている


`$ telnet rendezvous.runtime.heroku.com 5000`
`Trying 50.19.103.36...
telnet: connect to address 50.19.103.36: Operation timed out
telnet: Unable to connect to remote host
`

エラーもきえず。。
LightTable"を"プログラミングする初歩

[Getting Started Programming Light Table](http://devblog.reverb.com/post/85325435561/getting-started-programming-light-table)のほぼ要約＋αです。

↑では[Light Table](http://www.lighttable.com/)のBOT(Behavior,Object,Tag)アーキテクチャでのObject, Behaviorの基本的な定義の仕方が書かれています。

まずは、Light Tableで適当なnsを作ってClojureScriptのSyntax設定下で実行して、`Light Table　UI`にconnectします。

```clj
(ns sample.core
  (:require [lt.object :as o])
  (:require-macros [lt.macros :as m]))
```

ClojureScriptでは、マクロはClojureで実行するので`:require-macros`を使って取り込みます。

# Objectの定義

`object*`でオブジェクトのテンプレートが作れます。OOPでのClassのようなものでしょうか。

```clj
(o/object* ::my-template-name
           :tags [:my-tag-name]
           :some-nebulous-state [],
           :other-state-like-thing {})
```

`:tags`も含めて`:tags`以降は好きなものを指定できます。
`lt.object`の中を見ると`(apply hash-map r)`が適用されるようです。

```clj:lt.object抜粋1
(defn make-object* [name & r]
  (let [obj (merge {:behaviors #{} :tags #{} :triggers [] :listeners {} ::type name :children {}}
                   (apply hash-map r))]
    obj))

(defn object* [name & r]
  (-> (apply make-object* name r)
      (store-object*)
      (handle-redef)))
```

`->def`を使うと定義が参照できます。

![WS000002.JPG](https://qiita-image-store.s3.amazonaws.com/0/40558/c87e53df-5e3b-3cdf-0a0e-3b8c62c7ab8a.jpeg)

`create`でオブジェクトが作成されます。

![WS000003.JPG](https://qiita-image-store.s3.amazonaws.com/0/40558/38ba93a3-26c3-84d5-e638-8e3af46859ac.jpeg)

`instances-by-type`で指定したtypeのインスタンス一覧が取得できます。

![WS000004.JPG](https://qiita-image-store.s3.amazonaws.com/0/40558/c78ac436-c97c-e1bf-d553-23c85fa0bd9f.jpeg)

`by-id`や`by-tag`でもインスタンスを取得できます。

![WS000005.JPG](https://qiita-image-store.s3.amazonaws.com/0/40558/7d35c253-0a9a-ea21-a7e2-e8178c224b73.jpeg)


# Behaviorの定義

`behavior`マクロでBehaviorの定義ができます。

```clj
(m/behavior ::my-behavior-name
            :triggers #{:my-trigger-name}
            :reaction (fn [self & rest]
                        (prn (str "self:" self " and: " rest))))
```

同じように`->behavior`で定義が参照できます。

![WS000006.JPG](https://qiita-image-store.s3.amazonaws.com/0/40558/06ee5e98-71df-91f1-9f53-2ca755b64191.jpeg)

`add-behavior!`で、ObjectにBehaviorを追加できます。ただし、他によい方法があります。（下で説明）
`raise`で、Objectにトリガーを与えるとそのトリガーに紐づいたBehaviorの:reactionが実行されます。

```clj
(o/add-behavior!
  (first (o/by-tag :my-tag-name))
  [::my-behavior-name])

(o/raise (first (o/by-tag :my-tag-name))
         :my-trigger-name)
(o/raise (first (o/by-tag :my-tag-name))
         :my-trigger-name :a "b")
```

![WS000007.JPG](https://qiita-image-store.s3.amazonaws.com/0/40558/4306708b-1183-e3a7-acc4-f88a1ba33861.jpeg)

# Behavior紐付けの実際
`add-behavior!`を使うと、Light Table自身がBehaviorsのリロードをしたときに問題があるので、実際にはUser Behavior設定かプラグイン内での.behaviorsファイルでTagとBehaviorの関連を設定します。

```clj
{:+ {:my-tag-name [:sample.core/my-behavior-name]}}
```

```clj
{:+ {:my-tag-name [(:sample.core/my-behavior-name "xyzzy" "thud"]}}
```

# まとめ
このように、tag→object→trigger→behavior→stateのようなアクセスのチェーンを定義する仕組みによって、柔軟なプラグイン構造を実現しているようです。
【Unity】コルーチンを使ってウィップ弾を実装する

![001.png](https://qiita-image-store.s3.amazonaws.com/0/43772/e178c475-c14e-04d1-0199-611ff65e4260.png)
コルーチンを使ってウィップ弾を実装する方法を紹介します。

実行サンプルはこちらです。

* http://2dgames.jp/unity/test/whip/test.html

## ウィップ弾とは？
これは私の造語なのですが、ムチのようにしなって飛んでくる弾幕を「ウィップ弾」と呼んでいます。この弾は、最初はゆっくりした速度で発射され、遅延して同じ角度で、しかし後で撃たれた弾が追いかけるように速い速度で飛んでくる弾のことです。
![002.png](https://qiita-image-store.s3.amazonaws.com/0/43772/0e81ccf8-f772-6fc0-4eee-edcffb6bf3e6.png)
見た目は派手なのですが、初速が遅いため見て避けるのが簡単、という見せ弾幕っぽい使い方ができます。

ただ、これを普通に実装しようとすると以下の2つの面倒な処理が必要となります

* 最初の一発を撃つときの角度を覚えておく
* 遅延して撃つために発射用のタイマーが必要になる

ですがUnityならコルーチンが使えるので比較的楽に実装することができます。

## 実装方法

```csharp:Enemy.cs
  // 弾を撃つ
  // @param dir 角度
  // @param speed 速さ
  // @param msWait 遅延時間(ミリ秒)
  private void DoBullet(float dir, float speed, float msWait=0f) {
    StartCoroutine(DoBulletCoroutine(dir, speed, msWait));
  }
  private IEnumerator DoBulletCoroutine(float dir, float speed, float msWait=0f) {
    if(msWait > 0f) {
      // 指定されたミリ秒待つ
      yield return new WaitForSeconds(msWait*0.001f);
    }
    Bullet.Add(transform.position, dir, speed);
  }

```

弾を撃つ関数をこのように実装します。そしてウィップ弾の発射を以下のように実装します

```csharp:Enemy.cs
  public void BulletWhip() {
    // 3Way弾
    for(int j = 0; j < 3; j++) {
      // 弾の間隔は20度
      float aim = GetAim() - 20 + j * 20;
      // 8発撃つ
      for(int i = 0; i < 8; i++) {
        float spd = 5 + i * 0.7f; // 初速5。0.7ずつ速くする
        float wait = 0 + i * 100; // 100msずつ遅延して撃つ
        DoBullet(aim, spd, wait);
      }
    }
  }
```

上記の例は

* 3Way弾
* 弾の間隔は20度
* 1つのウィップにつき8発、発射

となっています。

## 見映えを良くするコツ
弾を発射する敵は、プレイヤーがいる方向から垂直に移動しながら撃つと弾がばらけるので、見映えが良くなります。参考の画像も上下に移動しながら弾を撃っています。
exportされていないNode.jsのモジュールを使う方法

Module.wrapを書き換えます。
[元ののModule.wrapの実装はこちら]
(https://github.com/joyent/node/blob/master/src/node.js#L784)

```js
var Module = require('module');

var _wrap = Module.wrap;

Module.wrap = function(script) {
    Module.wrap = _wrap;
    script += '\ntry { module.exports = TypeScript; } catch(e) {}';
    return _wrap(script);
};


var TypeScript = require('typescript');

console.log(TypeScript.TypeScriptCompiler);

```
PHPで動的にメソッドを追加する方法


プラグイン機構を実装したいことがあって調べた。

基本的なやりかたとしては、

- 「メソッド名」と「コールバック」をひもづける配列を用意しておく
- __call()の中で、call_user_func_array()で追加したメソッドを実行する
- Closure::bindTo()で$thisをバインドする(コールバックから他のメソッドを呼び出すため)

という感じ。

以下のようになる。

```php:test1.php
class Object
{
    static private $_methods = array();

    static public function addMethod($name, Closure $cb)
    {
        self::$_methods[$name] = $cb;
    }

    public function __call($name, array $args)
    {
        $func = self::$_methods[$name];
        return call_user_func_array($func->bindTo($this, get_class($this)), $args);
    }

    public function add($a, $b)
    {
        return $a + $b;
    }
}

foreach (array(10,100,1000) as $base) {
    Object::addMethod('add'.$base, function($number) use ($base) {
        return $this->add($number, $base);
    });
}

$object = new Object();

echo $object->add10(1)."\n";
echo $object->add100(1)."\n";
echo $object->add1000(1)."\n";
```

Closure::bindTo()は、5.4からの機能なので、
もし5.3で同じように行うためには、
コールバックの引数の最初に$thisを追加するように対応する。

```test2.php
<?php

class Object
{
    static private $_methods = array();

    static public function addMethod($name, Closure $cb)
    {
        self::$_methods[$name] = $cb;
    }

    public function __call($name, array $args)
    {
        array_unshift($args, $this);
        return call_user_func_array(self::$_methods[$name], $args);
    }

    public function add($a, $b)
    {
        return $a + $b;
    }
}

foreach (array(10,100,1000) as $base) {
    Object::addMethod('add'.$base, function($self, $number) use ($base) {
        return $self->add($number, $base);
    });
}

$object = new Object();

echo $object->add10(1)."\n";
echo $object->add100(1)."\n";
echo $object->add1000(1)."\n";
```

Closure::bindTo()と違うのは、
privateのメソッドが呼び出せないところ。


# 参考

PHP 5.3でクラスにメソッドを動的に追加する
http://lab.tricorn.co.jp/toda/4082

PHPでメソッドを動的に追加する方法
http://qiita.com/suin/items/99c95c6b2182b54d9405
NSControlのプロパティの変更とアクションの実行はどちらが先? という話


NSSliderをいっこだけ配置したアプリケーションを作ってみる。

![slider.png](https://qiita-image-store.s3.amazonaws.com/0/3847/0ebd7218-ee4d-44e3-10a2-64d3aabf52c8.png "slider.png")


構造は極めて単純で
* NSSliderのvalueには AppDelegateの sliderValueプロパティを bindする
* sliderの操作は AppDelegateの sliderActionで受ける

図にするとこう。
![fig0.png](https://qiita-image-store.s3.amazonaws.com/0/3847/1994b156-f003-5d1e-d602-fc4ab68fe6ee.png "fig0.png")

実装も単純に。

```objectivec:setSliderValue
-(void)setSliderValue:(NSInteger)v
{
    NSLog(@"setSliderValue");
    
    if (_sliderValue == v)
        return;
    
    _sliderValue = v;
}
```

```objectivec:sliderAction
-(IBAction)sliderAction:(id)sender
{
    NSLog(@"sliderAction");
}
```

で、実行してみた

```
2014-05-17 09:59:49.638 SliderActionAndBind[1832:303] setSliderValue
2014-05-17 09:59:49.639 SliderActionAndBind[1832:303] sliderAction
2014-05-17 09:59:52.174 SliderActionAndBind[1832:303] setSliderValue
2014-05-17 09:59:52.175 SliderActionAndBind[1832:303] sliderAction
2014-05-17 09:59:52.960 SliderActionAndBind[1832:303] setSliderValue
2014-05-17 09:59:52.960 SliderActionAndBind[1832:303] sliderAction
...
```

どうやらプロパティの変更→アクションの実行の順で行われるようだ。他のコントロールは試してないし、実行のたびに変わるのかもしれない。この辺Appleの公式ドキュメントのどこに書かれているんだろう・・・

### そもそもプロパティの setterだけでいいんじゃないの

アクションとプロパティを別々に書く必要なんてあるの、setterの中にactionの処理書いても同じなんじゃない、という話もあるんだけど、そうとも言えない問題が起きたのが今回の疑問の発端。

この辺についてもうちょっと書こうと思ったけど少し考えをまとめてから別記事に。
数値をエクセルの列表現に変換する関数

もっと他に方法が用意されているのではないかと思いますが、
見つけられ無かったので自作しました。

```vbnet
Function alpha(ByVal i As Long) As String
'    与えられた数値をエクセルの列を表すアルファベットにして返す。
    Dim ret As String
    ret = ""
    Do
        i = i - 1
        ret = Chr(i Mod 26 + 65) & ret
        i = i \ 26
    Loop While i > 0
    
    alpha = ret
End Function
```
gulpをGUIで使うためのアレコレ


まだ、まとめるには早いかなと思いつつ、そろそろ動きがありそうなので、今後もこのページをアップデートしていくつもりで書いてみます。

## gulp-app (まだα版)

最初に本命から。さきほど、リポジトリが公開されたばかりで、まだすぐ使えるという段階ではないものの、Finderで対象ディレクトリを開いておくと、`gulpfile.js`を読み取って、タスクをメニューバーに表示してくれる「これが欲しかったんだ!」的なアプリ。node-webkitで実装されています。

- 対応環境: Mac
- URL: https://github.com/sindresorhus/gulp-app

![Finder.png](https://qiita-image-store.s3.amazonaws.com/0/1858/f33b402c-d1ea-1b2a-7677-25ffa24c1b2a.png "Finder.png")


## エディタから利用するタイプ

- Sublime向け: [sublime-gulp](https://github.com/NicoSantangelo/sublime-gulp)
- Atom向け: [gulp-helper](https://github.com/kenwheeler/gulp-helper)

そのほか、統合環境での利用について、いくつかアナウンスが出ているみたい。

- Webstorm は [次のバージョンでサポート](http://blog.jetbrains.com/webstorm/2014/05/webstorm-9-development-roadmap-discussion/)。
- Visual Studio も [次のバージョン](https://twitter.com/mkristensen/status/466401181003448320)で[サポート](http://visualstudiogallery.msdn.microsoft.com/dcbc5325-79ef-4b72-960e-0a51ee33a0ff)する[らしいです](http://channel9.msdn.com/Events/TechEd/NorthAmerica/2014/DEV-B413#fbid=)。


## ブラウザエクステンション

- Chrome拡張 : [gulp-devtools](https://chrome.google.com/webstore/detail/gulp-devtools/ojpmgjhofceebfifeajnjojpokebkkji/)


## gulpfile.js のオンラインエディタ

- [gulpfiction](http://gulpfiction.divshot.io/#/3adde8af-39b9-46e1-87c0-de694c0d84c1)


## 参考

- [Is there any GUI tool for Gulp?](https://github.com/gulpjs/gulp/issues/468)
【Unity2D】2点間の角度を求める

![001.png](https://qiita-image-store.s3.amazonaws.com/0/43772/34f33662-8c99-5cca-003c-a5267426b7a5.png)
シューティングゲームでは必須となる狙い撃ち弾の角度の求め方です。

```csharp
// p2からp1への角度を求める
// @param p1 自分の座標
// @param p2 相手の座標
// @return 2点の角度(Degree)
public float GetAim(Vector2 p1, Vector2 p2) {
  float dx = p2.x - p1.x;
  float dy = p2.y - p1.y;
  float rad = Mathf.Atan2(dy, dx);
  return rad * Mathf.Rad2Deg;
}
```

![002.png](https://qiita-image-store.s3.amazonaws.com/0/43772/f39fb1bc-80b8-c84e-dba0-5166240fa354.png)

これで狙い撃ち弾を撃てるようになりました。

## ~~Vector2.Angleを使う~~
(2014/7/27 追記)
~~コメント欄で指摘頂いたのですが、[Vector2.Angle](http://docs.unity3d.com/ScriptReference/Vector2.Angle.html)という便利な関数があるので、それを使えば三角関数は不要になりそうです。~~

- Vector2.Angleの起点は、(0.0)です
    - http://d.hatena.ne.jp/shoji_hibino/20130531/1369973246

ただし、上記ページにあるように使用するには若干のクセがあるので注意が必要そうです。

~~仕様から察するに、たぶんこんな書き方で動くはず……。~~

```csharp
// p2からp1への角度を求める
// @param p1 自分の座標
// @param p2 相手の座標
// @return 2点の角度(Degree)
public float GetAim(Vector2 p1, Vector2 p2) {
  Vector2 a = new Vector2(1, 0);
  Vector2 b = p2 - p1; // p1を原点に持ってくる
  return Vector2.Angle(a, b);
}
```

(2014/8/6 追記)
どうやらVector2.Angleは差を求めるだけなので、狙い撃ちの角度を取得するのには使えなさそうな感じです。

## おまけ
取得した角度を元に rigidbody2Dに速度を設定する方法です

```csharp:Bullet.cs
  // 速度を設定
  // @param 角度
  // @param 速さ
  public void SetVelocityForRigidbody2D(float direction, float speed) {
    // Setting velocity.
    Vector2 v;
    v.x = Mathf.Cos (Mathf.Deg2Rad * direction) * speed;
    v.y = Mathf.Sin (Mathf.Deg2Rad * direction) * speed;
    rigidbody2D.velocity = v;
  }
```

## おまけ2
狙い撃つ相手を探すために GameObject.Find() や GameObject.FindWithTag() を使用することになると思いますが、この関数は全オブジェクトを走査することとなるため、弾幕STGのようなオブジェクトが大量にあるゲームでは処理が重くなります。そのため以下のようにキャッシュさせて使用すると処理を軽くすることができます。（ただしPlayerは1つのみであることが前提)

```csharp:Enemy.cs
  // キャッシュ用変数
  private GameObject _target = null;

  // 狙い撃ち角度を取得する
  public float GetAim() {
    if(_target == null) {
      // 未取得であればキャッシュする
      _target = GameObject.FindWithTag ("Player");
    }
    Vector2 p1 = transform.position;
    Vector2 p2 = _target.transform.position;
    float dx = p2.x - p1.x;
    float dy = p2.y - p1.y;
    float rad = Mathf.Atan2(dy, dx);

    return rad * Mathf.Rad2Deg;
  }
```
C言語で可変長引数をそのまま別の関数に渡したい

単純に渡せそうにないです...

```c
#include <stdio.h>
#include <stdarg.h>

/*
 * printfした後改行する
 */
void printfl(const char *fmt, ...)
{
  va_list list;
  va_start(list, fmt);
  vprintf(fmt, list);
  printf("\n");
  va_end(list);
}

void main()
{
  printfl("test:%d", 12345); // 12345
}
```

C言語で可変長引数を使う場合は stdarg.h をインクルードしておく必要があります。
また、渡す先でva_listに対応している必要があります。
printf に va_list を渡しても正しく動作しなかったので
vprintfを使っています。定義は以下の通り

```c
int vprintf(const char *format, va_list ap);
```
Node.js/io.jsなるものが超初めてな自分用にまとめてみる。0.2

#Node.js
公式サイト
http://nodejs.org/

Node.js 日本ユーザグループ
http://nodejs.jp/

Node.js v0.10.26 マニュアル & ドキュメンテーション
http://nodejs.jp/nodejs.org_ja/docs/v0.10/api/

#io.js
[io.js](https://iojs.org/)


[io.jsについて知っていること](http://yosuke-furukawa.hatenablog.com/entry/2014/12/25/104300)



#本
はじめてのNode.js 
サーバサイドJavaScript Node.js入門

#バージョン管理
[nodebrew](https://github.com/hokaccha/nodebrew)
[nvm](https://github.com/creationix/nvm)

#Node.jsを単純にDLする
http://nodejs.jp/nodejs.org_ja/
上記サイトからDLして、インストールする。
ターミナルから

```bash
$ node -v
```
して、バージョン表示できたらOK。

インストーラからインストールすると、
node本体と一緒にNode.jsのパッケージマネージャであるnpmがインストールされる。

例
npmを用いたsocket.ioのインストール

```bash
$ npm install socket.io
```


5分で終了。node.jsの環境構築が拍子抜けするほど簡単だったのでサンプルプログラム付きでまとめてみました【Mac編】
http://www.tettori.net/post/293/

#チュートリアル
【node.js】socket.ioで構築したローカルで動くシンプルなチャットルーム。みんなで書けるリモート版も公開中。
http://www.tettori.net/post/852/

node.jsアプリを置ける海外のサービスappfogで無料アカウントを作ってアプリもインストールしてみました
http://www.tettori.net/post/960/

自作node.jsアプリを無料のクラウドサーバに登録する方法
http://www.tettori.net/post/1029/


基礎から学ぶNode.js
http://gihyo.jp/dev/serial/01/nodejs


「ビギナーのための Node.jsプログラミング入門」グループ 
http://libro.tuyano.com/index2?id=1115003

JavaScriptでWebアプリを開発できる「Node.js」活用入門
http://sourceforge.jp/magazine/12/04/11/0618228


#Tips
Node.js とは一体何か？
http://www.ibm.com/developerworks/jp/opensource/library/os-nodejs/

Node.jsアプリ開発で参考になる記事 まとめ
http://dev.classmethod.jp/server-side/node-js-summary/

naveでNode.jsのバージョン管理＆イベントループ詳説 (1/3)
http://www.atmarkit.co.jp/ait/articles/1103/23/news101.html

Nodeビギナーズブック
http://www.nodebeginner.org/index-jp.html

express
http://hideyukisaito.github.io/expressjs-doc_ja/

node.js ハンズオン資料
http://dl.dropboxusercontent.com/u/219436/node.js/handson/build/html/index.html#id3



第二回 ティザーサイトの実装裏側！-環境編
http://mdlab.jp/project/node_js/02.html

##socket.io

Socket.IO
http://jxck.github.io/socket.io/

[node] Socket.IOを使ったチャットアプリ。インストールから実装まで。
http://www.yoheim.net/blog.php?q=20120408

【Node.js】socket.ioを使って簡単にチャットを作る方法
http://creator.cotapon.org/articles/node-js/%E3%80%90node-js%E3%80%91socket-io%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E7%B0%A1%E5%8D%98%E3%81%AB%E3%83%81%E3%83%A3%E3%83%83%E3%83%88%E3%82%92%E4%BD%9C%E3%82%8B%E6%96%B9%E6%B3%95

Node.jsとWebSocket.IOでチャットアプリを作る
http://mawatari.jp/archives/make-a-chat-application-in-node-js-and-websocket-io
変数の const 付け方一覧

変数への const の付け方をまとめてみました。
ややこしい解説は一切なしです！

# 値の書き換え禁止
```cpp:
const int a  = 0;
int const a2 = 0;    // 意味は同じ

a = 1;		// コンパイルエラー
```

# ポインタの指す値の書き換え禁止
```cpp:
int b = 0;

const int * p_b  = &b;
int const * p_b2 = &b;    // 意味は同じ

p_b = &b;			// OK
(*p_b) = b;			// コンパイルエラー
```

# ポインタの書き換え禁止
```cpp:
int c = 0;
int * const p_c = NULL;

p_c = &c;		// コンパイルエラー
(*p_c) = c;		// OK
```

# ポインタ、ポインタの指す値の両方の書き換え禁止
```cpp:
int d = 0;
const int * const p_d = NULL;

p_d = &d;       // コンパイルエラー
(*p_d) = &d;    // コンパイルエラー
```
printfの書式の * ってなんだ？

C言語のprintfに `*` というものがあります。

```c
#include <stdio.h>

int main()
{
  printf("%*s\n",  5, "aa"); // '   aa' が出力される(左3文字空白)
  printf("%*s\n",  5, "aaaabbbb"); // 'aaaabbbb' が出力される
  printf("%.*s\n", 5, "aaaabbbb"); // 'aaaab' が出力される
  return 0;
}
```

つまり、`*` は引数で表示する文字数を定義できるということですね。`*` だけだと、定義文字長を超えた文字列が与えられると全部表示されますが、`.`と組み合わせることで、定義文字長で切って表示することが可能です。

この書式を使う場面としては、整形もそうですが、どんな長さの文字列が来るかわからない場合にとりあえずバッファのMAXサイズでぶった切る。ってのにも使えそうですね。まぁ、そういう場合はちゃんと長さチェックしてから処理するんでしょうけどね(^ ^;)

```c
#include <stdio.h>
#define MAX_LENGTH 8

/*
 * in_strの先頭5文字(正確にはMAX_LENGTH-2文字)
 * に括弧をつけてbufに格納する
 */
void string_print(char *buf, char *in_str)
{
  char *format[] = "(%.*s)";
  unsigned int disp_len = MAX_LENGTH - 2; // -2は書式内の()の分
  sprintf(buf, format, disp_len - 1, in_str); // -1 は \0の分
}

int main()
{
  char buf[MAX_LENGTH];
  string_print(buf, "aaaabbbb");
  printf("%s\n", buf);
  return 0;
}
```
groovy/gradle 導入されてるメモ

# 前提
* 環境：windows7
* いついれたか正確な記憶がないが、入っている＆セットアップした
    * IntelliJ IDEA で gradle つかってみたかった
* 環境設定のメモをしておく(超暫定)


# 詳細
## 手順
1. groovy 入れる (インストーラー)
1. gradle 入れる (zip 解凍)
1. 環境変数(HOME)設定
    1. JAVA_HOME 設定  (※GRADLE 導入に必要だった？)
    2. GROOVY_HOME 設定 (※おそらくインストーラーが自動でしてくれる)
    3. GRADLE_HOME 設定
1. 環境変数(PATH)追加設定
    * %GROOVY_HOME%\bin; (※これもおそらく自動で)
    * %GRADLE_HOME%\bin;

## 不明点
gradle を動かす JDK の設定が必要で、色々悩んで JAVA_HOME グローバルに指定する方法を取った
…ような記憶はあるんですが、詳細不明orz
Mojoliciousでエラーメッセージ画面を変更する


![スクリーンショット 2014-05-17 10.03.57.png](https://qiita-image-store.s3.amazonaws.com/0/2278/977692a4-9ddc-90d6-3fd4-ad416e374e95.png "スクリーンショット 2014-05-17 10.03.57.png")

デフォルトで表示される恐竜は可愛いけれど、
エラー画面を変更したい場合がある。

その場合、templatesディレクトリ下に、
それぞれのエラーに対応するテンプレートファイルを置く。

- not_found.html.ep (404)
- exception.html.ep (500)

これらのファイルを置けば、画面を変更することができるけれど、
開発している場合は、エラー詳細が表示されるデフォルト画面が表示されてほしい。

テンプレートファイルは、以下のような命名規則にもなっている。

- exception.$mode.$format
- not_found.$mode.$format

$modeで切り替えることができる。
本番では"production"モードとなっているはずなので、
以下のファイルを置くことになる。

- exception.production.html.ep
- not_found.production.html.ep

morboで起動している場合は、
"development"モードなのでデフォルトの画面が表示される。

morboで"production"の画面をチェックしたい場合は、
MOJO_MODE環境変数で指定すれば表示させることができる。

```shell
$ MOJO_MODE=production morbo script/myapp
```


## 参考

http://mojolicio.us/perldoc/Mojolicious/Guides/Rendering#Rendering_exception_and_not_found_pages
GoogleTestを使って単体テストを行う準備をする。



## GoogleTestってなに？
Googleが作成したC/C++用のxUnit系単体テストフレームワーク
http://googletest.googlecode.com/


## GoogleTestの何がいいの？　※個人的な所感

個人的にC/C++で単体テスト書くならGoogleTest一択です

- 他のC/C++用xUnitライブラリより`main()`など簡単に記載できる
- `stdout`や`stderr`を簡単にキャプチャすることができる
- `exit()`などのデステストも標準サポート
- XMLで結果を出力できるのでJenkinsなどに対応している
- `gcov/gcovr`と連携すればカバレッジの可視化も可能
- **OSS。ここまで出来て無料**


## これから作成するライブラリについて ##
**libgtest.a** : google Testのテスト関数が全て入っているライブラリ
**libgtest_main.a** : 全てのテストケースを呼び出して実行する`main()`関数のオブジェクト。#実行時の引数で実行テストケースを指定することも可能。

## 基本的な使い方 ##
以下URLなどを参照してテストファイルを作成する　＃Makefileの作成方法は後日記載予定

**Google Test ドキュメント日本語訳 » 入門ガイド**
[http://opencv.jp/googletestdocs/primer.html](http://opencv.jp/googletestdocs/primer.html)

後述で作成したライブラリを利用してテスト実行オブジェクトを作成する

```zsh
g++ -I${GTEST_DIR}/include path/to/your_test.cpp  path/to/targetFunction.cpp  libgtest.a libgtest_main.a -o your_test
```

出来上がった`your_test`を実行する


## コンパイル手順 ##

````zsh
[budougumi0617@18:53:49] pwd                     [~/tmp]
/home/budougumi0617/tmp
[budougumi0617@18:49:17] wget http://googletest.googlecode.com/files/gtest-1.6.0.zip
[budougumi0617@18:53:51] unzip gtest-1.6.0.zip   [~/tmp]
[budougumi0617@18:53:51] cd gtest-1.6.0          [~/tmp]
[budougumi0617@18:32:42] ./configure             [~/tmp/gtest-1.6.0]
[budougumi0617@18:33:31] export GTEST_DIR=~/tmp/gtest-1.6.0   
[budougumi0617@18:34:06] g++ -I${GTEST_DIR}/include -I${GTEST_DIR} -c ${GTEST_DIR}/src/gtest-all.cc
[budougumi0617@18:34:28] ar -rv libgtest.a gtest-all.o   
r - gtest-all.o
[budougumi0617@18:37:41] cd make                 [~/tmp/gtest-1.6.0]
libgtest.a  Makefile
[budougumi0617@18:37:46] make gtest_main.o       [~/tmp/gtest-1.6.0/make]
g++ -I../include -I.. -g -Wall -Wextra -c \
            ../src/gtest_main.cc
[budougumi0617@18:37:53] ar -rv libgtest_main.a gtest_main.o 
ar: creating libgtest_main.a
a - gtest_main.o
[budougumi0617@18:38:29] cp libgtest_main.a ../  [~/tmp/gtest-1.6.0/make]
[budougumi0617@18:39:01] cd ..                   [~/tmp/gtest-1.6.0/make]
[budougumi0617@18:39:04] ls                      [~/tmp/gtest-1.6.0]
aclocal.m4      codegear       CONTRIBUTORS  lib              make         README   xcode
build-aux       config.log     COPYING       libgtest.a       Makefile     samples
CHANGES         config.status  fused-src     libgtest_main.a  Makefile.am  scripts
cmake           configure      gtest-all.o   libtool          Makefile.in  src
CMakeLists.txt  configure.ac   include       m4               msvc         test
````

**#以上でライブラリファイル完成！Sampleメソッドは後日記載予定**
MacでU.S.キーボードを削除する

OSXのバージョンを1.9.3にバージョンアップしたら
U.S.キーボードが復活していたのでメモ。

この状態だと消せないので

![021078098195de8d99ccde0bca2ef340.png](https://qiita-image-store.s3.amazonaws.com/0/2248/e26edb25-890a-da6e-612b-03bbe4f08609.png)

ことえりを追加すると

![16512f78fb67165969170c2e586d714d.png](https://qiita-image-store.s3.amazonaws.com/0/2248/e682e14c-311e-b5ce-a5f4-acbbcdbf550e.png)

U.S.キーボードが削除できる

![d307f009cbcf801bd289217ae55dbe01.png](https://qiita-image-store.s3.amazonaws.com/0/2248/e464d95f-c8ef-2728-df00-4a9b18c39d7f.png)

そしてことえりを削除すると、綺麗になる

![dee1fc38967c2f88a0188a41a1398708.png](https://qiita-image-store.s3.amazonaws.com/0/2248/bff42757-9d0e-acf1-303a-34003c7920cd.png)
Java7でOpenProjでファイルが開かない件

Java7でOpenProjでファイルが開かなくなることがある。

以下対処方法（Win7 Enterprise 32bit 検証）

① Java6 インストール
② インストールしたフォルダのiniを編集
 Maximum Version=1.6

参考
http://kiwamaru.hatenablog.com/entry/2013/09/23/111035
DropwizardでThymeleaf,Bootstrap

#Dropwizardのview
[こちら](http://dropwizard.readthedocs.org/en/latest/manual/views.html)に説明があります。
FreeMarkerとmustacheしかなかったので、Springと仲の良いThymeleafを使えるようにしてみた。
https://github.com/deffence1776/dropwizard-views-thymeleaf

Thymeleafはテンプレートが通常のHTMLとして、表示できるのがいいところ。JavaScriptなんかもアプリを通さず利用できて欲しいところなので、やってみた。

##Application
```java:ExampleBootStrapApplication.java
public class ExampleBootstrapAppication extends Application<ExampleBootstrapConfigration>{

    public static void main(String[] args) throws Exception {
        new ExampleBootstrapAppication().run(args);
    }

    @Override
    public void initialize(Bootstrap<ExampleBootstrapConfigration> bootstrap) {

        //ThymeleafviewRenderer
        ImmutableSet<ViewRenderer> renderes= ImmutableSet.of((ViewRenderer)new ThymeleafViewRenderer());
        bootstrap.addBundle(new ViewBundle(renderes));

       //静的ファイルの設定。
       //ThymeleafViewRendererのtemplateファイル配置場所を設定
        bootstrap.addBundle(new　AssetsBundle("/templates/css","/css",null,"css"));
          bootstrap.addBundle(new　AssetsBundle("/templates/js","/js",null,"js"));
          bootstrap.addBundle(new　AssetsBundle("/templates/fonts","/fonts",null,"fonts"));

    }

    @Override
    public void run(ExampleBootstrapConfigration configuration, Environment environment)
            throws Exception {

        environment.jersey().register(new ExampleBootstrapResource());

    }
}
```
#Configuration
```java:ExampleBootstrapConfigration.java
public class ExampleBootstrapConfigration extends Configuration {

    @JsonProperty
    private String appName;

    public String getAppName() {
        return appName;
    }

    public void setAppName(String appName) {
        this.appName = appName;
    }
}
```

#Resource,View
```java:ExampleBootstrapResource.java
@Path("/")
public class ExampleBootstrapResource {

    @GET
    public ExampleBootstrapView index(){
        return new  ExampleBootstrapView();
    }

}
```
```java:ExampleBootstrapView.java
public class ExampleBootstrapView extends ThymeleafView{
    private String value;

    protected ExampleBootstrapView() {
        super("index.html");
    }

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }
}
```

#templateと静的ファイル
src/resources/templates
|-index.html(BootStrapのテンプレート)
|-css
|-fonts
|-js
Atom Shellでkoaを動かせた

# はじめに
## Atom Shellとは
GitHubが最近OpenSourceにして公開したATOMエディタのnode-webkitライクな部分。HTML5でデスクトップアプリが作れそうなやつ。

## koaとは
node.jsのWebフレームワークのexpressの次世代版的フレームワーク。generator使ってコールバック地獄からおさらばできるらしい

# koaを動かすには
## --harmonyオプションが必要
これはnode.jsでkoaを使う場合でも必要なV8に対してECMA6な実装を
利用可能にお願いするオプション。Atom Shellでもこれが必要。

appでredyイベント後にapp.commanLine.appendSwitchで色々
他にも内部のnode.jsに対して指定できる模様。

```js
app.on('ready', function() {
  app.commandLine.appendSwitch("js-flags", "--harmony");
  // Create the browser window.
  mainWindow = new BrowserWindow({
    width: 800,
    height: 600
  });

  // and load the index.html of the app.
  mainWindow.loadUrl('file://' + __dirname + '/index.html');
});
```

## 注意

harmonyオプションが有効にできるには、上のコードの例だと、
mainWindowで読み込んだindex.html内で利用可能になる。
mainWIndowを生成しているjs内は有効にならない。


## package.jsonにモジュールを記述

説明はとくに不要と思うので、例だけ

```
{
  "name"    : "your-app",
  "version" : "0.1.0",
  "main"    : "main.js",
  "devDependencies": {
    "koa":"*",
    "co-fs":"*",
    "co-busboy":"*",
    "save-to":"*"
  }
}
```

## apmコマンドでモジュールのインストール

ってことで、OSX以外の環境ではAtomを何とかビルドするか、
バイナリをもらってapmコマンドも入れる必要があります。

```
apm install .
```

決して apm install koaとやらないこと。
apmコマンドはAtomエディタのモジュールインストールに通常
使うためのものなので。

# 関連記事

- [Atom Shellでデスクトップキャプチャー（動画）アプリ](https://abrakatabura.hatenablog.com/entry/2014/05/29/075150)
Rails SimpleCovでカバレッジが上書きされないようにする

# Rails SimpleCovでカバレッジが上書きされないようにする

RailsのテストのカバレッジにSimpleCovを使っています。

`bundle exec rake test COVERAGE=true`を実行すると、ControllerやModelのテストが順番に実行されますが、coverage/index.htmlには一部の実行結果のみが残っていました。

具体的にはModelのテスト結果がControllerのテストで上書きされた状態です。

調べてみるとSimpleCov.command_nameをそれぞれ別の名前になるようにすればうまくマージされることがわかりました。

test_helper.rbに次のような設定を入れました。

```rb:test/test_helper.rb

:

require 'simplecov'
SimpleCov.start do
  add_filter "/test/"
  add_filter "/config/"

  SimpleCov.command_name "MiniTest #{Time.now}"

  add_group 'Controllers', 'app/controllers'
  add_group 'Models', 'app/models'
  add_group 'Helpers', 'app/helpers'
  add_group 'Libraries', 'lib'
end if ENV["COVERAGE"]

:
```

これで全てのテスト結果がマージされるようになりました。

参考：
http://stackoverflow.com/questions/15604390/minitest-with-simplecov
vsftpdにおいて運用中のftpのrootディレクトリを夜間に変更する手順

# vsftpdにおいて運用中のftpのrootディレクトリを夜間に変更する手順

運用中のftpのrootディレクトリを夜間に入れ替えたときの手順をまとめておきます。

* 変更前ディレクトリ：
/home/ftpservice/ftp_root

* 変更後ディレクトリ：
/data/ftp/ftp_root

1. /data/ftpを作成しておきます。

2. ルートフォルダを変更したvsftpd.confを用意しておきます。

3. 入れ替え用スクリプトchange_ftp_dir.shを作成します。

  3.1. ftpサービス停止
  3.2. 旧ディレクトリのデータを新ディレクトリにコピー
  3.3. アクセス権を設定
  3.4. ftpサーバー用設定を変更（rootディレクトリを変更したものと置き換え）
  3.5. ftpサービス起動

4. crontabで夜間にchange_ftp_dir.sh起動するよう仕込んでおきます。


※手順2で作成するvsftpd.confは
`local_root=/home/ftpservice/ftp_root/`
を
`local_root=/data/ftp/ftp_root/`
に変更したファイルです。


※手順3の入れ替え用スクリプト

```bash:change_ftp_dir.sh
echo `date`
sudo /sbin/service vsftpd stop
sudo cp -rpf /home/ftpservice/ftp_root /data/ftp/
sudo chown -R ftpservice /data/ftp
sudo chgrp -R ftpservice /data/ftp
sudo cp vsftpd.conf /etc/vsftpd/vsftpd.conf
sudo chmod 0600 /etc/vsftpd/vsftpd.conf
sudo /sbin/service vsftpd start
echo `date`
```

作ったファイルは次の場所に配置しておきます。

`/data/vsftpd.conf
/data/change_ftp_dir.sh`

5/15 23:00に実行させる場合の設定

`$ crontab -e`

`
00 23 15 05 * /data/change_ftp_dir.sh
`
azure website移行作業つまった処メモ


##azure website
外部サービスのリポジトリと連携できるのがいいですね
個人的に移管でつまったところをメモします

###1. SVGが見れない (woff,tffも)
ルートディレクトリに web.config を作成

```ruby:web.config
<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <system.webServer>
        <staticContent>
            <remove fileExtension=".woff" />
            <mimeMap fileExtension=".woff" mimeType="application/x-font-woff" />
            <remove fileExtension=".ttf" />
            <mimeMap fileExtension=".ttf" mimeType="application/octet-stream" />
            <remove fileExtension=".svg" />
            <mimeMap fileExtension=".svg" mimeType="image/svg+xml" />
        </staticContent>
    </system.webServer>
</configuration>
```

フォントファイルのwoff,ttfも初期設定では反映されないようですので追加しとく

##2.ドメインのはりかえ
ドメイン管理のほうでCNAMEとAレコードでazureとドメインを紐付けてあげます

![Screen Shot 2014-05-17 at 4.05.44.png](https://qiita-image-store.s3.amazonaws.com/0/25735/2c3c84d0-f10f-e2b5-878b-8bcc982b11fd.png "Screen Shot 2014-05-17 at 4.05.44.png")


DASHBORADの下のバーらへんにある　MANAGE DOMAINをクリック
* 外部IPをAレコードしてドメインとひもづける
* CNAMEで awverify.yourdomain.com と awverify.yourdomain.azurewebsites.netを紐付け


参考：[AレコードとCNAME貼替えについて](http://azure.microsoft.com/en-us/documentation/articles/web-sites-custom-domain-name/)

どちらか怠ると紐付けされませんち。
これで張り替え完了です。

githubとつなげられるのべんりですね、とっても！！
Mac OSX でスクリーンロック (Fast User Switching 版)

[MacOSX - MacOSでスクリーンをロック - Qiita](http://qiita.com/tukiyo3/items/7da16c2cc8b3103e926e) という記事を見かけたので、自分がやってる方法もご紹介。

この方法は、Fast User Switching という形でログアウト状態を作ってスクリーン・ロックしようというもの。
[osx - Fast User Switching/Apple Menu? - Super User](http://superuser.com/questions/45740/fast-user-switching-apple-menu)
↑ここで紹介されているので、既にやっている人もいるのではないでしょうか。
ロックする時の Fast User Switching のキューブ・トランジションが気に入って使っています。

まず、Automator で Fast User Switching を実行するサービスを作ります。

![](https://www.evernote.com/shard/s1/sh/ffa770b3-b4b6-4a9a-b7be-8d8feb30698a/26f59841ba347746e2d0b575ae1ba299/res/9e9993c9-1425-4dab-97ae-8a9803954d32/skitch.png)

1.  Automator.app を起動します。
2.  ファイルメニューの `新規` から書類の種類で `サービス` を選択します。
3.  右上の `”サービス”は、次の選択項目を受け取る：` を `入力なし` にします。
4.  左のペインのライブラリから `シェルスクリプトを実行` を探して、右のペインにドラッグ・アンド・ドロップします。
5.  デフォルトではテキストボックスに `cat` が入力された状態になっているので、  
`/System/Library/CoreServices/Menu\ Extras/User.menu/Contents/Resources/CGSession -suspend`  
に書き換えます。
6. 名前を付けて保存します。この名称がサービスメニューに表示される名称になります。以下の例では私は `MacLoc` という名前にしました。
7. ここで保存したものは `~/Library/Services` フォルダの中に入ります。

![](https://www.evernote.com/shard/s1/sh/9bf9b765-037a-49e6-89a0-a5c2b5a5459b/16b22d3e6fd8235e1982678d071ae198/res/7005cb69-db70-4cb8-b358-69d4cfb980b5/skitch.png)

次に、キーボード・ショートカットを割り当てて、さくっとロック出来るようにします。

![](https://www.evernote.com/shard/s1/sh/795b4f1f-9095-44d5-bccd-8c26f80e4cb1/70e943db8fc90f4178e23f01474f2fd1/res/a872bd6b-a189-4bbc-86d9-2f1cb0e0efe3/skitch.png)

1. アップルメニューから `システム環境設定` を開き、`キーボード` を選択します。
2. `ショートカット` タブで、左ペインから `サービス` を選択し、右ペインで `一般` の項目を開くと先程作ったサービスが登録されていますので、そこに好きなキーボード・ショートカットを登録します。登録の仕方はそのサービスの行の右の方をクリックすると、入力状態になるので、その状態で登録したいキーの組み合わせをタイプすると登録されます。

ほぼさっきのページの翻訳なってしまいましたw
ツイート規制値は300ツイート/3時間（ソチ五輪以降

状況証拠からの推測でしかないのですけど。
#3時間あたり300ツイート

>ソチ五輪以降、ツイートを増やしても意外と規制されずに済んでいました。
ですが、とうとう今日は規制されましたw
　：
規制基準は以前の通り3時間であると仮定しています。
ツイートが復帰してからいくつかツイートしてますが、３時間の基準の位置で、300ツイートぐらいになっています。
ということで、おそらく300ツイート/3時間なのだろうと思います。
以前の[127ツイート/3時間](http://ltzz.info/alpha/twitter_kisei.html "投稿規制の仕様 http://ltzz.info")に比べると倍以上ですね。
ということで、だいたいのひとは予備垢も要らなくなってるんじゃないでしょうか。
[ツイート規制値は300ツイート/3時間（ソチ五輪以降 - 別館 子子子子子子（ねこのここねこ）](http://d.hatena.ne.jp/riocampos+tech/20140413/twitter_restrict_up_to_300tweets_per_3hours)

推測の根拠など詳細は上記ブログをご確認ください。（4/13付けなので、書いてから一か月ほど過ぎてますね。）

##Twitter公式の規制情報との整合は
>2400ツイート/日。半時間単位での細かな制限あり。公式RTはツイートとして数える。
>>Tweets: 2,400 per day. The daily update limit is further broken down into smaller limits for semi-hourly intervals. Retweets are counted as Tweets.
[Twitter Help Center | Twitter limits (API, updates, and following)](https://support.twitter.com/entries/15364-about-twitter-limits-update-api-dm-and-following)

>これを素直に読むと
「2400ツイート/日？300ツイート/3時間に合ってるけど、つまり50ツイート/半時間の制限だよね？」
と理解すると思いますよね。
でも、上記ツイートデータのうち295～142（逆順で見ます）で1時間なんですね、つまりこの1時間に約150ツイートしています。次の1時間は141～6なのでやはり約140ツイート。
いずれにせよ半時間50ツイートなんて超えまくっています。なので[3時間セクション説](http://ltzz.info/alpha/twitter_kisei.html "投稿規制の仕様 http://ltzz.info")は未だ有効であろうと思われます。
[ツイート規制値は300ツイート/3時間（ソチ五輪以降 - 別館 子子子子子子（ねこのここねこ）](http://d.hatena.ne.jp/riocampos+tech/20140413/twitter_restrict_up_to_300tweets_per_3hours)