OmniAICreator/Qiita-1.07M huggingface dataset:
Spring Data JPAによるソート（複合キーのソート付き）

spring-bootを使った中での躓いたことや調べたことのメモです。


## 環境
- java: 8
- spring-boot: 2.0.1
- spring-data-jpa: 2.0.7

## 前提
以下のEntityで考えます

```java
@Entity
public class Entity {
  @Id
  private int Id;

  private String name;

  private int position;

  // Getter, Setter省略
}
```


## `List<T> findAll(Sort sort)`
JpaRepositoryを継承したinterfaceを作成した時点で`List<T> findAll(Sort sort)`が定義されており、次のようにソートできます。

```java
@Service
public class EntityService {

  @Autowired
  EntityRepoistory entityRepository;

  public List<Entity> xxxMethod() {
    return entityRepoistory.findAll(new Sort(ASC, "position"));
  }

}

```

### 複合キー
Sortを組み合わせて指定をする

```java
// positionの降順、idの昇順でソート
Sort sort = new Sort(Direction.DESC, "position").and(new Sort(Direction.ASC, "id"));
```

## QueryMethodの定義
JpaRepositoryを継承したinterface上でメソッドを定義するだけでソートを実現できます

```java
@Repository
public interface EntityRepository implements JpaRepository<Entity, Integer> {

  // select * from entity where name = 'xxx' order by position asc と同等
  List<Entity> findByNameOrderByPosition(String name);

  // select * from entity order by position と同等
  // findAllOrderByPositionでは駄目
  List<Entity> findAllByOrderByPosition();
}
```

findByの戻り値をListにするとこの命名でも複数の結果として取得可能、
findAllOrderByPositionではうまく動かないという罠。

### 複合キー

```java
// select * from entity order by position desc, id asc と同等
List<Entity> findAllByOrderByPositionDescIdAsc();
```

## アノテーションによる定義

`@Query`にJPQL形式で記述することで実現可能

```java
@Repository
public interface EntityRepository implements JpaRepository<Entity, Integer> {
  
  @Query(value = "select e from Entity e order by position desc, id asc")
  List<Sample> queryAll();

  // または

  @Query(value = "select e from Entity")
  List<Sample> queryAll(Sort sort);
}
```

## 関連Entityのソートについて
`@Orderby`を使用する

```java
@Entity
public class Entity {

  @OrderBy(value = "position desc, id asc")
  @OneToMany()
  @JoinColumn(name = "entity_id")
  private List<EntityItem> entityItems;
}

```


# 参考URL
https://docs.spring.io/spring-data/jpa/docs/current/reference/html/
scikit-learnを使って糖尿病データ（diabetes）を解析する

scikit-learnを使って糖尿病データ（diabetes）を解析してみました。以下の機械学習モデルを使っています。

* 多項式特徴量 (PolynomialFeatures) + 線形モデル L1正則化 (Lasso)
* 多項式特徴量 + 線形モデル L2正則化 (Ridge)
* ランダムフォレスト
* サポートベクターマシン 線形カーネル (SVR kernel='linear')
* サポートベクターマシン ガウシアンカーネル (SVR kernel='rbf')

