OmniAICreator/Qiita-1.07M huggingface dataset:
electronアプリをビルドした際にめっちゃエラーが出た場合

##環境
仮想環境のOS：Ubuntu
Electron 4.0.1
node v8.10.0

## 状況
環境的には、Reactの中にElectronモジュールを入れて開発みたいな感じです。
package.jsonで、プラットフォームをallにしていたため、たまにmacのアプリだけ生成されたり、何も生成されなかったり、たまたまwin,mac,linux3つとも生成されたりしたりしてしまっています。
以下、エラー内容です。

```
npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! helloworld@0.1.0 electron-build: `electron-packager build --platform=all --overwrite --asar`
npm ERR! Exit status 1
npm ERR!
npm ERR! Failed at the helloworld@0.1.0 electron-build script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.
・
・
・
```

##エラーの原因
エラー文を見た所、package.jsonの中のelectron-packagerあたりが原因であることがわかります。
windows向けのデスクトップアプリを生成するには、「wine」が必要で、allにするとMac向けのアプリは成功しますがwindows向けのアプリを生成する段階で失敗となりエラーがでる。
だから、全てのプラットフォームを指定すると、もしmac向けのアプリから生成が始まればmacだけのアプリが生成するし、windows向けのアプリから生成が始まれば、最初からエラーが出て何も生成されなくなるというわけです。
あぁ、だから、何も生成されない時と一個だけ生成される時があったのか、、、と納得しました。

## 解決方法
Wineを入れる方法はググれば出てきますが、
今回はやりません。
プラットフォームをMac向けだけに指定します。
次に、package.jsonの中のelectron-packagerのプラットフォーム指定の所をなんとかしました。

なので、私の場合はplatformをallにすると、エラーとなります。

```json:package.json(エラーが出る方)
  "scripts": {
    "electron-build": "electron-packager build --platform=all --overwrite --asar",
  },
```

今回mac向けのアプリを生成したいので、platformの部分をdarwin(mac)と指定しました。

```json:package.json(エラーなくなる方)
   "scripts": {
    "electron-build": "electron-packager build --platform=darwin --overwrite --asar",
  },
```
上記の記述なら、platformの部分に任意のプラットフォームを指定します。
なお、「all, darwin, linux, mas, win32」が指定可能です。

おそらく、windowsのアプリを生成するためにwine入れたりlinuxアプリを生成するための環境整えたりしたら、
platformをallにしても問題ないと思います。


## 感想
Electronすこ
微積の備忘録

忘れないようにメモです

##基本公式的な##

```math
\int x^adx = \frac{x^{a+1}}{a+1} + C(a \neq -1) 

```

```math
\int \frac{1}{x}dx  = log|x| + C
```

```math
\int \frac{1}{cos^{2}}dx = tan x + C 
```

```math
\int a^xdx = \log{a^x}{\log a}+C(a > 0, a \neq1)
```

##部分積分法##
```math
\int f(x)g^\prime(x)dx = f(x)g(x)+\int f^\prime(x)g(x)dx
```
Windows10のgit logが文字化け（<E8><A4>...)するときの対処

