OmniAICreator/Qiita-1.07M huggingface dataset:
[Ruby][gem] togglv8で認証に失敗したら

業務都合で自分があるPJに使った工数を集計する必要がありました。
タイムログを取るツールにTogglを使っていたのでTogglが提供してくれているAPIを使って集計するコードを書いたときのメモです。

## TogglのAPIドキュメント

https://github.com/toggl/toggl_api_docs

### RubyのAPIについて

https://github.com/toggl/toggl_api_docs#ruby

> Tom Kane has written a Ruby wrapper for Toggl API v8: https://github.com/kanet77/togglv8

とあったのでtogglv8というGemを使いました。

## 環境

- ruby 2.4.2p198
- togglv8-1.2.1

## 認証に失敗

https://github.com/kanet77/togglv8#togglv8api
`~/.toggl`というファイルにAPIトークンを記述しておけば認証のときにそれを使ってくれるんですが、実際に使ってみると認証が失敗してました。

## 対策

書き捨てのスクリプトだったのもあって、オープンクラスしてモンキーパッチをあてました(^^;)

ソースを追ってみると`TogglV8::Connection`というクラスの`self.open`メソッドを

```diff
def self.open(username=nil, password=API_TOKEN, url=nil, opts={})
  raise 'Missing URL' if url.nil?

  Faraday.new(:url => url, :ssl => {:verify => true}) do |faraday|
    faraday.request :url_encoded
    faraday.response :logger, Logger.new('faraday.log') if opts[:log]
    faraday.adapter Faraday.default_adapter
    faraday.headers = { "Content-Type" => "application/json" }
-   faraday.basic_auth username, password
+   faraday.basic_auth username.chomp, password
  end
end
```

のように書き換えると動作しました。
ファイルから読み込んだときの末尾の改行文字が消えてないみたいでした。

## PR
https://github.com/kanet77/togglv8/pull/22
出してみました。

出してみたものの、既に別のPRで解決されてました。。。
https://github.com/kanet77/togglv8/pull/21
まだ上記が含まれたGemがリリースされてなかったんですね。

以上です。
error: conditional compilation flags must be valid Swift identifiers が出たら

#現象
Xcode8からXcode9に移行したときに、以下のようなビルドエラーが発生しました。

```
<unknown>:0: error: conditional compilation flags must be valid Swift identifiers (rather than '-D')
Command /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swiftc failed with exit code 1
```

Xcode8では問題なくビルドできるプロジェクトです。
#原因
Build Settings の`Active Compilation Conditions` に `-D DEBUG` と書かれていた。

