OmniAICreator/Qiita-1.07M huggingface dataset:
Gitでアカウントを切り替えて作業する方法（sshを使用するパターン）


```bash

# キーの作成
ssh-keygen -t ed25519 -C email@example.com -f id_ed25519_email
chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_ed25519_email

### この時点で、作成した公開キーをgithub側に登録する

# sshで使う時のキーの設定
tee -a ~/.ssh/config <<'EOF' >/dev/null
Host github_email
HostName github.com
User git
IdentityFile ~/.ssh/id_ed25519_email
IdentitiesOnly yes
AddKeysToAgent yes
EOF

# connect check!!
ssh -T -i ~/.ssh/id_ed25519_email github_email

# git clone
### git clone git@github:daijinload/test.git
git clone github_email:daijinload/test.git

# local account設定
git config --local user.name email
git config --local user.email email@example.com

### optional
# alias git-change-account-email='git config --local user.name email && git config --local user.email email@example.com'

```

一応、こんな感じでいける。

会社のアカウントと、個人アカウントを切り替えたい時などに使うと良いかと。

他にも色々と手があるみたいだが、この方法だと、

* cloneするときだけ意識すれば良い
* そこまで面倒なセットアップじゃない

ので、このくらいで良いかと。

切り替えたいaccountを、aliasにでも登録しておけば、clone時にセットするのが多少楽になるかと。
[超入門]Rubyにおけるシンボルについて

railsやRubyと学習を初めてから１ヶ月がたちました。
まだまだ理解できてないところも多々あるので、今回もその記録として投稿します。

さて今日は、「プロを目指すためのRuby入門編」のシンボルを使った、
単位変換プログラムを作成中に少しおや？となったシンボルについてまとめました！

###シンボルについてとその使い方について

**・シンボルは文字列の変わりに使用することもあるが、文字列と同じオブジェクトとは限らない**
**・同じシンボル同士は同じオブジェクト**

ざっくりこんな感じでしょうか。

また、定義の仕方としては、
   
       :シンボル名
       :example => "example" と表すことも可能

また大きな違いとしては、
**シンボルは内部的には整数で処理されており、イミューダブルなオブジェクト。破壊的変更が効かない。**


###ハッシュのキーでの使用

基礎的なところは改めて整理できたので、次はハッシュ内での使用のされ方について。

     examples = { :a => "aaa", :b => "bbb", :c => "ccc"}
     examples = { a: "aaa", b: "bbb", c:"ccc"} #上記を省略した形
     
     example[:a] => #"aaa"を呼び出し
     
     全てシンボルに変更も可能

     examples = { :a => :aaa, :b => :bbb, :c => :ccc}


ハッシュのキーにはシンボルが適しているので、大体は「シンボル：値」と表されるよう。
（イミューダブルな性質や処理速度の等の関係から）

###キーワード引数での使用

最後にキーワード引数時の使用に関して。
基本は上記と同様、「シンボル：値」で問題はなし。


          def example_length(length, from: :m, to: :m)
           units =  { m: 1.0, ft: 3.28, in: 39.37}
    　　    (length / units[from] * units[to]).round(2)  #=>unitsハッシュのFromキー（ここでいうm：）の値と同じくtoキーを呼び出している。
          end


以上、本当初心的なところにはなりますがわかっている気でいるのが一番怖いので、
今後も手を動かしながら引っかかったところはこのように自分なりに整理をして行きたいです。
Djangoでメール送信

# はじめに

ここでは、Djangoでメール送信をする方法について解説していきます。
お問い合わせフォームの作成などに使うことができます。

# デフォルトの設定

まず、`settings.py`にメール関連の設定を記述します。
以下は、Gmailを用いる場合の例です。

```python:settings.py
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_HOST_USER = 'sample@gmail.com'
EMAIL_HOST_PASSWORD = アプリ用のパスワード
EMAIL_PORT = 587
EMAIL_USE_TLS = True
```

# メールの件名や宛先の設定

ここでは、お問い合わせフォームで
`forms.py`にメール送信用の関数を定義します。

```python:forms.py
from django import forms
from django.conf import settings
from django.core.mail import BadHeaderError, EmailMessage
from django.http import HttpResponse


def send_email(self):
        subject = 'お問い合わせ：' + self.cleaned_data['title']
        name = self.cleaned_data['name']
        email = self.cleaned_data['email']
        from_email = '{name} <{email}>'.format(name=name, email=email)
        message = self.cleaned_data['body']
        recipient_list = [settings.EMAIL_HOST_USER]
        email_message = EmailMessage(subject, message, from_email, recipient_list, reply_to=[email])
        try:
            email_message.send()
        except BadHeaderError:
            return HttpResponse('無効なヘッダが検出されました。')
```

`EmailMessage`インスタンスを作成するところの、`reply_to`を設定しないと、問い合わせをした人のメールアドレスが分からずメール返信で回答できなくなってしまうので、忘れず入れるようにします。

# まとめ

ここでは、Djangoでメール送信をするときに必要な設定について解説しました。
お問い合わせフォーム以外にも応用できます。
GitHubのForkとPull Requestについて簡潔に説明してみた

#はじめに
Gitでは登場しない、
GitHub特有のForkとPull Requestについて説明します。
Forkを説明する際、cloneとの違いを出してくる解説がありますが
「なぜcloneではなくforkでないといけないのか」といった部分についても触れます。
それが分かるとより理解しやすくなると思います。


##Forkを一言でいうと
**他の人が作成した(リモート)リポジトリを、
自身の(リモート)リポジトリに複製すること**

ForkしたリポジトリをローカルにCloneして、作業を行います。
流れを図1に表しました。

**【図１】**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637726/b028d66d-b1f4-4356-e2e4-de1f3e788934.png)




##Forkってなんで必要なの？
Forkの説明で、「他の人が作成したリポジトリを直接Cloneすればいいだけでは？」と
思った方がいると思います。
ここが、Forkを使う理由に繋がっています。

**GitHubのデフォルトの設定では、
他の人が作成したリポジトリに対してPushする権限がありません。**
(GitHubの設定で、作成者が他の人にPush権限を与えることも可能ですがここでは触れません。)

ローカルで編集したソースを自由にPushするためにForkを使うのです。


##Pull Requestを一言でいうと
**自身の(リモート)リポジトリを、
他の人が作成した(リモート)リポジトリに
Pushしたいです(=Pullして下さい)と提案(通知)すること**

Fork～Pull Requestの流れを図2に表しました。
オレンジの部分が図1に追加で記載した箇所です。


**【図2】**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637726/969061ec-8e7a-f436-1ebe-d6a7c9175c12.png)


##Pull Requestってなんで必要なの？
この理由は至ってシンプルです。
第3者が相手の許可なしに勝手に変更すると、相手が困るからです。
**「変更した内容をあなたのリポジトリに反映したいのですが、宜しいですか？」と
伺いを立てる必要があります。**


#まとめ

・Forkを1言でいうと
　他の人が作成した(リモート)リポジトリを、
　自身の(リモート)リポジトリに複製すること

・Pull Requestを1言でいうと
　自身の(リモート)リポジトリを、
　他の人が作成した(リモート)リポジトリに
　Pullして下さいと相手に提案(通知)すること
PHPの基本を振り返る

この記事は以下の書籍を参考にして執筆しました。

