コード日進月歩

しんくうの技術的な小話、メモ、つれづれ、など

踏み台サーバを経由する場合の ssh conigファイルの書き方

いつもやり方と文法を忘れるのでメモ

やり方

Host {{踏み台のサーバのホスト名 / IPアドレス}}
    User {{SSHで入る際のユーザ名}}
    IdentityFile {{踏み台サーバの鍵}}
    
Host {{踏み台から見た入りたいサーバのホスト名 / IPアドレス}}
    User {{入りたいサーバのユーザ名}}
    IdentityFile {{入りたいサーバの鍵}}
    ProxyCommand ssh -W %h:%p {{踏み台のサーバのホスト名 / IPアドレス}}

humida.example.com から プライベートIP 192.168.255.211 のサーバにログイン

Host humidai.example.com
    User ec2user
    IdentityFile ~/.ssh/fumidai_koukai_kagi
    
Host 192.168.245.211
    User ec2user
    IdentityFile ~/.ssh/main_no_kagi
    ProxyCommand ssh -W %h:%p humidai.example.com

参考リンク

ダミーやサンプル例示でつかうURLはexample.comを使うといい

いつも sampple.com とか test.com とかを間違って使っちゃうので備忘として

出典

The Internet Assigned Numbers Authority (IANA) also currently has the following second level domain names reserved which can be used as examples.
example.com
example.net
example.org
-RFC 2606 - Reserved Top Level DNS Names

適当和訳すると

IANA(Internet Assigned Numbers Authority)には現在、次のセカンドレベルドメイン名が予約されており、これを例として使用できます。 example.com
example.net
example.org

ということでこの3種は例示用につかうことができる。実際にアクセスしてもその旨が書かれている

関連リンク

変数には1度だけ書き込み、オブジェクトはできるだけ生成後に触れる部分を最小限にする。

スコープを狭くしよう、というコラムです。

変数には1度だけ書き込むほうがいい

かのリーダブルコードに以下のような記述がある

本章では「生きている」変数が多いとコードが理解しにくくなることを説明した。でももっと理解し難いのは、変数が絶えず変更され続けることだ。値を追跡する難易度が格段に上がってしまう。 この問題と戦うために、ちょっと変わったものを提案したい。それは、変数は一度だけ書き込むというものだ。
- リーダブルコード 9.3 変数は一度だけ書き込む より

変数というのは可変の数値ではあるが、なるべく変更されるのは少なくあってほしい。理由をあげるとすれば…

  • 変数が書き換わることがあればその書き換わる前後で差分を比較する必要がある
  • 値が変わらなければ、意図違いで使うことは減る。

という部分である。ここらへんは詳しくはリーダブルコードを読んでください。。

この「変数は1度だけ書き込むことが望ましい」ということを踏まえて「オブジェクトはできるだけ不変とする」という話をしたい。

オブジェクトはできるだけ生成後に変わる部分を少なく

たとえば下記のようなクラスがあったとする。

class Human
  attr_accessor :first_name, :last_name, :age

  def output_profile_text
    "Hello! My name is #{first_name} #{last_name}, #{age} old."
  end

end

これをオブジェクト化して使おうとすると以下のようになると思います。

taro = Human.new
taro.first_name = "Taro"
taro.last_name = "Suzuki"
taro.age = "20"
p taro.output_profile_text

このようになった場合に、 taro オブジェクトは生成後に必要な値をセットしないと output_profile_text が正しく書き出せない。

taro = Human.new
taro.first_name = "Taro"
taro.last_name = "Suzuki"
p taro.output_profile_text
#=>"Hello! My name is Taro Suzuki,  old."

また名前のようなものは、一度設定したら変わることはないので、外から変更可能というのも別に必要性がない。

taro = Human.new
taro.first_name = "Taro"
taro.last_name = "Suzuki"

# おそらくこのような書き換えは正常ケースでは不要
taro.last_name = "Sato"

このように

  • 最初から使うことが約束されている
  • 途中から書き換えることが無い

というような情報はインスタンスが作られる時点でセットしてあげるようにしたほうが、変な書き換えを心配しなくていいし、見るべきスコープを狭くすることができる。ここの考え方は最初の変数の話と似た部分となる。

class Human
  # 初期化で絶対必要になる情報をセット,利便性を考えて名前付き引数
  def initialize(first_name:, last_name:, age:)
    @first_name = first_name
    @last_name = last_name
    @age = age
  end

  def output_profile_text
    "Hello! My name is #{@first_name} #{@last_name}, #{@age} old."
  end

