OmniAICreator/Qiita-1.07M huggingface dataset:
お名前.com（共用サーバーSD）で phpMyAdmin 設置時に forbidden エラーになる

お名前.com の 共用サーバーSDプランでホスティングしているプロジェクトに phpMyAdmin を設置したときに権限の問題でハマったので忘備録として記録を残しておきます。

## 問題点

本来ならこの公式ドキュメントの通りに行えば問題なく phpMyAdmin の初期画面までは表示できます。

http://guide.onamae-server.com/sd/3_12_15_25_2/?_ga=2.245150341.169094406.1619744530-471134557.1619744530


今回ハマったきっかけは間違った権限設定です。そのため、初期ページにアクセスしたところブラウザに forbidden のエラーが表示されました。

下記のドキュメント引用文の通り、本来はphpファイルだけ700に権限変更すればよかったところ、間違って全てのファイルを 700 にしてしまっていました...

> phpMyAdminでは、PHPファイルのパーミッション（属性）設定をすべて「700」にする必要があります。 
> ※「phpmyadmin」等、フォルダのパーミッションは「755」です。 

## 解決策

ドキュメントでは windows の FFFTP という有名な FTPソフトを使用して、アップロード時にphpファイルだけ権限変更する方法が書かれていますが、自分の環境は mac で FFFTP が使えませんでした。（windowsの方はドキュメント通り FFFTP でアップロードすれば問題なしです。）

そのため、一旦 phpMyAdmin のソースファイル全て削除＆再アップロードしてから、SSHを使用してコマンドで一括権限変更する方法にしました。

http://guide.onamae-server.com/sd/4_18_78_163/

タイトルがFTPになってますが、このドキュメントにSSHアカウント情報を確認する方法が書かれているので、それを参考にまずは ssh でログイン。 
（Mac で SSH をするソフトは アプリケーション > ユーティリティ > ターミナル.app ）

```
$ ssh sd********@gmoserver.jp@ssh**.gmoserver.jp
The authenticity of host 'ssh**.gmoserver.jp (***.*.**.***)' can't be established.
RSA key fingerprint is SHA256:***************************
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added 'ssh**.gmoserver.jp,***.*.**.***' (RSA) to the list of known hosts.
Password: 
```

アップロードしたphpMyAdminのディレクトリまで移動して...

```
cd domainName/phpmyadmin
```

find コマンド と chmod コマンドで php ファイルだけ一括してパーミッション変更を実施します。

```
find . -name '*.php' -exec chmod 700 {} \;
```

以上で完了。

ブラウザで https://********/phpmyadmin/setup.php を表示したところ無事画面が見れました！
[PostgreSQL]ユーザーパスワードを忘れてしまったときの対処方法

Postgres初心者です`psql -U postgres`でログインしようとしたところパスワードが合致せず詰まったので、備忘録としてメモ、下記記事を参考にさせていただきました。

https://qiita.com/colorrabbit/items/0e481af2490603a271fe

## 解決方法
`pg_hba.conf`ファイルを探します。

```
$ find / -print |grep pg_hba.conf
-> /var/lib/pgsql/data/pg_hba.conf
```

vimを使ってファイルを編集しましょう

```
$ vim /var/lib/pgsql/data/pg_hba.conf
```

下にスクロールして以下のように表示されている場所を探します。

```
# TYPE  DATABASE        USER            ADDRESS                 METHOD

# "local" is for Unix domain socket connections only
local   all             all                                     md5
# IPv4 local connections:
host    all             all             127.0.0.1/32            password
# IPv6 local connections:
host    all             all             ::1/128                 password
```

これを下記のようにMETHODの部分を`Trust`変更します。

```
# "local" is for Unix domain socket connections only
local   all             all                                     trust
# IPv4 local connections:
host    all             all             127.0.0.1/32            trust
# IPv6 local connections:
host    all             all             ::1/128                 trust
```

postgresを再起動します。

```
$ service postgresql restart
```

するとログインできるようになっています

```
psql -U postgres
postgres=#
```

## パスワードを変更する
このままではパスワードが設定されていなくセキュアではないので、postgreユーザのパスワードを変更して`pg_hba.conf`ファイルを元に戻しましょう

```
postgres=# ALTER ROLE postgres WITH PASSWORD {'パスワード'};
ALTER ROLE
```

そしたら`pg_hba.conf`ファイルの設定を戻します。posgresからログアウトして再びvimを使います。

```
$ vim /var/lib/pgsql/data/pg_hba.conf
```

```
# TYPE  DATABASE        USER            ADDRESS                 METHOD

# "local" is for Unix domain socket connections only
local   all             all                                     md5
# IPv4 local connections:
host    all             all             127.0.0.1/32            password
# IPv6 local connections:
host    all             all             ::1/128                 password
```

元に戻して一件落着！
これでログイン時にパスワードが聞かれるようになります。
LED cube　5×5×5

#はじめに
Arduino MEGAを使って5×5×5LED Cubeを作成を行います。


#目次
1. 電子部品リスト
2. 回路図
3. Arduino MEGAのプログラム
4. 動画
5. まとめ


# 1.電子部品リスト

|名称|個数|
|:---:|:---:|
|Arduino MEGA|1個|
|LED|125個|
|抵抗 150Ω|5個|
|ジャンパー線|30本|




#2.回路図

![LED.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675881/d7984386-5c5d-cd7b-ecba-14db448967e8.jpeg)

それぞれの番号とArduino MEGAに配線をしていきます。



# Arduino MEGAのプログラム

```ruby:LEDcube.rd
#define LED_SIZE   25
#define FLOOR_SIZE  5
#define SIDE_SIZE   5

byte dots[] = {
  22, 23, 24, 25, 26,
  27, 28, 29, 30, 31,
  32, 33, 36, 37, 38, 
  39, 40, 41, 42, 43,
  44, 45, 46, 53, 52
};

byte floors[] = {
  2, 3, 4, 5, 6
};

byte memmap[FLOOR_SIZE *  LED_SIZE];


void pset(byte* pattern, int floor_num, int dot_num, byte value) {
  pattern[floor_num * LED_SIZE + dot_num] = value;
}

byte pget(byte* pattern, int floor_num, int dot_num) {
  return pattern[floor_num * LED_SIZE + dot_num];
}

void setup() {
  int i, j;
  
  randomSeed(analogRead(0));
  
  for (i = 0; i < LED_SIZE; i++)
    pinMode(dots[i], OUTPUT);
    
  for (i = 0; i < FLOOR_SIZE; i++)
    pinMode(floors[i], OUTPUT);
    
  setFloor(0);
  
  for (i = 0; i < FLOOR_SIZE; i++)
    for (j = 0; j < LED_SIZE; j++)
      pset(memmap, i, j, LOW);
}

// num: 0 origin
void writeDotValue(int num, int value) {
  digitalWrite(dots[num], value); 
}

// num: 0 origin
void setFloor(int num) {
  int i;

  for (i = 0; i < FLOOR_SIZE; i++)
    digitalWrite(floors[i], i == num ? HIGH: LOW);
}

// 一回分の描画
#define DELAY_US 600
int setDots(byte* pattern) {
  long current;
  long wait_us = 0;
  int f, i;

  for (f = 0; f < FLOOR_SIZE; f++) {
    current = micros();

    setFloor(f);
    for (i = 0; i < LED_SIZE; i++)
      writeDotValue(i, pget(pattern, f, i));

    delayMicroseconds(DELAY_US);
    wait_us += micros() - current;
  }
  return (int)(wait_us / 1000);
}

void draw(byte* pattern, int ms) {
  int total_ms = 0;
  
  while (true) {
     total_ms += setDots(pattern);
     if (total_ms >= ms)
       break;
  }
}

void loop() {
  int i, j;
  
  for (i = 0; i < FLOOR_SIZE - 1; i++)
    for (j = 0; j < LED_SIZE; j++) 
       pset(memmap, i, j,
            pget(memmap, i + 1, j));
  
  for (j = 0; j < LED_SIZE; j++) 
    pset(memmap, 4, j, random(10000) % 9 == 0 ? HIGH: LOW);
    
  draw(memmap, 150);
} 
```







