OmniAICreator/Qiita-1.07M huggingface dataset:
sudoが使えないマシンでmecabを使うまでの備忘録

知らない間にアドベントカレンダーに追加されて書くことがない困ってるおじさんです。。。

共同研究で企業のサーバー環境で作業しているのですが、
sudo権限もらえなくてですね...
mecab使いたいけどインストールどないすんねんってなった話です
基本的に--prefixにユーザーディレクトリを指定するだけなんですけどね…
ただの備忘録です


## 前提

python2.*.*,mecab,ipadic,mecab-pythonの圧縮ファイルを~/tempにおいておきます(ディレクトリ名は何でも良いです)

## pythonのインストール

```
tar xvf Python-2.*.*.tgz
cd Python2.*.*
./configure --prefix=/home/user-name/usr/local
make
make install
```

## mecabのインストール

```
tar xvf mecab-0.996.tar.gz
cd mecab-0.996
./configure --prefix=$HOME/usr/local --with-charset=utf8 --enable-utf8-only
make
make install
```

```shell-session:.*shrc
export PATH=/home/user-name/usr/local/bin:$PATH
```

## 辞書のインストール

```
tar xvzf mecab-ipadic-2.7.0-********.tar.gz
cd mecab-ipadic-2.7.0-*********
./configure --with-charset=utf8 --with-dicdir=~/local/mecab-dic/ipadic-utf8
make
make install
```

/home/user-name/usr/local/etc/mecabrcを変更

```shell-session:mecabrc
.
.
dicdir = /home/user-name/local/mecab-dic/ipadic-utf8
.
.
```

## mecab-pythonのインストール

```
tar xvzf mecab-python-0.996.tar.gz
cd mecab-python-0.996
vim setup.py(編集内容は↓の通り)
python setup.py build
python setup.py install
```

setup.pyに記載のディレクトリパスを全て書き換える

```setup.py
#!/usr/bin/env python

from distutils.core import setup,Extension,os
import string

def cmd1(str):
    return os.popen(str).readlines()[0][:-1]

def cmd2(str):
    return string.split (cmd1(str))

setup(name = "mecab-python",
        version = cmd1("/home/user-name/temp/mecab-0.996/mecab-config --version"),
        py_modules=["MeCab"],
        ext_modules = [
                Extension("_MeCab",
                        ["MeCab_wrap.cxx",],
                        include_dirs=cmd2("/home/user-name/temp/mecab-0.996/mecab-config --inc-dir"),
                        library_dirs=cmd2("/home/user-name/temp/mecab-0.996/mecab-config --libs-only-L"),
                        libraries=cmd2("/home/user-name/temp/mecab-0.996/mecab-config --libs-only-l"))
                        ])
```

最後にパスを通す

```shell-session:.*shrc
.
.
export PATH=/home/user-name/usr/local/lib:$PATH
export LD_LIBRARY_PATH=/home/user-name/usr/local/lib
.
.
```

参考:
http://qiita.com/saicologic/items/ab70e14f7e2ec2ee0b4d
http://oshiete.goo.ne.jp/qa/8883975.html
PHPはいい奴だよ。

よくディスられるPHPですが、使っていると結構素直でいい奴なんですと。
と、Webアプリケーションの開発を例になんとなくPHPをアピールしてみます。

PHPって何の略称かとか話題になりますが、PHPはPHPであることが今の定義です。

# 動作環境の手軽さ

LinuxとApapcheとMySQLとPHPでLAMPとか言われていますよね。
実は、ソースコードを集めて野良ビルドをする必要が無いので、標準パッケージだけで
環境が出来てしまいます。

野良ビルドをせずに、標準パッケージだけで環境が構築出来るというのは、実は重要で、
環境構築に個人差が出来たり、人による依存性を排除することも出来ます。

まあ、クラウドとかDockerとか、HerokuとかVagrantとか、クラウドや仮想化に対応するならば、
野良ビルドをするという考え方自体をそろそろ捨てましょうｗ

昨日あたりPHP7がリリースされましたが、仕事使うならPHP5.5か5.6が良いかも。

# スクリプト言語のメリット

スクリプト言語は、動かしてみないと正常に動くか分からないという事もありますが、
コンパイルをして生成される中間コードや実行ファイルが不要なので、デプロイの手間が
省けるのもいいですよね。
一番のメリットは、書いたコードをすぐに動かせる。という点です。

あと、コードを直接見えているのは、問題があるかもしれませんが、
稼働中に急遽不具合とか問題があって処理を中止したい時に、サーバのソースを直接みて
該当箇所をコメントアウトしてしまうという荒技もOKです。

# 資料の豊富さ

これだけ入門書がいろいろ発行されていることから、情報の量は膨大にあります。
ただし、全ての情報が正しいとは限りませんが、Ruby on Railsとは違い使えない情報が
残っていることは少ないです。
日付の新しい物や、Qiitaの情報であれば、７割方間違いは無いでしょう。
（個人的な感想です）

# フレームワークの活発さ

Ruby on Railsに代表される様な、他のオープンソースのコミュニティに比べて、活動が地味な
印象があるPHPの界隈ですが、意外と活発に行動していますよ。

フレームワークで言えば、

CakePHPとlaravelがトレンドですかね。
フレームワークでこの２つをおさえて置けば、仕事にありつけるチャンスもあるかも。

フレームワークと言えるか未だに謎なんですが、
ブログのシステムとして有名なWordpress。これってカスタマイズ次第で何でも出来てしまうので、
ある意味重厚で大艦巨砲主義な感じのフレームワークですかねｗ

# ビジネスライクの割り切りさ

開発の案件で、他人が作ったもの、自分が作ったものが次の他人が改修、改造することになることがありますが、そう言った点でもPHPであれば、よほど変人が作ったコードで無い限り、
引き継ぎが困難になることはありません。

どんなに頑張っても、カオスコードやクソコードになることはあるけど、根本的な処理実装は
非常にシンプルなので、頑張れば解析可能です。（個人的な感想ですｗ）

作ったモノ（システム）とビジネスライク的にお別れしやすさもPHPの特徴かもしれません。

# 意外にスケールするのが簡単

PHP自体がシンプルなので、サーバに職人芸的な細工をしなくても、物量作戦（サーバの
リソースを投入する）で簡単にスケールしてしまいます。
いろいろな小細工をするのも良いですが、クラウドで超速いDBサーバーなんか投入しただけで、
スケールしなくても解決出来てしまうかもｗ

まあ、PHPの処理ロジックを部品として考えれば、どこにリソースを投入すべきかとか、PHPの
改修がどれだけ必要かとかわかりやすいですよ。



完全に個人の主観と感想で書いていますので、ツッコミはコメント欄にお手柔らかにお願いしますｗ
PHPってディスられるけど、意外にいい奴なんですよ。自分はもう５年以上PHPでコードを書いていますが、まだまだ好きですね。
phina.js で Webフォント を使ってみるよ！

はじめに
====

せっかくゲームを作っているのに、ブラウザ上でのゲームの場合フォントが環境依存になりがち。
これは、JavaScript のライブラリである、phina.js でも同じだと思います。

なので端末のフォント制約に影響されない目的で、Webフォントがあるので、これをつかって、phina.js でのゲーム内でもちゃんとしたゲームにあったフォントを使うよー！

