OmniAICreator/Qiita-1.07M huggingface dataset:
CERNのROOTをJetBrainsのCLionで使うときの設定

#背景
CERNが提供している解析ツールROOTを統合開発環境(IDE)で使いたい!と思ったのですが、日本語の情報がほとんどありません。誰かの参考になればと私の試行錯誤を残しておきます。クリスマス最高！！一番好きな休日です！！！

#環境
OSはScientific Linux 6.8、ROOTはver 5.34です。
IDEは何がいいか調べてみたところJetBrainsのものがいいという記述を見たのでCLionの最新版2016.3を選びました。学生だとタダだし。

#とりあえず試す
CLion用のディレクトリを用意して既存のコード（g++コンパイルで動作は確認済）を読み込んでみます。

```
ClionProjects/ROOTMacros/txt2Tree.cc:1:19: error: TROOT.h: そのようなファイルやディレクトリはありません

```

みたいなエラーが大量に吐き出されます。
これは-lmといったヘッダオプションなどを指定してないからです。

g++などのコンパイラでコンパイルするときには

```
root-config --libs --cflags
```

を実行することで、必要なヘッダなどのオプションが例えば

```
-L/home/root/lib -lCore -lCint -lRIO -lNet -lHist -lGraf -lGraf3d \\
-lGpad -lTree -lRint -lPostscript -lMatrix -lPhysics -lMathCore \\
-lThread -pthread -lm -ldl -rdynamic -pthread -m64 -I/home/root/include
```

のように得られます。その出力を張り付けるなり\` \`で囲むなりしてg++の実行時にオプションを指定してやればいいわけです。

しかしCLionはCMakeを使ってコンパイルをしています。
そしてCMakeは`CMakeLists.txt`を読み込んでオプションなどを指定します。
というわけで[Integrate ROOT into my project with CMake](https://root.cern.ch/how/integrate-root-my-project-cmake)を参考に`CMakeLists.txt`へオプションを追加していきましょう。


#CMakeLists.txtの設定
基本的にはROOTはCMakeに対応しているのでfind_package()でROOTを読み込めば多くのオプションなどを自動で設定してくれます。
しかしここで[Integrate ROOT into my project with CMake](https://root.cern.ch/how/integrate-root-my-project-cmake)をそのまま参考にすると大きな落とし穴にハマります。
`FindROOT.cmake`がCMake用の設定が書き込まれたファイルなのですが、これの位置はROOTのコンパイル方法によって異なります。
Configure/Makeを用いてコンパイルした場合は`$ROOTSYS/etc/cmake/FindROOT.cmake`となり、CMakeでコンパイルした場合は（多分）`$ROOTSYS/FindROOT.cmake`となります。
これを`list`で`CMAKE_PREFIX_PATH`に読み込めと書いてありますが前者の場合は

```
list(APPEND CMAKE_PREFIX_PATH $ENV{ROOTSYS}/etc/cmake)
```
を追加するだけでは完全に読み込んでくれませんでした。Treeなどを読み込んでくれないためTTreeを使おうとするとリンクに失敗します。
そこで

```
list(APPEND CMAKE_PREFIX_PATH $ENV{ROOTSYS})
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} $ENV{ROOTSYS}/etc/cmake)
```
とすることでちゃんと`FindROOT.cmake`を読み込んでくれるようになります。

このあとに

```
find_package(ROOT REQUIRED COMPONENTS RIO Net)
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)
include_directories(${ROOT_INCLUDE_DIRS})#ヘッダファイル*.hを読み込み
set(SOURCE_FILES main.cc)
add_executable(ROOTMacro ${SOURCE_FILES})
target_link_libraries(ROOTMacro ${ROOT_LIBRARIES} )#ライブラリを指定
```


を追加することで実行可能となります。

ちなみに最初にヘッダファイルを読み込むときはCPU使用率が100%近くになり30秒ほどかかりました。

以上の手順で自分はCLionでの開発が可能になりました。CMakeコンパイルの場合は少し違うかもしれませんが、その場合は参考サイトがそのまま当てはまるのではないでしょうか。

最後に`CMakeLists.txt`の全体を掲載しておきます。

#CMakeLists.txt

```
cmake_minimum_required(VERSION 3.6)
project(ROOTMacro)

set(CMAKE_CXX_STANDARD 11)

list(APPEND CMAKE_PREFIX_PATH  $ENV{ROOTSYS})
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} $ENV{ROOTSYS}/etc/cmake)

find_package(ROOT REQUIRED COMPONENTS RIO Net)

include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)
include_directories(${ROOT_INCLUDE_DIRS})
set(SOURCE_FILES main.cc)

add_executable(ROOTMacro ${SOURCE_FILES})
target_link_libraries(ROOTMacro ${ROOT_LIBRARIES} )
```
findした結果をディレクトリ構造そのまま移動

大量のファイルを、ディレクトリを保ったまま移動したくなった。

他にいい方法が絶対あると思うが、とりあえず上手くいったのでこれで良しとする。

また`find`で拡張子を複数指定する方法も調べたので合わせてメモしておく。

```sh
cd /path/to/file
find /path/to/file -regextype posix-extended -regex '.*\.(jpg|png)' -print0 |
    xars tar cv -T - --null | bash -c 'cd ~; tar x'
```

最後のように、`bash -c`で標準入力を渡せるのが目から鱗でした。

# 参考

- [findの結果をtarでアーカイブしたい](https://fei-yen.jp/maya/wordpress/blog/2013/01/15/find%E3%81%AE%E7%B5%90%E6%9E%9C%E3%82%92tar%E3%81%A7%E3%82%A2%E3%83%BC%E3%82%AB%E3%82%A4%E3%83%96%E3%81%97%E3%81%9F%E3%81%84/)

この記事のように、

```sh
find -name "hoge*" -print0 | xargs -0 tar cvzf hoges.tar.gz
```

してはまってました。

ありがとうございます。
Amazon Dash Buttonで「進捗ありません!!」をつぶやくまで 

#呟くまでのメモで参考にさせていただいた記事

##環境構築、ボタン押下テストまで
http://qiita.com/TAKA1111/items/87f053498e80bf69ad9d

##twitterにつぶやくところ
http://tips.hecomi.com/entry/20120721/1342876520
http://qiita.com/daikingca2/items/0d2840761299bcc66eff
(keyとtokenは既存の物を利用。初取得の場合は、 https://syncer.jp/twitter-api-matome ここらあたりを見れば分かるんじゃないか)

#上記記事を実際になぞってみてつまづいた所

##npm install node-dash-button --save 実行時に、下記のエラーが出力される。
npm ERR! Darwin 15.6.0
npm ERR! argv "/Users/xxx/.nodebrew/node/v7.2.1/bin/node" "/Users/xxx/.nodebrew/current/bin/npm" "install" "node-dash-button" "--save"
npm ERR! node v7.2.1
npm ERR! npm  v3.10.10
npm ERR! code ENOSELF

npm ERR! Refusing to install node-dash-button as a dependency of itself
npm ERR! 
npm ERR! If you need help, you may report this error at:
npm ERR!     <https://github.com/npm/npm/issues>

npm ERR! Please include the following file with any support request:
npm ERR!     /Users/xxx/node-dash-button/npm-debug.log

##原因、対処策
package.json 内の "name" が、ディレクトリ名と同じだとNG
下記を参考にさせていただき、"name" を変更し、再度
npm install node-dash-button --save 実行
http://mksk.hatenadiary.com/entry/2016/10/03/092932

##sudo node sample.js しても押下の検出がされない
コンソールに何も表示されない

##原因、対処策
色々な記事にも書かれているが、Amazon Dash Button の動作が遅い。
そのため根気よく待つと表示された。

##node-twitterをインストールし、つぶやこうとするも
bot.updateStatus('Hello, world!', function (data) {
のupdateStatusにて
TypeError: bot.updateStatus is not a function
が表示されエラーとなる。

##原因、対処策
updateStatus ではなく、
bot.post('statuses/update',
        {status: 'Hello world (このツイートはテストです)'},
        function(error, tweet, response) {
        if (!error) {
            console.log(tweet)
        }
        });
を使うようにした。

##エラーが表示されないが、つぶやけていない
##原因、対処策
古いKeyとtokenを使用していた。
下記を参考にしにて再登録
http://qiita.com/rarewin/items/d38ba161864107f94f7d

##一度しかつぶやけない
##原因
同じ文面だと多重投稿禁止？かなにかでつぶやけない。
http://qiita.com/n0bisuke/items/dd28122d006c95c58f9c
上記にて日付をいれた。
PowerShell でクリップボードの監視（履歴のロギング）

- クリップボードの内容に変更がないかを 1 秒おきにチェックする。
- 変更があった場合は、コンソールに出力する。

![result.png](https://qiita-image-store.s3.amazonaws.com/0/155410/1c37b516-f1ba-b9b5-3a04-3d50233cf08c.png)

## コード

```ps1:ClipboardObserver.ps1
# set window title
(Get-Host).UI.RawUI.WindowTitle = $MyInvocation.MyCommand

# クリップボードのテキストを取得する
Add-Type -AssemblyName System.Windows.Forms
$clipText = [Windows.Forms.Clipboard]::GetText()

# コンソールに出力する
Write-Host $clipText

