OmniAICreator/Qiita-1.07M huggingface dataset:
データ分析

##データ分析
###書籍：本物のデータ分析力が身につく本から
####データ分析を設計する
#####データ分析のストーリー
・何のため何を知りたい
・そのためどんな仮定をおく
・どんなデータを使う

・問題領域：課題を解決するための問い：疑問文で書く
・評価軸は：なにをもって良い施策とするか
・要因：問に答えるためのでーた
![スクリーンショット 2020-11-15 095104.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282938/f7470d52-95b6-61c8-048c-ddda086385a9.jpeg)

これらを必ず書き出して議論をすること。

たしかに。ここで漏れを気付くようにする必要がある。
p３５まで
TypeScriptは「構造が同じであれば同じ型」というわけではない

TypeScriptは構造的部分型を採用しているため、以下のようにクラスBが持つ構造を備えるクラスAは、クラスBの変数に代入できます。

```ts
class A {
    hoge: string = "";
}

class B {
    hoge: string = "";
}

let temp = new B; // tempは B 型
temp = new A; // OK
```

この動き、直感的には「TypeScriptでは、構造が同じであれば同じ型なんだな」と理解したくなりますが、以下のようにAに構造が「多い」場合も代入できるので、「同じ型」ではないです。「互換性がある」というのが正しいです。

```ts
class A {
    hoge: string = "";
    fuga: string = "";
}

class B {
    hoge: string = "";
}

let temp = new B; // tempは B 型
temp = new A; // OK
```

下記のように全く構造が同じ場合も、型としては別です。instanceofで判定してみると違う型になります。

```ts
class A {
    hoge: string = "";
}

class B {
    hoge: string = "";
}

let b = new B; // bは B 型
b instanceof A; // false
```

## ドキュメントはどう言っているか

Microsoftの[TypeScript Handbook - Type Compatibility](https://www.typescriptlang.org/docs/handbook/type-compatibility.html)を読むと「型の**互換性**は構造的部分型に基づく」と書いてあります。

>Type compatibility in TypeScript is based on structural subtyping.
> (訳) TypeScriptの型の互換性は、構造的部分型に基づいています。


以上です。
pythonを使ってLINEで一斉配信をする

#はじめに
LINEでシステムから情報を一斉配信したので、その時の手順を残しておきます。

LINEはLINE@とLINE公式アカウントが別々で別れてましたが統合されたようです。
アカウントは無料で作成することができ、登録にはメールアドレスのみで登録できます。
LINEにはAPIがいくつかありますが、一斉配信にはMessaging APIを使用します。
一つのチャンネルで1000通までは無料で配信できるので、十分にテストできると思います。

##チャネル作成
まずはこちらのURLからビジネスアカウント作成をクリックして、メールアドレスで作成をクリックします。
https://account.line.biz/login

次に、作成したビジネスアカウントでログインをしてプロバイダとチャネルを作成してください。
https://developers.line.biz/ja/docs/messaging-api/getting-started/#using-oa-manager

##チャネルアクセストークン発行

チャネルの個別設定画面の上のタブの「Messaging API設定」を選択します。

![スクリーンショット 2020-11-15 14.36.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/381859/afb6a253-1c6f-28e7-a3ba-f880556702b1.png)

その画面の一番下の「チャネルアクセストークン(長期)の発行ボタンをクリックしてトークンを発行してください。

![スクリーンショット 2020-11-15 14.38.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/381859/ff5a9d18-f375-5522-eb53-0fb6a051bfef.png)


##プログラム実行

下のプログラムを実行すると配信できます。
先ほど発行したアクセストークンを変数にセットしてご使用ください。

```python:test_delivery.py
# -*- coding:utf-8 -*-
import requests
import urllib.request, urllib.error
import json

url = 'https://api.line.me/v2/bot/message/broadcast'
channel_access_token = '作成したchannel_access_token'
# 送信用のデータ
# messageの中にtype,textの配列を追加すれば一度に複数のメッセージを送信できます。(最大件数5)
data = {
    'messages' : [{
        'type':'text',
        'text':'配信したいテキスト'
    }]
}
jsonstr = json.dumps(data).encode('ascii')
request = urllib.request.Request(url, data=jsonstr)
request.add_header('Content-Type', 'application/json')
request.add_header('Authorization', 'Bearer ' + channel_access_token)
request.get_method = lambda: 'POST'
# 送信実行(レスポンスが200なら送信成功)
response = urllib.request.urlopen(request)

```


詳細な使用方法は公式がわかりやすいです。
https://developers.line.biz/ja/reference/messaging-api/#send-broadcast-message

#最後に
初めてLINE MessagingAPIを使用しましたが、わかりやすくて非常に使用しやすいものでした。
webhookやOAuthなんかもあるので、そちらも時間ができたら試します。
なにかこちらの記事で間違い等あればご指摘ください。
Anaconda3のpython環境構築手順

#この記事について
AnacondaをWindows10に導入し仮想環境を作成するまでの手順を記載します。
仮想環境はプロジェクトごとの固有な設定やライブラリをインストールする際に他のプロジェクトに影響を与えないように開発するための便利な方法です。

筆者の環境
OS：Windows10
CPU：AMD Ryzen 5 PRO 350Uw / Radeon Vega Mobile Gfx 2.10Ghz
メモリ：8.00GB

#インストール
###ダウンロード
以下のサイトよりダウンロードし、インストーラーに従ってインストールします。（すべて推奨設定）
https://www.anaconda.com/products/individual

#仮想環境の作成
###プロンプトの起動
インストールするとスタートメニューに作成Anaconda3の起動メニューが作成される。
Anaconda Promptを起動する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/882265/10a6cbf9-ebfd-7af3-9413-75f0765e7d92.png)

###仮想環境の作成
~~~python
#仮想環境の確認
conda info -e

#仮想環境の作成
#conda create -n [任意の環境名]
conda create -n hogehoge

#仮想環境の確認
conda info -e

#仮想環境の起動
#activate [作成した環境名]
activate hogehoge
~~~

これで仮想環境の作成は完了です。
[Spring Framework]Configurationの分割

# Configurationの分割
肥大化したJava Configを分割する方法です。

## Java Configの分割

### メインクラス
分割したサブクラスを`@org.springframework.context.annotation.Import`で読み込む。

```java:AppConfig.java
@Configuration
@Import({SubConfig.class, Sub2Config.class})
public class AppConfig {
  // subConfig.class, sub2Config.classに定義したBeanがインジェクションされる
}
```

### 分割したサブクラス
`@Configuration`をつける

```java:SubConfig.java
@Configuration
public class SubConfig {
  @Bean
  UserService userService() {
  // ・・・
  }
}
```
```java:Sub2Config.java
@Configuration
public class Sub2Config {
  @Bean
  ShopService shopService() {
  // ・・・
  }
}
```
【Java】多次元配列・内積計算（AOJ⑦内積）

#多次元配列

```java
// 3*4*5の三次元配列
init [][][] list = new int [3][4][5]; 
// 2次元配列を初期化して宣言
int [][] list = [
  { 1, 2, 3 },
  { 4, 5, 6 },
  { 7, 8, 9 },
};
//var で初期化して宣言
var list = new int[][] [
  { 1, 2, 3 },
  { 4, 5, 6 },
  { 7, 8, 9 },
};
// 0行1列目にアクセス
System.out.println(list[0][1]); //2
```

#ジャグ配列
* 長さが異なる多次元配列
* 最初の宣言では外側のサイズのみ指定
* 1次元目は確保しないといけないが2次元目は確保不要
* **2次元以降はダイナミックに変更できる！**
    * ユースケース
    * 全人口の給料の配列を作るときに都道府県ごとに作成
    * `int [][] = salary = new int[47][];`

```java
var list = new int [3][];
list[0] = new int[2]; //0番目の配列の要素は2個
list[1] = new int[3]; //0番目の配列の要素は3個
list[2] = new int[4]; //0番目の配列の要素は4個
```
```java
var list = new int [][] {
  { 1, 2 },
  { 3, 4, 5 },
  { 6, 7, 8, 9 },
};
System.out.println(list[1][2]); //5 ※サイズは3
```

##公舎の入居者数

>Ａ大学は１フロア１０部屋、３階建ての公舎４棟を管理しています。公舎の入居・退去の情報を読み込み、各部屋の入居者数を出力するプログラムを作成して下さい。
n件の情報が与えられます。各情報では、４つの整数b, f, r, vが与えられます。これは、b棟f階のr番目の部屋にv人が追加で入居したことを示します。vが負の値の場合、-v人退去したことを示します。
最初、全ての部屋には誰も入居していないものとします。
Input
最初の行に情報の数 n が与えられます。
続いて n 件の情報が与えられます。各情報には４つの整数 b, f, r, v が空白区切りで１行に与えられます。
Output
４棟について入居者数を出力して下さい。各棟について、１階、２階、３階の順に入居者数を出力します。各階については、１番目、２番目、・・・、１０番目の部屋の入居者数を順番に出力します。入居者数の前には１つの空白を出力して下さい。また、各棟の間には####################(20個の#)で区切って下さい。
Constraints
* 間違った棟番号・階・部屋番号は与えられない。
* 管理の過程で１部屋の入居者数が０より少なくなることはない。
* 管理の過程で１部屋の入居者数が9より多くなることはない。

