OmniAICreator/Qiita-1.07M huggingface dataset:
AWSのアカウント作成からRDSでMySQLインスタンス作成まで

# はじめに
基本他のQiitaの記事なんかを参考にしつつ進めたけど途中で湧いた疑問点とかメモっとく

ちなみにAWSはアカウント作成から1年間は無料でいろんなコンテンツを使えて、EC2、RDS、S3あたりの主要サービスは無料範囲で結構遊べます
ただしEC2のインスタンスは無料で使えてもデータ転送料は別途発生する仕組みになっているので、ちょっと注意が必要

https://www.logw.jp/server/6350.html
なにやらAmazon CloudFrontというのを使うと転送量も50GBまで無料で使える模様
以前AWSを使った時は無料のつもりで使ってたらいつのまにか2000円くらい料金が発生しましたｗ

# アカウント作成
https://aws.amazon.com/jp/register-flow/

公式の手順参考にしつつアカウント作成
最初は住所をそのまま日本語で入力したけど英語で入力しろって怒られた

登録直後は[この記事](https://qiita.com/tmknom/items/303db2d1d928db720888)を参考にしつつセキュリティの強化

MFA有効化のためのQRコード読み込みにはiPhoneのGoogle Authenticatorを使用
http://blog.asobicocoro.com/entry/2016/04/06/234122
MFAはなくすとやばいらしいので注意

# VPC ⇨　EC2　⇨　RDS　の順で設定
RDSを使いたい！と思ってAWSのアカウントを作ってもいきなりRDSのインスタンスを作る前に、いくつかやっておくことがあります

今回は[この記事](https://qiita.com/shunsuke227ono/items/23dbf4f3bc663a2875f0)を参考にEC2のインスタンスを作成するところまで行い(最後にあるwebサーバやらDBのインストールはスルー)、
お次に[この記事](https://qiita.com/na0AaooQ/items/7c69a88c80f1efb4cad3)を参考にRDSのインスタンスまで作成しました

記事途中でRDSのパラメータグループを作っていますが、この際パラメータに`character_set`でフィルターをかけ、
出てきた項目にはuft8mb4をセットしました
デフォルトのcharacter_setだと日本語が扱えないです

character_setはutf8でも日本語は扱えるんですが、mb4だと「😊」←こんな絵文字も扱えるようになります

# MySQLのインスタンス作った後は開発用ユーザ追加
インスタンス生成の際に作ったMySQLのユーザはルートになると思うので開発用にもユーザを作っておきます

```create user 'ユーザ名'@'プライベートIPアドレス' identified by 'パスワード';
grant all privileges on データベース名.* to 'ユーザ名'@'プライベートIPアドレス';
flush privileges;```
AlexaでSpotifyアカウントをLinkする

![image.png](https://qiita-image-store.s3.amazonaws.com/0/2204/a7858ad4-49cb-c8bf-9891-ad4c5c38ec54.png)


Alexaセットアップ終わったんだけど、Music & MediaにAmazon MusicやTuneIn Radioしか出てこなくて、Spotifyを使えないときの対処法。


SpotifyをLinkするには、amazonのアカウント自体をUSにしないといけない。
手順は👇

0. amazon.comへ
0. Your account
0. Content and Device
0. USのAddressを選択
0. alexa.amazon.comに戻る
0. Settingへ
0. Music & Media
0. Spotify のアカウントをLinkする、こっちは日本のアカウントでも良い。

参考: https://community.spotify.com/t5/Accounts/Spotify-and-Echo-dot/td-p/1610240

Spotifyのアカウントリンク後に
“Alexa, Play playlist named POPLIFE”って行ってあげると、
ちゃんと[POPLIFE](https://open.spotify.com/user/spotify/playlist/37i9dQZF1DX9ZSuA4m7huF) 再生されたよ。
SalesForceが強化学習モデルを自然言語のサマリー作成に応用研究

#要注目な強化学習の応用事例

Team AI研究会では継続的に強化学習のビジネスユースケースを議論していますが、
その中の一つが自然言語処理分野への応用です。
特に日本語の自然言語処理は限られた辞書データ等の課題がありますが、
強化学習エージェントを上手に利用することでなんとかブレークスルーが起きて欲しいと思います。

そんな中、下記の非常に興味深い論文を見つけました。

#A Deep Reinforced Model for Abstractive Summarization

抽象的な要約のための注意深いRNNベースのエンコーダ/デコーダモデルは、短い入力および出力シーケンスに対して良好な性能を達成している。

しかし、長い文書や要約の場合、これらのモデルにはしばしば反復的でインコヒーレントなフレーズが含まれます。我々は、イントラアテンションと新しいトレーニング方法を備えたニューラルネットワークモデルを紹介する。

この方法は、標準監督された単語予測と強化学習（RL）とを組み合わせる。前者のみで訓練されたモデルは、しばしば「ばく露バイアス」を示し、訓練中に各ステップで地上の真理が提供されると仮定します。

しかし、標準単語予測がRLの大域的配列予測トレーニングと組み合わされると、得られる要約がより読みやすくなる。このモデルは、CNN / Daily MailとNew York Timesのデータセットで評価します。

私たちのモデルは、CNN / Daily Mailデータセットで41.16 ROUGE-1スコアを取得しています。これは、従来の最先端モデルよりも5.7ポイントの改善点です。
また、ニューヨークタイムズコーパスの最初の抽象モデルとしても機能します。人間の評価はまた、我々のモデルがより高い品質の要約を生成することを示している。

出典：
https://arxiv.org/abs/1705.04304

<img width="661" alt="スクリーンショット 2017-09-28 0.12.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/76304/2d3a7865-11bb-0dff-aa50-24501ebb712d.png">

<img width="583" alt="スクリーンショット 2017-09-28 0.13.01.png" src="https://qiita-image-store.s3.amazonaws.com/0/76304/f86ef4d7-d91d-6ea1-08ef-3791227ac411.png">

<img width="604" alt="スクリーンショット 2017-09-28 0.13.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/76304/cc8f0449-4f56-69a9-f0ec-108437a83c7b.png">

<img width="320" alt="スクリーンショット 2017-09-28 0.13.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/76304/59d3c522-c2d2-e866-c1fb-653fe9e93eea.png">
React で show more できるリストを作る

何か正式な名称があるのかよくわかりませんが、QiitaやGitHubのホームページにも実装されている、

<img width="871" alt="スクリーンショット 2017-09-27 17.53.13a.png" src="https://qiita-image-store.s3.amazonaws.com/0/29000/27429bd4-11aa-4a48-54be-5d5310c5d26a.png">
<img width="675" alt="スクリーンショット 2017-09-27 17.55.41a.png" src="https://qiita-image-store.s3.amazonaws.com/0/29000/a3dc355d-5b99-7abd-bb58-5d0394764ebc.png">

こういうボタンをReactで実現する方法です。

全く装飾していないので見た目はアレですが、こんな感じの動きになります。

![react.gif](https://qiita-image-store.s3.amazonaws.com/0/29000/c7cf6d6a-75ba-08cd-c271-ba3a91f072f1.gif)


## ソースコード

```js
import React, { Component } from 'react';

const items = [
  'a',
  'b',
  'c',
  'd',
  'e',
  'f',
  'g',
  'h',
  'i',
  'j',
  'k',
  'l',
  'm',
  'n',
]

export default class App extends Component {
  constructor() {
    super()

    this.state = {
      marker: 5,
    }

    this.loadList = this.loadList.bind(this)
  }

  render() {
    const list = items.map(item => <li>{item}</li>)

    return (
      <div className="App">
        <ul>
          {
            list.slice(0, this.state.marker)
          }
        </ul>
        {
          items.length > this.state.marker
            ? <button onClick={this.loadList}>MORE</button>
            : ''
        }
      </div>
    );
  }

  loadList() {
    this.setState({
      marker: this.state.marker + 5
    })
  }
}

```

`marker`というstateで、リストの何個目までを表示させるかを管理しています。
`render`関数内で、sliceで配列を切って`marker`個目までの要素を表示させています。

その下の三項演算子では、リスト要素数と`marker`を比較して、`marker`のほうが小さい(まだ表示されていない要素がある)場合、MOREボタンを表示しています。
ボタンの`onClick`に紐づけられた`loadList`関数で`marker`を更新します。
stateの更新によって自動的にrender関数が呼ばれ、表示も更新されるという仕組みです。

React標準の仕組みを使って、わりと簡単に実装できました。

私の[個人ページ](http://s4kr4.com)内でも使用しています。
こちらは見た目もちゃんと整えているので、よろしければ[ソースコード](https://github.com/s4kr4/s4kr4.github.io)を参考にしてみてください。
QLC+ : macOS SierraでUSB-DMXインターフェイスを使えるようにしてみた

# 動機：
+ なんか恐しく安いボードで照明ができるらしいぞ
+ でもMacではなかなかちゃんと動いてくれてないらしい

という噂を聞きつけて、ちょっと試してみたくなりました。

# 方針：
さわったことのない分野で事情がよくわからないのです。
多分ドライバー回りで何か問題があるんだろうと想像して、必要そうなものを必要そうな場所に全部入れてみて様子を見ることにしました。

# 結論：D2XXDriver,D2XXHelper,FTDIUSBSerialDriverをインストールした後に、 /Library/Extensions/にあるFTDIUSBSerialDriver.kextを/System/Library/Extensions/にコピーする

これで使えるようになりました。
「ああそうかそういうことか」と察しがつく方は以下を読む必要はないでしょう。
っていうかどういうことなのかむしろ教えてほしい。コメントお願いします。

# ハードウェア
## USB-DMX変換
こんなやつです。

![P_20170923_100746.jpg](https://qiita-image-store.s3.amazonaws.com/0/61597/d738b49f-e762-947a-212c-54e02956af20.jpeg "P_20170923_100746.jpg")
Amazonでよく目にするUSB-RS485変換(299円でした)にキャノンコネクターを付けました。
元ネタは[こちら。DIY USB DMX Interface for under $10](https://stevenbreuls.com/2013/05/diy-usb-dmx-dongle-interface-for-under-10/)

## コンピュータ
MacBook Pro 2017 2.8GHz 16GB

## 照明機器
試しにLED PARを一個だけつないでみました。

# ソフトウエア

+ MacOs Sierra 10.12.6
+ [Q Light Controller Plus](http://www.qlcplus.org/) 4.11.0
+ D2XX Drivers 1.4.4[http://www.ftdichip.com/Drivers/D2XX/MacOSX/D2XX1.4.4.dmg](http://www.ftdichip.com/Drivers/D2XX/MacOSX/D2XX1.4.4.dmg)
+ D2XXHelper 2.0.0[http://www.ftdichip.com/Drivers/D2XX/MacOSX/D2xxHelper_v2.0.0.pkg](http://www.ftdichip.com/Drivers/D2XX/MacOSX/D2xxHelper_v2.0.0.pkg)
+ README [http://www.ftdichip.com/Drivers/D2XX/MacOSX/ReadMe.rtf](http://www.ftdichip.com/Drivers/D2XX/MacOSX/ReadMe.rtf)
+ FTDIUSBSerialDriver 2.4.2 [http://www.ftdichip.com/Drivers/VCP/MacOSX/FTDIUSBSerialDriver_v2_4_2.dmg](http://www.ftdichip.com/Drivers/VCP/MacOSX/FTDIUSBSerialDriver_v2_4_2.dmg)

# 手順
## D2XXDriver

READMEに沿って：
ダウンロードしてできたD2XXフォルダをデスクトップに置き、
ターミナルを開き、
もし、``` /usr/local/lib ``` , ``` /usr/local/include ``` が存在しないなら

```
sudo mkdir /usr/local/lib
sudo mkdir /usr/local/include
```
ぼくの場合はすでにあったのでやりませんでした。
あとはもろもろ配置したり、リンクしたり。

```
sudo cp Desktop/D2XX/libftd2xx.1.4.4.dylib /usr/local/lib/
sudo ln -sf /usr/local/lib/libftd2xx.1.4.4.dylib /usr/local/lib/libftd2xx.dylib
sudo cp Desktop/D2XX/ftd2xx.h /usr/local/include/ftd2xx.h
sudo cp Desktop/D2XX/WinTypes.h /usr/local/include/WinTypes.h
```
## D2XXHelper
ダウンロードしてインストール。

## FTDIUSBSerialDriver
ダウンロードしてインストールすると、```/Library/Extensions/``` に```FTDIUSBSerialDriver.kext``` ができます。
これを ```/System/Library/Extensions/``` にコピーします。管理者権限が要ります。
こんなアラートがでます。

![スクリーンショット 2017-10-17 16.45.05.png](https://qiita-image-store.s3.amazonaws.com/0/61597/102068ea-3749-4ff4-9391-6d062371d058.png "スクリーンショット 2017-10-17 16.45.05.png")

 ```ok``` を押します。
 
 これで使えるようになりました。
 Q Light Controller Plusを起動して確認。
 
 ![スクリーンショット 2017-10-17 16.47.56.png](https://qiita-image-store.s3.amazonaws.com/0/61597/ff5c42cc-2efd-3304-6e6b-96ec9dcfadaa.png "スクリーンショット 2017-10-17 16.47.56.png")
バグ、エラー、欠陥の違い

# 「バグ」というマジックワード
よくソフトウェア開発で問題が起きた場合は、「バグだね」とか「エラーが起きた」という言い回しをよく使う。
しかし、考えてみると発生した事象に対して「これはバグ」だとか「これはエラー」だとかという明確な線引を教わっていない気がした。

「オブジェクト指向入門 第２版 原則・コンセプト」を読んでいる時にそこらへんの記述があったのでメモしとく。

どうやらバグというのはソフトウェア畑の人が使った便利なマジックワードのようであるらしい。

本では、「誤りが外からソフトウェアの中に入り込んできたような、誰か他のものを責めるために使われたもの」としている。
厳密な区別が必要な場合はバグではなく、以下の用語で補足されるべきとのこと。
> ソフトウェアの災いを表す用語

> エラー（error)とは、ソフトウェアの開発中になされた誤った決定である。
> 欠陥(defect)とは、意図したふるまいからシステムが逸れてしまう原因となるソフトウェアシステムの特性である。
>フォルト（fault)とは、何らかの実行中に意図した振る舞いから逸れてしまうソフトウェアシステムのイベントである。

> 因果関係は明確である。すなわち、エラーから欠陥が生じ、フォルトは欠陥によって起こる

この定義の中だと、ソフトウェアの記述ミスである「欠陥」を自分はバグの意味で使っている。
例えば、境界値の判定条件を間違えたなどの意味合い。

他にもエラーやフォルトの意味でのバグの使い方は以下の通りになる。
エラー　：「リストをソートせずに使ったことがバグの原因」
フォルト：「バグの出ない処理を実現した」

またこの中では特にエラーを勘違いしていた。
ここだとエラーは人間による判断ミスだと解釈できる。
これまで、ソフトウェアが出力するいわゆる”エラー画面”のエラーだと勝手に思っていた。
その意味だとソフトウェアシステムのイベントなので、ここでの定義によればフォルト（障害？）に当たる。

# バグへの共通認識
このような用語があるからといって「バグというマジックワードを使うのをやめよう」と言っても、
文化として根付いた言葉遣いはなかなか変わらない。
さらに区別したからといって起きている問題は変わらないし、発生した”バグ”は修正しなければならない。

区別してもあまり旨味はないかもしれないが
このような区別がお互いの共通認識を確認するきっかけにはなるのかなと思う。
相手がどういう事象をバグと読んでいるのか確かめ合ってみるのも良さそう。
vue-cliを使ったプロジェクトで環境変数を使う

開発環境と本番環境で、呼び出すWebAPIのエンドポイントを変更したい場合などは、それらを環境変数に定義することが出来ます。

# 前提
使用するvue-cliは現時点での最新版`2.9.1`です。

```
$ vue -V
2.9.1
```

# 説明

## 使用するファイル

vue-cliでプロジェクト作成時に作られる、次のファイルを使います。

```
./config/dev.env.js
./config/prod.env.js
```

`dev`の方は開発環境用の設定ファイルで、`npm run dev`で開発サーバーを立ち上げた際に使用されます。
`prod`の方は本番環境用の設定ファイルで、`npm run build`でプロジェクトをビルドした際に使用されます。

## 設定例

```js:dev.env.js(例)
'use strict'
const merge = require('webpack-merge')
const prodEnv = require('./prod.env')

module.exports = merge(prodEnv, {
  NODE_ENV: '"development"',
  API_ENDPOINT: '"https://api.hogehoge.com/v2"' // 追加例
})
```

## 呼び出し

プロジェクトのスクリプト内で呼び出す際は、`process.env.<変数名>`というように呼び出します。

```js:HelloWorld.vue(例)
export default {
  name: 'HelloWorld',
  data () {
    return {
      msg: 'Welcome to Your Vue.js App'
    }
  },
    created: function () {
      console.log('Environment Variable: ', process.env.API_ENDPOINT) // ココ
    }
}
```

```:結果
Environment Variable: https://api.hogehoge.com/v2
```

# 注意点

## 文字列の扱い
環境変数の値に文字列を使用する際は、その値をダブルクォートで囲った後シングルクォートで加工必要ががるようです。
(キモい)

```js:例
NODE_ENV: '"development"'
```

## 反映タイミング

特に開発中の話ですが、環境変数を変更した場合は、環境変数を反映させるために開発サーバーを再起動する必要があります。

# 参考

https://vuejs-templates.github.io/webpack/env.html
herokuでjenkins.warをdeployしてみた


heroku上にjenkins乗せてみたメモです。初投稿ですが下書きがいっぱいになっているので、覚悟を決めて公開します。

# 背景
- herokuが面白そう、という噂を聞き、何かをデプロイしてみたくてとりあえずjenkinsを置いてみることとする

#やってみた
## heroku plugin のインストール
heroku plugins:install heroku-cli-deploy

##デプロイコマンド
heroku war:deploy <path_to_jenkins_war> --app <app_name>

##できた
- AdminPasswordの入力画面が表示された。かんたん。
- ん？AdminPasswordはどこ？

## AdminPasswordを避ける方法を下記のようにいろいろ考えてみていたが、ログに出てることに気づいた。
- warの引数として、adminPasswordを渡して設定できる？
- herokuのファイルの実態はどこ？（直接見に行ける？）
- ローカルでコンテナ作成して、AdminPasswordを解除してからコンテナをherokuにデプロイできる？


##というわけでログからAdminPasswordを調べる
heroku logs -t --app <app_name>

## ただ再起動するとやっぱりAdminPassword入力画面
- Herokuが再起動するときに、JEKINS_HOMEが残らない模様。

# 強引にやってみた
- aws上のjenkinsから設定を変えてJENKINS_HOMEをExport([「Jenkinsのバックアップとリストアについてメモ」](https://qiita.com/tq_jappy/items/3654059d09a4896ae598)を参考にした）
- アプリケーション直下の.jenkinsフォルダにコピー（このフォルダがJENKIN_HOMEとなるらしい）
- git push heroku master

## 強引にやってみた結果
- JenkinのWEBアプリとしての恩恵を受けられないしめんどくさい。

# 結論
- HerokuにJenkins乗せるのはあきらめた。（awsのほうが簡単）
- herokuの制限とか、jenkinsのリストアなどいろいろと勉強になった。
CoreDataから取得したデータの中身を見れない時

#現象
fetchRequestで取ってきたデータをprintした際、
「data: \<fault>」と出て、中身を表示してくれない

```
(entity:Sample; id: 0xd000000000040000 <x-coredata://8673B138-0632-4A92-8B66-CE0D606DA10E/Sample/p1> ; data: <fault>
```

#解決策
この一行を追加すれば、中身を確認できる。

```swift
fetchRequest.returnsObjectsAsFaults = false
```

#参照
[Core Data Programming Guide](https://developer.apple.com/library/content/documentat)
[What Is a Core Data Fault?](https://code.tutsplus.com/tutorials/what-is-a-core-data-fault--cms-25157)
select2 + bootstrap3 を webpacker3 で導入する手順

# 次のような表示になる Bootstrap3 対応の select2 を導入する手順です

<img width="411" alt="select2_sample.png" src="https://qiita-image-store.s3.amazonaws.com/0/2369/7173f123-ad1c-6781-13fd-c3becad5b093.png">

## 1. webpacker gem を Gemfile に追加して bundle install します

```shell-session
$ bundle add webpacker
```
エディタで Gemfile に追加してもよいです。 
rails new したときに --webpack オプションがあれば、すでに入っています。

## 2. webpacker 関連ファイルをごっそりインストールします

```shell-session
$ rails webpacker:install
```

webpacker 2 系で生成した謎の設定ファイルや項目が webpacker 3系でほとんどなくなっていたりするので、**更新**する場合はここで大量の差分がでるかもしれません。なのでよくわからなくなった場合は、いったん config 下の webpacker 関連を消して webpacker 3 系で綺麗に入れなおすのがおすすめです。

## 3. yarn で必要なライブラリをインストールします

```shell
$ yarn add jquery
$ yarn add select2
$ yarn add select2-bootstrap-theme
```
yarn add のあとにパッケージ名を並べて実行してもよいです

## 4. jQuery はどこからでも $ で参照できるようにしておく

```js:config/webpack/environment.js
const { environment } = require('@rails/webpacker')

const webpack = require('webpack')

environment.plugins.set(
  'Provide',
  new webpack.ProvidePlugin({
    $: "jquery",
    jQuery: "jquery",
    "window.jQuery": "jquery",
    "window.$": "jquery",
  })
)

module.exports = environment
```

### 参考

- Rails5.1 + Webpacker で Bootstrap4-beta を読み込む https://qiita.com/mokuo/items/6d792986e63598370b30
- Webpack Plugins https://github.com/rails/webpacker/blob/master/docs/webpack.md#plugins 

webpacker 2 のときの plugin の設定場所が、 webpacker 3 になって消えていたので困っていましたが、こうやればよかったんですね。

## 5. bootstrap と select2 を読み込んで設定します

```JavaScript:app/javascript/packs/application.js
// bootstrap 本体
require("bootstrap/dist/css/bootstrap")
require("bootstrap/dist/css/bootstrap-theme")

// select2 の CSS
require("select2/dist/css/select2")                       // select2 本体のCSSの読み込み
require("select2-bootstrap-theme/dist/select2-bootstrap") // select2 用の bootstrap テーマの読み込み

// select2 の JS
import Select2 from "select2"

// エラーメッセージの日本語化
require("select2/dist/js/i18n/ja")

// グローバルなオプションの指定
$.fn.select2.defaults.set("allowClear", true)    // 空にできるようにする
$.fn.select2.defaults.set("placeholder", "")     // allowClear だけだとエラーになるため
$.fn.select2.defaults.set("width", "100%")       // tdタグの中に入れたときにだんだん大きくなっていくのを防ぐ
$.fn.select2.defaults.set("theme", "bootstrap")  // テーマの指定

// 実行
document.addEventListener("DOMContentLoaded", () => {
  $(".js-searchable").select2()
})
```

css をどこで読み込めばいいのかずっとわからなくて、sprokects の方で読み込んだりしていましたが、なんと js の中でそのまま読み込めばよかったんですね(？)

## 6. webpacker で管理している方のを読み込む

```haml:app/views/layouts/application.html.slim
/ head タグの中に追加
/ application.js で読み込んだ css と js がここで分離、変換、結合されている
= javascript_pack_tag "application"
= stylesheet_pack_tag "application"
```
sprokects (app/assets の方で管理しているの) と共存できます

## 7. ビューはこんな感じで js-searchable クラスを指定します

```haml:(view)
= form_with do |form|
  = form.collection_select(:key, ['foo', 'bar', 'baz'].inject({}) { |a, e| a.merge(e => e) }, :last, :first, {include_blank: false}, {class: ['form-control', 'js-searchable']})
```

以上です。

試行錯誤しているところもあるので、おかしいところがあったら教えてください。
LaTeXで新しいtitleコマンドを作って遊んでみた

#概要
LaTeXの\titleコマンドが少し不便に感じたのでまとめて使いやすくしてみました。

#texファイル作成
今回のコードを先に挙げる。

```LaTeX:newtitle.tex
\documentclass{jsarticle}
\usepackage{xkeyval}
\usepackage{xparse}

\makeatletter
%ここから@を文字として使える
%名前付き引数のキーを作成
\define@key{Title}{title}{\def\Title@title{\title{\textbf{#1}}}}
\define@key{Title}{date}{\def\Title@date{\date{#1}}}
\define@key{Title}{author}{\def\Title@author{\author{#1}}}

%\Titleコマンドの作成
\NewDocumentCommand\Title{m o}{%
\setkeys{Title}{#1}%
\Title@title
\Title@date
\Title@author
\maketitle

%第二引数が省略されているかの判定後省略されていないなら中身を実行する
\IfValueT{#2}{%
\begin{abstract}
#2
\end{abstract}
}%

}%

\makeatother
%ここからは@を文字として使えない

\begin{document}
\Title{
title = {テスト,test},
date = \today,
author = 誰某\and 何其れ\thanks{何それ}
}[この文書では、\LaTeX 文書のタイトル部分の記述方法について扱います。という部分から抜き出して概要として扱ってみました。]

本文hogehoge

\end{document}
```
このように書いてtex形式で保存してください。ある程度最近のTeX環境ならエラーが発生しずにうまくいくはずです。
#解説
まずプレアンブルで読み込んでいる二つのパッケージのxkeyvalとxparseの簡単な説明です。実行できなかった場合は外部から入れてください。まずxkeyvalパッケージは簡単に言うとよく知られているプログラミング言語でいう名前付き引数を指定できるようにしてくれるパッケージです。詳しくは[TeXでkeyvalする](http://blog.5v-gnd.net/archives/1079)と[LaTeX で key-value リストを活用する：xkeyval パッケージ](https://qiita.com/wtsnjp/items/92720fac07d5dc366f10)を見てください。次にxparseパッケージはLaTeXの複雑で大変な引数指定をとても楽にしてくれるパッケージです。詳しくは[xparse パッケージでスゴイ LaTeX マクロを作ろう！](https://qiita.com/zr_tex8r/items/50168ad7087516c3e139)を見てください。

次に新しく定義された```\Title```コマンドについて説明します。このコマンドは第一引数として名前付き引数で```\title``` ```\date``` ```\author```それぞれの引数に対応する値を取得して、省略可能な第二引数でabstract環境の中身を取得します。そしてこれらを素直に順番に実行して表示するだけのコマンドです。
# 感想
遊びで適当に作ったので細かい調整などができておらずdocumentclassのオプションのtitlepageに対応していないなどの不備が多くあります。しかしなかなか興味深いコマンドができたと思います。今後自分で使用することがあるので改良していきたいところです。
GitHubで確認するOSSライセンス

GitHubでライセンスの要点が分かり易く表示されるようになってたので、
せっかくだから主要な(ライセンス選択時に太字になっている)
3つのライセンスの許可/禁止/条件をまとめてみる。

(2017/10/18追記)
ここで紹介しているのを含め他のライセンスの内容がまとめられているURLをコメントで教えて頂きました。
各種ライセンス内容についてもっと知りたい人はこちら↓
https://choosealicense.com/appendix/

##確認方法
新規リポジトリ作成時に「Add a license」の項目でライセンスを選択して作成。
作成されたリポジトリのLICENSEファイルをGitHub上で開くと下記の様に確認できる。
![license_sample.png](https://qiita-image-store.s3.amazonaws.com/0/206713/ed376615-fe87-a44b-41d9-c247fa3e6d9f.png)

##Permissions(許可されていること)
|  | Apache2.0 | GPL3 | MIT |
|:--|:--:|:--:|:--:|
| Commercial use | ○ | ○ | ○ |
| Modification | ○ | ○ | ○ |
| Distribution | ○ | ○ | ○ |
| Patent use | ○ | ○ | - |
| Private use | ○ | ○ | ○ |

####各項目の説明
| 項目 | 説明 |
|:--|:--|
| Commercial use | 商用利用許可 |
| Modification | 変更の許可 |
| Distribution | 配布の許可 |
| Patent use | 特許の利用の許可 |
| Private use | 配布をしない個人的な利用の許可 |

##Limitations(禁止事項)
GitHubの表記(×)と違うので分かりづらいかもしれないですが、
「○=禁止条項に該当」です。

|  | Apache2.0 | GPL3 | MIT |
|:--|:--:|:--:|:--:|
| Trademark use | ○ | - | - |
| Liability | ○ | ○ | ○ |
| Warranty | ○ | ○ | ○ |

####各項目の説明
| 項目 | 説明 |
|:--|:--|
| Trademark use | ロゴやトレードマークの使用禁止 |
| Liability | 作成者の法的責任無し |
| Warranty | 保証無し |

##Conditions(使用条件)
|  | Apache2.0 | GPL3 | MIT |
|:--|:--:|:--:|:--:|
| License and copyright notice | ○ | ○ | ○ |
| State changes | ○ | ○ | - |
| Disclose source | - | ○ | - |
| Same license | - | ○ | - |

####各項目の説明
| 項目 | 説明 |
|:--|:--|
| License and copyright notice | ライセンス及びコピーライトの表記 |
| State changes | 変更箇所の明記 |
| Disclose source | ソースの公開 |
| Same license | 同一のライセンスの使用 |
Docker for Macをインストールする方法(2017.10.17)

#はじめに
dockerをMacにインストールするだけの記事です。
スムーズにいけば作業は2分くらいで終わると思います。

#手順
公式サイトにアクセスして、Docker for Macをダウンロードします。
URL→https://docs.docker.com/docker-for-mac/install/

<img width="1439" alt="スクリーンショット 2017-10-17 22.40.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/207922/bad2d736-9792-d954-8141-695e6a3bcc82.png">

「**Get Docker for Mac(Stable)**」をクリック。
 
<img width="832" alt="スクリーンショット 2017-10-17 22.28.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/207922/185221cc-54a0-c01e-8d6b-94dcbabd91a3.png">

ドラック&ドロップして、起動。

<img width="682" alt="スクリーンショット 2017-10-17 22.29.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/207922/66bd820e-e02b-e1ce-8a09-63340bffc2f3.png">


すると、こんなダイアログが出てくるので、「**OK**」をクリック。

インストールが終わると、上のバーにこんなアイコンが出てきます。
<img width="30" alt="スクリーンショット 2017-10-17 23.18.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/207922/8215c8fe-3dbf-e98e-25d5-91ddb510b190.png">



ターミナルからも確認。

```
$ docker version
Client:
 Version:      17.09.0-ce
 API version:  1.32
 Go version:   go1.8.3
 Git commit:   ghjf4i7
 Built:        Tue Sep 26 22:40:09 2017
 OS/Arch:      darwin/amd64

Server:
 Version:      17.09.0-ce
 API version:  1.32 (minimum version 1.12)
 Go version:   go1.8.3
 Git commit:   ghjf4i7
 Built:        Tue Sep 26 22:45:38 2017
 OS/Arch:      linux/amd64
 Experimental: true
```

ちゃんとインストールできました。

以上です。
PowerShellでワンライナーズンドコキヨシ

いつか書こうと思ってたけど、今日唐突に思い立った。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">Javaの講義、試験が「自作関数を作り記述しなさい」って問題だったから<br>「ズン」「ドコ」のいずれかをランダムで出力し続けて「ズン」「ズン」「ズン」「ズン」「ドコ」の配列が出たら「キ・ヨ・シ！」って出力した後終了って関数作ったら満点で単位貰ってた</p>&mdash; てくも (@kumiromilk) <a href="https://twitter.com/kumiromilk/status/707437861881180160">2016年3月9日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

# ワンライナー

```.ps1
($stop = $str = '') | % {Do {Get-Random 'ズン', 'ドコ'} Until ($stop)} | % {($str += $_)} | ? {$_.EndsWith('ズンズンズンズンドコ')} | % {$_ + 'キ・ヨ・シ！'} | ? {($stop = $true)}
```


# 動作説明

読みやすいように改行しておく。
読むとわかるが、代入演算を括弧で括ると代入結果が返ってくることを悪用したコードになっている。

```.ps1
($stop = $str = '') |
    % {Do {Get-Random 'ズン', 'ドコ'} Until ($stop)} |
    % {($str += $_)} |
    ? {$_.EndsWith('ズンズンズンズンドコ')} |
    % {$_ + 'キ・ヨ・シ！'} |
    ? {($stop = $true)}
```

各行の動作は大体下記の通り。
書き方は突飛だが、やってることは至って普通。

1. 累積用の変数を空文字列に初期化
2. ループを回してランダムに「ズン」「ドコ」を生成
3. 生成した「ズン」「ドコ」を累積
4. 累積結果の末尾が「ズンズンズンズンドコ」になったら、
5. 累積結果に「キ・ヨ・シ！」を追加して出力
6. ループを止める
C言語 構造体アライメントの入り方

##環境

今回検証したPC
64bit Mac
　　　　　　　　　　　　　　　↓補足

| 型               |      サイズ(64bit) |  サイズ(32bit) |  
|:-----------------|------------------:|--------:| 
| char             |              1byte| 1byte     
| short            |              2byte| 2byte 
| int              |              4byte| 4byte       
| float            |              4byte| 4byte               
| long             |              8byte| 4byte             
| double           |              8byte| 8byte       

※OSによって上記とは異なる場合があります。      

##おさらい

構造体のデータサイズは単純にメンバの合計サイズにならないことがある。
例1)バイト境界が1byteのためパディングがなく
メンバの合計サイズ=構造体のサイズ

```ruby:example1
typedef struct
{
     char a;
     char b;
}EXAMPLE;
```

例2)バイト境界が4byteのためcharとintの間に3byte分のパディングがあるそのため
メンバの合計サイズ≠構造体のサイズ

```ruby:example2
typedef struct
{
     char a;
     int b;
}EXAMPLE;
```

#本題

上記を踏まえた上で構造体の中に構造体が入ってる場合、
バイト境界は構造体単位になるのかその構造体のメンバ単位になるのか気になったのでやってみた

```ruby:sample1.c
#include <stdio.h>

typedef struct
{
    char year[2];
    char month[2];
    char day[2];
}TIME;

typedef struct
{
    long a;
    TIME time;
    char b;
}KOZOTAI;

int main()
{
    KOZOTAI kou;
    printf("構造体のサイズは%luバイト\n", sizeof(kou));
    
    return 0;
}   
output:構造体のサイズは16バイト
```



```ruby:sample2.c
 #include <stdio.h>
 
 typedef struct
 {
     char year[2];
     char month[2];
     char day[2];
     char dmy;
 }TIME;
 
 typedef struct
 {
     TIME time;
     short a;
 }KOZOTAI;
 
 int main()
 {
     KOZOTAI kou;
     printf("構造体のサイズは%luバイト\n", sizeof(kou));
     
     return 0;
 }   
output:構造体のサイズは10バイト
```

```ruby:sample3.c
 #include <stdio.h>
 
 typedef struct
 {
     char year[2];
     char month[2];
     char day[2];
 }TIME;
 
 typedef struct
 {
     TIME time;
     int a;
 }KOZOTAI;
 
 int main()
 {
     KOZOTAI kou;
     printf("構造体のサイズは%luバイト\n", sizeof(kou));
     
     return 0;
 }   

output:構造体のサイズは12バイト
```


###まとめ
・構造体がメンバにいても基本的には通常の型だけの場合と大して変わらないようであった
・構造体のメンバの最大バイト長に合わせて全てのメンバにパディングが入るわけではなかった
PHP5.3.3環境を2017年に用意する方法

2017年10月にPHP5.3.3環境を作るのはとても大変でした。

PHP5.3はすでにEOLを迎えているため、セキュリティホールが修正されずに残りうる危険性があったりとプロダクションで使い続けるのは大変よろしくないですが、大人の都合でどうしても必要になってしまいました。

PHP5.3環境を構築するにあたって、試してダメだったことと、上手く行ったこととを残しておきたいと思います。

## 試してすんなりできなかったこと

* Homebrewの`brew install php53`
    * なぜか`/usr/local/bin/php`だけが作られず。
    * macOSをHigh Sierraにアップデートしたせいか？ Sierraのときはこれで行けた。
    * 同僚からCeller内のphp5.3.29をまるっともらったが、拡張が上手く入らず。
* Docker Hub公式のphp:5.3-cli
    * 5.3.29未満は提供されておらず、また、入れたい拡張がどうしてもビルドエラーになってしまう。
* PHP museumの5.3.3をビルド。
    * ubuntu:14.04でビルドを試みたがlibxmlのバージョンが非互換のためエラー。
    * Ubuntu 12.04に落として、php-buildでやったが、libjpegが非互換…。
* PPAでphp5.3を探す。
    * ぴったり5.3.3でなくてもいいやと思い始めて探したが欲しい拡張まで入れられるPPAを見つけられず。

ここまで1人日使った……😂

## うまくいった方法

うまくいった方法はCentOS 6.9で`yum install php`すること。なんとRedHatは未だにPHP5.3をサポートしている。神対応すぎる……😇 おかげでDockerfileも短くすみました。Ubuntu派だったので、CentOSは眼中になかった。好き嫌いはだめですね。

```dockerfile:Dockerfile
FROM centos:6.9

ENV PHP_VERSION 5.3.3

RUN yum install -y \
        php \
        php-mbstring \
        php-pgsql \
        php-mysql \
        php-gd && \
    yum clean all

CMD ["php", "-a"]
```

もう二度とビルドしたくないので今回ビルドしたDockerイメージを速攻でDocker Hubにあげました → [suin/php533 - Docker Hub](https://hub.docker.com/r/suin/php533/)。

拡張は次のものをバンドルしてます

```
bz2
calendar
Core
ctype
curl
date
ereg
exif
fileinfo
filter
ftp
gd
gettext
gmp
hash
iconv
json
libxml
mbstring
mysql
mysqli
openssl
pcntl
pcre
PDO
pdo_mysql
pdo_pgsql
pdo_sqlite
pgsql
Phar
readline
Reflection
session
shmop
SimpleXML
sockets
SPL
sqlite3
standard
tokenizer
xml
zip
zlib
```

## まとめ

* レガシー環境はRedHatがサポートしているかもしれないので、Ubuntu派の人もこういうときはCentOSをベースするといい。
LaravelでArtisanコマンド作った(オプションとか無いシンプルなやつ)

Laravelで定期実行するコマンドを作りたくて、Artisanコマンドを作りました。

やり方は超簡単なので、こちらのリファンレンスを見てもいいと思いますが、
リファレンスには色んなオプションとかも載っているので、ここでは特にオプションが必要無いような、シンプルなコマンド作成の手順を書いていきます。
https://readouble.com/laravel/5.4/ja/artisan.html#registering-commands

#作りたかったコマンド
`Console/Kernel.php`に定期実行するタスクを書いていたのですが、
それをコマンドにしちゃおうと思い、定期実行するタスク内の処理を全部クラスのメソッドに移して、
コマンドを実行するとそのメソッドが実行されるようにしました。

#コマンドクラスの作成
今回、マッチングサービスでマッチするユーザーの中から3人ずつレコメンドする、という処理をコマンドにしたかったので、`Recommend`という名前にしました。

```
php artisan make:command Recommend
```
これで、`app\Console`の下に`Commands`フォルダが作成され、その中に`Recommend.php`ファイルが作成されます。

#コマンド登録
コマンドクラスに処理を書く前に、コマンド登録を行います。
コマンド登録は`App\Console\Kernel`クラスの`$commands = []`に指定します。

```php
//app\Console\Kernel.php
class Kernel extends ConsoleKernel
{
    /**
     * The Artisan commands provided by your application.
     *
     * @var array
     */
    protected $commands = [
        Commands\Recommend::class
    ];
    //以下略
}
```

#コマンドクラスの記述

```php
use App\RecommendService;

class Recommend extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    //実行するコマンドの名前 php artisan recommend でコマンドが実行される
    protected $signature = 'recommend';

    /**
     * The console command description.
     *
     * @var string
     */
    // コマンドの説明(php artisan listで表示した際に表示される)
    protected $description = 'recommend friends to user';


    protected $recommend;
    /**
     * Create a new command instance.
     *
     * @return void
     */
    //コマンド実行した際に実行される処理を記述したクラスをコンストラクタインジェクションします
    public function __construct(RecommendService $recommend)
    {
        parent::__construct();//これはデフォルトで記述されている
        $this->recommend = $recommend;
    }

    /**
     * Execute the console command.
     *
     * @return mixed
     */
    //実際に実行する処理を記述
    public function handle()
    {
        $this->recommend->recommendFriendsToUser();
    }
}
```

#処理の記述
今回は`App\RecommendService`クラスをインジェクションしたので、
このクラスに処理を記述します。
(具体的な処理の内容は割愛)

後は、ターミナルで`php artisan recommend`と打つと、
記述した処理が実行されます。

僕はこのコマンドをタスクスケジュールに登録して、定期実行しようとしたのですが、
何故か一度に2~3回実行されてしまい出来ませんでした。
現在原因調査中。。

以上です。
Ruby で Yahoo!ローカルサーチAPI をコールするサンプルコード

## ソースコード

```ruby
require 'json'
require 'net/http'
require 'resolv-replace'
require 'uri'

class LocalSearch

  def initialize(appid)
    @appid = appid
  end

  private

  def get(url, headers)
    uri = URI.parse(url)
    http = Net::HTTP.new(uri.host, uri.port)
    http.use_ssl = true
    http.verify_mode = OpenSSL::SSL::VERIFY_NONE
    http.open_timeout = 3
    http.read_timeout = 3
    res = http.start do |http|
      http.get(uri.request_uri, headers)
    end
    # 左辺にクラス、右辺にインスタンス
    if Net::HTTPSuccess === res
      res.body
    else
      res.value # 例外を発生させる
    end
  end

  def json2pois(json)
    result = []
    data = JSON.parse(json)
    data['Feature'].each do |f|
      if f['Geometry']['Type'] == 'point'
        ll = f['Geometry']['Coordinates'].split(',')
        result << {'name' => f['Name'], 'lat' => ll[1], 'lon' => ll[0]}
      end
    end
    result
  end

  public

  def search(query)
    base_url = 'https://map.yahooapis.jp/search/local/V1/localSearch'
    params = {
      'query' => query,
      'output' => 'json',
      'results' => '3',
      'sort' => 'score'
    }
    url = base_url + '?' + URI.encode_www_form(params)
    headers = {'User-Agent' => "Yahoo AppID: #{@appid}"}
    json = get(url, headers)
    json2pois(json)
  end
end

begin
  appid = 'YOUR APPLICATION ID' # アプリケーションIDを指定
  query = '東京タワー'
  pois = LocalSearch.new(appid).search(query)
  pois.each do |p|
    puts "#{p['name']}\n #{p['lat']}, #{p['lon']}\n\n"
  end
rescue Exception => e
  puts "ERROR: #{e.message}"
end
```

## 実行結果

```
$ ruby localsearch.rb 
東京タワー大展望台　club333特設ステージ
 35.65870316, 139.74540779

東京タワー
 34.729707500000, 136.519455833333

マザー牧場ＣＡＦＥ東京タワー店
 35.658703055556, 139.745407777778
```

## 参考資料

- [YOLP\(地図\):Yahoo\!ローカルサーチAPI \- Yahoo\!デベロッパーネットワーク](https://developer.yahoo.co.jp/webapi/map/openlocalplatform/v1/localsearch.html)
- [Yahoo\!デベロッパーネットワーク:WebAPIの使い方\(GETリクエスト\) \- Yahoo\!デベロッパーネットワーク](https://developer.yahoo.co.jp/appendix/request/rest/get.html)
Actions on Googleで「You've reached the project limit for your account.」のエラーが出た時

Google Assistant向けのProjectの作り方を勉強していて、作っては壊し作っては壊していたら、上限に引っかかってしまったようで、表題のエラーが出てしまいました。

![スクリーンショット 2017-10-17 22.07.41.png](https://qiita-image-store.s3.amazonaws.com/0/173392/5d56e879-8dfb-1faf-f47e-05c5162dae3c.png)

You've reached the project limit for your account. You can import an existing project or request an increased limit.

一応、使わなくなったprojectは消したのですが、Googleクラウド上には残ってしまっているようです。

REQUEST AN INCREASEをクリックすると、なにやらものものしい申請画面が出てきて、会社名とか書かされるので、なにやら課金の匂いがしたので諦め、どうしたもんかと考えながらふと「Enter name or choose a projecet」のところにカーソルを置いたら、消したはずのプロジェクトがズラズラと出てきました。

結構前に消したのも残ってるやんけ。。

しかもいろんなGoogle Cloud PlatformのAPIの種類がごっちゃになっていました。
先週、まだAPI.AIがDialogflowに名前が変わる前に、作ってすぐ消したプロジェクトを選んで、再利用しました。
![スクリーンショット 2017-10-17 22.07.52.png](https://qiita-image-store.s3.amazonaws.com/0/173392/d18e289b-a51d-c6cd-21e1-cada0ea8f864.png)

中身はすっかり初期化されていたので、特に問題なく、全く別の設定をし直して、使えました。


![スクリーンショット 2017-10-17 22.14.36.png](https://qiita-image-store.s3.amazonaws.com/0/173392/9d483413-343b-9707-e657-52a4788a3041.png)

と思ったのですが、
Create ActionをしようとしてDialog Flowの管理画面に突入したところ、まんま昔の設定が残ってました・・

![スクリーンショット 2017-10-17 22.24.16.png](https://qiita-image-store.s3.amazonaws.com/0/173392/f7ee1fa8-5c53-bd73-7875-98d140b41b3e.png)

とほほ。。

**初期化されたのは、Actions on GoogleとdialogFlowとの紐付けだけ**、のようです。
エージェントが残ったままだと何ができないかというと、言語の変更ができないです。

![スクリーンショット 2017-10-17 22.28.46.png](https://qiita-image-store.s3.amazonaws.com/0/173392/59c0db03-c01d-8841-7ebf-4160a585f33c.png)

ま、どうせ日本語でやるからいいんですけどね。

以上！
2018年はdockerコマンドでkubernetesを管理できるようになる(DockerCon EU17)

https://docker.com/kubernetes


dockerコマンドとdocker-compose.yamlでk8sを管理できるようになる。
現行のswarm-modeとほぼ全く同じUX.

もちろんdocker for macでも使えるようになる。



今（2017/10/17）コペンハーゲンで開催中のdockerconで（予想通り）発表されたが、今のところオープンソースにはなっていない。
社員と個別に話してみたところでは、mobyの一部としてオープンソース化するつもりらしい。
Vagrant速攻インストール

# ゴール
VagrantでCentOSの仮想マシンを起動する。

# やりかた
## 1. Vagrantのダウンロード・インストール
https://www.vagrantup.com/downloads.html
-> Mac OS X 64bit

## 2. Virtualboxのダウンロード・インストール
https://www.virtualbox.org/wiki/Downloads
-> OS X hosts
 
## 3. CentOSの起動・ログイン
```bash
mkdir -p ~/vagrant/centos-6.7/ && cd $_
vagrant box add centos-6.7 https://github.com/CommanderK5/packer-centos-template/releases/download/0.6.7/vagrant-centos-6.7.box
vagrant init centos-6.7
vagrant up
vagrant ssh
```

# Link
[Vagrant 公式](https://www.vagrantup.com)
[Vagrant box URL一覧](http://www.vagrantbox.es)
curlでグローバルIPアドレスを確認する方法

## はじめに
curlでグローバルIPアドレスを確認する方法についてまとめました。（類似の記事は多数ありますが、自分用にまとめました。）

### ipconfig.me

* [ifconfig.me](http://ifconfig.me/)というネットワークの接続情報を表示してくれるウェブサービスがあります。そこに `curl` をするとグローバルIPを返してくれます。
* `https://ifconfig.co/` や `https://ipinfo.io/ip`などの類似サービスもあります。 (@lo48576 さんより共有）

```shell-session
$ curl http://ifconfig.me/
xxx.xxx.xxx.xxx
```

### Amazon EC2
EC2では、インスタンスに関するデータをメタデータで管理しています。各種情報を参照できますが、グローバルIPは`public-ipv4`で確認できます。詳しくは[こちら](http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ec2-instance-metadata.html)。

```shell-session
$ curl http://169.254.169.254/latest/meta-data/public-ipv4
xxx.xxx.xxx.xxx
Qiita の「最終更新日から1年以上が経過しています。」を強化する

## なぜ
**無意識に無視するようになってきたからです。**(ぼくは)

Qiita には古い記事を警告する機能があり、僕はありがたく思っています。
現非推奨や古い記法などを含む記事は早めに気づきたいです。

もうこの機能は実装されてからかなり時間が立ちます。
最初はすぐに警告を認知していて、古い記事は慎重に読んでいました。
しかし、それを繰り返すうちにこのメッセージを無視するようになってしまいました。

そして今日悲劇が再臨しました。古い内容だとあとから気づいて30分ほど手戻りが発生してしまいました。

そこで警告メッセージにちょっと手を加えてみました。

## 警告メッセージのパワーアップ

<img width="1103" alt="動的に表示したいコンテンツをスプレッドシートで管理する楽なモデル_-_Qiita_and_1__enzyme-tutorial__node__node_.png" src="https://qiita-image-store.s3.amazonaws.com/0/40717/3c081c4e-b941-e8a0-b433-377e7cb95cd5.png">

アラートを大きくしました。

## 経過によってペナルティを変える
ここが重要なポイントです。

大きくするだけでは同じ見た目なので、また慣れてしまうのが心配です。

なのでペナルティを動的にしました。
↓さらに古い記事です。


<img width="50%" alt="" src="https://qiita-image-store.s3.amazonaws.com/0/40717/99329847-8c08-f035-fe1d-4715fc324502.png" />

paddingTop paddingBottom を **経過日数** x 1px にしてます。

例えば↑の画像は執筆日`2017/10/17`にスクショした、`2014-12-16`の記事です。
671(+365)日が経過しているので、上下に671px広がっています。

これによって**記事が古いほどスクロールするストレスが発生します**。そして記事の古さへの認知をあがることを期待します。

## 実装内容
Tampermonkey を使っています。

```js
// ==UserScript==
// @name         Powerup　Qiita warning
// @namespace    http://tampermonkey.net/
// @version      0.1
// @description  try to take over the world!
// @author       You
// @match        https://qiita.com/*
// @grant        none
// ==/UserScript==

(function() {
    'use strict';
    const alertElem = document.querySelector('.alert-warning > .fa-warning').parentElement;
    const timeElem = document.querySelector('time');
    const articleTime = Date.parse(timeElem.getAttribute('datetime'));
    const overDay = (Date.now() - articleTime) / (1000 * 60 * 60 * 24);
    const penaltyDay = overDay - 365;
    if (penaltyDay <= 0) {
        return;
    }
    console.log(penaltyDay);
    alertElem.style.paddingTop = `${penaltyDay}px`;
    alertElem.style.paddingBottom = `${penaltyDay}px`;
})();
```

しばらく使ってみたいと思います。ストレスが過ぎたら色やアニメーションなど他の策も試してみます。

### その他考察
* そもそもこの機能は間違いに注意するきっかけでしかない。
* 無視するようになってしまったのは、警告が役に立ったと実感することが少ないから？
* 古い内容があったら執筆者に記事更新(本文で非推奨をいれるなど)してもらうなどが一番いいと思う。
* が、編集リクエストやコメントで教えるところまで気が回ってない。
* 検索からたどり着く場合、Google 検索結果の画面で知っておきたい。


**追記 2017-11-03**
徐々に、伸びる+赤くなる+点滅が早くなるものも作ってみました。
[Gist コード](https://gist.github.com/elzup/a62a38dd2292dfc967c01c2a7e9b16e9)
![war1.gif](https://qiita-image-store.s3.amazonaws.com/0/40717/5470643b-c0a7-8923-556e-02844c132691.gif)

![war2.gif](https://qiita-image-store.s3.amazonaws.com/0/40717/4a6f1d46-ae6a-deac-0fa5-04909eb40559.gif)
ABC075_C問題とD問題

問題はこちらから
http://abc075.contest.atcoder.jp

#C問題
橋かどうかを判定する。

自分が考えたのは以下の二つの方法
1.その辺を除いたときにグラフが連結かを判定する,
2.グラフを辿っていき,閉路であるなら含まれる頂点を記録し,含まれていない辺の数を求める

だが,コンテスト内にどちらも実装ができず…
終了後に開設を見てみるとUnionFind法なるものがあるらしいとわかったので
それを使い方法1を実装した。

UnionFindは頂点が負の値をとるので,連結なら頂点が一つ（=負の値が一つ）になることを
判定し,連結判定を行った。

(どなたか方法2での実装など教えていただけませんか？）

##コード
```py3:abc075c.py
class UnionFind():
    #負の値はルートで集合の個数
    #正の値は次の要素を返す
    def __init__(self,size):
        self.table = [-1 for _  in range(size)]
    #集合の代表を求める
    def find(self,x):
        while self.table[x] >= 0:
            #根に来た時,self.table[根のindex]は負の値なのでx = 根のindexで値が返される。
            x = self.table[x]
        return x

    #併合
    def union(self,x,y):
        s1 = self.find(x)#根のindex,table[s1]がグラフの高さ
        s2 = self.find(y)
        if s1 != s2:#根が異なる場合
            if self.table[s1] != self.table[s2]:#グラフの高さが異なる場合
                if self.table[s1] < self.table[s2]:
                    self.table[s2] = s1
                else:
                    self.table[s1] = s2
            else:
                #グラフの長さが同じ場合,どちらを根にしても変わらない
                #その際,グラフが1長くなることを考慮する
                self.table[s1] += -1
                self.table[s2] = s1
        return

N,M = list(map(int,input().split()))
A = []
B = []
for i in range(M):
    a,b = map(int,input().split())
    A.append(a-1)
    B.append(b-1)

res = 0

for i in range(M):
    G = UnionFind(N)
    for j in range(M):
        if i != j:
            G.union(A[j],B[j])
    minas = 0
    for k in G.table:
        if k < 0:
            minas += 1
    if minas == 1:
        res += 1


print(M-res)
```

#D問題
forを長方形の辺決めで4回回し,長方形内部の点を数え上げるのに1回回すので,
O(N^5)出の実装。制約が緩いので間に合う。

だが,長方形を作る際の頂点の選び方である。

高校数学の問題でよくみられる縦,横の辺の組み合わせで長方形の個数を求める問題の
考え方と同じように,x,y座標を別々に取得し,それぞれ二つずつ選び長方形を作ろうとした。

だがこのやり方だと,選んだx座標の区間(下図の黒戦で囲んだ部分)から出ている頂点(赤い点)のy座標を選んでしまうことがあるので,区間内の頂点（青い点）を選ぶようにしないといけない

![image.png](https://qiita-image-store.s3.amazonaws.com/0/143479/e00fcb4f-ff0f-566c-1dbf-5e38f3648ea6.png)

そこで,x座標をkeyとし,y座標をValueとするデータの保存を行い,処理を行った。

##コード
```py3:abc075d.py

from itertools import combinations as comb

def count(x1,y1,x2,y2):
    res = 0
    for x,y in point:
        if x1 <= x <= x2 and y1 <= y <= y2:
            res += 1
    return res 
    
N,K = map(int,input().split())

x = []
point = []
y_dict = {}

for i in range(N):
    a,b = map(int,input().split())
    x.append(a)
    point.append((a,b))
    y_dict[a] = b#yの値はxの値と紐づけしておく

x = sorted(x)
ans = 10**20

number = [i for i in range(N)]
C = list(comb(number,2))

for i,j in C:#組合せで調べる
    y_list = []

    for k in range(i,j+1):#xの指定区間内にある点のy座標を取得しy_listに入れる
        y_list.append(y_dict[x[k]])
        
    y_list = sorted(y_list)
        

    if 2 <= len(y_list):
        number2 = [i for i in range(len(y_list))]
        C_2 = list(comb(number2,2))

        for l,m in C_2:        
                x1 = x[i]
                y1 = y_list[l]
                x2 = x[j]
                y2 = y_list[m]
                n = count(x1,y1,x2,y2)#区間内の点の数
                   
                if K <= n :
                    ans = min(ans,(x2-x1)*(y2-y1)) 
               
print(ans) 

```
テスト用に外に一切配送しないSMTPサーバーを作る

centos7.2にて外に一切配送しないSMTPサーバーを作る方法.
ここでは vagrantで作った centos7.2 を想定。
(メールを仮に配送するためのユーザーを特定するため。vagrantでないホストでは適当なユーザーを作るとかする。)

## root宛て以外のメールをすべてvagrantユーザー宛てに変更する

alias.regexpを以下の内容で作成する。
root宛てはrootに、vagrant以外宛てをすべてvagrant宛てに変更する、って意味(だと思う)

```/etc/aliases.regexp 
/(?!^root$|^vagrant$)^.*$/ vagrant
```

main.cf の alias_mapsを設定。

```/etc/postfix/main.cf
alias_maps = hash:/etc/aliases, pcre:/etc/aliases.regexp
```

### 設定のテスト

記述ミスとかあると気づかないうちに外に出ちゃったりするのでテストする。

```
$ postmap -q foo pcre:/etc/aliases.regexp
vagrant
$ postmap -q root pcre:/etc/aliases.regexp
; 出力なし
$ postmap -q vagrant pcre:/etc/aliases.regexp
; 出力なし
```

alias設定にマッチするとその結果が出力される。マッチしない場合は出力なし(つまり-qで指定されたユーザーに配送される)。

## メールを外部に配信せず、すべてローカルに配信する。

/etc/postfix/transport_maps ファイルを以下の内容で作成する


```/etc/postfix/transport_maps.
/^.*@.*$/ local
```
(上のcodeタグにつけられたファイル名の最後のドットは不要。qiita仕様で拡張子のないファイル名はつけられない？)

main.cf  の transport_maps を設定する。

```/etc/postfix/main.cf
transport_maps = pcre:/etc/postfix/transport_maps
```

ここまでの設定で、ローカル以外宛てのメールは

* ローカル配送されて
* ユーザーがvagrantでないのでalias_mapsにより vagrantに配送される

はず。

## postfix を再起動

```
sudo systemctl restart postfix
```

## vagrantの外からSMTPで接続できるようにする

面倒なので main.cf内で以下のようにする

```/etc/postfix/main.cf
inet_interfaces = all
```

通常、この設定をしてしまうと「すべてのホストからのSMTPリクエストを受け付けてしまう」ので$mydomainとかを設定するのだけどこのホストがvagrantで動いていてそもそもvagrantの親の外からつながらないのでOK?

## 参考にした資料

Postfixで絶対にメールを外に出さずに特定のローカルユーザー宛に集約する開発用メールサーバのつくり方
http://blog.roundrop.jp/show/22

半分以上この文書のコピペです。多謝。

## その他

普段 windows使っているので radishとか使った方がテストは簡単なんだけど、再インストールしたときにradishのバイナリを無くして公式のを取りに行ったらlzhだったのでやめた。

あとテストとはいえPOSサーバーとか入れないとメールコマンドでちまちまやる事になり面倒。

いずれchefレシピにする。でもmain.cfとかchefでどうやるのがいいんだろう。
作成したRuby on RailsプロジェクトをHerokuを使ってデプロイしてみる

( ᐛ👐)こんにちは！
作成したRailsプロジェクトをデプロイしようと思い、Herokuを使ってデプロイしてみました。
Herokuを使ったデプロイは初めてなので、ここに書き記しておきたいと思います。(:D)rz

# Heroku Command Lineのインストール
[こちら](https://devcenter.heroku.com/articles/heroku-cli#macos-installer)からMacOS installerをクリックし、ダウンロードしてインストール。
これで、herokuコマンドを使えるようになります。
![スクリーンショット 2017-10-17 20.34.02.png](https://qiita-image-store.s3.amazonaws.com/0/151736/b1f62ae7-03c4-f978-3bd4-7737ef3685d9.png)

# Herokuにログイン
下記のコマンドを入力。
`$ heroku login`

HerokuのEmailとパスワードを聞かれるので、登録したものを入力してEnter。
![スクリーンショット_2017-10-17_20_34_44.png](https://qiita-image-store.s3.amazonaws.com/0/151736/2f3f974e-3dfb-68d1-0dc6-29f56326e536.png)

# Herokuにデプロイする
Railsプロジェクトのフォルダ内に移動して、下記のコマンドを入力。
`$ heroku create`
Herokuアプリが作成されます。
アプリ名はランダム生成になります。(画像のように後から変更可能)
![スクリーンショット 2017-10-17 20.31.53.png](https://qiita-image-store.s3.amazonaws.com/0/151736/5f6f4aae-159e-f3a5-eaf1-5b661120fde0.png)

下記のコマンドを入力して、Railsプロジェクトのmasterブランチをherokuにpushする。
`$ git push heroku master`

# デプロイ完了！ブラウザで開いてみる
下記コマンドを入力する。
`$ heroku open`

デフォルトブラウザでページが開きます。
お疲れ様でした！

# エラーなど困った点
## Herokuでアプリ名変更後にpushすると、リポジトリが見つからないと怒られる
`$ git push heroku master`
上記コマンドでpushした際に、下記のようなエラーが出る。

```
remote: !	No such app as アプリ名.
fatal: repository 'https://git.heroku.com/アプリ名.git/' not found
```

そんな時は、下記コマンドでリポジトリURLを変更すると解決。
`$ git remote set-url heroku https://git.heroku.com/アプリ名.git`
SRE本まとめ（22章 カスケード障害への対応）

自分の理解を深めるためにまとめてみました。[21章](https://qiita.com/bassbone/items/090173eb652704ad4d7c)の続きです。

## 22章 カスケード障害への対応

カスケード障害とは、時間の経過とともに連鎖していく障害のことである。

### カスケード障害の原因となるリソースと二次被害

- CPU
    - 処理中のリクエスト数の増加
    - キューの拡大
    - スレッドのスターベーション
    - CPUあるいはリクエストのスターベーション
    - RPCのタイムアウト
    - CPUキャッシュ率の低下
- メモリ
    - タスクの停止
    - GC＆CPU使用率の増大
    - キャッシュヒット率の低下
- スレッド
    - 直接的なエラーやヘルスチェックの失敗
- ファイルディスクリプタ
    - ネットワーク初期化によるヘルスチェックの失敗

### サーバーの過負荷の回避

- 負荷テストを行い、過負荷時の状態を見る。
- 最低限のレスポンスを返す。
- 過負荷時のリクエスト拒否の仕組みを組み込む。
    - キューの仕組みを取り込み、キューからはみ出た場合はアクセス拒否する。
    - ロードシェディング（過負荷状態に近づくにつれ、トラフィックを意図的にドロップさせる）
    - グレースフルデグラデーション（過負荷状態に近づくにつれ、レスポンスの質を落としていく）
- フロント側でリクエストを拒否させる。
- キャパシティプランニングを実施する。

### レイテンシとタイムアウト

### 起動直後の低パフォーマンスとコールドキャッシュ
起動直後はキャッシュが無い状態であるために、パフォーマンスが低下することが多い。そのためには何かしらの対策が必要である。

### カスケード障害を引き起こす条件
- プロセスの停止
- プロセスのアップデート
- ロールアウト
- 自然な利用の拡大
- 計画済みの変更、ドレイン、ターンダウン

### カスケード障害に備えるためのテスト
- テストによる障害の発生とその後の観察
- 一般的なクライアントのテスト
- 重要度の低いバックエンドのテスト

### カスケード障害に対応するためにすぐに行うべき手順
- リソースの追加
    - クラウドであれば即時追加、オンプレであれば調達が必要か。
- ヘルスチェックが障害を引き起こさないようにする
    - 二次障害を引き起こさないためにも。
- サーバの再起動
    - 原因を特定してから再起動しないと原因がわからなくなる恐れがある。
- トラフィックのドロップ
    - サーバが安定するレベルまでアクセスを制限し、徐々に制限を解除していく。
- デグレーデッドモードへの移行
    - 最低限のレスポンスを返すだけにする。例えばメンテナンス画面とか。
- バッチの負荷の排除
    - 思わぬバッチが原因となる場合があるので、普段からバッチの把握は必要。
- 問題のあるトラフィックの排除
    - 特定のアクセス元であればWEBサーバ等でブロックしてしまう。

（[22章](https://qiita.com/bassbone/items/3e6d8669bf259c2271ec)に続く）
Django チュートリアル（１）


このページは[Django公式サイト](http://docs.djangoproject.jp/en/latest/index.html)並びに、[DjangoGirlsチュートリアル](https://djangogirlsjapan.gitbooks.io/workshop_tutorialjp/content/)を参考にしてまとめています。
記事者環境：Win10　Python3.5.1 Django1.11.8

# 環境の作成
＊Pythonはインストール済みである前提です。

コマンドプロンプトを開く

![1.JPG](https://qiita-image-store.s3.amazonaws.com/0/100769/210e41e4-9a67-166a-d804-917aa6bda30d.jpeg)
Winキー　＋　Rキー　でファイル名を指定して実行を開く。
`cmd`と入力しOK　を押下。

2.  新規フォルダの作成
`mkdir フォルダ名`　と入力

3. cd フォルダ名　で作成したフォルダに入る

4. 環境を作る 
`python -m venv 環境名`で環境を作成

5. 環境に入る
`環境名\Scripts\Activate` とするとコマンドプロンプトの表示が
C:\Users\・・・　から(環境名) C:\Users\・・・ とかわります。

6. Djangoのインストール
pip install django でインストール
**2017年10月17日現在、ヴァージョンを指定しないと、
Django==1.11.6
pytz==2017.2
がインストールされます。
（インストールをされた内容を確認するには、　pip freeze とうってエンターキー）

[チュートリアル(2)](https://qiita.com/sandream/items/9f8cfa85cccaf43d8a68)へすすみます。
【iOS11】UITableViewセルのスワイプで削除を無効にする方法【Swift】

iOS11ではUITableViewのセルをスワイプしただけで削除されてしまいます。

![20171017200721.gif](https://qiita-image-store.s3.amazonaws.com/0/135478/54c76907-5fdf-833e-5f8d-e8a6dd165651.gif)

## 元々のコード

```.swift
func tableView(_ tableView: UITableView, editActionsForRowAt indexPath: IndexPath) -> [UITableViewRowAction]? {

    let deleteButton: UITableViewRowAction = UITableViewRowAction(style: .normal, title: "削除") { (action, index) -> Void in
        self.array.remove(at: indexPath.row)
        tableView.deleteRows(at: [indexPath], with: .fade)
    }
    deleteButton.backgroundColor = UIColor.red

    return [deleteButton]
}
```




<br><br>
誤操作を防ぐため、従来のようにスワイプ後一旦停止し、削除ボタンを押した際にセルの削除を行いたい場合は下記のコードを追記することで解決できます。
## 追記するコード

```.swift
@available(iOS 11.0, *)
func tableView(_ tableView: UITableView, trailingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration? {
        let delete = UIContextualAction(style: .destructive, title: "削除") { (action, sourceView, completionHandler) in
            completionHandler(true)
            self.array.remove(at: indexPath.row)
            tableView.deleteRows(at: [indexPath], with: .fade)
        }
        let swipeAction = UISwipeActionsConfiguration(actions: [delete])
        swipeAction.performsFirstActionWithFullSwipe = false
        return swipeAction
}
```


## 参考
・[How do I disable the full swipe on a tableview cell in iOS11](https://stackoverflow.com/questions/46414707/how-do-i-disable-the-full-swipe-on-a-tableview-cell-in-ios11)
「エンジニアの転職メモ」の内容を実践した結果

# 概要
[エンジニアの転職メモ](https://qiita.com/yama-t/items/0dc67cda41a2eb710eeb)の実践結果の共有です。

# 履歴書
- 一切印刷しなかった。
- 印刷用にデータを持っていれば良いんじゃないか、程度のもの。

# 自分に合う業種のスカウトが来た。
- 経歴、スキルを実際に動かせるサンプルコードを含めて公開したことで、現状のスキルを伝えることができた。
- その結果、「これだけのスキルがあるなら」と、エンジニアの目線で選んでもらえた結果、自分のスキルと合う業種のスカウトが届いた。
- 「このスキルならうちには合わないな」と、感じた人もおそらくいるはずで、そういう所からのスカウトを防ぐ結果にもなったと推測。
- スキルを事細かに書いているので、会う前から自分のスキルを伝えることで、会ってからのミスマッチが減った。
- 結果、「興味がある」「気になる」レベルのスカウトは減り、「採用したい」「採用しない」に二極化。「採用したい」人たちからスカウトが来ることで、面談後の採用確度が高まった。

# もし働くことになった場合の、大まかな金額を提示してもらえた
- 最低でもこれぐらいですね、という金額を伝えてもらえた。
- スキルを見える形で提示していたので、スキルの認識と提示額のズレが少ないと感じた。
- なんにしても、「今だいぶ安く働かれてますね」と複数社から言われた。
 - スキルを真っ当に評価してもらえた結果、このコメントが出たと思っている。
- 自分のスキルで稼げる金額の相場を測ることができた。それにより、現状の給料との差が明確になった。

# 自信がついた
- 何かあっても、ここに自分を評価してくれる人がいるという自信を持つことができた。
- 転職する際の心理的負担が減った。
- 自分が行動すれば、いつでもそういった会社で働くことが出来るんだ、と思えるようになった。

# 現在
- 当時から収入も上がり、早期転職できました。
- 最悪、この会社で何かあっても大丈夫、という思いでいられるので、気が楽です。
DJIドローンを自作アプリで制御 〜 0.開発の準備


# はじめに

DJIドローンを自作アプリで制御するために、アプリ開発の準備についてまとめてみました。

## DJIドローン向けに開発できるアプリの種類

DJI社から提供されている開発ツール（SDK）には以下の3種類があります。

|  | Mobile SDK | OnBoard SDK| Guidance SDK |
|:-:|:-:|:-:|:-:|
| 開発できるもの | iOS,Androidアプリ | ドローン組込みソフトウェア | 自動操縦、データ収集ソフトウェア |
| SDKの目的 |機体、撮影の制御 | ドローン内のハードウェア制御 | センサー制御 |
| 開発言語 | Swift,Kotlinなど | C,C++など | C,C++など |

※この記事では、「Mobile SDK」を対象としています。

## DJIドローンの種類


2017年10月時点でリリースされている一般向けのDJIドローンには、大きく以下の4種類があります。機種ごとのスペックに差があるため、当然自作アプリからはドローン本体が持っている機能しか利用できません。

|SPARK   |Mavic シリーズ  |Phantom シリーズ  |INSPIRE シリーズ |
|:-:|:-:|:-:|:-:|
|!["SPARK"](https://qiita-image-store.s3.amazonaws.com/0/59249/49a3c79b-efb1-06a2-fb72-f571e10b3428.png)   | ![](https://qiita-image-store.s3.amazonaws.com/0/59249/3e4e3710-f688-d5e8-e559-7c935a99d765.png)  | ![](https://qiita-image-store.s3.amazonaws.com/0/59249/156ff570-d2e6-e09d-169e-02fef64f07be.png)  |![image.png](https://qiita-image-store.s3.amazonaws.com/0/59249/3b691045-e03f-951a-ecbc-a14e9e3fd5ac.png)|
|   |   |   |   |

それぞれの機種にも機能別にいくつかのモデルがありますが、基本的に開発用ライブラリはすべて対応させる方針のようです。

【公式：mobile SDKに対応している機種】
https://developer.dji.com/products/#!/mobile


## DJIドローンアプリ開発に必要なもの

DJIドローンを制御するための MobileSDKを利用するアプリは、基本的にiOS,Androidいずれかのスマートフォンアプリとして開発する必要があります。
そのため、作りたいアプリのOSに合わせて必要となる環境が異なります。

|   | iOS | Android |
|:-:|:-:|:-:|
| 開発ツール  | Xcode  | Android Studio  |
| 開発言語  | Swift,Objective-C  | Kotlin,Java  |
| 配布サイト  | Apple Store  | Google Play  |
| 申請費用（個人）  | $99（1年毎）  | $25（初回のみ）  |
|   |   |   |

どちらのOS用のSDKもほぼ同じペースで更新されているようですが、若干Android用のSDKの方がリリースが早いように感じられます。



## DJI Developer登録

DJIドローン向けのアプリを開発するには、DJI社のアプリ開発者としてDeveloper登録をする必要があります。

【公式：DJI Developer】
https://developer.dji.com/

| 公式サイト | 登録ページ |
|:-:|:-:|:-:|
|![Kobito.qZGCKb.png](https://qiita-image-store.s3.amazonaws.com/0/59249/cb325de8-37e6-60e2-6820-d6daed09b8eb.png "Kobito.qZGCKb.png")|<img src="https://qiita-image-store.s3.amazonaws.com/0/59249/c4962767-eb85-7549-6fe9-fe25864f4feb.png" width="600px">|
|||

ユーザ登録したメールアドレスに届いた認証メールから、登録を完了させます。

## 自作アプリの登録

DJI Developer登録を終え、新しくアプリを開発するためには、DJI DeveloperのUser CenterにAppsを登録する必要があります。

### Appsの登録

| | | |
|:--------|:-----:|:----|
| 1.UserCenterにログイン | https://developer.dji.com/login/ |  |
| 2.createAppをクリック | ![Kobito.rj0oCz.png](https://qiita-image-store.s3.amazonaws.com/0/59249/d1f55785-25d8-176c-8f46-e5c754350ee2.png "Kobito.rj0oCz.png")| |
| 2.アプリの情報を登録 | <img src="https://qiita-image-store.s3.amazonaws.com/0/59249/499daf51-5385-73d3-b5a5-3992aafbcfd3.png" width="80%"> | ここで登録したアプリの識別子を、開発時にアプリ内に設定する必要があります。 |
| 3.メールの認証| | CREATEをクリックしても、即座にアプリが登録されるわけではなく、ユーザ登録したメールアドレス宛に認証メールが届きます。認証を完了させることで、UserCenter内にアプリが表示されます。 |
| 4.アプリ登録を確認 | <img src="https://qiita-image-store.s3.amazonaws.com/0/59249/5b1291df-7fe7-6f47-fcc1-bc764f952023.png" width="400px"> |  |
| 5.登録情報の確認 | <img src="https://qiita-image-store.s3.amazonaws.com/0/59249/f74c8387-60c5-a75c-8d2e-a842127025b5.png" width="400px"> | 「アプリ識別子」「App Key」をアプリ開発時に使用します。 |



※以降更新予定

# iOSサンプルコードの実行
## サンプルコードと実行

# Androidサンプルコードの実行
## サンプルコードと実行
AndroidのUSBホストのインテントフィルターはベンダーIDやプロダクトIDでもできる

kshoji: [Android Advent Calendar] 自作のUSBデバイスを、Androidで動かす http://blog.kshoji.jp/2012/12/android-usb-host.html?spref=tw

ここのを試す時に、ベンダークラスだとどうすりゃいいんだろう、というか、
ベンダーIDとかで識別できたらなぁ、と思った。

https://developer.android.com/guide/topics/connectivity/usb/host.html

うん、普通にできる

```xml:device_filter.xml
<?xml version="1.0" encoding="utf-8"?>

<resources>
    <usb-device vendor-id="1240" product-id="83" />
</resources>
```