OmniAICreator/Qiita-1.07M huggingface dataset:
【仕事効率化】Pythonでファイル名を一括変更する方法

## はじめに
皆さんは大量のテキストファイルや画像ファイルのファイル名を一括変更したいときはありませんか？今回はそんな「ファイル名を一括で変更する方法」について解説していきます。

## 目次
1. [事前準備](#1-事前準備)
1. [リネームするには](#2-リネームするには)
1. [実際に一括でファイル名を変更してみる](#3-実際に一括でファイル名を変更してみる)
1. [最後に](#4-最後に)

## 1. 事前準備
リネームするファイルを用意します。ファイルはテキストファイルや画像ファイル、音楽ファイル、動画ファイル何でも大丈夫です。お好きなファイルを用意しましょう。
　↓↓　今回は画像ファイルを用意しています　↓↓
![qiita_rename_before.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/860879/c3cc4cf4-3bb9-a40a-a1ca-0f40efadb356.png)
:warning: 注意 :warning:
失敗しても大丈夫なように必ずデータのバックアップをとっておきましょう！！
![qiita_rename_backup.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/860879/94acf24d-35b6-7a5e-3001-d4e8a004d940.png)

## 2. リネームするには
ファイル名をリネームするには「os.rename()」関数を使用します。
第一引数に変更前のファイル、第二引数に変更後のファイルを指定することでリネームできます。

```python:
import os
os.rename(変更前ファイル, 変更後ファイル)
```

※ファイルが存在しない場合は、「FileNotFoundError」例外が発生します。
## 3. 実際に一括でファイル名を変更してみる

```python:
import glob
import os

# 拡張子.pngの画像ファイルを取得する
path = './dir/*.png'

# 画像ファイルを取得する
before_file_list = glob.glob(path)
print('変更前')
print(before_file_list)

# ファイル名を一括で変更する
for i, filename in enumerate(before_file_list, 1):
    os.rename(filename, f'./dir/icon{i}.png')

after_file_list = glob.glob(path)
print('変更後')
print(after_file_list)
```
↓↓　リネーム後の画像ファイルです　↓↓
![qiita_rename_after.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/860879/373d03e1-9101-b3b1-c999-e901ceeac8b9.png)
今回のサンプルソースはGithubにも掲載してあります。
Github：https://github.com/miyazakikna/RenameFile.git
## 4. 最後に
ここではPythonを使ってファイル名を一括変更する方法を解説しました。
シンプル、且つ、簡単に大量のファイル名を一括変更できるので個人的に重宝しております。
Chain of Responsibility Pattern

<font color="#00f">オブジェクトを順次よび出す</font>

[Design Pattarm MENU](https://qiita.com/old_cat/items/852d980bedb9100dd7e3)

以下のクラス構成で確認します

|クラス|説明|
|-----|----|
|abstract<br>chain.class|chain機能を定義<br>フィールド next は次のオブジェクトインスタンスを格納<br>set():次のオブジェクトをセット<br>doChain()を定義|
|chai1.class～chain3.class|chainを実装|
|user(Main.class)|動作確認|

＊user　他の開発者がこのパターンを利用する、という意味合いを含みます

```java:abstract_class_chain
abstract class chain{
   String name = this.getClass().getName();
   chain  next;             // 次のオブジェクトを格納

   chain set(chain next){
         this.next=next;
         return this.next;  // 次のオブジェクトを返す 
   }

   abstract void doChain();
   void  print(){
         System.out.println(name);}
}
```
```java:chain1.class
class chain1 extends chain{
      void   doChain(){
             print();
             if(next != null){next.doChain();}  // 次のオブジェクトのdoChain()を実行
      }
}
```
```java:chain2.class
class chain2 extends chain{
      void   doChain(){
             print();
             if(next != null){next.doChain();} 
      }
}
```
```java:chain3.class
class chain3 extends chain{
      void   doChain(){
             print();
             if(next != null){next.doChain();}
      }
}
```
```java:user(Main.class)
public static void main(String[] args){
   chain1 ch1 = new chain1();
   chain2 ch2 = new chain2();
   chain3 ch3 = new chain3();
   ch1.set(ch2).set(ch3);
   ch1.doChain();
}
```
kubectlでpod idを毎回grepするのが面倒な時のワンライナー

### ワンライナー

ラベルとかつければいい話ですが、ついてない環境で毎回podの番号を引くのが面倒なので覚書

```
kubectl get pods | grep ${your_pods} | head -n 1 | awk -F " " '{print $1}' | xargs -IXXX kubectl コマンド XXX
```

指定した名前の先頭に表示されたものをなんやかんやします。コマンドのところは `kubectl logs` とか好きなものを

### シェル

実際はもう少し複雑なことをpodsに対してしたいことが多いでしょうから、こんな感じにshellにしてしまうと楽だと思います

```sh:kube.sh
#Usage: ./kube.sh <grep key>
pod=`kubectl get pods | grep ${1} | head -n 1 | awk -F " " '{print $1}'`
#ここを好きにいじる
kubectl logs ${pod}
```

あとは例えば指定した全podログをとるとかならこんな感じ

```sh:kube_logs.sh
#Usage: ./kube_logs.sh <grep key>
pods=`kubectl get pods | grep ${your_pods} | awk -F " " '{print $1}'`

for pod in $pods
do
    #ここを好きにいじる
    kubectl logs ${pod} > ${pod}.log
done
```
Dockerの導入--その①--

## 背景

- 会社でDocker環境で開発しているが、よくわからないので自分で環境を作ってみようと思ったため。

## やること

- githubでリポジトリの作成
- 作成したリポジトリとローカル環境の同期
- githubとdockerの同期

## 必要なもの

- githubのアカウント
- dockerhubのアカウント

## 1.githubでリポジトリの作成
- githubの右上の「+」ボタンからリポジトリを作成。
 　これは普通に書いてある通りにすれば誰でもできる。

## 2.作成したリポジトリとローカル環境の同期
- リポジトリ作成後に表示されるURLをコピー
- ローカルで同期するディレクトリの作成

```terminal:init
# ~/Documents配下にディレクトリを作成（作成場所、ディレクトリ名は任意）
mkdir ~/Documents/Sample
# 作成したディレクトリに移動して、クローンする
cd ~/Documents/Sample
git clone [URL]
# これにより ~/Documents/Sample 配下に作成したリポジトリ名でディレクトリが作成される

```

ただし、ローカル出る程度ファイルをアップロードしたい場合は異なる。

```terminal
# ~/Documents配下にディレクトリを作成（作成場所、ディレクトリ名は任意）
mkdir ~/Documents/Sample
# 作成したディレクトリに移動し初期化する
cd ~/documents/Sample
git init
# ファイルを作ったり色々してコミットまで
touch sample.txt
git add -A
git commit -m "first commit"
# ローカルの情報を取得
git remote add origin [URL]
# 最後にpush
git push origin main
```
注：gitの初期ブランチがmasterではなく、mainになったので注意


3.githubとdockerの同期
- まずはgithubとの連携

 - Dockerhubにログイン後、右上の指紋マーク見たいのをクリックし「Account Setting」を選択
 - その後、Linked Accountsを選択し、あとは流れに沿って連携

- dockerhubでリポジトリの作成

 - メニューバーのRepositoriesを選択、その後CreateAccountを選択
 - NameとDescriptionを入力後下にあるgithubのマークをクリックするとどこのリポジトリと連携するか選べる
 
とりあえずこれで連携は完了。
AWS Direct Connect ってどういうサービス？

## 勉強前イメージ

オンプレとクラウドを仮想専用線のような機構で繋げる？

## 調査

### AWS Direct Connect とは

オンプレからAWSへの専用ネットワーク接続の構築をするAWSのサービス。
AWS とデータセンター、オフィス、またはコロケーション環境との間にプライベート接続を確立することができます。
ユーザのネットワークといずれかのロケーションとの間に専用のネットワーク接続を確立することができます。
→ AWSと専用線を引くの！？

### そもそもAWSと接続する方法

#### SSH接続

オンプレと接続する方法として一番簡潔に行えるのがこのSSH接続。
SSHを使うことによって通信を暗号化しセキュリティを担保します。
こちらは一般のインターネット接続をするので、通信要件がない場合、メンテナンス用途などに適しています。

#### VPN接続

オンプレのシステムの中にVPNルータを設置し、AWSに構築したVPCとVPN接続することで使用できます。
VPN接続でもインターネット回線を使用するため速度はベストエフォート。
ギチギチの要件がある場合は厳しいかもしれないです。

#### AWS Direct Connect

VPN接続でも要件が厳しい..ってときに使われるのがAWS Direct Connect。
オンプレのシステムからAWSまでインターネットを経由しないプライベート接続を実現出来ます。
それ故、他の回線状況の影響を受けないといったメリットがあります。
→ オンプレ から AWSまで回線引くってこと？？？

#### イメージ

- ユーザが準備する範囲 : オンプレ ～ AWS Direct Connectの接続ポイントまで
- AWS Direct Connectのサービス範囲 : AWS Direct Connectの接続ポイント ～ VPNまで

ユーザでAWS Direct Connectの接続ポイントまでは準備をしないといけません
しかしそれはなかなか難しいので、`AWS Direct Connectに接続するためのサービス` というのが各社あるので、
そちらを利用することで、以下のようになります。

- AWS Direct Connectに接続するためのサービスの範囲 : オンプレ ～ AWS Direct Connectの接続ポイントまで
- AWS Direct Connectのサービス範囲 : AWS Direct Connectの接続ポイント ～ VPNまで

要するに、あまり手間がかからない。

![AWS DirectUntitled Diagram.drawio - diagrams.net - Google Ch.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/758315d9-e409-ee29-3117-1db8bb5117dc.png)

## 勉強後イメージ

VPNじゃなくて本当にDirect Connectで専用線だったんだ....
要件が厳しいときは、こちらを使えばいいのね。

## 参考

- [AWS初心者 入門編「AWS Direct Connect」はどうやって使うの？](https://www.bit-drive.ne.jp/managed-cloud/column/column_19.html)
- [AWS：定額プラン](https://cloudpack.jp/service/aws/plan/direct-connect.html)
- [AWS Direct Connectならソニービズネットワークスの「AWS専用線接続サービス」](https://www.bit-drive.ne.jp/managed-cloud/special/adc/)
scrollviewで可変サイズUIViewがタップできなくてハマった

ContainerVCを用いて、
ボタンを押すと大きさが可変となるUIViewを作成していました。
このUIViewにはtapgestureRecognizer　あるいは　touchesbeganで
タップを検出できるようにしていました。
(参考　https://qiita.com/Kyome/items/d86cefa9dbd7bd2d7cf0)


ボタンが押されたときに

```a.swift
@IBOutlet weak var containerVCWidth: NSLayoutConstraint!
  self.myScrollView.contentSize.width += 100
  self.view.frame = CGRect(x: 0, y: 0, width: self.view.frame.width + 100, height: self.view.frame.height)
}
```
としていましたが、viewは大きくなるのにタップできない現象が発生しました。

##解決策
containerViewのwidthに関する制約を
outlet接続して、それもインクリメントする必要があったようです。

```a.swift
@IBOutlet weak var containerVCWidth: NSLayoutConstraint!

@IBAction func tappedButton(_ sender: Any) {
  self.myScrollView.contentSize.width += 100
  containerVCWidth.constant += 100
}
```
【AWS】AWS認定クラウドプラクティショナー試験前のメモ

勉強する中で、特に覚えにくかったことを断片的にメモ(圧倒的自分用)

#####フェデレーション
アイデンティティ(本人確認の情報)の連携のこと。
Gmail, Facebook, Twitterなどのログイン時の本人確認情報を、
スマホアプリの本人確認時に利用する仕組み。
SMAL, OpenIDといった技術が利用される。

#####Storage Gateway
ハイブリッドクラウドストレージサービス。
オンプレスから、様々なAWSのストレージを利用できるサービス。
接続には、NFS, SMB, iSCSIなどの標準ストレージプロトコルを使用。
S3, EBS, Backupといったストレージサービスの接続に利用できる。

#####Snowファミリー
ストレージサービス。
物理的デバイスであり、期間限定で利用者に貸し出される。

-Snowball
アタッシュケースのようなもの。
～80TBまでの大規模データ転送に適している。

-Snowmobile
トラック。
最大100PB(ペタバイト)のデータをコンテナトラックで輸送する。
エクサバイト規模のデジタルメディアの移行に適している。

#####AWS X-Ray
アプリケーション分析・デバックツール。
マイクロサービス間の依存関係を可視化、詳細なトレースデータの提供。

#####AWS Congnito
スマホアプリなどのユーザーアクセスに対するID発行管理サービス。

#####Amazon Macie
個人情報確認サービス

#####アセット管理
アセットとは、設備や機器などの資産のこと。

#####Amazon Lex
チャットボットなどの作成ができるサービス。

#####Amazon Comprehend
メールやツイートの文章を判別し、分類できるサービス。

#####Amazon EC2 Auto Scalingグループ
複数のアベイラビリティゾーンでインスタンスの追加や移動ができる。
移動ができる、ってのはポイントのひとつ。

#####Amazon Systems Manager
AWSリソースをグループ化して可視化できるサービス。
アプリやサービスの運用実態を把握することができる。

#####AWS Service Catalog
企業独自のコンプライアンス要件を管理できるCloudFormationテンプレートのまとまり。
コンプライアンス要件を満たしたリソースのプロビジョニングができる。

#####TAM
テクニカルアカウントマネージャの略。
AWSサポートという技術サポートプランで、最上位プランにあたるエンタープライズサポートプランには、このTAMと直接連絡を取ることができる。

#####Amazon Inspector
自動化されたセキュリティ評価サービスにより、 AWS にデプロイされたアプリケーションのセキュリティとコンプライアンスの改善をサポートする。
https://aws.amazon.com/jp/inspector/
Golang api get

Golangを勉強しています。

## やること

 - GolangでRakutenRapidApiを叩く
 - APIKeyをconfig.iniに設定して、main.goファイルから呼び出す。
 - さらに関数を別ファイルに切り分けmain.goファイルから呼び出す。

### 今回使うパッケージ
 - "fmt"
 - "io/ioutil"
 - "net/http"
 - "log"
 - "os"
 - "gopkg.in/ini.v1"
 
#### api
RakutenRapidApiに提供されている[FearAndGreed Indexを取得するAPI](https://api.rakuten.net/rpi4gx/api/fear-and-greed-index)を使用させていただきます。

クエリもなくレスポンスは１種類のみです。


## config.ini config.go
ルートディレクトリにconfig.iniを作成し、api_keyを設置します。

```
//config.ini
[fgi]
api_key = XXXXXXXXXXXXXXXXXXXXXX
api_host = XXXXXXXXXXXXXXXXXXXXXX
```

```
//config.go
package config

import (
	"log"
	"os"

	"gopkg.in/ini.v1"
)

type ConfigList struct {
	FgiAPIKey  string
	FgiAPIHost string
}

// Config グローバル定義
var Config ConfigList

func init() {
	cfg, err := ini.Load("config.ini")
	if err != nil {
		log.Printf("Failed to read file: %v", err)
		os.Exit(1)
	}

	Config = ConfigList{
		FgiAPIKey:  cfg.Section("fgi").Key("api_key").String(),
		FgiAPIHost: cfg.Section("fgi").Key("api_host").String(),
	}
}

```

structを作成して、 ConfigListに先ほど設定したconfig.iniファイルのkey,hostを
.String()で文字列として格納します。

## main.go

```
package main

import (
	"fmt"
	"io/ioutil"
	"net/http"

	"index-indicator-apis/config"
)

func main() {

	url := "https://fear-and-greed-index.p.rapidapi.com/v1/fgi"

	req, _ := http.NewRequest("GET", url, nil)

	req.Header.Add("x-rapidapi-host", config.Config.FgiAPIHost)
	req.Header.Add("x-rapidapi-key", config.Config.FgiAPIKey)

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := ioutil.ReadAll(res.Body)

	fmt.Println(string(body))

}
```
"net/http"の http.NewRequestでGETして、Header.Addで先ほど作成したConfig(ConfigList)のKeyとHostを呼び出します。

ターミナルで実行

```
$ go run main.go

{"fgi":{"now":{"value":63,"valueText":"Greed"},"previousClose":{"value":56,"valueText":"Greed"},"oneWeekAgo":{"value":40,"valueText":"Fear"},"oneMonthAgo":{"value":56,"valueText":"Greed"},"oneYearAgo":{"value":83,"valueText":"Extreme Greed"}}}
```

レスポンスを得ることができました。


## 別ファイルに関数を切り分ける

main.goファイルはよりシンプルに実行するメソッドや関数のみを記述するのがGOの設計思想みたいです。
そこでfgi.goファイルをつくり関数を切り分けました。

```
// fgi.go
package fgi

import (
	"fmt"
	"io/ioutil"
	"net/http"

	"index-indicator-apis/config"
)

func DoRequest() {

	url := "https://fear-and-greed-index.p.rapidapi.com/v1/fgi"

	req, _ := http.NewRequest("GET", url, nil)

	req.Header.Add("x-rapidapi-host", config.Config.FgiAPIHost)
	req.Header.Add("x-rapidapi-key", config.Config.FgiAPIKey)

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := ioutil.ReadAll(res.Body)

	fmt.Println(string(body))

}

```

```
//main.go
package main

import "index-indicator-apis/fgi"

func main() {
	fgi.DoRequest()
}

```


以上です！
次はさらに関数をメソッド化して引数を渡して見たいと思います！
Navigation ComposeでActivityへ遷移させる

Navigation Compose で Activity への遷移をするにはどうすればいいのか調べたのでそれについて書いていこうと思います。
Navigation Compose については[以前記事を書いた](https://qiita.com/Nabe1216/items/f329e981f0da76c1d221)のでそちらをみてください。

⚠️ここでの Navigation Compose のバージョンは 1.0.0-alpha02 を使用しているので、Stable になるまでに破壊的な変更が入る可能性もあります

## Navigation Compose に Activity の定義を追加

```kotlin
val navController = rememberNavController()
NavHost(navController = navController, startDestination = "home") {
    composable(route = "home") {
        HomeScreen(...)
    }
    composable(route = "settings") {
        SettingsScreen(...)
    }

    activity(id = R.id.nav_oss_licenses) {
        activityClass = OssLicensesMenuActivity::class
    }
}
```

今回は [OSS Licenses Gradle Plugin](https://github.com/google/play-services-plugins/tree/master/oss-licenses-plugin) の `OssLicensesMenuActivity` 遷移を定義します。
id は xml に定義しておき、`NavGraphBuilder` の [activity()](https://developer.android.com/guide/navigation/navigation-kotlin-dsl#activity) で遷移先の Activity を定義します。

## 遷移させる

```kotlin
Button(
    onClick = {
        navController.navigate(R.id.nav_oss_licenses)
    }
) {
    Text(text = "Licenses")
}
```

遷移させるには `NavController#navigate` に定義したときの id を渡すだけで遷移できます。

　　
　　
Navigation は Kotlin DSL で定義することができ、Navigation Compose でもその方法が使えるので、Activity の遷移も Navigation Compose で行えました。
Navigation を Kotlin DSL で定義するのは[公式のドキュメント](https://developer.android.com/guide/navigation/navigation-kotlin-dsl)があるので参考にしてみてください。
conoha VPSを立ち上げてsshするまで

#概要
備忘録として書いております。
タイトル通りconoha VPSを立ち上げて、基本的な設定(ユーザー追加、rootログイン禁止、ssh、ファイアウォール)を行った後、visual studio codeのSSH機能でアクセスしてみます。

#環境
Mac Book Pro(macOS Catelina 10.15.1)
Conoha VPS (ubuntu RAM 512MB)

##1. VPSログイン
conohaでVPSを立ち上げた後、macのターミナル上でrootログイン(パスワードでログイン)します。

VPSのIPはxxx.xxx.xxx.xxxとして記載しています。
ログイン時にconohaのHPで指定したrootパスワードを聞かれますので打ち込んで下さい。

```:Mac/terminal
$ sudo ssh xxx.xxx.xxx.xxx
```

##2. ユーザー追加
root以外に実際に使うユーザーを追加します。
こちらもここでは新しいユーザー名をYYYYとします。

```:VPS
$ sudo useradd -m YYYY
$ sudo passwd YYYY
```
１行目useraddのオプション-mで、ホームディレクトリを作成させます。


そして、作成したユーザーYYYYにsudo権限をつけます。

```:VPS
$ gpasswd -a YYYY sudo
$ id YYYY
```
オプション-aは上書きという意味です。
２行目でsudo権限がついているか確認します。(なので実行しなくても大丈夫です。)

この段階で一度VPSからログアウトし、今作成したYYYYにSSHログインできるかチェックしておきます。

```:Mac/terminal
$ sudo ssh YYY@xxx.xxx.xxx.xxx
```

これで無事VPSにログインできればここまではOKです。

## 3. rootでSSHログイン禁止にする

```:VPS
sudo vim /etc/ssh/sshd_config
```
PermitRootLoginをnoにしてください。
実行後、SSHのconfigをrestartします。

```:VPS
$ sudo service sshd restart
```
これでrootログインができなくなりました。
(できなくなっているか確認が必要であれば適宜行ってください。)

## 4. 公開鍵認証を設定
下記で鍵を作成し、VPSに公開鍵を転送します。
鍵の名前はここではmy-ssh-keyととりあえずしています。

```:Mac/terminal
$ cd ~/.ssh
$ ssh-keygen -t rsa -f my-ssh-key
$ chmod 600 conoha-isucon
$ ssh-copy-id -i ~/.ssh/my-ssh-key.pub YYYY@xxx.xxx.xxx.xxx
```

一番下のコマンドssh-key-idで作成した公開鍵を転送します。

また、下記コマンドを叩いてconfigを作っておくとログインが楽になります。
(visual studio codeのremort SSHを使う際は必ず必要になります。)

```:Mac/terminal
$ vi ~/.ssh/config

###viで下記を記入。ここではHostをconohaとしている。###
Host conoha
  Hostname xxx.xxx.xxx.xxx
  User YYYY
  IdentityFile ~/.ssh/my-ssh-key
  Port 22
```

これでMacのterminal上でssh conohaと叩くだけでVPSにログインができるようになりました。

ここでVPSにログインして、パスワードログインができないように設定を変えます。

```:VPS
$ sudo vi /etc/ssh/sshd_config
```
PasswordAuthenticationをnoにしてください。

また、ついでにポート番号を22(SSHのデフォルト)から変更しておくと良いです。
(# Port 22の番号を任意の49152-65535のどれかに変更。
　変更後はmac上のconfigファイルのポートも22から変更しておきます。）


その後、

```:VPS
$ sudo service sshd restart
```

でSSHのconfigをrestartします。

##5. ファイアウォールの設定
ここではufwの設定をします。

```:VPS
$ sudo ufw enable  # ufwを有効化

$ sudo ufw default deny  # デフォルトでは拒否設定

$ sudo ufw allow https/tcp
$ sudo ufw allow http/tcp
$ sudo ufw allow ftp
$ sudo ufw allow (SSHのポート番号)

$ sudo ufw reload  # 設定を反映させる

$ sudo ufw status verbose  # 必要であればこのコマンドで設定を確認する。
```

これでVPSの(最低限の)設定が全て完了しました。

##6. Visual Studio Codeでログイン
拡張機能のremort SSHを使います。
特筆することはないですが、私が一度躓いたので書いています。
ログインする際に
"Could not establish connection 〜"
と出てきました。

VScodeの設定のremote.SSH.useLocalServerをfalse(デフォルトではtrue?)にすることで解決しました。
Bash 以外のシェルを使用しているとこの問題が発生するらしいです。
UbuntuにAnacondaで構築するTensorFlow-GPU環境【3】〜Anaconda仮想環境作成編〜

#TensorFlowのGPU版（tensorflow-gpu）を動かすために必要なこととは？
1. Deep Learningを行う計算力(compute capability)のある比較的新しいGPU（nVidia社製）を搭載していること。
2. GPUの適切なドライバがOSに入っていて、使用可能な状態になっていること
3. tensorflow-gpuやGPUのドライバ（CUDA）、Deep Learning用のライブラリ（cuDNN）を入れる環境を作るため、Anacondaがインストールされていること。👈**今ここ**
4. Pythonや必要なライブラリがバージョンの互換性を持っていること

#この記事ののゴール
AnacondaをインストールしてGPUを動かす土台となる仮想環境を作ること

#仮想環境とは？
例えば、通常ではPythonをインストールしたらpipコマンドでライブラリをインストールしてプログラムを動かす『環境』を構築していきます。ライブラリ間にはバージョンによって互換しないものがあったり、煩雑になったりするのでひとつの環境になんでもかんでも入れていくのは好ましくはないです。そこで用途ごとに仮想的な環境を作成してそこに必要なものだけインストールしていくというのが便利です。今回はtensorflow-gpuを動かすためという用途で仮想環境をひとつ作りましょう。

#Anacondaのインストール
archコマンドを実行すると、どのアーキテクチャ用のディストリビューションをインストールすれば分かります。この場合は×86_64と判明したので、正しく選択してシェルスクリプトをダウンロードする。

```Bash
$ arch
x86_64
```
シェルスクリプトを実行してAnacondaをインストールしてください（記事がいっぱいあるのでここは割愛します）。
**注意点⚠️：起動時にアナコンダのbase環境をactivateするように.bashrcを編集するかを問う項目もあるはずなので、やたらとEnterを押さないようにしてください（自動Activateには危険な部分もあるので考えてから）。**
.bashrcを書き換えた場合：ターミナルを再起動したとき以下のようになっているはずです。

```Bash
(base)$ 
```
.bashrcを書き換えなかった場合: 次のコマンドでbase環境をactivateします。

```Bash
$ conda activate
(base)$ 
```

condaコマンドが使えるか確認してみましょう（-Vはcondaコマンドのバージョンを確認するオプション）。

```Bash
(base)$ conda -V
conda 4.8.4
```

conda create -n (仮想環境の名前)でライブラリが何も入っていないまっさらな仮想環境を作成することができる(例ではibio_envという名前の仮想環境を作成しています)。

```Bash
(base)$ conda create -n ibio_env
```

次のようにして仮想環境をactivateする。

```Bash
(base)$ conda activate ibio_env
```
conda listコマンドで、ライブラリが何も入っていないことを確認できます。

```Bash
(ibio_env)$ conda list
# packages in environment at /home/usr/anaconda3/envs/ibio_env:
#
# Name                    Version                   Build  Channel
```


AnacondaにTensorFlowなどのライブラリをインストールする土台となるまっさらな仮想環境を建てることができました。

#Anacondaで仮想環境を作成できたら
次はtensorflow-gpuを始め、様々なライブラリを互換性に気をつけながらインストールしていきます。次の記事で解説していきます。
[【４】UbuntuにAnacondaで構築するTensorFlow-GPU環境構築〜CUDA、cuDNNインストール編〜](https://qiita.com/captain-sadami/items/c9be816856c57ef0ae52)
メモ SQLserverのVarchar型のOutputパラメータの文字数について

# ストアドのOutputパラメータの文字数について

ストアドでVarchar型でOutputのパラメータを受け取ろうとしていましたが、
桁数の指定が漏れていたため１桁しか返してこなかった話。

試そうとしたコードは、以下になります。

```vb
Dim conn As SqlClient.SqlConnection
Dim comm As New SqlClient.SqlCommand
comm.Connection = conn
Dim sSQL As String = "ストアド"
comm.CommandText = sSQL
comm.CommandType = CommandType.StoredProcedure
comm.Parameters.Clear()
comm.Parameters.Add("@Input変数", SqlDbType.Int).Direction = ParameterDirection.ReturnValue
comm.Parameters.Add("@Output変数", SqlDbType.Varchar).Direction = ParameterDirection.Output
```

10桁ある文字数の1桁目しか返していないことから
色々調べたところ桁数の指定が必要だとのことでした。

# 桁数を指定して受け取ろう

以下のコードに修正しました。

```vb
comm.Parameters.Add("@Output変数", SqlDbType.Varchar, 10).Direction = ParameterDirection.Output
```

10という桁数を指定することで正しい文字列が返ってきました。

※参考
[VB2005 + SQL ストアドでのパラメーター受け渡し](https://netsystem.jpn.org/t_nary/vb-net/vb2005-sql-%E3%82%B9%E3%83%88%E3%82%A2%E3%83%89%E3%81%A7%E3%81%AE%E3%83%91%E3%83%A9%E3%83%A1%E3%83%BC%E3%82%BF%E3%83%BC%E5%8F%97%E3%81%91%E6%B8%A1%E3%81%97/)
２段階認証と多要素認証の違いを理解した気になってみる

今年も7Payはじめ、いろいろなセキュリティインシデントがありました。キーワードとして「２段階認証」が出てきたのですが、この「２段階認証」と「多要素認証」の違いについてあいまいな部分があったので、自分なりに整理して理解した気になってみたので、纏めていきます。

# ２段階認証とは
- 英語で言うと`Two-step Authentication`
- ２つの認証方法を組み合わせて段階的に認証するのが、２段階認証
- 「パスワード」と「ワンタイムトークン」を同じ画面で入力して認証するのは２段階認証ではない（多要素認証ではある）

# 多要素認証とは
- 英語で言うと`Multi-factor authentication`、MFAと略される
- **認証の３要素**と言われるものがある。「知識要素」「所持要素」「生体要素」の３要素で、２要素以上で認証を行うのが、多要素認証
- 「パスワード」と「秘密の質問」は同じ知識要素の組み合わせなので、多要素認証ではない（２段階認証ではある）

# 認証の３要素とは
## 1. 知識要素（Something You Know）

### 認証するもの
- 本人だけが知っている知識を認証

### 代表的な認証方法
- パスワード
- PINコード
- 秘密の質問

## 2. 所持要素（Something You Have）
### 認証するもの
- 本人の所持している物を認証

### 代表的な認証方法
- 携帯電話
- ICカード
- キャッシュカード
- ワンタイム用トークン

## 3. 生体要素（Something You Are）
### 認証するもの
- 本人の身体的な特徴を認証

### 代表的な認証方法
- 指紋認証
- 掌形認証
- 音声認識
- 虹彩認識
- 網膜スキャン
- 静脈認証

※↑このあたりを深く掘り下げたいけど、話が脱線しそうなのでがまん。。。

## ２段階認証と多要素認証の例

|No.|ケース|段階数|要素数|認証要素|２段階認証|多要素認証|
|:---:|---|:---:|:---:|---|:---:|:---:|
|①|１つの画面にパスワード入力|1|1|知識要素|✗|✗|
|②|１つの画面にパスワードとワンタイムトークンを入力|1|2|知識要素＋所持要素|✗|◯|
|③|パスワード認証後、秘密の質問を入力|2|1|知識要素|◯|✗|
|④|パスワード認証後、ワンタイムトークンを入力|2|2|知識要素＋所持要素|◯|◯|
|⑤|パスワード認証後、指紋認証|2|2|知識要素＋生体要素|◯|◯|

## ２段階認証と多要素認証どちらが安全か
- 認証強度は「段階数」よりも「要素数」が重要となるので、多要素認証のほうが安全
- 上記の例で言うと、①は２段階認証でも多要素認証でもないので安全性が低い
- ②④⑤は２つの要素で認証しているので、③より安全性が高い
- ②④について
    - ②は知識要素と所持要素を同時に認証
    - ④は知識要素と所持要素を段階的に認証
    - ID/パスワードの組み合わせが突破される可能性は④のほうが高い
    - 「段階数」増やせば安全性が高まるということではなさそう  
- ⑤について
    - 生体要素の認証器の他人受入（False Acceptance）率が高い場合、安全性が低くなることがある

海外ではMFA・2FAという用語は良く使われますが、２段階認証という用語はほとんど使われていないようです。日本でよくこの用語が使われるのは、過去に「パスワード」＋「秘密の質問」が流行ったなごりではないかと言われております。２段階認証であっても多要素認証でなければ安全性が高いとは言えないので、今後はこのあたりを意識して、情報収集に気をつけていこうと思います。

# 参考
- [二段階認証の意味を問う　「7pay事件」を教訓に見直したい認証のハナシ](https://www.itmedia.co.jp/news/articles/1907/29/news022.html)
- [「二段階認証」の誤解を解く。「二要素認証」「多要素認証」と何が違うか](https://support.trustlogin.com/hc/ja/articles/360000497941--%E4%BA%8C%E6%AE%B5%E9%9A%8E%E8%AA%8D%E8%A8%BC-%E3%81%AE%E8%AA%A4%E8%A7%A3%E3%82%92%E8%A7%A3%E3%81%8F-%E4%BA%8C%E8%A6%81%E7%B4%A0%E8%AA%8D%E8%A8%BC-%E5%A4%9A%E8%A6%81%E7%B4%A0%E8%AA%8D%E8%A8%BC-%E3%81%A8%E4%BD%95%E3%81%8C%E9%81%95%E3%81%86%E3%81%8B)
- [「二要素認証」と「二段階認証」の違い](https://www.segunabe.com/2018/08/31/passclipnews180831/)
Googleドライブからの埋め込み動画がSafariで閲覧できない

# 問題点

* Webページに埋め込んだ Googleドライブ上の動画が、Safari で閲覧すると再生されない。
    * Chrome など、別のブラウザではふつうに再生できる。
    * YouTube にアップしたものを埋め込むと、Safari でも問題なく再生できる。
* 動画のサムネイルは表示されるが、再生ボタンを押すと、下のように真っ黒になってしまい、再生できない。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64391/121c9f09-4b32-d98f-bd11-42cb68701dfd.png)

## （参考）Googleドライブ上の動画の埋め込み

* 以前は、Googleドライブ上のコンテクストメニューから埋め込み用のURLを取得できたが、現在は若干面倒になっている。
* Gooleドライブで取得できる共有用のURLで動画を閲覧し、そのページの右上のプルダウンメニューから「アイテムを埋め込む…」を選ぶとHTMLコードをコピーできる。
    * いちいちこの操作をする必要はなく、以下のように書けば埋め込める。

```html
<iframe src="https://drive.google.com/file/d/{ファイルID}/preview" width="640" height="480"></iframe>
```

* 埋め込み用のHTMLコードを取得するための方法は、ちょいちょい仕様が変わる。

# 解決法

* Safariのセキュリティ設定に起因するので、サーバ側で回避することはできない。閲覧するユーザーに解決法の実行を促すしかない。

## 解決法１：別のブラウザで閲覧してもらう

* Chromeなどを使ってもらう。

## 解決法２：Safariのセキュリティ設定を変更してもらう

* **macOSのSafari**なら、環境設定 → プライバシー のタブを開き、Webサイトによるトラッキングの **サイト越えトラッキングを防ぐ** のチェックを外す。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64391/55db5aa3-9ad2-c842-0ad3-595743b8314c.png)

* **iOSのSafari**なら、設定 → Safari の プライバシーとセキュリティ のブロックにある、 **サイト越えトラッキングを防ぐ** のチェックを外す。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64391/492c6025-35c6-b579-f7ea-315049a445e8.png)

## 解決法３：ポップアウトして閲覧してもらう

* 動画右上のボタンから別ウィンドウ（タブ）にポップアウトしてもらえば、閲覧可能です。
    * ただし、Web上に埋め込まれた動画が、クリックすると真っ黒になってしまうという、コスメティックにダメっぽい問題は解決されません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64391/332f872e-e740-e6d5-e656-f1bbb1da014f.png)

# 素朴な疑問

* 同じ Google 系の YouTube は問題なく閲覧できるのはどうしてなのか、謎。Googleドライブの動画機能は、YouTubeの機能制限版という雰囲気で、トラッキングとか YouTube の方が激しくやっていそうなものだが……
vistaでquartus その48

# 概要

vistaでquartusやってみた。
qsysでniosやってみた。
fizzbuzzやってみた。

# サンプルコード


```
#include "sys/alt_stdio.h"

int main() {
  alt_putstr("Hello from Nios II!\n");
  int i;
  char buf[44];
  for (i = 1; i < 100; i++)
  {
	  if (i % 15 == 0)
	  {
		  alt_putstr("fizzbuzz ");
	  }
	  else if (i % 5 == 0)
	  {
		  alt_putstr("buzz ");
	  }
	  else if (i % 3 == 0)
	  {
		  alt_putstr("fizz ");
	  }
	  else
	  {
		  sprintf(buf, "%d ", i);
		  alt_putstr(buf);
	  }
  }
  while (1);
  return 0;
}


```


以上。
【調査中】Logistic回帰 @ scikit-learnのPenaltyとSolverのディープな関係

scikit-learnの`LogisticRegression`モジュールを利用した時にPenaltyとSolverの対応関係が分からず[公式ドキュメント](https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html)を調べましたが，一目で分かる状態になっておらず，しばし頭が混乱しました。。。そこでまずはPenaltyとSolverの対応/非対応関係を一覧表にまとめ，更に今後SolverやPenaltyの詳細な情報も追加していこうと思います。

# PenaltyとSolverの対応/非対応関係

|Penalty / Solver|newton-cg|lbfgs(default)|liblinear|sag|saga|
|:--|:--:|:--:|:---:|:---:|:---:|
|L1|×|×|○|×|○|
|L2(default)|○|○|×|○|○|
|Elasticnet|×|×|×|×|○|
|None|○|○|×|○|○|

# Penalty / Solverの解説
* 今後追加予定(調査中)
UbuntuにAnacondaで構築するTensorFlow-GPU環境【2】〜nVidiaドライバーインストール編〜


#TensorFlowのGPU版（tensorflow-gpu）を動かすために必要なこととは？
1. Deep Learningを行う計算力(compute capability)のある比較的新しいGPU（nVidia社製）を搭載していること。
2. GPUの適切なドライバがOSに入っていて、使用可能な状態になっていること。👈**今ここ**
3. tensorflow-gpuやGPUのドライバ（CUDA）、Deep Learning用のライブラリ（cuDNN）を入れる環境を作るため、Anacondaがインストールされていること
4. Pythonや必要なライブラリがバージョンの互換性を持っていること

#この記事のゴール
GPUに対してバージョンの合ったドライバーがOSに入っている状態を作る。

#二つのステップ
はじめ、GPUが既存のUbuntu標準ドライバー（nouveau）により画面がディスプレイに出力されています。計算の用途でGPUを用いるにはnVidiaのドライバーが必要です。
ドライバーをインストールするために二つのステップがあります。

**ステップ1: secure boot（セキュアブート）をオフにする（必要に応じて）**
**ステップ2: nVidiaのドライバーをインストールする**

では、順にクリアしていきましょう。

#ステップ1：セキュアブートをオフにする
セキュアブートは怪しいソフトを判定して動くことを許可しないようにする仕組みです。これが有効だとステップ2でOSにインストールするドライバーはサードパーティ製なので怪しいものではないのですがエラーを吐いてしまいます。
BIOSから無効にできる。以下参照。
https://ymgsapo.com/2019/02/26/keras-gpu-deep-learning/

#ステップ2：nVidiaのドライバをOSにインストールする。

まず、ubuntu-drivers-commonパッケージをインストールします。

```Bash
$sudo apt install ubuntu-drivers-common
```
ドライバをaptでインストールしたいが、公式のレポジトリには古いものしかないらしい（<https://qiita.com/ozota/items/28b7e1fbf5015f907638>)ので、次のコマンドで外部（サードパーティ）のレポジトリを追加します。

```Bash
$sudo add-apt-repository ppa:graphics-drivers/ppa
```

 次のコマンドを忘れずに行いましょう。

```Bash
$sudo apt update
```

次のコマンドでGPUに対して適切なドライバがどれかを表示させます。

```Bash
$ubuntu-drivers devices
== /sys/devices/pci0000:00/0000:00:02.0/0000:02:00.0 ==
modalias : pci:v000010DEd000013BAsv0000103Csd00001097bc03sc00i00
vendor   : NVIDIA Corporation
model    : GM107GL [Quadro K2200]
driver   : nvidia-driver-450 - distro non-free
driver   : nvidia-driver-435 - distro non-free
driver   : nvidia-driver-410 - third-party free
driver   : nvidia-driver-450-server - distro non-free recommended
driver   : nvidia-driver-415 - third-party free
driver   : nvidia-driver-390 - distro non-free
driver   : nvidia-driver-418-server - distro non-free
driver   : nvidia-driver-440-server - distro non-free
driver   : nvidia-340 - distro non-free
driver   : xserver-xorg-video-nouveau - distro free builtin
```
今回、”recommended”がついたドライバー（nvidia-driver-450-server）を次のコマンドでインストールしました（一応ですが、常にrecommendedが良いとは限りませんので興味があったら調べてみてください）。
**注意点⚠️: ひとつのOSに何個もドライバーを入れるのはバッティングの可能性があり、好ましくありません。ドライバーは画面出力を司っているので、間違えて入れてしまったものを消そうとしても拒否されてややこしかったです（私はOSを再インストールしました）。よく確認のうえ、ドライバーは一つだけインストールしてください。**

```Bash
$sudo apt -y install nvidia-driver-450-server
```
再起動をします。

```Bash
$sudo reboot
```
正常にドライバーがインストールされた場合は次のコマンドで表が出てくるはずです。

```Bash
$nvidia-smi
```
お疲れ様でした、今回はGPUを計算の用途に用いるために必要なドライバーをインストールしました。
#二つのステップがクリア出来たら
次はTensorFlowを動かす環境を作るため、Anacondaのインストールからスタートします。次の記事で解説していきます。
[【３】UbuntuにAnacondaで構築するTensorFlow-GPU環境構築〜Anaconda仮想環境作成編〜](https://qiita.com/captain-sadami/items/a026130c2fbb3513b6e2)
PHPStorm 初期設定メモ

PHPStormを触って四日間で設定したことをメモする

### 日本語化
2020.1から下のプラグインを入れれば日本語化されるようになったらしい
- Japanese Language Pack EAP

### Laravel対応
いくつかブラグインを追加した
- Laravel
  別途設定が必要
  設定 - 言語 & フレームワーク - PHP - Laravel
  Enable plugin for this project
  User AutoPopup for Completion (use at own risk eg together with Symfony2)
- .env files support

### コード整形
ファイル保存時にコード自動整形するためにプラグインを追加
- Save Actions
今回はBladeを除くPHPファイルのみ保存時にフォーマットされるようにした
![1d4de035b098bca979016924fe25ba05.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415555/1ec88ecd-3222-a6f1-fc5a-053c7d0c2865.jpeg)


### その他
- GitToolBox
- Rainbow Brackets
- Atom Material Icons
- ターミナルをPowershellに切り替える

### 見た目
設定 - 外観&振る舞い - Appearance - Window Options Widescreen tool window layout

今後も何か入れたらメモしていきたい
Webアプリのセキュリティ対策まとめ

# レスポンスヘッダ
```http
Content-Type: [適切な値]
X-XSS-Protection: 1; mode=block
X-Frame-Options: DENY
X-Content-Type-Options: nosniff
Cache-Control: private, no-store, no-cache, must-revalidate
Pragma: no-cache
Content-Security-Policy: default-src 'self'  (一例)
Strict-Transport-Security: max-age=31536000
```

# metaタグまとめ
```html
<meta charset="utf-8"/>
```

# XSS-クロスサイト・スクリプティング-(HTML JavaScript)
- HTMLのエスケープ
- HTTPレスポンスに文字エンコーディングを明示
- X-XSS-Protectionレスポンスヘッダの使用
- 入力値のバリデーション
- クッキーにHttpOnly属性を付与
- TRACEメソッドの無効化(古いブラウザの脆弱性)

# SQLインジェクション(DBMS)
- プレースホルダによるSQL文組み立て
- 詳細なエラーメッセージの非表示
- 入力値のバリデーション
- データベースの権限設定

# CSRF-クロスサイト・リクエストフォージュリ-
- CSRFトークンの埋め込み
- パスワード再入力
- Refererのチェック(Refererを送信しないユーザーもいる)
- 「重要な処理」の実行後に、登録済みメールアドレスに通知メールを送信
- カスタムリクエストヘッダを付与

# クリックジャッキング
- X-Frame-Optionsヘッダの使用
- 「重要な処理」の実行後に、登録済みメールアドレスに通知メールを送信

# セッションハイジャック
- 安全性の高いセッションIDを使用
- セッションIDをURLではなくクッキーに埋め込む
- 認証成功時にセッションIDを変更
- 認証前にはセッション変数に秘密情報を保存しない

# オープンリダイレクト
- リダイレクト先のURLを固定
- リダイレクト先のURLを直接指定せず番号で指定
- リダイレクト先のドメイン名をチェック

# HTTPヘッダ・インジェクション
- 外部からの入力をHTTPレスポンスヘッダとして出力しない
- リダイレクトやクッキー生成を専用APIにまかせる
- ヘッダ生成するパラメータの改行文字をチェック
 
# クッキー
- 書き換えられて困る情報を保存しない
- セッションIDにセキュア属性を付与
- セキュア属性を付与出来ない場合はセキュア属性を付与したトークンを追加

# メールヘッダ・インジェクション
- メール送信には専用のライブラリを使用
- 外部からのパラメータをメールヘッダに含ませない
- 外部からのパラメータには改行を含まないようにメール送信時にチェック

# ディレクトリ・トラバーサル
- 外部からファイル名を指定できる仕様を避ける
- ファイル名にディレクトリ名が含まれないようにする
- ファイル名を英数字に限定する

# OSコマンド・インジェクション
- OSコマンド呼び出しを使わない実装方法を選択
- シェル呼び出し機能のある関数の利用を避ける
- 外部から入力された文字列をコマンドラインのパラメータに渡さない
- OSコマンドに渡すパラメータを安全な関数によるエスケープ
```php
// 内部でシェルを呼び出す関数
system()
exec()
passthru()
proc_open()
popen()
shell_exec()
```

# ファイル
- アップロードファイルを公開ディレクトリに保存しない
- アップロードファイルのバリデーション(拡張子、ファイルサイズ、色数)
- アップロードファイルを画像として読み込めるか
- アップロードファイルのウィルス・スキャン
- ダウンロードファイルのContent-Typeを正しく設定
- レスポンスヘッダX-Content-Type-Options: nosniffを指定
- 必要に応じてContent-Dispositionヘッダを設定
- PDFはブラウザ内で開かずダウンロードを強制する(IE)
- PDFをobject要素やembed要素では開けないようにするためにPOSTメソッドのみ認可(IE)

# キャッシュからの情報漏洩
- レスポンスヘッダCache-Controlの使用
- キャッシュサーバーのキャッシュ制御の適切な設定
- URLに乱数値を付与

# JSONに関する脆弱性
- JSONエスケープを行う
- MIMEタイプ(application/json)を設定する
- 小なり記号などをUnicodeエスケープする
- XMLHttpRequestなどCORS対応の機能だけから呼び出せるようにする
- JSONPを使用しない
- リクエストヘッダX-Requested-With: XMLHttpRequestの確認

# CORSに関する脆弱性
- Access-Control-Allow-Originを適切に設定する

# その他の脆弱性
- ファイルインクルード攻撃
- evalインジェクション
- 安全でないデシリアライゼーション
- XML外部失態参照
- 競合状態の脆弱性(Java)
- Dom Based XSS
- Webストレージの不適切な使用
- postMessage呼び出しの不備
-
Elastic BeanstalkでLaravelとNuxt.jsをデプロイした時のメモ

# 概要
- 構成
　![undefined.jpg](https://s3.qrunch.io/29e4da7d200aca0670a64b6fbb6325bf.png)
- Elastic BeanstalkでEC2とRDSを立てる
- ドメインと証明書を取得して設定する
- ロードバランサーとセキュリティグループを設定する
- EB Cliを使用する

# Elastic BeanstalkでNuxt.jsをデプロイ
AWSコンソール
- Elastic BeanstalkでNode.jsプラットフォームの環境を作成
- [設定] - [ソフトウェア] - [変更]でノードコマンドに```npm run eb-start```を入力
- [設定] - [ソフトウェア] - [変更]で環境変数を設定

ローカル環境
- eb initを実行
- /package.json内の```scripts```に```"eb-start": "npm run build && npm run start",```を追加
- npm installで失敗する場合
 - /.npmrcファイルを作成して```unsafe-perm=true```と入力
 - 下記の内容で/.ebextensions/chown.configを作成
```
commands:
  chown:
    command: chown -R nodejs:nodejs /tmp/.config
    test: cd /tmp/.config
```
 - /Procfileがある場合は/.ebignoreファイルを作成してProcfileをデプロイしないようにする

eb deployでデプロイ

# Elastic BeanstalkでLaravelをデプロイ
AWSコンソール
- Elastic BeanstalkでPHPプラットフォームの環境を作成
- [設定] - [ソフトウェア] - [変更]で環境設定でドキュメントルートに```/public```を設定
- [設定] - [ソフトウェア] - [変更]で環境変数を設定
- [設定] - [データベース] - [変更] からRDSインスタンスを作成

ローカル環境
- eb init
- 下記の内容で/.ebextensions/permission.configを作成
```
files:
  "/opt/elasticbeanstalk/hooks/appdeploy/post/99_change_permissions.sh":
    mode: "000755"
    owner: root
    group: root
    content: |
      #!/usr/bin/env bash
      sudo chmod -R 777 /var/app/current/storage
```

eb deployでデプロイ

# Route53でドメインを設定
下のページを参考にドメインと証明書を取得
https://qiita.com/sk565/items/2da1fc0c5fc676f54994
現在は東京リージョンでも証明書の発行ができるようだ
https://aws.amazon.com/jp/about-aws/global-infrastructure/regional-product-services/

# セキュリティグループを修正
VPCのメニューからElastic Beanstalkで作成されたセキュリティグループを修正
- Nuxt.jsのセキュリティグループのインバウンドルールにHTTPSを追加
- LaravelのセキュリティグループのインバウンドルールにHTTPSとRDSのドライバを追加

# ロードバランサーを作成
EC2のメニューからターゲットグループとロードバランサーを作成
- Nuxt.jsのインスタンスに80番ポートで接続するターゲットグループを作成
- Laravelのインスタンスに80番ポートで接続するターゲットグループを作成
- Nuxt.js用のロードバランサーを作成
 - Nuxt.jsのセキュリティグループを紐づける
 - リスナーの転送先にNuxt.jsのターゲットグループを設定
- Laravel用のロードバランサーを作成
 - Laravelのセキュリティグループを紐づける
 - リスナーの転送先にLaravelのターゲットグループを設定

# ホストゾーンを作成
Route 53のでホストゾーンを作成
- ホストゾーンを作成
- レコードを作成
 - ドメインとロードバランサーを設定
背景を少し暗くする方法

背景画像を少し暗くしたいときに今まではopacityを使っていたが、中にあるコンテンツまでも暗くなってしまう。背景画像がだけ暗くして、中にある要素はそのままにしたいときはどうするのか？
背景画像のところにposition:relativeを設定して、その要素にbeforeを当ててposition:absolute;を指定、そこに
top:0;
left:0;
bacgkround:自分が暗くしたい内容；
に設定。
中にある、文字が書かれている要素にposition:relativeを使うことによって背景画像要素の内容が被らないようになる。
背景画像だけが暗くなり、中の要素は暗くならないようにできる。
Docker+Laravel+Codeception

LaravelでCodeceptionを使用した時の記録
### Codeceptionの準備
下のコマンドでインストール
```
composer require codeception/codeception --dev
```
下のコマンドでテストに必要なファイルを作成
```
composer exec codecept bootstrap
```
### seleniumサーバー用意
Acceptionテストに使用するseleniumサーバーを用意する
docker-compose.ymlに下の４行を追加する
```yml
    selenium:
...
      depends_on:
        - nginx
      links:
        - nginx:localhost
```
サーバー起動
```
docker-compose up -d selenium
```
### その他の準備
envファイルのコピー
```
cp .env .env.testing
```
/tests/functional.suite.yml
```yml
actor: FunctionalTester
modules:
    enabled:
        - Laravel5:
            environment_file: .env.testing
        - \Helper\Functional
```
/tests/unit.suite.yml
```yml
actor: UnitTester
modules:
    enabled:
        - Asserts
        - Laravel5:
            environment_file: .env.testing
        - \Helper\Unit
```
/tests/acceptance.suite.yml
```yml
actor: AcceptanceTester
modules:
    enabled:
        - WebDriver:
            url: http://localhost/
            browser: chrome 
            host: selenium
        - \Helper\Acceptance
```
### 参考
https://codeception.com/for/laravel
クラウドサービス結局どれがコスパ良いか分からんから自分で調べるわ


# 注意
■2020/11/14時点での調査結果なので
いざ買おうとして、料金が変わってたら注意

■あと、全部調べてるわけじゃない。有名どころだけ

■Apple嫌いなのでiCloudは見てない  (でも持ってる携帯はiPhone
<details><summary>でも引用くらいだったら持ってきた</summary>
<div>

> 日本 3  (JPY)
50 GB：¥130
200 GB：¥400
2 TB：¥1300
</div>
</details>

# 比較表
見てみると容量に
100GBと2TBが存在していた。
ここら辺の容量が欲しいって人と要らんって人分かれそうだから、
ギガバイト級とテラバイト級に分けるねｗ

### テラバイト級
| タイトル | TB | 1年の値段 | 1年あたりの１GBの値段 |
|:-:|:-:|:-:|:-:|
| OneDrive  | 1TB  | 12984円  | 13円  |
| DropBox  | 2TB  | 14400円  |  7.2円 |
| GoogleDrive  | 2TB  | 13000円  | 6.5円  |


### ギガバイト級

| タイトル | GB | 1年の値段 | 1年あたりの１GBの値段 |
|:-:|:-:|:-:|:-:|
| OneDrive  | 100GB  | 2688円  | 27円  |
| GoogleDrive  | 100GB  | 2500円  | 25円  |

# 結論
#### GoogleDrive
いやぁやっぱ天下のGoogleやで！
<font color=white>iCloudが2TBで13000円だから同着っていうのは内緒

でもこいつらに関しては、
■1TBも要らないとか
■送信速度とか
■ソフト間の共有とか

云々あるので個人で考えて決めてください。
Dockerのコンテナビルドでphp-radisのインストールに失敗する

Dockerでコンテナをビルドする中でphp-radisをインストールする際に下のエラーが出た
```
E: Failed to fetch http://ppa.launchpad.net/ondrej/php/ubuntu/pool/main/p/php-redis/php-redis_4.2.0-1+ubuntu16.04.1+deb.sury.org+1_amd64.deb  404  Not Found

E: Unable to fetch some archives, maybe run apt-get update or try with --fix-missing?

```
php-redisのバージョンが新しくなり古いファイルが見つからないようだ
Dockerfileでアップデートしたものをインストールする場合は同じRUNの中でアップデートインストールしないいけないらしい
http://docs.docker.jp/engine/articles/dockerfile_best-practice.html
なのでDockerfileの記述は下のように
```doc
Dockerfile
apt-get update && apt-get install -yqq php-redis
```
これでビルド出来るようになった

以上
Laravel関連のおすすめVSCode拡張機能

VSCodeでLaravelのコードを書く際に便利な拡張機能をメモ
2020-06-22 内容を一部修正

### Laravel
[Laravel Extension Pack](https://marketplace.visualstudio.com/items?itemName=onecentlin.laravel-extension-pack) 下の９つの拡張機能をインストールする
　　　　　　　　　　　 インストールしたくない拡張機能がある場合は個別にインストール
- [Laravel Blade Snippets](https://marketplace.visualstudio.com/items?itemName=onecentlin.laravel-blade) Bladeのコードスニペット
- [Laravel Snippets](https://marketplace.visualstudio.com/items?itemName=onecentlin.laravel5-snippets) Laravelのコードスニペット
- [Laravel Artisan](https://marketplace.visualstudio.com/items?itemName=ryannaddy.laravel-artisan) コマンドパレットでArtisanコマンドを実行
- [Laravel goto view](https://marketplace.visualstudio.com/items?itemName=codingyu.laravel-goto-view) プログラムからテンプレートにジャンプ
- [DotENV](https://marketplace.visualstudio.com/items?itemName=mikestead.dotenv) .envファイルのシンタックスハイライト


- [PHP Debug](https://marketplace.visualstudio.com/items?itemName=felixfbecker.php-debug) XDebugでのデバッグをサポート
- [PHP Intelephense](https://marketplace.visualstudio.com/items?itemName=bmewburn.vscode-intelephense-client) PHPコードの補完　参照の検索　定義への移動


- [EditorConfig for VS Code](https://marketplace.visualstudio.com/items?itemName=EditorConfig.EditorConfig) .editorconfigでエディターの設定を共有
- [VS Live Share](https://marketplace.visualstudio.com/items?itemName=MS-vsliveshare.vsliveshare) 画面やコードを共有する

### PHP
[php cs fixer](https://marketplace.visualstudio.com/items?itemName=junstyle.php-cs-fixer) PHPコードの整形
[PHP DocBlocker](https://marketplace.visualstudio.com/items?itemName=neilbrayfield.php-docblocker) Docブロックの入力をサポート

### Git
[GitLens](https://marketplace.visualstudio.com/items?itemName=eamodio.gitlens) git操作

### その他
[Japanese Language Pack](https://marketplace.visualstudio.com/items?itemName=MS-CEINTL.vscode-language-pack-ja) VSCodeの日本語化
[VSNotes](https://marketplace.visualstudio.com/items?itemName=patricklee.vsnotes) メモ機能　MarkDown対応
Laravelのテストメソッド抜粋

### 環境
Laravel5.8

### 前処理・後処理
```php
    protected function setUp()
    {
        parent::setUp();
        // 前処理
    }

    public function tearDown()
    {
        parent::tearDown();
        // 後処理
    }
```
### データベース
```php
Artisan::call('migrate:refresh');
$this->seedseed($class = 'DatabaseSeeder');
$this->assertDatabaseHas($table, $data, $connection = null);
$this->assertDatabaseMissing($table, $data, $connection = null);
$this->assertSoftDeleted($table, $data, $connection = null);
```
### ファクトリー
```php
// インスタンスの作成
$user = factory(User::class)->make();
$user = factory(User::class)->make(["name" => "Abigail"]);
// インスタンスの保存
$user = factory(App\User::class)->create();
```
### 認証
```php
$this->actingAs($user, $driver = null);
$this->assertAuthenticated($guard = null);
$this->assertGuest($guard = null);
$this->assertAuthenticatedAs($user, $guard = null);
$this->assertCredentials($credentials, $guard = null);
$this->assertInvalidCredentials($credentials, $guard = null);
```
### Httpリクエスト
```php
$response = $this->followRedirects($response);
$response = $this->get($uri, $headers = []);
$response = $this->post($uri, $data = [], $headers = []);
$response = $this->put($uri, $data = [], $headers = []);
$response = $this->patch($uri, $data = [], $headers = []);
$response = $this->delete($uri, $data = [], $headers = []);
```
### レスポンス
```php
$response->assertStatus($code);

$response->assertCookie($cookieName, $value = null);
$response->assertCookieMissing($cookieName);
$response->assertSessionHas($key, $value = null);
$response->assertSessionMissing($key);

$response->assertViewIs($value); //レスポンスが指定したビューかどうか
$response->assertViewHas($key, $value = null); //レスポンスのビューが指定したデータを持っている
$response->assertViewMissing($key);
$response->assertLocation($uri);
$response->assertRedirect($uri);

$response->assertSee($value);
$response->assertDontsee($value);
$response->assertSeeText($value);
$response->assertDontSeeText($value);
```
### メール
```php
Mail::fake();
Mail::assertNothingSent();

Mail::assertSent(OrderShipped::class, 2);
Mail::assertNotSent(AnotherMailable::class);
Mail::assertSent(OrderShipped::class, function ($mail) use ($user) {
    return $mail->order->id === $order->id &&
            $mail->hasTo($user->email) &&
            $mail->hasCc('...') &&
            $mail->hasBcc('...');
});

$failures = Mail::failures();
```
### PHPUnit
```php
$this->assertTrue($condition, $message = '');
$this->assertFalse($condition, $message = '');
$this->assertNull($variable, $message = '');
$this->assertSame($expected, $actual, $message = '');   // ===
$this->assertEquals($expected, $actual, $message = ''); // ==
$this->assertEmpty($actual, $message = '');
$this->assertNotEmpty($actual, $message = '');
$this->assertRegExp($pattern, $string, $message = '');
$this->assertContains($needle, $haystack, $message = '');
$this->assertCount($expectedCount, $haystack, $message = '');
```
Laravel の artisan package:discover で database error した時のメモ

laravelを初めてherokuにデプロイする際に少しハマったのでメモ
PackageInstallの後のGenerating optimized autoload filesで下記のエラー

```bash
Illuminate\Foundation\ComposerScripts::postAutoloadDump
remote:        > @php artisan package:discover --ansi
remote:
remote:        In Connection.php line 664:
remote:
remote:          SQLSTATE[42P01]: Undefined table: 7 ERROR:  relation "******" does not exist
```
migrateしてないのでテーブルが見つからないのは当たり前なのだが。
調べたら ViewServiceProvicer の boot() で該当するテーブルの処理が問題らしいので一時的にコメントアウトしてデプロイー＞migrateー＞コメントを解除してデプロイで対応。

if(Schema::hasTable('users')) {}で対応したほうが良かったかもしれないが未検証。
Laravel関連 (個人的)命名規則

Laravelとその周辺の命名規則を個人的なものも含めてまとめたメモ
2020/06/18 Vueを追加

## ソースコード

**モデル名** EditUser (単数形、パスカルケース)
**コントローラー名** EditUsersController (単数形か複数形、パスカルケース)
**ビュー** edit_users/create.blade.php (単数形か複数形、スネークケース)

- コントローラーとビューには同じ規則を適用

## データベース

**テーブル名** edit_users (複数形、スネークケース)
**カラム名** second_name (スネークケース)
**外部キー** edit_user_id (モデル名\_id)
**中間テーブル** post\_tag (モデルのアルファベット順、スネークケース)

```sql
edit_users (id int, name string, second_name string)
posts      (id int, body string, edit_user_id int)
tags       (id int, name string)
post_tag   (id int, post_id int, tag_id int)
```

## PSR-2

**クラス名** EditUsersController (パスカルケース)
**メソッド名** createEditUser (キャメルケース)
**変数** $edit_user (スネークケース)
**定数** MAX_USER (大文字 + \_)

- 名前は長くても20文字程度

## JavaScript

**オブジェクト・関数・インスタンス** (キャメルケース)
**クラス** (パスカルケース)
**定数** MAX_USER (大文字 + \_)
**プライベートメンバ** \_internalFunction (\_ + キャメルケース)
**イベントハンドラ** onDialogAccept (on + パスカルケース)

```js
const MAX_INGREDIENT = 5;
let thisIsMyObject = {};
let thisIsMyFunction() => {};
class Line {
  const CONST_POINT = {x: 123, y: 456};
  let index = 1;

  constructor(x1, y1, x2, y2) {
    this.point1 = {x: x1, y: y1};
    this.point2 = {x: x2, y: y2};
    this.index = x1 + x2;
    super.constructor(x1, y1, x2, y2);
  }

  static displayName = "Line";
  static greaterThan(a, b){
    return a.distance > b.distance
  }
  
  distance() {
    const dx = this.point1.x - this.point2.x;
    const dy = this.point1.y - this.point2.y;

    return Math.hypot(dx, dy);
  }
}
let street = new Line(1, 2, 3, 4);
```

## Vue

**ファイル名** ((Base, App, V + )パスカルケース) 複数単語にする
**コンポーネント** パスカルケース
**propsを渡す側** ケバブケース
**ptopsを受け取る側** キャメルケース

```js
<UserListItem first-name="satou" />
...
export default {
  props: {
    firstName: String
  }
}
```

## HTML

**class属性** CSSで使用するのでケバブケース
**id属性**　JavaScriptで使用するのでキャメルケース
**data-\*属性** JavaScriptで使用するのでキャメルケース

```html
<input id="nameInput" class="d-block" type="text" name="name" data-editType="name"></input>
```

## その他

**ルート** http://abc.de.jp/play-histories/{play_history} (ケバブケース)

- 変数はスネークケース
- 基本は小文字で統一

## 参考
https://laraweb.net/knowledge/942/
https://qiita.com/Takashi_INOUE/items/41d9fedaad1ff338cada
http://snowdream.github.io/javascript-style-guide/javascript-style-guide/jp/naming-conventions.html
https://www.asobou.co.jp/blog/web/url-optimisation
https://qiita.com/itagakishintaro/items/168667d5ee4c56b30d52
https://qiita.com/ngron/items/ab2a17ae483c95a2f15e
Golangのクロスコンパイル時にsqlite3がundefinedエラーになる問題の解決

# やろうとしたこと
GolangのスクリプトをAmazon Linux上で動すためにクロスコンパイルをしようとした
# 起きたこと
Mac向けにビルドすると普通にビルドできて動くが、linux向けにビルドするとエラーに。
linux向けのクロスコンパイルの設定が間違っているのかと思って調べたら違い、どうも**sqlite3のみで起きていそう**。
## MacOS向けは上手くいく
使用したコマンド

```
$ GOOS=darwin GOARCH=amd64 go build -o main_for_mac ./main.go
```
ビルドに成功し、動作も正常だった。

## linuxはsqlite3でundefinedが出る
使用したコマンド

```
$ GOOS=linux GOARCH=amd64 go build -o main_for_linux ./main.go
```

出たエラー

```
# github.com/dinedal/textql/storage
../{中略}/.go/pkg/mod/github.com/dinedal/textql{中略}/sqlite.go:30:28: undefined: sqlite3.SQLiteConn
../{中略}/.go/pkg/mod/github.com/dinedal/textql{中略}/sqlite.go:49:4: undefined: sqlite3.SQLiteDriver
...
```
# 調べて分かったこと:
go-sqlite3を使っているMacユーザーがたくさんはまっていた。
該当のissues
https://github.com/mattn/go-sqlite3/issues/384

**原因はC言語のクロスコンパイルにおいては実行環境がOS依存**であることだった。
sqliteの実装においてえ使用されている模様。


> Cross-compiling C code (and by extension, cgo code) is tricky because the choice of C compiler depends on both the OS (Windows/Linux/Mac) and architecture (x86, x64, arm) of both the host and target. On top of that, there are multiple flavors of compilers for a given combination. I don't think listing all of them is feasible. But I do think it would be helpful to more thoroughly explain what a cross-compiler is and why it is needed, and list out some of the more common options. It would also be helpful to mention using docker as a means of "cross-compiling" (at least when targeting Linux)


# 解決した方法
MacにおけるC言語のコンパイル環境に問題があるので [gcc-4.8.1-for-linux32-linux64](http://crossgcc.rts-software.org/download/gcc-4.8.1-for-linux32-linux64/gcc-4.8.1-for-linux64.dmg) をインストールすることで解決する。

## 手順
### Mac用のgccをインストール
 [gcc-4.8.1-for-linux32-linux64](http://crossgcc.rts-software.org/download/gcc-4.8.1-for-linux32-linux64/gcc-4.8.1-for-linux64.dmg) をダウンロードしてインストール。

### オプションをつけて実行
実行するコマンドは以下

```
build as usual env GOOS=linux GOARCH=amd64 CGO_ENABLED=1 CC=/usr/local/gcc-4.8.1-for-linux64/bin/x86_64-pc-linux-gcc go build
```


## 参考
多くの人が上記issueで問題にぶつかっていたため、親切な方が手順を別のissueにまとめてくれていた。

> install [http://crossgcc.rts-software.org/download/gcc-4.8.1-for-linux32-linux64/gcc-4.8.1-for-linux64.dmg]gcc-4.8.1-for-linux32-linux64
build as usual env GOOS=linux GOARCH=amd64 CGO_ENABLED=1 CC=/usr/local/gcc-4.8.1-for-linux64/bin/x86_64-pc-linux-gcc go build
```

該当のissue
https://github.com/mattn/go-sqlite3/issues/797
LPIC202試験で紹介される主な設定ファイル(自分用メモ)


| サービス 　 |設定ファイル 　　　　　　            |説明  　　　           　                     |
|:-----------|-----------------------------------|---------------------------------------------|
| BIND       |/etc/named.conf                    | メイン設定ファイル  　                        |
| Apache     |/usr/local/apache2/conf/httpd.conf | メイン設定ファイル                            |
| Apache     |/usr/local/apache2/conf/extra/     | 補助設定を格納                               |
| Squid      |/etc/squid/squid.conf              | 設定ファイル                                   |
| nginx 　   |/etc/nginx/nginx/conf              | メイン設定ファイル                                            |
| samba      |/etc/samba/smb.conf                | 全体設定と共有定義から構成                     　　　　　　　　|
| NFS        |/etc/exports                       | エクスポートするディレクトリを記述                            |
| DHCP       |/etc/dhcp.conf                     | パラメータを記述                                             |
| PAM        |/etc/pam.d                         |ユーザー認証を行うプログラムの設定ファイルが格納されている        |
| OpenLDAP   |/etc/openldap/slapd.conf           |データベースの形式や管理者のDN、LDAPの格納ディレクトリを記述    　 |
| SSSD       |/etc/sssd/sssd.conf                |認証サービスとの通信を管理して、情報をキャッシュさせる            |
| Postfix    |/etc/postfix/main.cf               |MTAとしての基本的な設定ファイル                                 |
| Devcot     |/etc/docecot.conf                  |imapやpopなど、利用するプロトコルを設定                         |
Laravel で Ruby on Rails チュートリアル【4章】文法

## 環境
- Laravel 8.6
- PHP 8.0
- Bootstrap 5.1

## 4.1動機

### 4.1.1 組み込みヘルパー

### 4.1.2 カスタムヘルパー

ヘルパーを定義

```php:/app/helpers.php
<?php

if (!function_exists('full_title')) {
    function full_title($page_title = '')
    {
        $base_title = "Ruby on Rails Tutorial Sample App";
        if (empty($page_title)) {
            return $base_title;
        } else {
            return $page_title . " | " . $base_title;
        }
    }
}

```

autoloadにヘルパークラスを追加

```json:composer.json
    "autoload": {
        "psr-4": {
            "App\\": "app/",
            "Database\\Factories\\": "database/factories/",
            "Database\\Seeders\\": "database/seeders/"
        },
        "files": [
            "app/helpers.php"
        ]
    },
```

Composerコマンドを実行

```bash
sail composer dump-autoload
```

ヘルパーを使用した処理に書き換え

```html:/resources/views/layouts/application.blade.php
    <title>{{ full_title($__env->yieldContent('title')) }}</title>
```

ホームのテストを修正

```php:/tests/Unit/StaticsPagesControllerTest.php
$this->assertSame($this->base_title, $dom->filter("title")->text());
```

homeのビューからtitleの定義を削除

```html:/resources/views/statics_pages/home.blade.php
- @section('title', 'Home')
```

## 4.2 文字列とメソッド

phpのrais consoleみたいなもの

```
php artisan tinker
```

### 4.2.1 コメント

### 4.2.2 文字列

### 4.2.3 オブジェクトとメッセージの受け渡し

### 4.2.4 メソッドの定義

### 4.2.5 titleヘルパー、再び

## 4.3 他のデータ構造

### 4.3.1 配列と範囲演算子

### 4.3.2 ブロック

### 4.3.3 ハッシュとシンボル

### 4.3.4 CSS、再び

## 4.4 Rubyにおけるクラス

### 4.4.1 コンストラクタ

### 4.4.2 クラス継承

### 4.4.3 組み込みクラスの変更

### 4.4.4 コントローラクラス

### 4.4.5 ユーザークラス

## 4.5 最後に

# 参照
https://qiita.com/chr/items/205b1fa31cda4997efdd
Laravelでrailsチュートリアル

Laravelに慣れるためにrailsチュートリアルの内容をLaravelで実装していく。

Laravel 8.6
MySQL 8.0

開発環境:windows+wls2(Ubuntu)+Docker
本番環境:heroku

以降の記事でrails チュートリアルの3章から進めていく。