OmniAICreator/Qiita-1.07M huggingface dataset:
ファイルサーバーのリバースプロキシを作る

# 3行まとめ

* 共用のファイルサーバーのアクセス権の手続きが面倒で自分でやりたい
* ファイルサーバーへのアクセスを仲介するリバースプロキシがあればいい
* Windowsじゃ無理そうだけど、LinuxならcifsとSambaで実現できそう

# 発端

私　　「共有フォルダにあるファイルを派遣さんに見せたいんだけど」
管理者「ああ、1人ずつ申請書書いてください」
私　　「紙で？！」
管理者「紙で」
私　　「・・・まあ、1度なら我慢するよ、\\IP\〇〇ってフォルダなんだけど」
管理者「ああそこは派遣さんに見せちゃダメなファイルがあるからサブフォルダ単位で申請してください」
私　　「え？20フォルダくらいあるんだけど、全部？」
管理者「全部」
私　　「紙で？！」
管理者「紙で」
私　　「面倒じゃないの？他の人はどうしてるの？」
管理者「ああ、各自、別の場所にコピーしてから渡していますよ」
私　　「それはいいんだ」


※演出上、多少脚色はあります。

# 解説

皆さん、NASとかsambaのファイルサーバーを使っていますか？
最近は、GitやWeb上に直接のせたりして需要は減っているのかもしれませんが、
古いサーバーが残っていたり、容量がでかいファイルは相変わらずファイルサーバーを使っている場合も
あるのではないでしょうか。
その場合、秘匿情報があったりして、アクセス権はしっかり設定することが多いですし、
ユーザー追加やアクセス権の設定は、管理者が行っているのではないでしょうか。

しかし、ユーザーが増えてきて管理者の負荷が上がったり、
フォルダ構造がイケてなくて権限の設定が大変だったりすると、
管理者に申請してから使えるようになるまで時間がかかることになります。

せめて特定のフォルダ以下だけでも自分で権限管理ができたらな、と思ったりします。

イメージとしては、リバースプロキシのファイルサーバー版です。

Windowsでは無理そうでしたが、Linuxを使うと、意外と簡単にできたので、その方法を紹介します。
一言で説明すると、cifsとsambaを使っただけです。

なお、Writeはいろいろややこしいので、Readのみにしています。
理屈上Writeも可能のはずですが、怖いので試していません。


# 免責事項

この手法は、緻密に設計されたセキュリティに穴を開けることになります。
この記事を参考にしてトラブルになっても、作者は何の責任も負いません。


# 用意するもの

* CentOS7 (にはこだわらないですが適当なLinux)
* mount.cifs
* samba

# 構築手順

**1. CentOSを初期設定します**

ポイントとしては、ファイアウォールを停止するか、Sambaを公開するようにします。

CentOSならこの辺を参考に。
https://centossrv.com/ (いつもお世話になっています)

**2. cifsを使って、別サーバーの共有フォルダをマウントします**

mount.cifsでWindowsの共有フォルダをマウントします。

    # yum install -y samba-client cifs-utils

    # mkdir /cifs_share
    # mount.cifs -o "username=user01,password=****" //192.168.0.2/share  /cifs_share

yumはCentOSのコマンドですが、他のディストリビューションも似たようなものだと思います。

マウントできない場合は、この記事が参考になりました。
https://qiita.com/You_name_is_YU/items/85ffbffee744f6f494ed


**3. マウントした共有フォルダをsambaで公開します。**

	# yum -y install samba
	
	# vi /etc/samba/smb.conf
	
	[share]
	   path = /cifs_share
	   public = yes
	   writable = no
	   only guest = no

	# systemctl start smb
	# systemctl start nmb

単に2でマウントしたフォルダをsambaで公開するだけです。
細かい設定は、ググってください。


あとは、UIが欲しければ、SWATあたりを使えばよいですし、
ActiveDirectoryのユーザーを使いたければ、Winbindが使えます。


# 最後に

意外と簡単に作れて、セキュリティ的にどうなの？って感じでした。
しかも、サーバー管理者からもブロックが難しそうですし。

くれぐれも悪用したり、ここで知ったと言わないようにしてください。
MacでラズパイSDの準備(balenaEtcher版)


# ラズビアンのダウンロード
[公式サイト](https://www.raspberrypi.org/downloads/raspbian/)からラズビアンのイメージをダウンロード。
Download ZIPで落としてこよう。
結構時間がかかったりするの、以下のソフトのダウンロードを同時に行うのもいいかもしれない。

![スクリーンショット 2019-07-07 23.17.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355869/2658506e-aad1-f7c5-33da-61824612b279.png)


# イメージ書き込みソフトの用意
ddコマンドでもイメージをSDカードに書き込めるが敷居は少し高い。
代わりに、[こちら](https://www.balena.io/etcher/)をおすすめする。

起動するとこんな感じ
<img width="804" alt="スクリーンショット 2019-07-07 23.20.10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355869/f23c1ba5-2d6c-361c-052b-22d30a7beeb4.png">

# イメージ書き込み
Select imageで先ほどのzipを解凍したのを選択、
Select targetには、microSDを指定。Flashで書き込みが始まる。
【AWS】API Gateway経由でWebアプリにアクセスした際のレスポンスがBase64形式となる

# はじめに

AWS Lambdaなどに構築したWebアプリにAPI Gateway経由でアクセスした際に、既定の設定ではレスポンスがHTMLコンテンツではなくBase64形式となってしまう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/258416/522fc1c9-227d-a19c-f844-b99a5e1dc6bc.png)

このような場合は、API Gatewayの設定でAPIの「バイナリメディアタイプ」を追加する必要がある。

# 手順

対象のAPIで[設定]-[バイナリメディアタイプ]で[バイナリメディアタイプの追加]をクリックし、`text/html`または`*/*`を指定して、[変更の保存]をクリック。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/258416/643ed22a-fbe0-87dd-9e12-3603440b6306.png)

設定変更をステージに反映させるためにAPIのデプロイを忘れずに行う。

再度Webアプリにアクセスすると正常にHTMLコンテンツが表示された。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/258416/8f393de6-9d70-c123-fcd0-036621989063.png)

以上
【Ruby】モジュールのミックスインについて

#はじめに
今回はRubyのモジュールについてまとめました！
モジュールには様々な用途があります。
主に以下のような用途です。

**・クラスにインスタンスメソッドを追加する(ミックスイン)**
**・クラスにクラスメソッドを追加する(ミックスイン)**
**・クラス名などの重複を防ぐためにネームスペース(名前空間)を作成する**
**・ミックスインせずにモジュール単体としてメソッドを定義**
など。

最初は何を言ってるか全くわけがわからないと思います。
全ての機能をここで説明するととても長文になってしまうので、今回は上記のうち上から２つ(ミックスイン)に関して説明します。


#モジュールとは
ここで説明する**”ミックスインの機能を持つモジュール”**とは、そもそも何でしょうか。

説明する前に、まずクラスに関してざっとおさらいしておきます。
継承関係にあるクラスは、親クラスのメソッドを子クラスでも呼び出すことが出来ました。
以下がその例です。

```test.rb
class User
 def name(name)
  conversation = "hello,#{name}"
 end
end

class Person < User 
end

person = Person.new
person.name("たろう")
#出力結果 ==>"hello,たろう"
```
親クラスがUserで、子クラスがPersonです。
`class Person < User`でUserクラスを継承しています。
その為Personクラスのインスタンスに対して、Userクラスのnameメソッドを呼んだ際に、
ちゃんと`"hello,たろう"`と返っていることから親クラスのメソッドが使えていることがわかります。

このように、**継承していれば、親クラスのメソッドは使用できる**のですが、逆に
**継承していなければ他クラスのメソッドは使用できない**とも言えます。

継承関係にはしたくないけれども、他クラスと全く同じメソッドを使いたい！と言う場合。
継承できないから同じ内容を毎回毎回クラスごとに書かなくてはいけないんでしょうか？
確かにそれでも良いかもしれませんが、コードの量が増えますし、
理想的なコーディングとして**重複した処理は避ける**べきです。

こんな時に役立つのがまさに！**モジュールのミックスイン機能**です！！
簡単に説明すると、共通のメソッドをモジュール内に定義しておき、
それをそれぞれのクラスで呼び出して使用することができる機能です。
このモジュールを呼び出すことを**ミックスイン**と呼びます。

#モジュールのミックスイン
ではさっそくモジュールのミックスインに関して解説します。
とりあえずモジュールの書き方に関して先に見ておいてください。以下のようになります！

