OmniAICreator/Qiita-1.07M huggingface dataset:
HomebridgeでBRAVIAの電源をSiriからコントロールする

自宅で使っているテレビ（SONY BRAVIA）は純正のスマートフォンアプリで電源のオン/オフやリモコン操作ができるのですが、使うたびにアプリを起動しないといけない点が不便に思っていました。

- [W700Cシリーズ \| 液晶テレビ BRAVIA ブラビア](http://www.sony.jp/bravia/products/KJ-W700C/)
- [Video & TV SideView（ビデオ＆テレビサイドビュー）オフィシャルサイト](http://info.tvsideview.sony.net/ja_jp/)

ちょうどおうちハック関係の記事を漁っていたところ、HomeKit互換ライブラリのHomebridgeにBRAVIA用のプラグイン（homebridge-sonybraviatv）を見つけたので、手持ちのMacBook Proでセットアップを試してみました。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">MacBook Proに最新のNode.jsを入れてアクセス権を設定して、npmでhomebridgeとhomebridge-sonybraviatvを入れてconfig.jsonを書いて、BRAVIAの電源をSiriからコントロールできるところまでは来た</p>&mdash; Kento Koumura (@milkmeta) <a href="https://twitter.com/milkmeta/status/810355145603158016">2016年12月18日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

## 環境

- SONY BRAVIA KJ-40W700C
- Apple MacBook Pro with Retina Display
  - macOS Sierra 10.12.2
  - Node.js 6.9.2（LTS）
- Apple iPhone 7 Plus
  - iOS 10.2

デバイスは有線/無線LANで同じネットワークに接続しておきます。

## BRAVIA側の準備

[ホーム]→[設定]→[通信設定]から設定画面を開き、以下の設定を行います。

- [ネットワーク設定]→[ネットワークの設定をする]→[高度な設定]で**固定IPアドレス**を設定
- [ネットワーク設定]→[設定と接続状態を確認する]→「**MACアドレス**」の値を確認
- [ホームネットワーク設定]→[リモートスタート] を **"入"**
- [ホームネットワーク設定]→[IPコントロール]→[認証] を **"Normal and Pre-Shared Key"**
- [ホームネットワーク設定]→[IPコントロール]→[Pre-Shared Key] に**事前共有鍵**を設定

homebridge-sonybraviatvはIPアドレスの自動取得に対応していないようなので、DHCP環境でIPアドレスが変わるのを避けるため固定IPアドレスを指定しています。
またMACアドレスはWake on LANの実行に必要なので併せて控えておきます。
（Android TV搭載機種は常時スタンバイのため、どちらも必要ないかもしれませんが…）

## macOS側の準備

最新版のNode.js/npmをインストール後、Homebridge本体とプラグインをインストールします。

- [GitHub \- nfarina/homebridge](https://github.com/nfarina/homebridge)
- [GitHub \- rwifall/homebridge\-sonybraviatv](https://github.com/rwifall/homebridge-sonybraviatv)

```bash
$ npm install -g homebridge homebridge-sonybraviatv
```

Homebridgeに同梱のサンプルファイル（`config-sample.json`）を参考に、設定ファイルを指定のパス（`/Users/XXXXX/.homebridge/config.json`など）に設置します。
（JSONファイルなのでコメントは削除が必要）

```json:config.json
{
    "bridge": {
        "name": "Apple MacBook Pro with Retina Display", // ブリッジ（Mac）のデフォルト名
        "username": "XX:XX:XX:XX:XX:XX", // ブリッジのMACアドレス
        "port": 51826, // ポート番号
        "pin": "XXX-XX-XXX" // HomeKitコード（PINコード）
    },

    "accessories": [
        {
            "accessory": "SonyBraviaTV", // 使用するプラグイン名
            "name": "SONY BRAVIA KJ-40W700C", // アクセサリ（BRAVIA）のデフォルト名
            "macaddress": "XX:XX:XX:XX:XX:XX", // BRAVIAのMACアドレス
            "ipaddress": "192.168.X.X", // BRAVIAのIPアドレス
            "presharedkey": "XXXXXXXX" // BRAVIAで設定した事前共有鍵
        }
    ]
}
```

最後にターミナルからHomebridgeを起動します。

```bash
$ homebridge
```

## iOSの設定

iOSに標準でインストールされている「ホーム」アプリを起動し、以下の設定を行います。

### ブリッジの設定

- [開始]→[アクセサリを追加]→ブリッジの名前を選択→[このまま追加]→[コードを手動で入力]→HomeKitコードを入力

ブリッジの追加画面が表示されるので、以下を設定し[次へ]

- 名前: デフォルトの名前または任意のブリッジ名
- 場所: デフォルトの部屋または任意の部屋名を選択/入力

BRAVIAの追加画面が表示されるので、以下を設定し[完了]

- 名前: 「テレビ」「ブラビア」など**日本語の**アクセサリ名
- 場所: BRAVIAを設置した部屋名を選択/入力

試した限りでは、「BRAVIA」など英語表記の名前だとSiriが認識してくれませんでした。

## 動作確認

iOSでホームアプリを起動し、BRAVIAの電源オン/オフのタイミングで「アクセサリ」欄のアイテムにオン/オフが反映されることを確認します。
またSiriを起動し、「（アクセサリ名）の電源オン」「（アクセサリ名）を消して」などのキーワードでBRAVIAの電源がオン/オフされることを確認します。
Swiftを始めから学んでみる。 Lesson 0

　DeveloperAppleのサイトでSwiftをどのように学べばいいのかをiBooksでダウンロードできたので、「Swift 3.0」を始めから勉強していく忘備録的なものをしれっと作っていこうと思います。（ライセンスに抵触してたら記事を削除します）

DeveloperApp　https://developer.apple.com/swift/resources/
から様々なガイドやリファレンスのダウンロードや参照を行えます。

　今回は「App Development with Swift (iBooks Store)」をクリックしてepubファイルを入手します。（iPadをお持ちであればそちらにダウンロードすると見やすいと思います）
<img width="1280" alt="スクリーンショット 2016-12-07 23.39.17.png" src="https://qiita-image-store.s3.amazonaws.com/0/136973/837c6c3f-2642-a39c-ee52-d6955d9ef633.png">

　このファイルの中にはIntroductionと21個のLessonそして最後に他のリソースへのリンクが収められています。（iBooks Storからダウンロードします）

<img width="1280" alt="スクリーンショット 2016-12-07 23.32.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/136973/c82d5873-5148-d1fa-506e-a9493a1cc5f6.png">

　最初の3ページほどはSwiftやプログラミングそのものの説明、どういった事を学んで欲しいかを書いてありました。
　4,5ページから本書の使い方と準備方法が書いてあります。

<img width="1280" alt="スクリーンショット 2016-12-07 23.33.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/136973/79aa5df3-14a6-d96b-6c7c-490bb1711cf1.png">

　私たちが学んでいく上でさらに二つのものが必要になります「Xcode」と「Project files」です。「Xcode」はSwiftの開発環境です。(青の破線で囲ったリンクからApp Storeのダウンロードページへ移動します)
　「Project files（App Development Curriculum）」(赤の破線で囲ったリンクからダウンロードできます)はこの本の中で学んでいく上でplaygroundの使い方などを実際に使いながら学んでいきます。


☆各Lessonの流れ

1. まず「App Development with Swift」を開きます。（iPadを推奨）

1. 各回ごとに何の分野を学ぶかの説明が書いてあります。（Lesson1は「playground」の使い方です）

1. 次にダウンロードしたプロジェクトファイルの「App Development　Curriculum」を開くように指示されます。（各回ごとに開くファイルを指示されます）
1. プロジェクトファイルの中身は説明文とコードが書かれており、コードは自分で変更可能で実際に書いたり変更したりしながら学べます。

1. 「App Development with Swift」に戻ると、Lessonに関連したもんだが数問出されるので回答し、身についた知識の確認を行います。

1. 最後に、Lessonの要約と「APP JOURNAL」という題で、私たちのアプリ開発への助言や問いかけが書かれてあります（私はこの部分を読むのが好きだったりします）。


　Swiftの言語説明だけでなく、プログラミングの技術や知識そのものも学べるので、初心者の私としては楽しい限りです。
　次回からは各Lessonの説明をしていく予定です。
C#で同じコントロールを使いまわす

# やりたいこと
- 複数のタブページなどで、同じコントロールを表示したい

# 結論
単にアクティブになる方へ Controls.Add するだけです。
おそらく、裏でうまいことしてくれているのだと思いますが、どのように処理しているかは気になるところですが、そこまではまだ調べていません。

# 背景
- TabControlでPageを2つ作成した
- それぞのPageにはSplitContainerを配置し左右のペインを用意
- それぞれのPageのSplitContainerの左ペインでは同じTreeViewを表示したい

# 実装

```csharp
private void tabControl1_SelectedIndexChanged(object sender, EventArgs e)
{
    switch (tabControl1.SelectedIndex)
    {
        case 1:
            splitContainer1.Panel1.Controls.Add(treeView1);
            break;
        case 2:
            splitContainer2.Panel1.Controls.Add(treeView1);
            break;
    }
}
```

# サンプル画面
![alt](https://cdn-ak.f.st-hatena.com/images/fotolife/r/rrryutaro/20161220/20161220210822.png)![alt](https://cdn-ak.f.st-hatena.com/images/fotolife/r/rrryutaro/20161220/20161220210828.png)

# 元となっている記事
- （はてなブログ）[C#で同じコントロールを使いまわす](http://rrryutaro.hatenablog.com/entry/2016/12/20/211142)

以上
【FileMaker】意外と敷居が高いらしい - スクリプトトリガ - OnObjectAVPlayerChange

はい、今日は、[AdventCalendar 2016 FileMaker Tips](https://qiita.com/advent-calendar/2016/filemaker-tips/) 12/22の記事です。

今日は、スクリプトトリガの[OnObjectAVPlayerChange](https://www.filemaker.com/help/14/fmp/ja/html/script_trigg.36.9.html#432737)です。

まずは、どういう動きか、↓でどうぞ。
（音が出ます）
https://youtu.be/2ji_kVj8BqU

OnObjectAVPlayerChangeは、FileMaker Goで動作します。
そして、FileMaker Pro 14以降の機能なので、13ではFileMaker Goでも動きません。
FileMaker Pro 13をお使いの方、ごめんなさい。

今回作ったサンプルでは、音声が再生されている最中に表示する画像とテキスト、音声が再生されていない時（停止した時）に表示する画像とテキストの切り替えをする際、OnObjectAVPlayerChangeを使っています。

表示領域は、グローバルフィールドに設定し、各レコードで登録された画像とテキストを表示しています。
![スクリーンショット 2016-12-22 9.52.17.png](https://qiita-image-store.s3.amazonaws.com/0/60538/aeaca589-e946-f623-a507-fcd2e2464eee.png)

再生中は、こんな画像とテキストを表示。
![写真 2016-12-22 9 57 01.png](https://qiita-image-store.s3.amazonaws.com/0/60538/dc56c2ce-1073-24a7-275d-928d0def16c4.png)


再生が終わったら、こんな画像とテキストに。
![写真 2016-12-22 9 56 54.png](https://qiita-image-store.s3.amazonaws.com/0/60538/b63c8fe7-79ec-d4c1-550d-e10c185bba3e.png)

仕掛けは、オーディオファイルを格納しているオブジェクトフィールドに、スクリプトトリガでOnObjectAVPlayerChangeを仕込むだけです。
![スクリーンショット 2016-12-22 9.55.19.png](https://qiita-image-store.s3.amazonaws.com/0/60538/488bb934-18e0-68fd-e826-2d601411dd9e.png)

オーディオのイベントを拾うのは、[GetAVPlayerAttribute ( "playbackState" )](https://www.filemaker.com/help/15/fmp/ja/index.html#page/FMP_Help%2Fgetavplayerattribute.html%23) 関数です。
この関数は、「論理関数」カテゴリなので、「Getだから、取得関数、、、」といって探すと、ありませんよー。

GetAVPlayerAttributeの属性は、playbackStateの他にも色々あるので、オブジェクトの用途によって使い分けてみてください。

では、明日はイブイブですね！
パパママはサンタさんとの打ち合わせが済んでいますか？
AdventCalendarの小窓ももうすぐ開け終わります。
ちょっとさびしいですが、あと少し、お付き合いください。
【随時更新】ど忘れメモやQiitaをはじめてから知ったことや気付いたことなど

# はじめに
アホみたいな記事ですが。ど忘れして迷ったことや気付いたことなどのメモとして随時更新しています。

#QiitaのMarkdownでタイトルにC#がいれられない
後ろに何か文字があればいいだけだった。
つまり、C#だけ表示したければ、スペースを1文字入れるだけ。

# Qiitaにて
#### ■あれ？バッククォートってどうやって入力したっけ？
　<kbd>＠</kbd> キーに注目。<kbd><kbd>Shift</kbd> + <kbd>@</kbd></kbd> で ` ` ` が入力される。

#### ■あれ？フォロー中のタグの追加ってどうやるの？
　[1ページ目 - タグ一覧](http://qiita.com/tags) から。なんで、マイページのフォロー中のタグから飛ぶリンクなりがないのだろうか。

#### ■あれ？編集動作重くない？軽くならないの？
　プレビューを表示しているから。ペインの境界の上にある ![image](https://qiita-image-store.s3.amazonaws.com/0/156225/6e42862a-9d53-d503-6595-116c7bb206d7.png) をクリック。戻す場合は ![image](https://qiita-image-store.s3.amazonaws.com/0/156225/05d3dac0-aade-1507-11f1-9cae9f036b5c.png) をクリックする。

#### ■あれ？スライドモードってあるけどこれなに？
　本日（2016/12/22現在）丁度、次の記事がありました。
　[Qiitaの今のスライドモードはほぼ無価値だと思う件](http://qiita.com/kaitoy/items/60e723938ef6fc26f0e0)
　この記事内で、[スライドモードとは](http://qiita.com/Qiita/items/4ff5873776992f0511d6)へのリンクがあり、内容がわかりました。
　ちなみに[この記事](http://qiita.com/Qiita/items/4ff5873776992f0511d6)のタイトルが「スライドモード」となっていますが、なぜに「スライドモードとは」にしていないのだろう？
　「良い記事を書くには」のガイドラインとして「具体的で簡潔なタイトルをつける」と書いているじゃないですか。
　でも、[Qiita改善案 Advent Calendar 2016](http://qiita.com/advent-calendar/2016/qiita_improvement)といった取り組みもしているんですね。まだよく見ていませんが面白そうですね。

#### ■あれ？それにしても表示される文字ちょっと大きすぎない？こんな雑記極小サイズで表示させたいんだけど
　それらしい記事を見つけられず、仕方なくリストにしました(2017/12/10 書き方を変更)

#### ■あれ？ショートカットが <kbd><kbd>Ctrl</kbd> + <kbd>Insert</kbd></kbd> みたく綺麗に表示されている、これいいなどうするの？
　<kbd><kdb>F12</kbd></kbd>を押下してChrome DevToolsより対象のタグを見てみると```<kbd>```とかかかれている。なにこれと検索すると次の記事が見つかりました。
　[キーボードショートカットの正しいマークアップ](http://qiita.com/ygkn/items/0b485f6aedd15eadec33)

#### ■あれ？`<kdb><kdb>Shift</kbd> + <kdb>@</kbd></kbd>`ってしているのに表示がかわらないよ？
　`<kbd>`とするところを`<kdb>`としていたからですね。
　キー(k) ボー (b) ド (d) で`kbd`でしょうに、なぜに`kdb`としたのか・・・
　ともかくも、こうした初歩的ミスは意外と気付かないので、最初に立ち返って見直すと気付きが早いかと思います。

#### ■絵文字の利用について
　Markdownでのリンクの記法`[リンクテキスト](URL "タイトル")` での `リンクテキスト` ももちろんMarkdownが利く。だからリンクを絵文字（[:poop:](https://www.google.co.jp/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=poop)）で表現することもできる。
　当初これを知らずにいて次の記事を書いています。
　[`[:mag:]ってなに？`](http://qiita.com/rrryutaro/items/295421b11babcd41104f)
　[Markdown記法の理解が不十分で絵文字機能も理解していなかった](http://qiita.com/rrryutaro/items/e723fcfbf6dfc87c15fd)

#### ■あれ？またページ内リンクのやり方どうするんだっけ？
　html的にアンカーすればいいだけでしたね・・・

```
結果を先に読みたい方は[こちら](#result)へどうぞ
  :
# <a name="result">結果
```

#### ■貼り付けた画像の境界がわからないから枠を付けたいけど、どうするんだっけ？
　特に指定方法がなさそうなので、テーブル枠をつける事にしておく。

```
|![image.png](https://qiita-image-store.s3.amazonaws.com/xxx.png)|
|:--|
```
MacOS SierraにしたらSVNが使えなくなった



MacOS SierraにアップグレードしたらSVNが使えなくなっていたのでその解決法になります。

#【エラー内容】
`$ svn up`もしくは、SVNXでリポジトリを開こうとすると、下記のエラーが出る。

`xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun`


#【解決法】
１．ターミナルでxcode-selectのインストール
`$ xcode-select --install`

２．SVNで使っているディレクトリに移動してsvnを更新
`$ svn upgrade`


解決しました！！


#参考
http://www.benhepworth.com/blog/2016/09/26/fixing-or-installing-subversion-svn-after-upgrading-to-mac-os-sierra/
デザイナーがベンチャーって働くってどうなのよ！

この記事は[WHITEPLUS Advent Calendar](http://qiita.com/advent-calendar/2016/whiteplus "") 22日目になります。


## 自己紹介
- どうも！株式会社ホワイトプラス、デザイナーの @makkoruri  です。2回目の登場です。
- 今はLPやアプリのデザインなんかを担当しています。
- デザイナーとして働いてホワイトプラスは3社目です。
- 300人を超える会社にいたこともあれば、10人前後の会社で働いたこともあります。
- そんな今まで働いてきた会社を通してデザイナーとして思ったことをまとめてみました。

# デザイナーがベンチャーで働くってどうなのよ

![startup-photos.jpg (23.2 kB)](https://img.esa.io/uploads/production/attachments/2352/2016/12/20/11944/92774388-8f87-4ffb-a677-a1cbbb92e6d2.jpg)

- 300人以上いた会社をデカベンチャー、10人前後の時ジョインした会社をチビベンチャー呼ぶことにします。
- それぞれのメリットをまとめたいと思います。
- あくまでも私個人が感じたことなので参考程度に読んでいただければと思います(^o^)

## デカベンチャーで働くメリット

![pexels-photo-29675.jpg (35.4 kB)](https://img.esa.io/uploads/production/attachments/2352/2016/12/20/11944/0e941654-d264-452f-950a-2f5b62dd9a20.jpg)

初めて働いたのはデカベンチャーでした。
某六本木の有名なビルに入っているIT系企業に入社しました。ちゃんと社会人として働いたのはここが初めてです。右も左もわからないひよっこでした。

### 人が多い！仕事の規模もでかい！恵まれた環境の楽園！
- 優秀な人が多い！
  - 母数が多い分優秀な人に当たる確立が高い。教育されるなら優秀な人の方がいいに決まってる。
- 色々な職種のプロがいる！
  - キャラデザのプロ、UIデザインのプロ、背景デザインのプロ、3DCGのプロ、でかい会社は様々なカテゴリのプロがいる。デザインの知識を吸収するのに持って来いな環境だ。
- 環境を変えるのがラク！
    - 部署もチームもたくさんあるので転職しなくても異動すれば環境を変えることができる。社内でジョブチェンジすることも可能なのは貴重だ。（私はデザイナー続けるけどね！）
- 教育制度や福利厚生がしっかりしている！
    - 新卒研修や勉強会イベントなど豊富で充実している。無料で勉強できるなんて夢のようだ！もちろんセミナー参加費の負担や、書籍購入などの福利厚生もしっかりしている。
- 仕事の規模がでかい！
    - チビベンチャーでは経験できない予算のでかい仕事に携わることが出来る。その分やりがいもある。

 そんな恵まれた環境から私は10人前後のチビベンチャーへ転職したのであった。



## チビベンチャーで働くメリット
![pexels-photo.jpg (55.0 kB)](https://img.esa.io/uploads/production/attachments/2352/2016/12/20/11944/19d0b267-b771-42d2-b8cd-1f00aa3afc06.jpg)
デカベンチャーからチビベンチャーへ転職。
10人前後で入社した前職、50人前後で入社したホワイトプラス（在籍中）。この２つの会社を通して私が思ったメリットをまとめます。デカベンチャーからチビベンチャーに移った時は驚きの連続だったな〜

### 自分で道を切り拓け！これはもはやサバイバル！
- やりたきゃなんでも出来る！
  - 分業体制なんてほぼない。紙だろうがWebだろうがノベルティだろうが社内にいるデザイナーがやるしかない。やったことのないジャンルのデザインスキルを身につけられる。
   - デザイン以外の仕事をやる機会も必ずある。嫌でも幅広いスキルが身につくはずだ。
- 経営者や経営層と距離が近い！
  - デカベンチャーでは社長なんて見る日の方が少ないくらいだけど、チビベンチャーは距離が近い！社長や経営層と普通に話せるのはとても得ることが多い。デザインのレビューを社長にしてもらえるってすごくない？
- 責任ある仕事やポジションを任されやすい！
  - 人が少ないから当たり前だ。大きい企業ではなかなか任されないような責任を伴う仕事を任せてもらいやすい。デザイナーがPLやPOをやれることだってある。
- 自分の成果が見えやすい
    - チビベンチャーでは少人数のチームが基本。一人チームの時だってあるし、絶対歯車の一つになんてならせてくれない。自分のパフォーマンスが成果として直で見れるので成長も早いように思う。
- 経営目線が持てる
  - デカベンチャーでは比較的ぬくぬくと仕事ができるが、チビベンチャーはいつ潰れるかわからない。シビアな環境ゆえデザイナーでも売上など数値を気にするようになる。


## まとめ
…色々とチビベンチャーのメリットを書いたが、基本的にチビベンチャーでは能動的に動ける人じゃないと大変厳しいサバイバル環境だと思う。自分からぐいぐい行きたいタイプの人にはぴったり！

デカベンチャーでも出世するにはぐいぐい行かないと無理だけど、受動的でも生き延びることはそう難しくないと感じた。


結局大きい会社・小さい会社、どちらが良いとは一概には言えないですね(´・ω・`)

自分がより成長できそうな方を選んで行けばいいと思います。
極論どちらに行ったって自分次第ですからね(^o^)！！


迷えるデザイナーさんにとって少しでも参考になったら嬉しいです。

## 最後に



ではでは！
明日は弊社の破天荒新卒エンジニア（正式入社は来年） akaimo の「Travis CIでつくるiOSのCI環境（運用のコツ編）」です。

# ホワイトプラスではエンジニアを募集しています
ホワイトプラスでは、[俺/私はベンチャーで働きたいんだー！というエンジニアを募集](https://www.wantedly.com/projects/69257)しております。
Link > Arduino > 商用利用

Arduinoの商用利用の可能性に関連して調べた。

## easy laboさんの情報

Arduinoの商用利用を検討するときの資料として、以下が詳しい。
http://easylabo.com/2015/04/arduino/9065/

商用利用といっても以下の選択肢がありそう

- Arduino Microなどを大量購入する (数十枚～)
   - [追記2016/12/23] この場合のライセンス関係は要調査
- 設計データを元に製造する

「Arduino Core/Libraryの利用」節において以下とある。
> 組み込み機器の場合は、判断が少々難しくなりますので、法務部門を交えて対応を協議する必要があるでしょう。

「USB VID」節について、VID発行のことが記載されている。

製造する場合は以下の記事が参考になるだろう。
http://qiita.com/akichika/items/4c282c638b38681050d9

その他の点についても、色々調査を要する。

## Strawberry Linuxさんの情報

関連して見つけた情報
https://strawberry-linux.com/support/25005/1520984
> フラッシュ領域を全て消去し、お客様のプログラムを書き込む場合
...
> ブートローダーの部分は消去せず、ユーザ領域の部分にお客様のプログラムを書き込んだ場合

USBのベンダーID関連の注意事項が記載されている。

## Quoraの情報

以下ではArduinoが商用利用されない理由が記載されている。
[Why isn't Arduino used much in commercial products?](https://www.quora.com/Why-isnt-Arduino-used-much-in-commercial-products)
Arduinoはプロトタイプに向いている、かさばる、コストが高くなる、使用しない機能が多い、など意見がある。
Azure SQL DatabaseのバックアップをローカルのSQL Server Expressに復元する

#はじめに
Azure SQL Databaseのデータをローカルのテスト環境で検証したい場合の
バックアップ→ローカルに復元の手順が
検索しても良くわからなかったので記しておきます
SQL Server Management Studioを利用する方法です。
ローカル側はSQL Server 2014 Expressです。

##最新版のSQL Server Management Studioのインストール
Azureは日々進化していますのでAzure上の仕様変更があった場合、
それに対応したSSMSを使用する必要があります。
ですので、最新版のSSMSを利用が推奨されています。

##Azure SQL Databaseのバックアップ
バックアップと書くのが正しいのかわかりませんが、
Azure上のDBを取得します。

1.Management Studioで対象のAzure SQL Databaseのサーバーに接続
2.オブジェクトエクスプローラで取得したいDBを右クリック
3.タスク→データ層アプリケーションのエクスポートをクリック
4.エクスポート設定でローカルディスクに保存を選択し、保存場所を決める。
5.完了まで進むとローカルにバックアップ(.bacpac)が保存されます(時間がかかります)

##ローカルのSQL Serverに復元
1.Management Studioでローカルのサーバーに接続
2.オブジェクトエクスプローラーでローカルのサーバーを展開。
3.サーバー直下にある「データベース」フォルダを右クリック。
4.データー層アプリケーションのインポートを選択
5.インポートの設定でAzureから取得した.bacpacファイルを選択。

以上になります。

Management Studioは2016でAzureとの連携が強化されて
Azureを使う上で非常に強力なツールになりましたね。
GUIでポチポチやって出来るのはやっぱり楽だなぁと思いました。

###参考
http://stackoverflow.com/questions/7847189/azure-sql-database-bacpac-local-restore
PostCSSを少し理解してやっぱりまだSassを使おうと決めた理由

※以下学習途中の個人の見解です。

既存のSass環境をどうPostCSSに移すか試行錯誤を続けて、どうにもしっくりハマらなくて困ってた。
私はSassを使い続けるか、脱Sassをしてcssnext(標準仕様に沿った構文)+PostCSSにするかで考えてしまっていたけど、とどのつまり決めないといけなかったのは、CSS3で書くか、次世代CSS（ただし策定中)で書くかだった。


# 結論
SassでCSS3を書いていく、ただし依存度を減らす。

- 変数とextendはカスタムプロパティ・カスタムセレクタに置き変えられるように
- トリッキーなネストはしない
- mixinはそれ１つで完結させる
- `calc()`に慣れる
- `rem`をちゃんと使う（rootを`vw`にすれば`rem`で良い感じになるのかな）

# 理由
- mixin,functionをまだ使いたい
- パーシャルファイルを気楽に使いたい
- 2種類のコメントアウトが地味に便利←コレ8割

importとmixinはプラグイン使えば使えるけど書き方が冗長で嫌。
Sassにしろcssnextにしろ現在の標準のシンタックスじゃないので変換必須。
じゃあ手元の環境整ってる方で良いや、良いシンタックスハイライトがなくてモチベ上がらないし、と思った。


## でもやっぱりcssnextは魅力的
inisial valueは早く使いたい。


# とりあえず
この辺の人たちがどうするのか遠目に見とく。
https://twitter.com/mdo/status/591364406816079873?lang=ja
https://github.com/zurb/foundation-sites/issues/6196
https://github.com/zurb/foundation-sites/issues/6533
ベンチャー企業から大手企業に潜り込んだ新米エンジニアの話

社会人一年目のrenjikariです。

1年前、私はとあるベンチャーでバイトしていました。
何を考えていたかは当時の私しかわからないのですが、就活でとっても大きな(いわゆる日本的な)会社に内定を頂いてしまい、そのまま潜り込みました。
(公式サイトでみたら社員数400倍でした)

そんな私がベンチャーで働いていたときのこと、新卒で9ヶ月間働いてきて感じたことをつらつら書いていこうと思います。
あくまで私の主観onlyなので気に触ったらすいません。
あと会社から怒られたら消します:pray:

# 結論
初めに結論を書いておくと、大企業も悪くないねってことです

# 全体的な風土などの話
## ベンチャー
* 風通し半端ない
* できるなら誰でももてはやされるし頑張らない人にはそれなりの評価がくだる
* 回りがみんなエンジニア(気質)
* 何してもいい雰囲気
* 経営層、実質的なマネージメント層、エンジニア層がみんな同じ方向を向いている
* 服装は自由

## 大企業
* 風通しは馬鹿みたいに悪い
	* 違う部署の人は違う会社かってレベル
* できるなら誰でももてはやされるが、(お賃金的な)評価はあんまり関係ない
	* ただ手がちょっと動くと半端ない単純作業降ってくる
* 手が動く人、というか動かそうという人が少ない
	* 外注＆外注。エンジニアは上流の設計を外注してそれを下流に外注する人
		* ただ今はすごい内製化の波が来ているのでこれから変わりそうな雰囲気
	* ただ場所によってはすごいエンジニアもたくさんいる
	* (私の部署は)歌って踊れるエンジニア多い
* (私のいる部署は)意外に何してもいい雰囲気
	* 好きなこと勉強できる
	* macbook+EIZOモニタ+バランスボール+音楽聞いてコーディングできる
* 経営層とエンジニア層は割りと同じ方向を向いている
	* マネージメント層があっちゃこっちゃな方向を向いている
* 服装はかなり自由(襟付き＋ジーンズは禁止くらいのゆるい規制)
* 給料低い
	* これは会社によりますね

# 大企業のよいところわるいところ
## 大企業のよいところ
* 安定感
* お金をたくさんもっている
* 福利厚生
	* 昔より悪くなったらしいですがこれはほんとすごい

## 大企業のよくないところ
* バズワード(あるいは単に技術的な単語)に踊らされすぎ(DevOps,コンテナ,BlueGreen,CI/CD,アジャイル)
	* devopsはこのツールだ！このプロセスだ！と言い張る人たちがいる
		* wikipediaみちゃったんですかね
	* アジャイル開発やってます
		* コードレビューせずtestも書かないってそれアジャイルなんでしょうか?
	* 他にもたくさんありますが文脈を無視して書くと誤解されそうなのでやめます。
* 社内説明稼働が8割
	* なんでもできるけど何かをやるために説明や決済を通す稼働が異常に多い
	* まだ新人なのでフォローが多いけど先輩をみていると…
* セキュリティを意識しすぎて逆にセキュアでない案件
* すべての分野が究極的に属人化されている
	* あの決済はあの人しか通せないみたいな

# 私が働いているときの心情の話
## ベンチャー
* 全くの未経験だったということもあるかもしれませんが、周りの人がみんな化物みたいにすごい
* エンジニアとしての成長を考えて業務ができるように配慮されていた
	* 魚の釣り方、つまり勉強の仕方、質問の仕方をみっちり教えていただいた
* みんないい人ばかりだった
	* 先輩みんな大好き！という状態

## 大企業
* 受動的な手厚い保護はない
	* エンジニアをエンジニアとして育てようという気概を感じない
	* いわゆる総合職的な育成なのかも
	* 集合研修的なものはあるがエンジニアとして成長できるものではなかった
	* ただし、自分から手を上げさえすればどんな研修もお金出してくれるし、仕事でも自身の成長につながるようなものに携われる
	* 魚の釣り方を知っていればいくらでも好きなことのできる環境
* いい人もたくさんいるが…
	* 関わり合いになるとやばいのでは……という人もたくさんいる

## 結論
最後に念のためもう一度結論を書いておくと、大企業も悪くないねってことです(書かされているわけではないよ)
Re:ゼロから始めるエンジニア生活

[Stylez Advent Calendar 2016](http://qiita.com/advent-calendar/2016/stylez)の22日目です。
社内での勉強会の記事コピペでもいいから何か書いてと言われました。
書けそうな技術ネタはこの前個人的に書いてしまっていて、何書こうかちょー悩みましたがなんとか。

# はじめに
未経験のエンジニアとして生活していく中で、自分なりに気をつけていることについて書きます。
エンジニアに限らず、当たり前のことかもしれませんが、参考になれば幸いです。
自分の下に新人ついたりしたらこういうことも教えないとだめかなーっとも。

## 自己紹介
* 第二新卒として未経験で入社
* 前職は機械設計
* つい最近2年目に突入

もともと自分は機械工学部出身です。
CAD使ってモデリングしたり、ドローン作ったり、最初の飛行実験で暴走させたり、教室を破壊したりしていました。

新卒では某自動車関係のメーカーに入社しまして、みっちり1年半研修を受けて辞めました。
部署はメーカーの花形である設計に配属されたんですが、なにぶんド田舎だったので。
オタクを田舎に飛ばすなんて辞めてくれといっているようなもんです。
都会に住むにはITしかねーな！！！って思い、勢い余ってボーナス6ヶ月出る会社を蹴っ飛ばし、Stylezに入社しました。
かくして、ハードの設計からソフトの設計という異世界に転生し、再びエンジニアとして働き始めることになりました。

あっ、業務ではC#で開発しています。
プロジェクト入ってちゃんと書き始めて半年くらいです。
Javaもちょびっと。
入社後3ヶ月の研修でｺﾞﾘｺﾞﾘ使ったきり毎週の勉強会でしか使ってないですが、Silver取ったりがんばってます。


# 気をつけていること
話がそれてしまいましたが、エンジニアとして生活していく中で気をつけていることについて書いていきます。

## 質問の答え方
1. **質問の内容に正しく答える**
2. **結論から答える**

前の会社では相当口酸っぱく言われました。
上司から「これできる？」と聞かれたとき、上司はできるかできないのかが知りたいです。
「〜〜〜〜で、〜〜〜〜〜〜〜〜〜〜なので、できないです」ではなく、「できないです。というのも、〜〜〜だからです」ってな感じで答えるように気をつけています。
相手の質問の内容に正しく答えるには、相手が何を期待して質問しているのか理解して答えたいです。

## 定量的に
**曖昧な表現を避ける**
全体に対して何%くらいとか。
ちょっとだけ遅れる、ではなくて30分くらい遅れるとか、具体的にわかりやすい表現を心がけてます。

## コミュニケーション
近くにいる人には**面と向かって**話すようにしています。
画面見ながらだったり、動かしてみながらだったり話すほうがより円滑に話せますし、文字だけだとどうしても情報の齟齬がでてしまったりするので。

もちろん、エンジニアは話しかけられたくない時もありますから、事前にSlackで「時間空いたときにちょっと話したいです」みたいに一言声かけて、向こうからアクションを取ってもらえるようにワンクッション置いたりすることもいいかもしれません。

弊社はあちこちに小さな椅子が置いてあり、その辺にある椅子を持っていって話すこともよくあります。これ結構便利だなーって個人的に思ってます。

## 目的を考える
この仕事の目的は何か、この改修の目的は何か理解して取り組むようにしています。
コピー10部とっといて、と頼まれたとしても、ただ10部印刷するだけなのと、この書類は会議で使うために印刷するから、「ホッチキスで止めときましょうか」と言えるのは違うと思っています。
目的を理解しておけば、相手のために気を利かせるのもそう難しいことではなくなるはずです。

## 当事者意識
チーム内での問題を自分のことではないからいいや、ではなく、全部自分のことだと思って取り組むようにしたい（自分もよく抜けるので…。）

## 設計で品質を作り込む
ハードの世界では良い設計が良い品質を生みます。
作業者が作りやすい設計、歩留まりのいい設計、金型が作りやすい設計等、良い設計はかならず品質を向上させます。
ソフトの世界でもそうではないでしょうか。
実装しやすい作りやすい設計、テストのしやすい設計等々、設計で品質は作り込めると思っています。
なので、設計段階では色んなパターンを洗い出したり、組みやすい共通化しやすい様に入念に時間をかけるようにしています。（なかなかスケジュール的に厳しいですが）
後でお客さんに、やっぱりこれ出来ないです…ってなるのも嫌ですしね。

## 後工程はお客様
後の工程を「お客様」だと思って、仕事をするようにしています。
これはトヨタ生産方式の言葉です。
[トヨタ式人づくり～お客様のために何ができるかを考える](http://hrd.php.co.jp/gyoukai/cat198/post-531.php)

例えば、自分がテスターだったとして、こんなもん実装段階で潰せるだろ（#^ω^）みたいなバグだらけのものを渡されたら嫌ですよね。
コメントのない、ぐっちゃぐちゃなソース渡されたら嫌ですよね。
後の工程の人にはなるべく良品を引き渡せるよう、自分の仕事には責任を持ちたいです。

## アンテナを張る
エンジニアなるもの、情報収集をしないとすぐに取り残されてしまいます。
ちゃんと情報収集していないと、山崎エリイちゃんの無銭イベントって昨日あったの！？！？！？！ってなりかねません。

せやかてどこみりゃ情報落ちてるかわからへんし…。
↓
nesheep5さんがまとめてくださっています。
[エンジニアの情報収集法まとめ](http://qiita.com/nesheep5/items/e7196ba496e59bb2aa28)

自分は毎日通勤の時間と、朝来てからの10分くらいはネットサーフィンしてます。
最近はついったー見てたらだいたい情報回ってきますが、そこで気になったりしたことは逐一能動的に調べるようにはしています。

あとは、その仕入れた情報で仕事を取りにいったりとかできればいいんですが、なかなか難しいです。。。

# まとめ
自分の仕事は自分で保証できるように頑張って、コミュ力マシマシで。
@kxn4t印がついていればまあ良い物だろう、くらいに持っていきたい。
なんだかんだいって、エンジニアもしっかりコミュニケーション取るのが大事だと思っています。

えらそーなこと書いてますがまだまだペーペーなので、もっとオタクグッズたくさんたくさん買えるように頑張っていきたいです。
MakefileのドキュメンテーションツールをGoで書いた

# MakefileのドキュメンテーションツールをGoで書いた

この記事は [Go (その2) Advent Calendar 2016](http://qiita.com/advent-calendar/2016/go2) 21日目の記事です。

開発時のタスクランナーがわりにMakefileをよく使います。
`make build` したらビルドするとか `make fmt` したら `go fmt` するとか、 `make server` したらサーバを起動するとかです。
中には `make build target=linux` のようにオプションも渡したくなったりします。
しかしMakefileのタスクとその使い方をすぐに忘れてしまってMakefileの中を確認するということがよくあるので、
ドキュメントを表示してくれるようなコマンドをGoで書いてみました。

以下のように記述されたMakefileがあったとします。

```
.PHONY: command
command:
    @## param1=value1 param2=value2
    @#
    @# document 1
    @# document 2
    @# document 3

    echo "EXECUTE COMMANDS..."
```

unmakeを実行すると次のように表示されます。

```
$ unmake Makefile
* command param1=value1 param2=value2

      document 1
      document 2
      document 3
```

動作を解説します。

`makefilePath` はMakefileへのPATHです。
ファイルオープンし、中身を取得しています。

```
	fp, err := os.OpenFile(makefilePath, os.O_RDONLY, 0600)
	if err != nil {
		panic(err)
	}
	defer fp.Close()

	buf, err := ioutil.ReadAll(fp)
	if err != nil {
		panic("")
	}

```

実際にドキュメントの記述がある正規表現はこちらです。

```
	regx, err := regexp.Compile(`(?m:^([^._][a-zA-Z0-9_\-]*):(.*)\n(^\t\@\##.*\n)?(^\t\@\#\s*\n)?((^\t\@\#.*\n)*))`)
	if err != nil {
		panic("")
	}
```

見にくいですねえ。`(?m)` はマルチラインモードです。
今回の場合複数行にわたってコメントを書くことが多かったので
コメントで続く塊を取得するために指定しています。

上記の正規表現を探し出して、出力のために整形しています。

```
	for _, match := range regx.FindAllSubmatch(buf, -1) {
		cmdName := strings.TrimSpace(string(match[1]))
		paramLine := strings.TrimSpace(strings.Trim(string(match[3]), "\t@#"))
		usage := strings.Replace(string(match[5]), "\t@#", "     ", -1)
		fmt.Printf("* %s %s\n\n%s\n", cmdName, paramLine, usage)
	}
```

そんなに難しいことはしてないですね。
実は最初は同じ処理をPerlで実装していましたw

```
    open (my $fp, $_[0]) or die "$!";
    my $buf =  do { local $/; <$fp> };
    close $fp;

    while ($buf =~ /^([^._][a-zA-Z0-9_\-]*):(.*)\n(^\t\@\##.*\n)?(^\t\@\#\s*\n)?((^\t\@\#.*\n)*)/gm ) {
        my $cmd = $1;
        my $synopsis = $3 || "";
        my $msg = $5 || "";

        $cmd =~ s/\A\s*(.*?)\s*\z/$1/;
        $synopsis =~ s/@##//g;
        $synopsis =~ s/\A\s*(.*?)\s*\z/$1/;
        $msg =~ s/\t\@\#/     /g;
        printf("* %-20s\n\n%s\n\n", $cmd . " " . $synopsis, $msg);
    }
```

ただバイナリにコンパイルできるのが魅力的だったので実装し直しました。


Makefileのhelpには `$(MAKEFILE_LIST)` を渡すことで
includeされたMakefileも引数に渡すことができます。

```
.DEFAULT_GOAL_NAME := help

.PHONY: help
help:
	@# Display usage
	unmake $(MAKEFILE_LIST)
```

リポジトリは[こちら](https://github.com/TakesxiSximada/unmake)。
printf入門

この記事は [Oculus Rift Advent Calendar 2016](http://qiita.com/advent-calendar/2016/oculus-rift) 22日目の投稿でした。

C言語で文字を出してみよう！！

ソースコードの例

```c:goodbye.c
#include<stdio.h>

int main()
{
    printf("退職しました");
   
    // 退職の例
    exit(-1);
}
```


P.S. 私事ですが[退職](https://medium.com/@GOROman_1661/%E3%81%93%E3%81%AE%E8%A8%98%E4%BA%8B%E3%81%AF-oculus-rift-advent-calendar-2016-22%E6%97%A5%E7%9B%AE%E3%81%AE%E6%8A%95%E7%A8%BF%E3%81%A7%E3%81%99-12d1fa10dac2#.ntxtr3epe)しました。
技術英語 > I don't see any alternative. > "alternative" can indeed be uncountable

@ Star Trek Voyager > THE THAW

色々な議論をした結果、１つの方法しか残らなかった。

Chakotayが

> I don't see any alternative.

https://www.merriam-webster.com/dictionary/alternative

上記の例ではanyがついているが、alternativeは**複数形ではない**

フランス語との対訳であるが、以下にも複数形でない例がある。

http://www.linguee.fr/anglais-francais/traduction/i+don't+see+any+other+alternative.html

関連しそうなもの
http://forum.wordreference.com/threads/have-no-choice-alternative-but-to.1979505/
> Renaissance man
...
> Yes, the phrase "I don't have much alternative" is natural, idiomatic English. So it seems that in certain expressions, "alternative" **<font color=red>can indeed be uncountable</font>**.

<hr>
関連して思い出したのは

> We had no other option but to ...

http://www.linguee.fr/anglais-francais/traduction/no+other+option+but+to.html

こちらもoptionはuncountable。

意訳「...するより仕方がなかった」
Rails：ネストしたルーティングのパスヘルパーが長えよ

以下のようなネストしたルーティングを考える。

```rb:config/routes.rb
resources :publishers do
  resources :books
end
```

んで，例えば books の一覧ページに「修正」のリンクを置くのに，ビューで

```rb
link_to "修正", edit_publisher_book_path(@publisher, @book)
```

とかって書くことになる。メソッド名が長えよ。

いやまあ，上の例だとモデル名が Publisher だの Book だの短いからまだかわいい。
モデル名が長かったり，namespace 使ってたりすると，

```rb
link_to "修正", edit_admin_counterpart_favorite_item_path(@counterpart, @favorite_item)
```

とかワケわからん。

モデルの CRUD に使うパスなんだからモデルに言われせればいいんじゃね？

ただ，モデルに直接やらせるのはおかしいので，デコレーターに定義することにする。

ActiveDecorator を使った場合，

```rb:book_decorator.rb
module BookDecorator
  def edit_path
    edit_publisher_book_path(publisher, self)
  end
end
```

みたいにする。(`publisher` は変数ではなく `self` の `publisher` メソッドを呼び出してる）

これで，

```rb
link_to "修正", @book.edit_path
```

と書ける。

同じようにして，

```rb:book_decorator.rb
module BookDecorator
  def path
    publisher_book_path(publisher, self)
  end
end
```


```rb:publisher_decorator.rb
module PublisherDecorator
  def new_book_path
    new_publisher_book_path(self)
  end

  def books_path
    publisher_books_path(self)
  end
end
```

とかも定義しておく。

ビューがスッキリする。

ただ，こういうやり方がよい流儀なのかどうか，よく分からない。
「てめえの Rails は〇〇じゃねえ！」とか叱ってくれ。

# コントローラーで使う（2019-06-18 追記）

パスヘルパーはコントローラーでも多用する。

例えば特定の Publisher の Book を create したり update したりしたあと，

```rb
redirect_to publisher_book_path(@publisher, @book)
```

みたいに，その書籍のページにリダイレクトする，ということはよくある。
こういうとき

```rb
redirect_to @book.path
```

と書ければよいのだが，そういうわけにはいかない。
ビューで `@book.path` と書けたのは，ActiveDecorator が裏で `@book` をデコレートしてくれていたからで，この機構はビューに持ち込まれるインスタンス変数にしか働かない。

手動でデコレートするには

```rb
ActiveDecorator::Decorator.instance.decorate(@book)
```

とすればよい。
そこで，`ApplicationRecord` に

```rb:app/models/application_record.rb
class ApplicationRecord < ActiveRecord::Base
  # 中略

  def decorate
    ActiveDecorator::Decorator.instance.decorate self
  end
end
```

と書いておけば，コントローラーで

```rb
redirect_to @book.decorate.path
```

と書ける。

もちろん，コントローラー以外の場所でも `.decorate` を使うことができる。
ビューの中で自動デコレートが効かない場合（それは良いプログラミングスタイルではないかもしれないが）にも役立つ。

# 2021-01-26 追記

何たる不覚。ActiveDecorator は，デコレーターをモジュールとして定義するのに，間違ってクラスにしてた。
投稿から 4 年も経って気づいたので，今さらだが直した。
直線で構成された文字デザインと鈍角過小視

錯視の Advent Calendar がちょっとさみしいので横入りいたします。

直線だけで構成された文字デザインてありますよね。

たとえば 0（ゼロ）なんかはこんな感じ。

![donkaku.png](https://qiita-image-store.s3.amazonaws.com/0/48101/8f8e0623-6975-1e11-ed46-42cf07ce9f85.png "donkaku.png")


この字形は完全に直線（線分）だけで構成されており，すべての角は 135 度です。

しかし，角が異様にツンツンして見えませんか。
そして，各線分の端部がわずかに反っているように見えませんか。大げさに言えば，漫画なんかで使う「ババーン」ってやつみたいな。（アレをなんと呼ぶんだろう？　印刷業界ではこの手のものをバクダンというみたいだけど）

これは鈍角（どんかく）の角度が小さめに見えてしまう「鈍角過小視」のためであると思います。


〈直線で構成された文字〉をデザインするとき，敢えてこのようなツンツン感・ババーン感をもたせたいならそれでいいのですが，そうでなく本当に直線で構成されているように見せたいなら，微妙な曲線でデザインする必要があるんだと思います。が，それを構成して見せるのは私の能力を超えるので，やめておきます。

※角度の錯視には，鈍角過小視の真逆で，小さい角が大きめに見えてしまう「鋭角過大視」もあります。


# 描画コード

この絵は Ruby で [cairo](https://rubygems.org/gems/cairo) ライブラリーを使って描きました。

あらかじめ

```
gem install cairo
```

としてから以下を実行してください。（もちろん Gemfile に `gem 'cairo'` って書いてやってもいいですが）


```rb
require "cairo"

include Math

size = 200

surface = Cairo::ImageSurface.new Cairo::FORMAT_ARGB32, size, size
context = Cairo::Context.new surface

thickness = size * 0.16
instroke1 = size * 0.15
instroke2 = instroke1 + (sqrt(2) - 2) * thickness

x1 = size * 0.3
x2 = x1 - instroke1
x3 = x1 - thickness
x4 = x3 - instroke2

y1 = size * 0.4
y2 = y1 - instroke1
y3 = y1 - thickness
y4 = y3 - instroke2

context.instance_eval do
  # 地色
  rectangle 0, 0, size, size
  set_source_color :white
  fill
  # 外側の輪郭
  translate size * 0.5, size * 0.5
  points = [[x2, -y1], [x1, -y2], [x1, y2], [x2, y1], [-x2, y1], [-x1, y2], [-x1, -y2], [-x2, -y1]]
  move_to *points.shift
  points.each{|x, y| line_to x, y}
  set_source_color :black
  fill
  # 内側の輪郭
  points = [[x4, -y3], [x3, -y4], [x3, y4], [x4, y3], [-x4, y3], [-x3, y4], [-x3, -y4], [-x4, -y3]]
  move_to *points.shift
  points.each{|x, y| line_to x, y}
  set_source_color :white
  fill
end

surface.write_to_png "donkaku.png"
```
ぼくのかんがえるかっこいいDocker

[Docker2 Advent Calendar 2016](http://qiita.com/advent-calendar/2016/docker2)の22日目及び
[Fusic Advent Calendar 2016](http://qiita.com/advent-calendar/2016/fusic)の22日目の記事です。

# 自己紹介

はじめまして、seike460と申します。
普段は主にPHPとサーバー触っています。

Docker良いですよねDocker。
少し前まで敬遠していたのですが、[弊社](https://fusic.co.jp)のテックリードから布教されて使用してみたところ
思いのほか使いやすくてはDockerで開発するようになりました。

是非いろんな人にDockerを使って欲しいので今までの私が少しづつ進めてきた開発環境構築の軌跡と
現時点での、ぼくのかんがえるかっこいいDocker構成を書こうと思います。

# Dockerを使う前

Vagrant + Ansible で開発を行っていました。
Ansibleに関しては、弊社の[Ansible職人のリポジトリ](https://github.com/sadapon2008/ansible-roles)がキレイに整備されているので
ありがたやありがたやと使わせて貰ってたのですが、問題はVagrantが使うDisk容量です。
phpenvを使ってPHPを切り替えたりしても良いのですが、
PostgresのVersionが〜、MySQLのVersionが〜、といった感じできりがないです。

結局新しいVagrant作ったりしていました。

<img width="336" alt="1.png" src="https://qiita-image-store.s3.amazonaws.com/0/120576/8b29d9d8-240d-ab75-761e-22506781bd50.png">
<img width="336" alt="1.png" src="https://qiita-image-store.s3.amazonaws.com/0/120576/8b29d9d8-240d-ab75-761e-22506781bd50.png">

# Dockerとりあえず使ってみる期

ひとまず使い方を教えてもらったので使ってみることにしました。
DockerにSSH開いてAnsibleで必要なサービスを突っ込んでました。とりあえず使ってみた状態です。

<img width="298" alt="2.png" src="https://qiita-image-store.s3.amazonaws.com/0/120576/3d2d2def-a85d-a0d1-4c84-52a49f2f279d.png">

**コレジャナイ感がすごかったのですぐやめました。**

# Dockerコマンドで頑張る期

なんとなく、自分で環境を作りたいと思ってcentosのコンテナイメージにAnsible流す方法を取っていたのですが
慣れてない分無駄に時間がかかっている気がしていました。
[dockerhub](https://hub.docker.com/)のコンテナイメージ使えば、いい感じに連携出来そうと思って素直にそっちを使い始めました。
ここらへんからDocker使っている感出てきました。

<img width="565" alt="3.png" src="https://qiita-image-store.s3.amazonaws.com/0/120576/8816ad25-3353-28d5-9304-a61e34c99341.png">

**ただ、毎回dockerコマンドを各ディレクトリに移って打つのがめんどくさくて気が狂いそうでした。
各コンテナの連携をもっとわかりやすく使いたいとも思ってました。**

# docker-composeでそれなりに幸せになる期

やはりあったオーケストレーションツール、docker-composeを使い始めてだいぶ幸せになりました。
基本ファイルである「docker-compose.yml」
独自設定が書ける「docker-compose.override.yml」

これらを駆使すれば、いい感じに開発出来る！と思いました。

<img width="695" alt="4.png" src="https://qiita-image-store.s3.amazonaws.com/0/120576/73e52062-058b-3a5d-bab4-5500848f3f16.png">

# ansibleも使いたい期

ただ本番でのDocker投入は怖いので、本番はどうしてもAnsibleを使用した環境構築を行いたい。
と次に考えるのは、やはりDockerとAnsibleの連携ですね。
docker-composeで作成したコンテナにAnsibleを実行します。
つなぎ込み部分に関しては既にDockerに対して実行できるよう
Ansible側が対応してくれています。[ここ](https://docs.ansible.com/ansible/guide_docker.html)を参照して下さい。
「connection: local」にて実行すれば、Dockerに接続出来ました。
（実際はここにたどり着くのにかなり苦しみ、いまだ試行錯誤中。Myベストプラクティスを見つけ次第アウトプットしたい）

<img width="705" alt="5.png" src="https://qiita-image-store.s3.amazonaws.com/0/120576/fa0294e3-8f91-83c9-ecc9-0fca319acc53.png">

Postgresql等のDBに関しては、追加パッケージの必要が無いのでdockerhubのものをそのまま使用しています。

# ぼくのかんがえるかっこいいDocker

本番でdockerを使わない、開発docker環境も本番と同じ環境を整える事が出来る。
docker-compose - ansibleが現在私が考えている理想のDocker構成だと思っています。
これなら私が実現したい内容を全て包含してくれていると考えているからです。

皆様も自分の考える理想のDocker環境を構築して快適開発環境を是非手に入れましょう！
情報工学における思考実験まとめ

#はじめに
情報工学の有名な思考実験とかをまとめました

#二人の将軍問題
##概要
敵城の近くに谷を挟んで二つの軍隊がいる
同時に攻撃しないと敵城を陥落させられないので谷を経由してメッセンジャーを送り攻撃時間を決める
ただし谷には敵兵に捕まるかもしれないので必ずしも手紙が送られるとは限らない(何回か送れば届く可能性はある)
メッセンジャーを無制限に送られるとすると,お互いに攻撃時間を合意することができるか
##結論
合意することができない
##理由
AからBに攻撃時間の書かれた手紙を送ったとする

Aはたくさんのメッセンジャーを送る
BはAから送った手紙を受け取って合意したことをAからBに手紙を送る
AはBからその手紙を受け取り,その手紙に対する確認の手紙を送る
BはAからその手紙を受け取り,その手紙に対する確認の手紙を送る
・・・以上の無限ループ

確認の手紙が届かなかった場合は送った手紙が届いたのかわからないので
その前の手紙に対する確認をしたことにはならない
その前の手紙に対しても同じことがいえるので帰納法的に考えると不可能

##情報工学上の応用
ネットワーク上での通信で双方が合意することが不可能であることを示している
一般にはTCPの3-way-handshakeのように数回で打ち切る

#ビザンチン将軍問題
##概要
いくつかの軍隊が城を包囲している,攻撃するか撤退するかを合意したい
ただし,軍隊には反逆者がいて不適切な戦略を伝える
この状況で反逆者以外の軍隊全隊が一致して攻撃あるいは撤退にできるか
##結論
反逆者が全体の三分の位置にみたなければ可能
##理由
4人で反逆者1人の場合不可能であることを証明する
そこから全体の三分の一以上の反逆者がいる場合不可能であるという結論に一般化できる
ここに書くには余白が狭すぎるので細かい証明は[このpdf](http://www.morikita.co.jp/data/mkj/081071mkj.pdf)にお任せします

##情報工学上の応用
分散ネットワーク上に故障したプロセスや悪意のあるプロセス(ビザンチン故障と呼ばれる)から
条件付きで合意することができる

#食事する哲学者の問題
##概要
円卓を哲学者5人で囲み,円卓の上には5つの皿が哲学者の前にありその間に1つずつフォークが置いてある
哲学者は左右2つのフォークを使って食事をして食事が終わるとフォークを置く
この時各哲学者が左のフォークをとって右のフォークを取るといった方法を取ると
右のフォークが置かれるのを待ち続けて飢え死んでしまう
このような哲学者が飢え死にを回避する方法はあるか
##結論
ウェイターを配する解法やChandy / Misra の解法などがある
##理由
これも全て説明すると長いのでChandy / Misra の解法だけ記述する

フォークには dirty と clean の2つの状態があり,初期状態は dirty
食事したい場合は必要なフォークを要求する
要求されたフォークを持つ哲学者は、持っているフォークが clean なら持ち続け,dirty ならそれを手放す.フォークを要求した側に送る際,それを clean 状態にする。
食事が終わると,フォークは dirty 状態になる.他の哲学者がそのフォークを要求したことがあったら、そのフォークを clean 状態にする

その他の証明などは例のごとく[Wikipedia](https://ja.wikipedia.org/wiki/食事する哲学者の問題)にお任せします
ちなみにモニタを使った解法などではフォークを両隣に占有されると飢え死んでしまう

##情報工学上の応用
並列処理時にリソース共有がデッドロックに入らないようにする(排他処理)ことができる

#停止性問題
##概要
プログラムが停止するかがわかるプログラムは存在するか
##結論
存在しない
##理由
「あるプログラムが停止する時は停止せず,停止しないと停止するプログラム」自身が停止するかを判定する
停止しないなら,停止しないという結論で停止しているので矛盾
停止したら,停止していないことになるので矛盾
##情報工学上の応用
コンピュータ(チューリングマシン)では解けない問題がある
プログラムでは無限ループになるかを完全には判定できない
TitaniumでTwilioでCallKitとPushKit

なんでも盛り込めばいいってわけじゃないんですけれども。

iOS 10以降、VoIPアプリにもCallKitやPushKitが解放されたので、本格的な電話機能を持つアプリを作成することが可能になりました。Facebook MessengerやSkypeなどにはもう実装されていますが、実はTwilioも手をこまねいてばかりいるわけではありません。[9月にはiOS用SDKの公開ベータが出ています](https://www.twilio.com/blog/2016/09/beta-programmable-voice-sdk-for-ios-with-support-for-voip-services-push-notifications.html)。

<img width="414" alt="Screen Shot 2016-12-22 at 4.08.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/1782/d4ef2140-66e9-3e2d-f466-9ca520a7d10b.png">

大きな特徴は、何はさておきVoIP用のPush Notificationsに対応したことです。これまで着信についてはアプリが起動してフォアグラウンドにいない限りはPush通知で最長30秒までの音を鳴らすくらいしかユーザに通知する方法がありませんでしたが、VoIP用のPush Notificationsを利用することにより、まるで普通に電話がかかってきたような画面と動作でユーザーに着信を通知することができます。

[こちら](https://www.twilio.com/docs/api/voice-sdk/ios/getting-started)にサンプルや設定方法の詳細が解説されています。

で、今のところこのTwilioのサンプルアプリを模した機能しかありませんが、とりあえずiOS用のモジュールを作成しました。

https://github.com/yagitoshiro/TiTwilioVoice

ただしインストールするのが一苦労です。まず、TwilioVoiceClient.frameworkを手に入れなければいけないのですが、これが普通に組み込んでも動作しません。「Linked Frameworks and Libraries」に入っていてもダメで、必ず「Embedded Binaries」に追加してあげないといけません。xcodebuildでこれを実現する方法があればいいのですが、まだ見つかっていません。誰か教えてください。それがないと、一旦ビルドして、それからXcodeを開いて上記の作業を手動で実行してXcodeからまたビルドしないといけません。

JavaScript側はいたって簡単：

```js
var twilio = require('ro.toshi.ti.mod.titwiliovoice');
var client = twilio.createTwilioVoice({
  url: '認証サーバのURL',
  displayName: 'TiApp'
});

function doClick(){ //通話を開始
  client.connect({
    user: 'voice test'
  });
}
```

基本的に着信はPushKitからCallKitのDelegateが呼ばれて勝手に処理されます。アプリ側ではイベントリスナーを用意すれば途中にあれこれ機能を仕込むことができます。

<blockquote class="twitter-video" data-lang="ja"><p lang="ja" dir="ltr">TitaniumでもTwilioでCallKitでPushKit <a href="https://twitter.com/hashtag/titaniumjp?src=hash">#titaniumjp</a> <a href="https://t.co/0FiBITpHG1">pic.twitter.com/0FiBITpHG1</a></p>&mdash; 八木の野郎 (@yagi_) <a href="https://twitter.com/yagi_/status/811655422704644096">2016年12月21日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>



それさえ我慢すれば、こんな感じで動作します。
Multiversion Concurrency Control(MVCC) その2

## Reads-From関係の導入

トランザクション内で値を書き込む場合、その書き込み操作はMultiversionの実行時には必ず「新たなバージョンを作る」という操作で代用する（無限にバージョンを増やしていくとメモリが足りないという問題はあるがそれは後日の議論で解決する）。

「トランザクションaがxに書き込む」場合、その値をバージョンaを付けて**xa**と表現することにする。トランザクション1が書いた値ならx1と表現するしトランザクション2が書いた値ならx2と表現する。そうしてバージョンを付けた値を扱うスケジュール図をマルチバージョンスケジュール図と以後では呼ぶ。

マルチバージョンスケジュール図から「それぞれのReadが読んだバージョンはどのバージョンか」を集合の形で抽出し、それを**Reads-From関係**と呼ぶ。なお初期状態はTx0という特殊なトランザクションがすべて書き込んだ物として扱う。

![m_mv_no_csr.png](https://qiita-image-store.s3.amazonaws.com/0/1716/535cf992-85eb-9985-96f2-9e444e5ea8a8.png)

↑のマルチバージョンスケジュール図から導き出される**Reads-From関係**は

- 「**Tx1**のRead(**x**)は**Tx0**の書いたバージョンを読んでいる」
- 「**Tx1**のRead(**y**)は**Tx2**の書いたバージョンを読んでいる」
- 「**Tx2**のRead(**x**)は**Tx1**の書いたバージョンを読んでいる」

であり、太字の部分を抽出して大きさ3の集合の形で

```:Reads-From関係1:
RF(m1) = {(Tx1, x, Tx0), (Tx1, y, Tx2), (Tx2, x, Tx1)}
```

と表現する。

![m_mv_csr.png](https://qiita-image-store.s3.amazonaws.com/0/1716/30cda550-9998-da79-e348-7a8da6612d04.png)

↑のマルチバージョンスケジュール図から導き出される**Reads-From関係**は

- 「**Tx1**のRead(**x**)は**Tx0**の書いたバージョンを読んでいる」
- 「**Tx1**のRead(**y**)は**Tx0**の書いたバージョンを読んでいる」
- 「**Tx2**のRead(**x**)は**Tx1**の書いたバージョンを読んでいる」

であり、集合で表現すると![mvsr_serial.png](https://qiita-image-store.s3.amazonaws.com/0/1716/beafe2e1-e3e4-1650-423e-72279e4eed1b.png)


```:Reads-From関係2:
RF(m1) = {(Tx1, x, Tx0), (Tx1, y, Tx0), (Tx2, x, Tx1)}
```

となる。これは任意のマルチバージョンスケジュールから機械的に抽出できる。
とある2つのマルチバージョンスケジュールから抽出されたそれぞれの**Reads-From関係**の集合が一致する場合、その2つのスケジュールの事を**View Equivalent**であると言う。
数式っぽいものが出てくると身構える人も多いと思うが、要するに[Read]の箱に刺さっている矢印の両端が2つの図で一致しているか、という観点で捉えて構わない。

## Multiversion View Serializability(MVSR)

このReads-From関係は、当然個々のトランザクションを１つずつSerialに実行した場合からも得られる。

![mvsr_serial.png](https://qiita-image-store.s3.amazonaws.com/0/1716/b0f99396-1b83-11f4-f58f-e19ab3fd4b5b.png)

Serial実行であってもMultiversionなのでReadは任意のバージョンの物を読みうるが、その中で**すべてのReadが最後にその値に書き込んだ値を読む**という条件に従っている（図的に言うなら、それぞれのReadの箱から見て左にある中で、同じ値にWriteしている箱の一番右の箱から矢印が伸びている）スケジュール図になっているものと**Reads-From関係**が一致するスケジュールの事を**Multiversion View Serializability(MVSR)**と呼ぶ。

**VSR**と比べてエルブランセマンティクスは出てこないが、ややこしさはやや増えている気がする。
JavaでPerlのgrepっぽいやつ

配列やリストから、条件に合致するものだけを抽出する処理。
Perlだと以下のように簡単に書ける（うろ覚え）

```pl:sample.pl
my @array = ('001', '901', '201', '010', '999', '311');
my @result = grep { /1$/ } @array;
```

Javaでも同様のことができないか調べたところ、 ListUtils#select() で似たようなことができる模様。

```java:Sample.java
List<String> list = Arrays.asList("001", "901", "201", "010", "999", "311");
List<String> result = ListUtils.select(list, new Predicate<String>() {

   @Override
   public boolean evaluate(String arg0) {
      // 末尾に '1' が付く場合
      return StringUtils.endsWith(arg0, "1");
   }
});
		
System.out.println(result.toString()); //=> [001, 901, 201, 311]
```

Predicateは匿名のインナー型にしてみたが、自分のクラスでPredicateをimplementsするのとどちらがいいのだろう？後者の方が「昔の書き方」っぽい感じはする。
今回は文字列のリストでサンプルソースを書いてみたが、どちらかというとBeanのリストから抽出したい場合に威力を発揮するんじゃなかろうか。

ListUtils#select() を使わないで書くとこんな感じ？なんか見慣れた感じになった。
条件が煩雑になるにつれてif文のネストがどんどん深くなっていってうわーってなる、いつものパターン。

```java:Sample2.java
List<String> list = Arrays.asList("001", "901", "201", "010", "999", "311");
List<String> result = new ArrayList<String>();
for (String s : list) {
    if (s.endsWith("1")) {
        result.add(s);
    }
}

System.out.println(result.toString()); //=> [001, 901, 201, 311]
```
three.jsで使いたいモデルをBlenderからexportする時の注意点

この記事は、<a href="http://qiita.com/advent-calendar/2016/threejs" target="_blank">Three.js Advent Calendar 2016</a> 22日目の記事です。

Blenderからモデルデータをthree.js用のjsonとしてエクスポートする際に躓いたのでメモとして残しておこうと思います。なので今日の記事は少し軽めです。

three.js用のjson出力ができるようにBlenderが設定できていない場合は以下のサイトが参考になります。

- [【WebGL特集】第4回：Blenderでモデル出力](http://mox-motion.com/blog/webgl04-2/)

# 注意点

ここからはBlenderのエクスポーターを使う場合の注意事項を列挙していきます。

## 1. オブジェクトを選択する

出力前にはオブジェクトを選択されていることを確認してください。

<img width="290" alt="zensuke_blend.png" src="https://qiita-image-store.s3.amazonaws.com/0/42248/2364ca9d-8bb3-1a95-4f9a-0cd50bdb9170.png">

これはダメ。この状態だと出力に失敗します。

<img width="287" alt="zensuke_blend.png" src="https://qiita-image-store.s3.amazonaws.com/0/42248/704e8d4f-cb51-1b58-c86c-86f8c4ca897d.png">

これはOK。

## 2. レストポーズをとらせる

出力前にはレストポーズをとっているかを確認してください。

<img width="290" alt="zensuke_blend.png" src="https://qiita-image-store.s3.amazonaws.com/0/42248/478aa7db-ce36-69d9-a3d2-37c1a8184069.png">

これはダメ。このまま出力すると頂点の初期位置がこの格好の位置になってしまうためおかしなアニメーションになります。

<img width="247" alt="zensuke_blend.png" src="https://qiita-image-store.s3.amazonaws.com/0/42248/dd4c9a84-7385-5fd7-7679-12586d6969a8.png">

これはOK。**レストポーズをとらせたアクションを予め用意しておき出力前にはレストポーズのアクションを選択する**と良いです。

## 3. 出力設定

出力設定が正しく設定されているかを確認します。下の画像のようになっていればOKです。

<img width="402" alt="スクリーンショット 2016-12-22 2.43.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/42248/c75ffac9-423e-54bf-4322-241d08178ab8.png">
<img width="402" alt="スクリーンショット 2016-12-22 2.44.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/42248/121fb40d-8ad8-d425-7fbe-14b8431d8b16.png">


# 最後に

Blenderにも使い慣れていないので意外とこれらを忘れて時間を食うことが多いです。面倒ですがかならず毎回チェックしましょう。今回はこんな感じで許してください。
HoloLensアプリでOneDriveからファイルを開く #アセットアドカレ

この記事は [Unity Assets Advent Calendar 2016](http://qiita.com/advent-calendar/2016/unity-asset) 21日目の記事になります。

今日はUnityで作るHoloLensアプリから、OneDriveに保存しているファイルを開いてRuntimeで扱う方法を紹介します。

## Windows Store Native 1.19 (Dec 19, 2016)
[![image](https://qiita-image-store.s3.amazonaws.com/0/32347/1a685b7c-5676-a3f7-2304-af24199634a8.png)](https://www.assetstore.unity3d.com/jp/#!/content/54715)

以下がOneDrive呼び出し箇所で、new[] { ".png", ".jpg" }の箇所でファイルを絞れる。選択後に result.ReadBytes()やresult.ReadText()でファイルのデータが取れるので、それをTextureに突っ込んだりして使います。

```csharp:ExampleSceneManagerController.cs
    public void ShowFileOpenPicker()
    {
        WSANativeFilePicker.PickSingleFile("Select", WSAPickerViewMode.Thumbnail, WSAPickerLocationId.PicturesLibrary, new[] { ".png", ".jpg" }, (result) =>
        {
            if (result != null)
            {
#pragma warning disable 0219
                byte[] fileBytes = result.ReadBytes();
                string fileString = result.ReadText();
#pragma warning restore 0219
            }
        });
    }
```

## 参考 Air-TapでOneDrive開く

![image](https://qiita-image-store.s3.amazonaws.com/0/32347/e62e7b9e-0437-ea0a-6841-fe6598e45405.png)


```csharp:AirTapAction.cs
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.VR.WSA.Input;
using HoloToolkit.Unity;

[RequireComponent(typeof(GazeManager))]
public class AirTapAction : MonoBehaviour
{
	GestureRecognizer recognizer;
	
	public UnityEvent myEvent;
	
	void Start()
	{
		recognizer = new GestureRecognizer();
		recognizer.SetRecognizableGestures(GestureSettings.Tap);
		recognizer.TappedEvent += Recognizer_TappedEvent;
		recognizer.StartCapturingGestures();
	}
	
	void OnDestroy()
	{
		recognizer.StopCapturingGestures();
		recognizer.TappedEvent -= Recognizer_TappedEvent;
	}
	
	private void Recognizer_TappedEvent(InteractionSourceKind source, int tapCount, Ray headRay)
	{
		OnTap();
	}
	
	void LateUpdate()
	{
#if UNITY_EDITOR
		if (Input.GetMouseButtonDown(0))
		{
			OnTap();
		}
#endif
	}
	private void OnTap()
	{
		if (myEvent != null)
			myEvent.Invoke();
	}
}
```

## ちなみに

OneDriveがHoloLensにインストールされていないとインストールするように案内が出ます。よくできてる。
![image](https://qiita-image-store.s3.amazonaws.com/0/32347/8970670b-da9d-626b-aebe-f79623165887.png)
炎の型工房 火の型 18日目 : Dartを始めよう!! おかしなコードを書いてみよう

[<ruby>炎<rt>ほのお</rt></ruby>の<ruby>型<rt>かた</rt></ruby><ruby>工房 <rt>こうぼう</rt></ruby>ScratchとDartでゲームプログラム<ruby>入門<rt>にゅうもん</rt></ruby> Advent Calendar 2016](http://qiita.com/advent-calendar/2016/firefirestyle-studio)
の<ruby>記事<rt>きじ</rt></ruby>です

## おかしなコードを<ruby>書<rt>か</rt></ruby>いてみよう
<ruby>前回<rt>ぜんかい</rt></ruby>、<ruby>実行<rt>じっこう</rt></ruby>した HelloWorld の コード を、いじってみよう
```
main(List<String> args) {
  print('Hello world!');
}
```

な、コードでしたね

### ";" を<ruby>削除<rt>さくじょ</rt></ruby>してみる。

#### 1. コードを<ruby>変更<rt>へんこう</rt></ruby>する
```
main(List<String> args) {
  print('Hello world!')
}
```

##### 2. <ruby>実行<rt>じっこう</rt></ruby>する  
<img width="336" alt="v001.png" src="https://qiita-image-store.s3.amazonaws.com/0/54192/9e9487a5-ac6e-ce04-5025-2a5fce1cee38.png">

##### 3. Errorが<ruby>出力<rt>しゅつりょく</rt></ruby>されます 
```
Unhandled exception:
'helloworld/bin/main.dart': error: line 2 pos 24: semicolon expected
  print('Hello world!')
```

2<ruby>行目<rt>ぎょうめ</rt></ruby>にセミコロン(;)を<ruby>追加<rt>ついか</rt></ruby>してください。と<ruby>指示<rt>しじ</rt></ruby>がでます。


このように、Scratchの<ruby>時<rt>とき</rt></ruby>と<ruby>違<rt>ちが</rt></ruby>って、Charベースのプログラムは<ruby>書<rt>か</rt></ruby>き<ruby>間違<rt>まちが</rt></ruby>えると、<ruby>動作<rt>どうさ</rt></ruby>してくれません。


## <ruby>出力<rt>しゅつりょく</rt></ruby>する<ruby>文字<rt>もじ</rt></ruby>を<ruby>変<rt>か</rt></ruby>えてみる

##### 1. コードを<ruby>変更<rt>へんこう</rt></ruby>する  
```
main(List<String> args) {
  print('Dart Love');
}
```
#####  2. <ruby>実行<rt>じっこう</rt></ruby>する  
<img width="336" alt="v002.png" src="https://qiita-image-store.s3.amazonaws.com/0/54192/9ea752ca-df04-1919-5316-34a1a37b33b1.png">
  
Dart Love と<ruby>表示<rt>ひょうじ</rt></ruby>されます





## Thanks

ここまで、<ruby>読<rt>よ</rt></ruby>んでくれてありがとう!!

では、<ruby>次回<rt>じかい</rt><ruby><ruby>会<rt>あ</rt></ruby>えることを、<ruby>楽<rt>たの</rt></ruby>しみにしています。

ではでは
RustでAndroidアプリを作る

この記事は [Rustその2 Advent Calendar 2016](http://qiita.com/advent-calendar/2016/rust-lang-2) 22日目の記事です。この記事はMac環境向けに書いています。

来年に引き続き今年もRust Advent Calendar を書きます。去年はかなり空いてたんですが、気づいた頃には[その1](http://qiita.com/advent-calendar/2016/rust-lang)は埋まっていました。。

人気上昇っぷりにびっくりです。やっぱりRustはいいですね。

**Rustはいいぞ**

## AndroidでRust

この記事では、AndroidでRustを動かしたくなったので [tomaka](https://github.com/tomaka/)さんの [android-rs-glue](https://github.com/tomaka/android-rs-glue) を実際に動かしてみた内容となっています。 このライブラリを使って筆者が最近はまっている自転車関連のアプリを作りたかったのですが、そちらに関してはまた別の機会に執筆いたします。。

## AndroidでRustを動かすために

### Rustupを入れる
androidの build target を指定できるようにRustup経由でRustをインストールします。もしもdmgファイルからRustをインストールした場合は

```
/usr/local/lib/rustlib/uninstall.sh
```
でアンインストール後、

```
curl https://sh.rustup.rs -sSf | sh
```
でrustupをインストールします。rustupのインストールについて、詳しくは[こちら](https://www.rustup.rs/)をご覧ください。

### Android用のbuild target を用意する
```
rustup target add arm-linux-androideabi
```
これでRustのAndroid用のバイナリをコンパイル出来るようになります。

### Android Studioをインストールしてセットアップ
Androidの開発上必要になってくるため入れておきます。
[こちら](https://developer.android.com/studio/index.html?hl=ja)からダウンロードしてください。Android Studioのセットアップを済ませた後、ホームディレクトリに `~/Library/Android/sdk/` というディレクトリが出来ていればOKです。

### adbコマンドを使えるようにする
`~/.bashrc` に


```
# android
PATH=$PATH:~/Library/Android/sdk/platform-tools
```

を追記します。

### Android NDKをダウンロードして配置
ビルド時にAndroid NDKも必要になってくるので、[こちら](https://developer.android.com/ndk/downloads/index.html)から、Android NDKをダウンロードします。ディレクトリが含まれていますので、このディレクトリを `~/Library/Android/`の中等に配置してください。また、特に場所は決まっていないので適当なディレクトリに配置して良いです。

### ~/.bashrc に 環境変数をセット
`~/.bashrc` に

```
# android
export ANDROID_SDK_HOME=~/Library/Android/sdk/
export NDK_HOME=~/Library/Android/android-ndk-r13b/
```
`ANDROID_SDK_HOME` と `NDK_HOME`の環境変数をセットします。
NDK_HOMEは、Android NDKのバージョンによって変わってきます。

`env` を実行して変数が存在すればOKです。

### Android SDK を コンソールからアップデートする
```
$ANDROID_SDK_HOME/tools/android update sdk -u
```
3つほど質問が聞かれますので全て `y` と答えます。

### antを入れる
```
brew install ant
```
brew で入るので brew で入れてしまいましょう。

### cargo apk をインストール
```
cargo install cargo-apk
```

cargo apk コマンドが使えるようになります。

ここまでが、環境構築の手順となります。

## ビルドする

```
git clone git@github.com:tomaka/android-rs-glue.git
```

試しに、サンプルプログラムを実行してみましょう。 [tomaka](https://github.com/tomaka/)さんの公開している `android-rs-glue` のリポジトリをcloneします。


```
cd android-rs-glue/examples/basic
```

basicディレクトリまで移動します。

```
cargo apk
```


ここで `cargo apk` コマンドを実行してエラーが出なければビルド成功です。


```
find . -name *.apk
```

でAndroid用のapkファイルが出来ていることを確認したら、`adb` でインストールしてみましょう。このときに、Android端末側で `USBデバッギングに接続` モードになっている状態になっていることを確認します。
試しに、 画面の明るさを変更するコマンド `adb shell settings put system screen_brightness 1` を実行して、正常に動作することが確認できれば繋がっています。

### Androidアプリのインストール
```
adb install -r ./target/android-artifacts/build/bin/android_glue_example-debug.apk
```
adb install でインストールします。

### 実行
黒い画面がでれば、成功です！
何も見えなくて面白みがないですが、RustでAndroidアプリができました。
JavaでNVLっぽいやつ

OracleのNVLっぽいやつ（伝われ）をJavaでやってみた。
null以外だったらそのまま、nullだったら特定の文字列が出る。

以下、commons-lang3-3.5を使用。

```java:Sample1.java
String s = null;

String result = ObjectUtils.defaultIfNull(s, "ぬる");
System.out.println(result); //=> ぬる
```

と、知っていれば１行で書けるものを。
実際にプログラマから上がってくるコードはこんなの↓とか。

```java:Sample2.java
String s = null;

// まだマシな方
if (s == null) {
    s = "ぬる";
}
System.out.println(s); //=> ぬる
```

うっかりするとこんなの↓とか。

```java:Sample3.java
String s = null;

// やめてくださいしんでしまいます
if (s == null) {
    System.out.println("ぬる");
} else {
    System.out.println(s);
}
```

これが入力値とかだったりすると、Sample3みたいなのが100個くらい量産されてしまって、そうなるともはや手に負えない。誰がレビューするんだよ。
頑張ってクソコードを量産するのは止めてほしいなあ…