OmniAICreator/Qiita-1.07M huggingface dataset:
ちょいとわかりにくい課金体系に気をつけろ

# Gatherの音声認識

Twilioは通話に対して自前のサーバから命令をTwilioに送信することで通話を制御することができます。このサーバ側アプリケーションをTwiMLアプリと呼び、応答の形式はTwiMLという名のXMLになります。という話はTwilioのユーザーならみんな知っていると思うのですが、今回はこのTwiMLの `Gather` について自分がハマった経験を共有します。

```xml
<?xml version="1.0" encoding="UTF-8"?>
<Response>
  <Gather input="speech" action="/speech_result">
    <Say>Talk nerdy to me!</Say>
  </Gather>
  <Redirect>https://example.com/speech_result</Redirect>
</Response>
```

Twilioの `Gather` のサンプルっていつもユーザーが無言/入力無しの場合は即座に電話が切れるものしかないので良くないですよね。上の例は、ユーザーの音声入力を待って `/speech_result` に遷移しますが、無言のままでも同じURIに遷移するので通話は維持されます。

`Gather` を使った音声認識はこれだけで実装できます。あとは `/speech_result` にパラメータ `SpeechResult` がPOSTされるので、その内容をみて次の動作に移ることができます。

# Gatherの音声認識のお値段は高い

ところで、音声認識の価格ページのスクショがこちら。

<img width="970" alt="pricing.png" src="https://qiita-image-store.s3.amazonaws.com/0/1782/4cefffd0-fc27-984e-698e-8f468d8fed26.png">

ご覧の通り、15秒までの音声をSpeech to textで使うと３円かかります。一回の通話で一度くらいしか使わないのであれば問題もないかもしれませんが、それでもお高めの価格設定です。というのも、たとえばGoogleの同機能はこんなものだから。

<img width="763" alt="gpricing.png" src="https://qiita-image-store.s3.amazonaws.com/0/1782/bf5ca8f7-7da8-b965-9d62-2325087fa503.png">

15秒未満の音声は15秒に切り上げられるので実質15秒として、15秒の音声が60分まで（4 x 60 = 240　回の利用）までは無料、以降はドル円112円換算で0.6円/15秒のコストになります。TwilioはGoogleのおよそ5倍の値段ですね。しかも無料枠がありません。

そして、これドキュメントにないんですけど、時々このspeech to textの結果が「何じゃ|なんじゃ これは|これは 一体|いったい どういうことだ|どういうことだ」みたいな形式になることがあるので、Twilioも裏ではGの機能を使っていることがわかります。

今のところ、Twilioには音声ストリームをクライアントが受信する方法がない（ないわけじゃないけど実質的に極めて限られている）ので、同じ機能を自前で実装するのは難しく、価格にはそれなりの意味があるとは思います。いい商売ですけど。

## 気づかずに使ってしまうことがある

しかし、気をつけなくてはいけないのは、うっかりこの機能を使ってしまう場合のことです。

というのも、 `Gather` を使った音声認識には、DTMFと音声の両方を認識させる機能があるのですが、`input` アトリビュートに　`dtmf speech` と記載すると、**DTMFしか使わない場合でも `speech` を使ったものとしてきっちり3円課金される**からです。

```xml
<?xml version="1.0" encoding="UTF-8"?>
<Response>
  <Gather input="speech dtmf" numDigits="4" action="/speech_result">
    <Say>To talk or to push, that's your problem</Say>
  </Gather>
  <Redirect>https://example.com/speech_result</Redirect>
</Response>
```

これ、大変便利な機能で、といっても既存のIVR業者なら普通に使えるんですが、話者が受話器に向かって話せば音声認識を、ボタンを押してトーン信号を送ればトーン信号の認識を実行してくれます。昨今、音声認識自体は飛躍的に向上しましたが、まあ確実なのはやはりトーン信号によるボタンでの入力なので、うまく組み合わせると便利なサービスを構築できます。

ところが、上に書いた通り、困ったことにこの機能を使うとdtmfしか使っていなくても音声認識を使ったものとして課金されてしまいます。dtmfの認識自体は課金対象ではないので、請求が届いてからびっくりすることになります。

そして、この請求というのがちょっと厄介で、いまTwilioの管理画面から通話記録を参照しても、各通話ごとの通話料金はそれぞれ参照することが可能なのですが、通話料金以外の、例えばこの音声認識のような機能を使った場合、それが各通話に対して幾ら課金されたのかを参照することは出来ません。管理画面の詳細まで進むと総計は見られるのですが、結局個別の通話についてはわからないままなので、細心の注意を払わないと翌月の請求で初めて気づくなんてことも起こり得ます。

これについてTwilioの年次イベントの際に質問してみたのですが、裏側の実装では一旦音声としてデータを取得して、もしdtmfだったらそっちの挙動に切り替える、みたいなものになっているらしく、Twilio側の事情ではあるけれども仕方がないとのことでした。困ったものです。

## まとめ

音声認識は高額になるので、意図しない箇所でうっかり使ってしまわないように気をつけなければいけません。また、使う場合には一回の通話で何度も利用できるような設計にすると思わぬ請求が発生することになります。価格自体も高いので、いつかTwilioの音声データをRTPのストリームとして取得して処理できるような機能が利用可能になるといいですが、それまでは我慢と工夫と設計でなんとか逃げましょう。既存のIVRの仕組みでは割と普通に使われる機能なので（N社系のとか…）、同じ機能を用意しろとクライアント様から要求された場合はつらいですけどね。
TypeScript × Jest で axios のモックを作りテストを実施する

## はじめに

TypeScript で Jest のモック機能を使おうとしたら、ハマりました。。。
解決方法を見つけたのでメモします。

## 対象読者

- TypeScript の知識をある程度持っている
- Jest を TypeScript で実行できる環境がある

## 環境

- node.js, 8.10.x
- typescript, 3.2.x
- axios, 0.18.x
- jest, 23.6.x
- ts-jest, 23.10.x
- macOS X El Capitan

## テスト対象

### ソース

```ts:src/index.ts
import axios from 'axios';

export async function main() {
  try {
    const { data } = await axios.get('{YOUR-API-ENDPOINT}');
    return data;  // { message: "Real response!" }
  } catch (err) {
    throw new Error(err.message);
  }
}

main().then(res => console.log(res));
```

### 実行結果

```bash
$ npx tsc

$ node dist/index.js
{ message: 'Real response!' }
```

