OmniAICreator/Qiita-1.07M huggingface dataset:
Raspbian Buster 2020-02-05 Release-note 翻訳

(追記: 2020/2/14にRaspbian Buster 2020-02-13がリリースされています)
https://qiita.com/utaani/items/1ce74c697434a60fc713

http://downloads.raspberrypi.org/raspbian/release_notes.txt

2020-02-05：

  - Thonnyのバージョン3.2.6が含まれています-特にデバッグ時の速度の大幅な改善
  - Scratch 3バージョン1.0.4が含まれています-新しい「表示ステージ」および「表示スプライト」ブロックをSenseHAT拡張機能に追加し、コマンドラインからのファイルロードを追加。
  - Flash Playerのバージョン32.0.0.314が含まれます
  - NodeREDのバージョン1.0.3が含まれます
  - RealVNC Serverのバージョン6.6.0およびRealVNC Viewerのバージョン6.19.923が含まれます-オーディオのサポートを追加
  - Chromiumのバージョン78.0.3904.108が含まれています
  - OpenGL ES 3.1に準拠するためMesaを19.3.2に更新
  - ピクセル2倍化オプションを「Raspberry Piの設定」のプラットフォームに追加 FKMSディスプレイドライバーを使用
  - Orcaスクリーンリーダーを「推奨ソフトウェア」に追加
  - The Classics Pythonゲームのコードを「推奨ソフトウェア」に追加
  - ファイルマネージャー-マウントされたドライブを簡易ビューで表示するために、サイドバーの上部に新しい「場所」ペインを追加。
    タスクバーに追加された「新しいフォルダ」アイコン。ディレクトリブラウザのエキスパンダーがサブフォルダーの状態を正しく表示するように。
  - マルチモニターのサポートを改善-2番目のデスクトップ上のアイコンの配置が修正され、コンテキストメニューから起動したときに適切なタブで外観設定で開くように。
  - Raspberry Piタッチスクリーンがディスプレイと正しく整列
  - スタートアップウィザードおよび推奨ソフトウェアで、新しくパッケージをインストールする前にシステムクロックを同期。
  - タスクバーボリュームプラグインに追加されたミキサーダイアログ。個別のオーディオ設定アプリケーションを削除。
  - 「Raspberry Piの設定」- 表示オプション用に追加された別のタブ。スクリーンブランキングコントロールを追加
  - ボリュームタスクバープラグイン、raspi-configで、内部オーディオ出力（アナログおよびHDMI 1および2）の個別のALSAデバイスをサポートするように変更。
  - ボリューム、イジェクター、バッテリータスクバープラグインの堅牢性を向上。
  - 起動時のメニューボタンへのマウスポインターの移動は、lxpanel構成ファイルのグローバルセクションのpoint_at_menuパラメーターによって制御できるように。
  - シャットダウンオプションボックスを開くためのCtrl-Alt-DelおよびCtrl-Alt-Endショートカットを追加。
  - タスクマネージャーを開くためのCtrl-Shift-Escショートカットを追加。
  - OpenSSLでNEONルーチンを有効化。
  - Linuxカーネル4.19.93
  - Raspberry Piファームウェア67392a7a32bddad7f571047fccafca9eeb65d29c
dyld: Library not loaded: @rpath/Realm.framework/Realm


# 概要

Xcode 11.3.1 になってからなのか、iOS 13.3.1 になってからなのか不明だが、実機の場合になぜか下記のエラーが出るようになった。（シミュレーターはOK）

```
dyld: Library not loaded: @rpath/Realm.framework/Realm
```

下記を参考に Podfile を変更して動くようになりましたが、あまり理解できていないのでやる方は自己責任でお願いします。バグなのかは不明ですが、Apple Developer Program に登録していない場合になるみたいです。

https://github.com/Alamofire/Alamofire/issues/3051

## 2020/03/11 追記

上記リンクを再度確認してみたところ、ベータで修正されているようですので13.4がリリースされれば解消しそうですね。

>Can confirm, apps containing embedded frameworks installed with free Apple IDs are now working for me on iOS 13.4 beta 3 😄 Hopefully it stays fixed for GM!
>確認できます。無料のApple IDでインストールされた組み込みフレームワークを含むアプリは、iOS 13.4 beta 3で動作します。 😄 うまくいけば、それはGMのために固定されたままです！

## 対応策 

- use_frameworks! をコメントアウトして変わりに use_modular_headers! にして update。

```
# Uncomment the next line to define a global platform for your project
# platform :ios, '9.0'

target 'MyApp' do
  # Comment the next line if you don't want to use dynamic frameworks
  # use_frameworks!
  use_modular_headers!

  # Pods for MyApp
  pod 'RealmSwift'
end
```

- プロジェクトファイルの Frameworks, Libraries, and Embedded Content にあるフレームワークを変更。

```
Pods_MyApp.framework
↓↓↓
libPods-MyApp.a
```
CloudFormationでS3バケットを作成しようとしたら「Error Code: 400 Bad Request」となる

## 事象

```demo.yml
Parameters:
  bucketName:
    Type: String

Resources:
  Bucket:
    Type: AWS::S3::Bucket
    Properties:
      BucketName: !Sub $bucketName
```

AWS CLIで`create-stack`コマンドにより上記テンプレート`demo.yml`をもとにS3バケットを作成しようとした。

```shell
$ aws cloudformation create-stack \
  --stack-name demoStack \
  --template-body file://demo.yml \
  --parameters ParameterKey=bucketName,ParameterValue=$bucket_name
```

しかし下記のように`Error Code: 400 Bad Request`によりバケットの作成で`CREATE_FAILED`となりスタック作成がロールバックしてしまう。

