OmniAICreator/Qiita-1.07M huggingface dataset:
【Rails】link_toで移行先のアクションにパラメータを渡す方法




# 環境
- Mac（12.2.1）
  -  MacBook Pro (13-inch, 2020)
  -  2 GHz クアッドコアIntel Core i5
  -  16 GB 3733 MHz LPDDR4X
- ruby (3.0.0p0)
- rails (7.0.1)


# 解決したい内容
[Rails link_toにパラメータを渡す](https://qiita.com/k_fence/items/c51bfdce8ce7b32515a3)
<h2>link_toを使ってgetsでコントローラにパラメータを受け渡したい</h2>
<p>やりたいこと</p>
<p>view側からコントローラにリンクする際に、値を受け渡したい</p>

<p>以下のようにパスの引数にハッシュの形で追加してやる</p>
<p>※例）top/indexからtop/link1へ値を渡す場合</p>

```erb:top/index.html.erb
  <%= link_to "リンク１へ", top_link1_path(name: "piyo") %>
```

<p>パラメータを受け取る</p>

```ruby:top_controller
class TopController < ApplicationController
  def link1
    @params = params[:name]
  end
end
```

```app/views/egograms/_egogramindex.html.erb
・
・
・
<%@index.each do |i|%>
<% number=i.test_result_id%>


<%=test_result_number=TestResult.find(number).id%></br>
<!-- このTestResult.find(number)を
redirect toする時にparamsに値を入れて
showアクションに飛んでegogram_resultのレイアウトを使用して
該当する結果を表示-->

<%= link_to "この結果のshow",egograms_show_path(id: test_result_number) %>
・
・
・
```

```app/controllers/egograms_controller.rb
def show
 #paramsで「(id: test_result_number)」の「(test_result_number)」の値が「[:id]」に入る
　　@result=params[:id]
　　render :result
end
・
・
・
```

# 参考にした記事

https://310nae.com/linkto-param/

https://qiita.com/geshi/items/449ba1f29f2f10bad4be
CSS FlexboxとGridのレイアウト練習問題

# こちらの記事でFlexboxの練習ができるのでぜひ挑戦してみてください！

https://qiita.com/T_Takahiro18/items/9a2b16cfc435ec99f96c

# はじめに

**div**のサイズは以下のような設定で行なってください。

:::note info
インフォメーション
divのサイズを変える場合があります。
:::

```css:index.css
* {
  padding: 0;
  margin: 0;
}

div {
  height: 200px;
  width: 25%;
}

# background-colorはこちらのカラーになります。
  background-color: aqua;
  background-color: red;
  background-color: blue;
  background-color: green;
  background-color: yellowgreen;
  background-color: salmon;
```

# 1. FlexboxとGapを利用して箱同士の横と縦の幅を自在に操ってみましょう。

### 完成図

:::note info
インフォメーション
箱の横幅は50px
縦幅は100px
:::

![Screen Shot 2022-07-04 at 15.57.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1803665/8b7ad728-00f5-aa70-8336-264c9c3a34fb.png)

<details><summary>答え</summary><div>


```html:index.html
  <div class="flex">
    <div class="a"></div>
    <div class="b"></div>
    <div class="c"></div>
    <div class="d"></div>
    <div class="e"></div>
    <div class="f"></div>
  </div>
```

```css:index.css
* {
  padding: 0;
  margin: 0;
}

div {
  height: 200px;
  width: 25%;
}

.a {
  background-color: aqua;
}

.b {
  background-color: red;
}

.c {
  background-color: blue;
}

.d {
  background-color: green;
}

.e {
  background-color: yellowgreen;
}

.f {
  background-color: salmon;
}

.flex {
  width: 100%;
  display: flex;
  flex-wrap: wrap;
  column-gap: 50px;
  row-gap: 100px;
  justify-content: center;
}
```

</div></details>


# 2. GridとGapを利用して箱同士の横と縦の幅を自在に操ってみましょう。

### 完成図

:::note info
インフォメーション
箱の横幅は100px
縦幅は50px
:::

![Screen Shot 2022-07-04 at 16.29.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1803665/38254089-7b9d-84d4-edf0-de4e73592ecd.png)

<details><summary>答え</summary><div>


```html:index.html
  <div class="grid">
    <div class="a"></div>
    <div class="b"></div>
    <div class="c"></div>
    <div class="d"></div>
    <div class="e"></div>
    <div class="f"></div>
  </div>
```

```css:index.css
* {
  padding: 0;
  margin: 0;
}

div {
  height: 200px;
}

.a {
  background-color: aqua;
}

.b {
  background-color: red;
}

.c {
  background-color: blue;
}

.d {
  background-color: green;
}

.e {
  background-color: yellowgreen;
}

.f {
  background-color: salmon;
}

.grid {
  width: 100%;
  height: 100%;
  display: grid;
  grid-template-columns: 25% 25% 25%;
  grid-column-gap: 100px;
  grid-row-gap: 50px;
  justify-content: center;
  margin: auto;
}
```

</div></details>



# 最後に

今回は**Gap**というプロパティを使用して、デザインを行いました。
↓こちらが参考資料となります↓

https://developer.mozilla.org/ja/docs/Web/CSS/gap
【Rails】【メモ】記事削除をしたときに、destoroyメソッドが効かなかったときになんとかした時の対処方法



# 環境
- Mac（12.2.1）
  -  MacBook Pro (13-inch, 2020)
  -  2 GHz クアッドコアIntel Core i5
  -  16 GB 3733 MHz LPDDR4X
- ruby (3.0.0p0)
- rails (7.0.1)
- mysql2 (0.5.3)

# はじめに

# 前提知識

# 解決したい内容
下記の削除ボタンを押したときに下記現象が起きた
・dstroyメソッドが効かず、GETメソッドを取得し、同ページに移動するだけ
・createメソッドが反応してしまい、各スコアが0のパターンの診断結果が記録される

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/747746/5a953e9c-609f-1e4e-e601-ae005da0d6d7.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/747746/c6348abb-8db5-725f-ad65-5c9c606570d4.png)


# protect_from_forgeryのが未設定であった

```egograms_contoroller.rb
def destroy
    @ego_score= EgoScore.find(params[:id])
  if @ego_score.destroy
    flash.now[:success] = "削除しました"
    redirect_to action: :index
  else
    flash.now[:alert] = "削除に失敗しました"
    render "index"
  end
end
```

