OmniAICreator/Qiita-1.07M huggingface dataset:
Windows上でhirak/prestissimoの並列DLがすべてfailureになる場合の対処

composerを利用している方は、大抵`hirak/prestissimo`の存在を知っているでしょう。
composerでのダウンロードを並列化して速度が改善されるライブラリです。

windowsでこれを利用する場合、このような場合に直面することがあります。

```
λ composer update
Loading composer repositories with package information
Updating dependencies (including require-dev)
    Finished: success: 0, skipped: 0, failure: 26, total: 26
```

このようにすべてfailure表示になってしまい、並列DLされないことです。

# 原因と対処

原因はcaの証明書が設定されてないからです。windowsでcurlとか扱ってると結構ぶち当たる問題です。

前提として`git for windows`が入ってることとします。

`php.ini`の`curl.cainfo`の値を修正します。

```
;curl.cainfo=
curl.cainfo="c:\Program Files\Git\usr\ssl\certs\ca-bundle.crt"
```

これでOK。

```
λ composer update
    1/2:        https://packagist.jp/p/provider-latest$d5028214f567cb1b18ce78d73e9a00a6ad5b2aa02c9375aee83251e4fc4ebac1.json
    2/2:        https://packagist.jp/p/provider-2018-10$9e1ffc28f4cf611b99bfff1dd5d38a0728a999a8de96b1c0a65807065442deac.json
    Finished: success: 2, skipped: 0, failure: 0, total: 2
```

問題なく動きました。
BigqueryのSchedule queryを細々活用している話

