OmniAICreator/Qiita-1.07M huggingface dataset:
RSpecにてunknown error: cannot find Chrome binary

##RSpecでユーザーが作成した記事を画面に表示
ruby on rails速習実践ガイドで、上記のテストを実行したところ

```
unknown error: cannot find Chrome binary
```
というエラーに遭遇。

```
$ curl https://intoli.com/install-google-chrome.sh | bash
```
このコマンドで解決しました。

こちらの方の記事を参照しました。ありがとうございました。
https://ryotatake.hatenablog.com/entry/2019/05/01/rails_browser_test
【Python】ABC - 099 - Stone Monument

# 問題
$ 1, (1+2), (1+2+3), \ldots, (1+2+3 \ldots +999)$と999本立っている鉄塔のうち、隣り合う2塔（西側と東側）の雪に埋まって見えている部分の高さが$a, b$として与えられたときに、雪が何メートル積もっているかを求める問題。
# 方針
1. $b-a$が隣り合う鉄塔の高さの差分$h$を表現しており、これにより西側の鉄塔の高さが$1+2+3+ \ldots + h-1$であるとわかる
2. $1+2+3 \ldots + h-1$を求めて、$a$を引くと雪の積もっている高さがわかる

```python
a, b = map(int, input().split())
diff_ = b - a
pos1 = sum([i for i in range(1, diff_)])
print(pos1 - a)
```

# 追記
@konandoiruasa にコメントいただいたので、追記。

方針2.で$1+2+3+ \ldots + h-1$を求めるのに、`sum()`を用いて求めていたが、
初項$1$、末項$h-1$、項数$h-1$の等差数列の和の公式で求めることができる。

```python
pos1 = h*(h-1) / 2
```
GCPでTrilliumNotesの鯖立てた


GCPでTrilliumNotesのサーバーを立てた話です

