OmniAICreator/Qiita-1.07M huggingface dataset:
定例会が楽しみになる！Portfolio for JIRAでアジャイル計画を自動生成する方法

# アジャイルでも「いつ、なにが」を伝える義務がある

いくらアジャイルと言えども仕事として回している限りは、「いつ、何ができるのか」は上司なりに報告しているはずですよね。

そんな時、「プロダクトバックログを見せるだけで納得してくれたら楽なのに」と、きっと思うはず。でもそうは問屋が卸しません。「ちゃんと作れ」で終わるはず。なぜなら、その上司も上に対して「いつ、何ができる」を報告する必要があるからです。PMOなんて、計画と実績を見ることだけが仕事なので、計画と進捗がないと仕事も始まりません。

そんなとき、サラッとこんな計画が提示できると嬉しいですよね。

![image](https://qiita-image-store.s3.amazonaws.com/0/104131/cfdbe7fc-9af0-f78f-bbaa-96018c3b7d69.png)


Portfolio for JIRAを使うと、リリース計画を自動生成してくれます。JIRA Agile（JIRAボード）は使っているけど、計画書は手で作っている/作らなきゃいけないけどできていないなら、活用しない手はありません。早速手順を紹介しましょう。

# リリース計画を自動化するためのパラメータ

いくら計画を自動生成してくれるとはいえ、Portfolioに必要な情報が設定されている必要があります。画面右上のタブを切り替えながら入力しましょう。

![image](https://qiita-image-store.s3.amazonaws.com/0/104131/7935999c-3304-2878-12ac-eaa4be10636f.png)

* Backlog：Epic/Storyを優先順位順に積んでおきます。ストーリーポイントの設定は必須。既にJIRA Agileを使っている場合、そのStoryを取り込むこともできます。
* People：TeamとMemberを設定します。Velocityの設定は必須。応用編としてSkillを設定することもできます。
* Release：リリース日などのマイルストーンを設定します。内部リリースやベータリリースなど複数設定可能。

Backlogタブを選択した画面です。”どのStoryを、どのReleaseまでに、どのTeamが、どのくらいのコスト(Estimate)で実装する”のかを設定します。

![image](https://qiita-image-store.s3.amazonaws.com/0/104131/3a6f5ad7-8945-ff95-ec03-15f376748a8a.png)

全て設定したら、おもむろにReportsを選択します。
おっとその前に、タブの横に「Recalculate」ボタンが出ているはずなので、ポチッと押してください。

![image](https://qiita-image-store.s3.amazonaws.com/0/104131/291b88f2-9489-6307-5e03-03919bb0836f.png)

そう、何か変更したらこのボタンで「計画を再計算」するのが基本的な使い方です。RecalculateすることでReportタブに「現在の情報から自動生成された計画」が表示されます。

# 目的別のビューでプロジェクトを俯瞰する

Portfolio for JIRAは「今の状況」を設定することで、プロジェクトの今後の見通しを俯瞰するためのツールです。Reportタブにはいろいろな観点のビューが用意されているので、目的に応じて使い分けます。

_最も利用頻度の高い「Schedue/Stories」ビュー_
![image](https://qiita-image-store.s3.amazonaws.com/0/104131/2dfb77b5-4e17-9c7a-cfe5-fb3a06577764.png)

_テーマ毎に取り組む時期を示す「Schedule/Epics」ビュー_
![image](https://qiita-image-store.s3.amazonaws.com/0/104131/fe34573a-8d6c-d77c-063e-109dcd4f3153.png)

_チーム毎の見込み稼働率を示す「Schedule/Capacity」ビュー_
![image](https://qiita-image-store.s3.amazonaws.com/0/104131/7bb65079-b99e-b717-da12-fa8eb5effb73.png)

_テーマ毎の作業量の割合を示す「Themes」ビュー_
![image](https://qiita-image-store.s3.amazonaws.com/0/104131/5c428728-3b77-d5b9-e311-775a67c313b4.png)

# 進捗報告会もPortfolioがあれば恐るるに足らず

Portfolioの計画自動生成はとても強力で依存性があります。いちど使い始めるとPortfolioなしでは生きられない身体になることを覚悟して試してください。
さらに、タスク管理にJIRA Agile（JIRAボード）を使っているなら、実績もPortfolioで見ることができるようになります。

![image](https://qiita-image-store.s3.amazonaws.com/0/104131/39ed9893-efa8-6c47-bf15-a492c9cda79d.png)

これで週次のプロジェクト進捗報告会議も恐くない。来週から堂々と自信を持って臨むことができますね。健闘を祈ります！
FileMaker14のスクリプトワークスペース


[FileMaker Advent Calendar 2015](http://www.adventar.org/calendars/865)の10日目

# FileMaker14のスクリプトワークスペース
FileMakerも14になってスクリプトワークスペースが導入され、スクリプトを書く環境が見違えるほどよくなりました

FileMaker14のスクリプトワークスペース
![151210-01.png](https://qiita-image-store.s3.amazonaws.com/0/89027/ae071cf7-f923-b861-e2e0-11fa9f5ce066.png)

FileMaker13まではだいたいこんな感じ
![151210-02.png](https://qiita-image-store.s3.amazonaws.com/0/89027/53f40561-2b39-4912-32f8-5a25f83cae00.png)

Get関数なんて使おうとした時には、フラグにどんなのが取れたかな？とヘルプを見ることもしばしば

それがFileMaker14のスクリプトワークスペースになると
![151210-03.png](https://qiita-image-store.s3.amazonaws.com/0/89027/15ef693e-453e-895c-754e-9096a67256be.png)

すばらしい

でもここまでできるのなら
![151210-04.png](https://qiita-image-store.s3.amazonaws.com/0/89027/01b64bab-9eec-e8cc-f040-ccd03f7af53e.png)
みたいに、返り値も列挙してくれたらうれしい
※別のIDEでそれらしく見えるように作っただけなので、なにかとおかしいですが..
RとC++のドッキングで高速計算


ご存知の方が多いかとは思いますが、Rcppというパッケージを使用することで、Rの中でC++が使えます。
今回はざっとした使用方法と、ベンチマークを載せたいと思います。

##用意するもの
- 
R
- 
RStudio(できれば)
- 
コンパイラ(MacならXcodeなど)

##使い方

###1. Rcppパッケージをインストール
`install.packages("Rcpp")`

###2. cppファイルを用意

```cpp
#include <Rcpp.h>
using namespace Rcpp;
// [[Rcpp::export]]

        .
        .
        .
        
```


`// [[Rcpp::export]]`を消すと動きません。

※) RStudioを使うと
"File" -> "New File" -> "C++ File"
で簡単にテンプレート作成できます。

###3. Rで読み込む

例えばこんなcppファイルを

```calculation.cpp
#include <Rcpp.h>
using namespace Rcpp;
// [[Rcpp::export]]

int loop(int s, int t) {

  for(int i = 0; i < t; i++) {
    for(int j = 0 ; j < t; j++) {
      s++;
    }
  }

  return(s);
}
```

Rで読み込むのに必要な記述はこちら。

```r
# パッケージの読み込み
library(Rcpp)

# cppファイルのコンパイル兼読み込み
sourceCpp("calculation.cpp")

```
※) rファイルとcppファイルが同階層の場合

あとは`loop`というC++の関数がR内で使えます。

##ベンチマーク
###環境
Mac OS X 10.10.4
プロセッサ: 3GHz Intel Core i7
メモリ: 8GB 1600 MHz DDR3

###使用ソース

10000*10000回の単純計算を10セット繰り返し比較。

```r
setwd("/Users/XXX/Desktop/R_programs/")
library(rbenchmark)
library(Rcpp)

# Rcppを使用した場合
with_rcpp <- function(n) {
  
  x <- 0
  
  sourceCpp("calculation.cpp")
  
  return( loop(x,n) )
}

# Rのみの場合
only_r <- function(n) {

  x <- 0
  
  for( i in 1:n ){
    for( j in 1:n ){
      x <- x + 1
    }
  }

  return(x)
}

loop_num <- 10000
benchmark( with_rcpp(loop_num), only_r(loop_num), replications = 10 )
```

###結果

```
                 test replications elapsed relative user.self sys.self
2    only_r(loop_num)           10 233.215 8637.593   229.983    1.582
1 with_rcpp(loop_num)           10   0.027    1.000     0.024    0.003
```
relativeを見ると、なんと8000倍以上速くなっています。
まさに高速化。
sourceCpp()で一度コンパイルすると、2重にコンパイルしない仕組みになっているようです。

##まとめ
高速化はもちろん、C++の標準ライブラリを使える利点もあります。
ただ、ベクターの書き方など、記述方法に少し癖のある感じなので下記を参照してください。
http://dirk.eddelbuettel.com/code/rcpp/Rcpp-attributes.pdf

一番詳しいドキュメントはこちら
https://cran.r-project.org/web/packages/Rcpp/Rcpp.pdf


Rの統計関数とかプロットとか便利だけど、一部計算をカスタマイズして高速化とかしたい！と思ってる方、是非使ってみてください。
Groongaの新しいAPIについてのご意見募集

この記事は[Groonga Advent Calendar 2015][]の九日目の記事です。昨日は[yoku0825][]さんの[MroongaのDockerイメージをメンテナンスする、とは][]でした。

現在、Groongaでは、検索結果の中に「クエリーが出現した位置」を含めた検索結果を取得することができません。

例えば「こんにちはGroonga。」という文書があったとして、「Groonga」で検索するとこの文書がヒットします。その時に『「Groonga」というクエリーが五文字目である』という情報を取得することができません。そのため、例えば[ongaeshi][]さんの[Milkode][]というソースコード検索アプリでは、位置情報を取得するために、Groongaが返したソースコードファイルを開いて、その中でクエリーの語を線形探索しているそうです。僕も、[Rubyでプラグインを作れる分散全文検索エンジンDroonga][]で発表した、「電子書籍の中で、検索後の位置を頭出しして開く」という機能を作る時、やっぱり全文からクエリーの位置を線形探索しなくてはいけませんでした。

もし、Groongaから返って来る検索結果にこの位置情報（文字数かバイト数か）が含まれていると、そういった部分がスキップできるので、システム全体としてより高速になります。

[Groonga Meatup 2015][]の場で開発者の一人である須藤さんに聞いたところ、こういった機能自体はすぐに実装できるそうです（`snippet_html()`関数などでやっていることと殆ど変わりません）。なので、あとは適切なAPIがあれば、というところです。

似たような要望を持っている人は他にもいるのではないかと思うので、僕一人の要求を伝えるより、そういう人達と少しお話してから、「こういう感じのAPIが欲しいんですけど」とリクエストするほうがよりよいかなとお持っています。なので、そういう議論のための場所を作りました！
https://github.com/groonga/groonga/issues/437

同じようなことを感じている人、ぜひご意見ください。日本語でも英語でも構いません。Qiitaのこの記事のコメントで意見をくださっても結構です。

よろしくお願いします。

[Groonga Advent Calendar 2015]: http://qiita.com/advent-calendar/2015/groonga
[yoku0825]: http://qiita.com/yoku0825
[MroongaのDockerイメージをメンテナンスする、とは]: http://tech.gmo-media.jp/post/134755559250/maintain-mroonga-docker-image
[ongaeshi]: http://qiita.com/ongaeshi
[Milkode]: http://milkode.ongaeshi.me/
[Rubyでプラグインを作れる分散全文検索エンジンDroonga]: https://kitaitimakoto.github.io/apehuci/2015/11/29.html
[Groonga Meatup 2015]: https://groonga.doorkeeper.jp/events/31482
scalaでyamlを使う

# 設定ファイルにyamlを使う

私はジャバの方から来たので設定ファイルといえばxmlでした。でもxmlは人に優しくない。jsonだとコメント入れられないのでyamlを使いたい。

Scalaでは[HOCON](https://github.com/typesafehub/config/blob/master/HOCON.md)形式がよく使われるので[knobs](http://oncue.github.io/knobs/)も気になる。

# 「scala yaml」で検索してみる
Java向けのSnakeYamlを使う方法が見つかりました。
http://alvinalexander.com/scala/scala-yaml-parser-parsing-examples-snakeyaml-objects
しかしメンバーをvarにして@BeanPropertyつけるのは具合が悪いです。普通のimmutableなcase classを使いたい。

[HelicalYaml](https://code.google.com/p/helicalyaml/)なるものも見つけましたが「The project is not maintained at the moment.」と宣言されてます。

Scalaに来たけどJavaのプロダクトにも関わってるし、jsonとかyamlとか他いろいろ一つのライブラリの知識で対応できたらいいのになあ。そんなに都合のいいモノなんてないよなあ、と思っていたらありました。

# jacksonの拡張モジュール
[jackson-dataformat-yaml](https://github.com/FasterXML/jackson-dataformat-yaml) yaml用データフォーマット
[jackson-module-scala](https://github.com/FasterXML/jackson-module-scala) scalaクラスに読み込むためのモジュール


jacksonのObjectMapperのインスタンスにScalaモジュールを登録してやるとcase classへの読み込みができます。

```scala
val mapper = new ObjectMapper(new YAMLFactory())
mapper.registerModule(DefaultScalaModule)
val myCaseClass = mapper.readValue[MyCaseClass](yaml)
```

プロジェクトではこんな感じのクラスを作って設定ファイルを読み込みました。

```scala
Object Yaml {
  private[this] val mapper = new ObjectMapper(new YAMLFactory).registerModule(DefaultScalaModule)

  def read[T](filename: String, clazz: Class[T]):T ={
    log.debug("Yaml read ["+ filename +"]")
    resource(filename) match {
      case Some(f) => mapper.readValue(f,clazz)
      case None => throw new RuntimeException("File not found." + filename)
    }
  }

  def read[T](filenames: Seq[String], clazz: Class[T]):T ={
    for(f <- filenames; r <- resource(f)) return mapper.readValue(r, clazz)
    throw new RuntimeException("File not found." + filenames)
  }

  private def resource(filename: String):Option[URL] = {
    val f = getClass.getClassLoader.getResource(filename)
    if(f!=null) Some(f) else None
  }
```

Seqを取る方は「config-test.yamlがあればそちらを優先、なければconfig.yamlを探す」みたいな使い方をします。

戻り型をOption[T]にして見つからなかったらNoneを返すか迷いました。設定ファイルが必ず必要なプロジェクトなので見つからない場合は例外を投げるようにしました。

※2016/01/15更新
getResourceAsStream()だと自分でclose()しないといけないので変更しました。複数ファイルをとる方はfor式にしたら簡単になりました。

[jackson](https://github.com/FasterXML/jackson)のページを見るとProtocolBufferにも対応してるしHOCONも'work in progress'ってなっているのでjacksonだけ押さえておけばなんでもできそうですね。

これならJavaもOKさ！（歯を大切に
angularjsの勘所　押さえたいところ

# ご注意

- angularjs1.3を元にしております。
- 一つのプロジェクトで使用した経験を元に書いております。

# angularjsの特徴

- scopeで区切られており、scope間の行き来はできるものの、うまく階層構造化されています。
- controllerを細かく分離することで疎結合でいつでも取り外しが可能です。
- データバインディングも強力なので自分が記述しなければいけない部分を局所化することができます。
- viewとjsの分離も上記のデータバインディングやscopeのおかげで綺麗にわけることが可能です。

# 階層構造(controllerの親子関係)について

- よくある階層構造として、パーツの中にパーツがあってといった時に使われます。
- header,footer,bodyなどでcontrollerをまず分けてから、それぞれの中でさらに分離といった感じが多いと思います。

<img width="951" alt="スクリーンショット 2015-12-10 3.03.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/18594/0d7095b9-d3ea-7659-f961-9ca1b0af6224.png">
`created by cacoo`

例えば上記だと
- 青: rootScope
- 赤: headerScope
- 緑: navigationScope

といった具体にパーツごとにcontrollerを分離させます。

# 階層構造の作成時の注意点

- あまりに深い階層構造でかつ、共通の呼び出しの場合、`$broadcast()`などを使います。
- 理由として、`$scope.$parent.$parent.$parent`などといった具合で上階層のデータを抜き出す時に使えますがいくつ上の階層であるとか、ちょっと構造が変わるだけで破綻します。
- そういったときに、`$emit()`や`$broadcast()`はすごく便利です。

## ２つの違いは上階層へのメッセージなのか下階層へのメッセージなのかです。
- $emit: 自分自身と親へのメッセージ
- $broadcast: 自分自身と子へのメッセージ

プロジェクト内では、動作していいかの制御に使っていました。
例えば、何かの作業中に上階層のボタンをクリックさせたくない等です。

```
scope.$parent.hoge = function() {
  scope.$emit('callToControllerDoNotClick');
};
```

## 環境変数の分離

- value以下に環境ごとのjsを作成して環境ごとに読み込むファイルを変えていました

<img width="177" alt="スクリーンショット 2015-12-10 3.26.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/18594/cecf1824-ec4c-3344-b4b2-45c650cd59b1.png">

## パフォーマンス改善

- AngularJS Batarangのchrome extensionをいれればだいたいは直せると思います。
- 複数の行を読み込む場合はwatch数に気をつけつつ、初回に読み込むものは減らす。例えば、カーソルかぶせて表示とかの場合、カーソルかぶせるまでは表示自体なかったことにする等です。`ngIf`を使ってみると良いかと思います。

## 終わりに

- angularjsを使ってみて思ったことは、ライブラリが多いので工数削減ができることと、自分で書くべきところが少ないのでバグが起こる可能性は減ると思いました。
- ただし、controllerの分離をうまくやらないとデータの移動が面倒だったりしたので設計がより重要だと思ってます。
java.lang.UnsupportedClassVersionError: com/typesafe/config/ConfigException : Unsupported major.minor version 52.0


めっちゃハマったw

## 動作環境
Mac OS X EI Capitan
IntelliJ 15
Play 2.4.4
scala 2.11.6

## エラー文
Playの2.4からはJava8じゃないと利用できないっぽい．

そしてこのエラー分の意味はざっくり言うと，`Java8`使えよ！って意味．

この末尾の数字については[Unsupported major.minor version 51.0 = Java7 以上使え](http://qiita.com/seratch@github/items/731b69d3edabe9c8bc0d)を参考にしました．

## IntelliJでjava8使いたい

まず，ターミナルから`java -version`

```
$ java -version
java version "1.8.0_65"
Java(TM) SE Runtime Environment (build 1.8.0_65-b17)
Java HotSpot(TM) 64-Bit Server VM (build 25.65-b01, mixed mode)
```

ちゃんとなってるじゃん！ってなけにはいきませんでした．．

IntelliJの参照するJavaのバージョンを変更するには以下の方法を実践

1. メニューバーの`File`をクリック
2. `Project Structures...`をクリック
3. 左のバーの`Project`をクリック
4. `Project SDK`で`1.8`を選択

1，2のステップは以下
![スクリーンショット 2015-12-10 03.18.14.png](https://qiita-image-store.s3.amazonaws.com/0/84299/2e2626b1-eb77-e02e-bd79-2ee7c5559db3.png "スクリーンショット 2015-12-10 03.18.14.png")

3，4のステップは以下
![スクリーンショット 2015-12-10 03.19.08.png](https://qiita-image-store.s3.amazonaws.com/0/84299/99eab41a-df2d-1ea1-2505-e52f1783b6e9.png "スクリーンショット 2015-12-10 03.19.08.png")

当たり前すぎるのかあまり参考文献がなかったので自分が書いてみました．

IntelliJ自体がEclipseと比べて資料が少ないのでこういう基本的なやつがわからなかったりしますよねなんか．．．

とりあえずこれでエラーはでなくなりました！
bash 起動ファイル　覚書

ログイン時は下記の順に読み込まれる。

/etc/profile > ~/.bash_profile > ~/.bashrc > /etc/bashrc

ログイン後に bash コマンド等で bash を起動した場合は下記の順に読み込まれる。

~/.bashrc > /etc/bashrc

ログイン時に一度だけ実行したい処理は ~/.bash_profile へ、
bash を起動する度に実行したい処理は ~/.bashrc へ記述する。
Linux ユーザ管理　覚書

# UID(ユーザ ID)
* root: 0
* 一般ユーザ: 1～

## 一般ユーザ
* 個人ユーザ(UID: 1～499): OS にログインして作業するユーザ
* システムユーザ(UID: 500～): アプリケーションの実行プロセス

# GID(グループ ID)
* プライマリグループ
* セカンダリグループ

# パーミッション
ファイル / ディレクトリには、それを作成したユーザの UID と プライマリグループの GID が
オーナー情報として設定される。
一般的には所有者(ユーザ)へ rwx 、所有グループへ r-x 、その他ユーザへ r-- が設定される。
ファイル / ディレクトリのアクセス権限は多くの場合、
どのユーザ(UID)でファイル / ディレクトリへアクセスしようとしているかで決まる。

* r: 読み取り権限
* w: 書き込み権限
* x: 実行権限
* -: 権限がないことを表す。

# 特殊なパーミッション
## s
* setuid: ファイルを実行すると、実行プロセスのオーナーがファイルオーナーと同じになる。
* setgid: ディレクトリ内にファイル / ディレクトリを作成すると、
  所有グループが親ディレクトリと同じ GID になる。
  特定グループに所属するユーザ同士でファイルを共有する際に使用する。

## t
* sticky: ディレクトリ内のファイル / ディレクトリの削除 / リネームは、
  その所有者と root ユーザのみに許可される。
  万人が読み書き可能だが、削除やリネームは自由にできない共有ファイルを作ることができる。

# コマンド
## [useradd, adduser](http://linuxjm.osdn.jp/html/shadow/man8/useradd.8.html)
新規ユーザを作成する。
OS によってコマンド名が違うっぽい。(未検証)

## [userdel](http://linuxjm.osdn.jp/html/shadow/man8/userdel.8.html)
既存のユーザを削除する。

## [usermod](http://linuxjm.osdn.jp/html/shadow/man8/usermod.8.html)
既存ユーザの情報を変更する。(所属グループの変更等)

## [id [ユーザ名]](http://linuxjm.osdn.jp/html/GNU_sh-utils/man1/id.1.html)
指定したユーザ名に対応する UID と所属グループ(GID)の情報を表示する。
ユーザ名を指定しない場合、コマンドを実行したユーザ自身の情報が表示される。

## [groupadd](http://linuxjm.osdn.jp/html/shadow/man8/groupadd.8.html)
新規グループを作成する。

## [groupdel](http://linuxjm.osdn.jp/html/shadow/man8/groupdel.8.html)
既存のグループを削除する。

## [passwd <ユーザ名>](http://linuxjm.osdn.jp/html/shadow/man1/passwd.1.html)
ログインパスワードを設定する。

## [chage](http://linuxjm.osdn.jp/html/shadow/man1/chage.1.html)
パスワードの有効期限を設定する。

## [mkpasswd, pwgen](http://qiita.com/speg03/items/ec404c217e417160e2d5)
ランダムなパスワードを生成する。 OS によって使用できるコマンドが違う?
mkpasswd は CentOS、 pwgen は MacOS と Ubuntu で使用できるらしい。

mkpasswd については [@IT](http://www.atmarkit.co.jp/flinux/rensai/linuxtips/889mkpasswd2.html) を参照。
なお [JM Project](http://linuxjm.osdn.jp/) で検索すると
同じ名前の違う機能を持つコマンドがヒットする。

## [chmod](https://linuxjm.osdn.jp/html/GNU_fileutils/man1/chmod.1.html)
ファイル / ディレクトリのパーミッションを変更する。

## [chown](https://linuxjm.osdn.jp/html/LDP_man-pages/man2/chown.2.html)
ファイル / ディレクトリの所有者 / 所有グループを変更する。

## [umask](https://linuxjm.osdn.jp/html/LDP_man-pages/man2/umask.2.html)
ファイル / ディレクトリの新規作成時に適用するパーミッションを設定する。

## [chsh](http://linuxjm.osdn.jp/html/shadow/man1/chsh.1.html)
ログインシェルを変更する。
/etc/shells に記載されているシェルにのみ変更することができる。

# 設定ファイル
## /etc/skel
ユーザ作成時にホームディレクトリへコピーするファイル群を定義する。

## /etc/passwd
UID をはじめとする基本情報が記録される。

## /etc/shadow
暗号化されたパスワードが記録される。

## /etc/group
セカンダリグループのユーザ名が記録される。

## /etc/shells
使用可能なシェル名が記録されている。
TypeScript の API ドキュメントを Markdown で出力するツールを作った

TypeScript で API ドキュメントを Markdown で出力できるものを作りました。
https://www.npmjs.com/package/typedoc-markdown-theme

# 使い方
TypeDoc という、 TypeScript のコードから API ドキュメントを HTML で生成してくれるツールがあります。

* http://typedoc.io/

こちらのパッケージ、 theme というのを設定することで、ドキュメントの見た目を変えることができます（未設定の場合はデフォルトの theme が使われる）。
本来は DOM 構造を変えたり CSS をいじったりするような用途が想定されているであろう機能ですが、大胆に Markdown にしてみました。
ということで、 使い方は以下のような感じです。

```bash
$ npm install typedoc typedoc-markdown-theme --save-dev
$ node_modules/.bin/typedoc --theme node_modules/typedoc-markdown-theme/bin --out doc path/to/ts/dir
```

より詳細なオプションの指定方法等は TypeDoc のドキュメントを参照してください。

ちなみに、 TypeScript 1.7 には未対応です。 (TypeDoc 自体がこの記事執筆時点で未対応)

# 出力例

https://github.com/kimamula/typedoc-markdown-theme/tree/master/examples の中をご覧いただければ。

# 以下余談

## 実装について
オプションとして指定できるようになっているくらいだから、 TypeDoc 本体とは疎結合に作れるかなと思っていたのですが、割と密結合になっていて、バージョンアップ対応とかが不安です。
実は TypeDoc は TypeScript 1.7 対応がまだなのですが、ここ 24 時間くらいで対応しようとしている commit があるので、そろそろバージョンアップしそう。

また、 Handlebars をテンプレートエンジンとして使っているのですが、 HTML なら grep すればどこに何が書いてあるかまあ探せると思うのですけれど、 Markdown だと相当厳しい感じがします。
コメントしっかり書いておけばよかったかも。

## API ドキュメントについて
API ドキュメントって未だに HTML で出力されるものが主流なので、実はそんなに需要ないのかな？なんて不安になっています。
GitHub 上とかでドキュメント公開したくなったら、 Markdown 欲しくなりますよね？
GitHub Pages だと、それ用に branch 切るので、最新の状態と同期するのめんどくさくならないですかね。
何か僕の知らないすごくいいやり方があるのかな。
Salesforceのレポートをエクスポートする

レポート詳細画面のボタンじゃなくて、URL指定で直接エクスポートするときのパラメータについてまとまった情報がみつけられないのでまとめておく（Winter '16で確認）。

### 印刷用に表示

```
https://{instance}.salesforce.com/{reportId}?excel=1&details=yes
```

`excel`パラメータが指定されていれば「印刷用に表示」でダウンロードできるxlsファイルになる。
パラメータが存在していれば値は何でもよいみたい。
デフォルトで詳細が含まれるようなので`details=yes`は冗長だけど、詳細を含めないなら`details=no`とする。
### 詳細をエクスポート

```
https://{instance}.salesforce.com/{reportId}?export=1&enc=MS932&xf=xls
```

`export`パラメータが指定されていれば「詳細をエクスポート」になる。こちらも値は何でもよい。
`excel`と両方指定した場合は`export`が勝つようだ。

#### エンコード指定

|エクスポート画面の選択リスト値|encの値|
|:------------------------|:-----|
|日本語(Windows)|MS932|
|日本語(Shift-JIS)|Shift_JIS|
|Unicode(UTF-8)|UTF-8|

画面からは選択できないけど、`EUC_JP`とかも指定可能。
`Shift_JIS`だと丸数字やはしご高が文字化けするのかと思ったが、`MS932`の場合と同一のファイルが得られた（`SJIS`を指定すると化ける）。

#### ファイル形式指定

|エクスポート画面の選択リスト値|xfの値|
|:------------------------|:----|
|カンマ区切り形式(.csv)      |csv  |
|Excel形式(.xls)           |xls  |

こうやって対応付けた場合は正確には`csv`じゃなくて`localecsv`か。non-localeのカンマ区切り形式が`csv`。
# 参考
[Custom link to download/export report in single click](http://salesforce.stackexchange.com/questions/13602/custom-link-to-download-export-report-in-single-click)
[Locale Settings for Exporting Report Data](https://help.salesforce.com/apex/HTViewHelpDoc?id=reports_export_notes.htm)
[レポートのエクスポート機能を実行するURL](http://qiita.com/tyoshikawa1106/items/fda16c8681a57cf432b7)
Consul使ってWindowsをリモートから操作する例

俺です。

consul execを使ってwindows powershellを叩く方法の例です。

consulが最も簡単にwindowsをリモート管理するツールな気がしました。


# consul members

- Amazon Linuxをconsul serverとしてwindows(dev-win-1a)をjoinさせている
 
```
[ec2-user@ip-172-31-10-102 ~]$ consul members
Node           Address             Status  Type    Build  Protocol  DC
dev-win-1a     172.31.10.189:8301  alive   client  0.6.0  2         ap-northeast-1
prd-manage-1a  172.31.10.102:8301  alive   server  0.6.0  2         ap-northeast-1
```

# config & startup

## consul server(Linux)

-  /home/ec2-user/conf/consul.json

```
{
    "server": true,
    "bootstrap_expect": 1,
    "bootstrap": false,
    "data_dir": "/home/ec2-user/data",
    "log_level": "INFO",
    "node_name":"prd-manage-1a",
    "datacenter":"ap-northeast-1"
}
```

- Amazon Linuxでconsul起動

```
[ec2-user@ip-172-31-10-102 ~]$ ./consul agent -config-dir=/home/ec2-user/conf
```

## consul agent(Windows)

検証なのでWindows FirewallはOffってある

- `c:¥consul¥conf¥consul.json`

```
{
    "server": false,
    "bootstrap": false,
    "data_dir": "c:\\consul\\data\\",
    "log_level": "INFO",
    "node_name":"dev-win-1a",
    "datacenter":"ap-northeast-1"
}
```

- Windowsでconsul起動

```
PS C:\consul\bin> .\consul.exe agent -config-dir c:/consul/conf
==> Starting Consul agent...
==> Starting Consul agent RPC...
==> Consul agent running!
         Node name: 'dev-win-1a'
        Datacenter: 'ap-northeast-1'
            Server: false (bootstrap: false)
       Client Addr: 127.0.0.1 (HTTP: 8500, HTTPS: -1, DNS: 8600, RPC: 8400)
      Cluster Addr: 172.31.10.189 (LAN: 8301, WAN: 8302)
    Gossip encrypt: false, RPC-TLS: false, TLS-Incoming: false
             Atlas: <disabled>

==> Log data will now stream in as it occurs:

    2015/12/09 17:04:15 [INFO] serf: EventMemberJoin: dev-win-1a 172.31.10.189
```


# consul join & members

- server側で実行

```
[ec2-user@ip-172-31-10-102 ~]$ ./consul join 172.31.10.189
[ec2-user@ip-172-31-10-102 ~]$ ./consul members
Node           Address             Status  Type    Build  Protocol  DC
dev-win-1a     172.31.10.189:8301  alive   client  0.6.0  2         ap-northeast-1
prd-manage-1a  172.31.10.102:8301  alive   server  0.6.0  2         ap-northeast-1
```

以上でconsulでWindowsを任意のホストからリモート管理できるようになった。

# consul execの結果


- powershellワンライナー

```
[ec2-user@ip-172-31-10-102 ~]$ ./consul exec -node=dev-win-1a "powershell Write-Host hello"
    dev-win-1a: hello
    dev-win-1a:
==> dev-win-1a: finished with exit code 0
```

- powershellスクリプト

hello worldと出力するps1ファイルをWindows任意の場所に配置しておく

```
[ec2-user@ip-172-31-10-102 ~]$ ./consul exec -node=dev-win-1a "powershell c:/consul/helloworld.ps1"
    dev-win-1a: hello
    dev-win-1a:
==> dev-win-1a: finished with exit code 0
1 / 1 node(s) completed / acknowledged
```
OSXで複数のバージョンのPHPを同時に使う

## 更新記事、「[Macで複数のバージョンのPHPを同時に使う](https://qiita.com/koriym/items/17662cd9c44c43081bf9)」を参照してください。

以下は以前の記事です。

----

## 切り替えではなく使い分け

[phpenv](https://github.com/phpenv/phpenv)や[php-nabe](https://github.com/kawahara/php-nabe)のように異なるバージョンのPHPを切り替えて使うのではなく、同時にビルトインサーバーやphpunitで使うために、特定のバージョンのphpを実行時に指定できるようにします。

問題になるのが設定ファイル、設定ファイルディレクトリとPHPエクステンションですがこれを解決します。

## PHP5.6とPHP7.0をインストール

```
curl -s http://php-osx.liip.ch/install.sh | bash -s 5.6;
curl -s http://php-osx.liip.ch/install.sh | bash -s 7.0
```
php7のxdebugのインストールについては[OSXにphp7+xdebugをインストール](http://qiita.com/koriym/items/b3c58f41c18c5db9153d)を参照してください。

インストールディレクトリを確認

```
ls -al /usr/local | grep php
lrwxr-xr-x    1 root     admin     37 12  9 09:35 php5 -> /usr/local/php5-7.0.0-20151202-133632
drwxr-xr-x   14 root     wheel    476 12  9 09:32 php5-5.6.16-20151127-214015
drwxr-xr-x   14 root     wheel    476 12  9 09:35 php5-7.0.0-20151202-133632
```

php5.6の`extension_dir`をphp5.6ローカルのものに変更

```/usr/local/php5-5.6.16-20151127-214015/php.d/10-extension_dir.ini
extension_dir=/usr/local/php5-5.6.16-20151127-214015/lib/php/extensions/no-debug-non-zts-20131226
```

aliasを作成
`PHP_INI_SCAN_DIR`と`php.ini`と`php`をフルパスで指定したaliasを登録します。

```~/.bash_profile
alias php5='env PHP_INI_SCAN_DIR=/usr/local/php5-5.6.16-20151127-214015/php.d /usr/local/php5-5.6.16-20151127-214015/bin/php -c  /usr/local/php5-5.6.16-20151127-214015/lib/php.ini'
```

反映
`. ~/.bash_profile`

## PHPのバージョン確認

```
php5 -v

PHP 5.6.16 (cli) (built: Nov 27 2015 21:37:15) 
Copyright (c) 1997-2015 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2015 Zend Technologies
    with Zend OPcache v7.0.6-dev, Copyright (c) 1999-2015, by Zend Technologies
    with Xdebug v2.2.5, Copyright (c) 2002-2014, by Derick Rethans

php -v

PHP 7.0.0 (cli) (built: Dec  2 2015 13:35:31) ( NTS )
Copyright (c) 1997-2015 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2015 Zend Technologies
    with Zend OPcache v7.0.6-dev, Copyright (c) 1999-2015, by Zend Technologies
    with Xdebug v2.4.0RC3-dev, Copyright (c) 2002-2015, by Derick Rethans```
```

バージョンの違うPHPで同時にビルトインサーバーを使用したり、PHPバージョンを指定してphpunitなどのPHPプログラムを実行することができるようになりました。

```
php vendor/phpunit/phpunit/phpunit
php5 vendor/phpunit/phpunit/phpunit
```

## Composer
パフォーマンスのために`composer`でxdebugを使用しないようにするためには[Xdebug impact on Composer](https://getcomposer.org/doc/articles/troubleshooting.md#xdebug-impact-on-composer)を参照してください。
JavaScript の テスト結果レポートを Jenkins で表示させる

JS でビジネスロジックとかあまり書きたくないけど、プロダクトコードはテストして CI したいってことで、Jenkins と Gulp 連携してみました。

あらかじめ npm で xunit-file を導入しておきます。

Mocha でテスト書いてます。

```js
var gulp = require('gulp');
var pkg = require('./package.json');
var mocha = require('gulp-mocha');
var cover = require('gulp-coverage');

gulp.task('test', function() {
	return gulp.src('./test/*.js', {read: false})
	.pipe(cover.instrument({
		pattern: ['./src/js/*.js'],
		debugDirectory: './debug'
	}))
	.pipe(mocha({reporter: 'xunit-file'}))
	.pipe(cover.gather())
	.pipe(cover.format())
	.pipe(gulp.dest('reports'));
});
```
Jenkins 側の設定(Windowsです)
![jenkins-conf.png](https://qiita-image-store.s3.amazonaws.com/0/20937/3ab55d87-c5a7-1e71-b12f-b6e4fb90f1fc.png)


カバレッジレポートの例です。上の Jenkins の設定例では、生成されたレポートの HTML を Jenkins の userContent フォルダにコピーしていますが、レポートをビルド成果物に含めれば、ビルド毎にレポートが残りますし、http://jenkins_host/lastBuild/artifact/coverage.html のように最新の結果を閲覧可能です。

![coverage.png](https://qiita-image-store.s3.amazonaws.com/0/20937/dae8fe4a-68b1-a0c3-b9a3-f92bf3a453a2.png)

Jenkins のビルドレポートの例です。
![xunit-sample.png](https://qiita-image-store.s3.amazonaws.com/0/20937/4c70a84d-2894-6093-dfe3-6e53bafc83a9.png)
非プログラマ集団ではじめるテスト自動化〜はじめに

はじめまして、キータデビューですがよろしくお願いします。

私は開発部署から品質管理の部署へ異動して、テストエンジニアとしてスタートしたのですが、試験項目を見ながら手動でテストをしていくことに苦痛を感じ、Seleniumを使ってのテスト自動化を提案し、ある程度のテストの自動化に成功する事ができました。
あるwebアプリのリグレッションテストで、54人日掛かってた試験工数が38人日近くまで短縮（3割近く削減）できたのです！

プログラマーとしての経験が無いメンバーで、試行錯誤しながら自動化に取り組んだので、上手くいかない事もありましたが、今では目を輝かせて自動化実装をするテスターもいて、健康衛生面で好ましいことこの上ありませんし、職場が明るくなります 笑。

全国津々浦々、同じような境遇の方々がいるのでは、少しでも参考になればと思い、連載風にカキコできればと筆を取った次第ですので、何か反応があると嬉しいです。

Seleniumは主流（だと思われます）のWebDriverではなく、Selenium IDEを採用しています。
Selenium IDEを採用した経緯は次回お話できればと思います。
よろしくお願いします。
Bigtopと戯れる その1


Apache Bigtopとは、Apache Hadoop関連のプロダクト(Hadoop エコシステム)のパッケージング、テストなどを担当するツールですが、実際にどのようにして使えばいいのかについてはあまり深く知られていないと思います。本記事では、少しだけですがApache Bigtopの使い方について紹介します。

## 目標

* 最新版のHadoopのRPMファイルを作ること
* 自分でパッチを当てたHadoopのRPMファイルを作ること

本記事では、いずれも達成できていません。

## 前提

* Bigtopのバージョンは、master (2015/11/21時点)
* CentOS 6系ベース (Azureを使っている都合で、実際はOpenLogic 6.7)

## 必要なライブラリ

Hadoopをコンパイルするのに必要なもの(詳細は[Hadoop Wiki: HowToContribute](https://wiki.apache.org/hadoop/HowToContribute#Native_libraries)を参照)に加えて、以下が必要

* Gradle
* rpmbuild

rpmbuildはyumで入る。Gradleは公式サイトからDLする必要がある。Gradleのバージョンは、指定のものを使う。bigtop_toolchainという、ビルド環境構築用Puppetマニフェスト群があり、そのマニフェストを読めば対応しているGradleのバージョンがわかる。本記事の執筆時点では、2.7だった。

```ruby:bigtop_toolchain/manifests/gradle.pp
class bigtop_toolchain::gradle {

  include bigtop_toolchain::deps

  exec {"/usr/bin/wget http://services.gradle.org/distributions/gradle-2.7-bin.zip":
    cwd     => "/usr/src",
    require => Package[$packages::pkgs],
    unless  => "/usr/bin/test -f /usr/src/gradle-2.7-bin.zip",
  }
(以下略)
```

最新だと必ずしも良いというわけではなく、例えば、Bigtop 1.0.0 + Gradle 2.9では動かなかった。

ちなみに、Puppetをインストールすれば、bigtop_toolchainによってビルド用環境を自動構築できる。自分はPuppetを手で入れるのが面倒なので手作業でいろいろとインストールしたが、Puppetを入れる部分もスクリプト化されていたので、最初から下の記事に書いてある手順でやったほうが良いと思う。

https://cwiki.apache.org/confluence/display/BIGTOP/How+to+build+Bigtop-trunk

## ビルド

```
$ gradle hadoop-rpm
```

上記のコマンドを実行するだけでHadoop 2.7.1のRPM群が完成する。outputディレクトリ配下にRPMファイルが入っている。

```
[azureuser@centos67a x86_64]$ ls output/hadoop/x86_64
hadoop-2.7.1-1.el6.x86_64.rpm
hadoop-client-2.7.1-1.el6.x86_64.rpm
hadoop-conf-pseudo-2.7.1-1.el6.x86_64.rpm
hadoop-debuginfo-2.7.1-1.el6.x86_64.rpm
hadoop-doc-2.7.1-1.el6.x86_64.rpm
hadoop-hdfs-2.7.1-1.el6.x86_64.rpm
hadoop-hdfs-datanode-2.7.1-1.el6.x86_64.rpm
hadoop-hdfs-fuse-2.7.1-1.el6.x86_64.rpm
hadoop-hdfs-journalnode-2.7.1-1.el6.x86_64.rpm
hadoop-hdfs-namenode-2.7.1-1.el6.x86_64.rpm
hadoop-hdfs-secondarynamenode-2.7.1-1.el6.x86_64.rpm
hadoop-hdfs-zkfc-2.7.1-1.el6.x86_64.rpm
hadoop-httpfs-2.7.1-1.el6.x86_64.rpm
hadoop-libhdfs-2.7.1-1.el6.x86_64.rpm
hadoop-libhdfs-devel-2.7.1-1.el6.x86_64.rpm
hadoop-mapreduce-2.7.1-1.el6.x86_64.rpm
hadoop-mapreduce-historyserver-2.7.1-1.el6.x86_64.rpm
hadoop-yarn-2.7.1-1.el6.x86_64.rpm
hadoop-yarn-nodemanager-2.7.1-1.el6.x86_64.rpm
hadoop-yarn-proxyserver-2.7.1-1.el6.x86_64.rpm
hadoop-yarn-resourcemanager-2.7.1-1.el6.x86_64.rpm
hadoop-yarn-timelineserver-2.7.1-1.el6.x86_64.rpm
```

実際にこれらをインストールしようとすると、ZooKeeperも必要になります。ZooKeeperもBigtopでビルドできます。

```
$ gradle zookeeper-rpm
```

## 自分でパッチを当てたHadoopのビルド

パッチを、`bigtop-packages/src/common/<your-package>`に置く。 パッチの名前は、`patch*.diff`にする必要がある。自分はまだ試してないです。

## おわりに

体調を崩してしまってAdventCalendar書くのが遅くなってすみません。しかも、書いている途中のネタですみません。また続きを書く機会がありそうなので、がんばります。

続きを書きました。 [Bigtopと戯れる その2](http://qiita.com/ajis_ka/items/2b99630d2e3a51ab172f)

## 参考にしたドキュメント

公式のwiki: https://cwiki.apache.org/confluence/display/BIGTOP/Index
UICollectionViewでセル毎にサイズを変更する時に　メモ

`UICollectionView`でセル毎に動的にサイズを変更していて、最初は問題なかったが`insertItemsAtIndexPaths`で追加した時とかに正常に表示されなかった。
大きいはずのところが小さかったり、小さいはずが大きかったり。
かなり詰まったが原因判明。

カスタムセルを使用していて、`contentView`に`addSubView`するかたちで`UIImageView`と`UILabel`を追加していた。
これがセルを再利用するときに、小さかったセルを大きいセルのために再利用するとセル自体はちゃんと大きくなっているが、`UIImageView`のサイズが小さいままでいたため小さく見えた。逆も然り。

よって`cellForItemAtIndexPath`とかで`cell`の大きさに合わせて`UIImageView`の大きさを変えてあげればいい。（そもそも、セルの`backgroundView`に設定していれば問題なかったけど後になって気づいた。。。）

```
func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
   let cell:CustomCell = collectionView.dequeueReusableCellWithReuseIdentifier("cell", forIndexPath: indexPath) as! CustomCell
   let thumb:UIImage = images[indexPath.row]

   cell.titleLabel?.text = data.objectForKey("title") as? String;
   cell.thumbView?.image = thumb;
   cell.thumbView?.frame.size = cell.frame.size//そもそもImageViewをbackgroundViewにすべき？

   return cell;
    }
```

ラベルの位置とかも修正しなきゃいかんけど。カスタムセル側で`didSet`とかで変えれば楽かな
特定のドメインにだけiframeでの埋め込みを許可する

#概要
あるページについて、セキュリティ対策として、以下を実装したい場合の方法。
・他サイトにiframeで埋め込まれるのを抑止したい
・特定のドメインにだけiframeでの埋め込みを許可したい

※セキュリティ上の観点では、JavaScriptでの実装ではなくphpなどサーバーサイドスクリプトでの実装が望ましいですが、あくまでJavaScriptで簡易に実装する方法として紹介します。

##コード
jQueryがロードされている前提のコードです。
解説は、コード内のコメント参照。

```js
$(document).ready(function(){
	//リファラ取得
	var ref = document.referrer;

	//許可ドメインのリスト設定
	var domainArr = new Array();
	//複数ページある場合は、ページを置いた自身のドメインを追加しておかないと、ページ遷移するとエラー表示になってしまう。
	domainArr.push("自身のドメイン.jp");
	domainArr.push("許可する別ドメイン1.jp");
	domainArr.push("許可する別ドメイン2.jp");

	var flg = false;
	for(var cnt=0;cnt<domainArr.length;cnt++){
		//許可ドメインかどうか判定
		if(ref.indexOf(domainArr[cnt])!=-1){
			flg = true;
		}
	}
	if(flg == false){
		//許可ドメイン外の場合、htmlを書き換える
		$('body').html('エラー：不正なアクセス');
	}
});

```
jquery plugin-validation validation-engine

当たり前ですが、別物です。検索で似たようなソースが出てくるので注意しましょう。
コピペで動かない時はどちらの記述か確認しましょう...結構はまったりした

気にして探したらどんどんでてくるぞ...
https://plugins.jquery.com/?s=validate
どれがいいんでしょうか？

#jquery validation engine
https://github.com/posabsolute/jQuery-Validation-Engine
https://github.com/posabsolute/jQuery-Validation-Engine/blob/master/README.md

これしか使ってないけど、class に定義追加するだけなので簡単、数字のみの入力チェックなら


```lang:サンプル
<input type='text' class='validation[custom[integer]]'>
```

こんな感じ

#jquery plugin validation
http://bassistance.de/jquery-plugins/jquery-plugin-validation/

#jquery validation
http://jqueryvalidation.org/

#jquery validate
jqueryの本流っぽく見えるけど 3年前から更新がないみたい、上記とは別物っぽい
https://plugins.jquery.com/validate/
https://github.com/DiegoLopesLima/Validate
CakePHPのアソシエーションがわからなくなったとき用

http://book.cakephp.org/2.0/ja/models/associations-linking-models-together.html
http://blog.ecworks.jp/archives/268
http://qiita.com/kazu56/items/eaaa0c2d7294a28ac21c
http://qiita.com/moriyant/items/b57ee4fc45af2fc03194

hasとbelongが、すぐどっちがどっちかわからなくなる。
「持っている」とかアバウトな言葉じゃなくてテーブル定義で教えてくれ。

## 結論

<dl>
<dt>hasMany</dt>
<dd>相手テーブルに、自分テーブル.idへの外部キーがある。</dd>
<dt>hasOne</dt>
<dd>hasManyだけど外部キーがUNIQUE。</dd>
<dt>belongsTo</dt>
<dd>自分のテーブルに、相手テーブル.idの外部キーがある。</dd>
<dt>hasAndBelongsToMany</dt>
<dd>中間テーブルでくっついてるやつ。</dd>
</dl>

## hasMany

ユーザは複数の趣味を持っている。任意入力。

```php:User.php
class User{
	$hasMany = [
		'Hobby'=>[
			'className' => 'Hobby',
		],
	];
}
```

```text:usersテーブル
特に趣味に関する項目はない。
```

```text:hobbiesテーブル
id
user_id ← users.idに外部キー
name
```

趣味をスペース区切りとかで複数入力してもらい、それをそのまま保存するタイプのユーザ登録。
よくある構造のテーブルです。

## hasOne

ユーザはひとつのプロフィールを持っている。

```php:User.php
class User{
	$hasOne = [
		'Profile'=>[
			'className' => 'Profile',
		],
	];
}
```

```text:usersテーブル
プロフィールに関する項目はない。
```

```text:profilesテーブル
id
user_id ← users.idに外部キー、かつUNIQUE制約
family_name
first_name
```

この構造は[公式の例](http://book.cakephp.org/2.0/ja/models/associations-linking-models-together.html)なのですが、でもこういう場合普通はusersテーブルに個人情報入れるよな。
hasOneを使うということはつまりテーブルの垂直分割なので、あまり使う必要性が感じられない。


## belongsTo

ユーザは職業IDを持っている。

```php:User.php
class User{
	$belongsTo = [
		'Employment'=>[
			'className' => 'Employment',
		],
	];
}
```

```text:usersテーブル
id
employment_id ← employments.idに外部キー
```

```text:employmentsテーブル
id
name
```

employmentsテーブルには「学生」「会社員」「無職」などのデータが入っていて、ユーザ登録時にその項目を選択してIDを登録するというよくある形態。

## hasAndBelongsToMany

ユーザは複数の趣味を持っている。選択式。

```php:User.php
class User{
	$hasAndBelongsToMany = [
		'Hobby'=>[
			'className' => 'Hobby',
			'with'      => 'UserHobby',
			'foreignKey' => 'hobby_id',
			'associationForeignKey' => 'user_id',
		],
	];
}
```

```text:usersテーブル
特に趣味に関する項目はない。
```

```text:hobbiesテーブル
id
name
```

```text:user_hobbiesテーブル
id
user_id ← users.idに外部キー
hobby_id ← hobbies.idに外部キー
```

hasManyの趣味は直接入力でしたが、こちらは予め項目が表示されており、その中からチェックボックスで複数選択するタイプの登録フォーム。

UserとHobbyにUserHobbyへのhasMany、UserHobbyからUserとHobbyへのbelongsToを書けばだいたい同じ意味になると思うけど、めんどうなので一気に書けるとかそういうかんじですかね。


## その他

リレーションがあるだけひたすら書いておくだけで、findすると勝手に拾ってきてくれて便利なのですが、SQLの発行数がえらいことになります。
辿る深さはrecursiveで制御できますが、何故か特定の先だけ制御する方法がありません。

```text
A→B→C→D
↓
E→F→G
↓
H→I
↓
J
```

なんてテーブルがあったとして、Dが欲しいんだと`$this->A->recursive = 3`と設定するとSQLが何十個も発行されます。
や、Bの先だけ欲しいんだと`$this->A->B->recursive=2;$this->A->E->recursive=-1;`とか書いても、どうも効かないみたいです。
そういう記事が全く見当たらないんだけどできないんじゃろうか。

あとrecursive深くするとA→B→A→Bなんてのも辿るみたいなんだけどこれは必要なのか？
RaspberryPiを使ってエアコンを完全自動化するまでの道のり（の途中）

この記事は [animateLAB Advent Calendar 2015](http://qiita.com/advent-calendar/2015/animatelab) 9日目の記事です。

こんにちは。@kariaです。

今日はさすがにポエムが尽きた……これは作者急病のため休載か……と思いながら会社から帰宅したのですが、帰宅したことにより自室のエアコンがつけっぱなしだったことに気づき、さらにそれによりエアコン完全自動化を目論んでいたことを思い出したのでメモっておきます。

## やりたかったこと

- 家を出たあと、エアコン消し忘れたときに自動で消したい
- 家に帰り着く前に、エアコンを自動でつけたい

## やったこと

- Raspberry Piを購入する
- USB温度センサーを購入する

私が購入したのはtemperという名前で売られているものです。一時期は秋葉原の一部の店舗で売っていたようなのですが、現在はAmazonでちらほら参照する程度です。測定精度は値段なりだなーといった感じですが、温度の変化度合いがわかればよいのでそんなに精度は求めていませんでした。

- 下記記事を参照の上`temper`コマンドをビルドする

[RaspberryPi - USB温度センサTEMPer1の温度を取得するには - Qiita](http://qiita.com/zembutsu/items/9b718416f6b30a19d83c)

- てきとうなTwitterアカウントを取得し、[Twitter Application Management](https://apps.twitter.com/)でアクセストークン等々を取得しておく ※SMSによる電話番号認証が必要
- 下記のようなrubyスクリプトを書く

https://github.com/karia/temperaturebot/blob/master/tempbot.rb

rubyはこういう簡単なスクリプトをサクッと書けて便利ですね。

- rootのcrontabに仕込む

temperコマンドが残念ながらrootでしか動かないので、temperコマンドを叩くrubyスクリプトもrootで動かすしかありません。これは今のところ解決策なし。

するとこんな感じで室温がひたすらストイックに投げられます。

https://twitter.com/ka_temper

## 今後の野望

ここまでなら「別にRaspberryPiじゃなくて良いのでは？」と思われるかと思うのですが、実はさらなる野望がありました。

1. 自室の温度変化をグラフ化する
2. RaspberryPiにつながる赤外線モジュールを買う
3. エアコンをオンオフするコマンドを投げられるようにする
4. 自分が自宅にいないのに、室温と外気温が大幅に異なったらエアコンをオフにするコマンドを投げる
5. 自分が自宅に近づいていて、かつ室温が適正値（23度±2度あたり）を外れていたらエアコンをオンにするコマンドを投げる

3はスマートフォンの位置情報をトリガーにするとかWebカメラ置いてみて画像の変化を検出するとかでなんとかできそうですが、4は家の前を通り過ぎることがあるかもしれないのと地下鉄移動が多いのでちょっと難しそう。あと、エアコンのステータスは取れないので（取れてたら温度計の必要がない）温度を見て失敗してたらリトライする必要があるかもしれません。

夢が膨らんだところでおしまい。
bash環境設定ファイル処理の流れ

#BASH
[*The GNU Bourne-Again SHell*](http://tiswww.case.edu/php/chet/bash/bashtop.html)
![](http://tiswww.case.edu/php/chet/img/gnu-head-sm.jpg)

bash起動時にどのような流れで環境設定ファイルが読み込まれるかのメモ

##bash環境設定ファイル

<dl>
	<dt>.bash_history</dt>
	<dd>bashで実行したコマンドの履歴</dd><br>
	<dt>.bash_profile</dt>
	<dd>ログイン時に実行される環境設定</dd><br>
	<dt>.bash_logout</dt>
	<dd>ログアウト時に実行される環境設定</dd><br>
	<dt>.bashrc</dt>
	<dd>.bash_profileからの呼び出しやシェル起動時に実行される環境設定</dd><br>
	<dt>.bash_login</dt>
	<dd>.bash_profileがない場合に使用されるログイン時の環境設定</dd><br>
	<dt>.profile</dt>
	<dd>.bash_profileや.bash_loginがない場合に使用されるログイン時の環境設定</dd><br>
</dl>


##ログインの流れ

**ログイン**
|
|
**.bash_profile** -- 
|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|
|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|
|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;**.bash_login** --
|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|
|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|
|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;**.profile**
|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|
|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|
|--------------------------
|
|
**.bashrc**
|
|
  
***

##ログアウトの流れ

**.bash_logout**
|
|
**ログアウト**
GitHubの草のSVGをコマンドラインで取得する

個人的に対外的なコード書いてるかの指標にGitHubの草、しかもパブリックな状態の草状況を自動で監視したかった(意味不明な文章だ)。

試行錯誤の末、単にシェルのワンライナーでできた

```bash
curl https://github.com/mizchi | awk '/<svg.+class="js-calendar-graph-svg"/,/svg>/' | sed -e 's/<svg/<svg xmlns="http:\/\/www.w3.org\/2000\/svg"/' > grass.svg
```

結果はこんな感じにブラウザやFinderのQuickLookで見れる

![Screen Shot 2015-12-10 at 12.03.49 AM.png](https://qiita-image-store.s3.amazonaws.com/0/229/e39351fc-7bc1-5712-3f79-f94a93c11d43.png)
組込機器の HTTP+JSON の未来


直接セキュリティというわけではないですが、最近、組込機器といわれるものでもSDKが提供されることがり、独自にアプリ開発できるものが増えてきているように思います。

それらの例を挙げてみます。



## [RICOH THETA](https://theta360.com/ja/)
360度、全天球カメラですね。
SDKは[こちら](https://developers.theta360.com/ja/docs/v2/api_reference/)。

v1ではPTP-IPでしたが、v2では[Google社のOpen Spherical Camera API Version 1.0（OSC）](https://developers.google.com/streetview/open-spherical-camera/)に変更されました。

OSCコマンド通信は、THETAが HTTPサーバとなり、HTTP + JSON での通信です。

余談ですが、OSCって聞くと普通は[Open Sound Control](https://ja.wikipedia.org/wiki/OpenSound_Control)だと思ってしまいませんかね？スマホのWi-Fi経由でも割とよく使われていると思うのですが、同じ名前にしてしまうと混乱の元ですよねぇ、と思ったり。




## OLYMPUS AIR A01

[スマホと連携ありきのレンズのみカメラ](http://olympus-imaging.jp/product/opc/a01/)。
[カメラとの通信仕様や、Android/iOS用ライブラリが公開](https://opc.olympus-imaging.com/tools/sdk/)されており、通信するアプリケーションが開発可能です。

以下のプロトコルで組み立てるようです。

+ 基本のコマンド通信は、カメラがHTTPサーバとなり、HTTP + XML
+ ライブビューの画像転送は RTP
+ カメラからのイベント通知は TCP

## FlashAir

[FlashAir](http://www.flashair.info/)とは、無線LAN機能を搭載したSDHCメモリーカードです。

似たような製品にEyeFiもあり、[クラウド側のAPIは公開されています](http://www.eyefi.com/developers)が、FlashAirは[自身がHTTPサーバとなり](https://flashair-developers.com/ja/documents/overview/app/)、スマホからのHTTPアクセスによってファイルのダウンロードや設定変更が可能です。それだけではなく、なんとLuaスクリプトの実行ができたり、SDIOを通じてPIO制御までできてしまうというとんでもないSDカードです(褒め言葉)。

基本の通信は、SDカードがHTTPサーバとなりコマンド(URL)を受け付けます。


## ソニー製カメラ、ブラビア、SmartEyeglass, SmartWatch2/3

いつの間にかSony製品では、[いろいろ開発可能](https://developer.sony.com/ja/)になってるようです。知らなかったわー。
PlayStationも入ってますね。へぇ。

こちらも基本のコマンド通信は、カメラやデバイスがHTTPサーバとなり、HTTP + JSONのようです。



## HTTP + JSON 通信の未来
こうやって見てみると、SDKの提供されている組込機器と通信するには HTTPをベースに +JSON(XML)というあたりのプロトコルが使われることが多いようですね。(サンプル数が少ないですけど。)

最近は、カメラを始め、家電は何でもかんでもWi-Fiで接続できてスマホでコントロール可能になってきているように思いますが、それらも HTTP+JSON だったりするのかもしれませんね。


ただ、昨今、iOS開発でもHTTP通信から、HTTPSへの移行プレッシャーが強まっております。
[Networking with NSURLSession in WWDC15](https://developer.apple.com/videos/play/wwdc2015-711/)

また、

+ [Let's Encrypt で手軽に HTTPS サーバを設定する](http://qiita.com/ww24/items/9fa19594b4e3a8eb9b6f)
+ [Let's Encrypt を支える ACME プロトコル](http://jxck.hatenablog.com/entry/letsencrypt-acme)

を読むと、Let's Encryptの登場により、サーバ側もHTTPからHTTPSへの移行が一気に進みそうな気がします。
（ちなみに、Let's Encryptで使われている[ACMEというプロトコル](https://letsencrypt.github.io/acme-spec/)自体も HTTP + JSON のようですね。）

とすると、スマホからはHTTPの通信はできなくなる（できなくさせる）という未来がくるかもしれません。それも意外に早く。

そうなったとき、これら組込機器への接続はどうなっていくのでしょうね？
組込機器との通信もやはりHTTPSが標準となっていくのでしょうか？
カメラ等はまだしも、FlashAirのような組込機器では暗号化の計算自体が苦しかったりするんじゃないですかね。

そんなことを思いつつ。

おわり。
Apache Sparkを勉強して分散処理できますよ！って言えるようになる　その２


# 前回は[こちら](http://qiita.com/rtoya/items/d80e59371832877fbbb1)

# はじめに
今日は`spark`の標準ライブラリである[MLlib](http://spark.apache.org/mllib/)を利用してみます。 
`spark`には`MLlib`を含め、４種類の標準ライブラリがあります。
 

![スクリーンショット 2015-12-09 23.29.43.png](https://qiita-image-store.s3.amazonaws.com/0/18932/a29cc5ee-cf04-2fa0-2ac7-a10cafa7eac1.png "スクリーンショット 2015-12-09 23.29.43.png")

他のライブラリに関しては、[こちら](http://spark.apache.org/sql/)を参照ください。

# MLlibとは
spark上に実装されている機械学習のライブラリです。
機械学習の実装はすごくムズカシイのですが、MLlibは割と簡単に試すことができ、サポートしているアルゴリズムも豊富なのでとっつきやすい気がします（私見です）。

とりあえず、協調フィルタリングを試してみます。
協調フィルタリングについては[このブログ](http://tech.albert2005.co.jp/blog/2014/10/31/spark-mllib-collaborative-filtering-1/)が大変参考になりました。


# 実装手順

### 1. 必要なライブラリをimportする
```
from pyspark.mllib.recommendation import ALS, MatrixFactorizationModel, Rating
```


### 2. データを読み込んで`RDD`を生成する
テストデータは[コレ](https://github.com/apache/spark/blob/master/data/mllib/als/test.data)を利用します。

レビューした人のID、レビューされたもののID、レビュー結果といった感じでしょうか？


```
data = sc.textFile("data/mllib/als/test.data")
```


### 3. 適当に変数を設定します

rank：特徴量数、numIterations：繰り返し数といった変数を設定します。
rankは増やせば増やすほど性能が改善するらしいです。10ぐらいから変わらなくなるらしいのでとりあえず10にしときます。
numIterationsも増やせば増やすだけ学習サイクルが増えるので精度が上がる筈です。
これもとりあえず10回にしときます。


```
rank = 10
numIterations = 10
```

### 4. modelを作成して、`data`を学習させます
1. で読み込んだライブラリの`train`メソッドを叩くだけです。

```
model = ALS.train(ratings, rank, numIterations)
```


### 5. 適当に値をぶっこんで予測をしてもらいます。

```
>>> model.predict(2,4)
1.0015225077674874
```
`（2,4）`に対する正解は１なのでまぁまぁいいのかな？


### 6. モデルを保存したり、ロードしたりします。
折角学習させたデータなので、保存して任意のタイミングで利用できるようにしたいですね。
`save`と`MatrixFactorizationModel.load`を利用すればそれも簡単にできるそうです。

```
model.save(sc, "own/model/path")
sameModel = MatrixFactorizationModel.load(sc, "own/model/path")
```


# 終わりに
`ALS`を利用するところはわりかしさくっとできました。
どちらかというと、アルゴリズムの選定や理解の方が厄介そうです。

それくらいAPIは素晴らしいので何かしら機械学習を試してみたい方は
`spark`から始めてもよいとおもいました。

[こちら](http://spark.apache.org/docs/latest/mllib-guide.html)に試せるアルゴリズムが紹介されているのでご参照ください。

次回は、「mySQL」とつなぐ、仮想サーバを用いて分散処理を試してみる
のどちらかを書こうと思います。

おわり
mininet上のhostからInternetに接続する


# はじめに
今回はmininet上のホストからInternetに接続してwww.google.comにpingを繋ぐ方法のメモです。

# 問題点
[前々回](http://qiita.com/kojisato118/items/bc61f3bcd93211df300a)に立てたmininetの仮想ネットワーク上のhostから```$ping www.google.com```を実行したところすべてパケットロスする。

# 原因
You can't ping google.com because your Mininet network is not connected to the internet. This is usually a good thing! Usually Mininet networks use a non-routable IP address range like 10.0.0.0/8.
https://github.com/mininet/mininet/wiki/FAQ#why-cant-i-ping-google-from-my-mininet-hosts

# 解決策
リンク先に書いてありますが
mnコマンドで```--nat```オプションをつければよいです。
しかし、version2.2以降です。なんとRyuのチュートリアルイメージの環境では、version 2.2より前だったので使えません。(具体的な数値は忘れました)

# mininetのversion up
[ここ参照](https://github.com/mininet/mininet/wiki/FAQ#how-do-i-update-to-a-new-version-of-mininet)
Defined Type の使い所を考える

今日は、Defined Typeの使い所を考えます。

## Defined Type とは

* https://docs.puppetlabs.com/puppet/latest/reference/lang_defined_types.html

公式の例を整形 && 少しわかりやすく変更。硬式の記法がまるっきりPuppet4なので、慣れている3互換で失礼しますね...

```puppet
define apache::vhost (
  $port,
  $docroot,
  $servername = $title,
  $vhost_name = '*'
) {
  include apache # Package['httpd'] と Service['httpd'] が定義されている
  include apache::params # 下の $apache::params::vhost_dir が定義されている
  $vhost_dir = $apache::params::vhost_dir

  file { "${vhost_dir}/${servername}.conf":
    content => template('apache/vhost-${servername}.conf.erb'),
      # パラメータとして定義した変数名を普通に使えるし、テンプレート内部でも使える
    owner   => 'www',
    group   => 'www',
    mode    => '644',
    require => Package['httpd'],
    notify  => Service['httpd'],
  }
}
```

特定のType操作の組み合わせを、新しいTypeとして定義する機能です。この例では、Apacheのvhostごとのサーバ設定を独立したTypeとして定義していますね。

わかる人向けには、ChefでいうLWRP的なものです。

## 具体例をもう少し

Consul KVの値を、べき等に登録するには、以下のようにcurlのコマンドを利用して記述できます。

```puppet
$key = 'Foo'
$value = 'Bar'
exec { "curl -X PUT -d '${value}' http://localhost:850/v1/kv${key}":
  unless => "test \"$(curl http://localhost:850/v1/kv${key}?raw)\" = '${value}'";
}
```

このcurl、何をやっているのかわかりづらいので、 `consul::kvs` という名前をつけてあげるとわかりやすく、しかも使い回しもできるようになるという感じです。

```puppet
define consul::kvs (
  $key = $name,
  $value = '',
  $consul_master_host = 'localhost:8500'
) {

  exec { "curl -X PUT -d '${value}' http://${consul_master_host}/v1/kv${key}":
    unless => "test \"$(curl http://${consul_master_host}/v1/kv${key}?raw)\" = '${value}'";
  }
}

consul::kvs {
  'Foo':
    value => 'Bar';

  'XXX':
    value => 'YYY';
  #...
}

```

## 考察

便利機能ですが、幾つか癖があります

* 適切な名前付けをしないと、何をするものか分かりづらくなりがち
* 外部依存するクラスが多すぎると、依存関係の解決がすっきりしない

最初のvhostの例は、 include/require もいいんですが、 [宇宙船演算子](http://qiita.com/hfm/items/5569b02ffccad8781164) を用いて以下のような書き方のほうがわかりやすいかもしれません。

```puppet
   Package['httpd']
-> Apache::Vhost<| |>
~> Service['httpd']
```

個人的には、Defined Typeは単純に「DRYにするぞ！！１」と濫用するものではないように思います。
その定義すべきTypeが、 **独立したリソースタイプとしてみなせるか** ？という観点で考えて、みなしたほうがコードがすっきりするような抽象化ができるのなら、上手に使えるのではないでしょうか。

個人的な経験では、以下のようなものをDefined Typeにしてみたりしました。

* Consul KVの値
* Consulのcheckによる監視項目
* [Mackerel](https://mackerel.io/) のロール (と言ってもテンプレートで `roles = [ "service:<%= @role_name %>" ]` をファイルに吐き出すだけ)
* sysctlで定義するカーネルパラメータ

参考になればと思います。
Android セキュリティ

android　1.6の話です。古い。
#きっかけは
bluetoothの開発をしていた時。bluezが組み込まれているのに
セキュリティの為、利用できない。でも、利用したい。
調べると、root奪取すれば、良いことがわかった。
さらに、調べるとandroidのlinux kernelに脆弱性が発見されていた。
CVE-2009-1185(2009年3月)
#一時的にrootで実行できる機能
ipaの報告読むと2011年6月までに対策済みとの事。
でも、一覧に自分の機種は無い。

ソースは、google検索で入手できた。
アプリに組み込んでみた。
手順に従い、見事、sdptoolが実行できた。
電源を切ると、元に戻った。
#結論
Androidの脆弱性対策は、非常に遅かった。
Arch Linux インストールCD x86_64版のみのISOを作成

この記事はArch Linux Advent Calender 2015の10日目です。

* Arch LinuxのインストールCDはi686とx86_64が混在しています。
* 片方だけ、というのが見当たらなかったので自分で作ることにしました。

## 手順

```bash:ISOを展開
mkdir iso tmp
mount -o loop archlinux-2015.12.01-dual.iso iso
cp -a iso/* tmp/
umount iso && rmdir iso
cd tmp
```

```bash:不要なファイルを削除
rm arch/i686/airootfs.sfs
rm -r arch/boot/i686
# EFIが不要な場合
rm -r EFI
```

```bash:再構築
genisoimage -l -r -J -V "ARCH_201512" \
 -b isolinux/isolinux.bin \
 -no-emul-boot \
 -boot-load-size 4 \
 -boot-info-table \
 -c isolinux/boot.cat \
 -o ../arch-custom.iso .
```

## まとめ

* `663M`から`318M`に減りました。
Paiza Online Hackthon ⑦ にチャレンジした話

## きっかけ

先日のことです。研究室の数人が `水着` に熱くなっていました。

というのも、[paizaオンラインハッカソンの第7弾](https://paiza.jp/poh/ando)はプログラミンの問題を解いていくことでバーチャル彼女の着せ替え用アイテムがゲットできるというものでした。

`水着` をゲットするため、問題にチャレンジです。

## 問題

![https://gyazo.com/355a6b7d03e6989118fa7f035fe90eb5](https://i.gyazo.com/355a6b7d03e6989118fa7f035fe90eb5.png)


みんなが水着をゲットしていく中、僕は全くできませんでした。。

僕「みんな、なんでそんなにスラスラ書けるんだ？」

後輩「慣れてる言語でやってるからですよ！」

僕「（慣れてる言語なんて僕にはないです、すいません）」 :astonished:

頭でアルゴリズムを考えながら、コーディングするなんてそんな高度なことできませんでした。
（精進します汗）

## チャレンジ

### 漠然とした方針

$ N! $ の素因数分解を考えてみます。

$$
N! = 2^{a} \cdot 3^{b} \cdot 5^{c} \cdot \dotsm
$$

とした時、 $ a > c $ なので（帰納法で証明できます。）

```math
\begin{align}
N! &= M \cdot 2^{a-c} \cdot 10^{c} & (M \in \mathbb{N} ) \\
&= M' \cdot 10^{c} & (M' = M \cdot 2^{a-c}) \\
\end{align}
```

ここで、求めたいものは $ M' $ の下９桁です。

つまり、計算の過程で割り算が無ければ、下９桁同士の掛け算が正確に行えればいいので、１８桁まで扱える変数があれば、特にオーバーフローは気にしなくていいのかな、と思いました。

ここで、`符号なし 64-ビット 整数` が $ 0 〜 約18 \times 10^{18} $ なので、常に $ 10^{9} $ の余りを求め、且つ、割り算を使わず、 $ M' $ を直接求めれば、下９桁ならいけるだろうと思いました。

ここら辺情報系なのによくわかってないです。

### 数学的な方針

ここで、自然数 $ N $ が与えられた時に５の倍数以外の階乗を求める関数 $ f ( N ) $ を考えます。

$$
f (N) = \prod_{i \neq 5m}^{N} i 　　　　 ( m \in \mathbb{N} )
$$

$ N = 38 $ の時を考えてみます。

```math
\begin{align}
38! &= f(38) \cdot 5 \cdot 10 \cdot 15 \cdot 20 \cdot 25 \cdot 30 \cdot 35 \\
&= f(38) \cdot 5^{7} \cdot 7! \\
\end{align}
```

ここで、 $ 7 = \left[ \frac{38}{5} \right] $ で $ 38 $ の中の $ 5 $ の倍数の数です。

$ 7! $ に関しても再帰的に $ f $ を用いると

```math
\begin{align}
38! &= f(38) \cdot 5^{7} \cdot f(7) \cdot 5^{1} \cdot f(1) \\
\end{align}
```

ここで、 $ 1 = \left[ \frac{7}{5} \right] = \left[ \frac{38}{5^{2}} \right] $ で $ 38 $ の中の $ 25 $ の倍数の数です。

また、 $ 8 = 7 + 1 $ は $ 38! $ の中の $ 5 $ の因数の数です。

ここで、求めたい $ M' $ は

```math
\begin{align}
M' &= \frac{N!}{10^{c}} & \\
&= \frac{38!}{10^{8}} & ( N = 38, c = 8 ) \\
&= \frac{38!}{2^{7} \cdot 5^{7} \cdot 2^{1} \cdot 5^{1}} & \\
\end{align}
```

$ f'(N) = \frac{f(N)}{2^{\[ \frac{N}{5} \] }} $ とおくと、

```math
\begin{align}
M' &= f'(38) \cdot f'(7) \cdot f'(1) & ( 2^{0} = 1 ) \\
&= \prod_{i=0}^{k} f' \left( \left[ \frac{N}{5^{i}} \right] \right) & ( 5^{k+1} > N \geq 5^{k} )
\end{align}
```

となります。

$ f' $ が割り算をしているのが気になりますが、この時点の実装でチャレンジは通りました。

$ M' = \dotsm \cdot f'(5) \cdot f'(1) $ で終わって、且つ、１０桁以上になるような数、例えば $ N = 125 $ なんかではうまくいかないんじゃないかなと懸念しましたが。

でも、もういいです。

### 実装

こんな感じでした。

```
package main
import "fmt"
func main() {
	var N uint64
	fmt.Scan(&N)
	var fact uint64 = 1
	for N >= 5 {
		fact = (fact * FactorialExceptingMultiple5(N)) % 1000000000
		N = N / 5
	}
	fact = (fact * FactorialExceptingMultiple5(N)) % 1000000000
	fmt.Printf("%d\n", fact)
}

func FactorialExceptingMultiple5(n uint64) (fact uint64) {
	fact = 1
	var i uint64 = 1
	for i <= n {
		if i%5 != 0 {
			fact = (fact * i) % 1000000000
		} else {
			fact = fact / 2
		}
		i++
	}
	return
}
```

### 最後に

読んでくださった方ほんと中途半端で且つしょうもない内容でごめんなさい。

ちゃんとアルゴリズムとかプロコン系の勉強したいと思います。

[こちら](http://qiita.com/PlanetMeron/items/63ac58898541cbe81ada "Qiitaの数式チートシート - Qiita")のページが `Qiita` で数式書くのに非常に助かりました。