OmniAICreator/Qiita-1.07M huggingface dataset:
#MA_2017 人力で Monacoin を採掘する装置向けLinuxイメージ garimpo を作る手順

[人力で仮想通貨をマイニングする装置 〜Garimpo〜](https://hacklog.jp/works/51849) の為の Raspberry Pi ZERO W 用Linuxイメージを作る手順

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">太陽光発電で仮想通貨をマイニングするコンテナが話題ですが、こちらはぼくが作った「人力で仮想通貨をマイニングする機械」。手回し充電機を回して電気が流れると起動し、1時間ほど連続で回すとだいたい0.002円ぐらいの仮想通貨を採掘することができます。 <a href="https://t.co/2eJ4cHOX9Z">pic.twitter.com/2eJ4cHOX9Z</a></p>&mdash; tnayuki (@tnayuki) <a href="https://twitter.com/tnayuki/status/926014890367520769?ref_src=twsrc%5Etfw">2017年11月2日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

# 環境
MacBook
[VirtualBox](https://www.virtualbox.org/)
- x86仮想化ソフトウェア
[Vagrantfile(ベイグラント)](https://www.vagrantup.com/)
- 仮想マシン環境を簡単に構築・管理・配布できるツール
[Buildroot](https://buildroot.org/)
- 組み込み系ターゲットのrootfsイメージを作成するためのオープンソースソリューション 

# 手順
1. VirtualBoxをインストールしていない場合はインストールする  
[VirtualBox(Downloads)](https://www.virtualbox.org/wiki/Downloads)  
1. Vagrantfile(ベイグラント) をインストールする  
[Vagrantfile(ベイグラント)](https://www.vagrantup.com/)  
1. 適当なディレクトリを作って garimpo リポジトリをcloneする  

    ```
   madir ~/Downloads/garimpo
   cd ~/Downloads/garimpo
   git clone git@github.com:tnayuki/garimpo-buildroot.git
    ```
1. clone したディレクトリにある Vagrantfile をテキストエディタ等で開いて vb.memory の値をホスト環境にあわせて編集する <font color="#f00">※初期値が8GB割当なので、環境によってはホスト毎動かなくなるようです(古いMacBookAirとか)</font>
    
    ``` Ini:Vagrantfile
    vb.memory = "4096"
    ```
1. clone したディレクトリで Vagrant を使ってゲストOSを起動する<br>初回はOSイメージダウンロードなどを実効するので時間がかかる  

    ```
    cd garimpo-buildroot
    vagrant up
    ```
1. Vagrantで起動した ゲストOS(Ubuntu)にSSH ログインする

    ```
    vagrant ssh
    ```

1. ゲストOSに構築済みの buildroot で Raspberry Pi ZERO W 用Linuxイメージを作る<br>Linuxイメージを作るので時間がかかる  

    ```
    cd buildroot
    make
    ```
1. make が終わると output/build に sdcard.img ファイルが出来ているはず  

    ```
    cd ~/buildroot/output/images
    ls     
    ```

1. sdcard.img をホストOSと共有されているディレクトリにコピーする 
    
    ```
    cd ~/buildroot/output/images
    cp sdcard.img /vagrant
    ```
1. vagrant で立ち上げたゲストOSを終了する  
    
    ```
    exit
    vagrant halt
    ```

1. ホストOSで sdcard.img をSDに書き込む 
    
    ```
    cd ~/Downloads/garimpo/garimpo-buildroot
    sudo dd if=sdcard.img of=/dev/disk3 bs=4m
    ```

1. 起動できるSDカードになっているハズ。  

# 参考
[人力で仮想通貨をマイニングする装置 〜Garimpo〜](https://hacklog.jp/works/51849)
[Vagrant Tips#5 boxのメモリをVagrantfileで変更する(VirtualBox限定](https://qiita.com/yukimura1227/items/0737d9683e1068721e29)
[Linux(Ubuntu)で、RaspberryPiのSDカードをインストールする方法](https://qiita.com/takanemu/items/8fa157688efe0d4b01a6)
[MacBookAir の容量がきついので Vagrant 環境を外付けに移した話](https://2inc.org/blog/2014/06/28/4311/)
パンくずコンポーネントと範囲選択するコンポーネントについて

本当は vue-test-loader× jest の記事について書きたかったのですが間に合いませんでしたので、最近自分で作って地味に便利だと感じたSFC（単一ファイルコンポーネント）の紹介をしたいと思います。:bow:

## クリック時に範囲選択するコンポーネント
最近ではコピーボタンが主流ですが、個人的にはぱっと見て気づかないことが多く直感的じゃないと思う時があります。 
 そのためついつい直接対象をドラッグしてコピーしがちです。
以下のようにコンポーネントを定義し、対象をクリックするだけでコンポーネントで囲った範囲を直接選択できるようにしコピーしやすいコンポーネントを作成しました。
やっていることはクリックイベント時にDOMレンジを使って対象範囲を選択するシンプルなものです。

[demo](https://codesandbox.io/s/ql588mk2qw) TodoListのタスクをクリックすると選択します。

1. 範囲選択するコンポーネントを定義（今回は`LineSelector.vue` と定義しています）

```
// LineSelector.vue
<template>
  <span @click="clickedSelect" ref="selectText">
  <slot />
  </span>
</template>

<script>
export default {
	methods: {
		clickedSelect () {
      const range = document.createRange()
      range.selectNodeContents(this.$refs.selectText)
      const selection = window.getSelection()
      selection.removeAllRanges()
      selection.addRange(range)
		}
	}
}
</script>
```

2. 定義したコンポーネントを読み込み、選択範囲を`<line-selector>`で囲みます。  
以下のコードではTodoList のtextをコピーできるようにしております。

```sh
<template>
  <li>
    <line-selector>{{ todo.text }}</line-selector>
    <button @click="$emit('remove', todo.id)">
      X
    </button>
  </li>
</template>

<script>
import LineSelector from './LineSelector.vue'

export default {
	components: {
		LineSelector
	},
  props: {
    todo: {
      type: Object,
      required: true
    }
  }
}
</script>
```

## パンくずコンポーネント
vueでパンくずを用いる場合、既に[vue-breadcrumbs](https://github.com/samturrell/vue-breadcrumbs)といったpluginが既にあるのですがより柔軟に対応する必要があったため、以下のようにコンポーネントを作成しました。

1. パンくずコンポーネントを定義

```
// Breadcrumb.vue
<template>
  <ul :class="$style.list">
    <li :class="$style.item" v-for="(crumb, key) in breadcrumbs" :key="name">
      <span v-if="crumb.path"><nuxt-link :to="crumb.path" >{{ crumb.name }}</nuxt-link></span>
      <span v-else>{{ crumb.name }}</span>
    </li>
  </ul>
</template>

<script>
export default {
  props: {
    breadcrumbs: {
      type: Array
    }
  }
}
</script>

<style>
.list {
  list-style: none;
  text-align: left;
  margin: 0;
}
.item {
  display: inline-block;
}
.item::after {
  content: '＞';
  display: inline-block;
}
.item:last-child::after {
  content: none;
}
</style>

```

2. 定義したコンポーネントを読み込み、pathと表示名を持ったオブジェクトをpropsで渡すとパンくずリストが表示されます。以下の場合だと`ほげ > ふが` といった表示をします
 
```
<breadcrumb :breadcrumbs="breadcrumbs" />
<script>
import Breadcrumb from './Breadcrumb.vue'

export default {
  components: {
    Breadcrumb,
  },
  data: function () {
    return {
      breadcrumbs: [
        {
          name: 'ほげ',
          path: '/hoge'
        },
        {
          name: 'ふが'
        }
      ]
    }
  },

}
</script>
```

## まとめ
Vue.jsに触れて半年くらいになりますが、SFCは柔軟すぎると思えるくらいとても便利です。
今後はvue-i18nと連携して<i18n>ブロックで定義したものをそのままパンくずとして表示して使えるようにした
Nuxt,Vueプラグインがあると便利だよねという話が出たので勉強のためにも是非作ってみたいと思いました。
レガシーコードを段階的に改善する

この文章は「[Tech Fun Advent Calendar 2017](https://qiita.com/advent-calendar/2017/techfun)」13日目の記事です。

秩序がないプロジェクトをリファクタリングしていく中で、DDDを段階的に導入していったアプローチや感想についてです。

# あるプロジェクトに参画した当初の状態
Java8でSpring Bootなプロジェクトですが、下記のようなコードでした。

- コピペコードが多い。
- 単体テストがない。
- ControllerからServiceへ"Model"を渡しており、どのViewを表示するかはServiceが知っている。
- ServiceにMyBatisの自動生成されたmapperを使ってDBアクセスがべた書きされている。
- Serviceが、画面・機能に対応した、いわゆるトランザクションスクリプトになっている。

Controllerが機能していないというのはさておき、Serviceがトランザクションスクリプトになってしまっているというのは、わりとあるんじゃないかと思います。

## なにが問題なのか？
変更に弱い。これに尽きます。ビジネスルールが変更されると横断的に変更が発生し、変更漏れがあれば当然バグとなります。テストも大変ですね。

# 最初のアプローチ
DDD以前の話ですが、チームメンバーと話し合い、問題認識を持つことが大事だと思っています。レイヤーを適切に分割し、テストを書いていきます。

## レイヤーを分ける

|コンポーネント|責務
|:----|:----
|Controller|リクエスト、レスポンスのハンドリングを行う。|
|Service|ビジネスロジックを記述する。ウェブの関心事をここに持ってくるのはだめ。永続化もここでやってはだめ。|
|Repository|永続化を行う。クエリ投げるのもここで抽象化して、ドメイン層ではコレクションとして扱う。インタフェースと実装は分ける。|

ここから三層+ドメインモデルに持って行きます。

## テストを書く

スケジュールとの兼ね合いもあり、実際は妥協してクリティカルなものを優先し、必要最低限の機能に絞って単体テストを書きました。

# 段階的にDDDを導入していく
変更に弱いコードとはどんなコードでしょうか？

データクラス、機能クラスを分ける手続き型の設計では、重複したビジネスロジックが至るところに書かれます。その結果、どこを変更すればいいのかわからなくなります。

逆に、変更に強いコードとはどんなコードでしょうか？

データとビジネスロジックがまとまったオブジェクト群（ドメインモデル）で構成されます。関心事単位に分離することで、どこを変更すればいいのかすぐわかります。

> ![domain3layer.png](https://qiita-image-store.s3.amazonaws.com/0/46627/32a9f80c-09c5-5b1c-1dab-2401852ed424.png)
> 引用：[現場で役立つシステム設計の原則 ~変更を楽で安全にするオブジェクト指向の実践技法](https://www.amazon.co.jp/dp/477419087X/) 三層＋ドメインモデルで関心事をわかりやすく分離する

## View、Serviceからドメインモデルを抽出していく

基本的には「業務に使っている用語をクラス名にする」のが良いと考えます。良いクラス名やメソッド名がないか常に考えることが肝要であって、思考停止するとレガシーコード化が進行します。
ドメインモデル駆動設計では、部分に着目し、個々の部品を組み合わせることで段階的に全体を作るアプローチができるため、DDDはすぐにでも導入可能であると実感しています。

# 参考書籍
## DDD
最近は [現場で役立つシステム設計の原則 ~変更を楽で安全にするオブジェクト指向の実践技法](https://www.amazon.co.jp/dp/477419087X/) あたりから入門するのがおすすめです。

腰を据えて読む必要はありますが、下記も必読です。
・[エリック・エヴァンスのドメイン駆動設計](https://www.amazon.co.jp/dp/B00GRKD6XU/)
・[実践ドメイン駆動設計](https://www.amazon.co.jp/dp/B00UX9VJGW/)
html5のアウトライン

こちらの記事は[アクトインディのアドベントカレンダー](https://adventar.org/calendars/2531)の記事です。
16日目はminamiがhtml5のアウトラインについて書きます。

# html5のアウトラインって？？
html5って何？アウトラインとは？
やや乱暴に一言でまとめると、「2017年時点で最新の**WEBページの文章構造**のこと」。
具体的には、ページのここがヘッダー、この部分がナビゲーション、ここからここまでがメインコンテンツ、ここはおまけコンテンツ...etc
このように**ページのコンテンツを区分して明示すること**です。

■ なぜ明示する必要があるの？
Google先生に「この部分がコンテンツ内容を示すタイトル」「こっちはオマケなんで気に留めないで」などと明示することで、Google先生が**WEBページを読みやすくする**ためです。

■ SEOに影響あるの？
順位UPはしませんが、**検索順位が高いサイトは皆綺麗**にまとまっています。

■ 実際にどういうことをするの？
`<header>タグで囲まれている部分はヘッダーです</header>`
このように明示したいエリアをタグで囲むだけ。超簡単。

■ タグにはどんな種類があるの？

| タグ     | 内容       | 本に例えると       |
|:-----------------|:------------------|:---------------------------------------------|
| header|ヘッダー|表紙|
| footer|フッター|背表紙|
| nav|ナビゲーション|目次|
| main|主たるコンテンツ|表紙、背表紙、目次を除いたもの|
| section|コンテンツのまとまり|章や節|
| article|独立できるsection|別冊付録にできる章や節|
| aside|補足コンテンツ|本の最後や欄外の注釈文など|
| h1~h6|見出し|見出し|

これらは**文章構造を示すものでありページのレイアウトを示すものではありません**（超超超超重要）


# 読みやすい文章が正解
「html5 アウトライン」でググると色々なブログやサイトでルールが説明されています。
どのサイトも似たような内容が書かれているんですが、微妙にニュアンスが異なる（汗）。
その理由は原文が英文で、訳し方がバラバラだから。
というのは冗談で、原文（英文）がやや曖昧に書かれているからなんです。
つまり、**正解らしきものはあるが正解はない**んですね。
作文を書く際に、最低限のルールはあるけど正解がないのと同じ。
強いて言うなら**読みやすい文章**が正解です。
となると、運用に際し曖昧な部分はルール化しなければなりません。

ポイントは2つ。
**Google先生的に読みやすいか**。
**運用がしやすいか**。
複雑にすればコストがかかるし、コードの可読性が落ちてしまう。

# いこーよ的アウトラインルール
前置きが長くなりましたが、ここからが本日のアドベントカレンダーの本題。
いこーよ内で運用しているアウトラインルールをまとめてみました。

■ ページ内にh1（大見出し）は1つ
・section（章）で分けていればページ内に複数のh1を使用可能だが、分けていない場合のリスクがある
・h2（中見出し）、h3（小見出し）を使って階層化し構造をよりわかりやすくする

■ aside（補足情報）やheader（ヘッダー）やfooter（フッター）はbody（視覚的に見えてるページ全体）直下のみで使用し、section（章）内では使用しない
→入れ子にせずシンプルな構造にする

■ section（章）の範囲はコンテンツのまとまりであり、見出しタグ（h2 or h3）が必須
→逆に言うと、h2があるならsectionで囲う

■ aside（補足情報）内の見出しレベルはh3まで
→asideは**おまけコンテンツ**なので階層深くする必要がない（Google先生にアピールする必要なし）

■ 迷ったらOutline（chromeのアドオン）を基準にする

# コードで見るアウトライン構成
```
<head>
　　// ページタイトル、キーワード、description、外部ファイルの読み込みなどページの裏側情報
</head>
<body>//視覚的に見えるページ全体
　　<header>
     　　// ページのヘッダー
  　</header>
　　<nav>
　　　　　// ナビゲーション（メニュー）
　　</nav>
　　<main>
　　　　<h1>ページの内容を示すタイトル</h1>
　　　　<section>
　　　　　　<h2>コンテンツ1のタイトル（中見出し）</h2>
　　　　　　<h3>コンテンツ1配下のコンテンツ1-1のタイトル（小見出し）</h3>
　　　　　　<p>コンテンツ内容</p>
　　　　　　<h3>コンテンツ1配下のコンテンツ1-2のタイトル（小見出し）</h3>
　　　　　　<p>コンテンツ内容</p>
　　　　</section>
　　　　<section>
　　　　　　<h2>コンテンツ2のタイトル（中見出し）</h2>
　　　　　　<p>コンテンツ内容</p>
　　　　</section>
　　</main>
　　<aside>//ページのおまけ情報
　　　　<section>
　　　　　　<h3>サブコンテンツ1のタイトル</h3>
　　　　　　<p>サブコンテンツ1の内容</p>
　　　　</section>
　　　　<section>
　　　　　　<h3>サブコンテンツ2のタイトル</h3>
　　　　　　<p>サブコンテンツ2の内容</p>
　　　　</section>
　　</aside>
　　<footer>
　　　　　// ページのフッター
　　</footer>
</body>
```

# ひと目で分かる！アウトラインはこれだ！

コードなんか見てもなんのこっちゃかさっぱりわからないので可視化してみましょう。
![名称未設定-2.png](https://qiita-image-store.s3.amazonaws.com/0/223154/a4d7ec01-b639-c02e-2069-8f4c5652d579.png)
※画像サイズの都合でfooterは載せていませんが、ページ下部にフッターが付きます

上記のルールでページごとにきちんとタグを埋め込んだ結果がこちら。
※Outline（chromeのアドオン）を使用しています。
![80a6f29cf33a6eedf938fd68ad70772c.png](https://qiita-image-store.s3.amazonaws.com/0/223154/3fa7ce0a-69d5-67c5-23fe-3fb3127370d7.png)

一目瞭然。階層化されていてこのページの内容が目次化されています。
ページに何が記載されているかわかるから、Google先生も読みやすいですよね。

デザイナーチームではUI・UXといった見た目の部分だけでなく、目に見えないところでページの整理整頓をしています。
jazzyでSwiftのコードから簡単なリファレンスを生成する。

## はじめに
本稿は [Swift その2 Advent Calendar 2017](https://qiita.com/advent-calendar/2017/swift2) の14日目の投稿です。

当方Swiftをがっつりとできるわけではないですが、頑張りたいと思いますのでよろしくお願いします！

## やりたいこと
みなさんは自分が作成したライブラリとかソースとかに対して、リファレンス書いてますか？
僕は書いてないです。作るのは結構面倒なんですよね...
PHPならDoxygenとかあるので、Swiftは対応してないみたいだし...と思ってたらありました！
Realmが提供してくれている**jazzy**です！ぱっと見た感じ見た目も綺麗だし、割と簡単に導入ができるみたいなので、試してみましょう！

## jazzyの簡単な説明
SwiftのDocコメントを利用して、プロジェクトのリファレンスをHTMLで吐き出してくれるツールです！
詳しくは[GitHubにリポジトリ](https://github.com/Realm/jazzy)があるので、そちらを参照してください。

## やっていこう
※Swiftなのでもちろんmacが前提です。
### jazzyのインストール
gemが入っていれば簡単にインストールできます。
なんとこれだけ！

```
$ gem install jazzy
```

### ソースコードの準備
試しにソースコードを作成します。
コメントの書き方がPHPっぽいですが、好みの問題なので自分なりに書きましょう！

```　SampleViewController
import UIKit

/**
 * サンプル提示用ののコントローラー
 *
 * - Author: Satoshi Baba (s_baba@currentia.co.jp)
 * - Date: 2017/09/01
 * - Copyright: © 2017年 Currentia Inc. All rights reserved.
 */
class SampleViewController: UIViewController {

    //------------------------------
    // MARK: メンバー変数
    //------------------------------

    /// 文字列を格納する。
    var sampleParam1:String = ""

    //------------------------------
    // MARK: 関数
    //------------------------------
    /**
     * ViewControllerの生成時に呼び出される。
     */
    override func viewDidLoad() {
        super.viewDidLoad()
    }

    /**
     * サンプルメソッド
     * 説明の後は必ず1行空けること
     *
     * - parameter value1: 変数１
     * - parameter value2: 変数２
     * - returns: value1とvalue2の連結文字列
     * - throws: エラー時にNSErrorをthrowする。
     */
    func sampleMethod(_ value1: String?, value2: String?) throws -> String {
        if (value1 == nil || value2 == nil) {
            throw NSError()
        }
        return value1! + value2!;
    }


}
```

### 実行してみる
jazzyを実行してみましょう。
XCodeのプロジェクトに移動して、以下のコマンドを打つだけで生成されます。

```
$ jazzy -o output/ --min-acl internal
```

outputというディレクトリができているはずなので、index.htmlとか開くといい感じに出力されているのが確認できますね！

![dd0e9990-6cde-4b35-9a54-43c79b97850a.png](https://qiita-image-store.s3.amazonaws.com/0/144029/aade69b8-91b7-f88a-725a-d5fcb934e986.png)
(COntrollerになっているのは、見ないフリでお願いします。)

## まとめ
これで簡単にリファレンスが吐き出せるようになりました。
後からDocコメントを整備するのはしんどいので、ぜひ初期の段階で書式ルールに乗っ取って書きたいですね！
皆様より良いSwiftライフをお送りください！
ファイルやコマンドの実行結果を入力として1行ずつ処理する

ファイルやコマンドの実行結果を入力として1行ずつ処理する

どちらも、サンプルはあるのですが、両方がまとめて書かれていることが
無かったのでまとめてメモしました。

どちらもechoで出力しているだけなので、このままだと意味はまったく無いですが
条件に当てはまるファイルのみリネーム場合などで使いました。



コマンドの実行結果を1行ずつ処理する場合

```a.sh
#!/bin/sh
ls *sh| while read line
do
 echo $line
done 
```


実行結果

```
~ $ ./a.sh 
a.sh
b.sh
```



ファイルに出力された実行結果を1行ずつ処理する場合

```b.sh
#!/bin/sh

while read line
do
    echo "$line"
done < ${1}
```

実行結果

```
~ $ ls *sh > b.txt
~ $ cat b.txt
a.sh
b.sh
~ $ ./b.sh b.txt 
a.sh
b.sh
```
【解決】Windows Updateでエラー 80072f8f が出た


http://tuberculin.blog102.fc2.com/blog-entry-364.html

■Windows Update エラー80072f8fの解決方法
1.Windowsの[スタート]→[コントロール パネル]→[時計、言語、および地域]→[日付と時刻]→[インターネット時刻]タブ→[設定の更新]を開く
2.[今すぐ更新]をクリック
3.Windows Updateにて更新の確認をする


古いPC設定するときに
結構これでひっかかるのでメモ失礼します。
AWS CodeCommit + Git (https) を OSX から SourceTreeで使う

# はじめに
AWSでWEBサービスを作るにあたり、CodeCommit を使ってソースを管理しようと思い、AWS CodeCommit を利用することにしたのでその準備方法などを整理＆メモとして残す。サーバ側を python3 で開発するつもりなので、python 周辺のツールを色々と使っているけど、pythonとか使いたく無い…って人は、別の道を探した方が良いと思う。

# 前提
ほとんど開発用のツール・ライブラリが入っていないことを前提にしているのだけど、まっさらな OSX を用意したわけで無いので、エラーが発生するような場合は、それぞれ解決が必要。たぶん、pip とか…。

# CodeCommit の作成など
下記のサイトとかを参考に、CodeCommit上にGitリポジトリを作り、アクセス用のアカウントを準備する。非常にざっくり・簡単に言えば、（１）AWS IAM でユーザを作って、（２）CodeCommit でリポジトリを作って、（３）AWS IAM で認証情報を生成する…といった流れ。

> [AWS Code Commitでgitリポジトリを作る](https://qiita.com/kazafe/items/7a4e0c3ce53ce674d07e)

実は、この状態で OSXのコマンドプロンプトから git clone コマンドを叩くと、ユーザID・パスワードを入力すれば普通にクローンできる。だけど、コマンドは何かと不便なので、SourceTreeを使うためにおまじないが必要。

# AWS CLI をインストール
下記のサイトなどを見る限り、SourceTree が認証をパスするためには、awsコマンドが存在しないといけない模様。なので、awscli をインストールするのだけど…ついでに、pythonのバージョン更新も行う。

> [AWS CODECOMMIT WITH SOURCETREE](https://geekprotem.com/2015/07/10/aws-codecommit-with-sourcetree/)

## OSX：python2.7 から python3 に変更
下記のサイトを参考に、OSX の python を python3.6.3 に変更。特に必要性は無いのだけど、サーバ側のバージョンを 3.6系にするつもりなので、環境を一致させる意味でも変更する。

> [MacOSとHomebrewとpyenvで快適python環境を。]
(https://qiita.com/crankcube@github/items/15f06b32ec56736fc43a)

## AWS CLI のインストール
python (pip) の環境が揃っているなら非常に簡単。以下のコマンドでインストール。エラー（不足ライブラリなど）は適当に処理すべし。

```
sudo pip install awscli
```

# AWS接続用の資格情報を作成
awsコマンドを使って、接続用の資格情報を作成。AWS IAM で作ったユーザの資格情報が必要になるので準備しておく。

```
aws configure --profile << 適当な名称 >>

AWS Access Key ID [None]: << ユーザー名 >>
AWS Secret Access Key [None]: << パスワード >>
Default region name [None]: << リージョン名 >>
Default output format [None]: 

#上記の << ... >> は、適宜置き換え
```

# SourceTreeで Clone から Push まで
ひとまず、SourceTreeを使って、リポジトリを clone する。認証情報を聞いてきたり、KeyChain へのアクセス許可を聞いてきたりと若干忙しいけど、特に問題ない…はず。

ただし、このままでは ローカルへの commit はできても、サーバへの pull も push もできないので、config ファイルに追記する。

```text:configへの追記
[credential]    
    helper = !aws --profile << 適当な名称 >> codecommit credential-helper $@
    UseHttpPath = true

# << 適当な名称 >> は、aws configure で使った名称。
```

# まとめ
ssh でやれば良かった… なんて野暮なことは言ったらダメなのだと思うけど、https 経由でも無事に SourceTree が使える模様。
大量のRaspberry PiにSSH経由で任意のコマンドを実行する

## 大量のRaspberry PiにSSH経由で任意のコマンドを実行する
LAN上に配置した大量のRaspberry Piに任意のコマンドを実行できるシェルスクリプトを組んだのでメモ．コレを使うと，大量の端末を一度にシャットダウンできて便利．
SSH経由なのでLinux端末なら大丈夫だと思いますが，Raspberry Pi（OS:Raspbian Jessie 8)でのみ動作確認しています．

## スクリプト    
```
#!/bin/sh

run_node_ssh() {
host=$1
id=$2
pass=$3
 
expect -c "
set timeout 10
spawn ssh ${id}@${host}   \"$4\"
expect \"Are you sure you want to continue connecting (yes/no)?\" {
    send \"yes\n\"
    expect \"${id}@${host}'s password:\"
    send \"${pass}\n\"
} \"${id}@${host}'s password:\" {
    send \"${pass}\n\"
}
interact
"
}

#コマンドライン引数の個数チェック
if [ $# -ne 1 ]; then
    echo "指定された引数は$#個です。" 1>&2
    echo "実行するには1個の引数が必要です。" 1>&2
    echo "Usage: ./run_command_node.sh \"COMMAND\"" 1>&2
    exit 1
fi

##### settings #####
run_node_ssh '192.168.1.AAA' 'user' 'pass' "${command}"
run_node_ssh '192.168.1.BBB' 'user' 'pass' "${command}"
run_node_ssh '192.168.1.CCC' 'user' 'pass' "${command}"
run_node_ssh '192.168.1.DDD' 'user' 'pass' "${command}"
run_node_ssh '192.168.1.EEE' 'user' 'pass' "${command}"
run_node_ssh '192.168.1.FFF' 'user' 'pass' "${command}"
run_node_ssh '192.168.1.GGG' 'user' 'pass' "${command}"
run_node_ssh '192.168.1.HHH' 'user' 'pass' "${command}"
run_node_ssh '192.168.1.ZZZ' 'user' 'pass' "${command}"
```


## 使い方
### 設定
スクリプトの末尾にコマンドを実行したい端末のIPアドレスとユーザ名，パスワードを列挙します 
末尾には"${command}"を付加します 

    run_node_ssh ['IPADDRESS'] ['USER'] ['PASS'] "${command}"


## 実行
実行時にはコマンドライン引数に実行したいコマンドを指定します  

    $ ./run_command_by_ssh.sh [COMMAND]

例:全ての端末をシャットダウンしたい時  

    $ ./run_command_by_ssh.sh "shutdown -h now"

複数のコマンドを実行したい時(セミコロン";"でつなぎます)  

    $ ./run_command_by_ssh.sh "cd /home/agri-mineno/; ./run_system.sh"
Clang Modules (modulemap) を利用してCライブラリをSwiftで使う


# はじめに

みなさん、こんにちは。
iOS / tvOSアプリデペロッパーの[hiroakit](https://github.com/hiroakit/)です。

この記事ではSwiftでCあるいはC++で書かれたライブラリを利用する方法についてご紹介いたします。

この記事の執筆時に使用した開発環境は以下の通りです。

```
$ sw_vers                                                                               
ProductName:	Mac OS X
ProductVersion:	10.12.6
BuildVersion:	16G1114

$ xcrun -find xcode build
/Applications/Xcode.app/Contents/Developer/usr/bin/xcodebuild

$ xcodebuild -version                                                                   
Xcode 9.2
Build version 9C40b

$ xcrun -find clang
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang

$ clang --version
Apple LLVM version 9.0.0 (clang-900.0.39.2)
Target: x86_64-apple-darwin16.7.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin
```

# 動機

Cライブラリ (e.g, [OpenJPEG](https://github.com/uclouvain/openjpeg)) をSwiftのフレームワークにして利用したいことがあると思います。

この記事では説明用に以下のCのライブラリで進めたいと思います。

```
- libExample.a
- include/Example.h
- include/ExampleEncoder.h
```

このライブラリをSwiftで書かれたアプリがフレームワークでインポートして利用したいとします。

```swift

import UIKit
import Example

class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        ExampleEncoder.run(urlString: "https://www.example.com/", profile: "path/to/profile")
    }
}
```

この場合、CライブラリをSwiftでラップしてフレームワークにするときに、 下記のように `.modulemap` ファイルを用意する必要があります。

```c++

framework module Example {
    umbrella header "Example.h"

    export *
    module * { export * }

    header "ExampleEncoder.h"
}
```

このExample.frameworkをアプリ側で追加したら、そのフレームワークのパスをXcodeプロジェクトの下記設定項目に設定する必要があります。

- FRAMEWORK_SEARCH_PATHS
- LIBRARY_SEARCH_PATHS

# `.modulemap` ファイルとは

`.modulemap` ファイルとはCライブラリで利用しているヘッダーファイルを[Clang Modules](http://clang.llvm.org/docs/Modules.html)を通じてSwiftに伝えるために必要なものです。

以下は`.modulemap`ファイルの形式を示したものです。[module map言語](http://clang.llvm.org/docs/Modules.html#module-map-language)を使い記述します。

```
[explicitopt] [frameworkopt] module module-id attributesopt {
    /* module-member */
}
```

なお、module map言語はClangのメジャーバージョン間で動作保証がされていません。そのため、Xcodeが内包しているClangのメジャーバージョンが変わった場合、この辺りの動作について開発者の意図通りになっているか確認する必要があります。

```
The module map language is not currently guaranteed to be stable between major revisions of Clang.
```

# まとめ

modulemapを用意することでCライブラリをSwiftで利用する方法についてご紹介しました。

modulemapは一発でうまくいかないこともあるので、その辺りの覚悟とセットでご用意ください。

参考資料にmodulemapの例を記載しました。

# 参考資料

- [IBM-Swift/CommonCrypto](https://github.com/IBM-Swift/CommonCrypto)
- [IBM-Swift/OpenSSL](https://github.com/IBM-Swift/OpenSSL)
- [CommonCrypto-60118.1.1 - Apple Open Source] (https://opensource.apple.com/source/CommonCrypto/CommonCrypto-60118.1.1/include/module.modulemap.auto.html)
WebエンジニアがWebRTCに関わるようになって学んだこと

# はじめに
この記事は、[WebRTC Advent Calendar 2017](https://qiita.com/advent-calendar/2017/webrtc) 13日目の記事です。

WebRTCは主にP2Pを用いた通信で相手とやりとりをします。この記事では、ApacheとPHPでWebアプリケーションを作っていた時のレベルの知識からWebRTCをやることになり、仕組みを学ぶ中で勉強した内容をまとめます。
※この記事はWebRTC初心者向けの記事になっています。

# プロトコル
Apacheでサーバーを立てる場合、ほぼプロトコル部分に手を入れることはないと思います。クライアントはHTTPセッションによってインターネットを通ってサーバーにアクセスします。
TCPはHTTPで多く（ほぼ全てで）使用されている通信で、下記のような特徴があります。

## Transmission Control Protocol(TCP)
- 3ウェイハンドシェイクによる通信の確立
- 通信が途切れた場合に再送する
- 順序を守って送信する

WebRTCは通信にUDPを採用しています（TCPも使用可能です）
UDPの特徴は以下の通りです。

## User Datagram Protocol(UDP)
- 接続は確立しない
- 通信が保証されない
- とにかくデータを送信するだけ

UDPはいわゆる必要最低限の情報しか持たずにデータ通信を行うプロトコルです。
UDPは通信を確立する仕組みや接続元を確認するような仕組みはありませんが、その分高速でリアルタイム通信に向いています。
結果、遅延の少ないビデオ通話等が実現できています。

# コーデック
通常のWebサイトで動画を扱うかはWebサイトにもよりますが、使用した場合にはサーバーにmp4(mp3)ファイルを置くかyoutubeのURLをvideoタグに入れるくらいだと思います。
HTMLはテキストファイルの通信になりますので、Webサイトだけでは映像や音声コーデックに触れる機会は少ないと思います。

ブラウザではgetUserMediaを使用することで、端末のマイク・カメラからストリームが取得できます。
WebRTCを使うことでクライアントPC同士のP2P通信が実現できますが、送受信するデータは基本的になんでも送信可能です。
getUserMediaで取得したストリームをやりとりすることで、ビデオ通話の実現が可能になります。
その際、コーデックは下記となります。（映像は選択可能です）

## 映像
- V8
- V9
- H.264

## 音声
- Opus

ただし、SafariはH.264にしか対応しておりません。

# まとめ
WebRTCはブラウザで実装された技術ですが、内部を知ることで広い分野の知識を学ぶことができます。
ここでは触れなかった技術でもSDPやDTLSなどまだまだ詳しく説明できないような技術もたくさんあります。
ぜひ、一度WebRTCに触れてみてください。
興味を持った方は、[WebRTC Meetup](https://atnd.org/groups/webrtc)など外部の勉強会に参加してみてください！
LINE Notify と IFTTT を活用して、家族の情報共有をスマートにする方法

普段の連絡は LINE などのコミュニケーションアプリを使っている方も多いかと思います。
家族間で情報共有するものといえば、仕事のスケジュール、子供のいる家庭の場合は、学校からのお知らせメール、習い事や行事等のスケジュールなどがありますよね。

これらの共有をスマートに行う方法として、[IFTTT](https://ifttt.com/) と [LINE Notify](https://notify-bot.line.me/ja/) を活用した例を紹介します。
上記サービスの詳細は、前文のリンクを辿ってください。

サービスの利用料は無料です。IFTTT 、LINE 共に世界中で使われている、素晴らしいサービスです。

## 事前準備

### 1. LINE で家族用にグループを作成する

以下、LINE のヘルプセンターから引用。
https://help.line.me/line/wap/categoryId/10000488/pc?lang=ja&country=JP

> 【グループ作成方法】
> １．「グループ　」＞「作成」を選択します
> ２．作成するグループの名前を入力します
> ３．招待するグループのメンバーを友だちから選択して、「追加」ボタンを選択します
> 
> ※グループのメンバーには招待が通知されます。相手が参加を選択しなければ、グループのメンバーにはなりません。

私は「家族」というグループにしています。

### 2. 家族用のグループに LINE Notify を追加する

以下、LINE のヘルプセンターから引用。
https://help2.line.me/line_notify/web/?lang=ja

> ID検索で「@linenotify」を検索してください。
> 
> 検索手順
> 1) LINEアプリ［友だち追加］>［ID/電話番号］より @linenotify と入力し検索
> 2)［追加］ボタンをタップ

## 活用例

以下 IFTTT を使って実現します。

### 家族用の Google カレンダーで予定を作成したら LINE に通知する

家族用の共有カレンダーを作成し、IFTTT で Google カレンダーと LINE Notify の設定をします。
Google の共有カレンダーの欠点は、マイカレンダーと違って、予定に参加しないと通知がきませんが、こちらの方法であれば LINE を通じて予定を知ることができます。

<img width="322" alt="If any new event added on 家族, then send message" src="https://qiita-image-store.s3.amazonaws.com/0/25283/f499398c-7450-9087-5085-64566dabffb7.png">

※ 家族用の共有カレンダーは「家族」という名称にしています。

また、予定のリマインドも設定することができます。

<img width="317" alt="If any event starts on 家族, then send message" src="https://qiita-image-store.s3.amazonaws.com/0/25283/77de3a1b-bb6a-f15a-998b-cd4eb668d5ad.png">

### Gmail で「家族」というラベルが付いたメールを LINE に通知する

私の場合、家族と共有するサービスには、`+family` という拡張アドレスをつけて登録し、宛先に `+family` を含んでいる場合は、「家族」というラベルを設定するようにしています。

設定方法は、Gmail のヘルプから引用。
https://support.google.com/mail/answer/22370?hl=ja

> ## Gmail エイリアスを使用する
> 
> ### Gmail エイリアスを使用してメールの自動振り分けを行う
> 
> ユーザー名の後にカテゴリを追加すると、簡単にメールを分類できます。
> 
> たとえば、次のエイリアス宛に送信されたメールはすべて janedoe@gmail.com に届きます。
> 
> - janedoe+school@gmail.com
> - janedoe+notes@gmail.com
> - janedoe+important.emails@gmail.com
> 
> #### 手順 1: エイリアスを選択する
> メールをどのように分類するか考え、各カテゴリのエイリアスを選択します。たとえば、次のように設定します。
> 
> - 仕事のメール用: yourname+work@gmail.com
> - ニュースレター登録用: yourname+news@gmail.com
> - オンライン ショッピングのアカウント作成用: yourname+shopping@gmail.com
> 
> #### 手順 2: メールの自動振り分けを行う
> フィルタを作成して、次の処理を自動で行うようにします。
> 
> - ラベルやスターを付ける
> - 別のアカウントに転送する
> - アーカイブまたは削除する

上記のラベルの設定後、IFTTT で Gmail と LINE Notify の設定をします。

<img width="316" alt="If new email in inbox labeled 家族, then send message" src="https://qiita-image-store.s3.amazonaws.com/0/25283/dcf89959-2247-19e0-e0c5-bcc1194ee25e.png">

こちらは通知するものをなるべく絞らないと、通知ばかりで確認することが億劫になる可能性もあるので注意しましょう。

## まとめ

重要なのは、やはり口頭で伝えるコミュニケーションです。

そもそも家族で会話する時間をしっかり作れていれば、今回紹介したようなソリューションは必要ないかもしれませんが、今回のソリューションを活用して手間を減らし、新たな時間が捻出されることによって、もっと有意義なコミュニケーションが取れるようになるといいかと思います。

※ どんなサービスでもありえることですが、タイムラグやエラーが発生する場合もあるので 頼り切りにならないように気をつけましょう。
cesiumでturf.js

#概要
cesiumでturf.jsやってみた。

#写真
![image.png](https://qiita-image-store.s3.amazonaws.com/0/18104/4802d6cd-7558-9893-a17c-79f78202f847.png)


#サンプルコード

```
var viewer = new Cesium.Viewer('cesiumContainer');
viewer.camera.flyTo({
    destination: Cesium.Cartesian3.fromDegrees(140.0 + 0.4, 38.0 - 1.0, 100000.0),
    orientation: {
        heading: Cesium.Math.toRadians(-20.0),
        pitch: Cesium.Math.toRadians(-35.0),
        roll: 0.0
    }
});
var latlngs = [[140.0, 38.0], [140.5, 38.0], [140.5, 38.5], [140.0, 38.0]];
var line = turf.lineString(latlngs);
var json = JSON.stringify(line); 
var url = URL.createObjectURL(new Blob([json]));
viewer.dataSources.add(Cesium.GeoJsonDataSource.load(url, {
    fill: new Cesium.Color(0, 0, 1, 0.9)
}));



```

#成果物
http://jsdo.it/ohisama1/cPp0

以上。
cesiumでgeojson

#概要
cesiumでgeojsonやってみた。

#写真
![image.png](https://qiita-image-store.s3.amazonaws.com/0/18104/3ce60ac1-2b8d-eed5-67f3-15f614a7da13.png)

#サンプルコード


```
var viewer = new Cesium.Viewer('cesiumContainer');
viewer.camera.flyTo({
    destination: Cesium.Cartesian3.fromDegrees(140.0 + 0.4, 38.0 - 1.0, 100000.0),
    orientation: {
        heading: Cesium.Math.toRadians(-20.0),
        pitch: Cesium.Math.toRadians(-35.0),
        roll: 0.0
    }
});
var line = {
    "type": "Feature",
    "properties": { 
        "line": "on" 
    },
    "geometry": {
        "type": "LineString",
        "coordinates": [[140.0, 38.0], [140.5, 38.0], [140.5, 38.5], [140.0, 38.0]]
    }
};
var json = JSON.stringify(line); 
var url = URL.createObjectURL(new Blob([json]));
viewer.dataSources.add(Cesium.GeoJsonDataSource.load(url, {
    fill: new Cesium.Color(0, 0, 1, 0.9)
}));



```


#成果物
http://jsdo.it/ohisama1/A2Yj

以上。
組織改革をする上での私なりの心得

# 概要
　私が組織の中で改善活動してきた経験を自分への備忘録としてまとめました。
また、これから自分の環境を変えて行こうと思っている方の参考になれば幸いです。

# 心得

1. どこの組織に行っても必ず問題はある  
   - 現在の組織に問題があっても、他の組織では違う部分で問題がある
   - 転職を考えるのも一つですが、自ら改善するという手段もある
2. 外の世界に話を聞きに行こう  
   - 自社の中では常識かもしれないが、世の中では非常識だったり、イケてなかったりする
   - 外の世界と接する機会を設けよう（コミュニティに参加する）  
     [DevLove](https://devlove.doorkeeper.jp/)にはかなりお世話になりました
3. 理解者を増やそう  
  - 一人で悩みや葛藤を抱え込むのは、精神衛生上よくないので、社内外問わず相談できる人を増やそう  
    理解者が増えれば声も大きくなる。さらに身近の仲間と守ってくれる上司を味方にしよう
4. プライドを捨てて、話を聞こう  
  - 現状を知るために、嫌な人や苦手な人と話しなければならない  
    変なプライドを捨てて、目的を達成するためと思ってその人たちからも話を聞きましょう
5. 変人になろう（結果的に）  
  - 問題提起したり、改善に向けた行動をした時点でおそらく変人扱いになると思います  
    ただ、それに億劫せずに自分が掲げた理想を目指して、行動しましょう
6. 自分なりの考えを持とう
  - 他で聞いたことをそのまま持ち込まずに、一度自分の考えに落とし込んでおく（自分の環境を踏まえて）
7. 情報発信をしよう  
  - 不満や提案を示すための最低限の手段  
    表現しなければ、問題ないと思われる
  - 共感を得るためにも、情報発信が必要不可欠  
    自分がどう考えているのか、なぜそう思っているのか、どうするべきなのかを伝えるためにも情報発信は必要不可欠
  - 正しい言葉を使いましょう  
    情報発信するにしても相手に誤解を与えたり、伝わらなかったりするのはもったいないので、正しい言葉を使いましょう  
    時には、ストレートな言い方を避けて表現を変える必要もあります
8. 行動しよう  
  - 口だけではなく、実際に行動して結果を見せる  
    改善を目指すなら、実行可能な最小単位で始めて効果を測るのもいい
9. 全体を見渡そう
  - 自分の周りのみならず、全体を見渡して、状況を把握した上でどうしているのか、どんな問題があるのか、どうするべきかを判断しましょう  
    自分が見えていないところで状況が全く異なることがあります
10. 忍耐が必要
  - 作業効率化と違って、場合によっては改善はすぐには成果が出ないことがあります（文化づくり）  
    その際は客観的に他にやれることはないかを考えましょう

## 番外編（ポエム）
**組織改革はオセロである**
戦略的に、かつ地道に、自分の色を増やしていく
【Google Apps Script】その8　スクリプトを定期実行し、ビットコインの1分ごとの価格を自動取得する

この記事は[Google Apps Scriptを実例交えて基礎からざっくり学ぶ Advent Calendar 2017](https://qiita.com/advent-calendar/2017/gas_beginner)　8日目の記事です。

本アドベントカレンダーは@rt_pの個人プロジェクトですが、筆者は[Ateam Brides Inc. Advent Calendar 2017](https://qiita.com/advent-calendar/2017/a-t-brides)にも参加しています。そちらでも出張版記事を書いているので、覗いていただけると嬉しいです。

# はじめに

GASを使っていると、Cronのように分単位、日単位等でスクリプトを定期実行したいと思うことが出てきます。
その時、スクリプトエディタで非常に簡単に設定できるのがGASの特長です。
クラウドで勝手に実行されるので、Excel VBAに比べて簡単かつ個人環境に依存しない定期実行が実現できるのが非常に大きな強みです。

![log.PNG](https://qiita-image-store.s3.amazonaws.com/0/199678/d59d8184-1b69-0927-995a-b1bc55a1be8d.png)

# スクリプトエディタを開く

[前回の記事で使用したスプレッドシート](https://qiita.com/rf_p/items/e903593033b76566daf0)を開きます。もし前回の記事を読まれていない場合は、新規でスプレッドシートを作成いただければ問題ありません。

スクリプトエディタを開き、以下コードに置き換えて実行します。
スクリプトエディタの開き方や*承認が必要です*メッセージが出た際の対処法が分からない場合は
[アドベントカレンダー1日目のHello, world!記事](https://qiita.com/rf_p/items/0535ec495df8f9d2b894)をご参照ください。

```javascript:timer.gs
function myFunction() {
  var bitCoinData = getBitCoinData();
  var sheet = SpreadsheetApp.getActiveSheet();
  sheet.appendRow([bitCoinData['ltp'], new Date()]);
}

function getBitCoinData() {
  var url = 'https://api.bitflyer.jp/v1/getticker';
  var response = UrlFetchApp.fetch(url);
  var json = response.getContentText();
  return JSON.parse(json);
}
```

ソースコードは、前回と1行（4行目）しか変わりません。
前回は実行時にA1:B1に値をセットしていましたが、複数回実行するとどんどん同じセルに上書きされてしまう為、今回は新しい行を追加していく方式を取りたい為です。

`myFunction()`を実行し、現在の価格がスプレッドシートに追加されることをまず確認してください。

その後、下記画像のストップウォッチアイコンをクリックします。

![timer.png](https://qiita-image-store.s3.amazonaws.com/0/199678/adcd1bcc-d6f7-af8a-c06f-dfb48636754d.png)

するとポップアップが出るので、*トリガーが設定されていません。～*部分をクリック。

![trigger.png](https://qiita-image-store.s3.amazonaws.com/0/199678/5308fd3f-b784-498b-d7b5-f31b3d9290d1.png)

その後、以下のスクショの通り設定します。

![minutes.png](https://qiita-image-store.s3.amazonaws.com/0/199678/53fe74fd-190b-6273-f714-30c2385e0de5.png)

すると、1分ごとに`myFunction()`が定期実行されるようになります。
スプレッドシートを閉じていてもクラウド上のサービスなので、問題なく定期実行されるのが嬉しい点です。

成功すると以下のように、1分ごとの価格が自動追記されていきます。

![log.PNG](https://qiita-image-store.s3.amazonaws.com/0/199678/d59d8184-1b69-0927-995a-b1bc55a1be8d.png)

# 注意点

## 初回実行は手動で起動して動くことを確認
プログラムをガリガリ書いて自動起動設定をしたけれど、ふとスプレッドシートを見ると全く実行されていないことがあります。
その場合は大抵プログラムの中でエラーが発生していたり、スプレッドシート連携や外部サービス連携に対して許可をしていないことが多いです。
最初は手動で実行し、動作することが確認できたらタイマーをセットしましょう。

## 正確な時刻の自動起動は一工夫いる
「分タイマー」の場合、毎分0秒～59秒のうちのどこかで1回実行されます。
「時タイマー」も同様に毎時0分～59分59秒のうちのどこかで…というように、恐らくGoogle側の負荷分散の為に、ピッタリ0秒や0分のタイミングで実行されるわけではありません。
できるだけピッタリの時間で実行するにはちょっと工夫が必要になるので、またどこかのタイミングで触れます。

## トリガー設定したままゴミ箱に捨てない
トリガーを設定したままスプレッドシートをゴミ箱に捨てても、トリガーは生き続けます。

# おわりに

前回紹介した外部サービス連携、今回紹介した定期実行を組み合わせることで、あらゆるデータ自動収集プログラムを書くことができます。このアドベントカレンダーでも、応用したシステムを紹介していく予定です。

本アドベントカレンダーは、1日目～9日目あたりは基礎編でGASに関する基本的な操作を紹介していきます。
10日目以降は応用編ということで、実際に作ったアプリケーションとそれに関する技術の紹介になります。お楽しみに！

# 明日

[【Google Apps Script】その9　エラーを拾う](https://qiita.com/rf_p/items/eb0cd8733132b000189a)
となります。
エラーが起きた時に何かしらの処理を実行したい場合の書き方をお伝えします。

前の記事
[【Google Apps Script】その7　ビットコインの最終取引価格を取得する](https://qiita.com/rf_p/items/e903593033b76566daf0)
次の記事
[【Google Apps Script】その9　エラーを拾う](https://qiita.com/rf_p/items/eb0cd8733132b000189a)
機械学習論文読みメモ_108


[Deformable Convolutional Networks](https://arxiv.org/abs/1703.06211)
CNNはその構造のためにgeometric transformationを行う能力が低い．
本論ではその問題に対処するためにdeformable convolutionとdeformable ROI poolingを提案する．
これらの構造は，spatial samplingを行う際の適用位置に対してoffsetが学習可能な形で適応可能にする．
これによりvision taskなどにおいて効率の良い特徴抽出が可能になる．

[Deep Neural Networks Do Not Recognize Negative Images](https://arxiv.org/abs/1703.06857)
画像分類問題を始めとして，deepnetは様々な分野で成功を収めてきた．
本論ではそうしたSOTAのモデルに対してnegative images、色を反転させたような画像，に対して
性能が有意に下がる事を示した．
こうした事実は，deepnetが対象のsemanticsを学習しているというよりも，訓練データを記憶していると
考える事が妥当であると言える根拠になりえる．
またこの事より，negative sampleはsemanticsに関連したadversarial exampleになりえる．

[Examining the Effects of Supervision for Transfer from Synthetic to Real
Driving Domains](http://vashishtm.net/pdf/drive_transfer.pdf)
従来のsemantic segmentationモデルは学習にあたって膨大なデータを必要とする．
そのためシミュレーション環境で生成されたデータを用いて大量に集めたデータによる学習
が行われるようになって来ている。
しかしそうして学習されたデータは実世界で適用した場合に低い性能になってしまう場合が一般的である．
この問題へ対処するにあたって実世界におけるデータの援用が必要になってくる．
本論では，具体的にどれくらいの実世界データがあれば，人工データでpretrainされたデータからknowledge transferが十分可能かどうかについて研究した．
結果，50枚程度の実世界画像を用いるだけど十分な性能を得る事が可能な事が判明した．
ネストしたくないときのメモ

ネストしたくないって思いながらコード書いてても、できあがったコード見るとネストしまっくているので、ネストしないためのメモ書いておく。

#ネストとは
簡単に言えばifを入れ子にしている状態のことです。

#入力検証の時によくやってしまう
```c#:before
function bool Validate(int valueA, int valueB, int valueC, EditMode mode)
{
  bool valid = true;

  //モードによって比較する計算式が異なり、値が有効か判定する
  if(mode == EditMode.Insert)
  {
    if(valueA + valueB == valueC)
    {
      valid = false;
    }
  }
  else
  {
    if(valueA + valueB < valueC)
    {
      valid = false;
    }
  }

  return valid;
}
```

if が入れ子になっています。

```C#:after_1
function bool Validate(int valueA, int valueB, int valueC, EditMode mode)
{
  bool hasError = false;

  //モードによって比較する計算式が異なり、値が有効か判定する
  if(mode == EditMode.Insert)
  {
    hasError = valueA + valueB == valueC
  }
  else
  {
    hasError = valueA + valueB < valueC
  }

  return !hasError;
}
```

ネストはなくなったけど、最後返す値を`!hasError`としているのがいやだ。

```C#:after_2
function bool Validate(int valueA, int valueB, int valueC, EditMode mode)
{
  bool valid = false;

  //モードによって比較する計算式が異なり、値が有効か判定する
  if(mode == EditMode.Insert)
  {
    valid = valueA + valueB != valueC
  }
  else
  {
    valid = valueA + valueB > valueC
  }

  return valid;
}
```

判定時の不等号を逆転させて見た。
まだ改善の余地ありそう。
ターミナルで始める「テスト駆動開発」写経のための環境構築

[Classi Advent Calendar 2017](https://qiita.com/advent-calendar/2017/classi) 13 日目の記事です。
フロントエンドエンジニアの @kasaharu です。 12 日ぶり 2 回目の投稿です。

最近社内で[「テスト駆動開発」](https://www.amazon.co.jp/%E3%83%86%E3%82%B9%E3%83%88%E9%A7%86%E5%8B%95%E9%96%8B%E7%99%BA-Kent-Beck/dp/4274217884)の読書会を始めました。(まだ 1 回だけですが…)
事前にこの本は写経向きと聞いていたので、写経する前提で始めました。

その際に、一つ大きな問題がありました。
そう、何を隠そう、ボクの Mac 上に Java が動く環境がないのです！
とは言え、写経のために IDE を入れたくないという葛藤…

というわけで、今日のテーマはターミナルで始める「テスト駆動開発」写経のための環境構築です！

# Java を入れる
* Homebrew で入れます
    * Homebrew はインストール済みの前提
        * ref. https://brew.sh/index_ja.html

```
$ brew tap caskroom/cask
$ brew cask install java
$ java -version
java version "9.0.1"
Java(TM) SE Runtime Environment (build 9.0.1+11)
Java HotSpot(TM) 64-Bit Server VM (build 9.0.1+11, mixed mode)
```
* 特に気にすることなく Java 9 が入りました :clap: 


# JUnit を入れる
* 下記から jar ファイルのダウンロードします(正直どこから取ってきたらよいか迷いました)
    * http://repo1.maven.org/maven2/org/junit/jupiter/junit-jupiter-api/5.0.2/
        * 正直どこから取ってきたらよいか迷いました…
            * **最初のつまずきポイントでした**
        * [GitHub](https://github.com/junit-team/junit5/#dependency-metadata) を見てたらそれっぽいのがあってたどり着いた感じです
    * junit-jupiter-api-5.0.2.jar をダウンロード
        * これを選択したのは、最初のテストコードが `org.junit.jupiter.api.*` をインポートしてたからです
* 任意の場所に配置します
    * 例) $HOME/sukina/basyo/junit-jupiter-api-5.0.2.jar
* CLASSPATH を設定します

```:bash_profile
export CLASSPATH=$HOME/sukina/basyo/junit-jupiter-api-5.0.2.jar
```
* あとはターミナルを再起動すれば OK です

## 1 章のコードを実行してみる

* テストコードと実装コードはそれぞれ下記の通り

```java:MoneyTest.java
package money;

import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;

public class MoneyTest {
  @Test
  public void testMultiplication() {
    Dollar five = new Dollar(5);
    five.times(2);
    assertEquals(10, five.amount);
  }
}
```

```java:Dollar.java
package money;

class Dollar {
  int amount;

  Dollar(int amount) {
  }

  void times(int multiplier) {
  }
}
```

* 実行
    * 警告は出るが(**2 つ目のつまずき**)動作は確認できました

```
$ javac Dollar.java MoneyTest.java
警告:不明な列挙型定数ですStatus.STABLE
  理由: org.apiguardian.api.API$Statusのクラス・ファイルが見つかりません
警告:不明な列挙型定数ですStatus.STABLE
警告2個
```

* ただ警告が出たままでは気になるので消しに行きます
    * 「org.apiguardian.api.API$Statusのクラス・ファイルがない」と言われているので下記のファイルを用意します
        * [org/apiguardian/api/API.java](https://github.com/apiguardian-team/apiguardian/blob/3660992c22db9b09c8c6c4fc3b9524b52128541a/src/main/java/org/apiguardian/api/API.java)

```
$ javac Dollar.java MoneyTest.java
(消えたっ！)
```

* (書籍の流れと逆走するが) Dollar.java の amount フィールドの実装を消すとちゃんと期待したところでエラーが出ます

```
$ javac Dollar.java MoneyTest.java
MoneyTest.java:11: エラー: シンボルを見つけられません
    assertEquals(10, five.amount);
                         ^
  シンボル:   変数 amount
  場所: タイプDollarの変数 five
エラー1個
```

## まとめ

と、言うわけで IDE を用意せず写経する準備ができました。
張り切って読書会をしていこうと思います！

明日は @spin13 さんです！乞うご期待！
【Google Apps Script】その7　ビットコインの最終取引価格を取得する

この記事は[Google Apps Scriptを実例交えて基礎からざっくり学ぶ Advent Calendar 2017](https://qiita.com/advent-calendar/2017/gas_beginner)　7日目の記事です。

本アドベントカレンダーは@rt_pの個人プロジェクトですが、筆者は[Ateam Brides Inc. Advent Calendar 2017](https://qiita.com/advent-calendar/2017/a-t-brides)にも参加しています。そちらでも出張版記事を書いているので、覗いていただけると嬉しいです。

# はじめに

最近話題の仮想通貨。
その代表的なビットコインの価格を、スプレッドシートで自動取得してみたいと思います。

今回は代表的な取引所であるbitflyerのAPIを利用します。

![bitcoin.PNG](https://qiita-image-store.s3.amazonaws.com/0/199678/ada012af-6404-a03e-c847-a98f3566d007.png)

# APIを叩く

> https://api.bitflyer.jp/v1/ticker

上記URLをブラウザで開くと、ltp（最終取引価格）を含むTickerがJSONで返されます。

参考：https://lightning.bitflyer.jp/docs?lang=ja#ticker

つまりこのAPIにGASからリクエストを送り、受け取ったJSONデータを整形すればスプレッドシートに転記できそうですね。

# スクリプトエディタを開く

まずスプレッドシートを新規作成します。

そしてスクリプトエディタを開き、以下コードに置き換えて実行します。
スクリプトエディタの開き方や*承認が必要です*メッセージが出た際の対処法が分からない場合は
[アドベントカレンダー1日目のHello, world!記事](https://qiita.com/rf_p/items/0535ec495df8f9d2b894)をご参照ください。

```javascript:get_bitcoin.gs
function myFunction() {
  var bitCoinData = getBitCoinData();
  var sheet = SpreadsheetApp.getActiveSheet();
  sheet.getRange('A1:B1').setValues([[bitCoinData['ltp'], new Date()]]);
}

function getBitCoinData() {
  var url = 'https://api.bitflyer.jp/v1/getticker';
  var response = UrlFetchApp.fetch(url);
  var json = response.getContentText();
  return JSON.parse(json);
}
```

実行結果は以下の通りです（実行タイミングにより、最終取引価格や日時は当然変動します）。

![bitcoin.PNG](https://qiita-image-store.s3.amazonaws.com/0/199678/ada012af-6404-a03e-c847-a98f3566d007.png)

やっていることは非常にシンプルです。
`getBitCoinData()`を呼び出し、その中で`UrlFetchApp.fetch()`を呼んでいます。

>  fetch(url) 

https://developers.google.com/apps-script/reference/url-fetch/url-fetch-app#fetch(String)

これはURLにリクエストを送り、HTTPレスポンスデータを返すというシンプルかつ強力な機能です。
今回はシンプルにリクエストを送っただけですが、パラメータを含めたりGETではなくPOSTで送ったり、ヘッダを含めたり…等、curlコマンドのような使い方ができます。今後の記事で触れていきます。

今回は`UrlFetchApp.fetch()`によりbitflyerのAPIから、TickerデータがJSONで返ってきました。
それをJSONにparseし、`setValues()`でスプレッドシートにセットしているシンプルな実装です。

本来は、より正確な時刻（Tickerデータのtimestamp）を日時としてsetValueしたいところなのですが、[4日目の日付フォーマット記事](https://qiita.com/rf_p/items/ff841885ef6346afe5d4)で書いたようにGASで正確な日時をセットするのはしんどいので、今回は単純に`new Date()`で現在の日時をセットしています。

`setValues()`は二次元配列を渡す必要があるので、`[[]]`で囲っている点にご注意ください。

今回は短いですが以上です。

# おわりに

`UrlFetchApp.fetch()`は非常によく使う機能なので、今後の記事でたくさん出てくる予定です。

本アドベントカレンダーは、1日目～9日目あたりは基礎編でGASに関する基本的な操作を紹介していきます。
10日目以降は応用編ということで、実際に作ったアプリケーションとそれに関する技術の紹介になります。お楽しみに！

# 明日

[【Google Apps Script】その8　スクリプトの定期実行する](https://qiita.com/rf_p/items/267a8d9daa8c9f1ef027)
となります。
今回のスクリプトを自動実行し、1分ごとの価格を記録していく仕組みを作ります。

前の記事
[【Google Apps Script】その6　スプレッドシートを誰がいつ開いたか記録する](https://qiita.com/rf_p/items/5b1a13c44da703628719)
次の記事
[【Google Apps Script】その8　スクリプトを定期実行し、ビットコインの1分ごとの価格を自動取得する](https://qiita.com/rf_p/items/267a8d9daa8c9f1ef027)
AS-289R2プリンタシールドをArduino 101でBLE化した話

とある船上ハッカソンで、ナダ電子製AS-289R2プリンタシールドをArduino 101でBLE化したので、ちょいとまとめます。

#使用物

##AS-289R2プリンタシールド
ナダ電子株式会社から発売されている、感熱式プリンタのシールドで、レジについている、レシートを印刷するプリンタのような物です。
いわゆるANK文字、第二水準までの漢字やJIS非漢字に加えて、QRやバーコードも印字可能です。
メーカーサイト： http://www.nada.co.jp/as289r2/

##Arduino 101
2016年に発売された、Intel Curieモジュールを搭載したArduinoです。
BLEに加えて、6軸加速度センサー、ジャイロスコープ等を搭載した便利なボードでしたが、2017年7月にIntelがCurieの生産終了を発表、Arduino 101も販売終了、在庫限りとなってしまいました。
メーカーサイト： https://store.arduino.cc/usa/arduino-101

Arduino IDEで101を使う際には設定等必要になりますので、下記サイトを参考にして下さい。
https://www.arduino.cc/en/Guide/Arduino101

##電源など
AS-289R2は、Arduinoからの電源供給ではプリンタが動作しないため、5V、3.0A以上の外部電源必須です。
共立エレショップの商品ページでは、ACアダプタとDCジャック変換コネクタを勧めていますね。
http://eleshop.jp/shop/g/gG16311/
私は、これと同じものを共立シリコンハウス店頭で買って使用しました。

#接続
AS-289R2はシールドなので、Arduino 101にシールドとして刺せば良いのですが、その前に設定を変更します。
Arduino 101は動作電圧が3.3Vのため、AS-289R2のJP5を1-2から2-3に切り替えて、3.3Vにします。
参照： http://www.nada.co.jp/as289r2/support_arduino.html
JP5を変えるには、いったんネジを外してAS-289R2をバラす必要があります。
シールドからArduino 101に電源供給するようにしたい場合は、JP1をショートしておきます。

#スケッチ
BLEから1バイトずつ受け取ってプリンタに送るスケッチを置いておきます。
注意点としては、BLEからの受信をloop()内でやると取りこぼすことが有ります。
これでちょっとハマりました。 orz
データ受信はイベントハンドラで行いましょう。

``` Arduino
#include <CurieBLE.h>

#define SERVICE_UUID        "19B10010-E8F2-537E-4F6C-D104768A1214"
#define CHARACTERISTIC_UUID "19B10011-E8F2-537E-4F6C-D104768A1214"

BLEService blePrintService(SERVICE_UUID);
BLECharCharacteristic blePrintCharacteristic(CHARACTERISTIC_UUID, BLEWrite);

void setup() {
  Serial1.begin(9600);

  // begin initialization
  BLE.begin();

  // set the local name peripheral advertises
  BLE.setLocalName("BlePrint");

  // set the UUID for the service this peripheral advertises:
  BLE.setAdvertisedService(blePrintService);

  // add the characteristics to the service
  blePrintService.addCharacteristic(blePrintCharacteristic);

  // add the service
  BLE.addService(blePrintService);

  blePrintCharacteristic.setValue(0);

  // start advertising
  BLE.advertise();

  blePrintCharacteristic.setEventHandler(BLEWritten, characteristicWritten);
}

void loop() {
  // poll for BLE events
  BLE.poll();
}


void characteristicWritten(BLECentral& central, BLECharacteristic& characteristic) {
  while (blePrintCharacteristic.written()) {
    int v = blePrintCharacteristic.value();
    Serial1.write(v);
  }
}
```

あとは、iPhoneアプリなどを適当に書いて繋ぎましょう。
では、良い印刷生活を！！
【ネタ】プロセスをケアしてエンジニアのイメージアップを図る

# エンジニアの使う言葉は物騒
巷ではアース製薬が殺虫剤を虫ケア用品にしたらしいじゃないですか。
マイナスイメージを払拭するのが狙いらしいですね。
[アース製薬、「殺虫剤」の呼び方を「虫ケア用品」に変更　人体や環境にやさしいイメージに - ねとらぼ](http://nlab.itmedia.co.jp/nl/articles/1711/29/news113.html)

ところでエンジニアの使う言葉も傍から聞けば結構物騒だと思うんですよね。
「プロセスを殺す」「APIを叩く」「スクリプトをキックする」
「親を殺せば子も死ぬ」「ゾンビを殺す」

・・・そうだ。
アースを見習って我々もプロセスもケアすればいいのでは？
~/.bashrcに１行書き足せば終わりです。

```
alias care='kill'
```

あとはケアすればプロセスが「いないない」できます。
これで物騒な言葉を使わずに済み、イメージアップ。つまり今日からモテモテです。

…誰得なんだこれ
【豆知識】MediaStreamAPIのdeviceIdとchooseDesktopMedia()のstreamId

ちょっと細かい話となってしまいますが、知っておいて損はないと思いますので投稿しました。

## MediaDeviceのdeviceIdは固定(不変)
navigator.mediaDevices.enumrateDevices()で取得されるカメラやマイクといった外部デバイス(MediaDevice)のdeviceIdは不変なもので、ブラウザーのリロードや再起動、またはシステムを再起動しても、デバイスごとに同じdeviceIdが割り振られます。

## DesktopMediaのstreamIdは動的(1回のみgUM()可能)
それに対して、Chrome拡張機能のAPIであるchooseDesktopMedia()で取得されるstreamIdは、chooseDesktopMedia()実行するごとに同じスクリーンやウィンドウを選択したとしても違う値が割り振られ、また、1回getUserMedia()でストリームを取得したら、2回目以降同じstreamIdでgetUserMedia()でストリームを取得しようとしてもできません。

## Firefoxのスクリーンキャプチャーでは？
そもそも、deviceIdやstreamIdといったものが実装上において扱うことがありません。また、取得されたストリームのvideoトラックからgetConstraints()を実行しても、deviceIdは空のオブジェクトとなります。(chromeのchooseDesktopMedia()ではgetConstraints()で、deviceIdプロパティでstreamIdが取得できる)

## ちなみにScreen Capture APIでは
現在、Screen Capture APIの仕様が標準化に向けて策定中ですが、Firefoxのスクリーンキャプチャーに近いものとなっており、deviceIdについても策定中の仕様において言及されており、deviceIdは利用者側では扱わないよう策定されています。
[仕様のdevice-identifiersの項目](https://www.w3.org/TR/screen-capture/#device-identifiers)

## つまり
ユーザーが選択したカメラやマイクを保持しておけば、リロードや再起動されたとしても(ユーザーの操作なしに)即座に前の状態に復帰させることが可能ですが、スクリーンキャプチャーの場合は、リロードや再起動するごとに、再度、ユーザーに選択させなければなりません。
たぶん、セキュリティー上このような仕様となっているのだと思います。
そこそこの規模のGo言語開発に使っているパッケージレイアウトの例


Lenetという生活サービスのエンジニアをやってるカイ（@kai-zoa）です。
ちなみにディープラーニングの方のLeNetとはなんの関係もございません。読み方も違います。

で、Lenetの一部のサービスでは、3年程前からAPIをGoで実装していて、ディレクトリの掘り方からパッケージ間の依存に関するルールについて長いこと苦慮してきたのでまとめてみます。（今回は触りまで…）

コメントでも直接でも指摘があると大変ありがたいです。

#コンセプト

下記のようなポイントを抑えていってるつもりです。
※DDDでよく言ううように事業の特定領域や業務に関するレイヤーをここではドメイン層と呼びます

- ドメイン層のロジックと外部との入出力（インフラ層）まわりのロジックは明確に分けたい
- 特定のフレームワークを前提にしない
- ルールに従えば循環インポートの迷路に迷い込まない
- ヘキサゴナルアーキテクチャとかクリーンアーキテクチャの雰囲気を持ちつつGoらしさを維持したい（改善の余地ありな気がしてる）

#サンプルコードについて

JSONを返す簡単なWEBサーバーを作ります。

```shell-session
$ curl http://localhost:8080/today.info
{"ok":true,"year":2017,"month":12,"day":13}
```

本日の年月日がJSONで返ってきます。

#ディレクトリレイアウトと各パッケージについて

[github.com/kaizoa/go-arch-example](https://github.com/kaizoa/go-arch-example)

```shell-session
$ tree
.
├── app/
│   └── today.go
│
├── bootstrap/
│   └── today.go
│
├── domain/
│   └── today/
│       ├── models.go
│       └── usecase_info.go
│
├── middleware/
│   ├── http/
│   │   ├── router.go
│   │   └── serve.go
│   ├── os/
│   │   └── now.go
│   ├── now.go
│   ├── router.go
│   └── M.go
│
├── web/
│   └── today.go
│
└── main.go

8 directories, 13 files
```

##web/ - HTTPハンドラの実装（インフラ層）
HTTPリクエストに応答するための`net/http.Handler`の実装をする。
基本的には応答するjsonのレイアウトはこのパッケージで定義して、外部にも出したくない。

##app/ - アプリケーション層
インフラ層の実装をインジェクトする構造体を実装する。
依存関係の緩衝地帯のように使い方になる。

##domain/ - ドメイン層
事業の特定領域や業務に関するロジックを書くところ
といっても今回は現在時刻から年月日オブジェクトへの変換を行うのみ。

```go:domain/today/usecase_info.go
package today

import "time"

type InfoOutput struct {
	Year int
	Month time.Month
	Day int
}

type InfoUseCase struct {
	Now Now
}

func (u *InfoUseCase) Get() *InfoOutput {
	// 現在時刻から年月日オブジェクトへの変換を行う
	now := u.Now.Time()
	out := &InfoOutput{}
	out.Year, out.Month, out.Day = now.Date()
	return out
}
```

##middleware/ - ミドルウェア
ドメイン層とは直接の関わりを持たない技術的な機能の実装をパッケージにしている。
OSの機能にアクセスするためのパッケージなど、フレームワークが実装しそうな機能、特定サービスへの通信クライアントを実装することが多い。

##bootstrap/ - ブートストラップ
起動時に呼び出されるサービスごとの関数を実装する。
この関数内でmiddlewareに依存したインフラ層の実装を初期化して、アプリケーション層、ドメイン層に渡すことで依存性の注入を行い、依存の反転を実現する。

#依存グラフ

![依存グラフ (1).png](https://qiita-image-store.s3.amazonaws.com/0/27339/7cebb578-cb75-f31f-c89e-48d9f0af592e.png)

#コードを追ってみる

*書いてる途中です、すいません*

#続きを書きたい…

今回は簡単な例にとどめてるので、より実践的なことについては別に書こうと思います。

- 他の外部インターフェイス実装の例（mysql, gRPC）
- 複数システム・サービスをまとめるときの例
- etc

気力があれば…
Angular CLI の EasterEgg 他

この記事はAngular AdventCalendar 2017 の記事です。
Angular CLI の EasterEgg について紹介します。

# Angular CLI
Angular CLI は [Ember-cli](https://ember-cli.com/)をベースに作られ、webpackやテンプレートから各土台となるファイルを生成する機能や開発サーバーの起動、ビルド、テスト機能を有したAngularの開発をシンプルにする言わば全部入りのツールです。

このAngular CLIをこれまで使わないで開発をしてきたのですが、webpackのアップデートなどメインの開発とは関係がない部分で時間を取られてしまっていました。元々Angular CLIについては知っていたのですが開発の進行状況などから使えるものなのか判断しづらく使用には至っていませんでした。

しかし、[公式のクイックスタート](https://angular.io/guide/quickstart)ではいきなりAngular CLIのインストールから始まります。  `-g` がついているのでglobalへのインストールをしなければいけません。 -g をつけずにパッケージ管理すると `ng new`時に怒られるので注意が必要です（体験談）

# globalが辛い時

WebpackはAngular CLIに内包されていますが、設定を外に出すことが出来ます。
この時、

```
ng new hoge
cd hoge
ng eject
```

を実行することで、webpackの設定を外に出した上に、angularの依存関係もバッチリpackage.jsonに出してくれます。
これで、全てをpackage.jsonで管理できるので安心です。

```
npm install --save-dev @angular/cli@latest
npm install --save-dev typescript
```

もしもうまくいかない時は上記コマンドを `ng new`の前に実行してみてください。

# 疑ってかかるAngular CLI

それでも不安なAngular CLIについて心配だったので中身を見てみることにしました。

```
cd $(npm root -g)/@angular/cli
```

で、cliがあるディレクトリに行きます。

```
.
├── CONTRIBUTING.md
├── LICENSE
├── README.md
├── bin
├── commands
├── ember-cli
├── lib
├── models
├── node_modules
├── package.json
├── plugins
├── tasks
├── upgrade
└── utilities
```

中身はこのような構成でした。
色々と見ていると**あるもの**を発見しました。

<img width="481" alt="スクリーンショット 2017-12-13 4.41.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/210850/b7e3a008-1126-955e-39e7-220bf90ec120.png">

コマンド系はこのファイルに保存されているようで、どのようにしてコマンドが呼び出されているのか確認できます。
そして見つけた `easter-egg` の文字。

これからAngular CLIはたくさん使っていく予定なのでせっかくだからこのEasterEggも叩いてみようと思います。

## 叩いた→すでにawesomeです

![image.png](https://qiita-image-store.s3.amazonaws.com/0/210850/0e9e2cfd-58ed-e96c-a2fb-067844a57ea2.png)

すでにawesomeでした。
どうやらランダムに返ってくる結果が変わるようです。

## 更に叩いた→Error 418
![image.png](https://qiita-image-store.s3.amazonaws.com/0/210850/dc9aa17e-68da-d41e-7017-372cc9ad55d5.png)
Error418というのは、 [HTTPで「418 I’m a tea pot」を実装してはいけない](https://qiita.com/flano_yuki/items/ea251ac6b53bc54677d2) で紹介されている Error 418 だと思われます。
Hyper Text Coffee Pot Control Protocolであって、HTTPのステータスコードではないため削除のIssueが投げられているようです。しかし、`As Awesome As Can Get`がどう`I'm a tea pot` とかかっているのか不明でした。

# 他にもあります。
他にもいくつかメッセージがあったので、ぜひ直接試してみてください。