##ことのおこり
ちょっと前に、[とあるGIGAZINEの記事](https://gigazine.net/news/20190118-trilium/)を見ました。
とても面白そうだけど、Trilliumの仕様上サーバーを立てない限り、内容を同期するのはできないみたい。(Dropboxとかを使ってTrilliumのフォルダそのものを複数PCで同期してみたけど、Trilliumは各PCで別物として立ち上がったので、内容の同期はできなかった。)

せっかく自前のナレッジベースが作れるのに単一PCでしか見れないなんて勿体ない！と思っていたらGCPと出会ったので、GCPの無料枠ででTrilliumNotesのサーバー立てました。
##GCPってなんぞや
https://cloud.google.com/?hl=ja

##Trillium Notesってなんぞや
GIGAZINEの記事に詳しく載ってます。
https://gigazine.net/news/20190118-trilium/

##やり方＠GCP
まず、GCPの無料枠でインスタンスを一つ立ち上げます。

GCP無料枠の解説(https://cloud.google.com/free/docs/gcp-free-tier?hl=ja&_ga=2.93909277.-127125603.1567244125)

GCPのコンソールにアクセスし、Compute Engineから新規のVMインスタンスを作成します。
マシン構成：f1-micro
リージョン：us-central1(アイオワ)

また、ネットワーキングの項目から外部IPを取得しておきます。
それ以外の設定項目は特にないので、インスタンスの作成を完了します。

※※※※20191102追記※※※※
GCPのファイアウォール設定からtcp:8080のポートを開放するルールを追加しておきます。
※※※※※※※※※

##やり方＠DebianOS
GCPの基本OSはDebianになっているので、DebianにTrilliumNoteのサーバー機能を追加していきます。
やり方は[ここ](https://github.com/zadam/trilium/wiki/Server-installation)に書いてあるんですが、[Dockerを使う方法](https://github.com/zadam/trilium/wiki/Docker-server-installation)がrecommendedになっているので、今回はこの方法で立ち上げていきます。

###Dockerのインストールの前準備
まず、立ち上げたインスタンスを起動していきます。GCPのホーム画面からComputeEngineに移動し、先ほど立てたインスタンスの項目の一番右端の点々をクリックします。「起動」を選択してインスタンスを起動後、すぐ左横のSSHを選択するとSSH接続されたインスタンスのCUIが表示されます。以降はこの黒い画面で入力をしていきます。

###Dockerのインストール
この記事を参考にしました(https://qiita.com/tatsuya_info/items/f8cee0bae9ec28b560d0)
ただ、GCPのインスタンスの場合、sudoはすでに入っているはずなので、この記事の前準備の項目は飛ばしてもよいはず。

###TrilliumNoteのDocker serverのインストール
[ここのやり方の通り](https://github.com/zadam/trilium/wiki/Docker-server-installation)にやります。

####Pull image

```
docker pull zadam/trilium:[VERSION]
```
[VERSION]のところには望みのVersionを記述せよと書かれているので、[リリース一覧](https://github.com/zadam/trilium/releases)からインストールするVersionを探します。今回は何も考えず、Latest Releaseのv0.34.3にしました。Pull imageの注釈欄に書き方が載っているのでそれに従って、

```
$ docker pull zadam/trilium:0.34-latest
```
としました。
####Run image

```
$ sudo docker run -t -i -p 8080:8080 -v ~/trilium-data:/home/node/trilium-data zadam/trilium:latest
```

##やり方＠TrilliumNote
[リリース一覧](https://github.com/zadam/trilium/releases)からDocker server installationしたのと同じVersionのTrilliumNoteをローカルのPCにダウンロード＆インストールします。
ここから先はGIGAZINEの記事にある通りです。
メニューからSync画面を開き、GCPインスタンスを立ち上げる際に取得した外部IPとポート番号8080を入力して、Saveするだけ。

これでサーバーの立ち上げから、同期設定まで終わりました！

##確認する
残念ながら手元に2台PCがないので、ブラウザからTrilliumNoteの内容を確認編集できるかを確認します。これも[GIGAZINEの記事にある通り](https://gigazine.net/news/20190118-trilium/)。

URLにIP＋:8080を打ち込むとLoin画面に移動し、UsernameとPasswordを入れると、ブラウザでもTrilliumNoteが編集できることが確認できました。ローカルで編集した内容も反映されています。
![スクリーンショット 2019-09-23 12.22.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319453/ec1ba0b7-5094-83c1-10ed-4cca88fcbc41.png)

##まとめ
・GCPすごいよ！
・TrilliumNoteも資料まとめとかによさそうだよ！
・GCP×TrilliumNoteで自作ナレッジベースだよ！
・実際にやってみたら出来たよ！

・ただセキュリティに不安があるから機密を取り扱うときは注意だよ！
WordPressのショートコードを、テーマの編集のソースコード内で有効にする

WordPressで__ContactForm7__プラグインを取り入れたのですが、テーマの編集のソースコードの中にどうやって組み込んでいいのかわからず時間がかかったので、メモしておきます。


##1. 問題点

”コンタクトフォームの編集”の画面で、

このショートコードをコピーして、投稿、固定ページ、またはテキストウィジェットの内容にペーストしてください:

```
[contact-form-7 id="5" title="コンタクトフォーム 1"]
```

とあるが、これをどうやって「テーマの編集」のソースコードに反映させていいのかが分からない。

##2. 解決策

phpの`do_shortcode`メソッドを実行します。

```
<?php echo do_shortcode('[contact-form-7 id="5" title="コンタクトフォーム 1"]'); ?>
```

無事コンタクトフォームも反映され、解決されました。
API GatewayからLambdaを呼び出す

# はじめに
この記事はサーバレスの勉強用として試したことまとめたものです。
今回はAPI GatewayとLambdaの連携を確認してみました。

# API Gatewayとは
* APIの作成、監視、管理ができるサービスである。
* Webアプリのバックエンドデータやビジネスロジックにアクセスできる。
* サーバ管理が必要ないためLambdaと組み合わせてサーバレスアプリケーションを構築できる。
* 公式ドキュメント<br>
https://aws.amazon.com/jp/api-gateway/

# Lambdaとは
* サーバを準備することなくLambda関数と呼ばれるコードを実行できる。
* 実行時間に制限があるため時間を要する処理には不向きである。
* 様々なイベントをトリガーにLambdaを実行することができる。
* 公式ドキュメント<br>
https://aws.amazon.com/jp/lambda/

# Lambda関数の作成
* 以下のような値を表示するスクリプトを作成する。

```python
import boto3
import json

def lambda_handler(event, context):
    print(json.dumps(event))
    return {
        'statusCode' : 200,
        'headers' : {
            'content-type' : 'text/html'
        },
        'body' : '<htm><body>OK!!</body></html>'
    }
```

* API Gatewayから呼び出されたイベント内容

| 項目 | 内容 |
|-----------|------------|
| resource | 呼び出し元のリソース名 |
| path | URLパス |
| httpMethod | GET、HEAD、POSTなどのHTTPメソッド |
| headers | クライアントから送られたHTTPヘッダー |
| queryStringParameter | URLの末尾（?以降）に付けられたパラメータリスト |
| pathParameter | URLの末尾（?以降）に付けられた拡張パス名 |
| stageVariables| ステージに設定された変数値群 |
| requestContext| クライアント リクエストに関するコンテキスト情報|
| body| クライアントから送られたbody部のデータ |
| isBase64Encodeed| bodyがBase64エンコードされているか |

# API Gatewayの作成
* [ゼロから作りながら覚えるAPI Gateway環境構築](https://dev.classmethod.jp/cloud/aws/getting-start-api-gateway/)を参考に以下のようなAPIを作成する。
<img width="787" alt="APIGateway_API作成.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/466400/4be0232a-0994-daac-497b-257e97d24031.png">
* メソッドリクエストの設定。
<img width="791" alt="APIGateway_メソッドリクエスト確認.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/466400/d28c65d6-7fa7-828d-916a-58f5d9eee7db.png">
* 統合リクエストの設定。
<img width="788" alt="APIGateway_統合リクエスト確認.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/466400/aa9b81c9-7a08-cce0-ad1c-9f422b0a0aac.png">

# アクセス確認
* エンドポイントを呼び出して確認する。
<img width="560" alt="APIGateway_アクセス確認.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/466400/02c40fda-f8af-2d5e-fa61-7ada0814515a.png">

# まとめ
* API Gatewayを作成するとエンドポイントと呼ばれるURLが作成される。
* 作成されたエンドポイントにリスクエスト送信することでLambda関数を呼び出すことができる。
* 次はS3で静的なWebサーバを利用して動作を確認してみたい。

# 参考
* https://dev.classmethod.jp/cloud/aws/getting-start-api-gateway/
アプリをApp Storeに公開する方法

###アプリの公開に必要な手続き
作成したアプリをappStoreに後悔するには次のような手順が必要です。
**(1)Appleデベロッパプログラムへの登録**
**(2)Apple社への契約手続き**
**(3)アプリ情報の登録など**
**(4)アプリのアップロード**

##**(1)Appleデベロッパプログラムへの登録**
アプリを後悔する為には年会費11,800円を支払って開発者向け有料プログラムの会員になる必要があります。

![スクリーンショット 2019-09-23 2.14.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270062/c8665617-22ca-24fb-d0f0-2ee9a8616a56.png)
[Apple Developer Program](https://developer.apple.com/jp/programs/)
##**(2)Apple社への契約手続き**
デベロッパプログラムへ参加したら続いてapp store connectというサイトにアクセスしてアプリの公開・販売に関する締結をapple社と行います。
![スクリーンショット 2019-09-23 2.16.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270062/6dcd4c87-c336-5a97-266b-c3f18ad38854.png)


##**(3)アプリ情報の登録など**
契約手続きが完成したらアプリをAppStoreに登録する段階に入ります。
この手続きもAppStoreConnectにて行います。
ホーム画面で『マイ　App』リンクをクリックして手順を進めます。
ここで登録した内容なAppStore上に表示されユーザーが直接見るところなのでしっかりと売り文句などを考えながら設定しましょう。

##**(4)アプリのアップロード**
アプリデータをAppStoreにアップロードします。
ここでは最初にアプリを公開用にアーカイブすることが必要です。
この作業は開発用アプリのビルドとは操作が異なるので注意が必要になります。
![スクリーンショット 2019-09-23 2.23.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270062/e8717ca8-09ca-1c00-f61d-35aa1385e9fc.png)
この処理が正常に完了すればAppStore上に公開されます！
ぜひこの記事がお役に立てれば幸いです。
kaggle の Kernel で albumentations.torch のインポートに失敗する

# 結論

```python
from albumentations.torch import ToTensor
```
ではなく、  

```python
from albumentations.pytorch import ToTensor
```
で呼び出さなくてはならない。

# 背景
画像関連の機械学習でよく使うデータ拡張をまとめた albumentations に、日頃からとてもお世話になっている。
https://github.com/albu/albumentations

先週まで問題なく動いていたコードが動かなくなったので、慌てて調べたところ、
https://www.kaggle.com/general/109613
のディスカッションを見つけて無事解決した。  

過去にコミットしたコードを修正しなきゃいけないから大変だ。。。
udemyで1年目 Java開発者がPHP入門してみた

・PHPerの後輩はコマンドラインを叩いたり開発速度が早そうな話をしていたり羨ましい！
・将来的に仕事を探そうと思ったらPHPの案件が結構多い！やらなきゃ！

そんな事を考えていたらudemyで「【2日でできる】はじめてのPHP7 x Laravel 」入門が
割引になっているのを見つけ、取り組んでみました。

# はじめに
##### 現在のスキル
・文系から未経験転職
・Java/C#での開発1年程度、業務システム系で知識はサーバーサイド寄り

今はSpringでガリガリ処理を書いています。JPAは友達

##### 目的
・開発速度の早い言語に触れてみたかった
・将来を考えた際覚えたい言語の中で、入門の学習コストが比較的緩めだと思った
・ポートフォリオを作りたい

# 購入した講座
【2日でできる】はじめての PHP 7 x Laravel 入門  
https://www.udemy.com/php7study/

セールで購入。ブラウザ学習系のサイトと比較すると以下の点でおすすめです。
・実環境で再現をするので「実環境でやるとうまくいかない！」等がないこと
・シェアが高い講座は**Q&Aのログが豊富なため、詰まったときの解決が楽**　←ココ重要

ブラウザ学習サイトって準対話型みたいな感じであまり脳に定着してない気がするんですよね…


# 受講してみて
動画講座の恩恵を最大限に活かすため1.5倍速での視聴を実施。
自宅PCでの開発は初だったのでエディターはVScodeを使用しました。

#### ①他言語が初級程度あれば2日と言わず短時間で修了できる

言語理解が前半、Laravel解説が後半からの構成です。
PHPのインストールくらいから室内のホコリが気になり始め、並行して片付けをしながら進めていましたが(？)
詰まる箇所がそこまでなければ2日間で余裕を持って終了できる内容でした。
こちら側の記述で詰まる部分はほぼないので、htmlから始めるような方でも3日程で通せると思います。

#### ②数年前の講座のため、現行との相違点がある(アプデで解消も)

レビューにも書かれていますが、Laravel過去バージョンを使用した講座のため
Laravel解説に入った位から途中コマンドが異なったりファイル名が変更になっている箇所があります。
**Q&A**を検索したり、2019年9月に講座アップデート等で対応して頂いているので読み込みが必要になります。

自分の環境ではLaravelにauth機能を追加する箇所で詰まり、どうしてもQ&Aで解決できず下記記事を参考にして進めました。
6.0のview追加方法は探すと記載がありますが、npmの更新のやり方がいきなり出てくるのでかなり詰まりました。
Node.Jsの知識が0だったのでコンソールでずっとnpm installを叩いてました…

【Laravel 6.0 で「make:auth」が利用できなくなったので、対応方法記載します。 】
https://note.mu/koushikagawa/n/n1b5bb4a69514


#### ③PHPの良さが少し分かった
今までJavaがメインだったので、処理を修正したり追加した際はビルド等で実行まで少し時間がかかるイメージでしたが
PHPはサクサク動いて処理系統も上書きしたところがすぐ反映されるところが意外でした。(eclipseからjsp触ってる感覚)
@でそのまま埋め込んで表示する所も記述が少なくてすごい！

講座の中ではほほぼ基礎の解説だけだったので、Javaでよく使う記述(Objects.toStringとか)はPHPだとどう書くんだろう？とか
存在しない記述はあるのかな？とか色々考える部分もあるので、言語の勉強もしながらLaravelでなにか作ろうと思ってます。

# 結論
・udemyは良い(Q&Aを積極的に使おう)
・完全初心者よりも多少開発を触ったことがある人向けの難易度だが、導入と解説がメインのため
　Laravelを使いこなせるようになるには続けてなにかwebアプリを作っていくことが必要

・アウトプットは難しいので積極的に実施していく必要がある(がんばります)
macでスクリーンショットの保存先を指定する方法

macでスクショをとったときの保存先の変更方法について、いつも忘れるのでメモ。
環境は以下を前提にしています。  

* macOS Mojave v10.14.6

## 参考にさせていただいたサイト
* Mac でスクリーンショットを撮る方法 - Apple サポート https://support.apple.com/ja-jp/HT201361
* Mac - スクリーンショットで撮影した画像の保存場所を変更 - PC設定のカルマ https://pc-karuma.net/mac-customize-screencapture-location/

## まとめ
* 「control」キーを押しながらサムネールをクリックすると、保存先を変更できる（そのファイルのみ）

    * <img width="273" alt="スクリーンショット 2019-09-23 12.19.33.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146594/46f5d8e0-80ef-33a8-46c6-bcf05fa47a2e.png">

* 次を実施すると、デフォルトの保存先を変更できる
    * ターミナルを起動
    * 次のコマンドを実行
        * defaults write com.apple.screencapture location {保存先}
        * 例：「ピクチャ」に保存する場合
            * defaults write com.apple.screencapture location ~/Pictures

## やってみた
* 設定前（デフォルト）の状態でcommand + shift + 4によって範囲指定でスクショを撮る
    * デスクトップにダウンロードされる
    * <img width="300" alt="スクリーンショット 2019-09-23 12.09.50.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146594/10998958-a079-9bee-f947-6f306eb8cc2c.png">
    * <img width="732" alt="スクリーンショット 2019-09-23 12.09.50.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146594/c7d9d2d5-bf94-b4ac-c714-4f1b815245a8.png">

* 設定を実施
    * <img width="697" alt="スクリーンショット 2019-09-23 12.12.00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146594/2297fcbb-74c7-4b4c-9f5c-d5cbc3009b4a.png">

* 設定後（デフォルト）の状態でcommand + shift + 4によって範囲指定でスクショを撮る
    * 「ピクチャ」にダウンロードされる

<img width="739" alt="スクリーンショット 2019-09-23 12.13.05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146594/49dbfc41-df66-9712-2c47-104080ef50a5.png">
AWS認定ソリューションアーキテクト – プロフェッショナル(改定後) おすすめ学習方法

### はじめに
コメントするためにQiitaに登録してみましたが、自分のプロフに記事が１つも無いのもアレと思いましたので
某所に投稿済みの**AWS認定ソリューションアーキテクト – プロフェッショナル(改定後) の学習方法**をリライトします。

### 試験の概要

- 問題数：75問
- 制限時間：180分
- 合格ライン：75%正解
- 日本語訳文と英語原文を切り替え可能

SAP試験は1回不合格の後、ギリギリのスコアで合格しました。
180分という長時間かつ全問題が長文問題のため、心身のタフさが求められます。
また、とにかく誤訳が多いため、必ず日本語訳文と英語原文をよく比較してください。

### 学習方法

#### AWS公式トレーニング

一番有効だったのはAWS公式トレーニングでした。
[Exam Readiness: AWS Certified Solutions Architect – Professional](https://www.aws.training/Details/eLearning?id=34737)

**無料です。**
試験範囲の説明、試験例題、解説動画などが含まれたリッチなEラーニングです。
とりあえずこれだけやっておけばSAP試験の基本的な部分はほぼ把握できると思います。
英語ではありますが、Google翻訳でなんとかなるレベルですので非常にオススメです。
動画を全て視聴すると約4時間あるので地道に進めました。

私は受講していませんが、SAP試験向けの公式トレーニングは他にもあるようですので
余力があれば試してみても良いかもしれません。
[AWS Well-Architected Training](https://www.aws.training/Details/Curriculum?id=12049)
[EC2 Systems Manager](https://www.aws.training/Details/Curriculum?id=13830)

なお、この辺りの情報は[SAPの紹介ページ](https://aws.amazon.com/jp/certification/certified-solutions-architect-professional/)の下の方に普通に載ってます。
結局、公式の情報をチェックするのが1番という話なんですかね…？

#### Black Belt

公式トレーニングでは各サービスの細かい仕様にまでは触れていませんので、
そこはおなじみの[Black Belt(AWS クラウドサービス活用資料集)](https://aws.amazon.com/jp/certification/certified-solutions-architect-professional/)で補強しました。
とりあえず、公式トレーニングに出てきたサービスは全て`「○○(サービス名) BlackBelt」` で検索し、
出てきた資料を読んでました。

### おわりに

誰かの助けになれば幸いです。
(備忘)cloudwatchのcron式で悩んだのでメモ

## 悩んだこと

毎日18～23時の1時間おきにLambdaを実行させたかったが、
cron式(※)よくわからない。
※(分 時 日 月 曜日 年)

## 解決

最終的に、以下のように指定することでうまく動いた。

### 0/60 9-14 * * ? *

- 分: 0から60分間隔
- 時: 日本時間はマイナス9時間
エンジニアが採用面談で気を付けるべきこと

#はじめに

全てのエンジニアが少しでもいい環境でキャリアを構築できることを願って書きます。
全て持論です。

#いきなり結論

面接する人は以下を見ています。
####1.実装力があること
####2.知らないことをキャッチアップできるか
####3.どれだけ技術にアンテナを張っているか
####4.ビジネスへの理解があるか
####5.愛とモチベーションがあるか

※もちろん、最低限のコミュ力は見ています
（コミュ力とは、その場と相手に合わせて自分の考えを言えれることです。）

#1.実装力はあると証明できればそれで良い

エンジニアである時点で実装力があることは前提です。
なので、パッと見せれてそこそこそれっぽい過去の実績を見せましょう。
それでもって工夫したこと、苦労したことを話せればバッチリ大丈夫です。また、ポートフォリオは実績を見せるといった意味では重要ですがそれ以上の意味を持ちません。GitHubも同様でスキルがある程度あることを見せれますがそれ以上の意味を持ちません。

#2.知らないことはキャッチアップできることが重要である

ITの世界では知らないことがあるのが当たり前です。なので、知らないことを自力でキャッチアップできるかどうかはとても大事です。

#3.どれだけ技術にアンテナを張っているかは、とても重要である

当たり前ですが、技術に興味がない人はITエンジニアにはなれません。なぜならは我々はinformation technologyを扱っているエンジニアだからです。
技術といってもレイヤーが複数あるので一概にこれとは言えませんが、クラウド3社の動向を週次で確認して、毎日qiitaと著名なテックブログを追い、時間がある時にチュートリアルを触っていればまぁ大丈夫でしょう。

#4.ビジネスへの理解があるかも、とてもとても重要である

世の中で働いている人の95パーセントはITエンジニアではありません。
他の方が喋っている言葉はエンジニアの言葉ではなく、ビジネスの言葉です。なので、ビジネスを理解しようとするのはとてもとても重要です。
ビジネスを理解するとは、このサービスもしくはシステムは誰が使っていて、どんな価値を生んでいて、誰がpayしているかってことです。

#5.何よりも重要なのは愛とモチベーションである

愛もモチベーションもない人と一緒に仕事したいと思う人はいないです。


#逆にこれはあまり意味がないこと

##1.プログラミングスクールに行ってました

今現場でバリバリやっているエンジニアでプログラミングスクールに行ったことのある人はいません。なぜならば10年前はなかったからです。なので、自分の知らないものに数十万円を払って行っている人を理解するのは結構難しいです。
プロの通訳がそこらの英会話学校行ったと言われても意味をなさないのと同じです。

##2.媚びへつらう

ITの世界は基本的に実力の世界です。媚びへつらっても1日に書いているコードの量で仕事ができるかどうかバレます。
また、エンジニアには上司や先輩に可愛いがられる能力が低い人が多いので媚びへつらっても無駄です。（自分ができないため）

##3.エンジニアであってもわからないような専門的なこと

AIの論文についていきなり言われてもわかりません！

#以上を踏まえた想定問答
1.今までどんなことをやってきたのか教えてもらえますか？

2.開発環境はどんな感じでしたか？

3.最近良いと思ったサービスは？

4.最近何に興味がありますか？

5.今まで一番頑張ったと誇れることは？

6.自分の強みはなんですか？

7.普段どうやって情報入れてますか？

8.AIわかりますか？

9.今後やりたいことは？

10.アプリ、インフラどっちよりですか？

11.3年後どうなってたいですか？

12.将来こうなってたい！みたいな感じなことありますか？

13.自分に足りない所は？


#最後に

エンジニアであれば、間違いなく少しでも有名な企業でファーストキャリアを歩むのがいいです。

簡単な例を出すと、

A社：初任給30万、福利厚生しっかり、エンジニアもたくさん
B社：初任給20万、福利厚生最低限、エンジニアは数名

この際に前者を選ばない理由はないです。

エンジニアが多ければその分優秀な人と一緒に仕事ができる確率が高まり、スキルアップしやすいです。勉強するにもお金は必要です。また、今のご時世給料が高い会社の方がキャッシュがあります。そのため新しい事をやる余裕、若くしてチャンスがもらえる可能性が高いです。

#最後の最後に
自分はこれを英語でできるように頑張ります。

※IT業界、特にweb業界、特有な話な気はします
Docker と OVS でセグメント間通信(ただし、サーバ内で)

# やりたいこと
![タイトルなし.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74560/73f699f8-cd33-6ae0-43b1-98ce9f654f0b.png)

基本は上記図の通り

* サーバ(Linux) 内に Docker でコンテナを作成
* コンテナの通信はサーバの外に出る必要はない(むしろ出したくない)
* コンテナ間でセグメントをまたいで通信(図ではセグメント二つだけだけど実際はもっと)

## 背景
* 開発環境にプロダクションと同じ環境を構築したい願いを叶えるため
* 開発環境で自由にできるのはこのサーバの中だけ。周りには影響を与えたくないので、サーバ内だけで通信を完結させたい

# できあがった構成
![Slide2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74560/58ef53d1-b2fc-fa2d-8a16-d6992b39076f.png)


## 簡単な説明
まんまだけど、、、
* 1 階層： セグメント間のルーティングをさせるために OVS(Open vSwitch) をてっぺんに
* 2 階層： bridge(ovs-docker) を作成。L3 的役割(実際のルーティングは OVS に任せる)
* 3 階層： ここにコンテナと直接つながる bridge を作成。ここの bridge は VLAN を設定してやる(Fake bridge)。bridge の IP が各セグメントの Gateway の IP となる。
* 4 階層： コンテナは、VLAN タグを設定した bridge につなぐ。ここでは一つだけだけど、実際は、一つのコンテナから複数のセグメントに足を出す

色々調べてみて、VyOS や quagga 使ったりして実現する構成は見かけたけど、いかんせん NW 周りの知識が乏しいので、できるだけ簡単に実現できるよう目指した結果これに。

# 構築手順
一番最後に元ネタをつけておきます。
Linux、Docker、OVS のインストール手順は割愛。
OS は CentOS7.3。

## bridge 作成
```
# ovs-vsctl add-br ovs-docker
# ovs-vsctl add-br b-v100 ovs-docker 100
# ovs-vsctl add-br b-v200 ovs-docker 200
```

2,3 つ目のコマンドが Fake bridge 作成コマンド。最後のパラメータが VLAN ID になるので、各自の環境に合わせて変える

## bridge に IP を設定
```
ip addr add 192.168.100.1/24 dev b-v100
ip addr add 192.168.200.1/24 dev b-v200
ip link set b-v100 up
ip link set b-v200 up
```

Fake bridge に IP を設定して、bridge の Link を up

## コンテナ作成 & ネットワーク周りの設定
```
docker run -d --name ContainerA --privileged --net=none baseimage /sbin/init
docker run -d --name ContainerB --privileged --net=none baseimage /sbin/init
```

ルーティング設定するので、--privileged オプション付き
ネットワークはとりあえず何もなしにするため --net=none を指定してコンテナを作成

```
ovs-docker add-port b-v100 eth0 ContainerA --ipaddress=192.168.100.2/24
ovs-docker add-port b-v200 eth0 ContainerB --ipaddress=192.168.200.2/24

docker exec ContainerA ip route add default via 192.168.100.1
docker exec ContainerB ip route add default via 192.168.200.1
```

各コンテナの eth0 に IP を割り振り。eth0 は任意の文字列を指定可能なので、お好きなように

IP 設定後、コンテナにデフォルト Gateway を設定。Gateway の IP は Fake bridge(b-v100 or b-v200) に割り振った IP

これで無事、セグメントを跨いだ環境の出来上がり。

# この構成の欠点
* ネットワーク周りを OVS にしたことで、docker network コマンドでの管理ができない(できれば、管理は Docker で一元管理できるといいんだけど、、)
* あたり前だが、セグメントが増えるごとに bridge を作成する必要がある。Docker の場合 docker network ～～ で Gateway IP の設定までやってくれたけど、これはいちいち手でやらんといけない(面倒)
* OVS が増える。。開発環境だからいいんだけど、あまり余計なプロセスは増やしたくないので、できれば OVS も排除したい(MACVLAN 使えばいい??)

# 元ネタ
https://blog.scottlowe.org/2012/10/31/layer-3-routing-with-open-vswitch/
https://blog.scottlowe.org/2012/10/19/vlans-with-open-vswitch-fake-bridges/

# 最後に
もっと簡単にできる
そもそも OVS なんていらない、Bridge だけでやれる

などあったら、ご意見、コメント頂けるとうれしいです
JavaScriptのrequestで自己署名証明書のWebサーバーに接続する

社内や開発用のWebサーバーには自己署名証明書がインストールされていることが少なくない。
自己署名証明書のWebサーバーにJavaScriptのrequestでアクセスすると、「Error: self signed certificate」とメッセージが表示される。
これを回避する方法を検索しても、明確な情報が直ぐに見つけられなかったので、調べたことを記して置こう。

# 証明書エラーを無視するオプション

以下の2通りあることが分かった。

- options.rejectUnauthorized = false を指定
- options.agentOptions.rejectUnauthorized = false を指定

[Github の request](https://github.com/request/request) のREADME.mdに記載されている [tls API doc for TLS/SSL options](https://nodejs.org/api/tls.html#tls_tls_connect_options_callback) 近辺を読むと、後者の方が正式なようにも思えるが、実際のところは分からない。

# 使用例

``` JavaScript
var request = require('request');

function request_hoge(callback)
{
    var options = {
        url: 'https://localhost:8443/hoge',
        method: 'GET',
        agentOptions: {
            rejectUnauthorized: false,
        },
    };
    request(options, callback);
}

async function hoge()
{
    await request_hoge(function(err, res, body) {
        if (err) {
            console.log(err);
        }
        else if (res.statusCode != 200) {
            console.log(res);
        }
        else {
            console.log(body);
        }
    });
}

hoge();
```
pyside2-uic は結果標準出力に出すので、パイプでつないで冗長な部分取ってしまう

備忘録です。

[なぜQObject::setObjectName（）を使うのですか？]https://codeday.me/jp/qa/20190407/573096.html
が正しいとすると、pyside2-uicが生成する .py ファイル中の setObjectName() は自己完結しているアプリ作成ならほとんど無駄ではないかと思います。

```
pyside2-uic hoge.ui | grep -v setObjectName > hoge.py
```
で最初から取り除いた方が、Widgetの数が多くなればなるほど読むのが楽です。
[Unity]Coroutineでカウントダウンを作ってみた

# はじめに
Unityの基本的な文法を学んで、それを使ったサンプルを作っています。
Unity公式チュートリアルのScriptingのIntermediate Gameplay Scripting（https://unity3d.com/jp/learn/tutorials/s/scripting)
から選んで学んでいます。今回は14のコルーチンを選びました。
## 開発環境
Unity2018.3 

# コールチンとは
処理を一旦中断した後、同じところから再開して出来る処理

# 基本的な文法
yield~ で一旦中断する。

```C#:Test
public class Test : MonoBehaviour {  
    void Start () {  
        StartCoroutine ("Sample");// コルーチンを実行  
    }

    // コルーチン  
    private IEnumerator Sample() {  
        yield return new WaitForSeconds (?f);//？秒待つ
        yield return null;//1フレーム待つ
        yield break;//コールチンの途中でも強制終了
    }
    
}
```

# コルーチン をつかってサンプル作成した
## 作ったもの
**カウントダウンマシン**
- スタートボタンを押したら5秒からカウントダウンスタート
- ストップボタンを押したらカウントダウンが一時停止
- startボタンは一度押したらカウントダウン終了まで押せない

## コード
```C#:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class CountDownScript : MonoBehaviour
{
    public Text countDownText;
    public Button startButton;
    
    public void StartButton()
    {
        StartCoroutine("CountDown");
        startButton.enabled = false;
    }


    public void StopButton()
    {
        StopCoroutine("CountDown");

    }

    IEnumerator CountDown()
    {
        for (int i = 5; i > -1; i--)
        {
            yield return new WaitForSeconds(1);//1秒待つ
            countDownText.text = i.ToString();

        }
        startButton.enabled = true;
        yield break;

    }

}
```
（多言語対応）PHPで記事のタイトルを指定の字数超えたら...表示にする

使う機会多そうだなーと思ったので自分用メモ。

やりたいこと：記事一覧の箇所で、タイトルが全文表示されてしまって見栄えが悪いので、字数を制限して、字数以降は...を表示したい。

考慮する点：サイトが多言語なため、日本語以外にも対応する必要あり。

## 言語の判定
日本語がマルチバイトなため、日本語で「字数制限30字」とかの制限をつけると、英語のタイトルの場合60字とかになる。

そのため、日本語かそうではないか（正しくはマルチバイト文字かそうでないか）の判定がまず必要。


判定に使うのは

・mb_strlen
・mb_strwidth

の二つ。

mb_strlenは文字列のバイト数を出力し、mb_strwidthは文字の幅（文字数）を出力するので、全角文字が文字列に含まれていた場合は両方の値が一致し、また半角しかない場合は一致する。

よって、

```php
if(mb_strlen($title,'utf8') != mb_strwidth($title,'utf8')){
        //マルチバイトの場合の処理
} else {
        //それ以外の場合の処理
}

```
上記のようにする。

##字数の設定と...の追加

ここは、先ほどのmb_strwidthで字数を数えて、振り分ける。
もしも字数を超えてた場合は、mb_substrで字数までの文字列にする。
その後...を追加。

```php
$number = 30 //ここに字数を入れる
if(mb_strwidth($title) > $number){
         $title = mb_substr($title,0,$number);
         $title = $title . '...';
}
```

英語も字数を変えるだけで対応可能なので、最終的に全コードは、

```php
$number = 30 //ここに字数を入れる
$number_single = 60 //日本語以外の文字数

if(mb_strlen($title,'utf8') != mb_strwidth($title,'utf8')){
        if(mb_strwidth($title) > $number){
         $title = mb_substr($title,0,$number);
         $title = $title . '...';
        }
} else {
        if(mb_strwidth($title) > $number_single){
         $title = mb_substr($title,0,$number_single);
         $title = $title . '...';
        }
}
```

になる。

##その他考慮できる点
マルチバイトの処理で使った、mb_substrを英語の場合でも使っているが、substrでも問題ないのか、そもそもsubstrの方がいいのかよくわかってない。
F# Npgsql+Dapper でPostgreSQLを操作

F#+[Npgsql](https://github.com/npgsql/npgsql)+[Dapper](https://github.com/StackExchange/Dapper)の素振り。
[Npgsql.Fsharp](https://github.com/Zaid-Ajaj/Npgsql.FSharp)というF#向けのラッパーもあるが今回は使わない。

# 環境

- DotNetCore 2.2.0
- FSharp.Core 4.6.2
- Npgsql 4.1.0-preview2
- Dapper 2.0.4

# 準備

```yml:docker-compose.yml
version: '3'
services:
  db:
    image: postgres:alpine
    environment:
      POSTGRES_PASSWORD: secret
    ports:
      - 5432:5432
```

こんな感じでpostgresコンテナを立ち上げておく。

# コード

```fsharp
// Learn more about F# at http://fsharp.org

open System
open Npgsql
open Dapper

let createConnection () =
    let dbHost = "localhost"
    let dbPort = 5432
    let dbDatabase = "postgres"
    let dbUser = "postgres"
    let dbPassword = "secret"
    let builder =
        new NpgsqlConnectionStringBuilder(Host = dbHost, Port = dbPort,
                                          Username = dbUser,
                                          Password = dbPassword,
                                          Database = dbDatabase,
                                          SslMode = SslMode.Disable)
    new NpgsqlConnection(builder.ToString())

type User =
    { id : int
      name : string }

[<EntryPoint>]
let main argv =
    let conn = createConnection ()
    conn.Open()
    
    // テーブル作成
    conn.Execute("""
        CREATE TABLE users (
            id   INTEGER NOT NULL PRIMARY KEY,
            name VARCHAR NOT NULL
        )
    """) |> ignore
   
    // レコード挿入
    let insertCmd = new NpgsqlCommand("""
        INSERT INTO users(id, name)
        VALUES (@id, @name)
    """, conn)
    insertCmd.Parameters.AddWithValue("id", 1) |> ignore
    insertCmd.Parameters.AddWithValue("name", "John Doe") |> ignore
    insertCmd.ExecuteNonQuery() |> ignore
    
    // レコード取得
    let users = conn.Query<User>("SELECT id, name FROM users").AsList()
    
    // テーブル削除
    conn.Execute("DROP TABLE users") |> ignore
    
    conn.Close()
    0 // return an integer exit code

```

### 接続設定

`createConnection` 関数の内容通り。
今回は各値ベタ書きしているが実際には環境変数から取ることになるだろう。

### SELECT

SELECT文は `conn.Query<'T>` を使う。
Dapperの効用により渡した型のリストで返ってくる。

### CREATE TABLE / DROP TABLE / INSERT

それ以外の操作は

1. `conn.Execute("SQL")`
2. `let cmd = new NpgsqlCommand("SQL", conn)` → `cmd.ExecuteNonQuery()`

のいずれかで行う。
2のやり方は冗長なので基本的に1を使えば良さそう。

### パラメータ注入

#### conn.Execute("SQL")の場合

第2引数にレコードを渡す。
[4.6から使える匿名レコード](https://www.infoq.com/jp/news/2019/04/fsharp-4.6-released/)を使うのが楽そう。

```fsharp
let sql = "INSERT INTO users VALUES(@id, @name)"
cmd.Excute(sql, {| id = 1; name = "John Doe" |})
```

#### new NpgsqlCommand("SQL", conn)の場合

```fsharp
let insertCmd = new NpgsqlCommand("""
    INSERT INTO users(id, name)
    VALUES (@id, @name)
""", conn)
insertCmd.Parameters.AddWithValue("id", 1) |> ignore
insertCmd.Parameters.AddWithValue("name", "John Doe") |> ignore
insertCmd.ExecuteNonQuery() |> ignore
```

やはり冗長。

# 参考
[Getting Started | Npgsql Documentation](https://www.npgsql.org/doc/index.html)
[PostgreSQL で Dapper を使う](https://tnakamura.hatenablog.com/entry/2015/01/09/how_to_use_dapper_with_postgresql)
Typescrip 関数の型をpropsに渡す



これがわかり安かったな

```javascript
import * as React from 'react';

interface ToggleProps {
    ClickHandler: (event: React.MouseEvent<HTMLButtonElement>) => void
}

export function Toggle(Props: ToggleProps) {
    return <button onClick={Props.ClickHandler}>Toggle</button>
}

```

### まとめ

色々調べてわかったのは下記

- 公式 event: 大元イベント<エレメント>

- イベントまとめ
  - FormEvent
  - HTMLElementEvent
  - MouseEvent

- エレメントまとめ
  - InputElement
  - ButtonElement
  - HTMLFormElement




# 記事



https://www.pluralsight.com/guides/typescript-pass-function-react
【Xamarin.Forms】Androidエミュレータでデバッグするためにやったこと

# はじめに
Xamarin.FormsでAndroidエミュレータを使ってデバッグする、というだけの作業にかなり手間取ってしまったので、備忘録としてエラーの対処法を列挙しておく。
ちなみに、エラー内容は「エミュレータのパフォーマンスのためのハードウェア高速化」や「Sytem UI isn't Responding」などなど。

また、この記事に載せていることはあくまで解決策の候補なので、試してみて失敗したら別の記事を参考にしてください。

追記：Androidエミュレータを入れる際に共通の解決策だと思うので、Android Studio使っている人にも参考になるかと。

## 環境
* Visual Studio 2019
* Windows10 home

## エミュレーターのパフォーマンスのためのハードウェア高速化 (Hyper-V）

「エミュレータのパフォーマンスの向上のためにハードウェア高速化を行ってください」みたいなエラーが出たので、[ここ](https://docs.microsoft.com/ja-jp/xamarin/android/get-started/installation/android-emulator/hardware-acceleration?tabs=vswin&pivots=windows#hyper-v-win)のドキュメントを参考に対処。

コマンドプロンプトを開き、下記のコマンドで自分のPCが``Hyper-V``をサポートしているか確認。

```:command
$ systeminfo
```

表示された内容的に``Hyper-V``が使えそうだったので、ドキュメントに従い、Hyper-Vの高速化を有効にした。
（正確には、ハイパーバイザープラットフォームを有効化した）

具体的には、「Windowsの機能の有効化または無効化」を開き、「Windowsハイパーバイザープラットフォーム」と「仮想マシンプラットフォーム」（※１）のチェックボックスにチェックを入れてOKボタンで完了。
（その後、PCの再起動が必要だった気がする…）
※１：ドキュメントによると「仮想マシンプラットフォーム」にチェックを入れる必要はなさそうだったが、チェック入れてみたら上手くいったので、上手くいかない人は自己責任でチェックを入れると良いかも？

ハイパーバイザープラットフォームが有効になっているかをPowerShellで確認するために、管理者権限でPowerShellを起動して下記のコマンドを入力。

```:PowerShell
Get-WindowsOptionalFeature -FeatureName HypervisorPlatform -Online
```

``State: Enabled``となっていれば有効化されている。

筆者自身よく理解できていないため正確な情報ではないが、おそらく``Hyper-V``か``ハイパーバイザープラットフォーム``のどちらか片方を有効化すれば良いらしい。
筆者の環境では、``Hyper-V``の有効化方法がわからなかったので、``ハイパーバイザープラットフォーム``を有効化した。

## Xamarin側の設定
Xamarin.Formsのプロジェクトを作成し、「デバッグ ＞ Xamarin.Androidのプロパティ ＞ Androidオプション」と選択。
「Fast Deploymentの使用（デバッグモードのみ）」のチェックを外す。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363036/b044310f-c68d-4e1c-0899-172db0d3bacf.png)

## System UI isn't responding
エミュレータ立ち上げたときにこのエラーが出たときは、「wait」を選択すれば良い。
デバッグとかビルドとかしてない状態で表示するものがないことがエラー原因だと思う（あくまで予想）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363036/c29c1a7b-4150-4889-5863-d32df129ebef.png)


## その他
一度エミュレータが正常に起動しても、Visual Studioを再び立ち上げたときや新しいプロジェクトのデバッグ時に正常に作動しない場合がある。
その際は、Android Device Managerを起動し、エミュレータの設定を確認したり、出荷時の状態にリセットしたりすると治ることが多い。

## おわりに
Xamarinのインストールは、[Qiitaのこの記事](https://qiita.com/koji716jp/items/ed93c0a9513bf261a835)を参考に進めていった。しかし、エミュレータ導入方法がわからず、対処法を調べるのにかなりの時間を費やしてしまったために本記事を書いた。
また、色々と試しているうちに上手くいっただけなので、あくまでこの記事は参考程度にしてもらえると良いと思います。
ご指摘などあればコメントにお願いします。

## 参考サイト
* https://docs.microsoft.com/ja-jp/xamarin/android/get-started/installation/android-emulator/hardware-acceleration?tabs=vswin&pivots=windows#hyper-v-win
* https://docs.microsoft.com/ja-jp/xamarin/android/get-started/installation/android-emulator/troubleshooting?pivots=windows#accel-issues-win
* https://qiita.com/koji716jp/items/ed93c0a9513bf261a835
レガシーコードからの脱却

[レガシーコードからの脱却](https://www.amazon.co.jp/dp/4873118867)読んだのでメモ。

# プラクティス3 継続的に統合する

## 完了と、完了の完了と、完了の完了の完了が違うことを知る

+ 完了

> 機能を作った開発者が自分のマシンで実行し、何らかの結果を得たこと

+ 完了の完了

> 自分のマシンで機能するだけでなく、ビルドにも統合されていること

+ 完了の完了の完了

> コードは自分のマシンで動作し、ビルドに統合され、クリーンで保守可能になっていること。設計をきれいにし、コードを読みやすくして、理解しやすくシンプルに作業できるようにする

# プラクティス4 協力しあう

> 私たちの最大のリソースはお互いである。一緒に働くためのテクニックや構成を知っておくと、協働を最大化にするのに役立つ。

# プラクティス5 「CELAN」コードを作る

## トレードオフを理解する

> ソフトウェア開発は与えられた状況に応じて最善のトレードオフを繰り返す仕事だ。自分たちが下すトレードオフの意味を理解することで、現在の状況でのニーズに対処するための良い判断ができるようになる

# プラクティス9 レガシーコードをリファクタリングする

> 保守性を上げてソフトウェアの所有コストを下げるために、**品質を保証するのではなく、コードをリファクタリングし品質を作り込むように変えていく必要がある**
【powershell】MS Wordを開かずに内容を取得する

# 背景
日々の業務で大量の Microsoft Word ファイルを横断検索する必要がありましたが、COM オブジェクトを操作しての文書操作には次のような問題点があります。

+ 遅い（いったん Word 自体を起動して内容を読み込む必要がある）
+ 実行後にプロセスを解放する処理が面倒

そこで、`.docx` は実質的に圧縮ファイルで、内部の `document.xml` に内容が書かれているという記事（[Qiita: Wordさんは今日もおつかれです](https://qiita.com/kaityo256/items/c15889dbb7acb2632c6e)）を拝見し、色々と試行錯誤してみました。

**［注意］ 下記内容は `.docx` 形式のファイルのみを対象としています。** 

# ポイント
+ `.docx` は実質的に `.zip` 
+ 文章の本体は zip 内部の `document.xml` に含まれている
+ `r` が VBA で言うところの `range` 、 `p` が `paragraph` に相当する模様（全体の構造は未解明……）

# コード

```powershell
Add-Type -AssemblyName System.IO.Compression.Filesystem
function Get-TextOfDocxDocumant {
    <#
        .EXAMPLE
        Get-TextOfDocxDocumant .\test.docx
    #>
    param (
        [string]$path
    )

    try {
        $fullPath = (Resolve-Path -Path $path).Path
        $compressed = [IO.Compression.Zipfile]::OpenRead($fullPath)

        $target = $compressed.Entries | Where-Object {$_.Fullname -eq "word/document.xml"}
        $stream = $target.Open()
        $reader = New-Object IO.StreamReader($stream)
        $content = $reader.ReadToEnd()

        $reader.Close()
        $stream.Close()
        $compressed.Dispose()

        $m = [regex]::Matches($content, "<w:p.*?>.*?</w:p>")
        return [PSCustomObject]@{
            Status = "OK"
            Lines = @($m.value -replace "<.+?>", "")
        }
    }
    catch {
        return [PSCustomObject]@{
            Status = "FILEOPENED"
            Lines = @()
        }
    }
}
```
# 使い方
```
PS > (Get-TextOfDocxDocumant -path .\hogehoge.docx).Lines
ほげほげ
ふがふが
……

```

# 今回の学び
+ xml としてパースするよりも正規表現で抽出したほうが楽
+ 以下、xml構造と格闘した際の覚書き
    - 本文中に空白文字が含まれていると、そこで xml 構造が区切られて `space` 要素が `Preserve` になる。`space` の有無での場合分けが必要
    - `Preserve` の場合は `get_innerText()` で内容を取得できる
    - 本文と表は別に構成されている
Laravel6でBootstrap, jQueryを使う方法


Larave5系ではbootstrapやVue, jQueryなどが標準装備されていましたがLaravel6をみてみるとそうではありません。

bootstrap, jQueryを使いたかったのですが導入にちょっと困ったのでメモを残しておきたいと思います。

# Laravle6でBootstrap, jQueryを使う方法

Laravel6では`package.json`をみても、bootstrapやjQueryは入っておりません。

まずは、`laravel/ui` というライブラリをインストールします

```
$ composer require laravel/ui
```

すると、`artisan ui`コマンドが使えるようになります。


```
$ php artisan ui bootstrap
```

これで、bootstrapを使うために必要な物を全てインストールしてくれます。

もちろんjQueryも入ってます！


Vueを入れたい場合は、`php artisan ui vue`とすれば良いそうで！！

ちょっと感動しました。おしまい！
ブランチ名に issue 番号が入ってる時に、コミットメッセージに自動で issue 番号を入れる件

開発を進めていく際に、Git のコミットメッセージ内に「#145」みたいなのを書いておくと、関連する issue がすぐわかるので、なんとなく便利そうな気がしていてちまちま書いています。

GitHub だとリンクをつけてくれるのもなかなか便利です。PR 作って開発をしていたら PR へのリンクは自動で入るんですけどね。個人のプロジェクトだと PR は作らないので、まあそこは手動で妥協しているというわけでもあります。

<img width="300" alt="Moca 2019-09-23 10-41-10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3336/d35ee099-7a1b-3cf6-f738-d72af2d6649c.png">

で、ちまちま手入力するのも結構ダルいんで、自動で入力できるようにしました。幸い会社では、ブランチ名を `issues/100-something` とする文化があってそれに合わせて運用してるんで、ブランチ名から自動で取得できます。 `.git/hooks/prepare-commit-msg` というファイルを用意すると、コミットメッセージに対してスクリプトを実行できるんで、この機能を使いました。

こんな感じ。

```sh
#!/bin/sh

COMMIT_MSG_FILE=$1
COMMIT_SOURCE=$2
SHA1=$3

number=`git branch 2> /dev/null | egrep '^\*' | cut -b 3- | sed -e "s/^issues\/\([0-9]*\).*/[#\1] /g"`

if [[ $number == "[#"* ]]
then

case "$COMMIT_SOURCE,$SHA1" in
 ,|template,)
   /usr/bin/perl -i.bak -pe '
      print "'"${number}"'"
	 if /^\n/ && $first++ == 0' "$COMMIT_MSG_FILE" ;;
 *) ;;
esac

fi
```

`git commit` すると、コミットメッセージの頭に `[#145] ` というのが自動で入ります。便利！！
git merge のコンフリクト時に使う git checkout --ours と --theirs の位置づけを調べてみた

## はじめに

`git merge` するときにあるファイルが複数箇所コンフリクトしてしまったとき、マージさせたブランチか、またはもともとチェックアウトしているブランチどちらかの内容を全面的に適用したいと思ったときに調べたメモです。

## tl;dr

以下の使い分けで実現できました。

```
# チェックアウトしているブランチを反映したい場合
git checkout --ours <file>

# マージさせたブランチを反映したい場合
git checkout --theirs <file>
```

## ours と theirs の位置づけ

[git-checkout Documentation](https://git-scm.com/docs/git-checkout) を確認すると以下となっています。以下引用します。

```
--ours
--theirs
When checking out paths from the index, check out stage #2 (ours) or #3 (theirs) for unmerged paths.
```

`ours` が stage #2、 `theirs` が stage #3 とのこと。

stage #2、stage #3 が何かは、[gitrevisions Documentation](https://git-scm.com/docs/gitrevisions) に書いてありました。以下引用します。

```
:[<n>:]<path>, e.g. :0:README, :README
A colon, optionally followed by a stage number (0 to 3) and a colon, 
followed by a path, names a blob object in the index at the given path. 
A missing stage number (and the colon that follows it) names a stage 0 entry. During a merge, stage 1 is the common ancestor, 
stage 2 is the target branch’s version (typically the current branch),
and stage 3 is the version from the branch which is being merged.
```

ざっと読む限り以下のような番号割り振りになっているようでした。

* stage #0：不足しているステージ番号を表す
* stage #1：共通の祖先ブランチ
* stage #2：マージ先のブランチ（形式的に現在のブランチ）
* stage #3：マージしようとしているブランチ

## おわりに

今回のことを調べるために git のマニュアルを読んでみたのですが、かなり奥深さを感じました。やっぱり一次情報は大切ですね。

## 参考

* [Git - gitrevisions Documentation](https://git-scm.com/docs/gitrevisions)
* [Git - git-checkout Documentation](https://git-scm.com/docs/git-checkout)
* [git checkout： “theirs”と “ours”の詳細な意味 - コードログ](https://codeday.me/jp/qa/20190515/830232.html)
DjangoでSCSSを使用するには

## 前書き
SCSSはCSSの書き方ほぼそのままにSassの機能が使えるため、すでにCSSを使っている人には学習コストが低い、大変便利なメタ言語です。

ただ、Sassは便利ですがコンパイルが必要なため、導入をためらう方もいらっしゃると思います。
もちろんDreamWeaverやVSCodeなどのエディタでは自動でコンパイルしてくれる機能がありますが、プラグインを別途追加する必要がある場合もあり、正直面倒に思う人も多いでしょう。
そういった方でももしDjangoの環境をお持ちであれば、コンパイルをどうするかの問題は一挙に解決することができます。
DjangoにはSassのプロセッサーが用意されているため、簡単な設定でSassを使用することができるのです。

## 方法
1. プロセッサーのインストール
プロセッサーはpipコマンドからインストールすることができます。
`pip install libsass django-compressor django-sass-processor`

2. staticディレクトリを作成する
作成するのはmanage.pyと同じディレクトリと、各アプリケーションのadmin.pyと同じディレクトリの2か所です。
また、作成したstaticディレクトリにはDjangoのアプリケーション名のディレクトリをそれぞれ作成しておきます。
※冗長な構成に見えるかと思いますが、Djangoのお作法としてこういった構成にしておいた方がいいようです。色々設定していくうちにうまく動かないことがあるのだそうで…

3. プロジェクトのディレクトリ直下のsettings.pyを編集する
・INSTALLED_APPSにsass_processorを追加する

    ```ruby:settings.py
INSTALLED_APPS = [
    ... 中略 ...
    'sass_processor',
]
```
STATIC、Sassの設定を追加する
今回は特に使いませんが、STATICの設定も一緒にしておくと画像等の参照に便利です。

    ```ruby:settings.py<br>
STATIC_URL = '/static/'
STATICFILES_DIRS = (
    os.path.join(BASE_DIR, 'static'),
)
SASS_PROCESSOR_ROOT = os.path.join(BASE_DIR, 'static')
SASS_PROCESSOR_INCLUDE_FILE_PATTERN = r'^.+\.(sass|scss)$'
SASS_PRECISION = 8
SASS_OUTPUT_STYLE = 'compressed'
SASS_TEMPLATE_EXTS = ['.html', '.haml']
```

4. SassまたはScssファイルを作成する
アプリケーションのディレクトリ直下に作成したstatic/アプリケーション名のディレクトリにSassまたはScssファイルを作成しましょう。

5. テンプレートにSassを読み込ませる
テンプレートの最初に下記を記載し、
`{% load sass_tags %}`
headerで作成したSass・Scssファイルを記載します。
`<link rel="stylesheet" href="{% sass_src '【アプリケーション名】/【Sass(scss)ファイル名】' %}">`<br>
こうすることで、該当のテンプレートが読み込まれた際にSass・Scssファイルをコンパイルして、manage.pyと同じディレクトリに作成したstaticディレクトリにCSSしてくれます。

6. ページを表示
コンパイルされたcssファイルが読み込まれ、画面にSass・Scssファイルの内容が反映されます。
メモ：Mac(Mojave)にHaskellをインストール


シェルはfishを使っている。

```shell
# インストール
brew install haskell-stack

# インタプリタを起動してみる（けっこう時間がかかる）
stack ghci
```


`stack ghci`の前に`stack setup`を実行すべきなのかもしれない。
[Tips]BigQueryでパーティションのないテーブルをあるテーブルにコピーする

## 前提
- 執筆者がよくbqコマンドを忘れるので、備忘録的に残しておく。
- Bigqueryのパーティションは、日付タイプ。
 - [公式ドキュメント：分割テーブル概要](https://cloud.google.com/bigquery/docs/creating-column-partitions?hl=ja)
- 作成時のIAM権限は、要確認。（特に、コピー元に参照権限があるか？）

## 設定方法

##### コピー元のテーブルスキーマの取得

```
bq show --schema <コピー元 project name>:<コピー元 dataset name>.<コピー元 table name> > source.json
```

##### コピー先に空のテーブルを生成

```
bq mk --schema source.json --time_partitioning_type=DAY <コピー先 project name>:<コピー先 dataset name>.<コピー先 table name>
```

##### パーティションを絞ってコピー
- 前提
  - 標準SQLを指定
  - 既にデータがある場合、置換を許容
  - "log_date"は、コピー元の日付パーティションの参考になりそうなカラム

```
bq query \
--use_legacy_sql=false \
--replace=true \
--destination_table '<コピー先 project name>:<コピー先 dataset name>.<コピー先 table name>$<YYYYMMDD>' \
'select * from `<コピー元 project name>.<コピー元 dataset name>.<コピー元 table name>` where date(<log_date>) = date("YYYY-MM-DD");'
```
Rustに関する情報源・サイトまとめ（順次更新）

## 全般

### [Rust公式サイト](https://www.rust-lang.org/)

Rust本家サイト。

### [Awesome Rust](https://github.com/rust-unofficial/awesome-rust#awesome-rust-)

GitHub上で管理されている、Rustに関連した有用なサイトをまとめてくれているサイト。この記事のスーパーセット的存在だが、いかんせん纏められている情報が多すぎるため初学者には辛いかもしれない。

## 学習

## [The Rust Programming Language](https://doc.rust-lang.org/book/title-page.html)

Rust公式で公開されている書籍。ネット上で読むことができる。この本を一通り読めばRustを自由に扱うための知識がつきそう。

## [The Rust Programming Language(日本語)](https://doc.rust-jp.rs/book/second-edition/ch00-00-introduction.html)

上記の日本語版。英語が苦手という方に。

## 開発

### [Crates(Rust Package Repository)](https://crates.io/)

Rustで利用するPackageの管理サイト。Javaに置けるMavenとかJavaScriptに置けるnpmのようなもの。

### [stack overflow(Rust)](https://stackoverflow.com/questions/tagged/rust)

おなじみstack overflowのRustでの検索結果一覧。

### [Naming conventions](https://doc.rust-lang.org/1.0.0/style/style/naming/README.html#general-conventions-[rfc-#430])

Rust上での命名規則がまとめられている。コードのリーダビリティを求めるあなたに。
技術書典７のお客さん数の推移のお手軽時系列解析

#解析内容
技術書典７でサークル「お台場計算尺」は合わせて合計112点の本とグッズを頒布したが、それにあたって11:00から17:00まで10分ごとに頒布数を記録した。記録漏れもある（５％くらいある、忙しいときは忙しかったんです...）が、それは無視して時系列解析を試みる。

#データと解析スクリプト
R と ggplot2 を使って解析した。Ｒスクリプトの中にデータも埋め込んだ。時系列データの平滑化は LOWESS で行った。と言っても ```geom_smooth()``` に丸投げしただけで他の方法は全く試してないので、手抜きのそしりは免れない。

```R
library(tidyverse);
theme_set(theme_bw(base_family = "HiraKakuProN-W3"));

dat <- c(0,1,9,3,2,2,1,2,12,8,0,5,10,4,0,5,0,4,
         3,1,5,2,0,0,1,2,4,3,4,8,4,1,1,1,0,4);
DAT <- cbind(seq(1:length(dat)), dat);
colnames(DAT) <- c("time", "items");
ggplot(DAT, aes(x = time, y = items)) + geom_line() + geom_smooth();
```
#結果
でプロットされるのはこんな図。横軸は11:00からの経過分数の1/10。
![Rplot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/377279/9319f563-e536-5edc-0715-c4250b157522.png)
前半が山で後半がプラトー、または山が二つあるような気がしないでもない。それにしても標準誤差が負に食い込んでるなぁ...と思ったときの常套手段の一つは対数をとる事だが（対数値が負になることは全然気にならないので）、データ点には0がいくつもあるので、その場凌ぎで 1 を足して対数を取って LOWESS にかけてみるとこうなる。

```R
ggplot(DAT, aes(x = time, y = log(items + 1))) + geom_line() + geom_smooth();
```
![Rplot2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/377279/37f5ea36-b889-2348-3d4c-da975995b042.png)
こっちだと山は二つかな、と思える。まぁ元々、データそのままのプロット（上の図）だと二つ目の山は結構ハッキリしている。

#解釈
現場の感触としては

- 開場から16:30くらいまでずっと人通りが絶えなかった
- しかし３時すぎて一旦すいてきた
- そのあと４時ごろに人の波が一回来た

という具合で、平滑化したプロットはそれと一致する。

全くの想像ではあるが、

- 最初の山は待機列を作っていた一般入場者
- 次の山はサークル参加者

なのかもな、と思う。ラスト10分の駆け込み需要がなかったら二つ目の山はもっと明確だったと思うが、この山がサークル参加者によるものなら、むしろ本質はこの一番最後のピークか、と言う気もする。

[技術書典７](https://techbookfest.org/event/tbf07)
[お台場計算尺サークル公開ページ](https://techbookfest.org/event/tbf07/circle/6206385238835200)

#追記
16時前に一般参加者の入場制限を解除した、という情報があった。二つ目の山はそれによるのかな。
WebArena VPSの初期設定でハマるところ

WebArenaのVPSクラウドは最低スペックで月額360円と個人で色々試すのに安上がりなので契約したが、ちょっとハマってしまったので備忘録として書いておく。

# Ubuntuイメージでは、初期ユーザーが「root」ではなく「ubuntu」
よく見るとちゃんと書いてあるんだけどね。
https://web.arena.ne.jp/support/vps-cloud/manual/wakame-vdc.html

# ubuntuユーザーのパスワードがわからない問題
これも書いてあるんだけど、インスタンス名というのがコンパネの
WMI ID
新1G-SSDタイプ(KVM)
(wmi-ubuntu1804kvmSSDx20g)
これだと思い込んで何度やっても出来ないと悩んでいた次第。


https://web.arena.ne.jp/support/vps-cloud/manual/wakame-vdc.html
に書いてあるのが

```
※ubuntuの場合、初期パスワードはインスタンス名の「i-」を除いた文字列です。
```

なんだけど、実際はコンパネからインスタンスの編集画面に行くと書いてある

```
「インスタンスID」の「i-」以降
```

なのね。

同じようにハマった人の記事
https://www.m0de.ml/c0d3man/posts/78fz35cm8tdsvg1ge9xq
EC2 AmazonLinux：PostgreSQL8.2系を使いたい

# ポイント
- AmazonLinux２ではなく、AmazonLinuxを選択
- gcc4.4系を使う（4.8以降はinitdbでエラーが発生する）
    - pg_regress: initdb failed


# 構築手順
```sh
yum update
yum install gcc44
gcc --version
gcc (GCC) 4.4.6 20120305 (Red Hat 4.4.6-4) <== gccのバージョンを確認
yum install readline-devel
yum install zlib-devel

wget https://ftp.postgresql.org/pub/source/v8.2.23/postgresql-8.2.23.tar.gz
tar -zxf postgresql-8.2.23.tar.gz
cd postgresql-8.2.23/
./configure
gmake
gmake install

useradd postgres:postgres
chown -R  postgres:postgres /usr/local/pgsql
sudo su - 
su - postgres
cd /usr/local/pgsql
./bin/initdb
```

以上。
python tips

# 自分が開発をしていてよく遭遇するエラーについてまとめました。

### zip
zip -r NAME.zip folder


### cv2.resize

```python:
img = np.arange(600).reshape(20,10,3)
res = cv2.resize(img,(5,3))

>> error: OpenCV(4.1.1) /io/opencv/modules/imgproc/src/resize.cpp:3598: error: (-215:Assertion failed) func != 0 in function 'resize'

img = np.arange(600).reshape(20,10,3).astype('float64')
res = cv2.resize(img,(5,3))

>>True
```
numpyのdtypeはあまり気にせずに使ってしまうことが多いですが、こういうエラーに出会うので気をつけたいですね。

### module pandas.core not found

これはpythonのバージョンのせいです。
pyenvを使っているならば、`pyenv version`でバージョンを確認してみましょう。3.6.7以上になっているはずです。`pyenv install 3.6.6`でダウングレードしたら直ります。

### pycocotoolsのインストール

pythonのバージョンを3.6.6にし

```
pip install pandas==0.24
pip install cython
pip install git+https://github.com/waleedka/coco.git#subdirectory=PythonAPI
```

で終わり

### tarの解凍
tar -xvf xxxx.tar
#VsCode で最後に編集した位置にカーソルが戻るコマンドは Go to Last Edit Location ( Mac ショートカットなら Command + K -> Command -> Q )

これで前のカーソル行に戻るのに Command + Z などを使って、編集状態まで戻さなくて済む。

![image](https://user-images.githubusercontent.com/13635059/65396384-a90b1780-dde0-11e9-9936-9bb582f0c933.png)


# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/2508








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
[4行] 静的サイトをローカルホスティングして他のデバイスからアクセスする

npmは入っている前提
静的サイトにおけるieやスマホなど別のデバイス(実機/vm)での挙動を確かめたい場合

```shell:
$ cd workspace # 静的サイトの所在に移動
$ npm init -y # package.jsonの生成
$ npm install --save local-web-server # nodeパッケージをローカルインストール
$ npx ws --spa index.html # htmlをホスティング
# -> Listening on http://xxxx.local:8000, http://127.0.0.1:8000, http://172.20.10.6:8000
```


同じネットワーク上にあるなら上記の例でいうと`http://172.20.10.6:8000`でアクセスできる

以上。
KivyでSegmentation faultが起こる時の対処

Raspberry PiのUIとしてPythonで書けるKivyを選んだが、OpenGL周りで問題が起こったので解決法を記載しておく。

```bash
[INFO   ] [Logger      ] Record log in /home/pi/.kivy/logs/kivy_18-10-22_12.txt
[INFO   ] [Kivy        ] v1.11.0.dev0, git-916b77b, 20181022
[INFO   ] [Python      ] v3.5.3 (default, Sep 27 2018, 17:25:39) 
[GCC 6.3.0 20170516]
[INFO   ] [Factory     ] 184 symbols loaded
[INFO   ] [Image       ] Providers: img_tex, img_dds, img_sdl2, img_pil, img_gif (img_ffpyplayer ignored)
[INFO   ] [Text        ] Provider: sdl2
[INFO   ] [Window      ] Provider: egl_rpi
[INFO   ] [GL          ] Using the "OpenGL ES 2" graphics system
[INFO   ] [GL          ] Backend used <sdl2>
Segmentation fault
```

環境変数に以下を追加

```
export KIVY_GL_BACKEND=gl
```

参照
https://github.com/kivy/kivy/issues/6007
portの8000番がLISTENできているかを確認するコマンド

```shell:
netstat -an | grep 8000
```

-a = 全ての接続を表示
-n = 出力をIPアドレスなど数値のみに抑制する（DNS逆引きを行わないなど）

参考
https://www.atmarkit.co.jp/fnetwork/netcom/netstat/netstat.html

以上。
初めてのモバイルアプリ開発 ～インストール他 準備編～

# シリーズ目次

- [仕様説明編](https://qiita.com/sasaco/items/4e3736e19be1535fc460)
- インストール他 準備編
- [アプリを作ってみよう編](https://qiita.com/sasaco/items/94e7e0ae5aace132886a)

# 開発環境の準備

## Ionic を使うためのツールのインストール

### 本項で説明を省略しているツール
以下のツールのインストールは 本項で説明を省略しています

- [Node.js](https://nodejs.org/ja/)
- [Git](https://git-scm.com/)
- [Xcode](https://apps.apple.com/jp/app/xcode/id497799835?mt=12) (MacでiPhoneアプリを作成する場合)
- [Android Studio](https://developer.android.com/studio/install?hl=ja) (Windowsでandroidアプリを作成するの場合)
- IDEエディタ (筆者は[Visual Studio Code](https://azure.microsoft.com/ja-jp/products/visual-studio-code/) を使用しています。)
- ブラウザ　(筆者は [Chrome](https://www.google.com/intl/ja_jp/chrome/) を使用しています。)

### Ionic CLI のインストール
Ionic CLI をインストールします。Ionic CLI をインストールすると, ionicコマンドを動かすことができるようになり, Ionicプロジェクトをコマンドひとつで自動構築したり、リリース用にビルドすることができるようになります。次のコマンドを実行してください

```powershell
npm install ionic cordova -g
```

![test3.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142847/5af6be86-9a31-1c4c-b252-3552fef4d11e.gif)

インストールには 5分ほど時間がかかることもあります。完了したら、次のようにインストールした パッケージ名とバージョン情報が表示されました

```powershell
+ ionic@5.4.1
+ cordova@9.0.0
added 688 packages from 392 contributors 
```

> Ionic がインストールできなかったらバージョンを上げてみよう
`npm update -g npm`
`npm update -g`

# Ionicプロジェクトを作ってみる

## Ionicプロジェクトを作成

環境がととのったのでプロジェクトを作成してみます。
以下のコマンドを入力します。

```powershell
ionic start --type=ionic-angular
```

今回のプロジェクトは以下の仕様です

- Project name: **MobileSkyWay**
- Starter template: **tutorial**

![test3.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142847/11902f6b-f8e2-4f08-c8e3-4c86437230bb.gif)

## 作成されたプロジェクトを起動してみる

VSCode で作成されたフォルダを開きターミナルで以下のコマンドを実行します。

```powershell
ionic serve
```

![test3.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142847/c0e58837-97cb-08e7-c85f-33770324336d.gif)

自動的にブラウザが立ち上がります。

# 次回

[アプリを作ってみよう編](https://qiita.com/sasaco/items/94e7e0ae5aace132886a)
ColaboratoryからGoogle driveにアクセスする方法

# やりたいこと
colaboratoryを使ってdeeplearningの勉強をするために、学習データや学習結果をどこかに残しておきたい。
なので、colaboratoryからgoogle driveにアクセスできるようにする。

# 方法
以下のコードをcolaboratoryのノートブックで作成します。

```
from google.colab import drive
drive.mount('/content/gdrive')
```
マウント先のパスは好きに変えてください。ただし、カレントディレクトリは`/content`のようです。`!pwd`で確認できます。

ノートブックを実行します。

![gdrive_mount.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497211/da91c3aa-17ee-eba8-a122-1b5b6abf42f9.jpeg)

実行結果に`Go to this URL ・・・`と表示されているリンクをクリックします。
Google driveにアクセスするアカウントが表示させるので、アカウントを選択します。
「Google Drive File StreamがGoogleアカウントへのアクセスをリクエストしています」と表示されるので、「許可」をクリックします。
「このコードをコピーし、・・・」と表示されるので、文字列をコピーします。。
もとのColaboratoryの画面に戻って、実行結果に表示されている`Enter your authorization code`のところに先程の文字列を貼り付けます。
`Mount at /content/gdrive`と表示されたらOK。

試しにマウントしたあとにノートブックで

```
!ls '/content/gdrive'
```

とすれば、ディレクトリの内容が表示されます。
rubyのgem、color_echoのapiが変わっていた

[こちら](https://qiita.com/khotta/items/c76b4d7fbfc404b8bded)の記事など過去記事を参考にしていたところapiが変わっていて詰まった

```shell:
$ gem install color_echo
$ rbenv rehash
$ color_echo # -> zsh: command not found: color_echo
```

v3.0.0からapiが変わったらしい

```
$ colorecho # 正しく動く
```

オプションの使い方なども変わっていた
以下参照

[Reference | Color Echo](http://colorecho.github.io/ref_cli.html)

以上。