![スクリーンショット 2018-12-05 0.06.35.png](https://qiita-image-store.s3.amazonaws.com/0/237863/e50b481a-2b53-9deb-f622-b8f23d50517e.png)


## テストコード

### 書き方1

```ts:test/index.test.ts
jest.mock('axios');
import axios from 'axios';
// tslint:disable-next-line:no-any
(axios.get as any).mockResolvedValue({ data: { message: 'Mock response!!!' } });

import { main } from '../src/index';

describe('main test', () => {
  it('axios return mock value', async () => {
    const res = await main();
    expect(res.message).toBe('Mock response!!!');
  });
});
```

### 書き方2

```ts:test/index.test.ts
jest.mock('axios');
import axios, { AxiosInstance } from 'axios';
// tslint:disable-next-line:no-any
const myAxios: jest.Mocked<AxiosInstance> = axios as any;
myAxios.get.mockResolvedValue({ data: { message: 'Mock response!!!' } });

import { main } from '../src/index';

describe('main test', () => {
  it('axios return mock value', async () => {
    const res = await main();
    expect(res.message).toBe('Mock response!!!');
  });
});
```

### テスト実行結果

![スクリーンショット 2018-12-05 0.05.46.png](https://qiita-image-store.s3.amazonaws.com/0/237863/40ceb6da-8d0d-7249-15a1-6f8166771468.png)

## おわりに

書き方の 1 と 2 を比較した場合、文字数が少なくなるのは 1 ですが、2 の場合は上の例で言うと`myAxios`に型を指定しているためIDEの補完が効くようなるというメリットがあります。

1 の場合は `mockResolvedValue()` を手動で書き込む必要がありますが、2 の場合はIDEの予測で出てきます。

コーディングミスを減らすためにも自分は 2 を使っていこうかなと思っています。

any型を使わずに書ける方法が知りたい。。。

__2019/07/23 追記__

@Statham さんにコメントにて any 型を使わない書き方を教えていただきました！ありがとうございます！
[cocoa][swift]PubHack.swift 2018-04 を振り返る

<p>2018年4月12日（木）の夜間、東京都新宿区の<a href="http://www.dubliners.jp/">THE DUBLINERS’ IRISH PUB 新宿店</a>におきまして、「PubHack.swift 2018-04」を開催致しました。</p>

<p>PubHack.swiftは今期からはじめましたMOSAの新しい形のイベントで、飲み会イベントを通じて、macOS/iOS/tvOS/watchOS/Androidエンジニアの人たちの交流を目的としています。<br />
名前の由来を説明しますと、PubHackは英国 Pub Rock からとりました。<br />
Pubは飲み会、Hackはプログラミング、.swiftはmacOS/iOS/tvOS/watchOS系です。</p>

<p>第一回目の開催ということで、正直、浸透していませんが、それでも参加人数は7名と、予想した人数より多くなり大変嬉しいです。<br />
また、参加された方のバックグラウンドも多彩で、新しいイベントとしては、よかったのではないかと思っています。</p>

<p>純粋な飲み会イベントということで、長々と文章で説明するのも野暮だと思いますが、出てきた話題を何個かピックアップしますと、以下のとおりです。</p>

<ul>
<li>ブロックチェーンの採掘についての理論と実装について。自分はこうしてます。</li>
<li>ブロックチェーン関連の開発で収入を得る方法。</li>
<li>Mac App Storeで食っていけますか？</li>
<li>App Storeで上位にランキングされるということ。</li>
<li>公式に認められた副業について。誰か受注してくれませんか？</li>
</ul>

<p>村上龍さんの超電導ナイトクラブという小説がありましたが、それが再現された感じの楽しい夜でした。</p>

【関連情報】
<a href="https://qiita.com/advent-calendar/2018/cocoa">Cocoa Advent Calendar 2018</a><br />
<a href="https://cocoa-kanto.connpass.com/event/84473/
">PubHack.swift 2018-04</a><br />
<a href="https://mosa.connpass.com/event/82985/
">PubHack.swift 2018-04</a><br />
<a href="https://cocoa-kanto.connpass.com/">Cocoa.swift</a><br />
<a href="https://www.facebook.com/groups/cocoa.kanto/">Cocoa勉強会 関東</a><br />
<a href="http://www.bitz.co.jp/weblog/">Cocoa練習帳</a><br />
<a href="https://qiita.com/m_yukio">Qiita</a><br />
JSONをgrepしやすくするコマンドラインツールgronの紹介

伝統的なUNIX/Linuxのコマンドラインツールは行単位の処理が得意ですが、その一方でより複雑なデータ構造の取り扱いを比較的苦手としています。
そのため、JSONの取り扱いには、[jq](https://stedolan.github.io/jq/manual/)のような専用ツールを使ったり、あるいは何らかのプログラミング言語のJSONパーサで処理をすることが多いかと思います。

でもjqって記法難しいし……そもそも今は中身をgrepしたいだけなのに……JSONがフラットな行形式だったらいいのに……そんな無茶な願いを叶えるツールが**[gron](https://github.com/tomnomnom/gron)**です。

※ gronのドキュメントはとても簡潔なので、英語が苦でない人は、この記事よりも本家のREADMEを読むことを推奨します。

## インストール

Macならbrewで入れられます。

```shell
brew install gron
```

Golangで書かれた所謂シングルバイナリなので、go getや、あるいは直接バイナリをPATHの通った場所に置いても構わないと思います。

```shell
# go getでインストールする場合
go get -u github.com/tomnomnom/gron
```

## 使い方

gronの標準入力にJSONを渡すと、"greppableな"形式[^gron-greppable]で出力されます。

```shell
$ echo '{"a": "aaa", "b": 101, "c": {"ca": true, "cb": false}}' | gron
json = {};
json.a = "aaa";
json.b = 101;
json.c = {};
json.c.ca = true;
json.c.cb = false;
```

この形式は`gron -u`によってungron、つまり元のJSONに戻せます。

```shell
$ echo '{"a": "aaa", "b": 101, "c": {"ca": true, "cb": false}}' | gron | gron -u
{
  "a": "aaa",
  "b": 101,
  "c": {
    "ca": true,
    "cb": false
  }
}
```

gron形式は、grepなど他のコマンドで操作しやすいです。

```shell
$ echo '{"a": "aaa", "b": 101, "c": {"ca": true, "cb": false}}' | gron | fgrep 'c.ca'
json.c.ca = true;
```

もちろんgrep後にungronするなどの処理も自由自在にできます。

gronにはコマンドライン引数によるファイルからの読み取りのほか、URLを直接渡すこともできます。

```shell
gron 'http://jsonplaceholder.typicode.com/comments/1'
json = {};
json.body = "laudantium enim quasi est quidem magnam voluptate ipsam eos\ntempora quo necessitatibus\ndolor quam autem quasi\nreiciendis et nam sapiente accusantium";
json.email = "Eliseo@gardner.biz";
json.id = 1;
json.name = "id labore ex et quam laborum";
json.postId = 1;
```

```shell
$ curl -s 'http://jsonplaceholder.typicode.com/comments/1' > tmp.json && gron tmp.json
json = {};
json.body = "laudantium enim quasi est quidem magnam voluptate ipsam eos\ntempora quo necessitatibus\ndolor quam autem quasi\nreiciendis et nam sapiente accusantium";
json.email = "Eliseo@gardner.biz";
json.id = 1;
json.name = "id labore ex et quam laborum";
json.postId = 1;
```

ちなみに面白い性質として、gron形式はJavaScriptコードとしても解釈できます。そのため、例えばgrep加工した後のgron形式をJavaScript処理系で読み取ってevalする、といった処理も可能です。

[^gron-greppable]: ちなみに、gron形式はちゃんと形式的な定義があるっぽいので、なんとなく安心感があります。参考: <https://github.com/tomnomnom/gron/blob/v0.6.0/ungron.go#L4-L11>

## まとめ

gronは高機能というわけではないのですが、さっと使えて必要な問題が解ける、手触りがとても良いツールです。

プログラマの道具箱に入っててもいいようなツールだなーと以前から思っていたのですが、意外にもQiitaに紹介記事がなさそうだったので書いてみました。
「App Store Connect Operation Error」のデバッグ方法【Xcode】

はじめまして、ますみです！

[![自己紹介.png](https://www.umi-mori.jp/wp-content/uploads/2023/02/introduction_banner_2-2048x533.png)](https://bit.ly/banner_intro_masumi_creator_qiita)


# はじめに
Xcode上で**`Archive`**を行った後の、**`Validate App`**がうまく行かなかった時についてです。

# 前提
- Archiveまではうまくいった
- App IDやProvisioning Profileなども作成済み
- Xcode：Version 10.1

# バグ内容
`Distribution failed with errors`
**`App Store Connect Operation Error`**
`Unable to process application at this time due to the following error: Missing Provisioning Profile - Apps must contain a provisioning profile in a file named embedded.mobileprovision..`

<img width="700" alt="スクリーンショット 2018-12-04 23.14.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/240280/8804d84b-fbb3-119b-df9b-9bdc0dc7d968.png">

# デバッグ方法
色々と中身を追求したところ、**`Automatically manage signing`**によって、Provisioning Profileがうまく選択されていなかった模様でした。
<img width="500" alt="スクリーンショット 2018-12-04 23.19.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/240280/d4b51799-216d-08aa-0dce-0fddccb4fba6.png">


# 最後に
最後まで読んでくださり、ありがとうございました！
いかがだったでしょうか？

この記事を通して、少しでもあなたの学びに役立てば幸いです！

:::note info
【仕事の相談はこちら】
お仕事の相談のある方は、下記のフォームよりお気軽にご相談ください。

[問い合わせフォームはこちら](https://forms.gle/G5g1SJ7BBZw7oXYA7)

もしもメールでの問い合わせの方がよろしければ、下記のメールアドレスへご連絡ください。

info*galirage.com（*を@に変えてご送付ください）

🎁 「生成AI活用の無料相談券」もしくは「生成AIの社内ガイドライン（無料PDF）」を『公式LINE』で配布中 🎁
『生成AIを業務に活用したいけど、どうしたらいいかわからない』といった声を多くいただきます。

Galirageでは公式LINEにて、チャットやオンライン会議で「完全個別の生成AI活用無料相談会」を実施しております！
（期間限定で実施しているため、ご興味ある方はお早めに以下のLINE公式アカウントをご登録ください^^）
https://lin.ee/rvz6lMN

※ 予告なく、キャンペーンを終了する可能性がございますが、ご了承ください。

【業務内容】
具体的には、以下のお仕事を中心に受け付けております！（[詳しくはこちら](https://galirage.notion.site/Galirage-AI-c2f3945fafb0433d8d2fd03e56927fd8)）
1. 受託開発（例：生成AIを使った社内システムの開発）
2. コンサルティング（例：技術戦略のアドバイス）
3. 講演（例：社内研修、イベント登壇）

※ 特に「生成AIを使ったシステム開発のご依頼」が多く、ご好評いただいております。

【これまでの相談事例】
以下のようなご相談が多くあります。

🔑 機密情報を漏洩させないための、生成AIのシステム構築をお願いしたい。
🤖 自社データを用いたFAQチャットボットの作り方を知りたい。
💡 ChatGPTを、自分たちの事業にどのように活かせるか、アドバイスやアイデアが欲しい。
:::
# おまけ
エンジニアの仲間（データサイエンティストも含む）を増やしたいため、公式LINEを始めました🎉

「**一緒に仕事をしてくれる方**」「**友だちとして仲良くしてくれる方**」は、友だち追加をしていただけますと嬉しいです！（仲良くなった人たちを集めて、「ボードゲーム会」や「ハッカソン」や「もくもく会」もやりたいなと考えています😆）

とはいえ、みなさんにもメリットがないと申し訳ないので、特典を用意しました！

友だち追加後に、アンケートに回答してくれた方へ「**エンジニア図鑑（職種20選）**」のPDFをお送りします◎

https://lin.ee/hFUN4TL

[![](https://www.umi-mori.jp/wp-content/uploads/2023/10/line_banner_v2.png)](https://lin.ee/hFUN4TL)
マイコンボードを中継器にして PC に電子部品を接続し、Ruby で制御してみた（サーボモータ編）

この記事は、[富士通ソーシアルサイエンスラボラトリ Advent Calendar 2018](http://qiita.com/advent-calendar/2018/ssl)の 5 日目の記事です。

# はじめに

@GORO_Neko です。ご存知の方ご無沙汰してます。初めての方お初にお目にかかります。

えーっと、先にお断りをば一言。

自分、仕事では一切マイコンボードを利用した業務に携わったことがございません。

以下は、自分が所属する会社の意向を反映したものでもスタンスを示すものでもなく、単なる一個人の趣味の活動から産まれた記述です。

# PC に電子部品を接続したい & PC 上の Ruby で制御したい

と言うわけで Firmata と言う技術を使って、[発光ダイオード](https://qiita.com/GORO_Neko/items/5a515114d85802e8cb8b)や[温度センサ](https://qiita.com/GORO_Neko/items/f898ea857d6026c25deb)を、PC 上に用意した Ruby スクリプトで制御する方法を紹介してまいりました。

図に乗って第 3 段！
今度は、サーボモータを制御してみようと思います。

# Arduino Uno を Firmata 対応にする

やり方は[こちらの記事](https://qiita.com/GORO_Neko/items/5a515114d85802e8cb8b)で説明しましたので割愛。

Arduino IDE を使って StandardFirmata アプリケーションをビルドして、 Arduino Uno に書き込んでおく。ただこれだけです。

# サーボモータをつないでみる。

秋葉原の電子パーツ屋やネットショップで簡単に購入可能という理由から、サーボモータとして [SG90](http://www.ee.ic.ac.uk/pcheung/teaching/DE1_EE/stores/sg90_datasheet.pdf) を、Arduino Uno 経由で PC に接続します。

SG90 と Arduino Uno の結線方法に関しては、以下の図を参照ください。

[回路図]
![無題2.png](https://qiita-image-store.s3.amazonaws.com/0/89832/a5aaebba-ac2d-e897-198f-0d91c2c72cfd.png)


# 制御スクリプトについて

SG90 制御用に、以下のスクリプトを作成します。

[制御スクリプト]

```firmata-test-003.rb
# Author       : Yoshihiko Hara <goronyanko.h@gmail.com>
# last updated : 2018/12/3
# Overview     : Control the servomotor with Ruby on the PC.
# License      : MIT License

require "arduino_firmata"

# Minimum value and maximum value of data that each device can return
PIN_NUMBER_OF_A0               = 9
DELAY_TIME                     = 1

# Prepare to control Arduino from PC.
arduino = ArduinoFirmata.connect "/dev/tty.usb-device-name"

while true

  # Generate rotation angle randomly
  angle = rand 180
  puts "servo angle #{angle}"

  # Rotate the servomotor by the generated rotation angle.
  arduino.servo_write PIN_NUMBER_OF_A0, angle

  # Stop operation for 1 S.
  sleep DELAY_TIME

end
```

約 1 秒間隔で、サーボモータがカクカクと動くはずです。

モータの軸にサーボホーンを取り付けた上で実行することを推奨致します。

そうしとかないと、モータがなんか動いたことはわかっても、ランダムに生成された角度に従ってモータが動いてるんだかなんだか、多分見ただけじゃよくわからないと思います。

サーボモータをいくつか組み合わせてマジックハンドのようなものを作り、PC から制御してやったら面白いんじゃないかな。そんな風に思っています。

では、また。
[Unity] DOTweenで相対的に値を増減させたい時には .SetRelative() を使う

# 開発環境
* Unity 2018.2.16f1
* DOTweenPro 1.0.075 (ProでなくてOK)

# 概要
DOTweenで現在の値を元に相対量を増減させるということをする際に、まず思いつくのは以下のような **「現在の値に対して相対量を加減した値を終了値として渡す」** というコードです。

```csharp:DOTweenMoveFrom.cs
using System;
using DG.Tweening;
using UnityEngine;
using UniRx;

public class DOTweenMoveFrom : MonoBehaviour
{
    void Start()
    {
        // UniRx: 2秒ごとに処理を実行する
        Observable.Interval(TimeSpan.FromSeconds(2)).Subscribe(_ => this.Move());
    }

    private void Move()
    {
        var position = this.transform.position + Vector3.right;
        this.transform.DOMove(position, 1f);
    }
}
```

実はもう少し楽に記載する方法があり、それが `Tween.SetRelative()` です。Tweenに対してメソッドチェインで呼び出すことで、Tweenで指定した値を相対値として取り扱ってくれます。下記の例題だと、一定時間毎に `Vector3.right` だけ移動します (最初の例と同一の挙動)

```csharp:DOTweenMoveFrom.cs
using System;
using DG.Tweening;
using UnityEngine;
using UniRx;

public class DOTweenMoveFrom : MonoBehaviour
{
    void Start()
    {
        Observable.Interval(TimeSpan.FromSeconds(2)).Subscribe(_ => this.Move());
    }

    private void Move()
    {
        this.transform.DOMove(Vector3.right, 1f).SetRelative();
    }
}
```

![setrelative.gif](https://qiita-image-store.s3.amazonaws.com/0/102664/1203e9db-238f-7cef-b7c4-7a4d6b5791dc.gif)

この `Tween.SetRelative()` は値を操作する系統のTweenであれば、基本的に何でも使えます。試しに「右に移動する」「回転する」「フェードアウトする」の3通りの挙動に対して適応します。

```csharp:DOTweenMoveFrom.cs
using System;
using DG.Tweening;
using UnityEngine;
using UniRx;

public class DOTweenMoveFrom : MonoBehaviour
{
    void Start()
    {
        Observable.Interval(TimeSpan.FromSeconds(2)).Subscribe(_ => this.Move());
    }

    private void Move()
    {
        this.transform.DOMove(Vector3.right, 1f).SetRelative();
        this.transform.DOLocalRotate(new Vector3(0, 0, 90), 1f).SetRelative();
        this.GetComponent<SpriteRenderer>().DOFade(-0.2f, 1f).SetRelative();
    }
}
```

![setrelative2.gif](https://qiita-image-store.s3.amazonaws.com/0/102664/853f2ea4-5aac-ea88-64ef-ab1e5c2b0dea.gif)

また上記と同等の挙動は [Sequence](https://qiita.com/lycoris102/items/6a9e1e39bfa69880eaba) を利用して、以下のように記載することもできます。

```csharp
DOTween.Sequence()
    .Append(this.transform.DOMove(Vector3.right, 1f))
    .Join(this.transform.DOLocalRotate(new Vector3(0, 0, 90), 1f))
    .Join(this.GetComponent<SpriteRenderer>().DOFade(-0.2f, 1f))
    .SetRelative();
```
アクセス修飾子についての備忘録

今回、初めてプロジェクトにアクセス修飾子を使いました！
以前まで、規制するために使うものなんだなと感じていた程度だったので
調べてわかったことを改めて記事に残そうと思います！
##private##
**・private**：クラス内からのみアクセス可能になる

```
class Aisatsu {
  private var morning = "おはよう"
  private var hello = "こんにちは"
  func morningGreeting() {
    print(morning)
  }
  private func helloGreeting() {
  print(hello)
  }
}
let aisatsu = Aisatsu()
print(aisatsu.morningGreeting()) //おはよう
print(aisatsu.helloGreeting()) // error
```

Swift4からextensionでもprivateプロパティにアクセス可能になりました。
https://dev.classmethod.jp/smartphone/iphone/swift4-private-and-fileprivate/

##fileprivate##
***fileprivate***: 同一ファイル内のみアクセス可能

```
class Aisatsu {
  private var morning = "おはよう"
  private var hello = "こんにちは"
  func morningGreeting() {
    print(morning)
  }
  fileprivate func helloGreeting() {
  print(hello)
  }
}
let aisatsu = Aisatsu()
print(aisatsu.morningGreeting()) //おはよう
print(aisatsu.helloGreeting()) // こんにちは
```

privateで書いていたメソッドをfileprivateでかくとprint文が表示されました。

##public##
モジュール外からでもアクセス可能

##終わりに ##
修飾子を使い分けてコードをかけるようになりたいです。
今回他の方の記事や参考サイトを見ながら確認することが出来ました。
ありがとうございました。
http://swift.tecc0.com/?p=631
https://dev.classmethod.jp/smartphone/iphone/swift4-private-and-fileprivate/
ParaViewのPythonにライブラリを追加する強引な方法

# はじめに
ParaViewのWindows版だとZip版があり、インストールしなくても使える。これを利用して超特急でParaView丸ごと組み込んだアプリを作った時のPythonライブラリをParaViewに追加した方法。

# 使うもの
ParaView5.5.2
対応するPython(この場合は2.7.3)
ParaViewに持っていきたいライブラリ（Python側にインストールしておく）

# やり方
<ParaViewのインストールフォルダ>\bin\Lib\site-packages に、Python側でインストール済みのライブラリフォルダ・ファイルをコピペする。ライブラリフォルダはCドライブインストール時だと、C:\Python27\Lib\site-packagesあたりに入っている。

コピペしてからParaViewを起動すると、次の図のようにPython Shellからライブラリを呼べる（図ではExcelを操作できるopenpyxlを追加してエクセルを書き込んでいる）。

![20181204_fig1.jpg](https://qiita-image-store.s3.amazonaws.com/0/130772/5fea8c40-fada-6084-7668-8fa70e296958.jpeg)

注意点としては、依存関係のあるライブラリはエラー見ながら解決しないといけない。

# まとめ
スマートじゃない。けど、ParaViewマクロにエクセル書き込み機能とか追加できる。
スクラムについて個人的に誤解されやすい５つのこと（リスト更新中）

謎の集団zenelo内は最近スクラムについて盛り上がっています。ちょうど自分が2年前別の集団でScrumをやってたので、当時の理解が今見たら、いくつか誤解した点がある、もしかしたら他の人がScrumやる際の参考になれるかもしれませんので、まとめてみたいと思います。

# 0. Scrum ってなに？

> Scrum is the leading Agile product development framework. It provides a foundation and path to delivering business goals in a collaborative, sane, and enjoyable manner. When was the last time you put "collaborative, sane, and enjoyable" in the same sentence with "business goals"? You may not remember unless you already use Scrum, but with Scrum you can, indeed, enjoy your work again!

スクラムはAgileの主要な製品開発フレームワークです。 これは、コラボレーティブで、まともで楽しい方法でビジネス目標を実現するための基礎と道筋を提供します。 あなたが「ビジネス目標」を持って同じ文章で「協調的で、気楽で楽しい」を最後にしたのはいつですか？ 既にスクラムを使用していない限り、覚えていないかもしれませんが、スクラムを使うと実際にもう一度楽しむことができます！(by Google 翻訳)

Scrumの詳細についていろんな資料がありますが、本記事は [Core Scrum](https://www.scrumalliance.org/ScrumRedesignDEVSite/media/ScrumAllianceMedia/Files%20and%20PDFs/Learn%20About%20Scrum/Core-Scrum.pdf) をベースにしています。

# 1. PO が全てを決める
POの責務はバックログアイテムのやる順番を考えることで、ROI（投資対効果）を最大化すること。それは決めることとはちょっと違うのは、その情報をチームに与えるし、時にチームから考える材料をもらわないといけない。
最終的何やるか、どうやるかを決めるのはチームになります。

# 2. 決められることしかできない
これが半分正しい、半分半分間違いました。
正しいのはSprint Planningでチームがやることを決まったら、そのスプリントは決めることを完成させるため、全力を尽くさないといけない。
間違いと思うのは、プロダクトや市場の状況は常に変化するので、前やりたいと思うこと（バックログに溜まったアイテム）であっても、状況によって実際やらなくてもいいかもしれませんし、逆にもっと優先度をあげて対応しないといけないので、スクラムはそれらをスプリント単位で常に見直さないといけないです。

# 3.１スプリントで終わらせないといけないので、必要最小限のソリューションになりがち
スクラムでは製品品質と技術品質両方満たさないと、出荷できないと考えています。
Doneの定義によって技術品質を担保するので、全部満たさないといけないし、スプリント中終われないと、それがUndoneとして定義し、単独のアイテムを切り出し、リリースまで必ず対応しないといけない様になっています。
品質要件が削れないため、バックログアイテムを１スプリントに収まるため、要件を分割しないといけない、その分割された要件を先に出すことによって、結果早期フィードバックをもらえて、PDCAを早く回せることができるです。

# 4. チーム誰でも実装できるタスクが望ましいので、優れた設計・実装ができない
前述通り、スクラムはDone定義で技術品質を担保するので、設計・実装などの内部品質もチームが合意すれば、必ず満たさないといけない基準として定義できる。
一方で誰でも実装できるのが望ましいが、必ず最初からそうじゃないといけない、チームメンバーにはチームの生産性を向上する責務があるので、一番低いところに合わせるより、Planningのときしっかり全員で設計したり、あとでTDD、ペアプロなどの手法によって、知見を広げ、チーム全員のレベルをあげることの方が望ましいと考えています。

# 5. スクラムがバグ対応、技術的負債解消には消極である
ここまでで既にわかると思いますが、この辺も主にDoneの定義によって担保されます。

まずバグについて、まずそのバグが機能品質が足りないか、技術品質が足りないかを判断する。

- 機能の場合、その機能が必要かどうかを考えて、必要ならバックログに入れて、優先順位をつけて対応する。
- 技術品質の場合も同じ対応ですが、それプラスに、Doneの定義にあるかどうかを判断する。
    - Doneの定義にない場合、それを追加し、今後チェック必ずチェックする。
    - Doneの定義にあるが、漏れた場合、漏れないようにどうするかを考えた上で対処しないといけない。

技術的負債はもっとシンプルで、Doneの定義が満たされたら、負債が残さないと思いますが、それが漏れた場合として対応すればいいと思います。

---
（リスト更新中）

# まとめ

スクラムみたいなフレームワークは、価値観と原理原則が重要で、実践のルールはあくまでそれらを実現するための手段にすぎないですが、人々は抽象的な概念より、具体的なHowを覚えやすいので、本当にやりたいこと、解決したい課題を忘れがちです。そならない様に、しっかり概念の部分を理解し、その理解を基づいて、Howを常に振り返ることで、フレームワークを有効活用することを常に自分に言いつつ、これから集団の仲間と楽しく過ごしていきたいと思います。

※ まだまだ実践経験が少ない、勉強している途中なので、何か間違ったことを言いましたら、ぜひコメントしていただいて、その間違いを正したいと思います。
AdventCalendar2018 4 WordPress でつくるブログメディアの企画で、類似サービスを調べる

企画の精度を向上させるために、考えている類似サービスを調べます。成功しているモデルを調べて、どういったメディアを目指すのかという企画の参考にします。

もし、企画を出したときには必ず競合はないのかと質問されます。競合というと大げさかもしれませんが、少なくとも全く同じサービスは無い、あるいは、同業でも自社にはこういう強みがあり、競合を上回る可能性があると仮説をたてておくといいです。

# 直近の計画
カレンダーの計画はこの様になっています。

- [x]  企画
    - [x] 3日目 
        - 全体スケジュール
    - [ ] 4日目 
        - 類似サイトの調査

# 企画の類似サービス
類似サービスを探す前に、現時点で決まっていることを確認します。

## 企画で決まっていること
[AdventCalenadr2018 2 WordPress でつくるブログメディアの企画を考える \- Qiita](https://qiita.com/pugiemonn/items/36b36c933666707965cb) によると、決まっているのは、以下です。

- 読者
- コンセプト
- KPI
- KGI

後ろの2つは置いて、読者とコンセプトだけが決まっている感じです。

>## この企画の読者
AI や機械学習に興味を持っていたり、学習したいと思っているビジネスマンや学生を考えています。

> ## この企画のコンセプト
読んだ人が AI や機械学習について理解を進める助けとなるメディアにします。

メディアのテーマとしては、AI や機械学習であることと、メディアはまだテーマについて詳しくない人が詳しくなりたい、メディアを通してわかった感がでると良さそうです。

## わかった感がでそうなメディアを調べる
真っ先に思いついたメディアは NewsPicks です。
[NewsPicks \| 経済を、もっとおもしろく。](https://newspicks.com/)

有料のメディアとして成功しており、するどい企画で読者に支持されています。いきなりNewsPicksを目指すというのは大変ですが、企画テーマに関するニュースを紹介するようなメディアは良さそうです。

## AI のニュースサイトを調べる
AI のニュースで検索しました。

- [人工知能（AI）：ニュースまとめ【12/4更新】 \- ライブドアニュース](http://news.livedoor.com/%E4%BA%BA%E5%B7%A5%E7%9F%A5%E8%83%BD%EF%BC%88AI%EF%BC%89/topics/keyword/15404/)
- [人工知能ニュースメディア AINOW \| 人工知能のニュースを3万件以上掲載するメディア](http://ainow.ai/)
- [人工知能（AI） \| IoTニュース：IoT NEWS](https://iotnews.jp/technology/ai)
- [人工知能（AI）ニュースまとめ \| レスポンス（Response\.jp）](https://response.jp/special/recent/3532/%E4%BA%BA%E5%B7%A5%E7%9F%A5%E8%83%BD%EF%BC%88AI%EF%BC%89)

各ニュースサイトのAIカテゴリが検索でヒットします。
一方で AINOW というサイトはニュースを一部紹介シているので、これは NewsPicks と似ていて真似できる気がしました。

# メインの企画
NewsPicks と AINOW を参考にニュースを一部紹介してコメントするような形式とします。

紹介するだけなら少し更新を継続できるかもしれません。

ニュースを WordPress でいう投稿、ブログでいう記事に当たる部分として投稿していくことでメディアの体裁になると思いました。


# 最後に
類似サービスの調査といってもあまり調査はできませんでした。
まあ、◯◯みたいな感じのメディアですと説明できると説明する文には楽ですね(☝ ՞ਊ ՞)
WebAssemblyの知識を体系化しようとする試み

[WebAssembly Advent Calendar 2018](https://adventar.org/calendars/2970)というものを作ったのですが、誰も書いてくれないようです。悲しい。

と言っていても始まらないので、自分の知っている知識をまとめて体系化してみようかと思います。現時点での目次は次の通りです。日々変更されると思います。

* [ハイレベルな紹介](https://qiita.com/chikoski/items/47ca7bbfe5bfb5fe0f66)
* 目的別利用例の紹介
    * ブラウザ上で動かすプログラムの高速化
    * 既存ソフトウェア資産を利用したWebコンテンツの作成
    * デュプロイ時のトラブルを避けるため
* wasmファイルの構造（ハイレベルな紹介）
* JavaScript API
    * Web embedded API
    * Stream compile
* [クロスコンパイル](https://qiita.com/chikoski/items/c430e7db26b1d5d3d07d)
    * C/C++の場合：emscriptenを使うケース
    * C/C++の場合：clangとlddを使うケース
    * Rustの場合
* WebAssembly deep dive
    * スタックマシン
    * 簡単な関数定義の例
    * コントロールフロー
    * メモリモデル
    * メモリ操作
* WASMに出力するなんちゃってコンパイラーの作成

ぼちぼちやっていくので、長い目で見てやってください。
ES6のclass構文でphina.jsのクラスを継承する

普通にextendsで継承すると、大体は問題なく動きます。

ですが、それだけだとオーバーライドができないので、以下のようにprototypeを手動でセットします。

```javascript
class SubRectangle extends phina.display.RectangleShape {
  constructor (option) {
    super(option)
    Object.setPrototypeOf(this, SubRectangle.prototype) // ←これ
  }
  render (canvas) {
    console.log('ex: renderをオーバーライドして何かする')
    super.render(canvas)
  }
}
```

以上です。。

軽く調べたところ、setPrototypeOfは最適化がされないためパフォーマンス上よろしくない場合があるようです。
（ただ、babelでclassの継承をトランスパイルしたらsetPrototypeOfが使われた気がするので結局変わらないかもしれません）

もしも他にスマートな方法をご存じの方がおりましたら教えていただきたいです。

---

2018/12/08 追記：
Negiwine_jpさんの記事『[phina.jsとclass構文について考察する](https://qiita.com/Negiwine_jp/items/512248cce5d9274cbb83#_reference-841685534fb7691c08d1)』もぜひご参照ください！
Postfixで特定ドメインあてのメールを1ユーザに集約する

### そもそもやりたいこと
- 別のPostfixサーバから、テストでローカルパート部不定のメールアドレスあてのメールが多数飛んでくる。
- 送信したメールが送信失敗にならないようにしたい(status=sentにしたい）。
- 届いたメールは飲んでしまってもよいが、できたら、テストした人があとから探せるようにしたい。

### こうなった
- メールを受け取るPostfixで、特定ドメインあてのメールは1ユーザに集約して配送する。
- 集約先のユーザのMailboxで届いたメールを見る。

テストでアドレスをルールもなく作っているので、メールを受け取るPostfixではアドレスごとにメールボックスを分けるのが無理で、1ユーザに集約させました。

### 設定方法
example.comがもともとこのメールの処理するドメインだったとして、
テストでローカルパート部@example.co.jp あてのメールが来るとします。

#### /etc/postfix/main.cf
```sh:/etc/postfix/main.cf_抜粋
virtual_mailbox_domains = hash:/etc/postfix/search_domain
virtual_mailbox_base = /
virtual_mailbox_maps = ldap:/etc/postfix/ldap-aliases.cf
virtual_alias_maps = ldap:/etc/postfix/ldap-aliases.cf, regexp:/etc/postfix/dev.regexp
```
もともとはexample.comのアドレスは、ldapでメールアドレスとmbox紐づけをしていたのを(ldap:/etc/postfix/ldap-aliases.cf)、さらに、example.co.jpアドレス処理用のdev.regexpの正規表現のmapを追加(virtual_alias_mapsの後半の regexp:/etc/postfix/dev.regexp)。


#### /etc/postfix/search_domain
これは、virtual_domainとして example.co.jpも処理してくれるように追加した。

``` sh:/etc/postfix/search_domain
example.com    domain
example.co.jp    domain
```

#### /etc/postfix/transport
もともと、うっかり外部にメール配送しないように全部 discardする設定にしていたので、example.co.jp あてのメールをdiscardしないように追加。

```sh:/etc/postfix/transport
example.com : 
example.co.jp :
* discard:discard
```

#### /etc/postfix/dev.regexp
で、肝心のexample.co.jpアドレスを処理しているところは、このような感じ。

```/etc/postfix/dev.regexp
/^.*@example.co.jp$/ usr1
```

example.co.jpあてのメールは全部、ローカルのユーザ usr1 に飛ばす。
docker-composeで爆速でローカルにconcourseを立てる

## 環境
macOS High Sierra 10.13.6

```bash
$ docker -v
Docker version 18.09.0, build 4d60db4
$ docker-compose version
docker-compose version 1.23.2, build 1110ad01
docker-py version: 3.6.0
CPython version: 3.6.6
OpenSSL version: OpenSSL 1.1.0h  27 Mar 2018
```

## Hello Concourse!
```bash
$ wget https://concourse-ci.org/docker-compose.yml
$ docker-compose up -d
Creating docs_concourse-db_1 ... done
Creating docs_concourse_1    ... done
```

http://127.0.0.1:8080/ にアクセスしてconcourseのcliであるflyコマンドをダウンロードしましょう。
![スクリーンショット 2018-12-04 23.23.06.png](https://qiita-image-store.s3.amazonaws.com/0/84299/185eff68-02c3-7805-9b34-f00b2bb2be8f.png)

ダウンロードが完了したらコマンドに実行権限をつけてあげます。今回はPATHの通っているところに移動もします。

```
$ chmod +x ~/Downloads/fly
$ mv ~/Downloads/fly /usr/local/bin
$ fly -v
4.2.1
```

## Login
### cli
```bash
$ fly -t main login -c http://127.0.0.1:8080 -n main -u test -p test
```
### UI
![スクリーンショット 2018-12-04 23.28.17.png](https://qiita-image-store.s3.amazonaws.com/0/84299/800c725a-dd4c-376f-28a6-7f4385399105.png)

username: test
password: test
でログインできます。

## Set-Pipeline
せっかくなので1つpipelineをsetしてみましょう。
以下のファイルを用意してください。

```yml:pipeline.yml
resources:
- name: booklit
  type: git
  source: {uri: "https://github.com/vito/booklit"}

jobs:
- name: unit
  plan:
  - get: booklit
    trigger: true
  - task: test
    file: booklit/ci/test.yml
```
githubから https://github.com/vito/booklit のリポジトリを取得して、取得したTaskの設定ファイルを利用してテストをするようなパイプラインですね。

```bash
$ fly -t main set-pipeline -p booklit -c ./pipeline.yml
resources:
  resource booklit has been added:
+ name: booklit
+ type: git
+ source:
+   uri: https://github.com/vito/booklit

jobs:
  job unit has been added:
+ name: unit
+ plan:
+ - get: booklit
+   trigger: true
+ - task: test
+   file: booklit/ci/test.yml

apply configuration? [yN]: y
pipeline created!
you can view your pipeline here: http://127.0.0.1:8080/teams/main/pipelines/booklit

the pipeline is currently paused. to unpause, either:
  - run the unpause-pipeline command
  - click play next to the pipeline in the web ui
```

setしただけではパイプラインがpause状態であるため、flyコマンドでunpauseします。(UIから行うこともできます)

```bash
$ fly -t main unpause-pipeline -p booklit
unpaused 'booklit'
```

http://127.0.0.1:8080/teams/main/pipelines/booklit にアクセスしてみます。
PipelineがunpauseされJobがstartされたのが確認できます。
あとは動画でお楽しみください。

![qiita-quick.mov.gif](https://qiita-image-store.s3.amazonaws.com/0/84299/98bd360e-6e37-41e3-27bd-2d2e3d181bc4.gif)
AWS認定試験について（2018）

本エントリは、AWS #2 Advent Calendar 2018の4日目です。

昨年も同様のエントリーを書きましたが、この1年でアップデートされた内容を書きます。
https://qiita.com/nogamincho/items/d0a76c459b18f96166e4

AWS認定は、AWSに関する専門知識を有している証明になります。
https://aws.amazon.com/jp/certification/
# 2018年主要なアップデート
## 試験の前提条件が廃止
2018/10/18に前提条件の廃止が行われました。
Associateの認定を持っていなくても、Professionalレベルの試験やSpecialtyを受験することができるようになりました。
https://aws.amazon.com/jp/about-aws/whats-new/2018/10/announcing-more-flexibility-for-aws-certification-exams/

## 専門知識試験の追加 
専門知識試験にセキュリティと機械学習の試験が追加されました。
機械学習の試験は現時点ではBeta版として提供されており、英語のみですが12月中は受験できるようです。
なお、セキュリティの試験は日本語での受験も可能です。

- AWS Certified Security - Specialty (SCS) **NEW!**
- AWS Certified Machine Learning - Specialty (MLS*) **NEW!**

## 試験問題のアップデート
問題が古くなってきており、試験が最新のサービスに対応していませんでした。
そのためSAA, SAP, DVAでは問題のアップデートが入ったようです。
口コミがあまり当てにならなくなってくるため、最新の試験ガイドを確認しましょう。

# 試験対策
筆者は趣味?でAWSの認定試験を取得しており、CLFとMLS以外のAWS認定を取得しています。
幅広い分野の最新情報を取得し続けるため、**AWSブログの全内容を英語でチェックする**ようにしました。
AWSのブログではサービスのアップデートやリファレンス実装など、AWSからの情報が日々公開されています。

効率的に情報を収集するため、inoreaderを利用してRSS Feedを購読しています。
以下のサイトを参考にすると自前でフィードを集める必要がありません。（ありがとうございます！）

* https://dev.classmethod.jp/cloud/aws/aws-rss-feeds/

これらで登録できるものに加え、[AWS What's new](https://aws.amazon.com/new/?nc1=h_ls)の全てをチェックするようにしています。

上記以外の試験対策方法は昨年度のエントリに記載しています。

# 試験一覧
参考までに、2018/12/4時点のAWS認定試験の全量を記載します。
## ロールベース認定
- AWS Certified Cloud Practitioner (CLF)
- AWS Certified Solutions Architect - Associate (SAA)
- AWS Certified Developer - Associate (DVA)
- AWS Certified SysOps Administrator - Associate (SOA)
- AWS Certified Solutions Architect - Professional (SAP)
- AWS Certified DevOps Engineer - Professional (DOP)

## 専門知識認定
- AWS Certified Big Data - Specialty (BDS)
- AWS Certified Advanced Networking - Specialty (ANS)
- AWS Certified Security - Specialty (SCS) **NEW!**
- AWS Certified Machine Learning - Specialty (MLS*) **NEW!**

`* 略称は確認が取れ次第更新します。`
bundle installするとmysqlでpermission errorが出る

#背景
rails newをした後にbundle updateをするとmysql2のgemが通らず、permission deniedが表示される。
下記のようなエラーが発生する。

<img width="1440" alt="スクリーンショット 2018-11-25 17.30.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/277836/374d0ce8-194c-1561-377c-4c49a72e0ecf.png">

#開発環境
・Rails 5.2.1
・Ruby 2.5.1
・mysql2 0.5.2

#原因
エラー内容としてmysql2 0.5.2のgemをコンパイル時に以下のディレクトリに対してpermission errorが出ていました。

```text:ターミナル
Errno:EACCES: Permission denied @ rb_sysopen - /Users/kid/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/mysql2-0.5.2/CHANGELOG.md
```

#解決方法
原因から、permission deniedが出ているディレクトリに対し、所有者を変更する。

下記コマンドを実行し、bundle installするといけます。

```text:ターミナル
$ sudo chown -R ~/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/mysql2-0.5.2/ext/mysql2
```
※ -R ディレクトリを再帰的にたどって所有者を変更する
PythonでCognitoのFORCE_CHANGE_PASSWORDをどないかする

# マネコンからユーザー登録したら...
ステータスが```FORCE_CHANGE_PASSWORD```に。
<img width="760" alt="Cognito01.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/283935/383aec23-2d13-eb9b-ea65-680d2d3800c9.png">


とりあえず初回の認証や。

```
import boto3

client = boto3.client('cognito-idp')

first_auth_response = client.admin_initiate_auth(
    UserPoolId = "ユーザープールID",
    ClientId = "クライアントID",
    AuthFlow = "ADMIN_NO_SRP_AUTH",
    AuthParameters = {
        "USERNAME": "ユーザー名",
        "PASSWORD": "初回パスワード",
    }
)

```


レスポンスはだいたいこんな感じ↓（だいぶ省略）。アクセストークンやらIDトークンが返ってんくて困った。
```NEW_PASSWORD_REQUIRED```やから、どないかしてパスワード変更してやればええんか。

```
{
    'ChallengeName': 'NEW_PASSWORD_REQUIRED', 
    'Session': '長い文字列', 
    'ChallengeParameters': {
        'USER_ID_FOR_SRP': 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx', 
        'requiredAttributes': '[]', 
        'userAttributes': '{
            "email_verified":"true",
            "email":"xxxx@xxxx.com"}'
    }, 
    'ResponseMetadata': {略}
}
```

#どないかする
パスワードを変更して認証。

```
session = first_auth_response["Session"]


auth_challenge_response = client.admin_respond_to_auth_challenge(
    UserPoolId = "ユーザープールID",
    ClientId = "クライアントID",
    ChallengeName="NEW_PASSWORD_REQUIRED",
    ChallengeResponses={
        "NEW_PASSWORD":"新しいパスワード",
        "USERNAME":"ユーザー名"
    },
    Session=session
)

```
レスポンスはだいたいこんな感じ↓（だいぶ省略）。無事、アクセストークンやらIDトークンが取れて安心やわ。

```
{
    'ChallengeParameters': {}, 
    'AuthenticationResult': {
        'AccessToken': '...', 
        'ExpiresIn': 3600, 
        'TokenType': 'Bearer', 
        'RefreshToken': '...', 
        'IdToken': '...'
    }, 
    'ResponseMetadata': {略}
}
```
ステータスもCONFIRMになってたわ。
<img width="640" alt="Cognito02.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/283935/2fedea15-ef7e-f476-346e-17b0e27cced5.png">
RADIUS サーバー - Amazon Linux

RADIUS サーバー 作ってみた。



---
###1.freeradius をインストールする###

```
yum install -y freeradius freeradius-utils
```


###2.logの設定を行う###

auth と　　auth_badpass　を変更します。
auth_goodpass = no　はデフォルトだと思います。

```/etc/raddb/radiusd.conf

log {
        #  Log authentication requests to the log file.
        #
        #  allowed values: {no, yes}
        #
        auth = yes # 認証の可否をログに出す
        #  Log passwords with the authentication requests.
        #  auth_badpass  - logs password if it's rejected
        #  auth_goodpass - logs password if it's correct
        #
        #  allowed values: {no, yes}
        #
        auth_badpass = yes # 認証失敗のログを出す
        auth_goodpass = no # 認証成功のログを出す
}
```


###3.ユーザーを追加する###

最終行に追加する。

```/etc/raddb/users.

testuser Auth-Type:=Local, Cleartext-Password:="password"
```


###4.RADIUSを起動する###

```
/etc/rc.d/init.d/radiusd start
```


###5.接続の確認###

localhostに接続する。

```
# radtest -4 testuser password localhost 1812 testing123
```

![スクリーンショット 2018-12-04 23.20.38.png](https://qiita-image-store.s3.amazonaws.com/0/280929/8e7c5308-bd21-44c4-7991-36b5bc2057bc.png)


logを確認してみる。

```
cat /var/log/radius/radius.log
```

![スクリーンショット 2018-12-04 23.23.55.png](https://qiita-image-store.s3.amazonaws.com/0/280929/3e0d512f-9900-d553-e0a3-5ba9eaf6995f.png)
CTFのススメ

# CTFとは
CTFとは、セキュリティの知識の競う大会で、問題ごとに得点が割り当てられていてその問題を解くと点数が貰えます。1週間や一日など、制限時間があるのでその時間内で獲得した得点できそう大会です。
問題の種類は様々あり、forensics、crypto（暗号）、reverse engineering、web exploitationなどの問題があります。
今回はweb exploitationを中心に紹介ていきます。

# inspect me
http://2018shell3.picoctf.com:28831/
上のサイトをご覧下さい。一見なんともないサイトに見えますが、ソースコードを見ると答えらしきものが見えますね。これは答えの一部です。答えになる文字列はほとんどの場合｢大会の名前{hogehoge}｣のような形式になります。ここでは大会の名前はpicoCTFなので｢picoCTF{hogehoge}｣になります。
![Screenshot from 2018-12-04 23-06-33.png](https://qiita-image-store.s3.amazonaws.com/0/108716/ce3acb4a-8c73-512a-261d-29e3d707a252.png)

コメントの部分を日本語訳すると、｢これは3つに分けられたflag（答え）の1番目です｣とかいてあります。つまり同じような文字列をあと二つ見つければいいわけです。

ソースコードをじっくり見てみると、mycss,cssというファイルがあります。これが怪しそうなのでソースコードを見てみると最後の部分に以下のような文字列がありますね。
![Screenshot from 2018-12-04 23-14-14.png](https://qiita-image-store.s3.amazonaws.com/0/108716/e610b674-6b3b-7071-2b7a-51900d0ff317.png)
2つ目がありましたね。先ほどのHTMLをじっくり見るともう1つ答えになりそうなものがもうひとつありますね。myjs.jsというファイルです。開いて見てみるとわかりますが、実は見る必要はありません。最後の部分文字列は空文字です。

ですので得られた2つの文字列を繋げたものが答えです。

# 常設CTFの問題を解こう

CTFは大抵大会が開催されてる期間しかとくことができません。しかし、常設CTFと言っていつでも問題を解けるようにしてあるサイトがいくつかあります。
そのひとつがpicoCTFです。他にもcpawCTFなどがあります。それらのサイトで試しに解いてみることをオススメします
[運用子ネタ]「もう勘弁してよ、このECSインスタンを作ったのはだれ ?」と悩んでいる方へ

## はじめに
本投稿は [SBCloud Engineers' Blog](https://techblog.sbcloud.co.jp/) にも投稿しています。SBCloud Engineers' Blogには日中間接続をはじめ、Alibaba Cloud関連のソリューションや技術ネタを記載していますので、よかったら是非一度アクセスみてください。

先日勤務先のビルにクリスマスツリーが飾られ、すっかりクリスマス気分になりました。12月12日には Alibaba Cloud Developers Meetup (AliEaters) #9兼プチ忘年会を開催されますので、ご興味ある方は是非参加してください。

![alt](https://techblog.sbcloud.co.jp/assets/2018/11/et-1.jpg)

さて、本題に入りますが、「もう勘弁してよ、このECSインスタンを作ったのはだれ ?」という悩みがありますでしょうか。ECSインスタンス作成できる上限に引っかかり、作成者不明のECSインスタンスが乱立していて、削除していいかどうかが分からず、参ったなぁ〜という問題が昔別のクラウドを利用していた時代からよく聞く話です。特に本番環境ではない環境でよく起きる問題ではないかと思っています。

今回はECSインスタンスを作成される際に、作成者(RAM User)の名前を自動的にECSインスタンスにタグ付けするようなソリューションをご紹介させていただきます。



## デモ動画
とりあえず、動くものをお見せします。下記約1分30秒動画をご確認ください。
デモ動画 → https://youtu.be/l3ZSbflM_Zk

test-qiubinbinというRAM Userで、タグ無しのECSインスタンスを作成したあと、しばらく立つとtest-qiubinbinというOwnerタグをつけられるデモになります。


## アーキテクチャ、フロー、利用プロダクト

全体のアーキテクチャ及びフローは以下になります。
![alt](https://techblog.sbcloud.co.jp/assets/2018/11/addTag2Ecs-3.jpg)


利用しているプロダクトは以下になります。

### ActionTrail
Alibaba Cloudリソースへの操作を記録するプロダクトです。
### Object Storage Service (OSS)
名前の通り、オブジェクトストレージです。ActionTrailログはOSS Bucketに格納されます。
### Function Compute
利用者はサーバーを立てる必要がなく、コードをそのまま実行できるサービスです。OSSのトリガーがあり、対象となるOSSイベントが発生した際に、OSSからイベントの情報がFunction Computeに送信されて、Function Computeでいろいろやれます。
### Resource Access Management (RAM)
ポリシーで、Alibaba Cloud各プロダクトへのアクセスを管理するプロダクトです。利用者はRAM Userというサブアカウントでコンソール画面にログインしたら、Access Keyを使ったプログラムで操作したりすることが可能です。今回はRAMのAccess Keyを利用します。

## 各プロダクトの設定
各プロダクトの作業内容を簡単にご紹介いたします、細かい設定については割愛させていただきます。( お問い合わせ か Twitter(@joe_qiubinbin)にてご連絡いただければ、いつでも説明に参ります)

### OSS
OSSの管理画面にて、ActionTrailログ保存用のバケットを作成します。バケット名はバケットのドメイン名にも利用されるので、一意性を持つ必要があります。

以下、バケット作成の画面になります。
![alt](https://techblog.sbcloud.co.jp/assets/2018/11/oss.png)


### ActionTrail
ActionTrailの管理画面にて、操作を追跡するトレイルを作成します。下の図ですと、トレイル名はaudit_trailで、OSS Bucketはjoe-trail-logを設定しています。
![alt](https://techblog.sbcloud.co.jp/assets/2018/11/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2018-11-22-20.30.58.png)

### RAM
[RAMユーザーを作成する](https://jp.alibabacloud.com/help/doc-detail/28647.htm#h2-ram-2) と [ユーザーまたはユーザーグループの権限付与](https://jp.alibabacloud.com/help/doc-detail/28653.htm#h3--) を参考にして、RAM Userの作成、そのユーザーのAccess Keyの生成と必要な権限の付与といった作業を行います。

生成されたAccess KeyはFunction Computeの関数に利用されます。

権限については、OSS Bucket の読み取り権限、ECSインスタンスへタグ付けの権限が必要がなります。

### Function Compute
[関数の作成](https://jp.alibabacloud.com/help/doc-detail/52077.htm) 、[ユーザー許可](https://jp.alibabacloud.com/help/doc-detail/52885.htm) を参考に、サービスと関数を作成します。サービスと関数は1:Nの関係です。

今回作成する関数のRuntimeはpython3で、サンプルコードはこちらです。サンプルコードでは、ACCESS_KEY_ID、ACCESS_KEY_SECRET、TAG_NAMEといった関数の環境変数を利用しています。<font color="red">あくまでもテスト用のもので、そのまま本番環境にご利用することを推奨しません。</font>

[トリガーの作成](https://jp.alibabacloud.com/help/doc-detail/53102.htm) を参考に、OSSトリガーを作成します。

## 最後
いかがでしょうか、このような仕組みを活用することで、作成者不明のECSインスタンスの乱立問題が解消されるでしょう。

余談ですが、この投稿の最初にご紹介させていただいた [Alibaba Cloud Developers Meetup (AliEaters)](https://alibabacloud.connpass.com/)はAlibaba Cloudに関する技術ネタ、ノウハウなどを共有する場です。よかったら是非参加してみてください。
spring-mvc ブラウザアクセス時のルートパス変更

WEB-INF → web.xml に、以下を追加。

```web.xml
<servlet-mapping>
    <servlet-name>dispatcherServlet</servlet-name>
    <url-pattern>/test/*</url-pattern>
</servlet-mapping>
```

http\://xxxxx.com/test/ にアクセスすると、indexが呼ばれる。
http\://xxxxx.com にアクセスすると、404 not found.
UnityIPhoneXSupportでUnityのiPhoneX対応を行ったら罠にハマった

#前提
https://qiita.com/tkyaji/items/8cdc0a4324d4e89633e8
を参考に、UnityIPhoneXSupport_Portrait.unitypackage をインポートすること

#問題点
Screen.orientation = ScreenOrientation.Portrait
処理のあと、iphoneXのノッチ対応が無効になってしまう

#対策
Screen.orientation = ScreenOrientation.Portrait
を行う前に、
QualitySettings.vSyncCount = 0;
を実施し、その1フレーム後に
Screen.orientation = ScreenOrientation.Portrait
を処理するように

#分析
①
Q:どうして UnityIPhoneXSupport_Portrait.unitypackage に上記の問題がありますか？
A:このソースを適用することで、iphoneXのノッチ問題は余白と高さ(height)の調整が解決されますが、この調整はUnityが起動した直後のみ実施されるため、それ以降の処理で、もし余白と高さ(height)が他の処理で変わったら、ノッチ対応が無効になってしまいます。

②
Q:どうしてQualitySettings.vSyncCount = 0で問題を解決できますか？
A:vSyncCount = 0で画面の垂直同期をOFFにすることが出来ます。普段この垂直同期がONの状態で、Screen.orientation = ScreenOrientation.Portraitなどの処理で、①で説明した余白と高さなどが再計算されますが、OFFにすることで再計算されなくなります。

#備考
・垂直同期をOFFにしてノッチ対応が無効になる問題を解決しましたが、OFFにすることで他の問題が起きるかはまだ分かりません。使用する場合は自己責任でお願いします。

・急ぎでない場合、UnityIPhoneXSupportでiphoneXノッチの対応をするのはあまりお勧めできません。
UnityIPhoneXSupportはビルト後のソース置き換えで対応しているため、unity本来の機能のsafeArea取得がこのソース置き換えにより、Screen.safeArea.heightの値がScreen.heightと同じ値になってしまいます。
safeAreaを使った判定が無効になるため、予想できない問題が起きる恐れがあります。

#参考資料
https://qiita.com/tkyaji/items/8cdc0a4324d4e89633e8
https://ameblo.jp/sugawara-monolizm/entry-11875747245.html
GCPのログデータで1日の傾向を見てみる

GCPのログデータをエクスポートし、数日のデータから、1日の傾向を集計するためのメモ

実行にはColaboratoryを利用しました https://colab.research.google.com

### データを読み込む

```python
df = pd.read_json(io.StringIO(data['null__logs__2018-12-03T08-17.json'].decode('utf-8')))
```

### 10分でまとめる

```python
df['ts'] = pd.DatetimeIndex(df['timestamp']).round('10min').tz_localize('UTC').tz_convert('Asia/Tokyo').time

df2 = df.groupby(['ts']).agg({'logName': 'count'}).reset_index()
df2 = df2.rename(columns={'logName': 'count'})
```

### プロットする

```python
df2.plot(kind='bar', x='ts')
```


> ![image.png](https://qiita-image-store.s3.amazonaws.com/0/30362/e2ac959e-726f-11f9-2b27-6594c04278cc.png)

10時付近に何かが多いことがわかる
Laravelでブラウザテストを試してみる

Laravelでブラウザテストを試してみる。

## 環境
- Laravel 5.5

## 手順

###laravel duskの追加

```
composer require --dev laravel/dusk:"^2.0"
php artisan dusk:install
```

### サンプルテストの確認

tests/Browser/
配下にExampleTest.phpが作成されている

```
<?php

namespace Tests\Browser;

use Tests\DuskTestCase;
use Laravel\Dusk\Browser;
use Illuminate\Foundation\Testing\DatabaseMigrations;

class ExampleTest extends DuskTestCase
{
    /**
     * A basic browser test example.
     *
     * @return void
     */
    public function testBasicExample()
    {
        $this->browse(function (Browser $browser) {
            $browser->visit('/')
                    ->assertSee('Laravel');
        });
    }
}
```

- /のURLにアクセスして、Laravelという文字があればOK。となる。
- この/でアクセスされる画面はresources/views/welcome.blade.phpになっている。 

.envを修正

ここで詰まった。ポート番号を指定していないと、テスト結果がFalseになるみたいなので修正。

```
APP_URL=http://localhost:8000
```

テスト開始

```
php artisan serve
php artisan dusk

PHPUnit 6.5.13 by Sebastian Bergmann and contributors.

.                                                                   1 / 1 (100%)

Time: 1.88 seconds, Memory: 10.00MB

OK (1 test, 1 assertion)
```

成功！

## 参考
https://readouble.com/laravel/5.5/ja/dusk.html
https://stackoverflow.com/questions/46507791/laravel-5-5-dusk-could-not-work
gVimでちょっとしたメモを保存するときのコマンドを作った

# 背景
WindowsのメインエディタでgVimを利用しているが、ちょっとしたメモを書いたときにgVimのエディタ上で保存場所のディレクトリを辿るのが少しめんどくさい。
できればエクスプローラとかのクイックアクセスとか使いたい。

# 解決
gvimrcに下記を追加する

~~~
function SaveasFunc() "名前を付けて保存のコマンド{
  browse confirm saveas
  cd %:h
endfunction
command Saveas call SaveasFunc()
"}
~~~

# 使い方
1. gVimを開く
2. メモを書く
3. :Saveasコマンドを実行する
4. GUIのファイラーが開くのでフォルダ選択してファイル名書いて保存！
5. gVimのカレントディレクトリも保存したディレクトリになるので同じところに別のメモもすぐ作れる！

# あとがき
こういうちょっとしたメモを書きたいときみんなどうしているんだろう。
まずエクスプローラでファイル作ってからgVimで開いているんだろうか。
シンプルにfont-familyを指定したい

バンドルされた標準的な日本語フォントをただただ使いたいだけなのに、ちまたにあふれる指定は煩雑！
できるだけシンプルにfont-familyを指定したい！

[デモ](https://ksk1015.github.io/simple-font-family/)

## まず調査

| デバイス<br>ブラウザ | 指定無し | sans-serif | serif |
|:-:|:-:|:-:|:-:|
| iOS<br>Safari | ヒラ明朝 | ヒラ角ゴ | ヒラ明朝 |
| Android<br>Chrome | NotoSans | NotoSans | NotoSans |
| Windows10<br>Edge / IE11 | MSPゴ | メイリオ | MS明朝 |
| Windows10<br>Chrome / Firefox | メイリオ | メイリオ | 游明朝 |
| Windows7<br>IE11| MSPゴ | メイリオ | MS明朝 |
| Windows7<br>Chrome / Firefox| メイリオ | メイリオ | MSP明朝 |
| Mac<br>Safari | ヒラ明朝 | ヒラ角ゴ | ヒラ明朝 |
| Mac<br>Chrome / Firefox | ヒラ角ゴ | ヒラ角ゴ | ヒラ明朝 |

※ ブラウザの初期設定の場合です
※ lang="ja"を指定しないと英数字は英文フォントが優先されます

## 考察
- 指定無しはSafariだけ明朝体になる
- sans-serifは全てちゃんとゴシックになる。Windiows10でメイリオが表示されるのは好みがわかれるところ
- serifもAndroid以外はちゃんと明朝体が表示される。游明朝バンドルされてるWindows10でもEdge, IE11はMS明朝を表示しちゃうのは嫌な人多いかな
- どれでも絶対に明朝表示したい場合はウェブフォントが必要

## プラン

### ゴシックプランA - シンプルに

sans-serifだけでどんなデバイスでもちゃんとゴシックで表示される

```css
.gothic-a {
	font-family: sans-serif;
}
```

### ゴシックプランB - Windowsでは游ゴ

Macで游ゴ指定するには "YuGothic" なので表示されずヒラ角になる

```css
.gothic-b {
	font-family: "Yu Gothic", sans-serif;
}
```

### ゴシックプランC - Windowsの游ゴのウェイトを調整

Windowsで普通に游ゴを指定すると細いのでそれを調整

```css
@font-face {
  font-family: "MyYuGo";
  src: local("Yu Gothic Medium");
  font-weight: 400;
}
@font-face {
  font-family: "MyYuGo";
  src: local("Yu Gothic Bold");
  font-weight: 700;
}

.gothic-c {
	font-family: "MyYuGo", sans-serif;
}
```

### 明朝プランA - シンプル

明朝がバンドルされてないAndroidは明朝表示されません

```css
.mincho-a {
	font-family: serif;
}
```

### 明朝プランB - Windowsは游明朝に

WindowsのEdge, IE11が游明朝になります、Androidでは明朝表示されず

```css
.mincho-b {
	font-family: 'Yu Mincho', serif;
}
```

### 明朝プランC - Noto Serif JP

シンプルにウェブフォントの力を借ります

```html
<link href="https://fonts.googleapis.com/css?family=Noto+Serif+JP" rel="stylesheet">
```

```css
.mincho-c {
	font-family: 'Noto Serif JP', serif;
}
```

### 明朝プランD - AndroidのみNoto Serif JPを読み込む

Android以外は読み込まないので軽くなるけど、複雑な気がするので当初の趣旨に反するかな

[デモ](https://ksk1015.github.io/simple-font-family/android-noto-serif.html)

```html
<script>
// 読み込むか否かの判定は簡易にUAで判定
(function () {
	if (/android/i.test(navigator.userAgent)) {
		var link = document.createElement('link');
		link.rel = 'stylesheet';
		link.href = 'https://fonts.googleapis.com/css?family=Noto+Serif+JP';
		document.head.appendChild(link);
	}
})();
</script>
```

```css
.mincho-d {
	font-family: 'Noto Serif JP', 'Yu Mincho', serif;
}
```
アロー関数のthisを束縛しないの意味とは

#まえがき

おはようございます。[Make IT アドベントカレンダー](https://qiita.com/advent-calendar/2018/make_it)の5日目を担当しますバンドリが好きなhaduki1208です。
明日は @yamato3310 さんが投稿してくださいます。
明後日はライブを見に現地へ行きます。

本日の内容はJavaScriptのアロー関数の束縛の意味について自分の考えを述べます。

#thisを束縛しない？

[MDN アロー関数](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/arrow_functions)　2018年12月04日現在
>アロー関数式 は、その名のとおり矢印を使って記述し、function 式より短い構文で同様な内容を記述することができます。なおthis, arguments, super, new.target を束縛しません。また、アロー関数式は、メソッドでない関数に最適で、コンストラクタとして使うことはできません。

先日、後輩にアロー関数について質問されました。
「アロー関数はthisを束縛しない」とはどんな意味でしょうか。
僕も初めてアロー関数について学んだ際は「束縛」の意味が理解できませんでした。
今回は個人的な解釈のもと（言語仕様書をkwskは読んでないため）説明します。

※strictモードについては触れません

#束縛しないとは、強制的な値の代入を行わないということ

以下はthisの値が変わる例です。

```js
const Human = function (name) {
    console.log(this); // (1) Human
    this.name = name;
    this.sayName = function () {
        console.log(this); // (2) Human
        console.log(`I am ${this.name}.`);
    }
    this.sayNameLater = function (time) {
        setTimeout(function () {
            console.log(this); // (3) window
            console.log(`I am ${this.name}.`);
        }, time);
    }
}
const taro = new Human("taro");
taro.sayName();
taro.sayNameLater(1000);
```
(1)と(2)のthisにはHumanオブジェクトが入ります。
しかし、(3)にはwindowオブジェクトが入ります

(1)はコンストラクタ(new)に呼び出されたため、thisにはHumanが代入されました。
(2)はHumanオブジェクトのインスタンスに呼び出されたため、thisにはHumanが代入されました。
(3)はグローバルから関数として呼び出されたため、thisにはwindowが代入されました。

このようにthisは呼び出し元によって値が変動します。
関数オブジェクトの呼び出し方によって定められた値が、強制的にthisに代入されるためです。

アロー関数はこの強制的な代入を行わないようにします。

まとめ
「thisを束縛する」　　===　「thisに強制的に値を代入する」
「thisを束縛しない」　===　「thisに強制的に値を代入をしない」

#外のスコープのthisを参照する

アロー関数を使用する場合、thisに値は代入されません。

```js
const taro = {
    name: "taro",
    sayName: () => {
        console.log(`I am ${this.name}.`);
    }
};
taro.sayName();

console.log(this); // window
```
「sayNameメソッドをアロー関数で定義した場合、thisには何も入らないからundefinedでエラーが起きる！」
って訳ではないです。外のスコープにthisがないか探してくれます。
これはグローバル領域のthis(windowオブジェクト)を参照します。

※functionを全部アロー関数に置き換えてやるぜ！って時に上のような書き方をしてバグらせてました。

```js
const Human = function(name){
    this.name = name;
    this.sayName = () => {
        console.log(this.name);
    };
}
const taro = new Human("taro");
taro.sayName();
```
これは太郎君が名前をしゃべってくれます。
アロー関数の外のスコープ(Humanスコープ)は、コンストラクタによってthisにHumanが代入されているためです。

#アロー関数をコンストラクタに使用できない訳

```js
const Human = name => {
    this.name = name;
    this.sayName = () => {
        console.log(this.name);
    };
}
const taro = new Human("taro");
```
「Human is not a constructor.」と怒られました。
アロー関数はthisに値を代入しないので、thisにHumanが強制的に代入されません。
thisがwindowオブジェクトのためコンストラクタの役割が成立しないからです。

#あとがき
MDNで「束縛する」「束縛しない」のキーワードはころころ変わってしまっているそうで、
アロー関数を勉強した時期によって様々な見解がありそうです。

この「thisに強制的に値を代入しない」という考え方でアロー関数に理解を深めていただけたのであれば幸いです。
ハニーポットをRaspberry Piで運用してみる

この記事は[VALU Advent Calendar](https://qiita.com/advent-calendar/2018/valu) 4日目のエントリーです。
3日目のクロスプラットフォームなアニメーションライブラリ[Lottie](http://airbnb.io/lottie/)に続き、本日はセキュリティのエントリです。

###ハニーポットとは
---
>ハニーポットは、コンピュータセキュリティ用語としては、不正アクセスを受けることに価値を持つシステムのことを指す。何らかの有益そうな情報や資源がありそうな場所を用意して、それにつられた者を観察したり、肝心な部分で被害を出さないために目をそらせたり、コンピュータ・フォレンジックスを行うための証拠を集めたりする、一種のおとり手法に使われる。手法そのものをハニーポットと呼ぶこともある。

出典: [Wikipediaのハニーポットの記事](https://ja.wikipedia.org/wiki/%E3%83%8F%E3%83%8B%E3%83%BC%E3%83%9D%E3%83%83%E3%83%88)

###使用したハード・ソフト
---
- Raspberry Pi 3 Model B
- OS: [Raspbian Stretch Lite](https://www.raspberrypi.org/downloads/raspbian/) (November 2018)
- ハニーポット: [DShield Raspberry Pi Sensor](https://github.com/DShield-ISC/dshield)

###環境構築
---
1. [Etcher](https://www.balena.io/etcher/)でSDカードにOSイメージを焼く。
2. 4つのRaspberry(CPUコアの数)を眺めながらラズパイを起動。
3. パスワードが初期値のままではDShieldのインストールに失敗するので変更する。

```
$ sudo raspi-config
```
<img width="780" alt="Screen Shot 2018-12-04 at 22.40.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/196261/6b1b1d81-5d66-117f-3386-df24d652faa4.png">
「1 Change User Password」で任意のパスワードを設定。
4. 以下を実行。

```
$ sudo apt-get update
$ sudo apt-get install git
$ git clone https://github.com/DShield-ISC/dshield.git
$ cd dshield/bin
$ sudo ./install.sh
```
インストール途中で、Raspberry Piをハニーポットにする同意確認画面が表示される。実験的なパッケージを含まない「mature」を選択。

メールアドレスとAPI Keyを要求されるので、[DShieldの公式サイト](https://secure.dshield.org/register.html)にアクセスしてアカウントを取得しておく。認証後、管理者画面のポート番号などをインストーラーの案内に従って設定。
　「Please reboot your Pi now」が表示されたらラズパイを再起動。

```
$ sudo reboot now
```
SSHを利用している場合は、ポート番号が12222に変わるので注意してください。
5. 攻撃を待つ。DShieldに集めた情報は、公式サイトでログインすると確認できます。

###丸一日放置した結果
---
<img width="1168" alt="Screen Shot 2018-12-03 at 0.30.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/196261/55b0807f-06e4-bccc-4c1e-d1cbf3296a30.png">
!!!
なんだこのDoS攻撃は。
ログインを試みている攻撃のログを抜き出していて、やはり、初期値の組み合わせが多いです。家のLANで運用したので、色々と不安でした。SIMリーダーを買いハニーポット専用回線を作って、`[user/pass] failed`のセットを`/data/userdb.txt`に登録してやるともっといろんな攻撃を(安心して？)受けれるのでしょう。
DShieldは[Cowrie](https://github.com/cowrie/cowrie)を使っているようですね。
明日は、[_pochi](https://qiita.com/_pochi)さんのKotlinの記事です!

####参考にした記事
https://tech.nikkeibp.co.jp/it/atcl/column/17/041900152/101200026/