OmniAICreator/Qiita-1.07M huggingface dataset:
DeployGateの使いかた（テスター編）

今回は、DeployGateの使いかた（テスター編）として、テスターのかたがDeployGateにログインしてアプリをダウンロードする手順を紹介します。
DeployGateをつかってテストをするときにテスターのかたから「どうやってダウンロードするんですか？」と聞かれたときに活用してください。

## DeployGateにログイン

まず、DeployGateにログインします。

<img width="414" alt="001.jpeg" src="https://qiita-image-store.s3.amazonaws.com/0/38924/52f75157-e9fe-4d51-0bcb-9de4a7d6ebc1.jpeg">

ホーム画面にあるDeployGateアイコンをタップします。

アイコンがない場合は、iPhoneのSafariでつぎのURLを開きます。

[DeployGate](https://deploygate.com/login/iphones)

### すでにちがうアカウントでログインしている場合

すでにちがうアカウントでログインしていてアカウントを切り替える場合は、こちらの手順を実行します。まだログインしていなければここは飛ばして、つぎの「ログイン」を実行してください。

![003.png](https://qiita-image-store.s3.amazonaws.com/0/38924/e6dc5ffc-51cf-4fbc-377a-833f17718b40.png)

一番下にある「ユーザーを切り替える」ボタンをタップします。

![004.png](https://qiita-image-store.s3.amazonaws.com/0/38924/139ee573-727c-821d-3ad7-abbcca00fc83.png)

「ログアウトしてもよろしいですか？」画面が表示されるので、OKボタンをタップします。

### ログイン

DeployGateにログインします。

<img width="414" alt="002.jpeg" src="https://qiita-image-store.s3.amazonaws.com/0/38924/2987071e-935d-aa0b-c030-45ce0d7edc71.jpeg">

ログイン画面が表示されるので、登録済みのアカウントでログインします。

## DeployGateのプロファイルをインストール

DeployGateを使用するために、プロファイルをインストールします。

<img width="414" alt="005.jpeg" src="https://qiita-image-store.s3.amazonaws.com/0/38924/a0677ce0-5f6e-af79-bc60-e111d5395700.jpeg">

インストール画面が表示されるので、「DeployGateをインストール」ボタンをタップします。

<img width="414" alt="006.jpeg" src="https://qiita-image-store.s3.amazonaws.com/0/38924/a169ef8c-102c-6241-0bf0-47c5c0286813.jpeg">

確認画面が表示されるので、許可ボタンをタップします。

<img width="414" alt="007.jpeg" src="https://qiita-image-store.s3.amazonaws.com/0/38924/9232d9c9-ba68-8bbe-f5a1-8f237635e3ea.jpeg">

設定アプリが開いて、プロファイルをインストールする画面が表示されます。
インストールボタンをタップして、パスコードを入力します。

<img width="414" alt="008.jpeg" src="https://qiita-image-store.s3.amazonaws.com/0/38924/d1154d7b-bb7f-fb2f-c794-184995640da5.jpeg">

確認画面が表示されるので、インストールをタップします。

<img width="414" alt="009.jpeg" src="https://qiita-image-store.s3.amazonaws.com/0/38924/a9946c3a-2fd5-30b7-db50-dd9dd8a54e50.jpeg">

インストールが完了したので、完了ボタンをタップします。

## アプリをインストール

DeployGateの設定ができたので、アプリをインストールします。

![010.png](https://qiita-image-store.s3.amazonaws.com/0/38924/ae769e63-5a63-e8db-7576-b57904abb103.png)

すでにアプリをインストール済みであれば、ホーム画面でアプリを削除します（上書きインストールをしたい場合は、削除しなくてもかまいません）。

![011.png](https://qiita-image-store.s3.amazonaws.com/0/38924/cf5167c8-cb16-9682-4eab-0313674c2a09.png)

DeployGateアイコンをタップして、DeployGateの画面を表示します。アプリ一覧画面が表示されるので、インストールしたいアプリをタップします。

![012.png](https://qiita-image-store.s3.amazonaws.com/0/38924/5e3576ca-d320-8b71-f989-c111a7fc66cd.png)

アプリのインストール画面が表示されるので、インストールボタンをタップします。

![013.png](https://qiita-image-store.s3.amazonaws.com/0/38924/1689abc3-0d00-5b09-8deb-9895a8531053.png)

もう一度インストールの確認画面が表示されるので、インストールボタンをタップします。

![014.png](https://qiita-image-store.s3.amazonaws.com/0/38924/a367bd26-5d7a-ec1b-c691-6d0dd82edc45.png)

インストールを開始しました画面が表示されるので、閉じるボタンをタップしてから、ホームに戻ります。

![015.png](https://qiita-image-store.s3.amazonaws.com/0/38924/e7e1a44b-e7b4-60eb-ab13-841476de788d.png)

アプリがインストールされます。

おつかれさまでした。
これでDeployGateからのアプリのインストールは終了です。

アプリを再インストールしたい場合は、「アプリをインストール」の手順をもう一度実行してください。
リモートワーク制度が承認/実施されたのでそのまとめ

9月から新しい制度として、エンジニア限定になりますが、リモートワークの制度を導入しました。
（8月終わりに役員に提案したら、9/1から制度開始というスピード感！）
メンバーから意見が上がったこと、自分自身も現在空間を選ばずに仕事ができるようになって、色々と気づきもあったこと、少ない人数で効率よくやるにはフルリモートでないにしても、一部導入するのはありのではないかと思い検討 > 導入となりましたので、その時のメモなど残しておきます。

# 導入したリモートワークについて
基本VCとチャットで、毎日リモートから仕事をする・・・というのはハードルが高かったのと、メンバーでも意見が割れていたこともあり、ひとまず部分導入（ハイブリッド？）の形で進めました。また全部自由裁量で・・みたいな形ではなく、場所だけリモートにしてあとは通常勤務の形態　みたいな形になります。

スケジュールとしては、あらかじめ決めておいた日のみリモートワークとし、それ以外は通常通り働くという形で、週2を限度として指定日をリモートワーク日に設定することとしています。

言ってしまえばリモートワークの機能の中でも本当に最低限の部分だけ導入しています。


# なぜ部分導入なのか
正直自分の管理手腕に不安なところがあるのと、意見固めてから制度発令まで1週間もなく、VCやらなにやらインフラ部分が整っていないためです。（ちょっといいわけです）

またうちのエンジニアは基本的にエンジニア単体でタスクが完了することが少ないため、他部署とのコミュニケーションが多く、フルリモートだと会社全体でどうコミュニケーションをとるかまで考えないといけないということもあり、今回は部分導入を最初から念頭に入れて制度設計していました。（スモールスタートで行きたかったため）



# リモートワーク導入狙い
- 生産性の向上（邪魔されない）
- メンタルの部分（通勤とか）
- リクルーティング（リモートワークに憧れる人も多いと思うので）

この3点をKPIとしておいています。
後述しますが、今のところ1番目はうまくいってます。2については月末に1on1でヒアリング予定、3についてはもう少し長期で見ていく形になります。


# 不安な部分
- さぼる
- 業務効率の低下

対象メンバーは1年以上一緒にやってきたメンバーなので、さぼる不安はそこまでありませんでしたが、スケールすることを考えると、入社2,3ヶ月でも実施できるようなシステムにしないといけないですね。水は易きに流れてしまう、、と考えるのか、結果さえ出していればよい、きちんと結果を図る手段さえあれば良いと考えるかはまだ難しいところです。


# 3週間たった状況
当面は「火水」「木金」みたいに連続してとらないようにお願いしていたためか、電話でちょっと話したことはありますががっつりスカイプなどはしたことはなく、基本的にチャットで事足りています。あとはgithubとかみてって感じでしょうか。不便だなと感じたことはありません。

またその場にいないが故のトラブルみたいなものは感じたことはありません。強いて言うなら、「ああ今日はリモートか、ならチャットで送っておこう」という、人によってはデメリットと取れる部分が見受けられますが、むしろ自分の視点からいうと、集中を邪魔されなくて助かった　とれるので、うまく機能していると思っています。

メンバー視点でいうと、明日がリモートなので、リモートでやりにくい業務を今日中に片しておこうとか、そういう発想みたいです。リモートでもやりやすい仕事をためておいて、一気に片すというのが良いのか悪いのかはまだ判断つきませんが、ハイブリッドにしているからこそできるとも言えるなかなと。


# うちならではの前提と問題点
今のところうまくいっていると思っていますが、いくつかうちならではの下地があったからという部分も大きいと思っています。

- チャット文化が社内で浸透している
- 何年も一緒にやってきたメンバーという信頼（さぼらないと思える）
- 人数が少なく今のところ大体のタスクが把握できている

上記の状態のため臆することなく導入はできたわけですが、リモートワークの先を考えると、特に下の2点については、なくても大丈夫なようにしないといけないなと感じています。

信頼ができない人にはリモートワークさせないということは、ようは一緒に働いてOKがでないとリモートワークさせないということなので、スケールしないし、タスクが把握できているからリモートワークさせるという部分も人が増えると途端にスケールしなくなります。

ここまで含めて制度としてシステマチックに対応できるようになれば、もう少しインフラは整えること前提で、エンジニアは基本リモートワークで採用も見えてくるなと思っています。（そうすれば採用ももう少し楽になる・・？）



# まとめ
弊社でもリモートワークを始めました。
まずはスモールスタートでエンジニアチームだけにしていて、形態も自由裁量部分は一旦置いておいてリモートで働けるというメリットだけを導入しました。

部分導入ということで、週の何日かをリモートでやっている形になりますが、今のところトラブルやネガティブな面は見られません。ただ制度、仕組みというよりも、メンバーの適正と積み重ねた信頼に大きく頼って成立させているような形で、胸を張ってリモートワーク成功しました！とはいえないと思っています。

今後はもう少し仕組みを改良していき、よりメリットを享受できる形に変えていきたいと思っています。
Ionic3でpush通知ができる構成について

# きっかけ
私のローカルでプッシュ通知が出来てるビルドが作れて、他の開発環境でビルドするとデバッグすらできないという事態が発生。
行きつくところ、phonegap-plugin-push（プッシュ通知のためのプラグイン）のバージョンの問題だった。

# 前提
基本の構成は以下の通り。

- ionic3系のプロジェクト
- cordovaもそれに付随したバージョン
- Androidのビルドしかしてない（ああ、browserもあるけどここでは関係ない）
- LoopbackというものでAPIサーバを作っている
- プッシュ通知はFirebaseのMessagingを使用

LoopbackのPushの使い方をベースにプッシュ通知を実装している。
https://github.com/strongloop/loopback-component-push
https://github.com/strongloop/loopback-example-push

# ionic3でプッシュ通知をするのに関係するライブラリのバージョン
とにかくまずかったのは、package.jsonやらconfig.xmlやらのバージョン指定が「^」指定でふわふわになっていたこと。
最近はionic4系もでたからか、どんどんバージョンアップされる。

今回はプロジェクトがionic3系なので、その中でプッシュ通知が使用できる各パッケージ等のバージョンを記録しておく。（config.xmlでの指定）

- android(package.jsonではcordva-android)：6.3.0
- phonegap-plugin-push：2.1.3
    - `<variable name="FCM_VERSION" value="11.6.2" />` も指定したほうがよさそう。

# 愚痴
androidを7.1.0にしたりとかいろいろやって、休みをふいにしたけど、まとめると上の二つのバージョンしか重要じゃないんだな。。
もっと大きいメモになると思ったのにな。

ionic4にプロジェクトを変更しようかとも考えたけど、androidを7.1.0にしただけで影響範囲大きかったのでやめた。
やっぱりバージョンはionic3系で全部固定するべきなのかな。。
【変なソートアルゴリズム】ビーズを落としてソートをするじゃの巻

![p098_02j.jpg](https://qiita-image-store.s3.amazonaws.com/0/91558/792a7ef2-da6d-4aa4-8edc-3a7ab1630ba2.jpeg)
↑ビーズの写真

# ビードソートって知ってますか

Bead sort(ビードソート)はbeads(ビーズ細工のビーズ)というように**ビーズ**を使うソートアルゴリズムです。
ソートアルゴリズムの中でもいろんな意味で色が強めです。

# ビードソートのアルゴリズム

[2, 4, 1, 3, 3]の数列をソートしたい場合を考えます。

まず、数列の数に応じてビーズを以下のように通していきます。

![380px-BeadSort-Figure1.svg.png](https://qiita-image-store.s3.amazonaws.com/0/91558/58ebdeff-0ec6-b06d-7d7e-058d3b6404ec.png)

そして、ビーズを重力にまかして落とす。

![380px-BeadSort-Figure2.svg.png](https://qiita-image-store.s3.amazonaws.com/0/91558/097e5918-25ce-ed91-af0f-190513289458.png)

するとなんということでしょう。
勝手にソートされてますね！すごい！


見たほうがわかりやすい方はこちら
[![IMAGE ALT TEXT HERE](http://img.youtube.com/vi/3vg8p5hTh00/0.jpg)](http://www.youtube.com/watch?v=3vg8p5hTh00)
Extended Bead-Sort - YouTube(クリックすると見れます)

詳しく知りたい方はこちら
[Bead sort - Wikipedia](https://en.wikipedia.org/wiki/Bead_sort)より

# 計算量

Wikipediaをご覧ください。
[Bead sort - Wikipedia #Complexity](https://en.wikipedia.org/wiki/Bead_sort#Complexity)

出展は不明ですが、確かハードウェア上にソートアルゴリズム実装するときに使われるものらしいです(?)

# Pythonでの実装

```python
import numpy as np

def beadsort(series, max_num=10):
    len_series = len(series)
    array = np.array([[True]*num + [False]*(max_num-num) for num in series])
    array = np.array([[True]*sum(array[:,idx]) + [False]*(len_series-sum(array[:,idx])) for idx in range(max_num)])
    return [sum(array[:,idx]) for idx in range(len_series)]

a = [2,4,1,3,3]
print(beadsort(a)) # [4, 3, 3, 2, 1]
```
Dockerのdebianでfastlaneを使おうとしたらbash: warning: setlocale: LC_ALL: cannot change locale (en_US.UTF-8)


Debianのコンテナでfastlaneを使おうとして、LC_ALLとLANGをen_US.UTF-8に設定したのだが、 `bash: warning: setlocale: LC_ALL: cannot change locale (en_US.UTF-8)` というwarningが表示されていて気持ち悪かった。
fastlane自体は問題なく動いているようだが、不安なのでwarningを消すための方法を調べました。

以下のようなDockerfileにすればwarningは表示されなくなりました。

```Dockerfile
RUN apt-get install -y ruby ruby-dev gcc g++ make locales
RUN gem install fastlane -NV
RUN locale-gen en_US.UTF-8
ENV LC_ALL=en_US.UTF-8
ENV LANG=en_US.UTF-8
RUN localedef -f UTF-8 -i en_US en_US.UTF-8
ENV RUBYOPT -EUTF-8
```

LC_ALLとLANGの設定は[fastlaneのドキュメント](https://github.com/fastlane/docs/blob/master/docs/getting-started/android/setup.md#set-up-environment-variables)から。
locale-genとlocaledefの行は[こちら](https://qiita.com/motoki_giants/items/0c3b9d174edef9410310)を参考にしました。
他のJenkinsに既存のjob設定を反映する方法

##手順
1、コピー元のjobの設定ファイルを下記のコマンドで設定ファイルを入手する

```shell:sample.sh
curl http://jenkins1/job/Test1/config.xml -o config.xml
```

2、コピー先のJenkinsで、新規プロジェクト作成→フリースタイル・プロジェクトのビルドでjobを作成する

3、手順1で入手した設定ファイルを下記のコマンドでPOSTする

```shell:sample.sh
cat config.xml | curl -X POST -H "Content-type: text/xml" -d @- 'http://jenkins2/job/Test2/config.xml'
```

上記の手順を実行するとjobの設定が反映されていると思います。
Azure Database for MariaDB を試した

2017年11月に Microsoft が MariaDB の Platinum Sponsor になったときにアナウンスされていた、Azure Databse for MariaDB が GA になったようなので、試してみました。

https://azure.microsoft.com/en-us/blog/announcing-the-general-availability-of-azure-database-for-mariadb/

https://azure.microsoft.com/ja-jp/blog/mariadb-postgresql-and-mysql-more-choices-on-microsoft-azure/

<img width="400" alt="start free" src="https://qiita-image-store.s3.amazonaws.com/0/122952/89228277-b71f-5fd8-b8e8-bc42b9ee6d16.png">

# MariaDB 10.2 server インスタンスのデプロイ

Azure Portal の検索窓で ```azure database for mariadb``` を入力し、```Azure Database for MariaDB servers (preview)```を選択します。

<img width="400" alt="search service" src="https://qiita-image-store.s3.amazonaws.com/0/122952/5cfb0cec-b01c-a5e9-8214-24bb055313f5.png">

Create Azure Database for MariaDB server をクリックします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/122952/eddad33f-6b37-cec6-0a64-416524e0eff1.png)

インスタンスの各パラメータ入力となります。

<img width="300" alt="parameters1" src="https://qiita-image-store.s3.amazonaws.com/0/122952/4c943a49-1d3c-3468-3659-6a344ad6b58a.png">
<img width="300" alt="parameters2" src="https://qiita-image-store.s3.amazonaws.com/0/122952/936c8068-9995-ef2e-a583-faabbf17a12d.png">

デフォルトでは、2 vCores / 5GB ストレージとなるようです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/122952/d0f53422-8e60-a32e-8dc5-d2395150c8f8.png)

ストレージは backup retention period が選択でき、Geo-Redundant も選べるようです。
今回はすべてデフォルトのまま作成してみます。

# 作成されたMariaDBインスタンス

数分でデプロイが完了しますので、Overview でホスト名などを確認します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/122952/5813274c-c0d5-7b3c-7fd4-8b639a55d303.png)

右下のほうで、SSL enforce status ENABLED となっていますが、この ENABLED をクリックし、firewall設定とSSL設定を変更します。

<img width="160" alt="SSL" src="https://qiita-image-store.s3.amazonaws.com/0/122952/a5893af1-0b23-4be0-64a2-3b60484eea1f.png">

Enforce SSL connection は DISABLED に変更します。

<img width="480" alt="SSL" src="https://qiita-image-store.s3.amazonaws.com/0/122952/36d23f8a-4f9f-37de-bb0c-8c382cb36c71.png">

## パラメータ設定

my.cnf などで設定可能なパラメータは Server parameters で変更可能になっています。文字コードはデフォルトで LATIN1 となっていました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/122952/c2504620-df40-1f3c-a7aa-df413822cdce.png)


# HeidiSQLからの接続テスト

Windows版 MariaDB server に付属している HeidiSQL で接続を行ってみます。

<img width="400" alt="start free" src="https://qiita-image-store.s3.amazonaws.com/0/122952/d980c5f9-281f-71af-4cda-2e4952f460cc.png">

test データベースはなく、以下のようにユーザが作成されていました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/122952/4f499f76-5f75-bd12-ba8e-141e8a4f58e4.png)
php-master-changes 2018-09-24

ext/oci8 へ修正が入り、それに伴い 7.1 〜のコード体裁をある程度 master へ同期するようパッチがあたった

# 2018-09-24
## petk: Rename *.php files in Zend/tests to *.inc
- https://github.com/php/php-src/commit/f6605c788f0a73cf4f5f4ea32515b9ba7959e4ac
- Zend/tests 内の .php を .inc へリネーム
- .gitignore に [.php が入ってたりして](https://github.com/php/php-src/blob/cfe46a5d7970e988591f0593ae3ebddf9e5196f4/.gitignore#L194)めんどいのでっていう

## petk: Rename *.php files in ext/dom tests to *.inc
- https://github.com/php/php-src/commit/f116484cf1cd8a796f05c493ace4deca84bc8fdc
- ext/dom のテストを同様に .php から .inc へリネーム

## petk: Remove outdated zlib readme file for windows build
- https://github.com/php/php-src/commit/50b4b63cc63be80e16be080f6b3976b011d03f9a
- ext/zlib で Windows ビルドをする用の古くなったドキュメントを削除

## cjbj: Remove trailing whitespace to help keep branches in sync
- https://github.com/php/php-src/commit/a2c0f8722b90becea8e551822dad206552e82d44
- [7.1~]
- 7.1 以降のコード同期を楽にする用に不要な行末スペースを除去

## cjbj: Sync EXPECT usage with PHP-7.3
- https://github.com/php/php-src/commit/bdd67d8175dce707ac16875e6d74e1b07603b04f
- [7.1~]
- 7.1 以降で EXPECT の扱いを PHP7.3 へあわせた

## cjbj: And strip trailing tabs too...
- https://github.com/php/php-src/commit/37652336c7a8a740b5d922edff66c8cea885c108
- [7.1~]
- 7.1 以降のコードについて不要な行末タブも除去

## cjbj: Remove $id from phpinfo as already done in PHP-7.3
- https://github.com/php/php-src/commit/338802b543023247a3c9b7af563d555c80c2c5d1
- [7.1~]
- ext/oci8 で 7.1 以降もすでに 7.3 でそうしてるのと同様、phpinfo() の出力から $id を削除

## cjbj: Make tests portable across PHP 7.x versions
- https://github.com/php/php-src/commit/3d497f884f90a329b576988bbb8887872520c0fe
- [7.1~]
- 7.x で共通にできるようテストコードの期待値表記を修正

## cjbj: Backport master branch comment typo fix
- https://github.com/php/php-src/commit/57eb25b393366c8650b2cf85ef12ea76d01bdd95
- [7.1~]
- 7.1 以降へ master に入ってるコメントのタイポ修正をバックポート

## cjbj: Make usable for PECL OCI8 release for PHP 7.x
- https://github.com/php/php-src/commit/91954c24da379946786e21e10f2a5d1a3306f64f
- [7.1~]
- PECL OCI8 の 7.x 用リリースを使えるよう、PHP バージョンでの条件コンパイルを追加
- なお、なんで php-src の ext/oci8 と PECL と両方あるのか事情を知らない！

## cjbj: Terminate smart string correctly
- https://github.com/php/php-src/commit/9e56a3373e88c6e147a5e11acddf134d2d3209ba
- [7.1~]
- ext/oci8 で [smart string](https://phpinternals.net/categories/zend_strings#smart-strings) の終端を修正
指定メールアドレスのプロバイダーを配列で取得する

```swift
    // 指定されたメールアドレスのアカウントが対応しているログイン方法を取得する
    Auth.auth().fetchProviders(forEmail: "foo@example.com") { (providers, error) in
      if providers == nil {
        print("アカウントが存在しません")
      }
      // 対応プロバイダーを出力する
      providers?.forEach({ (provider) in
        print("対応プロバイダー:\(provider)")
      })
    }

```
babel v7でbabel-stage-presetが廃止になったから移行した話

# 導入

公式から[`babel-stage-preset`を廃止するというアナウンス](https://babeljs.io/blog/2018/07/27/removing-babels-stage-presets)があった。

記事の内容を要約すると、

* 今までの`stage0`等プリセットは上手く動作していた(むしろしすぎていた？)
* `stageX`はあくまで**`proposal`**であり、**まだ**正式なJSの仕様ではない(そりゃそう)
* `proposal`な機能は、開発者がそれぞれの機能を理解した上で導入すべき(導入されない可能性もあるわけで)

みたいなことが書かれています。

# Migration

記事には、[`babel-upgrade`を走らせるだけだよ〜](https://babeljs.io/blog/2018/07/27/removing-babels-stage-presets#migrating)と書いてあります(試してません)。

今回は手動でマイグレーションします。

## package.json

### babel v6

babel-preset-stageXをインストールするだけだった。

```json
  "devDependencies": {
    "babel-core": "^6.26.3",
    "babel-loader": "7.1.5",
    "babel-preset-env": "^1.7.0",
    "babel-preset-stage-0": "^6.24.1",
  }
```

### babel v7

使いたい機能のプラグインをbabelライブラリから個別にインストールする必要がある。

```json
  "devDependencies": {
    "@babel/core": "^7.1.0",
    "@babel/plugin-proposal-class-properties": "^7.0.0", 
    "@babel/plugin-proposal-object-rest-spread": "^7.0.0",
    "@babel/preset-env": "^7.1.0",
    "babel-loader": "8.0.2",
  }
```

## .babelrc


### babel v6

`presets`や`env`に`stageX`を書くだけだった。

```json
{
  "presets": [
    ["env", { "modules": false }],
    "stage-0"
  ],
  "env": {
    "test": {
      "presets": [
        ["env", { "targets": { "node": "current" }}],
        "stage-0"
      ]
    }
  }
}
```

### babel v7

* プリセットは`@babel/preset-env`を使う
* `plugins`に、使いたいproposalのプラグインを記述する

```json
{
  "presets": [
    ["@babel/preset-env", { "modules": false }]
  ],
  "env": {
    "test": {
      "presets": [
        ["@babel/preset-env", { "targets": { "node": "current" }}]
      ]
    }
  },
  "plugins": [
    ["@babel/plugin-proposal-object-rest-spread", { "proposal": "minimal" }],
    ["@babel/plugin-proposal-class-properties", { "proposal": "minimal" }]
  ]
}
```

# 雑感

* アプリで使用しているproposalが明確になるので、個人的にはありかなーと思っている。
* `npx babel-upgrade`試してないけれど、手動マイグレーションは面倒かも。
* 便利だからといって無闇矢鱈に`stageX`の機能使うのはやめよう(戒め)


# 参考

https://github.com/babel/babel/issues/6808
https://babeljs.io/docs/en/babel-preset-env
https://babeljs.io/docs/en/next/babel-preset-stage-0
開発用ツールをコンテナにまとめて、環境差異で消耗しない世界を目指す

# はじめに
少し前からVue.jsを使うプロジェクトの立ち上げに関わっています。
メンバー的にあまりノウハウがない中、人によってビルドが通らずに苦戦するといった不毛な時間が費やされ気味だったので、簡単に開発環境を揃えられるように検討してみました。

ここに書いたのは一例で、どんな言語やツールでも同様のことができるはずです。
Vue.js関係者に限らず、よかったらお付き合いください。

# 方針
* Dockerを使う
	* 最近よく使われているOSならだいたい導入しやすい
* できるだけコンテナを意識しないで作業できるようにする
	* あくまでホストで直接プロセスを実行する代わりにコンテナを起動する
* できるだけ開発用マシンに負担をかけないようにする
	* コードをコピーしたコンテナをVM的に常時起動しておくような使い方はしない
	* ビルドやテスト等の実行時のみコンテナを起動する、終わったら消える

# 実現方法（例）

## 事前準備
* Docker(for Mac/Windows) をインストール

## コンテナイメージの準備
* 以下のようなDockerfileを書く

```Dockerfile
FROM node:10-alpine

ARG version
RUN npm install -q -g vue-cli@${version}
VOLUME /app
EXPOSE 8080

WORKDIR /app
```

これでひとまずnpm/vueコマンドを実行できるコンテナイメージができます。
ビルド時に`version`を指定すると、特定バージョンのvue-cliがインストールできます。
指定しないと最新バージョンが入ります。
CMDやENTRYPOINTを指定すべきというベストプラクティスがあったような気がします（記憶が曖昧）が、今回の目的は開発ツール群をまとめることであり、特定のプロセスの実行環境を作ることではないので問題ないと考えています。

お試し用でDockerhubにイメージをpushしたので、以降はこれを使います。
https://hub.docker.com/r/nolabo/vuilder/

自分のプロジェクトに合わせてカスタマイズしたい方用にこちらにDockerfileを置きました。
ビルドコマンドの例も書いてあります。
[GitHub - j-un/vuilder: Developer tools container image for Vue.js](https://github.com/j-un/vuilder)

## 環境変数、エイリアスを設定
* 今のshellで実行するか、.bashrc/.zshrc等に追記して読み込む（csh系やwindowsの方は適宜読み替えてください）

```
export VUILDER_VERSION="2.9.6"
alias npm='docker run -p 8080:8080 --rm -v ${PWD}:/app -it nolabo/vuilder:${VUILDER_VERSION} npm'
alias vue='docker run -p 8080:8080 --rm -v ${PWD}:/app -it nolabo/vuilder:${VUILDER_VERSION} vue'
```

こうすることで、単にnpm/vueコマンドを実行すると裏でコンテナが起動し、カレントディレクトリ内のコードに対して処理を実行します。

 `VUILDER_VERSION`（大層な名前だけど、ここでは単にvue-cliのバージョンです）で使用するコンテナイメージを指定しています。
direnvと組み合わせて、プロジェクト毎にバージョンを変更する等できると思います。
また、コンテナ起動時にホストのカレントディレクトリをマウントしています。

なお賢明な方はお気づきの通り、これを.bashrc等に書いてしまうとMac等ホスト側にnpmパッケージをグローバルインストールとかができなくなってしまいます。。
ルックアンドフィールを優先するか、aliasを工夫するか、そのへんのさじ加減は各自でご調整ください。

# まとめ・所感
Dockerhubを検索するとこういう風なツールを実行するためのコンテナイメージがたくさん登録されています。
なので特殊なことをしているわけではないのですが、いくらかググった感じ似たような課題に対してVMの代わりにコンテナを使うような例が多かった印象なので、いつか誰かの役に立つこともあるかなと思い書いてみました。

SRE的なアプローチが普及しソフトウェアで解決すべき領域が拡大している昨今、開発プロセスもソフトウェアエンジニアリングでどんどん改善していきたいですね。
UIAlertControllerの背景色(キャンセルボタン含む)を変更するextension

UIAlertControllerの背景色を変更しようとした時に、テキストカラー変更やキャンセルボタン以外のカラー変更はたくさん記事を探すことができました。
ただ、キャンセルボタンも含めて背景色を変更する方法を探しづらかったのでメモしておきます。

#extension

```
extension UIAlertController {
    func itemBackgroundColor(_ color: UIColor) {
        // ここでキャンセルボタン以外の背景色を変更
        let FirstSubview = self.view.subviews.first
        let AlertContentView = FirstSubview?.subviews.first
        for subview in (AlertContentView?.subviews)! {
            subview.backgroundColor = color
            subview.layer.cornerRadius = 10
            subview.alpha = 1
        }
        // ここでキャンセルボタンの背景色を変更
        if let cancelBackgroundViewType = NSClassFromString("_UIAlertControlleriOSActionSheetCancelBackgroundView") as? UIView.Type {
            cancelBackgroundViewType.appearance().subviewsBackgroundColor = color
        }
    }
}

extension UIView {
    private struct AssociatedKey {
        static var subviewsBackgroundColor = "subviewsBackgroundColor"
    }
    
    @objc dynamic var subviewsBackgroundColor: UIColor? {
        get {
            return objc_getAssociatedObject(self, &AssociatedKey.subviewsBackgroundColor) as? UIColor
        }
        
        set {
            objc_setAssociatedObject(self,
                                     &AssociatedKey.subviewsBackgroundColor,
                                     newValue,
                                     .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
            subviews.forEach { $0.backgroundColor = newValue }
        }
    }
}

```

#使い方

```
let alert = UIAlertController(title: nil, message: nil, preferredStyle: .actionSheet)
alert.itemBackgroundColor(UIColor.black)
```
MacBookを買い換えた際の環境構築

MacBookAirからMacBookProに買い換えた際に環境構築でしたことです。
ちなみにJISキーボードからUSキーボードに変えたため多少日本語入力等の変更でややこしい設定等が必要になっています。

# OSアップデート
1番最初にしたのはOSのアップデート。

# Macアプリケーション
- Alfred
- BetterTouchTool
- Chrome(設定はログインしておくことでそのまま引き継げた)
- ITerm(カラースキーマはDracula)
- Karabiner-Element(Commandで入力切替できるようにした.コロンとセミコロンを入れ替えた。)
- Gyazo
- 1Password
- Git(Homebrewを利用してインストール)

# パッケージマネージャ
- Homebrew

# 設定等
- Mac標準メーラー
- キーボード、トラックパッド設定から余分なショートカットを削除
- キーボードの修飾キーからCapsLockをControlに

# シェル
- zsh(HomeBrewで導入)
- zsh-completions
- .zshrcを設定
- tig

# 以前のパソコンのファイル
そんなに量がなかったのでDropBoxを利用してクラウドにそのまま保存することにしました。
at coder beginner 043

B
しぐはキーボードを製作しました。シンプルさを極限まで追求したこのキーボードには、0 キー、1 キー、バックスペースキーの 3 つしかキーがありません。
手始めに、しぐはこのキーボードで簡単なテキストエディタを操作してみることにしました。このエディタには常に一つの文字列が表示されます（文字列が空のこともあります）。エディタを起動した直後では、文字列は空です。キーボードの各キーを押すと、文字列が次のように変化します。
0 キー: 文字列の右端に文字 0 が挿入される。
1 キー: 文字列の右端に文字 1 が挿入される。
バックスペースキー: 文字列が空なら、何も起こらない。そうでなければ、文字列の右端の 1 文字が削除される。
しぐはエディタを起動し、これらのキーを何回か押しました。しぐが押したキーを順番に記録した文字列 s が与えられます。s の中の文字 0 は 0 キー、文字 1 は 1 キー、文字 B はバックスペースキーを表します。いま、エディタの画面にはどのような文字列が表示されているでしょうか？

```
#include<iostream>
#include<string>
using namespace std;
int main() {
	string s;
	cin >> s;
	string X;
	for (int i = 0; i < s.size(); i++) {
		if (X == "") {
			if (s[i] == '0')
				X += '0';
			else if (s[i] == '1')
				X += '1';
		}
		else {
			if (s[i] == '0')
				X += '0';
			else if (s[i] == '1')
				X += '1';
			else if (s[i] == 'B') {
				X.erase(X.size() - 1);
			}
		}
	}
	cout << X << endl;
	return 0;
}
```
楽しす

C
N 個の整数 a1,a2,..,aN が与えられます。えび君はこれらを書き換えて全て同じ整数にしようとしています。各ai(1≦i≦N)は高々一回しか書き換えられません(書き換えなくても良い)。整数xを整数yに書き換えるとき、コストが(x−y)2かかります。仮にai=aj(i≠j)だとしても、ひとつ分のコストで同時に書き換えることは出来ません(入出力例2 を参照)。えび君が目的を達成するのに必要なコストの総和の最小値を求めてください。
制約
1≦N≦100
−100≦ai≦100

```
#include<iostream>
#include<algorithm>
#include<vector>
#include<string>
#include<list>
#include<cmath>
#include<map>
using namespace std;
using ll = long long;
const int INF = 1e9;
#define rep(i,n)for(int i=0;i<n;++i)
#define p pair<int,int>
int main() {
	int N;
	cin >> N;
	int a[100];
	int amin = 100;
	int amax = -100;
	for (int i = 0; i < N; ++i) {
		cin >> a[i];
		amin = min(amin, a[i]);
		amax = max(amax, a[i]);
	}
	int ans = INF;
	for (int i = amin; i <= amax; ++i) {
		int sum = 0;
		for (int j = 0; j < N; ++j) {
			sum += (i - a[j])*(i - a[j]);
		}
		ans = min(ans, sum);
	}
	cout << ans << endl;
	return 0;
}
```
Rustで自分用の字句パーサー書いた☆（＾～＾）

# Git hub の readme に書いた。

もう配布してある。

[目的のやつだがサンプルには難解すぎる](https://github.com/muzudho/rust_kifuwarabe_shell)

[簡単にしたやつ](https://github.com/muzudho/rust_kifuwarabe_state_transition_diagram)


だったら Qiita で技術 書くことないよな。 

コマンドラインといっても、もっとざっくり言えば　一行のテキストのことで

```
1 + 2
```

は、数字、スペース、記号、スペース、数字　に分解できる。
これを　字句パーサーという。レキシカルパーサー。

だいたい　字句は、スペース　か、　字句の種類の境目　で切る。

```
neko[123]
```

であれば、```neko```、 ```[```、 ```123```、 ```]``` の４つのトークンに切れる。Token。つまんだもの、ぐらいの意味だ。


「わたしはかおをあらった」　のように日本語はスペースで区切らない言語もある。そんな言語でプログラムするのは　計算機的に大変だ。

とりあえず　ポイント　としては、ルールの方に現実を合わせることだ。
日本語を解析するパーサーを作るより　ルールに合わせて日本語を変える方が楽。

例えば

- 先頭（例えば左端）から順番に読む。
- なるべく長めに一致するのを取る。 ```Blu``` と ```Blue``` があれば ```Blue``` の方を優先する。
- 「123」の決め打ちと、「数字」の指定があれば、123 を見かけたら「123」の方を優先する。

というようにルールを決めたら、ルールに合わせて　テキストを書く。




そのうち　なんか　字句解析や構文解析の話を書く。

／／かきかけ
テキストエディタはどれが良いだろうか

## エディタの特徴を新人エンジニアが紹介
これはIT企業に入社して半年がたつ新人エンジニアが
先輩から勉強会で得た知識と自分自身で調べたものを共有するために書きました。
（あとただ単にQiitaに投稿してみたかった…）
もし間違った記述がある場合はコメントにて教えてほしいです。

## vscode
### 公式サイト
https://code.visualstudio.com/
### おすすめポイント
1. プラグインでいかようにでもなる
2. アップデートが頻繁
4. gitと連携している
    * マウス操作のみでgitを使うことができる。
    * 複雑な操作をしたいときはターミナルを表示し、そこにgitコマンドを打ち込めばよい。
5. ターミナル表示がある
    * ターミナルを表示することができる。（`control + shift + @`）
6. 2つのファイルの差分を表示してくれる
    * エクスプローラービューから比較することができる。
    * `比較したい1つ目のファイルを右クリック`=>`比較対象の選択`をクリック  
`比較したい2つ目のファイルを右クリック`=>`選択項目と比較`をクリック

## Atom
### 公式サイト
https://atom.io/
### おすすめポイント
1. パッケージが豊富
    * Atomもかなりパッケージが豊富で使いやすくカスタマイズできます。
2. ショートカットが使いやすい
3. GUIによる設定がわかりやすい
    * Atomは`command +`,で開くセッティングなど、細かな設定画面が見やすい。

## サクラエディタ
### 公式サイト
https://sakura-editor.github.io/
### おすすめポイント
1. 動作が軽い
    * サクラエディタは簡単なメモやメール送信前の下書き、会社で提出する日報の下書きなどに使っている。理由としては、立ち上がりがとても早いからである。

2. 細かく色設定できる
    * エディタの色設定も細かく設定することができる。
    * カーソルの色や全角スペースの色も変更することができる。
3. 矩形選択できる
    * 矩形選択をすることもできる。縦横方向の一括選択からコピーなどを行える。
4. Grep
    * Grep機能とはディスクにある複数のファイルから、指定した文字列を検索する機能である。
    * 指定したフォルダの下層のフォルダを全て検索することもできます。
5. ファイルのプロパティから文字コードが確認できる
    * 文字コードを確認することができる。（`ファイル`=>`ファイルのプロパティ`）
    * 文字コードを変更することができる。（`設定`=>`文字コードセット`）
6. マクロが作れる
    * マクロについては私もまだ詳しくは無いので以下の公式サイトを参考にしてください。  
（http://sakura-editor.sourceforge.net/htmlhelp/HLP000204.html）

サクラエディタはWindowsでしか使えないので注意してほしい。
    
## Vim
### 公式サイト
https://www.vim.org/
### おすすめポイント
1. 軽量
    * どんなOSでも簡単にインストールすることができる。
    * ファイルの開き方が簡単。（`vim ファイル名`）
    * 起動に時間が掛からない。数ミリ秒で立ち上がる。
2. 拡張性がある
    * 自分自身でスクリプトを書いて実行できる。  
（https://www.youtube.com/watch?v=zPVwo39jthA）
3. 入力したい箇所に移動するのが速い
    * キー操作を覚えてしまえばコード入力などがとても速い  
（`h:左へ移動,j:下へ移動,k:上へ移動,l:右へ移動…など`）

デメリットとして、キー操作を覚えるまでが大変ということ。
しかし、慣れてしまえばこっちのもん。

# まとめ
この他にも今回紹介できなかったたくさんのエディタがある。

* Emacs
* JetBrains
* Sublime
* vi
* 秀丸
* mi
* CotEditor
* Liveweave
* etc…

結局自分に合うものが良いのではないかということ。
新人エンジニアの方は、いろいろなエディタを使って勉強をしてみて、自分好みのエディタを見つけよう。

# 参考/引用
* **vscode**
    * https://code.visualstudio.com/
    * http://www.atmarkit.co.jp/ait/articles/1806/08/news028.html

* **Atom**
    * https://atom.io/
    * https://qiita.com/y-temp4/items/dcb59f633348031cbae9

* **サクラエディタ**
    * https://sakura-editor.github.io/
    * http://sakura-editor.sourceforge.net/htmlhelp/HLP000204.html

* **vim**
    * https://www.vim.org/
    * https://qiita.com/yamamoto_hiroya/items/31ce5bef451d9e3be225
    * https://qiita.com/rbtnn/items/88dcbe60d49db6de8002
    * https://www.youtube.com/watch?v=zPVwo39jthA
診断メーカーで項目作りに使ったコード

# はじめに

診断メーカー好きです。

「LIST5,6,7,8,9のどれかから選択する」のような挙動がIF関数でやるのが面倒そうだったので（というか出来るの？）試行錯誤してたら意外な方法で出来たので記録しておきます。

2000項目の壁突破、が一番の動機ですね。
なんか仕様変更で使えなくなりそうな雰囲気もあるので、その時その時で動作確認して下さい。

[作った診断：あなたがランスワールドに生まれたら](https://shindanmaker.com/829080)

あとはPython練習がてらの項目作成です。



##診断メーカー

```text
[USER]さんがランスワールドに生まれたら、

出身：[LIST1]
現在レベル（才能限界）：[LIST[LIST2]]

【技能】
・[LIST3_1]LV[LIST4_1]
・[LIST3_2]LV[LIST4_2]
・[LIST3_3]LV[LIST4_3]
```

```text:list2
5
5
5
5
5
6
6
6
7
7
8
9
10
```

```text:list5
Lv1（Lv1）
Lv1（Lv2）
Lv2（Lv2）
Lv1（Lv3）
Lv2（Lv3）
Lv3（Lv3）
Lv1（Lv4）
Lv2（Lv4）
Lv3（Lv4）
Lv4（Lv4）
Lv1（Lv5）
Lv2（Lv5）
Lv3（Lv5）
・
・
・
```


list2で項目数変えるとどのlistから取得するかの確率比変えられるのが地味に便利でした。


##項目作成（Python）

```python:Rance.py
# -*- coding: utf-8 -*-

count = 0

for i in range(1,321):
        for j in range(1,i+1):
                count += 1
                # print str(j) + "," + str(i) + "\r"
                # if count >= 8000 and count < 10000:
                        # print "Lv" + str(j) + "（Lv" + str(i) + "）" + "\r"

for i in range(1,999):
        print "Lv" + str(i) + "（才能限界なし）" + "\r"



'''
for i in range(100):
        if i < 90:
                print "1\r"
        elif i < 99:
                print "2\r"
        else:
                print "3\r"
'''
```


終わり
データグラム、セグメント、パケット、フレームについて整理

OSI参照方式において、扱われる各データの単位について、理解できていなかったので整理。


* データ

コンピュータが記録・処理できる形式にした文字や符号、数値などのまとまり。

* 情報
人間にとって意味のあるものや、データを人間が解釈した結果のことを情報と呼ぶ

* セグメント

トランスポート層において通信されるデータの単位で、TCPヘッダが頭に付けられたもの
ヘッダには、データの順番や再送機能が付与されている。

* データグラム

トランスポート層において通信されるデータの単位で、UDPヘッダが頭に付けられたもの
ヘッダには、データの順番や再送機能が付与されている。

* パケット

ネットワーク層において通信されるデータの単位で、
「ヘッダ＋セグメント」または「ヘッダ＋データグラム」。

ヘッダは、IPアドレスなど。

* フレーム

データリンク層において通信されるデータの単位で、
ヘッダ + パケット + トレーラ からなる。

ヘッダは、MACアドレスなど。
トレーラは、エラー検出情報。

http://www.atmarkit.co.jp/ait/articles/0802/26/news135.html
https://www.nttpc.co.jp/yougo/データグラム.html

* ソケット

通信するアプリケーション同士の出入り口のことで、
IPアドレスとポート番号の組み合わせで表現できる。
ソケット通信では、TCP、UDPのいずれかを利用する。

http://java-code.jp/category/socket
UDPサーバ立ち上げといて！

こんなことを言われた時に、対処した方法をメモ。

## どう立ち上げたか

- (大好きな) Node-RED で、UDP ノードってのがあったのを記憶していたのでそれを利用。
- とりあえず、Docker-compose でしょ。
- で、立ち上げた。

## 一瞬でもハマったポイント

- AWS EC2 で立ち上げたので、セキュリティグループで、UDP を指定する。
- Docker のポート指定で、 `/udp` を指定する。← **これ知らなかった。**
    - 記事はいっぱいあるけど、自分の備忘録で。

## Node-RED

下記、3つのファイルを用意して、 `docker-compose up -d --build` 。

Dockerfile

```docker
FROM nodered/node-red-docker
COPY ./settings.js /usr/src/node-red/node_modules/node-red/settings.js
EXPOSE 1880
CMD ["node", "/usr/src/node-red/node_modules/node-red/red.js"]
```

[settings.js](https://github.com/node-red/node-red/blob/master/settings.js) を適宜編集して使用。

```js
module.exports = {
    uiPort: process.env.PORT || 1880,
    mqttReconnectTime: 15000,
    serialReconnectTime: 15000,
    debugMaxLength: 2000,
    debugUseColors: true,
    flowFile: 'flows.json',
    flowFilePretty: true,
    credentialSecret: "a-secret-key",
    httpAdminRoot: '/admin',
    adminAuth: {
        type: "credentials",
        users: [{
            username: "root",
            password: "$2a$08$YCJb/v9xfKevOq0KPIkzLeuQHHyyjIh.iDjuAoWIpiUT9hWS9yhLS",
            permissions: "*"
        }]
    },
    httpNodeCors: {
        origin: "*",
        methods: "GET,PUT,POST,DELETE"
    },
    logging: {
        console: {
            level: "info",
            metrics: false,
            audit: false
        }
    },
    editorTheme: {
        projects: {
            enabled: false
        }
    },
}
```

docker-compose

```docker

version: '3'
services:
  nodered:
    build: .
    ports:
     - "1880:1880"
     - "1881:1881/udp"
    volumes:
     - nodered-data:/data
    networks:
      - nodered-net
volumes:
  nodered-data:
networks:
  nodered-net:
```

## Node-RED のフロー

![image.png](https://qiita-image-store.s3.amazonaws.com/0/201797/3a7b9255-7326-6224-bccb-ea3b5dad01b3.png)

```json
[
    {
        "id": "a516cbe4.dd80a8",
        "type": "udp in",
        "z": "611156f9.47b338",
        "name": "",
        "iface": "",
        "port": "1881",
        "ipv": "udp4",
        "multicast": "false",
        "group": "",
        "datatype": "buffer",
        "x": 140,
        "y": 60,
        "wires": [
            [
                "172c9d51.c36283"
            ]
        ]
    },
    {
        "id": "172c9d51.c36283",
        "type": "debug",
        "z": "611156f9.47b338",
        "name": "",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "false",
        "x": 350,
        "y": 60,
        "wires": []
    }
]
```
Julia-1.0でiris

# 概要

https://qiita.com/chezou/items/d090f26dcb31818d6964
にも同様の記事がありますが、Julia-1.0でirisデータのプロットや線形回帰など初歩的な処理をやってみます。

# 環境

```
Julia Version 1.0.0
Commit 5d4eaca0c9 (2018-08-08 20:58 UTC)
Platform Info:
  OS: Windows (x86_64-w64-mingw32)
  CPU: AMD E2-3000M APU with Radeon(tm) HD Graphics
  WORD_SIZE: 64
  LIBM: libopenlibm
  LLVM: libLLVM-6.0.0 (ORCJIT, generic)
```

使用パッケージは以下。

```julia
using RDatasets # irisデータ読み込み用
using Plots, StatPlots
using GLM # 線形回帰
```

# データ取得
これだけ。

```julia
iris = dataset("datasets","iris");
```

DataFrame形式で読み込まれます。

# プロット

プロットバックエンドはpyplotを使います。他のGRとかplotlyとかは、軸ラベルが表示されなかったりとか、まだちょっと使えない印象。

```julia
pyplot()

 Plots.PyPlotBackend()
```
エラーが出たときは、パッケージが足りてないので足します。PyCallとかLaTeXStringsとか。
PyCallはbuildしなおさないとだめみたい。

```julia
@df iris scatter(:PetalLength, :PetalWidth, group=:Species, legend=:bottomright, markerstrokecolor=:auto)
title!("iris petal plot")
xaxis!("PetalLength")
yaxis!("PetalWidth")
```
`markerstrokecolor=:auto`をつけることで、マーカーの縁が黒でなくfillカラーと同じになって見やすい。

![iris1.png](https://qiita-image-store.s3.amazonaws.com/0/294073/e57aa849-9198-392e-14cd-f86bb99f82ab.png)

# 線形回帰

GLMを使ってRみたいにモデル式を記入します。

```julia
lm1 = lm(@formula(PetalWidth ~ PetalLength), iris)
```

```
StatsModels.DataFrameRegressionModel{LinearModel{LmResp{Array{Float64,1}},DensePredChol{Float64,LinearAlgebra.Cholesky{Float64,Array{Float64,2}}}},Array{Float64,2}}

Formula: PetalWidth ~ 1 + PetalLength

Coefficients:
              Estimate  Std.Error  t value Pr(>|t|)
(Intercept)  -0.363076   0.039762 -9.13122   <1e-15
PetalLength   0.415755 0.00958244  43.3872   <1e-85
```

`predict`で回帰線プロット用のデータを作ります。

```julia
pre = predict(lm1)
plot!(iris[:PetalLength],pre,label="predict")
```

![iris2.png](https://qiita-image-store.s3.amazonaws.com/0/294073/dceb0c5e-b383-76ff-da3c-c8f81a0dc8b7.png)

残念ながら予想範囲計算の`:predint`はまだ実装されてないようです。
[ソースコード](https://github.com/JuliaStats/GLM.jl/blob/master/src/lm.jl)に

> interval_type == :confint || error("only :confint is currently implemented") #:predint will be implemented

と書いてあります。

# Gist

jupyter notebookをgistにあげておきます。
https://gist.github.com/Yoshinobu-Ishizaki/01bf9ce2ca11322a458d761f0ca824c5
Create React App  で作成したコンポーネントを script タグから使う。

Create React App の便利さに甘えたいが、作りたいのは SPA ではなくライブラリという場合にどうしたらいいのか調べて挫折して自分でなんとかしたっていう記事です。

##　やりたいこと

```html
<div class="myButton">
</div>

<script>
 ReactDOM.render(<MyButton/>, document.selector(".myButton"));
</script>
```

この MyButton を CRA で作成しマウント。

CRA は アプリケーションを丸々作ることを前提としているのでこれができないです。

## Create React app で作成したコンポーネントをライブラリとして出力する

https://webpack.js.org/configuration/output/

webpack には library 出力モードが用意されています。

この出力モードの中に umd があり、umd で出力すると、window　以下に展開されます。
この出力ができたら、script タグから参照することができるようになる、というわけです。


## Create React app のビルド設定のカスタマイズ

Create React app の出力をカスタマイズしたいみたいな issue が上がると　Dan Abramov　さんがどーんって現れて、こうしたらできる、そんなことしないよといって issue をバンバン閉じていきます。

<img width="352" alt="スクリーンショット 2018-09-25 0.52.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/5565/3bf72b3d-d83b-2cad-0240-df3d3ac19b44.png">

優しそうな顔してなかなかストイックなかたで、CRA に無駄な機能を増やさないようにしているようです。
この姿勢にはとても共感がもてます。
カスタマイズしたければ reject すればいいっていう割り切りがとても素晴らしいです。

やっぱり reject するとアップデートが大変なので困るっていう人はたくさんいて別プロジェクトでカスタマイズ可能な方法が作られています。

## React App Rewired

[react-app-rewired](https://github.com/timarney/react-app-rewired)

こちらを使うと CRA の Webpack など設定を必要な箇所だけ上書きできるようになっています。

## react-app-rewire-react-library

[react-app-rewire-react-library](https://github.com/osdevisnot/react-app-rewire-contrib/tree/master/packages/react-app-rewire-react-library)

こちらを使うと commonjs 形式で index.js 以外のエントリーを追加してビルドができます。
ただ commonjs のみの出力で、css などは出力してくれませんでした。

##　umd 形式で出力する方法

他に方法がなかったのでreact-app-rewire-react-libraryを　folk して　ライブラリのタイプの指定やcssなどを出力できるようにしました。

[react-app-rewire-react-umd-library](https://www.npmjs.com/package/react-app-rewire-react-umd-library)

## 使い方
README 参照（手抜き）
1日でTinder風マッチングアプリ（Rails）を作りながらプログラミングを学ぶ 9/24 [主催 : テックピット]

教材進めていく中で出会ったエラー
<img width="1013" alt="スクリーンショット 2018-09-25 0.55.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/253832/9ecc3534-7904-7ee8-b446-e4176571fbc0.png">
Raspberry Pi 用 TensorFlowLite ビルド

#概要
Raspberry Pi でTensorFlowLiteを動かしたいので、nightly-devel でビルドしてみました。


#準備
まず、docker イメージを起動します。

```
# docker pull tensorflow/tensorflow:nightly-devel
# docker run -it -w /tensorflow tensorflow/tensorflow:nightly-devel bash
```

次に、パッケージリストを更新した後、armhf のクロスビルドツールチェインをインストールします。

```
# apt update
# apt install -y crossbuild-essential-armhf
```

#ビルド
依存ファイルのダウンロードスクリプト実行後、ビルドを実行します。

```
# git pull
# ./tensorflow/contrib/lite/tools/make/download_dependencies.sh
# ./tensorflow/contrib/lite/tools/make/build_rpi_lib.sh
```

#成果物
成果物は以下のディレクトリに生成されています。

```
# ls ./tensorflow/contrib/lite/tools/make/gen/rpi_armv7l/lib
benchmark-lib.a  libtensorflow-lite.a
```

お疲れさまでした。

#参考
TensorFlow Lite for Raspberry Pi :
https://www.tensorflow.org/lite/rpi
Docker :
https://www.tensorflow.org/install/docker
Microsoft Searchをいじってみた

#Microsoft Searchとは
以前までBing for Businessとして知られていた(プレビュー機能だった)テナント内のコンテンツを横断的に検索できるサーチサービスです。9/24のMSIgniteでは、Bing for Businessに加えて、Officeからの検索についても紹介されていました。
詳細は[公式のポスト](https://www.microsoft.com/en-us/microsoft-365/blog/2018/09/24/microsoft-search-cohesive-search-that-intelligently-helps-you-find-discover-command-and-navigate/)を参照してください。

MSIgniteでの発表後に確認したところ、Admin centerに「Microsoft Search」が存在していました。
<img width="203" alt="admin.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/202779/e880805c-5400-5aa5-c2fe-a0256dbfe7f9.png">

とりあえず、管理画面をいろいろ見ていきます。

#Microsoft Search Admin portal
構成は、
1. Dashboard 
2. Bookmarks (ブックマークの組織への配布)
3. Q&A (未確認。Q&Aのコンテンツを登録できる。Officeで検索時に表示される?)
4. Users&Permissions (使える人と管理者)
5. Connected Services (どのサービスを検索範囲にするか)
6. Contents Settings (検索の構成。カラーテーマとロゴなど)
7. Tools (MS Search向けのextension群)

となっています。
<img width="1280" alt="dash.png" src="https://qiita-image-store.s3.amazonaws.com/0/202779/6d2b6db9-0a6d-6509-ca82-5572a75c350f.png">ダッシュボード。使っていないので、まだ空です。

<img width="1120" alt="bookmark.png" src="https://qiita-image-store.s3.amazonaws.com/0/202779/876448ea-7f4b-e04f-65d5-95423f207d7e.png">ブックマークの組織への配布が可能になります。

<img width="1126" alt="service.png" src="https://qiita-image-store.s3.amazonaws.com/0/202779/41482cb3-a247-6e0a-2434-eb19161cf0c1.png">Connected Services. 検索対象を設定できます。(Bing for Businessでは、人、グループ、ファイルというくくりでした)

<img width="1285" alt="contents.png" src="https://qiita-image-store.s3.amazonaws.com/0/202779/f9123283-794e-5855-bfcb-90021497796b.png">テナント情報はぼかしています。検索結果画面のロゴ、カラー、何かあったときの連絡先を登録できます。

<img width="1280" alt="tools.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/202779/f4cfd2d2-47e5-a262-a58b-ce736e40355a.png">Tools。Chrome向けのAAD認証Extensionなどもダウンロードできます。（前からあった？）

あと不明なのはQ&Aですが、これからまた触ってレポートしたいと思います。

##追記
Bingからだとまだ人のサーチが機能していないように見えます。（以前の投稿の通り）
ただOfficeから人が検索できるようになっていますね。
<img width="575" alt="powerpoint.png" src="https://qiita-image-store.s3.amazonaws.com/0/202779/43fe37d4-3661-2e4a-9089-0cd9ea941292.png">
Zshの導入

#zshとは

ログインシェルの一つ．
標準のログインシェルはbashだが，bashと比べて補完機能が強力だったり，ディレクトリ移動がいろいろと便利だったりするらしい．
導入してみたので，ログとして．

#zshの導入

##zshのインストール

###Mac

```bash
brew install --without-etcdir zsh
brew install zsh-completions
```



###Ubuntu

```bash
sudo apt install zsh
```

Ubuntuのzsh-completionsについては後日．

##ログインシェルの変更
このまま ```zsh``` と打てばzshのシェルを使用できるが，毎回 ```zsh``` を入力しなければいけないので，ログインシェルを変更する．

次の作業の前に ```which zsh``` でzshのディレクトリを確認しておくと安心

###Mac


```
sudo vim /etc/shells
```

```bash
# List of acceptable shells for chpass(1).
# Ftpd will not allow users to connect who are not using
# one of these shells.

/bin/bash
/bin/csh
/bin/ksh
/bin/sh
/bin/tcsh
/bin/zsh
```

一番下に先程 ```which zsh``` で取得したパスを入力する
標準では ```/usr/local/bin/zsh``` 
最後に以下のコマンドを入力．ただしディレクトリはzshのディレクトリ

```
chsh -s /usr/local/bin/zsh
```

###Ubuntu

```chsh``` を入力すると以下のようなメッセージが表示されるので，先程 ```which zsh``` で取得したパスを入力

```bash
Changing the login shell for root
Enter the new value, or press ENTER for the default
    Login Shell [/bin/bash]:
```

#zshの設定

zshの設定は基本的に.zshrcに記入する
主なものを列挙

```bash
#余分な空白は詰めて記録
setopt HIST_IGNORE_SPACE
#ヒストリファイルを上書きするのではなく、追加するようにする
setopt APPEND_HISTORY
#履歴がいっぱいの時は最も古いものを先ず削除
setopt HIST_EXPIRE_DUPS_FIRST
#履歴検索中、重複を飛ばす
setopt HIST_FIND_NO_DUPS
#前のコマンドと同じならヒストリに入れない
setopt HIST_IGNORE_DUPS
#history コマンドをヒストリに入れない
setopt HIST_NO_STORE
#履歴から冗長な空白を除く
setopt HIST_REDUCE_BLANKS
#履歴を共有
setopt SHARE_HISTORY
```
Fabric 2 で接続周りをシンプルにしたい

Fabric 2 で env を fabric みたいに何も考えずに設定して接続というのをやろうとしてたんだけど下記のように出来なさそう。
global は、バッドノウハウな匂いしかしないんだけど、他にやる方法ないのかな。
おとなしく .ssh/config を設定してそれを読み込ませるようにするのがベターなのかしら？

``` python
# -*- coding:utf-8 -*-
from fabric import Connection
from invoke import task

env = {}
conn = None


@task
def env_vagrant(c):
    global conn
    env['host'] = 'localhost'
    env['user'] = 'vagrant'
    env['kwargs'] = {
        'key_filename': '/home/vagrant/.ssh/id_rsa',
    }
    conn = Connection(
        env['host'],
        user=env['user'],
        connect_kwargs=env['kwargs'])


@task
def info(c):
    conn.run('pwd')
    conn.run('python --version')
    conn.run('pipenv --version')
    conn.local('ls')
```
Rubyで配列も引数に渡せるようにしたい場合はKernel#Arrayが便利

Rubyを記述しているときにメソッドに単体でも配列でもどっちでも渡せたらと思うときはありませんか？
そんなときは`Kernel#Array`を使うと便利です。

以下の`print_name`というメソッドをサンプルに考えてみます。
`Fruit`クラスを渡して、フルーツの名前を表示する簡単なメソッドです。

```rb
class Fruit
  attr_reader :name
  def initialize(name)
    @name = name
  end
end

def print_name(fruit)
  puts fruit.name
end

print_name(Fruit.new("Banana"))
```

出力結果

```
Banana
```

## フルーツが複数ある場合を考えてみる
先程の例ではフルーツが1つでしたが、複数になった場合を考えてみます。
複数のフルーツの名前を表示したいと思ったら、以下のようなコードを書くのではないでしょうか？

```rb
def print_name(fruit)
  puts fruit.name
end

# print_nameをFruitがあるだけ書きまくる
print_name(Fruit.new("Banana"))
print_name(Fruit.new("Apple"))

# もしくは配列にしてループする
[Fruit.new("Banana"), Fruit.new("Apple")].each do |fruit|
  print_name(fruit)
end
```

もしくは、`print_name`メソッドの中でループさせてもできそうです。

```rb
def print_name(fruits)
  fruits.each do |fruit|
    puts fruit.name
  end
end

print_name([Fruit.new("Banana")])
print_name([Fruit.new("Banana"), Fruit.new("Apple")])
```

どちらでも、複数のフルーツの名前を表示できますが、
`Fruitクラスのインスタンス単体`もしくは`Fruitクラスのインスタンスの配列`のどちらかを渡さないとメソッドが機能しません。

もっと柔軟に**どちらを渡しても**機能するようにできないのでしょうか？

## Kernel#Arrayを使えば単体でも配列でも機能するようにできる
こういうときに`Kernel#Array`を使うと引数が単体でも配列でも機能するメソッドを書くことができます。

```rb
def print_name(fruits)
  fruits = Array(fruits)
  fruits.each do |fruit|
    puts fruit.name
  end
end

print_name(Fruit.new("Banana"))
print_name([Fruit.new("Banana"), Fruit.new("Apple")])
```

`Kernel#Array`の動作をいくつか見てみます。

```rb
Array(nil)              #=> []
Array([])               #=> []
Array(1)                #=> [1]
Array([1])              #=> [1]
Array([1, 2])           #=> [1, 2]
Array([[1, 2]])         #=> [[1, 2]]
Array([[1, 2], [3, 4]]) #=> [[1, 2], [3, 4]]
```

ドキュメントによると、
`to_ary`、`to_a`の順で呼び出し、戻ってきた配列を返す。
また、どちらも定義されていない場合は指定した引数を配列にしたものを返すようです。
https://docs.ruby-lang.org/ja/latest/method/Kernel/m/Array.html

## まとめ
`Kernel#Array`を使えば単体、配列どちらでも渡せる柔軟性のあるメソッドを記述できるので便利です。
気になる人は使ってみてください。

あと、これは余談ですが、
`Kernel#Array`はなぜ`"A"rray`なのでしょうね？
Rubyのメソッドは一般的に小文字スタートだと思っているのですが・・・
気になるところです。

それではまた。
TomoProg
Raspberry Pi3にワンライナーで時報ってもらう

#■はじめに
ラズパイに時報ってもらいます。シンプルに。

#■結論
```sh:
echo "只今の時刻は、"`date "+%k"`"時 "`date "+%-M"`"分 "`date "+%-S"`"秒です。" | open_jtalk -m /usr/share/hts-voice/mei/mei_normal.htsvoice -x /var/lib/mecab/dic/open-jtalk/naist-jdic/ -ow /tmp/test.wav && aplay /tmp/test.wav
```
これで、「只今の時刻は、23時 20分 1秒です。」としゃべってくれます。


＃cron登録したいときは以下で。

```sh:
* * * * * export LANG=ja_JP.UTF-8;echo "只今の時刻は、"`date "+\%k"`"時 "`date "+\%-M"`"分 "`date "+\%-S"`"秒です。" | open_jtalk -m /usr/share/hts-voice/mei/mei_normal.htsvoice -x /var/lib/mecab/dic/open-jtalk/naist-jdic/ -ow /tmp/test.wav && aplay /tmp/test.wav
```

#■解説
```
echo "只今の時刻は、"`date "+%k"`"時 "`date "+%-M"`"分 "
`date "+%-S"`"秒です。"
```
セリフとして、「只今の時刻は、H時 M分 S秒です。」と作成。
一桁の時間は一桁になる（06秒とならない）ように。


```
| open_jtalk 
-m /usr/share/hts-voice/mei/mei_normal.htsvoice 
-x /var/lib/mecab/dic/open-jtalk/naist-jdic/ 
-ow /tmp/test.wav 
```
日本語発声の音声ファイル作成パッケージJTalkで、セリフをWAVファイル化。
-m <音響モデル>　※女性音声の[MMDAgent](http://www.mmdagent.jp/)を利用。
-x <辞書ディレクトリ>
-ow <出力WAVファイル>

```
&& aplay /tmp/test.wav
```
音声ファイルをaplayで音として出力。

※cron用は、日本語設定とecho内の%のエスケープを入れただけ。

#■準備
Raspberry Pi3に日本語で喋ってもらうまで
https://qiita.com/Higemal/items/6dde8637a680bfe200ca

RaspberryPi3で初めてcrontabを使う前に
https://qiita.com/Higemal/items/5a579b2701ef7c473062


#■出典/参考
Open JTalk
http://open-jtalk.sourceforge.net/

MMDAgent
http://www.mmdagent.jp/

Raspberry Pi3に日本語で喋ってもらうまで
https://qiita.com/Higemal/items/6dde8637a680bfe200ca

Raspberry Piでテキストを音声化する (Open JTalk)
http://www.taneyats.com/entry/raspi-open-jtalk

RaspberryPi3で初めてcrontabを使う前に
https://qiita.com/Higemal/items/5a579b2701ef7c473062

crontabでファイル名に日付が入ったログを吐くときはdateの%をエスケープしないとダメ
https://mochikoastech.hatenablog.com/entry/2018/08/29/221126
開発タブの表示方法

エクセルの開発タブの表示方法


１． ファイル　＞　オプションをクリック
![image.png](https://qiita-image-store.s3.amazonaws.com/0/289724/2bdb0df9-84dc-4e15-adc2-f3f4aeacff52.png)


２． リボンのユーザ設定　＞　開発タブ　のチェックボックスにチェック
![image.png](https://qiita-image-store.s3.amazonaws.com/0/289724/37053641-54ff-f18e-34ee-954931d82a9e.png)


３．開発タブが表示される
![image.png](https://qiita-image-store.s3.amazonaws.com/0/289724/1f5bae48-4bca-7bc5-9978-a379c062e5b0.png)
Flutter で print 出力を得たい

DartPadでは`print`で右ペインにlogを出力してくれるがVisualStudioCodeではOUTPUTおよびDEBUG CONSOLEに出力されなかった。

https://docs.flutter.io/flutter/foundation/debugPrint.html
公式ドキュメントでは`flutter logs`で追えると記載があるので、試してみた結果が以下。
とりあえずは`debugPrint`で事足りるかな。

<img width="517" alt="sc1.png" src="https://qiita-image-store.s3.amazonaws.com/0/16284/36790169-0de6-d2e5-00a4-0cff1d603bbe.png">

ちなみにこの後、`DEBUG CONSOLE`にも出力されるようになったが色々と謎が多い。
エクセルのPERSONAL.xlsb にマクロの追加方法

以下の手順にてPERSONAL.xlsb にマクロを追加する。
PERSONAL.xlsbにマクロを追加すること、全てのブックで追加したマクロを使用することができる。


１．PERSONAL.xlsb を開く。

格納先
C:\Users\<ユーザ名>\AppData\Roaming\Microsoft\Excel\XLSTART

※上記格納先にPERSONAL.xlsbが存在しない場合は、以下の手順にて作成。


##### PERSONAL作成方法
※PERSONAL.xlsb が作成されている場合は、「２． 開発タブ ＞ Visual Basic をクリック」へ

１－１. 開発タブよりマクロを記録する

・ マクロの記録 ＞　マクロの保存先.個人用マクロブック　＞　OK クリック
※開発タブの表示方法は[『開発タブの表示方法』](https://qiita.com/hhhkt/items/ab6742a5ff9ed240212d)参照
![image.png](https://qiita-image-store.s3.amazonaws.com/0/289724/9b55c7db-43a4-9e54-76f7-87b356c6942e.png)


１－２. マクロ記録終了

記録終了 をクリック

※マクロを新規に個人用マクロブックに保存する為だけなので、特に何もしなくてOK。
ただ、記録終了をクリックするだけでOK.
![image.png](https://qiita-image-store.s3.amazonaws.com/0/289724/060e8a7f-7416-e0c0-2cd9-a16b02b624e1.png)


１－３. 開いているエクセルファイルを全て閉じて、個人用マクロブックに保存する

個人用マクロブックに記録した後に、開いているエクセルファイルを全て閉じると、
ダイアログが表示される為、OKをクリックする。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/289724/7720f9a4-87f1-4369-9ca4-073acec119fb.png)


１－４． PERSONAL.xlsb が作成される。

格納先
C:\Users\<ユーザ名>\AppData\Roaming\Microsoft\Excel\XLSTART
![image.png](https://qiita-image-store.s3.amazonaws.com/0/289724/79020012-3a4c-be6e-d0c9-4feff7c218a2.png)




２. 開発タブ ＞ Visual Basic をクリック

![image.png](https://qiita-image-store.s3.amazonaws.com/0/289724/66c6b71c-3e44-f4e5-aab5-339aa0734a96.png)


３． PERSONALにマクロをインポートする

ファイル　＞　ファイルのインポート　＞　インポートするマクロを選択　＞　開く をクリック
![image.png](https://qiita-image-store.s3.amazonaws.com/0/289724/ef1f6767-328c-6808-d059-945da23388f9.png)

※インポート完了
標準モジュール配下にインポートしたマクロが表示される
![image.png](https://qiita-image-store.s3.amazonaws.com/0/289724/e0e88afe-a396-ade1-8113-d8130dd0c1aa.png)



４．PERSONALにマクロをインポートした後に、新規でブックを開く

新規に開いたブックの開発タブ.マクロをクリックすると、インポートしたマクロが表示される。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/289724/b781992b-e7f5-e660-f44e-8c4339ee6db9.png)