「dyld: Library not loaded: /usr/local/opt/icu4c/lib/libicui18n.71.dylib」が出た

概要

Node.js を久しぶりに動かしたところ、下記のエラーが出力された。

yld: Library not loaded: /usr/local/opt/icu4c/lib/libicui18n.71.dylib
  Referenced from: /usr/local/bin/node
  Reason: image not found

環境

- Mac

解決策

エラーが出た内容でググると同じ問題が見つかった。

qiita.com

また、他にも似たような問題が見つかった。

gist.github.com

そのために下記のコマンドを実行

brew reinstall node

Golang で並列処理の実行方法

概要

Golang の特徴として並列処理があります。

  • 実装方法

  • なぜ、並列処理が得意なのか

は調べたことがなかったので、改めて調べたのでまとめます。

実装方法

package main

import (
    "fmt"
)

func server(ch chan string){
    defer close(ch)
    ch <- "one"
    ch <- "two"
    ch <- "three"
}

func main()  {
    var s string

    ch := make(chan string)
    go server(ch)

    s = <- ch
    fmt.Println(s)
        // 「one」が表示

    s = <- ch
    fmt.Println(s)
        // 「two」が表示
}

上記の例では、goroutinechannelの仕組みが利用されています。

goroutine

読み方は「ゴルーチン」
並列処理を行うために宣言され、他のプログラムにおけるスレッドのような扱いになります。
使い方はgo 関数名であり、上記の例であるとgo server(ch)が該当します。

channel

並列処理を行うときに値の引き渡しを行うときに宣言されます。
宣言するときにはch := make(chan string)makeで宣言されます。
チャネルに値を代入するときには、ch <- "one"です。
チャネルからの値を変数へ代入するときには s = <- ch です。

他の実行例

例えば、下記のようにserver_sampleを追加して、goroutine で実行すると実行結果は下記のように「one」「two」「1」「2」と表示される。

package main

import (
    "fmt"
)

// 追加
func server_sample(ch chan string){
    defer close(ch)
    ch <- "1"
    ch <- "2"
    ch <- "3"
}

func server(ch chan string){
    defer close(ch)
    ch <- "one"
    ch <- "two"
    ch <- "three"
}

func main()  {
    var s string

    ch := make(chan string)
    go server(ch)

    s = <- ch
    fmt.Println(s)
         // 「one」が表示されます。
    s = <- ch
    fmt.Println(s)
         // 「two」が表示されます。

         // もう一度、chを宣言をする
    ch = make(chan string)
         // go server_sampleで並列処理をする
    go server_sample(ch)
    s = <- ch
    fmt.Println(s)
         // 「1」が表示されます。
    s = <- ch
    fmt.Println(s)
         // 「2」が表示されます。
}

Golangにおける並列処理

Golang の並列処理は上記のように goroutine で簡単に実装できるので、並列処理が得意と言われています。

並列処理のメリット

例えば、1つの処理をするときには1CPUを利用するとします。
2つ以上の処理を直列で実行するときには複数あるCPUの内、1CPUしか使うことができません。
そのため、直列で処理をする必要がないときには、並列処理を利用して処理を早く終わらせることができます。

「UXデザインの法則」を読みましたので感想

概要

UXデザインの法則 ―最高のプロダクトとサービスを支える心理学を読みましたので、感想とまとめです。

内容

法則

法則名 説明
ヤコブの法則 ユーザは新規のサイト・サービスに経験則から同じ挙動を期待する
フィッツの法則 ターゲットに至るまでの時間は、ターゲットの大きさと近さで決まる
ヒックの法則 意思決定にかかる時間は、選択肢の数と複雑さで決まり、選択肢が少ないほど意思決定の時間が短くなる
ミラーの法則 普通の人が短期記憶に保持できるのは、7(±2)個まで
ポステルの法則 出力は厳密に、入力は寛容に
ピークエンドの法則 経験についての評価は、全体の総和や平均ではなく、ピーク時と終了時にどう感じたかで決まる
美的ユーザビリティ効果 見た目が美しいデザインは使いやすいと感じる
フォン・レストルフ効果 似たものが並んでいると、その中で他とは異なるものが記憶に残りやすい
テスラーの法則 どんなシステムにも、それ以上減らすことのできない複雑さがある
ドハティの閾値 応答が0.4秒以内のとき、コンピュータとユーザの双方が最も生産的になる

感想

まず、最初に私が普段利用しているサービスやサイト、アプリで無意識に行っている動作に対して、名前が付けられていることを知ったことでGoogleで検索しやすいと感じました。
加えて、普段作成しているExcelの資料についても利用できるとは感じました。
例えば、

  • 「美的ユーザビリティ効果」:誰が見ても資料で主張したいことが一目で分かる

  • 「フォン・レストルフ効果」:従来と今回の提案で比較するときの違い

Cursor エディターへ移行した話

概要

最近、Cursorというエディタが賑わっており、様々な記事が書かれています。
cursor.sh Cursorの大まかな概要を確認すると、ChatGPTを主軸としたエディタであり、デバッグやプログラムの生成をChatGPTで自動で行ってもらえるそうです。 また、vscodeの機能はそのままで利用できるみたいなので、今まで利用してきたvscodeからCursorへ移行してみました。

インストール作業

Cursorのインストール方法は公式サイトからインストーラーをダウンロード してきて解凍するのみです。
解凍したインストーラを起動して手順通り進めると、vscode拡張機能を移行するか確認されたので、OKをクリックします。