![image.png](https://image.docbase.io/uploads/d7086efa-c16d-4dc8-a3c1-51f029c89f29.png)

```
Bad Request (Service: Amazon S3; Status Code: 400; Error Code: 400 Bad Request; Request ID: 82FD2F03945D2983; S3 Extended Request ID: 5keeRc+W8kea1g+S7tWqhXfeXvv+Fs9mhQnu5zlfiiWT1u2O86HFjP54qYiq4/hvcA1yw1M1hxY=)
```

## 解決

`BucketName`でのParametersの指定の仕方が誤っていることが原因だった。

- 誤：`!Sub $bucketName`
- 正：`!Sub ${bucketName}` または `!Ref bucketName`

```modified-demo.yml
Parameters:
  bucketName:
    Type: String

Resources:
  Bucket:
    Type: AWS::S3::Bucket
    Properties:
      BucketName: !Ref bucketName
```

上記の修正後のテンプレート`modified-demo.yml`であればS3バケットを正常に作成することができた。

![image.png](https://image.docbase.io/uploads/bcbb3400-4f46-4e5d-bc9d-c6f57595ca80.png)

以上
vscode + pytest 環境で tensorflow 使ってるとテストディスカバリが失敗する

# この記事は何

Python 開発環境を VSCode に移し中、pytest を VSCode 環境で動かそうと色々試すも何故かディスカバリに失敗してしまい、しばらく詰まったのでメモ。

# 背景

Remote Development で繋いでいる VSCode 環境で、新たに Python プロジェクトを作成しています。
Python 環境は poetry で作成し、テストのため pytest を導入しました。
CUI から pytest が `poetry run pytest` 問題なく実行できることを確認し、VSCode 上からテストを実行させようとしたところ、テストディスカバリに失敗しました。

# 原因

VSCode から pytest でテストディスカバリを行う際に、何故か標準出力があると失敗扱いになっていました。 
下記の issue などから何かしら標準出力があると失敗することが指摘されています。
https://github.com/microsoft/vscode-python/issues/6594
https://github.com/microsoft/vscode-python/issues/7574

TensorFlow を使っている場合、`import tensorflow as tf` するだけで色々 Warning だったりが出てしまいますが、それが原因だったようです。

# 解決策

上記 issue の通りです。TensorFlow の出力を制御するため、次のようなファイルを `.env` という名前でプロジェクトに置きます。

```:.env
TF_CPP_MIN_LOG_LEVEL='2'
```

TF のログ出力を制御するための環境変数です。2を設定することで、WARNINGまでは出なくなります。3にするとエラーも出なくなります。

他の種類の標準出力もなんらかの方法で出ないようにできれば、対策できそうです。

以上です。原因が標準出力だということに気づくのに時間かかったので、参考になれば...
Node.js - MySQL「Error: Cannot enqueue Query after invoking quit.」の対処（Connection pool）

## はじめに

本記事はデータベースにおける`コネクションプール（Connection pool）`について触れていくものです。

実際にハマったシチュエーションをもとに説明していきたいと思います。

* 事象の詳細
* 原因
* 状況を再現してみる
* 適切な対処方法
* コネクションプールの実装

## 事象の詳細

`Node.js`にて、`MySQL`からデータを取得しようとしたとき、以下のエラーが発生した。

`Error: Cannot enqueue Query after invoking quit.`

どうやら2回目の`GET:/api/todo`を呼び出した時に必ず発生するようです。
その時のソースコードは以下です。

```javascript
const express = require("express");
const mysql = require("mysql");
const app = express();

// データベースへのコネクションを生成
const connection = mysql.createConnection({
  // DB接続に関するオプション設定
});

connection.connect();

app.get("/api/todo", (req, res) => {
  const query = "SELECT * FROM todo;";

  connection.query(query, (err, rows) => {
    if (err) console.log("err: ", err);

    res.json(rows);
  });

  connection.end();
});

// サーバー起動
app.listen(8081, () => console.log("Example app listening on port 8081!"));

```

## 原因

### コネクションは再利用できない。

変数`connection`に対して、`end()`を呼び出し、丁寧に接続を切っています。
そこで再度`connection()`を呼び出せばまた接続できるのでは？という発想でした。

## 状況を再現してみる

### 実装した処理

同一のコネクションに対して、複数回接続を行う処理を作成してみました。

```javascript
const mysql = require("mysql");

const connection = mysql.createConnection({
  // DB接続に関するオプション設定
});

for (let index = 0; index < 2; index++) {
  connection.connect();

  const query = connection.query("SELECT * FROM todo;");
  query.on("result", (row, index) => {
    console.log("--- result ---");
    console.log(row);
    console.log(index);
  });

  connection.end();
}
```

### 処理結果

`node`コマンドを使って、この処理を実行すると、以下のようなエラーになります。

`Error: Cannot enqueue Handshake after invoking quit.`

一度使ったんだから、ちゃんと破棄してくれってことですね。

## 適切な対処方法

### 何度もアクセス要求ができる接続窓口を作ってあげる。

実際のWebアプリケーションでは、同一のデータベースに対して何度も接続する処理が行われます。
規模にもよりますが、多人数で利用することを考えると、その数は膨大なものになります。

よって、以下の観点からコネクション確立処理は極力減らしたほうが良いです。

* 本処理自体が`オーバーヘッド(overhead)`である
* コネクション確立には時間がかかるため、ユーザーを都度待たせてしまう
* コネクションの数だけDB側でメモリを確保する必要があるため、高負荷状態になりやすい

それらを実現するのが`コネクションプール(Connection pool)`です。

* コネクションの状態を保持し、そのコネクションを使いまわすことができる
* コネクション数に上限を設けることができる

## コネクションプールの実装

[MySQL - Pooling connections](
https://github.com/mysqljs/mysql#pooling-connections) を参考に、コネクションプールを作成し、複数回のデータベース接続処理を行ってみます。

使用する関数は`createPool()`です。
実行するクエリが一つの場合、以下のような書き方でOKです。

```javascript
const mysql = require("mysql");

const pool = mysql.createPool({
  // DB接続に関するオプション設定
});

pool.query("SELECT * FROM todo;", (error, results) => {
  if (error) throw error;
  console.log(results[0]);
});
```

プールが持つ`query`関数は`pool.getConnection()`、`connection.query()`、`connection.release() `を省略してくれます。

複数回のクエリ実行を行いたい場合などは以下です。

```javascript
pool.getConnection((err, connection) => {
  if (err) throw err;

  connection.query("SELECT something FROM sometable", (error, results) => {
    connection.release();

    if (error) throw error;

    console.log(results[0])
  });
});
```

## おわり

データベースに関する基礎的な知識が不足していたせいで、こんなところでハマってしまいました。
基礎的な部分を固めることができたと思うので、次の課題に取り組んでいきたいと思います。

あと、ライブラリのドキュメントに書いてあるとおりに実装していくと、コールバック地獄に陥りそうですね。
async/awaitなどを使ってもっとスマートに実装していきたいです。
nodeコマンド(non-blockngとblockingについてメモ）


# コマンドライン上で操作

node.jsではブラウザなどを使用せずにコマンドライン上で操作ができる

```sh
# コマンドライン上での操作開始を宣言
$ node

# この状態で処理を書くと実行される
> console.log('hello world')  # 出力結果: hello world

# 終了する
> .exit
```

# ｊｓファイルから実行
jsファイル`sample.js`を作成し、処理を実行させる

```sh
# コマンドライン上でjsファイルの処理開始を宣言
$ node sample.js
```

# non-blockngとblockingな書き方
- nodeはメインのスレッドが１つであるため、処理がブロックされるような書き方はnodeの処理の速さの特徴を殺してしまうためやめるべきである
- setTimeoutなどのタイマー処理やデータベースへのアクセス、ファイルの書き込みといった命令は処理に時間を要するため、次の命令をブロックしないように書く必要がある

そこで、non-blockingな書き方を採用し、時間がかかりそうな関数はcallback関数で実装することが望ましい

## non-blockingな書き方
次の処理をブロックしない書き方のこと

```javascript:
setTimeout(function() {
  console.log('hello');
}, 1000);
conosole.log('world')
```

setTimeout内の関数をcallback関数という
setTimeoutの内の処理を待たずに次の処理が実行される

## blockingな書き方

```javascript:
var start = new Data().getTime();
while (new Data().getTime() < start + 1000);
console.log('world');
```
ドットインストールの動画を観てXcodeの環境構築をしたときに詰まったところ

#Xcode11とドットインストール動画内での環境の違いと対策

これからSwiftの学習およびiOSアプリの開発を行いたいと考えている初学者の方が、恐らく私含めいらっしゃると思います。

動画で学習できるドットインストールを使って、まずは環境構築をしようとしたのですが、当時の動画内での設定(最終更新は2017年)とかなり違っていて時間を喰われたので、その具体的な内容と対策について情報共有します。

Qiitaへは初の投稿となり、至らないことも多いかと思いますが、該当される方は是非ご活用ください。

##SwiftUI
まずはプロジェクトを作成する場面です。下記画像の「Create a new Xcode project」を選択します。
おそらくここまでは動画内の説明のまま進めて大丈夫です。

　　　　　<img width="476" alt="スクリーンショット 2020-02-08 15.12.59.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581872/72b32da8-b85a-a10e-b9b2-7a8436b2bfba.png">

問題は次あたりに出てくるこの画面です。

　　　　　<img width="719" alt="スクリーンショット 2020-02-08 15.15.23.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581872/ba259781-bbb4-13d2-7abb-81bee85748cc.png">

User Interfaceの選択肢は、ドットインストールの動画内にはありませんでした。SwiftUIはざっと調べたところ、2019年6月ごろに発表された新しいUIのようです。

動画の通りに学習を進めていくと、「Main.storyboard」というファイル(iPhoneなどの画面にボタンなどの部品を配置できるファイル)を使うことがわかったのですが、SwiftUIを使用するとこれが見つかりません。おそらく代替ファイルのようなものはあると思いますが、慣れていないうちはStoryboardをUIとして選択することを推奨します。

##アシスタントエディター
動画内では画面右上の方に○が２つ重なったようなアイコンをクリックしてアシスタントエディターを表示させていましたが、Xcode11ではそのアイコンが無くなっています。ググってみたところ、対策については割と多く情報がありましたが、設定でアイコンを表示させるというようなことはできなさそうです。
これについては「Xcode11 アシスタントエディター」で検索してみてください。


##アシスタントエディターの画面分割
上記内容でググったところ、どうやらMain.storyboardファイルが表示されている状態で、編集したい新たなファイルをoption+クリックすればよいとの情報が多数確認できたので実際にやってみたんですが、画面が左右ではなく上下に分割されてしまいました。

このままでも良かったんですが、どうにもお互い狭い画面でしか確認できないのがストレスに感じそうだったので、解決方法を調べてみたところ、以下画像の一番左のアイコンで設定できることがわかりました。

　　　　　　　　　　　<img width="295" alt="スクリーンショット 2020-02-08 15.20.47.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581872/0f25a951-80ad-7542-b617-b4b6820aca6c.png">

画面全体でいうと一番右上あたりにまとまっていると思います。四角のなかに+マークがついているようなアイコンですが、こいつにoptionキーを押しながらカーソルを持っていくと、中の縦線の向きが変わります。(上記画像ではすでに左右分割の設定になっている)
これを変更した状態で再度、アシスタントエディターを表示したところ、無事に左右分割になってくれました。

他のサイト様を色々調べて回ったんですが、追加で表示したいファイルをoption+クリックで初めから左右分割できる、という記述が多く、自分の設定だけおかしいのか...と焦ってしまいました。

環境構築は私含め初学者の方が萎えやすいポイントかと思われますので、この記事が少しでもお力になれば幸いです。
特定要素のwidth基準のサイズ指定 by css&js

vwは便利ですけど、画面全体の幅基準なので、responsiveに幅の変化する要素を基準にはできませんね。
以下はそれをjsで実現するものです。


```css:css
:root{
   --base1: 0;
}

.title-box{
   position:relative;
}

.welcome{
   font-size: calc(var(--base1) * 8vw);
   margin-top: calc(var(--base1) * 17vw);
}
.title{
   font-size: calc(var(--base1) * 12vw);
   line-height: calc(var(--base1) * 12vw);
   margin-top: calc(var(--base1) * 3vw);
}
```

```html:html
<div data-calc-base="base1" class="title-box" >
   <div class="welcome">ようこそ！</div>
   <div class="title" >種子島へ！</div>
   <img src="/img/tanegasima/top.jpg" >
</div>
```

```js:js
$(window).on('load resize', ()=>{
   $('[data-calc-base]').each(function(){
      document.documentElement.style.setProperty(
         '--' + $(this).data('calc-base'), $(this).width() / $(window).width()
      );
   });
});
```


inspired by 
https://flex-font.com/how_to/
「k-Means法」について

kNN(k-nearest neighbor algorithm、k近傍法)の考え方

* 参考にしたもの：[機械学習のエッセンス](https://www.sbcr.jp/product/4797393965/)の第05章「機械学習アルゴリズム」

# k-Means法とは

* 機械学習のうち、教師なし学習のクラスタリングに用いられるアルゴリズムの一種
* クラスタリング: 与えられたデータを外的基準なしに自動的に分類する手法

# 考え方

1. 与えられたデータをいくつのグループ(クラスタ)に分けるか決める(これは手動)
2. ランダムにデータをクラスタに割り振る
3. 各クラスタの重心を計算する
4. 全データに対して、各クラスタの重心までの距離を計算し、一番近いクラスタに割り振りなおす
5. 割り振りなおしの前後で全データのクラスタが変わらなくなるまで、3,4を繰り返す

↓が実際にクラスタが割り振りなおされていく過程。紫の菱形が重心。計算は簡単(重心と距離だけ)なので割愛
![kMeans_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563901/db710b99-9818-4497-094e-0a0ba4423791.png)
![kMeans_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563901/123a2029-e974-987f-1733-10add215c2ad.png)
![kMeans_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563901/64d8975b-5e1e-b568-38a5-0480728da78c.png)
![kMeans_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563901/10fb4c23-a3c0-12e3-1ec2-c32a713fd7ee.png)
![kMeans_5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563901/f0ae70ff-3912-511b-9dfb-5d3b36a48a27.png)
![kMeans_6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563901/7b1dea24-1a4f-7a33-f86a-460830c1e5ed.png)

# 図作ったときのコード置き場

- https://github.com/kzy611/qiita/blob/master/kMeans.ipynb

# 参考リンク

- [k平均法(Wikipedia)](https://ja.wikipedia.org/wiki/K%E5%B9%B3%E5%9D%87%E6%B3%95)
- [クラスタリング (クラスター分析)](http://www.kamishima.net/jp/clustering/)
敢えてRubyで学ぶ「ゼロから作るDeep Learning」Docker環境構築編

# Dockerの環境構築

## やること

- ローカルのワーキングディレクトリを作成
- DockerでRubyの環境を作成
- Dockerで作成したワーキングディレクトリをマウントして環境に入る
- Dockerに必要なパッケージ等をインストール
    - gnuplot & numo-gnuplot
        - プロット用
    - numo-narray
        - 行列計算 & 基礎的な数学の関数(sin cos exp等)

## Docker環境を作って、ワーキングディレクトリをマウントする所まで
### 実行コマンド
```sh
# ローカルにワーキングディレクトリを作成
local$ mkdir working_dir
# RubyのDockerイメージを取得
local$ docker pull ruby:latest
# ワーキングディレクトリをマウントしてDocker環境に入る
local$ docker run -v /(workingディレクトリをおいているパス)/working_dir/:/working_dir/ -it ruby /bin/bash
```

### なぜワーキングディレクトリをマウントしておくか
gnuplotで出力したファイルを、Dockerファイルシステムの外で簡単に確認できる。ローカル環境にコピーするコマンドを叩かず、手元の環境(macOS)のプレビューアプリ等で出力したpngイメージを確認できるので便利。他にも、特に設定せずに、自分のお気に入りのエディタを使えるのもよい。

## Dockerに必要なパッケージ等をインストール
```sh
# gunuplotのインストール
docker$ apt update -y && apt upgrade -y && apt install -y gnuplot
# 各種gemのインストール
docker$ gem install numo-narray numo-gnuplot
```

## とりあえず動かしてみる
ローカルのワーキングディレクトリに先人の記事のファイルをそのまま作成
> Python vs Ruby 『ゼロから作るDeep Learning』 1章 sin関数とcos関数のグラフ
https://qiita.com/niwasawa/items/6d9aba43f3cdba5ca725

```sh
# ワーキングディレクトリへ移動
docker$ cd working_dir
# 作ったファイルがあるかの確認
docker:working_dir$ ls
sin_cons.rb # ←ちゃんとローカルで作ったファイルがある
# 実行
docker:working_dir$ ruby sin_cos.rb
docker:working_dir$ ls
ruby_graph.png  sin_cons.rb # ← 出力されている
```

### 結果
中身の確認。問題なくできた。
![ruby_graph.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293892/8a55eb13-5e67-879b-ba60-1f445794a47e.png)

# 備考：なぜRuby?
鳥取県米子市出身で、松江にサテライトオフィスを持つ企業で働いている為。
松江といえばMatzさん、Rubyの聖地。仕事でもRubyをつかうしね。
Laravelのインストールやデプロイの自分用メモ

# まじで自分用のメモ。
メモだけどおかしいところは突っ込んでもらえたらよろこびます。
パーミッション関係に自信がない・・・

## サーバの初期設定
	$ yum-config-manager --enable remi-php71をしている状態です
	$ yum install --enablerepo=remi,remi-php71,remi-php73 php-zip
  	$ yum -y install php-zip
	$ composer global require laravel/installer
パスの登録
macOSとGNU／Linuxディストリビューション:

	$ HOME/.composer/vendor/bin
	~/.bash_profile に下記を追加
	PATH=$PATH:$HOME/.composer/vendor/bin
							PATH=$PATH:$HOME/.config/composer/vendor/bin かも
	  source ~/.bash_profile

apahceのmod_rewriteを有効にする

	 find / -name 'mod_rewrite.so'
	 find / -name 'httpd.conf'

	 下記をhttpd.confの一番下とかに追加する
	 LoadModule rewrite_module modules/mod_rewrite.so
	 httpd.confのAllowOverride NoneをすべてAllowOverride Allにかきかえる

Laravel最新版を使う場合はmariaDBのバージョンもふさわしく新しくする必要あり
	 https://www.petitmonte.com/linux/mariadb_install.html

プロジェクトの初期設定
	htaccessをいじる

開発作業

	laravel new [プロジェクト名]

## デプロイ作業
Laravelプロジェクトをgithubからダウンロードした直後にやること

	https://blog.capilano-fw.com/?p=289#i-4
	.envファイルの設定
	config/app.phpの'timezone' => 'UTC'を'timezone' => 'Asia/Tokyo'とする
	# composer install --no-dev
	# php artisan storage:link
	# sudo chmod 777 storage -R
	# sudo chown -R apache:apache storage　//ログ書き込みエラーで失敗する対策
	# sudo chmod 777 bootstrap/cache -R
	# php artisan key:generate
	# npm install
	# npm run prod
	# mysql -u 'ユーザ名' -p'パスワード'
	mysql> CREATE DATABASE example CHARACTER SET utf8mb4;
	mysql> CREATE USER 'ユーザー名'@'ホスト名' IDENTIFIED BY 'パスワード';
	mysql> GRANT ALL PRIVILEGES ON `dbname`.* TO 'username'@'hostname'  IDENTIFIED BY 'password';

### （キューを使う場合は）キューの非同期処理
プロセス生成
/etc/supervisord.conf に設定を追加
supervisorの設定をする
https://readouble.com/laravel/5.5/ja/queues.html を参照すること

    # sudo supervisorctl reread
    # sudo supervisorctl update
    # sudo supervisorctl start laravel-worker:*
  	失敗時のテーブル生成(これはmigrationファイルがGitに登録されているはずなので不要)
    # php artisan queue:failed-table（）
    # php artisan migrate

### DBのバックアップを定期的に取る
下記を参考にする
試しにバックアップとリストアをして、DBが復旧できることを確認する。
    https://centosinstall.com/centos/database/mysql-backup
    https://qiita.com/macer_fkm/items/d920ff77f0f5ae5484f9
休みの日を数える

小ネタ
#はじめに
国民の祝日で建国記念の日が正式な名前だと知って、ふと数えてみたくなった。
#SPL
```java:holiday.spl
| gentimes start=01/01/2020 end=12/31/2020
| eval _time=starttime
| eval holiday=if(tonumber(strftime(starttime,"%w")) % 6 = 0,1,0)
| append
[| makeresults
| eval _raw="Date,Weekday,Note
2020年1月01日,(水),元日
2020年1月13日,(月),成人の日
2020年2月11日,(火),建国記念の日
2020年2月23日,(日),天皇誕生日
2020年2月24日,(月),振替休日
2020年3月20日,(金),春分の日
2020年4月29日,(水),昭和の日
2020年5月03日,(日),憲法記念日
2020年5月06日,(月),振替休日
2020年5月04日,(月),みどりの日
2020年5月05日,(火),こどもの日
2020年7月23日,(木),海の日（2020年のみこの日）
2020年7月24日,(金),スポーツの日（2020年のみこの日）
2020年8月10日,(月),山の日（2020年のみこの日）
2020年9月21日,(月),敬老の日
2020年9月22日,(火),秋分の日
2020年11月03日,(火),文化の日
2020年11月23日,(月),勤労感謝の日"
| multikv forceheader=1
| table Date,Weekday,Note
| eval _time=strptime(Date,"%Y年%m月%d日")
| eval holiday=1]
| stats dc(eval(strftime(_time,"%F"))) as Total sum(holiday) as holiday
| eval onduty=Total - holiday
```
データは[ここ](http://calendar.infocharge.net/)からもらいました。
#結果
| Total | holiday | onduty |
|--:|--:|--:|
| 365 | 122 | 243 |
#解説
`| eval holiday=if(tonumber(strftime(starttime,"%w")) % 6 = 0,1,0)`
で日曜日`0`と土曜日`6`にフラグを立てている。週休二日制です。
`strptime()`で日本語は大丈夫かと思ったけど、大丈夫でした。
#まとめ
こんなに休めるのかな:sweat:
[Microservices] FreezeTime Middleware

# 概要

世の中には様々なシステムがあるが、それぞれ皆E2Eテストを一生懸命書いていると思う。
そういうテストには「月末」や「年末」に動きが変わる事を確認したい、というテストもあるだろう。
このような、「実際にその時刻にならないとテストできない」ようなテストは時々ある。
こういう時「システム時刻を変更してテストする」事でテストしているような現場もあるのではないだろうか？

しかもmicroservice architectureだと複数のシステムが連携して動作するので、それら全ての時刻について考える必要があるので難しさはさらに上がる。

これをどうテストするのか？。
「こんな風にしてみた」という紹介記事。

# 構成

PythonにFreezeGunという時刻をモックするライブラリがあるが、これを使って分散システム全体の時刻をモックしてしまおう！というのがこの文章で書きたい事。

## 手順

1. 全てのmicroserviceのヘッダに、`x-freeze-time : {epoch time}`というヘッダを追加する。テストを実行するときは、それぞれのリクエストにモックしたい時刻を付与して実行する。
  > もちろんヘッダがないときは現実の時刻を使うよ！

2. 内部リクエスト（microservice -> 別のmicroservice呼び出し）時は、このヘッダをパススルーする。
3. FreezeTimeMiddlewareを準備する

というのがおおまかな手順。さて、FreezeTimeMiddlewareとは？

## FreezeGun

FreezeGunは、unittestのために時刻をモックする、pythonのライブラリ。
https://github.com/spulec/freezegun

通常は、こんな感じでunitttestで使用する。

```py
    @freeze_time("2000-01-11 00:00:00")
    def test_hoge(self):
        """hogeのテスト"""
        # ここでdatetime.Nowするとモックされた時刻が帰るよ！
```


これを使って、E2Eテストのための時刻モック機構を準備する。
我々はDjango Rest Frameworkを使ったので、Django Middlewareとして実装している。

## FreezeTime Middleware

```py
import logging
from freezegun import freeze_time
from datetime import datetime, timezone

log = logging.getLogger(__name__)

# set libraries you want to ignore mock by freezegun.
freeze_time_ignore = ['boto3', 'botocore']

class FreezeTimeMiddleware:
    """Mock python datetime by header 'x-freeze-time'"""

    def __init__(self, get_response):
        """Override"""
        self.get_response = get_response
        log.warning("FreezeTimeMiddleware initialized. (don't use in production!)")

    def __call__(self, request):
        """Override"""
        epoch = int(request.META.get("HTTP_X_FREEZE_TIME", 0))
        if epoch:
            mock_datetime = datetime.fromtimestamp(epoch, tz=timezone.utc)
            log.warning("mock python datetime as %s", mock_datetime)
            with freeze_time(mock_datetime, ignore=freeze_time_ignore):
                return self.get_response(request)
        else:
            return self.get_response(request)
```

やっていることは単純なので見ればわかると思う。

## 注意点

* boto3やbotocore（AWSライブラリ）までモックしてしまうと、クラウドサービスへのリクエストを認証するためのSign時刻が狂って認証に失敗する。こういう「ロジックと関係のないライブラリ」はモックしないようignoreしておく必要がある。おそらくどのクラウドでも事情は似たようなものだろう。

* `X-`系ヘッダは、内部リクエスト（microservice-microservice連携）時は全てパススルーするように、標準のrequestsをラップするような内部リクエスト用ライブラリを準備しておくと、ヘッダ連携に関しては心配する事がなくなると思う。

> パススルーとは？
> 要するに、自分がリクエストを受けたとき、リクエストに付与されていたヘッダを、自分から他のサービスにリクエストするときにそのまま同じものを送信するという事。

# 結論

これはPython Djangoだが、他の言語でもやることは同じのはず。時刻が関わるE2Eテストの実行はとても難しいので、こういう方法を準備してやれば時刻に関わるE2Eテストが怖くなくなるのではないだろうかと思う。
EXCELで５ミリ方眼旋盤CAD（準備）


# 描写する前に全図形を削除

何度でも試行できるように、TESTマクロを実行する前にアクティブシートの全図形を削除します。

```vb
Sub 全図形削除()
    For Each S In ActiveSheet.Shapes
        S.Delete
    Next S
End Sub
```

# EXCEL方眼の１枡を5mmにする

１枡の四角をB2に作成します。B2の高さ、幅を変更すると
つられて四角形も形を変えるので、5mm四角になるように調整します。
図形の書式設定をみると、縦横19ピクセルで5mm方眼ができることがわかりました。

```vb
Sub TEST()
    Call 全図形削除
    Call 方形("B2")
End Sub

Sub 方形(R, Optional T = 1)
    Set R = Range(R)
    With ActiveSheet.Shapes.AddShape(T, R.Left, R.Top, R.Width, R.Height)
        .Line.ForeColor.RGB = vbBlack
              .Fill.Visible = False
    End With
End Sub
```

# 方眼に図形を合わせる比率

20枡x20枡の方形と100x100の図形を比較します。　
方形が10.05cm x 10.05cm
方形が 3.53cm x  3.53cm
比率 2.847 ≒ 10.05 / 3.53 
なので、関数RF_で補正をかけます。

```vb
Sub TEST()
    Call 全図形削除
    Call 方形("B2")
    Call 方形("B2:U21")
    Call 図形("B2", 1, 100, 100)
End Sub

'Function RF_(L, Optional 倍率 = 1)
'   RF_ = L
'End Function
 
Function RF_(L, Optional 倍率 = 1)
    RF_ = L * 2.847 * 倍率
End Function

Sub 図形(R, Optional T = 1, Optional RH = 100, Optional RW = 100, Optional B = 1)
    With ActiveSheet.Shapes.AddShape(T, Range(R).Left, Range(R).Top, RF_(RW, B), RF_(RH, B))
        .Line.ForeColor.RGB = RGB(0, 0, 0)
        .Fill.Visible = False
    End With
End Sub
```


# XZ軸を表示する。

旋盤の場合は、縦方向がX軸。横方向がZ軸になるため、D10が原点になるようにXZ軸を表示させます。
セル幅、セル高さの変更時に図形が変形、移動しないように図形のplacement を　xlFreeFloating
とします。

```vb

Sub TEST()
   
    Call 全図形削除
    Call 方形("B2")
    Call 方形("B2:U21")
    Call 図形("B2", 1, 100, 100)

    Call XZ_AXIS("D10")
    
    For Each S In ActiveSheet.Shapes
        S.Placement = xlFreeFloating
    Next S
End Sub

Sub XZ_AXIS(Optional R = "D10", Optional X = 60, Optional Z = 80, Optional B = 1)

    GX = Range(R).Top
    GZ = Range(R).Left
    RZ = Range(R).Width
    
    X = RF_(X, B)
    Z = RF_(Z, B)
    
    With ActiveSheet.Shapes.AddLine(GZ - RZ, GX, GZ + Z, GX).Line
        .ForeColor.RGB = vbRed
        .Weight = 1.2
        .DashStyle = msoLineDashDot
    End With
        
    With ActiveSheet.Shapes.AddLine(GZ, GX - X / 2, GZ, GX + X / 2).Line
        .ForeColor.RGB = vbBlue
        .Weight = 1.2
        .DashStyle = msoLineDashDot
    End With
End Sub
```
色々付け加えて、下図のようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184069/cfc02f6f-2a2f-7fa5-1409-d9b0ad3b96a6.png)
RK3399 board buildroot

I was a little confused when I try to build buildroot because I was new to buildroot. 
So I write this article to help you ,If you are in the same situation as me.
you can see the link below at wiki.friendlyarm.com but It upset me a bit.
[buildroot for RK3399 at wiki.friendlyarm.com](http://wiki.friendlyarm.com/wiki/index.php/Buildroot_for_RK3399)

##1 : Install repo Utility
```
git clone https://github.com/friendlyarm/repo
sudo cp repo/repo/usr/bin/
```

##2 : Retrive Repo Package from Github
```
mkdir linuxsdk-friendlyelec
cd linuxsdk-friendlyelec
repo init -u https://github.com/friendlyarm/buildroot_manifests -b master -m rk3399_linux_release.xml --repo-url=https://github.com/rockchip-linux/repo --no-clone-bundle
repo sync -c --no-clone-bundle
```

##3 : Setup Compilation Environment
```
sudo apt-get install repo git gitk git-gui gcc-arm-linux-gnueabihf u-boot-tools device-tree-compiler gcc-aarch64-linux-gnu mtools parted libudev-dev libusb-1.0-0-dev python-linaro-image-tools linaro-image-tools autoconf autotools-dev libsigsegv2 m4 intltool libdrm-dev curl sed make binutils build-essential gcc g++ bash patch gzip bzip2 perl tar cpio python unzip rsync file bc wget libncurses5 libqt4-dev libglib2.0-dev libgtk2.0-dev libglade2-dev cvs git mercurial rsync openssh-client subversion asciidoc w3m dblatex graphviz python-matplotlib libc6:i386 libssl-dev texinfo liblz4-tool genext2fs lib32stdc++6
```
you'll see `sudo apt-get install repo git-core...`at wiki.friendlyarm.com but I couldn't use it so just `sudo apt-get install repo git ...`

##4 : Compile Code

####1.0 : kernel
```
./build.sh kernel
```
it will take 3-10 minute
####1.1 : u-boot
```
./build.sh uboot
```
it will take a few minute
####1.2 : rootfs
```
./build.sh rootfs
```
it will take a few hours
##5 : Generate Image for SD Card or EMMC
####1.0 : Generate Image for SD Card
```
sudo ./build.sh sd-img
```
####1.1 : Flash an image to an SD card:
The "/dev/sdX" needs to be replaced with your actual SD card device name.

```
./friendlyelec/rk3399/sd-fuse_rk3399/fusing.sh /dev/sdX buildroot
```
---
####2.0 : Generate Image for EMMC(Eflasher)
```
sudo ./build.sh emmc-img
``` 
##Check Help Info
<img width="500" alt="buildroothelp.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563531/9f8655d0-67cf-238d-36ec-445b73f7eeda.png">

I will also write a article for Customize Buildroot
golang で簡単なポーリング処理をサンプルで書いてみた

## はじめに

AWS などのサービスは、何かの操作を実行し、リソースのステータス状況を API で確認することがあると思います。

そのステータスの変化を API で確認したいとき、golang でどう書くかを簡単ですが書いてみました。

## tl;dr

無限 for ループを使うやり方が簡単そうでした。以下サンプルです。

```go
package main

import (
	"fmt"
	"time"
)

var count int

func callApi() bool {
	if count >= 2 {
		return false
	}
	count++
	return true
}

func main() {
	result := true
	for result {
		result = callApi()
		fmt.Println("Waiting...")
		time.Sleep(1 * time.Second)
	}
	fmt.Println("Finish")
}
```

一定回数呼ばれたら true/false が変わる関数 `callApi` で API のステータス変化を簡易的に表してみました。

結果は以下のような形です。

```
Waiting...
Waiting...
Waiting...
Waiting...
Finish
```

## おわりに

単体の API の処理であればこれで十分なのかなと思いました。golang には channel という並行処理を行う仕組みもあるようなので、その使い方も調べてみようと思います。

## 参考

* [A Tour of Go](https://tour.golang.org/flowcontrol/1)
非技術面でECサイトの運用を効率化する方法まとめ

昨年（2019年）、約9ヶ月間におよび、ECサイトの運用作業を担当する機会がありました。
運用作業の効率化といえば、ツール等を思い浮かべる方もいるかと思いますが、非技術面からでも運用の効率化は十分に可能。
自身の経験をふまえ、その方法について、まとめてみました。

## 当時の体制と役割
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/3c0ccb91-004c-f8d8-5278-043f9a3d85d1.png)

上の図が、運用担当をしていた時のおおよその体制図と役割です。
運用の主なお仕事は、カスタマーサポートからのシステム関連の問い合わせ対応で、

- ログの確認によるエンドユーザーの操作状況の把握
- システムの不具合有無の調査と軽度な改修

といった内容。
運用チームでは対応が難しい内容については、デザインチーム、開発チームに依頼して対応してもらう、という流れです。

なお、システム監視などの定常作業は他社移管しており、担当外でしたので、それに関する内容については記載していません。

## やったこと

以下に運用効率化のために、実際にやったことを記載します。

### 1. よくある問い合わせまとめ
よくある問い合わせについては、その確認方法とポイントをまとめておきます。
例えば、ユーザーがどのような操作をしたかをログで確認する場合、

- 実行コマンド
- ログのどの部分に注目すればよいか

などを、マニュアル化します。
ExcelやWordにまとめて共有サーバに配置するのでもいいでしょうし、QastやKibelaなどの社内Wikiサービスを使うのもいいでしょう。

### 2. 問い合わせ票のテンプレート化（対カスタマーサポート）
カスタマーサポートからの問い合わせには、問い合わせ票代わりにBacklogにチケットを起票してもらっていましたが、人によって記載内容がまちまち。
必要な情報が欠けていて、調査に時間がかかったり、やりとりの回数が多くなったりと無駄が発生してしまったことも多々ありました。

そこで、問い合わせ票に記載してほしい内容をテンプレート化しました。

簡略化した書き方にはなりますが、以下のような感じ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/ad16bb33-af32-72d8-e6bb-866aa9c6d48e.png)




メールやチャットでやり取りする場合も、同様にテンプレートを作っておくといいでしょう。

### 3. 最低限エンドユーザーにヒアリングしてほしい項目まとめ（対カスタマーサポート）
よくある問い合わせ内容のうち、カスタマーサポートからエンドユーザーに最低限ヒアリングしてほしい事項をまとめ、共有します。
特に、電話での問い合わせの場合、エンドユーザーが怒っていてただでさえでもカスタマーサポートの方が対応に苦戦を強いられる場合も多々。
ヒアリング内容をあらかじめ決めておくことで、カスタマーサポートの負担とこちらまで来る問い合わせの低減が期待できます。


### 4. ヘルプサイトの充実化（対エンドユーザー）
たいていのサイトには、ヘルプサイトはあると思いますが、最低限の内容だけ記載して、あとはそのまま、なんてこともあるのではないでしょうか。
よく問い合わせが来るようになった、かつ、エンドユーザーでも対処可能な内容についてはどんどん追記していきましょう。
完了したらカスタマーサポートにも連携して、該当の問い合わせのあったエンドユーザーには、次回以降ヘルプサイトを確認するよう案内してもらうようにすることも忘れずに。
そうすることで、エンドユーザーからの問い合わせそのものの低減が期待できます。

### 5. 他チームとの役割分担明確化（対デザイン、開発チーム）
他チーム（自身の場合は対デザイン、開発チーム）との役割分担を明確化しておきます。

例えば、表示周りの不具合の場合は、デザインチームにも調査してもらうとか。
実際にあったのが、サイトの日付表示がおかしく、サーバーサイド側の問題かと思いきや、デザイン担当者が埋め込んだ時刻の記述が原因だったというもの。
何度か同様の事象が発生したので、上述の通り、デザインチームにも対応してもらうことになりました。

プロジェクトによって、チーム体制や担当範囲が異なってくるので、その辺りを把握し、うまく役割分担、そして、明文化しておきましょう。
そうすることで、対応完了までのスピードを上げることができます。

## 終わりに
内容としてはいたって普通なものだったかと思いますが、いざやるとなると、なかなか思いつかないもの。
頭の片隅にでもとどめておいて、いざ機会があったらお役立ていただければ幸いです。

## 参考
[【2020年版】社内情報共有ツールのメリットとおすすめ10選 | ナレッジハック](https://knowledge-hack.jp/archives/942#chumidashi1)
WPFでDataGridにデータ(DataTable,DataView)を表示して絞り込み表示したり数値順ソートしたりその他色々

WPFでリスト的なデータを表示するときに `DataGrid` を使うことがあると思いますが、その使い方について調べたことのメモです。

## 開発環境

- Windows 10
- Visual Studio 2019
- Prism 7.2

## DataGridにデータを表示する

データを `ItemsSource` プロパティにバインドします。
データとして今回は `DataTable` を使います。そして後々フィルタリングをしたいので `DataTable` から `DataView` をつくってバインドします。
列ヘッダの名前とかを指定したいので、`AutoGenerateColumns=False` にしてXAMLに列を定義します。

```ExampleViewModel.cs
private DataTable _data;
public DataView Data { get; private set; }

...

_data = new DataTable();

_data.Columns.Add("Name");
_data.Columns.Add("Price");

_data.Rows.Add("商品A", 500);
_data.Rows.Add("商品B", 1200);
_data.Rows.Add("商品C", 800);
_data.Rows.Add("商品D", 2000);

Data = new DataView(_data);
```

```ExampleView.xaml
<DataGrid ItemsSource="{Binding Data}" AutoGenerateColumns="False">
    <DataGrid.Columns>
        <DataGridTextColumn Header="商品名" Binding="{Binding Name}" />
        <DataGridTextColumn Header="金額" Binding="{Binding Price}" />
    </DataGrid.Columns>
</DataGrid>
```

## 絞り込み表示

`DataView.RowFilter` プロパティに条件式を設定します。

```ExampleViewModel.cs
Data.RowFilter = "Price > 1000";
```

## 列カラムクリック時のソートを数値順にしたい

列カラムをクリックしてソートしたとき、そのままでは辞書順のソートになってしまいます。数値でソートしたい場合は `DataColumnCollection.Add` に型を指定します。

```ExampleViewModel.cs
_data.Columns.Add("Name");
_data.Columns.Add("Price", typeof(int));
```

## 列カラムクリック時のソートを〇〇にしたい

列カラムをクリックしたときにどうソートするか自分でかくことができます。調べたんですけど結局使いませんでした（私のアプリの場合は上の数値順にする方法で十分だった）。ですがせっかくなのでメモ程度に書き残しておきます。

流れとしては

- ビューでカラムクリック時に発生する Sorting イベントを補足し、ビューモデルにコマンドを送る
- EventArgs にクリックされた列ヘッダの文字列が入っているので、それに一致する列でデータを並び替える (`DataView.Sort`)
- `DataTable` を作り直す (`DataView.ToTable`)
- ビューで、`DataGrid` のソートしたカラムの `SortDirection` を設定する（ソートマークを付ける）

という感じだと思います。

### :link: 参考

- https://oita.oika.me/2014/09/15/sorts-datagrid-on-mvvm/
- https://araramistudio.jimdo.com/2016/10/13/wpf%E3%81%AEdatagrid%E3%81%A7%E3%82%BD%E3%83%BC%E3%83%88%E3%82%92%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%9E%E3%82%A4%E3%82%BA/
- http://final.hateblo.jp/entry/2015/09/22/115137

## 数値列で空白セルを表示したい

データに `DBNull` を入れます。

```ExampleViewModel.cs
_data.Rows.Add("商品A", 500);
_data.Rows.Add("商品B", 1200);
_data.Rows.Add("商品C", DBNull.Value);
_data.Rows.Add("商品D", 2000);
```

なお `Binding` の `TargetNullValue` プロパティを設定することで、`DBNull` なセルに任意の文字列を表示することもできます。

```ExampleView.xaml
        <DataGridTextColumn Header="金額" Binding="{Binding Price, TargetNullValue='NULLだよ'}" />
```

## サンプルのソースコード

プロジェクト一式を GitHub に置いときます。

- https://github.com/voidproc/WpfDataGridExample
PandasのDataFrameの要素を列名指定で更新する

#目的
DataFrameの要素を列名指定で更新したい

#環境
OS:　ubuntu18.04
pythonバージョン:　3.6.9

#ソースコード

``` main.py

#!/usr/bin/env python3
import pandas as pd

if __name__ == '__main__':
    dic = {'key1':[1,2,3],'key2':[4,5,6],'key3':[7,8,9]}

    df = pd.DataFrame.from_dict(dic)

    print(df)

    df.iloc[-1, df.columns.get_loc('key2')] = 10 #末尾行のKey2の値を更新

    print(df)
```

#結果
```
   key1  key2  key3
0     1     4     7
1     2     5     8
2     3     6     9

   key1  key2  key3
0     1     4     7
1     2     5     8
2     3    10     9
```
「技術が強い」では食っていけない

この文章を読んでいる人の多くは、仕事としてソフトウェアの開発に関わっていることだろう。
その仕事がうまくいくように次の文章を書いた。

## 技術の状況
- 画像認識技術は、オープン・ソースの分野でも著しく進展し続けている。
- 5年前の商用実装を、オープン・ソースが性能で上回ることが増えてきている。
- そのようなときに**「技術が強い」だけ**では、ビジネスとして生き残ることができない。
- 個別の技術の実装で、オープンソースをうわまわり続けるのが困難だ。
- ある程度以上に性能が向上してしまえば、未達成部分の差が問題にならない場合が増えてきている。
- 変化の激しい状況では、上位互換性のあるよい技術はすぐにでてくる。
- ユーザーはすぐに性能のよい実装・プラットフォームに簡単に移行してしまう。
- しかも、代替手段が用意できないような独自性の強すぎる技術を避ける傾向がある。

## 私の判断
- **「技術が強い」以上のビジネスの強み**を作らなくてはならない。
- オープン・ソースの実装があなたがたの商用実装を上回る状況になっても、あなたがたの商用実装を利用したいと思わせるものをつくりだすことだ。
- 例：空港での顔照合技術は、顔照合システムの全体としての使い勝手を含めた評価で採用が決まった。「顔認証世界一」では決まらなかった。

>パスポートスキャナーは家庭用キッチンと同じ高さにして使いやすさを追求。カメラをミラーの中に埋め込んだのも「人は鏡に映る自分の顔を見つめる習性があるため、撮られることを意識させずに正面からの顔写真を撮影しやすいから」（顔認証システムを手掛けるパナソニック システムソリューションズ ジャパンの遠田安令氏）。カメラで撮影した画像からベストショットのみ抽出して送信することで、サーバーの負荷を軽減できる点も他社にない特長だという。

> 顔認証ゲートの採用に当たっては、5社が参加する熾烈な入札が行われたが、価格に加えこうした使いやすさやデザインが評価され、パナソニックが落札した。

- 大事なのは「技術が強い」ではなくて、ユーザーにとっての価値だ。すべての「技術が強い」はユーザーにとっての価値を実現してこそ意味がある。
- ユーザーにとっての価値を実現しない分野での「技術に強い」は害悪でしかない。
- **「技術が強い」だけ**を強みとしようと既にレッドオーシャンと化している分野では、より「技術が強い」ものによって置き換えられてしまう。それは競合の会社かもしれないし、オープン・ソースの実装かもしれない。「技術が強い」ことだけに頼るは、自滅を早める選択肢だ。

## あなたはどう考えるか
Chromiumをビルドする

人生生きていたら誰もがChromiumのビルドぐらい必要になるだろう。
既存のドキュメントでは少しうまく行かないところがあったのでまとめておく。

**基本的にはhttps://chromium.googlesource.com/chromium/src/+/master/docs/linux/build_instructions.md
の順に行っただけ**
Pythonのバージョンの問題とPython入れるまでのやり方だけが追記されている。

# ビルド環境

公式リファレンスによれば以下のような環境が必要。

* 8GB以上のRAMが必要。16GB以上が推薦
* 最低でも100GB以上のストレージ領域があること
* GitとPython 2系がインストールされていること

今回はGCP上で東京リージョンに`n1-standard-4（vCPU x 4、メモリ 15 GB)`のインスタンスを借りた。

# Pythonのインストール

## build-essentialとzlib-devを入れる

```shell
apt get install build-essential zlib1g-dev
```
これがないとPyenvで入れることができない。

## Anyenvを入れる

個人的にAnyenv経由でPyenvを入れておきたかったので[Anyenv](https://github.com/anyenv/anyenv)を入れておく。

```shell
git clone https://github.com/anyenv/anyenv ~/.anyenv
echo 'export PATH="$HOME/.anyenv/bin:$PATH"' >> ~/.bashrc
anyenv install --init
```

`.bashrc`を編集する必要がある。以下を追記。

```bash:.bashrc
eval $(anyenv init -)
```

## Pyenvを入れる

```shell
anyenv install pyenv
```

## Pythonを入れる

2.7.17を入れたところ、後々に実行する`gclient runhook`でエラーが起きてしまったので`2.7.14`を入れる。

```shell
pyenv install 2.7.14
pyenv global 2.7.14
```

ここで`pyenv local 2.7.14`と後々に使う作業用フォルダでやってもよいが、空なディレクトリじゃないとエラーが起きる部分があるので、面倒なのでとりあえずこうした。

# Chromiumのソースのダウンロード、依存関係のインストール

以降の処理は実行時間が長いものもある。sshの接続が切れたりして再度やり直すのは大変なのでtmux使っておくとよいだろう。

## Chromiumのダウンロードツールのインストール

`depot_tools`というものをダウンロードして、パスを通す必要があるらしい。
以下ホームディレクトリにいることを想定。

```shell
git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
```
.bashrcに以下を追記する。

```shell:.bashrc
export PATH="$PATH:${HOME}/depot_tools"
```

## Chromiumのソースのダウンロード

```shell
mkdir ~/chromium && cd ~/chromium
fetch --nohooks chromium
```

これでダウンロードする。多分30分ぐらいかかる。

## 依存関係のインストール

```shell
cd src
./build/install-build-deps.sh
gclient runhooks
```

## ninjaファイルの生成

ビルドに使うninjaのためのファイルを生成するみたい

```shell
 gn gen out/Default
```

# Chromiumのビルド

```shell
autoninja -C out/Default chrome
```

6時間ほどしたら完成する。
クラス変数

```py:1
class Person(object):
    kind = 'human'
    
    def __init__(self, name):
        self.name = name
    
    def who_are_you(self):
        print(self.name, self.kind)

p1 = Person('A')
p2 = Person('B')

p1.who_are_you()
p2.who_are_you()
```

```:1の実行結果
A human
B human
```

クラス変数(この場合はkind)は、
つくった全てのオブジェクトで共用される。

```py:2
class T(object):
    words = []
    
    def add_word(self, word):
        self.words.append(word)

c = T()
c.add_word('apple')
c.add_word('banana')
print(c.words)

d = T()
d.add_word('orange')
d.add_word('cake')
print(d.words)
```

```:2の実行結果
['apple', 'banana']
['apple', 'banana', 'orange', 'cake']
```

cというオブジェクトとdというオブジェクト2つのオブジェクトをつくったが、
wordsがクラス変数なので、
cとdで共用されてしまっている。

これがバグにつながる事がある。

これを防ぐためには、
都度`__init__`で初期化（インスタンス変数に代入）する。

```py:3
class T(object):
    def __init__(self):
        self.words = []
    
    def add_word(self, word):
        self.words.append(word)

c = T()
c.add_word('apple')
c.add_word('banana')
print(c.words)

d = T()
d.add_word('orange')
d.add_word('cake')
print(d.words)
```

```:3の実行結果
['apple', 'banana']
['orange', 'cake']
```
Python の gRPC で Redis のデータを作成 (Create)

設定ファイル、サーバープログラム、クライアントプログラムの３つが必要です。

設定ファイル

```text:redis_create.proto

syntax = "proto3";

package redis_create;

service Greeter {
	rpc RedisCreate (RedisRequest) returns (RedisReply) {}
}

message RedisRequest {
	string key = 1;
	string str_json = 2;
}

message RedisReply {
	string key = 1;
}
```

サーバープログラム

```py:redis_create_server.py
#! /usr/bin/python
#
#	redis_create_server.py
#
#					Feb/08/2020
# --------------------------------------------------------------
import sys
import redis
from concurrent import futures
import logging

import grpc

import redis_create_pb2
import redis_create_pb2_grpc

# --------------------------------------------------------------
def redis_create_proc(key_in,str_json):
	rr = redis.Redis(host='localhost', port=6379, db=0)
#
	rr.set(key_in, str_json)
#
	return str_json
# --------------------------------------------------------------
class Greeter(redis_create_pb2_grpc.GreeterServicer):

	def RedisCreate(self, request, context):
		sys.stderr.write("*** RedisRead ***\n")
		sys.stderr.write("*** key = %s ***\n" % request.key)
		sys.stderr.write("*** str_json = %s ***\n" % request.str_json)
		redis_create_proc(request.key,request.str_json)
		return redis_create_pb2.RedisReply(key=request.key)

# --------------------------------------------------------------
def serve():
	server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
	redis_create_pb2_grpc.add_GreeterServicer_to_server(Greeter(), server)
	server.add_insecure_port('[::]:50051')
	server.start()
	server.wait_for_termination()

# --------------------------------------------------------------
if __name__ == '__main__':
	logging.basicConfig()
	serve()
# --------------------------------------------------------------
```

クライアントプログラム

```py:redis_create_client.py
#! /usr/bin/python
#
#	redis_create_client.py
#
#					Feb/08/2020
#
# --------------------------------------------------------------
from __future__ import print_function
import logging
import json
import grpc
import sys

import redis_create_pb2
import redis_create_pb2_grpc

# --------------------------------------------------------------
def run():
	unit_aa = {}
	key_in = sys.argv[1]
	unit_aa['name'] = sys.argv[2]
	unit_aa['population'] = sys.argv[3]
	unit_aa['date_mod'] = sys.argv[4]
#
	str_json_in = json.dumps(unit_aa)
#
	with grpc.insecure_channel('localhost:50051') as channel:
		stub = redis_create_pb2_grpc.GreeterStub(channel)
		response = stub.RedisCreate(redis_create_pb2.RedisRequest \
			(key=key_in,str_json = str_json_in))
		print("Greeter client received aa: " + response.key)
#
# --------------------------------------------------------------
if __name__ == '__main__':
	logging.basicConfig()
	run()
# --------------------------------------------------------------
```

gRPC のコードを作成します。

```bash
python -m grpc_tools.protoc -I. \
	--python_out=. \
	--grpc_python_out=. \
	./redis_create.proto
```

サーバープログラムの起動

```bash
./redis_create_server.py
```

クライアントプログラムの実行

```text
$ ./redis_create_client.py t0931 那須烏山 42935 2003-8-9
Greeter client received aa: t0931
```
tstatsを使う

[Splunk > Clara-fication: Search Best Practices](https://www.splunk.com/en_us/blog/tips-and-tricks/splunk-clara-fication-search-best-practices.html)をみたら、ちょっとびっくりしたので。

```java:tstats.spl
|tstats count  where sourcetype=access_combined_wcookie by PREFIX(action)
```

ver8以上限定で、[tutorial.zip](https://docs.splunk.com/Documentation/Splunk/8.0.1/SearchTutorial/GetthetutorialdataintoSplunk)が入っているとこれが動くはず。

[tstats@Splunk>docs](https://docs.splunk.com/Documentation/Splunk/latest/SearchReference/Tstats)を読むと詳細な説明が載っています。

`_raw`の文字列からフィールド抽出されている値で集計できるとなると、相当使える。

:sweat_smile: ver8以上だけど。
[Houdini] VEXで外部vflの読み込み

VEXでよく使う関数やスニペットを外部にまとめておきたい人向け。
色々見たけれど以下の２つの方法で動いた。 (H18にて確認)

## ローカルな方法
`$HIP/vex/include` となるようにサブフォルダを作ってその下にvflを置く。

## グローバルな方法 (やや強引)
houdini.envのHOUDINI_PATHに任意のパスを追加する。
houdini.envはMacなら `~/Library/Preferences/houdini/(version)/` にある。

```bash
HOUDINI_PATH = "/Users/gupon/houdini/mylib;&"  # ;& 忘れない
```
この場合は `mylib/vex/include` を作ってそこにvflを置く。


## wrangle内で使う
```c++
#include <utils.vfl>

// サブフォルダもいけるらしい
#include <utils.vfl>

// 絶対パスなら上記何もせずいけるらしい
#include </Users/gupon/houdini/mylib/include/vex/utils.vfl>
```


# 補足
- `HOUDINI_VEX_PATH` という環境変数の上書きで以前いけた気がするけど上手く動かず。。
参考: https://www.sidefx.com/ja/docs/houdini/ref/env.html

- HOUDINI_PATHへの追加は冗長な気もするけれど、vex以外のデジタルアセット等を追加したくなったときにも`/olts`等入れて対応できそうなので、包括的な個人的ライブラリを置くには良さそう。

- Houdini上ではwrangleを少しでも書き換えれば外部ファイルもリロードされるっぽい

- より詳しく: [【Houdini】vexのinclude文の挙動 ](https://qiita.com/harayoki/items/e934586035aa3a0f603a)
【LaravelDB.com】新機能 ”テーブル定義をパッと見で理解する！” 「Newテーブル一覧表示機能」

# ◇Laravel DB.com を初めての人はこちらから


[**初めての人はこちらから>>** ](https://qiita.com/daisu_yamazaki/items/9f0dd73553367f8077f0) 

#####
[**YouTube（DEMO）＞＞**](https://t.co/jGVarMoXse)


##New！2月8日 [Newテーブル一覧表示機能] について解説
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104530/f5a687b8-c341-dd3d-cf0f-ce511564021f.png" width="1000">


###DEMO動画（初めての人はこちらから）
[【 YouTubeリンク＞＞ LaravelDB.com の操作方法 】](https://t.co/jGVarMoXse)

**LaravelDB.comについて詳しく知りたい人はこちらもどうぞ！！**
[https://qiita.com/daisu_yamazaki/items/9f0dd73553367f8077f0](https://qiita.com/daisu_yamazaki/items/9f0dd73553367f8077f0)
<img width="600" alt="en.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104530/44a89fe7-10e9-785c-19c7-1fc6c691db0a.jpeg">




## １． ER図画面から 「 ER図のLoad/Save 」ボタンをクリック
[https://laraveldb.com](https://laraveldb.com)
注意）テーブル定義（データ）が表示されてることを確認してください。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104530/6727c921-a114-27f3-ddd5-d39d6b246048.png" width="1000">

## 2. 「 MIGRATION/TABLE 」ボタンをクリック
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104530/f58878df-f5d4-f6fb-1d97-d3d93af48d2a.png" width="1000">


## 3.ダウンロードしてフォルダを開く
ZIP圧縮ファイルをダウンロードします。
フォルダ内の**「 table_design.html 」HTMLファイルをダブルクリック**で開きます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104530/5e863fb3-1eda-af29-dce1-0c31fb23c204.png" width="1000">


## 4.「テーブル一覧」を解りやすく表示
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104530/f5a687b8-c341-dd3d-cf0f-ce511564021f.png" width="1000">
更に詳しく　↓↓↓↓↓↓

## ５．外部キー制約がある場合は以下のように表示されます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104530/4a608ce1-5f0d-de04-a31d-311140992efb.png" width="1000">
これまた、わかりやすいですね。
カラム名・型・コメント、外部キーまで一覧で見れます！！

##これでTeamメンバーやお客さま、他の人にもテーブル情報を共有可能ですね！！

以上
[VBScript] 管理者権限でインストーラーを起動[Windows]

## 目的
社内のPCを管理しています。そうすると管理者権限が必要なソフトウェアを
インストールしてくれーとの要望（苦情）をけっこう頂きます。

1台、2台なら、さくっとインストールしちゃうのですが、
拠点が離れているとそれも難しいです。

できるなら、ユーザにインストールして欲しい、とはいえ！
管理者権限のユーザ名やパスワードを教えるのも怖い。

ということで、解決策を検討しました。

## 解決策
そうだ！プログラムにパスワードを埋め込んで、
ユーザに見えなくしちゃえばいいんだ！

ということで、以下の手法を試してみました。

1. VBScriptで管理者権限でインストーラーを起動する
2. vbsファイルをexeに変換（難読化）
3. exeをユーザに公開すれば、みんなハッピー！

## 1. VBScriptで管理者権限でインストーラーを起動する

「管理者権限ユーザ名」「パスワード」「インストーラーへのフルパス」を
 書き換えて保存してください。

```
　　' cmdプロンプトの起動待ち時間（ms)
　　Const waitingTime = 2000

    ' Shell関連の操作を提供するオブジェクトを取得
    Set objShell = WScript.CreateObject("WScript.Shell")

    ' インストーラーを管理者権限で起動
    objShell.Run "runas /user:管理者権限ユーザ名 " & "インストーラーへのフルパス"
    WScript.Sleep waitingTime 

    ' パスワード入力
    objShell.SendKeys( "パスワード" )
    objShell.SendKeys( "{ENTER}" )
```
## 2. vbsファイルをexeに変換（難読化）
作成したvbsを以下サイトを参考に変換しました。

[VBScriptファイルをEXEファイルに変換、デスクトップアイコンを変更](https://uguisu.skr.jp/Windows/vbs2exe.html)

簡単にまとめると
[Script Encoder](http://www.microsoft.com/downloads/details.aspx?FamilyID=2976ee94-bec5-4314-84fd-8d7ec891c1c5&displaylang=ja) で .vbs → .vbe へ変換（難読化）し、
[MakeExe](http://www.vector.co.jp/soft/winnt/prog/se389017.html)　で .vbe　→　.exeに変換します。

## 3. exeをユーザに公開すれば、みんなハッピー！

ユーザが自分でインストールできるようになります！

# 総括
これで目的は達成できました！が、インストーラー名が変わると
exeを再作成する必要があって少々面倒です。

TODO:
1. インストーラーは起動時にユーザ指定できるようにする（→ ファイル参照ダイアログ）
2. 若干、安全性に懸念（難読化しただけ、デコードできるかも？)
応用情報技術者試験　合格への道：ネットワーク:ネットワーク方式 

ネットワーク:ネットワーク方式を攻略していきます。

計算問題が多いですね。実際に解いていくしかないですが、計算の前提となる文言の理解が必要なので先にそちらを進めます。


#■NAPT(IPマスカレード)

個人的に他の用語と間違えることが多いのでその整理をします。

##・NAPTとNATの機能

そもそもNAPT、NATは「技術」です。特定の機能ではありません。そのあたりを混同すると訳が分からなくなります。

NATはネットワークアドレスの変換を行う技術。

ローカルで使用しているクライアントはプライベートIPアドレスが割り振られていますね。

ローカルから送れるのはプライベートIPアドレスだけれども、それをグローバルIPアドレスに変換してくれる仕組みがNAT。


##・NAPTとNATの違い

ネットワークアドレスの変換に加えてポート番号も変換する技術。

ネットワークアドレスの変換に加えてポート番号も変換する技術。Network Address "Port" Translation。

複数のプライベートIPアドレスをさばくのにポートを分けて判別しているのがNAPT。


##・NAPTとDHCPの違い

プライベートIPアドレスの割り振りをしているのがDHCP。

その割り振られたプライベートIPアドレスをグローバルIPアドレスに変換して、ネットワークを利用できるようにしているのがNAPT。

DHCPはどこでやっているかといえば、大体は会社ならDHCPサーバーだし、家庭ならDHCPサーバ機能を持ったルータ。


##・NAPTとARPの違い

ARPは、MACアドレスをあて先のIPアドレスから求めるための「プロトコル」です。

MACアドレスを知りたいときに使用するプロトコルなので各クライアントから出される処理ですね。


#■アドレスクラス

クラスA	0.0.0.0   - 127.255.255.255	ネットワークアドレス長は8ビット、ホストアドレス長は24ビット。 （0-で始まる）
クラスB	128.0.0.0 - 191.255.255.255	ネットワークアドレス長は16ビット、ホストアドレス長も16ビット。（10-で始まる）
クラスC	192.0.0.0 - 223.255.255.255	ネットワークアドレス長は24ビット、ホストアドレス長は8ビット。 （110-で始まる）
クラスD	224.0.0.0 - 239.255.255.255	IPマルチキャスト専用。                                        （1110-で始まる）
クラスE	240.0.0.0 - 255.255.255.255	将来の使用のために予約されている。

を覚えておく。

#■IPv6について

アドレス空間を32ビットから128ビットに拡大
ヘッダのサイズを可変長から固定に変更
IPアドレスの自動設定
IPsecによるIP層でのセキュリティ強化


#■その他覚えておく用語

##・フォワードプロキシとリバースプロキシ
　→フォワードプロキシは自分のネットワーク内で動く、リバースプロキシは自分のネットワーク外で動く

##・SDNとNFV
　→SDN(Software-Defined Networking)　NFV(Network Functions Virtualisation)
　　SDNは、ネットワーク機器の構成や接続ルートを機器の導入や配線などの作業をせずに、ソフトウェアへの設定だけで実現する技術。
　　SDNは制御部だけをソフトウェア化したが、NFVでは機器ごと仮想化する
Spring boot サンプルプログラムでポートを使えなくなった話

#ポートに誰かが居座っている
```
Identify and stop the process that's listening on port 8080 or configure this application to listen on another port.
```
なんだこいつは。一回目は起動していたのに。
文脈か察するに、ポートがすでに使われているみたいだ。

#本当かどうか確認してみる
cmdから

```
netstat -an
```
で確認してみる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233158/f57704f7-c5a5-c025-1df5-ed9796c499e4.png)
確かに、8080がLISTENINGになっている。
これは別のアプリケーションが独占しているという認識でいいのだろうか。いったん前提をそれとして作業を、
**1. 動いているアプリを突き止めて終了する(仮定:多分前動かしたjavaがまだ居座っている？)**
**2. 1の仮定が正しい場合、停止した後にちゃんとどいてもらうような設定をする**
の2つに絞って作業をしてみようかな。

#動いているアプリを突き止めて終了する
今度はcmdから誰が居座っているか、ちゃんと確認する。

```
netstat -nao | find "8080"
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233158/3874e5d6-c231-1ec7-3f6e-bc02da47c3b7.png)
来た・・・‼3688・・・‼こいつが・・・諸悪の根源・・・‼
ここでkillコマンドでバッサリと切ってしまうのが最も早いみたいですが、タスクマネージャから正体を確認してみます。cmd上から確認できる方法とかあるんですかね。まあいっか。
余計なことはしすぎる方がいいってスピッツから教わりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233158/b085bce3-a3a2-9a60-532f-96bc4285caba.png)
案の定javaさんでしたね～
タスクから終了させまつ
また再起動後、同じ現象がおきるかな・・・と思いきや、スムーズに再起動に成功したので、これでいいのかな？

#いったん解決ということで
またポートがらみで問題が起きたら書き起こします
Dockerを始めてみよう その２

## 前回につづき、またもメモ気味な内容
前回は時間もなかったのでさくさくと書いてみた。
[Dockerを始めてみよう](https://qiita.com/daisuke8000/items/d2ced36bd221af386108)

今回はもう少しそこから進んでみる。

## DockerHub
Dockerを使って環境を作成するというなら切っても切れない。
[Docker Hub](https://hub.docker.com/)
指示に従い、普通に登録。

## Dockerイメージ
Dockerコンテナのベースになるもの。
DockerHubのExploreみるといろいろある。（ubuntu,Centos,nginx…などなど）
このDockerイメージを実行してコンテナが作成されるっぽい。

```docker run <イメージ名>```


※ちなみにこの「run」は
```docker create <イメージ名>```と
```docker start <イメージ名>```の合わせ技みたいね。

## Dockerコンテナ
Dockerといえばこのコンテナ
イメージから実行された仮想環境。
起動されたコンテナは任意で停止させないと起動しっぱなしなので、用が済んだら
```docker stop <イメージ名>```と```docker rm <イメージ名>```を入力しておくか、最初からstopかけたら削除のコマンドを入れておくなりしておこう。


## Dockerファイル
Dockerイメージを作成するファイル
かるく作成してみたが、なかなか慣れが必要そう。
でも、これを使えるようになるとDockerイメージを自由に構成できるし、開発環境も統一出来そうっすね。いいね。
でも難しそう…

## おい、楽しいぞDocker
触ってみると難しいことは今のところはまだなさそう。
コンテナとかイメージをちゃんと説明できそうもないが実際にアプリ作れるようになるともう少し理解が進むかも。