OmniAICreator/Qiita-1.07M huggingface dataset:
スケジューリング処理（Cocos Code IDE, Lua言語）


Cocos Code IDEを使ってLua言語で、一定時間ごとに処理を行うためのスケジューリングの基本です。

|実行環境、IDE|Cocos2d-xバージョン|言語|
|:--|:--|:--|
|Cocos Code IDE Mac OS X 1.0.0-RC2|Cocos2d-x V3.2|Lua言語|

## サンプルコード

プロジェクトの新規作成で作成されるGameScene.luaのGameScene.create()を書き換えます。

```lua:GameScene.lua/GameScene.create
function GameScene.create()
    local scene = GameScene.new()

    local function func(dt)
        print(string.format("%f", dt)) -- dtには前回の呼び出しからの経過時間が入ります。
    end
    
    local schedulerID = cc.Director:getInstance():getScheduler():scheduleScriptFunc(func, 5, false)
    
    return scene
end
```

実行すると5秒毎にfunc関数が呼び出されます。

## 解説

### 指定した時間間隔で関数を呼び出す

最初に呼び出される関数を準備します。ここでは関数名をfuncとしました。

```lua
local function func(dt)
    -- dtには前回の呼び出しからの経過時間が入ります。
end
```

### スケジューラーに登録する

```lua
local schedulerID = cc.Director:getInstance():getScheduler():scheduleScriptFunc(func, 5, false)
```
この例では、5秒毎にfunc関数を呼び出します。呼び出される時間には必ず誤差があります。
最後の引数はfalseにします。
また、後でスケジュールを停止できるようにIDを保存しておきます。

### スケジュールを停止するとき

```lua
-- schedulerIDにはスケジューラーのIDが入っているとして、
cc.Director:getInstance():getScheduler():unscheduleScriptEntry(schedulerID)
```

