OmniAICreator/Qiita-1.07M huggingface dataset:
[python]opencvあれこれ

# import
```lang:python
import cv2 
```

# 画像を読み込む
```lang:python
img = cv2.imread('画像のパス')
# グレースケールで読み込み
gray_img = cv2.imread('画像のパス', cv2.IMREAD_GRAYSCALE))
```

# 画像を保存する
```lang:python
cv2.imwrite('保存先のパスとファイル名', img)
```

# 画像を表示する
```lang:python
cv2.imshow('window name', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
# 画像を反転する
```lang:python
# 上下反転
flip_img = cv2.flip(img_src, 0)
# 左右反転
flip_img = cv2.flip(img_src, 1)
# 上下左右反転
flip_img = cv2.flip(img_src, -1)
```

# 画像をリサイズする
```lang:python
resize_img = cv2.resize(img, (width, height))
cv2.imwrite('保存先のパスとファイル名', resize_img)
```

# 画像を回転させる
```lang:python
size = tuple([img.shape[1], img.shape[0]])
center = tuple([int(size[0]/2), int(size[1]/2)])

# 角度(プラスは右、マイナスは左)
angle = 20.0
scale = 1.0

rotation_matrix = cv2.getRotationMatrix2D(center, angle, scale)
img_dst = cv2.warpAffine(img, rotation_matrix, size, bg_img,
                         flags=cv2.INTER_LINEAR,
                         borderMode=cv2.BORDER_TRANSPARENT,
                        )

cv2.imwrite('保存先のパスとファイル名' ,img_dst)
```
Googleスプレッドシートでセルの値からバーコードを生成する。

#やりたいこと
Googleスプレッドシートのセルに数字が入っているので、その隣にバーコード化した画像を表示させたい。

##スプレッドシートのイメージ
|| A       |       B | 
|:-:|:----------------:|:-----------------:|
|1|数字             | バーコード画像 | 
|2|123456789             |（ここに数式を入れる）               | 
|3|987654321             |               | 


#完成した数式
```
=arrayformula(image("http://www.barcodesinc.com/generator/image.php?code=" & A2:A & "&style=68&type=C128B&width=245&height=50&xres=1&font=3", 3))
```

##数式の説明

###バーコード画像のURLを取得
下記のサイトでバーコードを生成できる。
[Free Online Barcode Generator: Make a Custom Barcode in Seconds](https://www.barcodesinc.com/generator/index.php)

生成したいバーコードの形式になるように、URLのパラメータを指定して、セルの値と結合する。
http://www.barcodesinc.com/generator/image.php?code=" & （バーコードにしたい数値） & "&style=68&type=C128B&width=245&height=50&xres=1&font=3

###IMAGE関数で画像を生成
IMAGE("バーコード画像のURL",3)
※今回はオリジナルサイズで表示するために、オプションとして3を指定

###ARRAYFORMULA関数で列に展開（任意）
ARRAYFORMULA("展開したい列範囲を指定")
今回は、A2セル以下のA列の値を変換したいので、「A2:A」を指定。

- ARRAYFORMULA適用前（A2）

```
=image("http://www.barcodesinc.com/generator/image.php?code=" & A2 & "&style=68&type=C128B&width=245&height=50&xres=1&font=3", 3)
```
- ARRAYFORMULA適用後（A2:A）

```
=arrayformula(image("http://www.barcodesinc.com/generator/image.php?code=" & A2:A & "&style=68&type=C128B&width=245&height=50&xres=1&font=3", 3))
```

#参考URL
- [Is there a way to have a barcode font in google spreadsheets? - Google Product Forums](https://productforums.google.com/forum/#!topic/docs/wozkcwnrFaw)
- [IMAGE - Docs editors Help](https://support.google.com/docs/answer/3093333)
- [ARRAYFORMULA - Docs editors Help](https://support.google.com/docs/answer/3093275)
Googleスプレッドシートの特定行に更新があった場合に、特定の人に通知する。


# やりたいこと
Googleスプレッドシートでシフト管理がされていて、管理者が更新しています。
管理者がシフトに「○」をつけた際（何らかの更新があった場合）に、該当の人にメールで通知が飛ぶようにしたいと思います。

下記はスプレッドシートのイメージです。

| |A|B|C|D|E|
|:-:|:-:|:-:|:-:|:-:|:-:|
|1| 名前     | 1月1日 | 1月2日 |1月3日|1月4日|
|2| 宛先 一男 |   ○ |      |      |      |
|3| 宛先 二郎 |     | ○    |      |      |
|4| 以下略    |     |      |      |      |

スプレッドシートには、[更新があった場合に通知をする機能](https://support.google.com/docs/answer/91588)がありますが、対象範囲を指定することができないようなので、Google Apps Scriptで実現したいと思います。

#完成したコード

```javascript:Code.gs
'use strict';
function sendNotification() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getSheetByName("シートの名前");
  const cell = ss.getActiveCell().getA1Notation();
  const columnNameInAlphabet = cell.replace(/\d+/,'');
//通知対象者と対応するメール通知先を連想配列で格納
  const recipients = { 
    '宛先 一男': 'xxxx@gmail.com',
    '宛先 二郎': 'yyyy@gmail.com'
  };
//更新行のA列の値を取得（名前が入っているはず）
  const person = sheet.getRange('A'+ sheet.getActiveCell().getRowIndex()).getValue();
//メールの件名と本文を指定
  const subject = '【更新】'+ss.getName();
  const body = person + 'の行が更新されました。\n' + ss.getUrl() + '\n更新対象は' + columnNameInAlphabet +'列です。';
//更新された行が通知対象の行を含む場合はメールを送る
  if (person in recipients == true){
    MailApp.sendEmail(recipients[person], subject, body);
  }  
};
```
##コードの説明

```Javascript:Code.gs
'use strict';
function sendNotification() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getSheetByName("シートの名前");
```
対象のスプレッドシートと更新対象のシートを指定します。

```Javascript:Code.gs
  const cell = ss.getActiveCell().getA1Notation();
  const columnNameInAlphabet = cell.replace(/\d+/,'');
```
更新された列をメール本文に含めたいので、getA1Notationでアクティブなセルの位置を取得します。取得したセル位置に含まれる数字をreplaceで空文字に置換して、列名のみにします。
※運用上、作業時に行を入れ替えて更新するので、列番号で記載するようにしています。普通はgetA1Notationで取得したセルの位置をそのまま記載してあげれば良いと思います。

```javascript:Code.gs
//通知対象者と対応するメール通知先を連想配列で格納
  const recipients = { 
    '宛先 一男': 'xxxx@gmail.com',
    '宛先 二郎': 'yyyy@gmail.com'
  };
//更新行のA列の値を取得（名前が入っているはず）
  const person = sheet.getRange('A'+ sheet.getActiveCell().getRowIndex()).getValue();
```
メールアドレスの情報はスプレッドシートにないので、ここで連想配列として紐付けをします。
そして、更新行の名前が入っている列（今回はA列）の値を取得します。

この二つは後ほど突合するため、表記が一致している必要があります。（姓名の間にあるスペースなど）

```javascript:Code.gs
//メールの件名と本文を指定
  const subject = '【更新】'+ss.getName();
  const body = person + 'の行が更新されました。\n' + ss.getUrl() + '\n更新対象は' + columnNameInAlphabet +'列です。';