```java
import java.util.Scanner;
public class Main {
    public static void main(String[] args){
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		//１０部屋、３階建ての公舎４棟
		int[][][] list = new int[4][3][10];
		
		for(int i = 0; i < n; i++) {
		    //b棟f階のr番目の部屋にv人が追加
			int b = sc.nextInt();
			int f = sc.nextInt();
			int r = sc.nextInt();
			int v = sc.nextInt();
			
			list[b-1][f-1][r-1] += v;
		}

		for(int i = 0 ; i< 4; i++) {
			for(int j = 0; j < 3; j++) {
				for (int k = 0; k < 10; k++) {
					System.out.print(" " + list[i][j][k]);
				}
				System.out.println();
			}
			if (i != 3)
				System.out.println("####################");
		}
        }
}
```

##ベクトルと行列の積
>Input
１行目に n と mが空白区切りで与えられます。続く 
n 行に行列 A の要素aij が空白区切りで与えられます。続く m 行にベクトルbの要素 bi がそれぞれ１行に与えられます。
Output
出力は n行からなります。ベクトル cの要素 ci をそれぞれ１行に出力してください

```java
//内積計算
import java.util.Scanner;

public class Main {
    public static void main(String[] args){
        Scanner scan=new Scanner(System.in);
        int n=scan.nextInt();
        int m=scan.nextInt();
        int a[][]=new int[n][m];
        //行列A
        for(int i=0;i<n;i++)for(int j=0;j<m;j++){
            a[i][j]=scan.nextInt();
        }
        //ベクトルb
        int b[]=new int[m];
        for(int i=0;i<m;i++)b[i]=scan.nextInt();
        //ベクトルc
        int c[]=new int[n];
        //c=A*b 内積計算
        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++){
                c[i]+=a[i][j]*b[j];
            }
        }
        for(int i=0;i<n;i++)System.out.println(c[i]);
        scan.close();
    }
}
```
あいまい検索作ってみた

# あいまい検索作ってみた
テーブル名と検索ワードを指定して、全レコードの全文字列カラムから検索し
ヒットしたカラム名全部と、ヒットしたレコードのPK全部を出力してくれます

ところでQiitaのSQLのシンタックスハイライトって色つかないんですか...?

```sql:あいまい検索.sql
-- if exist
DROP FUNCTION FUZZY_SEARCH(VARCHAR, VARCHAR);

-- implementation
CREATE OR REPLACE FUNCTION FUZZY_SEARCH(TAB_NAME VARCHAR, KEY_WORD VARCHAR) RETURNS VARCHAR AS $$
	-- count hit cases
	DECLARE
		-- all char columns
		COLUMNS_CURSOR CURSOR IS
			SELECT
				column_name
			FROM
				information_schema.columns
			WHERE
				table_name = TAB_NAME
				AND data_type LIKE '%char%';
		-- target columns
		COLUMNS_VAR VARCHAR;
		-- counter
		CNT INTEGER;
		-- result1
		ANSWER_COLUMN VARCHAR;
		-- result2
		ANSWER_PK VARCHAR;
		-- pk select
		PK_CURSOR REFCURSOR;
		-- tmp
		ANSWER_PK_TMP VARCHAR;
		-- pk column
		PK_NAME VARCHAR;
		-- get pk sql string
		GET_PK VARCHAR :=
			'SELECT
				ccu.column_name
			FROM
				information_schema.table_constraints tb_con
				INNER JOIN information_schema.constraint_column_usage ccu
					ON tb_con.constraint_catalog = ccu.constraint_catalog
					AND tb_con.constraint_schema = ccu.constraint_schema
					AND tb_con.constraint_name = ccu.constraint_name
				INNER JOIN information_schema.key_column_usage kcu
					ON tb_con.constraint_catalog = kcu.constraint_catalog
					AND tb_con.constraint_schema = kcu.constraint_schema
					AND tb_con.constraint_name = kcu.constraint_name
					AND ccu.column_name = kcu.column_name
			WHERE
				tb_con.table_name = ''' || TAB_NAME || '''' || '
				AND tb_con.constraint_type = ''PRIMARY KEY''';
	BEGIN
		EXECUTE GET_PK INTO PK_NAME;
		ANSWER_COLUMN := '';
		ANSWER_PK := '';
		OPEN COLUMNS_CURSOR;
		LOOP
			FETCH COLUMNS_CURSOR INTO COLUMNS_VAR;
			EXIT WHEN NOT FOUND;
			-- search
			EXECUTE 'SELECT COUNT(*) FROM ' || TAB_NAME || ' WHERE ' || COLUMNS_VAR || ' LIKE ''%' || KEY_WORD || '%'';' INTO CNT;
			-- hit
			IF CNT > 0
				-- stock column name
				THEN ANSWER_COLUMN := ANSWER_COLUMN || TAB_NAME || '.' || COLUMNS_VAR || ' ,';
				-- select pk
				OPEN PK_CURSOR FOR EXECUTE 'SELECT ' || PK_NAME || ' FROM ' || TAB_NAME || ' WHERE ' || COLUMNS_VAR || ' LIKE ''%' || KEY_WORD || '%'';';
				LOOP
					FETCH PK_CURSOR INTO ANSWER_PK_TMP;
					EXIT WHEN NOT FOUND;
					ANSWER_PK := ANSWER_PK || ANSWER_PK_TMP || ',';
				END LOOP;
				CLOSE PK_CURSOR;
			END IF;
		END LOOP;
		CLOSE COLUMNS_CURSOR;
		RETURN 'Hit columns CSV ,' || ANSWER_COLUMN || 'Hit PK List CSV ,' || ANSWER_PK;
	END;
$$ LANGUAGE 'plpgsql';

-- How2call
SELECT FUZZY_SEARCH(TAB_NAME => 'table_name', KEY_WORD => 'A');
```
PHPで湯婆婆を短く書く