while ($true)
{
    # クリップボードのテキストを再度取得し、前回の分から変更がないかチェックする
    $latestClipText = [Windows.Forms.Clipboard]::GetText()
    if ($latestClipText -ne $clipText)
    {
        # 変更があった場合は更新する
        $clipText = $latestClipText

        # コンソールに出力する
        Write-Host "- - -"
        Write-Host $clipText
    }
    # 1秒スリープ
    Start-Sleep -Seconds 1
}
```
## Windows 7 で実行する際の注意点
Windows 7 (PSVersion=2.0) の場合、そのままだと動かない。
これは [Clipboard クラス](https://msdn.microsoft.com/library/system.windows.forms.clipboard(v=vs.110).aspx)が、**STA モード**時でのみ使用可能であるのに対して、Windows 7 はデフォルトが **MTA モード**になっているため。
これを解決するには、明示的に STA モードで動作させる必要がある。cmd でラップすると:

```bat:ClipboardObserverRunner.bat
set THIS_FILE_PATH=%~dp0
powershell.exe -STA -File "%THIS_FILE_PATH%ClipboardObserver.ps1"
```

## 展望
- クリップボードの履歴をリストで保持しておいて、yank-pop みたいな感じで取り出すことができるようにしたい。
GoでGUI使いたい！

# はじめに
タイトル通りです。
しかし各所で言われているとおりGUIはGoの苦手な部分と言われています。

この記事では[andlabs/ui](https://github.com/andlabs/ui)を使用して簡単なGUIを作成してみたいと思います。
(なお上記プログラムのWikiの日本語訳に近いものになってしまいますがご容赦ください)

# 入門
(GOPATHおよびgo getについては省略します)
この例ではユーザが名前を入力してからボタンを押すと表示するプログラムを作成します。
まず下のソースコードを実行しましょう。細かい部分は後で解説します。

```go:main.go
package main

import (
    "github.com/andlabs/ui"
)

func main() {
    err := ui.Main(func() {
        name := ui.NewEntry()
        button := ui.NewButton("Greet")
        greeting := ui.NewLabel("")
        box := ui.NewVerticalBox()
        box.Append(ui.NewLabel("Enter your name:"), false)
        box.Append(name, false)
        box.Append(button, false)
        box.Append(greeting, false)
        window := ui.NewWindow("Hello", 200, 100, false)
        window.SetChild(box)
        button.OnClicked(func(*ui.Button) {
            greeting.SetText("Hello, " + name.Text() + "!")
        })
        window.OnClosing(func(*ui.Window) bool {
            ui.Quit()
            return true
        })
        window.Show()
    })
    if err != nil {
        panic(err)
    }
}
```

## 解説
### Package UIの実行
```go
var window ui.Window
```
初めに`ui.Window`型のグローバル変数を宣言します。
Windowは他のControl(TextField, Buttonなど)を保持します。Controlを表示するためにはWindowに追加されていなければなりません。(ただしWindowはControlではありません)

```go
ui.Main(func() {...})
```
`ui.Main()`はUIのメインループです。 この中でControl, WindowのShow, Quitなどを管理します。

```go
Control.On<Action>(func(*ui.Control) {...})
```
これはControlのイベントハンドラを指定します。
Controlではそれぞれに対応したイベントハンドラが存在します。

### UIの構築
```go
name := ui.NewEntry()
button := ui.NewButton("Greet")
greeting := ui.NewLabel("")
```
これらはテキストフィールド、ボタン、ラベルを作成します。

```go
 stack := ui.NewVerticalStack(
            ui.NewLabel("Enter your name:"),
            name,
            button,
            greeting)
```
Package UIのControlはレイアウトコンテナを使用して配置されます。これはGTK+やQtと同じです。
水平や垂直にスタックするものを基本とし、これらは幅や高さに応じて変わります。
今回は垂直に配置するものを使用します。またlabelに関しては何も変更しないので直接定義します。

```go
window = ui.NewWindow("Hello", 200, 100, false)
window.SetChild(stack)
```
これでウィンドウをを作成する準備ができました。
`ui.NewWindow()`はタイトル, 幅, 高さ, メニューバーを持つかをパラメタに指定します。
WindowはControlを一つしか持てませんがスタックはControlなのでスタックをWindowに指定するだけです。

### イベント
```go
button.OnClicked(func() {
    greeting.SetText("Hello, " + name.Text() + "!")
})
```
これはボタンがクリックされたときのイベントハンドラを指定します。
イベントハンドラは`ui.Do()`が実行されたあとに実行されます。
イベントハンドラは安全にUIを操作することができ、イベントハンドラが実行されている間は他のゴルーチンからは実行されません。
イベントハンドラは簡単であるべきです。

```go
window.OnClosing(func() bool {
    ui.Stop()
    return true
})
```
ユーザーがWindowを閉じたときに正常終了するには`w.OnClosing()`を使います。
この場合、`ui.Stop()`を呼び出してUIメインループを終了し、Windowを閉じるためにtrueを返します。

### 仕上げ
```go
window.Show()
```
これはWindowを表示するだけです。

ビルドして実行してみましょう(Windowなら`go build -ldflags -H=windowsgui main.go`)
次のように表示されます。

![Run.png](https://camo.githubusercontent.com/29d2b37a90231fc5867637a462f8c116cab5c276/687474703a2f2f692e696d6775722e636f6d2f41694f3852487a2e706e67)

# おわりに
間違い等ありましたら[Twitter](https://twitter.com/syu_chan_1005)かコメントにお願いします。


適当なサンプル作りました -> [こちら](https://github.com/syuchan1005/UITest)
HoloLensで使えるJSONパーサー


この記事は [Unity Assets Advent Calendar 2016](http://qiita.com/advent-calendar/2016/unity-asset) 23日目の記事になります。

HoloLens実機転送時に動かない原因の上位にランクインするJSONパーサーの問題を解決するアセットを紹介します。


## JSON Object 1.6 (Jan 25, 2016)
[![image](https://qiita-image-store.s3.amazonaws.com/0/32347/def80ade-0e05-a0a5-bfb9-88028301dbe4.png)](https://www.assetstore.unity3d.com/jp/#!/content/710)

## 使い方

```
// 初期化
JSONObject j = new JSONObject(responseString);

 // 全文確認
Debug.Log(j);

// キー指定して値読み込み
Debug.Log(result.GetField("scores").GetField("happiness"));

// floatで読み込み
if (happinessThreshold > result.GetField("scores").GetField("happiness").f)
```
sort | uniq -c しないで重複行をカウントする

出力が大きくて `sort` してると重いときに使います

```bash
alias sortuniqc="perl -nlE '\$c{\$_}++; END { say \$_ . q! ! . \$c{\$_} for (sort keys %c) }'"
```

## それなりに軽くなる様子

- 5000行とかでも2倍以上早くなる
- 100万行とかだと顕著に違う

```bash
$ time cat ~/result-item-search | egrep -o 'skip|preserved' | wc -l
    4214

real	0m0.051s
user	0m0.039s
sys	0m0.009s
```

```bash
00:19:59-sakamotoakira@SakamotoAkira-no-Mac-mini:~  \(^o^)/
$ time cat ~/result-item-search | egrep -o 'skip|preserved' | sort | uniq -c
2758 preserved
1461 skip

real	0m0.133s
user	0m0.111s
sys	0m0.015s
```

```bash
00:20:03-sakamotoakira@SakamotoAkira-no-Mac-mini:~  \(^o^)/
$ time cat ~/result-item-search | egrep -o 'skip|preserved' | sortuniqc
preserved 2758
skip 1461

real	0m0.045s
user	0m0.046s
sys	0m0.010s
```

## 参考

- [ソートしないで重複行を削除する - Qiita](http://qiita.com/arcizan/items/9cf19cd982fa65f87546)
IntelliJ IDEAでsnippetを活用する

開発部のコイです。オルトプラスに働いています。
IntelliJ　IDEAでのsnippetを活用する方法を紹介します。

### 背景：

繰り返し同じコードパターンを書いたら、時間がかかっているので、どのように解決できるかを探してみて、snippet活用の方法を見つけました。
最近チームでIntelliJ IDEAで使っているので、IntelliJ IDEAでの方法を紹介します。

### snippetとは
snippet（英語: snippet)とは、「断片」という意味である。情報処理の分野ではよく使う短いプログラムコードを統合開発環境から呼び出す機能の事である。　また、呼び出される短いコードの事をsnippetと呼ぶ場合もある。[ja.wikipedia.org](https://ja.wikipedia.org/wiki/%E3%82%B9%E3%83%8B%E3%83%9A%E3%83%83%E3%83%88)

言い換えれば、snippetはテンプレートコードに似ている。コードテンプレート化して、そのあと再利用できるものです。
mainとif/elseなどのsnippetを用意してくれるEditorが多いと思います。

またEditorでは任意でsnippetを登録することができます。
開発中にsnippetを登録して、どんどん増えていくと開発速度が上がるのではないでしょうか？

### ItenlliJ IDEAでsnippetを活用する

#### 登録してみる

例：仮に下記のパターンを繰り返し書かないとき、snippetを登録してみます。

```javascript
for (var i = 0, l = users.length; i < l; i++) {
    var v = users[i];
    // some code here
}