## 【エラー】ActionController::InvalidAuthenticityToken in EgogramsController#destroy
Can't verify CSRF token authenticity.
Extracted source (around line #251):              

        def handle_unverified_request
          raise ActionController::InvalidAuthenticityToken, warning_message
        end
      end
    end

Parameters:

{"_method"=>"delete", "authenticity_token"=>"[FILTERED]", "id"=>"78"}



# 改善内容
``` egograms_controller.rb
class EgogramsController < ApplicationController
#追記
    protect_from_forgery :except => [:destroy]
```

# なぜ起きたか
CSRF(CrossSiteRequestForgery)対策
Railsでは、そのCSRF対策(外部からのアクセス遮断)を自動生成されている(＝デフォルトで入っている)
今回は外部サイトからのAPIリクエストと認識されたようで、受け付けないらしい

参考
https://railsdoc.com/page/protect_from_forgery

Railsでlink_to deleteメソッドが動かない
https://qiita.com/mami3sansan/items/6a9710b3ffdc937aa5f3

https://qiita.com/KumatoraTiger/items/cc6a1107374cce500e6d

# パターン2 Routing Error
No route matches [DELETE] "/egograms"
Rails.root: /Users/syoichi/PF

Application Trace | Framework Trace | Full Trace
Routes
Routes match in priority from top to bottom

|Helper|HTTP Verb|Path|Controller#Action|
|-|-|-|-|
|egogram_path|DELETE|/egograms/:id(.:format)|egograms#destroy|

Parameters:

{"_method"=>"delete", "authenticity_token"=>"[FILTERED]"}

## 改善前

```routes.rb
resources :egograms, only: [:new,:index,:edit,:destroy]
```

```egograms/index.html.erb
<%= button_to '削除', egograms_path,action:"destroy",controller: "egograms", method: :delete, data: {confirm: "削除しますか？"} %>

```

↓

# 改善後
```egograms/index.html.erb
<%= button_to '削除', "egograms/#{i.id}",action:"destroy",controller: "egograms", method: :delete%>
```


## もう一つ
rails7からはlink_toではなくbutton_toで作成しないと今回のエラーが起きる

# パターン3 削除ボタンを押してもindexに戻るだけ
# 改善前後

```routes.rb
resources :egograms, only: [:new,:index,:edit]
```
↓
```routes.rb
resources :egograms, only: [:new,:index,:edit,:desroy]
```

```routes.rb
delete 'egograms/:id' => 'egograms#destroy'
```
↓
```routes.rb
#削除
# delete 'egograms/:id' => 'egograms#destroy'
```


# その他:rails7からconfirmの使い方が変わっている
```以前.
data: {confirm: "本当に削除しますか？"} 
```

```rails7から.
form: { data: { turbo_confirm: "本当に削除しますか？" } } 
※form_withを使用する場合はこれ
```

参考
https://y-i.jp/entry/rails7-form-data-confirm
https://techracho.bpsinc.jp/hachi8833/2022_01_27/115075
【Rails】【メモ】Kaminariの使い方



# 環境
- Mac（12.2.1）
  -  MacBook Pro (13-inch, 2020)
  -  2 GHz クアッドコアIntel Core i5
  -  16 GB 3733 MHz LPDDR4X
- ruby (3.0.0p0)
- rails (7.0.1)
- mysql2 (0.5.3)


# 内容

通常は
```egograms_controller.rb
@index=EgoScore.page(params[:page]).per(3)
```

のようにpageメソッドをしようするだけでページネーションをつくることができる


findやwhereを使用している場合はKaminari.paginate_arrayを使用

```egograms_controller.rb
@index=Kaminari.paginate_array(index).page(params[:page]).per(2)
```


```egograms/index.erb
# 表示したいviewに追記
 <%= paginate @index %>
```
【Rails】【メモ】carrierwaveの使い方



# 環境
- Mac（12.2.1）
  -  MacBook Pro (13-inch, 2020)
  -  2 GHz クアッドコアIntel Core i5
  -  16 GB 3733 MHz LPDDR4X
- ruby (3.0.0p0)
- rails (7.0.1)
- mysql2 (0.5.3)
- carrierwave (2.2.2)

# はじめに
以前、できなかったが今回できた
# 前提知識
deviseを使用した上でのお話です

# 解決したい内容

ドキュメント通り進めていく

```
gem install carrierwave
```

```Gemfile.rb
gem 'carrierwave'
```
サーバーを再起動

# carrierwaveの設定
Uploaderクラスを追加
ここではAvatarという名前にしているのが、好きな名前で良い
```

rails generate uploader Avatar
```
↓
```app/uploaders/avatar_uploader.rb
class AvatarUploader < CarrierWave::Uploader::Base
  storage :file
end
```

# アップロード画像の情報を保存するavatarカラムを追加する為に、マイグレーションファイルを作成
アップロード画像の情報を保存するavatarカラムを追加する為に、マイグレーションファイルを作成
```
rails g migration add_avatar_to_users avatar:string
```
↓
```db/migrate/20220409024134_add_avatar_to_users.rb
class AddAvatarToUsers < ActiveRecord::Migration[7.0]
  def change
    add_column :users, :avatar, :string
  end
end

```
```
rails db:migrate
```


画像を保管するカラムを作成
今回はユーザー画像として扱いたいと思うので、元々作ってあるUserモデルにavatarsカラム（＝画像を補完するところ)を作成
```
rails g migration add_avatars_to_users avatars:json
rails db:migrate
```
↓
画像用モデルをcarrierwave用に修正する
Userモデルのavatarカラムにmount_uploaderを設定
つまり「アップロード画像用のカラム(avatarカラム)」と「アップローダークラス(AvatarUploaderクラス)」を紐づける
今回は、ユーザーのアバター画像のアップロード機能を追加するため、下記のように追記

```app/models/user.rb
class User < ApplicationRecord
  mount_uploaders :avatars, AvatarUploader
end
```
# deviseを使用している場合の設定
DBに保存できるようにaplication_controllerもしくはuser_controllerのストロングパラメータにavatarを追記する

```app/controllers/application_controller.rb
  def configure_permitted_parameters
    devise_parameter_sanitizer.permit(:sign_up, keys: [:user_id])
    @user=User.find_by(params[:id])

#下記":avatar"追記
    added_attrs = [ :email, :name, :password, :password_confirmation ,:avatar]
```

# アバター画像の登録・表示
e.g.) ユーザー編集画面で画像を登録

```app/views/devise/registrations/edit.html.erb
<h2>Edit <%= resource_name.to_s.humanize %></h2>

<%= form_for(resource, as: resource_name, url: registration_path(resource_name), html: { method: :put }) do |f| %>
  <%= render "devise/shared/error_messages", resource: resource %>

#追記
<%= f.file_field :avatar %>

・
・
・

```

## 表示
```
<%= image_tag current_user.avatar.to_s %>
```

# 改善策
## No route matches　CarrierWave
https://qiita.com/hatorijobs/items/50f23b3b8e4761914851
config/routes.rb　のファイルの以下の部分に:update　を追記
```config/routes.rb
resources :users, only: [:show, :index, :destroy]
```
↓
```config/routes.rb
resources :users, only: [:show, :index, :update, :destroy]
```
投稿ボタンを押した際、モデルのコントローラーのupdateアクションが実行されているので、ルーティングでupdateを許可しないと、通らないというわけである。

なぜ、updateアクションが実行されるのが分かったかというと、自分の場合は、手当たりしだいにブレークポイントを挿入してupdateアクションが実行されていることを発見しましたとのこと

## NameError: uninitialized constant User::ImageUploader
https://qiita.com/tama_chi/items/bd07366c76f548512a3f

```config/environment.rb
# Load the Rails application.
require_relative "application"

# Initialize the Rails application.
Rails.application.initialize!

#これを追記
require 'carrierwave/orm/activerecord'
```


# 参考にした記事
[URLの表示名](URL名)
https://github.com/carrierwaveuploader/carrierwave
https://pikawaka.com/rails/carrierwave
https://qiita.com/hatorijobs/items/50f23b3b8e4761914851
https://qiita.com/tama_chi/items/bd07366c76f548512a3f
LaravelのBladeを、単純な文字列組み立てで使う

# はじめに
LaravelのBladeを使って、WebページのHTMLを組み立てたりすることは多いと思います。
ただ、出力する内容を単に文字列として変数に落とし込めないかを調べたところ、その方法があったので、備忘録的に記載しておきます。
# 通常の使い方
基本的な使い方として、HTMLを組み立ててページを表示する時には、以下のように書くことが多いかと思います。

Controller
```
public function index() {
    $data = [
        ‘content’=>’HELLO WORLD’,
        'name'=>'太郎'
    ];
    return view(‘test,index’, $data);
}
```

View(Blade.php)
```
<html>
    <head>
    </head>
    <body>
        <p>{{ $name }}さん、{{ $content }}</p>
    </body>
</html>
```
これで、ページに「太郎さん、HELLO WORLD」と表示されます。

# 文字列にする場合
viewに変数を埋め込んだものを直接返しましたが、これを文字列にする場合は、
```
render()
```
を使うようです。
これを使って、HTMLではなく、普通の文章に文字列を埋め込んでみます。

```
use Illuminate\Support\Facades\Log;
public function index() {
    $data = [
        ‘content’=>’HELLO WORLD’,
        'name'=>'太郎'
    ];
//とりあえずログに吐き出してみる
Log::info(view(‘test,index’, $data)->render());
}
```
View(Blade.php)
```
{{ $name }}さん、{{ $content }}
```
これで、ログに「太郎さん、HELLO WORLD」と出力されます。

# 使い道
あまり使い道はないかと思いますが、Laravelのシステムからメールを送信するときなどに使うとどうでしょうか。

View(Blade.php)
```
{{ $name }}様

平素より、〇〇システムをご利用いただき、ありがとうございます。

以下のように、メンテナンスを実施することが決まりましたので、ご連絡させていただきます。
【メンテナンス日】
{{ $date }}

【メンテナンス内容】
{{ $content }}

ご迷惑をおかけしますが、何卒よろしくお願い致します。
```
こんな感じでメールのテンプレートを作っておいて、変数を渡す形で本文を組み立てて送るといい感じかと思います。
【Rails】railsのActiveRecordで最新のレコード１件取得する

# 環境
- Mac（12.2.1）
  -  MacBook Pro (13-inch, 2020)
  -  2 GHz クアッドコアIntel Core i5
  -  16 GB 3733 MHz LPDDR4X
- ruby (3.0.0p0)
- rails (7.0.1)
- mysql2 (0.5.3)

# はじめに

# 前提知識

# 解決したい内容
egoscore=EgoScore.where(user_id: current_user.id).pluck(:cp_score,:np_score,:a_score,:fc_score,:ac_score).flatten
# 改善策

下記コードを追加する
`order(updated_at: :desc).limit(1)`

```
egoscore=EgoScore.where(user_id: current_user.id).order(updated_at: :desc).limit(1).pluck(:cp_score,:np_score,:a_score,:fc_score,:ac_score).flatten
```


# 参考にした記事
https://qiita.com/new1/items/29b3bc0f5babc9c6c7be
github, azure repos, 任意の鍵でgit clone

## 具体的に鍵指定するのってどういうシーン？
* 既にgithubを使用していて、クライアント指定のgithubアカウントを使って開発する場合
  * 既に使用している公開鍵を複数のアカウントに設定することはできない
* クライアント指定の秘密鍵を使用する場合
    * 滅多にないけど、秘密鍵を使い回しているパターン

## 前提条件
id_rsa_exampleを、~/.ssh ディレクトリに置いていること

### ホストを設定する github版
```shell:vim ~/.ssh/config
host example
  hostname github.com
  identityfile ~/.ssh/id_rsa_example
  user git
```

### git cloneする
```shell:cd ~/workdir
git clone example:[project_name]/[repo_name]
```


### ホストを設定する AzureRepo版
```shell:vim ~/.ssh/config
Host azure
    hostname ssh.dev.azure.com
    user git
    identityfile ~/.ssh/id_rsa_example
```