使ってみて

実際のエディター画面は下記の通りで、ChatGPTの画面が右側で見えており、その他はvscodeと変わりません。

ChatGPT

上記の画面でも見えていますが、質問は日本語にも対応しています。
今回は「Next.js でログイン画面を作成して」と質問したところ、下記の返答が数秒でされました。

Next.jsでログイン画面を作成するには、以下の手順を参考にしてください。
1. 新しいページを作成します。例えば、pages/login.jsという名前で新しいファイルを作成します。

import React from 'react';

const LoginPage = () => {
  return (
    <div>
      <h1>ログイン</h1>
      <form>
        <div>
          <label>ユーザー名:</label>
          <input type="text" name="username" required />
        </div>
        <div>
          <label>パスワード:</label>
          <input type="password" name="password" required />
        </div>
        <button type="submit">ログイン</button>
      </form>
    </div>
  );
};

export default LoginPage;

2.フォームの送信を処理するための関数を追加します。この関数は、ユーザーがログインボタンをクリックしたときに呼び出されます。

import React, { useState } from 'react';

const LoginPage = () => {
  const [username, setUsername] = useState('');
  const [password, setPassword] = useState('');

  const handleSubmit = (event) => {
    event.preventDefault();
    // ここでログイン処理を行います
    console.log(`Logging in ${username} with password ${password}`);
  };

  return (
    <div>
      <h1>ログイン</h1>
      <form onSubmit={handleSubmit}>
        <div>
          <label>ユーザー名:</label>
          <input type="text" name="username" required onChange={e => setUsername(e.target.value)} />
        </div>
        <div>
          <label>パスワード:</label>
          <input type="password" name="password" required onChange={e => setPassword(e.target.value)} />
        </div>
        <button type="submit">ログイン</button>
      </form>
    </div>
  );
};

export default LoginPage;

この例では、ログイン処理は単にコンソールにログを出力するだけですが、実際にはここでAPIを呼び出したり、認証トークンを保存したりするなど、適切なログイン処理を行う必要があります。

日本語だけでなく、ソースコードも生成してくれています。
この機能はかなり便利です。

エディタの表記名を日本語に変更

小さいことではありますが、コマンドパレットを開いてConfigure Display Languageを選択して、日本語を選択すればエディタの表記名を日本語にしてくれます。

Pacemakerにおける仮想IPの考え方

概要

会社でHA構成を実現するためにPacemakerを採用しています。 HA構成の基本的な仕組みである仮想IPの考え方についてまとめてみました。

物理IPと仮想IP

マシンに搭載されているNIC(Network Interface Card)に設定されているIPアドレス物理IPアドレスと呼びます。
一般的には物理IPアドレスはサーバのIPアドレスを指します。
一方で、仮想IPアドレス複数のマシンで共有で利用できるIPアドレスであり、Pacemakerでは仮想IPアドレスを1台のサーバに割り当てます。

仮想IPアドレスが割り当てられているサーバが故障などで落ちてしまったときには、正常に動いているサーバに仮想IPアドレスが割り当てられます。

AtCoderの環境をDockerで整える

概要

AtCoderの開発環境を整えてみたので、その時の備忘録。

環境

  • Mac
  • Docker:20.10.0

実行

フォルダ構成

.
├── aoj  
│   └── dockerfile  
├── docker-compose.yaml  
└── src  
    ├── main  
    └── main.cpp

各ファイルの中身

docker-compose.ymal

version: "3"
services:
    atcoder:
      container_name: atcoder
      build: './aoj'
      tty: true
    compiler:
      image: gcc:12.2.0
      volumes:
        - ./src:/src
      working_dir: /src
      command: g++ main.cpp -o main

aoj/dockerfile

FROM python:3.6-slim AS OJ
RUN pip3 install online-judge-tools

FROM node:20-bullseye-slim
COPY --from=OJ / /
RUN npm install -g npm atcoder-cli

参考

github.com

tatamo.81.la

SSL証明書のCSRファイル・KEYファイルの生成コマンド

概要

SSL証明書の更新作業でCSRファイルとKEYファイルの作成を行うコマンドを調べたので備忘録。

事前知識

CSRファイル

SSL証明書を発行する上で必要な個人情報。

KEYファイル

暗号化されたCSRファイルを復号化するための暗号キー。

コマンド

秘密鍵を生成

openssl genrsa -des3 -out test.key 2048

openssl genrsa:秘密鍵を生成するコマンド
-out          :生成した秘密鍵の名前
2048          :bit数
-des3         :秘密鍵のパスワードを付与する時の暗号方式
Generating RSA private key, 2048 bit long modulus
.....................................+++
.............................+++
e is 65537 (0x10001)
Enter pass phrase for test.key:
Verifying - Enter pass phrase for test.key:

証明書の作成

openssl req -new -key test.key -out test.csr

openssl req :CSRファイルを作成するコマンド
-new        :新しく証明書を生成するオプション
-key        :CSRファイルを作成する上で利用する秘密鍵
-out        :作成するCSRファイル名
Enter pass phrase for test.key:
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) []:JP
State or Province Name (full name) []:test
Locality Name (eg, city) []:hoge
Organization Name (eg, company) []:fuga
Organizational Unit Name (eg, section) []:hogehoge
Common Name (eg, fully qualified host name) []:huge
Email Address []:test@mail

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:test