# 4.動画
下の画像を選択すると動画が再生されます。
__YouTube__に飛びます。
[![ビデオが開けなかった場合に表示されるテキスト](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675881/2002d80d-f452-25d5-4a23-cb96fd2f9228.jpeg)](https://youtu.be/A_hgVGeA0jM)

# 5.まとめ
今回、LEDの足が短いのを購入してい半田する際に半田コテがLEDと接触してしまいLEDを溶かすハプニングが度々起こりました。

LEDの足が長いやつを買うことをオススメします。それにLEDどうしの間隔がが広い方が光っている際にキレイに見えますよ。
CRUDについてのまとめ

#CRUD
アプリケーションのデータ取り扱いに関して、基本的な処理の頭文字を並べたものです。
アプリケーションの機能は、この4つの処理を組み合わせながら実装します。

```
C（Create）  R（Read）  U（Update）  D（Delete）
  生成      読み取り    更新	   削除
```
Railsでは、CRUDを7つのアクションに分割して、処理を実現します。

#7つのアクション
CRUDを実現するためには、それぞれの処理を記述する必要があります。
Ruby on Railsには、それらのアクションの設定が慣習的に決められており、下記の表のようなアクションが存在します。

```
アクション名	内容
index	 一覧表示
show	 詳細表示
new	      生成
create	  保存
edit	  編集
update	  更新
destroy	  削除
```

これを本カリキュラムでは、「7つのアクション」と呼んでいます。
これらの7つのアクションのルーティングは、resourcesメソッドを使用することで一度に設定が可能です。

#resourcesメソッド
resourcesは、7つのアクションへのルーティングを自動生成するメソッドです。
resourcesの引数に、:tweets というシンボルを指定すると/tweetsのパスに対応するルーティングが生成されます。

例】resourcesメソッドの使用例

```
Rails.application.routes.draw do
  resources :tweets
end
```
上記のように記載すると、以下のような7つのアクションすべてのルーティングを設定したことになります。

例】resourcesメソッドで自動生成されるルーティング

```
GET          /tweets(.:format)                   tweets#index
POST         /tweets(.:format)                   tweets#create
GET          /tweets/new(.:format)               tweets#new
GET          /tweets/:id/edit(.:format)          tweets#edit
GET          /tweets/:id(.:format)               tweets#show
PATCH        /tweets/:id(.:format)               tweets#update
PUT          /tweets/:id(.:format)               tweets#update
DELETE       /tweets/:id(.:format)               tweets#destroy
```
FileMaker DataAPIでのJavaでのREST操作

## FileMaker DataAPI をJavaから使っています

FileMaker DataAPIはRestAPIです。
結果はJSONで返ってきますが、
みなさんはどうやって、RESTを扱っていますか？

Jacksonというライブラリが一番有名なようですが、私は使った事がありません。

私は、[minimal-json](https://github.com/ralfstx/minimal-json/)というライブラリを、
使って、DataAPIから帰ってきたRESTを操作しています。

このライブラリは、Javaのソースが、たったの１５ファイルしかありません。
プロジェクトにjarを使うのではなく、ソースをそのままプロジェクトに入れて
しまった方が、学習が楽だと思いました。


JavaのObjectに相当するのが、JsonValueです。
JavaのMapに相当するのが、JsonObjectです。
この２つを頭に叩き込めば、なんとか使えるようになると思います。


（私は最初にJavaのObjectに相当するのがJsonObjectと勘違いしてしまったので
 　　いつも頭が混乱してプログラムを書いていました）

私が使った限りでは、FileMaker DataAPIから、true, false, nullが
返ってくることはありませんでした。

FileMaker のDBのデータタイプには論理型はないので、true, falseがないのは納得できます。

しかしFileMakerのフィールドに値が入っていない時に "" 空文字列が返ってくるのは
少し違和感がありました。

これが、DataAPI (RESTに変換する時)の問題なのか、それともFileMakerのDB自体の
問題なのかは、わかっておりません。
GitHubでプライベートな組織の登録メンバリストを取得するには

# アクセストークンを使う方法（2021年度版）
[前回記事](https://qiita.com/mikantsuki/items/df41466b1d380ecb2698)も一年前になりましたが、今年もGitHubを使った演習を続けています。前年度も何か色々書くこともあった気がするんですが、忙しくてすっかり忘れてしまったので略。

来年度もおそらく続くと思われるので、いくつか後で見返すためのメモをこの辺に書いておきます。

課題：未登録者をチェックしたいので、現時点での組織の登録メンバ一覧が欲しい

解決策：GitHub APIで取得できるらしい。

実行結果：

```bash
$ curl -H "Accept: application/vnd.github.v3+json"   https://api.github.com/orgs/$ORG/members
[

]
```

…中身がないな？
組織がプライベートなのでおそらくアクセスが出来てない模様。

サブ課題：プライベートな組織にアクセスするには

解決策：個人アクセストークンを発行してそれを使えば行けるらしい

実行：

* 「[個人アクセストークンを使用する](https://docs.github.com/ja/github/authenticating-to-github/creating-a-personal-access-token)」を参考にトークンを取得
* https:// と api の間にトークンを挿入して再実行 

```bash
$ curl -H "Accept: application/vnd.github.v3+json"   https://$TOKEN@api.github.com/orgs/$ORG/members
```

無事に出たぽい。後はこれをJSONから適当な形式に変換するだけですね。
とりあえずメモ終わり。

追記メモ：JSONをCSVファイルへ変換する方法
[この辺](https://qiita.com/h5810yyabe/items/28598587522f25e54662)を参考に変換を試みた。

```bash
 cat members.json | jq -r '["login"], (.[] | [.login]) | @csv' > members.csv
```

一列しかないのでtxtでも良いかも。ともあれ、できました。

追記メモ：複数ページへ渡る場合はURLに?page=でページ指定が必要

# GitHub CLIを使う方法（2023年度版）
今年度もリスト取得しようと思って、アクセストークンの取り方を確認しに[上記ページ](https://docs.github.com/ja/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token)
を見たら、GitHub CLIかGit Credential Manager を使えと書いてあったので、GitHub CLIをインストールして gh auth login で認証後、以下のコマンドを実行してリストを取得した。

```bash
$ gh api --paginate orgs/$ORG/members > members.json
```

`--paginage`を付けないと、ページ単位で30件しか取ってこないので注意。

Unicodeになってて、後処理するのにUTF-8への変換が必要だったり、jqがJSONの書式が違うとか文句を言ったりしたが、エディタで適当に処理した。
Max MSP でWeb Linkを開かせる方法


Max画面内やUI上でウェブURLを開かせたい時の書き方です。


メッセージオブジェクトに以下の書き方で開けるそうです。
何だか少し特殊な書き方ですね。

(;
 max launch xxxxx
)


![スクリーンショット 2021-05-01 18.24.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152481/d5a801e2-2e8d-a299-e85b-6d61626f167e.png)



```Max
{
	"boxes" : [ 		{
			"box" : 			{
				"maxclass" : "message",
				"text" : "NINETEEN95 STUDIO",
				"presentation_rect" : [ 1095.400003790855408, 144.0, 129.0, 23.0 ],
				"patching_rect" : [ 1879.0, 752.0, 129.0, 23.0 ],
				"outlettype" : [ "" ],
				"fontsize" : 12.0,
				"textcolor" : [ 1.0, 1.0, 1.0, 1.0 ],
				"fontname" : "Lucida Grande",
				"id" : "obj-38",
				"numinlets" : 2,
				"presentation" : 1,
				"numoutlets" : 1,
				"gradient" : 0,
				"bgcolor" : [ 0.866667, 0.866667, 0.866667, 0.0 ],
				"bgfillcolor_type" : "gradient",
				"bgfillcolor_color1" : [ 0.866667, 0.866667, 0.866667, 0.0 ],
				"bgfillcolor_color2" : [ 0.07451, 0.027451, 1.0, 1.0 ],
				"bgfillcolor_color" : [ 0.2, 0.2, 0.2, 1 ],
				"bgfillcolor_autogradient" : 0.79
			}

		}
, 		{
			"box" : 			{
				"maxclass" : "message",
				"text" : "https://nineteen95.stores.jp/",
				"patching_rect" : [ 1879.0, 783.0, 181.0, 23.0 ],
				"outlettype" : [ "" ],
				"fontsize" : 12.0,
				"textcolor" : [ 0.0, 0.0, 0.0, 1.0 ],
				"fontname" : "Lucida Grande",
				"id" : "obj-35",
				"numinlets" : 2,
				"numoutlets" : 1,
				"gradient" : 0,
				"bgcolor" : [ 0.866667, 0.866667, 0.866667, 0.0 ],
				"bgfillcolor_type" : "gradient",
				"bgfillcolor_color1" : [ 0.866667, 0.866667, 0.866667, 0.0 ],
				"bgfillcolor_color2" : [ 0.07451, 0.027451, 1.0, 1.0 ],
				"bgfillcolor_color" : [ 0.2, 0.2, 0.2, 1 ],
				"bgfillcolor_autogradient" : 0.79
			}

		}
, 		{
			"box" : 			{
				"maxclass" : "message",
				"text" : ";\rmax launchbrowser $1",
				"linecount" : 2,
				"patching_rect" : [ 1879.0, 815.0, 114.0, 30.0 ],
				"outlettype" : [ "" ],
				"fontsize" : 9.0,
				"fontname" : "Verdana",
				"id" : "obj-58",
				"numinlets" : 2,
				"hidden" : 1,
				"numoutlets" : 1
			}

		}
 ],
	"lines" : [ 		{
			"patchline" : 			{
				"source" : [ "obj-38", 0 ],
				"destination" : [ "obj-35", 0 ]
			}

		}
, 		{
			"patchline" : 			{
				"source" : [ "obj-35", 0 ],
				"destination" : [ "obj-58", 0 ],
				"hidden" : 1
			}

		}
 ],
	"appversion" : 	{
		"major" : 8,
		"minor" : 1,
		"revision" : 10,
		"architecture" : "x64",
		"modernui" : 1
	}
,
	"classnamespace" : "box"
}

`````
prepareStatementのSQL文以外の引数について

### 実はprepareStatementでSQL以外のものを渡すことができる
```prepareStatement(String sql)```以外の指定があります。
ということに最近弊プロダクトのコードを見ていて気づいたので、色々みた結果をまとめます。


### Javaのバージョン

Javaのバージョン```1.8.0_20```で確認しています。

### prepareStatementに渡せる最大引数について
最大は以下の引数指定かと思います。

```java:
PreparedStatement prepareStatement(String sql, int resultSetType,
                                       int resultSetConcurrency, int resultSetHoldability)
```

渡すSQL以外に指定する値について、見ていきます。


### ResultSetTypeについて
resultSetTypeは指定可能なものが３つあります。

```java:
     * @param resultSetType one of the following <code>ResultSet</code>
     *        constants:
     *         <code>ResultSet.TYPE_FORWARD_ONLY</code>,
     *         <code>ResultSet.TYPE_SCROLL_INSENSITIVE</code>, or
     *         <code>ResultSet.TYPE_SCROLL_SENSITIVE</code>
```

TYPE_FORWARD_ONLY：カーソルを前方にのみ移動が可能
TYPE_SCROLL_INSENSITIVE：スクロール可能ですが、変更は反映されません
TYPE_SCROLL_SENSITIVE：スクロール可能、且つ、他による変更も反映されます

### resultSetConcurrencyについて
resultSetConcurrencyは指定可能なものが２つあります。

```java:
     * @param resultSetConcurrency one of the following <code>ResultSet</code>
     *        constants:
     *         <code>ResultSet.CONCUR_READ_ONLY</code> or
     *         <code>ResultSet.CONCUR_UPDATABLE</code>
```

CONCUR_READ_ONLY：ResultSetはデータの読み出しのみ
CONCUR_UPDATABLE：ResultSetは変更可能で、カーソルを動かして挿入や変更、削除ができる
※ResultSetの更新機能を利用してデータを更新することができます([参考リンク](https://software.fujitsu.com/jp/manual/manualfiles/m140009/j2ul1603/05z201/j1603-a-16-00.html))

### resultSetHoldabilityについて
resultSetHoldabilityは指定可能なものが２つあります。

```java:
     * @param resultSetHoldability one of the following <code>ResultSet</code>
     *        constants:
     *         <code>ResultSet.HOLD_CURSORS_OVER_COMMIT</code> or
     *         <code>ResultSet.CLOSE_CURSORS_AT_COMMIT</code>
```
HOLD_CURSORS_OVER_COMMIT：トランザクションがコミットされたタイミングでResultSetはオープンしたままになります
CLOSE_CURSORS_AT_COMMIT：トランザクションがコミットされたタイミングでオープンしているResultSetオブジェクトはクローズします


### まとめ
つまり
・ResultSetType：カーソルを前後に動かせるか、カーソルを動かしたときにResultSetの変更を参照するか
・resultSetConcurrency：ResultSetが変更可能であるか
・resultSetHoldability：ResultSetのクローズのタイミング
ということですね。

参照：
https://docs.oracle.com/javase/jp/8/docs/api/java/sql/Statement.html
https://docs.oracle.com/javase/jp/8/docs/api/java/sql/ResultSet.html
[PostgreSQL]Postgresでパスワード変更と削除方法

postgresでロールのパスワード変更と削除をしたので備忘録として残しておきます。

## パスワードの変更
```
postgres=# ALTER ROLE {ロール名} WITH PASSWORD {'パスワード'};
ALTER ROLE
```

## パスワードの削除

```
ALTER ROLE {ロール名} WITH PASSWORD NULL;
```
Migrateの作成(Laravelでウェブアプリを作ろう③)

##Migrate(マイグレート)
Migrateは、データベースのテーブルに関する情報を設定するファイルで、テーブルごとに作成します。
テーブルにはどんなカラム(フィールド)があって、そのカラムにはどんな情報が付与されるのかを設定します。

##Migrateの作成
手動でも作成は行えますが、コマンドで実行する方が確実です。
注意点としては、Migrateを複数作成した場合、一括実行を行うと実行される順番はファイルを作成した順番になります。
そのため外部キーの設定をする場合に参照するテーブルを先に生成しておかないとエラーになるため注意が必要です。

```terminal
php artisan make:migration create_テーブル名_table --create=テーブル名
```

作成されたファイルは[database>migrations]に格納されます。
デフォルトで3つファイルが作成されています。

[public function up()]こちらのメソッドに、テーブルの作成時に行いたい処理を記載します。
記載の仕方は以下のようになります。

```php:2014_10_12_000000_create_users_table.php
    public function up()
    {
        Schema::create('users', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            $table->string('email')->unique();
            $table->timestamp('email_verified_at')->nullable();
            $table->string('password');
            $table->rememberToken();
            $table->timestamps();
        });
    }
```

よく使うカラムのキーやそのほかの情報については以下を参照してください

```php
//文字列
$table->string('カラム名', バイト数);

//数字
$table->integer('カラム名');

//正の数のみ
$table->unsignedInteger('カラム名');

//真偽値
$table->boolean('is_archived')

//作成日及び更新日
$table->timestamps();

//インクリメント
$table->increments('カラム名');

//nullを許容する(デフォルトではnotnullになっている)
$table->型名('カラム名')->nullable();

//デフォルト値の設定
$table->型名('カラム名')->default(値);

//プライマリーキー(idをincrementsにした時点で自動的にprimarykeyになっているため基本的には不要)
$table->primarykey(['カラム名']);

//ユニークキー
$table->unique(['カラム名']);

//外部キー
$table->foreign('参照元のカラム名')->references('参照先のカラム名')->on('参照先のテーブル');
```

##Migration(マイグレーション)
Migrationにはコマンドで実行します

```terminal:ローカル環境でMigration
php artisan migrate
```

```terminal:docker環境でMigration
docker-compose exec app php artisan migrate
```

テーブルが追加されていれば成功です

###補足
詳しくは記載しませんが、MySQL接続の際のコマンドです

```terminal:dockerのコンテナ名の確認
docker ps
```

```terminal:docker環境でMySQLに接続するコマンド
docker exec -it コンテナ名 mysql -u ログインユーザー名 -p
```
【Ruby on Rails】途中でカラムを追加・削除する

#概要
アプリ作成途中に「追加でこの情報もテーブルに保存したい！」「このカラムはいらん！」と思う時は多々ありますよね、、、
そんな時のために「カラムを追加・削除する方法」を記載しておきます！！
(環境構築とモデルの作成はできている状態です)

#環境
ruby 2.6.5
Rails 6.0.3.5


#【カラムを追加する】
#追加するカラム
**Usersテーブル**に**nameカラム**を追加する
#①追加するカラムのマイグレーションを生成

```
% rails g migration Add[カラム名]To[テーブル名][カラム名:型]　　（見本）
% rails g migration AddNameToUsers name:string           (実行するコマンド)
```
以下のマイグレーションファイルが自動で作成されます。

```ruby:db>migrate>〇〇〇〇〇〇_add_name_to_users.b
class AddNameToUsers < ActiveRecord::Migration
  def change
    add_column :users, :name, :string
  end
end
```
#②追加したマイグレーションファイルをテーブルに反映
```
% rails db:migrate
```
これでテーブルに新しくカラムが追加されます。

#【カラムを削除する】
#削除するカラム
**Usersテーブル**の**nameカラム**を削除する
#①削除するカラムのマイグレーションを生成
```
% rails g migration Remove[カラム名]To[テーブル名][カラム名:型]　　（見本）
% rails g migration RemoveNameToUsers name:string           (実行するコマンド)
```
以下のマイグレーションファイルが自動で作成されます。

```ruby:db>migrate>〇〇〇〇〇〇_remove_name_to_users.b
class RemoveNameToUsers < ActiveRecord::Migration
  def change
    remove_column :users, :name, :string
  end
end
```
#②作成されたマイグレーションファイルをテーブルに反映
```
% rails db:migrate
```
これでUsersテーブルのnameカラムが削除されます。

#参考リンク
[Railsのデータベースでカラムを追加する方法 -Qiita](https://qiita.com/TeppeiMimachi/items/d0176c4ec5d4b4fad895)

[Ruby on Rails カラムの追加と削除 -Qiita](https://qiita.com/azusanakano/items/a2847e4e582b9a627e3a)
JavaでFizzBuzz問題を解く

Javaの学習記録兼個人的なメモです。

今回はJavaで繰り返し処理を学習したため、FizzBuzz問題を解いていきます。
FizzBuzz問題とは、「1から100までの数字を画面に表示する。ただし、3の倍数のときは数字の代わりにFizzと表示し、5の倍数のときは数字の代わりにBuzzと表示し、15の倍数のときは数字の代わりにFizzBuzzと表示する」といった簡単なプログラミングの基礎力を試す問題です。

## while を使った場合

```MyApp.java
public class MyApp {
  public static void main(String[] args) {
    int i = 0;
    while (i < 100) {
      i++;
      if (i % 15 == 0) {
        System.out.println("FizzBuzz");
      } else if (i % 5 == 0) {
        System.out.println("Buzz");
      } else if (i % 3 == 0) {
        System.out.println("Fizz");
      } else {
        System.out.println(i);
      }
    }
  }
}
```

## do while を使った場合
`while`とは条件式の判定位置が異なります。

```MyApp.java
public class MyApp {
  public static void main(String[] args) {
    int i = 0;
    do {
      i++;
      if (i % 15 == 0) {
        System.out.println("FizzBuzz");
      } else if (i % 5 == 0) {
        System.out.println("Buzz");
      } else if (i % 3 == 0) {
        System.out.println("Fizz");
      } else {
        System.out.println(i);
      }
    } while (i < 100);
  }
}
```

## for を使った場合

```MyApp.java
public class MyApp {
  public static void main(String[] args) {
    for (int i = 1; i <= 100; i++) {
      if (i % 15 == 0) {
        System.out.println("FizzBuzz");
      } else if (i % 5 == 0) {
        System.out.println("Buzz");
      } else if (i % 3 == 0) {
        System.out.println("Fizz");
      } else {
        System.out.println(i);
      }
    }
  }
}
```

【出力結果】

```
% javac MyApp.java
% java MyApp
1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz
16
17
Fizz
19
Buzz
Fizz
22
23
Fizz
Buzz
26
Fizz
28
29
FizzBuzz
31
32
Fizz
34
Buzz
Fizz
37
38
Fizz
Buzz
41
Fizz
43
44
FizzBuzz
46
47
Fizz
49
Buzz
Fizz
52
53
Fizz
Buzz
56
Fizz
58
59
FizzBuzz
61
62
Fizz
64
Buzz
Fizz
67
68
Fizz
Buzz
71
Fizz
73
74
FizzBuzz
76
77
Fizz
79
Buzz
Fizz
82
83
Fizz
Buzz
86
Fizz
88
89
FizzBuzz
91
92
Fizz
94
Buzz
Fizz
97
98
Fizz
Buzz
```

以上です。
Flutter Web 複数ページのテーブル

# はじめに
さっきまでの私と同じような悩みを抱えている人向けに。自分でググってもなかなか解決できなかったのでまとめた。

- **横幅**が広がってくれない
- **スクロールバー**が表示されない
- ネットで拾った**コードが古くてエラー**になる
- **余計な情報**が多すぎて知りたい部分がどこか分からない
- そもそも**Flutterがまだちゃんと理解できてない。**ListViewとかTableとかの使い分け方が分からない

# 結論
```PaginatedDataTable``` というウィジェットが用意されているのでそれを使う

![SampleImage](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/982650/3e540d5d-96af-7d7d-0f68-59723e25bf1d.png)

- 私が欲しかった最小限のコードはこちら

```main.dart
import 'package:flutter/material.dart';

void main() => runApp(MyApp());

/// アプリ
class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(home: HomeView());
  }
}

/// ホーム画面
class HomeView extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(title: Text('Table Sample')), body: TableView());
  }
}

/// テーブル
class TableView extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    /// スクロールバー
    return Scrollbar(
        isAlwaysShown: true, // true: スクロール時以外もバーを表示する
        /// スクロールする領域
        child: SingleChildScrollView(
            child: SizedBox(
                width: double.infinity, // 横幅いっぱいに広げる
                child: PaginatedDataTable(
                    showCheckboxColumn: false, // false: チェックボックスを表示しない
                    rowsPerPage: 20, // 1ページあたりの行数
                    columns: [
                      // 列のヘッダーは DataColumn として追加する
                      DataColumn(label: Text('Column A')),
                      DataColumn(label: Text('Column B')),
                      DataColumn(label: Text('Column C')),
                    ],
                    source: SampleDataSource()))));
  }
}

/// テーブルのデータ
class SampleDataSource extends DataTableSource {
  @override
  DataRow getRow(int index) {
    /// 1行文のデータ
    return DataRow(cells: [
      // 中身のデータは DataCell として追加する
      DataCell(Text('Cell A$index')),
      DataCell(Text('Cell B$index')),
      DataCell(Text('Cell C$index')),
    ]);
  }

  @override
  int get rowCount => 99; // 全行数
  @override
  bool get isRowCountApproximate => false; // 行数は常に正確な値かどうか(不明な場合はfalseにしておく)
  @override
  int get selectedRowCount => 0; // 選択された行数(選択を使用しない場合は0で問題ない)
}
```

# 注意
- Flutter 2.0 以降が必要

```sh
# バージョンを確認
flutter --version 
# 最新版へアップグレード
flutter upgrade
```

- Null Safety が有効であること
  - 新しくDartに追加された言語仕様のこと
  - Dart SDK を 2.12.0 以降に限定する

```diff:pubspec.yaml
... (例)

environment:
-   sdk: ">=2.7.0 <3.0.0"
+   sdk: ">=2.12.0 <3.0.0" 
```

- テーブルが微妙に左右にもスクロールできてしまう現象
  -  直し方わかる方いましたら教えてください🙏

# さいごに!

何か間違っている箇所があればご指摘いただければ有り難いです。
windows10でffmpeg実行でPermission deniedがでる 

cmdに実行したコマンド
ffmpeg.exe -i test.mp4 test_audio2.mp3 -y
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/586784/892dbd95-019d-c798-af3c-73899632b3b0.png)



回避策１　ffmpegの出力先をCドライブ以外に指定する
or
回避策２　アンチウィルスソフトを切る（ffmpeg.exeがあるフォルダに例外を設定する）
離散一様分布に従うか？（適合度検定）

# 離散一様分布に従うか？

![スクリーンショット 2021-05-01 17.46.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698282/8e39c880-a48f-54da-48fd-b7092f816a71.png)
![6f0f076e-b8f5-4389-909b-3688dfb1e80c.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698282/c646c90c-87ac-1cfb-a1b7-f0059d3e9adf.png)


class1〜class4という4つの属性による違いはあるのか？
それとも、違いはない、**離散一様分布に従う**と考えることはできるのか？

```R
# グラフ
library(dplyr)

d <-data.frame(
  observe = c(rep("class1",330), rep("class2",305),
              rep("class3",263),rep("class4",247))
)

d %>% table() %>% barplot(ylim=c(0,350),col="4")
abline(h = 1145/4, col="red", lwd=3)
```

# 離散一様分布との適合度
$H_0:$属性による違いはない（離散一様分布に従う）
$H_1:$属性による違いがある

$H_0$を仮定した場合、理論的には データ数×1/属性数 の離散一様分布になる。
ただ、実際には偶然を考えて完全な等分散にはならない。
では、偶然性を考慮した上で、離散一様分布に従っているか？

観測したデータを観測度数のテーブル
$H_0$に基づいた期待度数のテーブル
この２つを作る。

**（期待度数の最小値 $<$ 5 の場合、近似がうまくいかないので注意）**

観測度数と期待度数のズレの和を考える

このズレの和はカイ二乗値と等しくなる。

# 適合度検定
$H_0$が正しければ、nが大きい場合、

$$\chi^2=\sum\frac{(O_i-E_i)^2}{E_i}$$

が$k-1$のカイ二乗分布に従う。

$O_i$:観測度数テーブル$O$のi番目
$E_i$:期待度数テーブル$E$のi番目
$k$：属性数

$H_0$のもとでこの値は小さいはず。
小さいならば$H_0$が支持
大きいなら$H_0$を棄却し、$H_1$を支持。

# R

```R
d <-data.frame(
  observe = c(rep("class1",330), rep("class2",305),rep("class3",263),rep("class4",247))
)
# 格納確認
dim(d)
head(d)
names(d)
summary(d)
# table関数からクロス集計表を作る
(obs_tabs <- table(d))
# xtabsを使ってもtableを作れる
# (obs_tabs <- xtabs(~observe,d))

# 合計付きの集計表へ
(f_tabs <- addmargins(obs_tabs))


# 期待度数のtableを作る
(Expected <- obs_tabs) # 観測度数の表とdiimensionが同じになるので、いったん格納して
(Expected <- obs_tabs*0) # 期待度数を入れるために初期化
# sumを拾う
(n <- f_tabs["Sum"])
# 離散一様分布なので割合は 1/属性数 で一律
(p <- 1/dim(obs_tabs))

# 期待度数のtableを作る
for (i in 1:dim(obs_tabs)) Expected[i] <- n*p
Expected
# (期待度数の最小値) ≧ 5 なのでこのまま推定

# 観察度数と期待度数のズレの和
chisq = sum((obs_tabs-Expected)^2/Expected)
chisq
```

$\chi^2=15.18515$

$H_0$：離散一様分布に従っている、について
両側5%水準で検討する。

自由度：$4-1=3$のカイ二乗分布の上側$5$%点が$7.81$
棄却限界値$7.81$よりもカイ二乗値が大きいので$H_0$は棄却され、$H_1$が支持される。


# テーブルをそのままchisq.testに通す
```R
chisq.test(obs_tabs)
```

Chi-squared test for given probabilities
data:  obs_tabs
X-squared = 15.185, df = 3, p-value = 0.001665

たぶん、dim(obs_tabs) で 1行で4というように返ってくるテーブルに対しては離散一様分布のChi-squared test がrunする模様。
gcovをお試し実行する


gcovはC言語のプログラムのカバレッジを測定するツールのようです

テストコード

```c:test.c
#include <stdio.h>
 
int main() {
  int testnum = 1;
 
  if (testnum == 1) {
    printf("testnum No.1 \n");
  }
  else if (testnum == 2) {
    printf("testnum No.2 \n");
  } else {
    printf("nothing to do. %d\n", testnum);
  }
}
```

実行

```
$ gcc -fprofile-arcs -ftest-coverage test.c -o test.out
$ gcov-9 test.gcda 
File 'test.c'
Lines executed:57.14% of 7
Creating 'test.c.gcov'
```

`test.c.gcov`の中身

```
$ cat test.c.gcov 
        -:    0:Source:test.c
        -:    0:Graph:test.gcno
        -:    0:Data:test.gcda
        -:    0:Runs:1
        -:    1:#include <stdio.h>
        -:    2: 
        1:    3:int main() {
        1:    4:  int testnum = 1;
        -:    5: 
        1:    6:  if (testnum == 1) {
        1:    7:    printf("testnum No.1 \n");
        -:    8:  }
    #####:    9:  else if (testnum == 2) {
    #####:   10:    printf("testnum No.2 \n");
        -:   11:  } else {
    #####:   12:    printf("nothing to do. %d\n", testnum);
        -:   13:  }
        -:   14:}
```

# lcovを実行

lcovはgcovの結果を可視化するツールのようです。

install 

```
brew install lcov
```

実行

```
$ lcov -c -d . -o lcov.info
Capturing coverage data from .
Found LLVM gcov version 10.0.0, which emulates gcov version 4.2.0
Scanning . for .gcda files ...
Found 1 data files in .
Processing test.gcda
geninfo: WARNING: ./test.gcno: Overlong record at end of file!
Unexpected version: *39A.
Invalid .gcno File!
geninfo: WARNING: cannot find an entry for test.c.gcov in .gcno file, skipping file!
Finished .info-file creation
```

`Unexpected version: *39A.`のエラーが出る。。バージョン合ってないかも？

# 参考
[gcovによるステートメントカバレッジ計測](https://www.ois-yokohama.co.jp/oisblog2018/archives/6664)
[gcovとlcov](https://t-kado.hatenadiary.org/entry/20100622)
[gcovの使い方](https://kaworu.jpn.org/kaworu/2011-11-12-1.php)
LinuxPCを使っていたらerrorが出てREAD Onlyになってしまった。。contains a file system with errors, check forced

LinuxPCを使っていたらerrorが出てREAD Onlyになってしまった。。
再起動したらこのようなメッセージが出る

```
/dev/sda5 contains a file system with errors, check forced.
/dev/sda5:
Inodes that were part of a corrupted orphan linked list found.

/dev/sda5: UNEXPECTED INCONSISTENCY; RUN fsck MANUALLY.
(i.e., without -a or -p options)
Fsck exitted with status code 4
The root filesystem on /dev/sda5 requires a manual fsck

BusyBox v1.30.1 (Ubuntu 1:1.30.1-4ubuntu6.3) buult-in shell(ash)
Enter 'help' for a list of built-in commands.
```

以下の手順で復旧

```
(initramfs) fsck /dev/sda5
```

以下のようなメッセージが出るが全てyes（結構たくさん出るが焦らずyes）

```
Error reading block 1027 (Attempt to read block from filesystem resulted in short read).  Ignore error? yes
Force rewrite? yes
```

無事に修復されたようで、exitで再起動すると無事に起動した。

```
…
***** FILE SYSTEM WAS MODIFIED *****
(initramfs) exit
```

# 参考
[Ubuntuがブート時にmanual fsckが必要だとしてinitramfsで止まった時](https://cpplover.blogspot.com/2017/03/ubuntumanual-fsckinitramfs.html)
[2013年秋のファイルサーバHDD障害発生](http://km-d.blogspot.com/2013/11/2013hdd.html)
Railsで手軽に静的ページを作る方法

## 手軽に静的ページを作りたい
個人開発をしていると必要になる「利用規約」「プライバシーポリシー」などの静的ページ
そのためにcontrollerを作成してroutesをいじるっていうのは結構手間ですよね？
その問題を解決できる「high_voltage」というgemが存在します！

##gemの導入
```ruby:gemfile
gem 'high_voltage'
```
gemfileに追加する

```ruby:ターミナル
$ bundle install
```

コマンドを打ち込むことで「high_voltage」を使える準備が整いました！
## 使用方法

１．app/viewsのディレクトリの中にpagesというディレクトリを作成
２．app/views/pagesのディレクトリの中にpolicy.html.erbを作成
「policy」には好きな文字列を！

作成したpolicy.html.erbに何か書いておきましょう
![スクリーンショット 2021-05-01 17.24.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/863944/0842faeb-dfc1-a5c4-702c-5786be33be48.png)

以下のURLにアクセスすることでpolicyページが表示されます！
http://localhost:3000/pages/policy

RoutingErrorになる場合はサーバーの再起動を行ってみてください。


## ページのリンクを作成する

```ruby:
<%= link_to 'policy', page_path('policy') %>
```

リンクはこのような書き方になります
Laravelで複数Middlewareを指定するときは優先度も指定しよう

# 3行まとめ
1. LaravelのMiddlewareは書いた順に実行されるわけではない
1. LaravelのバージョンをアップしたりするとMiddlewareの実行順が変わったりして危険
1. `app/Http/Kernel.php`に`$middlewareGroups`を指定して、優先度を明確にしましょう。

# RouteでMiddlewareを設定する
LaravelでMiddlewareを指定するときにはどこで指定していますか？私はroute.phpのrouteの指定でmiddlewareを設定することがよくあります。以下の様な感じですね。

```php
<?php
Route::get('/hoge', 'HogeController@index')
        ->middleware(['a_middleware'])
        ->name('hoge.index');
```

このように指定して`/hoge`にアクセスが来たときに`a_middleware`を実行します。

では適用したいミドルウェアが複数あるときはどうでしょうか？以下のように書きますね。

```php
<?php
Route::get('/hoge', 'HogeController@index')
        ->middleware(['a_middleware', 'b_middleware'])
        ->name('hoge.index');
```

このとき、書いたプログラマーとしてはa_middleware→b_middlwareという順番で実行されると期待するはずです。

しかし残念ながらそうではありません。実際にLaravelのバージョンをアップグレードしたらMiddlewareの実行順が変わってテストが落ちたので慌てて優先度を設定するということがありました:sob:

#  Middlewareには優先度がある
実はドキュメントにも書かれているのですが、LaravelではMiddlewareの優先度を指定することが出来ます。
https://laravel.com/docs/8.x/middleware#sorting-middleware

しかしこの優先度は事前にapp/Http/Kernel.phpに書いておくと反映されるという形式のもので、routeの設定に書いたらその順番に実行してくれるというようなものではありません。

```php
<?php

class Kernel extends HttpKernel
{

    ... 略 ...

    protected $middlewarePriority = [
        \Illuminate\Cookie\Middleware\EncryptCookies::class,
        \Illuminate\Session\Middleware\StartSession::class,
        \Illuminate\View\Middleware\ShareErrorsFromSession::class,
        \Illuminate\Contracts\Auth\Middleware\AuthenticatesRequests::class,
        \Illuminate\Routing\Middleware\ThrottleRequests::class,
        \Illuminate\Session\Middleware\AuthenticateSession::class,
        \Illuminate\Routing\Middleware\SubstituteBindings::class,
        \Illuminate\Auth\Middleware\Authorize::class,
    ];

```

むしろroute.phpの配列に渡している順番は保証されないと思って、信用せずに書いたほうが良いでしょう。
ActionView::Template::Error (ActiveStorage::InvariableError)の対処法

#エラー概要
記事投稿画面から、画像を選択し投稿した際に起こったエラー。データベースには登録されていたが、ブラウザにはエラー画面が出ていた。

#原因
拡張子がHEIC形式のものを投稿した際に、エラーが出ていた。jpgやpngの場合は投稿できた。

#解決方法
rais db:migrate:resetをして、データベースにあるものをリセットすると、エラー画面はなくなる。HEIC形式以外の画像を添付すると、エラーは解決された。
Visual Studioの便利なショートカットキー

## .NET以降のVisual Studio
個人的にVisual Studioのコードエディタは数あるIDEの中でも傑出した性能を誇っていると思っています。
現在のVSは2019ですが、私は2005から使い続けており、機能が洗練され続けているものの操作感は当時から優れており、それ程変わっていません。

[Visual Studio Code](https://code.visualstudio.com/)というエディターがあり、こちらも大変優れたエディターではありますが
名前こそ似ているものの出自は異なり、使い勝手もVSとは似て非なるものです。

__Visual Studioからコードエディタだけ取り出したようなエディタ__がもし存在すれば私は一生使い続けると思います。
## 特殊な操作
### 矩形選択
`Alt+Shift+カーソルキー`
VSはこれが使い勝手がいい。特にバックスペースやDeleteを押した時の挙動が自然。
キャレットを移動するだけですぐにモードが解除されるのも楽。
Eclipseはモードを戻す操作が必要で、ショートカットキーも覚えにくい＆押しにくい(Ctrl+Shift+A)。
某サクラエディタは文字を削除するのと挿入するのが一度にできない。
VS Codeは独特で、キャレットを移動してもモードが維持される。
Endキーを押すと全ての行の終端に移動したりするのはシーンによっては使いやすいが、それ以外の用途はあまり思い浮かばない。
### 行移動 (現在の行を別の行へ移動)
`Alt+カーソルキー上下`
### 行コピー (現在の行を複製)
`Ctrl+D`
("Duplicate"と覚える)
### 小文字に変換
範囲を選択して`Ctrl+U`
### 大文字に変換
範囲を選択して`Ctrl+Shift+U`
## ショートカットキー
### 名前の変更
`Ctrl+[R→R]` (Refactor→Rename)
又は`F2`
### 全体フォーマット
`Ctrl+[K→D]`
### 部分フォーマット
`Ctrl+[K→F]`
C# 2005のスキームを有効にすると(デフォルト？)、`Ctrl+[E→D]`／`Ctrl+[E→F]`でも受け付ける。
### 定義へ移動
`F12`
### 定義をここに表示
`Alt+F12`
超便利。
### すべての参照を検索
`Shift+F12`
### ファイル内検索・置換 (grep)
`Ctrl+Shift+F`／`Ctrl+Shift+H`
(検索／置換(Ctrl+F／Ctrl+H)にShiftを追加したものと覚える)
## Visual StudioとNotepad++
私は[Notepad++](https://notepad-plus-plus.org/)を愛用しています。
viみたいに暗記が必要な操作がほとんどなく直感的に使えるため、少ない脳みその空き領域を消費しません。
(Notepad++の操作方法を調べた事はほとんどありません。逆に言うとプラグインとかあまり活用していない)

そして、デフォルトの操作がVSとほぼ同じ。矩形選択・行コピー・ファイル内検索・指定行へ移動等はそのまま(行移動は設定で変更可)です。
VS Codeよりこちらの方がVSの操作感に近いので気に入っています。

Default Styleは等幅フォントにしてコードハイライトもフォントサイズを変えないのが見やすくてお勧めです。
[PostgreSQL]ロール(ユーザー)を作成する方法

## はじめに
PostgreSQLでロールを作成したのでメモしておきます

## ロールとは
下記記事の言葉を借りさせてさせていただくと**PostgreSQLのロールとは一般的にユーザーと呼ばれるものとグループと呼ばれるものの二つの性質を兼ね備えたもの**とあります。

https://www.dbonline.jp/postgresql/role/

##ロールの作成
まずpostgreにログインします。

```
$ psql -U postgres
```

新しいロールを作成するには`CREATE ROLE`コマンドを使います。


例えばロール名**taro**でパスワードを**11111111**で設定したい場合以下のように入力します。

```
postgres=# CREATE ROLE taro WITH PASSWORD '11111111';
```

`CREATE ROLE`と表示されれば成功です。
`SELECT ROLNAME FROM pg_roles;`でちゃんと表示されているか確認してみましょう

```
postgres=# SELECT ROLNAME FROM pg_roles;
 rolname
ーーーーーーーー
 postgres
 taro
(2 行)
```

## ログイン権限の付与
そしてロールを作成した後はデータベースに接続できるように、ログイン権限を持たせておきましょう。
`ALTER ROLE`コマンドを使って以下のように記述します。

```
postgres=# ALTER ROLE taro LOGIN;
ALTER ROLE
```

##データベースの作成権限を付与

```
postgres=# ALTER ROLE taro WITH CREATEDB;
```

## オプション
`CREATE ROLE name WITH option [ ... ] ]`の`option`の書式を示しておきます。

```
    SUPERUSER | NOSUPERUSER
    | CREATEDB | NOCREATEDB
    | CREATEROLE | NOCREATEROLE
    | INHERIT | NOINHERIT
    | LOGIN | NOLOGIN
    | REPLICATION | NOREPLICATION
    | BYPASSRLS | NOBYPASSRLS
    | CONNECTION LIMIT connlimit
    | [ ENCRYPTED ] PASSWORD 'password'
    | VALID UNTIL 'timestamp'
    | IN ROLE role_name [, ...]
    | IN GROUP role_name [, ...]
    | ROLE role_name [, ...]
    | ADMIN role_name [, ...]
    | USER role_name [, ...]
    | SYSID uid

```
多すぎるのであまり覚える必要はないと思います。
筆者が使ったのは`CREATEDB`、`CREATEROLE`、`LOGIN`ぐらいです

##参考

https://www.dbonline.jp/postgresql/role/index2.html
SQLで取得した結果を元にSQL文を作成したいときに使える手法

## 更新したい対象とは別のテーブルから値を取得してその値を元にUPDATE文を作成する一行ずつSQLを作ってみる

### USER テーブル

| USER_ID | ACCOUNT_NAME  | USER_NAME   |
|:-:|:-:|:-:|
| 1  | taro-example  |  山田 太郎-example |
| 2  | jiro-example  |  山本 次郎-example |

### USER_BK テーブル

| USER_ID | ACCOUNT_NAME  | USER_NAME   |
|:-:|:-:|:-:|
| 1  | taro  |  山田 太郎 |
| 2  | jiro  |  山本 次郎 |

このUSER_BKテーブルからUSERテーブルを復活させるということで、SQLをSELECT文を使って作成してみるとする
（ケースとしてはこんなパターンはないしこんな修正はしないとは思いますが、例なので気になさらず）
USER_IDだけは一致しており、それを元に一致しているかどうかを測る

### 修正したい内容
- USERテーブルのACCOUNT_NAMEの値を、USER_BKテーブルのACCOUNT_NAMEから復活させる
- USERテーブルのUSER_NAMEの値を、USER_BKテーブルのUSER_NAMEから復活させる


### UPDATE文を取得するためのSQL
```sql:select_sample.sql
SELECT
  'UPDATE USER SET (ACCOUNT_NAME, USER_NAME) = (''' ||  ubk.ACCOUNT_NAME || ''', '''|| ubk.USER_NAME  || ''') WHERE u.USER_ID = ' ||  ubk.USER_ID  || ';' 
FROM
  USER u,
  USER_BK ubk
WHERE
    USER.USER_ID = USR_BK.USER_ID

```
### 上記のSQLで取得されるUPDATE用のSQL
```sql:update_sample.sql
UPDATE USER SET (ACCOUNT_NAME, USER_NAME) = ('taro', '山田 太郎') WHERE u.USER_ID = 1;
UPDATE USER SET (ACCOUNT_NAME, USER_NAME) = ('jiro', '山本 次郎') WHERE u.USER_ID = 2;
```
上記のようなSQLが取得されるので、流すだけ

### 記法
- 平文（SQLの取得結果を使わない箇所）は「 `' `」で囲う
- SQLのSELECT句で取りたいものの前後は「 `|| `」で囲う<br>
厳密にいうと連結演算子というもので、文字列とCLOBデータを連結することができるものらしい。


### 引用
https://docs.oracle.com/cd/E16338_01/server.112/b56299/operators003.htm
【JAVA】文字列のn番目を変換する

#はじめに
String型でn番目の文字を1文字変換する方法としてはSubstringを活用して文字列を分解して再度結合を行うことで実装できるが、いつも第一引数と第二引数で何を入ればよいか混乱するので他の方法を探したところ,StringBuilderのsetChartAt() を活用する方法があったのでまとめる。

#サンプルコード


```java
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        //変換する元の文字列
        String first_row = "ABCDEFGHIJK";
        //変換するn番目の数値を受け取る。
        int num = 6;
        //setCharAtではchar型を第二引数として与える必要がある。
      	char change_char = 'X';
        //String Builderに型変換
      	StringBuilder newString = new StringBuilder(first_row);
        //setCharAt(変換する文字のインデックス,変換後のchar)
      	newString.setCharAt(num,change_char);
        //ABCDEFXHIJK
      	System.out.println(newString);
    }
}
```

#最後に
setCharAtは引数としてあまりなじみのないchar型を使用しないといけないが、Substringを使用するよりも直感的に使いやすいと感じた。
プログラミングコンテストで使うにはStringBuilderを活用することは利点が多そうなので今後は活用していこうと思う。

#参考
[StringBuilderクラスについて](https://qiita.com/atsuk0r0/items/1208b5fead98676bc3c7)
Dockerでコンテナの作成とその接続設定(Laravelでウェブアプリを作ろう②)

データベースを利用するためにはアプリケーションサーバーとデータベースサーバーを接続しなければいけません。データベースの情報を作っているとき(docker-compose.yml)に接続情報(.env)についても記載してしまいます。

##データベースを作成
Docker上にservice名をdbという名前で作成し、test_dbデータベースを作成、test_userというユーザーをpasswordというパスワードで作成してください。

```yml:docker-compose.yml
version: '3'
services:
  db:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: test_db
      MYSQL_USER: test_user
      MYSQL_PASSWORD: password
      TZ: 'Asia/Tokyo'
    volumes:
    - ./docker/db/sql:/docker-entrypoint-initdb.d
    ports:
    - 3306:3306
```


- version<br>docker-composeのバージョン

- services<br>立ち上げるコンテナのホスト名

- image<br>使うイメージの種類(:バージョン)

- environtmen<br>環境変数<br>- MYSQL_ROOT_PASSWORD:ルートアカウントのパスワード<br>- MYSQL_DATABASE:データベース名<br>- MYSQL_USER:作成するユーザー名<br>- MYSQL_PASSWORD:上記のユーザーのパスワード<br>- TZ:タイムゾーン

- volumes<br>初期化するボリュームのパス

- ports<br>使用するポート(3306が多い)



##接続設定
dockerに接続するための情報を記載する
(基本的にはdocker-compose.ymlに記載してある内容をコピーする)

```:.env
DB_CONNECTION=mysql
DB_HOST=db
DB_PORT=3306
DB_DATABASE=test
DB_USERNAME=test_user
DB_PASSWORD=password
```

- DB_CONNECTION<br>docker-compose.ymlで立ち上げるデータベースの種類

- DB_HOST<br>docker-compose.ymlの[services]

- DB_PORT<br>docker-compose.ymlの[ports]

- DB_DATABASE<br>docker-compose.ymlの[ports]

- DB_USERNAME<br>docker-compose.ymlの[MYSQL_USER]

- DB_PASSWORD<br>docker-compose.ymlの[MYSQL_PASSWORD]
cpplintをお試し利用する

# cpplintについて

C/C++コードに対して、Google C++コーディングスタイルに準じたチェックを行うツールのようです。

> [https://github.com/cpplint/cpplint](https://github.com/cpplint/cpplint)
> Cpplint is a command-line tool to check C/C++ files for style issues following Google's C++ style guide. 

# install

```
$ pip3 install cpplint
```

# チェック

```c:hello.c
#include <stdio.h>
int main() {
     printf("Hello World");
     return 0;
}
```

`Copyrightがない`と指摘されました。

```
$ cpplint hello.c 
hello.c:0:  No copyright message found.  You should have a line: "Copyright [year] <Copyright Owner>"  [legal/copyright] [5]
Done processing hello.c
Total errors found: 1
```

# 再チェック

```
// Copyright 2021 seigot. All rights reserved.

#include <stdio.h>
int main() {
     printf("Hello World");
     return 0;
}
```

無事に指摘がなくなりました。

```
$ cpplint hello.c 
Done processing hello.c
```

# 参考
[https://github.com/cpplint/cpplint](https://github.com/cpplint/cpplint)
[https://pypi.org/project/cpplint](https://pypi.org/project/cpplint)
[http://www.itsenka.com/contents/development/c/helloworld.html](http://www.itsenka.com/contents/development/c/helloworld.html)
diff や colordiff でコマンドの実行結果と比較する方法

`diff` や `colordiff` は、通常、2 つのファイルの差分を表示するコマンドだが、他のコマンドの実行結果と比較することもできる。

**2 つのファイルの差分比較**

```shell:Shell
colordiff -u file1 file2
```

**ファイルとコマンドの実行結果の差分比較**

```shell:Shell
colordiff -u file <(command)
```

**2 つのコマンドの実行結果の差分比較**

```shell:Shell
colordiff -u <(command1) <(command2)
```
LeetCode 1000000本ノック【141. Linked List Cycle】

# 目次

|No.|項目|
|:----:|:-------------|
| 1 | [概要](#概要) |
| 2 | [問題](#問題) |
| 3 | [解法](#解法) |
| 4 | [エラー対応](#エラー対応) |

# 概要
<!-- 発端や概要を記載 -->
●発端
　・競プロ初心者、コーディング面接でズタボロにされ、
　・最低限のアルゴリズム学習とコーディング力強化を習慣化するため記事化
●環境
　・LeetCodeブラウザ上で実装（vscodeに拡張機能にするかもシレナイ）
　・言語はpython3
●その他ルール
　・google検索は自由に（直接的なLeetCodeの問題解説ページはNG）
　　（60分実装して実装出来なければ解説ページ参照）
　・[コーディング面接対策のために解きたいLeetCode 60問](https://1kohei1.com/leetcode/)から問題選出
　・「1000000」は任意の2進数とする


<!-- 各チャプター -->
<a id="#Chapter1"></a>
# 問題
- [141. Linked List Cycle](https://leetcode.com/problems/linked-list-cycle/submissions/)


>Given head, the head of a linked list, determine if the linked list has a cycle in it.

>There is a cycle in a linked list if there is some node in the list that can be reached again by continuously following the next pointer. Internally, pos is used to denote the index of the node that tail's next pointer is connected to. Note that pos is not passed as a parameter.

>Return true if there is a cycle in the linked list. Otherwise, return false.

⇨「引数に渡された連結リストがサイクルを持っていれば（循環していれば）Trueを、そうでなければFalseを返せ」と書いています。知らんけど。

![circularlinkedlist.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502026/613fc0f2-0974-4acd-b9e1-0ba376c2807d.png)

`Input: head = [3,2,0,-4], pos = 1
Output: true`
<a id="#Chapter2"></a>
# 解法
実施時間：30分

「LinkedList」で検索した下記ページを参考~~（というかほぼ答え）~~
[LinkedListが輪になっているかを判定する Hacker Rank](hhttp://keita-matsushita.hatenablog.com/entry/2017/05/10/120031)

考え方としては、連結リストに２つのポインターを置いて別々の間隔で進め、
もし途中で一致したなら循環しているというもの。知らんけど。

```python
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
    def hasCycle(self, head: ListNode) -> bool:
        if head is None:
            return False
        slow = head
        fast = head.next
        while fast is not None and fast.next is not None and slow.next is not None:
            if fast == slow:
                return True
            slow = slow.next
            fast = fast.next.next
        return False
```

![circularlinkedlist.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502026/613fc0f2-0974-4acd-b9e1-0ba376c2807d.png)

渡された連結リストが上記例題だとすると
fastポインター（1つ飛ばしで進む）  2 → -4　→ <font color="Blue">2</font> → <font color="Red">-4</font>
slowポインター（順番に進む）　　   3 →　2　→ 0 → <font color="Red">-4</font>

<font color="Blue">※pos = 1なのでlist[1]の2に循環</font>
<font color="Red">※pos = ここで一致するためTrue</font>

<a id="#reference"></a>
# エラー対応
●while文の条件不足でRuntime Error
　・要素数1の想定漏れ。fastポインターがnextから始まってるからそりゃあね...

`Input: head = [1], pos = -1`

```python:Bad
while fast.next is not None and slow.next is not None:
```
```python:good
while fast is not None and fast.next is not None and slow.next is not None:
```

●if文の条件記載ミスでWrong Answer
　・リスト内の値は重複しないという思い込み実装...
`Input: head = [1,1,1], pos = -1`

```python:Bad
if fast.val == slow.val:
```
```python:good
if fast == slow:
```
GeoJSON ローカルファイルを地図上に可視化表示

こんにちは。
GeoJSON ローカルファイルを地図上に可視化表示できるものを作りました。下記で動作（およびソース）を見ることができます。

* "[leaflet_with_geojson_files_dropped](http://bl.ocks.org/kkdd/fb33634a49dbecf5d5236430ceb4d4f8)" (bl.ocks.org)

ファイルを地図上へドロップすれば表示されます[^1]。Leaflet を利用し、簡素な作りにしました。

![output.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54617/b3abc177-dc8f-9d42-b7f8-8c9ac6888b82.gif)

[^1]: 「[GeoJSONファイルを可視化（地図上表示）](https://qiita.com/kkdd/items/c89de2124e00192b9388)」と同様の作りです。
【Unity】iOSネイティブプラグイン開発を完全に理解する - Objective-C++について


本編「[【Unity】iOSネイティブプラグイン開発を完全に理解する](https://qiita.com/mao_/items/5b33c90e533a538570b8)」の付録記事です。
[記事中での用語や略称](https://qiita.com/mao_/items/5b33c90e533a538570b8#%E8%A8%98%E4%BA%8B%E4%B8%AD%E3%81%A7%E8%A7%A3%E8%AA%AC%E3%81%99%E3%82%8B%E8%A8%80%E8%AA%9E%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6)についてはそのまま本編に倣う形で記載していきます。

-------------------------------------------------------------

「`Objective-C`は何となく聞いたことあるけど、`Objective-C++`は聞いたこと無い」「これらの違いは何？」と思う方も居るかもしれないので簡単に補足します。[^1]

ざっくりと言ってしまうと**「`Objective-C`と`C++`を混在させることが出来る言語」**になります。

[^1]: ちなみに自分はネイティブプラグイン開発時に初めて`Objective-C++`の名前を知ってこの疑問を抱きました。

- **参考リンク**
    - [Objective-C++ 取扱説明書 〜始め方から使い方、注意点まで〜【完全保存版】](https://marycore.jp/prog/objective-c/objcpp-basics/)
    - [Objective-C++ - Wikipedia](https://ja.wikipedia.org/wiki/Objective-C#Objective-C++)





# Objective-Cとの違い

ObjCはあくまで「C言語をベースに拡張した言語 (言語仕様的にはC言語の完全上位互換な言語)」であり、ObjCからは「C++の構文や機能、C++で書かれた既存のライブラリ」などを利用することが出来ません。

**一方でObjC++の方は「C++の構文や機能、C++で書かれた既存のライブラリ」を利用することが可能となり、**これによって「C++で書かれた既存のライブラリ」と言った資産を使い回すことができるようになります。[^2]

[^2]: 現にObjC++の用途の一つとして、「C++のライブラリをObjCからアクセスする為のラッパー記述」などが挙げられます





# 導入方法

Xcode上から**「ObjCのソースファイルの拡張子(`.m`)」を「ObjC++のソースファイルの拡張子(`.mm`)」に変換するだけで自動的にObjC++として認識されるようになります。**
(Xcode上の○○Settingsをいじって〜的な操作は必要無く、本当にこれだけ)

Unity上でも同様に、拡張子が`.mm`のソースファイルをAssets以下にインポートすると「ObjC++で書かれたネイティブプラグイン」として扱われるようになります。





# P/Invokeで`ObjC++(.mm)`のコードを呼び出すなら`extern "C"`を指定して外部宣言する必要がある

C#からP/Invokeで「**拡張子が`.mm`のソース**に実装されている`ObjC++`のコード」を呼び出すなら、**P/Invokeで呼び出される関数を外部宣言する際に`extern "C"`を指定する必要があります。**
(言い方を変えるとC言語のリンケージを指定する必要がある)

サンプルコードを載せておくと以下のようになります。
(この際には`__cplusplus`マクロも用いてC++コンパイラから読まれたときだけ有効にしている)

```obj-c++:Example.mm
// MARK:- extern "C" (Cリンケージで宣言)

#ifdef __cplusplus
extern "C" {
#endif

// NOTE: この関数が実際にUnity(C#)から呼び出される
int printHelloWorld() {
    return [Example printHelloWorld];
}

#ifdef __cplusplus
}
#endif
```



# 逆に`ObjC(.m)`なら`extern "C"`は不要

逆に「**拡張子が`.m`のソース**に実装されている`ObjC`のコード」を呼び出すならこれを行う必要はなく、外部宣言時に以下のように実装することでC#からP/Invokeで呼び出せるようになります。

```obj-c:Example.m
// NOTE: この関数が実際にUnity(C#)から呼び出される
// 拡張子が`.m`のソースなら、これだけでC#から呼び出し可能
extern int printHelloWorld() {
    return [Example printHelloWorld];
}
```

## なぜ`ObjC(.m)`だと不要なのか？

これらの理由について話すと、C++のコンパイラで「名前マングリング」と言う処理が行われているのが原因であり、**C言語ベースのObjCだと名前マングリングが行われない為に`extern "C"`を付けなくても呼び出せるようになってます。**

もっと具体的に「何が起こっているのか？」の詳細については以下の記事が参考になります。

- [C++のマングルとextern "C" {](https://www.wagavulin.jp/entry/2017/02/09/215036)
- [CとC++が混在したプログラムでの注意点](https://qiita.com/nomunomu0504/items/722a2771fef7d8038ceb)
Vue CLI npm run serve実行時のエラー

npm run serve 実行時に以下のようなエラーが表示される。

```
# Fatal error in , line 0
# Check failed: U_SUCCESS(status).
#
#
#
#FailureMessage Object: 0x7ffeefbfc060zsh: illegal hardware instruction  npm run serve

```

nodeのversionをv12.0.0からv14.0.0に上げたところエラーが解消される。

```
✖️✖️✖️✖️✖️✖️✖️✖️✖️✖️✖️✖️✖️✖️✖️✖️✖️✖️✖️✖️✖️✖️✖️@MacBook-Pro vue-cli-test-project % npm run serve

> vue-cli-test-project@0.1.0 serve /Users/✖️✖️✖️✖️✖️✖️✖️✖️✖️✖️✖️✖️✖️/Vue.js-tutorial/vue-cli-test-project
> vue-cli-service serve

 INFO  Starting development server...
98% after emitting CopyPlugin

 DONE  Compiled successfully in 1128ms                                  16:51:46


  App running at:
  - Local:   http://localhost:8080/
  - Network: http://192.168.2.101:8080/

  Note that the development build is not optimized.
  To create a production build, run yarn build.

```

![スクリーンショット 2021-05-01 16.58.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/794525/74723af4-5611-630d-a14e-877036c224c4.png)

どうやらネットでググってみてもバージョンを変えたらなおったというケースは結構あったようです。
docker-compose環境でのmysql接続方法まとめ

# 前提

- wsl2を使ったDocker環境
- docker-composeでmysqlをPython flaskの環境を構築
- flaskサーバからmysqlサーバに接続
- wsl2のコマンドラインからmysqlを使用

```yml:docker-compose.yml
version: '3'
services: 
    db:
        image: mysql:8.0
        container_name: mysql_host
        ports:
            - "3306:3306" #<---wsl2から接続する場合に必要。flask_hostからの接続には不要
        environment: 
            MYSQL_ROOT_PASSWORD: secret
        volumes:
            - ./db/data:/var/lib/mysql
            - ./db/init:/docker-entrypoint-initdb.d
    flask:
        build: .
        container_name: flask_host
        ports:
            - "5000:5000"
        volumes:
            - .:/workspace:cached
        tty: true
        environment:
            TZ: Asia/Tokyo
        # command: flask run --host 0.0.0.0 --port 5000
```


```bash
$ docker-compose ps
     Name                   Command             State                 Ports
-----------------------------------------------------------------------------------------
mysql_host        docker-entrypoint.sh mysqld   Up      0.0.0.0:3306->3306/tcp, 33060/tcp
sample1_flask_1   python3                       Up      0.0.0.0:5000->5000/tcp
```

# 接続方法まとめ

|接続元|記述方法|
|---|---|
|flaskサーバからmysqlに接続| mysql_host<br>mysqlサーバのdocker hostnameを使用|
|wsl2からmysqlに接続|127.0.0.1<br>※.wslconfigに追記が必要<br>※localhostと記述するとmysql.sockを使って接続しようとするので接続できない|



```config:.wslconfig
[wsl2]
memory=2GB
swap=2GB
localhostForwarding=true
```
memory, swapの記述は、localhost接続とは関係ありません。