### git clone する
```shell:cd ~/workdir
git clone azure:v3/[organization_name]/[project_name]/[repo_name]
```
Next.jsでエイリアスpathを使用する

## 結論

`tsconfig.json`で`baseUrl`と`paths`を設定するだけ

Next.js 9.4以降は`next.config.js`の設定は不要

```jsonc:tsconfig.json
{
  "compilerOptions": {
   // 略
    "baseUrl": ".",
    "paths": {
      "@/*": ["./src/*"]
    }
  }
}
```

## 参考資料

https://nextjs-ja-translation-docs.vercel.app/docs/advanced-features/module-path-aliases
【MySQL】【メモ】カラム内の改行が「\r\n」と表示するのを改めたい



# 環境
- Mac（12.2.1）
  -  MacBook Pro (13-inch, 2020)
  -  2 GHz クアッドコアIntel Core i5
  -  16 GB 3733 MHz LPDDR4X
- ruby (3.0.0p0)
- rails (7.0.1)
- mysql2 (0.5.3)


# 解決したい内容
DBのカラム(text型)の値の中に\r\nがあり、改行して表示しようとしたが、そのまま「\r\n」と表示されて困った
# 解決
viewにて該当するカラムに対してsimple_format()を使用

```erb:app/views/contents/home.html.erb
<%@test_result.each do |i|%>
<li><%=simple_format(i.egogram_type)%></li>
<li><%=simple_format(i.character)%></li>
<li><%=simple_format(i.stregth)%></li>
<li><%=simple_format(i.weakness)%></li>
<li><%=simple_format(i.people_around_you)%></li>
<%end%>
```