for (var i = 0, l = books.length; i < l; i++) {
    var v = books[i];
    // some code here
}
```

https://www.jetbrains.com/help/idea/2016.3/creating-and-editing-live-templates.html

登録できたら下記のように使えるようになります。
js-forのsnippetです。
![for.gif](https://github.com/khoinv/intellij-snippets/blob/master/screencasts/for.gif?raw=true)


- 更にSnippetを書くときは、IntelliJ　IDEAがサポートしてくれる機能を使うことで、表現力が上がります。
詳細的に下記のリンクを御覧ください。
    - https://www.jetbrains.com/help/idea/2016.3/live-templates.html
    - https://www.jetbrains.com/help/idea/2016.3/live-template-variables.html

#### snippetを共有する方法

snippetを共有する方法は2つあります。

- SnippetをExportする
- Snippetを手動でコピーする

参考：https://www.jetbrains.com/help/idea/2016.3/sharing-live-templates.html

### Vim-snippetsをIntelliJ IDEAのフォマットに変換する

Vim-snippetsのCommuinityが強いので、たくさん良いSnippetが用意されています。
なので、Vim-snippetsをIntelliJ IDEAsnippet化してみました。
下記の例を御覧ください。

- jq-ajaxのsnippet

![ajax.gif](https://github.com/khoinv/intellij-snippets/blob/master/screencasts/ajax.gif?raw=true)

- bootstrapのsnippet

![bootstrap.gif](https://github.com/khoinv/intellij-snippets/blob/master/screencasts/bootstrap.gif?raw=true)

詳しい使い方はこれを見[intellij-snippets](https://github.com/khoinv/intellij-snippets)てください。

### まとめ

自分で開発するときに、自分のsnippetをもっと活用してみてください！
std::string::nposの正体

[`string::find`](http://en.cppreference.com/w/cpp/string/basic_string/find)で値が見つからなかった場合に返す値として定義されています。

[Reference](http://en.cppreference.com/w/cpp/string/basic_string/npos)より

> `static const size_type npos = -1;`
> This is a special value equal to the maximum value representable by the type size_type. The exact meaning depends on context, but it is generally used either as end of string indicator by the functions that expect a string index or as the error indicator by the functions that return a string index.

雑に訳せば「size_typeのとりうる最大値」となります。`size_type`は`unsigned int`で示されており、補数表現の最大値と`-1`が等価になるため、`-1`とされているのだと思います。
re:dash でコホート分析

最近、Airbnb 社のオープンソース BI ツール Superset [^1] を試しています。
Superset が UI で指標をピボットしてグラフを描画できる点は re:dash と比べて圧倒的に便利そうで... おっと、re:dash の Advent Calendar でした。


この記事は [re:dash Advent Calendar 2016](http://qiita.com/advent-calendar/2016/redash) 12/24の記事です.
re:dash でちょっとクセのあるコホートグラフの作成方法を簡単にまとめます。

# Cohort（コホートグラフ）

ユーザーのサービス継続利用率の可視化に、コホートグラフが有用です。
サンプルを以下に載せます。セグメントによって継続利用率を比較すことがコホート分析では重要になるため、自社では filter を利用してこのように 〇〇をした人／していない人の継続利用率を比較しています。

![a1dc3682737d247b4468d196999b7b16.gif](https://qiita-image-store.s3.amazonaws.com/0/25621/e54f74c3-c078-07f6-b4a6-bf94abd2f7ad.gif)

同じデータ出力でリテンションカーブも描けます。
![https://qiita-image-store.s3.amazonaws.com/0/25621/9522b8fc-3d14-7cf2-a4d4-73865812d227.png](https://qiita-image-store.s3.amazonaws.com/0/25621/9522b8fc-3d14-7cf2-a4d4-73865812d227.png)


## 描画のポイント

- コホートグラフ描画に必要なカラム
    - date（獲得日）
    - day_number（獲得日から x 日／週／月経過）
        - 昇順ソートされていればカラムが無くても描画できるようだが、入れた方が無難
    - value（獲得日から x 日／週／月目の訪問人数）
    - total（獲得日の人数（母数））

- リテンションカーブを描くには
    - 訪問率（value/total） を計算したカラムを用意し、y 軸の指標にするだけです
    - Date カラムを Group By の指標に選択すると凡例に TimeZone など含まれて長くなるので、サンプルグラフでは日付を文字列型に cast したカラムも用意しています

※ 文字に起こすと分かりにくいと思いますので、詳しくは[こちらのサンプルのソース](https://demo.redash.io/queries/3553/source#4752)を Folk 等して試してもらえればと思います。

## ログのローデータから SQL を書くポイント

サンプルのデータソースでは、コホートグラフ描画用に整形済みのデータですが、アクセスログからコホートグラフを作るのはちょっと大変になります。

id, log_date, user_id のみの access テーブルから日次のコホートグラフの描画を行うための SQL（PostgreSQLで）は、こんなかんじでしょうか。

```sql:sample_cohort.sql
with first_access as (
    select user_id, min(log_date) as first_access_date
    from access
    group by 1
    having min(log_date) >= current_date - cast('1 month' as interval) -- 直近1ヶ月の新規獲得ユーザーのみ
)

select total.first_access_date as date
    , datediff(day, fa.first_access_date, a.log_date) as day_number
    , count(a.user_id) as value
    , total.cnt as total
from access a 
    inner join first_access fa on fa.user_id = a.user_id
, ( select first_access_date
        , count(user_id) as cnt
    from first_access
    group by 1
  ) as total
