OmniAICreator/Qiita-1.07M huggingface dataset:
git addすらせずにファイルを消してしまったときにPhpStormで復元する方法

## ファイルを消してしまったときの絶望感

READMEファイルをせっせと書きつつ開発していたときのこと、READMEファイルは `git add` せずに他のファイルのコミットを積み上げていました。

あるファイルの変更がいらないなっと思ったので `git reset --hard` で最新のコミットに戻しました。

するとどうでしょう。READMEファイルもどこかへ消えてしまいました。

## Gitはファイルを復元できる

こういった間違えのときのためにGitは存在をしていますが、Gitが復元できるのはGit管理下にあるもののみです。

`add` や `commit` を一度でもしておけば完全でなくても元に戻すことは可能です。

しかし、それらを一度もしていないファイルはGitでもどうしようもない（はず）のです。

## PhpStorm is GOD

そのときに使用していたエディタはPhpStormで、このPhpStormにはLocal HistoryというGitとは別に管理してくれているものがあります。

`VCS > Local History > Show History` から選択したファイルの履歴を見ることができます。

READMEファイルと同名のファイルを作成し、Show Historyから消す前の履歴を選択することで復元することができました。
Python仮想環境でDjangoプロジェクトとアプリケーションを作成し、サーバ起動まで

ほぼ自分用メモです。

##Python仮想環境を作成する

```
C:\Users\UserName> python -m venv my_venv
```

my_venv: 仮想環境名

##Scriptsディレクトリに移動

```
C:\Users\UserName> cd my_venv\Scripts
```

##仮想環境に入る
```
> activate
(my_venv) C:\Users\UserName>
```

##pipをアップグレードする
```
(my_venv) C:\Users\UserName> python -m pip install --upgrade pip
```

##Djangoをインストールする
```
(my_venv) C:\Users\UserName> pip install django
```

##Djangoプロジェクトを作成する

```
(my_venv) C:\Users\UserName> django-admin startproject myproject
```
myproject: プロジェクト名

##アプリケーションを作成する
```
(my_venv) C:\Users\UserName> python manage.py startapp myapp
```

myapp: アプリケーション名

##プロジェクトフォルダに移動する

```
(my_venv) C:\Users\UserName> cd myproject
```


##サーバを起動する
```
(my_venv) C:\Users\UserName>myproject> python manage.py runserver
```
文系「ほぼ」未経験からITベンチャーに就職して2ヶ月半が経ちました。

##まえがき
　Qiitaって技術系のエントリが中心なので、~~感想文~~エッセイとか書いたら怒られるかしら……。どうかお目こぼしを……。

##あらすじ
　今年4月に某ITベンチャーにプログラミング「ほぼ」未経験で就職してちょっと経ったので、その感想とかを書こうと思います。

　ちなみに、「ほぼ」というのは、厳密には大学2年のときにインターンに参加してプログラミングをやった経験があるから。ただ、そのときはほんとのほんとに未経験だったので、無事JavaScriptにノックアウトされて逃げるように辞めました。
　それ以来プログラミングが若干トラウマになっていたわけですが、趣味でパソコンを使ううちに、「これ自動化できないかな？」とか思うことがあり、再びちょいちょい触るように。就活でもなんとなくITベンチャーを受けていたら、なぜか採用され、今に至る、という感じです。

##２ヶ月半働いてみた感想

　さて本題。感じたことを雑多に挙げるとこんな感じです。

 - 椅子にすごい格好で座っていても許される
 - 上司からの圧みたいなのがあんまりない
 - 想像していた「サラリーマン」的なのとはちょっと違う
 - 勉強はして当たり前
 - すごい人はすごい
 - 自分はプログラマーをやりたいのか……？

###椅子にすごい格好で座っていても許される
　まずびっくりしたのはこれです(笑)。会社だと、ちゃんとビシッとしてなくちゃならないものかな、と思っていたのですが、わりあい外見に関してはゆるいですね。服装も自由なので、ジャージみたいなので来ている人もいます(笑)。

###上司からの圧みたいなのがあんまりない
　会社といえばタテ組織。上司の上司の上司の……といった気が遠くなるような序列の末席に自分がつくのだ、と、ちょっとげんなりしていたのですが、まだ会社の規模が小さいので、社長さんともすぐ話せる環境です。個人的にはとてもありがたいし、居心地がいいと感じています。

###想像していた「サラリーマン」的なのとはちょっと違う
　このご時世なので、入社以降しばらくはリモートで、6月から出社になりました。が、朝礼があり、オフィス飯を食べ、飲み会に行き……、的な、仕事内容以外のいわゆる「サラリーマン」的なフォーマットは全然ないんだなと思いました。正直仕事内容よりもそちらのほうが心配だったので、これもありがたい限り。

###勉強はして当たり前
　うちの会社では、毎月勉強の進捗を報告する会があります。そうでなくても、自分のキャリアは自分で切り開けよな、的なスタンスっぽいので、そのための勉強はみんな当たり前のようにしているみたいです。
　まわりがみんなやっていると、自分もやらなきゃな、という気持ちに自然となってくるので、休日に全力でまったりしたい気持ちを少しこらえて(笑)、多少のことはやってみたりしています。

###すごい人はすごい
　当たり前ですが、強いプログラマーとして入社して、かつ何年もやっているような人は、知識量がほんとにすごいです。どれぐらい頑張ったら追いつけるかと考え始めると、かなり絶望的な気持ちになります。

###自分はプログラマーをやりたいのか……？
　なんか話が暗い方へ向かいつつありますが(笑)、最近わりと真剣に考えているのが、自分はガチンコプログラマーになりたいのか？それとも？ということです。
　そもそもなぜプログラマーとして就職したかというと、ITに関わることを仕事にしてみたかったからです。とはいえ、自分はITに関する知識が全然ないので、とりあえずその入り口として、プログラマーをやってみるのもアリなんじゃないか、ぐらいのテンションでした。
　実際入ってみて、この選択は正解だったな、と思いつつあるのですが、この仕事をずっと続けるかというと、それはまた別の問題な気もしています……。
　記事も長くなってきたので問いを放り投げて終わりますが、今自分が悩んでいるのは以下のようなことです。

 - プログラマーとしてガンガン勉強するほどのやる気はないな
 - 自分の強みを活かせる場所は、純粋にプログラミングの技能を高めるところと別のところにあるような気がする
 - もう少し人と話せる仕事がいいかも（隣の芝が青いだけかも）
 - というか、もっと自分と向き合うことと関連している仕事のほうがいいかも
Laravelのエラーメッセージを日本語化する

Laravelのエラーメッセージを日本語化する方法をご紹介します。

##Laravelのエラーメッセージを日本語化する

###①フォルダのダウンロード
https://github.com/minoryorg/laravel-resources-lang-ja
上記のサイトにアクセスして、フォルダをダウンロードします。
![202006152303.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643170/c62383e8-8c6c-59de-d4d4-9f676afa84bd.png)
緑色の「Clone or download」を押して、「Download ZIP」を押すとダウンロードします。

###②フォルダを解凍して設置する
フォルダを解凍して、「ja」フォルダを「c/xampp/htdocs/プロジェクト名/resources/lang」のフォルダにコピーします。
![202006152307.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643170/f10f34d3-9e95-c3c7-c0bd-e211ac88050c.png)
この画像の例だと「c/xampp/htdocs/tasks_app/resources/lang」になります。

###③設定ファイルを書き直す
設定ファイル「/config/app.php」を以下のように変更します。

```/config/app.php
'locale' => 'ja',
```

これである程度、日本語化ができます。
![202006152313.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643170/513fa38b-c242-62b8-a379-5e93fb29e38f.png)
上の例だと「titleは必須です」となっているので、設定ファイルの119行目に以下のように書き込みます。

```/config/app.php
'attributes' => [
      'title' => 'フォルダ名'
],
```

再びアクセスすると修正されました。
![202006152317.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643170/87bb794e-dc1d-ad76-b826-fa8ea9c889e1.png)
一部分だけ英単語が出力される場合は、このように配列を追加して直していけばOKです。
パスワードとかモロ見えのヤバいスクリプトを引き継いだので暗号化してそっ閉じしますね！！


# SIreな習慣実話

「今回の踏み台サーバどーすんすか？」

「今回はWebアプリ開発もあるのでWindowsにすることにした」

「~~(あークライアントが今更IEだからか・・)~~
　へ？？でも**今踏み台で動いてるデータ収集と整形スクリプトbashですよ**」

「作り直しが必要だな」

「ではcygwinダウンロードしておきますね」

「まて、**社内規定で許可リストにないツールはインストールできないぞ**」

「ま・・・まさか・・・」

### 「同じ処理をPowershellで書き直ししてくれ」

# チクショー転職だ！

### 待って！！それ以上いけない！
**GUIから10台のサーバで100アカウント手打ちで作らされたあの夏を思い出すんや**。
そう、こっそり途中からnet userコマンドで省力化して素知らぬ顔で納品したあの夏を・・
君には同じ工夫ができる！