# 参考にした記事
[Ruby on Rails - 入力した改行をそのまま表示する方法](https://undersourcecode.hatenablog.com/entry/2013/08/18/193249)
【MySQL】【メモ】改行コードの書き方



# 環境
- Mac（12.2.1）
  -  MacBook Pro (13-inch, 2020)
  -  2 GHz クアッドコアIntel Core i5
  -  16 GB 3733 MHz LPDDR4X
- ruby (3.0.0p0)
- rails (7.0.1)
- mysql2 (0.5.3)

# はじめに
DBのカラム内に文字列を登録した
その文字列を改行したく調べていた

# 前提知識
- 改行コードを登録する方法は DB によって異なる

# 改善策
結論、MySQLではCやJavaなどと同様に、改行には「\r\n」を使います。
```
TestResult.create(egogram_type:"クールネガティブ",character: "自分を\r\n自分の
```
# おわりに

# 参考にした記事
[DB に改行コードを登録する方法について](https://dstn.appresso.com/hc/ja/community/posts/115007027808-DB-%E3%81%AB%E6%94%B9%E8%A1%8C%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E7%99%BB%E9%8C%B2%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6)
[SQLで改行コードを挿入する方法をRDB別に解説！](https://style.potepan.com/articles/25411.html#:~:text=MySQL%E3%81%A7%E6%94%B9%E8%A1%8C%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E6%8C%BF%E5%85%A5%E3%81%99%E3%82%8B%E3%81%AB%E3%81%AF%E3%80%81%E7%89%B9%E6%AE%8A,n%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%BE%E3%81%99%E3%80%82)
[MySQLで改行コードを挿入/置換する方法](https://www.sukerou.com/2020/09/mysql.html)
【メモ】Rilas:sqlのバックアップとリストア、ローカルDBをEC2にインポート



# 環境
- Mac（12.2.1）
  -  MacBook Pro (13-inch, 2020)
  -  2 GHz クアッドコアIntel Core i5
  -  16 GB 3733 MHz LPDDR4X
- ruby (2.7.5)
- rails (7.0.1)
- mysql2 (0.5.3)



## バックアップ

```:ローカル
$ mysqldump -u ユーザー名 -p -t データベース名 テーブル1 テーブル2 ... > ダンプファイル名
```

```:ローカル
$ mysqldump -u root -p PF_development posts > test.sql
```


テーブル名を記述しない場合は全てのテーブルをバックアップ
拡張子はcsvなど、使用したいものに変更可能


## リストア
```:ローカル
$ mysql -u ユーザ名 -p データベース名 < ダンプファイル名
```

```:ローカル
$ mysql -u root -p PF_development< test.sql
```

※ダンプファイルはコマンドプロンプトのカレントディレクトリ(現在のフォルダ)に置く



ローカルのDBの保存内容をAWSのEC2にコピーしたい場合は下記記事を参照した

https://qiita.com/ayacai115/items/7231a7bb5474bc2cecf4





# 参考にした記事
https://www.d-wood.com/blog/2017/04/18_8896.html

https://qiita.com/sango/items/84a45e5911d719a2c08c
SQL 条件分岐case

#### 条件分岐case

* 構文

```
case
  when 条件式1 then 値1　　　　　　 ・・・条件式1がtrue(真)ならば値1
  [when 条件式2 then 値2 ・・・]　　・・・条件式2がtrue(真)ならば値2
  [else 値3]　　　　　　　　　　　　・・・どれにも当てはまらなければ値3
end
```

[]の部分は省略可能。

最後のendは省略不可。

忘れやすいので注意!
SQL サブクエリ

#### サブクエリ

* ある問い合わせの結果に基づいて、異なる問い合わせを行う仕組み

* 構文

```
select
  列名, ...
from
  テーブル名
where
  列名 演算子(select 列名 from テーブル名2 ...);
```

#### スカラ・サブクエリ

* 必ず1行1列だけの戻り値を返す、サブクエリのこと。
* スカラとは単一のという意味
* 絶対にサブクエリが複数行を返さないようにする
SQL ビュー

#### テーブルとビューの違いは?

* テーブル
   * 実際のデータを保存

* ビュー

   * ビューの中にはselect文が保存される
   * ビュー自体はデータを持たない。

#### ビューの制限

* order b句が使えない

* ビューに対する更新は不可能ではないが制限がある。

#### ビューのメリット

* データを保存しないので、記憶装置の容量を節約できる。

* よく使うselect文をビューにしておくことで、使い回しができる。

#### ビューのデメリット

* パフォーマンス低下を招く場合がある

#### ビューの作成

* 構文

```
create view ビュー名(<ビューの列名>,<ビューの列名2>, ,..)
as
<select文>
```

#### ビューの削除

* 構文

```
 drop view ビュー名;
```
SQL テーブルの結合とはテーブルの正規化とは

#### テーブルの正規化とは

* テーブルを分けて情報の重複をなくしていく作業

#### テーブルの正規化するメリット

* 1 . データ管理が容易になる
* 2 . データ容量の削減

* →特別な意図がなければ、テーブルは正規化する。
  * 特別な意図の例) システムのパフォーマンス向上のため。

#### テーブルの結合とは

* テーブル同氏をある条件で結合することにより、正規化なしの状態を作り出すこと。

#### 基本は正規化、しかしながら、

* パフォーマンスの問題が解消できない(できなくなりそうな)場合はあえて非正規化することもある。

* 実務で見かける可能性もある。 

#### 主キーと外部キー

#### 主キー(Primary Key, PK)

* 一つの行を特定できる列のこと。

#### 外部キー(Foreign Key, FK)

* 他のテーブルとの関連づけに使う列のこと
* 外部キーは関連づけされた先のテーブルでは主キーになる。

#### リレーションシップの種類

  * テーブル同士の結び付き・関係性の種類

* 1対多
* 多対多
* 一対一

#### 1対多の事例

* (1)ユーザー       - (多)注文

* (1)ブログの投稿者 - (多)ブログの投稿

* (1)注文           - (多)注文明細

* (1)部署           - (多)従業員

#### 多対多の事例

* (多) 商品          - (多) 商品カテゴリ

* (多) ブログの投稿  - (多)ブログのカテゴリ

* (多) ユーザー      - (多) 操作権限

#### 一対一の事例

* 特殊なので、あまり使う機会はない

#### 内部結合でテーブルを結合するinner join

* 構文

```
select
  テーブル名1.列名,
  テーブル名2.列名 ...
from
  テーブル名1
inner join
  テーブル名2
on テーブル名1.列名 = テーブル名2.列名;
```

#### 内部結合 + 絞り込み

* 構文 inner join + where

```
select
  テーブル名1.列名,
  テーブル名2.列名 ...
from
  テーブル名1
inner join
  テーブル名2
on テーブル名1.列名 = テーブル名2.列名
where
  絞り込み条件;
```

#### select文の記載順序と実行順序(結合を追加)

* 記述順序 (必ずこの順序で書く必要がある)
  * 1 . select ・・・ 取得行(カラム)の指定
  * 2 . from ・・・ 対象テーブルの指定
  * 3 . 結合処理
  * 4 . where ・・・ 絞り込み条件の指定
  * 5 . group by ・・・ グループ化の条件を指定
  * 6 . having ・・・ グループ化した後の絞り込み条件を指定
  * 7 . order by ・・・ 並び替え条件を指定
  * 8 . limit ・・・ 取得する行数の制限

* 実行順序
  * 1 . from ・・・ 対象テーブルの指定
  * 2 . 結合処理
  * 3 . where ・・・ 絞り込み条件の指定
  * 4 . group by ・・・ グループ化の条件を指定
  * 5 . having ・・・ グループ化した後の絞り込み条件を指定
  * 6 . select ・・・ 取得行(カラム)の指定
  * 7 . order by ・・・ 並び替え条件を指定
  * 8 . limit ・・・ 取得する行数の制限

#### 外部結合

* 片方のテーブルの情報がすべて出力される、テーブルの結合
* 外部結合は欠落のあるデータを取り扱う結合。

* 構文 :外部結合 left outer join

```
select
  テーブル名1.列名,
  テーブル名2.列名 ...
from
  テーブル名1
left outer join
  テーブル名2
on テーブル名1.列名 = テーブル名2.列名;
```

left outer join / right outer join

* left outer join...左側(from句で最初に書いたテーブル)をマスタとする。

* right outer join...右側(from句で後に書いたテーブル)をマスタとする。

#### 内部結合 inner join

* お互いに一致している行が統合テーブルの対象となる

#### テーブルの足し算 集合演算子 union nuion all

* 構文

```
select 列1, ... from テーブル1
union select 列2, ... FROM テーブル2
```

* ベースとなるselectの結果に、unionの後に記載したselectの結果を足し算する
SQL 日付と時刻の演算

#### 日付と時刻の関数や演算子

* 現在の日付 ・・・ current_date

* 現在の時刻 ・・・ current_timestamp

* n日後の日付 ・・・ d + n

* n日前の日付 ・・・ d - n

* x時間後の時刻 ・・・ interval'x hour'

* x時間前の時刻 ・・・ - interval'x hour'

* extrfact ・・・ 日付や時刻の特定の部分(年や月) までを取り出す。
SQL 関数と演算子

#### 四捨五入 round

* 構文
```
round(対象の数値, 丸めの桁数)
```
* 例) 
   * 丸めの桁数に0を指定すると、小数点第1位で四捨五入 round(10,555, 0)

   * 丸めの桁数に1を指定すると、小数点第2位で四捨五入 round(10,555, 1)
      * →10.6

   * 丸めの桁数に2を指定すると、小数点第3位で四捨五入 round(10,555, 2)
      * →10.56

#### 文字列演算

* 文字列演算 a || b ・・・文字列aと文字列bを連結
   * ただし、MySQL,SQL Server 2012以後ではconcat関数を使用   
   * concat(文字列1, 文字列2, 文字列3 ・・・)
SQL データの並び替え

#### select文で取得するデータの並び替え order by

* 構文
  
```
order by 列名や式 並び順, ...
```

* 並び順の指定
  * asc ・・・昇順(ascending) ※デフォルト。並び順を指定しない場合ascになる
  * desc ・・・降順(descending)
 
* order byには、カンマ区切りで複数の並び替え条件を指定できる。
* 登録順はid昇順で並び替える。
データの集約

#### 合計値を求めるsum集約関数

* 構文

```
sum(expr)

※exprの合計値を返す。
```

#### 平均値を求めるavg集約関数

* 構文

```
avg(expr)

※exprの平均値を返す。
```

#### 最小値を求めるmin集約関数

```
min(expr)

※exprの最小値を返す。
```

#### 最大値を求めるmax集約関数

```
max(expr)

※exprの最大値を返す。
```

#### 集約関数におけるnullの扱い

#### nullとは

* 値がないことを示す特別な表現
* 数値の0でも、長さ0でもなく、値がない。

* 集約関数では、基本的にはnullが無視される。
 
#### 対象行の行数を数えるcount集約関数

* 構文

```
count(expr)

補足: 
 * exprの数をカウント
 * count(*)とすると、テーブルの行数を取得できる。
 * userテーブルの行数が、ユーザー数となる。
```

#### 指定した期間のユニークユーザー数を求める方法

* ここでの、ユニークユーザーとは、決まった集計期間内にアクセスしたユーザーの数を表す数値

* あるユーザーAが決まった機関内に10アクセスしたとしても、1と数える。
  where句と集約関数count(distinct expr)を組み合わせて使う。  

* count(distinct exor)の形で、count関数は、重複を排除した上で、個数を取得できる。

#### テーブルのデータをグループ化するgroup by句

* 構文

```
select
  列名
from
  テーブル名
group by 列名;
```
* countなどを使ってデータを集計する時に、グループ単位で集計が行われる
* group byで指定する列名によって、グループ化される。

#### 集約結果をさらに絞り込むhaving句

* where句と同様に、条件に合致する行だけに絞り込める。
* having句は、テーブルのデータを集約して結果に対して、条件式を適用する場合に利用する。

* 構文

```
select 
  列1, ...
from
  テーブル名
where
  条件式
group by
  列1, ...
having
  条件式;
```

#### 記述順序 having

* select
  * ↓
* from
  * ↓
* where
  * ↓
* group by
  * ↓
* having

※ ポイントとしては、havingは、group byの後に書く

#### select文の記載順序と実行順序

* 記述順序 (必ずこの順序で書く必要がある)
  * 1. select ・・・ 取得行(カラム)の指定
  * 2. from ・・・ 対象テーブルの指定
  * 3. where ・・・ 絞り込み条件の指定
  * 4. group by ・・・ グループ化の条件を指定
  * 5. having ・・・ グループ化した後の絞り込み条件を指定
  * 6. order by ・・・ 並び替え条件を指定
  * 7. limit ・・・ 取得する行数の制限

* 実行順序
  * 1. from ・・・ 対象テーブルの指定
  * 2. where ・・・ 絞り込み条件の指定
  * 3. group by ・・・ グループ化の条件を指定
  * 4. having ・・・ グループ化した後の絞り込み条件を指定
  * 5. select ・・・ 取得行(カラム)の指定
  * 6. order by ・・・ 並び替え条件を指定
  * 7. limit ・・・ 取得する行数の制限

* 記述順序/実行順序の違い
  * 1. select / from
  * 2. from / where
  * 3. where / group by
  * 4. group by / having
  * 5. having / select
  * 6. order by / order by
  * 7. limit / limit

※ ポイント : selectの記述順序と実行順序が異なる
データを表計算ソフトに取り込む

#### select文により取得したデータの利用方法

* 1. コンピュータプログラムから利用する
    * プログラミング言語からSQLをデータベースに投げてその結果を画面に出力する

* 2. CSVファイルに書き出し、表計算ソフトに取り込む、
    * エクセル、Google スプレッドシートなど

#### データをCSVに書き出す

* mysql workbenchなどのコネクタ/ドライバからCSVファイルを書き出しエクセル、
  Google スプレッドシートに取り込む。

#### CSVとは

     * Comma-Separated Valuesの略
     * 区切りもじであるコンマ「,」で区切ったテキストデータ

#### CSVの例

``` 
id ,name price
1, 商品01, 500

```

※CSVの代わりにTSVという形式を使うことがある。

#### TSVとは
 *  Tab-Separated Values(TSV)の略
 *  区切りもじであるコンマ「タブ」で区切ったテキストデータ
SQL文の基礎

#### データベースからデータを取得するselect文

```
* 構文
   select 列1,列2 ... from テーブル名
* 全ての列を取得したい場合は、
   select * from テーブル名;
```

#### 初心者が間違いやすいこと
* DBを選択していない
* スペルミス
* 全角文字で記載

#### コメントの種類

* ① 「--」
* ② 「/* */」

* 「*」を使って全ての行を取得するより、必要な列を絞って取得する方が高速に実行できる
*  実務では、基本的に必要なカラムに絞ってデータを取得する。
*  試験的にSQLを書く時や、学習の時など、パフォーマンスの心配がないときは、「*」を使うこともある。

#### 列に別名を付ける

```
select 列1 as 別名にする文字を記載 from テーブル名
```

※asは省略可能

#### 列の値に対して演算を行う

* テーブルから抽出した結果をそのまま使うだけではなく、計算した結果を出力することができる。

```
select
  name as 名前,
  price as 価格,
  price * 1.1 as 税込価格
from
  products;
```

#### 条件を指定して値を取得できるwhere句を使用


* 構文

```
select 列1, 列2 ... from  テーブル名 where 条件;
```

#### where句で条件を設定する際に利用できる代表的な演算子の種類

* 「=」等しい
* 「>」より大きい
* 「>=」以上
* 「<」より小さい
* 「<=」以下
* 「<>」, 「!=」等しくない
* 「in」ある値が値セット内に含まれているかどうか
* 「not in」値が値セット内に含まれていないかどうか
* 「is null」値がnull
* 「is not null」値がnullでない
* 「like」パターンマッチング(あいまい検索)
* 「between ... and ...」値が値の範囲内に含まれているか

#### パターンマッチングによる絞込ができるlike句

* 構文

```
select 列1,　...,from テーブル名 where 列名 like ワイルドカード文字;
```

#### ワイルドカード文字について

* ワイルドカード文字で文字列のパターンを指定します。

  1. '%' (パーセント) ・・・0文字以上の任意の文字列
  2. '_' (アンダースコア) ・・・任意の1文字

* 例)
  1. '中%' →'中'で始まる文字列
  2. '%中%' → '中'を含む文字列
  3. '%子' → '子'で終わる文字列
  4. '__子' →何かしらの文字から始まり、'子'で終わる文字列

#### 取得件数を制限できるlimit句

* 構文

```
select 列1, ・・・ from テーブル名 limit [オフセット,] 最大取得件数;
```

※オフセットは省略可能
nc(netcat/ncat)を使ってTCPポートをスキャンする



### forループを使って、対象のIPアドレスの到達性とTCPポートの状態を確認する

##### この記事は、[Test-Connectionを使ってTCPポートをスキャンする](https://qiita.com/MashCannu/items/2974463d55dd323be96a)をPythonで実施したものです。

### ユースケース
+ **with** **open()** でテキストファイルを開く
+ forでテキストファイルと変数のリストから対象を取り出す
+ forの中でforを回すネスト構造
+ **subprocess**モジュールから、**ping**と**nc**を呼び出して実行
+ **ncコマンド** (macOSの場合)でポートの状態を確認
+ **f文字列**で出力フォーマットの体裁を整える


以下、環境です。
**macOS Montrey(12.4)**
**Python 3.10.4**

``` ipAddrList.txt
172.22.1.201
172.22.1.170
172.22.1.179
172.22.1.81
172.22.1.26
172.22.1.25
172.22.0.1
172.22.0.2
```
+ IP到達性を確認したいIPアドレスリスト

```portCheck.py
import subprocess

file_path = '/Python/ipAddrList.txt'

with open(file_path) as f:
    ip_addr_list = f.readlines()

port_list = ['22', '80', '443']

for ip_addr in ip_addr_list:
    target_ip = ip_addr.rstrip('\n')
    result_ip = subprocess.call(['ping', target_ip, '-c 1', '-t 1'], 
                               stdout = subprocess.DEVNULL,
                               stderr = subprocess.DEVNULL)
    if result_ip == 0:
        for target_port in port_list:
            result_port = subprocess.call(['nc', target_ip, target_port, '-vzw 1'], 
                                         stdout = subprocess.DEVNULL,
                                         stderr = subprocess.DEVNULL)
            if result_port == 0:
                print(f'Host: {target_ip:15} Port: {target_port:3} is opened')
            else:
                print(f'Host: {target_ip:15} Port: {target_port:3} is NOT opend')
    else:
        print(f'Host: {target_ip:15} is NOT reachable')
```
+ 実行結果

```
$ python ./portCheck.py 
Host: 172.22.1.201    is NOT reachable
Host: 172.22.1.179    is NOT reachable
Host: 172.22.1.170    Port: 22  is NOT opend
Host: 172.22.1.170    Port: 80  is NOT opend
Host: 172.22.1.170    Port: 443 is NOT opend
Host: 172.22.1.81     Port: 22  is NOT opend
Host: 172.22.1.81     Port: 80  is NOT opend
Host: 172.22.1.81     Port: 443 is NOT opend
Host: 172.22.1.26     is NOT reachable
Host: 172.22.1.25     Port: 22  is NOT opend
Host: 172.22.1.25     Port: 80  is opened
Host: 172.22.1.25     Port: 443 is NOT opend
Host: 172.22.0.1      Port: 22  is NOT opend
Host: 172.22.0.1      Port: 80  is NOT opend
Host: 172.22.0.1      Port: 443 is NOT opend
Host: 172.22.0.2      is NOT reachable
```

### コード解説

``` line.py
with open(file_path) as f:
    ip_addr_list = f.readlines()
```
+ with open( ) で開いて、勝手にファイルクローズできるようにする
+ readlines( ) で1行ずつ読み込んでリスト化する 

``` line.py
for ip_addr in ip_addr_list:
    target_ip = ip_addr.rstrip('\n')
```
+ for文でリストからアドレスを取り出す
+ 末尾に改行(\n)がついているので、.strip( )メソッドで削除

``` line.py
result_port = subprocess.call(['nc', target_ip, target_port, '-vzw 1'], 
                              stdout = subprocess.DEVNULL,
                              stderr = subprocess.DEVNULL)
```
+ subprocess で 別のアプリケーションを起動する
+ call( )メソッドで実行すると、戻り値を判断できる。成功は0、その他は1とか2になる。

``` line.py
if result_port == 0:
    print(f'Host: {target_ip:15} Port: {target_port:3} is opened')
else:
    print(f'Host: {target_ip:15} Port: {target_port:3} is NOT opend')
```
+ if文で戻り値を確認
+ f文字列でフォーマットを整えて出力
SQLの基礎

データベース、テーブル、行（レコード、ロウ）、列（フィールド、カラム）
クエリ（query, お問い合わせ）

データの検索や更新、削除、抽出などの要求をデータベースに送信すること。

#### 使用例
 * ユーザー情報を取得するために、クエリを投げる。

#### データ型
・データベースでは、テーブルを作成する時に、それぞれの列（カラム・フィールド）に指定した
　形式のデータしか、入力できないように設定する。

・この時指定するデータの形式をデータ型という。

#### 主なデータ型の種類

* 数値型
* 文字列型
* 日付・時刻型

#### 数値型

* int型 (イント、インテジャー)
    * 整数 
* tinyint型 (タイニーイント)
    * とても小さな整数　真偽値を扱いたいときや、127以下の数字を扱いたい時
* float型 (フロート)
    * 小さな(単精度) 浮動小数点　※現場ではあまり使わない
* double型 (ダブル)
    * 普通サイド(倍精度) 浮動小数点数 

* int unsigned
    * 数値は、符号なしとすることができます。言い換えると、正の整数だけ扱うとする
* tinyint(1)
    * 真偽値 true/false
    * 内部的にはtrueは数学の1、falseは数学の0で管理されています。

   ※関連して・・・MySQLでは0とnullがfalseで、空文字を含むそれ以外の値は全てtrueとなる。
    * null(ヌル) ・・・データが存在しないことを表す値

#### 文字列型

* char型 (キャラ)
    *   固定長の文字列 255文字まで。文字列を格納する時に指定した長さになるようにスペースが埋め込まれます。
    *  列)商品コードで5桁固定"CD123"。定義方法 : char(5)