```
メールの件名は、スプレッドシートの名前先頭に【更新】を付与することにしました。
メール本文には、スプレッドシートのURLと更新された列名を記載します。

```javascript:Code.gs
//更新された行が通知対象の行を含む場合はメールを送る
  if (person in recipients == true){
    MailApp.sendEmail(recipients[person], subject, body);
  }  
};
```
更新された行のA列に書いてある名前(person)と、メール配信先の配列(recipients)のキーを突合して、一致する場合はメールを送信します。

#スプレッドシートのトリガーを設定
該当のスプレッドシートで「スプレッドシートから」「値の変更」時に起動するようトリガーを設定してください。
USB Type-Cケーブルについて

#USB Type-Cケーブル100均で買ってみた
普通に挿すと充電できないのだが、
故障か思っていたら、pcでは充電出来るるっぽい・・

ちょっと私の頭には理解不能。

#そう思っていたが・・？
ゆっくりと挿したら認識されてしまった。
やっぱり私の頭では理解不能・・・(-_-;)

悩んでいる人がいたら実践してほしい。
【備忘録】クラウドサーバーを使って開発してみる(1)--Alibaba Cloud でLAMPの環境構築





Alibaba Cloud の購入及び設定について[こちら](https://jp.alibabacloud.com/help/product/25365.htm?spm=a3c0i.mja.a1.1.33d5c68fWjld24)に参照してください。
手続きが簡単ですが、誰でも訪問できるように、ポートを80に設定する。

今使っているクラウドOSはcentos7で、LAMPの開発環境(centos7+Apache2.4+mysql5.7+php7.1)を構築してみる

開発用のOS　はmacOSなので、リモートでログインする(windowsの場合はputtyが必要)




```
$ ssh root@私のクラウドサーバーのIPアドレス
```







#1.apache  をインストール


```
# yum -y install httpd
# yum -y install httpd-manual mod_ssl mod_perl mod_auth_mysql
```
新しいユーザーを作る：useridを自分のidを置き換えてください。

```
# adduser -d /var/www/html userid
```
このユーザーのパスワードを設定

```
# passwd userid
```
ディレクトリ権限の修正

```
# chown -Rf userid.userid /var/www/html
```
スタート

```
# service httpd start
```
サーバーが起動する時に、Apacheを自動的にスタートさせる

```
# chkconfig httpd on
```
ディレクトリ権限をチェック

```
# cd /var/www
```
```
# ls -l
```


#2.mysqlをインストールする
centos7にインストールする時に、[こちら](https://weblabo.oscasierra.net/installing-mysql57-centos7-yum/)を参照しました。

事前準備：古いバージョンのmysqlを削除すること

```
# yum remove mariadb-libs
# rm -rf /var/lib/mysql/
```

 yum リポジトリを追加する

```
yum localinstall http://dev.mysql.com/get/mysql57-community-release-el7-7.noarch.rpm
```

インストール

```
# yum -y install mysql-community-server
```
インストールしたバージョンをチェック

```
# mysqld --version
```

サーバーを起動したら自動的に MySQL Server が起動するように設定

```
# systemctl enable mysqld.service
```
mysqlを起動

```
# systemctl start mysqld.service
```
初期パスワードを取得

```
# grep 'temporary password' /var/log/mysqld.log
```
初期パスワードをコピーしてパスワードを再設定するには使う。

```
# mysql_secure_installation
```
新しいパスワードの設定規約は:英字小文字+英字大文字+数字+特殊文字です。

セキュリティーの設定の詳細は[こちら](https://qiita.com/fantasista_21jp/items/59a69fc0746ded8601d4)をご覧ください。（私は基本的にYをする）

mysqlを接続

```
mysql -u root -p私のパスワード
```
#3.php7をインストール

```
# rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
```

必要となるモジュールをインストールする（必要に応じて）

```
yum install --enablerepo=remi,remi-php71 php php-devel php-mbstring php-pdo php-gd php-xml php-mcrypt php-mysql php-pear php-xmlrpc php-imap php-common gd php-gd gd-devel
```
インストールされたモジュールとバージョンをチェック

```
# rpm -qa | grep php
# php --version
```
その後、/var/www/html/phpinfo.php ファイルにphpinfo();をs出力させようと、ソースコードがそのまま表示されるので、色々調べた結果、
1.php.iniは設定されてないかもしれない
2.apacheはまだ再起動しませんでした

と考えて、[こちら](https://qiita.com/kyophp/items/0110d4307eff747c7092)に参考して、php.iniを設定した。

設定が完了後、phpinfo.php ファイルを/var/www/htmlに作り、vimで編集する

```
# cd /var/www/html
# touch phpinfo.php
# vim phpinfo.php
```

```php
<?php
 echo phpinfo();
 ?>

```
Apacheを停止させ、再起動する

```
# service httpd stop
# service httpd start
```

ブラウザに`http://私のIPアドレス/phpinfo.php`を入力して、以下のペーいが表示されて成功です。
<img width="1054" alt="スクリーンショット 2018-01-04 17.44.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/117741/008b14cd-0fd1-1a4f-4b6d-b13157fbf618.png">


#4.まとめ
今までローカル環境でのLAMP構築とほとんど変わらないが、次に、
2.laravel/wordpressの構築
3.ソースをクラウドサーバーにpushし、反映させる。
を試みたいと思います。
パワポカラオケ用Webアプリを作った

友達とクリスマスイブにパワポカラオケをすることになり
（リア充！）
、そのためのアプリを作りました。
その後、細かいバグ潰しやスタイリングをして今日公開しました。

