OmniAICreator/Qiita-1.07M huggingface dataset:
ARMテンプレートでリソースグループをコピーしてみた

検証環境・本番環境など、環境毎に同様の構成でリソースグループを作成する必要があり、Azureポータルの「Automationスクリプト」メニューで得られるResource Managerテンプレート（以下、「テンプレート」と記載）を使って別環境を構築してみました。

本稿では、やってみて判ったハマりどころを踏まえ、上記要件に対するより良いアプローチを考察します。

## 前提

ARMの概念・用語をきちんと理解しないとテンプレート利用の理解が難しくなるため、正確に理解したい場合はまず[公式サイトの説明](https://docs.microsoft.com/ja-jp/azure/azure-resource-manager/resource-group-overview)を一読しましょう。

ちなみに、Azureポータル上では「Automationスクリプト」というメニューから選択中のリソースグループの構成をテンプレートとして出力できますが、テンプレートはAzure Automationの機能でなく、Resource Managerの機能です。「Azure Automation」でネット検索してもテンプレートの情報はヒットしないので、注意しましょう。

## 実施概要
1. Azureポータルの環境Aの「Automationスクリプト」メニューから、環境Aの構成を表すテンプレートおよびパラメータファイルを取得
2. Visual Studioで、取得したテンプレート・パラメータファイルを環境Bのものとしてアレンジ  
→ リソース名や環境毎に異なる接続先URLなど
3. Visual Studioで、環境Bのリソースグループを作成後、環境Bに変更したテンプレートをデプロイ
4. エラーが色々出るので、修正して再デプロイ

何度か再デプロイを繰返すことで、環境のコピーは完了しました。

## ハマりどころ
* 「Automationスクリプト」の出力には、リソースの構成すべては出力されない
    * 例えば、App Serviceの「アプリ設定」は出力されない
        * 試しに、[Azure Resource Explorer](https://azure.microsoft.com/ja-jp/blog/azure-resource-explorer-a-new-tool-to-discover-the-azure-api/)でARMのREST APIがどのようなJSONを出力しているか確認したところ、それらしい項目として、properties.siteProperties.appSettings=nullがあった。しかし[リファレンス](https://docs.microsoft.com/ja-jp/azure/templates/microsoft.web/sites)を見ると、「アプリ設定」に対応する要素はproperties.__siteConfig__.appSettingsと記載されていて、properties.__siteProperties__.appSettingsという項目は定義が無い・・
        * properties.siteConfig.appSettingsを追記してデプロイすれば、期待通り「アプリ設定」は設定された
* 「Automationスクリプト」の出力時に「◯◯のリソースを取得できませんでした。この種類のリソースはエクスポートされません。」というエラーメッセージが出るが、実際には出力されているものも多数。しかし、それを残してデプロイするとInternal Server Errorが発生したり、デプロイのレスポンスが長時間返ってこなかったりしたので、手作業で削除する必要がある
* 元の環境で発行された値で、残したままデプロイすると、デプロイ時の指定が許可された値ではないとしてエラーになるものがある
    * SQLデータベースの「databaseId」や「creationId」など
* 環境毎に値を変更すると考えられる設定値はパラメータファイルに切り出されて出力されているはずだが、アプリケーションゲートウェイの振り分け先URLなどパラメータに切り出されていない
    * 出力されたテンプレートファイルのうち、どの値を変更すべきか、すべて目視でチェックする必要がある
        * デフォルトで設定された項目もすべてテンプレートに記載されるため、チェックの労力はかなり大きい

## 考察
「Automationスクリプト」メニューの出力は、一言で言うと「一部欠落があるリソースグループのスナップショット」です。環境コピーに使うのは結構つらい作業でした。ある程度ミスが許される状況においては選択肢となりますが、正確さが求められる実運用では使えないとの所感です。

後で気付きましたが、公式ドキュメントの[既存のリソースから Azure Resource Manager テンプレートをエクスポートする](https://docs.microsoft.com/ja-jp/azure/azure-resource-manager/resource-manager-export-template)でも、色々課題がある旨、記載がありますね。Azureポータルの「Automationスクリプト」メニューでは「Azure Resource Manager テンプレートを使用して、1 つにまとめられた操作でリソースのデプロイを自動化します」などと表示されますが、色々できそうだと夢を膨らませてはいけないようです・・

当初、本稿の最初に記載した要件への対応として、以下の運用をできないだろうかと考えました。

1. AzureポータルからリソースグループAの構成を設定
2. リソースグループAの構成をエクスポート
3. エクスポートしたファイルをリソースグループBの構成に変更
4. リソースグループBをインポート

やってみた結果、上記運用はかなわないことがわかったので、地道に以下の運用をするしかないかな、というのが現時点の考えです。

1. 環境毎に差異がある項目をパラメータに切り出したテンプレートを作成  
→ かなり大変なはず。開発時は、まずはAzureポータルで構成してみる場合が多いと思うが、同じ構成を表すテンプレートを、[リファレンス](https://docs.microsoft.com/ja-jp/azure/templates/)やAutomationスクリプトの出力を参考にしつつ、手作業でおこす必要がある
2. リソースグループA向けのパラメータファイルを作成してデプロイすることで、リソースグループAを作成する
3. リソースグループBを作成したい時は、リソースグループB向けのパラメータファイルを作成してデプロイして対応する

もっと良い方法などありましたら、コメントでご教示いただけると助かります (^_^
pug-cliで_がついたファイル（_header.pug）やディレクトリ（_include）もコンパイルされてしまう問題を解決する

# はじめに
`npm install pug-cli`でインストールしたpug-cliでpugをコンパイルすると、`_`がついたファイルやディレクトリもコンパイルされてしまうため、その解決策を記載した記事になります。

結構前から話題になっていたようですが、自分は今日まで知らなかったため記事として書きました。

## 問題の現象

以下のようなディレクトリ構造で

```
.
├── package.json
├── public
└── src
    ├── _include
    │   └── _header.pug
    └── index.pug
```

`npm install pug-cli`でインストールしたpug-cliでコンパイルを実行すると

```bash
pug src -o public
```

`public`ディレクトリに`_include`や`_header.html`も出力されてしまう。

```
.
├── package.json
├── public
│   ├── _include
│   │   └── _header.html
│   └── index.html
└── src
    ├── _include
    │   └── _header.pug
    └── index.pug
```

## 解決策
現在npmにあがっている`pug-cli 1.0.0-alpha6`に問題があるため、インストール先を変更する。

```bash
npm i github:pugjs/pug-cli#master
```
上記のpug-cliを実行すれば以下のように正常にコンパイルされる。

```
.
├── package.json
├── public
│   └── index.html
└── src
    ├── _include
    │   └── _header.pug
    └── index.pug
```
DXRubyのススメ

#はじめに
この記事はRuby Advent Calendar 2017 の14日目です。

[<< RubyGemコードリーディングのすすめ](https://blog.freedom-man.com/try-rubygem-codereading/) || [Rubyでクリエィティブコーディング >>](https://qiita.com/enkatsu/items/3656216ae77979555fa2)

#DXRubyって？
Rubyを使って、Windows向けのゲームが簡単に作れるDirectXライブラリです。

Ruby 2.1.x/2.2.x/2.3.x にて利用することができます(ただし、32bit版のみ)

[Rubyist Magazine](http://magazine.rubyist.net/?0027-DXRuby) でも取り上げられてたことがあるので、ご存知の方もおられると思います

公式ページは[こちら](http://dxruby.osdn.jp/)
制作者は [mirichi](https://twitter.com/mirichi) 氏


#何がいいの？

何といっても、Rubyでゲームが作れるところですね！
Rubyの自由かつストレスのないコーディングで、気楽にゲーム制作ができるのはかなり助かっていますねー。

おまけに、コードそのものもかなり短く済むのも有難いところです。
如何せん、C/C++などでゲームを制作するとそれなりのコード量になってしまいますし(単に、私のコードの書き方がアレなだけだとは思いますけど……)


それに、パッと思いついたコードを気軽に試しつつ、ゲームが作れるので初心者にもおすすめの開発環境でもあります。

特に、当たり判定などは 後述する === を使うことで実装できるので便利ですねー。

それと、個人的にはノベルゲームを作ることが多いので、Rubyの正規表現を使えるので助かっていますねー。

#どんなものが作れるの？

一応、こんなものが作れます。

。
![sampleSTG.gif](https://qiita-image-store.s3.amazonaws.com/0/191521/65a54110-68d2-daaf-8ac4-29c2719952c7.gif)



自機や敵機は Sprite クラスを継承して使うことで 当たり判定などを書かずに済ませています。
Sprite クラスにはSprite.check というクラスメソッドがありまして、これを使うことで面倒な当たり判定を簡単に実装できます。

また、単に player === enemy でも衝突したかどうかを判定することが可能です。

個人的には、当たり判定などが絡みやすいシューティングゲームやアクションゲームなどは作りやすいと思っています(時間さえあればもっとキッチリとしたものに仕上げたい……)

ソースは、[こちら](https://github.com/S-H-GAMELINKS/DXRuby.SampleSTG)にて公開してます。


あとは、こんなものもパパっと作れますねー

![sampleMapSystem.gif](https://qiita-image-store.s3.amazonaws.com/0/191521/4be33af9-6349-dc84-61db-4b5baed00de3.gif)

これはウチのサークルで制作中のノベルゲーム用にマップでの移動システムを実装したものですね。
マウスの位置を追跡する形で、透過された画像が移動しています。
その画像と、マップ上の赤い画像が接触した時だけ地名が表示されるようになっています。

この方法をうまく使えば脱出ゲームなどのクリッカブルをDXRubyで実装することが可能ですねー。

もちろん、実際のゲームではクリックすることでその場所を訪れるイベントへと移行します。

なお、ソースは[こちら](https://github.com/S-H-GAMELINKS/DXRuby.ADV.map_sample)



#おわりに

ゲームをメインで作っている身からすると DXRuby は短いコードで直感的に実装できるので非常に助かっています。

あと、「Rubyをやってみたいんだけど……」と聞かれた時は大体 Ruby + DXRuby でのミニゲーム制作をオススメしてますねー。

結構簡単に、自機操作や当たり判定が実装できるので初心者にはかなり敷居が低めなのでオススメできますし

なにより、そう訪ねてこられる方は大体 Windows PC ですので、Ruby と DXRuby が一緒にインストールできるインストーラーがあることもあり、薦めていますねー
Docker + WebDriverIO + Chrome headlessでお手軽E2Eテスト

こんにちは、E2Eテストしてますか？
実際どのくらいの人がテストしてるんでしょうね。
何を使ってるんでしょうね。

自分は以下のポイントを重視して、 `WebdriverIO + Mocha + Chai` を選択してます
- テストの書きやすさ
- Chrome headlessを簡単に使える
- CLIで動作する

CircleCIなどと連携しておけば完璧ですね！

## とりあえず動かしたい

簡単に動かすなら Docker ですね！
準備してみました。
ちょっとサイズ大きめです。。。

```
docker pull skozo/webdriverio-chrome-headless
```

[webdriverio-chrome-headless](https://hub.docker.com/r/skozo/webdriverio-chrome-headless/ "webdriverio-chrome-headless") 

## 実行準備

### 必要なファイル群を設置します。

`node_modules` などを取得するので、適当なディレクトリで以下のコマンドを実行してください。

```
docker run -it --rm -v $(pwd):/app skozo/webdriverio-chrome-headless init
```

出てくる選択肢は以下をとりあえず選んでおいてください。

```
? Where do you want to execute your tests? (Use arrow keys)
❯ On my local machine

? Which framework do you want to use? (Use arrow keys)
❯ mocha

? Shall I install the framework adapter for you? (Y/n)
❯ Y

? Where are your test specs located? (./test/specs/**/*.js)
❯ ./test/specs/**/*.js

? Which reporter do you want to use?
❯ dot

? Do you want to add a service to your test setup?
❯ selenium-standalone

? Level of logging verbosity (Use arrow keys)
❯ silent

? In which directory should screenshots gets saved if a command fails? 
❯ ./errorShots/

? What is the base url?
❯ http://localhost
```

### テストコード用ディレクトリの作成

`Where are your test specs located?` で入力したディレクトリを作成しておいてください

```
mkdir -p test/specs
```

### テストコード用ファイルの作成

テストコード用ディレクトリに jsファイルを設置してください。

```
touch test/specs/main.js
```

```
// サンプル
var assert = require('assert')
var should = require('chai').should();

describe('example page', function() {
  it('example', function() {
    // トップページ
    browser.url('http://example.com')
    title = browser.getTitle()
    title.should.equal('Example Domain')

    browser.saveScreenshot('example.png');
  })
})
```

### 設定ファイルの編集

WebdriverIOのデフォルトではFirefoxを利用してテスト実行するように設定されてます。
Chromeに変更しましょう

`capabilities` という項目があるので、以下に置き換えてください

```wdio.conf.js
    capabilities: [{
        maxInstances: 5,
        browserName: 'chrome',
        chromeOptions: {
            args: ['--headless', '--disable-gpu', '--no-sandbox', '--window-size=1920,1080'],
        }
    }],
```

## いざ！テスト実行！

```
docker run -it --rm --cap-add=SYS_ADMIN --shm-size=128m -v $(pwd):/app skozo/webdriverio-chrome-headless wdio
```

`1 passing` と表示されて、ディレクトリに `example.png` が出力されていればOK!

## その他

テストこけたときに自動的にScreenshotを保存したい！
以下のようなコードを書きます

```wdio.conf.js
    afterTest: function (test) {
        if (test.passed) {
            return;
        }
        var filename = encodeURIComponent(test.title.replace(/\s+/g, '-'));
        var filePath = this.screenshotPath + filename + '.png';
        browser.saveScreenshot(filePath);
    },
```

## いいテストライフを！
位置取得系のAPIを使わずに、ある座標が日本か否か判定する

## tl;dr
日本の領海を2次元の多角形で書いて、その多角形の内外判定により日本かどうかを判別します。

## やりたかったこと
[Snapmap](https://snapmap.jp)では投稿された写真がどこで撮影されたかにより、処理を分岐しています。
その過程で、ある座標が日本国内に位置するかどうかを利用制限なくタダで判定したかったのです。
　（Googleなどの有料APIを使いたくなかった）


## アプローチ
- 日本の領海を2次元の多角形で書く
- この多角形の各点を座標と結びつける
- そうすると、指定した座標が多角形の中にいるのか外にいるのかという判断で、日本の領海内かどうかを判別できる。

## 注意事項
- 日本が島国という点を生かしたアイデアです。
- 多角形を自分で描くので、国境などの細かいところまでは判定させるのは現実的ではありません。
日本は島国なので、判定したい座標が陸地である限り上記の問題は無いに等しいため、このアプローチが利用できます。
- 以上のことから島国ではない国や、都道府県などに範囲を縮小して（例えば東京都内かどうかの判定など）への応用は難しいです。
- ~~中国やロシア、韓国などとトラブルを起こさないようにしましよう~~

## 内外判定の実装
Winding Number Algorithmを使用しています。私は詳しく説明できるほど詳しくないので、以下のリンクを参考にしてください。
[【第2回】点の多角形に対する内外判定](http://www.nttpc.co.jp/technology/number_algorithm.html)

## 実装手順
### 日本の多角形を描く
GoogleMapのマイマップ機能で図形を描けますので、この機能を利用し図形を描きます。
図形を描いたあと、KMLファイルでその図形をDLでき、そのKMLファイルの中に図形の各点の座標が記録されているので、その座標を利用します。

### ロジックを作る(ruby)
in? メソッドで内外判定ができます。y=緯度、x=経度、p=多角形を表す配列です。今回のテーマでは、pが日本の領海を表現しています。pは以下のように緯度と経度をいくつも持つ配列です。各点を結ぶ順番は、配列の順番で表現されるので配列の順番は意図した通りに並んでいる必要があります。

前項でDLしたKMLファイルから取得した座標は、線を描く時に設定した点を、打った順番通りに出力してくれるので、基本的にはそのままの順番で問題ありません。

```ruby
[
  [130.3274316, 30.9552693], # 緯度, 経度
  [130.3368706, 31.0346679],                                                               
  [130.1881978, 31.0875757],
  ... 
]
```

```ruby
    def in?(y, x, p)
      last = p.size - 1
      last = p[0][0] == p[last][0] && p[0][1] == p[last][1] ? last - 1 : last
      j = 0
      clockwise = 0
      winding_number = 0

      last.downto(0) do |i|
        yi = p[i][1] - y
        yj = p[j][1] - y

        if (yi > 0) != (yj > 0)
          xi = p[i][0] - x
          xj = p[j][0] - x

          if (clockwise = sign(yj, yi)) == sign(yj * xi, yi * xj)
            winding_number += clockwise
          end
        end

        j = i
      end

      winding_number.odd?
    end

    def sign(a, b)
      if a > b
        1
      elsif a < b
        -1
      else
        0
      end
    end
```
指定時間までhtaccessでトップページ系をすべてリダイレクトする

スラッシュ無し・スラッシュ有り・index.htmlをリダイレクトする。

```
http://localhost
http://localhost/
http://localhost/index.html
```

下記で時間指定・トップページ系すべてリダイレクト可能。

```
RewriteEngine On
RewriteCond %{TIME} <20171207000000
RewriteRule ^(/)?(index\.html)?$ /Temp/ [R=302,L]
```
※ 一時的な移動を行いたいため、`R=302`を指定しています。
JavascriptでスマートにObservableする

# 追記
全然スマートじゃなかったのでもっとスマートにしました
https://qiita.com/angeart/items/29979f67d7a511bbec0e

# JavascriptでObservableパターンを書きたい
諸事情により、Javascriptを用いたフロントエンドの実装を行っていたのですが
MVVMのようにObservableな書き方をしたい欲望ができてきたのでES2015で何とかしてみました。
後から追加されたプロパティにも対応しています。

# 実装
[**Proxyクラス**](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Proxy)を用いるとよいらしい
尚、イベントハンドラを設定する部分においてjQueryに依存しています。

```js
var $ = require('jquery');

class Observable {
  constructor(inherited_object = {}) {
    return new Proxy(inherited_object, {
      set: function(obj, prop, value) {
        if (obj[prop] === value) return true;
        obj[prop] = value;
        $(obj).trigger("onchanged", {
          prop: prop
        });
        return true;
      }
    });
  }
}

class Test {
  constructor() {
    $(this).on("onchanged", function(e, data) {
      console.log("changed : " + this[data.prop]);
    });
    return new Observable(this);
  }
}

var tester = new Test();

tester.hoge = "hoge";
tester.hoge = "hoge";
tester.hoge = "fuga";
```
### 実行結果

```
changed : hoge
changed : fuga
```

# gist
https://gist.github.com/Angeart/373b09bb08cacda9da1020ba4b307212
# repl.it
https://repl.it/@Angeart/Observable-on-Javascript
[Unity] SpriteMaskがAndroidで正常に適応されなかった時の対処

#問題
Unityのエディター上は正常にマスクされるのに
![Editor.JPG](https://qiita-image-store.s3.amazonaws.com/0/59989/666499bb-0215-7a20-f2e8-cc03165b33d6.jpeg)


実機で確認したらマスクが適応されてなかった
![android.png](https://qiita-image-store.s3.amazonaws.com/0/59989/e98f1541-0cdd-fda0-fd66-45b81f6d95f4.png)

#対処
PlayerSettingsのDisable Depth and Stencilにチェックが入ってるのが原因だった
チェック外したら正常に適応された
![projectsettings.JPG](https://qiita-image-store.s3.amazonaws.com/0/59989/d7ed5e93-3326-3bfd-4769-0e29bafcdd2c.jpeg)

…そもそもデフォルトではチェック外れてるんですけどね
GPU負荷軽減になるからってチェック入れるとマスクが適応されなくなる

##参考
ステンシルバッファの参考資料
https://qiita.com/r-ngtm/items/ec738be7780ccaabf606
　
uGUIのMaskについてのリファレンスだけど記載されてた
https://docs.unity3d.com/jp/560/Manual/script-Mask.html
>マスキングは、GPU のステンシルバッファを使用して実装されます。
【iPhoneX対応】webサイトのSafe Area対応 簡易版


iPhoneXからSafe Areaというものが導入されました。
Safe Areaにもコンテンツが伸びるようにするためには以下2stepの対応が必要になります。

**step1. metaを追加する**

```html
<meta name='viewport' content='initial-scale=1, viewport-fit=cover’>
```

**step2. Safe Areaに背景以外のコンテンツが入ってしまわないようにpaddingやmarginの指定を入れる**

`safe-area-inset-left`, `safe-area-inset-right`, `safe-area-inset-top`, `safe-area-inset-bottom`をenv()あるいは、constant()に入れてそれぞれ指定する。
iOSのバージョンによって利用できる値が違うので注意が必要です。

**iOS11.1以下の場合**
constant()を使います。env()は使えません。

```css
.test {
    padding-left: constant(safe-area-inset-left);
    padding-right: constant(safe-area-inset-right);
}
```

**iOS11.2以降の場合**
env()を使います。constant()は使えません。

```css
.test {
    padding-left: env(safe-area-inset-left);
    padding-right: env(safe-area-inset-right);
}
```

**参考記事**
https://webkit.org/blog/7929/designing-websites-for-iphone-x/
AST解析するためのメモ

# ASTとは

抽象構文木(AST)のこと。
http://home.a00.itscom.net/hatada/c-tips/ast/ast01.html

# AST解析可能なlibrary

JavaPerser
https://github.com/javaparser/javaparser/wiki

com.sun.tools.javac.modelのlibraryを使えば、コンパイル時の中間ASTの変更も可能…？？

# JavaParserについてメモ

## パース

ソースコードをパースするために以下のコードにてパースしCompilationUnit型へ変換する、この引数にはInputStereamやFile等指定ができる

```java
JavaParser.parse([source]);
```

## AST変更

CompilationUnitに一度変換すれば各ノードを表すオブジェクトを取得できるので、そこから改変が可能

CompilationUnitから直接取得できるであろうノードは以下 

- ImportDeclaration
- AnnotationDeclaration
- PackageDecralation
- ClassOrInterfaceDeclaration
- EnumDeclaration

おそらくClass(またはInterface)内のノードを処理したければClassOrInterfaceDeclarationを一度取得し、改変していく。


## メソッドを取得したい場合

```java
targetclass.getMethodsByName("testMethod1")
```

これで名前が”testMethod1”のメソッドを表すノードMethodDeclarationのリストが取得できる。(同一の名前がある場合にはその分リストに追加される)

Modifierはprivateとかその辺の意味する。

また、引数付きのMethodを取得したい場合には、

```java
//methodNameという名前で、Stringとintを引数に持つMethodが取得できる
ClassOrInterfaceDeclaration.getMethodsBySignature(String new methodName, new String[] {"String","int"});
```

## ノードを消す

そのままremove()で削除可能。

## 名前を変える。

setName(String name)を呼ぶ。
SimpleNameオブジェクトを使って代入することもできる

## 初期化を変更する。

VariableDeclaratorのsetInitializerによって初期化を変更する。
引数がExpression型となっており、これはJavaParser.parseExpressionにより作成可能。

```java
VariableDeclarator.setInitializer(JavaParser.parseExpression(content));
```

## Classに変数を突っ込む

先ほどと同様にClassOrInterfaceDeclarationを使用する。
このオブジェクトのadd***を呼ぶと、ノードの追加と共にそのノードを表すオブジェクトを取得できる。

```java
//private ScanSize[] aaa;を追加する
FieldDeclaration field = targetclass.addField(ScanSize[].class, "aaa", Modifier.PRIVATE);
```

このfieldオブジェクトのsetVariable()に、ほかで作成したVariableDeclaratorを入れれば、そのまま代入可能。
おそらくメソッドも可能。

## 自分のソースの変数などを別のソースに突っ込む

自分のソースを取得してパース。

```java
Path selfSource =　Paths.get("[ソースのPath]");
```

これで任意の宣言などが取得できるので、あとは他ソースに展開する。


# 参考

JavaParserについて詳しい記事
https://qiita.com/opengl-8080/items/50ddee7d635c7baee0ab#%E5%8F%82%E8%80%83

アノテーションプロセッサで AST 変換 - Lombok を参考にして変数の型をコンパイル時に変更 
http://fits.hatenablog.com/entry/2015/01/17/172651
Xcode9にしたらProvisioningProfileが埋め込まれなくなって困った話

# また挙動が変わった…

Xcodeがバージョンアップするたびに悩まされている気がするんですが、iPhone Xに対応するのにXcode 9に更新したところ、ローカルでビルドして転送する分には問題ないものの、AdHoc用にコードサインするとProvisioningProfileが埋め込まれなくなってしまい、ちょっと困りました。

正直、何か効いてうまく行くようになったのかよく分からないんですが、どういう引数でコマンドを呼んでいるのかを書いておきますので、同じ問題にぶち当たった方は比較して参考にしてくださいませ。

```build.sh
xcodebuild -target Unity-iPhone -configuration Debug -scheme Unity-iPhone -archivePath HogeApp.xcarchive archive CODE_SIGNING_ALLOWED=NO ENABLE_BITCODE=NO
xcodebuild -exportArchive -archivePath HogeApp.xcarchive -exportPath . -exportOptionsPlist HogeApp_ExportOptions.plist
```

```HogeApp_ExportOptions.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>method</key>
	<string>ad-hoc</string>
	<key>teamID</key>
	<string>**********</string>
	<key>provisioningProfiles</key>
	<dict>
		<key>com.hoge.hogeapp</key>
		<string>HogeApp_Dev</string>
	</dict>
	<key>signingCertificate</key>
	<string>iPhone Distribution</string>
	<key>signingStyle</key>
	<string>manual</string>
</dict>
</plist>
```

# 考察

plistのprovisioningProfiles以下を指定していなかった(manualにしてなかった)のが原因だと思うんですが、Xcode8ではそもそも指定しなくても動いてたところが謎です。"Automatically manage signing"はXcode8から導入されたはずなんですが、Xcode9からさらに挙動が変わったりしたんですかね？

で、provisioningProfilesのkeyはBundleIdでいいとして、stringがよく分からない。実は自分は取引先からmobileprovisionファイルを受け取って埋め込んでいるだけなので、Develperサイトで証明書の詳細を調べることもできず、ここが最下層プログラマの辛いところであります…。ただ、ProvisionQLで上部に表示される名前がどうもそれっぽいので採用(当たり)。

あと、CODE_SIGNING_ALLOWED=NO と ENABLE_BITCODE=NO はいらないような気もするのだけど、暇なときに要調査。

# 最後に

追求しきれてないのに記事にするのも申し訳ないのですが、問題解決のヒントになりましたらということで…。

# ご参考

ProvisionQL
https://github.com/ealeksandrov/ProvisionQL

mobileprovisionの中身を表示するQuickLookプラグイン。デバイス数がアイコンとして表示されたりもするので便利。ipaファイルに埋め込まれているmobileprovisionも表示できて、mobileprovisionが入り乱れる環境には超おすすめです。
kill コマンド

# kill

この記事は [Linux コマンド 全部オレ Advent Calendar 2017](https://adventar.org/calendars/2630) の6日目の記事です。

```
NAME
       kill - terminate a process

SYNOPSIS
       kill [-s signal|-p] [-q sigval] [-a] [--] pid...
       kill -l [signal]

DESCRIPTION
       The  command  kill  sends  the specified signal to the specified process or process group.  If no signal is specified, the TERM signal is sent.  The TERM signal will
       kill processes which do not catch this signal.  For other processes, it may be necessary to use the KILL (9) signal, since this signal cannot be caught.

       Most modern shells have a builtin kill function, with a usage rather similar to that of the command described here.  The '-a' and '-p' options, and  the  possibility
       to specify processes by command name are a local extension.

       If sig is 0, then no signal is sent, but error checking is still performed.
```
プロセスに対して、シグナルを送る。

## よく使いそうな使い方

```
# シグナルの一覧を表示する
[sinsengumi ~]$ kill -l
 1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL       5) SIGTRAP
 6) SIGABRT      7) SIGBUS       8) SIGFPE       9) SIGKILL     10) SIGUSR1
11) SIGSEGV     12) SIGUSR2     13) SIGPIPE     14) SIGALRM     15) SIGTERM
16) SIGSTKFLT   17) SIGCHLD     18) SIGCONT     19) SIGSTOP     20) SIGTSTP
21) SIGTTIN     22) SIGTTOU     23) SIGURG      24) SIGXCPU     25) SIGXFSZ
26) SIGVTALRM   27) SIGPROF     28) SIGWINCH    29) SIGIO       30) SIGPWR
31) SIGSYS      34) SIGRTMIN    35) SIGRTMIN+1  36) SIGRTMIN+2  37) SIGRTMIN+3
38) SIGRTMIN+4  39) SIGRTMIN+5  40) SIGRTMIN+6  41) SIGRTMIN+7  42) SIGRTMIN+8
43) SIGRTMIN+9  44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9  56) SIGRTMAX-8  57) SIGRTMAX-7
58) SIGRTMAX-6  59) SIGRTMAX-5  60) SIGRTMAX-4  61) SIGRTMAX-3  62) SIGRTMAX-2
63) SIGRTMAX-1  64) SIGRTMAX

# SIGHUP を送る
[sinsengumi ~]$ ps aux | grep fluent
sinsengumi  10178  0.0  0.0 112660   972 pts/0    S+   17:12   0:00 grep --color=auto fluent
root     143350  0.0  2.1 246224 41136 ?        Sl   Nov27   2:54 supervisor:fluentd
root     143434  0.0  3.4 273908 64744 ?        Sl   Nov27   8:26 worker:fluentd
[sinsengumi ~]$ sudo kill -s SIGHUP 143434

# SIGKILL を送る
[sinsengumi ~]$ sudo kill -9 143434
```
Paiza Cloud SSHで接続してみた

## はじめに
Paiza Cloudとやらのサービスが開始されたので早速試してみた。
https://paiza.cloud/ja/

利用できる仮想サーバーはDockerのコンテナで動いている模様。
ちなみにOSは、Ubuntu 16.04.3 LTS（2017/12/06現在)

無料プランで動作を確認。

## 必要なもの
・公開鍵 (サーバー作成時にテキストを貼り付ける)
・秘密鍵 (クライアント端末で使用する)

鍵がなければ以下のコマンドで作成。

```text:Terminal
ssh-keygen -t rsa -b 4096
```

生成した公開鍵の文字列をcatコマンドで表示。

```text:Terminal
cat .ssh/id_rsa.pub 
sh-rsa ABCDB2NzaC1yc2EAAAABBCC... ←クリップボードにコピーしておく
```

## サーバーの作成
1. Paiza Cloudで新規サーバー作成を選択
2. Use SSH にチェック
3. 公開鍵を貼り付ける

![1.png](https://qiita-image-store.s3.amazonaws.com/0/112186/a8a5a4f1-2dbb-8760-3fa3-36122713770a.png)

## SSHで接続
サーバー起動後、ポート[22]で接続しようとしても弾かれる。
フォワーディングされているポート番号を確認する。

1. メニュー　→ About container...
2. 「22/tcp」で検索

この"HostPort"がSSHの接続ポートとなる。

![2.png](https://qiita-image-store.s3.amazonaws.com/0/112186/ac501ef9-d4be-72a6-c149-d7baf9747ad6.png)

接続先は下記となる。
ユーザ名: ubuntu
ホスト名: <サーバ名>.paiza-user.cloud

```text:Terminal
ssh -i .ssh/id_rsa ubuntu@hoge.paiza-user.cloud -p 52021
```

下記の結果が表示されれば、接続完了。

```
Welcome to Ubuntu 16.04.3 LTS (GNU/Linux 4.13.0-16-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

The programs included with the Ubuntu system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by
applicable law.

ubuntu@hoge:~$ 
```
【FileMaker】使い始めの人がはまりがちな複数ページの印刷レイアウト

意外と知れば「あぁ〜、そうするのか〜」ということについてです。

今回は、印刷レイアウトを作成するときのアルアルで、「ヘッダーを最初のページだけに出したいのに、全部のページに出ちゃうんです」というお悩みです。
FileMakerで新規レイアウト/レポートで「次へ」「次へ」とポチポチクリックして印刷レイアウトを作る場合、出来上がったレイアウトは、「ヘッダ」が先に来ます。

こんな感じですね。
![1206_1.png](https://qiita-image-store.s3.amazonaws.com/0/60538/92b46f9d-b592-155a-19e3-f5f4563fb9a7.png)

１ページにおさまる内容でしたら、このレイアウトで十分対応できます。
ですが、明細が多くてページが複数になると、ヘッダが１ページ目の他にも、
![1206_2.png](https://qiita-image-store.s3.amazonaws.com/0/60538/6dfb270a-91fb-c4a6-19ec-c0af0898e733.png)

こんな風に２ページ目にも。
![1206_3.png](https://qiita-image-store.s3.amazonaws.com/0/60538/5636de09-61f3-ed64-f936-2f6b76a2d4c4.png)

これって、うざったいですよね。
こういうとき、「タイトルヘッダ」というものを使います。
「ヘッダ」と何が違うかというと、

・タイトルヘッダ：最初のページのみに表示
・ヘッダ：２ページ以降の毎ページに表示

という違いがあります。
なので、複数ページになると思われる印刷レイアウトを作るときは、タイトルヘッダを活用します。

このとき注意するのは、明細として表示する「ボディ」のタイトルは、「タイトルヘッダ」「ヘッダ」どちらにも配置する、ということになります。
![1206_4.png](https://qiita-image-store.s3.amazonaws.com/0/60538/5466d29d-0ae5-8c1b-178f-d990e19f2ebe.png)

こうすると、最初のページは
![1206_5.png](https://qiita-image-store.s3.amazonaws.com/0/60538/534d2cd3-f8a1-a3a8-e708-e6902ae0b1c5.png)
タイトルが表示されてますね。

２ページ目は、
![1206_6.png](https://qiita-image-store.s3.amazonaws.com/0/60538/7f8e5bfb-6f6d-c7eb-656e-51e12017aeda.png)
ヘッダに配置した明細のタイトルのみが表示されていますね。

印刷レイアウトは自分の思うようなレイアウトにできない場合は、とてもやきもきしますよね。
今回のやり方、ぜひ覚えて自分の印刷したいレイアウトを実現してくださいね！
AWSの利用料・コスト見積もりが簡単にできるページがあって感動したので共有させてください

わりと長いことAWSと触れ合ってきてもちろん見積もりとかもしてきました。
なのですが、最近になってとても使いやすい見積もりページがあったことを知ってショックを受けたと同時に感動したのです。

https://calculator.s3.amazonaws.com/index.html

アマゾン公式で提供しているページなので数値とかも信用できます。

![スクリーンショット_2017-12-06_16_56_22.png](https://qiita-image-store.s3.amazonaws.com/0/186346/0f69357c-619f-8955-878f-36389f521d22.png)

## 終わりに

「え、お前このページ知らずに今までお仕事してきたのか・・・ワロスｗ」
なんて言われましたが、ええ、してきたんですｗ
CakePHP&PHPUnitのsetUp・tearDownの挙動の細かい話

# はじめに
これは[CakePHP Advent Calendar 2017](https://qiita.com/advent-calendar/2017/cakephp)の11日目の記事です。
おはようございます、[@Khigashiguchi](https://twitter.com/Khigashiguchi)です。
普段の業務でCakePHPを書いています。
業務中でちょっと詰まったときに調べたテストのこと、特にsetUp・tearDownの挙動を書き残してみようと思います。

# 目次
- 環境情報
- 背景
- CakePHPの中身
- 調査結果
- 最後に

# 環境情報
- PHP 5.3
- CakePHP 2.3
- PHPUnit 3.7

# 背景
Controllerのテストを書いていた時、ふと以下のようなことをしたいと思いました。
「テスト実行前に、Configureの中身を一部書き換えておきたい。」

```php
pubic class HogehogeControllerTestCase extends ControllerTestCase
{
	public function setUp()
	{
		parent::setUp();
		// Configureの中身を書き換えたい
		if (Configure::check('Debug.host')) {
			$this->origin_host = Configure::read('Debug.host');
		}
		Configure::write('Debug.host', 'localhost');
	}


	public function tearDown()
	{
		parent::tearDown();
		// HERE: 書き換えたConfigureを元の状態に戻す
		
	}
```

このときにtearDown()で明示的にConfigureの中身を戻すような処理は書いた方がいいんだろうか。
どうすべきか迷ったので、CakePHPの中身を見てみました。

# CakePHPの中身
CakePHPがoverrideしているsetUp()・tearDown()メソッドは、lib/Cake/TestSuite/CakeTestCase.php内にあります。

## setUp()
```php
/**
 * Setup the test case, backup the static object values so they can be restored.
 * Specifically backs up the contents of Configure and paths in App if they have
 * not already been backed up.
 *
 * @return void
 */
	public function setUp() {
		parent::setUp();

		if (empty($this->_configure)) {
			$this->_configure = Configure::read();
		}
		if (empty($this->_pathRestore)) {
			$this->_pathRestore = App::paths();
		}
		if (class_exists('Router', false)) {
			Router::reload();
		}
	}
```

PHPUnitのsetUp()を呼び出してから、実行前の状態をインスタンス変数に格納しています。
テスト実行前のConfigureを ``Configure::read()`` でインスタンス変数に格納しています。

## tearDown()

```php
/**
 * teardown any static object changes and restore them.
 *
 * @return void
 */
	public function tearDown() {
		parent::tearDown();
		App::build($this->_pathRestore, App::RESET);
		if (class_exists('ClassRegistry', false)) {
			ClassRegistry::flush();
		}
		if (!empty($this->_configure)) {
			Configure::clear();
			Configure::write($this->_configure);
		}
		if (isset($_GET['debug']) && $_GET['debug']) {
			ob_flush();
		}
	}
```

setUpと同じく、PHPUnitのtearDown()を呼び出してから、以下の後片付けをしてくれてます。

- ClassRegistryの片付け
``ClassRegistry::init``でModelを読んだ場合は、この処理で後片付けしてくれそうです。

- Configureを実行前の状態に戻す
setUp()で取っておいた$this->_configureを使って実行前の状態に戻しています。

- bufferをFlush


# 調査結果

ConfigureはCakePHPの機構の中でConfigureを元どおりに戻してくれそうなので冒頭のコードでは、tearDownで何もしなくても大丈夫そうです。

# 最後に
悩んだときはコードを読むのが一番早いですね。
来年も、バージョンはしっかり上げつつCakePHPer頑張ります！

以上
MysqlにおけるAutoIncrementと空文字の付き合い方

## 空文字
#### 設定によって挙動が変わるのがこれ。

##### **無効**
次のようなエラーが出る。

```sql:Error
ERROR 1366 (HY000): Incorrect integer value: '' for column 'id' at row 1
```

##### **有効**

AutoIncrementの設定が行われているカラムに空文字をINSERTしようとしてもしっかり次の値が入る。
【備忘帳】Githubで二要素認証にした時のEclipseの操作


※毎回忘れる上にGithubのメニューが頻繁に変わってググった情報が古くてその通りに操作できないのでメモ

# 最初に
Githubに二要素認証を導入すると、EclipseからGithubのソースを操作する時に少々分かりづらい操作が必要になるます。そのためのメモです。

注：本記事は2017/12/06現在のものです。今後Githubの仕様が変わった場合操作が変わる場合が有ります。

# Githubの二要素認証設定
面倒なのでググって…。Githubの二要素認証はAndroid、iOSの（多分SMS通知）が必須なのでGithubの二要素認証をしたい人はまずスマフォを手に入れて下さい。データSIMのみで出来るかは未確認…。

# Github側の操作
1. "Settings"-"Developer Settings"-"Personal access tokens"
を選択
1. "Generate new token" を選択
2. "Token description" に好きな名前をつける
3. Select scopesにテキトーに権限チェックを入れる（投げやり）
4. "Generate token" を押下してTokenを発行する
5. 次の画面に遷移した後、Tokenをコピーする（これ以降はTokenの文字列は表示されないのでコピーは忘れずに（必要に応じてどっかにコピーした方がいいかも）

# Eclipse側の操作
Githubアクセス時に出てくる「User（ユーザー）」にgithubのアカウント、「Password（パスワード）」にgithubで発行したTokenを入力する

ぶっちゃけgithub側の操作はhttps://qiita.com/kz800/items/497ec70bff3e555dacd0 見れば済むという…
gcloud app deploy で cannot import internal package エラー

以下のようなエラーがでる。

> ERROR: (gcloud.app.deploy) Error Response: [9] Deployment contains files that cannot be compiled: Compile failed:
2017/12/05 23:43:37 go-app-builder: Failed parsing input: package "github.com/Michael-Inc/carapp-server/vendor/google.golang.org/appengine/file" cannot import internal package "google.golang.org/appengine/internal"


src/cmd/go-app-builder/parser.go で以下のように import を処理している。

```go
for path := range imports {
	pkg, ok := app.PackageIndex[path]
	if !ok {
		// A file declared an import we don't know.
		// It could be a package from the standard library.
		if findInternal(path) {
			return nil, fmt.Errorf("package %q cannot import internal package %q", p.ImportPath, path)
		}
		continue
	}
	p.Dependencies = append(p.Dependencies, pkg)
}
```

`findInternal` は以下のとおり。

```go
func findInternal(path string) bool {
	return strings.HasSuffix(path, "/internal") ||
		strings.HasPrefix(path, "internal/") ||
		strings.Contains(path, "/internal/") ||
		path == "internal"
}
```

`internal` という名前だとエラーにされてしまう。

まだ解決されていない模様 https://issuetracker.google.com/issues/38449183
Macのターミナル（bash）で便利な入力補完と操作メモ。emacsが苦手なんだよ。


Macのターミナルで個人的に便利だと思う
入力補完や操作（`コマンド行編集インタフェース`）のメモです。
実際にはデフォルトのbashの[Command-Line-Editing](https://www.gnu.org/software/bash/manual/bashref.html#Command-Line-Editing)です。

デフォルトでは emacs と同じキーバインドだそうですが
私がemacsを使えず自信ないです。

そこで使えそうなものを列挙してみました。

#本題

|コマンド|説明|
|:--|:--|
|[任意の文字]入力後にtab|入力補完。複数候補がある場合は２回連続押下で候補表示|
|上下矢印キー|履歴をたどる|

tabとかこの記事を見に来て頂ける方なら言わずもがなかな、ビクビク。
たどりつつ以下のように履歴を流用することがよくあります。

```
#ファイル作成
touch src/hoge.txt

#ここで、上矢印キーで `touch src/hoge.txt` を再表示
#Control + aで文頭へ
#ESC押して離してd後ろの単語（touch）を削除
#openと入力してEnterで開く
```
などです。（え？最初から `vi src/hoge.txt` ？す、すみません。。。）
他には

```
git branch
#ここで、上矢印キーで `git branch` を再表示
#すでにカーソルが文末なのでControl + wで(branch)を削除
#statusと入力してEnterで`git status`を実行
```
などです。
基本、文頭か文末の１単語を変更して実行することが多いです。

#カーソル移動系

|コマンド|説明|
|:--|:--|
|Control + a|カーソルを文頭へ移動|
|Control + e|カーソルを文末へ移動|
|ESC 押して離して f|カーソルを１単語前（右）へ|
|ESC 押して離して b|カーソルを１単語後（左）へ|

キーバインドにありがちな以下の略語ですね。
f：forward
b：backward

#削除系

|コマンド|説明|
|:--|:--|
|Control + k|カーソル位置から前（右）の文字を削除|
|Control + u|カーソル位置より後（左）の文字を削除|
|Control + w|カーソルより後（左）の１単語（whitespaceまで）を削除|
|ESC 押して離して delete|カーソルより後（左）の１単語（whitespaceまで）を削除|
|ESC 押して離して d|カーソル位置から前（右）の１単語を削除|

#他

|コマンド|説明|
|:--|:--|
|command + k|ターミナルの表示削除（clear的な）|
|command + s|ターミナルの表示をテキストファイルに保存|
（emacsでもなんでもないですが）

※ちなみに
ESCはmetaキーでも代替できるとのこと
（むしろそちらが正式。僕のキーボードにいないよ。。。）
altキーをmetaキー扱いさせる設定もありますが
基本デフォルト設定に慣らしておきたいので利用していません。

変更する場合は以下のようです。

ターミナル ＞ 環境設定 ＞ 設定 ＞ キーボード
「メタキーとしてoptionキーを使用」にチェックを入れる。

![terminal_setting.png](https://qiita-image-store.s3.amazonaws.com/0/60858/ed11a07e-44b5-1348-9ebb-233c0e9d5008.png)

ここまできてなんですが、
私はviも好きなので以下のようにしたい欲も。
でもデフォルトから極力変更したくないのでそのままです。

|コマンド|説明|
|:--|:--|
|set -o vi|terminal上での操作（`コマンド行編集インタフェース`）がviになります|
|set -o emacs|emacsになります|
[css]文字を透過させず背景画像のみ透過する方法

# ちょっと前にcssで若干躓いた。。。
cssで背景に画像を設定し、その上に文字を置き、背景画像だけ透過させようとした。
完成図↓(画像には触れないで。。。)
<img width="223" alt="スクリーンショット 2017-12-06 16.40.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/163415/56efb02e-6747-7c1e-90c1-ce7472e631b9.png">

このくらい余裕だと思ったが、30分くらい格闘した。。。

## 失敗コード
```.html
<div class="bg-image">
  <p class="text">テキストが入りますテキストが入りますテキストが入りますテキストが入ります</p>
</div>
```

```.css
.bg-image {
  background-image: url('ここに画像path');
  width: 220px;
  height: 220px;
  background-size: cover;
  opacity: 0.4;
}
```
これでいけると思ったら、文字まで透過されてあれ？ってなった。(普通に考えればそうなる)
<img width="222" alt="スクリーンショット 2017-12-06 16.41.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/163415/800bd82f-87f3-a12a-4d1f-02a703f78d4b.png">


## 成功コード
```.html
<div class="bg-image">
  <div class="bg-mask">
    <p class="bg-text">テキストが入りますテキストが入りますテキストが入りますテキストが入ります</p>
  </div>
</div>
```

```.css
.bg-image {
  background-image: url('ここに画像path');
  width: 220px;
  height: 220px;
  background-size: cover;
}
.bg-mask {
  height: 100%;
  background: rgba(255,255,255,0.5);
}
```

bg-imageってクラスの下にbg-maskってクラスのdivタグを挟んだ。
で、このbg-maskの"背景色"にrgbaで白の薄いやつを設定して高さを100%にした。
ただそれだけ。
以上。
注目のサーバレス

# メリークリスマス！

## 今年は色々あった・・・

見ての通り、去年のライターさんから結構入れ代わりました。
今年はアドベントカレンダーを維持するための結構メンバーに負担を掛けました・・・
具体的には1人2記事3記事の執筆を要求しないと、25日を埋められ無かったんですが
終わってみればメンバーの協力の賜物、無事に埋まって良かったです(´v｀)

### アドベントカレンダーをやる意味

色々ありますが、やはり腐っても技術会社なので社外との交流を何かしらの形でもつようにしないと
技術組織としての組織力は下がっていくと考えています。
"外から見られている"と言う事を意識して初めて気付けるものがあると思います。


## 今年弊社で一番注目だった技術はSPA ON サーバレス

僕を含め、数名がトライしたのが印象的でした。
`Lambda` + `API Gateway`の組み合わせの上に`Angular2`な [とんとんWeb (https://tontonch.com)](https://tontonch.com) など生まれました。

LAMP環境が長期定着していたので、こういった試みが出てきたこと、出来た事は非常に良い経験になりました。


## 来年に向けたトライ

インフラもそうですが、`Swift4`の案件が増えて来ました。
加えて`Kotlin`なども出てきていて、既存の開発環境エコシステムに見直しを入れて、入れ替えていくシーズンになってきているようです。
`オンプレミス`から`クラウド`、クラウドから`サーバレス`とその進化の流れが加速している事を肌で感じる年だったので、来年は実際にそれを実践していくべく色々なトライをしていきたいと思います。

### 個人的にはGAEの知識を深めて活用していきたい

個人的に利用しているAWSをGAEに変えたんですが、月額がぐぐぐグーンと安くなりました！
人によるとは思いますが、私の利用用途では2000円が2円になり、しかも最初に貰えるクーポンで0円にｗ
とても気をよくしたので、GAEをフル活用出来るように色々知識を深めて行きたいです。


## 最後に：弊社は若手エンジニアに飢えている

アドベントカレンダーを見ていただいて、「面白そうな会社だなー」と思った若手エンジニアな貴方！
是非是非 [こちら](https://www.passion-navi.com/company/index/3308) からご連絡下さいｗ

今年もまだ少しありますが
### 来年もよろしく！メリークリスマース！ヽ(=´▽`=)ﾉ
オープンソースのReact-nativeライブラリ 5選

GitHubで公開されているオープンソースのReact-nativeライブラリを紹介していきます🌟

![20171122174948.png](https://qiita-image-store.s3.amazonaws.com/0/200848/7c764c7a-d0e6-78cc-2365-24e19af37c19.png)


# No.1
#### frostney/react-native-create-library
![usage.gif](https://qiita-image-store.s3.amazonaws.com/0/200848/b1274ae8-7984-69ac-bf34-e6baadb531ec.gif)

📓 1つのコマンドでReact -nativeライブラリを作成するコマンドラインツール  
Star:525🌟  
[https://github.com/frostney/react-native-create-library:embed:cite]  
# No.2
#### storybooks/storybook 
<img width="1382" alt="スクリーンショット 2017-12-06 16.11.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/200848/adf0300b-4fbd-c95b-c18b-23ef47b67289.png">
   
React、React-Native、Vue UIコンポーネントのインタラクティブな開発とテスト環境  
Star:16,348🌟  
[https://github.com/storybooks/storybook:embed:cite]  

# No.3  
#### xudafeng/autoresponsive-react-native
![Screen_Shot_2015-07-06_at_12.57.26_PM.png](https://qiita-image-store.s3.amazonaws.com/0/200848/bed48b7e-538c-2d22-97db-70ff06b60f72.png)
 
Reactのための自動応答レイアウトライブラリ  
Star:147🌟  
[https://github.com/xudafeng/autoresponsive-react-native:embed:cite]   

# No.4  
#### gcanti/tcomb-form-native
![tcomb-form-native.jpg](https://qiita-image-store.s3.amazonaws.com/0/200848/0020bd46-8928-4b3a-3664-3c7b2d7ae456.jpeg)
  
react-nativeのためのフォームライブラリ  
Star:2,294🌟  
[https://github.com/gcanti/tcomb-form-native:embed:cite]   
  
# No.5  
#### avocode/nachos-ui 
![1*wWKs_vc697M_PGNa3IN6YA.jpeg](https://qiita-image-store.s3.amazonaws.com/0/200848/413f1f62-8aab-c131-31e1-585da1ebd4da.jpeg)

Nachos UIはReact Nativeコンポーネントライブラリです。  
Star:1,332🌟  
[https://github.com/avocode/nachos-ui:embed:cite]
macOS HighSierraでJavaに起因してRubyMineが使えないときの解決法

## 概要
macOSをSierraからHighSierraに上げたことで、RubyMineが使えなくなった。
RubyMineを最新バージョンの 2017.3 にしても解決せず、JREのバージョンを変えたり、再インストールしたりと
丸一日掛かったが、原因は別のところにありました。

## 解決方法
macOS再インストールだけ

## OSに問題が有るなんておもわねーよ!
macOSにはJavaランタイムがもともと入っている?みたい。
(Javaコントロールパネルはないが)
なのにRubyMineが起動しなかったので、じゃあJavaを入れてやろうじゃねえかと思ったのがそもそもの間違い。
Java9にしてみたり、JDK入れたり、RubyMineの使用するJVMバージョン設定変えたり、
JRE8が入らなくて、何回も試したり全部無駄でした!

## 結論
みなさんがこの記事をみて同じ問題で時間をムダにしないことを祈る
あとRubyMineは Java9 では使えません。

## 参考記事
https://qiita.com/kiyodori/items/4834d3729f6da60f9c97
IPOよもやま


g's 1期2期と、3期の途中まで、チューター兼講師をしていた、あずまです。
最近のメンバーの人は初めまして。
2016年の2月から、大阪の某社に転職し、IPO支援業務を2年弱行い、
先日ようやく上場することができました。
起業家にとって、一つのゴールでもあるIPOについて、少しまとめたいと思います。

#資本政策は重要
起業してすぐの時点では、お金がないわけです。
このタイミングでできるのは、1.銀行借入 2.増資（VCなどから）　　かと思います。
銀行借入はキャッシュができれば返済して終わりですが、
増資は株主としての出資者との付き合いが必要になるため、少し長い目で見る必要が出てきます。
また、VCに株を渡すということは、当然ながら創業者の株が少なくなる訳です。
最近の上場では、某フィンテック企業M社さんの創業者は約20%、
人材系事業のW社さんの創業者は約70%と、だいぶ違います。
個人の資産価値としても変わってきますし、経営についての発言権も変わってきます。
増資をするなら、このあたりまで考えておいた方が良いかと思います。

また、上場時は、ロックアップと呼ばれる「公開後の一定期間、一定条件下では、市場で持株を売却しない」という
紳士協定を証券会社と株主との間で締結することが多いと思いますが、
これについても株主によっては交渉が必要になることもあります。

#ステークホルダーとの連携
上場するためには、色々なプレイヤーが出てきます。
##主幹事証券会社
メインとなる証券会社です。基本的には、彼らの審査部審査をクリアすることが、まずは目標となります。
##監査法人
会社が健全に経営されているかを監査し、証明書を出すのが監査法人になります。
上場するためには、最低2年間は監査法人の監査を受けている必要があります。
##信託銀行
会社の株（株主）の管理を行うのが信託銀行になります。
また、上場後の株主総会の資料送付なども、彼らが行います。
実は、上場前後の実務に詳しかったりします。（毎月の支払いもリーズナブル）
##東京証券取引所
主幹事証券の審査が終わると、東証に上場申請をし、審査部の審査を受けることになります。
彼らの審査を通過することで、上場の承認がおります。
##社外役員（社外取締役、社外監査役）
社外の役員もコーポレート・ガバナンスの点から必要となります。
リクルーティングできるように、コネを広くしておきましょう。

以下は、上場がかなり明確になってからのステークホルダー
##引受シンジケート団、通称　シ団
主幹事以外の証券会社です。基本的に主幹事証券会社のみの上場はなく、
最低１社、通常は3社程度、他の証券会社が入ります。
東証との審査と並列してシ団の審査もあり、彼らからの質問もあります。
##証券保管振替機構、通称　ほふり
マーケットで株を売買した結果は、証券会社を通じて、ほふりに集められます。
上場が具体的になると、彼らとのやり取りも発生します。

#作成する書類など
##Ⅰの部
書いて字のごとく、いちのぶ、です。
上場する際に必要な、約100Pの書類になります。
これを作成するのが、一つの山場になります。
上場会社のⅠの部は公開されているため、時間のあるときに、気になる会社のⅠの部を見ると、良いと思います。
##マザーズ各種説明資料
会社の事業内容や、成長性について記載する資料です。こっちは非公開です。
##取締役会の議事録
作っておきましょう。証券会社や信託銀行から雛形はもらえます。
##経営計画など
作っておきましょう。Excelで作る会社が多いそうです。

#内部統制について
昨今、コーポレート・ガバナンスや、内部統制について、重要視する傾向があります。
全社的に内部監査を実施（２年間）することや、社外役員をおき、コーポレート・ガバナンスを強化し、
コーポレートガバナンス・コードに従うことなどが求められています。
大変です。

#まとめ
2年近く、この業務に携わっていますが、大変でした。
何が大変って、この分野を知っている人があまりいないため、手探り・手弁当でするしかないところです。
自分は今回、IPOに関する業務は、一通り経験しましたので、g's のメンバーには、できる範囲でフィードバックしたいと思っています。
git add -pのeditコマンドを使ってみた

# git add
新規追加 or 編集したファイルをインデックスに追加するコマンド「git add」ですが、私は下記のようにオプションを使い分けています。

- git add -A
簡単な修正を行ったときや新規作成したファイルばかりのとき。
デバッグコードを追加した時はほとんど使いません。

- git add [_filename_]
修正箇所がたくさんあり、その中で新規作成したファイルをインデックスに追加するときだけ。

- git add -p
修正箇所がたくさんあり、その中で編集したファイルをインデックスに追加するとき。
機能改修や機能追加の時は割といじるコードが多いのでこれを使ってます。
デバッグコードを使いしたときなんかはそこだけスルーできるので便利。

以上のような使い分けをしてます。

# git add -pのコマンド
pオプションでaddしたときは、ある程度のまとまり毎に「追加」、「無視」等のコマンドを打ってインデックスに追加していきます。

私は下記の基本的に下記のコマンドを使用します。

- y
このまとまりをインデックスに追加しますよというコマンド（yes）

- n
このまとまりはインデックスに追加しませんよというコマンド（no）

- q
中止するコマンド（quit）

- s
（可能であれば）このまとまりを更に小さいまとまりに分けるコマンド(split)

その他にもコマンドはありますが、この後出てくる「e」オプション以外は使用していないので割愛します。

## 「s」コマンド
git add -pをするとある程度のまとまり毎に追加を行えますが、途中に挟んでいたデバッグコードがまとまりの間に入ったりする時があります。
そんなときは「s」コマンドで分割することができます。

ただし、このコマンドで分割できる最小単位は「連続して変更している行のまとまり」なので注意が必要です。

## 「e」コマンド
さて、今回「e」コマンドを使った原因は以下のような状況です。

```
あるファイルに関数を一つ追加して、その中にデバッグコードを追加していました。
デバッグコードを削除しないままgit add -pを実行しました。
```

もちろん関数まるまる追加なので、間のデバッグコードまで「s」コマンドで分割できません。
qコマンドで中止しようかと思ったのですが、ちょっと立ち止まって調べたら「e」コマンドがあることを知りました。

で、初めて使ったのですが、少し苦戦したのでメモです。（スクショ撮り忘れた）

コマンドを実行するとエディタが立ち上がり、git diffのような内容が記載されています。
デバッグコードの「+」を削除し保存したのですが、エラーが出ます。

よくよくエディタ下部のコメントを読むと、下記のコメントが書いてありました。

```
# To remove '-' lines, make them ' ' lines (context).
# To remove '+' lines, delete them.
# Lines starting with # will be removed.
```

簡単に訳すと
- 「-」の行を取り消すには空白に置き換えよ
- 「+」の行を取り消すには行を消せ
- 「#」で始まる行は無視するよ

という内容でした。
誤編集を避けるためなのか「-」と「+」で異なる方法なのはちょっとわかりにくい…。

恐怖しながらデバッグコードの行をまるまる削除して保存したら無事通過できました。

まあ、デバッグコードは一時的なものならaddする前に消した方がいいと思います。
Excel CData RESTドライバーを使用して、手軽にWeb API RESTエンドポイントからExcelにデータをロードする方法（Qiita REST APIを利用）

CDataでは、現在90種類ほどのサービスに接続できるドライバーを扱っていますが、まだまだWeb APIを提供しているサービスは多種多様に存在します。

そんなサービスにも柔軟に対応できるように、CDataではREST・JSON・XMLを解釈して、SQL形式へ出力可能なDriverがあります！

今日はこのドライバーの基本的な使い方を、手軽に利用できるExcel Add-In for RESTを用いて、解説してみたいと思います！

[Excel Add-In for REST](https://www.cdata.com/jp/drivers/rest/excel/)

ちなみに、この記事はCData Software User Group Advent Calendar 2017の6日目です！

[CData Software User Group Advent Calendar 2017](https://qiita.com/advent-calendar/2017/cdatasoftware)

（なお、こちらはAdvent Calendar用のサマリになります。）

#対象のWeb APIサービスは？

さて、対象となるサービスですが、今回はエンジニアにはとても馴染み深いエンジニア向けBlogサービスであるQiitaのWeb APIにしてみました！

[Qiita Web API Document](https://qiita.com/api/v2/docs)

ちなみに、JsonかXMLを返してくれるHTTPサービスなら基本大丈夫ですが、テーブル形式に直すのに向き不向きはあるので、注意しましょう。（郵便番号のWeb APIとか、GIO系で1件しかデータを取得しないとか、都道府県を取得するためだけとか）

実装イメージは以下のような感じです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/56301/a3b17adf-8d4f-818f-8a53-90b33a04b271.png)

ポイントとなるのは、.rsdと呼ばれる、Jsonをどのように表形式へ出力するか等を定義したファイルです。

基本的にはRESTドライバーが自動生成してくれますが、この定義によって、どのようにJsonという表形式ではないデータを咀嚼し、一覧として出力するのかが決まります。

今回は、いろんな種類が存在するQiitaのWeb APIの中から、投稿を対象として、Excelにロードしてみました！　もちろん、この方法を利用することで、ODBCやJDBCからもQiitaの情報を扱えるようになります。

https://qiita.com/api/v2/docs#投稿

対象リソースは投稿情報にしてみました。

#どうやってやるの？

詳細手順は以下のリンク先で記載しています。

[Excel CData RESTドライバーを使用して、手軽にWeb API RESTエンドポイントからExcelにデータをロードする方法（Qiita REST APIを利用）](http://kageura.hatenadiary.jp/entry/2017/12/06/Excel_CData_REST%E3%83%89%E3%83%A9%E3%82%A4%E3%83%90%E3%83%BC%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%A6%E3%80%81%E6%89%8B%E8%BB%BD%E3%81%ABWeb_API_REST%E3%82%A8%E3%83%B3%E3%83%89%E3%83%9D%E3%82%A4)
ツクールMVゲームの実行時構造

ツクールMVは、ツクールシリーズで初めてマルチプラットフォーム対応（Windows, Mac, iOS/Android, HTML）となっているのは皆様もご存知の事かと思います。
そこで今回は、「ツクールMVが如何にそれを成し遂げているのか」その辺の仕組みを解説いたします。


#実行時のツクールの構造
大まかには以下の通りとなります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/212739/2e341dc1-b999-535f-d797-ab58ede28390.png)
###ユーザープラグイン
皆様が作ったり、ダウンロードしてきたりする追加プラグインです。
殆どの場合コアプラグインの機能を呼び出したり上書きする事で動作します。

###コアプラグイン
ツクールMVに最初から付属しているプラグインです。「rpg_○○.js」系列が該当します。
特に`rpg_core.js`が重要で、直接ホームページ上の要素を操作する部分を担当しております。

###pixi.js
コアプラグインの一部と見なす事も出来ますが私はあえて分離させました。
描画系を担当しております。（実際にbitmapを表示したり色を変えたりなど）

###index.html
`index.html`本体です。以上の各javascriptはこのページ上で動いております。

###変換フレームワーク
私が調べる限りではWindows版は「nw.js」（Node.js系列）、Android/iOSでは「Cordova」（Monacaもこれを使用）しているようです。
アプリとして自分のウィンドウの中にhtmlデータを表示する事で、ホームページをあたかもネイティブアプリのように見せかける事が可能です。
（一応Android用はAndroid Studioを経由する方法もありますが、公式がMonacaのサービスを作っておりますため、ここではCordovaを基準にしてます）



#変換フレームワーク関連の雑記

###Nw.js
https://nwjs.io/

確実にはいえませんがgame.exeがnw.js系の本体(nw.exe)かと思われます。同場所にありますpackage.jsonに初期ウィンドウの設定類が含まれております。

```package.json
{
    "name": "KADOKAWA/RPGMV",
    "main": "www/index.html", //最初にロードするHTMLファイルの場所
    "js-flags": "--expose-gc",
    "window": {
        "title": "",　　　　　　　　　　//windowの最初のタイトル（後でScene_Boot.prototype.updateDocumentTitleで差し替えられます）
        "toolbar": false,    //アドレスバーを表示するか否か
        "width": 816,       //窓横幅
        "height": 624,　　　　　//窓縦幅
        "icon": "www/icon/icon.png"　　//exeファイルのアイコンの場所
    }
}

```
(注釈コメントは私がつけたものです）


起動した後、
SceneManager.run→SceneManager.initializeを経て以下が呼び出されます。

```rpg_manager.js
SceneManager.initNwjs = function() {
    if (Utils.isNwjs()) {
        var gui = require('nw.gui');
        var win = gui.Window.get();
        if (process.platform === 'darwin' && !win.menu) {
            var menubar = new gui.Menu({ type: 'menubar' });
            var option = { hideEdit: true, hideWindow: true };
            menubar.createMacBuiltin('Game', option);
            win.menu = menubar;
        }
    }
}; 
```

何かnw.jsのウィンドウに対しての操作を行いたければここのwin変数がウィンドウなので、それに対して行うと良いでしょう。

###Cordova

https://cordova.apache.org/

対応するプラットフォームを追加する事が出来、様々な（Cordova自体が対応する機能を増やす）プラグインが存在します。
ただ逆に言えば、HTML5やjavascriptに於いてデフォルトで出来る機能でも、プラグインをインストールする必要がある物が存在します。
一例として、`window.open()`はCordovaに於いてはプラグイン`inAppBrowser`を必要とするようです。

こちらについては、残念ながら、私の手元に環境がなかった為あまり詳しく調べられておりません。
AWS上でredashを使ってデータを可視化しよう


データを可視化をするツールとして、いろいろありますが現在関わっているプロジェクトでみたいデータがRDSに溜まっていたので、それをうまく抽出し開発者以外にも簡単に見せるツールの一つとして今回redashを試してみました。

容易するもの
---

特になし。
サービスでRDSとかつかっているならば、すぐにredashで可視化ができます。

手順
---

1. redashのamiを選択する。
	* 最新の対応するamiは[ここ](https://redash.io/help-onpremise/setup/setting-up-redash-instance.html)から探してください
	* 現在（2018/11/13時点）では東京リージョンにおいては`ami-0c7d9b740e997aa69`が最新です。
	* ~~私が環境作成した時点での最新は`ami-fde8199b`のAMIでした。~~
2. EC2の立ち上げを行う
	* 接続するRDSが覗けるサブネット、セキュリティグループを適切に設定してください。
	* redashのインスタンスは80番をあけておいてください
	* 最低 t2.smallで

１番で選択したamiであれば、Webサーバーの設定をせずにすぐに `http://インスタンスのPublicIP/` にアクセスすればすぐに確認できます。

Redashの設定
---

管理者のID, Passwordは適当に設定して下さい。

![スクリーンショット 2017-12-06 16.12.35.png](https://qiita-image-store.s3.amazonaws.com/0/18331/d7db482d-baad-6fd3-01ae-448610561cc0.png "スクリーンショット 2017-12-06 16.12.35.png")

右上にあるデータベースのマークをクリックすると可視化したいデータ元の追加ができます。

データソースとしては、以下が選べるみたいです。
(自分が触ったのが2017/10頃なのでもっと増えているかもしれません）

![スクリーンショット 2017-12-06 15.57.26.png](https://qiita-image-store.s3.amazonaws.com/0/18331/b0ef651b-fd8f-ae3e-8ddf-c2da148b9e3a.png "スクリーンショット 2017-12-06 15.57.26.png")


私はRDS(postgreSQL)をつかってたので、一番下の`PostgreSQL`を選択しました。

あとはHost(RDSのエンドポイント）やportを適切に設定すれば、可視化のデータソースの完成です。
あとは、クエリを書けば簡単に可視化できます。

![スクリーンショット 2017-12-06 16.21.02.png](https://qiita-image-store.s3.amazonaws.com/0/18331/8a5e8117-b6e5-ecaa-d214-8fefa2a25746.png "スクリーンショット 2017-12-06 16.21.02.png")


きになったこと&tips
---

* redash上のSQLで`{{}}`という書き方をすると変数として取り扱えます。文字列で解釈したい場合は`'{{}}'`とシングルクォーテーションでかこってあげましょう。
* 可視化したViewをiframeではめ込むことができます。ただ、変数ありきのSQLはバグなのか変数部分が欠落してしまうみたいなので、注意してください（改善してるかも？）
* 設定でユーザーを追加できますが、権限の細かな設定はできませんでした。配布されたAMIに入っているredashがそういうものなのかもしれません。
calc() functionを利用して、ダイヤ形を操作する

[CSS Advent Calendar 2017](https://qiita.com/advent-calendar/2017/css) - 12月8日の記事です。

![アートボード 1.png](https://qiita-image-store.s3.amazonaws.com/0/34660/361b7716-de5a-ebbf-e71c-b048d3c606c8.png)

図のように、正方形を45度傾けたダイヤ形では対角線の長さが幅高さになります。
200px四方の正方形で言うと、`1辺の長さ × √2` で `*282.842712474px*` となります。
*√2* は *1.41421356237* （「ひとよひとよにひとみごろ...」）です。
ちなみに、値に指定した小数点以下の解釈はブラウザで異なります。

また、今回の例では左上の角を基準に時計回りに45度傾けることでダイヤ形にしているので、
原点も左上の角にしたく、そのために *translate()* も指定しています。
**※ *transform* の値は指定する順番が重要で、前後入れ替えると位置が変わってしまいます。**

```css:css
.dia.one {
    width: 20px;
    height: 20px;
    transform-origin: 0 0; /* 左上の角を基準 */
	transform: translate(calc(1.41421356237 * 50% + 0px), calc(-1.41421356237 * 50% + 0px)) rotate(45deg);
}
```

> [codepen#.dia.one](https://codepen.io/pokkur/pen/ZaRyGg)

辺の長さを元につくった、282.842712474px四方のダイヤ形でしたが、
操作するのに不便だとかでダイヤ形（対角線長）を指定したサイズで用意したい場合もあるかと思います。
今度は逆に、`対角線長 ÷ √2` で1辺の長さを割り出せば良いですね。

```scss:scss
.dia.two {
	width: calc(100px / 1.41421356237);
	height: calc(100px / 1.41421356237);
	transform-origin: 0 0;
	transform: translate(calc(1.41421356237 * 50% + 0px), calc(1.41421356237 * -50% + 50px)) rotate(45deg);
	
	&::before {
		content: 'two';
	}
}
```

> [codepen#.dia.two](https://codepen.io/pokkur/pen/ZaRyGg)


原点を左上角でなくてセンターにしたい場合は *translate()* で下記のように調整できます。

```scss:scss
.dia.three {
	width: calc(30px / 1.41421356237);
	height: calc(30px / 1.41421356237);
	transform-origin: 0 0;
	transform: translate(0, calc(1.41421356237 * -50% + 100px)) rotate(45deg);
	
	&::before {
		content: 'three';
	}
}
```

![2017-12-06_16h21_37.png](https://qiita-image-store.s3.amazonaws.com/0/34660/ba6c3d9e-cf0f-5da9-9a76-5cd8baf714dc.png)

> [codepen#.dia.three](https://codepen.io/pokkur/pen/ZaRyGg)


# mixin

![2017-12-06_16h21_57.png](https://qiita-image-store.s3.amazonaws.com/0/34660/3c148987-5b6f-b70f-e54c-f35f3a1e9678.png)

下記は引数で対角線長,水平位置,垂直位置,原点を指定できるscssのmixinにまとめた例。

> [codepen](https://codepen.io/pokkur/pen/BmBVbM?editors=1100)


```scss:scss
.left.bottom {
	@include diamond(false, 0px, 100px, top);
	// ~~~
}

.h-center.v-center {
	@include diamond(100px, 50px, 50px, center);
	// ~~~
}
```

# まとめ

今回は使い道がよくわからないサンプルだったかも知れませんが、
ほとんどのブラウザで使用可能ですし、発想次第で非常に活躍してくれるのでお試しあれ！

# 参考

- [codepen](https://codepen.io/pokkur/pen/bYZNxY) 円に内接する正方形にテキストをおさめる
- [caniuse/calc](https://caniuse.com/#search=calc)
- [IE 10 + 11: CSS transitions with calc() do not work](https://stackoverflow.com/questions/21142923/ie-10-11-css-transitions-with-calc-do-not-work)
AWS Cloud9を使ってみる

11/30にローンチしたWebブラウザ上で実現した統合開発環境(IDE)を使用してみました。

# 環境構築 

## AWSコンソールにサインイン

![SignIn.png](https://qiita-image-store.s3.amazonaws.com/0/217802/86e08878-90f2-46eb-9ed8-50fb907b6697.png)

`Cloud9` を選択し、 `Create environment` をクリックします。
![スクリーンショット 2017-12-06 14.44.54.png](https://qiita-image-store.s3.amazonaws.com/0/217802/c10e3d9d-fbb6-ed96-8201-2b477ec12779.png)

## 環境名を決定

今回は `Advent Demo` とします。
![NameEnvironment.png](https://qiita-image-store.s3.amazonaws.com/0/217802/ee84b539-380a-c265-7817-fc21273b5733.png)

## 環境設定

今回は、すべて `デフォルト値` で作成します。
![setting1.png](https://qiita-image-store.s3.amazonaws.com/0/217802/e9bdaad0-04d9-f2e0-f3b4-cfbfe71bd711.png)
![setting2.png](https://qiita-image-store.s3.amazonaws.com/0/217802/39f98a86-cc6d-a986-42af-4d2f7ffcefac.png)

# 実装・実行

## Lambda Function を作成

![IDE1.png](https://qiita-image-store.s3.amazonaws.com/0/217802/de984b18-b339-e233-4b13-697fd89544eb.png)

今回は、`AdventDemo` で作成します。

![lambda.png](https://qiita-image-store.s3.amazonaws.com/0/217802/70fad5d3-f26b-6b20-aada-4d5194e72465.png)

 `Node.js` でコーディングします。
![node.png](https://qiita-image-store.s3.amazonaws.com/0/217802/e4477e72-3a62-bd5b-7122-e0fd22bbf874.png)

 `トリガー` は設定なしで作成します。
![trriger.png](https://qiita-image-store.s3.amazonaws.com/0/217802/fab4902d-b82c-7c95-70a7-ff751319ddc7.png)

設定値は、すべて `デフォルト値` にします。
![config.png](https://qiita-image-store.s3.amazonaws.com/0/217802/1256849c-c2d5-3be1-c8d4-a0a327817789.png)
![cofirm.png](https://qiita-image-store.s3.amazonaws.com/0/217802/ab6e05b2-bb51-7d5e-8e32-87d094638c02.png)

## コーディング

今回は、サンプルで作成されるプログラムをそのまま使用します。

```js:index.js
'use strict';

const exec = require('child_process').exec;

exports.handler = (event, context, callback) => {
    if (!event.cmd) {
        return callback('Please specify a command to run as event.cmd');
    }
    const child = exec(event.cmd, (error) => {
        // Resolve with result of process
        callback(error, 'Process complete!');
    });

    // Log process stdout and stderr
    child.stdout.on('data', console.log);
    child.stderr.on('data', console.error);
};

```

## Lambdaの実行

 `payload` を設定して、実行すると、正常に結果が返ってきます。
![invoke.png](https://qiita-image-store.s3.amazonaws.com/0/217802/b8f6c8be-2fea-416e-ff21-803f4d65f72e.png)

## AWS CLIから実行

Function名は `cloud9-AdventDemo-AdventDemo-XW86LFVFASHY` となります。
異様に長い。。。今回はこのままにします。
![FunName.png](https://qiita-image-store.s3.amazonaws.com/0/217802/1598aa58-e920-9e4d-533c-f9fd095af23a.png)

 `AWS CLI` を利用しても正常に結果が返ってきました。
![console.png](https://qiita-image-store.s3.amazonaws.com/0/217802/9c39d089-bb88-b5b7-f2e3-d687b24a5094.png)

# 所感

使用感は今までのIDEツールと遜色なく使用できますし、 `Lambda` を使用するのも簡単でした。
あとは、Function名が長くなってしまうところはもう少し仲良くなってみないとかなと思いました。