OmniAICreator/Qiita-1.07M huggingface dataset:
Vi(Vim)の基本操作メモ

Viの基本操作について、個人的によく使う操作方法をメモします。

## 起動
```bash
$ vi ファイル名
```

# 入力モードについて
viはコマンドモードで立ち上がる (コマンドモードについて下記に記載)。
文字を入力する場合は、入力モードに移る以下キーを入力する。

```
[a]   ...カーソルの右から入力開始(a: Add の意味)
[A]   ...行末から入力開始
[i]   ...カーソルの左から入力開始(i: Insert の意味)
[I]   ...行頭から入力開始
[o]   ...現在の行の下に１行挿入し、その行頭から入力開始
[O]   ...現在の行の上に１行挿入し、その行頭から入力開始
```
コピー・貼り付けについて、入力モードでは何か他のテキストの文字列、外部サイトの文字列をコピーし、そのまま貼り付けることができる。

# コマンドモードについて
escキーでコマンドモードに移る。ファイル・文字列操作、保存等が可能。

## カーソル移動
### 1文字移動
基本的に矢印キーは使うなと昔上司に言われました。でも使ってもいいと思いますが…

```
左: [←キー] or [h] or [BackSpace]
右: [→キー] or [l] or [Space]
上: [↑キー] or [k]
下: [↓キー] or [j]
```
### 単語ごとに移動
```
[w]    ...1語次へ
[b]    ...1語前へ
```

## 削除・貼り付け
```
[x]    ...１文字削除。
[yy]   ...１行コピーしクリップボードへ格納する。
[dd]   ...１行切り取りしクリップボードへ格納する、または１行削除。
[p]    ...クリップボードの内容をカーソル行の下の行に貼り付ける。
```

## 行番号
```
:set number    ...行番号を表示
:se nu         ...行番号を表示(上に同じ)
::set nonumber 
:se nonu
:行番号        ...行番号を指定して移動
```
## 検索
```
[/]文字列    ...カーソルの後方に検索を行う
[?]文字列    ...カーソルの前方に検索を行う
[n]文字列    ...次の検索該当文字列へ
[N]文字列    ...前の検索該当文字列へ
```
## 置換
```
:s/文字列1/文字列2/    ...カーソル行で最初の「文字列1」のみを「文字列2」に置換する
:s/文字列1/文字列2/g    ...カーソル行の「文字列1」を全て「文字列2」に置換する
```
## 取り消し
```
[u]    ...直前の操作をやめる(u: Undo の意味)
[U]    ...行全体に操作を取りやめる
```

## ビジュアルモード
ctrl + V でビジュアルモードに遷移。矩形選択しxで選択箇所の削除など可能。

## 終了処理
```
終了
:q    …書込みを行わず終了(quitの意味)
:q!    ...書込みを行わず強制終了
:wq    ...書込み後終了
:wq!    ...書込み後強制終了
```

色分けされていたほうが見やすいので、Vimを推奨されている方もいますが、
基本的な操作方法についてはViもVimも同じです。
【Laravel】artisanコマンドまとめ

よく使うartisanコマンドのメモ

https://readouble.com/laravel/5.8/ja/

## routeの確認

### `$ php artisan route:list`

## マイグレーション

### `$ php artisan make:migration create_users_table`
マイグレーションを作成

### `$ php artisan migrate`
マイグレーションを実行する

### `$ php artisan migrate:rollback`
マイグレーションをロールバック

## Seeder

### `$ php artisan make:seeder UsersTableSeeder`

seederを作成する

シーダクラスを書き上げたら、Composerのオートローダーを再生成する。

```
$ composer dump-autoload
```

### `$ php artisna db:seed`

`DatabaseSeeder` クラスに追加した`Seed`を実行する

```php

public function run()
{
    $this->call([
        UsersTableSeeder::class,
        PostsTableSeeder::class,
        CommentsTableSeeder::class,
    ]);
}
```

### `$ php artisan db:seed --class=UsersTableSeeder`
特定のファイルを個別に実行する

### `$ php artisan migrate:refresh --seed`
`$ php artisan migrate:refresh` でテーブルを再構築し、seederの値を初期値として設定。
本番環境でやるとやばい。とてもやばい。

## モデルクラスを作成する

### `$ php artisan make:model User`

マイグレーションも同時に作成できる。
`$ php artisan make:model Flight --migration`
`$ php artisan make:model Flight -m`

## リクエストクラスを生成する

### `$ php artisan make:request UserRegistPost`

## ページネーションビューのカスタマイズ

### `$ php artisan vendor:publish --tag=laravel-pagination`
`resources/views/vendor`ディレクトリ以下にページネーションのビューファイルが生成される。
デフォルトでは`bootstrap-4.blade.php`が使用されている。
https://readouble.com/laravel/5.8/ja/pagination.html#customizing-the-pagination-view

## サービスプロバイダを生成

### `$ php artisan make:provider RiakServiceProvider`

https://readouble.com/laravel/5.8/ja/providers.html#writing-service-providers

## コントローラーを生成

### `$ php artisan make:controller HomeController`

## キャッシュを削除

### `$ php artisan config:clear`
`.env`の変更が反映されないときなど

## encryption key を設定する

### `$ php artisan key:generate`

設定されていない場合エラーがでる

```
RuntimeException
No application encryption key has been specified.
```

## ミドルウェアを作成

### `php artisan make:middleware CheckAge`
https://readouble.com/laravel/5.8/ja/middleware.html
Javascriptでnew 演算子でも普通の関数としても呼び出せるコンストラクタの作り方

JavascriptのちょっとしたHackyなコードです。
`Person(name, age)`でも呼べるし `new Person(name, age)`とも呼べるような関数の作成方法です。

####コード
```javascript
function Person(name, age) {
  if(!(this instanceof Person)) return new Person(name, age);
  this.name = name
  this.age = age
}
```

####考え方
コンストラクタとして呼び出されたら普通に処理。
関数として呼び出されたらコンストラクタ呼び出しとして呼びだし直す。
React Hooks でページネーションを実装する

# やりたいこと
Hooks がリリースされてから、コンポーネントのシンプルな状態管理に関しては`useState`などで済ませられるようになったが、やや複雑なコンポーネントの状態管理+アルファを Hooks でやってみたかった。

