技術ブログ

(技術系中心)基本自分用備忘録なので、あくまで参考程度でお願いします。

psqlコマンドでローカルに入る方法

Dockerのdbコンテナでpsqlコマンド打つ方法

psql -h 127.0.0.1 -p 15432 -U postgres -d hoge_development

コネクションオプション

Connection options:
  -h, --host=HOSTNAME      database server host or socket directory (default: "local socket")
  -p, --port=PORT          database server port (default: "5432")
  -U, --username=USERNAME  database user name 
  -w, --no-password        never prompt for password
  -W, --password           force password prompt (should happen automatically)
 -h 127.0.0.1
DATABASE_HOSTを127.0.0.1と明示

-p 15432
Port番号を15432と明示

-U postgres
usernameをpostgresと明示

-d hoge_development
database nameをhoge_developmentと明示

どういう時にコネクションオプションが必要? -> アプリケーションで環境変数とかを利用している場合。

例)Railsのdatabase.ymlでこのように情報を持っている場合はコネクションオプションが必要

development:
  <<: *default
  database: <%= ENV["DATABASE_NAME"] %>

  # The specified database role being used to connect to postgres.
  # To create additional roles in postgres see `$ createuser --help`.
  # When left blank, postgres will use the default role. This is
  # the same name as the operating system user that initialized the database.
  username: <%= ENV["DATABASE_USERNAME"] %>

  # The password associated with the postgres role (username).
  password: <%= ENV["DATABASE_PASSWORD"] %>

  # Connect on a TCP socket. Omitted by default since the client uses a
  # domain socket that doesn't need configuration. Windows does not have
  # domain sockets, so uncomment these lines.
  host: <%= ENV["DATABASE_HOST"] %>

  # The TCP port the server listens on. Defaults to 5432.
  # If your server runs on a different port number, change accordingly.
  port: <%= ENV["DATABASE_PORT"] %>`

psqlオプション一覧

psql is the PostgreSQL interactive terminal.

Usage:
  psql [OPTION]... [DBNAME [USERNAME]]

General options:
  -c, --command=COMMAND    run only single command (SQL or internal) and exit
  -d, --dbname=DBNAME      database name to connect to (default: "inoue_hiroki")
  -f, --file=FILENAME      execute commands from file, then exit
  -l, --list               list available databases, then exit
  -v, --set=, --variable=NAME=VALUE
                           set psql variable NAME to VALUE
                           (e.g., -v ON_ERROR_STOP=1)
  -V, --version            output version information, then exit
  -X, --no-psqlrc          do not read startup file (~/.psqlrc)
  -1 ("one"), --single-transaction
                           execute as a single transaction (if non-interactive)
  -?, --help[=options]     show this help, then exit
      --help=commands      list backslash commands, then exit
      --help=variables     list special variables, then exit

Input and output options:
  -a, --echo-all           echo all input from script
  -b, --echo-errors        echo failed commands
  -e, --echo-queries       echo commands sent to server
  -E, --echo-hidden        display queries that internal commands generate
  -L, --log-file=FILENAME  send session log to file
  -n, --no-readline        disable enhanced command line editing (readline)
  -o, --output=FILENAME    send query results to file (or |pipe)
  -q, --quiet              run quietly (no messages, only query output)
  -s, --single-step        single-step mode (confirm each query)
  -S, --single-line        single-line mode (end of line terminates SQL command)

Output format options:
  -A, --no-align           unaligned table output mode
      --csv                CSV (Comma-Separated Values) table output mode
  -F, --field-separator=STRING
                           field separator for unaligned output (default: "|")
  -H, --html               HTML table output mode
  -P, --pset=VAR[=ARG]     set printing option VAR to ARG (see \pset command)
  -R, --record-separator=STRING
                           record separator for unaligned output (default: newline)
  -t, --tuples-only        print rows only
  -T, --table-attr=TEXT    set HTML table tag attributes (e.g., width, border)
  -x, --expanded           turn on expanded table output
  -z, --field-separator-zero
                           set field separator for unaligned output to zero byte
  -0, --record-separator-zero
                           set record separator for unaligned output to zero byte

Connection options:
  -h, --host=HOSTNAME      database server host or socket directory (default: "local socket")
  -p, --port=PORT          database server port (default: "5432")
  -U, --username=USERNAME  database user name (default: "inoue_hiroki")
  -w, --no-password        never prompt for password
  -W, --password           force password prompt (should happen automatically)

For more information, type "\?" (for internal commands) or "\help" (for SQL
commands) from within psql, or consult the psql section in the PostgreSQL
documentation.

※ 事前にpsqlはインストールしておく。psql --versionと叩いて、versionが表示されたらインストール済み

>  psql --version
psql (PostgreSQL) 12.3

データフォーマットの指定方法

データフォーマットの指定方法

クライアント側で欲しいデーターフォーマットをどのようにサーバーに伝えれば良いのでしょうか?

1. クエリパラメータを使う方法
2. 拡張子を使う方法 
3. リクエストヘッダでメディアタイプを指定する方法

以上の3パターンが一般的に利用されている方法です。

1. クエリパラメータを使う方法

https://api.example.com/v1/users?format=xml

クエリパラメーターにフォーマット指定することが出来ます。

?format=xml

この部分ですね!

2. 拡張子を使う方法

https://api.example.com/v1/users.json

これはあんまり見ない方法なんですが、ファイルに拡張子をつけるのと同じようにURLの最後に.jsonや.xmlをつけてデータ形式を指定することも可能です。

3. リクエストヘッダでメディアタイプを指定する方法

GET /v1/users 
Host: api.example.com 
Accept: application/json

HTTPリクエストヘッダでメディアタイプを指定することも可能です。

ちなみに複数指定されている場合は先頭に指定されているものから順に見て行って、最初にサポートしているデータ形式を返却します。

この3番が一番よく利用されるパターンのイメージ

参考

Web API: The Good Parts

ログインとOAuth2.0

ログインとOAuth2.0

OAuth は基本的には広く第三者に公開される API において認可(authorization)を行うために 用いられます。

よくWebサービスにログインする時にtwitterでログインするなどのボタンがあると思いますが、その裏側の構造はこのOAuth2.0が利用されているケースが多いです。

概要図

f:id:lhiroki1205:20201103221239p:plain

- facebookから渡されるトークンはアクセストークン(ネットワークで使用されるユーザーのセキュリティ識別情報)
- リソースを保持するサービスはfacebook, twitter, googleなどがよく利用されます

■ アクセストークンが成功した時のレスポンスデータサンプル(JSON)

HTTP/1.1 200 OK 
Content-Type: application/json 
Cache-Control: no-store
Pragma: no-cache 
  {
     "access_token": "b77yz37w7kzy8v5fuga6zz93", 
     "token_type": "bearer", 
     "expires_in": 2629743, 
     "refresh_token":"tGzv3JOkF0XG5Qx2TlKWIA", 
  }

OAuth2.0を利用するメリット

利用する最大のメリットは標準化されているという点です。

標準化されているので、サーバーとクライアント共に多くの言語でライブラリが提供されています。

実装が双方にとって楽なのがメリットです。

参考

一番分かりやすい OAuth の説明 - Qiita

Web API: The Good Parts - オライリー・ジャパン

Kubernetesとは....

kubernetes

KubernetsとはGoogleが開発した、コンテナ運用の自動化をする為のコンテナオーケストレーションシステム。

1. Dockerホストの管理
2.サーバーリソースの空き具合を考慮したコンテナ配置
3.スケーリング
4.複数のコンテナ郡へのアクセスを取りまとめるロードバランサー
5.死活監視

この辺をkubernetesなら自動化できます。

あるアプリケーションをKubernetes上にデプロイする際、Kubernetesに対して「アプリケーションやそれを構成するコンテナ群はこういう状態であるべき」というような理想状態をYAML(YAMLAin'tMarkupLanguage)やJSON(JavaScriptObjectNotation)形式の「マニフェスト」と呼ばれる設定ファイルの形で宣言すると、それを実現・維持するための具体的な作業をKubernetesがよしなに行ってくれます。

kubernetes概念

Kubernetesで実行されるアプリケーションは様々なリソースと協調して動作することで成立しています。

リソースとはアプリケーションのデプロイ構成するための部品のようなものです。

超ざっくり概要図

Control Planesとはk8sの心臓部分で動作を担います。別名AdminMasterとも呼ばれます。

kube-apiserver: k8sAPIを公開する
etcd: k8sクラスタ情報の保存場所、key/valueストア
kube-scheduler: Pod(コンテナ)をワーカーノードに割り当てる
kube-controller-manager: k8sの操作全般を担当(Podを起動したり、障害を検知したり)
cloud-controller-manager: クラウド(AWS/GCP)の機能と連携する

Node: 実際にコンテナが動作する環境。別名ワーカーとも呼ばれます。

kubelet: 各ノードで実行されるエージェントマスターノードとやりとりして指示に従う
kube-proxy: NodeのNWルールを追加、削除、変更する
コンテナランタイム: コンテナを実行するためのソフトウェア(Dockerとか)

KubernetesクラスとNode

KubernetesクラスタKubernetesの様々なリソースを管理する集合体のことを指します。クラスタが持つリソースで最も大きな概念がNode(ノード)と言います。

参考:K8S Architecture

Pod

Pod(ポッド)はコンテナの集合体の単位で、少なくとも1つのコンテナを持ちます。

Dockerとkubernetes

2017年10月のDockerCon EC2017でDockerとkubernetesの統合が発表されました。

他のコンテナサービスとの比較

Kubernetes以外のコンテナサービスで有名どころでいえば以下のようなサービスがあります。

ECS
Fargate

これらとの違いについては以下の動画がわかりやすかったです。

www.youtube.com

参考

今さら人に聞けないKubernetes入門!AWS環境で動かす25分の高速学習【有名ツールのみ使用】 - YouTube

Amazon.co.jp: イラストでわかるDockerとKubernetes Software Design plus eBook : 徳永 航平: 本

[挫折したエンジニア向け] Kubernetesの仕組みをちゃんと理解する (入門/基本編) - YouTube

K8S Architecture. What is Kubernetes (K8S)? | by Keshiha | Medium

POSTとPUTの違い

POSTとPUTの違い

POSTでもPUTでもリソースを作成できます。

うん、じゃあ何が違うの?

POST

POSTはリソースの追加の時に利用

POSTでリソースを作成する場合、クライアントはリソースのURIを指定できない。

なのでURLはこんな感じになる

POST /questions

PUT

PUTはリソースの更新に利用する

PUTでリソースを作成する場合、リソースのURIはクライアント側が決定する。

なのでURLはこんな感じになる

PUT /questions/{question-id}

追記

PUTメソッドはPOSTと同じくサーバー側の情報を変更するためのメソッドですが,POSTとの違いはそのURIの指定の仕方にあります。 POSTメソッドでは、送信したデータは指定したURIにひもづく。

参考

Webを支える技術 HTTP,URI,HTML,そしてREST

Railsのform_withのあれこれ【殴り描き】

form_withのあれこれ

Rails5.1以降に登場したform_withの利用方法のメモ残す。 Rails5.1以前に利用されていたform_forform_tagは非推奨になったので基本利用しないようにしましょう。

form_withではモデルに関連するもの、関連づかないフォームのどちらでも利用可能になります。 (以前はモデルに関連するものをform_for、関連づかないフォームをform_tagと使い分けていた)

モデルに関連するときの書き方

<%= form_with model: @user do |f| %>
  <%= f.text_field :name %>
  <%= f.submit %>
<% end %>

form_with引数のインスタンス(@user)が何も情報を持っていない場合、createアクションへ、 情報を持っている場合、updateアクションへ自動的に振り分けてくれます。

例えば、newの場合は自動でcreateアクションに振り分けられる。 既に情報を持っているcreateの場合は自動でupdateアクションに振り分けられる。

モデルに関連づかない時の書き方

<%= form_with url: users_path do |f| %>
  <%= f.text_field :name %>
  <%= f.submit %>
<% end %>

モデルに紐づかない場合はurlを明示的に記載する。

form_withの利用方法

form_with(model: nil, scope: nil, url: nil, format: nil, **options)

form_withで利用できるオプション

form_withではたくさんのオプションが利用できます。 以下のRails 5.1〜: ‘form_with’ APIドキュメント完全翻訳に詳細説明が記載されています。 ↓ https://techracho.bpsinc.jp/hachi8833/2017_05_01/39502

form_withの中でvalidationエラーを表示させるにはlocal_trueオプションが必須

form_withの中で以下のようにvalidationエラーを表示させようとしたのですが、何故か画面に表示されないケースがありました。

このコードはslimテンプレート利用してます、erbとslim混合して読みにくくてすいません。

...前略...

= form_with model: @hoge do |f| 
  / createに失敗するとエラー表示
  - if @hoge.errors.any?
    .alert.alert-warning
      ul
      - @hoge.errors.full_messages.each do |message|
        li = message

最初はif @hoge.errors.any?が作動してないのかな?と思ったのですが調べてみるとif分は正常に作動していました。

で、詳しく調べてみた結果オプションでlocal: trueを指定してないのが原因でした。 ですので、以下のような書き方が正解です。

= form_with model: @hoge, local: true do |f| 

何故local_trueオプションが必須?

form_withでは何も指定しない場合デフォルトでremote: trueになるようです。 remote: trueではXMLHTTPRequestオブジェクトリクエストを自動で送信するので、無効化する為にlocal: trueを指定してあげます。

<%= form_with url: posts_path do |form| %>
  <%= form.text_field :title %>
<% end %>

html変換 ↓

<form action="/posts" method="post" data-remote="true"> 
  <input type="text" name="title">
</form>

確かに自動でdata-remote="trueになっていますね。

参考サイト

https://api.rubyonrails.org/v6.0/classes/ActionView/Helpers/FormHelper.html#method-i-form_with

https://qiita.com/k_senbei/items/a361171f653edcd888ad

docker pruneでDocker環境を綺麗にする方法

docker pruneでDocker環境を綺麗にする方法

長期間Dockerを利用し続けると多くのDockerコンテナやイメージがディスクを専有していきます。 そのような場合には各種のpruneコマンドを使って不要なイメージやコンテナを一括削除できます。

docker container prune

docker container prune [options]

docker container ls -aで停止したものも含めてコンテナの一覧が表示されます。

停止したコンテナもディスクに保存するため、終了したコンテナのログを参照したり、dockercontainerrestartでコンテナそのものを再利用したりできます。

こういった特徴は検証などに役立ちますが、実際は停止したコンテナの多くは不要です。

定期的に削除すると良いでしょう。

docker image prune

docker image prune [options]

コンテナと同様にイメージも無駄に蓄積されていきます。

コンテナ同様に定期的に不要なイメージは削除しましょう

docker system prune

docker system prune

利用されていないDockerコンテナやイメージ、ボリューム、ネットワークと行ったDockerリソースを一括で削除するときにはdocker system pruneを利用しましょう。

qiita.com