[パワポカラオケ](https://ygkn.github.io/powerpokaraoke/)

# 使い方
1. 「スライド」、「お題」を設定します。
  - 必要なら「設定」で制限時間/音声ONorOFF/一人あたりのスライドの枚数を設定できます。
2. 出場者を入力します。
  - カメラのマークをクリック/ドロップで顔写真を設定できます。
3. 「START」を押したらあとは画面クリックですすみます。

# パワポカラオケを支える技術
## [React](https://reactjs.org/)
最初はライブラリ不使用でいけるかなと思ったのですが、データの取り扱いなどが煩雑になってきたので、設計の段階で React + Redux で作ることにしました。Vue など他のライブラリでも大差なかったのではないかと思います。
## [Create React App](https://github.com/facebookincubator/create-react-app)
いつものやつです。
## [Redux](https://github.com/reactjs/redux)
いつもの。[React Redux](https://github.com/reactjs/react-redux)と一緒に。
## [styled-jsx](https://github.com/zeit/styled-jsx)
今回CSSは styled-jsx という新しめのライブラリを試しました。

- Vue や Shadow DOM っぽく書ける
- （styled-components と比べ）余計なコンポーネントを作る必要がなくなる
- [Hyper](https://hyper.is/)、[Now](https://zeit.co/now) の [ZEIT](https://github.com/zeit) プロダクト

といった点でよさげだったので選びました。

結果は、メリットは上記の通りで、

- [react-transition-group](https://github.com/reactjs/react-transition-group) の CSSTransition がうまく動かない？（自分の書き方が悪いだけ？）
- Babel の設定が必要なので Create React App を `eject` しなきゃいけない

といったデメリットがありました。

また、情報が少ない（英語でも少ない。日本語は皆無）ので今度記事を書こうかなと考えています。

## [ESLint](https://eslint.org/)、[prettier](https://github.com/prettier/prettier)
ソースコードを綺麗にするやつです。
自動整形してくれるのでコードの（見た目の）綺麗さは気にしないでバリバリ書いていけるのが快感です。やみつきになる。

自分は[VSCode](https://code.visualstudio.com/)で書いているのでVSCodeの[拡張機能](https://marketplace.visualstudio.com/items?itemName=esbenp.prettier-vscode)で保存時に整形するようにしています。

## [FontAwesome](https://fontawesome.com/)
5.0 になってめっちゃ変わってて驚きました。上記リンクは 5.0 のです。

5.0で追加されて機能で、Web Font ではなく、SVG を JavaScript で直埋めするというのがユーザーのフォント設定やリーダーアプリなどのアクセシビリティ的にいいです（もちろん Web Fontsを利用した従来のやり方も使えます）。

今回は [react-fontawesome](https://github.com/danawoodman/react-fontawesome) を使いました。

## [React Slot Machine](https://github.com/ygkn/react-slot-machine)
このパワポカラオケのためにDIYしたライブラリです（宣伝）。
ドキュメントが ~~適当~~ 未完成なので充実していきます。
## 効果音
[効果音ラボ](https://soundeffect-lab.info/sound/anime/)様からお借りしました。

再生には[HTMLAudioElement](https://developer.mozilla.org/ja/docs/Web/API/HTMLAudioElement)を使っています。

# これから
このアプリでは画像とテーマを用意する必要があるので自動生成できるようにしたい。
→ [このパワポカラオケのアプリ](https://qiita.com/kyoyababa/items/13237abe464b25bf92b7)はできる。

面白かった人の投票機能とかも作る？。

タイマーで redux-saga を使ったほうがいいんですかね。

# さいごに

FontAwesome の中で SVG の `fill` を CSS の `color` と一緒にするために使われる [`currentColor`](https://developer.mozilla.org/ja/docs/Web/CSS/color_value#currentcolor_keyword) という CSS の値を初めて知りました。
いろんな所に応用が効きそうです。
Google Apps Scriptで複数サイトのPageSpeedInsightsをまとめて測る

業務で複数のサイトのスピードを調べる機会があったので、GASでやってみた。
GASはだいたい5分ぐらいまでしか実行できないのですが、今回はそこまで多くなかったので延長処理は入れてないっす。
10個ぐらいが限度かな？
延長処理のやり方とかわかる方がいたら教えてください。

# 見え方
こんな感じでA列にURLを入れ
PC,SPの点数をB,C列に入れるようになります。
ボタンをクリックしたらテスト開始です。
（あまり良い数値が出てないのはご愛嬌でw）
![スクリーンショット-2018-01-04-16.55.32.jpg](https://qiita-image-store.s3.amazonaws.com/0/67017/6f8c72af-e0e8-bac2-2633-30e419441611.jpeg)

# apiキーを取得する
[API_TOKEN_PAGESPEED](https://console.developers.google.com/apis/api "API_TOKEN_PAGESPEED")でPageSpeed Insights APIを選択し、有効にする。
検索で[page]とか入れると速攻で見つかります!!
<img width="980" alt="スクリーンショット 2018-01-04 17.13.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/67017/37c12b9c-7af5-666c-f217-b8b3e72df23f.png">
有効化した後に認証情報を作成を選択し、[APIキー]を選ぶと英文字、数字の羅列が表示されるのでそれをスクリプト実行時に使います。

# スクリプトソース

```
function runPageSpeed() {
  // アクティブなスプレッドシートのアクティブなシートを使用する
  var sheet = SpreadsheetApp.getActiveSheet();
  // APIを変数に格納
  var APIkey = 'XXXXXXXXXXXXXXXXXXXXXXXXXXX';
  // 2行目〜内容のある最終行目に対して処理
  for (var i=2; i <= sheet.getLastRow(); i++) {
    // A列のURLを取得し空の場合はスキップ
    var url = sheet.getRange(i,1).getValue();
    if (!url) { continue; }
    // デスクトップとモバイルそれぞれの際のURLを配列に入れる
    var request = 'https://www.googleapis.com/pagespeedonline/v2/runPagespeed?url=' + url + '&key=' + APIkey + '&strategy=';
    var url = [request + 'desktop', request + 'mobile'];
    // URLをAPIに投げてみてエラーが返ってくる場合はログに残す
    try {
      var response = [
        UrlFetchApp.fetch(url[0], {muteHttpExceptions: true }),
        UrlFetchApp.fetch(url[1], {muteHttpExceptions: true })
      ];
    }
    catch (err)
    {
      Logger.log(err);
      return(err);
    }
    // jsonをパースする
    var parsedResult = [
      JSON.parse(response[0].getContentText()),
      JSON.parse(response[1].getContentText())
    ];
    // ログを残す。jsでのconsole.logみたいなもの
    Logger.log(parsedResult[0].ruleGroups.SPEED.score);
    Logger.log(parsedResult[1].ruleGroups.SPEED.score);
    // B列にPCのスコア、C列にSPのスコアを書き込む
    sheet.getRange(i,2).setValue(parsedResult[0].ruleGroups.SPEED.score);
    sheet.getRange(i,3).setValue(parsedResult[1].ruleGroups.SPEED.score);
  }
}
```

*apiはvar.2を使用しましょう。

# その他
今後やってみたいカスタム

- スコアによって色分
- サイト数が増えても連続で実行する
- 終了したらslackに通知する

時間が見つけてやってみたいですね。

参考：
https://qiita.com/katsunory/items/4d10e10f0660992ae869
https://tonari-it.com/google-apps-script-manual/
http://blog.techium.jp/entry/2016/03/12/100000#%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%E3%81%AE%E4%BD%9C%E6%88%90%E6%96%B9%E6%B3%95
Yocto GUIツール Toasterを使ってみた

# Yocto GUIツール Toasterを使ってみた

## Toasterとは

ToasterはYoctoの操作をGUI(ブラウザ上)で行うためのツールです。
Yoctoはビルドにかなりの時間がかかる(以前かなりの低スペでビルドを走らせた時に完了まで4日かかったことがある、普通は6時間ほど)上に、ビルドをするたびにガッツリストレージを食っていく（５０GBくらい)ため、Yocto専用のサーバーを立てて、そこでビルドを行うことも多いでしょう。
そういった時にToasterを使えば、いちいちsshログインせずにビルドを走らせることが出来るので、効率が上がるのではないかと思い、今まで存在は知っていても触っていなかったToasterを使ってみることにしました。

## Toasterのセットアップ・起動
### セットアップ・初回起動
Toasterの依存しているパッケージをインストールします。
必要なパッケージは`poky/bitbake/toaster-requirements.txt`に書いてあるので、それを使います。
> 以下では、`/home/user/work`下に`poky`ディレクトリ(や他のレイヤーディレクトリ)があると仮定しています。

```bash
$ sudo apt-get install python3-pip
$ pip3 install --user -r /home/user/work/poky/bitbake/toaster-requirements.txt
```

次にToasterを起動します。
Toasterの起動は`build`ディレクトリ内で行います。
`build`ディレクトリ内で`source toaster start`で起動、`source toaster stop`で停止です。

```bash
$ cd /home/user/work
$ source poky/oe-init-build-env
$ source toaster start
```

初回起動時はレイヤー情報等を読み込むため起動まで時間がかかるようです。
次のような画面が表示されます。

```
The system will start.
Check if toaster can listen on localhost:8000
OK
Operations to perform:
<snip>
-2017-12-24 16:36:24,758 INFO Fetching metadata releases for morty HEAD
Updating Releases 100%
<snip>
You can now run 'bitbake <target>' on the command line and monitor your build in Toaster.
You can also use a Toaster project to configure and run a build.

Successful start.
```

`Successful start`が表示されたら、`http://localhost:8000`を見るとToasterを起動できます。

### IPアドレス・ポートを指定して起動

IPアドレス・ポートを起動時に渡してやることでIPアドレス・ポートを指定して起動することができます。
次のように`webport=<IPアドレス>:<ポート>`で指定できます。

```
$ source toaster stop #Toasterを既に起動していたら停止する
$ source toaster start webport=192.168.0.xx:8000
```

## Toasterの使い方

基本的な使い方は[このビデオ](https://www.youtube.com/watch?v=qYgDZ8YzV6w)を見ればわかります。
おおまかな流れとしては

1. **New Project**で新規プロジェクトを立ち上げて、プロジェクト名・Yoctoのバージョンを選択
2. **Image recipes**からビルドしたいイメージを選択(**Add layer**)する(これによって依存レイヤーが全て追加されるので楽)
3. その他に追加したいレシピがあれば、**Software recipes**から探して同じように追加する
4. **Configuration**でビルドターゲットマシン(**Machine**)を選択する
5. 必要があれば**bitbake variables**からBitbake変数を編集する。
6. 右上の**Type the recipe you want to build**と書かれているテキストボックスにビルドしたいレシピを入力し、ビルド

となっています。

まだ、本格的に使用できていませんが、少し触ったから感触からはかなり使いやすいツールだと思います。
新しいレシピを試してみたり、新しいボードをビルドするときは`local.conf`や`bblayers.conf`をあっちゃこっちゃすることも多く、結構時間がかかっていたのですが、Toasterでは一画面でそれらの操作を完結出来るため、効率アップが期待できそうです。
Yoctoの最も悩ましい側面であるビルドエラーもそこそこ見やすいので、現状満足しています。

---
## 参考資料
[Toaster Usetr Manual](http://www.yoctoproject.org/docs/2.2/toaster-manual/toaster-manual.html)
Unicorn HAT HDで日本語を表示する

念願のRaspberryPi3を購入できました ('-'*)
その際UnicornHAT HDに興味を惹かれつつ、日本語の表示ってどうなんだろうと半信半疑ながらも人柱覚悟で一緒に購入してみました

# 結果

問題なく表示できますｗ

![Attachment1.jpg](https://qiita-image-store.s3.amazonaws.com/0/180964/b3ccc684-f3eb-8edb-7bf0-7dd2c1ffc292.jpeg)
![Attachment2.jpg](https://qiita-image-store.s3.amazonaws.com/0/180964/92d00c81-336c-9b98-73cd-977218bdca7c.jpeg)



# 作業手順

とりあえず、Unicorn HATは未装着の状態で作業を行います

## フォントのインストール

とにもかくにもフォントが必要なので、<A HREF="https://www.google.com/get/noto/" target="_top">GoogleのNotoフォント</A>を入れました
 
```
apt-get -y install fonts-noto
```

※ その後再起動しました

## UnicornHAT HD関連 いろいろインストール

<A HREF="https://github.com/pimoroni/unicorn-hat-hd" target="_top">公式</A>に従って

```
curl https://get.pimoroni.com/unicornhathd | bash
```

※ root権限ではインストールできませんでした、一般ユーザで作業しましょう

※ その後シャットダウンし、UnicornHATを取り付けました

## 日本語表示用スクリプト

とりあえず<A HREF="https://github.com/pimoroni/unicorn-hat-hd/blob/master/examples/text.py" terget="_top">サンプルコード</A>をさくっとコピーしました
(pathは適当に読み替えていただければ・・・)

```
cp -R /home/pi/Pimoroni/unicornhathd /opt/
cp /opt/unicornhathd/examples/text.py /opt/unicornhathd/
```

ではでは、改変します

2行目にUFT-8の指定を追加します

```
#-*- coding: utf-8 -*-
```

24行目 - 29行目まで、表示させる文字列を日本語に変えます
その際、Unicodeを明示します

```
lines = [u"あ",
         u"ア",
         u"亜"]
```

37行目 FONT指定部分の変更

```
FONT = ("/usr/share/fonts/truetype/freefont/FreeSansBold.ttf", 12)
↓
FONT = ("/usr/share/fonts/opentype/noto/NotoSansCJK-Regular.ttc", 12)
```

試行錯誤の結果、これで大丈夫でした

### ついでに

45行目 unicornhathd.rotation(0)の部分を
unicornhathd.rotation(90)とか、unicornhathd.rotation(180)、unicornhathd.rotation(270)で表示方向が変わるので自由に配置できますね('-'*)

<!--

### ついでのついでに

コードの冒頭に

```
from sys import argv
args = argv

if (len(args) < 2):
  print u'need argument'
  exit()
```

を追加しつつ、24行目の lines = の部分を

```
args.pop(0)
lines = []
for line in args:
  lines.append(unicode(line, 'utf-8'))
```

としました。

-->
ディストロ別 logrotateで使えないディレクティブまとめ

どのLinuxディストロにも必ず入っているlogrotateですが、バージョンの違いにより別ディストロでのノウハウが使えなかったりすることがままあります。
そこでディストロ別に使用できないディレクティブをまとめてみました。

# まえがき
* 確認は2020/5/4時点のものです。
* 以下で述べるlogrotate最新版は [3.16.0](https://github.com/logrotate/logrotate/releases/tag/3.16.0) を指します。
* 各ディストロのlogrotateパッケージは2020/5/4時点の最新版です。
* 不具合修正、挙動の違いは省略しています。

# 比較表
|                            | RHEL/CentOS 6.10<br>*3.7.8-28.el6*<br><br>Amazon Linux 2018.03<br>*3.7.8-26.14.amzn1* | RHEL/CentOS 7.8<br>*3.8.6-19.el7*<br><br>Amazon Linux 2 20200406<br>*3.8.6-15.amzn2* | RHEL/CentOS 8.1<br>*3.14.0-3.el8* | Ubuntu 16.04.6 LTS<br>*3.8.7-2ubuntu2.16.04.2* | Debian 9.12 (Stretch)<br>*3.11.0-0.1*<br><br>Ubuntu 18.04.4 LTS<br>*3.11.0-0.1ubuntu1* | Debian 10.3 (Buster)<br>*3.14.0-4*<br><br>Ubuntu 20.04 LTS<br>*3.14.0-4ubuntu3* | 実装されたlogrotateバージョン |
|:----------------------------|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|ログ個別の設定内で include   |×|◯|◯|◯|◯|◯|3.7.9|
|dateyesterday                |×|◯|◯|◯|◯|◯|3.8.0|
|su                           |×|◯|◯|◯|◯|◯|3.8.0|
|maxsize                      |◯[^1]|◯|◯|◯|◯|◯|3.8.1|
|preremove                    |×|◯|◯|◯|◯|◯|3.8.4|
|--version コマンドラインオプション|×|◯|◯|◯|◯|◯|3.8.4|
|hourly                       |×|◯|◯|◯|◯|◯|3.8.5|
|createolddir / nocreateolddir|×|◯[^1]|◯|×|◯|◯|3.8.9|
|renamecopy                   |×|×[^2]|◯|×|◯|◯|3.8.9|
|dateformat における %H       |×|◯[^1]|◯|×|◯|◯|3.9.0|
|-l コマンドラインオプション  |×|◯[^1]|◯|×|◯|◯|3.9.0|
|dateext における %M, %S, %V  |×|×|◯|×|◯|◯|3.9.2|
|-l syslog コマンドラインオプション|×|×|◯|×|◯|◯|3.9.2|
|taboopat                     |×|×|◯|×|◯|◯|3.11.0|
|addextension                 |×|×|◯|×|◯|◯|3.11.0|
|minage                       |×|×|◯|×|◯|◯|3.11.0|
|datehourago                  |×|×|◯|×|×|◯|3.14.0|
|rotate -1                    |×|×|×|×|×|×|3.15.0|

# まとめ
* RHEL/CentOS 6・7は古めですが、バックポートで使えるようになっている機能があります。
* Amazon LinuxとUbuntuは元となったディストロ（RHEL・Debian）とパッケージ内容がほぼ同一だったため、上記比較表ではまとめてあります。
* 3.15.0で追加された `rotate -1` （ローテートしたログを削除しない）が使えるディストロは現時点でまだ存在しないようです。

[^1]: バックポートにて対応
[^2]: `man logrotate` に記述があるが使用不可

<!--
# 変更履歴
- 2018/1/4
  - 初版
- 2020/5/4
  - logrotateバージョン
    - 3.13.0→3.16.0
    - datehourago・rotate -1 行追加
  - カラム統合
    - RHEL/CentOS6 + AmazonLinux1
    - RHEL/CentOS7 + AmazonLinux2
    - Debian9(Stretch) + Ubuntu18.04LTS
    - Debian10(Buster) + Ubuntu20.04LTS
  - ディストロ追加
    - RHEL/CentOS8
    - Debian10(Buster)/Ubuntu20.04LTS
  - ディストロ更新
    - RHEL/CentOS6: 6.9→6.10
    - RHEL/CentOS7: 7.4→7.8
    - Ubuntu16.04LTS: 16.04→16.04.6
    - Debian9(Stretch): 9.3→9.12
  - 訂正
    - RHEL/CentOS6で実際は使用できない renamecopy が ○ になっていた
  - 比較表
    - ソート順をlogrotate実装順に変更
    - 対応バージョン→実装されたlogrotateバージョン
    - ディレクティブ名カラムを整理して記述を短縮
-->
Wercker で glide を使った Golang のビルド

はじめに
-------

[Wercker で dep を使った Golang のビルド](https://qiita.com/noissefnoc/items/abbf71fa21cf5824d6de) でうまくいっていなかった。そこでアプリを先に書くことにした。が、アプリが書きあがってしまったので `dep` への移行が促されているが [Masterminds/glide](https://github.com/Masterminds/glide) を使うことにした。

tl;dr
-----

`wercker.yml` の `build` の `steps` に `glide-install` を書く。

全体的には以下

```wercker.yml
build:
    steps:
        # プロジェクトルートを GOPATH 配下に移動
        - wercker/setup-go-workspace:
          package-dir: <SOME_PATH>

        # glide をインストールして glide install する
        - glide-install
        
        # ビルド
        - script:
            name: compile binary
            code: |
                 go build

        # テスト
        - script:
            name: test
            code: |
                 go test
```

上記でローカル/Web共にCIが通るようになった。


課題
----

Wercker で Go の CI を実行できるようになった。しかし、 `dep` への対応はできていない。 `glide` 自身が `dep` への移行を促しているので、 `dep` に対応したい。

[wercker/step-glide-install](https://github.com/wercker/step-glide-install) を参考にして `step-dep-install` を作れるか見てみる。


参考
----

* wercker の step のモジュール
    * [wercker/step-setup-go-workspace](https://github.com/wercker/step-setup-go-workspace)：プロジェクトルートを `GOPATH` に含める
    * [wercker/step-glide-install](https://github.com/wercker/step-glide-install) ： `glide` をインストールして `glide install` を実行する
ArduinoとWiiヌンチャクコントローラでマウスを作る

こちらに移行しました。

https://blog.enkatsu.org/posts/arduino-wii-nunchuck/

<!--

![mouse.gif](https://qiita-image-store.s3.amazonaws.com/0/80816/85a5644a-4276-b69e-1412-30ae463ca16a.gif)

## 目的

寝っ転がりながらPCを操作できるマウスを作る

## 材料
- Arduino Leonardo
- Wiiヌンチャクコントローラ

## 手順

["wii nunchuck arduino"](https://www.google.co.jp/search?q=wii+nunchuck+arduino&oq=wii+nunchuck+arduino&aqs=chrome..69i57j69i60l3j0l2.2182j0j4&sourceid=chrome&ie=UTF-8)などで検索すると色々資料が出てくる。
WiiヌンチャクコントローラはI2C通信を使用しているようなので、Wireライブラリを使用する。
またArduinoによりマウス操作を行うため、Mouseライブラリを使用する。
MouseライブラリはArduino LeonardoとArduino Microに対応しているので、今回はArduino Leonardoを使用した。
Wiiヌンチャクコントローラの端子を切ってワイヤストリッパで剥くとこんな感じに赤、黒、緑、黄色の線が出てくる。
これらを以下のように配線する。

- +(赤) -> 3.3V
- -(黒) -> GND
- SDA(緑) -> D2
- SCL(黄色) -> D3

![IMG_6437.JPG](https://qiita-image-store.s3.amazonaws.com/0/80816/681edd44-aea7-e7d6-c82a-f91904b6ffc6.jpeg)
![IMG_6438.JPG](https://qiita-image-store.s3.amazonaws.com/0/80816/d4403a9f-9fe2-3ccb-64a1-91d54bdb9a05.jpeg)
![IMG_6435.JPG](https://qiita-image-store.s3.amazonaws.com/0/80816/0353bf11-bb95-e000-f770-74b4ac33bc96.jpeg)

プログラムは以下のリポジトリから
[enkatsu/NunchuckMouse](https://github.com/enkatsu/NunchuckMouse)

## 課題

- 今のままではスクロールができないのでブラウザの操作が困難
- マウスのスピードを調整可能にする

## 参考

- [todbot/wiichuck_adapter](https://github.com/todbot/wiichuck_adapter/tree/master/firmware/WiichuckDemo)
- [片手でゲームをしたい！](http://cubic9.com/Devel/%C5%C5%BB%D2%B9%A9%BA%EE/Arduino/%A5%B2%A1%BC%A5%E0%A5%B3%A5%F3%A5%C8%A5%ED%A1%BC%A5%E9%A1%BC/)

-->
MBPのバッテリー劣化をコマンドで確認する


# 概要

Mac book proのバッテリーの劣化具合をコマンドで確認するメモ。


1. `ioreg` コマンドでバッテリー情報を取得できる
2. `DesignCapacity`が出荷時の容量（mAh）
3. `MaxCapacity`が現在の容量（mAh）
4. `MaxCapacity`を`DesignCapacity`で割ると劣化具合がわかる。


```bash
(以下の環境で確認した)
$ sw_vers
ProductName:	Mac OS X
ProductVersion:	10.12.6
BuildVersion:	16G1036
```




# コマンド

```bash

DesignCapacity=$(ioreg -c AppleSmartBattery | grep DesignCapacity | awk '{print $NF}')
MaxCapacity=$(ioreg -c AppleSmartBattery | grep MaxCapacity | awk '{print $NF}')
echo "MaxCapacity: "$MaxCapacity
echo "DesignCapacity: "$DesignCapacity
echo -n "AttritionRate: " && echo "scale=3; (${MaxCapacity}/${DesignCapacity}) * 100" | bc 
```

```bash

(結果)
MaxCapacity: 6133
DesignCapacity: 6559
AttritionRate: 93.500
```
【初心者向け】Gear VR with Controller 開発準備 on Unity

#はじめに
今更GearVRのセットアップかよと思われるかもしれませんが、私はようやく環境が整い、いざ「VRアプリ作ったろ！」とsdkを入れた所でいくつかの凡ミスから躓いて時間を取られてしまいました。世界中のどこかには自分と同じ箇所で苦しんでいる人がいるはずという過剰な自意識から、共有したいと思います。

# 開発環境
mac book pro (Sierra 10.12.6)
Unity 5.6.2f1 (5.~版のほうが安定してる旨の記事をどこかで読んだので、2017版ではなくこちらにしました)
Oculus SDK 1.21.0

# インストール
Unity ダウンロードアーカイブ (5.~版はここで落としました)
https://unity3d.com/jp/get-unity/download/archive

Oculus SDK
https://developer.oculus.com/downloads/package/oculus-utilities-for-unity-5/1.21.0/
で落としたzipを解凍して出てきたunitypackageをUnityプロジェクトを開いてる状態で開いてインポートしてください。
<img width="145" alt="スクリーンショット 2018-01-04 15.28.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/126115/78fff331-b7bf-3c9e-1498-d9753cd62470.png">
こんな感じにアセットフォルダに２つ出てくると思います。

# カメラのセットアップ
デフォルトのカメラオブジェクトは削除して、
インポートしたSDKの
**OVR/Prefabs/OVRCameraRig**をヒエラルキーに置きます。
<img width="144" alt="スクリーンショット 2018-01-04 15.31.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/126115/3512eace-4f62-f83b-08f3-a69d76a56816.png">
これを開くと、中に**LeftHandAnchor**と**RightHandAnchor**があるので、それぞれに
**OVR/Prefabs/TrackedRemote**を置きます。
<img width="201" alt="スクリーンショット 2018-01-04 15.33.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/126115/45fb88a9-f135-c8d0-2ec9-e54a58186ad2.png">
TrackedRemoteにアタッチされてる**OVRTrackedRemoteのController**でLeftは「L Tracked Remote」、rightは「R Tracked Remote」をそれぞれ選択します。
<img width="608" alt="スクリーンショット 2018-01-04 15.35.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/126115/5394f244-56f0-6768-fd57-d90d1285573e.png">

# ビルド設定
私はここでかなり時間を取られました。

##Oculus署名ファイル(osig)の作成・配置
GearVRのアプリを実機で検証する時にっは署名ファイルが必要らしいです。
やり方は公式で~~めずらしく~~分かりやすく書かれていたので参照してください。
Oculus署名ファイル(osig)ジェネレーター
https://dashboard.oculus.com/tools/osig-generator/

## PlayerSettings
まず　Edit -> Project Settings -> Player でPlayerSettingsを開きます。(Build Settingsからでも開けます)
<img width="451" alt="スクリーンショット 2018-01-04 15.39.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/126115/e12ff25b-e49d-7b28-ee2c-866d288aaf57.png">

PlayerSettingsで以下の部分を設定します。
<img width="606" alt="スクリーンショット 2018-01-04 15.40.57のコピー.png" src="https://qiita-image-store.s3.amazonaws.com/0/126115/8c2db726-dca5-626d-d086-116f15697cd5.png">
①Android用の設定タブに切り替えます。
②マルチスレッドレンダリングに対応させます。
③VRに対応させて、扱うSDKを指定します。今回はOculus Gear VRなので、Oculusを選択します。
④デフォのままだと**BundleError**が出る可能性があるので、パッケージネームを変更します(デフォじゃなければ何でもいいです)。
⑤対応させるAndroidOSVersionを指定します。OculusSDK自体、API19以上でないと動作しないため、API19以上を指定し、Targetはそれ以上とします。

## BuildSettings
File -> Build Settings で開けます。
<img width="629" alt="スクリーンショット 2018-01-04 15.55.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/126115/a3a352aa-30fb-a699-47ff-bd86525d3665.png">
Androidを選択して、SwitchPlatformでビルド対象をAndroidにします。
そしてTexture CompressionをASTCに変更します。

ここまで来たらAndroid実機に接続してAndroid端末をデバッグモードにしてBuild And Runしましょう！

# oculus update required
そのままアプリが問題なく起動した方はおめでとうございます。
私は起動しませんでした。

GearVRに接続すると、**「Oculus Appをアップデートしてね！やり方は自分で調べて！(意訳)」**
的な画面が出て来ます。
しかし、アプリ上では手動アップデート出来ません。
調べてみると
**「Android端末上にインストールされてる Oculus & GearVR系 のアプリを片っ端からアンインストールして、再度GearVRに接続してインストールするとアップデートできるよ！(意訳)」**
的なことが書いてあったので片っ端からアンインストールしました。出来ました。本当にありがとうございました。
Route53をRoadworkerで管理してみる

### 参考資料
- 公式(github)
  - https://github.com/codenize-tools/roadworker
- クラスメソッドさん
  - https://dev.classmethod.jp/cloud/aws/route53-as-code-roadworker/
- qiita
  - https://qiita.com/makaaso/items/892ecf18f063c325fdb5
  - https://qiita.com/SatoHiroyuki/items/6a629dc2ee33bbd6ea32

---
roadworker単体で動かす場合は以下の感じで良さそう。
.routeファイル内に用途をコメントで記載してgithubなどで管理するのが良さそう。

---

# インストール
```
$ gem install roadworker
$ roadwork --version
roadwork 0.5.8
```

※以降AWS_PROFILE変数を使うのでaws-cliのインストールとconfigは済ませておく。
　AWS_PROFILEの準備は以下などを参考に・・・。
　参考) https://qiita.com/tomy103rider/items/d25e03adaee3e93a5737

# 現在のRoute53の設定をエクスポート
```
例)
export AWS_PROFILE
DEFINE_DIR=~/tomi/github/hoge/roadworker-sre
###roadwork -e --split --with-soa-ns -o ${DEFINE_DIR}
roadwork -e --split -o ${DEFINE_DIR}
```
※--with-soa-ns オプションでNSとSOAレコードもエクスポートできるがここでは割愛

以下のようにRoadfileと<ドメイン名>.routeファイルができる。

```
エクスポートしたRoutefileファイル

# -*- mode: ruby -*-
# vi: set ft=ruby :
require 'tomy103-base.test.route'
```
```
エクスポートしたtomy103-base.test.routeファイル

# -*- mode: ruby -*-
# vi: set ft=ruby :
hosted_zone "tomy103-base.test." do

(ここにレコードの定義を書いていく)

end
```

# Aレコード設定例
```
tomy103-base.test.routeファイル

# -*- mode: ruby -*-
# vi: set ft=ruby :
hosted_zone "tomy103-base.test." do

  # test1用
  rrset "test01.tomy103-base.test.", "A" do
    ttl 60
    resource_records(
      "103.0.0.1"
    )
  end

end
```

# 設定反映前確認 (dry-run)
```
例）
export AWS_PROFILE
DEFINE_DIR=~/tomi/github/hoge/roadworker-sre

roadwork -a --dry-run --file ${DEFINE_DIR}/Routefile

---実行結果
Apply `<path>/Routefile` to Route53 (dry-run)
Create ResourceRecordSet: test01.tomy103-base.test A (dry-run)
No change
```
※dry-runなので「No change」＝変更は実行されない
※削除のときは以下のようなメッセージ。

```
Delete ResourceRecordSet: test02.tomy103-base.test. A (dry-run)
```
※変更のときは以下のようなメッセージ。

```
Update ResourceRecordSet: test01.tomy103-base.test. A (dry-run)
  resource_records:
    -[{:value=>"103.0.0.1"}]
    +[{:value=>"103.0.1.1"}] (dry-run)
```

# 設定反映 (apply)
```
例）
export AWS_PROFILE
DEFINE_DIR=~/tomi/github/hoge/roadworker-sre

roadwork -a --file ${DEFINE_DIR}/Routefile

---実行結果
Apply `<path>/Routefile` to Route53
Create ResourceRecordSet: test01.tomy103-base.test A
```
Route53をコンソールで確認するとAレコードが追加されている。

# 設定反映後確認 (test)

```
例)
export AWS_PROFILE
DEFINE_DIR=~/tomi/github/hoge/roadworker-sre

roadwork -t --file ${DEFINE_DIR}/Routefile

---実行結果
問題なければ以下のように「0 failure」
.....
5 examples, 0 failure

問題あれば例えば以下のように「X failure」
....F
cname-test-yahoo.mtomizuka-base.info. CNAME:
  expected=ww.yahoo.co.jp(60)
  actual=www.yahoo.co.jp(15)
5 examples, 1 failure
```
現在Route53に登録されているレコードとroadworkerで管理されているレコードに差異が無いかをテスト。
AWS CodeBuildにおけるECR上Dockerイメージ利用時の注意点

#TL;DR
- AWScodebuildでのdockerイメージのビルド時、--cache-fromオプションでビルド時間短縮したい
- 基本的なやりかたはこちらhttps://qiita.com/tiibun/items/f0045011c86efca254fc を参考にしてます
- 個人的に一部詰まった箇所があったので、メモ(ECRの権限設定でした)
- AWScodebuildのdockerバージョンは1.12.1

　※2018/01/04追記。
コメントいただいたように、最近はcodebuildでDocker 17.09もサポートされているようになったみたいですね。

　※2018/01/05追記。
サンプルのrailsプロジェクトをDocker 17.09でビルドしたら問題なく動作しました。
新しくcodebuildのPJ作成される方は、まずはDocker 17.09で動かしてみた方が良いですね。
（--cache-from利用した方が早く作成できるし、そのぶん利用料金も下がりますので）

#ECRの権限設定
DockerイメージのECRプッシュ後、
codebuildにてビルド実行したところ、アクセス権がない旨エラーが発生。
codebuildのロールにもECRへのアクセスができるように設定していました。

結論からいうと、ECRにpushしたdockerイメージ自体にアクセス許可を与える必要がありました。

![66f6868e-275a-f65e-0e5f-9eb9d2abfcbb.jpeg](https://qiita-image-store.s3.amazonaws.com/0/158500/2b6935cc-4ae9-8ebd-069a-fb626af84550.jpeg)

アクセス許可を与える対象は自身のAWSアカウントではなく、
AWSリージョンのシステムアカウントになります。
参考リンク：
https://docs.aws.amazon.com/ja_jp/codebuild/latest/userguide/sample-ecr.html

ググっても意外と出てこなかったので、こちらにメモとして残しておきます。
[WPF][C#] WebBrowserコントロールの表示モードをIE11に変更する

WPFのWebBrowserコントロールをちょっと試してみたんですが、どうもレジストリを書き換えないと初期状態はIE7のモードで描画がされるとのこと（どんな仕様なんだ・・・）。そのためデフォルトではHTML5やJavaScriptやらなんやら最近のWebはまともに表示できません。

そのためC#上でレジストリを書き換えてWebBrowserの表示モードを切り替えてみました。

# 検証環境

+ Windows 10 Home 64bit
+ .NET Framework 4.5

# 実装例
※レジストリの書き換えが行われるため実行は注意の上自己責任でお願いします。

```xml:XAML実装例
<Window x:Class="Hoge.TestWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:Hoge.TestWindow"
        mc:Ignorable="d"
        Title="TestWindow" Height="300" Width="300">
    <Grid>
        <WebBrowser Source="..."></WebBrowser>
    </Grid>
</Window>
```

```csharp:WebBrowserコントロール向けのレジストリの書き換え（上記Windowの表示前に実行）
        public static void createRegistry()
        {
            var filename = Process.GetCurrentProcess().MainModule.FileName;
            filename = filename.Substring(filename.LastIndexOf('\\') + 1,
                filename.Length - filename.LastIndexOf('\\') - 1);
            if (filename.Contains("vhost"))
                filename = filename.Substring(0, filename.IndexOf('.') + 1) + "exe";

            Debug.Assert(Registry.CurrentUser != null, "Registry.CurrentUser != null");

            RegistryKey key1 = Registry.CurrentUser.CreateSubKey(@"SOFTWARE\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION");
            RegistryKey key2 = Registry.CurrentUser.CreateSubKey(@"SOFTWARE\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BEHAVIORS");
            key1?.SetValue(filename, 11001, RegistryValueKind.DWord);
            key2?.SetValue(filename, 11001, RegistryValueKind.DWord);
            key1?.Close();
            key2?.Close();
        }
```

これで自分の環境ではIE11のモードで実行ができるようになりました。
コードは以下の記事のものを参考にしていますが、そのままだと権限関連で実行できないので `Registry.CurrentUser` に一部変更しています。
[WebBrowser c# object : set google chrome as default browser - Stack Overflow](https://stackoverflow.com/questions/44342866/webbrowser-c-sharp-object-set-google-chrome-as-default-browser)

# 参考
[WebBrowser c# object : set google chrome as default browser - Stack Overflow](https://stackoverflow.com/questions/44342866/webbrowser-c-sharp-object-set-google-chrome-as-default-browser)
[WebBrowser コントロールのInternet Explorerを最新のバージョンに変更する - C#プログラミング](https://www.ipentec.com/document/document.aspx?page=csharp-change-webbrower-control-internet-explorer-version)
NTT-X限定 ドウシシャ32インチ4KモニタOD4K-32B1のOSD操作が直感的でないのをどうにかする

#はじめに

![521d8d78b2cf8e49e14ffcce58c2482d.png](https://qiita-image-store.s3.amazonaws.com/0/104360/927b77bf-712a-749d-0656-426458ef67dc.png)

上下「もしかして…」　右左「私たち…」　「「入れ替わってる～！？」」

OD4K-32B1のOSD操作が、どう考えても上と右、下と左が入れ替わっているようです。

どうにも使いにくいので配線を入れ替えます。

#警告

高圧注意
サービスマン以外は内部の部品に触らないでください。
高電圧部分が数多くあり、万一さわると危険です。
![DSC_0317.jpg](https://qiita-image-store.s3.amazonaws.com/0/104360/435cc6ba-9edc-9b67-163a-e0b6f03e18c1.jpeg)

分解／改造を行なった場合、メーカーの保証は受けられなくなります。
分解／改造は自己責任でお願いします。

#分解

スタンドを外します。ネジ2本です。
購入時に底に付けた方（ネジ1本）ではなく、VESAマウントの真ん中にあるところを外します。

次に、背面下部のネジ2本と、底面のネジ6本を外します。

次が1つ目の山場です。

底をグリっと持ち上げ、ズリっと上にスライドさせて外します。

![open.jpg](https://qiita-image-store.s3.amazonaws.com/0/104360/a66f60db-fe10-cc05-e9da-727959a97362.jpeg)


スティックスイッチ基板のコネクタを外します。背面パネルに留めてるテープは剥がした方が作業しやすいでしょう。コネクタにロック機構は無いので、スコっと外すだけです。ただし結構重いです。ケーブルを引っ張ると断線してしまうので、コネクタを持って外しましょう。

![DSC_0315.jpg](https://qiita-image-store.s3.amazonaws.com/0/104360/5959490f-2394-7f1e-e697-05d513ffedda.jpeg)


コネクタの中の配線を入れ替えていきます。

| 元 | 機能 | 改 |入替 |
|:--:|:--:|:--:|:--:|
| 青| (B) |青|
| 橙| (R) |橙|
| 黄| 選択＋|**緑**|←┐|
| 赤| (電源SW)|赤|　│|
| 緑| 戻る|**黄**|←┘|
| 白| 選択－|**黒**|←┐|
| 黒| 決定|**白**|←┘|
| 黒| (GND)|黒| |
| 赤| (IR)  |赤||  
| 白| (5V)  |白||    

接点の金属側に爪があり、ガワのプラスチックの爪に引っかかって固定されています。針先などでプラの爪を起こしてケーブルを引っ張ると抜けると思います。

この抜く作業が最大の山場です。

（ちなみに、プラの爪を持ち上げるより、金属の爪を押し込んでしまうほうが、抜くだけなら簡単です。しかし、押し込んだ爪が戻らなくなる可能性が高いです。）

![DSC_0319.jpg](https://qiita-image-store.s3.amazonaws.com/0/104360/11a8d061-9212-9aeb-64ab-20b7514bd99a.jpeg)


抜いたら入れ替えて挿しなおします。爪の向きを合わせて差し込みましょう。

緑と黄、黒と白を入れ替えたら、山場クリアです。

分解の逆順で組み立てていきましょう。

背面パネルをはめるのもプチ山場でした。均等に押し込まないとスライドできません。。。

底面の6つのネジを止める際は、強く締め過ぎてネジ山がバカにならないよう注意してください。（ここだけ穴がプラですよ）

#動作確認

電源を入れて操作してみて、直感と合う動作になっていれば作業完了です。

#リモコンの夢

分解前に外から見て電源インジケータがど真ん中にないので、赤外線リモコンの受光部がありそうだなと思っていました。

![DSC_0322.jpg](https://qiita-image-store.s3.amazonaws.com/0/104360/cedbe2d6-6713-7d7d-e762-56d1d8ac9ac0.jpeg)


分解してみたら案の定、赤外線センサがありました。

![DSC_0320.jpg](https://qiita-image-store.s3.amazonaws.com/0/104360/c9ca7e49-0be0-0585-4d30-ee5710ae37c3.jpeg)


入力切替などが、メニュー階層をたどるのではなく、ボタン一発で操作できるようになると製品価値が相当上がるんじゃないかと思っています。

リモコンコードが分かれば、自作リモコンを作りたいところです。

#OD4K-32B1レビュー

ここからは製品レビューです。

自分はプログラマで、モニタに表示できる情報量が多いことを最も重視します。

今までは1920x1200の22インチを2枚で使用していました。常々、4Kモニタに替えたいと思っていたところ、4万円切りの OD4K-32B1 が出たので導入しました。

32インチ4Kは、解像度が約138PPIです。ドットバイドット表示（Windows10のカスタムスケール100%）だと文字などが小さくて読みずらいかもしれません。ただ、自分は100%で使用しています。

デスクトップとは別にMacBook Pro 15インチを持っているんですが、これも100%で常用しています。232PPIです。ここまでいくと目の負担が大きいのですが、情報量が多いことで脳の負担は軽いです。

PC側がちょい古いので、4Kだと30pまでしか出せません。しかし、EclipseやWord,Excelを使っている分には特に不都合は感じられません。ブラウン管時代はフレームレートが低いと静止画でもチラついてましたが、液晶なら原理的にチラつきません。動画を映せばチラつくんだと思いますが、動画は見ません。

ここまで、32インチ4K液晶一般の話ですね。。。

OD4K-32B1 はどうなのかという話ですが、プログラマがソースコードを表示するにあたっては可もなく不可もなく、ですかね。

ピクチャーインピクチャーや分割複数画面表示などの機能がありますが、OSDの階層が深く、切り替える気になりません。

恵安のKWIN-4K32Bでも良かったんじゃないかという気もしています。プログラマ目線でNTT-Xと恵安の違いは、スタンドです。NTT-Xは若干チルト（お辞儀方向の調整）ができます。恵安はそれが出来ない代わりに左右に振れます。左右はスタンドごと振ってしまえばいいので、チルト出来た方がいいですよね。やっぱNTT-Xで良かった！

入力切替や音量調整を頻繁にする場合は、リモコン付属の恵安のほうがいいかもしれません。


#おわりに

OD4K-32B1 はプログラマにはコスパもよくてサイコーのモニタです。
配線入れ替える改造をすると愛着もわいてきますよ！
Pythonで【grep 'hoge' *.py】 と同じことをしたい。

Python3でSlackBotを作ってます。

色々と便利なのですが、Nodejs（Coffee）には存在している【help】が無かったので、雑ながら自作しました。
(良い物があったら教えてください…)

単純に考えたら、`grep '@listen_to' *.py` の結果を出してくれればいいんですが、
python+正規表現だとreモジュールを使うのが多いらしいので、つかってみました。

`help.py`

```py
# -*- coding: utf-8 -*-
import os,re

def main():
    keyword = r"^@listen_to" #検索したい文字列を記載
    keyword2 = r"^@respond_to" #検索したい文字列を記載
    current_dir = os.path.dirname(os.path.abspath(__file__)) #実行ファイルのディレクトリパスを取得
    filelist = os.listdir(current_dir)
    helplist = "メンションつけなくても反応するモノ \n"
    helplist2 = "メンションつけて呼んで上げると反応するもの \n"
    for i in filelist:
        if i.endswith('py'): #ファイルの拡張子がpyであるもの
            with open(i,'r') as f:
                lntmp = f.readlines()
                for j in lntmp:
                    if len(re.findall(keyword,j)) : #正規表現にマッチするものをhelplistに追加
                        helplist += j
                    if len(re.findall(keyword2,j)) :  #正規表現にマッチするものをhelplist2に追加
                        helplist2 += j

    print(helplist)
    print(helplist2)

if __name__ == '__main__':
    main()

```

↑python help.py で動きますが、BOTに組み込むなら下記で良いかと思います。


```py
@respond_to('help') #機能一覧の表示
@respond_to('hint') #機能一覧の表示（helpと同じ）
def mention_func(message):
    if message.body["channel"] != channel_id:
        return
    keyword = r"^@listen_to" #検索したい文字列を記載
    keyword2 = r"^@respond_to" #検索したい文字列を記載
    current_dir = os.path.dirname(os.path.abspath(__file__)) #実行ファイルのディレクトリパスを取得
    filelist = os.listdir(current_dir)
    helplist = "メンションつけなくても反応するモノ \n"
    helplist2 = "メンションつけて呼んで上げると反応するもの \n"
    for i in filelist:
        if i.endswith('py'):
            with open(current_dir + "/"+ i,'r') as f:
                lntmp = f.readlines()
                for j in lntmp:
                    if len(re.findall(keyword,j)) :
                        helplist += j
                    if len(re.findall(keyword2,j)) :
                        helplist2 += j

    message.send('```' + helplist + '```')
    message.send('```' + helplist2 + '```')

```
もっと楽に SQLcl 使おう【使いやすい SQL*Plus】


皆さんは SQLcl は使われていますか？
SQL*Plus の拡張にあたるツールなのですが、
OracleDB 12.2 からは標準で同梱されるようになりました。

これを使うと SQL*Plus でできなかった上下キーによる履歴の参照などができるようになります(他の利点については下記参照)。
(["Oracle SQLcl"を使ってみる - Qiita](https://qiita.com/mon_tu/items/da3333590847fdfb1672))

これだけであれば rlwrapper などを導入する選択肢もありますが、
環境によっては好き勝手にインストールしづらい場合があります。
その点標準で同梱されている sqlcl であれば、何も気にせず使える可能性が高いです。
そのような場合の選択肢として知っておくと良いと思います。

# 環境

* Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production


# 使い方(OracleDB 12.2 以降)

普段 `sqlplus` でログインしている場合、`sqlplus` を `sql` に変えるだけで使えます。

```bash
$ sql <USERNAME>/<PASSWORD>@pdborcl
```

ただしこれをそのまま実行すると、下記のように **カレントパスが変更されます**
コマンドが見つかれない方は、`$ORACLE/sqldeveloper/sqlcl/bin/` にファイルが無いかパスが通っていない可能性があります。

```bash
[oracle@dbserver mywork]$ echo $ORACLE_HOME
/u01/app/oracle/product/12.2.0/dbhome_1
[oracle@dbserver mywork]$ pwd
/home/oracle/work/fam_taro/mywork                                 # sql コマンド前のカレントディレクトリ
[oracle@dbserver mywork]$ sql /nolog

SQLcl: 月 12 25 10:25:51 2017のリリース12.2.0.1.0 RC
Copyright (c) 1982, 2017, Oracle.  All rights reserved.

SQL> pwd
/u01/app/oracle/product/12.2.0/dbhome_1/sqldeveloper/sqlcl/bin/   # sql コマンド後のカレントディレクトリ
```

上記の通り、カレントディレクトリが `$ORACLE_HOME/sqldeveloper/sqlcl/bin/` に変わっています。
(このように pwd コマンドなどが直接使えるのも sqlcl の特徴です)

sqlcl では `cd` コマンドが叩けるため、
sqlcl でログイン後に `cd /to/my/directry/path` と叩けば良いのですが、
自身の作業フォルダから sqlcl を呼び出す場合は何かとストレスになります。

# 起動スクリプト(ちょっと改善版)

ですので、予め下記のようなスクリプトを用意しておくと便利です。
コメントアウトしている部分は、行幅などの設定用ファイル (login.sql) を読み込むためにあります。
はじめに何か設定したい方は、 login.sql などに記述しておくと良いです。

```bash
#!/bin/sh

FNAME=tmp_login.sql
SCRIPT_DIR=$(cd $(dirname $0); pwd)

echo "cd ${SCRIPT_DIR}" > ${FNAME}
echo "" >> ${FNAME}
# echo "@login" >> ${FNAME}

sql <USERNAME>/<PASSWORD>@pdborcl @${SCRIPT_DIR}/${FNAME}
```

このスクリプトを使えば、以下のように pwd の結果が同じ場所になります。
(というかこれくらいデフォルトの sqlcl で対応しｔ)

```bash
[oracle@dbserver mywork]$ pwd
/home/oracle/work/fam_taro/mywork

[oracle@dbserver mywork]$ sh sample.sh

SQLcl: 月 12 25 10:47:01 2017のリリース12.2.0.1.0 RC

Copyright (c) 1982, 2017, Oracle.  All rights reserved.

Last Successful login time: 月 12月 25 2017 10:47:04 +09:00

接続先:
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production

SQL> pwd
/home/oracle/work/fam_taro/mywork
```

それでは皆さん快適な SQLcl ライフを！
スネークケースとキャメルケースとは

##スネークケースとキャメルケース
・スネークケース
単語間をアンダースコアで繋げる表記方法（game_boy）
※アンダースコアがヘビみたいだからスネークケース

・キャメルケース
単語の先頭を大文字にして繋げる表記方法（GameBoy）
※大文字の部分がラクダのこぶみたいだからキャメルケース

・ケバブケース
別名チェインケース。 ハイフン（-）を 区切記号 として 単語 をつなげて 一綴り にした表し方。（game-boy）
http://wa3.i-3-i.info/diff71moji.html

##スネークケースとキャメルケースを相互に置換できるマクロ
https://ameblo.jp/i-devdev-beginner/entry-12225328059.html
https://so-kai-app.sakura.ne.jp/blog/2407/2017/09/04/
アプリ開発を行う、開発環境を整えることが最重要 Ruby からcocoapodsインストールまで

Xcode applicationだけではアプリの開発が難しい。
本体の開発環境から整えようと思う。

Objective 1 : Cocoapods をインストールしたい。
データを保存するライブラリを作成したいから。
インストールしようとしてもできない。
 オペレーションが許可されていないらしい。


`YAML safe loading is not availble`


`Upgrade to psych`

が必要
 
端末の開発環境から整えることにした。Rubyのアップグレードは基本中の基本。
 
マックで書かれているターミナル言語はRuby on rails

Terminal で　`ruby -v`　　を入力現在のバージョンを確認する
　
RubyをUpgradeするためにソフトをダウンロード  

`curl -L https://get.rvm.io | bash -s stable`
 
　　(参照：　http://codingpad.maryspad.com/2017/04/29/update-mac-os-x-to-the-current-version-of-ruby/

アップグレード成功。Homebrewやらをインストールしているらしい
`rvm install ruby-2.4.2 `で実行
　　
 
psych のアップグレードを試みる
`gem intall psych`
 
              	`Error" no persmission for the /Library/Ruby/Gems/2.0.0 directory`
 
 
`rbenv` コマンド経由でインストールできるように試みる
               	`brew install rbenv ruby-build readline` 
 
`　　　　　Error " git must be installed in your path"
          Error " ruby-build cannnot be built with any available compilers Install GNU's GCC
 `

エラーを解決したいと思う。
https://git-scm.com/book/en/v2/Getting-Started-Installing-Git
よりdmgをダウンロードして直接ダウンロード、インストールを試みる
 
 
 Git がインストールされているのにも、　PATHにインストールされていないといけないとでる。
　　　　which gitでディレクトリを検索
　
     	`  PATH!   - /usr/local/bin/git`
 
    参照： https://github.com/Homebrew/legacy-homebrew/issues/50500
 
 
`brew doctor` より再開、次に続く。
GCE インスタンスの起動/停止を gcloud + cron でスケジューリングする

GCPクソザコが2日考えた末実現できた実装

## 前提 / 要件
* 遊び
    * 動けばいい
* 金なし
    * インスタンス起動時間を指定時間帯だけに絞りたい
    * 無料で実装したい
* 暇なし
    * 手運用なし
* 知識なし
    * GCE と最低限の gcloud コマンドだけ使う(しか使えない)

## 方針
* 無料枠で f1-micro インスタンスを立て、常時起動のスケジューラとする
* gcloud コマンドで指定インスタンスの起動停止を制御する
* crond で gloud コマンドの実行をスケジューリングする

## 環境
* スケジューラ用インスタンス
    * マシンタイプ: f1-micro(無料枠)
    * OS: Ubuntu 16.04(crond があればなんでもいい)
* 起動停止対象インスタンス
    * 何でも良い

## 実装

### スケジューラ用インスタンス作成
とりあえずUbuntuにした
crondとgcloudコマンドが使えればなんでもいい
gcloud コマンドはデフォで入っている

### IAM 設定
gcloud コマンド実行用のサービスアカウントを作る
クソザコなのですべてGUIでポチポチやりました

#### 役割作成
起動停止に必要な権限を持つ役割をつくる
ここで与える権限は今回の環境をもとに検証した最低限のものです

1. [IAMと管理] > [役割] から役割を新規作成
    * 名前: 起動停止制御(なんでもいい)
    * 説明: なんでもいい
    * 権限の追加:
        * `compute.instances.get`
        * `compute.instances.start`
        * `compute.instances.stop`
        * `compute.zoneOperations.get`

#### サービスアカウント作成
gcloud コマンドを実行するサービスアカウントをつくり、役割を割り当てる

1. [IAMと管理] > [サービスアカウント] からサービスアカウントを新規作成
    * サービスアカウント名: cron01(適当)
    * サービスアカウントID: cron01@\<projectID>.iam.gserviceaccount.com(勝手に入る)
    * 役割: 起動停止制御(上でつくったもの)
    * [x] 新しい秘密鍵を提供
2. 作成後、秘密鍵[\<projectName>-xxxxxxxxxxxx.json]がダウンロードされる

### gcloud 環境設定
作ったサービスアカウントをgcloud実行環境で認証する必要がある

1. 上でダウンロードした秘密鍵[\<projectName>-xxxxxxxxxxxx.json]をスケジューラ用インスタンス上にアップロードする(どうやってでもいい)
2. スケジューラ用インスタンスのOSにcron実行ユーザでログインする
3. 以下のコマンドを実行して作成したサービスアカウントを認証させる  
`gcloud auth activate-service-account --key-file "\<projectName>-xxxxxxxxxxxx.json"`
4. 以下のコマンドを実行して作ったサービスアカウントがACTIVEになってることを確認する  
`gcloud auth list`

### cron 設定 
起動停止用のgcloudコマンドをcronに登録してスケジュール実行させる

#### スクリプト作成
gcloudのコマンドだけ書いた最低限のもの
cron実行ユーザに実行権限を与える
エラー制御やログ出力などしたければ適宜加えてください

```text:instance_start
gcloud --account=<作ったサービスアカウントID> compute instances start <起動停止対象インスタンス名> --project <対象プロジェクトID> --zone <対象ゾーン名>
```

```text:instance_stop
gcloud --account=<作ったサービスアカウントID compute instances stop <起動停止対象インスタンス名> --project <対象プロジェクトID> --zone <対象ゾーン名>
```
#### cron登録
とりあえず0時起動12時停止で登録する

```
crontab -e  # cron実行ユーザで打つ
```
```text:crontab
0 0 * * * /<path>/instance_start
0 12 * * * /<path>/instance_stop
```
### 確認
#### /var/log/syslog
スケジューラ用インスタンス上でcronの実行ログを見る

```
cat /var/log/syslog | grep <起動スクリプト名>
cat /var/log/syslog | grep <停止スクリプト名>
```
#### gcpのログ
クソザコなのでGUIからみる

1. [Logging] > [ログ]
    * 検索フィルタ:
        * GCE VM インスタンス, <起動停止対象インスタンス>
        * `compute.instances.start`
        * `compute.instances.stop`


以上、よろしくお願いいいたします

---
## 参照
* Google Compute Engineでcronを使って日次バッチ処理を実行する:  
https://www.marketechlabo.com/batch-processing-on-gce/
MAMPのMYSQLをlarvalで使う

#MAMPのMYSQLをlarvalで使う

## .envファイルの編集
- 使用するDatabase名とUserName, Passwordを変更する。

``` shell:.env
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=board
DB_USERNAME=root
DB_PASSWORD=root
```

## config/database.phpの編集
- database, username, password, unix_socketを変更する。

``` shell:config/database.php
'mysql' => [
  'driver' => 'mysql',
  'host' => env('DB_HOST', '127.0.0.1'),
  'port' => env('DB_PORT', '8889'),
  'database' => env('DB_DATABASE', 'laravel'),
  'username' => env('DB_USERNAME', 'root'),
  'password' => env('DB_PASSWORD', 'root'),
  'unix_socket'   => env('DB_SOCKET', '/Applications/MAMP/tmp/mysql/mysql.sock'),
  'charset' => 'utf8mb4',
  'collation' => 'utf8mb4_unicode_ci',
  'prefix' => '',
  'strict' => true,
  'engine' => null,
],
```

## app/Providers/AppServiceProvider.phpの編集
```php5:app/Providers/AppServiceProvider.php
<?php
  namespace App\Providers;

  use Illuminate\Support\ServiceProvider;

  #以下の1行を追記
  use Illuminate\Support\Facades\Schema;
  
  class AppServiceProvider extends ServiceProvider
  {   
    public function boot()
    {        
      #以下の1行を追記
      Schema::defaultStringLength(191);
     }

    public function register()
    {   
         //
     }
  }
?>
```
typesafe configについてチョットまとめた

# typesafe config

https://github.com/lightbend/config

typesafe(今はlightbend)が作ったconfig読み込みライブラリ

## 前置き
- 自分自身がなんとなく使っていたものなので、整理しようと書きました
- Scalaで使ってます

## なに？
- 依存ライブラリなしのjavaで書かれた設定系ライブラリ
- JSON(.json)で書いたり、HOCON(.conf)で書いた設定ファイルをアプリケーションに読み込める


## 使うには

build.sbtに書こう

```
libraryDependencies += "com.typesafe" % "config" % "1.3.1"
```


`ConfigFactory.load`でconfigファイルを読み込む。

帰ってきたconfigオブジェクトから設定したキーから値を取得して使用できる

Configオブジェクトには`get~`のメソッドがあり、configファイルに書いたものを型を指定して読み込むことができる。読み込んだとき、メソッドと実際の値の型が違えばエラーになる

コードにすると↓になる

```scala
import com.typesafe.config.ConfigFactory

object ConfigSample {
  def main(args: Array[String]): Unit = {
    val config: Config = ConfigFactory.load()
    
    config.get~("path") // 設定値を~型として使って読み取る
    // String, Int, Enum, Boolean, etc...
    
    val subconf: Config = config.getConfig("subconfig")
   
 	// 下のようなconfファイルがあったとき
 	// subconfにはsubconfigをルートにしたConfigオブジェクトが返される
 	// なので`subconf.getString("host")`では"sub_host"が返る
   /*
   * # application.conf
   * host = "main_host"
   * subconfig {
   *		host = "sub_host"
   * }
   */
   
  }
}

```

## なにが読み込まれるの？

ファイルパスのconfigの内容
```
ConfigFactory.load("ファイル名") // ファイル名には拡張子を含めない
```

src/main/resources以下の `application.conf`, `application.json`, `application.properties`, `reference.conf`とシステムプロパティ

`application.conf` > `application.json` > `application.properties` > `reference.conf`

で設定値は優先される

reference.confは一番後回しにして読み取られるので、ライブラリなんか作るときはにデフォルト値を書いておくといいらしい。

### include
- confファイルなら`include "ファイル名"`で指定したファイルの設定も`include`を書いたファイルに取り込める。 include`してきた`ファイルと`した`ファイルで同じキーの設定値があった場合`した`側の設定値が優先される
- includeするファイルはconfファイルでなくていい(json, propertiesでOK)

```a.conf

a = "a"


```

```application.conf
include "a"

b = "b"

```

```
val config = ConfigFactory.load()
config.getString("a") // a
config.getString("b") // b

```

### 置換
`プロパティ名 = ${置換元プロパティ名}`

```
application_host = "untarakantara.com"

application_url = "https://${application_host}"
```

```
ConfigFactory.load().getString("application_url") // `https://untarakantara.com`
```

#### 環境変数から置換
`プロパティ名 = ${?環境変数}`
環境変数がなく、環境変数名と同じなプロパティ名を持った値がconfに設定されてたらそれが使われる

```
password = ${?PASS_WORD}
```