Goで整数の絶対値を求めるのに math.Abs() を使わない方がいい理由

1. はじめに

Goで整数の絶対値を求めるとき、特に何も考えずに math.Abs() を使っていました。しかし、math.Abs()float64 を引数に取る関数なので、本当に問題がないのか気になって調べてみました。その結果、整数の絶対値を求めるときに math.Abs() を使うには注意が必要だということがわかりました。

注意が必要なのは以下の2点です。

以下に詳しく説明します。
続きを読む

X (旧Twitter) でコミュニティーノートを非表示にするFirefoxのアドオンを作りました

Xで目にするものはできるだけ自分でコントロールしたいと思っています。そのため、ポストを見たいアカウントだけフォローしたりリストに入れたりしています。それでも、リポスト(リツイート)された他のアカウントのツイートと、コミュニティーノートが目に入ってしまうのがストレスでした。

リポストを非表示にするアドオンは以前作成した ので、今回は、コミュニティーノートを非表示にする Firefoxのアドオンを作ってみました。
「Hide X Community Notes」という名前でFirefoxのアドオンとして公開されています。
同じストレスを抱えている方、是非使ってみてください。(バグがあったらこっそり教えてください)

このアドオンのソースコードは GitHub の hide-x-community-notes のページ に置いてあります。よろしければご覧ください。

いい加減、Xなんて変な名前をやめて、Twitterにもどしてほしい。

X (元Twitter) で再投稿 (リツイート) を非表示にするFirefoxのアドオンを作りました

X (元Twitter) で、再投稿 (リツイート; retweet; repost) を非表示にするFirefoxのアドオンを作りました。

投稿 (ツイート) を追いたいアカウントだけをリストに入れているので、再投稿 (リツイート) は非表示にしたいのですが、X上の「リツイートをオフにする」の設定がリストだと効かないので困っていました。以前のTweetdeck (現 XPro) だと、追加した列の設定でリツイートを非表示にできたのですが、現在はできなくなってしまいました。

そこで、このストレスを解消させるために、Firefoxのアドオンを作ってみました。
「Hide X Reposts」という名前でFirefoxのアドオンとして公開されています。
同じストレスを抱えている方、是非使ってみてください。(バグがあったらこっそり教えてください)

このアドオンのソースコードは GitHub の hide-x-reposts のページ に置いてあります。ご参考まで。

ただの将棋盤

シンプルな将棋盤ウェブアプリ「ただの将棋盤」を Vue.js を利用して開発しました。以前既存の将棋ウェブサービスを調査した ときに、将棋盤部分にCanvasとtableを使っているものが多かったので、SVGを使ってみました。

駒の表示などの処理に Vue.js の v-for が大活躍しました。

GitHubのリポジトリ を公開しておりますので、将棋盤を使用するウェブサービスの元などとしてご利用ください。

また、GitHub Pages のウェブページ でご試用いただけるようにしましたので、是非ご試用ください。

SWI-Prologでのクイックソートの実装

SWI-Prologを使って、クイックソートを実装してみました。partition/4append/3は、SWI-Prologの独自の実装なので、他のPrologの実装だとこのままでは動かないかもしれません。
続きを読む

定積分の値の近似値を台形公式により求めて返す関数

Golangで、定積分の値の近似値を台形公式により求めて返す関数を作成しました。

プログラム中の integrate という関数が定積分の値を求める関数です。引数として、定積分する関数と、定積分の区間を渡します。引数として渡す関数は、その引数も返す値も float64 型です。その上の N_SUBINTERVAL という定数を大きくするほど近似の精度が上がり、実行速度は遅くなります。例として、答えが π になる定積分を求めています。

続きを読む

flagパッケージでコマンドラインフラグが現れたか確認する方法

flagパッケージを使うと、コマンドラインフラグ(オプション)を便利に扱うことができます。

flagパッケージを使っていて、あるフラグがコマンドラインに現れたかどうかを検知したいという状況があったので、方法を調べてみました。

一つ目の方法はコマンドラインの内容を os.Args で直接調べる方法です。ただし、flagパッケージで作られるフラグは、例えば a という名前のフラグならば -a--a という2つの形式がある上に、引数を持つ場合、 -a x-a=x という2つの形式があるため、処理が複雑になってしまうかもしれません。また、osパッケージを使うのはあまりスマートな方法ではないと思います。

二つ目の方法は、フラグのデフォルトの値から変更があるかをチェックする方法です。これが一番普通の方法だと思います。しかし、コマンドラインでデフォルトと同じ値をセットした場合と、コマンドラインにそのフラグが現れていない場合の区別はつきません。

三つ目の方法は、 flag.Visit() という関数を使う方法です。 flagパッケージ内の関数を使って調べるには、これしかないようです。flag.Visit() に渡す関数を定義する必要がありますが、今回の目的には一番あっているようです。

上記の三つの方法を示すコードを作成してみました。
同じような状況があった場合は、この三つの方法をうまく使いわけるといいと思います。

続きを読む

ベータ分布の値を返す関数

Golangで、ベータ分布の値を返す関数を作成しました。

math パッケージにはガンマ関数の値を返す関数などがあるので、それらを組み合せることで、ベータ分布の値を返す関数は簡単に作ることができます。

続きを読む

バッファありチャネルとバッファなしチャネル

先日、ゴルーチンとチャネルを使った以下のようなプログラムを作成したところ、うまく動作しませんでした。

続きを読む

ハッシュ関数 SHA-256 のGoによる実装

ビットコインのしくみにも利用されていて,このところ話題になることの多いハッシュ関数SHA-256を、Goで実装してみました。

実行効率は考えずに、NISTの Secure Hash Standard のページ にある FIPS PUB 180-4 のファイル の記述に従って、わかりやすさを重視して作成しました。SHA-256のアルゴリズムを理解するのに役に立つと思います。

SHA-256のアルゴリズムは大きく分けて、以下の3つの段階に分かれます。

  1. 処理するメッセージ M の後ろに「1」のビットを1つ足して、その後ろに、メッセージの長さが (512の倍数 – 64) ビットになるまで「0」のビットを足す。
  2. その後ろに、元のメッセージ M の長さ(ビット数)の2進数表現を 64ビット足す。(このため、SHA-256で処理するメッセージの長さは 2の64乗未満でなければならない。)
  3. ハッシュ値を計算する。

実際のコードは以下の通りです。

続きを読む