ってことで、やってみました。
と、[去年](http://qiita.com/YFukuyama/items/3a4a1d4b7b395cc32bd4)と同じような出だしでコピーしつつ…

去年は、tmlib.js でしたが、後を引き継いだ？ phina.js では、どうなっているのか？
試してみます。

先に、結果を書くと…
tmlib.js では、いろいろありましたが
phina.js では、Asset として設定するだけで、ふつーに使えます！

HTMLファイル
----

HTML は、ほぼサンプルのまま。
普通です。特に変更する必要はありません。

```html:index.html
<!DOCTYPE html>

<html>
    
<head>
  <meta charset='utf-8' />
  <meta name="viewport" content="width=device-width, user-scalable=no" />

  <title>phina.js:Madomagi Web Font sample</title>
  <script src="javascripts/phina.js"></script>
  <script src="javascripts/main.js"></script>
</head>
    
<body></body>
    
</html>
```

スクリプト(CoffeeScript)
----

開始時の処理は以下の通り。

```coffeescript:main.coffee
phina.globalize()

# メイン処理(ページ読み込み後に実行される)
phina.main ->
  app = GameApp
    assets:
      font:
        'Madoka Runes': 'fonts/maqbsm.ttf'
    startLabel: 'main'
    width:  640
    height: 480
    backgroundColor: 'rgba(150,150,150,1.0)'
  app.run()
```
今回は、 `GameApp` を使用していて、ここで渡した `assets` のパラメータから
ゲーム開始前に、フォントファイルを読み込んでくれます。

`assets` のキーは、読み込む素材の種類(type)を示していて、phina.js で決められています。
今の所、 `image`/`sound`/`spritesheet`/`script`/`font` がある様です。

`font` の場合は asset を、以下のように指定します。

 - key に、 `fontFamily` で使うフォントの名前(好きにつけてもＯＫ)
 - value に、フォントのあるURL


メインシーンは以下の通りです。

```coffeescript:MainScene.coffee
# MainScene クラスを定義
phina.define 'MainScene',

  superClass: 'CanvasScene'

  init: (op) ->
    @superInit(op)

    labelText = 'mon mignon prêt-à-porter'

    # ラベルを生成
    @fromJSON
      children:
        label_1:
          className: 'Label'
          arguments:
            text: labelText
            fill: 'rgba(0,0,0,1.0)'
            fontSize: 24
          x: @gridX.center()
          y: @gridY.span(4)
        label_2:
          className: 'Label'
          arguments:
            text: labelText
            fill: 'rgba(0,0,0,1.0)'
            fontFamily: 'Madoka Runes'
          x: @gridX.center()
          y: @gridY.span(6)
```

`Label` の `fontFamily` に `assets` の `font` で指定したキー `'Madoka Runes'` を設定するだけです。

まとめると、普通に、Asset で、font ファイルを設定して、fontFamily で指定するだけ！

CSSを書く必要がなくなって、ロードのタイミングの問題とかも無くなって、とても簡単になりました。


サンプル
----

[phina.js:Madomagi Web Font sample](http://fukuyama.github.io/phina.js-webfont-sample/)

![ss20151203a.png](https://qiita-image-store.s3.amazonaws.com/0/30417/de514573-0725-30c1-6a92-713911ef8180.png)

こんな感じに表示されるはずです。

github repository: [fukuyama/phina.js-webfont-sample](https://github.com/fukuyama/phina.js-webfont-sample)

参考
----

- phina.js
 - [Home | phina.js](http://phinajs.com/)

- 使用フォント
 - [Deciphering the runes - Puella Magi Wiki](http://wiki.puella-magi.net/Deciphering_the_runes)

- tmlib.js Advent Calendar 2014
 - 5日目の記事: [tmlib.js で Webフォント を使ってみるよ！](http://qiita.com/YFukuyama/items/3a4a1d4b7b395cc32bd4)
Caps LockキーをCtrl（Command）キーに

## Caps LockキーをCtrl（Command）キーに

Dvorak Advent Calendar 5日目．


コピペなどでCtrl（Command）はよく使うのでリマップしましょう．

Mac OS Xは標準機能の設定から変更できます．
Windowsはレジストリをいじって変更できます．
azure 初心者がazure使ってたら意外とアクセスが伸びたのでその時にやったこととかかった金額

[マッシュアップアワード](http://mashupaward.jp/)という、開発コンテストに応募した作品[折り返し翻訳辞書](http://orikaeshi.com/)(サーバ側でAzureを利用)がバズった時に、やったこととか、その際にかかった金額について書いてみます。

`個人でクラウドを利用する開発ってどんな感じなの？`という時の参考になるかもと思い書いてみることにしました。

ちなみに自分のAzureレベルは、

+ Azureを利用して簡単なサービスを一つ作ってみたことがある
+ Azureマシンラーニングを触ってみたことがある

という程度です。(ついでに、コードはC#で書いたのですが、そのレベルについても触ったことがある、という程度です)

フロント側の対応については[こちら](http://qiita.com/macoshita/items/61b9713e8b42c486f67d)を参照ください
自分は、androidアプリでのプロトタイプの実装と、その実装ロジックをサーバ側でApiとして提供する、という部分を担当しました。

### 利用した Azure の機能
+ Azure App Service
+ Azure SQL Database
+ (Visual Studioからデプロイ)

## バズるまでの構成、バズった時の負荷の概算、実装の簡単な説明
+ Azure App Serviceは無料枠を利用
+ Azure SQL DatabaseはBasicサービスレベル(～ ¥612/月)を利用

もしかしたら記憶違いがあるかもしれませんが、とりあえず安いやつを選んでいた覚えがあります。

負荷については、`とりあえずリリース -> バズった！`
という流れで準備不足だったこともあり、正確には測れていないのですが、おそらく `20リクエスト/s` くらいだった気がします。

サーバ側の実装はシンプルで、

1. キャッシュがDBにあればそれを返す
2. なければ 翻訳Api を実行して返す。結果はDBにキャッシュしておく

という感じでした。

## やったこと
+ Azure App Service をスタンダード(S2)のサービスプランへ変更(¥21.63/時間. ～ ¥16,116/月)
  + 同時にオートスケールを設定
  + ピーク時は一時的にS3へ変更(半日程度)(¥43.25/時間. ～ ¥32,130/月)
+ Azure SQL Database を スタンダード(S2) のサービスレベル へ変更 (¥11.65/時間. ～ ¥8,670/月)

これでアクセスの多かった最初の1周間を乗り越えることができました。
その後は

+ ダッシュボードのグラフを見ながら、徐々に安いプラン、レベルへ落としていく

という作業を行い、現在では

+ Azure App Serviceは無料枠を利用
+ Azure SQL Databaseはスタンダード(S0) のサービスレベル(¥2.33/時間. ～ ¥1,734/月)

に落ち着いています。
DBがS0なのは、DBの容量がベーシックの最大値を超えてしまったためです。
これについては不要なキャッシュを消す等すればBasicに戻せそうな気もしています。

## 最初の1週間でかかった金額について
+ Azure App Service: 大体4000円程度
+ Azure SQL Database: 大体2000円程度

※サービスの負荷が下がっていたのにサービスレベル、プランを落としはじめたのが1週間後だったため、高めになっております。。。おそらく慣れている人であれば、2/3 から半額程度の金額になったのではないかと思います。
※なお、この金額にMicrosoft Translator の使用料金は含まれておりません＞＜

## 感想
+ 無料プランでリリースしたが、札束で殴りつけることでバズった時も乗り越えられてクラウドすごいと思った(小並感)
+ visual studioからのデプロイが驚くほど楽で、なんか最近はやりのDevOpsやってる感があった
+ 人手や初期設備に不足のある個人開発者ほど、クラウドを利用した開発、運用の恩恵が大きいのではないかと思った
  + 特にバズった時でも(札束さえあれば)サービスを安定して提供し続けられるという安心感が大きい
+ 不要なインスタンスによるクラウド破産に気をつけましょう
    + [http://orikaeshi.com/クラウド破産に気をつけましょう](http://orikaeshi.com/%E3%82%AF%E3%83%A9%E3%82%A6%E3%83%89%E7%A0%B4%E7%94%A3%E3%81%AB%E3%81%AF%E6%B0%97%E3%82%92%E3%81%A4%E3%81%91%E3%81%BE%E3%81%97%E3%82%87%E3%81%86)
iOS9.0 Safari で利用できる applink ハック

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 の Safari では、このダイアログを半ば無視してアプリを切り替えることが可能です。

<dl>
<dt>注意！</dt>
<dd>しかしながら iOS9.1 以降では<strong>以下のハックは利用できません</strong>。また iOS9.2 では、適用しない方がよい状況になっている様子です。素直に Universal link を導入しましょう。</dd>
</dl>

`location.href` などで applink にリダイレクトした後、別のアドレスに `setTimeout` を使って再リダイレクトします。

```javascript
  location.href = 'app-scheme://app-scheme';
  setTimeout(function() {
      location.href = "https://your.fallback.address/";
  },1)
```

この時、Safari では、後者で指定したアドレスが開かれると同時に applink が選択された状態と同じになり、該当アプリが開きます。

見つけた当初から Safari のバグっぽいと思っていましたが、iOS9.1 でしっかり直されていました。

ですので、もう一度言いますが、iOS9.0 でのみ利用できるハックで iOS9.1 以降では、副作用の方が影響が大きいので、**利用しないことを強くオススメ** します。
iOS,Android共通で使えるデータベースRealm

本記事は[KIT AppDeveloper Advent Calendar 2015]の5日目の記事です。
普段iOS,Androidのコードを開発することが多く、話題になっているモバイルデータベースについて書きます。

# iOSとAndroid標準のデータベースは取っ掛かりにくい

iOS:CoreData, Android:SQLiteと標準のデータベースがありますが、プログラミング初心者からすると何かと取っ掛かりにくいと思います。
そこでCoreData,SQLiteよりもっと簡単かつ高速なデータベースが話題になっています。


# 今話題のモバイルデータベースRealm

[Realm](https://realm.io/jp/)
[Realm meetup 忘年会 + LT大会](http://realm.connpass.com/event/23752/)があったり、盛んに開発が行われています。
まだバージョンが1.0になっていないため、バージョンアップ時に記述方法が変わったりもしますがより使いやすくなっていくと思います。

RealmはObjective-C,Swift,Javaの各言語をサポートしていて、iOS,Androidでコードが似ています。
そのため、Android版をすでに作っていてiOS版も作ってみたい（またはその逆）時に手軽に開発することができます。


# デモ

| iOS | Android |
|:-:|:-:|
|![iOS](https://github.com/roana0229/RealmSample/blob/master/demo-ios.gif?raw=true)|![Android](https://raw.githubusercontent.com/roana0229/RealmSample/master/demo-android.gif)|

# 簡単なサンプルコード

Userというモデルと、その追加・取得についてのサンプルコードを書いています。
下記のコードを見ると、iOS,Androidでのコードが似ていることがわかると思います。

### Userモデル

iOS

```User.swift
class User: Object {

    dynamic var id = 0
    dynamic var name = ""

    override static func primaryKey() -> String? {
        return "id"
    }
    
}
```

Android

```User.java
public class User extends RealmObject {

    @PrimaryKey
    private int id;
    private String name;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}
```

### Userの追加

iOS

```ViewController.swift
let user = User()
user.id = 1
user.name = "hoge"

let realm = try! Realm()
try! realm.write {
    realm.add(user)
}
```

Android

```MainActivity.java
User user = new User();
user.setId(1);
user.setName("hoge");

Realm realm = Realm.getInstance(this);
realm.beginTransaction();
realm.copyToRealm(user);
realm.commitTransaction();
```

### Userの全取得


iOS

```ViewController.swift
let realm = try! Realm()
let result = realm.objects(User)
```

Android

```MainActivity.java
Realm realm = Realm.getInstance(this);
RealmResults<User> result = realm.where(User.class).findAll
```
EPUBであまり使われていない仕様の数々（未来のある仕様の数々！）

# EPUB仕様

EPUB仕様には、EPUB3 本体の仕様と、そのほかの拡張仕様があります。
EPUB3 本体の仕様とは以下です。

http://idpf.org/epub/301

他に、様々な拡張仕様があります。例えば、

EPUB Multiple-Rendition Publications 1.0
http://www.idpf.org/epub/renditions/multiple/

EPUB Region-Based Navigation 1.0
http://www.idpf.org/epub/renditions/region-nav/

EPUB Previews 1.0
http://www.idpf.org/epub/previews/

EPUB Adaptive Layout
http://www.idpf.org/epub/pgt/

EPUB3.0.1 で本体に取り込まれましたが、Fixed layoutも最初は拡張仕様でした。

EPUB 3 Fixed-Layout Documents
http://www.idpf.org/epub/fxl/

これら拡張仕様で、定義が終わっているものは以下に書かれています。

http://idpf.org/ongoing#done

さて、、この投稿では、その中で、広く使われている仕様を紹介する、、のではなく、使われていない仕様を紹介して、標準化のあるあるを感じる投稿にしたいと思っています。


# EPUB Adaptive Layout

例でも挙げましたが、おそらく誰も知らないであろう仕様の筆頭は、EPUB Adaptive Layout という仕様です。

EPUB Adaptive Layout
http://www.idpf.org/epub/pgt/

こちら、2012 年に発行されていて、非常に歴史が深いのですが、対応しているViewerは、おそらく皆無だと思います。

せっかくなので、少しだけ仕様を上から見てみます。

## Editor 

まず、Editorが書かれています。

* Peter Sorotokin (Adobe Systems, Inc.),
* Brady Duga (Google, Inc.),
* Garth Conboy (Google, Inc.),
* Markus Gylling (IDPF)

Editor は仕様を理解する上で重要となる事がありますので、仕様を読むときは必ず確認しましょう。Adobeの人が、筆頭のようですね。IDPFでは、通常、提案者が先頭に書かれて、IDPFの人（たいてい、Markusさん）は末尾になります。

なぜEditorが重要なのかというと、フォーラム型の国際標準仕様は、たいていの場合、特定の企業の利益誘導を目的として策定されるためです。標準仕様は中立的では無いのか？と思われるかもしれませんが、仕様策定をしているのは営利企業ですので、見返りを想定して、標準化に投資（エンジニアを議論に参加させる等）を行っています。ただし、沢山の参加者が議論する事で、特定の会社に有利に働くことの無いように、是正された仕様になる、という仕組みになっています。

さて、この仕様の場合は Adobe が筆頭ということは、InDesiginのような事をしたいんでしょう、という事が想像つきます。（真意は知りませんが）

次に行きましょう。

## Abstract

仕様の概要です。以下のような事が書いています

* テンプレートベースで、ページをレイアウトする仕様
* CCSを拡張する
* 現CSSでは難しい複雑なページレイアウトで、かつ、リフローというのを実現する仕様

なんとなく想像が付いたでしょうか。

## Status of this Document

ここには、現在の仕様の状態が書かれています。"Informational Document"というのは、オフィシャルなドキュメントでは無く、参考のためのもの、という位置づけです。
これらの定義は以下に書かれています。

http://idpf.org/about_us/corp_docs/policies_and_procedures

"Informational Document"は参考資料で、標準仕様ではありません。Fixed layoutは"Informational Document"から、3.0.1 で正式に"Recommended Specification"に入っていますので、いつまでも"Informational Document"というのはおかしいと分かります。

## つまり？

以降は詳細なので省きますが、先頭の情報だけで微妙感が分かったかと思います。結局、ユースケースが現実のビジネスと結びつかず、実装されなかった、という仕様になります。


数々という割りに1つだけでしたが、、国際標準化はユースケース、特にビジネス上のユースケースと結びついていないことは往々にして有り、誰にも実装されない仕様となる、というのは国際標準化の「あるある」です。
現場のSails.js #5 バッドプラクティス

# 概要
弊社では一部の社内プロジェクトでSails.jsを利用しています。その中で得られたベストプラクティスやらバッドプラクティスをまとめていこうと思います。
第5回はバッドプラクティスについて。

# 動作環境
node.js v0.12.7
Sails.js v0.11.2
sails-mysql v0.11.0

# Sails.jsのバッドプラクティス
node.jsのMVCフレームワークはRailsのようにデファクトが無い状態です。デファクトがない理由はやはり、どのフレームワークも成熟しているとは言いがたい状態でしょう。Sails.jsはその中でも(たぶん人気がないので)微妙な点が多いです。そういった微妙な点と、その解決策についてまとめてみました。

## DeepPopulateが出来ない
Sails.js(のO/R MapperであるWaterline)では、SQLで言うところのJOINをするために以下のように記述します。

```js
Article.findOne(1).populate('tags').then(articles => {
  // {id: 1, title: "hoge", tags: [{id: 1, name: "Sails"}]}
});
```

しかし、`populate()`は現時点で1段階のJOINのみ(交差テーブルの時は2段階まで)しか対応していません。なので例えばArticleにwriterをJOINして、さらにwriterの所属企業情報をJOINするというQueryが1度で書けないようになっています。

そのため、2つのQueryを投げて自力でJOINする必要があります。

```js
Article.find().populate('writer').then(articles => {
  const IDs = _.map(articles, a => a.writer.company);

  return Company.find(IDs);
}).then(companies => {
  // ここで自力でarticlesにcompaniesを連結
});  
```

一応、DeepPopulate対応はしばらく前から[PullRequest](https://github.com/balderdashy/waterline/pull/1052)ができていて、実装は進んでいるようです。

## `Model.destroy()`の結果がcolumnNameに対応していない

Waterlineは以下のようにDBスキーマとマッピングするときに、`tableName`や`columnName`を指定することでSails上で別の名前で扱う事ができます。

```js:/api/models/User.js
module.exports = {
  tableName: 'users',

  attributes: {
    displayName: {
      columnName: 'display_name',
      type: 'string',
      required: true
    }
  }
};
```

ただし、執筆時点では`Model.destroy()`の結果として返ってくるモデルにはこの制約が効かないようです(上記の例だと、keyが`display_name`としてObjectが返ってくる)。まあ普通に`display_name`でアクセスしたらいいのですが、気持ち悪さはかなりある。

```js
User.destroy(1).then(user => {
  // => [{id: 1, display_name: 'hoge'}]
});
```

この問題、以前に似たようなPullRequst(そのときは`populate`内のwhere句でcolumnNameが効かない問題だった)を出したことがあるのでだいたい検討は付くのですが、この場合は完全にBreakingChangeになってしまい面倒で調査していません。。

## junctionTableにcreatedAt/updatedAtがない

これが一番困ったところで、createdAt/updatedAtがjunctionTableには付かないようです。例えばAritcle/Userという2つのテーブルが存在し、「ユーザがお気に入りした記事」というものを`ArticleFavorite`というjunctionTableで表現しようとしたときに、createdAt/updatedAtが保存されません。updatedAtはjunctionTableなので不要ですが、createdAtが無いと例えば「日付ごとのお気に入り数」がMySQLのデータのみだと取れなくなってしまいます。

対策としては、ArticleFavoriteをjunctionTbleではなく普通のModelとして定義することくらいでしょうか。ただ`save()`が使えなくなるので微妙な所。

```js
ArticleFavorite.create({user: 1, article: 1});
```

他のO/R Mapperだとどうなんでしょう？
大容量ログテキストファイルのダンプ・処理時間計測

これは[マイネット Advent Calendar]('http://qiita.com/advent-calendar/2015/mynet') 5日目の記事です

##前提の話
弊社ではソーシャルゲームの運営を行っています。

お客様からの問い合わせ対応も重要な業務の一つなのですが、そこで必要となるのが「DB内のプレイヤーデータ」と「ユーザ行動ログ」です。
なのですが、私が担当しているアプリではログが「Python2系の標準出力がそのまま吐き出される」というかなりおおざっぱな方法で蓄積されています。（もちろん整形はされていますが、型情報が失われていたり、文字列が`u'hogehoge'`となっていたりと、かなりな状況です。）

せっかくのログ、宝の山なのですから、もっと検索しやすいようにしなければなりません。そこで、まず手始めにデータをダンプしてみることにしました。

処理にはRuby バージョン2.2.1を使用します。
元のアプリはPython2.7なのですが、アプリの一部では無いことと、自分の手になじんでいるのがRubyなのとで、Rubyを選択しています。

##現在の状況と、やりたいこと
1行が1つのログで、1日分が1ファイルとして蓄積されています。

1ファイルのサイズは1.3GB強。ログの件数は460万件ほどとなっています。

これを何らかの方法でオブジェクト化してダンプするのですが、オブジェクトはみんな大好き連想配列にしました。RubyではHashですね。

当然、まとめてダンプするのではメモリがいくらあっても足らないので、1行ずつ処理してファイルに書き出していく形式を取ります。

せっかくなので複数の型式で処理時間を計測してみたいと思います。

1. みんな大好きJson
2. 余り使われてない気がするMessagePack
3. 設定ファイルだよね？ YAML

YAMLはほぼ冗談に近いとしても、テキスト形式のJSONとバイナリ形式のMessagePackではどのくらい差が出るのか気になるところです。

##計測実行
JSONの場合
実行時間 1393.9935074109817（だいたい23分）
ファイルサイズ 1.61GB

MessagePackの場合
実行時間 1267.4577710159938（だいたい21分）
ファイルサイズ 1.39GB

YAMLの場合
実行時間 4739.792451704008（だいたい79分）
ファイルサイズ 1.62GB

と言う結果になりました。

JSONとMessagePackでは1件あたりの処理時間にそこまで大きな差は無さそうですが、ファイルサイズではかなり大きな差が生まれました。

JSONとYAMLの間にそこまで差が無いことを考えると、テキストとバイナリの差かな、と思われます。

一方で、YAMLの処理時間の遅さが際立っていますね。

3倍〜4倍の処理時間がかかることを考えると、大規模なデータに対しては使いづらいといえます。やはりYAMLは可読性の良さをいかして設定ファイルに使う方が良さそうです。

##今後の課題
ログファイルをそのままダンプしたところで、処理時間がかかるだけでほとんど意味がないので、実用のためには検索を挟んでやる必要があります。

ただ、`.select.select.select…`と言うようなメソッドチェインはあまりやりたくないものです。

幸い、Rubyは内部DSLを作りやすい言語でもありますので、その辺をうまく吸収してくれるDSLを書かなければならない、と思っています。

後編へ続く か…？
Siri RemoteをtvOSのSimulatorで使う

アプリ道場のお父さん開発者 [@esum1527](https://twitter.com/esum1527)です。

現在、iPhone(iOS)アプリ[ふりとれ](https://itunes.apple.com/jp/app/furitore-xin-gan-xian-bian/id546217497?mt=8)をApple TV(tvOS)へ移植中です。手元のiPhoneで動いていたアプリがTVの大画面で見れると感動ですね。

さて、今回は開発中に気になったSimulatorの使い方の記事です。

#Simulatorが操作しづらい

アプリをSimulatorで実行するにはOptionキーを駆使するのですが、フリックしようとしたらタップになったりと思ったように操作できませんでした。

そこで、Siri RemoteをMacとペアリングすることでSimulatorでも使うことができるので実機感覚で操作を検証することができます。

今回は、OS X El Capitan(10.11.1) + Xcode 7.1.1 + Simulator 9.1
 で確認した手順をまとめました。

#やり方

##Apple TVとのペアリング解除

Apple TV本体から離れて、Siri Remote の **「MENU」**ボタンと**「音量を上げる」**ボタン を5秒押し続けます。
<img width="160" alt="Siri Remote" src="https://qiita-image-store.s3.amazonaws.com/0/56120/4711a51b-a64d-4902-2f9c-78ab91d47fc0.png">

これでApple TVとのペアリングが解除されます。
Apple TVに向けて操作しても反応しないことを確認しましょう。

##Macとペアリング
システム設定の Bluetoothを開きます。
Bluetoothを「入」にします。

先ほどと同じ手順でSiri Remote の **「MENU」**ボタンと**「音量を上げる」**ボタン を5秒押し続けます。
するとデバイスに表示されるのでペアリングをクリックします。

![環境設定-Bluetooth](https://qiita-image-store.s3.amazonaws.com/0/56120/1e0bce0f-4a5d-d5c7-6c5d-4922f6c6a747.png)
これで設定は完了です。

##シミュレータで確認
Xcodeからアプリを起動してからSiri Remoteを使ってみるとSimulatorでもそのまま利用できます。

![simulator](https://qiita-image-store.s3.amazonaws.com/0/56120/3dfd1937-fafc-1d73-3675-772d12027ccc.png)
実機と同じ操作感で試すことができるので検証にもなるので便利ですね。

##Apple TVへ再ペアリング方
元に戻すには、Macのシステム設定の Bluetoothからペアリングを解除(削除)してからApple TVに再度ペアリングします。

Apple TVへのペアリングについては「[Siri Remote または Apple TV Remote を充電する](https://support.apple.com/ja-jp/HT205384
)」のサポート情報に詳しく記載されてます。

＜参考＞
[Xcode 7.1 Release Notes - Simulator](https://developer.apple.com/library/ios/releasenotes/DeveloperTools/RN-Xcode/Chapters/xc7_release_notes.html#//apple_ref/doc/uid/TP40001051-CH5-DontLinkElementID_144
)
[Interacting with tvOS](https://developer.apple.com/library/tvos/documentation/IDEs/Conceptual/iOS_Simulator_Guide/AppleTV/AppleTV.html#//apple_ref/doc/uid/TP40012848-CH7-SW1)
【FileMaker】TODOリストを作って改良していこう(2)ーどの機種に対応させるか（使用環境の決定）


さて、[前回](http://qiita.com/drafts/cb8cba65e6f6c187b6a9)はどのような機能を実装していきたいかを見ていきました。
TODOといえども今時は書いてチェックがつけられるだけでは不十分なので、FMだからできることを中心に考えていってみてもいいかもしれません。

FMだからできること、と言えば、やはりiPhoneを始めとするiOSでも動くというところが強みではないですか？
TODOを見るときはどのようなタイミングで見るのか、PCにあればいいのか、それともTODOは持ち歩きたいのか？など、使うシーンを思い浮かべてみましょう。

TODOリストはPCにあるだけで十分ですか？

NO!

TODOは手元にあってすぐ確認でき、追加が出来、TODOが終わったらすぐに消し込めて自己満足できなければ意味がありません。

そういうことを考えると、やはりiPhoneで動かしてTODOを持ち歩きましょう！

さぁ、プラットフォームも決まりました。

いよいよ次は
「どんな機能の時にどんな画面を作り込むか」
というような画面を中心とした動作の確認と仕様を作っていきましょう！
knockoutのcustom-binding

    この記事は、knockout.js Advent Calendar 2015の５日目の記事です。 先に４日目に目を通すことを推奨しています。
    knockout , knockout-es5 , knockout.punches環境を想定しています。

knockoutでは、標準で提供されているbindingのほかに、独自でbindingを*custom binding*として登録することもできます。

custom bindingの作成の一例として、imgタグなどで用いることを想定とした、src属性を設定するbindingを作ってみます。
ちなみに、[knockoutのbinding](#knockoutのbindingへのリンクをここにかく)のattrの説明内でで、imgタグのsrcを``<img src="http://example.com/{{imgfile}}">``としてはいけないのは、何故だか分かりますか？

そうです。src属性はjavascriptによって制御される前に、
ブラウザによって、*外部リソースの取得*の動作が実行されるため、
``http://example.com/{{imgfile}}``へのHTTP Get Requestが発生してしまいます。
当然期待するファイルは存在しないので、リクエストエラーになりますし、それは無駄なリクエストです。([ネタ元、関連](http://qiita.com/trapple/items/5f566784364087b82428))

今回作成するcustom-bindingの仕様は次の通りとします。

* ``data-bind="src:['http://example.com/',resource]"``のように、``src``にresourceを解決するための配列を与える。
* src配列の１要素でも　未解決（undefinedまたはnull）の場合には、resourceを取得しない。

この場合の[**サンプル**はこう](http://jsfiddle.net/MKGaru/4fhrv15p/)なります。

```html:index.html
<img data-bind="src:['http://lorempixel.com/',resource]"/>
```

```js:script.js
ko.bindingHandlers['src']= {
    update: function(element, valueAccessor, allBindings, viewModel, bindingContext) {
        var src = valueAccessor().map(function(item){return ko.unwrap(item)});
        if(src.indexOf(undefined)==-1 && src.indexOf(null)==-1){
            element.setAttribute('src',src.join(''));
        }else{
            element.removeAttribute('src');
        }
    }
}
```

Custom Bindingの解説は、([公式](http://knockoutjs.com/documentation/custom-bindings.html)、[日本語](http://kojs.sukobuto.com/docs/custom-bindings)）に詳しく書かれています。

``ko.bindingHandlers['src']``が``src``という名前の``custom binding``を作成しますよー という宣言です。（最もただの連想配列として拡張しているだけなのですが）
updateは、``vallueAccessor``の中値が変化したタイミング（および初期化のタイミング）で時効されるハンドラです。
``valueAccessor()``は、今回の場合は、src:に渡す配列[]を取得しています。それの各要素を ko.unwrap()したものをsrcという変数に代入しているのは、コードを見れば明白ですね。
``ko.unwrap``は、与えられた引数が、ko.observable()な関数であれば、それを実行した値　そうでなければ　そのままの値を返すというヘルパーです。
その他の行は、ただのjavascriptとdom制御文なので説明は省きます。
インフラエンジニアが知っておくべきNewRelicでお得に課金するただ１つの方法


# はじめに
- New Relic、一度使い始めると便利でしょうがないっす。
- APMも課金するとより[多くのモニタリング情報](http://newrelic.com/application-monitoring/pricing)をみることができます。
- ここではAPMでの課金（WEB app Proプラン）を前提にお得なライセンス運用方法について説明します。

![image](https://qiita-image-store.s3.amazonaws.com/0/32789/edfe5bb1-e47b-7d25-dae9-09b9966e996e.png)



# New Relicの課金体系
- 契約しているライセンスにぶら下がっているAPMモニタリングしているホストの全てが課金対象となります
- 1台毎に課金、非課金と分けることはできません
- まったく課金しないか、全台課金するかのどちらかです
- 例えば1つのAPMにホストA、B、Cが含まれているとすると3ホスト分課金する必要があります

## はまりがちの罠

![Change plan   New Relic.png](https://qiita-image-store.s3.amazonaws.com/0/32789/66c06764-0cbd-bc9e-f9cc-7e7ff3ca2193.png)

- 上記のように課金ホスト数を自由に入力できるので課金対象ホスト数を選べると思いがちです
- あとでNew Relicの営業担当者から「全台課金するように」との警告が届きます


# お得な方法
- APMにぶら下がっている複数のサーバはスケールアウト構成でほぼ等価な役割をしていると思います
- そういう場合であればAPMで詳細な情報を取得するのは1台で充分だと思います

## 具体的な方法

- ライセンスをもう一つ取得し、下記のように使い分けをします

|ライセンス名|用途|
|---|---|
|Company Inc.|Web proライセンスを1台購入<br>APMでホストAを監視|
|Company2 Inc.|フリーのまま利用<br>APMでホストB、Cを監視|

- 1つのアカウントで2つのライセンスを切り替えて表示することが出来ます

![0944e06e-f186-c402-5ba2-1d245004db67.png](https://qiita-image-store.s3.amazonaws.com/0/32789/c73783ef-78d2-a73c-9e43-dde92f644def.png)



# 備考
一応、New Relicの営業担当者に連絡して、その担当者から教わったやり方なので合法だと思います。
image_pathをJavaScript側から使う

Railsでアセットを使う場合、`assets/`以下に入れておけば、Sprocketsが各種の処理を施していきます。それに気をつけないと、うまく動かないこともあります。

# アセットのプリコンパイル
本番環境でアセットをプリコンパイルすると、

* CoffeeScriptやSassのコンパイル
* ファイル名へのダイジェスト付与

などのことが行われます。ということで、画像ファイルについてもそのままの名前では参照できなくなってしまいます。

# `image_path`ヘルパー関数
そんなわけで、変換後の名前で参照するための`image_path`というヘルパー関数があります。これは、ERBなどのRubyコードに埋め込むためのものです。そして、Sassでは`image-path`とCSS的な命名に変わって存在しています。

ただし、どちらもJavaScriptに対して直接使えるものではありません。

# ERBで埋め込む？
もちろん、JavaScriptを`.js.erb`のような拡張子にしてERB処理させれば、いちおう使うことはできます。ただし、

```js+erb:扱いづらいファイル.js.erb
$(function(){
  $('#some_img').attr('src',"<%= image_path('path/to/some.png') %>")
});
```
というように、きわめて読み書きしづらくなってしまいます。

# 1ファイルだけに収める
さすがにこんなファイルで溢れかえると収拾がつかなくなるので、`image_path`関数をJavaScript側に出現させるファイルを作って、残りはそこを呼ぶことにします。

```js+erb:application/image_url.js.erb
<%
imgs = {}
Dir.chdir("#{Rails.root}/app/assets/images/") do
  imgs = Dir["**/*"].inject({}) do |h,f|
    h.merge!(f => image_path(f)) unless Dir.exist? f
    h
  end
end
%>

window.image_path = function(name){
  return <%= imgs.to_json %>[name];
}
```

このようにすることで、他のファイルではJavaScriptの関数として`image_path`を呼べます。

# 外部リンク
* [RailsにJavaScriptのimage_path](http://ria10.hatenablog.com/entry/20130827/1377576823)

なお、ここのコードに対してディレクトリ階層に対応するなど、多少を手を入れた形となっています。
マカレルのインストールが3行で終わって凄かった

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

なんとこの記事を書き始めた時点であと15分しかありません。シンデレラもビックリです。なので15分で書ける3行ねた。

Mackerelのインストールが本当に3行で終わって凄かったという話。

- rpm/dpkgでURL指定で直接インストール
- sedで設定ファイルのAPI Key書き換え
- init.d から start

これが公式のホスト追加ページに（しかもAPI Key埋め込んだ形で）書かれてるというのがすごい。
おかげさまで13台の既存ホストへのインストールが30分たたずに終わりました。便利すぎる。

Mackerel最高！！
brew installで404エラーが出た場合の対処

brew installでインストール対象のファイルが404とかになった場合の対処方法をよく忘れるのでメモ。

brew editでformulaを開く

```shell-session
$ brew edit <target>
```

urlを別の生きているurlに書き換え。もしくは別途マニュアルでダウンロードして、file://のurlを指定する。

```rb
class Nite < Formula
  homepage 'https://onedrive.live.com/redir?resid=33B0FE678911B037%21573'
  #brewで取りに行くと404
  #url 'https://onedrive.live.com/download?resid=33B0FE678911B037%21573'
  url 'file:///Users/poly/Downloads/NITE-Bin-MacOSX-v1.5.2.21.tar.zip'
...
end
```
Emacs25から標準添付されるseq.elを調べた

Emacs25から新しくseq.elというものが導入されたみたいですね．

http://git.savannah.gnu.org/cgit/emacs.git/tree/lisp/emacs-lisp/seq.el?h=emacs-25

> All functions are prefixed with "seq-".

全ての関数は `seq-` で始まるそうです．

> All provided functions work on lists, strings and vectors.

ListとString，Vectorに統一的に使えるようです．
今までは適用する関数がまちまちだったのでありがたいですね．

# Emacs25をインストールする

OSXでHomebrewをお使いなら以下のコマンドでインストールできます

`brew install emacs --devel`

インストールできたら，Emacsを起動してscratchバッファでバージョンを確認してみましょう．

```el
(emacs-version)
"GNU Emacs 25.0.50.1 (x86_64-apple-darwin15.0.0, NS appkit-1404.13 Version 10.11.1 (Build 15B42))
 of 2015-12-04"
 ```

25.0 になってますね．

# seqを試す

`seq-`で始まる関数は以下のようなものがあるようです

（`describe-function` で `seq-` と打ったときの `*Completions*` バッファからコピーしました．
もっと上手に列挙する方法があれば教えてください）


```
seq--activate-font-lock-keywords 	seq--count-successive 	seq--elt-safe
seq--make-pcase-bindings 	seq--make-pcase-patterns 	seq--pcase-macroexpander
seq-concatenate 	seq-contains 	seq-copy
seq-count 	seq-difference 	seq-do
seq-doseq 	seq-drop 	seq-drop-while
seq-each 	seq-elt 	seq-empty-p
seq-every-p 	seq-filter 	seq-find
seq-group-by 	seq-intersection 	seq-into
seq-into-sequence 	seq-length 	seq-let
seq-map 	seq-mapcat 	seq-mapn
seq-max 	seq-min 	seq-partition
seq-position 	seq-reduce 	seq-remove
seq-reverse 	seq-some 	seq-sort
seq-subseq 	seq-take 	seq-take-while
seq-uniq
```

よくある `seq-map` を List，String，Vector へ試してみましょう．

```el
;;; List
(seq-map (lambda (x) (+ x 1)) '(10 20 30))
(11 21 31)

;;; String
(seq-map (lambda (x) (format "++%c++" x)) "abcd")
("++a++" "++b++" "++c++" "++d++")

;;; Vector
(seq-map (lambda (x) (+ x 1)) [10 20 30])
(11 21 31)
```

全て同じ関数で扱えていますね．
今までリストを扱う外部ライブラリ [dash.el](https://github.com/magnars/dash.el) でまかなっていた一部は seq.el で十分かもしれません．
自分だけのためのSlack Team

自分のためのSlack Teamというのを暫く使っていて、色々「これはいい！」と思って使ったり、そして「やっぱウザいわ...」と思ってやめたりしているうち、チャットというフローに載せていい情報と載せても意味のない or 載せると鬱陶しい情報が絞られてきているので、まとめてみる。

![](https://gyazo.com/3ad943313a132442de912458da3c8b34.png)

## Slackに定型化した調査のフロー情報を集める

「ログを溜める必要のない情報 & 古くなったら価値の無くなる情報」は、チャットに流すのが一番いい。例えばtwitterのトレンドやRSSフィード、最近のニュースなど、古くなったら価値の無くなる情報というものが確実にある。
そして、それぞれのサービスを使うよりは、サービスから拾ってきてチャットにフロー情報として集約した方が忘れない上に精神的にも優しい。
feedlyを見たり、twitterで定期的にトレンドを調べたり、みたいなのは今の情報でない限り価値を持たないのでSlackのログ制限で流れるのを加味しながら流し続ける。

- https://www.npmjs.com/package/hubot-rss-reader
 - RSSとか
- https://www.npmjs.com/package/hubot-twitter-search
 - エゴサーチとか
- https://www.npmjs.com/package/hubot-weather-ja
 - 天気とか

## mentionによる通知のアダプタ

- https://www.npmjs.com/package/hubot-trello
 - 個人プロジェクトの通知
- https://www.npmjs.com/package/hubot-cron
 - shellスクリプトしてまとめるために

## コマンド代わり

家の電気消したかな？とか音楽消したかな？みたいな情報はなるべく外からコマンドでなんとかできるようにしている。鍵はまだ無理なんだけど、いつかやりたい。

- https://www.npmjs.com/package/hubot-philipshue
 - 家のhueとか
- shellをHubotに実行させる(自作)

## deployはサーバで待ち受けず、SlackとHubotで繋ぐ

GithubによるpushのhookによるPOSTリクエストというのを自宅サーバで待ち受ける仕組みというのを自分でメンテナンスするのが面倒くさくて、一旦GithubのhookはIncomingに送ってから、その内容をサーバで飼ってるHubotが拾ってdeployするという仕組みにしている。

- https://www.npmjs.com/package/hubot-deploy

## まとめ

だいたいHubotで捨てずに残っているスクリプトは以下の４つで、コマンド以外は「今必要だけど、少し経つと不必要になる情報」が生き残っているという印象。ずっとログが残るとなるとまた違うんだろうけど、フロー情報として尖らせる方向にしか結局使い続けていない。

- 定型化しているニュースと調査の情報
- mentionによる通知のアダプタ
- コマンド代わり
- deploy用
Win版Dockerとの死闘

4日目にして、早くもバトンが途切れそうだったので、どーでも良いことを書いてみます。

<blockquote class="twitter-tweet" lang="ja"><p lang="ja" dir="ltr">win用dockerクライアント。コンテナに起動コマンド渡そうとすると、mingw32側で同じコマンド見つけてwin上のフルパスに書き換えて死ぬ。手抜きでgitbash流用してるのが原因という線も消せないけど、他にも似たような問題あるみたいなので、不具合なんかなー</p>&mdash; 長久 勝 (@mnagaku) <a href="https://twitter.com/mnagaku/status/608124681481297920">2015/6/9</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

中途半端なの、もしかしたらやれるかも知れんって思わせるだけ、罪が深いよな。
XcodeのパッケージマネージャーAlcatrazを使う

Xcodeにもプラグインがたくさん開発されていますが、それらを管理する機能は備わっていません。
Alcatrazというパッケージ管理を行うプラグインがスタンダードなようなので、インストールしてみました。

### 動作を確認した環境
#### Mac OSのバージョン
- 10.10.5(Yosemite)

#### Xcodeのバージョン
- 6.4
- 7.1.1

### URL
- 公開されているサイト:http://alcatraz.io/
- ソースコード(GitHub):https://github.com/alcatraz/Alcatraz

### インストール方法
GitHubのREADMEに書いてる通り、以下のコマンドを実行します。

```
% curl -fsSL https://raw.github.com/alcatraz/Alcatraz/master/Scripts/install.sh | sh
```

このように表示されれば成功です。

```
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   590    0   590    0     0    496      0 --:--:--  0:00:01 --:--:--   497
 24  105k   24 26579    0     0   7654      0  0:00:14  0:00:03  0:00:11 12362x Alcatraz.xcplugin/
x Alcatraz.xcplugin/Contents/
x Alcatraz.xcplugin/Contents/Info.plist
x Alcatraz.xcplugin/Contents/MacOS/
x Alcatraz.xcplugin/Contents/Resources/
x Alcatraz.xcplugin/Contents/Resources/ATZPackageListTableCellView.nib
x Alcatraz.xcplugin/Contents/Resources/ATZPluginWindowController.nib
x Alcatraz.xcplugin/Contents/Resources/bitbucket_grayscale.tiff
x Alcatraz.xcplugin/Contents/Resources/en.lproj/
x Alcatraz.xcplugin/Contents/Resources/eye_icon.tiff
x Alcatraz.xcplugin/Contents/Resources/git_grayscale.tiff
x Alcatraz.xcplugin/Contents/Resources/github_grayscale.tiff
x Alcatraz.xcplugin/Contents/Resources/link_icon.tiff
x Alcatraz.xcplugin/Contents/Resources/en.lproj/InfoPlist.strings
x Alcatraz.xcplugin/Contents/Resources/en.lproj/Localizable.strings
100  105k  100  105k    0     0  24400      0  0:00:04  0:00:04 --:--:-- 34754

Alcatraz successfully installed!!1!🍻  Please restart your Xcode (7.1.1).
```

### 利用方法
インストール後に初めてXcode起動すると、以下のダイアログが表示されます。
![xcode_alcatraz1.png](https://qiita-image-store.s3.amazonaws.com/0/17529/7f66d3e7-34e2-575c-70a0-d333cb5ca3c8.png)
"Load Bundle"ボタンを押すと組み込みまれます。
![xcode_alcatraz2.png](https://qiita-image-store.s3.amazonaws.com/0/17529/a1e72387-6322-d8a7-1330-bf91e59f664b.png)
メニューからWindow→Package Managerを選ぶと起動します。Shift + Cmd + 9キーでも起動します。
![xcode_alcatraz3.png](https://qiita-image-store.s3.amazonaws.com/0/17529/9bf4eb55-289f-84f1-0cb0-25bd30277e95.png)
ここからプラグインを検索してインストールする事ができます。

### アンインストール方法
```
% ls -1 ~/Library/Application\ Support/Developer/Shared/Xcode/Plug-ins
Alcatraz.xcplugin
VVDocumenter-Xcode.xcplugin
XVim.xcplugin
```

上記の通り、通常のプラグインと同じディレクトリにあるので、READMEにも記載されていますがこれを削除するだけです。
```
rm -rf ~/Library/Application\ Support/Developer/Shared/Xcode/Plug-ins/Alcatraz.xcplugin
```

### その他
- Xcodeは最新の7.1.1と必要があって6.4を併用しているんですが、プラグインは共有されるようです。
- Alcatrazのインストール以前に手動でインストールしたプラグインも管理対象になっていました。
- プラグインの管理だけかと思ったらカラーテーマとテンプレートもインストールできます。ますます便利。

### まとめ
Xcodeを使っていると、かゆい所に手が届かないなと思う事があるのですが、様々なプラグインのおかげでだいぶ使いやすくなります。
今はiOSアプリの開発しかしていませんが、いずれはこんな便利なプラグインを作ろうと思いました。
Qiitaへの投稿をKobitoではなくGitHubで管理する

##キッカケ
先日悲しい事件が起きたのをきっかけにGitHub上で管理するようにしました。


以下、再現状況です。

------

####hoge.jsライブラリのfugaについて

```

var fuga = function(a) {

  if( a == null )  return;

  return a * 2;
};


```

aを2倍にして返してくれる関数です

-----------------

この状態でkobitoから投稿したところ、以下の様な編集リクエストが届きました。


---------------


｀｀｀ **javascript**

var fuga = function(a) {

  if( a == null )  return;

  return a * 2;
};


｀｀｀

---------------
(※わかりにくいためコードブロックは全角にしました)

こちらのほうがわかりやすいと思ったため、WEBブラウザ上から即座に受け入れました。

また、平行して、投稿したけれど修正したい部分があったためkobito上で修正を続けていました。


------

####hoge.jsライブラリのfugaについて

```

var fuga = function(a) {

  if( a == null )  return;

  return a * 2;
};


```

引数aに対して、nullかどうかのチェックを行い、nullではなかった場合はaを2倍にして返してくれる関数です。

-----------------

この状態まで編集した後、WEBブラウザ上で編集リクエストを受け入れていたことを思い出したため、なんとかローカル上のkobitoに反映させなければと思いました。
gitでいうところのgit pullがしたかったのです。

ただし、Kobito上で「アイテム」→「Qiitaから取得」を押しても変更はないと言われてしまいます。
しょうがないので、「アイテム」→「Qiitaに投稿」を押しました。最悪コンフリクトしたらそこで調節すればいいと思ったためです。

Qiitaへ投稿を押すと、思った通りうまくアップロードできず、「WEBを優先する」「Kobitoを優先する」のアラートが出てきました。

ここで、
・ ｀｀｀javascriptな部分はそのまま保持して欲しい
・　追加した文章のところはKobitoで編集した方を優先して欲しい
と思い、今回のWEBとKobito上の編集箇所はうまく別の場所を修正されていたため、ここは「WEBを優先」すれば

｀｀｀　←現在のKobito上
｀｀｀javascript ←現在のWEB上

ここの部分のみうまく修正してくれて下部のnull~~の文章についてはうまくマージされるだろうと思っていました。


###現実

この状態になりました

-----------
####hoge.jsライブラリのfugaについて

｀｀｀javascript

var fuga = function(a) {

  if( a == null )  return;

  return a * 2;
};


｀｀｀

aを2倍にして返してくれる関数です

------------


・・・／(^o^)＼



ほんとはもっと長く（2−30行以上）編集していたため、悲しみに包まれました。


##GitHubで管理する
そんなことがあり、GitHub上にQiitaリポジトリを作成し、そこにhoge.mdファイルとして管理することにしました

* まずはGitHub上もしくは適当なMarkdownが使えるエディタを用いて書く
* GitHubにPushする

編集リクエストが来た場合は
・まずは見てよさそうならQiitaで受け付ける
・GitHubでブランチを切ってそこに編集リクエスト後のQiita記事をコピペする
・PullRequestベースで受け付ける
・差分を見て大丈夫そうならマージする（ここまで自演）

とし（ようとし）ています。

これで差分とかがあっても安心安全！！！！！


##Kobitoへの要望
アップロード時にKobito上とコンフリクトが起きた場合は、アラートを出すだけでなくKobito上でコンフリクトが解消できるようなツールになるとうれしい。


##おわりに
GitHubを併用して快適なQiita投稿ライフを！
R で文字列を POSIX time に変換するには lubridate::parse_date_time2() がやっぱりちょっぱや

[lubridate 1.5.0のアップデート内容](https://github.com/hadley/lubridate/blob/master/NEWS.md#version-150)を見てたら、こんなことが書いてありました。

> [#326](https://github.com/hadley/lubridate/issues/326) Added `exact = TRUE` option to `parse_date_time` for faster and much more flexible specification of formats.

で、そういえばこんな論争があったのを思い出しました。

[R で文字列を POSIX time に変換するには lubridate::parse_date_time2() がちょっぱや](http://qiita.com/hoxo_m/items/6f18b163946f6f41deca)
[readr::parse_datetimeは組み込み関数より速いがfast_strptimeより遅い](http://qiita.com/dichika/items/4255bc4b5949c9b367f1)

やってみました。

```r
dates <- as.POSIXlt("2014-12-01", tz="Japan") + sample(seq(31*24*60*60)-1, size=100, replace=TRUE)
dates <- as.character(dates)

format <- "%Y-%m-%d %H:%M:%S"
format2 <- "YmdHMS"

microbenchmark(
  strptime(dates, format),                    
  as.POSIXlt(dates),                          
  as.POSIXct(dates),                          
  lubridate::fast_strptime(dates, format),
  lubridate::parse_date_time(dates, format, locale="C"),  
  lubridate::parse_date_time(dates, format, exact = TRUE),   # new!
  lubridate::parse_date_time2(dates, format),
  lubridate::parse_date_time2(dates, format2, exact = TRUE), # new!
  readr::parse_datetime(dates, format)
)

#> Unit: microseconds
#>                                                       expr       min         lq        mean     median         uq       max neval
#>                                    strptime(dates, format)  1067.984  1115.0750  1195.53292  1136.2055  1151.2985  2862.849   100
#>                                          as.POSIXlt(dates)  3332.545  3378.4285  3706.03166  3409.8215  3453.8935  8359.133   100
#>                                          as.POSIXct(dates)  4378.192  4428.6020  4697.42747  4461.5050  4523.3865 10673.198   100
#>                    lubridate::fast_strptime(dates, format)    53.128    63.3915    80.44661    71.8430    91.7665   213.114   100
#>    lubridate::parse_date_time(dates, format, locale = "C")  2547.103  2672.0735  3081.57806  2769.5750  2813.3445  7715.565   100
#>    lubridate::parse_date_time(dates, format, exact = TRUE)   423.814   442.2270   533.67875   505.9195   553.9155  1125.941   100
#>                 lubridate::parse_date_time2(dates, format)    88.144   103.8410   132.62035   114.1040   147.6105   275.298   100
#>  lubridate::parse_date_time2(dates, format2, exact = TRUE)    50.713    63.3920    78.89513    70.3350    90.2570   201.643   100
#>                       readr::parse_datetime(dates, format) 42902.889 43343.3035 44310.82814 43587.2070 44042.7155 69498.042   100
```

`exact=TRUE`をつけると、頭一つの差で`lubridate::parse_date_time2()`が返り咲いています！ Congrats!

...まあわずかな差なんだしどうでもいいのでは、という気はします。この記事もきっと瞬く間に陳腐化することでしょう。備えよう。

ちなみに注意点としては、`parse_date_time2()`が想定しているのは`%`なしのフォーマットです。「あれ？ `exact=TRUE`を付けたらエラーになる...」みたいな時は、`"%Y-%m-%d %H:%M:%S"`みたいなフォーマットを間違って指定していないか確認してみましょう。

ちなみにこの仁義なきスピード競争に最近[RcppCCTZ](http://dirk.eddelbuettel.com/blog/2015/12/01/#rcppcctz_0.0.1)も仲間入りしたわけですが、誰か試してみたひとは記事をよろしくお願いします。
Qiitaのタグ別のストック数分布についての考察

ふと気になったので、タグによってストック数の分布が変わったりするのか、少し調べてみました。

# 構想とデータの取得
特に難しいことはなく、
・タグのフォロワー数と投稿数を拾う
・タグのデータを1ページずつ開く
・ストック数、記事名、投稿時刻、投稿者をスクレイピング
・データフレームをマージし続ける
こんなことを考えました。
そして、以下のようなソースを少しずつ書き換えて動かすことで、各タグに対するストック数のデータを得たのでした。

```r:scrape.R
library(rvest)
library(stringr)

df.all <- data.frame(stock=1,title="a",post_by="a",post_date="a")
df.all <- df.all[F,]
tag <- "関数型言語"
# R/43
# PHP/259
# Python/222
# Haskell/49
# 関数型言語/6

for(page in 1 : 6){

  q <- html(sprintf("http://qiita.com/tags/%s/items?page=%s", tag, page))
  
  # stock
  data <- html_nodes(q, xpath = '//ul[@class="list-unstyled list-inline publicItem_statusList"]') %>%
    iconv("utf-8", "cp932") %>%
    str_replace_all("\\n","") %>%
    str_replace_all("commentsCount.+","") %>%
    str_replace_all("</li.+","") %>%
    str_replace_all(".+>","") %>%
    str_replace_all(".+publicItem_","") 

  data <- data.frame(stock=data)
  
  # title
  data$title <- html_nodes(q, xpath = '//div[@class="publicItem_body"]/h1') %>%
    html_text() %>%
    iconv("utf-8", "cp932")
  
  # post_by
  data$post_by <- html_nodes(q, xpath = '//div[@class="publicItem_status"]/a') %>%
    html_text() %>%
    iconv("utf-8", "cp932")
  
  # post_date
  data$post_date <- html_nodes(q, xpath = '//div[@class="publicItem_status"]') %>%
    html_text() %>%
    iconv("utf-8", "cp932") %>%
    str_replace_all(".+が","") %>%
    str_replace_all("に投稿.*","") %>%
    str_replace_all(".+posted on ","")
  
  df.all <- merge(df.all, data, all.x=T, all.y=T)
  Sys.sleep(1)
}
```
本当に簡単にスクレイピングできるのが手軽で楽です。

# 可視化
などというほどたいそうな物でもないですが。。。
<img width="333" alt="scrape.png" src="https://qiita-image-store.s3.amazonaws.com/0/94255/dd757d13-53d3-443d-4359-7d46ecb749e2.png">
意外と同じぐらいなんですね。画像を作ったソースも貼ってみます。
ただし、dfの形を若干整えています。

```r
library(plyr)
library(tidyr)

png("scrape.png")
intvl <- c(1:100,10000)
colsv <- c("#FF0000AA","#0000FFAA","#00FF00AA","#DD00DDAA")
cols <- list(R="#FF0000AA",Haskell="#0000FFAA",Python="#00FF00AA",PHP="#DD00DDAA")
mds <- list()
means <- list()
for(tag in c("R", "Haskell", "Python", "PHP")){
  means[[tag]] <- summary(df[df$tags==tag, ]$stock)["Mean"]
  mds[[tag]] <- summary(df[df$tags==tag, ]$stock)["Median"]
  df.t <- findInterval(df[df$tags==tag, ]$stock, intvl) %>% count()
  df.t$freq <- df.t$freq / sum(df.t$freq)
  plot(df.t, col=cols[[tag]], ylim=c(0,0.3), type="l")
  par(new=T)
}
legend(50,0.3,legend=paste(c("Lang.","R", "Haskell", "Python", "PHP"), c("Med.",mds), c("Mean",means), sep=","),
       lwd = 1, col=c("white",colsv))
dev.off()
```

# 考察
Rは人口が少ないからストックされにくいのかと思ったのですが、そういうことでもないようです。ストック数を増やすためには、駄作を量産するのではなく、ちゃんと人が読んで意味のある記事を書け、ということですね。
Meanの値で見ると、Rはストック数が少ないようにも見えますが、これはマイナー言語だと大当たりする記事が少ないということなんでしょうね。
ただ、Rは検索したタグたちの中では唯一、フォロワー数よりも記事の数が多い言語でした。
タグにおける記事数とフォロワー数の比率は、ある種の指標になりそうでしたが、あまり色々言うと変なことになりそうなので、とりあえず気にしないことにします。

ちなみに、これ、グラフに載せていない「関数型言語」だと、かなりストック数が増えます。平均67ストックです。でも、ポエム含有率は意外と低かったです。たくさんのポエムが駆逐されてしまったんですね。（ポエム含有の定義は、タイトルにポエムという文言を含むか否か。。。）

# もうちょっと考察
Qiita自体の自力、少なくとも検索にかかる度合はかなり高いと思いますが、それは直接はストック数にはつながらないように思われます。ストック数やビュー数を稼ごうとすると、twitter等のQiita外の媒体からの集客の効果が高いような気がします。

特にオチもなくおしまい。
AWS Lambda Python で AMI の世代管理を自動化する


[こちらの投稿](http://qiita.com/ketancho/items/9bdb974a9d9b1224108d)で Lambda を使ってサーバレスに AMI の取得を自動化しました。
取得を自動化したら次は世代管理（一定数を超えたらpurge）の自動化ですね！
こちらも Lambda を使ってやってみました。

## Lambda ファンクションの作成

AMI 取得の Lambda ファンクションと同様に、EC2 の操作権限のあるロールを指定します。

```lambda_ec2_all
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "Stmt1448895482556",
      "Action": "ec2:*",
      "Effect": "Allow",
      "Resource": "*"
    }
  ]
}
```

## Code

今回も対象のインスタンス名を指定するかたちで、purge 処理を行います。
自身に紐付いている Image を取得順に並び替えて、保存したい世代数 `GEM_NUM` を超過した分を削除しています。
普通に Image を消すだけだと Snapshot との紐付けは消えるのですが、Snapshot 自体は残ってしまうので、Snapshot も明示的に削除するようにしています。


```python:deregister_ami.py
# -*- coding: utf-8 -*-

import commands, boto3

TARGET_INSTANCE_NAME = "***" # Enter your target Instance Name
GEM_NUM = 2 # 保存世代数

def _(cmd):
    return commands.getoutput(cmd)

def handler(event, context):
    images = boto3.client('ec2').describe_images(Owners=["self"])["Images"]
    
    delete_count = len(images) - GEM_NUM
    targetImages = []
    for image in sorted(images, key=lambda x: x["CreationDate"]):
        if (delete_count == 0) :
            break
        elif image["Name"].count(TARGET_INSTANCE_NAME):
            targetImages.append(image)
            delete_count -= 1
            
    for targetImage in targetImages:
        ec2 = boto3.resource('ec2')
        ec2.Image(targetImage["ImageId"]).deregister()
        for block in targetImage["BlockDeviceMappings"]:
            ec2.Snapshot(block["Ebs"]["SnapshotId"]).delete()
```

## Configuration

Handler は deregister_ami.handler としてください。
Timeout はデフォルトの 3秒終わらないことがあるかもしれません。
少し伸ばしましょう。

## Event sources

私の場合は朝4時に AMI を取得しているので、
取得処理が終わっているであろう10分後に purge するように cron(10 4 ? * * *) としています。
-> 今回の本題からは外れますが AMI の取得は API を呼び出しに成功しても途中で失敗することがあります。
　　ですので、例えば purge する Image がひとつもないときはその日の AMI 取得がうまくいかなかったとみなし、
　　管理者に通知あるいはメールを送るといったことができるといいなーと思ってます。今度実装してみます。

## 制限

* 対象インスタンス名は一つしか指定できません（取得の方も同様）が、これに関しては今回は Lambda を使うことが本題で対応しなかっただけで、対象を指定する変数を配列化すればすぐに修正できると思います。
* 手動で取得した Image も削除対象になることがあります。purge判定は「指定したインスタンス名が含まれている」かつ「取得したタイミングが古い」の２点だけで判断しているためです。本当は自動で取った AMI に自動で取ったことがわかるようなタグを付与し、そのタグがあるものだけを自動 purge すべきです。これも実装しようと思えばできると思いますが、今回は対応していません。

## まとめ

Python さえ書ければ運用スクリプトの多くを Lambda でサーバレス化できるような気がします。
次は、アプリロジックを書き、API Gateway と組み合わせて API を作ってみたいです。
アプリロジック書くなら Java にすべきでしょうか。
Lambda で採用する言語についてもいろいろ考察してみたいです。
ReactNativeのbuildを高速化する

ReactNativeでjsを触っているだけならアプリをリビルドする機会はそれほどないのであまり気にならないのですが、NativeModuleを含む開発を行っている最中などはリビルドも頻繁に行うことになるので、ビルド時間が結構気になります。

ビルド時間の主成分を調べてみると、どうも `main.jsbundle` を生成する `node_modules/react-native/packager/react-native-xcode.sh` の実行で時間がかかっているようです。
packagerでサーバーを立てて開発している場合は`main.jsbundle`は不要なので、開発中はこのビルドフェイズをskipすれば良さそうです。

残念ながら（今の）xcodeではビルドフェイズの項目を残したまま無効化できないので、`node_modules/react-native/packager/react-native-xcode.sh`ファイルを開いて冒頭に`exit`と書き加えておけばok。リリース時には自分で`react-native bundle`コマンドを実行したほうが良さそうです。
.net MVC とAdminLTE-2.3.0を使ってスマートでリッチな画面を作る [ 組み込み ]

[★若葉組のつぶやき★ Advent Calendar 2015](http://qiita.com/advent-calendar/2015/adv_young_leaves) の4日目を担当します！

[前回](http://qiita.com/Chitama/items/cbba237ee0424698d99b)、bootstrapに触れずに終わりましたが、今回は.net上で表示までいきます！

##スクリプト準備
bootstrapから提供されているスクリプト類をプロジェクトに含めます。
・AdminLTE-2.3.0フォルダから、次の3つのフォルダをフォルダごとプロジェクトフォルダにコピー。
1. bootstrap
2. build
3. plugins
・Visual studioから「プロジェクトに含める」
※赤いところをクリックすると含まれていないファイルが見えます。
![1203_02.PNG](https://qiita-image-store.s3.amazonaws.com/0/91552/880e965b-9f75-5b61-8f19-a36e4f7ac119.png)

##ビューファイルに組み込み
【組み込み対象ファイル】AdminLTE-2.3.0のindex2.html
AdminLTEでは、1つのHTMLファイルでデザインが完結しています。
でも、ページへッダーや左のメニューって、ページごとに書かないですよね？
WebFormsやASP.NET MVC2まで「Site.Master」に書いて共通で使っていました。
ASP.NET MVC3以降は、「_Layout.cshtml 」を使います。

##スクリプトとスタイルを組み込む
【編集対象】_Layout.cshtml 
・準備したスクリプトファイルが読みこまれるように追記します。
・\<head>内をindex2.htmlの\<head>をまるっとコピーします。
・\<script>タグも元々のは消してindex2.htmlの\<script>を全部コピーします。
・それぞれのパス設定にチルダを入れます「~/」
そのまま実行するとタブ名が変わっています。

##共通部分を組み込む
【編集対象】\_Layout.cshtml 
・\<body>タグのclassをコピーします。
・メイン部分を囲む\<div＞のclassに「content-wrapper」を設定します。
・メイン部分以外の4か所をコピーします。
1. ①ヘッダー部分
2. ②左メニュー部分
3. ④フッター部分
4. ⑤右側の非表示メニュー
※Visual Studioでindex2.htmlファイルを表示すると各部品でまとまっているので、折りたたむとコピーしやすいです。
![1203_04.PNG](https://qiita-image-store.s3.amazonaws.com/0/91552/cfc11c05-9965-9438-3794-1e6514907654.png)
そのまま実行するとこんな感じになります。っぽくなってきました。
赤丸のスクリプト部分もちゃんと動きます。
<img width="600px" alt="120306.png" src="https://qiita-image-store.s3.amazonaws.com/0/91552/afd19719-c9b1-fc43-bead-b4dd423e8606.png">
プログラムは下のようになります。(_Layout.cshtml )![1203_07.PNG](https://qiita-image-store.s3.amazonaws.com/0/91552/9e6b3604-b745-44a6-3175-c5ec272d9542.png)

##メイン部分を組み込む
【編集対象】Index.cshtml 
・③メイン部分をコピーします。
・コピーした部分を\<section>で囲んで、classに「content」を設定します。
・メインを囲んでいる\<div>を削除します。（わかりやすくコメントアウトにしてます）
![1203_08.PNG](https://qiita-image-store.s3.amazonaws.com/0/91552/5b1a0999-bd75-35c2-6844-b690eb91ebe9.png)
ここまで修正すると・・・
![1203_09.PNG](https://qiita-image-store.s3.amazonaws.com/0/91552/a5619be9-522c-1728-f65a-d3bc08ac4e45.png)
できました！！

##最後に・・・
今回、コピーした部分って結構長かったです。しかも、折りたたむとときれいに分かれていることがわかります。
そういうときは、別ファイルとして編集できるようにします。それまた次回。
セルフレビューのおススメ

### -日本語でおk-
この記事はhttp://qiita.com/advent-calendar/2015/english_translation
の4日目の記事です。
(前日はコチラ http://qiita.com/Uemmra3/items/f94ffd61e9fac80972aa)
(翌日はコチラ http://qiita.com/Uemmra3/items/5ae758398c49efd6adbd)

# セルフレビューのおススメ

人の文章を読んで「何言ってるの？？？」と思うことがある。
もちろん、レビューという仕組みがあって、お互いが協力することは大事である。

ただその前に、自分が読んで意味のわかる文章でないと、相手の気持ちもなえてしまうかもしれない。

# メソッド(俺流のやり方)
## 時差アタック
まず、翻訳してから時間を置いて、見直してみるのが一番！
翻訳最中は、なかなか疲れてしまって気づかないことも、後になるとわかるものである。
できれば一回睡眠を挟むと効率的にセルフレビューできる気がする。

## オカンに説明するように
母親はやっぱり偉大である。
いろいろと自分のことを育てて、見てきてくれてるかけがえない存在だ。
そんなオカンも、技術の細かいことはわからなかったりする。
なので、そんなオカンに「良くわかるわ～」と言わせるドキュメントが、最良のドキュメントだと思う。
### 応用例
お姉さん、妹、恋人、嫁
そんな所に、「この文章おかしくないか？」と聞くのも良い。

### 最低限「てにをは」は気をつけよう
日本語は難しい。助詞、つまり「てにをは」が間違ってると意味が通らない。
逆に、「てにをは」さえしっかりしてたら、多少構文がヘンでも意味が通る気がする。
なので、「てにをは」をセルフレビューするのは大事だ。

# まとめ
他人のレビューを受ける前に、自分自身で見返してみよう！
[tvOS]プロジェクトの内容

<p>『tvOS for Developers』の情報から、tvOS用のXcodeプロジェクトの内容について探ってみよう。</p>

![ADC.jpg](https://qiita-image-store.s3.amazonaws.com/0/12540/1b55a7fc-e1d0-2b0a-faff-d29e4dc3f914.jpeg)

<p>DemoBotsというサンプルコードは、OSXとiOS、tvOSのプロジェクトが収められているので、tvOS固有の内容が分かりやすいのではないかと判断。</p>

![proj.jpg](https://qiita-image-store.s3.amazonaws.com/0/12540/8922fcc7-5ce6-ffd4-e744-42c08ed54dc0.jpeg)

<p>当たり前だが画面の方向関連の項目がない。</p>

![file.jpg](https://qiita-image-store.s3.amazonaws.com/0/12540/3cbf9372-aee9-491e-f2b4-1f280dd08c51.jpeg)

<p>ファイルの種類は、iOSと似ている。</p>

<p>複数のStoryboardがある場合、どうしてtvOSだと分かるのだろうか。</p>

![target.jpg](https://qiita-image-store.s3.amazonaws.com/0/12540/f1a5b624-78f9-6d6d-61f8-a3ef34673fc1.jpeg)

<p>ターゲットに関連付けられているものということだった。</p>

関連情報
<a href="http://qiita.com/advent-calendar/2015/cocoa/">Cocoa Advent Calendar 2015</a><br />
<a href="https://developer.apple.com/tvos/">tvOS for Developers</a><br />

【Cocoa練習帳】
<a href="http://www.bitz.co.jp/weblog/">http://www.bitz.co.jp/weblog/</a><br />
<a href="http://ameblo.jp/bitz/">http://ameblo.jp/bitz/</a>（ミラー・サイト）<br />
<a href="https://t.co/6P3h2jtbRk</a>note<br />
[OSX][iOS][watchOS][tvOS]Swift.org

<p>WWDCでの約束通り、Swiftがオープンソース化された。</p>

<p>Swiftが登場してからC言語について意識するようになったが、Swiftを知れば知る程、C言語の素晴らしさに気付かられる。また、C++言語についても問題も多いが、C++が適切な分野はあると思う。例えば、Swift自身はC++で記述されているし。でも、C++でなくてもいいじゃんというシチュエーションに遭遇することは多い。</p>

<p>Appleの事だから、言語趣味的な事はなく、実用的なアプリケーション開発のプロが使う道具として割り切ったものだと思うので、そういう部分は好感を持っている。今後に期待しているので、裏切らないでよ！</p>

<p>Swiftのオープンソース化については、他にも投稿があると思うので、ちょっと変わった視点でのお話を。</p>

<p>マルチプラットフォーム向けのプロダクトだと思うが、ビルドシステムに何を使っているのだろうか？調べてみると、Ninjaビルドシステムというのを使っているようだ。</p>

<a href="https://ninja-build.org/">Ninjya</a><br />

<p>説明を読むと、軽量なシステムということだが、期待していいのかな？</p>

関連情報
<a href="http://qiita.com/advent-calendar/2015/cocoa/">Cocoa Advent Calendar 2015</a><br />
<a href="https://developer.apple.com/swift/">Swift</a><br />
<a href="https://swift.org/">Swift.org</a><br />
<a href="https://github.com/apple/">GitHub</a><br />

【Cocoa練習帳】
<a href="http://www.bitz.co.jp/weblog/">http://www.bitz.co.jp/weblog/</a><br />
<a href="http://ameblo.jp/bitz/">http://ameblo.jp/bitz/</a>（ミラー・サイト）<br />
<a href="https://t.co/6P3h2jtbRk</a>note<br />