OmniAICreator/Qiita-1.07M huggingface dataset:
Python で名前空間を汚さずにローカルスコープを作る

敬虔な Pythonista の皆さんには叱られそうな話題ですが、埋め込み Python 環境で名前空間を汚さずに処理がしたいという状況で、下記のようなコードを使ってローカルスコープを作ってみました。
動作は Python 2.7.4/3.3.1 で確認していますが、大したことはしていませんので他のバージョンでも動くと思います。

```python:localscope.py
DummyClassForLocalScope = "global value"

try:
    class DummyClassForLocalScope:
        # you can write any code here

        raise RuntimeError("Exit from local scope")
except RuntimeError as exception:
    if exception.args != ("Exit from local scope",):
        raise exception

print(DummyClassForLocalScope)
```

class文でローカルスコープを作り、ローカルスコープの最後で例外を発生させることでクラスの作成をキャンセルしているだけです。

間違っても多用はしたくありませんが、JavaScriptの`(function(){...}());`的なことがどうしてもしたい場合は、こんな方法もありますよということで。
Javaでメモしたい

```java:memo1.java
HogeService hogeService = new HogeService();
MemoizeService memo = new MemoizeService();

public void hoge(Integer hogeId) {
  // HogeService.getHoge を呼ぶ
  Hoge hoge = memo.wrap(hogeService).getHoge(hogeId);

  //...

  fuga(hogeId);
}
public void fuga(Integer hogeId) {
  // HogeService.getHoge を呼ばずに先の値を返す
  Hoge hoge = memo.wrap(hogeService).getHoge(hogeId);

  //...
}
```
こういうことをしたい。

```java:memo2.java
MemoizeService memo = new MemoizeService();
HogeService hogeService = memo(new HogeService());
```
とかするのは嫌だ。

なんかできそうな気もする。なんか既にそういういい感じのないかな。

## キャッシュ寿命
```java:memo3.java
  Hoge hoge = memo.requestScope(hogeService).getHoge(hogeId);
  Hoge hoge2 = memo.eternal(hogeService).getHoge(hogeId);
```
こんな感じでウェブアプリケーション内で使っている時に同一リクエスト間だけ有効なキャッシュになるとか、ずっと保持しておくとか適当に制御できると嬉しい。
まあどちらかというと後者はどうとでもなるので、前者の同一リクエスト間だけ有効なキャッシュとかやりたい。
Circle CIでテストにかかる時間を短縮 w/ Jenkins


さいきん、Jenkinsのテストが遅い...
specの肥大化...
Jenkinsのインスタンスがm1.small…

などなどは持続可能なCIを目指す上で大きな障壁であります。

## じゃ、インスタンスでかくすりゃいいじゃん

という事ができる方、分散rspecやってるぜheheな方はそれで幸せになれると思います。

## え、あんまりお金ないし

みたいな仲間は、@camelmasa 先生の記事読むと幸せになります。

