OmniAICreator/Qiita-1.07M huggingface dataset:
vue cliのscroll behavior: アンカーリンクをつくる方法

こんにちは。備忘録です。

ページ内にたくさんの記事があるとします。1ページに表示されている記事数は5つ。ところが一番下にある「もっと読む」というボタンをクリックすると、新たに5記事が表示される。そんな動きをしたいとします。

ところがアンカーリンクを設定しなければ、「もっと読む」をクリックしたときにページのトップに連れて行かれてしまいます。UX的には、「もっと読む」をクリックしたときは、トップに飛ばされないまま、続く5つの記事が見たいです。

こんなとき、vue.jsではscroll behaviorという機能を使って、トップに連れて行かれないよう調整することができます。

（下に来る例が上にくる例と違うので紛らわしいのですが、、、）

### Step 1. RouterのJSファイルをいじる。

```
const router = new Router({
  mode: "history",
  scrollBehavior(to, from, savedPosition) { //ここでscrollを調整する。ここにはto, from, savedPositionの三つの引数が入ります。
    if (savedPosition) {
      return savedPosition; //戻る（👈）もしくは進む（👉）ボタンを操作したときは、デフォルトのpositionでロードしてください。
    } else { //そのほかの場合はこのpositionを効かせてちょうだい。
      const position = {};
      if (to.hash) { //hashがあれば……
        position.selector = to.hash; //positionはhashが指定したところだよ。
        if (to.hash === "#animal") { //hashがanimalというidを指定しているのであれば
          position.offset = { y: 200 };　//offsetを効かせてください。※ここはoffsetを効かせていますが、なんでも指定できます。
        }
        if (document.querySelector(to.hash)) { 
          return position;//hashがあれば、そのpositionを教えてください。
        }
        return false; //そもそもhashがなければ、デフォルトの操作をしてください。
      }
    }
  },
routes: [
    {
      path: "/",
      name: "Home",
      component: Home,
      props: true
    }
});
```

### Step 2. Scroll behavior を効かせたい instance/componentをいじる。
```
<section class="zoo-information">
      <h1>Our Zoo</h1>
      <p>{{zoo.description}}</p>
</section>

<section class="animals">
      <h2>I think {{ animal.name }} is the best</h2>
      <div class="cards" id="animal"> 
        <div v-for="animal in animals" :key="animal.slug" class="card">
          <router-link
            :to="{
              name: 'animalDetails',
              params: { animalSlug: animal.slug},
              hash: '#animal'
          }"
          >　//ここにクリックしたとき、トップに行かず、#animalのところで位置をキープしたい
            <img :src="require(`@/assets/${animal.image}`)" :alt="animal.name" />
            <span class="card__text">{{ animal.name }}</span>
          </router-link>
        </div>
      </div>
      <router-view :key="$route.path" />
    </section>
```

何も設定しなければ、`router-link`のリンクをクリックしたとき、`.zoo-information`がトップにくるようページが表示されるでしょう。でも、せっかく`router-link`をクリックしているので、UX的にも`router-link`をクリックしたときは`router-link`の中身がページのトップにくるよう表示したいです。

そこで`to.hash`をrouter.jsで指定しておくと、`router-link`をクリックしたときに`id="animal"`と書かれた部分がページのトップにくるよう位置を指定できるのです。

なかなかのツワモノです。
pythonで自作パッケージをsetup.pyで作成する流れ

## はじめに

pythonで自作パッケージを`setup.py`で作成する流れです。
意外と`module not found`のエラーで手こずってしまったのでこちらに忘れないようにメモを残していきたいと思います。
今回はとくにPyPiなどにあげることはせず、単純にローカル環境で`pip install`する手順を整理する感じです。

## 流れ

1. `sample.py`、`__init__.py`、`setup.py` の内容を記述する
2. `pip install` してローカルにパッケージをインストール
3. `foo.py`の内容を記述して走らせる

## ディレクトリの構造

以下の構造にて

- `sample.py` に入っている関数を`pip install`でインストールして
- `foo.py`でその関数たちを走らせるとします。


```
Documents
└ tasks_project
  ├ src
  │   └ tasks
  │       ├ __init__.py
  │       └ sample.py     # sample.pyにある関数をパッケージ化したい
  ├ hoge
  │   └ foo.py            # foo.pyでsample.pyの関数を走らせる
  └ setup.py
```

この二つのディレクトリは従兄関係なので普通に相対インポートすると以下のようなエラーが出てしまいます。

```
attempted relative import beyond top-level package.
```

なので以下のようにしてpip でインストールしてどこからでもimportできるようにしていきます。

## `sample.py`、`__init__.py`、`setup.py` の内容を記述する

### sample.py の内容

`sample.py`では欲しい関数を書いていきます。シンプルに以下のようなものを書いてみました。
`numpy`や`pandas`がちゃんと使えるのか確認したかったのでいろんなモジュールをインポートしています。

```python
import numpy as np
import pandas as pd
import datetime

def hello():
    print("hello_world")


def get_array():
    return np.array([1, 2, 3])


def get_df():
    return pd.Series([1, 2, 3])


def get_date():
    print(datetime.datetime(2019, 12, 1, 1, 1, 1))
```

### `__init__.py` の内容

ここを自分は書いていなかったため、`module not found`エラーを吐かれていたのではないかと考えています。
ここでどの関数を`pip install`の際にインストールするかの設定をする感じです。

```
from .sample import (
    hello,
    get_array,
    get_df,
    get_date,
)

__version__ = '0.1.0'
```


### `setup.py` の内容

`setup.py`で`pip install` する際の一番大事な設定を行います。
以下では`name`、`version`、`packages`、`package_dir`ぐらいをちゃんと書いておけば大丈夫だと思います。

```
"""Minimal setup file for tasks project."""

from setuptools import setup, find_packages

setup(
    name='tasks',
    version='0.1.0',
    license='proprietary',
    description='Module Experiment',

    author='greenteabiscuit',
    author_email='hogehoge@gmail.com',
    url='None.com',

    packages=find_packages(where='src'),
    package_dir={'': 'src'},
)

```

## `pip install` する

`tasks_project`の一つ上のディレクトリ（今回の場合は`Documents`）に移動した上で、`pip install`を行います。

```bash
$ cd Documents
$ pip install ./tasks_project/

Processing ./tasks_project
Building wheels for collected packages: tasks
  Building wheel for tasks (setup.py) ... done
.......... 略 ..........
Successfully installed tasks-0.1.0
```

`Successfuly installed`と出たら成功です。

## `foo.py`の内容を記述して走らせる

```python
import tasks

tasks.hello()

arr = tasks.get_array()
print(arr)

df = tasks.get_df()
print(df)

tasks.get_date()
```

こちらを書いたら以下で走らせてエラーもなく結果が出されるはずです。

```
$ cd Documents/hoge/
$ python foo.py

hello_world
[1 2 3]
0    1
1    2
2    3
dtype: int64
2019-12-01 01:01:01
```

## 最後に

これでテストコードなどを書くのが少し楽になりそうです。
もっと早く知りたかったのですが、なぜかいい記事があまり見つからず。。。
以下の書籍の内容を参考にしています。

