OmniAICreator/Qiita-1.07M huggingface dataset:
組合せ最適化でへやわけを解く

Advent Calendar 23日目の記事 [組合せ最適化で波及効果を解く](https://qiita.com/SaitoTsutomu/items/2eab3212beb3bf17ceb7)
Advent Calendar 25日目の記事 [組合せ最適化でオーノーを解く](https://qiita.com/SaitoTsutomu/items/b1cc4e123245ea56ee18)


## これなに

**へやわけ**を、Pythonで[組合せ最適化](https://qiita.com/SaitoTsutomu/items/bfbf4c185ed7004b5721)モデルを作って解きます。
解く楽しみは、モデル化を工夫することになります。

自分でも試してみたい人は、下記を参考にしてください。

- [数独を通して組合せ最適化を学ぼう](https://qiita.com/SaitoTsutomu/items/bd09190d8a02432b3f16)

## 問題
* 盤面のいくつかのマスを黒くぬります
* 太線で区切られた四角（部屋）に入っている数字は、その部屋に入る黒マスの数を表します
* 数字の入っていない部屋は、いくつ黒マスが入るか不明です
* 白マスを、タテまたはヨコにまっすぐに３つ以上の部屋にわたって続けさせてはいけません
* 黒マスをタテヨコに連続させたり、黒マスで盤面を分断したりしてはいけません

![](https://raw.githubusercontent.com/SaitoTsutomu/opt4puzzle/master/pic/heyawake.png)

### 入力パラメータ

`data`にヒントが入っているとします。

```py3:python
import numpy as np
from collections import defaultdict
from itertools import chain, groupby, product
from pulp import LpProblem, lpSum, value
from ortoolpy import addbinvars, unionfind
data = np.array([list(s) for s in """\
AABCCCDDDD
AABCCCEEEF
GGGGHHIIIF
GGGGHHIIIF
JKLLHHIIIF
JKLLMMMNNN
JOLLMMMNNN
PQQRRRSSTT
PQQUUUSSVV
PQQUUUSSVV""".splitlines()])
nums = {'A':2, 'I':5, 'K':0, 'L':1, 'N':2, 'O':1, 'P':2, 'U':3}
nw, nh = len(data[0]), len(data)
```

## Pythonで解く

数理モデルを作成し、解きましょう。

### 変数
* v：0:white, 1:black (1)

### 制約
* 3つの部屋で白をまっすぐ連続してはいけません (2)
* 数字は部屋内の黒の数となること (3)
* 黒は連続しないこと (4)
* 黒で分断しないこと (5)

```py3:python
m = LpProblem()
v = np.array(addbinvars(nh, nw)) # 0:white, 1:black (1)
for d, x in chain(zip(data,v), zip(data.T,v.T)):
    b = np.arange(len(d)-1)[d[1:] != d[:-1]]
    for i, j in zip(b, b[1:]+2):
        m += lpSum(x[i:j]) >= 1 # (2)
for k, d in groupby(sorted(zip(data.flat, v.flat)), lambda x:x[0]):
    if k in nums:
        m += lpSum(c[1] for c in d) == nums[k] # (3)
for e in chain((v[1:,:] + v[:-1,:]).flat, (v[:,1:] + v[:,:-1]).flat):
    m += e <= 1 # (4)
def dirs(i, j):
    return [(i+y-x)*nw + j+y+x-1 for y in range(2) for x in range(2)
        if 0 <= i+y-x < nh and 0 <= j+y+x-1 < nw]
while True:
    m.solve()
    r = np.vectorize(value)(v).astype(int)
    u = unionfind(nh * nw)
    if unionfind.isconnected(1-r, u):
        break
    dc = defaultdict(list)
    for i, j in product(range(nh), range(nw)):
        if r[i,j]:
            for l in set(u.find(k) for k in dirs(j, i)):
                dc[l].append(v[i][j])
    for s in dc.values():
        m += lpSum(s) <= len(s) - 1 # (5)
```

### 結果の表示

```py3:python
data[r==1] = '#'
print('\n'.join(' '.join(i) for i in data))
>>>
# A B # C C D # D #
A # B C C # E E E F
G G # G H H # I # F
G G G # H H I # I F
# K L L # H # I # F
J K # L M # M N N N
J # L L # M M # N #
# Q Q R R R # S T T
P Q Q # U # S S # V
# Q Q U # U S # V V
```

解けていることが確認できます。

以上
Amazon Echo で自前スキル

## はじめに

Amazon Echo dot が届いたので、自前スキルを作ってみようと思いました。
『最近公開した映画を教えてくれるスキル』を作ってみることにしました。
[映画.comがiCal公開予定スケジュール](http://eiga.com/info/ical/)を公開してくれています。（このスキルはあくまで個人利用のみが目的です。）

<img width="1280" alt="custom_skill_top.png" src="https://qiita-image-store.s3.amazonaws.com/0/32636/d30d0c18-8165-7adb-be33-73ad9f05a103.png">


スキルの作り方を教えてくれている記事はたくさんあるので
**肝心なところだけ**書きたいと思います。


>
Alexaカスタムスキルは、以下の流れで実行します。
![](https://m.media-amazon.com/images/G/01/mobile-apps/dex/alexa/alexa-skills-kit/jp/blog/alexa-skill-flow._CB492860132_.png)
（[Alexaスキル開発トレーニングシリーズ 第1回 初めてのスキル開発 : Alexa Blogs](https://developer.amazon.com/ja/blogs/alexa/post/6e716e5c-55b0-445b-b936-9cfac4712e7b/training-1)より引用）

全体図は上図のようになっているそうです。
以下、3点に絞って書きます。

* Alexa -> Lambda
* Lambda -> Alexa
* 実機での利用

## Alexa -> Lambda

Amazonアカウントで開発者登録をしてカスタムスキルを作成する際に、エンドポイントを指定します。

<img width="789" alt="custom_skill_endpoint.png" src="https://qiita-image-store.s3.amazonaws.com/0/32636/ff2e53c6-cb87-ab00-74f5-95adf711a23b.png">

ここで、`Lambda` の `ARN` を指定するだけです。

## Lambda -> Alexa

ハンドラに指定している関数で下のように返してやると `text` を音声として喋ってくれます。

```
    response = {
        "version": "1.0",
        "response": {
            "outputSpeech": {
                "type": "PlainText",
                "text": text,
            }
        }
    }
    return response
```

https://developer.amazon.com/ja/docs/custom-skills/request-and-response-json-reference.html#response-format
上記サイトを見るともっと色んなことができます。

## 実機での利用

自分の `Amazon Echo` にどう公開していない、スキルを入れるかというところです。

カスタムスキルの設定画面のテストタブで下の画像のように

<img width="817" alt="Screen Shot 2017-12-23 at 17.29.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/32636/68b78ffb-cebf-911c-3c4d-a048cd728e43.png">

`有効`にするだけです。

すると、 `Amazon Alexa` アプリに表示されるようになります。（`すべてのスキル`で検索してもでてこないですが、`有効なスキル`で検索するとでてきました。）

<center><img width="200px" src="https://qiita-image-store.s3.amazonaws.com/0/32636/30f9302e-edba-c2e1-f3d7-6a5b543d6b7e.jpeg"/></center>

なので、開発者登録するアカウントと`Amazon Alexa` アプリにログインするアカウントは同じでないと公開していない自前スキルは使えないようです。

実際に「映画公開情報」というスキルが利用できました。

[<img width="640" alt="Screen Shot 2017-12-23 at 17.47.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/32636/05dcf81b-c709-74e0-181e-39195398eec4.png">](https://www.youtube.com/watch?v=pUsJc-TE66Q)

ソースコードです。
https://github.com/sosuke-k/skill-movie-cal/blob/master/lambda/main.py


## 参考

* [Alexaスキル開発トレーニングシリーズ 第1回 初めてのスキル開発 : Alexa Blogs](https://developer.amazon.com/ja/blogs/alexa/post/6e716e5c-55b0-445b-b936-9cfac4712e7b/training-1)
* [Amazon Alexa Skill Recipe with Python 3.6 – Jacqueline Wilson – Medium](https://medium.com/@jacquelinewilson/amazon-alexa-skill-recipe-1444e6ee45a6)
* [AWS LambdaでPythonがサポートされたので試してみた - Qiita](https://qiita.com/m-sakano/items/c53ba194a8574f44e78a)
* [カスタムスキルのJSONインターフェースのリファレンス | Custom Skills](https://developer.amazon.com/ja/docs/custom-skills/request-and-response-json-reference.html#response-format)
「GIS Day in 東京 2017」参加備忘録

# GIS Dayとは？

>GIS Dayとは、大学における GIS（地理情報システム） の教育・研究成果を講演会や講習会の形で社会に還元し、GISの普及・啓発を図ることを目的とするもので、アメリカで1999年にはじまり、全世界に広まったイベントです。首都大学東京では今年で12年目の開催となります。

>「GISってなに？」という人も、「GISを使ってみたい！」という人も一緒にGISを体験してみませんか？ もちろん参加は無料です。

引用元 [「GIS Day in 東京 2017」開催のお知らせ](http://www.comp.tmu.ac.jp/gisday/)

上記の通り、プログラマ向けのイベントではありません。
しかし、GISに近からず遠からず接しているエンジニアの方にとっては、
開かれる講習会のリストだけを見るだけでも、
この一年のGISの流れが分かったりできます。

# 「GIS Day in 東京 2017」
今年は以下のような講習会が開かれました。
GISに馴染みの無い人向け(生徒向け教材用として)の内容が３つを占めているので、
近い将来、地理感覚を習得できる人が増えてくるかもしれませんね。
また、簡易的に三次元計測ができる方法も確立されていきそうです。

- 「GIS未経験者のためのArcGIS for Desktop体験実習」
- 「地理必修化に向けてGISを活用した授業用教材作成 」
- 「都市計画GISデータ体験」
- 「Carto Builderを用いた授業教材用WebGISの作成」
- 「Network Analystはじめの一歩 」
- 「UAVを用いた3次元計測の最前線」

# 参加した講習会について　-Carto Builderを用いた授業教材用WebGISの作成-
内容は、「Carto Builder」というWebGISツールを利用して、
授業用向けの簡単なGISソフトを触ってみよう！というものでした。

WebGISは、他にもありますが、操作のしやすさ・見やすさなどの理由から、今回の題材として利用したそうです。
国土交通省が公開している下記情報を実際に取り込んで、
みじかな施設が身の回りにどれだけあるか...など、データ可視化しながら地域情報を学べそうです。
[国土交通省　国土数値情報　ダウンロードサービス](http://nlftp.mlit.go.jp/ksj/)

# このようなツールが使える人が増えたら...？
位置情報を取得する機会って増えていると思うんです。

１つに、個人が身につけているデバイスから...
- 写真機でシャッターボタンを押した瞬間
- ウェアラブルデバイスを持ちながら、ランニング
- GPSロガーアプリを持って、山登り

２つに、公の機関が公開している情報から...
- [国土交通省　国土数値情報　ダウンロードサービス](http://nlftp.mlit.go.jp/ksj/)
- [東京公共交通オープンデータチャレンジ](https://tokyochallenge.odpt.org/)

今は、車にカーナビが標準装備するような時代になりましたし、
これからももっと生活するにおいて、みじかな情報となると思います。
そして、有効利用する人も...です。

# まとめ
地図アプリ...の延長線として、
高機能なGISツールが普及する未来を見たいし、作りたい...と思う
講習会参加となりました。
pythonでのyamlやjsonのロード時にキーの重複を検知する

## はじめに

通常のjsonやyaml(PyYAML)のloadでは、元となる設定ファイルのキーに重複があった場合には後にあった値で上書きされる。エラーにならない。

例えば以下のようなJSONのnameは`"bar"`になる

conflict.json

```json
{
  "name": "foo",
  "age": 20,
  "name": "bar"
}
```

## jsonの場合

`json.load()`の`object_pairs_hook`にdictを構成する関数を自分で定義して渡す。このhookに設定された関数に渡される値は以下の様なkey-valueのペアのリストなのでここで重複判定してあげる。

```
[('name', 'foo'), ('age', 20), ('name', 'bar')]
```

以下のように。

```python
import json


def construct_dict(pairs):
    print(pairs)
    assert len(pairs) == set(pair[0] for pair in pairs)
    return dict(pairs)


with open("conflict.json") as rf:
    d = json.load(rf, object_pairs_hook=construct_dict)

print(d)
```

## yamlの場合

yamlも同様のhookを持っている。なので同様の方法で対応できる。

```python
import yaml


def construct_dict(loader, node):
    pairs = loader.construct_pairs(node)
    assert len(pairs) == set(pair[0] for pair in pairs)
    return dict(pairs)


yaml.add_constructor('tag:yaml.org,2002:map', construct_dict)

with open("conflict.yaml") as rf:
    d = yaml.load(rf)
print(d)
```

このときのconflict.yamlは以下。

```yaml
name: foo
age: 20
name: bar
```

## tomlの場合

tomlはデフォルトでキーの重複を許さない
Payload Too Large

アドベントカレンダーに参加するためにQiitaで記事作成してたら
![Payload Too Large]()
と表示されて、画像がUploadできなくなった。。。
ぐぐったところ、初回は月間2MBまでの制限があるらしい。ただし記事を投稿したことがあれば 100MB までという制限らしい。

ということで、とりあえずこの記事を投稿してみた。
nth-of-typeとnth-childをSassで書く

nth-of-typeとnth-childをscssファイルで書こうと思ったら詰まったので、備忘録として記しておきます。

# やりたかった事
以下のようなhtml構造のときに、２番目の`Project__main__icon`にだけマージンを当てたい。

```html
<div class="Project__main">
  <div class="Project__main__icon">
    <img src="/assets/img/hoge.svg" alt="">
  </div>
  <div class="Project__main__icon"> //←これにマージンを当てたい
    <img src="/assets/img/fuga.svg" alt="">
  </div>
  <div class="Project__main__icon">
    <img src="/assets/img/piyo.svg" alt="">
  </div>
</div>
```

# (先に)成功例
結論としてどうすれば上手く行ったかを載せておきます。`:nth-of-type(2)`用に1段階ネストを深くしないと当たらないんですね。

```sass
.Project {
  &__main {
    &__icon {
      &:nth-of-type(2){
        margin: 0 60px;
      }
    }
  }
}
```

# 失敗例
下記が上手くといくと思った書き方です。cssファイルでの書き方的に以下で良いと勘違いしてしまいました。

```sass
.Project {
  &__main {
    &__icon:nth-of-type(2) {
      margin: 0 60px;
    }
  }
}
```

同じようなことで困る人に記事が届きますように！

## 参考
http://marksheet.io/sass-nesting.html
【毎日プログラム講座】⑤HTMLのアウトラインを理解しよう！

<h1>FromNowOnの毎日プログラミング講座</h1>
　**[内容]**
アウトラインに使うタグの配置する場所を確認しよう。
基本的にプログラミングやコーディングにはインデントと呼ばれるスペースでタグからタグまでを合わせます。

```インデントについて.tex

aから
 bから
  cから
   dから

   dまで
  cまで

  cまで

  cまで
 bまで
aまで
スペースでどこからどこまでかをわかりやすく記述することができます。

```
- articleタグ
- sectionタグ
- asideタグ


```html
<!DOCTYPE html>
<html>
<head lang="ja">
    <meta charset="utf-8">
    <title>mini_FromNowON</title>
</head>
<body>
    <article>
        <section>
            <h1>mini_FromNowON</h1>
            <p>
                FromNowOnはオンラインプログラミングスクールです。<br>
                FromNowOnは『エラーを解決する能力を身につける』ことです。
            </p>
            <h2>毎日プログラム講座でwebについて学ぼう!</h2>
            <p>毎日プログラム講座ではwebの知識について毎日1回更新してお伝えしています。webページにはHTMLとCSSを利用してホームページを作成することができ、それにJSと言われるJavaScriptやPHPなどのプログラミング言語で動的なページを作成することやデータの保管などをすることでwebサービスを作成することができます。</p>
            <p>毎日プログラム講座で少しでもプログラミングの楽しさを知っていただければいいなと思って毎日1記事を載せています。</p>
            <p>FromNowOnは11月11日にオープンした新しいプログラミングスクールとなります。従来のプログラミングスクールより実践的な講義を行います。講義中にwebなどでしようしたいサンプルの使用方法や使えるようにする為の解決策などの提案までを行います。</p>
            <p>プログラミング言語は様々ですが毎日プログラム講座はよりわかりやすく進める為にまずは簡単なHTMLやCSSについて記述しています。わからないことはコメントやHPのお問い合わせよりご連絡いただければと思います。</p>

            <section>
                <h3>プログラミング言語は誰でもできる。</h3>
                <p>FromNowOnではwebコースとIOSコースの2つのコースがあります。webコースはHTML,CSS,PHP,MySQL,Larvelまでを学習することができます。そしてIOSコースはappleが開発した新しいプログラミング言語です。そしてモダンで早く、わかりやすい言語でアプリ開発をするには初心者向けのプログラミング言語であり実用的でこれから期待されている言語です。</p>
            </section>

            <section>
                <h3>HTMLについて</h3>
                <p>HTMLは画面の構造を作るものです。そしてHTMLの記述にはタグというものを利用してコードを書いていきます。HTMLの書き方には1つのパターンしか基本的にはありません。開始タグと終了タグの中に文字を記載することでそのタグの中の字が指定することができます。webを理解するにはまずはHTMLをマスターすることが必要になるでしょう。</p>
            </section>

            <section>
                <h3>CSSについて</h3>
                <p>CSSはHTMLの兄弟みたいなものでHTMLと一緒に使うものです。CSSはデザインを作る為のものです。HTMLが構造ならCSSは肉付けといったところでしょうか。CSSでより見やすいHPを作成することができるようになります。</p>
            </section>

            <table>
                <caption>プログラミングコース</caption>

                <tr>
                    <th>WEBコース</th>
                    <td>HTML,CSS,PHP,MySQL,LARVEL</td>
                </tr>

                <tr>
                    <th>IOSコース</th>
                    <td>XCODE,SWIFT,COCOAPOD</td>
                </tr>
            </table>
        </section>

        <aside>
            <p>FromNowOn情報</p>
            <h4>FromNowOn on-line</h4>
            <p>〒153-0063  東京都目黒区目黒1-9-22 LC 1F </p>
            <ul>
                <li><a href="https://onlinefromnowon.wixsite.com/fromnowon"></a>https://onlinefromnowon.wixsite.com/fromnowon</li>
                <li>FromNowOn【毎日プログラム講座】を要チェック<a href="https://onlinefromnowon.wixsite.com/fromnowon/blog"></a>【毎日プログラム講座】</li>
            </ul>
            <p>毎日1つwebサービスの作成方法を更新していきます。</p>
        </aside>

    </article>
</body>
</html>
```


[FromNowOnアクセスはこちらから](https://onlinefromnowon.wixsite.com/fromnowon/blog)
IT屋1年目のリアルな月別給与公開

IT業界で働くことを目指してる学生の参考になれば幸いです。
また、エンジニア含め、若手の待遇がもっとよくなるきっかけになることを願い、この記事を書いてみました。
そして、数年後の自分がここからどれだけ変化させることができたか確認するための備忘録。。。
（12月分の給与は25日に出るので、そのとき追加します）
>追記　12月の給与を反映しました

# 自分のスペック

・偏差値50ぐらいの４大私立理系卒
・情報系ではないが、授業でプログラミングを2年間経験（本屋に売ってる参考書レベルの課題の授業）
・圧倒的に技術力ない
・基本情報処理の資格保持（今年の４月に）

# 4月～6月
・ひたすら研修
・ビジネスマナー研修
・プログラミング（Java）
・テスト仕様書
・テストなど
ウォーターフォール開発の製造から結合テストまでを実施
もちろんプログラミング研修は
`System.out.println("Hello World");`
からのスタート。
後半になるにつれ、課題が重くなり、定時では上がれなくなった。
６月は毎日３時間残業していた。もちろん残業代は出ないが、研修中だし
「まっそんなもんか」という感じ。
## 給与 （単位：円）
|月|基本給|通勤費|残業代|総支給|社会保険料計|所得税|手取り|稼動時間(h)|
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|4|200000|79290|-|279290|837|4730|**273723**|**168**|
|5|200000|-|-|200000|29950|3690|**166360**|**180**|
|6|200000|-|508|200508|29951|3710|**166847**|**190**|

※社会保険料計に含まれているのは
・健康保険料
・厚生年金保険料
・雇用保険料
※１年目のため住民税は引かれていない
※稼動時間は残業込み、勤怠システムに残業時間を書いていないので、体感
※計算のつじつま合わない箇所ありますが、手取りの数字はこれなんだなぁ


# 7月～12月
・無事希望部署に配属される
・新規モバイルアプリ開発
・要件定義
・基本設計
・製造←イマココ

と上流から下流まで経験させてもらってる。
なお、研修でやったJavaは一切使ってない

使用言語
・swift
・Javascript
・PHP
・html
・css
・SQL


## 給与 （単位：円）
|月|基本給|通勤費|残業代|総支給|社会保険料計|所得税|手取り|稼動時間(h)|
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|7|200000|-|399|200399|29981|4060|**172058**|**164**|
|8|200000|-|6582|206582|29699|3930|**172683**|**164**|
|9|200000|79290|36445|315938|30297|4990|**280651**|**200**|
|10|200000|-|14250|214250|30122|4220|**179928**|**197**|
|11|200000|-|33055|233055|30179|4870|**198006**|**192**|
|12|200000|-|49075|249075|30227|5440|**226799**|**192**|
|賞与|-|-|-|260200|35620|9171|**215409**|-|

※社会保険料計に含まれているのは
・健康保険料
・厚生年金保険料
・雇用保険料
※１年目のため住民税は引かれていない
※稼動時間は残業込み
※計算のつじつま合わない箇所ありますが、手取りの数字はこれなんだなぁ
※12月は年末調整で戻ってきた分がありますが、この表には記述してないです


# 4~12月給与まとめ （単位：円）
|月|基本給|通勤費|残業代|総支給|社会保険料計|所得税|手取り|稼動時間(h)|
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|4|200000|79290|-|279290|837|4730|**273723**|**168**|
|5|200000|-|-|2000000|29950|3690|**166360**|**180**|
|6|200000|-|508|200508|29951|3710|**166847**|**190**|
|7|200000|-|399|200399|29981|4060|**172058**|**164**|
|8|200000|-|6582|206582|29699|3930|**172683**|**164**|
|9|200000|79290|36445|315938|30297|4990|**280651**|**200**|
|10|200000|-|14250|214250|30122|4220|**179928**|**197**|
|11|200000|-|33055|233055|30179|4870|**198006**|**192**|
|12|200000|-|49075|249075|30227|5440|**226799**|**192**|
|賞与|-|-|-|260200|35620|9171|**215409**|-|
|計|-|-|-|2369297|277133|48791|**2043373**|-|

計算ミスに気付くも、直すのめんどくさいので完全一致ではないですが、ざっとこんな感じです。。。


残業代は全部出るし、やりたい仕事をやらせてもらっている。働いてる人も人間的に尊敬できる人が多く、良い環境だと思う。給与が今の時代に少し合ってないのでは？ぐらい。

これで今回の記事は終わりますが、これからはスキルアップのため、Qiitaに技術的なことのアウトプットもしてくので、よろしくお願いします！
レンダリングブロックとは何なのか 実際にやってみた

# はじめに
最近、dev.toが高速だと注目され、Webページの高速化が一層話題にされるようになりました。そんな中で、「レンダリングブロックなコンテンツを排除しろ」という記述をよく見かけます。そこで、サーバーとのやり取りとレンダリングの流れを追って、CSSやJavaScriptがどのようにレンダリングをブロックしているのかを確認してみました。

# 方法
Netcatにポートをlistenする機能があるのでそれを利用しました。

```
$ nc -kl localhost 8000
```
Netcatでlistenしているポートに対してブラウザでアクセスします。
実験を行った環境は以下になります。

- Google Chrome 63.0.3239.108
- Ubuntu 16.04

# CSS、JavaScriptなしのページ
![image.png](https://qiita-image-store.s3.amazonaws.com/0/174915/ebca9498-4d6e-9c0e-ecb5-6cb99bd85ee4.png)
HTMLタグなどが、送信される度に順次レンダリングされていきます。

# HEADに直接CSSを埋め込む
以下のようなHTMLを返してみます。

```html
<html>
<head>
  <title>Title</title>
  <style>h1{color: red;}</style>
</head>
<body>
<h1>
Content
</h1>
</body>
</html>
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/174915/58934e36-4957-d252-2dd6-bd7cd3665076.png)
タグを送信した段階でレンダリングされるのが分かります。スタイルも適用されています。

# HEADタグ内で外部CSSを指定する

```html
<html>
<head>
  <title>Title</title>
  <link rel="stylesheet" type="text/css" href="style.css">
</head>
<body>
<h1>
Content
</h1>
</body>
</html>
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/174915/1e2c23c2-2456-bd02-c340-8503cff81549.png)
HTMLタグを送信してもレンダリングは行われません。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/174915/8f541aa2-e5da-8ecf-7d54-664a5a2e193e.png)
CSSの送信が終わってやっとブラウザに先ほど送信したHTMLがレンダリングされました。

**外部CSSはレンダリングをブロックすることが確認できました。**

次にJavaScriptを試してみます。
# HEAD内に直接JavaScriptを埋め込む

```html
<html>
<head>
  <title>Title</title>
  <script>alert('Executed!');</script>
</head>
<body>
<h1>
Content
</h1>
</body>
</html>
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/174915/67520aba-a579-62c3-7c64-fa6ae8cb6e4e.png)
`<script></script>`を送信した時点でJavaScriptが実行されます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/174915/50bfac0e-d822-c4c2-76e5-81e16857780a.png)
レンダリングも問題なく行われました。

# 外部JSを指定する
```html
<html>
<head>
  <title>Title</title>
  <script src="main.js"></script>
</head>
<body>
<h1>
Content
</h1>
</body>
</html>
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/174915/09d0e076-df96-466e-37f8-1fb9ee61eb18.png)
JavaScriptを読み込むまでbodyはレンダリングされません。

# IMGタグ内の画像

```html
<html>
<head>
  <title>Title</title>
</head>
<body>
<h1>
Content
</h1>
<img src="image.png">
Content2
</body>
</html>
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/174915/d199c2bf-e0f9-f7ed-ec17-e219d38e0504.png)
imgタグでの画像指定はレンダリングをブロックしません。

# CSSのbackground-imageの指定

```html
<html>
<head>
  <title>Title</title>
  <style>
    body {
      background-image: url('background.png');
    }
  </style>
</head>
<body>
<h1>
Content
</h1>
</body>
</html>
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/174915/c3bf0f3a-f339-47ed-a550-543a19915db9.png)
レンダリングされました

# 結論
- `<head>`内で外部のCSSやJavaScriptを指定するとその読み込みが終わるまでレンダリングが行われない。
- CSSでの外部ファイルの参照はレンダリングをブロックしない。
Access から SQL Database にデータ移行する方法

この記事は、[Microsoft Azure Tech Advent Calendar 2017](https://qiita.com/advent-calendar/2017/microsoft-azure-tech) のための記事となります。
今日は、Azure のサービスのなかで SQL Database についてのお話です。 
**本情報の内容（添付文書、リンク先などを含む）は、作成日時点でのものであり、予告なく変更される場合があります。**

# はじめに #
Access から SQL Server に移行するケースは、いくつかあると聞いています。でも、折角だからオンプレの SQL Server ではなく Managed Services である SQL Database に移行して、より運用管理にかかる作業を効率化していただくのもよいと思います。この記事では、その手順についてご紹介いたします。

# 手順 #
## 事前準備 ##
+ 移行先 SQL Database の作成
　どんな方法を使ってもいいのですが、一番簡単にできるのは[Azure Portal](https://portal.azure.com) から作成する方法です。新規→ダイアログで **”SQL Database"** を検索します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/135357/822c87bc-a09e-e373-645b-bdc5fa689ae2.png)

** SQL Database ** を空の状態で作成します。スクリーンショットはご参考まで。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/135357/3365cf8d-b30f-06bc-e72f-f0a82c7b8eea.png)

必要に応じて**サーバーファイアウォールの設定**を行います。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/135357/971fc767-fd39-bdc2-08b2-a8b8c0e15d33.png)

 
+ Microsoft Access Database Engine 2016 のインストール
　[Microsoft Access Database Engine 2016 Redistributable](https://www.microsoft.com/en-us/download/details.aspx?id=54920) をダウンロードしてインストールします。

+ SQL Server インポートおよびエクスポートウィザードのインストール
　**SQL Server インポートおよびエクスポートウィザード** は**SQL Server Data Tools (SSDT)** もしくは **SQL Server** に含まれています。必要に応じてインストールします。

### 参考リンク ###
[SQL Server インポートおよびエクスポート ウィザードを使用してデータをインポートおよびエクスポートする](https://docs.microsoft.com/ja-jp/sql/integration-services/import-export-data/import-and-export-data-with-the-sql-server-import-and-export-wizard)
[SQL Server Data Tools (SSDT) のダウンロード](https://docs.microsoft.com/ja-jp/sql/ssdt/download-sql-server-data-tools-ssdt)

## Access ファイルの分割 ##
Access を起動します。データベースツール→データの移動→*Access データベース*を選択し、ファイルを分割します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/135357/f05fd9a6-82d1-42ab-bff7-9e46f04425d4.png)

## SQL Server インポートおよびエクスポートウィザードを使用 ##
![2017-12-23_16h06_38.png](https://qiita-image-store.s3.amazonaws.com/0/135357/9a474e48-798c-3993-9065-9db7b31cd5e6.png)
データソースで**Microsoft Access(Microsoft ACE.OLEDB.16.0)*を選択し、ファイル名で分割したファイルを指定します。
![2017-12-23_16h07_24.png](https://qiita-image-store.s3.amazonaws.com/0/135357/5a3e075d-8c99-7e79-9dd0-8b805fc6ede5.png)

![2017-12-23_16h10_11.png](https://qiita-image-store.s3.amazonaws.com/0/135357/608fc154-089f-895a-97de-d9bc4cd55ae5.png)
![2017-12-23_16h13_01.png](https://qiita-image-store.s3.amazonaws.com/0/135357/3f8c9079-35a1-ef2e-35dc-1c82107cd3c1.png)
![2017-12-23_16h13_25.png](https://qiita-image-store.s3.amazonaws.com/0/135357/d66fe6c3-852b-df53-5e13-b7c2dded8780.png)
![2017-12-23_16h13_50.png](https://qiita-image-store.s3.amazonaws.com/0/135357/1ae73a3b-9923-2858-91d0-c7273133e176.png)
![2017-12-23_16h14_35.png](https://qiita-image-store.s3.amazonaws.com/0/135357/863d5203-dbfb-71fe-40a3-b7dbcb59391b.png)
![2017-12-23_16h14_49.png](https://qiita-image-store.s3.amazonaws.com/0/135357/cbb6137c-55d0-1293-db5e-008f37e03bd1.png)

実際に移行される場合は移行対象を選択したり、クエリで絞ってもよいです。

# まとめ #
SQL Server 同様に、Access から SQL Database へのデータ移行は簡単に実施可能です。Access をご利用のお客様でデータ容量や、利用ユーザー数が増えた場合や高度なレポーティングサービスが必要になった場合などにこういったデータ移行をご検討いただけると幸いです。
Python の文字列配列の各末尾に文字列を付加する方法

※ 2017-12-24 [shiracamus](https://qiita.com/shiracamus) さんの指摘をうけて大幅に修正しました。


# したいこと

下記 `A`, `B`, `C` それぞれの値の末尾に `1` という文字を加えたい。

```pycon
>>> A = ['a', 'b']
>>> B = pandas.Series(['a', 'b'])
>>> C = numpy.array(['a', 'b'])
```

```:ほしい形
['a1', 'b1']
```

# 結論

```pycon:リストの場合
>>> A = ['a', 'b']
>>> [s + '1' for s in A]
['a1', 'b1']
```

```pycon:Seriesの場合
>>> B = pandas.Series(['a', 'b'])
>>> B + '1'  # + 演算子で実現できる
0    a1
1    b1
dtype: object
```

```pycon:numpy.arrayの場合
>>> C = numpy.array(['a', 'b'])
>>> C.astype(object) + '1'  # dtype=object にすれば + 演算子で実現できる
array(['a1', 'b1'], dtype=object)
```

# 派生：配列同士を結合する場合

```pycon:リストの場合
>>> A1 = ['a', 'b']
>>> A2 = ['1', '2']
>>> [a + b for a, b in zip(A1, A2)]   # zip を使う
['a1', 'b2']
```

```pycon:Seriesの場合
>>> B1 = pandas.Series(['a', 'b'])
>>> B2 = pandas.Series(['1', '2'])
>>> B1 + B2  # 前述と同様
0    a1
1    b2
dtype: object
```

```pycon:numpy.arrayの場合
>>> C1 = numpy.array(['a', 'b'])
>>> C2 = numpy.array(['1', '2'])
>>> C1.astype(object) + C2.astype(object)  # 前述と同様
array(['a1', 'b2'], dtype=object)
```

# 注意

通常の配列(リスト)と `array-like` は挙動がかなり違うので常に意識すること。

```py:In(配列の場合)
>>> A1 = ['a', 'b']
>>> A2 = ['1', '2']
>>> A1 + A2
['a', 'b', '1', '2']
```

このように配列(リスト)を単純に `+` すると縦方向に連結される。
ネットワーク技術＆設計入門 で改めて調べた用語集1

ネットワーク・インフラ用語に関してあまりにも無知だったので読み始めましたが、分からない単語多すぎでした。
読むたびに追加して、スラスラ理解できるようにするため用語集を残します。

#VLAN
VirtualLan。物理的な接続形態とは独立して仮想的なLANセグメントを作る技術

#L2スイッチ
パケットに宛先情報として含まれるMACアドレスで中継先を判断し、中継を行う
OSI参照モデルにおけるデータリンク層（レイヤー2）に属するのでL２

#L3スイッチ
パケット交換を行うスイッチ。パケットの送信先アドレスを振り分ける。
OSI参照モデルにおけるネットーワーク層（レイヤー３）に属するのでL３

#ARP
IPアドレスによってネットワーク上のホストのMACアドレスを得るための
アドレス解決プロトコル

#100BASE-TX(MDI-Xのこと）
いわゆる普通のLANケーブル。
MDIはピンの１番と２番を送信用に、３番と６番を受信用に使用する。
PCやサーバのNIC、ルータの物理ポートはMDI。
MDI-Xは１番と２番を受信用に、３番と６番を送信用に使用する。
L2スイッチ、L3スイッチはMDI-X

#1000BASE-T
1000BASE-TXの使用されていない残りの４ピンも使用して
スループット向上を図ったもの。

#DHCP（Dynamic Host Cofiguration Protocol)
TCP/IPネットワークに置いてホストに設定情報を伝達する為の仕組み。
クライアント・サーバ方式でHDCPサーバがネットワークアドレスを動的に割り当て、設定情報とともに
ホストに送信する。

#ICMP
TCP/IPで接続されたコンピュータやネットワークの状態を、メッセージとして伝送する為に使われるプロトコル。
IPの拡張版にあたり、RFC792で定義される。

#RFC792
ICMPを標準化している企画。

#NAT（Network Address Translation）
IPアドレスを変換する技術。プライベートIPをグローバルIPに変換する技術。
IPアドレスを使用して構築したネットワーク、企業ネットワークでは、プライベートIPを使用して構築されたネットワークなので
企業LANネットワークのクライアントPCがインターネットに接続する場合、プライベートIPアドレスをグローバルIPアドレスに
変換（NAT）する必要があります。

#FHRP
冗長化プロトコルのHSRPはCisco独のプロトコル。
HSRPやCRRPの様なファーストホップルータを冗長構成にする為のプロトコル。

#ファーストホップ
最初に無線LAN接続されるスイッチ。
無線リンク接続が一か所のものをシングルホップ接続。
パケットが中継されていくものをマルチホップ接続。

#HSRP(Hot Standby Router Protocol)
デフォルトゲートウェイを冗長化するための
シスコ独自のプロトコル。L3デバイスにIPとMACアドレスを共有させる事が出来るので、デフォルトゲートウェイのパスを冗長化させる事が出来る。

#VRRP
HSRPと同様デフォルトゲートウェイを冗長化させるものだが、規格がシスコではなく、RPC3768,5789。
どちらか選ぶならVRRPを選ぶのが無難。

#NTP(NetWork Time Protocol)
機器が持つ時計を正しい時刻へ同期するための通信プロトコル。
OSI基本参照モデルの第7層（アプリケーション層）に位置し、UDPポートの123番を使用する。

#SNMP（Simple Network Management Protocol)
ネットワークデバイスを管理するプロトコル。
トランスポート層のプロトコルには、UDPの161,162を使用する。

#CDP（Cisco Discovery Protocol)
シスコ独自のプロトコル。デフォルト有効。レイヤ2。

#LLDP(Link Layer Discovery Protocol)
IEEE802.1ABで定義されたマルチベンダ対応プロトコル。デフォルト無効。

#MDI-X
LANの差込口仕様の一つ。ピン１，２が受信。３，６が送信に割り当てられている。

#Macアドレス
ハードウェアに焼き付いている物理的なアドレス。
#arp
物理と論理の架け橋を果たす
ipアドレスと、Macアドレスの関連付け
ipアドレスから、Macアドレスを求める

#TTL(Time To Love exceeded)
パケットの寿命。ネットワークを経由するたびに一つずつ減算され値が０になると破棄される。
pecoでSSH - AWS EC2に入れてみた

# まえがき
踏み台サーバーのEC2からいろいろなサーバーへSSH接続するときのTipsです。pecoを使ってHost名をインクリメンタルサーチし、EnterひとつでSSH接続できるようにしましょう。

# .ssh/configを設定する
.ssh/configを使うメリットなどは以下を参考にしてください。
https://qiita.com/passol78/items/2ad123e39efeb1a5286b
例えば、以下のように.ssh/configを作成します。

```
Host dev-machine01
HostName 52.192.64.xxx
User ec2-user
IdentityFile ~/.ssh/dev-machine.key

Host dev-machine02
HostName 52.192.64.yyy
User ec2-user
IdentityFile ~/.ssh/dev-machine.key
```
すると、踏み台サーバーで

```
ssh dev-machine01
```
とコマンドを打つだけで52.192.64.xxxへSSH接続できます。

多少は便利になりましたが、Host名を覚えておかなければいけないのは大変です。そこでpecoを利用してHost名をインクリメンタルサーチできるようにしましょう。

# pecoをインストールする
wgetを使ってインストールする。

```
wget https://github.com/peco/peco/releases/download/v0.5.2/peco_linux_amd64.tar.gz
tar xvfz peco_linux_amd64.tar.gz
cd peco_linux_amd64
chmod 100 peco
sudo mv peco /usr/local/bin/
rm -r peco_linux_amd64 peco_linux_amd64.tar.gz
```
pecoがインストールできたら以下のコマンドで.ssh/configの中からHost名をインクリメンタルサーチしてみましょう。

```
grep -w Host .ssh/config | peco
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/201287/b448d977-49e7-ac98-d690-5751b8f6b465.png)
こんな感じになれば成功です。

# aliasを設定する
最後にHost名をインクリメンタルサーチし、EnterひとつでSSH接続するコマンドにaliasを設定しましょう。~/.bashrcに以下を書き込みます。

```
alias s='ssh $(grep -w Host ~/.ssh/config | awk '\''{print $2}'\'' | peco)'
```

```
source ~/.bashrc
```
で再読み込みして、sというコマンドが打てれば成功です。
[BUKURO.swift]振り返りと目標

<p>二年前に勉強会の運営方法が変わり一時は活動が停止しそうな状況となりましたが、皆さんのご協力のもと何とか継続してきました。最近は開催頻度を下げ発表の質を高め、他勉強会にも積極的に参加し、内容を見直しして結果なのか、新たな参加者も増えてきました。</p>

<p>来年も、勉強会の活動を通じてプログラマーが楽しくプログラミングできるよう目標を掲げて活動していきたいと思いますので、宜しくお願いします！</p>

<ul>
<li>勉強会に参加された方全員が学び得る場を提供！</li>
<li>勉強会に参加できない方も学び得るよう、勉強会の成果をアウトプットする！</li>
<li>プログラマの拠り所となる！</li>
</ul>

関連情報
<a href="https://cocoa-kanto.connpass.com">Cocoa勉強会 BUKURO.swift (connpass)</a><br />
<a href="https://atnd.org/groups/cocoa-study">Cocoa勉強会 BUKURO.swift (ATND)</a><br />
<a href="http://cocoa-study.peatix.com">Cocoa勉強会 BUKURO.swift (Peatix)</a><br />

【Cocoa練習帳】
<a href="http://www.bitz.co.jp/weblog/">http://www.bitz.co.jp/weblog/</a><br />
<a href="http://ameblo.jp/bitz/">http://ameblo.jp/bitz/</a>（ミラー・サイト）<br />
<a href="https://t.co/6P3h2jtbRk>note</a><br />
<a href="https://qiita.com/m_yukio>Qiita</a><br />
ストリーミングモデルにおける文字列処理

今回は最近流行り（？）のストリーミングモデルにおける文字列処理について簡単に紹介しようと思います．テクニカルな内容を期待している方には申し訳ありませんが，今回はこういうことが研究されているよぐらい，かつ短い記事です．

# ストリーミングモデルにおける文字列照合問題
説明を簡単にするために，文字列照合問題に絞ってお話します．
ストリーミングというからには，テキスト全体がわかっているということはありません．テキストは一文字ずつやってきて，その都度その位置を終了位置とするパターンの出現があるかないかを高速に計算しましょうというものです．もちろんパターンは事前に与えられているものとして，前処理をしておいてかまいません．
さてこの設定ではいわゆるオンラインアルゴリズム（15日目 [@hdbn](https://qiita.com/hdbn) さんの[記事](https://qiita.com/hdbn/items/b3909ce29a46c5d0cb8c)でも取り上げられています）じゃないかと感じるでしょう．その通りです．では何を持ってしてストリーミングアルゴリズムと呼ばれるのでしょうか．それは**領域の制約**です．通常であれば，パターン長に線形な領域（以降パターン長を $m$ として $O(m)$ 領域）の前処理をしておけばこの問題を高速に解くことができますが，ストリーミングアルゴリズムは欲張りで，高速でありながらこの領域すら削減を目指します．

![stream.png](https://qiita-image-store.s3.amazonaws.com/0/211129/22273f8b-3763-382f-6c7e-041136d56562.png)

そんなことができるのでしょうか．次のようなことが知られています．

|定理 1       　　　         |
|:--------------------------|
|オンライン文字列照合問題の決定性アルゴリズムは，$\Omega(m)$ 領域必要である．           |
>R. Clifford et al., "[A Black Box for Online Approximate Pattern Matching](https://link.springer.com/chapter/10.1007%2F978-3-540-69068-9_15)", CPM 2008

そう，**決定性**アルゴリズムではできないのです．というわけで，話は乱択アルゴリズムへと変わります．ここでは，高い確率で正しく出力するけどたまに間違えるかもねってことです．決定性は正しく答えないといけないので $O(m)$ 領域使わない，つまり**パターンそのものすら保持できない**ことを考えるとこの結果にもうなずけますが，実は乱択にしてもこの $\Omega(m)$ 領域が必要なのではないかと長く信じられていたようです．

#### 文字列照合問題におけるブレークスルー
ですが安心してください．2009年にこの問題に対して救世主が現れました．

|定理 2       　　　         |
|:--------------------------|
|$O(\log m)$ 領域の前処理をしておけば，一文字あたり $O(\log m)$ 時間の処理でパターンの存在を判定できる．エラーの確率は $\frac{1}{n^2}$ である（$n$ はテキスト長）．|
>B. Porat and E. Porat, "[Exact and Approximate Pattern Matching in the Streaming Model](http://ieeexplore.ieee.org/document/5438620/)", FOCS 2009

見る人が見ればわかるトップカンファレンスに採択された論文です．ちなみに，一文字あたりの計算時間を平均的に解析するとなんと定数時間だそうです．
今回はテクニカルな内容は話さないのですが，どの部分を乱択にしているのかだけ簡単に説明すると，それは部分文字列の比較です．**Finger print** というものを使います．これは，文字列を適当な数値に変換するもので，同じ文字列であれば数値は必ず同じになりますが，ある程度低い確率で異なる文字列が同じ値になってしまいます．つまり，数値の比較という簡単な操作で高速に文字列の比較を高い確率でできるということです．

#### ブレークスルーのその後
上記の結果も非常にすごいのですが，この後さらに改善されていきなんとなんと...

|定理 3       　　　         |
|:--------------------------|
|$O(\log m)$ 領域の前処理をしておけば，一文字あたり $O(1)$ 時間の処理でパターンの存在を判定できる．エラーの確率は $\frac{1}{n^{\alpha}}$ である（$\alpha > 0$ ）．|
>D. Breslauer and Z. Galil, "[Real-time Streaming String-matching
](https://dl.acm.org/citation.cfm?id=2635814)", ACM Transactions on Algorithms, 2014

もういうことはありませんね．ここまでが（厳密一致）文字列照合問題の話でした．

# 様々な問題
上では簡単に厳密一致文字列照合問題について紹介しましたが，最後に他の問題についてどんなものが研究されているかいくつか挙げておわりにしたいと思います．

#### k-ミスマッチ文字列照合問題
この問題は，パターンと同じ長さのテキストの部分文字列と $k$ 文字まではマッチしてなくても出現したとみなす文字列照合問題です（例えば，aabab と abbaa は 2-ミスマッチや 3-ミスマッチ問題ではマッチします）．この問題に対しての結果は，実は上の定理 2 で紹介した論文で紹介されています．また最新の結果としては，R. Clifford らの以下の論文で発表されています．
>R. Clifford et al., "[The k-mismatch Problem Revisited](http://epubs.siam.org/doi/10.1137/1.9781611974331.ch142)", SODA 2016

#### その他の問題
文字列照合問題には様々なバリエーションがあり，上のミスマッチを許した照合以外にも，Wildcard を含んだ文字列照合問題，パラメタ化文字列照合問題や辞書照合問題などに対してストリーミングアルゴリズムが提案されています．
さらに文字列照合以外にも， 文字列の最小周期，ハミング距離，回文構造などを計算する問題のストリーミングモデルでのアルゴリズムが研究されています．

# さいごに
今回は短いですが，これで終わります．
ストリーミングモデルにおける文字列アルゴリズムの研究はまだまだやることがたくさんあると思います．しかもこれまでの成果の多くがトップカンファレンスに採択されているという業界の方には良いフィールドかもしれませんね．
大した内容ではありませんでしたが，読んでいただいてありがとうございました（また後日，追記などする可能性が大いにあります）．
macでインストールできない（vertualbox/OS:High Sierra）

# 環境

- macOS: High Sierra

# 事象

- vagrant構築のため、vertualboxをインストールしていたが、なぜかインストールできず、、
<img src="https://qiita-image-store.s3.amazonaws.com/0/120047/3ba0a334-2840-8e74-feef-4b23168994eb.png" width="80%">

# 対応

- [こちらどおり](https://apple.stackexchange.com/questions/300510/virtualbox-5-1-8-installation-didnt-install-kernel-extensions-how-do-i-fix-thi)対応した
- 設定 > セキュリティとプレイバシー > 一般タブで、右下の「Allow」を押す
<img src="https://qiita-image-store.s3.amazonaws.com/0/120047/50039155-f8fe-553b-d39f-e4fee8373b77.png" width="80%">

# ちなみに

- qiitaで画像サイズを変更するには、まず投稿したうえで、編集ボタンを押して、、

```
before:
![~~.png](~~url~~)
　　↓
after:
<img src="~~url~~" width="80%">
```
Node.jsでSlackにファイルをアップロードするCLIツールを作ってみた

ターミナルで作業しているときにSlackにファイルをアップロードしたい場面って結構多くないですか？
そんなときにターミナルからコマンドでファイルをアップロードするシンプルなCLIツールを
Node.jsで作ってみました。

# 作ったもの

:sparkles: [slaup](https://github.com/tamanugi/slaup)

```
slaup 1.0.0

   USAGE

     slaup <filepath>

   ARGUMENTS

     <filepath>      Path to upload file      required

   OPTIONS

     -t <token>         Slack API Token                            optional
     -c <channels>      Comma-separated list of channel names      optional
     -f <filename>      Filename of file                           optional
     -m <comment>       Initial comment to add to file             optional
     -k <filetype>      A file type identifier                     optional

   GLOBAL OPTIONS

     -h, --help         Display help
     -V, --version      Display version
     --no-color         Disable colors
     --quiet            Quiet mode - only displays warn and error messages
     -v, --verbose      Verbose mode - will also output debug messages
```

# 使い方

**インストール**

```
$ npm install -g slaup
```

**ファイルアップロード**

`-t <slack token>` でSlackのAPIトークンを指定
`-c <channels>`でアップロード先のチャンネル名を指定します
チャンネル名はカンマ区切りで複数指定できるようになっています

```
$ slaup -t enter_your_slack_token -c general,hogehoge test.txt
```

SlackのAPIトークンは[こちら](https://api.slack.com/custom-integrations/legacy-tokens)から生成できます

またトークンとチャンネルは環境変数で設定することもできます

```
$ export SLAUP_SLACK_TOKEN=enter_your_slack_token
$ export SLAUP_CHANNELS=general,hogehoge
$ slaup test.txt
```

**その他オプション**

オプションとして以下も指定可能です

`-f filename`: アップロードするファイル名の指定
`-m comment`: コメント
`-k filetype`: スニペットのファイル種類を指定

# 使用モジュール

- [caporal](https://www.npmjs.com/package/caporal) : CLIツールのためのフレームワーク
- [chalk](https://www.npmjs.com/package/chalk) : ターミナルへの文字出力に色を付けるためのモジュール
- [ora](https://www.npmjs.com/package/ora) : スピナー(ローディング中などにくるくるまわるやつ) を簡単に追加できるモジュール
- [request](https://www.npmjs.com/package/request) : 言わずもがな有名なHTTPリクエスト送るためのモジュール

`chalk`と`ora`は [vue-cli](https://github.com/vuejs/vue-cli) で使ってるのを見つけて使ってみました。
手軽にターミナル出力をリッチにできるのがいいですね :sparkles:

#　まとめ

SlackにファイルをアップロードできるCLIツールは実は他にもあったりしますが、
Node.jsでCLIツールを作ってみたくて今回作ってみました。

色々なモジュールが揃っているのでさくっと作れていいですね。
今後もちょっとした機能追加などはしていきたいなと思います。
Tilemap Editorショートカットキーのメモ

この投稿では、UnityのTilemap Editorのショートカットキーを紹介します

# ショートカットリスト

* s : 範囲選択
* m : 範囲選択した部分を移動
* b : 選択中のタイルで描画
* u : 矩形塗りつぶし
* g : 領域塗りつぶし
* shift / d : 削除
* Ctrl(Wim) / Cmd(Mac) もしくは  i : スポイト領域選択
* . (Win) / } (Mac) 時計回り90度回転
* , (Win) / { (Mac) 反時計回り90度回転
* Shift + . (Win) / Shift + } (Mac) 垂直方向反転
* Shift + , (Win) / Shift + { (Mac) 水平方向反転

# s : 範囲選択と m : 範囲選択した部分を移動

![move2.gif](https://qiita-image-store.s3.amazonaws.com/0/4125/6d87f399-9a39-6182-6080-097826ca4702.gif)

# u : 矩形塗りつぶし

![rect.gif](https://qiita-image-store.s3.amazonaws.com/0/4125/89f17138-0134-4a46-ac38-bda6ea7330da.gif)

# g : 領域塗りつぶし

![fill.gif](https://qiita-image-store.s3.amazonaws.com/0/4125/8d9fff04-1c1e-624b-02c4-3690370eedd4.gif)

# i : スポイト領域選択 と d : 削除

# i : スポイト領域選択 と , (Win) / { (Mac) 反時計回り90度回転

![rotate.gif](https://qiita-image-store.s3.amazonaws.com/0/4125/d4935e5d-801b-48d7-0ffd-d8bc51cc13dc.gif)

# 関連参考

* [Painting Tilemaps](https://docs.unity3d.com/Manual/Tilemap-Painting.html)
* [【Unity道場】使って覚えるTileMap](https://www.slideshare.net/UnityTechnologiesJapan/tilemap)
tvOS + WebRTC part1

#　「書けるだろう！」と思って調子に乗った結果www

<img width="1168" alt="スクリーンショット_2017-12-22_11_01_40.png" src="https://qiita-image-store.s3.amazonaws.com/0/31237/9e034c0a-717c-f3f7-1c84-aa5bb1d5025e.png">

2日連続だし、ネタとしてもジャンルが違すぎる・・・tvOSも最近触ってないし・・・
ああああどうしよう、ネタがネタが・・・・


**そうだ、tvOSでWebRTCを動かそう**

# 調査

思い立ったが吉日、やっていきましょう。

## できるのだろうか
そもそもWebRTCをAppleの世界で動かすにはもちのろん、自前での実装はエグいのでライブラリなりサービスの利用が必要になります。当然今の日本にtvOSでWebRTCをやるような狂気を感じるSDKを提供しているベンダーはないようです。

**iOS**用のライブラリはちゃんとあるので、これをよしなにいじってやる手段が一番近くて遠い気がします。

[WebRTC 63.11.20455](https://cocoapods.org/pods/WebRTC)

そもそもtvOSってカメラを繋げないので、映像を受信するだけのアプリを作れたらとりあえずは御の字じゃないでしょうか。
もちろんtvMLに載せるような狂気マシマシなことはしない。

## やっている人おるやん

圧倒的なインターネット力を用いて、すでに試みている狂人を見つけることができた。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="en" dir="ltr"><a href="https://twitter.com/hashtag/webrtc?src=hash&amp;ref_src=twsrc%5Etfw">#webrtc</a> running on <a href="https://twitter.com/hashtag/tvos?src=hash&amp;ref_src=twsrc%5Etfw">#tvos</a> using around 40% of 1 core for receiving a 720p VP8 stream <a href="https://t.co/CucGDogaFZ">pic.twitter.com/CucGDogaFZ</a></p>&mdash; kapejod (@kapejod) <a href="https://twitter.com/kapejod/status/708006460018573313?ref_src=twsrc%5Etfw">2016年3月10日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

しれっとやっている。参考にgistも書いてくれている、急なイージーゲームになってきた。
[kapejod氏のgist](https://gist.github.com/kapejod/d99ec6e6ce206bd584055ec75ad63740)を見ていると圧倒的なヒントを得られた。

```
How i have built WebRTC for tvOs
 (some time ago....might not apply anymore)[もう動かないかもね]
```

いやいや、そんな切ないことを言わないでくれ。君はtvOSと向き合うクリスマスに訪れた唯一のサンタさんなんだ・・・

# 作る

そしてこの作る部分を第二部として明日書く分に回すことで、アドベントカレンダー2daysを切り抜ける。
まさに卑怯。
効率的なモデリングをマネージメントする その２ - モデリングの戦略 -

## はじめに
ソフトウェア開発は危険です。急に暴れることから、ある時は狼男、ある時は熊に例えられます。まじめにコツコツと働いていたのに、突然現れた狼男や熊によって計画が台無しになってしまいます。

混乱に陥ったプロジェクトを見てみると、混乱の原因は意外と明確です。しかも、当事者である若いメンバーから部門のマネージャに至るまで、だいたい答えられることも多いでしょう。しかし時すでに遅し、混乱を押さえるには仕切り直して計画や配員を見直さないとプロジェクトを立て直すことができないでしょう。

## 不確実コーンを細くする

社会の発展や競争の激化、ソフトウェア技術の進歩によってソフトウェア開発期間は短く、より多機能になり、見積もりの振れ幅を時間軸で示した不確実コーンは広く、短くなっています（[[#TiDD] 最近のソフトウェアを考えるとアジャイルに向かう](http://sakaba.cocolog-nifty.com/sakaba/2012/12/tidd-74ba.html)）
![不確実コーンの変化](http://sakaba.cocolog-nifty.com/photos/uncategorized/2012/12/11/photo.png)

そこで、短い期間に区切って段階的に開発するアジャイル開発が増えてきています。 これば、不確実コーンを小さなコーンに分ける方法です。 アジャイル開発はUXを重視する場合や、まずはビジネスを開始したい場合には、実際の動作を見極めながらの方向性の変更や、必要なものからビジネスの支援が可能なので、とても効果的です。

しかし、必要な機能を分解できない場合や、イテレーション（スプリント）を複数回実施できないほど短期間の開発の場合には、効率的なモデリングでリスクを下げて不確実コーンを小さくする必要があります。

そこで求められるのは、戦略的な考え方です（[[#agileto2012] 『チェンジ！』の考え方 ～マネしやんと！～](http://sakaba.cocolog-nifty.com/sakaba/2012/11/agileto2012-e07.html)）。その時点で最も効果のあるポイントをのモデルを作成する必要があります（大規模開発の場合は、ランチェスターの法則（[ランチェスターの法則と売り上げ、利益、利益率](http://sakaba.cocolog-nifty.com/sakaba/2015/01/post-140f.html)）に従って総力戦も可能ですが、重点の見極めは大切です）。

作成するモデルは、ドキュメントとして完成されたものでなくても、考える道具になり、ステークホルダーと共有できるなら、なんでも良いでしょう。以下にパターンに分けて説明しましょう。

### 全体が曖昧な場合

何かを作ってしまうと、それに引きずられて全体像が見えにくくなる場合がありますので、全体がぼんやりとしている時にわかる所から作り出すのは賢明ではありません。

全体像を抽象的な方向性でなく、具体的な構造を考えて実現可能性を高めます。具体的には、業務フロー、シーケンス図など全体の流れがわかるモデルを作成します。モデルを書いてみると、そこには業務の用語やデータが見えてくると思います。

### 抜けがあるような気がするとき

データをモデリングします。必要なデータを探してまとめます。ER図でも、オブジェクト図やクラス図でも、ただの一覧でも構いません。
次に見つけたデータがどこで作られ、どこで更新され、どこで削除されるかの説明を試みます。説明ができたなら不安が解消していると思いますが、精査したければやり過ぎないレベルでCRUDを書いてみても良いでしょう。

### 実装イメージがわかない、自信が無いとき

あまり経験の無い環境などで、自信が無いなら調べましょう。インターネット上の記事は大まかな知識や事例を知るには役立ちますが、最終的には公式ドキュメントで確認しましょう。

それでも不安が残ったり、わからない所がある場合はプロトタイプを作成します。プロトタイプは全ての実装ではなく、課題となっている所を抜き出して単純化したものですので、まさに「モデル」です。

## モデリングのポイント

ここで示したモデリングの方法は、以下の3点を明確にするものです。

- 全体のイメージ
- データと関係
- 関連ソフトウェアの詳細仕様

これらのモデリングを考える道具道具として使い、リスクを排除します。これによって不確実コーンを細くして、ソフトウェア開発の混乱を少なくします。

ここで注意しないといけないのは、前回（[効率的なモデリングをマネージメントする その１ - モデリングの目的 -](https://qiita.com/sakaba37/items/00b5a92ee9a8487ccc2a)）に書いた様にモデリングの目的には様々あるものの、ここで挙げた方法は

- 見つける、理解する
- 整理する
- 作り出す

といった目的が中心です。つまり、モデリングの全ての目的ではないのです。モデリングでリスクを低減するには、リスクそのものにポイントを絞ったモデリングが必要で、その他の目的を達成する際の参考になりますが、不十分なものです（プロトタイプと同じです）。しかし、それでも優先してモデリングすることが重要なのです。

## おわりに

ここであげた効率の良いモデリングとは、義務としてドキュメントを早く仕上げるのではなく、個々のプロジェクトに特有のリスクを低減する方策としてモデリングです。このような視点でプロジェクトを実践すれば、より安定した開発を実現することができるでしょう。

モデリングは工程に関係なく、必要ならいつでも実施すべきです。「しかし、開発標準が、、、」と言われる方のために、次回は「[開発標準を素直に実施しない](https://qiita.com/sakaba37/items/eaab8ed7ab3b2a64cedd)」ことについて説明します。
ElasticsearchでIndexがRead-Onlyになった時の対処方法

Elasticseachのインデックスにロックがかかり、インデックスに書き込むことができなくなる。
その時の対処方法について書きます。

## 構成について

* OS : Amazon Linux AMI 2017.09.1 (HVM)
* Elasticsearch 6.1.1
* Kibana 6.1.1

## エラーメッセージ

以下がElasticsearch.logに書き込まれます。
また、Kibanaにアクセスしたときも同様のエラーメッセージが出ます。

```bash
### elasticsearch.log
org.elasticsearch.cluster.block.ClusterBlockException: blocked by: [FORBIDDEN/12/index read-only / allow delete (api)];
```

## 対処方法

ディスクのしきい値に達してしまい、ディスクを拡張しても解消されない。
全てのインデックスにロックがかかっているので、以下のコマンドで解除する必要がある。

```bash
$ curl -XPUT -H "Content-Type: application/json" http://localhost:9200/_all/_settings -d '{"index.blocks.read_only_allow_delete": null}'
```

これで問題なくKibanaで操作が可能になるかと思います。
ありがとうございました

## 参考

* [Index Modules](https://www.elastic.co/guide/en/elasticsearch/reference/current/index-modules.html)
* [Kibana issues#13685](https://github.com/elastic/kibana/issues/13685)
DjangoのコマンドをRails並みに充実させたい！


私はRubyよりPythonを先に勉強したためか、ほとんどのWebシステムをPythonで書いています。PythonでRailsと同じくらい素晴らしいフレームワークにDjangoがあります。
しかし、Railsをいじってみると、ほとんどの操作がコマンドラインで解決する手軽さには驚きます。
そこで、DjangoでもRails並みの手軽さを実現するためにコマンドラインツールを実装しました。
ここでは、Rails信者とDjango信者が戦う形式でお送りします。

# Railsは`rails new [app name]`があるから楽！
確かに, Djangoは`django-admin startproject [project name]`とコマンドラインが冗長で複雑なので覚えていられません。
なのでMirageでは

```
mg new
```

このように実行できるようにしました。
`new`コマンドを叩くだけで自動的にインタラクティブシェルが聞いてくる内容に答えるだけです。

また、

```
mg new:ng
```

でAngularのプロジェクトを自動で作成できるようにしました。さらに`--material`などのオプションでテーマも一緒にインストールされます。

```
mg new:react
```
React+Reduxの組み合わせにも対応しています。


>> RailsのAssets PipelineのようなDjangoとより密接な連携が取れるようにする予定です。


# `rails g controller hoge huga etc...`ないでしょ？
ないですね。そもそもcontroller自体がないと言っても良いのですが、それと同じような働きをするものにDjangoでは**app**というものがあり、頻繁に作成します。`python manage.py startapp [app name]`とこれもまたコマンドが冗長です。

なのでMirageでは

```
mg g app hode huga etc...
```

このように実行できるようにしました。


* DjangoにはRailsのControllerというのはないです。(Controllerっぽいのはあります)コントローラと同じくらい頻繁に作成するappというものがあります。

# まっModelをコマンド一発で作れないっしょ！
確かに、無理ですね。RailsとDjangoのモデルは似ているようで似つかないのですが、いちいち`models.py`にモデルクラスを書く必要があります。正確にはモデルクラスにテーブル構造を定義することによってマイグレーションを自動で作成してくれます。

Railsなら
```
rails g model ModelName value:string number:integer
```

みたいにコマンド一発でできます。

なのでMirageでは

```
mg g model ModelClass value:string number:integer
```

このように実行できるようにしました。
ちゃんとモデルクラスも作成されています。

```:python
from django.db import models

# Create your models here.


class ModelClass(models.Model):
    value = models.CharField(max_length=255)
    number = models.IntegerField()
```

さらに、文字列の長さを宣言するなどの高度なオプションもコマンドラインで一緒に作れるようにしました。

例えば、uuidカラムをプライマリーキーとしてセットし、文字列の長さを30文字にしたいなどの操作をする場合、

```
mg g model TestModel uuid:uuid+primary=True script:string+maxlen=400
```

このようにカラム名とデータ型とともにフィールドオプションを同時に定義できます。
なお、このコマンドによって作成されるクラスは以下のようになっています。

```:python
class TestModel(models.Model):
    uuid = models.CharField(max_length=30, primary_key=True)
    script = models.CharField(max_length=400)
```


# デバッグサーバー立てるの簡単`rails s`
Djangoのデバッグサーバーは`python manage.py runserver`と非常に長いコマンドを実行しなければなりません。
ここはRailsに習って`mg s`これで起動するようにしました。

# RailsのCLIに追いつけ追い越せ
Railsはcontrollerを削除する機能にdestroyコマンドがあります。しかし、destroyしてしまうと復元ができなくなります。現在はgitを使うことが多いので間違えて消してしまっても問題にならないかもしれませんが、コミットし忘れたりした場合に後悔することになります。ですからDjangoではdestoryする際にバックアップを自動的に取るようにしました。


# 今後

- Django Rest API Franework周りのサポートを加える。

- アプリ単位をほかのプロジェクトに移植できる機能を追加する。


# Githubとインストール

[Github](https://github.com/shotastage/django-mirage)

>> Django Consoleというパッケージがすでに存在したためDjango Mirageに改めさせていただきました。

`pip install django-mirage`
ethOSでcpuminerを稼働させる

マイニング向けLinuxディストリビューションのethOS 1.2.5以上にて、bitZeny向けのcpuminerを自動稼働させたい

# 下準備

そもそもethOSでは、下手に`apt-get`などでupdateすると、独自組み入れのミドルウェアなどが書き換わるなどするから動作保証しない、と言われるので、とりあえず必要なパッケージいれるだけにする。
まあいれる工程でアップデートしろとか色々言われると思うが、それはさせちゃう感じで入れてみる。

```shell
$ sudo apt-get-ubuntu update
$ sudo apt-get-ubuntu install git libcurl4-openssl-dev gcc-mingw-w64 automake gcc make
```

# git clone & make

```shell
$ git clone https://github.com/bitzeny/cpuminer.git cpuminer
$ cd cpuminer/
$ ./autogen.sh
$ ./configure CFLAGS="-O3"
$ make
```

※`./configure`の引数値は、ハイフン・__オー__・スリーで、ゼロ・スリーじゃないので注意

# 稼働させてみる

例：

```shell
$ ./minerd -a yescrypt -o stratum+tcp://stratum.misosi.ru:16001 -u USERNAME.WORKER_NAME -p PASSWORD
```

今回bitzenyマイニングプールは[みそスープール](https://soup.misosi.ru/)を使う。

1. 新規登録する
2. ログインする
3. メニューから `My Workers` 開く
    - ![スクリーンショット 2017-12-23 14.14.16.png](https://qiita-image-store.s3.amazonaws.com/0/97659/11b248bd-2db6-d21b-2ad2-fd260f51cb23.png)
2. Workerを登録する
    - ![スクリーンショット 2017-12-23 14.14.38.png](https://qiita-image-store.s3.amazonaws.com/0/97659/71aeaf93-4566-22e5-1c7a-099ccdfca657.png)
1. Workerが登録された
    - ![スクリーンショット 2017-12-23 14.14.52.png](https://qiita-image-store.s3.amazonaws.com/0/97659/2130acc3-cfab-ba1c-b485-834af5d73378.png)

そうしたら、↓このように登録した情報をつかって起動させる

```shell
$ ./minerd -a yescrypt -o stratum+tcp://stratum.misosi.ru:16001 -u sakadon.Unko -p Tintin
[2017-12-22 23:21:06] 2 miner threads started, using 'yescrypt' algorithm.
[2017-12-22 23:21:06] Binding thread 0 to cpu 0
[2017-12-22 23:21:06] Starting Stratum on stratum+tcp://stratum.misosi.ru:16001
[2017-12-22 23:21:06] Binding thread 1 to cpu 1
[2017-12-22 23:21:06] Stratum requested work restart
[2017-12-22 23:21:15] thread 0: 4096 hashes, 0.52 khash/s
[2017-12-22 23:21:15] thread 1: 4096 hashes, 0.51 khash/s
...
```
↑こんなふうになったら成功

# custom.sh 登録

標準で用意されているこのshell scriptに書いておくと、ethos-overclockなどのinitializeが終わった後に稼働なされるので、以下のように稼働が成功した起動コマンドをいれておくと便利。

尚、`/home/ethos/`にあるので、pathに注意。後念のため、タイムラグを作る。

```custom.sh
#!/bin/bash
# /home/ethos/custom.sh
# This file is where you should put any custom scripting you would like to run. 
# It will run once, after Xorg (Graphical interface) starts up, any commands which you absolutely have to run before xorg should be located in rc.local before the "exit 0"
# All scripting in this file should be before the "exit 0" as well.  Preface any commands which require 'root' privileges with the "sudo" command
# Examples script running as user ethos: 
# my_command --my flags
# Example of a php script running as user root:
# sudo php /path/to/my/script.php

sleep 5s
./cpuminer/minerd -a yescrypt -o stratum+tcp://stratum.misosi.ru:16001 -u sakadon.Unko -p Tintin >/dev/null 2>&1

exit 0
```

コマンドの最後に`>/dev/null 2>&1` を足したが、お好みで。

# 再起動試験

```shell
$ r
```

で再起動したあとに、ちゃんと稼働するか見る。
Anaconda で、 OpenCV3 + ffmpeg をインストール


普通に、`conda install opencv` としても、ffmpeg対応のOpenCV3は入りません。（2017/12/23現在）

```python
import cv2
cap = cv2.VideoCapture('test.mp4')
ret, img = cap.read()
# ret == False
```

conda-forge を使うと、より新しいライブラリが使えるようになります。

参考： http://tatabox.hatenablog.com/entry/2017/07/06/190402

```bash
$ conda config --add channels conda-forge  
$ conda install opencv
```


```python
import cv2
cap = cv2.VideoCapture('test.mp4')
ret, img = cap.read()
# ret == True
```

ただし、conda-forgeを使うと、インストール済みの多くのライブラリが、conda-forgeのバージョンアップされてしまいますので、ご注意下さい。
ラズパイでスクレイピングする時の詰みポイント

#きっかけ
通っている学校のホームページで授業変更を確認するけど、毎回見に行くのがだるい。
Python2系でスクレイピングしてラズパイにLINEで通知してもらう。

#現状
スクレイピングには成功したけど、文字コードの問題でLINEに送信できなくて詰んでる。
それよりも前の段階で何回も詰みかけたので、他の人のヒントになればと思い書いた。

#詰みポイント1
##モジュールインポートで詰む
ソースコードの一部を以下に示す。

```python:jugyohenko.py(一部抜粋)
#授業変更を取得する
#coding:utf-8
import urllib
from bs4 import BeautifulSoup
from linebot import LineBotApi
from linebot.models import TextSendMessage
```
3行目「import urllib」だが、スクレイピング方法をググりながらコーディングしてると、Python2系と3系で記述方法が異なるため、なんかうまくいかなくなることがあった。3系だと各モジュールが分割されたため、「import urllib.request」と書く。が、今回は2系で作るので、3行目のように書く。
[urllib — URL による任意のリソースへのアクセス](http://docs.python.jp/2/library/urllib.html)

#詰みポイント2
##lxmlが無くて詰む
スクレイピングするなら、以下のソースコードはみたことがあると思う。

```python:jugyohenko.py(一部抜粋)
url="XXXXXXXXXXXXXXXXXXXXXXXXX"
html=urllib.urlopen(url).read()
soup=BeautifulSoup(html,"lxml")
```
Windowsで実行した時は普通に動作したので、「よし！いける！」何も考えずにラズパイに移して実行！！

```bash:ERROR
Traceback (most recent call last):
  File "/home/pi/jugyohenko.py", line 65, in <module>
    soup=BeautifulSoup(html,"lxml")
  File "/usr/local/lib/python2.7/dist-packages/bs4/__init__.py", line 165, in __init__
    % ",".join(features))
bs4.FeatureNotFound: Couldn't find a tree builder with the features you requested: lxml. Do you need to install a parser library?
```
![IMG_4066.JPG](https://qiita-image-store.s3.amazonaws.com/0/216625/a95f5f0d-6fcc-5260-8080-1e6c403834df.jpeg)
lxmlがないとか言われてるっぽいので入れる。
「pip install lxml」等でうまくいかなかったので本当にくじけそうだった。
以下に解決したコマンドを示す。

```bash:
pi@raspberrypi:~ $ sudo apt-get install python-lxml
```
で、入ったか確認してみる

```bash:
pi@raspberrypi:~ $ pip freeze | grep -e request -e lxml -e beautiful
beautifulsoup4==4.6.0
lxml==3.4.0
requests==2.4.3
```
あ。入ってる。
![IMG_5564.JPG](https://qiita-image-store.s3.amazonaws.com/0/216625/1a1a7d4d-dab0-ed6a-2d15-6851b3980e01.jpeg)
あとは、文字コードの謎を解明すれば授業変更お知らせボットが完成するZOY!(白目)
Alexaのスキルを開発して審査に提出するときに気をつけること


[Amazon Alexa Advent Calendar 2017 \- Adventar](https://adventar.org/calendars/2332)の23日目の記事です。

# はじめに

先日からAlexaの記事を書き続けています。
そして、どうせ記事を書くなら審査に出してみようということで簡単なスキルを作って審査に出してみました。。。しかし結果はリジェクトです。
何が足りなかったのか？どうすればよいのか？を書いていきたいと思います。

# Alexaのリクエストを外部のエンドポイントで処理する場合には注意が必要

Alexaの作り方としてAWSのLambdaを使う方法と外部の別サーバーで処理する方法の2パターンがあります。
そして、普段はRuby on Railsで開発していることもあり、僕はエンドポイントをHerokuに向けています。

[4. Amazon AlexaからHerokuのRailsにつなぐ \- Qiita](https://qiita.com/tochi/items/183658fabd1416028065)

ただ外部サーバーで処理する場合には注意が必要でした。
公式ドキュメントにも書かれていますが、「Alexaから送信されたリクエストを検証する」と「リクエストの署名を確認する」が必要です。

[カスタムスキルをウェブサービスとしてホスティングする \| Custom Skills](https://developer.amazon.com/ja/docs/custom-skills/host-a-custom-skill-as-a-web-service.html)

これはオレオレスキルで手元のEchoで動かす時には特に気にすることはありません。ただ、誰でも使えるスキルとして公開する場合には検証や署名あたりをちゃんと処理をしていないと審査でリジェクトされるようです。

AWSのLambdaであればこの辺りをいい感じにしてくるんだと思います。

# Ruby on Railsで署名の確認などを行う

では、Ruby on RailsでAlexaの処理を行うにはどうすれば良いかを調べました。
gemがありました。ありがたい。

[sidoh/alexa\_verifier: Rubygem to verify requests sent to an Alexa skill are sent from Amazon](https://github.com/sidoh/alexa_verifier)

``` Gemfile
gem 'alexa_verifier'
```

``` controllers/applicationController.rb
class ApplicationController < ActionController::Base
  protect_from_forgery with: :exception
  before_action :verify_alexa_request

  private
  def verify_alexa_request
    AlexaVerifier.valid!(request)
  end
end
```

簡単これだけです。

# まとめ

まだ審査に通ってないので本当にこれで良いのかはわかりません。審査を通ったらもしくはリジェクトされたらここに追記したいと思います。