OmniAICreator/Qiita-1.07M huggingface dataset:
猫会社の CTO 論

[猫社員のいる会社](https://fb.me/qnote.inc)で有名な [qnote](http://www.qnote.co.jp) のアドベントカレンダー2015始まります！
と、Qiitaらしくない感じの出だしですが、初日は繁田が担当します。


## はじめに
僕は猫会社で一応 CTO やってます。
ところで CTO って何かご存じですか？
そもそも何の略？

　C=キャット、T=トーク、O=おじさん

猫会社なだけに間違ってはないですが、そうではなくて、

Chief Technology Officer

の略ですね。日本語に訳すと、

　採鉱技術責任者（↓実際に送られてきた）
　
![258075639.jpg](https://qiita-image-store.s3.amazonaws.com/0/6102/7f40b139-379a-472b-0104-2e794a5b50c3.jpeg "258075639.jpg")


とかいうしょうもない前置きはさておき、説明するまでもなく最高技術責任者のこと。
というわけでアドベントカレンダー初日は弊社規模での CTO 論についてちょっと思っていることを偉そうにお話します。どうか関係各所で炎上しませんように。

## 肩書としてのCTO
まず最初にお断りしておくと弊社は25名程度(猫社員含む)の規模で受託開発が主業務の零細企業です。会社に猫が居たりといろいろ変わったところがあるので、必ずしもここに書いたことが全ての会社に当てはめられるわけでもなく、また特定の人物をdisってるわけでもないので、予めご了承下さい。

さて、CTO というと、とある経営学的には経営者の部類に入るらしいです。僕的には一切自覚したことはありません。大企業ならまだしもうちみたいな零細企業であれば CTO というのはある種のステイタスというかシンボル的なところの意味合いの方が強いのかもしれません。下町の町工場的な技術経営を目指している弊社なら尚更、どちらかと言うと対外的なアピールとして使われる事が多い気がしています。大事な案件を担当したり、原稿書いたりするときに箔が付くと言えばわかりやすいですかね。

なので、個人的にはCTOは「役職」ではなく「肩書」だと思っています。
（実際、僕の給料明細の役職欄は空白です）

## 技術的判断というおしごと
思い起こせば僕が CTO に着任したのは10年くらい前で、着任って言ってもある日突然社長から「今日から CTO ね」って昼飯の帰りに軽く言われたのが始まりだったと記憶してます。当時IT系の CTO と言えば GREE の藤本さんが有名で、僕も Ethna の開発コミュニティに入ったりとお近づきになれたタイミングでもあったので、いろいろお話が聞けて CTO の理想像みたいなものが出来上がりました。
以来、10年ほど最高技術責任者というを肩書を背負っていろんなお仕事をさせて頂きました。弊社は受託専門の会社なのですが、時には大きな失敗もしつつ、時には胃潰瘍になりながらも、責任を意識しながら様々な技術的判断をしてきました。

この技術的判断というのがまた難しいお仕事で、請負会社の立場上、品質を保つというのは当たり前なのですが、その責任の重さに負けて冒険をせず無難な(枯れた)技術の選択ばかりしているといつまでたっても経験が得られないし、だからと言って、聞いたこともないような最先端すぎる技術を「流行ってるんで！」とか「やってみたかったんです！」という理由だけで導入し、もし失敗でもしたら「なんでこんなライブラリ使ったの！」って絶対なるわけで、この絶妙な駆け引きの中、ひとつの選択をするのは難しくもあり、それでいてやり甲斐のある選択だと思います。実際分間数万というPVのサービスで当時無名だったPHPのテンプレートエンジンSmartyの採用を選択していざリリースした瞬間高負荷でサーバが落ちた時はなかなかしびれました。

まぁ、いきなり実戦投入せずに普段から勉強しとけよって言われればそれまでなのですが、机上論で得た知識と実践での得た知識は全く違い、ぐぐっただけの知識よりも経験に基づく知識の方が3000倍くらい価値があるものだということもこの仕事をやってて学んだことの一つでした。毎回新しい案件に望む度に2〜3個は新しい技術を盛り込んで終盤に後悔することが多いのですが終わってみればその後悔も含めてが心地よい経験値となるこのマッチポンプ感はやめられません。


## で、役割は？
こういった技術的判断以外にも、単発で書籍を書かせてもらったり、某有名技術雑誌や技術ポータルで連載を担当させて頂いたり、OSS のプロジェクトに参加したり、地味ではありますがそれなり胸を張って CTO だと言えることはしてきたつもりです。

本当に？

そもそも、CTO ってナンダッケ？と書きながらふと思い、冷静に初心に返ってみました。
当時の藤本さんのお言葉を思い出します。

「その会社に技術という血を通わせ続けること」

みたいなことを CTO の役割としておっしゃってたか、どっかの記事に書いていたか、そもそも夢だったか忘れましたが、受け売りですが CTO の役割はこういうことなんだと思います。

でも、熱い技術論は納期や利益優先の現場では敬遠され、時として反発が生まれ、気がつけばそれを恐れて技術提案をする頻度が少なくなってて、びびってんじゃねーぞゴルァみたいなことを最近後輩から指摘されて<del>ムカついて</del>反省してます。ごめんなさい。

## つまり
横道に逸れましたが、CTO の役割は会社の”道標"であり、仲間の技術者達に常に新しい技術を体験させることが仕事だと僕は思います。

でも、そのために他の社員の追随を許さない絶対的なセンスや圧倒的な経験の差は必ずしも必要ではないということ、また、全ての技術分野において頂点である必要はないということも同時に付け加えておきます。もちろんそれらはあったほうがよいですが、それよりもなによりも、技術に対する貪欲さや、知識を追求する姿勢、さらに技術を身につけることの"楽しさを伝える技術"の方が大事なんだと思います。

ちょっと言い訳じみた感じになりましたが、言いたかったことは、CTOはそれほど華のある肩書ではなく、いわゆる後方支援。裏方だと言うこと。あと経験値が足りなくても若い人はどんどん"道標"を目指すべきだと思います。スタートアップとかで1年目や2年目でCTOというのもよく聞きますが全然アリだと思います。


## さいごに
そんな弊社もありがたいことに、人数も増え、社内外の勉強会に参加する人も増えて、ノウハウをアウトプットする機会が増えました。そして何より嬉しかったのはチームメンバからこのアドベントカレンダーの提案を受けたことです。ちょうどアドベントカレンダー受付開始のニュースを見てて「企業枠でこういうのできる会社って憧れるなぁ。」と思っていた矢先です。とても嬉しい反面、道標になれなかった自分は終わったなと感じるのでありました。もちろん良い意味で。

と、引退するの？死ぬの？的な流れになったところで終わりにしたいと思います。

Qiita らしからぬポエムな感じで最後はしりつぼみになってしまいましたが、まだまだ若いのには負けませんよとさらに曖昧な感じにしておきます。どうか削除対象とならないよう祈りつつ、明日から本番の弊社アドベントカレンダーをお楽しみに！
制御工学が難しい理由について考えてみた

どもども
面白くないけど、ためにならない記事ってのを書いてやろうかなと思います
ほんとに面白くないのに読もうとしてるってことは本当に暇なんですねあなた
むしろ感心しましたよ


さて、意味のない煽りに耐えてまだ読んでくださっている方、なんか知りませんけどあざます！

↓ここから記事↓
**この記事は[高知工科大 Advent Calendar 2015](http://www.adventar.org/calendars/965)の1日目として書いた記事です**


どーもこんにちわ
ゴリラの息子です
![20151121194311ef6.png](https://qiita-image-store.s3.amazonaws.com/0/103256/85fa1b33-0f19-ed28-f755-f3c152eaa7ce.png)


今回のテーマは制御工学についてです
ゴリラの息子である私には少し難しいかも…なんてね！ウホホッ

制御工学って言っても、内容については一切触れませんよ(ﾟ∀ﾟ)

というのも、制御工学ってなんか難しい印象があるんですよねー
その”なんか”って部分をもうチョイ具体的にしたいってのがこの記事の目ウホウ、失礼、目標ですね
つまり…

**制御工学が難しい理由について考えてみた**

というわけなんですね！（タイトルそのまんま）

でも、やっぱ、私もゴリラの息子では始めての大学工学部学生とはいえ、これを人に説明するのは難しいんじゃないかなと思います
なので、皆さんも記事が難解で何回読んでもわからないっていう苦情はなしでお願いしますよ？ウホホッ

# １）前提となる科目が明確でない

一つ目の理由にこれはあるんじゃないかな？と思います
というのも、たとえば、材料力学や流体力学、電子回路関係、電場
この辺りの工学は難しいとはいっても、なんとなく理解できます
それはやっぱり、高校生のころにわからないながらも勉強した、物理ってのがあるからなんじゃないかな？と思うわけです

材料力学はそのまま力学に変形の概念を追加
流体力学は波や圧力の話からの発展
電子回路も電場も、高校物理にそのままの分野が存在します

では、制御工学は？
あえて前提知識を探すならば、数学ってところでしょうか？
しかし、それがわからないほどなぞのベールに包まれています

そう！まるでバナナ！
バナナの皮はそれほどおいしくありませんが、中を開けたらウホ！ビックり！
まさに制御工学はバナナといえるでしょう！ウホウホホ！
![banana.png](https://qiita-image-store.s3.amazonaws.com/0/103256/80c500c9-8389-1605-2481-b408b23600cc.png)


# ２）何に役立つのかがわかりにくい
材料力学は、材料の特性を理解すれば、どの木に登るのが折れにくいかがわかります
流体力学を理解すれば、どの毛を処理するのが一番泳ぎやすいかわかります
電子回路も勉強すれば、メカニコングを作れることがわかります
![201511211951440ff.png](https://qiita-image-store.s3.amazonaws.com/0/103256/5bb54e19-2090-3f8d-d7d8-9e90b199a398.png)

でも制御工学は？え？メカニコングを制御できる？
でもどうやって？

そう、このどうやっての部分が制御工学で計算していてもわかりにくいのです
つまり、理論の話が素直に実生活に響かないわけです

だから脳が理解しようとしないわけです(´；ω；｀)
制御の問題解くたびに、これは何の役に立つのだろう状態というわけなのです
全く困ります(´・ω・｀)

# ３）人間向けの参考書しかない
一番難しい原因はこの辺りでしょう(´・ω・｀)
なんといっても、制御工学の参考書は、人間が書いた、人間向けのものしかありません
ページはめくりにくいし、字は細かいし、すぐに破ける！

本当に嫌になってしまいます
周りの友達に制御工学のことを聞いても、

「ウホ？ウホホホ？ウ～～ホ？」

という、なんとも気の抜けた返事しかかえって来ません
3本もバナナをおごったのにです！！
怒りドラミングですよ！

しかし、仕方ないのかも知れません(´・ω・｀)
実際、私以外に人間の工学を学んでいるゴリラの息子は見かけたことがありません
なので私はそんな恵まれないゴリラの息子たちのために、ゴリラで初めて制御工学の本を書こうと思っています
これは私の夢です

非常につまらない記事でしたが、ここまでお読みくださってありがとうございました
jsPlumb 2.0.3のnpmパッケージはisomorphicでない


パッケージ名は全て小文字の`jsplumb`です。

```
npm i jsplumb
```

# window.navigator依存のためNode.jsでは動きません

requireしてみます

```js:index.js
var jsPlumb = require('jsplumb')
```

```
node index.js
```

[window.navigator.userAgent](https://developer.mozilla.org/ja/docs/Web/API/NavigatorID/userAgent)に依存しているため、Node.jsでは実行できません。

```
/Users/shigerunakajima/jsPlumb_test/node_modules/jsplumb/dist/js/jsPlumb-2.0.3.js:627
        android: navigator.userAgent.toLowerCase().indexOf("android") > -1
                 ^

ReferenceError: navigator is not defined
    at Object.<anonymous> (/Users/shigerunakajima/jsPlumb_test/node_modules/jsplumb/dist/js/jsPlumb-2.0.3.js:627:18)
    at Object.<anonymous> (/Users/shigerunakajima/jsPlumb_test/node_modules/jsplumb/dist/js/jsPlumb-2.0.3.js:1202:4)
    at Module._compile (module.js:425:26)
    at Object.Module._extensions..js (module.js:432:10)
    at Module.load (module.js:356:32)
    at Function.Module._load (module.js:311:12)
    at Module.require (module.js:366:17)
    at require (module.js:385:17)
    at Object.<anonymous> (/Users/shigerunakajima/jsPlumb_test/index.js:1:77)
    at Module._compile (module.js:425:26)
```

[最新のソースコード](https://github.com/sporritt/jsPlumb/blob/1b4922dc64fca263db107b697b94225c13a9e3a6/lib/mottle-0.7.1.js#L8)でも特に変わりません。

# 依存ライブラリが含まれないためbrowserifyでも動きません
```
browserify index.js -o bundle.js
```

```html:index.html
<script src="bundle.js" charset="utf-8"></script>
```

index.htmlをブラウザで開くとエラーが起きます。

![スクリーンショット 2015-12-01 0.25.34.png](https://qiita-image-store.s3.amazonaws.com/0/15964/1fac01a6-626c-1bda-3a09-93d9392572a0.png "スクリーンショット 2015-12-01 0.25.34.png")

[ReferenceError (Mottle is not defined) · Issue #437 · sporritt/jsPlumb](https://github.com/sporritt/jsPlumb/issues/437#issuecomment-153328125) によると2.1.0で直るそうです。
windowsのgitのssh_configを設定する(cmder

**これは古い記事なので、Windows10 RS4でOpenSSHが導入された関係で不要になっている可能性があります。**

この記事は以下のURLを参考にしています。
http://qiita.com/ques0942/items/1a6c198c6d16ac297f2c

## 環境

* Windows 10
* cmder
* git 1.9.4.msysgit

## 概要？

cmderからgitをssh経由でcloneしたかったのですが、ssh_configが上手くいかず困っていました。

3ヶ月ほど前にはこれを諦め、httpsでの接続にしたのですが面倒だったのでsshでクローンしたいなと。

基本的にやったことは上記のURLと同じようなことです。

## １．ホームディレクトリ/.ssh/configを用意する

これは自分が最初にこれを指定していたからというのもありますが、こうしたほうが後々困らないと思うので私はここに用意しました。

## ２．シンボリックリンクを利用してリンクを貼る

まず、gitをそのままwindowsに入れていて、gitに入っていたsshを利用した場合、ssh_configのパスは以下に存在する必要があります。

```
Gitをインストールしたパス/Git/etc/ssh/ssh_config
```

です。自分はCドライブに入れていたので、`C:\Program Files (x86)\Git\etc\ssh\ssh_config`となります。

先ほどおいたのはHOMEの.sshのconfigなので、これにをベースにリンクを貼ります。

### ３．コマンドプロンプトを管理者権限で開く

コマンドプロンプトを管理者権限で開かないとシンボリックリンクが貼れません。
また、通常では`C:\Program Files (x86)\Git\etc\`以下にsshフォルダが存在しないため、フォルダを作る必要があります。

```
mkdir C:\Program Files (x86)\Git\etc\ssh
```

その後に、シンボリックリンクを貼ります。

```
mklink C:\Program Files (x86)\Git\etc\ssh\ssh_config C:\Users\ユーザ名\.ssh\config
```

です。`ln -s`と違って順番が逆なので注意してください。(まあ怒られますが

終わりです。これで後はconfigを修正すればいけますっ

ではー
1日目

1日目ということで、まずは、このアドベントカレンダーについて少し調べてみました。

Wikipediaによると、
"アドベントカレンダー（Advent calendar）は、クリスマスまでの期間に日数を数えるために使用されるカレンダーである。アドベントの期間（イエス・キリストの降誕を待ち望む期間）に窓を毎日ひとつずつ開けていくカレンダーである。"とあります。
https://goo.gl/bFQEEt

私にとってお菓子を食べる印象が強かったこのカレンダーですが、エンジニアの間では、"技術系Advent Calendar"として、"Webに関するテーマをもとに12月1日から25日にわたって参加者たちが数珠つなぎにブログを書く"のが、恒例のイベントとなっているようです。

参考までに昨年のまとめサイトがありましたので、紹介します。

・気になった2014年の技術系Advent Calendar（アドベントカレンダー）をリストアップしました　http://gakublog.com/archives/1181

・本日12月1日より，プログラマ有志による2014年の技術系Advent Calendarが各所ではじまる　http://gihyo.jp/news/info/2014/12/0101

それでは、今年もスタートです！！！
percona xtrabackupを使ってみました

# はじめに

MySQLのslaveバックアップに、普段はmysqldumpを使用しているのですが、perconaのxtrabackupを使う機会があって、色々ハマったのでメモ。

# インストール

フリーのオープンソースなので、以下からダウンロードできます。

https://www.percona.com/software/mysql-database/percona-xtrabackup

perconaのyumリポジトリをインストールして、yumで入れるには以下が参考になります。

https://www.percona.com/doc/percona-xtrabackup/2.2/installation/yum_repo.html

## 依存関係

rpmコマンドで入れようとすると、依存関係でperlのPKGが足りないと言われました。
以下が依存関係を解決する為に実行したコマンドです。

 sudo yum install perl-Time-HiRes

これを実行すると、他にも色々一緒に入りました。

そしてxtrabackupをインストールすると、以下のファイルがインストールされます。

/usr/bin/innobackupex

これはxtrabackupのラッパーで、コマンドでこっちを叩きました。

# 実行時のハマりどころ

## rootじゃないとダメ

バックアップ用のユーザを作って、バックアップファイル送信先のサーバに公開鍵を使ってノンパスログインを行っているのですが、一般ユーザの権限では、よく分からないエラーが出て失敗しました。

コマンドの引数ではMySQLにrootでログインしてるので、OSユーザはなんでもいいだろうと思っていたのですが、ダメみたいです。

コマンドオプションを色々変えてみてもダメで、rootでやってみたら、すんなり実行できたので、visudoでバックアップ用ユーザにsudoをNOPASSWDで実行できる設定をしておくと、コマンドラインでsudoつけるだけでうまくいきました。

## Maximum Number Of Open Filesがデフォルト値だとダメ

DBのレコード量にもよるかもしれませんが、デフォの1024だと、これまたよく分からないエラーが出ました。

sysctlなどのconfに大きな値を記載してOS再起動しても良いですが、コマンドを叩く前に、ulimit -n xxxxのコマンドで大きな値を入れておくとうまくいきました。

他にも値を大きくする方法はありますが、バックアップコマンドのシェルスクリプトだけで実現するには、ulimitコマンドが手頃です。

# バックアップファイルの形式

普通に圧縮した各バイナリを日時のフォルダの中に吐き出すバックアップの他に、ストリーミング方式があり、今回はそちらを使用しました。

公式ドキュメントにもありますが、以下のオプションで実行できます。
$ innobackupex --stream=xbstream --compress /root/backup/ > /root/backup/backup.xbstream


この方式だと、一個のファイルとして保存できるので、それを更にtarコマンドで圧縮して、バックアップ送信先サーバにrsyncで送るのに便利です。

# バックアップの定期実行

Linuxではおなじみの、crontabを使います。
バックアップ用のユーザで以下のコマンドを実行して、夜中や早朝などに実行されるように設定しておくと、負荷の少ない時間帯にバックアップできて良いと思います。

crontab -e

# おわりに

今までもMySQLに付属のdumpコマンドでも大きな問題は無いのですが、公式サイトを見る限りxtrabackupの方が高機能そうです。

まだ設定したばかりで運用していないので、そのメリットがよく分かっておりませんが、違いが分かってきたら、追記したいと思います。
これから Crystal を始める方へ: Crystal 日本語情報まとめ

**この記事は [Crystal Advent Calendar 2015](http://www.adventar.org/calendars/800) の 1 日目の記事です**

はじめまして。[Crystal-JP](http://crystal.connpass.com/) という Crystal を日本に普及させるための活動をしてます [@pine613](https://twitter.com/pine613) と申します。本日から始まる Crystal Advent Calendar 2015 をよろしくお願いします。

本記事は、これから Crystal を始める方向けの情報を集めた記事になっています。

しかし Crystal は開発中の変化が非常に早い言語であるため、以下の記事の内容は古くなっている場合があります。そのため、**似たような記事が既に存在する場合** でも **新しく最新の内容で記事** を書いていただけると非常に助かります。

# Crystal とは何か
- [Rubyベースの文法で高速に動作するNativeコードにコンパイルされるCrystal言語の情報まとめ #crystal #ruby](http://tbpgr.hatenablog.com/entry/2015/06/18/235914) - Hatena Blog (2015/06/18)
- [西日暮里.rb 1周年記念回LT Crystal](https://speakerdeck.com/ariarijp/xi-ri-mu-li-dot-rb-1zhou-nian-ji-nian-hui-lt-crystal) … SpeakerDeck (2015/06/29)
- [「Ruby風味のプログラミング言語」四天王現る！Elixir,Crystal,Opal,Mirahまとめ #ruby](https://codeiq.jp/magazine/2015/07/26120/) … CodeIQ MAGAZINE (2015/07/22)
- [Crystal - Ruby 風シンタックスな静的言語の紹介 -](https://speakerdeck.com/pine613/crystal-ruby-feng-sintatukusunajing-de-yan-yu-falseshao-jie-long-talk-ban) … SpeakerDeck (2015/07/31)
- [Crystal](http://www.slideshare.net/tmtm/crystal-51973486) … SlideShare (2015/08/23)
- [Crystal の開発進捗とロードマップ](https://speakerdeck.com/pine613/crystal-falsekai-fa-jin-bu-torodomatupu) … SpeakerDeck (2015/10/23)

# Crystal のインストール方法

- [公式ドキュメント (日本語訳)](http://ja.crystal-lang.org/docs/installation/index.html)
- [crystal langことはじめ](http://masasuzu.hatenadiary.jp/entry/2015/08/02/213454) … Hatena Blog (2015/08/02)
- [Ruby 風な静的言語 Crystal の開発環境を crenv で簡単に構築する](http://qiita.com/pine613/items/54b8d98b8fd416ac73ec) … Qiita (2015/08/03)
- [Amazon Linux で Crystal を動かしてみた](http://dev.classmethod.jp/server-side/language/amazon-linux-crystal/) … Classmethod (2015/08/04)

# Crystal 使い始めに読んだら良さそうな記事
- [Amethyst で HelloWorld](http://qiita.com/akishin/items/ed2353981f30b868756b) … Qiita (2015/07/26)
- [Crystal - Rubyと異なるアクセサの命名 #ruby #crystal](http://qiita.com/tbpgr/items/bacda97e172958c10d6d) … Qiita (2015/08/31)
- [Crystal のパッケージマネージャー shards の使い方](http://qiita.com/pine613/items/e71903532c24cbeb200a) … Qiita (2015/09/26)

# まとめ
最近は Crystal の日本語の記事が増えてきて大変喜ばしく思います。Advent Calendar でどんな記事が書かれるか楽しみです。

## 補足
この投稿へのリンクの追加は、編集リクエストを飛ばしてください。

# 終わりに
明日の記事は [kfly8](https://twitter.com/kfly8) さんの [Hello, Crystal](http://kfly8.hatenablog.com/entry/2015/12/02/183952) です。よろしくお願いします。
Bluemixでジオフェンス(Geofence)を試す

聞き慣れない言葉ですが、**ジオフェンス(Geofence)**とは移動中のデバイスがある特定のエリアに入ったり、エリアから出たりといった移動を検知するための機能です。

![図1.png](https://qiita-image-store.s3.amazonaws.com/0/102979/5d776204-a190-32b8-5744-00c861d3d752.png)

すでにあるユースケースの例としては、ANAのスマート・フォンアプリがあります。空港に到着すると通知が着て保安検査場の場所などを知ることがます。
https://www.ana.co.jp/share/mobile/smartphone/app_ana/

その他、お店に近くに来た人に対してクーポンを発行するなど、アイディア次第で色々な使い方ができそうです。

通常、高機能な地理情報システムで提供されている機能ですが、BluemixのGeospatial AnalyticsサービスでこのGeofence機能を利用できます。

まずは、サンプルコードを動かすことから試してみました。

## 試すこと
ここでは以下を試します。
1. Bluemix Geospatial Analyticsサービスの作成
2. Bluemix Geospatial Analytics スターター・アプリケーションのデプロイ
3. テストデータでの稼動確認 

# 準備
マニュアルを確認
https://www.ng.bluemix.net/docs/services/geospatial/index.html

cfツールが導入されていること
https://www.ng.bluemix.net/docs/#starters/install_cli.html


# 1. Geospatial Analyticsサービスの作成

Bluemixのカタログのデータおよび分析から、Geospatial Analyticsサービスを選択し作成します。
![図3.png](https://qiita-image-store.s3.amazonaws.com/0/102979/5dbd77bb-519b-033b-dfed-c41cfd558b86.png)



# 2.  Geospatial Analytics スターター・アプリケーションのデプロイ

以下のURLからGeospatial Analytics スターター・アプリケーションをダウンロードします。
ftp://public.dhe.ibm.com/cloud/bluemix/geospatialanalytics/geospatial_analytics_geo-starter.zip

ローカルでzipを展開したディレクトリに入り、cfコマンドでBluemixにpushします。
コードの編集は不要です。

```
cf push geospatial_analytics_geo-starter
```
push が成功したら、あらかじめ作成したGeospatial Analyticsサービスと関連付けます。
![図4.png](https://qiita-image-store.s3.amazonaws.com/0/102979/ea5627ec-6bfd-aa1b-bac3-85ecc79adc3f.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/102979/a2db4d3a-e2c9-7d70-cd85-11796cbcf8b7.png)


# 3. テストデータでの稼動確認 

Geospatial Analytics スターター・アプリケーションは以下の処理を行います。

- REST経由でGeospatial Analyticsサービスの起動や検知領域を設定
- 処理状況や捕捉したイベントをWebで表示

![image](https://qiita-image-store.s3.amazonaws.com/0/102979/1f8a777a-4516-e587-4aab-579ed50e3695.png)

Geospatial Analytics スターター・アプリケーションでは、デフォルトで以下での公開されているデータで移動体を検知するよう設定されています。
http://geo-starter-visualizer.mybluemix.net/

ラス・ベガスの街を走る車をシミュレートしています。枠で囲まれている部分は、Geospatial Analytics スターター・アプリケーションで指定している領域です。
![image](https://qiita-image-store.s3.amazonaws.com/0/102979/ca7ae366-17e9-2854-9dc4-3af3fcb6d22c.png)

例えば、青の領域にDeviceID56の車が入ると・・
![image](https://qiita-image-store.s3.amazonaws.com/0/102979/749a9627-0daa-6e76-d3ba-37c8ac0c2880.png)

Geospatial Analytics スターター・アプリケーションでイベントを補足していることがわかります。

![image](https://qiita-image-store.s3.amazonaws.com/0/102979/d3e586f9-b09c-32a6-ef26-b60a9c1a378a.png)


# 最後に
Geospatial Analytics スターター・アプリケーションで、Geofence機能を利用したアプリケーションのサンプルを動かしました。

次の記事では、このサンプル・コードの中でどのような処理を行っているかを見ていきたいと思います。
JIS配列のススメ

## JIS配列のススメ

Dvorak Advent Calendar 1日目．
作ってみたモノの誰も参加してくれそうにないので，ライトな感じでちょこちょこ1人でやります．
前回のDvorak Advent Calendar は5年前っぽいですね…


US配列のがオシャレとかモテるとか左エンターキー打ちやすい（JISより内側にエンターキーがある）とか
色々言われますが，それでもJISをオススメしたい．

### 外国人にモテる

「何そのキーボードｗｗｗすげぇｗｗ」
「エｗンｗターｗｗキーｗｗｗｗｗ」
「くれｗ」

とか言われます．\*

\* ただしイケメンに限る（可能があります）



### 親指周りにキーが沢山ある

無変換キー，変換キーの他にUS配列よりも余計にAltやFnキーがあったりして嬉しい．
嬉しいかどうかは人それぞれかもですが，同じ面積なのにキー多いと言うことは間違いなく有利です．（キーサイズは常識内の範囲で想定）
リマップして便利に使えます．（私は無変換キーを凄い使ってます）
SVGをcanvasで使う

この記事はACCESS Advent Calendar 1日目の記事です。

こんにちは ACCESS開発本部IoT開発部の渡辺 (@sassy_watson) です。
今回は私がSVGをcanvasで使う方法についての記事を書こうと思います。

# SVGとCanvas

SVGはただのベクターグラフィックスというだけでなく、
マスクやクリップだったらグラデーションやフィルターだったり
いろいろ高機能なのが魅力です。
ただ、XMLなのでJavaScriptでなにかしようするときのDOM操作が面倒くさいです。

一方、CanvasはAPIが簡単なのでJavaScriptで扱いやすいというメリットがあります。


# SVGをCanvasで使う

そこで、SVGで使いたい機能をSVGで書いて、canvasに貼り付けるというアプローチが考えられます。
素材はillustratorでつくって、Canvasでペタペタ貼り付けるようなことをしたかったりします。

SVGはimg要素で画像として扱うことができます。
ということは、imgでSVGを指定して、それをcanvasのdrawImageで使えばSVGをcanvasで扱うことができます。

```html:
<canvas id="c" width="200" height="200"></canvas>
```

```javascript:
var img = new Image();
img.src = 'http://www.w3.org/Icons/SVG/svg-logo-v.svg';
img.onload = function() {
    var c = document.getElementById('c');
	var ctx = c.getContext('2d');
	ctx.drawImage(img, 0, 0, 200, 200);
}
```

とすれば、ちゃんと

![スクリーンショット 2015-11-28 10.19.25.png](https://qiita-image-store.s3.amazonaws.com/0/4044/708569c3-a0f8-131a-62bd-ab6fd420660e.png "スクリーンショット 2015-11-28 10.19.25.png")

と表示されます。
(下記で確かめられます。)
http://jsfiddle.net/sassy_watson/o87sux0o/

これは、SafariでもChromeでもEdgeでも動きます。


# Firefoxが…・

ただ、これはFirefoxでは動かないのです。
FirefoxはcanvasでSVGを指定したimgを描画できません。
srcにbase64エンコーディングしたSVGを描画できるという情報もありましたが、試してみたらできませんでした。(ちなみにバージョンは42)

これは困った。

# そこでcanvgですよ

https://github.com/gabelerner/canvg

canvgはSVGをパースして、その内容をもとにcanvasに描画していくライブラリです。
こちらならFirefoxでも描画できそうです。


```javascript:
svg = '<svg><rect x="50" y="50" width="100" height="100" /></svg>';
canvg(document.getElementById('canvas'), svg);
```

とすれば簡単にSVGが描画できます。
canvgには上記のようなSVGの文字列の他にファイル名も指定できます。

ただ、

```javascript:
canvg(document.getElementById('canvas'), 'http://www.w3.org/Icons/SVG/svg-logo-v.svg');
```

みたいにすると、canvgが中でXMLHttpRequestを使ってSVGファイルを取得しようとするのでSOPでうまくいかないこともあるので注意です。

# canvgの制限


canvgがどこまでサポートしているかはわかりませんが、
たぶんcanvasがサポートしている範囲でしかできません。
canvasがサポートしていないfilterの機能とかは利用できないようです。

例えば、feGaussianBlurとかは、blurをサポートしているブラウザでは動きます。

```javascript:
svg = '<svg xmlns="http://www.w3.org/2000/svg">'
+'<defs>'
+'    <filter id="gaussian" x="0" y="0" width="100" heihgt="100" filterUnits="objectBoundingBox">'
+'      <feGaussianBlur in="SourceGraphic" stdDeviation="5,10" />'
+'    </filter>'
+'  </defs>'
+'  <circle cx="50" cy="50" r="50" fill="red" stroke="blue" stroke-wdith="5" filter="url(#gaussian)" />'
+'</svg>';

canvg(document.getElementById('canvas'), svg);
```

http://jsfiddle.net/sassy_watson/ymwd6n49/1/


しかし、feComponentTransfer等はうまくいきませんでした。
http://jsfiddle.net/sassy_watson/ymwd6n49/3/

これはせっかく高機能なSVGの機能を制限してしまうことになるので少々残念です。

# まとめ

ということで今回はSVGをcanvasに描画する方法としてcanvgを紹介しました。
他に良い方法はないかどうかは調査していこうと思います。

明日は @magicant さんです。
明日もよろしくお願いいたします。
sh 小技 2015

# もうすぐ2016年になるのに臆すること無く shell の小技を紹介します

## u と打って1つ上の階層へ cd する
```sh
alias u="cd .."
```

cd .. ってたまに cd.. とか cd... とかになってエラーになるとツライのでこのエイリアスでハッピーに。

あ、

```sh
alias cd..="cd .."
```
とする天才もいます。

## ちょっとだけまちがえた直前のコマンドをクールに修正して再実行
```sh
$/usr/local/mysql/bin/myslq
-bash: /usr/local/mysql/bin/myslq: そのようなファイルやディレクトリはありません
$^slq^sql
/usr/local/mysql/bin/mysql
```
^hoge^var とうつことで hoge を var に置換して実行できる。この qiita 書くまで存在を忘れてました。

## 直前のコマンドを実行する危なげないコマンド
```sh
$type -a git
git is /usr/local/bin/git
$ls
bin/ gopath/ htdocs/ images/ pj/ 
$!g
git is /usr/local/bin/git
```
!g と打つことで、直前の g で始まるコマンドを再実行(直前は ls だが、それを越えて git を選んでいる)。事故ると怖いのでここ数年使ったことないです。
Spring Bootを使って３５秒でAPIを作成する(mac編)

最近世間でもてはやされているSpring Bootですが、これを使って３５秒でAPIを作ってみようと思います。


###まずはspringbootをbrewでインストール   
(brewは環境によってかかる時間など異なるのでこれはまだ３５秒に入れません・・・)

```
brew tap pivotal/tap
brew install springboot
```

#３５秒の計測スタート！



**まずはgroovyのファイル作成**   
`vi api.groovy`



**ファイルの内容は以下をコピペ**

```groovy:api.groovy
@RestController
class ThisWillActuallyRun {
    @RequestMapping("/")
    String home() {
        "Hello World!"
    }
}
```



**springコマンドでAPIを起動**   
`spring run api.groovy`

(初回起動の時だけ依存関係の解決に時間がかかります・・・ごにょごにょ)


**したらブラウザから以下のURLで繋がります！ここまで３５秒！**   
`http://localhost:8080/`   

`Hello World!`


皆さんどうですか？３５秒でAPI作れましたよね？   
え？間に合わなかったって？？きっとコピペとか、タイピングとか訓練すれば３５秒でいけます！！  




**ちなみにgetパラメータとかもらう場合はこんな感じで書けます**

```groovy:api.groovy
@RestController
class ThisWillActuallyRun {
    @RequestMapping("/")
    String home(@RequestParam(value="name") String name) {
        "Hello $name"
    }
}
```


`http://localhost:8080/?name=hanako`


`Hello hanako`

springbootとgroovy組み合わせると、ファイル１つでAPI出来てとっても簡単で良いですね！！
AngularJS で無駄にハマる。 built-in-directives

[AngularJS Advent Calendar 2015](http://qiita.com/advent-calendar/2015/angularjs) 1日目の投稿です。

宣言通りにあるある的なものを紹介していこうかと思います。
すっごいしょうもないけど、やってしまいがちなものシリーズです。

## ng-options の使い方が覚えられない
書き方多すぎ。少なくともボクには無理です。
「あ！こっちの書き方でいけば上手くいく！」みたいな発想は起きません。ただただ悶えます。
>
```
for array data sources:
　label for value in array
　select as label for value in array
　label group by group for value in array
　label disable when disable for value in array
　label group by group for value in array track by trackexpr
　label disable when disable for value in array track by trackexpr
　label for value in array | orderBy:orderexpr track by trackexpr (for including a filter with track by)
for object data sources:
　label for (key , value) in object
　select as label for (key , value) in object
　label group by group for (key, value) in object
　label disable when disable for (key, value) in object
　select as label group by group for (key, value) in object
　select as label disable when disable for (key, value) in object
```


## ng-include="xxx.html" でテンプレートが読み込めない
これを見てサクッと理解できた方は、確実にこの経験をされているのでしょう。
この症状としては、実際に `xxx.html` ファイルが存在するにも関わらず、読み込まれないし、エラーを吐くこともありません。
原因はいたって単純で、 `ng-include` に渡す値は AngularJS でいう `expression` であるためです。

`"xxx.html"` と記述するということは、 $scope.xxx.html を参照するということです。もちろんそんなつもりで記述していないし、そんなプロパティも存在しないため読み込まれません。かつ、AngularJS のテンプレートは、存在しないモデルについてはスルーしてくれる優しさをもっているためエラーすら吐きません。
正常に読み込まれるようにするためには、  ` ng-include="'xxx.html'" ` とするのが正しいです。

同様の仲間に `ng-switch-when` がいます。こいつはもっと間違えやすくて、 `ng-switch` が `expression` で受け付けるのに `ng-switch-when` に渡す値は `String` のみです。うっかりモデル名を渡してしまうと、いつまでたっても表示されません。こちらについても併せて覚えておくと良いでしょう。

## ng-form="xxx" が効かない
入れ子構造のフォームを動的に作成するときなどには  `ng-form` が有効です。親のformタグと入れ子にすることができる優れものです。しかしながら以下のように書いてしまうとなんの効果も発揮しません。
多くの場合、バリデーション機能が正しく動作しないことで気づきます。

```html
<form name="parentForm">
  <table>
    <tbody>
      <tr ng-repeat="x in y">
        <ng-form="childForm_$index">
          <td><input type="text" name="name_$index" ng-model="x.model" required></td>
        </ng-form>
      </tr>
    <tbody>
  </table>
</form>
```

この場合は、trタグに `ng-form` を指定すると期待通りに動作します。

```html
<form name="parentForm">
  <table>
    <tbody>
      <tr ng-repeat="x in y" ng-form="childForm_$index">
        <td><input type="text" name="name_$index" ng-model="x.model" required></td>
      </tr>
    <tbody>
  </table>
</form>
```

## input[checkbox] でng-valueを指定するも...
正しく動きません。
普段は true/false だけが取れれば良かったりして、あまり意識することがありません。たまにある「"1"/"0" でリクエスト送ってください」とかいうケースで、さらっと書くと怪我をします。
ngValue の [API Docs](https://docs.angularjs.org/api/ng/directive/ngValue) を見ると以下のように書いてあるんで騙されやすいですよね...

>
```html
<input
  [ng-value="string"]>
...
</input>
```

ただし、[input[checkbox] のページ](https://docs.angularjs.org/api/ng/input/input%5Bcheckbox%5D)で `ng-value` がないことが明らかになります。

>
```html
<input type="checkbox"
       ng-model="string"
       [name="string"]
       [ng-true-value="expression"]
       [ng-false-value="expression"]
       [ng-change="string"]>
```

input[checkbox] に対しては`ng-true-value`と`ng-false-value`を使いましょうとのこと。あったねそんなやつ...


## まとめ
Angular経験者なら大体やってるはず。
Sunspotでお手軽苦情検出

この記事は[アクトインディ Advent Calendar 2015](http://qiita.com/advent-calendar/2015/actindi) 1日目になります。
どうぞよろしくお願いします。

## 要旨

[アクトインディ](http://www.actindi.com/)の運営する[子どもとお出かけ情報サイト いこーよ](http://iko-yo.net)では、日々、おでかけスポットの口コミがユーザーから投稿されています。
中には、おでかけスポットへの苦情や不満が書かれた口コミがあります。
そういったものを早期に検出するためSolrの類似文書検索(MoreLikeThis)機能を使用し機械的な検出を試みました。
決して精度は高くありませんが、Sunspotを使用し極めて簡単に実装できました。

使用しているデータは実際のものとは異なります。

## 検出方法

やりたいことは文書分類問題なので、機械学習などいろいろな方法があります。
いこーよでは全文検索エンジンに[Sunspot](http://sunspot.github.io/)経由で[Solr](http://lucene.apache.org/solr/)を使っているため、手軽に実装できることから、今回はMoreLikeThisを試してみました。

## 準備

SunspotからMoreLikeThisの使い方は[Sunspotのドキュメント](https://github.com/sunspot/sunspot#more-like-this)にあります。

MoreLikeThisを使用するためにはSolrのMoreLikeThisHandlerを有効にする必要があります。solrconfig.xmlにrequestHandlerを追加します。

```xml:solrconfig.xml
<requestHandler class="solr.MoreLikeThisHandler" name="/mlt">
</requestHandler>
```

次にmodelクラスへ検索用フィールドを追加します。

```ruby:app/models/kuchikomi.rb
class Kuchikomi < ActiveRecord::Base
  searchable do
    text :body, more_like_this: true
  end
end
```

あとはsolrのindexを作り直せば検索可能になります。Sunspot便利ですね。

```rb
Kuchikomi.reindex
Sunspot.more_like_this(Kuchikomi.first) {
  fields :body
  minimum_term_frequency 1
  minimum_document_frequency 2
}.results
=> ...
```

## 判定

類似文書が取れるようになりましたので、次はその文章が苦情かどうかの判定になります。
今回はお試しなので、今までに投稿された低評価の口コミを苦情正解セットとして扱います。
判定は次のように行います。

- 投稿された口コミから類似文書を検索
- ヒットした口コミ群がこの苦情セットに含まれるか判定
- 苦情正解セットに一定数以上含まれた場合、投稿された口コミを苦情と判定

実際に書いてみると次のようになります。

```rb
n = 5
complaints = Set.new(Kuchikomi.where(rating: 'low').pluck(:id))
k = Kuchikomi.new(body: '店員の態度が最悪でした。私気分悪帰')
k.save!
k.index!
hits = Sunspot.more_like_this(k) {
  fields :body
  minimum_term_frequency 1
  minimum_document_frequency 2
}.hits.map{ |h| h.primary_key.to_i }
if (complaints & hits).size > n # hit数
  puts '苦情です！"
end
```

これで苦情の検出が可能になりました。

## 結果

ここまで検出器を作ってきましたが、サンプルデータで動かした場合、精度はあまり良くありませんでした。
あからさまにhit数が多いものとhit数が0のものに関してはほとんどが正解でしたが、hit数が2,3件で苦情口コミと通常の口コミの判定が混在します。
hit数5件以上はほぼ苦情でした。

## 考察

精度を高めて、実務に使うためには

- 正解セットの選別
- minimum_term_frequency, minimum_document_frequencyなどのパラメーター
- 判定閾値
- 偽陰性、偽陽性はトレードオフなのでどちらに寄せるか
- 判定結果の定量的な評価方法

などが必要そうです。

とはいえ、実装自体はSunspotをすでに使用していれば簡単なので、とりあえずやってみようといったときには便利です。

次はRandomForestを試してみようと思います。
【FileMaker】TODOリストを作って改良していこう(1)ーまずは盛り込む項目を考える（ヒアリング）

この記事は、FileMaker Advent Calendar 2015の記事として書きました。

ケイタイによく入っているTODOリスト、みなさんよく使ってますよね。
それを自作してみませんか！？

TODOリストとして、まずはどのような機能をみんなが欲しがっているかを考えます。

・完了日付を入れたい
・終わったら、終わったことがわかるようにチェックができるようにしたい
・終わったTODOは、表示しなくていい
・どのくらいTODOリストがあるのか一覧で見たい
・終わったTODOも履歴としてみたいので、残しておいて欲しい
・忘れそうなことをメールで送って欲しい
・「あと何日！」とか「あと何件！」というように自分を追い込んで欲しい

できれば他の人にもヒアリングしたいですが、とりあえずは自分で自分にヒアリングして、自分がほしい機能を実装していきましょう。

単なるTODOでも、いろいろ盛り込みたいことはありますね。
これらの機能を最初は単純に実装し、徐々に高機能化していきましょう^^

まずは、iPhoneにApp Storeから[FileMaker Go](https://itunes.apple.com/jp/app/filemaker-go-14/id981268415?mt=8&ls=1)をインストールしておいてください。

FileMakerのバージョンは最新の14でいきましょう。
[*その他*] アプリの開発方法を調べる

# はじめに
業務アプリケーションを作っている会社に務めているのですが、
時代の流れもあり、業務アプリの一部の機能をスマートフォンアプリ化しようという話になりました。
そしてアプリ開発用のチームが編成されたのですが、
アプリ作るの楽しそうだなぁくらいのどうやって作るんだろうね状態です。
Advent Calendarの時期なので、これを機会に毎日ちょっとずつ勉強していこうと思います。
まずはアプリはどうやって作れるのかという開発手段について調べました。

# アプリ開発のタイプ
* ネイティブアプリ
* ハイブリッドアプリ
* Webアプリ

# ネイティブアプリ・ハイブリッドアプリ比較

||ネイティブアプリ|ハイブリッドアプリ|Webアプリ|
|:--|:--|:--|:--|
|概要|アプリとしてダウンロードする形式で、iOSやAndroidなど特定プラットフォーム用に作られている|アプリとしてダウンロードする形式だけどHTML5等で作られる|ウェブブラウザからURLでアクセスするタイプ|
|言語|Swift, Objective-C, Java etc...|HTML, CSS, JavaScript etc...|HTML, CSS, JavaScript, Javaなど色々
|メリット|・ デバイスの機能を最大限に利用できる（最新機能の利用など）<br>・動作が速い|・HTMLやJavaScriptなど、比較的手を出しやすい言語の使用<br>・クロスプラットフォーム対応しやすい|・アプリをダウンロードする必要がない
|デメリット|・プラットフォームごとに開発言語が異なる<br>|・ネイティブに比べると動作が遅い<br>・ゲームのような処理が重いものには不向き|・デバイス機能が使えない|

# ハイブリッドアプリ開発フレームワーク等
とりあえず目についたものまとめ。

|名前|説明|
|:--|:--|
|[Apache Cordova](https://cordova.apache.org/)|Adobe社がNitobi社のPhoneGapを買収しApacheへ寄贈、オープンソースとして開発されている。|
|[PhoneGap](http://phonegap.com/)|Adobe社が公開しているフレームワーク。Cordova+Adobeが提供する機能。|
|[Monaca](https://ja.monaca.io/)|Cordova + HTML + JavaScript + CSS + AngularJS + OnsenUIあたりで開発できる。クラウドIDEで開発できて、デバッグとかもやりやすい。|
|[Titanium](http://www.appcelerator.com/)|Appcelerator社が提供している。JavaScriptでAndroid/iOSアプリが開発できる。|
|[React](http://facebook.github.io/react/)|Facebookが開発しているJavaScriptライブラリ。React Nativeというのがオープンソースとして公開された。|
|[WinJS](http://try.buildwinjs.com/)|AndroidやiOS向けにもWindowsアプリが開発できる。|
|[Sencha Touch](https://www.sencha.com/products/touch/#overview)|HTML5、CSS3、JavaScriptを用いたモバイルアプリケーション開発用フレームワーク。|
|[アプリカン](http://www.applican.com/)|開発支援ツールがそろっていて、HTML5やJavaScriptなどでアプリを開発できる。|
|[Xamarin](http://developer.xamarin.com/)|C#などを使ってiOSやAndroid、MacOSアプリケーションを作成できる。|
|[RubyMotion](http://www.rubymotion.com/)|Rubyを使ってiOSやAndroidのアプリを作れる。|

# まとめ
それぞれの方法にはそれぞれメリットやデメリットがあるので、
どういう機能がいるアプリなのかによってもどういう開発手段を選択すべきかを考えなければならないと思いました。
現状、作ることになりそうなアプリはデバイスの最新機能をふんだんに使わなければならないようなものではない…と思うし、３Dなどの映像等がメインではないのでネイティブでがりがりやらなくてもいけるのではないかなという印象です。
が、現状ネイティブでないとできないことっていうのがどの程度あるのかがよくわかってないのでその辺によっても変わるかなといった感じです。

# 参考
* [ウェブアプリとネイティブアプリの違い｜抑えておくべき7つの項目](http://appbu.jp/webapps-nativeapps)
* [HTML5によるハイブリッドアプリ開発の「Apache Cordova」とは？IBMやSAPがなぜ注目？](http://www.sbbit.jp/article/cont1/28197)
* [スマートデバイスに特化したSencha Touchでハイブリッド開発（PhoneGap/Cordovaの利用）](https://html5experts.jp/albatrosary/7298/)
* [スマホサイトアプリ開発高速化JavaScriptフレームワークまとめ](http://blog.mb.cloud.nifty.com/?p=1180)
* [マイクロソフトのJavaScriptライブラリー「WinJS」について知っておくべき５つのこと](http://readwrite.jp/archives/6537)
Object.values/Object.entries

# はじめに

[JavaScript stage 0,1,2,3 Advent Calendar 2015](http://qiita.com/advent-calendar/2015/esnext)の記事です。

[tc39/proposal-object-values-entries](https://github.com/tc39/proposal-object-values-entries)について書きます。

# Object.values/Object.entriesとは？
TC39に提案中のJavaScriptの新文法です。
現在はFirefoxの[Nightlyビルドにのみ実装](https://bugzilla.mozilla.org/show_bug.cgi?id=1208464)されています。

JSONデータを処理する時など、Objectの値を列挙したいことがあります。
この時に使うメソッドです。

## 今回、対象とするオブジェクト

```js
var obj = {
  a : "alpha",
  b : "bravo"
}
```

## ES5では

[Object.keys](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Object/keys)を使います。

例えば

```js
Object
  .keys(obj)
  .forEach(function(key){
    console.log(obj[key])
  })
```

## ES2015では

ES2015では[for of](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/for...of)が追加されました。

しかしobject自体は反復処理可能ではありません。
そこで、Object.keysでキーの配列が取得できます。
for-of中で`obj`から値を取り出します。

```js
for(var key of Object.keys(obj)){
  console.log(obj[key])
}
```

できれば、`obj`の値を列挙したいです。

## ESNext

そこでObject.valuesです。もうちょっと直感的な書き方ができます。


```js
for(var val of Object.values(obj)){
  console.log(val)
}
```


Object.entriesはキーと値を両方返します。

```js
for(var [key, val] of Object.entries(obj)){
  console.log(key, val)
}
```
CodeIgniterとは

この記事は、[CodeIgniter Advent Calendar 2015](http://qiita.com/advent-calendar/2015/code_igniter)の1日目です。最初ということで、CodeIgniterについて大まかな説明をしていきます。

# CodeIgniterとは
CodeIgniterは、MVC構造を取るPHP製のWebアプリケーションフレームワークです。2006年に初版が出て、2015年にはバージョン3.0が出るなど、現在も開発が続いています。

# メリット
CodeIgniterは他のフレームワークと比べて、以下の特徴があります。

* コード量が少ない（どこでどんな処理をしているのかの見通しもいい）
* 動作が速い（これまた、レイヤーの薄さがあっての効果です）

# デメリット
一方で、CodeIgniterは軽量な構造や古い時代から受け継ぐものもあって、他のフレームワークより機能的に不足している部分も見られます。

* 名前空間を切らず、クラスがトップレベルにある
* モデル・ライブラリなどは使った時点でのオートロードができず、事前にロードしておく必要がある
* データベースアクセス機能が基本構造のみ（ORMがない）

ただ、3.0ではComposerに対応しているので、Composerで入れて、外部ライブラリはComposer管理下に置く、ということはできます。そういう手法で不足を補うのもありです。

# ライセンス問題（解決済み）
CodeIgniter 3.0を開発している時に、もともとの開発元だったEllislab社が、ライセンスをOSL/AFLというマイナーなものに変えるという話が出てコミュニティが大混乱に陥る、ということがありました。その後、Ellislab社はコードを手放し、ブリティッシュコロンビア工科大学に移管された後にライセンスがMITライセンスへと変更されたバージョン3.0がリリースされ、ライセンス問題は完全に収束しました。


次回は、@bj1024さんです。それでは、お楽しみに。
お仕事の探し方

すでにフリーランスでお仕事している方も、これからフリーランスになろうとする方も
お仕事の探し方で参考になればいいなと思い、書いてみました。

「フリーランス」という職業にはいくつかのタイプがあると思います。
そのタイプによってお仕事の探し方も変わってくるかと思うので、
そのタイプごとにお仕事の探し方を並べてみます。

# 元の会社から仕事を貰うタイプ

　フリーランスの入門編で一番多いタイプ。前の会社の同僚から仕事を貰ったり、昔の取引先からお仕事を貰ったりする。
　これが一番楽ですよ。マジでｗ
　だって、自分で取引先を探さなくて良いから、開発系やデザイン系は作業に専念できます。
　ただ、これだけだと一つの会社に依存したりして、それって「フリーランス」って言えるの？
と言う疑問が付きまといます。

# SESの派遣企業に登録して仕事をするタイプ

　今までの職務経験や実績をPRして、人材派遣会社から派遣（SES）として仕事をするタイプ。
　SIerのサラリーマン生活が長かった人にはオススメ。Web系のエンジニアは辛いかもｗ
　大手だたＬ社とかが良くバナー広告で目にします。（あれって「フリーランス　案件」って検索してしまうと、GoogleAdsに付きまとわれるゾ！）
　週五日の月〜金で客先常駐の案件がほとんど。フリーランスと言うより将来が保証されない有期派遣労働者だよ！
　ただ、その常駐先の正社員と違うことは、残業があっても「私はお金で動く」な人材なので、残業をしなくても帰して貰えたりする。残業をさせればさせるほど常駐先は派遣会社にお金を払わないといけないからね。
　あと、作業費（お金）が入金されるのが、月末締め翌々月１０日払いという、仕事をした月の末日から７０日後という鬼の入金タイムラグ地獄があるから要注意！！

# クラウドソーシングで仕事を受注するタイプ

　今、話題のクラウドソーシング。有名どころだとＣ社とかＬ社とかがありますね。
　仕事は沢山掲載されていますが、応募しても契約まで辿り着けるのは、超氷河期時代の四流文系大学の新卒採用並なので、修羅の道です。
　「クラウドソーシングだから安くできる」みたいな間違った認識が世間に広がっているので、作業単価が１ヶ月あたり３０万円を切るのは当たり前の世界。数多く効率よくこなせる人なら良いのですが、一つのことにじっくり取り組みたい人は、頑張っても生活苦に陥ります。
　見ず知らずの取引先を自己責任で切り開かないといけないので、取引条件や契約書は慎重に！

# 勉強会やユーザグループで仕事を貰うタイプ

　目立ちたがり屋や芸人になれるなら、勉強会やユーザグループに参加して、ＬＴをバシバシやって目立って「ＬＴ芸人」になると、不思議と仕事が舞い込むらしい。
　同じ興味を持っているエンジニアが集まるので、同じ分野の業種やお仕事に繋がりやすいのは確かだ。
　まあ、そんなこと言っても、ＬＴ芸人やオタサーの姫以外のコミュ障や普通の野郎にとってはハードルが高い。懇親会になってもボッチ飲みになって、お仕事にはありつけることは無い。
　ただ、野郎だらけのエンジニア系勉強会にいくと、チヤホヤされているオタサーの姫が見られるから要必見！
　・・・もとい、孤独に仕事をしているフリーランスには、唯一同好の仲間と出会えるチャンスなので、勉強会やユーザグループのイベントには参加を推奨します。参加しただけで勉強した気分になれるしね！

# 業務委託という求人を見つける

　意外と知られていないのが、「業務委託」という求人。実は探すとあるのです。
　有名どころだとＷ社やＭ社ですね。求人サイトの。
　就職活動と同じように苦労もありますが、完全に新規の取引先を見つけるには、営業開拓するよりはハードルが低いです。
　ただ、求人を出している会社の一部にはヤバイ事情で求人を出している、ブラック求人もあるので、要注意。
　フリーランスのはずが、ズルズルとその取引先の会社の社員になっていることも。
　深入りはせず、いつでも逃げ出せるようにしておこう！

# ひたすら営業をする

　営業が得意な人しかオススメしません。
　ハッキリ言って、時間がかかるし非効率的。

# 受託開発をしなくて、完全にオリジナル自社サービス（コンテンツ）勝負するタイプ

　フリーランスというよりは、起業家に近いけど、自社サービスを持っていると、収入先の多様化が出来るのでオススメ。
　受託開発や派遣をやるよりは、自社サービスを極めたいよね。
　フリーランスというよりは、もう起業しちゃえYO！
　フリーランスと自営業は紙一重なので、境界があいまいですが、自社サービスが軌道に乗れば最強！もう勝ち組だよおっかさん。
　
　


とりあえず「フリーランス」と言っても様々なタイプがあるので、自分の適性にあったタイプでお仕事探しのお役に立てれば嬉しいです。

自分は元の会社からお仕事貰っていたけど、気がつけば完全に見ず知らずの取引先を開拓していた感じ。
ただ、世の中善人ばかりではないので、怖い思いもしたことがあります。
物覚えが悪いから同時に押す

この記事は[Emacs Advent Calendar](http://qiita.com/advent-calendar/2015/emacs)ではない

Emacsの初期化ファイルのちょっとした工夫を紹介したりする[.emacs Advent Calendar 2015](http://qiita.com/advent-calendar/2015/dot-emacs)です！ 

## key-chordと私

自分のTwitterログを検索してみてもkey-chordについては二度しか言及してないのだけれど、ことし一年で無くてはならない存在になったので紹介したい。

<blockquote class="twitter-tweet" lang="en"><p lang="ja" dir="ltr">key-chord.el とか使ったら、かなりお手軽に既存の枠組みから外れられる気がしてるけど、僕はまだ使ってない。</p>&mdash; 獨自腐麗夢輪惡 (@tadsan) <a href="https://twitter.com/tadsan/status/295198699947192320">January 26, 2013</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet" lang="en"><p lang="ja" dir="ltr">物覚えが悪いので、最近は key-chord 方面を割り当てる方にシフトしつつある</p>&mdash; 獨自腐麗夢輪惡 (@tadsan) <a href="https://twitter.com/tadsan/status/564391107140653056">February 8, 2015</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

人間がコードを書くための最大の敵は自分自身であり、つまりは不器用な指と物覚えの悪い頭が制約になります。

key-chordは、複数のキーの「同時押し」に機能を割り当てることができます。指がつるような運動をする必要もなく、手軽に機能を起動することができます。

## key-chordを入れるには

パッケージリポジトリとしてMELPAを登録すれば、容易に導入可能です。[2015年Emacsパッケージ事情](http://qiita.com/tadsan/items/6c658cc471be61cbc8f6)をお読みください。ヾ(〃＞＜)ﾉﾞ

## key-chordの設定

私は以下のような設定をしてます。

```init.el
;; key-chord
(use-package key-chord
  :init
  (custom-set-variables
   '(key-chord-two-keys-delay 0.02))
  (key-chord-mode t)
  (key-chord-define-global "df" 'find-function)
  (key-chord-define-global "fh" 'describe-function)
  (key-chord-define-global "fv" 'find-variable)
  (key-chord-define-global "p@" 'package-install)
  (key-chord-define-global "kl" 'align-regexp)
  (key-chord-define-global "rt" 'toggle-load-theme)
  (key-chord-define-global "wr" 'writeroom-mode)
  (key-chord-define-global "m," 'reload-major-mode))
```

`find-variable`や`find-function`をkey-chordに割り当てることで、Emacs Lispのコードリーディングが抜群に捗るようになりました。

## キーの選びかた

key-chordはその特性上、「同時押し」の判定は厳密ではなく、高速に打鍵すると誤爆するおそれがあります。基本は隣接するキーか、一つ空けた程度の距離を組合せるのが押しやすいですが、連続して押されやすいキーは避けた方が懸命です[^1]。また、キーの組合せは、ある程度は機能と連想できるようにすると忘れにくくなるように感じます。

## 増やしすぎない

重ねて、筆者は物覚えが悪いので、一気に定義すると覚えられず破綻することは目に見えてました。なので増やしすぎないように自制して、少しづつ増やしてます。

[^1]: key-chordの利用を初めた当初は`package-install`を<kbd>"pi"</kbd>に割り当ててましたが、筆者は仕事柄`pi`を連続して打鍵することが多いのでしょっちゅう誤爆してました [`p(ixi)v`](http://qiita.com/tadsan/items/e3f5269d8e6277605762)
Unityで制作したiOSアプリへのFacebook AppLinksの導入

ディープリンクをアプリに実装するのは通常なかなか骨の折れる仕事ですが、
ミドルウェア・ゲームエンジンを用いてアプリを開発している場合は尚更です。
そこで今回はUnityで制作したアプリにFacebook SDKのディープリンク機能であるApp Linksの導入方法を紹介します。なお今回検証したUnityバージョンは4.2となります。

#Unity用Facebook SDKの導入

Facebookのデベロッパーサイトに行き、SDKを導入するアプリを登録します。
登録すると、Facebook App IDが発行されます。

続いて最新のUnity用Facebook SDKをダウンロードしてください。
https://developers.facebook.com/docs/unity/downloads?locale=ja_JP

UnityでSDKを導入するプロジェクトを開き、
ダウンロードしたFacebook SDKのunity packageファイルをダブルクリックして全ファイルをimportします。

Unityを再起動するとメニューバーに「Facebook」という項目が増えているので、
そこから「Edit Setting」を開き、「App Name」に任意のアプリ名、「App Id」に先ほどデベロッパーサイトで発行したFacebook App ID、「URL Scheme Suffix」に任意のURLスキームを記述します。


#Unity側でのディープリンクの記述

アプリのトップページとなるSceneを開きます。
トップページにあるオブジェクトにひも付けられたスクリプトに、下記のメソッドを追加してください。


```HogeScript.cs
#if  UNITY_IPHONE && !UNITY_EDITOR
public void DeepLinkMethod (string targetUrl) {
  // 必要に応じて遷移先を分岐させる
  Application.LoadLevel(“<遷移先Scene名>”);
}
#else
public void DeepLink () {
  // Android端末での挙動
}
#endif
```

以上でUnity側での設定ができました。
Xcodeプロジェクトにビルドし、Xcodeでの設定に移ります。



#Xcode側でのディープリンクの記述

UnityAppController.mmを開き、設定を追加していきましょう。


```UnityAppController.mm
- (BOOL)application:(UIApplication*)application openURL:(NSURL*)url sourceApplication:(NSString*)sourceApplication annotation:(id)annotation
{
  …
  BFURL *parsedUrl = [BFURL URLWithInboundURL:url sourceApplication:sourceApplication];
  if ([parsedUrl appLinkData]) {
    NSURL *targetUrl = [parsedUrl targetURL];
    UnitySendMessage(“HogeObject”, “DeepLinkMethod”, targetUrl);
  }
  …
}
```

これでディープリンクの導入ができました。

ADD_ITEMを使うともっとラクチンにできるかもしれないので、引き続き検証しようと思います。
今回は以上です！
日常で使えるエンジニア用語7選

この記事は [❤️ち→む⭐️びずり→みん❤️ Advent Calendar 2015](http://qiita.com/advent-calendar/2015/team_bizreamin) の 1日目の記事です。

このアドカレは僕が思いつきで始めたものです。
参加してくれてる皆さんありがとうございます！

そしてこの記事は僕たちが普段使っているエンジニア用語を含めて、日常でも使えるようなものを７つほど紹介していきたいと思います。
これから記事を書く皆さんのハードルが下がれば幸いです。
では張り切って紹介していきましょう！！

# 1. OSS（オッス）
使い方
「OSS！オラ悟空！」

# 2. zsh（ズッシュ）
使い方
「俺あのバッシュかっこよくて欲しいんだよね〜」
「わかる〜俺はあのzshが欲しいな〜」
「わかる〜」

# 3. GNU（牛乳）
使い方
「ちょっとタカシ〜！GNU買ってきて〜」

# 4. Pull Request（ぷるり）
使い方
「今日も冷えますね〜」
「えぇ〜Pull Requestですね〜」

# 5. Babel（バブゥ）
「ハーイ！Babel！チャーン！」

# 6. Singleton（シングルトン）
「俺ワカメのスープ好きなんだよね〜」
「わかる〜俺はSingletonの入ったスープが好きかな〜」
「わかる〜」

# 7. Subroutine（サブルーチン）
「紅白の出演者にサブちゃんがいないと寂しいよね〜」
「そうだね〜毎年のSubroutineだったからね〜」
「わかる〜」


# おわりに
今年1年は僕にとって大きな変化のあった年でした。
辛いことも多くありました。
その中でたくさんの知り合いが増え、その方々と共に過ごせた時間は本当にかけがえのないものです。
支えてくださったみなさん、仲良くしてくださったみなさん、本当にありがとうございました。

これからもエンジニアとして、みなさんと一緒に成長していきたいと思っています。
そして、エンジニアの成長に欠かせないものは「アウトプット」だと僕は考えています。
どんなに汚いコードでもGitHubにあげる。少しでも学びがあったらその知見を記事にする。
そういったことが自身の、そして周りの方の成長につながります。
それが、僕が今年1年、激動の1年を過ごした中で学んだ教訓です。
そのアウトプットの場を（半ば強引ではありますが）こうやって作って、それに賛同して「記事を書くよ」と言ってくれたみんながいることを本当に幸せに思います。
みなさん、本当にありがとうございます。
これからも、❤️ち→む⭐️びずり→みん❤️を盛り上げていきましょう！
はじめに

そんなに正確ではないかもしれないけど、便利であろう情報を数日にわたって書いていきます。


# はじめに

ある概念を理解することと、使えるようになることは別のことです。
ある概念に関して定義からその性質を追って行き、その結果理解に到達するという手順はもちろん重要なことですが、その手順を毎回追っていってはより高度なことを理解することは難しいでしょう。例えば僕らは小学校で四則演算を苦労して学習していったわけですが、いつの間にかそれらを瞬時にこなし、より高度なことを中学、高校、人によっては大学、大学院と進み、理解し、また使えるようにしてきました。
未知の概念を使えるようにするには、その概念についてイメージを頭に思い浮かべられるようにする必要があります。ここで浮かべるイメージをその概念の「メンタルモデル」と言うことにしましょう。僕らはより高度な概念を理解するためにそのメンタルモデルを思い浮かべながら文章を追いかけます。もしメンタルモデルと文章に矛盾が発生したらメンタルモデルを修正します。そうして矛盾が発生するごとに今までの事象を全てうまく説明できるように修正していき、メンタルモデルの完成度を高めていくのです。

また、より高度な概念を理解する際だけでなく、アイデアを生み出す際にも適切なメンタルモデルは必要です。雑なメンタルモデルからは雑なアイデアや間違ったアイデアしか思いつきません。僕は「無知ほど新しいアイデアが出せる」という言及は信じることができません。きっかけ出すことだけならともかく、アイデアを生み出せる人間は、向き合っている問題に対して常に適切なメンタルモデルを持っているでしょう。
頭に描くイメージというのは人によって様々なものです。大事なことは概念の要点を頭の中に全て取り込むということです。頭に入りきらないものを僕らは扱うことができません。頭に入りきらないものを基にアイデアを生み出すことも恐らくうまくできないでしょう。

先ほどの四則演算の例では、僕らは数やその演算について、メンタルモデルを長い時間をかけて獲得してきたのです。人によってはそのメンタルモデルが雑であり、学習の過程で脱落してしまったかもしれません。たまたま構築したメンタルモデルがうまい具合にマッチしたために、数年から数十年特に苦労なく来れたかもしれません。僕らはプログラミングという知的活動に関わっていますが、そのメンタルモデルの構築や修正といった過程をずっと続ける必要があります。なんとかして次から次へと大量に現れる概念のイメージを獲得し続けなければならないのです。もっと言うならプログラミングに関わらなくても、スポーツマンであっても、サービスマンであっても、新しい概念の理解は必要なものです。プログラミングに関わる僕らはそれらの量が圧倒的に多いという違いはあるかもしれませんが。
可能なら、メンタルモデルを構築するための手法を磨いておくといいかもしれません。それは未知に対応する能力そのものです。そうすれば、激動と言われるこのIT業界でもいくらか楽になるかもしれません。

現在、プログラミングという領域はまだ教育が整っていない為、多くのユーザが独力かつ長い時間をかけて、プログラミングを「使える」ようにして来ました。そのためそれぞれが持つメンタルモデルの多くは初めに触った言語や、その次に触った言語あたりに大きく依存していることでしょう。プログラマの能力を評価することが難しいのは、そういったプログラマとしての成り立ちがまちまちであることが多分に関わっていることと思います。相手をきちんと理解することすら大変な現状です。将来的にはプログラミングに関する教育が整備され、みんながつまづく箇所やそれに対する処方箋に関しても整備されてくるかもしれません。

なにはともあれ現在において、初心者が触った言語は高い確率でオブジェクトという複雑な仕組みを備えています。その為、Haskellを理解する際には大いに戸惑うことでしょう。HaskellやMLやLispといったλ計算に基づく言語（ここではそれらを指して「関数型言語」と呼ぶことにします）は、驚くほどシンプルな計算モデルを持っています。その理論についても興味深いものですが、それら関数型言語を「使える」ようにするには、そのシンプルすぎるほどにシンプルな計算モデルをきちんと受け入れ（今まで見てきたオブジェクト指向言語等のメンタルモデルとは別であると認識し）、そのλ計算に基づいてメンタルモデルを構築することをお勧めします。現在の関数型言語はその表層だけを見たら複雑すぎるのです。もしHaskellを触っていて複雑に見えるなら、他の角度から試してみてはどうでしょうか。

そういえば、僕がHaskellを理解できたと実感したのはHaskellがλ計算に基づいて非常にシンプルだ、と実感出来たときでした。まあしかし残念ながら前述した様に、それまでの構築してきたプログラミングのメンタルモデルは一人一人異なります。よって僕の経験談はあまり役に立たないでしょう。

僕らエンジニアは今までも未知のものを理解しようとしてきました。Haskellで出会う未知の概念に関しても基本的には同様に扱い、メンタルモデルを獲得して行けばいいと思います。

このアドベントカレンダーでは、Haskellでのスペースリークでの理解に関してもそうですが、使い方、つまりメンタルモデルの構築に関して役に立つ情報が残せればと思います。


## メンタルモデルのメンタルモデル

ここまで述べてきたメンタルモデルに関するメンタルモデルは、僕が構築したものです。
なので人によってはfitしないこともあるかもしれませんが、このメンタルモデルを採用することでいろんなものが見えてきます。

* 成長とはより適切、より高度なメンタルモデルの獲得
* 教育とはメンタルモデルの伝達
* 成長の高速化とは、メンタルモデルの自覚的な構築
* 若者の方が成長が早いとか嘘でしょ僕の方が早いし（適当）

まあこれはメンタルモデルを伝達する試みですが、単純に僕の手法を伝えてるだけとも言います。
読み手としては適当に便利に受け取ってもらえればそれで構いません。


あ、明日からちゃんとスペースリークに関連する話に入ります。
新しい圧縮アルゴリズムBrotliをnginxで試す

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


## Brotli

[Brotli](https://github.com/google/brotli/)はGoogleが最近公開した新しい圧縮アルゴリズムとその実装です。[zopfli](https://github.com/google/zopfli)と違って従来のよく利用されているdeflateアルゴリズムと互換性はありませんが、deflateアルゴリズムと同じくくらい高速でなおかつ圧縮率がさらに向上しているのが特徴です。

今回はこのBrotliによるコンテンツ圧縮をnginxで利用する方法について紹介します。

## ngx_brotli

[ngx_brotli](https://github.com/google/ngx_brotli)は[ngx_http_gzip_module](http://nginx.org/en/docs/http/ngx_http_gzip_module.html)および[ngx_http_gzip_static_module](http://nginx.org/en/docs/http/ngx_http_gzip_static_module.html)のbrotli版に相当するnginxモジュールです。以下のようにnginxでgzip圧縮をしたことがある人ならなんとなくどう使うかわかるディレクティブがあります。（ディレクティブはほかにもいろいろとあります。詳しくはngx_brotliの[README.md](https://github.com/google/ngx_brotli/blob/master/README.md)を参照して下さい）

|ディレクティブ名|値      |解説|
|:-------------|----------|----|
|brotli        |on &#124; off |brotliによる圧縮を有効/無効にする|
|brotli_types  |mime-type ...|圧縮対象のMIME typeを列挙する|
|brotli_static  |on &#124; off &#124; always|事前にbrotliで圧縮したファイルを配信する|

### libbrotliをインストールする

ngx_brotliをインストールするには事前に[libbrotli](https://github.com/bagder/libbrotli)をインストールする必要があります。

```console
$ git clone https://github.com/bagder/libbrotli
$ cd libbrotli
$ ./autogen.sh
$ ./configure
$ make
$ sudo make install
```

### ngx_brotliをインストールする

続いてngx_brotliをインストールする。nginxのモジュールはnginx本体と一緒にビルドしなければならないのでここでは[nginx-build](https://github.com/cubicdaiya/nginx-build)を使ってインストールする。

```console
$ brew tap cubicdaiya/nginx-build
$ brew install nginx-build
$ echo "[ngx_brotli]\nform=git\nurl=https://github.com/google/ngx_brotli.git" > modules3rd.ini
$ nginx-build -d work -v 1.9.7 -m modules3rd.ini
$ cd work/nginx/1.9.7/nginx-1.9.7
$ sudo make install
```

次に`nginx.conf`に以下の設定を書く。

```nginx
server {
    listen 8080;
    root html;
    brotli on;
}
```

これでリクエストヘッダに`Accept-Encoding: br`を付けてindex.htmlをリクエストすると、

```console
$ curl -H "Accept-Encoding: br" -I http://127.0.0.1:8080/index.html
HTTP/1.1 200 OK
Server: nginx/1.9.7
Date: Mon, 30 Nov 2015 14:41:29 GMT
Content-Type: text/html
Last-Modified: Wed, 06 Aug 2014 17:07:04 GMT
Connection: keep-alive
ETag: W/"53e260b8-264"
Content-Encoding: br
$
```

という具合に`Content-Encoding: br`となってるのが確認できます。
Qiita:Teamで日報管理している方へ向けて

Qiita:Team Advent Calendar 2015の１日目を担当するしょっさん（@syossan27）です。

今回は実際の現場でQiitaの日報が役に立っているお話をば。

## Qiita:Teamの日報

Qiita:Teamにはデフォルトで日報のテンプレートがあります。
「今日やったこと」や、「次にやること」といった見出しが既に入力された状態になっており、すぐに日報を書くことが出来る便利仕様です。
詳しくは[こちら](http://blog.qiita.com/post/90437053694/qiita-team-3step)

## どうやって活用してるの？

弊社では日報の内容をただ腐らせるだけでなく、毎日の朝会の際に活用させています。
どのように活用しているかというと、ChatworkのChatbotを使い、メンバーの前日分の日報を取得し「次にやること」をまとめてBotに呟かせてます。
これで朝会での報告の時に誰でもすぐに作業進捗を報告できるようになっています。

![スクリーンショット_2015-11-30_1_57_16.png](https://qiita-image-store.s3.amazonaws.com/0/39382/6627ea98-aefe-0e8d-0d24-366ccf61fff0.png)

作成にあたってはこの辺りの記事が参考になると思います。
[ChatWork API と GitHub などのサービスと連携できる「Chabot」を作った](http://c-note.chatwork.com/post/69274738468/chabot)
[Slack と Qiita:Team を使って気楽に日報 #qiita_hackathon](http://ja.ngs.io/2014/12/14/hubot-qiita/)

## 個人的に作ったもの

また、Qiita:Team上で記事を探す時にいちいち日報を除外する「-tag:日報」を打つのが面倒だったので、QiitaSearchというChromeExtensionを作成しました。
[QiitaSearch](https://github.com/syossan27/QiitaSearch)

使い方は凄く簡単で、Extensionのツールバーに表示されたQiitaのマークをクリックするとウィンドウが表示されるので、そこから検索すると日報が除外された状態で検索されます。

![スクリーンショット 2015-11-30 1.53.17.png](https://qiita-image-store.s3.amazonaws.com/0/39382/b798fc9d-3503-73b9-753d-c58e7f2b4ad4.png)

是非、Qiita:Teamで日報を使っている方は使ってみてください！

以上、Qiita:Teamの日報についての記事でした。
Introduction - Why React Native?

この一人React Nativeアドベントカレンダー2015を始めるにあたって、最初に前提条件を整理しておきます。

まず私のバックグランドは、外資系金融会社でインフラ業務を７年間、その間Perlを用いてツールなどを開発していました。昨年、スタートアップ業界に転職し、Rails, iOS(swift), Angularを主に業務を行っています。Reactはメイン業務では使用しておらず、ReactNativeを自分のプロジェクトで利用しています。したがって、React自体の理解不足の可能性があるのでその辺はご容赦いただき、何かありましたらご指摘していただければ思います。

# What is React Native?

> React Native enables you to build world-class application experiences on native platforms using a consistent developer experience based on JavaScript and React.

React NativeはJavascriptとReactを用いてネイティブアプリを作るための開発ツールセットです。

# How is React Native？

私が見るところ、ReactNativeは海外ではちらほら話題が出ているのにもかかわらず、日本ではほとんどReactNativeというワードを見ません。例えば、下記のポストのようにiOSデベロッパーのMarc氏は、"ReactNativeを始めて数ヶ月経った今、「もうObjectCやSwiftでアプリを作らない」と自信を持って言える"、と言っているように、さらに[ReactNativeのレポジトリ](https://github.com/facebook/react-native)のスター数は23,000を超えるモンスターレポジトリになっています。そして、Releaseスピードも早く2,3週間に一回、新しいバージョンをリリースするサイクルになっています。

> 'Fast-forward a couple of months, and I’m confident enough to say I may never write an iOS app in Objective-C or Swift again.'
["An iOS Developer on React Native" from Medium post](https://medium.com/ios-os-x-development/an-ios-developer-on-react-native-1f24786c29f0#.8bnrqaody)

## Pros and Cons of React Native

私の視点で良い点と悪い点を箇条書きしておきます。

### Pros（良い点）
* **iOS,androidのネイティブアプリをJavascriptで作れる**
* iOSとAndroidのコードの共有化
    * コンポーンネントは無理なところもあるが、ロジックは共有できる
* **Reactを使う**
* **Reactのエコシステムを利用できる。(Flux, Redux等）**
* BabelでtransformしているのでES6,7等の新しいシンタックスで書ける
* 非同期のプログラムを書く（業務で同期プログラムのみを書いている人には勉強になる）

### Cons(悪い点)
* リリースサイクルが早くてバージョンアップについていかないといけない
* 問題があるとgithubのissueをあさったり、stack overflowで探さないといけない。(英語リソースの数は少なくはありません)
* 後発のAndroidの利用できるAPI,Component数がiOSに比べて少ない
  * したがって、githubのモジュールを入れる必要がある（が、リリースサイクルが早いため、メンテされてないと使えない場合がある。モジュールを使うリスクを考慮する必要がある)

## Summary

海外では注目を集めていて、ReactとJSで開発でiOS, Androidアプリを開発できていまうReactNativeは視野に入れる価値のある開発手段であると思います。またReactやそのエコシステムを実際に触れ、学ぶことができ、それがWebにそのまま生かせる（逆の発想ですが）のも魅力的です。このアドベントカレンダーでは、稚拙ですが、ReactNativeについて色々書きたいと思います。

明日はiOSアプリを作ってみようと思います。