where fa.first_access_date = total.first_access_date
group by 1, 2, 4
order by 1, 2, 4
```

・・・書くのも大変ですし、データ量によってはかなり重いクエリになります。
そのため、自社ではユーザーごとの１日のアクセスを日次集計して参照するようにしています。

以上、参考にしてコホートグラフを re:dash でバンバン活用していただけると幸いです。
※ 日付が過ぎてしまって申し訳ありません、メリークリスマス！

[^1]: Superset の GitHub リポジトリは[こちら](https://github.com/airbnb/superset)。また Superset については[こちら](http://qiita.com/hiro_koba/items/65f3e278d86174210776)の re:dash との比較記事が参考になります。
PHP+Milkcocoaを考える

メリークリスマスイブ！

こんばんは、ちゃんとくです。
この記事は[Milkcocoa Advent Calendar 2016](http://qiita.com/advent-calendar/2016/milkcocoa)24日目の記事です:coffee:
![image_uploaded_from_ios_720.jpg](https://qiita-image-store.s3.amazonaws.com/0/119003/fb1fd06a-a6e0-7b16-3347-2697dd539b3a.jpeg "image_uploaded_from_ios_720.jpg")

昨日はわたしとMilkcocoaのこれまでについて書いたので、今日はこれからについて書いてみます！相変わらず技術的なノウハウは特にありません。

## これまで：JavaScript+Milkcocoa
3月にMilkcocoaに出会ってから、デモやプロトタイプ作成で何度もMilkcocoaにお世話になりました。

### ブラウザ同士のリアルタイム通信
* スマホのシェイクでイベント発火 [(Github)](https://github.com/tokutoku393/mlkcca-wheei)
* JSで作ったスライドをスマホから操作する [(Github)](https://github.com/tokutoku393/js_slide)

1番多かったユースケースです。スマホからイベント発火、という形が多かったですね。
なんというか自分の中のリアルタイム通信という概念を壊せてなかった感じがします。笑

### マイコンボードとWeb連携
* GR-SAKURAからNodejs->milkcocoaにpush

IoTLTで色々作るようになってから、Web連携はほぼMilkcocoaでやってきました。
自分以外でも裏側で使ってますという方、かなり多かった印象です。

IoTでMilkcocoaな部分はこれからもお世話になりそう( 厂˙ω˙ )厂

## これから：PHPからMilkcocoaを動かしたい
ずっとJavaScript(とNodejs)からMilkcocoaを動かしていたのですが、普段書いているPHPとMilkcocoaを繋げられたらもっと幸せになれる気がしてきました。
あわよくばmilkcocoa-php-SDK的なものを作りたいと画策しています。ユーザとしてとてもお世話になっているので、そろそろ貢献したい気持ち。

前準備として、必要なことを調べてみました。

### PHPでMQTT通信
MilkcocoaはMQTT上で動いているので、PHPからMQTTにつなぐことが必要になりそう。
しかし様々な言語のクライアントライブラリを提供しているPahoでは、PHPのライブラリが実装されていませんでした。

PHPでMQTTが実装できそうなライブラリとしてphpMQTTというのを発見しました。
https://github.com/bluerhinos/phpMQTT

### Milkcocoaへの接続
開発者の方がSDKについての記事を書かれています。
[Milkcocoaのトップページリニューアルの機会に、SDKについて](http://clooca.sblo.jp/article/161701109.html)

少し前の記事ですが、ここで紹介されているC言語のサンプルを参考にすれば、実装できそう。
https://github.com/milk-cocoa/c-examples


## まとめ
実際にやってみれたらよかったのですが、思い立ったのがギリギリ+直前にMacのPHP環境をぶっ壊してしまったのでイブには間に合いませんでした(;´д｀)毎度すみません。

来年度の最初の目標として頑張ってみたいと思います。あと「ぺちここあ(PHPcocoa)」っていう名前だけ思いついたので何か作って名付けます。

それでは明日はMilkcocoaの生みの親@syuheiさん、ラストの記事お願いいたします！！！
GUIのGitクライアントアプリを作ってみた

Qt Advent Calendar 25日目の記事です。

私ごときが、最終日の記事を担当するなど10年早いです。なんとおこがましいことか。（笑）

この記事では自作アプリの宣伝と協力者の募集をしますので、「Qt Advertisement Calendar」でもあります。

## Gitを使うよ

唐突ですが、GUIのGitクライアントを自作してみました。コマンド版 `git`（`git.exe`）のラッパーとして動作します。

ソースコードバージョン管理システムの歴史の中で、Subversion全盛の時代、TortoiseSVNは使いやすかったのに、急にGitを使わないといけなくなって、分からん、怖い、と、Git初心者なら一度は思ったことがあるでしょう。私も例にもれず、Git入門などと書かれた本を購入したものの長い間積んであったのですが、時代の流れには逆らえず、みんなが「Gitはいいぞ」というので、重い腰を上げてGitを使い始めることにしました。

とりあえず、`clone`と`commit`と`push`と`pull`と`branch`と`checkout`と`merge`を覚えたものの、ちゃんと理解して使わないと、やっぱり怖いです。コミットログを汚したら怒られるんじゃないだろうか、なんて思ったりします。

WindowsやMacではお馴染みのSourceTreeというアプリがあれば、基本的なこと（というか、大抵のこと）は実現できますが、いざ始めてみると、Gitってどういう仕組みで動いてるんだろう？ という興味が湧いてきました。そこでまずはGitの仕組みを理解しようと思いました。そのためには、`git`コマンドを使い倒してみるのがいいと考え、それならGitクライアントを自作してみようと決意しました。

## 既製品が気に入らない問題

よく知られているGUIで操作できるGitクライアントには、いくつか問題があります。

* $79くらい払わないといけない。
* 無料でもメールアドレスなどの個人情報を登録しないとダウンロードできない。
* Windows版とmacOS版はあるのにLinux版がない。
* ソースコードが公開されていない。
* アイコンが不気味で気持ち悪い。
* 起動するまでに時間がかかる。
* 日本語対応していない。
* 機能が貧弱すぎる。

これらを解消するのが目標です。最後の「機能が貧弱」に関しては、まだバージョン 0.0.0 なので、他者のことをあれこれ言う資格は無いのですが、コミットログの一覧さえ見れないようなツールはGitクライアントアプリとしてどうかと思ったりします。

## 自作するよ

Gitクライアントを自作しようと思った動機は、私自身がGitを理解するため、というのが第一、で、どうせ作るのなら、上に挙げた問題を解消した「使えるツール」にしたいからです。まだ習作の域を脱していませんので、足りない機能は今後追加していきます。

とりあえず、以下のような方針で作っていきます。

* 開発言語はC++、フレームワークは Qt 5 を採用。
* WindowsとmacOSとLinuxのデスクトップ環境で動作。
* LinuxについてはRaspberry Pi版も作成。
* フリーソフトとして公開。

プログラムのタイトルは「Guitar」です。
「GUI」＋「Git」＋「er」を混ぜ合わせたらGuitarになりました。

## こんな感じ

とりあえず、スクリーンショットです。

![guitar.png](https://qiita-image-store.s3.amazonaws.com/0/61222/40716e35-6100-e349-2fa3-09085ee1f94b.png)
図の右上に書かれているGetItというのは、Guitarにする前の仮の名前です。ここに、現在操作中のリポジトリ名とブランチ名が表示されます。

そしてアイコンです。

![icon.png](https://qiita-image-store.s3.amazonaws.com/0/61222/1918a2ec-c1d4-dad2-d8c8-5333061de588.png)

これはデザインとしてどうなのか、と思わなくもありません。良いセンスの持ち主がいらっしゃったら、改良にご協力ください。よろしくお願いします。

## Qtはいいぞ

この記事は Qt Advent Calendar ですので、Qtについても触れておきましょう。UIをデザインしている画面をお見せします。画面設計は、このような Qt Creator という統合開発環境上で行います。機能の実装はC++で記述します。

![qtcreator.png](https://qiita-image-store.s3.amazonaws.com/0/61222/1c525066-39fe-d979-9bc4-f3cacab7d5c6.png)

Qt Creator は、統合開発環境としては、尋常ならざる開発効率を発揮します。入力補完はもちろんのこと、シンボル名変更などのリファクタリング支援機能など。Qt Creator に慣れたら Visual Studio には戻れないレベルです。そんな素晴らしい開発環境が Windows と macOS と Linux で動作するのです。

## 開発にご協力ください

こんなものを作っている私自身が、まだあまりGitを使いこなしていません。ソースコードはGitHubで公開していますので協力者歓迎です。コミットログが汚いとか言って怒ったりしないので大丈夫です。どんな過酷な現場にも耐えられるよう、汚いコミットログもそれはそれで必要なテストになります。開発には参加しなくても、新機能のアイディアや改良の要望、デザインや操作性に関する意見などをもらえるだけでも嬉しいです。

ソースコード：https://github.com/soramimi/Guitar
ウェブサイト：http://www.soramimi.jp/guitar/

## おわりに

それでは、2017年も幸せなQtライフを送れるよう、盛り上げていきたい思います。みなさま良いお年を！
[ue4]裏 Unreal Engine 4 (UE4) Advent Calendar 2016 12月25日記事

__・裏 Unreal Engine 4 (UE4) Advent Calendar 2016　12月25日の記事になります。__

今回、いくつか並行で記事を書いていて選ぶことができなかったため３つとも公開します。
稚拙な内容になりますが。読んでいただけるとうれしいです。


__[ue4]ゲームと構図のアンニュイな関係__
http://qiita.com/housakusleeping/items/c1c8a2673315bb25a32f


__[ue4]チャイルドアクターシンドローム__
http://qiita.com/housakusleeping/items/2eadab9e6a7b985ff2f3


__[ue4]加算キーによるアニメーション沼__
http://qiita.com/housakusleeping/items/34342c633c4b57dfac47



「裏 Unreal Engine 4 (UE4) Advent Calendar 2016」はこれにて終了になります。
アドベントカレンダーを執筆されたみなさん、読者のみなさん、今年一年、お疲れ様でした。
良いお年を。
BLT：Drupal開発を楽にする？ツール

この記事は[Drupal Advent Calendar 2016](http://qiita.com/advent-calendar/2016/drupal)の25日目の記事です。毎月第4金曜日に開催されているDrupal Meetup Tokyoで紹介させていただいたツールですが、会話が盛り上がったので短めに少し切り口を変えて紹介します。

## BLT

[acquia/blt: BLT is a tool for building, testing, and launching Drupal sites.](https://github.com/acquia/blt)

> BLT is a tool for building, testing, and launching Drupal sites.


BLTは説明にある通り、ビルドしてテストして、Drupalのサイトを立ち上げてくれるツールです。
実際にはBLTコマンドを通じてそれぞれのタスクを実行するタスクランナーと考えて良いと思います。

## 開発は楽になるのか？

やること・調べることが増えるので**短期的にはならない、長期的にはなることを期待**するという感じでしょうか。BLTが内部的にどういうことをやっているのか設定ファイルなどを読んでいくうちに、BLTが[PHP: The Right Way](http://ja.phptherightway.com/)の様にDrupalでの開発全体を押し上げるためのようなツールだと感じました。

## 含まれるツールなど

### パッケージ管理

- [Composer](https://getcomposer.org/)
- [npm](https://www.npmjs.com/)

### ビルド

- [Phing - a PHP build tool](https://www.phing.info/)
- [gulp.js - the streaming build system](http://gulpjs.com/)

### テスト

- [Behat — a php framework for autotesting your business expectations.](http://behat.org/en/latest/)
        - [Selenium - Web Browser Automation](http://www.seleniumhq.org/)
	- [PhantomJS | PhantomJS](http://phantomjs.org/)
- [PHPUnit – The PHP Testing Framework](https://phpunit.de/)

### デプロイ

- Local
	- [Vagrant by HashiCorp](https://www.vagrantup.com/)
		- [Drupal VM - Easy local Drupal development environments](https://www.drupalvm.com/)
	- [Local Drupal Development | Dev Desktop](https://www.acquia.com/products-services/dev-desktop)(インストールできないバグあり)
- Remote
	- git push

## まとめ

ナウくないツールも混じっている気がしますが、フロントエンドからバックエンドまでこれらがまるっと提供されるのはありがたいなと思います。Drupalに深く関わってる人たちのある種のベストプラクティスなので参考にしつつ、Yarnに差し替えたりDockerに差し替えたりしたらいいですね。
vvvv 50 について

この記事は [vvvv Advent Calendar 2016](http://qiita.com/advent-calendar/2016/vvvv) の 25 日目の記事です。

ついに最終日です。
みなさんのアドベントカレンダー記事を毎日楽しみに読ませてもらっています。感謝の気持ちでいっぱいです。来年もやりたい！

#vvvv 50
一番大きいものは VL の追加です。
VL とは vvvv に内包される、vvvv で使えるノードを作るための新しいビジュアルプログラミング言語、という感じです。
フレームベースド、データフロー言語というパラダイムの性質上、１フレームでループが書けない、状態の保持がシンプルではない、という不便さがありました。
VL は C# コンパチブルで、 C# を vvvv の VL エディタ上で vvvv と同じ感覚でビジュアルベースで記述でき、コンパイルと実行が動的にできる C# な感じです。
vvvv から発展し、テキストベースのプログラミングの学習をしたいとしたときに、どうしても壁が存在していました。が、vvvv -> VL -> C# という自然な学習フローができました。
言語フィーチャーとしても、ループの使用はもちろん、型の宣言、オブジェクト指向、ジェネリクス、デリゲート、非同期処理、.net で作られたライブラリの自動 VL 化、実行形式の書き出し、などなど。

vvvv の魅力、他の似た環境との明確に違う所として、開発者たちがあくまで一つのプログラミング言語として vvvv を開発しているという点です。
これは最初に開発を始める段階からブレない思想です。その思想の元、正統な進化を感じます。

もちろんこれまで通り vvvv だけでも同じように作品を作ることができますし、複雑な事や vvvv で難しいものは VL で書く、という感じになります。

vvvv 内での VL の使用に関する追加料金は現状ありません。
スタンドアロンバージョンができたらライセンス料の仕組みが出来そうです。

## The Gray Book
公式の VL についてのドキュメントです。頻繁に更新されています。
更新落ち着いたら翻訳したいですね。
https://vvvv.gitbooks.io/the-gray-book/content/en/

#vvvv 側のアップデート
vvvv 側ももちろん色々更新されています。
部分的にですが、今日から恩恵を得られる vvvv 50 として紹介します。

## Spread
みんな大好き Spread カテゴリのノードも増えました。

・SpiralSpread
![Record_2016_12_23_22_13_04_6.gif](https://qiita-image-store.s3.amazonaws.com/0/59912/cb7cc631-8298-0d67-6e7c-0b811f381942.gif)


・GridSpread
![Record_2016_12_23_22_36_56_865.gif](https://qiita-image-store.s3.amazonaws.com/0/59912/ecbadd73-a790-0c7c-2c31-7a4a4a5a3782.gif)

・HexGridSpread
![Record_2016_12_23_22_41_31_280.gif](https://qiita-image-store.s3.amazonaws.com/0/59912/5acbcdfc-4ebb-428d-914f-c854c581e150.gif)

・StarSpread
![Record_2016_12_23_22_49_30_445.gif](https://qiita-image-store.s3.amazonaws.com/0/59912/10c636ea-6877-de75-5afb-7630238697cf.gif)

・RectangleSpread
![Record_2016_12_23_22_50_28_730.gif](https://qiita-image-store.s3.amazonaws.com/0/59912/fdcd0980-f13b-b49e-a84f-8f7132665353.gif)


## Camera(2D)
Camera(2D) が結構便利です。
２次元的に移動とスケールが出来るシンプルなカメラです。
![Record_2016_12_23_22_17_10_707.gif](https://qiita-image-store.s3.amazonaws.com/0/59912/88bd8dc4-3f9d-388e-cae6-de8c9eee43c0.gif)



## Bezier エディタ
とても便利。
![Record_2016_12_23_22_15_05_97.gif](https://qiita-image-store.s3.amazonaws.com/0/59912/b0b4e749-3e8c-ab2b-ba36-553cbedc06c7.gif)

## Rekorder
GIF アニメとしてウィンドウをキャプチャできます。
Ctrl+4 で録画開始/終了。

## Evaluate = false でノートが灰色に
Evaluate 切ってたわーみたいなミスがなくなります。
![Record_2016_12_23_22_16_06_867.gif](https://qiita-image-store.s3.amazonaws.com/0/59912/0a4be1e7-8723-f141-03c5-c9798a185cb5.gif)

## Raw の扱いが高速に
嬉しい。

#終わりに
正統進化をしている vvvv / VL は今後も楽しみです。
夏の NODE 16 とかではまた何かしらニュースがあることに期待です。
Gebの日本語スライドをまとめておく

# はじめに

このエントリーは、[Geb Advent Calendar 2016](http://qiita.com/advent-calendar/2016/geb)の25日目の記事です。なんとかこのカレンダーも参加者の皆さんの協力で完走できました。ありがとうございます！　
今日はGebの日本語のスライドを紹介したいと思います。最後に蛇足ですが、せっかく最終日なので、ちょっとこのカレンダーを作成した意図を書きたいと思います。

# Gebについて触れられた日本語スライドたち
私が見つけたものだけで、かつカテゴリーも私の主観で分けてます。もしここにないスライド見つけた方がいたら編集リクエストください！

## 入門向け
### [脱・独自改造！ GebでWebDriverをもっとシンプルに](http://www.slideshare.net/hirokotamagawa/20141018-2selenium-40423299)
Gebのさわりから、ちょっとした注意事項までよくまとまっている良いスライドです。最初に読むとしたらこれがいいです。

### [まだ目視で消耗してるの？](https://speakerdeck.com/hiroyukiikawa/madamu-shi-dexiao-hao-siterufalse)
Geb使ってみましたスライド。こうやると楽になりそうだなーとイメージがつきやすいと思います。

### [JJUG CCC 2011 Fall / Web test automation with Geb and Spock](http://www.slideshare.net/nobusue/jjug-ccc-2011-fall-web-test-automation-with-geb-and-spock)
ちょっと公開から年数が経ってしまっていますが、Gebのことをサクッと知るのに良いと思います。

### [What makes Geb groovy?](http://www.slideshare.net/youtaroutakahashi/what-makes-geb-groovy)
上記のスライドを読んだ人が、「えっ、なになにちょっとGeb使ってみようか？」と思った時に資料にできると良いな、と思って作ったスライドです。WebDriverのコードをGebにしていく過程が見られます。

## 実践系
### [Webアプリのシナリオテスト自動化を運用に乗せるまでの10のステップ](http://www.slideshare.net/NaokiIwami/web10-66046974)
実際にGebを実戦投入したお話。試したことベースなので再現性高いと思います。実際試す時に指針にしたいスライドです。

### [ブラウザテストをサクサク自動化するためのGeb実践入門 #jjug_ccc](https://speakerdeck.com/poohsunny/burauzatesutowosakusakuzi-dong-hua-surutamefalsegebshi-jian-ru-men-number-jjug-ccc)
Gebを実践する中でのハマリどころを多くまとめたスライドです。なぜブラウザテストの自動化するの？ って話も踏み込んでいますので、仕事で実際に使う前に読んでみると良いと思います。

### [横浜タネマキでGebと握手！ #yokohamagroovy](https://speakerdeck.com/poohsunny/heng-bang-tanemakidegebtowo-shou-number-yokohamagroovy)
とあるイベントでGebの入門プログラムを作った時の説明スライド。入門プログラムとセットで読むと練習できると思います。

## 特定機能の説明系
### [20150131_jQueryのようにWebテストが書けるGeb Navigator APIの紹介](http://www.slideshare.net/fujisawa_y/20150131-geb)
Gebの一つの特色であるjQueryっぽいAPIについて丁寧に紹介しているスライドです。

### [さいきんのGebしってますか？ #jggug](https://speakerdeck.com/poohsunny/saikinfalsegebsitutemasuka-number-jggug)
文字どおり、Gebのバージョンアップ内容について触れているスライドです。

## その他
### [SelenideとGeb](https://speakerdeck.com/poohsunny/selenidetogeb)
ブラウザ自動化テストのSelenideのコミッタとGebのコミッタが会話していたのでそれをまとめたものです。


# おわりに
今日は最終日ということで、このアドベントカレンダーを作った意図に触れて締めたいと思います！

## Gebの日本語情報は少ない
本家のドキュメントがしっかりしているので、日本語ドキュメントは少ない印象でした。
過去何度かGebのドキュメントの翻訳は試みたことがあり、中の人にも相談したことがあるのですが、中途半端に日本語ドキュメントができてしまうと、むしろ使い手を混乱させる結果になるだろうと感じてやめました。[^1]

## スライドは検索性が悪い
さて、そんな日本語ドキュメント、スライドは結構あがっていたのです。ただスライドは検索性が悪いと感じていまいた。
というわけで勢いで文字情報を増やそう！と考えて立てたのがこのアドベントカレンダーです。今日のエントリーのスライド紹介もこの問題意識の延長です。

## 感謝！
ここまで無事にバトンをつなげたのは本当に参加してくれた、そして読んでフィードバックをくれた皆さんのおかげです。ありがとうございました。
来年またやるのであればその時また盛り上がりましょー！

それではメリークリスマス！！

[^1]: もしかすると今はコミュニティも大きくなっていますから、継続的にメンテナンスし続ける仕組みが作れるのかな、とも思っています。今後そういったことができるといいのかもな、と考えています。
弊社の異常な成長 または私は如何にして心配するのを止めて開発を愛するようになったか

## 自己紹介
**ムニエル**（[@munieru_jp](http://twitter.com/munieru_jp)）と申します。
2016年に千葉工業大学を卒業し、現在は都内IT企業でエンジニアを生業としています。
大学時代は、C、Java、PHP、HTML、CSS、JavaScript、SQLあたりを学んでいましたが、現在はそれらに加え、React、Sassなども扱っています。
このままフロントエンドエンジニアになるのかと思いきや、今はサーバーサイドでJavaをメインにしており、一寸先は闇です。

## 弊社の異常な成長
弊社は今年からエンジニアの採用に力を入れ始めたらしく、18人いる同期のうち12人が技術職として採用されました。石を投げれば新人エンジニアに当たります。
しかしながら、社内の教育体制が完全には整っておらず、入社後2ヶ月間は外部の施設で技術研修を受けることになりました。
研修を終えたとき、同期は概ね以下の3つのタイプに分かれていました。

* **プログラミング経験がある人**
* **プログラミング経験がない人**
* **プログラミング経験はないが飲み込みが早い人**

ここで僕は、2つの危機感を覚えました。
1つは、**「このままでは他の人に抜かされてしまうのではないか」**という自身に対する危機感。
もう1つは、**「このままではエンジニアとしてやっていけないのではないか」**という同期に対する危機感です。

## 私は如何にして心配するのを止めて開発を愛するようになったか
入社3ヶ月後の7月から、僕を含む同期6人のチームによる社内システム開発が始まりました。
その中においても力量の差は明白で、僕の中の危機感はますます高まっていきます。
特に僕は新しいことを覚えるのが苦手らしく、流れの速いフロントエンド界隈の波に溺れるところでした。

そんな社内システム開発も12月16日にひとまずの終わりを見せ、僕たちはそれぞれのチームに配属されていきました。
その中で分かったことは、同じエンジニアでも人によって様々な特徴があるということです。
サーバーサイドに向いている人、フロントエンドに向いている人、他者とのコミュニケーションに向いている人……
今は微々たる違いでも、いずれはそれらの違いが明白になり、進むべき道も見えてくるのではないかと思います。
今の僕にできることは、与えられた業務をこなしつつ、それ以外のことにも手を出して自身の可能性を広げることです。

## 技術で業務を効率化
さて、このAdvent Calendarの趣旨としては、ここからが本題と言っていいかもしれません。
「それ以外のこと」として僕が実践していることの中に、**技術による業務の効率化**があります。
幸い僕はエンジニアなので、「こういうシステムがあればいいのに」と思ったら、ある程度は自分の手でつくることができます。
ここでは、僕が入社後に行なった技術による業務の効率化をご紹介します。

### Googleカレンダー+
新卒の業務の中に、電話応対というものがあります。
お客様からの電話を受けて名指し人に繋ぐのですが、弊社はフリーアドレス制のため、常に決まった場所に社員がいるとは限りません。 
また、仮に席が分かったとしても、その人がそこにいなければ、会議なのか休憩なのか、はたまた外出しているのか判断がつきません。

そこで、Googleスプレッドシートで社員一覧をつくり、Googleカレンダーへのリンクを貼ることで検索性を高め、同時にGoogleカレンダーに記載されていない不在情報も共有できるようにしました。
その後、Google Apps Scriptを用いてGoogleカレンダーから現在の予定を取得し、シート上に自動的に書き込むスクリプトも書いたのですが、書き込み処理中にリンクの挙動がおかしくなる副作用があるので、現在はその解決策を模索中です。

### ランチタイムスケジューラー
電話応対をする関係上、お昼休憩は同期の間で時間帯を分けて取らなければなりません。
以前は誰かが直接皆の希望を聞いてまわっていたのですが、それでは非効率的です。

そこで、全員の希望を**「前半」****「後半」****「ランダム」****「なし」**から選択し、スケジュールを組んで出力するJavaScriptを書きました。
また、Slackのリマインダー機能で平日の12:25に以下のようなメッセージを投稿するように設定し、直接聞いてまわらなくても皆の希望を確認できるようにしました。

```
お昼の時間だよ。希望する時間帯をリアクションしてね。
1️⃣：前半　2️⃣：後半　🎲：ランダム　❌：なし
全員の希望が揃ったら、誰かLTS使って結果を手動で貼り付けてね。
```

ただ、リアクションをもとにシステムを動かす処理と、システムが出力したテキストをSlack上に投稿する処理は手動で行なっているため、完全にシステム化できているとは言えません。

## おわりに
これらのシステムはもともと、何かの待ち時間の暇つぶしや、自身の技術力向上を目的として作成したものです。
来年の新卒がより良いシステムを開発してくれることを願いつつ、自身も負けないようにシステムの改良を進めていきたいと思います。
Spock で一部のメソッドだけ Mock する

この記事は [G*Advent Calendar Advent Calendar 2016](http://qiita.com/advent-calendar/2016/gastah)　の25日目です。
前日は @hikariru さんの [GrailsでHTTPクライアントを利用する(もちろんテストも書く)](http://qiita.com/hikariru/items/8fead70ee081d96c2cf9)　でした。

G*は、半年ほど前からSpockを触り始めただけですが、最終日が空いていたので思い切って投稿します。
歴は浅いものの、Groovy/Spockの柔軟性がテストで威力を発揮するのを実感しています。

# 概要

Spockで一部のメソッドだけMockする方法について書きます。

テスト対象メソッドが同一オブジェクトの別メソッドを呼んでいる場合などに、対象外のメソッドのみMockしたい場合などを想定しています。
※StubやMockではオブジェクト全体がMock化されます

なお、テスト対象クラスはJavaで書かれています。

# テスト対象クラス

```java
public class Name {