![ACC.png](https://qiita-image-store.s3.amazonaws.com/0/82584/3e2257ce-ef75-d2f2-09cc-fee416f45751.png)

-Dを削除して、`DEBUG`だけにしたらエラーが消えました。

## 説明
`Active Compilation Conditions` は以下のようなマクロで分岐させるときに使うフラグ文字列です。

```swift
#if DEBUG
  // デバッグビルド時のみの処理
#endif
```

Xcode8以降はデフォルトで`DEBUG`が入っています。

![default.png](https://qiita-image-store.s3.amazonaws.com/0/82584/6a59aec6-b5c4-9c10-a807-86f9a41ea939.png)

Xcode7以前では`Other Swift Flags` の方に `-D DEBUG` のように指定していましたが、`Active Compilation Conditions` には`-D`が必要ありません。同じノリで`Active Compilation Conditions`に`-D DEBUG`と指定すると、"-D"と"DEBUG"という2つの文字列を設定していると解釈されます。

Xcode8では`Active Compilation Conditions`に"-D"という文字列を設定していても別に怒られなかったのですが、Xcode9から[^1]はハイフンから始まる文字列はコンパイル時に蹴るようになったようです。

因みに、`Active Compilation Conditions`と`Other Swift Flags`の-D指定はどちらかが優先ということではなく、共存できるようでした。

## 検証環境
- macOS Sierra Ver. 10.12.6
- Xcode8.3.3
- Xcode9.0

[^1]: 正確に言うとXcodeというよりもSwiftコンパイラのバージョンに依存するものと思われます
docker-machineによる環境構築がコケる(0.12.0限定)

## 現象

docker-machineにて環境構築すると以下のエラーが起きて環境構築が正常に終了しない現象が起きます。

```
Installing Docker...
Copying certs to the local machine directory...
Copying certs to the remote machine...
Setting Docker configuration on the remote daemon...
Error creating machine: Error running provisioning: ssh command error:
command : sudo systemctl -f start docker
err     : exit status 1
output  : Job for docker.service failed because the control process exited with error code. See "systemctl status docker.service" and "journalctl -xe" for details.
```

この現象はDocker for MacかWinを使っていて、かつStable版のインストールをしている場合に起きます。
（2017年9月29日現在）

## 回避策

2017年7月13日リリースのdocker-machine v0.12.2にて修正されています。

Docker for Mac / Winをお使いの場合は2017年9月29日現在、Stable版ですとv0.12.0がインストールされるため、手っ取り早い方法としてはEdge版をインストールすることでv0.12.2がインストールされ問題が起きなくなります。


## 解説

この問題の原因はサブコマンドであるdocker daemonによって提供されていたデーモン機能が、dockerdコマンドに切り出されることに変更となったための対応が漏れていることから起きています。
https://docs.docker.com/engine/deprecated/#docker-daemon-subcommand

docker-machineがリモート先のdockerのバージョンを調べ、docker daemonを使うかdockerdを使うかを判定する部分にて誤動作し、間違ったコマンドを送ってしまうためセットアップが完了しないというのが根本的な原因です。

dockerのバージョンは現在年と月を元にしたフォーマットになっております。（旧方式では1.13.1が新方式では17.03.0）
https://github.com/moby/moby/releases/tag/v17.03.0-ce

インストール時に内部でリモートからバージョン番号を取得し、持っている順番リストと照らし合わせてどのコマンドを使うかを決めるのですが、そこでの判定ミスというわけです。

この件のIssueはこちらになります。
https://github.com/docker/machine/issues/4156#issuecomment-311964422

どんなコードが修正されたかについては、Issueからのリンクで見られますのできになる方はどうぞ。
Project Euler Q2 【偶数のフィボナッチ数】

Project Eulerをワンライナーで解いてみる。
間違っていたらコメントください。


## 問題
フィボナッチ数列の項は前の2つの項の和である. 最初の2項を 1, 2 とすれば, 最初の10項は以下の通りである.
1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...

数列の項の値が400万以下の, 偶数値の項の総和を求めよ.

Note:この問題は最近更新されました. お使いのパラメータが正しいかどうか確認してください.

## 解答
ワンライナーとは言わないか。。

```bash
a=0;b=1;for i in $(seq 50); do s=$(($a+$b)); echo $s;a=$b;b=$s;done |
awk '$1<=4000000 && $1%2==0{a+=$1}END{print a}'
4613732
```

フィボナッチ数列の出し方についてこういったものもあった~~けど、`awk`でforやwhileは個人的には使いたくないなぁ。~~
→`awk`でforは覚えておくとよい！

```bash
awk 'BEGIN{n=1;fn2=fn=1;while(n<50) {n++;fn=fn1+fn2;print fn;fn1=fn2;fn2=fn;}}'
```

## 答え合わせ
こちらのサイト様と一致していればOKとしました。
http://kingyojima.net/pje/002.html
ズンドコキヨシ for Excel

今更にも程がある、とは思ったが、せっかくなので書き残しておこう。
#[Excel関数]
```
=IFERROR(IF(MATCH("ドコ",OFFSET(A1,-5,0,5),0)=5,"キ・ヨ・シ！",NA),
  IFERROR(T(FIND(OFFSET(A1,-1,0),"キ・ヨ・シ！")),
   IF(RAND()<0.5,"ズン","ドコ")))
```
#[使い方]


1. A1セルに上記を入力
2. そのセルを選択し、下方のセル範囲（２〜３０行程度）にコピーペースト（またはフィル）する
（コード中の　A1　となっているところは、A2、A3・・・と自セルのアドレスになるはず）
3. F9キーを押すたびに、再計算で結果が変わります

#[説明]
###■1行目
```
IFERROR(IF(MATCH("ドコ",OFFSET(自セル,-5,0,5),0)=5,"キ・ヨ・シ！",NA),
```
「ここで"キ・ヨ・シ！"と叫ぶかどうか」を判断している
叫ぶ条件に当てはまらない場合はエラーとなり、IFERROR関数の第２引数（２行目以降の記述）を表示することになる

OFFSET関数で「自セルの５行前から５行分（つまり直近の５つ）」の範囲を指定して、その範囲内で、"ドコ"という値が何個目に登場するかをMATCH関数で調べる

* 自セルが１〜５行目の場合、「直近の５つ」が存在しないので、OFFSET関数でエラーになる
* 直近の５つの中に"ドコ"が１つもない場合は、MATCH関数がエラーになる
* ５個目（ズン・ズン・ズン・ズン・ドコ）なら、"キ・ヨ・シ！"を返す
* １〜４個目の場合、NA関数を使ってわざとエラーにしている


###■2行目
```
IFERROR(T(FIND(OFFSET(自セル,-1,0),"キ・ヨ・シ！")),
```
ここでは、「"キ・ヨ・シ！"が既に登場済みかどうか」を判断している
一つ上のセルが、"キ・ヨ・シ！"または空文字なら、登場済みということになるし、"ズン"や"ドコ"なら、未登場ということになる
登場済みなら自セルは空文字にする（未登場の時はエラーとなり、IFERROR関数の第２引数（３行目の記述）へ移る）

一つ上のセルをOFFSET関数を再び使って取得し、それを検索値として、FIND関数で、文字列"キ・ヨ・シ！"の中を検索する
セル値は"ズン","ドコ","キ・ヨ・シ！",空文字 のどれかなので、

* 検索値が"ズン"や"ドコ"の場合はヒットしないのでFIND関数がエラーになる（それによって後述のT関数もエラーになる）
* 検索値が"キ・ヨ・シ！"の場合は１桁目でヒット
* 検索値が空文字の場合も、１桁目でヒットしたという扱いになる

この戻り値を、T関数（引数が文字列以外の場合は空文字を返す）に与えている


###■3行目
```
IF(RAND()<0.5,"ズン","ドコ")
```
ここは、キヨシ未登場の場合の記述
"ズン"か"ドコ"をランダムで表示するために、RAND関数（0〜1の範囲での乱数を返す）を利用している

---
###■追記(18.11.17)
以下のようにすれば全てのセルが同じ数式で行ける

```
=IFERROR(IF(MATCH("ドコ",OFFSET($A$1,ROW()-6,0,5),0)=5,"キ・ヨ・シ！",NA),IFERROR(T(FIND(OFFSET($A$1,ROW()-2,0),"キ・ヨ・シ！")),IF(RAND()<0.5,"ズン","ドコ")))
```
SkyWay × Cognitive Service

# Cognitive Serviceってご存知ですか?

* Microsoftが開発した画像、音声、文章などを認識・分析してくれるサービス
* 今回はFace APIを使用

> 写真に含まれる顔の検出、識別、分析、グループ化、タグ付け

---

# 今回作ったもの

* 感情分析機能付きビデオチャット
* ビデオチャットをしている相手の顔を分析して感情などを推測してくれる
* ほかにも、年齢、眼鏡をかけているか、といった情報を表示

---

# デモ

[https://github.com/Kadoshita/skyway-x-cognitiveservice](https://github.com/Kadoshita/skyway-x-cognitiveservice)

* cloneして動かしてみてください。
* SkyWayとFace APIのAPI KEYは自分のものに置き換えてください。

---

# 仕組み

1. ベースはSkyWayのP2Pのビデオチャット
2. 非表示の `<canvas>` があり、定期的に `drawImage()` を使用して映像を一コマ描画
3. その一コマを `toBlob()` でBlobに変換してFaceAPIにPOST
4. 返ってきた結果をSkyWayのDataConnectionを使用して相手に送信
5. 認識結果を受信したら各項目を表示

![仕組み.png](https://qiita-image-store.s3.amazonaws.com/0/153517/85a38a45-3ef2-c25d-9b0b-6c2e72ccc149.png)

---

# SkyWayのここがいい!

* Webページに「通信」の機能を **簡単に** 追加できるところ
* ビデオチャットなどの機能に着目しがちですが、データのやり取りを簡単にできるところも利点だと思います
* 自分でサーバー側の開発、運用をしなくていい

---

# 今後の改良点

* 複数人でも使用可能にする
    * SFUを使用したサンプルをベースに作成
    * SFUを使うと負荷が抑えられる(P2Pだと3人以上はつらい…)

---

# まとめ

* 映像や音声の認識を行うことで、付加価値を付けることができます。
* Cognitive ServiceにはFace API以外にも様々なAPIがあります。
* SkyWayとCognitive Serviceを組み合わせることで、おもしろいビデオチャットができるかもしれません。
vagrantの自分なりのメモ

自分なりにvagrantのツボやつまずきやすいポイントをまとめたものです
参考にならないかもしれませんがあしからず
間違えがあったら指摘をいただけると助かります

# boxファイルのVMの関係
- boxファイルはオブジェクト指向でいうところのclassのようなもの
- VMはboxから生成されるインスタンスのようなもの
- １つのbox(class)から複数のVM(インスタンス)を作成できる
- VMのもとになるboxはvagrant box addでvagrantの管理化に追加しておく必要がある
- vagrant box addしたらboxはファイルとして存在しなくても良い
- vagrant box addさえしておけば同じVMをいくつでも何度でも作成することができる
- VMの作成元になるboxはVagrantfileで指定する

# destroyとremove
## vagrant destroyはVMを削除するもの(boxを操作するものではない)
```
$ vagrant destroy vm_name_or_id
```

### vmの名前やidをしらべるにはvagrant global-status
```
$ vagrant global-status
id       name    provider   state   directory
------------------------------------------------------------------------
41dae62  default virtualbox running C:/vm/hoge
dd1eb4f  default virtualbox running C:/vm/hoge_20170929

```

## boxを削除するのはvagrant box remove
```
$ vagrant box remove box_name
```

#環境変数VAGRANT_HOMEについて
box addしたboxなどの情報を管理するディレクトリはデフォルトでは次の場所になる
```
(ユーザディレクトリ)/.vagrant.d
```

追加したboxの情報、sshの秘密鍵など。
これらを管理するディレクトリ変更する場合、変更先のディレクトリをVAGRANT_HOMEに設定することで変更することができる。
※こちらの記事を参考にしました（引っ越し手順が載っています）
[vagrantのboxフォルダ変更手順メモ](https://qiita.com/sugard12/items/85b2e70c87a354675a0e)

#VMが配置される場所(VirtualBoxの場合)とその変更方法
こちらの記事を参照
[Vagrant, VirtualBox 大きいファイルの保存先を変更する](https://qiita.com/hidekuro/items/15c6acacea69d0182f31#virtualbox-%E3%81%AE%E4%BB%AE%E6%83%B3%E3%83%9E%E3%82%B7%E3%83%B3%E3%83%95%E3%82%A9%E3%83%AB%E3%83%80)

SSD(Cドライブ)+大容量HDD(Dドライブ)のような構成のときはvagrantの管理ディレクトリやVMが本体は容量が大きいので、デフォルトだとCドライブ配下のディレクトリだけど、Dドライブの独自ディレクトリに配置したい！というような場合に有効です。
Blue Pill(STM32F103ボード) を mbed 開発環境でLチカしてみる

# Blue Pill + mbed

格安のSTM32F103ボードである Blue Pill。

Arduino 開発環境で作るのがカンタンだけど、mbed 環境でも開発できる。

mbed 開発環境に Blue Pill は勿論登録されていないけれども、ほぼ同じチップを使った Nucreo F103RBを使うことができる。
![image](https://qiita-image-store.s3.amazonaws.com/0/139524/df542cf7-7ce0-c0a1-fcc2-356e0eeb538f.png)


Nucreo F103RB はマイコンチップとしてSTM32F103RB を使っている。
Blue Pill はマイコンチップとしてSTM32F103C8T6を使っている。
違いはこんなところ。

|MCU|GPIO|package|Flash|ADC|
|---|---|---|---|---|
|STM32F103RB|LQFP64,TFBGA64|51|128KB|15~16|
|STM32F103C8T6|LQFP48,UFQFPN48|37|64KB|10|

主にFlashが128KBと64KBの違いだけれど、実はBluePillのチップはFlashが128KB入っていたりする。

# mbedでLチカ

まず、サンプルプログラム Nucreo_blink_ledを呼び出す。
ここでは、Nucreo_blink_led_BluePillと名前をつけました。

![image](https://qiita-image-store.s3.amazonaws.com/0/139524/168e5ea7-7c2b-d106-785a-cd824f569c30.png)

NucreoのLEDは、PA_5につながっているらしいです。BluePillではPC_13なのでそれを書き換えます。

![image](https://qiita-image-store.s3.amazonaws.com/0/139524/7b5dd212-bedc-c469-dd7c-cfaa63d7faea.png)


「コンパイル」ボタンを押すとバイナリがダウンロードされます。

# 書込

ここで、Nucleo の場合はPCにボードを繋ぐと出現するUSBストレージにバイナリファイルをコピペします。

しかしながらBluePillにはそういった機能は無いので、ST-LinkやUSBシリアルアダプタを使って書き込むことになります。

ここではUSBシリアルを使ってみます。

# 配線

今回はBluePillのバリエーションの、RobotDynのボードと秋月電子の「FT232RQ USBシリアル変換キット」 を使いました。

![IMG_20170929_132248.jpg](https://qiita-image-store.s3.amazonaws.com/0/139524/c5227451-fdff-4066-7b98-5ff0bf39d0c0.jpeg)


本家BluePillの場合はこちらを参照
https://qiita.com/nanbuwks/items/ba37f049f45378da0e2b






## stm32flash

書込ソフトとして、stm32flashツールを使います。ここでは、Arduino_STM32をインストールした時にインストールしたものを使いました。

```

$ cd Arduino
$ cd hardware/Arduino_STM32-master/tools/linux64/stm32flash/
```

```

$ ./stm32flash -w ~/Downloads/Nucleo_blink_led_BluePill_NUCLEO_F103RB.bin -v -
g 0x0 /dev/ttyUSB0
stm32flash Arduino_STM32_0.9

http://github.com/rogerclarkmelbourne/arduino_stm32

Using Parser : Raw BINARY
Interface serial_posix: 57600 8E1
Version      : 0x22
Option 1     : 0x00
Option 2     : 0x00
Device ID    : 0x0410 (Medium-density)
- RAM        : 20KiB  (512b reserved by bootloader)
- Flash      : 128KiB (sector size: 4x1024)
- Option RAM : 16b
- System RAM : 2KiB
Write to memory
Erasing memory
Wrote and verified address 0x08004d40 (100.00%) Done.

Starting execution at address 0x08000000... done.

$
```

コレで書けました。

# 注意点

上記のプログラムを実行してみたら、LEDの１と0が逆になっているみたいでした。
Mountable Engineからapplication_helperが使えない

#Mountable Engine

・Mountable Engineについてはこちらを参照
https://railsguides.jp/engines.html

以下のようにマウントしているとする

```config/routes.rb
Rails.application.routes.draw do
  mount HogeHoge::Engine, :at => '/', as: 'hoge_hoge'
```

application_helperにメソッドを定義

```app/helpers/application_helper.rb
module ApplicationHelper
  def piyopiyo
    # do something...
  end

```

問題になったのは、header等でどこのページでもこの`piyopiyo`を呼び出すときに
マウントしている`hoge_hoge`のページでは読み込めずエラーになってしまうということ。。。


#解決方法

マウント側を修正して、`main_app.piyopiyo`とかかけば解決するらしいのだけど、もっと簡単に解決する出来る方法があった。

```app/helpers/hoge_hoge/application_helper.rb
module HogeHoge::ApplicationHelper
  include ApplicationHelper
end
```

このようにhelpersに作成してもとのApplicationHelperをincludeしてしまう。
これでHogeHoge側からも共通してhelperが使える。
線形回帰を最小二乗法を解いてみる

# 線形回帰を理解する。

機械学習の勉強本の導入部として紹介されることの多いのが、「**線形回帰**」だ。
（都市の人口や駅からの距離などの要素からその地価を予想するなどのやつ。）
主に下記の流れで紹介されることが多い。

+ 予測とは
+ モデルの作り方
+ 誤差について
+ 過学習
+ 正則化

scikit-learnなどのライブラリを使用すると、データセットから正則化までやってくれるが、ここでは、自分で(計算過程でライブラリは使うが）行列式を計算して最小二乗法による推測を行い、知識の定着を図る。

##### 平均二乗誤差からパラメータを求める。

実際の観測値$y$とモデルによる予測値$f(x,a)$の差は平均二乗誤差として下記のように定義される。
（$x$は回帰式における各説明変数の値（都市の人口や駅からの距離）、$y$は目的変数の値（地価）を指す。）

```math
 E(a)= \frac{1}{n} \sum_i^n ( y^{(i)} -f( x^{(i)},a ))^{2}  
```

個々の観測データ$x$,$y$を行列表現でまとめると、

```math
 E(a)= \frac{1}{n}  \parallel y-Xa \parallel ^{2} = \frac{1}{n}  (y-Xa)^{T} (y-Xa)
```
となる。

**追記（2017/09/30）:**
$y$は個々の観測値を縦に並べたベクトル
（$y^T$とした場合は横ベクトルを指す。）

ちなみに、観測値$x$の集合$X$の行列は、目的変数が3個、データの数が$n$個の場合

```math
 \begin{bmatrix}  x_{1}^{(1)}   & x_{2}^{(1)} & x_{3}^{(1)} \\x_{1}^{(2)}   & x_{2}^{(2)} & x_{3}^{(2)}  \\ \vdots&\vdots&\vdots \\x_{1}^{(n)}   & x_{2}^{(n)} & x_{3}^{(n)}  \end{bmatrix} 
```
のような形をとる。（行はデータ数、列は説明変数の数）
＊但し、線形回帰を行う際、バイアス（誤差）を含める場合、下記のように一列目を１の列を追加する。（必ずしも１である必要はない。）

```math
 \begin{bmatrix} 1& x_{1}^{(1)}   & x_{2}^{(1)} & x_{3}^{(1)} \\ 1& x_{1}^{(2)}   & x_{2}^{(2)} & x_{3}^{(2)}  \\  \vdots& \vdots&\vdots&\vdots \\ 1& x_{1}^{(n)}   & x_{2}^{(n)} & x_{3}^{(n)}  \end{bmatrix} 
```
誤差を最小化するための$a$を求めるので、誤差関数を$a$の各要素で微分する。

```math
E(a)= \frac{1}{n}( y^{T}-X^{T}a^{T})(y-Xa)= \frac{1}{n}( y^{T}y-y^{T}Xa-X^{T}a^{T}y+X^{T}a^{T}Xa)
```
```math
\frac{ \partial E(a)}{ \partial a}= \frac{1}{n}(-2X^{T}y+2X^{T}Xa)= -\frac{2}{n} X^{T}(y-Xa)=0
```
```math
a=(X^{T}X)^{-1}X^{T}y
```
＊行列の微分に関する補足

```math
\frac{ \partial X^{T}a}{ \partial a}=X ,   \frac{ \partial a^{T}Xa}{ \partial a}=2Xa 
```

**追記（2017/09/30）:**
ベクトルによる微分の参考：[正規方程式の導出と計算例](http://qiita.com/hogefugabar/items/71916560f7efc6eededf)

上で求めた$a$によって、モデルを作るための最適なパラメータが求められる。


##### 実際に書いてみる。

###### １．データの作成

まず、最もシンプルな目的変数が１つの例
sklearnのdatasetsから回帰に適したサンプルデータを作る。

```py
import numpy as np
from sklearn import datasets
np.random.seed(0)
sample_size = 50
noise_size = 10
dim = 1

data = datasets.make_regression(sample_size, dim, noise=noise_size)
ones = np.ones(sample_size).reshape(sample_size, 1)
feature = np.array(data[0])
X = np.hstack((ones, feature))
y = np.array(data[1])
```
誤差（切片）も求めるため、全てが１の列を追加している。
表示するとこんな感じ。（ノイズ付きの良さげな分布になっている。）
<img width="50%" src="https://qiita-image-store.s3.amazonaws.com/0/204732/9e6fa08d-8bc6-a4c6-aea8-47b1ca4a5b7a.png">

###### ２．パラメータの算出

最小二乗解を求める。

```py
XTX = np.dot(X.T, X)
XTX_inv = np.linalg.inv(XTX)
a = np.dot(XTX_inv, np.dot(X.T, y))
# [  1.714  13.92 ]
```
ノイズが小さいので、誤差も小さくなっていることが分かる。


###### ３．モデルを図示

```py
linex = np.linspace(-3, 3, 1000)
f = lambda x: a[0] + a[1]*x
liney = f(linex)

plt.plot(linex, liney)
plt.show()
```

だいたい真ん中らへんを通る直線が描けている。
<img width="50%" src="https://qiita-image-store.s3.amazonaws.com/0/204732/69d8eeb2-190e-cd61-93fd-8ae44f597b09.png">

###### ４．結果の確認

最後に、scikit-learnと値が一致することを確認する。
ライブラリを使った場合、これだけで済む。

``` py
from sklearn import datasets, linear_model
lin = linear_model.LinearRegression()
lin.fit(data[0], data[1])
print lin.intercept_, lin.coef_
# 1.71369654235 [ 13.92]
```
以上。次は、過学習と正則化についてまとめたい。
UnityParticlePainterが動かない問題と解決法 

## 容易に実装できるARKit
iOSのAR機能としてiOS11と同時にリリースされたARKit。
ゲーム開発エンジンであるUnityに対応しており、容易にグラフィカルな開発ができるようになっています。

## サンプルを動かしてみよう！
[Unity ARKit Plugin](https://www.assetstore.unity3d.com/jp/#!/content/92515)は執筆現在、Unityのアセットストアからダウンロードすることができるほか、[Bitbucket](https://bitbucket.org/Unity-Technologies/unity-arkit-plugin)からダウンロードすることもできます。
完成パッケージになっているため、インポートすることですぐにサンプルを動かすことができるようになっています。色々と試してみましょう！

この記事では導入部分に関しては省きます。

## 動かないサンプル
執筆時点で8種類のサンプルが内包されており、すぐに機能を確認することができるようになっていますが、
サンプルシーンの１つである空中に絵を描くことができる「UnityParticlePainter」をBuild Settingsから選択しビルドすると、Unity側ではビルドは通りますが、Xcode側で実機にビルドしようとするとエラーが発生します。

## 原因と解決
原因としてはUnityARKitPluginを動かすために必要なクラスのうちの１つ「UnityARCameraNearFar」が「UnityParticlePainter」のMain Cameraにないことです。

![スクリーンショット 2017-09-29 14.58.53.png](https://qiita-image-store.s3.amazonaws.com/0/162880/d12df11e-be52-a982-b1aa-f3e19d4095fc.png)

ということなので上図のようにヒエラルキーにあるCameraParent/Main Cameraに「UnityARCameraNearFar」をAdd componentしてあげましょう。

これでXcode側でのエラーがなくなり、実機で動作を確認することができるようになります。
MITライセンスとBSDライセンスってなによ。

先日、FacebookがReactをBSDライセンスからMITライセンスに変更すると発表がありました。

https://code.facebook.com/posts/300798627056246/relicensing-react-jest-flow-and-immutable-js/

が、しかし。そもそもBSDやらMITやらAKBやらなんなんだよ。と思ってらっしゃるかたも多いかと思います。ということで、BSDとMITライセンスに変更すると何が違うのか書いていきたいと思います。

まずは


###BSD (Berkeley Software Distribution License)

このライセンスは特別ややこしい規制があるというわけではなく、

・再配布時には著作権表示や許諾表示を残す（ソースの全ファイル、もしくは重要なファイルに記述）
・無保証である（＝何か問題が起こっても制作者側は保証しないし責任もとらないよー）
・**書面による特別の許可なしに、組織-著作権者の名前と貢献者の名前を使わない。**

この3つを守ればあとは自由に複製、変更、再配布、販売など行っても構わないライセンスです。


###MIT (X11 License、X Licenseとも呼ばれる)

このライセンスは特別ややこしい規制があるというわけではなく、

・再配布時には著作権表示や許諾表示を残す（ソースの全ファイル、もしくは重要なファイルに記述）
・無保証である（＝何か問題が起こっても制作者側は保証しないし責任もとらないよー）

この2つを守ればあとは自由に複製、変更、再配布、販売など行っても構わないライセンスです。

-------------------------------------------------------------------------------------

ほとんど変わりませんね。('ω')
MITライセンスは修正済みBSDライセンス(2条項)と同条件です。
先ほど紹介したBSDライセンスは3条項、オリジナルと呼ばれているBSDライセンスは4条項になります。

オリジナルのBSDライセンスの方は、宣伝条項と呼ばれる条項が削除する必要があったため、
現在の3条項のものが一般的になっております。どちらも基本的に、縛りの少ないライセンスではありますが、宣伝などの条項で少しだけ差がある感じですね。


**4条項BSDライセンスとは**(オリジナル)
http://www.wdic.org/w/TECH/4%E6%9D%A1%E9%A0%85BSD%E3%83%A9%E3%82%A4%E3%82%BB%E3%83%B3%E3%82%B9

（10/01 編集）少し記事の書き方に不足があったので編集いたしました。
~~~http://news.mynavi.jp/news/2017/09/29/049/~~~
~~~とのことで、縛りの少なくなったライセンスで提供するみたいですね。~~~

（Facebookの特記条項のニュースに関しては検索してくださいますと幸いです）
今回は、ライセンスBSDとMITの違いについて投稿しました！
git 設定事項リストと諸々のメモ

# description
たまに確認するための自分用メモ


# 新しいリポジトリを作成した時
when created new repository
about remote repository

```shell
git remote -v #check remote repository
git remote add origin REMOTE-REPO-URL
```

# 新しい環境にgitをインストールした時
when installed git on new environment

to configure

```shell
git config --global user.name "YOUR USER NAME"
git config --global user.email "YOUR@EMAIL"

#not needed because vim is usually default and the best / vimは至高
git config --global core.editor vim 

#change diff-tool to vimdiff
git config --global merge.tool vimdiff 
git config --global color.ui auto

# force --no-ff option when merge command is used / mergeの時、デフォルトで--no-ffが適用されるようにする
# -ff merge is only allowed for pull / ff関係にある時にpullのみ-ffを許可
git config --global --add merge.ff false
git config --global --add pull.ff only
```

to check configuration

```shell
git config --list
git config {key}
```
iOS システム音量の取得／監視

#システム音量の取得と監視

```swift:
// 取得
let audioSession = AVAudioSession.sharedInstance()
let volume = audioSession.outputVolume
```

```swift:
// 監視開始
let audioSession = AVAudioSession.sharedInstance()
try! audioSession.setActive(true) // 必須
audioSession.addObserver(someObserver, forKeyPath: "outputVolume", options: [ .new ], context: nil)
```

```swift:
// 監視終了
let audioSession = AVAudioSession.sharedInstance()
audioSession.removeObserver(someObserver, forKeyPath: "outputVolume")
```

# 実装サンプル
```ViewController.swift
class ViewController: UIViewController {

  @IBOutlet weak var label: UILabel!
  
  let audioSession = AVAudioSession.sharedInstance()

  override func viewDidLoad() {
    super.viewDidLoad()
    
    // 監視を有効にする
    try! audioSession.setActive(true)
  }
  
  override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    
    // 現在値を取得
    label.text = "\(audioSession.outputVolume)"

    // 監視を開始
    audioSession.addObserver(self, forKeyPath: "outputVolume", options: [ .new ], context: nil)
  }

  override func viewDidDisappear(_ animated: Bool) {
    super.viewDidDisappear(animated)
    
    // 監視を終了
    audioSession.removeObserver(self, forKeyPath: "outputVolume")
  }
  
  override func observeValue(forKeyPath keyPath: String?, of object: Any?,
                             change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
    // 変更値を取得
    label.text = "\(audioSession.outputVolume)"
  }
}
```

# 音量目盛との対応
0目盛(消音) … `outputVolume: 0.0`
1目盛 … `outputVolume: 0.06`
2目盛 … `outputVolume: 0.12`
6目盛 … `outputVolume: 0.37`
16目盛(最大) … `outputVolume: 1.0`
Slackの過去にあったトークンを作るURLの場所

どうも、Slackは日々進化しているようで過去にあったトークンが以前のURLで取れなくなっているようです。今現在その場所は以下にあり、レガシー扱いされているようです。

[https://api.slack.com/custom-integrations/legacy-tokens](https://api.slack.com/custom-integrations/legacy-tokens)

もちろん以前のように生成もできます。

---
私のSlackの記事は私のSlack Teamの宣伝を逃れることはできません！
雑談Slackへ是非どうぞ！
[http://samezi-but.com/zdnj.html](http://samezi-but.com/zdnj.html)
NefryBT向けFastSensingライブラリ紹介

# Nefry FastSensingライブラリ

[FastSensing](https://fastsensing.com/ja/)と呼ばれる、NefryのようなIoTデバイスから取得したデータを簡単にグラフ化できるWebサービスとなります。
つい先日公開されたばかりで情報もすくないですが、データをいろいろな表現ができるようになるので今後に期待のサービスとなります。
（ちなみにNefry BTのクラウドファンディングを支援していただいており初期ロットには裏面にロゴが入っております。

紹介記事：紹介記事はまだありません。しばらくお待ちください。

##どんなことができる？
センサーデータの蓄積、グラフ化や図にプロットすることなどができます。

##関数情報

### begin

FastSensingにつなぐために必要な初期化処理をします。**起動時に一度だけ呼び出してください。**
引数が違うものが2つありますがどちらか一つ呼び出してください。

####NefryのWebConfigで設定する値を設定する場合
ここの引数で設定した値がWebConfigで設定できる欄の値になります。

||||
|:---:|:---:|:---:|
|引数1|int|0-9の間で入力してください。デフォルトは0になります。deviceIDを入力する欄を選択します。|
|引数2|int|0-9の間で入力してください。デフォルトは1になります。チャンネル1のキー情報を入力する欄を選択します。|
|引数3|int|0-9の間で入力してください。デフォルトは2になります。チャンネル2のキー情報を入力する欄を選択します。|
|引数4|int|0-9の間で入力してください。デフォルトは3になります。チャンネル3のキー情報を入力する欄を選択します。|
|返り値|void||
|具体例||fastSensing.begin();|

####直接プログラム内で設定する値を設定する場合
プログラム内で直接値を設定する場合はこちらで設定することができます。

||||
|:---:|:---:|:---:|
|引数1|String|deviceIDを入力します。|
|引数2|const char[9]|チャンネル1のキー情報を入力します。|
|引数3|const char[9]|チャンネル2のキー情報を入力します。|
|引数4|const char[9]|チャンネル3のキー情報を入力します。|
|返り値|void||
|具体例||fastSensing.begin("device","key1","key2","key3");|

### setValue

FastSensingに送るデータをセットします。複数の型に対応しています。

||||
|:---:|:---:|:---:|
|引数1|int|FastSensingで表示されるチャンネルを選択します。0-2の間で選択してください。|
|引数2|int,double,String|Ambientで表示されるデータを入れます。複数の型に対応しています|
|返り値|bool|true:処理成功　false:チャンネルかすでにデータが入っています|
|具体例||fastSensing.setValue(1,1000);|

### push

FastSensingにデータを送信します。

||||
|:---:|:---:|:---:|
|引数|void|なし|
|返り値|bool|true:通信成功　false:通信失敗、データに誤りがある可能性があります。|
|具体例||fastSensing.push();|


##サンプルプログラム
データをFastSensingにアップロードします。

```c++:NefryFastSensing
#include <NefryFastSensing.h>
//インスタンスを作成します
NefryFastSensing fastSensing;
float floatData = 0;
float intData = 0;

void setup() {
  //FastSensingで必要な情報を入力し、初期化をします
  //https://console.fastsensing.com/devicesからデバイスとチャンネル
  //begin(デバイス、チャンネル1、チャンネル2、チャンネル3)
  fastSensing.begin("device", "channel1", "channel2", "channel3");
}

void loop() {
  //FastSensingに送るデータを作成します
  //setValue(チャンネル、データ)
  fastSensing.setValue(0, floatData);
  fastSensing.setValue(1, intData);

  //setValueで入れた値をFastSensingに送信します
  //push()
  fastSensing.push();
  
  floatData += 0.1;
  intData++;
  delay(10000);
}
```
Kotlin小ネタ: Class Delegationとデフォルト引数でDisposableの実装を楽にする

*需要ありそうなので小ネタ投下します*

RxKotlin使用

↓こんな感じにCompositeDisposable使ってるやつ

```kotlin
class OldMainActivity() : AppCompatActivity(), Disposable {

    private val compositeDisposable = CompositeDisposable()
    
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        // 例なので特に意味はない
        compositeDisposable += (0..10).toObservable().subscribe { Log.d("a","$it") }
    }

    override fun isDisposed(): Boolean {
        return compositeDisposable.isDisposed
    }

    override fun dispose() {
        compositeDisposable.dispose()
    }

    override fun onDestroy() {
        super.onDestroy()
        dispose()
    }
    
}
```

Class Delegationとデフォルト引数でこう書くと楽になるかも？？

```kotlin
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import io.reactivex.disposables.CompositeDisposable
import io.reactivex.disposables.Disposable
import io.reactivex.rxkotlin.plusAssign
import io.reactivex.rxkotlin.toObservable

class MainActivity(private val compositeDisposable: CompositeDisposable = CompositeDisposable())
    : AppCompatActivity(), Disposable by compositeDisposable {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        compositeDisposable += (0..10).toObservable().subscribe { Log.d("a","$it") }
    }

    override fun onDestroy() {
        super.onDestroy()
        dispose()
    }
}
```

MainActivity内にこんな拡張関数を定義するとsubscribeのあとに繋げられていいかもしれない

```kotlin:MainActivity
private fun Disposable.addTo(){
    compositeDisposable += this
}
```

いちいち拡張関数を定義するのはめんどくさいのでデフォルトメソッド&拡張関数を使って省略するのもありかもしれません

```kotlin
interface CompositeDisposableEx{
    val compositeDisposable : CompositeDisposable

    fun Disposable.addTo(){
        compositeDisposable += this
    }
}

class MainActivity(override val compositeDisposable: CompositeDisposable = CompositeDisposable())
    : AppCompatActivity(), Disposable by compositeDisposable, CompositeDisposableEx
// うしろは省略
```
ただしこの場合はcompositeDisposableがpublicになってしまう

~~以上、小ネタでした〜~~

***追記***
(コメントより)
onDestroyが複数回呼ばれる可能性のあるFragmentなどはライフサイクルに注意すること
CompositeDisposableを再生成するか、CompositeDisposable.clearを使うといいです
【bash】変数の値に含まれる変数を展開させる方法

#背景
bashを使用して大量の実行コマンドを自動的に流したいなって思って、サクッと書けるかなって思ってたらトラップ発動したのでメモ。

やりたいことは単純。
・コマンドが複数行記述されているファイル `cmd.txt` を用意。
・`cmd.txt`を一行ずつreadして実行する `runcmd.sh`を実行するとコマンドが1行ずつ実行される。

#実行したいコマンドに埋め込まれた変数が展開されずエラーに
よくある話ですが、実行したいコマンドに環境変数が埋め込まれていることがあると思います。こんな感じ。
`/{$HOME}/{$FOO}/{$BAR}/run.sh`
これを外部ファイルからreadしようとすると、単純な文字列として解釈されるので、`{$...}`が展開されないのです。

#【解決法】evalを使って評価してあげる
evalコマンドを使用して文字列を評価してあげると、埋め込まれている変数が展開されて期待通りの挙動となりました！

具体的には次の通り。

```bash
path1=foo
path2=bar

# 実際は下記コマンドは外部ファイルからreadされる
# 擬似的に、内部変数を評価せず文字列として認識するようにように ' ' で宣言
cmd='${path1}/${path2}/hogehoge.sh'

echo ${cmd} # 普通に展開しようとすると変数が展開されない
            # ${path1}/${path2}/hogehoge.sh

echo $(eval echo ${cmd}) # evalで評価してあげると正しく展開された！
                         # foo/bar/hogehoge.sh
```
このように、evalコマンドで文字列に含まれる変数部分を再展開し、その後`$( ... )`で囲うことで、全体の文字列を新たな変数として再定義していることになります。ちょっと勉強になった。

# 【おまけ】変数が保持している文字列。これを変数として解釈させるには？
今回躓いた部分からは外れるが、色々調べたら面白いことがわかったのでついでに共有。

変数がある文字列を保持しているとする。この文字列を変数として解釈させたいことがある。
具体的には次の通り。

```bash
pro=apple
echo ${pro} # apple

macbook=pro
echo ${macbook} # ${pro}として変数が展開されているわけではないので、
                # 当然文字列として "pro" が表示

```
ここで変数`${macbook}`が保持する文字列`pro`を変数`${pro}`として解釈させるにはどのようにすれば良いだろうか。裏技的だが次のように表現する。

```bash
# パターン1
echo ${!macbook} # apple

# パターン2
eval echo '$'${macbook} # apple

```
パターン2について補足しておくと、
1. `echo`で`${macbook}`が展開される
2. 文字`'$'`と文字列`pro`が合体し、一つの文字列`$pro`ができる
3. `eval`コマンドが`$pro`を評価し、最終的に`apple`が出力される

#まとめ
シェルスクリプトを書いているとよく文字列操作で躓いてしまいます。あまりゴリゴリ書かないので不慣れな部分が多いのですが、、
それでも他言語と比べて文字列操作がシビアだと思うんですよ。ちゃんと理解してないとすぐエラー。嫌になりますね。
なのでこういう細かい仕様は目を逸らさずちゃんと理解しないとダメですね！
GoogleAppScriptで、GoogleDriveに保存した画像のファイル名をidから取得してspreadsheetに記述する方法

[こんな人にとって役に立ちます]
・Google spreadsheetに、GoogleDriveに保存したURLのリストがある
・ただし、ファイル名はわからない
・でもファイル名をなんとかして取得する必要がある

```
function myFunction() {
  // spreadsheetのセルの値を取得する部分
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = spreadsheet.getActiveSheet();
  var range = sheet.getRange(3,15,231);
  var values = range.getValues();

  // ３行から231行目までの16列目に画像のファイル名を打ち込むLoop文
  for (var i=3; i<232; i++) {
    var fileId = values[i-3];
    var file = DriveApp.getFileById(fileId)
    sheet.getRange(i,16).setValue(file.getName());
    Logger.log(file.getName());
  }
}
```

[注意点]
上記のスクリプトをコピペして実行するとエラーが起きた。
DriveApp.getFileByIdのところで、undefinedと怒られる。
解決方法としては、DriveAppを手で打ち込むとスクリプトエディターが認識してくれて治る。

謎。
CentOS7 Postgresのデータディレクトリを変更する手順

#環境
・CentOs7
・PostgreSQL9.5
###手順１
```
　/usr/lib/systemd/system/postgresql-9.5.service 内の
 "Environment=PGDATA="を変更する
　 ※例：/var/lib/pgsql/9.5/data/をXXXXXX/data
      　変更する際に，変更前の行を残しておくと動かなかったので上書きすること
```
###手順２
```
.bash_profileにある、PGDATA= を変更後、
 source .bash_profileで反映する
※例：/var/lib/pgsql/9.5/data/をXXXXXX/data
変更する際に，変更前の行を残しておくと動かなかったので上書きすること
```
###手順３
```
systemctl daemon-reloadを実行する
※これをしないと、警告が出た
Warning: postgresql-9.5.service changed on disk. Run 'systemctl daemon-reload' to reload units.
```
###手順４
```
/usr/pgsql-9.5/bin/postgresql95-setup initdbを実行する
```
###手順５
```
systemctl start postgresql-9.5.serviceを実行する
```
これでデータディレクトリを変更出来た。
今まで作成したデータを移動先にコピーしたけど、
データベースは移動されなかった。。
とりあえず、データーベース毎作り直すか・・
BigQueryで string.normalize


BigQueryでキーワード分析などをする場合、文字列をまず正規化したい。
String.prototype.normalizeが使えるので使う。
半角全角はchromeのように考慮してないので自前でマッピングを作る。

```sql
CREATE TEMPORARY FUNCTION normalize(str STRING)
RETURNS STRING
LANGUAGE js AS """
if (str === null)
  return;

var kanaMap = {
  'ｶﾞ': 'ガ', 'ｷﾞ': 'ギ', 'ｸﾞ': 'グ', 'ｹﾞ': 'ゲ', 'ｺﾞ': 'ゴ',
  'ｻﾞ': 'ザ', 'ｼﾞ': 'ジ', 'ｽﾞ': 'ズ', 'ｾﾞ': 'ゼ', 'ｿﾞ': 'ゾ',
  'ﾀﾞ': 'ダ', 'ﾁﾞ': 'ヂ', 'ﾂﾞ': 'ヅ', 'ﾃﾞ': 'デ', 'ﾄﾞ': 'ド',
  'ﾊﾞ': 'バ', 'ﾋﾞ': 'ビ', 'ﾌﾞ': 'ブ', 'ﾍﾞ': 'ベ', 'ﾎﾞ': 'ボ',
  'ﾊﾟ': 'パ', 'ﾋﾟ': 'ピ', 'ﾌﾟ': 'プ', 'ﾍﾟ': 'ペ', 'ﾎﾟ': 'ポ',
  'ｳﾞ': 'ヴ', 'ﾜﾞ': 'ヷ', 'ｦﾞ': 'ヺ',
  'ｱ': 'ア', 'ｲ': 'イ', 'ｳ': 'ウ', 'ｴ': 'エ', 'ｵ': 'オ',
  'ｶ': 'カ', 'ｷ': 'キ', 'ｸ': 'ク', 'ｹ': 'ケ', 'ｺ': 'コ',
  'ｻ': 'サ', 'ｼ': 'シ', 'ｽ': 'ス', 'ｾ': 'セ', 'ｿ': 'ソ',
  'ﾀ': 'タ', 'ﾁ': 'チ', 'ﾂ': 'ツ', 'ﾃ': 'テ', 'ﾄ': 'ト',
  'ﾅ': 'ナ', 'ﾆ': 'ニ', 'ﾇ': 'ヌ', 'ﾈ': 'ネ', 'ﾉ': 'ノ',
  'ﾊ': 'ハ', 'ﾋ': 'ヒ', 'ﾌ': 'フ', 'ﾍ': 'ヘ', 'ﾎ': 'ホ',
  'ﾏ': 'マ', 'ﾐ': 'ミ', 'ﾑ': 'ム', 'ﾒ': 'メ', 'ﾓ': 'モ',
  'ﾔ': 'ヤ', 'ﾕ': 'ユ', 'ﾖ': 'ヨ',
  'ﾗ': 'ラ', 'ﾘ': 'リ', 'ﾙ': 'ル', 'ﾚ': 'レ', 'ﾛ': 'ロ',
  'ﾜ': 'ワ', 'ｦ': 'ヲ', 'ﾝ': 'ン',
  'ｧ': 'ァ', 'ｨ': 'ィ', 'ｩ': 'ゥ', 'ｪ': 'ェ', 'ｫ': 'ォ',
  'ｯ': 'ッ', 'ｬ': 'ャ', 'ｭ': 'ュ', 'ｮ': 'ョ',
  '｡': '。', '､': '、', 'ｰ': 'ー', '｢': '「', '｣': '」', '･': '・'
};

var reg = new RegExp('[' + Object.keys(kanaMap).join('') + ']', 'g');

return str.normalize('NFKC').toLowerCase()
  .replace(/[ａ-ｚ０-９]/g, function(s) {
    return String.fromCharCode(s.charCodeAt(0) - 0xFEE0);
  })
  .replace(reg, function (s) {
    return kanaMap[s];
  })
  .replace(/[\\s\\u3000]+/g, ' ')
  .trim();
"""
;


SELECT normalize('　　Ａ　　　ＩＵ ＥＯ１２３４５ｱｲ') -- "a iu eo12345アイ"
;
```

この関数を使って、

normalize -> split -> unnest -> aggregate

で単語ごとの集計をする。

```sql

SELECT
  term
  , SUM(impressions)
FROM
  `hogehoge.keyword_log`
  JOIN UNNEST(SPLIT(normalize(`keyword`), ' ')) as term -- 配列に分割してexplodeする
GROUP BY term
;
```
Project Euler Q1 【3と5の倍数】

Project Eulerをワンライナーで解いてみる。
間違っていたらコメントください。


## 問題
10未満の自然数のうち, 3 もしくは 5 の倍数になっているものは 3, 5, 6, 9 の4つがあり, これらの合計は 23 になる.

同じようにして, 1000 未満の 3 か 5 の倍数になっている数字の合計を求めよ.

## 解答

```bash
time seq 999 |
awk '$1%3==0||$1%5==0{s+=$1} END{print s}'
233168

real    0m0.004s
user    0m0.003s
sys     0m0.003s
```

※2018/01/24修正
まどろっこしい処理してるなと思ったので、書き直した

## 答え合わせ
こちらのサイト様の答えと一致していればOKとした。
http://kingyojima.net/pje/001.html
headless chrome forceViewport


## forceViewportはやめ。setVisibleSizeの代わりにsetDeviceMetricsOverrideを使う

```js
        const deviceMetrics2 = {
            width: viewportWidth,
            height: height,
            deviceScaleFactor: 1,
            mobile: false,
            fitWindow: false,
        };
        await Emulation.setDeviceMetricsOverride(deviceMetrics2);
        await Emulation.setVisibleSize({width: viewportWidth, height: height});
      // This forceViewport call ensures that content outside the viewport is
      // rendered, otherwise it shows up as grey. Possibly a bug?

        //await Emulation.forceViewport({x: 0, y: 0, scale: 1});

```
https://github.com/cyrus-and/chrome-remote-interface/issues/203

## selectorを変えてみる
selector: 'body' だと高さが900
selector: 'div#wrap' だと高さが3000

## リンク

0.24.2でforceViewportが機能しない
https://github.com/cyrus-and/chrome-remote-interface/issues/203

chrome-launcher ならうまくいくのかな
http://var.blog.jp/archives/71651626.html

GoogleChrome/puppeteer を使いましょう
https://github.com/schnerd/chrome-headless-screenshots/pull/13

## 参考

chrome
https://chromedevtools.github.io/devtools-protocol/tot/DOM/
STM32F103の開発環境

BluePill とか、そのバリエーションとしての RobotDyn ボードとか。

これを開発するための環境について。
ほとんど未検証だけれど、備忘録的に。

# Arduino系


## MAPLE IDE
http://docs.leaflabs.com/static.leaflabs.com/pub/leaflabs/maple-docs/0.0.12/maple-ide-install.html

Blue Pill は元々 LeafLabs 社の Maple Mini からの派生。Maple シリーズは
独自のライブラリを使用して、Arduinoフォークした開発環境でプログラムできるようになっていた。

Maple プロジェクトはクローズしたがドキュメントやライブラリなどはCC-BY-SA2.0で公開。現在でも使用できる。

> As of March 2015, the LeafLabs Maple line and the libmaple library are end-of-life and no longer supported by LeafLabs. The design files for Maple and Maple Mini will remain available on GitHub, under a CC-BY-SA 2.0 license, for anyone who wants to recreate or reimagine these boards.


## Arduino_STM32
rogerclarkmelbourne/Arduino_STM32
https://github.com/rogerclarkmelbourne/Arduino_STM32

Maple lib をベースにしたもの。現在のところこれが一番安定しているらしく、Arduino開発環境で使うにはファーストチョイス。

STM32Duino という名前でも呼ばれているが・・・
> PRIMARY SUPPORT FORUM: http://www.stm32duino.com/

次に述べる STM32Duino と名前が一緒なので理解が大混乱！！


## STM32duino

Arduino core for STM32 MCUs
https://github.com/stm32duino


facebookの書込から
> 「STM32duino」の整備にはST社も支援しているので今後はこちらが主流になるでしょうね。
両者の違いは「STM32duino」はST社のHALベース、「Arduino_STM32」はLeafLabs社独自のAPIがベース。当然「STM32duino」の方がメジャーかつ汎用的です。
「STM32duino」の整備にはST社も支援しているので今後はこちらが主流になるでしょうね。


## STM32GENERIC

danieleff/STM32GENERIC
 https://github.com/danieleff/STM32GENERIC
ドキュメントが充実らしい。


# その他のホビー用開発環境

## TOYOSHIKI Tiny BASIC for Arduino STM32
https://github.com/Tamakichi/ttbasic_arduino
Arduino開発環境で作るBASIC環境。


## mbed
https://os.mbed.com/platforms/ST-Nucleo-F103RB/
NUCLEO-F103RB
が使える。



## mbed + platformio
STM32F103 C8 T6 の安いボードでLチカ (platformio + mbed)
https://lowreal.net/2016/04/14/3
GDBなども使えます

# お仕事で使う用
## CodeBench
Lite Edition は無料で使用できる
https://www.mentor.com/embedded-software/codesourcery

## GNU Arm Embedded Toolchain
https://developer.arm.com/open-source/gnu-toolchain/gnu-rm/downloads
eclispe と組み合わせて使うといいようだ。

## Sytem Workbench for STM32
http://www.openstm32.org/HomePage
無償、クローズドソース、　Windows/OSX/Linux対応

## EmBitz!
https://www.embitz.org/
無償　オープンソースっぽい　対応プラットフォームは Windows のみっぽい

## CooCox CoIDE
http://www.coocox.org/
無償　オープンソース　対応プラットフォームは Windows のみっぽい
## Keil MDK-ARM - Microcontroller Development Kit for ARM
http://www2.keil.com/mdk5

MDK-Lite　無償　Product evaluation, small projects, and education. Code size restricted to 32 Kbyte. 
MDK-Essential　有償　For ARM Cortex-M based microcontroller projects. 
MDK-Plus　有償　For Cortex-M, ARM7, ARM9. Includes middleware (IPv4 Networking, USB Device, File System, Graphics). 
MDK-Professional　有償　For Cortex-M, Cortex-A, ARM7, ARM9. Includes middleware (IPv4/IPv6 Networking, USB Host & Device, File System, Graphics, mbed components).

対応プラットフォームは Windows のみっぽい。

## ARM用IAR Embedded Workbench（EWARM）
STM32CubeMXと組み合わせて使います。
有償　対応プラットフォームは Windows のみっぽい。


# その他
以下のページには、そのほか多数の開発環境が紹介されている。
これらのうちどれが STM32F103 に適合するかどうかは？？

「ARM開発環境まとめ」
https://qiita.com/Ted-HM/items/9f1cca2590ada522c021
【JavaScript】Date.parse()がブラウザ環境によってはNaN（invalid date）を返す理由

vue.jsでカウントダウンタイマーを作っていた時に起こった出来事。

ざっくり説明すると
DBに登録しているカウントダウンの終了日付をView側のカスタムコンポーネントに渡す
渡された日付は`Date.parse()`によって時間値に変換
現在日付も取得し時間値に変換、終了日付までの残り時間を計算していた



```html:
<countdown date="2017-10-15 23:59:59"></countdown>
```

しかし、デスクトップのブラウザ環境では動作したのですが、モバイルのブラウザ環境（※）では
**NaN**（invalid date）を返す・・・あれ？
※iOSのブラウザ環境

###原因
どうやら、`Date.parse()`に渡す日付文字列が間違っていたみたい
ドキュメントには以下のように書いてありました

>**引数：dateString**
RFC2822 または ISO 8601 の日付を表す文字列 (他の書式が使用されることがあるため、結果は期待値にならない可能性があります)。 


**RFC2822またはISO 8601の日付？？？**
普段使っている形式と異なり、見慣れていないので戸惑う・・・
※`new Date()`も同様の動作


この日付文字列の形式がブラウザ依存でサポートしていない場合があるみたい
iOSのブラウザ環境だと ``2017-10-15 23:59:59`` のようなハイフン区切りをサポートしていなくて
invalid dateでエラーをはいていた
デスクトップのブラウザ環境だと大丈夫だったので厄介ですね・・・。


###対処法
DBから取得したdatetime型の終了日付を
RFC2822またはISO 8601形式に変換してView側に渡してあげれば正常に動作しました。

```html:ISO8601形式
<countdown date="2017-10-15T23:59:59+09:00"></countdown>
```


```html:RFC2822形式
<countdown date="Sun, 15 Oct 2017 23:59:59 +0900"></countdown>
```


###まとめ

`Date.parse()`の日付文字列の解釈は実装依存みたい・・・
形式によっては解析してくれたり、NaNとなる環境もあるみたいなので注意が必要です！
CentOSとDebian GNU Linuxを入手する

# 概要
LPIC(version4.0)取得に向けて環境を準備しようとしたが、ダウンロードで戸惑ったため、メモを残すことにした。

# ISOのダウンロード

## CentOS7.3(x86_64)

http://ftp.riken.jp/Linux/centos/7.3.1611/isos/x86_64/

![image.png](https://qiita-image-store.s3.amazonaws.com/0/184939/da055abd-424b-0aa4-58e3-2102db7be33c.png)

## Debian GNU Linux 7.9(i386)

http://ftp.riken.jp/Linux/debian/debian-cdimage/archive/7.9.0/i386/iso-dvd/


![image.png](https://qiita-image-store.s3.amazonaws.com/0/184939/8e93ae33-fa59-ba48-c15c-b7ad43c85538.png)
pip で MKL にリンクされた numpy, scipy が自動的にインストールされるようにする

先日「conda は Python から openssl から何から何までインストールしてそのくせ conda だけで済むまでに自己完結してないから OS と pip の二重管理を os と conda と pip の三重管理地獄に変えて嫌い、virtualenv-wrapper があれば十分」と同僚に話したところ、「pip で numpy を入れると OpenBLAS にリンクされたものが入って、conda で入る MKL にリンクされたものより遅い」と言われました。自動コンパイルしましょう。

Linux を対象としていますが、OS X や Windows などでも同じことは可能なはずです。

基本的には [unnounnoさんの投稿](https://qiita.com/unnonouno/items/8ab453a1868d77a93679) と同じで、それに追加で `pip.conf` を書いて numpy, scipy のバイナリパッケージを無効化するだけです。

# MKL のインストール
https://software.intel.com/en-us/mkl から "Free Download" をクリック、適当にメールアドレスなどを入力して `l_mkl_2018.0.128.tgz`（投稿時の最新版）をダウンロードします。これを展開して `./install.sh` を実行すると、標準では `/opt/intel` 以下に MKL がインストールされます。以前はレジストレーションキーなどが求められたようですが、今は不要です。

```bash
export LD_LIBRARY_PATH="/opt/intel/mkl/lib/intel64:/opt/intel/lib/intel64:$LD_LIBRARY_PATH"
```

と `.zprofile` なり `.bash_profile` なり（あるいは必要なら `/etc/profile.d` 以下なり `/etc/ld.so.conf.d` 以下なり）に書いて、`LD_LIBRARY_PATH` を通します。

# numpy と scipy のビルド設定

numpy と scipy はビルド時に `~/.numpy-site.cfg` を読みに行きます。そこに以下のように書くと MKL にリンクするよう設定されます。

```ini
[mkl]
library_dirs = /opt/intel/mkl/lib/intel64
include_dirs = /opt/intel/mkl/include
mkl_libs = mkl_rt
lapack_libs =
```

# pip の設定
上記の設定だけでは pip で numpy や scipy をインストールしたときにバイナリパッケージが自動的に選択されてしまいます。肝要なのは、numpy, scipy に限りバイナリパッケージを無効化することです。

これは `~/.config/pip/pip.conf` （あるいは `XDG_CONFIG_HOME` を設定している場合 `"$XDG_CONFIG_HOME/pip/pip.conf"`）に以下の記述をすることで実現されます。

```ini
[install]
no-binary = numpy,scipy

[wheel]
no-binary = numpy,scipy
```

この設定が意味するのは、「`pip install` あるいは `pip wheel` 時に自動的に `--no-binary numpy,scipy` オプションを付けなさい」ということです。こうすると、numpy と scipy のインストール時に限りバイナリパッケージを無効化し、毎回手元でコンパイルさせるようにすることができます。

# 制限
この設定だとコンパイル済みの numpy, scipy はキャッシュされず、インストールする度にコンパイルされることになります。numpy のコンパイルは一分しないくらいなので大して困らないですが、scipy は五分くらい待たされるので人によってはストレスになります。

ワークアラウンドとして、`pip wheel scipy` をして `scipy` のコンパイル済み wheel を手元で作っておくことができます。scipy のインストールが必要な場合、`pip install scipy-0.19.1-cp36-cp36m-linux_x86_64.whl`（ファイル名は OS やバージョンなどにより変わります）とすれば手元でコンパイルされたパッケージがすぐに入ります。

# 余談
conda 嫌いと言いつつも、わたし自身 conda を使うプロジェクトでの開発もしているので使わざるを得ないです。conda の `bin` をログイン時には `PATH` に入れずに、 `.zshrc` に

```bash
alias yanaconda="source $HOME/miniconda3/bin/activate"
```

と書いて `yanaconda` を実行することで明示的に conda の世界に遷移するようにすることで快適になりました。
Windows 10S

# Windows Sとは
Microsoft社が提供する新しいエディション。セキュリティとパフォーマンスに特化したエディション。

## 使用可能なアプリ

+ Windowsストアアプリ

## Windows 10 エディションの比較
| | Windows 10 Home | Windows 10 S | Windows 10 Pro |
|:-:|:-:|:-:|:-:|
|Windows機能の利用 | 最小限 | なし | すべての機能 |
|Winアプリケーションの使用 | ○| × | ○ |
|Windows ストアアプリの使用 |○ |○ |○ |

# 考察
Microsoft社はしばしばWindows RTの大失敗をド忘れしてる気がする。
Office2016って完全にUWP化してるんだっけ？

# 参考
https://www.microsoft.com/ja-jp/windows/windows-10-s
Atom の language に CWL を追加する

# 概要

Atom で [Common Workflow Language](http://www.commonwl.org/) を書くためのシンタックスハイライタがほしかったのだが、みつからなかったので、とりあえず作り始めてみた。

* [language-cwl](https://atom.io/packages/language-cwl/)

単純な機能を作って、そこから、できることならば色々やってみたい。

* format で、EDAMが使われていたら、何形式なのかを表示するとか
* 入力と出力のアシストとか
* 使える index を保管するとか

# 準備

`.atom/packages/` に　`language-cwl` というディレクトを作った。

atom を reload すると、よみこまれるようだ

## 開発版について

開発版のパッケージを入れるディレクトリも別に作ることができる。
これについては、あとで書く予定


```
atom -d
```

で、起動すると開発版のパッケージがつかわれるようになる


# language-cwl を作るに当たって

まずは、雛形のディレクトリをつくった

```
.
├── CHANGELOG.md
├── grammars
│   └── cwl.cson
├── LICENSE
├── package.json
└── README.md
```

## package.json

```json
{
  "name": "language-cwl",
  "version": "0.1.0",
  "description": "CWL support in Atom",
  "keywords": [
  ],
  "repository": {
    "type": "git",
    "url": "https://github.com/manabuishii/language-cwl"
  },
  "bugs": {
    "url": "https://github.com/manabuishii/language-cwl/issues"
  },
  "license": "MIT",
  "engines": {
    "atom": ">=1.0.0 <2.0.0"
  },
  "dependencies": {
  }
}
```

## grammers/cwl.cson

まずは、コメントアウトにだけ対応。
ただし、クォートの中とかは考えていない。

```
'scopeName': 'source.cwl'
'name': 'CWL'
'fileTypes': ['cwl']
'patterns': [
  {
    # comment
    'match': '#.*$'
    'name': 'comment.line.number-sign.cwl'
  }
]
```

### 結果

![Screenshot from 2017-09-29 13-27-30.png](https://qiita-image-store.s3.amazonaws.com/0/82011/84189f83-5802-75ca-7c82-028ee0d95103.png)

# キーワードを、ハイライトしたい

まずは、以下のようなものを考えて `cwlVersion` を、ハイライトしたい

```
#!/usr/bin/env cwl-runner
cwlVersion: v1.0
```

![Screenshot from 2017-09-29 15-01-58.png](https://qiita-image-store.s3.amazonaws.com/0/82011/4632857d-fb02-22b9-5f4b-34578e700d82.png)


## grammers/cwl.cson

cwl.json を作った

```
'scopeName': 'source.cwl'
'name': 'CWL'
'fileTypes': ['cwl']
'patterns': [
  {
    # keyword
    'match': '\\b(cwlVersion)\\b'
    'name': 'keyword.control.cwl'
  },
  {
    # comment
    'match': '#.*$'
    'name': 'comment.line.number-sign.cwl'
  }
]
```



### 結果


![Screenshot from 2017-09-29 13-28-58.png](https://qiita-image-store.s3.amazonaws.com/0/82011/b231290f-158a-9a02-1c59-66cd64d6e504.png)
 type(CommandLineTool) などを追加

suppoert.type でいいのかは、また検討する必要があるが、
以下のものを、patternsに追加

```
  {
    # type
    'match': '\\b(CommandLineTool|ExpressionTool|Workflow)\\b'
    'name': 'support.type.cwl'
  }
```

こうすると、別の色で表示してくれるようになった

### 結果





![Screenshot from 2017-09-29 15-01-58.png](https://qiita-image-store.s3.amazonaws.com/0/82011/fc031b28-70a6-d9df-179b-c08cdee6af08.png)


## 開発版自分メモ

Atom リロードは、コマンドパレットから、`Window Reload`

# スコープを確認する

カーソル位置のスコープを確認する
コマンドとしては `Editor: Log cursor scope`

マックだと、デフォルトのキーバインドが、割り当てられているようだが、
Linuxや、Windows だと、割り当てられていないかもしれない。

以下、実行画面 `Scopes at Cursor` のところが、現在のカーソル位置のスコープ

![Screenshot from 2018-01-16 16-40-13.png](https://qiita-image-store.s3.amazonaws.com/0/82011/2ec62e45-a753-658f-54fc-074de9f870d9.png)
[Unity] 4枚のテクスチャからNormalMapを生成する処理をShaderForgeで試す

#概要
現実世界のものをデジタルカメラで撮影して
そこからノーマルマップを起こすとき
4方向のライトをあてた4枚の画像から作ることがある。

(撮影方法等の参考:http://cgcompo.blog134.fc2.com/blog-entry-63.html)

この4枚のテクスチャからノーマルマップを生成する処理をShaderForgeで実装してみる。

ただし、サンプルの画像、それから生成される正しいノーマルマップが手元にないので検証はできてません。

また、ノーマルマップの合成はリアルタイム処理でやる必要はほとんどの場合ありません。
動作を確認しやすいためUnity環境でテストしました。

#環境
Unity5.5.2p4
ShaderForge v1.36

#実装
4枚のテクスチャは、それぞれ上下左右から当てられたライトの画像となる。
これらはグレースケールに変換されて、その画像から合成する。

左からあたったライトの画像で、輝度が高い(白い)ところは面が左に向いていると仮定する。
このときノーマルマップのRの値は0になる。
右の場合は面が右に向いているのでRが1になる。

この2つの画像を合成するときオーバレイの処理で合成する。
(https://blender.jp/modules/newbb/viewtopic.php?viewmode=flat&topic_id=174&forum=4)

オーバレイの式は

> 明度の高い部分と低い部分の鮮やかさが上がります。彩かさが上がるため、画像全体にかけると一見キレイになったかのような錯覚に陥りやすいので、注意しましょう。錯覚です。
> 全体の色調を統一するためや塗り斑、主線に色を付けるためなどによく利用されています。
> 計算式は以下のようになります。重ねられるレイヤー（下のレイヤー）の中間値で乗算とスクリーンを使い分けているようです。
> Pa < 128 の場合
> Pn = Pa * Pb * 2 / 255
> Pa >= 128 の場合
> Pn = 2 * (Pa + Pb - Pa * Pb / 255) - 255
> です。
> 
> Pn、Pa、Pb を0～1の範囲とする場合、
> Pa < 0.5のとき
> Pn = Pa * Pb * 2
> Pa >= 0.5のとき
> Pn = 1 - 2 * ( 1 - Pa ) * ( 1 - Pb )
> となります。

(https://ofo.jp/osakana/cgtips/blendmode.phtml#overlay)

これらを踏まえて実装する。
実装内容は以下の通り。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/36154/5fa46097-5072-d634-10c2-e0e3b09d71fe.png)

Unityでの実行結果。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/36154/e481f778-3e7b-c6d4-1af0-176f79ec9df0.png)

左がノーマルマップをそのまま表示したもの。
右が合成されたノーマルマップをもとにライティングした結果。

どちらもQuadで平面のもの。
しかしノーマルマップによって凹凸のライティングが処理されている。

#課題点
オーバレイの計算式で「0.5未満のときは」という条件式があったが
これは必要なく「Pn = 1 - 2 * ( 1 - Pa ) * ( 1 - Pb )」で求まる気がする。

Zの値はカメラのレンズからライトを当てたときの明暗になると思うけども
物理的にそれは不可能なので、実際はどうやって処理しているのか？？？

検証ができないのでテスト用のサンプルデータが欲しい！


#感想
できあがったノーマルマップだけではSprite Lampのようなコントラストの強いライト処理にはならない。
まよわずSprite Lampを買おう！

ノーマルマップの合成は実行できたとしてもDiffuseマップって
カメラでどうやって撮影するんでしょうか？
ライトを上下左右以外にも前方向から当てるでしょうか？謎
EXCEL VBA －文字列の高速結合

#EXCEL VBA 文字列の連結について
　EXCEL VBAでよく問題になるのが文字列の結合です。
　少量なら問題ないですが、CSVなどを出力するプログラムなどで大量の文字を結合するようになると処理が極端に遅くなります。
　
#文字列結合の高速化
　文字列結合の高速化方法についての詳細は他のブログなどでも紹介されているので、ここでは細かいことは省きます。
　要はメモリをあらかじめ確保しておき、Midステートメントを使用し、確保したメモリに文字を埋め込むという作業をしています。

　EXCEL VBAで大量の文字を扱うときは下記のStringBuilderクラスをインポートして使用して下さい。
　

```vbnet:StringBuilder.cls
Option Explicit

Private m_len As Long '実際の文字列の長さ
Private m_bufLen As Long 'バッファーの長さ
Private m_buffer As String 'バッファー
Private m_bufPos As Long 'バッファーの書き込み位置

Public Function ToString() As String
    ToString = Left$(m_buffer, m_bufPos)
End Function

Private Sub Class_Initialize()
    m_len = 0
    m_bufLen = 0
    m_bufPos = 0
End Sub

Public Sub AppendLine(app As String)
    Append app & vbCrLf
End Sub

Public Sub Append(app As String)
    Dim appLen As Long
    Dim appBufLen As Long
    
    appLen = Len(app)
    
    '-- バッファ管理
    If (m_bufLen < m_bufPos + appLen) Then
        appBufLen = (appLen \ 4096) * 4096 + 4096
        m_bufLen = m_bufLen + appBufLen
        m_buffer = m_buffer & String(appBufLen, Chr(0))
    End If
    
    '-- 文字列挿入
    Mid$(m_buffer, m_bufPos + 1, appLen) = app
    m_bufPos = m_bufPos + appLen

End Sub


```
EXCEL VBA －Range型について

#Range型について
この記事ではEXCEL VBAにおいて頻繁に使用するRange型の扱いについて記述する。

#Range型の宣言
Range型を宣言します。
※Range型の変数を宣言せず、Sheet1.Cells(1,1).??と記入するとメンバー候補は表示されません。
　Sheet1.Cells(1,1)をRange変数に代入してから使用するとメンバーの候補が表示されるようになります。


```vbnet:range型宣言
Dim a As Range

Set a = Sheet1.Cells(1,1)
```

#様々なRange型の取得方法
##引数としてRange型を取得
計算式に記述され、対象セル範囲を引数として受け取る。

例：
![image.png](https://qiita-image-store.s3.amazonaws.com/0/191429/3aa11ba2-c344-3dda-3837-87912221492a.png)

```vbnet:
Function Test(a As Range)
    Test = a.Cells(1, 1)
End Function
```

##選択されているRangeを取得
セルが選択されている範囲をRangeとして取得します。
Selectionのタイプ名がRangeか判定して処理を行ってください。

```vbnet:
Sub Macro1()
    Dim a As Range
    
    If TypeName(Selection) <> "Range" Then
        Exit Sub
    End If
    
    Set a = Selection
End Sub
```
##名前からRangeを取得
セルに付けられた名前を元にRangeを取得します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/191429/bb7808a9-8642-e1d6-9c63-64e1eb227096.png)

```vbnet:
Sub Macro1()
    Dim a As Range
    Dim shtAct As Worksheet
    
    Set shtAct = ActiveSheet
    
    Set a = shtAct.Range("テスト")
    
End Sub
```

#Rangeの参照範囲の確認
Range.Addressに参照している範囲が格納されています。

```vbnet:
Sub Macro1()
    Dim a As Range
    Dim shtAct As Worksheet
    
    Set shtAct = ActiveSheet
    
    Set a = shtAct.Range("テスト")

    Debug.Print a.Address
End Sub
```

結果:
![image.png](https://qiita-image-store.s3.amazonaws.com/0/191429/7fe2cb93-cca6-e041-6a88-3d4eae87bcd3.png)

#WorksheetのUsedRangeの扱いについて
UsedRangeは保存済みの使用範囲を取得するのに便利でよく使いますが、気をつけないといけないこととがあります。
使用範囲がCell(1,1)から始まっていない場合があり、そうした時、UsedRange(1,1)の位置はWorksheet.Cells(1,1)と同じ位置ではなくなってしまいます。
そのため、基点を基準として考えていたコードにバグが発生する要員となります。

この問題を解決するにはいくつかの方法があります。
・EXCELシートの使用範囲開始位置が必ずWorksheet.Cells(1,1)となるよう修正し、その前提で処理を行う
・UsedRangeを取得する際に下記のコードで必ず記入するようにし、Worksheet.Cells(1,1)が基点となるようにする

```vbnet:
Sub Macro1()
    Dim a As Range
    Dim shtAct As Worksheet
    
    Set shtAct = ActiveSheet
    
    Set a = shtAct.Range(shtAct.Cells(1, 1), shtAct.UsedRange(shtAct.UsedRange.Rows.Count, shtAct.UsedRange.Columns.Count))
    
End Sub
```

#Rangeへの高速取得、代入
Rangeへの値の取得、代入は配列を使用したほうが早い。
データ件数が少ない場合は考慮しなくてもよいが、高速化したい場合は覚えておくと便利です。

RangeオブジェクトをVariant型のオブジェクトに代入すると多次元配列としてコピーされます。
Variantオブジェクトの値を編集し、再度、Rangeオブジェクトに格納すると値のみ更新されます。
※オブジェクトをセットするわけではないので、Set は不要

```vbnet:
Sub Macro1()
    Dim a As Range
    Dim shtAct As Worksheet
    Dim vals As Variant
    
    Set shtAct = ActiveSheet
    
    Set a = shtAct.Range(shtAct.Cells(1, 1), shtAct.Cells(10, 10))
    
    vals = a
    
    vals(2, 2) = "10"
    
    a = vals
End Sub
```