必要がなくなった時や、exitイベントなどでスケジュールを停止します。
（イベントについては[「イベント処理を行う」](http://qiita.com/senchan05/items/4a4ab4381601626ac475)の投稿を参照してください。）


## Cocos2d-xをC++で扱っていた時の、updateの代わりの関数を作る例

updateの代わりの呼び出される関数を準備します。（サンプルプログラムの関数名がtickでしたので、そのままtickを使っています。）

```lua
local function tick(dt)

end
```

次に毎フレームtickを呼び出すようにします。時間には0を指定します。

```lua
-- 毎フレームtickを呼び出す
local schedulerID = cc.Director:getInstance():getScheduler():scheduleScriptFunc(tick, 0, false)
```

必要がなくなった時や、exitイベントなどでスケジュールを停止します。
（イベントについては[「イベント処理を行う」](http://qiita.com/senchan05/items/4a4ab4381601626ac475)の投稿を参照してください。）

```lua
-- スケジュールを停止するとき
cc.Director:getInstance():getScheduler():unscheduleScriptEntry(schedulerID)
```
イベント処理を行う（Cocos Code IDE, Lua言語）


Cocos Code IDEを使ってLua言語で、ノードのイベント処理を行う基本です。

|実行環境、IDE|Cocos2d-xバージョン|言語|
|:--|:--|:--|
|Cocos Code IDE Mac OS X 1.0.0-RC2|Cocos2d-x V3.2|Lua言語|

## サンプルコード

プロジェクトの新規作成で作成されるGameScene.luaのGameScene.create()を書き換えます。

```lua:GameScene.lua/GameScene.create
function GameScene.create()
    local scene = GameScene.new()

    local function onNodeEvent(event)
        if "enterTransitionFinish" == event then
            -- シーン遷移後に行う処理
            print("enterTransitionFinish")
        end
        if "exit" == event then
            -- 終了時の処理
            print("exit")
        end
    end

    scene:registerScriptHandler(onNodeEvent)
    
    return scene
end
```

実行するとシーン遷移後と終了時にログが表示されるはずです。

C++でのonExitやonEnterTransitionDidFinishのようにノードのイベント処理を行えます。

## イベントハンドラの登録を解除する

`scene:unregisterScriptHandler()`でイベントハンドラの登録を解除することができます。
systemdのassert_returnマクロ

systemdには`assert_return`というマクロがある。assertに失敗したら、指定エラー値でreturnするだけなのだが、こういうのがあるとコーディングスタイルが統一されて良いと思う。

使い方はこんな感じ：

```c:src/journal/journal-send.c
_public_ int sd_journal_printv(int priority, const char *format, va_list ap) {

        /* FIXME: Instead of limiting things to LINE_MAX we could do a
           C99 variable-length array on the stack here in a loop. */

        char buffer[8 + LINE_MAX], p[11]; struct iovec iov[2];

        assert_return(priority >= 0, -EINVAL);
        assert_return(priority <= 7, -EINVAL);
        assert_return(format, -EINVAL);

```

`CODING_STYLE`に書いてあるが、公開APIでは引数チェックが義務付けられていて、`assert_return`はその道具の一つらしい。

定義はこんな感じ：

```c:src/shared/macro.h
#define assert_return(expr, r)                                          \
        do {                                                            \
                if (_unlikely_(!(expr))) {                              \
                        log_assert_failed_return(#expr, __FILE__, __LINE__, __PRETTY_FUNCTION__); \
                        return (r);                                     \
                }                                                       \
        } while (false)
```

`_unlikely_`はLinuxではお馴染みのあれ。`__PRETTY_FUNCTION__`は`__FUNCTION__`より情報量のある名前を返してくれるらしい。

試しに使ってみるとこんな感じ：

```shell-session
$ cat pretty_function.c
#include <stdio.h>

int main(void)
{
  printf("%s\n", __FUNCTION__);
  printf("%s\n", __PRETTY_FUNCTION__);
  return 0;
}
$ ./a.out              
main
int main()
```

[6.45 Function Names as Strings](https://gcc.gnu.org/onlinedocs/gcc/Function-Names.html) を読む感じだと、C++の方で力を発揮しそうですね。
Docker利用時に短ターンアラウンドタイムでデバッグする方法

# 適用可能状況
* Dockerを使っている
* Dockerのコンテナ外ではコンパイル/実行できない

# 問題点
* コード編集してから実行するたびに、`docker build`していては遅すぎてデバッグが捗らない

# 解決法
* build contextから不要なファイルを除去する
* volume (`docker run -v`)をうまく使う
* .dockerignore ファイルを作成し不要なファイルをbuild contextに送らないようにする

# 詳細
よくあるDockerfileの例

```lang:docker
RUN yum install -y いろいろ

# Setup SSH for git clone
ENV HOME /root
ADD ssh/ /root/.ssh
RUN chmod 600 /root/.ssh/*; ssh-keyscan bitbucket.org > /root/.ssh/known_hosts

# Get Project and compile
RUN git clone git@bitbucket.org:xanxys/coolproject.git; \
  cd coolproject; \
  scons # でもmakeでもなんでも
```

(遠隔)リポジトリにcommitされていれば`docker build`によって新しいイメージを作成可能だが(`git clone`時にキャッシュ無効化する方法が必要だがそれはここでは扱わない)遅いし、毎回commitするのは面倒。

## 遅い要因: 巨大なbuild context
`Sending build context to Docker daemon`に時間がかかっている場合: docker buildは指定されたディレクトリ全てをシリアライズしてdaemonに送るので大きい`.git`やデータがある場合すごく遅い。
(cf. [Dockerfile Reference](https://docs.docker.com/reference/builder/))

Dockerfileを適当なsub-directoryに移動することで解決する

もしくは .dockerignore ファイルをDockerfileと同じ場所に作成し、.git 等のディレクトリやファイル名を記述しておくとbuild contextを小さくすることができる。

## 遅い要因: git clone
毎回リポジトリ全体をダウンロードするので遅いし、サーバーが落ちてるとデバッグできないのは困る。

プロジェクトの構成が以下のようになっているとき

```
coolproject
|-.git
|-hoge.cpp
|-hoge2.cpp
|-SConstruct
|-docker
  |-Dockerfile
```

`docker run -ti -v $(pwd):/root/local imageの名前 bash`などとして、コンテナ内の`/root/local`で(ローカルでやるのと同じように)`scons`すると、リポジトリにcommitされてないコードの編集も読んでくれるし、ファイルのIOも可能。
[Swift][超入門]初心者向けはじめてのHelloWorld!


話題のSwiftでアプリをつくれるようになるためQiitaに情報を更新していきたいと思っています。

##まずはDownload
こちらからDLできます。
iOS Developer Programs(デベロッパプログラム）への登録が必要なのでご注意ください。

* [Xcode - Downloads - Apple Developer]

[Xcode - Downloads - Apple Developer]:https://developer.apple.com/xcode/downloads/


* [Xcode 6 beta の入手とインストール]
[Xcode 6 beta の入手とインストール]:http://ameblo.jp/kurabeat/entry-11878942954.html

##プロジェクトの作成

1. プロジェクトの新規作成
まずXCodeを開いたら　File>New>Project　を選択。

![Screen Shot 2014-09-14 at 9.54.53 PM.png](https://qiita-image-store.s3.amazonaws.com/0/6702/0e90f515-ebf5-89ee-fd7e-9c1f4015354f.png 
"Screen Shot 2014-09-14 at 9.54.53 PM.png")

2.　テンプレートの選択
次に作りたいアプリに合わせてテンプレが選べます。
今回は　iOS>Application>Single New Application　を選択。


![Screen Shot 2014-09-14 at 9.55.08 PM.png](https://qiita-image-store.s3.amazonaws.com/0/6702/8ef6363c-2257-7246-d487-54bf79df9307.png "Screen Shot 2014-09-14 at 9.55.08 PM.png")

3.　プロダクト名の決定
次にプロダクト名を設定します。Product Nameの中にHelloWorldと入力しましょう。

![Screen Shot 2014-09-14 at 9.55.24 PM.png](https://qiita-image-store.s3.amazonaws.com/0/6702/46d491cd-6274-ea71-562b-5989701035d4.png "Screen Shot 2014-09-14 at 9.55.24 PM.png")

4.　保存先の設定
デフォルトでは~/Applications内に保存されるそうです。
今回はこのままにしましょう。
![Screen Shot 2014-09-14 at 9.56.18 PM.png](https://qiita-image-store.s3.amazonaws.com/0/6702/394e9d93-28d0-eee8-1508-faf8011236cf.png "Screen Shot 2014-09-14 at 9.56.18 PM.png")


##HelloWorldを出力
上記を全て終えるとプロジェクトが立ち上がります。
プロジェクト名>ViewController.swift を開きましょう。

![Screen Shot 2014-09-14 at 9.56.37 PM.png](https://qiita-image-store.s3.amazonaws.com/0/6702/e19c07c2-0789-4353-45d6-a37843e35458.png "Screen Shot 2014-09-14 at 9.56.37 PM.png")


開いたら、
override func viewDidLoad()

という関数内に、
println("HelloWorld!")

を記述します。ソースは以下。

```ViewController.swift
import UIKit

class ViewController: UIViewController {
                            
    override func viewDidLoad() {
        println("HelloWorld!")
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}

```

左上の実行ボタンをクリック！！

![Screen Shot 2014-09-14 at 9.57.16 PM.png](https://qiita-image-store.s3.amazonaws.com/0/6702/9fa4fe2a-7e53-e019-4044-647c1487a7eb.png "Screen Shot 2014-09-14 at 9.57.16 PM.png")

右下のログにHelloWorldと出力されればOK！！
これでSwiftエンジニアデビュー！！


基本文法の分かりやすいまとめ記事を発見。

[作って学ぶSwift/iOSアプリ入門]
[作って学ぶSwift/iOSアプリ入門]:http://tech.camph.net/?p=363

とても参考になりますので、これからこちらなどを参考に色々と試してみたいと思います。
tmux の status line の設定方法

status line の設定方法について調べたのでここにメモしておきます。

## status line の構成

tmux の status line は下図のように 3 つの部分から構成されています。

![tmux-statusline-1.png](https://qiita-image-store.s3.amazonaws.com/0/5321/36f11028-fe67-cf5a-da83-036080783f05.png)

status-left の部分はデフォルトではセッション名が表示されています。
status-right の部分はデフォルトでは現在のウィンドウのタイトルと、現在時刻が表示されています。
window-status にはデフォルトではウィンドウのインデクス、名前、フラグが表示されます。

## status line の設定

とりあえず、下のような status line を設定してみました。サンプルとして、無駄にロードアベレージを表示しています。

![tmux-statusline-2.png](https://qiita-image-store.s3.amazonaws.com/0/5321/8fa74df0-99a1-ba8e-34c8-ccd01b8c5caf.png)

```sh
# status line を更新する間隔を 1 秒にする
set-option -g status-interval 1

# window-status を中央揃えで配置する
set-option -g status-justify "centre"

# status line の背景色を指定する。
set-option -g status-bg "colour238"

# status line の文字色を指定する。
set-option -g status-fg "colour255"

# status-left の最大の長さを指定する。
set-option -g status-left-length 20

# status-left のフォーマットを指定する。
set-option -g status-left "#[fg=colour255,bg=colour241]Session: #S #[default]"

# status-right の最大の長さを指定する。
set-option -g status-right-length 60

# status-right のフォーマットを指定する。
set-option -g status-right "#[fg=colour255,bg=colour241] #h | LA: #(cut -d' ' -f-3 /proc/loadavg) | %m/%d %H:%M:%S#[default]"

# window-status のフォーマットを指定する。
set-window-option -g window-status-format " #I: #W "

# カレントウィンドウの window-status のフォーマットを指定する
set-window-option -g window-status-current-format "#[fg=colour255,bg=colour27,bold] #I: #W #[default]"
```

サンプルから分かる通り、`status-left`, `status-right`, `window-status-[current-]format` で status line に表示する文字列のフォーマットを指定できます。特殊文字列を指定することで、色を変えたり、シェルの出力を表示したりできるので、結構柔軟にいろいろなものを表示できるようになっています。


## status line で指定できる特殊文字列

以下の特殊文字列が指定できます。

|Character pair|Replaced with|
|--------------|-------------|
| `#(shell command)` | コマンドの出力の最初の行 |
| `#[attributes]` | 色や属性の変更 |
| `#H` | ローカルホストのホスト名 |
| `#h` | ローカルホストのドメイン名を除いたホスト名 |
| `#F` | カレントウィンドウのフラグ |
| `#I` | カレントウィンドウのインデクス |
| `#D` | カレントペインの識別子 |
| `#P` | カレントペインのインデクス |
| `#S` | セッション名 |
| `#T` | カレントペインのタイトル |
| `#W` | カレントウィンドウの名前 |
| `##` | `#` |

`#(shell command)` で実行した結果の文字列に `#[attributes]` が含まれている場合、attributes にしたがって色や属性の変更が起こります。それ以外の特殊文字列が含まれていても無視されるようです。

`#24T` のように特殊文字の前に数字を書くと最大長を指定できます。

また、上記の特殊文字列に加えて、`%Y-%m-%d %H:%M:%S` などの strftime が認識する特殊文字列も書くことができます。

## attributes に指定できる文字列

`#[fg=colour255]` のように色を指定できます。指定できる色については、下記の色一覧を参照してください。

また、`#[bold]` というように色以外にもいくつかの属性を設定できます。設定できる属性は以下の通りです。

- **bright** (or **bold**)
- **dim**
- **underscore**
- **blink**
- **reverse**
- **hidden**
- **italics**

複数の属性を指定するときはコンマで区切って指定します。

また、`#[default]` と書くと属性をリセットできます。

### 色一覧

[tmux-powerline](https://github.com/erikw/tmux-powerline) についてくる `color_palette.sh` を実行すると色一覧を出力してくれます。

![tmux-colours.png](https://qiita-image-store.s3.amazonaws.com/0/5321/aadbe7a5-9226-4fe0-25cc-8b2d031a75e2.png)


## 参考文献

- [Ubuntu Manpage: tmux — terminal multiplexer](http://manpages.ubuntu.com/manpages/trusty/en/man1/tmux.1.html)
- [tmux-powerline](https://github.com/erikw/tmux-powerline)
米Apple新言語「Swift」

#Swift
米Appleが2014年6月2日に「Swift」というプログラミング言語を発表しました。
iOS向けアプリを開発する際に使用するObjective-Cをさらに簡単に、楽しく書ける言語のようです。

SwiftはObjectiv-Cよりも簡単にプログラミングできるということで、何かほかの言語を学んだことがあればすんなりと理解できるらしく、Appleとしては理解しやすい言語を世に出して、多くの開発者を取り込むことを狙っているのではないか。

**変数の宣言**

*Swift*

```Swif
var name = "Tanaka"
var name2 = "Tarou"

var fullName = name + name2
```

Ofjectiv-C

```Swif
NSString *name = @"Tanaka";
NSString *name2 = @"Tarou";

NSString *fullName = {name stringByAppendingString:name2};
```


上の変数の宣言のコードを見てもSwiftの方がすっきりしているのが分かります。
・行末にセミコロンがいらない
・型推論の機能があるので「var name = "Tanaka"」と記述すれば、nameはStringとして認識される
・文字列表示は `println("Hello,World!")` でOK!

他の文法も、基本的なものはC言語と大差がありません。
一般ユーザーが開発できるのは秋以降らしいですが、Swiftの登場で開発を始めるハードルが下がったので、一度試してみるのも面白そうです。
AndroidでWeb検索のインテントを飛ばす

Android 4.0以降なら多分Google Nowが起動して検索してくれる。 2.3とかはどうなるか知らない

```java
Intent intent = new Intent(Intent.ACTION_WEB_SEARCH);
intent.putExtra(SearchManager.QUERY, text);
activity.startActivity(intent);
```

Extraのキーに`Intent.EXTRA_***`じゃなく`SearchManager.QUERY`を使うところで詰まったので忘れた時のためにメモ。ちなみに中身は`"query"`。
Raspberry PiをOSを入れて起動させるのに苦悩中

#1.はじめに

>*Raspberry Pi（ラズベリーパイ）は、ラズベリーパイ財団によって英国で開発されたARMプロセッサを搭載したシングルボードコンピュータ。*-[Raspberry Pi - Wikipedia](http://ja.wikipedia.org/wiki/Raspberry_Pi)より

Raspberry Pi公式サイト：[http://www.raspberrypi.org/](http://www.raspberrypi.org/)

##1.1.目的
これは(2014.09.14現在)Raspberry PiにOSを入れて起動させるという苦悩の記録を残しているものです。

##1.2.経緯
ちょっとおもちゃとして遊びたくて、先日Amazonで『<a href="http://www.amazon.co.jp/gp/product/B00LT4BOK6/ref=as_li_ss_tl?ie=UTF8&camp=247&creative=7399&creativeASIN=B00LT4BOK6&linkCode=as2&tag=nanase0525-22">Raspberry Pi Model B+ (Plus)</a><img src="http://ir-jp.amazon-adsystem.com/e/ir?t=nanase0525-22&l=as2&o=9&a=B00LT4BOK6" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />』を購入しました。
そして、アキバに行く用事が数日後にあったのでその日にキーボードやマウス、SDカードなどを揃えようと思って、アキバで買ってから数日後の今日(2014.09.14)、「よし！Raspberry Piで遊ぼう！」っと思って始めたら苦悩の渦にはまってしまいました(^^;)
そうそれは、**『Raspberry Piを起動させられない。』**ということです...orz

#2.苦悩との闘い
##2.1.闘いの始まり
実は、Raspberry Piを始めるにあたって、『<a href="http://www.amazon.co.jp/gp/product/4899773978/ref=as_li_ss_tl?ie=UTF8&camp=247&creative=7399&creativeASIN=4899773978&linkCode=as2&tag=nanase0525-22">Raspberry Piで遊ぼう! 改訂第2版</a><img src="http://ir-jp.amazon-adsystem.com/e/ir?t=nanase0525-22&l=as2&o=9&a=4899773978" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />』という本を購入したのですが、購入した後に気づいた問題が。それは、本の内容はWindows版。そして、自分が使っているのはMacOS...
筆者はMacOSでも手順は同じと言っているので、とりあえずその方法で試してみました。
わくわくしながら、HDMIケーブルでモニター(TV)とつないで、USBキーボードとUSBマウスをつなげて、SDカードをいれてから、電源入力端子にmicroUSBのケーブルをつないで電源を入れて、ボードのRUNを表すところが光った...のですが、モニターには一瞬入力を読み取ろうとしたような挙動を見せたのですが、結果は黒い画面のまま...orz


##2.2.購入したSDカードとRaspberry Piの相性が悪い？
解決策が本に載っていないかなぁっと思い探してみると、section2の『Raspberry Piの初期設定をしよう』というところに、『うまく起動できない場合は？』という項目があり、そこには自分の状態と同じである『電源を入れても画面が真っ暗のまま』というときの対処方法が！
けれど、結論から言うと解決しなかったです(^^;)
(本当のことを言うと試していないものもあるので解決しないというのは言い過ぎなのですが...)
けれど、そこの手引きの中で『SDカードとRaspberry Piの相性が悪い時がある。』という内容が。もしかしたら、自分が購入したSDカードが悪かったのかもしれないと思いしらべたら、対応しているか、非対応かを紹介しているサイトを発見しました。

**記事：[RPi SD cards](http://elinux.org/RPi_SD_cards)**

自分が購入したSDカードは、
<pre>Toshiba製｜microSDHC｜16GB｜CLASS10</pre>
[上記の記事](http://elinux.org/RPi_SD_cards)で確認したところ"OK"と書かれていたので、対応しているSDカードだったらしいです。なので、SDカードとRaspberry Piの相性は関係なかったらしいです。

##2.3.起動ディスクの作成が失敗？！
次に疑ったのが起動ディスクの作成が失敗しているのではないかということです。
なので、SDカードの中身を削除して再度同じ方法を試してみたのですが、結果は同じ。うむ。
他に違うインストールの仕方があるかもと思いGoogle先生にたずねていろいろ聞いてみると、『RPi-sd card builder』を使う方法が書かれていました。

**記事：[SD card setup – Raspberry Pi – Mac](http://alltheware.wordpress.com/2012/12/11/easiest-way-sd-card-setup/)**

よし、これでやってみるかと試していたら...

**「アクション“シェルスクリプトを実行 (Image to Card)”でエラーが起きました。
アクションの設定を確認してから、ワークフローをもう一度実行してください。」**

との警告文が。...え。
とりあえず、Google先生に聞いてみると、

**記事：[エラー : アクション“シェルスクリプトを実行 (Image to Card)”でエラーが起きました。](http://yohtn.hatenablog.com/entry/2013/07/18/154622)**
**記事：[Raspberry PiにRaspbianを入れてみた（Macで）](http://58.hatenablog.com/entry/2014/04/06/221321)**

っと同じ問題にぶつかった方がおられました。

***
ここからの話はまた後で書きます。(TIME:2014.09.14.21:27)
***
foreman で アプリケーションを動かす。


# foreman とは
foreman は、Procfile を読み込み、複数のプロセスを管理できるツール。
Heroku を動かす際にも用いられている。
(Heroku toolbelt インストール時に自動的にインストールされる。)

または、gem でインストールする。

```
$ gem install foreman
```

# 使い方
```
$ foreman -h
Commands:
  foreman check                   # Validate your application's Procfile
  foreman export FORMAT LOCATION  # Export the application to another proce...
  foreman help [COMMAND]          # Describe available commands or one spec...
  foreman run COMMAND [ARGS...]   # Run a command using your application's ...
  foreman start [PROCESS]         # Start the application (or a specific PR...
  foreman version                 # Display Foreman gem version

Options:
  -f, [--procfile=PROCFILE]  # Default: Procfile
  -d, [--root=ROOT]          # Default: Procfile directory
```

## Procfile を配置
アプリケーションで管理するプロセスを Procfile に記述し、アプリケーションルートに配置。

## Procfile の書き方
```
<process type>: <command>
```
process type : web, worker, clock などが代表的で、名前はなんでもよい。
(Heroku では web は特別で、この名前が Heroku ルータからの HTTP を受け付ける。)

```rb:Procfile
web: bundle exec rails server -p $PORT  # rails 起動($PORTは5000がデフォ)
worker: bundle exec rake jobs:worK      # バッチ起動
redis: bundle exec redis-server /usr/local/etc/redis.conf  # Redis 起動
```

## 確認
Procfile の設定が有効かを確かめる

```
$ foreman check
```


## 起動
```
$ foreman start
```
これで、Procfile に設定したすべてのプロセスを一度に起動することができる。
終了は ```Ctrl + c```

## オプション
### -f 
環境ごとに Procfile を変えたいときは -f オプションでファイルを指定する。

```
$ foreman start -f Procfile.dev
```

### -c
並列して実行するプロセス数を指定する。

```
$ foreman start -c worker=2
```

### -p
ポートを指定して起動する（デフォルトでは $PORT は 5000から）

```
$ foreman start -p 3000
```

### -d
ディレクトリを指定できるっぽいけど、ほとんど使わないと思う。

### -e (.env)
.env を読み込んで起動。
環境変数とかをここ宣言しておくと便利。

```rb:.env
APP_ID="xxxxxxxxx"
```

設定した環境変数は、rubyであれば

```
$ foreman run pry
[1] pry(main)> puts ENV["APP_ID"]
xxxxxxxxx
=> nil
```

で確認できる。

###.foreman

```rb:.foreman
port: 3000
```
foreman コマンドのデフォルトオプション指定などは、.foremanファイルに記述することで、起動時に自動的に設定できる。

※これらのファイルは .gitignore に設定してコミットしないよう気をつける。

# 参考・引用
>
- Process Types and the Procfile | Heroku Dev Center : https://devcenter.heroku.com/articles/procfile#developing-locally-with -foreman
- foreman(1) - manage Procfile-based applications : http://ddollar.github.io/foreman/
- #281 Foreman - RailsCasts : http://railscasts.com/episodes/281-foreman?language=ja&view=asciicast
- foreman について - 君の瞳はまるでルビー - Ruby 関連まとめサイト : http://www.ownway.info/Ruby/index.php?foreman%2Fabout
Linux コマンド #01


### lsusb
```bash
$ lsusb
```
USBデバイスの情報を表示する

### lspci
```bash
$ lspci
```
PCIデバイスの情報を表示する。

### lsmod
```bash
$ lsmod
```
ロードされているカーネルモジュール(デバイスドライバ)を確認する。

### modprobe
```bash
$ modprobe
```
手動でデバイスドライバをロードする。

### dmesg
```bash
$ dmesg
```
システム起動時のログを出力する。
※カーネルが出力したメッセージを一時的に蓄えておくバッファの内容を表示する。
長時間稼動しているシステムではログが残っていない場合もある。

### runlevel/init
```bash
# runlevel 
N 3
# init 1
```
runlevel：現在のランレベルの表示
init：ランレベルの変更

### shutdown
```bash
$ shutdown [オプション] 時間 [メッセージ]

システム停止
$ shutdown -h now

システム再起動
$ shutdown -r now
```
システムのシャットダウンや再起動を行う。

|オプション|説明|
|:--|:--|
|-h|シャットダウン完了後にシステムを停止する|
|-r|シャットダウン完了後にシステムを再起動する|
|-k|実際にシャットダウンせず警告メッセージを通知|

### grub-install
```bash
$ grub-install

GRUBのバージョン確認
$ grub-install -v
```
GRUBのインストール実行

### ldd
```bash
$ ldd
```
実行ファイルが必要としている共有ライブラリの確認

### ldconfig
```bash
$ ldconfig
```
共有ライブラリの設定ファイル「/etc/ld.so.conf」を変更後、または共有ライブラリを変更したときに、共有ライブラリのキャッシュファイルを更新する為に実行する。

Template
### 
```bash
$ 
```
Nginx でリバースプロキシサーバーつかってみる。Apache -> Nginx (Apache2.4向けに再編集)

# Apache2.4向けに再編集しました
「mod_rpaf ⇒ mod_remoteip」に

# やっと Nginx を触ってみる
Nginx 勉強用に買った本が埋もれてました。そのうちと・・・思っていたら。すでに２年が経過しとった。

現在,我が家の構成として グローバル IP アドレスが一つしかないため複数のドメインを VirtualHost で運用してる状況。Nginx に全て置き換えてもいいのだけどここは Nginx -> Apache と多段にしてみる勉強がてらリバースプロキシサーバーとして設定してみる（そもそも Nginx が軽快で速いという理由は[静的コンテンツを高速で配信する設計思想](http://www.atmarkit.co.jp/ait/articles/1406/17/news013.html)なところは理解しているつもり）。

# 
![nginx.png](https://qiita-image-store.s3.amazonaws.com/0/44540/829fcf0a-cb76-4ca9-72b2-5d69c31f5f4b.png)

# リバースプロキシサーバーの設定ポリシー
リバースプロキシサーバーとして動作させるホストに Nginx をインストールする。またDNS設定済みででサブドメインが引けている状態であること、既存 Apache の設定は変更せずなどあるけど基本的には、問題があればすぐに戻せる構成にしてみる。

![nginx2.png](https://qiita-image-store.s3.amazonaws.com/0/44540/d55ee09c-767f-053a-2a10-d02117bbff8d.png)
 

# インストール
とりあえず特別な機能を使う用途がないのであれば、パッケージ版をインストールするのがベスト。当たり前ですがパッケージ版の Nginx では、デフォルトの機能しかインストールされていないので、拡張したい場合はソースからコンパイルすること（nginx -V で機能をみることができる）。

> [CentOS6.xにてnginxの最新版をインストールする手順](http://qiita.com/utano320/items/0c0d9b84a9a28525bcb9)

# 設定ファイル 
/etc/nginx/conf.d の下に適当なファイル名で configファイルを作成します。

```
server {
    listen 80;
    server_name バーチャルホスト名;　← 外部から引けること

    proxy_set_header    X-Real-IP       $remote_addr;
    proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header    Host            $http_host;
    proxy_redirect      off;
    proxy_max_temp_file_size    0;

    location / {
        proxy_pass http://192.168.11.88;
    }
}
```

# Nginxでバージョン情報を隠す
公開サーバは色々と情報を公開すべきではないので、バージョン情報を隠しておきます。

```
http {
  server_tokens off;
  ...
```

# mod_remoteip の設定
後記の `mod_rpaf` は、Apache 2.4 で使用にはコツがいるので Apache2.2 から標準モジュールとなった `mod_remoteip` を使用する。

設定方法は `RemoteIPHeader X-Forwarded-For` を `/etc/httpd/conf/httpd.conf` の最後にでも指定しておけばよい。

アクセスログ指定 `LogFormat` 部分の定義を以下のように変更する。
※%a を指定するとアクセス元IP が出力されます。

```text
LogFormat "%h ・・・・
↓
LogFormat "%a ・・・・
```

> [mod_remoteip を使って LB 配下の Apache もアクセス元 IP を正しく認識できる](https://blog.yskw.info/articles/256/)

# mod_rpaf のインストール(Apache2.4非推奨)
リバースプロキシサーバーから転送された情報を Apache側で受け取るとリバースプロキシサーバーのアドレス(192.168.11.88)が記録されてしまうため具合が悪いので、Apache側 に mod_rpaf モジュールをインストールする。
⇒ Apache 2.4 で使用する場合ちょっとコツがいるので mod_remoteip を使う

> [リーバスプロキシ／ロードバランサとmod_rpaf](http://heartbeats.jp/hbblog/2012/03/mod-rpaf.html)
> [nginx+apacheでちょっぴり快適なWebサーバーを目指してみる](http://havelog.ayumusato.com/develop/server/e198-nginx-with-apache.html)
> [nginxでリバースプロキシ先にホスト名が引き継がれない](http://blog.fujimuradaisuke.com/post/12622482560/nginx)

# Nginx を触ってみて
Nginx 少し毛嫌いしてた感じもあるけど設定ファイルは直感的で判りやすいのでいいかも。
意外と簡単にリバースプロキシサーバーの設定もできるもんだなと思った次第。

# Rewrite
Apache だけど毎回忘れるのでRewriteのリンクメモ

> [Apache Rewrite 学習](http://weblabo.oscasierra.net/apache-rewrite-1/)

# 参考サイト
> [nginx でリバースプロキシするときの Tips](http://blog.akagi.jp/archives/3883.html)
> [仮想CentOSのnginx+Apach2でリバースプロキシ](http://sonicnotes.tumblr.com/post/56255167207/centos-nginx-apach2)
> [nginx連載3回目: nginxの設定、その1](http://heartbeats.jp/hbblog/2012/02/nginx03.html)
> []()
チーム開発の様々なフローを整理する（未完成）（途中）


いろんな開発現場を見てきましたが、100の現場には100通りのやり方があります。
バージョン管理だけでもGit、Subversion、VSS、CVSなど。
さすがに、バージョン管理ソフトを導入していない現場にないとは思いますが
開発フローを構築しやすくなってきたものの、情報が多すぎて何を利用すべきか
迷うことが多いのも事実です。
そこでチーム開発を行うにあたり、さまざまツールの各種機能を整理してみました。

# 整理する前に大事なこと
## チーム開発って何よ？
チーム開発って、一人で開発するのでなく、みんなで開発することでしょ？
はい、その通りです。もう少し自分なりに具体的にしてみると

* いつまでに・誰が・何を完了させるのか、管理・共有する
* ドキュメント、ソースコードなど成果物を管理・共有する
* 複数人で同じソースやドキュメントを並行作業しても問題ないこと
* メンバーの入れ替わりがあっても、開発および運用が引き続き可能であること
* 得られた知識を共有して、成長しあえる環境であること

と、考えてます。

## ベストプラクティスはない
少人数で小規模の開発をすることもあれば、大人数で大規模システムもあるということは
当然導入すべきツールも異なります。小規模の運用であれば、バージョン管理とメールソフト
だけで良いということもあるということです。
つまり利用すべきソフトはケースバイケースということになります。
CentOSにPHP5.6をインストール


remi(Les RPM de Remi - Repository)のrpmパッケージを使います。
http://rpms.famillecollet.com/

epelとremiのリポジトリを追加します。CentOS 6.5 (6系)用です。

```
# For CentOS 6.5, 6.4, ...
% sudo rpm -Uvh http://ftp.iij.ad.jp/pub/linux/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm
% sudo rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
```

CentOS 7.0用。

```
# For CentOS 7.0
$ sudo rpm -Uvh http://ftp.iij.ad.jp/pub/linux/fedora/epel/7/x86_64/e/epel-release-7-5.noarch.rpm
% sudo rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
```

yum listで提供されているパッケージを確認できます。

```
% yum list --enablerepo=remi --enablerepo=remi-php56 | grep php
```

ではPHP5.6をインストールします。

```
% sudo yum install --enablerepo=remi --enablerepo=remi-php56 php php-opcache php-devel php-mbstring php-mcrypt php-mysqlnd php-phpunit-PHPUnit php-pecl-xdebug php-pecl-xhprof
```

phpコマンドのバージョン確認。

```
% php --version
PHP 5.6.0 (cli) (built: Sep  3 2014 19:51:31)
Copyright (c) 1997-2014 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2014 Zend Technologies
    with Zend OPcache v7.0.4-dev, Copyright (c) 1999-2014, by Zend Technologies
    with Xdebug v2.2.5, Copyright (c) 2002-2014, by Derick Rethans
```
Unityプロジェクトフォルダー構成


# 動機
Unityを起動し新しいプロジェクトを作ると、各種ファイル/フォルダーが作られますが、それぞれのファイルがどのような意味を持ったファイルなのか知りたい

# プロジェクトフォルダー構成

![Sample.png](https://qiita-image-store.s3.amazonaws.com/0/30079/2387d042-2f67-f493-6aae-07b358e7e693.png)

* Assembly-CSharp-vs.csproj: Visual Studio用のプロジェクトファイル
* Assembly-CSharp.csproj: MonoDevelop用のプロジェクトファイル
* Assembly-UnityScript-vs.unityproj: JavaScript用のVisual Studioプロジェクトファイル
* Assembly-UnityScript.unityproj: JavaScript用のMonoDevelopプロジェクトファイル
* testproject.sln: IDE用のソリューションファイル
* testproject-csharp.sln: C#用のIDEソリューションファイル
* Sample.userprefs: MonoDevelop用の設定ファイル。ブレークポイントなども含む。
* Assets: 省略
* Library: インポートしたアセットのローカルキャッシュ
* ProjectSettings: UnityのEditorで設定されたものが入っている。物理、タグ、Unityプレイヤー設定など。

[参考: MASTERING UNITY PROJECT FOLDER STRUCTURE - VERSION CONTROL SYSTEMS](http://unity3d.com/learn/tutorials/modules/beginner/architecture/folders-in-version-control)

## お知らせ

Unityで四字熟語クイズアプリを作りました！

**クワトロ〜激ムズ四字熟語クイズ**

ちょっと知的な暇つぶし
クイズ形式の四字熟語を答えて楽しく脳トレ！全部で３４３問

[ストアリンク](http://bit.ly/1qmx27E)
タッチイベントを使う基本（Cocos Code IDE, Lua言語）


Cocos Code IDEを使ってLua言語でタッチイベントを使う基本をまとめました。
プロジェクトの新規作成されるサンプルアプリを参考にしています。

|実行環境、IDE|Cocos2d-xバージョン|言語|
|:--|:--|:--|
|Cocos Code IDE Mac OS X 1.0.0-RC2|Cocos2d-x V3.2|Lua言語|

## サンプルコード

プロジェクトの新規作成で作成されるGameScene.luaのGameScene.create()を書き換えます。

```lua:GameScene.lua/GameScene.create
function GameScene.create()
    local scene = GameScene.new()

    -- タッチイベントで呼ばれる関数
    local function onTouchBegan(touch, event)
        local location = touch:getLocation()
        print(string.format("location = %0.2f, %0.2f", location.x, location.y)) -- この行は確認のためログに表示するためのもので、必要ありません。
        return true -- beganはtrueを返すようにする
    end

    local function onTouchMoved(touch, event)
    end

    local function onTouchEnded(touch, event)
    end

    -- タッチイベントの登録
    local listener = cc.EventListenerTouchOneByOne:create()
    listener:registerScriptHandler(onTouchBegan, cc.Handler.EVENT_TOUCH_BEGAN )
    listener:registerScriptHandler(onTouchMoved, cc.Handler.EVENT_TOUCH_MOVED )
    listener:registerScriptHandler(onTouchEnded, cc.Handler.EVENT_TOUCH_ENDED )

    local eventDispatcher = scene:getEventDispatcher()
    eventDispatcher:addEventListenerWithSceneGraphPriority(listener, scene)
    
    return scene
end
```

実行しても画面上は真っ黒な画面だけで何も表示されませんが、画面をタッチ（クリック）すると座標位置がログに表示されます。

## 解説
### タッチイベントで呼び出される関数の準備

タッチイベントで呼び出される関数を準備します。関数名は何でもいいですが、ここではサンプルプログラムにならっています。

```lua:
-- タッチイベントで呼ばれる関数
local function onTouchBegan(touch, event)
    return true -- beganはtrueを返すようにする
end

local function onTouchMoved(touch, event)
end

local function onTouchEnded(touch, event)
end

```

### イベントの登録

タッチイベント時に上記の関数を呼ぶように登録します。

```lua:
-- タッチイベントの登録
local listener = cc.EventListenerTouchOneByOne:create()
listener:registerScriptHandler(onTouchBegan, cc.Handler.EVENT_TOUCH_BEGAN )
listener:registerScriptHandler(onTouchMoved, cc.Handler.EVENT_TOUCH_MOVED )
listener:registerScriptHandler(onTouchEnded, cc.Handler.EVENT_TOUCH_ENDED )

local eventDispatcher = scene:getEventDispatcher()
eventDispatcher:addEventListenerWithSceneGraphPriority(listener, scene)
```

### タッチした座標の取得

タッチした座標の取得はonTouchBegan内等で、

```lua:
local location = touch:getLocation()
print(string.format("location = %0.2f, %0.2f", location.x, location.y)) -- この行は確認のためログに表示するためのもので、必要ありません。
```

とします。

## タッチイベントの削除

登録したタッチイベントの削除方法です。

```lua:
-- listenerのイベントを削除する時
eventDispatcher:removeEventListener(listener)
-- sceneのすべてのイベントを削除する時は、
--eventDispatcher:removeEventListenersForTarget(scene)
```
パーティクルを使う方法（Cocos Code IDE, Lua言語）


Cocos Code IDEを使ってLua言語で、パーティクルを扱う方法です。
炎や爆発、火花などの視覚効果として利用することができます。

|実行環境、IDE|Cocos2d-xバージョン|言語|
|:--|:--|:--|
|Cocos Code IDE Mac OS X 1.0.0-RC2|Cocos2d-x V3.2|Lua言語|

## サンプルコード

プロジェクトの新規作成で作成されるGameScene.luaのGameScene.create()を書き換えます。

```lua:GameScene.lua/GameScene.create
function GameScene.create()
    local scene = GameScene.new()

    local particle = cc.ParticleSystemQuad:create("res/particle_texture.plist")
    particle:setPosition(150, 200)
    particle:setScale(0.3)
    scene:addChild(particle)

    return scene
end
```


パーティクルはこちらのサイトで作成しました。[Particle2dx](http://particle2dx.com/)

作成されたparticle_texture.plistとparticle_texture.pngファイルをresディレクトリにコピーします。

![ss.png](https://qiita-image-store.s3.amazonaws.com/0/45447/e9e4af3c-1e50-695b-1b0c-b09c0a70c636.png "ss.png")

実行するとパーティクルが表示されるはずです。

パーティクルは、ゲーム制作の視覚効果向上に大変役立つはずです。
パラパラアニメーション基本（Cocos Code IDE, Lua言語）


Cocos Code IDEを使ってLua言語でパラパラアニメーションをするための基本をまとめました。
Code IDEのプロジェクトの新規作成で作られるサンプルプログラムを参考にして、少し手を加えています。

|実行環境、IDE|Cocos2d-xバージョン|言語|
|:--|:--|:--|
|Cocos Code IDE Mac OS X 1.0.0-RC2|Cocos2d-x V3.2|Lua言語|

## サンプルコード

プロジェクトの新規作成で作成されるGameScene.luaのGameScene.create()を書き換えます。

```lua:GameScene.lua/GameScene.create
function GameScene.create()
    local scene = GameScene.new()

    visibleSize = cc.Director:getInstance():getVisibleSize()
    
    -- テクスチャの作成
    local texture = cc.Director:getInstance():getTextureCache():addImage("texture.png")

    -- スプライトフレームの作成
    local frame0 = cc.SpriteFrame:createWithTexture(texture, cc.rect(0, 0, 256, 256))
    local frame1 = cc.SpriteFrame:createWithTexture(texture, cc.rect(256, 0, 256, 256))

    -- スプライトの作成
    local sprite = cc.Sprite:createWithSpriteFrame(frame0)

    -- アニメーションの作成
    local animation = cc.Animation:createWithSpriteFrames({frame0,frame1}, 0.8) -- 0.8はアニメーションを切り替える秒数
    local animate = cc.Animate:create(animation)
    sprite:runAction(cc.RepeatForever:create(animate))
    
    -- スプライトの位置を設定
    sprite:setPosition(visibleSize.width / 2, visibleSize.height / 2)

    -- シーンに加える
    scene:addChild(sprite)
    
    return scene
end
```

テクスチャ画像としてtexture.pngファイルをresディレクトリにコピーします。
画像は[キャラクターなんとか機Web版](http://character-nantoka.appspot.com/)で作りました。
（本番用には自分で書くべきでしょうが、テスト用の画像にすぐ用意したい時は大変重宝します。）

![texture.png](https://qiita-image-store.s3.amazonaws.com/0/45447/81560abc-3c4e-f333-141e-f1fb14bccc74.png "texture.png")texture.png


テクスチャは256x256の大きさの画像を横に２つ並べています。
![ss.png](https://qiita-image-store.s3.amazonaws.com/0/45447/bd3d3ddc-2c40-cfaa-f238-d9d5dd9b793e.png "ss.png")
実行してキャラクターがまばたきするアニメーションをすればOKです。

## アニメーションの手順

アニメーションの手順は

1. テクスチャからアニメーションのコマ数だけスプライトフレームを作る
2. スプライトを作成してアニメーションを設定する
3. スプライトの表示位置を指定してレイヤに加える

になります。手順が多いですが、ゲーム制作には避けて通れない部分です。

### 1 テクスチャからアニメーションのコマとなるフレームを作る

```lua:
-- テクスチャの作成
local texture = cc.Director:getInstance():getTextureCache():addImage("texture.png")

-- スプライトフレームの作成
local frame0 = cc.SpriteFrame:createWithTexture(texture, cc.rect(0, 0, 256, 256))
local frame1 = cc.SpriteFrame:createWithTexture(texture, cc.rect(256, 0, 256, 256))
```

テクスチャをアニメーションのコマで1つずつ切り出しています。

### 2 スプライトを作成してアニメーションを設定する

```lua:
-- スプライトの作成
local sprite = cc.Sprite:createWithSpriteFrame(frame0)

-- アニメーションの作成
local animation = cc.Animation:createWithSpriteFrames({frame0,frame1}, 0.8) -- 0.8はアニメーションを切り替える秒数
local animate = cc.Animate:create(animation)
sprite:runAction(cc.RepeatForever:create(animate))
```

スプライトを作成してアクションを設定しています。
スプライトフレームの配列とアニメーションを切り替える時間を指定してアニメーションを作成して、それを無限に繰り返しています。

### 3 スプライトの表示位置を指定してシーンに加える

```lua:
-- スプライトの位置を設定
sprite:setPosition(visibleSize.width / 2, visibleSize.height / 2)

-- シーンに加える
scene:addChild(sprite)
```

表示する位置を指定して、シーンに配置して画面に表示します。
brew caskでインストールしたIntelliJ IDEAがクラッシュする問題を解決した

# 環境
- IntelliJ IDEA(commnity edition): 13.1.4
- Mac OS X: 10.9.4
- java: 1.7.0_67

# 現象
scala pluginを入れたIntelliJ IDEA(community edition)でscala projectを開きcommand+shift+nのファイル名検索でファイルを開こうとするとクラッシュする。

# 対策
`/opt/homebrew-cask/Caskroom/intellij-idea-ce/13.1.4b/IntelliJ IDEA 13 CE.app/Contents/Info.plist`の

```
      <key>JVMVersion</key>
      <string>1.6+</string>
```

となっているところを

```
      <key>JVMVersion</key>
      <string>1.6*</string>
```

にする(`+`を`*`にする)
あとjava6をインストールする。

```
brew cask install java6
```

これで直った。

# 考察
brew caskではなく、普通にjetbrainのページからダウンロードすると、`JVMVersion`の値は`1.6*`になっている。brew caskでインストールするときにここを書き換えているっぽい。
https://github.com/caskroom/homebrew-cask/blob/master/Casks/intellij-idea-ce.rb#L11

何かしら理由はあるのだろうけれど、ファイル検索（あとクラス検索とかも）が使えないとなると何もできないのでjava6を使わざるを得ない。ちなみに他のPCではこんなことせずに動いた。何がクリティカルな原因なのは分からない。

あと一応java8も使えるらしいけど、使えたら中で何使っててもいいのでやめとく。

```
$ brew cask info intellij-idea-ce
intellij-idea-ce: 13.1.4b
https://www.jetbrains.com/idea/index.html
/opt/homebrew-cask/Caskroom/intellij-idea-ce/13.1.4b (940 files, 333M)
https://github.com/caskroom/homebrew-cask/blob/master/Casks/intellij-idea-ce.rb
==> Contents
  IntelliJ IDEA 13 CE.app (link)
==> Caveats
intellij-idea-ce may require Java 7 (an older version) available from the
caskroom-versions repo via

    brew cask install caskroom/versions/java7

Alternatively, intellij-idea-ce can be modified to use Java 8 as described in

    https://github.com/caskroom/homebrew-cask/issues/4500#issuecomment-43955932
```
[java8] 2回目：ラムダ式と関数型インタフェース

前回のサンプルコードを参考に、ラムダ式と関数型インタフェースの関係を見てみます。
[前回：ラムダ式で降順ソートを書いてみよう](http://qiita.com/yuusuke_s/items/a24e1fb056de450a50b2)

## 関数型インタフェース
### Consumerインタフェース

前回の出力用のメソッドです。

``` java
	private static void printList(List<String> list) {
		list.forEach(program -> System.out.println(program));
	}
```

繰り返しに使われる*forEach*メソッドは、*Consumer*インタフェースを引数に取ります。
JavaDocを覗いてみると、、、

``` java
@FunctionalInterface
public interface Consumer<T> {

    /**
     * Performs this operation on the given argument.
     *
     * @param t the input argument
     */
    void accept(T t);
    ・・・
```

* @FunctionalInterfaceが付与されており、これは関数型インタフェースを表す
* 関数型インタフェースは、ただ１つの抽象メソッドを持つ

となっています。
つまり、関数型インタフェースに対して、ラムダ式を適用できそうですね！

### 他の関数型インタフェースの例
#### 1.8で追加されたもの
* [Interface Function\<T,R>](http://docs.oracle.com/javase/8/docs/api/java/util/function/Function.html) ：1つの引数を受け取って結果を返す抽象メソッドを持つ
* [Interface BiFunction\<T,U,R>](http://docs.oracle.com/javase/8/docs/api/java/util/function/BiFunction.html)　：2つの引数を受け取って結果を返す抽象メソッドを持つ
* [Interface Predicate\<T>](http://docs.oracle.com/javase/8/docs/api/java/util/function/Predicate.html)　：1つの引数を受け取る条件式を持つ
* [Interface BiPredicate\<T,U>](http://docs.oracle.com/javase/jp/8/api/java/util/function/BiPredicate.html)　：2つの引数を受け取る条件式を持つ

#### 1.8以前から存在する以下も、関数型インタフェースの一部
* [Interface Comparator\<T>](http://docs.oracle.com/javase/8/docs/api/java/util/Comparator.html)
* [Interface Runnable](http://docs.oracle.com/javase/8/docs/api/java/lang/Runnable.html)

## 最後に
ラムダ式と関数型インタフェースの関係が分かりました。
ただ、記述は簡略化されるが、それほど旨味は感じないですね。

どうやら、Java8で追加された**Stream API**と組みわせると・・！？
では、次回。
Gin Web Frameworkを試してみたよ

## GitHub

[osamingo/golang-gin-example](https://github.com/osamingo/golang-gin-example)

## Install Go

`Go`をインストールする。

```shell-session
$ brew update
$ brew install go --cross-compile-all
```

`launchctl`に登録する。

```text:/etc/launchd.conf
setenv GOROOT /usr/local/Cellar/go/1.3.1/libexec
setenv GOPATH $HOME/.go
```

```shell-session
$ launchctl < /etc/launchd.conf
```

## Run golang-gin-example

パッケージマネージャに[goop](https://github.com/nitrous-io/goop)を使用しているので、インストールする。

```shell-session
$ go get github.com/nitrous-io/goop
```

対象のリポジトリをクローンする。

```shell-session
$ git clone git@github.com:osamingo/golang-gin-example.git
```

ディレクトリを移動して、依存関係を解決する。
`goop`コマンドが見つからない場合は、`$GOPATH/bin/goop`とかに存在するので`PATH`を通す。

```shell-session
$ cd golang-gin-example
$ goop install
```

`go run`で動かす。

```shell-session
$ goop go run src/main.go
```

起動後、`http://localhost:8080/ping`に繋がるか確認できればOKです。

## Install IntelliJ IDEA & Golang plugin

### IntelliJ IDEA

DL site: [IntelliJ IDEA - The Best Java and Polyglot IDE](http://www.jetbrains.com/idea/)

上記のサイトから、通常通りインストールする。

### Install Golang plugin

EAP DL site: [@dlsniper's dropbox](https://www.dropbox.com/sh/kzcmavr2cmqqdqw/j8wjp8SdNH) (@via/  [go-lang-plugin-org/go-lang-idea-plugin](https://github.com/go-lang-plugin-org/go-lang-idea-plugin))

最新版のプラグインを使用したいので、作者のDropboxからEAPの`jar`をDLする。

![install-plugin-from-jar](https://raw.githubusercontent.com/osamingo/golang-gin-example/master/img/install-plugin-from-jar.png)

上記のハイライトしているボタンを押下してインストールする。

## Start IntelliJ IDEA

コマンドラインから起動しないと、何故か`GOROOT`を見てくれないので、`open`コマンドで起動する。

```
$ open /Applications/IntelliJ\ IDEA\ 13\ CE.app
```

起動後、`Import Project...`からプロジェクトをインポートする。

![import-project-one](https://raw.githubusercontent.com/osamingo/golang-gin-example/master/img/import-project-one.png)

![import-project-two](https://raw.githubusercontent.com/osamingo/golang-gin-example/master/img/import-project-two.png)

![import-project-three](https://raw.githubusercontent.com/osamingo/golang-gin-example/master/img/import-project-three.png)

インポート後、`Shift + Command + A`で、`Find Action`を起動させる。

![edit-configurations](https://raw.githubusercontent.com/osamingo/golang-gin-example/master/img/edit-configurations.png)

`.vendor`に`GOPATH`を通す。

![edit-configurations-detail](https://raw.githubusercontent.com/osamingo/golang-gin-example/master/img/edit-configuration-detail.png)

`main.go`を右クリックし、起動させる。

![run-main](https://raw.githubusercontent.com/osamingo/golang-gin-example/master/img/run-main.png)

起動後、`http://localhost:8080/ping`に繋がるか確認できればOKです。
[java8] 1回目：ラムダ式で降順ソートを書いてみよう

java8で新規に追加されたラムダ式を、まずは触ってみるのが目的です。

## 事前準備
java8が必要なので、まだの場合はインストールしましょう。
[インストールはココ](http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html)

## ラムダ式って何だろう
>ラムダ式を使用することでこれまで匿名クラスとして実装していたような処理を簡単に記述できるようになる
>また、コレクションAPIでもラムダ式を活用した新たなAPIが追加されているなど、
>ラムダはJava 8において非常に大きな役割を果たしている。

と書いてあります。がよく分からないですね(^^;
サンプルコードを見ながら考えてみることにします。

## サンプルコード
プログラミング言語名のリストを、降順に並び替えて出力するサンプルです。
*Comparator*インタフェースの辺りがキモですね。

``` java
public class SmapleCompare {

	/**
	 * プログラミング言語を降順に並べるサンプル
	 */
	public static void main(String[] args) {
		// 1.7までの書き方
		List<String> list = createList();
		list.sort(new Comparator<String>() {

			@Override
			public int compare(String o1, String o2) {
				return o2.compareTo(o1);
			}
		});
		printList(list);

		// ラムダ式を使った書き方
		list = createList();
		list.sort((o1, o2) -> o2.compareTo(o1));
		printList(list);
	}

	private static List<String> createList() {
		return Arrays.asList("C++", "java", "scala", "php");
	}

	private static void printList(List<String> list) {
		for(String program : list) {
			System.out.println(program);
		}
		System.out.println();
	}
}
```

記述量がだいぶ短くなっていますね。
ついでに、出力部分もラムダ式で置き換えてみましょう。

``` java
	private static void printList(List<String> list) {
		list.forEach(program -> System.out.println(program));
	}
```

1行でスッキリ！

## 最後に
次回は、上記のサンプルを参考に、なぜラムダ式を適用できるのか？
あたりを考えてみようと思います。
Go言語を学ぶ


## Go言語とは
* 2009年にGoogle社が開発した、オープンソースのコンパイル型言語

## Go言語の特徴
* クラスやインターフェースがあり、クラスベースオブジェクト指向言語
* コンパイル、処理速度が高速
* 静的型値付け
* __並列処理__が簡単

## Go言語を学ぶきっかけ
* 新しい言語
* DevOps活動として用いられる[Docker](https://www.docker.com/)もGo言語で書かれている->トレンド
* C++、PHPをメインにやってきた人間にとって、簡単に並列処理ができるのは魅力的

## どうやって学んでく？
* amazonランキングで高評価の書籍をささっと一通り読む
* ドキュメントが充実してそう（まだ未実装なので不明だけど）
* とにかく手を動かす


## 目標
* PHPとC言語で書かれたDB書き込む処理を、Goに移行する
* POSTなど何らかの処理を並列かしてみる
AngularJSでInterceptorのHeaderはどのようにテストするか？


例えば\$httpのリクエストをインターセプトして、Authorizationヘッダーにトークンを付与するInterceptorを作成したとする。

この場合、このInterceptorのサービスをどのようにテストするのがよいのか？

で、調べたら大変素晴らしい記事があったのでそちらを参考にテストを書いた。

トークンを管理しているサービス、Authorizationヘッダーを付与するInterceptorサービス、モックの\$httpBackend,あとはInterceptorが登録されているはずの \$httpProviderを読み込んでる。

```auth_interceptor_spec.coffee
'use strict'

describe 'Service: AuthInterceptor', ->
  $httpProvider = {}
  beforeEach module 'gambaApp', (_$httpProvider_)->
    $httpProvider = _$httpProvider_
    return

  AuthInterceptor = {}
  AuthToken = {}
  $httpBackend = {}
  beforeEach inject (_AuthInterceptor_, _AuthToken_, _$httpBackend_) ->
    $httpBackend = _$httpBackend_
    AuthInterceptor = _AuthInterceptor_
    AuthToken = _AuthToken_
  
  afterEach inject (_AuthToken_) ->
    _AuthToken_.clear()

  token = 'SecureToken'
  tokenString = "Token token=\"#{token}\""

  it "AuthInterceptorが定義されていること", ->
    expect(AuthInterceptor).toBeDefined()

  it "AuthInterceptorがインターセプターに登録されていること", ->
    expect($httpProvider.interceptors).toContain "AuthInterceptor"

  it 'トークンがセットされていない場合Authorizationがセットされていないこと', ->
    config = AuthInterceptor.request({headers: {}})
    expect(config.headers.Authorization).toBeUndefined()

  it 'トークンが保持されている場合setting後Authorizationにセットされること', ->
    AuthToken.setToken(token)
    config = AuthInterceptor.request({})
    expect(config.headers.Authorization).toBe tokenString

  it 'トークンが保持されて通信されるときはAuthorizationにセットされていること', ->
    AuthToken.setToken(token)
    $httpBackend.whenGET('/api/users', (headers)->
      expect(headers.Authorization).toBe tokenString
    )
```

#### 参考

- [Testing Interceptor Headers in AngularJS](http://jbavari.github.io/blog/2014/06/20/testing-interceptor-headers-in-angularjs/)
VisualforceでD3.jsによるグラフの描画を試してみました

![スクリーンショット 2014-09-14 16.22.18.png](https://qiita-image-store.s3.amazonaws.com/0/8407/24c16272-6d91-f40c-4361-ad1fcff875fa.png)

勉強用に購入した本に記載されていたサンプルコードを使用してVisualforceページでのグラフ描画を試してみました。試してみて少し悩んだことが2つ。一つはURLを指定したD3.jsの読み込みで発生したエラーです。

もしかしてと思ってURLではなく静的リソースにアップロードしたファイルを読み込ませたら正常に実行できました。Salesforce StackExchangeでも同じ方法で回避していると投稿がありました。

>How to integrate D3.JS with Visual force
>http://salesforce.stackexchange.com/questions/44634/how-to-integrate-d3-js-with-visual-force


もう一つはVisualforceページで表示したときだけ、レイアウトが崩れる現象です。

こちらは、ページ内のhタグが原因でした。VFページではhタグがブロック要素として認識されないので、CSSでブロック要素として扱うように宣言する必要があります。

VFページでCSSを扱うときですが、迂闊に要素のスタイルを変更すると標準のスタイルに影響がでてしまうことがあります。divタグで囲って指定ID内の要素に対してスタイルを適用という形にするのが一番安全だと思います。

```
<apex:page showHeader="true">
    <head>
        <title>横棒グラフ</title>
        <apex:includeScript value="{!$Resource.d3minjs}" />
        <style type="text/css">
            #vf-page h1,
            #vf-page h2,
            #vf-page h3,
            #vf-page h4,
            #vf-page h5,
            #vf-page h6 {
                display: block;
            }            
        </style>
    </head>
    <body>
        <div id="vf-page">
            <h1>横棒グラフ</h1>
            <svg id="myGraph"></svg>
        </div>
        <!-- Js -->
        <script type="text/javascript">
            // 横棒グラフのデータ
            var dataSet = [300, 130, 5, 60, 240];
            // データに基づいて描画する
            d3.select('#myGraph')
                .append('rect')
                .attr('x', 0)
                .attr('y', 0)
                .attr('width', dataSet[0])
                .attr('height', '20px');
        </script>
    </body>
</apex:page>
```
gl-rsがビルドできなかった #solved

# はじめに

昨日、Rustでglfw経由でMacのウィンドウを作成できて浮かれていたが、
ウィンドウの内部への描画は別途gl-rsなど、OpenGL APIをバインドしたライブラリが必要な模様

# gl-rsでビルドエラー

```
Could not compile `khronos_api`.
```

# Work around

```
git clone https://github.com/scoopr/khronos-api.git
```

中の

- egl.xml
- gl.xml
- wgl.xml
- glx.xml

をgl-rsのソースツリーにコピー

```bash
cd gl-rs
cp ../khronos-api/egl.xml deps/khronos-api/
cp ../khronos-api/gl.xml deps/khronos-api/
cp ../khronos-api/wgl.xml deps/khronos-api/
cp ../khronos-api/glx.xml deps/khronos-api/
```

## コードの修正

```
cargo build
```

エラーが出る。

OpenGLのバージョンの指定らしき4.5を4.1に変える。
(MavericksのOpenGLが4.1のだったので、これを指定した。)

lib.rsや他のエラーが出たファイルを以下のように編集。

```diff
- generate_gl_bindings!("gl", "core", "4.5", "global", [ "GL_EXT_texture_filter_anisotropic" ])
+ generate_gl_bindings!("gl", "core", "4.1", "global", [ "GL_EXT_texture_filter_anisotropic" ])
```
```
cargo test
```

まだ、エラーが出るが、

```
./target/struct_triangle
```

など動かせた。

<img src="https://pbs.twimg.com/media/BxdAHB0CAAAyepk.jpg:large">
Swift学習メモ vol.2


###StoryBoardに慣れる。

###Step1 ViewControllerを並べる

![Screen Shot 2014-09-14 at 3.19.39 PM.png](https://qiita-image-store.s3.amazonaws.com/0/15925/d547a948-3b12-aa9f-3d46-88f023226b30.png "Screen Shot 2014-09-14 at 3.19.39 PM.png")

###Step2 UIViewControllerファイルを新しく作成する
![Screen Shot 2014-09-14 at 3.22.18 PM.png](https://qiita-image-store.s3.amazonaws.com/0/15925/00b88f76-51e5-a9d8-c6fa-dea658b2ed32.png "Screen Shot 2014-09-14 at 3.22.18 PM.png")

クラス名はViewController2としました。

###Step3 Step1で作成したViewControllerのカスタムクラスをViewController2とする。

![Screen Shot 2014-09-14 at 3.26.57 PM.png](https://qiita-image-store.s3.amazonaws.com/0/15925/095d1d8e-ca04-06d9-991a-dd535f8f3d0f.png "Screen Shot 2014-09-14 at 3.26.57 PM.png")


###Step4 それぞれのViewに適当にボタンとラベルを配置する

![Screen Shot 2014-09-14 at 3.46.51 PM.png](https://qiita-image-store.s3.amazonaws.com/0/15925/254608e9-bfb0-9e98-d178-1321b976da18.png "Screen Shot 2014-09-14 at 3.46.51 PM.png")


###Step5 View1のボタンからView2に向けてドラッグする
![Screen Shot 2014-09-14 at 3.48.51 PM.png](https://qiita-image-store.s3.amazonaws.com/0/15925/358b350a-f8a5-ddd7-df2d-69a054141eef.png "Screen Shot 2014-09-14 at 3.48.51 PM.png")

ドラッグすると、様々なものが現れるので、Showを選択します。


![Screen Shot 2014-09-14 at 3.48.55 PM.png](https://qiita-image-store.s3.amazonaws.com/0/15925/3e20bd9f-cc1a-1a73-0d49-1e27d223758b.png "Screen Shot 2014-09-14 at 3.48.55 PM.png")

選択後は下の画像のようになります。


![Screen Shot 2014-09-14 at 3.49.05 PM.png](https://qiita-image-store.s3.amazonaws.com/0/15925/77b67e91-b7a8-6d68-1635-9997af0c4d4d.png "Screen Shot 2014-09-14 at 3.49.05 PM.png")

###途中経過
![gif02.gif](https://qiita-image-store.s3.amazonaws.com/0/15925/9f0c1780-5e45-f1fc-15cb-c727e1b61d03.gif "gif02.gif")

View1からView2には遷移しますが、View2からView1に遷移しません。

###Step5 View2からView1を戻るようにする
![Screen Shot 2014-09-14 at 4.07.02 PM (2).png](https://qiita-image-store.s3.amazonaws.com/0/15925/7318b2e6-e771-d1f8-9d65-d50ddccbdc53.png "Screen Shot 2014-09-14 at 4.07.02 PM (2).png")


![Screen Shot 2014-09-14 at 4.07.11 PM.png](https://qiita-image-store.s3.amazonaws.com/0/15925/bae8e21d-64de-e40e-42a4-a59f60695a1d.png "Screen Shot 2014-09-14 at 4.07.11 PM.png")

```swift:ViewController2.swift
@IBAction func Dismiss(sender: AnyObject) {
        self.view.window?.rootViewController?.dismissViewControllerAnimated(true, completion: nil)
}
```

###今回の成果物
![gif03.gif](https://qiita-image-store.s3.amazonaws.com/0/15925/1b7ecac4-b448-3216-5116-8e936fd87c8a.gif "gif03.gif")
プログラムメモ[2014/09/14]


*今日からQiitaで，プログラム関係のことは書こうと思う．*
日によっては，同じ記事を何回も更新することあり．

# Socket通信

現在作っているのは，iOSとWindows間でのソケット通信プログラム．
参考書としては，工学社のソケット通信プログラミングを使っている．

発売されてから，3年ほど経っているためかそのまま書いても動かなかった．
今のところ把握している点について書いておく．

## 把握している点
### importするファイル
この本では，Socket通信をする為に，importしているファイルが
1. sys/socket.h
2. sys/ioctl.h
3. net/if.h
4. netinet/in.h
の計4ファイルあるが，僕の環境(Xcode 5, iOS 7.1, Mac OS X 10.9.4)では，
それらに加えてarpa/inet.hをimportしなければ，ビルドできなかった．
エラーの出る箇所は，createSocketメソッドのinet_addrである．
見つけ次第，また書きます．

---
# Xcodeでのデバッグ
Xcodeでのデバッグ方法は，参考URLみて理解した．
でも，ショートカットキーを使った方法は，ないものかね
Viusal Studioでいうと，ステップオーバーが，[F10]Keyみたいな感じで．
自分で割り当てる感じなのかな?

[Xcodeでのデバッグ方法](http://blogios.stack3.net/archives/776)

---

# Xcode5でのxibとFile's Owner
**厄介**なのでまとめておく．
1.xibにUI部品を並べる
2.ViewController.hにimportするヘッダー，マクロ定義，interfaceの登録をする
3.UI部品,今回の場合だとボタンのアクションを設定するために，ViewController.hに各々のボタンについてアクション接続させる．
4.ViewController.hにアクション接続が終わったら，ViewController.mのinterfaceにxibの各々のボタンをOutlet接続させる．
5.これで，ボタンが正しく動くようになるはず．逆にいうと，こういう風にしないと動かなかった．別にしなくていいような気がするのだが…．ちゃんと理解できてないな，俺．

最後に，AppDelegateで，ViewControllerが初期の画面になるようにコードを書く．その際に，AppDelegateで，ViewController.hをimportし忘れないようにすること．

---

# SIGABRTエラー

原因は簡単なことだったけど，このエラーに出会った．
main.mのreturn UIApplicationMain(~~~~~~);で起きるもので，
エラーの原因を探るのが難しいと言われている模様．

ソースの量が，少なかったので簡単にエラーは，見つけられたが，
ソースの量が大きくなった場合どうすれば良いか調べた．
参考URLを見よう

ちなみに，原因としては，AppDelegateの

```objectivec:AppDelegate.m
    ViewController *viewController = [[ViewController alloc] initWithNibName:@"ViewController" bundle:nil];
    self.window.rootViewController = viewController;
```

のinitWithNibName:@"ViewController"のVを小文字にしていたためでした．
そっちの方も，メソッドまとめを参考URLに載せときます．

参考URL
*SIGABRT Error*
[SIGABRTでエラー内容が出ない時の対処法](http://blog.9wick.com/2012/04/sigabrt/)
[間違いNotes Thread 1 : signal SIGABRT その１](http://fortunefarm.blog.fc2.com/blog-entry-4.html)

*initWithNibName*
[initWithCoderとinitWithNibNameの違い](http://blog.f60k.com/initwithcoder_initwithnibname/)
[Xcode5でxib(Storyboardを使わない)プロジェクトの作り方 - オープンソースこねこね](http://kohkimakimoto.hatenablog.com/entry/2014/03/06/121045)
[[iPhone] UIViewControllerの各メソッドの役割おさらい](http://iphone-dev.g.hatena.ne.jp/paella/20090629/1246291917)

---

# ARC and @properties Error

ARCの話を理解してなくて起きたエラー
詳しく知っておく必要があるなということで，いろいろ調べてた．
流し見した詳解Objective-C 2.0ももう一回読もうと思う．

エラーに関しては，@property (weak, nonatomic) UITextfield *~~~~;にして，
@synthesizeしたら，解決した．

参考URL
[[iOS5] ARC : プロパティ属性と使い方](http://natsuapps.com/note/2011/11/ios5-arc-property.html)
[Objective-C のプロパティ属性のガイドライン](http://qiita.com/uasi/items/80660f9aa20afaf671f3)
[ARCを使用したメモリ管理の基礎](http://qiita.com/u1_fukui/items/04bb758fa03343d176ef)
[Objective-C – IBOutletオブジェクトの所有修飾子は何にすべき？ -]
(http://programming-ios.com/objective_c-iboutlet-retain-weak/)