  private String firstName;
  private String lastName;

  public Name(String firstName, String lastName) {
    this.firstName = firstName;
    this.lastName = lastName;
  }

  public String getFullName() {
    return getFirstName() + " " + getLastName();
  }

  public String getFirstName() {
    return firstName;
  }

  public String getLastName() {
    return lastName;
  }
}
```

# 一部メソッドのMockにはSpyを使おう

Spyを使うことで、一部のメソッドだけ置き換えられます。

```groovy
class NameSpec extends Specification {
    def "Spyしてみる"() {
        setup:
        // コンストラクタ引数を渡してSpyする
        def spiedName = Spy(Name, constructorArgs: ['Taro', 'Yamada'])
        // 一部のメソッドだけ書き換える
        spiedName.getFirstName() >> 'Hanako'

        expect:
        // 書き換えたメソッド
        spiedName.getFirstName() == 'Hanako'
        // 書き換えていないメソッドはそのまま動く
        spiedName.getLastName() == 'Yamada'
        // 内部的に呼ばれているメソッドも同等に動く
        spiedName.getFullName() == 'Hanako Yamada'
    }
}
```

# MockやStubとの使い分け

参考までにMockやStubの場合も確認しておきます。

## Mockの場合

Mockはオブジェクト全体がMockされます。
Mockのふるまいは（必要なら）すべて明示的にする必要があります。

```groovy
def "Mockしてみる" () {
    setup:
    def mockedName = Mock(Name)
    // 一部のメソッドだけ書き換える
    mockedName.getFirstName() >> 'Taro'

    expect:
    // 書き換えたメソッド
    mockedName.getFirstName() == 'Taro'
    // 書き換えていないメソッドは何もしない
    mockedName.getLastName() == null
    // 内部的に呼ばれているメソッドも何もしない
    mockedName.getFullName() == null
}
```

## Stubの場合

Stubはオブジェクト全体がStubになります。
Stub値（戻り値）を書き換えることができます。
書き換えてないメソッドは空文字やdummyオブジェクトなど適当な値を返します。

```groovy
def "Stubしてみる"() {
    setup:
    def stubbedName = Stub(Name)
    // 一部のメソッドだけ書き換える
    stubbedName.getFirstName() >> 'Taro'

    expect:
    // 書き換えたメソッド
    stubbedName.getFirstName() == 'Taro'
    // 書き換えていないメソッドは適当な値を返す
    stubbedName.getLastName() == ''
    // 内部的に呼ばれているメソッドは無視して適当な値を返す
    stubbedName.getFullName() == ''
}
```

なお、Stubの場合MockやSpyで可能な呼び出し回数のテストを実行すると例外が発生するのでご注意下さい。

```groovy
// InvalidSpecException がthrowされる
1 * stubbedName.getFirstName()
```

# まとめ

- 一部のメソッドの書き換えには Spy を使う
- MockやStubとうまく使い分ける
- Spockは楽しい

# 参考

- [Interaction Based Testing](http://spockframework.org/spock/docs/1.0/interaction_based_testing.html#_mocking)
D言語くんがタイピングミスを矯正しにやってくる

D言語/D言語くんAdvent Calendar 2016の25日目です。

突然ですが、UNIX(Linux)にディレクトリの内容を表示する`ls`コマンドありますよね？
`ls`コマンドっていつも間違いませんか？

dubを使っているD言語使いの皆さんであれば、間違って `dub fetch dl`からの`dub run dl` とか打ちますよね？

え？
**ちょっと打ってみてください！**

…

…

…

…

…

…

…

…

```
  _   _
 (_) (_)
