OmniAICreator/Qiita-1.07M huggingface dataset:
FirestoreはFieldにReferenceを持つことができる。

# FirestoreのFieldにReferenceを入れちゃう

CloudFirestoreはRealtime DBより多くの型をDBに保存できます。
`DocumentReference`自体をFirestoreに保存できることがわかったので紹介します。

<img width="1251" alt="スクリーンショット 2017-12-20 11.11.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/80287/7f94cec6-9949-446f-4785-fa6b2010298d.png">

<img width="603" alt="スクリーンショット 2017-12-20 11.12.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/80287/ccc31354-d458-ec10-fcf9-f6aa6196b273.png">


## データを取得する

**[Pring](https://github.com/1amageek/Pring)を使ってUserを取得することこんな感じで返ってくる**

``` swift
User.get("nnuqWHOddo640SPbyHXU") { (user, error) in
    print(user)
}
```

```
Optional(User {
  id: nnuqWHOddo640SPbyHXU
  createdAt: 2017-12-20 01:50:33 +0000
  updatedAt: 2017-12-20 01:50:33 +0000
  type: UserType
  name: Optional("hoge")
  thumbnail: nil
  isDeleted: false
  itemIDs: []
  followers: Sample.ReferenceCollection<Sample.User>
  friends: Sample.ReferenceCollection<Sample.User>
  items: Sample.NestedCollection<Sample.Item>
  group: Sample.Reference<Sample.Group>
})
```

**生でFirestoreを叩くとこんな感じ**

``` swift
User.reference.document("nnuqWHOddo640SPbyHXU").getDocument { (snapshot, error) in
    print(snapshot?.data())
}
```

```
Optional(["name": hoge, "isDeleted": 0, "createdAt": 2017-12-20 01:50:33 +0000, "updatedAt": 2017-12-20 01:50:33 +0000, "followers": {
    count = 0;
}, "friends": {
    count = 0;
}, "items": {
    count = 0;
}, "group": <FIRDocumentReference: 0x60000123a460>])
```

[Pring](https://github.com/1amageek/Pring)でがReferece型でラップしてますが、Snapshotには`DocumentReference`が含まれてることがわかる。


## Whereもできた

Whereは`DocumentReference`で入れる。

```swift
User.where("group", isEqualTo: Group(id: "6MRhrD5IQd62xxrg84RI").reference).get { (snapshot, error) in
     print(snapshot?.documents.first)
}
```
```
Optional(<FIRDocumentSnapshot: 0x60000145c3e0>)
```
Visual Studio > IDE | Intellisense > メソッド、プロパティの補完機能の振舞い > 大文字からの入力で候補を絞る

```txt:動作環境
Windows 8.1 Pro (64bit)
Microsoft Visual Studio 2017 Community
Sublime Text 2
```

メソッドの大文字に引っかかるようだ。

- WriteLine: WかLからの入力
- Sleep: Sからの入力
- ReferenceEquals: RかEからの入力

例として、Console.WriteLine()の入力をする場合は、「Console.line」で手早く入力できる。


プロパティでも同じだった。

- IsCanceled: IかCからの入力

このあたりに記載されているのだろうか。
https://msdn.microsoft.com/ja-jp/library/hcw1s69b.aspx
> 入力候補では、特定できる部分まで変数名、コマンド名、または関数名を入力すると、残りの部分が補完されます。

程度しか書かれていないようだ。
【開発プロセス】設計書とかレビューとかコーディングルールとかが面倒だという意見に対する見解まとめてみた

# 開発するにあたって設計書、レビュー、コメント、コーディングルールとかはいらない

酒の肴や日頃の愚痴を言い合うときに、
「設計書を書くのが面倒くさい」「コーディングルールうざい」「レビュアーが細かい」とかで盛り上がることがあると思います。
私の結論としては

- 設計書を作成する必要はない
- 各種レビューを行う必要はない
- ソースにコメントを書く必要はない
- コーディングルールなんて必要ない

です。

# とはいえ条件がいろいろあるよね

案件の受発注の時や、自社サービス開発の時には、設計書がいるのか要らないのかの議論があるかもしれない。
そこには「QCDの観点で時間がない」だったり、「スタートアップなのでまずは動くものを作りたい」だったりの諸条件があるだろう。
もちろん、「一人でサービス作ってます」「○○人でチームを作って開発しています」なんてのもあるはずです。
リスクとは危険という意味がある。
しかし、経済や金融の分野では「リスク＝不確実性」です。
IT業界だからリスク＝危険がなければ各種不要でしょうか？
サービスという観点でいえば各種がそろっていないことで「リスク＝不確実性」が生まれる事も考慮する必要があるのでは？

# けどやっぱいらないよ、だってスキル高いしコミュ力高いし聖人だから

条件はいろいろあると思いますが、結局いろいろな作業は面倒なだけなので要らないという意見が正しいと思います。
スキルの高い人は、膨大な量の設計書を作成するよりも、その時間をコーディングにあれるだけで、思ったものが作成できてしまうからです。
だから設計書はいらない。
正しいものを常に作れるからレビューは必要ない。
スキルの高い人は、誰の何年前に作ったソースコードであってもいともたやすく読み解いて改修や新規追加をしてしまうからです。
だから、コメントを書く必要もない。
コーディングルールがなくても素晴らしいソースコードになる。
コミュニケーション能力の高い人は、相手がどこのだれであろうと、ニーズや意図をくみ取り、素晴らしいアプリケーションを作れるからです。
だから設計書はいらない。
正しいものを常に作れるからレビューは必要ない。
コミュニケーション能力の高い人は、相手に言われたことを完璧に覚えていられるので、何年たっても正しい仕様を覚えていられるからです。
だから設計書は...
聖人であるあなたは、いつでも質問に応じてあげる度量を持っていて、仕様の確認を滞りなく行えるからです。
だから...
聖人であるあなたは、苦手な人が忙しそうにしていても、素晴らしいアプローチで滞りなく一緒に作業を行えるからです。
...

# けど、いるよ、自分はスキルが低いコミュ力低い、悪人だから

ただ...私のようにスキルが低く、コミュニケーション能力も低い悪人には各種作業が必要です。
スキル高いしコミュ力高いしな聖人の方には申し訳ないのですが...。
こんな私なので、自信がありません。「正しいもの」＝「設計書」があると、道標(正解)があるようで作業が行いやすいです。
だから設計書が必要で、作ったものが正しいものかレビューが必要です。
「正しいもの」の共通認識を持つために設計書をください。
スキルが低く、理解しづらいコードを書く可能性があるので、レビューをしてください。見やすいコードの指標としてコーディングルールを教えてください。
スキルが低く、ソースを見ても理解ができないので、わかりやすいコメントを書いていただけると助かります。
コミュニケーション能力も低く、間違った理解をすることがあるので、設計書をください。
そしてコメントを書いてください。
悪人なので、苦手な人とは極力しゃべりたくありません。話をしなくてもすむ質の設計書をください。
悪人なので、設計書がないと自分の非を認めないなんてあるかもしれません。

# とはいえ結局できない人間のわがままなので
ただ　結局　設計書、レビュー、コメント、コーディングルールはいらないのが正しい
もしすべてを完璧にこなせるなら。
それ以外の人は、しょうがないからめんどくさくても忙しくてもある程度の設計書とかコーディングルールとか作りましょう。エンドユーザにはまったく見えないところなのでサービスとしては関係ないかもしれない。それでも、中身がよいと、修正や新規追加のときに少しだけよいものが作れるかもしれない。

ということを思い立ちました。
見えない部分にまでこだわって、ただ、こだわりすぎてお客さんに迷惑がかからないように
そんな風に「いい感じ」に開発をしていくのがいいと思います。
Ansible | playbook を参考に ansible コマンドでモジュールを単独実行する

# playbook

こんな Playbook がある場合

```yaml:example.yml
- name: install
  yum: name=vim state=latest
  sudo: yes
```

# ansible コマンドに置き換える

こんな感じ。

```
ansible -vvvv example -i example_inventory.txt -m "yum" -a "name=vim state=latest" -s
```

- `-m` に使うモジュールを渡す
- `-a` に「モジュールに与える引数」を渡す
- 他の動作指定はオプションで実現したら良さそう ( 今回だと `sudo: yes` を `-s` オプションに置き換えた )

# 環境

- ansible 1.9.6








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
開発環境用に適当に決めたドメイン名のトップレベルが.devだったので、chromeがhttpsにリダイレクトした

hostsに
```
192.168.1.101 hoge.piyo.dev
```

などと書いて、
```
http://hoge.piyo.dev/
```
にアクセスすると、なぜか
```
https://hoge.piyo.dev/
```
にリダイレクトされて困っていた。

原因は下記参照。
http://www.itmedia.co.jp/enterprise/articles/1709/28/news053.html
Visual Studio | C# > string > $ > リテラル文字列を挿入文字列として識別します。

```txt:動作環境
Windows 8.1 Pro (64bit)
Microsoft Visual Studio 2017 Community
Sublime Text 2
```

関連: [Visual Studio | WPF > 非同期処理 > Link: ざっくりマルチスレッド(非同期処理)](https://qiita.com/7of9/items/5f9d900f01d6e6afc703)

[Cancellation Token について調べてみる](https://qiita.com/TsuyoshiUshio@github/items/b2d23b37b410a2cfd330) by @TsuyoshiUshio@github さん
を読んでいて知らなかった下記の表記。

```csharp
Console.WriteLine($"Eternal Loop: {DateTime.Now}");
```

以下が公式の情報のようだ。

$ (C# リファレンス)
https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/tokens/interpolated

### 関連

- [Visual Studio | WPF > C# > string > @ > @-quoted 形式 > Pythonのraw stringに相当? | link: C++のRaw String Literal
WPF](https://qiita.com/7of9/items/27eea3c4851539ba1701)

### 所感

`$`, `*`, `#`, `?` などの機能は、その定義をしている情報にたどり着きにくい。
言語を定義する人達にはそういう視点を持ってほしい。

「書きやすい」と「読みやすい」のどちらを優先するか。保守などを考えたところ「読みやすい」「情報にたどりつきやすい」実装にしておきたい。
これまで使ってみたツールまとめ

# 概要
これまで使用したことのあるツールのよかったところ・もうちょっと頑張りたいところのまとめをします。
「このツール使ってみたいけど、実際どうなの？」や、
「こういった場合は何を使えばいいんだろう...」等の参考になると嬉しいです。
使いながら思い出したら随時追加していく予定です

## コミュニケーションツール
### Slack
#### よかったところ
* botを導入しやすいし、既存のbotの種類が多い
* いろんなツールと連携できる
* 絵文字のリアクションが楽しい
* コードを投稿できる
* スレッド機能が使える
* プライベートチャンネルとそうでないものに分けられる

#### もうちょっと頑張りたい
* 無料版だと過去の会話内容が消えてしまう

### チャットワーク
#### よかったところ
* 日本語である
* メッセージをタスクにすることができる
* ファイルの管理・タスク管理等、管理がしやすい

#### もうちょっと頑張りたい
* グループチャットに人を新しく入れる時、本人が承認するまで入れられない
* botはあまりない

### Googleチャット
#### よかったところ
* 入力しやすい
* UIが好き
* 既読がつかない
* メッセージを連投しても1つにまとめてくれる

#### もうちょっと頑張りたい
* 通知が少しわかりづらい

## 社内共有
### DocBase
#### よかったところ
* マークダウンでかける
* 共同編集ができるようになった
* APIがあって色々とできそう
* 記事にタグをつけられる
* メンバーから削除された人の記事も残り続ける
* 公開範囲を任意で決められる

#### もうちょっと頑張りたい
* 退職した人の記事が残るのはいいが、アイコンはそのままなので退職した人の記事なのかがわからない
* タグをつける習慣がなかったら記事が散財する
* 差分がわかるのはいいが、Gitのようにすぐ戻せずに手作業で戻すことが多い

### Qiita:Team
#### よかったところ
* Qiitaと同じ感覚で書くことができる
* マークダウンでかける

#### もうちょっと頑張りたい
* 差分を見る場所が見つけづらい

## タスク管理
### JIRA
#### よかったところ
* ドラッグ&ドロップの簡単な操作でタスクの状態を更新できる
* 親子課題を作ることができる
* スプリントは回しやすい
* スクラムには向いてそう?

#### もうちょっと頑張りたい
* 操作を理解するのに少し時間がかかる
* お金がかかるのですぐに入れられる！とは難しいかも？
* ちょこっと重たい......(ネットワークの関係かも)

### Backlog
#### よかったところ
* 期限を設定したらガントチャートをよしなに作ってくれる
* タスクが遅延しているか、そうでないかがわかりやすい
* ファイル管理がディレクトリと見た目が似ているため直観的に操作しやすい
* Slackと連携できる

#### もうちょっとがんばりたい
* 担当者の変更や誰に通知する等が少し分かりづらく最初は混乱するかも
* ファイルのアップロードがちゃんとできているか不安になる

### Torello
#### よかったところ
* 無料！無料！無料！
* ドラッグ&ドロップでタスクを管理できる
* 使い方によっては、タスク管理だけではなく自身の振り返りにも使える
* ラベルもつけることができる
* 背景も変えることができて楽しい

#### もうちょっと頑張りたい
* クリックしたらすぐに課題を追加することはできるが、その分誤って課題を追加しかけてしまう

## ソース管理
### GitHub Enterprise
#### よかったところ
* 個人的にGitHubに慣れてたから使いやすかった
* ソースコードの差分がわかる
* ソースコードで指摘された箇所を修正した時にコメントが一緒に閉じられるのがいい
* コマンドのみでissueをcloseにすることができるから、GUIよりCUIの人は楽しいと思う
* ラベルを自由につけられて楽しい
* 草が生える！！！！！！目に見えてどれくらい頑張ったかがわかる。

#### もうちょっと頑張りたい
* 英語が苦手な人は頑張らねばならない

### Backlog Git
#### よかったところ
* Backlogのみで、タスク・ソース管理が網羅できる
* 差分がわかる

#### もうちょっと頑張りたい
* 草が生えないので、どのくらい頑張れたのが可視化できない
* コメントがきたらいちいち通知がくるので、ちょっとうるさい(そもそもコメントがこないくらいのいいコードを最初からかけたらいいが...)

### bitbucket
#### よかったところ
* 5ユーザーまでだったら非公開リポジトリは無制限に作れる

#### もうちょっと頑張りたい
* 「却下」ってなんだ......

### SVN
#### よかったところ
* 亀が少し憎たらしくもかわいい

#### もうちょっと頑張りたい
* 速度が遅い、重たい
* 操作に慣れるまで時間がかかる
Visual Studio > Taskクラス > キーワード

```txt:動作環境
Windows 8.1 Pro (64bit)
Microsoft Visual Studio 2017 Community
Sublime Text 2
```

関連: [Visual Studio | WPF > 非同期処理 > Link: ざっくりマルチスレッド(非同期処理)](https://qiita.com/7of9/items/5f9d900f01d6e6afc703)

[Task クラス](https://msdn.microsoft.com/ja-jp/library/system.threading.tasks.task(v=vs.110).aspx) @ MSDN

上記の内容のうち、気になったのは以下のキーワード。

- executes asynchronously
- Statusプロパティ: [link](https://msdn.microsoft.com/ja-jp/library/system.threading.tasks.task.status(v=vs.110))
- Task.Run(): .NET Framework 4.5以降
- TaskFactory.StartNew(): .NET Framework 4以降
- creationとschedulingの分離
- AggregateException: [link](https://msdn.microsoft.com/ja-jp/library/system.aggregateexception(v=vs.110).aspx)
- Task.Wait()
- Task.Wait(Int32)
- Task.Wait(TimeSpan)
- Task.Wait(CancellationToken)
    - 詳細説明は別ページ: [link](https://msdn.microsoft.com/ja-jp/library/dd321315(v=vs.110).aspx)
    - [実装してみた](https://qiita.com/7of9/items/7b423908b8765e68b424)
- Task.WaitAll()
- Task.WaitAny()
- .Flatten().InnerExceptions
- culture: .NET Framework 4.6以降
- `Action <T>` delegate
- an Action delegate
- Task.RunSynchronously(): [link](https://msdn.microsoft.com/ja-jp/library/dd321435(v=vs.110).aspx)
相談）多言語webアプリの仕様について

今、多言語対応のwebアプリケーションを作っています。趣味とか勉強みたいなもんなので、特に切羽詰まっているわけではないですが、多言語対応で悩んでいるので相談に乗って頂けると嬉しいです

# 前提

- PHPのみで、フレームワークやライブラリは使っていない

# 現状
英語と日本語で単語の順番が入れ替わることがあるため、`$user_name.'は'.$enemy.’の首をはねた！'`みたいな単純な文字列結合では対応しきれないと考えています。

そこで、サイト上に表示する文言はすべてtb_languageに保管することにしました。

| id | en                                 | ja                              |
|:--:|:-----------------------------------|:--------------------------------|
|  1 | \$username has decapitated $enemy. | \$username は $enemy の首をはねた！ |

格納する文字列は、後で置き換えるべきところを`$username`のように残しておき、データベースから取り出した後で、`str_replace()`を使って書き換えています。

``` 
$result = str_replace('$username',$username,Dao->select('SELECT ja from `tb_language` where id = 1;'))
````

# 疑問

- 「db内の文字列を展開する」方法がないか探したのですが、見つかりませんでした（リテラル内からの展開はありますが）。何か、スマートな手法があるのでしょうか？
- 上記の方法では、変数の数だけ`str_replace()`を繰り返すことになり、あまり効率的といえない気がするのですが、何か良い手があるのでしょうか？

ご存じの方がありましたらコメントを頂けると嬉しいです。
Chromeで動くMIDIコン作ってみた🕹

# 作ったもの
ブラウザで使えるMIDIコンです。
https://onomuta.github.io/nanokon
![Capture 2018-05-26 11.05.20.png](https://qiita-image-store.s3.amazonaws.com/0/62787/f3a3ddd9-c4f7-93df-f945-826e89f7fd1c.png)
↓中身を見たい方はこちら
https://github.com/onomuta/nanokon

### 動作環境
MacOS 10.12.6 + Chrome 63.0.3239.108
JQueryとかの関係でモバイル端末では動きません。

# きっかけ
普段は趣味でVJをしています。
VJのオペレーションにMIDIコンは必須なのですが、
操作の仕込みをするときにいちいちMIDIコンを用意するのはめんどくさいです。

そこで、
「どうやらwebMIDIというものを使えば仮想のMIDIコンを作れそうだぞ！
ブラウザで使えればいつでも使えて便利そう！」
と思ったのがきっかけで開発をしました。

# 仕様
実際のVJではフィジカルなMIDIコンを使用するため、
その動作を再現するものが必要。

今回はKORGの[nanoKONTROL2](http://www.korg.com/jp/products/computergear/nanokontrol2/)のレイアウトを再現しています。
ナノコンいいよね！
<img width="400" alt="スクリーンショット 2017-12-17 15.53.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/62787/8fb81d49-76c6-b342-561e-9764e8155209.png">


# 中身
[JavaScriptだけでMIDIで遊べる！最高に乱暴なWeb MIDI API利用方法](https://qiita.com/tadfmac/items/e26fdf1034ad6dad4504)
↑こちらをかなりコピp..参考にして開発させていただきました。
MIDIメッセージ（`B0　01　7F`みたいなやつ）とかさえも知らなかったんですが
シンプルなコードでとても勉強になりました。

outputsの中から出力先のポートに値とかを送っています。
自信はないですが一応動いたので、まあよし。。。

```ruby:script.js
function sendCC(cc, val){
  if(output){
    output.send([0xB0 + ch - 1, cc, val]);
  }
}
```

# 使い方
自分で使用しているときには気づかなかったのですが、
webMIDI使用するためにはVirtual MIDIの出力先を設定してあげる必要があり、
Virtual MIDIのポートがない場合にはPC側で用意してあげる必要があるようです。
（すみません、この辺正確には分かりません！！）
<img width="588" alt="スクリーンショット 2017-12-18 23.55.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/62787/6dd1cd70-9e91-111c-0fd5-38f5e3d7e891.png">

### Resolumeの設定
<img width="824" alt="スクリーンショット 2017-12-19 0.08.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/62787/7ba6d9da-63d0-571a-3ebc-babcee065b1b.png">

### winの場合
winでは一般的にloopMIDIというソフトを使用するようです。

# その他
今回開発するときのデバッグツールとして[Pocket MIDI](http://www.morson.jp/pocketmidi-webpage/)というソフトが便利でした。シンプルで使いやすい！
<img width="250" alt="スクリーンショット 2017-12-20 11.09.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/62787/6416cca3-3543-4150-0419-4a0e8a433953.png">



# 参考
https://qiita.com/tadfmac/items/e26fdf1034ad6dad4504
https://weblike-curtaincall.ssl-lolipop.jp/portfolio-web-sounder/webaudioapi-devices/web-midi-api
https://html5experts.jp/ryoyakawai/16787/
Google Apps Scriptのプロジェクト内のファイルを並び替える

# 概要
Google Apps Script (GAS)を使って開発する際、多くの場合はプロジェクトを開いたときに起動するスクリプトエディタ上で行っているかと思います。スクリプトエディタの左側にはファイルのリストがあります。``.gs``や``.html``、最近では``.json``もあります。スクリプトが大きくなっていくとファイル毎に分離して管理することがあるかと思われます。スクリプトやHTMLを新規でプロジェクトへ追加すると、左側にあるリストの最後尾に追加されていきます。リスト内に複数のファイルができたとき、ファイルを並び替えたいと考えることがあります。この投稿では、プロジェクト内のファイルを並び替える方法についてご紹介します。

# 方法
## 1. 一時的な並び替え
1. 最近のアップデートによってスクリプトエディタの上部のメニューバーで「表示」→「アルファベット順にファイルを並び替える」にチェックを入れることでファイルをアルファベット順に並び替えることができるようになっています。これは再度プロジェクトを読み込みしてもチェックが入ったままのため、アルファベット順に並んだままです。チェックを外すと元に戻ります。
1. プロジェクト内にフォルダを作成することでファイルをドラッグ＆ドロップして並び替えることができるようにもなっています。しかし、これはプロジェクトを閉じて再度読み込みすると元に戻ってしまいます。
1. プロジェクト内に作成したフォルダに入っているファイルであればドラッグ＆ドロップで並び替えを行うことで、プロジェクトを再読み込みしても並び替えた状態は維持されることが分かりました。（[参考](https://plus.google.com/+KanshiTanaike/posts/dsRKmSNYcch)）ただし、これには制限があります。ブラウザのCookieをクリアすると並び替えたファイルは元に戻ってしまいます。このような制限付きであればデフォルトの状態でファイルを並び替えることは可能です。

## 2. 永続的な並び替え
次のような流れでプロジェクト内のファイルの並び替えが実現できることを確認しました。

1. プロジェクト内の全ファイルを取得する。
1. 取得したファイルは、各ファイルを要素とした配列を含んだオブジェクトになっているのでその配列を好きな順に並び替える。
    - このとき、IDは削除し、ファイル名はそのままにする必要があります。
1. プロジェクト内で重複しないファイル名を持ったファイルでプロジェクトを上書き更新する。
    - これにより、プロジェクト内のファイルは追加した１つのファイルのみになります。
1. 並び替えたオブジェクトでプロジェクトを上書き、あるいは新規プロジェクトとして作成する。

このようにして並び替えたファイルは、プロジェクトの再読み込みやCookieのクリアで元に戻ることはありません。

**この方法には注意点があります。もしも並び替えたファイルで既存プロジェクトを上書きすると、プロジェクト内のファイルを総入れ替えすることになるため、各ファイルの履歴がなくなってしまいます。<u>並び替えたファイルを新規プロジェクトとして作成する場合は問題ありません。</u>**

# 並び替え用のツール
## GUI
上記の流れを行うアドオンを作成しました。リポジトリは[こちら](https://github.com/tanaikech/RearrangeScripts)です。

![demo_gui.gif](https://qiita-image-store.s3.amazonaws.com/0/133383/1589eae9-8d47-2849-945b-d3878cef6657.gif)


### 導入方法
1. [アドオンが公開されているページ](https://chrome.google.com/webstore/detail/rearrangescripts/ndaicidjkbcpajgejcclgfdcncpoekml?utm_source=permalink)へ移動する。
1. "+無料"のボタンをクリックする。
1. Googleへのログイン画面が表示されるのでログインする。
1. スプレッドシートが自動で開いて「アプリの使用を開始」のダイアログが表示されるので続行ボタンを押して認証を行う。
1. インストールが終わると、メニューバーのアドオン部分に簡単な起動方法が出力されるので、アドオン -> RearrangeScripts -> Rearrange scriptsを選択してサイドバーを起動する。

起動後はデモンストレーションにあるようにファイルを選択してドラッグ＆ドロップによりファイルを並び替えて保存します。

- "Overwrite to project"にチェックを入れていると、開いているプロジェクトへ並び替えたファイルを上書きします。
- "Create as new project"にチェックを入れていると、並び替えたファイルは新規プロジェクトとしてルートフォルダに作成されます。

## CLI
Goを使って作成すると下記のようになります。リポジトリは[こちら](https://github.com/tanaikech/ggsrun/blob/master/help/README.md#rearrangescripts)です。

![demo_cli.gif](https://qiita-image-store.s3.amazonaws.com/0/133383/c69cc728-7aac-8a9b-bf15-89e7aada6127.gif)

### 導入方法
下記のどちらからも導入方法をみることができます。

- [こちら（日本語）](https://qiita.com/tanaike/items/f5249ddb6bdedb9b85ae)
- [こちら（英語）](https://github.com/tanaikech/ggsrun)

# ファイル並び替えに対するマニフェストへの影響
マニフェストファイル（appsscript.json）自体は他のファイルと一緒に並び替えを行うことができることを確認しています。一方、削除できないようになっているため、ユニークファイル名で上書き更新しても影響されません。

この情報がお役に立ちましたら幸いです。
Travisのandroid.componentsで毎回100秒かかっていたのを0.01秒にできた話

もともとは[こちらのMediumのエントリ](https://medium.com/@bod/cache-your-android-sdk-with-travis-c816b9264708)で紹介されていた高速化を試そうと思ったのがきっかけで、色々試行錯誤して結構高速化できたのでその経緯を残しておきます。

# まずは紹介された方法をためした
Mediumのエントリの手法は意訳すると
> sdkディレクトリをまとめてcacheしちゃえばacceptが高速化されて速くなるぜ！

というもの。で、その通り更新してみると...以下の問題が発生した。

1. キャッシュを作る時に400秒くらいかかってる。(デフォルトの180秒タイムアウトに引っかるので`cache.timeout`に600秒セットした)
2. 作ったキャッシュがでかい。2GB超えてる。
3. キャッシュを再展開する時に400秒くらいかかってる。

この時点で「あれ？遅くなってね？」と思ったがsdkディレクトリをまるごとキャッシュするということが辛い様子。一方でそもそもの`android.components`でかかっている時間がわからなかったので調べてみた。

# `android.components`でかかる時間
単純に修正前に成功していたTravisビルドのログにある`Installing Android dependencies`に出てくる秒数をたしたところ約100秒だった。
（秒数はそれぞれの`android.components`設定によって変わるのでご参考まで）

ただし、`Installing Android dependencies`はキャッシュの再展開をしていると思われる`Setting up build cache`よりも前に実行されるのでどんなに頑張ってもキャッシュを効かせることができない。

<img width="464" alt="Screen Shot 2017-12-19 at 19.55.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/60457/6bdbdc6d-af9d-816a-fa44-249ba0ceff86.png">


# sdkmanagerで自前acceptを行う
前述のMediumのエントリの中で触れられているが、もともとlicenseのaccept処理は`sdkmanager`を使うことでコマンドライン実行でき、それを`install`で行い、結果をキャッシュしてしまえ！というもの。
ということは、すでにTravisのOSイメージにインストールされている`sdkmanager`を使いつつ、accept結果をキャッシュできればよさそう、ということでトライ。

こんな感じ。

```bash
echo y | $ANDROID_HOME/tools/bin/sdkmanager 'platform-tools' > /dev/null
```

これを使って`android.components`でacceptしていたものと同じものを`sdkmanager`で処理するシェルスクリプトを作り実行。一旦キャッシュなし。

<img width="1286" alt="Screen Shot 2017-12-20 at 10.55.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/60457/66b1506e-515e-b1be-1640-54b1645e659c.png">

約200秒。

うーん、何が違うのか分からないけど`android.components`よりも遅い。でも初回だけなら我慢できそうな気がするので次のステップへ。

# accpet結果をキャッシュする
`sdkmanager`スクリプトを使いつつ、キャッシュを効かせるためにymlに以下を追加。

```yaml:.travis.yaml抜粋
cache:
  directories:
    # Android SDK licenses
    - ${ANDROID_HOME}/licenses/
```
そして、`sdkmanager`スクリプトに`${ANDROID_HOME}/licenses/`が存在していたらaccept処理をスキップするよう分岐も追加。

一度ビルドをしてキャッシュさせて、２回目...

<img width="1286" alt="Screen Shot 2017-12-20 at 10.56.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/60457/c15423c1-b75e-ba76-a480-e9d5839ee56a.png">


![installtime.png](https://qiita-image-store.s3.amazonaws.com/0/60457/1e344a02-3eb1-313e-d2c9-688e2653780a.png)

0.01秒。（acceptスキップしたからそりゃ早いよね)

その後のgradleタスクでもエラーはなく、念のため吐き出されたapkは実機に配信してもちゃんと使えています。

ビルド全体ではもともと11分~12分かかっていた処理（[Travis build stages](https://docs.travis-ci.com/user/build-stages/)も使っているので`android.components`が２回走ってた）ものが8〜9分で完了するようになりました。

# まとめ
以下のことを行うことでlicenceのaccept処理にキャッシュを効かせることができ、毎回100秒かかっていたところを0.01秒にできました。

1. `android.components`を消して、`sdkmanager`を使ってacceptするスクリプトを`install`で実行する
2. `${ANDROID_HOME}/licenses/`をキャッシュする

`sdkmanager`スクリプトは参考までに[こちらのGist](https://gist.github.com/gki/d45e541b5ac62871d5d019a4d15bd8d2)にアップしておきました。。
新卒が選ぶ「初めに抑えておくべきThymeleaf のポイント」

# **はじめに** 

この投稿は[アイスタイル Advent Calendar 2017] (https://qiita.com/advent-calendar/2017/istyle)の20日目の記事です。
皆さんこんにちは。皆さんは『Thymeleaf』使っていますか？

本記事は今年度4月に入社したjavaも初めましてな17新卒の私が、一からjavaを学び、Springを覚え、その最中に出会った『Thymeleaf』を「初めにこれだけ理解しておくといいよ！」と噛み砕いて紹介します！


### そもそもThymeleafって？
ざっと紹介しますと、

- 読み方：「タイムリーフ」
- Javaで作られたテンプレートエンジン
- Spring Bootで使用推奨されている
- JSPの代替技術として近年注目されている
- 純粋なHTMLとしてテンプレート記述可

ググると「チートシート」として書かれているサイトがたくさん出てきます。Thymeleafは多機能且つチートシートもボリューム盛りだくさんです。

ですので、著者を始めとして、初めて学習する人にはちょっと重たいなあと感じた為、そんな方向けに本記事を執筆することに致しました。


# **【 4点の記法 】**

初めに、具体的なテンプレート記述に入ります。
大きく4点の記法があります。

#### **1. メッセージ式　#{...}**
```php:sample.properties
backToTop = Back to top
nothingToShow = No users to show.
```

```html:sample.html
<p th:text="#{nothingToShow}">表示するユーザーがありません</p>

<a href="../../index.html" th:href = "@{/}" th:text = "#{backToTop}">トップページに戻る</a>
```

あらかじめ用意しておいたメッセージをVIEWへ表示するために使われます。
`th:text` 属性は、画面にメッセージを表示するために使われる属性です。

因みに、hello.htmlに記述されている「表示するユーザーがありません」や「トップページに戻る」などのメッセージは、ブラウザで直接開いた時のための仮のメッセージで、サーバーで実行時はプロパティファイルのメッセージで上書きされます。


#### **2. 変数式　${...}**
```html:sample.html
<tr th:each = "user : ${userList}">
    <td th:text = "${user.id}">55</td>
    <td th:text = "${user.name}">Shunsuke Matsui</td>
</tr>
```
Controllerから値を変数に設定して、Viewからその変数の値を表示します。
${...}の部分が変数式です。
ここも `th:text` を使っているので、タグで挟まれた部分（「55」など）は、サーバー上で実行されたときには置き換えられます。あくまでも仮置きです。

#### **3. 選択変数式　{...}**
```html:sample.html
<tr th:each = "user : ${userList}" th:object="${user}">
    <td th:text = "*{id}">55</td>
    <td th:text = "*{name}">Shunsuke Matsui</td>
</tr>
```
先程の変数式では${...}でuserと2回記述していた作業を `<tr>` 開始タグで挟んでいる部分では、`${user.id}` ではなく `*{id}` と簡略化して書くことができます。

#### **4. リンク式　@{...}**
HTMLなどを書いていてけっこう面倒なのが、リンク/CSS/JS/画像などの「パスの記述」ではないでしょうか。

絶対パスで指定するためにコンテキストパスを毎回書いたり、相対パスで書くとプロジェクトのフォルダ構造と、サーバー上で実行される時のパスが違っていて、うまくパスを指定するのが難しかったりします。

こういった問題の対策として、Thymeleafにはリンク式という記法があります。

```html:sample.html
<link rel = "stylesheet" href = "../../css/style.css" th:href = "@{/css/style.css}">
<link rel = "stylesheet" href = "../../css/style.css" th:href = "@{/css/style.css}">
```

なぜ、上書きされて消えてしまうhref属性を書くのかというと、直接ブラウザでHTMLを開いてもCSSが適用されるようにするためです。


# **【テンプレートの記述】**
**条件分岐（th:if、th:unless)**

```html:sample.html
<table border = "1" th:unless = "${#lists.isEmpty(userList)}">
    ...
</table>

<p th:if = "${#lists.isEmpty(userList)}">表示するユーザーがありません。</p>
```
`lists`の部分はユーティリティオブジェクトというもの（後述）なのですが、ざっくり言うと、userListが空でなかったら<table>要素の部分のみが、空だったら `<p>` 要素の部分のみが出力されます。

`th:unless` は変数式で指定した条件がfalseの時に出力され、`th:if` は変数式で指に定した条件がtrueの時に出力されます。



**繰り返し（th:each）**

```html:sample.html
<tr th:each = "user : ${userList}" th:object = "${user}">
    <td th:text = "*{id}">111</td>
    <td th:text = "*{name}">Yumi Wakatsuki</td>
</tr>
```

上記の場合だと、th:each属性を記述している `<tr>` 要素自体が繰り返し出力されます。

構文は `th:each="コレクションから取り出した要素の変数名 : ${コレクションの変数名}">`です。

# **その他の記法**
**コメント（<!--/* */-->）**

癖で普通のHTMLのコメントをしてしまうとレスポンスに含まれて返ってきてしまうので気をつけましょう。


# **まとめ**

以上、Thymeleafちゃんを理解するのに最低限必須な部分の紹介でした！
デザイナーさんにも余白の優しさを担保でき、双方が円滑に作業を進めることができるやさしい世界がThymeleafちゃんだということがわかりました。少しでもご参考になれれば幸いです！

明日は17卒同期の [@nagais] (https://qiita.com/nagais1711)　の記事です。
お楽しみに！！
ノンプログラミングで「OK, Google LEDつけて」

この記事は[熊本高専Advent Calender2017](https://adventar.org/calendars/2149) 20日目の記事です。
# Wio Node買いました
ある人に、「OK, Google LEDつけて」って言ったら手元のLEDが点灯するデモを見せられて、
「ハンダ付けなし、ノンプログラミングでできますよ」という殺し文句に殺されました。
そして、1時間くらいで出来てしまったのでその記録です。
# とりあえずセットアップ
セットアップからWio公式アプリでの接続までは、公式ドキュメントがあるのでそちらを参照。
http://wiki.seeed.cc/Wio_Node/
ハマり要素はほぼないですが、SeeedのアカウントをGoogle+連携で作ってしまうと、IFTTTにつなぐ時にパスワードが通らなかったです。
※パスワード再発行にて解決しました。

#「OK, Google LEDつけて」
公式アプリでAPIがちゃんと動いていることを確認できたら、さっそく「OK, Google LEDつけて」を設定します。

トリガーにGoogle Assistantチャンネルの「Say a simple phrase」を設定します。
パラメータは、
- "What do you want to say?"(トリガーにする言葉)
- "What do you want the Assistant to say in response?"(返してくれる言葉)
- "Language"を"Japanese"に設定するのを忘れずに。
を指定します。
![ifttt_ga.png](https://qiita-image-store.s3.amazonaws.com/0/195932/7b757e36-4d88-1e48-c179-134747eee98b.png)

アクションには、「Seeed」チャンネルの「Drive any Grove」を指定します。
パラメータは、
- "Which function on Grove?"にWio公式アプリで確認できるONOFF function
- "First Parameter (optional)"に1
を指定します。
![ifttt_sd.png](https://qiita-image-store.s3.amazonaws.com/0/195932/0ceb312a-2c10-03f6-ffd4-14de30c51947.png)

ちなみにIFTTTでチャンネルを「Seeed」で検索すると、「Seeed」チャンネルと「Seeed Wio」チャンネルが表示されますが、「Seeed」チャンネルでちゃんと動作しました。
「OK, Google LED消して」も設定しておくと楽しいです。

# 動いた！
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">OK Google LEDつけて <a href="https://t.co/lhLXeZEWgf">https://t.co/lhLXeZEWgf</a> <a href="https://twitter.com/YouTube?ref_src=twsrc%5Etfw">@YouTube</a>より</p>&mdash; そーまあくぃーとぅー (@aksoma) <a href="https://twitter.com/aksoma/status/943107775181209600?ref_src=twsrc%5Etfw">2017年12月19日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
ということで、ハンダ付けなし、ノンプログラミングで「OK, Google LEDつけて」ができました。
IoT？なんぞそれ？という諸兄もぜひお試しあれ。
cesiumでleaflet

#概要
cesiumでleaflet連動してみた。

#写真
![image.png](https://qiita-image-store.s3.amazonaws.com/0/18104/2171c12e-07e1-e64c-0ec2-92fbe3551f34.png)


#サンプルコード

```
var viewer = new Cesium.Viewer('cmap');
var map;
viewer.canvas.addEventListener('click', function(e) {
    var mousePosition = new Cesium.Cartesian2(e.clientX, e.clientY); 
    var ellipsoid = viewer.scene.globe.ellipsoid;
    var cartesian = viewer.camera.pickEllipsoid(mousePosition, ellipsoid);
    if (cartesian) 
    {
        var cartographic = ellipsoid.cartesianToCartographic(cartesian);
        var lon = Cesium.Math.toDegrees(cartographic.longitude).toFixed(6);
        var lat = Cesium.Math.toDegrees(cartographic.latitude).toFixed(6); 
        pano(lat, lon);
    }
    else
    {
        alert('Globe was not picked');
    }	
}, false);
viewer.camera.flyTo({
    destination: Cesium.Cartesian3.fromDegrees(139.60, 35.60, 100000.0),
});
var osm = L.tileLayer('http://tile.openstreetmap.org/{z}/{x}/{y}.png', {
        attribution: 'osm', 
        minZoom: 2, 
        maxZoom: 17 
    });
var map = L.map('gmap', {
    center: new L.LatLng(35.60, 139.60),
    zoom: 10,
    layers: [osm]
});
function pano(lat, lon) {
    map.setView([lat, lon], 10);
}
    
```

#成果物
http://jsdo.it/ohisama1/qGyT

以上。
2018年8月からtargetSdkVersionをAPIレベル26（Android 8.0）以上にする必要がある

[Improving app security and performance on Google Play for years to come
](https://android-developers.googleblog.com/2017/12/improving-app-security-and-performance.html)より
([日本語版](https://developers-jp.googleblog.com/2017/12/improving-app-security-and-performance.html))

【要約】
・2018年8月：新規でリリースするアプリはAPIレベル26（Android 8.0）以上をターゲットにする必要があります。
・2018年11月：既存のアプリのアップデートにはAPIレベル26以上をターゲットにする必要があります。
・2019年以降：毎年targetSdkVersion要件が上がって行きます。
Amazon Linuxにdiffコマンドをインストールする

# Amazon Linuxにdiffコマンドをインストールする

備忘録的に投稿します。

## 環境
```
$ cat /etc/system-release
Amazon Linux AMI release 2017.09
```

## インストール手順
```
sudo yum install diffutils
```
colordiffをインストールしたい場合は↓。

```
wget http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
sudo rpm -ivh epel-release-6-8.noarch.rpm
sudo yum install --enablerepo=epel colordiff
```

こちらからは以上です！
EditTextメモ

## 画面表示時にソフトキーボードを表示させない

参照：https://qiita.com/hishida/items/8bf1aa28ef62ef22a7f9

## 下線を非表示にする

```android:background="#00000000"``` を属性に追加

```xml
<EditText
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:background="#00000000"
     android:hint="何をお探しですか？"/>
```

## EditText以外をタップされたらソフトキーボードを非表示にする

Activityで```dispatchTouchEvent()```をオーバーライドする

```java
override fun dispatchTouchEvent(event: MotionEvent): Boolean {
        if (event.action == MotionEvent.ACTION_DOWN) {
            val v = currentFocus
            if (v is EditText) {
                val outRect = Rect()
                v.getGlobalVisibleRect(outRect)
                if (!outRect.contains(event.rawX.toInt(), event.rawY.toInt())) {
                    v.clearFocus()
                    val imm = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
                    imm.hideSoftInputFromWindow(v.windowToken, 0)
                    return false
                }
            }
        }
        return super.dispatchTouchEvent(event)
    }
```

## フォーカスされたら自動でソフトキーボードを表示する

```java
        editText.setOnFocusChangeListener(new OnFocusChangeListener() {
            @Override
            public void onFocusChange(View v, boolean hasFocus) {
                editText.post(new Runnable() {
                    @Override
                    public void run() {
                        InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
                        imm.showSoftInput(editText, InputMethodManager.SHOW_IMPLICIT);
                    }
                });
            }
        });
        editText.requestFocus();
```

参考：[Show soft keyboard automatically when EditText receives focus](https://turbomanage.wordpress.com/2012/05/02/show-soft-keyboard-automatically-when-edittext-receives-focus/)

## キーボードの検索ボタンタップを検知する

EditTextに```imeOptions```、```inputType```を以下の様に設定

```xml
<EditText
      android:imeOptions="actionSearch"
      android:inputType="text"/>
```

EditTextにリスナーをセット

```java
editText.setOnEditorActionListener(new TextView.OnEditorActionListener() {
    @Override
    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
        if (actionId == EditorInfo.IME_ACTION_SEARCH) {
           // Your piece of code on keyboard search click 
            return true;
        }
        return false;
    }
});
```

参考：[detect keyboard search button](https://stackoverflow.com/questions/9948127/detect-keyboard-search-button)
今更fastTextを触って感動する


文章分類タスクをやってみようと思いfastTextを試したところ、１日もかからずにモデルがつくれたので感動しました。

fastTextを動かす環境を作成
---

自分はDockerを使ってサクッと用意しました。

docker-compose.yml


```
version: '3'
services:
  fasttext:
      command: /bin/bash
      image: xebxeb/fasttext-docker
      volumes:
       - ./fasttext/data/train:/data 
       - ./fasttext/data/result:/results
       - ./fasttext/data/test:/mytests

```

以下のコマンドを打つと、image内にログインにして

```
$ docker-compose run fasttext
```

fasttextのコマンドは以下から利用できます。

```
$ /fasttext
```

利用したイメージの詳細は下記から
https://hub.docker.com/r/xebxeb/fasttext-docker/


学習データ作成
---

結論からいえば、下記のようなデータが作成できれば準備完了です。

```
__label__ラベル, 分かち書きした文章
```

例：データのイメージ

```
__label__男性が書いた文章, 私 は ガンダム が 好きだ\n
__label__男性が書いた文章, 私 は ザク が 好きだ\n
__label__男性が書いた文章, 私 は ケンプファー が 好きだ\n
__label__男性が書いた文章, 私 は サザビー が 好きだ\n
__label__女性が書いた文章, 私 は コウ・ウラキ が 好きだ\n
```

ちなみに私は分かち書きをするために、mecabを利用しました。


モデル作成
---

さきほどつくった学習データを利用。

~~~
$ /fasttext supervised -input 学習したい内容がはいったテキストファイル -output 出力先のディレクトリ -dim 50 -lr 1.0 -epoch 25
~~~

学習時に指定できる`-dim`など他のパラメータは[fastTextの公式Githubページ？](https://github.com/facebookresearch/fastText)に書いてあるのでチューニングはここから。

学習が終わると以下の表示がされます。

```
Read 7M words
Number of words:  144197
Number of labels: 2
Progress:  100.0% words/s:   6276258 lr:  0.000000 loss:  0.216902 eta:   0h 0m
```

そして`-output`パラメータで指定したディレクトリに、.binファイルと.vecファイルができあがります。


予測
---

予測したいテキストを用意します

```
私は ニナ・パープルトン が 嫌いだ
```

```
$ /fasttext predict-prob outputで指定したディレクトリ/.bin テキストファイル
```

これを実行すると予測結果が帰ってきます。

```
__label__女性が書いた文章, 0.9965
```

感想
---

早い。楽ちん。


参考にさせていただいた記事、サイト
---

* https://qiita.com/masuidrive/items/c6d45d264c7d7bdff6ac
* https://qiita.com/yamitzky/items/80be0ec14c95ac793958
tkinterでthread

#概要
tkinterでthreadやってみた。

#写真

![image.png](https://qiita-image-store.s3.amazonaws.com/0/18104/0a379096-a128-4b9f-e733-5c29f071eb19.png)


#threadでないやつ

```
from tkinter import *
import time

def draw():
	str.set(time.strftime('%I:%M:%S'))
	root.after(1000, draw)

root = Tk()
str = StringVar()
str.set('')
Label(textvariable = str).pack()
draw()
root.mainloop()

```

#threadなやつ

```
from tkinter import *
import time
import threading

def _delete_window():
	try:
		flg.clear()
		time.sleep(2)
		root.destroy()
	except:
		pass

def draw():
	while flg.is_set():
		str.set(time.strftime('%I:%M:%S'))
		time.sleep(1)

flg = threading.Event()
flg.set()
root = Tk()
root.protocol("WM_DELETE_WINDOW", _delete_window)
str = StringVar()
str.set('')
Label(textvariable = str).pack()
t = threading.Thread(target = draw)
t.start()
root.mainloop()

```

以上。
Latest JSON (RFC 8259)

# RFC 8259 (JSON data format)

JSON の新版が[公開されました](https://www.rfc-editor.org/info/rfc8259)。
復習を兼ねて、変更点とおさらいをまとめておきました。

## 従来からの変更点

- JSON は ECMA-404 と RFC8259 で定義されているが、今後は完全に互換性があるものとして扱われる
- JSON が最新の UNICODE を参照するようになった。つまり UNICODE の仕様変更で JSON も影響を受ける
- string は UTF8 が必須に

## JSON とは

- JSON はポータビリティを意識して設計された JavaScript のサブセット
    - XML にくらべて手軽に利用できるため、ブラウザ界隈から利用が始まった。現在では広く利用されている
    - JSON の object は JavaScript における Object リテラルである、array も同様に Array リテラルである
    - string, number, boolean, null といった値や型の扱いも JavaScript のそれに準じる
- literal and types
    - string は `"` で始まり `"` で終わる。UTF8文字列である
        - 文字列内に直接記述できない以下の文字(列)はエスケープしなければならない
            - control characters (U+0000 - U+001F)
            - quotation mark (`"` U+0022)
            - reverse solidus (`\` U+005C)
        - 全ての文字はエスケープ可能である
        - エスケープ表現は、`\` で始まり小文字の`u`に続く16進数でコードポイントを記述する
        - 基本面に存在しない文字は、12文字のUTF16サロゲートペアとして記述する
    - number は IEEE 754 である
        - 指数表現も可能であるが、精度は実装に依存し不定である
            - 実運用に際しては IEEE 754 binary64 (double precision) numbers 相当の精度を期待してもよい
        - 整数表現における整数部がゼロの場合であってもゼロは省略できない
        - 整数表現における整数部のプラス記号は記述不能。マイナス記号は記述可能
        - 整数表現における整数部の先行するゼロは不正である
        - Infinity と NaN は使用できない
    - boolean は `true` または `false` と記述する。全て小文字である
    - null は `null` と記述する。全て小文字である
    - object は `{` で始まり `}` で終わる。順序を考慮しないname/valueペアのコレクションである
      - 同じ name が複数回使用された場合の結果は実装依存であり不定である
    - array は `[` で始まり `]` で終わる。順序を考慮したvalueのコレクションである
- name and value
    - name は object の key に相当する。name は string である
    - value は object の value と array の value に相当する。value は string, number, boolean, null, object または array のいずれかである
    - object は name と value をペアとして扱う
- separator
    - セパレータには記号(`[]{}:,`)を使用する
- whitespace
    - ホワイトスペースは(0x20, 0x09, 0x0A, 0x0D)の何れかである
    - name や value の前後に複数のホワイトスペースを含んでいても良い。それらはデコーダが適切に無視する
    - セパレターや前後に複数のホワイトスペースを含んでいても良い。それらはデコーダが適切に無視する
    - 文字列の前後にもホワイトスペースを含める事ができるが、文字列の意味が変化する場合は例外である
- コメント
    - 記述できない
- JSON の mime type は "application/json" である
- JSON の先頭にBOM(U+FEFF)を付与するのは禁止。デコーダはBOMを無視してもよい

## フォーマット例

以下はいずれも適切な array である。末尾の余計なカンマ(通称ケツカンマ)は許可されない。

- `[]`
- `[ 123 ]`
- `[ 123, "456" ]`

以下はいずれも適切な object である。ケツカンマは許可されない。

- `{}`
- `{ "name1": 123 }`
- `{ "name1": 123, "name2": "456" }`

以下はいずれも適切な string である。

- `"abc"`
- `"\u0061\u0062\u0063"`   # "abc"
- `"\u005C"`               # "\"


## より詳しく知りたい方は

[事実上最後のJSON仕様「RFC 8259」と「ECMA-404 2nd Editon」公開。UTF-8エンコード必須に](http://www.publickey1.jp/blog/17/jsonrfc_8259ecma-404_2nd_editonutf-8.html) を読了後に、
[原文](https://www.rfc-editor.org/info/rfc8259) を参照してください。
dein.vimからpackageへの移行手順

# 概要
[Vim Advent Calendar 2017 の20日目の記事](http://tyru.hatenablog.com/entry/2017/12/20/035142)を見て、移行してみました。

# 環境
- windows10
- GVIM 8.0.596

# 使用しているリポジトリの取得

deinでは、`~/.cache/dein/repo`ににクローンしたGitがあるので、そこから一覧を作成します。

```bat
cd ~\.cache\dein\repos\github.com
dir /b/s/a .git > a.txt
for /f %i in (a.txt) do git --git-dir=%i remote -v >> repo.txt
```

後は`repo.txt`を`git clone {repo}`できるように修正し、`clone.bat`を作成します。

```bat
git clone https://github.com/cespare/vim-toml.git 
git clone https://github.com/vim-scripts/Align.git 
git clone https://github.com/Shougo/denite.nvim.git 
git clone https://github.com/mattn/emmet-vim.git 
git clone https://github.com/lambdalisue/gina.vim.git 
git clone https://github.com/cocopon/iceberg.vim.git 
git clone https://github.com/Shougo/neomru.vim.git 
git clone https://github.com/Shougo/neosnippet-snippets.git 
git clone https://github.com/Shougo/neosnippet.vim.git 
git clone https://github.com/fuenor/qfixgrep.git 
git clone https://github.com/cocopon/vaffle.vim.git 
git clone https://github.com/tpope/vim-fugitive.git 
git clone https://github.com/nathanaelkane/vim-indent-guides.git 
git clone https://github.com/thinca/vim-qfreplace.git 
git clone https://github.com/thinca/vim-quickrun.git 
git clone https://github.com/cespare/vim-toml.git 
```

# リポジトリのClone

windowsでは、`vimfiles`が`packpath`になります。変更する場合は、パスを追加します。

```vim
set packpath+=~/.cache/plugin/vimwork2.vim/vimfiles
```

`vimfiles/pack/plugin/start`に、作成した`clone.bat`を配置し実行します。

# 設定ファイルのコピー

`dein.vim`では、`toml`で作成していましたのでそのまま流用します。

1. tomlからコビーし、`plugin.vim`を作成する。
2. `hook_add`以外の部分をコメントアウトする。

# 設定ファイルの読み込み

packageは、vimrcの後に設定されるので遅延させないとエラーが発生します。`denite#custom#var`でエラーが出て気が付きました。

```vim
autocmd VimEnter * source ~/.cache/plugin/vimwork2.vim/plugin.vim
```

インデントは、先に設定が必要でしたので、`.vimrc`に移動。

```vim
let g:indent_guides_enable_on_vim_startup=1
```

# 更新処理

`git pull`するバッチを作成します。`vimfiles/pack/plugin/start`に、`pull.bat`を配置して実行します。せっかくなので、`for`を使った方法を書いておきます。

```bat
for /d %%i in (*) do git --git-dir=%%i\.git pull
```

# 参考

http://tyru.hatenablog.com/entry/2017/12/20/035142
https://qiita.com/thinca/items/cdc0169e3bcc5a55a5ba
http://h-miyako.hatenablog.com/entry/2016/02/29/211534
PSoC 6 のデュアルコアでＬチカ (3)

これは、[PSoC Advent Calendar 2017]の3日目に突っ込まれた記事です。

##前回のあらすじ
[前回の記事][(2)]では、ふたつのCPUが互いにセマフォを取り合って待ち時間を作ることで、Ｌチカを実現しました。しかし、**Cortex-M4**と**Cortex-M0+**でセマフォの取りやすさに違いがあることから、**Cortex-M4**が連続してセマフォを独占する現象が観測されました。
これを解決するために、セマフォを解放したあと相手にセマフォを取らせるための時間を確保する方法をとっています。「セマフォを取らせるための時間」は**適当に**3&mu;秒と定義したのですが、条件が異なると時間が足りなくなる可能性もあるので、決して確実な方法とは言えません。
今回は、相手方がセマフォを獲得したことを検出して、より確実なＬチカを行います。

##ちょっとだけ変更

コンセプトは、相手方がセマフォを獲得した事を知ることです。そこで、セマフォ関連関数の`Cy_IPC_Sema_Status()`で状態を確認します。**Cortex-M0+**と**Cortex-M4**のそれぞれのプログラムで、セマフォを解放した後の処理を変更します。

```c:main_cm0p.c
        /* セマフォを開放する */
        while (
            Cy_IPC_Sema_Clear(SEMAPHORE_LED, false) != CY_IPC_SEMA_SUCCESS
        ) ;
        /* セマフォが引き渡されるまで待つ */
        while (
            Cy_IPC_Sema_Status(SEMAPHORE_LED) != CY_IPC_SEMA_STATUS_LOCKED
        ) ;
```

```c:main_cm4.c
        /* セマフォを開放する */
        while (
            Cy_IPC_Sema_Clear(SEMAPHORE_LED, false) != CY_IPC_SEMA_SUCCESS
        ) ;
        /* セマフォが引き渡されるまで待つ */
        while (
            Cy_IPC_Sema_Status(SEMAPHORE_LED) != CY_IPC_SEMA_STATUS_LOCKED
        ) ;
```

どちらのCPUでも、同じ記述です。

この方法にも、もちろん問題点があります。

1. セマフォを渡した相手方の処理が短時間で済んでしまいすぐにセマフォを解放した場合、"CY_IPC_SEMA_STATUS_LOCKED"を検出できなくなるので、デッドロック状態が発生します。今回の場合、セマフォを獲得する時間が500m秒と大幅に長いので、この心配はありません。
2. セマフォが引き渡されるまでのあいだ、CPUは遊んでいます。セマフォが他人に獲得されるのを待つようなプログラムは、そもそも書くべきではないでしょう。

次回に向けての課題が出てきたところで、本日はここまで。

##関連文献
[AN215656 – PSoC 6 MCU Dual-Core CPU System Design][AN215656]
[CE216795 - PSoC(R) 6 MCU Dual-Core Basics][CE216795]

##関連記事
[PSoC 6 のデュアルコアでＬチカ (1)][(1)]
[PSoC 6 のデュアルコアでＬチカ (2)][(2)]

[PSoC Advent Calendar 2017]:https://qiita.com/advent-calendar/2017/psoc
[PSoC 6]:http://www.cypress.com/psoc6
[CY8CKIT-062-BLE]:http://www.cypress.com/cy8ckit-062-ble
[AN215656]:https://www.cypress.com/an215656
[CE216795]:https://www.cypress.com/ce216795
[(1)]:https://qiita.com/noritan_org/items/d08f4578a91d63b93c06
[(2)]:https://qiita.com/noritan_org/items/8240f48f81b32b81a179
使用可能なタイム スタンプがタイム サービス プロバイダーによって提供されなかった

お世話になっております。

現在の環境ではNTPサーバーがないため

イベントビューアー＞管理イベントに
警告　Time-Service　36　の
```
使用可能なタイム スタンプがタイム サービス プロバイダーによって提供されなかったため、タイム サービスは 86400 秒間、システム時刻を同期していません。タイム サービスは、タイム ソースと同期できるようになるまで、ローカルのシステム時刻を更新しません。ローカル システムがクライアントの時刻サーバーとして機能するように構成されている場合は、タイム ソースとしてクライアントにアドバタイズすることを止めます。タイム サービスは継続してタイム ソースとの同期を試みます。詳細については、他の W32time イベントのシステム イベント ログを確認してください。'w32tm /resync' を実行すると、時刻の同期を即座に強制実施できます。
```
が溜まりまくってます……


外部に確認行くのが良いのかな……

とメモ失礼します。
[Android Architecture Components]Roomをmulti moduleプロジェクトで扱うとハマった

# 現象
RoomのEmbbededアノテーションを付けたfieldに別moduleのクラスを使うとbuildが通らなくなる

```kotlin
@Entity
class HogeEntity(
    @Primarykey
    val id: Long,
    @Embedded
    val hogeUser: HogeUser 
)

// HogeEntityとは別のmoduleで定義
data class HogeUser(
    val personId: PersonId,
    val name: Name,
    val height: Double,
    val weight: Double,
    val nickName: String
)
```

例えばこのようなクラスでbuildしてみると以下のようなエラーが発生する

```
Error: Entities and Pojos must have a usable public constructor. You can have an empty constructor or a constructor whose parameters match the fields (by name and type).
Tried the following constructors but they failed to match:
Error:HogeUser(PersonId,Name,double,double,java.lang.String) : [arg0 : null, arg1 : null, arg2 : null, arg3 : null, arg4 : null, arg5 : null]
```

# 回避策
1. エラーメッセージに記載されている通りに空のconstructorを定義してsetterでfieldに値を入れてもらうスタイルに変更する 
2. Embedded使うのをやめて手動でEntityのfieldに入れ込む
3. 別moduleにするのをやめて同一moduleで扱う

どれも微妙ですねぇ。。。 :sob::sob::sob:

もし他に解決策などありましたら教えていただけるとありがたいです :bow:

# 参考
https://issuetracker.google.com/issues/67181813
https://stackoverflow.com/questions/47833645/android-room-multi-module-project-in-kotlin
MySQL スロークエリ リンク集

# 概要

毎週木曜にMySQLの勉強会をやっていてその際にリンク集があったら便利だなぁと思ったので投稿。基本的には毎週木曜の朝に追記していく予定。

# Indexについて

- [インデックスを使った高速化(ORDERED BYにインデックスが使われない例)]
(http://d.hatena.ne.jp/LukeSilvia/20080315/1205583930)
- [MYSQLのindexをはるコツ](https://qiita.com/katsukii/items/3409e3c3c96580d37c2b)
- [MySQLのIndexの状況を観察して、効果的なINDEXを考えたい それマグで！](http://takuya-1st.hatenablog.jp/entry/20110802/1313061693)

# Indexの内部構造
- [B-treeインデックス入門 Livesense Advent Calendar 2014 11日目](https://qiita.com/kiyodori/items/f66a545a47dc59dd8839#%E3%82%A4%E3%83%B3%E3%83%87%E3%83%83%E3%82%AF%E3%82%B9%E3%81%AE%E4%BD%BF%E7%94%A8%E6%96%B9%E6%B3%95)
- [B木 naoyaのはてなダイアリー](http://d.hatena.ne.jp/naoya/20090412/btree)

# EXPLAIN　(Extraなど)について

- [MySQLのEXPLAINを徹底解説!!](http://nippondanji.blogspot.jp/2009/03/mysqlexplain.html)
- [Using filesort](http://nippondanji.blogspot.jp/2009/03/using-filesort.html)
- [MySQL 5.7のEXPLAINでようやく変なUsing whereが消えた](https://yoku0825.blogspot.jp/2015/04/mysql-57explainusing-where.html)

# スロークエリログ

- [MySQLチューニングの基本「スロークエリログ」を知ろう！ WEB ARCH LABO](https://weblabo.oscasierra.net/mysql-slow-query-log-1/)

# 全体

- [MySQLクエリパフォーマンス改善簡易まとめ](https://qiita.com/eudyptesc/items/6a5d771d41168e9b738d)
- [MySQLのスロークエリを解消してみた わいさわのエンジニアリング](https://nzigen.com/ysawa/mysql-slow-query/)
- [MySQL スロークエリのチューニング例 趣味の電子工作を楽しむサイト](https://www.qoosky.io/techs/952e24c859)
- [MySQLでクエリチューニングことはじめ Allied ArchitectsEngineer Blog](http://tech.aainc.co.jp/archives/4634)



# SQLチューニング用ツール
- [SQL Tuning](https://sql-tuning.com/)
Visual Studio > 並列・並行処理の種類 > 経時列順

```txt:動作環境
Windows 8.1 Pro (64bit)
Microsoft Visual Studio 2017 Community
Sublime Text 2
```

関連: [Visual Studio | WPF > 非同期処理 > Link: ざっくりマルチスレッド(非同期処理)](https://qiita.com/7of9/items/5f9d900f01d6e6afc703)

[ざっくりマルチスレッド(非同期処理)](http://gomocool.net/gomokulog/?p=762) @ GOMOKULOG
に記載されている4つの方法がある。

パーフェクトC# 第3版(2013年)においては、別途、ParallelクラスとBackgroundWorkerクラスの記載があった。

何をどの用途に使うかは別途検討するとして、6種類の登場順序と.NET Frameworkのバージョン(と日付)の整理をする。

- Thread + delegate
    - .NET Framework 1.1 (2003年4月) and later: [link](https://msdn.microsoft.com/ja-jp/library/system.threading.threadstart(v=vs.110).aspx)
- ThreadPool
    - .NET Framework 1.1 (2003年4月) and later: [link](https://msdn.microsoft.com/ja-jp/library/system.threading.threadpool(v=vs.110).aspx)
- BackgroundWorker 
    - .NET Framework 2.0 (2005年11月) and later: [link](https://msdn.microsoft.com/ja-jp/library/system.componentmodel.backgroundworker(v=vs.110).aspx)
- Task
    - .NET Framework 4.0 (2010年4月) and later: [link](https://msdn.microsoft.com/ja-jp/library/system.threading.tasks.task(v=vs.110).aspx)
- Parallel 
    - .NET Framework 4.0 (2010年4月) and later: [link](https://msdn.microsoft.com/ja-jp/library/system.threading.tasks.parallel(v=vs.110).aspx)
- async and await
    - .NET Framework 4.5 (2012年8月) and later: [link](https://msdn.microsoft.com/ja-jp/library/hh191443(v=vs.120).aspx)
    
**注記:用途によっては上記の6つをひとくくりにするのはおかしいかもしれない**

最新のものが常に良いかというのは、必ずしもあてはまらないだろう。
[新しいものと古いもの（それぞれの有用性）](https://qiita.com/sjuny/items/e7611c4b70fd130193b5) by @sjuny さん
Selenium テストを並列化し、さらに 60% の作業効率化した話

* 弊社（[株式会社ラクス](https://www.rakus.co.jp/)）の注力サービスである[楽楽精算](https://www.rakurakuseisan.jp/)のリリース時の本番動作確認を効率化する取り組みについて紹介します。
* 本エントリは [Selenium を活用してリリース時の本番動作確認を 80% 効率化した話](https://qiita.com/kawanamiyuu/items/cd249381fa515a3f3e16) の続編です。

----

### 前回のおさらい

* Selenium を活用し、サービスの本番リリース時の動作確認作業を自動化した
* 自動化により確認にかかる時間を 2時間→20分 に短縮できた

----

## 新たな課題

----

* その後も増えつづける本番サーバ（オンプレ）
* 半年で約2倍に
* 自動化し楽になったが、また時間がかかり始めている

----

### リリース作業の概要

![Selenium_でさらに_60__の作業効率化した話_-_Google_スライド.png](https://qiita-image-store.s3.amazonaws.com/0/3899/9885c338-7046-0f01-91ed-47ec0acf26df.png)

----

## 動作確認テストを並列実行したい

----

### How

* JUnitで頑張る？
    * `@Rule` とか？
    * テストフレームワークに並列実行の責務をもたせるのはやりすぎ
* Gradleで頑張る？
    * `maxParallelForks` を指定する？
    * テストクラス単位での並列化ではなく、サーバ単位で並列化したいので却下
* Any other ideas？

----

## それ xargs でできるよ

----

* `-P`オプションで最大並列実行数(プロセス数)を指定できる
    * 今回いろいろ方法を調べていて初めて知りました :blush:
    * 参考：[xargsでコマンドを並列実行](https://qiita.com/aosho235/items/231d6d12f56debc515f9)

----

### 実行コマンド

* Before（直列）

```bash
# server_list.all.csv にテスト対象の全サーバを記述
$ ./gradlew clean releaseCheck -Plist=./server_list.all.csv
```

* After（並列）

```bash
# テスト対象のサーバ一覧ファイルを分割して用意する
$ ls servers/
server_list.1.csv server_list.2.csv server_list.3.csv

# 3並列で実行する
$ find servers/ -type f | xargs -P 3 -Ifile ./gradlew clean releaseCheck -Plist=file
```

----

## 並列化した結果

----

* 直列の場合と比べて、実行時間を **3分の1** 程度まで短縮できた
* 並列数を増やすとクライアントPC（ブラウザが起動するPC）のCPU負荷がボトルネックになり、実行時間の減少はゆるやかに

| 並列数 | 1プロセスあたりのテスト対象サーバ数 | 実行時間 |
|--------|---------------------------|----------|
| 1 (=直列)     | 30台                        | 31分     |
| 2      | 15台                        | 16分     |
| 3      | 10台                        | 12分     |
| 4      | 7台, 8台                    | 11分     |
| 5      | 6台                         | 10分     |

---

## まとめ

----

* Selenium / JUnit / Gradle/ シェル それぞれの責務をうまく果たす／組み合わせることで、シンプルに課題を解決できた（[UNIX哲学](https://ja.wikipedia.org/wiki/UNIX%E5%93%B2%E5%AD%A6)）
    * 今回は Selenium はあまり関係なかったですね...ｽﾐﾏｾﾝ :pray_tone1: 
* 次は Docker と Headless Chrome あたりを使ってポータブルかつ、さらに高速化できないかと目論んでいる
バイナリデータ(画像)をAPIGatewayとLambdaを組み合わせてS3にPUTする

# はじめに

以前、[SORACOM BeamでバイナリデータをAPIGateway経由でS3にアップロードする](https://qiita.com/is_ryo/items/3474be4ab6a4fb102bf4)という記事を書いたのですが、今回はその記事の続編です。

別のアドカレでもLambdaの素晴らしさを少し語らせていただいたのですが([これ](a.com/is_ryo/items/23604c06459872a88251))、Lambdaはかなり便利だと思ってます！。私が今携わっている案件でも、常に十数台のLambdaが立ち上がって処理をしてくれています。

## ある日の私

実際にその構成を使って画像を保存していたのですが、ある日
私「だいぶ溜まってきたしCLIでローカルにダウンロードしよっと」

```
aws s3 cp s3://bucketName/key ~/image
```

S3「Access deniedやで」
私「ファッ！？」
という一連の流れがあって、もしかしてこの構成間違ってる？ということに気がつきました。

## なにがあった？

それまでの構成では、画像ファイルをバイナリのまま、APIGatewayにSORACOMBeamを通してRESTAPIでPOSTして、そのあとS3にPUTするようにしてました。
しかしそれでは、S3にPUTする際に必要なHeader情報が不足しているようでした。(それならそれでエラー吐いて欲しいものですが…)
果たして不足分のHeader情報を全て網羅できるのだろうか。いやできない。(反語)
※必要なHeader情報は[公式ドキュメント](http://docs.aws.amazon.com/ja_jp/AmazonS3/latest/API/RESTObjectPUT.html)を参照。

## それじゃあどうする？

「便利なものは 使ってしまえ ホトトギス。」(字余り)

ということで、AWS-SDKでPUTすることにしました。SDKを利用すればHeader情報などをよしなに補ってくれますし、おすし。
そして、便利屋Lambdaさんの登場です。
APIGatewayから一度Lambdaにデータを渡して、LambdaからAWS-SDKを使ってPUTする。という流れです。

以前までの構成は[前編](https://qiita.com/is_ryo/items/3474be4ab6a4fb102bf4)を参照してください。

### APIGatewayからLambdaを呼び出す

<img width="745" alt="スクリーンショット 2017-12-15 9.36.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/95875/7b5649f6-2c2d-81df-fcda-9e00cde44380.png">

設定中に「APIGatewayにLambdaをinvokeする権限渡すけどええか？」と聞かれるのでOKしてあげてください。

### マッピングテンプレートの設定

Content-TypeごとにどのようなテンプレートでLambdaに渡すかを設定します。
「Method Request passthrough」を選択しておけば問題ないです。

<img width="639" alt="スクリーンショット 2017-12-15 9.41.37.png" src="https://qiita-image-store.s3.amazonaws.com/0/95875/45432bab-d6f0-3fc7-bf8e-a23d00c4426e.png">

### バイナリサポートの設定

バイナリデータを送信するときのContent-Typeを設定しておきます

<img width="1185" alt="スクリーンショット 2017-12-15 9.44.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/95875/cfd4d2fb-f253-e877-c8bd-3b40de611103.png">

### Lambdaの作成

ランタイムはpython2.7です。
先ほどのマッピングテンプレートの形でeventに渡されてきます。

```python
import json
import boto3
import base64

def lambda_handler(event, context):
    print json.dumps(event)
    
    try:
        s3 = boto3.resource('s3')
        bucket = s3.Bucket('bucketName')
        
        # バイナリがBase64にエンコードされているので、ここでデコード
        imageBody = base64.b64decode(event['body-json'])
        
        # リクエストパスを組み合わせてKeyにする
        imagePath = event['params']['path']
        key = imagePath['key'] + '/' + imagePath['name']
        print key
        
        bucket.put_object(
            Body = imageBody,
            Key = key
        )
        print 'success!'
    
    except Exception as e:
        print 'Error!'
        print e
```

これでLambda経由でS3に画像が保存されます。
SDKを利用してるので、Header情報やmetaデータはよしなにしてくれてます。

# さいごに

**やっぱりLambdaは便利ですね。**

ではまた！
C# > 並列処理と並行処理 > Link: parallel と concurrent、並列と並行の違い

```txt:動作環境
Windows 8.1 Pro (64bit)
Microsoft Visual Studio 2017 Community
Sublime Text 2
```

関連: [Visual Studio | WPF > 非同期処理 > Link: ざっくりマルチスレッド(非同期処理)](https://qiita.com/7of9/items/5f9d900f01d6e6afc703)

パーフェクトC#の第3版(p164からp177あたり)を見ていると、「並列処理」と「並行処理」の用語が混在している。

節のタイトルは「並列処理」とあり、節の内容ではすべて「並行処理」という記載である。

用語の違いについて、以下を見つけた。
[parallel と concurrent、並列と並行の違い](http://freak-da.hatenablog.com/entry/20100915/p1) @ とあるHPC屋の趣味＆実益ブログ

パーフェクトC#の用語不統一は、改訂時に節の記載だけ変更して、内容の変更忘れをしたのかもしれない。
上記の違いを意識したような記載ではなかった。

上記のブログの内容に基づくと、自分がこれから学ぼうとしている処理は「並行処理」だと思われるが、場合によっては「並列処理」の実装も必要かもしれない。