OmniAICreator/Qiita-1.07M huggingface dataset:
【Rails】Rspecでマクロを定義して処理を共通化する方法

# 目標

ログイン処理を共通化する。

# 開発環境
・Ruby: 2.5.7
・Rails: 5.2.4
・rspec-rails: 4.0.1
・Vagrant: 2.2.7
・VirtualBox: 6.1
・OS: macOS Catalina

# 実装

## 1.`support`ディレクトリを作成

```terminal
$ mkdir support
```

## 2.`support`ディレクトリ内にファイルを作成し、編集

```terminal
$ touch spec/support/login_macros.rb
```

```ruby:login_macros.rb
module LoginMacros
  def login(user)
    fill_in 'メールアドレス', with: user.email
    fill_in 'パスワード', with: user.password
    click_button 'ログイン'
  end
end
```

## 3.`rails_helper.rb`を編集

```ruby:rails_helper.rb
# 23行目をコメントアウト
Dir[Rails.root.join('spec', 'support', '**', '*.rb')].sort.each { |f| require f }

RSpec.configure do |config|
  config.include LoginMacros # 追記
end
```

### 【解説】

#### ① `support`ディレクトリを読み込む。

```ruby
Dir[Rails.root.join('spec', 'support', '**', '*.rb')].sort.each { |f| require f }
```

#### ② `2`で定義したモジュールを使用できるようにする。

```ruby
config.include LoginMacros
```

## 4.メソッドを使用する

```ruby
require 'rails_helper'

RSpec.describe '認証のテスト', type: :feature do
  let(:user) { create(:user) }
  subject { page }

  describe 'ユーザー認証のテスト' do
    context 'ユーザーログインのテスト' do
      it 'ログインできること' do
        visit new_user_session_path
        login(user) # メソッドを使用
        is_expected.to have_content 'ログアウト'
      end
    end
  end
end
```
Docker × Java シンプルすぎる開発環境構築

# DockerでJavaの開発環境構築

## 概要
Docker上にJavaのコンテナを設置するだけのシンプルな環境を構築します。
プログラムを極めし証`Hello World!`をコンソールに出力するところまでをご紹介します(笑)

## 環境
- macOS Catalina バージョン10.15.5
- Docker version 19.03.8
- docker-compose version 1.25.5

## 構成
最終的に以下のような構成になります。

```
├── docker
│   └── java
│       └── Dockerfile
├── docker-compose.yml
└── server
    └── src
        ├── Main.class
        └── Main.java

```

## 手順
### 1. docker-compose.yml作成
javaコンテナ１つだけのシンプルな構成です。

```docker-compose.yml
version: '3.6'
services:
  java:
    build: ./docker/java
    ports:
      - 8080:8080
    tty: true
    volumes:
      - ./server/src:/usr/src:cached
```

### 2. Dockerfile作成
```dockerfile:Dockerfile

FROM openjdk:11-slim

RUN apt-get update
WORKDIR /usr/src
```

### 3. テストファイルを作成
Main.javaというテストファイルを作成します。

```java:Main.java
public class Main {
    public static void main(String[] args) {
        System.out.println("Hello World!");
    }
}
```

### 4. Docker起動
```terminal

// dockerビルド
% docker-compose build

// dockerをバックグラウンドで起動
% docker-compose up -d

// 確認
% docker-compose ps
       Name          Command   State           Ports         
-------------------------------------------------------------
java-spring_java_1   jshell    Up      0.0.0.0:8080->8080/tcp
```

### 5. コンパイルと実行

```terminal
// インスペクション
% docker-compose exec java bash

// コンパイル
root@5b7be900c329:/usr/src# javac Main.java

// 実行
root@5b7be900c329:/usr/src# java Main
Hello World!
```

