OmniAICreator/Qiita-1.07M huggingface dataset:
Pythonでtest用のdummy dataを作成する

## Faker
dummy data作成用のpython package.
pythonのmoduleとしても利用できるが、CLIからのdataの作成も可能。
以下でinstallできる。

```
pip install faker
```

* [joke2k/faker: Faker is a Python package that generates fake data for you.](https://github.com/joke2k/faker)

## Usage
```python
from faker import Faker
# faker object
fake = Factory.create()
# set seed
fake.seed(4321)
# get dummy data
fake.name()
fake.address()
fake.text()
```

呼び出しごとにrandomにdataが出力される。
seedを固定したい場合は、`fake.seed()`で設定する。
dummy dataを生成する`name`, `address`はproviderによって提供される。
自分でproviderを追加することもできる。

### Providerの追加。
自分でproviderを作成する場合は以下のようにする。

```python
# first, import a similar Provider or use the default one
from faker.providers import BaseProvider

# create new provider class
class MyProvider(BaseProvider):
    def foo(self):
        return 'bar'

# then add new provider to faker instance
fake.add_provider(MyProvider)

# now you can use:
fake.foo()
```

### 言語の変更
defaultは、英語。日本語などのdataもある。

* [Localization](https://faker.readthedocs.io/en/latest/#localization)

```python
from faker import Factory
fake = Factory.create('jp_JP')
```

## List of providers
defaultで利用可能なProviderの一覧は以下にある。

* [Welcome to Faker’s documentation! — Faker 0.7.18 documentation](https://faker.readthedocs.io/en/latest/#contents)

## List of dummy data
全て網羅していないが、どういうデータが使えるか
以下を実行すればデータが表示される。

```python
from faker import Factory
fake = Factory.create()

print("")
print("lorem")
print(fake.word())
print(fake.words())
print(fake.sentence())
print(fake.sentences())
print(fake.paragraph())
print(fake.paragraphs())
print(fake.text())

print("")
print("user_agent")
print(fake.user_agent())
print(fake.chrome())
print(fake.firefox())
print(fake.safari())
print(fake.opera())
print(fake.internet_explorer())
print(fake.windows_platform_token())
print(fake.linux_platform_token())
print(fake.mac_platform_token())

print("")
print("misc")
print(fake.boolean())
print(fake.null_boolean())
print(fake.binary(length=50))
print(fake.md5())
print(fake.sha1())
print(fake.sha256())
print(fake.locale())
print(fake.language_code())
print(fake.uuid4())
print(fake.password())
```

## with pytest
pytestと一緒に使う場合は、pytestのfixtureとして提供されている`pytest-fixture`を使う。

```
pip install pytest-faker
```

fakerという名前の引数をtest用の関数に指定しておけばfake moduleとして使える。

```python
def test_faker(faker):
    assert faker.name() != faker.address()
```

## Reference
* [joke2k/faker: Faker is a Python package that generates fake data for you.](https://github.com/joke2k/faker)
* [Pythonでテストデータを生成するライブラリfakerのコードリーディング - Qiita](http://qiita.com/massa142/items/d456102799cdbbb20c6c)
* [pytest-dev/pytest-faker: faker integration the pytest test runner](https://github.com/pytest-dev/pytest-faker)
git：ファイルのgit上でのパーミッションに実行権限を付加する方法備忘録

* たまに使うけど絶妙な頻度なので忘れている
* ファイルのgit上のパーミッションを確認する方法は[別途参照](https://qiita.com/k-shimoji/items/a393bc2e1b79a2d965e3)
* gitのfilemodeがfalseのままでもOK


```
$ git ls-files -s
100755 66e9889e8b4aeea1af13e2396fb70594232a2ae3 0       bundle
100644 edf195985f692057c67e71d2f8b493ee3078a0d6 0       delayed_job
100755 5badb2fde0cb72bbb3cba8436721048dfd7e58dd 0       rails
100755 d87d5f578104597c1d1b951b55942e37f8af1277 0       rake
・
・
・
$ git update-index --add --chmod=+x delayed_job
$ git ls-files -s
100755 66e9889e8b4aeea1af13e2396fb70594232a2ae3 0       bundle
100755 17f9f6e90773c0a5d6b6d1d23d50033d0d6d3802 0       delayed_job
100755 5badb2fde0cb72bbb3cba8436721048dfd7e58dd 0       rails
100755 d87d5f578104597c1d1b951b55942e37f8af1277 0       rake
・
・
・
```


# まとめ
`git update-index --add --chmod=+x ファイル名`で実行権限を付加し755にできる
Go言語をはじめてさわって見る

## はじめに

Go言語が社内で話題になっていたので触って見る

## インストール

homebrew を使用してインストール

```
brew install go
```

## 動作確認

環境変数を設定して動作確認

``` :
go version
```

## Hello worldをやってみる

``` go:hello.go
package main

import "fmt"

func main() {
  fmt.Println("hello world")
}
```

実行してみる
```
$ go build hello.go
$ ./hello
```

## [A Tour of Go](https://tour.golang.org/list)を読んで見る
一番思ったのは、変数宣言や関数の使用の仕方が変わっているのでいつもの感覚で書いているとエラーになりそう

## まとめ

とりあえず話題に上がっていたのでさわるだけでさわって見た

全然Go言語のこと触れてないのでわからないことだらけなので

https://qiita.com/suin/items/22662f43b6a6e8728798　や
A Tour of Go 
をもっと詳しく読んでみって何か使えるものを作ってみる
素因数分解を使ったテクくもない遠回りFizzBuzz with Ruby

# コード

https://paiza.io/projects/G9B46N0llqn6LCftv0xQpA

```ruby
require 'prime' 

(1..100).each do |n|
    output = ''
    divided_n = n.prime_division.map {|p,n| p }.uniq
    
    # 上限未指定ならテスト環境タイムアウトで完了しない。
    # 3と5を隠蔽してみようかと無駄な遠回りを試みたものの、結局上限値指定each(5)で5が出てくるか、
    # each.take(3)で3は素数を表してはいないけれどどちらかが出て微妙
    prime_list = Prime.each.take(3).to_a

    # 無駄が多いループだけど、100以下が持つ素数なんて最大3回でしょという怠慢
    divided_n.each do |p|
        if prime_list.index(p) == 1 then
            output += 'Fizz'
            next
        elsif prime_list.index(p) == 2 then
            output += 'Buzz'
            break
        end
    end
    # エルビス演算子なさそうで、||はnull確認なので+=の連結とcollision…
    puts(output == '' ? n : output )
end
```

# 雑記

どうもFizzBuzzが書けない~~プログラマ~~人です。
奇跡的に書けても(就職試験に間に合わないだろうほど)時間がかかります。[^2]
また出力を3回呼び出すきれいなコードではなく、必ず文字列を連結するコードになってしまいます…。[^1]

今回は素数に3と5があるなとふと思い、素因数分解デフォルトでできる言語ないかなと調べたらRubyにあったので書いてみました。

改めて自分に資質が無いことが浮き彫りになるのでFizzBuzz嫌い…
なおFizzBuzzは「如何に正解を見ずに先達が居ないか探す」ことが面白難しいと思いました。

コレだけのコードですがRuby触れて楽しい。

# 参考

* [library prime (Ruby 2.2.0)](https://docs.ruby-lang.org/ja/2.2.0/library/prime.html)
* [Rubyで素数で遊ぶ(prime モジュール) - Qiita]
* [RubyのPrimeクラスを使う - Qiita]  
  両方すごく、丁寧。
* [不適切の、不適切による、不適切のための『FizzBuzz』結果発表！｜CodeIQ MAGAZINE](https://codeiq.jp/magazine/2015/04/22840/)  
  素因数分解を使った美しい方のコードがある
* [FizzBuzz Checker - JSFiddle](http://jsfiddle.net/polygonplanet/8YvuE/)  
  結果に普通に自信が持てない

[RubyのPrimeクラスを使う - Qiita]:https://qiita.com/kanetai/items/dc8a79cd08d5a0ebd05f

[Rubyで素数で遊ぶ(prime モジュール) - Qiita]:https://qiita.com/norioc/items/5c270ad6ff5d22d1efd0


他いくつもFizzBuzz見ましたが、「3と5(と15)をいかに見つけるのか」はFizzBuzz遊びとはちょっと違うのかなと調べていて思ったり。
「もっと短く」や「もっと奇想天外」に、な方面が良さそうですね。


[^1]: こちらが汚いコードという意味ではないです。
[^2]: 今回n時間レベルなんで…。 
  普段・普通でも3分はしんどそう。
mbed　シリアル通信でTeraTermの代わりにMacで確認する

授業でmbedを使ったのだが、windows用のTeraTermの代わりをググったが、すぐに出てこなかったのでここにメモ。

terminalで簡単に出力を見れるのでおすすめ。



##手順１(ls)
USBの接続先を確認！

```

ls /dev/tty.usbmodem*

```

*は人それぞれです。

自分の場合は、

```

　　/dev/tty.usbmodem1462

```
でした。
##手順２(screen)
そして、Screenコマンドでusb Modemポートに接続する。

自分の場合は

```

screen /dev/tty.usbmodem1462

```

これで接続できます！

あと、終了について。
screenコマンドの終了方法はclt+aでclt+\を押す。

これをやらずに終了すると再接続できません。

気をつけましょう！！

##終わりに
以上で終了。
（授業でやるんだからちゃんとMacでも出来る様にあらかじめ調べておいて欲しいよねww）
git：ファイルのgit上でのパーミッションを確認する方法備忘録


* たまに使うけど絶妙な頻度なので忘れてる
* たまに644のファイルが作られており、ローカルでは755に直したのにデプロイ先では644のままになっていたりして危ない
* ファイルのgit上のパーミッションに実行権限を付加する方法は[別途参照](https://qiita.com/k-shimoji/items/9e6399753be4383c75ea)

```
$ git ls-files -s
100755 66e9889e8b4aeea1af13e2396fb70594232a2ae3 0       bundle
100644 edf195985f692057c67e71d2f8b493ee3078a0d6 0       delayed_job
100755 5badb2fde0cb72bbb3cba8436721048dfd7e58dd 0       rails
100755 d87d5f578104597c1d1b951b55942e37f8af1277 0       rake
・
・
・
```

# まとめ
`git ls-files -s`でgit上のパーミッションを確認できる
オレオレGoogle Homeしたいので、仕様確認&設計方針を考えてみた

[PORT Advent Calendar](https://qiita.com/advent-calendar/2017/port)19日目の記事です。
好きに書いていいというので、好きに書きます。

最近、[Google Home mini](https://store.google.com/product/google_home?hl=ja)を買ったので、機能確認&設計方針考えてみました。

## Google Homeの基本仕様
- マイクでの音声認識
    - 割りと精度良く認識してくれる感触
    - スマホのGoogleAssistantがいまいちな分、ちょっと感動を覚える
- 音声による応答
- 簡素なLEDのインターフェース
- タップによる簡単な操作
- wifiによる無線接続
- [Bluetoothスピーカー](http://www.itmedia.co.jp/pcuser/articles/1711/16/news038.html)として使う
- 音楽再生
    - miniでもそれなりに聞ける。但し、迫力を求めるとminiじゃないほうがいいと思う
    - とはいえ、音源が一つなのでステレオを求めるなら[Chromecast audioと連携](https://xera.jp/entry/chromecastaudio03)をめざした方がいいと
- USBによる給電(※miniのみ)miniじゃないほうはAC電源
    - バッテリー駆動でないため、常時給電は必要あり
- [Voice Matchによるユーザの声認識](https://support.google.com/googlehome/answer/7323910?hl=ja)
    - ちゃんとユーザを認識してくれるすごい
- 他サービス連携
    - 標準でGoogleのカレンダーやメモ、メールと連携
    - 声認識でその人のデータのみアクセスできる
- [ショートカット機能で好きなワードで反応するように](http://sbapp.net/appnews/smart-speaker/google-home/shortcut-73249)

## 設計方針
- pull系(自分から声をかける)で
    - googleのサービスで実現できる場合は
        - 多分標準機能で実現可能
    - サービス(twitterとか)と連携したい(一言で終わる)場合は
        - [IFTTT等](https://ifttt.com/line)を使う
        - 他にも似たようなサービスがあるので[このあたりを](https://qiita.com/hattorix@github/items/bf6cbd253cad9557dcff)参考に
    - 会話したりインタラクティブに動作させたい場合
        - [DialogFlowを使う](https://www.cresco.co.jp/blog/entry/3824/)
    - 自分が書いたコードを動かしたい
        - [DialogFlow](https://www.cresco.co.jp/blog/entry/3824/)でwebhookする
    - IoTに対して何か命令を出したい
        - [DialogFlow](https://www.cresco.co.jp/blog/entry/3824/)でwebhookする
    - 受け答えできる嫁を作りたい
        - [DialogFlow](https://www.cresco.co.jp/blog/entry/3824/)で(ry
- push(Google Homeから通知)系
    - まだ機能としてはリリースしていない
    - Google Homeが複数設置してある場合の通知場所の設定方法が不明(要学習)

## 感想
DialogFlowしゅごいので近いうちに使い倒したい
記事まとめていくなかでオペ子作れる感じがした
インタラクティブに話せるGoogleHomeちゃん作りたい
zabbix2.2 Item設定 備忘録(Vmware用テンプレート)


VMware向けテンプレートの編集メモです。

##cpu使用率（パーセンテージでの取得）

Template Virt VMware HypervisorにてCPU使用率をパーセンテージで取得したいので、以下のように設定しました。

もともとあるItem
  
HyperVisorのCPUクロック数
 ・CPU frequency(キー:vmware.hv.hw.cpu.freq[{$URL},{HOST.HOST}]
 
HyperVisorのCPU数　
 ・CPU cores(キー：vmware.hvhw.cpu.num[{$URL},{HOST.HOST}]

**CPUクロック数　×　CPU数**

でそのHyperVisorのCPU総Clock数が求められるので、この計算をItemとして追加します。


| 項目 | 値 |
|:---------|:---------|
| 名前 | HyperVisor総Clock |
| タイプ | 計算 |
| キー | HV_MAX_CLOCK |
| 式 | last("vmware.hv.hw.cpu.freq[{$URL},{HOST.HOST}]")*last("vmware.hv.hw.cpu.num[{$URL},{HOST.HOST}]") |
| データ型 | 数値（浮動小数） |
| データ形式 | 10進数 |
| 単位 | Hz |


あとは以下の計算でCPU使用率の割合は求められます。

**使用Clock数 ÷ 総Clock数 × 100**

なお、使用Clock数はもともとあるItemで取得できています。

HyperVisorの使用Clock数
　・CPU usage(キー：vmware.hv.cpu.usage[{$URL},{HOST.HOST}]

上記の計算をItemとして追加

| 項目 | 値 |
|:---------|:---------|
| 名前 | HyperVisorCPU使用率 |
| タイプ | 計算 |
| キー | HV_USED_CPU |
| 式 | last("vmware.hv.cpu.usage[{$URL},{HOST.HOST}]")/last("CPU_MaxClock")*100 |
| データ型 | 数値（浮動小数） |
| データ形式 | 10進数 |
| 単位 | % |

このItemでCPU使用率をパーセンテージで取得できます。
Windows10のデュアルスキャン機能の無効化方法

Windows10 v1607 / WindowsServer2016 より、WindowsUpdateデュアルスキャン(DualScan)機能が組み込まれた。
この機能は、WSUSと公式WindowsUpdateサイトの両方に更新確認を行う機能である。
これが有効だと何が起きるかというと、以下の条件下でWSUSとインターネット上のMicrosoft更新サーバーの両方から更新してしまう。WSUSに向けてるから更新は来ないでしょうと、のほほんとしていると痛い目にあう。

* 更新チャネルの変更や、機能アップデートの延期設定などを行っている
* WSUSに更新先を向けている

さらに、WSUS以外への更新を以下のような方法で遮断していたりすると、そもそも接続エラーとなり更新すら不可能となる。

* グループポリシー設定による遮断
* プロキシサーバーによる遮断
* FWなどのネットワーク機器による遮断 etc...


## 作業手順
Windows10 1709より前の機能バージョンでは、設定前にパッチを適用する必要がある。 [^3]（パッチを適用しないと、そもそも設定項目が出てこない）
また、WindowsServer2016では更新状況によって設定項目が出てこない場合もある。

* Windows10 1607用: https://support.microsoft.com/ja-jp/help/4034658/windows-10-update-kb4034658 
* Windows10 1703用: https://support.microsoft.com/ja-jp/help/4041676/windows-10-update-kb4041676 


グループポリシーエディタを起動し、以下のように設定する。 

* 管理用テンプレート
    * Windowsコンポーネント
        * WindowsUpdate
            * イントラネットのMicrosoft更新サービスの場所を指定する: 有効
                * http://wsus:8530/ ※WSUSサーバーの設定に合わせること
            * インターネット上のWindowsUpdateに接続しない: 有効
            * WindowsUpdateに対するスキャンを発生させる更新遅延ポリシーを許可しない: 有効
            * WindowsUpdateの延期 [^1]
                * 機能更新プログラムをいつ受信するかを選択してください [^2]: 有効 (設定内容は任意で良い)
    * データの収集とプレビュービルド
        * 利用統計情報の許可: 1- 基本 以上

## 参考
https://blogs.technet.microsoft.com/jpwsus/2016/11/15/windows-10-1607-wufb/


[^1]: 1709から "Windows Update for Business" に変わっている
[^2]: 1709から "プレビュービルドや機能更新プログラムをいつ受信するかを選択して下さい" に変わっている
[^3]: WindowsServer2016でも有効だが、最新の更新を適用している必要がある。(更新状況によっては"WindowsUpdateに対するスキャンを発生させる更新遅延ポリシー"が存在しないため)
Visual Studio Code でマインクラフトMODを開発できるようにした話

# 概要

ふと、MinecraftのMODを開発してみようと思い、EclipseとかIDEAとかじゃなくて、既にPCにインストールしていたVSCodeで開発できないか、と思いやってみたのでその私的メモも兼ねて…

# 前提

OS：Windows 10
Visual Studio Code : 1.18.1
JDK : 1.8.0 (x64)
Minecraft Forge : 1.12.2 - 14.23.1.2577
Minecraft Launcher : 2.0.1003

直接関係は無いけど、core i3レベル未満のCPUだとビルドに相当時間がかかることがあるみたい。

# Gradleをインストールする

（いらないかもしれない…）

[Gradle | Releases](https://gradle.org/releases/) からGradleをダウンロードしてインストールして、環境変数を設定する。

参考 : [Gradle初心者によるGradle事始め](https://qiita.com/navekazu/items/af886fa200be8a683132)

# Minecraft Forgeをインストールする

## ダウンロード

適当なバージョンの[Minecraft Forge](https://files.minecraftforge.net/)をダウンロードする。今回は1.12.2 - 14.23.1.2577を使用。

![forge-wi.png](https://qiita-image-store.s3.amazonaws.com/0/199139/432e6c9e-95ef-de90-6a73-ea577b3d27e2.png)

## インストール

ダウンロードしたインストーラーを起動してMinecraftForgeをインストールする。

## modsフォルダの作成

Minecraft LauncherからインストールしたMinecraft Forgeのものを選択してゲームを起動する。

![mcl-f.png](https://qiita-image-store.s3.amazonaws.com/0/199139/83985017-2e82-04f9-142d-890af8473d3f.png)

.minecraftフォルダ（デフォルトはC:\\Users\\[ユーザー名]\\AppData\\Roaming\\.minecraft\\）にmodsフォルダがあることを確認する。

![mods.png](https://qiita-image-store.s3.amazonaws.com/0/199139/43ec8b38-4cf6-ad36-c2f1-4892dd91fc4c.png)

# MDKをダウンロードする

## ダウンロード

Minecraft Forgeと同一バージョンの[MDK](https://files.minecraftforge.net/)をダウンロードする。

![forge-mdk.png](https://qiita-image-store.s3.amazonaws.com/0/199139/1f694a0f-6ca6-979f-4829-3835905f670a.png)

## 展開

.zipで圧縮されているのでそれを作業フォルダに解凍（展開）する。以降、解凍されたMDKのフォルダ内で作業をする。

# ビルドする

ソースコードは、サンプルソースが既にsrc\\main\\java\\com\\example\\examplemod\\ExampleMod.javaにあるため、それを使用する。

build.gradleがあるフォルダにターミナルで移動し

``` 
> gradle build
```

によりビルドする。

# 確認する

ビルドができていれば、build\\libs\\内にmodid-1.0.jarというファイルがあるはずなので、それを先のmodsフォルダ内にコピーする。Java9使用していると、エラーができるようなので、その場合は環境変数JAVA_HOMEを編集すること。

先の手順でMinecraftを起動し、ModからExample Modが確認できれば成功。

![exmods2.png](https://qiita-image-store.s3.amazonaws.com/0/199139/c0ede509-36c1-afff-f44e-86fe06bc91ea.png)

![exmods.png](https://qiita-image-store.s3.amazonaws.com/0/199139/028655e3-1345-17fc-1b8b-5bd332f3356e.png)
Polymer.co-edo '18 計画

さて今日は私とPolymerコミュニティにとって記念すべき1年後です。
[Polymer.co-edo 第0回を開催しました](http://blog.open.tokyo.jp/2016/12/18/polymer-co-edo-0.html) というブログを書いたのが、2016/12/18。
そうちょうど一年前。

そのときボッチだったPolymer.co-edoも大人気とは言えませんが、参加者のみなさまに支えられ１年を乗り越えることができました。
今年は Polymer そのものにも大きな動きがたくさんあって、Meetupネタにも欠きませんでした。

本日は[Polymer.co-edo ゆく年くる年](https://polymercoedo.doorkeeper.jp/events/68087)というイベント（LT大会＆忘年会）をやりますので、Polymer興味ある方、単純に飲みたい方(w)などの参加をお待ちしております。

## ゆく年

まずは `くる年`　の前に今年のふりかえりを。

|  回   |     日時    |         内容                             |  参加人数  |
|:-----:|:----------:|:----------------------------------------:|:--------:|
| #1    | 2017/02/20 | Google Mapを使ってルートアプリを作ってみる        | 8        |
| #2    | 2017/03/27 | firebase-element を使ってTODOアプリを作ってみる | 4        |
| #3    | 2017/04/17 | firebase-element を使ってTODOアプリを作ってみる(リベンジ編) | 4        |
| #4    | 2017/05/22 | Polymerエレメントを作ってみよう                 | 5        |
| #5    | 2017/06/26 | Google I/O '17 の Polymerセッション動画を観る  | 6        |
| #6    | 2017/08/28 | Polymer Summit 2017 の動画を観る            | 6        |
| #7    | 2017/09/25 | Polymer 2.0 アプリケーションを1から作ってみよう    | 7        |
| #8    | 2017/11/20 | 素のWeb Components と Polymer で実装したときの違いを知る | 4        |

- 1月は油断していたら過ぎてしまったw
- 7月はカンファレンスの連続でまったく準備時間がなかった
- 10月は直後に Polymer Japan #1 のイベントがあった

ということで開催していませんが、ほぼ毎月できたと自負しています。

## くる年

Polymer Japan のイベントもそれなりの回数計画されているので、私たち Polymer.co-edo 主催者としては、2018年以下のような思いを描いています。

- Polymer.co-edo オーガナイズの Custom Elements をもくもく作る
- 海外カンファレンスの動画を観る会をやる（不定期）
- Polyester を完成させたい
- 初心者向けハンズオン（1,2回)
- ネタを募集する（他力本願

今年やって思ったのは、Polymer という日本では認知度が低いフロントエンド技術について、有料の場所を使ってやるのは集客が難しいのかも？という仮説。
来年は数回自社（esm:秋葉原）を使って、初心者向けのハンズオンを入り口にコミュニティ参加者を増やしたいな、と思っています。

今年参加していただいた皆さまには、本当に感謝しかありません。
私の `Polymer愛` を来年も Co-edo から叫びます！
Windows10からOneDriveをアンインストールする方法

Windows10からOneDriveが標準インストールされるようになった。
利用者が意図せずオンライン上に保存してしまうことがあるため、アンインストールすることにする。
なお、この手順は**OSに標準搭載されたOneDrive**に対する作業であるため、Officeに含まれるOneDriveには適用されないことに注意。

## 手順
以下のコマンドを**管理者権限**で実行する。

```bat:Cmd(Administrator)
taskkill /f /im OneDrive.exe​
%SystemRoot%\System32\OneDriveSetup.exe /uninstall​
%SystemRoot%\SysWOW64\OneDriveSetup.exe /uninstall
timeout /t 60
rd /s /q "%UserProfile%\OneDrive"
rd /s /q "%LocalAppData%\Microsoft\OneDrive"
rd /s /q "%ProgramData%\Microsoft OneDrive"
rd /s /q "C:\OneDriveTemp"
reg delete "HKEY_CLASSES_ROOT\CLSID\{018D5C66-4533-4307-9B53-224DE2ED1FE6}" /f
reg delete "HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{018D5C66-4533-4307-9B53-224DE2ED1FE6}" /f
reg delete "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run" /v "OneDrive" /f
```

グループポリシーエディタを起動し、以下の部分を変更する。

* コンピューターの構成
    * 管理用テンプレート
        * Windowsコンポーネント
            * OneDrive
                * ドキュメントを既定でOneDriveに保存する: 無効
                * OneDriveをファイル記憶域として使用できないようにする: 有効
                * Windsows8.1でOneDriveをファイル記憶域として使用できないようにする: 有効
Maya | 選択されたオブジェクトのテクスチャUV値を取得する

```py
import maya.cmds as cmds

for obj in cmds.ls(selection=True):
    vrt = cmds.polyListComponentConversion(obj, toUV=True)
    pos = cmds.filterExpand(vrt, selectionMask=35)
    for idx in pos:
        uv = cmds.polyEditUV(idx, query=True)
        print uv
```
JavaScript で Object を flatten する

Object が key => array となっているような Object を flatten する場合。（他の場合も少し頑張ればいけます）

下記は TypeScript ですが、JSも似たような感じでできます。

```ts
  static flatten(object: object): string[][] {
    const flattenSub = (sum: string[], obj: any): string[][] => {
      if (obj instanceof Array) {
        return (obj as string[]).map( val => {
          return sum.concat(val);
        });
      } else if (obj instanceof Object ) {
        return Object.keys(obj).reduce( (result, key): string[][] => {
          flattenSub(sum.concat(key), obj[key]).forEach(arr => {
            result.push(arr);
          });
          return result;
        }, []);
      }
    };
    return flattenSub([], object);
  }
```
JavaScript で n を与えて 1からn までの配列を作る

Ruby の `1...4` みたいなことがしたくて、JavaScript で作る場合どうするか考えてみた。

```js
> Array.from({length: 4}, (_, i) => i+1)
[ 1, 2, 3, 4 ]
```

ちなみに下記でもできる（バージョンにより挙動が不安定なので非推奨）

```js
> [...new Array(4)].map( (_,i) => i );
[ 0, 1, 2, 3 ]
> new Array(4).map( (_,i) => i );
[ , , , ,  ]
```

### 参考
Array.from()のリファレンス
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/from
正規表現で置換時にマッチした文字をそのまま使う 

この記事は [ウェブクルー Advent Calendar 2017](https://qiita.com/advent-calendar/2017/webcrew)の19日目の記事です。
昨日は@a_tamuraさんの「[使ってもらえるシステムが作るためには](https://qiita.com/a_tamura/items/eea2756f5a4e539f2152)」でした。

#背景
仕事でテストデータ（100万件）を変換する時に使用したため。 
数年前に正規表現について勉強したが~~忘れたため~~、調べて試した内容を記述。

#試したエディタツール
* サクラエディタ
* Visual Studio Code


#変換前のデータ
idが1から順番に振られていたデータ

```
INSERT INTO user(id,name,rank) values(1,'テスト太郎','上')
INSERT INTO user(id,name,rank) values(2,'テスト花子','上')
INSERT INTO user(id,name,rank) values(3,'テスト三郎','並')
INSERT INTO user(id,name,rank) values(4,'テスト五郎','特')
```

#こんなデータにしたい
idが100万+1から順番に振られているデータにしたい

```
INSERT INTO user(id,name,rank) values(1000001,'テスト太郎','上')
INSERT INTO user(id,name,rank) values(1000002,'テスト花子','上')
INSERT INTO user(id,name,rank) values(1000003,'テスト三郎','並')
INSERT INTO user(id,name,rank) values(1000004,'テスト五郎','特')
```

#やり方
検索条件：(\d)
置換文字列：1000000$1

#解説
$1というものは、検索条件にて**()**内で使用した文字列をそのまま使う。
今回の件だと「¥d」つまり「数字一文字」である。（0～9まで）

#()内について
**()**内は正規表現でなくとも構わない。
固定されている文字列の場合なら、固定文字列で良い。
例えば、上記の変換後のデータで、「テスト～～」を「テスト・D・～～」に変換したい場合、
検索条件：(テスト)
置換文字列：$1・D・
とすれば「テスト・D・太郎」「テスト・D・花子」・・・と変換することができる。


#複数使いたい場合
「\$1」の1は一つ目という意味なので、二つ目のマッチした文字列を使いたい場合は「$2」という感じでドル以降の数字を増やしていけば良い。

#早い話
正規表現で **()**で囲んだ文字列は **$1**で使えるよ！！
**()**内は正規表現じゃなくても文字列でも大丈夫だよ！
だから今すぐ **()**で囲んでみてね！！！

#参考文献
https://www.graffe.jp/blog/1688/
SharePoint の参照列でフィルターっぽい実装をする

[ブログからの転載](http://1bed.allright.life/?p=2624)

## 経緯

SharePoint でマスタを考える時って、まずは参照列を検討すると思うんですが、
この参照列が使いにくいなーっとずっと思ってました。

例えば、参照先のアイテムを

* リスト毎に変えたい
* フラグで表示・非表示を切り替えたい
* ある時期以降に表示したい
* ある時期以降に非表示にしたい

とかしたいじゃないですか。

次に検討するのが選択肢列だと思うのですが、マスタではないですよね...

先々月頃、ぜんぜん違う事を調べてる時にふと集計値列を使う方法を思いつきました。
SharePoint 大好き芸人の方々は、きっとこうやってるんだな... やっと気づいたYO!!

忘れそうなのでブログにアウトプットしておこう

## 環境

* プラットフォーム： SharePoint Online
* 利用リスト
  * 部署マスタ： 参照列で参照するリスト
  * 社員名簿： 部署マスタを参照する列を保有するリスト

## いままで

* 参照列を使う
![](http://1bed.allright.life/wp-content/uploads/2017/12/1.png)

* 選択肢列を使う
![](http://1bed.allright.life/wp-content/uploads/2017/12/2.png)

参照列を使うと、参照列として表示したくない部署は部署マスタから削除するしかない(と思っていた)。

選択肢列を使うと、社員名簿リストに設定を持ち、社員名簿の各アイテムにデータを持ってしまうため、例えば部署の名前が変わった時等に、全てのデータを洗い替えする必要が出てくるので、メンテナンス性が超絶悪い。


## 集計値列を使う

参照列の参照先を集計値列にすることで、表示を変えられることに気づいた。
下図は、部署マスタの活性化列が「はい」のアイテムだけを社員名簿の所属部署として表示させる例。

* 集計値列を使う
![](http://1bed.allright.life/wp-content/uploads/2017/12/3.png)

これにより、参照列として表示する部署は、活性化列が「はい」のアイテムだけとなる。
なんだよ... フィルターできるじゃないか！


## さらに応用

現実的には、部署マスタや商品マスタなどには「xxxx年xx月xx日～xxxx年xx月xx日まで使用する」という期限がある。
先ほどのように、集計値列の数式に期間を入れようと思うところだが、数式に TODAY や ME などの動的な値は使えない。
こういう時こそ Microsoft Flow の出番。

* 集計値列と Microsoft Flow を使ったフロー

  1. 毎日 0 時に動作する
  2. 部署マスタを取得
  3. 今日が開始日と終了日の間なら「活性化」を「はい」に、期間外なら「活性化」を「いいえ」にする
  4. 3 をアイテム分繰り返す

実際に設定したのは次の通り

![](http://1bed.allright.life/wp-content/uploads/2017/12/4.png)

Flow は経験が少ないので恥ずかしいところだけど、取り敢えず内容を解説(自分で後から見直せるように)

### 1. 毎日0時に実行する

毎日0時に本当に動くか確認してないけど、多分こんな感じでしょう？
![](http://1bed.allright.life/wp-content/uploads/2017/12/5.png)

### 2. 変数を初期化する

このフローで使う変数を定義する

![](http://1bed.allright.life/wp-content/uploads/2017/12/6.png)

### 3. 部署マスタの取得

Site Address は察してください(サイトのアドレス入れるだけ)

![](http://1bed.allright.life/wp-content/uploads/2017/12/7.png)

↑ この画像を取る時に気づいたんだけど、詳細オプションから絞り込みとかできるんだねー

### 4. 部署マスタのアイテムを繰り返し処理

繰り返し処理では、変数をセットして判定を行い、今日が開始日と終了日の間なら「活性化」を「はい」に、期間外なら「活性化」を「いいえ」にする

![](http://1bed.allright.life/wp-content/uploads/2017/12/8.png)

1つづつ説明、変数 StartDate をセット
開始日(内部列名:StartDate)が空値の時は最小値をセットすることで、開始日に値がない時には開始日に制限がないということなる
※ここで気づいたけど、変数名と内部列名を一緒にして説明書きづらい...

![](http://1bed.allright.life/wp-content/uploads/2017/12/9.png)

同様に変数 EndDate をセット

![](http://1bed.allright.life/wp-content/uploads/2017/12/10.png)

最後に期間内なら「活性化」を「はい」に、期間外なら「活性化」を「いいえ」にする

![](http://1bed.allright.life/wp-content/uploads/2017/12/11.png)

最初の判定が見切れてるので下記に転載
セットした変数 StartDate と EndDate を現在時刻 utcNow() と比較しています

```
@and(
    less(variables('StartDate'), utcNow())
    ,
    greater(variables('EndDate'), utcNow())
)
```

## 考察

やりたい事はだいたい行けそうな気がする

しかし、恐らく次に要望で出るのは、過去データを残しつつ(表示しつつ)、登録・修正時には新しいデータで行いたいということだけど、これは今のところ、マスタの Title も表示して JSLink で表示を書き換えるぐらいしか思いついていない

## 参考 URL

* 複数の値を確認する条件で式を使用する  
  [https://docs.microsoft.com/ja-jp/flow/use-expressions-in-conditions](https://docs.microsoft.com/ja-jp/flow/use-expressions-in-conditions)
Rubyの末尾呼び出し最適化を試す

どうも寝落ちしました。rsnniです。
[Classi Advent Calendar 2017](https://qiita.com/advent-calendar/2017/classi) 17日目です。

Rubyも末尾呼び出し最適化をサポートしていると聞いたので試してみました。

## 末尾呼び出し最適化?

例えば、再帰で階乗計算する際に以下のように書いたとします。

```
def fact(x)
  return 1 if x == 0
  fact(x - 1) * x
end
```

この場合、再帰呼び出しをしたfactの結果にxをかけているため、
factの計算後に呼び出し元に戻さなければなりません。
これによって深い再帰になるとスタックが溢れる事になります。

そこで、以下のように再帰呼び出しを計算の最後に持ってこれるように書き直します。

```
def fact_tail_call(x, m = 1)
  return m if x == 0
  fact_tail_call(x - 1, x * m)
end
```

このように書き直した時に、トップレベル以降の呼び出し元に戻す必要がなくなる事から、
処理系がスタックを積む事なく最適化してくれます。

## 試してみる

デフォルトではサポートしておらず、コンパイルオプションを指定する必要がるようです...

```
RubyVM::InstructionSequence.compile_option = {
  :tailcall_optimization => true,
  :trace_instruction => false
}

RubyVM::InstructionSequence.new(<<-EOS).eval

def fact(x)
  return 1 if x == 0
  fact(x - 1) * x
end

def fact_tail_call(x, m = 1)
  return m if x == 0
  fact_tail_call(x - 1, x * m)
end

EOS
```

末尾呼び出しでない再帰ではスタックオーバーフローが発生しますが、

```
irb(main):019:0> fact(10000)
SystemStackError: stack level too deep
```

末尾再帰では最適化され計算できる事が確認できます。

```
irb(main):020:0> fact_tail_call(10000)
=> 2846259680917...
```
【メモ】WebStormでGetter/Setterを自動作成するコマンド

# WebStormでGetter/Setterを自動作成するコマンド
完全に個人的なメモ。
Mac用のコマンド。

## コマンド
以下の方法で面倒くさいGetter/SetterをIDEが自動で作成してくれる。

```
1. command + n
2. Getter / Setter / Getter and Setter より選択
3. Getter/Setterを作成するフィールドを選択
```
コンピュータサイエンス 論文引用数ランキング

| 順位 | タイトル | 著者 | 発表年 | 引用数 |
|:-------:|:----:|:-----:|:------:|:------:|
| 1 | Statistical Learning Theory | V Vapnik | 1998 | 9898 |
| 2 | Introduction to Algorithms | T H Cormen, C E Leiserson, R L Rivest, C Stein | 1990 | 9039 |
| 3 | Maximum likelihood from incomplete data via the EM algorithm | A P Dempster, N M Laird, D B Rubin | 1977 | 8999 |
| 4 | Distinctive image features from scaleinvariant keypoints | D Lowe | 2004 | 5621 |
| 5 | Gapped BLAST and PSI-BLAST: a new generation of protein database search programs | S F Altschul, T L Madden, A A Schaffer, J Zhang, Z Zhang, W Miller, D J Lipman | 1997 | 5384 |
| 6 | A tutorial on hidden Markov models and selected applications in speech recognition | L R Rabiner | 1989 | 4585 |
| 7 | Reinforcement Learning, an introduction | R Sutton, A Barto | 1998 | 4148 |
| 8 | Optimization by simulated annealing | S Kirkpatrick, C D Gelatt, M P Vecchi |   1983 | 3918 |
| 9 | A scalable peer-to-peer lookup service for internet applications | I Stoica |   2001 | 3835 |
| 10 | Libsvm: a library for support vector machines | C-C Chang, C-J Lin | 2001 | 3829 |

出典: http://citeseer.ist.psu.edu/stats/articles
Vue.jsとAtomicDesign

# 最初に

この記事はVue.jsが最近のマイブームな若造フロントエンドエンジニアが、
コンポーネントの再利用性とイベントバケツリレーの煩雑さの間でもがき苦しみ
AtomicDesignなるものに行き当たった結果、
これをVue.jsで実現する方法を考え書き綴ったものです。

Vue.jsやVueコンポーネント、Vuex / Vue Routerとはなんぞやという部分については
適当に触れる程度にわかってる前提で話を進めます。

そもそもQiita初投稿になるので文章の読みにくさなどはこっそり指摘をください。

# 経緯

個人開発のアプリケーションで、SPAを作ってみようと思い至る
↓
Vuex / Vue Routerを考えなしに導入
↓
再利用性のなさに絶望
↓
ページごとに必要なデータを揃えるだけの親コンポーネント作る
↓
イベントバケツリレーに辟易

だいたいこんな感じです。
「イベントバケツリレー」と「Vuex / Vue Routerにガッチガチにコンポーネントが縛られる現象」についてはVue.js始めた人なら必ず通る道と勝手に思っています。

# AtomicDesign とは？

もともとはUIデザインの手法のようです。
UI要素を、以下の５つに分類します。

- Atoms (原子)
    - UIの最小単位。ボタンやラベルなど、「これ以上分割できない」単位。
- Molecules (分子)
    - 複数のAtomsから構成される、単純な機能を表現する単位。
- Organisms (有機体・生体)
    - Atoms, Molecules, あるいは他のOrganismsから成る、  
      あるまとまった意味を持つような単位。ヘッダ、フッタなど。
- Templates (テンプレート)
    - 複数のOrganismsを組み合わせワイヤーフレーム化したもの。  
      ページ全体のレイアウトを整えるものと言ってもいい。
- Pages (ページ)
    - Templatesに実際のデータ、文言などを流し込んで完成したページ。

詳しくは以下のページを参照ください。

- [珍しいワークフロー：Atomic Designの原則とSketchでデザインからプログラミングまで \| デザイン \| POSTD](http://postd.cc/the-unicorn-workflow-design-to-code-with-atomic-design-principles-and-sketch/)
- [Atomic Designの考え方と利点・欠点 \- I'm kubosho\_](http://blog.kubosho.com/entry/using-atomic-design)

# 本題

早速これらをVue.js (+ Vuex / Vue Router)の文脈に置き換えて考えてみました。

- Atoms
    - UIの最小単位。通常のHTML要素やそれらのシンプルな拡張。
    - (ex. 型バリデーションをする`<input>`要素)
- Molecules
    - 複数のAtomsから構成される、ドメイン色の薄いデータを受け取って単一の機能を実現するコンポーネント。  
    - props down, events upで実現されるのが望ましい。
- Organisms
    - Atoms/Molecules/Organismsから成る、ドメインに強く左右されるデータを取り扱うためのまとまった機能を提供するためのコンポーネント。
    - Vuexやその他ストアオブジェクトとの繋ぎこみはここで行う。
- Templates
    - `<slot></slot>`や`<router-view></router-view>`を使ってページ全体のレイアウトを提供する。
    - (ex. 3つの名前付き`<slot>`を使った聖杯レイアウト)
- Pages
    - ドメインの各ページに対応する。TemplatesにOrganisms/Molecules/Atomsを流し込んで実際のページを構築したり、Vuexへの初期データ読み込み(API通信など)、Vue Routerのデータ利用はここで行う。

ポイントとしてはTemplatesもまた再利用可能なものであるということです。
ページ全体のTemplateに情報やパーツを流し込んで個別のページを作り上げるのはPagesの担当です。
ドメインやストアに関わる情報はPages/Organismsに集中させ、Atoms/Molecules/Templatesは再利用可能なように構成します。
これによって、少ないイベントリレーでVuexストアを利用することが可能になると思います。


# まとめ
本稿の解釈はあくまで個人的な主観、経験からくるものが強いので、
ありきたりではありますが「VuexやVue-Routerとの結合度が高い再利用を考えないコンポーネント」と「結合度の低い再利用性の高いコンポーネント」に分けることが再利用性の高いコンポーネント設計に役立つのではないかなと思います。
天体の観測データの三次元可視化

# はじめに

[Delphi Advent Calendar 2017](https://qiita.com/advent-calendar/2017/delphi)18日目の記事です。

初めまして。
某大学院の学生のちよ子です。

[luxidea](https://qiita.com/luxidea)さんにDelphi Advent Calendarの存在を教えていただいたので、プログラマとしては本当にぺーぺーですが、参加させていただきます。
今回は学士の卒業研究から継続している研究についてちょっとした記事を書こうかな、と思っております。
研究で作成しているTimeTubesというツールはdelphiで開発をおこなっております。
※luxideaさんが作成された様々なライブラリを活用させていただいております。

# 研究の概要
研究内容をまとめたスライドをslideshareにアップしたので、詳細はそちらをご覧ください。
[スライドへのリンク](https://www.slideshare.net/secret/sfhLNzvKKpylXV)
##背景
私の研究はブレーザーという天体の観測データの可視化に関する研究です。
対象としている観測データは多次元時系列（観測時刻＋6次元）で、観測項目の時間変化と相関の解析が必要なのですが、それまで天文学の領域で用いられてきた散布図とアニメーションを組み合わせた可視化手法ではそれらの解析が困難でした。
また、天候などの要因で、観測誤差が大きかったり、そもそも観測が行えていない欠損期間が存在する、などの不確実性を有しています。


そこで、私たちの開発する**TimeTubes**は

- 多変数を一画面で同時に可視化することで観測項目の時間変化や相関関係の解析を容易にする
- 同一の天体に関する複数観測所からの観測データを融合することで、観測データの有する不確実性を緩和する

ことを目的としています。
##TimeTubesの概要
こんな感じのツールです。
大きく表示されているチューブが一つのデータセットを表現しています。
![TimeTubes_3C4543C1_20170819_224542 - コピー.png](https://qiita-image-store.s3.amazonaws.com/0/218952/baf9bf77-4a18-1aaa-c5d9-d8ba3691df37.png)
スライドの方に詳しい可視化方法などは記載しております。

##今後の課題
現在、多次元時系列データの特徴検出や、複数データセットを数学的？統計的？により高度に融合する手法について、文献や手法を調査しております。
もしこんな記事を読んでいらっしゃる方で時系列データ解析についてよさげな手法等ご存知の方がいらっしゃりましたら、ぜひアドバイスいただけたら幸いです！

# おわりに
ここまで読んでくださり、ありがとうございました。
皆様もうすぐクリスマスですね。
よい年末をお過ごしくださいませ！
ブロック並べ攻略の話。Team ASaGiの場合。前編。 

#はじめに

本記事はETロボコン Unofficial Advent Calendarの12日の記事です。

はじめまして。Team ASaGiのチームリーダー兼アーキテクト担当です。個人としては、ETロボコンに今年初めて参加しました。
Team ASaGiの競技成績として、南関東地区大会とチャンピオンシップ大会の両方で、ボーナス図形である五角形を構築できました。

![地区大会試走時の様子.jpg](https://qiita-image-store.s3.amazonaws.com/0/222444/ccf60b9b-179f-e110-fff8-39b57b9aedaa.jpeg)


今年の活動中、過去のAdvent Calendarを読んで参考にさせて頂いたので、Team ASaGiもブロック並べの攻略を中心に、得られた知見やノウハウを公開したいと思います。

#アーキテクチャと攻略手順の話
Team ASaGiのブロック並べ攻略のポイントは、走行体とは別の外部ツール（以下、モニタツール）を用いたことです。
モニタツールにて、初期位置コードの入力から解法の算出を行い、競技中は走行体の各種情報を常時モニタリングすることで、様々なメリットを得ることができました。これらの内容について書きたいと思います。

まず、走行体とモニタツール、システム全体のアーキテクチャは以下の通りです。

+ 走行体とモニタツールはBluetooth※で通信
+ 走行体のプラットフォームはEV3RT/TOPPERS
+ 走行体では走行制御タスク/電文受信タスク/電文送信タスク/音声再生タスクが動作
+ モニタツールのプラットフォームはノートPC
+ モニタツールはWPFで開発

公開されているライブラリ以外は、過去の資産等は使用せず、全て今年のメンバーで開発しました。
*※「Bluetooth®」は、Bluetooth SIG, Inc. USAの商標または登録商標です。*

次に、ブロック並べの攻略手順は以下の通りです。

1. 人間が初期位置コードをモニタツールに入力
2. モニタツールはブロックの運搬ルールを算出
3. 人間はモニタツールの画面上に表示される運搬ルールを確認して、送信操作を行う
4. モニタツールは運搬ルールをシリアライズして、走行体に電文を送信
5. 走行体は受信した電文をデシリアライズして、運搬ルールを展開
6. 走行体はブロック並べにおいて、運搬ルールに従って走行

Team ASaGiでは、運搬経路全体を運搬ルールと定義しています。運搬ルールは、複数の運搬コマンドで構成されており、運搬コマンドは運搬元・運搬先のブロック置き場とそれぞれのブロック置き場への移動経路で構成されます。

![運搬ルールのオブジェクト図.png](https://qiita-image-store.s3.amazonaws.com/0/222444/092f9de4-ecff-7725-5368-43517733a541.png)


この攻略手順の強みは、『走行体が何をしようとする（した）のか』を人間が明確に判断できることです。
理解があると、ブロック並べに失敗したとき、問題の切り分け難易度が大幅に下がります。

#モニタツールの話
ブロック並べの攻略を中心に、モニタツールの主な機能について書きます。

![モニタツールの画面.PNG](https://qiita-image-store.s3.amazonaws.com/0/222444/2411b021-8f9a-bbfe-431b-a73ffaa54085.png)


##ブロック運搬ルールの算出
先述の通り、初期位置コードからブロック運搬ルールを算出します。

![初期位置コードのデコード.PNG](https://qiita-image-store.s3.amazonaws.com/0/222444/e2aea9c0-8481-3ca5-069b-c9402166d446.png)

五角形は他のボーナス図形と異なり、完成図形がほぼ1種類しか存在しません。（赤・黒の配置違いのみ）従って、運搬経路を含む運搬コマンド算出のロジックはシンプルです。

1. 運搬先が空いているブロックのうち、走行体に最も近いものを運搬対象とする
2. 五角形を構成するブロック置き場のうち、運搬対象と同色のものを運搬先とする
3. 運搬元と運搬先の間の最短経路を、ダイクストラ法で算出する

以上の手順で運搬コマンドが生成されます。この手順を繰り返して、五角形を構築する運搬ルールを算出します。
算出が完了すると、運搬コマンドが一手ずつ画面に表示されます。

![運搬手順.png](https://qiita-image-store.s3.amazonaws.com/0/222444/00ce812d-d97e-d0e5-b15c-c2d5539d634c.png)

紫の線が運搬元ブロック置き場への経路、オレンジの線が運搬先ブロック置き場への経路を示しています。

##入出力値モニタリング + ログ保存
以下の情報を表示すると同時に、ログとしてCSVファイルに保存します。

+ 走行体のセンサ及びモータの入出力状態
+ 定周期動作の処理時間
+ 色判別の結果
+ 推定した自己位置座標

ブロック並べ攻略のデバッグは、自己位置座標のログ無しでは厳しかったと思います。

##PIDパラメータの動的変更
走行体は、難所を含む全区間において、個別のPIDパラメータを使用します。これらのパラメータは、運搬ルールと同様に、モニタツールで設定した値が走行体に送信されます。
異なるブロックで五角形が埋まっている場合など、特定の初期位置コードでは、制限時間内にブロック並べを攻略するのは難しいことがわかりました。

![厳しい例.PNG](https://qiita-image-store.s3.amazonaws.com/0/222444/8e7a0130-49e3-f377-ac49-50ce3718645e.png)

厳しい初期配置でも制限時間内に五角形を構築できるように、ブロックを確保した後は高速に走行する処理を実装しました。
しかし、速過ぎるとブロックを置き去りにするので、トライ&エラーで値を調整しています。

後編では電文送受信と、自己位置補正について書きたいと思います。

#【備考】モニタツールで使用したOSS一覧

+ Prism　MVVM基盤として採用
+ ReactiveProperty　快適にリアクティブプログラミングを実現するため採用
+ Live Charts トレンドグラフの表示に採用。バインディングで値更新しても軽くて○
+ Material Design In XAML Toolkit　UIデザインの根幹に採用
+ MahApps.Metro　タイトルウィンドウの色を変更するために採用
+ NLog　起動毎、一定回数分のログを保存するために採用
レガシーシステムの調査をモブでやってみた

この記事は移行しました！[最新の内容はこちら](https://naoqoo2.github.io/blog/%E3%83%AC%E3%82%AC%E3%82%B7%E3%83%BC%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%81%AE%E8%AA%BF%E6%9F%BB%E3%82%92%E3%83%A2%E3%83%96%E3%81%A7%E3%82%84%E3%81%A3%E3%81%A6%E3%81%BF%E3%81%9F/)をご覧ください😀



## はじめに

システムリニューアルや障害などで、古いシステムを調査することって良くありますよね。
この調査というタスク、非常に厄介です。
いつもは一人でやる（やらされる）ことが多いのですが、
今回モブでやってみたら最高に幸せだったよという話をします。

## レガシーシステムとは

まず、今回のレガシーシステムを定義しておきます。
みなさんも一度は見たことあるかもしれませんね。
どれか一つでも当てはまれば、それを想像しながら読み進めていただければと思います。

- 初期リリースから10年以上経っている
- 誰も全ての仕様を把握していない
- 見たことない言語で動いている
- 誰も調査したがらない
- バージョン管理されておらず、改修日と作業者名のコメントが大量にある
- コードがやたら長いし謎処理が大量にある
- もう使われていないであろうコントローラも大量にある
- ファイル名や変数名は暗号のよう
- ソースが追えない
- 心が折れそうになる

## 今回の作業内容

上記のようなレガシーシステムを一部リニューアルするにあたり、
『とあるDBのとあるテーブルがどのタイミングで更新されるか』を調査することになりました。

ソロでもモブでもやることは変わりません。
テーブル名でgrepして、ヒットした箇所（100件以上）をひたすら調査していきます。

## モブで調査してみた

今回は対象のDBに多少詳しいH氏と2人で行いました。
どちらもレガシーシステムには（言語含め）詳しくありません。

一緒にgrepした結果を眺めて一つ一つソース解析していきます。
フェーズ毎に様々なメリットがありました。

- 調査前
    - 一人じゃないので安心感がある
    - レガシーシステムに立ち向かう気になれた
- 調査中
    - SQLのCRUDの仕分けがゲーム感覚でサクサク進んだ
    - 一人が見逃してもカバーできた
    - 調査結果のまとめ方をお互いに学べた
        - これ普段共有することなかったので新鮮だったし大事だと感じた
    - 判断が速かった
        - 使われてなさそうなファイルがヒット
            - 2人「これはもう無視しよう。きっと大丈夫」
        - 非常に関連が高そうな別テーブルが現れた
            - H氏「あ、それもう使ってないから調査不要です」
- 調査後
    - 調査結果に自信を持てた
        - 仮に漏れがあっても仕方ない感
    - 共有の時間が不要だった
    - 調査結果を元にした次のアクションをすぐ決定できた
    - 数日かかると見積もっていたが数時間で終わった


## もし一人でやっていたら...

経験をもとにどうなっていたかを考えてみました。
みなさんもこんな経験あるのでは？

- 調査前
    - 不安。樹海に飛び込む感覚
    - モチベーションあがらない
- 調査中
    - CRUD仕分け
        - 集中力の低下
        - 速度の低下
        - ミスしてそうという不安
    - 孤独との戦い
    - 自分しか読めない調査資料の完成
    - 判断できない
        - 使われてなさそうなファイルがヒット
            - 頑張って時間かけて調べる...が確信持てない
        - 非常に関連が高そうな別テーブルが現れた
            - 頑張って時間かけて調べる...がよくわからない

- 調査後
    - 調査結果に自信が持てない
    - 使われてなさそうなファイル＆別テーブルの共有
        - 「もうちょっと調べてみて」
            - ふたたび樹海へ...
    - 数日たったが終わりが見えない
    - 次のアクションに進まない

## さいごに

書いてて思ったのですが、もし一人でやってたらと思うとゾッとしますね。
（まぁいままでは一人でやってたわけですが）
これからは誰もが嫌がるタスクはモブでやっていこうと思います。

調査に苦しんでる人は是非お試しあれ。周りを巻き込んで！
Windows10のカスタムしたスタート画面をデフォルト設定にする方法

## 設定方法
### スタート画面のカスタマイズ
スタート画面を普通にカスタマイズする。
**ピン留めが1つも無いと正常に動作しない**ため、何かしらピン留めしておくこと。

### スタート画面レイアウトをエクスポートする
PowerShellを**ユーザー権限**で起動し、次のコマンドを実行する。

```ps1:PowerShell
Export-StartLayout –Path $env:USERPROFILE\TempLayout.xml
```

### スタート画面レイアウトをデフォルトプロファイルに設定する
PowerShellを**管理者権限**で起動し、次のコマンドを実行する。

```ps1:PowerShell(Administrator)
Move-Item C:\Users\{エクスポート時のユーザーID}\TempLayout.xml C:\Users\Default\AppData\Local\Microsoft\Windows\Shell\LayoutModification.xml
```

## 番外編:監査モードの場合の作業
### スタート画面のカスタマイズ
スタート画面を普通にカスタマイズする。
**ピン留めが1つも無いと正常に動作しない**ため、何かしらピン留めしておくこと。

### スタート画面レイアウトをデフォルトに設定する
PowerShellを起動し、次のコマンドを実行する。

```ps1:PowerShell
Export-StartLayout –Path $env:USERPROFILE\AppData\Local\Microsoft\Windows\Shell\LayoutModification.xml
```

上記作業後にSysprepでCopyProfileをすると、デフォルトのスタート画面レイアウトがカスタマイズ後のレイアウトとなる「。




今は利用できない方法
---
Windows10 1709以前はプロファイルの一部として保存されていたためCopyProfileでデフォルト設定にできていたが、1703より変更された模様。

## 設定方法
スタート画面をカスタマイズする。
**ピン留めが1つも無いと正常に動作しない**ため、何かしらピン留めしておくこと。

PowerShellを**ユーザー権限**で起動し、次のコマンドを実行する。

```ps1:PowerShell
Export-StartLayout –Path C:\Users\Public\StartLayout.xml
```

PowerShellを**管理者権限**で起動し、次のコマンドを実行する。

```ps1:PowerShell(Administrator)
Import-StartLayout –LayoutPath C:\Users\Public\StartLayout.xml -MountPath C:\
del C:\Users\Public\StartLayout.xml
```


## 参考
https://docs.microsoft.com/ja-jp/windows/configuration/customize-and-export-start-layout
https://technet.microsoft.com/ja-jp/library/dn283403(v=wps.630).aspx
https://docs.microsoft.com/ja-jp/windows/configuration/customize-windows-10-start-screens-by-using-group-policy
http://www.town.yakumo.lg.jp/modules/information_blog/details.php?bid=1669
使ってもらえるシステムを作るためには

# はじめに
長い間、いろいろなシステムに携わってきましたが
なかには作ってみたものの結局使ってもらえず終わってしまったものも多くありました。

それはなぜか？
使ってもらえるシステムを作るにはどうしたらいいのか？
コンサルタントに必要な知識を持っていれば作れるんじゃない？

と考え、

**コンサルタントはなんぞや**

にフォーカスし、自分なりにまとめてみました。

##コンサルタントとは?
コンサルタントっていったい何をしてくれるんだろう？
って明確にイメージ出来ますか？

私はいまいちイメージが出来ていません。
調べてみると自分の仕事に関わってくるところだと

* ITコンサルタント
* システムコンサルタント

この２つの違いって？
サイトによって色々ですが、私のイメージに近いのが以下

**ITコンサルタントとは？**
字のごとく**「技術に関するコンサルタント」**
すなわち、”技術で達成したいこと”の相談に乗ってくれる人
技術で解決したい課題が明確になっている場合はこちらに相談


**システムコンサルタントとは？**
**「仕組みに関するコンサルタント」**
ビジネスを成功させる業務の仕組みを相談する相手
この範囲は広い！！
ビジネスモデルの一部から細かい業務フローまで含まれます。
業務フローにはITを使う業務も使わない業務も包含するので、
ITは解決手段の１つにしか過ぎない


では、ユーザーに使ってもらえるシステムを作るにはどっちの知識が必要なのか？
私はどっちもだと思います。(当たり前だ！！って突っ込み入りそうですがｗ)

### コンサルタントに必要な知識

* コミュニケーション能力、プレゼンテーション能力
* 業務フローの知識・理解
* IT技術に関する深い知識・経験
* 論理的思考力

具体的に見ていくと

<dl>
<dt>コミュニケーション能力</dt>
<dd>相手の言っていることを（ハイレベルな精度で）正しく理解すし整理する能力</dd>
<dd>クライアントが考えることを引き出す質問力</dd>
<dd>自分の意見をわかりやすく、誤解なく相手に伝える能力</dd>
</dl>

<dl>
<dt>論理的思考力</dt>
<dd>クライアントの課題をヒアリングするとき、問題が発生したときに原因を分析して解決策を考えるとき、仮説を設定し検証方法を考えるときなどあらゆる場面で必要とされる能力</dd>
<dd>
<br>
代表的な論理的思考力法に<br>
・クリティカルシンキング（批判的思考）<br>
・MECE(漏れなくダブりなく）<br>
・ロジックツリー<br>
・仮説思考、問題解決思考<br>

があります。
</dd>
</dl>
<dl>
<dt>業務フロー、IT技術に関する深い知識・経験</dt>
<dd>は字のごとくですね。
これらがわからないと何か課題なのか、問題点なのかわらからない
実現するための提案が出来ない
ということになります。</dd>
</dl>

## まとめ
ざっくりと書き出しましたが、どれもこれもユーザーが使ってくれるシステム作りには
必要な知識だと感じました。
と同時に、今までがシステムよがりのシステムを作ってきたから使ってもらえなかったのではないかと
ちょっと反省しています。

**ワクワクするシステムをつくるために！**
**わくわくする仕事をするために！**

これからはこれをどう学んでいくか、活かしていくかが課題になってきます。
もう少し、コンサルタントについて深堀しなくてはならないのですが
まずは触りということでまとめさせていただきました。

何かの参考になったら嬉しいです。
35歳になったエンジニアが今後のキャリアパスについて悩んでみた

先日35歳になりました。厄年です。


掲題の通り今後のキャリアパスについて悩みました。
漠然としてなになろうか悩んでいたことには悩んでいたのですが、今回は具体的なお話がきました。

#本題の前に自己紹介
今年で17年目くらいになるphpのエンジニアです（得意なのは要件定義〜開発まで一貫してできる環境です）。
特に何かに特化しているわけでもなく、のらりくらりとしたエンジニアでここまで生きてきました。
SESで外部に出ている傍で営業もしつつ、フリーランスの延長で会社員をしています。自分の案件は自分で営業して取ってきます。
今の会社は8年くらいいます。
現場が変わることに抵抗はないのですが、どちらかというと変化に弱い人間です。

#いつから悩んでるの？
数年前、ディレクターになりたくて転職を考えたことがあります。その時は知人から色々な会社様を紹介してもらいました。
結局転職しなかったわけですが、理由としては、「自分の成長」をとるのか、「会社の成長」をとるのかを考えた結果、「今の会社の成長を見守る」ことを選択しました。
毎年転職は考えているのですが、それはエンジニアとしてでした。
PMには興味がなく、PMOをやった時はなんとなく物足りなかったです。もうちょっとクリエイティブな要素があるといいなぁと思いました。
で。
今年の夏くらいに「プロダクトマネジメントの仕事に興味はない？」という話をいただきました。
はい、これをきっかけにまた悩むことになるのです。

#なんで悩んでるの？
目の前に差し出されたチャンスに手を出すのになぜ躊躇したか。
今までもエンジニア以外のポジションで仕事をしたことはありますが、今までのはなんとなくエンジニアの延長だったので今回の「プロダクトマネジメント」の話は別次元だなと思い、興味はありましたがその場で返事ができませんでした。
今回の話がなくてもキャリアパスについては悩んでいました。それが具体化した。

今まで経験のしたことのない未知の職種を選ぶより、これからもエンジニアとして生きて行く方が今までの経験も生かせるし、日々新しい技術や手法を勉強するのも苦ではないので今まで通り平穏な時を過ごせるでしょう。ようは今の暮らしのまま平坦でいられます。変化があったとしてもそれは現場が変わるとかそのくらい、いつも通りの変化。

　　**でも本当にそれでいいの？**

#で、どうしようか？
何かで見かけた言葉です。
*「悩んだ時は理想の自分だったら選択する方を選ぼう。そうすれば理想の自分に近づける。」*
理想の自分なら、多分二つ返事で受けるでしょうね。
なので、ちょっとこの言葉を信じてみようと思います。
年齢も年齢だし、チャレンジできることなんてもうないかもしれない。こんなにいいチャンスを逃すなんて勿体無い！！　向いてなくてダメだったら契約更新されないだけだよ。極端な話、死ぬわけじゃない（迷惑はかけるけど）。

#結論
受ける。面談行ってみる（面談受ける前から悩んでたのかよというツッコミは置いといて）。　そこから。　
もうこの年です、「今度」なんて来ないかもしれません。やってみないと向き不向きもわからない。最後のチャレンジかもしれないし。
実際のところ、上記の「プロダクトマネジメント」の話以外にも、ディレクション関係とかの話もいただいていて、これはキャリアチェンジのタイミングなのかもしれません。


###おまけ。
自社では社員のキャリアパスとかを考える部署にも所属しています。各社員のスキルをレーダーチャート化して、自分のなりたいキャリア（……例えばざっくりいうとPMとかITスペシャリストとか）に足らないパラメーターがなんなのかを可視化して目標を設定してもらおうとしています（まだ計画段階）。

人のキャリア考えるよりよりまず自分のキャリアを考えろ・でした:sweat:

……でも、IoTもやりたいんだよなー。

---
#後日談
具体的な作業内容として、企画よりPM色が強いのと、契約の兼ね合いで業務委託が難しいということでプロダクトマネジメントのお仕事のお話は流れてしまいました。
でも、今までなんとなーくで仕事してきてやりたいこともよくわからなかったのですが、自分のやりたいことは見えてきたので今回がっつり悩んでよかったなぁと思っています。
Ext.jsでのCSSの適用について、デザイナーができること

Ext.jsで作るプロダクトにCSSでデザインを施していく際に色々と考える必要があったので記事にします。

弊社ではここ1年くらいに開発しているプロダクトにExt.jsを採用する事が多く、社内でのナレッジはまだまだできていなかった所もあり、CSSの当て方について深く議論がされていませんでした。


デザイナーの私も、画像を作成しフロントのエンジニアさんにコーディングしていただいていましたので、実際に自身でCSSを書く時に色々とやり方がわからず不適切なやり方で乗り切っていた所がありました。

Ext.jsではclassを付けることが可能ですが、デザインの為のcssのclassは機能を作っている最中では不要です。
私自身も勉強不足だった所もあり、classの付け方がわからず、出力されたhtmlに書かれている、自動で吐くナンバリング付きclassに紐づけてcssを記述していました。

![ng.png](https://qiita-image-store.s3.amazonaws.com/0/212964/0b1c2410-b37a-4a60-4d3d-35e81e73d287.png)
[extが自動でナンバリングしたidにcssを当ててしまっていた。]

しかし、その方法ではコンポーネントを一つ追加しただけで、ナンバリングがずれ、その結果cssの適用範囲もずれてしまい、全体的に崩れるという事が頻発しました。

非常に非効率な所もあり、社内で検討した結果、エンジニアさんがある程度のコンポーネントを配置した状態でデザイナーに共有し、デザイナーが各コンポーネントにclsタグや、ulタグでclassやui名を付けて、そのまま見た目のコーディングまで行う形で進めました。

行ってみると、jsのコンポーネントにclsを追加するだけですので、htmlタグにclassを付けるのと同じ要領で簡単です。

![cls.png](https://qiita-image-store.s3.amazonaws.com/0/212964/2e332a07-eb2c-cbc3-fc45-55e57d8f1e28.png)
[clsを記述するだけでhtmlに反映されます。]

![themer.png](https://qiita-image-store.s3.amazonaws.com/0/212964/790fce94-6afd-30c7-9d8e-0eecb80cac79.png)
[uiを記述すると、sencha themerで個別にコンポーネントのテーマを触る事ができます]

cssはSCSSファイルですので記述はSCSS記述で行うのが良いですが、通常のCSS記述でも問題ありません。
またExt.js用意されているテーマ変数を利用し記述する方法もあります。

Ext.jsは完全に自動的にhtmlを吐き出すので、制御が難しい所もありますが、クセを理解してしまえばデザイナーが見た目の部分を直接作っていくことはそこまで難易度の高い事ではないと感じました。
Actions SDK を利用するための gactions が実行できない

実行できず諦めかけてしまったので、共有しておきます。。。

Actions on Googleで、Actions SDK を利用するには gactions コマンドを打てるようにしなければならない（[参照：Create a project and action package（公式）](https://developers.google.com/actions/sdk/create-a-project)）のですが、適当にやるとMac（x86_64）環境で"command not found"と出て、実行できなかったので正確な実行方法について書いておきます。

# 現象（適当なやり方）
[gactions Cli](https://developers.google.com/actions/tools/gactions-cli) で「Mac x86_64」からダウンロードした gactions ファイルを自作したプロジェクトフォルダに移動し、ターミナル上で該当フォルダに移動（cd）した後、下記のコマンドを実行。

```
gactions init
```

→ command not found.

# 解決（正確な方法）
自作したプロジェクトフォルダに gactions ファイルを移動した後、ターミナルで該当フォルダまで移動して、"chmod +x" 実行後、**フルパス**で gactions を実行。

コマンドを下記。

```
chmod +x gactions

~Desktop/firebase/ActionsSDKApp/gactions init
```

もしくは "chmod +x" 後の gactions に **path を通しておく**とフルパス指定がいらなくなります。


gactions ファイルのあるフォルダまで移動しておけば、ファイル名だけでコマンドが打てるのではと思っていたのですが違うようです。
コマンド系には path を通すことを心がけようと思いました。（小並感

# 参考
- https://stackoverflow.com/questions/45039531/cant-install-gactions-cli
vim 8 でパッケージ管理

これまで vim のパッケージ管理は dein.vim を使っていたのですが、 vim 単体でもパッケージ管理できるらしいので試してみました。 macOS Sierra へ vim 8 をインストールし、 vim の plugin をインストールします。

# vim 8 インストール
lua の plugin を使いたいので、vim インストール前に lua をインストールします。

```
$ wget http://www.lua.org/ftp/lua-5.3.4.tar.gz
$ tar zxvf ./lua-5.3.4.tar.gz
$ cd ./lua-5.3.4
$ make macosx
$ make install
$ ln -s /usr/local/include /usr/local/bin/include
```

vim 本体をインストール。

```
$ wget https://github.com/vim/vim/archive/v8.0.1290.tar.gz
$ tar zxvf ./v8.0.1290.tar.gz
$ cd ./vim-8.0.1290
$ ./configure --enable-luainterp=yes --with-lua-prefix=/usr/local/bin --enable-pythoninterp=dynamic
$ make
$ make install
```

# plugin インストール
まず plugin を設置する為の、ディレクトリを作成します。
ディレクトリは ~/.vim/pack/任意の名前/{opt,start} で作成します。
今回は 任意の名前 = mypackage とします。

```
$ mkdir -p ~/.vim/pack/mypackage/opt
$ mkdir -p ~/.vim/pack/mypackage/start
```

plugin は start または opt ディレクトリ以下に設置すれば動くようです。
試しに neocmplete を設置してみます。

```
$ cd ~/.vim/pack/mypackage/start
$ wget https://github.com/Shougo/neocomplete.vim/archive/ver.2.1.tar.gz
$ tar zxvf ./ver.2.1.tar.gz
$ rm -f ./ver.2.1.tar.gz
```

# .vimrc 設置
neocomplete を有効化する為 ~/.vimrc に下記設定を書きます。

```~/.vimrc
" neocomplete有効化
let g:neocomplete#enable_at_startup = 1
```

上記の状態で vim を起動すれば neocomplete が使えます。

# 終わりに
ディレクトリ作成して、 plugin 設置するだけ。
お手軽にパッケージ管理できるので、ぜひ試してみて下さい。
iOS/Android/Unityアプリ設計事始め

設計とは、楽しく開発し、価値のあるサービスを提供するために欠かせない技術です。
プログラマの貴重な時間が不具合修正に費やされないように、設計技術を身につけてスマートに仕事をこなしましょう。

# 2つの価値観を共存させる

![2人の主人公.jpg](https://qiita-image-store.s3.amazonaws.com/0/116939/51e0c37e-b926-3954-336a-f4ae8a907bdd.jpeg)

Web系の開発では、フロントエンドとバックエンドで職種として別れる程分業が進んでいますが、アプリ開発でも同様の概念が存在します。

有名なものにはMVCがありますが、**アーキテクチャ**と呼ばれるものがこれらの概念を分離するためのものです。多くのアーキテクチャが存在しますが、大まかな思想はどれも変わらないので、Fowlerさんが提唱した[Presentation Domain Separation](http://bliki-ja.github.io/PresentationDomainSeparation/)というシンプルな分離手法で解説します。プレゼンテーション層（UI制御）とドメイン層（それ以外）で分離します。

各開発環境でのプレゼンテーション層は、下記を基底クラスに持つクラス[^1]が該当します。

[^1]: これらを親にもつ標準ライブラリが提供するクラスも含みます。(e.g. UITextView/UIScrollView..)

| iOS | Android | Unity |
|:----|:--------|:------|
| UIViewController  | Activity/Fragment | MonoBehaviour |
| UIView| View | - |

![layer.png](https://qiita-image-store.s3.amazonaws.com/0/116939/91d5d360-6218-522a-29e8-6b3b3a8fd0cf.png)

プレゼンテーション層が、Webのフロントエンドに当たりますね。

# プレゼンテーション層を分離する2つの利点

## 1. 見た目を変え易くするため

デザイナーの気持ちを代弁しますが、最適なUIデザインを動作する前に考えつくことは困難です。プロトタイピングツールを使うことである程度緩和できますが、それでもリリース後にやっぱりイケてなかった・・なんて思うことは多々あります。
そして、プログラマにとってのプレゼンテーション層の設計は、**開発スピードが命**です。このレイヤでは複雑なクラス設計は行わず、デザイナーの意思を素早く反映するためにGUIツールも駆使しながら、極力構造化しない開発を行います。少し「福笑い」をするようなイメージが近いと思います。パーツを上に乗せるだけで簡単に変化しますね。
また、UI仕様が変わることは予め想定しておくのが開発のセオリーです。デザイン仕様が急に変わってボヤくのは、設計に問題があることが多いです。

## 2. 品質に直結するドメイン層を守るため

アプリのコアとなるクラス設計はドメイン層で構築します。業務系アプリではビジネスロジックを書くレイヤですし、ゲーム開発でも見た目に直結しないコアな仕様はこちらのレイヤに分離するのが良い選択です。
ドメイン層はプレゼンテーション層と異なり、ライフサイクルを持たないプレーンな型を使って設計します。ライフサイクルを持つクラスは、ランタイム時にしか動作しないので、ユニットテストができないからです。
ソフトウェアの世界で品質を維持するための主な手段は、**ユニットテスト**を書くことです。これは10年以上変わらない、設計をする上で重要な観点です。
>良い設計はテスト可能であり、テスト可能でない設計は悪い設計である、ということは常に真実です。[^2]

[^2]: レガシーコード改善ガイド（マイケル・C・フェザーズ著）

# 設計の学習方法

設計の重要性は手を動かしてみないとなかなか理解し難いものです。
そして、設計の大部分はテストが主導しているという事実があります。私は**テスト駆動開発（TDD）**[^3]にチャレンジしてみることをお薦めします。テストを行う難しさが自然とアーキテクチャの理解に繋がります。
[^3]: [テスト駆動開発（ケント・ベック著／和田 卓人訳）](http://shop.ohmsha.co.jp/shopdetail/000000004967/)

# 参考プロジェクト

* iOS: [GitHub/housebalance-ios](https://github.com/seachicken/housebalance-ios)  
MVVMアーキテクチャを採用し、テスト可能なプレゼンテーション層([Presentation/ViewModels参照](https://github.com/seachicken/housebalance-ios/tree/master/HouseBalance/Presentation/ViewModels))を実現している。
仮想通貨の制度について

#仮想通貨の登場
ITの進展を背景として、近年、インターネットを通じて電子的に取引される、仮想通貨が登場している。
仮想通貨にはさまざまな種類があり、700種類以上の仮想通貨があることが確認されている(ビットコインは代表的なもの)。預金やいわゆる電子マネーは、発行者が存在し、中央集権的に管理されているが、仮想通貨は必ずしも発行者や管理者が存在しないこと、使用範囲や交換範囲が特定された相手方だけではなく、不特定の者に受け入れられていて通貨的な機能を有することに特徴がある。

#法規制の背景
G7サミット等における国際的な要請や、国内仮想通貨業者の破綻事案を踏まえ、マネー
ローンダリング対策や利用者保護の観点から、2017年4月1日、資金決済法を改正して、仮想通貨に関する法的規制が導入されることとなった。

#仮想通貨の定義
2017年4月1日の改正資金決済法では、次の性質を持つ財産的価値をいる
①不特定の者に対して、代金の支払いなどに使用でき、かつ、法的通貨(日本円やドルなど)と相互に交換できる
②電子的に記録され、移転でできる。
③法的通貨または法定通貨建ての資産(プリペイドカードなど)ではない
有名な仮想通貨として、例えば、ビットコインがある。
また、前払式支払手段やポイントといった特定の加盟店などで使用できるものも上記の定義から除かれる。


# 仮想通貨交換業者の定義と登録
仮想通貨交換業には、⑴仮想通貨の売買又は他の仮想通貨との交換を行うこと、[2]利用者の金銭又は仮想通貨の管理を行うことが含まれる。
2017年4月から、仮想通貨交換業者は以下の義務を課すものである。
①登録
　金融庁・財務局の登録を受けた事業者のみが、国内で仮想通貨交換サービスを行うことができる。
②利用者への適切な情報提供
　利用者に次の情報を提供することが義務付けられている
　・取り扱う仮想通貨の名称や仕組みなどの説明
　・仮想通貨の特性(法定通貨ではないこと、価格変動があることなど)
　・手数料等の契約内容
③利用者財産の分別管理
　利用者から預かった金銭・仮想通貨と、事業者自身の金銭・仮想通貨とを明確に区分する
④取引時確認の実施
　次の場合には、運転免許証などの公的証明書の確認などが義務付けられる。
　・口座開設時
　・200万円超の仮想通貨の交換・現金取引
　・10万円超の仮想通貨の移転(送金)
cesiumでstreetview

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

#写真
![image.png](https://qiita-image-store.s3.amazonaws.com/0/18104/96cf766e-87f9-e9ec-0890-a7b76f64b8f2.png)


#サンプルコード

```
var viewer = new Cesium.Viewer('cmap');
var panorama;
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, 10000.0),
});
function pano(lat, lon) {
    var koko = new google.maps.LatLng(lat, lon);
	var sv = new google.maps.StreetViewService();
	panorama = new google.maps.StreetViewPanorama(document.getElementById('gmap'));
	sv.getPanoramaByLocation(koko, 50, processSVData);
}
function processSVData(data, status) {
	if (status == google.maps.StreetViewStatus.OK)
    {
	    panorama.setPano(data.location.pano);
	    panorama.setPov({
		    heading: 270,
		    pitch: 0,
		    zoom: 1
    	});
	    panorama.setVisible(true);
	}
    else 
    {
	    alert("この場所はストリートビューのデータがありません");
	}
}


```


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

以上。
「みんなの医療統計 12日間で基礎理論とEZRを完全マスター!」３日目

「みんなの医療統計 12日間で基礎理論とEZRを完全マスター!」３日目をやります。今回は、特に犬４匹本に対応する章はなかったので、やらないです。
ただ、今回の章もRスクリプトのスクリプトは特にないです。


#疫学研究のデザイン

##疫学研究に必要なエビデンスはp値だけではない

###ヒルの因果関係の条件
1. 関連の強さ
2. 一貫性
3. 特異性
4. 前後関係
5. 用量反応
6. 尤もらしさ
7. 整合性
8. 実験的証拠
9. 他の要因


統計的有意差はヒルの条件の中の9つのひとつ(１番目)にすぎない。
残りは、生物学的な知識と、どのように研究が行われたかという、疫学的な知識である研究のデザインがベースになる。

間違ってデザインされた研究から得られたデータを、いくら洗練された統計手法をもって解析してもGIGOになる。

##PECOをおさえる
- P：Population 研究にだれが参加したか
- E：Exposure 研究対象因子は何か
- C：Control 比較群は何か
- O：Outcome アウトカムは何か


##介入研究と観察研究
介入研究は研究対象因子(E)が研究のため実験的に割り当てられたかどうかによってきます。割り当ての方法が、無作為なものがランダム化割り付け比較試験になる。
観察研究では、どの患者が研究対象因子に暴露されるか否かの決定に研究者が立ち入ることが出来ない。

##コホート研究とケースコントロール研究
コホート研究はだれが研究に参加するかを決めるときにアウトカム(O)の情報無して決められる研究。
ケースコントロール試験はアウトカムの起こった人に優先的に参加してもらうようにした研究デザイン。コントロールをどうとったかにより、結果が違ってしまうことがある。

##前向き研究、後ろ向き研究、横断研究
前向き研究はアウトカム(O)がまだ起こっていない段階で行う研究。前向きの方がデータの欠損も少なく、質が高いとされる。
後ろ向き研究は過去のある時点に戻って、現在まで前向き研究を行う研究。
横断試験は追跡を伴わない研究。前後関係が確認できないため、最も弱いデザイン。

#補足
>どの研究の質がよいかはそれぞれの研究で用いられた研究デザインの種類や使用された方法によって異なるので、ヒルの９つの条件を思い出して、それぞれの研究の良し悪しを自分の目で聞き、目で判断することを心がけてください。

とのこと。
気になる情報があれば今後追加していきたい。

##介入試験について
対象が、ある特定の治療を受けるようにランダムに割り付けられた後、その治療を受けない場合がある。この場合、大部分の研究者はintention to treatと呼ばれる保守的な方針を適用する。これはすべての患者が、割り付けられた治療を受けたと仮定してデータを解析するものである。この方針の下では有意な影響を見出すのが難しく、保守的な方針と呼ばれる。
歴史対象研究というデザインがある。


##ケースコントロール研究について
ケースコントロール研究から相対危険度は計算できない。罹患する危険や頻度について何の情報ももたらさない。
ケースコントロール研究では、罹患していることが知られているからこそ、その対象を選択したのであり、危険度や相対危険度を求めるためにこのデータを利用することは出来ない。ただし、疾病が非常にまれな場合、ケースコントロール研究から求めたオッズ比は、真の相対危険度におおよそ等しい。
まれな暴露には不向き

##コホート研究について
時間とコスト大
まれな疾患には不向き
treatment by indication(予後の悪い重症例ほど副作用があっても強い医薬品が投与され、副作用のリスクが多く見積もられる)の制御困難


#参考

数学いらずの医療統計学　メディカル・サイエンス・インターナショナル　監訳　津崎晃一
https://www.slideshare.net/k-kajiwara/r-76297637
http://minato.sip21c.org/ebhc-text.pdf
http://minato.sip21c.org/msb/