動かざることバグの如し

近づきたいよ 君の理想に

ggpht.comの画像の解像度をカスタマイズする方法

ggpht.comとは

ggpht.comとは何でしょうか?Googleの画像ホスティングサービスです。YouTubeGoogle Photosなどのサービスで使用されています。

ggpht.comのURLには、画像のサイズや形式を指定するパラメータが含まれています。 しかし、ggpht.comのパラメータ仕様は公開されていないので、どのようなパラメータがあるのか、どのように使うのかは分かりにくいです。

そこで、この記事では、ggpht.comのパラメータの例をいくつか紹介し、画像を任意のサイズや形式や切り抜き方に変換する方法を解説します。

ggpht.comのパラメータの例

ggpht.comのURLには、次のような形式でパラメータが追加されます。

https://lh3.ggpht.com/ci/AJFM8rxdPs09sGdri3V-fDGijpXf3rmSNXcCnaw1RsW3u1Ss_p6XfFR5TFc65m4jmoo0_e-QvwXQDv6V=パラメータ

パラメータは、=で区切って複数指定することができます。たとえば、次のようなURLがあります。

https://lh3.ggpht.com/ci/AJFM8rxdPs09sGdri3V-fDGijpXf3rmSNXcCnaw1RsW3u1Ss_p6XfFR5TFc65m4jmoo0_e-QvwXQDv6V

このURLにs1600-cを追加すると、次のようになります。

https://lh3.ggpht.com/ci/AJFM8rxdPs09sGdri3V-fDGijpXf3rmSNXcCnaw1RsW3u1Ss_p6XfFR5TFc65m4jmoo0_e-QvwXQDv6V=s1600-c

この場合、s1600は画像の幅を1600ピクセルにリサイズすることを意味し、cは画像を中央で切り抜くことを意味します。

以下に、いくつかのパラメータの例を示します。

  • s1200-rw: 画像の幅を1200ピクセルにリサイズし、形式をWebPに変換する
  • s1600: 画像の幅を1600ピクセルにリサイズする
  • s0-d: 画像の元のサイズと形式を保持する
  • h400: 画像の高さを400ピクセルにリサイズする
  • w400: 画像の幅を400ピクセルにリサイズする
  • c: 画像を中央で切り抜く

ggpht.comの画像をカスタマイズする方法

ggpht.comの画像をカスタマイズする方法は簡単です。URLにパラメータを追加するだけです。たとえば、次のようなURLがあります。

https://lh3.ggpht.com/ci/AJFM8rxdPs09sGdri3V-fDGijpXf3rmSNXcCnaw1RsW3u1Ss_p6XfFR5TFc65m4jmoo0_e-QvwXQDv6V

このURLから、次のような画像が表示されます。

元の画像

この画像を幅800ピクセル、高さ600ピクセルにリサイズし、形式をJPEGに変換したい場合は、次のようなURLにします。

https://lh3.ggpht.com/ci/AJFM8rxdPs09sGdri3V-fDGijpXf3rmSNXcCnaw1RsW3u1Ss_p6XfFR5TFc65m4jmoo0_e-QvwXQDv6V=w800-h600-p

この場合、w800は画像の幅を800ピクセルにリサイズすることを意味し、h600は画像の高さを600ピクセルにリサイズすることを意味します。pは形式をJPEGに変換することを意味します。

このURLから、次のような画像が表示されます。

カスタマイズした画像

このようにして、ggpht.comの画像を任意のサイズや形式や切り抜き方に変換することができます。

まとめ

ggpht.comはGoogleの画像ホスティングサービスです。URLにパラメータを追加することで、画像のサイズや形式や切り抜き方をカスタマイズすることができます。パラメータの仕様は公開されていないので、試行錯誤が必要ですが、いろいろな画像を作成することができます。

Rubyで文字列がBase64として有効かどうかを確認する

艦橋

コード

Rubyの標準ライブラリにはBase64モジュールがありますが、文字列がBase64として有効かどうかを確認するメソッドはない。

ただ、Base64.decode64とBase64.strict_encode64を使ってチェックする方法がある。サンプルコードは以下

require 'base64'

def base64? (value)
  value.is_a? (String) && Base64.strict_encode64 (Base64.decode64 (value)) == value
end

ウェブページ上のテキストを簡単にコピーできるJavaScript

コード

ウェブページ上のテキストを簡単にコピーできるJavaScript

document.addEventListener('DOMContentLoaded', () => {
  const copyButtons = document.querySelectorAll('button[data-url]');
  copyButtons.forEach(button => {
    button.addEventListener('click', async () => {
      const url = button.dataset.url;
      try {
        const tmp = button.textContent;
        await navigator.clipboard.writeText(url);
        button.textContent = 'コピーしました';
        setTimeout(() => {
          button.textContent = tmp;
        }, 1000);
      } catch (error) {
        console.error(error);
      }
    });
  });
});

解説

質問のjsコードは、HTMLの中にあるdata-url属性を持つbutton要素を取得し、それぞれにクリックイベントのリスナーを登録するコードです。

クリックイベントが発生したら、button要素のdata-url属性の値を取得し、navigator.clipboard.writeText()メソッドを使ってクリップボードにコピーします。

コピーに成功したら、button要素のテキストを「コピーしました」と変更し、1秒後に元に戻します。

コピーに失敗したら、console.error()メソッドでエラーを表示します。

RailsでカラムAあるならカラムBとカラムCは入力必須とするバリデーション

環境

  • Rails7

やりたいこと

Railsのモデルバリエーションで、カラムAがtrueのときにカラムBとカラムCは入力必須とするバリデーションを実装したい

コード

ifオプションやwith_optionsメソッドを使う

class Model < ApplicationRecord
  # カラムAがtrueの場合のみカラムBとカラムCを必須にする
  with_options if: :column_a do
    validates :column_b, presence: true
    validates :column_c, presence: true
  end
end

参考リンク

Railsでメール送信を1行で即時送信したい

環境

やりたいこと

RailsのAction Mailerでメール送信を1行でサクッと送信したい

コード

ActionMailer::Base.mail(from: "sender@example.com", to: "recipient@example.com", subject: "Hello", body: "This is a test email").deliver_now

このコードは、sender@example.com から recipient@example.com に Hello という件名と This is a test email という本文のメールを即時送信します。

もちろん、このコードはメーラークラスやビューを使わずにメールを送信する場合に便利ですが、一般的にはメーラークラスやビューを作成してメールの内容や設定を管理する方が良いでしょう。