OmniAICreator/Qiita-1.07M huggingface dataset:
AWS SES  Configuration Set を利用した Https カスタムドメイン でのトラッキング



# SESで Configuration Set を利用した HTTPS カスタムドメイン でのトラッキング

## 今回紹介するケース

SESの設定や、Configuration Setの記事は沢山あるので割愛して、

「SESで Configuration Set を利用した `Https` カスタムドメイン でのトラッキング」

の設定例です。

### ちなみに
「SESで Configuration Set を利用したトラッキング」は[こちら](https://dev.classmethod.jp/cloud/aws/amazon-ses-open-click-tracking/)が詳しいです
「SESで Configuration Set を利用した `Http` カスタムドメイン でのトラッキング」は[こちら](https://dev.classmethod.jp/cloud/aws/amazon-ses-tracking-custom-domain/)が詳しいです

### 公式ドキュメント通りに設定しても上手くいかない

Trackingイベントには下記の種類があります。

- Send
- Reject
- Delivery
- Bounce
- Complaint
- Click
- Open
- Rendering Failure

今回の設定は HttpsなURLの `Click` イベントをTrackingしたい時に役立ちます。
公式のドキュメント（[こちら](https://docs.aws.amazon.com/ja_jp/ses/latest/DeveloperGuide/configure-custom-open-click-domains.html)）の通りにやってもTrackingできませんでした。

# SESで Configuration Set を利用した Https カスタムドメイン でのトラッキング
#### 設定例
* ドメイン名：domain.jp
* トラッキングDNS：mailtracking.domain.jp
* リージョン：米国東部（バージニア北部）
    *  SESは東京リージョン無い

### HTTPSカスタムドメインを利用する際に必要な設定
#### Amazon Certificate Manager
* バージニア北部リージョンに証明書が必要(*.domain.jpで取るのが吉)    
<img width="331" alt="スクリーンショット 2018-10-18 20.00.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/164563/eb456a0c-0e0f-8f57-abdf-07a9aec712d7.png">

#### CloudFront
* mailtracking.domain.jpを受けるDistributionsを新規で作成する必要があります

##### originの設定
<img width="489" alt="スクリーンショット 2018-10-18 20.08.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/164563/532fa674-a55a-1fec-0790-1e1e239b9796.png">

* 注意する点
    * Origin Domain Name は `http://r.us-east-1.awstrack.me/` を入力する（とr.us-east-1.awstrack.meと表示されフォワードの設定ができる）
    * Origin Protocol Policy　は  `Match Viewer` を選択する
        * ここがないとClickのトラッキングの時にlinkTagsが送られてきません

##### behaviorの設定

<img width="544" alt="スクリーンショット 2018-10-18 20.11.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/164563/35a873e1-22a1-8765-6881-63c6803fee47.png">
<img width="574" alt="スクリーンショット 2018-10-18 20.11.37.png" src="https://qiita-image-store.s3.amazonaws.com/0/164563/c3796889-af9f-95c4-b332-4dc1dad926d2.png">

* 注意する点
    * Viewer Protocol Policy は `Redirect HTTP to HTTPS` を選択する
    * Cache Based on Selected Request Headers は `ALL` を選択する
    * Query String Forwarding and Caching は `Forward all, cache based on all` を選択する

#### Route53
mailtracing用のDNS作成
<img width="344" alt="qiita1.png" src="https://qiita-image-store.s3.amazonaws.com/0/164563/34bc878e-a5a7-353b-09a7-55489b08f8ab.png">

#### SES Configuration Set の Destination
カスタムドメインを設定する
<img width="628" alt="qiita2.png" src="https://qiita-image-store.s3.amazonaws.com/0/164563/712e66da-153b-0783-4670-7f11839b6d6d.png">


これでOK


# 余談）Sendgridと比較してみた

## SESのメリット
* 安い

#### 料金比較

| 月料金(300万通の時) | $ |    円    |
|:-----------------|------------------:|------------------:|
| SES | $297（約） |¥32,000（約）|
| Sendgrid|- |¥150,000（約）|

* Sendgridの一番大きいプランを利用しているなら月額12万円も違うよ

## SESのデメリット
* RFCに従っていないメールアドレスが送信できない（可能性がある フィルタが公開されていないので）
* ダッシュボード機能が提供されていないので自分で可視化する必要がある
    * これってデータ系エンジニアにとってはメリットじゃないか？（生トラッキングデータが見れる）
* BounceとComplaintを自分で管理しないといけない
    * これも良く考えたら、自分で管理するのが筋じゃない？
【Rails】7つのアクションとそれぞれの役割

７つのアクションって、７人の侍みたいでかっこいいですよね。
Railsで何かプロジェクトを立てる際に基本となるとても重要な概念です。
「７つ」と厳密に定義されていることを今まで知らなかったので、以下にまとめます。

## そもそもアクションとは

controllerで定義されるメソッドを指してアクションと呼びます。

```sample.controller.rb
def index
〜
〜
end
```
こういうやつです。
他にも、routeファイルでは

```routes.rb
 get "URL/〜/"　     => "コントローラ名#アクション名"
 ＜例＞
 get "users/index" => "users#index"
```
左のURLでリクエストを受けたら、右のコントローラの中の、このアクションを見に行くよと書かれていたりします。

## 7つのアクション
|アクション名|役割|
|---|---|
|index|リソースの一覧を表示する|
|new|リソースを新規作成する|
|create|リソースを新規作成して追加(保存)する|
|edit|リソースを更新するためのフォームを作成する|
|show|レコードの内容を表示する|
|update|リソースを更新する|
|destroy|リソースを削除する|

routesファイルに記述する際に、`resource`メソッドを記述することで
この７つのアクションをスマートに記述することができたり、
apiモードでは、newとeditが省略されて5つのアクションになったりします。

`resource`メソッドの書き方とapiモードについては、
別の記事で改めてまとめようと思います。

## 参考サイト
Railsのリソースの7つのアクション
https://code-examples-ja.hateblo.jp/entry/2014/02/22/Rails%E3%81%AE%E3%83%AA%E3%82%BD%E3%83%BC%E3%82%B9%E3%81%AE7%E3%81%A4%E3%81%AE%E3%82%A2%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3

newとcreateの違い
https://qiita.com/Kaisyou/items/7d609787d4ae8c2425a0

new,save,createアクションそれぞれの使い分け
https://teratail.com/questions/20276
openFrameworks 0.10.0をXcode 10.0でビルドした時に出るエラーをどうにかする

# 久々にopenFrameworksを使おうとしたらハマった
転職して新しいMacに変わり、openFrameworksを使えるようにしようとしたら軽くハマったので、同じようなことが再び起きないようにメモを残します。
#### そのときの環境
- MacOS 10.13.6
- Xcode 10.0
- openFrameworks 0.10.0

## "The i386 architecture is deprecated."というエラーが出る
試しにoFの`examples/graphics/graphicsExample`をビルドしたところ、以下のようなエラーメッセージが出ました。

```

Showing Recent Messages Build system information error: 
The i386 architecture is deprecated. 
You should update your ARCHS build setting to remove the i386 architecture. 
(in target 'openFrameworks')
```

32-bitはもうサポートしていないということらしいので、`openFrameworksLib.xcodeproj`のBuild Settingを、oFフォーラムの以下の記事に書いてあるとおり変更することで解消しました。

#### XCode 10.0 build errors
https://forum.openframeworks.cc/t/xcode-10-0-build-errors/30447/6

こんなかんじ。
<img width="742" alt="Xcode001.png" src="https://qiita-image-store.s3.amazonaws.com/0/63707/a4af0203-13f8-ece9-f5ee-6c8ab2a5e068.png">

## "framework not found QuickTime"というエラーが出る
上のエラーが解消したら、今度は以下のようなエラーが出るようになりました。

```
framework not found QuickTime
error: linker command failed with exit code 1 (use -v to see invocation)
```

知らないうちにQuickTimeなくなった？
これも検索したら、oFフォーラムに解決策が書いてありました。

#### /clang:-1: linker command failed with exit code 1 (use -v to see invocation)
https://forum.openframeworks.cc/t/clang-linker-command-failed-with-exit-code-1-use-v-to-see-invocation/30700/4

`CoreOF.config`に書いてある`-framework QuickTime`の記述を削除すればOKのようです。


## ビルド通った
上記の2つを解消することでビルドできるようになりました。
（ここまで書いてみて、以前も同じことでハマったような気がしてきた・・・。）
KEN_ALL.CSV から郵便番号データを手軽に作る

やっかいな KEN_ALL.CSVと JIGYOSYO.CSV を使って郵便番号データを手軽に作る方法です。

### ken-all コマンドのインストール

郵便番号データを加工するコマンドをインストール

```
$ go get github.com/inouet/ken-all
```
(go が入ってない場合は、brew install goしておく)

### データ生成

下記コマンドの実行すると、KEN_ALL.CSV とJIGYOSYO.CSV がダウンロードされ、1つの郵便番号データが生成されます。

```
$ cd $GOPATH/src/github.com/inouet/ken-all

$ ./script/make-zip -o /tmp/ken-all.tsv

# 確認

$ head -n 2 /tmp/ken-all.tsv
0600000	1	北海道	札幌市中央区				10
0640941	1	北海道	札幌市中央区	旭ケ丘			10

```

### テーブル作成

mysqlの場合

```
$ mysql -u user -p db_name < example/zip_code.mysql.sql
```

sqliteの場合

```
$ sqlite3 zip.db <  example/zip_code.sqlite.sql
```

### データのインポート

mysqlの場合

```
mysql> load data infile '/tmp/ken-all.tsv' into table zip_code;
```

sqliteの場合

```
$ sqlite3 zip.db
sqlite> .separator "\t"
sqlite> .import /tmp/ken-all.tsv zip_code
```

### 確認


mysqlの場合

```
mysql> select * from zip_code where zip_code in ('1066118', '1008792');
+----------+----------+-----------+--------------+----------------------------------------------+--------+---------------------------+-------------+
| zip_code | zip_type | pref      | city         | town                                         | street | name                      | update_code |
+----------+----------+-----------+--------------+----------------------------------------------+--------+---------------------------+-------------+
| 1066118  |        1 | 東京都    | 港区         | 六本木六本木ヒルズ森タワー18階               |        |                           |          10 |
| 1008792  |        2 | 東京都    | 千代田区     | 大手町                                       | 2-3-1  | 日本郵便 株式会社         |          20 |
+----------+----------+-----------+--------------+----------------------------------------------+--------+---------------------------+-------------+
```


sqliteの場合

```
sqlite> .mode column
sqlite> select * from zip_code where zip_code in ('1066118', '1008792');

zip_code    zip_type    pref        city        town              street      name        update_code
----------  ----------  ----------  ----------  ----------------  ----------  ----------  -----------
1066118     1           東京都         港区          六本木六本木ヒルズ森タワー18階                          10
1008792     2           東京都         千代田区        大手町               2-3-1       日本郵便 株式会社   20
```

おしまい。
（今度こそ）Python with Docker @Pythonもくもく会　2018/10/18

#はじめに
今回の記事は前回の記事の続きとなっています。

前回の記事（読む必要なし）
https://qiita.com/yukikaze/items/5c4868f71c841a1cc9de

#概要
Docker上でPython環境を構築する。
可能ならばDockerHubにアップロードまで済ます。

#調査

まず、attachコマンドについて整理しておきます。

 - [Dockerコンテナ作成とコンテナポートをバインドして外部接続するために](https://academy.gmocloud.com/docker/20151126/1013)
 - [Dockerコンテナの起動と停止、接続と抜け方を知ろう～attach/start/exitコマンド～](https://academy.gmocloud.com/docker/20151126/948)
 - [Dockerコンテナの停止と一覧表示の見方を知ろう～stop/psコマンド～](https://academy.gmocloud.com/docker/20151126/961)
 - [Dockerイメージ作成とコンテナ作成について知ろう～commitコマンド～](https://academy.gmocloud.com/docker/20151126/964)

へーattachだけじゃないんですね。

###dockerコマンドまとめ

- ps : 実行中コンテナの一覧
- attach : 実行中コンテナへの入出力接続
- Ctrl ＋ P → Ctrl ＋ Q : 実行させたままコンテナから離脱
- exit : 処理を終了して離脱
- ps -a : コンテナ一覧
- start : コンテナの起動
- run : コンテナの作成・起動
- stop : 起動中のコンテナの停止
- commit : イメージの新規作成

#今度こそ実装！

```terminal
root@mino-VirtualBox:~# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                  PORTS               NAMES
09eaf3b646bd        python:3.6          "python3"           2 days ago          Exited (0) 2 days ago                       cranky_johnson
```

前回のrunコマンドで、コンテナ作成までは成功しているみたいですね。
では、attachしていきます！

```terminal
root@mino-VirtualBox:~# docker attach 09e
You cannot attach to a stopped container, start it first
```
あら。

```terminal
root@mino-VirtualBox:~# docker start 09e
09e
root@mino-VirtualBox:~# docker attach 09e
>>> 
```
うーん、Pythonのコマンドラインが起動してしまいますね……
つまり、Pythonの仮想環境を内部に持つ仮想環境を用意する必要があります。
つまりOSを一つ仮想化しないといけないわけ…？

ほんまか？

- [Dockerで作る開発環境](https://qiita.com/uronism/items/869692bee3dbbb2582c9)
- [docker コンテナで python 開発](https://qiita.com/m3y/items/bffd2c1f3727105f4886)

どうやら、dockerfileなるものを触らねばならぬようですな。

あれ？　そもそもVM立ててるのにdocker作る意味って……^^;


ここで時間切れ。

#参考

- [Markdown記法 チートシート](https://qiita.com/Qiita/items/c686397e4a0f4f11683d)
- [Dockerコンテナ作成とコンテナポートをバインドして外部接続するために](https://academy.gmocloud.com/docker/20151126/1013)
- [Dockerコンテナの起動と停止、接続と抜け方を知ろう～attach/start/exitコマンド～](https://academy.gmocloud.com/docker/20151126/948)
- [Dockerコンテナの停止と一覧表示の見方を知ろう～stop/psコマンド～](https://academy.gmocloud.com/docker/20151126/961)
- [Dockerイメージ作成とコンテナ作成について知ろう～commitコマンド～](https://academy.gmocloud.com/docker/20151126/964)

#次回

次回のもくもく会は10/20(土)です！
(随時更新) ビジネスに使える確率論まとめ


#はじめに
私は自分の会社が成功したら数学科に入り直すのが目標ですが、
その際に確率論を研究したいと思っています。
日々のビジネス意思決定は、
確率論をどう上手に使うかによって結果のインパクトが大きく変わって来ます。
私の持論では、全てのビジネスパーソンにとって一番重要なのは確率論だと思っています。
AIも、予測や分類を確率コンセプトで実施するので、確率論の要素が多分に入っています。

続きは
Coming Soon
各数学書や、大学講義資料のサマリーをわかりやすくまとめていきたいと思います。
ご期待ください。
MySQL5.7  root ユーザのパスワードとログイン

## MySQL5.7 root ユーザのパスワードとログイン
Ubuntu18 で `sudo apt install mysql-server` を実行するとパスワードを設定することなくインストールが終了する  
どうやら MySQL5.7 では root のパスワードは自動で設定されるらしいので  
  
```
$ sudo mysql_secure_installation
```
  
を実行し以下を設定する  

- root ユーザーのパスワードの変更  
- VALIDATE PASSWORD プラグインのインストール
-  ポリシーに沿った root ユーザーパスワードの設定 (VALIDATE PASSWORD プラグインをインストールした場合)
- anonymous ユーザーの削除
- リモートホストから root ユーザーでの可否
- testデータベースの削除 (存在する場合)
  
さらに `sudo` をつけないと MySQL へログインできないので一度 `sudo` つきで MySQL にログイン後に  
  
```
mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_password';
```
  
して  
  
```
mysql> FLUSH PRIVILEGES;
```
  
これで `sudo` なしで MySQL にログインできるようになる
macにpython環境作る

備忘録的に置いておく。

brewでpyenv入れる
https://qiita.com/1000ch/items/93841f76ea52551b6a97

```
$ brew install pyenv

$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.zshrc
$ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.zshrc
$ echo 'eval "$(pyenv init -)"' >> ~/.zshrc
```


pyenvでpython入れる

```
$ pyenv install --list
$ pyenv install 00000
# あとrehashとかetc
```

pipでグローバルに入れるのはやばいぽいので、virtualenv入れて、仮想環境でインストールするのが良いらしい。

```
$ pip install virtualenv
$ virtualenv myenv
$ cd myenv
$ source bin/activate
```

https://virtualenv.pypa.io/en/stable/userguide/


---

Scrapy入れる

virtualenvの中に入って、pipで入れる。


### ref
python3を使うのは、こっちでも良さそう。
https://play.kikagaku.co.jp/src/00_mac.html
VirtualBoxのホストキーを変更する

## 概要

VirtualBoxには，仮想マシン（ゲスト側）を立ち上げているときに，元の環境（ホスト側）の操作に切り替えるためのホストキーという特殊なキーが用意されています．
ところがこれがMac版VirtualBoxの初期設定では「左commandキー」という，いかにも頻繁に誤って押してしまいそうなキーに割り当てられています．
また，Windowsでは「右ctrlキー」という，HHKBやFILCOユーザーではそもそも押すことができないキーに割り当てられています．
そのためホストキーを変更する方法を備忘録として残しておこうと思います．

## 方法

メニューバーから，
ファイル→環境設定→入力→仮想マシン
と進んでいき，「ホストキーの組み合わせ」の「ショートカット」を選択して任意のキーを押すとそれがホストキーとして設定されます．
ちなみに僕は「右shiftキー」を割り当てています．
久々のMy SQL

こんばんは！

MySQLに本日は挑戦してみました。

ローカル内で複数検索の応用を

やってみようと思いまずはMySQLからさくせいすることにしました

```
Create database wedding;
```

このような感じで結婚式場検索サイトを

作成するためにデータベースを作りました。

その後、phpmyadminでテーブルを作成しました。

その時に、何かエラーがでましたが

キャプチャを撮り忘れてしまいました。

フォームも作成したのでそちらも載せます。

```html
<!doctype html>
<head>
<title>
式場検索
</title>
</head>
<body>
	<div class="weddingsearch">
		<fieldset>
			<form action="wedding-echo.php" method="POST">
			<p>予    算:<input type="text" name="money" placeholder="予算入力"></p>
			<p>場    所：<input type="text" name="address" placeholder="住所入力"></p>
			<p>式場規模：<input type="text" name="weddingscale" placeholder="式場規模"></p>
			<p class="submit"><input type="submit" value="検索">
			</form>
		</fieldset>



	<footer>
	<p class="footer">Copyright &copy Create to October18 yukitobe</p>
	</footer>

</body>
````
こんな感じで複数入力させて入力したら

データベースに格納されている

データが出力されるような形で

現在考えています。

また、式場登録フォームの作成も考えています。
古いWindowsインストーラで「…パッケージに問題があります…」

# 現象
- Windows7以降で
- 古いWindowsインストーラで
- 「**このwindowsインストーラパッケージには問題があります。このインストールを完了するのに必要なプログラムを実行できませんでした。サポート担当者またはパッケージのベンダに問い合わせてください**」というエラーダイアログメッセージが表示。
- インストーラが正常に動作しない
   - インストールできない
   - 場合によってはアンインストールができない

# 原因
1. 実は、Windows7以降で**古いインストーラ**を実行するには管理者権限が必要。
   - Install sheildの仕様？
2. うっかり通常で実行
2. 一度でも、通常権限でインストーラを実行するとインストーラプロセスが常駐する為、再度「管理者権限で実行」しても、管理者権限として実行されない。
3. 管理者権限で実行しても上手くいかないように見える

# 対応
一度再起動し、管理者権限でインストーラを実行する
#### 注意！
**インストーラを終了させるだけではダメです**。必ず再起動させるか、タスクマネージャでインストーラプロセスを終了させる必要があります。面倒くさいので 再起動が楽でしょう。

# 感想
ネットに落ちてる 他のモジュールもアンインストールというは途中で「再起動」が挟まれるため、**上手く行く操作に見える**。
例: 古いバージョンのiTunes等
Spider作成のテンプレート変更

少しScrapyをいじっていますが、Spider作成時、start_urlsが「http://[パラメータ値]」に設定されます。
※Scrapyのバージョンは1.5.1

```
$ scrapy genspider aaa aaa.com
Created spider 'aaa' using template 'basic' in module:
  myproject.spiders.aaa
```
```python:aaa.py
# -*- coding: utf-8 -*-
import scrapy


class AaaSpider(scrapy.Spider):
    name = 'aaa'
    allowed_domains = ['aaa.com']
    start_urls = ['http://aaa.com/']

    def parse(self, response):
        pass
```

最近は「https://」が一般的？みたいなので、作成時もそれであって欲しい。
ので、直したいと思います。
※まぁ、中をいじるわけだから、そん時に直したら？ではありますが…

## 対応対応

```:テンプレートファイル置き場
[各自設定したどっか]/anaconda/lib/python3.6/site-packages/scrapy/templates/spiders
```
普通にgenspiderした場合、「basic.tmpl」を使用しているようなので、その中身を変更。

```:spider下のファイル
8 -rw-rw-r--  2 hoge  staff  209 10 16 16:40 basic.tmpl
8 -rw-rw-r--  2 hoge  staff  654  7 12 06:14 crawl.tmpl
8 -rw-rw-r--  2 hoge  staff  571  7 12 06:14 csvfeed.tmpl
8 -rw-rw-r--  2 hoge  staff  562  7 12 06:14 xmlfeed.tmpl
```

```:basic.tmpl(こう直したよ)
import scrapy


class $classname(scrapy.Spider):
    name = '$name'
    allowed_domains = ['$domain']
    start_urls = ['https://$domain/']

    def parse(self, response):
        pass
```
※Python3で動かすので先頭行も削除してます。
反映されるか確認

```
$ scrapy genspider bbb bbb.com
Created spider 'bbb' using template 'basic' in module:
  myproject.spiders.bbb
```
```python:bbb.com
import scrapy


class BbbSpider(scrapy.Spider):
    name = 'bbb'
    allowed_domains = ['bbb.com']
    start_urls = ['https://bbb.com/']

    def parse(self, response):
        pass
```

うまくいきました。
わーい

## テンプレートを自作する場合
-tオプションで任意のテンプレートファイルを指定できるので、別途自作したテンプレートを使用もできるようです。

```
scrapy genspider aaa aaa.com -t [テンプレート名]
```
[Python] 並列処理を理解するための前提知識

# はじめに。

Pythonで並列処理を学習し始めたものの、「プロセス」「スレッド」「GIL」の話が出てきて白目になったのでまとめました。


# 用語一覧

|用語  |意味  |
|---|---|
|CPU(プロセッサ)  |PCの脳みそ  |
|CPUコア  |CPUの中核部分|
|マルチプロセッサ  |CPUが複数  |
|マルチコアプロセッサ  |CPUコアが複数 (1CPU内)  |
|プロセス  |実行されたプログラムの実行単位  |
|スレッド  |プロセスを更に細かくした実行単位  |
|コンテキストスイッチ  |CPUが実行しているプロセス/スレッドを切り替える事。  |
|スレッドセーフ  |複数スレッドが同時並行で実行しても問題無い状態の事。  |
|グローバルインタプリタロック(GIL)  |スレッド間のリソース競合を防ぐための排他ロック。(後述)  |
|インタプリタ  |LL言語を逐一コンパイルして実行する事  |
|I/O処理  |Input/Output処理の事<br>HDD,SSDの読み込みや、print等の出力  |
|ライトウェイトプロセス(LWP)  |スレッドを複数並行し実行するためのkernel内の機構。 |

以下、これら用語を用いて説明。

# プロセスとスレッドの話

![](http://image.itmedia.co.jp/ait/articles/0503/12/dt-mthread01_02.gif)
引用：[第1回　マルチスレッドはこんなときに使う (1/2)](http://www.atmarkit.co.jp/ait/articles/0503/12/news025.html)

プロセスとはプログラムの実行単位の事であり、プロセスを立ち上げると実行コード、データ、リソースなどのイメージがメモリ上に展開され、それを呼び出すようになっている。対してスレッドとは1プロセス中に1つもしくは複数のスレッドが含まれており、このスレッドが実際にCPUで実行される単位となる。

各プロセスは固有のメモリを持っており、スレッドはプロセス内のメモリを共有する。つまりメモリの観点から、CPU100%フル活用の場合を除き、コンテキストスイッチのコストはスレッドの方が小さく、マルチプロセスよりもマルチスレッドの方が断然パフォーマンスは高い。

しかし、マルチスレッドの難点として複数のスレッド間で連携をとることが困難である。例えば、1つのグローバル変数と2つのスレッドがあった場合、1つのグローバル変数を各スレッドが意図しないタイミングで書き換え、もう一方で不都合が起きてしまう。いわゆる、スレッドセーフでない場合にこの問題が生じる。また別の例えとして、DBのデッドロックが挙げられる。
Pythonでは、このような状態を避ける方法として、次に説明するグローバルインタプリタロック(GIL)が採用されている。

# グローバルインタプリタロック(GIL)の話

グローバルインタプリタロック(GIL)とは、LL言語(スクリプト言語)のインタプリタのスレッドによって保持されるスレッドセーフでないコードを、他のスレッドと共有して競合を起こしてしまう事を防ぐための排他ロック。つまり、GILを取得している1スレッドだけが、Pythonのコードを実行したりPythonのオブジェクトを操作できる。（Rubyもそんな感じと聞いた。）
故に、インタプリタの1プロセス毎に必ず1つのGILが存在し、GILを持つ言語で書かれたアプリケーションは、完全な並列性を得るために別々のプロセスを持つ必要がある。

GILを採用した際のデメリットとして、マルチプロセッサで実行させた場合、実行できるスレッドが1つに制限されるため、あまり恩寵を受けることが出来ない。また、プロセス生成のオーバーヘッド、メモリリソース、コンテキストスイッチのコストの問題が存在する。
一方で採用した場合のメリットは、言語側の都合によるもので、スレッドセーフでないC言語のライブラリとの結合が容易であるためである。

# threadingとmultiprocessingの話

ここで、具体的にPythonモジュールである「threading」と「multiprocessing」の話に移る。

|モジュール名  |説明  |
|---|---|
|threading  |複数のスレッドを扱うためのモジュール  |
|multiprocessing  |複数のプロセスを扱うためのモジュール  |

今までの説明からわかるように、threadingを使って複数のスレッドに割り振って動かしたとしても、グローバルインタプリタロック(GIL)の制約を受けるため複数スレッドが実行されず、ほぼ意味がない。(ただしI/O処理を除く)

一方でmultiprocessingでは複数のプロセスを立ち上げ、各プロセスでGILを取得した1スレッドが独立しているため、グローバルインタプリタロック(GIL)の問題を回避することができる。よって多少なりコンテキストスイッチ/メモリのコストは掛かるが、通常の処理よりこちらの方が高速に処理することが出来る。


# まとめ

Pythonに限らず、プロセス/スレッドの理解は、他言語や鯖でも密接にかかわる分野なのである程度理解できていないとヤバい。（僕のように）
また、様々な文献から得た知識を繋ぎ合わせた程度でまだまだ理解が浅い故、今後も適宜勉強する必要があると同時に、コンパイル言語も学習すると良いのかなと感じた。

## 参考文献

[マルチスレッド処理を理解しよう(前編)](https://news.mynavi.jp/article/python-32/)
[マルチスレッド処理を理解しよう(後編)](https://news.mynavi.jp/article/python-33/)
[Pythonの並列処理・並行処理のための標準モジュールの比較](https://minus9d.hatenablog.com/entry/2017/10/26/231241)
[グローバルインタプリタロック(GIL)とは](https://hivecolor.com/id/162)
[「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典](https://wa3.i-3-i.info/index.html)
xcode10 でschemaを切り替える方法

#### やりたいこと
STAGINGの分岐をできるようにする。ちなみにDEGUBとPRODUCTはそもそも設定されています。

```
#if DEBUG
 NSLog("DEBUG")
#elseif STAGING  ←ここ
 NSLog("staging")
#else
 NSLog("else")
#endif
```

#### やり方

- メニュー > Product > Schema > new Schema.. を選択する
- 任意でスキーマ名をつける　(例:projectname-staging)
- project > Info > Configurationsを選択して、+を押し、Debugをコピーします
- <img width="638" alt="スクリーンショット 2018-10-18 18.31.21.png" src="https://qiita-image-store.s3.amazonaws.com/0/87607/f12390c7-c28c-95d7-7dc5-ddf91c2b890d.png">
- コピーしたDebugのNameをStagingにします
- <img width="624" alt="スクリーンショット 2018-10-18 18.35.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/87607/f44a9e8e-fba9-8967-f2af-fa4f10fa1456.png">
- TARGETS > Build Settings > Active Compilation Conditions のstatingの値がdebugになっていると思うので、statingに変更します
- <img width="629" alt="スクリーンショット 2018-10-18 18.42.10.png" src="https://qiita-image-store.s3.amazonaws.com/0/87607/f134dc6e-c5a0-6ff3-3c71-ce89268fce49.png">
- メニュー > Product > Schema > edit Schema..を選択する
- Build ConfigureをStagingにします
- <img width="870" alt="スクリーンショット 2018-10-18 18.45.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/87607/deb5fff5-6bcf-6cf8-2093-b81b736272f6.png">
- あとは実行ボタンを押して、「staging」がログに出れば成功です
- 今後は、schemaを切り替えるだけで、環境を切り替えられます
初めてのnpmパッケージ公開（TypeScript）

# モチベーション

フロントエンドをやっているのに npm パッケージの一つも作ったことが無いなんて！
ということに気が付いて、ちょうどいい感じのコードがあったので試しに作りました。
ソースコードは TypeScript で書いています。

# 参考

https://qiita.com/TsutomuNakamura/items/f943e0490d509f128ae2
https://liginc.co.jp/353537
https://codeburst.io/https-chidume-nnamdi-com-npm-module-in-typescript-12b3b22f0724

# 成果物

npm: https://www.npmjs.com/package/array-compressor
github: https://github.com/kik4/array-compressor

## ちなみに

どんな内容のパッケージかというと、配列を{ 値, 後に連続する回数 }の形の配列に変換する処理です。

```
# 入力
[1,1,1,2,2,3]

# 出力
[ { value: 1, count: 3 },
  { value: 2, count: 2 },
  { value: 3, count: 1 } ]
```

逆変換も作りました。
現時点だとまだオブジェクトの配列の場合については想定していないので機能拡張するつもりです。

# 手順

参考記事が本当に参考になるので詳細はそちらで、ここでは行動記録とちょっと気を付けたところを書きます。

## npm ユーザを作成

[npmjs](https://www.npmjs.com/)にアクセスしてアカウントを作ります。
ついでに二要素認証も有効化。

## コンソールで npm ユーザを登録

```sh
npm adduser
```

username、password、email address を入力します。

## npm パッケージ情報の入力

```sh
npm init
```

順番に入力して package.json が出来上がりました。
適当に enter 連打してもいいです。後で package.json を直接弄ればいいので気楽にいきましょう。

参考記事を見つつ自分で設定。
テストなので version を 0.1.0 に。
scripts の prepublish は一度設定したらば「もう使わないよ！」と警告が出たので prepare に書き換えました。

```package.json（一部加工抜粋）
{
  "scripts": {
    "prepare": "tsc",
    "build": "tsc"
  }
}
```

keywords も関係ありそうなワードを追記。

```package.json（一部加工抜粋）
{
  "keywords": [
    "array",
    "compress"
  ]
}
```

## プロジェクトの作成

GitHub にリポジトリを作り、typescript 突っ込んだり tslint 入れたり prettier 入れたり jest 入れたり本体書いたり何やかんやしました。
基本的にはプロジェクトを普通に作るところなので詳細は書きませんが、いくつか学んだことを書きます。

### 型情報を添付

npm パッケージは最終的に js なので ts で使うには型情報が無くなるはず。しかし一部のパッケージは型情報がしっかり入っています（.d.ts ファイルの形で）。
これのやり方がわからなかったんですが、tsconfig.json に設定すると自動で書き出してくれました。

```tsconfig.json（一部加工抜粋）
{
  "compilerOptions": {
    "declaration": true
  }
}
```

### テストコードを配布しない

途中まで src の下にテストコードを入れていたのですが、そうするとビルド時に一緒に出力されて配布されてしまいます。
test フォルダを別に切って格納しました。

## .npmignore ファイルの追加

```
.prettierrc
tsconfig.json
tslint.json
test/
src/
```

これらは開発する上では必要ですが公開パッケージに不要なので設定追加しました。

## npm に公開

```sh
npm publish
```

これで無事に公開されました！
試しに自分のプロジェクトに入れてみてもしっかり使えますし、型推論も効きます。成功ですね。

けれど少し足りないところがあったので以下修正…。

## README.md を書く

使い方を書きます。
TypeScript での使い方はすでに使っているコードがあるのですぐに書けました。
JavaScript での使い方は node コマンドで対話モードにして調べました。
でも何度か間違ってその度に publish し直すことになりましたけど…。

## npm パッケージの更新

公開と同じコマンドですが、package.json の version を上げておかないと失敗してしまいます。

```sh
# patchのバージョンを上げる(major/minorもあり)
npm version patch

# 公開
npm publish
```

## 追記：CircleCI で自動テスト&公開

以前から使っている CircleCI で自動テストと公開をやってもらいます。
.circleci/config.yaml を作成します。
設定内容は CIrcleCI のブログに記事が出てきました。これを使わせてもらいましょう。
https://circleci.com/blog/publishing-npm-packages-using-circleci-2-0/

ただ解説と設定がなんか違う気がするので後で直します。

### npm_TOKEN の設定

環境変数に npm_TOKEN を追加します。token は npm のページの右上アイコンの Tokens から作成して設定。
これ、一回ビルドしないとプロジェクトが一覧に追加できなくて環境変数も設定できないんですが…最初一回失敗ビルドして進めました。

### git でタグを設定

上記ではバージョンのタグ（`v0.1.0`のような）を打ったコミットを公開するようになっています。
適当にタグを打ってしまっていたので全部修正することに。

### コミットして確認

コミットして自動で公開されるのを確認。設定完了です。
ついでに README.md にバッジを追加しておきました。
UiPathのカスタムアクティビティのnupkgの作り方(元記事の訂正)


[UiPath Studioで使用するカスタムアクティビティの作成方法](https://qiita.com/masatomix/items/1f63513e80313a99faeb#nupkg%E3%81%AE%E8%A8%AD%E5%AE%9A%E3%83%95%E3%82%A1%E3%82%A4%E3%83%ABnuspec%E3%81%AE%E7%94%9F%E6%88%90) で、nupkgを作成する際の nuspecファイルを下記の通りにするという記事を書きました。

```xml
<?xml version="1.0"?>
<package >
  <metadata>
    <id>$id$</id>
    <version>$version$</version>
    <title>$title$</title>
    <authors>m-kino</authors>
    <owners>m-kino</owners>
    <requireLicenseAcceptance>false</requireLicenseAcceptance>
    <description>$description$</description>
    <releaseNotes>Summary of changes made in this release of the package.</releaseNotes>
    <copyright>Copyright 2018</copyright>
  </metadata>
  <files>
    <file src="bin\Release\*.dll" target="lib" />
  </files>
</package>
```

この

```xml
<files>
  <file src="bin\Release\*.dll" target="lib" />
</files>
```
は、
>DLLファイルをlibディレクトリ直下に配置せよっていう指示ですが、コレを書かないとUiPath Studioでは参照されない箇所(lib¥net461 っていうディレクトリ配下)にDLLが置かれるっぽく、その対応のためのおまじないです。


って話だったのですが、どうも解決法が見つかったぽいので追記。


## イケてない構成
改善前は上記の通り

```xml
<files>
  <file src="bin\Release\*.dll" target="lib" />
</files>
```

を書いてるので、このようにlib 直下にもDLLが配置されるようになっています。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/73777/b073b330-f224-fda3-9fd5-2fe43d4137a2.png)

ところで、NuGetサイトにあがっているnupkgをつらつらとみていたところ、、、、
![image.png](https://qiita-image-store.s3.amazonaws.com/0/73777/fc54d8c0-7e2e-8c35-a66d-4c16038069fb.png)

net45、、、？これはDLLがlib直下にないのに、UiPath Studioで動くわけですよね、、。

コレってどうも[複数のターゲット フレームワークのサポート](https://docs.microsoft.com/ja-jp/nuget/create-packages/supporting-multiple-target-frameworks) に説明されている、呼び出す側の.NETのバージョンに応じてDLLを切り替える(?)仕組みっぽいです。

この値を制御するには、Visual Studio上で、ターゲットフレームワークを変更すればよさそうです。

## ターゲットフレームワークの変更
Visual Studioのプロジェクトを開いて、ソリューションエクスプローラを右クリック >> プロパティ >>  アプリケーション を選択して、アセンブリ名などを表示する画面を開きます

そこで**ターゲットフレームワークを 4.6.1 → 4.5 へ変更**します。 
![image.png](https://qiita-image-store.s3.amazonaws.com/0/73777/d3631bf9-2ca7-484a-17dc-621b30e1f940.png)

ホントにイイ？って聞かれますが、はいを選択
![image.png](https://qiita-image-store.s3.amazonaws.com/0/73777/dafea272-4841-2fbc-ff70-0db204324907.png)

変更されました。。

で nuspec上の

```xml
<files>
  <file src="bin\Release\*.dll" target="lib" />
</files>
```

これは削除しちゃいましょう。


## たぶん、コレでOKな構成
さて、おなじみの nuget pack コマンドでnupkgを作成してみたところ、、、

```
Z:\git\Path\Utils> nuget pack Utils.csproj -Prop Configuration=Release
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/73777/20c97a99-cad0-5fc0-f092-2fa7496339db.png)

それっぽい構成になりました！UiPath Studioで読み込ませてみたところ、問題なさそうです。


おつかれさまでした。

### 関連リンク
- [UiPath Studioで使用するカスタムアクティビティの作成方法](https://qiita.com/masatomix/items/1f63513e80313a99faeb#nupkg%E3%81%AE%E8%A8%AD%E5%AE%9A%E3%83%95%E3%82%A1%E3%82%A4%E3%83%ABnuspec%E3%81%AE%E7%94%9F%E6%88%90) 元記事。
- [複数のターゲット フレームワークのサポート](https://docs.microsoft.com/ja-jp/nuget/create-packages/supporting-multiple-target-frameworks) 
- [NuGet Package Explorer](https://github.com/NuGetPackageExplorer/NuGetPackageExplorer/releases) 上記ででてくる、nupkgの中身を参照・編集するツールです。
ウェブサイトの言語設定を見て、日付フォーマットを変える

# やりたいこと

- 日本語サイト、英語サイトで、日付のフォーマットを変更したい
- 日本語サイトは「``yyyy年mm月dd日``」にしたい
- 英語サイトは「``yyyy/mm/dd``」にしたい

# やったこと

```html:公開日を表示するウィジェット
<!-- 日本語／英語サイト別に EntryDateの形式を指定し、MyEntryDateに代入する -->
<mt:SetVarBlock name="MyEntryDate">
  <mt:If tag="WebsiteDateLanguage" eq="ja">
    <mt:EntryDate format="%Y年%m月%d日">
  <mt:Else>
    <mt:EntryDate format="%Y/%m/%d">
    </mt:Else>
  </mt:If>
</mt:SetVarBlock>
...
<div class="section">
<!-- MTVarを使って、値を呼び出す -->
公開日 : <mt:Var name="MyEntryDate">
</div>
...
```

- 記事に「公開日」を挿入するウィジェットを編集した
- ``MTIf``、``MTElse``を使って、日本語／日本語以外の表示切り替えができるようにした



# 日本語／英語サイトの判別方法

- 最初は、ウェブサイトのURL（[MTWebsiteURL](https://www.movabletype.jp/documentation/appendices/tags/websiteurl.html)]）を使って判別すればいいかなと考えていたが、ウェブサイトの言語の設定を取得できるタグを発見したので、そちらを使うことにした
- 見つけたタグは[MTWebsiteLanguage](https://www.movabletype.jp/documentation/appendices/tags/websitelanguage.html)と[MTWebsiteDateLanguage](https://www.movabletype.jp/documentation/appendices/tags/websitedatelanguage.html)の2種類ある
- それぞれの値を確認してみて、``MTWebsiteDateLanguage``を使うことにした

# 言語の設定

## ``MTWebsiteLanguage``の場合

- ``ウェブサイトを選択`` → ``設定`` → ``全般`` → ``使用言語``
- ``日本語`` : ``ja``
- ``English`` : ``en-us``

## ``MTWebsiteDateLanguage``の場合

- ``ウェブサイトを選択`` → ``設定`` → ``投稿`` → ``日付の言語``
- ``日本語`` : ``ja``
- ``英語`` : ``en``


# 関連するMTリファレンス

- [日付に関するテンプレートタグのモディファイアリファレンス](https://www.movabletype.jp/documentation/appendices/date-formats.html)
- [MTWebsiteLanguage](https://www.movabletype.jp/documentation/appendices/tags/websitelanguage.html)
- [MTWebsiteDateLanguage](https://www.movabletype.jp/documentation/appendices/tags/websitedatelanguage.html)
Windows版VirtualBoxでUSBブートをする方法

#概要
Windows版VirtualBoxでWindowsPEが入っているUSBメモリからブートをさせる。
#実証環境
- Windows10 Pro
- VirtualBox 5.2.20

#方法
流れとしては

1. 仮想ディスク(vmdkファイル)を作る
2. vmdkファイルを仮想ハードディスクとしてVirtualBoxに追加する
3. 実行する

の順番です。

##仮想ディスクvmdkファイルを作る
1. 対象となるUSBメモリの物理ディスク番号を調べます。
管理者権限で開いたコマンドプロンプトで以下のコマンドを実行します。

    ```
    wmic diskdrive list brief
    ```
その結果から，USBメモリに対応するデバイスID(`\\.\PhysicalDrive(数字)`)を記憶しておきます。
今回の説明では，`\\.\PhysicalDrive1`と仮定します。

2. コマンドプロンプトにて，以下の操作をします。
    1. cd (Virtualboxがあるディレクトリ)
    2. `VBoxManage.exe internalcommands createrawvmdk -filename "C:\usb.vmdk" -rawdisk \\.\PhysicalDrive1`
    `C:\usb.vmdk`は，任意の場所で構いませんが作成後のファイル移動はできないので気を付けてください。

3. VirtualBoxで読み込む
以下の順序で操作します。
   1. 管理者権限でVirtualBoxを起動
   2. 新規(N)のVMとして設定します。
       - WindowsPEの場合はOSの設定をMicrosoft WindowsのOther Windowsに設定します。
       - [ハードディスク]は`仮想ハードディスクを追加しない`に設定します。
   3. [設定]→[ストレージ]→[ハードディスクを追加(ハードディスクのアイコン)]→[既存のディスクを選択]→先ほど作ったvmdkファイルを指定
   4. 管理者権限のままそのVMをクリック→実行

##注意事項
実行する際は，必ずVirtualBoxを管理者権限で起動させる必要があります。
環境構築

2018.10.18
ドットインストール
学習メモ

・ターミナル
クリアする：　$ clear
[vagrant@localhost ~]$
↑vagrant開始だと
↑仮想マシン(サーバー)にログインしているということ
移動：　cd

・PHP学習
finder→移動→フォルダへ移動
→/etc（ファイル名）→atom開いてドラッグ&ドロップ

192.168.33.10 dev.dotinstall.com
と入力保存

・学習開始手順(ターミナル)
ホームフォルダに移動 cd
仮想マシンをまとめたフォルダに移動 cd MyVagrant
仮想マシンのフォルダに移動 cd MyCentOS
仮想マシン起動 vagrant up
仮想ログイン vagrant ssh
〔vagrant@~〕ログインできている
cyberduck(ファイル転送ツール)で
ruby_lessonsフォルダ作成
hello.rbファイル作成
cd ruby_lessons
ruby hello.rb

・学習終了手順(ターミナル)
phpのウェブサーバー立ちあがっている時
→control+C
仮想マシーン(vagrant)からログアウト exit
仮想停止　vagrant susupend
ターミナル終了 exit
環境設定→pro→シェル

・Cyberduck
FTP:ネット上でファイルを転送する為のプロトコル(通信規約)
SFTP or SSHを選択
(SFTP：FTPより安全,SSH:通信内容が暗号化されたtelnet
(ネットワークを経由して他のコンピュータ（サーバーなど）に接続して遠隔操作する仕組み))
Server　192.168~
vagrant×2

bookmarkすると便利


改善点：
最終的なタイプミスがある
打つ時や打った後ダブルチェック
VBA ユニークなワークシート名を算出する

## はじめに

新しいワークシートを作成する業務は多く、それらに適切な名前をつける要件もたくさんあります。

ワークシートの命名はワークブック内でユニークである必要があり、それらを算出することもしばしばあるので汎用化しました。

このようなスニペットは既にたくさんありそうですが、探してもパッと出てこなかったので自分の要件に合わせて作りました。

## スニペット

```vb
' -----
' 命名のために、既存のものと重複しないワークシート名称を返す。
' 引数  :basename               ワークシート名称の基準となる名前。文字列。
'       :ws                     命名しようとしているワークシート。
'       :fmt                    連番を振る際のフォーマット。
' 返値  :重複しないワークシート名称。
' https://qiita.com/Tachy_Pochy/items/25f69edc8ba8094b8ecc
' -----
Public Function UniqueSheetName(ByVal basename As String, _
                                ByRef ws As Worksheet, _
                                Optional fmt As String = " (0)") As String
    Dim wb As Workbook
    Set wb = ws.Parent
    
    Dim ret As String
    ret = basename
    
    Dim seq As Integer
    seq = 1
    
    Dim duplicate As Boolean
    Dim i As Integer
    Do
        duplicate = False
        For i = 1 To ActiveWorkbook.Sheets.Count
            If ws.Index <> i Then
                If UCase(wb.Sheets(i).Name) = UCase(ret) Then
                    duplicate = True
                    Exit For
                End If
            End If
        Next
        If duplicate Then
            ret = basename & Format(seq, fmt)
            seq = seq + 1
        End If
    Loop While duplicate
    
    UniqueSheetName = ret
End Function
```
Gmailに来たメールをSlackに転送する

## Gmailの特定のメール(スレッド)をSlackに飛ばす
[こちら](https://qiita.com/tksnino/items/6d283860ee8cd943e792)の改変です。
ChatworkをSlackに置き換えてみました。

## 準備：SlackのIncoming Webhooks
+ 専用のチャンネルをつくります。
+ 「チャンネル設定」->「アプリを追加する」-> "Incoming Webhooks"を検索して追加します。
+ 発行されたURLをメモしておきます。

（参考）
[【初心者向け】GASを使ってSlackへ自動通知](https://qiita.com/chihiro/items/c7b11abc78f5d806c3a8)

## スクリプトを書く
こんな感じです。

```js
function main() {
  //Slack
  const SLACK_WEBHOOK = "https://hooks.slack.com/services/xxxxxxx/...";
  const SLACK_POSTUSER = "POSTするユーザー名（任意）";

  //Gmailから特定条件のスレッドを検索しメールを取り出す
  var strTerms = 'is:unread "メール取得条件"';
  var myThreads = GmailApp.search(strTerms, 0, 50); //条件にマッチしたスレッドを取得
  var myMsgs = GmailApp.getMessagesForThreads(myThreads); //スレッドからメールを取得する→二次元配列で格納

  //各スレッド×メール
  for (var i = myMsgs.length - 1; i >= 0; i--) {
    var msgsInThread = myMsgs[i];
    for (var j = 0; j < msgsInThread.length; j++) {
      var msg = msgsInThread[j];

      //未読のみ
      if (msg.isUnread()) {
        //メールを既読にする
        msg.markRead();

        //メッセージ作成（絵文字も可）
        var msgBody = ":simple_smile:*" + msg.getSubject() + "*\n" +
                      msg.getFrom() + "\n\n" +
                      msg.getPlainBody().slice(0,512) + "\n\n" +
                      msg.getDate() + "\n";

        var msgJson = {
          "username": SLACK_POSTUSER,
          "text": msgBody
        };
        var payload = JSON.stringify(msgJson);

        //Slackに送る
        var options = {
          "method": "post",
          "contentType": "application/json",
          "payload": payload
        };
        
        UrlFetchApp.fetch(SLACK_WEBHOOK, options);        
      }
    }
  }
}
```

Slackメッセージは絵文字やマークダウンで装飾できます。
[EMOJI CHEAT SHEET](https://www.webpagefx.com/tools/emoji-cheat-sheet/)
[メッセージの書式設定](https://get.slack.help/hc/ja/articles/202288908-%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E3%81%AE%E6%9B%B8%E5%BC%8F%E8%A8%AD%E5%AE%9A)

## トリガーに登録
あとはスクリプトをトリガーに登録しておけばOK。
AlexaアプリをAWS lambdaではなくAzure functionでつくった話

話というほどのことでもなく、もう半年も前になるのだが、
https://github.com/RamjiP/alexa-skill-sdk-for-azure-function/pull/1
という、どこぞの方がつくったAzure function向けのAlexa skill sdkのラッパーにバグがあり、ぼくが直して某社某Alexaスキルの本番リリースに至った、というだけです。

もし、お客さんの会社の都合でAlexaスキルをAzure functionでつくりたい（しかもjavascriptで）という特異な方でお困りでしたら、連絡ください。
Node.jsでDMX出力する

[node-dmx](https://github.com/wiedi/node-dmx)というのを使った。
[drivers](https://github.com/wiedi/node-dmx/tree/master/drivers)にあるようにArtNetやUSBタイプに対応している。

今回は [ENTTEC DMX USB Pro](https://www.enttec.com/products/protocols/usb/2-universe-usb-computer-interface-dmx/) を使った。

## 準備

node-dmx内で[node-serialport](https://github.com/node-serialport/node-serialport)というライブラリを依存関係にもっているので、

```
npm i -S dmx
```

するとnode-serialportも入っていて、

```bash
$ npx serialport-list
/dev/tty.Bluetooth-Incoming-Port
/dev/tty.usbserial-EN224271		ENTTEC
```

上記のように実行してデバイスIDを得ることができる。

## 通信

[node-dmxリポジトリ内にあるdemo_simple](https://github.com/wiedi/node-dmx/blob/master/demo_simple.js)を参考に、

```js

const DMX = require('dmx')

const dmx = new DMX()
const universe = dmx.addUniverse('demo', 'enttec-usb-dmx-pro', '/dev/tty.usbserial-EN224271')

var on = false;
setInterval(function(){
  if(on){
    on = false;
    universe.updateAll(0);
    console.log("off");
  }else{
    on = true;
    universe.updateAll(250);
    console.log("on");
  }
}, 1000);
```

というようにドライバ名とデバイスIDを指定してupdateAllするとすべてのチャンネルに値を出力できる。

特定のチャンネルのみに出力するときは

```js
universe.update({1: 10, 2: 20});
```

のようにする。
JuliaでLinearMaps.jlを使ってみる：行列を定義せずに線形演算

数値計算においては、ある行列$A$とベクトル$v$の積$Av$を使った演算が色々ある。
例えば、連立方程式$Ax=b$の解を求めるための共役勾配法(CG法)における逐次演算では行列ベクトル積を何回も演算させる。
しかし、行列$A$があまりにも大きかった場合、メモリに$A$が入らずに計算ができない！というような場合がある。一つの方法としては、$A$が疎行列であれば、行列要素のうち0ではない部分だけを格納することで、メモリを節約することができる。Juliaではその場合にはSparseArrays.jlというパッケージがある。
一方、非ゼロ要素が沢山ある場合でも、行列自体をメモリに保持するのではなく、あるベクトル$v$に対して$Av$のみを返すようにすれば、計算が可能となる。
そのようなケースに対応するパッケージが、LinearMaps.jlというパッケージである。
https://github.com/Jutho/LinearMaps.jl
これを使えば、線形な演算子$A$が与えられているときに$Av$を計算するというようなより抽象的な演算も行う事ができる。


#バージョン
Julia 1.0

# 線形演算の定義
まず、線形演算を定義してみよう。ベクトル$x$が与えられた時に、ベクトル$y$が返ってくる関数$y=f(x)$を作ってみる。
これは、

```julia
function set_diff(v) 
    function calc_diff!(y::AbstractVector, x::AbstractVector)
        n = length(x)
        length(y) == n || throw(DimensionMismatch())
        for i=1:n
            dx = 1
            jp = i+dx
            jp += ifelse(jp > n,-n,0) #+1方向
            dx = -1
            jm = i+dx
            jm += ifelse(jm < 1,n,0) #-1方向
            y[i] = v*(x[jp]+x[jm])
        end
        return y
    end
    (y,x) -> calc_diff!(y,x)
end
```
として、

```julia
A = set_diff(-1.0)
```
とすればよい。これで、A(y,x)というような関数を作ることができた。
この関数を呼ぶと、

```math
y = D x \\
y_i = \sum_{i=1}^N (D_{i,i+1} x_{i+1}+D_{i,i-1} x_{i-1})
```
というような行列Dをxに演算した結果のベクトルyが出てくることになる。
functionの中にfunctionを入れることで、パラメータvが変化したDを色々作れるようになっている。

# LinearMaps
LinearMaps.jlを使ってみよう。
行列として、

```julia
using LinearMaps
n = 100
D = LinearMap(A, n; ismutating=true,issymmetric=true)
```
とする。ここで、issymmetric=trueは行列が対称行列であるということを指示しており、ismutating=trueはA(x)ではなくA(y,x)という関数であることを意味している。これをtrueにしておくと、古いyとxを使って新しいyを作る演算が定義できるようになる。nは行列のサイズである。

この行列の固有値を求めたければ、Arpack.jlを使えばよくて、

```julia
import Arpack
ene,v = Arpack.eigs(D; nev=20, which=:SR) 
println(ene)
```
とすれば、20個固有値を得ることができる。なお、issymmetric=trueをつけないとArpackが対称行列用のルーチンを使わなくなるので、固有値が複素数になっても大丈夫なように演算することとなる。あらかじめ対称行列だとわかっているのであれば、issymmetric=trueをつけた方が計算が軽い。

CG法で連立方程式を解きたい場合には、IterativeSolvers.jlを使えばよい。ArpackとIterativeSolversはLinearMapsに対応している。

LinearMapsを使えば、4次元時空中のディラック演算子を作用させるなど、行列で書くのはしんどい演算を簡単に定義することができて、パッケージを使って様々なことができるようになる。
また、GPUを使った計算や並列計算なども見通しよく記述できるはずである。
ブロックチェーンに関係する法律

# ブロックチェーンに関係する法律
　概要を大まかに分けると以下のようになります。

**・金融**、**マネーロンダリング**
**・消費者**
**・IT**
**・知的財産**
**・民法、税金等**

それぞれについて法律を列挙していきます。

## 金融・マネーロンダリング

　仮想通貨により金融取引を行う場合は、「資金決済法」・「銀行法」・「金融商品取引法」が関わってくる可能性があります。また、「マネーロンダリングに関する規制」についても重要です。
　これは、口座開設時や取引時の本人確認を規定した「犯罪収益移転防止法」が関わってきます。


## 消費者

　一般消費者を対象にしたビジネスであれば、「消費者契約法」・「特定商取引法」など消費者保護に関する法律も重要になってきます。


## IT

　個人情報のより扱いに関する「個人情報保護法」・「不正競争防止法」などが関わってきます。

## 知的財産

　知的財産に関しては、「特許法」・「商標法」・「著作権法」などが関わってきます。

## 民法・税金等

　契約や取引全般を規定する「民法」や「商法」・「税法」なども関わってきます。
その他の法律は、業種やサービスごとに違ってきますので、その都度確認するようにしましょう。

# 合わせ読み

[ブロックチェーン・スマートコントラクトとは[知識編]](https://qiita.com/kagami-r0927/items/09588760b94954dcc2fe)
[仮想通貨の会計処理](https://qiita.com/kagami-r0927/items/13ee07bd91bbfcf23f8b)
[仮想通貨の税務](https://qiita.com/kagami-r0927/items/cabe3268921f20d16fa3)
アセンブラーってなに？

Qiitaで記事を初めて書きます。
IBMメインフレームのOSであるz/OSでのアセンブラープログラミングについて、Hints&Tips的なことを書こうかなと思っています。

まずは手始めに、アセンブラーってなに？から。
アセンブラーはアセンブル言語(またはアセンブリ言語)で書かれたソース(人が読めるテキスト形式)を機械語(バイナリーコード)に変換する(アセンブルする)プログラム(ソフトウェア)のことです。
厳密には上述の通り変換プログラムのことを指しますが(狭義)、アセンブル言語のことを指してアセンブラーと言うことも多々あるように思います(広義)。
例えば、「アセンブラーで書かれたユーザープログラム」とか「アセンブラーのソース」などですね。
この記事でもアセンブル言語の意味でアセンブラーという言葉を使います。

これってコンパイラーのことじゃないの？と思うかもしれませんが、基本的には同じです。
一言で言うと、アセンブラーは機械語(CPU命令)と1対1に対応している点がコンパイラー(高級言語)と異なっています。
直接CPUの命令をコーディングできるので、OSの制御により近い処理を記述できたりしますが、コンパイラーと比べて数段難しいと私は思います。

アセンブラーと聞くと古いというイメージを持つかもしれませんが、少なくともz/OSの世界ではアセンブラーで書かれたプログラムは今でもたくさん動いています。
たしかに新規の業務アプリケーションをアセンブラーで開発するということは少ないと思いますが、z/OSの世界では20~30年前に書かれたプログラムが今でも普通に動いていますので＾＾
あとは、業務アプリケーション全体がアセンブラーで書かれているということはほぼなくて、一部の制御系機能をアセンブラーで書いて、それ以外の大半の業務ロジックの部分は高級言語でということが多いでしょうか。

次回以降、実際のコーディング内容を少しづづ紹介していきたいと今のところは思っています。
アセンブラーの書き方をゼロから教科書的に書こうとは思っていないので、ある程度書いたことがあることが前提になってしまうかなと思います。
ScreenSaverEngine.app の在り処



macOSの `ScreenSaver` を作りたいなぁと思い立ち、下記の記事を見ていた所...
https://marunouchi-tech.i-studio.co.jp/4669/
https://qiita.com/kaneshin/items/cab5132517f6902824e3

Mojaveで `ScreenSaverEngine.app` が見つからないなぁとなり、探しました。
また、該当のQiitaの記事については編集リクエストも送ってみた。

#### Sierra(macOS 10.12)以前
```sh
/System/Library/Frameworks/ScreenSaver.framework/Versions/A/Resources/ScreenSaverEngine.app
```

#### High Sierra(macOS 10.13)以降
```
/System/Library/CoreServices/ScreenSaverEngine.app
```

## また見つからなくなった場合...

検索して見つければ良いかと

```
find /System -name ScreenSaverEngine.app
```
OpenZeppelinのERC721Mintableコントラクト

こんにちは、私はグウェン ([http://www.twitter.com/gwenskiesHere](http://www.twitter.com/gwenskiesHere))です。

ERC721Mintableを調べました。

10月４日時点でERC721はアップデートがあるのですが、ERC721Mintableの資料はアプデートされていません。

##ERC721Mintableを使用する理由。
ERC721Mintableは `Minter`ロールを持つアドレスにトークンを生成できます。

##ERC721Mintableを使用するタイミング。
トークンを生成するとき。

##ERC721Mintableの継承
ERC721FullとMinterRoleです。でもアプデートコードがERC721とMinterRoleを使いました。

##イベント
####MintingFinished

```js:ERC721Mintable.sol
event MintingFinished()
```

##修飾子
####onlyBeforeMintingFinished

```js:ERC721Mintable.sol
modifier onlyBeforeMintingFinished()
```

##関数
####finishMinting

```js:ERC721Mintable.sol
function finishMinting() public returns (bool)
```
新しいトークンの作成を停止する機能。
#####戻り値：
操作が成功した場合は**true**。
####ミント

```js:ERC721Mintable.sol
function mint(address to, uint256 tokenId) public returns (bool)
```

ミントトークンの機能。
#####パラメーター：
**to** - ミントされたトークンを受け取るアドレス。
**tokenId** - mintのトークンID。
#####戻り値：
操作が成功したかどうかを示すブール値。
####mintWithTokenURI

```js:ERC721Mintable.sol
function mintWithTokenURI(address to, uint256 tokenId, string tokenURI) public returns (bool)
```

#####パラメーター：
**to** - 住所
**tokenId** - uint256
**tokenURI** - 文字列
#####戻り値：
ブール
####mintingFinished

```js:ERC721Mintable.sol
function mintingFinished() public view returns (bool)
```

#####戻り値：
mintingが完了している場合はtrueです。


##追加情報
アップデートされたコードに他の関数を除いてミントは残っている唯一の機能です。

これはアップデートされたコードです。
[https://github.com/OpenZeppelin/openzeppelin-solidity/blob/master/contracts/token/ERC721/ERC721Mintable.sol](https://github.com/OpenZeppelin/openzeppelin-solidity/blob/master/contracts/token/ERC721/ERC721Mintable.sol)

**source**：[https://openzeppelin.org/api/docs/token_ERC721_ERC721Mintable.html](https://openzeppelin.org/api/docs/token_ERC721_ERC721Mintable.html)


ブロックチェーンを学ぶことは楽しいです。これは今のところすべて。私の他のblogを読んでください。
OpenZeppelinのERC721Full.solを調べてみた

I am currently a student studying Blockchain. Recently, I studied ERC20, the next lesson I want to study is the opposite of ERC20 which is the ERC721. Let's discuss first the starting point of ERC721 which is the ERC721Full.sol.

# ERC721トークンとは
ERC721 token is a template that shows how to build non-fungible or unique tokens on the Ethereum blockchain. It is a class of identical tokens.

# OpenZeppelinとは
OpenZeppelin is an open-source battle-tested framework that contains reusable smart contracts for Ethereum and other blockchains. You can see more details about them in their website: https://openzeppelin.org/

# ERC721Full.SOLとは
ERC721Full.Sol is the constructor of the ERC721 Token. This is what you import and call to initialize your ERC721 Token. It needs two strings, the name of the token and the symbol of that token. This is the code of the ERC721Full.sol from Github ( https://github.com/OpenZeppelin/openzeppelin-solidity/blob/master/contracts/token/ERC721/ERC721Full.sol ):

```javascript:

pragma solidity ^0.4.24;
import "./ERC721.sol";
import "./ERC721Enumerable.sol";
import "./ERC721Metadata.sol";

/**
 * @title Full ERC721 Token
 * This implementation includes all the required and some optional functionality of the ERC721 standard
 * Moreover, it includes approve all functionality using operator terminology
 * @dev see https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md
 */
contract ERC721Full is ERC721, ERC721Enumerable, ERC721Metadata {
  constructor(string name, string symbol) ERC721Metadata(name, symbol)
    public
  {
  }
}
```

# ERC721Full.SOLの使用
To use ERC721Full.sol, we have to import the file from Github. You can also install the OpenZeppelin Solidity into your local project. Please see the link on how to install: https://github.com/OpenZeppelin/openzeppelin-solidity

```javascript:
import "https://github.com/OpenZeppelin/openzeppelin-solidity/contracts/token/ERC721/ERC721Full.sol";

contract yourContract is ERC721Full {
  constructor() ERC721Full("token name", "token symbol") public {
  }
}
```

After importing it to your code, extend the ERC721Full to your contract.

```javascript:
contract yourContract is ERC721Full
```
Next is to inherit the constructor of the ERC721Full. You need to pass your token name and symbol as the parameters. You can also put your own code inside the constructor if you want to initialize something. The constructor only run once when the code is executed.

```javascript
contract yourContract is ERC721Full {
constructor() ERC721Full("token name", "token symbol") public {
}
```

# まとめ
ERC721Full.Sol is a simple code that lets you use the ERC721 template. It is the starting point of integrating the template into your contract. This is also where you initialize your token name and symbol. This token name and symbol will represent your token in the blockchain.

ソース:
http://erc721.org/
https://github.com/OpenZeppelin/openzeppelin-solidity/blob/master/contracts/token/ERC721/ERC721Full.sol
https://github.com/OpenZeppelin/openzeppelin-solidity
Reactでディープコピーを実現する方法の速度比較をしてみた

# 概要
React(javaScript)でディープコピー(Deep Copy)をする方法について比較してみたので、まとめます。
少しでも速度を改善したい、という方向け。
具体的には、

* lodashの`_cloneDeep()`
* `JSON.parse(JSON.stringify(obj));`

の速度比較です。

## 環境
* Windows10
* Chrome 69.0
* React(javaScript)


## 実験用コード


``` javaScript
    measure() {

        let sample_data = {
            a: "",
            b: "",
            c: 0,
            d: "",
            e: "",
            f: 0,
            g: -1,
            h: ""
        };
        const loop_number = [1, 10, 100, 1000];
        for (var l of loop_number) {
            let j = 0;
            const json_start = performance.now();
            while (j < l) {
                let json_data = JSON.parse(JSON.stringify(sample_data));
                j++;
            }
            const json_end = performance.now();

            const json_elapsed = (json_end - json_start);
            const json_elapsedStr = json_elapsed.toPrecision(3);
            console.log(`json: ${json_elapsedStr}`);

            const clone_start = performance.now();
            let c = 0;
            while (c < l) {
                let clone_data = _.cloneDeep(sample_data);
                c++;
            }
            const clone_end = performance.now();

            const clone_elapsed = (clone_end - clone_start);
            const clone_elapsedStr = clone_elapsed.toPrecision(3);
            console.log(`clone: ${clone_elapsedStr}`);
        }
    }
```
何回かまわして、速度を比較してみます。


## データ量が少ない場合の結果
まず、最初はデータ量が少ない場合の結果。
上記のコード通り、少ないデータ量でコードを回してみた結果です。

（単位はms）


|                  |       JSON        |    cloneDeep()     |
|:-----------------|------------------:|-------------------:|
| 1回　　          |             0.100 |            0.300   |
| 10回              |          0.000 |              0.200|
| 100回             |              0.100 |        0.800        |
| 1000回               |                2.10 |         8.30         |

1～100回だと差はほとんど出ないですが、1000回程度だと差が出てきます。
いずれにせよ、JsonによるDeepCopyの方が速そうです。


## データ量が多い場合の結果

次に、`sample_data`の量をもう少し増やして実験してみます。
具体的にはデータ件数を増やし、合計1000項目程度の連想配列を用意して実験してみました。


（単位はms）


|                  |       JSON        |    cloneDeep()     |
|:-----------------|------------------:|-------------------:|
| 1回　　          |             1.10 |            4.00   |
| 10回              |          10.4 |              10.8|
| 100回             |              92.5 |        53.6        |
| 1000回               |                902 |         425        |


何回か走らせてみましたが、処理の量が非常に多い場合は、`cloneDeep()`のほうが速くなるようです。
ですが、実際にはこの変換を何度も行うアルゴリズムは稀で、1回の処理で比較するとJsonのほうが速くなります。
1回手軽にDeepCopyするだけなら、Jsonのほうが速度は詰められそうです。


## 注意点

Jsonの方法を使う場合、破壊的な変換を伴う可能性があります。
具体的には、以下のものはDeepCopyできません。

1. Dateオブジェクト
2. function
3. undefined

データの中身がStringとNumberのみであれば安全なので、何のデータがどれだけ入るかは要確認です。
また、ハック的な方法で一読して理解するのは（知らないと）難しいので、
共通の関数にして、使える場面で呼び出すなどの処置はしたほうが可読性・利便性が高くなると思います。




## 参考
* [色々なディープコピー](https://qiita.com/knhr__/items/d7de463bf9013d5d3dc0)
* [cloneDeepのパフォーマンス](https://github.com/lodash/lodash/issues/1984)
* [JavaScriptのDeepCopyでJSON.parse/stringifyを使ってはいけない](https://qiita.com/seihmd/items/74fa9792d05278a2e898)
仮想通貨の税務

# 仮想通貨の税務
国税庁のページはこちら
[仮想通貨の税務上の取扱い－現状と課題－](https://www.nta.go.jp/about/organization/ntc/kenkyu/ronsou/88/05/index.htm)

## 仮想通貨に係る課税

　仮想通貨に係る税金の種類は以下の通りです。
・所得税
・法人税
・消費税
それぞれについて説明していきます。

## 所得税

　法定通貨として保有していた仮想通貨を売買する場合、売却額が取得額よりも多い時は、その差額が所得となります。
![Quiita.png](https://qiita-image-store.s3.amazonaws.com/0/285122/ccf7085c-3e48-a1de-cee7-c989e3f951a4.png)

取得価額の算定方法
　複数回にわたって仮想通貨を取得した場合の簿価は、外貨と同じように仮想通貨の同じ種類ごとに、総平均法に準ずる方法によって計算します。

また、仮想通貨の売買で得た利益は、所得税のうち雑所得に分類され、利益が20万円を超えた場合は確定申告をする必要があります。扶養されている人は33万円以上の利益が出た場合は確定申告をしなければなりません。

雑所得は総合かぜいの対象で、給与所得など他の収入と合算した額に応じて税率が決定します。
税率は、最大で住民税と合わせて55%(所得税45%・住民税10%)になります。
![スクリーンショット 2018-10-18 14.42.07.png](https://qiita-image-store.s3.amazonaws.com/0/285122/67c47310-976c-0af4-140a-f2332126c326.png)
参考:国税庁 No.2260 所得税の税率
https://www.nta.go.jp/taxes/shiraberu/taxanswer/shotoku/2260.htm

## 法人税

　個人の場合は税率が最大55％になりますが、法人の場合、法人税率は最大でも約23%程度、法定実効税率は最大で約29%です。
　法人の場合、経費の幅が雑所得と比べ広くなるため、利益を相殺しやすくなります。
利益を多く出してしまった場合は、法人化し、従業員や少額固定資産で利益を相殺すると節税になるかもしれません。

## 消費税

　平成29年度改正で仮想通貨の譲渡に係る消費税が非課税になりました。



## 合わせ読み
[仮想通貨の会計処理](https://qiita.com/kagami-r0927/items/13ee07bd91bbfcf23f8b)
[ブロックチェーン・スマートコントラクトとは[知識編]](https://qiita.com/kagami-r0927/items/09588760b94954dcc2fe)
[ブロックチェーンに関係する法律](https://qiita.com/kagami-r0927/items/098d4d2d5208c10315f8)
OpenCVを使ってみよう（初心者編）

# はじめに

* OpenCVって時々耳にするけどなんだろ？
* 画像処理をしてくれるらしいけど、どいういうこと？
* とりあえず動かしてみたいということで、画像処理をしてみることにしました。その時のメモです。

# OpenCVとは

* https://opencv.org/
* BSD license のオープンソースライブラリ
* 画像・動画処理をすることができる
* C++, Python and Java のインターフェイスを提供
* マルチプラットフォーム対応で、Windows, Linux, Mac OS, iOS and Androidで利用が可能

# インストール

* ここでは、Ubuntu＋Pythonで実行するためのインストールを行う
* pipでインストールするので、もし環境を壊したくないようなら、pyenv等を利用するのも良い

```
$ pip install opencv-python
```

* 確認その1
 * numpyも一緒にインストールされる
 
```
$ pip freeze
numpy==1.15.2
opencv-python==3.4.3.18
```

* 確認その2  
pythonコンソールを起動してimportで確認。エラーがでなければインストールが成功。

```
$ python 
Python 3.6.5 (default, Jul  2 2018, 14:45:55) 
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import cv2
>>>
```
 
インストールされていない場合は下記のようなエラーが出る

```
>>> import cv2
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named cv2
```

# 使ってみる

* 画像をグレーで書き出してみる。
  ソースはこれだけ！面白い～

```python
import cv2 

img = cv2.imread("img.jpg",0)
cv2.imwrite("gray.jpg",img)
```

* もとの画像（左）、グレーにした画像（右）
![img2.jpg](https://qiita-image-store.s3.amazonaws.com/0/92328/b840088f-cf95-68f9-9492-54a832542c01.jpeg)

いろいろと応用効かせたいですね。