この記事は[Google Cloud Platform その２ Advent Calendar 2018](https://qiita.com/advent-calendar/2018/gcp2)の8日目の投稿です。

## はじめに
今年はBigqueryに様々な機能が追加されました。
UIも新しくなり、大きく変わったなぁと今振り返ると感じます。
やはり今年のBQのアップデートの一番の目玉はBQMLかと思いますが、
個人的には痒いところに手が届くSchedule Queryも非常に気に入っています。

## Schedule queryとは
クエリを定期実行してくれるBQの機能です。
BQのUI上で完結できるからプログラミングしなくてよくて便利

## 使い方
**※ 旧UIでしか使えません**


<img width="819" alt="bq1.png" src="https://qiita-image-store.s3.amazonaws.com/0/137894/f9f7744c-91e2-ebd1-107a-47fe86497d1c.png">

UIにSchedule Queryというボタンがしれっと追加されてます。
ボタンを押すと下記のような感じ

<img width="489" alt="bq2.png" src="https://qiita-image-store.s3.amazonaws.com/0/137894/cfd067ef-a34c-44dd-c180-1bafba02573f.png">

任意の値を設定してください。
テーブルを指定するときは日付分割テーブルにすることもできます。
その際は、 **table_{run_date}** と記述すると実行時間で分割してくれます。
書き込みオプションは上書きやアペンドが設定できます。
※オプションでメールはpubsubに転送通知を設定できますがまだα版のようです。


スケジュール設定は下記のような感じです。

<img width="359" alt="bq3.png" src="https://qiita-image-store.s3.amazonaws.com/0/137894/34c110af-7efa-2b71-a04e-82243b6d01f0.png">

任意の頻度、期間が設定できます。
ただし、注意して欲しいのは時間は**UTC**です。
日本時間で実行したい場合は9時間プラスして設定してください。

定期実行したいクエリはコンソールに書きますが、下記の特殊なパラメータが使えます。

@run_time :実行時間のtimestamp
@run_date :実行時間のdate

こんな感じで書きます。

```sql
select 
  @run_time as excution_time
from
  table
```

こうするとexcution_timeには実行された時間が値として格納されます。
全て入力したらAddボタンを押してスケジューリング完了です。
登録されたスケジュールはコンソール左上のSchedule Queriesから確認できます。

![](https://gyazo.com/8edab8060f7cbcf46ce95a8d214403d5.png)



## 活用
データレイクチックなテーブルをデイリーでサマってデータマートテーブルを作るみたいに使うのがオーソドックスかな使い方かなと思いますが、私のプロジェクトでの活用方法を1つご紹介します。

◆GA360のログインIDだけを格納するテンプテーブル

GA360のデータを格納するBQからログインIDを出して、それに別テーブルの情報を紐づけて活用することがあります。GA360のデータはかなり量が多く、毎度そのテーブルからログインIDを取ってくるとお金がかかります。そこでSchedule queryでデイリーでログインidと日付を格納するテンプテーブルを作り、そこを参照することによって課金が大幅に下がります。
1発のクエリでこんなに違います(下記はパーティションを12/5に絞った時のデータ量)
・GA360
![](https://gyazo.com/cdd8f5f5902fb0d22d0b4221d7a27754.png)
・テンプテーブル
![](https://gyazo.com/24739fe062cf5091ae420dc32b48cdb2.png)

※　BigQUery Mateを入れるとクエリの金額を表示させることができます
参考:https://qiita.com/amidara/items/a557491615f8e667757c

もちろんschedule queryで取得するさいは7.01GBのスキャンはしますが、その後はテンプテーブルを参照するようにすれば課金額が数百分の一になります。


## まとめ
まだベータ版ではありますが、プログラミングせずにバッチ処理のように定期実行できるので重宝する場面は多いと思います。
あまり活用事例を見かけない気がするので、こんな使い方してるよ、というのがあればぜひコメントで教えてください！
JavascriptでURLのパラメータをオブジェクトで取得する

```javascript.js
const param = window.location.search.replace(/^\?/, "").split("&").reduce((p,i)=>{const t = i.split("=");p[t[0]]=t[1];return p;},{});
```




Googleでhoge hogeを検索した場合以下のように取れます。

```javascript.js
window.location.search.replace(/^\?/, "").split("&").reduce((p,i)=>{const t = i.split("=");p[t[0]]=t[1];return p;},{})
{q: "hoge+hoge", rlz: "1C1CHZL_jaJP770JP770", oq: "hoge+hoge", aqs: "chrome..69i57j69i61l2j0l2j69i61.1744j0j8", sourceid: "chrome", …}
aqs: "chrome..69i57j69i61l2j0l2j69i61.1744j0j8"
ie: "UTF-8"
oq: "hoge+hoge"
q: "hoge+hoge"
rlz: "1C1CHZL_jaJP770JP770"
sourceid: "chrome"
__proto__: Object
```

テキストだと個別のパラメータにアクセスしにくいので便利。
自分用メモレベル。
Chainer学習時のCPUネックを減らすメモ

#**Chainer学習時のCPUネックを減らしたい**

###環境
　Windows10、i7-7700K、GeForce1080Ti

###背景
最近少しずつスキルも上がって来たので大量の学習データを扱うことが増えてきました
学習に３日かかるとか、その間何もできない！
もっと早くできないのか？

と言うことで、何がネックなのかを調べたところ、、、
CPUネックでGPUがあまり使われていない！

###原因を探してみる
学習自体はGPUを使ってくれているので、きっとそれ以前の学習データのロードまでのどこかではないか？

train_iter = chainer.iterators.SerialIterator(

Serial？
ということは、Multiもあるのか？

はい、ありました
https://docs.chainer.org/en/stable/reference/iterators.html

なんか４つもあります
chainer.iterators.SerialIterator　　　　　：シングルスレッドでの逐次処理
chainer.iterators.MultiprocessIterator　 ：マルチプロセス
chainer.iterators.MultithreadIterator　　：マルチスレッド
chainer.iterators.DaliIterator　　　　　　：Daliパイプライン（何それ？）

###やったこと
SerialIterator →　MultiprocessIterator

使用率を見た感じだと4コア8スレッドのCPUの場合、こんな感じなのかな
　MultiprocessIterator　4コア8スレッドを使う
　MultithreadIterator　 1コア2スレッドを使う

###補足
https://www.nvidia.com/content/apac/gtc/ja/pdf/2018/2033.pdf
Chaineruiセットアップメモ

#Chaineruiのセットアップ

###環境
Windows10

###インストール
インストール
　pip install chainerui

DBの作成
　chainerui db create
　chainerui db upgrade

プロジェクトの作成
　chainerui project create -d (プロジェクトのパス) -n (プロジェクトの名前)

chaineruiサーバの開始
　chainerui server

###参照
　http://localhost:5000/
人権剥奪PCをRDP端末として利用して一年後のレポート

# はじめに
この記事は
[Macに別れを告げてドンキPCでリモート開発生活をはじめるまで](https://qiita.com/taruhachi/items/367641e646007f2ca0bc)
の記事の続きです。

# ドンキPC(ストイックPC)とは
2017年12月1日、税抜き2万円を切る価格でFullHDのWindows10マシンが発売されました。

主要スペック

| 項目 | |
|:------:|:-------------|
| 価格 | 19,800円（税別） |
| プロセッサ | Intel ®ATOM x5-Z8350(Cherry Trail) |
| プロセッサスピード | 1.44GHz/最大 1.92GHz |
| 無線LAN(Wi-Fi) | IEEE802.11b/g/n |
| OS | Windows 10 HOME 64bit |
| システムメモリ | LPDDR3 2GB(増設・変更不可) |
| ストレージ | eMMC 32GB | 
| ディスプレイ | 14.1インチ IPS液晶 1,920×1,080 ドット | 
| バッテリー駆動時間(約) | 7時間 *JEITA バッテリー動作時間測定法にて計測しています。 | 
| 質量(約) | 1,200g | 

特筆すべきはシステムメモリ2G、ストレージ32GB、というエンジニアにとって人権剥奪レベルとされるスペックながら、一方でディスプレイがFullHDというアンバランスさでしょうか。

この記事は上記のPCを1年間リモートデスクトップクライアント端末として利用したレポートとなります。ｑ

# 運用中に発生した主な不具合

* USBハブを使うとその先のUSB機器の接続が切断される
* USBポートがぐらぐらになってきた
* ネットワークの切断や急激な速度低下が頻発する
* 意図せぬ再起動が1日に1度くらい発生する
* Windows Updateが完了せず、適用されないUpdateが貯まる
* Slackの接続や表示が異様に遅い
* Zoomでの音声チャット中はRDPが切断される

どれもメインの開発マシンとしては致命的なのですが、シンクライアントとしてしか利用しておらず、マシンの再起動をかけても40秒程度で続きの作業に復帰できていたのでだましだまし利用していました。

## USBハブを使うとその先のUSB機器の接続が切断される
マックと違ってUSBポートが2つついていたのでマウスとキーボードで一つづつ専有することで解決??

## USBポートがぐらぐらになってきた
基本的には挿しっぱなしなのでまぁ。だましだまし。

## ネットワークの切断や急激な速度低下が頻発する
これはオフィスの無線Lanの問題かもしれません。
時々レイテンシが非常に悪くなるのでネットワークの再取得、それでも駄目ならマシンの再起動で対応。

## 意図せぬ再起動が1日に1度くらい発生する
気がついたらエラー吐いて再起動かかってる。

## Windows Updateが完了せず、適用されないUpdateが貯まる
これは結構致命的。
Windows Updateが完了しないくせにWindows Update用のファイルが裏で10GBくらい専有する。そのくせ失敗するWindowsUpdateを裏でずっと試みて少ないシステムリソースを食い続けるという悪循環。
導入一年後、アプリケーションは殆どインストールしておらずデータもローカルには全く保存していない利用方法の上、システムのクリーンアップを完了した状態で残りeMMCの空き容量が残り3GBとなっていた。

## Slackの接続や表示が異様に遅い
CPUの貧弱さとメインメモリ不足が原因と推測、解決不能だった。

## Zoomでの音声チャット中はRDPが切断される
ネットワーク周りの貧弱さとメインメモリ不足が原因と推測だが、解決不能だった。

# 根本的解決
人権剥奪PCを捨てて、2018年12月7日発売の最新PCを入手！

主要スペック

| 項目 | |
|:------:|:-------------|
| 価格 | 19,800円（税別） |
| プロセッサ | Intel ®ATOM x5-Z8350(Cherry Trail) |
| プロセッサスピード | 1.44GHz/最大 1.92GHz |
| 無線LAN(Wi-Fi) | IEEE802.11b/g/n |
| OS | Windows 10 HOME 64bit |
| システムメモリ | LPDDR3 **4GB**(増設・変更不可) |
| ストレージ | eMMC 32GB | 
| ディスプレイ | 14.1インチ IPS液晶 1,920×1,080 ドット | 
| バッテリー駆動時間(約) | 7時間 *JEITA バッテリー動作時間測定法にて計測しています。 | 
| 質量(約) | 1,200g | 

詳しいスペックは[こちら](http://www.donki.com/j-kakaku/product/detail.php?item=2456)

なんと、システムメモリが2GB → 4GBに倍増！ これで勝てる！！

とはいえ、ストレージは一切強化されていませんので、今回もここがボトルネックになってしまうことは火を見るよりも明らかです。
つまり、ストレージが32GBのマシンはそのままではシンクライアント端末としても不適格です。

続きは、32GB eMMCマシンをWindowsマシンとして使うために必要な設定まとめ へ
くいなちゃんチャット（仮）アプリ案

こういうのあったらいいなと思ったので、書いてみる。

伺かにツイッター関連機能を付けたい。なぜならば、わざわざブラウザを開きたくないからだ。通知が来たら伺かのキャラにしゃべらせたい。で、もし既存のやつでそれが作れるなら僕が（！！）そのアセット作ろうかなと。

で、できなかった場合は開発がんばります。できるか？

で、せっかくなんでサーフェスはくいなちゃんにしたい。もはやちづ子さんとやってること変わんないよみたいな感じです。生きててつらい。

以上
cssでテーブルデザインする時の注意点


## テーブルデザインで">"を使用する際の注意点
必ず、tbodyを書かないと有効にならないらしい。
下記がサンプル。

##例　その１

```index.html
  <table>
    <tr>
      <td>text</td>
      <td>text</td>
    </tr>
  </table>
```

```style.css

/* 無効 */
table > tr > td {
  color : #f00;  /* タグ通りに書いても効かない */
}

/* 有効 */
table > tbody > tr > td {
  color : #f00;  /* tbodyを書かないと有効にならない */
}
```


##例　その２

```index.html
  <table>
    <tbody>
      <tr>
        <td>text</td>
        <td>text</td>
      </tr>
    </tbody>
  </table>
```

```style.css
/* 有効 */
table > tbody > tr > td {
  color : #f00;  /* タグ通り */
}
```
BigQueryで2つのテーブルの差分を求める方法

2つのテーブルの差分をBigQueryで求めてみます。

テーブルをFULL OUTER JOINで結合して、排他的論理和を求めても良いですが、テーブルのすべての列をON句の後ろに書く必要があり、そこそこ面倒です。
https://www.codeproject.com/articles/33052/visual-representation-of-sql-joins

というわけで、 `except` を使って差分を出してみました。
このクエリの結果が0行であれば、2つのテーブルはすべての行が一致しています。

```sql
#standardSQL
with table1 as (
  SELECT 1 as a, 2 as b, 3 as c union all
  SELECT 2 as a, 4 as b, 6 as c
), table2 as (
  SELECT 1 as a, 2 as b, 3 as c
)

select * from (select * from table1 except distinct select * from table2) union all
select * from (select * from table2 except distinct select * from table1)
```

`except` は左のクエリに存在しているが右のクエリに存在しない行を返す関数です。
そのため、 `select * from table1 except distinct select * from table2` はtable1に存在するがtable2には存在しない行を返します。
あとは、このクエリのtable1とtable2を逆にしたクエリも用意し、それらを `union` で繋げば完成です。
GitLab最小構成セットアップ（AWSに応用可）

## 実行環境
OS：Ubuntu 18.0.4
CPU：2コア
メモリ：4GB
HDD：120GB

※ EC2を使用した場合、T2.medium、ストレージ30GB で動作確認済み
　6人で使用した実績あり

### Docker、Docker-composeの設定

今回使用するホスト端末に Docker 、Docker-compose をインストールする。

```
# Docker をインストール
$ sudo apt install -y docker.io

# Github からモジュールをダウンロードするため、一時的にスーパーユーザーに変更
$ sudo su -

# モジュールのダウンロード（download/ の後の番号はバージョンを指定する）
$ curl -L "https://github.com/docker/compose/releases/download/1.21.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

# docker-compose コマンドに実行権限を付与する
$ chmod +x /usr/local/bin/docker-compose

# スーパーユーザーから抜ける
$ exit

# Docker の動作確認
$ docker --version

# Docker-Compose の動作確認
$ docker-compose --version

```

### Docker 自動起動設定
AWSの場合)EC2インスタンス立ち上げ後に自動起動させるには、下記コマンドを実行する。

```
$ sudo chkconfig docker on
```

### Docker-Composeファイルの作成

YAMLファイルをホームディレクトリに作成する。
※ 下記設定以外にも色々追加できるので https://github.com/sameersbn/docker-gitlab の docker-compose.yml を参考に追加する。

```sh:~/docker-compose.yml
version: '2'
services:
  gitlab:
    image: 'gitlab/gitlab-ce:latest'
    restart: always
    ports:
      - '8000:80'  # ポートの指定 {インバウンド}:{アウトバウンド}
      - '22:22'
    volumes:
      # ホストへのマウント設定
      - '/srv/gitlab/config:/etc/gitlab'
      - '/srv/gitlab/logs:/var/log/gitlab'
      - '/srv/data:/var/opt/gitlab'
    environment:  # ここでgitlab.rbに設定される値を前もって指定できる
      - GITLAB_HOST=192.168.1.1  # ここにホストのIPを設定する(EC2の場合はEIP)
      - GITLAB_PORT=80
      - GITLAB_SSH_PORT=22
      - GITLAB_ROOT_PASSWORD=password123  # rootユーザーの初期パスワード
```

下記コマンドを実行してコンテナを作成する。

```
# YAMLファイルを作成したディレクトリないで実行する
$ docker-compose up -d
```

コンテナ作成後、別端末のブラウザで http://<ホストのIP>:8000 にアクセスする。

<img src="https://qiita-image-store.s3.amazonaws.com/0/180939/be48dd5e-2b32-12c7-71df-c20f8fe6b381.png">

ログインIDとパスワードを入力してログイン

<img src="https://qiita-image-store.s3.amazonaws.com/0/180939/5d7ef32e-6f77-9bb5-3178-40e72d8d4689.png">

git clone 確認用リポジトリ作成

<img src="https://qiita-image-store.s3.amazonaws.com/0/180939/e140cdaa-70f0-dac4-db3b-ee0d8f3e2b57.png">

git clone コマンドを実行して接続確認を行う。

```
$ git clone http://<ホスト端末のIP>:8000/root/test.git
```

以上で、基本的な設定は完了。
TouchDesignerで作ったものをGIFアニメーションにする

# はじめに

TouchDesignerで作ったものをGifアニメーションにしたい。と思ってもTouchDesignerには直接Gifアニメーションを書き出す機能はないのでその説明。Twitterで知人とちょっとだけやりとりがあったので書いておく。簡単。

# 何か作る
書き出したい何かをTouchDesignerで作ります。

# 普通に動画で書き出す

Export Movie Dialogを使って.movで書き出します。
Export Movie DialogでCodecを選べるけど、圧縮は低めのほうが良いのではないかと思う。『animation』がファイルサイズも大きくて圧縮率低そうな気がするので（非圧縮？）自分はこれにしているけど他のcodecでもffmpegが対応してさえすればどれでもよい。

書き出し方の参考↓
TouchDesignerでフレーム落ち無しの動画を書き出す - Qiita https://qiita.com/ikekou/items/a53910ea7195c5359f78

# ffmpegをインストールするしてmovをgifにする

そのままの記事があったのでこちらを見る↓
macでffmpegを導入してmovファイルをgifファイルへ変換するところまで - Qiita https://qiita.com/Ryosuke-Hujisawa/items/6a1c47d31ac299dc1c46

以上できたはず。おわり。

# 作業を楽にする

上記まででgifにはできたのでこれはおまけ。

自分もよくmov→gifはやるけどいちいちコマンド入力するの面倒。なのでシェルを.commandファイルにしてダブルクリックで処理が走るようにしてます。

.commandの便利さ参考↓
Macでバッチ（command）ファイルを作る方法 - Qiita https://qiita.com/TatsuyaOGth/items/f15bfa9aeb68d8ecfc67

で自分のコード見たらその時にnode.jsのffmpeg-gifっていうちょっとだけ便利になるラッパーも入れてそれをシェルから叩いてます。が普通にffmpegを叩けば良い気がするのでどういう経緯か忘れたけど別にこれはいらない気がする。が一応参考。

ffmpeg-gif↓
Jam3/ffmpeg-gif: shell script to convert video to high quality GIF with ffmpeg https://github.com/Jam3/ffmpeg-gif

コマンド例↓

```
$ ffmpeg-gif export.mov export.gif -t 30 --scale=256:-1
```

.commandファイル参考↓
https://github.com/ikekou/touchdesigner-samples/blob/master/1-sop/mov2gif.command

ちょっとした作業でも繰り返すとターミナルを立ち上げて文字を打つのが面倒になるのでマウスだけでできる.commandにしちゃうというのはよくやります。
XD Pluginお役立ちリンク集


この記事はAdobe XD Plugins Advent Calendar 2018の第1日目を埋めるためにTen Aがお届けするXDプラグイン開発に関連する情報へのリンク集となります。

![スクリーンショット 2018-12-08 7.59.14.png](https://qiita-image-store.s3.amazonaws.com/0/310121/2d2dcb77-48cf-ab8c-8aa7-3e77d91d3646.png)

まず、こちらのXD公式ページです。情報の起点としてまず押さえておきたいところです。XDって何？という人もここから始めます。
https://www.adobe.com/jp/products/xd/resources.html

さて、次に見てみるのはこちら。
![スクリーンショット 2018-12-07 12.57.27.png](https://qiita-image-store.s3.amazonaws.com/0/310121/567d17ca-7b01-c63f-3726-8bd1b241c0d4.png)
APIリファレンスやサンプルへのアクセスがここから可能となります。ブックマークを忘れずに。
https://adobexdplatform.com

ちなみに、すでにプラグインサブミットされてるよ〜な方は
https://console.adobe.io/plugins

![スクリーンショット 2018-12-07 13.00.47.png](https://qiita-image-store.s3.amazonaws.com/0/310121/72828c01-eff8-aeaa-4be9-922ccd62779b.png)

こんな感じですね。右上のNew Pluginをクリックすると新しいプラグインの登録ができます。詳しくは以下のAdobe Forumのドキュメント（日本語）をチェックしてください。
https://forums.adobe.com/community/international_forums/japanese/automation/blog/2018/10/15/xdプラグイン開発


あと、XDの開発関連の公式GitHubが以下になります。https://adobexdplatform.com と合わせてチェックしておくことをおすすめします。
https://github.com/AdobeXD/

質問は以下のフォーラムを利用すると良いでしょう。
https://forums.adobexdplatform.com

英語が苦手だという方は
https://forums.adobe.com/community/international_forums/japanese/automation
こちらのJapanフォーラム、アプリケーション自動化総合フォーラムをご利用ください。

XDに関してはAdobe Developer Ecosystem Teamがかなりのスピードで開発を進めています。投げ込まれたissueやプルリクに対しても反応が早いです。こまめにチェックしましょう。
fitbitを活用して睡眠を良い感じにコントロールするアプリが作れるか設計してみた


・　日々、パフォーマンスを最大限に発揮し、残業を限りなく0にして時間的自由を手に入れる。
・　美容・健康の維持増進をする（睡眠時間が短いと太りやすいとも言われますし）
・　単にスッキリ目覚めたい！

そんな方々のお役に立てるかもしれない目覚ましアプリ（Android or iOS）が作れるか設計してみました。
本投稿では、実際にプログラミングまでは行なっていませんのでご了承ください。
（作り込もうとすると、非常に時間がかかりそうな予感 [特にテスト] がしたので。。。悪しからず。。。）

「へ〜、fitbitを活用すると、こんな事も出来る（かもしれない）んだ〜」

くらいの軽い気持ちで読んで頂き、ご参考になれば幸いです。

## 利用するfitbit API
・GetSleepLogs API
[API仕様はこちら](https://dev.fitbit.com/build/reference/web-api/sleep/)

## アプリの設定項目
####　起床目標時間
ピッカー等で入力させ、ストレージに値を保存しておく。

####　睡眠目標時間
こちらもピッカー等で入力させ、結果をストレージに保存する。
選択肢は９０分単位で「9時間、7.5時間、6時間」。
ロングスリーパーやショートスリーパー向けに10.5時間、4.5時間を用意しても良いが
選択時にアラートで警告を出す。

## アプリの機能概要
####　自動睡眠促し機能
起床目標時間と睡眠目標時間から逆算し、就寝時刻の2時間前からnotification通知を始める。
（そろそろ、寝る時間ですよ〜）

通知タイミングは、就寝時刻の2時間前、1時間前、1時間後。
もし、使用者が「寝た判定」された場合は、通知は行わない。

####　寝た判定機能
fitbitは「必要に応じて 15～30 分毎に自動的に同期」されるらしい。（[参考](https://help.fitbit.com/articles/ja/Help_article/1877#HowOften)）
よって、アプリは定期的にfitbit web apiをリクエスト（ポーリング）し、睡眠に入ったかを判定する方式とする。

具体的には、GetSleepLogs APIの [date] に本日の日付 [yyyy-mm-dd] を設定して10分間隔でリクエストする。

レスポンスJsonの "sleep" 配列のオブジェクトをチェックし、
"isMainSleep": true となるオブジェクトが存在していれば「寝た」と判定する。

「寝た」と判定されたら、レスポンスJsonの "startTime" と　睡眠目標時間 を加算し
暫定起床時間 とする。もし、 暫定起床時間 が 起床目標時間 を超える場合は
（ちょっと可哀想だが、遅刻したら大変なので） 暫定起床時間 を 起床目標時間 に差し替える。

暫定起床時間 が決まったら、ポーリングは停止する。

####　自動起こし機能
暫定起床時間 の1時間前から、 GetSleepLogs APIのポーリングを再開する。
"isMainSleep": true となるオブジェクトの "levels.data" 配列内の
最新のタイムスタンプの"level"を取得し、前回の"level"と比較する。

1. "deep" -> "light" -> "rem" -> "wake" と順調に覚醒に向かっている場合は、アラーム等は鳴らさない。
2. "light" -> "deep" など、眠りが深くなる変化の場合は、アラーム等は鳴らさない。
3. "wake" -> "rem" と変化したら、アラーム等を鳴らす。（睡眠が深くなりそうなので、浅いうちに起こして目覚めスッキリ！）
4. 1 or 2 において、 暫定起床時間 に到達してしまったら、スマホのアラーム等を鳴らす。

## fitbitは、実際に寝ていた時間を取得できる！？
ここまでは、もしかしたらfitbitを使わなくてもスマホの加速度センサー等々をフル活用すれば出来るかもしれません。
fitbitのすごいところ（というか筆者のお気に入りの機能）は、「ベッドに寝そべっていた時間」と「実際に寝ていた」時間が区別できる点です。

例えば、6時間横たわっていたとしても、気温が適温でなかったり、その他の要因で睡眠が途中覚醒してしまう事があります。
自覚できる場合もあるでしょうが、意外と無自覚な途中覚醒もあります。
そうすると、「あれ〜、沢山寝たはずなのに、なんか寝た気がしないなぁ〜」といった事になるのではと（個人的には）思っています。

これを解決すべく、自動起こし機能にモードを１つ追加します。

####　自動起こし機能（実際寝た時間で起こすモード）
このモードがON（アプリの設定項目から選択してね）の場合、前述の1〜4に以下を加える。

5.　"isMainSleep": true のオブジェクトの minutesAsleep が 睡眠目標時間 を超えた場合、かつ、 "level" が "rem" or "wake" の場合は、アラーム等を鳴らす


## いかがでしたでしょうか
API仕様書に細かい記載が無いので、大いに想像が含まれていますがご了承ください。
いつか筆者が実際にアプリを作成し、設計の妥当性が判明しましたら追記等いたします。
Apache CamelのLive Reloadを使ってみた

# Live Reload機能とは

Apache Camelのrouteを定義したXMLファイルが変更されたら、自動でrouteをリロードする機能がありました。
調べてみたところ、2017年5月にリリースされたv2.19.0からあった。
全く気付いていませんでした。今までの苦労は一体・・・
以下、リリースノートから。

[Apache Camel 2.19 release notes](http://camel.apache.org/camel-2190-release.html) から抜粋

>Introduced ReloadStrategy as SPI which allows custom providers to implement logic for triggering live reloads of Camel routes.
>The  Camel Maven Plugin now allows to live reload route changes from XML files when running Camel. This can also be enabled from the Main class.

対応しているのはXML DSLの場合のみで、Java DSLには対応していません。Java DSLの場合は、Spring Boot DevToolsを使えばいいと思います（試してはいません）。


# Live Reloadを使ってみた

1秒ごとにログを出力するサンプルアプリをLiveReloadを試してみます。
以下にアニメーションgifを作成してみました。
（ScreenToGifを使った。これは直感で使い方も分かり便利）

![livereload.gif](https://qiita-image-store.s3.amazonaws.com/0/179607/a1559485-5aa0-9b27-86c1-211eb0219c1c.gif)

上のgifでは、最初に出力するログを変更してファイルを保存すると、routeがリロードされています。
次に、実行間隔を1秒から5秒に変更しています。


# 利用方法

メインプログラムです。
ファイルの変更を開始するディレクトリを監視するために以下のコードを追加します。

```java
main.setFileWatchDirectory("src/main/resources/META-INF/spring");
```

メインプログラム全体は以下のようになります。

```TestMain.java
package sample;

import org.apache.camel.spring.Main;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class TestMain {

	Logger logger = LoggerFactory.getLogger("sample.TestMain");

    public static void main(String[] args) throws Exception {
        Main main = new Main();
        main.setApplicationContextUri("META-INF/spring/camel-context.xml");
        main.setFileWatchDirectory("src/main/resources/META-INF/spring");
        main.run();
    }
}
```

次にcamel-context.xmlでrouteを定義します。
1秒ごとに「test」をログに出力する単純なrouteです。

```camel-context.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:camel="http://camel.apache.org/schema/spring"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
          http://www.springframework.org/schema/beans/spring-beans.xsd
          http://camel.apache.org/schema/spring
          http://camel.apache.org/schema/spring/camel-spring.xsd">

	<camelContext
		xmlns="http://camel.apache.org/schema/spring">

		<route id="mainRoute">
			<from uri="timer://run?delay=1000&amp;period=1000" />
			<log message="test" />
		</route>
	</camelContext>
</beans>
```

あとは、アプリケーションを実行して、camel-context.xmlを修正して保存すれば、最初にアニメーションgifで紹介したLiveReloadをお試しできます。

# 最後に

今までrouteを書き換えるたびにアプリケーションを再起動していたので面倒でしたが、これでようやく環境が整ってきました。（もっと早く知っていれば！）
ただし、routeをJava DSLで書いている場合は利用できないです。
XMLでごりごり書くのは最近流行りではないようなので、あまり使っている人はいないかもしれません。
今回はCamelスタンドアローンでLiveReload機能を試してみましたが、Camel Maven Plugin、Spring Bootでも利用できるようです。

# 参考

公式サイト - Camel Example Reload
https://github.com/apache/camel/tree/master/examples/camel-example-reload

Camel Live Reload of XML routes by JBoss Developer
http://planet.jboss.org/post/camel_live_reload_of_xml_routes
Atom で TypeScript の開発環境を構築する

[前回](https://qiita.com/koronpo/items/cc7d3a1aabb7900e1e8e) Angular 環境をしたので、引き続き Mac 環境での開発環境準備。

# Atom のインストール
Angular 開発用環境としてのエディタは使い慣れていればなんでも良い。僕は [atom](https://atom.io/) で。atom は新規インストール後の起動時にコマンドラインツールのインストールを促されるのでそのままインストール。  因みにエディタの他候補として試してみたのは以下。

- [Visual Studio Code](https://code.visualstudio.com/) -> 良い感じだったけど絶妙なところ（インデントやらコード補完の挙動）で馴染めず断念。単純に好みの問題。
- [WebStorm](https://www.jetbrains.com/webstorm/) -> なんか馴染めませんでした。これも単純に好みの問題。

という感じで、とりあえず普通に好みで選ぶことになるのかと。

# Atom に TypeScript のインストール
Angular 開発での推奨言語ということで Atom に TypeScript のインストール。を、しようと思ったのだがよくよく考えると Angular CLI を利用する場合は TypeScript のコンパイルは Angular CLI がやってくれるので Atom に TypeScript のインストールはしなくても良い。折角なので入れておきたい場合は以下手順で。  

Atom を開いて `⌘ + ,` で環境設定呼び出して `Install` の項目から `TypeScript` で検索すると `atom-typescript` が出てくるのでそこからインストールでも良いし、ターミナルで以下でも良い。

```
apm install atom-typescript
```

余談ですが TypeScript は単純なところで

- クラス構文が書ける
- 静的型付け

な点が便利で、コンパイルすると Javascript を生成してくれる訳ですが、最終的に js を吐いているというのはなかなか荒技だなぁと思っていたところ、その流れを [@oishi](https://twitter.com/oishi) さんとの雑談で「ゴミを綺麗に分別して最後に纏めて焼却している感じ」という表現を聞いて、神表現かよっ、と衝撃を受けました（誤解の無いように補足しておきますと TypeScript を dis っているという訳でなくあくまでも単なる面白雑談ということで^^:）。

# 静的コード解析ツールのインストール
静的コード解析がないと普通につらいのでインストール。

## Linter のインストール
静的コード解析ツールの親玉。TypeScript のインストール時同様に環境設定の `Install` の項目から `Linter` で検索、もしくは、ターミナルで以下。

```
apm install linter
```

因みに親玉候補として [Atom-Lint](https://atom.io/packages/atom-lint) というのもあるらしいが使ったことが無いのでどちらが良いのかは不明。

## tslint のインストール
Linter だけだと TypeScript を解析出来ないのでインストール。

```
apm install linter-tslint
```

## Atom 再起動
Linter と tslint を入れたら `⌘ + Q` で Atom を再起動。再起動後 Atom 上で Linter の各種表示に必要な

- [linter-ui-default](https://atom.io/packages/linter-ui-default)
- [busy-signal](https://atom.io/packages/busy-signal)

を入れるかダイアログが出るので Yes を選択して入れる。

## 設定ファイルとか
tslint を動作させる場合、解析ライブラリと解析ルールの json ファイルが必要。Angular CLI を利用する場合は `ng new [アプリ名]` で生成されるファイル一式に含まれるので基本的には意識しなくて良い。Angular CLI を抜きにして考えたい場合は [このあたりの記事](https://qiita.com/Sugima/items/113eb16f14ca1e9a6d0f) を参照。

# scss を使う場合で Linter 使用
scss を使う場合で linter を使用したい時の手順。

## scss_lint のライブラリインストール
Ruby が必要だがデフォルトで入っているもので問題無いのでターミナルで Ruby のコマンドを実行。

```
sudo gem install scss_lint
```

## linter-scss-lint をインストール

```
apm install linter-scss-lint
```

## 解析ルールファイル
scss の解析ファイルは yml 形式のファイルになる。とりあえず [ここ](https://github.com/brigade/scss-lint/blob/master/config/default.yml) の内容をコピペして Angular CLI で作成したアプリケーションのルートディレクトリに `.scss-lint.yml` というファイル名で設置。解析ルールを細かく調整したい場合は [こちら](https://gist.github.com/takuhito-h/71b88065ed43dbcee6f2) を参照。


# 他 Atom パッケージ
入れておくと便利パッケージメモ。また改めて纏めようと思いますがとりあえず思いついたものを。

- [atom-sublime-select](https://github.com/bigfive/atom-sublime-select)  
短形選択の挙動追加プラグイン。挙動は[ここの記事](https://qiita.com/gogotanaka/items/976900280ddf3ae527a7)参照。
- [platformio-atom-ide-terminal](https://atom.io/packages/platformio-ide-terminal)  
Atom の画面でターミナル呼び出し。

とりあえず以上で Angular * Atom の最低限の環境は出来たはず。  
次は [GrapeCity の Wijmo の入れ方を整理](https://qiita.com/koronpo/items/0e982da69182694741b8) しようと思います。

2020/01/28 タイトルを「Angular 開発用環境として Atom を利用する」から「Atom で TypeScript の開発環境を構築する」に変更いたしました。
Macでansibleをサクッと試してみよう

[鹿児島大学生 Advent Calendar 2018](https://qiita.com/advent-calendar/2018/kadai) ということで[鹿児島大学アプリ開発サークル](https://www.k-appdev.com/)の[@gakutomo](https://twitter.com/gakutomo)が投稿させていただきます。
最近paypayのキャッシュバックキャンペーンを利用してMacbook Proを購入したので、ansibleで環境構築の自動化に取り組んでみました。その備忘録と、ansibleで自動化やってみたい！という方のための手始め記事を書いてみたいと思います。

# 初期設定
まずansibleを導入します。brewを使うのがいいと思います。 

```
brew install ansible
```

# さっそく動かしてみよう
ansibleのインストールが終わったら早速試してみましょう。下記のファイルを作成してください。

```yaml:main.yml
- hosts: localhost
  connection: local
  tasks:
    - name: Enable Tap to Click
      osx_defaults: domain=com.apple.AppleMultitouchTrackpad key=Clicking type=int value=1
```

ファイルを作成したら以下のコマンドで実行です。

```
ansible-playbook main.yml
```

これはMacのシステム環境設定→トラックパッド→タップでクリックの設定を行ってくれるタスクになります。実行後ログインしなおすと適応されます。  
いちいちGUIで設定するの面倒だったんで楽チンです。こんな感じでタスクとして設定したい項目を追加していきます。

# その他サンプル
先程作成した**main.yml**のtasks以下に追記してみてください。
## brewパッケージのインストール

```yaml
- name: install homebrew packages
  homebrew:
    name:
      - git
      - go
      - hugo
      - nkf
      - nodebrew
      - rbenv
      - ruby-build
      - tree
      - wget
      - zsh
```

## GUIアプリケーションのインストール
```yaml
- name: install homebrew cask packages
  homebrew_cask:
    name: "{{ item }}"
  with_items:
    - docker
    - google-chrome
    - virtualbox
    - visual-studio-code                            
```

# 最後に
今回はかなりシンプルな構成で説明してみました。これらはansibleの機能のごく一部に過ぎませんが、なんとなく概要が掴めたでしょうか。自分好みの設定ファイルを作って快適な開発環境をサクッと構築できるようにしたいものですね。
LTVは三重県のTV局ではなくて、「顧客生涯価値」のこと

# はじめに

Adventカレンダー「エンジニアのためのWebマーケティング」の8日目です。
サクッと読める記事を目標に。異論・ツッコミ大歓迎。
できるだけ専門用語を使わないように気をつけます。

それでは参りましょう

# LTV とは

最近マーケティング界隈でよく言われるこの言葉。
みなさんも耳にしたことがあるかもしれません。
LTVは **L**ife **T**ime **V**alueの略です。日本語でいうと「顧客生涯価値」になります。

簡単に言うと、
**「お客さんが人生で自分の商品・サービスにどれだけ金額を使うか」**
の指標になります。

## 言い換えると 「末永くご愛顧頂いている指数」

LTVを構成しているのは、
**購買単価 × 購買頻度 × 利用継続期間** になります。
つまり、どれだけ長い間継続してお金を払っていただいているか、です。

例えば、
1冊260円のジャンプを毎週購入する人が、それを5年間続けた場合。
260（円） × 52（週） × 5（年）となり、
**LTVは、67,600円**となります。

1回1冊の購入額は低くても、末永くご愛顧いただくことで大きな利益を生み出してくれることを表しています。

## LTVが高い＝顧客がファン化している率が高い

お客さんが定期的にお金を使い、それが長く続いているということは、商品・サービスを気に入ってもらえている可能性が高いです。

言い換えるなら、お客さんに商品・サービスに対して愛着を持ってもらえれば、LTVは高まっていきます。ということは、お客さんに商品・サービスを何より気に入ってもらうことがビジネスに於いてはとても大事になってきます。
まあ、アタリマエのことではあるのですが。

# よく分かる事例

## Adobe Systemsのビジネス転換

**Photoshop**や**Illustrator**で有名なAdobe Systemsは、
昔から「Creative Suite」という買い切り型の利用形態を展開していました。

この買い切りモデル、一回買えばずっと使える便利なものではあったのですが、値段は安いとは言い難く、「非常に高価なツール」というイメージがどうしても付きまとっていました。

実際に筆者も昔、2005年に発売されたCS2というVersionの製品を、2008年頃に安く買ってずっと使っていました。バージョンアップ版がその間に幾度も発売されましたが、「新しくまた買うか！」とはなかなかなりませんでした。

## Creative Cloudの登場

そんな買い切りビジネスのAdobeは、2012年5月から「Creative Cloud」というサブスクリプションモデルの利用形態をスタートしました。

これは、毎月5000円ほどの金額を支払うことで、Adobeの製品を**何でも使っていい**ですよ！というものです。

ちなみに、当時その**何でも使える**製品を買い切り型の「Creative Suite」の方で購入した場合、なんと**40万円**ほどの値段がかかりました。なかなか買おうという気持ちにはなりにくいですよね。元を取るには何年かかるだろう？と思いますね。

でも、その40万が1ヶ月5,000円で始められるのであれば、買おうかな？という気になります、

## 実際にAdobeの売上は上がった

ここ数年のAdobeの業績グラフです

<img width="792" alt="capture 2018-12-08 4.57.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/72413/8f69fb87-3bc7-4303-48be-31547ce59060.png">
画像出典：[Stockclip](https://www.stockclip.net/companies/6754)

2012年以降、売上が年々大きく成長しているのがわかります。

**株価も上がりました。**

<img width="862" alt="capture 2018-12-08 4.58.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/72413/73e908e8-673f-ae0f-8cf2-9954b1e938e4.png">
画像出典：[Stockclip](https://www.stockclip.net/companies/6754)

左端が2013年12月。その時点では**$54(USD)**だったのが、5年後の今、2018年12月には**$250(USD)**まで上がっています。約5倍の成長。おそるべしです。

**購入頻度と利用継続期間**、さらには顧客の数そのものも増やすことにAdobeは成功します。

## ビジネスモデルの転換は、大きなターニングポイントになった

元々、クリエイターからは人気のあったツールではあったのですが、サブスクリプションモデルにすることによって、Adobeのビジネスは大成功しました。この転換によって、LTVの構成要素である「顧客単価」は確実に減少します。しかし、かわりに毎月支払ってもらうことによって、その他の構成要素である「購入頻度」はあがります。

さらに、お客さんは利用料を支払い続けることで、バージョンアップの恩恵も常に受けることができるようになりました。このことによって最後の要素である「利用継続期間」も長くなります。

Adobeの利用者は、Creative Cloudのファンがたくさんいるのです。

# これからは「開発費の回収」ではなく「サービスの利用料」へ

多額の商品代・サービス料を支払わなければ行けないビジネスでは、消費者がそもそもの購入に抵抗を感じる場合が多いです。その場合、新規顧客獲得のハードルはあがってしまいます。そして買わなくなる、買わなくなるからさらに高くなる。

住宅や車の購入、SIerへの開発発注がまさに買い切りビジネスの典型的なものにあたります。
買った時点で、顧客との関係性は終わり。次の購入がいつ来るのか予測するのはなかなか難しいです。LTVは少ないままになります。

それよりも、
**単価は低いけども、お客さんが長い間利用していく**ビジネスにすることがLTVを伸ばしていく工夫になるのかもしれません。**短い目で見るよりも、長い目で見ましょう、ということですね。**

逆に消費者の立場でみた場合、住宅とかだと賃貸料を毎月支払うほうがLTVは当然高くなるので、住む側の目線で見るのであれば、マイホームを買うのがお得なのかもしれません。

# どうでもいい話

Adobe Fireworksの更新がCS6の時点で止まっているのですが、意外と周りにこのツールを愛用している人が多く、ぜひともAdobeさんにはこのツールをアップデートしていただきたいなと思っております。


# おわりに

明日は、Web広告業界でよく言われる「コンバージョン」が一体何なのか、を解説します。

# 参考

* https://boxil.jp/mag/a1588/
Dart で PWA (4) Requestイベントをフックして独自処理

[前回](https://qiita.com/kyorohiro/items/bb7736ae86fc1113ca80)の続きです。

Index
(1) [Hello World PWA](https://qiita.com/kyorohiro/items/4ab34f17a5eec8ca811c)
(2) [Add to Home](https://qiita.com/kyorohiro/items/33303398bac6e2be0887)
(3) [Standard Web Notification](https://qiita.com/kyorohiro/items/bb7736ae86fc1113ca80)
(4) [Hook request and Do original processing](https://qiita.com/kyorohiro/items/d76c3cf96f4e76ae70ec)
(5) [Post message](https://qiita.com/kyorohiro/private/cbd6ed32d13b0fc43021)

Code
https://github.com/kyorohiro/memo_pwa_2018 


今回は、Requestイベントをフックして独自の処理を追加してみます。

Requestに応じてResponseを生成できるので、
やろうと思えば、 MVCフレームワーク的なものを ServiceWorker で完結することも可能でしょう。




# ServiceWorker 
https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API

書いている通りですが、PWAを実現している、オフライン化、Push通知などは、 ServiceWorker の機能です。

ServiceWorker は、　イベントドリブンな Worker ということで良いと思います。
https://developer.mozilla.org/en-US/docs/Web/API/Worker




# Requestイベントをフックして独自処理

https://github.com/kyorohiro/memo_pwa_2018/tree/master/02_new_response_with_dart


### [1] サービスワーカーを追加するだけのスイクリプトを書く
```dart:main.dart
import 'package:service_worker/window.dart' as sw;

void main() {
  if(!sw.isSupported) {
    print(">> service worker is not support ");
    return;
  }
  print(">> service worker is support ");
  sw.register("sw.dart.js");
}
```


### [2] Requestをフックする ServiceWorker を書く

```dart:sw.dart
import 'package:service_worker/worker.dart' as sw;

void main() {
  sw.onInstall.listen((sw.InstallEvent e){
    print("#>>on install");
    e.waitUntil(sw.skipWaiting());
  });

  sw.onFetch.listen((sw.FetchEvent e) {
    print("##>> fetch");
    Future<sw.Response> responseTask = new Future(() async {
      String path = e.request.url.replaceFirst(RegExp(r"(http|https)://[^/]*"), "");
      return new sw.Response.custom("### ${path}",status: 200,statusText: "OK");
    });
    e.respondWith(responseTask);
  });
}

```




## 確認

webdev serve --release 

として、サーバーを起動したあと、ブラウザーでアクセスすると

<img width="355" alt="スクリーンショット 2018-12-09 0.32.37.png" src="https://qiita-image-store.s3.amazonaws.com/0/54192/afba68a2-d435-9d90-8a3a-26eed7bee3aa.png">


Reload すると

<img width="328" alt="スクリーンショット 2018-12-09 0.30.43.png" src="https://qiita-image-store.s3.amazonaws.com/0/54192/f8b13ee9-3392-9e4b-778b-b1155086df42.png">


Request の Path を表示できます。





####  ref

2018年12月の時点の、動くように改造した物を、以下に起きましたしました。
https://github.com/kyorohiro/memo_pwa_2018
https://github.com/kyorohiro/pwa
https://github.com/kyorohiro/service_worker


# PS
https://github.com/isoos/pwa が masterブランチで、
一部、動かなかったので、フォークして修正しています。
https://github.com/kyorohiro/pwa

今回は、修正したものを使用しています。



## 次回
Notification とか ServiceWorker とか、
Dart で 実現する方法を紹介していきいます。
ConoHaとの出会いからこれまで～

#はじめに
この記事は「[ConoHa Advent Calendar 2018](https://qiita.com/advent-calendar/2018/conoha)」の第8日目の記事です．
技術的なお話は，あまり（というかほとんど）しません...　ただ，ConoHa愛を語るだけの記事です．

#ConoHaとの出会い

時期は忘れてしまったのですが，[オープンソースカンファレンス（OSC）](https://www.ospn.jp/)で知りました．2014年とかその辺りだった記憶があります．

当時，大学生で，学生団体の運営をしていたのですが，とにかく予算もお金もなかったものですから，活動を円滑に進められるようなオープンソースソフトウェアを探す旅をしていました．（大袈裟ですが...）

同時に，学生団体のメンバー募集も急務だったので，ホームページとかもなかったので，作ろうと思っていました．いろいろレンタルサーバーとか見たのですが，当時の私の知識ではあまり理解できませんでした．でも，凝った・映えるホームページが作りたかったので，少し操作を知っていたWordPressの無料版でホームページを作って使っていました．でも，当時の無料版って，できることが限られていて，プラグインが使えなかったり，ドメインの制限があったりと...　困っていたのですが，それでも使っていました．

もう１つ懸案事項があって，情報の共有でした．当時は，SlackとかLINE Worksとかあまり知らなくて，連絡もLINEよりはメールベースだったので，メーリングリストを使いたいと思っていました．ただ，フリーのメーリングリストって，広告が入ったり，定期的に広告メールが配信されたり，そういうのがあって使いにくいと思って導入していませんでした．

自前で，自作PCを使ってサーバを構築するのも考えましたが，運用コスト（パーツ代，電気代などなど...）から見送りしていました．

なので，自由度の高いホームページとメーリングリストサービスが必要でした．

そこで，話が戻りますが，OSCで企業ブースを回っていた時に，ひと際，水色のカラーを使ったブースがありました．キャラクター（後に，このはちゃんと知る）を前面に押し出したブースでした．そして，このはちゃん（当時は知らなかった）が，うちわ（夏だったので）とチラシを配っていました．もう，可愛くて仕方なかったので，喜んで受け取りました！笑

話を聞いてみると，ConoHaは，レンタルサーバーのサービスを行っていますという説明を受けたのですが，よくある共用サーバーなのかな？と思っていたら，VPSですと説明されました．当時，VPSって知らなかったので，よく分からなかったのですが，後でVPSにしておいてよかったと思うことになります．

用途としては，独自のホームページ（WordPress）とメーリングリスト（MailMan）を使いたいですというお話をしました．そうすると，構築すれば全然使えます．と言われました．（VPSなので当たり前ですね笑）

で，当時の料金プランがこちら！
![2018-12-08 (2).png](https://qiita-image-store.s3.amazonaws.com/0/311851/47860595-dfe1-e609-6ba4-33c2a09892e7.png)
↑こちらからお借りしました（https://www.slideshare.net/hironobusaitoh/conoha-vps）

当時，共用サーバやVPSって，試しに使ってみるとしても，初期費用が掛かったり，設定が難しかったりとあって，ハードルがあったのですが...　ConoHaは，

- 初期費用が掛からない
- 料金プランが明確
- 設定が難しくない（[薄い本が大活躍](https://conoha.mikumo.com/blog/5093/)）
- このはちゃんかわいい！　←　ここ大事！

だったので，割とノリと勢いで，ストレージも潤沢（ホームページのコンテンツとかメールサーバの添付ファイルとかが気になった）でそこそこリーズナブルなメモリ2GBプランを2台分利用させていただくことにしました．

そして，現在も現役で使っているのです...

#現役のコントロールパネル
現役のコントロールパネルをご紹介します！
まず，ログインですが，
![2018-12-08 (1).png](https://qiita-image-store.s3.amazonaws.com/0/311851/0ce1baf8-dde0-0c8a-8673-261f9062ba43.png)
現在，契約すると緑色のところに，メールアドレス，パスワードを入力してログインするのですが，私は，昔から使っているので，下の赤いところをクリックしてログインします．

でログインが完了すると，
![2018-12-08.png](https://qiita-image-store.s3.amazonaws.com/0/311851/85303438-beef-e312-a025-d02afe335c95.png)
これがコントロールパネルです！　もちろん，このはモードが搭載されています．かわいい！　この画像にはありませんが，ログアウトすると，このはちゃんが画面上部から出てきて引っ込むというギミックがついています．とてもかわいいです！

そんなこんなで，結構前から大変お世話になっているのであります... いつもありがとうございます．ConoHaってほとんど障害がなくて，ありがたいです！

#さいごに
ここまで記事をお読みいただくと，このはちゃんかわいい！ しか言ってないなって思われると思いますが，そういう記事なので笑
最近では，この旧コントロールパネルを使っているユーザはどの程度いらっしゃるのでしょうか？　新ConoHaは，ストレージがSSDになったり，APIが充実していたり，ConoHa Wingという新サービスが展開されたりと，どんどん進化しているようです．そういったサービスにも興味がありますが，初期からConoHaとこのはちゃんに関わっていた印として，このコントロールパネルを使い続けていきたいなとそう思います．

このはちゃん，清楚・かわいい　です！
複数のGitHubアカウントの設定してSSH接続したが同じアカウント名が表示される

# 結論
複数のGitHubアカウントに対しssh接続するために公開鍵を登録する場合、`~/.ssh/id_rsa.pub`の公開鍵は登録しない方が良い。

# 状況
個人用のGitHubアカウントと、アルバイト用のGitHubアカウントがあって、sshでそれぞれのリポジトリにpushする。
アカウントの切り替えが面倒なので、出来るだけ`git push origin master`みたいな感じでアカウントの切り替えを気にせず作業を行いたかった。

# 自分の環境
macOS 10.14.1

# 設定
この場合の設定方法については先駆者様の記事がいくつかあって、要点をまとめると

 - 鍵を生成する
 - GitHubに公開鍵を登録する
 - `~/.ssh/config`に必要事項を書き込む
 - ローカルリポジトリのoriginアドレスを書き換える
 - 必要であればlocalのコミットユーザ名、メールアドレスを変更する

といったような感じである。
詳細はこの記事の管轄外なので、この情報を欲している人は各自検索してほしい。

正常に動作するかは`ssh -T [configのHost]`でチェックできる。
正常であれば、下記のようなレスポンスが期待される。

```
% ssh -T [configのHost(個人用)]
Hi [個人用アカウント名]! You've successfully authenticated、 but GitHub does not provide shell access.
% ssh -T [configのHost(仕事用)]
Hi [仕事用アカウント名]! You've successfully authenticated、 but GitHub does not provide shell access.
```


# 問題発生
ところが、自分の作業環境では

```
% ssh -T [configのHost(個人用)]
Hi [個人用アカウント名]! You've successfully authenticated、 but GitHub does not provide shell access.
% ssh -T [configのHost(仕事用)]
Hi [個人用アカウント名]! You've successfully authenticated、 but GitHub does not provide shell access.
```
と、仕事用のHostでssh接続しても個人用のアカウント名が表示される。
要するにどっちのHostでssh接続しても同じGiuHubアカウント名が表示されてしまうわけである。

# 解決

色々調べた結果、個人用アカウントのssh鍵に`~/.ssh/id_rsa.pub`を登録していたのが問題だったらしい。
どうやら、sshを実行するとまず`~/.ssh/id_rsa`を先に使用して認証し、次に`~/.ssh/config`を確認するようである。
> -i *identityファイル*
> 公開鍵認証の際にidentity (秘密鍵) を読むファイルを指定します。デフォルトは、プロトコル 1 の場合ユーザのホームディレクトリにある~/.ssh/identity、プロトコル 2 の場合は~/.ssh/id_dsa ,~/.ssh/id_ecdsa ,~/.ssh/id_ed25519および~/.ssh/id_rsaになっています。identity ファイルは設定ファイルによって、ホストごとに指定することもできます。
> [ssh 日本語マニュアルページ](https://euske.github.io/openssh-jman/ssh.html)

つまり、configに書いた仕事用の設定が適用される前に、先に個人用の鍵で認証がなされていたようだ。
なので、個人用は個人用で新しく鍵を生成して、GitHubに公開鍵を登録し直したところ、期待されたレスポンスを得ることができた。


# 補足
上記の引用はそれっぽいのですが、configをチェックする前に`~/.ssh/id_rsa.pub`でサーバに認証するかは書かれていないので正確ではありません。
しかし該当箇所は見つからず、かつ挙動はどう考えても推測したものであるため，ここではそうだと仮定しています。
開発環境としてのheroku

この記事は [heroku Advent Calendar 2018](https://qiita.com/advent-calendar/2018/heroku) 8日目の記事です。

# 開発環境としてのheroku
githubなどを使っているときに、実際の動作をレビューしようとするとローカルの開発環境にpullしたりして面倒ですよね

というわけでherokuで簡単にレビューできる環境を整えましょう

## Heroku Review Apps
https://devcenter.heroku.com/articles/github-integration-review-apps

githubのプルリクエストの内容で自動的にアプリを立ち上げてくれる機能です

この機能を使用することでプルリクエストを送るだけでコードと動きのレビューができるようになります

環境変数なども開発環境のものに設定できるのでとても便利です

## Heroku CI
https://devcenter.heroku.com/articles/heroku-ci

CIにおいてもherokuで完結できます
設定方法もapp.jsonに記述するだけなのでわかりやすく簡単です

```json
{
  "environments": {
    "test": {
      "scripts": {
        "test": "phpunit"
      }
    }
  }
}
```

## Docker
https://devcenter.heroku.com/articles/container-registry-and-runtime

Dockerイメージのデプロイも可能です
ローカル開発環境をそのままデプロイできるのも便利ですね

## まとめ
レビューをするためだけでもherokuを利用することでとても便利になります
ぜひこれらの機能を利用して楽で管理しやすい環境を整えてください
arduinoによるインバータ制御

#概要

3相モータをarduinoで制御するにあたって、楽に安全に制御をする事を考えインバータを使用をして制御をすることにした。

#モータの違いに関して
3相モータは交流電動機(ACモーター)というもので、ミニ四駆等で使っている直流電動機（DCモータ）とは違うため各違いを記載する。
・DC
速度制御：PWM制御で電圧を変える
メリット：必要機器が少なくできる。
デメリット：負荷が強いと回転数に影響を与える→電圧を変えるため
　　　　　　モータが消耗し易い箇所がある（整流子とブラシ）
・AC
速度制御：周波数を変える
メリット：負荷による影響が少ない→電圧は一定のため
デメリット：必要機器が多い→周波数を発生させるため

構造的な違いで
DCモータにも消耗を抑えるためにブラシレスモータがあり
ACモータは、現在多く使われているインダクションモータ（誘導電動機）とよりロボットなど精度を求められる物に使うシンクロナスモータ（同期）がある。


各DC,ACモータの原理を動き付きで紹介している方のページ
DCブラシレスとAC同期モータの回転原理
http://www.geocities.jp/kin79e/private/pm.html


#インバータに関して
インバータとは、周波数を変え、ACモータの速度を変更できる機械である。
この機械が、半導体技術が発展しコンパクトで安くなったため、産業業界では直流モータから交流モータに変更されていったそうである。
過電流防止や、それでもダメな場合用のヒューズも入っており、取り付けることで安全面も高くなる。
インバータ自体にもボリュームがついており、それを回すことで速度を制御できる。現在は外部入力ができるようシリアル通信、LAN等のIOポートが付いており、外部操作や監視が出来るようになっている。
A/Dもあり電圧制御で速度を変えられるため、今回こちらを使用した。

中古品で買う場合産業用の２００V用製品が多く出回っており、１００V用製品は少ない。


#行ったこと
・使用機器
arduino
インバータ（東芝VFBC1S-1007p）
ACモータ

今回使用している物は、メジャーなACモータのインダクションモータで元々一定速度で回転している物を速度制御することにした。
元々電源に直結されており、3本の配線の内、1本に始動用コンデンサが繋がっているだけで速度制御ができなかった。

そのため、インバータにACモータからの3本の線をつなぎ、インバータのA/DポートにarduinoのPWM出力可能ピン１１に繋ぎ
５Vと０Vを5秒ごとに切り替えるプログラムを作り、インバータ側は５Vの時マックススピード、0Vでストップに設定し動作することを確認した。

```

const int inverter_pin =11;//インバータのピン名を付ける

void setup() {
pinMode(inverter_pin, OUTPUT); 
}

void loop(){
                analogWrite( inverter_pin, 255 ); //5V出力
                delay(5000);

                analogWrite( inverter_pin, 0 );//0V出力
                delay(5000);
        }
```


#もし同じインバータを使用する人がいた時用メモ
・東芝VFBC1S-1007p
手動モードも考え、arduino制御、インバータボリューム両方で操作できるモードにした。

・インバータ側必要な設定項目
応用運転したいとき
(8)電圧・電流と内部ボリューム切換設定(P９７/１３９)
F00d:4
F113:38　拡張パラメータから変更可能（S1の動作のセットアップ）


F203の％を１００％から４５％に変更し最大5V入力で６０HZ運用にする
（P７３）

・接続確認方法
スイッチは、モニター入力端子の状態から確認
（P99）
Laravelのルーティングの基本

ドットインストールのLaravel 5.5入門 (全31回)を受講して、簡単なブログアプリを作成できるようになりました。
今回は、基本となるルーティングの仕組みについてアウトプットしていきたいと思います。

####ルーティング
Laravelのルーティング機能は、ウェブアプリを効率的に開発することができて便利です。
ルーティングとは、どのURLにアクセスしたときにどんな処理をするかを設定することです。
今回は、投稿した記事の削除機能を例にご紹介します。

```web.php
Route::delete('/posts/{post}', 'PostsController@destroy');
```

deleteの部分がルート定義であり、これはHTTP動詞に対応しています。
（例）GET：データを取得　POST：データを追加　PUT：データを更新
'/posts/{post}'にアクセスしたら、PostsControllerファイルのdestroyメソッドを呼び出せというルーティングです。
web.phpにメソッドを全て書いてしまうと、コードが膨大になるため、このように別のファイルにメソッドを書きます。

コントローラーファイルはターミナルから生成します。

```
$ php artisan make:controller PostsContoroller
```


```PostsController.php
  public function destroy(Post $post) {
    $post->delete();
    return redirect('/');
   }
```

コントローラーファイルには、記事とコメントを削除する命令と自動的に元のページに遷移する命令を書きます。


以上がルーティングの基本の流れです。
ご覧いただきありがとうございました。
railsのselectフォームでdisabled指定できなかったとき

#詰まったこと
railsでselectフォームを非活性にしたくて公式見に行ったら
![スクリーンショット 2018-12-08 2.38.06.png](https://qiita-image-store.s3.amazonaws.com/0/281558/4f5859d4-0723-ecc4-eb12-7957e3461fe1.png)
オプションに ```disabled```をつけてくださいとのことだったので

```haml:_form.html.haml
%h3= f.label "学部・学課選択"
= f.collection_select :department_id, Department.all, :id, :name, disabled: true
```
ってやったんだけど、、、
<img width="229" alt="スクリーンショット 2018-12-08 2.47.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/281558/d156e33a-4465-fcf6-9a73-51913c6c4bae.png">
めっちゃ普通にいじれちゃう、、、ってなりました。
検証で見てみても
![スクリーンショット 2018-12-08 2.50.06.png](https://qiita-image-store.s3.amazonaws.com/0/281558/5b245629-083b-2e64-2b3f-3243514350a3.png)
やっぱりdisabledが付いてる気がしない、、、

#解決方法
```haml:_form.html.haml
%h3= f.label "学部・学課選択"
= f.collection_select :department_id, Department.all, :id, :name, {}, disabled: true
```
結果としては空の引数を1つ渡してあげればいけました。
こうすると、クリックしても動かない非活性の状態になります
![スクリーンショット 2018-12-08 2.51.05.png](https://qiita-image-store.s3.amazonaws.com/0/281558/baa0da4e-f7cf-c6f2-0939-35275124c952.png)
画像だとわかりにくいので改めて検証で見てみると
![スクリーンショット 2018-12-08 2.51.14.png](https://qiita-image-store.s3.amazonaws.com/0/281558/ecc8c265-f219-5e15-e7e9-2cefc92e5def.png)
こんな感じでちゃんとdisabledのオプションが付いていることがわかります。


#原因
改めて公式を見てみると
```collection_select(オブジェクト名, プロパティ名, オブジェクトの配列, value属性の項目, テキストの項目 [, オプション])```
となっていて、collection_selectのオプションはヘルパーメソッドの第6引数として渡していることがわかります。
ですが、最初の実装だと第5引数のところにオプションをのdisabledをつけてしまっていたのでうまく作動しなかったようです。


#まとめ
忘れがちだけどrailsのform_forとかってあくまでrailsのhelperメソッドで
```メソッド名（第1引数, 第2引数,　・・・）```　
っていうのが勝手に定義されててそれを使ってるわけだから、引数渡すタイミング考えてあげないとそりゃちゃんと動かないよな笑
表の特定列のデータ(英語)を翻訳して結果をファイルに出力

接続先のデータベースはOracle Database。
py-translatorとcx_Oracleを使ってやってみた。


# 準備
## py-translatorのインストール

[py-translator を使ってみる](https://qiita.com/mikika/items/b2c6a4824b0107e39a4e)


## cx_Oracleのインストール


https://oracle.github.io/python-cx_Oracle より引用

>About cx_Oracle

>cx_Oracle is a Python extension module that enables access to Oracle Database. It conforms to the Python database API 2.0 specification with a considerable number of additions and a couple of exclusions.

[Installation](https://cx-oracle.readthedocs.io/en/latest/installation.html#installing-cx-oracle-on-linux)に掲載されている手順を実行。（以下を実施した）

### cx_Oracleインストール

```
$ pip install cx_Oracle
```

### Oracle Instant Clientのインストール

別途ダウンロードしたInstantClient(公式手順にリンク有)を/opt/oracleに配置しunzip

```
$ mkdir -p /opt/oracle
$ cd /opt/oracle
$ unzip instantclient-basic-linux.x64-18.3.0.0.0dbru.zip
```

### libaioのインストール

```
$ sudo yum install libaio
```

### 環境変数に追加

```$HOME/.bash_profile
export LD_LIBRARY_PATH=/opt/oracle/instantclient_18_3:$LD_LIBRARY_PATH
```

### 確認

```
$ python
Python 3.6.7 (default, Nov 15 2018, 16:29:08) 
[GCC 4.8.5 20150623 (Red Hat 4.8.5-28)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import cx_Oracle
>>> cx_Oracle.clientversion()
(18, 3, 0, 0, 0)
>>>
```

インストールしたInstant Clientのバージョン(18.3)を返している。
 

# 実行

## 表の特定列のデータ(英語)を翻訳して結果をファイルに出力する

大福帳形式でデータを持っていたので、集計してから翻訳
※count(1)はそれぞれの件数を知りたかったので一緒に出力

```実行する.SQL
select 英語の列, count(1) from 表 group by 英語の列 order by count(1) desc
```

このSQLの結果セットのカーソル内でpy_translatorを使って翻訳。
以下、★のところ(2か所)を環境に合わせて編集して実行。この例ではlargetable表のprofession列を翻訳。
※sleepを入れたのは、短時間にtranslateしすぎるとエラー（ブロックされるっぽい？）になったので。

```t.py
import cx_Oracle
import os
import csv

from time import sleep

from py_translator import Translator
translator = Translator()

# ★翻訳したい列名と、そのテーブル名を指定
col = 'profession'
tab= 'largetable'

# 出力ファイル名
filename= 'translate_' + col + '.csv'
f = open(filename, 'w')
writer = csv.writer(f, lineterminator='\n')

os.environ["NLS_LANG"] = "JAPANESE_JAPAN.AL32UTF8"

## ★接続先のOracle Databaseに合わせて編集
conn=cx_Oracle.connect(user='username', password='passwd', dsn='192.0.2.2/PDB1servicename.xxxx')

sql='select ' + col + ', count(*) from ' + tab + ' group by ' + col + ' order by count(*) desc '
print (sql)

csvlist = ['ID','ORIGINAL','TRANSLATED','NUM_COUNT']
writer.writerow(csvlist)

print('Now Processing...')
cur = conn.cursor()
seq = 1
for row in cur.execute(sql):
    sleep(5)
    # ↑↑↑重要

    csvlist = []
    csvlist.append(seq)
    csvlist.append(row[0])
    csvlist.append(translator.translate(text=row[0], dest='ja').text)
    csvlist.append(row[1])

    # ファイルに出力
    writer.writerow(csvlist)

    seq += 1
    print('.', end="", flush=True)
f.close()

print('¥nTranslation Completed')
print('Output File Name:', filename)
```

## 結果

出力ファイルから、今回試した profession列(職業を示す)の、ORIGINAL(元の値), TRANSLATED(日本語訳)がわかる。

```
$ python t.py

$ cat translate_profession.csv
ID,ORIGINAL,TRANSLATED,NUM_COUNT
1,Programmer/Developer,プログラマ/開発者,137
2,IT Staff,ITスタッフ,89
3,Nurse,ナース,54
... (略）...
```
UnityのProjectのRepositoryを作成する場合は、.gitignoreを追加するべき

初めまして、電車君です。
Qiita初投稿です。
普段はHatenaBlogの方で記事を書いています。
http://densyakun.hateblo.jp

今回の記事の内容は、
UnityのProjectのRepositoryを作成する場合は、.gitignoreを追加するべき、
という内容になります。

#.gitignoreとは
.gitignoreとは、gitリポジトリに不要なファイルを記載して、コミットする際に除外するファイルを記載するファイルのことです。

Unityには、コミットする必要のないファイルが存在するため、Unity用の.gitignoreをUnityプロジェクトのあるgitリポジトリに追加することをおすすめします。
公式では推薦されていませんが、実際に.gitignoreを追加しても問題はありません。
.gitignoreを追加しないと、UnityEditorのレイアウトなどの情報までも追加されてしまい、少し弄るだけでファイルが変更されてしまいます。

# .gitignoreの注意点
**.gitignoreは追加してから除外されるため、.gitignoreを追加する前に除外対象をコミットしている場合は、除外対象は自動で削除されないため、手動で削除する必要があります。**
（もしかしたら、もっと便利な方法があるかもしれません）

# GitHubが公開しているUnityプロジェクト用の.gitignoreファイル
Unity用の.gitignoreはGitHubから公開されているものがあります。
https://github.com/github/gitignore/blob/master/Unity.gitignore
こちらを使うことをおすすめします。
こちらを使う場合は、.gitignoreファイルをダウンロードして、gitリポジトリに入れて、ファイル名を「.gitignore」に変更してから、コミットしてください。
なお、ファイル名を変更しない場合は、Gitクライアントから除外設定ファイル（.gitignoreファイル）を設定してください。

今回は以上です。ありがとうございました。
laravel LengthAwarePaginatorで独自ペジネータ作成

# はじめに 

一番簡単な方法は、クエリビルダとEloquent queryへpaginateメソッドを使う方法ですが、
今回は、渡された配列を元にして、ペジネーションインスンタンスを作成して見ました。
誤った書き方や理解の仕方をしていた場合は、ご指摘いただきますと幸いです！

laravelのバージョンは5.6です。

# 出来上がりイメージ

よく見るデザインに仕上げてくれます。

![alt](https://qiita-image-store.s3.amazonaws.com/0/320026/94c2e4ed-7969-660e-9b9b-23c0fe5cc98c.png)

# 実装

- `getItemCollectionPaginator`　の引数にある`＄requestUrl`と`＄currentPageNo`は
リクエストから現在のページとリクエストURLをController側で受け取ってきたものになります。

- `self::DISPLAY_ITEM_FOR_PAGENATION`　でリストの最大表示件数を決めています。

- `$this->itemRepositoryInterface->getItemCollection()->toArray()`は
リポジトリパターンを利用し、画面に表示するデータを配列で全件取得しています。

- そして本題である`LengthAwarePaginator`の引数には下記のデータを引数に与えます。
    - 1ページに表示するデータ※1
   
    -  全てのページを合わせた全件数

    - 1ページに表示する数

    - 現在のページ番号

    - ページネーション押下時のURL

     ( ※1 ぺジネーターに渡す結果の配列を自分で"slice"する必要があるため、
       array_chunkメソッドを使って配列を分割しています。)

```php:TopService.php
    /**
     * @param string $requestUrl
     * @param string $currentPageNo
     * @return LengthAwarePaginator
     */
    public function getItemCollectionPaginator(string $requestUrl, string $currentPageNo = null): LengthAwarePaginator
    {
        //配列を1ページに表示する件数分分割する
        $displayData = array_chunk($this->itemRepositoryInterface->getItemCollection()->toArray(),
         self::DISPLAY_ITEM_FOR_PAGENATION);

        //ページがnullの場合は1を設定
        if (is_null($currentPageNo)) {
            $currentPageNo = 1;
        }
         
         return new LengthAwarePaginator(
                    $displayData[$currentPageNo-1], //該当ページに表示するデータ
                    count($this->itemRepositoryInterface->getItemCollection()->toArray()), //全件数
                    self::DISPLAY_ITEM_FOR_PAGENATION, //1ページに表示する数
                    $currentPageNo, //現在のページ番号
                    ['path' => $requestUrl] //URLをオプションとして設定
                );
    }
```

- 最後にペジネーション結果の表示はbladeで以下のように実装します。

linksメソッドで結果の残りのページヘのリンクをレンダーしています。

```html:index.blade.php

@if($paginator->total() > 0)
<nav aria-label="ページネーション">
<div class="pagination mx-auto my-4">
  {{ $paginator->links() }}
</div>
</nav>
@endif

```

paginateメソッドを呼び出す場合
Illuminate\Pagination\LengthAwarePaginatorインスタンスを受け取っており、
結果を表す多くのメソッドが提供されています。

結果を取得したらその結果とページリンクをBladeを使って表示できます！

# まとめ

初期表示時時に1ページ目が表示されて欲しかったのですが、
初期表示時のページ番号はnullで入ってくるため
nullの場合は無理やり1ページ目としている部分がどうにかできないかなと
思っています。。

リクエストの受け取り方や配列の分割方法も改善できそうなので
何かアドバイスがあればいただきたいです！
pyenvでpython3.7.1のインストール時にOpenSSL関連のエラーが起こったときの対応メモ


自分用メモ書きです。(原因の究明とかはしてません)
Scrapboxからコピペして軽く整えただけなのでガタガタですごめんなさい。
(いい感じのConverter作って欲しい…)

## 環境
OS: `OSX 10.14`
shell: `fish`

## 内容
`<USER_NAME>`で伏せてあります。

```
 $ pyenv install 3.7.1
 WARNING: Please make sure you remove any previous custom paths from your /Users/<USER_NAME>/.pydistutils.cfg file.
 python-build: use openssl from homebrew
 python-build: use readline from homebrew
 Downloading Python-3.7.1.tar.xz...
 -> https://www.python.org/ftp/python/3.7.1/Python-3.7.1.tar.xz
 Installing Python-3.7.1...
 python-build: use readline from homebrew
 WARNING: The Python bz2 extension was not compiled. Missing the bzip2 lib?
 WARNING: The Python readline extension was not compiled. Missing the GNU readline lib?
 ERROR: The Python ssl extension was not compiled. Missing the OpenSSL lib?
 
 Please consult to the Wiki page to fix the problem.
 https://github.com/pyenv/pyenv/wiki/Common-build-problems
 
 
 BUILD FAILED (OS X 10.14 using python-build 20180424)
 
 Inspect or clean up the working tree at /var/folders/rs/108hnn390c78m9xl5_4sjsj00000gn/T/python-build.20181208004703.47142
 Results logged to /var/folders/rs/108hnn390c78m9xl5_4sjsj00000gn/T/python-build.20181208004703.47142.log
 
 Last 10 log lines:
 			install|*) ensurepip="" ;; \
 		esac; \
 		 ./python.exe -E -m ensurepip \
 			$ensurepip --root=/ ; \
 	fi
 Looking in links: /var/folders/rs/108hnn390c78m9xl5_4sjsj00000gn/T/tmpifms82py
 Collecting setuptools
 Collecting pip
 Installing collected packages: setuptools, pip
 Successfully installed pip-18.1 setuptools-40.6.2
```

## 対応

### エラー内容の中のURLを参照していかの対応をした
[https://github.com/pyenv/pyenv/wiki/Common-build-problems Common build problems · pyenv/pyenv Wiki]

```
$ set CFLAGS -I(brew --prefix openssl)/include
$ set LDFLAGS -L(brew --prefix openssl)/lib
$ pyenv install 3.7.1
```

しかしエラー内容は変わらず

### ここで別の対応を発見
[Python 3.7.0 :: The Python ssl extension was not compiled. Missing the OpenSSL lib? · Issue #1184 · pyenv/pyenv](https://github.com/pyenv/pyenv/issues/1184#issuecomment-419732096)


```
$ brew install 'openssl@1.1'
$ CONFIGURE_OPTS="--with-openssl=$(brew --prefix openssl@1.1)" pyenv install 3.7.0
```

### 結局

とりあえず`WARNING`(`WARNING: Please make sure you remove any previous custom paths from your /Users/<USER_NAME>/.pydistutils.cfg file.`)に対応することに…

```
$ rm /Users/<USER_NAME>/.pydistutils.cfg
```

無事インストール完了

```
$ pyenv versions
* system (set by /Users/kaito/.pyenv/version)
  3.7.0
```   

しっかりと削除してからインストールし直さなきゃダメですね…
pythonで音声ファイルを読み込む

#pythonでサウンドプログラミング
pythonでちょっとしたサウンド処理をするためのコードメモです。

#pythonで音声ファイルの読み書き
音声ファイルを開いて、読み込んで、そのまま書き込むだけのサンプルコードです。

```python
import wave
import struct
import array

inputfilename = "input.wav"
outfilename = "output.wav"

wr = wave.open(inputfilename, "rb")
n = wr.getnframes()
param = wr.getparams()
buffer = wr.readframes(n)
wr.close()

x = struct.unpack('%dh' % n, buffer)

y = []
for i in range(n):
    y.append(x[i])

ob = array.array('h', y).tostring()

ww = wave.open(outfilename, "wb")
ww.setparams(param)
ww.writeframes(ob)
ww.close()

````

##まとめ
ファイルを読み込んで、変数に取り込んで、書き込むプログラムです。