[プライベートリポジトリを激安にCI出来るCircle CIが凄い。](http://qiita.com/items/924430ffa6f9fbea44c8)

少し前から、Qiitaの皆さんにオススメしていただいたので検討してはいたのですが、ここまで良いとは思わなかった。

## めっさ軽いし、安い

Dashboardからして軽い。
日本に置いているのか先読みしているのか分からないけど、軽い。

１つのプライベートプロジェクトなら$19/moという破格。

## 実際、早くなったよ

ちゃんと計測してないのですが、10分強かかっていたrake specが、2分弱にまでになりました。早い。

最初のビルドのときはキャッシュがないので、時間がかかりますが、２回目以降は早くなります。

さらに、もうちょっとお金をかけれる方は並列実行してもっと早く出来ます。

ちなみに、標準的なrailsプロジェクトは何も設定を書かずにspecが通りました。すごい。

## Jenkins先生はビルド専門に

もともと、

local --[git push]--> Github --[Github Plugin]--> Jenkins --[spec&cap]--> Staging/Production

みたいな感じでした。

ビルドまでhookしています。
本番にまで上がっちゃうってのは賛否両論かと思いますが、
Stagingにデプロイされるってのは悪くないかなと思います。

が、ちょっとJenkins先生の仕事が多すぎたので、Circle CIに負担してもらう形になりました。

local --[git push]--> Github --[Web Hook]--> Circle CI --[Hook]--> Jenkins --[cap]--> Staging/Production

## Circle.ymlに設定をかく

今はこんなかんじです。

```circle.yml
# SEE: https://circleci.com/docs/config-sample
# Ruby Version List: https://circleci.com/docs/environment#ruby
machine:
  ruby:
    version: 1.9.3-p327

deployment:
  staging:
    branch: develop
    commands:
      - wget --spider -nv http://jenkins_url/git/notifyCommit?url=[git_url]&branches=develop

  production:
    branch: master
    commands:
      - wget --spider -nv http://jenkins_url/git/notifyCommit?url=[git_url]&branches=master
```

Rubyのバージョンは指定しなくても動きますが、書いておいた方が無難でしょう。裏側はRVMらしいです。

最初は単純なwebhooksの項目にJenkinsのURLを追加していましたが、そうすると失敗してもwebhookが飛んでしまうので困っていました。
素直にdeployment以下に書けば良かったみたいです。
Greenのときだけcommandsが実行されます。

ちなみに、Jenkinsはgit pluginで受け取ると良いと思います。
TOKEN指定のWeb hookでも良いと思いますが、
git pluginの場合、差分が無ければビルドしないで無視してくれるので。

良いですね、とても良いですね。
Circle CIはもっと色々できるみたいなので、
もっとシンプルに出来るかもしれません。

詳しくは公式の[ドキュメント（英語）](https://circleci.com/docs)をご覧ください。
DateFormat.format では HH:mm ではなく kk:mm を使う

Android には ``android.text.format.DateFormat`` というユーティリティクラスがあるのですが、これの ``format`` メソッド、時刻の24時間形式に対応してません。

```java:DateTimeFormatTest.java
long t = System.currentTimeMillis();
Log.d("By DateFormat", DateFormat.format("HH:mm", t));
Log.d("By SimpleDateFormat", new SimpleDateFormat("HH:mm").format(new Date(t)));
```

```
04-09 22:42:14.435: D/By DateFormat(2860): HH:42 ←あ〜あ
04-09 22:42:14.435: D/By SimpleDateFormat(2860): 22:42
```

Staclkoverflow とかにも「代わりに SimpleDateToimeFormat を使えば」と書いてあるわけですが、いやいやそれじゃユーティリティクラスの役割果たしてないでしょ？と思うところであります。

<strike>自分の中では、時刻は24h表示がデフォルトなので、「DateFormat クラス使えない子」というレッテルを貼ってしまいました。</strike>

## 追記 2013.7.24
「HH でなく kk が使えるよ」とコメントで教えて頂きました。

```java:
DateFormat.format("kk:mm", t);
new SimpleDateFormat("kk:mm").format(new Date(t));
```

どうやら [SimpleDateFormat でも使える](http://stackoverflow.com/questions/8907509/how-to-set-24-hours-format-for-date-on-java)ようなので、「Java で 24h表記の場合は kk」って覚えておけばよさそうです。(k って何の略なの…)

## 参考
* [java - 24 hour clock not working in dateformat android - Stack Overflow](http://stackoverflow.com/questions/5755073/24-hour-clock-not-working-in-dateformat-android)

よく見たら、ここの Top Vote にも 「kk 使え」って書いてあったorz
trunk の hadoop の git log を効率よく追いかける方法

# 質問
git log でヒストリを追いかけようとすると、どうも過去にディレクトリツリーを大幅に変更したらしく、追いかけるのが大変です。

なんとかならないでしょうか。

# 回答
以下の3つのコミットハッシュをチェックアウトして、それぞれブランチを切っておけば多少は追いかけるのが楽になります。

pre-HADOOP-7560

コミットハッシュ eda88e7e1d1653643c959d547f672c9ad98f9dfb
最後のディレクトリ大改造。trunk だと git log 使ってもここまでしか追えないので超絶めんどくさい。そしてディレクトリ編成はこれだけではない。
pre-HADOOP-6671

コミットハッシュ 58ab6d673734f2ee9f514ac10a6d31655a1d1861
HADOOP-6671 でもかなり改造されてる。
pre-directory-name-changed

コミットハッシュ 4c44bf723412faa76c3afe421db5e3d78ab27388
最初の大改造。上記のコミットハッシュをチェックアウトすれば、hadoop 1.0 系あるいは CDH3 で馴染みの深いディレクトリ構成に戻る。

# 注意
この投稿は、Hadoop Hackathon in Tokyo の QA サイト閉鎖に伴う移行作業により作成されたものです。
移行元URL: http://glowing-moon-7493.herokuapp.com/questions/771/trunk-hadoop-git-log
Hive の開発をしたいのですが、どうしたらいいでしょうか？

# 質問

Hive の開発をはじめたいのですが、どこから始めればいいでしょうか？

* ソースはどこからダウンロードすればいいんでしょうか？
* コンパイル・ビルドはどのように行えばいいのでしょうか？
* テストはどのように行えばいいのでしょうか？
* レビューはどのように行えばいいのでしょうか？
* パッチの投稿はどのように行えばいいのでしょうか？

# 回答

## wyukawa さんの回答

Gitの場合は

```
$ git clone git://git.apache.org/hive.git
$ cd hive
```

Subversionの場合は

```
$ svn checkout http://svn.apache.org/repos/asf/hive/trunk hive-trunk
$ cd hive-trunk
```

した後に

```
$ wget https://issues.apache.org/jira/secure/attachment/12524106/HIVE-2902.3.patch.txt
$ patch -p0 < HIVE-2902.3.patch.txt 
$ ant clean package eclipse-files
$ cd metastore
$ ant model-jar
$ cd ../ql
$ ant gen-test
```

ant gen-testでエラーが起きた場合は[こちら](http://mt.orz.at/archives/2012/02/hiveeclipse.html)参照

あとEclipse上でテストを実行する際にhive/build/hadoopcore/hadoop-0.20.2が無いとダメなのでHadoop自体は別途ダウンロードしてシンボリックリンクでもはっておく。

パッチ投稿の仕方は[こちら](http://mt.orz.at/archives/2012/04/hive-1.html)参照

と、ここまで書いて気づきましたがタムタムさんのブログ読むのが早いですw

## tamtamさんの回答

HiveのAntコマンドはhive_homeでのみ実行される事を想定しています。

現在のtrunkでは

```
 $ cd ../ql
 $ ant gen-test
```

ではなく

```
$ cd ../
$ ant gen-test
```

とする事で配下ディレクトリのgen-testがコールされるようになっています。

参考: [HIVE-2904](https://issues.apache.org/jira/browse/HIVE-2904) [HIVE-3003](https://issues.apache.org/jira/browse/HIVE-3003)

trunkの状態によってはEclipseのテンプレートが正しく生成されない事があります。ant eclipse-filesを実行後EclipseProjectとしてインポートした後にEclipseでエラーが出ている場合は、ほとんどの場合が.classpathに問題があります。基本的にはそこは手動で直しても問題はありません。

## shiumachi の補足

hive の tar のビルド方法

```
$ ant tar binary -Dthrift.home=/usr/local//Cellar/thrift/0.8.0
```

どうも ``export _JAVA_OPTIONS="-Dfile.encoding=UTF-8"`` を設定しているとコンパイル時にエラーが出るっぽいので、unset しておいた方がいいかもしれません。詳細不明。

(2013/04/15追記)  [HIVE-4231](https://issues.apache.org/jira/browse/HIVE-4231)をファイルしておきました。多分関連あるはず


# 注意
この投稿は、Hadoop Hackathon in Tokyo の QA サイト閉鎖に伴う移行作業により作成されたものです。
移行元URL: http://glowing-moon-7493.herokuapp.com/questions/171/hive
Hadoop Hackathon in Tokyo では CI まで用意されているって聞いたんですが本当ですか?

# 質問
[「CIまで用意されてるハッカソン、それが象ハッカソン」](https://twitter.com/shiumachi/status/215047904698712064) というつぶやきを見たのですが, これは本当ですか? 詳しく教えてください.

# 回答

Github と [Travis CI](http://travis-ci.org/cocoatomo/hadoop-common) を使ってビルドとテストを行っています. (この時点で分かった人は http://travis-ci.org/cocoatomo/hadoop-common を直接見れば理解できるでしょう)

Travis CI の一般的な使い方は[本家のドキュメント](http://about.travis-ci.org/docs/)を読めばよいので, ここでは使い方を手順の形でまとめます.

## 開発を始める
Travis CI は github のレポジトリに対して CI を行います. ここ https://github.com/cocoatomo/hadoop-common/ の cocoatomo のレポジトリを使っているので, 開発を始める場合は cocoatomo に連絡して commit 権をもらってください.

(Hadoop Hackathon in Tokyo に参加したときにでも声を掛けてください)

[git を使った効率のよい hadoop 開発の仕方](http://qiita.com/items/b29f3102c90491ff2431)にあるようにバグ対応用のブランチを作って, 作業を始めてください.

## CI ジョブを実行する

Travis CI は github のレポジトリが git push されたときの通知を受けてジョブを開始します. maven プロジェクトではデフォルトで mvn test が実行されます.

他にもテスト実行前の設定とかがあるんですが, それは github レポジトリの各ブランチのルートにある .travis.yml ファイルを見てください.

このファイルの中の設定で重要なのは, テストを実行するブランチを列挙する branches という設定項目です. ここに先程作成した作業用ブランチを追加してください.

ここで .travis.yml を commit して push しましょう. Travis CI のビルド履歴 に今 commit したブランチ名が表示され, そこをクリックするとビルドログが表示されます.

CI ジョブが無事動作していれば, 今後このブランチに commit するたびにジョブが動くことになります.

おめでとう!

## github レポジトリのメンテ
Travis CI が自分の github ブランチの CI しかできない関係で, cocoatomo アカウントの github レポジトリを本家のレポジトリに追随させる必要があります. 手作業は面倒なのですが, ローカルブランチに本家から git pull して最新の状態にし, それを cocoatomo アカウントのレポジトリに git push してください.

チケットごとにブランチを切っておけば, conflict することも無いので安全です.

# 注意
この投稿は、Hadoop Hackathon in Tokyo の QA サイト閉鎖に伴う移行作業により作成されたものです。
移行元URL: http://glowing-moon-7493.herokuapp.com/questions/681/hadoop-hackathon-in-tokyo-ci
'String'.split('')は文字列を分割して、配列を作成する。

splitは

> [String.split](https://developer.mozilla.org/ja/docs/JavaScript/Reference/Global_Objects/String/split "String.split")
>文字列を区切ることに使用するための文字を指定します。

とあったので、区切り文字が無いと分割できないかと思いがちだが、
空文字`''`を区切り文字として指定すると、文字列を分割した配列が作成出来る。
ちなみに、引数を指定しないと文字列を要素とした配列が作成される。

```javascript
'h,o,g,e'.split(',')//=> [ 'h', 'o', 'g', 'e' ]

'hoge'.split()//=> [ 'hoge' ]

'hoge'.split(''); //=> [ 'h', 'o', 'g', 'e' ]

```
英語初心者が Hadoop の JIRA やメーリングリストでやりとりできるようになるまで何をすればいいですか?

# 質問

英語初心者が JIRA やメーリングリストでやりとりできるようになるまで何をすればいいですか?

おすすめの書籍、サイト、勉強法等あれば教えてください。

関連:

[java 初心者が hadoop 開発できるようになるまで何を勉強したらいいですか？](http://qiita.com/items/2fc6c4fc09697d400de5)

# 回答

はっきり言いますが、普通に英語を学ぶよりはるかに短い時間でコミュニティにおける英語の読み書き能力は身につきます。

理由は2つで、

話題のジャンルが特定の技術系に限定されている→覚える語彙の量が少ない
ログやコードは当然全て英語圏の人が理解できるので、該当箇所をペーストしてしまえば伝わることが多い
というものです。

最初にすべきことは何か? それは **Hadoop 系メーリングリストを片っ端から購読することです!**

Hadoop エコシステムには必ずユーザ向けメーリングリストと開発者向けメーリングリストがあります。

全部購読して保存しましょう。会社のメールアドレスだと容量の関係で保存しづらいかもしれませんので、gmail 等を使うのをおすすめします。こうすることで、Hadoop に特化した例文検索データベースを作成することができるのです。 ( [search-hadoop](http://search-hadoop.com/) は登録されているプロジェクトが少ないのであまりおすすめしません)

次に、文法を勉強(復習)しましょう。 [Grammar in Use Intermediate](http://www.amazon.co.jp/Grammar-Intermediate-Students-Answers-CD-ROM/dp/0521734770) がおすすめです。新しい文法を学んだら必ず先ほど保存したメールアーカイブを検索し、例文を記録してください。

また、メールやJIRAも少しづつ読み始めましょう。知らない単語が出てきたら辞書を引くと同時に、先ほどと同様溜め込んだメールを検索して例文を記録しましょう。

文章を書くときには、今までためた例文集を使って適切な表現で書くようにしましょう。 表現が難しい場合は文法書に立ち戻るのも必要です。

以下、私の記述したブログ記事です。参考にしてください。

* [技術系メーリングリスト上で使える英語の習得法](http://d.hatena.ne.jp/shiumachi/20120527/1338045378)
* [英語によるhadoop系メーリングリストへのバグレポート提出ガイド](http://d.hatena.ne.jp/shiumachi/20111227/1324993688)

# 注意
この投稿は、Hadoop Hackathon in Tokyo の QA サイト閉鎖に伴う移行作業により作成されたものです。
移行元URL: http://glowing-moon-7493.herokuapp.com/questions/571/jira
git を使った効率のよい hadoop 開発の仕方

# 質問
Hadoop を開発するときに、上手い git の使い方がありましたら教えてください。


# 回答

私がやっている方法は、JIRA のチケットごとにブランチを切る、という方法です。

trunk では一切開発せず、その日の開発の最初に必ず git fetch; git rebase origin/trunk します。

こうすることで常に最新のクリーンな trunk を持つことができます。

次に、開発するときはこの trunk からフォークして別ブランチを作ります。このときブランチ名は JIRA のチケット番号と同じにすると管理しやすいです。

例えば HADOOP-100 というチケットを開発したい場合、trunk ブランチにいるときに git checkout -b HADOOP-100 と実行することで JIRA と同一名のブランチを作成することができます。

コミットログはどうせ git diff をとったときに消えるので分かりやすく書いておけば問題ありませんが、私の場合は頭に (LOCAL) とつけておきます。こうすることで、これがアップストリームのコミットではなく自分がコミットしたものだと一目でわかります。

対象の JIRA の開発が終わったらもうそのブランチは捨てて構いませんのでご自由に処分してください。

# 注意
この投稿は、Hadoop Hackathon in Tokyo の QA サイト閉鎖に伴う移行作業により作成されたものです。
移行元URL: http://glowing-moon-7493.herokuapp.com/questions/631/git-hadoop
java 初心者が hadoop 開発できるようになるまで何を勉強したらいいですか？

# 質問
java 初心者が hadoop を開発できるレベルになるまで何を勉強したらいいでしょうか?

おすすめの書籍、サイト、勉強法等あれば教えてください。

# 回答

java 初心者ということで, java に話題を絞って回答します.

まずは「独習 java」でも Web 上の教材でも何でも良いので, java について構文とか基本的なところを押さえましょう. javadoc, jar については知っている必要があります. ant, maven まで概要を押さえられれば尚良いです.

次に hadoop プロジェクトが使用しているライブラリを把握しましょう. これは pom.xml という xml ファイルの dependencies 要素の中に列挙してあります. それぞれのライブラリがどのような目的のものかを把握するくらいで最低限良いでしょう. ライブラリの javadoc を読むのも良いですが, だいたいのパッケージ構成とパッケージの概要ページを読めば十分だと思います.

取り組みたい JIRA チケットを決めて, 関係するクラスのソースコードを見てみましょう. そのクラスで使用しているライブラリがあれば, 使用しているメソッドのソースコードを読んで動作を理解しましょう. もちろん java 標準のクラス (java.lang.* とか) でも, 動きを知りたいものがあればソースコードを読みましょう. たいていのライブラリはソースコードが公開されていますし, java 標準のものはソースコード付き JDK か OpenJDK で読めます. (自分の経験では, ここでのソースコード読みが一番力が付きます)

参考 (になるかもしれないし, そうでないかもしれない)

* [[java][実装]一歩先行くJavaプログラマが読むべきオープンソースソフトウェア10選](http://d.hatena.ne.jp/taichitaichi/20110609/1307641027)
* [太一のコードの読み方メモ](https://gist.github.com/taichi/2693387)

ここまで来ればたいての開発はできるんじゃないかと思いますが, java7 の新機能について知りたい場合は櫻庭さん (@skrb) を追っ掛けておくのが手っ取り早いと思います.

ITPro での連載記事 → [Java技術最前線](http://itpro.nikkeibp.co.jp/article/COLUMN/20060915/248243/)
実装レベルの細かい話は @hishidama さんの記事が情報源になることが多いです. (この人の技術情報まとめページを知らない人は, いくら「実務で n 年 (n ≧ 1) java 使ってました」と言っていても私はモグリだと看做します.)

[Javaメモ目次(Hishidama's Java Memo)](http://www.ne.jp/asahi/hishidama/home/tech/java/)

# 注意
この投稿は、Hadoop Hackathon in Tokyo の QA サイト閉鎖に伴う移行作業により作成されたものです。
移行元URL: http://glowing-moon-7493.herokuapp.com/questions/561/java-hadoop
hadoop の開発におすすめの Eclipse プラグインはなんですか?

# 質問
hadoop の開発におすすめの Eclipse プラグインはなんですか?

# 回答

EGit はあると便利です。

Help -> Eclipse Market Place で EGit を検索してください。

ただ個人的には EGit で git リポジトリを管理するより、ローカルファイルシステム上で git clone して管理した方がいいと思っています。

EGit を使う目的は、Annotation (git blame) と git log を見やすくするためです。

登録したプロジェクトで EGit を有効化するには、対象のプロジェクトを右クリックして Team -> Share Project を選び、そのプロジェクトが入っている git リポジトリのパスを選択してください。

# 注意
この投稿は、Hadoop Hackathon in Tokyo の QA サイト閉鎖に伴う移行作業により作成されたものです。
移行元URL: http://glowing-moon-7493.herokuapp.com/questions/221/hadoop-eclipse
Hadoop の trunk版の native library をコンパイルするにはどうすれば良いでしょうか？

# 質問
Hadoop の trunk版の native library をコンパイルしたいのですが，apache のサイトには maven を用いたコンパイル方法が書いておらず，コンパイル方法が分かりません．どうすれば良いでしょうか？

# 回答

maven の native プロファイルを有効にすることにより，native library のコンパイルを行うことができます． 例:

```
mvn -P native compile
```

# 注意
この投稿は、Hadoop Hackathon in Tokyo の QA サイト閉鎖に伴う移行作業により作成されたものです。
移行元URL: http://glowing-moon-7493.herokuapp.com/questions/521/trunk-native-library
AIR for iOS で複数のANEを使うと、まったく使えなくなる場合がある


## コンパイルエラーが出ずに、ランタイム上で動かなくなる

下記によるとエラーが出る場合があるとのこと


> -hideAneLibSymbols：（iOS のみ、AIR 3.4 以降）アプリケーション開発者は、複数のソースの複数のネイティブエクステンションを使用できます。また、複数の ANE で同じシンボル名が共有されている場合、ADT では「オブジェクトファイルでシンボルが重複している」という内容のエラーが生成されます。場合によっては、このエラーにより、実行時にクラッシュが発生する可能性もあります。hideAneLibSymbols オプションを使用すると、ANE ライブラリのシンボルをそのライブラリのソースのみに表示するか（yes）グローバルに表示するか（no）を指定できます。

[Adobe AIR * ADT package コマンド](http://help.adobe.com/ja_JP/air/build/WS901d38e593cd1bac1e63e3d128cdca935b-8000.html)


自分が直面した問題は、

* コンパイル時: エラーなし
* ランタイム上: 以下のエラーが出た
	* 
`#3500: The extension context does not have a method with the name hogehoge`


(ちなみに、このエラーはANEにないメソッドを呼ぶと起こるやつ。つまりANEがなんかの理由でおかしくなってる)


## 動かない例は TestFlightのANEとViberationのANEを同時に使うとき

* com.adobe.Vibration
* com.adobe.ane.TestFlightImpl

同時に使うとTestFlightのANEが動かなくなる。なぜか両方ともAdobeパッケージ！

## 解決策 → FlashBuilder4.7でやるか、adtコマンドでやるか

* FlashBuilder4.7の設定
* ANEライブラリのシンボルを非表示にチェック
 ![](http://static.tumblr.com/ishlw7a/njcmlabdr/____________________________2013_04_15_15_58.png)
Adobe Flash Builder 4.7 * ネイティブエクステンションの使用http://help.adobe.com/ja_JP/flashbuilder/using/WSe4e4b720da9dedb5-2e7310a1136ab7c1811-8000.html#WSe4e4b720da9dedb52cb000931394dc3d45a-8000


それか
`adt`コマンドに`-hideAneLibSymbols`を追加するといけるらしいが、IDEと連携してないとなんしかきつい。


## IDEAでの設定方法

![設定方法](http://static.tumblr.com/ishlw7a/4somlam4h/captured.png)
[ProjectStructure] → [iOSのタブ] → Additional ADT options に
`-hideAneLibSymbols yes `
を追加。
OpenSSLでキーペアやCSRを作成する手順


## 注意事項
opensslのバージョンは1.0以降を想定してます。

## 1. キーペア作成
下記コマンドを実行

```console
$ openssl genrsa -des3 2048 > (出力したいキーファイル名)
```

## 2. CSR作成
キーペアができたら下記コマンドを実行

```console
$ openssl req -new -key (1で作成したキーファイル) -out (出力したいCSRファイル名)
```

コマンドを実行するとプロンプトが表示されてサーバー識別名（DN）情報の入力を求められるので、求められるがままに入力する。
入力する項目は下記の通り

* Country Name:
	国名
	ISOによる2文字の国名の符号
	日本の場合は"JP"でOK

* State or Province Name:
	都道府県名

* Locality Name:
	市区町村名

* Organization Name:
	組織名

* Organizational Unit Name:
	部署名

* Common Name:
	サーバのFQDN

## 3. CSRの内容(DN情報)確認

下記コマンドで2で入力したDN情報を確認できる。

```console
$ openssl req -noout -text -in (CSRファイル名)
```

## 4 Keyファイルの確認方法

下記コマンドを入力して

```console
$ openssl rsa -noout -check -in (Keyファイル名)
```

```console
RSA key ok
```

と出力されればOK。

## 5. CSRとKeyファイルの比較

CSRファイルとKeyファイルのペアが正しいかどうか比較する。
下記コマンドを実行して表示される秘密鍵の内容のうち、__modulus__ の内容と

````console
$ openssl rsa -in (keyファイル名) -text
````

下記コマンドを実行して表示されるCSRファイルの内容のうち、__modulus__の内容を比較して同じであれば、それぞれ対になるCSRファイルとKeyファイルということになる。

````console
$ openssl req -in (csrファイル名) -text
````

## 6. CER (CRT) ファイルの内容確認

下記コマンドでベリサインなどから購入したSSLサーバ証明書の内容を確認できる。

```console
$ openssl x509 -noout -text -in (cerファイル名)
```

## 7. 秘密鍵のパスフレーズの解除

パスフレーズを設定したままだと、apacheやnginxを起動する際にパスフレーズの入力を求められる。
logrotateなどで自動的に再起動させる場合に不都合なので下記コマンドで、パスフレーズを解除する。

```console
$ openssl rsa -in (keyファイル名) -out (パスフレーズ解除済みkeyファイル名)
```
Animation.AnimationListenerでいちいち3つもメソッドをimplするのは面倒くさい

`interface Animation.AnimationListener` をimplementsすると `onAnimationStart()`, `onAnimationRepeat()`, `onAnimationEnd()` の3つのメソッドを実装しないといけないわけですが、このなかでよく使うのは `onAnimationEnd()` じゃないですか。
そこで以下の様な abstract class を定義して `onAnimationEnd()` だけ実装すればいいようにしているんですが、こんなもんですか。他にいい方法はありませんか。

```java
import android.view.animation.Animation;

/**
 * The same as AnimationListener but only onAnimationEnd(Animation) is required to implement.
 */
public abstract class AnimationEndListener implements Animation.AnimationListener {

	abstract public void onAnimationEnd(Animation animation);

	@Override
	public void onAnimationRepeat(Animation animation) {
		// do nothing
	}

	@Override
	public void onAnimationStart(Animation animation) {
		// do nothing
	}
}
```
Hadoop 開発の code reviewer になりたいのですが，どうすればなれるのでしょうか．

# 質問
Hadoop には，パッチが大量にありますが，Review が間に合っていないパッチが多くあるように感じます． その問題を解決し，開発を加速するために，code reviewerになりたいと考えているのですが，どういった手順でなれるのでしょうか．

# 回答

code reviewer になるための条件は、コントリビュータでさえあれば特に制限はありません。

コミッター達がレビューすることが多いのですが、それはあくまで慣習的なものです。レビューされずに放置されているJIRAは本当に多いので、レビュワーが増えることは大歓迎です！

レビューの手順は簡単で、

* レビューします。Hadoop コミュニティではあまり review board を使わないですが、使うことも可能です。HBase コミュニティではかなり高い頻度で review board を使います。Hive では Phabricator が使われます。
* レビューが完了したら JIRA を編集し、 reviewed にチェックをつけます。

## レビューの観点

レビューの観点についての明確な定義はありませんが、以下の事項を指摘することが多いです。

* 変更の必要性
* コード変更による影響範囲
* 設計
* 命名規則
* インデント
* イディオムの統一
* テストの有無
* コードの重複

レビューを行う上で自分が分からないこと、決定できないことについては、その分野のコミッタに相談するのも良いでしょう。相談する際には，Hadoop の JIRA のコメント欄についている mention 機能を利用すると便利です。mention 機能の使い方は以下の通りです:

* JIRA のコメント欄で @[ユーザ名] と入力する．
* ユーザが複数候補に挙がるので、 mention を送りたい方の名前を選択します．
* コメント欄に [~ユーザ名]という名前が補完されます．これで mention 完了です．

あるユーザに mention すると、JIRA に登録されているメールアドレスに "mention されているよ" という意味のメールが送付されるようになっています。

# 注意
この投稿は、Hadoop Hackathon in Tokyo の QA サイト閉鎖に伴う移行作業により作成されたものです。
移行元URL: http://glowing-moon-7493.herokuapp.com/questions/471/code-reviewer
Hadoopの開発でJIRAのチケットを新規に作成するにはどうすればいいでしょうか?

# 質問
Hadoopの開発でJIRAのチケットを新規に作成するにはどうすればいいでしょうか?


# 回答
この質問には「技術的にどうすればいいか」と「何をどう書いたらいいか」という2つの側面がありますが、ここでは技術的な側面に絞って記述します。

まず、ASF JIRA でユーザ登録をしてください。これは誰でも可能です。

次に、右上の Create Issues を選択してください。

ここで必要項目を入力し、Create を選択すれば作成完了です。

項目についても簡単に説明します。

まずプロジェクトの選択。特に Hadoop は、Hadoop Common、 Hadoop HDFS、 Hadoop MapReduce と3つに分かれていますので注意して適切なプロジェクトを選択してください。

次に Issue Type です。バグなら Bug、現在の機能の拡張なら Improvement、全くの新機能なら New Feature を選択してください。

Priority は基本そのままでいいです。単なるtypo の指摘なら Minor、そもそもサービスが立ち上がらず全く動かない状態に陥った場合は Critical を選んでください。

Due Date は無視でいいです。

Components は分かれば選択してください。わからなければこれも放置でいいです。

Affect Version も無理に入力する必要がないです。1.x 系固有のバグであれば 1.x の最新版を入力してください。当然ながら、現在の trunk バージョンで再現を確認しているということが大前提になります。もし trunk で再現を試みていない場合は JIRA の作成よりも先にそちらを実施してください。

Fix Version も放置で。

Assignee はコントリビュータ権限がないと設定できないと思いますのでこれも放置。

Description はもちろん説明を書きます。書き方については別に質問を作成します。

そこから下は全部無視でいいです。

# 注意
この投稿は、Hadoop Hackathon in Tokyo の QA サイト閉鎖に伴う移行作業により作成されたものです。
移行元URL: http://glowing-moon-7493.herokuapp.com/questions/651/jira
Git の使い方がよくわからないんですが、どうやって勉強すればいいですか？

# 質問
Git の使い方がよくわからないんですが、どうやって勉強すればいいですか？

# 回答
Mac OS X 限定ですが, SourceTree というアプリを使うと GUI から色々操作できたり, リビジョンツリーが見れたりします. これを使ってローカルレポジトリに対して実行した git コマンドの効果を見る, というのも勉強になると思います.


Git Immersion というサイトで勉強するといいです。英語ですが、特に問題ないと思います。 http://gitimmersion.com/

本を探しているのであれば、「入門Git」がオススメです。 http://www.amazon.co.jp/%E5%85%A5%E9%96%80Git-%E6%BF%B1%E9%87%8E-%E7%B4%94-Junio-Hamano/dp/4798023809


# 注意
この投稿は、Hadoop Hackathon in Tokyo の QA サイト閉鎖に伴う移行作業により作成されたものです。
移行元URL: http://glowing-moon-7493.herokuapp.com/questions/331/git
Hadoop の配布用のビルドを行うにはどうしたら良いのでしょうか?

# 質問

チケットに上がっている問題を修正したのですが, ロギングに関係する修正のため, 単体テストではなくシステムテストをしなくてはなりません. どうやって配布用の .tar.gz ファイルをビルドしたらよいでしょうか?

# 回答

ルートディレクトリに移動して
```
mvn clean package -P dist -Dtar
```

というコマンドを打ってください.

```
hadoop-dist/target/hadoop-3.0.0-SNAPSHOT.tar.gz
```

というファイルができているはずで, それが配布用の .tar.gz ファイルです.

テストをスキップする場合には ``-DskipTests`` を追加します。

コンパイル時の文字化けを回避するには ``export _JAVA_OPTIONS="-Dfile.encoding=UTF-8"`` を設定しておきます。

参考:http://qiita.com/items/eaddded41174a2bc79fa

javadoc の作成をスキップするには ``-Dmaven.javadoc.skip=true`` を追加します。

# 注意
この投稿は、Hadoop Hackathon in Tokyo の QA サイト閉鎖に伴う移行作業により作成されたものです。
移行元URL: http://glowing-moon-7493.herokuapp.com/questions/31/hadoop
maven のコンパイルエラー時に文字化けさせない方法

# 質問

maven でコンパイルするときにエラーメッセージが文字化けするのですが、どうすれば解決できますか？

多分日本語が入り交じっていると思うので、(1) 日本語を表示する方法 (2) 英語を表示させる方法の両方を教えてもらえるとうれしいです。

以下がエラーメッセージです。

[ERROR] /Users/sho/src/apache/hadoop-common/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/MiniDFSCluster.java:[29,0] ?V???{????????܂???B

[ERROR] ?V???{??: static DFS_NAMESERVICE_ID

[ERROR] ?ꏊ : org.apache.hadoop.hdfs.DFSConfigKeys ?? ?N???X

# 回答

[私のブログ記事](http://blog.elliptium.net/2012/04/Mac-OS-X-maven)にポインタだけ書きましたが,
```
export _JAVA_OPTIONS="-Dfile.encoding=UTF-8"
```
としてください.

# 注意
この投稿は、Hadoop Hackathon in Tokyo の QA サイト閉鎖に伴う移行作業により作成されたものです。
移行元URL: http://glowing-moon-7493.herokuapp.com/questions/381/maven
authority gem の Authozier メソッドの優先順位について


基本的には下記のページの "The flow of Authority" に書かれている通り、ApplicationAuthorizer を基底クラスとして継承した下位のクラスから該当するメソッドがあるかどうか判断される
https://github.com/nathanl/authority

しかし、authority gem で拡張される can_xxxx? メソッドには instance を渡せるケースがあり、その場合は上記の判定順とは少し違う順番に該当メソッドがあるかどうか判定される。

具体的には、ドキュメントのページの例で Article クラスそのものではなく Article.first などのインスタンスを渡した場合、下記のような順番でメソッドが探索される

```
current_user.can_create?(Article.first)
                           +
                           |
                           v
Article#creatable_by?(current_user)
                           +
                           |
                           v
AdminAuthorizer#creatable_by?(current_user)
                           +
                           |
                           v
ApplicationAuthorizer#creatable_by?(current_user) # 元の図には無いけれど
                           +
                           |
                           v
Article.creatable_by?(current_user)
                           +
                           |
                           v
AdminAuthorizer.creatable_by?(current_user)
                           +
                           |
                           v
AdminAuthorizer.default(:creatable, current_user)
                           +
                           |
                           v
ApplicationAuthorizer.creatable_by?(current_user) # こっちも元の図には無い
```

まとめてみれば、どうということはなく、単純に instance => class メソッドの順に探索されるようである。
が、このルールを把握していなければ、少し直感的ではない判定順になってしまうので、まとめてみました。
(authority に関する情報なさそうだし
Hue の開発をはじめたいのですが、どこから始めればいいでしょうか？

# 質問

Hue の開発をはじめたいのですが、どこから始めればいいでしょうか？

* ソースはどこからダウンロードすればいいんでしょうか？
* コンパイル・ビルドはどのように行えばいいのでしょうか？
* テストはどのように行えばいいのでしょうか？
* レビューはどのように行えばいいのでしょうか？
* パッチの投稿はどのように行えばいいのでしょうか？

# 回答

ここにソースコードと始め方について書いてあります。

https://github.com/cloudera/hue.git

centos5で入れる場合にはopenldap-develを明示的にyum installしないとファイルが不足して引っかかったことがあります。

# 注意

この投稿は、Hadoop Hackathon in Tokyo の QA サイト閉鎖に伴う移行作業により作成されたものです。
移行元URL: http://glowing-moon-7493.herokuapp.com/questions/181/hue
contributor って何ですか? どうやったらなれますか?

# 質問

contributor って言葉は初めて聞いたんですが, これになると何ができるんですか? またどうやったらなれるのでしょうか?

# 回答

オープンソースコミュニティにおける contributor (コントリビュータ) とは「貢献者」という意味で、プロジェクトに何らかの貢献をしてくれた人のことを指します。 Apache Project におけるコントリビュータは、JIRA にパッチを投稿したり wiki を編集するなどする人のことを指します。

ASF JIRA には誰でも質問を投稿する(JIRAを作る)ことができますが、そのJIRAを自分が担当する(自分にアサインする)にはコントリビュータ権限が必要です。

コントリビュータ権限を得る方法は、ASF JIRA の管理者から付与してもらう以外に方法はありません。 管理者は大抵の場合プロジェクトのPMCのメンバーです。

彼らにコントリビュータ権限をもらう方法はいくつかあります。

自分がパッチを書きたい JIRA にとりあえずパッチを投げてしまい、「パッチを書きました。コントリビュータ権限をください」と依頼する
開発用メーリングリスト (hdfs-dev@hadoop.apache.org など) でコントリビュータ権限の付与を依頼する
管理者を個人的に知っている場合、直接依頼する(大抵の場合会社の同僚など限定)
コミュニティの wiki などでは 2 を推奨していますが、コミュニティの信頼を得る意味でも 1 の形式で行うことを推奨します。

# 注意

この投稿は、Hadoop Hackathon in Tokyo の QA サイト閉鎖に伴う移行作業により作成されたものです。
移行元URL: http://glowing-moon-7493.herokuapp.com/questions/51/contributor
Hadoop の開発に関わるにはどうしたら良いでしょうか?

# 質問
初心者です.

まだ何もしてないのですがどうやって Hadoop の開発に貢献したら良いのでしょうか?
チケットとかどうやって見付けたら良いでしょうか?


# 回答

Hadoop の開発の流れは、大まかに以下のようになっています。

ASF JIRA の、Hadoop 関連プロジェクトのチケットから開発したいJIRAを見つける
trunk のソースコードを DL する
開発する
パッチを投稿する
レビューを受ける
レビューが通ればJenkinsにパッチが送信され、Jenkins上のテストもクリアすればコミッターがtrunkにコミットする
1つ1つ簡単に説明していきます。

ASF JIRA の、Hadoop 関連プロジェクトのチケットから開発したいJIRAを見つける
ASF JIRA にユーザ登録し、JIRA のチケット(チケットのことを単に「JIRA」という場合が多いです)を探します。

検索ページ から 「Hadoop Common」「Hadoop HDFS」「Hadoop MapReduce」の3つのプロジェクトを選択し(シフト押しながら複数選択することができます)、自分の興味のあるキーワードで検索をかけてみてください。

status が "open" になっているチケットは、まだ解決していないチケットです。さらに Assingee が Unassigned となっている場合、まだ誰も手をつけていないチケットです。まずはこうしたチケットを狙ってみましょう。

trunk のソースコードを DL する
開発対象が決まりましたら、次は hadoop のソースコードをダウンロードします。

SVN のリポジトリをチェックアウトしてもいいですが、今は github にプロジェクトがありますのでそちらをクローンするのが楽でしょう。

この github プロジェクト を git clone してください。

$ git clone https://github.com/apache/hadoop-common.git

hadoop ではなく hadoop-common であることに注意してください。

(以下書きかけ)

# 注意

この投稿は、Hadoop Hackathon in Tokyo の QA サイト閉鎖に伴う移行作業により作成されたものです。
移行元URL: http://glowing-moon-7493.herokuapp.com/questions/21/hadoop
MapReduce のテストで利用する jar ファイルを一時的に切り替える方法

# 質問

現在投稿中の mapreduce-client-core への[パッチ](https://issues.apache.org/jira/browse/MAPREDUCE-2338)が， mapreduce-client-jobclient のテストに依存してしまっています(詳細は[こちら](https://issues.apache.org/jira/browse/MAPREDUCE-4253))．

そこで，一時的に自分で作成した mapreduce-client-core の jar を mapreduce-client-jobclient のテストに使いたいのですが，どうしたら回避できるでしょうか．また，こういった技術的な質問をする場所として，この場所はふさわしいでしょうか．もしくは，ML の方が良いでしょうか．

# 回答

前半についてのみ回答します。 MAPREDUCE-4253 (テスト依存のチケット)を解決せずにMAPREDUCE-2338を解決するのが無理なのであれば、MAPREDUCE-2338 のページで「More Action」-> 「Link」を選び、blocked by を選択して MAPREDUCE-4253 を登録してください。 その上でまず、MAPREDUCE-4253 を解決し、それから MAPREDUCE-2338 を解決するという形をとります。

自作のjarでテストしても、結局 Jenkins の側で統合テストして弾くので、残念ながらコミットはできません。

ASF Hadoop における開発は常に trunk のコードが最優先されます。

# 注意
この投稿は、Hadoop Hackathon in Tokyo の QA サイト閉鎖に伴う移行作業により作成されたものです。
移行元URL: http://glowing-moon-7493.herokuapp.com/questions/61/mapreduce-jar
シェルスクリプトの実行・管理が楽になるRerunの紹介


普段使っているシェルスクリプトの数が増えてきて、うまく管理できるツール無いかなーと思っていたところに[Rerun](http://rerun.github.io/rerun/)というのを見つけたので紹介してみます。

#Rerunって？
[Rerun by rerun](http://rerun.github.io/rerun/)

> Rerun is a simple command runner that turns loose shell scripts into modular automation.

rerunは複数のスクリプトを**モジュール**として取りまとめ、スクリプトの管理と呼び出しをサポートしてくれるツールです。

実際に導入しながらどんなものか見ていきます。

#インストール
[Installation · rerun/rerun Wiki](https://github.com/rerun/rerun/wiki/Installation) を参考に。

```
$ git clone git://github.com/rerun/rerun.git
$ cd rerun
```

# モジュール・コマンド作成
まずはモジュールを作ってみます。rerunにはstubbsというモジュール作成の為のモジュールが入っているので、これを使います。

```
$ ./rerun stubbs:add-module --description "sample local module" --module "local"
$ ./rerun
Available modules in "/Users/horimislime/Desktop/software/rerun/modules":
  local: "sample local module" - 1.0.0
  stubbs: "Simple rerun module builder" - 1.0.2
```

試しにstubbsのadd-moduleコマンドで、ローカル作業に関するスクリプトをひとまとめにする"local"モジュールを作成しました。rerunを引数なしで実行すると、使用できるモジュール一覧が確認できます。

次にモジュールへ**コマンド**を追加してみます。コマンドとはモジュール内で管理するシェルスクリプトとそのメタデータをひとまとめにしたモノで、さっきと同じくstubbsで作成します。

```
$ ./rerun stubbs:add-command --module local --command hello --description "Hello world comamnd"
$ ./rerun local 
Available commands in module, "/Users/horimislime/Desktop/software/rerun/modules/local":
hello: "Hello world comamnd"
```

これでrerunディレクトリ下に modules/local/commands/hello/ が作成されます。helloディレクトリ下には実行するスクリプトのひな形である**script**と、作成時に指定したdescription等の情報が入った　**metadata**ファイルが出来上がっています。

scriptにはひな形で色々書かれていますが、ひとまず無視して最下部の方に処理を追加します。

```sh:script
# Command implementation
# ----------------------

# - - -
# Put the command implementation here.
# - - -

echo 'Hello rerun command!'

# Done. Exit with last command exit status.
exit $?
```


#実行
作成したスクリプトを呼び出してみます。

```
$ ./rerun local:hello
Hello rerun command!
```
こんな感じです。扱っているスクリプトが増えれば増えるほど、rerunのモジュールを使ったグループ化が役に立ちそうです。あとモジュールやコマンド毎に概要やバージョン番号のメタデータを付けられるのもいいですね。仮に作ったコマンドを忘れてしまっても、 rerun [モジュール名] でコマンド一覧といっしょにその概要も見ることができます。

以上がrerunの基本的な機能ですが、他にも[モジュールをアーカイブ化](https://github.com/rerun/rerun/blob/master/README.md#command-execution)して配布可能にできたり、まだまだ便利な使い方がありそうです。 [rerun-modules](https://github.com/rerun-modules) にはモジュールがいくつか公開されているので、コマンドの拡張方法とかはこっちを参考にすると良さそうです。
Go言語の初期化順

Goの初期化順を調べたのでメモ
[Effective Go](http://go.shibu.jp/effective_go.html)に書いてるけど一応確認の意味を込めて

```go:main.go
package main

import "echo"

var _ = echo.Echo("main.var")

func init() {
	echo.Echo("main.init")
}

func main() {
	echo.Echo("main.main")
}
```

```go:echo.go
package echo

import "fmt"

var _ = Echo("echo.var")

func init() {
	Echo("echo.init")
}

func Echo(s string) string {
	fmt.Println(s)
	return s
}
```
だと

```
$ go run main.go
echo.var
echo.init
main.var
main.init
main.main
```
になるので
まああたり前だけど[Effective Go](http://go.shibu.jp/effective_go.html)に書いてる通りだった
LGTMがもっとこうだったらいいのに 2013年4月版

LGTMって時間が経つとだんだん重みが減るものだと思うのですよ。だから一ヶ月なり四半期なり一年なりたったあとにまた何かの折に見て価値があるのであればLTGMしなおしたい。

さらに、ある記事がLGTMされた時期も知りたいです。

Qiitaというよりソーシャルブックマークサービスに求める機能かもしれないですが。
RubyでIRCにメッセージを書き込む

* Rubyでgemを用いてIRCにメッセージを書き込む方法をメモする

## 各gemによるサンプルコード

* [net-irc](https://github.com/cho45/net-irc)(0.0.9)
 * botとして書き込み

```ruby:net-irc-test.rb
gem 'net-irc'
gem 'kronparser'
require 'kronparser'
require 'net/irc'

class TestBot < Net::IRC::Client
  attr_accessor :target_channels

  def initialize(*args)
    @target_channels = []
    super(*args)
  end 

  def on_rpl_welcome(m)
    @target_channels.each do |channel|
      post(JOIN, channel)
    end 
  end 

  def talk(msgs, channels = @target_channels)
    channels.each do |channel|
      if msgs.class == Array
        msgs.each do |msg| post(PRIVMSG, channel, msg) end 
      else
        post(PRIVMSG, channel, msgs)
      end 
    end 
  end 
end

irc = TestBot.new("SERVER",
                  PORT,
                  :nick => "NICK",
                  :user => "USER",
                  :real => "REAL")
irc.target_channels = "#CHANNEL"

KronParser::SimpleProcess.every("40 17 * * 1-5") do
  irc.talk("test")
end

irc.start
```

* [carrier-pigeon](https://github.com/portertech/carrier-pigeon)(0.6.0)
 * 1行メッセージ書き込みで簡単に使えそう(cronやjenkinsなどでの通知に良いかも)

```ruby:carrier-pigeon-test.rb
gem "carrier-pigeon"
require "carrier-pigeon"

CarrierPigeon.send(
  :uri => "irc://USER@SERVER:PORT/#CHANNEL",
  :message => "cooooo, coo coo\ncoo",
  :join => true
)
```
 * 2行以上の書き込みもできた

````ruby:carrier-pigeon-test.rb
gem "carrier-pigeon"
require 'carrier-pigeon'

pigeon = CarrierPigeon.new(:host => "SERVER",
                           :port => PORT,
                           :nick => "USER",
                           :channel => "#CHANNEL",
                           :join => true)
pigeon.message("#CHANNEL", "test")
pigeon.message("#CHANNEL", "hoge")
pigeon.die
```

* [irc-socket](https://github.com/injekt/irc-socket)(1.0.1)
 * 2行以上のメッセージ書き込みする場合はこれでもいける(cronやjenkinsなどでの通知に良いかも)

```ruby:irc-socket-test.rb
gem "irc-socket"
require 'irc-socket'

irc = IRCSocket.new("SERVER", PORT)
irc.connect
if irc.connected?
  irc.nick "USER"
  irc.user "USER", 0, "*", "test"

  while line = irc.read
    # Join a channel after MOTD
    if line.split[1] == '376'
      irc.join "#CHANNEL"
      irc.privmsg "#CHANNEL", "hogehoge"
      irc.privmsg "#CHANNEL", "hogehoge"
      irc.part "#CHANNEL"
      break
    end
  end
end
```
VisualforceのS3連携


# 状況
* デフォルトサンプルだと連携に失敗する。
  * （デフォルトのサンプルは、AppExchange（非公開）をインストールすると入っている）
  *  https://ap.salesforce.com/packaging/installPackage.apexp?p0=04t30000000OjsZ

# TODO
連携のためにこれからデバッグする。

# やったこと
* Amazon_toolkitのインストール
* AWS Credentialの設定
* リージョンの書き換え（https://s3.ap-northeast-1.amazonaws.com）

# ミス発見
* s3.ap-northeast-1 -> s3-ap-northeast-1

# 原因わかった
* リージョンを tokyo から US Standard にしたらうまくいった。

# 参考
* http://wiki.developerforce.com/page/Amazon_Toolkit
* http://blog.flect.co.jp/salesforce/2010/09/forcecomamazon-.html
bowerべんりっぽい


噂には聞いてたけど。1度ひととおりの機能確認してみた。
クライアントサイドのライブラリをインストール・管理できるツール。

- [BOWER: A package manager for the web](http://twitter.github.io/bower/)

## install

```
npm -g install bower 
```


## jqueryをインストール
```
bower install jquery
```

componentsディレクトリができて、jqueryが入ってる。
名前には出てないけど最新版が来てる(っぽい)。

ちなみにjquery公式ではなく、
https://github.com/components/jquery からとってくる。
bowerにcomponentとして登録されているものをインストールという形。

## jqueryをインストールして、覚えておく
```
bower install jquery --save
```
component.jsonができて、jqueryをdependenciesとして覚えててくれる。

```json:sample-project/component.json
{
  "name": "sample-project",
  "version": "0.0.0",
  "dependencies": {
    "jquery": "~1.9.1"
  }
}
```

ちなみに--save-devもある。

覚えておいたdependenciesは、引数なしで```bower install```すると、
勝手に全部インストールしてくれる。

これによってたとえば、ライブラリはgitのレポジトリに含めず、
component.jsonだけ入れておき、インストール時に```bower install```という使い方ができる。

## カスタマイズ

インストール先のディレクトリは、デフォルトではcomponents。
でもこの名前はちょっと使いづらい! って気もするので
変えたい。

.bowerrcをつくって、directoryを記述すると変更できる。

```json:sample-project/.bowerrc
{
  directory: "js/lib"
}
```

こんな感じのをすぐ打てるようにしとくとよさそう。
(本当はbowerのサブコマンドで.bowerrcを編集できるようにしてほしいけど。。。)

```
echo '{ "directory": "js/lib" }' > .bowerrc
```

## まとめ
思った以上にnpmと同じ使い方ができるので素敵。
覚えるコストもほぼなさそう。

bower componentを公開するのも今度やりたい。
たぶんすぐできそう。
Modern Objective-Cでのシンプルなプロパティ記述方式

今月からようやくModern Objective-Cに着手(かなり今さらだけど・・)
記述がかなりシンプルだとは聞いていて、情報もたくさん挙がっていたのだけど、困惑したのでメモ。メンバー変数とか@synthesizeとか宣言不要でコードがスッキリして嬉しい。基本的には@propertyだけ宣言すれば良いみたい。また@properyもいままでヘッダファイルでのみ宣言していたけど、プライベートなものは実装ファイルの無名カテゴリ内に宣言すればよいみたい(パブリックプロパティは従来通りヘッダファイルに記述)。以下、プライベートプロパティを宣言する時の例。

![modern-objective-c-property.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18841/af682b2c-9c8d-761c-84ae-7ed0a2ddb7b8.png)


一応、メンバー変数とか本当に定義されているのか確認。

![modern-objective-c-property-check.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18841/d9511533-cdfe-dcce-f142-993853074952.jpeg)


もう"Legacy" Objective-Cでは書けないな。

### 参考サイト

参考にさせていただいたサイトです。

* [Objective-Cプログラミング言語 - プロパティの宣と実装](https://developer.apple.com/jp/devcenter/ios/library/documentation/ObjC.pdf) by Apple

> 歴史的には、インターフェイスにはクラスのインスタンス変数宣言が必要でした。（中略）インスタンス変数は実装詳細であり、通常、クラス自身の外からアクセスされることはありません。さらに、実装ブロック内に宣言すること、あるいは宣言済みプロパティから自動生成させることも可能です。したがって通常は、インスタンス変数宣言をパブリックインターフェイスで行うべきではないので、波括弧も省略してください。

公式ドキュメントです。いままでインターフェイスで宣言してました。公式で実装ブロック内での宣言やプロパティでの自動生成でも可能で、括弧も省略してよいみたい。

* [Xcode4.4 Modern Objective-C Syntaxでコードをきれいにする方法](http://www.zero4racer.com/blog/798) by Zero4Racer (2012/7/25)

> コンパイラが@synthesizeを補完してくれる様になったため、基本的な状況では、@synthesizeを書かなくてよくなりました。また、synthesizeされる相手>のivarも、同名の変数ではなくて、アンダーバーを最初に付けた物がデフォルトとなります。これまで議論されて来たことがappleのコンパイラによって、これ>からは定義されているため、安心ですね。ちなみに、これは以前からですが、(strong)というのも，デフォルトがstrongなので、書かなくてよくなりました。

* [プロパティに対応するインスタンス変数の命名規則について](http://www.awaresoft.jp/ios-dev/item/115-ivar-naming-convention.html) by Awaresoft (2012/3/18)

>1.プロパティに対応するインスタンス変数はヘッダファイルで宣言する必要はまずない。(iOSのバージョンに関係なく）
> 2.プロパティに対応するインスタンス変数はsynthesizeで常に別名をつけるべき。
> 3.インスタンス変数名はプロパティ名の前に_をつけたものにする。
> 4.インスタンス変数にアクセスするときは、クラス内からでも常にアクセッサメソッドを通して行うようにする。（setter/getter内やinit, dealloc以外）

参照 : [Modern Objective-Cでのプロパティ記述](http://b.ruyaka.com/wp-content/uploads/2013/11/modern-objective-c-property-check1.jpg)

追記1 :  文章の補足と参考サイトを追加しました。
今日作りたくなる簡単cookbook [Kim'sキッチン] devtools(yum groupinstall )


以下全ても●みち風に書いたメモ

皆さんおはようございます。
[ryurock@github](http://qiita.com/users/ryurock@github)です。

```shell:フガポン(24歳)

opscode http://docs.opscode.com/resource_yum.html
のyum_packageの項目にgroupinsallが書いてありませんでした。
どうやったらgroupinstallできますか？

```

# **俺が知りたい**

## レシピ作成時間
約3分

## 環境
* mac-osx（ホストOS）
* centos6.4-x86-minimal (ゲストOS)

## 事前準備に必要なもの
* virtualbox
* ruby 1.9.3p327 (rbenv) ※1.9.3-p286でもいけた
* chef ※入れていない方は```gem install chef```とshellから打ってください
* vagrant ※入れていない方は[chef-soloで使用するvirtualbox(vagrant)をveeweeを使用して作る](http://qiita.com/items/3cb756a9c951371a4089)を参考に入れておいてください
* git
* knife-soloのセットアップ ※やっていない方は[今日作りたくなる簡単cookbook [Kim'sキッチン] yumsetup(yum-fastestmirrorにyum update添え)](http://qiita.com/items/c99215e25bd2ff846207)の前準備を参考にしてやっておいてください。

## 参考にしたサイト（書籍）
* [入門ChefSolo-InfrastructureasCode-1.0.0](http://tatsu-zine.com/books/chef-solo)(達人出版)
* [yum_package](http://docs.opscode.com/resource_yum.html)


## [その１] レシピ名を決める

今回のレシピ名はdevtoolsで行きましょう

```shell
cd chef-repo
knife cookbook create devtools -o site-cookbooks
```

## [その2] chef-repo/devtools/recipes/default.rbを編集

```ruby:chef-repo/yumsetup/recipes/default.rb
execute "devtools" do
  user "root"
  command 'yum -y groupinstall "Development Tools"'
  action :run
end
```

ruby知らなくてもわかる内容ですね。

[Chef Resources](http://docs.opscode.com/resource.html)を使用した

* [execute](http://docs.opscode.com/resource_execute.html)

で実行します。

## [その3]yumsetup cookbookをリモート側で実行する設定を追加

```shell
vim chef-repo/nodes/{接続名称（任意）}.json

{"run_list":[
    "devtools"
]}
```

run_listをすでに記載している場合は追記でお願いします。

## [その4] リモート側に実行依頼をする

```shell
cd chef-repo
knife solo cook {接続名称（任意）}


Starting Chef Client, version 11.4.0
Compiling Cookbooks...
Converging 3 resources
Recipe: devtools::default
  * execute[devtools] action run
    - execute yum -y groupinstall "Development Tools"
```

## 今日はこれで決まり「devtools」の完成です

ちなみにcommand以外でも

```ruby:chef-repo/devtools/recipes/default.rb
bash "devtools" do
  user "root"
  code <<-EOH
  yum -y groupinstall "Development Tools"
  EOH
end
```

でも行けます。けどきっと[resource -script-](http://docs.opscode.com/resource_script.html)はもう少し複雑な処理（分岐とか、インストール以外）の場合に用いるものだと思います。
1つのgitリポジトリに複数の作業ディレクトリを作る


（commit or stash + checkoutすらめんどいことだって、あるんですよ・・）

## そもそもリポジトリと作業ディレクトリの違いって？

gitリポジトリには、コミットされている内容やブランチなどの全ての情報がつまっています。一方で作業ディレクトリは、リポジトリ内のあるcommitの内容を、ファイルとして書き出したものになっています。

## git-new-workdirコマンド

gitリポジトリに紐づく新たな作業ディレクトリを作成します。

	git-new-workdir <repository> <new_workdir> [<branch>]

ただし、デフォルトでPATHが通っていません。Fedoraあたりなら /usr/share/doc/git-1.7.10.2/contrib/workdir/git-new-workdir に、homebrewなら /usr/local/Cellar/git/1.7.12.4/share/git-core/contrib/workdir/git-new-workdir あたりに入っているかと思われます（バージョンは適宜読み替えてください）。その他gitがインストールされている環境であれば、locateや/usr以下へのfind -nameで見つけられると思います。

## それってgitリポジトリをコピペするのと何が違うの？

* **branchの状態**が共有されます。すなわち、ある作業ディレクトリでcommitをすると、他の作業ディレクトリからも参照できます。
* **git pullやgit fetch、git remote update**などで取得した情報は共有されます。
* **ブランチ固有のconfig（.git/config）**が共有されます。
* （hookなども共有されると思います。）

## 作業ディレクトリがいくつもあって何がうれしいの？

* 別々のbranchを同時にcheckoutして、動作の比較を行ったりできます。
* 急なバグ対応が入ったりした時に、面倒なcommitやstashをせずに、すぐに作業を切り替えることができます。
* （個人的に）作業状態のまま放置できるので、どの作業をしていたのか忘れずに済みます。

## 注意したい点

* index/staging領域（git addすると追加されるところ）は共有されません
	* すなわち、ある作業ディレクトリからgit addしただけの差分は、他の作業ディレクトリから参照できません
* ある作業ディレクトリでcheckoutしているブランチを、**別の作業ディレクトリから更新（commitやreset HEAD~、pullなど）してしまう**と、おかしなことになります。
	* git statusすると、checkoutしていたツリーがgit addされていることがわかります（indexがそのままに、commitだけが変わったため）。
	* **まだgit addしていない**変更内容が巻き添えになったときは、**同じファイルが変更されていない限り**、git reset --mergeするとだいたい元に戻るかと思いますが、保証はありません。
* checkout中のbranchを他の作業ディレクトリから消してしまうと、その作業ディレクトリではcheckoutすらできなくなってしまいます。
	* git reset --hard \<どこか\> としてブランチを再度初期化し、改めてブランチを消してください
* シンボリックリンクを使っているので、repositoryとしてgit-new-workdirで作成したディレクトリを渡すと、symlinkに対するsymlinkが作成されておかしくなるかもしれません。

※使っていない作業ディレクトリのファイル容量が気になる時は、ファイルをすべてgit rmしたparking branchを作成して、checkoutしておくとよさそうです。
※作業ディレクトリ数に制限はありません。

## 参考

http://subtech.g.hatena.ne.jp/secondlife/20121207/1354854068

Qiitaのこの記事でも取り上げられていました。
http://qiita.com/items/2a19f5dca568329f8f8e
今日作りたくなる簡単cookbook [Kim'sキッチン] yumsetup(yum-fastestmirrorにyum update添え)


以下全ても●みち風に書いたメモ

皆さんおはようございます。
[ryurock@github](http://qiita.com/users/ryurock@github)です。

```メザポン(32歳)

私は毎回サーバーを立ち上げた後に行うyum-fastestmirrorと
時間がかかるyum -y updateが大好きです。
そこでyum-fastestmirrorとyum -y update の簡単なcookbookを教えてください。

```

今日はそんなyumが大好きな方に簡単なcookbookをknife-soloでご紹介したいと思います。

## レシピ作成時間
約3分

## 環境
* mac-osx（ホストOS）
* centos6.4-x86-minimal (ゲストOS)

## 事前準備に必要なもの
* virtualbox
* ruby 1.9.3p327 (rbenv) ※1.9.3-p286でもいけた
* chef ※入れていない方は```gem install chef```とshellから打ってください
* vagrant ※入れていない方は[chef-soloで使用するvirtualbox(vagrant)をveeweeを使用して作る](http://qiita.com/items/3cb756a9c951371a4089)を参考に入れておいてください
* git

## 参考にしたサイト（書籍）
* [入門ChefSolo-InfrastructureasCode-1.0.0](http://tatsu-zine.com/books/chef-solo)(達人出版)
* [Chef Soloの正しい始め方](http://tsuchikazu.net/chef_solo_start/)

## 前準備 - chef solo init - - knife solo prepare -

この２つは最初の一回のみ。すでに実行済みの場合は「その1」の項目へ

### リポジトリを作成する

```shell
knife solo init chef-repo
```

概念的にはgit initと一緒です。
「ここにchefする場所を作るよ！！」と宣言します。

### リモートでの chef-solo 実行環境を整える

要はsshの設定です。
vagrantで設定している場合はホストOS(mac)で下記のように

```shell
cd VagrantFileがおいてあるディレクトリ
vagrant ssh-config --host {接続名称（任意）} >> ~/.ssh/config
```

vagrantのssh設定を登録する

```shell
cd chef-repo
knife solo prepare {接続名称（任意）}
```



## [その１] レシピ名を決める

今回のレシピ名はyumsetupで行きましょう

```shell
cd chef-repo
knife cookbook create yumsetup -o site-cookbooks
```

## [その2] chef-repo/yumsetup/recipes/default.rbを編集

```ruby:chef-repo/yumsetup/recipes/default.rb
yum_package "yum-fastestmirror" do
  action :install
end

execute "yum-update" do
  user "root"
  command "yum -y update"
  action :run
end
```

ruby知らなくてもわかる内容ですね。

[Chef Resources](http://docs.opscode.com/resource.html)を使用した

* [yum_package](http://docs.opscode.com/resource_yum.html)
* [execute](http://docs.opscode.com/resource_execute.html)

上記２つで実行しています。

## [その3]yumsetup cookbookをリモート側で実行する設定を追加

```shell
vim chef-repo/nodes/{接続名称（任意）}.json

{"run_list":[
    "yumsetup"
]}
```

これだけ

## [その4] リモート側に実行依頼をする

```shell
cd chef-repo
knife solo cook {接続名称（任意）}


Starting Chef Client, version 11.4.0
Compiling Cookbooks...
Converging 2 resources
Recipe: yumsetup::default
  * yum_package[yum-fastestmirror] action install (up to date)
  * execute[yum-update] action run
    - execute yum -y update

Chef Client finished, 1 resources updated
```

2つ命令を書いているが１つしか実行されないのはyum-fastestmirrorがすでにインストール済みであるからです。（chefは冪等性を保証さするものって[入門ChefSolo-InfrastructureasCode-1.0.0](http://tatsu-zine.com/books/chef-solo)に書いてありました）

## 今日はこれで決まり「yum-fastestmirrorにyum update添え」の完成です

たった４ステップ、書いた行数は１５行未満で出来上がりです。
chef-soloはそんなに敷居が高く無いので是非ご参考に
nilとNSNullの違いとNSNullをnilのように振る舞うようにする


## nilとNSNullの違い
プログラミング言語でnullは基本的には値がないことや変数が初期化されていないということを表す。

Objective-Cではnilはポインタが何も実体を指していないことを表現し、変数がnilのときオブジェクトを持っていない状態となる。


ただ、NSDictionaryやNSArrayはnilを格納することが出来ず、
空を格納していることを表現するためにNSNullを使う。

nilとNSNullの大きな違いとして、値がnilである変数に対してメッセージを送った場合はnilを返す。[nilは(id)0として定義されている](http://www.libjingu.jp/trans/clocFAQ-j.html#objects-nil)。これに対し、オブジェクトがNSNullの場合、NSNullオブジェクトに存在しないメッセージを送るとNSInvalidArgument Exceptionの例外を投げ、これをキャッチしなかった場合はクラッシュしてしまう。

nilへのメッセージの戻り値は次のコードで実験できる。

```
void main()
{
    NSNumber *num = nil; //説明のため明示的に初期化しておく
    NSLog(@"%@", num);                //=> (null)
    NSLog(@"%d", [num integerValue]); //=> 0
    NSLog(@"%d", [num boolValue]);    //=> 0
}
```

参考: Appleの"Objective-Cによるプログラミング"
https://developer.apple.com/jp/devcenter/ios/library/documentation/ProgrammingWithObjectiveC.pdf 
## NSNullを使うことになる具体例

具体例を上げると、
例えばqiitaの[新規投稿一覧API](https://qiita.com/api/v1/items?page=2&per_page=30)を呼び出した際、gistのURLがない投稿は下記のようになっている。

```
"gist_url":null,
````

先述のようにNSJSONSerializationでこれをパースするとNSDictionaryにはNSNullが格納される。

ちなみにNSLogなどで出力すると下記のようになる。

```
"gist_url" = "<null>";
```

APIの設計指針によると思うが、
例えばgist_urlのデータが存在しないようなデータの場合には、JSONにgist_urlの項目自体含めなければ、NSDictionaryでアクセスしてもその存在がないのでnilとして扱うことが出来る。
もし新規にAPIを設計する場合にはデータがない場合には項目自体を含めないことを検討するのもよいかもしれない。

## NSNullのメソッド呼び出し時の振る舞いの変更について

NSNullのオブジェクトにメソッドを呼びだそうとした場合にnilと同じように無視する方法は下記のサイトの記事にあるようにやるのが良い。

「NSNull のインスタンスは nil として振舞ってくれると嬉しいなって」
http://d.hatena.ne.jp/KishikawaKatsumi/20110505/1304598102

記事中では下記2つのメソッドをNSNullのカテゴリとして実装している。

- (NSMethodSignature*)methodSignature:(SEL)selector;
- (void)forwardInvocation:(NSInvocation*)invocation; 

```
@implementation NSNull(IgnoreMessages)

- (void)forwardInvocation:(NSInvocation *)anInvocation {
    if ([self respondsToSelector:[anInvocation selector]]) {
        [anInvocation invokeWithTarget:self];
    }
}

- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector {
    NSMethodSignature *sig=[[NSNull class] instanceMethodSignatureForSelector:aSelector];
    // Just return some meaningless signature
    if (sig == nil) {
        sig = [NSMethodSignature signatureWithObjCTypes:"@^v^c"];
    }
    
    return sig;
}

@end
```

### どういう仕組なのか？

これら処理の内容について詳しくは下記のコラムが参考になる

「ダイナミックObjective-C AspectCocoa (3) - フォワーディングとポージングの利用」
http://news.mynavi.jp/column/objc/045/index.html

NSNullがnilのようにメソッドを無視するためのフォワーディングは、そもそも他のオブジェクトに処理を頼む仕組みの様子。

forwardInvocation:では実際にメソッドを呼び出すターゲットを指定している。nullメソッドはrespondsToSelector:がYESを返す場合のみNSNullオブジェクト自身をターゲットとし、それ以外のメソッドの場合は何もしない。

methodSignature:はメソッドシグネチャのインスタンス化を行おうとし、それがnilの場合には文字列からダミーのシグネチャのインスタンスを返すようにしている様子。

signatureWithObjCTypes:の引数"@^v^c"の意味ははっきり分からないが、デバッガでanInvocationの値を出力すると次のようになった

```
return value: {@} 0x0
target: {^v} <78f67c01>
argument 1: {^c} 0x34d70a5
```

つまり戻り値、ターゲット、引数をシグネチャで適当に指定しているということだろうか？

Apple公式のリファレンスを参考にすると@と^v, ^cがなんとなくわかる
「Type Encodings」
http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjCRuntimeGuide/Articles/ocrtTypeEncodings.html
iOSプッシュ通知について

●証明書１つめ
1.iOS provisioning Center→APPIdsにいく
2.自分のアプリをクリック
3.キーチェーンで「キーチェーンアクセス」→証明書アシスタント→認証局に証明書を要求
4.【重要】上と下にiOS Dev Centerで登録しているメアドを登録→リクエストを作る
5.iOS DevCenter上でCreate→さっきのリクエストを選択→ダウンロード
6.キーチェーンに「システム」で入れる
7.鍵を開いて自分の名前が出てきたら右クリックして書き出し（p12で）
8.sample.p12を作ったとしたらopenssl pkcs12 -in sample.p12 -out sample.pem -nodes -clcerts  でsample.pemを作る
9.サーバー上にアップロードで終了

●証明書２つめ
1.以下のURLからダウンロード
sandbox（開発環境用）
https://www.entrust.net/downloads/binary/entrust_2048_ca.cer
本番用
https://www.entrust.net/downloads/binary/entrust_ssl_ca.cer
2.キーチェーンアクセスを起動して、左上のメニューは”システムルート”を左下は証明書を選んでダウンロードした証明書をダブルクリック
3.Entrust Root Certification Authorityを選んで書きだす。.pemで作成する。
（entrust.pemとして保存）

●APNsPHP（PHPでプッシュ通知が送れるというもの）
サンプルの一部を変更
$push = new ApnsPHP_Push(
	ApnsPHP_Abstract::ENVIRONMENT_PRODUCTION,  //※
	'sample.pem'   //１つめの証明書
);

※本番用はENVIRONMENT_PRODUCTION、開発用はENVIRONMENT_SANDBOXとする

$push->setRootCertificationAuthority('entrust.pem');  //2つめの証明書

$push->setProviderCertificatePassphrase('password');   //pemをつくるときに指定したパスワード

$message = new ApnsPHP_Message("xxxxxx"); //デバイストークンを指定


●基本的な流れ
iPhoneからデバイストークンを取得→自分のサーバーに保存→phpを実行（アクセス）してプッシュ

●注意点
・Certificateを登録しているPCでやらなければいけない
・開発用、本番用で２つ必要（違うとエラーになる）
【まとめ】『実践ドメイン駆動設計』: 7. サービス


[![](http://ecx.images-amazon.com/images/I/51p16XLhuiL._SS500_.jpg)](http://amzn.to/YmRhoC)

## Serviceとは?

* ドメイン固有のタスクを果たす状態を持たない操作
* [ユビキタス言語]に従っている
* ある操作が、AggregateやValue Objectのメソッドではないと感じられるなら、それをServiceとして作るといい

## Domain Serviceじゃないもの

* [サービス指向アーキテクチャ]
* [メッセージ指向ミドルウェア]
* Application Service(これはDomain Serviceのクライアントになる)
* 粒度が大きいもの (coarse-graind)
* リモート実行可能なもの (remote-capable)
* 重量級のもの (heavyweight)
* トランザクション操作を持つもの (transactional operation)


## Domain Serviceであるもの

ドメイン上の重要な処理や変形操作。
すでにあるEntityやValue Objectに収まらない操作。

* 重要なビジネス上の処理を行うもの
* ドメインオブジェクトを他のドメインオブジェクトに変形するもの
* 2つ以上のドメインオブジェクトを入力に受け取って値(Value)を計算するもの

## Domain Serviceの過剰使用

Domain Serviceの過剰使用はドメインモデル欠乏症([Anemic Domain Model])になる。

なぜサービスが必要なのかをよく考えること: 
「このふるまいは単純にEntityに置けないか?」

もし理由が

* それがEntityの単一責務([Single Responsibility])に違反するから
* クライアントが複雑になるから
* ドメイン固有の知識がクライアントに流出するから

等なら、答えは「Serviceを作るべき」。

Entityにあるstatic methodはServiceになるフラグ。

## Service実装のいろは

* Serviceは[Separated Interface]にするといい
* インターフェイスはDomain Layerの中に定義する
* そしてたったひとつの操作を持つようにする
* 技術的な実装はInfrastructure Layerの中に作るといいかもしれない
* 実装クラス名前はその実装の特性を表現したものにする(単に-ImplやDefault-ではなく)
* 実装は[ユビキタス言語]を明示的(explicit)に表現する!

## Separated Interfaceにすべきとき、そうでもないとき

### すべきとき

* Serviceに複数の実装がある(ポリモーフィックになっている)
* 技術的な実装がある(暗号化技術やInfrastructure LayerのRepositoryに依存するなど)
* Serviceのインスタンス化の方法を隠蔽したいとき

### そうでもないとき

Separated Interfaceはいつも必要というわけではない。普通にクラスをDomain Layerに作るだけで十分なときもある。

* Serviceのポリモーフィックが不要なとき
* ドメイン固有の操作しか含まない場合
* Dependency InjectionやService FactoryがServiceのインスタンス化の方法を隠蔽しているとき。

もし実装クラスが、インターフェイス名に-ImplやDefault-のような接辞をつけているだけなら、それはSeparated Interfaceが不要という合図。

## サービスをテストする

Serviceをどう使うかデモンストレーションになるような、模範的なテストを提供すること。

[ユビキタス言語]: http://martinfowler.com/bliki/UbiquitousLanguage.html
[サービス指向アーキテクチャ]: http://ja.wikipedia.org/wiki/%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E6%8C%87%E5%90%91%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%81%E3%83%A3
[メッセージ指向ミドルウェア]: http://ja.wikipedia.org/wiki/%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E6%8C%87%E5%90%91%E3%83%9F%E3%83%89%E3%83%AB%E3%82%A6%E3%82%A7%E3%82%A2
[Anemic Domain Model]: http://www.martinfowler.com/bliki/AnemicDomainModel.html
[Single Responsibility]: http://en.wikipedia.org/wiki/Single_responsibility_principle
[Separated Interface]: http://martinfowler.com/eaaCatalog/separatedInterface.html