ソースコード [GitHub unhurried/scikit-learn-diabetes](https://github.com/unhurried/scikit-learn-diabetes/blob/master/diabetes.ipynb)
GitHubリポジトリをライブラリサーバとして使ってみた

# そもそもどういうことか
Nukkitと呼ばれるMinecraft BE用サーバーソフトウェアのプラグインを開発していた時のこと、プラグインを配布する際に前提プラグインをいかにしてダウンロードさせるか、という問題に直面しました。

そこで考えたことがGitHubにその前提プラグインをあげておき、配布するプラグインからそれをダウンロードすればいいやということです。

実際に試してみたのでその経験談として読んでいただければ幸いです。
※あまりにもゴリ押し感が強いです。（笑）

# どうやったのか
GitHubリポジトリを作り、そこにdoc.jsonというJsonファイルを用意しました。
ここに各ライブラリの情報を記述しています。

![1.PNG](https://qiita-image-store.s3.amazonaws.com/0/237903/a3f8d2c6-d078-dc93-ad8c-c0d22ba806c5.png)

あらかじめ前提プラグイン類はリポジトリにあげておきます。

![2.PNG](https://qiita-image-store.s3.amazonaws.com/0/237903/bdbaefa7-409d-19c2-6bda-4e48a8afecd6.png)


プラグイン側からこのJsonを「 https://raw.githubusercontent.com/ 」のようにrawコンテンツのURLから取得し、読み込みます。
![3.PNG](https://qiita-image-store.s3.amazonaws.com/0/237903/d55ae07a-1b94-9e06-310e-e0a9ced0dc78.png)

そしてrepositoryセクション内から導入したい前提プラグインの名前を検索し、urlセクションからダウンロードURLを取得します。
![4.PNG](https://qiita-image-store.s3.amazonaws.com/0/237903/a979c3bf-5180-e0cc-ecbd-f58be2060956.png)


それをもとに前提プラグインをダウンロードして有効化させるという流れを取りました。
while/until 条件

i=0 i+=1
while i < 3 
=> iが2になるまで
・条件式を満たす場合のみループ
until i >=3
=> iが３を越えないまで
・条件式を満たさない場合のみループ

--------------------------
i=gets.to_i, j=gets.to_i
while i !=3 && j !=4　　　
=>iが３でないかつjが４でないを満たす場合のみループ    
=>iが３またはjが４であれば離脱

until i ==3 || j==4
=>iが3またはjが4を満たさない場合のみループ
=>iが３またはjが４であればループ離脱
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

while 条件 =>条件が真ならループが続く =>**条件を満たせないとループ終了**
until 条件 =>条件が偽ならループが続く =>**条件を満たすとループ終了**

while=>「〜にならなかったら」終了
until=>「〜になったら」　　 終了 

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

whileは目標条件の真逆を条件式に真として書かなければならないので、実際厄介
例えばHPが０切ったら死ぬという当たり前なRPGの条件も、hp>0として記述しないとhp<=0になるまでループを続けてくれない。
untilは目標条件をそのままを条件式に記述してしまえばいいので、上記の例なら
hp<=0、HPが０になったら終了と、条件式を見ただけでループ離脱条件が掴みやすい
[参考リンク](https://gist.github.com/NathanielWroblewski/8152346#file-while-rb-L39)
Rustでプログラミング

# Rustを使ってみませんか？
皆さんは普段どのようなプログラミング言語を使用していますか？
私は仕事で C#、VB.net、C/C++、java。VBAあまり経験はないのではFortran、java script、アセンブラ、、、と幾つか使用経験があります。どの言語も良い点、悪い点があり、愛すべきところはどのプログラム言語でもあります。
で、今回紹介したいプログラム言語はRustです。特徴として、
 - ゼロコスト抽象化
 - ムーブセマンティクス
 - データ競合のないスレッド
と、多々あります。詳細は[公式サイト](https://www.rust-lang.org/ja-JP/)を御覧下さい。

ただ、私が最も紹介したいのは以下の要素です。
 - コンパイラによる強力な静的解析
 - C/C++プログラマがイメージしやすいメモリ管理

java ee 7などフレームワークが強力にサポートしてくれる環境ではアノテーションを使用して動的に処理されることで開発効率、メンテナンス性が向上します。しかし、実行時で問題が発覚するため／メタプログラムレベルでのエラーなど問題が発生したときはとても複雑な状況になります。また、高級な言語になるほどオブジェクトのライフサイクルが掴みにくく、これも複雑と思います。

Rustはコンパイラが静的にチェックしてくれる範囲が広く、実行時にエラーが出にくいように工夫されております。例えば、
 - 変数の値で暗黙のアップキャストが存在しないことで不用意な値の扱いによる動的エラーの抑止
 - 数値の結果がオーバーフローするとわかる時点でコンパイルエラーがでる
 - 変数束縛による不定値を使用したプログラムは記述できない
 - nullなし
 - 例外機構なし
など、あります。これは体験いただけたらわかると思います。同傾向として関数言語（Haskellはかじったことがあります）もそうかと思いますが、関数言語は再帰で表現する処理が多く、コードはシンプルですが処理自体はイメージしにくく困った記憶があります。

次に意外とC/C++のプログラム経験者にはメモリ管理がわかりやすいです。
 - スタック領域はスコープを抜けると開放
 - スコープを跨ぐにはライフタイムを指定（C/C++のスコープ外に宣言、ポインタ渡し）
 - もっと広いスコープではstatic指定（グローバル変数みたい）
と、近いイメージがあります。これはRustがシステム記述言語でありC/C++とターゲットが同じで、両者ともOSのメモリ管理を表現しているためでしょう。

Rustでプログラミングするとコードの実行されていくイメージが意外と掴みやすく、不思議と安心感があります。
Rustを使ってみませんか？
FRBの金利データをRSSから抜き出してみる-SQLite3との接続

　前回までの記事で、とりあえずFRBのRSSからデータを取得する工程は一段落した。
　そこで、今回はこのデータをDBに保存することで今後のデータ利用の幅を増やして行きたいと思う。
　また、更新が完了したところまでをGit-Hubにcommitした。

#作業
##データ構造の定義
　その前に、RDBのデータ構造を定義していきたい。
　今の所、データの形は次のようになっている。

```
date DATE,
FFRate FLOAT,
M1 FLOAT,
M3 FLOAT,
M6 FLOAT,
Y1 FLOAT,
Y2 FLOAT,
Y3 FLOAT,
Y5 FLOAT,
Y10 FLOAT,
Y20 FLOAT,
Y30 FLOAT
```
 最初はIDをふろうかと思ったが、最大でも一日に一回しかデータを取らないし、金融データは連番IDで検索をかけるよりも日付で検索がかけられたほうが便利なので、主キーは日付にした。
~~　また、データは分離したほうがいいかと思ったがまとめておいても特に差し障りがないため、以上の構造で問題ないだろう。~~
と、思っていたが、やはりデータは一つ一つ分離されていたほうが都合が良さそうだ。
#作業
##SQLiteによる実装
　さて、これをプログラムに落とし込むと、こうなった。なお、保存先は外付けHDDだ。

```python:database.py
import sqlite3 as sql
dbpath="H:\Data\yieldcurve.db"
conn=sql.connect(dbpath)

cur=conn.cursor()
""
cur.executescript('''
    CREATE TABLE IF NOT EXISTS yieldCurve(
           ID INTEGER PRIMARY KEY,
           date DATE,
           FFRate FLOAT,
           M1 FLOAT,
           M3 FLOAT,
           M6 FLOAT,
           Y1 FLOAT,
           Y2 FLOAT,
           Y3 FLOAT,
           Y5 FLOAT,
           Y10 FLOAT,
           Y20 FLOAT,
           Y30 FLOAT
     )
''')
""
conn.commit()
cur=conn.cursor()
data=['2018-06-06', 1.7, 1.76, 1.93, 2.08, 2.23, 2.4, 2.54, 2.68, 2.83, 2.91, 3.0]
cur.execute(
    "INSERT INTO yieldCurve(date,FFRate,M1,M3,M6,Y1,Y2,Y3,Y5,Y10,Y20,Y30) VALUES (?,?,?,?,?,?,?,?,?,?,?,?)",
    data)
conn.commit()
cur=conn.cursor()

cur.execute("SELECT * FROM yieldCurve")
list=cur.fetchall()
for i in list:
    print(i)
```
```text:output
(1, '2018-06-03', 1.7, 1.76, 1.93, 2.08, 2.23, 2.4, 2.54, 2.68, 2.83, 2.91, 3.0)
```
これでOKだろう。

##GitHubへの投稿
　せっかくなのでGitHubにも投稿してみた。
　VisualStudioをつかうとかなり簡単に投稿できる。

#まとめ
　これで、データベースを用いることができるようになり、今後データを活用する幅が広がった。
　ただ、今回は仮の保存先として外付けHDDを使ったが、毎日駆動することを考えると信頼性に乏しいように思える。今後クローラーとして動かしていくにあたっては、仮想サーバーの活用などが必要になってくるだろう。
~~　次は、今回作ったモジュールを活かしてデータの取得から保存までを行うクローラーを作っていきたい。~~
と思っていたが、先にデータベースに接続するモジュールを作ろうと思う。
http serverを立てたは良いが、Runningし続けるのを止められない

# このエントリの目的
- Golangで立てたHttp serverをどうにかしてストップさせる

# 環境
go1.10.3 windows/amd64
Windows10
VSCode 最新版(2018/06/16時点)

# http serverを立てた

```go:main.go
package main

import (
	"net/http"
)

func handler(w http.ResponseWriter, r *http.Request) {
	w.Write([]byte("http.ResponseWriter sample"))
}

func main() {
	http.HandleFunc("/", handler)
	http.ListenAndServe(":8080", nil)
}
```

localhost:8080にアクセスすると、`http.ResponseWriter sample`が表示される。
というものです。


# Code is already running!

VSCodeのpowershellを使って`go run`などをしていたのですが、
先程の`main.go`を実行したあとに、今度は別のまた学習用のコードを実行しようとしたら**Code is already running!**と怒られました。

統合ターミナルの「出力」を見ると、ずっとこの表示のまま。Doneがおこなわれず。
`[Running] go run "c:\Users\user\go\src\debug_sample\main.go"`

# お前を...殺す

サーバを立ち上げたのと、別ファイルが実行できないことの理由の紐づけができず、結局http serverをkillすることになりました。

▽参考
[golang で HTTP Server を停止する方法](https://qiita.com/ww24/items/7c7863421a1a538c7bc3)


## PowerShellからprocessを探したり止めたり

**現在立ち上がってるプロセス一覧を見る**
`PS C:\Users\user\go> ps`

**プロセスIDを使って殺す(http serverを)**
`PS C:\Users\user\go> Stop-Process -ID 0000`

**本当に死んだか？(http serverが)**
`PS C:\Users\user\go> Get-Process -Name httpserver`

ひとまず、http serverを止めることができた。

# 勉強すべきことが出来た
- コード上で立ち上げたサーバを、コード上で止める方法
- なぜ、`http.ListenAndServe`は他の処理を邪魔するのか
API GatewayでプライベートAPIを作成する

## はじめに
Amazon API Gateway でプライベートなAPIを作成できるようになりました。
https://aws.amazon.com/jp/about-aws/whats-new/2018/06/api-gateway-supports-private-apis/

こちらを試してみたいと思います。

## VPCエンドポイントの作成
ローカルAPIへの接続には PriavateLink によるインターフェースVPCエンドポイントを使用します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/125105/c7070655-ac99-9441-ec8e-0f09e3bfc654.png)
https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/apigateway-private-apis.html

VPC コンソールから エンドポイントの作成へ進み、サービス名の選択で、
**com.amazonaws.ap-northeast-1.execute-api** を選択します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/125105/39ee8bc3-c366-419d-3eac-6186464db09f.png)

VPC, subnet, セキュリティグループ はそれぞれ任意のものを指定し、エンドポイントの作成を行います。
セキュリティグループ では 443 のインバウンドを許可する必要があります。
プライベートDNS名を有効にする にチェックを入れると
「execue-api.ap-northeast-1.amazonaws.com」のVPC内のルックアップが、
作成するエンドポイントのIPアドレスに解決されます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/125105/4a9a09d4-874a-4761-30ff-3665f0abf558.png)

## プライベートAPIの作成
API Gateway コンソールから新しい API を作成します。
ここでは APIの例 を使用します。
エンドポイントタイプでプライベートを選択します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/125105/73536eed-3c0f-40b7-5522-dbd6aee97dd0.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/125105/ef3d75c1-3032-0695-e610-5be7462072fd.png)

作成したAPI（例を使用した場合はPetStore）に以下のようなリソースポリシーを設定します。
{{vpceID}} に作成したVPCエンドポイントのIDを指定します。

```policy.json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": "*",
            "Action": "execute-api:Invoke",
            "Resource": [
                "execute-api:/*"
            ],
            "Condition" : {
                "StringEquals": {
                    "aws:sourceVpce": "{{vpceID}}"
                }
            }
        }
    ]
}
```

リソースポリシーを設定したらAPIをデプロイします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/125105/06b03a84-cdc5-938f-2f0e-49f4667537ec.png)

プライベートAPIの場合、ステージエディター上で、呼び出し用のURLは表示されません。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/125105/34d6d4be-deb4-4c15-c1a4-d350f38e5d4e.png)

## プライベートAPIの呼び出し

プライベートDNSを使用する場合、API は以下の形式で呼び出すことができます。

```
https://{restapi-id}.execute-api.{region}.amazonaws.com/{stage}
```

```bash
$ curl https://{restapi-id}.execute-api.ap-northeast-1.amazonaws.com/dev/pets/1
{
  "id": 1,
  "type": "dog",
  "price": 249.99
}
```
DirectConnet経由で接続する場合等は、プライベートDNSを使用できないため、
以下のようにパブリックDNSでAPIを呼び出します。
Hostヘッダで {restapi-id}を含めてリクエストします。

```bash
$ curl https://vpce-XXXXXXXXXXXXXXXXX-XXXXXXXX.execute-api.ap-northeast-1.vpce.amazonaws.com/dev/pets/2 -H'Host:{restapi-id}.execute-api.ap-northeast-1.amazonaws.com'
{
  "id": 2,
  "type": "cat",
  "price": 124.99
}
```

## 参考:既存APIのエンドポイントタイプ変更
コンソールのAPIリストで歯車ボタンを押すと、作成済みのAPIのエンドポイントタイプを変換できます。
既存のRegional API、Edge Optimized APIをプライベートAPIに変換できます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/125105/50b935e3-9c09-7d5c-af8d-5c6df1427f25.png)

プライベートAPIは Regional APIに変換できますが、Edge Optimized APIに変換できないので注意が必要です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/125105/718d4158-17a1-3640-b3d3-dc8f3face052.png)



以上です。
参考になれば幸いです。
google日本語入力でIME変換をカスタマイズする

# 概要
IMEのプロパティを編集して，任意のキー操作からIME変換ができるようにする．
自分はUnixとwindowsを併用しているので，OS間のキー操作を統一できて楽になる．

# 方法
「コントロールパネル」 ｰ> 「キーボードまたは入力方法の変更」 ｰ> 「キーボードの変更」
「IMEを右クリック」 ｰ> 「プロパティ」
「キー設定の選択」 ｰ> 「カスタム」

以下のように登録する．今回は「Shift Space」でIMEを変更している．

