ブログ

読んで思い出す。忘れるために書く

FizzBuzz を書いた (Haskell)

paiza ラーニングの Haskell 問題集 を進めていて、FizzBuzz 回答まで到達できたので記録

パターンマッチングと mapM_ を活用した関数合成で解くことができた

回答コード

-- 関数定義
isFizzBuzz n =
  (isFizz n) && (isBuzz n)

isFizz n =
  (n `mod` 3) == 0

isBuzz n =
  (n `mod` 5) == 0

fizzBuzz n
  | isFizzBuzz n = "FizzBuzz"
  | isFizz n = "Fizz"
  | isBuzz n = "Buzz"
  | otherwise = show n

-- メイン
main = do
  -- FizzBuzz のパターンマッチングと その結果を `putStrLn` で標準出力に出す
  mapM_ (putStrLn.fizzBuzz) [1..100]

Links

asdf でインストールする Vim のクリップボード機能を有効化する (WSL2)

TL;DR

asdf を使うと、たとえば Vim とか サクッといろいろインストールできる

でも通常は「-clipboard」になるから「+clipboard」にするためには 準備が必要かも

(※ vim --version|grep clipboard拡張機能が有効化されているか否かを確認できる)


あといろいろカスタムインストールしたい

おおまかな手順

  1. Ubuntulibxt-dev をインストールする
  2. asdf でインストールするときにオプションを渡す

Ubuntulibxt-dev をインストールする

apt コマンドを叩く

sudo apt update
sudo apt install libxt-dev

asdf でインストールするときにオプションを渡す

次の ShellScript を実行する

#!/bin/sh

# ASDF 経由で Vim のビルドに使うオプションを設定
ASDF_VIM_CONFIG="\
  --with-x=yes \
  --enable-cscope \
  --enable-fail-if-missing \
  --enable-fontset \
  --enable-gpm \
  --enable-gtk2-check \
  --enable-multibyte \
  --enable-perlinterp=dynamic \
  --enable-python3interp=dynamic \
  --enable-rubyinterp=dynamic \
  --enable-terminal \
  --with-compiledby=asdf \
  --with-features=huge \
  --with-tlib=ncurses \
" \
asdf install vim latest # 最新版をインストール

asdf global vim latest # インストールしたヤツを使う

# 機能確認用 (ここが実行されたらバージョン確認, `/clipboard` で拡張機能の状態を確認する)
if ! command -v vim &> /dev/null; then
  vim --version | less
fi

デフォルトで渡されるオプション」は GitHub 上で確認できる

これで足りなかったり削りたかったりがあれば、上のようにオプション設定をしてあげるとよい

Links

Ubuntu に gitsh をインストールする (configure, make)

目的・ゴール

brew install gitshpkg_add gitsh とかはサポートされてるけど、Ubuntu では gitsh を「コマンドひとつで簡単にインストール」する方法が用意されていない

ソースコードからバイナリを生成してインストールをする (configuremake)

おおまかな手順

  1. ソースコードのダウンロードと展開 (wget, tar)
  2. configure で構成設定
  3. make でバイナリ生成とインストール
  4. 動作確認

ソースコードのダウンロード

記事を書いている時点では v0.14 が最新なので、タグ情報から v0.14 のページ を表示させる

tar.gz ファイルを wget でダウンロードする

cd ~ # ホームディレクトリに移動

# ダウンロード
wget https://github.com/thoughtbot/gitsh/releases/download/v0.14/gitsh-0.14.tar.gz

# 展開
tar xzf gitsh-0.14.tar.gz

configure で構成設定

先ほどダウンロードと展開をしたディレクトリに移動 (cd gitsh-0.14) して、設定をしていく

INSTALL ファイルにもインストール方法が書かれているので参考にする

# HINT:  ./configure --help で 設定可能なオプション一覧が見られる

# 1. バージョン管理ツール (`rbenv`, `anyenv`, etc...) を使ってる場合、Ruby の PATH が通常と異なる場合があるので RUBY オプションをつかう
# 2. /usr/local/bin など管理者権限が必要な場所にインストールしたくない ...自分だけで使いたい... ので --prefix 指定をする
RUBY="$(which ruby)" ./configure --prefix="~/.local"

make でバイナリ生成とインストール

あとはインストールするだけ

make && make install

動作確認

gitsh を叩いて起動するか確認する

Links

WSL2 + 1Password で SSH 接続・通信をする (npiperelay, socat)

目的・ゴール

1Password が SSH キーを管理できる ので、それを WSL 上でも可能にする

今回の対象は GitHub で、通信テストをして成功すれば OK

環境・前提

おおまかな手順

  1. npiperelay.exe をインストール (Windows)
  2. socat をインストール (Ubuntu)
  3. ~/.bashrc に設定記述
  4. WSL のシャットダウン・再び起動
  5. 動作テスト