## 参考
- [dockerでjavaの開発環境を整えてみた](https://yabu-sw.hateblo.jp/entry/2019/02/21/174755)
ios13でカスタムキーボード（simejiなど）無効化する

# 初めに
入力制限をする際にDefaultのキーボードの場合数字オンリーや英語配列のみと指定できますが、カスタムキーボードを考慮するとなると割と面倒くさいことになります。
さらに、カスタムキーボードは脆弱性の観点からもクレジットカード情報を抜き取られたりと、カスタムキーボードはユーザに使わせるメリットが少ない為、無効化しちゃおうと言う話です。
##実装
以下のコードを`AppDelegate`に入れて下さい

```swift:AppDelegate.swift
func application(_ application: UIApplication, shouldAllowExtensionPointIdentifier extensionPointIdentifier: UIApplication.ExtensionPointIdentifier) -> Bool {
        if extensionPointIdentifier == UIApplication.ExtensionPointIdentifier.keyboard {
            return false
        }
        return true
    }
```
#終わりに
これ入れるだけでいろんな面倒なことが解決できるのでメッセージのやり取りを行うようなアプリじゃない場合これを入れてもいいと思います。
線形代数-行列とその積計算方法を忘れる人向け覚え方

線形代数で行って縦と横どっちだっけ？積の計算するときにどるんだっけ？と忘れてしまう方向けの覚え方です。
まさに、恥ずかしながら私が忘れてしまう人です。何度も調べるのも面倒なので、きちんと覚え方をメモしておきます。

# 行が横で列が縦
これは、覚えやすく**行が横で列が縦方向**です。「行」の漢字の右上部分が横棒になっているから横方向、「列」漢字の右部分が縦棒になっているから縦方向と覚えています。
こんな行列があったら、**行=2, 列=3**です。

```math
  A = \left(
    \begin{array}{ccc}
      a_{11} & a_{12} & a_{13} \\
      a_{21} & a_{22} & a_{23} \\
    \end{array}
  \right)
```

# 添え字は行・列の順
行列要素を書く時の**添え字は行→列の順**です。つまり、1文字目は行(横)で、2文字目は列(縦)です。
覚え方は**添え字は言葉(「行・列」)の順に**としています。

```math
  A = \left(
    \begin{array}{ccc}
      a_{11} & a_{12} & a_{13} \\
      a_{21} & a_{22} & a_{23} \\
      a_{31} & a_{32} & a_{33}
    \end{array}
  \right)
```

# m×n行列は行・列の順
添え字と似ていますが、行列の型で「$m \times n$行列」と呼ぶことがあります。その時にmは行(横)、nは列(縦)を示します。
覚え方は**言葉(m,nは「行・列」)の順**としています。
こんな行列は**$2 \times 3$行列**です。

```math
  A = \left(
    \begin{array}{ccc}
      a_{11} & a_{12} & a_{13} \\
      a_{21} & a_{22} & a_{23} \\
    \end{array}
  \right)
```

# 行列の積
最後に行列の積は、**行方向要素に列方向要素を掛けます。**その結果、$a \times b$の行列と$b \times c$の行列の積は$a \times c$の行列
です。
ABの積は以下の計算。

```math
  AB = \left(
    \begin{array}{ccc}
      a & b \\
      c & d \\
    \end{array}
  \right )
  \left(
    \begin{array}{ccc}
      p & q \\
      r & s \\
    \end{array}
  \right
) 
=
  \left(
    \begin{array}{ccc}
      ap + br & aq + bs \\
      cp + dr & cq + ds \\
    \end{array}
  \right
) 
```

少しわかりやすく、結果の1行1列目の要素をどのように算出しているかにフォーカスします(関係ない部分は$\*$としています)。**行方向に列方向を掛ける**という意味がわかりやすくなりました。

```math
\left(
    \begin{array}{ccc}
      a & b \\
      * & * \\
    \end{array}
  \right )
  \left(
    \begin{array}{ccc}
      p & * \\
      r & * \\
    \end{array}
  \right
) 
=
  \left(
    \begin{array}{ccc}
      ap + br & * \\
      * & * \\
    \end{array}
  \right
) 
```

同様に他の3要素も書いておきます。

```math
\left(
    \begin{array}{ccc}
      a & b \\
      * & * \\
    \end{array}
  \right )
  \left(
    \begin{array}{ccc}
      * & q \\
      * & s \\
    \end{array}
  \right
) 
=
  \left(
    \begin{array}{ccc}
      * & aq + bs \\
      * & * \\
    \end{array}
  \right
) 
```

```math
\left(
    \begin{array}{ccc}
      * & * \\
      c & d \\
    \end{array}
  \right )
  \left(
    \begin{array}{ccc}
      p & * \\
      r & * \\
    \end{array}
  \right
) 
=
  \left(
    \begin{array}{ccc}
      * & * \\
      cp + dr & * \\
    \end{array}
  \right
) 
```

```math
\left(
    \begin{array}{ccc}
      * & * \\
      c & d \\
    \end{array}
  \right )
  \left(
    \begin{array}{ccc}
      * & q \\
      * & s \\
    \end{array}
  \right
) 
=
  \left(
    \begin{array}{ccc}
      * & * \\
      * & cq + ds \\
    \end{array}
  \right
) 
```

# 転置
転置がどっちかよく忘れてしまいます。

```math
  {\bf x} = \left(
    \begin{array}{ccc}
      x_1 \\
      \vdots \\
      x_d \\
    \end{array}
  \right)
,\ \  {\bf x}^T = (x_1, \ldots, x_d)
```
AbstractFactoryパターンをenumで生成するメリット

AbstractFactoryパターンの説明には、実行時引数に文字列を渡したり、フラグでif-else判定する例をよく見かけます。

個人開発では自分がすべてを把握しているため気にならないかもしれません。
しかし、チーム開発で他チームにモジュールとして提供している場合、
Factoryの提供を受けたチームが生成可能なFactoryを知るにはどうするのか？

方法としては、自分でコードを調べるか、Factory側のコード担当者に確認するかのどちらかになると思います。

Factory側の担当者は、クライアントのコード担当者の為であろうと、
自分にいちいち聞きに来た時に答えるのが面倒だという理由であろうと、
**『Enumにしておけば何を生成できるかを明白に示せる』**ということを知っておいてもらいたい。

# よく見るFactroy生成方法
## クラス名を文字列で渡して判定するコード例
<img alt='' class='alignnone size-full wp-image-2115 ' src='https://loglog.xyz/wp-content/uploads/2020/07/img_5f0ad704593e5.png' />
これには以下の問題を抱えていると考えています。
・指定する文字列が異なることは無いと言えるか？
・大文字小文字を間違わないということはあり得るか？
・そもそも、存在しないFactoryを呼び出すようなことにはならないか？

## フラグで生成するFactoryを判定する例
<img alt='' class='alignnone size-full wp-image-2113 ' src='https://loglog.xyz/wp-content/uploads/2020/07/img_5f0ad6e43d369.png' />
これも文字列の場合と同じ問題を抱えていると考えています。
またこの判定条件だと、0以外はすべてFactroyYが生成されるということになり、
予期せずFactoryYが生成される可能性を含んでいます。

# Enumを使う例
Enumを使って実装すると、生成するFactroyを明示的に示し、かつ存在しないFactoryを生成することは無くなります。
<span class="dotline">※以降のコードは、TECH SCOREのAbstractFactoryパターンを私が独自に改良したものです。
　TECH SCOREとは一切関係ないことはお含みおきください。</span>
<a href="https://www.techscore.com/tech/DesignPattern/AbstractFactory.html/" rel="noopener noreferrer" target="_blank">8. AbstractFactory パターン</a>


<h3>Use.java(クライアント)</h3>
EnumであるHotpotTypeでRecipe（Factoryクラス）を指定して生成しています。
<img alt='' class='alignnone size-full wp-image-2127 ' src='https://loglog.xyz/wp-content/uploads/2020/07/img_5f0ae54ab7fd2.png' />

<h3>HotpotType.java(Factoryを生成するEnum)</h3>
生成可能なFactoryをここで定義しておきます。
Sukiyaki（すき焼き）を指定すれば、SukiyakiRecipeを生成するという具合です。
<img alt='' class='alignnone size-full wp-image-2126 ' src='https://loglog.xyz/wp-content/uploads/2020/07/img_5f0ae52e55a92.png' />

<h3>Recipe.java(Factoryクラス)</h3>
Factoryの生成はHotpotTypeに委譲しているため、抽象的な実装のみに専念できます。
<img alt='' class='alignnone size-full wp-image-2125 ' src='https://loglog.xyz/wp-content/uploads/2020/07/img_5f0ae50c08524.png' />

# Enumで生成するメリット
・Enumに存在するFactroyしか生成できないため、誤ったFactoryを生成することが無い。
・チーム開発の場合、生成可能なFactoryクラスがなんであるかをクライアント側のコード担当者が知っている必要がない。
　Factoryクラスが不足しているなら、Factory側を担当しているプログラマに依頼すればよいだけとなる。
・Factoryの追加が簡単。
　Enumに必要なFactoryクラスを追加するだけなので、if文を修正するようなことは不要となる。

自分一人だけでプログラムを書いていれば、このようなことは考えなくてもよいと思うが、
**チームで仕事をし、かつモジュールを分割して担当しているのであれば、
このようなに考えることで変更容易性を高め、モジュール化を円滑にできる。**

<h2>クラス図</h2>
<img alt='' class='alignnone size-full wp-image-2131 ' src='https://loglog.xyz/wp-content/uploads/2020/07/img_5f0b9b53a2b20.png' />

<h2>Github</h2>
<a href="https://github.com/TakumiKondo/designpattern/tree/master/src/abstractfactory/hotpot" rel="noopener noreferrer" target="_blank">https://github.com/TakumiKondo/designpattern/tree/master/src/abstractfactory/hotpot</a>
useStateとFunctional updates

## 問題
問題です。以下のコンポーネントでボタンをクリックすると最終的に `useItems` から返ってくる `items` はどのような値になるでしょうか？

```tsx
import React, { useEffect, useState, useRef } from "react";

const useItems = () => {
  const [items, setItems] = useState([])
  const idRef = useRef(0)

  const push = () => {
    const id = idRef.current++
    setItems(items.concat({ id }))
  }

  return {
    items,
    push,
  }
}


export default function App() {
  const { items, push } = useItems()

  return (
    <div className="App">
      <button 
        type="button"
        onClick={() => { push(); push(); push() }}
      >
        PUSH PUSH PUSH!!!
      </button>

      <ul>
        {items.map((item) => <li key={item.id}>{item.id}</li>)}
      </ul>
    </div>
  )
}
```

…

…

メタ読みすれば `[0, 1, 2]` ではないですよね…

…

…

正解は `[2]` です！

## 解説
何故でしょう？
`push` はクロージャから `items` をとってきて `setItems(items.concat({ id }))` をしていますが `items` 自身が更新されるわけではありません。
なので3回呼ばれている同一の `push` では毎回 `setItems([].concat({ id }))` され、最終的には `setItems([2])` されるからです。

`setState` は引数として `(currentState) => nextState` な関数を受け取ることができます（**Functional updates**）。
これを使って上のような問題が起きないように書き換えましょう。

```tsx
import React, { useEffect, useState, useRef } from "react";

const useItems = () => {
  const [items, setItems] = useState([])
  const idRef = useRef(0)

  const push = () => {
    const id = idRef.current++
    setItems((currentItems) => currentItems.concat({ id }))
  }

  return {
    items,
    push,
  }
}


export default function App() {
  const { items, push } = useItems()

  return (
    <div className="App">
      <button 
        type="button"
        onClick={() => { push(); push(); push() }}
      >
        PUSH PUSH PUSH!!!
      </button>

      <ul>
        {items.map((item) => <li key={item.id}>{item.id}</li>)}
      </ul>
    </div>
  )
}
```

こうすれば `useItems` から返ってくる `items` は期待通り `[0, 1, 2]` になります。
なんとなく書いていると意外とあれ？と思うことが起きがちかもなと思いました。

実際に触れるCodeSandboxを置いておきます↓
https://codesandbox.io/s/blissful-robinson-329w2?file=/src/App.js

## 参考
- [Hooks API Reference – React](https://reactjs.org/docs/hooks-reference.html#functional-updates)
PHPでログイン機能を実装する

#PHPでログイン機能を実装する

やっとこさ機能を実装できたので、概要をまとめてみる。
今回作成したのは、emailとpasswordだけの機能。
emailで検索して、フォームに入力したpasswordとDBにハッシュ化されて保存されたpasswordと比較(password_verify)する。

つまづいて長引いた内容について。


##パスワードのhash化について
そもそもパスワードのhash化ってなんじゃいということについて。

パスワードをそのままDBに保存すると危険である。
ということで、password_hashを使って、暗号化する必要がある。

ここで大事なのは、
１．password_hashは不可逆である（元の形に戻せない）


２．パスワードのハッシュ化の仕方
pasword_hash(暗号化したい文字列, PASSWORD_DEFAULT)

例えばフォームにpasswordというnameで入力したパスワードをハッシュ化したい場合は、
pasword_hash($_POST['password'], PASSWORD_DEFAULT)
こんな感じ。

##password_verify()の使い方
password_verify()の使い方だけど、
password_verify(ハッシュ化されてない文字列, ハッシュ化された文字列)
で比較を行う。

この部分の使い方がわからなくて、どちらもハッシュ化された文字列で比較していた・・・。

実際にはこういう風に使う。
```
if (password_verify($login_password, $member['password'])) {
        echo 'ログインしました。';
    } else {
        echo 'メールアドレスもしくはパスワードが間違っています。';
    }
```

でもこんなのって分からない。login_passwordの変数どこからきたの、$member['password']って何なのってなってしまう。
ので、password_verifyの機能を確認するためには以下の構文を使ってみる。

```
$pass = '111111';
$hash = password_hash($pass, PASSWORD_DEFAULT);
if(password_verify($pass, $hash)){
    echo '成功';
}else{
    echo '失敗';
}
```

これで成功と表示されれば、password_hash()がどのように動いてるかなんとなくイメージがつかめると思う。

以上です。
go修行20日目 データベース


## データベース作成

### INSERT

```golang

package main

import (
	"database/sql"
	"log"

	_ "github.com/mattn/go-sqLite3"
)

var DbConnection *sql.DB

func main() {
	DbConnection, _ := sql.Open("sqlite3", "./example.sql")
	defer DbConnection.Close()

	// テーブル作成
	cmd := `CREATE TABLE IF NOT EXISTS person(
		name STRING,
		age INT)`
	_, err := DbConnection.Exec(cmd)
	// エラーハンドリング
	if err != nil {
		log.Fatalln(err)
	}

	// レコードINSERT
	cmd = "INSERT INTO person (name, age) VALUES (?, ?)"
	_, err = DbConnection.Exec(cmd, "Nancy", 20)
	if err != nil {
		log.Fatalln(err)
	}
}

```


```
PS C:\Users\yuta\go\src\semaphore> sqlite3 .\example.sql
SQLite version 3.32.3 2020-06-18 14:00:33
Enter ".help" for usage hints.
sqlite> .table
person
sqlite>
sqlite> select * from person;
Nancy|20
```

### SELECT

```golang
package main

import (
	"database/sql"
	"fmt"
	"log"

	_ "github.com/mattn/go-sqLite3"
)

var DbConnection *sql.DB

type Person struct {
	Name string
	Age  int
}

func main() {
	DbConnection, _ := sql.Open("sqlite3", "./example.sql")
	defer DbConnection.Close()

	// テーブル作成
	cmd := `CREATE TABLE IF NOT EXISTS person(
		name STRING,
		age INT)`
	_, err := DbConnection.Exec(cmd)
	// エラーハンドリング
	if err != nil {
		log.Fatalln(err)
	}

	// レコードINSERT
	cmd = "SELECT * FROM person where age = ?"
	row := DbConnection.QueryRow(cmd, 20)
	var p Person
	err = row.Scan(&p.Name, &p.Age)
	if err != nil {
		if err == sql.ErrNoRows {
			log.Println("No row")
		} else {
			log.Println(err)
		}
	}
	fmt.Println(p.Name, p.Age)
}

```
Nancy 20
```

### DELETE

```golang

package main

import (
	"database/sql"
	"log"

	_ "github.com/mattn/go-sqLite3"
)

var DbConnection *sql.DB

type Person struct {
	Name string
	Age  int
}

func main() {
	DbConnection, _ := sql.Open("sqlite3", "./example.sql")
	defer DbConnection.Close()

	// テーブル作成
	cmd := `CREATE TABLE IF NOT EXISTS person(
		name STRING,
		age INT)`
	_, err := DbConnection.Exec(cmd)
	// エラーハンドリング
	if err != nil {
		log.Fatalln(err)
	}

	// レコードDELETE
	cmd = "DELETE FROM person WHERE name = ?"
	_, err = DbConnection.Exec(cmd, "Nancy")
	if err != nil {
		log.Fatalln(err)
	}
}
```



## 教材
https://www.udemy.com/course/go-fintech/learn/lecture/12088980
Next.jsでソースを簡単にsrcディレクトリに配置する方法

`create-next-app`でNext.jsのアプリケーションを作成しました。
ですがソースが平置きされておりましたので、どうしても`/src`に配置したかったのです。


```bash
npx create-next-app my-app
```

```
my-app
│  package.json
│  README.md
│  yarn.lock
│  
├─node_modules
│          
├─pages
│  │  index.js
│  │  
│  └─api
│          hello.js
│          
└─public
        favicon.ico
        vercel.svg
```

`/pages`がルートディレクトリにあり、できれば`/src`の配下に入れてしまいたいと思い調査しました。

Next.js 9.1からは、`/src/pages/`ディレクトリにおいたファイルが認識されるようになっていました。

特に設定は不要で簡単にできました！

```
my-app
│  package.json
│  README.md
│  yarn.lock
│  
├─public
│      favicon.ico
│      vercel.svg
│      
└─src
    └─pages
        │  index.js
        │  
        └─api
                hello.js
```

## 参考文献

[Blog - Next.js 9.1 | Next.js](https://nextjs.org/blog/next-9-1)
【C#】IEnumerableの遅延評価でプロパティが書き換わらない

## プロパティの値を変更したけど変わらない・・・

職場においてC#を利用して自社サービスを実装しているのですが、
`IEnumerable`ではまったことをちょっとまとめておきたいと思います。

下記は起こった事象を簡単にしたものとなります。下記の例は、`IEnumerable`に入ったユーザ情報の名前が大文字になることを期待したものとなります。

```csharp

// このようなクラスを読み込んでいます
//class User {
//    public string Name { get; set; }
//}

IEnumerable<User> users = new[] { "kato", "saito", "kondo" }
    .Select(n => {
        return new User { Name = n };
    });

foreach (User user in users) {
    // 大文字に変換したはずなのに・・・
    user.Name = user.Name.ToUpper();
}

foreach (User user in users) {
    Console.WriteLine(user.Name);
}

```

出力結果

```
kato
saito
kondo
```

なぜか最初の値のままでした・・・

そうなんです。参照が違っておりました。
`Enumerable.Repeat`とか`Enumerable.Select`とかが遅延評価の`IEnumerable`を返すので、`foreach`や`ToList`で評価された際に初期化されてしまいます。

## 修正パターン１

```csharp

IEnumerable<User> users = new[] { "kato", "saito", "kondo" }
    .Select(n => {
        return new User { Name = n };
    }).ToList();

foreach (User user in users) {
    // 大文字に変換
    user.Name = user.Name.ToUpper();
}

foreach (User user in users) {
    Console.WriteLine(user.Name);
}
```

ToList()することで再度評価されても同じ参照が返るので無事、大文字にできました。

```
KATO
SAITO
KONDO
```

## 修正パターン２

修正パターン１だと、２ループしてしまうのは性能上問題があると思いますので、下記の方法を考えました。

```csharp

IEnumerable<User> users = new[] { "kato", "saito", "kondo" }
    .Select(n => {
        return new User { Name = n };
    });

users = users.Select(u => {
    u.Name = u.Name.ToUpper();
    return u;
});

foreach (User user in users) {
    Console.WriteLine(user.Name);
}
```

初期化の後にSelect()に修正して、無事、

```
KATO
SAITO
KONDO
```

大文字に置換することができました！

## 実行環境

- C# 7.3
- Windows 10
SAS/CDISC 自分がよく参照する公式サイトのリンク

# SAS リンク集
ほぼ自分用

プロシジャガイド
https://go.documentation.sas.com/?cdcId=pgmsascdc&cdcVersion=9.4_3.4&docsetId=allprodsproc&docsetTarget=procedures.htm&locale=ja

SAS関数
https://support.sas.com/documentation/cdl_alternate/ja/lefunctionsref/67960/HTML/default/n1mj2bizbsd7ktn1sf9lz111kku3.htm

Base SASのQA
https://www.sas.com/offices/asiapacific/japan/service/technical/faq/list/base_index.html

グラフ作成例
https://support.sas.com/en/knowledge-base/graph-samples-gallery.html

グラフの線/マーカーの種類
https://documentation.sas.com/?docsetId=grstatproc&docsetTarget=p0er4dg9tojp05n1sf7maeqdz1d8.htm&docsetVersion=9.4&locale=ja
https://documentation.sas.com/?docsetId=grstatproc&docsetTarget=p0i3rles1y5mvsn1hrq3i2271rmi.htm&docsetVersion=9.4&locale=ja

CDISC
https://www.cdisc.org/ 

FDA : Study Data Technical Conformance Guide
https://www.fda.gov/industry/fda-resources-data-standards/study-data-standards-resources

PMDA : 技術的ガイドなど
https://www.pmda.go.jp/review-services/drug-reviews/about-reviews/p-drugs/0026.html

製薬協 資料
http://www.jpma.or.jp/medicine/shinyaku/tiken/tiken/expert/results_lists.html
SASテクニック フォルダ作成

SASでフォルダ作成
普通に作ればいいんだけど...
フォルダがある前提でプログラム動かしてて、フォルダなくてエラー出るとうざい

以下、フォルダ作成マクロ

```sas
%macro Folder_Make(Pass = ., Folder = %str());
%if &Folder. = %str() %then %do;
  %put ERROR: 作成フォルダ名ちゃんと指定しろや;
  %goto tobu;
%end;

%if %sysfunc( fileexist( "&Pass." ) ) = 0 %then %do;
  %put ERROR: パスちゃんと指定しろや;
  %goto tobu2;
%end;

%if %sysfunc( fileexist( "&Pass.\&Folder." ) ) = 0 %then %do;
  %let rc = %sysfunc( dcreate( &Folder. , &Pass. ) );
%end;

%tobu:
%tobu2:
%mend;
```

tobu2はtobuでも問題ない
飛ぶ先を分ける場合はgotoの名前も分ける


https://www.sas.com/offices/asiapacific/japan/service/technical/faq/list/body/ba260.html
Wordpressでユーザーメタ情報を取得、更新

#ユーザー情報を取得、更新

```php
//ユーザー情報を取得
  $users = $wpdb->get_var("SELECT COUNT(ID) FROM $wpdb->users");
  $user_meta = wp_get_current_user();
  $user_id = $user_meta->ID;

//取得
get_user_meta($user_id, 'something', false);

//更新
update_user_meta($user_id, 'something', true);

```
Unity上でPlayボタンを押すとオブジェクトのAlbedoが変わるスクリプト

# やりたいこと
Fusion360で作成したオブジェクトと、Substance Painterで3DペイントしたテクスチャをUnityに取り込んで、Playボタンを押すとテクスチャが適用されるスクリプトを作成します。

# 流れ
1. Fusion360でオブジェクトを作成して、FBXでエクスポートする
2. RizomUVでUV展開する
3. Substance Painterで3Dペイントして、Unity用にエクスポートする
4. Unityでオブジェクトとテクスチャをインポートする
5. **Albedoを適用するスクリプトを作成する　←　今回の投稿の対象**
6. **スクリプトとオブジェクトを紐づける　←　今回の投稿の対象**
6. **スクリプトとテクスチャ画像を紐づける　←　今回の投稿の対象**
7. **実行ボタンを押すと、オブジェクトのAlbedoが変更される　←　今回の投稿の対象**
8. **実行ボタンを押すと、Albedoが変わる　←　今回の投稿の対象**

# 詳細
3Dモデルやテクスチャの取込方法については、以下の投稿を参考にしてください。
[Substance PainterでエクスポートしたテクスチャをUnityに取り込む](https://qiita.com/harufuji/items/5821c496650cc06d7dab)

### 5. Albedoを適用するスクリプトを作成する
Hierarchyウィンドウの取り込んだオブジェクトをクリックし、InspectorウィンドウのAdd Component -> New Scriptを選択します。名称をtexture_changeに変更し、Create & addをクリックします。スクリプトが生成されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262601/df71d05d-3d7f-d723-0112-571ff7f73e5b.png)

Assets内に生成されたスクリプトtexture_changeをダブルクリックし、Visual Studioを起動、以下のソースに変更し、保存します。

```c#
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class texture_change : MonoBehaviour
{
    // Start is called before the first frame update
    // スクリプトから画像を扱う場合に Texture または Spriteという形式に変換する必要がある
    // クラス変数として Texture型のクラス変数 wood_dark_AlbedoTransparencyを定義する
    public Texture wood_dark_AlbedoTransparency;

    void Start()
    {
        GetComponent<Renderer>().material.mainTexture = wood_dark_AlbedoTransparency;
    }

    // Update is called once per frame
    void Update()
    {
        
    }
}
```

### 6. スクリプトとオブジェクトを紐づける
5で作成したスクリプトを3Dオブジェクトに関連付け（アタッチ）します。スクリプトを選択し、3Dオブジェクト（この例ではBody1）にドラッグ&ドロップします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262601/d17e3e3b-acc1-1b32-4295-b0b91a83a07d.png)

### 7. スクリプトとテクスチャ画像を紐づける
Unityでは変数のアクセス修飾子をpublicにすると、インスペクター上で変数の紐づけを行うことができます。
Hierarchyウィンドウのスクリプトを紐づけた3Dオブジェクト（この例ではBody1）をクリックします。
Inspetorウィンドウを見ると、スクリプトに記載した変数が表示されています。変数の右の丸をクリックし、表示したいAlbedo画像を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262601/c5977af1-a661-05be-1f4f-84204a4f600e.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262601/098c7032-53f9-ee38-2b10-84d345773433.png)

### 8. 実行ボタンを押すと、オブジェクトのAlbedoが変更される

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262601/d8b72227-e1d3-739b-d0c7-76268e78909d.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262601/eb19b0be-9305-38ac-754a-62944f0aae01.png)
Railsでi18nを使った日本語化をする

*環境：ruby 2.5.1 / rails 5.2.3*

## やりたいこと
- エラーメッセージなど英語で表記される箇所を日本語の置き換えたい
- DBのカラム名やclassの属性を表示する時に、予め日本語に置き換えたものを表示されるようにしたい

## 結論
- gemの`rails-i18n`を導入する
- 変換したい単語を`ja.ｙｍｌ`ファイルに設定する

## やり方
- gemの`rails-i18n`を導入する

```ruby:Gemfile
# 記述する場所はファイルの一番下か、group :development, group :development, :test 以外の場所に記述
gem 'rails-i18n'
```
- gemをインストールする
- `config/application.rb`内の**デフォルトのlocale（ロケール）をja**にする

```ruby:application.rb
# ↑これより上のコードは割愛
module App
  class Application < Rails::Application
    config.i18n.default_locale = :ja
    config.time_zone = 'Tokyo'
  end
end
```

- `config/locales/ja.yml`のファイルを作成する
- `ja.yml`の中に、日本語に変換したい設定を`yml形式`で記述する<br />
例：DBのカラムに関する文字 → `activerecord: attributes: モデル名:`<br />
　　viewに関する文字 → `views: リソース名:`

```yml:ja.yml
ja:
  activerecord:
    attributes:
      user:
        name: ユーザー名
        email: メール
        password: パスワード
        password_confirmation: パスワード（確認）
      tweet:
        name: 名前
        title: タイトル
        body: 本文
      comment:
        name: 名前
        comment: コメント
  views:
    pagination:
      first: 最初
      last: 最後
      previous: 前
      next: 次
      truncate: ...
```

- 設定が完了したら、サーバーを立ち上げ直す（これをしないと反映されないため）
UserFormの動的生成まとめ

# 要点
・まず`VBIDE.VBComponent`型の変数を宣言し、`VBProject.VBComponents.Add`メソッドで生成したインスタンスを格納する

```vb
Dim foo = VBIDE.VBComponent
Set foo = ThisWorkbook.VBProject.VBComponents.Add(vbext_ct_MSForm)
```

・プロパティは`.Properties`コレクションで設定するが、`.Name`の様に直接設定できるものもある

```vb
With foo
    .Name = "bar"
    .Properties("BackColor") = &HF4F5F6
    ....
End With
```

・コントロールの追加は`.Designer`プロパティで

```vb
Dim con as MSForms.Control
Set con = foo.Designer.Controls.Add("Forms.Label.1")
With con
    .BackColor = &HF4F5F6
    ....
End With
```

・イベント等を書くのは`.CodeModule`プロパティで

```vb
With foo.CodeModule
    .InsertLines(1, "Private Sub UserForm_Initialize()")
    .InsertLines(2, "[codes here]")
    .InsertLines(3, "End Sub")
    .InsertLines(4, ....)
    ....
End With
```

・生成したVBComponentのインスタンス化は`UserForms.Add`メソッド、受けるインスタンスは`Object`型で

```vb
Dim hoge as Object
Set hoge = UserForms.Add("bar")
```

・インスタンスを`.Show`で表示

```vb
hoge.Show
```

・削除はインスタンスの`Unload`後に

```vb
Call ThisWorkbook.VBProject.VBComponents.Remove(foo)
```


## 補足
・`.Designer.Controls.Add`で作成したコントロールを受けるオブジェクト（上記`con`）は、使い回しがきく。複数・多種のコントロールを追加する場合でも、一つ`MSForms.Control`型オブジェクトを用意すればいい。

・一方、`MSForms.TextBox`等の個別のコントロールに存在して`MSForms.Control`に存在しないプロパティは多く、例えば`MSForms.Control.Font`とするとエラーが返る。`MSForms.Control`には`.Properties([property name])`も用意されていないのでプロパティ名からの設定もできない。作成するコントロールの型に合わせてオブジェクトを作ればエラー回避できるが、オブジェクト数が増えて使い回しメリットが減る。

・「追加」と「属性設定」のプロシージャを分けて、追加するプロシージャでは`MSForms.Control`で受けた後、属性を設定するプロシージャに渡し、その際に`(ByRef [paramname] As MSForms.TextBox)`のように個別のコントロール型で受ける手はある。

・同種のコントロールを反復処理で追加するとき、属性の反映が不十分なまま描画進行してしまう（例えば`.Height`がまちまちな）ときは、反復処理中に`DoEvents`してみる。

・`.Designer`プロパティの引数やオプションについてはMicrosoft Docs参照（下記）。

・VBComponentのインスタンス（上記`hoge`）を`Object`型ではなく`MSForms.UserForm`型で受けるとエラー。

・`.CodeModule.InsertLines`で設定する行番号は、モジュールオプションの自動挿入を考慮する（例えば、`Option Explicit`が自動挿入される設定であれば、行番号は2からスタートする、等）。

・`.CodeModule.InsertLines`でプロシージャを書き込むと、ブレークポイント設定も`Stop`コマンドも許されない（「中断モードでは入力できません」→「継続」or「終了」の選択を迫られる）。デバッグの妨げになるので、静的に生成したUserFormで完成させてから動的UserFormに移行するのが無難。

・インスタンスの`Unload`前に`VBComponents.Remove`するとExcelが落ちる。


## 参考サイト
[Microsoft Docs: Properties (Visual Basic Add-in Model)]
https://docs.microsoft.com/ja-jp/office/vba/language/reference/visual-basic-add-in-model/properties-visual-basic-add-in-model

[Reference Dynamic UserForm Name]
 https://www.excelvbasolutions.com/2017/08/reference-dynamic-userform-name.html
初心者向け基本のdocker-composeコマンド

## build(イメージをビルドする)
`$ docker-compose build`
docker-compose.ymlファイルを元にイメージをビルドする

## up(コンテナを開始する)
`$ docker-compose up -d`
コンテナがなければ作成し、コンテナを開始する。
create + start。

-dをつけるとバックグラウンドで起動して実行したまま。
-dをつけないとコマンド終了時にコンテナは停止する。

https://docs.docker.com/compose/reference/up/

`$ docker-compose up --build -d`
--build で強制ビルドする。
設定ファイル等の編集後、既存のイメージを使われると変更が反映されないので、再度ビルドさせたい場合に使う。

## stop(コンテナを停止する)
`docker-compose stop`
コンテナを削除せずに実行を停止します。 ` docker-compose start`で再度開始できます。

https://docs.docker.com/compose/reference/stop/

## down(イメージ等を削除する)
`$ docker-compose down`
今あるdockerイメージとかを削除する。
コンテナを停止し、 up で作成したコンテナ・ネットワーク・ボリューム・イメージを削除します。デフォルトではコンテナとネットワークのみ削除します。

http://docs.docker.jp/compose/reference/down.html

## ps(コンテナの一覧を出力する)
`$ docker-compose ps`
コンテナの一覧を出力する。
起動しているかなどの状態がわかる。

https://docs.docker.com/compose/reference/ps/

## images(イメージの一覧を出力する)
`docker-compose images`
作成したコンテナが使用するイメージの一覧を表示します。
イメージのIDなどがわかる。

https://docs.docker.com/compose/reference/images/

## exec(コマンドを実行する)
`$ docker-compose exec`
サービスに対する任意のコマンドを実行する。

コンテナの中に入る
例：`$ docker-compose exec web bash`

https://matsuand.github.io/docs.docker.jp.onthefly/compose/reference/exec/

## おまけ
`# exit`
コンテナから出る

## 参考
- https://docs.docker.com/compose/reference/
- https://docs.docker.com/compose/reference/overview/
rails db:createでDBを作成しようとするとパスワード認証に失敗して作成できないときに確認するところ

Docker compose + Rails + PostgreSQL

`rails db:create`でDBを作成しようとしたら、
以下のエラーメッセージが出た。

```
FATAL:  password authentication failed for user "postgresql"
Couldn't create 'product-register_development' database. Please check your configuration.
rails aborted!
PG::ConnectionBad: FATAL:  password authentication failed for user "postgresql"
```
パスワード認証に失敗したため、データベースを作成できなかった
という内容。

Rails側のDB設定ファイルを確認
config/database.yml

```yml:database.yml
default: &default
  adapter: postgresql
  encoding: unicode
  host: db
  user: postgres
  port: 5432
  password: <%= ENV.fetch("DATABASE_PASSWORD") %>
  # For details on connection pooling, see Rails configuration guide
  # http://guides.rubyonrails.org/configuring.html#database-pooling
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
```
userとpasswordを確認した。

両方タイプミスしてました…上記のように正しく直したらうまくいきました。
Docker関係なかった。

練習のため、PostgreSQLのデフォルト設定のまま作成しています。
user: postgres
password: postgres
numpy の dtype変更だけでパフォーマンス改善できた話

## はじめに
numpy の計算効率化に取り組む機会があったのですが、
その中で dtype の重要さを学びました。

個人の備忘録としては勿論、誰かの役に立つといいな〜と思い
書いたものが本記事となります。


## パフォーマンス前後比較
ザックリ書くと、

1. サイズにして （1万,400) @ (400,55万) 程度の行列計算を複数個行う
2. それらの積集合を取る

という処理を行う必要があったのですが、 numpy の dtype 変更だけで
以下のようにだいぶ改善できました。（最初はどんだけ酷かったんだよ…というね）

|項目|before|after|
|:---|---:|---:|
|処理時間|70分|10分|
|使用メモリ|100GB超|30GB強|

※ メモリはMacアクティビティモニタの「メモリ」の値より。
(jupyter カーネルが落ちるレベルだったが、余裕で生き残るようになりました）

以下、どんな変更をしたか書いていきます。

## 実施したこと
### 高速化について
**numpy.array の dtype を `float32 or float64` にする**

numpy の行列計算では、 [BLAS](https://ja.wikipedia.org/wiki/Basic_Linear_Algebra_Subprograms) というものを使っているらしい。
で、どうやらこいつが上記データ型だといい仕事をしてくれる模様。
（参考リンクの一番上の記事参照）

自分の場合、最初 int になっていたのですが、`.astype(np.float32)`で
float32 に型を変えただけで処理時間がなんと70分 → 10分に短縮されました！！

【追記】
一晩寝て読み直したら状況説明が不十分に思ったので、少し補足します。

元は`pd.get_dummies` で one hot encoding した後に、 `.values` で
numpy.ndarray を取り出し計算していました。

このやり方だとデータ型が uint8 になるのですが、これを float32 に
変えてやることで高速化を実現出来ました。

コードにすると、こんな感じです。

```python
pd.get_dummies([PandasのSerise]).astype(np.float32).values
```

### 省メモリについて
**可能なら `行列の値を bool 値`にする**

前述の float 化で処理は爆速になりましたが、メモリが爆食いされてしまいました。
こまめに不要なオブジェクトを`del`する等、抵抗をしていたのですが大きな改善に至らず。

しかし計算結果を bool に持たせ直すことで、めちゃくちゃメモリを削減できました。
（bool型 と int, float 型で予め確保しておくメモリが違うっぽいですね）

…でも、これをやると速度は少し失われます。メモリと速度、どっちをとるか？ケースバイケースで。

【補足】
python では`1/0 と True/Falseに以下のような関係が成り立ちます`。

<img width="108" alt="true_false.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78126/4741bcf6-40f9-6800-eb4c-1512be4357b9.png">

なので、1/0 で表現出来る行列（例えば one hot encoding 行列とか） は、
bool 値でも表現できます。

### そしてあわせ技
以上、2点を組みわせただけで、大幅に効率化出来ました。
最終的には、こんな処理の流れになりました。

1. float32 型で行列計算を行う  
・`arrayA = float32行列 @ float32行列`
2. 得られた結果を bool 型に変換する  
・`arrayA = (arrayA >= 1)`とかやるだけ
3. それらの積集合を取る  
・`result = arrayA & arrayB & arrayC` みたいな

## 感想
float の方は色々なケースで使えそうだけど、 bool の方は限られるかな？
結果が 0/1 で表すことが出来るケースじゃないと適用できないと思うので。

## その他
- Cpython で numpy 型指定して書いてやれば超早くなるという記事も見ました。
が、今回そこまでは実際に試しませんでした。
必要となる機会があれば、試してみたいと思います。
- [Intel MKL の方がパフォーマンスが良いらしい](https://insilico-notebook.com/python-blas-performance/) ですが、実行環境がインテルCPU  
とも限らないので、OpenBLASで自分は実行しました。

## 参考リンク
- https://stackoverflow.com/questions/19839539/how-to-get-faster-code-than-numpy-dot-for-matrix-multiplication
- https://www.benjaminjohnston.com.au/matmul
- https://stackoverflow.com/questions/18743397/python-numpy-np-int32-slower-than-np-float64
- https://insilico-notebook.com/python-blas-performance/

## ついでに
2020/08/26 追記。
パフォーマンスとは微妙に違うかもだけど、
せっかくなので記録しておく。

ちょっとした理由があり、lightgbmのソース読んでいた所、
pandas DataFrame をデータに渡した時は
内部で np.float32 にキャストするのを見つけた。
https://github.com/microsoft/LightGBM/blob/877d58fac74731a5feba8d6ca3bb0cc97d154eb0/python-package/lightgbm/basic.py#L399-L400

なので lightgbm & pandas コンビを使う場合、
pandasデータ型はカテゴリ・文字列以外は何も考えず
全部 float 型にして良さそうにみえる。
（「この変数はint型にしよう」とか考えなくて良さそう）
create-react-appのbaseUrlには.を指定できるが、src以外はインポートできない

baseUrlに.をセットして意気揚々と`import {XXX} from 'xxx/xxx';`を試みたが、ダメだった。
この[Issue comment](https://github.com/facebook/create-react-app/issues/6850#issuecomment-537865365)にある通り、create-react-appはv3.2.0からbaseUrl: '.'を使用できるようになったが、src/から始まるパスしかインポートできない制限がある。
なんてこった…。
Catalinaデフォルトのphthonでtkinterが動かない

#Catalinaにデフォルトで入っていたpython3.7でtkinterが動かなかったので対処方法のメモ

以前使っていたmacで動いていたpythonコードを実行すると、下記のエラーがでて、動きませんでした。

```
import _tkinter # If this fails your Python may not be configured for Tk
ModuleNotFoundError: No module named '_tkinter'
```

tkinterがないと。。。どういうこと？？？pyenvをいれるのが面倒で、デフォルトで入っていたpython3.7を使っていましたが、調べてもデフォルトで入っているpythonの情報がなく、どうしようもないのでpyenvをいれることにしました。

##1.pip3でインストールしたパッケージを書き出し
```
$ pip3 freeze > packages.txt
```


##2.pyenvを入れる


```
brew install pyenv
```

##3.zshrcに下記を記入
viでzshrcを開いて、

```
vi ~/.zshrc
```
下記を追加

```
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"
```

##4.python3.7.3をインストール
デフォルトで入っていたバージョンと同じものをインストール

```
pyenv install 3.7.3
```

##4.バーションを切り替える
```
pyenv global 3.7.3
```

でバージョンを切り替えるが、反映されず。。。
[ここ](https://qiita.com/1234224576/items/11ad3509fe4b0a9a33ed)を参考にして、なぜかホームディレクトリにあった.python-versionファイルを削除して、もう一度globalで書き換えるとうまくいきました。

##5.パッケージを復元

```
$ pip3 install -r packages.txt
```

これでtkinterも動きました。
Marked.jsはハッシュのあとにスペースがないと見出しにならない

「[簡単なMarkdownエディタを作る](https://qiita.com/opengl-8080/items/56b4b6a9d31bac0cb3e2)」を参考にMarkdownエディタを作成したのですが、現行バージョンの`Markdown.js`では、`#`のあとにスペースがないと見出しとして認識されませんでした。気になって経緯と対策を調べたのでシェアします。

##現象
QiitaのMarkdownエディタは、`#`のあとにスペースがあろうとなかろうと、見出しとして認識してくれます（`##`, `###`も同様）

```markdown
#見出しになる
# 見出しになる
```
ですが、現行バージョン(1.1.0)の`Marked.js`は`#`のあとにスペースがないと、見出しとして認識してくれません。

```html
<div id="content"></div>
<script src="https://cdn.jsdelivr.net/npm/marked/marked.min.js"></script>
<script>
  document.getElementById('content').innerHTML =
    marked('#見出しにならない');
</script>
```

##`#`のあとにスペースが必要になった経緯
`Marked.js`バージョン0.3.2以前は、`#`のあとにスペースがあってもなくてもよかったみたいですが、

- GithubのMarkdownエディタと挙動が異なる
- GFM(GitHub Flavored Markdown)のマニュアルにはあくまでも`#(スペース)見出し`と書かれている

という主張が入り、議論はあったものの、修正されたようです。

https://github.com/markedjs/marked/issues/201

## `#`のあとにスペースがないことを許可するには
`Marked.js`では、正規表現を使ってMarkdown記法を自分で定義することができます。`Marked.js`を読み込んだあと、`marked()`を使用するより前に以下のように記述します。

https://marked.js.org/#/USING_PRO.md#tokenizer

```javascript
const tokenizer = {
  heading(src) {
    const match = src.match(/^ {0,3}(#{1,6}) *([^\n]*?)(?: +#+)? *(?:\n+|$)/);
    if (match) {
      return {
        type: 'heading',
        raw: match[0],
        depth: match[1].length,
        text: match[2]
      };
    }

    // return false to use original codespan tokenizer
    return false;
  }
};
marked.use({ tokenizer });
```

以上です。
react: stateの共有 (props無し、redux無し)

### 方法
1. useStateをモジュールに切り分ける。(下記appMode.tsの、function useAppMode参照)
2. 一番外側のコンポーネントで、モジュール化されたuseState（下記のfunction useAppMode）を呼ぶ。
3. 以後、任意のコンポーネントで、ステート（下記appMode.tsの mode）、ステートのsetter（下記appMode.tsのsetMode）が参照可能となる。

```.typescript:appMode.ts
import { useState, Dispatch, SetStateAction } from 'react'

export enum AppMode {
  home,
  write,
  read,
}

export let mode: AppMode
export let setMode: Dispatch<SetStateAction<AppMode>>

export function useAppMode() {
  ;[mode, setMode] = useState(AppMode.home)
}
```

### 例

- appMode.ts
- app.tsx

    - home.tsx
    - write.tsx
    - read.tsx


```.tsx:app.tsx
import {
  isHomeMode,
  isWriteMode,
  isReadMode,
  useAppMode,
} from '../logic/appMode'
import { Reader } from '../components/reader'
import { Writer } from '../components/writer'
import { Home } from '../components/home'

export default () => {

  useAppMode() // モジュール化したuseStateを呼び出し

  return (
    <div id="app">
      {isHomeMode() ? <Home></Home> : null} // stateをgetterで参照
      {isWriteMode() ? <Writer></Writer> : null}
      {isReadMode() ? <Reader></Reader> : 
    </div>
  )
}
```
```.tsx:home.tsx
import { setWriteMode } from '../logic/appMode'
import { setReadMode } from '../logic/appMode'

export const Home = () => (
  <div>
    <button onClick={() => setWriteMode()}>Write</button>
    <button onClick={() => setReadMode()}>Read</button> // stateのsetterを呼び出し
  </div>
)
```
```.typescript:appMode.ts
import { useState, Dispatch, SetStateAction } from 'react' 

enum AppMode {
  home,
  write,
  read,
}

let mode: AppMode
let setMode: Dispatch<SetStateAction<AppMode>>

export function useAppMode() {
  ;[mode, setMode] = useState(AppMode.home)
}

// getter setter (※不要。上記、mode, setMode, AppModeをexportすればよい。可読性と保守性にメリット。)
export function isHomeMode(): boolean {
  return mode == AppMode.home
}
export function isWriteMode(): boolean {
  return mode == AppMode.write
}
export function isReadMode(): boolean {
  return mode == AppMode.read
}
export function setHomeMode(): void {
  setMode(AppMode.home)
}
export function setWriteMode(): void {
  setMode(AppMode.write)
}
export function setReadMode(): void {
  setMode(AppMode.read)
}
```
DockerでMongoDBコンテナ起動時に初期データをインポートする

# はじめに
DockerでMongoDBをコンテナを立ち上げ、データを確認するまでの最小限の構成になります。
## やりたいこと
- コンテナ作成時に初期データを投入したい
- 投入したデータをGUIクライアントで参照したい

## ディレクトリ構成
```
.
├── docker-entrypoint-initdb.d
│   ├── 1-mongo-init.js
│   ├── 2-mongo-init.sh
│   └── staffs.json
└── docker-compose.yml
```
# 各ファイルの内容
## docker-compose.yml
「MONGO_INITDB_DATABASE」に指定した名称でデータベースが作成されます。

```docker-compose.yml
version: '3.3'

services:
  mongo:
    image: mongo
    container_name: mongo
    restart: always
    environment:
      MONGO_INITDB_ROOT_USERNAME: mongo
      MONGO_INITDB_ROOT_PASSWORD: mongo
      MONGO_INITDB_DATABASE: mongo_example
      TZ: Asia/Tokyo
    ports:
      - 27018:27017
    volumes:
      - ./docker-entrypoint-initdb.d:/docker-entrypoint-initdb.d
```

## docker-entrypoint-initdb.d/1-mongo-init.js
ユーザの作成と合わせて、コレクションの作成をしています。
ここでは例としてstaffsコレクションを作成します。

```javascript:docker-entrypoint-initdb.d/1-mongo-init.js
var user = {
  user: "mongo",
  pwd: "mongo",
  roles: [
    {
      role: "dbOwner",
      db: "mongo_example"
    }
  ]
};

db.createUser(user);
db.createCollection('staffs');
```

## docker-entrypoint-initdb.d/2-mongo-init.sh
作成したユーザ、パスワード、データベース、コレクションと、インポートするJSONファイルを指定します。

```sh:docker-entrypoint-initdb.d/2-mongo-init.sh
mongoimport -u mongo -p mongo --db mongo_example --collection staffs --file /docker-entrypoint-initdb.d/staffs.json --jsonArray
```

## docker-entrypoint-initdb.d/staffs.json
staffsコレクションにインポートするデータをJSONファイルで用意します。

```javascript:docker-entrypoint-initdb.d/staffs.json
[
	{
		"id" : 1,
		"name" : "佐藤"
	},
	{
		"id" : 2,
		"name" : "鈴木"
	},
	{
		"id" : 3,
		"name" : "田中"
	}
]
```

#実行
docker-composeで起動します。

```
$ docker-compose up -d
Creating network "mongodb_default" with the default driver
Creating mongo ... done
```

#GUIクライアントで確認する
## 1. MongoDB Compassをダウンロード
[MongoDB Compass](https://www.mongodb.com/try/download/compass)からPlatformを選択しDownloadボタンをクリックします。

## 2. 接続
Paste your connection stringに以下の接続情報を入力し、CONNECTボタンをクリックします。

```
mongodb://mongo:mongo@localhost:27018
```

<img width="1392" alt="スクリーンショット 2020-07-13 1.31.20.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/672074/fb08df9e-46bd-6d20-505d-be1082d61c41.png">

## 3. 結果
staffコレクションにデータをインポートできていることが確認できます。

<img width="1392" alt="スクリーンショット 2020-07-13 1.51.39.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/672074/38e348ca-175a-6351-4a31-1dcc62322b51.png">
（Linux初心者）魔法の言葉auxとは

# とりあえず使ってたけど、auxコマンドの意味とは

## 例題： ps aux | grep puma

以下、分解して見ていく。

まず、grepは特定の文字列を含むコマンドを検索したいときに使用する。

```
コマンド | grep　検索したい文字列
```

コマンドを詳しく見てみる。

```
ps ・・・　自分のプロセスを簡単に表示
aux・・・　a、u、xオプションの組み合わせ
aオプション・・・ すべてのユーザーのプロセスを表示する
uオプション・・・ 各プロセスの実行ユーザーやCPU, メモリ等の情報も表示する
xオプション・・・ 端末を持たないすべてのプロセス(daemonなど)を表示する
```
daemon（デーモン）・・・バックグラウンドで動作するプロセス。コンピュータを使ってる人に見えない裏側で動作するもの。

要するにauxにすることですべての種類のプロセスの知り得るだけの情報がすべて網羅される。
## 解答　ps aux | grep pumaとは

```
【意味】pumaを含むコマンドの知りうる情報を全て表示する
```
つまり、迷ったらauxは間違いではなかった。
Haml renderの方法など

直に書きたくないので、modulesフォルダー作成。entrance.scssを入れます。
stylesheets>modules>entrance.scss

その後、忘れずに下のように記入。

```ruby:application.scss
 @import "modules/entrance";
```

次は
views>sharedに_1.html.hamlを作成。
※ `_1`という書き方でレンダーを意味します。

```ruby:views>entrance>index.html.haml
.warapper
  = render "shared/1"
```

その後

```ruby:stylesheets>1.scss
.oil {
  font-size: 30px;
}
```

```ruby:application.scss
 @import "modules/entrance";
 @import "1";
```

localhost:3000

30pxでeatsと表示されれば完成です！
URLの構造(スキーム、ホスト、パス、クエリー)について改めて理解する

# はじめに
**URL**(Uniform Resource Locators)とは、ウェブページ等の**リソースの場所と通信方法を表したもの**です。誤解を恐れず簡単にまとめると、**インターネット上での住所**、というところでしょうか。

URLは、**RFC**（Request for Comments）と呼ばれるインターネット上の技術に関する仕様書の、1738番目[(RFC1738, 日本語訳)](http://pentan.info/doc/rfc/j1738.html)で定義されました。

普段何気なく目にするURLですが、「インターネット上における住所」というふわっとした理解のままだったので、今回の記事ではこの**URL**の構造について、簡単に整理してみました。

# シンプルなURLの構造
一般的によく見るシンプルな作りのウェブページのURLは次の形式のようになっています。
(URL例:[爆速表示で知られる俳優・阿部寛のウェブページのURL](http://abehiroshi.la.coocan.jp/))

```:URL
http://abehiroshi.la.coocan.jp/index.html
```

URLの記述にはルールがあり、そのルールに沿って先ほどのURLを分解すると、以下のような要素に分かれます。

**スキーム | ホスト名 | パス**

では、それぞれの項目について順に見ていきます。

## スキーム
<font color="LimeGreen">**http**://</font>abehiroshi.la.coocan.jp/index.html

**スキーム**には、そのリソースにたどり着くまでの**手段**(通信プロトコル)が含まれています。
よく見るものとしては**http**、TLS/SSLによって通信経路が暗号化される**https**などがあります。

Chromeなどのブラウザはこのスキームを見て、適切な接続方法を選択します。

## ホスト名
http://<font color="LimeGreen">**abehiroshi.la.coocan.jp**</font>/index.html

**ホスト名**には、リクエスト先のサーバの名前が入ります。ホスト名はドメイン名とも呼ばれ、ネットワーク上での識別のために使われます。

[ドメイン名とは何ですか？(MDN web docs)](https://developer.mozilla.org/ja/docs/Learn/Common_questions/What_is_a_domain_name)

## パス
http\://abehiroshi.la.coocan.jp<font color="LimeGreen">**/index.html**</font>

**パス**には、ホスト名で指定されたサーバーのリソースへのパスが入ります。
今回の例では、`/index.html`というように、明示的にリクエスト先のサーバーの物理的なファイルを指定しました（トップがindex.htmlだとわかっていたため）。

現在ほとんどのサーバーが一番上の階層にリクエストがきた場合、何らかのリソースを返す処理を実装しているため、別に`/index.html`と書かなくても、

**http\://abehiroshi.la.coocan.jp/**

と書くだけで、上記の例と同じリソースにアクセスできます。

最近では、パスは**物理的な**ディレクトリ構造とは関係のない、サーバーによって返される**抽象的なパスになっていることがほとんど**のため、直接ファイル名を指定する方法はあまりないかもしれません。

# クエリーを含んだURLの構造

## クエリー
クエリーを含んだウェブページのURLは次の形式のようになっています。
(URL例:[Qiitaで@sho-hataが書いた記事を検索した結果](https://qiita.com))

https\://qiita.com/search<font color="LimeGreen">**?q=user%3Asho-hata**</font>

クエリーは検索用語を指定したり、表示したいウェブページに対して何らかのパラメータを付与するのに使います(Real World HTTPより)。

**?**の後ろに、**[キー]=[値]**という形で渡します。[キー]=[値]のペアが複数になる場合は&記号を使います。

### エンコーディング
キーと値に使える文字種は限定されており、URLエンコーディングで変換されています( : → %3A)。

URLを構成する文字はASCII文字列とされていたため、日本語などは扱うことができませんでした。
しかし、[RFC2718](http://pentan.info/doc/rfc/j2718.html)ではUTF-8で日本語をURLエンコーディングすることで、日本語を扱えるようになっています。

凡例：
http\://example.com/<font color="LimeGreen">書誌情報</font>

↓

http\://example.com/<font color="LimeGreen">%E6%9B%B8%E8%AA%8C%E6%83%85%E5%A0%B1</font>

これらは最近ではデコードされて、日本語がそのまま表示されるようになっています。

例：**amazonで「リアルフォース」を検索した結果**
https://www.amazon.co.jp/s?k=%E3%83%AA%E3%82%A2%E3%83%AB%E3%83%95%E3%82%A9%E3%83%BC%E3%82%B9&__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&ref=nb_sb_noss_1

↓


https://www.amazon.co.jp/s?k=%リアルフォース&__mk_ja_JP=カタカナ&ref=nb_sb_noss_1

# まとめ
**URL**の構造について、簡単に整理してみました。
改めてURLについて勉強すると、Webが抽象化の一途を辿ってきたことがとてもわかります。
今でこそ当たり前になっていますが、リクエストする側がリクエスト先の物理的なディレクトリ構造や、拡張子のことを意識せずにアクセスできることは、抽象化による恩恵だったんですね（すごい）

RFCを読んでみるなど、ネットワークの歴史についてたまにはゆっくり勉強するのも楽しいですね。

# 参考文献
- [MDN URLとは何か](https://developer.mozilla.org/ja/docs/Learn/Common_questions/What_is_a_URL)
- [Real World HTTP 歴史とコードに学ぶ　インターネットとウェブ技術](https://www.oreilly.co.jp/books/9784873119038/)
- [RFC](https://www.ietf.org/rfc/)
効果検証入門 4・5章をPythonで書く

# はじめに

[効果検証入門 ～正しい比較のための因果推論／計量経済学の基礎](https://gihyo.jp/book/2020/978-4-297-11117-5)内のソースコードをPythonで再現します。

既に[素晴らしい先人の実装例](https://qiita.com/nekoumei/items/648726e89d05cba6f432)がありますが、自分の勉強用のメモとして残しておきます。

この記事では、4・5章について記載します。
コードは、[github](https://github.com/calderarie/cibook-python)にも掲載しています。
なお、変数名や処理内容は、基本的に書籍内に寄せて実装します。


# CausalImpact

ここでは、[pycausalimpact](https://github.com/dafiti/causalimpact)を使って実装する。
R版と結果が一致しないが、これはREADMEに書いてある通りで、扱っている手法が異なるからみたい。
引数の`model`で状態空間モデルを指定することができるようだが、R版と実装を合わせるのは骨が折れそうなので断念。

```python:CausalImpact
from causalimpact import CausalImpact

impact = CausalImpact(CI_data, pre_period, post_period, prior_level_sd=None)

impact.plot()
print(impact.summary())
```

# RDD
非線形回帰分析は、以下のようなモデルを学習し、介入変数の効果量を参照すれば良い

$$ Y = \beta_0 + \beta_1 f_1(X-c) + \beta_2 f_2(X-c) + \rho Z + \epsilon $$

```python:RDD
from sklearn.preprocessing import PolynomialFeatures

degree = 4
X = nonlinear_rdd_data[['history_log']]
X = X - cutpoint
X_poly = PolynomialFeatures(degree=degree, include_bias=False).fit_transform(X)
X_poly = pd.DataFrame(X_poly, columns=[f'X{i+1}' for i in range(X_poly.shape[1])])
nonlinear_rdd_data = pd.concat([nonlinear_rdd_data, X_poly], axis=1)

nonlinear_rdd_ord4 = ols('visit ~ treatment + X1 + X2 + X3 + X4 + treatment:X1 + treatment:X2 + treatment:X3 + treatment:X4', data=nonlinear_rdd_data).fit()
```

# 関連

- [「効果検証入門」をPythonで書いた](https://qiita.com/nekoumei/items/648726e89d05cba6f432)
- [GitHub - dafiti/causalimpact: Python Causal Impact port of Google's Algorithm. ](https://github.com/dafiti/causalimpact)
HAMLの書き始め ーHamlでlocalhost:3000に表示ー

1

```ruby:rites.rb
  root to: 'entrance#index'
```

2

```ruby:Gemfile
gem 'pry-rails'
gem 'mini_racer'
gem 'haml-rails'
```


3

・忘れずに、`bundle install`。
・`rails haml:erb2haml`で.erbファイルをHamlに変換、yかnを聞かれるので、yで.erbファイルを削除。
・`rails db:create`でデータベースを作成しておく。
これをやらないとActiveRecord::NoDatabaseError (Unknown database 'oil_development'):
と、データベースがありませんというエラーが出てしまいます。


4

```ruby:application.scss
@import "entrance.scss";
```


5

```ruby:entrance>index.html.haml
.oil
  eats
```

これで、localhost:3000に行くとhamlでeatsの文字を表示させる事ができます。
WPF on .NetCore で工数管理アプリを作りました

![capture_main.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77732/2be4a6aa-c9c8-433a-aeb8-10ab9967922c.png)

2021/01/31追記
.Net5へ移行しました（[関連記事](https://qiita.com/ambleside138/items/8fef9a804d0cabdd8259)）

## 作成した経緯
ぼくの職場では、月毎に作業工数を記録して提出する必要があります。
一応入力ツールがあるにはあるのですが、

- きっちり30分毎にしか入力できない（10:00～10:30まではなにしてた、とか）し、入力自体も手数が多くて手間
- UIが古きよき感じ...
- エクスポート形式が提出フォーマットと異なるので手作業が手間

などなど、いろいろ不満がありました。
最新の技術/ライブラリを使ってなにかプロダクトを作ってみたかったのと、新型コロナの影響でおうち時間が増えたのもあり、この不満を解消すべく「ぼくのかんがえた最強」の工数管理アプリを開発してみました。

## プロダクト

ソースはこちら → [GitHub](https://github.com/ambleside138/TimeRecorder)
実際に触ってみたい方はこちらからどうぞ → [ダウンロード](https://github.com/ambleside138/TimeRecorder/releases/tag/ver0.009.001.001)
※Win10 64bit版のみ用意してます。それ以外の環境の場合は各自でビルドしてください。

＃いくつかの入力項目はDBでのマスタ管理となっています。マスタメンテナンス用のUIは用意できていないため、DBを直接編集するかデモ用のファイルを利用ください。→[デモ用DBファイル](https://github.com/ambleside138/TimeRecorder/tree/develop/demo)

### 特徴
1. 最小の手数でタスクの入力・切り替えが可能
ボタン１発で記載・切り替えができる（詳細は使い方で
＃仕事中って自分のペースで開発できるわけではなく、急に保守作業が入ったりしますよね

2. MaterialDesignを採用
オシャレなほうがモチベーションあがりますよね

3. 提出用のフォーマットで出力可能
工数を標準化して集計したうえで必要なフォーマットに特化してCSV化。
CSVをエクセルにコピペドンで工数表を提出可能に！

### 使い方
基本的な考え方（流れ）は

1. タスクを登録する
2. 作業開始時に１で登録したタスクを開始
3. 作業終了時にタスクを終了
4. １～３を繰り返す
5. タスクの作業がすべて終わればタスク完了
6. １ヶ月おきに集計結果をCSV出力


となります。

##### タスクの新規入力
画面右下の追加ボタンから、タスクの分類、タイトル名などなど記載して登録できます。
登録したタスクは繰り返し利用できます。
![add_newtask.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77732/44a5e220-e5c9-97e5-7bbd-bcd718480e5a.gif)

##### ショートカットからタスク追加
あらかじめよく行う作業のテンプレートを登録しておけばボタン１発でタスクの登録＋開始が可能です。
![quick_newtask.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77732/b3600423-ade2-13c5-a58c-5773a257780a.gif)

##### カレンダーからタスク追加（インポート）
Googleカレンダーに打ち合わせなどの予定が登録されている場合は自動で取込むことができます。
予定時刻になれば自動でタスクが開始・終了されます。
＃別途設定ファイルの用意が必要になります。需要がありそうだったら解説記事書くかもです。

##### タスクの完了
すべての作業が終わればチェックボックスをクリックしてタスクを「完了」します。
＃この時点でタスクのカードは非表示となります
![complete.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77732/c5de14ef-466c-513b-e50a-832e0746c391.gif)


##### 工数の集計、CSV出力
出力対象年月を選択してボタン１発でCSV出力可能。
![export_csv.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77732/91a67df2-0411-1f91-fb4f-2a5ad6439907.gif)


### 開発環境
- Win10 64bit
- VisualStudio 2019 Community
- 言語：C#
- .Net Core 3.0
- プレゼンテーション層：WPF
- 永続化層：SQLite

### 開発期間
５月のGWくらいから開発に着手しました。
その後は週末を中心に作業しており、およそ２ヶ月で一通り動くようになりました。

## まとめ
このアプリを使うようになって、速く＆楽に工数管理ができるようになりました。

仕事だといろんな制約があって開発手法やライブラリを自由に選ぶことが難しいケースが多いですが、今回好きなようにできたのでとても楽しい開発ライフを送れました。後日、利用したライブラリとかDDDの話とかも記事にしたいと思ってます。
→技術解説編を記事にしました（[こちら](https://qiita.com/ambleside138/items/8c451e7d56c029e32740)）

＃WEBアプリだとオシャレなアプリの事例がたくさんあるんですが、ネイティブではなかなか少ない印象の今日このごろ。デスクトップアプリでもこんなアプリができるんだぞ～という事例の１つになればいいなぁ

##### 編集履歴
- 2020/07/14　誤字修正。アプリの使い方について追記。
- 2020/07/19　[技術解説編](https://qiita.com/ambleside138/items/8c451e7d56c029e32740)の記事リンクを追加
- 2021/01/31　[.Net5移行＆単一ファイルアプリ化](https://qiita.com/ambleside138/items/8fef9a804d0cabdd8259)の記事リンクを追加
ビルド時間が10倍の工数を奪う

※『[「単体テストが面倒くさい」に立ち向かう ―5つの弾丸](https://qiita.com/CodeOne/items/f448c973e0bdbad04b52)』のおまけとして追記しようと思ったのですが、少し長くなったので単独記事としました。

# 現場から

実装できた。
さあ、ビルド！
待たされる。

単体テストまたNG。
直して再試行。
ビルド待たされる。

テストチームから不具合の指摘。
修正した。
ビルド（＋単体テスト実行）が終わるまでお待ちください。

# 改善したい

ビルド時間が長いと開発のペースが乱されます。
集中力、意欲が削がれます。
戻すのに時間がかかります。
できればテンポよく進めていきたいものです。

# 改善しましょう

プロジェクトが構造的なリファクタリングを許す段階にあり、自分が改善を提案できる立場にあるなら[^1]、ビルド高速化を積極的に検討しましょう。

たとえば、

- 開発PCのスペック（メモリ／CPU）を上げる。
    - 私の開発環境ははこれでかなり改善しました。ソースコード検索も速くなります。
    - メモリを8GBから16GBに上げることで、7分が2分に短縮されたという[改善例](https://rimever.hatenablog.com/entry/2019/01/12/073000)があります。
- なんとなく、あるいは[テストのためだけに public にする](https://qiita.com/CodeOne/items/352a88901a33d0074230#%E3%83%86%E3%82%B9%E3%83%88%E3%81%AE%E3%81%9F%E3%82%81%E3%81%A0%E3%81%91%E3%81%AB-public-%E3%81%AB%E3%81%99%E3%82%8B)のをやめる
- ソースプロジェクト（ビルド単位）を分ける
- デッドコードを削除する
- コードクローンを除去する
- 埋め込みリソースを多用している場合は外部リソース化を検討する。
- ビルドツールを並列実行させる（[MSBuild 例](https://docs.microsoft.com/ja-jp/visualstudio/msbuild/building-multiple-projects-in-parallel-with-msbuild)）
- ビルド高速化ツールを導入する
    - [IncrediBuild](https://www.incredibuild.co.jp/) は無料版でも効果を発揮しました。古いIDEですが、特にVS2008では効果があり、6分かかっていたのが2分弱になりました。
- 実行時間の長い単体テストを見直す
- ソースコードのある作業フォルダをアンチウィルスソフトの検疫から除外する

など。

そこにコストを費やす価値は十分にあります（後できっとおつりがきます）。
プログラマを増員するよりも、今いるプログラマの力を無駄にしない工夫が先でしょう。

[^1]: すべてのプログラマがそうあるとよいのですが。