| モード | 入力キー | コマンド |
|:-----------:|:------------:|:------------:|
| 入力文字なし | Shift Spase | IMEを無効化 |
| 直接入力 | Shift Spase | IMEを有効化 |

また他の登録キーと重複している場合に注意すること．
意図しない動作になることがある．
入力キーでソートして重複を確認しておく．


# 参考
[Google日本語入力（IME）の切り替えキーを変更する方法 [Windows7]](http://nagoya-neko.com/google-nyuryoku-ime/)
Blender FBXエクスポート設定 備忘録

## 自分用メモ
Twitterに貼ろうと思ったけど、埋もれていくのでこっちに書いておく。
Blender2.79の話なので2.8系使っている人に有用な情報はない・・・（かな？）

## Unityで使うことを想定
インポートのリグ設定はHumanoid。
アニメーションは複数モーションを1ファイル内に含めた形式。
作りかけのモーションとかはインポート先で削除可能。

# エクスポート前にやること
リグにカスタムシェイプ使っていたらそれも出力されるので先に削除。
分割されているメッシュは適切に統合（顔＋髪＋体みたいな感じに）

## 設定詳細

![2018-06-16_23h11_41.png](https://qiita-image-store.s3.amazonaws.com/0/54312/5f2721ab-878c-775a-b46a-4281f3e7f383.png)

- スケールをすべてFBXに設定（意味は理解していないがこうしないとおかしくなる）
- アーマチュアとメッシュを選択。
- タンジェント空間はインポートする時の設定による（UnityでNormal&TangentをImport設定するなら必要）
- デフォームボーンのみ
- アニメーションはベイク済み
（補完方法がBlenderと一致するかわからないのでベイクした方が確実）


あと、なんかあったら随時書き足す予定。

**すべてFBXの意味を誰か教えて。**
Bundlerでインストールしたライブラリを使う小さなメモ

# 前提

- 環境は以下記事と同じ
	- Bundlerでgemライブラリをインストール・アンインストールする小さなメモ - Qiita https://qiita.com/kure/items/6fe0ebcd1fe3a361fc65
- コマンドラインの確認用のライブラリで `whenever` を使用

# Bundlerでインストールしたライブラリの使い方

## コマンドラインの場合

### インストール

```zsh
% vim Gemfile
gem "whenever" ★ 追記
% bundle install
% bundle list ★ Bundlerでインストールしたライブラリを確認可能
```

### 使い方

`bundle exec [コマンド]`
とする

```zsh
% whenever 
zsh: command not found: whenever ★普通のコマンドラインからは参照できない
% bundle exec whenever
[fail] Can't find file: config/schedule.rb
```

## Rubyプログラムの場合


```ruby
require "bundler"
Bundler.require
```

を記載する。
Gemfileから記載されているgemパッケージを自動でrequireする

# 参考

<div class="amazlet-box" style="margin-bottom:0px;"><div class="amazlet-image" style="float:left;margin:0px 12px 1px 0px;"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4774189774/kuredev-22/ref=nosim/" name="amazletlink" target="_blank"><img src="https://images-fe.ssl-images-amazon.com/images/I/51sWgspkfML._SL160_.jpg" alt="改訂2版 パーフェクトRuby" style="border: none;" /></a></div><div class="amazlet-info" style="line-height:120%; margin-bottom: 10px"><div class="amazlet-name" style="margin-bottom:10px;line-height:120%"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4774189774/kuredev-22/ref=nosim/" name="amazletlink" target="_blank">改訂2版 パーフェクトRuby</a></div><div class="amazlet-detail">Rubyサポーターズ <br />技術評論社 <br />売り上げランキング: 105,511<br /></div><div class="amazlet-sub-info" style="float: left;"><div class="amazlet-link" style="margin-top: 5px"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4774189774/kuredev-22/ref=nosim/" name="amazletlink" target="_blank">Amazon.co.jpで詳細を見る</a></div></div></div><div class="amazlet-footer" style="clear: left"></div></div>
Chainer 4.0 + iDeep がすごい

Chainer 4.0 + iDeepで簡単にパフォーマンス測定をしたところ、なかなかすごかったので、メモです。

せっかくなので、Google Cloud Platform(GCP)のAlway freeのインスタンス、[f1-micro](https://cloud.google.com/free/docs/always-free-usage-limits#compute_name)で動かしてみて、パフォーマンスを比較してみました。（安いインスタンスでも速くなるというのを確認したかったので）

参考：
[pip で MKL にリンクされた numpy, scipy が自動的にインストールされるようにする](https://qiita.com/grafi/items/3f24b514d46c41cc9c58)
[iDeep を使ってCPUでのChainerの推論速度をアップしよう](https://qiita.com/SatoshiTerasaki/items/c0a5a25b8bb82e95371b)

# インストール方法

以下、Ubuntu 17.10 に入れています。

0. https://software.intel.com/en-us/mkl から、"Intel Math Kernel Library"をダウンロード
1. 既存の chainer、numpy をアンインストールします `$ sudo pip3 uninstall chainer numpy`
2. MKLに必要なものをインストール `$ apt install -qq cpio g++`
3. `$ tar xvzf downloads/l_mkl_2018.3.222.tgz && cd l_mkl_2018.3.222 && sudo ./install.sh` 画面に従いインストール
4. `$ export LD_LIBRARY_PATH="/opt/intel/mkl/lib/intel64:/opt/intel/lib/intel64:$LD_LIBRARY_PATH"` (必要ならば、~/.bashrc などに書く)
5. [pip で MKL にリンクされた numpy, scipy が自動的にインストールされるようにする](https://qiita.com/grafi/items/3f24b514d46c41cc9c58)を参考に ~/.numpy-site.cfg と ~/.config/pip/pip.conf を作成
6. `$ pip3 install ideep4py` (このとき、numpy がコンパイルされるため、時間がかかります)
7. `$ pip3 install chainer`

上記でインストールできました。

# 評価

[iDeep を使ってCPUでのChainerの推論速度をアップしよう](https://qiita.com/SatoshiTerasaki/items/c0a5a25b8bb82e95371b)の方法で速度比較してみます。

```
$ git clone https://github.com/terasakisatoshi/chainer-caltech-101.git
$ cd chainer-imagenet
$ wget http://www.vision.caltech.edu/Image_Datasets/Caltech101/101_ObjectCategories.tar.gz
$ tar xvzf 101_ObjectCategories.tar.gz
$ python reshape.py --source_dir 101_ObjectCategories --target_dir reshaped
$ python3 create_dataset.py reshaped
$ python3 compute_mean.py train.txt
$ python3 train.py train.txt test.txt -a googlenet -E 50 -g 0 -j 8
$ pip3 install imageio
```

学習をすると時間がかかるので、以下に[学習済みモデルを置いておきました。](https://gist.github.com/ikeyasu/5e834ba10527b4eec22c16857ded45e7)

```
$ wget https://gist.github.com/ikeyasu/5e834ba10527b4eec22c16857ded45e7/raw/fa5edcfd5b9b6a1d8f50fed9dbfadada52853794/model_epoch_46.npz
$ mkdir result
$ mv model_epoch_46.npz result/
```

以下で推論できます。これで、時間を比較してみます。

```
$ time python3  predict.py
```

## iDeep(mkl)無しの場合

```
real 1m59.391s
user 1m55.688s
sys 0m0.926s
```

約2分かかっています

## iDeep(mkl)有りの場合

```
real 0m19.911s
user 0m12.775s
sys 0m0.529s
```

なんと20秒で済みました。

# Chainer での iDeep の使い方

https://docs.chainer.org/en/latest/tips.html#how-do-i-accelerate-my-model-using-ideep-on-intel-cpu に書いてありますが、iDeepを使うには、

```
chainer.using_config('use_ideep', 'auto')
```
の設定をして、ロードしたモデルに対して、

```
model.to_intel64() 
```
　
を呼ぶ必要があります。

use_ideepは、環境変数で

```
export CHAINER_USE_IDEEP="auto"
```

としても設定できます。

# まとめ

Chainer 4.0 + iDeep を使う事で、Intel CPU で推論を簡単に速くできます。
GCPの f1-micro のような非力なインスタンスでも、その効果は絶大でした。

また、GPUと違い、データ転送のオーバーヘッドも無いため、とても使いやすいように思います。
Mac Magic Mouse 不具合と解決策

# MacのマウスMagic Mouseについて自分が経験した不具合と解決策

## 環境
Mac: MacBook Pro (Retina, 13-inch, Early 2015)
Mouse: Magic Mouse

## ページスワイプができない、中途半端なところまでしか動かない
#### 不具合
ページスワイプを1本指左右スクロールで設定
１本指でスワイプし、ページがぬるっと動くものの中途半端な部分までしか動かない。完全にページ移動することができない。

#### 解決策
PRAMリセットで解決
再起動時にリンゴマークが表示され前に
```
Command + Option + P + R
```
を長押し。
ジャーンと起動音が３回鳴るまで、押下

以上
esp32-arduinoでJavaScript(duktape)を使う

# 概要 
duktape( http://duktape.org/ ) というのをつかうとJavaScriptが解釈できるということで、esp32-arduino環境で動作する方法を調べてみました。

ArduinoIDEではなく、platformioを使います。

# duktapeの設定

いろいろ設定ができるようだが、とりあえず無指定でいく

```
$ git clone -b v2.2.1 https://github.com/svaarala/duktape.git
$ cd duktape
$ python tools/configure.py \
    --source-directory src-input \
    --output-directory src-custom \
    --config-metadata config
```

src-custom/に

- duk_config.h
- duk_source_meta.json
- duktape.c
- duktape.h

が出力されています

これらをincludeするだけでduktapeを使うことができます。

# platformio環境の設定

ディレクトリ構成

- lib/
  - duktape/
     - duk_config.h
     - duktape.c
     - duktape.h
     - duk_source_meta.json (別にいらなそうだけど置いておく)
- src/
  - main.ino
- platformio.ini

```platformio.ini
[env:esp32]
platform = espressif32
board = esp32dev
framework = arduino
upload_speed = 921600
lib_deps =
board_f_cpu = 240000000L
board_f_flash = 80000000L
```

# main.ino

```c
#include "duk_config.h"
#include "duktape.h"

duk_context *ctx;

static duk_ret_t native_print(duk_context *ctx) {
    duk_push_string(ctx, " "); //joinに使う区切り文字
    duk_insert(ctx, 0); //スタックの先頭に移動
    duk_join(ctx, duk_get_top(ctx) - 1); // スタックにある個数を数えて結合
    printf("%s\n", duk_to_string(ctx, -1)); //printfでシリアル出力
    return 0; // 戻り値なし
}

void setup(){
  // コンテキストの作成
  ctx = duk_create_heap_default();
  if (!ctx) { exit(1); }

  // グローバルオブジェクトの登録
  duk_push_global_object(ctx);
  // C言語の関数を登録
  duk_push_c_function(ctx, native_print, DUK_VARARGS); // 可変引数関数native_print
  duk_put_prop_string(ctx, -2, "print"); // -2(global)に global["print"] = native_printみたいなことをする

  // JavaScript文字列を評価する
  duk_push_string(ctx, "function test(){for(var i = 0; i < 10; i ++){print(i,\"hoge\")}}");
  if(duk_peval(ctx)!=0){
    Serial.println("Error");
    Serial.println(duk_safe_to_string(ctx, -1));
  }
  duk_pop(ctx); // 結果を捨てる

  // JavaScript関数を呼ぶ
  duk_get_prop_string(ctx, -1, "test");
  if (duk_pcall(ctx, 0) != 0) {
      printf("Error: %s\n", duk_safe_to_string(ctx, -1));
  }
  duk_pop(ctx);  // 戻り値を捨てる

  // コンテキストを破棄する
  duk_destroy_heap(ctx);
}

void loop(){

}
```

これで

```
$ platformio run --target upload
```

などするとesp32に書き込みできます

実行ログは下記のようにしてみることができます

```
$ platformio.exe device monitor -b115200
--- Miniterm on COM10  115200,8,N,1 ---
--- Quit: Ctrl+C | Menu: Ctrl+T | Help: Ctrl+T followed by Ctrl+H ---
ets Jun  8 2016 00:22:57
(略)
0 hoge
1 hoge
2 hoge
3 hoge
4 hoge
5 hoge
6 hoge
7 hoge
8 hoge
9 hoge
```

# まとめ

ESP32でJavaScriptを動かすことができました。
これを使うとWeb経由でJavaScriptを受け取って、動作を変えるなど面白いことができそうです。

duktapeはドキュメントも読みやすく使いやすいと思いました。
isMountedの警告を消す方法

# isMountedについて
ES6の時点で`isMounted`は廃止されているらしく、Reactのバージョンによっては`isMounted`を使用していないときでも`Warning: isMounted(...)is deprecated...`という警告が出現する場合がある。無視またはdismissすれば良いのだがフッタータブを作っていると毎回警告を消さないとタブをタップできずイライラするので消す方法を残しておく。
`App.js`や`index.js`などで、

```javascript:
import { YellowBox } from 'react-native';
YellowBox.ignoreWarnings(['Warning: isMounted(...) is deprecated', 'Module RCTImageLoader']);
```

とやると消せるはず。`Module RCTImageLoader`の部分は無くてもいけるかもしれない。
LaravelのViewにBootstrapを導入する

何か特別な書き方が必要なのかと思っていたけども、
CDNを使うパターンなら通常通りviewsのファイルをいじるだけでOKだった。

```index.php
<head>
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css">
</head>
<body>
    <!-- jqueryの読み込み -->
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
    <!-- BootstrapのJS読み込み -->
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.1.1/js/bootstrap.min.js"></script>
</body>
```

ファイルを落としてきて対応する形だとまた別の実装になるらしい。
毎度viewファイルに書くのは手間なので、テンプレなりフレームワークなりに読み込み処理を移す方法も探したい。
CocoaPodsにまだ登録されてないライブラリをアップデート


cocoapodsにあるpjsipは、2.6だが、Githubには2.7.1が既にあるので、そっちを使いたい。

https://github.com/chebur/pjsip


Podfileに以下の記述でOK。

```
  pod 'pjsip', :git => 'https://github.com/chebur/pjsip.git'

```

自分でspecをつくって行う方法もあるけど、この方法で大丈夫だった。

参考：
http://please-sleep.cou929.nu/specify-external-module-in-podfile.html
土日にやった事をメモる記事(自分用)

#**[目的]**
勉強をしている証拠を見せる為。
アウトプットによる情報のまとめ

土日にやったことをただ書いていくだけです（自分用の振り返り)
メモですのでほとんど有益な情報はありません。
この情報間違っているよ等の情報やアドバイスは是非お願いします

#**[日付]**
2018/06/16
2018/06/17

#**[土曜にやったこと]**
Unityのボールを転がすチュートリアルをだらだらと完成まで作成。
#**[日曜にやったこと]**
LiVe2Dによるモデリングおよびアニメーションの作成

#**[作った物をのせたgithubのURL]**
Unity https://github.com/takumi-otsuka/Unity-tutorial.git
Live2D https://github.com/takumi-otsuka/Live2D

#**[参考にした記事]**
Unity http://baba-s.hatenablog.com/entry/roll-ball-tutorial
Live2D http://hatyati.jp/live2d-cubism3-tutorial/
       
http://www.live2d.com/usermanual/cubism2_cn/beginner-tutorial/08/beginner-tutorial/06.html

#**[学んだ事とか]**
Unityは3D、2D両方作れる
スクリプト(オブジェクトの回転とかボールがあたったときの処理とか)はC#で書く
日本語による情報が豊富

Live2Dは平面画像を簡単に言うと3D化してモーションやモデリングができるようになる。
ゲームエンジニアとしては素材を作る方の立ち位置で使う。

#**[メモ]**
Unreal EngineはC++で動かす
Unityの方が簡単らしい。
Unreal EngineはUnityより高度な技術の人が使うものらしい。

Live2Dは簡単なものはキーを加えて1から2,2から3と変化させてモーションをつける
（キーを沢山つければより細かく描写できるがキーによる変化の管理が複雑に）

デフォーマは全体を動かす処理に使う。
(顔の向きや体の向き。大きいパーツの中に細かいパーツが入っているときなど)
デフォーマをメインとして作成するみたいなので
本格的に覚える際は細かく分ける事を意識して
1つのデフォーマに管理するキーを減らして、
効率よく作成するようにする。
便利な正規表現


# 内容
仕事でよく使う正規表現パターンを記載しておく。
サクラエディタで確認済み

# 日付(YYYY-MM-DD HH:MM:SS)
`[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}`

# 特定文字を含まない行(例ではAAA)
`^(?!.*(AAA)).*$`

# YYYY-MM-DD⇒YYYY/MM/DD変換
置換前：`([0-9]{4})-([0-9]{2})-([0-9]{2}) [0-9]{2}:[0-9]{2}:[0-9]{2}`
置換後：`$1/$2/$3`

# 全角文字検索
[\x{007F}-\x{7777}]
16進数で指定する

# キャメルケース⇒スネークケース
①大文字の直前に、\_を挿入
　置換前：`[A-Z]`
　置換後：`\_$&`
②大文字変換
　置換前：`(.)`
　置換後：`\u\1`

# スネークケース⇒キャメルケース
①小文字変換
　置換前：`(.)`
　置換後：`\l\1`
②"_"の直後の文字を大文字変換
　置換前：`\_(.)`
　置換後：`\u\1`

二度の置換を行うのは面倒なので,一度の置換で行うなら
　置換前：`([A-Z])|_([A-Z])`
　置換後：`\l\1\u\2`

# フルパスからファイル名を取り出す

` (?<=/)(?!.*/).*`


# JAVA関連
### getter,setter
javaを書いているとき
getter,setterを別の変数に設定するのが面倒なので

以下のフィールドを別の変数に設定するとき等

```
private String kanriNo;

private String kanriStr;
```

置換前：(^.* )(.)(.*);$
置換後：data.set\u\2\3(list.get\u\2\3());

```
data.setKanriNo(list.getKanriNo());

data.setKanriStr(list.getKanriStr());
```

### Javaクラス内のフィールドをコメント付きで設定
```
/** コード */
private String code;

/** ラベル */
private String lavel;

/** 値 */
private BigDecimal value
```
わざわざ正規表現でやる必要もないんだけど
①改行を排除(改行またぎができればいいんだけど)
 置換前:$\r\n
 置換後:@@@
②変換
 置換前:`/\*{2} (.*?)\*/@@@private \S* (\S*);`
 置換後:`set\u\2() // \1`
③@@@を改行コードに変換
 置換前：@@@
 置換後:\r\n

```
setCode() // コード 

setLavel() // ラベル 

setValue() // 値 
```

### 実数をBigDecimal変換


　置換前:`\d+(\.\d+|)`
　置換後:`new BigDecimal("$&")`

# HTML関連

### idを追加

javaのjsfをやっていてID名を設定したフィールド名と同じにしたい。


```

<h:inputText style="width : 30px" value="#{r.data.testData}" />

<h:inputText style="width : 30px" value="#{r.data.value}" />

<h:inputText style="width : 30px" value="#{r.data.label}" />
```

 置換前：`(value="#{)(.*\.)(\w+)(}")(.*$)`
 置換後：`\1\2\3\4 id="\3" \5`

実行後

```

<h:inputText style="width : 30px" value="#{r.data.testData}" id="testData"  />

<h:inputText style="width : 30px" value="#{r.data.value}" id="value"  />

<h:inputText style="width : 30px" value="#{r.data.label}" id="label"  />
```

もっとスマートにやりたいな

### idを修正

IDを記載したけど修正するのが面倒なときは、置換すればよいじゃないか

```

<h:inputText style="width : 30px" value="#{r.data.testData}" id="djaojojo" />

<h:inputText style="width : 30px" value="#{r.data.value}" id="dfjaojfoijo" />

<h:inputText style="width : 30px" value="#{r.data.label}" id="dddddddddd" />
```

 置換前：`(value="#{)(.*\.)(\w+)(}")(.)(id="\w+")(.*$)`
 置換後：`\1\2\3\4\5id="\3"\7`
ruflin/ElasticaにContent-Type: application/jsonを設定

# 現象
Elasticaを利用してElasticsearchにドキュメントを突っ込むと以下が出力される

```
Content-Type header [application/x-www-form-urlencoded] is not supported
```

# 解決方法
単にContent-Typeをapplication/jsonで指定すれば良い。
Elastica/Transport/Httpに以下の処理を追加する。

```php:Http.php
        $headers = [];
        // 以下の行を追加
        $headers[] = 'Content-Type: application/json';
```

# 環境
cakephp:3.6.4
cakephp/elastic-search:@stable(バージョン幾つか不明。たぶん1.0)

そもそも[公式ドキュメント](https://book.cakephp.org/3.0/ja/elasticsearch.html)にある方法に倣っただけだが、
cakephp/elastic-searchの@stableバージョンが依存しているruflin/Elasticaが古い？
ただ、cakephp/elastic-searchの2.0-RC1を使うともっとおかしなことになるので、暫定対処として残します。
[Heroku]独自ドメインのRailsアプリを必要最小限のコストで運用する方法

2018/08/02追記--------------
zohoのメールサーバーが2018年7月ごろに不調になったのか、メールが届きづらいことが増えたため、zoho→お名前メールにメールサーバーを移管しました。
----------------------------　

少しサービスを作り込んでいくと、「独自ドメイン欲しい…！」ってなりますよね。
案外、独自ドメインでの運用についてまとめている記事が見つからなかったのでまとめてみました。

すごくざっくりした図ですが、[LiveDeli](https://www.livedeli.com/)はこのような形で運用しています。
恐らく、最小限のコストでなんとかなってるかなと。
(「もっといい方法あるよ！」って方はぜひ教えてください。)
![プレゼンテーション1.jpg](https://qiita-image-store.s3.amazonaws.com/0/157554/7628a95b-d78d-58c3-590a-75c6a21ea486.jpeg)

# SSL証明書
## [Let's Encrypt](https://www.sslbox.jp/service/service_lets_encrypt_index.php)
3ヶ月ごろの更新が必須ですが、無料で使えるSSL証明書です。
SSL証明もDozensとHerokuを使えばそれほど手間でもないので、一旦こちらで運用しています。

# DNS
## [Dozens](https://dozens.jp/)
直感的に使えるDNSです。
無料で使う範囲では、特に困ってるところは今の所ありません。

# サーバー
## [Heroku](https://jp.heroku.com/)
「サーバー」といってしまっていいのかはわかりませんが、言わずと知れたHerokuをメインとして使っています。
独自ドメインでの運用はHobbyプラン($7/月)からしかできませんので、注意してください。

## [Cloudinary](https://cloudinary.com/)
Herokuのアドオンとして使っています。
画像を扱う場合は必要みたいです。(よくわかってませんが、調べたらなんぼでも出てきます)

## [Heroku Postgres](https://elements.heroku.com/addons/heroku-postgresql)
こちらもHerokuのアドオンです。
railsアプリでpostgresqlを扱う場合、一般的かと思います。

# メールサーバー
## [zoho](https://www.zoho.com/jp/mail/)
独自ドメインのメールサーバーで無料のものといえばzohoですね。
少し使いにくかったり、メールが届くのが遅かったりするので、そのうち変えようと思いますが、無料で使えるということでかれこれ1年半ほどこちらを使っています。

##[gmail](https://mail.google.com/mail/u/0/#inbox)
zohoだと、2段階認証が必要だったり使い方がちょっとよくわからなかったりだったので、アプリケーションからのメール送信にはgmailのSMTPサーバーを使っています。
gmailへの設定は、割と簡単にできた記憶があります。

# まとめ
Let's Encryptの更新タイミングだったので、ふと思い立って書いてみました。
簡単な紹介しかできませんでしたが、誰かのお役に立てば幸いです。
Windowsヘルプファイル(*.chm)の内容が表示出来ない場合の対処

最近では見かけなくなった絶滅危惧種のWindowsヘルプファイル(*.chm / Microsoft Compiled HTML Help)ですが、セキュリティ上の懸念でWindows10等では内容が表示されない場合があります。

そんな場合は下記のように、ファイルのプロパティを表示してセキュリティの許可をすることで表示が出来るようになります。

||
|:--|
|<img width="385" alt="ヘルプファイルが表示出来ない場合.png" src="https://qiita-image-store.s3.amazonaws.com/0/165884/afd4f6d0-63e3-7a24-a425-e94fdd4f401c.png">|

過去遺産の調査が必要になった場合に知っていると役に立つかもしれません。
忘れた時の python ファイル読み書き

#忘れた時の python ファイル読み書き
よく自分が忘れるので、自分が使うようのメモとして書いてます。
環境:python3.x

##読み込み

```
# coding: utf-8

file_name = "./tmp.txt"

#テキストファイルを全てディスクからメモリに一度で読み出すときの読み込み
with open(file_name, "r") as f:    #　txt形式の読み込み
    data = f.read()                # ひとまとまりのデータとして読み込む
 
data = data.split("\n")            #　改行コードで1行ずつに分割
print(data)                        #　'あきのたの...　と100行分表示
print(len(data))                   #　100

#テキストファイルをディスクから一行ずつメモリに読み出すとき(ご指摘いただいたので追記)
with open(file_name) as f:
    for line in f:
        print(line)

```


##書き込み


```
# coding: utf-8

file_name = "./tmp.txt"

#テキストファイルへの書き込み（上書き）
text = "\n".join(data)             # 改行コードでつなぐ
with open(file_name, "w") as f:    # w:上書きモード
    f.write(text)  

```
Google Compute Engine(GEC) 上に Google Colaboratory の ローカルランタイムを作成する

この記事は、[AWS EC2 上に Google Colaboratory の ローカルランタイムを作成する](https://qiita.com/ikeyasu/items/30f17d2ca01239b486de)と同じ事をGoogle Cloud Platform(GCP)で行う記事です。

GCPには、NVIDIAの公式イメージがあるのでそれを使います。
また、GPUを使うために申請が必要なので、その日のうちに使いはじめることはできません。

0. https://cloud.google.com/sdk/ を参考に、Google Cloud SDKをインストール
0. `$ gcloud auth login` を実行し、ログインしておく
1. https://ngc.nvidia.com にサインアップ
2. https://ngc.nvidia.com/configuration/api-key でAPIキーを作成（後で使うのでメモっておく）
3. https://console.cloud.google.com/ を開く
4. 上部のプロジェクトの選択 [![https://gyazo.com/457446e136220a77f17f5dafe98df46d](https://i.gyazo.com/457446e136220a77f17f5dafe98df46d.png)](https://gyazo.com/457446e136220a77f17f5dafe98df46d) で▼を押し、今回使うプロジェクトを選択、または新規作成
5. [quotaのページ](https://console.cloud.google.com/iam-admin/quotas?project=colab-local-1&folder&organizationId&service=compute.googleapis.com&metric=NVIDIA%20K80%20GPUs) か利用するZONEにチェックを入れる（例によって、usのZONEの方が料金が安いです）
6. 上部の「割り当てを編集」をクリック
7. 電話番号を入れ、次へをクリック
8. 新しい割り当て上限を入力。とりあえず、1にする
9. リクエストの説明は、"For machine learning"で十分。（たぶん数が少ない場合は）
10. 申請が通るのを待つ。。。
11. Cloud Launcher の [NVIDIA GPU Cloud Image](https://console.cloud.google.com/launcher/details/nvidia-ngc-public/nvidia_gpu_cloud_image)のページを開く
12. COMPUTE ENGINE 上で起動、をクリック
13. ZONEから、申請の通ったZONEを選ぶ
14. GPUの下にある、"Did you check for GPU quota?"のテキストボックスにYESと入力
14. 必要なら、CPU、メモリー、ストレージなどを選ぶ
15. デプロイをクリック
16. デプロイが完了するのを待つ
17. [VMインスタンス](https://console.cloud.google.com/compute/instances)のコンソールを開き、gcloudコマンドを表示をクリックし、gcloudコマンドをコピー
    * [![https://gyazo.com/e0fd368717d8fdb84baa18e2b1a2d7dd](https://i.gyazo.com/e0fd368717d8fdb84baa18e2b1a2d7dd.png)](https://gyazo.com/e0fd368717d8fdb84baa18e2b1a2d7dd)
18. `$ gcloud compute --project "colab-local-1" ssh --zone "us-west1-b" "nvidia-ngc-image-1-vm"` のようなコマンドがコピーされるので、ターミナルに貼り付け、末尾に` --  -L 8081:localhost:8081`を追加
    * 例） `$ gcloud compute --project "colab-local-1" ssh --zone "us-west1-b" "nvidia-ngc-image-1-vm" --  -L 8081:localhost:8081`
19. つながると、"Please enter your NGC APIkey to login to the NGC Registry:"と聞かれるので、 https://ngc.nvidia.com/configuration/api-key で作成したAPIキーを貼り付け
20. `$ screen` でGNU Screenを起動
21. docker で cloab のローカルインスタンスを起動

```
$ docker run --runtime=nvidia -it --rm -p 8081:8081 --cap-add SYS_ADMIN --device /dev/fuse \
             --security-opt apparmor=unconfined ikeyasu/colab-local:latest
```
ubuntu 18 on Centos 6 KVM(忘備録) 


#完成図
とりあえず、ubuntuの初期設定のため、default networkへの接続は残す
![image.png](https://qiita-image-store.s3.amazonaws.com/0/132165/5abf149a-25a2-ec43-4017-3412c1632742.png)


#事前準備

vlanモジュール確認、なければロード

```console:console
lsmod | grep 8021q # 802.1q が利用可能か確認
modprobe 8021q # 802.1q が利用可能か確認
```
IP forward有効化

```vim:/etc/sysctl.conf 
# Controls IP packet forwarding
net.ipv4.ip_forward = 1 
```
KVMインストール

```console
# yum groupinstall "Virtualization Client" "Virtualization Platform" "Virtualization Tools"
```

#ホスト側インターフェース作成

ブリッジインターフェース作成

```vim:/etc/sysconfig/network-scripts/ifcfg-br10 
DEVICE=br10
BOOTPROTO=none
ONBOOT=yes
TYPE=Bridge
```

Vlanインターフェース作成

```vim:/etc/sysconfig/network-scripts/ifcfg-eth1.10
DEVICE=eth1.10
ONBOOT=yes
BOOTPROTO=none
BRIDGE=br10
```
# Ubuntu18のインストール

```console:console
virt-install --connect=qemu:///system --debug \
--name=ubuntu18 \
--vcpus=1 \
--ram=1024 \
--accelerate \
--hvm \
--disk path=/var/lib/libvirt/images/ubuntu18.img,size=20,format=qcow2 \
--location='http://us.archive.ubuntu.com/ubuntu/dists/bionic/main/installer-amd64/' \
--nographics \
--extra-args='console=tty0 console=ttyS0,115200n8'
```
- locationは任意のdistributionのnetwork install のURLを指定
- Intallerがproxyを聞いてきたら適切に指定
 - 例: http://[proxy address]:[proxy port]


# ubuntuへインターフェース追加
```console:Interface追加
# virsh edit　ubuntu18
    <interface type='bridge'>
      <mac address='52:54:00:00:00:01'/>
      <source bridge='br10'/>
      <model type='virtio'/>
    </interface>
# virsh destroy ubuntu18
# virsh define ubuntu18
# virsh start ubuntu18
```
Docker(docker-compose)で構築したConcourse CI環境の中に入って確認するとき用のコマンド集

[Docker(docker-compose)で構築したConcourse CI環境](https://qiita.com/cacarrot/items/a16e1ad9becfb9210303)の中に入って確認するとき用のコマンド集。

### Webコンテナ
```sh:Dockerコンテナログイン
docker exec -u root -it concourse-docker_concourse-web_1 /bin/bash
```

### Workerコンテナ
```sh:Dockerコンテナログイン
docker exec -u root -it concourse-docker_concourse-worker_1 /bin/bash
```

### DBコンテナ
```sh:Dockerコンテナログイン
docker exec -u postgres -it concourse-docker_concourse-db_1 /bin/bash
```

```sh:PostgreSQLログイン
./usr/lib/postgresql/10/bin/psql -h 127.0.0.1 -U concourse_user -d concourse
```

```sql:PostgreSQLのよく使うコマンド集
-- テーブル一覧
\d

-- 現在実行されているSQL
SELECT * FROM pg_stat_activity;

-- 実行計画
EXPLAIN ANALYZE sql;

-- 終了
\q
```

```sh:PostgreSQL設定ファイル
cat /database/postgresql.conf | grep -E 'listen_address|port'
```
.htaccessでのhttp://〜 → https://〜へのリダイレクト

.htaccessにおいて、
http://〜 → https://〜へのリダイレクトする記述です。

```
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTPS} !=on [NC]
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
</IfModule>
```
KotlinでFragmentからActivityへのコールバックでのスマートキャストについて

# はじめに

既存のAndroidアプリをJavaからKotlinへの移行中に、FragmentにListener(interface)を実装し、UI操作がされたタイミングでイベントを呼ぶコードを書く際にハマったのでその時のメモ。

# 環境
- AndroidStudio: 3.0.1
- Kotlin: 1.2.10

# しようとしていたこと

Fragment側でActivityから呼ぶ Listenerを定義し、onAttachメソッドが呼ばれた時に引数のcontextがinterfaceを実装していたらcontextをListenerにキャストし、ボタンを押されたらActivityのイベントメソッドを呼ぶ以下のJavaコードをKotlinで書き直そうとした。


```java:MyFragment.java
public class MyFragment extends Fragment {

	public interface FragmentListener {
    		void onClickButton();
	}

	private FragmentListener mListener;

	@Override
	public void onAttach(Context context){
    		//...

    		if (context instanceof FragmentListener){
        			mListener = (FragmentListener) context;
    		}
            // 上記を簡易に書くなら
　　　　　　 // mListener = context as? FragmentListener
	}

	@Override
	public void onViewCreated(View view, Bundle savedInstanceState){
    		//...

		    view.findViewById(R.id.Button).setOnClickListener(new View.OnClickListener() {
                  @Override
                  public void onClick(View v){
                      if (mListener != null){
                          mListener.onClickButton();
                      }
                  }
            });
    }

    //...
}
```

```kotlin:MyFragment.kt

class MyFragment : Fragment() {

    interface FragmentListener {
        fun onClickButton()
    }

    private var mListener: FragmentListener? = null

    override fun onAttach(context: Context){
        //...

        if (context is FragmentListener){
            mListener = context
        }
    }

    override fun onViewCreated(view: View?, savedInstanceState: Bundle?) {
        //...

        view!!.findViewById<Button>(R.id.Button).setOnClickListener {
            if (mListener != null){
                mListener.onClickButton()
            }
        }
    }

    //...
}
```

とすると、mListener.onClickButton()を呼んだところで

```
Smart cast to 'MyFragment.FragmentListener’ is impossible, because 'mListener’ is a mutable property that could have been changed by this time
```

とエラーが出る。


これは、`mListener`を`var`で宣言したために別スレッドからの書き換えが発生する可能性があるためFragmentListenerへのスマートキャストができないという内容のエラー。

しかし`val`で宣言してしまうとcontextが代入できない。

# 解決策

そのため、今回はスマートキャストをせず、スコープ関数`let`を使うことで解決した。

```kotlin:変更前
if (mListener != null){
	mListener.onClickButton()
}
```

```kotlin:変更後
mListener?.let { it.onClickButton() }
```

`mListener`が`null`なら`?.`呼び出しで`let{}`を実行せず、`null`でないなら`let{}`内の処理が実行される。

また、この場合以下のような記述もできる

```kotlin

mListener?.let(FragmentListener::onClickButton)
// より簡易に書くなら
mListener?.onClickButton()
```

# 参考資料

[Kotlin Reference: Type Checks and Casts: 'is' and 'as'](https://kotlinlang.org/docs/reference/typecasts.html)

[Kotlin スコープ関数 用途まとめ](https://qiita.com/ngsw_taro/items/d29e3080d9fc8a38691e)

[【Android】アプリエンジニアのためのKotlin入門（基本文法編）](https://qiita.com/yyokii/items/85a77cb23702992f444a)

[アクティビティへのイベント コールバックを作成する - Android デベロッパー](https://developer.android.com/guide/components/fragments?hl=ja#EventCallbacks)
JSON リーダーの rootProperty を動的に設定する

JSON リーダーの `rootProperty` を動的に設定する方法をメモっとく。

ストアにモデルを指定するとストアの操作時にモデルのプロキシが使用される。REST プロキシの場合、モデルからプロキシを利用するときと、ストアからモデルのプロキシを利用するときでは、リクエスト URL が異なる。そのためレスポンス JSON も異なってくることがあり、JSON リーダーの `rootProperty` を動的に設定すると便利なことがある。

# ストアからのリクエストとモデルからのリクエストでレスポンス JSON が異なる例

ストアからのリクエストとモデルからのリクエストでレスポンス JSON が異なる例として、ユーザーを取得する REST API を考えてみる。

## GET /users

ユーザーの一覧を取得する API。ストアからのリクエストで使用される。

グリッドでユーザーの一覧を表示する場合、50件ずつページングして表示するということがある。総ページ数を計算するためにはユーザーの総数が必要になるので、その情報をメタ情報として JSON レスポンスに含めたい。そういうときには `users` プロパティにユーザーの一覧が、`total` プロパティにユーザーの総数が入っているようなエンベロープのある JSON レスポンスにすることがある。

```json
{
    "users": [{
        "id": 1,
        "name": "Alice"
    }, {
        "id": 2,
        "name": "Bob"
    }, {
        "id": 3,
        "name": "Charlie"
    }, {
        "id": 4,
        "name": "Dave"
    }],
    "total": 4
}
```

## GET /users/:id

指定 ID のユーザーを取得する API。モデルからのリクエストで使用される。

フォームでユーザー情報の詳細を表示する場合、ID 指定で1件だけ取得して表示する。とくにメタ情報は不要なのでエンベロープのない JSON レスポンスにすることがある。

```json
{
    "id": 1,
    "name": "Alice"
}
```

# JSON リーダーの rootProperty を動的に設定する

モデルのプロキシにリーダーを定義するときに、`rootProperty` を設定する。モデルかストアかということで判別せずに、`users` プロパティが JSON レスポンスに存在すればその内容を取得するという実装にしている。

```js:User.js
Ext.define('Fiddle.model.User', {
    extend: 'Ext.data.Model',

    fields: ['id', 'name'],

    proxy: {
        type: 'rest',
        url: '/users',
        reader: {
            rootProperty: function (data) {
                return data.users || data;
            }
        }
    }
});
```

このモデルを使用することでストアはシンプルな定義を実現できる。

```js:Users.js
Ext.define('Fiddle.store.Users', {
    extend: 'Ext.data.Store',

    model: 'Fiddle.model.User',
    autoLoad: true
});
```

サンプルコードはこちら。JavaScript コンソールに出力しているのでデベロッパーツールを開いて確認してほしい。

https://fiddle.sencha.com/#view/editor&fiddle/2i5p

---

今回は JSON リーダーの rootProperty を動的に設定してみた。スキーマを活用してより汎用的にプロキシを実装する方法も近々記事にする予定なので期待してほしい。

# 参考文献

https://docs.sencha.com/extjs/6.2.0/classic/Ext.data.reader.Reader.html#cfg-rootProperty
Windows Subsystem for Linux (Bash) の端末を Hyper にして素敵な生活を送る

# はじめに

Windows Subsystem for Linux (WSL) によって Windows でも Bash が使えるようになりましたが、デフォルトの端末はコマンドプロンプトなんですよね…。そこで、今回は [Hyper](https://hyper.is/) というイケてる端末で Bash を起動できるようにしてみました。

この記事ではその方法を紹介します（Hyper そのものの説明は省略します）。

# 環境

- Windows 10 Home (Build 17134.81)
- [Ubuntu](https://www.microsoft.com/ja-jp/p/ubuntu/9nblggh4msv6) (Windows Subsystem for Linux)
- [Hyper](https://hyper.is/) [2.0.0](https://github.com/zeit/hyper/releases/tag/2.0.0)

# Hyper の設定を変更する

Hyper を起動したら、まず <kbd><kbd>Ctrl</kbd> + <kbd>,</kbd></kbd> で設定ファイルを開きます。メモ帳が起動しますが、設定変更には支障ありません。

次に、設定ファイルを以下のように書き換えて保存します。

```js:.hyper.js
module.exports = {
  config: {
    // ...

    shell: 'C:\\Windows\\System32\\bash.exe',

    shellArgs: ['~', '--login'],

    // ...
};
```

- `shell`: ここで `Bash.exe` を起動するようにします。
- `shellArgs`: `Bash.exe` 起動時のオプションを配列で指定します。
    - `~`: ログイン後のカレントディレクトリを `~` に指定します。これを指定しないと、`/mnt/c/Users/<ユーザ名>` になるようです。
    - `--login`: ログイン後 `~/.bash_profile` を読み込ませます。

設定変更は以上です。一度 Hyper を終了して、再度起動して Bash になっていたら成功です。

# おわりに

おつかれさまでした。これで Windows でも素敵な端末ライフを送れますね！

Hyper では他にもフォントや色のカスタマイズができるので、初めての方はぜひいろいろ試してみてください（個人的には MS ゴシックから解放されるのがうれしい）。
【Google API Console】クライアントID・クライアントシークレットを取得する

# 本記事について

所用でGoogle Sheets API v4を利用することになったのですが、そのためにはGoogle API Consoleにプロジェクトを登録して、OAuth認証に必要な「クライアントID」と「クライアントシークレット」を取得する必要があります。

いろんな記事でこれの利用方法が紹介されていますが、こいつがかなりの頻度でUIごと派手に更新されるせいでちょっと古い記事は役に立たなくなってしまうことがあります。

ので、とりあえず執筆時点（2018/06/16）でのプロジェクトの登録方法をまとめました。

なお、この記事の内容は下記ページを大いに大いに参考にしています。感謝。
> [Google Sheets API v4が登場しました。 | 初心者備忘録](https://www.ka-net.org/blog/?p=7007)

## 手順

1.[Google API Console](https://console.developers.google.com/flows/enableapi?apiid=sheets.googleapis.com)を開き、Google アカウントでログイン

2.アプリケーションの登録画面が表示されたら「プロジェクトを作成」→「続行」ボタンをクリック

![01.PNG](https://qiita-image-store.s3.amazonaws.com/0/194874/52b8f4a0-4a78-37fa-dbc4-2d505ef75bef.png)
 
3.APIが有効化されたら「認証情報に進む」ボタンをクリック

![02.PNG](https://qiita-image-store.s3.amazonaws.com/0/194874/2efef707-0392-f516-7b40-60ab678b1eff.png) 

4.『プロジェクトへの認証情報の追加』として色々表示されますが全部無視して「クライアント ID」をクリック

![03.PNG](https://qiita-image-store.s3.amazonaws.com/0/194874/1908650d-ce0b-24e7-5522-ab052ca29423.png)

5.クライアント IDの作成画面が表示されたら「同意画面を設定」ボタンをクリック

![04.PNG](https://qiita-image-store.s3.amazonaws.com/0/194874/d17fb658-b083-f7ea-e23f-4b416e72a6c3.png)

6.『認証情報』画面が表示されたら「ユーザーに表示するサービス名」を入力して「保存」ボタンをクリック

これは後にGoogleアカウントの認証を行う際に表示される項目となります。もし必要であればその他の項目も埋めちゃって下さい。

![05.PNG](https://qiita-image-store.s3.amazonaws.com/0/194874/d1425a8f-e624-3cd8-1057-fbf7cbbe3d59.png)

7.OAuthクライアントID作成画面が表示されたら、アプリケーションの種類を「その他」にし、適当な名前を入力した後、「作成」ボタンをクリック

この名前は自分が参照するだけのものなので、後で自分が見たときに分かりやすい名前にするのが良さげです。

![06.PNG](https://qiita-image-store.s3.amazonaws.com/0/194874/ae381900-79d0-53b9-771c-c5eb1a03ecdf.png)


8.プロジェクト登録完了！

これでクライアントID・クライアントシークレットが取得できました。OAuth認証に用いるので、メモ帳とかにコピペして保存しておきましょう。

![07.PNG](https://qiita-image-store.s3.amazonaws.com/0/194874/0bbfa264-f13e-6358-597b-f9503106e37d.png)
esp32-arduinoでluaを使う

# 概要

esp32-arduino環境でluaを実行する方法を紹介します
単にesp32でluaを動かすソリューションはたくさんありますが、esp32 Arduinoでluaを使う方法がなかったので調べました。

Arduino IDEではなくplatformioを使った方法です。

# ソースコード
https://github.com/inajob/lua-in-arduino-esp32

```
- lib/
  - lua/
    - 本家リポジトリからクローンしてきただけ
- src/
  - main.ino
- platformio.ini
```

Luaのための設定をbuild_flagsで行います。
esp32はlong longをサポートしていないようなのでLUA_32BITSを有効にします
またlua_writestring, lua_writestringerrorというLuaが何かを出力するための関数が必要なので登録しておきます（あとで定義します）

```platformio.ini
[env:esp32]
platform = espressif32
board = esp32dev
framework = arduino
upload_speed = 921600
lib_deps =
board_f_cpu = 240000000L
board_f_flash = 80000000L
build_flags =
  -DLUA_32BITS=1
  -D"lua_writestring(s,l)=gprint(s)"
  -D"lua_writestringerror(s,l)=gprint(s)"
```

## src/main.ino

```c
#include "luafunc.h"

void setup(){
  Serial.begin(115200);
  // Luaのコンテキストの作成
  lua_State *L = luaL_newstate();
  // Luaの標準関数群の登録
  luaL_openlibs(L);

  // ===== Lua文字列の評価 ====
  if(luaL_dostring(L, "\
    function mul(a, b)\
      return a * b\
    end\n")){
    printf("run error %s\n", lua_tostring(L, -1));
  }

  // ===== C言語関数の登録 ====

  // l_add関数をaddという名前で登録
  lua_register(L, "add", l_add);

  // l_print関数をprintという名前で登録
  lua_register(L, "print", l_print);

  // ===== Lua文字列の評価 + C言語関数の呼び出し ====
  if(luaL_dostring(L, "\
    print(\"Hello Lua!\")\
    ")){
    printf("run error %s\n", lua_tostring(L, -1));
  }

  // ===== C言語からLua関数の呼び出し ====

  // mul関数を呼び出し
  lua_getglobal(L, "mul");
  lua_pushnumber(L, 4); //引数1
  lua_pushnumber(L, 5); //引数2
  if (lua_pcall(L, 2, 1, 0)) {
    fprintf(stderr, "cannot exec add. %s\n", lua_tostring(L, -1));
    return;
  }
  // 戻り値の確認
  if (lua_isnumber(L, -1)) {
    int ret = lua_tointeger(L, -1);
    printf("ret=%d\n", ret);
  }
  lua_pop(L, 1); // 戻り値を捨てる

  lua_close(L);
}

void loop(){
}
```

systemは本来はOSのコマンドを実行することを期待しているようですが、esp32でそのようなことはできないので何もしない関数を作っておきます。
gprintはplatformio.iniで指定して、luaがなにか文字を出したいときに使う関数です。

```src/luafunc.h
extern "C" {
#include "lua.h"

#include "lualib.h"
#include "lauxlib.h"

int gprint(char* s){
  printf(s);
  return 0;
}
int system(const char* c){
  //none
  return 0;
}

int l_print(lua_State* L){
  const char* s = lua_tostring(L, 1);
  Serial.println(s);
  return 0; // 戻り値なし
}

int l_add(lua_State* L){
  int a = lua_tointeger(L, 1);
  int b = lua_tointeger(L, 2);
  lua_pushinteger(L, a + b);
  return 1; // 戻り値が1つ
}
}
```

# おわりに

このデモでは特に面白いことはしていませんが、LuaでESP32の制御が書けるので応用が広がりそうです。


# 参考
- Arduino を CLI で開発する #PlatformIOが素晴らしい
 https://qiita.com/zakkied/items/cbbccdc1be4e4da9f7f9
- C と lua の連携方法メモ
https://qiita.com/miuk/items/82e5566ea01313a8b1af
Array#include?で引数にnilを指定した際にtrueになる条件

何が言いたいかわかりにくいが、要は下記ケースだとtrueが返るという話。

```ruby
[1] pry(main)> [1,2,nil].include?(nil)
=> true
```

`nil` を含む配列に対して `nil` を渡すと `true` が返されます。

冷静に見れば当たり前な気がしますが、何となくnilの比較はfalseが返る思い込みみたいなのがあるというか、ちょっとモヤってしたので調べました。

調べたって言っても、ソースを見たらすぐわかりましたが。

```ruby
[2] pry(main)> show-source Array#include?
rb_ary_includes(VALUE ary, VALUE item)
{
    long i;
    VALUE e;

    for (i=0; i<RARRAY_LEN(ary); i++) {
        e = RARRAY_AREF(ary, i);
        if (rb_equal(e, item)) {
            return Qtrue;
        }
    }
    return Qfalse;
}
```

`rb_equal` が何かというと `==` メソッドの事で、配列の中に `nil` が含まれるということは、ループの中で `nil == nil` が評価されることで `true` が返されるという事になります。
https://docs.ruby-lang.org/ja/latest/function/rb_equal.html

```ruby
[3] pry(main)> nil == nil
=> true
```

Activesupport の `in?` メソッドも `include?` を呼んでいるのでこちらの条件が当てはまります。

```ruby
  # activesupport/lib/active_support/core_ext/object/inclusion.rb
  def in?(another_object)
    another_object.include?(self)
  rescue NoMethodError
    raise ArgumentError.new("The parameter passed to #in? must respond to #include?")
  end
```

実際に今回の内容を調べるきっかけになったのは、以下みたいな条件で `hoge=nil` なのに先に進んでしまいエラーになった事からでした。

```ruby
# hoge => nil
# piyos => [1,2,nil]
return unless hoge.in?(piyos)  # => trueが返るのでreturnされない
```

まぁそもそも `hoge` に対して `nil` チェックしたり、 `piyos` に対して `compact` を当てろって話ですけどね。。。
GPSの研究　その13

#概要

GPSを理解したかった。
衛星の情報で、天空図書いてみた。

#写真

![figure_1.png](https://qiita-image-store.s3.amazonaws.com/0/18104/09b3f0a2-6611-84cd-c038-68408f92b5f3.png)


#サンプルコード


```
import matplotlib.pyplot as plot

plot.axes(projection = 'polar')
plot.title('GPS')
plot.polar(209, 90 - 66, 'o', label = "18") 
plot.polar(234, 90 - 13, 'o', label = "15")
plot.polar(130, 90 - 66, 'o', label = " 5")
plot.polar(297, 90 - 52, 'o', label = "22")
plot.polar(103, 90 - 16, 'o', label = "26")
plot.polar(107, 90 - 12, 'o', label = "29")
plot.polar(186, 90 - 37, 'o', label = "30")
plot.polar(212, 90 -  6, 'o', label = "21")
plot.polar( 41, 90 - 49, 'o', label = " 9")
plot.legend()
plot.show()
```


以上。
死んだCSSを見つける方法

使われてないCSSであればツールで見つけられますが、そうではなく、"実質的に"使われてないCSSを見つけるにはどうすればよいでしょうか。
という問題にスマートな解決方法を記載している記事を見つけたので訳してみます。
以下は[Finding Dead CSS](https://csswizardry.com/2018/01/finding-dead-css/)の日本語訳です。

# Finding Dead CSS

私が今週開いていたパフォーマンスワークショップで、Webサイト上で死んだCSSを見つけるテクニックが頭をよぎりました。
今、故意に『未使用CSS ( unused CSS ) 』ではなく『死んだCSS ( dead CSS ) 』というフレーズを使いましたが、これは以下のようなシナリオを想定して使いました。

数十人規模の多数のチームが開発している、数十万行のコードを含む、長期にわたって運用されている大規模なプロジェクトがあるとしましょう。
そこには既に使われていないCSSがあるだけではなく、完全に使われていないコードがある可能性もあります。
廃止はされたもののコードが削除されることはなく、決して辿り着くことのできないコードの終着点。
ユーザがそこに到達することはおそらく不可能だが、未だ生存しているかもしれないWebページの袋小路。

そのようなデッドコードを抽出するにはどうすればよいでしょうか。
[uncss](https://github.com/uncss/uncss)のようなツールは強力ですが、今回の用途には向いていません。
今必要としているのは、[RUM](https://en.wikipedia.org/wiki/Real_user_monitoring)のようなソリューションです。
ユーザがWebサイトで実際に画面表示するコードを特定するにはどうすれば？

非常にシンプルで、費用対効果も高い解決策があることがわかりました。

サイトのリニューアルがあったとしましょう。
レガシーな予約システムを、数ヶ月から数年かけて段階的に移行しました。
少なくとも理論的には、全ての顧客とユーザは新しいサイトに移行したので、古いコードの除去は始められるはずです。

最初に行うことは、どこのコードが死んでいるかの仮説を立てることです。
もはやユーザが訪れることのないであろうCSSセレクタ( ここでは#checkout_wrapperとします )を選択します。

次に、1*1ピクセルの透明な画像を作ってdeadディレクトリに放り込みましょう。

最後に、選んだCSSセレクタの背景にその画像を設定します。

```css
#checkout_wrapper {
  background-image: url('/assets/img/dead/checkout_wrapper.gif');
}
```

3ヶ月寝て待った後、サーバのアクセスログを確認しましょう。
画像へのアクセスログがなかったのであれば、誰もそのレガシーなコンポーネントをレンダリングすることはなかったということです。
安心して全てを削除しましょう。

アクセスログが発見されたのであれば、何らかの形でそのレガシーなはずのコンポーネントにアクセスが可能であることがわかります。
どれだけ依存されているかは、アクセス数によってわかるでしょう。

もちろん、このテクニックは完全にフェールセーフではありませんが、コードの削除がプロダクションアプリにどれくらいの影響を与えるかの試金石としては十分な機能を提供するでしょう。

## 自己紹介

ハイ、私はHarryです。
イギリスの[フロントエンドアーキテクトアワード](https://thenetawards.com/previous-winners/)を取得しました。
主にCSSについて、[書いたもの](https://csswizardry.com/archive/)、[ツイート](https://twitter.com/csswizardry)、[スピーチ](https://csswizardry.com/speaking/)、[コード](https://github.com/csswizardry)、[コンタクト](https://csswizardry.com/contact/)


# 感想

スマートどころかすごい力業だった。
しかし彼のプロダクトや業績を見てみるとけっこうすごいかんじの人なので、先端技術を一周して行き着いた先がこの結果、ということなのかもしれません。

それにしても[普通にググる](https://www.google.co.jp/search?q=%E4%BD%BF%E3%82%8F%E3%82%8C%E3%81%A6%E3%81%84%E3%81%AA%E3%81%84CSS)とChrome開発者ツールばっかり出てきて困りますね。
それでわかるのは『そのページで使われてないCSS』であって『サイト全体で使われてないCSS』ではないのだ。
そんなやりかたでCSSを削除すると血を見るぞ。