npiperelay.exe のインストール

Windows 上で操作。go コマンドを使うとラク

go install github.com/jstarks/npiperelay@latest

# → C:\Users\__my_user_name__\go\bin\npiperelay.exe

socat のインストール

今度は WSL 上で操作

sudo apt install socat

~/.bashrc の設定記述

引き続き、WSL 上。

NPIPE_RELAY_EXEC_PATH には、Windows 側でインストールした PATH を、Ubuntu 側から参照できる形の PATH として記述する

# Configure ssh forwarding
export SSH_AUTH_SOCK=$HOME/.ssh/agent.sock
# need `ps -ww` to get non-truncated command for matching
# use square brackets to generate a regex match for the process we want but that doesn't match the grep command running it!

NPIPE_RELAY_EXEC_PATH="/mnt/c/Users/__my_user_name__/go/bin/npiperelay.exe"

ALREADY_RUNNING=$(ps -auxww | grep -q "[n]piperelay.exe -ei -s //./pipe/openssh-ssh-agent"; echo $?)

if [[ $ALREADY_RUNNING != "0" ]]; then
    if [[ -S $SSH_AUTH_SOCK ]]; then
        echo "removing previous socket..."
        rm $SSH_AUTH_SOCK
    fi
    echo "Starting SSH-Agent relay..."
    (setsid socat UNIX-LISTEN:$SSH_AUTH_SOCK,fork EXEC:"$NPIPE_RELAY_EXEC_PATH -ei -s //./pipe/openssh-ssh-agent",nofork &) >/dev/null 2>&1
fi

WSL のシャットダウン・再び起動

Windows 上で操作。

設定を終えたら、Windows 側で 一度 WSL をシャットダウンする

wsl --shutdown

もういちど WSL (Ubuntu) を起動してみると、~/.bashrc に記述したとおり、echo で文字列が出力されるようになるはず

動作テスト

ssh のテスト接続で、Windows, Ubuntu どちらも 1Password が介入してくるはず

Windows

ssh -T git@github.com

WSL (Ubuntu)

ssh -T git@github.com

Links

Power Automate で外部アプリケーションを操作して、ウィンドウ位置を規定位置に復元する

目的とゴール

Power Automate を用いて自動化処理をしているが、操作対象としているアプリケーションのウィンドウ位置が原因で、上手く動かないことがある。

これを直したい

事前準備

外部ツール

外部ツールとして「ウィンドウ位置記憶プログラム (VbWinPos)」を用いる

適当なディレクトリにインストールして、操作対象としているアプリケーションのウィンドウを捕捉・記録しておく (設定を終えるとアプリケーション終了時、 *.ini ファイルに記録してくれる)

このとき、「一括セット」のチェックボックスを有効化しておく。(あとの自動化を楽にするため)

やること

おおまかな やること:

  • 「アプリケーションの実行」
  • 「プロセスを待機する」
  • 「マウスを画像に移動」
  • 「マウスクリックの送信」
  • 「プロセスを終了する」

フローの全体図

アプリケーションの実行

「システム - アプリケーションの実行」から、アクションを持ってくる

「アプリケーション パス」に VbWinPos の実行ファイルがある場所を指定する

プロセスを待機する

「システム - プロセスを待機する」から、アクションを持ってくる

「プロセス名」には「VbWinPos」を設定する

マウスを画像に移動

「マウスとキーボード - マウスを画像に移動」から、アクションを持ってくる

「マウスの移動先の画像」では、VbWinPos の「座標セット (S)」ボタンを指定する

マウスクリックの送信

「マウスとキーボード - マウス クリックの送信」から、アクションを持ってくる

「送信するマウス イベント」では、「左クリック」を指定する

プロセスを終了する

「システム - プロセスを終了する」から、アクションを持ってくる

「プロセスの指定方法」は「プロセス名」を指定し、「プロセス名」では「VbWinPos」を設定する

Links

O'Reilly Japan で購入した本を Dropbox 経由で iOS Kindle のライブラリに追加する

問題

Amazon では 端末と紐付けたメールアドレスを提供していて、50MB までのファイルサイズに対応しているらしい

一方 Gmail は 25MB までの対応らしく、購入した本によっては メール経由で送ることができない

(本記事を書いている時点で そもそも「大きなファイル (10MB 以上?) は Google Drive に保管して 共有 URL を発行した方がいいよ」と案内が出て送れなかった)

解決

PC 経由で一度 Dropbox に保存する

詳細は次の通り:

  1. PC で本を購入し、EPUB ファイルをダウンロードする
  2. Dropbox にファイルを置く
  3. iPadDropbox で本を選び、「共有」-「Send copy of file」から、Kindle を選択する

この手順で、あとは「ファイル名」「著者名」を設定することで、Kindle に送信される

Link