end
taro = Human.new(first_name: "Taro", last_name: "Suzuki", age: 20)
p taro.output_profile_text

このようにして書き換えてあげれば途中で書き換える使われ方も減るはずだし、スコープも狭くなるので見通しは遠くなるはずです。

参考リンク

リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック (Theory in practice)

リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック (Theory in practice)

cssのfont-size 100%を最上段のhtmlタグに対してセットするとブラウザの種類や状態によって変わってくれる

あー、そうやって相対値をはじき出すほうほうもあるんだ。というメモ

情報の出元

パーセンテージ指定でフォントサイズを指定しておくと、ブラウザのデフォルトのフォントサイズ(通常は 16px = 12pt)や、ユーザが設定したフォントサイズが正しく反映されて描画されるようになります。 - フォントサイズは 100% と指定する | まくまく HTML/CSS ノート

理にはかなっているはなし。

ドキュメントによると

font-size プロパティは、以下の何れかの方法で指定します。

・絶対的サイズのキーワード又は相対的サイズのキーワードのうちの一つ
・<length> 又は親要素のフォントサイズからの相対的な <percentage>

-font-size - CSS: カスケーディングスタイルシート | MDN

ということで % を指定すると親のサイズからの相対値を取るが、htmlにおける最上段である <html> のタグの場合はどうなるかというのはMDNのリファレンスにはないので調べてみた。

試してみた

<!DOCTYPE html>
<html lang="ja-jp">
<head>
  <meta charset="utf-8">
  <style>
    html {
      font-size: 100%;
    }
    .font_size_12px_fixed {
      font-size: 12px
    }
    .font_size_200_parsent{
      font-size: 200%;
    }
  </style>
</head>
<body>

<main>
  <p>
    標準は100%
  </p>
  <p class="font_size_12px_fixed">
    固定12px
  </p>
  <p class="font_size_200_parsent">
    固定200%
  </p>
</main>

</body>
</html>

こんなhtmlをつくる。

これでブラウザの標準だと以下の感じ

f:id:shinkufencer:20181110205445j:plain

これをChromeのフォントを極大にすると

f:id:shinkufencer:20181110205530p:plain

f:id:shinkufencer:20181110205604j:plain

こんな感じになる 比較すると…

f:id:shinkufencer:20181110205636j:plain

確かに勝手に大きくなった。

参考リンク

OpenAPI3.0やswagger用のymlやjsonをInteliJ系IDEで編集するときはSenyaEditorを入れるとプレビューが楽

OpenAPIとかSwaggerをInteliJで書くにはコレが便利!!みたいに勉強会で見かけたものの具体的なプラグイン名がわからなかったので紹介とメモ

公式HP&入れ方

InteliJ用のプラグインだけど公式HPがある、しかもわかりやすいgif動画付き

senya.io

入れるとToolのところにSwaggerUIが選択できるようになり、よしなにローカルファイルが見れるのですごく楽

f:id:shinkufencer:20181108094028p:plain

なおこのプラグイン入れれば入力補完も効くようになる

f:id:shinkufencer:20181108094104g:plain

関連リンク

  • Posts | senya.io - めっちゃ最近も更新しているのでなんかお布施したくなる気持ち

Time.newは31日が存在しない月に31日を指定しても、勝手に繰り上がる

親切だけど、知らないとビビる感じなのでメモ

環境

$ ruby -v
ruby 2.3.3p222 (2016-11-21 revision 56859) [x86_64-darwin16]

事象

TIme.newで Time.new(2018,6,31) などをしてもエラーにならず勝手に 2018/7/1 相当の情報が返却される

Time.new(2019,1,11)
# => 2019-01-11 00:00:00 +0900
Time.new(2019,6,31)
#=> 2019-07-01 00:00:00 +0900

2月の場合もよしなに判断してくれる

Time.new(2019,2,29)
#=> 2019-03-01 00:00:00 +0900
Time.new(2019,2,30)
#=> 2019-03-02 00:00:00 +0900
Time.new(2019,2,31)
#=> 2019-03-03 00:00:00 +0900

なおDateTimeの場合はエラーになる

DateTime.new(2019,6,31)
#ArgumentError: invalid date

ridgepoleでDBを操作するRSpecをするとコケるときに見直す設定

そんなこともあったねと新しくセットアップしてたらおきたので備忘

環境

rails (5.2.0)

原因

差分を見てmigrationをかけてくれる機構がridgepoleと噛み合わず起こる現象。

rails_spec.rbにデフォルトで以下の記述あるのでコメントアウトしてあげる

ActiveRecord::Migration.maintain_test_schema!

参考