- [独習PHP 第3版](https://www.amazon.co.jp/dp/B01FH3KVNU/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)


#PHPの基本構文
##新規コード作成
```php5
<!DOCTYPE html>
<html>
<head>
<meta charaset="UTF-8" />
<title>PHP基本</title>
</head>
<body>
<?php
print 'hello world';
?>
</body>
</html>
```
>出典：[独習PHP 第3版](https://www.amazon.co.jp/dp/B01FH3KVNU/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)より

phpを記載する上でで登場する`<?php ?>`のことを**スクリプティングデリミタ**というみたいです。PHPタグとも言います。

##作成したスクリプトの保存
保存での注意点は文字コードを**UTF-8**、改行コードを**LF**に指定する点です。
現時点では文字コードについて十分な知識がないので、こういうものだと思って進めていきます。

#拡張子は「.php」が基本
いまMAMPを利用していますが、Apacheは拡張子が**.php**であるファイルが要求されたタイミングでPHPの実行エンジンを起動します。**Apacheの設定をいじれば拡張子を自由に変更できます。**

#文字コードの設定
|用語|説明|
|---|---|
|文字コード|文字に割り当てられたコード|
|文字エンコーディング|実際の文字との対応関係のこと|

サーバからクライアントにデータを送信するとき、文字列を内部的に**エンコード(符号化)**してクライアント側で**デコード(復号化)**します。

#PHPはインタプリタ言語
インタプリタとは逐次処理という意味です。
インタプリタの反対としてコンパイルがあります。

コンパイルは人間が入力したコード(**ソースコード**)をコンパイラと呼ばれるソフトで**コンパイル**(一括翻訳)してコンピュータが理解できる形に変換することです。
コンパイル言語としてC言語が挙げられます。

つまり、インタプリタは翻訳と実行を同時に行い、
コンパイル言語は翻訳と実行が別々といったところでしょうか。

コンパイラ言語のメリットは実行速度ですが、PHPはバージョンを重ねるごとにパフォーマンスが向上しているので、過度に気にすることはないだろうとのことです。

#PHPはHTML埋め込み型言語
PHPではHTMLコードの中にスクリプトブロックを埋め込みコードを記載できます。

末尾でが.phpファイルである場合は、`?>`を省略できます。
終了タグがあって、後ろに改行や空白があると、
これがブラウザに表示されてしまって、レイアウトが微妙にずれるという
アクシデントを招く場合もあるので注意です。

###`?>`がある場合
```php5
<?php
print 'hello world';
?>
□□□
```
>出典：[独習PHP 第3版](https://www.amazon.co.jp/dp/B01FH3KVNU/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)より

出力 `hello world□□□`

###`?>`がない場合
```php5
<?php
print 'hello world';
□□□
```
>出典：[独習PHP 第3版](https://www.amazon.co.jp/dp/B01FH3KVNU/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)より

出力`hello world`

`?>`がない場合で□(空白)が表示されないのは`<?php〜?>`の中であるためです。

以上から**ファイル末尾の閉じタグは省略すべきです**。

##省略構文
`<?php print '~';`という記載を省略できる省略構文なるものがあります。
`<?php~?>`の代わりに`<?=~?>`を使用します。

```php5
<?php
print 'hello world';
```
>出典：[独習PHP 第3版](https://www.amazon.co.jp/dp/B01FH3KVNU/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)より

を書き換えると

```php5
<?='hello world'?>
```
>出典：[独習PHP 第3版](https://www.amazon.co.jp/dp/B01FH3KVNU/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)より


になります。

その他デリミタには以下のような種類があります。

1. `<?~?>`
2. `<%~%>`
3. `<%=~%>`
4. `<acript language="php">~</script>`

PHP7では2.~4.のデリミタは記述が冗長である、標準の設定は動作しないなどの理由から消去されています。
使用するのであれば`<?~?>`か`<?=?>`を使用しましょう。

#参考文献

- [独習PHP 第3版](https://www.amazon.co.jp/dp/B01FH3KVNU/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)
Rails5.2以降のCredentialsについてのメモ

## 例えていうならば
- config/credentials.yml.enc
↓
プロジェクト内の秘密の情報を保管するための金庫

- confif/master.key
↓
その金庫を開けるための鍵

## ポイントとなるのは`config/master.key`
　production環境でアプリを利用する場合、`production環境で使われる秘密情報(暗号化されているもの)を元データに復元するために利用する鍵`が必要(元データに復元することを復号)

この鍵は、Rails5.2以降はconfig/master.keyファイルとして管理されている(自分でrails newした場合)


## production環境用の秘密情報の管理
* Rails5.1までは秘密情報を環境変数でアプリに伝える方法がとられていたが、
* Rails5.2からは`Credentialsという新しい機能`になった


## Credentialsとはなにか
* 特定の方式で管理されるproduction環境用の`秘密情報そのもの`と`その管理の仕組み`という2つの意味があります。


* Credentialsは、秘密情報が構造化して記述され(credentials.yml.enc)、`リポジトリで管理されるが、リポジトリに入る内容は暗号化`される。
* `暗号化する`・`暗号化されたものを復元する`ために鍵(config/master.key)をつかいます。

* そしてこの`鍵はリモートリポジトリの外`で管理する(公に後悔しない)。つまり`ローカルのconfig/master.key`ファイルのみで保存される。GitHubなどには保存しない！というか初期設定ではGitHubに保存されないようになっている。


## 秘密情報の暗号化とその復元
 　暗号化された秘密情報(Credentials)は, `config/credentials.yml.enc`に記述される。
 このファイルの内容を編集するには、Railsの用意している専用のコマンドをつかう。(下で説明します)

## config/credentials.yml.enc(Credentials)の初期状態の確認
　ファイル自体はrails newしたときに作成されていて、
　ファイルの中身を確認すると初期状態の長い暗号文があらわれます。

↓

```
$ cat config/credentials.yml.enc
=> 0mX2hE/8qS1bsCY1D9e9zIl+qH3UnwZ8JbLN7LqwXXttCAb7KpbiKQRlmcchkbsQHq5CVF0p4OutHW4Z1n0EOK5+eeKc9LYieWkBBt1FvP4dtgeWLUvg987HbNiH1XollAgJ+yH1mhIeQ5DGswGIf3yDAqRxYoJdhijaf7wuVDysWTSypJNdhUiFNde87LzjDVAL7M2fvNYE2Uk8F0awpM2k5r9zJ1HDzDB2ApIam95nDAZjIChBcbgQKQP3eCSqhuomRAt4U1PS52hOSgT+DAhXd+SqRhHoUQkzCmnuVttl7Cq9hxQgAcsKeGnWyrG3eYDoyEtZAArsRczb9wvxunX6xtZubm8uolxz+PishTW4oUxwE4mEdThnUz1AEnVpzm/DH67G+Z5HrdOiUBt1aS9cD4B/gT+RoKkE--WUeSWKvOQJj65J0A--A2Uif217M8ZadNsqs75r5Q==
```

上のように暗号化されているためセキュリティ上は安心だが、開発者は何を書かれているのか把握できない。
そのため復元された内容を下記コマンドで閲覧することができる

↓

```
$ bin/rails credentials:show
```

## config/credentials.yml.enc(Credentials)の編集
config/credentials.yml.encの内容の編集

　下記コマンドで編集できる！
　EDITORという環境変数で、エディタを設定しておくと、その環境変数で指定されたエディタで、Credentialsを編集できるようになる。

```
$ bin/rails credentials:edit
```


## アプリケーションからCredentialsを参照する
* Railsアプリから秘密情報にアクセスできる。


```
$ bin/rails credentials:edit
  New credentials encrypted and saved
$ bin/rails c
[1] pry(main)> Rails.application.credentials.aws   
=> {:access_key_id=>123, :secret_access_key=>345}
```

## 鍵(config/master.key)の扱いに気をつける
* このキーを紛失してしまうと、秘密情報を2度と復号できない

* なくしたらconfig/credentials.yml.encを削除
	* 再度`bin/rails credentials:edit`で新しくつくりなおす。
* config/master.keyファイルをCredentialsと同じリポジトリに保存しないこと。このため「.gitignore」ファイルには「config/master.key」がはじめから記述されている。

## 参考
[現場で使える Ruby on Rails 5速習実践ガイド](https://www.amazon.co.jp/%E7%8F%BE%E5%A0%B4%E3%81%A7%E4%BD%BF%E3%81%88%E3%82%8B-Ruby-Rails-5%E9%80%9F%E7%BF%92%E5%AE%9F%E8%B7%B5%E3%82%AC%E3%82%A4%E3%83%89-%E5%A4%A7%E5%A0%B4%E5%AF%A7%E5%AD%90/dp/4839962227)
【javascript, TypeScript】任意の数字を配列から削除する

#はじめに
この記事では、
『配列の中に、任意の数字があるかどうかを判断し、ある場合は配列から消す処理』
を紹介しています。

【splice】という、関数を使用しました。

下記のページを参考にしています。
[参考ページ](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/splice)
#プログラム

```
const array = [0, 1, 2, 3, 4, 5];

// 削除したい数字
const deleteNum = 2;

// 配列の中に【任意の数字】が何番目にあるかを数字で返す (ない場合 -1 を返す)
const index = array.indexOf(deleteNum);

// 配列の中に【任意の数字】があった場合
if (index > -1) {
　// 配列の先頭から【index】番目の数字を削除
　array.splice(index, 1);
}

// [0, 1, 3, 4, 5]
console.log(array);
```
接線の方程式問題(高校レベル)がめんどくさいので解かせる

# はじめに
微分は人工知能分野では、頻繁に使われる操作。今回は常微分での接線問題について触れる。
高校生レベルなので紙の上で解けることを前提とする。

# 環境
・Jupyter notebook
・julia 1.4.0
・python 3.

#接線の方程式問題

>```math
関数f(x) = 3x^2+4x-5のx=1における接線の方程式を求めなさい。
>```

###紙の上での考え方
接線の方程式の公式は、

```math
x=aの接線は
f(x)−f(a)＝f'(a)(x−a)
```
この公式は、傾きf'(a)をもち、平行移動したものである。これの一つ一つの項を求めればいい。今回の問題ではa=1である。

```math
\begin{align}
&f (x) = y\\
&f'(x)=6x+4\\
&f (a) = f(1) = 3・1^2+4・1-5=2\\
&f'(a)=f'(1)=6+4=10
\end{align}
```
これらから接線の方程式については、

```math
y = 10*x - 8
```
となる。

###微分をして接線の方程式
#####python

```python
import sympy as sym
from sympy.plotting import plot
sym.init_printing(use_unicode=True)

# もとの関数
def originfunc(x):
    return 3*x**2+4*x-5


# 微分
def diffunc(x):
    dify = sym.diff(originfunc(x))
    return dify

if __name__ == "__main__":
    x = sym.symbols('x')
    y_1 = originfunc(1)
    print(y_1)
    #=>2
    dify_x = diffunc(x)
    print(dify_x)
    #=>6*x + 4
    dify_1 = dify_x.subs(x, 1)
    print(dify_1)
    #=>10
    # 接線の方程式
    y = dify_1*(x - 1) + y_1
    print('y =',y)
    #=>y = 10*x - 8
```

# 結果
sympy初心者には逆にめんどくさかった。
時間の設定

時間の設定方法

❶現在日時を初期化して代入

```
let goal = new Date（）；
```

❷未来（ゴールの日時を設定）

```
goal.setHours(23);
goal.setMinites(59);
goal.setsecond1s(59);
```
:point_up:現在年月日、23時、５９分、５９分でセット完了（今日の最終日でセットされる）

:warning:

```
const goal = new Date(2025,4,3)
```
2025年４月3日を設定


❷functionを設定

```
function countdown(due){
```

❷現在日時に初期化

```
const now = new Date();
```

❸パラメータdueのミリ秒から、定数nowのミリ秒を引いて、定数restに代入

```
const rest = due.getTime()- now.getTime();
```
ミリ秒で算出される

❹定義する

```
   const sec = Math.floor(rest/1000)%60;
    const min = Math.floor(rest/1000/60)%60;
    const hours = Math.floor(rest/1000/60/60)%24;
    const days = Math.floor(rest/1000/60/60/24);
```

❺配列準備する

```
const count = [days,hours, min,sec];
return count;
```
呼び出し元にリターンする
地方プログラマでもAWS認定ソリューションアーキテクチャアソシエイトを取得したい

# 概要
2020年3月19日に**939点**で**AWS SAA**に合格することができました。
AWS並びにクラウドがより広まってくれるように、**勉強の流れ**や**地方ならではの悩み**などを記載していこうと思います。
S3にPython、PHPなどのバックグラウンドからアクセスする方法は知っていても、VPCやセキュリティグループなどは全くわからないプログラマがAWS SAAを取得するまでの話です。

![ETjvbJdU4AAPlIS.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630990/3caff324-eb57-82f6-a3b4-0d8454d31fb0.jpeg)


# 試験勉強の流れ
試験勉強の期間は年末から初めて約3ヶ月です。
その間に行った勉強方法について簡単に解説していければと思います。

### AWS認定資格試験テキスト　AWS認定 ソリューションアーキテクト-アソシエイ
www.amazon.co.jp/dp/479739739X

試験問題の解き方については詳しく解説されていますが、AWSの概要についてをテキストで学ぶのは難しかったです。
時間はかかりますが、初めての方はハンズオンから行ったほうが良いかと思います。
いきなりテキストを手に取ると挫折するかもしれません。
ある程度AWSについて理解が深まったら利用するのが良いと思います。

### Udemy
**これだけでOK！ AWS 認定ソリューションアーキテクト – アソシエイト試験突破講座（SAA-C02試験対応版）**
https://www.udemy.com/course/aws-associate/

ハンズオンを交えながら試験対策を行うことができるので、AWSの基本的な知識をかなり身に付けることができました。
しかし試験問題を解く力を得ることはできないかもしれません。


### AWS WEB問題集で学習しよう
https://aws.koiwaclub.com/

AWSの模擬問題はとても少なく、どのような問題がでるかもイメージが付きにくいです。
このサイトを活用することで大量の模擬問題を解くことができました。
多少お金はかかりますが、有料会員ですと問題数が大きく増えますので**ゴールドプラン**をおすすめします。
本番試験に近い問題も多くあるため、模擬問題を解くことによって試験合格への大きな近道になると思いました。


### BlackBelt
https://aws.amazon.com/jp/aws-jp-introduction/aws-jp-webinar-service-cut/

あまり活用しませんでしたが、AWS公式なだけあってかなり詳しい説明が書いてあります。
問題を解いていて、この答えになる理由がわからないときに積極的に活用していきました。


### AWSの公式模擬問題
https://aws.amazon.com/jp/certification/certification-prep/

1,500円でAWS公式が提供する模擬問題を受けることができます。
試験当日に慌てないためにも受けておくと良いと思います。


# おすすめの勉強の流れ
1. Udemyを使ってハンズオン
2. Web問題集をひたすら解く(可能なら全問を2,3回繰り返す)
3. 不明なところをBlackBeltやテキスト理解できるまでで調べる
4. 仕上げとして本番試験形式の問題を解く

合格したあとに私が**こうすればよかったかな**と思った勉強の流れになります。
これから勉強される方の参考になればと思います。


# 地方で受験する際の注意点
ここからは地方で受験する方の注意点となります。
AWS認定試験の受験会場は**PSI**もしくは**ピアソンVUEテストセンター**の2パターン用意されています。
調べてみるとピアソンVUEテストセンターはほぼ全国にあるようなので油断していました。

ある程度、合格に自信も付いてきたので、とりあえず受験の申し込みをしようと思いました。
私の住んでいる市内にもテストセンターがあったので、そちらで受験しようと思ったのですが、
そこではAWS認定試験を行っていませんでした。

実施されている近隣のテスト会場は車で1時間ぐらいのところになり、しかも土日は試験を行っていませんでした。
東京まで行くことも考えたのですが、コロナの影響もあったので、そちらは自粛して平日に有給を使い受験しました。

試験当日にわかったのですが、受験時間は午後からで人数も最大4人でした。
しかも他の試験を受験してる方と同じ枠でしたので、空いていたらすぐに予約しない受験することもできないと思います。

都市圏に住んでいる方は気にしなくても良いと思いますが、もし地方在中でAWS認定試験を受験したいという方は、先に受験方法を確立しておくことをおすすめします。
この件を機に、東京への転職を考え始めました。
[Rでデータ分析] 因子を含んだ説明変数で回帰

回帰分析をする機会は結構あるが、アウトカム（目的変数）の出力値が何なのかについて使い分けるのはもちろん重要だが、今回はそっちではなく、説明変数の値にアンケート項目の回答などのように数値として扱えないときにどう分析するのかを。

```R:解析データの読込み
score <- c(49,37,56,40,46,65,40,15,92,58)
evalfac <- c("B","C","B","C","C","A","B","D","A","A")
```
のような仮想データでやってみる。
`score`はある試験(100点満点)の得点として、`evalfac`は試験後の自己評価としてみる。Aであると自己評価が高く、そこから順に評価が低くなるとする。このとき、自己評価と試験の得点の関係性をモデル化したい。
このとき説明変数`evalfac`は数値データではなく評価項目となっている。こういう場合には各評価項目に対する**ダミー変数**（該当するものに1を対応させて該当しない場合には0とする変数）を作る必要がある。
ちなみに上のコードの`<-`はRでの代入演算子で他の言語だと`=`を使う事が多いと思う。次のコードでわかるようにRはどちらでも大丈夫だが。

```R:B項目ダミーの作り方例
Bdam <- numeric() # numeric()で数字の入る空の箱を用意
for(i in 1:length(evalfac)){ # 1:length(evalfac)でfor文の範囲を指定
  if(evalfac[i] == "B"){
    Bdam[i] = 1 # 評価項目がBなら1を
  }else{
    Bdam[i] = 0 # 評価項目がBでないなら0を
  }
}
```
仮に上のコードで作ったダミー変数を「Bダミー」と呼ぶと、これを他の項目に対しても作成していくがその際には合計4項目なので3つのダミーを作ればよい。なぜか？
以下の表で説明する。

|評価項目|Bダミー|Cダミー|Dダミー|
|:---:|:---:|:---:|:---:|
|A|0|0|0|
|B|1|0|0|
|C|0|1|0|
|D|0|0|1|
のように、ダミー変数は3つ作れば他の一つは自動的に表現されることになる。この結果作成した3つのダミー変数を「Bdam」「Cdam」「Ddam」とすると、線形回帰モデルを作成するコードは

```R:ダミー変数を用いた線形回帰モデル
result <- lm(score ~ Bdam + Cdam + Ddam)
```
として実行できる。`lm`は「**l**inear **m**odel（線形モデル）」の略だと思う。
結果を確認する際には

```R:
summary(result)
```
のようにすれば結果を確認できる。
とまぁ、しっかりやればこうなるが、Rにはこういうときのための便利な機能がある。実はダミーを作成しないでも以下のように実行すればいい。

```R:ダミー変数を用いた線形回帰モデル（ver.R）
result <- lm(score ~ evalfac)
```
え？
そうなの。ダミー変数作らなくても自動的に作成してくれるのよ。Rは。
まぁ、これやってくれる関数は限られているから両方出来るようにね。少なくとも`lm`は大丈夫。

とはいえ、今の場合は自己評価項目がアルファベットだったからよかったけど、これを数字で答えさせる状況もあるよね。よかったら4、よくなかったら1みたいな感じで。それが次のデータ。

```R:評価項目（数字版）
score <- c(49,37,56,40,46,65,40,15,92,58)
evalnum <- c(3,2,3,2,2,4,3,1,4,4)
```
この場合はどうだろうか？

```R:ダメな解析
result <- lm(score ~ evalnum)
```
とするとこれはダメ。さっきダミー作ったのと同じ結果にならなきゃダメなのに違う結果になったよね？これは**本当は数字じゃない**のに、Rさんは**数字に見える**から自己評価の1～4を数字だと認識しているの。でもこの1と2の差と2と3の差って同じ？というとおそらく違うよね。なのでこういう場合は数字に見えるけど**数字じゃない**んだよ！ってRさんに教えてあげればいい。
やり方は簡単でデータを読み込んだ後に

```R:正しい解析
evalnum <- as.factor(evalnum)
result <- lm(score ~ evalnum)
```
とすればいい。`as.factor`でこれは「これは因子（factor）なんだよ！」って教えているのです。これさえクリアすればあとはさっきの話からこれで解析は問題ないことがわかるね。
これは因子以外にも`as.numeric()`（数値）、`as.character()`（文字列）、`as.matrix()`（行列）などもある。
扱ってる変数がこれだよってコンピュータに教えてあげるのはとても重要なんだね。こういうのを変数の型といってどの言語を使っても意識することではあります。
[備忘録] nginx + Laravel環境でルート以外404になるエラー解消

## エラー
nginx + Laravel環境でルートは正しく表示できるものの
それ以外にアクセスしても404になってしまう、、、ルーティングは正しい、、
調べたところ.htaccessの設定が一番に出ていたので見てみたが問題なし、、



## 解決方法
nginxの設定ファイルを下記に変更して直った。

```
server {
  listen 80;
    index index.php index.html;
    root /var/www/public;

  location / {
    try_files $uri $uri/ /index.php?$query_string;
    }

  location ~ \.php$ {
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_pass php:9000;
    fastcgi_index index.php;
    include fastcgi_params;
      fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
      fastcgi_param PATH_INFO $fastcgi_path_info;
  }
 }
 ```





この一行が
`try_files $uri $uri/ /index.php?$query_string;`


こっちに入っていたのが原因っぽかった。
`location ~ \.php$ {}`
rex0220 算式自動採番プラグインの応用例

[算式自動採番プラグイン](https://qiita.com/rex0220/items/2e40a57d2d08023affde)を使うと、年月・組織・区分毎などの採番を簡単に実現できます。
テキスト＋番号などの簡単なものから、日付や項目の値を使った例などをご紹介します。
<img width="632" alt="2020-05-30_16h00_47.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/9ebbf10d-1724-5e9e-dd2d-f22a6edf4ac4.png">

# 算式自動採番プラグインの設定手順

- 採番項目（文字列）、採番キー項目（文字列）、連番（数値）の各項目をアプリに配置して、算式採番プラグインの設定の設定に進みます。
- 採番項目、採番キー項目、連番項目を選択します。
- 計算式に区分、日付の年を使って、計算結果に"@@@@" を含む文字列を指定します。
    - 計算式：区分&DATE_FORMAT(日付,"YYYY")&"-@@@@"
    - 入力補完を使うとフィールド名・関数名が簡単に探せます。

<img width="827" alt="2020-05-30_23h29_38.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/0eb4c49d-59c2-04e8-5bc3-18f885b5d49b.png">

![2020-06-01_09h06_38.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/df57c0f0-1be6-b582-bd0a-19332576e3a0.gif)

# 番号のみの採番

番号のみの採番の計算式は、表示する桁数に応じて"@"を並べます。

- "@"： 1,2,3,...10,11,...,1000,...
- "@@"： 01,02,03,...10,11,..
- "@@@@@"： 00001,00002,...

**"@"数を超えた桁数の連番になる場合は、そのまま表示されます。**

# テキスト＋番号の採番

文字列に"@"を含めるだけです。

- "A@"：　A1,A2,...,A100,...
- "A-@"：　A-1,A-2,...A-100,...
- "A-@@@@"：　A-0001,A-0002,...
- "ABC@@@@"：　ABC0001,ABC0002,...
- "A1@@@ X"：　A1001 X,A1002 X,A1003 X,...

文字列の途中に"@"があっても、文字列に数字・空白があってもOKです。

# 日付＋番号の採番

DATE_FORMAT 関数を使うと、当日の年月日と番号で採番できます。
文字列との組み合わせも可能です。

- DATE_FORMAT("TODAY","YYYY-MM-DD")&"-@@@"：　2020-05-10-001,2020-05-10-002,...
    - "YYYY-MM-DD"は、日付が変わると番号がリセットされます。
- "A"&DATE_FORMAT("TODAY","YYYY-MM")&"-@@@@"：　A2020-05-0001,A2020-05-0002,...
    - "YYYY-MM"は、月が変わると番号がリセットされます。


# 項目＋番号の採番

アプリの項目値毎に、採番できます。フィールドコードと文字列を連結します。

- ドロップダウン&"-@@@@"：　A-0001,A-0002,...
    - ドロップダウンの値毎に採番されます。
- DATE_FORMAT(日付,"YYYY")&"-@@@@"：　2020-0001,2020-0002,...
    - 日付の年毎に採番されます。
- DATE_FORMAT(日付,"YYYY/MM")&"-@@@"：　2020/05-001,2020/05-0002,...
    - 任意の区切り文字が使えます。
- DATE_FORMAT(日付,"MM/DD/YYYY")&"-@@@"：　05/20/2020-001,05/20/2020-0002,...
    - アメリカ式の日付書式もOK。

# 年度別の採番

４月はじまりなど会社の年度単位に採番できます。

- "A"&DATE_ADD("TODAY",-3,"month","YYYY")&"-@@@@@"：　A2020-0001,A2020-0002,...
    - 当日の年度（４月はじまり）で採番
- "A"&DATE_ADD(日付,-3,"month","YYYY")&"-@@@@@"：　A2020-0001,A2020-0002,...
    - 日付項目の年度（４月はじまり）で採番


# 項目の値を特定の文字列に変換して採番

IF 関数、SWITCH 関数、文字列関数などで項目の値を変換して採番できます。

- IF(区分=="sample1","S","T")&"-@@@"：　S-001,S002,... or T-001,T-002,...
- SWITCH(区分,"sample1","S","sample2","T","U")&"@@@@"： S-001,... or T-001,... or U-0001,...
- LEFT(区分,2)&"-@@@"：　sa-001,sa-002,...

# 計算式の確認ツール

[計算式プラグインの計算ツール](https://qiita.com/rex0220/items/ae83c6d5ce50ff7a9a73#%E8%A8%88%E7%AE%97%E5%BC%8F%E3%83%84%E3%83%BC%E3%83%AB)を利用すると、レコードの項目値を使った計算式の検証ができます。


<img width="839" alt="2020-05-31_16h23_11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/6d6bfd0d-66c1-ebfd-e22a-f655bad3c0b0.png">
【Helm】KubernetesのパッケージマネージャーであるHelmについて

## Helmとは
**Kubernetesのパッケージマネージャー**
Kubernetesアプリケーションのインストールと管理を効率化するツール。
Kubernetesの管理時に幸せになれる。

## Helmの3つの大きな概念

 -  KubernetesにとってのHomebrew

  - Kubernetesクラスタ内でアプリケーション、ツール、またはサービスを実行するために必要なすべてのリソース定義をchartと呼ばれるもので管理する。
  - chartをもとに、アプリのインストール、更新、削除を（Homebrew等のように）行う。


 - chartをリポジトリで管理、共有して使う 
   - Kubernetesの設定をパッケージにして、管理する

 - 同じクラスターに何度もchartをインストールできる
   - chartをインストールするたびに、インスタンスが生成されるので、1クラスター内に複数の同じchartをインストールできる。

公式docsにこんなことが書いてある
https://helm.sh/docs/intro/using_helm/
>HelmはchartをKubernetesにインストールし、インストールごとに新しいリリースを作成する。
また、新しいチャートを見つけるには、Helmのchartリポジトリを検索できる。


## インストール方法
 - バイナリはこちら

https://github.com/helm/helm/releases/tag/v3.2.1

 - homebrewでインストールの場合

```ruby:
$brew install helm
```

## Helmの一般的なアクション
大体以下のようなアクションをするというやつ。

 - helm search: chartを検索する
 - helm pull: chartをローカルに保存して、表示する
 - helm install: Kubernetes上にchartをアップロードする
 - helm list: chartのリリースリストを表示する

## 実際使ってみて
現場で使っているのだが、クラスタにdeployするまでがかなり楽になるなーと感じる。更新の手順としては

1. helmfileを編集する
2. contextを変更する
3. helmfileの差分確認する（helmのdiff pluginで）
4. applyする

以上でデプロイが完了するので、すごく楽。

まだ使い始めなので、全てがわかっているわけではないが
Kubernetesのパッケージマネージャーのデファクトスタンダードになりつつある（もうなってる？）ので、今のうちに学んでいくのが良いかも...
standard_init_linux.go:211: exec user process caused "no such file or directory" の直し方

## はじめに

Windows環境でDockerコンテナを起動すると稀に `standard_init_linux.go:211: exec user process caused "no such file or directory"` というエラーに遭遇する。

ベースイメージにalpineを使っている場合の記事はよく見るが今回の件では別の問題だったので共有。ちなみに、alpineの場合は`bash`を`ash`に変更すれば良いらしい。

（コメント、修正等あったらコメントにて教えていだたきたいです）


## 解決方法

結論から言うと、以下のファイルの改行コードを`CRLF`から`LF`に変更すれば解決する。

1. Dockerfile
2. docker-compose.yml
3. 1,2で呼び出している`*.sh`ファイル

どうやら改行コードがWindows標準の`CRLF`になっているのが原因らしい。


## gitコマンドの設定

上記の修正で問題は解決するが、再発防止のために確認すべきポイントがあるので紹介する。

Windowsでgitコマンドを使っていると、`git clone`等のコマンドを叩いた時に自動で`LF`を`CRLF`に自動で変換してくれる場合がある。この場合タイトルのエラーが出るため、自動変換をオフにしたい。

この機能をオフにするには以下のコマンドを叩けば良い。

```
git config --global core.autocrlf input
```

autocrlfの細かい挙動については参考3の記事を参照されたい。

## 参考

1. [Dockerでalpineイメージ使用時に発生したstandard_init_linux.go:211: exec user process caused "no such file or directory" を解決](https://qiita.com/junun/items/aba81e98438296bc78b0)
2. [Windows Docker Error - standard_init_linux.go:211: exec user process caused "no such file or directory" #9](https://github.com/riggraz/astuto/issues/9)
3. [気をつけて！Git for Windowsにおける改行コード](https://qiita.com/uggds/items/00a1974ec4f115616580)
UnityからAndroid端末にアプリをインストールするときにでたエラーについて

##エラー
>
adb: failed to install /Users/UserName/UnityProject/TestUnityProject/ProjectName/Builds/Apk/AppName.apk: Failure [INSTALL_FAILED_OLDER_SDK: Failed parse during installPackageLI: /data/app/vmdl1509473597.tmp/base.apk (at Binary XML file line #8): Requires newer sdk version #28 (current version is #27)]
```

*日本語訳*
>
adb：/Users/UserName/UnityProject/TestUnityProject/ProjectName/Builds/Apk/AppName.apk：のインストールに失敗しました：[INSTALL_FAILED_OLDER_SDK：installPackageLIの解析に失敗しました：/data/app/vmdl1509473597.tmp/base.apk（バイナリXMLファイル）行＃8）：新しいSDKバージョン＃28が必要（現在のバージョンは＃27）]

##解決策
「インストール先のOSのバージョン」と「Unityで吐き出すApiLevel」を合わせる

---
SDKがおかしいのかと思い、アップデートなどをやりまくったが、解決せず、、
エラー文を検索したら、[こちら](https://torikasyu.com/?p=683)の記事が出てきて、バージョンが合ってないということがわかりました。
「14日で作る量子コンピュータ」を読んでみる。2日目

#はじめに
　今回は実際にシュレディンガー方程式を用いて電子の運動を計算してみます。

# 2　電子の波動関数

## 2.1　電子の波動関数の表現
　ここではポテンシャルによるエネルギーが存在しない場合の電子の波動関数を求める。
　前回求めた、時間に依存しないシュレディンガー方程式

```math
-\frac{\hbar^2}{2m}\frac{d^2 \phi(x)}{dx^2}=E\phi(x)
```

　を用いる。ここで定数をひとまとめにして、

```math
k=\sqrt{\frac{2mE}{\hbar^2}}
```

　これを用いて

```math
\frac{d^2 \phi(x)}{dx^2}=-k^2\phi(x)
```

　と言う二階微分方程式を解くことで、波動関数は

```math
\psi(x,t)=Ae^{ikx-i\omega t}+Be^{-ikx-i\omega t}
```

　ここでωについて

```math
\omega=\frac{E}{\hbar}より\\
\omega=\frac{\hbar k^2}{2m}
```

　これを波動関数の式に代入することで

```math
\psi(x,t)=Ae^{ik[x-\frac{\hbar k}{2m}t]} + Be^{-ik[x+\frac{\hbar k}{2m}t]}
```

　A=1,B=0の時eの肩が0となるようなxをx(t)とおくと

```math
x(t)=\frac{\hbar k}{2m}t
```

　これは平面波の速度を表す。平面波のピーク位置の移動速度のことを位相速度と呼び

```math
v=\frac{\hbar k}{2m}
```

　またA=1,B=0の時の波動関数について実部と虚部は

```math
Re[\psi(x,t)]=cos(k\left[ x-\frac{\hbar k}{2m}t \right])\\
Im[\psi(x,t)]=sin(k\left[ x-\frac{\hbar k}{2m}t \right])
```

## 電子の波動関数のアニメーション
　E=1.00, 0.25[eV]の時をアニメーションで示してみると、以下のような波形が得られた。
![frame0000000.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179010/7ae1f3a7-b0b4-ada6-1514-6b868dfb55b4.png)


# 参考
[EMANの物理学](https://eman-physics.net/quantum/expectation.html)

[14日で作る物理コンピュータ](https://www.amazon.co.jp/14%E6%97%A5%E3%81%A7%E4%BD%9C%E3%82%8B%E9%87%8F%E5%AD%90%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF%E2%80%95%E3%82%B7%E3%83%A5%E3%83%AC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%AC%E3%83%BC%E6%96%B9%E7%A8%8B%E5%BC%8F%E3%81%A7%E9%87%8F%E5%AD%90%E3%83%93%E3%83%83%E3%83%88%E3%83%BB%E9%87%8F%E5%AD%90%E3%82%B2%E3%83%BC%E3%83%88%E3%83%BB%E9%87%8F-%E9%81%A0%E8%97%A4-%E7%90%86%E5%B9%B3/dp/4877834702)
Excel チェックボックス　オプションボタン

#「アンケートフォームなどで見かける「チェックボックス(checkbox,optionbutton)」を使って、複数のブックを集計する」
## レ点を付けるチェックを見たことはありませんか？
<img width="200" alt="png20053100.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/646883/61575ebc-ddb3-70d7-d1c2-de0cdbfaba9e.png">
「イチゴ」と「みかん」はフォームコントロール
「リンゴ」と「バナナ」はActiveXコントロール
###開発タブが無い！
「開発」タブは標準では非表示なので、
「ファイル」→「オプション」→「Excelのオプション」を表示
「リボンのユーザ設定」の「開発」にチェックを付ける
<img width="400" alt="png20053101.png" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/646883/f7863970-fa95-d9b4-cf2f-ffe4408a3c36.png>
## チェックボックスとセルを連動
<img width=200 alt=png20053102.png src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/646883/13b9b3ea-2158-928d-2a95-165a35747bf5.png>
##１．フォームコントロール
<img width=300 alt=png20053103.png src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/646883/138be963-85fd-7458-d55e-5f406ad263ae.png><img width=300 alt=png20053104.png src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/646883/988fe44d-da8d-5674-4fd9-9c9181803cff.png>
##２．AxtiveXコントロール
<img width=300 alt=png20053105.png src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/646883/af204afd-755a-ec62-e87e-1f17a9aec6aa.png><img width=300 alt=png20053106.png src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/646883/c65831be-dd96-1297-ea41-d2aecaa5dbf6.png>
以上でチェックボックスの設定が出来たのですが、
テキストサイズの変更とかも出来なくはないのですが
<strong>ハッキリ言って使いにくい</strong>
# グループに分ける
シートにグループが１つの場合は、配置するだけです。
複数のグループを作成する
##１．フォームコントロールのオプションボタン
赤枠内のように、オプションボタンを配置、このままでは、シートで１つのオプションボタンしか選択できません。
グループボックスボタンで、グループ化するオプションボタンを囲む。こうすることで、オプション１~３とオプション１１~１３は異なるグループとなり、シート内で２つの選択ができるようになる。
<img width=300 alt=png20053107.png src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/646883/44f7f9a7-681b-a857-a891-de62fe46b8e8.png><img width=300 alt=png20053108.png src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/646883/ce8a2950-2ee2-e917-6faf-ee40cad89862.png>
一旦グループ指定した後は、グループの範囲外に移動しても、同じグループ扱いでした。
##２．ActiveXコントロールのオプションボタン
ActiveXコントロールのオプションボタンは、プロパティでグループを指定します。
開発タブでデザインモードにして、オプションボタン（右クリック）のプロパティで指定します。
GroupNameでグループ指定できます。
LinkdCellでセル連動できます。
<img width=300 alt=png20053109.png src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/646883/a8eada85-0565-7cb9-cdcd-86187f1dabb5.png>

[物忘れ防止 MSExcel200503110.xlsx ](https://github.com/sugita0301/douzo/blob/master/MSExcel200503110.zip)
https://github.com/sugita0301/douzo
ChromeでPDFファイルをダウンロードせずにブラウザ内で開く方法

Chrome で PDF ファイルが特定のサイトで毎回ダウンロードされて溜まっていくときに、ダウンロードせずにブラウザ内で開く方法です。

※ すべてのサイトでダウンロードされてしまう場合は以下の設定をオフにしてみてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155587/4705fc0b-eb9a-9107-f082-f6533efcc07c.png)

# 方法

1. PDF Viewer をインストール
https://chrome.google.com/webstore/detail/pdf-viewer/oemmndcbldboiebfnladdacbdfmadadm/

2. 拡張機能の設定からアクセスを許可する URL を指定する
すべての PDF をこの拡張機能で開いてしまわないように指定する理由は、URL が変わってしまうからです。(`chrome-extension://` から始まる)
CSSアニメーションで「たべるんごのうた」を作った

# CSSアニメーションで「たべるんごのうた」を作りました

## はじめに

成果物は [こちら](https://taberungo-no-uta.netlify.app/) から。

**注意**

- 最新のChromeもしくはそれに準ずるブラウザじゃないと動かない可能性が高いです。
- リソースの読み込みの関係でチラチラすることがあります。
- 音がないです。

## たべるんごのうた

みなさんご存知のことかと思いますが、ニコニコ動画でいま（2020/05/31現在）ブームが起きているです。
ご存じない方は [こちら](https://nico.ms/sm36210300) から御覧ください。

シンプルな動き、シンプルな歌、そして最後にBB素材。
圧倒的中毒性に様々な派生動画が作成され、動画の女の子「辻野あかり」は声を手に入れることに…

私自身は、アイマスに詳しくないのですが、中毒性にやられました。

## CSSアニメーション+たべるんごのうた

動きがシンプルなのでかんたんに実装できてしまうのでは？と思い実装をはじめました。
CSSアニメーションの練習です。

`transform`というプロパティを使うのですが、複数の値の設定と`animation`がここまでたくさんの値を設定することが想定されていないのでしょう。かんたんじゃなかったんご…。

調べてみると、CSS Houdiniという技術を使えば実装できそうということで、Firefox等のサポートを捨て実装しました。

## 仕様

- 若干動きが違う
  - 再現難しい
  - 再現疲れた
  - 画面サイズに依存しないよう％多用した
- テンポが違う
  - CSSなのでms単位で指定できるが算出するのがしんどかった
  - 元動画を0.9倍速くらいでだいたい同じ
- Svelteで実装してある
  - `TaberungoNoUta.svelte`をコピーしたら他で使えるかも
    - SCSSを使っているので要対応
  - 実はブルーバックにする機能がある
    - けど今回は使ってない
    - ブルーバックに限らず、CSSの色なら何でも指定できる
      - もちろんグリーンバックも

リポジトリ: https://github.com/ssssota/taberungo-no-uta

## おわりに

この一大ムーブメントに乗るんご！！！
エラーコードから即解決方法を知りたい

#はじめに
ググっても解決がなかなか見つけられずにイライラすることありませんか？
ここでは自分が出くわしたエラーの中で、解決に１０分以上かかったヤツらをリストアップしていきます。

内容に一貫性はありません。エラーと解決策のみ記した断片的な情報です。

##pandasインストールでつまづき
pipでpandas入れる時に出てくるエラー。バージョンダウンで解決した人もいるみたいだが駄目みたい。
aptで入れたらＯＫだった。

```
ImportError: cannot import name 'PY3'
ImportError: cannot import name 'AbstractMethodError' pandas
```
```
pip uninstall pandas
sudo apt install python-pandas
```
GodotでNode2DのGizmoを描画する

# はじめに
Node2DにGizmoを描画したくて色々ハマったので情報をまとめます。

## 動作環境
Godot Engine 3.2.1

# メモ
## SpatialGizmoは2Dでは動かない

SpatialGizmo
https://docs.godotengine.org/ja/stable/tutorials/plugins/editor/spatial_gizmos.html

最初これかなと思って試したら、動かなくてウーンウーン悩んでました。
Spatialは3DのNodeなのでNode2Dで動かないのは当然でした。ちなみにGodot4からはSpatialはNode3Dに改名するみたいです。

## 2D版のGizmoは無かった

EditorPlugin
https://docs.godotengine.org/en/stable/classes/class_editorplugin.html

EditorPluginにadd_spatial_gizmo_pluginは存在するが、add_node2d_gizmo_pluginは無さそうなので、2D版のGizmoは無いみたいです。

## 解決: `_draw`で描画する
他のCamera2Dといった2DノードはどうやってEditor画面に描画しているのか気になったのでGitHubのソースを眺めてみました。

https://github.com/godotengine/godot/blob/master/scene/2d/camera_2d.cpp

どうも`_notification`のcase NOTIFICATION_DRAW で描画しているみたいです。
エンジンの真のお気持ちはソースコードに書いてあります。

GDScriptでは先頭に`tool`を追加して`_draw`で描画すればよさそうです。

Node2Dの周りに四角形を描きたいときは以下のコードになります。

```python
tool
extends Node2D

export var left   := -100
export var top    := -100
export var right  := 100
export var bottom := 100

func _process(delta):
	if Engine.editor_hint:
		update()

func _draw():
	if Engine.editor_hint:
		var color := Color(1.0, 0.0, 0.0)
		draw_line(Vector2(left, top), Vector2(right, top), color)
		draw_line(Vector2(right, top), Vector2(right, bottom), color)
		draw_line(Vector2(right, bottom), Vector2(left, bottom), color)
		draw_line(Vector2(left, bottom), Vector2(left, top), color)
```

EditorでGizmo描画できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11172/2a15b10f-a6ab-c1cd-4dff-eb7c87cf4470.png)

## 注意点
- `_process`は実行時にも走るので、`Engine.editor_hint`でEditor上でのみ実行されるように制御する。
- `_process`で`update()`を呼び出す方式は、毎フレーム描画処理が行われてしまうので、Gizmo描画に影響あるパラメータをプロパティにしてその中で`update()`したほうがお行儀がよさそう。
TypeScriptの基本的な型指定をメモ


絶賛、TypeScriptをキャッチアップ中。
型指定で、どうやって書くっけ...?みたいな型指定があるんで、忘備録的にメモ。

###配列の型指定

```typescript:複数の型を使いたいときはunion型を利用

const instruments: string[] = ["Guitar", "Base", "Drums"];
const mix: (number | string)[] = ["hoge", 12, "fuga"];
```

###リテラル型
決まった値のみしか受け入れない。
`const`で宣言すると型推論はリテラル型になる。

```typescript:以下の型推論は同じリテラル型となる。
const guitar: "guitar" = "guitar";
const guitar = "guitar";
```

`let`で宣言すると、以下の場合は、`string型`になる。

```typescript
let guitar = "guitar"
```

使用場面として、`union型`を併用すると、enum型と同じような使い方ができる。
基本的には、enum型のほうが分かりやすいと思う。

```typescript:enumのように使える
let clothSize: "large" | "meduim" | "small" = "small";
```

###enum型

```typescript
enum Size {
  SHORT = "SHORT",
  MEDIUM = "MEDIUM",
  LARGE = "LARGE",
}

const coffee = {
  hot: true,
  size: Size.SHORT,
};
```

###typeエイリアス
型を変数みたいに扱えるようにする。

```typescript
type ClothSize = "small" | "medium" | "large";
let clothSize: ClothSize = "small";
```
###関数に型をつける

```typescript
//関数に型をつける
function add(num1: number, num2: number): number {
  return num1 + num2;
}

//型注釈
const anotherAdd: (n1: number, n2: number) => number = add;

//アロー関数
const doubleNum: (num: number) => number = (num) => num * 2;

//コールバック関数
function doubleAndHandle(num: number, cb: (num: number) => number): void {
  const doubleNum = cb(num * 2);
  console.log(doubleNum);
}

doubleAndHandle(21, (doubleNum) => {
  return doubleNum;
});
```
MacOSでGitインストーラーのGitをアンインストールして標準(Apple git-127)に戻してみた

# Gitバージョンの確認
　MacでGitを久しぶりに使うことになり、Gitの場所とバージョンを確認すると、バージョン2.3.5でした。

```
$ which git
/usr/local/git/bin/git

$ git --version
git version 2.3.5
```

　う〜ん。いつインストールしたか思い出せない。どうやらGitインストーラーでインストールしているようだ。
（参考）Gitインストール方法の違いによるGitパスは、以下のとおり

（標準のパス）
　　/usr/bin/git
（インストーラーでのGitのパス）
　　/usr/local/git/bin/git
（Home-brewでのGitのパス）
　　/usr/local/Cellar/git/(バージョン番号)/bin/git

# Gitのアンインストール
　「Git アンインストール」でググると、「/usr/local/git」にある削除用スクリプト「uninstall.sh」で削除できると出てくるが、自分の環境にはありませんでした。（最近のインストーラーはあるのかも。確認していません。）
　このため、GitのＨＰからインストールされているバージョンのインストーラーのアーカイブをダウンロードして、dmg ファイルを開くと、その中に「uninstall.sh」があるので、以下のように実行します。

```
$ cd /Volumes/Git\ 2.3.5\ Mavericks\ Intel\ Universal 
$ sh ./uninstall.sh
```
　すると、

```
This will uninstall git by removing /usr/local/git/**/*, /etc/paths.d/git, /etc/manpaths.d/git
Type 'yes' if you are sure you wish to continue: yes
Password:
Forgot package 'GitOSX.Installer.git235Universal.git.pkg' on '/'.
Forgot package 'GitOSX.Installer.git235Universal.etc.pkg' on '/'.
Uninstalled
```
　アンインストールできました。

## "No such file or directory"の対応
　ところが、バージョンを確認すると、

```
$ git --version
-bash: /usr/local/git/bin/git: No such file or directory
```
　「そんなものは無いよ」と言われてしまったので、which と type でファイルパスを確認するとズレている。このため、hash -r する。

```
$ which git
/usr/bin/git

$ type git
git is hashed (/usr/local/git/bin/git)

$ hash -r
$ git --version
git version 2.24.2 (Apple Git-127)
```

　最近のMacOS標準のGitは、新しいのか・・・（XcodeのアップデートでGitもアップデートされていたようだ）

# 最後に(home-brew)
　今後は、バージョン管理が面倒なので、home-brewでインストールして管理しようかと考えています。（home-brewでのGitインストール方法は、色々な方々が詳しく紹介されていますので、ここまでとします。）
pythonで"fatal error: 'stdio.h' file not found"とか言われたときの対処

# 対象者
タイトルの通り、このエラーで苦しんでいる方へ。
ぼくはfortranをpythonモジュールとして呼び出すための`f2py`(今はnumpyに統合されています)を用いたときに言われて凄まじく苦労しました。
環境としてはMacOS10.15 Catalinaです。
それ以下のバージョンの方はもう情報がたくさん出てるので割愛します(コマンドラインツールを公式ページからダウンロードしてアンパックすればOKのはず)。


# 結論
ただの覚書ですので初っ端から結論。
以下のコマンドをターミナルで実行しましょう。

```console
$ sudo ln -s /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/* /usr/local/include/
```

これで`/usr/local/include/`にXcodeのヘッダへのシンボリックリンクを貼ることができます。
あとは例えば

```console
$ python3 -m numpy.f2py -c hello.f90 -m hello
```

などとすれば`hello.cpython-38-darwin.so`などと言う名前のファイルができるでしょうから、

```console
$ python3 f2.py
 Hello from Fortran!
 a=           4
```

とすれば動くでしょう。


# 使用したコード

```f2.py
import hello


hello.foo(4)
```

```hello.f90
  subroutine foo(a)
    integer :: a
    write(*,*) "Hello from Fortran!" !ここで文字を出力
    write(*,*) "a=",a !ここで整数を出力
  end subroutine foo
```
VSCodeでPython (Windows10) 仮想環境・パッケージ編

### VSCodeでPython動くようになったら
パッケージをインストールしてゴリゴリ分析していくとしてもよいが、仮想環境が作れるとより便利に。仮想環境作るメリットとしては

- 環境がバグっても仮想環境だけ消せばよい
- 誰かと環境を揃えて作業する際に環境の共有が容易
- 普段はあまり使用しないパッケージは仮想環境にのみインストールできる

が大きいかなと。
ちなみに通常パッケージをインストールする際には`pip install パッケージ名`をターミナル（powershell）で実行すればインストールできる。
だから仮想環境が不要な人は`pip`を軸にパッケージの管理をすればよい。
（仮想環境で後述のvenvを作る人はpipで行うことになるが）

#### 仮想環境の構築
venv (**v**irtual **env**ironmentの略？)を作れば基本的に良いのだが、`pipenv`を使ったらもっと簡単にできたのでそちらを紹介。
venvの場合（この表現が正しいのかは疑問）は、powershllでプロジェクトディレクトリに移動して（`cd`コマンドを使えばよい）、その後、バージョンにもよるのだろうが、僕はPython3しか知らないので、

```
python3 -m venv 仮想環境の名前
```
とすれば仮想環境が作れる。あとはパッケージを`pip`で管理すればいい。
最初はずっとこれでやっていたのだが、色々と面倒になってきて。。。
そこで別の環境構築方法として`pipenv`を使った方法を試してみたら結構簡単じゃんって。まぁvenvでも全然大丈夫だと思うから好みでいいんじゃねって気もする。
こっちの方法だと[「venv:Python仮想環境管理」](https://qiita.com/fiftystorm36/items/b2fd47cf32c7694adc2e)が一通り説明してくれている。

VSCodeを起動したらターミナルに行って「新しいターミナル」を起動して、

```
pip install pipenv
```
を実行すればよい。
新規フォルダを作成して、新規ターミナルで

```
pipenv --python 3.8
```
のように実行する「3.8」の部分は僕のPythonのバージョンがそれなだけなので自身のバージョンに合わせて変更を。実行すると、左側のエクスプローラー？に「.venv」とか出来るかな。
そしたら新しいファイル「`ファイル名.py`」を作成して開く。
使用するPythonの選択をするために「`Ctrl + Shift + P`」もしくは左下の「Select Python...」みたいなとこから使用するPythonを選べるので今作ったヤツを選択すればいい（多分カッコ書きが付いてるヤツがそれ。）。パスも書いてあるから「.venv/」ってどっかに書いてあるヤツを選択すればいい。
適当に何か書いてみて実行（`F5`して`Enter`）すれば実行される。

#### パッケージのインストール
パッケージのインストールも`pipenv`で出来るのが魅力的。
インストールはターミナルで

```
pipenv install パッケージ名
```
でアンインストールするときには上で「uninstall」とすればよい。
試しに実行したければ結構誰でも使いそうな`numpy`（ナムパイと呼ぶ, NumPy, Numerical Pythonの略）を（パッケージ名はすべて小文字ね）。
NumPyは数値計算に特化したPythonのパッケージだが、基本的なことから結構いろいろやってくれるから入れとくと便利かも。

簡単だよね。で、共有の話だけ少ししておくと、基本的には`pip freeze`使って`requirements.txt`作ってそれを別のPCに移動して

```
pip install –r requirements.txt
```
などのようにやるが、`pipenv`でパッケージ管理するとこういうファイルの更新を自動でやってくれるのもありがたいのよ。その情報は`Pipfile`に保存される。Pipfileの場合は、他のPCに移動して、

```
pipenv install --dev
```
のようにすればよい。
また、これまで`requirements.txt`でパッケージを管理していた場合にも、

```
pipenv install -r ./requirements.txt
```
とすれば新しいPCにも環境の再現が可能となる。
昔に比べて本当に便利な時代になったなぁ。
Mozilla Hubs をとりあえず試してみる

[Mozilla Hubs](https://hubs.mozilla.com/) をとりあえず試してみるという話のメモです。
　●Hubs - Private social VR in your web browser
　　https://hubs.mozilla.com/

## 今回の前提
今回、下準備として [Hubs](https://hubs.mozilla.com/) にアクセスして、「Create a Room」のボタンから、Room の作成を行い、メニューの「Choose a Scene」から Scene の変更を行っています。

そうして作成した Room のトップに移動したところからの説明です。

## 実際に試してみる
上記の「今回の前提」で書いた通り、事前に作成した Room を利用します。
共有のための URL が発行されるので、その URL にアクセスします。

アクセスしたトップの例が以下の画像です。
画像の青矢印で示した「Enter Room」で Room に入ってください。
<img width="1024" alt="hubs01.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/49ec70f5-975a-b2fd-aba3-541a2916387e.jpeg">

次の画面では、以下の画像の赤矢印で示したボタンで、名前やアバターを変更できます。
デフォルトのもので OK の場合や、設定を変更後に大丈夫になったら、以下の画像の青矢印で示した「Accept」を選んで次へ進んでください。
<img width="1017" alt="hubs02.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/c17a9ba4-deec-e797-60c3-f4183eb8d004.jpeg">

なお、上記の画面でアバターを変更するボタンを押した場合、以下の画像のような画面で、アバターを選択するようになります。
<img width="1026" alt="Hubs03.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/37d0a418-f4a6-c25d-3ce8-1eb4d3ff8053.jpeg">

「Accept」を選んで次へ進んだ場合に、以下のような画面が出ますが、今回はブラウザでそのまま利用するので「Enter on Screen」のほうを選びます。
<img width="1166" alt="hubs04.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/94a90fdc-21b2-fad3-9a48-239ec76d59e2.jpeg">

次の画面では「Next」を選びます。すると、ブラウザでマイクの利用を求める表示がでるので、マイク利用を許可するよう操作します。
<img width="1163" alt="hubs05.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/862bc458-2b54-1555-fb46-d7a8e38ed66c.jpeg">

マイク利用を許可した後、ボタンの上のアイコンが緑になるので、再度「Next」を選びます。
<img width="646" alt="hubs06.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/ca8d52bc-ff19-dc3c-e181-031490857a35.jpeg">

以下の画面が表示されますが、ここでマイクとスピーカーのテストができます。
そして、マイク・スピーカーが問題なく動作していそうでしたら「Enter Now」を押してください。
<img width="1170" alt="hubs7.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/5026aa30-0ad3-778b-417a-b3ed8e56ae80.jpeg">

そうすると、以下のように Room に入った状態になります。
<img width="1165" alt="Hubs8.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/f6b97963-f24b-fa72-f664-b3d059196b71.jpeg">

簡単ですが、流れは以上です。

【追記】 操作方法について公式ドキュメントを見てみた、という感じの記事を追加で公開しました。
　●Mozilla Hubs の対応環境と基本操作など - Qiita
　　https://qiita.com/youtoy/items/b2a38a7fbd48e2718386
VScode Draw.io Integrationでファイルの関連付けが外れた場合の対処方法

VScode拡張機能のDraw.io IntegrationにてSVGファイルを作成後、複製した際にDraw.ioの編集画面が表示されず、ハマったのでその対処方法です。

結論としては、拡張子を一度`.drawio`に変更し、再度`.drawio.svg`に戻すと解決します。

## そもそも

- VScodeの拡張機能で、draw.ioがvscode上で操作できるようになりました。  
⇨ [VSCodeでDraw.ioが使えるようになったらしい！](https://qiita.com/riku-shiru/items/5ab7c5aecdfea323ec4e)を参考にしました。  
- また、拡張子をdrawio.svgとすることでmarkdownに埋め込むことが可能です。  
⇨ [VSCode上のマークダウン とDraw.ioでドキュメントを作成する](https://qiita.com/oruharo/items/f5bdeedad28731da1b11)を参考にしました。  

## 起きたこと

作成したSVGを複製しようとしてコピー＆ペーストしたところ、テキストファイルとして表示されてしまい、Drawioの編集画面が表示されません。
![problem.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420612/f9dfa834-ce90-fee7-952c-9b0e195e6755.gif)


## 解決方法

一度、拡張子を`.drawio`に変更し、Drawioの編集画面が表示されたことを確認した後、`.drawio.svg`に戻します。
![solve.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420612/0ef495e0-92ab-1d65-e200-42d986cb810d.gif)

## さいごに

vscodeでdraw.ioを扱えるようになり、アーキテクチャ図等の作成がより一層便利になりました。
また、作成したファイルをSVG等のテキストファイルで管理すれば、Terraform等のインフラコードと共にリポジトリ管理できるので、Infrastructure as Codeの流れとともに今後、ますます活用の幅が広がりそうです。
undefined と null の使い分け

JavaScript の `undefined` と `null` について、違いを解説している記事はいくつかありますが、具体的な使い分けには触れられないことが多いようです。

そこで、私が意識している 違い・使い分け を表にまとめてみました。`…` の部分には `undefined` や `null` が入ると思ってください。

||`undefined`|`null`|
|---|---|---|
|意味|**変数・プロパティ**が未設定|**値**が無効（利用可能な値がない）|
|変数： `variable = …`|`variable` を未初期化の状態にする [^1]|`variable` が有効な値を持たないことを表す|
|プロパティ： `object.prop = …`|`object.prop` の値をクリアする [^1] [^2]|`object.prop` が有効な値を持たないことを表す|
|関数の返り値： `return …` [^3]|関数から値を返さずに戻る|関数の結果として、無効な値を返す|
|関数の引数： `func(…)` [^3]|引数の省略を表す|引数として、無効な値を渡す [^4]|

[^1]: 「未初期化」であることが重要な場合以外は `null` を使うべき
[^2]: プロパティ自体を削除するには、`delete object.prop` を使う
[^3]: `undefined` の場合は、`…` の部分を空に（省略）する
[^4]: 引数が `null` という値を持つ点で、`undefined` とは異なる

これが絶対というわけではありませんが、迷った時に参考にしてみてはいかがでしょうか。
graphql-rubyでpolymorphicを表現する

# はじめに
最近、graphql-rubyでAPIを実装しています。
Railsでは、モデルの関連付けにポリモーフィックという便利な機能があります。
これをUnionTypeを使ってgraphqlでも表現する方法について説明します。
# やりたいこと
UserテーブルとPetShopテーブルがDogテーブルのownerableでポリモーフィックな場合を考えます。graphqlでdogを取得するときに、その所有者であるownerable(user or pet_shop)のカラムも一緒にとってこれるようにする。
# ポリモーフィックではない場合
まず復習をかねて、通常の関連付け(belongs_toとかhas_manyとか)の場合を考えてみます。
以下のようにUserとDogが1対多だとします。

```user.rb
Class User < ApplicationRecord
  has_many: dogs
end
```
```dog.rb
Class Dog < ApplicationRecord
  belongs_to: user
end
```
## ObjectType
モデルで定義した関連付けをgraphql-rubyで表現するには、ObjectTypeを以下のように書きます。

```user_type.rb
Class UserType < Types::BaseObject
  field :id, ID, null: false
end
```
```dog_type.rb
Class DogType < Type::BaseObject
  field :name, String, null: false
  field :user, ObjectTypes::UserType, null: false # userとの関連付け
end
```
上記のようにObjectTypeを定義すると、dogオブジェクトを返す際に一緒に関連付けられたuserオブジェクトも取得してくれます。

# ポリモーフィックの場合
続いて、ポリモーフィックで関連づけられた場合を考えてみます。
userの他にpetShopもdogを所有しています。
## モデルの関連付け
ポリモーフィックの場合、Rialsモデルの関連付けは以下のようにかけます。

```user.rb
Class User < ApplicationRecord
  has_many :dogs, as: :ownerable
end
```
```pet_shop.rb
Class PetShop < ApplicationRecord
  has_many :dogs, as: :ownerable
end
```
```dog.rb
Class Dog < ApplicationRecord
  belongs_to :ownerable, polymorphic: true
end
```
## ObjectType
続いて、Objectタイプを定義します。
petShopオブジェクトが追加されたのと、dogTypeのfieldがuserではなく、ポリモーフィックな関連付けを示すownerableに変更されています。

```user_type.rb
Class UserType < Types::BaseObject
  field :id, ID, null: false
end
```
```pet_shop_type.rb
Class PetShopType < Types::BaseObject
  field :id, ID, null: false
end
```
```dog_type.rb
Class DogType < Type::BaseObject
  field :name, String, null: false
  field :ownerable, UnionTypes::OwnerableType, null: false # ownerableとの関連付け
end
```
注意点はownerableのtypeがObjectTypesではなく、UnioTypesになっている点です。
UnionTypeはこれから定義していきます。
## UnioneType
 UnioTypeは、本記事の肝となる箇所です。dogTypeに定義したownerableをUnionTypeとして定義して、userTypeかpetShopTypeかを振り分けてくれます。

```ownerable_type.rb
module UnionTypes
  class OwnerableType < Types::BaseUnion
    # possible_typesで関連付けられうるタイプを宣言する
    possible_types ObjectTypes::UserType, ObjectTypes::PetShopType

   # 分岐処理を記述
    def self.resolve_type(object, _context)
      if object.is_a?(User)
        ObjectTypes::PostType
      elsif object.is_a?(PetShop)
        ObjectTypes::ReplyType
      end
    end
  end
end
```
上記のように書くことで、resolverで返す型を判断して、UserかPetShopを選んでくれます。(rubyっぽくはない感じはしますが...)
## Query
UnionTypeを使った場合は、queryも少し特殊な書き方をします。

```rb
query{
  dog(id: [dog_id]){
    id
    ownerable {
      __typename #型を指定する
      ... on User {
        id
      }
      __typename
      ... on PetShop {
        id
      }
    }
  }
}
```
上記のようにtypenameを指定することによってほしいownerを選択することができます。
Docker mysql sqlファイル実行されない

# はじめに

<font color="red">**以下実施してうまくいかない事象ありました！時間がある時調査する所存です！**</font>
<font color="orange">**上の補足です！ちなみにimageやvolum等削除でもうまくいきませんでした！**</font>
=> 調査というか分かったのは上の事象は、プロジェクトでmysqlのデータをマウントしていたのが原因のようでした。なのでdocker stopしてマウントされたローカルデータ削除で問題なく動くようになるかと、、(きっと　確か　再検証はしていません)

<font color="green">**DBコンテナ入ってsql直接打つ方が案外シンプルなのでは?等とか思ったりしました！**</font>



////////////////////以下は今まで書いていた内容です。//////////////////////////////////////

おっちょこちょい事件でした、、、

参考[dockerhub_mysql](https://hub.docker.com/_/mysql)

結論から言うと、コンテナを最初に作成するときにsqlファイル実行されるので、
コンテナ削除までしましょうってことでした！！
コンテナストップまでではなくコンテナ削除まで!
ちなみに、イメージの削除までは行わなくて良いっぽいですね！

なので行う処理は以下みたいな感じです！

**:older_man_tone3:sqlコンテナ削除で再度コンテナ構築まで**

a725b2d62fceは自分のものを

`$ docker ps`
`$ docker stop a725b2d62fce`
`$ docker rm a725b2d62fce`
`$ docker-compose up --build -d`

**:older_man_tone3:sqlコンテナ入る**

602a4868b08bは自分のものを

`$ docker exec -i -t 602a4868b08b bash`

**:older_man_tone3:sqlログインする**
`$ mysql -u root -p`
パスワード以下のものならexample

**:older_man_tone3:コンテナ入っての確認**

`$ SHOW DATABASES;`
`$ use mydb01;`
`$ SHOW TABLES;`


# 本文引用

>When a container is started for the first time, a new database with the specified name will be created and initialized with the provided configuration variables. Furthermore, it will execute files with extensions .sh, .sql and .sql.gz that are found in /docker-entrypoint-initdb.d. Files will be executed in alphabetical order. You can easily populate your mysql services by mounting a SQL dump into that directory and provide custom images with contributed data. SQL files will be imported by default to the database specified by the MYSQL_DATABASE variable.


# google翻訳

コンテナが初めて起動されると、指定された名前の新しいデータベースが作成され、提供された構成変数で初期化されます。 さらに、/ docker-entrypoint-initdb.dにある拡張子.sh、.sql、.sql.gzのファイルを実行します。 ファイルはアルファベット順に実行されます。 SQLダンプをそのディレクトリにマウントすることでmysqlサービスを簡単に作成し、提供されたデータを含むカスタムイメージを提供できます。 SQLファイルは、デフォルトでMYSQL_DATABASE変数で指定されたデータベースにインポートされます。

# 大事なところ

<font color=red>**コンテナが初めて起動されると、指定された名前の新しいデータベースが作成され、提供された構成変数で初期化されます。さらに、/ docker-entrypoint-initdb.dにある拡張子.sh、.sql、.sql.gzのファイルを実行します。**</fotn>

# 構成ファイル(必要部分のみ)

docker-compose.ymlの記述。以下ピンポイントのみ

```.docker-compose.yml
version: '3'
services:
  mysql:
    container_name: sample-mysql1 #作成されていると出来ないので新しく作成する場合ここの名前を変更
    build: ./mysql/ #mysqlのDockerfileを使用してコンテナ
    volumes:
      - ./mysql/initdb.d:/docker-entrypoint-initdb.d # ./mysql/initdb.dは入れたいフォルダ名パス。
    environment:
      MYSQL_DATABASE: mydb01 #はじめに作成します！データベース
      MYSQL_ROOT_PASSWORD: example # これでmysqlのrootユーザー exampleパスで入れる
    restart: always
```

mysql/initdb.d/Sample.sqlの中　Sample.sqlだけ書いているが複数あっても良い

```.Sample.sql

CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    email VARCHAR(255) NOT NULL,
    password VARCHAR(255) NOT NULL,
    created DATETIME,
    modified DATETIME
);

INSERT INTO users (email, password, created, modified)
VALUES
('cakephp@example.com', 'secret', NOW(), NOW());
```
IISログのとりあえずの確認(Excel & COPYコマンド)

# はじめに
ある期間のシステムへのアクセス状況の把握のためにIISログを分析することになりました。
分析対象のIISでは1日ごとに1つログファイルがあり、一つずつ分析するのが面倒でした。
また会社の自分のPC（Windows）では管理者権限がなく、ツールのインストールにはいろいろ手続きがあり面倒という事情がありました。
このような状況でとりあえず簡単に分析する方法を検討しました。

# 方法
1. IISログを特定のディレクトリに集める
	適当なローカルディレクトリにIISログ（複数ファイル）を配置する

2. Copyコマンドで1ファイルにマージする
	copy "*.log" "all.logs" 
	こんな感じのコマンドで、1.で配置した複数のIISログ(*.log)が一つのファイル(all.logs)にマージされます。

3. Excelにインポートする
	Excelでおなじみの方法でファイル（all.logs）を取り込む。（スペース区切りファイルとして認識させる）
あとはフィルタや並び替え、ファイル毎にあるヘッダなどを取り除けば準備完了です。


こんな感じで使い慣れたExcelでとりあえずの分析が可能となりました。
私のようにこれで十分な現場もあるかもしれません。