OmniAICreator/Qiita-1.07M huggingface dataset:
New Relic APM: トランザクショントレースとデータベースタブ（有料機能）

Advent Calendar 3日目です。[前日の続き](http://qiita.com/kumatronik/items/cd28f5caa1695ff10d0c) の話をしたいと思います。２日目は、APM の無料機能のトランザクション詳細の話しまでしました。

今日は、さらに詳細まで追跡できるので、それについて説明します。また、これは、Pro (有料）機能となります。

### トランザクション詳細
昨日説明したトランザクション詳細の下部に、現在指定している期間の中での処理の遅い順のリストがあります。ここでは、16:40 分の処理に最も時間がかかったようです。この行をクリックします。

![list.png](https://qiita-image-store.s3.amazonaws.com/0/46003/ee015b54-8ee3-f7af-2351-cfe8f818fa43.png)

### トランザクショントレース (概要)

クリックすると、トランザクショントレースのポップアップが表示されます。特定のトランザクションの処理詳細が見れます。（これまではある時間帯のトランザクションサマリ情報しかみれなかった）
これにより、ピンポイントで問題箇所を特定できます。この機能が他のパフォーマンスツールにはない強みの一つと言っていいのではないでしょうか。トレース詳細(Trance details)タブを選択することで、さらに詳細の情報へと入っていけます。

![day3_002.png](https://qiita-image-store.s3.amazonaws.com/0/46003/11b03786-4464-1e52-9ce5-ae4d65512981.png)

### トランザクショントレース (トレースの詳細)

このトランザクションでの処理の詳細です。かなり細かいレベルまで見れることがわかると思います。SQL 文レベルまで見れます。SQL がある処理は、右に DB アイコンがあるので、それをクリックします。すると、SQL が表示されます。（具体的な数値は表示されません）

![day3_003.png](https://qiita-image-store.s3.amazonaws.com/0/46003/91f082d7-eda1-7e12-c5c4-4efc8e0bf081.png)

### トランザクショントレース (マップ)

Map(Beta) タブをクリックすると、この処理で利用している外部サービスとの関係を確認できます。特にない場合は、見ても意味ないかなと思います。ある場合は、外部サービスにどれくらいかかっているのかも

![62805cf7-a5da-86f2-62fd-669611fbd69b.png](https://qiita-image-store.s3.amazonaws.com/0/46003/6505aa35-6f6b-e2df-508f-344a0f680aab.png)

### トランザクショントレース (SQL文)

これは、利用しているSQLの全リストです。

![day3_005.png](https://qiita-image-store.s3.amazonaws.com/0/46003/3377a20c-295e-9811-3d96-ca11a922e4e6.png)

### データベース (Databases) タブ

ここも、有料機能となります。Databases タブは、Transaction Tracesタブと連動してます。
ここでは、DBの処理を軸にパフォーマンスの遅い処理を確認できます。

![apm_db.png](https://qiita-image-store.s3.amazonaws.com/0/46003/34342f3c-2e07-7ceb-9fc2-ac7479d407ec.png)

### データベース (Databases) 詳細

リストから任意の処理を選択すると、その処理の詳細な情報がみれます。そこから、そのDB処理がどのトランザクション処理に影響を与えているかも確認できます。

![apm_db_02 (1).png](https://qiita-image-store.s3.amazonaws.com/0/46003/1c2a92d8-14f3-22fc-135d-b208aff77575.png)

### 最後に

ということで、3日目は、非常に簡単ですが、有料機能である トランザクショントレースとデータベースタブを見てました。
kCFCoreFoundationVersionNumber



この記事は [iOS Jailbreaking Advent Calendar 2015](http://qiita.com/advent-calendar/2015/ios-jailbreaking) の3日目の記事です。
2日目は[Swift for tweak.](http://qiita.com/r_plus/items/55d6872ee8bdbb0c4b1b)でした。

kCFCoreFoundationVersionNumberはCoreFoundation.frameworkのバージョンを取得出来る定数でCFBase.hで定義されています。

````c:CFBase.h
CF_EXPORT double kCFCoreFoundationVersionNumber;
````

バージョンによって分岐する場合、Jailbreak界ではこれでバージョン切り分けをするか`respondsToSelector:`で切り分けるかするのがデファクトです。というのもこのバージョンによってFilterする機能がCydiaSubstrateに搭載されていた為でしょうか。これを真似て後にPreferenceLoaderでもCoreFoundationVersionキーでのFilterが導入されています。

あまり普通のアプリケーションやライブラリで使われているのを見ませんがCFBase.hには節目のバージョンがメジャーバージョンアップの時に追加されています。

````c:CFBase.h
#if TARGET_OS_IPHONE
#define kCFCoreFoundationVersionNumber_iPhoneOS_2_0 478.23
#define kCFCoreFoundationVersionNumber_iPhoneOS_2_1 478.26
#define kCFCoreFoundationVersionNumber_iPhoneOS_2_2 478.29
#define kCFCoreFoundationVersionNumber_iPhoneOS_3_0 478.47
#define kCFCoreFoundationVersionNumber_iPhoneOS_3_1 478.52
#define kCFCoreFoundationVersionNumber_iPhoneOS_3_2 478.61
#define kCFCoreFoundationVersionNumber_iOS_4_0 550.32
#define kCFCoreFoundationVersionNumber_iOS_4_1 550.38
#define kCFCoreFoundationVersionNumber_iOS_4_2 550.52
#define kCFCoreFoundationVersionNumber_iOS_4_3 550.52
#define kCFCoreFoundationVersionNumber_iOS_5_0 675.00
#define kCFCoreFoundationVersionNumber_iOS_5_1 690.10
#define kCFCoreFoundationVersionNumber_iOS_6_0 793.00
#define kCFCoreFoundationVersionNumber_iOS_6_1 793.00
#define kCFCoreFoundationVersionNumber_iOS_7_0 847.20
#define kCFCoreFoundationVersionNumber_iOS_7_1 847.24
#define kCFCoreFoundationVersionNumber_iOS_8_0 1140.1
#define kCFCoreFoundationVersionNumber_iOS_8_1 1141.14
#define kCFCoreFoundationVersionNumber_iOS_8_2 1142.16
#endif
````

・・・が、見てわかる通り8.3や8.4がなかったりと完全網羅されていません（ちなみにちゃんとバージョンあがってます）。このあたりが普通のアプリケーションで使われない原因でしょうか。

SDKのtbdファイルに記述があるのでそちらから確認出来ます。これはiOS 9.1で1241.11です。

````
$ pwd
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/CoreFoundation.framework
$ head CoreFoundation.tbd 
---
archs:           [ armv7, armv7s, arm64 ]
platform:        ios
install-name:    /System/Library/Frameworks/CoreFoundation.framework/CoreFoundation
current-version: 1241.11
compatibility-version: 150.0
objc-constraint: retain_release
exports:         
  - archs:           [ arm64 ]
    symbols:         [ __CFBigNumGetInt128, __CFBigNumGetUInt128, __CFBigNumInitWithInt128, 
````

後はCydiaSubstrateがローディングを開始した際にも表示されます。こちらは実機でのkCFCoreFoundationVersionNumberでの取得結果なので、自前のkCFCoreFoundationVersionNumberリストの作成時には一応こっちで確認するようにしていますが、いまのところSDKと相違があった事はないです。

````
Dec  3 23:10:58 i6s com.apple.WebKit.WebContent[8080]: MS:Notice: Injecting: com.apple.WebKit.WebContent [com.apple.WebKit.WebContent] (1240.10)
````
僕がよく使うSlackの便利機能

CrowdWorks Advent Calendarの4日目になります。
昨日担当の[toku345](http://qiita.com/toku345)さん、お疲れ様でした！

## 本記事の内容

弊社ではチャットツールとして[Slack](https://slack.com)を使っています。
本記事では、僕がSlackを使うときによく利用している機能を上げていきたいと思います。

どちらかというとSlackに慣れてない人向けの平易な記事になりますが、ご了承を

### *注意*

以下で説明しているショートカットはMac用です。
Windowsユーザーは基本cmdキーをctrlキーに置き換えてくだされば基本動くかと思います。

## キーボードショートカット一覧を表示

ショートカット: `cmd`+`/`

ショートカットの一覧を表示してくれます。
見てると知らなかった機能が色々出てくると思うので、一度眺めてみると良いです。

Githubでも`?`(`shift`+`/`)を入力すると似たようなことができますね。

## 過去の投稿を引用

投稿のURLを入力することで、過去の投稿を引用できます。
投稿時刻を右クリックして"Copy Link"を選択しURLをコピーしてフォームにペーストすると楽です。

## emoji

みんな大好き絵文字機能です。
以下の2つの入力方法がありますので、使いやすい方を選ぶとよいです。

1. `:smile:`のように`:`で絵文字名を囲んで入力する
2. フォーム右側にある顔マークをクリックして、絵文字パレットを出し・選択する

ちなみに「絵文字」は海外でも"emoji"です

### 連続してemojiを出す

通常、絵文字パレットで一つemojiを選択するとその時点で絵文字パレットが消えて連続で入力できません。
`shift`を押しながらemojiを選択すればパレットが消えないため、連続入力できます。

### 新しいemojiを追加する

Customize Slackの中からできます。
サイズが128px以下でないとアップロードできないことに注意。

### 余談：Macの絵文字パレットの出し方

Slack関係ないですが、Macは純正で絵文字パレットを持っています。
`cmd`+`ctrl`+`space`で出せるので是非使ってみてください。

### 余談：画像リサイズ

Macならばプレビュー.appのツールメニュー内にある”サイズを調整…”からリサイズできます。アップロードしたい画像が大きすぎる時はこれを使えばよろしいかと。

## 画像表示

### コピペで投稿

画像をコピーした状態でそのままペーストすれば"Upload a file?"と出てきて、お好みとあればコメントなどを付与してその画像を投稿できます。
`cmd`+`ctrl`+`shift`+`4`で選択範囲をコピー、またこのコマンドを入力した後に`space`を押せば選択ウィンドウをコピーになるので、これらのショートカットを使い、さらにコピペで投稿を使うと非常に便利です。

### URLで投稿

画像URLを投稿すると、その画像が表示されます。
Web上の画像をいちいちダウンロードするのが面倒な場合は、画像のURLをコピペしてやるとダウンロードする必要がなく、便利です。

## add reaction

投稿に対して顔文字で返答することができます。
やり方は以下の3つになります。下2つは最新の投稿につける方法になるので、最新投稿以外では1の方法を使うしかないと思われます

1. 投稿をホバーした時に右側に出てくるemojiマークからemojiを選択
2. `cmd`+`shift`+`\` を入力すると出る絵文字パレットから選択
3. `+:smile:`のように、通常のemoji入力の前に`+`をつける

反応するだけでなく投票などにも使える、大変便利な機能です

### 注意

- skin-toneは変えられません
- 一つの顔文字につき50reactionまでになっています

どちらも遠からじ対応しそうですが、まだ待ちです

## チャンネル移動

チャンネル移動は普通に画面左のカラムを選択するのでも良いですが、
`cmd`+`k` or `t`で開く'Jump to a conversation'を使うと素早く移動できて便利です。

## DM

画面左のカラム下部にあるユーザーを選ぶと、そのユーザーへダイレクトメッセージを送れます。

最近までDMは1対1のものしか送れませんでしたが、最近複数人のDMグループを作れるようになったので、また便利になりました。
複数人にDMしたい時は上記の`cmd` + `shift` +`k` or `t`を使うか、左カラムの'DIRECT MESSAGES'というラベルをクリックするとできます。

## 環境設定

よく使う、という表現は変かもしれませんが、日常的に使う設定をば

### Hightlight Words

設定した単語をハイライトしてくれるようになります。
デフォルトでもアカウント名はハイライトされるようになっています。
（日本語はうまく動かないっぽい？）

### Desktop Notifications

僕は普段は”Only for Highlight Words and direct messages”という設定にしています。
書いてある通りですが、上記で設定したHighlight WordsとDMのみ通知してくれるので、煩わしさが軽減されます。

### Notification Sound 

Mute all soundsにしてます。基本、音出ても困る環境で使ってますし

## セキュリティ

### 二段階認証

これはやっておきましょう
https://< team_name >.slack.com/account/settings#two_factor

## Surprise me!

Preferences > Advanced Options > Surprise me! を選択すると・・・？
KotlinでHashMapを良い感じに結合する

## ライトな感じで結合する

Perlとか書いているとこんな感じでハッシュを結合することがある。

```perl
my %hoge = (a => 1, b => 2);
my %fuga = (%hoge, c => 3);
```

この例だけ見るとアレだけど、関数の戻り値とかをねじ込みたいとか、親クラスのやつを上書きしてちょっと追加したいとか、たまにある。これと似たようなことをKotlinで実装したメモ。

```kotlin
val hoge = hashMapOf("a" to 1, "b" to 2)
val fuga = hashMapOf(*hoge.toList().toTypedArray(), "c" to 3)
```

## 一応解説

`hashMapOf`は、引数がvarargになっている。varargな引数に渡せるのはリテラルの羅列だけでなく、実は配列もspread演算子を使うことで混ぜて渡すことができる。つまり、`HashMap#toList`と`List#toTypedArray`を使ってPairの配列にしてあげることで、hashMapOfに混ぜることができるようになる。

HashMapの例で説明したけども、`hogeOf`系のやつならどれでも使えるテクニックだと思う。

## 参考

- https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/hash-map-of.html
- https://kotlinlang.org/docs/reference/functions.html#variable-number-of-arguments-varargs

## 追記

普通に`+`で結合できる事案だった。とんでもない盲点だった。。。orz
ngsw_taroさんありがとうございます！！！
高齢者向けアプリ開発で気をつけたい4つのポイント

この記事は[ニジボックスAdventCalendar2015](http://qiita.com/advent-calendar/2015/nijibox)の4日目の記事です。

#  :laughing: 初の高齢者向けアプリ開発
ニジボックスでは現在、高齢者向けのタブレットアプリを開発しています。
今までのニジボックスはソーシャルゲーム開発など、
ガラケーやスマホに馴染みがある方々へのサービス開発が全てで、
高齢者向けのサービス開発自体初の試み。

今回は初の高齢者向けのアプリ開発で躓いたポイントと、
その解決策をいくつかご紹介します。

## :fire: 1. ボタン操作でアクションが起こらない問題
　介護施設にご協力いただき、高齢者の方々にアプリを触ってもらったところ、
　ボタン押下時のアクションがうまく行かないことがある…。
　はて何ぞや？と高齢者の操作を見ていると、ボタンを押している時間が長い。
　物理的なボタンと違い、押せているのかわからないという心理が働いているようでした。
　この点はイベントリスナをonclickからtouchendにすることで解決。

## :fire: ２．続・ボタン操作でアクションが起こらない問題
　よしよし、今度は長押ししても大丈夫になった！と思いきや、
　またもボタン操作が効かないとの報告が上がってきました。
　詳細を聞くと、高齢者の方がタブレットを持つ際、
　左手の親指と右手の親指で画面を触ってしまっているとのこと。参ったこれは。
　ソース改修で行ける可能性もゼロでは無かったのですが、
　この点は据え置き出来るタブレットを手配することで回避しています。

## :fire: 3. 開発項目見落とし問題
　事前に洗い出した開発項目で見落としていたのが「キーボード」でした。
　認証機能を有しているので入力機能が必要になるのですが、
　端末のキーボードは1番目に書いた長押し問題に加え、
　高齢者の方からはボタンの小ささ、複雑なUI／UXが不評で使えませんでした。
　その後「ひらがなだけパターン」と「数字だけパターン」のオリジナルキーボードを開発・検証。
　馴染みがある並びであれば、高齢者の方も身構えることなく操作出来ることが見え、
　最終的には「数字だけパターン」のキーボードを採用しています。

## :fire: 4. 変なボタン押しちゃったら帰れない問題
　慣れ親しんだ人にとっては何てことないAndroidのホームボタン。
　しかし高齢者の方が間違ってホームボタンを押したあと、元のアプリに戻るのは非常に難しいです。
　今回は特定のアプリだけを起動出来るタブレットに仕立てる時間と予算の確保が難しく、
　子供向けの端末操作を抑制するアプリを仕込んで回避しました。
　ホーム画面に配置するアプリを限定する＋複雑な端末操作を抑止することで、
　擬似的に特定アプリに特化したタブレットを実現させています。
　
## :heavy_check_mark: まとめ
　自分が感じている当たり前は、世間の当たり前じゃないなぁとあらためて痛感しています。
　開発は終盤に差し掛かっていますが、今なお営業、ディレクター、エンジニア皆が協力しながら、
　どうすれば「タブレットなんて触れない」っていう高齢者の方々の思いを払拭できるのか？、
　このアプリに馴染んでもらえるのか？を日々議論し、試行錯誤している最中です。
　技術で解決している部分もあれば、アイディアで解決している部分もあり、
　高齢者向けアプリ開発は面白い毎日です。少しでも参考になれば！
JavaのコードをScalaのコードに書き換えてみよう

## はじめに

ファイルの内容が同じだったら同じ値を返し、ファイルの内容が違ったら違う値を返す関数が必要でした。

ぐぐってみると、意外と見つかりません。そういうときはJavaに聞けです。

[ファイルのメッセージダイジェストを計算する。 - うなの日記](http://unageanu.hatenablog.com/entry/20070827/1188195493)を見つけました。Javaのコードです。

このコードをScalaのコードに書き換えられれば、欲しい関数が手に入るということです。素晴らしい！

## varはご法度

Scalaではvarはご法度です。

「なんでvarはご法度なの？」とか、そういうデリカシーに欠けることは誰も口にしません。

けど、今回はvarのことも考えました。

ぐぐってみると、いつもの灰色のサイトに辿り着きます。

今回は[こちら](http://www.ne.jp/asahi/hishidama/home/tech/scala/file.html)です。

[リンク先](Iterator.continually()を使おう - kmizuの日記)も要チェックです。

## 確認方法

md5やsha-256であれば、ターミナルを使って確認できます。

```
$ md5 tokyo.png
$ shasum -a 256 tokyo.png
```

念のため、確認用の画像も用意しました。

![tokyo.png](https://qiita-image-store.s3.amazonaws.com/0/29884/e6b0f8b2-ed61-88a4-6313-21b182daa264.png)

## 準備万端

あとは実装して、確認するだけです。

## あとがき

実装してみて辛かったことはターミナルで確認したハッシュ値と一致しなかったことです。

:arrow_down: を使うとターミナルのハッシュ値と一致しませんでしたが、

``` scala
val bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream("tokyo.png")))
```

:arrow_down: を使うとターミナルのハッシュ値と一致するようになりました。

``` scala
val fileInputStream = new FileInputStream("tokyo.png")
```


しばらくしたら書き換えたScalaのコードを貼る予定です
 :+1: 

[こちら](https://gist.github.com/t-mochizuki/e3c09c971f8e2020e6d4)に書き換えたScalaのコードを用意しました :coffee:
hxmlファイルに書くコンパイルオプションで重複する記述を省略する

Haxeではコンパイルオプションを`hxml`というファイルに記述しておくことができます。

Haxeはクロスプラットフォームに向けてコンパイルを行うことが出来るため、
この`hxml`ファイルに複数のターゲットを記述するケースがあります。

```hxml:複数のターゲットを記述する例
# jsにコンパイル
-main Main
-lib nanika
-js main.js

--next

# pythonにコンパイル
-main Main
-lib nanika
-python main.py
```

この時、`-main`と`-lib`をターゲット毎に書くのは冗長です。

これを解決するために`--each`というオプションを利用出来ます。
`--each`オプションを利用すると以下のように簡潔に記述することが出来るようになります。

```hxml:--eachを使って簡潔にしたもの
# 共通のオプションを定義
-main Main
-lib nanika

--each

# jsにコンパイル
-js main.js

--next

# pythonにコンパイル
-python main.py
```

`--each`を記述した後に、書かれるブロック（`--next`が登場するまでの区切り）に頭で定義したオプションが引き継がれるようになります。

リソースの埋め込みなどをコンパイルオプションに書き出すと、出力ターゲット毎に同じ記述が増え、変更などを行う際につまらないミスの原因にもなるので、覚えておくと便利なオプションですね。
たった20行のJSだけでブラウザと会話できるようになった

※ JavaScript for Robotics or Hardware Advent Calendar 2015 12/4用　
http://qiita.com/advent-calendar/2015/jsrobotics

さて、前回までで、言葉を発する、言葉を認識するを紛らわしい似た文章で説明してみました。
[JavaScriptだけで言葉をしゃべらせてみた](http://qiita.com/wks/items/a5dfae0909956a3002bd)
[Javascriptだけで言葉を認識させてみた](http://qiita.com/wks/items/68d19dada292d39e5c96)

今回はこれらを組み合わせて、ロボット(ブラウザ)と会話をさせてみましょう。
それもたった20行だけで、何もインストールせず、ブラウザ(Chromeでしか動きませんが…)だけで、です。

```javascript:speech.js
window.SpeechRecognition = window.SpeechRecognition || webkitSpeechRecognition;
var recognition = new webkitSpeechRecognition();
recognition.lang = 'ja';
recognition.addEventListener('result', function(event){
    var speach = "クリスマスまでの日付しか答えれません。";
    var text = event.results.item(0).item(0).transcript;
    if(text.indexOf('クリスマス')>=0 && text.indexOf('何日')>=0){
        var now = new Date();
        var xmas = new Date(2015, 11, 25);
        var diff = Math.ceil( (xmas.getTime() - now.getTime() ) / 86400000 );
        if(diff>0) speach="あと"+diff+"日です！";
        else if(diff==0) speach="今日です！";
        else speach="悲しいですが、もう終わりました。";
    }
    var ssu = new SpeechSynthesisUtterance();
    ssu.text = speach;
    ssu.lang = 'ja-JP';
    speechSynthesis.speak(ssu);
}, false);
recognition.start();
```
このコードを実行して「クリスマスまで何日？」と話しかけてみましょう。
言葉のゆれ対策で「クリスマス」と「何日」が含まれてたら実行するようにしています。
これで、「そういえばクリスマスまであと何日だっけ？」などの会話にも対応が可能になっています。

実際に動作してるのはこちら。
http://jsdo.it/wakasamasao/dayxmas
※Chromeしか動作しません

日付を教えてくれるだけの機能ですが、ブラウザに心が宿ったような気分を味わえると思います。
これに画面に顔、手などの身振りがつくと、もう愛着しかわかなくなります。

このように、ブラウザだけで簡易ではありますが、簡単にコミュニケーションロボットのベースになるところを学ぶ事ができます。

ここまで作ると、もはやこれはロボットのプラットフォームでしかありません。

そうブラウザなら。
コンパイルオプションで記憶域節約

つい少し前のまで、会社のIBMiはV5R4だったので、V7R2になっていつの間にか色々な機能が増えています。その一つにV6R1以降でコンパイルオプションに「\***NOUNREF**」を付ける事が出来る様になってます。
「\***NOUNREF**」をつけると、未使用の変数を実行モジュールに含まなくなるため、静的記憶域が節約出来ます。よく共通のヘッダーファイルをインクルードしたりすると、無駄に変数を引っ張って来ますが、このオプションで未使用の変数は、オブジェクトに引き込まれない為、精神衛生上とても良いです。
以下のソースでオプション有無をDSPPGMで見ると、静的記憶域に違いがあります。

```rpg:USR401A.rpgle
     H****************************************************************
     H*-------------------------------*
     H*----<<日付・著作権    >>-----*
     H*-------------------------------*
     H DATEDIT(*YMD)
     H COPYRIGHT('(C) ushiday - ')
     H*-------------------------------*
     H*----<<コンパイル条件  >>-----*
     H*-------------------------------*
     H DFTACTGRP(*NO) ACTGRP(*NEW)
     H*非参照の変数を取り込む
     H OPTION(*UNREF)
     F*----<<ファイル定義   >>-----*
     D*----<<変数定義 >>-----*
     D*
     D REC           E DS                  EXTNAME(ITEM : *INPUT)
     D                                     QUALIFIED
     D                                     DIM(5000)
     C*-------------------------------*
     C*----<<メインルーチン  >>-----*
     C*-------------------------------*
      /FREE

           //終了
           *INLR = *ON    ;
           RETURN        ;

      /END-FREE 
```

```rpg:USR401A.rpgle
     H****************************************************************
     H*-------------------------------*
     H*----<<日付・著作権    >>-----*
     H*-------------------------------*
     H DATEDIT(*YMD)
     H COPYRIGHT('(C) ushiday - ')
     H*-------------------------------*
     H*----<<コンパイル条件  >>-----*
     H*-------------------------------*
     H DFTACTGRP(*NO) ACTGRP(*NEW)
     H*非参照の変数を取り込む
     H OPTION(*NOUNREF)
     F*----<<ファイル定義   >>-----*
     D*----<<変数定義 >>-----*
     D*
     D REC           E DS                  EXTNAME(ITEM : *INPUT)
     D                                     QUALIFIED
     D                                     DIM(5000)
     C*-------------------------------*
     C*----<<メインルーチン  >>-----*
     C*-------------------------------*
      /FREE

           //終了
           *INLR = *ON    ;
           RETURN        ;

      /END-FREE 
```

●非参照変数を取り込む
![2015-12-03_200701.png](https://qiita-image-store.s3.amazonaws.com/0/100029/ad3c3ee8-bb2f-2670-a94d-8209dde4b9eb.png)

●非参照変数を除外
![2015-12-03_200731.png](https://qiita-image-store.s3.amazonaws.com/0/100029/c22802bc-a3cc-1403-d191-4070c3a5bc32.png)
Swiftの @noescape をもっと使おう

記事の内容はこちらを参照してください。
https://mishimay.github.io/a09c0e4a8063bf16e064/
<!--

<font color=red>
(追記)
Swift 3 では `@noescape` の挙動がデフォルトになったため記述する必要がなくなりました。
</font>


---


よく知らなかったのですが、調べてみたら積極的に使っていこうという気になりました。


# 使用例
関数の引数で渡すクロージャにattributeとして付けます。

```swift
func action(@noescape closure: () -> ()) {
    closure()
}
```

([Appleのドキュメント][apple])

## `@noescape` を付けたクロージャに保証されること

- クロージャはどこへも保持されない
- クロージャは非同期的に後から実行されることはない

つまり、
**クロージャの生存期間が関数よりも短い**
ことを保証することになります。

よって、クロージャを渡した先で

- クロージャをインスタンス変数などとして保持
- クロージャを非同期的に後で実行

などする場合にはクロージャの生存期間が関数よりも延びてしまうので `@noescape` を付けることが**できません**。

([StackOverflowの回答)][stackoverflow]

## いいこと

クロージャ内で **`self.` を書かなくてよくなります。**

> more importantly disables the “self.” requirement in closure arguments.

([リリースノート][noescape ref]より)

以下のような理由からではないかと思われます。

- `self.` の記述はクロージャの生存が終わるまではselfが開放されないことを明示するためのもの(たぶん)
- `@noescape` が付いたクロージャは生存がすぐに終わる
- クロージャの生存が終わってもselfは必ず存在する
- つまり、 `self.` を書いてselfが開放されないことを明示する必要がない

`self.` を書く必要がないということは `[weak self]` や `[unowned self]` について考える必要がない、つまり **selfについての循環参照を考える必要がなくなる** ということです！


### `@noescape` なしの例

```swift
func action(closure: () -> ()) {
    closure()
}

class A {
    var count = 0
    func countAfterAction() {
        action {
            self.count++ // ここ
        }
    }
}
```

### `@noescape` ありの例

```swift
func action(@noescape closure: () -> ()) {
    closure()
}

class A {
    var count = 0
    func countAfterAction() {
        action {
            count++ // ここ
        }
    }
}
```

---

またパフォーマンスが良くなる効果もあるようです。

> This enables some minor performance optimizations

([リリースノート][noescape ref]より)


# 結論

`@noescape` を付けられる場合は `@noescape` を付けていきたい。

- クロージャ内で `self.` を書く必要がなくなる
- つまり、selfの循環参照の問題を気にしなくてよくなる
- パフォーマンスが良くなる



# (おまけ) noescapeの意味 

- 生き延びない (escapeしない) という意味みたいです。

> This indicates that the parameter is only ever called (or passed as an @noescape parameter in a call), which means that it cannot outlive the lifetime of the call.

([リリースノート][noescape ref]より)

# 環境
```
Apple Swift version 2.1 (swiftlang-700.1.101.6 clang-700.1.76)
Target: x86_64-apple-darwin14.5.0
```

[stackoverflow]: http://stackoverflow.com/questions/28427436/noescape-attribute-in-swift-1-2

[apple]: https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Closures.html#//apple_ref/doc/uid/TP40014097-CH11-ID94

[noescape ref]: https://developer.apple.com/library/ios/releasenotes/DeveloperTools/RN-Xcode/Chapters/xc6_release_notes.html





-->
起動時にGoogleの急上昇ワードを教えてくれるfishのテーマ

## :fish: fish

**fish** とは。

> fish（friendly interactive shell）とはUNIXにおけるシェルの一つである

https://ja.wikipedia.org/wiki/Friendly_interactive_shell

### prompt

以下のように`fish_prompt`など特定の名前の関数を上書きするとテーマが変わります。

[![134E92EB-9647-4995-965C-72AED19AD4CE.png](https://qiita-image-store.s3.amazonaws.com/0/32636/06c6a2ae-5a15-e5e1-14be-4e69e62d122b.png "134E92EB-9647-4995-965C-72AED19AD4CE.png")](http://fishshell.com/docs/current/tutorial.html#tut_prompt)


## :fishing_pole_and_fish: oh-my-fish

[oh-my-fish](https://github.com/oh-my-fish/oh-my-fish)は fish shell のフレームワークで

```
curl -L https://github.com/oh-my-fish/oh-my-fish/raw/master/bin/install | fish
```

のように
簡単にインストールすることができます。

また `omf` コマンドが使えるようになり、`install` でプラグインやテーマのインストール、`theme` でテーマの設定などができます。


```
> omf help                                                                                 
      $ omf [command] [arguments]

      Usage:
        omf install [<name>|<url>]
        omf theme [<name>]
        omf remove [<name>]
        omf update
        omf help [<command>]

      Commands:
        list      List local packages.
        describe  Get information about what packages do.
        install   Install one or more packages.
        theme     List / Use themes.
        remove    Remove a theme or package.
        update    Update Oh My Fish.
        cd        Change directory to plugin/theme directory.
        new       Create a new package from a template.
        submit    Submit a package to the registry.
        destroy   Uninstall Oh My Fish.
        doctor    Troubleshoot Oh My Fish.
        help      Shows help about a specific action.

      Options:
        --help     Display this help.
        --version  Display version.

      For more information visit → git.io/oh-my-fish
```

## :computer: テーマ

`omf` で最初から使えるテーマもたくさんあり、その中からでも気に入るのが見つかると思いますが

```
omf new theme <theme_name>
```

上記のように `new` コマンドで雛形を作ることができます。
`~/.config/omf/themes/<theme_name>` に以下のようなファイルが作られます。

```
> ls
LICENSE                fish_greeting.fish     fish_right_prompt.fish
README.md              fish_prompt.fish       fish_title.fish
```

### 起動時

ここで `fish_greeting.fish` に手を加えるとシェル起動時のメッセージを編集することができます。

例えば

```fish:fish_greeting.fish
function fish_greeting -d "what's up, fish?"
  set_color $fish_color_autosuggestion[1]
  uname -npsr
  uptime
  echo "Google hourly hot trends"
  set_color normal
  curl -s -S https://trends.google.co.jp/trends/hottrends/atom/hourly | grep "<li>" | sed -e 's/<[^>]*>//g'
end
```

とすると

![fish greets trends](https://qiita-image-store.s3.amazonaws.com/0/32636/fce89c0d-cee9-0964-5485-ff6d29660413.png "スクリーンショット 2015-12-03 7.11.29.png")

のようにターミナル起動時に急上昇ワードを表示してくれました。

## :construction_worker: 参考

Googleトレンドの取得は以下を参考にしました。

* [Googleトレンドの検索傾向データを取得する方法 | KuroBox](http://xov.jp/e/188/)
資料紹介：First step of UX Monitoring 〜UXモニタリングこと始め〜 

プロダクトオーナーはプロダクトの利用ユーザーあるいは潜在ユーザーについて敬意を払い、理解し、そしてプロダクトを定義しなければなりません。
しかし、ユーザーを理解するのにはデータが必要です。
生データ、解釈、動向分析、それらはどうすればよいのでしょう？

リクルートジョブス様においての実例を資料公開されているのでこちらをご紹介したいと思います。

ユーザーの動向を確認した上でセグメントごとのユーザーの動きの監視はセッション単位ではやりづらいです。
ユーザーごとに色分けしてしまってそれをデータ分析する必要が有ります。
というユーザー分析をほとんど教科書通りの見事さでやってのけた発表資料です。

http://www.slideshare.net/TaroYoshioka/first-step-of-ux-monitoring-ux

かんたんに言っていますが、同じことをやろうとして同じ成果を上げる前にする苦労の量を考えると、積み重ねたものの差を感じます。
これだけの「やりたいこと」にたいして「成果」を出していることを考えると、プロダクト利用者への理解、データ解析手法への理解、アプローチの経験とノウハウ、いずれもプロの仕事感がありますね。
Test::UNIXSock で UNIX domain socket のサーバもテストする

[Perl5 Advent Calendar 2015](http://qiita.com/advent-calendar/2015/perl5) 4日目の記事です。

[Test::TCP](https://metacpan.org/pod/Test::TCP) というテストモジュールはご存じですよね？ TCP サーバを実際に (空いているポートを自動で見つけて) 起動して、それに対するテストを簡単に書ける素晴らしいものです。

諸般の事情により、TCP ではなく UNIX domain socket を使用するサーバについても同じことをしたかったため、[Test::UNIXSock](https://metacpan.org/pod/Test::UNIXSock) を作りました。

使い方はほぼ同じです。Test::TCP では port が渡ってくるところが一時的に生成された UNIX domain socket の path になっているので、それを使って server, client のコードを書いて普通にテストするだけです。

以下は memcached への接続をテストする例です。

```pl
use 5.12.0;
use Test::UNIXSock;
use Test::More;
use Cache::Memcached;

test_unix_sock(
    server => sub {
        my $path = shift;
        exec "memcached", '-s' => $path;
        die "cannot execute memcached: $!";
    },
    client => sub {
        my $path = shift;
        my $memd = Cache::Memcached->new({ servers => [ $path ] });
        ok $memd->set( foo => "FOO" );
        is $memd->get("foo"), "FOO";
    },
);
done_testing;
```

ちなみに UNIX domain socket を使いたかった理由ですが、テストの並列数を多くしていくと Test::TCP が返す port が競合して fail することがあったためです。

誰も使っていないことを Test::TCP が確認して port 番号をテストコードに渡してから、実際に利用するまでの間に時間差があるので、致し方ないですね。

Test::TCP ほど使う場面はないかもしれませんが、機会があればぜひご利用ください。
goのmgoでfindするときの処理

# はじめに
go言語でmongoDBにアクセスするためのライブラリに[mgo](http://labix.org/mgo)があります。`mgo`でデータベースからfindしてくるときの処理について、書きたいと思います。

# サンプル
サンプルとして以下のようなコードで2件データを挿入しておきます。

```go
package main

import (
	"log"

	mgo "gopkg.in/mgo.v2"
	"gopkg.in/mgo.v2/bson"
)

type Man struct {
	Id   bson.ObjectId `bson:"_id"`
	Name string        `bson:"name"`
}

func main() {
	session, err := mgo.Dial("mongodb://localhost/")
	if err != nil {
		log.Fatal(err)
	}
	defer session.Close()
	c := session.DB("some-db-name").C("man")

	if err := c.Insert(Man{
		Id:   bson.NewObjectId(),
		Name: "Taro",
	}, Man{
		Id:   bson.NewObjectId(),
		Name: "Jiro",
	}); err != nil {
		log.Fatal(err)
	}

}
```

# 全件取得

`Find`メソッドに`nil`あるいは`bson.M{}`を渡すと全件取得できます。

```go
	var men []Man
	if err := c.Find(nil).All(&men); err != nil {
		log.Fatal(err)
	}

	spew.Dump(men)
	/*
		([]main.Man) (len=2 cap=2) {
		 (main.Man) {
		  Id: (bson.ObjectId) (len=12) ObjectIdHex("565edd868bc93d268a13bc01"),
		  Name: (string) (len=4) "Taro"
		 },
		 (main.Man) {
		  Id: (bson.ObjectId) (len=12) ObjectIdHex("565edd868bc93d268a13bc02"),
		  Name: (string) (len=4) "Jiro"
		 }
		}
	*/
```

# 絞り込み
上述の`Find`メソッドに条件を指定できます。
以下のサイトに記載されているmongoのオペレータは同様に使えます。
https://docs.mongodb.org/manual/reference/operator/query/

```go
	//例 name が Taro か Hanako
	var men []Man
	if err := c.Find(bson.M{
		"name": bson.M{
			"$in": []string{"Taro", "Hanako"},
		},
	}).All(&men); err != nil {
		log.Fatal(err)
	}

```

# ObjectIdで1件取得
`"565edd868bc93d268a13bc02"` というようなId形式の文字列でfindするときは、`ObjectId`型に変換しなければいけません。
`bson.ObjectIdHex(string)`で変換するのですが、`ObjectId`の形式の文字列ではない場合、panicします（panic: Invalid input to ObjectIdHex:）。
そのため、`bson.IsObjectIdHex(string)`でチェックしてから変換するのが安全です。

```go
	idStr := "565edd868bc93d268a13bc02"
	if !bson.IsObjectIdHex(idStr) {
		log.Fatal("not objectId")
	}
	id := bson.ObjectIdHex(idStr)

	var man Man
	if err := c.FindId(id).One(&man); err != nil {
		log.Fatal(err)
	}
	spew.Dump(man)
	/*
		(main.Man) {
		 Id: (bson.ObjectId) (len=12) ObjectIdHex("565edd868bc93d268a13bc02"),
		 Name: (string) (len=4) "Jiro"
		}
	*/
```

注意として、`FindId`でマッチするデータが存在しない場合、エラーとして返されます。
そのため、存在しない場合を別途処理するときは、以下のように記述する必要があります。

```go

	if err := c.FindId(id).One(&man); err != nil {
		if err == mgo.ErrNotFound {
			fmt.Println("Not found")
		} else {
			log.Fatal(err)
		}
	}

```
開発言語って何を使う？

仕事で使う開発言語って何を使います？

深入りすると宗教戦争になってしまうので、今回は「手っ取り早くお金に換金できる言語」という
視点で書いてみます。
ただし、Webアプリケーションを開発する時の視点です。
感想は主観なので、あしからず。。。。

# PHPだけど何か？

　時々Rubyの人達からバッシングを受けるPHP。
　「PHPが悪いんじゃなくて、PHPを使ってクソコード書いている人間が悪いのです。」
　と、まさにコレ。
　PHPは昔はいろいろと問題もありましたが、言語自体にそんなに致命的な欠陥は少なく、
　足りない部分もフレームワークでカバーしたりと、意外に地味に活動が活発です。

　確かに、クソみたいなコードは時々出会いますが、それは書く人のせいであって、
　きちんとした知識でPHPを書けば、そんなクソなプログラムにはなりませんし。
　Railsより、ネットで検索した情報でトラブルが治ったり、バージョン互換の問題や
　フレームワークの依存性による不具合なども少ないです。
　
　PHPのクソコードは嫌いになっても、PHPは嫌いにならないで下さい！

　てな感じです。飛び抜けて良いとはいいませんが、普通に学習コストと開発コスト、運用
　コストでバランス良く良い言語だと思います。

# Ruby on Railsですか

　スタートアップ起業ではお決まりのRuby on Railsですね。
　あまり知識が無い営業なんかは「Rails出来る？Rails」って言い方をしますが、
　きちんと「Ruby」を頭に付けて欲しいですｗ
　
　Ruby on Railsは、いろんな学習の情報が出回っていますが、なかなか役に立つ情報を取捨選択
　するのに苦労したり、処理の書き方はいろいろな書き方が出来るので、他の人のTIPSやHowTO、
　ソースレビューを受けると、ゼロからやり直しになったりする、書き方が自由すぎて正解に
　辿り着くのが困難な言語って感じです。
　
　そのため、会社ごとにルールが決まっていたり。使うライブラリの指定が限定されていたり、
　結構他人のRuby on Railsのソースは、別世界な感じですね。経験上。

　ネットに載っている情報は４分の３が古くて使いものにならないぞ！！

　Ruby on Railsの達人や上級者がいるコミュニティに参加して、教えを請うのが一番近道かも。
　ネットに載っている情報のクオリティコントロールをお願いします（切実）

# 意外なC#.NET

　もうVisual Studioはオワコンなんか言われていた時もありましたが、
　.NETフレームワークが、LinuxとMacでも動くということで、もう一度復活はあるのか？
　って感じです。
　ただ、言語はVisualBasciからC#に限定されるみたいで、結局、開発はWindows環境を
　用意しないとダメなので、ちょっとね。。。。
　別にMSをディスる分けではなく、C#という言語は、それなりにしっかりとした言語で
　もうちょっと流行ってもいいのになぁ、なんて思っていたり。
　開発環境と動作環境、これがフリーでオープンな世界で生息していないと結局、ガラパゴス
　じゃないけど、世の中の主流に取り残されてしまったり、一部の人達しか使われなくなって
　しまうんですけどね。
　業務系に注力したい人は、C#.NETを今から再びやれば、ワンチャンあるかもｗ
　Javaという選択肢もあるけど、業務系はC#.NETの方が、帳票関係で幸せになれるかもね。

# Pythonさん

　最近、機械学習や統計関係で注目を浴びているPythonさん。
　言語的には良い言語だと思いますよ。ただし、日本語処理関係やv2とv3の問題なんかは除くｗ
　個人的には洗練されていて、好きですよ。
　独学の範囲を超えてないのと、お仕事で使えるレベルやお仕事自体が無いので、闇に葬って
　いますが。。。
　
　フレームワークや、ライブラリもシンプルなので、Ruby on Railsよりは学習コストが低くて
　実用レベルまでは早いかも。ただ、ネットで検索しても情報が少ないので要注意。

# まだまだJavaは生きている

　Javaってオワコンみたいな扱いをされているけど、まだまだ現役と言っても良いと思いますよ。
　Javaが出来ると、一時期話題となった２万人月と言われた某Ｍ銀行の基幹系リプレースの案件に
　ドナドナされてしまうことも叶います。
　まあ、Javaの生みの親の会社青いＳ社も赤いＯ社に買収され、ちょっと微妙な子になっていますが、
　最近、ユーザグループも盛んにしようと頑張っているし、今こそJavaをやるっていうのもアリなのでは？

# perlってどうしているのかな？

　一時期、一世を風靡したperlさん。
　和製ソーシャルのｍ社もperlでバリバリ組んでいたのに、今はあまり見かけないですね。
　今動いているperlのプログラムをPHPに移植してくれなんて案件は出会ったことがあります。
　もうperlは終わりなのか、、、、
　今からperlを勉強して始めるのは辞めといた方が良いかも、
　どうしてもperlが好きなら、止めはしないけど。お仕事は修羅の道かもね。

# 関数型言語界隈

　関数型言語界隈は、怖い人が多いのであまり関わりたくないというか、そこまで関数型言語を
　使わないといけない場面に出会ったことがないので、今のところ本を読んだだけの独学の世界で
　放置しています。
　まあ、他人が使っていない言語を俺はバリバリ使えるぜ、と自慢したい人にはおすすめ。
　最近、仕事の募集にもぼちぼち見かけるし。


あとはJavaScriptとNode界隈があるのですが、この界隈はフレームワークやライブラリが無限に
増えているので、今回はパスさせてください。
Node.jsのフレームワークがいろいろと増えてきたので、１度は仕事で使ってみたいんですけどね、
もう少し自分が使いこなせないと、お客さんにすすめることが出来ないので、まだまだ修行中の身です。

Web系の開発と言ってもいろんな言語があるので、全てを追いかけるのは無理だけど、１つでなく２つは身につけて追いかけるのが吉かも。

個人的なオススメは、PHPとRuby on Railsです。
隠れてJavaとC#.NETが出来ていると、全方位カバー出来て、あと５年は戦えますｗ
CircleCIに任意のデータを登録しておく方法

## リポジトリに含めたくないYAMLなどのデータをCircleCIに登録したいこと、ありませんか？

### 提供されている手段を素直に使おうとした場合の問題点

- SSH Permissions は秘密鍵の形式でなければ登録できない。
- Environment variables の value は連続の空白文字が1つの半角スペースに変換されてしまう。YAMLやCSVなどの改行に意味のあるデータは壊れてしまうし、JSONなどの改行自体に意味のないデータもstring内のスペースの扱いが変わってしまいデータが改変されてしまう可能性がある。

### どうするか？

Base64エンコードした文字列をCircleCIの Environment variables に登録する。参照する時はBase64でデコードする。

1\. ローカルで登録したいファイルをBase64エンコードする

```
cat example.yml | base64 
```

2\. 出力された文字列を CircleCIの Environment variables に登録する。

<img width="687" alt="スクリーンショット 2015-12-04 11.21.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/6752/fdad5984-2084-c53c-ba1b-f10044ad77c6.png">

3\. CircleCIのdependenciesなど適当なタスクで登録した環境変数をBase64デコードする。

```bash
echo $EXAMPLE_YAML | base64 --decode > example.yml
```

## 環境変数のvalueに登録可能なデータサイズの上限は？

実際に CircleCI 上で Environment variables の value に登録できるデータサイズの上限を調べてみた。

### 調査方法

何度かの試行で次のことが分かった。大きなサイズのデータを持つ環境変数を一定数以上作ると、 Exporting env vars from project settings のタスクで `Argument list too long Action failed: Exporting env vars from project settings` というエラーが出力され、以降のタスクがキャンセルされるということだ。そこで、環境変数に登録するvalueのサイズを変えつつ、そのサイズの変数が何個設定可能かを調べた。

### 結果

| KB/value | 登録可能な環境変数の最大数 |
|--:|--:|
| 10 | 13 |
| 20 | 6 |
| 30 | 4 |
| 40 | 3 |
| 50 | 2 |
| 60 | 2 |
| 70 | 1 |
| 80 | 1 |
| 90 | 1 |
| 100 | 1 |
| 110 | 1 |
| 120 | 1 |
| 130 | 1 |
| 140 | 0 |

### 考察

valueの合計が大体130KBくらいまでなら登録が可能なことが分かった。Base64へのエンコードでデータ量が4/3になることから逆算すると97.5KBのデータが登録できることになる。よほど巨大なデータでない限りこの枠に収まるだろう。

エラー内容と value のサイズに対して登録可能な環境変数の最大数が変動することから、Environment variables で登録した全てのkey-valueを展開しつつビルドが実行されるコンテナ内で一度にexportしていると想像している。


## リポジトリやCI

当エントリに記載したコードをCircleCIでテストしている。

- GitHub [minodisk/circleci-huge-env](https://github.com/minodisk/circleci-huge-env): circle.ymlのdependenciesで環境変数をBase64デコードし、testで元のファイルとdiffをとって比較している。
- CircleCI [minodisk/circleci-huge-env](https://circleci.com/gh/minodisk/circleci-huge-env): Retriedは上記の表を書くための試行の跡...

## 元ネタ

[Pushing to Google Container Registry from CircleCI](http://scottsmerchek.com/2015/07/24/pushing-to-google-container-registry-from-circleci/) を読んでこの手法について知った。該当のエントリにおけるコンテキストはこの手法についてではないのだが、方法がないか模索していた事柄だったので調査と共にエントリにした。
AtomはDart開発のIDEになる

# Atomエディタ

AtomはGithub製のテキストエディタです。

- [Atom](https://atom.io/)

Atomは、[Electron](http://electron.atom.io/)というWebフロントエンド技術を用いてデスクトップアプリケーションを開発できるツールによって開発されているオープンソース・ソフトウェアで、注目を浴びています。

今回は、このAtomでDart開発をするときに便利なプラグインの紹介をします。

Atomに関する詳しい説明はここでは割愛します。

- 参考：[Atomに関する投稿 - Qiita](http://qiita.com/tags/atom)

# Dart開発用のプラグインをインストールする

すでにお使いの環境にDartがインストールされている前提で説明をします。

AtomにDart開発用のプラグインをインストールします。

※「japanese-menu」プラグインで日本語化を行った前提の説明です

まず、Atomの環境設定から「インストール」を選び、パッケージのインストール画面を開きます。

※スクリーンショットの撮影はMac版を使用しています

![atom_dart_01.jpg](https://qiita-image-store.s3.amazonaws.com/0/636/d62a92aa-3465-caf9-e1d0-174c4f18742b.jpeg)

「Search package」と書いてある検索枠に「dartlang」と記述し、検索で見つかった「dartlang」パッケージの「install」をクリックして、パッケージをインストールします。

![atom_dart_02.jpg](https://qiita-image-store.s3.amazonaws.com/0/636/09ceca94-7cb1-4c86-ceab-880e57c61828.jpeg)

メニューの「パッケージ」に「Dart」が追加されていたら、インストール完了です。

![atom_dart_03.jpg](https://qiita-image-store.s3.amazonaws.com/0/636/9d8dea48-80a4-c7bb-b9d3-be5e4046698f.jpeg)

## Dart SDKの場所が正しく設定されているか確認する

パッケージ「dartlang」の設定の「Dart SDK Location」に、Dart SDKの場所が正しく設定されているか確認します。

場所が正しく設定されていなければ、正しい場所を設定してあげる必要があります。

<img width="418" alt="atom_dart_09.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/636/91f275dc-833f-a3a5-b4a8-6a11ecfb5549.jpeg">


# dartlangプラグインで出来ること

## エラーや警告、ヒントがリアルタイムで確認できる

Dartでコーディング中にバックグラウンドでDartのdartanalyzerが動き、エラー、警告、ヒントを確認することができます。

<img width="294" alt="atom_dart_04.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/636/922b047e-706c-e81a-f892-42cc26d76efa.jpeg">

<img width="305" alt="atom_dart_05.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/636/418bded6-75c4-9ae5-4c08-48bde66b29f5.jpeg">

<img width="476" alt="atom_dart_06.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/636/e7fd604e-ac3b-4df7-2a62-e4715a934060.jpeg">

エラービューで、常時一覧することもできます。

<img width="453" alt="atom_dart_07.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/636/bc8f5c60-ab93-c719-48e5-823540b88b4d.jpeg">

## 依存パッケージに関する操作

ツリービューでのコンテキストメニューから、依存パッケージに関する操作を行うことができます。

<img width="249" alt="atom_dart_08.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/636/733e7995-2199-9877-fb10-6c9904fde420.jpeg">

# 自動フォーマット

ソースコード保存時に、自動でフォーマッタを適用させることができます。フォーマッタは、Dart SDKに標準で含まれているものが使用されます。

例えば、以下の様な読みにくいコードが書かれていても、

```dart
class
  Hoge {

    bar() {
      for(int i=0;i<10;i++){
        int aaa=1000;
      }
    }
    foon(){
      var list = [10000, 20000, 30000, 40000, 50000, 60000, 70000, 80000, 90000, 100000, 110000];
    }
  }
```

ファイルを保存すると、

```dart
class Hoge {
  bar() {
    for (int i = 0; i < 10; i++) {
      int aaa = 1000;
    }
  }

  foon() {
    var list = [
      10000,
      20000,
      30000,
      40000,
      50000,
      60000,
      70000,
      80000,
      90000,
      100000,
      110000
    ];
  }
}
```

このように整形されます。

# おわりに

ここまでDart開発のための機能が揃っていれば、Dart開発はとても楽になるのではないかと思います。

Atomは、DartのIDEになりえます。
Bootstrap 3 から 4 へ移行する時に気をつけること (α版ベース)

# 目的
- Bootstrap 3 を使っている人が Bootstrap 4 に移行する時にどのあたりを考慮すればよいのか、マイグレーションする前提で主要な差異をまとめてみました。
- 基本的に Bootstrap 4 α版ベースの話なので、今後変わっていく可能性は大いにあります。備えあれば憂いなしという安心を得る目的としてざっと見ていただけると良いかと思います。

# v3 のメンテナンスについて
v4 が出た時に v3 のメンテナンスどうするのか、という点について明確な対応指針が公開されています。しばらくは v3 も使える、ということかと思います。


> 以前 v3 をリリースした時は、直後に v2 のサポートを切ってしまったが、これは失敗だった。これを防ぐために v4 リリース後も v3 の重大なバグ修正とドキュメントの改善は続けられる。

# マイグレーションガイド
では、さっそくどのあたりが変わるのかをまとめてみます。廃止になるものと、利用方法が大きく変わりそうな点という 2 つの観点でまとめいます。

## 廃止されるもの

- Panels、Thumbnails、Wells
  - 新しい Cards で作り変え必要。
- Justified nav
  - 代替手段なし
- Glyphicons icon font.
  - いままで同梱されてましたが廃止されるらしい
  - 自前で配信するか、font awesome に書き換える等何かしら対応必要
- page-header クラスがなくなります
    - このクラスに依存して各ページ作成している場合は注意
- ブラウザサポート
  - IE8 、iOS 6 のサポート停止
  - Android 5 未満の Android ブラウザサポートは非公式サポート扱い
    - 日本だと Android 4 系のユーザーがまだまだいるので、ちょっと不安ですね。

## 利用方法が大幅に変わるもの

影響範囲が大きいものをいくつか列挙します。細かい内容については、参考セクションに記載した、Migration guide も参照してください。

### レスポンシブユティリティ

スマホだったら隠す/表示する、PCだったら隠す/表示するといったことを class で簡単に制御できるのですが、class 命名規則や使い方が変わります。

- .hidden-xs .hidden-sm .hidden-md .hidden-lg などが無くなります。
  - 代わりに.hidden-xs-up .hidden-xs-down .hidden-sm-up .hidden-sm-down .hidden-md-up .hidden-md-down .hidden-lg-up .hidden-lg-down などに書き換える必要があります
- .visible-* の利用も非推奨、とされています。hidden-xxxx-up or hidden-xxxx-down で代替してほしい模様

影響範囲としては大きそうです。

#### 書き換えイメージ

従来の記載

```slim
.hoge.hidden-xs.hidden-sm
```

これからの記載

```slim
.hoge.hidden-sm-down
```

### hidden / show といった class

.hidden や .show といったクラスは無くなります。ページロードした時に予め要素を消しておくようにしたい時などの処理で bootstrap の class に依存するような書き方をしている場合は、Css / JQuery で初期化するなど見直しが必要です。

# 参考 (公式なドキュメント)

- v4 になって何が新しいのか
  - http://blog.getbootstrap.com/2015/08/19/bootstrap-4-alpha/
- マイグレーションガイド
  - http://v4-alpha.getbootstrap.com/migration/
SandS

## SandS

Dvorak Advent Calendar 4日目．

### SandSとは

`Space and Shift` の略です．

この機能は，通常はSpaceキーを押下するとSpaceキー入力として機能しますが，
Spaceキーを長押ししているとShiftとして機能します．
文字選択時などでワザワザキーボードの左右端にあるShiftを押下する必要がなくなります．オススメです．

デメリットとしては，Spaceキー長押しで沢山スペースを入力できなくなることです．
Google Apps ScriptでService Accountを利用して認証する ~GASを使ってAppEngineのバージョン一覧を取得~


同じ日にべつのAdvent Calandarの投稿が被ってしまって泣きそうになっている大橋です。
初日には最近のGASの傾向を書きその中で、GASでGoogleのService Account認証が可能になったことを触れました。

今回はこのService Account認証を利用して、AppEngineのデプロイ済みバージョン一覧を取得してみたいと思います。

なおService Accountを利用することで今までのOAuth2の様にわざわざ画面や、トークン保存のためのコールバックを必要とせず、
直ぐに利用が可能になるところが非常に良い点です。

## 準備

### 1. Service Accountの作成

まず今回はService Accountの作成が必要です。
作成方法は ~~めんどく~~ 他の皆さんが既にいっぱい書いているので適当にQiitaで検索してService Accountを作成してください。
作成する際はJSONコードをダウンロードして下さい。

なおついでにGoogle App Engine Admin APIもDeveloper Console上で利用可能状態にしておいてください。

### 2. GASプロジェクトの作成

適当なGASプロジェクトを作成してください。
SpreadsheetからでもStandaloneでも構いません。

https://script.google.com

### 3. ライブラリの読み込み

細かくService Accountの認証方法を書いてもいいのですが~~正直めんどく~~すばらしいライブラリが既にあるので、ライブラリを使いたいと思います。
以下のライブラリを読み込んでください。

* コード
    * [Apps-Script-GSApp-Library](https://github.com/Spencer-Easton/Apps-Script-GSApp-Library)
* ライブラリキー
    * MJ5317VIFJyKpi9HCkXOfS0MLm9v2IJHf

読み込み方法は「[GASのライブラリを使って楽したい① とりあえず使ってみる_ (:3」∠)_](http://qiita.com/soundTricker/items/7bbd86425ae8d0641d50) 」を参考にしてください。

###  4. 認証キー情報の保存

1.で取得したJSONコードをGASのスクリプトプロパティにKEY名`jsonKey`などで保存しておいてください。

## コード

それではコードです。

```js
//APPIDを設定
var APP_ID = "APPID";

//モジュールIDを設定
var MODULE_ID = "default";

function myFunction() {
  
  // 認証情報のJSONを取得
  var jsonKey = JSON.parse(PropertiesService.getScriptProperties().getProperty("jsonKey"));

  // GSAppの準備 Scopeを https://www.googleapis.com/auth/cloud-platform に設定
  var serverToken = new GSApp.init(jsonKey.private_key, ["https://www.googleapis.com/auth/cloud-platform"], jsonKey.client_email);
  
  //トークンを取得するユーザを設定して、トークンを取得
  var tokens = serverToken.addUser(jsonKey.client_email).requestToken().getTokens();
  
  //リクエストの設定 
  var fetchOptions = {method:"GET",muteHttpExceptions:true, contentType:"application/json", headers:{Authorization:"Bearer "+tokens[jsonKey.client_email].token}};
  
  //リクエストURLを作成  
  var url = "https://appengine.googleapis.com/v1beta4/apps/" + APP_ID + "/modules/" + MODULE_ID + "/versions";
  
  //fetch
  var res = UrlFetchApp.fetch(url, fetchOptions);
  
  // ログ
  JSON.parse(res.getContentText()).versions.forEach(function(versionData){
    Logger.log(Utilities.formatString("ID: %s\tRuntime: %s\tdeployer: %s\tcreationTime: %s", versionData.id || "", versionData.runtime || "", versionData.deployer || "", versionData.creationTime || ""));
  });
  
}
```

これだけで認証してAppEngineのバージョン一覧が取れちゃいます。
もちろんうまく作ればデプロイや、バージョン切り替えなども実装可能です。

素晴らしですね！

## まとめ

サービスアカウントを利用することでより様々なGoogle APIを利用可能になります。
更に自動化したりSlackなどからChatOpsがやりやすくなりますね！
準備作業①　KimonoでUberニュースウォッチ用のweb APIを試作。

一人(+α)アドベントカレンダー4日目。
Kotlin+RoboVMで挑むクロスプラットフォーム開発試行錯誤。

本日は、モックアップ実装の準備作業として、普通のwebサイトからwebAPIを作成する。

#1) 無料ツールKimonoでwebAPI

無料で使えるシンプルなツールKimonoを用い、Uberニュースウォッチのweb APIを作成する。

Kimonoの基本は、以下の記事を参考にして欲しい。
[kimonoの使い方 基礎編](http://qiita.com/her0m31/items/b844ff74a9d488c9dc81)
*(#使い方はシンプルだが、DOM解析に基づきAPIを生成する技術はすごい)*

#2) Uberをウォッチしたい個人的理由
シェアの経済の代名詞となっているUber。他のシェア系ベンチャーもUberとの比較で語られる事が多い。
そのため、UberでGoogleニュース検索をすることで、シェア経済関連と関わるニュースを容易に見つけることができる。

例えば、ロサンゼルスで先月開催されたという、[コネクテッドカーエキスポの記事](http://response.jp/article/2015/11/18/264478.html)。

自動車業界の人間ではない自分が、Uberという語を通じ、コネクテッドカーエキスポというイベントの存在を知り、さらにコネクテッドカーが、[IT業界と自動車業界とをつなぐ商談のバズワード(?)として機能していること](http://www.connected-car.jp/ja/About/Outline/)も想像できた。

グーグルとアップルがそれぞれのプラットフォームを持ち込もうとしているコネクテッドカーの領域は、今後、クロスプラットフォーム開発の主戦場のひとつだろう(グーグルcar ✕ iPhone、または、その逆 etc)。

そして、そもそも、クルマをインターネットにつなぐ目的に、情報のシェアや、シェアの経済が含まれる。例えば、共働きの子育てにちょっとの便利と安心をもらたす以下のシェアサービス:

>HopSkipDriveは小さな子供を持つ親向けのカーシェアリングサービス。Uberなどが急速に普及するアメリカにおいて、忙しい両親が子供の送り迎えにも利用できるように開発された。ドライバーは5年以上の子育て経験が必須で、子供を乗せたクルマが今どこを走っているのか、どれぐらいの速度で走っているのかなどをスマートフォン上でリアルタイムに確認できる。 *#前出:[コネクテッドカーエキスポの記事](http://response.jp/article/2015/11/18/264478.html)より引用。*

音声アシスト等を用いたコネクテッド・カーならではのUX、高度なAI技術が駆使された自動運転など技術は、こうした便利と安心といった目的のためにある。Uberは、シェアの経済を形成するエコシステムのハブとなりうる存在であるがゆえに、そのニュースをウォッチしたく思っている。

#3) web APIの作成

##対象URL 

今回の試作品は、webAPIスタートアップKimonoについてもかなり早い段階で[紹介記事](http://thebridge.jp/2014/08/conversation-with-kimono-labs-ryan-rowe-pratap-ranade
)を書いてくれている、 The BridgeからUber。「起業家と投資家を繋ぐ」、意識高い系(?)テクノロジー系ニュースの代表格だ。
だいぶ大上段に構えた後になんかせせこましい感じだが、
せっかくなので、Uberに関する新着情報をJSON等で収集するAPIとした。JSON版ではこんなふうにデータが集まる:

```
"collection1": [
      {
        "title": {
          "href": "http://thebridge.jp/2015/12/chinas-ride-hailing-giant-didi-to-roll-out-ubereats-style-program-with-ele-me",
          "text": "中国の配車アプリ大手Didi（嘀嘀）がEle.me（餓了麼）と提携、UberEATS風のフードデリバリをローンチか"
        },
        "text": {
          "alt": "",
          "src": "",
          "text": ""
        },
        "index": 1,
        "url": "http://thebridge.jp/?x=0&y=0&s=uber&post_type=post"
      },
      {
        "title": {
          "href": "http://thebridge.jp/2015/11/gojek-driver-strike-fizzled-driver-discontent-settled",
          "text": "インドネシアの〝オートバイ版Uber〟Go-Jekのドライバーがジャカルタでデモ——Go-jek経営陣も反論"
        },
        "text": {
          "alt": "",
          "src": "",
          "text": ""
        },
        "index": 2,
        "url": "http://thebridge.jp/?x=0&y=0&s=uber&post_type=post"
      },
      {
        "title": {
          "href": "http://thebridge.jp/2015/11/lyft-is-reportedly-raising-500m-at-4b-valuation",
          "text": "Uber のライバル Lyft が時価総額40億米ドルで5億米ドルの資金調達を行う模様"
        },
        "text": {
          "alt": "",
          "src": "",
          "text": ""
        },
```
あれ、textカラムは機能していないかな。。。もう少し調査が必要か

せっかくなので、日本語と英語それぞれの情報を取得する。
お試し版では、以下のURIの有効期間は30日以内だが:

作成したuber関連ニュースAPI(英語版):
https://www.kimonolabs.com/api/40jren6w

作成したuber関連ニュースAPI(日本語版):
https://www.kimonolabs.com/api/efe3h48u

日本語の記事と英語の記事の内容・新着順はそれぞれ異なっている。
両者は補いあう関係にあるのかな。
MySQLのGROUP_CONCATがアツい


http://qiita.com/advent-calendar/2015/gaiax
初めまして、GaiaxAdventCalender 4日目担当の技術開発部の金田と申します。
既に熱い記事ばかりなので後続の人たちのハードルを下げる為に小ネタで行きたいと思います。

GROUP_CONCATという関数がMySQLにあるんですがそれがアツいのでみんなに教えたいという記事です。

## 1対多の関係のとき
普通にテーブル設計してると1対多の関係(has many)になるリレーションシップをテーブル間で張ることが多いですよね。
![hasmany.png](https://qiita-image-store.s3.amazonaws.com/0/32549/5b61ebe3-1bd7-cac0-21da-3a1755d37827.png)

まぁこんな感じで。
ざっくりと記事に対して複数のタグが設定できるような作りを想定してみます。
Entryから出た線がTagは複数に枝分かれしているのがhas manyの関係です。


![hasmany2.png](https://qiita-image-store.s3.amazonaws.com/0/32549/2ec51213-18c7-6896-eb7b-9842e39732af.png)

で、こんなデータが入ってます。

### 取得するとき
記事と、それに付随したタグの一覧を取得したいときは当然JOINして
![hasmany3.png](https://qiita-image-store.s3.amazonaws.com/0/32549/6eae19c3-361e-c3c6-7c87-424106a553a7.png)

こうします。

結果としてはコレで間違ってないんですが、記事は2件しか無いのにレコードは5件出ちゃってます。
なので大抵はGROUP BYします。![hasmany4.png](https://qiita-image-store.s3.amazonaws.com/0/32549/91083b3b-f386-a33e-7b48-096e84484f59.png)

でもこれだとタグが先頭の物しか出てこなくなってしまって、結局もう1回記事のIDでTagテーブルをSELECTする必要がありますよね。
O/Rマッパーを使っているとその辺のリレーションシップとhas_manyの関係は全てオブジェクトで表現されると思うのでEntryオブジェクトのメンバとして関連するTagオブジェクトのArrayが入ってるような感覚で良いんですが、内部的には全体のリレーションを表現するために複数回クエリが呼ばれてます（少なくともPerlのDBIx::Classとかではそう)。

## そこでGROUP_CONCAT
複数回クエリ呼べばいいじゃんって言われたらそこで話終わっちゃうんでやめてください。
今書いてきたケースだと1クエリの中でJOINしてGROUP BYするとhas_manyの関係のデータ埋もれちゃうから一気に取るのは無理よねって話でしたがMySQLにはGROUP_CONCATとかいう関数があります。早速使ってみます。

![hasmany5.png](https://qiita-image-store.s3.amazonaws.com/0/32549/1ab7c7d5-a1b4-3897-7240-e4c3b9d7a4af.png)

うおおおお、グループ化されて埋もれちゃったカラムを1つの文字列としてカンマで連結して返せているーーー。（説明台詞）

https://dev.mysql.com/doc/refman/5.6/ja/group-by-functions.html#function_group-concat
ちなみにセパレーターをカンマ以外に変更したり、GROUP_CONCAT内でソートも出来ます。
集約関数（COUNTとかMAXとかと同じ）なので1クエリで完結しているのがポイントです。

### 使い所
**O/Rマッパー使ってるならあんまり無いです。**
自力でアプリからクエリを送信して結果をレコード毎に振り分けて構造化する際にGROUP_CONCATで取ると1クエリで取得できて、splitするだけなので非常に便利。
その場で作った文字列なのでインデックスは効きませんが、カンマ区切りなのでFIND_SET関数で絞り込むこともできます。

今回の例みたいな単純なデータ構造ならそもそもEntryテーブルにカンマ区切りでタグを入れるカラムを作れば良いんですが、タグ自体に個別情報をもたせたりしたい場合はそうも行かないので有効です。

現場からは以上です。
今年の年末は狩りのほうが忙しいです。

### 明日は！
弊社インターン生の笠井さんです！若いです！
よろしくお願いします！
Universal link に潜む罠っぽい iOS9 の仕様

iOS9 から Universal link という仕組みが導入されました。

Universal link の仕組みやアプリへの導入は [@mono0926](http://qiita.com/mono0926) さんによる[解説](http://qiita.com/mono0926/items/2bf651246714f20df626)がとても詳しいです。

<dl>
<dt>注意</dt>
<dd>以下は iOS9.0 から iOS9.1 (+ iOS9.2 beta) の挙動に基づいて記述しています。</dd>
</dl>

# applink 方式 (従来方式)

これまでアプリにディープリンクする方法としては

<dl>
<dd>http/https リンク → Safari で applink リダイレクト → アプリ</dd>
</dl>

という経由で行っていたと思います。

しかしながら、Universal link 導入に伴い、独自スキームを使う applink は利用する折に確認ダイアログが出るようになりました。

<img width="300" alt="" src="https://qiita-image-store.s3.amazonaws.com/0/17936/d99ddf06-37e3-6b02-2234-c5327b617b72.png" />

このダイアログがリダイレクトの際に表示されることになります。

実は iOS9.0 では、このダイアログを半ば無視してアプリを切り替えることが可能でした（このハックについては後日）。しかしながら iOS9.1 以降でそのハックも利用できなくなっています。

# Universal link 方式

Universal link を利用すると、この Safari 経由のアプリ遷移を飛ばして、

<dl>
<dd>http/https リンク → アプリ</dd>
</dl>

http/https リンクからアプリに直接切り替えることができるようになります。

この際、アプリがインストールされていれば、確認ダイアログも表示されません（http/https リンクなので、アプリがインストールされていなければ Safari に切り替わります）。

汎用的な http/https リンクをアプリ用に利用することができ、遷移もスムーズでいいことづくめな感じがするんですが、ある条件で **アプリがインストールされていてもアプリに切り替わらないという罠のような仕様** があります。

# Universal link でアプリを開くと……

Universal link を利用してアプリに切り替えた場合、ステータスバーの表示が変わります。

左上には、リンク元のアプリ。右上には、Universal link のドメイン。例えば twitter が対応している Universal link をメモアプリから開くと……

<img width="300" alt="" src="https://qiita-image-store.s3.amazonaws.com/0/17936/6181d353-777a-b67c-aa26-27f008a4f655.png" />

"Back to" と記述されていることからも分かる通り、左上のリンクは元のアプリに戻るバックボタンの役目を果たします。

右上のリンクをタップすると、対応する Universal link を Safari で開き直すことができます。

# Universal link でアプリが開かない！

問題はその後です。一度この「Safariで開く」ボタンを利用すると、以降の Universal link はアプリの切り替えではなく、Safari へ切り替えに利用されるようになります。

<img width="600" alt="" src="https://qiita-image-store.s3.amazonaws.com/0/17936/a7455b6d-5c20-169b-6822-dfe8b94f641f.png" />

Safari で開かれた際、アプリの方には何の通知も来ません。Safari 側で対応する Universal link のアプリを開くボタンが関連する位置にあればいいんですが、そんなものはありません。

Twitter の場合、開かれたサイトの方で従来の applink を使ったリダイレクトでアプリへの切り替えを促しています。

# Universal link をアプリで再度開くようにするには……

Universal link をタップ＆ホールドします。

<img width="300" alt="" src="https://qiita-image-store.s3.amazonaws.com/0/17936/28cb156d-4ebc-2bdd-9948-cc8313bef154.png" />

するとアクションシートで Universal link をどのように処理するか選択することができます。

ここで「Open in "アプリ名"」の方を選択すると、Universal link がアプリで開かれるようになります。

正直とても分かりづらい仕様で、どうしてこんな実装になってしまったのかよく分からないんですが、ステータスバーを非表示すれば、これらのリンクは表示されなくなるので、それが可能なアプリであれば、Safari で開くボタンを非表示にすることは可能です。
[*Cordova/PhoneGap*] CordovaとPhoneGapの違い

# はじめに
Apache CordovaとPhoneGapと何が違うのかよくわからないため調べます。

# Apache CordovaとPhoneGapの違い
PhoneGapのFAQから引用すると、以下のような違いらしい。
> PhoneGap is an open source distribution of Cordova. Think about Cordova’s relationship to PhoneGap like WebKit’s relationship to Safari or Chrome.

うーん、わからん。調べます↓。

## 作成したプロジェクトの構成の一部
プロジェクトの構成の一部や、設定ファイルの中身などがいろいろと違う。

```:Cordova
hooks
platform　･･･プラっとフォームごとの設定など
 -- android
 -- ios
 -- platforms.json
plugins ･･･プラグイン
 -- cordova-plugin-whitelist
 -- android.json
 -- fetch.json
 -- ios.json
www ･･･アプリの画面やページなど
 -- css
 -- img
 -- js
 index.html
config.xml ･･･アプリの設定ファイル
```

```:PhoneGap
hooks
platforms ･･･プラっとフォームごとの設定など
 -- ios
 -- platforms.json
plugins ･･･プラグイン
 -- cordova-plugin-whitelist
 -- fetch.json
 -- ios.json
www ･･･アプリの画面やページなど
 -- css
 -- img
 -- js
 -- res
 -- spec
 -- icon.png
 -- index.html
 -- spec.html
config.xml
```

## 使用できるバージョンの違い
PhoneGapのほうがちょっとバージョンが古い。
【Cordova】 5.4.1
【PhoneGap】 5.3.9

## コマンドの違い
PhoneGapではCordovaの大体のコマンドを実行できるのと、いくつかCordovaには無いコマンドがある模様。
Apache Cordovaではcordovaコマンド、PhoneGapではphonegapコマンドを使い、phonegapコマンドは内部的にcordovaコマンドを使ってたりしますが、phonegap独自のコマンドもある感じです。

|Cordova|PhoneGap|意味|
|:--|:--|:--|
|create|create|プロジェクトを作成|
|help|help<br>--help|コマンドヘルプの表示|
|info|info|プロジェクト情報を生成|
|requirements|requirements|プラットフォーム固有の要件をチェック表示する
|platform|platform|プラットフォームを管理する|
|plugin|plugin|プラグインを管理する|
|prepare|prepare|ファイルをビルド用にプラットフォームにコピーする|
|compile|compile|プラットフォームをビルドする|
|clean|clean|プロジェクトのクリーンアップ|
|run|run|プロジェクトを実行する|
|serve|serve|ローカルウェブサーバーでプロジェクトを実行する|
|build|build|プロジェクトのビルド|
|emulate|emulate|エミュレート|
|--version|version<br>--version|バージョンを表示|
|--verbose|--verbose |デバッグモードではすべての活動のための詳細なログを出力|
|--no-update-notifier||CLIの更新確認を無効にする|
||install|プロジェクトをインストールする|
||template|使用できるテンプレートリストの表示やテンプレートからのプロジェクトの作成|
||local|ローカルシステムにデプロイする|
||remote|phonegap/buildでクラウド上にデプロイする|
||cordova|cordovaコマンドの実行|

## PhoneGap Buildの利用
[PhoneGap Build](https://build.phonegap.com/apps)でリポジトリやZIPファイルから作ったものをビルドできる。
ビルド成功後はQRコードを読み込むことで端末にアプリをインストールできる。
無料でも有料でも制限があるが、有料版だとアプリ最大サイズが大きくてもよかったりする。Creative Cloudに入っているともれなく一番よいプランで利用できる。（[プランを確認](https://build.phonegap.com/#plans)）

## Adobe PhoneGap Enterpriseの利用
企業向けのものがある。サポートもついているらしい。

## The PhoneGap Developer Appの利用
ローカルでPhoneGap環境を作って、`$ phonegap serve`をコンソールから実行し、[専用アプリ](https://itunes.apple.com/app/id843536693)をダウンロードしたあと、コンソールに表示されているアドレス（192.168.3.6:3000など）を指定すると、作っているアプリをiPhoneなどの端末で確認できるというもの。

# まとめ
Adobeにお金を払っている人はPhoneGapを使ったほうがPhoneGap Buildの有料版が使えるのでお得なのかもしれないです。
プラグインもPhoneGap用とかあるみたいな感じがしました。
明日は何かしら作ってみようと思います。