> [Python Testing with pytest: Simple, Rapid, Effective, and Scalable (English Edition)](https://www.amazon.co.jp/dp/B0773VRHWT/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)
【今日のアブストラクト】The Early Phase of Neural Network Training【論文 DeepL 翻訳】

1 日 1 回 (努力目標) 論文の Abstract を DeepL 翻訳の力を借りて読んでいきます.

この記事は自分用のメモみたいなものです.
ほぼ DeepL 翻訳でお送りします.
間違いがあれば指摘していだだけると嬉しいです.

翻訳元
[The Early Phase of Neural Network Training](https://arxiv.org/abs/2002.10365)

# Abstract

### 訳文

最近の研究では, ニューラルネットワーク学習の多くの重要な側面が, 訓練のごく初期のイテレーションやエポックの中で行われていることが示されている. 例えば, スパースで訓練可能な部分ネットワークが出現し (Frankle et al., 2019), 勾配降下が小さな部分空間に移動し (Gur-Ari et al., 2018), ネットワークは臨界期を迎える (Achille et al., 2019). ここでは, ディープニューラルネットワークが訓練の初期段階で受ける変化を調べる. 我々は, 訓練の初期のイテレーション中にネットワークの状態を広範囲に測定し, Frankle et al. (2019) のフレームワークを活用して, 重み分布とデータセットの様々な側面への依存度を定量的に調べる. この枠組みの中では, ディープネットワークは符号を維持したままランダムな重みで再初期化してもロバストではなく, わずか数百回の反復の後でも重み分布は非常に非依存的であることを発見した. このような動作にもかかわらず, ぼやけた入力や補助的な自己教師付きタスクを用いた事前訓練では, 教師付きネットワークの変化を近似することができ, ラベルはこのプロセスを大幅に加速させるが, この変化は本質的にラベルに依存しないことを示唆している. これらの結果は, この学習の重要な初期期間に発生するネットワークの変化を明らかにするのに役立つ.

### 原文

Recent studies have shown that many important aspects of neural network learning take place within the very earliest iterations or epochs of training. For example, sparse, trainable sub-networks emerge (Frankle et al., 2019), gradient descent moves into a small subspace (Gur-Ari et al., 2018), and the network undergoes a critical period (Achille et al., 2019). Here, we examine the changes that deep neural networks undergo during this early phase of training. We perform extensive measurements of the network state during these early iterations of training and leverage the framework of Frankle et al. (2019) to quantitatively probe the weight distribution and its reliance on various aspects of the dataset. We find that, within this framework, deep networks are not robust to reinitializing with random weights while maintaining signs, and that weight distributions are highly non-independent even after only a few hundred iterations. Despite this behavior, pre-training with blurred inputs or an auxiliary self-supervised task can approximate the changes in supervised networks, suggesting that these changes are not inherently label-dependent, though labels significantly accelerate this process. Together, these results help to elucidate the network changes occurring during this pivotal initial period of learning.
ぜんぜんわからないから雰囲気でやったPython３での顔認識・モザイク処理。

これはお勉強の雑なメモです。頭のいい人助けて。

「PythonによるAI・機械学習・深層学習アプリの作り方」より、顔認識・モザイクの処理のやつをやる。この本はすごい。

下のこれをやって画像にモザイクをかけた。

```py
import matplotlib.pyplot as plt
import cv2
def mosaic(img, rect, size):
    # モザイクをかける領域を取得
    (x1, y1, x2, y2) = rect
    w = x2 - x1
    h = y2 - y1
    i_rect = img[y1:y2, x1:x2]
    # 一度縮小して拡大する
    i_small = cv2.resize(i_rect, ( size, size))
    i_mos = cv2.resize(i_small, (w, h), interpolation=cv2.INTER_AREA)
    # 画像にモザイク画像を重ねる
    img2 = img.copy()
    img2[y1:y2, x1:x2] = i_mos
    return img2

# カスケードファイルを指定して分類機を作成 --- (*1)
cascade_file = "haarcascade_frontalface_alt.xml"
cascade = cv2.CascadeClassifier(cascade_file)

# 画像の読み込んでグレイスケールに変換 --- (*2)
img = cv2.imread("nm.jpg")
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 顔検出を実行 --- (*3)
face_list = cascade.detectMultiScale(img_gray, minSize=(150,150))
if len(face_list) == 0: quit()

# 認識した部分の画像にモザイクをかける --- (*4)
for (x,y,w,h) in face_list:
    img = mosaic(img, (x, y, x+w, y+h), 10)

#画像を出力
cv2.imwrite("nm.png", img)
plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
plt.show()
```

![family-mosaic.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/607389/10d68958-eb0b-6509-d0b6-129fbeac396a.png)


今日覚えたこと
顔認識処理の仕組み
・カスケード分類機
なんか強分類機が集まった？やつ強分類機は雑魚分類機？が集まったやつらしい。
そんで強分類機は判定が甘々なやつから並べられているみたい。そっちの方がいちいち厳密な判定しないから早いとか。

・Δ（デルタ）
微分調べてたら出てきてなにそれ怖・・・ってなった。あのｘとｙがクロスしてる図でｘがΔ分動きましたよ（ｘ＋XΔ）みたいなことを示すために使ってた。俺の隣の席の人も毎日俺と負の方向にΔしてる気がする。

・Σ（シグマ）
ロックマンのボス。下にこっから計算しますよ（ｋ=1とか。1に限らない）上にここまで計算しますよ。（ｎ。kと同じだけど混同しないように別のアルファベット描くとよいらしい）右にこいつを計算しますよ（ak。ここのkは下に書くkと同じ）と書く。公式色々あるみたいだから使う時が来たら調べよう。やだ・・・。

・lim(極限)
極限。実数aに近づく関数の引数ｘが限りなく近づくならばそれは極限らしい。へぇ・・・。

・ε（イプシロン）
・ε・＜極小

調べたけどよくわからなかったこと
SVM（サポートベクトルマシン）
平面上に散在する二つのグループの間に線を引くやつ。その線はある点から最も離れているところに引かれるとか。回帰分析となにが違うの。あとパーセプトロンとかいうこれよりも精度の低い、けれども今日の礎になったものがあるらしい。AND演算子みたいななにかだったけ。絶対大事なので復習する。

・δ偏微分
よくわからなかった

・カーネル法
ケンタッキーを作った人。本当に理解できてないけれども非線形に直線になるような空間を用意してあげて線形として処理できるようにするテクニック。クリスピーを皮で包んでツイスターにする感じかな？

前に描いたはすみんでも試したけどモザイクはかからなかった。できたら面白いので次はそれができるようなカスケード分類機を作りたいと思います。強化学習でできるっぽいのはいいんだけど、どうやって特徴量とか特定するんだろう。ある程度こっちであらかじめ用意できないかな？
![nm.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/607389/44d98083-e148-f602-160d-c2b467d5a66a.jpeg)
Laravel で 最適化 高速化 手法一覧

色々あったので備忘録的にまとめ
順不同です。
全てやれというわけではなく、現行の速度を見てできそうなことやる感じ。

他にありましたら教えて頂きたいです


#0.PHPのバージョン
7↑使う

#1.BladeのMinify
BladeがコンパイルされHTML(手続き型のPHPだけど)になったものを圧縮する
自作のディレクティブがあるとうまく動かなかった

https://xzxzyzyz.com/2018/02/larave-html-minify/

#2.Laravel MixでCSS JSの圧縮

Laravel Mix使ってるなら行う

```
npm run prod
```

#3.OPCache有効か

OPcache はコンパイル済みのバイトコードを共有メモリに保存し、PHP がリクエストのたびにスクリプトを読み込み、パースする手間を省くことでパフォーマンスを向上させます。

```
php -v
or
phpinfo()でページで確認
```

無効だったら有効化させる

#4.View Cache

bladeから普通のphpにコンパイルされるがそれが初回アクセス時なので、先にやっておく

```
php artisan view:cache
```

#5.Configキャッシュ

設定値等々を事前にキャッシュしておく

```
php artisan config:cache
```

#6.オートローダー最適化

プロダクションへデプロイする場合、Composerのクラスオートローダマップを最適し、Composerが素早く指定されたクラスのファイルを確実に見つけ、ロードできるようにします。

```
composer install --optimize-autoloader --no-dev
```

#7.ルートキャッシュ

リクエスト毎にルーティング確認しに行き、Controllerを精査するのでキャッシュしておく
`Controller`を使わず、クロージャなどで処理してると使えないので`invoke`のコントローラーでも作って処理させる
`view`返すだけなら`Route::view`を使用する

```
php artisan route:cache
```

#8.SetCacheHeadersミドルウェアの使用

あんまり情報がないミドルウェア
レスポンスをキャッシュできる
ApacheとかいじらなくていいのでGetメソッドでキャッシュして問題ないものにつけておくとよい

100秒キャッシュ

```php:web.php
Route::get('example', 'ExampleController@index')->middleware('cache.headers:public;max_age=100');
```

https://github.com/spatie/laravel-responsecache

このようなパッケージもあるみたい

#9.未使用middlewareの削除

`app/Http/Kernel.php`の中から不要なのを消す

参考→https://qiita.com/kurikazu/items/0c57f050f5dfef02b23e

#10.未使用Facadeの削除

`config/app.php` の `aliases` 配列から消していく

#11.クエリの結果キャッシュできないか

クエリの結果キャッシュできないか
cacheドライバーはfile以外apcu、redis、memcached
fileでも使わないよりは良い

```php:HogeController
$minutes = 1;//1分
return Cache::remember('key', $minutes, function(){
    return User::all();
});
```

#12.未使用CSS削除

MixならPurgeCSSで使っていないCSS削除する

#13.Eloquentを使わない

DBファサードでやっていく

#ex.

EagerLoadingしていないか



----
ブログ始めました

https://c-blog.collapse-natsu.com/
1分で読める　GET POST　違い

#それでは解説していきます
##GET
ブラウザでURLを入力し検索するときにGETメソッドを使っています。
基本的には読み取り専用な機能に対して使うべきメソッドになります。
・HTTP通信で、サーバから情報を取得してくる時に使用する
・情報を検索したり取得するために使うためのもの。

##POST
HTTP通信で、サーバへ情報を登録する時に使用する（データベースへの格納など）
・ツイートや記事を投稿する
・新規ユーザーを登録
・既存のデータを更新する時

なんとなくこうゆうときに使うんだなあーと思っていただけばいいかなと思います！！
細かいところもあるのでぜひ他の記事やサイトで深掘りしてください:fist:
PythonのインストールとGUI開発環境の設定(Windows10)

私はVBユーザーなので、PythonでもGUIは完成を見ながら作成したいと思っておりました。
PytyonにはQtDesignerという素晴らしいものがあるのですが、それを使用するには一手間必要でした。怠け者の私は少しでも簡単にしたいので、その環境の構築方法を記載します。
環境は以下の通りです。

Windows10
Anaconda  (Anacondaには,QtDesignerが入っています。)
Pycharm

#Anacondaのインストール
以下のサイトからAnacondaをダウンロードしてください。

https://www.anaconda.com/distribution/

バージョンが3.xと2.xのものがありますが、3.xをインストールしてください。
インストールexeがダウンロードされますので、深く考えずにインストールしてください。

わからない方は、いろいろなサイトでインストールは紹介されていますので、そちらを見てください。

#環境パスの設定
いろいろと便利なので環境パスの設定も通しておきましょう。
環境パスの通し方はいろいろなサイトで説明があるので、そちらを見てください。

#Pycharmのインストール
Pycharmをダウンロードしてインストールしてください。

https://www.jetbrains.com/pycharm/download/#section=windows

無料版のCommunityをダウンロードしましょう。Professionalは有料です。

#QtDesignerの設定
ここからがミソです。

Qtdesignerで作成されるファイルはuiファイルです。しかし、uiファイルのままではPythonで使用できません。これをpyファイルに変換する必要があります。

いくつか方法はあるのですが、ここでは、PycharmのExternalToolsを使用して簡単に変換できるように設定します。

Pycharmで　メニューのFile　から　Settingsを開き　→　tools　→　Exterminal Toolsを選択し、「＋」をクリックして、下の画面の赤丸のところに下記の通り入力してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203005/ac927d77-000d-1c58-e27b-7e978b3b4ef9.png)

Name → pyuic5

Program → C:\Users\ユーザー名\Anaconda3\Library\bin\pyuic5.bat

Arguments → $FileDir$/$FileName$ -o $FileDir$/$FileNameWithoutExtension$.py

Workig directory → C:\Users\ユーザー名\Anaconda3\Library\bin

(ユーザー名はAnacondaが入っているフォルダのユーザー名を指定してください。)


#変換方法
QtDesignerで作成したuiファイルを自分のプロジェクトフォルダに保存します。
Pycharmのプロジェクトにuiファイルとして追加されます。でもこのままでは使用出来ません。

そこで、下記の作業をして、このファイルをpyファイルに変換します。

①Pycharmのファイルエクスプローラー（左側）でuiファイルを選択を右クリック →　②Exterminal tools → ③pyuic5をクリック

これで、Qtdesignerで作成したGUIをPythonで使用出来るファイル（pyファイル）に変換され、ファイルエクスプローラーに同じ名前のpyファイルができます。

pyファイルに変換した後は、PyQt5で検索すれば、その使用法が沢山でてきますので調べてみてください。

uiファイル（GUI）を直したい場合は、QtDesignerで直して、上書き保存をして、変換作業を行えばすぐに変更が反映されます。ちょっと便利です。

 参考したサイト：https://blog.csdn.net/weixin_42646103/article/details/100919081
（中国のサイトです。）
カメラワークについて


覚えるためだけのメモです。

基本的なカメラワーク　

## FIX(フィックス)
カメラを固定して撮影する。全体の迫力自体はないが動いているものに集中するため、細かな動作や表情を取るのに向いている。


## PAN/PANNING(パン/パンニング)
撮影者自身は動かないがカメラを左右に動かす撮影方法
主に素早く動くものを取ったり、周囲の全容を移す、場面転換で用いられる。
個人的に遠近感を出せて走り去るときに使ったら迫力出そう。

## TILT(ティルト)
pan同様撮影者は動かないが、カメラをパンと違い上下に動かす撮影方法

下から上に上がるようにとるのをTiltUP(ティルトアップ)といい、スケール間や空の面積が広がるような動きになるため、希望などを感じさせたいときに使うといいらしい。
手振れ的なのも入れたらよくなりそう。
あと、作品の当事者になったようになる効果もあるっぽい（？）。

TiltDown(ティルトダウン)
上から下にカメラが下がっていく撮影方法
徐々に全容が秋からになっていくときに使える。

## Zoom In Out
こちらはおなじみズームイン。ズームアウト
被写体に注目したいときや被写体の状況を徐々に明らかにするときに使える。

## TRACK（トラック）　追跡
カメラを一定の距離を保ちながら、被写体とともに移動する撮影方法。

移動スピードを体感したり、迫力のあるショットを取るときに用いられる撮影方法らしい。
TPS（三人称）的な感じ

## DOLLY(ドリー) 台車撮影
カメラを台車に乗せて、滑らかに水平移動させる撮影方法。
別に台車を使用していなくてもドリーと呼べるらしい。要は滑らかな水平移動。
あえて上下にブレさせて臨場感を出しているもののある。

## DOLLY IN OUT（ドリーイン/アウト）

カメラが前にすすんでいく撮影方法。ズームインとは違い遠近のゆがみや被写体と背景のサイズが変化していく。
アウトも同様で、逆に下がっていく撮影方法。

## SPINNING SHOT(スピンショット) 被写体を軸に回転
　被写体を軸にコンパスのように周囲から撮影する方法。
被写体をしっかりとらえつつ、背景は素早く動くため、被写体と周囲の状況を伝えるときに用いられるらしい。
パニックや焦燥、包囲されていることを伝えるために用いられる時もある。

## DUTCH ANGLE(ダッチアングル) 斜斜

わざと角度を付けて心理的な不安や緊張感を表現するときに用いられる撮影方法。

## HIGH ANGLE(ハイアングル) 上から撮影
 
目線より上から撮影する方法。
　強者の目線（？）なので迫力を伝えるには向かないらしい。
逆に無力さを強調したいときに効果が出る。

## LOW ANGLE(ローアングル)　下から撮影
目線より下から撮影する方法。被写体を強そうに、迫力を与えたいときや、威厳を表現するときに用いられる。

## FOCUS IN（フォーカスイン） 焦点を合わせる
　焦点を外した状態から徐々に焦点を合わせていく撮影方法
意識を取り戻したときの演出に使われる。

## FOUCUS OUT(フォーカスアウト)
 逆で焦点が合っている状態から徐々に焦点をぼかしていく。
階層しーへの移行や気を失うときの演出に用いられる。

## FOUCU PULL(プルフォーカス) 焦点の対象が変化する
焦点の対象が途中でほかのものに変わっていく撮影方法。
注目の順序をコントロールすることができる。

ほかにもドローン撮影などもあるがこちらはいま必要ないので割愛します。

参考URL　https://asobo-design.com/nex/blog-830-22726.html
　　　　　https://asobo-design.com/nex/blog-831-22734.html
WSLのVimでインサートモードから抜けるときに自動で日本語入力をOFFにする（イベント駆動）

AlacrittyでWSLを使っているけど、もう少し使い勝手をよくする（とくにVim）ための備忘録。

# InsertLeave 駆動時に zenhan を外部実行

@notoya さんの記事 [クリップボードの連携](https://qiita.com/notoya/items/860ebacf496b54d6c26e) を参考にVimの自動コマンドで定義してみた。
インサートモードから離れるとき（InsertLeave）にIMEを切り替えするプログラム [zenhan.exe](https://github.com/iuchim/zenhan) を外部実行する。これをvimrcに書く。

```vimscript:
augroup Norml

  autocmd!

  autocmd InsertLeave * :call system('/mnt/c/apps/zenhan/bin64/zenhan.exe {im}')

augroup END
```

# 参考にした情報 
- @notoya さんの記事 [クリップボードの連携](https://qiita.com/notoya/items/860ebacf496b54d6c26e) 
- https://github.com/iuchim/zenhan

大変参考になりました！ありがとうございます！😉
Aurora Serverless が起きるまで待つ

例えば AWS Lambda + Amazon CloudWatch Events で定期的にどこかからデータをひっこ抜いてきて適当に Amazon RDS にでも突っ込んでおくかという場合に、普通の Provisioned インスタンスだと少なくとも数千円/月はかかってしまうが Aurora Serverless にすれば使っていないときは勝手に寝てくれるので格安で済むのではないか。[^pricing] [^serverless]

[^pricing]: [Amazon Aurora Serverlessの利用費を試算してみた | Developers.IO](https://dev.classmethod.jp/articles/calculate-amazon-aurora-serverless-costs/)
[^serverless]: [Aurora Serverlessの導入時に気をつけるべきこと | Developers.IO](https://dev.classmethod.jp/articles/lessons-learned-from-up-and-running-aurora-serverless/)

ただしこのアイデアにはひとつ問題があって、**Aurora Serverless が起きるのが遅い**ということ。

DB クライアントから接続を試みると寝ていた Aurora Serverless は起動し始めるが、接続を受け入れられるようになるまでの間にクライアントがタイムアウトしてしまうなんてこともある。

そこで、使うときはあらかじめ Aurora Serverless を起動 (Capacity を増加) させるリクエストを送っておいて、起動した (Capacity が 0 以上になった) タイミングで DB クライアントから接続すれば良いのではないか。

## Lambda Function の実装
Aurora Serveless が起きるまで待って後は何もしないという Lambda Function を実装してみる。

ランタイムは Python 3.8 を使った。

``` python
import asyncio
import boto3


def is_aurora_serverless_up(client, identifier: str) -> bool:
    """Aurora Serverless が起動中かどうかを返す"""
    response = client.describe_db_clusters(DBClusterIdentifier=identifier)
    assert response['ResponseMetadata']['HTTPStatusCode'] == 200
    assert len(response['DBClusters']) > 0
    assert response['DBClusters'][0]['EngineMode'] == 'serverless'
    return response['DBClusters'][0]['Capacity'] > 0


async def wake_aurora_serverless_up(client, identifier: str, capacity: int = 2):
    """Aurora Serverless を起動する"""
    if is_aurora_serverless_up(client, identifier):
        return
    response = client.modify_current_db_cluster_capacity(DBClusterIdentifier=identifier, Capacity=capacity)
    assert response['ResponseMetadata']['HTTPStatusCode'] == 200
    for i in range(10):
        await asyncio.sleep(i ** 2)
        if is_aurora_serverless_up(client, identifier):
            return
    raise TimeoutError()


async def main():
    client = boto3.client('rds')
    await wake_aurora_serverless_up(client, 'mycluster')


def lambda_handler(event, context):
    asyncio.get_event_loop().run_until_complete(main())
```

あとやる必要があること。

- 実行するために `rds:DescribeDBClusters` と `rds:ModifyCurrentDBClusterCapacity` の権限が必要なのでそれっぽい IAM Role を作成して Lambda Function に割り当てておく
- Lambda Function のタイムアウト設定のデフォルト値 3秒 だと絶対に終わらないので 3分 とかに設定しておく

今回は asyncio で実装しているが asyncio.sleep で使っているだけなのであまり意味はない。普通に time.sleep でもいい。asyncio で実装しておくと PostgreSQL クライアントとして asyncpg が選べるというメリットはある。

## 実行してみる
試しに実行してみると以下のようなことがわかる。

- Aurora Serverless が起動するまでに 15秒 くらいかかる
- 起動した (capacity > 0 になった) としてもすぐに DB クライアントから接続できるわけではなく、そこから更に 10 秒くらい待つ。

結局待つので前とあまり変わっていないが、DB クライアントがタイムアウトしなくなったのでこれはこれでよし。

## 最後に
ここまでやってから「これ普通に DB クライアントの接続タイムアウトを長めに設定しておくだけで解決したのでは？？？？？」ということに気づいてしまった。

``` python
import psycopg2

with psycopg2.connect('postgresql://...', connect_timeout=120) as conn:
    ...
```

(psycopg2 の場合) これで問題なく動いてしまった。

エッ

あっ、はい・・・。
ActionMailerでメール認証を実装した

# バージョン
- rails: ver 6.0.1
- ruby: 2.6.5
- テスト: rspec

# はじめに
1. `ActionMailer`を使ってメール認証を実装しました。

# やりたいこと
1. メール認証のリンクをクリックする![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390288/4018bee4-c111-462a-2d66-f234046f666c.png)

2. メール送信完了画面(&メールが届く)![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390288/66843c15-ec05-d64e-3a9a-aca7c3724b1a.png)

3. メールのリンクをクリックする![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390288/8d35058c-907d-9ac7-9a80-eb4f9bfb5bab.png)

4. メール認証完了![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390288/7e34cc72-ede8-2da3-1f71-9d5450df092f.png)

この一連の流れを実装していきます

# 実装
## メールを設定する
設定の部分は[この記事](https://qiita.com/hirotakasasaki/items/ec2ca5c611ed69b5e85e#%E8%A8%AD%E5%AE%9A)を参考にさせていただきました。本記事ではActionMailerにどのようにメール認証機能を持たせたか書きます。

```terminal
rails g mailer NotificationMailer
```

でメーラーを作成します
ここにメールの送り先や、メールの件名を指定します

```ruby:app/mailers/authenticate_mailer.rb
class AuthenticateMailer < ApplicationMailer
  def send_authenticate_mail(user)
    @user = user
    # メールを誰に送るか、メールの件名を設定
    mail to: user.email, subject: '[dot] メール認証'
  end
end
```

`メーラーの名前.html.haml`にメールの本文を記述します
ここでは`authenticate_mail.html.haml`

```haml:app/views/authenticate_mail..htmlhaml
%p #{@user.name_sei} 様
%p 以下のリンクをクリックしてメール認証を完了させてください。
-# トークンを含んだメールURL
%p= link_to 'メール認証完了する', authenticate_completed_url(@user.auth_token)

```
## トークンを作成するためのカラムを作る
参考: [Railsでトークン認証のログインAPI実装](https://qiita.com/puremoru0315/items/7a0b57cb69e3a5b69f08)
ユーザーにトークンを持たせるためにカラムを追加してください

```terminal
rails g migration add_token_to_users token:token
```

```rails db:migrate```

ユーザーモデルに`has_secure_password`を書くことによってユーザーにトークンを持たせることができる

```ruby:user.rb
class User < ApplicationRecord
  ...
  has_secure_token :auth_token
  ...
end
```

## メールに認証機能をつける
ここからがメールに認証機能を持たせるための処理になります

```ruby:app/controllers/authentications_controller.rb
class User::AuthenticationsController < User::ApplicationController
  # ログインしていないユーザーのアクセスを許可するかどうかはauthenticate_user!を使用してください
  # authenticate_user!はdeviseに標準で搭載されているので定義する必要はありません
  skip_before_action :authenticate_user!, only: [:authenticate_completed]

  # メールを送信しました
  def authenticate
    user = current_user
    # メールを送信するための処理
    AuthenticateMailer.send_authenticate_mail(user).deliver
  end

  # メール認証を完了しました
  def authenticate_completed
    # 認証メールのリンクからトークンを取得してそのトークンを持つユーザーを探す
    user = User.find_by(auth_token: params[:auth_token])
    if user
      # トークンを再生成する、古いトークンを新しく書き換える
      user.regenerate_auth_token
      # is_confirmed_atに日付がいれて認証が完了していることを表す。済んでいなければnil
      user.is_confirmed_at = Time.current
      user.save!
    else
      redirect_to root_path
    end
  end
end
```
適宜viewを作成してください
`authenticate.html.haml`,`authenticate_completed`


`AuthenticateMailer.メーラーで作成したメソッドの名前(user).deliver`
ここでは`AuthenticateMailer.send_authenticate_mail(user).deliver`
で画面を表示すると同時にサーバーからメールを送信しています。

# 最後に
どんな簡単な質問でも大歓迎です！
（15分考えてわからなければ質問してください！）
※上から下までコピペしてできるものではありません。私の作ったサービス独特なものがあるのでカスタマイズしていただく必要があります。

間違っている点や、抜けがある、もっといいやり方があるなどもおしゃってください！
Powershell7.0で最短FizzBuzzに挑む

ふと思い立ったその日がFizzBuzz日和な気がしました。

# きっかけ

こちらの記事を読んで、去年11月ごろにFizzBuzzに挑んでいたことを思い出したんです。
[世界のプログラミング言語(25) PowerShell - マイクロソフトのモダンでオープンなシェル言語](https://news.mynavi.jp/article/programinglanguageoftheworld-25/#マイナビニュース)

```Powershell
# ワンライナー
1..100|&{process{if($_ % 3 -eq 0){$fz="Fizz"};if($_ % 5 -eq 0){$fz+="Buzz"};if($null -eq $fz){$_}else{$fz;$fz=$null};}}

# 可読性優先
1..100 | & {
    process {
        if ($_ % 3 -eq 0) { $fz = "Fizz" }
        if ($_ % 5 -eq 0) { $fz += "Buzz" }
        if ($null -eq $fz) {
            $_
        } else {
            $fz
            $fz = $null
        }
    }
}
```

その後、Powershell7.0がリリースされたり、Powershellへの理解が深まるなどしたため、今ならFizzBuzzの文字数をかなり減らせそうと感じたので実際にやってみました。

# リトライ

試行錯誤の末、51文字まで縮めることが出来ました。

```powershell
# ワンライナー

1..100|%{($_%3 ?$n :"Fizz")+($_%5 ?$n :"Buzz")??$_}

# 可読性優先
1..100 | ForEach-Object {
    ($_ % 3 ? $n :"Fizz") + ($_ % 5 ? $n :"Buzz") ?? $_
}
```

短縮ポイント

- Powershell7.0の機能を使う
  - 三項演算子　`<condition> ? <if-true> : <if-false>`
  - null合体演算子 `$x ??　"右辺は左辺がNullなら実行される"`
- 作らなくていい変数は作らない
- 文字数節約のために`$null`じゃなくて未定義変数を使う
  - 定義してない変数にアクセスすると`null`が返ってくる性質を利用

これが一番短いとはいえないけど、結構いい線いっていると思います。
【学習記録】『スラスラ読める　JavaScriptふりがなプログラミング』読書感想　 ４章編 （前半）　〜N予備校の復習を添えて〜

【学習記録】『スラスラ読める　JavaScriptふりがなプログラミング』読書感想　 ３章編( https://qiita.com/Molly95554907/items/dc1654b7019442f893fa ) の続き

<h4>第四章　関数を作ろう</h4>

<h5>・アロー関数</h5>
オリジナルの関数を作成する。

```js
let 関数名 = () => {
  //関数として実行する処理
};
```

以上で作成完了。

関数名（）;

を実行すると、//関数として実行する処理　が実行される

<h5>・引数を受け取る関数</h5>
・引数とは：関数の中で処理される変数のこと、と理解してる。

```js
let 関数名　= (引数となる変数) =>{
//関数として実行する処理
console.log(引数となる変数 +'です');
};
```

以上で作成完了

引数となる変数に文字や数値を代入できる
`関数名('山田');`
↓
山田です　　　　　

が出力される。


<h5>・function文で関数を作る</h5>

```js
function 関数名(引数となる変数){
//関数として実行する処理
}
```

※function文で関数を作る時は、関数の終わりに ; が要らない！！！

今後はアロー関数が主流になっていく流れ！

<h5>【N予備校では一章「あなたのいいところ診断」から登場】</h5>
<img width="985" alt="スクリーンショット 2020-03-23 22.42.16.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/595580/f05b3eb6-09ec-4e48-c4f2-ccddb20beb01.png">

function文でremoveAllChidren関数を作成。診断するたびに要素が増えていくのを消している。
アロー関数で、userNameInput.onkeydown関数を作成。キーを押した時に起こるイベントを関数で作成している。
アロー関数で、assessmentButton.onclick関数を作成。クリックした時に起こるイベントを関数で作成している。

・アロー関数を使って関数を作成すると、「オブジェクト.プロパティ」で関数を作成することができる！！！

<h5>・テンプレート文字列</h5>
バッククオート（`)で囲んだ範囲に書いた文字列のこと。
この範囲内での文字、改行、スペースは、そのままプログラムの実行結果に反映される。

テンプレート文字列の中で変数を書く時は　
<h6>${変数名}</h6>
と書く

<h5>・関数には複数の引数を渡すことができる</h5>

```js
let recommendBook = ( title, pages ) => {
let book = `私のおすすめの本は${title}、
ページ数は${pages}です。`;
console.log(book);
};
```

↓

```js
recommendBook('デカメロン',　1325);
```

↓

私のおすすめの本はデカメロン、
ページ数は1325です。

※関数内で作った変数は「ローカル変数」
関数外では呼び出せない。

ここでは　let book を、let recommendBook関数の外で呼び出そうとしてもundefinedになる、ということ。

<h5>・テンプレート関数を使わず書く</h5>　
+　を使って出力する物を書いていく。改行は「\n」で行う。

```js
let recommendBook = ( title, pages ) => {
let book = '私のおすすめの本は' + title + '、\n'
+ 'ページ数は' + pages + 'です。';
console.log(book);
};
```

<h5>【N予備校では、三章「集計処理を行うプログラム」などで登場】</h5>
<img width="1327" alt="スクリーンショット 2020-03-23 23.26.29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/595580/804a7859-ad3a-16b3-6437-66037c22fe5d.png">

テンプレート関数を使わずに、出力結果を書いている

<img width="1419" alt="スクリーンショット 2020-03-23 23.28.10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/595580/56fb7823-4185-0077-5bee-3782ae2db08b.png">

同じ出力結果を、テンプレート関数を使って書いている
モダンなLinuxコマンド(Rust製)を Docker上で試す

「*ls よりも exa を使おう！モダンな Linux コマンド達を紹介*」の記事を読んで、他にも色々コマンドあるんじゃないかと思って片っ端からインストールしてみました。
※当記事はdockerがインストールされている前提です。また、Windows10環境で動作確認しています。
## docker-compose.yml
```yaml
version: '2'
services:
  modern_linux:
    build: .
    container_name: modern_linux
    volumes:
      - ./home:/home
    tty: true

```

## Dockerfile
```dockerfile
From ubuntu:19.10

RUN apt-get update && \
    apt-get install -y software-properties-common && \
    add-apt-repository ppa:dawidd0811/neofetch
RUN apt-get update &&\
    apt install -y curl \
    gcc \
    git \
    neofetch \
    bat \
    fd-find \
    ripgrep
RUN curl https://sh.rustup.rs -sSf | sh -s -- -y
RUN $HOME/.cargo/bin/cargo install exa \
    hexyl \
    procs \
    tokei \
    dutree \
    lsd

RUN echo $'\n\
alias cargo="$HOME/.cargo/bin/cargo"\n\
alias exa="$HOME/.cargo/bin/exa"\n\
alias hexyl="$HOME/.cargo/bin/hexyl"\n\
alias procs="$HOME/.cargo/bin/procs"\n\
alias tokei="$HOME/.cargo/bin/tokei"\n\
alias dutree="$HOME/.cargo/bin/dutree"\n\
alias lsd="$HOME/.cargo/bin/lsd"\n\
' >> /root/.bashrc
```

## コマンドを実行する

```powershell
docker-compose up -d
docker-compose exec modern_linux /bin/bash
#コンテナ内部に入るので、インストールされたコマンドを試してみる。
# 終わったら、exit
docker-compose down
```

## まとめ
Rust製のコマンドはカラフルなものが多くていいですね！
あと何と言ってもちょっと試してみたいときにごにょごにょインストールして、コマンド実行して、終わったら消せるDockerって素晴らしいね。。

## 参考url
https://qiita.com/navitime_tech/items/c249269a3b47666c784b
php artisan コマンド make:○○


##migration作成
```bash
# migrationの後の名前は任意(わかりやすいようにcreate_xxx_tableにしている)
php artisan make:migrtion create_xxxx_table 
```
##migration実行

```bash
php artisan migrate
```

##Model作成
```bash
php artisan make:model Model名
```


##シード作成

```bash
php artisan make:seeder XxxxSeeder
```

作成したシードファイルにダミーデータの作成コードを記載した後に
DatabaseSeeder.phpに設定する必要があるため下記のように設定する

```DatabaseSeeder.php
    public function run()
    {	 # シードを作成する度ここに追加していく
        $this->call(XxxxSeeder::class);
    }
```

####シードの実行
```
php artisan db:seed
```

##RESTコントローラ作成

```bash
php artisan make:controller XxxxController --resource
```
ゼロから作るDeepLearning① 6章「学習に関するテクニック」

ゼロから作るDeepLearning①の6章でいい感じの実装ができたので、備忘録。
Jupyterも公開するので、間違っていればご指摘いただけると幸いです。
書籍ではデータセットをローカルにダウンロードしていましたが、せっかくsklearnにmnistなどの学習用のデータセットがあるので、sklearnからimportするだけで済むように、コードを調整しました。
[jupyter notebook公開用＠github](https://github.com/fumitrial8/DeepLearning/blob/master/%E3%82%BB%E3%82%99%E3%83%AD%E3%81%8B%E3%82%89%E4%BD%9C%E3%82%8BDeepLearning%20%E7%AC%AC6%E7%AB%A0.ipynb)

## SGD(Stochastic Gradient Descent:確率的勾配降下法)
損失関数の勾配に一定の学習係数をかけた値を重みから差し引くことで、各ネットワークの重みを調整する方法。式として表すと

W（調整後の重み） = W（調整前の重み） - η * dL/dW（学習係数*損失関数の勾配）

## AdaGrad法
学習の進み具合によって学習係数を小さくしていき、各ネットワークの重みを調整する方法。式として表すと

h（調整後の勾配の履歴） = h（調整前の勾配の履歴） - dL/dW * dL/dW（損失関数の勾配の二乗）


W（調整後の重み） = W（調整前の重み） - η* h***(-1/2) * dL/dW（学習係数* 勾配の履歴*損失関数の勾配）

## Momentum法
勾配が大きいほど大きく学習し、勾配が小さい場合は学習を小さくして、各ネットワークの重みを調整する方法（いい表現が見つかりませんでした。。。。）。式として表すと

v（調整後の重みの履歴） = αv（調整前の重みの履歴） - η * dL/dW（学習係数*損失関数の勾配）
αは0.9などで設定するのが普通だそうです。

W（調整後の重み） = W（調整前の重み） + v
ProMicroをXinputコントローラーとして動作させる

# はじめに
ProMicroをXinput方式として認識させることができたのでその方法を残しておきます.

# 方法
[こちら](https://github.com/dmadison/ArduinoXInput) のライブラリを使用します
[この](https://github.com/dmadison/ArduinoXInput_AVR)ボードパッケージが必要なのでArduinoIDEにインストールしていきます。
![FireShot Capture 003 - dmadison_ArduinoXInput_AVR_ AVR boards package for the ArduinoXInput _ - github.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211264/202e5bcb-e2b3-0d7d-8d3d-8b89bd49739a.png)
画像のthe latest versionと書かれた部分から最新版をダウンロードしていきます。
![FireShot Capture 004 - Release Version 1.0.1 · dmadison_ArduinoXInput_AVR - github.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211264/bd018468-b8e3-2ed3-6d0d-490c59b5e262.png)
ArduinoXInput_AVR_V1.0.1.zipをダウンロードしてください。解凍するとxinputというフォルダーが出てくるのでArduinoIDEをインストールした場所のhardwareフォルダーに移動させます。
SparkFunのボードの場合は[こちら](https://github.com/dmadison/ArduinoXInput_SparkFun)のリポジトリのthe latest versoinと書かれた部分をクリックして最新版のソースコードをダウンロードしてください。解凍するとxinput_sparkfunというフォルダがあるので同じようにhardwareフォルダに入れます。
![hardware 2020_03_23 21_41_54 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211264/8eb7c0bc-385b-12b8-c30c-63bcf3a1b26e.png)
自分の環境ではフォルダーはこのようになりました。xinputとxinput_sparkfunフォルダーがあることを確認しましょう。
ArduinoIDEからボードが追加されているかを確認しましょう。追加されたボードには w/XInput が末尾に入っています。
<img width="169" alt="無題.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211264/87c0c685-578e-f2c1-af34-6b9f63edd41e.png">

いよいよライブラリをインストールしていきます。
[Arduino XInput Library](https://github.com/dmadison/ArduinoXInput)からリポジトリのzipファイルをダウンロードしてArduinoIDEの スケッチ→ライブラリをインクルード→.ZIP形式のライブラリをインストール からインストールします。
これでXInputライブラリを使用できるようになりました!!
追加したボードパッケージの中から自分のボードに合ったボードを選びましょう。
ライブラリと一緒に入れられたスケッチ例が参考になると思います。

コード例

```C
#include <XInput.h>
 
void setup() {
	XInput.begin();
}
 
void loop() {
	XInput.press(BUTTON_A);
	delay(1000);
 
	XInput.release(BUTTON_A);
	delay(1000);
}
```
XInputのAボタンを押して一秒待ってから離して一秒待つことを繰り返すプログラムです。
Keyboardライブラリと同じように使うことができます。

[HTML5 Gamepad Tester](https://html5gamepad.com/)でコントローラーの情報を取得することができます。うまくいっているとXBox360コントローラーとして認識されているはずです。
![FireShot Capture 005 - HTML5 Gamepad Tester - html5gamepad.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211264/a8be35c5-a97b-7999-0675-d044d78d839f.png)

# 注意点
追加したボードで書き込むとボードの自動リセットが機能しなくなります。なので新しいコードをアップロードする際にボードを手動でリセットする必要があります。書き込むには

- マイコンボードにかきこむボタンを押す
- マイコンボードに書き込んでいますと表示されるまで待つ
- リセットボタンを二回押す

という手順で書き込むことができます。ボードにリセットボタンが無い場合はresetピンをGNDに接続することで対応できます。

# 参考サイト

- https://github.com/dmadison/ArduinoXInput
- https://github.com/dmadison/ArduinoXInput_SparkFun
- https://github.com/dmadison/ArduinoXInput_AVR
- https://www.partsnotincluded.com/how-to-emulate-an-xbox-controller-with-arduino-xinput
あつめる（共同開発）

#Git 　
 
・プログラムを複数人で共同開発するために使用するシステム
・共同開発には3つのステップ（1.コード変更 2.共有する準備 3.共有）がある
・共同開発では自分の変更の把握と、その中で相手に共有すべき部分を選択することが大切。
 
・`git status`で変更したaddしていないファイル名を赤、addされたファイルを緑で表示
・`git diff` で変更前のコードは赤、変更後のコードは緑で表示
・`git add ファイル名` で共有するファイルを選択
・`git commit -m “メッセージ”` で選択したファイルを記録（コミット）
・`git log` でメッセージ内容を確認、上ほど新しいメッセージ
・`git log -p` で変更内容も同時に見れる。上下キーで表示内容変更、Qキーで終了
 
 




 
#Github
 
・Gitをオンライン上で管理するサービス
・ソースコードの閲覧、バグ管理、SNS機能といった開発者に必須なものが揃っている
・Gitを用いて操作ができる
・Webサイトに情報を公開できる
 
 
#SSH接続
 
・ネットワークに接続された機器を遠隔操作し、管理する手段
・通信経路は暗号化されるため、安全にアクセスできる
 
1.サーバー用の公開鍵と、クライアント用の秘密鍵をペアで作成
2.SSHクライアントを操作し、ログイン意思を伝える
3.鍵が合っていることを確認して暗号化、復号化
4.暗号化完了！
 


#リモートリポジトリ
 
・共有ファイルの置き場
・ファイルのアップロードやダウンロードができ、開発者同士がファイルを共有できる
・`git remote add リモート名 URL` で指定のURLを付けたリモート名で登録
・`git push リモート名 master` でリモート名にアップロード
・`git pull リモート名 master` でリモートからファイルをダウンロード
 

#ローカルリポジトリ
 
・リモートリポジトリとは異なり、自身の手元のマシンに配置するリポジトリ
・ローカルリポジトリの内容を公開する際、リモートリポジトリにアップロードする。
 
#クローン

・リポジトリをコピーするためのコマンド

#プル　
 
・リモートリポジトリで管理していたファイルをダウンロードすること
 
#プッシュ
 
・ローカルリポジトリで管理していたファイルをアップロードすること
 
#プルリクエスト
 
・ローカルリポジトリの変更を他者に通知する機能
・多数の開発者がオープンソース開発に参加しやすくなり、高品質のコード作りが可能になる
 
#イシュー

・開発者同士が共有し、必要な事項をスレッド形式で立てられる機能
 
#ステージングエリア　
 
・Git レポジトリにコミットするファイルを置く場所
・`git add` で追加されたファイルが溜まる
・`git commit` でgitレポジトリにコミットされたファイルが格納される
 
#アド　
・共有するファイルをステージングエリアで共有
 
#コミット
・ファイルやディレクトリの追加・変更をリポジトリに記録する操作
・コミットでは、全気合いコミット時から現在の状態の差分の記録が作成される
・時系列にしたがって格納される
・最初のコミットはmasterブランチに追加される


#ブランチ
 
・履歴の流れを分岐して記録するもの
・他のブランチの影響を受けないため、同一リポジトリ内でそれぞれ開発が可能
・作業ブランチはチェックアウトによって切り替える
・チェックアウトすると、最後のコミットがワークツリーに展開される
・現在使用しているブランチの先頭をHEAD


###トピックブランチ
・機能の追加ややバグの修正といった課題の作業時に作成するブランチ
・統合ブランチから分岐する形で作成し、完了後に統合ブランチに取り込む

###統合ブランチ
・リリース版がいつでも作成可能にしておくためのブランチ
・トピックブランチの分岐元としても使用
・通常は、masterブランチを統合ブランチとして使用
・ブランチの統合にはマージとリベースが存在する

###リベース（rebase）
・作業が完了したブランチを分岐元（master）にくっつけること
・くっつけた順番でコミットが記録される
・通常は分岐先ブランチで分岐元につなぐことに注意！
・「re+base」と、ブランチの付け根を植え替えると考えるとわかりやすい

###マージ（merge）
・複数の履歴の流れを合流させる
・マージ時の新しいコミットが作成され、過去の履歴は改変されない

#リベースとマージの違い
・mergeは履歴が残るが複雑になる
修正内容がわかりやすいが、規模が大きくなると履歴が増える点に注意
・rebaseは履歴は単純だが元のコミットから変更内容が変わる
履歴が一本化され、見やすくなるが、競合発生時の対処が複雑になる点に注意

#参考
https://www.youtube.com/playlist?list=PLh6V6_7fbbo_M3CqTeJvuXB08--fibyBu
https://backlog.com/ja/git-tutorial/stepup/04/
GCP Access Context Managerの設定をterraform importする方法

Access Context Managerの設定をimportしようとして意外とハマったのでメモ

terraform importするにはサービスアカウントが必要なので、何かしらのプロジェクトでサービスアカウントを作成

サービスアカウントにAccessContextManagerのimport出来る権限をつけるが
:no_good_tone1:　プロジェクト設定のIAMで権限をつける
:ok_woman_tone1:　組織設定のIAMで権限をつける

サービスアカウントを作ったプロジェクトを選んだままIAM画面でサービスアカウントに権限を付けてもimportが出来ない

以下のようなエラーが出る


```
Error: Error reading AccessContextManagerAccessLevel "accessPolicies/1234/accessLevels/hogehoge": goog
leapi: Error 403: The caller does not have permission
```

[組織レベルの設定](https://cloud.google.com/sdk/gcloud/reference/organizations/add-iam-policy-binding)のIAMで権限を付けないといけない

つける権限は[こちら](https://cloud.google.com/vpc-service-controls/docs/access-control)に記載されている以下の4つ
- Access Context Manager 管理者（roles/accesscontextmanager.policyAdmin）
- Access Context Manager 編集者（roles/accesscontextmanager.policyEditor）
- Access Context Manager リーダー（roles/accesscontextmanager.policyReader）
- Resource Manager 組織閲覧者（roles/resourcemanager.organizationViewer）


これらの権限をつけたら `google_access_context_manager_access_level` のresourceがあるtfファイル作ってimport可能

```
terraform import google_access_context_manager_access_level.access-level accessPolicies/1234/accessLevels/hogehoge
```
Pythonで毎日AtCoder #14

### はじめに
[前回](https://qiita.com/taxfree_python/items/4485685ee036b2a8800c)
14日目

### #14
今日はBです。


**考えたこと**
[ABC081-B](https://atcoder.jp/contests/abc081/tasks/abc081_b)
ABC081-Bは$A_i$が偶数のときは2で割り切れるまで割ります。奇数のときはすぐにquitしてます。

```python
n = int(input())
a = list(map(int,input().split()))
counter = []
for i in range(n):
    count = 0
    if a[i] % 2 == 0:
        while a[i] % 2 == 0:
            a[i] //= 2
            count += 1
        counter.append(count)
    else:
        print(0)
        quit()

print(min(counter))
```
-------
[ABC087-B](https://atcoder.jp/contests/abc087/tasks/abc087_b)
ABC087-Bは思考停止で3重ループしてます。

```python
a = int(input())
b = int(input())
c = int(input())
x = int(input())

ans = 0
for i in range(a+1):
    for j in range(b+1):
        for k in range(c+1):
            price = 500 * i + 100 * j + 50 * k
            if price == x:
                ans += 1

print(ans)
```
----
[ABC083-B](https://atcoder.jp/contests/abc083/tasks/abc083_b)
ABC083-BはNが$10^4$程度なので全てのNについて調べています。$1\leq i \leq n$のiをstrにして桁ごとに合計してifで分けています。

```python
n, a, b = map(int,input().split())

ans = 0
for i in range(n+1):
    i = str(i)
    k = 0
    for j in range(len(i)):
        k += int(i[j])
    if k <= b and k >= a:
        ans += int(i)

print(ans)
```
---
[ABC088-B](https://atcoder.jp/contests/abc088/tasks/abc088_b)
ABC088-Bはお互いに最適な動きをするので、残っている最大のカードを取ります。なので、sortして1個ずつ合計しています。別にプレイヤーごとに分けなくても、それぞれで差分とってもいい。

```python
n = int(input())
a = list(map(int,input().split()))

a.sort(reverse=True)
alice = 0
bob = 0
for i in range(n):
    if i % 2 == 0:
        alice += a[i]
    else:
        bob += a[i]

print(alice-bob)
```
---
[ABC085-B](https://atcoder.jp/contests/abc085/tasks/abc085_b)
ABC085-Bは同じ大きさの餅は置けないので、setで重複無しにしてsortしています。

```python
n = int(input())
d = {int(input()) for _ in range(n)}

d = list(d)
d.sort()
print(len(d))
```

### まとめ
Bくらいは解ける。明日のCからが本番!
では、また
Search for filesの使い方_2


##1."開発"タブを表示する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566033/060ac933-17fd-c8ee-d9f7-1a96571743f4.png)


"ファイル"をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566033/b628245e-f453-7dfc-a1c4-54450a09c281.png)

"オプション"をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566033/a5640b22-5bd6-e1ed-4832-92fb6b60f8f0.png)

"リボンのユーザ設定"をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566033/43f2b472-bd5e-4ea9-249d-2568fe03706b.png)

"開発"にチェックを入れ、"OK"をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566033/4e389c34-ad2c-f246-3c99-26fbc91b0f39.png)


##2.マクロを有効にする
これをやらないと、エクセルの後ろで動かすマクロ(プログラム)が実行できない
"トラストセンター"をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566033/c40a20ad-a0e3-f86a-3568-10e9b87d87fb.png)

"トラストセンターの設定(I)"をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566033/51a39979-b8dd-e472-bb0b-34c056b06bb3.png)

"マクロの設定"をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566033/c864b12d-43e7-72c3-f19c-ffe87a92098b.png)

"すべてのマクロを有効にする"をチェック
※推奨しません。など怖い文言が書いてあるが、危険はないのでご安心ください
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566033/1a148aa4-1b84-70ec-e39a-f04b0836e016.png)
AWSプラクティショナー よく見る単語③

##データベースでよく見る単語
**・RDS**
オンプレで使われているDBエンジンをそのまま簡単に使えるDB。
データ解析する際などに使用する。

**・Amazon Aurora**
MySQL/PostgreSQLのデータモデルをサポートしてる。
クラウドに最適化されたDB。

**・DMS**
DB間でデータの移行ができるサービス。

**・DynamoDB**
SQLが必要ないDB。オシャレにNoSQLとか言われてる。
水平スケーリングができ、大量のアクセスがあっても処理ができる。
複雑なクエリとかは苦手。

**・Amazon Redshift**
物凄くデカイDB。データウェアハウスともよばれてる。
それぞれのDBにあるデータをまとめて解析することができる。

**・Amazon ElastiCache**
RDSやDynamoDBのクエリ結果のキャッシュに使用されたりしてる。

**・Amazon Neptune**
SNS、経路案内アプリなどで使用されているグラフデータベースサービス。
相関情報などを扱える。

##管理サービスでよく見る単語
**・Cloud Watch**
EC2、RDSとかAWSが管理しているサービスをモニタリングできるサービス。

**・Trusted Advisor**
AWS環境を自動的にチェックしてベストプラクティスに合ったアドバイスをくれる。

**・AWS Cloud Trail**
APIの呼び出しを記録する。
誰がログインして、何をしたのかを確認できる。

**・AWS Config**
AWSのリソース変更を記録する。
インスタンスのタイプが何を使われているかなど。

**・AWS Cloud Formation**
AWSの各リソースを含めた環境を自動作成、更新、管理する。
本番環境などでなにか問題があってもすぐに作成しなおすことができたりする。

**・AWS Elastic Beanstalk**
Webアプリケーションの環境をAWSに構築できる。

**・AWS Organizations**
複数アカウントの管理ができ、各請求をひとまとめにすることができる。
Search for filesの使い方

# Seach for Files

##できること
1) エクセルにあるキーワード(会社IDなど)から、フォルダ内のファイルを検索できる

2)  検索したファイルへのリンクがエクセル内に生成される(青い文字を押すとそのファイルが開く)


例:
エクセル内に会社IDがある
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566033/3a9c05e5-f260-2847-e2d5-971b63b35b09.png)

適当なフォルダに会社IDが含まれているpdfファイルがある
※この場合デスクトップ"test"フォルダ内にある
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566033/d9749375-4af0-4bc7-5eb2-62c0ed6551ab.png)

"開発"タブの"マクロ"をクリックする
※開発タブがない場合は[こちらをクリック](https://qiita.com/blue-inc/items/9277c790ef968d8c8a64)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566033/02879852-9aa5-a8ab-064b-4a0507af373a.png)

マクロ名"seach for files"を選ぶ、"実行をクリック"
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566033/780c5f52-7e8a-1977-708e-ad08442bbf5c.png)

pdfファイルのあるフォルダがあった入れば"はい"、違っていれば"いいえ"を選び該当フォルダを指定する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566033/daa1c06c-8c6c-cf93-3617-fceef316f8e9.png)

"はい"を押した場合、最終チェックウィンドウが表示される
　　"はい"   : 実行(リンクの作成)
　　"いいえ" : 処理のキャンセル 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566033/7f0cc7a4-8a36-b7e5-da3d-ac259d050fba.png)

"いいえ"を押した場合、フォルダ選択画面が表示される
　　"OK" : 最終チェックウィンドウが表示される
　　"キャンセル" : 処理のキャンセル
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566033/b3fecaaf-ba3a-5184-7d12-397777f6ebdc.png)

キーワードに該当するファイルがある場合リンクが生成され、なかった場合空白のままになる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566033/566566e3-ac9a-da85-4168-55e35dc8f7c9.png)

リンクを押すと警告的なやつが出てくるが、危険はない
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566033/d63a0a8d-4895-bc5e-7556-b60b7d5f0faf.png)

pdfが開く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566033/cdea0d4a-9d38-f55a-d51d-a2214c1dd0c4.png)


##バックアップについて
マクロを実行すると自動的に"backup"フォルダが生成され、その中にマクロを実行する前のファイルが生成される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566033/af337e34-46d8-b7d7-674e-a371c9dd3504.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566033/1574bbbf-96b3-7f17-3919-2ac13d3fbd5f.png)
Dartで名前付きの引数をつかう

## 関数に名前付きの引数を使わない場合
特に引数に名前をつけない場合はこんな感じで定義します

```dart
void sendMessage(String title, String message) {
...
}
```

呼び出す時

```dart
sendMessage('たいとる', 'めっせーじ');
```



## 関数に名前付きの引数を使う場合
引数に名前をつける場合はこんな感じで定義します

```dart
void sendMessage({String title, String message}) {
...
}
```

呼び出す時

```dart
sendMessage(title: 'たいとる', message: 'めっせーじ');
```

順番を逆にして呼び出すこともできます。

```dart
sendMessage(message: 'めっせーじ', title: 'たいとる');
```
呼び出し時に名前をつけて引数を渡さないと、ビルドエラーが発生します。
忘備録：LAMP環境構築　

# はじめに

自分用の忘備録として。

PHPの開発環境を自宅のpcで構築した時の手順を書いておきます。
# 環境
・mac Os Mojave
・CentOS 7.0
・Apache/2.4.6
・mysql 8.0.19
・PHP 7.3.15

# VageantとVirtualBOXのインストール
・VirtualBOX
公式サイトよりインストール
https://www.virtualbox.org/　

・vagrant
公式サイトよりdmgを取得しインストール
https://www.vagrantup.com/
*Vagrantを削除する際にdmgが必要になるらしいので念の為残しておく。

# CentOS7
・boxの新規追加
box（仮想マシンのイメージファイル）をMacに新規追加。
https://app.vagrantup.com/centos/boxes/7

・centos/7の追加

```
$ vagrant box add centos/7
==> box: Loading metadata for box 'centos/7'
    box: URL: https://atlas.hashicorp.com/centos/7
This box can work with multiple providers! The providers that it
can work with are listed below. Please review the list and choose
the provider you will be working with.

1) hyperv
2) libvirt
3) virtualbox
4) vmware_desktop
```

VirtualBoxを使っているので3を選択

・BOXの確認

```
$ vagrant box list
centos/7 (virtualbox, 1905.1)
```



```
//今後複数の仮想マシンを作ることを想定して、それらをまとめるフォルダ（MyVagrant）を作る
$ mkdir MyVagrant

//MyVagrantに移動する
$ cd MyVagrant

//仮想マシンを作るフォルダを作る（MyCentOS）
$ mkdir MyCentOS

//MyCentOSに移動する
$ cd MyCentOS

仮想マシン設定用のVagrantfileを作る
$ vagrant init centos/7

//Vagrantfileを編集して仮想マシンのIPアドレスを192.168.33.10にする
$ sed -i '' -e 's/# config.vm.network "private_network", ip: "192.168.33.10"/config.vm.network "private_network", ip: "192.168.33.10"/' Vagrantfile

//仮想マシンを起動する（少し時間かかります）
$ vagrant up

//仮想マシンの状態を確認する
$ vagrant status

//OSを最新状態にアップデート
$ sudo yum -y update

//sshで接続
$ vagrant ssh

```

# Apacheのインストール
```

$ yum install httpd
```

# MySQLのインストール
```

$ yum localinstall http://dev.mysql.com/get/mysql80-community-release-el6-3.noarch.rpm
```

#PHP7.3のインストール

PHPに関しては以下のサイトを参考。
https://www.rem-system.com/centos-httpd-php73/
Atcoder 生活　4日目

[前回]
(https://qiita.com/flandrescarlet237/items/8be72ddd34e54fca98cc)

#4日目
きょうは、@drkenさんの[AtCoder に登録したら次にやること ～ これだけ解けば十分闘える！過去問精選 10 問 ～](https://qiita.com/drken/items/fd4e5e3630d0f5859067)で紹介されている第一問から第四問までを解こうとしました。

##一問目　ABC086_A
[Product]
(https://atcoder.jp/contests/abc086/tasks/abc086_a)

```c++

#include<bits/stdc++.h>
using namespace std;

int main(){
	int a,b;
  	cin >> a >> b;
	if(a*b%2 == 0)cout << "Even" <<endl;
  	else cout << "Odd" <<endl;
}
```
##二問目 ABC081_A
[Placing Marbles]
(https://atcoder.jp/contests/abc081/tasks/abc081_a)

```c++
#include<bits/stdc++.h>
using namespace std;

int main(){
	string s;
  	cin >> s;
	int cnt = 0;
   	for(int i = 0;i<3;i++){
  		if(s[i] == '1') ++cnt;
	}
  	cout << cnt << endl;
}
```
一問目と二問目はやっぱり簡単

##三問目 ABC081_B
[Shift only]
(https://atcoder.jp/contests/abc081/tasks/abc081_b)

```c++

#include <iostream>
using namespace std;

int N;
int A[210];         

int main() {
    cin >> N;
    for (int i = 0; i < N; ++i) cin >> A[i];

    int res = 0;

    while (true) {
        bool exist_odd = false;  
        for (int i = 0; i < N; ++i) {
            if (A[i] % 2 != 0) exist_odd = true;  
        }

        if (exist_odd) break; 

        for (int i = 0; i < N; ++i) {
            A[i] /= 2;
        }
        ++res; 
    }

    cout << res << endl;
}
```


##四問目 : ABC087_B
[Coins]
(https://atcoder.jp/contests/abc087/tasks/abc087_b)

```c++
#include<bits/stdc++.h>
using namespace std;

int main() {
  int A, B, C, X;
  cin >> A >> B >> C >> X;
  int res = 0;
  for (int a = 0; a <= A; ++a) {
    for (int b = 0; b <= B; ++b) {
      for (int c = 0; c <= C; ++c) {
        int total = 500*a + 100*b + 50*c; 
        if (total == X) ++res; 
      }
    }
  }
  cout << res << endl;
}
```

三問目と、四問目は解けなかったので@drkenさんのものを写しただけですが、whileとboolの使い方をよく理解することができました。四問目はforにこんな使い方があったんだって感じでした。

B問題を自力で解けるように早くなりたいです。
dart:ffiを使ってみた

Dartからネイティブライブラリの関数を呼び出せるdart:ffiの使い方を調べてみました。
Androidの端末の中にはlibz.soというライブラリが存在します。

（確認方法）

```
adb shell
ls /system/lib
```

ということは、この中にある関数をDartから呼び出せるはず？

## 実際にやってみた

FlutterでNew Projectして、以下のコードを適当な.dartファイルに書きます。

```dart
import 'dart:ffi';

import 'package:ffi/ffi.dart';

String zlibVersion() {
  final z = DynamicLibrary.open('libz.so');
  final zlibVersionPointer =
      z.lookup<NativeFunction<Pointer<Utf8> Function()>>('zlibVersion');
  final zlibVersion =
      zlibVersionPointer.asFunction<Pointer<Utf8> Function()>();
  final result = Utf8.fromUtf8(zlibVersion());
  return result;
}
```

※dart:ffiはDartのC関数呼び出しの基本的な機能。package:ffiはdart:ffiをちょっとだけ便利に使うためのライブラリです。

そして、Flutterのどっか適当なところから`zlibVersion()`を呼んでみる。
`1.2.11`みたいな文字列が取得できたら成功です！（手元のPixel4XLで確認）

とりあえずこれでも良いんですけど、ライブラリの読み込みは初回のみやれば良いはずなので、毎回呼ぶべき処理と初期化処理をわけて、こんな感じのクラスにしてみる。

```dart
typedef ZlibVersionFunc = Pointer<Utf8> Function();

class Zlib {
  Zlib({String libName = 'libz.so'}) {
    final z = DynamicLibrary.open(libName);
    final zlibVersionPointer =
        z.lookup<NativeFunction<ZlibVersionFunc>>('zlibVersion');
    _zlibVersionFunc = zlibVersionPointer.asFunction<ZlibVersionFunc>();
  }

  ZlibVersionFunc _zlibVersionFunc;

  String get version {
    return Utf8.fromUtf8(_zlibVersionFunc());
  }
}
```

`Zlib().version`で同じ結果が取得できたら成功です！

AndroidでJavaやKotlinからネイティブライブラリを呼び出すためには、JNIバインディングのテンプレートコードを大量に書いてCMakeの設定を書いて…とかなりめんどくさかったのですが、それに比べるとDartはかなり簡単です。C言語を書かなくてもCのライブラリが使えるのはありがたい！
きくちゆうきが残業時間とGitコミット行数の関係を調べてみた

システムエンジニアの菊池 祐騎(きくちゆうき)です。
※「100日後に死ぬワニ」の作者きくちゆうきさんとは別人です

さて、唐突ではありますが
働き方改革の流れで長時間労働のみならず従来の週5勤務も含め、様々な部分で変革が起こっています。

が、悲しいことにデータを無視した(つまり現実を見ていない)対策ばかり散見されるように思います。
そこで今回はデータドリブンをテーマに、果たして勤務日数や残業時間が仕事の成果にどう関係するのか明らかにすべく、これらとGitのコミット行数との関係性を調べてみることにしました。

先に結論：
・週5日勤務時と週4日勤務時で、コミット行数に有意な差は見られない
　→週に5日働いた日と4日働いた日で、1週間あたりの成果は変わらない
・残業時間が多いときと少ないときでコミット行数に有意な差は見られない
　→残業をたくさんしたときと、しなかったときで1日あたりの成果は変わらない

どうでしょう？
驚いたでしょうか？それとも、やはりという感じでしょうか？

それでは、今回の調査方法を解説します。

■集計・分析方法
・Gitのコミットログから週別のコミット行数を取得し、それを自身の勤怠情報(週合計残業時間など)と比較しました
・当記事でいうコミット行数とは、追加された行数のことを指します

■コミット行数の取得
コマンドラインでGitのコミット行数を調べるためのコマンドはこちら
git log --numstat --pretty="%H" --author='Gitのアカウント名' --since="集計開始日 00:00:00" --until="集計終了日(開始日+1週間) 23:59:59" --no-merges | awk 'NF==3 {plus+=$1; minus+=$2} END {printf("%d\n", plus)}'

■勤怠情報
単に日別の稼働時間からエクセルで残業時間を集計しただけ

これを読んでいる皆さんの勤怠情報とコミット行数の関係はどうでしょうか？
参考にしてみてください。

※ただし最後に付け足しますが、あくまでデータが示す事実を提示しただけに過ぎず、逆説が成り立つ(勤務日数や残業時間を意図的に制限もしくは増幅しても生産性が変わらない)ことの証明ではないです
※あらゆる人について普遍的にいえることの証明でもないです