* varchar型 (バーキャラ)
    * 可変長の文字列 255文字列まで。
    * 例) email "hijikata@example.com"。定義方法 : varchar(255)
* text (テキスト)  
    * 長い文字列 65535文字まで
・・・実務上は、255文字まではvarchar, それ以上はtextとすることが多い。

#### 日付・時刻型

* date型 (ディト)
    * 日付 
* datetime型 (ディトタイム)
    * 日付と時刻
* time型 (タイム)
    * 時刻

#### ER図

* ER図
     * Entity Relationship Diagram
     * データベースの構造を表す方法の一つ
git 一次避難

作業が途中でコミットしたくないけど別のブランチで作業しないといけない。
そういう時に作業を一時避難する。

#### 作業を一次避難する
```
git stash
git stash save
```
#### 作業した作業リストを確認する
```
git stash list
```
#### 保存した変更を戻す
```
git stash pop # 最新のスタッシュを適用する
git stash pop stash@{1} # 複数ある場合はスタッシュ番号を指定する
```

#### 避難した作業を復元する
```
git stash apply
```
#### ステージの状況も復元する
```
git stash apply --index
```

#### 特定の作業を復元する
```
git stash apply [スタッシュ名]
git stash apply stash@{1}
```

*applyは適用するという意味

#### 避難した作業を削除しよう
```
git stash drop
```
#### 特定の作業を削除する
```
git stash drop [スタッシュ名]
git stash drop srash@{1} # 複数ある場合はスタッシュ番号を指定する
```

#### 全作業を削除する
```
git stash clear
```
git タグ付け

gitのタグは2種類ある(注釈付きタグ)と(軽量タグ)

#### 注釈付きタグ
```
git tag -a [タグ] -m "[メッセージ]" 
-mはエディタを立ち上げずにメッセージを入力できる
```

#### 軽量タグ
```
git tag [タグ名]
```
#### 後からタグ付けする
```
git tag [タグ名] [コミット名]
```

#### タグのデータを表示する
```
git show [タグ名]
```
タグをリモートに送信するには
git push コマンドで別途指定する


#### タグをリモートリポジトリに送信する
```
git push [リモート名] [タグ名]
```

#### タグを一斉に送信する
```
git push origin --tags
```
git リベースで履歴を書き換える

コミットをきれいに整えてからpushしたい時は履歴を書き換えよう。

*GitHubにPushしていないコミット
```
直前のコミットをやり直す
git commit --amend
```
リモートリポジトリにPushしたコミットはやり直したらダメだよ。
```
複数のコミットをやり直す
git rebase -i <コミットID>
git rebase -i HEAD～3

pick gh21f6d ヘッダー修正
pick 193054e ファイル追加
pick 84gha0d README修正
```

-iは--interactiveの略だよ。
対話的リベースといって、やり取りしながら履歴を変更していくよ。

#### やり直したいcommitをeditにする
```
edit gh21f6d ヘッダー修正
pick 193054e ファイル追加
pick 84gha0d README修正
```
#### やり直したら実行する
```
git commit --amend
```

#### 次のコミットへ進む(リベース完了)

