OmniAICreator/Qiita-1.07M huggingface dataset:
Heroku CLI に hk を使う。


# hkとは
Herokuをコマンドラインから操作するためのツールで、Heroku Toolbeltよりも高速っぽいです。  
（Goで実装されている ※ beta版)

# インストール
```
$ L=/usr/local/bin/hk && curl -sL -A "`uname -sp`" https://hk.heroku.com/hk.gz | zcat >$L && chmod +x $L
```
めずらしい配布方法だなぁと思いつつ、これですんなりインストールできます。  
> Go言語ではクロスコンパイルがとても簡単で，複数プラットフォーム向けのバイナリをつくってそれを配布するというのがさらっとできる．

とのことで、[HerokuとGithubを使った統一的なツール配布](http://deeeet.com/writing/2014/08/07/github-heroku-dist/) でとてもわかりやすく解説されています。

# 使い方
```
$ hk -h
Usage: hk <command> [-a <app or remote>] [options] [arguments]


Commands:

    create             create an app
    apps               list apps
    dynos              list dynos
    releases           list releases
    release-info       show release info
    rollback           roll back to a previous release
    addons             list addons
    addon-add          add an addon
    addon-destroy      destroy an addon
    scale              change dyno quantities and sizes
    restart            restart dynos
    set                set env var
    unset              unset env var
    env                list env vars
    run                run a process in a dyno
    log                stream app log lines
    info               show app info
    rename             rename an app
    destroy            destroy an app
    domains            list domains
    domain-add         add a domain
    domain-remove      remove a domain
    version            show hk version
    orgs               list Heroku orgs
    ssl                show ssl endpoint info
    ssl-cert-add       add a new ssl cert
    ssl-cert-rollback  add a new ssl cert
    ssl-destroy        destroy ssl endpoint


Run 'hk help [command]' for details.


Additional help topics:

    commands  list all commands with usage
    environ   environment variables used by hk
    plugins   interface to plugin commands
    more      additional commands, less frequently used
    about     information about hk (e.g. copyright, license, etc.)
```
大抵のことできそうです。

# どんくらい速いのか
公式のとこにもあるけど、自分の環境でも計測してみます。

```
$ time heroku apps >/dev/null
heroku apps > /dev/null  1.24s user 0.12s system 25% cpu 5.255 total

$ time hk apps >/dev/null
hk apps > /dev/null  0.09s user 0.02s system 10% cpu 1.088 total
```

速い！


golang興味あるので、この機会にやってみたい。

# 追記

https://blog.heroku.com/evolution-of-heroku-cli-2008-2017

hk (Go) で書かれていたものは、Heroku CLI(v4) で正式に採用（一部Node.js）されたが、ネットワークやクロスコンパイルなどの問題で、今(CLI v6)は　Pure Node.js　で実装されている。



# 参考・引用
- https://github.com/heroku/hk
- HerokuとGithubを使った統一的なツール配布 | SOTA : http://deeeet.com/writing/2014/08/07/github-heroku-dist/
importするだけで使えるgolang製kvsのboltdb

# 概要

golang製kvsの[boltdb](https://github.com/boltdb/bolt)の紹介です。
[LMDB](http://symas.com/mdb/)のgolang portです。(完全に同じではありません)

# boltdbとは

* 別プロセスを立てること無くgolangのプログラムからImportするだけで使えるkvsです。
 * kvsなのでRDBが必要な場合はsqliteのamalgation code等を使うと良いと思います。
 * 単一プロセス内に閉じるシンプルな構造のため、レプリケーション/シャーディング等は機能としてはサポートされていません。
* ACID/MVCCをサポートします。
* トランザクション
 * writeとreadのトランザクションが別物でreadとwriteは相互にブロックすることはありません。
 * readは並列実行可能かつ非常に高速です。
 * writeは常に直列化されるため、デッドロックが起こり得ません。
 * 各goroutineでトランザクションを生成する限りスレッドセーフです。(トランザクション自体を複数のgoroutineで共有するのはNG)
* まだベータ版です。

# 使い方

## get & import

```
go get github.com/boltdb/bolt
```

```
import "github.com/boltdb/bolt"
```

## open db

```
	db, err := bolt.Open("/path/to/datafile", 0600, nil)
	if err != nil {
		log.Fatal(err)
	}
	defer db.Close()
```

Openの第一引数はデータ書き込み先のファイルです。
存在しない場合は作成されます。
複数のプログラムからの書き込みはできません。

## write transaction

```
	db.Update(func(tx *bolt.Tx) error {
		bucket, err := tx.CreateBucketIfNotExists([]byte("my_bucket"))
		if err != nil {
			log.Fatal(err)
		}
		err = bucket.Put([]byte("key"), []byte("value"))
		if err != nil {
			log.Fatal(err)
		}
		return nil
	})
```

## read transaction

```
	err = db.View(func(tx *bolt.Tx) error {
		bucket := tx.Bucket([]byte("my_bucket"))
		if bucket == nil {
			log.Fatal("bucket not found")
		}
		value := bucket.Get([]byte("key"))
		fmt.Println(string(value))
		return nil
	})
```

シンプルな使い方はこんなところです。
Iterationやrange scan、BackUp等もできますので公式ページを見てもらえればと思います。

# 追記

[こちら](http://qiita.com/yamasaki-masahide/items/4befc39675818cfdbc95)にleveldb版がアップされました。
さくらのBASE Storageで楽曲管理を考える (1)

# 目的

+ クラウドストレージに曲を置いて再生できるようにしたい！

+ 「[さくらのベースストレージの無料期間が伸びた](http://blog.halpas.com/archives/4516?utm_source=oldmysite&utm_medium=website&utm_campaign=sakura)そうな。
**2015/02/28まで無料！** これは使ってみるしかねぇ！

# 対象者

+ 楽曲数が多すぎて普通のクラウドストレージに置けない人
+ 何となく可逆圧縮で保存したい人
+ HDDの容量が不安な人

# 楽曲管理の課題

## 容量
曲が沢山あると、普通のクラウドストレージには置けなくなります（10GBも無い人はBOXとか、もっと少ない人はDropboxに置くといいのでは）。
かと言って、曲を選別してそれだけ置くのもなんかめんどくさい。

## 形式
可逆圧縮で保存していると、容量が圧倒的に増える上、再生できるプレイヤーも限られてきます。
HTML5のAudioも、flacに対応してはいるもののブラウザが非対応だったり。
ちなみに自分はWavPackを愛用しています。

# さくらのBASE Storageとは

Amazon S3と一緒。
ざっくり言えば、容量無制限のファイル置き場。
普通は従量課金ですが、さくらのはβ版なのでどうやら使いたい放題の模様。
Amazon S3用のツール＆情報が使えるので楽です。

# 解決策

とりあえず単純な方法を試してみました。

1. さくらのBASE Storageβ に曲を置く
2. s3fsでマウント
3. SubSonicでストリーミング

以上です。簡単ですね。

ちなみに、この方法ではストリーミングする時にmp3に変換される（はず）ので、可逆圧縮の音質のまま外で楽しみたい！なんていう高度なことはできません。
ガチで聞きたいときは、マウントした曲を手元に持ってくるなりして再生しましょう。

# 手順

## 1. さくらのBASE Storageβ に曲を置く

1. [アカウントを作ります。](http://storage.sakura.ad.jp/)電話番号が必須です。
2. [CrossFTP](http://www.crossftp.com/)などでアップロードします。

FPTの設定は、S3/HTTPSで、ホストはb.storage.sakura.ad.jp、Access Keyはアクセストークンのユーザ名、Secretはトークンです。

以上。この辺は適当です。

## 2. s3fsでマウント

Linux環境が無い人は、VMWare Playerとかで作りましょう。
今回はUbuntu 14.04を新規インストールした前提で進めます。

### 必要なソフトウェアのインストール

```bash
$ sudo apt-get install git
$ sudo apt-get install build-essential libcurl4-openssl-dev libxml2-dev mime-support autotools-dev automake
$ sudo apt-get install libfuse-dev
```

（もしかしたら足りないかもしれないので、適宜インストールしてください）

### s3fsのインストール

```bash
$ git clone https://github.com/s3fs-fuse/s3fs-fuse.git
$ cd s3fs-fuse
$ ./autogen.sh
$ ./configure
$ make
$ sudo make install
```

### s3fsのアクセス設定

トークンを設定してアクセスできるようにします。
FTPの時に使ったアレです。
ユーザ名とトークンをコロン（:）で区切っただけのファイルを用意します。

```bash
$ vi ~/.passwd-s3fs
username:token
$ chmod 600 ~/.passwd-s3fs
```

### マウント

~/s3にマウントします。
なお、s3fsによるマウントは、1ユーザー専用になるらしく、なにもしないとrootしかアクセス出来ない厳しいフォルダになります。
そのため、アクセスしたい人のuidとgidを指定してあげないといけません。
以下のコマンドでは、uidもgidも1000だと仮定します。

また、use_cacheを指定するとキャッシュしてくれて少しアクセスが早くなります。

```bash
sudo s3fs fortest /mnt/s3 -o url=https://b.storage.sakura.ad.jp -o allow_other -o use_cache=/tmp -o uid=1000 -o gid=1000
```

終わったら、アップロードしたものが見える化確認しましょう。

## 3. SubSonicでストリーミング

[公式ドキュメント](http://www.subsonic.org/pages/installation.jsp#debian)の通りに入れます。
Javaは7にしときます。

Web上のプレイヤーを有効にするため、Flashも入れます。

```bash
$ sudo apt-get install openjdk-7-jre
$ wget （sourceforge上subsonicのアドレス）
$ sudo dpkg -i （落としたやつ）
$ apt-get install flashplugin-installer
```

後は、Subsonicで曲の場所を指定すれば再生できます。

# 今後の展望

ここまでで大体のファイルはlocalhostでストリーミング再生されました。
さらに色々したい方は…

+ どこでも聞きたい方は、自分のサーバーで上記セットアップをして、外からアクセスできるようにしましょう。
認証を掛けて自分だけアクセスできるようにした方が、著作権云々的に良いと思います。
+ WavPackなど他の形式もストリーミングしたい！という方は、SubSonicの設定にあるので追加してみてください。
+ マウントしたファイルをWindowsで再生したい！という方は、sambaとかでアクセスできるように設定。

自分はとりあえず、ホストWindows、ゲストUbuntuのVMWareで

+ 普段はSubSonic上で再生
+ 好きな曲はsamba経由のアクセスでAIMP

しつつ調査してゆきたいと思います。
きっと(2)を書くと思ってタイトルに(1)を付けていますが、(2)は無いかも…。

（Windowsで直接マウントできたら、ストリーミングしなければすぐやん…）
【VC++】OCIを使ってOracle DBに接続するコード

ブログに書いたよ。
<a href="http://replication.hatenablog.com/entry/2014/08/23/222821">【VC++】OCIを使ってOracle DBに接続するコード書いたよ。 - 小さい頃はエラ呼吸</a> <a href="http://b.hatena.ne.jp/entry/replication.hatenablog.com/entry/2014/08/23/222821"><img src="http://b.hatena.ne.jp/entry/image/http://replication.hatenablog.com/entry/2014/08/23/222821" alt="はてなブックマーク - 【VC++】OCIを使ってOracle DBに接続するコード書いたよ。 - 小さい頃はエラ呼吸" border="0" /></a>
Raspberry Piでcronを使った時の話し

rubyで作ったプログラムをcronで実行したところ、うまく動作しなかったのでログを確認したところ、以下のエラーメッセージが出力されていた。
ちなみに、cronのログは/var/log/syslogにある。

```
Aug 23 22:12:04 raspberrypi /USR/SBIN/CRON[2331]: (CRON) info (No MTA installed, discarding output)
```

Raspberry PiではデフォルトでMTAがインストールされていないらしく、postfixをインストールして無事解決。

```
$ sudo apt-get install postfix
```

＃cronが動かなかったのは恥ずかしいぐらい初歩的な理由なので略…
Twitterでブロックしているユーザーを表示する

Groovyにはdo while構文がないようなのでちょっと無駄な部分もあるが、こんな感じで取れる。

```groovy
@Grab('org.twitter4j:twitter4j-core:4.0.2')
import twitter4j.TwitterFactory

def show(blockingUsers) {
    blockingUsers.each {
        println "${it.id}\t${it.screenName}\t${it.name}"
    }
}

def tw = TwitterFactory.singleton

def cursor = -1
def blockingUsers = tw.getBlocksList(cursor)

show(blockingUsers)
while (blockingUsers.hasNext()) {
    cursor = blockingUsers.nextCursor
    blockingUsers = tw.getBlocksList(cursor)
    show(blockingUsers)
}
```
Rubyでヒアドキュメントを使う


プロダクションコードでヒアドキュメントを使うことはあまり無いかもしれないけど、文字列やJSONデータを扱いたいちょっとしたサンプルコードを書くときによく使うのでメモ。

### 1. 基本
「<<」識別子を使う。「<<」識別子の後ろにヒアドキュメントの始まりと終わりを示す文字列の識別子を書く。
EOS（End Of String）とEOL（End Of Line）が使われている例が多いが、統一されていれば何を使っても問題ない。

```ruby
json = <<'EOS'
{
  "language": "Ruby"
}
EOS
```

### 2. 変数・定数の展開をする場合
ヒアドキュメントの始まりと終わりを示す識別子をダブルコーテーションで囲うか、コーテーション無しの識別子を使う。あとは通常の展開記法を用いればOK。
シングルコーテーションを使うと展開されない。

```ruby
lang = 'language'
RUBY = 'Ruby'

json = <<"EOS" # ここをダブルコーテーションで囲う
{
  "#{lang}": "#{RUBY}"
}
EOS

json = <<EOS # コーテーション無しでもOK
{
  "#{lang}": "#{RUBY}"
}
EOS
```

### 3. 「<<-」演算子を使ってインデントを行う
「<<」の代わりに「<<-」を使うと、終端の識別子をインデントすることができる。

```ruby

def output
  json = <<-"JSON"
{
  "language": "Ruby"
}
  JSON  
  # ここのインデントを調整できる

  puts json
end

output
```

「<<」演算子だと以下のようにしかできない。

```ruby
def output
  json = <<"JSON"
{
  "language": "Ruby"
}
JSON 
# かならず行頭に識別子が無くてはならない

  puts json
end

output
```
NAOqi OSとは

NAOqi OSとは
==============

GentooをベースとしたGNU/Linuxのディストリビューションである。とのことです。
なので、それほど面白いことはないですが、その設定等見てみましょう。

https://community.aldebaran.com/doc/2-1/dev/tools/opennao.html

アカウント
===============

以下のような初期アカウントがあります。rootでのsshはデフォルトで出来ません。
なかなか危険なユーザ・パスワード名です。

|User | Password|
|:----|:--------|
|nao  | nao     |
|root|root|

sudo
---------
sudoは以下のシャットダウンのコマンドのみ許可されています。他のことするときはrootになってください。

```bash
$ sudo shutdown -h now
```

ファイヤーウォール
====================
NAOqi OSは２つのファイヤーウォールモードがあります。

- development: 全デバイス全ポートオープン
- production: 基本全ポートクローズ。有線LANのsshのみ許可。

デフォルトはdevelopmentで、これを切り替えるコマンドが用意されています。

切り替え
--------

```bash
$ /etc/init.d/firewall_mode production
$ /etc/init.d/firewall_mode development
```

状態確認
----------
```bash
$ /etc/init.d/firewall_mode show
```

デフォルトの変更
--------------
以下のコマンドにより、現在の状態がデフォルトとして保存され、次回ブート時に使われます。

```bash
$ /etc/init.d/firewall_mode save
```
Raspberry Pi に fluentd をインストールする


Raspberry Pi (raspbian) に fluentd をインストールして upstart で自動起動するように設定する。


## fluentd 事前設定

[Fluentdインストールの前に | Fluentd](http://docs.fluentd.org/ja/articles/before-install) に従って設定する。

### ファイルディスクリプタの設定

ファイルディスクリプタを確認する。

```bash:Pi
$ ulimit -n
1024
```

`/etc/security/limits.conf` に以下を追加して `1024` から `65536` に変更する。

```/etc/security/limits.conf
root soft nofile 65536
root hard nofile 65536
* soft nofile 65536
* hard nofile 65536
```

再起動して反映させる。

## fluend インストール

Raspbian デフォルトの ruby-1.9.3 を使って gem 版をインストールする。
C で書かれている部分があるせいか、`ruby-dev` も必要な模様。

```bash:Pi
$ ruby -v
ruby 1.9.3p194 (2012-04-20 revision 35410) [arm-linux-eabihf]
$ sudo apt-get install ruby-dev
$ sudo gem install fluentd --no-ri --no-rdoc
```


動作確認する。

```bash:Pi
$ fluentd --setup ./fluent
$ fluentd -c ./fluent/fluent.conf -vv &
$ echo '{"json":"message"}' | fluent-cat debug.test
```

fluentd の標準出力に `debug.test: {"json":"message"}` が表示されればOK。

## fluentd 自動実行設定

今回は upstart を使ってみる。

### upstart インストール

```bash:Pi
$ sudo apt-get install upstart
```

sysvinit を削除するので確認メッセージがでるが指示どおりにタイプする。
インストールできたらシステムを再起動する。

### fluentd セットアップ

`/etc/fluent` に fluentd の設定ファイルを置く。

```bash:Pi
$ sudo mkdir /etc/fluent
$ sudo fluentd --setup /etc/fluent
Installed /etc/fluent/fluent.conf.
```

fluentd 用のユーザとグループを作成する。

```bash:Pi
$ sudo groupadd fluentd
$ sudo useradd -g fluentd -s /bin/false -M fluentd
```

### fluentd 用 upstart 設定ファイル作成

`/etc/init/fluentd.conf` を以下のようにする。

```/etc/init/fluentd.conf
description "fluentd upstart script"

start on (local-filesystem and net-device-up)
stop  on shutdown

respawn
respawn limit 5 60

script
  exec sudo -u fluentd /usr/local/bin/fluentd -c /etc/fluent/fluent.conf
end script
```

### fluentd 起動

```bash:Pi
$ sudo start fluentd
```

fluentd の起動確認と動作確認をしておく。

```bash:Pi
$ sudo status fluentd
fluentd start/running, process 1318
$ echo '{"json":"message"}' | fluent-cat debug.test
$ sudo tail -f /var/log/upstart/fluentd.log
```

`/var/log/upstart/fluentd.log` が fluentd の標準出力になっている模様。
`debug.test: {"json":"message"}` が出力されていればOK。

## 参考

- [Fluentdインストールの前に | Fluentd](http://docs.fluentd.org/ja/articles/before-install)
- [Ruby GemからFluentdをインストールする | Fluentd](http://docs.fluentd.org/ja/articles/install-by-gem)
- [Raspberry PiでFluentdを立ち上げてTDにデータを流してみた話 - komamitsu.log](http://komamitsu.hatenablog.com/entry/2014/02/16/032711)
- [strix01: [fluentd] nginxのアクセスログをfluentdからmongodbに!](http://strix01.blogspot.jp/2013/07/fluentd-nginxfluentdmongodb.html)
iOS アプリに Google Analytics を導入する(2014/08 時点)


# はじめに

iOS アプリに Google Analytics を導入しようとしたんですがオフィシャルサイトのドキュメントが古いようでしたのでここにまとめておきます。

https://developers.google.com/analytics/devguides/collection/ios/v3/

対象バージョン
Google Analytics iOS 3.09


# ダウンロード

ここから。

https://developers.google.com/analytics/devguides/collection/ios/resources

# ファイルをプロジェクトに追加

ダウンロードした zip ファイルを解凍し、GoogleAnalytics/Library 以下にある .h ファイルと、libGoogleAnalyticsServices.a, libAdIdAccess.a をプロジェクトに追加します。

![Screen Shot 2014-08-23 at 20.03.20.png](https://qiita-image-store.s3.amazonaws.com/0/27210/c1dadf93-cf52-5b5b-a7ed-62838d08fb0d.png "Screen Shot 2014-08-23 at 20.03.20.png")


# 関連するライブラリ・フレームワークをリンクする。

「プロジェクト」→「General」で必要なライブラリ、フレームワークを追加してください。必要なものは下記の通り。

![Screen Shot 2014-08-23 at 10.11.29.png](https://qiita-image-store.s3.amazonaws.com/0/27210/df489422-78c5-08e5-3a82-1232aebf3a8c.png "Screen Shot 2014-08-23 at 10.11.29.png")

# Google Analytics で tracking ID を取得

手順はここを参考にしました。

https://support.google.com/analytics/answer/1042508

# 設定を行う

アプリ起動時に Google Analytics の設定をします。

```XXXAppDelegate.m
#import "GAI.h"

@implementation XXXAppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // Optional: automatically send uncaught exceptions to Google Analytics.
    [GAI sharedInstance].trackUncaughtExceptions = YES;
    
    // Optional: set Google Analytics dispatch interval to e.g. 20 seconds.
    [GAI sharedInstance].dispatchInterval = 20;
    
    // Optional: set Logger to VERBOSE for debug information.
    [[[GAI sharedInstance] logger] setLogLevel:kGAILogLevelVerbose];
    
    // Initialize tracker. Replace with your tracking ID.
    [[GAI sharedInstance] trackerWithTrackingId:@"UA-your-trackingid"];
    
    // Enable IDFA collection.
    id<GAITracker> tracker = [[GAI sharedInstance] defaultTracker];
    [tracker setAllowIDFACollection:YES];
}

```

# 計測したい部分にコードを埋め込む

Google Analytics ではユーザーが特定の操作をした時や、ある画面に遷移した時などを記録できます。ここではある画面に遷移した時を記録する例を挙げます。

## GAITrackedViewController を継承

GAITrackedViewController を継承した ViewController を用意します。

```XXXViewContrller.h
#import "GAITrackedViewController.h"

@interface XXXViewContrller : GAITrackedViewController 

@end
```

viewWillAppear の中で screenName に ViewController を識別するための文字列を指定します。ViewController のクラス名を使うのがコードの使い回しもできてお勧めです。

```XXXViewContrller.m
- (void)viewWillAppear:(BOOL)animated{
    [super viewWillAppear:animated];
    self.screenName = [NSString stringWithFormat:@"%@", NSStringFromClass([self class])];
}

```

# レポートで確認する

これで埋め込み作業は完了です。アプリを起動して操作したら Google Analytics のレポート画面で見てみましょう。リアルタイムの項目で情報が表示されていると思います。

https://www.google.com/analytics/web/#home/
Titanium Alloy で underscore.js の debounce を使うと Android でコケる対策


Titanium Alloyプロジェクトで onClick とかに _.debounce 使いたいんですけど、AndroidがちょくちょくException吐いてしまいます。

```Exception
V8Exception: Exception occurred at ti:/bootstrap.js:134: Uncaught Error: Invalid value, expected type Number
```

私が試したのは Titanium SDK 3.3.0だけど、3.1.0の頃だからだいぶ前からの様です。
https://jira.appcelerator.org/browse/TIMOB-14213


悲観にくれる私。

<blockquote class="twitter-tweet" lang="ja"><p>えー。Titanium 3.3.0 + Android で underscore.js の debounce 使えないのかー。&#10;&#10;<a href="https://t.co/WCAYTWi34i">https://t.co/WCAYTWi34i</a></p>&mdash; Tadatoshi Hanazaki (@hntn) <a href="https://twitter.com/hntn/statuses/503078729212375041">2014, 8月 23</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

不貞腐れてプログラム作るのやめて息子の本棚作り出したその時です。



<blockquote class="twitter-tweet" lang="ja"><p><a href="https://twitter.com/hntn">@hntn</a> ていうか、alloy.jmkで内包するunderscoreをlodashに書き換えればOK</p>&mdash; Kosuke Isobe (@k0sukey) <a href="https://twitter.com/k0sukey/statuses/503087564597641216">2014, 8月 23</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>


なんという事でしょう。
lodash を使えば万事解決との事です。

```
npm install lodash
```
して、

```
___PROJECT_DIR___/app/assets/javascript/lodash.underscore.js
```

にコピーして、

[先人の教え](https://gist.github.com/k0sukey/8466596) に従い、alloy.jmkを編集しpost:compileに追記すればOKです。


[@k0sukey](https://twitter.com/k0sukey) さん有難う御座います。
ますますアバター怖くなってきてますけど僕は大丈夫です。
アプリケーションバンドル内のスクリプトのパスを得るには

# 背景

node-webkitやAtom Shellでやった方が実用的な気がするが、node.jsのスクリプトをOSXのアプリケーションとして動かす方法を試行錯誤していた際に、アプリケーションバンドル内に置いたスクリプトのパスを取得する必要があった。

# アプリケーションバンドルを作る

```
echo ""|osacompile -o foo.app
```

エントリーポイント？の実行ファイルをシェルスクリプトに書き換える
```
cp /dev/null> foo.app/Contents/MacOS/applet
atom foo.app/Contents/MacOS/applet
```

appletの変更後の内容

```bash
#!/bin/sh

echo "Hello Qiita!"|/usr/bin/open -f
```

ここで、シェバングを綴り待ち得るとPowerPCはもうサポートしてないとか
意味不明なメッセージがもらえた。

# 俺はnode.jsを動かしたい！

しかもnodebrewの設定を活かして使いたい！

## bashの-lオプションで行けた

nodeを動かす場合のappletファイルの内容

```bash
#!/bin/sh
bash -l -c 'node -e console.log\(\"Qiita\",process.version\) 2>&1'|/usr/bin/open -f
```

# アプリケーションバンドル内のスクリプトのパスの取得

Bシェル系は${0}で自身のパスが取得出来るそうで、以下のように取得できる。

```bash
#!/bin/sh

# ${0} の dirname を取得
cwd=`dirname "${0}"`

# ${0} が 相対パスの場合は cd して pwd を取得
expr "${0}" : "/.*" > /dev/null || cwd=`(cd "${cwd}" && pwd)`

# jsのパスはcwdを基準に相対パス指定
jsPath="$cwd/../Resources/Scripts/test.js"

cmd="node $jsPath 2>&1"
bash -l -c "$cmd"|/usr/bin/open -f
```

# Link

- [ShellScript - シェルスクリプト自身のパス取得 - Qiita](http://qiita.com/bsdhack/items/29400b9ed989cd67b1db)
- [MacOSX - 2ステップでシェルスクリプトをOS Xアプリケーションに - Qiita](http://qiita.com/mattintosh4/items/83e1540c31c803c3fd5e)
Macでcronを使う時の注意点


##crontabを設定
`$ crontab -e`

ここに書く。

```crontab

*/10 * * * * /Users/ユーザー名/Desktop/script.sh 

```
**絶対パスで指定する。**

##シェルスクリプトでの注意点

####実行のコマンドやディレクトリ等も絶対パスでかく。
ターミナルで何気なく使っているコマンドをcrontabにそのまま設定するとcommand not found で実行されないことがある。  
crontabの環境変数は/`usr/bin`と`/bin`なのでその中のコマンドは絶対パスで書かなくてもいいが、その他ウェブから落としてきたアプリケーションは`/usr/local/bin/`の中にあることが多いのでそのコマンドを使いたい時は絶対パスで書くか環境変数に`/usr/local/bin/`を追加する必要がある。

crontabの環境変数確認方法

```crontab
* * * * * echo "$PATH" > /Users/ユーザー名/Desktop/path
```

`$ tail /Users/ユーザー名/Desktop/path`

crontabに環境変数を出力するスクリプトを設定し、確認。

####コマンドのパス確認方法
`$ which コマンド名`


####設定されているcrontab一覧
`$ crontab -l`

エラーや出力がある時などは`You have mail in /var/mail/ユーザー名`と出るのでそのファイルを見ると確認できる。

`$tail /var/mail/ユーザー名`
Dockerのインストールで嵌ったこと


さくらのVPS上のCentOS6.5にdocekrを入れるべく下記サイトを参考にインストールしたものの

[これから始める「DockerでかんたんLAMP環境 for CentOS」 - さくらのナレッジ](http://knowledge.sakura.ad.jp/tech/1811/)

```bash
docker run
```

がこける。

```bash
docker -d
```

するよう言われるのですると

```
Error running DeviceCreate (createPool) dm_task_run failed
```

のエラー。

[Docker Install: Error running DeviceCreate (createPool) dm_task_run failed · Issue #6325 · docker/docker](https://github.com/docker/docker/issues/6325)

とか見て色々やってみるも変わらず。

# 再起動しなきゃダメ

また色々調べて以下の記事を見つける。

>上記までは、リブートなしで実行可能です コンテナ操作にはリブートが必要なようです
*via [Docker_log - おもに Linux まとめ](http://omomemo.wiki.fc2.com/wiki/Docker_log)*

そんなこと・・・orz

再起動してdocker run →　できた(ﾉД`)
Unityでシンプルな頂点アニメーション

ゲームオブジェクトをアニメーションするわけではなく
頂点をアニメーションさせてみました。

以下のスクリプトを入れるとPlaneが左右に動きます。
![スクリーンショット 2014-08-23 18.07.11.png](https://qiita-image-store.s3.amazonaws.com/0/38279/46b0e10b-1e3b-e913-975c-2719ba7d4ac8.png)

```csharp:VertexAnimSimple
using UnityEngine;
using System.Collections;

public class VertexAnimSimple : MonoBehaviour {
	private int i = 0;

	MeshFilter _meshFilter;
	Vector3[] _defaultVertices;
	Mesh _mesh;

	float _scale=8;
	float _animationTimerDeno=1;

	float _animationTimer;

	void Awake()
	{
		_mesh = GetComponent<MeshFilter> ().mesh;
		_defaultVertices = _mesh.vertices;
	}

	void Update()
	{
		Vector3[] vertices = _mesh.vertices;

		_animationTimer += Time.deltaTime;
		if (_animationTimer > _animationTimerDeno) {
			_animationTimer -= _animationTimerDeno;
		}
		float rate = _animationTimer / _animationTimerDeno;
		float amp = 0.5f * (Mathf.Sin (Mathf.PI * 2.0f * (rate)) + 1.0f);

		for (i = 0; i <= 120; i++) {
			vertices [i].x = _defaultVertices [i].x + _scale * amp;
			//vertices [i].y = _defaultVertices [i].y + _scale * amp;
			//vertices [i].z = _defaultVertices [i].z + _scale * amp;
		}

		_mesh.vertices = vertices;
		_mesh.RecalculateBounds ();   
	}

}
```

応用するとグリッジアートぽい
こういうアニメーションになります。
https://www.youtube.com/watch?v=RiBKeTDI084
Nice tips about rails


Add a column in a migration and populate it immediately after. 
`reset_column_information`

**Example**

```ruby
	class AddNameToUser < ActiveRecord::Migration
  		def self.up
    		add_column :users, :name, :string
    		User.reset_column_information
    		User.find(:all).each do |user|
      			user.name = user.first_name + ' ' + user.last_name
    		end
    		remove_column :users, :first_name
    		remove_column :users, :last_name
		end
  	end
```

---
Project Eulerをhaskellで練習していく日記: Problem 28

#問題
以下のように中心に１を置き、右回りで2,3,...と数字を置いていく。
![p28.png](https://qiita-image-store.s3.amazonaws.com/0/50542/db10fb61-715a-1c93-b81f-348ec1406173.png)
５ｘ５の正方形になった時点で、赤く示した対角成分の数の和は101となっている。

同様に、この正方形を1001x1001まで巻いていった場合、対角成分の数の和はいくつになるか？
#回答
一巻きすると、1->3->7->9と2ずつ増加する。
次の一巻きでは、9->13->17->21->25と4ずつ増加する。
同様にn巻き目では2*nずつ４回増加する。
正方形が1001x1001になった時点では500巻き目なので、こうして構成した増加していく数列の和を求めることにする。

```hs
-- 一巻きするときの増分の列
zoubun :: [[Int]]
zoubun = [replicate 4 n|n<-[2,4..]]

main = do
     print $ foldl1 (+) $ scanl (+) 1 $ concat $ take 500 zoubun
```
#感想
増分のルールを見いだすのがちょっとややこしいが、ここまでの他の問題に比べれば簡単なほうかも。
最近、別投稿のコメントで教えてもらったscanl関数が早速役に立ちました。
Project Eulerをhaskellで練習していく日記: Problem 27

#問題
オイラーは以下の驚くべき二次式を見いだし、
n^2 + n + 41
これがn=0〜39まで全て素数となることを発見した。
n=40 の場合、40^2 + 40 + 41 = 40*(40 + 1) + 41となり、これは41で割り切れる。
また、n=41の場合、41^2 + 41 + 41も41で割り切れる。

また、
n^2 − 79n + 1601
は n=0〜79まで全て素数となる。
この時、この二次式の係数の積は、(-79) * 1601 = −126479 となる。

以下の二次式で、
n^2 + an + b, where |a| < 1000 and |b| < 1000
n = 0から始めて１ずつ増やしていくとき、連続で最も多く素数を生成するa,bの積を求めよ。
#回答
```hs
import qualified List as L

-- 式 n^2+a*n+bで、b<0にすると、n=0の時に負の値になり素数とは言えない。したがって、b>0としてよい。
-- またn=0でも素数になることを考えると、bは素数。        
-- またn=1でも奇素数になることを考えると、aは奇数。

-- 素数判定
isprime x
 | x<2 = False
 | otherwise = all (\y->x `mod` y/=0) [2..truncate $ sqrt $ fromIntegral x]

-- a,bを与えて、何個まで素数を生成できるかを数える関数
numofprimes a b = length $ takeWhile (\x->isprime (snd x)) $ L.sort [(n,n^2+a*n+b)| n<-[0..b-1]]

-- a,bを与えて、高々何個まで素数を生成できるかを返す関数
ubound a b = if b-a>0 then min (abs b) (b-a)
                       else abs b

-- a,bの組の列を受け取って、最多の素数を生成するa,bを求める関数
-- 引数は「それまでの最大個数」「その最大を得たa,bの組」「(a,b)の列」
findmax u p [] = (fst p)*(snd p)
findmax u p (c:cs) = if ub<u then findmax u p cs
                             else let n = numofprimes a b in
                                  if u<n then findmax n c cs
                                         else findmax u p cs

                       where a = fst c
                             b = snd c
                             ub = ubound a b

main = do 
     print $ findmax 0 (0,0) [(a,b) | a<-[-999..999], b<-[42..999], odd a, isprime b]
```
#感想
探索するa,bの範囲をそれぞれ、奇数と素数に限定することで十分速くなりました。
_xcstestユーザをOS Xのログインウィンドウから隠す


Xcodeを5.1にアップグレードしたところ、OS Xのログインウィンドウに「_xcstest」なるユーザが出現した(最近のXcode 6や7では_xcstestユーザが再び消えたみたいですが…)ので調べてみると、以下のページが出てきました。

* [Mavericks - strange hidden account: Apple Support Communities](https://discussions.apple.com/message/23668187#23668187)

「_xcstest」ユーザをログインウィンドウで選択できるようにする意味はないのでなんとか隠せないか調べると、Appleによる以下のページが出てきました。

* [How to hide a user account in OS X](http://support.apple.com/kb/HT5017)

そこで、以下のコマンドで_xcstestをログインウィンドウなどから隠しました。

    chariot:~ h12o$ sudo defaults write /Library/Preferences/com.apple.loginwindow HiddenUsersList -array-add _xcstest
    Password:
    chariot:~ h12o$ 

元に戻したい場合は以下のようにします。

    chariot:~ h12o$ sudo defaults delete /Library/Preferences/com.apple.loginwindow HiddenUsersList
    Password:
    chariot:~ h12o$
先頭の大文字小文字を維持して文字列置換する方法


NSRegularExpressionを用いると文字列の検索、置換が容易にできます。しかし、以下のように置換される文字列の先頭の大文字小文字の別を維持したまま置換することは正規表現だけでは難しいです。
>hogeをpoiに置換
>hoge -> poi
>Hoge -> Poi

この処理を拙作Arrow Noteに実装したので、コードを公開します。

```objc:Objective-C
-(NSString*) replaceString:(NSString*)search with:(NSString*)replace in:(NSString*)text
{
    NSRegularExpression *regex
     = [NSRegularExpression regularExpressionWithPattern:search
                            options:NSRegularExpressionCaseInsensitive
                            error:nil];
    NSMutableString *target = [[NSMutableString alloc]
                               initWithString:text];
    NSTextCheckingResult *r = [regex firstMatchInString:target
                                     options:0
                                     range:NSMakeRange(0, target.length)];
    while (nil != r && NSNotFound != r.range.location) {
        NSString *src = [target substringWithRange:r.range];
        NSString *rep = [regex replacementStringForResult:r
                               inString:target
                               offset:0
                               template:replace];
        if (0 < src.length && 0 < rep.length
            && isupper([src characterAtIndex:0])) {
            rep = [[NSString alloc] initWithFormat:@"%c%@",
                                    toupper([rep characterAtIndex:0]),
                                    [rep substringFromIndex:1]];
        }
        [target replaceCharactersInRange:r.range withString:rep];
        NSUInteger nextPos = r.range.location + rep.length;
        r = [regex firstMatchInString:target
                   options:0
                   range:NSMakeRange(nextPos, target.length - nextPos)];
    }
    return target;
}

```
[MySQL]インデックスによるチューニング〜ログ出力、EXPLAIN、インデックス〜

# 1.ログ出力
## 1-1.スロークエリログ（slow_query_log）
MySQLの設定は`/etc/my.cnf`に記述する。

```
vim /etc/my.cnf
```

`/etc/my.cnf`ファイルに以下の設定をする。

```
[mysqld]
slow_query_log = 1 #スロークエリログ出力有効化
slow_query_log_file = mysql-slow.log #スロークエリログファイル名
long_query_time = 2 #スロークエリとして認識させる時間[秒]
log-long-format #インデックスを使用していないクエリをログに残す
```

- 上記の設定は`[mysqld]`のところに書かなければ正しく変数名を解決してくれないので注意。
- `slow_query_log`は`ON`ではなく`1`としなければスロークエリログ出力が有効化されないので注意。
- `slow_query_log_file`の場所は`find パス名 -name mysql-slow.log`で検索すればわかる。　→　`/var/lib/mysql/mysql-slow.log`に生成された。
- `long_query_time`で設定した秒数以上かかるクエリがスローログに書かれる。
- `log-long-format`と記述することで、インデックスが使われていないクエリもログに残せるようになる。
- 設定ファイルいじったら、`mysqld`再起動忘れずに！

```
/etc/init.d/mysqld restart
```

- スローログをリアルタイムで見るには、`tail -f /var/lib/mysql/mysql-slow.log`

　↓　ログの中身　↓

```
1行目　記録日時
2行目　ユーザーIDとリクエストした端末
3行目　Query_time（実行時間）　Lock_time(ロック時間)　Rows_sent（送信行数）　Rows_examined（処理対象となった行数）
4行目　SQL文
```
- スロークエリを特定できたら、そのクエリの前に`EXPLAIN`をつけることで、MySQLのインデックス効果を見積もることができる

## 1-2.一般クエリログ
まず、ログの出力先ディレクトリを作成。

```
mkdir /var/log/mysql
```
次に、`my.cnf`に以下を記述。

```
[mysqld]
general-log=TRUE
general-log-file=/var/log/mysql/query.log
```
最後、`my.cnf`いじったら再起動。

```
/etc/init.d/mysqld restart
```

# 2.EXPLAINコマンド
```
EXPLAIN SQL文
```

- そのクエリがどのような順番でどのような方法でテーブルを
検索するかを知ることができる
- `rows`の値の積が、検索にかかる行数の見積もり

# 3.インデックス
## 3-1.インデックスの閲覧
```
SHOW INDEX FROM テーブル名;
```
## 3-2.インデックスの作成
### テーブル作成時にインデックス作成
```
CREATE TABLE テーブル名(
  id INT NOT NULL PRIMARY KEY,
  カラム名1 CHAR(8) DEFAULT NULL,
  カラム名2 CHAR(5) DEFAULT NULL,
  INDEX インデックス名(カラム名)
);
```

### ALTER TABLE文でインデックス作成
```
ALTER TABLE テーブル名 ADD INDEX インデックス名(カラム名); 
```

### ALTER TABLE文で複合インデックス作成
```
CREATE INDEX インデックス名 ON テーブル名 (カラム名1([数値])[, カラム名2([数値]), ...);
```

## 3-3.インデックス削除
```
ALTER TABLE テーブル名 DROP INDEX インデックス名;
```

【参考URL】
▼インデックスの作成・削除・情報表示・追加
http://phpjavascriptroom.com/?t=mysql&p=index
もやもやが晴れたようにわかる 。 実行中のプログラムから作成したオブジェクト図とコミュニケーション図で学ぶオブジェクト指向

#始めに

オブジェクト指向の説明と言えば、やたら文法が多く、難しいC++がまず普及した事と、やたら再利用が強調されたり、クラスモデリングをベースとした抽象、概念的な分析/設計方法論ベースで導入されたせいか

 	・UMLで書いたそれっぽい?クラス図を眺めたり
	・ほ乳類を継承して犬とか猫の鳴き声で例えたり
	・仮想関数やらデザインパターンや、コンストラクタや仮想関数とかやたら設計/実装技術を説明したり
	・小難しい設計/分析手法を勉強してとりあえずモデリング？してみたり

と言ったものが殆どです。これらの事を学習してもオブジェクト指向な考えをなかなか実感できないと思います。

上記ような反省？をふまえて、本投稿では

	・既存のソースに対してデバッガーを使ってオブジェクト図やコミュニケーション図を書き出し
	・オブジェクト同士の協調関係、システムの全体像を把握する。

方法を述べます。この作業を繰り返す事によって補助輪なしの自転車に乗れたようにオブジェクト指向の考え、「オブジェクトがどういう情報を把握しているか」、「どのオブジェクト達と協力するか」、「自身が持っている情報と協力するオブジェクトを使ってどのようなサービス(メソッド)を提供するか」を実感できるのではないかと思います。タイトルの通りオブジェクト指向エクササイズの亜流版と言った所でしょうか？

 クラス図に比べてオブジェクト図やコミュニケーション図を使う利点は以下の通りです。

        ・記述が具体的
        ・約束事が少なく憶えやすい　

 また、シーケンス図に比べて同図を使う利点は以下の通りです。

        ・人間関係のように？オブジェクト同士の役割と関係を把握しやすい(よく新聞やニュースなんかで、政治家同士、国と非政府勢力間、事件の被害者/加害者の関係が図示されていますね)。
　　
 ちなみに古くからのObjective-Cプログラマ−の間で有名なヒレガス本や古いSmalltalk関係の本ではオブジェクト図やコミュニケーション図のような図でアプリやフレームワークの挙動を説明していたりします。
　先人の間では秘伝のコツとして受け継がれているのでしょう。。。

#方法

まず、実行中のプログラムに対してデバッガー等を使って、以下の視点でオブジェクト図を書き出し、オブジェクト同士の関係をあぶり出します。

　・プログラムを実行し
　・そのデバッガー等を使ってオブジェクト同士の結びつきを調べる。
　・個々ののオブジェクトについて以下の事を書き出す。
　　　　・何を知っているか？
　　　　・どのオブジェクトとどんな関わりがあるか？
　　　　・知っている事と関わるオブジェクトを使って呼び出し側にどのような施しを提供できるか？

次にあるメソッドを実行して以下の視点でコミュニケーション図を書き出し、オブジェクト同士が協調して仕事する様子をあぶり出します。

	・依頼内容を書き出す。
	・呼び出し側への報告内容を書き出す。
	・依頼元のオブジェクトについて、報告内容に基づいた判断結果を書き出す。
　　　　
これによって個々のオブジェクトがどのような役割をもっているか？
それらのオブジェクト同士がどのように協調しながらどう処理を行って行くかが見えてくると思います。

#具体例

　以下の文について実際にやってみまず。なお、言語はObjetive-C、環境はiOS,Macになります。Xcodeを持っている人は実行できます。
　　　
 NSPredicate *predicate = [NSPredicate predicateWithFormat:
                             @"( sqrt(number) = 1 ) OR ( name == 'string' && age < 200 )"];
                             
 実行の結果生成されるオブジェクトをオブジェクト図で表してみました。大元のpredicateオブジェクト図をトップにツリー上にNSComparisonPredicate, NSCompoundPredicate,NSExpressionが結びついている様が分かると思います。

 ![オブジェクト図.png](https://qiita-image-store.s3.amazonaws.com/0/39706/12d90e59-ff1f-2b91-57f8-520fc0b0d9e1.png)

　次にpredicateにevaluateWithObject:を送ってオブジェクトを評価する様子をコミュニケーション図で表します。個人的理由で擬人化を体感しやすい様に関西弁を使っていますw。ソースが無いので想像で書いていますが、メッセージ（メソッド）の伝播して行く様子と、個々のオブジェクトがどういう判断をしているかが分かると思います。
                             
   ![コラボレーション図.png](https://qiita-image-store.s3.amazonaws.com/0/39706/5d70efd0-28ed-c9d0-9854-b205ad0069e8.png)
       
#まとめ
 実行中のプログラムから作成したオブジェクト図とコミュニケーション図で学ぶオブジェクト指向の学習方法について書きました。

 とりあえず、優秀な人あるいは組織が書いた気になるアプリやフレームワークについて、ひたすら手を動かして書いてみる事をお勧めします。コツは知っている属性、関連するクラス、他のクラスに行うサービスの観点からひたすら擬人化する事です。

 これが唯一の学習方法では有りませんし、いろいろ意見等有ると思いますが、皆様方の学習に少しでも役立てば幸いです。
　                      
#参考文献
作業中
SRWare Iron Flash Player

# Windows の SRWare Iron で Flash を使う方法

管理者権限でコマンドプロンプトを開き、下記コマンドを実行する。
下記パスは 64bit Windows での標準の場合のため、適宜変更してください。

 del "C:\Program Files (x86)\SRWare Iron\NPSWF*.dll"
 copy C:\Windows\System32\Macromed\Flash\NPSWF*.dll "C:\Program Files (x86)\SRWare Iron\\."
GoogleAppsScriptでJSONPが "Refused to execute script"されたときの対処方法

chromeのバージョンを31から36にアップデートしたら
別ドメインから
GoogleAppsScript.ContentServiceのJSONPが取得出来なくなった。

``` doGet.js
function doGet(e){
  var _c = e.parameter.callback;
  var _s = JSON.stringify({test:'hogehoge'});
  _s = ((_c)?_c + '(' + _s + ')':_s);
  return ContentService.createTextOutput(_s).setMimeType(ContentService.MimeType.JSON);
}
```

別サイトのHTML

```index.html
<!DOCTYPE html>
<html ng-app="MyApp">

  <head>
    <script src="https://code.angularjs.org/1.3.0-beta.5/angular.js"></script>
    <script src="script.js"></script>
  </head>

  <body>
    <div ng-controller="formCtrl">
      <form ng-submit="submit();">
        <button type="submit" />
      </form>
      <p>{{items|json}}</p>
    </div>
  </body>

</html>

```

``` script.js
angular.module("MyApp", [])
.controller("formCtrl", function($http, $scope){
  $scope.submit = function(){
    $http.jsonp('https://script.google.com/macros/s/xxxxxxxxxxxxxxxxxxxxxx/exec',{params:{callback:"JSON_CALLBACK",action:"hogehoge"}})
    .success(function(data, status){
      $scope.items = angular.fromJson(data);
    })
    .error(function(data, status, headers, config){
      console.log('error');
    });
  };
});
```

Angularjsのバージョンは1.3.0-beta.5

Chromeのコンソールログから出力されるエラーはこんな感じ。

**Refused to execute script from 'https://script.google.com/macros/s/xxxxxxxxxxxxxxxxxxxxxx/exec?action=hogehoge&callback=angular.callbacks._0' because its MIME type ('application/json') is not executable, and strict MIME type checking is enabled.**

バージョンアップする度いつもなにかと悩んでるような気が・・・。う～む。


Chrome31ではJSONPでGASのJSONを取得出来ていたのでちと困った。

一日かかっていろいろと調べた結果、結局ブラウザのMIMETYPEがより厳密にチェックが入ったんだろうというオチに。
``ContentService.createTextOutput(jsonp).setMimeType(ContentService.MimeType.JSON);``
↓
``ContentService.createTextOutput(jsonp).setMimeType(ContentService.MimeType.JAVASCRIPT);``

GAS側でMimeTypeをJAVASCRIPTにしたら解決。


[参照](http://msdn.microsoft.com/en-us/library/gg622941%28v=vs.85%29.aspx)
タスクランナーの連続実行を抑止する: gulp.js, Grunt


MacやWindowsのテキストエディタ・画像編集ツールを使っていると、ファイルの保存時に書き込みが2度続けて起きる(と判定される)場合があります。例えば、Espresso, Coda, SublimeTextほかを使っていて、ソースコードを保存する際に、タスクランナーのログを見ると2度走っているケースなど。

[gulp.js](http://gulpjs.com/)や[Grunt](http://gruntjs.com/)といった、Node.js系のタスクランナーでは、ファイル監視に[gaze](https://github.com/shama/gaze)を使っています。このgazeに適切なオプションを渡せば、この問題は解決されます。以下、その説明です。

## gulp.js の場合

通常、こんな感じで`watch`していると思いますが、第二引数にgazeのオプションを渡すことができます。 [cf. 公式APIドキュメント](https://github.com/gulpjs/gulp/blob/master/docs/API.md#gulpwatchglob--opts-tasks-or-gulpwatchglob--opts-cb)

```javascript
var gulp = require("gulp");

gulp.task('watch', function(){
  gulp.watch('coffee/*.coffee', ['coffee']);
});
```

例えば、再実行を10秒間抑制したければ、次のようにオプションを指定します。

```javascript
var gulp = require("gulp");

gulp.task('watch', function(){
  var gaze_opt = {
    debounceDelay: 10000 // wait 10 sec after the last run
  };
  gulp.watch('coffee/*.coffee', gaze_opt, ['coffee']);
});
```

### 参考: gazeで設定できるオプション

`debounceDelay`以外にも、`gaze`に渡せるオプションがあります。

オプション | 型 | 説明
:--|:--|:--
interval | `integer` | fs.watchFile に渡すインターバル
debounceDelay | `integer` | 同じファイル/イベントの処理が完了した後、再度実行されるまでのディレイ (ミリ秒)
mode | `string` | 'auto': デフォルト <br> 'watch': 強制的にネイティブAPIを使う <br> 'poll': 強制的にポーリング
cwd | `string` | ワーキングディレクトリの指定。デフォルトは process.cwd()

詳しくは、[gazeのドキュメント](https://github.com/shama/gaze#documentation)を参照のこと。


## Grunt の場合

Gruntは、公式プラグインの[grunt-contrib-watch](https://github.com/gruntjs/grunt-contrib-watch)から`gaze`を利用します。

```javascript
watch: {
  scripts: {
    files: 'coffee/*.coffee',
    tasks: ['coffee'],
    options: {
      debounceDelay: 10000, // wait 10 sec after the last run
    },
  },
},
```

上記の例では、先ほどのgulp.jsの例と同様に10秒間、タスクの再実行を抑制しています。デフォルトは500ミリ秒です。

Gruntの場合も、前項の「gazeで設定できるオプション」を設定できるほか、いくつかの拡張があります。詳しくは、[grunt-contrib-watch のドキュメント](https://github.com/gruntjs/grunt-contrib-watch#settings)をどうぞ。
ShellScriptでset -euを使ってみた。


## 背景
`Qiita`ではストック数が高い`Tips`について`Recommendation`機能があるようで、そのときに[シェルスクリプトを書くときはset -euしておく](http://qiita.com/youcune/items/fcfb4ad3d7c1edf9dc96  "qiita set -eu")を`Recommend`されて、こいつは使えそうだと思い自分用にメモした。

## set -e, set -uの動作
それぞれの動作は以下。

| set option | 使い方  |意味           | 
|:-----------|:-------|:------------|
| -e         | set -e | return codeが0以外のコマンド実行時に処理を終了する。         |
| +e         | set +e |    -e オプションの取り消し    |
| -u         | set -u |     未定義変数を参照したときに処理を終了する。     |
| +u         | set +u |      -u オプションの取り消し  |

## 使ってみた

### set -e
まずはset -eなしの以下のスクリプトを用意。

```sh:normal.sh
#!/bin/bash

echo 'start'
grep 'no_line' sample.txt # 異常終了コマンド
echo 'end'
``` 
実行してみる。

```cmd:./normal.sh
$ ./normal.sh
start
end
$ echo $?
0
```

一番最後の`echo 'end'`が正常に終了しているので`return code`は0になっている。

次に`set -e`を指定した以下のスクリプトを用意。

```sh:normal_-e.sh
#!/bin/bash

set -e
echo 'start'
grep 'no_line' sample.txt # 異常終了コマンド
echo 'end'
```

実行してみる。

```sh:./normal_-e.sh
$ ./normal_-e.sh
start
$ echo $?
1
$ grep 'no_line' sample.txt
$ echo $?
1
$
```

`end`が表示されずに`return code`が1で終了しており、これは異常終了コマンドである`return code`であることがわかる。

### set -u
まずはset -uなしの以下のスクリプトを用意。

```sh:normal.sh
#!/bin/bash

echo 'start'
echo ${not_defined} # 未定義変数
echo 'end'
```
実行してみる。

```sh:./normal.sh
$ ./normal.sh
start

end
$ echo $?
0
$
```

未定義変数なので改行だけ挿入され、`return code`が0である。
次に以下の`set -u`付きのスクリプトを用意。

```sh:normal_-u.sh
#!/bin/bash

set -u
echo 'start'
echo ${not_defined} # 未定義変数
echo 'end'
```

実行。

```sh:./normal_-u.sh
$ ./normal_-u.sh
start
./normal_-u.sh: 行 5: not_defined: 未割り当ての変数です
$ echo $?
1
$
```
上記のメッセージが表示されて、`end`が表示されず`return code`が1で終了することがわかる。

これで、未定義の変数のために`rm -rf ${nothing}/*`で全削除されたり、`rc=$?;if [[ ${rc} -ne 0 ]]; then`というようなコードを書かなくて良くなる気がする。

おしまい。
C++からLuaにEventCustomを送る

Cocos2d-x/Luaで開発していると、課金の完了や広告のタップなどC++側からLuaにイベントを通知したいことがあります。Luaのグローバル関数を呼び出す場合以下のようになります。

```cpp:cpp
lua_getglobal(L, "onSomeEvent");
lua_pcall(L, 0, 0, 0);
```
```lua:lua
function onSomeEvent()
    cclog("some event")
end
```
この方法だとグローバルな関数を定義しなければならず、文脈によってイベントを受け取ったときの処理を変えたい場合などに不便です。カスタムイベントを使うと以下のようになります。

```cpp:cpp
auto scene = Director::getInstance()->getRunningScene();
scene->getEventDispatcher()->dispatchCustomEvent("onSomeEvent");
```
```lua:lua
local layer = cc.Layer:create()
local listener = cc.EventListenerCustom:create("onSomeEvent", function(event)
    cclog(event:getEventName())
end)
local eventDispatcher = layer:getEventDispatcher()
eventDispatcher:addEventListenerWithSceneGraphPriority(listener, layer)
```
ただし、イベントにパラメータを持たせることはできないようです。EventCustomは本来任意のuserDataを持てるのですが、Luaオブジェクトからは参照できません。

```cpp:cocos/scripting/lua-bindings/auto/lua_cocos2dx_auto.cpp
int lua_register_cocos2dx_EventCustom(lua_State* tolua_S)
{
    tolua_usertype(tolua_S,"cc.EventCustom");
    tolua_cclass(tolua_S,"EventCustom","cc.EventCustom","cc.Event",nullptr);

    tolua_beginmodule(tolua_S,"EventCustom");
        tolua_function(tolua_S,"new",lua_cocos2dx_EventCustom_constructor);
        tolua_function(tolua_S,"getEventName",lua_cocos2dx_EventCustom_getEventName);
    tolua_endmodule(tolua_S);
    std::string typeName = typeid(cocos2d::EventCustom).name();
    g_luaType[typeName] = "cc.EventCustom";
    g_typeCast["EventCustom"] = "cc.EventCustom";
    return 1;
}
```
【読書】小悪魔女子大生のサーバエンジニア日記

しばらく書いていなかったので、読書した本が溜まっているので、書いていこうと思います

読んでから、１ヶ月くらい期間が空いてしまっていますが・・・・。
![小悪魔.jpeg](https://qiita-image-store.s3.amazonaws.com/0/48229/21971d2e-a2af-cb36-a94d-de8cfc31d56e.jpeg)
内容はAmazonより
「可愛いイラストでするする理解できてしまうインターネットの本当の仕組み！」インターネットの会社でアルバイトをはじめたけど，文系女子大生だしわからないことばかり。でも，インターネットを支えるサーバ技術・通信技術を自分なりにわかりやすくイラストにしてブログで発表したら，「インターネットの父」村井純先生やいろいろなエンジニアの皆さんが応援してくれるようになりました！　まったくの初心者でも直感的に理解できて玄人技術者までうならせる深い内容……小悪魔ちゃんの解説で楽しくITを学んでみませんか？


というような内容の本です。


著者のオリジナルキャラのかわいらしいうさぎさんとかくまさんが、インターネットの仕組みについて
分かりやすく解説してくれている。

**非常に分かりやすかった!!**

分かりやすかった！！
・・・半分くらいまでは（＞＿＜）


分かりやすかったけど、半分くらいから内容が難しくになるにつれて、
増えていくかわいらしいキャラたち。


増えていく増えていくふえていkry


うさぎとかくまとかやぎとか増えすぎて、途中から判断がつかなくなってしまいました・・・。


純粋にバカ１００％な自分が悪いんですが・・・笑


でも、良かったところとしては、ざっくりとインターネットの仕組みが分かった点です。


知識も少しづつ増えてきたので、再読したら理解できるのかなと思うので、近々もう一度読んでみようと考えてます。
iphoneアプリ


- (IBAction)doubletap:(id)sender {
    NSArray *catImage = [NSArray arrayWithObjects:
                         @"640x1136_17_sizen-006.jpg",
                         @"dreaminggirl.jpg",
                         nil];
    int r = arc4random() % 2;
    [self.catImageView setImage:[UIImage imageNamed:[catImage objectAtIndex:r]]];
    
}
@end



ここで、このように緑色のラベルで表示されます。。

 return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
GASで文字コード指定してファイルを書き出す 


## 方法

以下の処理により文字コード指定してファイルを書き出すことが可能になる。

1. 空のBlobを生成
2. Blobに書き出したい文字列と文字コードをセット
3. Blobをファイルに書き出し

コードで表すと以下のとおり

```js
var blob = Utilities.newBlob("", contentType, fileName);
blob.setDataFromString(string, charSet);
DocsList.createFile(blob);
```

## 解説
GASから任意の文字列をテキストファイルとして書き出すには`DocsList.createFile(string, contentType)`により可能だが、文字コードを指定して書き出すことはできない。そこで、文字コード指定のできるBlob生成をしてから`DocsList.createFile(Blob)`することで、指定した文字コードでファイルを書き出してやる。

またBlobについて、新しくBlobを生成する時に文字コード指定ができないので、いったん空でBlobを生成したのちに`Blob.setDataFromString(string, charset)`で文字コードを渡してあげる必要がある。

以上を合わせると上に示したような処理になる。

## サンプル

開いているシートをShift_JISなcsvとして書き出す。

```js:code.gs
function outputSheetToCsvFile() {
  // 定数
  var fileName = "μ's.csv";
  var contentType = "text/csv";
  var charSet = "Shift_JIS";
  var lineDelimiter = ",";
  var newLineChar = "\r\n";
  
  // 開いているシートからデータを取得
  var range = SpreadsheetApp.getActiveSheet().getDataRange();
  var values = range.getValues();

  // 2次元配列になっているデータをcsvのstringに変換
  var csvString = underscoreGS._map(
    values,
    function(row){return row.join(lineDelimiter);}
  ).join(newLineChar);
  
  // Shift_JISなBlobに変換
  var blob = Utilities.newBlob("", contentType, fileName).setDataFromString(csvString, charSet);
  
  // Blobをファイルに出力
  DocsList.createFile(blob);
}

function onOpen() {
  // メニューバーにカスタムメニューを追加
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var entries = [{
    name : "シートをCSV(Shift_JIS)で出力",
    functionName : "outputSheetToCsvFile"
  }];
  spreadsheet.addMenu("CUSTOM MENU", entries);
};
```

### 実行結果

これが

![スプレッドシート](https://qiita-image-store.s3.amazonaws.com/0/20434/fedf1fbe-3251-641f-6866-96e2a92d0dea.png)

↓↓↓こうなる↓↓↓

![csv](https://qiita-image-store.s3.amazonaws.com/0/20434/f2fda325-1c92-5ea7-a298-a0d2ffee16ef.png)


## 参照
- [Blob生成(Utilities.newBlob)](https://developers.google.com/apps-script/reference/utilities/utilities?hl=ja#newBlob(Byte,String,String))
- [文字コードセット(Blob.setDataFromString)](https://developers.google.com/apps-script/reference/base/blob?hl=ja#setDataFromString(String,String))
- [ファイル書き出し(DocsList.createFile)](https://developers.google.com/apps-script/reference/docs-list/docs-list#createFile(BlobSource))
githubで使うIDを使い分けよう

# 会社用IDと自宅用IDを使い分けたい
* 特に入社した会社で新たにIDを付与されて
* 会社用PCで自分用リポジトリを触る必要がある場合
* 会社で使うライブラリに自分が作った物がある場合特に

# ここを見よう
http://d.hatena.ne.jp/monjudoh/20110411/1302521587

# こんな感じ
```
git remote add origin git@github-oreore:{owner_name}/{repo_name}
```
こんな感じでやればいい。
文字コードをフォルダごと調べたり、まとめて変換したりする方法

nkfを使い、フォルダごとUTF-8からEUC-jpへ文字コードを変換したりする方法を説明します。

#文字コード変換用のnkfコマンドをインストール
まずは文字コードを変換するための<strong>nkf (Network Kanji Filter)</strong>をインストールします。

```ruby:command

$ brew install nkf

```

※<strong>``brew install``</strong>はHomebrewでパッケージをインストールするコマンドです。(なので<strong>[Homebrew](http://brew.sh/index_ja.html)</strong>入れといてください...)
成功すると下記の様な結果が出てきます。

```ruby:command

==> Downloading http://dl.sourceforge.jp/nkf/59912/nkf-2.1.3.tar.gz
######################################################################## 100.0%
==> make CC=clang
==> make install prefix=/usr/local/Cellar/nkf/2.1.3 MKDIR=mkdir -p
?  /usr/local/Cellar/nkf/2.1.3: 4 files, 348K, built in 14 seconds

```

#フォルダ内のファイルの文字コードがどのように変換されるか調べる。
文字コードを調べたいフォルダに移動して、下記のコマンドを入力します。

```ruby:command

$ nkf -We **/*.php | nkf --guess
EUC-JP (LF)

```

<strong>``-W``</strong>はUTF-8と仮定して処理する。
<strong>``-e``</strong>はEUCコードに変換する。という意味です。
→大文字が仮定して処理、小文字が変換する処理と覚えておきましょう。

<strong>``**/*.php``</strong>は、再帰的に「.php」というファイルを探すというコマンドです。他のファイルにも適用できます。たとえば、<strong>「.inc」</strong>ファイルも一緒に調べたいときは<strong>``**/*.php.inc``</strong>と記述します。

<strong>``nkf --guess``</strong>はファイルの文字コードを特定できるコマンドです。上記の例だと<strong>「EUC-JP (LF)」</strong>という変換の予測がでています。文字コードの変換が失敗していると<strong>「BINARY」</strong>という表示がでてきます。

※nkfコマンドの一覧はこちら↓
[Linuxコマンド集 - 【 nkf 】 文字コードを変換する：ITpro](http://itpro.nikkeibp.co.jp/article/COLUMN/20060227/230849/ "Linuxコマンド集 - 【 nkf 】 文字コードを変換する：ITpro")
#「UTF-8」→「EUC-JP」に変換する。
上記のコマンドでうまく処理できると予測ができたら、
下記のコマンドで上書きします。

```ruby:command
$ nkf -We --overwrite **/*.php
```

<strong>``--overwite``</strong>は文字通り、上書きするというコマンドです。

もし指定したディレクトリ以下のファイルがちゃんと変換されているか調べたかったら、下記のコマンドを入力。

```ruby:command
nkf --guess **/*.php
```

入力すると、こんな感じでファイルごとの文字コードが判定されます。

```ruby:command
index.php: EUC-JP (LF)
01/index.php: EUC-JP (LF)
02/index.php: EUC-JP (LF)
03/index.php: EUC-JP (LF)
04/index.php: EUC-JP (LF)
05/index.php: EUC-JP (LF)
```



##参考サイト
[[文字コード変換]nkfコマンドのインストール | 本日も乙](http://blog.jicoman.info/2013/08/nkf_install/ "[文字コード変換]nkfコマンドのインストール | 本日も乙")
[nkfを使って、ディレクトリ以下のファイルを「EUC-JP」⇒「UTF-8」に一括変換する。 - カサヒラボ](http://d.hatena.ne.jp/kasahi/20070926/1190833699 "nkfを使って、ディレクトリ以下のファイルを「EUC-JP」⇒「UTF-8」に一括変換する。 - カサヒラボ")
[テキストファイルの文字コードを調べるには（nkf編） － ＠IT](http://www.atmarkit.co.jp/flinux/rensai/linuxtips/980nkfguess.html "テキストファイルの文字コードを調べるには（nkf編） － ＠IT")
Cで自動ファイル作成のプログラム

# まず始めに。
むかし、むかし、半年くらいむかしにNAVERまとめで書いた内容をQiitaにも。

* NAVERの記事は[こちら](http://matome.naver.jp/odai/2139357842101449101)から。

内容としてはNAVERまとめで書いた記事と同じです。

# 今回やりたいこと
* C++を実行できるファイルを作りたいので、txtファイルではなくcppファイルを作ります。
* ファイルの名前を番号でわかるようにしたいのでファイル名に番号がつくようにします！
* C++ファイルでほぼ必ず書く
```
#include<iostream> 
using namespace std;
```
を作成したファイルに記入されている状態にする。

# 基本
基本としてはファイル入出力の方法を使えばいいので
次のようなものが基本として理解できていれば使えます。

```c
int fscanf(
    FILE * restrict stream,
    const char * restrict format,
    ...
);
```

(引用元：[C言語関数辞典-fscanf](http://www.c-tipsref.com/reference/stdio/fscanf.html))

# 応用

```C:test01.c
#include<stdio.h>

int main(void){

    char file_name[20];
    int i;
    int file_namber;

    for (i = 0; i < 4; i++){
        file_namber=i;
        sprintf(file_name, "test_file%d.cpp",file_namber);
        fopen(file_name, "a");
    }
    
    return 0;
}
```

これでC++の空のファイルが作成できます！！
実はここが一番解決するのに時間がかかりました^^;
ファイル名に番号つけるのがどうしてもできなくて...。
なぜかというと、私の中で
`fp=fopen("./test_file.cpp","w");`
という書き方があまりにも強く残っていて、
この書き方から抜け出せなかったのが問題でした

# 最終形態
```c:test02.c
#include<stdio.h>
#include<stdlib.h>
int main(void){
    int i;
    FILE *fi;
    char filename[50];
    
    for (i=1; i<=5; i++) {
        sprintf(filename,"test%d.cpp",i);
        fi=fopen(filename,"w");
        if(fi==NULL){
            fprintf(stderr,"error\n");
            exit(1);
        }
        fprintf(fi,"//file_name:test%d.cpp\n",i);
        fprintf(fi,"#include<iostream>\n");
        fprintf(fi,"using namespace std;\n");
        fclose(fi);
    }
    return 0;
}
```
これで今回目的としていたことがすべてクリア出来ました！
あまり大量に作っても仕方がないので
5つのファイルが作成されるように作っています！

もし同じく困っていた人がいてこれを見て解決してもらええば幸いです。

# 感想
コードが汚い...(^^;)
訂正したいところもありますが、これはこれで残しておきたいので手を加えないことにしたいと思います(^^;)
UnityではじめてのOculus DK2　 mac版

こちらから以下のものをインストール
http://www.oculusvr.com

developerから以下4つをダウンロード
・runtime
・sdk
・tuscany demo
・Integration

![スクリーンショット 2014-08-21 22.07.18.png](https://qiita-image-store.s3.amazonaws.com/0/38279/a9138623-123c-992d-9c9d-4fc6be745891.png)

 runtimeをインストールしてからUnityのIntegrationから以下のパッケージを入れます。
OculusUnityIntegration.unitypackage

![スクリーンショット 2014-08-23 11.08.40.png](https://qiita-image-store.s3.amazonaws.com/0/38279/60f8f05d-8019-dea1-22e6-5e5c10db5c5a.png)

後は、 maincameraを削除してOVRPlayerControllerをドラック&ドロップ

![スクリーンショット 2014-08-23 11.44.25.png](https://qiita-image-store.s3.amazonaws.com/0/38279/49c41ba9-9ee5-1b5b-9c3c-04b86571d1a9.png)


![スクリーンショット 2014-08-23 11.44.45.png](https://qiita-image-store.s3.amazonaws.com/0/38279/b7541070-dfaf-ad8c-d068-d084ce02a894.png)

Gravity Modifierの値を0にする。

![スクリーンショット 2014-08-23 11.44.38.png](https://qiita-image-store.s3.amazonaws.com/0/38279/a05fd937-3257-1c43-491f-b14e11a11fcc.png)
※カメラが落下してしまうのをとりあえず回避のため

これで OculusのHDMIと USBのケーブルをつないで再生すれば無事に表示されます。

ヘッドトラッキングをつながなくても DK1と同じようにジャイロと3D空間は連動します。