# つくったもの
今回は`useReducer`を使って市町村名をリストで表示するページネーションを実装してみた。
サンプルコード：https://codesandbox.io/s/paginator-demo-mnxvc
UIフレームワークは [Material UI](https://material-ui.com/) でサクッと用意。

useReducer を使った例としては[公式のリファレンス](https://ja.reactjs.org/docs/hooks-reference.html#usereducer)でもカウンターなどがありますが、もう少し実用的で、複雑な状態管理と副作用をうまく利用することが要求されるコンポーネントを作って試してみたいと思っていたので今回それをやりました。

ページネーションを題材とした理由は、主に

- コンポーネントの操作で非同期にデータをGETする必要性がある
- ページの始点・終点・中間点等でコンポーネント(「進む」「戻る」などのボタン、ページ位置の表示)の制御を切り替える必要がある
- 実際のWebアプリケーションでも使用される機会が多い

という点。その他に１ページあたりの表示件数とか、データの表示スタイルの切り替えといったアレンジも加えやすいので、思いつく限り今回は機能を盛り込んでみました。
※今回はサンプルコードを全て公開している都合上、公開APIを叩いて非同期でデータをGETするかわりに静的なデータ(市町村名とIDの一覧)を用意し擬似的に何件かずつ`array.slice`で切り出して表示するという実装に変えてあります。

# ソースコードとコンポーネントについて
詳しくは上記の CodeSandbox の中身をみていただくとして、今回はページネーションのコンポーネントとReducerの動きについて軽く説明します。

### `<Paginator />`コンポーネント
初期Stateは以下のように設定しています。

```jsx:index.js
function App() {
  return (
    <div className="App">
      <Container fixed>
        <Paginator
          sum={cities.length} //データの総件数
          per={10} //1ページあたりの表示件数
          initialData={cities.slice(0, 10)} //読み込み時に表示するデータ
          component={ListComponent} //データを渡すPresentaionコンポーネント
        />
      </Container>
    </div>
  );
}

const rootElement = document.getElementById("root");
ReactDOM.render(<App />, rootElement);
```


### `<Button>` 前へ・次へ
ページの操作を行います。
「前へ」ボタンがクリックされたら前n件のデータとともに`viewPreview`という関数を、「次へ」ボタンがクリックされたら`viewNext`という関数を発行します。

```Paginator.js
const reducer = (state, action) => {
  switch (action.type) {
    //[前へ]ボタンをクリック時に発行。
    //ページ数のデクリメント
    case "viewPreview":
      return {
        ...state,
        currentPage: state.currentPage - 1,
        resourceData: action.data
      };
    //[次へ]ボタンをクリック時に発行。
    //ページ数のデクリメント
    case "viewNext":
      return {
        ...state,
        currentPage: state.currentPage + 1,
        resourceData: action.data
      };
    .
    .
    .
  }
};
```
reducer は発行される直前の`state`と`dispatch()`の中身(≒変更するstate)を`action`として引数にとります。変更を加えないstateは`...state`とスプレッド演算子を使って return しないと上手くコンポーネントが機能しないため忘れずに。

### `<Select>`1ページあたりの表示件数の切り替え
Selectボックスを変更した場合、`setPerAmount`という関数を発行します。

```Paginator.js
//reducer
    //表示件数の切り替え時に発行。
    //現在のページを1ページ目にリセット。
    case "setPerAmount":
      return {
        ...state,
        currentPage: 1,
        per: action.per,
        pageAmount: Math.ceil(state.sum / action.per),
        resourceData: action.data
      };
```
表示件数を切り替えた場合は一番先頭のデータからまた表示し直すことが良い？気がするので`action`に入っているデータは先頭からn件の内容です。

### `<Switch>`表示形式(コンポーネントのスタイル)を切り替え
初期状態では市町村名とIDが２段組になったリスト形式で表示していますが、スイッチを切り替えることでシンプルな１行のコンポーネントで現在のページの内容を表示し直します。
スイッチの切り替え時にデータを１行ずつ表示するための子コンポーネントと`switchComponent`という関数を発行します。

```Paginator.js
//reducer
    //表示形式の切り替え時に発行。
    case "switchComponent":
      return {
        ...state,
        component: action.component
      };
```

### 最後に
公式リファレンスを読むと使い方がなんとなくわかった気になりますが、実務ではカウンターやTodoリスト以上に複雑な機能を扱うことの方が多いためどういう場面で Hooks の力を最大限利用できるのかはまだ手探り中です。今回は`useContext`抜きで実装しましたが、扱うコンポーネントの数が増えてきたら避けては通れなくなるかも。
【SQL】テーブルに、テーブルの値を利用した値と、指定した値を挿入する（VALUESは使用しない）

###`Values`を使用せず、今あるテーブルに、指定したテーブルの値と、独自で記述した値を挿入する

```SQL:Sales表に値を挿入する
INSERT INTO
 Sales(Id,SalesAt,BilledAt,Note) /*表名（列名）*/
 
 SELECT
 max(Id)+1, '2019/8/01','2019/8/20',''
 /*SELECTの後に、代入したい値を記述する*/

FROM
Sales
/*SELECTでIdを記述するために、FROMで引っ張ってくる表を指定する*/
```
ここでは、Sales表に新しいレコードを挿入するために、Sales表のIdを参照している
。
Bitbucket が Mercurial のサポートを 2020/6 に終了

個人的にお世話になっている Bitbucket が Mercurial のサポートをやめてしまうようです。

利用者にはメールが行っていると思いますが、注意勧告しておいた方がよいかなと思いました。

>
After much consideration, **we've decided to remove Mercurial support from Bitbucket Cloud and the API. Mercurial features and repositories will be officially removed from Bitbucket and its API on June 1, 2020.**

>
What used to be a very fragmented version control software market has rapidly matured. Mercurial usage on Bitbucket is steadily declining, and the percentage of new Bitbucket users choosing Mercurial has fallen to less than 1%. At the same time, Git has become the standard. According to a Stack Overflow Developer Survey, almost 90% of developers use Git, while Mercurial is the least popular version control system with only about 3% developer adoption.
Given that Git has emerged as the version control system of choice for the industry, we have decided to focus our priorities and roadmap on building the best possible experience for the market and our users.
Read on to learn more about what led to this decision, timeline, and migration resource support.


---

>
Here are the key dates as we sunset Mercurial functionality:
>
**February 1, 2020**: users will no longer be able to create new Mercurial repositories
June 1, 2020: users will not be able to use Mercurial features in Bitbucket or via its API and all Mercurial repositories will be removed.
All current Mercurial functionality in Bitbucket will be available through May 31, 2020.

---

昨年8月よりお知らせしている通り、アトラシアンはBitbucket CloudとそのAPIでのMercurialのサポートを終了します。**2020年7月1日（米国時間）**に、BitbucketからMercurialのリポジトリの削除を開始します。以降、Mercurialのリポジトリやスニペット、wikiへのアクセスや作成はできません。
今回の決定と今後Gitに注力するに至った背景については、[ブログ記事](https://www.atlassian.com/ja/blog/sunsetting-mercurial-support-in-bitbucket)をご覧ください。お手元の環境をGitに変換したり、Mercurialの使用を継続するのに役立つ情報も含まれています。
パスカルの三角形を使ったnCk mod  [備忘録]

[AtCoder abc132 youtubeでの解説](https://www.youtube.com/watch?v=mso8tE1yMl) より

オーダーは$O(n!)$くらいです

## 利点

* 一度計算してしまえばあとはO(1)で求められる

* 実装が割と単純


```Rust
// パスカルの三角形
/*
AtCoder abc 132 解説より
https://www.youtube.com/watch?v=mso8tE1yMl8
*/
/*
    1
   1 1
  1 2 1
 1 3 3 1

aCb はa段目のb番目
*/

// MUsize: 演算字自動でmodをとる構造体
static MOD: usize = 1_000_000_000 + 7;
use std::ops::{AddAssign, SubAssign, MulAssign};
use std::ops::{Add, Sub, Mul};
#[derive(Copy, Clone, Debug)]
struct MUsize {x: usize}
impl MUsize {
    fn new(x: usize) -> MUsize {
        MUsize{x: x%MOD}
    }
}
impl AddAssign for MUsize {
    fn add_assign(&mut self, other: MUsize) {
        let tmp = self.x + other.x;
        *self = MUsize {
            x: if tmp >= MOD {tmp - MOD} else {tmp}
        };
    }
}
impl SubAssign for MUsize {
    fn sub_assign(&mut self, other: MUsize) {
        let tmp = self.x + MOD - other.x;
        *self = MUsize {
            x: if tmp >= MOD {tmp - MOD} else {tmp}
        };
    }
}
impl MulAssign for MUsize {
    fn mul_assign(&mut self, other: MUsize) {
        *self = MUsize {
            x: self.x * other.x % MOD
        };
    }
}
impl Add for MUsize {
    type Output = MUsize;
    fn add(self, other: MUsize) -> MUsize {
        let mut res = MUsize::new(self.x);
        res += other.clone();
        res
    }
}
impl Sub for MUsize {
    type Output = MUsize;
    fn sub(self, other: MUsize) -> MUsize {
        let mut res = MUsize::new(self.x);
        res -= other;
        res
    }
}
impl Mul for MUsize {
    type Output = MUsize;
    fn mul(self, other: MUsize) -> MUsize {
        let mut res = MUsize::new(self.x);
        res *= other;
        res
    }
}

struct C {
    c: Vec<Vec<MUsize>>
}
impl C {
    fn new(max: usize) -> C {
        let mut c = vec![vec![MUsize::new(0); max+2]; max+2];
        c[0][0] = MUsize::new(1);
        for i in 0..max+1 {
            for j in 0..i+1 {
                let tmp = c[i][j];
                c[i+1][j] += tmp;
                c[i+1][j+1] += tmp;
            }
        }
        C {c:c}
    }
}
fn main() {
    let c = C::new(4005);
    assert!(c.c[8][2].x, 28);
    assert!(c.c[8][3].x, 56);
}
```

## 困っていること

stack overflow に提出させていただきました。

[warning[E0502]: cannot borrow `c` as immutable because it is also borrowed as mutable
](https://ja.stackoverflow.com/questions/57490/warninge0502-cannot-borrow-c-as-immutable-because-it-is-also-borrowed-as-mu)
RPMパッケージのインストールコマンド

# 目次

* [はじめに](#はじめに)
* [RPMパッケージの強制インストール](#rpmパッケージの強制インストール)

# はじめに

RPMでパッケージをインストールしようとし時、困ったのでメモを残します。
主に、**強制的な**RPMインストールのオプションです。(2018.03)

# RPMパッケージの強制インストール

- すでにインストールされているパッケージを無視してインストールする  
`--replacepkgs`

```bash
$ rpm -ihv --replacepkgs hoge-3.2-1.i386.rpm
```

- ファイルの重複を無視してインストールする  
`--replacefiles`

```bash
$ rpm -ihv --replacefiles hoge-3.2-1.i386.rpm
```

-  ダウングレードを許可しインストールする  
`--oldpackage`

```bash
$ rpm -ihv --oldpackage hoge-3.2-1.i386.rpm
```

- 強制的にインストールする  
`--force`  

```bash
$ rpm -ihv --force hoge-3.2-1.i386.rpm
```
Gradleインストール

# 目次

* [はじめに](#はじめに)
* [Javaの設定](#javaの設定)
* [Gradleインストール](#gradleインストール)

# はじめに

はじめてJavaを使用するときにメモったGradleのセットアップ失敗と成功の記録です。(2018.02)

# Javaの設定

Gradle動作の前提としてJavaを設定します。

## JAVA_HOMEの設定

```
C:\Users\user>set JAVA_HOME="C:\Program Files\Java\jdk1.8.0_161\bin"
```

## javaのバージョン確認

```
C:\Users\user>java -version
java version "1.8.0_161"
Java(TM) SE Runtime Environment (build 1.8.0_161-b12)
Java HotSpot(TM) Client VM (build 25.161-b12, mixed mode, sharing)
```

# Gradleインストール

## Gradleのダウンロードと展開

1. 公式サイトからダウンロード  
　[https://gradle.org/](https://gradle.org/)

1. 適当なフォルダに解凍

## PATHの設定
Gradleを解凍したフォルダのパスを設定

```
C:\Users\user>set PATH=%PATH%;C:\tmp\gradle-4.5.1\bin
```
## Gradleのバージョン確認(失敗)

```
C:\Users\user>gradle -v

ERROR: JAVA_HOME is set to an invalid directory: C:\Program Files\Java\jdk1.8.0_161\bin

Please set the JAVA_HOME variable in your environment to match the
location of your Java installation.
```
※ JAVA_HOME に bin まで書いてしまうとダメらしい。

## JAVA_HOMEの設定(再)

```
C:\Users\user>set JAVA_HOME="C:\Program Files\Java\jdk1.8.0_161"
```

## Gradleのバージョン確認(成功)

```
C:\Users\user>gradle -v

------------------------------------------------------------
Gradle 4.5.1
------------------------------------------------------------

Build time:   2018-02-05 13:22:49 UTC
Revision:     37007e1c012001ff09973e0bd095139239ecd3b3

Groovy:       2.4.12
Ant:          Apache Ant(TM) version 1.9.9 compiled on February 2 2017
JVM:          1.8.0_161 (Oracle Corporation 25.161-b12)
OS:           Windows 7 6.1 x86
```
AndroidStudio / Xcodeで現在開いているファイルをファイルツリー上で表示する

# AndroidStudioの場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36889/aa327acc-1331-c20a-fec5-b687dfc3c5b9.png)

# Xcodeの場合
shift + command + J
Bitcoin ATMをカナダで利用してみた

# Bitcoin ATMをカナダで利用してみた

## 前説
カナダのトロントにて<font color="red">**BitcoinATM**</font>を街中で見かけた. 
結構前から日本にも東京, 大阪, 福岡などに数台あるらしいが, 見かけたことはなかったためこちらで利用してみることにした.
今回はこのBitcoinATMの利用方法と利用した感触を共有できたらと思っている.
ちなみに具体的にBitcoinATMとは以下のようなものである.
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182526/07132483-0bb7-0c01-2977-46ecce249a8e.jpeg" width=60%>

## 使ってみた感想
今まで取引所などからもアドレスを購入したことはあった. しかし,このBitcoin ATMはどのBitcoin入手方法と比較しても<font color="red">**圧倒的に簡単にBitcoinを入手することができる**</font>ことは間違いない. その理由として銀行口座の必要性がないこと, 現金から直接Bitcoinを入手することができる点があげられる.
デメリットとしてあげられることは<font color="blue">**手数料が高いこと**</font>である. 手数料は今回利用したマシンの場合は3CADであった.

## Bitcoin ATMについて

BitcoinATMでできることは

#### **1, 現金からBitcoinを購入**
#### **2, Bitcoinを現金に換金**

である.Bitcoinを購入する際には送金先のBitconiアドレスを指定して送金させる仕様になっている.BitcoinATMが初めて設置されたのは<font color="red">**2013年, カナダのバンクーバー**</font>らしい.今回, Bitcoin ATMは4種類利用したが, その中でも最も設置台数が多かったBitcoin ATMの利用体験記を記しておきたい. 
ちなみに他のBitcoin ATMのマシンは以下のようなものがある.
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182526/b037354e-cf74-d2e8-f043-db1e7b0c54da.jpeg" width=60%>
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182526/3e62adf8-74c2-5801-5a54-38dd198dc3a9.jpeg" width=60%>
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182526/851d4bbd-14f6-4cb3-bd06-0868ec2508f6.jpeg" width=60%>

## Bitcon ATMの利用手順(ver. Bitcoin購入)
### 1,購入する暗号通貨を選択
購入できる暗号通貨の種類は3種類, 
<font color="red">**Bitcoin, ethereum, litecoin**</font>
今回はこの中からBitcoinを選択.
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182526/23a2a134-9fd1-da66-d1ce-be8e1c22e2bf.jpeg" width=60%>
### 2, 購入か売却かを選択

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182526/2a007126-1541-c41b-3c65-ca6a9d7e03d6.jpeg" width=60%>

### 3, 規約への同意

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182526/0ff45d25-d4d2-5fae-a749-e0d184df8c5c.jpeg" width=60%>
### 4, アドレスのQRコードの提示
「localcoin」と書かれた場所の下の窓に送金先アドレスのQRコードを照す. 
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182526/91613001-a52c-0657-7ef7-667e2bf4ab47.jpeg" width=60%>

### 5, 入金
アドレスが読み込まれたら,入金したい金額のお金を入金する.
今回は20CAD(カナダドル)を入金した. ちなみに手数料として3CAD取られる.
(※お金を入れる際は10CAD札は使えず20CAD札以上でなければ使えなかったため注意！！)
入金後, 「BUY BTC」ボタンを押すことで購入が完了する.

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182526/a39d4503-750c-9670-c14e-aefa9aa9234f.jpeg" width=60%>

### 6, レシートの受け取り
送金のレシートに関する情報をメールアドレスあてに送信してくれる.
面倒で飛ばしたい場合は「DONE」を押してくれれば問題ない.
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182526/12f0d81b-654d-abc5-b315-23d3a0cd2431.jpeg" width=60%>

### 7, 受信チェック
Bitcoinが自分のアドレスに届いているかをチェックする.
自分の時は5sもしないうちに発生したトランザクションを「Blockchain Explorer」のサービスで確認することができた.
webarenaでubuntu その22

#概要

webarenaでubuntu18.04やってみた。
mysql5.7やってみた。
crudやってみた。

#Create

```
<?php
    $db = new PDO("mysql:host=localhost;dbname=mydb;", 'arena', 'pass');
    $sql = 'insert into test values(null, "name", 20, now())';
    $res = $db->query($sql);
    if ($res) print "ok\n";
?>
```

#Read

```
<?php
    $db = new PDO("mysql:host=localhost;dbname=mydb;", 'arena', 'pass');
    $sql = 'select * from test';
    $res = $db->query($sql);
    if ($res) print "ok\n";
?>
```

#Update

```
<?php
    $db = new PDO("mysql:host=localhost;dbname=mydb;", 'arena', 'pass');
    $sql = 'update test set age=80 where id=1';
    $res = $db->query($sql);
    if ($res) print "ok\n";
?>
```

#Delete

```
<?php
    $db = new PDO("mysql:host=localhost;dbname=mydb;", 'arena', 'pass');
    $sql = 'delete from test where id=1';
    $res = $db->query($sql);
    if ($res) print "ok\n";
?>
```

以上。
logrotateの備忘録

# 目次

* [はじめに](#はじめに)
* [設定ファイル](#設定ファイル)
* [実行する](#実行する)
* [確認する](#確認する)

# はじめに

取り敢えず、ログローテの設定を変更して動作確認するときのメモです。
cronの話は機会があれば...(2018.01)

# 設定ファイル

ログローテの設定ファイルには、共通の設定と個別の設定があります。

## 共通の設定

/etc/logrotate.conf

## 個別の設定

/etc/logrotate.d/ファイル名

# 実行する

ログローテを実行します。

## debugモードで実行(動作確認)

```
/usr/sbin/logrotate -dv /etc/logrotate.conf
```

-d, -debug : デバッグモード
-v, -verbose : 詳細表示モード

## 通常実行

```
/usr/sbin/logrotate /etc/logrotate.conf
```

## 強制実行(条件を満たしていなくてもログローテさせる)

```
/usr/sbin/logrotate -f /etc/logrotate.conf
```

-f, -force : 強制実行

# 確認する

実行結果を確認します。

## 実行結果(実行時刻)を確認  

```
cat /var/lib/logrotate/logrotate.status
```
nom5のトレースライブラリnom-tracable

# はじめに
nomはRustのパーサコンビネータライブラリです。nomで使えるトレース出力用のクレートとしては[nom-trace](https://github.com/rust-bakery/nom-trace)があるのですが、これはnomがマクロベースだったころに作られたもので、関数ベースになったnom5ではちょっといまいちな感じです。
（使えなくはないのですが、パーサの名前を手打ちする必要があったりして大量に使うのは辛そうです）

というわけでnom5で使えるトレースライブラリを作ってみました。

https://github.com/dalance/nom-tracable

# トレースの例

![nom-tracable.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/84296/38d0359e-ae80-7cdc-1827-8146f884638e.png)

こんな感じのトレースを出力できます。特徴としては

* 呼び出し側と戻り側の両方をトレースできる（`->`が呼び出し、`<-`が戻り）
* 戻り側は成功・失敗を色付けする（緑が成功、赤が失敗）
* 特定のパーサを折りたためる（`+`がそれ以下のパーサ呼び出しを折りたたんでいる箇所）
* パーサ呼び出し回数のヒストグラムを表示できる

という感じです。

# 使い方

dependenciesに追加して、

```Cargo.toml
[dependencies]
nom-tracable = "0.4.0"
```

パーサの入力型を定義します。

```rust
type Span<'a> = LocatedSpanEx<&'a str, TracableInfo>;
```

トレーサはパーサの呼び出し階層などの情報をこの入力型で持ちまわすので、単純な`&str`などは使えません。

定義した入力型を使ってnom5のパーサ関数を定義して、`#[tracable_parser]`アトリビュートを付けます。

```rust
#[tracable_parser]
pub fn term_internal(s: Span) -> IResult<Span, String> {
    let (s, x) = char('1')(s)?;
    Ok((s, x.to_string()))
}
```

あとはコンパイル時に`--features trace`を指定するとトレース出力できます。

```console
$ cargo run --features trace
```

featureを指定しない場合はトレース関連のコードは生成されないので、パフォーマンスへの影響はありません。

完全なソースコード例は以下にあります。

https://github.com/dalance/nom-tracable/blob/master/nom-tracable/examples/example.rs
動画編集（ジャンプカット）を自動化してみた！

#参考にさせていただいた記事
この記事を参考にさせていただきました。
https://qiita.com/merarli/items/1b7819adbae7fad3c9b4
#やったこと
YouTube動画の編集手法の一つである「ジャンプカット」の自動化に取り組みました。
Jupyter Notebookで作ってみました。OSはMacです。
FFmpegで無音時間を検出し、動画を切り出します。
こんな感じでできます。⇒ https://youtu.be/i2fFIWyXGXo

#コード
```python
import subprocess
import os
```
```python
def mk_movieList(movie_folder):
    files = os.listdir(movie_folder)
    files = [x for x in files if x[-4:] == '.mp4']  ### x[-4]'後ろ4文字目以降'
    files = [x for x in files if x[0] != '.']
    return files

def mk_starts_ends(wk_dir, movie):
    os.chdir(wk_dir)
    output = subprocess.run(["ffmpeg", "-i", movie, "-af", "silencedetect=noise=-33dB:d=0.6", "-f", "null", "-"], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    print(output)
    s = str(output)
    lines = s.split('\\n')
    time_list =[]
    for line in lines:
        if "silencedetect" in line:
            words = line.split(" ")
            for i in range(len(words)):
                if "silence_start" in words[i]:
                    time_list.append(float(words[i+1]))
                if "silence_end" in words[i]:
                    time_list.append(float(words[i+1]))
    print(time_list)
    starts_ends = list(zip(*[iter(time_list)]*2))
    return starts_ends

def mk_jumpcut(wk_dir, movie, starts_ends):
    os.chdir(wk_dir)
    for i in range(len(starts_ends)-1):
        movie_name = movie.split(".") 
        splitfile = "./JumpCut/" + movie_name[0] + "_" + str(i) + ".mp4"
        print(splitfile)
        output = subprocess.run(["ffmpeg", "-i", movie, "-ss", str(starts_ends[i][1]), "-t", str(starts_ends[i+1][0]-starts_ends[i][1]), splitfile], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
```

```python
movie_folder = "ここに素材動画が入っているフォルダの場所を記載してください。"

os.chdir(movie_folder)
wk_dir = os.path.abspath(".")
try:
    os.mkdir("JumpCut")
except:
    pass

movie_list = mk_movieList(movie_folder)

for movie in movie_list:
    print(movie)
    starts_ends = mk_starts_ends(wk_dir, movie)
    print(starts_ends)
    mk_jumpcut(wk_dir, movie, starts_ends)
```
#こんな感じになります。
![スクリーンショット 2019-08-20 20.35.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/484370/57b63834-98bf-341d-0d54-75370099744f.png)
コード上の「movie_folder」で指定したフォルダの中に、更にJumpCutというフォルダができて...
![スクリーンショット 2019-08-20 20.35.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/484370/f6d9f4d2-9cd1-52db-2842-591d21f33733.png)
こんな感じに動画が分割されます。これをまとめて、動画編集ソフトにブチ込んで再生すると
ジャンプカット動画が完成してます！！！！

#重要なところ
```python
 output = subprocess.run(["ffmpeg", "-i", movie, "-af", "silencedetect=noise=-33dB:d=0.6", "-f", "null", "-"], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
```
　この行が無音時間を検出するコマンドをsubprocessで回しています。
　「silencedetect=noise=-33dB:d=0.6」で無音状態の判定基準を決めています。
-33dBの音量が0.6秒続くと無音であると判定されるみたいです。
　ここのパラメータは、動画ごとに調整が結構必要ですね。
　ここで、返っていた結果をテキスト処理して、[無音開始時間,無音終了時間]のリストを作り、それをmk_jumpcutに渡して、動画を切り出しています。
#一番良い感じの使い道
無音状態の判定基準を緩くして、長回しの動画で音声がある部分を切り取りたいときとか、
粗編集的に使うのが便利そうです。
完成版のジャンプカットを完全に自動化するには、パラメータの調整が必要になってきます。
Excel VBA すでにR元.9.1で入力した文字列を日付に変換するマクロ

https://qiita.com/Q11Q/items/87dda32e09bcaf5ba067
前回令和元年対応の表示形式を設定するマクロを作りましたが、すでに文字列として入力した日付が日付になることはありません。
#正規表現を使って戻します。
選択したセル内に日付らしきものが入っている場合、IsDateで判定してTrueならCdateで変換します
このうちCdateでエラーになるのは小数点で区切る場合のようです。
この場合、正規表現で抜き出してピリオドを書き替えます。
これはExcelのバージョンにもよるかもしれません。

```vb
Sub ReiwaDotSeparetedStringDateSerial()
' Microsoft VBscript regular Expression 5.5 参照設定
' 選択したセルの文字列が日付なら日付変換を試みる。
Dim Reg As New RegExp
Dim MC As MatchCollection, M As Match, buf As String, strDate As String
Dim R As Range
For Each R In Selection
If IsDate(R.Value) = False Then
Reg.Global = True
Reg.MultiLine = True
Reg.IgnoreCase = False
Reg.Pattern = "(令和|令|R)([0-9]{1,2}|元)(\.|年|/)[0-9]{1,2}(\.|月|/)[0-9]{1,2}"
Set MC = Reg.Execute(R.Value)
If MC.Count > 0 Then
strDate = MC.Item(0)
End If
    If Reg.Test(strDate) Then
      buf = Replace(Replace(strDate, ".", "/", 1, -1, vbTextCompare), "元", "01", 1, 1, vbTextCompare):
      R.Value = CDate(buf)
      Else
     Debug.Print "Error : 日付変換できません", R.Address, R.Value
    End If
Else
R.Value = CDate(R.Value)

End If
Next
End Sub

```

##RegExp 非参照設定型

参照設定なんて知らないという人はこちらを。
素人用に対応を強化しています。
###強化点
####全角数字対応
地球上には数字を全角で入れるどうみてもPCを使うなよという人が多いです。全角数字は現在のパターンでは拾えないし、拾う気も全くありません。そのかわりStrConvで対応しました。
####日付の文末が空白でも日でも対応
少しわかりにくいと思いますが、この点だけ正規表現を強化しました。これはあとで別の記事にします。

```vb
Sub ReiwaDotSeparetedStringDateSerial2()
' 非参照設定型　Microsoft VBscript regular Expression 5.5 参照設定
' 選択したセルの文字列が日付なら日付変換を試みる。
' 全角対応
' 末尾がR元．８．１．のようにピリオド終了も訂正するタイプ
Dim Reg: Set Reg = CreateObject("VBScript.RegExp")
Dim MC 'As MatchCollection
Dim M 'As Match
Dim buf As String, strDate As String
Dim R As Range
With Reg
For Each R In Selection
If IsDate(R.Value) = False Then
.Global = True
.MultiLine = True
.IgnoreCase = False
.Pattern = "(令和|令|R)([0-9]{1,2}|元)(\.|年|/)[0-9]{1,2}(\.|月|/)[0-9]{1,2}($|日|\.)" '($|日|\.)は文末か日かピリオド
Set MC = .Execute(StrConv(R.Value, vbNarrow)) '全角の場合、半角にする
If MC.Count > 0 Then
strDate = MC.Item(0)
End If
If Reg.Test(strDate) Then
buf = Replace(Replace(strDate, ".", "/", 1, -1, vbTextCompare), "元", "01", 1, 1, vbTextCompare)
If Right(buf, 1) = "/" Then buf = Left(buf, Len(buf) - 1) 'ピリオド終了（R02.08.01.とピリオドが末尾になる)だと日付にならないためカット
R.Value = CDate(buf)
Else
Debug.Print "Error : 日付変換できません", R.Address, R.Value
End If
Else
If IsError(CDate(R.Value)) = False Then R.Value = CDate(R.Value)
End If
Next
End With
End Sub
```
checklist automation script for CI 

#Outline


テスト自動化をCI（定期的にテストを行う）に乗せる場合、それを考慮した実装になっている必要がある
CIの経験の乏しいテスト自動化エンジニアは、その点の考慮が漏れている場合がある。
そのため、CIに乗せる前に自動化エンジニア各自で確認すべき点をリストアップする


#CheckList

■基本

- 自動化テストの動きを確認すること。自動化テストが成功する事だけを確認しないこと。


■パターンの観点

- 様々なテストデータで実施する
- 条件で動く処理は、両方のデータパターンのテストを実施


■繰り返し実施の観点

- 繰り返し実施して動くことを確認（CIの制約がないこと）
- 途中でなんらかの原因で失敗してもテストデータ等がリセットされ、再実行時正しく動く（テストデータが中途半端な状態にならないこと）
- データ変更などの処理は、繰り返し実施でテストデータが変更するテストになっていることを確認（同じデータで更新処理を繰り返してもテストにならない）
- データ肥大化しないかの考慮。作成処理を繰り返すとゴミデータが増えるため、負荷試験を考慮しない限りは削除も考慮する


■依存JOBの観点

- CIのJOB依存がある場合、それを明確にし、pipeline等を考慮する

■環境の観点 

- cleanな状態・環境（ブラウザを全部閉じた状態等）から自動化をスタートする
- 終了後、cleanな状態（ブラウザが全部閉じる等）になること
- ブラウザのサイズに依存して処理が不安定にならないことを確認（floating機能がボタンを隠してしまうなど）


■パフォーマンスの観点

- 各工程で実行時間が長くなっていないか（repositoryの検索時間等）を確認
- 無駄なwait処理を入れていないかを確認
- waitする必要がある処理で、適切なwait時間（短すぎて失敗しやすい、長すぎて処理時間が長くなる）であるか
rails N+1問題の対策(includes)

# N+1問題
- 複数テーブルに跨る情報を表示する際などに、ループ処理の中で都度SQLを発行してしまいパフォーマンスが低下してしまう問題。
- <font color="DarkSalmon">SQLクエリが 「データ量N + 1回 」走ってしまう</font>ことからこのように名付けられている
- 以下をかなり参考にさせていただきました。
 - [Rails で includes して N+1 問題対策](https://qiita.com/hirotakasasaki/items/e0be0b3fd7b0eb350327)
 - [Rails Guides(Active Record クエリインターフェイス)](https://railsguides.jp/active_record_querying.html)

# N+1問題が発生しうる具体例
- Qiitaのような記事投稿を例にとると...
 - 記事の表示
 - 記事に対するコメントの表示
 - フォロー・フォロワーの表示

などがあります。

# パターン
- 1 対 N パターン
- N 対 1 対 N パターン（ちょっとムズいのでまずは`1 対 Nパターン`から

# 1 対 Nパターン例
引続きQiitaライクなサービスを想像してください。
`User `と`Article`の2つのモデル間で以下のようなアソシエーションが組まれることになるのが一般的。
- `Userは複数のArticle(記事)を持つ`
- `Article(記事)はUserに属する`

```ruby:models/user.by

class User < ActiveRecord::Base
  has_many :articles
end

```

```ruby:models/article.rb

class Article < ActiveRecord::Base
  belongs_to :user
end

```

この状態で全記事のタイトルと書いた人の一覧画面を表示しようとすると以下のような実装となる。

```ruby:article_controller.rb

class ArticlesController < ApplicationController
  def index
    @articles = Article.limit(10)#今回は10人取得しとく
  end
end

```

```ruby:articles/index.html.slim

- @articles.each do |article|
  = article.title
  = article.user.name

```

###こんな感じにするとActiveRecordの機能により以下のようなSQLが発行される

```
# Article.all の実行で記事を取得
SELECT 'articles'.* FROM 'articles' 

# そしてarticlesのuser.name を10回取得するので以下のように10回SQLを発行することになる
SELECT 'users'.* FROM 'users' WHERE 'users'.'id' = 1 LIMIT 1 
SELECT 'users'.* FROM 'users' WHERE 'users'.'id' = 2 LIMIT 1
SELECT 'users'.* FROM 'users' WHERE 'users'.'id' = 3 LIMIT 1
.
.
.
省略
SELECT 'users'.* FROM 'users' WHERE 'users'.'id' = 10 LIMIT 1

```

このように`article.user.name`をN(10)人取り出そうとN + 1回のSQLを発行しパフォーマンスが落ちる原因となる。


####蛇足
※この記事を書くまでアソシエーションによって参照できるデータは`親→子`の一方通行だと思ってた。。。両方可能なのね。。。恥
- アソシエーション （modelの関連付け）に関しては[こちら](https://qiita.com/kazukimatsumoto/items/14bdff681ec5ddac26d1)



# includesで関連付けを一括読み込みする

結論から

```ruby:articles_controller.rb

class ArticlesController < ApplicationController
  def index
    @articles = Article.includes(:user).limit(10)#includesを追加
end

```

こうすることで、関連付けを一括で読み込んでくれて発行されるSQLがこうなるらしい。

```
# Article.all の実行で記事を取得
SELECT 'articles'.* FROM 'articles' 

# 一括で読み込んでくれる
SELECT addresses.* FROM addresses WHERE WHERE `users`.`id` IN (1,2,3,4,5,6,7,8,9,10))

```

# N対1対Nパターン
今回の場合はユーザが記事とコメントをhas_manyしている場合がありそう。
先ほどの`userモデル`に追加する形で以下のようにする。

```ruby:models/user.rb

class User < ActiveRecord::Base
  has_many :articles
  has_many :comments
end
```

```ruby:models/comment.rb

class Comment < ActiveRecord::Base
  belongs_to :user
end
```

```ruby:articles.index.html.slim

- @articles.each do |article|
  = article.title
  = article.user.name
  #記事に対するコメントは複数があり得るため、`each`を入れ子にして表示している。
  - article.user.comments.each do |comment|
    = comment.content

```

登場人物が3人になったためarticle_controller側を変更しないと<font color="DarkSalmon">N+1問題が再び襲来する</font>
以下のように変更する。

```ruby:articles_controller.rb

class ArticlesController < ApplicationController
  def index
    @articles = Article.all.includes(user: :comments).limit(10)#commentsを追加
  end

```

これでN+1問題は解決する。
iOS13でPopoverにもSafe Areaがやってきた。

```iOS12```までは```Superview```に対してConstraintを設定しても、```Safe Area```に対してConstraintを設定しても、下図のように矢印を***含まない***領域にViewControllerが表示されていました。

<img width="487" alt="ss2019-08-21 6.25.51.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95033/6208814f-dbd8-3e6e-9ff5-436ea22d2403.png">

---
しかし、```iOS13```では、```Superview```に対してConstraintを設定すると、
矢印を***含む***領域にまでViewControllerが表示されます。
右端からの距離でレイアウト設定していると右よりに見えてしまいます。

![SS2019-08-21 6.54.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95033/b474c1e8-b0fc-02e1-a8dc-887e0168f520.png)


---
理由は下図のように```Superview```が矢印を***含む***領域まで拡大されているからです。
従来のように矢印を***含まない***領域内に表示するためには```Safe Area```を使用する必要があります。


![SS2019-08-21 6.43.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95033/59fa4686-3927-3fec-c37e-6403e01cc245.png)

---
対策

```Storyboard```で```Use Safe Area Layout Guides```にチェックを付けます。

![SS2019-08-21 6.37.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95033/0e866af9-b101-67d6-feac-d9a019460faf.png)

Superviewに対して設定しているConstraintを
![super.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95033/1096a563-dd75-dee4-6521-f92b8d817945.png)

Safe Areaに対して設定し直します。
![safe.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95033/83da1dad-b5f1-7152-76aa-4ec2dad1aeaa.png)

直りました。
![SS2019-08-21 7.04.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95033/c2ed6439-313c-54de-9b90-d3d7a6db6e4f.png)


---
iOS13 beta 8、Xcode11 beta 6を元に作成しています。
リリース版では変更される可能性があります。
SES で受信したメールを AWS Lambda で gmail に転送する Ruby スクリプト

下記記事を参考にしたが、`Python`だったので`Ruby`で書き直した。

- [Gmail + AWSで独自ドメインのメールを受信する - Qiita](https://qiita.com/komakomako/items/a1ed84b58b46eb434cf2)

SESのリージョンは`us-east-1`を利用。

```ruby
require 'aws-sdk'
require 'mail'

AWS_ACCESS_KEY_ID = "あなたの AWS_ACCESS_KEY_ID"
AWS_SECRET_ACCESS_KEY = "あなたの AWS_SECRET_ACCESS_KEY"
BUCKET_NAME = "mail が保存されている s3 のバケット名"
TO_ADDRESSES = ["mail@example.com"] # 送信したいメールアドレスの配列
SOURCE = "info@example.com" # 送信元メールアドレス

def aws_config_update(region)
  Aws.config.update({
    region: region,
    credentials: Aws::Credentials.new(AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY)
  })
end

def send_mail(ses, subject, body)
  ses.send_email(
    {
      destination: {
        to_addresses: TO_ADDRESSES
      },
      message: {
        subject: {
          charset: "UTF-8", 
          data: subject, 
        },
        body: {
          text: {
            charset: "UTF-8", 
            data: body,
          }
        },
      },
      source: SOURCE
    }
  )
end

def lambda_handler(event:, context:)
  aws_config_update("ap-northeast-1")
  key = event["Records"][0]["s3"]["object"]["key"]
  s3 = Aws::S3::Client.new
  body = s3.get_object(bucket: BUCKET_NAME, key: key).body.string
  mail = Mail.new(body)
  aws_config_update("us-east-1")
  ses = Aws::SES::Client.new
  send_mail(ses, mail.subject, mail.decoded)
rescue => e
  aws_config_update("us-east-1")
  ses = Aws::SES::Client.new
  send_mail(ses, "メール送信エラー", e.message)
end
```

`mail gem`が必要なので、`zip`で固めてアップロードする。

```Gemfile
# Gemfile
source "https://rubygems.org"

git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }

gem "mail"
```

1. `bundle install --path vendor/bundle`
2. `zip -r function.zip lambda_function.rb vendor`
3. `aws lambda update-function-code --function-name lambdaのfunction名 --zip-file fileb://function.zip`
エージェント指向＋サブジェクト指向＋オブジェクト指向＝新たなプログラミングパラダイム～プログラミングのあり方についての研究と考察②

#はじめに
どうも、こんにちは。
前回の記事では、わたしの伝えたいことがうまく読者の方々に伝えられたか心配しておりましたが、
ある読者の方からご質問をいただきまして、こちらの意図を正確にくみ取っていただけたようで、ありがたい限りです。
早速ですが、筆者の頭の中が整理されてきたので、前回の続きの記事を書かせていただきます。


今回は、「エージェント指向」、「サブジェクト指向」、「オブジェクト指向」のそれぞれについて個別に説明しつつ、これらの関係についても、例を用いて解説していきたいと思います。
では、今回もぜひお付き合いください。


#本文
前回のおさらいも兼ねて。

「オブジェクト」とは、現実世界であれば”モノ”にあたります。これは、なんらの意志も持たず、ただ、与えられた状況に対して、受動的に動くことしかできない存在です。
「エージェント」とは、現実世界であれば”ヒト”にあたります。これは、なんらかの意志を持っていて、どのような状況に対しても、能動的に動くことができる存在です。
「サブジェクト」とは、現実世界であれば”コト”にあたります。これは、目に見えないルールや法則(直訳すれば「主題」「課題」といったところ)です。これは、オブジェクトとエージェントを結ぶ、あるいはエージェント同士を結びつける存在であり、エージェントに対しては、行動を促したり、その行動を監視したり、評価する存在です。

ここからは、話をわかりやすくするために、あるたとえ話をさせていただきます。
この記事を読んでいるあなたは、今、休日中の学生だとします。
学校や教師からは、ある決められた宿題が与えられているとします。
※これが、サブジェクトの持つ機能である「状況の生成・状況の通知」です。
そしてあなたには、まじめに宿題に取り組むことも、宿題をせずに遊んでしまうこともできます。
※これが、サブジェクトの持つ機能である「権利・権限の付与と通知」です。
そして、あなたは、今、自分に与えられている状況と権利・権限と、自分自身の生きる目的だったり目標、あるいはこの時の気分に従い、宿題に取り組むことにしました。
※これが、エージェントの持つ機能である「状況の分析」「状況の判断」そして「意志決定」です。
そして、宿題にまじめに取り組んだ結果、あなたは学校や教師から高く評価されるようになり、今後、学校の図書を優先的につかわせてもらえる権利・権限を与えられたとします。
※これが、サブジェクトの持つ機能である「行動の監視・評価」と「アクティヴィティログのポリシーへの反映(権利・権限の拡大)」です。
※この逆もありえます。もし、あなたが学内で不適切な行動を取ったばあい、学内での権利・権限が縮小してしまうかもしれません・・・。

オブジェクトについては、話は比較的わかりやすいと思うので、簡単に解説します。
やはり、あなたは学生で、学校や教師からは学校の図書を借りる権利・権限を与えられています。(正確には権利・権限はサブジェクトが与えています)。
※ここで出てくる”学校の図書”が「オブジェクト」にあたります。つまり、学生(エージェント)であるあなたは、学校の図書(オブジェクト)にアクセスすることができるということです。

ここで、あなたは学校や教師からは図書を借りる権利・権限が与えられているので、これを借りることにしました。
ところで、なぜ、ここでの権利・権限は、正確にはサブジェクトが与えるのかといえば、本来、権利・権限は各人に平等に(それも生来的に)与えられているものであり、ヒトがヒトに与えるものではないからです。たとえば、”憲法や法律”は、目には見えませんが、現実の中で確かに効力を発揮していますし、ヒトに(ある一定度の)自由を与えたり、自由を制限したりしています。
ですから、エージェント(ヒト)が同じエージェントに権利・権限を与えるのではなく、サブジェクトが直接、(同じエージェントを介さずに)エージェントに権利・権限を与えていると考えたほうが合理的なわけです。たとえば、生まれたての”赤ん坊”を殺す権利はだれにもないですし、赤ん坊は生まれたときからすでに一定の権利(生存権)を有しています。これは親が与えたものでしょうか？それとも国家が与えたものでしょうか？わたしはそのいずれでもないと思います。ですから(わたしの中では)、必然的に「サブジェクト」という発見・発想に至ったのです。


#まとめ
”まとめ”といっておいてなんですが、今回は、内容をうまくまとめる自信がありません。
しいて言えば、これらの、”モノ”と”ヒト”と”コト”を、うまく組み合わせて、システムを形作っていく＝全体を構成していくといえばいいでしょうか。
筆者はなにぶん未熟なので、読者の方々には余計な混乱(と迷惑)を招いてしまうだけかもしれません。
ですが、自分の考えやアイデア(？)を一人でも多くの方に伝えられたら、と思い書かずにはいられませんでした。
次回も同じテーマで記事を書き、Qiitaで発表させていただけたらいいなと思います。

今回はこれで終わりにしたいと思います。
お付き合いくださり、ありがとうございました。
NativeBase 選択していないチェックボックスにも✔︎が付く

NativeBaseをバージョンアップしたら
・選択していないチェックボックスにも✔︎が付く
・ボタンに色がなくなった
などが発生...

<img width="321" alt="スクリーンショット 2019-08-20 22.30.36.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317701/14abbc0f-af3b-f55b-a49b-542840e28218.png">

2019/09/26
nativebaseのslackに投げてみたけど反応なく、その後issueが立てられてたので参考に
https://github.com/GeekyAnts/NativeBase/issues/2891

## 前提

native-base: 2.12.2以降

NativeBaseでデフォルト以外のテーマを使用している

## 結論

`theme/variables/`以下の変数に変更が入った。

2.12.2から2.12.3へのバージョンアップ時に大きく変更されているので
`theme/variables/`をよく確認、変更された場合、同じ対応を行う必要がある。

>・選択していないチェックボックスにも✔︎が付く

StyleProviderで設定しているスタイルに
`checkboxDefaultColor: 'transparent',`を追記

>・ボタンに色がなくなった

これも同じような理由

### なぜこうなった

>・選択していないチェックボックスにも✔︎が付く

native-base 2.12.2でCheckBoxが選択されていない場合の、colorが変数化されていた。
テーマ側でcheckboxDefaultColorが設定されていない場合、
checkboxDefaultColorがundefinedになるので、デフォルトの黒で表示される。

https://github.com/GeekyAnts/NativeBase/pull/2777

## 最後に

NativeBaseの`theme/variables/`の変更を追う。
途中参加の初NativeBaseプロジェクトだったので気づくのに時間がかかった
【Vue初心者向け】シンプルなクラスバイディングのサンプルコード

##クラスを動的に切り替えたい時にはクラスバイディング
例えば、クラスをつけたり外したり、変えたりしたいことがあります。
そんな時はクラスバイディングを利用すると簡単に実装できます。
[ドキュメント：クラスとスタイルのバインディング](https://jp.vuejs.org/v2/guide/class-and-style.html)

上記の公式のドキュメントの通りですが、実際の動作とコードを合わせて確認した方がわかりやすいと思いますので、以下サイトで実際の動作とサンプルコードを確認できるようになっています。

[クラスのバインディングのサンプルコード](https://code.ameneko.com/class-binding)

このサンプルコードではわかりやすく、ボタンを押すと、「active」の真偽値が変化し、クラスをつけたり外したりします。それによりactiveクラスが付いている時はCSSが効いて文字が赤くなります。

##コード
```
<template>
    <div class="class-binding">
        <div :class="{ active: isActive }">文字の色が変わります！</div>
        <button @click="changeActive">色をチェンジ</button>
    </div>
</template>

<script>
export default {
    data(){
        return{
            isActive: true
        }
    },
    methods:{
        changeActive(){
            this.isActive = !this.isActive
        }
    }
}
</script>

<style scoped>
.active{
    color: red;
}
</style>
```
宣伝：ブログ書いてます。→[ブログ](https://www.katonobo.com/)
Azure VMをResize時に "not compatible with enabling accelerated networking" と言われたときには

完全に自分用メモ。

---

## まえおき

`D4s_v3` (16GM RAM, 4vCPU)から `B2s` (4GM RAM, 2vCPU) にリサイズしようとしたところ、

Standard_B2s は `not compatible with enabling accelerated networking` だ！

みたいなエラーが出た。（スクショとり忘れた... :sweat_smile: ）

## accelerated networkingをオフるには？

Webコンソールだとどこにも導線がみつからず、azure cliでしかできないらしい。

https://social.msdn.microsoft.com/Forums/azure/en-US/753ed17c-8442-4328-a538-fe6fed7fd2d5/how-to-disable-accelerated-network-on-azure-vm?forum=WAVirtualMachinesforWindows

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74571/425f21e6-5c50-6075-28c0-ea04e6f6d197.png)

（ちなみに、AzureあるあるというかMicrosoftあるあるなんだけど、ヘルプページは日本語も英語も意味不明！！　↑のフォーラムページでも「ここみたら書いてあるよ」ってリファレンスのリンクがあったりするが、まったく解決はしない！）

## azure cliでaccelerated networkingをオフる

AWS CLIはよく使っていたが、Azure CLIは初めてなのでメモ。

### 使えるサブコマンドを知る

```
$ az network nic 
az network nic: error: the following arguments are required: _subcommand
usage: az network nic [-h]
                      {create,delete,show,list,show-effective-route-table,list-effective-nsg,update,wait,ip-config}
                      ...
```

なんとなくAWSに似てる。

### az network nic list

```
az network nic list --resource-group リソースグループ名
```

JSON配列がどばっと返ってくる。

### az network nic show

```
az network nic show --name NetworkInterface名 --resource-group リソースグループ名
```

これで正しくJSONが返ってきたら、それをめがけてupdateする。

### az network nic update

```
az network nic update --name NetworkInterface名 --resource-group リソースグループ名 --accelerated-networking false
```

## あらためてResizeするぞ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74571/a248fb4d-8fc0-a609-86fc-c268fecd0d01.png)

できた。
APIってこんな感じね！

#APIとはなんぞや？？？

初めまして！
JAVAを学びたて、初投稿のぽんぽこです。

不備がございましたらご指摘の程よろしくお願い致します。

では本編へ、、、

自学の為に何か作ろうかと考えた。。。

どうせなら人の役に立つための物を作りたい。

ただ、簡単すぎる物を作っても自分のためにならない。

さらに考えた、そこであるワードを思い出した。

### 『API』

しかし、聞いたことはあるものの何かわからない。

そこで調べに調べた。

APIとは「Application Programming Interface」の頭文字だそうだ。

訳すると「アプリケーション、ソフトウェア」と「プラグラム」をつなぐもの。

ソフトウェアにAPIという外部とやりとりする窓口を作り、外部アプリとコミュニケーションや連携ができる状態にすることで機能性を拡張させ、さらに便利に使えるようにし、欲を言えば両方のアプリにとってウィン・ウィンの状態を生み出すことが目的。

主に利点は以下の3つ

・ソフトウェア開発の効率化
・セキュリティの向上
・最新情報を簡単に取得可能

上記の理由から様々な企業がAPIを採用している。
例えば、Amazon、Facebook、Twitter、Google、ぐるなび、楽天などだ。

ではデメリットは？
うまい話には裏がある。ということで以下だ。

提供されているAPIの仕様が変わったり、提供自体を停止されてしまった場合には、
APIを利用している箇所に不具合が生じてしまう。

どういうことかというと、自分の予期しないタイミングで予期していない不具合が発生し、
あたふたしちゃうよ〜ということ。

APIはAPIでもよく使われているのはWeb API出そうだ。
上記で述べている企業もWeb APIを使っているのだ。

何となくAPIのイメージは掴めた。
じゃあWeb APIってなんだよ！！！

続く。。。
Rで時系列のダミーデータを作成する

時系列データをもとにクラスタリングを行うためのダミーデータを作成した。

```r
n.class <- 5  # クラスの数
n.repeat <- 4 # 各クラスの測定個体数
n.freq <- 8   # 各個体の測定回数
sd <- 0.1     # 誤差

tbl <- expand.grid(nth=(1:n.freq),
            rep=as.character(1:n.repeat),
            class=(letters[1:n.class])) %>% 
  dplyr::as_tibble() %>% 
  dplyr::mutate(t=runif(n.repeat * n.class * n.freq),   # 各測定の時刻 t
                # 各クラスの真の時系列変化 + 誤差
                y=case_when(class=="a" ~ sin(t*2*pi) + rnorm(n(), sd = sd),
                            class=="b" ~ cos(t*2*pi) + rnorm(n(), sd = sd),
                            class=="c" ~ sin(t*0.4*pi + 3.5) + rnorm(n(), sd = sd),
                            class=="d" ~ sin(t*0.2*pi) * cos(t*pi) + rnorm(n(), sd = sd),
                            class=="e" ~ sin(t*0.2*pi - 1.5) * cos(t*2*pi) + rnorm(n(), sd = sd)),
                id=rep(1:(n.repeat*n.class), each=n.freq)) # 測定に対するid

tbl
```
```
# A tibble: 160 x 6
     nth rep   class     t      y    id
   <int> <fct> <fct> <dbl>  <dbl> <int>
 1     1 1     a     0.113  0.594     1
 2     2 1     a     0.396  0.635     1
 3     3 1     a     0.297  1.16      1
 4     4 1     a     0.745 -0.909     1
 5     5 1     a     0.894 -0.659     1
 6     6 1     a     0.862 -0.737     1
 7     7 1     a     0.752 -1.05      1
 8     8 1     a     0.810 -0.860     1
 9     1 2     a     0.420  0.408     2
10     2 2     a     0.392  0.510     2
# … with 150 more rows
```
プロットする。

```
ggplot(data = tbl, mapping = aes(by=rep)) +
  stat_function(size=0.1, fun = function(t) sin(t*2*pi)) +
  stat_function(size=0.1, fun = function(t) cos(t*2*pi)) +
  stat_function(size=0.1, fun = function(t) sin(t*0.4*pi + 3.5)) +
  stat_function(size=0.1, fun = function(t) sin(t*0.2*pi) * cos(t*pi)) +
  stat_function(size=0.1, fun = function(t) sin(t*0.2*pi - 1.5) * cos(t*2*pi)) +
  geom_line(aes(x=t, y=y, color=class)) +
  geom_point(aes(x=t, y=y, color=class))
```
![000044.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83764/7f493077-1b87-80a8-38f6-6389c5724e16.png)
tが時刻、yが観測値、色がclass、黒い実線が各クラスの真の時系列変化、各色のラインが個体別の観測、各点がその観測値を示す。
Google Cloud Platform Big Data and Machine Learning Fundamentalsを受講した話

# 3行で
https://www.coursera.org/learn/gcp-big-data-ml-fundamentals
GCPを使ったスケーラブルな機械学習の基本コース
Core Infrastructureより機械学習寄りだがぶっちゃけ大差ないように思う


# どんな人におすすめか
必須
・英語字幕で動画が理解できる
・クラウドサービスと機械学習に興味がある（触ったことがなくてもOK）

推奨
・SQLを触った事がある（SELECT, WHERE, GROUP BYの意味ぐらいわかればいい）
・オンプレの計算資源に依存しない機械学習システムを構築したい問題意識がある

不適
・クラウドサービスを完全に理解しているマン
・どうしてもAWSしか使いたくないマン
・機械学習のモデリング部分にしか興味がない人


# どんなコースか
GCPを使って機械学習すると何がうれしいのか？
GCPを使った機械学習システムの構築例はどんなものか？
実際に構築してみよう！（Qwiklabs）
という構成になってます。

ただし、モデル構築の話はあまり触れません
学習部分はBQMLを使ったAutoML、VisionAPIで学習済みモデルのfine tuneです。

Core Infrastructureと同じくGCPの機能の紹介と試用がメインで
受講者は指示に従って推奨される使い方を学べる


# 感想など
これぐらいのことが何も考えずにできてしまうのか・・・というのが最初の感想。
どういうアウトプットが欲しくてインプットが何かわかれば、それなりのモデルは作っちゃうよ！という感じ。
これに僕が自前で作ったモデルが勝てるだろうか。勝てないと困るな？（評価してない。そのうち勝負したい）
ただ、結局自前で画像認識モデルの転移学習するにしても、単にResNetの転移学習するだけならGoogle様の知見に勝てるとは思えないんだよな。
仕事でモデリングするにしても、こういうAutoMLをプロトタイプに使えるといいんだろうな。
裏でどういうアルゴリズムが動いてModel selectionしてるのかは説明されません。

コースの実習はほぼ何も考えずにできてしまう。
どういう入力をすればいいかだいたい指示される。
この意味で、Core Infrastructureと大差ない。
とりあえず使った感触は得られるけど、自分の身にするには、例えば自前の問題なんかで使ってみないとダメ。
導入としてはいい。とりあえず動くサンプルコードを写経してるような感じ。
我流で覚えるよりはよっぽど良いし効率的なように思う。


# お得な情報
やはり基本無料です。
実習をやるにはenrollが必要。7日以内なら無料。
土日フルか平日に1日1つLabをこなせば完走できる。（僕は引っ越しがあったせいで完走失敗して5000円払った）


# さらに深堀りするには
最後に色々示されるけど
https://www.coursera.org/learn/end-to-end-ml-tensorflow-gcp
僕はこれやってます。
Big Data and Machine Learning Fundamentalsは使い方のレクチャーという感じだけど
End-to-End Machine Learning with TensorFlow on GCPは考え方のレベルから講義があるし
実習も少しは自分で調べながらやるようなものになってる。
ただ、途中までやったけど、TFの学習が自己流だったこともあって
https://www.coursera.org/specializations/machine-learning-tensorflow-gcp
これを受講しなおしたい気持ちにはなってる。
End-to-End Machine Learning with TensorFlow on GCPのほうがAdvancedらしい。
UnityでPostgreSQLを使う

# 環境
Unity 2017.1
Windows10
PostgreSQL 9.6.3
.Net 4.6

# 前提
PostgreSQLはインストール済み、データベースとその中身も既にある

# やること

### 1,https://github.com/npgsql/npgsql/releases から対応バージョンのmsiをダウンロード

どのバージョンがどういう対応しているかは今はわかんない


### 2,msiを実行・解凍し、「Npgsql.dll」をAssets以下のどこかに入れる

https://symfoware.blog.fc2.com/blog-entry-2386.html
↑以下こちらの記事から抜粋
取ってきたmsiを実行
「Npgsql GAC Installation」にチェックを入れてインストール。
すると、
>C:\Windows\Microsoft.NET\assembly\GAC_MSIL\Npgsql\ (バージョンフォルダ)\

辺りにNpgsql.dllができる
### 3,UnityEditorのdllファイルが置いてある場所から、「System.Data.dll」をコピーして、同様に対象のプロジェクトのAssets以下のどこかに入れる

2017以降だと、
"Unityのダウンロード先\Editor\Data\Mono\lib\mono\2.0"
にある。EditorフォルダにUnityEditorの実行ファイルがあるので、ショートカットから辿ってもいい。

UnityHubだったらHubのメイン画面から「インストール→対象バージョンのメニューバー→エクスプローラーで開く」からダウンロード先フォルダに飛べる

###以上で環境構築が完了
ここまでで、対象のプロジェクトがこんな感じになっていればOK

![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254776/8e96fe88-065b-a85f-0023-c2312c8853e5.png)

#コード
```cs:
using UnityEngine;
using Npgsql;

public class SQLExample: MonoBehaviour
{
    void Start()
    {
        //ここを実行環境に合わせて変える
        string connectionString =
          "Server=ServerName;" +
          "Database=DBName;" +
          "User ID=Id;" +
          "Password=Pass;";

        using (var dbcon = new NpgsqlConnection(connectionString))
        {

            dbcon.Open();
            NpgsqlCommand dbcmd = dbcon.CreateCommand();
            //　ここら辺を欲しい内容に合わせて変える
            string sql =
          "SELECT *" +
          "FROM user_list";
            dbcmd.CommandText = sql;
            NpgsqlDataReader reader = dbcmd.ExecuteReader();
            while (reader.Read())
            {
                //　ここら辺を欲しい内容に合わせて変える
                string FirstName = (string)reader["first_name"];
                string LastName = (string)reader["last_name"];
                Debug.Log(FirstName + " " + LastName);
            }
            // clean up
            reader.Close();
            reader = null;
            dbcmd.Dispose();
            dbcmd = null;
            dbcon.Close();
        }

    }
}

```
コードはテストコードをコピーしているので適当
usingが冗長かな…?
再生ボタンを押すとクエリが実行される



# UnityでMySQLではなくPostgreSQL を使いたかった
MySQLなら記事がたくさんあったが、PostgreSQLでは一切Unityに関する記事が見つからない
けど、PostgreSQLで過去に作ったDBがあり、どうしてもそこを使う必要があった
実際にやることはそんなに多くないが2時間以上調べるのにかかったのでつらかった

# 古い仕様
### ~~1, http://pgfoundry.org/frs/?group_id=1000140 からDLLのZipをダウンロード~~
<font color="Red">~~URLのリンク切れでスポーツジムのサイトに飛ぶようになっているので直します~~</font>
~~基本的には最新版の内、自分の環境にあったものを持ってくる。今回は.Net4.6だったので、「○○-net40.zip」を使った。多分「○○-net45.zip」でも動く~~
### ~~2,zip中の「Npgsql.dll」を対象のプロジェクトのAssets以下のどこかに入れる~~
Excelで必ず使う VBA 選択したセルに令和元年の表示形式を設定するマクロ

#レジストリの設定によらず、2019年5月1日以降を令和元年5月1日にするマクロ

```vb
Sub InsertNumberFormatToActiveRange()
'For Excel 2013 Later
' When Japanese Era Reiwa has been already written "
' Select Range whitch You want to set Numberformat(Local), and run this VBA Macro
' 平成30年12月05日、令和元年05月01日、令和02年01月01日のように元年をレジストリの設定によらず元年表記にします。
' なぜか令和2年にする人が多いですが、10年になるとソートができないので02年表記を推奨します。どうしてもしたくない場合はeeではなく、eにしてください。mm、ddも同様に01のように表示したくない場合はm、dにしてください。ただしソートがうまくいかなくなります。
Dim Rng As Range, R As Range
Set Rng = Selection
For Each R In Rng
Debug.Print R.Value, R.Formula, R.NumberFormatLocal, R.NumberFormat
Selection.NumberFormatLocal = ""
Selection.NumberFormatLocal = _
"[<43586]gggee""年""mm""月""dd""日"";[<43831]""令和元年""mm""月""dd""日"";gggee""年""mm""月""dd""日"""
Next
End Sub 
```

#レジストリの設定によらず2019年5月1日以降をR元.5.1にするマクロ
どうしてもR表記をしたいという信じがたいことをする人間が多いので、しかたなく作りました。

```vb
Sub InsertNumberFormatToActiveRangePeriod()
'For Excel 2013 Later
' When Japanese Era Reiwa has been already written "
' Select Range whitch You want to set Numberformat(Local), and run this VBA Macro
' H30.12.05、R元.5.1、R2年1月1日のように元年をレジストリの設定によらず元年表記にします。区切りは半角のピリオドです。
' なぜかR2にする人が多いですが、10年になると文字列の場合ソートができず、並ばないので02年表記を推奨します。しかしそれは上でやっているので、1桁は1桁表示、0埋めなしにします。
Dim Rng As Range, R As Range
Set Rng = Selection
For Each R In Rng
Debug.Print R.Value, R.Formula, R.NumberFormatLocal, R.NumberFormat
Selection.NumberFormatLocal = ""
Selection.NumberFormatLocal = _
"[<43586]ge"".""m"".""d"""";[<43831]""R元.""m"".""d"""";ge"".""m"".""d"""""
Next
End Sub
```

#元号対応はいろいろある
https://www.waenavi.com/entry/20190401/1554087637
ただし

>（２）日付が令和にならないのはユーザの責任です！
日本時間の2019年5月15日（水）に「累積的な更新プログラム」として配信され、令和に対応するプログラムが自動的に更新されるようになりました（再起動が2回必要）。
したがって、現時点でExcelで「令和」が表示されないのであれば、それはマイクロソフトの責任ではありません。パソコンのユーザ側に100％の責任があります。和暦を使わないのであればそのまま放置しても全く問題はありませんが、業務で和暦を使うのであればユーザの責任で各自対応する必要があります。

#必ず使うシリーズは
これはExcelの場合、Addinに登録することを想定しています。するとマクロを組まなくても使えるからです。

#ユーザーに責任があるというのは誤りです

 1. 元号を決めたのはユーザーではなく政府です
 2. むりやり元年を使えという口先だけ都合がいいときだけグローバルや法治主義をもちだすバカな政府が原因です
 3. もちろんそれになにもしない国民はバカすぎてはなしになりません。
 4. しかしURLをみたらわかるとおり、元号対応は一意ではきまりません。８つ以上の対応、中にはレジストリの確認も含まれます。このような「対応」をユーザーに求めるのは不可能です。レジストリに設定したからMSに責任はないなどとは失笑ものです。MSがいつ「責任」をとったことがあるのでしょうか。やるのはサポートだけです。マイクロソフトが責任を取らないのに、ユーザーに責任があるなどとはどこに根拠があるのでしょうか。法律的にちゃんと説明してください。道義的にもあり得ないですよ。結局責任というものを理解していない。利益は取るけど、責任は負わない。これがIT業界に蔓延して腐敗しきっているという根拠です。
 5. むろんIT業界として言いたいことはわかります。「元号なんて使うな」これは正しいです。ありとあらゆる意味でソートする方法がないため、信用ができない。非常にリスクが高く、ばかげておろかな行為です。ウィルスをしかけているのと一緒くらいなレベルだと理解しています。どういう方法をとっても令和は平成ほどうまく変換できない。5月1日で平成と令和の混在期間が長すぎるなど、背景はたくさんあります。それはわかるのですが、ユーザーのせいじゃないじゃないですか。元号に対応できるといった人たちが悪いんですよ。できないならできないって言わずに、ユーザーを罵倒する。それじゃ、ユーザーからブチ切れられることになる。決まっているじゃないですか。
 6. もちろん一般的にも相手方に渡す書類や、Accessで言えばレポートに表示させるとき以外は使っていないと思いますが。それを強制する政府や追従する産経新聞などは、国民にいかにITを使わせたくないか、生産性を向上させたくないか、構造改革なんてやりたくないかということがわかるわけです。しかも政府のバカもマスコミもほんとうは元号なんて馬鹿にしている。単純に相手を恫喝する手段にしか思っていない。
 7. なのでユーザーに責任がありますというのは高速道路で人をぶん殴っている奴が「おれは悪くない、相手が車をぶつけてきたらかだ」というのとあまり変わらない。大体あのぶん殴っている人って非常に今の平均的な日本人そのものです。他責性がつよく、人に責任を押し付けて罵倒するスタイル。こういう「ユーザーに責任がある」というのは高速道路でぶん殴っているのとあまり変わらない行為です。それが分からない日本人が多いけどね。