```
git reabase --continue

HEAD~
1番目の親を指定する。
HEADを基点にして数値分の親コミットまで指定する。

HEAD^
マージした場合の2番目の親を指定する。

rebase -i コマンドの一連の流れ

①git rebase -i コマンドで対話的リベースモードに入る

②修正したいコミットをeditにしてコミットエディタを終了する

③editのコミットのところでコミットの適用が止まる

④git commit --amendコマンドで修正

⑤git rebase --continueで次のコミットへ行く

⑥pickでとそのままのコミット内容を適用して次へ行く
```

#### コミットを並び替える、削除
```
# コミットを並び替える、削除
①8e4ghaOdのコミットを消す
②193054eを先に適用する
pick 193054e ファイル追加
pick gh21f6d ヘッダー修正
```

#### コミットをまとめる
```
# コミットを1つにまとめる
pick gh21f6d ヘッダー修正
squash 193054e ファイル追加
squash 84ghaOd README修正
```

#### コミットを分割する
```
# コミットを分割する
pick gh21f6d ヘッダー修正
pick 193054e ファイル追加
edit 84ghaOd READMEとindex修正
```

```
git reset HEAD^
git add README
git commit -m 'README修正'
git add index.html
git commit -m 'index.html修正'
git rebase --continue
```
git プルのマージ型、リベース型

#### プルのマージ型

```
git pull <リモート名><ブランチ名>
git pull origin master
```

マージコミットが残るから、マージしたという記録を残したい場合に使おう

#### プルのリベース型

```
git pull --rebase
<リモート名><ブランチ名>
git pull --rebase origin master
```

マージコミットが残らないから、GitHubの内容を取得したいだけの時は--rebaseを使おう

#### プルをリベース型に設定する

```
git config --global pull.rebase true

masterブランチでgit pullする時だけ
git config branch.master.rebase true
```

--rebaseオプションを付けなくてもgit pullの挙動がリベース型になるよ

```
~/.gitconfig
~/.config/git/config
```
--globalを付けるとPC全体の設定になるよ

```
project/.git/config
ローカルリポジトリ
```
GitHubでEmojiコミットメッセージを残す

## .commit_template

```

# 🌱  :seedling: Initial commit
# 📝  :memo: ドキュメント追加
# 🐛  :bug: バグ修正
# 👍  :+1: 機能改善
# ✨  :sparkles: 部分的な機能追加
# 🎉  :tada: 盛大に祝うべき大きな機能追加
# 🎨  :art: スタイリングの修正
# ♻️  :recycle: リファクタリング
# 🚿  :shower: 不要な機能・使われなくなった機能の削除
# ✅  :white_check_mark: テストの追加
# 💚  :green_heart: テストやCIの修正・改善
# 👕  :shirt: Lintエラーの修正やコードスタイルの修正
# ➕  :heavy_plus_sign: リソース・ライブラリの追加
# ➖  :heavy_minus_sign: リソース・ライブラリの削除
# 🚀  :rocket: パフォーマンス改善
# 🆙  :up: 依存パッケージなどのアップデート
# 🔒  :lock: 新機能の公開範囲の制限
# 👮  :cop: セキュリティ関連の改善

```

## .commit_templateをどうするか
作業ディレクトリにおいて、
`git config commit.template .commit_template`

## 参考
https://goodpatch.com/blog/beautiful-commits-with-emojis
【javascript】【jquery】eq(エクエイション) ()メソッドの使い方

# HTML
```html 
<ul>
      <li>リンゴ</li>
      <li>バナナ</li>
      <li>メロン</li>
      <li>イチゴ</li>
</ul>
```
# Jquery

```javascript
console.log($('li:eq(1)').text());
```

# 結果
```
バナナ
```
chart.jsのlegendが効かないと思ったら日本語ドキュメントが古かった

## legendが効かない。。。？

目的：chart.jsの凡例の見た目を調整したい。
事実：options.legend.labelsを編集しても反応が無い。

はて？
## V3へのバージョンアップで場所が変わっていた。

原因：検索上位に表示される有志の日本語ドキュメントが軒並み古くなっていたため、バージョンの違いに気付かなかった。

V2: options.legend.labels  →  V3: options.**plugins**.legend.labels

**V3.8.0においては**下記の通り記述します。

```
const config = {
	type: 'line',
	data: data,
	options: {
		plugins: {
			legend: {
				labels: {
					boxWidth: 40,
					boxHeight: font.size,
					color: Chart.defaults.color,
					font: Chart.defaults.font,
					padding: 10,
//					generateLabels: ,
//					filter: null,
//					sort: null,
					pointStyle: 'circle',
					textAlign: 'center',
					usePointStyle: FALSE
				}
			}
		}
	}
};
```
FATAL: unrecognized configuration parameter "unix_socket_directory" が出力されてpg_upgradeが実行出来なかった

調べても英語の記事しか引っかからなかったので、この手の記事はいくつあっても困らないだろうと思い書く。
調べ方が悪かったのかもしれない。

# 環境情報
- OS : Red Hat 7.9
- PostgreSQL : 9.2 から 14.x に上げる
# 結論
以下のコマンドを `pg_upgrade` を行う前にrootユーザで発行すれば解消できる。
```sh
# rootユーザで実行
mv /usr/bin/pg_ctl{,-orig}
echo '#!/bin/bash' > /usr/bin/pg_ctl
echo '"$0"-orig "${@/unix_socket_directory/unix_socket_directories}"' >> /usr/bin/pg_ctl
chmod +x /usr/bin/pg_ctl

# アップグレードコマンドの実行
sudo -u postgres /usr/pgsql-14/bin/pg_upgrade ...

# 変更したコマンドを元に戻す
mv -f /usr/bin/pg_ctl{-orig,}
```
※こちらのAnswerを使用しました。回答者に感謝
[pg_upgrade unrecognized configuration parameter "unix_socket_directory" | stackexchange.com](https://dba.stackexchange.com/questions/50135/pg-upgrade-unrecognized-configuration-parameter-unix-socket-directory)

# 経緯
RedHatのリポジトリからインストール出来る 9.2 から最新の 14 へDBをアップグレードする必要があった。
公式の手順に倣い `pg_upgrade` コマンドを使用してアップグレードを行ったところ以下のエラーに遭遇。
```
# sudo -u postgres /usr/pgsql-14/bin/pg_upgrade -d /var/lib/pgsql/data -D /var/lib/pgsql/14/data -b /usr/bin -B /usr/pgsql-14/bin
Performing Consistency Checks
-----------------------------
Checking cluster versions                                   ok

*failure*
Consult the last few lines of "pg_upgrade_server.log" for
the probable cause of the failure.

connection to server on socket "/var/lib/pgsql/.s.PGSQL.50432" failed: No such file or directory
        Is the server running locally and accepting connections on that socket?

could not connect to source postmaster started with the command:
"/usr/bin/pg_ctl" -w -l "pg_upgrade_server.log" -D "/var/lib/pgsql/data" -o "-p 50432 -b  -c listen_addresses='' -c unix_socket_permissions=0700 -c unix_socket_directory='/var/lib/pgsql'" start
Failure, exiting
```
`Is the server running locally ...` はDBが既に立ち上がっている場合などでよく見るエラーだが、今回はアップグレードの為にDBをストップさせている。
下段のエラーを見ると `pg_upgrade` 内部で発行している `pg_ctl` コマンドが失敗しているらしい。

pg_upgrade_server.logに出力されたエラーは以下の通り
```
command: "/usr/bin/pg_ctl" -w -l "pg_upgrade_server.log" -D "/var/lib/pgsql/data" -o "-p 50432 -b  -c listen_addresses='' -c unix_socket_permissions=0700 -c unix_socket_directory='/var/lib/pgsql'" start >> "pg_upgrade_server.log" 2>&1
waiting for server to start....FATAL:  unrecognized configuration parameter "unix_socket_directory"
 stopped waiting
pg_ctl: could not start server
Examine the log output.
```

原因は、PostgreSQL 9.2 から 9.3 へのアップデートで、内部で使用するパラメータ `unix_socket_directory` が `unix_socket_directories` (末尾が複数形) に変更された影響。
新しいクラスタ内で `pg_upgrade` を実行したが、内部では古いクラスタの `pg_ctl` が実行され、古いパラメータの `unix_socket_directory` を参照しようとしたが、新しいクラスタ内なので無いというエラーらしい。
binding完全に理解した（してない）

多分すぐ忘れてしまうので備忘として。。。
そもそもbindingって何ですか？と言うレベルの馬鹿なのでバインドの目的も何しているのかも全然判らなかったんですが、要はview上のcontrolのプロパティに変数設定したいぜって時に使う事ですかね。いろいろ間違ってるかもしれないけど今は実用上そういう理解で。

今回は例として、TextBoxへの入力漏れを視覚的に判りやすくするために、未入力のTextboxの背景に色を付けたいって時、TextBoxのTextプロパティの値に応じてBackgroundプロパティを変化させたい、ってケースの場合の覚書です。

ViewのTextboxは以下の通り記述。

~~~html:xaml
<TextBox x:Name="Textbox1" Background="{Binding ElementName=Textbox1, Path=Text, Converter={StaticResource IsTextEntered}}"/>
~~~

この時「Background」プロパティをバインドします。
「"{Binding ElementName=Sqid_Textbox, Path=Text, Converter={StaticResource IsTextEntered}}"」の「ElementName」は参照するエレメント名を指定します。
今回のケースでは自分自身のTextを参照するので自分自身のNameを指定していますが、例えば「テキストボックスに文字が入力されている場合にボタンを有効にする」みたいな時にはボタンのプロパティにテキストボックスのプロパティをバインドする事も出来ます。

「Path」は参照エレメントの実際に参照するプロパティを指定します。このケースではTextboxの「Text」を参照しています。

Bool値を単に連動させたい場合は不要と思いますが、今回は値を変換する必要がある為、converterを指定しています。

今回のケースではTextの値が空の場合は背景色をピンクに、Textに値が入力されている時は背景色を白に設定するので、以下のようにコンバーターを書きました。
今回はConvertBackが使わないのでthrow new NotImplementedException();と記述しています（実装が無いのでスローしています）。

~~~c#:cs
public class IsTextEnteredConverter : IValueConverter
{
	public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
	{
		return string.IsNullOrWhiteSpace((string)value) ? "pink" : "White";//?ここが値を変換している部分
	}

	public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
	{
		throw new NotImplementedException();
	}
}
~~~

今回使ったconverterのパラメータはvalueだけなので、他のパラメータは調べてないんですが、valueはbindingの記述のElementNameとPathで特定される対象の値になるようです。つまり今回はこのvalueはTextbox1.Textの値になります（ただしobjectとして取得しているのでstringに型変換が必要です）。
Textbox1.Textの値をstring.IsNullOrWhiteSpace()で真偽判定して、真（空である）場合はpink、偽（空ではない）場合にwhiteのstringを出力します。てゆうかbackgroundに指定する値stringで良かったんやねSystem.Windows.Media.Brush 型で指定しなきゃならんと思ってたのでちょっと引っかかりました。

※作成したconverterを引用できるようにするためにApplication.Resourcesに以下を追加してます
~~~html:app.xaml
<Application.Resources>
    <ResourceDictionary>
        <local:IsSqidConverter x:Key="IsTextEntered"/>
    </ResourceDictionary>
</Application.Resources>

★体形的な学習など一切なしで付け焼刃だけでここまでやってきたので上記の短い記述にも間違いが多数含まれている可能性があります。
SourceTree（ソースツリー）| revert（リバート）| コミットを打ち消し

## revert（リバート）とは
Git：リポジトリ内で行われたコミットを打ち消す処理
英語：立ち戻る、戻る、復帰する
## SourceTree のやり方
コミット履歴の一覧から打ち消したいコミットを選択して、右クリックから「このコミットを打ち消し」を選択する
## コマンドのやり方
### ※注意：SourceTree では merge コミットの revert は できない
マージコミットの revert で発生するエラー
```
no -m option was given.
▼
-mオプションが指定されていない
```
マージしたコミットの場合は、親が2つあるので、親を指定しないと revert できずエラーが表示されるので、戻したいコミットIDの前に「-m 1」OR「-m 2」を指定してあげる
- 親1（-m 1）：マージされるブランチマージ前コミット
- 親2（-m 2）マージするブランチの先頭コミット

``` 書き方
[コミット1234567を打ち消したい]
× git revert 1234567 ➡ 親の指定がない
● git revert -m 1 1234567 "コミットメッセージ" ➡ 親1の指定
● git revert -m 2 1234567 "コミットメッセージ" ➡ 親2の指定

```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2492954/f6258051-7a55-d9ca-60bc-4d1ad059d19a.png)
※# Please enter the commit message for your changes. Lines starting
※# with '#' will be ignored, and an empty message aborts the commit.
とでたら…コミットメッセージを入力してあげましょう
「i」キー：入力モードに切り替え
変更履歴等の情報（メッセージ）を一番上に入力
「Esc」キー：コマンドモードに切り替え
「:wq」で保存、エディタを終了

