OmniAICreator/Qiita-1.07M huggingface dataset:
要約「多くの人はまだHTTP/3を無理して学ぶ必要はない」に学びたい。まとめ学習。


@shibukawa さん

[多くの人はまだHTTP/3を無理して学ぶ必要はない - Qiita](https://qiita.com/shibukawa/items/ac823b7e1c435eb1cadf)

タイトルで煽らない誠実感のある記事。

# HTTP/1.1からHTTP/2はほとんどの部分が同じです。

だったらしい。

>たとえばクッキーの意味だとか、フォームなどの情報をどのようにシリアライズしてサーバーに送信しようとか、認証をどのように実現しようといったウェブサービスの実装者が気にするべきセマンティクス部分は変わりませんでした

# 学ぶ必要がない理由は「アプリケーションで出来ることが増えない」から。

>アプリケーションができることが増えて実現できることが増えたり、アプリケーション側が考慮することでさらなるパフォーマンスアップにつながるようなことがありました。
>そのため、HTTP/2を学ぶことはその上のアプリケーションを開発する人にも意義も大義もありました。

>ですが、HTTP/3には今の所そういうところはないですよね（という理解です）。

# 学ぶことがない理由は「インフラがまだ整っていない」から。

>実際のところ、HTTP/2の普及もそうだったと思うのですが、CDNなり、クラウドサービスの外側のロードバランサーなりの外側がサポートされたら、それで初めて使えるようになる、それで利益を得られた、という人が多かったんじゃないかと思います。

# HTTP/2さえ有効化されていないケースがあるらしい

>あと、現実問題として、HTTP/2もCDNやクラウドのロードバランサーの内側ではほとんど活用されてないんじゃないでしょうか？僕の知る限りだと、HTTP/2はHTTPSは必須ではないものの、多くの実装がHTTPSでないとHTTP/2を有効化していません。

# 学ぶなら「Real World HTTP」一択でしょ！



@shibukawa さん = 渋川よしきさんが書いた本があるらしい。


![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/ea22ea92-60e9-12c1-1bf8-45cd9d086c20.png)

# クリスマスイブまでにお届け

>クリスマスイブまでにお届け
>クリスマスイブまでにお届け
>クリスマスイブまでにお届け








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
SpaceAppsチャレンジ翻訳よもやま話 

この記事は[SpaceApps Japanアドベントカレンダー](https://adventar.org/calendars/3374?fbclid=IwAR2l_1l687g7FndW47eW2ur06nPePWRoBrdJprmO9E9O4dONrFNw7sS5EA0)の18日用の記事です。

私は2016年から[SpaceApps Challenge](https://spaceappschallenge.org)のチャレンジ翻訳に携わってきました。その作業の忘備録もかねて、少し裏話的ですが、Google翻訳導入のことなどを書き留めます。

##筆者のバックグラウンド
筆者は学部と修士をアメリカの大学で過ごし、今は京都大学の博士後期課程にいる太陽・太陽圏物理学者（の卵）です。英語は専門家向けから一般向け、コーヒーブレイクの会話まで一通りこなせます。（愚痴：Technical writingの授業が日本の大学にはないらしいことには驚きました。この授業を必修にするだけでも学生のレベル上がるだろうに）

##やったこと
NASAの全世界同時ハッカソンSpaceApps Challengeは当然のことながら全て英語で運営されています。しかし参加者のハードルを出来るだけ下げるため、日本の会場運営者は、[チャレンジ（お題）](https://2018.spaceappschallenge.org/challenges/)の非公式の和訳を用意してきました。

2016年に運営者のグループ（SpaceApps Japan）に参加した時には前年のノウハウがあった気がします。HackPadにみんなで少しずつ翻訳していくというものでした。

様相が変わったのが2017年の翻訳の時です。ほとんどの翻訳を私がHackPadに入れていたのですが、その時Google翻訳の精度がかなり上がっていることに気づきました。そこで今年からGoogle翻訳をシステマティックに翻訳作業に組み込みました。今年の手順は、

1. チャレンジの英文をGoogle Documentにコピー（HackPadなくなったので）
2. 各チャレンジへの目次や作業工程表をドキュメント冒頭に準備
3. 段落毎に原文に続けてGoogle翻訳の挿入を運営者グループに依頼（１日ほどで終わってビビった）
4. 私がGoogle翻訳の手直し
5. Google Documentにて公開

を想定してました。3までは予想通りに進みましたが、4がやはり時間がかかりました。1カテゴリー（3~4チャレンジ）をチェックするのに2時間ほどかかり、1日に1カテゴリーが限界でした。それでも前回は1日に1チャレンジ翻訳したら疲れ切ったので、かなりの省力化となりました。

また、[SpaceApps Japanのブログ](http://blog.spaceapps.jp/)をもっと活用してという話もあり、チャレンジの翻訳の公開先をGoogle DocumentからHatenaに変更し、1カテゴリーごとに公開としました。そのためで、2システムの差異を吸収する作業に1時間ぐらい取られることに。

##やられたこと
チャレンジの翻訳自体はなんとか本番には間に合ったのですが、プレイベントには間に合わなかったところもあり、異なる訳（要約）が出ました。その内容はともかく、異なる邦題が乱立する結果となりました。

##Google翻訳使えるね^^
Google翻訳はそれなりの精度をもってはいますが、非常にフランクな表現や専門用語、前後の文からの意味の伝達は苦手と感じました。

例えば[Polar Opposite!](https://2018.spaceappschallenge.org/challenges/icy-glare/recycle-polar-opposites/details)の一部では、原文が
>For example, are there differences in ice coverage in the same location between one day of the year (e.g. April 29, 2017) and the same day of other years (April 29, 2016; April 29, 2015; and so on…)?

のところを、Google翻訳では
>たとえば、1年のうちの1日（たとえば、2019年4月29日）と他の年の同じ日（2016年4月29日、2015年4月29日など）の間で、同じ地域の氷のカバレッジに違いがありますか？

となりましたが、[SpaceApps Japan訳](http://blog.spaceapps.jp/entry/2018/10/17/112052)では
>たとえば、1年のうちの1日（たとえば、2019年4月29日）と他の年の同じ日（2016年4月29日、2015年4月29日など）の間で、同じ地域の氷が覆う領域に違いがありますか？

と、不要なカタカナ語（カバレッジ）の排除を行いました。今、見返すともっと手直ししたい部分ありますが、読みやすさの向上はすれど意味上での齟齬は発生しないでしょうし、こんなところだと思います。

あともう一つ。こちらは翻訳の妙という例を。
[Looking GLOBE-ally](https://2018.spaceappschallenge.org/challenges/what-world-needs-now/globe-observer/details)というチャレンジがありました。globally（グローバルに）とglobe（地球）+ally（同盟・味方）とを掛け合わせたものですが、Google翻訳では
>Glob-allyを見る

と情緒も意図もなくなった訳となってしまいます。そこで[SpaceApps Japan訳](http://blog.spaceapps.jp/entry/2018/10/16/000234)では、
>地球のミカタ

と、見方と味方を掛け合わせた、本来のニュアンスを維持した訳にしました。この訳は今年の翻訳作業で最もうまくいったと自画自賛しています。

##来年にむけて
2019年のSpaceApps Challengeは10月18-20日（金-日）だそうです（[公式アナウンス](https://2019.spaceappschallenge.org/)）。おそらく多くの会場は19-20日の土日となるかと思います。

来年の翻訳作業では今年の経験を踏まえ以下のような点に気を付けて作業手順を考えていきたいと思います。

1. Google翻訳は下書き程度には使える
2. 一言二言で説明できる単純作業は大人数で平行して処理
3. できればGoogle翻訳の簡単な手直しも並列化したい
4. 各チャレンジの題名は最初に固めておく
5. 各チャレンジの題名と簡単な要約は仮でもいいからプレイベント前に欲しい

邦題と要約まではチャレンジ出てから３日ぐらいで出せたらなぁ。。。
【Swift】入力した自然数の各桁を一桁になるまで足す

アルゴリズムの問題を説いてみましょう。

```
入力した自然数の各桁を足すプログラムを作ってください。
足した結果2桁になる場合は、その数字をまた各桁足し、1桁になるまで続けます。

例
入力値:2018

計算: 2+0+1+8=11
11は2桁なのでもう一度繰り返す。
1+1=2

出力値:2
```

答えの例

```swift
// union 各行を足していく処理
func addUnitNumber(number: Int) -> Int {
    let strNumber = String(number)
    let strNumbers = strNumber.compactMap {String($0)}
    let numbers = strNumbers.compactMap{Int($0)}
    var result = numbers.reduce(0) {$0 + $1}
    
    if result > 9 {
        result = addUnitNumber(number: result)
    }
    return result
}

addUnitNumber(number: 2018)// ->2
addUnitNumber(number: 1980)// ->9

```
LaravelのRequestクラスを拡張する（Not FormRequest）

* 初版：2018.12.18
* laravel-5.7, php-7.2


## Requestクラスをextendsしない方が良さそう。

`class CustomRequest extends \Illuminate\Http\Request {}` して、`public/index.php`のリクエストを書き換えれば上書き出来るけど、テストの時も別途対応する必要があったり、他から元のリクエストクラスが使われてないか不安。

## Request::macro()を使う。

```php:/app/Providers/AppServiceProvider.php

class AppServiceProvider extends ServiceProvider
{
    public function boot()
    {
        $this->addMacroRequestGetClientIp();
    }

    private function addMacroRequestGetClientIp()
    {
        Request::macro('getClientIp', function () {
            foreach ([
                'HTTP_CLIENT_IP',
                'HTTP_X_FORWARDED_FOR',
                'REMOTE_ADDR'
            ] as $key) {
                // マクロ内では$thisの参照が出来る
                $ip = $this->server($key);
                if (filter_var($ip, FILTER_VALIDATE_IP)) {
                    return $ip;
                }
            }
            return '';
        });
    }
}
```

使うときはrequestインスタンスからメソッド名として呼び出せばいい

```php:using_helper
class SomeController extends Controller {
    public function index() {
        request()->getClientIp();
    }
}
```

```php:using_http_request
class SomeController extends Controller {
    public function index(\Illuminate\Http\Request $req) {
       $req->getClientIp();
    }
}
```
Railsのセキュリティに関するチートシート


シーエー・アドバンス Advent Calendar 2018 24日目担当の @togana です。

Rails で開発時に気をつけるべきことをまとめました。
breakman を動かすだけでも問題点を見つけるとができるので、チートシート読み飛ばして試してみてほしい。

# 対象

- Railsで開発したことがある人
- バージョンは4以降

# チートシート

- クロスサイトスクリプティング (XSS)
  - coffee scriptなどで起きるやつは Rails とは異なるのでこの記事では対象外とする
  - 対象はerbなどのテンプレート側
  - 問題になりやすい下記のメソッド名で grep して問題ないか目視する(そもそも使ってる場合は怪しい)
     - `html_safe`
     - `raw`
- SQL インジェクション
  - ほとんどの場合デフォルトで対策されている
     - 「’」「“」NULL、改行に関しては自動でエスケープされる
  - LIKE検索のときはすこし気をつける
     - 「%」および「\_」及び「\」をエスケープしたい場合は `sanitize_sql_like` メソッドを使用する
  - クエリを文字列で送っている場合かつ入力値をそのまま入れている場合は問題が起きやすいので注意
      - どうしても手動でエスケープせざるを得ない場合は `sanitize_sql` メソッドを使用することを検討する
  - こういうものもあるらしい: [Rails 5.2で"Dangerous query method ..."の警告が出たからといって、機械的にArel.sqlを適用してはいけません。](https://qiita.com/jnchito/items/5f2f00c93c0ba68e4d31)
  - 後述する `breakman` で大抵検知できる
- OS コマンドインジェクション
  - 問題になる下記のメソッド名で grep して問題ないか目視する
    - `system`
    - `eval`
    - `
    - `Kernel.exec`
  -  後述する `breakman` で大抵検知できる
  - `open` メソッドを利用したケースもあるので気をつける

```ruby
result = open("| ls -lh")
while !result.eof
  print result.gets
end
result.close
```
- セッション管理
  - デフォルトの設定だとcookieセッションを利用するのでサーバ側で保持していないのでセッションをサーバ側で消すことが不可能
     - redis を使う、もしくは `active_record_store` を使うようにする
  - apiモードはデフォルトでは Cookie が使えないようになってるので jwt とかその他認証方法も検討する(要件に合わせて検討しましょう)
- クロスサイトリクエストフォージェリ (CSRF)
  - 基本的にはデフォで対応されている
  - apiモードはデフォルトで対策が除外されているので注意
- クロスオリジンリソースシェアリング (CORS)
  - `rack-cors` を使ってホワイトリスト指定する
- セキュリティ関連ヘッダー
  - デフォルトで下記に対応している
    - 'X-Frame-Options' => 'SAMEORIGIN'
    - 'X-Content-Type-Options' => 'nosniff'
    - 'X-XSS-Protection' => '1;'
  - コンフィグで下記設定するとHSTSの設定もできる
    - `config.force_ssl = true`
  - nginxなどで設定したら2重に設定されないかとか確認する必要あるかもしれない(要検証)
- アクセス制御(権限で保護されていない直接的な参照など)
  - `cancancan` や `pundit` などを使う(権限による設定ができる)
- 機密のファイル
  - Rails5から暗号化する仕組みとか入ったから使うのもあり
    - 5.1と5.2で仕様違うから注意！
      - https://github.com/rails/rails/pull/30067
    - masterパスワード漏れたら全滅なので慎重に管理しましょう
  - 間違っても機密情報をプッシュしないために ignore 設定はちゃんとしましょう
     - https://www.gitignore.io/api/rails
         - ↑だとlogディレクトリとtmpディレクトリがプッシュされないので.keepファイルは許可するように書き換えると便利(たまにgit pull して動かなくて焦る)
- ビジネスロジックのバグ
  - スピリチュアルプログラミング(反面教師にしましょう)
     - http://docs.komagata.org/4055
  - コードレビューをしっかりする
  - 単体テストをちゃんと書く

# breakmanの紹介

Dockerで実行する例
プロジェクトのカレントディレクトリで下記コマンドを実行する
(winでもdocker-for-windowsいれてパワーシェルで試したら動いたので気軽に試せてよい)

```bash
$ docker run -v "$(pwd):/code" presidentbeef/brakeman -o brakeman_results.html
```

`brakeman_results.html` に結果が出てくる
このコードが悪いってとこまで教えてくれる。便利！
(キャプチャは意図的に脆弱性を組み込んだサンプルアプリに対して実行しています)

![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/82745/b459ffb6-6a6f-5cc3-0b34-1187ae0d546d.png)

# まとめ

Breakman 使うとうっかり作り込んでしまった脆弱性に気づけるので気軽に CI に入れるとよさそう。
意識することですこしは安全な世界になると思うのでチートシート眺めて参考にしていただければ！

# 紹介した gem とか
- https://github.com/rails/activerecord-session_store
- https://github.com/cyu/rack-cors
- https://github.com/CanCanCommunity/cancancan
- https://github.com/varvet/pundit
- https://github.com/presidentbeef/brakeman

# もっと意識高くセキュアにコード書きたい人への参考リンク

- https://railsguides.jp/security.html
- https://www.owasp.org/index.php/Ruby_on_Rails_Cheatsheet
Terraform Providerの中にある data_source_xxx というものが何なのかやっと分かったという話

## Data Source is 何？

前回、 [Terraformのカスタムプロバイダを書き始めました](https://qiita.com/keiichi-hikita/items/bb9b799c1e692f224d07)　という話を書きました。

で、

`Import/Data ここは正直まだ書いたことがないのでよく分かりません。実装が進んできたらまたここの部分を別記事で書こうかなと思います。` 

とか書いてたのですが、 `Data` という物が何なのかやっと理解しました。
というか、本家のマニュアル読めよという話でしか無いんですね・・・。

[Data Source Configuration](https://www.terraform.io/docs/configuration/data-sources.html)

この機能を使用者目線で書くと、 `POST/PUT時等に参照したいパラメータをAPIの実行結果から引きたい時に使う機能` と言えば当たらずとも遠からずかと思います。

## 例えばこんなとき

例えば、こういうケースを考えてみます。

- OpenStack Custom Providerを使って、いろいろな環境に同一の `.tf` ファイルからデプロイをしたい
- OpenStackの環境ごとに、flavorのIDが違う
- それを外部にパラメータとして切り出す・・・みたいなことはしたくない。あくまで再使用性100%！としたい

**OpenStack ProviderのInstanceなら、 `flavor_nameがあるじゃん` ・・・というのはちょっと知らないことにしてください**

こんな時に使うのが、Data Source！ということらしいです。

## 実際の例

ということで、実際の使いっぷりを見てみましょう。

```
provider "openstack" {
  auth_url          = "*****"
  user_name         = "*****"
  tenant_id         = "*****"
  tenant_name       = "*****"
  password          = "*****"
  user_domain_id    = "*****"
  project_domain_id = "*****"
}

data "openstack_compute_flavor_v2" "flavor_m1tiny" {
  name = "m1.tiny"
}

resource "openstack_compute_instance_v2" "my_instance_1" {
  name      = "instance_1"
  image_id  = "df1944a7-ca45-4709-9ec6-e31664133650"
  flavor_id = "${data.openstack_compute_flavor_v2.flavor_m1tiny.id}"

  network = {
    uuid = "8462c0c9-8800-4e4a-b3ec-04a2fb36a24b"
  }
}
```

ここで、 `data` から始まる部分がありますよね。これがそうです。

正しくは、`data "openstack_compute_flavor_v2"`から始まってます。

一見、これresourceファイルを見に行ってるのかなと思ってましたが、実は違います。

こういう場合、こっちを見に行きます。（正確にはDataSourceMapというものでその定義をしています）

[data_source_openstack_compute_flavor_v2.go](https://github.com/terraform-providers/terraform-provider-openstack/blob/master/openstack/data_source_openstack_compute_flavor_v2.go)

言ってみれば、 `Find専用リソース` とでも言えますでしょうか。

これを使って、↑の例だとこうしています。

```
data "openstack_compute_flavor_v2" "flavor_m1tiny" {
  name = "m1.tiny"
}
```

つまり、

 `data_source_openstack_compute_flavor_v2.go` の力を借りて、 `name=m1.tiny` のflavorを探してね

という意味になるわけですね。

で、resource側では、その見つかったフレーバーをこういう形で参照します。

```
flavor_id = "${data.openstack_compute_flavor_v2.flavor_m1tiny.id}"
```

これは特記する必要はないかなと。HCLの普通の書き方ですね。



ということで、m1.tinyという値を `flavor_name` という属性を使わずにインスタンスに投げ込むことに成功したというわけです。おめでとうございます。

ちなみにお気づきかと思いますが、

- image_id
- network

も同じことができるのですが、あえてここでは書いてません。



## まとめ

ということでOpenStack Heatとは違って、Data Sourceだけを司る定義というものができるということがわかったわけです。

さて、開発工数が増えちゃったな・・・。どうしよ。がんばる。
rubyであまり使わないけど知ってたらかっこいいメソッド

今日は開発中に見つけたruby/railsのマイナーだけど便利?なメソッドを紹介しようと思います。

開発中に「これ聞いたことないなー、どこで定義されてるんだろう」と思ってプロジェクト内を調べるもどこにも定義されていなかったものたちやなんかの技術ブログでたまたま見つけたものたちです。
## `deep_symbolize_keys`
ハッシュのkeyを階層を問わず、全てをシンボルに変えてくれるメソッドです

```ruby
[1] pry(main)> { 'hoge' => 1, 'fuga' => 2, 'foo' => { 'bar' => 3 } }.deep_symbolize_keys
# => {:hoge=>1, :fuga=>2, :foo=>{:bar=>3}}
```

## `カラム名__before_type_cast`
enumがかかる前の値を出してくれます

```ruby
[1] pry(main)> User.find(1).status
# => "active"
[2] pry(main)>User.find(1).status_before_type_cast
# => 1
```

`read_attribute_before_type_cast(:status) `
これでもできるようです

```ruby
[1] pry(main)> User.find(1).read_attribute_before_type_cast(:status) 
# => 1
```

rails consoleなどで値がたくさんあるenumの確認に使えそうですね

```ruby
class Pikmin < ApplicationRecord

  enum type: {
    red: 0,
    blue: 1,
    yellow: 2,
    white: 3,
    purple: 4,
  }
```

```ruby
[1] pry(main)> Pikmin.find(1).type
=> "yellow"
# 黄色ピクミンって何番目だっけ...
[1] pry(main)> Pikmin.find(1).type_before_type_cast
=> 2
```

## `all_year all_quarter all_month ...`
```ruby
[1] pry(main)> Date.today.beginning_of_month..Date.today.end_of_month
# => Sat, 01 Dec 2018..Mon, 31 Dec 2018
```
これを簡単に書けます

```ruby
[1] pry(main)> Date.today.all_month
#=> Sat, 01 Dec 2018..Mon, 31 Dec 2018
```

同じ要領で年や四半期、一週間や一日なども簡単に書けます

```ruby
[1] pry(main)> Date.today.beginning_of_year..Date.today.end_of_year
#=> Mon, 01 Jan 2018..Mon, 31 Dec 2018
```

```ruby
[1] pry(main)> Date.today.all_year
#=> Mon, 01 Jan 2018..Mon, 31 Dec 2018
```

`all_year`で書いた方が可読性が上がると思います。

例)

```ruby
[1] pry(main)> date = Date.today
[2] pry(main)> User.where(created_at: date.beginning_of_quarter..date.end_of_quarter)
#=> Mon, 01 Oct 2018..Mon, 31 Dec 2018
[3] pry(main)> User.where(created_at: date.all_quarter)
#=> Mon, 01 Oct 2018..Mon, 31 Dec 2018
```

## `in_milliseconds`

時間をミリセカンドに直してくれます

```ruby 
[1] pry(main)> 1.minutes.in_milliseconds
# => 60000
[2] pry(main)> 1.hour.in_milliseconds
# => 3600000
```

1000倍してるだけです

```ruby
[1] pry(main)> 810.in_milliseconds
# => 810000
```



----
今は「これどこで使うんだろう...」と思っても知っていたら便利かもしれません。
見ていただいた方の知らなかったメソッドがあれば嬉しいです。
Emacs上のMUAで起きた文字化けと格闘した

# Emacs上のMUAで起きた文字化けと格闘した。
再度起きた場合のための対処法メモ
## 現象
定例の会議で、メール配信済みの前回議事メモを編集、追記していく形で議事進行およびメモ取りを行っている。会議終了後に、別資料からの情報を追記して今回の議事メモとしてメール配信するのが定例になっている。いつも通りにその作業をEmacs上のMUA(mew)で行っていたが、とある事情からファイルセーブしてEmacsをいったん終了し、マシンをリブートして再度ファイルを開いたところ文字化けした。

## 途中経過
- Emacsでは`C-x RET r`で、エンコードを指定してファイルを開く事ができる。考えられる文字コードでいろいろ試してみても文字化けが直るものは無かった。
- 文字化けしているが既知の部分(メールのサブジェクトは毎回定型で文字列が特定でき、かつメールヘッダは判読可能なASCIIコード文字が多くて位置も特定できた。)と同内容の文章含んだ文字化けしていない別ファイルを作成した。このファイル（の文字コードを変えながら）と、文字化けしたメールファイルの該当部分を`od -t x1 ファイル`、`od -t c ファイル`等のコマンドでダンプして比較した。文字化けしたファイルは、UTF-8と似ているが微妙に違うデータ列になっていることを確認した。
- Emacsでどのようにしたら現象が再現するかいろいろ試していて、どのよう現象がおきたかわかった。`UTF-8`でエンコードされたファイルを、`ctext`としてデコードして読み込んだものを、`raw-text`という形式で（警告を無視して）保存すると、もとのメールのような文字化けが起きるようだ。
- 原因がわかったが、Emacs上での対処法はわからなかった。

## 解決策（超場当たり的対策）
- 文字列の化け方を見ると、
    - `0xa5`, `0xa?`というバイトがあると、`0xc2 0xa5`, `0xc2 0xa5`という2バイトに置き換わっている。
    - `0xe3`, `0xe?`というバイトがあると、`0xc3 0xa3`, `0xc3 0xa?`という2バイトに置き換わっている。 
    - 改行コードが全部CRになっている。
- とりあえず、上記を戻す変換をしてみたら、だいたい読める文章に戻った。（足りないところは人力補填でがんばることにする。）

## 解決策
スクリプト言語でのバイナリIO(というほどでもないが)はあまり慣れていないので今回はC++でやってみた。

```C++:mojibake_hukugen.cc
#include <iostream>
#include <fstream>
#include <vector>

int main(){
  char infile[] = "mojibake_sita_file.txt";
  std::ifstream fin( infile, std::ios::in | std::ios::binary );
  if (!fin){
    std::cerr << "Can not open file" << std::endl;
    return 1;
  }
  std::vector<char> buf;
  while(!fin.eof()){
    char cbuf;
    fin.read(&cbuf, sizeof(char));
    buf.push_back(cbuf);
  }
  fin.close();

  for(std::vector<char>::iterator it=buf.begin()+1;it!=buf.end();++it){
    if(it!=buf.begin()){
      if(*(it-1)==(char)0xc3){
        std::cout << (char)(*(it)+0x40);
        ++it;
      }else if(*(it-1)==(char)0xc2){
        std::cout << (char) *it;
        ++it;
      }else if(*(it-1)==(char)0x0d){
        std::cout << (char)0x0a;
      }else{
        std::cout << (char) *(it-1);
      }
    }
  }
  std::cout << (char)buf[buf.size()-1];
  std::cout << std::endl;
  return 0;
}
```

要らないキャストとかあるとは思いますが。
文字化けによるとりあえず議事の取りこぼしは避けられた。
Site24x7でレイヤー2マップを描画してみた。

はじめまして。
某IT企業にてインターンをしております、@tefu-tefu と申します。

『クラウドで使える統合監視ソフトウェア』ということでお世話になっている、
Site24x7のAdventCalendarとのことなので、私も記事を投稿してみたいと思います٩( ‘ω’ )و
因みに2つ目の記事です。

今回は[Site24x7](https://www.site24x7.jp/)の機能の1つ、**レイヤー2マップ**を描いてみたいと思いますので、お付き合いいただければ。

それではいきましょうっ
#レイヤー2マップとは#
Site24x7のレイヤー2マップの便利さについてお伝えしたいと思います。
　- 物理的なネットワークの視覚化に役立つ。
　- それを自動で描画してくれる。
　- つまり手動での更新なんて必要ない。

ネットワークを構成する機器を図として把握しておくことって結構大切ですが、
なかなか難しいかと思うんです。
折角作っても、変更多くないですか？
例えば、新入社員が増えた！サーバーを変えた！などなど・・
その都度、レイヤー2マップも変更、なんてきっと忘れちゃいますよね？
そんな面倒はSite24x7に任せちゃいましょう。
#用意するもの＝オンプレミスポーラー#
レイヤー2マップを作成するためにはまず、**オンプレミスポーラー**が必要です。
これはファイアウォール内部のネットワークやリソースを監視するのに必要なものです。
オンプレミスポーラーを立てることで、レイヤー2マップを書くときに必要な情報を集める役割を果たしてくれるんです。
#オンプレミスポーラーを立てていこう#
と、いうことでまずはオンプレミスポーラーを用意します。
レイヤー2マップを描きたいネットワークの中に、オンプレミスポーラーのソフトウェアを導入します。

ごめんなさい、導入方法は[**こちら**](https://www.site24x7.jp/help/admin/adding-a-monitor/on-premise-poller-for-windows.html)を参照してください。
私もこのページを見て導入しました。(手抜き)

完了すると [管理] -> [オンプレミスポーラー] に今追加したものが表示されるかと思います。
#レイヤー2マップを描くよ#
やっとレイヤー2マップを描きます。ここまで来たら簡単です！
[ネットワーク] -> [Layer 2 Maps] -> 右上[+Creat New]
設定画面が登場します。
![2018-12-18_14h11_35.png](https://qiita-image-store.s3.amazonaws.com/0/326030/0b928050-7dd5-dde7-1c3d-f6f8fc778467.png)
設定が完了しましたら、緑の[Discover]をクリックします。
描画されるまで少し時間がかかりますのでお待ちください。

・・・・

マップ名が先ほどの画面に追加されたら、描画完了です！
早速見てみましょう。
![2018-12-18_15h34_12.png](https://qiita-image-store.s3.amazonaws.com/0/326030/4393ee33-c32b-6a00-5253-07e647defa7e.png)
きれいに丸いマップが書けました(笑)
少し色が変わっているところが監視している装置です。
クリックするとその装置の詳細ページに飛ぶことができますよ！

真っ白の装置をクリックすると**Bulk Add Devices**というページから、
装置を監視対象に追加することもできます。
#終わりに#
レイヤー2マップの良いところは、最初にも述べた通り、自動でやってくれることだと思うんです。
ネットワーク内に新規装置が増えた時は自動で追加をしてくれます♪

マップから直接気になった装置に飛べるところも、監視業務としてとても便利かと思います。

私のような、ネットワークの全体像を把握していないインターン生でも、こうしてマップになると
「この装置今ダウンしてるから仮想環境使えないのか・・どの方の装置だったっけ・・？動かしてもらおう。」
なんてこともやりやすくなるので、ありがたい機能かと思います。

では今回はこの辺でヾ(*ﾟｰﾟ)ﾉ~~~☆
Swiftで旧暦を扱う

風水のアプリを作っていて旧暦を扱う必要が出てきました。
メモがてら、Swiftで旧暦を扱う方法をメモします。



# Date型から算出

`Date`型インスタンスから旧暦を算出してみます。

`Calendar(identifier: .chinese)`を指定することで中国の農暦=日本でいう旧暦を指定できます。

```swift
let today = Date() //2018年12月18日に実行
// 中国の農暦 = 旧暦
let chineseCalendar = Calendar(identifier: .chinese)
let comp = chineseCalendar.dateComponents([.year, .month, .day], from: today)
print(comp.debugDescription)
// year: 35 month: 11 day: 12 isLeapMonth: false 
```

# 西暦の年月日を旧暦に変換

西暦の日付を旧暦に変換したい場合は`DateComponents`型を使います。

```swift
// グレゴリオ暦 = 西暦
let gregrianCalendar = Calendar(identifier: .gregorian)
var compornents = DateComponents()
compornents.year = 2018
compornents.month = 12
compornents.day = 18

// 西暦からDate型を作る
let gregrianDate = gregrianCalendar.date(from: compornents)!

// 中国の農暦 = 旧暦
let chineseCalendar = Calendar(identifier: .chinese)
// 旧暦に変換
let chineseComps = chineseCalendar.dateComponents([.year, .month, .day], from: gregrianDate)
print(chineseComps.debugDescription)

```

以上です。
Wio Nodeのドライバ開発（雑記）

[Alexa Developers Summit Tokyo 2018](https://alexadevsummittokyo.splashthat.com/)のワークショップに、クリスマスイルミネーションの制作とスキル開発があったのですが、、、
![image.png](https://qiita-image-store.s3.amazonaws.com/0/109634/96858404-e1b3-f0eb-c751-60e88e2a8c45.png)
[twitter投稿](https://twitter.com/AlexaDevsJP/status/1073817078224703488)

これ、実はSeeed製品をご活用いただいていました！

* [Wio Node](https://www.seeedstudio.com/Wio-Node-p-2637.html)
* [Grove - WS2813 RGB LED Strip Waterproof - 30 LED/m - 1m](https://www.seeedstudio.com/Grove-WS2813-RGB-LED-Strip-Waterproof-30-LED-m-1m-p-3124.html)

Webのサービスからハードウェアを操作するのに、Wio Nodeは便利ですよねっ


ここからが想定外の話。

わたしの知人がワークショップのtweetを見たらしく、触発されてコピー品を作っていました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/109634/6cdc78f4-dbce-7c66-e85c-08d7e270d293.png)

で、気になったのがココ。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/109634/78a3dcca-4a30-d3a3-9a01-e82463ea88cd.png)

**LEDは60個まで**、
**LEDは60個まで**、
**LEDは60個まで**、
**LEDは60個まで**、
**LEDは60個まで**、、、

そ、そうなの！？

# Wio Link App

早速、Wio Link AppのLEDテープのところを見てみます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/109634/6fd5de3e-347b-de54-a195-90d041008551.png)

なるほど、LED60個のLEDテープが選べるんですね。だから上限60。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/109634/c4ad63de-f6e6-7c6a-6a6f-4b9cdb801a2b.png)

APIページには、丁寧に`too many leds will cause the power unstable`の注意書きがあります。`LEDいっぱい点灯すると電源不安定になるよ`と。

# Grove - LEDテープ

でも、、、弊社製品ラインナップを見ると、Grove - LEDテープで144LEDがあるので、144まで指定できても良いんじゃない？という気がする。

https://www.seeedstudio.com/s/grove%20-%20ws2813.html

![image.png](https://qiita-image-store.s3.amazonaws.com/0/109634/1d641346-59e8-f65e-93fa-834816cad4fc.png)

# LEDテープのLED上限数変更

弊社では、このセンサー毎のプログラムを「ドライバ」と呼んでいて、githubでソース公開しています。

[Grove_Drivers_for_Wio](https://github.com/Seeed-Studio/Grove_Drivers_for_Wio)

これをチョイチョイと修正すればOK。
たとえば、今回のLEDテープは（たぶん）[MAX_LED_CNT](https://github.com/Seeed-Studio/Grove_Drivers_for_Wio/blob/master/grove_led_ws2812/grove_led_ws2812.h#L53)を変更するだけ。

ですが、動作確認をするのに、**独自でWioサーバー**を立てる必要があるんです！これが大変。

# 独自Wioサーバー

[Server Deployment Guide](https://github.com/Seeed-Studio/Wio_Link/wiki/Server%20Deployment%20Guide)に書いてあります。おしまい。
だと寂しいので、、、ちょっと補足しておきます。

このドキュメントには、
1. Deploy with Docker
2. Deploy Directly into Host Filesystem
3. Deploy a Local Lean Data Exchange Server
4. How to Use the Local Servers
の4章ありますが、サーバーの構築は1.もしくは2.です。Docker使うか使わないかの違いです。

多少誤記がありますが、そのへんはうまいこと乗り切ってください。PR送っていただけると嬉しいです。

わたし、以前は両方使っていましたが、、、いまはAzureのVirtual Machineに2.(Deploy Directly into Host Filesystem)で開発しています。
（Docker完全に理解している人は、Dockerでも良いのかも？）

2.1~2.4で基本的にはサーバー構築完了です。2.5でリバースプロキシでSSL化、2.6で不要なポートをアクセス制限しています。（SSL化めんどうです。もうちょっと簡単にできる方法知っている人いたらコメントください。）

非SSLでは、ポートは8000,8001,8080,8081を開けます。

~/Wio_Link/grove_drivers配下がドライバのプログラムです。好きなように改変してください。改変したら、`scan_drivers.py`と`build_firmware.py`を実行して軽微な問題が無いか確認しましょう。

# 最後に

Wio Nodeドライバ開発の手順と、LED個数を増やして動作確認までやろうと思っていましたが、、、
息絶えてしまいましたm(__)m

まだ[Advent Calendar](https://qiita.com/advent-calendar/2018/seeed)空いていますので、ぜひトライして記事書いてください！（願望
【Google Chrome】通信速度の制限モードを使う。

#前置き
Webアプリを作成するエンジニアであれば、必須である「ブラウザ」。
通信速度を気にしながら実装するエンジニアは少ないと思いますが、レスポンシブがモダンな昨今では、必然的に対スマホのことを気にする必要があります。
しかしながら、エンジニアが気にするのは `レイアウト` `javascript`等にフォーカスしがちです。
皆さんはどのようなWebアプリが良いものだと考えますか？
色々あると思います。
確実に言えることは`ページ遷移時にすぐに描画されること`です。
これは、未来永劫揺るがない前提条件であるといえます。
上述から、描画速度を気にしながら実装する事がwebエンジニアとして心得なければならないことです。
もうちょい前置きを書きたいのですが、そのうち追記します。
ということで本題です。
今回はPCのChromeで通信速度を制限する方法があったので、備忘録として残します。

#どうやって使うの
とっても簡単です。
クロームの開発者モードより設定ができます。
▼開発者モード画面
![image.png](https://qiita-image-store.s3.amazonaws.com/0/213462/74b23410-e776-ec6c-07c1-f2a79163d533.png)

▼通信速度設定セレクトボックス
![image.png](https://qiita-image-store.s3.amazonaws.com/0/213462/707186ea-48a6-8ae4-02e1-c9c1077063ee.png)

上図の上部右端に「Online」と設定されているセレクトボックスで変更可能です。
プリセット、自作カスタムプリセット等から選択可能です。
携帯用の画面を確認する際は基本的に「Fast 3G」を選択して確認するのがいいと思われます。
そこまで神経質になる必要はありませんが、Webアプリ程じゃないけど、ランディングページは「fast3G」で1秒以内に表示されることが望ましいと思われます。
#最後に
`「WEBアプリの速度」`というのは色々なレイヤーがボトルネックになることがあるため、当たり前ですがこの方法を知っているから速度が上がるわけではありません。
しかし、
`実装する下流のコーダーがこういった方法を常用し、アンテナをはることで「レンダリング遅いクソWEB」という未来を回避できるはずです。`

以上です。
ちょっとだけ噛み砕きたい「社内インフラは全てを信用しない」まとめ学習

[企業のITは何かを「信用」して成り立つが、システム的に信用を捨てる概念 | ロードバランスすだちくん](https://blog.animereview.jp/zero-trust-architecture/)

# 社内インフラ予算は目的、指標なしに費やされている企業が多いらしい

>社内インフラを構築するとき、何を指標として設計しているか、何のために作るのか、誰が嬉しいのかを考えずに淡々と予算を投入している企業の多いこと多いこと。

# ITは「あるとプラス」ではなく「ないとマイナス」「生存さえ危うい」時代

>企業や組織運営において、ITを使うことで便利になったり、効率が良くなったりする程度の時代はとっくに終わっています。企業や組織からIT全てをとっぱらってしまうと、企業や組織が消え去る可能性が非常に高い

# 海外ではITはコア部門だが、国内ではそうでなはい

>ITはコア、つまり情報システム部門こそが企業のコアであるはずなのですが、国内企業はそうなってない。

# 「信頼性ゼロのアーキテクト」という考え方があるらしい

>僕らのインフラは「ゼロトラストアーキテクチャ」という概念で構成しています。

# ゼロトラストアーキテクトとは？

3つの「信用しない原則」があるらしい。

>・人を信用しないインフラ
>・ネットワークを信用しないインフラ
>・デバイスを信用しないインフラ








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
vim の色設定メモ

vim の色設定でどんなのが使えたのか、毎回パスを忘れてたけど。。
便利な方法があったのでメモ

こちら参照
[vimのカラースキーマのデフォルトでインストールされているもの - SOFTELメモ](https://www.softel.co.jp/blogs/tech/archives/5857)


```
$ ls  /usr/share/vim/vim72/colors/
README.txt  darkblue.vim  delek.vim   elflord.vim  koehler.vim  murphy.vim  peachpuff.vim  shine.vim  torte.vim
blue.vim    default.vim   desert.vim  evening.vim  morning.vim  pablo.vim   ron.vim        slate.vim  zellner.vim
```

こんな感じだったけど、TABキー補完が効く見たい！！

:colorscheme ＋ Space ＋ Ctrl+D

```



:colo
blue       default    desert     evening    morning    pablo      ron        slate      zellner
darkblue   delek      elflord    koehler    murphy     peachpuff  shine      torte
```

こんな感じ


これで、いちいちパス見る必要もないし楽々ですね
charとstd::string

charの配列を、std::stringに代入したときの挙動を調べたので、置いておきます。

サイズ指定が無いcharからstd::stringへの代入は、0が出てきたら文字列が途切れる。
サイズ指定すれば、0が含まれる文字であっても、ちゃんと値を持っている。
std::stringstreamのstr()が返す内容も、0が含まれていても、ちゃんと値を持っている。


```c++:b.cpp
#include <string>
#include <iostream>
#include <sstream>

int main(int argc, char **argv) {
        char text[] = {97, 0, 98, 0, 99, 0};

        std::cout << "text output." << std::endl;
        std::cout << text << std::endl;
        std::cout << std::endl;

        std::string s1 = text;

        std::cout << "s1 output." << std::endl;
        std::cout << s1 << "\t" << s1.size() << std::endl;
        std::cout << std::endl;

        std::string s2(text, sizeof(text) / sizeof(char));

        std::cout << "s2 output." << std::endl;
        std::cout << s2 << "\t" << s2.size() << std::endl;
        std::cout << std::endl;

        for (size_t i = 0, ei = s2.size(); i < ei; ++i) {
                std::cout << s2[i]  << "\t" << static_cast<int>(s2[i]) << std::endl;
        }

        std::cout << std::endl;

        char text2[s2.size()];
        std::char_traits<char>::copy(text2, s2.c_str(), s2.size());

        std::cout << "text2 output." << std::endl;
        std::cout << text2 << std::endl;
        std::cout << std::endl;

        for (size_t i = 0, ei = sizeof(text2) / sizeof(char); i < ei; ++i) {
                std::cout << text2[i] << "\t" << static_cast<int>(text2[i]) << std::endl;
        }

        std::cout << std::endl;

        std::stringstream ss;
        ss.write(text, sizeof(text) / sizeof(char));

        std::string s3 = ss.str();

        std::cout << "s3 output." << std::endl;
        std::cout << s3 << "\t" << s3.size() << std::endl;
        std::cout << std::endl;

        for (size_t i = 0, ei = s3.size(); i < ei; ++i) {
                std::cout << s3[i]  << "\t" << static_cast<int>(s3[i]) << std::endl;
        }
}

```

```
[todanano@localhost ~]$ g++ --version
g++ (GCC) 4.8.5 20150623 (Red Hat 4.8.5-36)
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

[todanano@localhost ~]$ g++ b.cpp
[todanano@localhost ~]$ ./a.out
text output.
a

s1 output.
a       1

s2 output.
abc     6

a       97
        0
b       98
        0
c       99
        0

text2 output.
a

a       97
        0
b       98
        0
c       99
        0

s3 output.
abc     6

a       97
        0
b       98
        0
c       99
        0

[todanano@localhost ~]$
```
PWA初期化

最近、PWAが少しは流行っているので覚書
■Step1：Index.htmlを準備
---

```html:index.html
<!-- index.html -->
<html>
<head>
    <title>Hello PWA.</title>
    <link rel="manifest" href="./manifest.json">
</head>
<body>
    <h1>Hello World!</h1>
</body>
</html>
```
■Step2：マニフェスト
---
PWAにはマニフェスト「manifest.json」が必要なので準備します。
(manifest.jsonはindex.htmlから読み込んでいます)

```json:manifest.json
{
    "short_name": "PWA HELLO",
    "name": "test01のPWA HELLO",  
    "start_url": "./?utm_source=homescreen",
    "display": "standalone",
    "icons": [{
          "src": "./icon.png",
          "type": "image/png",
          "sizes": "192x192"
        }],
    "background_color": "#2196F3",
    "orientation": "portrait"
}
```
■Setp3：アイコン準備
---
192X192のサイズのアイコンを準備しましょう（icon.png）
![icon.png](https://qiita-image-store.s3.amazonaws.com/0/122121/1c427849-42e6-a09f-7d65-c16cb46ee9d6.png)


■Step4：実行（Android）
---
サーバにアップし、HTTPSでURLにアクセスしてください
アクセスすると「ホーム画面にPWA　HELLOを追加」がでてきますので、それを選択してください
（まちがって「X」を選択すると追加できなくなります）
![Screenshot_20181218-154352.png](https://qiita-image-store.s3.amazonaws.com/0/122121/bb57270c-d5de-a1d9-7148-87ce725f7833.png)
確認のダイアログが現れたら「追加」を
![Screenshot_20181218-154400.png](https://qiita-image-store.s3.amazonaws.com/0/122121/a904a2eb-66d0-288e-20b7-6096cedb2751.png)
一般のアプリと同じようにアイコンで登録されます。
![Screenshot_20181218-154422.png](https://qiita-image-store.s3.amazonaws.com/0/122121/9d297cf1-cca8-7493-93ed-4d01d944eeab.png)
アイコンを実行すると
![Screenshot_20181218-154435.png](https://qiita-image-store.s3.amazonaws.com/0/122121/7b019063-6fa7-5d12-ae58-d2e0b0e97758.png)


■Step4：実行（iOs）
---
サーバにアップし、HTTPSでURLにアクセスしてください（サファリを使用）
アクセスしたら、右上のボタンを押します。
![IMG_0012.PNG](https://qiita-image-store.s3.amazonaws.com/0/122121/2ff2bd54-a0d1-8e27-5397-2558c85efa4a.png)
メニューが現れたら、「ホーム画面に追加」を選択
![IMG_0013.PNG](https://qiita-image-store.s3.amazonaws.com/0/122121/1f74fd99-6bf9-701c-5e59-209e1197b339.png)
確認ダイアログが現れたら「追加」を選択
![IMG_0014.PNG](https://qiita-image-store.s3.amazonaws.com/0/122121/0541124a-2443-3b6e-1169-14e08faf0e9d.png)
無事登録できたので、このアイコンから実行できます。
![IMG_0016.PNG](https://qiita-image-store.s3.amazonaws.com/0/122121/d87861dd-0ed4-0d42-f1c2-53d60e2b1846.png)
EC2（ubuntu）のタイムゾーンをAsia/Tokyoに変更する

```
# タイムゾーン設定
$ sudo timedatectl set-timezone Asia/Tokyo

$ timedatectl
      Local time: Tue 2018-12-18 16:09:16 JST
  Universal time: Tue 2018-12-18 07:09:16 UTC
        RTC time: Tue 2018-12-18 07:09:16
       Time zone: Asia/Tokyo (JST, +0900)
 Network time on: yes
NTP synchronized: yes
 RTC in local TZ: no
```
Laravel/EloquentのhasManyやbelongsToを解釈して、ER図を自動生成する


こんな感じのER図を、laravel/EloquentのhasManyやbelongsToを解析して生成します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/255465/babf59b5-0b4c-9984-8e2a-36c81194730f.png)

表示系は、まるっと Ondřej Žára さんの「WWW SQL Designer」を利用しています！
http://ondras.zarovi.cz/#projects

やったのは、下記だけです。

- App\Entities 内の各Entityの、relationメソッドを解析して、relation関係を得る
- 重ならないように、見やすく各エンティティを配置する
- 「１対多」関係がわかるように、「多」側に赤い三角を表示

いちおう git においてみました。

https://github.com/prexlab/laravel-er-diagram

これも packagist できたらなぁ。
`hasMany('App\Entities\Hoge')`みたいな文字列記述にしか対応してないのやだなぁ。
[Python]NumpyとStatisticsを使って基本統計量を算出

NumpyとStatisticsを使って基本統計量が出せるようなのでやってみた。

#データセットの準備
```python
data = [12, 3, 5, 2, 6, 7, 9, 6, 4, 11]
````


#Numpyを使って基本統計量をだす
###Numpyをimportする

```python
import Numpy as np
```

###平均
```python

np.mean(data)
>6.5
```

###中央値
```python
np.median(data)
>6.0
```

###合計
```python
np.sum(data)
>65
```


###母標準偏差
```python
np.std(data)
>3.138470965295043
```

###母分散
```python
np.var(data)
>9.85
```

Numpyでサクッと出せそうなものが以上です。
どうやら最頻値はNumpyではサクッと出ないようです。

#Statisticsを使って基本統計量をだす
###Statisticsをimportする

```python
import Statistics as stat
```

###平均

```python

stat.mean(data)
>6.5
```

###中央値

```python

stat.median(data)
>6.0
```

###最頻値

```python

stat.mode(data)
>6
```

###母標準偏差
```python

stat.pstdev(data)
>3.138470965295043
```

###不偏標準偏差
```python

stat.stdev(data)
>3.3082388735465345
```


###母分散
```python

stat.pvariance(data)
>9.85
```

###不偏分散
```python

stat.variance(data)
>10.944444444444445
```
標準偏差と分散について母集団と標本を分けられるので便利！

###補足
modeは離散値であることを想定していていますが、最頻値は (数値でない) 名目データにも適用できます。

```python

stat.mode(["red", "blue", "blue", "red", "green", "red", "red"])
>red
```
Lua で Discord 向けしりとり bot を作る

# しりとるあ

実は Lua でまともな実用プログラムを書くのは初めてだったりしますが、がんばりました。

## 環境構築

Ubuntu Server 上でやりました。*nix 系なら同じようにできますが、
Windows の場合は手順が異なります。Luvit 公式サイトを確認してください。

### Luvit をインストール

[公式サイト](https://luvit.io/install.html) があります。

```bash
curl -L https://github.com/luvit/lit/raw/master/get-lit.sh | sh
```

インストールが一瞬で終わるのでびびります。
できたファイルは PATH の通った場所に移動しておきましょう。

### Discordia をインストール

Lua から Discord がいじれる、[Discordia](https://github.com/SinisterRectus/Discordia) を使います。

```bash
lit install SinisterRectus/discordia
```


## 初期設定

https://discordapp.com/developers/applications/ にアクセスし、
新しいアプリケーションを作成します。

アプリケーションができたら、左側のメニューにある [Bot] を押して
新しい Bot を作成します。Botトークンは後で使います。メモっておきましょう。

アプリケーションのトークンではないので注意！

## ピンポンする

Discordia のサンプルコードそのままですので、省略。

`Bot INSERT_TOKEN_HERE` を、 `Bot [メモったトークン]` に置き換えます。

## しりとりに必要なもの

しりとりは文字のよみが分からないと始まりません。

[Gooラボ API](https://labs.goo.ne.jp/jp/apiregister/) のひらがな化 API を使います。
登録して、アプリ ID を取得しておきます。GitHub アカウントが必要です。

### ひらがな化

Gooラボ API を使って、メッセージをひらがな化します。

```lua
local json = require 'json'
local http = require 'coro-http'

local function yomiOf(kanji)
	local res, body = http.request(
		'POST',
		'https://labs.goo.ne.jp/api/hiragana',
		{
			{ 'Content-Type', 'application/json' }
		},
		json.encode {
			app_id = HIRAGANA_API_ID, -- ここをIDに書き換える
			sentence = kanji,
			output_type = 'hiragana'
		}
	)
	local hiragana = json.decode(body)
	return hiragana.converted
end

print(yomiOf'兄貴と私') -- → あにきとわたし
```

`json` と `coro-http` は `discordia` の依存ライブラリなので、
ありがたく使わせていただきます。

### 長音・記号を除く

長音が最後の文字に来ると困るので、置換します。

```lua
hiragana:gsub('ー', '')
```

他にも最後に来ると困る記号群を置換します。
日本語文字列では正規表現が使いものにならないので、がんばります。

```lua
local hiraganar = {
	'[!-~]', '「', '」', '！', '？', '｛', '｝', '＿', '＊', '％',
	'。', '、', '｜', '＝', '＜', '＞', '＾', '～', '￥','＋', '・', '；',
	'：', '…', '‥', '（', '）', '’'
}

for i, str in ipairs(hiraganar) do
	hiragana = hiragana:gsub(str, '')
end
```

### 最後の一文字を取る

Lua は utf8 に対応してないので、最後の一文字を取るのはわりと大変です。
Lua で utf8 を扱うライブラリもありますが、今回は使わないでいきます。

API レスポンスから末尾3バイトを取り出します。
ひらがなしか来ないのがわかっているからできる力技です。

これで最後の1文字が抽出できました。

同じように最初の1文字も取れます。

```lua
-- 最後
hiragana:sub(-3)

-- 最初
hiragana:sub(1, 3)
```

あとは、取った文字を比較してやればよいです！

## 特定チャンネルだけに反応する

反応するチャンネルリストをあらかじめ登録しておくことで、
不要なチャンネルへの返信を抑制します。ついでに Bot への返信も抑制します。

```lua:config
reactChannels = { 'チャンネルID', }
```

```lua
-- ut:includes(obj, fn) … obj テーブルに fn に一致する value があるか調べる
-- https://github.com/plageoj/shiritolua/blob/master/utils.lua#L8

local outOfKaya = not ut:includes(config.reactChannels, function(itm)
	return '<#'..itm..'>' == message.channel.mentionString
end)
if outOfKaya or message.author.bot then
	return
end
```

ここで取り上げたのはプログラムの一部のみです。

全てのソースが含まれているリポジトリはこちら：
https://github.com/plageoj/shiritolua
BurpSuiteを使ってひたすらリクエストを送信する方法

シーエー・アドバンス [Advent Calendar 2018 ](https://qiita.com/advent-calendar/2018/ca-advance) 19日目の記事です。
おはようございます。 @inahuku_shingo です。
普段は脆弱性診断業務をしています。

この記事では、プロキシツールのBurpSuiteを使って、ひたすらリクエストを送信する方法を紹介いたします。
今までは手動でリクエストを送信したり、Intruder 機能の Numbers オプションを使っていたのですが、
ちょっとした設定をするだけでできました。

## 知らなかった そんなの… 
Intruder の Payload type にある Null payloads 項目には continue indefinitely（無限実行） オプションがあり、
同じリクエストをエンドレスで送信してくれます。


## こんな時に使いました
 - 診断対象のサービスにデータを多数登録する必要があった
 - 登録内容は同じでOK
 - 送信するリクエストの数は気にしなくてOK
 - 手動で絶対やりたくない


## 環境
 - Windows10
 - Google Chrome
 - burpsuite_community_v1.7.36.jar

#### 補足
任意の文字列で順にリクエストを送信したい場合や、パラメータの値に数字を設定したい場合などには、
他のオプションをおすすめします。
https://portswigger.net/burp/documentation/desktop/tools/intruder/payloads/types
※一部、Pro版じゃないと使えない機能があります。

## 使い方
 1. Google Chrome と Burp Suite を使用して、繰り返したいリクエストを取得する。
![image11.png](https://qiita-image-store.s3.amazonaws.com/0/141077/9fa263b4-7060-468b-f026-b9ded9ab1a21.png)

※手順1は、僕が昔書いた記事に詳細を書いていますのでご参考ください！
[BurpSuiteのFree版を使うときのプロキシ設定をサクサク書いてみた（Chrome）](https://qiita.com/inahukus/items/63a1d9f9fee1ff9af9cc)

 2. Proxy タブの HTTP history タブから、繰り返したいリクエストを Intruder タブに送る
![image12.png](https://qiita-image-store.s3.amazonaws.com/0/141077/344f5d03-ffff-69bc-e01e-b6efe82c2cec.png)

 3. Payload Sets にある Payload type の項目を、 Null payloads に設定
![image13.png](https://qiita-image-store.s3.amazonaws.com/0/141077/fdf795c9-b9f5-51b4-d907-70fd3e0101c6.png)

 4. Payload Options が Null payloads の設定に変わるので、continue indefinitely にチェックを入れる
![image14.png](https://qiita-image-store.s3.amazonaws.com/0/141077/f6bd899a-4ce7-0dbf-74ac-805205d6da02.png)

 5. Start attack をクリックして Intruder を開始する
![image15.png](https://qiita-image-store.s3.amazonaws.com/0/141077/4c3a6742-0924-0033-ec7d-8b1449135501.png)

 6. Intruder 実行中
![image16.png](https://qiita-image-store.s3.amazonaws.com/0/141077/b1412f02-b9af-215f-8361-e61df3a9ea88.png)
※ウィンドウ下部のステータスは100リクエストを超えると初期状態に戻りますが、
　送信されたリクエスト内容は Results タブに蓄積されていきます。

### いちいち手動でリクエストを送信したり、わざわざ Numbers のオプションを使わなくても、リクエストを大量に送信することができました！

くそ……
なぜ
オレはあんな
無駄な時間を……

## 注意
手動で止めない限り、いつまでもリクエストが送信されます。
使用後は忘れずに Intruder をストップしましょう！
また、リクエスト数が多くなりすぎるとBurpSuiteが不安定になり落ちることがあるので、その点もご注意ください。
Nuxt.jsでFirebase storageの画像を含む要素をhtml2canvasでimage化してアップロードする

# 概要
タイトルから何を言っているんだ？と思われる方が多数だと思われるので、簡単にやりたいことを書きます。
個人備忘録です。

## やりたいこと
Nuxt.jsで構築した画面の一部を画像にしてTwitterで投稿しようとしています。

そのときに、html2canvasを使って、特定のhtml要素をcanvasに変換し、
その後、imageファイルをしてサーバーに転送、twitterに投稿する文を添えてtwitterに投稿します。

ただここで問題になるのが、canvasにする要素に外部から取得した画像（ここではFirebase Storage)を含む場合に、
CORSが邪魔をしてきたりするので、そのときの戦闘風景が以下説明となります。

# TL;DR
```js
methods: [
    async drawCanvas () {    
        await html2canvas(document.getElementById("target"), {
            canvas: document.getElementById("result"),
            width: '100%',
            height: '100%',
            letterRendering: 1,
            useCORS: true, // CORSを有効化
        })
    },
    async tweet() {
      var canvas = document.getElementById("result")
      var base64URL = canvas.toDataURL('image/jpeg').replace(/^.*,/, '')
      res = await this.$axios.post(process.env.TWEET_URL, {
        content: hogehoge,
        image: base64URL
      })
    },
],
```

`useCORS` を付ければいいいようです。

# 使用技術
* Firebase
* Nuxt.js -> `2.2.0`
* html2canvas -> `1.0.0-alpha.12`
* npm firebase/app -> `0.3.4`

# 説明
## 状況
`id="target"` をimageにしてcanvasに描画しようとしています。
`target` 内のimgにはこれからローカルの画像をアップロードしようとしています。

```vuejs
<template>
  <div id="target">
    <div class="image_display">
      <img
        :v-if="object.imageURL"
        :src="object.imageURL"
        @click="removeImage"
      ></img>
      <v-icon
        v-else
      >edit</v-icon>
      <input
        type="file"
        @change="onFilePicked"
      >
    </div>
  </div>
  <canvas id="result"></canvas>
</template>

<script>
export default {
  data () {
    return {
      object: {
        imageURL: ""
      }
    }
  }
}
</script>
```

## やったこと
### 【失敗談】 allowTaintを使用する
html2canvasのオプションに `allowTaint` があり、これを使用するとcanvasに描画したimageに外部から取得したimageも描画されるようになります。

```vue
html2canvas(document.getElementById("target"), {
  canvas: document.getElementById("result"),
  width: '100%',
　　　　height: '100%',
  allowTaint: true
})
```

**何がだめなのか？**
アップロードする時に、 `document.getElementById("result").toDataURL('image/jpeg')` をすると
```
Tainted canvases may not be exported
```
というエラーが出てしまいます。これは、「canvas内に不純物が入っているためエクスポートできないですよ」と怒られるわけです。


### FirebaseにCORS設定
ではどうするかというと、firebase storageの画像に許可をもらいます。
普通に「firebase storage download」とかで検索すると[公式のページ](https://firebase.google.com/docs/storage/web/download-files?hl=ja)がトップに表示されます。
ここにも記載があるとおり、CORSの設定が必要になるので設定します。

```json:cors.json
[
  {
    "origin": ["*"],
    "responseHeader": ["*"],
    "method": ["GET"],
    "maxAgeSeconds": 86400
  }
]
```
**【Point】**
* ファイル名は何でもいい
* 適宜CORSの設定

```bash
# firebaseにCORS設定
$ gsutil cors set cors.json gs://project-name.appspot.com/
# 設定内容の確認
$ gsutil cors get gs://project-name.appspot.com/
```

### html2canvasをCORSを使って表示する
```vue
<script>
...
html2canvas(document.getElementById('target'), {
  canvas: document.getElementById('result'),
  width: '100%',
  height: '100%',
  useCORS: true
}
...
</script>
```

# 参考文献
https://github.com/niklasvh/html2canvas/issues/1130

# 余談
[vuetifyを使ってファイルをアップロードする方法](https://github.com/vuetifyjs/vuetify/issues/238#issuecomment-341274460)
Excel VBAをJavaScriptに翻訳 その２

# はじめに
[**前回**](https://qiita.com/pooshikin/items/519aba36ba48b28993e4)では、VBAをJavaScriptに翻訳する基本ロジックを考えました。
今回は、VBAからJavaScriptへ翻訳するための簡単な翻訳機を作ってみます。
一応プロジェクト名を仮称「tom」を付けてみました。
この名前の付いたJavascriptで翻訳機を作成します。

# 前提
* OS : Windows7以上
* PoweShellのターミナルで実行
* VSCodeでコード編集
* node.js環境構築済み

# VBToJS.json

前回のファイルをもとに修正ならびにワードを追加しました。

```json
{
        "Debug.Print":"f.Print",
        "MsgBox":"f.MsgBox",
        "Date":"f.Date"
}
```

# tomfnc.js

nodeの**fs**で**VBToJS.json**を読込、**JSON.parse**でパースします。
引数 **s** でパースした**word**を検索した結果を返却します。

```JavaScript
var VBToJSJson = './VBToJS.json';
function Translator(s) {
    var fs = require('fs');
    var data = fs.readFileSync(VBToJSJson,'utf-8');
    var words = JSON.parse(data);
    return words[s];
}

module.exports.Translator = Translator;
```

# tom.js

翻訳機のメインJavaScriptになります。
第2引数の値に翻訳対象のワードを引数として指定します。
指定しない場合、「引数を指定してください！」とエラーメッセージで終了します。
**tomfnc.js**で定義した**Translator**に引数を渡し、**VBToJS.json**を検索して一致する場合、翻訳結果をコンソールに出力します。
一致しない場合「**undefined**」を出力します。

```JavaScript

if( process.argv[2] == undefined) {
    console.log( '引数を指定してください！' );
    return;
};

var f = require('./tomfnc.js');
var ret = f.Translator(process.argv[2]);
console.log(ret);
```

# 実行
「MsgBox」「Date」「Debug.Print」の翻訳を実行してみました。
![Translator.png](https://qiita-image-store.s3.amazonaws.com/0/239597/8df2d8fd-c473-6e96-85a8-fc518ddca6de.png)

# まとめ

Jsonファイルに定義したVBのワードをJavaScriptで定義するワードへ翻訳（変換）するコードを書いてみました。
まだ単語レベルの翻訳機です、センテンス、つまり文法的な翻訳機ではありません。
次回は、今回Jsonに追加した関数のJavaScriptをコーディングしてみます。
スマホ用Flowアプリとkintoneを連携してみた

この投稿は、「kintone」アドベントカレンダー12月18日担当分となります。
##はじめに
昨年の（おい）アドベントカレンダーでは、kintone用のカスタムコネクターを作る話をしましたので、今年はそれを使ってみた話をします。
中身は、11月10日に行われた「kintone Café Japan 2018」の懇親会LTでお話しした内容と一緒です。

<iframe src="//www.slideshare.net/slideshow/embed_code/key/LXDwEKmsCVFd2C" width="595" height="485" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC; border-width:1px; margin-bottom:5px; max-width: 100%;" allowfullscreen> </iframe> <div style="margin-bottom:5px"> <strong> <a href="//www.slideshare.net/mniizuma/flowkintone-122699008" title="Flow用kintoneカスタムコネクタ - スマホで使える「ふとアプリ」を作ってみた" target="_blank">Flow用kintoneカスタムコネクタ - スマホで使える「ふとアプリ」を作ってみた</a> </strong> from <strong><a href="https://www.slideshare.net/mniizuma" target="_blank">Masao Niizuma</a></strong> </div>

##やりたいこと
備忘録というか移動中などに思いついたり、気がついたちょっとしたことをスマホから入力するとkintoneのアプリにたまっていく「ふとアプリ」という仕組みを構築しました。
スマホのアプリをわざわざ作るのもなんなので、スマホ用のMicrosoft Flow(以下単にFlow）アプリを使います。
流れとしてはこんな感じになりました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/60483/b28c40e1-f8aa-52ae-bfe3-03d734033700.png)

ここでいれたつぶやき？が、kintoneのアプリに登録されていきます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/60483/2778e15e-dc00-c742-f1fb-65ab09700b96.png)

##スマホ用Flowアプリ
iOS/アンドロイドどちらにも既にFlowアプリがMicrosoft社から提供されています。これをインストールしておくと、スマホからFlowの編集、作成も行うことができて何気に便利なのですが、今回使うのは「ボタン」という機能です。
ボタンをタップするとそれがトリガーとなってFlowが実行されるという仕組みですが、このトリガーには、テキスト入力や選択肢を選ばせるなど簡易なUIを設定ベースで行うことが可能です。Flowの編集画面上での設定は以下のような感じになります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/60483/ccec3f81-eae0-5bdf-70a5-2218a6524284.png)
この設定だけで先ほどのスマホの画面が構築できるわけです。

##カスタムコネクターでkintoneに登録する
これでスマホで入力したテキストが取得できるようになるので、この内容をkintoneにレコードとして追加していきます。Flowとkintoneの連携方法は、いろいろありますが、kintoneのアプリにAPIトークン経由で連携するカスタムコネクターを既に作っていたのでそれを利用しています。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/60483/e0b9eb2e-8ee0-863e-7701-5038439e4f58.png)

カスタムコネクターの作り方については、幸か不幸かあまり変わっていないので、昨年（おい）の記事をご覧下さい。

[公式コネクタがまてない人のためのkintone用カスタムコネクタ作成ガイド(概要編)](https://qiita.com/mniizuma/items/a4b0e50faa0c53dd828c)

##まとめ
スマホ用Flowアプリで使えるこのトリガーは、スマホの現在位置情報などもとってこれるので、そこまで洗練されたUIにはなりませんがｗ、旨く利用するといろいろ応用が利きそうですね。PowerAppsで開発する前にテストドライブとして試してみるのもいいかもしれません。
kintoneの公式コネクターは既にリリースされいますが、Flow側の契約の縛りや、OAuth経由の認証になっているなど、若干使いにくい点もあります。特にAPIトークン経由でkintoneアプリを操作したい場合は、カスタムコネクターを作るか、Flow上でがんばってJSONを組み立ててREST APIを叩くかのどちらかになると思われます。
カスタムコネクターの雛形はSwagger形式のファイルとして用意できるのですが、今のところ欲しいという人もいないので放置しています(笑）。
データ比較の自動化を試みて学んだこと

#はじめに
###この記事について
直近私の所属するQAチームで、VBAを用いたデータ比較の自動化に取り組んだので、その中での取り組みと、取り組みから学んだことをまとめたいと思います。

###導入の背景
弊社では、報酬アイテムやボス等のデータを実装する際、以下フローで実装を行っているのですが、仕様書の情報を実装する過程で、ミスが埋め込まれることが多くあります。

- ガチャやイベント内容を企画
- 企画内容を仕様書に起こす
- **仕様書の情報を基に、実装ツールに入稿（＝実機に反映）**

それを防止するために、仕様書の情報と実装ツールに入稿された情報を目視で比較して、確認を行っているのですが、データ系は、仕様書でも実装ツール上でも、テーブルを使って記載されていることが多く、比較的容易に自動化できそうだったため、導入に踏み込むことにしました。
![5647030-842d7c61ae07d9d15a5de4ef9f2bd220e4b59e3d.png](https://qiita-image-store.s3.amazonaws.com/0/312027/d1cf6248-b7f9-7da0-a8a6-e87bc015d328.png)

#自動化方針
###VBAを活用
チーム内でエンジニア経験のあるメンバーにお願いして、Excelのマクロと言われている**VBA**を用いたツールを実装してもらいました。仕様書と実装ツールから**テーブルデータをエクセルに抽出し、形式を揃えて、整合性をとる**ことができます。

以下がVBAで整合性を取っているエクセル画面のキャプチャです。上部の入力フォームに該当の資料リンクを入力すると、それぞれのデータを抽出し、横に並べて、整合性をOK/NGで判定してくれます。
![5647033-2a5a6215ba04f564dea9194b8a7f7112cebf8e6e.png](https://qiita-image-store.s3.amazonaws.com/0/312027/64c9eb77-5669-8128-6dc5-4595d284da53.png)

###メンテナンスの属人化排除
ただ、資料によってテーブルの形式が大きく異なっており、施策やタイトルごとにも違うため、都度比較列などを設定しなおす必要があり、メンテ工数がかなり大きくなることが想定されました。

そこで、設定フォームを設置してもらい、プログラミングの知識がないメンバーでも細かい調整ができるようにしました。
![5647038-061e30dc0fe5c10863e9edfb4cc2e6535e97ba74.png](https://qiita-image-store.s3.amazonaws.com/0/312027/12a08bb5-4983-c6b3-3279-a8e4b91c40b9.png)

#導入結果
###削減工数と精度
初回導入の結果としては、削減工数は1タイトル全施策に反映しても**1人日程度**なので、効果は小さかったのですが、人力の作業を自動化し、不具合も問題なく検知することができました。
###実装フローに課題あり
ただ、実は思いもよらぬところに、大きな落とし穴がありました。
本来仕様書は上流工程で作られる想定で、この自動化を始めたのですが、今回導入トライアルを行ったタイトルでは、実は実装ツールを先に入稿し、その内容を仕様書にコピペしている場合があるということが導入後に発覚したのです。
![5647041-2dd92bf4151bb323c88b7a7576c0e92ac510ad8f.png](https://qiita-image-store.s3.amazonaws.com/0/312027/d2faa2fc-7732-4168-9083-3d8182af2e12.png)

そもそもこれでは仕様書が意味をなしておらず、**比較する必要もないので、まずはフローの改善が優先**ということで、この自動化は一旦PENDになりました。

#さいごに
結果失敗に終わったというオチなのですが、この経験を通して、導入前に開発フローや検証方法等のプロセス評価が非常に重要であるということを学びました。普段当たり前にやっているプロセスであればあるほど、課題感を認識しづらい or いつしか忘れ去られがちな部分ですが、**自動化導入前にはプロセスの妥当性を一度俯瞰的に確認する**ことをお勧めします。
C++ラムダ式解説

#1.copyとreference
copyとreferenceでは出力の値が異なります。


copyの場合

```c++
#include<iostream>

int main(){
   auto v = 1;
   auto copy = [v]() mutable {
      std::cout<<v<<std::endl;
      ++v;
    };
   copy();
   copy();
   std::cout<<v;
}
```
<font color="Red">v:1 2 1</font>

referenceの場合

```c++
#include<iostream>

int main(){
   auto v = 1;
   auto ref = [&]() {
      std::cout<<v<<std::endl;
      ++v;
    };
   ref();
   ref();
   std::cout<<v;
}
```

<font color="Red">v:1 2 3</font>

#2.functionとラムダを組み合わせて

```c++
#include<iostream>
#include<functional>
int main(){
   auto func = std::function<void(int)>{};
   func = [](int q){std::cout<<q;};
   func(777);
   
   auto one = 1;
   func = [one](int v){ std::cout << (v + one);};
   func(1);
}
```

<font color="Red">777</font>
<font color="Red">2</font>

function objectを作り、ラムダでキャプチャー。

#lambdaとfunction
lambda関数はコンパイル時、inline関数が生成されます。
一方、functionの場合、inline関数は生成されませんが、inlineの様な役割となります。

しかし、ラムダ関数でfunctionを適用した場合、ヒープ領域となるので、パフォーマンスが悪化します。

#結論
std::functionを頼らず、lambda関数を構築しようね！
僕はラムダの神になりたいと常々思ってます。
続編を待たれよ。
Spring Boot/HerokuアプリをEclipseに取り込む

[Spring-Boot/Herokuの始め方](https://qiita.com/pilot/items/9761edf9e394faabddd3)の続き

一旦VSCodeでの開発を始めたものの、やはり重たくても機能豊富なEclipseが魅力的に感じたので

1. http://mergedoc.osdn.jp/ からPleiades All in OneのEclipse 4.8 PhotonのWindows 64bitのFull EditionのJavaをダウンロードして`c:\`に展開し、`"C:\pleiades\eclipse\eclipse.exe"`をタスクバーにピン留めし、起動、ワークスペースは「../workspace」のまま
1. [ヘルプ]-[Eclipseマーケットプレイス]で「Spring Tools 3 Add-On」を検索してインストール、有効化のために再起動
1. [ファイル]-[インポート…]で「一般」の「フォルダーまたはアーカイブからプロジェクト」を選んで次へ、インポートソースにアプリのフォルダ(\herokustudy\myfirstapp)を指定して完了
1. 画面上部の緑色の六角形アイコンクリックでBootダッシュボードを開き、プロジェクト名を右クリックして実行/再実行/停止等を行う
1. EGitでherokuにpushする際にユーザ名・パスワードを聞かれるので、`heroku authorizations:create`で得られるID・Tokenを指定する

以上