#はじめに
この投稿は @Nemesis さんの [Javaで湯婆婆を実装してみる](https://qiita.com/Nemesis/items/c7192a7c510788d2cba2) をはじめとした湯婆婆ムーヴに乗っかったものです。
@TD12734 さんの [HTMLで最も短い湯婆婆(記事内で試せます)](https://qiita.com/TD12734/items/743e90fb867fee8c562e) に触発されPHPでも短く書けないか試してみました。

#とりあえず普通に書く
```php
<?php
$realName = "安達桜";
$splittedRealname = mb_str_split($realName);
$newName = $splittedRealname[array_rand($splittedRealname)];

echo 'フン。' . $realName . 'というのかい。贅沢な名だねぇ。今からお前の名前は' . $newName . 'だ。いいかい、' . $newName . 'だよ。分かったら返事をするんだ、' . $newName . '!!';
// 実行結果
// フン。安達桜というのかい。贅沢な名だねぇ。今からお前の名前は桜だ。いいかい、桜だよ。分かったら返事をするんだ、桜!!
```

マルチバイトの扱いの関係で多少冗長になってしまいましたが、文字列を `mb_str_split()`することで配列化することができます。
その配列の中からランダムに1つを取り出すことで新しい名前が無事決まりました。

#名前を外部から与えられるようにする
```php:yubaba.php
<?php
$splittedRealname = mb_str_split($_GET['realname']);
$newName = $splittedRealname[array_rand($splittedRealname)];

echo 'フン。' . $_GET['realname']. 'というのかい。贅沢な名だねぇ。今からお前の名前は' . $newName . 'だ。いいかい、' . $newName . 'だよ。分かったら返事をするんだ、' . $newName . '!!';
```

幸いにしてPHPではURLにクエリを付与することにより外部から入力を与えることができます。
この例でしたらブラウザからアクセスする際に `yubaba.php?realname=安達桜` とすることで最初に書いたプログラムと同等になるはずです。多分。

#コードを短くしていく
```php:yubaba.php
<?="フン。".($r=$_GET['r'])."というのかい。贅沢な名だねぇ。今からお前の名前は".($n=mb_str_split($r)[rand(0,mb_strlen($r)-1)])."だ。いいかい、{$n}だよ。分かったら返事をするんだ、{$n}!!";
```

`($r=$_GET['r'])`や`($n=mb_str_split($r)[rand(0, mb_strlen($r)-1)])`の部分は変数への代入と表示を一括して行っています。
さらにPHPでは文字列をダブルクォートで括ることで、その文字列中の`{}`内は変数展開が行われるため文字数省略には有用なテクニックです。

#PHPのバージョンを5.3まで下げる
```php:yubaba.php
<?="フン。{$r}というのかい。贅沢な名だねぇ。今からお前の名前は".($n=preg_split('//u',$r)[rand(1,mb_strlen($r)-1)])."だ。いいかい、{$n}だよ。分かったら返事をするんだ、{$n}!!";
```

PHP5.3では悪名高い`register_globals`が使用可能です。（`register_globals`については下記の記事をご参照ください）
[PHP 5.4 以上でも register_globals を再現するライブラリ MercifulPolluter](https://qiita.com/gongo/items/91b8728701cbbb41584e)

こちらを有効にすることで`$_GET['r']`をわざわざ書かなくて済むようになります。~~なんて便利なんだ。~~
その代わりPHP7で追加された`mb_str_split`が使用できなくなってしまいますので、代わりに`preg_split('//u',$r)`を使用しました。
ただし、このままだと分割した配列の最初と最後が空文字になってしまうため、`rand`の範囲を調整することで空文字部分を選ばないようにしています。

#名前をシングルバイト文字前提とする
```php:yubaba.php
<?="フン。{$r}というのかい。贅沢な名だねぇ。今からお前の名前は".($n=str_shuffle($r)[0])."だ。いいかい、{$n}だよ。分かったら返事をするんだ、{$n}!!";
```

マルチバイトで扱おうとするからコードが冗長になるのです。
シングルバイトを前提にすれば1文字抜き取る部分は`str_shuffle($r)[0]`だけでよくなります。

ちなみにこちらで無理やりマルチバイトの名前を通すと文字化けします。

```php:yubaba.php
<?php
$_GET['r']="安達桜";
?>

<?="フン。".($r=$_GET['r'])."というのかい。贅沢な名だねぇ。今からお前の名前は".($n=str_shuffle($r)[0])."だ。いいかい、{$n}だよ。分かったら返事をするんだ、{$n}!!";

//実行結果
//フン。安達桜というのかい。贅沢な名だねぇ。今からお前の名前は�だ。いいかい、�だよ。分かったら返事をするんだ、�!!
```

#ファイル名を変える
仕上げにファイル名を湯婆婆のセリフとして問いかけも実装すれば完成です。
アクセスする際のURIは`契約書だよ。そこに名前を書きな。.php?r=adachisakura`のようになります。

```php:契約書だよ。そこに名前を書きな。.php
<?="フン。{$r}というのかい。贅沢な名だねぇ。今からお前の名前は".($n=str_shuffle($r)[0])."だ。いいかい、{$n}だよ。分かったら返事をするんだ、{$n}!!";
```

#終わりに
出かけるつもりが1時間も記事作成に費やしてしまった…
Appium インストールのメモ

### Appiumをmacにインストールする上でやったことのメモ

スマホアプリをコードで操作するためにAppiumを導入したのでその過程を記す。


1. Desktop版をインストールする場合
GUIで動かしながらUIパーツのxpathを見たり、操作をレコードすることができて便利。
以下githubからダウンロードできる
[appium/appium-desktop](https://github.com/appium/appium-desktop/releases/tag/v1.18.3)



2. terminalからのインストールをする場合
手順解説は散見される。インストールのためにやったことだけ書く。


```
 brew install nodebrew
 setup_dirs
 nodebrew setup_dirs
 
 nodebrew install-binary latest
 nodebrew use v14.13.1

 echo 'export PATH=$PATH:/Users/[Your Home]/.nodebrew/current/bin' >> ~/.zshrc
source ~/.zshrc

****Restart terminal****

npm install -g appium appium-doctor
appium-doctor --ios  (必要なものが揃っているかの確認)
brew install carthage　（揃っていなかったので入れた）
appium-doctor --ios　（必要なものが揃っているかの再確認）
```
ローカルで Rails アプリを production モードで起動する（API サーバー編）

ローカル で Rails を production モードで起動するまでの手順を書きます。

今回は、Rails を API サーバーとして使うのに必要な手順のみです。

# 環境

- macOS Catalina 10.15.7
- Ruby 2.7.2
- Rails 6.0.3.4
- MySQL 5.7.32

# 手順

## database.yml の設定

動作確認のため、DB 名以外は development モードで起動していた時と同じ設定にしてしまえば良い。rails new した時のままであれば、だいたいこんな感じになるはず。

```yaml:database.yml
default: &default
  adapter: mysql2
  encoding: utf8mb4
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: root
  password:
  host: localhost

development:
  <<: *default
  database: my_app_development

test:
  <<: *default
  database: my_app_test

production:
  <<: *default
  database: my_app_production
```

## DB セットアップ

```bash
% RAILS_ENV=production bundle exec rails db:setup
Created database 'my_app_production'
```

`db:setup` だけで db:create, db:migrate, db:seed してくれるはず。

## サーバーを production モードで起動する

```bash
$ bundle exec rails s -e production
```

curl などでアクセス確認できれば OK。

動作確認したアプリケーションは sidekiq を入れていたので、 `/sidekiq` にアクセスしたが、問題なく動いた。

# おわりに

API サーバーだけとはいえ、こんなに簡単に動いたっけ？

昔より楽になったのかな。
OpenCV && AKAZE && Windows10 && VisualStudio2017


###動作するバージョンの組み合わせを求めて...
OpenCVでAKAZEで画像間の特徴点のマッチングをやろうと思ったら、案の定
OS（Windows10 64bit)と、OpenCVのバージョンと、Visual Studioのバージョンの組み合わせを見つけるのに一苦労した。opencv2413では、何の問題もなく、SHIFTやSURFのサンプロコードがビルドして動作するのに、AKAZEはすんなり動いてくれない。opencv3???でもソースからbuildしたり、色々opencvのバージョンを変えてもうまくいかない。detectAndComputeで落ちる。
そこで、opencv440のバイナリーでやってみたら、あっけなく動いた。しかも、opencv440の何が変わったかを読んでたら、SIFTの特許が切れた（2020年3月）ので、<opencv2/nonfree/features2d.hpp>をインクルードしなくても良くなったということも後ればせながら知った。

Windows10(64bit)と、OpenCV 4.4.0とVisualSTudio2017でAKAZEのサンプルプログラムを動かすには以下のような手順になる。

opencv440をダウンロードし、Dドライブに解凍し、opencvをopencv440にリネームする。

###VisualStudio2017の設定

VisualStudioのプロジェクトのプロパティから
構成プロパティ→VC++ディレクトリ→インクルードディレクトリ　D:\opencv440\build\include　　　
構成プロパティ→VC++ディレクトリ→ライブラリディレクトリ　　D:\opencv440\build\x64\vc14\lib
リンカ→入力→追加依存ファイル　D:\opencv440\build\x64\vc14\lib\opencv_world440.lib
と設定しておく、また、
実行ファイルがbuildされるパス（x64\Release)に、D:\opencv440\build\x64\vc14\bin\opencv_world440.dllをコピーしておかないとbuild後「実行できない！」と怒られる。

###サンプルプログラム実行
たとえば、https://docs.opencv.org/3.4/dc/d16/tutorial_akaze_tracking.html
など、一発ででbuild、実行できる。ここで、webカメラを繋いでおけば、画像ファイルを用意してなくても動作する。
![frame.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430586/a70ce2e1-f8f8-5d63-92dc-c2492cfe1b3f.png)
テストの方法は、実行しwebカメラからの画像がウィンドウに出力されたら、スペースバーを押し、適当な範囲をマウスで決めてエンターキーを押すと、AKAZEとORBのマッチングを同時にリアルタイムで実行するデモが始まる。キーボードのcで終了。

おまけに、上のバージョンで、SIFTの特徴点をディテクトするテスト。

```
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/features2d.hpp>
//#include <opencv2/nonfree/features2d.hpp> 

int main(int argc, const char* argv[])
{
	const cv::Mat input = cv::imread(argv[1], 0); 

	cv::Ptr<cv::SIFT> detector = cv::SiftFeatureDetector::create();
	std::vector<cv::KeyPoint> keypoints;
	detector->detect(input, keypoints);

	// Add results to image and save.
	cv::Mat output;
	cv::drawKeypoints(input, keypoints, output);
	cv::imwrite("sift_result.jpg", output);

	return 0;
}
```
この場合は、　<実行プログラム名> <画像名>　<ENTER>で起動すると、sift_result.jpgに結果が
ストアされます。SIFTの特許の呪縛が解けたので、nonfreeのinclude をコメントアウトして実行できます。
ArgumentError(wrong number of arguments (given 0, expected 1))のエラーメッセージ

### はじめに
「rails s」をしたときにdestroyメソッドに関するエラーが出て、どこを直せば良いのかよくわからずに苦労したので、記録として書きます。

エラーメッセージ

```
persistence.rb:325:in `destroy': wrong number of arguments (given 0, expected 1) (ArgumentError)
```

###原因
モデルの中の記述の仕方に問題がありました。

```rb:user.rb
class User < ApplicationRecord
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :validatable
  attachment :profile_image
  has_many :tasks, dependent: destroy
end
```

###解決策
すごく単純ですが、モデルの中のファイルの記述を治してあげれば解決しました。

```rb:user.rb
class User < ApplicationRecord
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :validatable
  attachment :profile_image
  has_many :tasks, dependent: :destroy
end
```

参考記事
https://teratail.com/questions/244096
【Laravel】リダイレクトの書き方メモ

- リダイレクト定義の書き方について。
 
```php:リダイレクトの基本
// httpの場合
return redirect('test/index');                 // http://xxxxx/test/index
return redirect()->to('test/index');           // ↑と同義
return redirect('test/index', 301);            // ステータスコードを指定する場合（※ デフォルトは、302）
return redirect('test/index', 301, ['test-header' => 'テスト'] ); // HTTPヘッダー を追加する場合

// httpsの場合
return redirect('test/index', 302, [], true);  // https://xxxxx/test/index


// ルート名での指定
return redirect()->route('test.list');
return redirect()->route('test.show', ['id' => 12]);      // id情報を含むルーティングの場合（例： test/{id} ）
$user = App\User::find(12);                               // ↑と同義
return redirect()->route('test.show', ['id' => $test]);


// コントローラ名での指定
return redirect()->action('TestController@index');
return redirect()->action('TestController@show', ['id' => 12]);    // id情報を含む場合
```


# パス、アクションの指定

```php:パス、アクションの指定
return redirect($to = null, $status = 302, $headers = [], $secure = null);          // パスの指定
return redirect()->to($path, $status = 302, $headers = [], $secure = null);         // 取得インスタンスへのパス指定
return redirect()->route($route, $parameters = [], $status = 302, $headers = []);   // 取得インスタンスへのルート指定
return redirect()->action($action, $parameters = [], $status = 302, $headers = []); // 取得したインスタンスへアクション指定
return redirect()->away($path, $status = 302, $headers = []);                       // 取得したインスタンスへの外部ドメインの指定

// コントローラを使わず、リダイレクト先を指定する場合
Route::redirect($uri, $destination, $status = 301);
```

# データも一緒にリダイレクト

```php:セッションデータと一緒にリダイレクト（※フラッシュメッセージなどに使う）
return redirect('home')->with('result', '完了');
return redirect('home')->with([       // 複数データを格納する場合は、配列で！
    'result_1'=>'成功-1', 'result_2'=>'成功-2', 'result_3'=>'成功-3'
]);
// ビューで取得
{{ session('result') }}
```

# 直前ページへのリダイレクト

```php:直前ページにリダイレクト
// 基本
public function back() {
    return back();
}

// データも一緒に、直前ページに戻す場合
public function back() {
    return back()->with('result', 'ok！');
    return back()->withInput();     // 送信データがセッション内に格納される
}
// ビューで取得
{{ session('result') }}

// 例
public function back(Request $request) {
    return back()->withInput($request->only(['email']));
}
// ビューで取得
<textarea name="message">{{ old('message') }}</textarea>
```
Excel帳票フォーマットをXMLで作成する方法

Excelの帳票のフォーマットの作成手順

１.Excelを普通に開く

２.名前をつけて保存を選択し保存形式をxmlにする

そうするとエクセルがxml形式に変換されて保存されます。

システムの帳票に使う際は、不要なコードも含まれているため、xmlファイルの編集が必要になります。
Docker Toolboxでファイル共有する方法

# はじめに
Dockerで立ち上げたコンテナに、ローカルPCの任意のフォルダをマウントすれば
docker内の閉じたＮＷ内に自由にファイルをおけるぜー！って思い、調べた結果をまとめる

# なぜ今更こんな記事を上げるのか？
googleで「Docker windows ファイル 共有」で検索すれば瞬殺かと思ったらそんなことなくて
・記事の内容を見たら実はDocker for Windows向けだった（※Hyper-V クライアントが実行できないPCはDocker ToolboxでDocker環境を利用するため 参考にならない）
・virtualboxの設定（後述）はあったが、そのあとのdocker上でのコマンド方法の書式があいまいで、結局よくわからなかった
といった感じでイマイチ自分の置かれた環境とハマらなかったので苦労したので、
ＰＣが飛んでもまたやり直せるように記事に残す。

# 手順（概要）
ちょっと概要だけではわけわからないけど、全部で3STEPあるってところが自分の中ではポイントだったのでメモとして残す。
１．Virtualboxにて共有フォルダ設定を行う
２．Docker Machineにてコンテナ用の共有フォルダを作成し、１．の共有フォルダをマウントする
３．コンテナをコンテナ用共有フォルダとコンテナの任意のディレクトリにマウントさせて起動する

# 手順（詳細）
## １．Virtualboxにて共有フォルダ設定を行う
１．Oracle VM VirtualBoxを起動する
２．default→右クリック→設定
３．共有フォルダークリック
４．ポップアップしたウィンドウの右側にある共有フォルダ新規追加アイコンをクリック
５．下記内容を入力して「ＯＫ」
　　フォルダーのパス：共有フォルダとして使いたいローカルＰＣのフォルダパスを入力
　　　例）C:\Users\watya\work\docker
　　フォルダー名：docker-machineが認識するときのフォルダー名
                 C:\→/C/、\→/に置き換えるところがポイント
　　　例）/C/Users/watya/work/docker
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416263/8696f4be-b238-882d-19bc-68f1f67a5dfb.png)

## ２．Docker Machineにてコンテナ用の共有フォルダを作成し、１．の共有フォルダをマウントする
Docker Quickstart Terminal を起動し、コマンドを実行する。
以下のコマンドで /e に、１．で設定した共有フォルダー をマウントする。
これで、ローカルPC→VirtualBox→Docker machineというつながりでファイル共有がつながる。
Docker Machine 側に作成するディレクトリ名は e にしてますが、被らなければなんでもよいです。
個人的にはドライブ番号っぽくなって共有フォルダってことがわかりやすいので気に入っている。

```:DockerToolbox
$ docker-machine ssh default 'sudo mkdir -p /e'
$ docker-machine ssh default 'sudo mount -t vboxsf -o uid=0,gid=0 /C/Users/watya/work/docker /e'
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416263/39c304ba-5944-bae4-6bc8-379432c2532a.png)

# ３．コンテナをコンテナ用共有フォルダとコンテナの任意のディレクトリにマウントさせて起動する
Docker Toolboxより、コマンドを実行する。
以下のコマンドで、２．で作成した/eがnginxコンテナの/homeにマウントされる。

```:DockerToolbox
$ docker run -d -v /e:/home --name nginx nginx
```
確認のためにログインして/homeの内容をチェックすると無事マウントされていることが確認できる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416263/4b1eac1d-6843-1e15-6bd2-8d304c802d64.png)