### 参考
- [Git - git-revert Documentation](http://git-scm.com/docs/git-revert)
- [【git】mergeコミットのrevertを試してみた。](https://blog.dalt.me/827)
- [Gitのrevertの-m(mainline)オプションについて](https://blog.toshimaru.net/git-revert-mainline/)
- [SourceTreeで「このコミットを打ち消し」をしたらエラーになったときの対処](https://www.proglad.tokyo/2017/08/sourcetree.html)
IPv6でECHO(ping)

# やろうとしたら色々はまったので
ここにそのメモを残す。まあ今時のウェブ系エンジニアには役に立たないと思う。
ネットワーク系でC/C++などコンパイル言語のプログラマには役立つかな。
サンプルコードはないのでキーワードから検索してほしい。
# IPv6におけるECHO
ヘッダの構造は struct icmp6_hdr であり、IPv4のstruct icmphdr と同じである。
違うのはチェックサムの計算方法だ。
IPv4にはIPヘッダにチェックサムがあり、icmphdrのチェックサムだけ計算すれば良かった。
IPv6では諸事情からチェックサムは上位プロトコルで計算することになった。
そこでIPヘッダのIPv6アドレスと付帯データを含めて計算する疑似ヘッダが考案された。
疑似ヘッダについては RFC8200 の 8.1節を参照してほしい。
# ここでさらに問題が
チェックサム用の疑似ヘッダを用意して必要な値を格納しなければ計算できない。
チェックサムには自身と対象のIPv6アドレスを(struct in6_addr形式で)格納する。
つまり自身のIPv6アドレスを取得する必要に迫られる。
このAPIは getifaddr() 関数で、検索すればサンプルが出てくる。
相手のIPアドレスは getaddrinfo() でソケット構造体が取得できるのでそこから設定する。
チェックサムはicmp6_hdrを含めて計算するので、疑似ヘッダの構造体に含める。
疑似ヘッダのデータサイズに設定するのは **icmp6_hdrのサイズ**である点に注意。
データサイズは32bitなので **Network Byte Order(BigEndian)** で設定する。
同様に上位プロトコル番号も ICMPv6の58(10進)をNetwork Byte Orderで設定する。
最後に疑似ヘッダと連結して定義したicmp6_hdrにICMP6_ECHO_REQUESTをセットする。
チェックサムを0で初期化して、やっとチェックサム計算の準備が整った。
# チェックサムの計算方法
についてはRFC792を参照してほしい。１の補数和の１の補数をとったもの、だそうだ。
な、何を言ってるのかわからねーと思うが、俺も何が何だかわからなかった。
理屈は抜きで結論だけ書くと

1. 対象のバッファをunsigned shortで取り出し、unsigned int(32bit)以上の変数に加算。
2. もし1バイト余ったら末尾に0x00を加えて加算
3. sum値の下16bitに（もしあれば）上位16bitを加算
4. 3を桁上がりがなくなるまで繰り返す
※unsigned shortのEndianは意識しなくて良い（らしい）

これだけ。詳しい理屈はTCP/IP関係のネット検索や書籍参照で理解してほしい。
疑似ヘッダとicmp6_hdrを含めた領域のサムを計算すれば答えが得られる。
icmp6_hdrにチェックサムをセットしたらsend系APIで **icmp6_hdrを** 送信する。

応答もicmp6_hdrで返る。送信で使った疑似ヘッダに代入してチェックサムを計算する。
※当然だがこの時はチェックサムを0初期化しない。
計算したチェックサムが0になれば正常。このへんの理屈はRFC700らしい。
応答がICMP6_ECHO_REPLYであることもチェックする。

以上
【javascript】【jquery】clone()メソッドの使い方

# コード
```html 
<div class="original">
    <h4>コメントを入力してください</h4>
    <div class="clones">
      <textarea></textarea>
    </div>
</div>
<button>コメントを送信</button>
<div class="comment"></div>
```

```javascript
$("button").click(function(){
  $('.original .clones').clone().appendTo('.comment');
  $('.original .clones textarea').val("");     
});
```

# ボタン押下前
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954863/34c577b2-2480-923d-fc04-4d90b6e0c60d.png)



# ボタン押下後

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954863/e7bcce35-6f96-ad31-26eb-c638e7386b66.png)
Windowsでgit-secretsを導入するとVisual Studioでコミットできなくなる問題の対応

# 問題点

Windows環境でgit-secretsを導入すると、Git Bash上では問題なく動作しますが、Visual Studio上でコミットすると、`/usr/bin/env: 'bash': No such file or directory` というエラーが表示され、コミットできなくなります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2708575/7ee20767-cf3f-9049-8c1b-5dc48fa5b27e.png)

# 原因

git-secretsで利用しているスクリプトのシバンに`#!/usr/bin/env bash`が指定されているのが原因でした。

# 対策

git-secretsで利用しているスクリプトのシバンを`#!/usr/bin/env bash`から`#!/bin/sh`に変更します。具体的には以下のファイルの先頭行を変更しました。

- %USERPROFILE%\\.git-secrets
- （ローカルリポジトリのルート）\\.git\hooks\commit-msg
- （ローカルリポジトリのルート）\\.git\hooks\pre-commit
- （ローカルリポジトリのルート）\\.git\hooks\prepare-commit-msg

# 参考

https://qiita.com/SAITO_Keita/items/e0d72c01e90d8257c885

https://github.com/awslabs/git-secrets/issues/113
パーティションとは何か

# はじめに
ディスクやストレージ関連の用語や操作についてあやふやだったことを整理しました。本記事ではパーティションの概要とコマンドについてまとめていきます。別記事でファイルシステムやボリュームについても今後まとめていく予定です。

# パーティションとはなにか
パーティションとはなにか、ざっくり言うと`ディスクの区切り`のことです。
１つのディスクを使用する際に区切らずに使用することも可能ですが、その場合どこか１か所に問題が発生したときにその影響がディスク全体に及んでしまいます。それを防ぐために区切っていくのですが、その区切りのことを`パーティション`と呼びます。

### パーティションのメリット
パーティションを分けたときのメリットは主に下の3点です。

- 障害発生時、被害を１つのパーティション内に限定することができる
- システムに合わせた柔軟な利用が可能となる
- 容量圧迫による他パーティション内のファイルへの影響を避けられる

このようなメリットから、パーティションを1つ以上分けてディスクを使用するのが好ましいとされています。

## パーティションの仕組み
パーティションの分け方には形式があり、MBR（マスターブートレコード）形式とGPT（GUIDパーティションテーブル）形式のどちらかが採用されています。

### MBR形式
MBR形式をベースにパーティションの仕組みについて説明していきます。

下の図のように１つのディスクをパーティションに分けることができます。
これを`基本パーティション`と呼び、MBRでは最大４個まで分けることが可能です。
<img width="200" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2724001/7d240f13-6525-fe96-4bba-87676b89b099.png">
しかし、４個だけしか分けられないのはかなり不便です。そこで、ここからさらにパーティションを増やすことも可能です。その時の流れとして、まずどれか１つの基本パーティションを`拡張パーティション`とします。この時、拡張パーティションとして扱える基本パーティションはどれか１個だけです。
<img width="200" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2724001/c9a8570c-263f-eaf1-8b0f-5350aa405c3e.png">
上で作成した拡張パーティションをさらにパーティションに分けることができ、これを`論理パーティション`といいます。論理パーティションの数には制限はありません。こうしてパーティションを４つ以上に分けて使用することが可能となります。
<img width="200" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2724001/99549552-8866-c8ff-ebec-506be63c58af.png">
ちなみに`/dev/sda1`のように末尾についている数字が`パーティション番号`です。

### GPT形式
MBRとGPTで違う点は主に下記の３点です。
- MBRはBIOSベースのシステムで、GPTはUEFIベースのシステム
- MERで扱えるハードディスク容量は2Tまで、GPTは制限なし
- MBRは基本パーティション4個まで作成可能、GPTは128個まで作成可能

MERであった制限がGPTではなくなっているのが特徴です。（パーティション数128個はほぼ制限なしと言える数です。）

## コマンド操作
パーティションはコマンド操作で作成していきます。
MBRの場合`fdisk`コマンド、GPTの場合`gdisk`コマンドを使用し、サブコマンドはどちらも共通です。MBRにもGPTにも対応したコマンドに`parted`コマンドもあります。
いずれのコマンドも対話式でパーティションを作成していくことになります。
`lsblk`コマンドを使用すれば、ディスクの状態を確認することができます。

# まとめ
今回はなんとなく使用していたパーティションについてまとめてみました。
パーティションを分けてディスクが使用できるまでに、ファイルシステムを入れたり、マウントしたりする必要があります。次回はファイルシステムとマウントについてまとめていこうと思います。

# 参考サイト
[「プライマリパーティション」と「拡張パーティション」の違い](https://pctrouble.net/storage/partition_difference.html)
[Linux基礎(パーティションとファイルシステムの作成)](https://qiita.com/kakkie/items/8f960f2dc5eb6e591d9d)
[Linuxのパーティションとファイルシステムとマウント](https://ameblo.jp/bakery-diary/entry-12639340661.html)
Codility Lesson4 MissingInteger

    def solution(A):
        len_A = len(A)
        A = sorted(A)
        min_A = 1   #無駄な負の値は考えないようにする工夫
        i = 0 
        while i < len_A:
            if A[i] == min_A:
            　　　　min_A +=1
        　　　　i +=1
    　　　　　　　　return min_A
OpenGL Cubemapに関するメモ

普通に考えると当たり前だが、CubeMapの各面の生成(glTexImage2D)の際、width,heightは同じ(正方形)でないと0x501エラーとなる
https://www.khronos.org/opengl/wiki/Cubemap_Texture
https://qiita.com/_ydah/items/da56763e94ba58af3d91
複数のテーブルを縦方向に追加する(SPSS Modeler データ加工逆引き6-4)

# 複数のテーブルを縦方向に追加（レコード追加）

![スクリーンショット 2022-07-04 11.48.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/f596eb2a-8f4a-4dbb-5e59-28acee079e6e.png)


## 1.想定される利用目的

・最新の1月分の購買明細データの追加
・IoTデータから異常前後のデータと通常時（サンプリング）データの結合

## 2.サンプルストリームのダウンロード

https://github.com/yoichiro0903n/blue/blob/main/append.str?raw=true

## 3.サンプルストリームの説明
![スクリーンショット 2022-07-04 11.50.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/8d57f651-d443-916e-7318-7467604f63b9.png)

a.入力するデータひとつ目は以下の通りです。
![スクリーンショット 2022-07-04 11.51.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/8a43432a-2cb3-aa64-65d7-d14b571a5f1b.png)

b.入力するデータ２つ目は以下の通りです。
![スクリーンショット 2022-07-04 11.52.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/19381f5d-89d8-d240-a752-48266d15b029.png)

c.入力するデータ3つ目は以下の通りです。
![スクリーンショット 2022-07-04 11.52.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/14ae8009-4cea-d992-d64e-f7bd1d875348.png)

d.[レコード追加]ノードを編集します。フィールド（列）の順序ではなく名称で一致させます（赤枠）。最初のテーブルに接続を基準に出力が定義され（緑枠）C0のようにあらたなフィールドが追加されると最後尾に位置するようになります。テーブルの由来を識別するために青枠にチェックを入れます。
![スクリーンショット 2022-07-04 11.53.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/f0a2b05b-496e-86a9-6856-88e6588dd9df.png)

[テーブル]を実行します。
![スクリーンショット 2022-07-04 12.44.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/bdf66530-679c-20cf-2acd-fa33ac9800cd.png)

#### 注意事項

名称やデータ型が不一致の場合は以下のメッセージが出ます。
![スクリーンショット 2022-07-04 11.56.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/32b1d7e8-70d2-c363-2743-c31676b327cf.png)

例えば最初のテーブルのC1が文字列であった場合には以下のようにアイコンや文字色で不一致を知らせます。[置換]ノードによる型の変更を事前に行います。
![スクリーンショット 2022-07-04 11.55.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/df2aa072-ce2e-6c33-a9d1-47476e2d4a30.png)

## 4.参考情報

#### [レコード追加]の解説記事

https://qiita.com/416nishimaki/items/6e20d46ca1b6574804f0

#### SPSS Modeler ノードリファレンス目次

https://qiita.com/416nishimaki/private/503037195081d3323eee

#### SPSS Modeler 逆引きストリーム集（データ加工）

https://qiita.com/416nishimaki/private/4bf813e6cba84b2a1008
Advanced Custom Fieldsのグループでupdate_fieldしたい

# はじめに
WordPressのAdvanced Custom Fieldsに、グループというフィールドも作成できて、こちらを使うと管理画面が見やすくなるので、気に入ってました。

そして`wp_insert_post`を使って、投稿を作成し、その投稿に対してカスタムフィールドを設定するときは、ACFの`update_field`という関数を使えばできるのですが、
...はて、グループでやるときはどうしたらいいんだ？とつまずいたので、メモしておきます。

# 参考サイト
[ACF公式](https://www.advancedcustomfields.com/resources/update_field/)

[解決に至ったサイト](https://support.advancedcustomfields.com/forums/topic/updating-fields-in-groups-in-acfsave_post/)
↑このサイトの「The documentation for this seems to be incomplete. By trail and error I used the following solution:」このコメントの書いてあるところです。

# とりあえず、文章で書く
１）管理画面からグループのフィールドキーを確認する
２）グループの内容は名前をキーにした連想配列にする
３）`update_field`する

# 画面つきで説明
１）ACF管理画面にて、グループのフィールドキーを表示できるようにする
![スクリーンショット_2022-07-04_13_16_07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392006/8f3c46cf-a04d-7195-178f-5f9f51948ef4.png)

２）グループの親のフィールドキーを確認する
![スクリーンショット_2022-07-04_13_23_41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392006/219ebf61-33e0-3fe5-5894-9526a9ed09f0.png)

グループの子どもはこんな感じ
![スクリーンショット_2022-07-04_13_23_21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392006/8ed5a224-52c4-4243-97eb-ca71c6fcc807.png)



## サンプルコード
```php
<?php
//保存したいデータ
$presentData = [
  'present_company' => $_POST['present_company'],
  'present_address' => $_POST['present_address'],
  'present_tel' => $_POST['present_tel'],
  'delivery_date' => $_POST['delivery_date'],
];

update_field( 'field_グループの親のやつ', '保存するグループの配列', '投稿ID' );

```

おしまい。