OmniAICreator/Qiita-1.07M huggingface dataset:
UE4 変なマテリアル入門 4（形を動かす）

# index
[第1回（準備と簡単な例）](http://qiita.com/nkdtr/items/ca418529a1992ed5ab08)
[第2回（動くマテリアル）](http://qiita.com/nkdtr/items/81dca14e37a34fe32cb0)
[第3回（形を作る）](http://qiita.com/nkdtr/items/e6cf18160a5f3ff2fd18)
[(イマココ)第4回（形を動かす）](http://qiita.com/nkdtr/items/309274646d291ef676fd)
[第5回（テクスチャサンプリング*N）](http://qiita.com/nkdtr/items/6e09446659512c09e4bc)

# 概要
第2回、第3回の内容を応用して動く図形を作ります。
応用編ということで、記事としてのためになる度は低いかもしれません（元から低い気もしますが！）。
動画を見て、自分で同じことができそうだと思った方は記事を読む前にやってみるのも一興だと思います。
https://vine.co/v/OXqWQXwxzAL

# 円を動かす
円の描画には前回作成したMaterialFunctionを使用します。
Timeに応じて中心の座標を変化させれば動く円の出来上がりです。

物体を動かす場合にゲームプログラミングでよく使用される方法というと

1. 現在の座標を記憶しておく
2. それに速度*Δtを加算して次のフレームの座標を求める
3. 1,2を繰り返す

という感じだと思いますが、
マテリアル自体で「座標を記憶しておく」ことが容易ではありません（多分）。
今回とる方法は

1. 現在の時間から座標を求める方程式を作る

という、より原始的（？）な考え方によるものです。
　ゲームにおいてはプレイヤーによる入力や他のオブジェクトによる干渉があり通用しない場合が多いため、あまり馴染みがないかもしれません。

## 等速直線運動
まっすぐ一定の速度での運動は以下のように表されます。
座標＝初期位置＋速度*時間
たとえば初期位置(0.3,0),速度(1,1.22)とした場合、以下のようなグラフになります。
![linear_move.PNG](https://qiita-image-store.s3.amazonaws.com/0/61553/a21f8e3b-cffa-1f80-d119-14fef6e17edd.png)


## 端で反射させる
等速直線運動として導いた座標を鏡写しにしてX,Y成分それぞれを(0,1)の範囲に収めます。
この手の「マッピング」的な計算を考える場合、グラフで考えるのが楽です。

欲しいのは下図のようなグラフです。
(0,1)の範囲ではそのまま、それをはみ出すと戻ってくるという振る舞いを表現しています。

![mirror.PNG](https://qiita-image-store.s3.amazonaws.com/0/61553/05e1c54d-fb10-4518-19cf-6a2dfd13570b.png)

ここで、方程式からグラフを生成してくれるWeb上のツールをふたつ紹介しておきます。

wolfram alpha
http://www.wolframalpha.com/
グラフ描画以外にも色んな質問に答えてくれたりする謎のテクノロジーです。

Desmosグラフ計算機
https://www.desmos.com/calculator
グラフ特化。複数のグラフを表示したりパラメータを変化させてアニメーション的なこともできます。

先のグラフはwolfram alphaで表示させたもので、
こんな方程式になっています（もっとスマートな式があるかもしれませんが）。
1-abs(1-(frac(abs(x/2))*2))
こいつをMaterialEditorで再現すれば反射運動の完成というわけです。
またまたMaterialFunctionにしておきます。

![pingpong.PNG](https://qiita-image-store.s3.amazonaws.com/0/61553/53aae1fa-4bdf-1d3c-f094-b7bed4dd0e00.png)


## 四角を表示する
一見煩雑ですが、ロジックは円のときとほぼ同様です。
ポイントは縦と横それぞれで計算した値を乗算するところです。

![drawquad.PNG](https://qiita-image-store.s3.amazonaws.com/0/61553/260bbac3-2c69-579c-d187-9ccce7ed148b.png)


## 組み合わせる
それらを組み合わせて、こうじゃ・・・！
* 円の座標を前半で計算し、そのY成分を左右の長方形に渡しています。
* 複数の図形を描画する場合は適切なブレンドを考える必要があります。黒地に白の描画であればAddで充分です。
![pong.PNG](https://qiita-image-store.s3.amazonaws.com/0/61553/14d76bd9-d709-831e-5ac8-53e94700da79.png)



以上です。
次はちょっと普通のやつになる予定です。
Ruboty | ruboty-megen が生成する README に emoji 見出しを適用する emoji オプションを追加 #ruboty

# Ruboty | ruboty-megen が生成する README に emoji 見出しを適用する emoji オプションを追加 #ruboty

## <i class="fa fa-cubes" style="font-size:1em;"></i> 概要
ruboty-megen が生成する README に emoji 見出しを適用する emoji オプションを追加します

## <i class="fa fa-files-o" style="font-size:1em;"></i> 仕様
* README の見出しに emoji を設定
* emoji オプションを指定しない場合は、 emoji なしの README を生成

## <i class="fa fa-flask" style="font-size:1em;"></i> 使用例
### <i class="fa fa-file" style="font-size:1em;"></i> 通常時(今まで通り emoji なしで出力)

* ruboty-megen 実行

~~~bash
$ ruboty-megen init
$ ruboty-megen generate
~~~

* 出力結果

![ruboty-megen_before1.png](https://qiita-image-store.s3.amazonaws.com/0/43480/c70b2d2c-ddd6-8110-dee9-98faa85c4b4c.png)
![ruboty-megen_before2.png](https://qiita-image-store.s3.amazonaws.com/0/43480/7e729cad-c6c7-3850-1a50-28607cf0bb0a.png)

### <i class="fa fa-pencil" style="font-size:1em;"></i> emoji オプション使用時

* ruboty-megen 実行

~~~bash
$ ruboty-megen init
$ ruboty-megen generate --emoji
~~~

* 出力結果

![ruboty-megen_after1.png](https://qiita-image-store.s3.amazonaws.com/0/43480/c3b05753-da36-d945-c161-713b42d21c20.png)
![ruboty-megen_after2.png](https://qiita-image-store.s3.amazonaws.com/0/43480/b0d5f861-2b6b-17b1-96e9-11528847cade.png)

## <i class="fa fa-arrow-right" style="font-size:1em;"></i> 参照
* <i class="fa fa-github-square" style="font-size:1em;"></i> [ruboty-megen GitHub](https://github.com/tbpgr/ruboty-megen)
* <i class="fa fa-external-link-square" style="font-size:1em;"></i> [ruboty-megen RubyGems](http://rubygems.org/gems/ruboty-megen)
Qiita に新規追加された脚注記法を使ってみる #qiita #markdown

# Qiita に新規追加された脚注記法を使ってみる #qiita #markdown
## <i class="fa fa-cubes" style="font-size:1em;"></i> 概要
Qiita に新規追加された脚注記法を使ってみます [^1]

## :books: 文法
### :baby_chick: 脚注リンク元

~~~markdown
Qiita に脚注記法が追加されました [^1]
~~~

### :chicken: 脚注リンク先

~~~markdown
.[^1]: [Qiita Blog | 脚注記法に対応しました](http://blog.qiita.com/post/105484781374/qiita-markdown-supporting-footnotes)
~~~

※本当は先頭のドットは不要なのですが、Markdown の pre 内部が消えてしまうので仕方なくドットを付与

### :fork_and_knife::rice: 動作確認

脚注の表示については、この記事自体で確認できます。

## <i class="fa fa-github-alt" style="font-size:1em;"></i> 脚注記法のソースコード
Markdown の実装は、 GitHub の qiita-markdown レポジトリで公開されているようです。 [^2]

## :bomb: ゲシュタルト崩壊
Qiita の脚注の使い方を Qiita の脚注の使い方で説明して その説明の脚注に Qiita の脚注記法を利用する

## :memo: 脚注
[^1]: [Qiita Blog | 脚注記法に対応しました](http://blog.qiita.com/post/105484781374/qiita-markdown-supporting-footnotes)
[^2]: [GitHub | Qiita::Markdown](https://github.com/increments/qiita-markdown)
クマの名前は日曜日


![スクリーンショット 2014-12-24 17.44.52.png](https://qiita-image-store.s3.amazonaws.com/0/3940/c5e01184-e5a8-8864-562f-444bce63b30f.png)

「BEARの次のバージョンを作ろう。名前は...普通にBEAR 2とか?」

「面白くないかな。OSXが猫の名前をバージョンに使ってるように、クマの名前をバージョンにすればどうだろう?」

「いいね」

.. 検索　検索

グリズリー、ツキノワグマ...どうも怖い感じの名前ばかり..

.. 検索　検索

衝撃的なタイトルの絵本に出会いました。



> **「クマの名前は日曜日」** - アクセル・ハッケ作
>
> 大好きなクマのぬいぐるみの「日曜日」は、なんにもしゃべらないし、だきついてもこない。ぼくのことをどう思ってるんだろう…。独特な詩的世界をえがくドイツの作家ハッケと、映画「アメリ」のキャラクターデザイナーとしても活躍した画家ゾーヴァのコンビによる子どもと大人のための絵物語。

![bearsund6.jpg](https://qiita-image-store.s3.amazonaws.com/0/3940/bd1d80b3-a5c8-2349-30f9-83f92d068033.jpeg)

![bearsund7.jpg](https://qiita-image-store.s3.amazonaws.com/0/3940/cf093b6f-e329-ab54-d45e-0642dd39bc02.jpeg)




日曜日という名前のクマが出てくるお話 ... 最高だ。
クマが嫌いな人いる？日曜日が嫌いな人は?

いないだろう。クマと日曜日はみんな好きだ！

よし決定！ **BEAR.Sunday** ！

じゃ今までのBEARはBEAR."Saturday".

# BEAR.Sunday

そうやって名前が決まりました。

去年、イギリスのphpnwで初めてBEAR.SundayをプレゼンテーションをしたときのQA最初の質問。

「多分、みんな思ってると思うけど、どうしてBEAR.Sundayって名前なの？」

...

2014年、今年もお世話になりました。12月22日には1.0.0-alphaをリリースしました。
来年もよろしくお願いします。

それでは、みなさん良い年末年始を。

Merry Christmas and Happy new BEAR !
WebStorm 10について

こんにちは、らこです。WebStorm/PhpStormアドベントカレンダー最終日となりました。「空いた日は埋める」とか言ってましたがガバガバ空いててすみません。それでも有益な情報が集まったので私としては満足です。来年はもっと参加者が増えたらいいなと思います(IDEAやRubyMine等と合流しろという話である)

# 未来に目を向けよう
終わった話をしても仕方ないのでこれからの未来、WebStorm 10について考えましょう。Issueを漁って、10.0で実装される機能を予習しておきましょう。

## Major

### Firefoxでデバッグできるように戻る
[FireFox debugging doesn't work after updating FireFox to version 33.0](https://youtrack.jetbrains.com/issue/WEB-13801)
長らく使えなかったFirefoxのエクステンションが復活する？みたいですが、まだIn Progressなので延びるかもしれません

### Dartのリモートデバッグに対応
[Support remote debugging of command line Dart apps](https://youtrack.jetbrains.com/issue/WEB-14475)
すでに起動中のDartVMにアタッチできるようになります。強い。まだSubmittedなので頑張って欲しい

### Dartでも関数の呼び出し階層が見られるようになる
[Support Call Hierarchy navigation for Dart](https://youtrack.jetbrains.com/issue/WEB-14370)
ようやくです。いよいよIDEAでJava書くくらい快適になりつつあります。これもまだSubmittedですね。

## Normal

### TypeScriptのコンパイルをFile Watcherから公式tscに切り替える
[Use TypeScript compiler as a service to dramatically improve compilation speed of TS file watcher](https://youtrack.jetbrains.com/issue/WEB-11491)
File Watcherで変更検知してtscを呼んでコンパイルするよりもtscをサービスとして常駐させてコンパイルして高速化しようという試み。地味にめちゃくちゃアツい。絶対成功してほしい。

### Dartのインジェクション機能追加
[Add support to language injection in Dart.](https://youtrack.jetbrains.com/issue/WEB-9322)
Dartに対してAlt+Enterでできることを増やします。楽しみ。

### Dartの文字列リテラル中のHTMLを書きやすくする
[Dart: Nice to inject html if new Element.html(`"<div></<div>"`) is used](https://youtrack.jetbrains.com/issue/WEB-8322)
楽しみ。JavaScriptにはある機能なのでDartで使えるととても嬉しい。

### DartのLive Templateを追加
[Add more predefined Dart Live Templates](https://youtrack.jetbrains.com/issue/WEB-14603)
Dartのスニペット追加。楽しみ。

### Dartの正規表現チェック
[Dart: support RegExp injections : WEB-11088](https://youtrack.jetbrains.com/issue/WEB-11088)
RegExpに渡す文字列リテラルから正規表現チェックできるようにする。強い。

その他の10.0のFeature Issueは[こちら](https://youtrack.jetbrains.com/issues/WEB?q=%2310.0+sort+by%3A+Priority%2C+Votes+%23Feature)

## Twitterで新機能募集してた
[@WebStormIDE](https://twitter.com/WebStormIDE)が先日10.0でサポートしてほしいツールやフレームワーク、ライブラリがないか募集してました。

<blockquote class="twitter-tweet" lang="ja"><p>What would you like to see in WebStorm 10? In your opinion, what are the hottest tools, frameworks and libraries around?</p>&mdash; JetBrains WebStorm ( @WebStormIDE ) <a href="https://twitter.com/WebStormIDE/status/545243641439326208">2014, 12月 17</a></blockquote>

世界中から山のようにリプライが飛んできているので追っていくことはしませんが、私はChrome Appのプロジェクトテンプレートや、実行をサポートしてくれるように尋ねたところ、「多分できるぜ！」的な返事をもらえました。[詳細](https://twitter.com/laco0416/status/545257059654975488)

楽しみにしておきます。

# まとめ
12/1からのアドベントカレンダー、惜しくも17記事での終了となりましたが、参加者のみなさん、読者のみなさん、ありがとうございました。来年もこれまでどおりWebStormの最新情報まとめていきますので何卒よろしくお願いします。
親愛なるサンタさんに手紙が届きますように。



この投稿を書くことになった理由は、Facebookグループや
もくもく会に参加した際に募集していることを知り、
安易に登録してしまいましたが、今とても後悔しています。
よく考えてみたら、私にはまだ技術力がないからです。

2014年10月から **Salesforce** をカスタマイズするお仕事に一様携わっています。
分科会やワールドツアーに参加しましたが、
話のネタが全く思いつきません。。。
勉強不足で申し訳ございません。

この数ヶ月でわかったことは、 **Salesforce** は素晴らしいサービスであるということです。
来年のカレンダーでは少しはまともに成長して小ネタがかけるようになりますので、
今回は下記に手紙で失礼します。
 
          



＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊










####サンタさん :santa: :christmas_tree: 
良い子にしているので、今後も **Salesforce** に関わる全ての人が
幸せでいられるような魔法を教えてください :yum: 
####メリークリスマス :bell: 




＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊
今こそ復習したい、iOSアプリのディレクトリ構成


今更感も漂うテーマですが、「なんでもかんでもDocumentsディレクトリに入れる」という運用をしていると、ガイドラインに引っかかってリジェクトされたりもするので、復習を兼ねてまとめておきたいと思います。


## iOSアプリのディレクトリ構成
iOSアプリのディレクトリ構成は下記のようになっております。

ちなみに、この画面は Xcode＞Window＞Devices を開いて、実機を選択し、"Installed Apps"をダブルクリックすると見ることができます。

![dir.jpg](https://qiita-image-store.s3.amazonaws.com/0/13070/e526e02f-c5db-0150-9fe7-d6a71a433833.jpeg "dir.jpg")


## File System Programming Guide
それでは、Appleの資料を元に各ディレクトリを見てみましょう。

[File System Programming Guide: File System Basics](https://developer.apple.com/library/ios/documentation/FileManagement/Conceptual/FileSystemProgrammingGuide/FileSystemOverview/FileSystemOverview.html)


#### MyApp.app
* 読み込み可能
* 書き込み不可能
* iTunesでバックアップされない。

いわゆる、Bundle containerというやつです。Xcodeのプロジェクトに画像ファイルなどを追加する事があると思うのですが、そういったものはここに入ります。


#### Documents/
* 読み込み可能
* 書き込み可能
* iTunesでバックアップされる。

ユーザー作成のコンテンツ（テキスト、写真）がここに入ります。設定によっては、iTunes経由などで見ることができるので、ユーザーに見られて困るようなファイル(設定ファイルとか)はここに置いておくべきではないです。


#### Documents/Inbox
* 読み込み可能
* 書き込み不可能（削除は可能）
* iTunesでバックアップされる。

他のアプリからファイルを受け取るときに使用するディレクトリ。

#### Library/
* 読み込み可能
* 書き込み可能
* iTunesでバックアップされます（Cacheディレクトリを除く）。

ユーザー作成のファイル以外のデータ保存用のディレクトリ。Documents/ に入れるようなデータ以外の者は、だいたいここに入れておけばokな感じです。

#### Library/Cache
* 読み込み可能
* 書き込み可能
* iTunesでバックアップされない。
* システムから自動削除される場合あり。

キャッシュ用途に使用します。OSが勝手に消しちゃう場合もあるそうなので、消されると困るデータは、ここに置いておくべきではないです。

#### tmp/
* 読み込み可能
* 書き込み可能
* iTunesでバックアップされない。
* アプリが起動していない時に、システムが自動削除する可能性がある。 **2016/05/11 修正しました**

テンポラリーファイル用のディレクトリです。アプリ起動中のファイルの追加/削除は、自分で管理する必要があります。
また、アプリが起動していない時に、システムが削除する場合があります。アプリが再起動した場合は、tmpディレクトリ内のファイルは削除されていると想定して設計するのが良いでしょう。


## iOS Data Storage Guidelines
もう一つデータディレクトリを使用する上で見ておくべき資料が、「iOS Data Storage Guidelines」です。

[iOS Data Storage Guidelines - Apple Developer](https://developer.apple.com/icloud/documentation/data-storage/index.html)

### リジェクト
このガイドラインに従っていない場合、AppStoreの審査でリジェクトになる場合があります。

※例えば、SQLiteのDBファイルをあらかじめ作成しておき、BundleからDocumentsフォルダにコピーして利用すると、ガイドライン(1)に引っかかるためリジェクトの対象になります。

ネットでは↑のようなことをしているサンプルが多いですが...注意が必要です。

### ガイドライン

ガイドラインは4項目あります。とりあえず「ざっくり」訳しておきます。

1. Documentsフォルダに置いていいのはユーザー作成のデータのみおくべし
ユーザ生成のデータではないファイルや、キャッシュデータなどは置いてはいけないです。

2. 再ダウンロード出来るデータ、再作成できるデータは/Library/Cachesに置くべし

3. テンポラリーファイルは /tmp に置くべし

4. バックアップが不要なファイルは  "do not back up" attribute を付けるべし

基本的にAppleの意図としては、「iCloudでバックアップされる容量を最低限にしたい」というのが目的みたいです。「Cachesとかtmpファイルをちゃんと使えよ」というのを徹底したいようです。


## まとめ
データファイルというと、てきとーに「Documents」に入れてしまいがちなのですが、実はきちっとしたガイドラインがあり、守らない場合はリジェクトされてしまいます。

アプリでファイルを保存するときは、これらのことを頭の片隅に置いて、一発で審査に合格するようにしましょう〜。
Pepperさんとのおでかけに持っていきたい7つ道具


Pepperさんと一緒におでかけしたい！というときに役立つ道具をご紹介します。

#7つ道具
## 1. キャリーカート
30kg 近い体重の Pepper さんと一緒に移動するのは大変です。キャリーカートを利用すると、移動がとても楽になります。

![p1.jpg](https://qiita-image-store.s3.amazonaws.com/0/43450/d37b1adf-2218-628c-e336-788c149ac3a8.jpeg)

写真は、ジョイフル本田で入手した、ジャンボスライドキャリーカートです。
https://joyfulhonda.jp/item/21559/

長距離を移動する場合は箱に入れましょう。そのまま持ち運ぶのは、ペッパーさんの関節にもあなたの体にも悪影響があります。

## 2. ノートPC
キャリーカートが大きいのでうっかり忘れてしまいそうになりますが、Developer向けではノートPCは必須です。忘れないようにしましょう。

## 3. ブレーキ解除キー
Pepper さんをちょっと抱えたいときに腰と膝に刺すブレーキ解除キーです。
![p2.jpg](https://qiita-image-store.s3.amazonaws.com/0/43450/e3ad1e0c-247f-b01d-d2fa-a81d7d2015e4.jpeg)

抱えるときには、首のところの緊急停止ボタンを押しておくと、抱えたときにタブレットの裏側の電源ボタンをうっかり押しても起動しないので安心です。

![p4.jpg](https://qiita-image-store.s3.amazonaws.com/0/43450/af315c84-9b8c-5088-f294-021eaa96d157.jpeg)


## 4. モバイルWiFiルータ
ノートPC と Pepper さんをつなぐルータです。

![p5.jpg](https://qiita-image-store.s3.amazonaws.com/0/43450/051f70b0-7a67-a7ae-9820-5545014e02a0.jpeg)

ノートPC と Pepper さんがモバイルWiFiルータ経由で接続できるかどうかあらかじめ確認しておきましょう。モバイルWiFiルータの機種によっては設定の変更が必要だったり、そもそも接続できないタイプもあります。


## 5. LANケーブル
人が多いところでデモをするときなど、WiFiがつながりにくい場合があります。そんな時は有線接続です。LANケーブルを刺す場所は、頭の裏です。ブレーキ解除キーで開けることができます。プログラムを書き込んだら元に戻しておきましょう。

![p3.jpg](https://qiita-image-store.s3.amazonaws.com/0/43450/45411375-ced5-2d9a-7169-ef8529ea9690.jpeg)

## 6. 3P - 2P 変換アダプタ
外出先では 3P のコンセントが利用できない場合も多々あります。そんな時に備えて変換アダプタを忘れないようにしましょう。
![p6.jpg](https://qiita-image-store.s3.amazonaws.com/0/43450/183020f9-cd95-d46c-d293-f505d348617b.jpeg)
http://www.amazon.co.jp/dp/B00008BBJY/

## 7. VOICEROID+ 民安ともえ (弦巻マキ) EX
外出先で新しい言葉を話してもらいたくなった、でも、アクセントがなんか変！というときは、同じ読みで別な漢字やカタカナに置き換えたりしてアクセントを調整するといったことが必要になりますが、試行錯誤が結構大変です。そんな時には Pepper さんの中の人の音源をつかいましょう。こちらでそっくりな声が出せます。もちろんアクセントの編集もできます。

![p7.png](https://qiita-image-store.s3.amazonaws.com/0/43450/6842ed8c-07fe-1d86-f367-857402df4d51.png)

http://www.ah-soft.com/voiceroid/maki/

# おわりに
それと大事なのは Pepper さんと楽しむ心です。ほんと大事！
それでは Pepper さんとのハッピーライフを。
LSL(Linden Script Language)のご紹介

# LSLとは #
[マイナー言語 Advent Calendar 2014](http://qiita.com/advent-calendar/2014/minor-language)飛び入り参加させて頂きます。

ご紹介いたしますのはLSLことLinden Script Language。Lindenとは仮想世界サービス[SecondLife](http://jp.secondlife.com)内を運営する会社。セカンドライフ上で動作し、仮想世界内の事物を操作するスクリプトです。

はいそこ、「セカンドライフってまだあったのか」とか言わない。

# Linden Script Language #
## どうやって書くか ##
![lsl.png](https://qiita-image-store.s3.amazonaws.com/0/57680/21c47f35-b5cc-c11e-d907-a1ea6da4f20c.png)
仮想空間内の建築やアクセサリなどは形をもったオブジェクトとして生成されており、オブジェクトはその内部にさらに別のオブジェクトやテクスチャなどのコンテンツを持つ事ができます。スクリプトもこのコンテンツの一つとして作成します。オブジェクトの編集画面でコンテンツリストを開き、New Scriptというボタンを押すとリスト内にスクリプトファイルが作成され、編集画面が開くのでそこに書いていきます。

### IDEとかないのん？ ###
専用エディタ、EclipseやVim,Emacsのプラグイン、秀丸のハイライトファイルとかありますが、結局のところ仮想世界内にしかコンパイラがないので最終的には上記の編集画面にコピペして動かすことになります。

## どうやって実行するか ##
スクリプトは保存と同時にコンパイルされ、エラーがなければサーバにバイトコードとして格納されます。この時、編集画面の「Running」にチェックが入っていればサーバのスクリプトエンジン上で即実行を開始します。

なお、サーバのスクリプトエンジン(VM)は、以前はリンデン社が独自開発していましたが、現在はMonoが採用されています。

## 何ができるか ##
### オブジェクトのパラメータ操作 ###
オブジェクトの色や形、表面テクスチャ、位置や回転などのパラメータを操作します。  
例：
クリックされると90度回転して開くドア
波のうねりを表現した水面のアニメーションテクスチャ

### チャット ###
チャットのリスナーを定義することで、アバターがチャット（発言）した内容を検出できます。チャットはアバター同士のオープンな会話の他、チャットチャンネルを指定することでチャットウィンドウには内容を表示せずに発言できるため、オブジェクト同士の通信やアバターからオブジェクトへのコマンドのチャンネルとして使用することもできます。

### 情報検出 ###
スクリプトが格納されたオブジェクトを基準に、周囲のアバターやオブジェクトの存在や衝突を検出できます。
例：
アバターが乗るとその先のドアが開く自動ドアマット
周囲のアバター名をリスト表示するレーダー

### パーティクル発生 ###
クライアントの画面上にパーティクル効果を発生させることができます。パーティクルは豊富なパラメータによって色や形状、動きを定義することができます。
例：打ち上げ花火

### 物理演算 ###
オブジェクトには物理演算を適用することもできます。物理演算が有効なオブジェクトでは、スクリプトによって物理演算の各種パラメータを取得・設定することができます。
例：ピッチングマシーン

### 乗り物 ###
オブジェクトをユーザが操作する乗り物として動作・制御させるためのビルトイン関数群が豊富に定義されており、これらを使うことにより気球からバイクまでさまざまな挙動の乗り物を作成することができます。

### メディア操作 ###
オブジェクトのある空間に対して権限をもったオーナーであれば、外部サーバに存在する音楽や動画をストリーミング配信することができます。  
また、スクリプトと同じオブジェクトに格納された短時間のWavファイルであれば、空間オーナーでなくても（スクリプト実行が許可されていれば）自由に再生することができます。

### アバターアニメーション ###
指定したアバターに任意のポーズをとらせたりアニメーションを実行させたりすることができます（ただし実行開始時にそのアバターに対して許可を求めるダイアログが表示され、そのアバターが許可した場合に限ります）  
ポーズやアニメーションは、事前にMMDライクなフリーツールを使ってbvhファイルとして作成し、サーバにアップロードしたものをオブジェクトに格納して指定します。

# 文法的なこと #
## ステートとイベント ##
スクリプトの実行中は常に１つのステートにおかれています。スクリプトの開始と同時にdefaultステートが開始され、以降はstate命令を書くことでユーザが定義したステートに切り替えることができます。

各ステートはそれぞれ開始時/終了時、オブジェクトが生成された時、ユーザにクリックされた時などのイベントハンドラを持ち、スクリプトの挙動は全てこれらに紐付けられたイベントプロシージャ内に記述してゆきます。
## 型 ##
数値はintegerとfloat、文字列はstringに加えてUUID形式の文字列を扱うことに特化したkey型。
UUIDだけ特別扱いなのは、仮想空間内のオブジェクトやアバターは全てUUIDを振られており、これによって識別するためです。

さらに物体の座標を扱うvector、同じく回転を扱うrotation、配列的なデータを扱うlist（ただしインデクサ的な書き方はできず、要素を取り出すのに型別に定義された関数を使う）の計7種類の型があります。
## 制御構文 ##
条件分岐はまあ普通にifとelse。switch-caseはなし。ループはforとwhile。foreachもなし。その他、ラベル指定のjump命令と関数からのreturn、加えて前述のステートを切り替えるためのstate文があります。ラベルは先頭に@をつけて表現します。
## ビルトイン関数 ##
llSayなど、プレフィックス"ll"をつけた名称の関数が、ビルトイン関数として定義されています。一部の数値・時間計算用の関数を除いて、ほとんどが仮想世界内の情報を扱う関数です。

# 注意 #
前述のように、スクリプトは全て仮想空間をホストするサーバのスクリプトエンジン上で実行されます。したがって負荷の高いスクリプトが多く存在するサーバでは、空間のレンダリングやアバターの動作にも影響が出ます（いわゆる「重くなる」）。  
そのためスクリプトの記述には、極力負荷を軽減することが求められます。

# 参考 #
[LSL ポータル - Second Life Wiki](http://wiki.secondlife.com/wiki/LSL_%E3%83%9D%E3%83%BC%E3%82%BF%E3%83%AB)
ADVENT2014 クリスマスイヴにプロ生ちゃんとﾊｧﾊｧ。

こんばんわ。

世の中は聖夜というやつでしょうか。    
私は今日も明日も明後日も聖夜もパソコンのモニタがパートナーです。     
ということで、聖夜のエントリー行ってみましょう。

今日のエントリーは、    
「プロ生ちゃん Advent Calendar 2014（http://qiita.com/advent-calendar/2014/pronama-chan）」     
の12月24日分のネタです。

ホントはクリスマスイベントに絡めたプロ生ちゃんとﾊｧﾊｧするアプリ開発やろうと思ったんですけど、間に合わず・・・。

とりあえず、素材だけは準備できたので、素材の準備過程と、素材の制作ツールの紹介をしてみたいと思います。

さて、昨今は３Dでモデリングして開発環境に取り込むなんてことがフツーの行われていて、正直昭和40年代生まれのワタクシとしてはなんとかうまく利用したい（でも時間ない）と、作画の良さもまだまだ・・・と思いたいジレンマで葛藤しつつ、レガシーなドロー系ツールで画像作成にいそしんでおります。

いつかは３Dの画像作成ツールを上手く利用したい・・・と思いつつ。

昨日のMavoroshi_Oniさんによる”プロ生ちゃん Advent Calendar 2014”    
「Spineでプロ生ちゃんに動いてもらう（http://qiita.com/Mavoroshi_Oni/items/5317f83b23fd76ef9b6b）」     
にて紹介されていたのは、２Dのグラフィックにモーションを付けるツール「Spine」でしたが、タイムリーにもその素材作りとしても、まだまだドロー系ソフトは必要だ！と、このエントリーを綴ることにいたしました。

私は、アプリの画面やアイテムなどの画像に始まってちょっとしたプレゼンテーションからフライヤー制作、ありとあらゆる画像制作を「Inkscape」というドローソフトを使っています。

「Inkscape」の利点としては

１．Illustratorと同様の操作感で基本的な画像制作ができる    
２．SVGという汎用フォーマットで利用できる     
３．軽い     
４．タダである

のあたりがあげられます。

AdobeのIllustratorはドローツールとしては最高峰、至れり尽くせりの高機能さですが、    
如何せん高価であることがネックです。     
そもそも我々のようなエンジニアにとって「絵を描くこと」は直接売上の上がるものではなく、あくまで成果物の一部であるわけなので、最低限の機能をできる限りコストをかけずに利用できることはとても重要なのです。

さて、今回当初はプロ生ちゃんとクリスマスイブにﾊｧﾊｧするWindosPhoneアプリを作る予定が諸般の事情で一歩間に合わずになりました。

そのアプリ製作の過程で、プロ生ちゃんのイメージが必要になるのですが、以下のような条件があります。

１．最近の高画質なスマホでも絵が乱れないこと。（高解像度）    
２．表情を変化させるので、何パターンかの表情を作成できること     
３．クリスマスに会ったイメージであること

１．についてはネットで利用可能とされている画像は絵師さんによって提供されておりますが、気に入った絵に対してすべて「２」が提供されているわけでもなく、またそれが「３．」の要件を満たすわけでもないので、「なら描くべか」となるわけです。

元絵から描いてもいいのですが、今回はなるべくイメージを崩さなようにということで    
既存のイラスト（Character Design/Illust: Ixy）から、上記の要件を満たす絵を起こすことにします。
  
ここで登場するのが「Inkscape」なわけです。    
元絵を下書きに、「Inkscape」でベジエを使ってトレースし、必要な「２」や「３」を追加しつつ、最終的には画像を出力していくというわけです。
  
一つ一つ画像で解説すると大変なので、元絵から完成までを録画してみました。

![](http://privater.cocolog-nifty.com/photos/privaternet/s23t20141224233346.png)
https://www.youtube.com/watch?v=2S7qPxH7LFs

ということで、ドローソフトなので、解像度に依存せず元絵をどんな解像度でも出力できるようになりました。かつ、レイヤーの表示非表示でアイテムを付け加えたり、表情を変更したり、また特定の顔のパーツだけを取り出すことも可能となります。

![元絵からクリスマス用に着せ替え](http://privater.cocolog-nifty.com/blog/Windows-Live-Writer/ac63ee2b1a1b_13655/pronama_image001_thumb.png)

元絵からクリスマス用に着せ替え

![元絵から顔を抜き出して表情変更](http://privater.cocolog-nifty.com/blog/Windows-Live-Writer/ac63ee2b1a1b_13655/pronama_image002_thumb.png)

元絵から顔を抜き出して表情変更

  
![そして冒頭の絵は、背景を変更してみたものです。](http://privater.cocolog-nifty.com/blog/Windows-Live-Writer/ac63ee2b1a1b_13655/merchr_thumb_1.png)

  
そして冒頭の絵は、背景を変更してみたものです。


使い方の詳しい説明などは以下のサイトなどを参考にしていただければよいかと。

  
（投げやりですみません・・・。）

  
オフィシャル    
Inkscape(日本語に対応しています。）     
https://inkscape.org/ja/

  
わかりやすいチュートリアル    
「InkscapeでDesign」     
http://inkscapedesign.web.fc2.com/

  
プロ生ちゃん（Character Design/Illust: Ixy）     
プロ生ちゃん（暮井 慧） | プログラミング生放送

  
   
壁紙集（元ネタ拝借元）     
壁紙 | プログラミング生放送
【Swift】NSUserDefaultsを使用した，Today Extension Widget，メインアプリ間のデータ共有


Today Extension Widget，メインアプリ間で，データを共有する際，NSUserDefaultsを使用する．
もちろんのことながら，XcodeプロジェクトのTargetsにおけるApp Groupsの登録が必要．
またそのApp Groupsの名前を`NSUserDefaults(suiteName: "NameOfAppGroup")`でセットする．
そして，共有するデータにおける共通の鍵を`forKey: "MyKey"`で設定する．

**データの保存**

```swift
let defaults: NSUserDefaults! = NSUserDefaults(suiteName: "NameOfAppGroup")
defaults.setObject("SharedStrings", forKey: "MyKey")
defaults.synchronize()
```

**データの呼び出し**

```swift
var defaults = NSUserDefaults(suiteName: "NameOfAppGroup")
let objects = defaults!.objectForKey("MyKey") as? String
```

なお，上記例は`"SharedStrings"`の文字列を共有している．
Android UiAutomatorを用いた「自動テスト」の試み

この記事は[リクルートテクノロジーズアドベントカレンダー](http://qiita.com/advent-calendar/2014/recruit-technologies)24日目の記事です．

私が所属するスマートデバイスグループで行っている
Androidアプリ開発における「自動テスト」の試みについて紹介します。


# UiAutomatorを用いた全自動モンキーテストツールの開発

画面内のUiオブジェクトを自動解析することで、
クラッシュ検知を目的とした「適用コスト０でアプリの品質向上に寄与できる」自動テストツールを開発しています。
この記事ではそのツールについて紹介させていただきます。

## UiAutomatorについて

本ツールは [UiAutomator]
(http://developer.android.com/tools/help/uiautomator/index.html)という、Android SDKに含まれているテスト自動化ツールの機能を主に用いて作っています。
UiAutomatorの機能としては画面上のUI情報の取得、各種タップ/ロングタップ/スワイプなどのイベントのシミュレート、ハードキーの押下や文字入力、スクリーンショットの撮影などを提供しています。

### UiAutomator参考情報

UiAutomatorについて下記ページが大変勉強になりました。

* [@IT-Android SDK標準の何でもテストツールuiautomatorの基本的な使い方 (1/3)](http://www.atmarkit.co.jp/ait/articles/1410/07/news029.html)
* [adakoda-はじめてのuiautomator](http://www.adakoda.com/adakoda/2012/12/android-uiautomator-2.html)
* [Qiita-uiautomatorでandroidスマホ動作テストしましょう。](http://qiita.com/clarinet758/items/2a360e65e3dd20ca2d84)

## ツールが提供する2種類の再現情報

クラッシュ検知を目的にツールはアプリ内を自動回遊するのですが、
2種類の情報をクラッシュレポートとしてサーバ上に送信し、開発チームに不具合の再現情報として提供しています。

### 再現情報①: クラッシュ直前までのスクリーンショット

![system概要.PNG](https://qiita-image-store.s3.amazonaws.com/0/51734/fda3b5fd-8ca0-1069-c12e-35bf7c7ef614.png)

アプリ内の自動回遊はイベントエミュレートの組み合わせによって行われるのですが、
イベントエミュレート直前にスクリーンショットを撮り、画面内の「このオブジェクトをタップするよ」といった
エミューレート情報を描画した上で画像を保存しておきます。

そして、クラッシュ検知時に、直前の数枚の画像をサーバに送信しチームに再現情報を提供します。
下記イメージとなります。

| 1枚目: ここから回遊開始 | 2枚目: この画面のここをタップ | 3枚目: そしたらクラッシュ発生！ |
|:-----------|------------:|:------------:|
| ![1.png](https://qiita-image-store.s3.amazonaws.com/0/51734/365a25ad-0bd0-754b-ec46-c1945f65cb15.png) | ![2.png](https://qiita-image-store.s3.amazonaws.com/0/51734/5aabf9c1-52b2-3099-9ffb-d920bdd7c23f.png) | ![3.png](https://qiita-image-store.s3.amazonaws.com/0/51734/3be42a78-6107-c328-9ae9-0830de080a07.png) |


### 再現情報②: スタックトレース

2つめの再現情報として、視覚的な再現情報と合わせてソースコードレベルでの情報(スタックトレース)もクラッシュ検知時にサーバに送信しています。
ツール実行中は常にアプリのプロセスを監視しており、アプリが落ちた際にログキャットへの出力を出力することで実現しています。
下記、管理画面のキャプチャとなります。

![stacktrace1.png](https://qiita-image-store.s3.amazonaws.com/0/51734/59357505-abd4-7d62-ba4f-61521ecb63e1.png)

# 開発背景と今後について

## 開発背景について

開発背景として、[Robotium](https://code.google.com/p/robotium/), [Espresso](https://code.google.com/p/android-test-kit/wiki/Espresso) などのUIテストツールの他社での活用事例をよく耳にしていました。
うちの組織でも上記のようなUIテストツールを使い品質を担保した上でスピーディな開発ができないか？と考えていました。

しかし、導入を具体的に検討し始めると、
・UIテストツール導入に伴う、テストケース実装の初期工数
・テストケースのメンテナンス工数
といった導入コストに見合う品質改善/開発スピードUPのメリットがイメージできなかったため組織ではUIテストツールの導入を見送っていました。

上記のような流れから、
・導入コストがかからない
・品質向上もしくは開発生産性向上に寄与できる
自動テストの形を模索しており、試行錯誤の結果、本ツールの開発に繋がりました。

## 今後について

社内での本ツール評価では約20アプリに適用し、40種類以上の改修対象のクラッシュを検知し品質向上に繋がりました。
また、Android5.0で採用されたARTの各アプリにおける動作確認(モンキーテスト)の際にも活躍しました。
まだまだ課題は山積みですが、引き続きツールを磨きこんでいく予定です。

Ui情報の識別した後のエミューレートするオブジェクト選択アルゴリズムや
画面ロック解除、ログインが必要なアプリに対する対応、ネットワーク面での制御など話したいことはまだありますが、
続きは来年1月にもう少し詳しい紹介をさせていただく予定です。


本記事の内容について私の説明が下手で伝わらなかったとしても
リクルートテクノロジーズが新しい試みに寛容な組織ということが伝われば幸いです。
以上、アドベントカレンダー24日目の記事となります。

# [PR]リクルートテクノロジーズはエンジニアを募集しています。

* [採用情報｜リクルートテクノロジーズ](http://recruit-tech.co.jp/recruitment/)
* [募集要項｜リクルートテクノロジーズ-　Webアプリ・スマートデバイスエンジニア](http://recruit-tech.co.jp/recruitment/mid-career.html)

明日は最終回です！
git config alias.snapshot

Snapshot Working Directory
============

git レポジトリにおいて、ワークツリーを簡単にどこかにコミットしておくことで、間違って変更が失われることがないようにしようというアイディアは割と前からあります（参考）。


When Is It Useful? / Usage
-------------------

たとえば、「結構大きな変更をしているけどまだ一つのコミットにまとまらない」などという場合はまれによくあると思います。または、「多分いらない変更だけど完全に消してしまっていいか不安」など。
このようなとき

* `git snapshot` を実行してその時のスナップショットを保存する
* スナップショットは、ワークツリーおよび普通のブランチ・インデックスには全く影響を与えない
* その時の内容を取り出したい場合、 `git show snapshot@{1}:a.txt` などとする

といったことができればいくらか安心なわけです。


Why Not `git-stash`?
------------

これに近いアイディアは、 `git-stash` としてすでに配布されています。
しかし上で示したような使い方はしにくい面があります。

* `git-stash` はそもそも（スナップショットでなく）パッチを一時保存するものであり目的が違う
  * スナップショットの長期間の保存・パッチの一時的な保存という二つの目的に一つのツールを使うのはとてもつらい
* `git stash save` はワークツリーを clean にしてしまう
  * `git stash apply` を直後に実行することで内容を戻すことができるが、ファイルの内容を無駄に２度書き換えることになる
  * `git stash create` はワークツリーを触らないが、 `refs/stash` を update しない



Definitions
-------------

多くの実装は `git-snapshot` などのスクリプトを作ってパスを通すことをしていますが、エイリアスで十分じゃねって思いました。

```sh
git config alias.snapshot '! gitdir="`git rev-parse --git-dir`" && export GIT_INDEX_FILE="$gitdir"/snapshot.index && cp "$gitdir"/index "$GIT_INDEX_FILE" && git add -A && : >>"$gitdir"/logs/refs/snapshot && git update-ref refs/snapshot $(git commit-tree $(git write-tree) -m Snapshot -p HEAD)'
```

これは分解するとおおよそ以下のようになります。

```sh
#!/bin/sh
set -xe

# Find current `.git`
# CAUTION: For real cases this value should be quoted
gitdir=`git rev-parse --git-dir`

# Set environment variable that specify the index file
export GIT_INDEX_FILE=$gitdir/snapshot.index

# Copy existing index file
cp $gitdir/index $GIT_INDEX_FILE

# Add all files
git add -A

# Create tree object from the index where all files are registered
tree=`git write-tree`

# Create commit object with the tree object as tree and HEAD as parent
commit=`git commit-tree $tree -m Snapshot -p HEAD`

# Make sure the relog for snapshot is kept
# From git-stash
: >>$gitdir/logs/refs/snapshot

# Update ref to make the snapshot accessible by `refs/snapshot`
git update-ref refs/snapshot $commit
```


### Utilize `git-stash` ###

また `git stash create` を使って以下のようにする方法もあります。

```sh
git config --local alias.stashsnap '! gitdir="`git rev-parse --git-dir`" && : >>"$gitdir"/logs/refs/snapshot && cmt=`git stash create` && test -n "$cmt" && git update-ref refs/snapshot $cmt && echo Snapshot created: $cmt'
```

この方法ははじめの方法に比べワークツリーに変更がない場合スナップショットを作らないという利点があります。
ただし、 untracked files がスナップショットに記録されません。

Repository
----------

* [junks/git/snapshot at master · 10sr/junks](https://github.com/10sr/junks/tree/master/git/snapshot)


References
----

* http://git.661346.n2.nabble.com/RFC-New-command-git-snapshot-td2298811.html
* https://github.com/jrockway/git-snapshot
* https://github.com/peterjm/git-freeze
Golang Macへのインストール〜Homebrewを使って〜


## ※注記（更新履歴)※

2015/01/24　内容の更新

`$PATH` に `$GOROOT/bin` を追加していなかったので、修正しました。

----

2014/12/26　内容の更新

@yuya_takeyama さんより、アドバイスのコメントをいただきました。
（改めてお礼申し上げます。ありがとうございました！）

このページを参考にGo環境を構築されるかたは、是非上記コメントもご一読ください。

また、アドバイスを元に、改めてGo開発環境を再構築しました。
以下は、その手順になります。

----

## Golang 開発環境　再構築手順

Mac環境：OS X Yosemite 10.10.1


### 0. 旧 Go 環境をアンインストールする

後から影響したら嫌だな〜とびびったので、
インストーラでインストールしちゃった古い Go を先に削除する。

下記、サイトを参考にアンインストールした。
https://www.socketloop.com/tutorials/uninstall-go-from-mac

アンインストールは ```/usr/local/go``` 消したら良いだけのようだ。

```		
$ sudo rm -r /usr/local/go
$ go run hello.go
-bash: go: command not found
```

使えなくなったので、無事アンインストールできた模様。

ちなみに、サイトの最後の行に

> Hope this tutorial is useful ... but hope you will continue to use and learn Go.

って書いてあったので、「Yes!」と思いながら、気合いを入れ直す。


### 1. Homebrew を使えるようにする

Homebrew をインストールしていない場合は、インストールする。

下記は私が実際に行ったインストール手順をまとめた記事です。ご参考まで。
[Homebrew をインストールして使えるようになるまで 〜私の場合〜](http://qiita.com/megu_ma/items/820695ac525030285682)


### 2. Go をインストールする

Homebrew のコマンドにて、最新安定版の 1.4 の Go をインストールします。

```bash:ターミナル
$ brew install go

==> Downloading https://downloads.sf.net/project/machomebrew/Bottles/go-1.4.yosemite.bottle.ta
######################################################################## 100.0%
==> Pouring go-1.4.yosemite.bottle.tar.gz
==> Caveats
As of go 1.2, a valid GOPATH is required to use the `go get` command:
  http://golang.org/doc/code.html#GOPATH

`go vet` and `go doc` are now part of the go.tools sub repo:
  http://golang.org/doc/go1.2#go_tools_godoc

To get `go vet` and `go doc` run:
  go get golang.org/x/tools/cmd/vet
  go get golang.org/x/tools/cmd/godoc

You may wish to add the GOROOT-based install location to your PATH:
  export PATH=$PATH:/usr/local/opt/go/libexec/bin
==> Summary
?  /usr/local/Cellar/go/1.4: 4557 files, 134M
```

え・・・ビール？ とりあえず、乾杯！?

じゃなくて、Go のインストール完了ですなw

ちなみに、hello.goを作成し、ちゃんと実行できるか確認しておく。

```go:hello.go
package main
import "fmt"

func main(){
    fmt.Printf("Hello, world\n")
}
```

```bash:ターミナル
$ go version
go version go1.4 darwin/amd64

$ go run hello.go
hello, world
```

大丈夫そうだ！


### 3. GOROOT と GOPATH を設定する

ひとまず、教えていただいた通り、設定してみることに。
zsh まだ入れてない（後で入れよう）から、.bash_profile に書いてみた。

```:.bash_profile
export GOROOT=/usr/local/opt/go/libexec
export GOPATH=$HOME
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
```	

宗教が絡んでいる設定らしいので、後でちゃんと調べることにしよう・・・。


以上


## 以下、旧手順（古くてあかんやつ。参考まで。）in 2014.12.24

下記、公式サイトを参考にインストールを開始。
http://golang.jp/install#osx


1. パッケージファイルをダウンロード

    > go1.2.1.darwin-amd64-osx10.8.pkg

2. インストーラの指示に従う
    
    あっさりインストールが完了する。
    ここで初めてGopher君が茶色っぽい生き物だったことに驚く。

3. インストールの確認

    ターミナルを開き、適当な場所に hello.go ファイルを作成。

    ```go:hello.go

    package main

    import "fmt"

    func main() {
        fmt.Printf("hello, world\n")
    }
    ```
   
    作成したファイルを実行。

    ```
    $ go run hello.go
    hello, world
    ```

    「hello, world」というメッセージが表示されれば、Go言語のインストールはOK！

以上
コマンドライン文字列をリストに変換する まじめに実装版

やりたいこと
--------

```el
(shell-split-string "abc  'def   dee'") => '("abc" "def   dee")
```

として、以前こんなのを書きました。

* [emacs-lisp - コマンドライン文字列をリストに変換する - Qiita](http://qiita.com/10sr/items/73bf45db58c9e6d2c533)

これは、強引に `sh` に文字列を解釈させてそれを emacs から受け取ってやろうというもので、単純な場合はうまく行きますが、それでも問題はあります。

その中でも大きなものは例えば

```el
(shell-split-string "abc && rm -rf *")
```

などとするとたちまち `rm -rf *` が実行されてしまう、というようなことで、セキュリティ的にもあれだし、得られる結果も `'("abc")` となるところ実際にほしいのは `'("abc" "&&" "rm" "-rf" "*")` なわけです（多分：少なくとも Python による `shlex` はそうなっている）。



実装
----

そんなわけで、正面から Emacs lisp で実装してみよう、ということであたまから文字を読んで再帰してリストを作るような感じにやってみました。

* [10sr/shell-split-string-el](https://github.com/10sr/shell-split-string-el)


これなら、 `&&` を含むような場合でもうまく動きます。

```el
(shell-split-string "abc")  ->  '("abc")
(shell-split-string "abc  def")  ->  '("abc" "def")
(shell-split-string "abc \"def ghi\"")  ->  '("abc" "def ghi")
(shell-split-string "abc && def")  -> '("abc" "&&" "def")
```


末尾再帰
------

最適化ほしいですね。
iPhone6Plusみたいなデカい端末のせいかわからないけど最近のiOSの戻るについて

ようやく業務でswiftを触ることになったのですが、そこで感じた最近のiOSの「戻る」について思ったことを何となく書いていきます。
なのでswiftの話というかはiOSの話です。アドベントカレンダーに自分も急に参加してみたくなったのです、お許しを・・。

***

当たり前の話だけど、iPhone6Plusだと左上の戻るボタンを押すのは至難の業。画面左端を右スワイプするいわゆる「エッジスワイプ」(iOS7からUINavigationControllerでデフォでついているやつ)すらキツい。

![写真 2014-12-23 11 24 34.jpg](https://qiita-image-store.s3.amazonaws.com/0/50827/8aa92a11-d010-d784-c1de-9f8559249c21.jpeg)

ということで、iPhone6Plusのせいかはわからないけれど、有名どころのアプリをいくつか触ってみての「戻る」まわりの所感、及びそれに関する技術的なことも少し交えて何か書いていけたら。

###フルスクリーン右スワイプ

Flipboard(ver3.1)の記事詳細画面やInstagram(ver6.4.1)のいいね一覧なんかをみてみると、画面のどこからでも右スワイプすれば前の画面に戻れるようになっている。

![写真 2014-12-23 11 24 37.jpg](https://qiita-image-store.s3.amazonaws.com/0/50827/d37037be-471a-5865-534b-fad79f730830.jpeg)

![写真 2014-12-24 19 54 09.jpg](https://qiita-image-store.s3.amazonaws.com/0/50827/7b2bdb70-98da-1a95-cbc8-3695902e6291.jpeg)

指の負担としてはかなり低いほうなので、通常のUINavigationControllerの画面遷移を考慮して設計されたアプリであり、特に複雑なジェスチャ処理の組み込みを想定していないのであれば、自分はこれでいいんじゃないかと思ったりもする。

自分はいま[SloppySwiper](https://github.com/fastred/SloppySwiper)というライブラリを入れてみて試してみているけれど、デザイナーメンバーにも触ってみてもらって感触としては良さげ。
これを書いてる時点で、Starsの数が300くらい&採用例の記事も見つからないので動作的にはまだ様子見だけど、不具合はいまのところないです(そんな難しいことしてるわけでもないし)。

###モーダル表示

Tumblr(ver3.7.5)のリアクションは、多くのアプリでpushViewControllerしているところをモーダル表示にしている。

![写真 2014-12-23 11 51 48.jpg](https://qiita-image-store.s3.amazonaws.com/0/50827/d7356649-a880-95a6-17b5-d405359cb7c3.jpeg)

戻るにはどうすればいいかというと、まわりのブラーの部分をタップすればOK。
これもすごい楽でいいのですが、モーダル表示ってデザイン設計だったりIAの視点からみたときに、アプリ内でのルールだったり見せ方の重み付けみたいなことを考慮しなくちゃだろうから、エンジニアが勝手に実装するのは良くないとは思います。

Tumblrが実際にどうやって実装しているかは知らないですが、これぽいものはカスタムトランジッションで実現できる。

カスタムトランジッションについては
http://qiita.com/335g/items/94762b06a66cfb3be6ad
らへんの記事に実装方法あるので参考にすれば簡単に実装できる。

トランジッションというか遷移の「様相」については、"UIViewControllerAnimatedTransitioning"をプロトコルにもったファイルにガリガリ書いていく感じになるのですが、キレイに粗結合になるので使い回しも楽だし、もともとflashやってた自分としてはどこか懐かしく楽しい。

そんなのつくってる暇ないよーというときは、githubからそれぽいものをもってきてパラメータなりを自分の好きなように変えるとかでいいと思う。
自分もStorehouseのトランジッションのライブラリで最初勉強しました。
https://github.com/coolbeet/CBStoreHouseTransition

###いろんな方向へ引っぱり系

他にもFacebookのGroups(ver3.0)やSiori(1.4.0)のように下に引っ張って前の画面に戻るものだとか、

![写真 2014-12-23 11 51 02.jpg](https://qiita-image-store.s3.amazonaws.com/0/50827/d5679cd9-55d8-6be2-4152-68539b815728.jpeg)

![写真 2014-12-24 19 55 07.jpg](https://qiita-image-store.s3.amazonaws.com/0/50827/2afaa26e-a9ca-fd68-f473-f6d7591e493c.jpeg)

Storehouseに至ってはストーリー詳細画面から４方向どこへ引っ張っても戻ることがきる。

![写真 2014-12-23 12 08 28.jpg](https://qiita-image-store.s3.amazonaws.com/0/50827/1c7921de-95b8-a52c-8691-3ae4639e4d66.jpeg)

ここらへんは現時点ではかなり進んでいるユーザ体験だと自分の中では認識していて、今度こういった感じのものが標準搭載されていったりするのかななんて思っています。

###まとめ

こうみていくともはや何でもありのように感じるけど、一番のポイントはアプリの画面設計に沿って採用しないと破綻するかもしれないから気をつけようということ。

さきほどの「下に引っ張って前の画面に戻る」は、当然のことながらUITableViewのリフレッシュ(更新)がないことを前提にしているわけで、プロデューサ的な人からここリフレッシュは絶対なくちゃ困りますみたいなことになったらorzですもんね。
とか「フルスクリーン右スワイプ」も、横スワイプして前・次ページに遷移したいなんていわれたときには使えない。

以上、メリークリスマス。。
WEBデザイナーがRuby+Grunt+Compass+Sassでコーディング作業効率の良い環境を作ってみた

#はじめに
* WEBデザイナーがhtml、cssコーディング作業をするときに少しでも無駄を減らしたい
* WEBデザイナーが感じる「環境をつくるということの心の壁」を乗り越えたい
* なんか新しいことやってみたい

#すること
* ファイル更新時ブラウザ自動オープン
* ファイル更新時ブラウザ自動更新
* sassからcssへの自動コンパイル
* ローカルでHTTPサーバー起動

めちゃ便利。詳細説明は割愛。

#Command Line Tools for Xcodeインストール

`$ xcode-select --install`

#Nord.jsインストール

http://nodejs.jp/

#Nord.jsの確認
インストールできたかバージョンチェックで確認

`$ node -v`

#Rubyの確認
念のためインストールされているかバージョンチェック

`$ ruby -v`

#Sassインストール

`$ gem install sass`

#Compassインストール

`$ gem install compass`

#作業フォルダをつくる
こちらが今回の最終的な構造

```
project
    ├index.html
    ├stylesheet
    │  └style.css            
    ├sass
    │  └style.scss              
    ├node_modules
    │└grunt
    │└grunt-contrib-sass
    │└grunt-contrib-watch
    │└grunt-contrib-connect
    ├config.rb
    ├package.json
    └Gruntfile.js
```
以下をまず作っておく。ほかは自動で作られる。

```
project
    └index.html
```
以下からprojectディレクトリで作業する

#Gruntインストール

`$ npm install -g grunt`

#package.jsonをつくる

`$ npm init`

いろいろ聞かれるがEnter連打でOK

#npmパッケージインストール
Compassタスク
`$ npm install grunt grunt-contrib-compass --save-dev`

監視タスク
`$ npm install grunt grunt-contrib-watch --save-dev`

HTTPサーバー起動タスク
`$ npm install grunt grunt-contrib-connect --save-dev`

みっつをまとめる場合
`$ npm install grunt-contrib-compass grunt grunt-contrib-watch grunt grunt-contrib-connect --save-dev`

#Compass実行

`$ compass create`

エラー出たら

`$ rbenv rehash`

#Gruntfile.jsの作成

```Gruntfile.js
module.exports = function(grunt) {
  grunt.loadNpmTasks('grunt-contrib-watch');
  grunt.loadNpmTasks('grunt-contrib-compass');
  grunt.loadNpmTasks('grunt-contrib-connect');
  grunt.registerTask("default", ["connect", "watch", "compass"]);
  grunt.initConfig({
    compass: {
      compile: {
        options: {
        }
      }
    },
    connect: {
      livereload: {
        options: {
          port: 9001
        }
      }
    },
    watch: {
      css: {
        files: ['stylesheets/style.css']
      },
      scss: {
        files: ['sass/style.scss'],
        tasks: ['compass']
      }
    }
  });
};
```

#Grunt実行

`$ grunt`

#確認

ターミナルで以下が表示されたらOK

```

Running "connect:livereload" (connect) task
Started connect web server on http://0.0.0.0:9001

Running "watch" task
Waiting...

```

こちらへアクセス
http://localhost:9001/

Done!!
GROUP_CONCAT

これは便利

| ID| 商品名| 出品者  |
|---+------+--------|
| 1 | 商品1 | ユーザ1 |
| 2 | 商品2 | ユーザ1 |
| 3 | 商品3 | ユーザ1 |
| 4 | 商品4 | ユーザ2 |
| 5 | 商品5 | ユーザ2 |
| 6 | 商品6 | ユーザ3 |

みたいな`items`テーブルがあったら

```SQL
select "出品者", count(1) as c, group_concat("商品名") as "商品" from items group by "出品者";
```

| 出品者  | c | 商品            |
|--------+---+-----------------|
| ユーザ1 | 3 | 商品1,商品2,商品3 |
| ユーザ2 | 2 | 商品4,商品5      |
| ユーザ3 | 1 | 商品6           |

という集計結果が得られる


MySQLのgroup_concatで複数レコードを1行にまとめる - 文系プログラマによるTIPSブログ
http://treeapps.hatenablog.com/entry/20120530/p1

GROUP_CONCAT with limit
http://stackoverflow.com/questions/23608464/group-concat-with-limit

MySQLのGROUP_CONCATで途中で切れてしまう時の対処 | ちいさな創々
http://www.petitec.com/2011/07/mysql_group_concat_max_len/
ngrokでlocalhostに外部からアクセスできるようにする


# ngrok

外部からlocalhostにアクセスを可能とするためのサービスです。

[ngrok](https://ngrok.com/)


# 利用シーン

- スマホアプリの動作確認

スマホからもアクセスが可能なので、スマホでの動作確認やアプリ内で利用しているAPIとの連携確認などにも利用できます。

- MacからIEの動作確認を行う(Modern.IE + ngrok)

Modern.IEというIEを動かすことができるVirtualBox用のイメージと組み合わせることで
MacでIEの動作確認を行うことができます。
もちろん外部からアクセスできるので、Windows用のマシンがあればそちらでも動作確認できます。


# 使い方

## 1. ダウンロード

https://ngrok.com/download から環境にあったものをダウンロードします。

## 2. 実行

下記のコマンドを実行します。

```
$ unzip ./ngrok.zip
$ ./ngrok 80
```

下記のような画面になれば Forwarding に表示されているURLからlocalhostへアクセスできるようになります。

```
Tunnel        Status online
Version       1.7/1.6
Forwarding    http://abcdefghijklmn.ngrok.com -> 127.0.0.1:80
Forwarding    https://abcdefghijklmn.ngrok.com -> 127.0.0.1:80
Web Interface 127.0.0.1:4040
# Con         0
Avg Conn Time 0.00ms
```

# localhost以外にアクセスする

apacheのVirtualHostの設定で example.com というドメインで開発を行っていた場合
下記の手順を踏むことで example.com で動いているアプリケーションへアクセスすることができます。

## 1. VirtualHostの編集

VirtualHostの設定に下記を追加します。

```
<VirtualHost *>
  ServerName example.com
  ServerAlias example.ngrok.com

  ...
</VirtualHost>
``` 

## 2. 実行

下記のコマンドを実行します。

```
$ ./ngrok -subdomain='example' 80
```

ブラウザからexample.ngrok.comにアクセスすると無事につながります。

```
Tunnel        Status online
Version       1.7/1.6
Forwarding    http://example.ngrok -> 127.0.0.1:80
Forwarding    https://example.ngrok -> 127.0.0.1:80
Web Interface 127.0.0.1:4040
# Con         0
Avg Conn Time 0.00ms
```
特定のマイルストーンのIssueの一覧を取得する


GitHubでマイルストーンに紐付いているIssueの一覧を取得する方法。
Octokit.rbを使用した場合の例。

* GitHub API: v3

### 手順

* マイルストーン名からマイルストーンの番号を取得
* マイルストーンの番号をつかってらissue一覧を絞りこみする

### コード例

```ruby
require 'octokit'

def issues_filter_milestone(repo, name)
  number = Octokit.list_milestones(repo).select do |milestone|
    milestone.title == name
  end.first.number
  Octokit.list_issues(repo, milestone: number)
end

issues_filter_milestone("great-h/great-h.github.io","20141224")
```

レスポンスの例はGitHubのAPIのドキュメントを見てください。

* https://developer.github.com/v3/issues/

`list_issues`はstatusがopenのissueのみを取得します。`status: 'all'`を付加するとcolsedなissueも取得できます。

```ruby
Octokit.list_issues(repo, milestone: number)
```

# 参考文献

* https://developer.github.com/v3/issues/
* https://developer.github.com/v3/issues/milestones/
FRPについて理解する為に参考にしたもの



* リアクティブプログラミングのライブラリを紹介・説明
	* [Webフロントエンドでリアクティブプログラミング](http://www.ediplex.com/blog/?p=830)
* リアクティブの重要性について説明した記事。
	* [なぜリアクティブプログラミングは重要か。](http://d.hatena.ne.jp/pokarim/20101226)
* Bacon.jsのread_me日本語訳
	* [Bacon.jsのread_me日本語訳](https://gist.github.com/masakielastic/5897831)
* Bacon.jsの解説
	* [Bacon.jsで眺めるFunctional reactive programming](http://gan.hatenablog.jp/entry/2013/11/10/152720)
* Baconjsのスライド。特にイベントストリームを動的に説明したページ22〜27のボタン操作
	* [Baconjsスライド](http://latentflip.com/bacon-talk-realtimeconfeu/#)
* JSやSwiftを使った関数型プログラミングの説明
	* [脱アルゴリズム宣言シリーズ](http://qiita.com/kenokabe/items/41189c45001321c9e283)
* JSのライブラリを使った遅延評価とFRPの説明
	* [時空プログラミングシリーズ](http://qiita.com/kenokabe/items/b04e3d8d49b0ffc7a78b)
* 上記2つのシリーズをギュッとまとめたラノベ風解説
	* [IQ145で美少女JKな先輩に「関数型プログラミング」を特訓してもらえた僕の５日間の記録](http://qiita.com/kenokabe/items/618692858044a89adbc0)
* Rxを使用してGithubのユーザーのリストを作るチュートリアル
	- [【翻訳】あなたが求めていたリアクティブプログラミング入門](http://ninjinkun.hatenablog.com/entry/introrxja)
* 関数型言語に対する誤解やよくある疑問について、細々と説明
    - [関数型言語のウソとホント](http://qiita.com/hiruberuto/items/26a813ab2b188ca39019)
* 参考文献とか基本的な説明とか。あとコメント欄も色々と参考になる
    - [「関数型言語」に関するFAQ形式の一般的説明](http://qiita.com/esumii/items/ec589d138e72e22ea97e)
* 関数型プログラミングの重要性の説明と簡単な例をだして説明。
    - [【翻訳】2015年の最優先事項は関数型プログラミング！ | POSTD ](http://postd.cc/functional-programming-should-be-your-1-priority-for-2015/)
* 関数型プログラミングを実際のコードで順序よく説明。
    - [【翻訳】関数型プログラミング入門 | POSTD](http://postd.cc/an-introduction-to-functional-programming/)
* RXJSをサンプル付きで丁寧に説明
    - [「RxJS」初心者入門 - JavaScriptの非同期処理の常識を変えるライブラリ](http://liginc.co.jp/web/js/151272)

以上を読んで何となく解った気になりました。後は実装しながら試す。
Parseに保存してある画像を表示するときはPFImageViewがすごく便利


## 何が便利か

1. ローカルにファイルを保存してくれる
これはPFFileを利用しているので自然と適用される。
一度ダウンロードしたファイルはローカルに保存されるので同じファイルは複数回読み込みが発生することがない。

1. メモリ上にキャッシュもしてくれる(？)
**仕様に書かれていないので不確実**なのだが、アプリ上での動作を見た感じではメモリにキャッシュまでしてくれていそう。
一度表示した画像はキャッシュされる。そうすると、次に同じ画像を表示する場合
に、ローカルに保存してあるだけの画像よりも早く表示される。

## 使い方

### PFImageViewを利用して画像を読み込む

```objc:pfimageview_sample.m
PFFile *iconFile;
PFImageView *_pfImgView;
_pfImgView.file = iconFile; // 表示する画像をPFFileとして指定
[_pfImgView loadInBackground]; // 画像読み込み
```

## おまけ

### 普通にUIImageViewとPFFileで同等の表示をする場合

```objc:uiimageview_pffile_sample.m
PFFile *iconFile;
NSMutableDictionary *_imageCache;
UIImageView *_imageView;
// キャッシュがあるか確認
UIImage *image = _imageCache[iconFile.url];
if (image)
{
    // キャッシュがあった: そのまま表示
    [_imageView setImage:image];
}
else
{
    // キャッシュがなかった: 非同期で画像読み込み
    //  ・ローカルに保存されている場合: ローカルからファイルをロードしてくる
    //  ・初めて取得するファイルで保存されてない場合: クラウド上のファイルをロードしてくる
    [iconFile getDataInBackgroundWithBlock:^(NSData *data, NSError *error) {
        if (!error)
        {
            UIImage *image = [UIImage imageWithData:data];
            [_imageView setImage:image];
            _imageCache[iconFile.url] = image;
        }
    }];
}
```

## 懸念点
* メモリキャッシュの解放ってどうなってるんだ？

## 参考
PFImageView Class Reference
https://parse.com/docs/ios/api/Classes/PFImageView.html
Go言語で設定ファイルの一部を環境変数で置換



Go製ツール[walter](https://github.com/walter-cd/walter "walter-cd/walter")の設定ファイル`pipeline.yml`で値を環境変数から取りたいなあと思ったのでトライ。

とりあえず"text/template"で環境変数を使える体まで書いたのでメモ。


## まず環境変数をまるごとマップに

Goでは環境変数の一覧を`os.Environ()`で取れるんだけど、キーバリュー込みで1つの単位になるテキストのスライスをもらえるだけなので、そのままでは扱いづらい。

じゃあまずマップに変換してみようと。

[github.com/higanworks/envmap](https://github.com/higanworks/envmap)

参考にしたのはこちらの記事 [Get environment variables as a map in golang - coderwall](https://coderwall.com/p/kjuyqw/get-environment-variables-as-a-map-in-golang "coderwall.com : establishing geek cred since 1305712800")

ライブラリの内容はこちら。

```
package envmap

import (
	"os"
	"strings"
)

// 全部入りのマップを返す
func All() map[string]string {
	data := os.Environ()
	items := make(map[string]string)
	for _, val := range data {
		splits := strings.SplitN(val, "=", 2)  // `=`で分割、分割数を2にして値側の`=`を無視
		key := splits[0]
		value := splits[1]
		items[key] = value
	}
	return items
}

// キーの一覧を返す
func ListKeys() []string {
	data := os.Environ()
	var keys []string
	for _, val := range data {
		splits := strings.SplitN(val, "=", 2)  // `=`で分割、分割数を2にして値側の`=`を無視
		keys = append(keys, splits[0])
	}
	return keys
}
```

事前の仕込みはこれでよし。


## yamlの文字列を`text/template`で処理

変換したいところをヒゲで囲んだ`hoge.yml`を用意した。今回はドットのあとに代入したい環境変数。

```hoge.yml
message:
 hoge: Hello {{.HOME}}
```

で、[template - The Go Programming Language](http://golang.org/pkg/text/template/ "template - The Go Programming Language")を見ながら処理を書いた。


```main.go
package main

import (
	"github.com/higanworks/envmap"
	"io/ioutil"
	"os"
	"text/template"
)

func main() {
	envs := envmap.All() // 環境変数マップを取得

	rawdata, err := ioutil.ReadFile("hoge.yml")
	if err != nil {
		panic(err)
	}

	tmpl, err := template.New("test").Parse(string(rawdata))
	if err != nil {
		panic(err)
	}

	err = tmpl.Execute(os.Stdout, envs) // 置換して標準出力へ
	if err != nil {
		panic(err)
	}

}
```

実行して、置換後の出力。

```yaml:hoge.yml(output)
---
message:
 hoge: Hello /Users/sawanoboly
```

できたわー。


ちなみにコードこのままだと、環境変数が無かったら`<no value>`で埋められちゃう。


```yaml:hoge.yml(output_with_no_value)
---
message:
 hoge: Hello <no value>
```

もしかすると"text/template"の`Actions`だけでも何とかなりそうだけど、yaml側に色々書くのも変だし。


## おすすめGo

この2つにお世話になりました。

- [Amazon.co.jp： 基礎からわかる Go言語: 古川 昇: 本](http://www.amazon.co.jp/dp/4863541171 "Amazon.co.jp： 基礎からわかる Go言語: 古川 昇: 本")
- [fatih/vim-go](https://github.com/fatih/vim-go "fatih/vim-go")
Optional基礎


OptionalはObjective-Cにおける `nil` を返しうるメソッドのようなもの。
つまり、オブジェクトの生成に失敗した場合には値を返さない。
Objective-Cでは構造体や基本型に使えなかったのに対し、SwiftのOptionalは全ての型に使える。

## `String.toInt()`

例えば `String` 型の `toInt` というメソッドは、 `Int` に変換できない場合もある。
なので、このメソッドの返す型は *Optional Int* になる。

    let possibleNumber = "123"
    let convertedNumber = possibleNumber.toInt()
    // convertedNumber は Int?型

# `nil`

もし、変数や定数が `nil` を取る可能性がある場合、必ずOptionalで宣言しろ。

    var serverResponseCode: Int? = 404
    serverResponseCode = nil

また、デフォルト値を与えずにOptionalで宣言した場合は、 `nil`で初期化される。

    var surveyAnswer: String?
    // surveyAnswerはnil

# Forced Unwrapping

Optional型に値が入っているかどうかは`==`や`!=`で`nil` と比較することによって可能。
Optional型に値が入っているのが確実で、その値を取り出す操作を *Forced Unwrapping* という。
値は `!` を変数名の最後に付けると取り出せる。

    if convertedNumber != nil {
        println("\(convertedNumber!)")
    }

# Optional Binding

`if` や `while` 文の条件式の部分で、一時的にOptional型を他の変数や定数に格納して、その文の中で使えるようにする技を *Optional Binding* という。

    if let actualNumber = possibleNumber.toInt() {
        println("\'\(possibleNumber)\' は \(actualNumber)")
    } else {
        println("\'\(possibleNumber)\' は整数に変換できません")
    }

この場合 `!`を付けなくても値を使える。
   `let` の代わりに `var` にもできて、この場合は変数として扱える。

# Implicitly Unwrapped Optionals

プログラムの中でこの変数には必ず値が入っていることが保証されている場合があると思う。
そういうときは変数の宣言時に型の最後に `!` を付けて宣言すると、いちいち *Forced Unwrapped* で取り出さなくてよくなる。
これを *Implicitly Unwrapped Optionals* (暗黙にアンラップされたOptional)という。
この機能が一番活躍する場面はクラスの初期化時であるが、そこについてはここでは触れない。

    // これは通常のOptional型からForced Unwrappedによって値を取り出す方法
    let possibleString: String? = "An optional string."
    let forcedString: String = possibleString! // !がここで必要
    
    // これはImplicitly Unwrapped Optional
    let assumedString: String! = "An implicitly unwrapped optional string."
    let implicitString: String = assumedString // !がいらない

**Implicitly Unwrapped Optionalに何も値が入っていない時にアクセスするとランタイムエラーになる。**

通常のOptional型と同様に `nil` との比較もできる。

    if assumedString != nil {
        println(assumedString)
    }

Optional Bindingも使える。

    if let definiteString = assumedString {
        println(definiteString)
    }

## 注意
**Implicitly Unwrapped Optionalに何も値が入っていない時にアクセスするとランタイムエラーになる。**
**Implicitly Unwrapped Optionalを `nil` と比較する可能性のある変数に使ってはいけない。**
sublime text 2のインデント設定

* 問題
タブの空白が４スペースになることがある。


* 設定
Settings - Userには下記を設定

```
"tab_size": 2,
```


* 推測
編集したファイルのインデントの種類が混在してる時に起きるっぽい  


* 調査1 原因の調査
発生してる現象は下記リンクと同じ
stackoverflow
http://stackoverflow.com/questions/12190382/sublime-text-2-tab-size-setting-not-correctly-activated

```
"detect_indentation": false
```
が必要みたい。


* 調査2 detect_indentationって何  
sublimetext - Indentation Settings
https://www.sublimetext.com/docs/2/indentation.html
detect_indentationがtrueになってると、sublimeでファイルを開いたタイミングでインデントがいくつになるか自動で算出→設定される。
（ってことは設定したtab_size:2は無視される？ってことかな）
Apache Spark ことはじめ(Scala版)

## 事前準備

CentOS 6 でやります。

- CDH 5 をインストール
- hadoop の立ち上げ
- Spark のインストール、立ち上げ

までやっておきます。

- Spark 用ユーザの作成

```shell-session:shell
$ sudo useradd hoxom_spark
$ sudo usermod -a -G wheel hoxom_spark
$ sudo passwd hoxo_spark
```

- HDFS 上に作業用フォルダを作成

```shell-session:shell
$ sudo -u hdfs hadoop fs -mkdir -p /user/hoxom_spark
$ sudo -u hdfs hadoop fs -chown hoxom_spark /user/hoxom_spark
```

- HDFS の作業フォルダにファイルをコピー

```shell-session:shell
$ sudo cp /home/hoxom/tracking_log/tracking.2014-12-02.log.gz /home/hoxom_spark/
$ su - hoxom_spark
$ hadoop fs -put /home/hoxom_spark/tracking.2014-12-02.log.gz /user/hoxom_spark/tracking.2014-12-02.log.gz
$ hadoop fs -ls /user/hoxom_spark  # HDFS 上にファイルが存在することを確認
```

```:結果
Found 1 items
-rw-r--r--   1 hoxom_spark supergroup   32438207 2014-12-24 11:40 /user/hoxom_spark/tracking.2014-12-02.log.gz
```

## Spark

参考サイト

- [Apache Spark ドキュメント和訳 - Quick Start](http://qiita.com/mychaelstyle/items/46440cd27ef641892a58)
- [Spark を活用する:ビッグデータアプリケーション用の高速インメモリコンピューティング](http://www.cloudera.co.jp/blog/putting-spark-to-use-fast-in-memory-computing-for-your-big-data-applications.html)
- [Spark Programming Guide](http://spark.apache.org/docs/latest/programming-guide.html)
- [RDD Class](http://spark.apache.org/docs/latest/api/java/org/apache/spark/rdd/RDD.html)（RDDクラスのメソッド一覧）

Spark シェルの起動

```bash
$ spark-shell
```

```:結果
Welcome to
      ____              __
     / __/__  ___ _____/ /__
    _\ \/ _ \/ _ `/ __/  '_/
   /___/ .__/\_,_/_/ /_/\_\   version 1.1.0
      /_/

Using Scala version 2.10.4 (Java HotSpot(TM) 64-Bit Server VM, Java 1.7.0_65)
Spark context available as sc.
scala>
```

Spark context オブジェクト sc ができるので、これを使います。

- ファイルの読み込み

```scala:Scala
val file = sc.textFile("hdfs://localhost/user/hoxom_spark/tracking.2014-12-02.log.gz")
file.count // 行数を出力
```

```:結果
963021
```

- カラムに分割

```scala:Scala
val lines = file.map(_.split("\t"))
lines.count      // 行数
lines.first.size // カラム数
```

```:結果
963021
9
```

- スマートフォンからのアクセスのみ抽出

```scala:Scala
val sp = lines.filter(_.contains("SP"))
sp.count
```

```:結果
402659
```

- 結果をメモリ上にキャッシュする

```scala:Scala
val sp_dm = sp.filter(_(4).startsWith("DM"))
sp_dm.cache()
sp_dm.count
```

```:結果
196805
```

同じ計算をもう一度。

```scala:Scala
sp_dm.count
```

```:結果
196805
```

二回目はめっちゃ速い！

- キャッシュから削除

```scala:Scala
sp_dm.unpersist()
```

- 端末ごとの PV を集計

```scala:Scala
val pv_by_terminal = lines.map(line => (line(7), 1)).countByKey
pv_by_terminal.foreach(item => println(item._1 + "\t" + item._2))
```

```:結果
PC      530430
MB      29932
SP      402659
```