omega blog

tech memo

BEMの命名規則などメモ

最初はnameをlinkの外で定義していたが、BEMの命名規則を利用して親子や兄弟関係を明確に示す

  • .link:hover の中に .link__name のスタイルをネストさせることで、.link がhover状態の際に適用される .link__name のスタイルを明示的に示す

  • &__name の部分で & を使って .link の子要素である .link__name を示し、 .link.link__name の関係を明確にする

no-descending-specificity のルールに従う

  • &__name.link__name の前に置くことで、スタイルの上書きや意図しないスタイルの適用を防ぐ

変数を使う

  • スタイルの変更時に書き換える箇所が減り、意図しないスタイルの適用を防ぐ
<template>
  <div :class="$style.link">
    <img :src="imageUrl" :class="$style.image" />
    <p :class="$style.link__name">omegaさん</p>
  </div>
</template>

<script> ... </script>

<style lang="scss" module>
.link {
  ...

  &__name {
    color: blue;
  }

  &:hover {
    text-decoration: none;

    .link__name {
      color: red;
    }
  }
}

.image {
  $size: 30px;

  width: $size;
  height: $size;
  border-radius: $size;
}
</style>

握りつぶしについてまとめ

エラーを返さない(握りつぶす)実装が問題な理由:

  1. エラーハンドリングの透明性が失われる エラーが発生時に呼び出し元にエラーを返さないと、呼び出し元はそのエラーが発生したことに気づくことができない。 その結果、プログラムは予期しない状態になり、デバッグが困難になる。

  2. 障害の伝播が阻まれる エラーを上位の関数に伝播させることで、より適切なエラーハンドリングや復旧処理を実行できるようになる。 握りつぶしてしまうと上位の関数がエラーを感知できず、問題に対処する機会が失われる。

  3. デバッグが困難になる エラーを握りつぶすと問題が発生した箇所を特定するのが難しくなる。 エラーが発生した場所や原因を特定しやすくするためには、エラーを適切に伝播させ、エラーメッセージやstacktraceを利用することが重要。

  4. 可読性や保守性が低下する エラーを返さないことでコードの可読性や保守性が低下する。 他の開発者がコードを理解し、修正や拡張を行いにくくなる。

以上の理由から、エラーを適切に返すことが重要。 基本的には、関数がエラーを返すべき状況でエラーを返し、呼び出し元で適切なエラーハンドリングを行うことが望ましい。親関数にエラーを返して、そのエラーに対処することで、プログラムの堅牢性や保守性が向上する。

macOS 13.2.1でGVMを使ったGoの環境構築手順

1. Xcode Command Line Toolsのインストール

Xcode Command Line Toolsが必要なのでインストールされていない場合は以下のコマンドを叩いてインストールする。

xcode-select --install

2. GVMのインストール

ターミナルで以下を実行する。

bash < <(curl -s -S -L https://raw.githubusercontent.com/moovweb/gvm/master/binscripts/gvm-installer)

インストール完了後、~/.zshrc に以下の行を追記。

[[ -s "$HOME/.gvm/scripts/gvm" ]] && source "$HOME/.gvm/scripts/gvm"

設定ファイルを更新したら設定を読み込ませる。

source ~/.zshrc

3. Goのインストール

インストール可能なGoのバージョンを表示する

gvm listall

使いたいバージョンのインストール

gvm install go1.19

4. Goのバージョンを選択

インストールしたGoのバージョンを選択する。デフォルトにしたい場合は --default オプションをつける。

gvm use go1.19 --default

5. バージョン確認

これで意図した通りのGoのバージョンが入っていたら成功。

go version

golangでgoogleのindexing APIを使う

goでgoogleのindexing api を使う機会があったのでその覚書き。

基本的にこの手順に沿ってやればOK

Indexing API を使用する前提条件

このページの手順に沿って準備していく。

developers.google.com

いくつか補足:

  • サイトの所有権を確認するときはGoogleTagとかでもできる。便利だしDNS確認とかするより遥かに楽。

  • ウェブマスターセントラルのプロパティはオーナーじゃないと追加したり確認の詳細が見れないしいじれない

  • このツールはまもなく利用できなくなります。確認トークンは Search Console で直接管理してください。 と警告がでるけど、2023年4月現在において、Search Consoleで「サイト所有者を追加」してもAPIが使えない。ウェブマスターセントラルのプロパティで、「確認の詳細」を押す→「確認済みサイト所有者」にサービス アカウント IDを追加しないといけない。

    • 登録するサービスアカウントはcredential.jsonをダウンロードしたアカウント

APIを使えるようにする

  • Google Cloud Platform で任意のプロジェクトを選択後、indexingと検索して「indexing API」を選択し、APIを有効にする。

大体の実装

import (
    "fmt"

    indexing "google.golang.org/api/indexing/v3"
    "google.golang.org/api/option"
)


:

func urlIndexingUpdate (ctx context.Context) error {

    indexingService, err := indexing.NewService(context.Background(), option.WithCredentialsJSON(PATH_TO_JSON_ENV)))
    if err != nil {
      return nil, fmt.Errorf("failed to create indexing service: %w", err)
   }

    // update indexing
    targetUrl:= "https://hogehoge.jp/xxxxxx"
    _, err = indexingService.UrlNotifications.Publish(&indexing.UrlNotification{
        Url:  targetUrl,
        Type:  "URL_UPDATED",     // or "URL_DELETED"
    }).Do()

    if err != nil {
        return fmt.Errorf("failed to indexing: %w", err)
    }

    return nil
}