## 補足：Docker Machine 起動時に自動でマウントするよう設定


# 参考ＵＲＬ
今回参考にしたサイトは下記の通り。
っていうかこちらのほうが丁寧で内容の説明が深いのでよくわからなくなったら折に触れて立ち返りたい。
https://humo-life.net/memo/doku.php?id=%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2:docker:docker_toolbox%E3%81%A7%E3%83%9E%E3%82%A6%E3%83%B3%E3%83%88_%E5%85%B1%E6%9C%89%E3%83%95%E3%82%A9%E3%83%AB%E3%83%80_%E8%A8%AD%E5%AE%9A
【Java】データ型・行列の積（AOJ⑧行列の積）


#データ型（データの種類）
* データの**種類と大きさにあったデータ型**を使う
    * **byte, char**：バイトデータを格納する
    * **short**：小さな整数を表す
    * **long**：intで対応できない数値範囲を扱う場合のみ
* 参考：
[【Java】データ型①-基本型](https://qiita.com/suema0331/items/5095f79e540967c2a407#java%E3%81%AE%E3%83%87%E3%83%BC%E3%82%BF%E5%9E%8B)

```java
public class Main {
    public static void main(String[] args){
        //int型の最小値と最大値を確認する
        System.out.println("int   最小/最大値= " + Integer.MIN_VALUE+" ~ "+Integer.MAX_VALUE);
        System.out.println("byte  最小/最大値= " + Byte.MIN_VALUE+" ~ "+Byte.MAX_VALUE);
        System.out.println("short 最小/最大値= " + Short.MIN_VALUE+" ~ "+Short.MAX_VALUE);
        System.out.println("long  最小/最大値= " + Long.MIN_VALUE+" ~ "+Long.MAX_VALUE);
    }
}
```
```java
int   最小/最大値= -2147483648 ~ 2147483647
byte  最小/最大値= -128 ~ 127
short 最小/最大値= -32768 ~ 32767
long  最小/最大値= -9223372036854775808 ~ 9223372036854775807
```

#行列の積（ITP1-7）
>n×m の行列 Aと m×l の行列 B を入力し、それらの積である n×l の行列 C を出力するプログラムを作成してください。
ここで、A、B、C の各要素をそれぞれ aij、bij、cij とします。
Input
１行目に n、m、l が空白区切りで与えられます。
続く行に n×m の行列 A と m×l の行列 B が与えられます。
Output
n×l の行列 Cの要素 cijを出力してください。各行の隣り合う要素を１つの空白で区切ってください。
Constraints
* 1≤n,m,l≤100
* 0≤aij,bij≤10000 


```java
//内積計算
import java.util.Scanner;
import java.util.Arrays;
public class Main {
    public static void main(String[] args){
        Scanner scan=new Scanner(System.in);
        int n=scan.nextInt();
        int m=scan.nextInt();
        int l=scan.nextInt();

        //0≤aij,bij≤10000なので
        //int型の最大範囲2147483647に入らない場合があるので注意！
        // int[][] a=new int[n][m];
        // int[][] b=new int[m][l];
        // int[][] c=new int[n][l];
        
        long[][] a = new long[n][m];
        long[][] b = new long[m][l];
        long[][] c = new long[n][l];

        //行列A
        for(int i=0;i<n;i++)for(int j=0;j<m;j++){
            a[i][j]=scan.nextInt();
        }

        //行列B
        for(int i=0;i<m;i++)for(int j=0;j<l;j++){
            b[i][j]=scan.nextInt();
        }
        
        //行列の積 c=a*b
        for(int i=0;i<n;i++){
            for(int j=0;j<l;j++){
                for(int k=0;k<m;k++){
                    c[i][j]+=a[i][k]*b[k][j];
                }
            }
        }
        // System.out.println(Arrays.deepToString(c));
        StringBuilder sb = new StringBuilder();
        for(int i=0;i<n;i++){
            for(int j=0;j<l;j++){
                sb.append(c[i][j]);
                if(j != l-1) sb.append(" ");
            }
            if(i != n-1) sb.append("\n");
        }
        System.out.println(sb);
        scan.close();
    }
}
```
Error: EPERM: operation not permitted, open '/usr/src/app/src/App.vue'


## npm run serve をした際に operation not permitted が出た。
```
Error: EPERM: operation not permitted, open '/usr/src/app/src/App.vue'
```
vue-cliアプリをビルドしようとすると、エラーが発生します。依存関係のインストールとアプリの提供は正常に機能していました。

### 結論

```
npm install -g @vue/cli --cache /tmp/empty-cache
```

```

上記コマンドで解決。

### 環境
- Docker
- Vue
- Vue CLI

```
$ npm --version
$ @vue/cli 4.5.8
```

### 起きた原因

![スクリーンショット 2020-11-15 13.45.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517237/141aacc1-1990-86c4-9737-7d962b7d89cd.png)

Vue CLI Issue をみる限り、みなさん npm cache clean force はしているようですね。

自分が今回起きたのは 「build に時間がかかるな」 と思ったので 最近していなかった再起動をしました。
↑ 怒らないでください笑


そうすると 今回のErrorが出ました。
理由は正直わかりません。もしわかる方がいらっしゃいましたら、ご教授頂けますと幸いです。

> https://github.com/vuejs/vue-cli/issues/2468
Unityの新しいプロジェクトの作り方

# 前書き
初めてUnityを触る方向け記事になります。
（筆者も初めてUnityに触っているため一部誤りがあるかもしれませんがご了承ください）

Unityのインストールがまだの方はこちらを参照し、インストールしてください。
[Unityインストール手順](https://qiita.com/atsushi-iida/items/2511585a82c59387b7e3)

# Unity起動
Unityインストール後下記アイコンが作成されているので実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/644902/f67571ca-3aae-0d72-4521-d6c0596b7614.png)

起動すると下記のような画面が表示されるので[新規作成]ボタンを押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/644902/2d1ca1eb-3712-3283-d7fc-63598466f49b.png)

テンプレート・プロジェクト名・保存先を入力してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/644902/ecad29b0-e07e-012f-300b-a398c6215211.png)

以上がプロジェクト作成までの手順になります。
Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)のエラー

## エラー内容
railsのアプリでデータベースを作成しようとしたところ、

```
$ bundle exec rake db:create
warning ../../../package.json: No license field
Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
Couldn't create 'hello_rails_development' database. Please check your configuration.
rake aborted!
Mysql2::Error::ConnectionError: Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
```
のエラーが発生。

## 解決策
mysqlが起動できない（Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)）
https://qiita.com/carotene4035/items/e00076fe3990b9178cc0
の記事を参考にmysqlサーバーを再起動しました。

```
$ sudo mysql.server restart
Password:
Sorry, try again.
Password:
Sorry, try again.
Password:
sudo: 3 incorrect password attempts
```
しかし、Passwordが必要と言われ、MySQLのパスワードはとっくに忘れていたので、こちらの記事を参考にMySQLのパスワードを無しにしました。（本当ならrailsアプリのdatabase.ymlにパスワードを記述するべきですが。。。）
Mac ローカル環境の MySQL 8.x のrootパスワードを忘れた時のリセット方法
https://qiita.com/miriwo/items/1880e9d2ebcfd3c0e60d

```
$ mysql.server stop
$ mysqld_safe --skip-grant-tables &
$ mysql -u root
$ mysql.server status
$ kill [番号]
$ ps aux| grep mysqld
$ kill [番号]
$ mysql.server restart
$ bundle exec rake db:create
```

で無事にデータベースを作成できました。
DockerでWordpress開発環境を構築


#はじめに
Dockerはインストール済みとします。
Wordpressのテーマ開発を行う場合にサクッと環境構築できます。

Mac 0SX
Docker 19.03.13

#環境構築

以下のdocker-compose.ymlを環境を作りたいディレクトリに作成してください。

```yml:docker-compose.yml
version: "2"

services:
  wordpress:
    image: wordpress:latest
    ports:
      - "3001:80"
    depends_on:
      - mysql
    env_file: .env
    volumes:
      - ./wp-content:/var/www/html/wp-content

  mysql:
    image: mysql:5.7
    env_file: .env
    ports:
      - "3306:3306"
```

続いて、docker-compose.ymlと同じディレクトリに.envファイル作成してください。

```env:.env
WORDPRESS_DB_NAME=wordpress
WORDPRESS_DB_USER=wp_user
WORDPRESS_DB_PASSWORD=password

MYSQL_RANDOM_ROOT_PASSWORD=yes
MYSQL_DATABASE=wordpress
MYSQL_USER=wp_user
MYSQL_PASSWORD=password
```

docker-compose.ymlを作成したディレクトリに移動して、docker-composeコマンドを実行してください。

```shell:bash
$ cd 作成したファイルのディレクトリ
$ docker-compose build
$ docker-compose up
```

##ブラウザでアクセスしてセットアップ
これで環境が立ち上がったと思いますので、以下のURLでアクセスして、サイト名などをします。
http://localhost:3001/

すると以下のようなフォルダが作成されるかと思います。

```shell:
├── docker-compose.yml
└── wp-content
    ├── index.php
    ├── languages
    ├── plugins
    ├── themes
    ├── upgrade
    └── uploads
```

テーマ開発をする際はwp-content/themesの中のテーマを修正することでできます。

2回目移行の立ち上げはDockerのダッシュボードから実行ボタンをクリックして立ち上げるのが早くて便利です。
停止もダッシュボードから行えます。

php.iniなどを変更したい場合は、ダッシュボードのwordpress_wordpress_1の右側に表示される「CLI」ボタンをクリックするとコンテナに接続できるので、そこからviなどを使用して編集することができます。

![dashboard.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/381859/1e5b89cb-5ada-c06a-dc84-13a624cc8156.png)


#終わりに
なにか間違いがあればご指摘ください。
NO MORE “cd: foo: No such file or directory”

# 二度と “cd: foo: No such file or directory” と言わせない

一度はやるよね．

```:存在しないディレクトリに入ろうとする
$ cd foo
bash: cd: foo: No such file or directory
```

そして fuck と叫びながら fuck する.

```:fuck&nbsp;する
$ fuck
mkdir -p foo && cd foo [enter/↑/↓/ctrl+c]
```

ここで与えられた fuck を見て “これだー” ってなった．

# “これだー” is どれだー

こんな感じの処理をすればいいのでは？
(入ろうとするディレクトリの名前は **foo**)

![フローチャート](https://www.plantuml.com/plantuml/svg/SoWkIImgAStDuG8pk3BJ53GKjBJIylErj1GUDwv_tDp-k6dnu-OrZvk0x8x7pQlUxvcleAbGaf6Q1rHPcLgieCcb00HM2iafS8tMNAavnQdePZrTE-Ffd1MF6wS_RbpskB7bSLCtYbbv-N2ZShDJCeiKT0iG1e8bTEsWCiyw9ZpjcWyoSd_homKTG6aSJe2AFsvgUjpOzhXnmUEcHf1CNafc6j33-GLS3a0sqFS0)

もうあとはこれを書けばいいだけ．

```bash:試し書き
function cd() {
    if [ -d $1 ]; then
        command cd $1
    elif [ ! -e $1 ]; then
        mkdir -p $1 && command cd $1
    else
        echo もうだめ
    fi
}
```

でもエラー表示が **もうだめ** なのはいかがなのだろうか．

# もう少し考える

ファイルに対して cd しようとするともちろん怒られる．

```
$ touch hoge
$ cd hoge
bash: cd: hoge: Not a directory
```

これでいいんじゃないか．

![フローチャート](https://www.plantuml.com/plantuml/svg/SoWkIImgAStDuG8pk3BJ53GKjBJIylErj1GUDwv_kdR6qpah7ZTEVzoux75Zo-EcxlTxvYjeAfHafEO1LURbAsXoAG21bK9kTafcaO9k0LotDLX2rmugywnZmjEk-I0ZzxU-ND0Ha_TqoSPdKwS_cza457lSE1cCbZzkMl6uUUNZvZsFcoOzdJ01Q2NGucTh5prkt0UqsnfgLt8AaYsfESMfMCNpKZBJk7JjGA90ao7MWNqo_t5JvzEzav-tR2DaNN59VW6N0z0aO0W10000)

```bash:とりあえず本命
function cd() {
    if [ ! -e $1 ]; then
        mkdir -p $1 && command cd $1
    else
        command cd $1
    fi
}
```

# おわりに

もっと賢い方法があれば教えてください．
Unityインストール手順

# Unityインストール手順

Unityには複数のプランが存在し、条件に合わせて選択する必要があります。
詳細は下記リンクから確認を推奨しますが、ザクッと解説しますので適切なプランを選択し、Unityをインストールしてください。
[Unityのプラン選択画面](https://store.unity.com/ja/?_ga=2.213248916.1400542760.1605413080-1810471903.1603941029&_gac=1.229044462.1603941029.Cj0KCQjwreT8BRDTARIsAJLI0KLK88iGbyV6GwWQkxJW1vGrBsW7k5PBzGvJK83aFtyCjSulbbyPqhIaAmsJEALw_wcB#plans-individual)

プランは大別し、個人向けと企業向けがあります。
さらに上記2つにそれぞれプランがぶら下がっています。
個人で触ってみたいのであれば自身の年収が約1000万（すごいザックリ価格）を超えていなければPersonalプランで大丈夫です。
ただ、上位のプランの方が色々サービスが追加されているので必要であれば有料のプランを選択することも良いと思います。

|大別|プラン|料金|利用条件|
|---|---|---|---|
|個人向け|Student|無料|学生向け|
|個人向け|Personal|無料|過去12か月の収入・資金調達が10万ドルを超えていない場合<br>企業でも上記条件を満たしていれば当プランを利用可能|
|企業向け|Plus|有料|過去12か月の収入・資金調達が20万ドルを超えていない場合|
|企業向け|Pro|有料|条件なし|
|企業向け|Enterprise|有料|条件なし|
Homestead をアップデートしたい

アップデートの方法がどこにもないので、 box の最新版を追加し、 git のソースも最新化した ([方法はこちら](#最新化))。
ただし、この方法だとデータベースの中身が引き継がれない。
もし最新化する前であれば、普通に `vagrant ssh` で `mysqldump` するだけ。
ダンプの仕方を知りたい人は飛ばして[こちら](#ダンプの仕方)。

自分みたいにうっかり更新した後で、旧 Homestead のデータを取り出したいとなった人は[次へ](#データベース内容の引き継ぎ)。

## データベース内容の引き継ぎ
1. VirtualBox から旧 Homestead を直接起動
2. GUI でログインする(login: `vagrant`, Password: `vagrant`)
3. mysqldump する
4. ホストのコンソールから scp で取り出す
5. 旧 Homestead シャットダウンする
6. 新 Homestead を `vagrant up` で起動する
7. 先程のダンプファイルをゲストと共有しているフォルダに入れる
8. `vagrant ssh` でゲストに入り、共有フォルダに移動する
9. マイグレーションを実行する
10. ダンプを mysql に流し込む

## ダンプの仕方

### データだけとる
大抵の人はマイグレーションを利用しているので、ダンプはデータだけ取れれば良いはず。
`database` と `bk_databas.sql` はそれぞれ自分に合ったものに変更する。

```sql
mysqldump -t `database_name` --ignore-table=migrations > bk_databas.sql
```

### スキーマも一緒に
マイグレーションを利用していない場合は以下になる。
`-t` があるかどうかの違い。

```sql
mysqldump `database_name` > bk_databas.sql
```

## 最新化
1. Homestead.yaml のバックアップ (例: `cp Homestead.yaml Homestead.yaml.bk`)
2. `vagrant box update`
2. `git fetch`
3. `git checkout release`
4. `bash init.sh`
5. いくつか聞かれるが全部 `y`
6. Homestead.yaml の差分を確認し、プロジェクトに必要なところを戻す
7. デフォルトのPHPバージョンが変更になっている場合は、以前のやつに設定する (例: `php72`)

ライブラリとかは何もしなくてもそのまま引き継がれているはずなので、 composer とかは基本的にやらなくて良いはず。
自分のプロジェクトの PHP バージョンが分かっているのであれば、 `Homestead.yaml` の `sites` ディレクティブで該当のプロジェクトに `php: "7.2"` と記載するのが良いと思う。
PHPのビルトイン関数まとめ（ファイル関連）

# はじめに
PHPの学習をはじめたので、アウトプットとして記載します。

# ビルトイン関数とは
ビルトインとはあらかじめ組み込まれていることを意味します。
関数は自身で作ることができますが、PHPにはあらかじめ用意された関数があり、それらをビルトイン関数と呼びます。

# PHPのビルトイン関数（ファイル関連）

fopen：ファイルを開く、fclose：ファイルを閉じる、fwrite：ファイルに書き込む

```:phpファイル
$fp = fopen('names.txt', 'w'); //names.txtを'w'（書き込みモード）で開く、ファイルがない場合は作られる

fwrite($fp, "taro\n"); //テキストファイルにtaroの文字を書き込む、\nは改行の意味

fclose($fp); //開いたファイルを閉じる
```

fopenのオプション

```:phpファイル
$fp = fopen('names.txt', 'w'); //'w'はwrite（書き込みモード）の意味
$fp = fopen('names.txt', 'a'); //'a'はappend(追加するモード)の意味
$fp = fopen('names.txt', 'r'); //'r'はread（読み込みモード）の意味
```

fread：サイズを指定してファイルを読み込む、filesize：ファイルサイズを調べる

```:phpファイル
$fp = fopen('names.txt', 'r');
$contents = fread($fp, filesize('names.txt')); //$contentsにname.txtの中身を代入
fclose($fp);
echo $contents;
```

fgets：ファイルを1行ずつ読み込む

```:phpファイル
$fp = fopen('names.txt', 'r');
while (($line = fgets($fp))!== false) { 
  echo $line;
}  //names.txtを1行ずつ読み込み、読み込み終了時に読み込みした内容を表示する
fclose($fp);
```

file_put_contents：fopenを使わず、ファイルに書き込む

```:phpファイル
$contents = "taro\njiro\nsaburo\n";
file_put_contents('names.txt', $contents); //names.txtファイルの中にtaro\njiro\nsaburo\nが書き込まれる
```

file_get_contents：fopenを使わず、ファイルを読み込む

```:phpファイル
$contents = file_get_contents('names.txt'); //names.txtファイルの中身を$contentsの中に入れることができる
```

file：ファイルの中身を配列にする

```:phpファイル
$lines = file('names.txt', FILE_IGNORE_NEW_LINES); //$linesはnames.txtの中身を順に入れた配列となる
//FILE_IGNORE_NEW_LINESは末尾の改行をなくすオプション
```

opendir：ディレクトリを操作できるようにする、readdir：ディレクトリの中身を1行ずつ読み込む

```:phpファイル
file_put_contents('data/taro.txt', "taro\n");
file_put_contents('data/jiro.txt', "jiro\n");

$dp = opendir('data');
while(($item = readdir($dp)) !== false) {
  if ($item === '.' || $item == '..'){
    continue;
  }  //dataディレクトリの中身（ファイル）が存在する限り$itemに代入する、ただし、'.'や'..'は除く
  echo $item . PHP_EOL;
}
```

glob：指定したパスを配列として取り出す、basename：ファイル名だけ取り出せる

```:phpファイル
foreach (glob('data/*.txt') as $item) { //globで取り出したファイルを要素とする配列の要素を$itemに代入する
  echo $item . PHP_EOL; // ファイルを表示する、表示はdata/〇〇.txtの形式
  echo basename($item) . PHP_EOL;　// ファイルを表示する、表示は〇〇.txtの形式
}
```

file_exits：ディレクトリやファイルが存在する時true、存在しない時falseを返す
is_writable：ファイルが書き込み可能な時true、書き込み不可の時falseを返す
is_readable：ファイルが読み込み可能な時true、読み込み不可の時falseを返す

```:phpファイル
file_exists('data'); //dataディレクトリもしくはdataファイルがあれば、true
is_writable('data/taro.txt'); //dataディレクトリ内のtaro.txtが書き込み可能ならtrue
is_readable('data/taro.txt'); //dataディレクトリ内のtaro.txtが読み込み可能ならtrue
```

# 参考
ドットインストール

# 最後に
本投稿が初学者の復習の一助となればと幸いです。
tkinterにファイルをドロップしてそのパスを取得したい【TkinterDnD2】

#できそうな気がするんです。

蛇口です。普段はエンジニアでも何でもありません。
特に必要というわけではないんですが巷にあるウィンドウって
たいていファイルをドロップすると、それに対して何かしてくれている気がするんです。

Tkinterも見た目からして「私、できますよ」という顔をしていたんですが
まあ普通にファイルをドロップしても何も起きないわけですね。

今回、Qiitaには載ってなかったので（見つけらなかっただけかもしれませんが）
今後同じ手間を踏む必要がないようにこちらに投稿しておくことにしました。

##環境
Windows10 64bit
python3.7

##TkinterDnD2
どうやら、Tkinterに加えて__TkinterDnD2__というものを使うことで
ドロップされたファイルを受け取ることができるようになるそうです。

じゃあ、いつものように「pip install」すればいいんじゃない？と私は考えました。

```pip install tkinterdnd2
ERROR: Could not find a version that satisfies the requirement tkinterdnd2 (from versions: none)
ERROR: No matching distribution found for tkinterdnd2```

ダメでした。

##TkinterDnD2のインストール
インターネットをサーフィンして、ようやくこのサイトにたどり着きました。
[こちら](https://sourceforge.net/projects/tkinterdnd/files/TkinterDnD2/)から、なんとなく新しいほうをダウンロードしました。

ダウンロードしたものを解凍すると、なんと、たくさんファイルがあるではありませんか。
これは混乱です。どうすればいいんでしょうか。

これまたインターネットをサーフィンすると
__「自分のsite-packagesフォルダにTkinterDnD2フォルダを置く」__ということでした。

解凍されて出てきたものの中に、確かに__「TkinterDnD2」__というフォルダがありました。
なるほど、これをsite-packagesに移動させて…。
というところで手が止まりました。
__あれsite-packagesって、どこにあるんだっけ？__

##site-packagesの場所が分からない
site-packagesって、なんとなくpip installとかで手に入れる者たちが置かれる場所だと記憶しています。
そして実際に何回か行ったこともあるんですが…、正直どこか思い出せませんでした。

これまた私はインターネットをサーフィンしました。
コマンドプロンプトで以下のコマンドを実行することでsite-packagesへのパスを取得することができました。
ありがとう、インターネット。
[ありがトンクス！](https://qiita.com/jaguti/items/be36b6a4f0260be2d044)

1.Windowsキー＋Rで「ファイルを指定して実行」を起動
2.cmdと入力して「OK」
3.python -c "import site; print (site.getsitepackages())"

##やはり、できない！
苦労してようやくドラッグアンドドロップができるようになったと思いましたが
普通にエラーになってできませんでした。
どうやら、TkinterDnD2のほかに__tkDnD2__というものが必要のようです。

tkって略称っぽいけど、どうやらこの2つは全くの別物のようです。
JavaとJavaScriptは全然別物だよとか、そういうのはもうやめてほしいです。

##tkDnD2のインストール
[ここ](https://sourceforge.net/projects/tkdnd/files/Windows%20Binaries/TkDND%202.8/)から64bitに対応しているはずの「tkdnd2.8-win32-x86_64.tar.gz」をダウンロードしました。
gzファイルという見かけないタイプの圧縮でしたが、Lhaplusが簡単に解凍してくれました。
解凍すると、これまたたくさんのファイルが出てきました。

今回は以下のフォルダに、すべてをコピーさせるそうです。
__（略）\Programs\Python\Python37\tcl\tkdnd__
tclまでは既に存在していました。
tkdndはありませんでしたので、自分で作成しました。

##ドロップされたファイルのパスが獲得できた！
![uma.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311431/2a6ec25c-9ea0-24b5-b604-15074789b45f.gif)
今回は動画のパスを取得して、キャンバスに描写してみました。
今のままだと何の役にも立ちそうにないですが、何かとに組み合わせることには意味がありそうです。
Twitter APIを使用してツイートしたいけど"Your credentials do not allow access to this resource."が出てくる時の対処法



#### 前提/環境
- [Twitter（Twitter for Node.js）](https://www.npmjs.com/package/twitter)というライブラリを使用しています
- FirebaseのCloudfunctionsを使用してその中で上記のTwitterを使用してロジックを作っています 
- Twitter Developersでの各種キーの取得（Consumer API keys, Access token & access token secret）は全て終わっています

#### やりたいこと、できなかったこと
- 自分が作ったWebアプリケーションの中で、Twitterでログインしたユーザが各自のTwitterアカウントでツイートできるようにすること

#### 原因

- 原因は、以下のようにbearer_tokenをセットしてしまっていたことでした

```javascript:functions/index.js
      const client = new Twitter({
        consumer_key: vz***** /** consumer key */,
        consumer_secret: mT***** /** consumer secret */,
        bearer_token: ******* /** Bearer Token */,
        access_token_key: 11*****,
        access_token_secret: 0d*******
      });
```

[Bearer Tokenを使用してユーザーコンテキスト（statuss / home_timelineなど）を必要とするエンドポイントをリクエストしてはいけない](https://developer.twitter.com/en/docs/authentication/oauth-2-0/application-only)みたいです。

以下のように修正して無事にTwitter投稿ができました。

```javascript:functions/index.js
      const client = new Twitter({
        consumer_key: vz***** /** consumer key */,
        consumer_secret: mT***** /** consumer secret */,
        access_token_key: 11*****,
        access_token_secret: 0d*****
      });
```

（TwitterAPIをNodeで何かしたい時は、[Twitter](https://www.npmjs.com/package/twitter)ライブラリ使うのがおすすめです。）

以上です。何かのお役にたてば幸いです！
jupyter notebook上でPCのGPUチェック



#備忘録

「!」記号を付けることでnotebook上でもcmd上のコマンドを実行できるので、以下のように


```
!nvidia-smi
```


```
(base) C:\Users\user>nvidia-smi
Sun Nov 15 00:00:00 2020
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 456.71       Driver Version: 456.71       CUDA Version: 11.1     |
|-------------------------------+----------------------+----------------------+
| GPU  Name            TCC/WDDM | Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  GeForce GTX 1070   WDDM  | 00000000:01:00.0  On |                  N/A |
|  0%   50C    P8     9W / 151W |   4805MiB /  8192MiB |      6%      Default |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                                  |
|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
|        ID   ID                                                   Usage      |
|=============================================================================|
|    0   N/A  N/A      6664    C+G   C:\Windows\explorer.exe         N/A      |
+-----------------------------------------------------------------------------+
```



notebookでなくともcmdプロンプト上から行っても同じ。


#以上
jupyter notebook上でgithubのリポジトリをclone



#備忘録

作業ディレクトリをnotebook上で指定して
任意のフォルダへgit cloneする

```py
import os
os.chdir("C:\\Users\\user")
os.listdir()
```

ここからもnotebook上で

```
!git clone https://github.com/your_github_name/repo.git
```



あとは
os.remove()
をつかって使い終わったフォルダを消してやればok

#以上
総務省のオンライン講座「IoT入門」を受講してみた

無料なので受けてみた。

https://gacco.org/soumu_iot/

- 2021年3月24日まで開講
- gacco に事前登録する必要はあるが、住所などの個人情報は登録しなくて良い
- 動画を視聴する時間がない人は、30ページ以上のテキスト（PDF形式）だけでもいいかも。これも無料でもらえる
- アンケートはあるが、回答しなくても受講できる

あくまで入門なので、普段から仕事でIoTを扱っている方には物足りないかも。
Visual Studio CodeでMarkdownを書く際、リンクを挿入するショートカットを設定する

#Visual Studio CodeでMarkdownを書く際、リンクを挿入するショートカットを設定する
Qiitaのデフォルトエディタ画面だとどうにも違和感があり、設定が済んでいるVSCodeで書いた。
思いの外快適であったが、若干痒いところに手が届かなかったので、備忘として書いておく。

## リンクを挿入するショートカット設定
> [VSCode拡張機能 Markdown All in One / Issues:'"Create Link" command #841' より](https://github.com/yzhang-gh/vscode-markdown/issues/841)

```
  {
    "key": "alt+l",
    "command": "editor.action.insertSnippet",
    "when": "editorLangId == 'markdown'",
    "args": {
        "snippet": "[$TM_SELECTED_TEXT$1]($0)"
    }
  },
```
上記を元に、適宜なキーを選ぶなりカーソル位置を指定するなり改変し、VSCodeのkeybindings.json(Preference: Open Keyboard Shortcuts(JSON)より)の良さげなところに挿入

## Visual Studio CodeでMarkdownを書くにあたって導入した拡張機能
安直に、VSCodeの拡張機能で'markdown'と検索して上から2つ入れました。
これで事足りたので、ベストかどうかはわかりません。

[Markdown All in One](https://github.com/yzhang-gh/vscode-markdown)
上記掲示板の本来の議論対象。

[Markdown Preview Enhanced](https://github.com/yzhang-gh/vscode-markdown)
デフォルトのプレビューだと、改行にスペース2つ必要でQiitaの仕様に合わないために導入。
PHPのビルトイン関数まとめ（文字列や数値）

# はじめに
PHPの学習をはじめたので、アウトプットとして記載します。

# ビルトイン関数とは
ビルトインとはあらかじめ組み込まれていることを意味します。
関数は自身で作ることができますが、PHPにはあらかじめ用意された関数があり、それらをビルトイン関数と呼びます。

# PHPのビルトイン関数（文字列や数値）

sprintf：フォーマットした文字列を返す
%s：文字列、%d：整数、%f：浮動小数点数

```:phpファイル
<?php

$name = 'Apple';
$score = 32.246;

$info = "[$name][$score]";
echo $info . PHP_EOL;
=> [Apple][32.246]

$info = sprintf("[%15s][%10.2f]", $name, $score);　//15は15文字、10.2は小数点含め10文字、小数点以下2文字
echo $info . PHP_EOL;
=> [          Apple][     32.25]

$info = sprintf("[%-15s][%010.2f]", $name, $score); //-15は全部で15文字で文字列は左づめ、%0は0が手前に出る
echo $info . PHP_EOL;
=> [Apple          ][0000032.25]
```

printf：フォーマットした文字列を出力する（sprintfとechoが合体したようなもの）

```:phpファイル
<?php

$name = 'Apple';
$score = 32.246;

printf("[%-15s][%010.2f]" . PHP_EOL, $name, $score);
=> [Apple          ][0000032.25]
```

strlen：文字列の長さを表示する

```:phpファイル
$input = 'dot_yamada';
echo strlen($input) . PHP_EOL;
=> 10
```

mb_strlen：日本語の文字列の長さを表示する

```:phpファイル
$input = 'こんにちは';
echo strlen($input) . PHP_EOL;
=> 5
```

strpos：文字列の中の指定した文字の場所を表示する

```:phpファイル
$input = 'dot_yamada';
echo strpos($input, '_') . PHP_EOL;
=> 3 //順番は0から始まる
```

mb_strpos：日本語の文字列の中の指定した文字列の場所を表示する

```:phpファイル
$input = 'こんにちは';
echo strpos($input, 'に') . PHP_EOL;
=> 2 //順番は0から始まる
```

trim：空白を取り除く

```
$input ='   dot_yamada';
echo $input . PHP_EOL;
=>    dot_yamada

$input = trim($input);
echo $input . PHP_EOL;
=> dot_yamada
```

str_replace：文字を入れ替える

```
$input = 'dot_yamada';
$input = str_replace('_', '-', $input); //$inputの'_'を'-'に入れ替える
echo $input . PHP_EOL;
=> dot-yamada
```

substr：固定長データからデータを抜き出す

```
$input = '20200320Item-A  1200';
$date = substr($input, 0, 8);
echo $date . PHP_EOL;
=> 20200320
```

substr_replace：固定長データのデータを入れ替える

```
$input = '20200320Item-A  1200';
$input = substr_replace($input, 'Item-B  ', 8, 8);
echo $input . PHP_EOL;
=> '20200320Item-B  1200';
```

number_format：数字を３桁ごとにカンマを入れる

```
$input = 1200
echo number_format($input) . PHP_EOL;
=> 1,200
```

preg_match：パターンに合致するもの一つを引き出す

```
$input = 'Call us at 03-3001-1256 or 03-3015-3222';
$pattern = '/\d{2}-\d{4}-\d{4}/';　//正規表現

preg_match($pattern, $input, $matches);
print_r($matches);
=> Array
(
    [0] => 03-3001-1256
)
```

preg_match_all：パターンに合致するもの全てを引き出す

```
$input = 'Call us at 03-3001-1256 or 03-3015-3222';
$pattern = '/\d{2}-\d{4}-\d{4}/';

preg_match_all($pattern, $input, $matches);
print_r($matches);
=> Array
(
    [0] => Array
        (
            [0] => 03-3001-1256
            [1] => 03-3015-3222
        )

)
```

preg_replace：パターンに合致するものを入れ替える

```
$input = 'Call us at 03-3001-1256 or 03-3015-3222';
$pattern = '/\d{2}-\d{4}-\d{4}/'; //正規表現

$input = preg_replace($pattern, '**-****-****', $input);
echo $input . PHP_EOL;
=> Call us at **-****-**** or **-****-****
```


ceil：数値を切り上げ、floor：数値を切り捨て、round：四捨五入

```
$n = 5.6283;

echo ceil($n) . PHP_EOL;
=> 6

echo floor($n) . PHP_EOL;
=> 5

echo round($n) . PHP_EOL;
=> 6

echo round($n, 2) . PHP_EOL; //小数点以下が2桁になるように四捨五入
=> 5.63
```

max：最大値を選択、min：最小値を選択

```
echo max(3, 9, 4) . PHP_EOL;
=> 9

echo min(3, 9, 4) . PHP_EOL;
=> 3
```

# 参考
ドットインストール

# 最後に
本投稿が初学者の復習の一助となればと幸いです。
特定のS3の特定のディレクトリ以下だけ読み書き可能なIAMポリシー

## ざっくり要件

- 不要なAWSリソースを見たくない・見せたくないIAMユーザを作成したい
- 特定のS3のapp/以下だけ（重要）
- アクションとしては、ディレクトリ作成、アップロード、ダウンロード、閲覧
- 他のS3バケット名も見せない
- IP制限等は別途
- MFA付き等は今回は除外
- バケット名は参考から名前を流用して `AWSDOC-EXAMPLE-BUCKET`
- S3バケットは東京リージョン

## 個人的なポイント

- バケットポリシー側をいじる必要はなかった
- S3バケットのアクセス許可も `パブリックアクセスをすべてブロック` のままでよい
- 特定のURLでアクセスする必要がある
  - https://s3.console.aws.amazon.com/s3/buckets/AWSDOC-EXAMPLE-BUCKET?region=ap-northeast-1&prefix=app/
  - S3のバケット一覧からは遷移できない(権限がないため。一部だけ閲覧できるやり方を見つけられなかった)

## IAMポリシー

```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListBucketVersions",
                "s3:ListBucket"
            ],
            "Resource": "arn:aws:s3:::AWSDOC-EXAMPLE-BUCKET",
            "Condition": {
                "StringLike": {
                    "s3:prefix": "app/*"
                }
            }
        },
        {
            "Effect": "Allow",
            "Action": "s3:GetBucketVersioning",
            "Resource": "arn:aws:s3:::AWSDOC-EXAMPLE-BUCKET"
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:GetObjectAcl",
                "s3:GetObject",
                "s3:DeleteObjectVersion",
                "s3:GetObjectVersionTagging",
                "s3:GetObjectVersionAcl",
                "s3:GetObjectTagging",
                "s3:DeleteObject",
                "s3:GetObjectVersion"
            ],
            "Resource": "arn:aws:s3:::AWSDOC-EXAMPLE-BUCKET/app/*"
        }
    ]
}
```

### 参考

[特定のバケットに対する Amazon S3 コンソールのアクセス許可をユーザーに付与するにはどうすればよいですか?](https://aws.amazon.com/jp/premiumsupport/knowledge-center/s3-console-access-certain-bucket/)
Laravel6系エラー、/login の表示がView [auth.login] not found.の対策

Laravel6 で認証画面を作ろうとしたらエラーがでました。
その対策についての内容になります。

# 現象
`/login` へのアクセスでエラーが出ました。

```:エラー表示
InvalidArgumentException
View [auth.login] not found.
```
`auth.login` というビューがないとエラーになっています。

# 環境
環境は Laravel6.x です。

```:Laravelのバージョン
php artisan --version                                 
Laravel Framework 6.20.3
```

# 対策
Laravel6 から laravel/ui が必要らしいです。
composer から入れます。

```
composer require laravel/ui 1.*
```

自分は Mac と Docker の環境でメモリの都合で以下のコマンドから入れました。

```
php -d memory_limit=-1 /usr/local/bin/composer require laravel/ui 1.*
```

# 確認
`/login` へアクセスしいます。

![スクリーンショット 2020-11-15 12.06.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1624/27514394-93f5-fe95-6d64-343be6710890.png)

# 参考
[認証 6\.x Laravel](https://readouble.com/laravel/6.x/ja/authentication.html)