[BUSYBOX](https://busybox.net/)

これ使おうず！ワンバイナリーなので環境構築要らないし、
bashのスクリプトも**内蔵コマンドはスクリプト内で自動で解釈して実行**してくれるスグレモノ！

# 移行中にふと、スクリプトをtypeすると

```
#!/bin/bash

USERID=admin
PASSWORD=password1234

wget --post-data="userid=$USERID&$PASSWORD" http://192.168.0.1:8080
```

### 嗚呼・・・見てはいけないものを見てしまった・・しかもパーミッションは755だと？？

こんなの見たら寝れようが無い。最低限何か手を打たないと・・
でも全体を暗号化したら何やってるのかイチからドキュメント起こさないと・・・・

# という時のツールを作りました！(実体験より)

[kuronuri](https://github.com/yasutakatou/kuronuri)

AESと簡易パスワードで部分的に隠したいところを”黒塗り”するツールです。

```
kuronuri.exe -noRun -dst=output.sh (USERID=;PASSWORD=:hogepassword) target.sh
```

こんな感じでマスクしたいキーワード文字を指定すると、、

```
#!/bin/bash

USERID=Et3dTygDs6uOdxYiAA9cHWvrNmOvTRs1g-TQ9OTyBsrs
PASSWORD=VbRl8yLqWAbXossvQRlJRgJavonBaINn4hJvy5mJJtqkAa0wqH7RBg==

wget --post-data="userid=$USERID&$PASSWORD" http://192.168.0.220:8080
```

こんな感じで隠してくれます。
詳しくはリポジトリでどうぞ！バイナリも置いてあるので即使えます！！

# FYI

[Go言語で文字コード変換](https://qiita.com/uchiko/items/1810ddacd23fd4d3c934)

[Data encryption and decryption with a secret key example in Golang](http://www.inanzzz.com/index.php/post/f3pe/data-encryption-and-decryption-with-a-secret-key-in-golang)
Goでエンティティを表現する

## はじめに
前回の記事で「Goで値オブジェクトを表現する」という内容を書きました。
今回は引き続き、エンティティについて書いてみたいと思います。

## 実装
```go:main.go
package main

import (
	"fmt"

	"github.com/AwataKyosuke/qiita/domain/model/user"
)

func main() {

	// 無効なユーザーの作成
	_, err1 := user.New(0, "sample")
	if err1 != nil {
		fmt.Println(err1)
	}

	// 無効なユーザーの作成
	_, err2 := user.New(1, "")
	if err2 != nil {
		fmt.Println(err2)
	}

	// 有効なユーザーの作成
	user1, err := user.New(1, "sample1")
	if err != nil {
		fmt.Println(err)
	}

	// 有効なユーザーの作成
	user2, err := user.New(1, "sample2")
	if err != nil {
		fmt.Println(err)
	}

	// ユーザー情報の表示
	fmt.Println(user1, user2)
	fmt.Println(user1.Equals(*user2))
}
```

```go:user.go
package user

type user struct {
	id   id
	name name
}

// ユーザーを作成する際に呼び出す関数
func New(id int, name string) (*user, error) {
	createdID, err := newID(id)
	if err != nil {
		return nil, err
	}

    // ChangeNameを使うべきなんだろうか、、、。
	createdName, err := newName(name)
	if err != nil {
		return nil, err
	}

	user := user{
		id:   *createdID,
		name: *createdName,
	}

	return &user, nil
}

// ユーザーのnameプロパティを変更
func (u user) ChangeName(value string) error {
    name, err := newName(value)
    if err != nil {
        return err
    }
	u.name = name
	return nil
}

// 比較メソッド
// エンティティは識別子で判断する
func (u user) Equals(target user) bool {
	return u.id == target.id
}
```

```go:id.go
package user

import "errors"

// id型を定義
type id int

// idを作成する場合は、この関数を呼ぶ
func newID(value int) (*id, error) {

	// ここにルールを指定することで、不正なデータを作成できないようにする
	if value < 1 {
		return nil, errors.New("idは1以上の整数である必要があります。")
	}
	id := id(value)
	return &id, nil
}

```

```go:name.go
package user

import "errors"

// name型を定義
type name string

// nameを作成する場合は、この関数を呼ぶ
func newName(value string) (*name, error) {

	// ここにルールを指定することで、不正なデータを作成できないようにする
	if len(value) < 1 {
		return nil, errors.New("nameは1文字以上である必要があります。")
	}
	name := name(value)
	return &name, nil
}

```

```bash:実行結果
$ go run main.go 
  idは1以上の整数である必要があります。
  nameは1文字以上である必要があります。
  &{1 sample1} &{1 sample2}
  true
```

## 終わりに
値オブジェクトとエンティティの違いについてはきっちり理解しておきたいところです。
DDDもGoも初心者なので、間違っていれば指摘をもらえると嬉しいです！
ちなみに「ドメイン駆動設計入門」ですが、既に買ってよかった感が凄いので、おすすめです！（2回目）

...これであってるんだろうか（2回目）

## 参考文献

- https://www.shoeisha.co.jp/book/detail/9784798150727
JavaScriptでobjectとarrayのデータアクセス速度比較

# 検証
```javascript
// それぞれ要素を300個ずつ用意する
const arr = Array(300).fill(1);

const obj = {};
Array(300).fill(1).forEach((i, e) => obj[i] = e);

// ランダムにデータを参照する
function test() {
	const randomIds = Array(300).map(e => Math.floor(Math.random() * 299));

	console.time();
	randomIds.forEach(id => array.find((i, e) => i === id));
	console.timeEnd();

	console.time();
	randomIds.forEach(id => obj[id]);
	console.timeEnd();
}
```

# 結果
objectの方が高速。
【Djangoメモ】ログインユーザーの情報をフォームに事前にセットしたい

# やりたいこと
　投稿サイトで新規投稿する際、いちいち自分で自分の名前を打ち込むのではなく、ログイン中のユーザーの情報（自分の名前など）を事前にフォームにセットし、名前を打ち込む手間を省きたい。

## 1.モデルを用意する
```python:app/models.py
from django.db import models
from django.contrib.auth import get_user_model


class Post(models.Model):
    author = models.ForeignKey(get_user_model(), on_delete=models.CASCADE)
    title = models.CharField(max_length=100)
    content = models.TextField()

    def __str__(self):
        return self.title
```
　Postモデルを用意し、3つのフィールド〔投稿者、タイトル、内容〕を設置する。
　`author = models.ForeignKey(get_user_model(), on_delete=models.CASCADE)`の`get_user_model()`で現在ログインしているユーザーのクラスを丸ごと呼び出しており、この１行で`author`フィールドとログインユーザーが紐づけられる。
　ユーザーモデルへの参照方法はいくつかあるが直接Userモデルを参照するのはよくないとされている。
参考：https://djangobrothers.com/blogs/referencing_the_user_model/

## 2.フォームを用意する。
```python:app/forms.py
from django import forms
from .models import Post

class PostForm(forms.ModelForm):
    class Meta():
        model = Post
        fields = (
            'title',
            'content',
        )
```
　今回はモデルフォームを用いた。Djangoが用意してくれているforms.pyに含まれるModelFormを継承しPostFormクラスを作成する。
　`model = Post`で引き継ぐモデルを指定し、authorを除く二つのフィールドを指定する。ここでauthorをわざわざ指定する必要がなくなる。
## 3.ビューでログインユーザーをセットする
```python:app/views.py
from django.shortcuts import render, redirect
from .models import Post
from . import forms

def form_view(request):
    if request.method == 'POST':
        form = forms.PostForm(request.POST)
        if form.is_valid():
            post = form.save(commit=False)
            post.author = request.user
            post.save()
            return redirect('sns:index')
    else:
       form = forms.PostForm()
    return render(request, 'sns/form_view.html', {'form': form})
```
　form_view関数ではrequestとしてPOSTを受け取るか（`if request.method == 'POST':`）GETを受け取るか（`else:`）で挙動を変える必要がある。例えば、新規投稿というボタンが押されて、URLディスパッチャによりform_view関数が呼び出されるとrequestは'GET'となるので、下に示す通り単純にフォームを表示するだけの処理が実行される。

```python
    else:
        form = forms.PostForm()
    return render(request, 'app/form_view.html', {'form': form})
```
　その表示したフォームに何かしら入力され、送信ボタンが押されURLディスパッチャによりform_view関数が呼び出されると、今度はrequestが'POST'となるので下に示すコードが実行される。

```python
    if request.method == 'POST':
        form = forms.PostForm(request.POST)
        if form.is_valid():
            post = form.save(commit=False)
            post.author = request.user
            post.save()
            return redirect('app:index')
```
　1. `form = forms.PostForm(request.POST)`によって入力された情報をformに格納する。
　2. `if form.is_valid():`で入力された情報に誤りがないか確認し、`post = form.save(commit=False)`で`form`をセーブする。このとき引数に`commit=False`とし完全にセーブする前にもう少し手を加えるということを伝える。
　3. `post.author = request.user`でpostのauthorフィールドに`request`した`user`（つまりログイン中のユーザー）を指定する。
　4. `post.save()`でフォームに入力された内容、及びログイン中のユーザー名をセーブする。
　5. `return redirect('app:index')`でリダイレクト先を指定する。
デビットカードの利用をSlackに通知する

デビットカードを使ったら利用金額がSlackに通知されるようにしてみた。
<img width="375" alt="image_from_ios.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275289/c604eaa1-c68c-e83f-decd-f14dd4ccc63e.png">


# 仕組み
SBIネット銀行のデビットカードには、利用したときにメールで通知する機能があるので、それをMicrosoft Flowでちょっと加工してSlackに転送している。
なので、SBIネット銀行のデビットカード以外だとできないかもしれない。
でも、メール通知してくれる会社のカードを使っていれば応用できる。
![Untitled Diagram.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275289/8453e241-77f5-b095-997e-f120ccddfc9f.png)

# 実装
## SBIネット銀行の設定
カードの利用情報をメールで転送するように設定する。
詳しくは「SBIネット銀行 メールサービス」で検索。

## Gmailの設定
GmailにはMicrosoft Flowから接続する。
メインアカウントに接続するのはセキュリティ的に心配なのでGmailのメインアドレスからサブアカウントに転送する設定をする。
post_master@netbk.co.jp からのメールでタイトルが「【デビットカード】ご利用のお知らせ(住信SBIネット銀行)」のものをサブアカウントに転送する。
Gmailはフィルタを作成するとそのフィルタに適合するメールを転送できる。
詳しくは「Gmail フィルタ　転送」で検索。

## Microsoft Flowの設定
1. トリガーはGmailのサブアカウントに設定する。こちらでもメールタイトル「【デビットカード】ご利用のお知らせ(住信SBIネット銀行)」でフィルターする。
2. 変数newlineを改行文字で定義する。(改行でsplitしたいが、\nとかで改行を表現できないっぽいのでしかたなく・・・)
3. メール本文を改行でごとにスプリットする。`split(triggerBody()?['Body'],variables('newline'))`
4. Splitしたメール本文から「利用加盟店」、「引落金額」が含まれる行をフィルターする。
5. Slackに転送する。`body('filtered_body')[0]`には利用加盟店、`body('filtered_body')[1]`には引落金額のデータが入っている。



![スクリーンショット (46).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275289/445f6e5c-5e6f-ddd4-6e7a-1b6f0e7c0e42.png)


MS Flow流行れー
CSS3のtext-shadowだけで文字に太い枠線をつける方法。

#CSS3のtext-shadowだけで文字に太い枠線をつける方法。

ありそうでなかったので、CSSのtext-shadowだけで文字をぼかしなしのソリッドに太く縁取りする方法を模索してみました。
h1からh3くらいの大きさを想定。
アルファベットや丸みを帯びたフォントを使用すると精度が上がります。
フォントサイズによって値は変更してみてください。

```css
h1{
text-shadow:
 white 3px 0px,
 white -3px 0px,
 white 0px -3px,
 white -3px 0px,
 white 3px 3px,
 white -3px 3px,
 white 3px -3px,
 white -3px -3px,
 white 1px 3px,
 white -1px 3px,
 white 1px -3px,
 white -1px -3px,
 white 3px 1px,
 white -3px 1px,
 white 3px -1px,
 white -3px -1px,
 white 1px 1px,
 white -1px 1px,
 white 1px -1px,
 white -1px -1px;
}
```
【AWS EC2】ec2-userにログイン中、 $ mysql -u root -p でmySQLにログインしようとした時に、 Access denied for user 'root'@'localhost' (using password:   ) エラーが出た場合の解決方法

AWS EC２にRailsアプリをデプロイするための準備として、DB(MySQL 5.7)に接続時に少しだけハマったので備忘録的に残しておきます。
同じようなエラーが起きた方の助けになれば・・・。


下記コマンドでDBへ接続する。

```
$ mysql -u root -p
```

```
Enter password: 
```

あれ、パスワードって何だったっけ？
それらしい文字列を入力してみるて接続を試みるが、案の定下記のようなエラーが発生。

```
Access denied for user 'root'@'localhost' (using password: yes)
```

これは困った・・。そもそも設定した覚えもない？

パスワードを確認するには以下のコマンドで可能。一度確認してみよう。

```
cat /var/log/mysqld.log | grep password
```
するとまたこのエラー(catはファイルの中を確認する時のLinuxコマンド)。

```
Access denied for user 'root'@'localhost' (using password: yes)
```

とりあえずec2-userから以下のコマンドでrootユーザーに切り替える。

```
sudo su -
```

rootユーザーの状態で先ほどのパスワード確認のコマンドを入力する。

```
cat /var/log/mysqld.log | grep password
```

すると

```
2020-06/ [Note] A temporary password is generated for root@localhost: "あなたのパスワード"
```

パスワードを確認できた！ (A temporary password is generated なので一時期的に発行された物？)

ちなみに"　"の間の文字列があなたのパスワードです。

パスワードを確認したので、rootからexitでec2-userに切り替える

```
$ mysql -u root -p
```

```
Enter password: "あなたのパスワード"
```


以下が確認できたらMySQLにログイン成功！


```
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is ***
Server version: 5.7.30

Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> 
```
以上です。

参考
[AWS Amazon Linux2にMySQL5.7を構築する](https://qiita.com/himatani/items/e1e650992dbc12b8a9b3)
[AWSの初期設定でrootパスワードを設定する](https://qiita.com/shanonim/items/5496e0c6f6bf09e76f7c)
【GoogleAppsScript】表を開くと今日の日付のセルに移動

Google SpreadSheetで、以下のような表に、毎日1行づつ記入しています。
今日の日付の所まで移動するのが面倒なので、開いた日の行に、表を開いた時に自動的に移動してほしいと考えました。
![スクリーンショット 2020-06-15 22.33.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131059/ea403c47-cfab-a684-6d37-d0c1e1760702.png)

Google App Scriptで作れることがわかったので、少し調べて、作りました。以下がそのコードです。

```
function onOpen() {
  var today = new Date();
  var dateString = today.getMonth()+1+'/'+today.getDate();
  search(dateString);
}

function search(text) {
  var targetRange = SpreadsheetApp.getActiveSheet().getRange("A3:A300");
  targetRange.activate();
  var finder = targetRange.createTextFinder(text).useRegularExpression(true);
  var res = finder.findNext();
  res.activate();
}
```

このスクリプトではA3:A300の範囲に、月/日のフォーマットで日付が入っていることが前提です。

作る時に、ネットにアップされている色々な方の情報が助けになって、すぐ作れました。ですので、私も少しは貢献したいと考え、アップします。
Redis#exists(key) Warning from redis 

redisの処理がうまくいかないと思ったら、下記のWarningが出ていた

```bash
Redis#exists(key)` will return an Integer in redis-rb 4.3, if you want to keep the old behavior, use `exists?` instead. To opt-in to the new behavior now you can set Redis.exists_returns_integer = true.
```

### issues

https://github.com/mperham/sidekiq/issues/4591

----
### 解決策

```ruby:config/initializers/redis.rb
Redis.exists_returns_integer = true
```
↓
再起動で直る👍
ポートフォリオの開発日記1

今日はAWSに関連しないモデルを利用する機能の実装のために、expressのデーターベースの取り扱いが簡単になるモデルクラスの実装を行った。

mysql用のライブラリが非同期で動作するため、awaitやthenを駆使しながら実装をした。

その結果、promiseを意識して外部からライブラリをしないといけなくなったため、JavaScriptが弱いメンバーが困らないように、改善の余地がある。
Netlify FunctionsをTypeScriptで実装する

Netlify FunctionsをTypeScriptで実装する方法を紹介します。

## 環境構築

### 必要なパッケージをインストールする

```
yarn add -D typescript netlify-lambda @types/aws-lambda @babel/preset-typescript
```

* netlify-lambda: Babel+WebPackを内包していて、TSで実装したFunctionをシングルファイルのJSにビルドしてくれるツールです。
* @types/aws-lambda: Netlify FunctionsはAWS Lambdaとインターフェイスが同じなので、その型定義ファイルを入れておきます。
* @babel/preset-typescript: netlify-lambdaがBabelなので、BabelでTSをビルドするために必要です。

### Babelの設定を書く

プロジェクトルートに以下の内容で.babelrcを作ります:

```json:.babelrc
{
  "presets": [
    "@babel/preset-typescript",
    [
      "@babel/preset-env",
      {
        "targets": {
          "node": "12"
        }
      }
    ]
  ],
  "plugins": []
}
```

### TypeScriptのコンパイル設定

Netlify FunctionsはNode.js 12が実行環境なので、[それに合った`target`と`lib`を設定](https://qiita.com/suin/items/32f76c9b88b8daa286c4)します。

```tsconfig.json
{
  "compilerOptions": {
    "target": "ES2019",
    "module": "commonjs",
    "lib": [
      "ES2020"
    ],
    "noEmit": true
  }
}
```

`tsc`でJSを生成することはないので、`noEmit`を設定しておきます。

### package.jsonの設定

package.jsonに`scripts`と`engines`を追加します。

```package.json
{
  "scripts": {
    "build": "netlify-lambda build src/",
    "serve": "netlify-lambda serve src/"
  },
  "engines": {
    "node": "^12.9.0"
  }
}
```

`build`スクリプトは、TSファイルからJSファイルを生成するものです。`serve`スクリプトはローカルで関数を試せるようにするものです。TSファイルは、`./src`ディレクトリに置くことにします。

`engines`にはNode.js 12.9以上を要求する設定にしておきます。

### Netlifyの設定

Netlify Functionsの置き場と、ビルドコマンドを指定しておきます。

```netlify.toml
[build]
  functions = "./functions"
  commands="yarn build"
```

ビルドコマンドは先ほどpackage.jsonで定義した、`build`スクリプトです。

※この設定でNetlifyにデプロイして`yarn build`が動かない場合は、Netlifyの管理画面で`yarn build`を設定してください:

![CleanShot 2020-06-15 at 22.31.50@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/889/c06f790c-8dcd-08ee-ecbb-3a0a267a8b0d.png)


### .gitignoreの設定

`/functions`はビルドの生成物が入るところなので、gitの管理対象外にしておきます。

```.gitignore
/functions
/node_modules
```

### NetlifyのNodeバージョンを12に設定する

NetlifyはデフォルトでNode 10が使われます。package.jsonで12.9以上を要求しているので、そのままだとビルドがFailになります。そうならないよう環境変数の設定に`NODE_VERSION`、値`12`を追加しておきます:

![CleanShot 2020-06-15 at 22.33.57@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/889/f9f08d8d-f617-5950-fd94-8bd7599cda54.png)

以上で環境構築は完了です。

## TypeScriptで関数を実装する

上の手順でTypeScriptファイルは`./src`に置くことにしたので、ためしに`./src/hello.ts`を作ってみましょう。

```src/hello.ts
import { APIGatewayProxyHandler } from 'aws-lambda'

export const handler: APIGatewayProxyHandler = (
  event,
  context,
  callback
) => {
  const subject = event.queryStringParameters?.name ?? 'World'
  callback(null, {
    statusCode: 200,
    headers: {
      'Content-Type': 'application/json'
    },
    body: JSON.stringify(`Hello ${subject}`)
  })
}
```

これを作ったらローカルで動かしてみます:

```
yarn serve
```

```
curl http://localhost:9000/hello
```

"Hello World"が出力されれば成功です。

## デプロイする

あとは普通に`git push`すればデプロイできます。デプロイプロセスが開始すると、ビルドが走り、JSにコンパイルされた関数がNetlify Functionsに配置されます。

## おわり

本稿で紹介した手順をほどこしたサンプルリポジトリはGitHubにあげてあります。

* [suin/netlify-playground at 05-functions-typescript](https://github.com/suin/netlify-playground/tree/05-functions-typescript)
GASでGoogleDocumentに見出しを付ける・編集をする

# はじめに
Googleスプレッドシートのデータを整形して、Googleドキュメントに登録したい。その時に調べてわかったことを紹介します。

# この記事でわかること
* Google Documentに見出しを付ける。
* Google Documentの編集をする。
* 指定したファイルをGoogleDrive内でフォルダ移動する。

# コード
### Docsに見出しを付ける
```javascript
var body = DocumentApp.getActiveDocument().getBody();

// Append a paragraph, with heading 1.
var par1 = body.appendParagraph("Title");
par1.setHeading(DocumentApp.ParagraphHeading.HEADING1);
```

### Docsを編集する
```javascript
var body = DocumentApp.getActiveDocument().getBody();

// Use editAsText to obtain a single text element containing
// all the characters in the document.
var text = body.editAsText();

// Insert text at the end of the document.
text.appendText('\nAppended text.');
```

#### Docsのファイルを指定したDriveのフォルダに移動
```javascript
// Docs取得
let document = DocumentApp.create('※シート名を入力※');
// Folder取得
let folder = DriveApp.getFolderById('※フォルダIDを入力※');

// ファイルを指定のフォルダに移動
let docFile = DriveApp.getFileById(document.getId());
folder.addFile(docFile);
```

# 参考
* [【GAS】GoogleスプレッドシートのデータをGoogleドキュメント化する](https://qiita.com/shosho/items/6e0912e2e081dbc32a81)
* [Enum ParagraphHeading](https://developers.google.com/apps-script/reference/document/paragraph-heading)
* [Class Text](https://developers.google.com/apps-script/reference/document/text)
Railsチュートリアル rails server 後 railsデフォルトページが出せない

#railsチュートリアル　1.3.2 rails server

チュートリアルをクラウドIDE(AWS cloud9)で進めている人向け

ターミナルでcdした後、`rails server`でサーバを起動し、**Yay! You’re on Rails!**を表示するところ
”クラウドIDEの場合は、[Share] を開いて、開きたいアプリケーションのアドレスをクリックします”
がよくわからんという方向け
画面下部のウィンドウに接続が拒否されましたと出てしまう時は
<img width="1438" alt="スクリーンショット 2020-06-15 22.13.52.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652530/a81977cc-abd2-032b-5b4b-a2f5efb645cb.png">

てな感じで、Preview Running Application、矢印マークを押すと
**Yay! You’re on Rails!**
が新規タブで表示される
（チュートリアルにも同じ様な説明画像あったんですけどね）





Progate(Ruby,rails,HTML/CSS)を終えて、railsチュートリアルを始めたので
つまずいた点を投稿していきます。
Linuxでファイルの指定された列を表示する方法（awk）

Linuxのコマンド`awk`を使用して、ファイルの指定された列を表示することができます。

# 環境

+ OS:CentOS Linux release 8.1.1911

```
[demo@centos8 ~]$ cat /etc/redhat-release
CentOS Linux release 8.1.1911 (Core)
[demo@centos8 ~]$
```

# 1. 半角スペース区切りの指定された列を表示する方法

半角スペース区切りの以下のファイル（`b01.txt`）があります。

```text:b01.txt
1 a ab
2 bb bcd
3 ccc cdef
4 dddd defgh
5 eeeee efghij
```

以下のコマンドで2列目のみ表示することができます。

`awk '{print $2}' b01.txt`

```:実行結果
[demo@centos8 test]$ awk '{print $2}' b01.txt
a
bb
ccc
dddd
eeeee
[demo@centos8 test]$
```

# 2. 「,」区切りの指定された列を表示する方法

「,」区切りの以下のファイル（`b02.txt`）があります。

```text:b02.txt
1,a,ab
2,bb,bcd
3,ccc,cdef
4,dddd,defgh
5,eeeee,efghij
```

以下のコマンドで2列目のみ表示することができます。

`awk -F',' '{print $2}' b02.txt`

```:実行結果
[demo@centos8 test]$ awk -F',' '{print $2}' b02.txt
a
bb
ccc
dddd
eeeee
[demo@centos8 test]$
```

# 3. タブ区切りの指定された列を表示する方法

タブ区切りの以下のファイル（`b03.txt`）があります。

```text:b03.txt
1	a	ab
2	bb	bcd
3	ccc	cdef
4	dddd	defgh
5	eeeee	efghij
```

以下のコマンドで2列目のみ表示することができます。

`awk -F'\t' '{print $2}' b03.txt`

```:実行結果
[demo@centos8 test]$ awk -F'\t' '{print $2}' b03.txt
a
bb
ccc
dddd
eeeee
[demo@centos8 test]$
```

# 4. 指定された行列を表示する方法

半角スペース区切りの以下のファイル（`b01.txt`）があります。

```text:b01.txt
1 a ab
2 bb bcd
3 ccc cdef
4 dddd defgh
5 eeeee efghij
```

以下のコマンドで3行目2列目を表示することができます。

`awk 'NR==3 {print $2}' b01.txt`

```:実行結果
[demo@centos8 test]$ awk 'NR==3 {print $2}' b01.txt
ccc
[demo@centos8 test]$
```

`sed`コマンドと組み合わせた以下のコマンドでも3行目2列目を表示することができます。

`sed -n 3p b01.txt | awk '{print $2}'`

```:実行結果
[demo@centos8 test]$ sed -n 3p b01.txt | awk '{print $2}'
ccc
[demo@centos8 test]$
```

---

以上
SMPL-xを導入するまで

#まずは環境構築

pythonのバージョンを3.7的なところにしないといけないので、
まずはpyenvを入れる。そのためにbrewを入れる。

```
sudo apt-get install build-essential curl file git
```

```
sh -c "$(curl -fsSL https://raw.githubusercontent.com/Linuxbrew/install/master/install.sh)"
```
下記の物をbashrcに追加する。

```
export PATH='/home/linuxbrew/.linuxbrew/bin:/home/linuxbrew/.linuxbrew/sbin':"$PATH"
export PATH="$HOME/.linuxbrew/bin:$PATH"
export MANPATH="$(brew --prefix)/share/man:$MANPATH"
export INFOPATH="$(brew --prefix)/share/info:$INFOPATH"
```

bashrcを更新

```
source ~/.bashrc
```
pyenv-virtualenvを導入する

```
brew install pyenv-virtualenv
```
pyenv-virtualenvのpathを通す

```
export PYENV_ROOT="/home/hirose/.pyenv"(端末に応じて変更)
if which pyenv > /dev/null; then eval "$(pyenv init -)"; fi
if which pyenv-virtualenv-init > /dev/null; then eval "$(pyenv virtualenv-init -)"; fi
```

bashrcを更新

```
source ~/.bashrc
```

ライブラリ追加

```
sudo apt-get install zlib1g-dev
sudo apt-get install libssl-dev
sudo apt install libffi-dev
```

python3.7.7をインストール

```
pyenv install 3.7.7
```
shellでpython3.7.7に入る

```
pyenv shell 3.7.7
```
仮想環境をvenvで作成(今回はtestという仮想環境をつくる)

```
python3 -m venv test
```

pipのアップデート

```
pip3 install --upgrade pip
```

ここまででpythonとpipの環境作成完了

opencvを導入する

```
pip install opencv-python
```

#homogenousの導入

opencvを導入する

```
pip install opencv-python
```

homogenousの導入

```
pip install git+https://github.com/nghorbani/homogenus
```
#SMPL-xの導入

```
pip install smplx[all]
git clone https://github.com/vchoutas/smplx
python setup.py install
```
#vposerの導入

```
pip install git+https://github.com/nghorbani/configer
pip install git+https://github.com/nghorbani/human_body_prior
```

vposerフォルダをhttps://smpl-x.is.tue.mpg.de/downloads
からダウンロードしておく
#SMPliftyの導入
プラグインを追加しておく(SMPlifty用)

```
pip install pyyaml
pip install configargparse
```

SMPliftyをGITからクローンする

```
git clone https://github.com/vchoutas/smplify-x
```

fit_smplx.yamlでinterpenetration = Falseを設定
smplifty-xを実行

```
python smplifyx/main.py --config cfg_files/fit_smplx.yaml --data_folder ./data --output_folder ./output --visualize False --model_folder /home/hirose/smplx/models --vposer_ckpt /home/hirose/smplx/human_body_prior/vposer_v1_0 --part_segm_fn smplx_parts_segm.pkl
```
【Rails】PAY.JPの導入

#### はじめに
チーム開発にて Ruby on Rails を用いてWebアプリを作成中です。

まだまだ未熟なため、記述やコードがわかりにくいかもしれません。
記載しきれなかったものや変更点は、随時更新・ブラッシュアップしていきます。

私と同じ初学者の方は検索に検索を重ねると`「いま自分が何を調べたいのか」`が分からなくなってしまいがちですので、専門用語やカタカナ用語は都度 解説します。


#### PAY.JPとは
*cf.　https://paymentnavi.com/paymentnews/51558.html*

顧客のクレジットカード情報をアプリ側のデーターベースには保存せず、PAY.JPに保存します。顧客とクレジットカードを紐づけて処理することにより、安全にクレジットカードの決済が行えるAPIとなります。

フリーマーケットアプリの開発で商品購入機能については、このPAY.JPを利用しクレジットカードで決済を行う実装としました。

>`API`：
Application Programming Interface(アプリケーション・プログラミング・インターフェイス)」の略語であり、「ある1つの機能に特化したプログラムで共有可能なもの」や「ソフトウェアの機能を共有する仕組み」のこと。

#### バージョン情報
- Ruby 2.5.1
- Rails 5.2.4.3

## 1.`PAY.JPのアカウント作成`
[PAY.JPのサイト](https://pay.jp/)でアカウントを作成します。(事前準備)

## 2.`PAY.JPのgemを導入`
下記をGemfileに記載し**bundle install**を実行。

```:Gemfile
gem 'payjp'
```

## 3.`payjp.jsを読み込めるようにする`
```app/views/layouts/application.html.haml
%html
  %head
    %meta{:content => "text/html; charset=UTF-8", "http-equiv" => "Content-Type"}/
    %title payjptest
    
    -# payjp.jsを読み込めるようscriptを記載
    %script{src: "https://js.pay.jp/", type: "text/javascript"}
    
    = csrf_meta_tags
    = stylesheet_link_tag    'application', media: 'all', 'data-turbolinks-track': 'reload'
    = javascript_include_tag 'application', 'data-turbolinks-track': 'reload'
  %body
    = yield
```

## 4.`環境変数の設定`
> `環境変数`：
OSが設定値などを永続的に保存し、利用者や実行されるプログラムから設定・参照できるようにしたもの。利用者の操作で明示的に作成・変更できるものもある。
よく分からない時はターミナルで**printenv**コマンド(環境変数が設定できているか確認)を実行すれば、なんとなく理解できる。

秘密鍵や公開鍵をコードに直張りはセキュリティの都合上よろしくないので、
このようにコード書いて .bash_profile へ記述。
　　**Payjp.api_key = ENV['PAYJP_PRIVATE_KEY']**
>`.bash_profile`：
**ログイン時に1回** 実行される。 例えば、ターミナル.appを起動した際に読み込まれる。
このファイルには具体的に何を設定すれば良いのかは環境変数を設定すると良い。

>`.bashrc`：
**シェル起動時に1回** 実行される。 コマンドライン上でbashと叩くと再度.bashrcが読み込まれる。(.bash_profileは読まれない)
シェルを起動する度に毎回設定したい場合はこのファイルに設定を入れる。

まずは .bash_profile の存在を確認。

```:ターミナル
$ ls -a
```

自分の場合は無かった。
**touch**コマンドで空のファイルを作成。

```:ターミナル
$ touch ~/.bash_profile
$ touch ~/.bashrc
```

ファイルができたことを確認。(表示されない場合はそのまま次のコマンドを実行)

```:ターミナル
$ ls -a

//例
.bash_profile	.gitignore	Gemfile		Rakefile	config
.bashrc		public		.ruby-version	Gemfile.lock	app		
```


```:ターミナル
$ vim ~/.bash_profile
```
.bash_profile へ記述。

```:.bash_profile
//まず「i」押下して挿入モードにする
export PAYJP_ACCESS_KEY='sk_test_*************'
export PAYJP_PUBLIC_KEY='pk_test_*************'
//escキー => :wq の順で .bash_profile から抜ける
```

最後に環境変数を記述したら必ず下記のコマンドで設定を有効にする。

```:ターミナル
$ source ~/.bash_profile
```

#### おわりに
PAY.JP導入は以上となります。
クレジットカード登録機能の実装は色々と記事がありますので各自参照してください。

## 参考記事
[RailsでPayjpを使った購入機能を実装する]
(https://qiita.com/suzy1031/items/7964829086eb929471a6)
[Payjpでクレジットカード登録と削除機能を実装する(Rails)]
(https://qiita.com/takachan_coding/items/f7e70794b9ca03b559dd)
[【Rails】payjpを使用した決済機能を実装する①〜クレジットカードの登録編〜]
(https://qiita.com/dice9494/items/4aa04da1056d1f15919e)
[.bash_profileと.bashrcのまとめ]
(https://qiita.com/takutoki/items/021b804b9957fe65e093)
【Go golang】自作パッケージのimport

ハマったので流し書きメモ。

# 0. 前提

## 0-1. mainパッケージ
Go言語のプログラムはパッケージ(package)で構成されており、プログラムは `main` パッケージから開始される。

プログラム実行時の処理開始位置の `main` パッケージあるいは `main` 関数を『エントリポイント』と呼ぶ。

## 0-2. import文

他のパッケージのメンバにアクセスするには、 `import` 文を使用します。 `import` 文によって読み込んだパッケージのメンバへのアクセスは、 `パッケージ名.メンバ名` という形で行う。

https://go-tour-jp.appspot.com/basics/1
http://cuto.unirita.co.jp/gostudy/post/go-package/


# 1. import時の注意点

`main` パッケージが大きくなってきた時、処理を複数の関数あるいはファイルに分割したい。

その時、import文では、 **新しく作った独自パッケージへのパスとして、 `$GOPATH/src` 直下のディレクトリから、パッケージファイル（*.go）の直上のディレクトリまでを指定する** 。←これが言いたかっただけ。

※GOPATHとは、開発時の作業ディレクトリのこと。
http://cuto.unirita.co.jp/gostudy/post/gopath/
https://teratail.com/questions/207345

# 2. Go Modulesについて

現在Go言語を使用したアプリケーション開発の依存関係管理では、基本的にGo Modulesを使うっぽい。

https://qiita.com/momotaro98/items/23fa4356389a7e610acc
https://qiita.com/lp-peg/items/9f7da97d9f7292f16fbc

実際やってみたが、楽で良い。
importするパスは、自分のプロジェクトルートディレクトリ直下のディレクトリ名から、importしたいパッケージの直上のディレクトリまで。

```bash
$ go mod init 自分のプロジェクト名
$ go build
$ 自分のプロジェクト名
```
[Rails]1対多対1の孫モデルのidsを取って来るには

(自分用)
#TL; DR
pluckを使う
#モデル構造
Userモデル

```ruby:app/models/user.rb
class User < ApplicationRecord
  has_many :follow, class_name: 'Friendship', foreign_key: 'follow_id'
  has_many :followee, class_name: 'Friendship', foreign_key: 'followee_id'
```
Friendshipモデル

```ruby:app/models/friendship.rb
class Friendship < ApplicationRecord
  belongs_to :follow, class_name: 'Account', foreign_key: 'follow_id'
  belongs_to :followee, class_name: 'Account', foreign_key: 'followee_id'
```

UserがFriendshipとのAssociationを1つ持つ。
FriendshipモデルがUserとのAssociationを2つ持つ。
1対多対1の関係。
# each doは汚い
Deviseでユーザを作っているとして

```ruby:app/controllers/users_controller.rb
~~
  def list
    ids = []
    current_user.follow.each do |f|
      ids << f.followee_id
    end
    @users = User.where(:id => ids)
  end
~~
```
5行も使ってしまった。
# 結論: 1行でも取ってこれるよ
```ruby:app/controllers/users_controller.rb
~~
  def list
    @users = User.where(:id => current_user.follow.pluck(:followee_id))
  end
~~
```
以上です。
[インシデント]nf_conntrack: table full, dropping packet

## 環境
* OSはCentOS6。
* nginx / tomcatでJavaアプリケーションを稼働させているサーバ。
* アドテクノロジーのプロダクトサーバであることから、通信量は多い。

## 現象
* とあるサーバ間での通信エラーが発生していた。
* `/var/log/messages`に以下の内容が連続して出力されていることが確認できた。

```
Jun  3 14:32:12 xxxx kernel: nf_conntrack: table full, dropping packet.
Jun  3 14:32:12 xxxx kernel: nf_conntrack: table full, dropping packet.
Jun  3 14:32:12 xxxx kernel: nf_conntrack: table full, dropping packet.
Jun  3 14:32:12 xxxx kernel: nf_conntrack: table full, dropping packet.
Jun  3 14:32:12 xxxx kernel: nf_conntrack: table full, dropping packet.
```

## 原因
* `ip_conntrack`の最大トラッキング数を超過して、新規セッションを弾いてしまって、ネットワークパフォーマンスが劣化した。
* 当該サーバは`nf_conntrack_max`の値が`65536（デフォルト値）`になっていた。

```
[root@xxxx ~]# cat /proc/sys/net/netfilter/nf_conntrack_max
65536
[root@xxxx ~]#
```

* 現在の接続数は以下のコマンドで確認することが可能。

```
[root@xxxx ~]# cat /proc/sys/net/netfilter/nf_conntrack_count
72861
[root@xxxx ~]#
```

## 解決策
* `/etc/sysctl.conf`の`net.netfilter.nf_conntrack_max`を接続数よりも大きい値とし、設定を反映する。
    * 以下の例では、`500000`に値を設定している

```
■/etc/sysctl.conf編集後の反映コマンド
/sbin/sysctl -p

■反映処理の例
[root@xxxx etc]# /sbin/sysctl -p
net.ipv4.ip_forward = 0
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
kernel.sysrq = 0
kernel.core_uses_pid = 1
net.ipv4.tcp_syncookies = 1
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.shmmax = 68719476736
kernel.shmall = 4294967296
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1
vm.swappiness = 0
net.ipv4.ip_local_port_range = 32768 65000
net.ipv4.tcp_fin_timeout = 5
net.ipv4.tcp_max_tw_buckets = 900000
net.ipv4.tcp_max_syn_backlog = 60000
net.ipv4.tcp_synack_retries = 3
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 0
net.netfilter.nf_conntrack_max = 500000
net.nf_conntrack_max = 500000
net.core.somaxconn = 2048
net.core.netdev_max_backlog = 30720
net.ipv4.conf.all.log_martians = 1
[root@xxxx etc]# cat /proc/sys/net/netfilter/nf_conntrack_max
500000
[root@xxxx etc]#
```
【Unity】Oculus Link使ってEditor上でデバッグ

##Oculus Link(ベータ版)
OculusQuestの**Oculus Link**という機能を使えば
Editor上でVRをHMD越しに確認できます。

**HandTrackingの機能もEditor上で確認できる**ので非常に便利です。

##バージョン情報
Unity2019.3.10f1
Oculus Integration 1.49

##準備

Oculus Integrationをアセットストアからインポートします。

次にProjectSettingsの`XR Plug-in Management`から
プラグインをインポートします。

<img width="578" alt="OculusXRPluginSetting.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244071/f29d9e2b-0211-bcac-ae1a-882feac8dc72.png">

プラットフォームをPCにした状態で
Oculusにチェックを入れます。

<img width="434" alt="OculusEditorPlaySetting.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244071/46753d68-151d-1573-6db4-efb2da0256b4.png">


あとはLinkをQuest側で開いてPCと繋げばOKです。楽ちん。
ハッシュテーブル備忘録

# 概要
ここではDictionaryやSet内部で使われているハッシュテーブルの実装に関することを書いていきます

# python内部でhashテーブルがどこで使われているか
https://github.com/python/cpython/blob/master/Objects/dictnotes.txt
ここを読むと概要がわかる

1. キーワード引数
2. クラスメソッド / インスタンスメソッド / クラス変数 / インスタンス変数の管理
3. buildin functionの管理
4. 重複した要素のない配列（？）の作成
など

# hashテーブル
https://mail.python.org/pipermail/python-dev/2012-December/123028.html
上のURLを読むとわかる
資料を読んだ感想としては、ハッシュテーブルはハッシュ値が衝突しないようにサイズの大きい配列を用意するためにメモリをかなり使うのでメモリをどう削減するかがかなり焦点が当てられているように感じました。
ハッシュテーブルは主にindexesとentryという二つの要素に分けられています。
値の挿入と削除が行われる際、次のような挙動をします。

一つもキーとバリューが入っていない空のdictionaryがインスタンスが作成された場合、indexesは要素数が8の配列として作成されます。配列の中身も全て-1になります。entryも空の配列になります。
なので、indexesは次のようになります。

``` python
[-1, -1, -1, -1, -1, -1, -1, -1]
```

次にa["b"] = 1のようにキーの中に値が挿入された際の挙動を考えましょう。"b"のハッシュ値が2398580820136986479だと仮定すると、 

``` python
hash("b") % indexes.len() = 2398580820136986479 % 8 = 7
```

entryの0番目の要素を[2398580820136986479, "b", 1]に書き換えます。entryの0番目に値が入っているので、indexesの7番目の要素を0に書き換えます。
なので、entryとindexはそれぞれ、

``` python
[-1, -1, -1, -1, -1, -1, -1,  0]
[[2398580820136986479, "b", 1]]
```
のような状態になっています。
次に、a["h"] = 100のようにまた別のキーに値が挿入されて、hash("h") = 5779689943249367370だったと仮定すると、indexesとentryがそれぞれ

``` python
[-1, -1,  1, -1, -1, -1, -1,  0]
[[2398580820136986479, "b", 1], [5779689943249367370, "h", 100]]
```
になるのがわかるでしょう。
はじめてのThree.js 11章 日記

[はじめてのthree.js](https://www.amazon.co.jp/dp/4873117704)

#新たに知った知識
- ポストプロセッシングで必要な最小限のJSファイル

```js
    <script type="text/javascript" src="../libs/postprocessing/EffectComposer.js"></script>
    <script type="text/javascript" src="../libs/postprocessing/MaskPass.js"></script>
    <script type="text/javascript" src="../libs/postprocessing/FilmPass.js"></script>
    <script type="text/javascript" src="../libs/shaders/FilmShader.js"></script>
    <script type="text/javascript" src="../libs/postprocessing/RenderPass.js"></script>
```
- bloomエフェクトのプロパティsigma 鮮明さを作ることができる



#気づいたこと
- 

#wow moment
- 4つのエフェクト
![Screen Shot 2020-06-14 at 22.01.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181534/c78e825f-e5a9-df64-1126-a2dfdf74a0fc.png)
- blur
![Screen Shot 2020-06-14 at 22.05.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181534/9c47ab98-5aa6-cefb-a1cb-ff4eba540613.png)





#まだ解決していない点
- 




[12章はこちら]()
QEmuを使った管理者権限不要ポータブルLinuxのリンクとメモ

#概要

Qemuを使い、***管理者権限不要***でWindowsからポータブルにLinuxを使うためのリンクとメモ。

ちなみにPortable Virtualboxは管理者権限必須。

#欠点

WHPXとかHAXM等のハードウェアアクセラレーションは管理者権限が必須のため一切使えない。
そのためおおよそGUI環境は使い物にならない。CUI環境も動くとは言ってもかなりもっさり。特にブートは遅い。

ポータブルなWindows版Xサーバーを使えば多少はマシになるのか？(未確認)
[WindowsでXサーバを立てる](https://blue-red.ddo.jp/~ao/wiki/wiki.cgi?page=Windows%A4%C7X%A5%B5%A1%BC%A5%D0%A4%F2%CE%A9%A4%C6%A4%EB)
[MobaXterm(ポータブル版あり)](https://mobaxterm.mobatek.net/)
[Portable X-Server(VcXsrvのポータブル版?)](https://sourceforge.net/projects/portable-x-server/)

管理者権限を持ってる自己所有PCもお金もないがどうしても***本物の***Linuxを使いたい場合くらいしか使い道が…
お金があるならVPSを検討したほうが圧倒的に快適、本物でなくてもいいならCygwinなんかも。


#QemuとLinuxのインストール

[USBで持ち歩けるポータブルな開発環境 作ってみた](https://qiita.com/pixie-grasper/items/6d42f284b2ce58ac15e7)

QemuのインストールからDebianのインストール、その後の使い方まで詳しく説明している、Ubuntuも(Xなしのサーバー構成・最小構成なら)問題なく動く。

Debian系だとUSBメモリ上で管理者権限なしでLinuxインストールしようとするとかなり時間がかかるので可能ならインストールだけでもローカルPC上で行い、インストール後にHDDイメージとQemuをUSBメモリにコピーするのが無難。

個人的には[Alpine Linux](https://alpinelinux.org/)がお勧め、ディスクサイズや使用リソースが少なくなるように作られているためか、USBメモリ上でもインストールはすぐに終わる。Dockerコンテナ軽量化のためのベースに使われている関係でWebに資料もそれなりに存在する(Docker使うなら知っておいて損はない)。QEmu上ではブートに時間がかかるが(自分の環境で1～2分くらい)Debian系よりは早い(感覚)。ただしglibcを使っていない関係でうまく動かないソフトがある。

Qemuは現在Windows版のバイナリはインストーラー形式しか提供していないが、インストーラーを使ったインストールには管理者権限が必要になる。(一度インストールさえしてしまえばあとはファイルコピーだけで済むのだが…)

一切管理者権限を使わずにQemuを取り出すには、[Universal Extractor 2](https://github.com/Bioruebe/UniExtract2/releases)でQemuのインストーラーを解凍する。起動の度に警告メッセージが出るが、Qemu自体は動く。

#QemuでSSH接続

Qemuの画面上でもLinuxは使えるがコピペができないなどかなり不便なのでSSHで接続できるようにする。
これができるということはQemu上のLinuxがローカルサーバーとして使えることを意味する(公開サーバーは管理者権限を使って設定しないとファイアウォールで阻止されるので無理)

[QEMU で NAT](https://qiita.com/tukiyo3/items/772231599d7e78cab6ac)
[How to SSH from host to guest using QEMU?](https://unix.stackexchange.com/questions/124681/how-to-ssh-from-host-to-guest-using-qemu)

Qemu起動オプションに-net user,hostfwd=tcp::2222-:22 を追加すると、Qemuがホストの2222番ポートへの接続をゲストの22番ポートへの接続に中継してくれるらしい。

-redirオプションを使う解説もあるが、このオプションは最近のバージョンでは完全に削除されていて使えない。

```
qemu-system-x86_64 -m 1024 -net nic -net user,hostfwd=tcp::2222-:22 -hda hdd1.qcow2
```

例えば上記のようにしてqemuを起動して、Linux側でSSHサーバーを22番ポート(デフォルト)で起動していれば

```
ssh -p 2222 ユーザー名@localhost
```

でQemu上のLinuxにSSH接続できる。(このコマンドをそのまま使うとローカルディスクに勝手にファイルやフォルダが作られるので注意、回避方法は後述)


SSH以外のサーバーも使いたい場合などほかの複数のポートを使えるようにするには

```
-net user,hostfwd=tcp::3389-:3389,hostfwd=tcp::443-:443,hostfwd=tcp::992-:992
```

といったように数珠繋ぎにすればいいようだ。

[QEMU multiple port forwarding](https://serverfault.com/questions/704294/qemu-multiple-port-forwarding)

最近のWindows10はSSHクライアントが標準で入っているが、そのまま使うと環境変数を無視してローカルディスクのユーザーフォルダに.ssh\known_hostsファイルを書き込むのでポータブルではなくなってしまう、また設定ファイルの場所を指定しないと.sshフォルダを勝手に作るのでそれぞれ/dev/nullを指定して勝手にファイルやフォルダを作らないようにオプションを設定する必要がある。

```
ssh -F /dev/null -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -p 2222 ユーザー名@localhost
```

上記のようにすると勝手にユーザーフォルダにファイルやフォルダを作らないようだ。(またいちいちyes/noを聞かれることもない)


#dockerコンテナを持ち歩く

Qemu上のLinux(ubuntu)にdockerをインストールし、hello-worldコンテナを動かしてみたら動いたので、いろいろやってみたい。

[Ubuntu 18.04 LTS に Docker をインストールする](https://www.softek.co.jp/SID/support/sidfmvm/guide/install-docker-ubuntu1804.html)
CSS入門

#CSSの書き方
書き方には3パターンある
- CSSファイルに書いて、HTMLから読み込む
- HTMLファイルにStyleタグを作る
- HTMLタグの中に書く
今回は2つめの書き方を説明する

#基本構造
セレクタ {
プロパティ：値;
プロパティ：値
}

セレクタはどこのタグかを示す(class名やid名)
プロパティはそのタグのどの値かを指す
値はプロパティに割り当てる値を指定する

#プロパティの書き方
**「{}」**でプロパティを囲む
プロパティと値の間は**「：」(コロン)**でつなぐ
また、複数のプロパティがある場合は**「；」(セミコロン)**

**注意点**
半角スペースやタブ、改行は挿入しても構わないが、全角スペースは禁止

#セレクタの書き方
基本タグ名を書けば該当のタグ名の部分に反映される
そのほかには
- ID名・・・セレクタに記入する際は先頭に**「#」(シャープ)**を書く
- class名・・・セレクタに記入する際は先頭に**「.」(ピリオド)**を書く

- 一度に複数書ける。その場合は間に**「,」(カンマ)**を書く

- 子孫セレクタ・・・「◯◯タグ内にある◯◯タグにだけデザインを適用させたい」という絞り込んで指定させたいときに使う。半角スペースで区切る
例)class=”main”タグの中のpタグの中のspanタグ内にのみデザイン(オレンジ色)を適用させたい場合は

```HTML
.main p span{
color:orange
}
```

#プロパティの書き方
取り合ず並びて行く
- font-size(フォントサイズ)
- color(フォント色)
- text-align(文字寄せ)
- background-color(背景色)

#コメントアウトについて
/*コメントアウトする内容*/　とするとおけ
[GitHub Actions] Flutter Web とかで html 埋込みの Firebase JS SDK を自動更新する

## Actions 公開した
無かったので作りました。
[replace-deps actions](https://github.com/marketplace/actions/replace-deps)
<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159680/3851bdac-0fa0-de81-5905-6f3912ca976a.png">
![image](https://user-images.githubusercontent.com/23427957/84658170-6f6ed380-af50-11ea-98c6-caa662f0e512.png)
例として flutter web, firebase を挙げていますが、何にでも使えます。
**パッケージマネージャ管轄外の依存関係を自動更新したい時** に使います。
(`特定の拡張子` を持つファイル内の `特定の文字列` を置換する actions に過ぎない)

## 背景
### flutter web で puspec 管轄外の firebase js sdk を自動更新したくなった
そんな気持ちの中、Google の Cloud Functions の PR 見てたら、[まさにそれっぽいことやってる PR](https://github.com/firebase/functions-samples/pull/732) を偶然見つけました。
これの詳細を追うと、**[GCP/repository-gardener の shell script](https://github.com/GoogleCloudPlatform/repository-gardener/blob/master/use-latest-deps-html.sh)** に辿り着きます。
「なるほど、shell で更新 script 書いて、数々の repository に PR を投げているんだ」と分かります。

というわけで、これに似た script を GitHub Actions に適した形で書き起こしたのが [replace-deps](https://github.com/marketplace/actions/replace-deps) です。
Ubuntu18.04にLAMP環境を構築する

# 環境

ESXi6.7上に構築したUbuntu18.04上に構築していく

| Software | Version |
|-----|-------|
| ubuntu | 18.04 |
| PHP | 7.2 |
| Apache | 2.4.29 |
| MariaDB | 10.1.44 |

# パッケージのアップデート

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

# Apache Web Serverをインストール

- Apache2をインストール

```
sudo apt install -y apache2 apache2-utils
```

- ステータスの確認

```
systemctl status apache2
```

- 起動していない場合は以下のコマンドを実行する

```
sudo systemctl start apache2
```

- 起動時に自動的にapacheが起動できるようにする

```
sudo systemctl enable apache2
```

- serverのURLを入力してapacheのデフォルトページが表示されるか確認する

- apacheのページが表示されない場合はポート開放を行います

- iptablesを使用している場合

```
sudo iptables -I INPUT -p tcp --dport 80 -j ACCEPT
```

- UFWを使用している場合

```
sudo ufw allow http
```

# MariaDBをインストール

- 以下コマンドでインストールする

```
sudo apt install mariadb-server mariadb-client
```

- 起動しているか確認する

```
systemctl status mariadb
```

- 起動していない場合は以下コマンドを実行する

```
sudo systemctl start mariadb
```

- 起動時に自動的にmariadbを起動させる

```
sudo systemctl enable mariadb
```

- インストール後にセキュリティスクリプトを実行する

```
sudo mysql_secure_installation
```
以下の画像の通りに設定を進める
「Enterキー」の部分は何も「y/n」を選択せずに「Enterキー」を入力する
![mariadb.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/583643/8479763f-0995-c98d-6efe-3ad42fbeaa83.png)

- 以下コマンドでルートパスワードを使用せずにmariadbにログインできます．

```
sudo mariadb -u root
```

- 終了するには下記コマンドを実行します

```
exit;
```

# PHP7.2をインストール

- 下記コマンドでPHP7.2をインストールします

```
sudo apt install php7.2 php7.2-mbstring php-gd libapache2-mod-php7.2 php7.2-mysql php-common php7.2-cli php7.2-common php7.2-json php7.2-opcache php7.2-readline
```

- Apache php7.2モジュールを有効にしてからapacheを再起動します

```
sudo a2enmod php7.2
sudo systemctl restart apache2
```

# 参考
[How to Install LAMP Stack on Ubuntu 18.04 Server/Desktop](https://www.linuxbabe.com/ubuntu/install-lamp-stack-ubuntu-18-04-server-desktop)
Node.js 10,12,14のためのTypeScriptコンパイラ設定(targetとlib)

本稿では、Node.jsのバージョンに合ったTypeScriptのコンパイル設定(tsconfig.json)を紹介します。

サーバサイドアプリケーションやCLIアプリケーションをTypeScriptで開発する場合、実行環境としてNode.jsのバージョンを気にすることになります。本稿は、狙ったNode.jsのバージョンに合ったコンパイル設定はどうしたらいいかについて説明するものです。

# Node.js 10

```tsconfig.json
{
  "compilerOptions": {
    "target": "es2018",
    "lib": ["es2018"]
  }
}
```

Node.js 10は、ES2018の構文とライブラリの両方を100%サポートしているので、`target`も`lib`も`es2018`にする。

# Node.js 12

## Node.js 12.9未満の場合

```tsconfig.json
{
  "compilerOptions": {
    "target": "es2019",
    "lib": [
      "es2019",
      "es2020.bigint",
      "es2020.string",
      "es2020.symbol.wellknown"
    ]
  }
}
```

Node.js 12.9未満はES2019の構文とライブラリを100%サポートしているので、`target`も`lib`も`es2019`で良い。また、ES2020のライブラリも一部もサポートしているので、それらを`lib`に加えて良い。

## Node.js 12.9以降の場合

```tsconfig.json
{
  "compilerOptions": {
    "target": "es2019",
    "lib": ["es2020"]
  }
}
```

Node.js 12.9以降は、ES2019の構文と、ES2020のライブラリをサポートしているので、`target`は`es2019`にし、`lib`は`es2020`にする。

# Node.js 14

```tsconfig.json
{
  "compilerOptions": {
    "target": "es2020",
    "lib": ["es2020"]
  }
}
```

Node.js 14.0.0からは、ES2020の構文とライブラリの両方を100%サポートしているので、`target`も`lib`も`es2020`で良い。

# 参考: Node.jsのサポート終了日

参考までに、Node.js(LTS)のサポート終了日は以下のとおり:

* Node.js 8 → すでに終了
* Node.js 10 → 2021-04-30まで
* Node.js 12 → 2022-04-30まで
* Node.js 14 → 2023-04-30まで

![](https://raw.githubusercontent.com/nodejs/Release/master/schedule.svg?sanitize=true)

# 合わせて読むといいかも

* [package.jsonに"engines"を設定すると「このバージョンのNode.jsでしか動かない」を表明できる - Qiita](https://qiita.com/suin/items/994458418c737cc9c3e8)

# 参考文献

* [Node Target Mapping · microsoft/TypeScript Wiki](https://github.com/microsoft/TypeScript/wiki/Node-Target-Mapping)
* [Node.js ES2015/ES6, ES2016 and ES2017 support](https://node.green/)
* [TypeScript/src/lib at master · microsoft/TypeScript](https://github.com/Microsoft/TypeScript/tree/master/src/lib)
* [node.js - recommended typescript config for node 8 - Stack Overflow](https://stackoverflow.com/questions/48378495/recommended-typescript-config-for-node-8)
* [TypeScript tsconfig settings for Node.js 10? - Stack Overflow](https://stackoverflow.com/questions/51716406/typescript-tsconfig-settings-for-node-js-10/57607634#57607634)
* [TypeScript tsconfig settings for Node.js 12? - Stack Overflow](https://stackoverflow.com/questions/59787574/typescript-tsconfig-settings-for-node-js-12/59787575#59787575)
* [What TypeScript configuration produces output closest to Node.js 14 capabilities? - Stack Overflow](https://stackoverflow.com/questions/61305578/what-typescript-configuration-produces-output-closest-to-node-js-14-capabilities/61305579#61305579)

---

最後までお読みくださりありがとうございました。Twitterでは、Qiitaに書かない技術ネタなどもツイートしているので、よかったらフォローしてもらえると嬉しいです:relieved:→[Twitter@suin](https://twitter.com/suin)
岩手県の検査結果から PCR の特異度を推測する。

#岩手県の検査結果から PCR の特異度を推測する。
みなさんご存知のように PCR の結果解釈にはベイズの定理が役立ちます。
新型コロナウイルス（COVID-19）の PCR 検査の感度（疾患のある人の検査結果が陽性となる割合）は60〜70% とされていますが、特異度（疾患のない人の検査結果が陰性となる割合）は何%でしょうか。
事前確率が低い時、検査の特異度が95%なのか99%なのか99.9%なのかでは陽性的中率が大きく変わってきます。
事前確率 1%、感度 65% とした時、特異度によって検査結果陽性時の事後確率がどう変わるかを以下に示します。

| 特異度           |陽性時の事後確率       |
|:-----------------:|:-----------------:|
| 95% |      11.6% |
| 99%  |     39.6%|
| 99.9% |   86.8% |
##岩手県では、788回連続して「陰性」だった。
2020.6.15の時点で岩手県では PCR の結果が788回連続して陰性でした。
もし COVID-19 の PCR 検査の特異度が99%であれば788回連続して陰性になる確率は、0.99<sup>788</sup> = 0.00036 で 0.036% となります。つまり特異度は99%よりずっと高いということです。
特異度 99.5% であれば788回連続して陰性になる確率は、0.995<sup>788</sup> = 0.0193で 1.93% となります。特異度は99.5%よりも高そうです。
特異度 99.9% なら、0.999<sup>788</sup> = 0.455 で 45.5% となります。
岩手県が連続陰性記録を更に伸ばせば、特異度がもっと高いことが証明されるでしょう。
##結語
岩手県の検査結果から推測される COVID-19 PCR の特異度はかなり高い。
###追記
2020.7.17の時点で1224回連続陰性が確認されました。
PCR の特異度は、ほぼ100%に近いため偽陽性（ウイルスがいないのに陽性と出る）の心配はないと思われます。
AtCoder 生活　78日目

[前回](https://qiita.com/flandrescarlet237/items/14420eef55ab9e3838e1)

#78日目
今回は茶色diffの問題を3問解きました。

|問題|難易度|自力で解けた|かかった時間|
|:-:|:-:|:-:|---|---|
|ABC159|D|◯|18分59秒|
|ABC167|C|◯|63分|
|ARC093|C|◯|112分32秒|

##[ABC159_D](https://atcoder.jp/contests/abc159/tasks/abc159_d)

```c++

#include <bits/stdc++.h>
#define rep(i,n) for(int i = 0;i < (n);i++)
using namespace std;
using ll = long long;
using pii = pair<int,int>;

const int INF = 2e9;

int main(){
    ll n;
    cin >> n;
    vector<ll> a(n);
    map<ll,ll> mp;
    rep(i,n){
        cin >> a[i];
        mp[a[i]]++;
    }
    ll sum = 0;
    rep(i,n){
        sum += (mp[i+1] * (mp[i+1] - 1))/2;
    }
    rep(i,n){
        ll ans = sum;
        ans -= (mp[a[i]] * (mp[a[i]] - 1)/2 - (mp[a[i]] - 1) * (mp[a[i]] - 2)/2);
        cout << ans << endl;
    }
}

```

解くのにかかった時間：18分59秒


##[ABC167_C](https://atcoder.jp/contests/abc167/tasks/abc167_c)

```c++

#include <bits/stdc++.h>
#define rep(i,n) for(int i = 0;i < (n);i++)
using namespace std;
using ll = long long;
using pii = pair<int,int>;

const int INF = 2e9;

int main(){
    int n,m,x;
    cin >> n >> m >> x;
    vector<vector<int>> a(n,vector<int>(m+1));
    rep(i,n){
        rep(j,m+1){
            cin >> a[i][j];
        }
    }
    ll ans = INF;
    for(int i = 0; i < (1 << n);i++){
        vector<ll> s(m+1);
        rep(j,n){
            if(i>>j & 1){
                rep(k,m+1){
                    s[k] += a[j][k];
                }
            }
        }
        bool ok = true;
        for(int h = 1;h <= m;h++){
            if(s[h] < x)ok = false;
        }
        if(ok) ans = min(ans,s[0]);
    }
    if (ans == INF) cout << -1 << endl;
    else cout << ans << endl;
}

```

解くのにかかった時間：63分


##[ARC093_C](https://atcoder.jp/contests/arc093/tasks/arc093_a)

```c++

#include <bits/stdc++.h>
#define rep(i,n) for(int i = 0;i < (n);i++)
using namespace std;
using ll = long long;
using pii = pair<int,int>;

const int INF = 2e9;

int main(){
    int n;
    cin >> n;
    vector<int> a(n+2);
    ll sum = 0;
    a[0] = 0;
    a[n+1] = 0;
    rep(i,n){
        cin >> a[i+1];
        sum += abs(a[i+1] - a[i]);
    }
    sum += abs(a[n] - a[n+1]);
    for(int i = 1;i <= n;i++){
        ll ans = sum - abs(a[i] - a[i-1]) - abs(a[i] - a[i+1]) + abs(a[i-1] - a[i+1]);
        cout << ans << endl;
    }
}

```

解くのにかかった時間：112分32秒


###最後に
bit計算がなかなか早く解けるようにならない

難易度|かかった平均時間|解けた問題数|
|:-:|---|---|
|C|87分31秒|2問中2問|
|D|18分59秒|1問中1問|