OmniAICreator/Qiita-1.07M huggingface dataset:
ChicagoBossで複数アプリを動かすときに同じライブラリ名は使えない


# 問題

[Erlang] (http://www.erlang.org) のフレームワークである [ChicagoBoss] (http://www.chicagoboss.org) において、1つのサーバーに複数のアプリケーションを置くことができる。
その際にライブラリの名前が同じだと、違うアプリケーションのライブラリを呼んでしまうことがあって困る。

# アプリケーションの作成

* [Quick Start] (https://github.com/ChicagoBoss/ChicagoBoss/wiki/Quickstart) の通り

-1. ChicagoBossをダウンロードやcloneして落とす
-2. ChicagoBossディレクトリで

```
./rebar get-deps compile
```

-3. アプリケーションのひな形を作る

```
make app PROJECT=first
```

-4. Libraryを作る

```
cd ../first
vi src/lib/message.erl
```
```
-module(message).

-export([get_hello/0]).

get_hello() ->
   "Hello from first app!".
```

-5. Controllerを作り、Libraryを呼び出す

```
vi src/controller/first_greeting_controller.erl
```
```
-module(first_greeting_controller, [Req]).
-compile(export_all).

hello('GET', []) ->
    {output, "<strong>First App</strong>"}.
```

-6. テスト用に起動する

```
sh init-dev.sh
```

-7. http://localhost:8001/greeting/hello にブラウザでアクセスすると、Hello from first app! と表示される (4.のLibraryに書いておいた文字)

-8. 3〜7を繰り返して、もう1つアプリケーションを作る 
(firstという文字を全てsecondにしたものを作り、Hello from second app! と表示されるところまで確認する)

# 同時に動かす

* 2つのアプリケーションを1つのChicagoBoss上で同時に動かす

-1. firstを起動したときにsecondも同時に起動するように設定する

```
vi first/boss.config
```

一番上で

```
[{boss, [
    {path, "./deps/boss"},
    {applications, [first]},
    {assume_locale, "en"},
```
となっている部分を

```
[{boss, [
    {path, "./deps/boss"},
    {applications, [first, second]},
    {assume_locale, "en"},
```

に変える。
次に一番下で、

```
{ first, [
    {path, "../first"},
    {base_url, "/"},
%    {domains, all},
%    {static_prefix, "/static"},
%    {doc_prefix, "/doc"},

    {dummy, true}
]}
```
となっている部分を

```
{ first, [
    {path, "../first"},
    {base_url, "/first"},
%    {domains, all},
%    {static_prefix, "/static"},
%    {doc_prefix, "/doc"},

    {dummy, true}
]},
{ second, [
    {path, "../second"},
    {base_url, "/second"}
]}
```
に変える。

-2. 2つともコンパイルする

```
cd ../second
./rebar compile
cd ../first
./rebar compile
```

-3. 起動する

```
cd first
sh init.sh start
```

# 現象

* http://localhost:8001/first/greeting/hello
* http://localhost:8001/second/greeting/hello

両方とも Hello from second app! と表示されてしまう。

* first/ebin/message.beam
* second/ebin/message.beam

が同じ名前なのがマズい。
ロード順かと思ったが、コンパイル順を変えてみても、boss.configに書く順番を変えてみても、secondばかりが表示された。

**Erlang has a flat module namespace**

Erlangには名前空間などない！ということなので、そもそも同じ名前にするのが間違い。

# 解決策

両方ともmessage.erlという名前で作成したLibraryを、別々の名前に変える。

別々の人がアプリを書いてるときなど、名前は競合しそうなものなんだけど・・・
他に解決策があったら知りたい。
ruby の all? は[]の時 true

`全ての要素が真なら true` と思い込んでいてハマったので共有

```
[1] pry(main)> [].all?
=> true
[2] pry(main)> [].all?(&:a)
=> true
```

[ all? to return true when none of the collection members are false or nil.](http://ruby-doc.org/core-2.1.0/Enumerable.html#method-i-all-3F)

実際は `false か nil の要素が無ければ、true`。
【MovableType】導入コンテンツによるカテゴリ設計とアーカイブマッピング技法

サイトを構築する際、MovableTypeでテンプレート化をする場合、MT化するコンテンツ仕様によりカテゴリーアーカイブをどう利用するかという設計をしますがその一例をご紹介します。

#前提条件
まずMT化するコンテンツでどのように情報を展開するか、URLをどうするかという点を考慮します。
例としてニュースコンテンツに対して「エンタメ」「経済」「ゲーム」という３つのカテゴリを設けるという仕様の元お話します。


# シンプルな形式
ニュースコンテンツのトップが**http://hoge.com/news/index.html**
各カテゴリが**http://news/category/index.html**

と素直に出力する場合は一番シンプルです。
このときのアーカイブマッピングは
```
カテゴリアーカイブマッピング：%-c/%i　もしくは　%c/%i
```
でいいと思います。
上記であればサブカテゴリが作成されても「/categoryのbasename/sub_categoryのbasename/index.html」というで出力されます。

カテゴリのベースネームもそれぞれ「entertainment」「economy」「game」と指定しておけばゲームの一覧であれば「game/index.html」で
出力されます。

#カテゴリ別ディレクトリでハイフンとアンダーバーを共存させたい場合
シンプル形式の記述ではカテゴリーベースネームで記述された値に「ハイフン」か「アンダーバー」のどちらかに変換させるという形になってしまいます。
問題なけばいいですが、前者のハイフンが活かされるパターンの際にアンダーバーでベースネームに登録したとき、ハイフンに変換されて出力されます。
ただ出力だけなら問題ありませんが、basenameの値を取得してCSS判定やシステム判定を行う場合は勝手に変換されるので
想定した値がこない場合があります、これを回避させるために

```
カテゴリアーカイブマッピング：<$MTCategoryBasename$>/%i
```

という形で設定すればOKです。
実はカテゴリタグがマッピングで使えるという裏技。

# カテゴリベースネームを利用したファイル名で出力し、且つ親カテゴリ一覧を「index.html」で対応する場合

子カテゴリが入る場合で、シンプルな形式のものに加えて**親カテゴリに俗する全ての一覧**が必要な場合素直に作るのであれば
上記で対応が可能ですが、出力するURLが
親カテゴリ「category/index.thml」
子カテゴリ１「category/sub_category1.html」
子カテゴリ２「category/sub_category2.html」

という形で出力したい場合は設定を変える必要があります。
その際、デフォルトで用意されている記述ではこれは対応できません。
対応させるには下記の対応が必要になります。

```
カテゴリーアーカイブマッピング：
<MTHasNoParentCategory><$MTCategoryBasename$>/index.html<MTElse><MTParentCategory><$MTCategoryBasename$></MTParentCategory>/<$MTCategoryBasename$>.html</MTHasNoParentCategory>
```

前述もしましたがMTタグが使えるのでこういう記載も実は有効だったりします。
親子の二世代のみの仕様であれば上記でOKです。
簡単に解説すると```<MTHasNoParentCategory>```で親カテゴリーかどうかを判定。
トップレベルカテゴリであれば親は存在しないのでこれで対応。
子カテゴリだった場合は親カテゴリのベースネームディレクトリの下に出力するという形です。
親カテゴリのベースネームを「index」を与えがちですが、複数付与することができないので注意です。
[iOS8] Swiftで文字列の任意の範囲（Range）を削除する方法

Swiftで文字列の任意の範囲（Range）を削除する方法をサンプルコードで説明します。

<h3>条件</h3>
・可変する為、NSMutableStringで宣言
・先頭が0,1...とした削除スタート地点の指定（location）
・削除する文字数の指定（length）

<pre class="lang:default decode:true">let str:NSMutableString = "Hello World!"                     // "Hello World"
str.deleteCharactersInRange(NSRange(location: 0,length: 5))  // " World"</pre>
ニューラルネットワークと深層学習(和訳)

 __とりあえず読んでみたい、という方は：[「ニューラルネットワークと深層学習」日本語訳のページ](http://nnadl-ja.github.io/nnadl_site_ja/index.html)をご覧ください。__

Deep Learningってのがマジヤバイらしい・・・でも、取っかかりがつかめない・・・
=====

ここ最近、Deep Learningの盛り上がりが凄いですね。私の中でも、深層学習を覚えなきゃ、置いてかれてしまい、ついには自分の仕事までAIに奪われるのでは、という危機感と、逆に今Deep Learningを使えるようになれば未来の発明者になれるのでは、という期待感が高まり、Deep Learningを勉強しなくては、と思い続けていました。

しかしながら、私はDeep Learningがどうしても理解できませんでした。これまで何十種類ものDeep Learningの教材を試してきました。しかし、Deep Learningがどうしても理解できませんでした。しかし、世の中にある文書で、なかなかとっかかりになるものが見つからず、参入障壁の高さを感じていました。なぜなら、

- 論文：仕組みがちゃんと書いてあるんだけど、英語で書いてあるはずなのに基本的な用語すら意味がわからない。「vqppknのsqdvfljmncをy2vxdddsepnimcbvubkomhrpliibtwztbljipccすればhkhpgができた」状態
- プレゼン：自然言語と絵でヤバイことができたことを説明していることは理解できるものの、肝心の仕組みはちっともわからない
- ライブラリ類：たぶんこれを手で動かしてみるのが正道なんだろうけど、やっぱそれでは仕組みはわからない。[Caffeのチュートリアル](http://caffe.berkeleyvision.org/tutorial/)とか読んでみたんだけどトップ記事が「Blobs, Layers, and Nets」で早くもvqppknのsqdvfljmncをhkhpg状態
- 教科書：まだそんなものはない

という状況だったからです。

この教材に出会って、私は変わりました！
===

そんな中、Michael Nielsen 著、[Neural Networks and Deep Learning](http://neuralnetworksanddeeplearning.com/) (NNADL) というオンライン無料書籍を見つけました。英語版を流し読みし始めたのですが、まず思ったのは「ブログ記事にしちゃとんでもなく長い！」ってこと。そして、パーセプトロンの解説から入るなど、一見回りくどいように見えて、まさに「基本的な用語すら意味が分からない」門外漢のレベルから、ちゃんとしたDeep Learningの理解に至るまでの道のりを丁寧に解説しています。ひと目で、尋常でない良書だと見抜いたよ。


素人でも、たった少しの努力で○○するだけで技術をマスターできる？
===
その方法とは翻訳です。翻訳するとどうしても、ある書籍に書いてあるすべての事に一度は目を通すことになります。"[すごいHaskell本](http://www.amazon.co.jp/gp/product/4274068854?ie=UTF8&camp=1207&creative=8411&creativeASIN=4274068854&linkCode=shr&tag=nushio-22)"を翻訳したときも、タブレットPCとBluetoothキーボードをビニール袋に入れ、5か月間くらい毎晩お風呂でキーボードを叩いていたのですが、おかげでApplicativeもMonadも深く理解できたので、比較的に少しの努力であったといえるとおもいます。おまけに、今でも秒間の収入を年収換算すると億を超えるような秒もあるようになりました。翻訳という日本語コミュニティに貢献する仕事が実に多くの見える人、見えない人に支えられていることを知ることもでき、「すごいH本」の翻訳は実に貴重な体験でした。


あなたも、この方法でDeep Learningをマスターしませんか？
====

というわけで、"Neural Networka and Deep Learning"(NNADL)の日本語訳プロジェクトを立ち上げることにしました。あなたも参加して、いっしょにDeep Learningを勉強しませんか？もちろん、ただ読んでくださるだけや、誤字脱字の報告だけでも結構です！

現在進行中の日本語訳はここから見れます： http://nnadl-ja.github.io/nnadl_site_ja/index.html

また、翻訳参加者はgithubのプロジェクトページ： https://github.com/nnadl-ja/nnadl_site_ja から受け付けています。

日本語プロジェクトを盛り上げることで、原著者が未執筆の原著第六章「Deep learning」を執筆するモチベーションにもなればと思います。

よろしくお願いします。

※ちなみに、原著は商用化を禁ずるライセンスのもと公開されているので、秒間年収〇億稼げるようになったりはしません。あしからず。

この教材に出会って、私は変わりました！
==

余談ながら、ニールセンさんとメールで会話してOKももらい、翻訳を進めてしばらくたったころ、NNADLの著者のニールセンさんが Neilsen & Chuang, "[Quantum Computation and Quantum Information](http://www.amazon.co.jp/gp/product/1107002176?ie=UTF8&camp=1207&creative=8411&creativeASIN=1107002176&linkCode=shr&tag=nushio-22)"(QCQI)
 の著者のニールセンさんと同一人物であることに気が付きました。

物理学専攻としてはお恥ずかしながら、私は量子力学がどうしても理解できませんでした。これまで何十種類もの量子力学の教科書を試してきました。しかし、量子力学がどうしても理解できませんでした。そんな私がはじめて量子力学を納得した！と思ったのがQCQIだったのです。

多分私がプログラマとしての感覚があったこともあり、QCQIの「『量子ビット』という未知のデバイスの素子としての性質、組み合わせた時の挙動を、順を追って、出来るだけ平易な数学で、曖昧性を残すところなく定義していく」というアプローチが、個人的な感覚とマッチしたのだと思います。Neilsen & ChuangのQCQIはそんな思い出深い本です。

そんな二人のニールセンが、まさか同一人物だったとは！学問の境界を軽々と乗り越えてゆく凄い人がいるとは聞きましたが、その実例を目撃した思いでした。NNADLもDeep Learningに対して同様のアプローチで迫る教科書であり、期待が高まります。
【Perl】my @a = 'command'; でsystemコマンド実行の標準出力を取得する際、標準エラー出力を表示させない方法

IO::Captureとかでキャプチャしてもだめだし途方に暮れてたけど

```lang:filename
	my $command = $_[0]." 2>&1";
	my @commandResult = `$command`;
```

こんなんで良かったとは...
【Git】 .gitignoreに設定しているファイルがリモートに存在するエラーの解決法

`git pull`や`git fetch`をした際に、.gitignoreに設定しているファイルがリモート側に存在している場合に

```
error: The following untracked working tree files would be overwritten by merge:
```

というエラーを吐き出します。

![error.png](https://qiita-image-store.s3.amazonaws.com/0/48677/46de6b79-cae7-8c20-3f6d-3a98dad8478d.png)

## 解決策
そういった場合の解決策は、一度最新のリモートを取得し、リセットすると解決できます。

```
// 最新を取得
git fetch origin
```

```
// リセットする
git reset --hard FETCH_HEAD
```
エクセルの条件付き書式を使って、複数の特定の文字列「以外」のセルに色を付ける。

##やりたい事
* セル内に「なし」以外の文字列が入っている場合に色を付けたい。
* 空白セルは「なし」同様色付けしない。
* 「なし」以外のケースで入ってくる文字列が様々で、「『なし』ではない文字列」以外のパターン分けは不可能。

##結論
条件付き書式から「数式を使用して、書式設定するセルを決定」を選択して、以下の様な数式を入力する。

```
=NOT(OR((C3="なし"), (C3="")))
```

以下、説明。
結論だけ欲しかった人はここまで読めば十分です。

##数式の書き方について
文字列一致を調べる場合は、こんな感じで書いていく。
「C3」の部分は、設定範囲内の任意のセル1つのセル番号。

**「なし」に一致する**
```
=C3="なし"
```

**「なし」または空白に一致する**
```
=OR((C3="なし"), (C3=""))
```

**「なし」または空白に一致しない**
```
=NOT(OR((C3="なし"), (C3="")))
```

## 具体例
### 初期状態
「なし」と空白以外のセルに色付けをしたい。
![キャプチャ No-0002.png](https://qiita-image-store.s3.amazonaws.com/0/46299/df56a690-b411-0822-6294-1accb33d5b26.png)

###色付けしたい範囲を選択する
マウスドラッグで選択。
![キャプチャ No-0000.png](https://qiita-image-store.s3.amazonaws.com/0/46299/fbdde95f-4d26-17e3-2335-9ea4c0cb018e.png)

###条件付き書式を選択する
ホームタブにある「条件付き書式」のボタンをクリックする。
![キャプチャ No-0003.png](https://qiita-image-store.s3.amazonaws.com/0/46299/7c809dd9-c792-7e76-ccab-a07aa531f1ae.png)

プルダウンで色々出てくるが、その中から「新しいルール」を選択する。
すると、以下の様なウィンドウが開くので、「数式を使用して、書式設定するセルを決定」を選択する。

![キャプチャ No-0004.png](https://qiita-image-store.s3.amazonaws.com/0/46299/73693329-f71b-d7c1-811b-eb9e44647705.png)

テキストボックス内に以下を入力する。
「C3」の部分は、選択範囲内に含まれるセル番号をどれか1つ書けばいい。
あとはエクセル側がうまく処理してくれる。
範囲内で一番左上のやつを書いてあげるのが無難かもしれない。

```
=NOT(OR((C3="なし"), (C3="")))
```

### 条件を満たした場合の書式を設定する
「書式」ボタンから条件を満たした場合の色設定をする。
こんな感じ。

![キャプチャ No-0005.png](https://qiita-image-store.s3.amazonaws.com/0/46299/47e97fac-ba7d-bdbf-e0e6-0b512475f9b5.png)

### 適用
OKを押して適用。
うまい具合に色付けできました。
うまくいかなかった場合は、エクセル側が勝手に数式を弄ってる可能性があるので、
条件付き書式→ルールの管理から設定を見なおす。

![キャプチャ No-0001.png](https://qiita-image-store.s3.amazonaws.com/0/46299/2a125139-a3c1-b36d-6473-a51e04d2b9fc.png)
OUTER APPLY で SELECT 項目で取得したい内容を JOIN の ON にも使用する

最近ようやく `OUTER APPLY` の使い方がわかってきたマンなので書いてみます。

**以下、記事内では `OUTER APPLY` を使用していますが、今回のように確実に APPLY 先のレコードが取得できることが分かっている場合は `CROSS APPLY` を使用したほうが高パフォーマンスになります。**

通常、`SELECT` 句で `CASE` 式などを使った複雑な値を取得する場合、その値を `JOIN` の `ON` 句で使うことはできません。

```sql
SELECT CASE M.Code
           WHEN 0 THEN 'A'
           WHEN 1 THEN 'B'
           ELSE        'C'
       END AS XCode
      ,S.Name AS XName

FROM Main AS M

INNER JOIN Sub AS S
-- XCode をここで使うことは出来ないので同じ CASE 式を書かないといけない
        ON S.Code = CASE M.Code
                        WHEN 0 THEN 'A'
                        WHEN 1 THEN 'B'
                        ELSE        'C'
                    END
```

※ そもそもそのデータ設計どうなんだというツッコミは置いておいてください。

ここで、`OUTER APPLY` を使うとスマートに解決することができます。

```sql
SELECT X.XCode AS XCode
      ,S.Name AS XName

FROM Main AS M

OUTER APPLY (
    SELECT CASE M.Code
        WHEN 0 THEN 'A'
        WHEN 1 THEN 'B'
        ELSE        'C'
    END AS XCode
) AS X
INNER JOIN Sub
        ON X.XCode = Sub.Code
```

私はわからないことがあるとき LINQ で喩えて考えるというライフハックを持っているので、それで理解してみました。
LINQ でいうところの `let` 句に近いと思います。

```csharp
var q = from m in Main
        let x = new
                {
                    XCode = m.Code == 0 ? "A" :
                            m.Code == 1 ? "B" :
                                          "C"
                }
        join s in Sub
          on x.XCode equals s.Code
        select new
        {
            XCode = x.XCode,
            XName = s.Name
        };
```

「各レコードに対して "そのレコードについて処理されるコンテキスト" で使う値を選択する」と言えばいいでしょうか。

ちなみに、他の方法として CTE (Common Table Expression) を使う方法やインラインテーブル値関数を定義する方法もあると思うのでお好みで。

今回は名前を付けられるような意味のある `CASE` 文ではなく、その箇所に特化した特殊な `CASE` 文だったので無名で処理したくて `OUTER APPLY` を使う方法をとりました。闇。

えすくーえるは苦手なので、もっといいやり方があれば教えてください。
mysqldumpをテーブル毎に行うシェルスクリプト

こんな感じでいいですかね。 :fearful: 

```
#!/bin/bash
MYSQL_USER='hoge_user'
MYSQL_HOST='hoge_host'
MYSQL_PASS='hogehoge'
MYSQL_DBNAME='hoge_db'

DIR=dump__${MYSQL_DBNAME}
if [ ! -d ${DIR} ] ; then
mkdir ${DIR}
fi

for TABLE in `mysql -u${MYSQL_USER} -p${MYSQL_PASS} -h${MYSQL_HOST} -N -s -e "show tables in ${MYSQL_DBNAME};"`; do
    echo $TABLE
    mysqldump -u ${MYSQL_USER} -p${MYSQL_PASS} -h${MYSQL_HOST} ${MYSQL_DBNAME} $TABLE | gzip -c > dump__${MYSQL_DBNAME}/$TABLE.sql.gz
done;
```
今さら聞けないフロントエンドタスクランナー

初Qiitaでございます。ドキドキ。

フロントエンドエンジニアになったので、うわさに聞くタスクランナーなるものに入門しようと色々検討しております。

調べている感じでは以下の二強なようなので、今更感が漂う中ご紹介したいと思います。

#Grunt
![Grunt](https://qiita-image-store.s3.amazonaws.com/0/56883/5ccdb0ab-c623-3928-181c-ff4aece5a387.png)

定番なのがGrunt。フロントエンドでのタスクランナーといえばコレが一番有名なようですね。
Sassのコンパイル、CSS、JavaScriptの結合、圧縮など、様々なことを自動化できます。

Grunt本体とGruntをターミナルで操作できるgrunt_cliは別なので注意が必要です。

設定ファイルは以下のように定義します。

```js
module.exports = function(grunt) {
  //Gruntの設定
  grunt.initConfig({
    pkg: grunt.file.readJSON('package.json')
  });
  //defaultタスクの定義
  grunt.registerTask('default', 'Log some stuff.', function() {
    //ログメッセージの出力
    grunt.log.write('Logging some stuff...').ok();
  });
};
```

Grunt自身はただ設定ファイルに記述されているタスクを粛々と実行するためのものですので、実際にタスクランナーとして利用するにはプラグインを使うのが便利です。

##主なプラグイン
[grunt-contrib-coffee](https://github.com/gruntjs/grunt-contrib-coffee)
CoffeeScriptをコンパイル

[grunt-contrib-compass](https://github.com/gruntjs/grunt-contrib-compass)
CompassでSassコンパイル

[grunt-contrib-concat](https://github.com/gruntjs/grunt-contrib-concat)
複数ファイルを結合

などなど。使用しているaltJSやCSSメタ言語に合わせてプラグインを選べます。

一覧は[こちら](http://gruntjs.com/plugins)から。

#gulp.js
![gulp](https://qiita-image-store.s3.amazonaws.com/0/56883/073c5efd-96af-0d72-09e1-2beb2102f944.png)

もうひとつのフロントエンドタスクランナーとして注目されているのがgulp.jsです。
Gruntと比較すると、設定ファイルの記述がシンプルで、かつ動作が早いと言われています。

設定ファイルは以下のように定義します。

```js
gulp.task('coffee', function(){
  return gulp.src('src/*.coffee') // srcフォルダからファイルを読む
    .pipe(coffee()) // 1. CoffeeScriptをコンパイル
    .pipe(concat()) // 2. 複数ファイルをひとつに結合
    .pipe(uglify()) // 3. JavaScriptをミニファイ(uglify)
    .pipe(gulp.dest('dist/')); // distフォルダに保存
});
```

このようにタスクを一つ一つ記述して、レシピを作成していきます。

##主なプラグイン
プラグインに関しては、後発ということもありGruntより数は少ないですが、知名度の向上に比例して充実してきているようです。

[gulp-sass](https://www.npmjs.org/package/gulp-sass)
Sassのコンパイル。常に圧縮されて出力されるので使い勝手が悪そう。

[gulp-ruby-sass](https://www.npmjs.org/package/gulp-ruby-sass)
同じくSassのコンパイルですが、こちらはRubyを使います。細かい設定が可能。

[gulp-csscomb](https://www.npmjs.org/package/gulp-csscomb)
CSSの整形。コーディング規約が決まっている際はその設定をそのまま反映してあげるとよさげです。

一覧は[こちら](http://gulpjs.com/plugins/)から。


#どっちがいいの？
Grunt、gulpともにカスタマイズ性が高く、とても使い勝手がいいと感じました。まぁ今までタスクランナーを使ったことがないのもありますが。。。
反映したい規約や運用に合わせたプラグインがあるかないか、既存のデプロイ環境に無理なく導入可能かどうかが判断基準になるかと思います。
気に入ったプラグインがなければ自作してみるのもアリですね！

#自動化の意味
フリーランスから新しいチームにジョインして、一番感じたのが既存のコードに対しての一貫性を保ったコーディングの難しさです。
チームにジョインして日が浅いエンジニアにとって、規約を確認しながらのコーディングは、必要なことですが負担が大きい物になります。
また、コードの可読性が保たれていなければ更に負担は大きくなります。

そこで、CSSメタ言語やaltJSなどを使い、シンプルな記述でコードリーディングの負担を軽減し、一貫性をタスクランナーで担保するというのが理想的なのではと思います。

[プログラマーよ怠惰であれ。](http://engineer.typemag.jp/article/qiitahackers)

自動化できるものはなるべく自動化して、日々の開発ライフを充実したものにしたいと思います。
TravisCIで環境変数を使いたい場合


## 通常の環境変数

TravisCIで以下のような環境変数を使いたい場合は、`.travis.yml`に`env`として記述すれば良い。

```bash
$ export TEST_HOGE='hogehoge'
```

```.travics.yml
env:
  global:
    TEST_HOGE='hogehoge'
```

## 暗号化した環境変数

DB接続情報やAPIキーなど暗号化したい環境変数がある場合はtravisコマンドで暗号化したものを`.travics.yml`に設定すれば良い。

travisコマンドはgemでインストールできる。

```bash
$ gem install travis
```


例えば、以下のようなAPIキーを環境変数で使いたい場合

```bash
$ export API_KEY=hogehoge_api_key
```

travisコマンドで暗号化する。

```bash
$ travis encrypt -r shu1/my_repository API_KEY=hogehoge_api_key
Please add the following to your .travis.yml file:

  secure: "jDyFo5FIQi3orZeug2Gxg6Fq0EHG+JzfvB/5W9Y5WGT97azmD/Iuy3W4M6Fx2By4sqVLJ02QSjqSlQHidtBrLTY1lcsuJY3p5/I8zlPO/m4S66XxAGXyPl82PTGtFgxKu4vtNSumCKwVNq5GeBSFDbsPzaUaigMgeZDaFcfXf20="

Pro Tip: You can add it automatically by running with --add.
```

`-r`オプションで リポジトリを指定する。
暗号化したものを`.travis.yml`に入れる。

```.travics.yml
env:
  global:
    - secure: jDyFo5FIQi3orZeug2Gxg6Fq0EHG+JzfvB/5W9Y5WGT97azmD/Iuy3W4M6Fx2By4sqVLJ02QSjqSlQHidtBrLTY1lcsuJY3p5/I8zlPO/m4S66XxAGXyPl82PTGtFgxKu4vtNSumCKwVNq5GeBSFDbsPzaUaigMgeZDaFcfXf20=
```

## 参考URL

* [Travis CI: Environment Variables](http://docs.travis-ci.com/user/environment-variables/)
注文検索API をPHPで動かしたいのですがヘルプお願いします・・・

注文検索APIを利用し注文情報をとりたいのですが、いろんなサンプルを参考に見よう見まねで
なんとかエラーはでなくなったのですがリクエストの結果が何もレスポンスされずどうしたものかと問い合わせてみました。
Windows環境でPHPを動かしています。
こんな感じでバッチファイルから実行しています。
c:> php sample.php

テスト環境でのアプリケーションIDは取得済みでそれを設定しています。

初歩的なところでわかってないかもしれません。ご教示いただけると大変助かります。

デベロッパーネットワーク様よろしくお願い致します。

こちらがソースです。

```php
<?php

$url = "https://test.circus.shopping.yahooapis.jp/ShoppingWebService/V1/orderList";
$appid = '取得したテスト用アプリケーションIDを設定';

$xml =<<<XML
<Req>
<SellerId>ストアーアカウントを設定</SellerId>
<Search>
<Field>OrderId</Field>
<Condition>
<OrderTimeFrom>20141201000000</OrderTimeFrom>
</Condition>
</Search>
</Req>
XML;

$ch = curl_init($url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_USERAGENT, "Yahoo AppID: $appid");
curl_setopt($ch, CURLOPT_HTTPHEADER, ```array('Content-Type: application/xml'));
curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);

$result = curl_exec($ch);
curl_close($ch);
echo $result;

?>
```
atom-shellを雑に使って任意のnodeスクリプトが実行可能なアプリケーションとして配布する


この記事は [Node.js Advent Calendar 2014 - Qiita](http://qiita.com/advent-calendar/2014/nodejs "Node.js Advent Calendar 2014 - Qiita") の5日目です。

atom-shellを使って、nodeつかった「アプリケーション」 -- そう、そのブラウザとかと同じような実行環境ですよ -- で配布する方法を紹介します。


今日紹介する方法は、チーム内でエンジニアじゃない人に渡してボタン押して実行してもらう、みたいなのを意図してます。

使えればいいという記事であって、この手続きで作ったものをプロダクションで配布したりとかはしないでください。



## 1. AtomShellをダウンロードして作業ディレクトリを作る

Resources/app以下にディレクトリを作ってそこで作業します。

ダウンロードはここから最新のやつを https://github.com/atom/atom-shell/releases


```shell
$ mkdir -p ~/Downloads/Atom.app/Contents/Resources/app
$ cd ~/Downloads/Atom.app/Contents/Resources/app
$ npm init
```

Macだと `Atom.app/Contents/Resources/app` ですが、Windowsだと `Atom/resources/app` になります。


## 2. AtomShell用のおまじないをする

`$ npm init` で雑にpackage.json生成

package.jsonのmainで main.js を指定。

次にAtomShellを起動させるための main.jsを書く。最小構成でこんな感じ。

```js
var app = require('app');
var BrowserWindow = require('browser-window');
app.on('ready', function() {
  var mainWindow = new BrowserWindow({width: 800, height: 600});
  mainWindow.loadUrl('file://' + __dirname + '/index.html');
});
```

おまじないと思ってもらって大丈夫。ここはまだnode領域です。これはウィンドウサーバーみたいなもんです。


ここで同ディレクトリに 空のindex.htmlを作ってAtom.appを実行してみてください。起動出来ましたか？

こんなディレクトリ構成になってるはずです。

```
app/
  - package.json
  - main.js
  - index.html
```

確認したら Cmd+Q で終了してください


## 3. index.html でやりたいことを書く

この生成されたウィンドウ、npmのモジュールならなんでも呼べます。一部例外ありますが、まあ動きます。

たとえばnpmからexpressいれて実行してみます。

package.jsonのあるとこでいつものやつをうちます

```
npm install express
```

じゃあこれをウィンドウ側から読んでみましょう

```
<html>
<head>
<script>
var express = require('express');
function startServer(){
  var app = express.createServer();
  app.get('/', function(req, res){
    res.send('Hello World');
  });
  app.listen(3000);
}

</script>
</head>
<body>

<button onClick='startServer'>Start Server!</button>

</body>
</html>
```

ブラウザの中からexpressでサーバーを起動しています。主従関係が逆転したこの背徳感、堪らないですね。

この中から外部スクリプトを呼びたい場合、scriptタグで読んでもいいですが、ローカルパスへのrequireでも呼べます。つまりはなんでもアリです。


node-webkitと違って、細かいコンテキストポリシーありません。


## 注意点

ネイティブモジュールに依存する場合は、そのプラットフォームでビルド(npm install)する必要があります。WindowsならWindows, MacならMac．


それさえ守れば逆に言えばなんでもできます。


詳しく原理知りたい人は [atom-shell/docs at master · atom/atom-shell](https://github.com/atom/atom-shell/tree/master/docs "atom-shell/docs at master · atom/atom-shell") 

を読んでください。


次は n0bisuke さんです
iOSの64bitビルドではまったこと


そもそも始まり。

突然、Push通知が受けられなくなった。。iOS7でもiOS8でも同じだしなあ。。5s,6でも同じだし。。

証明書の有効期限が切れたかなとおもって調べてみる。。が、期限はまだ切れてない。APNSのエラーコードを見てもらうと、8。

これは、invalid tokenエラーなので、端末の方にやってくるtokenを調べてみる。

didRegisterForRemoteNotificationsWithDeviceToken
長い。。。。

でbreak point張ってみてみると、なにやら0が並ぶ文字列になってる。あれあれ？provisioning profileが壊れたのかと思って作り直してみても変わらない。。

しかも、毎回違うtokenになってるし、、
ふとtokenの文字列を生成してるコードを見てみた。

	const unsigned long *tokenData = deviceToken.bytes;
	NSString *tokenString = [NSString  stringWithFormat:@"%08x%08x%08x%08x%08x%08x%08x%08x", ntohl(tokenData[0]), ntohl(tokenData[1]), ntohl(tokenData[2]), ntohl(tokenData[3]), ntohl(tokenData[4]), ntohl(tokenData[5]), ntohl(tokenData[6]), ntohl(tokenData[7])];

もう、かれこれ何年使ってるコードだろうか、、全く疑いもなかったんだけども、、たしか昨日ライブラリ一式が準備できたので64bitビルドにしてみたのだった。。。

そう、ntohl()だよね。
どうやら最近はdescriptionをつかって↓こうやるのが正解らしい。（え、いまさら？）

    NSString * tokenString = [deviceToken description];
    tokenString = [tokenString stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"<>"]];
    tokenString = [tokenString stringByReplacingOccurrencesOfString:@" " withString:@""];

すごい時間を無駄にしたけど、、いい勉強になった。無事にpushが来ることが確認できました。（もっと早く気付けよって感じだけども）

というわけで、似たようなコードを書いてる人が多いと思う。気をつけてください。

追記：
こんなドキュメントがAppleから配布されてました。

Cocoa Touch 64ビット移行ガイド
https://developer.apple.com/jp/documentation/CocoaTouch64BitGuide.pdf
PHP+nginxでGroonga管理ページを使う

Groongaのソースに入っている管理ページを使用

[Groonga管理ページ](https://github.com/groonga/groonga/tree/master/data/html/admin)

![001.png](https://qiita-image-store.s3.amazonaws.com/0/56661/fb59c4b1-c2a9-a271-a19b-d43f99f2bca4.png)

index.phpを追加します。

# GroongaのPHPバインディングをインストール

[PHPバインディング](http://qiita.com/Yujiro3/items/e5ea98139f3ee58d46f9)

# リクエスト受け取りスクリプトの作成

[index.php](https://gist.github.com/Yujiro3/c4965e11cbcb2c07d9e1)

````php
$gdb = new Groonga('localhost', 10043);

/* リクエストURLからコマンドクエリを整形 */
$param = '';
$query = $_SERVER['REQUEST_URI'];
$pos   = strrpos($query, '?');
if (false !== $pos) {
    $param = substr($query, $pos);
    $query = substr($query, 0, $pos);
}

/* クエリ送信 */
$start = microtime(true);
$response = $gdb->query($query . '.json'.$param, 1);
$end = microtime(true);

/* [HEADER, BODY]形式に整形 */
$result = array(
    array(
        0,
        microtime(true),
        $end - $start
    ),
    $response
);

/* コンテントタイプの送信 */
header("Content-Type: application/json; charset=utf-8");
header('X-Content-Type-Options: nosniff');

/* JSON出力 */
if (empty($_GET['callback'])){
    echo json_encode($result);
} else {
    echo $_GET['callback'].'('.json_encode($result).')';
}
````

**nginx設定**

````
server {
    server_name sheeps.me;

    root /usr/share/sheeps.me/www;
    index index.html index.php;

    location / {
        try_files $uri $uri/ /index.php?$args;
    }

    location ~ \.php$ {
       fastcgi_split_path_info ^(.+\.php)(/.+)$;
       # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini

       # With php5-fpm:
       fastcgi_pass unix:/var/run/php5-fpm.sock;
       fastcgi_index index.php;
       include fastcgi_params;
    }

    # serve static files directly
    location ~* ^.+.(jpg|jpeg|gif|css|png|js|ico|html|xml|bmp|swf|wmv)$ {
        root /usr/share/sheeps.me/www;
        access_log off;
        expires 30d;
    }

    location ~ /\.ht {
        deny  all;
    }
}
````

ファイルが存在しない場合にindex.phpへアクセスするように設定します。
/d/status などのURLを取得してコマンドへ整形します。

# キャプチャ

![002.png](https://qiita-image-store.s3.amazonaws.com/0/56661/ed8cfe83-677b-4d65-9634-80dd7fc7f043.png)

![003.png](https://qiita-image-store.s3.amazonaws.com/0/56661/f80ec49f-34b2-ff8c-f660-bab64e775634.png)

![004.png](https://qiita-image-store.s3.amazonaws.com/0/56661/bfa0d430-2d33-b8dd-801f-60e4666f0d80.png)

こんな感じで出来ました。
Gruntでcontrib-watchからeste-watchに乗り換える


今、開発ではGruntを使用してコンパイルなどを行っているのですが、
最近どうしてもwatchタスクが重くなっているため、噂のeste-watchにのりかえました

##インストール
```bash
$ npm install grunt-este-watch --save-dev
```

##今までのGruntfile
```Gruntfile.coffee
module.export = (grunt)->
  require("load-grunt-task") grunt
  
  grunt.initConfig
    coffee:
      app:
        options:
          bare: yes
        files: [
          expand: yes
          cwd: "app/scripts"
          src: "**/*.coffee"
          dist: "app/scripts"
          ext: ".js"
        ]
    watch:
      options:
        spawn: no
      coffee:
        files: ["app/scripts"]
        tasks: ["coffee"]

```

grunt-contrib-watchは監視対象を決め、その対象が変更されれば指定したタスクが実行される仕組みになっています

##書き直したGruntfile
```Gruntfile.coffee
...
  grunt.initConfig
    ...
    esteWatch:
      options:
        dirs: ["app/scripts/**"]
        livereload:
          enabled: no
      coffee: (file_path)->
        grunt.config ["coffee", "app", "files"], [
        	src: file_path
        	dest: file_path.replace ".coffee", ".js"
        ]
        return ["coffee"]
```

今回ではCoffeeScriptをコンパイルするついでに、コンパイルの対象を変更があったファイルのみに変更するようにしてみました

contrib-watchとは違い、ウォッチ対象のファイルパスを指定し、
拡張子ごとに関数を作り、その関数内で返したタスクが実行されます
それぞれのファイルパスが引数として渡されるので、
かなり柔軟なタスク構成をすることが出来ます

ちなみに、全てのファイルを指定する場合は、

```Gruntfile.cofee
...
  ...
    "*": (file_path)->
      # iroiro...
```

みたいな感じで書くことが出来ます

este-watchは待機時間中はCPU使用率がほぼゼロですし、何より軽いので非常に開発が捗ります
研究室でAnsible使ってる話

うどん大学 情報系 院1年の堀内です．

Ansibleを使い始めて4ヶ月目ですが，Advent Calendarに参加してみました!
研究室のサーバ管理や，研究の実験で使っているので，その話をしようと思います．

![20141007175919.png](https://qiita-image-store.s3.amazonaws.com/0/58742/e6afe778-17ae-e2c0-b567-b9cfdfd14aff.png)

## Ansibleとの出会い

8月末に参加したヤフーのインターンシップで，始めて触りました．
簡単なデプロイ演習で，使うツールは自由だったので，選びました．

他の構成管理ツールも考えてみたのですが…．

  - `Chef`: クライアントが必要，レシピが上から下に実行されない
  - `Fabric`: RubyistなのでPython分からない
  - `Capistrano`: 学習コストが高そう

## 研究室のサーバ管理で

同時期に，サーバ監視ツールの[Sensu](http://sensuapp.com/)も使い始めました．
研究室にはVM含め20台以上のサーバがあるので，`sensu-client`を流し込むのに使っています．

他にも，今まで手動でやっていたことも，Ansibleで自動化しています．

  - パッケージ(`apt`)の更新とサーバの再起動
  - 実験で必要な`Ruby`のコンパイル

PlaybookはGitHubに上げています．
『[hico-horiuchi/ansible-playbooks](https://github.com/hico-horiuchi/ansible-playbooks)』

## 研究の実験で

クラウド上のWebサーバをオートスケールするシステムの研究開発をしています．

### Vagrant

実験のために大量のVMを構築する必要があり，そこでAnsibleを使っています．

`Vagrant`を使っているので，以下の処理をさせています．
プロビジョニングにもAnsibleを使っています．

  1. `vagrant-libvirt`と`vagrant-mutate`のインストール
  2. `template`で`Vagrantfile`の生成と転送
  3. `kvm`用`box`の追加と`libvirt`への変換
  4. `vagrant up`と`vagrant provision`

PlaybookはGitHubに上げています．
『[ansible-playbooks/vagrant](https://github.com/hico-horiuchi/ansible-playbooks/tree/master/vagrant)』

### Apache Bench (ab)

システムのベンチマークをするのに[Apache Bench](http://httpd.apache.org/docs/current/programs/ab.html)を使っています．
複数のクライアントで，時間差で実行させるのに使っています．

  1. `hosts`でクライアント毎のパラメタを指定
  2. `template`で`ab`実行用`shellscript`の生成と転送
  3. `nohup`を付けて`shellscript`を実行

PlaybookはGitHubに上げています．
『[ansible-apache-bench/hico-horiuchi](https://github.com/hico-horiuchi/ansible-apache-bench)』

## まとめ

インターンシップで触って，研究室で使うようになった話でした．
`ssh`だけで動作し，モジュールが豊富なのが良いですね．

今後は，`role`も使って，もっと便利にできればと思います．
(Playbookのレビュー，プルリクもお待ちしてます!)

ちなみに，Railsのデプロイにも使っていたりします．
『[AnsibleでRailsをデプロイ - 12FF5B8](http://hico-horiuchi.hateblo.jp/entry/20141007/1412672371)』

## 参考

  - [Ansible忘備録 -起動したはずのプロセスが死んでいる- - Qiita](http://qiita.com/gacha-ru/items/035ee8ad754394b5c83f)
Atomエディタで改行コードを含めて置換する方法

改行を含めて置換するには、検索viewを正規表現モードにして\nを入れることで可能になります。

例えば以下の様な行があるとします。

```
{hoge: 1, fuga: 2, fuba: 3}
```

この行をカンマの後に改行を入れたい場合の手順は以下になります。


1. Cmd+Fで検索Viewを表示
![untitled_-__Users_hakutoitoi__ghq_github_com_spacemarket_spmkt_web_-_Atom_と_Atom_Advent_Calendar_2014_-_Qiita_と_1__screen__ruby_.png](https://qiita-image-store.s3.amazonaws.com/0/14435/877ba2ce-eb4d-5411-88d6-2571bdc48144.png)


2. Cmd+Option+/を押して正規表現モードを有効にする
![untitled_-__Users_hakutoitoi__ghq_github_com_spacemarket_spmkt_web_-_Atom.png](https://qiita-image-store.s3.amazonaws.com/0/14435/58a479dc-b7b5-eb45-ebe3-8dac5ff44220.png)


3. 置換対象文字列に,を入力
![untitled_-__Users_hakutoitoi__ghq_github_com_spacemarket_spmkt_web_-_Atom_と_Atom_Advent_Calendar_2014_-_Qiita.png](https://qiita-image-store.s3.amazonaws.com/0/14435/f4754128-444b-4a6c-e390-0da3a29ecb9f.png)


4. 置換後文字列に,\nを入力する
![untitled_-__Users_hakutoitoi__ghq_github_com_spacemarket_spmkt_web_-_Atom_と_Atom_Advent_Calendar_2014_-_Qiita 2.png](https://qiita-image-store.s3.amazonaws.com/0/14435/4244b73c-bdea-e53c-c530-9ae5bd6aebb1.png)


5. Replace NextまたはReplace Allボタンを押すと改行が入ります。

```
{hoge: 1,
 fuga: 2,
 fuba: 3}
```

※正規表現モードにしないと\nが普通に入力されてしまいます。
UIColorと16進数の相性をよくするExtension

追記: カラースペースがRGB以外であるとき、hexString･RGBaがnilを返すように変更
## 用法
a. 16進数からUIColorをつくる

```
// Intで渡すときは 0x をつける
let x = UIColor(hex: 0xC1E4E9, alpha: 1)

// Stringで渡すときは # を付けても付けなくてもよい
let y = UIColor(hexString: "#c1e4e9", alpha: 1)
```
b. UIColorから16進数を受け取る (CGColorでも可)

```
// String
x.hexString
```
c. UIColorからRGBaを受け取る (CGColorでも可)

```
// (red: Int, green: Int, blue: Int, alpha: CGFloat)
x.RGBa
```

## 本体
```
import UIKit

extension UIColor {
    convenience init(hex: Int, alpha: CGFloat) {
        let r = CGFloat((hex & 0xFF0000) >> 16) / 255.0
        let g = CGFloat((hex & 0x00FF00) >> 8) / 255.0
        let b = CGFloat(hex & 0x0000FF) / 255.0
        self.init(red: r, green: g, blue: b, alpha: alpha)
    }
    convenience init(hexString str: String, alpha: CGFloat) {
        let range = NSMakeRange(0, countElements(str))
        let hex = (str as NSString).stringByReplacingOccurrencesOfString("[^0-9a-fA-F]", withString: "", options: NSStringCompareOptions.RegularExpressionSearch, range: range)
        var color: UInt32 = 0
        NSScanner(string: hex).scanHexInt(&color)
        self.init(hex: Int(color), alpha: alpha)
    }
    var hexString: String? {
        return self.CGColor.hexString
    }
    var RGBa: (red: Int, green: Int, blue: Int, alpha: CGFloat)? {
        return self.CGColor.RGBa
    }
}

extension CGColor {
    var hexString: String? {
        if let x = self.RGBa {
            let hex = x.red * 0x10000 + x.green * 0x100 + x.blue
            return NSString(format:"%06x", hex) as String
        } else {
            return nil
        }
    }
    var RGBa: (red: Int, green: Int, blue: Int, alpha: CGFloat)? {
        let colorSpace = CGColorGetColorSpace(self)
        let colorSpaceModel = CGColorSpaceGetModel(colorSpace)
        if colorSpaceModel.value == 1 {
            let x = CGColorGetComponents(self)
            let r: Int = Int(x[0] * 255.0)
            let g: Int = Int(x[1] * 255.0)
            let b: Int = Int(x[2] * 255.0)
            let a: CGFloat = x[3]
            return (r, g, b, a)
        } else {
            return nil
        }
    }
}
```

## 動機
### init
　**`UIColor(red: 193, green: 228, blue: 233, alpha: 1)`と書けない腹いせ**に作りました (実際は255.0で割る)。
　どうやら誰しも同じ発想に至るらしく、UIColorとHexのためのエクステンションは既にQiitaにも色々あるのですが、イニシャライザーの形式はなさそうだったので勉強がてら書きました。
　StringとIntどちらも引数にできるようにした理由は特にありません。
### hexString
　printlnを使ってUIColorを出力すると`UIDeviceRGBColorSpace 0.756863 0.894118 0.913725 1`などと表示されるのですが、残念ながら全く分かりません。これがもし`c1e4e9`なら一瞬で検索して色が分かるのに… と思ったので作りました。
　`backgroundColor`とか`barTintColor`とか`tintColor`とか、どこの色なのかよく分からないものについて力技で調べるのに使えるかもしれません。
### RGBa
　これは作る必要もなかったのですが、標準で用意されている取得方法が

```
x.getRed(<#red: UnsafeMutablePointer<CGFloat>#>, 
    green: <#UnsafeMutablePointer<CGFloat>#>, 
    blue: <#UnsafeMutablePointer<CGFloat>#>, 
    alpha: <#UnsafeMutablePointer<CGFloat>#>)
```

　という**いかにも使いたくない感じ**であるのを見つけたので、ついでに付けました。
　名前付きのタプルにしたので、気楽に使えるのではないかと思います。なおRGBについてはInt型です。
Doxygenで生成するドキュメントを多言語化するには


# 方法

* `\~{言語 ID}` に続けてコメントを書く.
* `doxygen` した時 `Doxyfile` の `OUTPUT_LANGUAGE` とマッチする `言語 ID` の箇所のみコメントが抽出される.
* `言語 ID` を指定せずに `\~ {コメント}` と書くと, `OUTPUT_LANGUAGE` の設定に依らず常に抽出されるコメントになる.

# 例

* 入力ファイル(ドキュメントの生成元)

```foo.hpp
/*!
 * @brief \~english A class doing something awsome.
 *        \~japanese 何かすごいことするクラス.
 *
 * @details \~english Use Foo like this:
 *          \~japanese Foo はこのように使う:
 *          \~ <pre>Foo fooObject;
 * fooObject.doSomething();</pre>
 *          \~english Introduced since version 1.2.3.
 *          \~japanese バージョン 1.2.3 から導入された.
 */
class Foo
{
/* 略 */
};
```

* `OUTPUT_LANGUAGE = Japanese` とした `Doxyfile` を使うと, 例えば次のようなドキュメントになる.
![japanese.png](https://qiita-image-store.s3.amazonaws.com/0/49610/3b286c00-bd47-e165-aeab-363b0930150c.png "japanese.png")


* `OUTPUT_LANGUAGE = English` とした `Doxyfile` を使うと, 例えば次のようなドキュメントになる.
![english.png](https://qiita-image-store.s3.amazonaws.com/0/49610/912ae823-72e7-cdb2-89ce-e6aedba92a50.png "english.png")


# 注意点

　Doxygen 1.8.8 以前のバージョンには, 言語 ID が `Japanese-en` のようにハイフン `-` を含んでいると `\~` による言語切替が無視されるという問題がある.
　この問題は Doxygen 1.8.9 以降では修正されている.
SoftLayer Object Storage のファイル操作を簡単に行う方法

このエントリは[2枚目 SoftLayer Advent Calendar 2014](http://qiita.com/advent-calendar/2014/softlayer2)の5日目のエントリです。

* * *

SoftLayer Object Storageとは、大容量のデータを格安で保存できるクラウドストレージです。管理ポータルから、Object Storageを操作することはできますが細かい操作を行うことができません。最も面倒な作業とは、Object Storageのアカウントや、コンテナ（フォルダのようなもの）を削除する時に、保存されているファイルの削除を１つずつ行う必要があるということです。

もちろんAPIを使えばいいのですが、簡単にObject Storageを使ってみたいという方にはつらいかと思います。そこで、SoftLayerのObject Storageに対応した、クライアントツールを紹介したいと思います。

## Object Storageを利用するための準備
1. まずはじめに、Object Storageを利用するには、Object Storageのアカウントを作成する必要があります。管理ポータルから[Storage] - [Object Storage]を選択して、[Order Object Storage]をクリックしてください。
2. 課金に対する注意が表示されますので、よくお読みの上[Continue]をクリックしてください。
Object Storage注文上の注意が表示されますので、よくお読みの上、チェックボックスにチェックを入れて、[Place Order]をクリックしてください。

以上で、Object Storageの注文は終了です。注文処理の経過は適宜メールによる通知が行われます。さらに、Object Storageにアクセスしてみます。

1. [Storage]→[Object Storage]を選択してください。
2. Object Storageをデプロイ出来るデータセンター一覧が表示されますので、お好みのデータセンターを選択してください。
3. Object Storageのポータルの[View Credentials]をクリックすることで、オブジェクトストレージへアクセスする為のユーザー名やパスワード、エンドポイントといった重要な情報を確認することができます。

## CloudBerry Explorer for OpenStack (Windows)
CloudBerry Explorer for OpenStackは、SoftLayerのObject StorageやOpenStackのSwiftに対してアクセスが可能なWindows向けのクライアントです。適切に設定を行うことで、非常に容易にこれらのObject Storage上のファイルに対する操作を行うことが出来ます。
1. まずは以下のWebサイトにて配布されているCloudBerry Labより、CloudBerry Explorer for OpenStackをダウンロードします。
http://www.cloudberrylab.com/free-openstack-storage-explorer.aspx 
2. 無償で利用できるFREEWARE版をダウンロードしてインストールして下さい。
インストールしたCloudBerry Explorerを起動すると以下の様な画面が表示されますので、Register Laterをクリックしてください。
3. 「ファイル」→「SoftLayer」を選択してください。すると、アカウント登録画面が出ますので、「追加」をクリックします。
4. SoftLayerのObject Storageへのアクセス情報を登録するウィンドウが開きますので、ここに必要な情報を記述していきます。
5. Display NameはCloudBerry Explorer上での識別用の名前、User name / API key / Autentication Serviceは、「View Credentials」で確認できる内容を記述します。

## Cyberduck (Mac)
CloudBerryと同じくSoftLayerのObject Storageにアクセスが可能なMac向けのクライアントです。下記のWebサイトからダウンロードして使用してください。
https://cyberduck.io/index.ja.html?l=ja

* * *
ご意見等あれば、[Facebook](http://facebook.com/kkitase) | [Twitter](http://twitter.com/kkitase) までお願いします。
WPFのコードビハインドでStyleを記述する

無駄にコードビハインドでStyleを記載したい場合は以下の様なコーディングできる（はず…）
※例はLineのStyleを記述

```csharp:hoge.cs
　　　　private Line GetXLine(int x, int yMax)
        {
            var lineStyle = new Style(typeof(Line));
            lineStyle.Setters.Add(new Setter(Line.StrokeThicknessProperty, 1.0));
            lineStyle.Setters.Add(new Setter(Line.StrokeProperty, new SolidColorBrush(Color.FromArgb(0, 119, 136, 153))));
            lineStyle.Setters.Add(new Setter(Line.SnapsToDevicePixelsProperty, true));

            return new Line()
            {
                X1 = x,
                Y1 = 0,
                X2 = x,
                Y2 = yMax,
                Style = lineStyle
            };
        }
```

グリッドの描画で使えそうなメソッド。
実際、こういう書き方を推奨しないのがWPFなのかもしれないけど
Paintクラスとかで切り出した場合に活用できるかなと。

（MVVMとか知ってればクラスに切り出しても関係ないのかな？…勉強が足りん）
BrowserSyncのコマンドラインモード



BrowserSyncはGulp経由せずコマンドラインで直接起動することもできます。
他に自動化したいタスクがまだない場合や、さくっとローカルサーバで確認したい場合など、`Gulpfile`書くのが面倒な時はコマンドラインで直接起動。

> [BrowserSync Command Line Usage](http://www.browsersync.io/docs/command-line/)


##前提
* node.jsのインストール
* BrowserSyncのインストール

> http://www.browsersync.io/#install


##起動

```bash
 browser-sync start --server --files="./**/*.html,./**/*.css,./**/*.js"
```

watchも自動で走るのでLiveReloadとしても勿論使えます。（`--files`にwatch対象を指定）

**_※対象ファイルが多すぎるとCPUを圧迫するので注意!_**

> [gulp watchでCPU使用率100超](http://qiita.com/moritam@github/items/)



phpなど動的なページの確認も`--proxy` オプションを使うことで可能です。

```bash
 browser-sync start --proxy "myproject.dev" --files "css/*.css"
```



これまでローカル環境での確認は

```bash
 python -m SimpleHTTPServer 8080
```

や、php使っているページなら

```bash
 php -S localhost:8080
```

を使っていましたが、`browser-sync`一本になりそう。
最近は apache で見る機会が減りました。（VirtualHost書くの面倒...）
WindowsのAtomでGroovyを実行する

簡単なスクリプトをGroovyで書いて、実行するのに、これまでGroovyConsoleを使ってたんだけど、Atomでも実行できたのでメモ。

## 必要なパッケージを入れる
* [Language Groovy](https://github.com/Jakehp/language-groovy)
* [Script](https://github.com/rgbkrk/atom-script)

これだけで、groovyにパスが通っていれば **Ctrl+Shift+b** するとGroovyを実行できる。でも、これだけだと標準出力が文字化けする。

## Windowsの設定を変更
以下を、Windowsのユーザー変数として環境変数に設定する。

* Groovyにパスを通す（通してなければ）
    * 自分の場合、GVMでインストールしてるので **C:\Users\hoge\.gvm\groovy\2.3.7\bin** をPathに追加
* JAVA_OPTSを設定して標準出力の文字化けを防ぐ
    * JAVA_OPTSに **-Dgroovy.source.encoding=UTF-8 -Dfile.encoding=UTF-8** を設定

## 注意
Cygwinから ``atom .`` で開くと、JAVA_HOMEがcygdrive以下になって動かなかったりする。
エクスプローラーからOpen with Atomしたり、Atomからフォルダを開く必要あり。

## 参考URL
* [groovyでスクリプトのエンコーディングを指定する - uehaj's blog](http://uehaj.hatenablog.com/entry/20090815/1250316330)
数字の3ケタごとに「,(カンマ)」を付ける【JavaScript】

「1000000円」を「1,000,000円」といった感じに、価格の表示などで3ケタごとに「,(カンマ)」付けたいことってよくありますよね。


3ケタごとにカンマを付けるのは若干ややこしいのですが、
便利な**toLocaleStringメソッド**がありました。

```

var num = 123456789
num.toLocaleString()

```

`num`は`123,456,789`となる

※SafariやOpera、古いブラウザは対応していないものもあるので注意してください。

**【参考】**
[JavaScriptの数値をカンマ区切りにする最も簡単な方法 | while(isプログラマ)](http://am-yu.net/2014/11/09/number_tolocalestring/ "JavaScriptの数値をカンマ区切りにする最も簡単な方法 | while(isプログラマ)")
Swift で文字がある範囲に収まっているか判定する

C で 'a' <= c && c <= 'z' みたいにするところを Swift ではどうするか。

Swift は文字リテラルが無いし、正規表現も直接扱えないので、CChar に変換して `0x61` と比較、みたいな遠回りなことをしていた。
stackoverflow に `IntervalType.contains()` を使う方法が紹介されていて、なるほどなーと思ったのでメモ。

```swift
if ("a"..."z").contains("a") {
   // do something
}
```

http://stackoverflow.com/questions/26105301
プロセスが読む可能性がある設定ファイルを">"で書き換えるのは良くない

たとえば設定を作るシェルスクリプトで

```bash:redirect.sh
#!/bin/sh
..snip...

gen-config > conf/app.conf
```

より

```bash:rename.sh
#!/bin/sh
..snip...

gen-config > conf/app.conf.tmp
mv conf/app.conf.tmp conf/app.conf
```

こう書く方がいいという話が社内のコードレビューで流れていたのでメモ。

### 某先生いわく

社内の某先生のお言葉を ~~パクる~~ 引用させていただくと

> 一般論として、プロセスが読む（可能性がある）設定ファイルを > で書き換えるのはよくありません。>はtruncateしてからwriteするので、writeの途中でプロセスがそのファイルを読むとおかしなことになるからです。（今回の場合はまずないと思いますが、一般論として）
> 
> なので、正規の設定ファイルと同じパーティションに仮の名前で生成して、rename(2) (mv) で置き換えるのがよいです。


### 確認してみた

`strace -f` で`open(2)`, `write(2)`, `rename(2)`を確認。

####  >の場合

```
open("./conf/app.conf", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 3
write(1, "config!\n", 8)                = 8
```

#### mv(rename)の場合

```
open("./conf/app.conf.tmp", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 3
write(1, "config!\n", 8)                = 8
[pid  9149] rename("./conf/app.conf.tmp", "./conf/app.conf") = 0
```
【メモ】IntelliJ IDEA 64bit版でメモリを増やして起動(Windows)

# 参考サイト
* [Selecting the JDK version the IDE will run under](https://intellij-support.jetbrains.com/entries/23455956-Selecting-the-JDK-version-the-IDE-will-run-under)
* [Configuring JVM options and platform properties](https://intellij-support.jetbrains.com/entries/23395793-Configuring-JVM-options-and-platform-properties)

# IntelliJ IDEA 64bit版で起動する

1. `idea64.exe`を起動する。実行ファイルの場所は、私の場合は`C:\Program Files (x86)\JetBrains\IntelliJ IDEA 14.0.1\bin`にありました。
2. 起動したら右下に表示されるメモリを確認する。最大メモリに`idea64.exe.vmoptions`の設定値が使われているはず。

私がWindows 7で起動する場合、64bit版を起動した状態でタスクバーのアイコンを右クリックして「タスクバーにこのプログラムを表示する」をクリックし、起動しやすいようにしておきます。

# 割当メモリを増やす

1. `idea64.exe.vmoptions`をバックアップする。コピーして適当に`idea64.exe.vmoptions.org`などに改名する。（orgにする決まりはないが、これはオリジナルという意味で使われるらしい）
2. `idea64.exe.vmoptions`を編集する。今回は試しに`-Xmx750m`を`-Xmx2048m`に変更してみました。
3. `idea64.exe`を起動する。起動したら右下に表示されるメモリを確認する。この場合は2048MになっていたらOK。

## 注意
割当メモリが多すぎるとガーベッジコレクタが扱うメモリが大きくなるため、ハングアップの原因になると記載されています。また少なすぎるとOutOfMemory exceptionが発生します。
30才未経験からのオブジェクト指向

よくわかんないからコレよんでた覚えがある

![head first design patern](http://www.oreilly.co.jp/books/images/picture_large4-87311-249-4.jpeg)
[Head Firstデザインパターン](http://www.amazon.co.jp/dp/4873112494)

![why object oriented](http://ecx.images-amazon.com/images/I/51RDV5TN36L.jpg)
[オブジェクト指向でなぜつくるのか](http://www.amazon.co.jp/dp/4822281957)
SwiftでUiWebViewを使ってアプリ内ローカルHTMLを表示する。


Webサイトを表示させるときにはUiWebViewを使うのは一般的だと思うのですが、アプリ内にHTMLファイルを設置して、それを参照するやり方が分からなかったので調べましたメモです。

## SwiftでWebViewを利用する
###Web上のページを表示させる場合

まずは普通にWebサイトを表示してみます。 targetURLにhttp://〜のurlを書きます。

```
//
//  ViewController.swift
//  sblig_gps
//
//  Created by 菅原　遼介 on 2014/12/04.
//  Copyright (c) 2014年 n0bisuke. All rights reserved.
//

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var uiwebview: UIWebView!
    var targetURL = "http://liginc.co.jp"
    
    override func viewDidLoad() {
        super.viewDidLoad()
        loadAddressURL()
        // Do any additional setup after loading the view, typically from a nib.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    
    func loadAddressURL() {
        let requestURL = NSURL(string: targetURL)
        let req = NSURLRequest(URL: requestURL)
        uiwebview.loadRequest(req)
    }


}

```

### ローカルhtmlファイルを参照する場合

アプリ内のViewController.swiftと同階層のindex.htmlを参照する場合

`NSBundle.mainBundle().pathForResource("index", ofType: "html");`

と書きます。

![](http://i.gyazo.com/b293261c80f021740cbd2fb860a57c4d.png)

```
//
//  ViewController.swift
//  sblig_gps
//
//  Created by 菅原　遼介 on 2014/12/04.
//  Copyright (c) 2014年 n0bisuke. All rights reserved.
//

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var uiwebview: UIWebView!
    var targetURL = NSBundle.mainBundle().pathForResource("index", ofType: "html");
    
    override func viewDidLoad() {
        super.viewDidLoad()
        loadAddressURL()
        // Do any additional setup after loading the view, typically from a nib.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    
    func loadAddressURL() {
        let requestURL = NSURL(string: targetURL!)
        let req = NSURLRequest(URL: requestURL)
        uiwebview.loadRequest(req)
    }


}


```
brewでcurl-ca-bundle入れようとすると怒られる

# brew install curl-ca-bundleでエラー
rubygemでパッケージインストールしようとしたら証明書が消えていると怒られたので再度brewのcurl-ca-bundleで入れようととしたらエラーが出た。

```lang:shell
% brew install curl-ca-bundle
Error: No available formula for curl-ca-bundle
Searching formulae...
Searching taps...
```
**どうやらbrewのパッケージから消えてしまったとのこと。**
>Remove curl-ca-bundle by jacknagel · Pull Request #28658 · Homebrew/homebrew : https://github.com/Homebrew/homebrew/pull/28658

# 解法
brewでopensslをインストールすると配備されるらしい。

```lang:shell
% sudo brew install openssl
Warning: openssl-1.0.1j already installed
```
既に入ってるので入れなおし。

```lang:shell
% sudo brew reinstall openssl
```
# あらゆる「モノ」との連携するIoT時代に向けて。iOS と AndroidのBluetooth LE対応状況を確認しておこう

by @mixiappwchr


IoTというワードが昨今飛び交っていますが、今後はスマホだけではなくあらゆるものを使ったサービスやプロダクトを考えていく時代に突入しています。
そのなかでBLEの役割は重要なものになっています。今後を見据えて、現状のiOS、Androidの対応状況を簡単にまとめました。現時点でそれぞれの対応状況は明確に現れています。

# ハード

* iOS 
   * iPhone4S およびiPad(3rd) 以降
* Android
   * 調査が大変なので順次書いていきます。。


# OS対応

* Central
	* iOS6
	* Android 4.3 (API Level 18)    

* Peripheral
    * iOS7
    * Android 5.0 (API Level 21) 

iOSはiOS7以降ならどちらもok。Androidはようやくlollipopでpelipheralになれるようになりました。
余談ですがAndroid Wearは4.4になるため,Peripheralに現状ではなれません。。


# ライブラリ、機能

* iOS 
  * CoreBluetooth
  * CoreLocation 
    * iBeaconでの検知
  * Multipeer Connectivity
  * GameKit
  * AirDrop
  * Handoff
  * HomeKit 
     * 家電もBLEが搭載されたものがどんどん出てくるでしょう。   
  * HealthKit
     * 直接ではないですが、BLE機器と連携するという意味で 
* Android
  * android.bluetooth
      * BLE以前のプロファイルも扱います
  * android.bluetooth.le	
      * BLE専用 API Level 21より使用可能
      
iOSはかなり前から取り組んでいるのでいろいろなフレームワークに使用されています。一方Androidはようやく、、と言った感じです。

どうでしょう？ここに来て今までのお互いの戦略から対応状況に明確な違いが出ているかと思います。

スマホでの勝負から、今後は様々なデバイスを絡めた連携が重要な世界への明確な状況にある中、両プラットフォームの差が、これからどれだけ影響してくるか楽しみです。

ひとついえるのはAndroidがんばって。。
baserJSで埋め込んだYouTubeをレスポンシブに対応させる


コーポレートサイトにちょうどいいJavaScriptライブラリ **baserJS** の解説記事です。

Webサイトと詳しいAPIリファレンスはこちら [baserJS Webサイト](http://baserproject.github.io/baserjs/)

## デモ

デモはこちは http://codepen.io/YusukeHirao/pen/dPGyMx

* * *

今回はちょっと裏ワザ的なやり方です。

## YouTubeを埋め込む

HTMLは[前々回](http://qiita.com/YusukeHirao/items/50f95d39f8d889026fc4)と同様に`data-id`、`data-width`、`data-height`を指定するだけです。

```html
<div class="youtube" data-id="rb0zOstIiyU" data-width="1920" data-height="1080"></div>
```

ここでの`data-width`と`data-height`は縦横比（アスペクト比）の基準の幅と高さになります。1920x1080であれば、16x9としても問題ありません。

## コンテナの幅まで広げる

**レスポンシブに対応** を銘打ってますが、ぶっちゃけ釣りみたいなもので、要するにただのフルード要素です。

コンテナの幅が 最大が1920pxでウィンドウの幅が1920px以下になると幅めいいっぱいになるとしましょう。

そしてコンテナの中に`bcYoutube`メソッドを使って自動生成されるiframe要素のスタイルを調整します。

```css
.youtube {
  overflow: hidden;
  width: 100%;
  max-width: 1920px;
}

.youtube iframe {
  width: 100%;
  height: auto;
}
```

しかしこの方法、通常では上手く行きません。

画像(img要素)は`height: auto`にすると、幅を基準に画像の元の縦横比から自動的に高さが決まりますが、iframe要素は特に縦横比をキープするような仕様にはなっていません。

## JS側でiframeの縦横比をキープさせる

```js
$('.youtube')
	.bcYoutube()
	.find('iframe')
		.bcKeepAspectRatio();
```

YouTube化した要素の中からjQueryの`find`メソッドでiframeを探して、そのままチェインで`bcKeepAspectRatio`メソッドを実行します。

ポイントは *iframe要素に対してbcKeepAspectRatioを使う* というところです。
グローバル変数を捕まえよう

LuaそしてCoronaでグローバル変数は色々な問題の原因となります。
そしてLuaの構成上でも、実はパフォーマンスにも良くはありません（とは言え普通のアプリで変数をグローバルにしたことでパフォーマンス悪影響は大したことない）。

他にグローバル変数の悪影響はこのCoronaブログの記事にも書いてあります：
　http://coronalabs.com/blog/2013/05/28/tutorial-goodbye-globals/


では今回の本題、グローバル変数を捕まる手法、に入りましょう。
自分はグローバル変数を極力使わない派ので、自分はいつもmain.luaの先頭にこのpatchを当てます。これをすれば誰かどこかでグローバル変数を使ったのはすぐ捕まえる！

```lua:patch.lua
local _KNOWN_GLOBALS = {
    _scrollview = true,
    imageSheet  = true,
    LuaLibStore = true,
    facebook    = true,
    socket      = true,
    store       = true,
    launchPad   = true,
    crypto      = true,
    lfs         = true,
    --など...
    --外部モジュールはたまにGlobalに変数を定義するので、一旦無視をしたい変数をこちらに追加
}
setmetatable(_G, {
    __index = function( t, k )
        if _KNOWN_GLOBALS[k] then
            return
        end    
        print("ERROR", debug.traceback("access of undefined global "..tostring(k), 2))
        _KNOWN_GLOBALS[k] = true
    end,
    __newindex = function( t, k, v )
        rawset(t, k, v)
        if _KNOWN_GLOBALS[k] then
            return
        end
        print("WARN", debug.traceback("creating new global "..tostring(k).."="..tostring(v), 2))
    end
})
```

自分はこのちょっとしたコードのおかげで何回か救われたことあるので是非使ってみてください！
【FileMaker】他DBのESS接続で気をつけること


さて、小さなシステムではFileMaker(FM)だけで済みますが、FM以外で作られたシステムに追加でFMシステムを作る場合、ESS接続が便利ですが、ここで注意することがあります。

それは、FM以外のシステムで使っているDBの変更です。

既存システムのエンジニアからきちんと連携できていれば開発前に解決できますが、開発が始まってから「変更しましたよー」なんていきなり振られたらこの上なくめんどくさいです。

例えば、MySQLで作られた既存システムで２DBを運用しているとします。
system1(テーブル：category,user)
system2(テーブル：customer)

![1205_1.png](https://qiita-image-store.s3.amazonaws.com/0/60538/86c2687f-ed2a-588b-c40f-9fc2054aeabb.png)

もし、連携不足でsystem1にあったuserをsystem2に入れられたとします。
つまり、以下のように変更された場合です。
system1(テーブル：category)
system2(テーブル：customer,user)

この場合、userテーブルは連結が取れなくなり、システム的に非常に困りますね。
リレーションの張り直しが発生します。
スクリプト等には問題ありませんが、たくさんのテーブルをESS接続している場合、その張り直し作業と確認作業が膨大になるのは目に見えています。

お客さん都合とはいえ、これで開発の手間が増えてしまうのは困るので、ぜひとも開発に入る前にFMから接続する際の特性（リレーション）を理解してもらう必要がありますね。

他システムと手をつなぐ便利なESS接続。
システムの世界が広がる便利なツールなだけに、最初が肝心です。

では、〆です。
![1205_9.png](https://qiita-image-store.s3.amazonaws.com/0/60538/1245942c-710b-ac1c-d509-9a08d69f0c7c.png)
バッチファイルからURLをブラウザで開く

プロジェクト毎に開発用サーバのポートが違ってたり、特定のパスを開かなくてはいけなかったり。面倒なので各プロジェクトにバッチを用意してみた。バッチファイルからブラウザをどうすれば開けるのか調べたのでメモ。

```bat
start "" rundll32 url.dll,FileProtocolHandler http://127.0.0.1:5000/
```
スマホアプリを作るならAzure Mobile Serviceで楽しちゃおう

スマホアプリを作る時に、認証周りやデータストア、プッシュ通知など、アプリの機能ではないが成り立つ為に必要なもろもろの機能があると思うが、MBaaSを利用すればすでにあるライブラリやWebAPIを呼び出すだけで、使えてしまう。

そのMBaaSのなかでも、Azure Mobile ServiceはVisual Studioを利用した開発の場合に、より生産性を高められるて思うのだ。

http://www.buildinsider.net/web/azuremobilesvc

Azure Mobile Serviceの中にロジックを埋め込む機能もあるらしく、.NETで書けるんですね。
となると、他のAzure Serviceとの連携も容易では？
クロスプラットフォーム開発で、試していきたい。

http://blog.shibayan.jp/entry/20140325/1395754369
Cordovaによるクロスプラットフォーム開発に興味あり

マイクロソフト社のエバンジェリストである物江さんの記事でVisual StudioからApache Cordovaによるクロスプラットフォーム開発が出来ることを知りました。

http://html5experts.jp/osamum_ms/7941/

Xamarinによるネイティヴアプリのクロスプラットフォーム開発だけでなく、CordovaでHTML5によるクロスプラットフォーム開発にも、手を出していきたいです。


こちらでも、紹介されていますね。

http://www.infoq.com/jp/news/2014/05/visual-studio-hybrid-mobile

端末固有の機能を使わない限りは、HTML5の方が再利用性は高いのかな？クロスプラットフォーム開発を実施する場合のセオリーが出来るまでは、両方の進化をウォッチしていく必要ありですね。