/______ \
\\(O(O \/
 | | | |
 | |_| |
/______/
  <   >
 (_) (_)
```
ばばーん

## なんだこれは
名目上は「lsコマンドのタイピングミスを矯正する高度なアニメーションを表示するプログラム」です。
はい。そろそろ何番煎じかわかりませんが、slコマンドに似せたジョークプログラムです。
slコマンド（Wikipedia）：https://ja.wikipedia.org/wiki/Sl_(UNIX)
  

なお、ANSIエスケープコードを使っているので、Windowsで動かすにはVisual Studio Codeのターミナルとか使ってもらうと良い感じになると思います。cmd.exeだと大体の環境は変な文字列が表示されます。
Visual Studio Code公式：https://code.visualstudio.com

### 元ネタ
本プログラムは、2015年のD言語くんAdvent Calendarで @simd_nyan さんがAAを作り、@ueshita さんが走るプログラムを公開されたのでその内容をベースにしています。また一部2016年のアドベントカレンダーから @kotet さんのアスキーアートもCreative commonsということで利用させていただいています。


## なにごとか
結果を見てそのままですが、`dub fetch dl`は「dubを使って、dlというパッケージをダウンロードする」、`dub run dl`は「dlというパッケージを実行する」というコマンドでした。

`dub run <package>`というコマンドで、dubに登録されている実行ファイルになるパッケージはfetch済みなら直接実行することができます。

`dub run <package> -- <options>`という具合に引数を渡すこともできます。（dlコマンドにも引数が…？--help…？）


## まとめ
以上、dubはツールのダウンロードから実行までお手軽簡単超便利！D言語くんかわいい！というお話でした。
あとはこの仕組みを使って何か便利なツールが出てくるといいなーと期待しています。

というわけで、みなさんもお手軽にD言語くんを召喚してタイピングミスを矯正しましょう！

2016年のD言語/D言語くんアドベントカレンダーお疲れさまでした！！

## 関連URL

- dlコマンド
  - dubパッケージ：http://code.dlang.org/packages/dl
  - GitHubリポジトリ：https://github.com/lempiji/dl
- [D言語くんのAAを作ったよ](https://gist.github.com/simdnyan/20e8fa2a2736c315e2c1)
- [lsを間違えてdlと入力してしまったときに、D言語くんが通り過ぎるコマンド](http://qiita.com/ueshita/items/06befb8790736c7294ae)
- [cowsay -f dman](http://qiita.com/kotet/items/a04955c206a2f56e16d8)
個人的に考えてみたSassの設計アイデア

Sassでコーディングを行う際の設計とコンポーネント作成のアイデアについて書きます。


#Sassのディレクトリ構成と役割

以下のような構成を考えてみました。
カテゴライズはSMACSSを参考にしています。

- base（各要素のデフォルトのスタイルを定義）
- layout（ページの大枠を作る）
- **object（ページに存在するコンポーネントすべて）**
    - **component（コンポーネントの実態を定義）**
    - **mixin（コンポーネントの形状と装飾のmixinを定義）**
    - **fixing（使いまわしされない固定されたコンポーネント）**
- utility（レイアウト調整用の汎用クラス）
- state（動的にスタイルが変わるもの）
- theme（ページ全体のテーマを変化させるもの）
- variables（変数の管理）

SMACSSでいうところのModuleをObjectとし、さらにその内部をcomponent, mixin, fixingで分けています。
プロジェクトの中で、汎用性のあるコンポーネントをcomponent、一度しか使われなかったり、今後変化しそうになさそうなものをfixingとして分けています。
また、componentとfixingにはプロジェクトに依存したコンポーネントを定義するので、他のプロジェクトでも使えるようにmixinを別の領域としています。

ここから、componentとmixinについて取り上げます。

#コンポーネントの設計アイデア
buttonというコンポーネントを例に
以下のような手順でコンポーネントを作成していきます。

1. object/component/\_button.scssとobject/mixin/\_button.scssを作成
    
2. object/mixin/\_button.scssにconfiguration（形状）とdecoration（装飾）のmixinを作成

```scss:object/mixin/_button.scss

//ボタンの形状 
@mixin button_configuration ($padding, $border, $border-radius) {
  padding: $padding;
  border: $border;
  border-radius: $border-radius;
}

//ボタンの装飾
@mixin button_decoration ($border-color, $background-color) {
  border-color: $border-color;
  background-color: $background-color;
}
```

3.object/component/_button.scssに形状と装飾のplace-holderを作成

```scss:object/component/_button.scss

/* 
形状
@mixin button_configuration (
padding,
border, 
border-radius
) 

装飾
@mixin button_decoration (
border-color,
background-color
) 
*/

/* 
形状のplace-holder 
*/

//長方形
%button_configuration-rectangle {
  @include button_configuration(5px 10px, solid 1px, 3px);
}
//正方形
%button_configuration-square {
  @include button_configuration(10px, solid 2px, 5px):
}

/* 
装飾のplace-holder 
*/

//ボーダー:白, 背景:灰
%button_decoration-white-gray {
  @include button_decoration(#fff, #d3d3d3);
}
//ボーダー:黄, 背景:オレンジ
%button_decoration-yellow-orange {
  @include button_decoration(#ffff00, #ffa500);
}
```

4.作成した形状と装飾のplace-holderを組み合わせてコンポーネントの実態を作成


```scss:object/component/_button.scss

//フォーム送信ボタン
.button_submit {
  extend %button_configuration-rectangle;
  extend %button_decoration-yellow-orange;
}

//戻るボタン
.button_back {
  extend %button_configuration-square;
  extend %button_decoration-white-gray;
}
```

floatやpositionなどのレイアウトに関わるプロパティについては、実態クラスごとに
直接書くようにします。

#今後の課題
##place-holderの命名が冗長になりがち
形状と装飾のplace-holderを組み合わせて実態を定義したクラスについてはプロジェクト内で使用される用途を明確にするためセマンティックな命名を意識していますが、
place-holderについてはプロジェクトに存在するコンポーネントの形状と装飾の数だけ、量産されていくため、プロパティに応じた具体的な命名をつけています。

しかし、プロパティが多い場合に命名が冗長になってしまうのと、プロパティの値の違いが少ししかない場合の命名をどうするかということにおいて曖昧さがあるのが今後の課題です。

##形状と装飾に振り分けるプロパティの判断基準がない
形状と装飾で使用するプロパティについては、コンポーネントの種類によって分けるようにしていますが、形状と装飾のどちらにプロパティを振り分けるべきか判断に困る場合があります。

#終わりに
OOCSSやSMACSSを参考に設計アイデアを考えましたが、BEMやMCSSなどの他のCSS設計のアイデアも取り入れて、今後も設計に磨きをかけていきたいと思います。
Vim 8.0 Advent Calendar 25 日目 ユーザーをハッピーにする

この記事は [Vim 8.0 Advent Calendar](http://qiita.com/advent-calendar/2016/vim8) の 25 日目の記事です。

長かったこの連載もついに最終回です。

## 「Vim ユーザーをハッピーにする」

2015 年の年末、Vim に以下のようなコミットが行われました。

```
Author: Bram Moolenaar <Bram@vim.org>
Date:   Thu Dec 31 16:10:23 2015 +0100

    patch 7.4.1005
    Problem:    Vim users are not always happy.
    Solution:   Make them happy.
```

Vim ユーザーをハッピーにする、と書かれたこのコミットは、1 つの Ex コマンドを追加するものでした。

## `:smile`

`:help version8` のページ内の `:smile` Ex コマンドの説明には、コミットメッセージと同様、以下のようにだけ書かれています。

```
|:smile|                make the user happy
```

この Ex コマンドを実行しても、何かとても便利なことが起きるわけではありません。しかし、これこそが Vim の願いであると感じます。

一部の例外はあるかもしれませんが、ソフトウェアはユーザーをハッピーにするために存在するものだと思います。少なくとも私はそうであると信じていますし、Vim はそのためにあると思っています。

今後も、Vim はユーザーをハッピーにするために進化を続けます。そして Vim を使った多くのユーザーがハッピーになることを願っています。

![`:smile`](https://qiita-image-store.s3.amazonaws.com/0/551/3ae152f1-03a5-cf63-d98e-10526147a037.png)

Happy Vimming!
特定の処理の前後にChatWorkに投稿する「capistrano-around_chatwork」

メリークリスマス！ :santa: 

最後は `cap deploy` とかの前後にChatWorkに投稿するためのgemの紹介です

* https://github.com/sue445/capistrano-around_chatwork
* https://rubygems.org/gems/capistrano-around_chatwork

# capistrano-chatworkとの違い
capistranoからChatWorkに投稿するプラグインで https://github.com/mitukiii/capistrano-chatwork がありますが、capistrano-chatworkは `cap deploy` の前後に投稿するのに対し、capistrano-around_chatworkでは任意のtaskの前後にChatWorkに投稿することができます。

# サンプル
![20150603215100.png](https://qiita-image-store.s3.amazonaws.com/0/8059/77befe6d-33c4-2248-c7da-246a46e1dc0a.png)

`cap unicorn:start` の前後にChatWorkに投稿しています。doneのtaskの実行時間も自動計算されます

# 使い方
```ruby:Capfile
require "capistrano/around_chatwork"
```

```ruby:config/deploy.rb
set :chatwork_api_token, "YOUR_API_TOKEN"
set :chatwork_room_id,   00000000

around_chatwork "unicorn:start"
```

ChatWorkのAPI tokenと通知先の部屋IDを設定し、前後を通知で囲みたいタスクを `around_chatwork` に書くだけでokです。

`chatwork_api_token` と `chatwork_room_id` は capistrano-chatworkと全く同じものなので、capistrano-chatworkを導入してる場合は同じ設定を共有できます


通知メッセージを編集したい場合は `starting_message` と `ending_message` をいい感じに編集して下さい。


```ruby:config/deploy.rb
set :starting_message, -> {
  "[info][title][#{fetch(:stage)}] :task_name: @#{fetch(:user)}[/title]started[/info]"
}

set :ending_message, -> {
  "[info][title][#{fetch(:stage)}] :task_name: @#{fetch(:user)}[/title]done (:elapsed_time: sec)[/info]"
}
```

文中の `:task_name:` と `:elapsed_time:` はフックしたタスク名とタスクの処理時間に置換されます。

# 詳しいこと
## capタスクの前後に動的にタスクを設定したい

capistrano 3系の仕組みはRake taskがベースなので下記が参考になります

[Rake で任意のタスクの前後に別のタスクを実行する - HsbtDiary(2012-02-10)](http://www.hsbt.org/diary/20120210.html)

実際のコードはこんな感じです。

https://github.com/sue445/capistrano-around_chatwork/blob/v0.1.0/lib/capistrano/around_chatwork.rb#L17-L35

```ruby:lib/capistrano/around_chatwork.rb
def around_chatwork(task_name)
  start_time = nil

  before_task = Rake::Task.define_task("#{task_name}:__before__") do
    message = Capistrano::AroundChatwork.format_message(fetch(:starting_message), task_name)
    Capistrano::AroundChatwork.post_chatwork(message)
    start_time = Time.now
  end

  after_task = Rake::Task.define_task("#{task_name}:__after__") do
    elapsed_time = Time.now - start_time
    message = Capistrano::AroundChatwork.format_message(fetch(:ending_message), task_name, elapsed_time)
    Capistrano::AroundChatwork.post_chatwork(message)
  end

  Rake::Task[task_name].enhance([before_task]) do
    Rake::Task[after_task].invoke
  end
end
```

ちょっと強引ですが、`around_chatwork` に渡されたtask名の前後に実行したいtaskをそれぞれ動的生成して、`enhance` と `invoke` に渡しています。

ちなみにcapistranoのbefore/afterでも同じことをやっています 
https://github.com/capistrano/capistrano/blob/v3.6.1/lib/capistrano/dsl/task_enhancements.rb#L5-L18
Polymerで アドベントカレンダーを作る

アドベントカレンダーの数合わせ @hchaki です。
最終日を仰せつかったのでがんばりたいと思います。うっひょー超メリー！ 

はい。

というわけで今日は **Polymer** について書きます。



Polymerは**WebComponents[^1]のライブラリ**のひとつで、テンプレート機能やデータバインディング、イベントリスナーなんかも一通り揃ってるかなり使えるライブラリです。

んで、このPolymerを使って、クリックすると中身を取り出せる箱「adv-box」という自作のコンポーネントを作りながら、それを実例に解説します。
以下がデモです。

[デモ：ポリマーでアドベントカレンダー作ってみる（下準備） ](https://plnkr.co/OKNoKzy4nvmyiHCUXWgC)

<img width="360" alt="adv-box" src="https://qiita-image-store.s3.amazonaws.com/0/148191/19b543a4-786b-e75e-9082-f33d53f623fe.png">


[^1]: webを部品単位（コンポーネント）で、構造・デザイン・機能にあたる html・css・jsをひとまとめにいい感じに取り扱う仕組み。アクセスカウンターからグーグルマップまで、人類の歴史はコンポーネントの埋め込みたさの歴史だった。みんな待ってた。


## テンプレートを使う

さて、さっそくPolymer使っていきましょう。「中身の入れられる箱」カスタムPolymerコンポーネントの**adv-box**を作ります。利用側の記述は、

```
<adv-box>中身</adv-box>
```
これだけです。

定義側の記述はこんな感じ。

```
<dom-module id="adv-box">
  <template>
    <div class="futa"></div>
    <div class="box">
    	<content></content>
    </div>
  </template>
  Polymer({
    is: "adv-box"
  });
</dom-module>
```

templateタグ内に注目してください。
実行時に`<template>`の記述が`<adv-box>`に置き換えられ、さらに`「中身」`が`<content>`に置き換えられます。

ここでは割愛しますが、他には、mustacheっぽい`{{}}`や`[[]]`みたいな書き方で属性値を埋め込んだり、`<dom-repeat>`や`<dom-if>`をつかった条件文やループ文でのテンプレート指定もできます。

# スタイルをあてる

定義側

```
  <template>
  	<style>
  		:host{
  			position: relative;
  		}
  		:host ::content{}
  		:host .futa{}
  	</style>
  	略
  </template>
```

スタイルは
- `<style>`内に直書きする
- 別ファイルの読み込み記述する
このどちらの方法でも大丈夫です。どちらの場合でも **ここでのcss宣言は外に漏れないので記述の衝突を気にする必要はあまりありません**。

特別な宣言記述があって、`:host`がadv-box自身を指し、`::content`が置き換えられた「中身」の要素を指す記述になります。それ以外はいつもみたいにスタイリングして大丈夫です。ひゅう便利！

# プロパティを使う

定義側

```
<dom-module id="adv-box">
Polymer({
  is: "adv-box",
  properties: {
    isOpen: {
      type: Boolean,
      reflectToAttribute: true
    },
  },
  ready: function(){
  	console.log( this.isOpen );
  }
});
</dom-module>
```

利用側

```
<adv-box is-open="1">中身</adv-box>
```

定義側properties節に注目してください。
propertiesで宣言したものが利用側のhtmlタグの属性値(attribute)と対応します。
例だとpropertiesで指定した値のキャメルケース`isOpen`とhtmlタグの属性値とスネークケース`is-open`が対応していて、メソッドの中で `this.isOpen` の形で利用できます。

さらに`reflectToAttribute:true`を指定すると、逆にpropertiesの値の変更でhtmlの属性値も変更されるので、これを利用してステータス別のcssを記述をすることもできます。


# イベントリスナーを使う

定義側

```
<dom-module id="adv-box">
Polymer({
  listeners: {
    "tap": "_onTap"
  },
  _onTap: function() {
    this.isOpen = true;
  }
});
</dom-module>
```

イベントリスナーは`listeners`に記述します。マウスイベントとタッチイベントのラップされたものが用意されていて便利です。

今回は割愛しますが、propertiesの値の変化を見張ることもできるし、要素内にidが指定されていればその要素に対して`id.tap`のようにしてリスナーを登録することもできます。

# まとめ

というわけで、まとめに入ります。Polymerは...

## ここがすごい！
- cssスタイルシートの影響が外に漏れない
- html属性値 - プロパティ値の自動連携が便利
- イベントリスナーの指定方法がラクチン。

## これはちょっと...
- 内部の要素にアクセスするにはPolymer指定の関数を使用しないといけない（shadowDOMだかの関係）
- idをつけてpolymer要素を呼び出すと、そのid名でグローバルにメンバー登録される（過激派！）

## 最後に

ご清聴ありがとうございました。
adv-boxを並べて、アニメーションだの包装紙だのも加えて、本来の意味でのアドベントカレンダー[^2]にしました。これくらいのことはできるんだぜ！

[^2]: エンジニアの年末チャレンジって意味じゃなくて、12月のプレゼント付きカレンダーという意味。

<img width="471" alt="advent calendar" src="https://qiita-image-store.s3.amazonaws.com/0/148191/f870f2db-6a1c-9069-63b0-639e5f1f6701.png">

[デモ：ポリマーでアドベントカレンダー作ってみる 3D](https://plnkr.co/NeZO9OclPq1U6fFrnq5K)

自分の担当した日付のプレゼントを開けよう！

 ---
[UE4] DrawMaterialToRenderTarget で遊ぶ

![image](https://qiita-image-store.s3.amazonaws.com/0/61553/0e7a2bf1-6b59-b380-1bd0-91427ed4a054.png)

Draw Material To Render Target についてです。
4.13で追加されたものですが、なかなか遊び甲斐のある機能です。



# 機能の概要
公式ドキュメント
https://docs.unrealengine.com/latest/INT/BlueprintAPI/Rendering/DrawMaterialtoRenderTarget/index.html

ようは、マテリアルの適用されたQuadをRenderTargetいっぱいに描画するという機能です。

「そんなことをして何の意味が」
「普通にマテリアルを張ればよいのでは」

と思われるかも知れませんが、たのしい使い方があります。


# 今回のツボ
描画した結果を次のフレームの入力マテリアルに突っ込んでループさせることで、
時間に沿って変化する感じのエフェクトを作ることができます。

つまり、たとえばRenderTargetを"RT1","RT2"の2枚用意し、
RT1を使ってRT2を更新する
RT2を使ってRT1を更新する
を繰り返します。

具体的にどういうことになるか、いくつかのサンプルを作ってみいました。

（性能低めのPCでやっているため動画の質は今一つです、ご容赦ください）

## 残像効果
前のフレームをちょっとずつ回したりスケールしたり減衰させたり色をつけたりしつつ、シーンキャプチャーでとった灰色さんを合成するとこういうのができます。

https://youtu.be/De4TSOPNtA4

最も思いつきやすい使い方でしょうか。
僕の微妙センスではこんなもんですが、
使う人によってはかっこよくなるはずです。


## ライフゲームもどき
ライフゲームとは・・・
https://ja.wikipedia.org/wiki/%E3%83%A9%E3%82%A4%E3%83%95%E3%82%B2%E3%83%BC%E3%83%A0

普通のライフゲームでは芸がないので、周囲のピクセルからたくさんサンプリングしたりライフを小数で表現するようにしてみました。
初期状態としてお馴染みのロゴを使用し、生死判定のパラメータを若干変えつつ並べてあります。

https://youtu.be/lxvE56uiEkA

カンでやってみましたが、SmoothLifeのようにはいきませんね。
しかし何故か脈打つような動きが見られたり網状の組織が生じたりして予想外にキモくなりました。気に入っています。

パラメータ次第ではブワッと広がったり全滅したりします。


## 波動
https://ja.wikipedia.org/wiki/%E6%B3%A2%E5%8B%95%E6%96%B9%E7%A8%8B%E5%BC%8F
僕を知る人には「またそれか」って思われそうですが、これはいいものです・・・！
波動方程式は時間軸について二階の微分を含む方程式なので、離散化すると過去2ステップの情報を要求する関数になります。
したがってRenderTargetが2枚では足りず、3枚をぐるぐる回して使用することになります。
カスタムノードを使用せずに組むと↓のような感じになります（マテリアルをよく触る人はお分かりかと思いますが、これでけっこうシンプルな内容です）。

![image](https://qiita-image-store.s3.amazonaws.com/0/61553/d81a19fd-be9b-ea03-ba7f-3fdb5e8730fd.png)


ここにグレイさんのシルエットをキャプチャーしたものを流し込むと
（さっきのと違って真上からのキャプチャーを使っています）

https://youtu.be/-PIe_jn_AMs

さらにこの結果を使ってグリッド状メッシュの頂点を動かすと・・・

https://youtu.be/4cWszaHRJI0

・・・どこかで見たやつに似てきましたね？



### 反転させる
面白いことに、過去2ステップの順序を入れ替えるだけで波が巻き戻ります（減衰しない場合）。
つまりこういうことができます。

https://youtu.be/lrHS1FGww4Y

・・・読めましたでしょうか？？


# まとめ
複数のRenderTargetを用いてDrawMaterialToRenderTargetを活用する例を挙げました。
他にもいろいろな応用があると思います。ぜひ使ってみてください。


以上でおしまいです。
MERRY CHRISTMAS! :D
炎の型工房 火の型 25日目 : 次回予告とあとがき

[<ruby>炎<rt>ほのお</rt></ruby>の<ruby>型<rt>かた</rt></ruby><ruby>工房 <rt>こうぼう</rt></ruby>ScratchとDartでゲームプログラム<ruby>入門<rt>にゅうもん</rt></ruby> Advent Calendar 2016](http://qiita.com/advent-calendar/2016/firefirestyle-studio)
の<ruby>記事<rt>きじ</rt></ruby>です

Happy Holiday 今日が最終日です。

<img width="361" alt="happyholiday.png" src="https://qiita-image-store.s3.amazonaws.com/0/54192/4cbde737-b52e-8444-b8c0-308873f39b31.png">

https://scratch.mit.edu/projects/137765520/



残念ながら、ScratchとDartでプログラム入門を、25で終わらせる事ができませんでした。
申し訳ない。
なので、まだまだ続きます。

http://firefirestyle.appspot.com/

or

https://github.com/firefirestyle
https://www.gitbook.com/@kyorohiro

に、まとめる予定です。

* 初級コンテンツをもっと追加する。
* 解説記事を増やす
* デモ作品の質の向上
* 紙に印刷できるようにする

とか、予定しています。
よろしくお願いします。



## あとがき

CoderDojo八王子、CoderDojo小平、CoderDojo中野 等で、
メンターをするようになり。
今年は一年は、教育について考えさせられました。

プログラムを習得するのに必要なものは何でしょうか。
プログラムに必要な知識や技術力は、大きな問題ではない気がします。

必要な知識って何って話です。
たとえば、プログラムで世の中に「何か」を提供する際に必要な
知識を私は教えることができません。

「何か」は、それを発見した数だけあり。多分、全人類の人口よりは多いでしょう。
そんなものは、前もって学習する事はできません。

「何か」が見つかったあなたは、幸せものです。
Tryしてみてください。
きっと、実現できますよ。
そして、どこでも習得できない知識や経験を得る事ができるはずです。



ではでは
Good Luck
Next Shinosaka.rb

## はじめに
Shinosaka.rbは設立から今年でまる3年です。
ほんとにあっという間で、たくさんのすばらしいエンジニアさんに出会うことができました。
そしてすばらしい仲間もたくさんできました。
大阪でもRubyのコミュニティが増えてきて、楽しい環境ができつつあります。
ただ、目的がないとコミュニティを継続できなかっり、マンネリ化してしまいます :sweat_smile:
そこで来年の意気込みをまとめてみます。

## 合同イベント
Shinosaka.rbだけではなく、他のコミュニティと合同イベントを開催します :rocket: 
お互いのコミュニティの強みを活かして、メンバー同士の交流をはかるのが目的です。

## Follow-up
これからRuby、Railsを始めたい人を積極的にフォローアップします :smile:
Shinosaka.rbとしてではなく、[Rails Follow-up Kobe](https://rails-followup-kobe.doorkeeper.jp/), [Rails Follow-up Osaka](https://rails-follow-up-osaka.doorkeeper.jp/)として活動していきます。

## OSS
松江Ruby会議の講演で感じたことなのですが、自分たちが開発しているコードと開発に利用しているライブラリのコードには垣根はないということ。
利用しているライブラリにバグがあるなら、修正してPRするってのは確かに自然です。
Shinosaka.rbのプロダクトを通じてOSS開発に参加していきます。
さらに、来年2月には OSS Gate Osaka が開催予定です。
OSS開発に参加する人を増やしていくことが目的です。

## Guild
Shinosaka.rbにはbackend、frontend、インフラなど様々なジャンルの優秀なエンジニアがいます。
なので、Guildを作ってみんでやれば良い仕事ができるのではと考えました。

自由に働き方が選べて、やりたい事に情熱そ注げる。
エンジニア同士でインプットとアウトプットすることで継続的に成長できる。
そんなエンジニアが幸せと思える環境を作っていきます。

## さいごに
僕は Follow-up、OSS、Guild をそれぞれ連動させたいと思っています。
参加メンバーのレベルに合わせた入り口を複数作って、最終的にはOSS開発やGuildに参加してもらうってのが狙いです :smiling_imp:
関西のコミュニティとも連携して、少しずつでも実現していきます。

Merry Christmas :christmas_tree: