IPv4アドレスを文字列型のbit列に変換する

やりたかったこと

ループバックアドレスだけど、

127.0.0.1

を、

01111111 00000000 00000000 00000001

に変換したかった

コード

#[cfg(test)]
pub mod test {

  #[test]
  fn it_works() {
          match Ipv4Addr::from_str("127.0.0.1") {
              Ok(addr) => {
                let actual = addr
                    .octets()
                    .iter()
                    .map(|u| format!("{:08b}", u))
                    .collect::<Vec<String>>()
                    .join(" ");

                assert_eq!(actual, "01111111 00000000 00000000 00000001")
            }
            Err(_) => panic!(""),
        }
  }

}

psycopg2でPostgreSQLにつなぐサンプル

前提

こんな接続設定のDBがあったとする

項目名
ユーザー名 'dev_root'
パスワード 'secret'
ホスト名 'localhost'
ポート番号 5432
DB名 'postgres'
スキーマ名 'koralle'

psycopg2をインストール

今回はバイナリを直接インストールする

pip install psycopg2-binary

psycopg2でPostgresSQLに接続

with connect(
    user="dev_root", 
    password="secret", 
    host="localhost", 
    port=5432, 
    database="postgres", 
    options="-c search_path=koralle"
) as conn:
    with conn.cursor() as cursor:
        # usersテーブルにSELECT文を実行するSQLを発行してみる
        cursor.execute("SELECT * FROM koralle.users;")
        
        # cursor.fetchall()は上記SQLの結果を全件返すイテレータになる
        for row in cursor.fetchall():
            print(row)

プラグインマネージャをpacker.nvimからlazy.nvimへ移行する、ついでにちゃんと遅延読み込みする

プラグインマネージャ、今まではpacker.nvimを使っていたが最近lazy.nvimがいいらしいので移行する。

github.com

ちょっといじって見た感じ、packer.nvimよりも使い勝手が良さそう。
個人的にはlazy-lock.jsonでプラグインのバージョンの追跡ができるのが好みかも。

とりあえずインストールするべ

インストールする前にpacker.nvim関連のコードを消すなりコメントアウトするなりしておきましょう

init.luaにこれ貼って

local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim"
if not vim.loop.fs_stat(lazypath) then
  vim.fn.system({
    "git",
    "clone",
    "--filter=blob:none",
    "--single-branch",
    "https://github.com/folke/lazy.nvim.git",
    lazypath,
  })
end
vim.opt.runtimepath:prepend(lazypath)

setupする

require("lazy").setup({})

インストールはこれだけ。

本格的にpacker.nvimから移行するぞ

試しに一つプラグインをlazy.nvim経由でインストールして遅延読み込みまでしてみる。
何がいいかなーって考えたときにパッと思い浮かんだのが普段使っているファイラプラグインのnvim-tree.lua。

github.com

これにしよう。

require("lazy").setup({
  { 
    "kyazdani42/nvim-web-devicons", 
    lazy = true  -- 起動時には読み込みさせない 
  },
  "kyazdani42/nvim-tree.lua", 
  dependencies = {
    -- nvim-tree.luaをロードするときに
    -- nvim-web-deviconsもロードする
    "kyazdani42/nvim-web-devicons" 
  },
  cmd = {
    -- これらのコマンドのいずれかが実行された時点でロードする
    "NvimTreeOpen",
    "NvimTreeClose",
    "NvimTreeToggle",
    "NvimTreeFocus",
    -- Other plugin commands...
  },
  keys = {
    -- keyampを設定した上で、
    -- 設定したkeymapに該当するキー入力が実行された時点でロードする
    -- 設定しているkeymapは↓と同じ 
    -- vim.keymap.set("n", "<C-n>", "<cmd>NvimTreeToggle<cr>", { noremap = true })
    {
      "<C-n>",
      "<cmd>NvimTreeToggle<cr>",
      noremap = true,
      mode = "n",
    }
  },
  config = function()
    require("nvim-tree").setup({
      -- Some options...
    })
  end,
})

これでnvim-tree.lua(+ nvim-web-devicons)を遅延読み込みできるようになった。

他のプラグインも頑張って移すぞ。

Firebase SDKのSetupでハマった(Go)

Firebaseの公式ドキュメントのサーバーに Firebase Admin SDK を追加するの記事にはこんな風に書いてる。

# Install as a module dependency
$ go get firebase.google.com/go/v4

# Install to $GOPATH
$ go get firebase.google.com/go

ここでちょっとつまづいた。 Goのこと何もわかってなくて、これ両方やるもんだと思ってた。

シチュエーションに合わせてどっちかやればいいということに手を動かしてみて気づいた。

Firebase SDKをきっちりプロジェクトの依存関係として扱うのであれば、上を実行すればいい。

mkdir sample-project
cd sample-project
go mod init github.com/koralle/sample-project
go get firebase.google.com/go/v4

tschaub/gh-pagesを使用してStorybookをGitHub PagesへデプロイするワークフローをGitHub Actionsで自動化する

今回やりたいこと

  • mainブランチへのPull Request発行をトリガーとする
  • StorybookをGitHub Pagesへデプロイしたい
  • GitHub Pagesへのデプロイにtschaub/gh-pagesを使用したい

前提

ローカル環境

  • M1 Macbook Air
  • macOS Monterey v12.4
  • Node.js 18.6.0
  • パッケージマネージャにnpm@v8.13.2を採用
  • Storybook v6.5.10

最初に結論から

name: Build Storybook to GitHub Pages

on:
  pull_request:
    branches:
      - main

jobs:
  deploy:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout
        uses: actions/checkout@v3

      - name: Setup Node.js
        uses: actions/setup-node@v3
        with:
          node-version: 18

      - name: Install Dependencies from `package-lock.json`
        run:
          npm ci

      - name: Build Storybook
        run: 
          npm run build-storybook

      - name: Deploy Storybook with gh-pages
        run: |
          git remote set-url origin \
            https://git:${GITHUB_TOKEN}@github.com/${GITHUB_REPOSITORY}.git
          npx gh-pages -d storybook-static \
            -u "github-actions-bot <support+actions@github.com>"
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

解説

トリガーイベント

mainブランチへのPull RequestイベントをトリガーにしてGitHub Actionsを実行する。 ここでは特にclosedとかのイベントのタイプで縛ってない

on:
  pull_request:
    branches:
      - main

Checkout ~ Build Storybook

あんまり言うことない...

Deploy Storybook with gh-pages

tschaub/gh-pagesをCLIとして使用すると静的ファイルのGitHub Pagesへのデプロイが可能。 GitHub Actions内で使用する方法はREADME.mdに記載がある。

GITHUB_TOKENが必要なので注意。

Terraformのvariablesを使ってみる

例えばAzureのリソースをTerraformで管理しようとしたときに、
誰でも最初はmain.tfをこう書くんじゃないだろうか。

リソースグループ名だけまず作るやつ。

# Azurerm Provider
terraform {
  required_providers {
    azurerm = {
      source  = "hashicorp/azurerm"
      version = "=2.97.0"
    }
  }
}

provider "azurerm" {
  features {}
}

resource "azurerm_resource_group" "main" {
  name  = "koralle-sample-resources"
  location = "Japan East"
}

リソースグループ名はmain.tfにベタ書きするんじゃなく変数で定義したくなったとする。

その場合は、main.tfとは別にvariables.tfを作って、
その中でリソースグループ名を変数定義してあげれば良い。

variable "resource_group_name" {
  description = "Azure Resource Group Name"
  type = string
  default = "koralle-sample-resources"
}

このresource_group_nameという変数をmain.tfから参照する。

# Azurerm Provider
terraform {
  required_providers {
    azurerm = {
      source  = "hashicorp/azurerm"
      version = "=2.97.0"
    }
  }
}

provider "azurerm" {
  features {}
}

resource "azurerm_resource_group" "main" {
  name  = var.resource_group_name
  location = "Japan East"
}

たまたま Terraform x AWSのTutorialのページを見ていると、こんな事が書いてあった。

Note: Terraform loads all files in the current directory ending in .tf, so you can name your configuration files however you choose.

main.tfと同階層にある*.tfは全部Terraformに読み込まれるらしく、
ファイル名は自由に命名していいらしい。

つまりvariables.tfhogehoge.tfに変えてもいける...?(いけた)

WSL上のUbuntuにAWS CLIをインストールする

プライベートでAWSをちょろちょろいじって勉強するためには、 私用PC(Windows)に積んでいるWSL上のUbuntuにAWS CLIをインストールする必要があった。

公式ドキュメントを読みながらインストールする。

環境

WIndows 10(まだ11にアップグレードしてない)

$ uname -a
Linux koralle 4.19.104-microsoft-standard #1 SMP Wed Feb 19 06:37:35 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux

IAMユーザーを作成しておく

絶対にルートユーザーのままリソースをいじらない。 普段は必ずIAMユーザーを別に作り、そのIAMユーザーでAWSコンソールを操作する。

IAMユーザーはIAMで作成する。

AWS CLIの設定に必要なのでアクセスキーが記載されたCSVをダウンロードしておく。

インストール

WSL上のUbuntuにインストールするので、下記のコマンドを実行すればOK。

curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install

これで awsコマンドが使えるようになるはず。

aws --version
aws-cli/2.4.25 Python/3.8.8 Linux/4.19.104-microsoft-standard exe/x86_64.ubuntu.20 prompt/off

認証情報の登録

aws configureコマンドと、さっきダウンロードしたアクセスキーの情報を使って認証情報を登録する。

 aws configure
AWS Access Key ID [None]: *****************************
AWS Secret Access Key [None]: **********************************
Default region name [None]: ap-northeast-1
Default output format [None]: json

これにより、~/.aws/credentials~/.aws/configにそれぞれdefault Profileの内容が書き込まれている。

[default]
aws_access_key_id = **********************
aws_secret_access_key = *****************************
[default]
region = ap-northeast-1
output = json

名前付きProfileも使えると便利そうな気がするので、上記の2つのファイルに少し追記をしておく。 default Profileと全く同じ内容の名前付きProfileを作成しておくだけ。

[default]
aws_access_key_id = *****************
aws_secret_access_key = ****************************
[koralle]
aws_access_key_id = **********************
aws_secret_access_key = *************************
[default]
region = ap-northeast-1
output = json

[koralle]
region = ap-northeast-1
output = json