powershellやcmdで見ると以下のように文字化けしてしまっていたのですが
![less_mojibake.png](https://qiita-image-store.s3.amazonaws.com/0/47220/30f9da49-a974-30ba-4f7a-12523fd8daf4.png)

[この記事](https://qiita.com/Fushihara/items/c21172e707d57c833e7e#PublicCommentListContainer-react-component-0ec88e1e-8194-4baf-98f6-9fafa7c29960)のコメント欄で「gitでなくgit logで表示に使ってるlessの文字コードが違うのではないか」ということと、lessは`LESSCHARSET`という環境変数で文字コードを指定できるということを知ったのでシステムで環境変数を設定。
![スクリーンショット (4).png](https://qiita-image-store.s3.amazonaws.com/0/47220/b9561fe5-4d10-27a0-16ae-7b89000e5e75.png)
コマンドプロンプト・Powershellを再起動（VisualStudioから起動したcmdはVisual Studioごと再起動しないとダメだった）してもう一度git logを試すと
(コンソールで環境変数を出力させて正しく反映されているか確認して）
![スクリーンショット (5).png](https://qiita-image-store.s3.amazonaws.com/0/47220/d656d453-9229-55b3-dcfd-9a738ed71a78.png)
![less_nomojibake.png](https://qiita-image-store.s3.amazonaws.com/0/47220/ef215e39-030c-1d05-48a6-c7d8c5dfac45.png)

Powershellでもcmdでも日本語でgit logできるようになりました。
Salesforce Sandboxのコピーでうれしいこと

# 概要

　現在（2019/1/23）ベータ版の「[Sandboxのコピー](https://help.salesforce.com/articleView?id=data_sandbox_cloning_overview.htm&type=5)」でリリースと開発がより柔軟な構成になるのでは？と思ったので、その案を紹介したいと思います。
「Sandboxのコピー」はズバリ既存のSandboxを別のSandboxとして複製する機能である

# 現状の問題点

　本番組織に**リリース記録を残す**ために変更セットからリリースしています。そうすると機能開発終了時に開発組織（Sandbox）でリリース予定のソースを凍結しなければならない。なぜならば、変更セットはアップロードした時点のソースがリリース対象になるため、リリースされるまでにソースを編集してはならない
　そのため、本番リリースするまで待機状態になったり、または次期開発を始めて、リリース時に構成管理からロールバックすることになるので管理が煩雑になる

※変更セットからリリースしない場合はこの記事をスルーしてください

# こんな開発フローになる

ポイントとなる箇所を**太字**で記載しています

![salesforce_sandbox_deploy_flow.png](https://qiita-image-store.s3.amazonaws.com/0/30522/6a9a6ade-523d-df4b-89f3-634f3a5bf12d.png)

1. 本番組織からリリース組織を作成する
2. リリース組織もしくは本番組織からステージング組織を作成する
3. リリース組織から各担当者用に開発組織を作成
    - 担当者別に組織を分けることで**ソースの競合を防ぐ**ことができる（ソースのマージは構成管理上で行う）
    - **リリース組織からSandboxを更新**することできるので、例えば同時進行中の複数のプロジェクト（図の黄色背景）のリソースを同期することで容易に動作確認ができる
4. 各種機能開発は各開発組織で行う
5. ローカルでソースの構成管理を行い、Gitlab/Githubなどで共有する
6. 各機能のソースをマージリクエストやプルリクエスト単位にリリース組織にデプロイする
    - 複数プロジェクトが同時進行でも１つのリリース組織で**すべてのデプロイを一元管理**することができる
7. リリース組織で変更セットを作成し、ステージング組織にデプロイ
8. ステージング組織で動作確認した後、**リリース組織向けに作成した変更セットをそのまま本番組織にリリース**することができる
    - 変更セットの作成コストが大きいので極力作成回数を減らしたい（API経由で作成する術はないのか・・・）

# 気を付けること

上記のフロー図（赤字）にも書きましたが、本番組織とAPIバージョンが異なる場合は組織のコピーができないので、コピーする際はSalesforceのメジャーバージョンアップ外で行うようにする必要があります
Ubuntu 16.04 x64 で PostgreSQL11のドキュメントを作成してFessで検索してみる

#目的
Ubuntu 16.04 x64 で PostgreSQL11のドキュメントを作成してFessで検索してみる
##必要なパッケージのインストール
$ sudu apt-get install -y libreadline6-dev \
 zlib1g-dev \
 flex \
 bison \
 libxslt-dev \
 jade \
 docbook \
 docbook-dsssl \
 docbook-xml \
 docbook-xsl \
 gettext \
 sp \
 libxml2-utils \
 xsltproc
$ which collateindex.pl
/usr/bin/collateindex.pl
##ドキュメントのビルド
$ git clone git@github.com:pgsql-jp/jpug-doc
$ ./configure --enable-nls --with-libxml --with-libxslt
・トップディレクトリで以下を実行すると、doc/src/sgml/html に html が生成される
$ make html
再度、全ビルドをしたい場合
・一度 make html をすると移行差分だけの更新になります。再度全ドキュメントを更新したい場合は、
$ make clean
$ make html
としても、更新がおこなわれないので(生成されたhtmlフォルダを削除してもダメです)
一度sgmlのファイルを更新してから再生成する
$ touch ./doc/src/sgml/*.sgml
$ make html
##Fess用dirの作成＆ファイルのコピー
[Ubuntu 16.04 x64 に fess-12.4.3.deb をインストールしてみる](https://qiita.com/tabizou/items/3771b7bdf5c0365cf3cd)
で設定したfessで検索できるように設定する
$ sudo mkdir /var/export/web
$ sudo mkdir /var/export/web/fess
$ sudo mkdir /var/export/web/fess/pgsql11
$ cd /path/to/doc/src/sgml/html
$ sudo cp -r * /var/export/web/fess/pgsql11/
$ sudo chown -R fess  /var/export/web/fess
$ sudo chgrp -R fess  /var/export/web/fess
##Fessで検索可能にする
http://localhost:8088/admin/ にアクセスする
###クローラーメニュー
　->ファイルシステム
　　->+新規作成 ボタン
　　　名前：Postgres11
　　　パス：file:/var/export/web/fess/pgsql11/
　　　検索対象とするパス：file:/var/export/web/fess/pgsql11/.+\.html$
　　　検索対象から除外するパス：file:/var/export/web/fess/pgsql11/.+\.css$
　　　+作成 ボタン
###システムメニュー
　->スケジューラ
　　->Default Crawler　をクリック
　　　->今すぐ開始 ボタンをクリック
$ sudo tail -f /var/log/fess/fess-crawler.log
※以下で終了している
[main] INFO  Disconnected to elasticsearch:localhost:9300
[main] INFO  Destroyed LaContainer.
TOPの画面から Postgres で検索してみる
##参考にしたのは以下のサイト
[Ubuntuユーザ追加とsudo権限付与。ユーザ/グループ操作まとめ](http://www-creators.com/archives/241)
[pgsql-jp/jpug-doc](https://github.com/pgsql-jp/jpug-doc)
[ドキュメントビルド手順](https://github.com/pgsql-jp/jpug-doc/wiki/%E3%83%89%E3%82%AD%E3%83%A5%E3%83%A1%E3%83%B3%E3%83%88%E3%83%93%E3%83%AB%E3%83%89%E6%89%8B%E9%A0%86)
[msgfmt エラーの解消](https://forums.ubuntulinux.jp/viewtopic.php?id=10968)
[PostgreSQL日本語マニュアルについて](https://qiita.com/noborus/items/03f98e43c216d7e23767)
[Ubuntuのポート開放方法（ファイアウォールを設定する）](https://qiita.com/toujika/items/be21d361cf80d664859c)
axis = 0, axis=1 がわからなくなった人へ

#どちらの軸に沿うかを考える

![image.png](https://qiita-image-store.s3.amazonaws.com/0/315063/6ef602f5-151b-31f7-08e1-c86143e9ca84.png)

<b>列に沿った処理はaxis=0
行に沿った処理はaxis=1</b>


#sum

```python

a = np.array([[1,2,3],
             [4,5,6]])
print(a)
```
>
[[1 2 3]
 [4 5 6]]

```python

np.sum(a, axis=0)
```

>array([5, 7, 9])

<b>列に沿って足し算している（1+4, 2+5, 3+6)</b>


```python
np.sum(a, axis=1)
```
>
array([ 6, 15])

<b>行に沿って足し算している (1+2+3, 4+5+6)</b>

#repeat
```python

np.repeat(a,3, axis=0)
```
>array([[1, 2, 3],
       [1, 2, 3],
       [1, 2, 3],
       [4, 5, 6],
       [4, 5, 6],
       [4, 5, 6]])

<b>列に沿って広げている</b>

```python

np.repeat(a,3, axis=1)
```

>array([[1, 1, 1, 2, 2, 2, 3, 3, 3],
       [4, 4, 4, 5, 5, 5, 6, 6, 6]])

<b>行に沿って広げている</b>


#drop

![image.png](https://qiita-image-store.s3.amazonaws.com/0/315063/8cb98681-f9be-f0dc-a4b9-9f8a6f37d347.png)

```python

X.drop('INDUS',axis=1).head()
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315063/01bbebb2-6f86-7c53-6abc-2cac277c98bf.png)

<b>行に沿ってカラムを選んでいる</b>
CRIM　→　ZN →　INDUS　→　CHAS　→　・・・

・axis=0だとエラーになる

#Imputer

数値が０の場合、平均値を入れるという処理をするImputer
＊本来は欠損値に適用するが今回は視覚的にわかりやすいように

```python

from sklearn.preprocessing import Imputer
imp = Imputer(missing_values=0, strategy='mean', axis=0)
imp.fit(X)

X_columns = X.columns.values
X = pd.DataFrame(imp.transform(X), columns=X_columns)

X.head()

```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315063/ab8bbcb3-8a99-30c0-d662-1964d467c85c.png)

<b>列に沿って平均値を計算している</b>
INDUSの場合
→　2.31 + 7.07 + 7.07 + 2.18 + 2.18 + .....       / データ数



#fillna

![image.png](https://qiita-image-store.s3.amazonaws.com/0/315063/018ac27b-d495-49ee-e16d-1bd82e8fa005.png)

```python
X.fillna(0,axis=0)
# X.fillna(0,axis=1)
```
欠損値に０を入れる処理
この場合axis=0でもaxis=1でも同じ結果になる
<b>axis = 0 は列に沿って数値をチェックしていきNaNがあったら0にする
axis = 1は行に沿って数値をチェックしていきNaNがあったら0にする</b>
#reindex

![image.png](https://qiita-image-store.s3.amazonaws.com/0/315063/638cfdff-b181-6c51-02d1-99284248973b.png)

```python

a.reindex(['c2','c3','c1'], axis=1)
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/315063/ddfeb138-b59f-0b09-99fa-fc11ec18407e.png)

<b>行に沿ってカラムの入れ替えをしている</b>
【JavaScript】【for文駆逐作戦】findメソッドの使い方

## この記事の内容
- javaScriptのES６で正式採用された「find」の使い方について
- for文は駆逐していく方針

## なぜ駆逐するのか
- 読みづらいし、ナウくないから。
- 単純にfindって書かれてたら、「何か探してんだな」って他の人が気付きやすい（可読性UP↑）

## さっそく書き方

### いつもの「for文」
```javascript
var users = [
    { name : 'コーヒー' },
    { name : '紅茶', id : 1},
    { name : '緑茶' },
    { name : '紅茶', id : 10}
 ];

var user ;

for (var i = 0;  i < users.length; i++) {
  if ( users[i].name === '紅茶') {
    user = users[i];
    break;
  }
}

console.log(user); //{ name : '紅茶', id : 1}

```
- for文の中でif文で条件判定し、空の変数に格納している
- ↑ってみると本当はただ検索したいだけなのに、、大層なことやってるでって感じがする😇
- breakしてるけど、もし検索したいワードが配列の最後にあったら、、そこまでfor文を回さないといけない。（時間かかるよね）


### 最新の「find文」

```javascript
var users = [
  	{ name : 'コーヒー' },
    { name : '紅茶', id : 1},
  	{ name : '緑茶' },
    { name : '紅茶', id : 10}
 ];

var result = users.find(function(user){
  return user.name === '紅茶'
});

console.log(result); //{"name":"紅茶", id = 1}
```

### もういっこfind文（プチ応用）
```javascript
var drinks = [
  	{ id : 1, name : 'コーヒー' },
    { id : 2, name : '紅茶'},
  	{ id : 3, name : '緑茶'},
    { id : 4, name : '水'}
 ];
 
var drinkTaste = {drinkId : 2, Taste : 'good'}

// DrinkInfoのfunctionを定義する
function DrinkInfo(drinks, drinkTaste){
	return drinks.find(function(drink){
  	  return drink.id === drinkTaste.drinkId;
  });
}

 console.log(DrinkInfo(drinks, drinkTaste));
 //{id: 2, name: "紅茶"}
```
2つのオブジェクトを比較して、findしてる。
こちらの方がちょっぴり実用的な感じがしますね。

### 補足　（findの特徴）
- コールバック関数の戻り値は、「true」か「false」を返す
- 「true」だった場合、要素が配列に入る！
- そもそも「return」を忘れてはいけない
- １番最初に見つかった時点で、検索を終了する。

### まとめ
- 基本的にはfunctionの中で使うことが多そうです。
- そして複数のプロパティを比較して、取り出しを自由自在にすることが、真のJavaScripterになるということと悟りました。

### 独り言
- [SPA(Single Page Application)](https://qiita.com/takanorip/items/82f0c70ebc81e9246c7a)でよく使われるってどこかで聞いたことがあります。
- ここら辺も覚えて記事にしていきたいですね。
JavaEEでFlywayを使う

# はじめに

FlywayとはJava用に開発されたDBマイグレーションツールです。
DBマイグレーションとは、簡単に言えば、DBのバージョン管理ですね。

DBマイグレーションツールを使わない場合、環境によってDB構成に差異が生じて、アプリケーションの動作にも影響してきます。flywayを使うことで、DB変更によるアプリケーション障害の影響は減らせると思います。

# 今までどうやっていたか
マイグレーションツールがなかった時代は、A5M2やERMasterなどのER図作成ツールを使い、DDL出力しDBを作成していました。構成に変更があったときは、ER図を更新し、更新用のDDLをExcelなどで管理していました。

以前、Playframeworkという、Java、Scalaのフレームワークを使っていた時があったのですが、
エンティティクラスを変更するだけで、フレームワークがDBとの差異を検知し、自動で更新してくれていました。

今回お話するJavaEEにはそのような機能はないので、Flywayを使うことになります。

flywayを調べると、SpringBootとの連携の記事が多く、JavaEE連携の記事が少ないように思いましたので、使い方を残すことにしました。

# 対象

- JavaEE7
- NetBeans8.2
- Flyway5.2.4
- PostgreSQL9.6

# 準備

MavenでWebアプリケーションプロジェクトを作成します。（Webでなくても問題ないです。）

pom.xmlを以下のように編集します。

```xml:pom.xml
・・・
<dependencies>
　　　　・・・
　　　　<dependency>
　　　　　　　　<groupId>org.postgresql</groupId>
　　　　　　　　<artifactId>postgresql</artifactId>
　　　　　　　　<version>9.4-1206-jdbc41</version>
　　　　</dependency>
</dependencies>

<plugins>
　　　　・・・
　　　　<plugin>
　　　　　　　　<groupId>org.flywaydb</groupId>
　　　　　　　　<artifactId>flyway-maven-plugin</artifactId>
　　　　　　　　<version>5.2.4</version>
　　　　　　　　<configuration>
　　　　　　　　　　　　<url>jdbc:postgresql://<ホスト名>:<ポート>/flywaydb</url>
　　　　　　　　　　　　<user><ユーザ名></user>
　　　　　　　　　　　　<password><パスワード></password>
　　　　　　　　</configuration>
　　　　</plugin>
</plugins>

```
src/main/resources/db/migrationに以下のファイルを作成します。
作成するファイルには命名規則があるので注意が必要です。

#### V__ + （バージョン番号） + （任意の名前） + .sql
__はアンダースコアが２つです。

```sql:V1__create_user.sql
create table users (
    id int not null,
    name varchar(100) not null
);
```

# 実行

```bash
$ cd <プロジェクトのルート>
$ mvn flyway:migrate
```

DB構成に変更があった場合は、命名規則に従ってsqlファイルを作成します。

# NetBeanとの連携

アプリケーションの実行やデバッグを行う場合、IDEの機能を利用することが多いと思います。
現状、マイグレーションをコマンドで個別に実行する必要があるので、NetBeansと連携したみたいと思います。

プロジェクトを右クリック->[プロパティ]を開きます。
カテゴリの[アクション]を開きます。
使っている構成（通常はデフォルト構成）を選択します。
[プロジェクトのビルド]を選択し、[ゴールの実行]の設定値を以下のように変更します。

```
（変更前）　install
（変更後）　flyway:migrate install
```
設定が完了したら、[OK]ボタンでプロパティ画面を閉じます。

# 連携を確認

プロジェクトを右クリック->[ビルド]を実行します。

```
--- flyway-maven-plugin:5.2.4:migrate (default-cli) @ flyway-javaee ---
Flyway Community Edition 5.2.4 by Boxfuse
Database: jdbc:postgresql://localhost:25432/flywaydb (PostgreSQL 9.6)
Successfully validated 1 migration (execution time 00:00.066s)
Current version of schema "public": 1
Schema "public" is up to date. No migration necessary.
```

上記のログが出力されれば成功です。

# 参考サイト
- [Flyway公式サイト](https://flywaydb.org/)
php-master-changes 2019-01-22

今日は ??= 演算子の実装、opcache 最適化処理の改善と定数表コンパクションのバグ修正、php.ini への opcache.preload の追記、ドキュメントの更新、ROPE_ADD 命令が変なとこに出てた問題の修正、tokenizer のテスト修正があった！

# 2019-01-22
## dstogov: Avoid double live ranges recalculation.
- https://github.com/php/php-src/commit/abd0651020b39e35386d8ec438dea1562086d73c
- ext/opcache で、最適化レベルフラグで 6 ビット目と 7 ビット目 が立っていたら opcode 最適化処理の最後に zend_recalc_live_ranges() を再度かけず抜けるよう修正
- HAVE_DFA_PASS は zend_optimizer.c で通常は常時定義されるようになってるマクロ

## cmb69: [ci skip] Add opcache.preload directive
- https://github.com/php/php-src/commit/467d8b3ff78312f6bc8d9d2795a8feddbf03ce56
- デフォルトの php.ini に opcache.preload を追記

## dstogov: Use ZEND_FUNC_FREE_LOOP_VAR flag to avoid useless iterations.
- https://github.com/php/php-src/commit/6c983c6221cb3e02b253cd5379eda42fe0d6500d
- ext/opcache で、デッドコード削除処理の最適化
- 制御フローグラフ構築時に ZEND_FREE（switch での一時変数へのもの限定かな）、ZEND_FE_FREE を見てフラグ立ててる

## cmb69: [ci skip] List FFI extension
- https://github.com/php/php-src/commit/d0092c212584356c7c0868aa7b6869ca9c4e7968
- EXTENSIONS の拡張リストに FFI を追加
- internals で議論あったように Experimental として入ってるみたい

## dstogov: Fixed odd ROPE_ADD instruction placement.
- https://github.com/php/php-src/commit/960f922ed245d89a8f9fba92513add79c741a64f
- ROPE_ADD 命令が変なとこに出てたのを修正

## dstogov: Use SSA instead of bogus reverse linear scan.
- https://github.com/php/php-src/commit/8cb1ae92e6baf6b6497fa4bd3644d165452c574f
- ext/opcache で、opcode 解析処理のため一部でデッドコード削除を抑制するための判定処理を修正
- [昨日の修正](https://qiita.com/sj-i/items/494d253ae537165ec2dd#nikic-implement-single-pass-live-range-calculation)を修正してる形

## dstogov: Most opcodes that don't consume their OP1 operand, must be terminated with real consumer, and don't have to be checked.
- https://github.com/php/php-src/commit/a3503f0402ce996466de966e8105448aba5114cf
- [昨日の修正](https://qiita.com/sj-i/items/494d253ae537165ec2dd#nikic-implement-single-pass-live-range-calculation)を最適化
- 不要チェックの ZEND_ASSERT() 送りと分岐予測ヒントの追加

## nikic: Make tokenizer test robust against token renumbering
- https://github.com/php/php-src/commit/50ddff94b9989342e66678c311b3abf4e7d5a074
- ext/tokenizer のテストで、トークンのリナンバーがあっても壊れないよう期待出力を修正

## nikic: Implement ??= operator
- https://github.com/php/php-src/commit/a50198d0fef652ca052cda642d6e98a9101eb73f
- ??= 演算子の実装
- [RFC](https://wiki.php.net/rfc/null_coalesce_equal_operator) 受理後長らく放置されてたやつ

## nikic: Fixed bug [#77287](https://bugs.php.net/bug.php?id=77287)
- https://github.com/php/php-src/commit/76760901fabf8ff53c8dfb4ddf7ca703c5a12b79
- [7.3~]
- ext/opcache で、定数表コンパクションが ZEND_EXT_NOP と非互換だった問題の修正
- [前に「これかなあ」で修正してた](https://qiita.com/sj-i/items/7846d09e574189c95a02#nikic-possible-fix-for-bug-77287)とこの犯人見つけた奴
- opcache と xdebug 両方有効で出る問題

## cmb69: Prepare main branch for PHP 7.3.3
- https://github.com/php/php-src/commit/19a9a6ba242776901a1b9cf6b41ff52a9917665e
- [7.3~]
- 7.3 系の開発バージョンを 7.3.3　に
- 7.3.2 のリリースは 2/7 頃かな
Docker Desktopのインストール

# まとめ

- ``Homebrew Cask``を使って``Docker Desktop``を``Mac``にインストールした
- ``Docker.app``を起動しセットアップした
- ``Docker``関係のコマンドがインストールされていることを確認した

# ``docker``コマンドの検索

- ``docker``関係のフォーミュラはたくさんあった
- これらのコマンドを一つ一ついれてもいいのだと思う
- でも今、何が必要なのかよく分かっていないので``Casks``にあるフォーミュラをインストールすることにした

```bash
$ brew search docker
==> Formulae
docker                                docker-credential-helper-ecr          docker-machine-driver-xhyve
docker-clean                          docker-gen                            docker-machine-nfs
docker-cloud                          docker-ls                             docker-machine-parallels
docker-completion                     docker-machine                        docker-squash
docker-compose                        docker-machine-completion             docker-swarm
docker-compose-completion             docker-machine-driver-hyperkit        docker2aci
docker-credential-helper              docker-machine-driver-vultr

==> Casks
docker                              docker-edge                           docker-toolbox
```

# ``Homebrew Cask``を使ってインストール

- ``/Applications/Docker.app``がインストールされる

```bash:Homebrew-Caskを使ってインストール
$ brew cask install docker
==> Satisfying dependencies
==> Downloading https://download.docker.com/mac/stable/30215/Docker.dmg
######################################################################## 100.0%
==> Verifying SHA-256 checksum for Cask 'docker'.
==> Installing Cask docker
==> Moving App 'Docker.app' to '/Applications/Docker.app'.
🍺  docker was successfully installed!
```

# ``Docker Desktop``を起動する

- ``/Applications/Docker.app``を起動した
- 以下は、起動させたときに出てきた画面たち

## ``Docker Desktop``へようこそ

![docker-install-01.png](https://qiita-image-store.s3.amazonaws.com/0/273122/9920cd8f-11ca-c569-2183-d56671bef38a.png)

## 管理者パスワードの入力

![docker-install-02.png](https://qiita-image-store.s3.amazonaws.com/0/273122/aa3465e3-1f85-0926-a2c9-694c0155003f.png)

## 少し待つ

![docker-install-03.png](https://qiita-image-store.s3.amazonaws.com/0/273122/af58b9a0-b04f-7688-670e-c8fd423b62f8.png)

## ``Docker Desktop``が起動

![docker-install-04.png](https://qiita-image-store.s3.amazonaws.com/0/273122/f9b43e40-f589-4403-f3bd-d61fbce9417c.png)

- ``Docker ID``（``DockerHub``のアカウント）を持っていなかったので、新規に作成した
- 上の画面にてログインした

# インストールされたコマンド群を確認

- 必要なコマンドのエイリアスが``/usr/locak/bin/``に作成されていた

```bash:Docker.appを起動するとインストールされるコマンド
$ ls -ltr /usr/local/bin/
vpnkit -> /Applications/Docker.app/Contents/Resources/bin/com.docker.vpnkit
notary -> /Applications/Docker.app/Contents/Resources/bin/notary
kubectl.docker -> /Applications/Docker.app/Contents/Resources/bin/kubectl
kubectl -> /Applications/Docker.app/Contents/Resources/bin/kubectl
hyperkit -> /Applications/Docker.app/Contents/Resources/bin/com.docker.hyperkit
docker-machine -> /Applications/Docker.app/Contents/Resources/bin/docker-machine
docker-credential-osxkeychain -> /Applications/Docker.app/Contents/Resources/bin/docker-credential-osxkeychain
docker-compose -> /Applications/Docker.app/Contents/Resources/bin/docker-compose
docker -> /Applications/Docker.app/Contents/Resources/bin/docker
```
WSLからWindowsのDockerを使う

cmd.exe や powershell ではシェルとして物足りなく、WSLのdockerではパフォーマンスに難がある。
手元のシェルだけ WSL の bash を使い、Docker は Hyper-V のWindows版(Docker for Windows) を使いたい。

試した結果のメモ。

- Windows10 Pro 10.0.17763.134
- Docker for Windows (Hyper-V)
- WSL (Debian 16.04)
- [wsltty](https://github.com/mintty/wsltty)



## 結果
ターミナルに [wsltty](https://github.com/mintty/wsltty) を使い、WSLのbashをシェルとして使う。
2019/01現在、Ubuntu-16.04 にしている。

`docker.exe` と入力することで、Windows の Docker を実行できる。

```bash
[08:31:55 pen@gray2 ~]$ docker.exe --version
Docker version 18.09.1, build 4c52b90

[08:31:59 pen@gray2 ~]$ docker-compose.exe --version
docker-compose version 1.23.2, build 1110ad01

[08:32:05 pen@gray2 ~]$ docker-machine.exe --version
docker-machine.exe version 0.16.1, build cce350d7
```

コンテナにシェル接続もできた。

```bash
[08:38:40 pen@gray2 pen]$ docker.exe exec -it cent7test /bin/bash
[root@815db732d875 /]#
[root@815db732d875 /]# cat /etc/*-release | head -n1
CentOS Linux release 7.6.1810 (Core)
```

しかし wsltty がもっさりしているので、MSYS2から使った方がいい。
2つの絵文字を組み合わせてオリジナルを作るジェネレーター的な「絵文字ビルダー」が全然日本語でGoogle 検索できなかったので標識を残す ( 絵文字合成サービス )

2つの絵文字を組み合わせてオリジナルを作る「絵文字ビルダー」が全然日本語でGoogle 検索できなかったので標識を残す

「絵文字」「組み合わせ」とかでググりたい

https://phlntn.com/emojibuilder/

![image](https://user-images.githubusercontent.com/13635059/51572637-76bfb800-1ee9-11e9-87dd-a67e0606b7fd.png)










<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
AWSのRDBにphpMyAdminで接続する

#背景
[先日設定した環境](https://qiita.com/outase/items/244dbd6ec5c4e70030da)のRDBにphpMyAdminで接続してMySQLを色々操作したい。

#まず確認
###セキュリティーグループが設定できているか確認
コンソール画面からRDBインスタンスの設定を確認
![RDS · AWS Console 2019-01-23 08-02-53.png](https://qiita-image-store.s3.amazonaws.com/0/336536/1e5b5974-3505-7b59-f7a4-2cae308ade34.png)

3306にポートを通してます。
![RDB - EC2 Management Console 2019-01-23 08-05-22.png](https://qiita-image-store.s3.amazonaws.com/0/336536/06e27df6-6466-487c-3d75-f5c9debf3980.png)

#phpMyAdminの設定

ディレクトリ移動して

~~~
$ cd /var/www/html/phpMyAdmin
~~~

configファイルをコピー

~~~
$ cp config.sample.inc.php config.inc.php
~~~

下記のリンクを参考にconfigファイルを編集する。

[phpMyAdminでAWSのRDS接続する](https://qiita.com/eleven_2012/items/f99ac785de8acc77cdca)

#接続できました
![phpMyAdmin2019-01-23 08-11-32.png](https://qiita-image-store.s3.amazonaws.com/0/336536/53c381fd-edeb-437d-8ee0-afdc30ce3876.png)
C++初心者がMacでC++の開発環境を用意してコンパイルして実行する

C++を利用する機会ができたので、とりあえずMacで環境作ってみました。


## IDE

普段から利用しているVisual Studio Codeを利用することにしました。

環境構築は下記を参考にさせてもらいました。


Visual Studio Code Mac 開発環境構築[C++] | 三十路エンジニア Blog
http://westhillworker.com/visualstudiocode-cpp/

拡張機能から以下をインストールしてIDEを再読込。

- Code Runner
- C/C++

適当なフォルダをVSCodeで開いて、C++のファイルを作成。

```cpp:main.cpp
#include <iostream>

int main()
{
    std::cout << "Hello! World!" << std::endl;
    return 0;
}
```

VSCodeの右上の実行ボタンをクリックすると以下の用にコンパイル＆実行されました！

<img width="735" alt="main_cpp_—_hello-cpp.png" src="https://qiita-image-store.s3.amazonaws.com/0/48549/8e6b8c33-c873-a1ee-e096-dc6b3d8681c6.png">


```sh
[Running] cd "/任意のディレクトリ/" && g++ main.cpp -o main && "/任意のディレクトリ/"main
Hello! World!
```

`g++`ってので、コンパイルしているようですが、私の環境だとMacOSに最初から入ってる？コンパイラみたいです。

```sh
> g++ -v
Configured with: --prefix=/Library/Developer/CommandLineTools/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 10.0.0 (clang-1000.10.44.4)
Target: x86_64-apple-darwin17.7.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin

> gcc -v
Configured with: --prefix=/Library/Developer/CommandLineTools/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 10.0.0 (clang-1000.10.44.4)
Target: x86_64-apple-darwin17.7.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin
```


## まとめ

C++のことはまだ良くわかっていませんが、とりあえずいろいろとお試しできる環境ができました。


## 参考

Visual Studio Code Mac 開発環境構築[C++] | 三十路エンジニア Blog
http://westhillworker.com/visualstudiocode-cpp/

cout - cpprefjp C++日本語リファレンス
https://cpprefjp.github.io/reference/iostream/cout.html

標準出力に書き込む | 株式会社きじねこ
http://www.kijineko.co.jp/tech/cppsamples/stdout.html
FigmaでFont Awesomeを使えばいいことが待っている、きっと……

Figmaを触ってて、アイコン使いたいな〜っと思ってたら
Font Awesomeが簡単に使えるとのこと。
早速使ってみました。

※本記事の内容はFigmaの公式ドキュメントに既に書かれております(英語)
https://help.figma.com/article/250-working-with-fonts#icon

## 1. Font Awesomeにてアイコンをコピー
* チートシートからコピー
<img width="1680" alt="スクリーンショット 2019-01-23 7.08.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/241915/353230cf-08e8-cbe5-cfcb-e4de5bf2ecdb.png">
* またはアイコンの詳細からコピー
<img width="1680" alt="スクリーンショット 2019-01-23 7.08.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/241915/230bbcd1-cf65-3109-ece7-5f039c97f9a4.png">

## 2.  Figmaにてコピーしたアイコンを貼り付け、フォントを「Font Awesome 5 free」に設定
どこでもいいのでFigma上でコピーしたアイコンを commnad + v　で貼り付けます。
するとTextが置かれますが、まだアイコンは表示されていません。
<img width="1167" alt="スクリーンショット 2019-01-23 7.39.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/241915/83f4e664-b238-b92c-721b-80c5c51f2c0c.png">

フォントを「Font Awesome 5 Free」へ変更すると表示されます。
![FIgmaFontAwesome.gif](https://qiita-image-store.s3.amazonaws.com/0/241915/13a44eec-2a2b-ec67-4753-67517a7f37d3.gif)

以上です！！！

## おまけ.　アイコンを大きくしたいときはフォントサイズをいじります。
![IconSize.gif](https://qiita-image-store.s3.amazonaws.com/0/241915/82c405f2-9f5a-1684-dd9a-27b2ab31eaf2.gif)
大きくなって強そうにみえますね。

---
タイトルはこちらから自動生成しました。
http://www.copymecha.com/index.php
kintone プラグイン開発メモ　その４（設定値を保存・読み込みしてみる）

今回は、設定値を保存して、保存した設定値を読み込みしてみます。

# 設定値を保存する仕組み
設定値を保存する仕組みが用意されています。

 - 設定値の保存　[kintone.plugin.app.setConfig(config,callback)](https://developer.cybozu.io/hc/ja/articles/203661160#step2)
 - 設定値の読み込み　[kintone.plugin.app.getConfig(pluginId)](https://developer.cybozu.io/hc/ja/articles/203661160#step1)

こちらを使って保存と読み込みをすることができるようです。

 # 設定値を保存する
まずは資料の通りに設定してみます。

```config.js
(function (pluginId) {
    "use strict";
    window.addEventListener('DOMContentLoaded', function() {
        document.getElementById("button_submit").onclick = function() {
            var config = {
                "key1": "value1",
                "key2": "value2"
            };
            kintone.plugin.app.setConfig(config);
        };
    });

})(kintone.$PLUGIN_ID);
```

# 保存した設定値を表示する
上記で保存した設定を表示してみます

```config.js
(function (pluginId) {
    "use strict";
    window.addEventListener('DOMContentLoaded', function() {
        console.log(kintone.plugin.app.getConfig(pluginId));
        document.getElementById("button_submit").onclick = function() {
            let config = {
                "key1": "value1",
                "key2": "value2"
            };
            kintone.plugin.app.setConfig(config);
        };
    });

})(kintone.$PLUGIN_ID);
```
ログを確認します。
<img width="1125" alt="スクリーンショット 2019-01-23 7.41.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/214523/0ea39649-05e9-bd5a-00be-0cdd5d7df5e6.png">

設定した値を読み込みできました。
Word VBA Accessibility Check Compatibity Checkの窓を出現させる

#Accessibility
##まさかのコマンドバー

```visualbasic
Sub WordDocumentAccessibilityChecker()
CommandBars("Accessibility Checker").Visible = True
End Sub
```

#互換性チェック
##コマンドバーではない
しかし互換性チェックとかはこれでは出ません。
また自動的に改善してくれることはないようです。
たぶん組込みマクロをつかうしかないみたい。

```visualbasic
Sub WordDocumentCompatibility()
  Application.Run MacroName:="CompatChkr"
End Sub
```

これはクィックアクセスツールバーに登録して使うとかショートカットキーに登録して使えます。

[Excel VBA関数リファレンス - String、Space関数のページです。 - 自宅でプログラミング!](https://www.239-programing.com/excel-vba/func/func02D.html)
minishiftでcluster-adminを有効化する

minishiftでcruster-adminを有効化する方法

# add-on `admin-user` をONにする。

minishiftのadd-on`admin-user`をenableにしてapplyする。

```bash
$ minishift addons enable admin-user
Add-on 'admin-user' enabled

$ minishift addons apply admin-user
-- Applying addon 'admin-user':..
```

# `admin`でログインしてプロジェクトを`openshift`に変更する

`admin`でログインし`openshift`プロジェクトを選択します。

```bash
$ oc login $(minishift ip):8443 -u admin
Logged into "https://192.168.42.85:8443" as "admin" using existing credentials.

You have access to the following projects and can switch between them with 'oc project <projectname>':

    default
    kube-dns
    kube-proxy
    kube-public
    kube-system
  * myproject
    openshift
    openshift-apiserver
    openshift-controller-manager
    openshift-core-operators
    openshift-infra
    openshift-node
    openshift-service-cert-signer
    openshift-web-console

Using project "myproject".

$ oc project openshift
Now using project "openshift" on server "https://192.168.42.85:8443".
```
Remix IDEでデバッグする

私はSolidityの開発に、[Remix（リミックス）](https://remix.ethereum.org)というブラウザベースのIDEを使ってます。
RemixはSolidityのコンパル、デプロイまでブラウザでできるのでとっても便利です。

ですがデバッグについては、現時点ですごく難しいと感じました。
Remixはコードを書いたら画面右上のタブから諸々操作します。
タブをよーく見ると「Debugger」タブもしっかりありますね。
<img width="200" alt="20190121121638.png" src="https://qiita-image-store.s3.amazonaws.com/0/84601/9986a118-8cf2-65e4-afc5-6746f36199f7.png">
ここからデバッグできるのですが、このデバッグが非常に分かりづらい。
しかも挙動が怪しい時もあり、それがバグなのか自分の操作ミスなのか、切り分けも難しくて心が折れます。

そこでとりあえず簡単にデバッグするために、私はevent修飾子を利用してlogに情報を出力してます。
やり方はeventを事前に定義して、それをemitで呼び出します。
分かりづらいと思うので、簡単なSolidityのサンプルコードを用意しました。

```solidity
pragma solidity ^0.4.24;

contract Sample {

    mapping(uint => address) test;
    event eventDebugger(string dm, address test);
    
    function debuggTest() public {
        
        test[0] = msg.sender;
        string memory dm = "Hello debugg";
        
        emit eventDebugger(dm, test[0]);
    }
}
```

event修飾子で定義されたeventDebugger()が、今回デバッグするための関数です。
eventで定義した関数を、emitで発火させるイメージです。
emitはdebuggTest()の中で実行してます。

上記のコードをデプロイして実行すると、Remixのコンソールのlogsにデバッグ情報が出力されます。
下図の赤枠の箇所です。
![20190121235708.png](https://qiita-image-store.s3.amazonaws.com/0/84601/5afc1a6e-8681-1306-dac8-c767b8eb4d70.png)
ちょっと見づらいので、JSONの"logs"だけ抜粋しました。

```
"event": "eventDebugger",
        "args": {
            "0": "Hello debugg",
            "1": "0xCA35b7d915458EF540aDe6068dFe2F44E8fa733c",
            "dm": "Hello debugg",
            "test": "0xCA35b7d915458EF540aDe6068dFe2F44E8fa733c",
            "length": 2
        }
```

このようにeventで発火させた関数名があり、その中にパラメータで渡した値が出力されてます。
簡単なブロックチェーンアプリを作成するくらいなら、このやり方でも十分デバッグ可能です。

ちなみにweb3.jsというJSのライブラリを使うと、web3.js経由でargsの値をフロント側で受信できます。つまり、フロントエンドを実装する際にもこのevent機能は大いに価値を発揮するわけです。
というか本来はフロントにイベント通知するための機能なので、web3.jsを使ったフロントの実装はまた改めて学習します。
Ruby のメソッドのブロックのソースを取り出す

## 概要

Ruby のメソッドのブロックのソースを取り出すコードを書いてみました。

```ruby:block_source.rb
def inspector(ast:, &block)
  ast.children.each do |child|
    next unless child.instance_of?(RubyVM::AbstractSyntaxTree::Node)
    yield child
    inspector(ast: child, &block)
  end
end

def find_node(ast:, type:, lineno:)
  inspector(ast: ast) do |node|
    return node if node.type == type && node.first_lineno == lineno
  end

  nil
end

def extract_source(node:, source:)
  first_lineno = node.first_lineno - 1
  first_column = node.first_column
  last_lineno = node.last_lineno - 1
  last_column = node.last_column - 1

  if first_lineno == last_lineno
    source[first_lineno][first_column..last_column]
  else
    src = ' ' * first_column + source[first_lineno][first_column..]
    ((first_lineno + 1)...last_lineno).each do |lineno|
      src << source[lineno]
    end
    src << source[last_lineno][0..last_column]
  end
end

module Kernel
  # RUBY_VERSION >= '2.6.0'
  def block_source
    @file_specs ||= {}
    bl = caller_locations.last
    source = @file_specs.dig(bl.path, :source) || File.readlines(bl.path)
    @file_specs[bl.path] ||= { source: source, ast: RubyVM::AbstractSyntaxTree.parse(source.join) }
    node = find_node(
      ast: @file_specs.dig(bl.path, :ast),
      type: :ITER,
      lineno: bl.lineno
    )
    extract_source(node: node.children[1], source: source) if node
  end
end
```

使用法

```ruby:foo.rb
require_relative 'block_source'

def foo
  pp block_source
end

foo { 'hello' }   #=> " { 'hello' }"
foo { |i| i * 3 } #=> " { |i| i * 3 }"
foo               #=> nil
```

## コード解説

まず `bl = caller_locations.last` で `block_source` の呼び出し元の情報を取得。

```ruby
bl = caller_locations.last
```

次に `find_node` ブロック付きのメソッド呼び出しである `ITER` ノードを探します。

```ruby
    node = find_node(
      ast: @file_specs.dig(bl.path, :ast),
      type: :ITER,
      lineno: bl.lineno
    )
```

`find_node` の実装自体はかなりシンプルで `inspector` ですべてのノードの中から指定した `type` と `lineno` に一致したものを返すようにしています。

```ruby
def find_node(ast:, type:, lineno:)
  inspector(ast: ast) do |node|
    return node if node.type == type && node.first_lineno == lineno
  end

  nil
end
```

最後に見つけたノードからブロック部分のソースコードを抜き出します。 `ITER` ノードは `children` の 2番目の要素に block の情報が入っているのでそれを渡します。

```ruby
extract_source(node: node.children[1], source: source) if node
```

## TODO

個人的にあまりそういうコードを書かないので無視しましたが、同じ行でブロック付きメソッド呼び出しを複数回行うと、全部最初のブロックのソースしか取ってこないので、ここはもうちょっと頑張る必要がありそうです。（呼び出し元の `column` 情報が取れると良さそう

```ruby
foo { 'hello' }; bar { 'world' }
```

```
" { 'hello' }"
" { 'hello' }"
```
dockerでdockerグループ以外のユーザにdockerを使わせる (dockerの実行権限グループの変更)

# 注意
私はdocker2日程度の初心者です．ご注意ください． (追記2019/1/26：すでにコメントでいくつか指摘を頂きました．　そちらもご覧ください)

また，訂正ありましたら，コメント，編集リクエスト，なんでもください．世に間違ったHowToをはびこらせたくないです．

**訂正をコメントで頂くことができました。先にコメントを合わせて読まれることをオススメ致します**

# 話の経緯
dockerを扱うとき，rootになるかdockerグループに所属させるのが通常ですが（[ここ](https://qiita.com/matyapiro31/items/3e6398ce737e2cdb5a22)にあるように色々あるみたいですが）そんなんめんどくさい．いままで使ってきたグループ設定をそのまま使って，例えば，hogeグループの人をあたかもdockerグループのように扱えないか探していました．

ググると[dockerの実行グループを変更する](https://blog.sky-net.pw/article/120)という記事を発見できましたが，これができない．`daemon.json`も`dockerd -G`も何故かうまく行かない．

# 方法
僕の環境は
Ubuntu16.04
Docker version 18.09.1, build 4c52b90
です．

結論から述べると`docker.socket`を編集してください．
`docker.socket`のディレクトリは`docker.service`と同じところにあるはずです．[こちら](http://docs.docker.jp/engine/articles/configuring.html#id7)を参考にしてください．

以下dockerグループの代わりにhogeグループを使う手順です．

```bash
sudo vim <docker.socketの場所> 
#うちのは/lib/systemd/system/docker.socketでした
```
以下のように書き換える

```diff
-SocketGroup=docker
+SocketGroup=<hogeのgid>
```
最後に再起動

```bash
sudo systemctl daemon-reload
sudo systemctl restart docker 
```


# 解説
どうしてこれでできるのか．

![dockerの通信の仕組み](https://www.ogis-ri.co.jp/otc/hiroba/technical/docker/img/part6/docker-engine-overview.png)
[参考](https://www.ogis-ri.co.jp/otc/hiroba/technical/docker/part6.html)

そもそもdockerの操作はこの図にもあるように通常ホストOSからのアクセスであれば，Unixソケットを介して行われます．
dockerにアクセスする権限がないときに怒られるのは，このUnixソケットへのアクセス権がないからみたいです．

実際，`/var/run/docker.socket`を見てみてください．デフォルトではグループがdockerになっていると思います．だから，dockerグループでアクセスできたんですね．

本来このグループの設定は`daemon.json`や`dockerd -G`で変えられるはずですが（[dokcer docs](https://docs.docker.com/engine/reference/commandline/dockerd/)参考），ぼくの環境ではこれがどうしてかダメでした．

そこで，最終手段としての`docker.socket`の編集を試みたわけです．やってることは結局，みんな同じことを指してます．

# 感想
どうにも編集してるファイルが弄っちゃいけなさそうなファイルで怖い．でも，他がダメだったししょうがないと思っている．
未使用CSSセレクタを見つけて削除する方法〜2種比較〜【2019年版】

サイトが大きくなればなるほど未使用セレクタとか増えちゃってCSSで余計な容量食っちゃうらしい。
そんな時に、ページごとに使っていないセレクタを見つけて削除したい。

あとはページをリニューアルするときにフルスタックではなく、徐々に綺麗にするときに使えそう。

Chromeの仕様が変わり、開発者ツールの「Audits」項目から調べられなくなったので、
２点の方法を紹介。

* 開発者ツールの「Coverage」機能
* [Unused CSS](https://www.jitbit.com/unusedcss/)


## 開発者ツールの「Coverage」機能
Macの場合は、ショートカットが`「Command + Option + I」`
windowsの場合は`「Ctrl + Shift + I」`　で開く

デベロッパーツール上の開発者ツール右上に表示されている「・・・」が縦に並んだ設定ボタンをクリックし
「More tools」から「Coverage」を選択

![image.png](https://qiita-image-store.s3.amazonaws.com/0/279361/b6a0fd36-0859-a2c4-5623-8a9beb5a4e78.png)

`click the record button ● to start capturing coverage.`を押す。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/279361/463ad768-9443-e4ac-c3ee-1ba9085a0899.png)

以下の画像のようにCSSファイルを確認すると、要素の左側に緑色と赤色の線が表示される。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/279361/ab5904fc-d8ce-39f2-f988-dd97ecaaee57.png)

| 緑色の線で表示されている要素  | 閲覧中のページで使用している要素 |
|:-----------|:---------------|
| 赤色の線で表示されている要素 | 閲覧中のページで使用していない要素 |

「Coverage」を使用すればJavaScriptも同様にチェックできる。

## [Unused CSS](https://www.jitbit.com/unusedcss/)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/279361/2ac8dc0a-5e40-db11-ae61-396425b8f1d4.png)

リンクにURLをぶっこむだけ。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/279361/c4ba95ec-b781-c9c8-99e8-76a73615d483.png)

紐づくリンクも一緒に検索されてしまうのが少し面倒。

##未使用CSSセレクタの削除
あとは　[リンク記事](https://qiita.com/masamitsu-konya/items/2f8be11c5dd18432f35b#%E6%9C%AA%E4%BD%BF%E7%94%A8css%E3%82%BB%E3%83%AC%E3%82%AF%E3%82%BF%E3%81%AE%E5%89%8A%E9%99%A4) を参考に削除する。

まだ削除していないでの削除したら更新します。

## 結果
JSも検証できてページ単位で見るならChromeのデベロッパーツールが良さそう。
[Angular](Tips)  RxJSでキーボードイベントを使いこなす

 AngularでRxを書いた備忘録

バーコードリーダーで読み込んだ値を、特定のinput要素へ入力する必要があったのでそのときのメモ。(少しマニアックな要件かもしれない)

## キーボードイベントをひろう

Angularでキーイベントをひろう場合、特定のDOM要素に対してのイベントをひろう用途なので、以下のように書くことが多い。

```html:hoge.component.html
<input (keyup)="onKeyup($event)">

```
```typescript:hoge.component.ts
onKeyup(e: KeyboardEvent){
// ここでeventに対しての処理を書く
}

```
ここで流れてくるお決まりの`KeyboardEvent` の中身はここを読むとよさそう。
https://developer.mozilla.org/en-US/docs/Web/Events/keyup


**ただ今回は以下を実現する必要があった**

- ブラウザが開いていてブラウザ内のどこかにフォーカスが当たっているときのキーイベントが拾いたい 
  - documentのイベントをlisten
- バーコードリーダーで読み込まれた(入力された)文字の先頭に何文字かついてプレフィックスをもとに通常のキーボードからの入力と判別して、バーコードリーダーからの場合にのみ特定のinputに値が入るようにしたい
  - 1文字ずつ流れてくるキーイベントをある程度蓄積して判定


## 要素関係なくキーイベントをひろう (documentのイベントをListen)

```typescript:hoge.component.ts
fromEvent(document, 'keyup')
.subscribe((e: KeyboardEvent)=>{
// ここでeventに対しての処理を書く
});
```

## 1文字ずつ流れてくるキーをある程度の時間蓄積して判定

Rxで値を溜めるといえば `scan` オペレータ。

```typescript:hoge.component.ts
fromEvent(document, 'keyup').pipe(
  // イベントからkeyStringへ変換
  map((e: KeyboardEvent) => e.key),
  // 前の値とくっつける
  scan((acc, v) => (acc ? acc :'') + v , ''),
 // 100ms間、値が流れてこなかったら次に流す
  debounceTime(100),
).subscribe((e: KeyboardEvent)=>{
// ここでeventに対しての処理を書く
});
```
ただこう書くと、入力の100ms後にくっついた文字列が流れてくるが、scanは値を貯め続けてしまうのでリセットする必要がある。

scanのリセット用のSubjectを用意しておき、キーイベントのストリームが流れた100msにリセット用のSubjectに対してリセット依頼をかける作戦で書いてみた。
((冗長になってしまったし、もっといい書き方やオペレータあるはず、と思う。。 ))


```typescript:hoge.component.ts
// keyup用のSubscription
private keyup$: Subscription = new Subscription();
// keyReset用のSubject
private keyReset$: Subject<string> = new Subject<string>();
// バーコードリーダーのprefix
readonly barcodePrefix:string = 'barcode_'

form: FormGroup;  // コンストラクタでformGroupに FormControl('hoge')を作っておくとする

ngOnInit() {
 // documentからキーイベントをひろうObservable
 const documentKeyUp = fromEvent(document, 'keyup')
      .pipe(
        // イベントからkeyへ変換
        map((e: KeyboardEvent) => e.key),
        // 特殊キーを除く
        filter(keyString => keyString && (keyString.length === 1)),
      );

this.keyup$.add(
  // キー入力イベントとリセット用のObservableをマージする
  merge(documentKeyUp$, this.keyReset$)
    .pipe(
      // キーを溜める。'reset'が流れてきたら値をクリアする
      scan((acc, keyString) => {
        if (keyString === 'reset') {
          return null;
        }
        return (acc ? acc : '') + keyString;
      }, ''),
      // タイマーリセットのストリームを止める
      filter(value => value && (value !== '')),
      // 100ms値をためる
      debounceTime(100),
      // ためているキーのリセット依頼
      tap(() => this.keyReset$.next('reset')),
      //  バーコード端末からの入力でない場合は値を流さない(prefix有無の判定)
      filter(v => v && (v.indexOf(this.barcodePrefix) === 0)),
      // prefixを取り除く
      map(v => v.replace(this.barcodePrefix, '')),
  ).subscribe((withoutPrefixValue) => {
    // formへ値をセット
    this.form.get('hoge').setValue(withoutPrefixValue);
  }),
);
}

ngOnDestroy(): void {
  // 後始末
  this.keyup$.unsubscribe();
  this.keyReset$.unsubscribe();
}
```


## さいごに

Documentのイベントのリッスンはパフォーマンス的によくないので、Angularの外側で処理する以下の

` this.zone.runOutsideAngular(() => {})` の中でイベントをひろうような書き方をしたかったが、

いまいちわからず、今回はできなかった。。 


**ChangeDetectionが無駄に走らない書き方や、もっとスッキリ書けるようないいオペレータなどあればどなたか教えてください🙏🏻**
paiza POH botchi #ぼっちエンジニア


場所順です。

## Aランク

### 有名なプールサイド (ランキング問題)

置ける中で最大のオブジェクトを1個だけ配置することで3656点取れます。

```rb:1.rb
#!/usr/bin/ruby
H,W,N=gets.split.map &:to_i
R=H.times.map{[0]*W}
A=N.times.map{|i|
	[i+1]+gets.split.map(&:to_i)
}.select{|e|
	e[1]<=H && e[2]<=W
}.sort_by{|e|
	e[1]*e[2]
}
a=A[-1]
a[1].times{|i|a[2].times{|j|R[i][j]=a[0]}}
puts R.map{|e|e*' '}
```

## Bランク

### 高層タワー

```rb:2.rb
#!/usr/bin/ruby
gets
r=gets.chomp
$<.each{|e|
	e.chomp!
	n=[r.size,e.size].min.downto(0).find{|i|
		i.times.all?{|j|r[-i+j]==e[j]}
	}
	r<<e[n..-1]
}
puts r
```

### 砂漠の公園

```rb:3.rb
#!/usr/bin/ruby
n=gets.to_i
puts (1..n).map{|i|
	s=gets
	a=[s.count('W'),s.count('D'),s.count('L')]
	[i,a[0]*2+a[1],*a]
}.max_by{|e|e[1]}*' '
```

### 隔離された街のゲート

```rb:4.rb
#!/usr/bin/ruby
H,W,N=gets.split.map &:to_i
x=y=0
puts N.times.all?{
	dx,dy={'U'=>[0,1],'R'=>[1,0],'D'=>[0,-1],'L'=>[-1,0]}[gets.chomp]
	x+=dx
	y+=dy
	0<=x&&x<W && 0<=y&&y<H
} ? :valid : :invalid
```

## Cランク

### 荒れ果てたショップ

`*`は幅指定子です。Cのprintf(/scanf)でも共通。Cはフォーマット文字列を動的に作るのが困難なので使う場面はそれなりにあるかも。

```rb:5.rb
#!/usr/bin/ruby
N,A,B=gets.split.map &:to_i
(A..B).map{|e|puts'%0*d'%[N,e]}
```

### 機械の総合病院

正規表現で解く場合、`/.{3}/`ではなく、`/(.)\1\1/`が正解です。2WAも出してしまったつらいorz

```rb:6.rb
#!/usr/bin/ruby
s=gets.chomp
puts s.size>=6 &&
	(s.chars.any?{|c|('a'..'z').include? c} || s.chars.any?{|c|('A'..'Z').include? c}) &&
	s.chars.any?{|c|('0'..'9').include? c} &&
	s.scan(/(.)\1\1/).empty? ? :Valid : :Invalid
```

### 学べない学校

数値化して差の剰余を取ることはゴルフでは割とやると思います。

```rb:7.rb
gets
puts$<.map{|e|
	a,b=e.split.map{|e|'gcp'.index e}
	[
		[0,0],
		[0,1],
		[1,0],
	][(a-b)%3]
}.transpose.map &:sum
```

## Dランク

### 荒れ果てた警察署

(AWK、提出はBash)

```awk:8.awk
#!/usr/bin/awk -f
$0=($1+$2)%10a
```

### 荒れ果てたオフィス

Bashです

```sh:9.sh
#!/bin/sh
sed 1d|grep 3|cut -f1 -d\ 
```

わかりにくいですが、最後のバックスラッシュの後ろにはスペースが入っています。

### アンドロイドの生産工場

Python(3)を選びますよね？

\# てかこれ [enshura](https://paiza.jp/poh/enshura) 1問目と全く同じじゃないですか--;;;

```py:10.py
#!/usr/bin/env python3
print(input()[::2])
```

### 錆びついた電波塔

```rb:11.rb
#!/usr/bin/ruby
gets;p gets.split.map(&:to_i).count{|e|e>5}
```

### お金が引き出せない銀行

```rb:12.rb
#!/usr/bin/ruby
n=gets.to_i-gets.to_i;puts n<0?:error:n
```

----

そういえば今回、Tupleとしての用途でないArrayを使っていないな？Crystalだったら`[]`なし縛り可能かもしれぬ(提出できないので、やりませんが)
UNIXコマンド 使い方 入門

## コマンドラインとは
正しくはないけど、キーボードだけで操作する画面のことと思えばOKです
メモもかねて、プログラミングを始めた時に自分がよく使った基本的なコマンドだけまとめました

## コマンドについて
コマンドは、コンピューターに対する命令と覚えればOKです

## ディレクトリについて
###### ディレクトリとは
一般的によくきくフォルダのこと（UNIX系だとディレクトリということが多いらしい）
ファイルとフォルダを入れれる箱とイメージしたらOKです
###### カレントディレクトリとは
自分が今いるディレクトリのこと
###### ルートディレクトリとは
一番上のディレクトリのこと(それより上に行けないディレクトリのこと）
###### ホームディレクトリ
ユーザーがログインした時に最初に移動するディレクトリのこと

## よく使うコマンド一覧
僕がよく使ったコマンド一覧をまとめました

```
// 現在のディレクトリの確認：ルートディレクトリからカレントディレクトリまでの階層が全て表示される
$ pwd

// ディレクトリの中身を表示する：1つ子の階層のディレクトリとファイルが表示される
$ ls

// オプションで『 -a』を後につけると隠しファイルも表示される
$ ls -a

// ディレクトリの移動：ディレクトリ名を指定しないで『cd』だけだとホームディレクトリに移動する
$ cd ディレクトリ名

// 1つ親のディレクトリに移動：親のディレクトリ名を打つ必要はない
$ cd ..

// ディレクトリの作成：ディレクトリ名に入力した名前のディレクトリができる
$ mkdir ディレクトリ名

// ファイルの作成：ファイル名に入力した名前の空ファイルができる
$ touch ファイル名

// ファイルの中身を表示
$ cat ファイル名

// ファイル・ディレクトリを移動させる
// 移動さきのディレクトリ名で指定したディレクトリへファイルorディレクトリを移動させる
$ mv 移動したいファイル名・ディレクトリ名 移動さきのディレクトリ名

// ファイル名・ディレクトリ名の変更
// 移動の時と同じmvコマンドでできる
// ディレクトリ名の変更の時、新しいディレクトリ名と同じ名前のディレクトリが存在している時は上で書いた移動になる
$ mv ファイル名・ディレクトリ名 新しいファイル名・ディレクトリ名

// ファイルのコピー
$ cp ファイル名 コピーのファイル名

// ディレクトリーのコピー（cpの後に『-R』が必要）
$ cp -R ディレクトリ名　コピーのディレクトリ名

// ファイルの削除
$ rm ファイル名

// ディレクトリの削除
$ rm -r ディレクトリ名
```

## 補完機能
コマンドには嬉しいことに、ファイル名・ディレクトリ名の補完機能があります（感謝！！！）
**使い方は簡単、入力途中に『Tabキー』を押すだけでOK**
※補完されなかったら、入力途中の内容が間違っている可能性があるので、打ち直しましょう

## 参考
下に僕が初めて勉強した時に利用したサイトのリンクを貼ります
[ドットインストール](https://dotinstall.com/lessons/basic_unix_v2)
[Progate](https://prog-8.com/languages/commandline)
下はIT用語がわかりやすく書いてあるオススメのサイトです
[ピヨピヨくん](https://wa3.i-3-i.info/index.html)
Powershell では Dir /ah に相当するコマンドをどうするか

Dir /ahはXPなどの互換性のために作られているMy Documentを見るために使います
https://qiita.com/Q11Q/items/f8effdbfe4bd06a3ed6f

#Powershell で Dir /ahをする方法
Dir /A
/Aが指定された属性のファイルを表示
Hが隠しファイルになる。
しかし「指定された属性のファイルを表示」といっておきながら
D ディレクトリで
Dir /AD
でディレクトリが示される
#Powershellではどうするか

##管理者モードで

```Powershell
PS C:\users\name>Cd\
```

と入れてルートをみて、次のいずれかを入力

```powershell
PS C:\users\name>gci -Directory -Hidden -Force
PS C:\users\name>Dir -Directory -Hidden -Force
```
Gci、DirはGet-Childitemのエイリアス。エイリアスって別名という意味。
なぜDirがあるかというと、コマンドプロンプト(CMD.EXE)ではDirだったから。
そういう老人のために互換性が設けてあるのです。
上書き保存のアイコンが今はもう誰も使わないフロッピーディスクのようなものですね。

※-Forceはつけてもつけなくても変わらない気も
ERROR: SQLSTATE[42000]: Syntax error or access violation: 1067 Invalid default value for 'end_time'がでた場合

MYSQL5.7のマイグレーションをした際に以下のエラーが出た。

```
ERROR: SQLSTATE[42000]: Syntax error or access violation: 1067 Invalid default value for 'end_time'
```

データベースの設定に以下の設定を追加

```
sql_mode="allow_invalid_dates"
```

もしくは、設定項目にdbの設定部分に以下を追加(自分はこれで解決できなかった。)

```
'strict' => true 
```

参考にしたリンク
https://github.com/laravel/framework/issues/3602
TortoiseGitでMS Officeファイルのバージョン管理を行う

# はじめに
文章を作るのにMicrosoft Officeを使うことが多くあると思います。
一回作って終わりのファイルであればよいのですが、仕事や研究等で継続的に作成したファイルを更新を続けるようなケースではバージョン管理を行いたいです。

ツールを使わずに手動で履歴管理をやろうとすると、thesis_rev1.docx、thesis_提出前レビュー時.docx、などというようなファイルがフォルダの中に大量に出来てどれが最新かわからないというのは考えられるケースではないでしょうか。

本記事ではツールを使ってソースコードのバージョン管理と同じようにOfficeのバージョン管理を行う方法について紹介します。

# ツール導入
バージョン管理ツールにGitを使用します。
ただし、Officeのファイルはバイナリなので、そのままだと差分見てもわけがわからないので補助ツールとして、TortoiseGitと、WinMergeを使います。
とりあえず、これらをデフォルトでインストールしておきます。

記事作成時点で使用しているツールのバージョンと取得先は以下です。

## 使用ツール
- [Git for Windows v2.20.1](https://gitforwindows.org/)
- [TortoiseGit v2.7.0](https://tortoisegit.org/)
- [WinMerge v2.16.0.0](https://winmergejp.bitbucket.io/)

# GitでのOfficeファイルのバージョン管理
ソースコードなどの管理と何も変わりません。
Gitのリポジトリにファイルを追加して管理します。

TortoiseGitを使用してコミットをすると以下のような画面が出てきて、コミットする予定のファイルが表示されます。ダブルクリックすると差分が確認されます。

![tortoise_commit.jpg](https://qiita-image-store.s3.amazonaws.com/0/99189/73825f93-8d4b-012d-835a-26e6c2ce79d8.jpeg)

## 差分表示の仕組み
TortoiseGitで拡張子毎に、差分を見る方法が設定されています。
デフォルトでは、Officeで開いて変更箇所を表示するように設定されています。
設定箇所は図を参照

![tortoise_diff_setting.jpg](https://qiita-image-store.s3.amazonaws.com/0/99189/fa6a1a8f-bae6-1184-318c-f3cb79cab430.jpeg)
![tortoise_diff_extension.jpg](https://qiita-image-store.s3.amazonaws.com/0/99189/1976d65e-adb9-dc0b-5ada-4d3f231ffc07.jpeg)

# Officeの機能を使った差分確認
TortoiseGitをインストールして特に設定を変更していない場合はこちらになります。

Officeの機能を使って差分表示をしているので、該当するソフトウェアが立ち上がります。

適当に作ったファイルで変更を確認している様子を画像で貼ります。

## Word
![word_diff.png](https://qiita-image-store.s3.amazonaws.com/0/99189/3b161542-f4ef-f17b-1584-8078edbe4e1b.png)

## Excel
![excel_diff.png](https://qiita-image-store.s3.amazonaws.com/0/99189/fa220137-5dca-5ac7-dad1-160bf60ff085.png)

## PowerPoint
![powerpoint_diff.png](https://qiita-image-store.s3.amazonaws.com/0/99189/c4c9708f-c2ad-a10d-9512-6ba31b78ebb6.png)

# WinMergeによる差分確認
WinMergeを入れて、TortoiseGitの設定を変更して、WinMergeで差分を確認する設定にしているとWinMerge上で確認出来ます。
変更箇所がテキストで確認できるのでこちらの方が差分を見るのは良いと思います。

## Word
![word_winmerge.png](https://qiita-image-store.s3.amazonaws.com/0/99189/ea7c36b3-9a3b-3075-6bf6-fc27f71a635d.png)

## Excel
![excel_winmerge.png](https://qiita-image-store.s3.amazonaws.com/0/99189/d0082ee0-1d3f-3bf2-9f32-b99989a15953.png)

## PowerPoint
![powerpoint_winmerge.png](https://qiita-image-store.s3.amazonaws.com/0/99189/dac8d691-bff6-a6ed-4951-3b27321bf41f.png)

# おわりに
バイナリだろうが、バージョン管理しよう
import numpyでPyFPE_jbufが無いって言われる件

ズバリの記載がネットで見つけづらかったので書いておく。

このエラー。

```text
mtrand.cpython-35m-arm-linux-gnueabihf.so: undefined symbol: PyFPE_jbuf
```

当方は以下の環境で発生。
・RaspberryPi Zero Stretch Lite
・pyenv virtualenv
・Python 3.4.8、3.5.6
・numpy 1.14.5

import numpy を行うと上記のエラーで落ちる。

pyenv 環境でない通常の？OS直下のpython＆numpyは普通に動く。
ネットではpyenv以外のnumpyと衝突しているとか載っているが、全然上手くいかない。
色々と回り道とトライ&エラーの結局、以下のページを参考してPythonインストール時のコンパイルオプションを指定することで対応できた。
・[undefined symbol: PyFPE_jbuf on stock Ubuntu 17.10](https://github.com/pytoolz/cytoolz/issues/120)
・[pyenv Python 2.7 install to match Ubuntu server settings](https://gist.github.com/amontalenti/b734e5d51d25d6e0ab1353df36428085)
・[Fix fpectl-induced ABI breakage](https://bugs.python.org/issue29137)


今回の事象は、いまいちスッキリしないが以下の感じ？
・import numpy すると下の方で mtrand が import される。
・mtrand は PyFPE_jbuf を呼んでいる。
・Python が --with-fpectl なしでビルドされていると PyFPE_jbuf は作成されていない。
・結果落ちる。

mtrand.cpython-35m-arm-linux-gnueabihf.so の中を見ると確かに呼んでいる。

```
$ nm mtrand.cpython-35m-arm-linux-gnueabihf.so | grep PyFPE_jbuf
         U PyFPE_jbuf
```
　
　
こちらで上手くいった方法。
--with-fpectl 以外のオプションはやってみて拙かったら後で変える体で。（分かってない）

```text
export PYTHON_CONFIGURE_OPTS="--enable-ipv6\
                              --enable-unicode=ucs4\
                              --with-dbmliborder=bdb:gdbm\
                              --with-system-expat\
                              --with-system-ffi\
                              --with-fpectl"
pyenv install -f 3.5.6
pyenv virtualenv 3.5.6 p356
source activate p356
pip install numpy===1.14.5
python
> import numpy
うっし！
```
PEAR PHP go-pear.phar 改竄 ハッシュ確認用


<blockquote class="twitter-tweet" data-lang="ja"><p lang="en" dir="ltr">A security breach has been found on the <a href="https://t.co/dwKlscDEFf">https://t.co/dwKlscDEFf</a> webserver, with a tainted go-pear.phar discovered. <br>The PEAR website itself has been disabled until a known clean site can be rebuilt. A more detailed announcement will be on the PEAR Blog once it&#39;s back online.</p>&mdash; PEAR (@pear) <a href="https://twitter.com/pear/status/1086634389465956352?ref_src=twsrc%5Etfw">2019年1月19日</a></blockquote>

上記、問題あったらしいので確認用です。
間違いあったらコメントください。

コメントにご指摘ございましたので、記事を少々変更いたします。
公式リポジットリより、PEARをcloneし、go-pear.pharファイルのハッシュ値を比較します。

##公式リポジトリよりPEARをclone
```bash:terminal
git clone git@github.com:pear/pearweb_phars.git
```
##確認用スクリプト作成
https://gist.github.com/yasuken1990/9a612b62fa799aff7ec051269eb6bf91

```php:pearCheck.php
<?php

const COMPLETE_MESSAGE = 'OK';
const ERROR_MESSAGE = 'NG';

echo checkMd5Files($argv[1], $argv[2]);

function checkMd5Files($basePath, $targetPath) {
    $baseHash = md5_file($basePath);
    $targetHash = md5_file($targetPath);
    if ($baseHash === $targetHash) {
        return COMPLETE_MESSAGE;
    } else {
        return ERROR_MESSAGE ;
    }
}
```
##cloneしたgo-pear.pharと、環境に設置しているgo-pear.pharを比較
```bash:terminal
// 実行例: php check.php pearweb_phars/go-pear.phar go-pear.phar 
php pearCheck.php basePath targetPath

// ハッシュ値が同じ場合 OK
// ハッシュ値が違う場合 NG
```