```test.rb
module モジュール名
 #モジュールの内容（メソッドやクラスなど）
end
```
書き方はいたって簡単ですね。ではさっそく使い方を解説します！
##include
まずはインスタンスメソッドをモジュール内に定義して継承関係ではない２つのクラスにそれぞれ適用するケースです。
module名Helloを最初に定義し、(#---①)
moduleを読み込むためにそれぞれのクラスでincludeします。
`include モジュール名`と書くだけで読み込むことができます。  (#---②)
Userクラス内のnameメソッド内でHelloモジュールのhelloメソッドを呼び出しています。(#---③)
同じくDogクラス内のnameメソッド内でもHelloモジュールのhelloメソッドを呼び出しています。(#---④)
その後、それぞれのクラスのインスタンスを作成し、nameメソッドを呼び出すと、ちゃんとnameメソッド内のhelloメソッドが呼び出されていることが確認できます。(#---⑤)

```test.rb
module Hello   #---①
 def hello(name)
  puts "hello,#{name}"
 end
end

class User
 include Hello   #---②
 def name
  hello("たろう")　　#---③
 end 
end

class Dog
 include Hello   #---②
 def name
  hello("ぽち")　　#---④
 end 
end

user = User.new
user.name
# 出力結果 ==>"hello,たろう"   #--⑤

dog = Dog.new
dog.name
# 出力結果 ==>"hello,ぽち"   #---⑤

```
※モジュールもクラスも今回同じファイル内に書いてしまっていますが、もちろん別々にファイルを分けて頂いてOKです！
このように、モジュールで共通のメソッドをひとまとめにすることで、異なるクラスでもモジュール内のインスタンスメソッドが使用できます。

##extend
includeはインスタンスメソッドをモジュールから呼び出すために使用しましたが、クラスメソッドの呼び出しにはextendを使用します。
モジュールの定義方法はincludeの時と変わりません。


```test.rb
module Hello
 def hello(name)
  puts "hello,#{name}"
 end
end

class User
 extend Hello 
 def self.name
  hello("たろう")
 end 
end

User.name
# 出力結果 ==>"hello,たろう"

```

つまり、モジュール内のメソッドをインスタンスメソッドとして使用するのか、クラスメソッドとして使用するのかでincludeとexcludeどちらを使うかが決まると言うことですね。
モジュール内の記述は変わらないので、同じモジュール内のメソッドでもクラスによってはインスタンスメソッドあるいはクラスメソッドになりうると言うことですね！とても便利です！

#さいごに
今回はモジュールの機能のうち、**ミックスイン**に関して説明させて頂きました！
モジュールには他にも機能があるので、ぜひ気になる方は調べてみてください:relaxed:

【参考】
書籍 プロを目指すためのRuby入門(伊藤 淳一 著)
VBAでファイルを分割する

実務でよく使いそうなファイル分割のコードがネットで簡単に見つからなかったのでQiitaに残します。

**条件**
・大量のデータがあり、それのある列の種類ごとにファイルを分割する。
例えば以下のようなデータがたくさんあり
部署ごとの明細をファイルとして送るような実務でよくある作業を想定しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/366075/064284d1-e884-9a0a-4841-75922cbfd833.png)


営業に送る明細はこれ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/366075/cfea9a40-6306-8eb4-946e-2f1fa1c46db1.png)

・大量のデータをあらかじめピボットテーブルで集計しておく
大量のデータを配列化してうんやらかんやら等、マクロだけでもファイル分割はいろいろできると思うのですが
そうするとブラックボックスの処理が増えてしまうため、マクロにはファイルを分割するという最低限の処理しかさせない方針でいきます。
そのためキー単位（例でいう部署単位）での集計はピボットテーブルに任せます。



まずは結論として先にコードを書きます。

前提　大量のデータを部署単位でピボットテーブルで集計しており（ピボットテーブル名はﾋﾟﾎﾞｯﾄﾃｰﾌﾞﾙ1）、そのシート名を「部署別」とする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/366075/7292c437-338a-f0e8-e0b9-712a1ded5b34.png)

```
Sub Macro1()

Macro1 Macro

Sheets("部署別").PivotTables("ﾋﾟﾎﾞｯﾄﾃｰﾌﾞﾙ1").PivotCache.Refresh    
Dim i As Long
i = 3　'ここはピボットテーブルの場所によって多少変動するので注意
Dim key As Variant　'キーの変数をとる。（例でいうと部署名）ここでは分割後のファイル名に使っている。

'上から順にピボットテーブルをクリックして明細を抽出する。総計までいったらそれで終わり
Do Until Sheets("部署別").Cells(i, 1) = "総計"　
　　key = Sheets("部署別").Cells(i, 1) 'ここの1もピボットテーブルの場所によって多少変動するので注意
　　Sheets("部署別").Cells(i, 2).ShowDetail = True           
    ActiveSheet.Name = "コピー元"
    ActiveSheet.Copy
    ActiveSheet.Name = "（ファイル分割後のシート名をここで指定する　例：明細）"
          
    '～分割後のファイルを加工する場合は、ここにコードを記載する～'
　　
　　'以下でファイルを分割するコード
    Application.DisplayAlerts = False　
　　'保存しますかとかのアラートをきる
  　
  　ActiveWorkbook.SaveAs Filename:=ThisWorkbook.Path & "\" & key, 　
　  FileFormat:=xlWorkbookDefault
    'ファイル名を指定して保存する。ファイル名は最初に設定したkeyにしているので、お好みで足してください
  
    ActiveWorkbook.Close
    '保存したのでファイルを閉じる

　　ThisWorkbook.Sheets("コピー元").Delete
  　'元ファイルのデータは保存したので不要になったので削除  
　
　　Application.DisplayAlerts = True    
　　'アラートを戻す
    i = i + 1
Loop
    
End Sub
```

いろいろ書くのがめんどくさくなったのでこんな感じで終わります
【注意！】JavaScriptでTwitterのuidを扱うときの注意点

## 【注意！】JavaScriptでTwitterのuidを扱うときの注意点
Twitterのユーザー識別番号であるuidは、非常に大きい場合があります。
例: `10765432100123456789`
このような数字は、JavaScriptでは正確に表現することができません。(この数字リテラルは近い値に変換されます。)

このようなことを防ぐために、id_strという、uidをstringで取得するためのプロパティがTwitter APIには用意されています。そちらを使うようにしましょう。

この記事が参考になれば幸いです。
## 終わりに
私は現在、Web3のサービスの開発をしています。詳しくはこちらの記事をご覧下さい。
        [無料でイーサリアムが当たる、Web3時代の寄付サイトを作った話](https://note.com/kenroda/n/n814347fbdcd7)
今日の学習

##やったこと
###・実際にパソコンでチュートリアルでの流れを確認するため、アプリの開発を始めた。
###・SQL文について

###学んだこと
###・SQL文とは
→データベースに指示を出す言語。

基本的に４つの型があり、
①SELECT文→データを取得する命令
・基本の構文　→　SELECT [取得したい要素] FROM [使用テーブル];

・WHEREを用いて、条件分岐をすることが可能　構文→SELECT [取得したい要素] FROM [使用テーブル] WHERE [条件文];

・ソート　構文→SELECT * FROM game_character ORDER BY level desc;

・グループ分け→SELECT [取得したい要素] FROM [使用テーブル] GROUP BY [グループ化したい要素];

②INSERT文→データを追加する命令
・基本の構文　→　INSERT INTO 『データを追加したいテーブル名』(要素名A,要素名B) VALUES(要素Aに入れるデータ,要素Bに入れるデータ);
③UPDATE文→データを追加する命令（既存データの更新を行うための命令）
・毎回全部に更新がかかってしまうため、条件式のwhereを使う　構文→UPDATE [テーブル名] SET [更新処理] WHERE [条件式];

④DELETE文→データを削除する命令
VPSに知らない人からめっちゃログイン試行されてた話

# はじめに
6月の初め頃からConoHaでVPSを借りています。
https://www.conoha.jp/
VPSにはUbuntuをインストールして、主にLinuxの操作やシェルスクリプト、Pythonの学習用に使用しています。

自宅のサーバにもUbuntuをインストールしてあるのですが、カフェなどで作業するのが好きなので、格安なVPSを契約しました。

一ヶ月ほど経って、ファイヤウォールの設定以外に特にセキュリティ対策をしていないなぁと思い、調べてみました。

https://qiita.com/cocuh/items/e7c305ccffb6841d109c
「ほうほう、SSH接続のポートを変更すればいいんかー」
https://www.softel.co.jp/blogs/tech/archives/1516
「lastbコマンド？不正アクセス・・・？」

自分も実行してみたところ、秒間20件ほどのログイン試行がありました○|￣|＿

![IMG_7245.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224231/31617ba4-fe95-7ad9-5793-8838fa9d08f7.png)

そこで、対策を取ることにしました。

# 対策
## SSHポートの変更
通常のSSHポート接続のポート(22)を他のポートに変更します。
変更する先のポートは、ウェルノウンポート(0～1023)、レジスタードポート(1024～49151)を避けた49152～65535ならどれでもいいと思います。たぶん。

`/etc/ssh/sshd_config`のPortの項目がコメントアウトされているので、外して好きなポート番号を指定します。

```conf:/etc/ssh/sshd_config
#Port 22
Port 12345
```

*SSH接続で設定する場合は再接続できなくなる可能性があるので注意してください。*

## rootでのログイン拒否
rootでのログインをできなくします。root権限を使いたい場合は`su`コマンドか`sudo`コマンドで対応します。

`/etc/ssh/sshd_config`の`PermitRootLogin`の項目がnoになっているのでyesに変更します。

```conf:/etc/ssh/sshd_config
#PermitRootLogin no
PermitRootLogin no
```

## sshd_configの構文チェック
`sshd -t`で何も表示されなければオッケーです。

## sshdの再起動
`/etc/init.d/ssh restart`で再起動されます。端末は一つ繋いだままにした方が良いです。設定ミスった場合、永久にアクセスできなくなります。

## ファイヤウォールの設定
対策とは違いますが、必須の設定です。
元々ポート22が許可されているので、これを削除して、先ほど追加したポートを追加します。
設定し忘れるとSSH接続できなくなるので注意してください。設定方法はOSなどによるので割愛します。

# さいごに
本来はもっと色々設定しなくてはいけないと思いますが、抜き取られてまずいデータもないし、とりあえずこれくらいでいいかなぁと。
設定後ログイン試行は0になりました(゜▽゜)
今度は公開鍵認証ですね～。

ちなみに、ログイン試行されていたユーザ名は、`api`、`apex`、`apache`、`james`、`root`など、ありそうなのを試しているようです。その中でも、`aoki`や`aono`など日本人の名前っぽいのも試していますねぇ。
Reactをわかった気になる #1 Reactの特徴

## 本記事の目的
Reactという単語は聞いたことあるけれど概要はよく知らない人向けの記事になります（元々はバイト先のディレクターさんにReactを教えるためのスライドです）。
なのでReactの特徴やその大まかな意味などの上流の部分に触れていきます。
その中でも今回はReactの特徴について触れていこうと思います。
## Reactとは  
[React](https://ja.reactjs.org/)とはユーザインタフェースを構築するためのJSライブラリです。
よく[Angular](https://angular.jp/)や[jQuery](https://jquery.com/)と比較されますが、React自体はウェブフレームワークではなく「ライブラリ」ですので、実際の開発の際には他にも様々なライブラリを組み合わせて使うことが多いです。
Reactの開発はFacebookが行っていて2019年7月現在[github](https://github.com/facebook/react)のスターは132,000以上もあるwebフロント界隈では主流になりつつあるライブラリです。

## Reactの特徴
Reactの特徴は大きく分けて3つあります。

- componentベース
- virtialDOM
- JSX

まず1つ目はcomponentベースです。
基本的にReactでは1つのwebページを複数のコンポーネントに分けて実装していきます。
コンポーネントに分けることで共通部品として使ったり、コンポーネントごとに状態を管理できるためソースコードの見通しが良くなります。
また、Atomicデザインと非常に相性がいいです。
→Reactのコンポーネントについて([こちら](https://qiita.com/fiftie/items/6471bbe1d1b081ea8a24))
![スクリーンショット 2019-07-07 20.30.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/389383/8cae0875-88d2-5ffa-95d0-4adaea94b8fb.png)
例えばReactの[ホームページ](https://ja.reactjs.org/)では上記のようにコンポーネントを分けて実装されていました(便宜上、元ページの両端をカットしています)。


２つ目にvirtualDOMがあげられます。
virtualDOMはJSで作られた仮想のDOMです。内容はJSONのため、ブラウザのDOMよりも軽量で扱いやすいという利点があります。
webページの1部分を動的に変化させるときにReactでは1度virtualDOMを作成し、もとのvirtualDOMと比較をして変化のある部分だけをブラウザに通知します。
そうすることでブラウザのDOMの更新による処理の負担を減らし、パフォーマンスの最適化を図ることができます。この技術によりSPA(Single Page Application)を現実的にしました。
→ReactのvirtualDOMについて(後日公開予定)
![スクリーンショット 2019-07-07 20.53.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/389383/d8f01b57-97c0-ad70-4e46-2e9e9af7fdb0.png)
※この図は[こちらの記事](https://qiita.com/risagon/items/019942c60e9c3e6c05a5)を参考に作成させていただきました。

最後はJSXになります。
JSXはソースコードの記述方法に関する特徴になります。
JSXは簡単に言うとJSのコードの中にHTMLを書くことができる仕組みです。
ロジックとマークダウンが混在している点が初見の方にとっては違和感に感じる部分だと思います。
Reactではそもそも１つ目であげたとおり、webページをコンポーネント単位で実装していきます。
なのでJSファイルとHTMLファイルで分割して実装していくよりも、1つのコンポーネントにつき1つのJSXファイルで実装したほうが利点が大きいです。
→ReactのJSXについて(後日公開予定)

```helloMessage.jsx
export default class HelloMessage extends React.Component {
  render() {
    const helloStyle = { color: 'red' };
    return (
      <div style={helloStyle}>
        Hello JSX
      <div>
    );
  }
}
```
上記の例だと、「Hello JSX」の文字が赤くなります。

## 終わりに
今回はReactの特徴について触れていきました。
次からは各特徴をもう少し深掘りして見たいと思います。
EmacsとVisualStudioを相互連携する

# 目的
VisualStudioで表示中のファイルをEmacsに表示したり
Emacsで表示中のファイルをVisualStudioに表示したりしたい

# 背景
C#での開発で、Emacsでコード編集し、VisualStudioでビルド、デバッグ作業しているため

# VisualStudioで表示中のファイルをEmacsに表示
下記ブログのエントリーに、まんまやりたいことが丁寧に解説されてました
[Visual StudioのファイルをEmacsで開く](https://blog.piyo.tech/posts/2014-07-13-200000/)

ただ、現在の行に移動までしてもらいたいので、引数は
`+$(CurLine):$(CurCol) $(ItemPath)`
としておくとうまくいった

# Emacsで表示中のファイルをVisualStudioに表示
下記melpa packageでまんまやりたいことができた
[open-in-msvs.el](https://github.com/evgeny-panasyuk/open-in-msvs.el)

ただ、VS17ではうまく動かなかったので、packageで落とされるvbscriptの以下2点を修正した

```vb:open-in-msvs.vbs
filename = WScript.Arguments(0)
line = WScript.Arguments(1)
column = WScript.Arguments(2)

On Error Resume Next

MSVS_versions = Array _
( _
    "VisualStudio.DTE.7", _
    "VisualStudio.DTE.7.1", _
    "VisualStudio.DTE.8.0", _
    "VisualStudio.DTE.9.0", _
    "VisualStudio.DTE.10.0", _
    "VisualStudio.DTE.11.0", _
    "VisualStudio.DTE.12.0", _
-     "VisualStudio.DTE.14.0" _
+     "VisualStudio.DTE.14.0", _
+     "VisualStudio.DTE.15.0" _
)
+ ' VS17はDTE.15.0のようだ。14.0のほうにカンマつけて15.0の行追加

For each version in MSVS_versions
    Err.Clear
    Set dte = getObject(,version)
    If Err.Number = 0 Then
        Exit For
    End If
Next

If Err.Number <> 0 Then
    Set dte = WScript.CreateObject("VisualStudio.DTE")
    Err.Clear
End If


dte.MainWindow.Activate
dte.MainWindow.Visible = True
dte.UserControl = True

dte.ItemOperations.OpenFile filename
dte.ActiveDocument.Selection.MoveToLineAndOffset line, column + 1
+ ' VisualStudioが前面に来ないのでアクティブ化
+ Set objWshShell= Wscript.CreateObject("Wscript.Shell")
+ objWshShell.AppActivate dte.MainWindow.Caption
```

このコードを調べていて分かったが、VisualStudioの機能を外部から呼ぶのに[DTE](https://docs.microsoft.com/en-us/dotnet/api/envdte.dte?view=visualstudiosdk-2017)というものを使っているようだ
このコードを応用して、DTEClass.ExecuteCommand(String, String) Methodを利用すると
デバッグ開始、ソリューションのビルド、スタートアッププロジェクトのビルド等ができた

```vb:DteExecCmd.vbs
Set dte = getObject(,"VisualStudio.DTE.15.0")

'デバッグ開始
'dte.ExecuteCommand("Debug.Start")
'ソリューションのビルド、リビルド
'dte.ExecuteCommand("Build.BuildSolution")
'dte.ExecuteCommand("Build.RebuildSolution")
'スタートアッププロジェクトのビルド、リビルド
'dte.ExecuteCommand("Build.BuildSelection")
'dte.ExecuteCommand("Build.RebuildSelection")
```

利用可能なコマンドついては[こちら](https://docs.microsoft.com/ja-jp/visualstudio/ide/default-keyboard-shortcuts-in-visual-studio?view=vs-2019)を参照

# 最後に
Emacs->VSはめんどくさいことになるかなと思ったのですが、探せば誰かが作ってくれているものが見つかるものですね
melpaにあってラッキーでした
鍵っ子をIoTでリモート見守り

###目的
これまで子供を学童に入れていましたが、段階的に鍵っ子にします。
一人っ子で家に誰もいないので、IoTでリモート見守りします。

###要件
①家にいる様子を見る。
②家の電話に出るように呼びかける（親からの電話以外は取らせない）。
　※子供はスマホなどは持っていません。
③ITに詳しくない妻でも①②ができるようにする。

###構成
自宅に置いたRaspberry PI（3B）にカメラとスピーカーを接続し、
スマートフォンのSlackアプリからコマンドを送信して操作します。
Webカメラは通常のUSBカメラ、スピーカーはダイソーの300円のスピーカーを使用しました。
![見守りシステム構成図 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/219051/b8400b80-ff38-9f50-7aca-82ed8432353f.png)



###実装
/hubot/pibot/scriptsに以下を配置します。

######hubotのスクリプト（①カメラ撮影してSlackにアップロード）
コマンド「cam」をpibotへのDMに書き込むと、
Webカメラで撮影した画像をSlackにアップロードします。

```coffeescript:callraspi.coffee
module.exports = (robot) ->
  robot.respond /cam/, (msg) ->
    @exec = require('child_process').exec
    command = "fswebcam -D 3 -S 20 -v -r 1280x720 /home/pi/hubot/pibot/scripts/sample.jpg;
      curl -F file=@/home/pi/hubot/pibot/scripts/sample.jpg -F channels=【チャンネル】 -F token=【トークン】 https://slack.com/api/files.upload"
    msg.send "take a picture"
    @exec command, (error, stdout, stderr) ->
      @msg.send error if error?
```

######hubotのスクリプト（②電話に出るように呼ぶ）
コマンド「momo」をpibotへのDMに書き込むと、スピーカーから子供に呼びかける音声が流れます。
音声は、あらかじめJtalk作っておいた音声ファイルを再生するだけにしました。

```coffeescript:call_momo.coffee
module.exports = (robot) ->
  robot.respond /momo/, (msg) ->
      @exec = require('child_process').exec
      command = "aplay /home/pi/call_tomo.wav"
      msg.send "ももくんを呼びました。"
      @exec command, (error, stdout, stderr) ->
          @msg.send error if error?
```

###運用状況
意外と安定して使えます。3ヶ月ほど使用していますが、不具合はありませんでした。
Webカメラは、通常のカメラは焦点距離が近いので、遠めに調整する必要があります。


###参考にしたサイト
- [Raspberry PiとSlackで簡単な監視カメラを設計](https://qiita.com/rarapo/items/aeb60d2f315be245911f)
- [Raspberry piで日本語音声合成(Open JTalk)を試してみる。](https://qiita.com/lutecia16v/items/8d220885082e40ace252)
【Swift学習まとめ】 スコープ

#スコープとは
変数、定数、関数、型の名前の有効範囲を表すもの
適用範囲に応じてグローバルスコープ、ローカルスコープに分類される
全ての変数、定数、関数、型はどちらかのスコープに属する

#約束事
同じスコープ内には同じ名前を複数存在させることはできない
※変数、定数、関数、型の種類が異なっていても同様

<img width="793" alt="スクリーンショット 2019-07-07 22.03.35.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396155/35fc41d1-325d-e52d-e260-988bcbc62b87.png">





#ローカルスコープ
関数や制御構文の内部で定義されるスコープ
外部からの参照はできず、関数や制御構文の実行文の内部でのみ有効のため
意図しない変更が起こりにくいメリットがある
<img width="467" alt="スクリーンショット 2019-07-07 22.27.49.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396155/966b70ae-cd0f-566e-c5de-79c9ac2efb73.png">



#グローバルスコープ
関数、型宣言の外部で定義されるスコープ
宣言された変数や定数はファイル外を含めどこからでも参照可能だが、意図しない変更を招きやすいため、ローカルスコープでの宣言よりも説明的な命名が必要である
<img width="459" alt="スクリーンショット 2019-07-07 22.24.48.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396155/0373cb7f-6f51-8de6-8df6-4290367dfd8d.png">





#参考文献
[［改訂新版］Swift実践入門 ── 直感的な文法と安全性を兼ね備えた言語 WEB+DB PRESS plus](https://www.amazon.co.jp/［改訂新版］Swift実践入門-直感的な文法と安全性を兼ね備えた言語-WEB-PRESS-plus-ebook/dp/B07JWCXW4R/ref=sr_1_2?__mk_ja_JP=カタカナ&keywords=Swift&qid=1562503872&s=gateway&sr=8-2)
my.cnfの場所にハマった

###自分の環境でのmy.cnfの場所

```
mysql --help | grep my.cnf
 order of preference, my.cnf, $MYSQL_TCP_PORT,
/etc/my.cnf /etc/mysql/my.cnf /usr/local/etc/my.cnf ~/.my.cnf
```
てっきりmy.cnfは~/etc/my.cnfにあるんだと思って確認しようと下記を実行

```
cat /etc/my.cnf
```
すると

```
cat: /etc/my.cnf: No such file or directory
```
###なんでだよ！！！

調べまくった結果
ここにあった

```
usr/local/etc/my.cnf
```
LINE Messaging APIの非同期ライブラリを作りました

Pythonだとasync/awaitな非同期処理よりもマルチスレッドで対応してしまいがちな雰囲気ありますが、サーバレスだとマルチスレッドを許してもらえなかったりするのでLINE Messaging APIのライブラリ`linebot.LineBotApi`を非同期対応してみました。

https://github.com/uezo/aiolinebot

ちなみにこの手のサードパーティライブラリは公式SDKの更新についていけず陳腐化するのでは・・・という恐れもあるかと思いますし、以前作ったバージョンはまさにその通りだったのですが、今回ちょっとしたハックにより陳腐化しないようにしてみました。知りたい方は文末のおまけを参照ください。


# インストール方法

```
$ pip install aiolinebot
```

# 依存パッケージ

- aiohttp
- line-bot-sdk

# 使い方

`linebot.LineBotApi`と同じ手順でインスタンス化します。`AioLineBotApi`は`linebot.LineBotApi`を継承しており、すべてのメソッドが公式そのままのものを利用できるのに加え、`メソッド名＋_async`の命名規則で非同期メソッドが生えています。

```python
# APIインターフェイスのインスタンス化
api = AioLineBotApi(channel_access_token="<YOUR CHANNEL ACCESS TOKEN>")

# 返信
await api.reply_message_async(reply_token, messages)
```

Azure Functionsでのおうむ返しBOTの実装例は以下の通り。

```python
import logging
import azure.functions as func
from linebot import WebhookParser
from linebot.models import TextMessage
from aiolinebot import AioLineBotApi

async def main(req: func.HttpRequest) -> func.HttpResponse:
    # create api client
    line_api = AioLineBotApi(channel_access_token="<YOUR CHANNEL ACCESS TOKEN>")

    # get events from request
    parser = WebhookParser(channel_secret="<YOUR CHANNEL SECRET>")
    events = parser.parse(req.get_body().decode("utf-8"), req.headers.get("X-Line-Signature", ""))

    for ev in events:
        # reply echo
        await line_api.reply_message(ev.reply_token, TextMessage(text=f"You said: {ev.message.text}"))

    # 200 response
    return func.HttpResponse("ok")
```

バイナリコンテンツをストリーミングによりダウンロードするときは、事後に必ず`response`を閉じるようにしてください。line-bot-sdk==1.16.0時点では`get_message_content_async`のみが対象のようです。

```python
content = await line_api.get_message_content_async("<MESSAGE ID>")
async for b in content.iter_content(1024):
    do_something(b)
await content.response.close()
```

# おまけ：どうして陳腐化しないの？

A. なぜならインストール済みの公式SDKから非同期クライアントを動的に作るからです。すべてのパブリックメソッドの非同期版を自動で作ります。自動で作ったクラスはファイルとして保存されるので次回以降はそれを利用します。

また、どのバージョンのSDKを元にライブラリ生成したかという情報を内部に持たせるようにしているので、インストールされているSDKが更新された場合、次に利用（import）したタイミングで最新版を元に再度自動生成するような作りになっています。

この手のハックは作っていて楽しいですね！
【Houdini】SOPノードパラメータのインターフェースにマウスでグループ対象を選択するやつを仕込む

グループを選択して動く HDA を作る際にユーザにグループを楽に選択させたい。ビルトインのノードはマウスで面やらポイントをインタラクティブに選択できて便利だ。ということで同じ挙動をするよう真似をしてみる。

## 手順メモ

### １．パラメータの用意
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8302/00f06a22-bb11-1e4a-c559-c846e7a46a67.png)

適当にノード（通常サブネット）を作成して、ストリングのパラメータを作成する。名前とラベルはなんでもいい。

### ２．ボタンアクションの指定

下記の python スクリプトを仕込む。選択させたい対象によって、geo_typeの値は切り替える。
今回は Primitive（ここではポリゴンフェイス）を選択させるコードにしてある。他のタイプ指定の値はコメントアウトしてあるので、参考まで。

```python
import soputils
geo_type = (
    #hou.geometryType.Edges,
    #hou.geometryType.Points,
    #hou.geometryType.Vertices,
    hou.geometryType.Primitives,
)
kwargs['geometrytype'] = geo_type
kwargs['inputindex'] = 0
soputils.selectGroupParm(kwargs)
```

なお、`inputindex` の値を１とかに変えると選択対象にする入力ノードを切り替えることができた。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8302/1b8eee71-6301-ceb3-f429-3b9ae764ea80.png)

`Action Help` の指定はボタンにロールオーバーしたときに表示されるヘルプなので適当に。でも日本語は文字化けした。
`Action Icon` の指定はボタンのアイコン画像指定なので、指定しなくてもよいが `BUTTONS_reselect` にすると他のノードと同じになる。

これだけ。soputils モジュールには良いものが眠っていそうだ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8302/5010b520-9e64-3a6e-8466-d7cbace5c4d4.png)

以上の設定だけでボタンを押してビューポートからマウスでグループ対象を選択できるようになる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8302/d0a941af-acc0-2b20-9c73-7f4841cc9d85.png)

Enter で確定すると パラメータ欄に `0-2` というようなフォーマットで選択されたフェースの値が入る。 複雑な選択をした場合は、`0 3 11 13 17-18 23` のような文字列になる。さてしかし、このような複雑な形式で指定された番号を実際の番号に展開するのは面倒ではないか？

## 設定されたグループを利用する

サブネット内部の wrangle ノードでグループ選択された対象を得る場合、以下のVEXでプリム番号の配列に変換できました。`group` という名前でパラメータを作っている想定です。至れり尽くせり。２行目以降はプリム以外の番号一覧を得る場合の例です。

```c
i[]@group_prims = expandprimgroup(0, chs("../group")); //フェイスの場合

//i[]@group_edges = expandedgegroup(0, chs("../group")); //エッジの場合
//i[]@group_points = expandpointgroup(0, chs("../group")); //ポイントの場合
//i[]@group_verices = expandvertexgroup(0, chs("../group")); //頂点の場合
```

## 設定した方がいいかもしれないタグとその値

ユーザインターフェース指定の下の方にある項目に参考にしたビルトインノードでよく設定されている値がありました。とりあえず指定しなくてもうまく動いています。

* `autoscope` 0にしてるノードが結構あった。
* `sop_input` 0にしてるノードがあった。

こちら、詳細知ってる方おればぜひコメントを。
Hyper-Vにて、Windows10の仮想マシンを第2世代で構築しようとしたらハマった話

　Hyper-V 第1世代では上手くいっていたWindows10の仮想化を第2世代で行おうとしたらハマってしまったので、その内容と解決策、そしてその解決策に辿り着くまでに試したことについて書いておきます。

# 事象
　通常通り、Windows10.isoからインストールをしようとします。

![Hyper-V0-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430322/cd71b2cf-6fed-b3f2-61ca-93665433b1e6.png)

　起動して、接続したところ、次の画面が出て起動しないという状態になりました。
![Hyper-V.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430322/ef7f81a0-4f6e-58ae-1443-175c226e9761.png)

「CDまたDVDから起動したい場合は、何かキーを押して」とメッセージが出ているけれど、特に押しても何も起こらない。おっと、困ったぞ。

# 解決策
　結論から言うと、既にこの状態は遅かった。
「Press any key to boot from CD or DVD......」の最後の点が６つ出る前に何らかのキーを押せば良かったのだ。

![Hyper-V4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430322/e05e2980-968d-4a8d-9ad3-e333dc86ea91.png)
この状態の時に、何らかのキーを押す！
![Hyper-V5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430322/46c1d7cc-b3c3-d9fe-3855-fba292e917bd.png)

　このメッセージ、すぐ点６つの状態になってしまい、起動→接続の手順ですると間に合わないので、接続→起動の手順で行うといいです。
（頼む！もっと長くメッセージを出してくれ！！）

# 解決策に辿り着くまで行ったこと
　余りにも解決策が簡単すぎて、ハマっていた時間を考えると割に合わない感がして仕方無いので、それまでにやったことを書いておきます。
（同様の記事を見かけないということは皆、上手くいっているということのような気がするけど、誰かの役には立つでしょう）

## ブートの手順を確認
　OSの画面すら出てくれないということは、問題はブートの箇所で発生しているっぽいので、その確認を行ってみます。
　確認すると、DVDドライブが最優先になってます。つまり設定的に問題ないですね。
![Hyper-V1-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430322/95c5b4b1-916e-182b-5940-f05ad0881692.png)

## ネットワーク接続を切ってみた
　「Start PEX over IPv4」というメッセージが出るということは、ブート手順の2番目の「ネットワークアダプター」のところで待機しているということなので、ネットワークアダプターから切断したり、ネットワークアダプター自体を削除したりしてみます。
　その結果がこちらです。
![Hyper-V2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430322/ce41caab-f381-c2b5-ded8-e25b250e2745.png)

　ですよねー。
　それでもDVDドライブからのBootが出来ないことが原因であることが確定できました。原因が分かったのはいいことだ。コンフィグ設定がおかしいから再設定をしてくれともある。ブート周りの設定がおかしい模様。

## ネットで調べてみる

　原因部分が推測できたので、困った時の先人達の知恵、「環境」と「エラーメッセージ」などのキーワードで検索検索！　例えば「hyper-v "the boot loader failed"」という感じで。
　すると「セキュアブートをオフにしたらいいよ」という記事がいくつかヒットします。例えば、[ここ](https://social.microsoft.com/Forums/ja-JP/fbed0fe1-daa8-40e1-8d5c-3c63957d59ad/win-10-hyperv-guest-gen2-wont-install-os-from-iso-using-virtual-hard-disk?forum=win10itprovirt) とか。

## ネット検索の知見を試してみる
　しかし、上手くいきません。
　検索ワードや検索期間を変えても出てくる記事はセキュアブートの話ばかり。
　ところで、例に出した記事、確かに元投稿は2016年と結構古い情報ですが、記事のコメントの最後の方「Hitting the ANY key worked for me too. （何らかのキーを押すことでも動いたよ）」は最近の書き込み。今から思うとこれは重要なヒントだったように思います。

## 色々と試してみる中で解決策を見つける
　設定を色んなパターンで試してみても上手くいかない…。「いっそ第1世代のままいくかー」と諦めかけ状態の中、何度も停止、起動を繰り返している最中、たまたま接続したままリセットをかけた時、この画面が目に入りました。
![Hyper-V4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430322/e05e2980-968d-4a8d-9ad3-e333dc86ea91.png)

　「あれ？　最後の点が増えていってる？」
　その後、エラーメッセージが出るも、すぐさまリセットをかけて、メッセージ通り「何らかのキー」を押すことで、無事にWindows10 OSの起動画面が出てくることが確認できました。「まさか、こんなことで…」と脱力したのは言うまでもないですね。

（注釈）：
　セキュアブートはオンのままでも上手くいきます。ただしテンプレートが 「Microsoft Windows」の場合です。「Microsoft UEFI 証明機関」では上手くいきませんでした。

# まとめ
- Hyper-Vにて、Windows10の仮想マシンを第2世代で構築したところブートできなくなりました。
- 解決策は「Press any key to boot from CD or DVD......」の最後の点が6つになる前にキーを押すことです。このメッセージはすぐに点が6つの状態になるので、接続→起動の順番がいいですね。
- 上手くいかなかった時は色々と試してみて、その中で違和感を探すのが大事かもしれません。
Docker で ヘッドレス Chrome を動かしてスクレイピングする

ヘッドレス Chrome を動かしてウェブサイトをスクレイピングするための Docker イメージを作成しました。

- [DockerHub: grohiro/headless-chrome](https://cloud.docker.com/u/grohiro/repository/docker/grohiro/headless-chrome)
- [GitHub: https://github.com/grohiro/docker-headless-chrome](https://github.com/grohiro/docker-headless-chrome)

この Docker イメージは指定された URL をヘッドレス Chrome で取得して HTML を標準出力にダンプします。
手軽に Vue.js や React で実装されたページの HTML を取得するときに便利です。

```bash
$ docker pull grohiro/headless-chrome
$ docker run --rm -t grohiro/headless-chrome http://www.google.com/ | head -5 | cut -b -100
<!DOCTYPE html>
<html itemscope="" itemtype="http://schema.org/WebPage" lang="ja"><head><meta charset="UTF-8"><meta
"clickmod";else{var f=b.which||b.keyCode||b.key;D&&3==f&&(f=13);if(13!=f&&32!=f)f=!1;else{var m=B(b)
b;e.event=A;a.i.push(e)}if("touchend"==e.event.type&&e.event._mouseEventsPrevented){b=e.event;for(va
c&&(c="focusout"),e=w(b,e),b.attachEvent("on"+c,e));return{m:c,l:e,capture:f}}},O=function(a,d){if(!
```

単一のページを取得したいだけならプログラムの中から Docker を直接起動して HTML を取得できます。

```php
<?php
// PHPの例
$cmd = "docker run --rm -t grohiro/headless-chrome http://www.google.com";
exec($cmd, $output, $status);
if ($status !== 0) {
  throw new \Exception("コマンドの実行がエラーになりました");
}
$html = implode("\n", $output);
$dom = @DOMDocument::loadHTML($html);
$xpath = new DOMXPath($dom);
echo $xpath->query('//title')[0]->nodeValue;
// => Google
```

Docker イメージの作成は https://qiita.com/rotelstift/items/7dafcdcae3ca18b65b26 こちらの記事を参考にしました。
HTMLを早く書く【HTMLタグ・class名・id名】

こんにちは！サイゼリヤのイカ墨スパゲティ大好きこうぴかです。
この記事はHTMLを学び始めた人、HTMLを早く書きたい人に向けて書いています。

目次
1.　はじめの文の入力
2.　クラス名の入力
3.　id名の入力
4.　その他


##はじめの文の入力
エディタに「HTML:(コロン)5」と入力してEnterを押すと…

```HTML:初めてのHTML.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    
</body>
</html>
```

HTMLを書くときにはじめに書かないといけないながーい文を一瞬でかけました！
【注意】<html lang="en">の"en"を"ja"に書き換えておくこと



##クラス名の入力
エディタに「.(ドット)className」と入力してEnterを押すと…

```HTML:初めてのHTML.html
<div class="className"></div>
```

"className"というクラス名がついたclassを設定できました！
【注意】クラス名をアルファベットで入力すること！

##id名の入力
エディタに「#(シャープ)idName」と入力してEnterを押すと…


```HTML:初めてのHTML.html
<div id="idName"></div>
```

"idName"というid名がついたidを設定できました！
【注意】id名をアルファベットで入力すること

##その他
エディタに「a」「p」「h1」とそれぞれ入力してEnterを押すと…

```HTML:初めてのHTML.html
<a href=""></a>
<p></p>
<h1></h1>
```
という感じになって書く量がかなり軽減されますね

##まとめ
HTMLタグ、クラス名、id名を早く書く方法を紹介しました。いかがでしたでしょうか？ほかにもあるかもしれないので、知っている人がいたら教えてくださいね。では！
Slack+Zapierでメールを送りたい！

##きっかけ
歩いている時、遅延した電車でギュウギュウの時、**「スマホからだとメールが打ちづらい！」**と思い、Slackから簡単にメールが送れるようにならないか、と思ったのがきっかけです。

##使うもの
* [Zapier](https://zapier.com/app/dashboard)
* Slack
* [Google Apps Script](https://script.google.com/home)
* Gmail

最初IFTTTでやってみようと思ったのですが、調べてみた所Googleがサポート終了していたため、Zapierでやってみることにしました。

## ZapierとSlackの連携
Slackで「こんにちは,お元気ですか」と打ち込んだら、
件名：こんにちは
本文：お元気ですか
とメール送信されるようにしてみたいと思います。

こちらを参考にさせていただきました。
[Slack から メールを送れるようにしてみた ～その１～](https://qiita.com/sasaco/items/1bcb0a6f33ef3ca88394)

Step1のSlackで投稿する内容を「こんにちは、お元気ですか」の形にし、
Step2で追加する、コードの部分をこんな感じにしてみました。

```javascript

var input = inputData.data.split(',');
var subject = input[0]; // 一番目の内容
var content = input[1]; // 二番目の内容

var to = '****@****.com'; // 宛先
var cc = '****@****.com';

var body = `
お疲れ様です

${content}
改行をそのまま送信したいため、バッククォートで囲んでいます
`

output = {
  to: to,
  cc: cc,
  subject: subject,
  body: body
};
}
```

## スラッシュコマンドでメールフォーマットを表示
ZapierとSlackの連携が済んだら、あとはSlackに投稿するだけ！なのですが、設定したフォーマット通りの投稿をしないとメール送信してくれません。
なのでスラッシュコマンドを打ったらメールのフォーマットを教えてくれるように設定してみたいと思います。

こちらを参考にさせていただきました。
* [Slash CommandsとGASでSlackのオリジナルコマンドをつくる](https://qiita.com/chikuwa111/items/7a1a349b82318a5861cc)

####1. [Google Apps Script](https://script.google.com/home)にアクセス
Googleにログインしていない場合はログインしてください。

####2. 特定の文言を返すスクリプトを作成
「こんにちは,お元気ですか」の元となるフォーマットのため、「件名、本文」とします。
![スクリーンショット 2019-07-07 20.37.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238789/9a8b52d3-8eb8-6718-d594-939361877da4.png)

スクリプトを保存し、公開>ウェブアプリケーションとして導入...を選択。
![スクリーンショット 2019-07-07 20.40.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238789/3f48b005-36b4-4baf-b4cc-b354371aeb35.png)

アプリケーションにアクセスできるユーザーが自分だけになっているので変更し、保存。出てきたURLをコピーしてメモ帳か何かに貼り付けておきます。

####3. Slackでスラッシュコマンドのアプリを追加
メール送信用のチャンネルを開き、詳細から「アプリを追加する」を選択。
![スクリーンショット 2019-07-07 20.43.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238789/4bc3b797-4bc1-aa9d-bd16-8da7e1972008.png)

Slash Commandsで検索すると同名のアプリが出てくるので、インストール。
![スクリーンショット 2019-07-07 20.32.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238789/17d45fef-0cf5-9f02-c551-d4566cf4d6e8.png)

Slash Commandsの設定を開き、情報を入力し保存。URLは先ほどGoogle Apps Scriptで作成したウェブアプリのURLを入れます。
![スクリーンショット 2019-07-07 20.45.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238789/5caae881-e483-f8f5-06eb-e6fa6b853631.png)

Slackでスラッシュコマンドを投稿してみて、こんな風に返ってきたら成功です。
![スクリーンショット 2019-07-07 20.59.51 2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238789/34223942-7e66-5791-9ed0-f53ad1bea407.jpeg)



このフォーマットに従い、件名を「こんにちは」、本文を「お元気ですか」に変更してSlackに投稿すると、
Zapierでtoとccに設定した宛先に
件名：こんにちは
本文：お元気ですか
の形でメールが送信されます。

今回の方法ではメールの送信先が限定されますが、Zapierのテンプレート設定でメールアドレスの部分をSlackの投稿から取得、スラッシュコマンドで送信先込みのフォーマットを返すような形にすれば、便利かもしれません。
JFreeChart/二次元分布チャート/XYSeriesCollection 


目次 ⇒ [JFreeChartサンプル](https://qiita.com/artery/items/3e9c63e5c14a9e965c97)

```java
package jp.avaj.lib.chart;

import java.util.Random;

import org.jfree.chart.ChartFrame;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.plot.Plot;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.XYItemRenderer;
import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;
import org.jfree.data.xy.XYDataset;
import org.jfree.data.xy.XYSeries;
import org.jfree.data.xy.XYSeriesCollection;

/**
■ JFreeChart/二次元分布チャート/XYSeriesCollection

 */
public class Chart15_00 {

  public static void main(String[] args) {
    // 表示データの作成
    XYSeriesCollection collection = createXYDataset();
    // レンダラの指定
    // 最初の引数はラインを引くかどうか⇒今回はラインは引かない
    // 次の引数はデータの場所に形を表示するか否か⇒今回は形を表示する.
    XYLineAndShapeRenderer renderer = new XYLineAndShapeRenderer(false,true);
    // 軸は両方ともNumberAxisにする
    NumberAxis xAxis = new NumberAxis();
    NumberAxis yAxis = new NumberAxis();
    // Plotの作成
    XYPlot xyPlot = new XYPlot((XYDataset)collection,xAxis,yAxis,(XYItemRenderer)renderer);
    // 画面表示
    JFreeChart jfreeChart = new JFreeChart("XYPlot",(Plot)xyPlot);
    ChartFrame cFrame = new ChartFrame("XYPlot",(JFreeChart)jfreeChart);  // (1)
    cFrame.pack();
    cFrame.setVisible(true);
  }

  public static XYSeriesCollection createXYDataset() {
    XYSeriesCollection xySeriesCollection = new XYSeriesCollection();
    Random ran = new Random();
    for (int series = 0; series<5; series++) {
      XYSeries xySeries = new XYSeries("data-" + series);
      for (int item = 0; item<20; item++) {
        double x = ran.nextDouble()*10;
        double y = x+ran.nextDouble()*5;
        xySeries.add(x,y);
      }
      xySeriesCollection.addSeries(xySeries);
    }
    return xySeriesCollection;
  }
}

```

![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278568/76b94bbc-868b-9637-f67c-c6e5390df5ef.png)
コメントの書き方に対するポエム(write or white)

# はじめに

**コメントを書くべきか否か。**

これについて様々な個人的思想と見解が溢れているので、
個人的見解を書いてみようと思う.


# 個人的見解
コメントはできる限り書くべきではない。

だが書くべき時もある

- メソッド自体の説明
- コードに止むを得ない無理がある時
- ファイル冒頭の説明(呼び出し方や、使い方の例など)


## 書くべき理由
### メソッド自体(interfaceも含む)の説明
処理そのものではなく概要が書かれるべきである。
予測変換で表示された時に意味のあることが望ましい。
また、メソッドの概要は変わらない前提でいて、変わる場合はメソッド名も変更されるべきである。

### コードに止むを得ない無理がある時
これは言わずもがな。
正しい設計と実装ができる能力があれば、なくなることが多い。
ちゃんと設計すべき論ではある

### ファイル冒頭の説明(呼び出し方や、使い方の例など)
ライブラリのコードを読んでいて、想像で使用しても動かない時に必要。
テストコードがあればいらないこともある。

## 書くべきでない理由
### コメントを行単位で書かない
コードが無駄に長くなって、一度に読める情報量が減る。
ソースの修正の時に変更が大変

### コメントがなくてもソースを理解できるように書くべき
特にコメントのメンテナンスコストが高いのが問題。
偽のコメントによって、コメントがない時よりも、作業効率が落ちることが多い
OSSではコメントがきちんと整備されているからコメントに意味があるが、
仕事の経験上、きちんと整備されているプロジェクトは絶滅危惧種

### いらない情報は害悪
 ` dbConnection := getDBConnection() //DBの接続を取得する`
例えば上のコメント。エンジニアは英語の翻訳家ではない。
ソースの総量は増えるし、コンパイル言語でないと実行速度も遅くなる。
たとえ日本人だとしても,コメントを読むコストを考えて欲しい。

# その他自己問答
Q. コメントもなく読めないスパゲッティコードな部分があった時どうするか？
A. 全て書き直した(その方が結局バグもなく時間もかからなかった)

Q. 詳細なコメントはレベル感の低い人の作業を補っているのではないですか？
A. レベル感の高い人の生産性を落としているのでトレードオフ。どちらを優先した方が生産性が高いかはプロジェクト次第。

# まとめ
コメントがなくてもわかるコードは正義。
コメントを正しくメンテし続ける人がいる場合は書いても幸せ。
無駄なコメントは悪
【Mac】nodebrewでNode.jsのバージョン管理を行う

自分のメモ用に。

# OSのバージョン
mac OS Mojave 10.14.5

# 前提
Homebrew、Nodeberewをインストールしてあること

# 現在インストールされているバージョンを表示する


```
nodebrew ls
```

# インストール可能なバージョンを表示する
```
nodebrew ls-remote
```
# バージョンを指定してインストールする
```
nodebrew install [バージョン名]
```
# バージョンを指定してアンインストールする
```
nodebrew uninstall [バージョン名]
```

# 使用するバージョンを切り替える
```
nodebrew use [バージョン名]
```
バージョンを切り替える際は、以下のようにすると良いでしょう。

1. 使用したいバージョンをインストールする
2. バージョンを切り替える
3. 不要なバージョンをアンインストールする

# バージョン確認
最後に、今使用しているバージョンを確認し、使用したいバージョンに切り替わっていればOKです。

```
node -v
```
Atomic Designとコンポーネント思考についてのメモ

Atomic Design と コンポーネント思考について改めて調査
いろいろ調べてみた結果、コンポーネント指向は Atomic Design と考え方が似ており、どうやら相性が良さそうです。
調べたことのまとめと、今私が考えるこの考え方がいいんじゃないか、を記事にしてみました。


## 結論：設計する上での考え方について

* Atomic Design を踏襲する
    * Atoms の内容としては後述するコンポーネントの考え方とする
* レイアウトとしての役割は Organisms と Template が担う

これだけだとさっぱり分からないと思うので、Atomic Design とは？
コンポーネント思考とは？を後述します。


# Atomic Design とは

デザインシステムの考え方の一つ。
デザインするときにページなどの大きい単位から作っていくのではなく、部品から考えていくと言うもの。
Atoms がもっとも小さく、Pages がもっとも大きいです。 

![atomicdesign.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/164666/ec31f15b-236a-308b-2265-9f8cd7841978.png)

* Atoms
    * UI を構築するための最小単位です。
    * HTML で言うとことの単体のタグになります。button など
* Molecules
    * Atom を組み合わせて作られるものになります。
    * form などがこちらに当たります。
    * 「モレキュールズ」と読みます。（最初読み方分からなくてググりました…）
* Organisms
    * Molecules や Atom を組み合わせて作られる要素です。
    * section などがこちらに当たります。
    * Molecule との違いは単一の機能でなく複数の役割を持つところです。
* Templates
    * Organisms を組み合わせたもの。いわゆるワイヤーフレーム
    * web サイト1ページのワイヤーフレーム
* Pages
    * Pages は Templates にコンテンツを流し込んだ状態
    * 検索結果がない場合やページングなど、該当のページにおけるバリエーションについてもこちら


# コンポーネントについて

Web やアプリケーション開発をする時に使用する、再利用可能なパーツをコンポーネントと言います。
めっちゃ簡単に言うとボタンなどですね。Atomic Design で言うところの Atoms や Molecules が当たります。
複数の機能を持たすことは NG です。
リンク、コピーライト、SNS ボタンの集まりなどが掲載されたフッターなどはコンポーネントとは言えません。
この場合、コンポーネントとして言えるのは SNS ボタンの集まりになります。

コンポーネントを構成する要素は以下の4つがあります。

1. 情報構造
2. スタイル
3. 状態
4. インタラクション・機能


## コンポーネント設計の考え方

小さい部品ながら、パターンを考える必要があります。
なんの値を受け取って変化させるか、絶対的な固定値での管理となるスタイルなのか見極める必要があります。

* 変化するスタイルを見極める
    * サイズや色は変化パターンはあるか
* 状態の変化について
    * hover 時など状態の変化でスタイルの変化があるか
    * インタラクションはどうするか

省略していますが、当然更新頻度を考えて、定数に置き換えるものは定数にするなど、
そういった考え方も取り入れる必要があります。

# 最後に

設計の考え方や切り分けは上記を基礎として考えていけそうですが、
そもそも職種別の役割（例えばインタラクションは誰が付けるのか、など）は別軸で考えた方が良さそうです。
一昔前の WEB 業界と違い、デザイナーとエンジニアの境目が曖昧になってきました。
開発時はあらかじめ職種別の認識を揃えて開発をスタートすることをオススメします。


# 参考資料

* [Atomic Design ベースのコンポーネント設計を考えてみた](https://mya-ake.com/posts/component-design-based-on-atomic-design/)
* [デザイナーとエンジニアで考えるReactコンポーネント設計](https://tech.kitchhike.com/entry/2018/09/30/230000)
【Delphi】そこそこ短いコードで Web サイトのデータを持ってくる

# はじめに
「Python だと 10 行のコードで[日経新聞 Web サイト](https://www.nikkei.com/markets/kabu/)から株価を取得できる」という記事が何かの書籍に書かれていたそうです。

Delphi でもやってみましょう。使うのは 10.3 Rio です。 

# コードを書く
[Indy (Internet Direct)](http://docwiki.embarcadero.com/RADStudio/ja/Indy) を使ってもいいのですが、今回は [THTTPClient](http://docwiki.embarcadero.com/RADStudio/ja/HTTP_%E3%82%AF%E3%83%A9%E3%82%A4%E3%82%A2%E3%83%B3%E3%83%88%E3%81%AE%E4%BD%BF%E7%94%A8) を使います。

## コード
短く書く事が目的なので、コンソールアプリケーションです。

```pascal:Nikkei.dpr
program Nikkei;

{$APPTYPE CONSOLE}

uses
  System.SysUtils, System.Classes, System.Net.HttpClient, System.RegularExpressions;

const
  url = 'https://www.nikkei.com/markets/kabu/';
begin
  var http := THttpClient.Create;
  var sl := TStringList.Create;
  try
    sl.LoadFromStream(http.Get(url).ContentStream, TEncoding.UTF8);
    var m := TRegEx.Match(sl.Text, '<span class="mkc-stock_prices">(?<price>(\d+[,.])*\d+)</span>');
    if m.Success then
      writeln('日経平均株価: ', m.Groups.Item['price'].Value);
  finally
    sl.Free;
    http.Free;
  end;
end.
```

```
日経平均株価: 21,746.38
```

10 行とは行きませんでしたが、Delphi 10.3 だと可読性を損ねずにそこそこ短く書けますね！

```pascal:
uses System.SysUtils, System.Classes, System.Net.HttpClient, System.RegularExpressions;
begin
  var http := THttpClient.Create;
  var sl := TStringList.Create;
  sl.LoadFromStream(http.Get('https://www.nikkei.com/markets/kabu/').ContentStream, TEncoding.UTF8);
  var m := TRegEx.Match(sl.Text, '<span class="mkc-stock_prices">(?<price>(\d+[,.])*\d+)</span>');
  writeln('日経平均株価: ', m.Groups.Item['price'].Value);
  sl.Free;
  http.Free;
end.
```

空行を無くして例外処理も省けば 10 行で書けなくもないですが、そこまでする必要性はないと思います。

**See also:**

 - [System.Net.HttpClient.THTTPClient (DocWiki)](http://docwiki.embarcadero.com/Libraries/ja/System.Net.HttpClient.THTTPClient)
 - [System.RegularExpressions (DocWiki)](http://docwiki.embarcadero.com/Libraries/ja/System.RegularExpressions)
 - [SkRegExp (GitHub)](https://github.com/shukomiya/skregexp/)
 - [正規表現の活用 (主に Delphi 2009 以降)](https://ht-deko.com/tech064.html)
 - [Delphi で最少のソースコードを書いてみる (Qiita)](https://qiita.com/ht_deko/items/c81a8bacd7e299c45340)


# おわりに
[THTTPClient](http://docwiki.embarcadero.com/RADStudio/ja/HTTP_%E3%82%AF%E3%83%A9%E3%82%A4%E3%82%A2%E3%83%B3%E3%83%88%E3%81%AE%E4%BD%BF%E7%94%A8) に関しては @pik さんの記事がとても参考になりますので、そちらもご覧ください。

**See also:**

 - [THttpClient の落とし穴１ (Qiita: @pik)](https://qiita.com/pik/items/998547937c7d05d34977)
 - [THttpClient の落とし穴２ (Qiita @pik)](https://qiita.com/pik/items/1361696efeb4348f2acc)
 - [THttpClient の落とし穴（解決編）(Qiita: @pik)](https://qiita.com/pik/items/95dfebdb659b30918196)
【Laravel】Vue.jsでFile APIを使って画像プレビューを行なう方法

#画像プレビューを実装
今回のゴールはこちら。

![プレビュー.mov.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302326/96e25da5-038e-ba61-de55-7b25c4c1e6b3.gif)

##File API
[File APIについて](https://www.tuyano.com/index3?id=384001)
ローカルで選択した File情報を取得できます。

ただし、File APIを使わなくても以下の項目は普通に取得できます。
`更新日時`
`ファイル名`
`データサイズ（バイト数）`
`MIMEタイプ（ファイルの種類）`

##コード

```sample.php
    <div id="imgview">
        <img-view></img-view>
    </div>
```

使用するVueをコンポーネントとして登録。

```app.js
Vue.component('img-upload', require('./components/ImgView.vue').default);
```

```ImgView.vue
<template>
  <label for="file-sample">
     <div class="drop">
        <input class="input" id="file-sample" type="file" name="user_img" @change="onFileChange">
        <i aria-hidden="true" class="fas fa-plus fa-7x"></i>
        <img class="img" id="file-preview" v-show="uploadedImage" :src="uploadedImage">
     </div>
  </label>
</template>
 
<script>
export default {
    data() {
         return {
             uploadedImage: "",
         };
    },
    methods: {
        onFileChange(e) {
            let files = e.target.files;
            this.createImage(files[0]); //File情報格納
        },
        //アップロードした画像を表示
        createImage(file) {
            let reader = new FileReader(); //File API生成
            reader.onload = (e) => {
                this.uploadedImage = e.target.result;
            };

            reader.readAsDataURL(file);
        },
    },
 }
</script>
```
inputタグに`@change`を、imgタグに`v-show`を使います。
v-showに設定している`uploadedImage`はimgタグのsrcにも設定されていて、uploadedImageにFile情報が入ると同時にsrcにもソースとしてFile情報が格納され表示されると言う仕組みです。

なので最初の時点では何も入っておらず、v-showはfalseになるので`display: none;`が適用されています。

##methods
onFileChangeでは選択されたFile情報を変数に格納。

files[0]を引数にcreateImage()メソッドを呼び出します。

ここでは、FileReaderときうオブジェクトを生成します。
`onload`は正常にファイルを読み込んだときに発生するイベントです。
この中で`uploadedImage`に event.target.resultのデータを格納。

`event.target.result`には画像データをテキストデータにしたものが入っています。
※これをData URIをスキーム化させると言うみたいです。

最後にreadAsDataURL()で画像の読み込みを実行します。
vscodeでyamlをバリデーションチェックしてくれるツールの紹介

# 概要
VScodeでAnsibleのplaybookを記載しているのですが、便利なツールがあることを知ったのでその紹介です。

## どういうものか
yamlのバリデーションチェックを行ってくれるツールです。（その他色々なサポート機能があるみたいですが把握しきれてません）

yamlはスペースの区切りなども重要なのですが、人目では実行するまで気付きづらい。。そんなのを解消してくれます。

<img width="361" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321507/5d0e2cbf-c076-78e2-0a25-9d9d074c9c35.png">

こんな感じで空白がおかしいところ、記述がおかしいところを赤の波線入れてくれます。


<img width="256" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321507/c55b3989-9424-d36b-b0da-a46387ae1f30.png">

ファイル名も真っ赤っかに。


## インストール方法
超簡単です。VScodeの拡張機能検索でyamlと入れたら一番上に出てきます。（Red Hat提供）
<img width="296" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321507/9dde44cb-2650-4c75-7231-8e4b32693f0d.png">


非常に強力なサポートツールだと思います！
Ansibleのplaybook作ってる人は入れれば開発が絶対捗ります！
二段階認証と二要素認証、多要素認証

まず最初に、僕の記事を読むよりもこのリンク読むのがオススメです。
https://www.segunabe.com/2018/08/31/passclipnews180831/
以下はざっとまとめ。

#基礎
## 二要素認証の「要素」とは
認証の要素とは、「知識：本人だけが知っている」「所有物：本人だけが持っている物」「生体：本人の身体的特徴」の三つをさします。
二要素認証とは、この中の二つでの認証をさします。知識＋知識や、生体＋生体は二要素にはなりません。

## 二段階認証の「二段階」とは
認証プロセスが2段階に分けて行われることを指します。一段階目と二段階目は異なる認証手段を使いますが、必ずしも異なる要素になるとは限りません。

# 実例
## パスワード
パスワードは知識認証であり、**一段階、一要素認証**です。

## パスワード＋メール
パスワードは知識認証であり、メールもそのメールアドレスのパスワードを知っているという知識認証です。通常はパスワード確認後にメールが送信されるため、**二段階、一要素認証**となります。
複数のパスワードを知っている必要があるためセキュリティは向上しますが、一要素であることは変わりません。

## パスワード＋SMS
パスワードは知識認証であり、SMSはその携帯を持っているという所有物認証認証です。通常はパスワード確認後にSMSが送信されるため、**二段階、二要素認証**となります。

## パスワード＋物理MFAデバイス
パスワードは知識認証であり、物理MFAデバイスはそのハードウェアを持っているという所有物認証です。通常はパスワードと同時にMFAデバイスの認証を行うため、**一段階、二要素認証**となります。

## パスワード＋仮想MFAデバイス
これ微妙です。
パスワードは知識認証であり、仮想MFAはその仮想MFAを所有しているという所有物認証だと思います。そう考えると**一段階、二要素認証**となります。
ただ、仮想MFAデバイスをパスワード管理ツール等に入れている場合には、その管理ツールのパスワードを知っていればMFAデバイスを取得できるため、知識認証になっている可能性があります。そう考えると**一段階、一要素**になります。これはちょっと自信ない

## 通帳と印鑑
どちらも所有物なので、**一段階一要素**認証です。

## キャッシュカードとパスコード
キャッシュカードは所有物、パスコードは知識なので、**一段階二要素**認証です。

## 生体認証キャッシュカード
各社実装方針が違う可能性がありますが、みずほ銀行の場合だとキャッシュカードが所有物、指静脈認証が生体、パスコードが知識なので、**一段階三要素**認証です。
僕のあげたリンク先では「二要素認証」となっているけど、キャッシュカードいれたら三要素だと思われます。
SORACOM Napterやってみた

##早速
SORACOM Discovery 2019行ってないけど
やってみた
ラズパイ(WEB UIでログイン)--通信端末(SORACOM IoT SIMセット)←[インターネット]←個人PC
--はLANケーブル

##やり方
SORACOMコンソールから
オンデマンドリモートアクセスを選択
![111.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/153317/013bd381-dd2e-53a9-2324-ddc06c2f4ea8.jpeg)

HTTPでログインするので
8080を選択
![222.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/153317/883d3a61-c311-ebd3-0c49-db55299f6b27.jpeg)

あとは
HTTPのURLをクリックするだけ
![333.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/153317/0a6efd6d-d353-bf3f-743c-a88806e8770e.jpeg)

できました！
![login_ja.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/153317/eebe5acb-bbce-9bd4-c216-58e699bc5a3c.jpeg)

##使えそうな事例
・遠隔操作：人が操作して何かをする。設定変更など。
・ログ取得：不具合時の調査

##Gateより使える！
非常に簡単にできる
あとリモートアクセスなので
通信費がどうなるか知りたいですね
OSM日本のマッピング状況を県別に比べてみた(2019年上期版)


[前回(2018/12)](https://qiita.com/higa4/items/5647970922daca5bcb8e)は建物数が対前年比150%と5割増の急増をみせていたが、増加のペースは今回2019/7/7段階ではどうなっただろうか。以下シリーズ5回目の統計として、この約半年間の伸びを分析した。

## 1.[都道府県別OSMマッピング状況表_20190707](https://docs.google.com/spreadsheets/d/1zpyUf2Q_frV1C3NJT3gff_XhY7BU9hiBLyEcVqc_fqM/edit#gid=0)

[2018年の表](https://docs.google.com/spreadsheets/d/1eGxDcmGXKLj-UWIJHTvvYyWo1xFRnL2KGWOAv0Y6Jjs/edit#gid=0)に2019年上半期分を追加したものが[こちら](https://docs.google.com/spreadsheets/d/1zpyUf2Q_frV1C3NJT3gff_XhY7BU9hiBLyEcVqc_fqM/edit#gid=0)。T－Y及びAG-AM列のグリーン列が今回更新分。
![](https://i.imgur.com/Tu5k3gF.png)

## 2.[概況](https://docs.google.com/spreadsheets/d/1zpyUf2Q_frV1C3NJT3gff_XhY7BU9hiBLyEcVqc_fqM/edit#gid=1497821190)
![](https://i.imgur.com/JJEYo9G.png)
建物数については2018/12/7時点での対前年比150.7%に対して、今回上期段階で109.2%とややペースが落ちて1割弱の増加。もしかしたら平常ペースに戻ったということかもしれない。同程度で推移した場合には年間で2割程度の増加が見込まれる。
道路距離については101.2%とほぼ横ばい。
amenityは108.6%と建物と同程度の1割弱の伸び率であった。

## 3.建物数
### 3.1 [マッピング済み建物数（絶対数）](https://docs.google.com/spreadsheets/d/1zpyUf2Q_frV1C3NJT3gff_XhY7BU9hiBLyEcVqc_fqM/edit#gid=1326225953)
![](https://i.imgur.com/ASABure.png)
上から北海道、静岡、愛知、大阪は変わらず。東京がオリンピックの影響か5位に伸びてきている。

### 3.2 [建物数伸び率](https://docs.google.com/spreadsheets/d/1zpyUf2Q_frV1C3NJT3gff_XhY7BU9hiBLyEcVqc_fqM/edit#gid=1055704425)
![](https://i.imgur.com/kcXn3r3.png)
アクティブなOSMerの登場で急激にマッピングされるようになった地域やクライシスマッピング対象域が上位に現れることが多い。今回は兵庫、栃木、青森、和歌山、山口といったところ。

### 3.3 [建物コンプリート率（推定）](https://docs.google.com/spreadsheets/d/1zpyUf2Q_frV1C3NJT3gff_XhY7BU9hiBLyEcVqc_fqM/edit#gid=17169321)
![](https://i.imgur.com/GDlSpM7.png)
建物数は人口との相関があることが想定されるため、人口の半分の数が建物数というアバウトな仮説を立てた場合の建物マッピング達成率。北海道、静岡、鳥取、福島の4強に続き、京都が5番目に。

## 4.道路距離
### 4.1 [道路コンプリート率（推定）](https://docs.google.com/spreadsheets/d/1zpyUf2Q_frV1C3NJT3gff_XhY7BU9hiBLyEcVqc_fqM/edit#gid=197437285)
![](https://i.imgur.com/zaVHXv7.png)
国や自治体の管理道路の総距離に対するOSM道路距離数の比率。主要道路はほぼ描き終えて、管理道路に入っていない住宅街道路、山道、歩道といったところがどれだけ描かれているか、という目安を表すのではないか。神奈川、大阪、静岡、京都、熊本といった順番は前回と変わらず。

## 5.その他
### 5.1 [amenity密度](https://docs.google.com/spreadsheets/d/1zpyUf2Q_frV1C3NJT3gff_XhY7BU9hiBLyEcVqc_fqM/edit#gid=2124261809)
![](https://i.imgur.com/cHPCWn0.png)
amenityだけの数だが、POIマッピングの進展状況を横比較する目安にはなりそう。人口1000人あたりのamenity数を密度と表現。
京都、鳥取、山形、高知、滋賀といった順。建物や道路での順位とはやや異なる。
### 5.2 病院
今回からamenityの中でも病院だけを選んで集計することができるようになったが統計項目として取り扱うかどうかは未定。
### 5.3 河川
集計の不具合か河川リレーションのタグ付が合意なしに変えられている件の影響があるのか不明だが、河川距離が0となっている都道府県が多々あり、統計としては使えない状態。


詳細分析してみたい方は[スプレッドシート](https://docs.google.com/spreadsheets/d/1zpyUf2Q_frV1C3NJT3gff_XhY7BU9hiBLyEcVqc_fqM/edit#gid=0)をコピーしてご自由にどうぞ。CC0としています。
OVR ManagerにTarget Devicesが表示されない

UnityでOculus Questを操作する記事を読んでいました。Oculus Integrationをインポートをするところまではいきました。が、OVRCameraRigをヒエラルキーに入れてみた所、Target Devicesなんてないぞ...となったので。

#結論
Build SettingsのTarget PlatformをAndroidにする。

File>BuildSettingのPlatformから、Androidを選択して、Switch Platformを選択します。そうすると、Target Devicesが出現します。