OmniAICreator/Qiita-1.07M huggingface dataset:
Cocos2d-xを使うときに参考にしている情報


Cocos2d-xを使っていくうえで参考にしている情報を書いていきます。
個人的にはまだまだ参考にできる情報が少ないと思っているので、共有することでもっとスムーズに開発ができればと思っています。また、編集リクエストでどんどん追加していってもらえると幸いです。

## cocos2d-x入門

<a href="http://www.amazon.co.jp/cocos2d-x%E5%85%A5%E9%96%80-%E6%B8%85%E6%B0%B4-%E5%8F%8B%E6%99%B6/dp/4897979226/"><img src="http://ecx.images-amazon.com/images/I/51NQvTqe9mL._SL500_AA300_.jpg"></a>

```
本書は、開発言語であるC++の基礎から環境構築、開発の手順まで、わかり
やすい図解と実践的なソースコードを豊富に用いて丁寧に解説しました。
cocos2d-xの入門は、まずはこの一冊から始めてみてはいかがでしょう。
```
Cocos2d-xの導入から実際にゲームを作っていく手順までしっかりと分かりやすく書いてあります。何をどうすればいいのか迷っている方はまず読んでみてはいかがでしょうか。

## Cocos2d-x開発のレシピ iOS/Android対応

<a href="http://www.amazon.co.jp/Cocos2d%E2%80%90x%E9%96%8B%E7%99%BA%E3%81%AE%E3%83%AC%E3%82%B7%E3%83%94%E2%80%95iOS-Android%E5%AF%BE%E5%BF%9C-%E6%9D%BE%E6%B5%A6-%E6%99%83%E6%B4%8B/dp/4798038245/"><img src="http://ecx.images-amazon.com/images/I/511OKiB0iTL._BO2,204,203,200_PIsitb-sticker-arrow-click,TopRight,35,-76_AA300_SH20_OU09_.jpg"></a>

```
サッと作って、アッと言わせる。「88の逆引きレシピ」で「開発時間を短縮」しよう。「無料」で使えてiOS/Android対応。
```
Cocos2d-xで開発を進めていくなかで手元に置いておきたい一冊。たくさんのTipsが書いてあるので、これがしたいというのが決まればまずはこれを見て実現の仕方を探します。逆引きがあるのもとても便利です。

## Cocos2d-x by Example Beginner's Guide

<a href="http://www.amazon.co.jp/Cocos2d-x-Example-Beginners-Guide-Engelbert-ebook/dp/B00CITNP8A/"><img src="http://ecx.images-amazon.com/images/I/51R4xHUbZwL._AA278_PIkin4,BottomRight,-25,22_AA300_SH20_OU09_.jpg"></a>

```
Each of the six games developed in this book will take you further on the road to becoming an expert game developer with no fuss and plenty of fun.
```

人気のある洋書です。かなり具体的なゲームの作り方を例にどうやってCocos2d-xを使っていけばいいかが詳細に述べられています。6つのゲームが題材になっているので、作りたいゲームの参考になるものが見つかるかもしれません。

## Cocos2d-x
http://www.cocos2d-x.org/

Cocos2d-xの公式ホームページです。
What's NewではCocos2d-xの最新情報が配信されています。

## 日本cocos2d-xユーザー会
http://www.cocos2d-x.jp/

Cocos2d-xの日本ユーザー会です。
定期的に勉強会やイベントの開催情報が更新されています。

## API Reference - Cocos2d-x
http://www.cocos2d-x.org/wiki/Reference

Cocos2d-xのAPIドキュメントです。
実際にソースを辿っても分かるのですが、グラフが表示されてどのクラスがどのような依存関係にあるのかなど分かりやすく表示されています。

## Qiitaのcocos2d-x
http://qiita.com/tags/cocos2d-x

プログラミング知識の共有サービス Qiita です。
このAdvent Calendarもですが、たくさんのTipsがユーザーによって投稿されています。実用的なTipsも多くとても参考になります。

## 清水 友晶さんのSlideshare
http://www.slideshare.net/doraemonsss

Cocos2d-xの著書があり、日本ユーザー会の代表でもある清水さんが作られたスライドがアップロードされています。それぞれの目的を達成するために使うクラスや具体的なコードも交えて解説がされています。

## 株式会社BEFOOLのブログ
http://befool.co.jp/blog/categories/cocos2d-x/

株式会社BEFOOLさんのブログのCocos2d-xカテゴリです。
「Cocos2d-x 勉強」と題してたくさんのTipsが公開されています。更新の頻度が多く、また実際に開発で必要になるようなTipsばかりが書かれています。

## ワンダープラネット株式会社のブログ
http://wonderpla.net/tag/cocos2d-x/

ワンダープラネット株式会社さんのブログのCocos2d-xカテゴリです。
Cocos2d-xに一歩踏み込んだような内容が多くとても勉強になります。また、実際に現場で使われている雰囲気を感じとることができます。
インターセプタ(interceptor)

## インターセプタの概要

Struts2にはインターセプタ(interceptor)と呼ばれる、Actionクラスの前後に処理を挟み込む機能があり、デフォルトで様々なインターセプタが使われている。
インターセプタを大別すると2種類ある。

* Actionクラス全体に仕掛けるものと
* Actionクラスのpublicメソッド(Actionメソッド)単位に仕掛けるもの

メソッド単位に仕掛けるものについては、有効または無効なメソッド名を正規表現で指定する。
入力チェック(Validation)関連の機能はメソッド指定のインターセプタである。

## インターセプタの実装方法

インターセプタのクラスはcom.opensymphony.xwork2.interceptorパッケージにある次の2つのどちらかを継承する。

* AbstractInterceptor ( クラス全体 )
* MethodFilterInterceptor ( メソッド指定 )

(または、Interceptorインタフェースを実装してもよい)

Interceptorを実装した例は以下のように。

```java
public class SampleInterceptor extends AbstractInterceptor  {
	public String intercept(ActionInvocation invocation) throws Exception {
		// Action前処理 ////////

		// Actionの実行結果(returnした値)
		String retString = invocation.invoke();
		
		// Action後処理 ////////
		
		// 遷移先のresultを返す。
		// 例えばAction後処理で何か遷移先を変えたい場合にここで変更する。
		return retString;
	}
}
```

## インターセプタを登録する

インターセプタの登録は、struts.xmlで行う。インターセプタの登録はinterceptorのname属性で名前を指定する。
登録した後は、Actionクラスで簡単に使えるように、インターセプタ・スタックを作成すると良い。
インターセプタ・スタックはインターセプタを複数積み上げたもので、たくさん積み上げて構築するインターセプタの定義を1つに集約できる。

```xml
<struts>
	<package name="sample-package" abstract="true" extends="json-default">
		<interceptors>
			<interceptor name="sample"
				class="lumi2.SampleInterceptor"></interceptor>
		</interceptors>
		<interceptor-stack name="sampleStack">
			<interceptor-ref name="basicStack" />
			<interceptor-ref name="sample" />
			<interceptor-ref name="validation">
				<param name="excludeMethods">input,back,cancel</param>
			</interceptor-ref>
			<interceptor-ref name="jsonValidation" />
			<interceptor-ref name="workflow" />
		</interceptor-stack>
	</package>
</struts>
```

## インターセプタを利用にする

Actionクラスの利用例を次に示す。
struts.xmlのパッケージ名を@ParentPackageに指定すると、package要素で定義した内容を継承する。

```java
@Namespace("/")
@ParentPackage("sample-package")
public class SampleDisplayAction extends ActionSupport {
	.........
}
```
Java8におけるラムダ式のサンプル

2014年正式リリース予定のJava8では、「ラムダ式(Lambda expression)」の構文が追加されます。

ここではラムダ式によるソースコードの簡素化を通して、Java8におけるラムダ式の簡単な例を紹介します。

# 目標

ここに、おなじみの匿名クラスとして実装したComparatorがあります。

```java
Comparator<Integer> c = new Comparator<Integer>() {
    @Override
    public int compare(Integer a, Integer b) {
        return a - b;
    }
};
```

それを、こう。

```java
Comparator<Integer> c = (a, b) -> a - b;
```

#ステップ1: ラムダ式の導入
元の実装をラムダ式で置き換えると、以下のようになります。

```java
Comparator<Integer> c = (Integer a, Integer b) -> {
    return a - b;
};
```

1つの文で実装できる場合、上記のブロック部分は式で記述することもできます。
この場合、returnの記述は不要です。

```java
Comparator<Integer> c = (Integer a, Integer b) -> a - b;
```

#ステップ2: 型の省略
型推論により、仮引数の型は省略できます。

```java
Comparator<Integer> c = (a, b) -> a - b;
```

# 参考資料
ラムダ式についてはこちらのFAQを参照。
http://www.lambdafaq.org/what-is-a-lambda-expression/
最強の開発環境を目指して 〜環境編〜

連続ネタの2日目です。今回は環境編です。あまり一般的な構成と代わり映えしないところもあるかもしれません。

# サーバ環境周り

