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が利用されているケースが多いです。
概要図
- 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を利用するメリット
利用する最大のメリットは標準化されているという点です。
標準化されているので、サーバーとクライアント共に多くの言語でライブラリが提供されています。
実装が双方にとって楽なのがメリットです。
参考
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(ノード)と言います。
Pod
Pod(ポッド)はコンテナの集合体の単位で、少なくとも1つのコンテナを持ちます。
Dockerとkubernetes
2017年10月のDockerCon EC2017でDockerとkubernetesの統合が発表されました。
他のコンテナサービスとの比較
Kubernetes以外のコンテナサービスで有名どころでいえば以下のようなサービスがあります。
ECS Fargate
これらとの違いについては以下の動画がわかりやすかったです。
参考
今さら人に聞けない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_for
とform_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
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を利用しましょう。