![名称未設定.png](https://qiita-image-store.s3.amazonaws.com/222/20074/7cbd1920-4f9c-43cd-ea45-77f66c5b4ef4.png "名称未設定.png")

イメージとしてはこんな感じで開発しています。

開発のフローとしては

- ローカルMac上のPhpStormで開発を行う
- Vagrant環境内にてテスト実施やデバッグ、動作確認
- 他のエンジニアやディレクタを交えた動作確認やテストの際はグローバル上のサーバで実施(さくらVPS)

のような切り分けをしています。

グローバル上のサーバはAuto Deploymentを設定しているので、ローカルのPhpStorm上でのコード書き換えが常に反映されています。なので、普段の開発外で他の人に環境を見せたい場合にも特に操作は不要で、接続先を切り替えるだけで行けます。

Vagrant内の環境はsynced_folderで設定しているので、Auto Deploymentなどの設定も必要ないためアップロードまでのタイムラグが全くないので快適です。また、XDebugの設定もハマりどころが少なく簡単になります。

synced_folderの設定についてはこちらが参考になります。
[Vagrant + VirtualBox で nfs を使って、synced_folder を速くする](http://www.1x1.jp/blog/2013/08/vagrant_synced_folder_with_nfs.html)
[vagrantの設定を色々調べて（試してみた）
](http://qiita.com/ryurock/items/91df14537512c03488ac)

Vagrant環境は一度上げてしまえば落とすことはあまり無いため、PhpStorm経由でのVagrant操作は特にしていません。必要になったときにはTerminalを立ちあげてhaltなりreloadなりすれば良いと思います。

# Deploymentの設定

PhpStorm内で「ファイルに変更があった際にサーバ上のファイルを自動的に更新してくれる」という機能があります。優れていることに、ファイルの追加や更新だけでなく、リネームや削除も反映してくれます。

## Connectionタブ

- [Preferences] - [Deployment] 

![Preferences.png](https://qiita-image-store.s3.amazonaws.com/222/20074/0e199703-92b2-7d5c-76ef-37c91f4be24b.png "Preferences.png")

####  Type
以下の項目から選択

- FTP 
- FTPS 
- SFTP 
- Local or mounted folder 
- In place

#### STFP host
ファイルアップロード先のサーバホストを指定

#### Port
接続するサーバのポートを指定

#### Root path

 ファイルのアップロード先ルートディレクトリを指定
[…]を押下でサーバ上のディレクトリ構成から選択可能
#### Auth type
 [Password / Key pair]から選択

## Mappingsタブ

![Preferences-3.png](https://qiita-image-store.s3.amazonaws.com/222/20074/df8b0926-c998-a8c2-6ea8-2cde25d04b79.png "Preferences-3.png")

#### Use this server as default
プロジェクト内でこのサーバをデフォルトサーバとして設定出来ます。デフォルトサーバに設定するとこでAuto Deployが設定可能になります。

#### Local path
自分のローカルPC内の同期元ディレクトリを指定

#### Deployment path on server
デプロイ先のサーバを指定
ConnectionタブのRoot Pathをルートディレクトリに設定していれば、[/]でOK

#### Web path on server
[Run]などで開くルートパスを指定。基本的には[/]でOK

## Excluded Pathsタブ

![Preferences-3.png](https://qiita-image-store.s3.amazonaws.com/222/20074/0934468a-0b8d-6da0-e8a3-518e2897fcf2.png "Preferences-3.png")

同期/アップロードしたくないディレクトリをローカル/サーバごとにそれぞれ指定出来ます。

## Automatic Upload設定

![全画面_2013_12_25_19_53-2.png](https://qiita-image-store.s3.amazonaws.com/222/20074/73e91c81-735c-b4ab-522c-86d1fe9f789e.png "全画面_2013_12_25_19_53-2.png")

- [Tools] - [Deployment] - [Automatic Upload (always)]

上述の[Use this server as default]が設定されている場合、[Automatic Upload(always)]が選択可能になります。
チェックを入れたら、ローカルのファイルを書き換えて[File Transfer]タブを確認してみましょう。なんもせずとも自動的に転送されていれば完了です。
treeコマンドの結果をExcel貼付用に良い感じに整形するワンライナー

treeコマンドのインデント区切り（"|"とか"├"とか）をタブに変換するような便利オプションが見つからなかったので。※区切りを消すの("-i")はある

```bash:
tree -NF | perl -pe 's/^├── //g; s/^└── //g; s/^│\xc2\xa0\xc2\xa0\x20//g; s/├── /\t/g; s/│\xc2\xa0\xc2\xa0\x20/\t/g; s/└── /\t/g; s/    /\t/g; s/\*$//g; s/^\.\n//g;'
```

alias設定  

```bash:
alias treex="tree -NF | perl -pe 's/^├── //g; s/^└── //g; s/^│\xc2\xa0\xc2\xa0\x20//g; s/├── /\t/g; s/│\xc2\xa0\xc2\xa0\x20/\t/g; s/└── /\t/g; s/    /\t/g; s/\*$//g; s/^\.\n//g;'"
```
mod_pagespeedインストール


#atインストール
```
# yum install at
```

#mod_pagespeedインストール
```
# cd /usr/local/src/
# wget https://dl-ssl.google.com/dl/linux/direct/mod-pagespeed-stable_current_x86_64.rpm
# rpm -ivh mod-pagespeed-stable_current_x86_64.rpm
# /etc/rc.d/init.d/httpd restart
```

#設定
```sh:/etc/httpd/conf.d/pagespeed.conf
...
<Location /mod_pagespeed_statistics>
…
<Location /pagespeed_console>
…
<Location /mod_pagespeed_message>
…
```
あたりにBASIC認証設定など。

###参考
https://developers.google.com/speed/pagespeed/mod?hl=ja
http://kb.eukhost.com/how-to-install-mod_pagespeed-on-centos/

###環境
CentOS6.4 (さくらのVPS)
MQTTからのログをfluentdで回収する

MQTTからのログをfluentdで回収するというネタでfluentd-mqttというのをつくりました。

https://github.com/yuuna/fluent-plugin-mqtt

取り急ぎgithubで公開しています。
以下の制限があります

・MQTT Clientとして動作する
・fluentd v10ではtd-agent.confで"#"をするとコメント扱いになるため、topicの設定ができない。
（DSLを使えばいけます）
・MQTTからpublishされてくる値はJSONであることを期待しています。

取り急ぎ公開しました。
もう少し整備してgemにします。
mongodbにclojourから接続してみる

mongodbにclouserからアクセスしてみよう的な。


leinでプロジェクトを作成したら、project.cljに以下の内容を追加します。

```
(defproject advent "0.1.0-SNAPSHOT"
  :description "FIXME: write description"
  :url "http://example.com/FIXME"
  :license {:name "Eclipse Public License"
            :url "http://www.eclipse.org/legal/epl-v10.html"}
  :dependencies [[org.clojure/clojure "1.5.1"]
  		[com.novemberain/monger "1.4.2"]])
```
lein replでインストールを開始します。

```
$lein repl
Retrieving com/novemberain/monger/1.4.2/monger-1.4.2.pom from clojars
Retrieving org/clojure/clojure/1.4.0/clojure-1.4.0.pom from central
Retrieving org/mongodb/mongo-java-driver/2.10.1/mongo-java-driver-2.10.1.pom from central
Retrieving com/novemberain/validateur/1.2.0/validateur-1.2.0.pom from clojars
Retrieving org/clojure/clojure/1.3.0/clojure-1.3.0.pom from central
Retrieving clojurewerkz/support/0.6.0/support-0.6.0.pom from clojars
Retrieving com/google/guava/guava/12.0/guava-12.0.pom from central
Retrieving com/google/guava/guava-parent/12.0/guava-parent-12.0.pom from central
Retrieving com/google/code/findbugs/jsr305/1.3.9/jsr305-1.3.9.pom from central
Retrieving clojurewerkz/support/0.10.0/support-0.10.0.pom from clojars
Retrieving ragtime/ragtime.core/0.3.0/ragtime.core-0.3.0.pom from clojars
Retrieving org/clojure/tools.cli/0.2.2/tools.cli-0.2.2.pom from central
Retrieving org/clojure/pom.contrib/0.0.25/pom.contrib-0.0.25.pom from central
Retrieving com/google/guava/guava/12.0/guava-12.0.jar from central
Retrieving org/mongodb/mongo-java-driver/2.10.1/mongo-java-driver-2.10.1.jar from central
Retrieving com/google/code/findbugs/jsr305/1.3.9/jsr305-1.3.9.jar from central
Retrieving org/clojure/tools.cli/0.2.2/tools.cli-0.2.2.jar from central
Retrieving com/novemberain/validateur/1.2.0/validateur-1.2.0.jar from clojars
Retrieving clojurewerkz/support/0.10.0/support-0.10.0.jar from clojars
Retrieving com/novemberain/monger/1.4.2/monger-1.4.2.jar from clojars
Retrieving ragtime/ragtime.core/0.3.0/ragtime.core-0.3.0.jar from clojars
nREPL server started on port 50070 on host 127.0.0.1
REPL-y 0.3.0
Clojure 1.5.1
    Docs: (doc function-name-here)
          (find-doc "part-of-name-here")
  Source: (source function-name-here)
 Javadoc: (javadoc java-object-or-class-here)
    Exit: Control+D or (exit) or (quit)
 Results: Stored in vars *1, *2, *3, an exception in *e

user=>
```

さっそくいれてみましょう

```
(require '[monger.core :as m])
(require '[monger.collection :as c])
(import '[org.bson.types ObjectId])
```

importがおわったら接続してみます。

```
user=> (m/connect!)
#<MongoClient Mongo: /127.0.0.1:27017>
user=> (m/set-db! (m/get-db "advent"))
#<GridFS com.mongodb.gridfs.GridFS@201ba640>
```
データーをいれてみます。

```
user=> (c/insert "documents" { :_id (ObjectId.) :first_name "Finalvent" :last_name "Advent" })
#<WriteResult { "serverUsed" : "/127.0.0.1:27017" , "n" : 0 , "connectionId" : 2 , "err" :  null  , "ok" : 1.0}>
```

そして読み出し

```
user=> (c/find-maps "documents")
({:_id #<ObjectId 52baae6aef86291cc0b82778>, :first_name "Finalvent", :last_name "Advent”})
```

読める、読めるぞー！（TM

というわけでclojureからもmongodbは便利に使えます。
メモ: 要素の座標取得とか

たしか`el.offsetTop`とかの取得で位置を再計算し直すってんだったはずだけど、最新版Chromeで試したらそうならなかった。変わったか、やり方が違うのか？

* http://jsfiddle.net/ginpei/Gq2c8/
Adobe MediaEncoderをExtendScriptから終了する

JSXファイルの関連づけでExtendScriptを実行したとき，次のコードではAMEを終了できません。ExtendScript Toolkitから実行する場合は関係ありません。
正確には`app.quit()`が実行されたのを見計らってマウスポインタを動かす，キーストロークを送るなどでようやく終了します。

```js:ame_quit3.jsx
#target 'estoolkit-4.0'
var target = 'ame-7.0';
var bt = new BridgeTalk;
bt.target = target;
bt.body = function(){
    $.sleep(500);
    app.quit();
}.toSource() + "()";
bt.send(30);
```

次のコードも終了できません。
このコードではAMEのscheduleTask(script,msec,repeat)メソッドを使い，スクリプトを予約実行させています。

```js:ame_quit4.jsx
#target 'estoolkit-4.0'
var target = 'ame-7.0';
var bt = new BridgeTalk;
bt.target = target;
bt.body = function(){
    app.scheduleTask('app.quit()',500,false);
}.toSource() + "()";
bt.send(30);
```

scheduleTaskがうまくいっていないわけではありません。
例えば下記のコードは正常に実行できます。

```js:ame_quit5.jsx
#target 'estoolkit-4.0'
var target = 'ame-7.0';
var bt = new BridgeTalk;
bt.target = target;
bt.body = function(){
    app.scheduleTask("alert('Good bye.');app.quit()",500,false);
}.toSource() + "()";
bt.send(30);
```

##Solution
次に示すように，一旦別のアプリケーションをアクティブにしてやると終了できます。

```js:quitAME.jsx
#target 'estoolkit-4.0'
var bt = new BridgeTalk();
bt.target = 'ame-7.0';
bt.body = function(){
	app.quit();
	BridgeTalk.bringToFront('estoolkit-4.0');
	BridgeTalk.bringToFront('ame-7.0');
}.toSource()+"()";
bt.send(5);
```
fswatch&amp;amp;rsync&amp;amp;Automatorで、Macとサーバーのファイルをリアルタイム同期する。


開発サーバーがリモートにあったりしちゃって、ローカル感覚で開発できないよーということが何度かありました。
それをfswatchとAutometorを使ってファイルをリアルタイム同期して、ローカルで開発するような感覚で開発できるようになったのでメモ残しておきます。

ちなみにGitでブランチをチェックアウトしてもリモートに反映してくれます。
Sublime Text 3を使っていますが、SFTPよりも安心感が有りますね。

## fswatchの導入
brew でインストールします（ [otolab](http://qiita.com/otolab)さん、情報ありがとうございました！）

```
$ brew install fswatch
==> Downloading https://homebrew.bintray.com/bottles/fswatch-1.5.1.yosemite.bottle.tar.gz
######################################################################## 100.0%
==> Pouring fswatch-1.5.1.yosemite.bottle.tar.gz
🍺  /usr/local/Cellar/fswatch/1.5.1: 48 files, 1.0M
```


## Automatorの作成 （※Automator使うの辞めました -> 追記）
Automatorを開くと新規作成ダイアログがでてくるので、

新規作成
ー＞　アプリケーションを作成
ー＞　保存の時、名前の拡張子を .app としておく。

アクションから、シェルスクリプトを実行 を選択して
内容にこう書きます

```bash
/usr/local/bin/fswatch /path/to/watch/folder/ "rsync -avru --delete --exclude='.git' /path/to/sync/from/ servername:/path/to/sync/to/"
```

rsync のオプションなどはググってもらえれば。
※ちなみにこれはservernameに鍵認証でアクセスできる時の書き方です。


## Rsyncの開始
保存するとAutometorの実行ファイルが出来上がるので、クリックすればRsync開始。


ファイルを作成、変更、削除しても、リモートにリアルタイム同期しちゃいます。あー楽。

## 追記

・・・と運用していたのですがAutomator辞めました。何やら同期してくれない時がありまして。
最近はコマンドで動かして、窓を放置プレーしています。

```bash:.bash_profile
from="/path/to/watch/folder"
to="servername:/path/to/sync/to"
excludes="--exclude='.git'"
sync="rsync -avru --delete $excludes $from/ $to/"
alias myrsync=$sync
alias myrsyncwatch='/usr/local/bin/fswatch $from/ "$sync"'
```
よく使うscaffoldコマンドのオプション


## 前提

Railsアプリケーション自体は

```
rails new App -T
```

でTest::Unitをスキップして作成して、代わりに`rspec`と`factory-girl`を入れた状態を想定。

```ruby:Gemfile
gem 'rspec-rails'
gem 'factory_girl_rails'
```

railsのバージョンは3.2でも4.0系列でも試している。

## 使用コマンド

```bash
$ rails g scaffold ModelName user:references name description:text amount:integer weight:float active:boolean born_on:date deleted_at:datetime --skip-assets --skip-helper --skip-stylesheets --skip-view-specs --skip-controller-specs --skip-routing-specs --skip-request-specs
```


jbuilderがいらない場合は以下も

```bash
 --skip-jbuilder
```

### 方針
- Model, View, Controller, Routeは追加
- Javascript, CSS用のファイルは無駄に作らない
- Helperも大抵いらないので作らない
- テストに関してはModelのテストだけを作ってもらう

controller-specsに関してはskipしなくてもいいかと思うけど、他のテストは本当に必要なときに自分で作ったんでいいと思う。・・・実際。

## 結果

```rails3.2
      invoke  active_record
      create    db/migrate/20131225083227_create_model_names.rb
      create    app/models/model_name.rb
      invoke    rspec
      create      spec/models/model_name_spec.rb
      invoke      factory_girl
      create        spec/factories/model_names.rb
      invoke  resource_route
       route    resources :model_names
      invoke  scaffold_controller
      create    app/controllers/model_names_controller.rb
      invoke    erb
      create      app/views/model_names
      create      app/views/model_names/index.html.erb
      create      app/views/model_names/edit.html.erb
      create      app/views/model_names/show.html.erb
      create      app/views/model_names/new.html.erb
      create      app/views/model_names/_form.html.erb
      invoke    rspec
      invoke      rspec
      invoke  scss
```

```rails4.0
      invoke  active_record
      create    db/migrate/20131225082800_create_model_names.rb
      create    app/models/model_name.rb
      invoke    rspec
      create      spec/models/model_name_spec.rb
      invoke      factory_girl
      create        spec/factories/model_names.rb
      invoke  resource_route
       route    resources :model_names
      invoke  scaffold_controller
      create    app/controllers/model_names_controller.rb
      invoke    erb
      create      app/views/model_names
      create      app/views/model_names/index.html.erb
      create      app/views/model_names/edit.html.erb
      create      app/views/model_names/show.html.erb
      create      app/views/model_names/new.html.erb
      create      app/views/model_names/_form.html.erb
      invoke    rspec
      invoke      rspec
      invoke    jbuilder
      create      app/views/model_names/index.json.jbuilder
      create      app/views/model_names/show.json.jbuilder
```
公式ガイドの「Dialogs and Sidebars in Google Apps」を制覇する！（その４）

Google Apps Script AdventCalendarの25日目の記事です。トリを飾るのがこの記事で良いかどうかは別として、
制覇して終わらないとタイトル通りにならないので、投稿しました！

### CustomSidebar？
CustomDialogと同じく、HtmlServiceやUiAppを使って、UIを構築するカスタムのサイドバーです。
表示してもサーバ側の処理が止まることはなく、挙動はCustomDialogと同じ感覚で利用すればいいのではないでしょうか。ユーザの操作については、HtmlServiceの場合は、google.scriptのAPIを利用し、UiAppでは、ServerHandlerでやりとりさせます。（CustomDialogの時と全く同じ）

### Google Document編
CustomDialogと同じようなコードが利用できます。最後のui.showSidebar()を使うことが大きな違いです。

```js:コード.gs
// 事前にUiオブジェクトを取得しておく
var ui = DocumentApp.getUi();

function onOpen(e) {
  ui.createMenu("テストメニュー")
  .addItem("CustomSidebar表示", 'showCustomSidebar')
  .addToUi();
}

// 最初に承認が必要です。
function showCustomSidebar() {
  var html = HtmlService.createHtmlOutput('Hello, world! <input type="button" value="Close" onclick="google.script.host.close()" />')
  .setSandboxMode(HtmlService.SandboxMode.NATIVE)
  .setTitle("Custom Sidebar")
  .setWidth(400);
  
  ui.showSidebar(html);
}
```

### Google Spreadsheet編
Spreadsheetは、公式サイトによると、現時点ではサポートされておらず、変換候補にもでてこないのですが、実際には、関数の定義はされていて、呼び出すことも可能です。
ということで、呼び出してみましたが、「この操作はサポートされていません。（行 2、ファイル「コード」）」となり、エラーメッセージが表示されて何も起こりません。onOpenなどのトリガーからの呼び出しだと、メッセージも表示されず、何もおこらないのでトリガーが起動していないだけなのかがわかりにくいです。

22:15追記：
Google Driveで新しいシートの設定（[https://support.google.com/drive/answer/3541068](https://support.google.com/drive/answer/3541068)）をして、
新しいシートを作成すれば、スプレッドシートにサイドバーが表示されます。
何も反応がない場合は、新しいシートに設定してからお試し下さい。

新しいシートの設定方法：

1. Google Driveの右上の歯車ボタン→設定をクリック
1. 左上の”編集”をクリックして、「新しいGoogleスプレッドシートを試してみる」にチェックを入れ、保存ボタンをクリック。
 1. これにより、新規作成した時には新しいシートが作成されます。古いものはそのまま古いシートが開きます。

```js:コード.gs
// 事前にUiオブジェクトを取得しておく
var ui = SpreadsheetApp.getUi();
//var ui = FormApp.getUi();

function onOpen(e) {
  ui.createMenu("テストメニュー")
  .addItem("CustomSidebar表示", 'showCustomSidebar')
  .addToUi();
}

// 最初に承認が必要です。
function showCustomSidebar() {
  var app = UiApp.createApplication();
  var panel = app.createHorizontalPanel();
  var label = app.createLabel("Hello World!");
  var button = app.createButton("Close", app.createServerHandler('onClick'));
  panel.add(label);
  panel.add(button);
  app.add(panel);
  app.setTitle("CustomSidebar")
  .setWidth(400)
  .setHeight(300);         // setHeight()はSidebarでは無意味（縦いっぱいに表示される）

  ui.showSidebar(app);
}

// ダイアログのcloseボタンが押された時のコールバック
function onClick(e) {
  var app = UiApp.getActiveApplication();
  app.close();
  
  return app;
}
```

### Google Form編
Formで使う時もCustomDialogの時と同じように使えます。

```js:コード.gs
// 事前にUiオブジェクトを取得しておく
var ui = FormApp.getUi();

function onOpen(e) {
  ui.createMenu("テストメニュー")
  .addItem("CustomSidebar表示", 'showCustomSidebar')
  .addToUi();
}

// 最初に承認が必要です。
function showCustomSidebar() {
  var app = UiApp.createApplication();
  var panel = app.createHorizontalPanel();
  var label = app.createLabel("Hello World!");
  var button = app.createButton("Close", app.createServerHandler('onClick'));
  panel.add(label);
  panel.add(button);
  app.add(panel);
  app.setTitle("CustomSidebar")
  .setWidth(400)
  .setHeight(300);
    
  ui.showSidebar(app);
}

// ダイアログのcloseボタンが押された時のコールバック
function onClick(e) {
  var app = UiApp.getActiveApplication();
  app.close();
  
  return app;
}
```
watch コマンドがない環境で定期的にコマンドの実行を行う


`clear` コマンドが端末のクリアを行う前提で。

```bash:.bash_profile

#!/bin/bash

function watch(){
        while true
        do
                clear
                echo "----- execute $@ on `date` -----"
                eval $@
                sleep 5
        done;
}

```
Scala 2.10.0 で型変数の実行時判定ができなくなる警告が出ないことがあるかも

このコードは2.9.1だと警告が出るけど、2.10.0だと出ない。

```Sample.scala
type LS = List[String]
def f(x : Any) = x match {
  case (x : LS) => Some(x)
  case _ => None
}
```
Mac OS X 10.9 Mavericks で Rails の `bundle install` に失敗する件の対処法

Mac OS X を 10.9 Mavericks にバージョンアップした後に、Rails プロジェクトの`bundle install`が失敗するようになったので、その対処法です。

環境は、rbenv, ruby 2.0.0-p353, Rails 4.0.2 です。

結論から書いておきますと、`xcode-select --install`してコマンドラインツールをインストールした後に再実行したら解決しました。

## エラーログ

具体的には私の環境では、atomic gem のインストールに失敗するようになりました。C拡張周りのgemをインストールしようとすると同じ症状となるので、他の方々もいろいろなところでこけていたようです。
以下エラー発生時のログです。

```bash
$ bundle install
...
省略
...
Installing activerecord-deprecated_finders (1.0.3)
Installing tzinfo (0.3.38)

Gem::Installer::ExtensionBuildError: ERROR: Failed to build gem native extension.

    /.rbenv/versions/2.0.0-p353/bin/ruby extconf.rb 
*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of necessary
libraries and/or headers.  Check the mkmf.log file for more details.  You may
need configuration options.

Provided configuration options:
	--with-opt-dir
	--without-opt-dir
	--with-opt-include
	--without-opt-include=${opt-dir}/include
	--with-opt-lib
	--without-opt-lib=${opt-dir}/lib
	--with-make-prog
	--without-make-prog
	--srcdir=.
	--curdir
	--ruby=/.rbenv/versions/2.0.0-p353/bin/ruby
	--with-atomic_reference-dir
	--without-atomic_reference-dir
	--with-atomic_reference-include
	--without-atomic_reference-include=${atomic_reference-dir}/include
	--with-atomic_reference-lib
	--without-atomic_reference-lib=${atomic_reference-dir}/
/.rbenv/versions/2.0.0-p353/lib/ruby/2.0.0/mkmf.rb:430:in `try_do': The compiler failed to generate an executable file. (RuntimeError)
You have to install development tools first.
	from /.rbenv/versions/2.0.0-p353/lib/ruby/2.0.0/mkmf.rb:515:in `try_link0'
	from /.rbenv/versions/2.0.0-p353/lib/ruby/2.0.0/mkmf.rb:813:in `try_run'
	from extconf.rb:26:in `<main>'


Gem files will remain installed in /rails-project/vendor/bundle/ruby/2.0.0/gems/atomic-1.1.14 for inspection.
Results logged to /rails-project/vendor/bundle/ruby/2.0.0/gems/atomic-1.1.14/ext/gem_make.out

...
省略
...
```


## 対処法

対処法は`xcode-select --install`してコマンドラインツールをインストール後に再実行。

## SEE ALSO

http://qiita.com/yuku_t/items/30015dba2b6497b80074
Storyboard と UITableViewDelegate

あれやこれやにより Storyboard を本格的に触るのはこれが初めてで、以下は UITableViewController と併用した際のメモになります。

ナビゲーションのプッシュ遷移時に呼び出されるメソッドの順番。

1. `- (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath`
2. `- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender`
3. `- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath`
4. 遷移先 `-(void)viewWillAppear:(BOOL)animated`

`prepareForSegue:sender:` の方が `tableView:didSelectRowAtIndexPath:` よりも早く呼ばれる。will の方ならそれよりも先に呼ばれる。セル選択・遷移時に一番最初に何かやりたければ will で。

`prepareForSegue:sender:` でも `tableView.indexPathForSelectedRow` で NSIndexPath がとれるので、遷移時であればこのやり方でも良いのかもしれない。
【PHP】自作関数(function)にパラメータをセットし、取得、表示させる

こんにちは。

なかなかfunctionが覚えられず、
特に関数のところでパラメータとか引数とか値を返すという言葉が出てくると
混乱してしまうので、メモ。

```php
function greetings($name){
    echo "Greetings, " . $name . "!" ;
}
greetings($name = "yoshimizu") ;
```
これはOKなんだけど、

ここで
>
greetings() ;

だけにすると、$nameが定義されていないので
エラーが返ってくる。


以下の様に試したけど、スコープエラー？のようなものが返ってきた。
でもfunctionにアクセスはできてた。

```php
function greetings($name){
    $name = "yoshimizu" ;
    echo "Greetings, " . $name . "!" ;
    return ;
}
greetings() ;
```

結果
>
Missing argument 1 for greetings(), called on line 14 and defined (line 8)Greetings, yoshimizu!

>
greetings('aaa') ;　に置き換えて試しました。

多分パラメータがあってないから、という感じであたりをつけて
ようやくスッキリ。

以下のコードになりました。

```php
function greetings($name){
    echo "Greetings, " . $name . "!" ;
    return ;
}
greetings('aa') ;
```

functionで定義したgreetingsのパラメータ$nameと、
アクセスするgreetingsは同じじゃなきゃいけないんですよね。
だんだん理解できるスピードも上がってきた気がします。

ちょっとJavaScript触ってないので、そろそろ触らないと忘れそう・・。

それではこれからも宜しくお願いいたします。
Ceylonアドベントカレンダーを書いてみて

今回は感想の回ですー。


#Ceylonに対する正直な個人的な感想

[前回](http://qiita.com/newta/items/2461764f603d81a6bd15) は言語を並べてみて
ふわっとCeylonの立ち位置を考えてみたけど、
今回はネガティブに感じた面も合わせて、正直な感想を書こうかと。

##実践投入への課題

###パフォーマンス
まず、パフォーマンス面ですね。
バージョン1.1でパフォーマンスアップを図るって公式に書いてあるので
今のパフォーマンスはどんなものなのかな？と言うところです。
計っていないだけなので大きな問題になるかは分からないですけど。

###IDEのサポート

次にIDEのサポートがJavaのときより落ちるってとこですね。
ここが納得出来ないと使うのが厳しいかも。

###スキルを持っている人間の確保

使う人についてですが、引き継ぎとかを考えるけど
正直Javaが使える人ならあまり困らないかなと思うので
直近でCeylon知っている人を用意出来なくても良いのかなと思います。

###と言うことで

パフォーマンスを求められないプログラムであれば導入を検討出来る余地はあるかなと思います。
試しにチャレンジしてみたい気持ちはあるかな。

##言語的なところの意見

まとめず、つらつら書きます。

DBとかのとこはJavaに依存してるのがちょっとカッコ悪いとか。

case classのようなスタイルは良いけど
javaのenumのような使いやすいものが無いのかな？って思うとことか。

valueとかvariableって長くない？みたいな
他の言語と同じでvalとvarで良くないかなとか。

ただ他のスクリプト系の流れを汲んだ変数名の後ろに型を書くスタイルより
前に書くのが好みなのでこのスタイルが良いなとか。

ただ１番の問題はマイナーってところが大きいですね。

キャリアを考えても今勉強するならScalaの方が強いですし
勉強するにも情報が多いですし。

１から何か作りたい人にはまっさらな感じなのでそこは自由で楽しそうですけど
言語仕様的には刺激が足りないかもしれないですね。


マイナーをメジャーにしようと色々考えると
鶏と卵みたいになるので、地道な啓蒙活動とかが大切かなと思うけど。

##とはいえ

個人的にはNext Javaとしてのバランス感はCeylonは良い気がするので
期待はしていようかなーと思います。

機会や時間があれば自分でも情報を広げて行きたいなと思います。


#アドベントカレンダーの感想

最後までぼっちカレンダーでしたw
マイナー過ぎだったかなー？

ぼっちなので寂しい反面、かなり自由に出来ました。
そしてCeylonの公式ドキュメントは一通り眺めて勉強になったかなーと思います。

ノリで始めたけど、始めたなら「やらないと！」って気持ちがあってやりきれました。
地味に見てくれる人も居たみたいですし。

でも、実は結構大変でした。
記事としてまとめるのも結構大変だったのですが、
マイナー過ぎてフレームワークやライブラリも無くて
超ネタ切れを起こしてた部分が大変でした。
資料（ネタ）を探したり、頭をひねって記事にひねり出したり。
あと１日延びたらダメだったかもしれません。

でも、色々勉強にもなりました。
Ceylon言語について割としっかり理解出来たこと。
毎日記事を書く大変さ。
記事を書くときのスピード感。
ノウハウや書き方の文化は置いといて
文法的な面だけであればC系の言語を覚えるのは１ヶ月くらいあれば行けるなーって感触。

まあ、結果、成長出来た感があって楽しかったかなーと。

#まとめ

来年はみんなアドベントカレンダーしてみたら良いと思いますー。
誰も来なくてもぼっちアドベントカレンダーも勉強になるのでw

いろんなタイミング的なものが合ったり
ノリでアドベントカレンダーを立ててみたりだったけど
良い経験したなぁー。

でも、最近はCeylonばかりになってしまったので
この記事の後はもうちょっと今使えそうな技術を勉強しようかなと。

なんかTipsじゃなくてブログっぽい内容になっちゃいましたね。

まあ、そんなこんなでメリークリスマス！
メモ：HTMLでiPhoneのカメラロールを参照

```html
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width,initial-scale=1.0, user-scalable=no">
<title>camera</title>
</head>
<body>

<form method="post" enctype="multipart/form-data">
    <input type="file" id="cameraImage" name="upload_image" accept="image/*" capture="camera">
</form>


<script src="http://code.jquery.com/jquery-1.10.2.min.js"></script>
<script>

$(document).ready(function(){
    // 画像を選択
    $('#cameraImage').bind('change', inputFileHandler);
});

// 画像選択時イベント
function inputFileHandler(e) {
    console.log("inputFileHandler", e);
}

</script>

</body>
</html>
```
キューアイテムをExtendScriptから追加する

キューアイテムは以下のメソッドで追加することができます。

-addItemToBatch()
-encode()

##addItemToBatch

```js:additem_frontend.jsx
var src = "ソースファイルへの絶対パス";
var frontend = app.getFrontend();
var ret = frontend.addItemToBatch(src);
```
これはキューウィンドウにファイルをドラッグしたのと同じ結果になります。
適用するプリセットや出力先を選択することはできません。

##encode
DNxHDを出力する時は以下のようになります。

```js:additem_encode.jsx
var src = "ソースファイルへの絶対パス";
var dst = "出力先ディレクトリへの絶対パス";
var encHost = app.getEncoderHost();
var enc = encHost.createEncoderForFormat("DNxHD MXF OP1a");
var preset = enc.loadPreset("DNX 100 1080i 59.94");
if (preset){
    enc.encode(src,dst);
}else{
    alert("Preset not found.");
}
```

createEncoderForFormatとloadPresetに指定する文字列は，プリセットブラウザ内にあります。
![Screen Shot 2013-12-25 at 14.41.28.png](https://qiita-image-store.s3.amazonaws.com/0/34563/ecf952f9-d494-ac92-f42d-d392f882a5ac.png)
それぞれ「形式」と「プリセット名」が引数です。ただしこれで指定できるのは一部のシステムプリセットのみです。プリセット名が設定されていない場合はプリセットIDを見つけて指定する必要があります。
Ceylonを比べてみる

Next Javaな言語とかと比べてみてCeylonの立ち位置を比べてみる。

#近しい立場の言語

## Kotlin (コトリン)

たぶんCeylonと一番近そうな立ち位置なのが Kotlin かなーと思う。
マイナーっぽさとか、書き味とか。
といってもScala寄り。
ただこちらはバージョンM3と言うことでメジャーバージョンになってないですね。
バックに居る会社はIDEAで有名なJetBrainなのでしっかりしてそうです。

## Xtend (エクステンド)

で次に近いのが Xtend 。
Ceylonの前にこれが出たときも自分はピコーン！ってなりました。
Javaに超近かったので。好みかも！って。
ただ近過ぎてメリットが薄い印象でした。
ラムダ式も　「|」の記号なので流行の言語の矢印っぽい方が良かった、、。
ということでドキュメントを少し読んだだけで触らず、、。
良くも悪くもJava + α って感じですね。
Eclipseが作ってるのでしっかりはしてそうですが、
他のIDEでサポートされなそうな雰囲気ですね。

##Scala (スカラ)

そして流行して来てる Scala 。
Javaっぽく書けるけど
流行っていて書き方に関数型の文化が入って
Scala っぽく書かないとDisられそうです。
でも、Javaの次の一手としては一番の有力候補ですね。
Javaっぽく書くと世間的に怒られそうなのがポイントかもw

IDEも主要なEclipse、NetBeans、IDEAにサポートされている様子。
ただ流行だしたところなので、開発状態に差があり、
どれが良いかをちゃんと選んだ方が良いかも。
いまはIDEAが一番人気かな？
あとは今後も随時ウォッチの必要ありかな。

##Groovy (グルービー)

ちょっと古いですがGroovyもここに並べて良いのかな？
Java + α の感じはXtendと似ているかも。
使い込んでいないので正確には判断出来ないが
個人的にはXtendよりはこっちの方が好みかもしれない。

他の言語よりかなり前から流行っている。
とはいえメインストリームになれない感じもある。

IDEも主要なEclipse、NetBeans、IDEAにサポートされている様子。
どの環境のプラグインが使いやすいのか誰か教えて欲しいかも。


##Ceylon ( セイロン ) 

こういう中でのCeylonはどうなんだろうと。

個人的にJavaから移るには一番バランスが良いんじゃないかなと思いました。
Scalaほど関数系にガッツリ感を感じることも無いし、
良さげなところは取り込んでいる。

Javaを知ってる人なら自然に書ける部分が多いし
Javaの問題になりやすい部分は排除している。（ぬるぽとか、キャストとか）

ということで
Java++ な言語としてはかなりいい感じと思うマス！
Javaユーザが移りやすい言語かなーと。

+α でいい人はGroovy
Javaからの変革を求めてる人はScalaで。

１番の問題はマイナーとこなのでみんなで使ってみてもらえたらと思う！
Javaな人は使ってみて頂戴！
Javaな人でScalaに躊躇してる人も、Ceylonやってみると入りやすいかも。

IDEは今はEclipseプラグインのみですー。

#GitHub ランキング

[こちらの記事を参考](http://qiita.com/potato2003@github/items/fbbc5d5edc80b43801e7) にして
抜き出しました。
Ceylon 1.0が出たので更新した情報があったら嬉しいんだけどね。
変わってないかもしれないけど。。

|順位||
|:---:|:---:|
|3位| Java (https://github.com/languages/Java) |
|15位| Scala (https://github.com/languages/Scala) |
|19位| Groovy (https://github.com/languages/Groovy) |
|86位| Xtend (https://github.com/languages/Xtend) |
|88位| Kotlin (https://github.com/languages/Kotlin) |
|108位| Ceylon (https://github.com/languages/Ceylon) |

Ceylon残念！
今回紹介した中で最下位。
流行ってるって言った言語以外は全部 Booより下なのか。。

> 84位: Boo (https://github.com/languages/Boo)

これはよほどみんなで書かないと上に上がれないんですねー。
ScalaがGroovy超えてるんですねー。
時代ですねー。

ランキングは蛇足だったかな。

#まとめ

そんな感じでJavaから一歩前へってことならCeylonはありかなと思います。
自分のJava言語の壁を越えるきっかけとしても。

そして、アドベントカレンダーも明日で最後です。
明日はCeylonに対して個人的な感想を書こうと思います。
Goを触ってて分からなかったこと・自信ないこと

[Go](http://golang.org/)触ってます。触ってますというか、ほんとに遊んでるだけです。
来年はGoで何か作るとこのあいだ決めたので、現在その準備中です。
で、まあ準備というか慣れるのも兼ねて[Project Euler](http://projecteuler.net/)を順番に解いてます。

ProjectEulerをご存じの方なら分かっていただけると思うのですが、素数の計算とか数列の扱いとか、この辺をライブラリ化しておきたいこともあります。
もちろん同じ問題内に限り、たった一度計算すれば以降キャッシュから引っ張り出して、みたいな感じで。

ちなみにですが、ぶっつけで解いていってるので、Goの言語仕様自体は正直ろくに知りません。
[Effective Go](http://golang.org/doc/effective_go.html)は軽く目を通したものの、とりあえず手を動かせば何とかなるだろ精神で。
分からないところがあれば都度調べる感じでやってます。

ここから本題です。分からないところ、自信ないところの羅列と自分なりの理解です。
偉い人がコメントとかくれたら有益な記事になるかもしれないですけど、それ以外は完全に自分の思考の整理です。

## スライス？

これ全然ぴんと来なくて。配列とどう違うの？

```go
var a [10]int = [10]int{} // たぶんこれは要素10の配列
var as []int = a[0:5] // たぶんこれは要素10の配列のスライス
```

実体として配置されてるものは配列、その部分配列（乱暴な言い方だけど）はスライス、という認識。
だから、例えば`as[2] = 2`なんて操作をすると、`a`に対しても影響が出る。

ここまで書いてて思ったけど、これCのポインタ的なあれ？　参照型的なあれ？　アドレス共有してる？

> スライスは参照型です。すなわちスライスを別のスライスに代入したときは、双方が同じ配列を参照します。
> たとえば関数がスライスを引数として取るとき、関数内でスライスの要素に変更を加えると、
> ポインタ渡しのように関数の呼び元からも変更内容が参照できます。

おお。ちゃんと書いてあった。ちゃんと読め俺。
じゃあ、部分配列は本当に乱暴な言い方で、一部だろうが全部だろうがスライスはスライスか。

ちうことは、

```go
var s []int = make([]int, 10) // これはスライス（Cで言うところのポインタに対してmalloc的な操作？）
var s2 []int = s[0:5] // これはスライスのスライス
var s3 []int = make([]int, 10)[0:5) // これもスライスのスライス。s2と一緒。
```

### スライスのまとめ

* よく使われるのは配列じゃなくてスライス
* スライスは参照型（配列に特化したポインタと理解したほうが早いかもしれない）
* 参照型だから元の配列を破壊するような操作も可能
* 関数に渡すときは大体スライス（利便性もろもろ考えればスライスで渡したほうが楽）

## インターフェイス？

いや、概念としては分かります。でもこれ、構造体が持つ関数（メソッド？）のリストですよね、ただの。
これがあるとなにがうれしいのかいまいち掴めない。

使っていればそのうち効果的な使い方を見つけられるのかな。全然わかんないですけど。

あ、例えば、DBにアクセスするための構造体は`Select()`を少なくとも実装してなければならない、みたいなルールを作るとすれば、このインターフェイスの出番ですかね。
よくわかんないですけど。

## まとめ

無理やりまとめ。
ほんとはもっといろいろ書こうと思ってたんですけど、書けば書くほどもっとドキュメント読めよと怒号が飛んできそうなのでorz

来年はAdventCalendarあたりに参加できるぐらいを目標に頑張ります。

あ、インターフェイスの使い道はほんとに誰か教えてほしいです。
俺俺Mojoliciousベストプラクティス

**メリークリスマース** ！！本日でいよいよMojolicious Advent Calendarも終わりですね。本日のネタは最終日に相応しいはどうかは置いといて僕がつくってるWebアプリでのMojoliciousにまつわるTipsとか考えを箇条書きで列挙してみます。サクっといってみよー！

- plackup / Starman で立ち上げることを前提にしている
- Starlet だといきなり本番環境で詰まることがあって原因探りたい
- Placke::Middleware::* を使えることも考慮して `.psgi` ファイルを最初につくる
- セッションはもう `Plack::Middleware::Session::Simple` 使ってアプリ内でゴニョればいいかな〜
- `Mojoliciousモジュール` に同封されてない MojoX::* とか Mojolicious::Plugin::* は使わない
- Mojolicious本体のバージョンアップが早いので追従出来てない可能性があるから
- それと同様にドキュメントは本体のPODを読むのみ、大抵それで解決する
- Hookの中では `before_dispatch` `after_dispatch` はよく使います
- Helperは生やしすぎない程度に便利なメソッドを追加する
- テンプレートは `Mojo::Template` を利用
- Perlが書けるので現状の開発スタイルに合っている
- 見た目に関すること（条件によるタブの切り替えとか...）はテンプレ内に書いちゃう
- モデルをロードする時にCatalystライクに `$self->model('Entry')->create(...)` と呼び出せるローダをつくる
- 本番環境にも `./log` ディレクトリ掘っておくと `production.log` とか出来るのでそれ見てる
- Mojoliciousのログ使わないで `warn Dump $ref` とかやったりするがアリかと...
- Routingで `get/post` 使うと正しくRouteオブジェクト取れないことある
- なので `$r->route('/')->via('GET')->('root#index');` とするケースも...
- **MojoliciousはRoutingが柔軟、Controllerでやるべきことがシンプル、テンプレートでPerlが比較的安全に使える**
- これが特徴かな〜
- そもそもMojoliciousは **変な挙動をしない** から良いしあんまソース追わなくていい
- その他語りたいことは他のMojolicious Advent Calendarの記事に書きました！

ってことで来年あるかどうか、僕がMojoliciousを使っているかは不明ですが、以上Mojolicious Advent Calendar 2013が終わります！！

以下の写真は一人でチキンの丸焼きをつくった様子です。本エントリーの内容との相関はございません。

![IMG_2615.JPG](https://qiita-image-store.s3.amazonaws.com/0/22289/96908fdb-b697-e74c-71c0-039711eef17d.jpeg)
addClassした要素をクリックするjQuery

##やりたいこと
addClass('alert')したあとに、追加したclassのある要素をクリックするjQuery
※ラジオボタンの選択で、ボタンのclassの追加削除
ボタンのクラスの有無によってアラートを出すみたいな・・・？なんかそういうとき

```js
$('.alert').click(function() {
↓
$(document).on("click",'.alert',function() {
```
【PHP】配列の中身を結合(join)し、表示する

こんにちは。

配列の中身を表示させるには、

```php

$testary = array("aa","bb","cc","dd","ee") ;
$arycnt = count($testrec) ;
for($i = 0 ; $i < $arycnt ; $i++){
    echo $arycnt[$i] ;
}

```

だけかと思っていたら、結合でも表示させることが可能なんですね。

```php
$testary = array("aa","bb","cc","dd","ee") ;

echo join(",",$testary) ; // aa,bb,cc,dd,ee
echo join(";",$testary) ; // aa;bb;cc;dd;ee

```

ちょっとまだ使い道は見えてませんが
ソートなどして並べる際に、利用するのでしょうか。

それではこれからも宜しくお願いいたします。
【PHP】substr()とrand()を使ったランダム数の文字を表示させる方法

こんにちは。

複数の関数を使うとなると、結構頭がごちゃごちゃになります。
スッキリさせるために、メモ。

substr()とrand()を使います。

```php

$myname = "tomohiko" ;
  echo substr($myname, rand(0,strlen($myname) ) ; //tomohikoの中から文字開始位置がランダムで順に表示

```

ただ
>
注意:
strlen() が返すのはバイト数であり、 文字数ではありません。

と、
>
stringは0から始まる

バイト数で数えると$mynameは8バイト数で
そのままやるとFALSEを返す可能性があるため、-1をしてやります。

```php

$myname = "tomohiko" ;
  echo substr($myname, rand(0,strlen($myname) -1 )) ; 

```

結構組み合わせてつかっていくんですね。

それでは、これからも宜しくお願いいたします。
Adobe MediaEncoderでExtendScriptを実行する

##Problem
AME向けスクリプトはExtendScript Toolkitからは実行できても，関連づけではうまく実行できません。
例えば下記のコードは関連づけから実行すると動作しません。

```js:ame_quit.jsx
#target 'ame-7.0'
alert(‘Death sentence from BridgeTalk.’);
app.quit();
```

AMEは立ち上がるものの，スクリプトは実行されません。
##Solution
以下のようにExtendScript ToolkitからBridgeTalk経由で実行します。

```js:ame_quit2.jsx
#target 'estoolkit-4.0'
var target = 'ame-7.0';
var bt = new BridgeTalk;
bt.target = target;
bt.body = function(){
	if(confirm('Death sentence from BridgeTalk.')){
        app.quit();
    }}.toSource() + "()";
bt.send(30);
```

AMEが起動していない場合にはBridgeTalkメッセージの送信完了まで時間がかかるので，30秒ほどタイムアウトをとっておくと安心です。
またtoSource()のほか，unevalでもかまいません。
ValueStackへ格納する/ValueStackから表示する

あまり使わないかもしれませんが、Struts2で値やオブジェクトを格納する領域にValueStackがあります。
Struts2内部で利用している格納領域なのですが、新設したインターセプタやActionSupportの代替となるクラスにて共通的に保管する情報を格納する際にも使えます。

ValueStackに格納したオブジェクトのフィールドをJSPで表示する際にはActionのフィールドを表示するときと同様に、

```jsp
 <s:property value="フィールド名" />
```

で表示できます。

*オブジェクトそのものを表示するわけではありません*

例：Actionクラス

```java
public class SampleAction extends ActionSupport {
@Action("")
	public String display() throws Exception {
		// ActionContextを取得し、ValueStackインスタンスを取得
		ActionContext context = ActionContext.getContext();
		ValueStack stack = context.getValueStack();

		// ValueStackへ格納するVOの用意
		CommonStackVO vo = new CommonStackVO();

		// コンテキストパスをValueStackへ格納
		HttpServletRequest request = ServletActionContext.getRequest();
		vo.setContextPath(request.getContextPath());
		stack.push(vo);
		
		return SUCCESS;
	}
}
```

ValueStackへ格納するVOの例( lombok を利用しています )

```java
@Data
public class CommonStackVO {
	private String contextPath;
}
```

JSPはValueStackに格納したオブジェクトがもつフィールド名を指定します。

```jsp
<s:property value="contextPath" />
```

コンテキストパスなのでリクエストごとにコンテキストパスを格納するのはよくありませんけどね…。
ExtendScriptを関連付けから実行する

WindowsでもMacでも，.jsxファイルをExtendScript Toolkitに関連付けしておくと起動できます。
その際は一行目に

```js
#target ‘application name’
```

と記述しておきます。これで対象アプリケーションが立ち上がってスクリプトが実行されます。
ここに記述できるアプリケーション名は，以下のスクリプトをExtendScript Toolkitで実行すると得られます。
またはDataBrowserでapps配列を見てください。

```js:appnames.jsx
#target 'estoolkit-4.0'
for (var i = 0; i < apps.length; i++){
    $.writeln(apps[i]);
}
```
ExtendScript ToolkitのJavaScript Consoleに以下のように出力されます。

```JavaScriptコンソールへの出力
fireworks-12.0
aftereffects-12.0
ame-7.0
audition-6.0
bridge-6.064
dreamweaver-13.0
estoolkit-4.0
exman-6.0
exman-7.0
flash-13.0
flashbuilder-4.5
illustrator-17.064
incopy-9.064
indesign-9.064
photoshop-70.032
prelude-2.0
premierepro-7.0
switchboard-3.064
```

ハイフン以降のバージョン番号まで指定する必要はなく，アプリケーション名だけでもかまいません。
スクリプトを実行する製品バージョンを限定したい場合に有効です。

関連付けたJSXファイルを実行すると，ダイアログが出現します。
![Screen Shot 2013-12-25 at 10.42.19.png](https://qiita-image-store.s3.amazonaws.com/0/34563/ce87e04d-162d-8fba-c09c-dbf5949c6dea.png)
これを回避するには，~/Documents/Adobe Scriptsフォルダに配置して実行します。
WindowsでもMacでも同様のフォルダがExtendScript Toolkit初回起動時に生成されます。
リリース間近！MongoDB 2.6のリリースノート翻訳: エンタープライズ向け機能


今回はリリースノート翻訳の最後、MongoDBエンタープライズへの追加機能についてです。

今回紹介するMongoDBエンタープライズは、企業向けに高度なセキュリティ機能、管理ツール、認証機能を追加したMongoDBの商用版バイナリです。MongoDBのエンタープライズサブスクリプションの一部として提供されています。
商用版と同機能を持つ評価版を、開発やテスト用にこちらからダウンロードできます。個人情報の入力が必要となります。
https://www.mongodb.com/products/downloads/mongodb-enterprise

他の翻訳

- [まとめ！MongoDB 2.6のリリースノート翻訳と所感](http://qiita.com/syokenz/items/a0be8a8bc8b79d471ccf)
- [リリース間近！MongoDB 2.6のリリースノート翻訳: 既存機能の変更点](http://qiita.com/syokenz/items/8a261ccead180b3e3243)
- [リリース間近！MongoDB 2.6のリリースノート翻訳: Aggregation Pipelineの変更点](http://qiita.com/syokenz/items/e3a09442445478832a36)
- [リリース間近！MongoDB 2.6のリリースノート翻訳: 新登場のWrite Commandたち](http://qiita.com/syokenz/items/98feb3fe8511b78d8a2d)
- [リリース間近！MongoDB 2.6のリリースノート翻訳: 新機能と改善点](http://qiita.com/syokenz/items/50af0aee28c8adf0ae13)


今回の翻訳でMongoDB 2.6のリリースノートは全て翻訳完了しました。リリースを楽しみに待ちましょう。

元のリリースノートはこちらです。
http://docs.mongodb.org/master/release-notes/2.6/

## 目次

- MongoDBエンタープライズ向け機能
  - 監査機能のサポート
  - MongoDBエンタープライズ for Windows
  - SASLライブラリの変更
  - LDAP認証のサポート
  - SNMPサポートの拡張
- 追加情報
  - アップグレード手順
  - その他のリソース

****

## MongoDBのエンタープライズ向け機能

### 監査機能のサポート

MongoDBエンタープライズに、mongodとmongosへ対するサーバーとクライアントのアクティビティを監査する機能が追加されました。
詳細は[System Event Auditing](http://docs.mongodb.org/master/core/auditing/#auditing)を参照してください。


### MongoDBエンタープライズ for Windows

Windows用のMongoDBエンタープライズが利用可能になりました。高度なKerberosセキュリティ、SSL、SNMPをサポートしています。

注意: MongoDBエンタープライズ for Windowsは、LDAP認証はサポートしていません。


### SASLライブラリの変更

MongoDBエンタープライズは、GNU SASL(libgsasl)の代わりにCyrus SASLを使うようになりました。この変更は、SASL2、Cyrus SASLライブラリ、GSSAPIプラグインとの依存関係があります。

DebianまたはUbuntuは以下のインストールを実施してください。

```
sudo apt-get install cyrus-sasl2-dbg cyrus-sasl2-mit-dbg libsasl2-2 libsasl2-dev libsasl2-modules libsasl2-modules-gssapi-mit
```

CentOS, Red Hat Enterprise Linux, Amazon AMIは以下のインストールを実施してください。

```
sudo yum install cyrus-sasl cyrus-sasl-lib cyrus-sasl-devel cyrus-sasl-gssapi
```

SUSEは以下のインストールを実施してください。

```
sudo zypper install cyrus-sasl cyrus-sasl-devel cyrus-sasl-gssapi
```


### LDAP認証のサポート

MongoDBエンタープライズはユーザーへの代理認証をサポートします。管理者はMongoDBクラスターに対してLinux PAMやLDAPサービスによるユーザー認証を設定できます。
[Authenticate Using SASL and LDAP](http://docs.mongodb.org/master/tutorial/configure-ldap-sasl-authentication/)を参照してください。

注意: MongoDBエンタープライズ for Windowsは、LDAP認証はサポートしていません。

また、こちらも参照してください。
[LDAP Authentication And Mixed Sharded Cluster Incompatibility](http://docs.mongodb.org/master/release-notes/2.6/#ldap-mixed-mode-incompatibility)

### SNMPサポートの拡張

MongoDBエンタープライズはSNMPサポートを大きく拡張しました。きめ細やかなサーバーの統計情報を必要とする企業の顧客は、<code>db.serverStatus()</code>が提供するほとんど全てのメトリクスへSNMPアクセスできます。

## 追加情報

### アップグレード手順

[Upgrade MongoDB to 2.5.x](http://docs.mongodb.org/master/release-notes/2.6-upgrade/)にアップグレードのインストラクションがあります。


### その他のリソース

[MongoDB Downloads](http://mongodb.org/downloads)


****

以上となります。
recentfの履歴を無限に記憶する

[recentf に保存する履歴の長さを無限にする](http://niku.name/articles/2013/12/25/recentf%20%E3%81%AB%E4%BF%9D%E5%AD%98%E3%81%99%E3%82%8B%E5%B1%A5%E6%AD%B4%E3%81%AE%E9%95%B7%E3%81%95%E3%82%92%E7%84%A1%E9%99%90%E3%81%AB%E3%81%99%E3%82%8B "recentf に保存する履歴の長さを無限にする")

```el
(describe-variable 'recentf-max-saved-items)
```

すると，ドキュメントに

> Maximum number of items of the recent list that will be saved.
> A nil value means to save the whole list.
> See the command `recentf-save-list'.

とあるので

```el
(setq recentf-max-saved-items nil)
```

とする．
Adobe MediaEncoder エンコーダキューの限界を調べる

手始めに10000個のエンコーダキューを投入します。PNGをPNGへ変換する軽いジョブ。
今回はユーザープリセットを使うのでPresetID指定が必要です。

```js
#target 'ame-7.0'
var src = 'PATH TO PNG';
var dst = 'PATH TO OUTPUT FOLDER';

var eh = app.getEncoderHost();
var enc = eh.createEncoderForFormat("PNG");
var flag = enc.loadPreset("eab04c3e-71de-4a9d-aac0-9cc8fe76b7ca");
if(flag){
    for (var i = 0; i < 10000; i++){
        enc.encode(src,dst);
    }
    eh.runBatch();
}else{
    alert("preset not found.");
}
```

エンコード開始後に同じスクリプトで投入することもできますが，その間エンコードは停止します。
投入にはかなりの時間がかかるので注意（ざっくり5時間くらい）。

結果。
![Screen Shot 2013-12-25 at 10.15.38.png](https://qiita-image-store.s3.amazonaws.com/0/34563/c4e0aa0d-de3a-bc85-1bb6-f4f48cd2eaa1.png)
エンコードは正常に完了しました。
UIがものすごく重くなってほとんど操作不能になりました。
10000個以降も投入してみていますが，1ジョブ投入に体感3秒ほどかかっているので……

うすうす感づいてはいましたが，Adobe MediaEncoderは限界まで食べる仕様です。
監視フォルダ運用で放置は結構危険です。完了キューは自動的に削除されません。
といってもエラーログやらログやらはPreferences内にあるので，強制終了してしまっても特に問題はありません。
ジョブ投入はほどほどにして，さくっと再起動してあげるのがいいです。
２４時間一人mrubyハッカソン

mrubyが対象（のひとつ）にしているデバイス系環境では、プログラムを格納するROMには余裕があっても、実行時メモリであるRAMには余裕がないという話をよく聞きます。ROMはフラッシュでメガ単位の容量があっても、RAMは数十KBとかいうケースも珍しくありません。

そこで、12/24から25にかけての24時間で、どれだけメモリ削減できるか一人ハッカソンを開催しました。ぼっち上等。

# 基本戦略

今回のメモリ削減ハックの基本となるのは、Cの文字列定数領域はfreeの対象にならないので、mallocした領域にコピーする必要はない、という戦略です。今回は３件の改善を行いますが、いずれもこの戦略を用いています。

# static symbol

まずは、symbolテーブルのmalloc量を削減しましょう。symbolの登録には

 `mrb_intern(mrb_state *mrb, const char *str, size_t len)` 

を用いますが、これは内部的に渡された文字列領域をコピーしてsymbolテーブルに登録しますが、元になる文字列領域がCの文字列定数であれば、コピーはムダです。

幸い、最近C文字列定数からのsymbol生成を支援する `mrb_intern_lit()` マクロが導入されましたので、これを用いてsymbol生成された時にはコピーを行わないように改造しましょう(`bc7a6e`)。

mrubyのリポジトリを手元にもってきて、

```
git show bc7a6e
```

すると、この変更を見ることができます。新たな制約として、symbolの最大長が16bit整数になっていますが、パーサーですでに1024文字制限が入っていますから問題になることはないでしょう。一応、長さチェックも入れています。

# 測定

せっかくのハックが効果があったのかベンチマークを取る必要があります。

今回はmrubyのテストスイートであるmrbtestを使ってどのくらいメモリが割り当てられたのかを測定することにします。こういう測定にはvalgrindがピッタリです。

```
valgrind --leak-check=full build/host/test/mrbtest
```

を実行することで、メモリリークチェックに加えて、メモリアロケーションの回数とメモリアロケーション量を測定することができます。

実行結果の末尾を見ると

```
==28787== 
==28787== HEAP SUMMARY:
==28787==     in use at exit: 0 bytes in 0 blocks
==28787==   total heap usage: 72,465 allocs, 72,465 frees, 4,595,938 bytes allocated
==28787== 
==28787== All heap blocks were freed -- no leaks are possible
==28787== 
==28787== For counts of detected and suppressed errors, rerun with: -v
==28787== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
```

とあります。この72,465がメモリアロケーションの回数であり、4,595,938がメモリアロケーション量です。
これは変更前の数値です。

さて、今回のハックを行ったものに対して同様の測定をするとアロケーション回数が72,324、アロケーション量が4,594,802になります。ということは、アロケーション回数で141回、アロケーション量で1136バイトの節約になります。たった1Kか。

# load.c symbol

思ったより効果がなかったので、更に改善できるところがないか考えてみましょう。

`mrbc -c`でコンパイルされたプログラムはCの配列に変換されますから、これもコピーする必要はありません。
そこで、load.cをいじってC配列から生成するsymbolのコピーもmallocを省略することにしましょう(`bd76b2`)。

これに合わせてマクロ`mrb_intern_lit`の実体関数の名前を`mrb_intern_static`に変更しています。

これも測定すると、アロケーション回数が69,487、アロケーション量が4,566,384になります。回数で2978回、アロケーション量で29554Bの節約です。29KBかあ。

# load.c string

考えてみたら、mrbcが生成したC配列の中にはsymbolだけでなく文字列も含まれています。こっちの方が効果が大きそうです(`48ad07e`)。

これも測定してみましょう。回数が65,382、アロケーション量で4,518,140です。当初から比較すると7078回と77798Bの改善です。

(追記)

内部表現から文字列を作る関数`mrb_str_pool()`の中でもアロケーションを避ける改善を行ったところ、さらに削減されて、回数が61365回、アロケーション量が4471885Bになりました。124KBの改善です

# まとめと今後

というわけで、ちょいちょいとハックしてmrubyの消費メモリを124KBほど削減しました。
総消費量に比較するとわずか2.7%ほどですが、塵も積もれば山となるかもしれません。

同じ方針でメモリ量を削減できそうなのは命令列の部分ですが、エンディアンの問題もあり、mrbcファイルのフォーマットを変更せずには実現できそうになかったので、今回は見送りました。そのうちmrbcにエンディアン情報を付け加えて実装しようと思います。

この調子でmrubyは、皆様からのアイディアやpull requestをお待ちしています。
public static finalを省略する方法

```java
public class Constants {
    /** 煩悩の数 **/
    public static final int BONNOU_COUNT = 108;

    /** 四国の霊場の数 **/
    public static final int SHIKOKU_REIJO_COUNT = 88;

    /** 都道府県の数 **/
    public static final int TODOFUKEN_COUNT = 47;
}
```

このコードのように定数値を1つのクラスにまとめて書く場合、public static finalをいちいち書くのが面倒になります。
省略する方法を2つ紹介します。

■1. Interface化

```java
public interface Constants {
    /** 煩悩の数 **/
    int BONNOU_COUNT = 108;

    /** 四国の霊場の数 **/
    int SHIKOKU_REIJO_COUNT = 88;

    /** 都道府県の数 **/
    int TODOFUKEN_COUNT = 47;
}
```

classをinterfaceにするだけでpublic static finalがそのまま省略できます。
ただ、暗黙的過ぎて気持ち悪いです。

■2. Lombokの@FieldDefaultsを使う
http://projectlombok.org/features/experimental/FieldDefaults.html

```java
import lombok.AccessLevel;
import lombok.experimental.FieldDefaults;

@FieldDefaults(makeFinal=true, level=AccessLevel.PUBLIC)
public class Constants {
    /** 煩悩の数 **/
    static int BONNOU_COUNT = 108;

    /** 四国の霊場の数 **/
    static int SHIKOKU_REIJO_COUNT = 88;

    /** 都道府県の数 **/
    static int TODOFUKEN_COUNT = 47;
}
```

publicとfinalを省略できます。
また、protectedなど他のアクセスレベルにも対応できます。
WebStorm Settings for CoffeeScript, Grunt, Mocha


This tutorial shows how to configure WebStorm for "1-click to build and test" using CoffeeScript, Grunt and Mocha.

Take [this repository](https://bitbucket.org/zerobaseinc/zb_prototyping_study_6) for example.

## External tools > Add

- Name: grunt build-coffee
- Tool settings:
	- Program: grunt
	- Parameters: build-coffee
	- Working Directory: `$ProjectFileDir$`

![WebStrom_Preference_External_Tools.png](https://qiita-image-store.s3.amazonaws.com/0/26039/ffd01e3b-68b0-7101-26fc-e84969dce909.png "WebStrom_Preference_External_Tools.png")

![WebStrom_Preference_External_Tools_Edit.png](https://qiita-image-store.s3.amazonaws.com/0/26039/23df4dc8-45b0-4eae-cdf5-d932db9c2090.png "WebStrom_Preference_External_Tools_Edit.png")

## Run > Edit Configurations… > Add New Configuration

Replece $ProjectFileDir$ with your actual path.

- Name: Test
- Node interpreter: /usr/local/bin/node
- Mocha node package: $ProjectFileDir$/node_modules/mocha
- Working directory: $ProjectFileDir$
- Environmental variables:
	- NODE_PATH: build/app:build/app/components
- Test directory: $ProjectFileDir$/build/test
- User interface: BDD
- Include sub directories: checked
- Require module: 
- Before launch: External tool:
	- External tool 'grunt build-coffee'

![WebStorm_RunDebug_Configuration.png](https://qiita-image-store.s3.amazonaws.com/0/26039/46ae04a3-939d-3310-69fd-4b5c00831b12.png "WebStorm_RunDebug_Configuration.png")

## Run 'Test'

![WebStorm_Grunt_Mocha.gif](https://qiita-image-store.s3.amazonaws.com/0/26039/44c4d343-a906-dd34-ade1-788a190e2c32.gif "WebStorm_Grunt_Mocha.gif")
rubyの式展開

ruby の式展開の仕方をまとめました。一番下のやつをさっき知ってびっくりしたので、忘れぬうちにメモ

```rb:test.rb
hoge = "__hoge__"

# 基本的な式展開
puts "#{hoge}" #=> __hoge__

# 式展開の中では普通にコードがかける
puts "#{hoge + hoge.upcase}" #=> __hoge____HOGE__

# printf 風
puts "%d" % 12345 #=> 12345

# 複数の場合はArrayで
puts "%d, %d" % [12345, 56789] #=> 12345, 56789

# ハッシュも渡せる
puts "%{hoge}, %{fuga}" % {:fuga => "__fuga__", :hoge => "__hoge__" } #=> __hoge__, __fuga__
```