メインコンテンツまでスキップ

JavaScript のメモ

配列

例: [1, 2, 3]

配列のコピー

// 参照渡し
let a = [1, 2, 3]
let b = a
b[0] = -1
a // [-1, 2, 3]

// コピー
a = [1, 2, 3]
b = a.slice()
b[0] = -1
a // [1, 2, 3]
b // [-1, 2, 3]

末尾の値

let a = [1, 2, 3]
a.at(-1)

配列を取り出す

let a = [1, 2, 3, 4, 5]
a.slice(2) // [3, 4, 5]
// 注意
a.slice(2, -1) // [3, 4]

数列の作成 (いわゆる range)

const range = (start, stop, step) =>
Array.from({ length: (stop - start) / step + 1}, (_, i) => start + (i * step));

range(0, 10, 1) // [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

for-of

for(let c of ['a', 'b', 'c']){
console.log(c)
}
結果
a
b
c

map

let a = [1, 2, 3].map(x => x ** 2)
// [2, 4, 6]

すべて零の配列 (zeros)

Array.zeros = (n) => Array.from({ length: n}, () => 0);

Array.zeros(5) // [0, 0, 0, 0, 0]

合計 (sum)

Array.prototype.sum = function(){ return this.reduce((prev, curr) => prev + curr, 0) }

[1, 2, 3, 4].sum() // 10

平均 (mean)

Array.prototype.mean = function(){ return this.reduce((prev, curr) => prev + curr, 0) / this.length }

[1, 2, 3, 4].mean() // 2.5

文字列

例: "text"

テンプレートリテラル

let a = 100
`${a / 10}` // "10"

数値

例: 1

文字列を数値に変換

parseInt('100') // 100
parseFloat('100.1') // 100.1

フォーマット

// 小数点以下 3 桁
(1.2).toFixed(3) // "1.200"

日付

let today = new Date

today.toDateString() // "Sat Jan 01 2022"
today.toISOString() // "2021-12-31T15:00:00.000Z"
today.toLocaleDateString() // "2022/1/1"
today.toLocaleString() // "2022/1/1 0:00:00"
today.toLocaleTimeString() // "0:00:00"
today.toString() // "Sat Jan 01 2022 00:00:00 GMT+0900 (日本標準時)"
today.toTimeString() // "00:00:00 GMT+0900 (日本標準時)"
today.toUTCString() // "Fri, 31 Dec 2021 15:00:00 GMT"

Ubuntu に Docker をインストールする

https://docs.docker.com/engine/install/ubuntu/#set-up-the-repository の日本語訳です。

:::important Docker Desktop for Linux Docker Desktop を使用すると、Linux と同様に、 Mac と Windows 上でコンテナを簡単に構築、共有、実行できます。 Docker Desktop for Linux が一般提供版となったことをお伝えできることを嬉しく思います。 詳細については、Docker Desktop for Linuxを参照してください。 :::

Ubuntu で Docker Engine を使い始めるには、 前提条件を満たしていることを確認してから、 Docker をインストールしてください。

前提条件

OS の要件

Docker Engine をインストールするには、 次のいずれかの Ubuntu バージョン (64 bit) が必要です。

  • Ubuntu Jammy 22.04 (LTS)
  • Ubuntu Impish 21.10
  • Ubuntu Focal 20.04 (LTS)
  • Ubuntu Bionic 18.04 (LTS)

Docker Engine は、x86_64 (または amd64)、armhfarm64 及び s390x アーキテクチャでサポートされています。

古いバージョンをアンインストールする

古いバージョンの Docker は docker、docker.io、docker-engine と呼ばれていました。 これらがインストールされている場合は、アンインストールします。

$ sudo apt-get remove docker docker-engine docker.io containerd runc

apt-get がこれらのパッケージのどれもインストールされていないと報告すれば問題ありません。

イメージ、コンテナ、ボリューム、ネットワークなどの /var/lib/docker/ のコンテンツは保存されます。 既存のデータを保存する必要がなく、クリーンインストールから開始したい場合は、このページの下にある(Docker Engine のアンインストール](#)セクションを参照してください。

インストール方法

Docker Engine は、必要に応じてさまざまな方法でインストールできます。

  • インストールとアップグレードタスクを容易にするために、ほとんどのユーザは Docker のリポジトリをセットアップし、そこからインストールします。これは推奨されます。
  • 一部のユーザは DEB パッケージをダウンロードして手動でインストールし、アップグレードを完全に手動で管理します。これは、インターネットにアクセスできないエアギャップのあるシステムに Docker をインストールする場合などに便利です。
  • テストや開発環境では、自動化された便利なスクリプトを使って Docker をインストールするユーザもいます。

リポジトリを使用してインストールする

Docker Engine を新しいホストマシンに初めてインストールする前に、Docker リポジトリをセットアップする必要があります。 その後、リポジトリから Docker をインストールして更新することができます。

リポジトリを設定する

  1. apt パッケージインデックスを更新してパッケージをインストールし、apt が HTTPS 経由でリポジトリを使用できるようにします。

    $ sudo apt-get update

    $ sudo apt-get install \
    ca-certificates \
    curl \
    gnupg \
    lsb-release
  2. Docker の公式 GPG キーを追加します。

    $ sudo mkdir -p /etc/apt/keyrings
    $ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
  3. リポジトリを設定するには、次のコマンドを使用します。

    $ echo \
    "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
    $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

Docker エンジンのインストール

  1. apt パッケージインデックスを更新し、最新バージョンの Docker Engine、containerd、Docker Compose をインストールするか、次のステップに進んで特定のバージョンをインストールします。

    $ sudo apt-get update
    $ sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin

    :::important apt-get update の実行時に GPG エラーが発生しますか? デフォルトの umask が正しく設定されていない可能性があります。 これにより、リポジトリの公開鍵ファイルが検出されなくなります。次のコマンドを実行してリポジトリを再度更新してください。
    sudo chmod a+r /etc/apt/keyrings/docker.gpg :::

  2. Docker Engine の特定のバージョンをインストールするには、リポジトリにある利用可能なバージョンのリストから選択してインストールします。

    a. リポジトリで利用可能なバージョンをリストします。

    $ apt-cache madison docker-ce

    b. 2番目のカラムのバージョン文字列 (5:20.10.16~3-0~ubuntu-jammy など) を使用して特定のバージョンをインストールします。

    $ sudo apt-get install docker-ce=<VERSION_STRING> docker-ce-cli=<VERSION_STRING> containerd.io docker-compose-plugin
  3. hello-world イメージを実行して、Docker Engine が正しくインストールされていることを確認します。

    $ sudo docker run hello-world

    このコマンドは、テスト・イメージをダウンロードし、コンテナ内で実行します。コンテナが実行されると、メッセージを出力して終了します。

Docker Engine がインストールされて実行されています。 docker グループは作成されますが、ユーザは追加されません。 Docker コマンドを実行するには sudo を使用する必要があります。 特権のないユーザが Docker コマンドを実行できるようにするには、Linux の postinstall を続行します。 その他のオプションの設定手順も実行できます。

Docker エンジンのアップグレード

Docker Engine をアップグレードするには、 まず sudo apt-get update を実行し、 インストール手順に従ってインストールする新しいバージョンを選択します。

パッケージからインストールする

Docker のリポジトリを使用して Docker Engine をインストールできない場合は、 リリース用の .debファイルをダウンロードして手動でインストールすることができる。 Docker をアップグレードするたびに、新しいファイルをダウンロードする必要がある。

  1. https://download.docker.com/linux/ubuntu/dists/ に行き Ubuntu バージョンを選択して、pool/stable/ をブラウズして amd64armhfarm64、または s390x を選択し、インストールしたい Docker Engine バージョンの .deb ファイルをダウンロードします。
  2. Docker Engine をインストールし、以下のパスを Docker パッケージをダウンロードしたパスに変更します。
    $ sudo dpkg -i /path/to/package.deb
    Docker デーモンが自動的に起動します。
  3. hello-world イメージを実行して、Docker Engine が正しくインストールされていることを確認します。
    $ sudo docker run hello-world
    このコマンドは、テスト・イメージをダウンロードし、コンテナ内で実行します。コンテナが実行されると、メッセージを出力して終了します。

Docker Engine がインストールされて実行されています。 docker グループは作成されますが、ユーザは追加されません。 sudo を使用してDockerコマンドを実行する必要があります。 特権のないユーザが Docker コマンドを実行できるようにするための Linux のインストール後の手順と、その他のオプションの設定手順に進みます。

Docker エンジンをアップグレードする

Docker Engine をアップグレードするには、新しいパッケージファイルをダウンロードし、新しいファイルを指定してインストール手順を繰り返します。

便利スクリプトを使用してインストールする

Docker は、get.docker.com で、 Docker を開発環境に迅速かつ非インタラクティブにインストールするための便利なスクリプトを提供しています。 便利なスクリプトはプロダクション環境には推奨されていませんが、 ユーザのニーズに合わせたプロビジョニングスクリプトを作成するための例として使用することができます。パッケージリポジトリを使用してインストールするためのインストール手順については、リポジトリを使用したインストール手順も参照してください。 スクリプトのソースコードはオープンソースであり、 GitHub の docker-install リポジトリにあります。

ローカルで実行する前に、インターネットからダウンロードしたスクリプトを必ず確認してください。 インストールする前に、便利スクリプトの潜在的なリスクと制限についてよく理解してください。

  • スクリプトを実行するには、root 権限または sudo 権限が必要です。
  • このスクリプトは、お使いの Linux ディストリビューションとバージョンを検出し、パッケージ管理システムを設定しようとするもので、ほとんどのインストール・パラメーターをカスタマイズすることはできません。
  • スクリプトは、確認を求めることなく依存関係と推奨事項をインストールします。ホスト・マシンの現在の構成によっては、多数のパッケージがインストールされる場合があります。
  • デフォルトでは、スクリプトは Docker、containerd、runc の最新安定リリースをインストールします。このスクリプトを使用してマシンをプロビジョニングすると、Docker の予期しないメジャーバージョンのアップグレードが発生する可能性があります。本番システムにデプロイする前に、テスト環境で (メジャー) アップグレードを必ずテストしてください。
  • スクリプトは、既存の Docker インストールをアップグレードするようには設計されていません。スクリプトを使用して既存のインストールを更新する場合、依存関係が期待されたバージョンに更新されない可能性があり、古いバージョンが使用される原因となります。

:::important ヒント: 実行前にスクリプトステップをプレビューする DRY_RUN=1 オプションを指定してスクリプトを実行すると、インストール時にスクリプトが実行するステップを確認できます。

$ curl -fsSL https://get.docker.com -o get-docker.sh
$ DRY_RUN=1 sh ./get-docker.sh

:::

次の例では、get.docker.com からスクリプトをダウンロードして実行し、Dockerの最新の安定リリースをLinuxにインストールします。

$ curl -fsSL https://get.docker.com -o get-docker.sh
$ sudo sh get-docker.sh

Docker がインストールされている。Docker サービスは Debian ベースのディストリビューションで自動的に起動します。 CentOS、Fedora、RHEL、SLES などの RPM ベースのディストリビューションでは、 適切な systemctl または service コマンドを使用して手動で起動する必要があります。 メッセージが示すように、root 以外のユーザはデフォルトで Docker コマンドを実行できません。

:::important 非特権ユーザとして Docker を使用するか、ルートレスモードでインストールするには? インストールスクリプトには、Docker をインストールして使用するために root 権限または sudo 権限が必要です。 root 以外のユーザに Docker へのアクセスを許可したい場合は、 Linux のインストール後の手順を参照してください。 Docker は、root 権限なしでインストールすることも、 root なしモードで実行するように設定することもできます。 Docker を root なしモードで実行する方法については、 root 以外のユーザとして Docker デーモンを実行する (root なしモード)を参照してください。 :::

プレリリースをインストールする

Docker は test.docker.com で、Docker のプレリリースを Linux にインストールするための便利なスクリプトも提供しています。 このスクリプトは get.docker.com のスクリプトと同じですが、Docker の安定版とプレリリース (ベータバージョン、リリース候補) の両方を含むパッケージリポジトリから "test" チャネルを有効にするようにパッケージマネージャを設定します。 このスクリプトを使用して、新しいリリースに早期にアクセスし、安定版としてリリースされる前にテスト環境で評価します。

"test" チャネルから Linux に最新バージョンの Docker をインストールするには、次のコマンドを実行します。

$ curl -fsSL https://test.docker.com -o test-docker.sh
$ sudo sh test-docker.sh

便利スクリプトを使用した後に Docker をアップグレードする

便利スクリプトを使用して Docker をインストールした場合は、 パッケージマネージャを直接使用して Docker をアップグレードする必要があります。 便利スクリプトを再実行するメリットはなく、 ホストマシンにすでに追加されているリポジトリを再追加しようとすると問題が発生する可能性があります。

Docker Engine をアンインストールする

  1. Docker Engine、CLI、Containerd、Docker Compose パッケージのアンインストール

    $ sudo apt-get purge docker-ce docker-ce-cli containerd.io docker-compose-plugin
  2. ホスト上のイメージ、コンテナ、ボリュームまたはカスタマイズされた構成ファイルは、自動的には削除されません。すべてのイメージ、コンテナおよびボリュームを削除する手順は、次のとおりです。

    $ sudo rm -rf /var/lib/docker
    $ sudo rm -rf /var/lib/containerd

編集した設定ファイルは手動で削除する必要があります。

次のステップ

cublas の使い方メモ

この記事は書きかけです。

cublasSetMatrix()

cublasStatus_t
cublasSetMatrix(int rows, int cols, int elemSize,
const void *A, int lda, void *B, int ldb)

ホストメモリー上の行列 A から、GPU メモリー上にある行列 Brow × col の要素をコピーする関数。 各要素は elemSize バイトであり、行列は列優先で格納され、 先頭の次元はそれぞれ ldaldb で指定する。

参考: https://docs.nvidia.com/cuda/cublas/index.html#cublassetmatrix

自作 gem の作り方

gem を作成 (bundle gem)

gem_name という gem のテンプレートを作成する場合は以下を実行します。

bundle gem gem_name

bundle gem のオプション

bundle gem にはオプションが存在します。

詳細またはその他のオプションを知りたい場合は Bundler: bundle gem を参照してください。

オプション説明
--exe, -b, --bingem にバイナリ実行ファイルを含めます。
--extgem に C 拡張を含めます。
--mitプロジェクトを MIT ライセンスにします。
--cici サービスを設定します。
--linterリンターとフォーマッターを指定します。

例: リンターに rubocop を使用し、MIT ライセンスでコマンドを含み、C 言語拡張を含む myapp という gem を作成する場合

bundle gem myapp --exe --ext --mit --ci=github --linter=rubocop

プロジェクトの構造

上記コマンドで生成したプロジェクトの構造は以下のようになっています。

myapp
├── Gemfile
├── LICENSE.txt
├── README.md
├── Rakefile
├── bin
│   ├── console
│   └── setup
├── exe
│   └── myapp
├── ext
│   └── myapp
│   ├── extconf.rb
│   ├── myapp.c
│   └── myapp.h
├── lib
│   ├── myapp
│   │   └── version.rb
│   └── myapp.rb
├── myapp.gemspec
└── sig
└── myapp.rbs

各ディレクトリーは以下のようになっています。

  • lib/: ライブラリーのコード (require で呼び出される)
  • ext/: C 言語のソースコード (インストール時にコンパイルされ、require で呼び出される)
  • exe/: コマンドがある

myapp.gemspec がもっとも重要なファイルで、gem の構成が定義されています。 基本的に上記 3 つのディレクトリー (C 言語を使用しない場合は、2 つのディレクトリー) の中にあるファイルと gemspec ファイルを編集します。(必要に応じて Rakefile や README.md も編集します。)

Gemfile は編集しないでください。

gemspec の編集

gem を作るために myapp.gemspec を編集する必要があります。

TODO のある行やホームページの行をコメントアウトし、spec.summary の設定を行えば最低限動作します。

必須である項目を以下に示します。

  • spec.name
  • spec.version
  • spec.authors
  • spec.summary

bundle install コマンドを実行し、エラーがなければ問題ありません。

依存パッケージの追加

gemspec に以下のように追記して依存している gem を追加できます。

spec.add_dependency "example-gem", "~> 1.0"

gemspec に以下のように追記し開発時に必要な gem を追加できます。

spec.add_development_dependency "example-gem", "~> 1.0"

詳しくは、class Gem::Specification (Ruby 3.1) リファレンスマニュアルlibrary rubygems (Ruby 3.1 リファレンスマニュアル) を参照してください。

bundle install

bundle install を実行することで、Gemfile および gemspec に記述されている gem がインストールされます。

バージョンの変更

バージョンは、lib/myapp/version.rb に定義されています。

コンパイル

以下のコマンドを実行し、C 拡張をコンパイルします。 このコマンドの実行により、共有ライブラリー lib/myapp/myapp.so が生成されます。

rake compile

コンパイル後、gem に含まれるコマンド実行すると、 エラーなく実行されます。

bundle exec myapp

C 拡張

C 言語で Ruby を拡張することができます。

たとえば、/etc/myapp/myapp.c を以下のように変更します。

void
Init_myapp(void)
{
rb_mMyapp = rb_define_module("Myapp");
+ rb_p(rb_str_new2("Hello, world!"));
}

rake compile でコンパイルを行い、bundle exec myapp を実行すると、"Hello, world!" と表示されます。

この例は、C 言語から Ruby の C API を呼び出し表示するプログラムで、

p "Hello, world!"

と同等です。

Ruby の C API だけではなく、コンピューターにインストールされている共有ライブラリーを扱うことができるため、ラッパーを作成することが可能です。

また、C 拡張により計算が必要な場合に高速化することができます。

ライブラリーの作成

lib/myapp.rb あたりを編集。

新しいファイルを作成した場合は、git add する必要があります。

gem をインストール (rake install)

プロジェクト内の gem がインストールされます。

rake install

gem を公開 (rake release)

gem を公開するには、rubygems のアカウントを作成する必要があります。 リリースするたびに、バージョンを変更する必要があります。

rake release

gem パッケージを生成 (rake build)

プロジェクトから pkg/myapp-x.x.x.gem が作成されます。

rake build

Ubuntu 系の Linux ディストリビューションの自作方法

概要

  1. iso ファイル (ディスクイメージ) を展開
  2. squashfs ファイル (/ の中、ファイルシステムイメージ) を展開
  3. (2.) で展開してものに対し、カスタマイズするためのスクリプトを適用
  4. (3.) から squashfs を作成 (mksquashfs コマンド)
  5. (4.) を (1.) に入れて、チェックサムやファイルサイズ、パッケージのリストを更新
  6. (5.) を iso ファイルを作成 (xorriso コマンドを使用)

この流れで、Ubuntu の改造ディストリビューションを作成できます。

用意するもの

  • Ubuntu のイメージ

必要なパッケージのインストール

sudo apt install cd-boot-images-amd64 xorriso

パッケージがないとかでインストールができない場合は以下を実行し再度実行してください。

echo "deb http://cz.archive.ubuntu.com/ubuntu jammy main" | sudo tee -a /etc/apt/sources.list
sudo apt update

展開とマウント

# DISK_IMAGE はディスクイメージのパスです。
DISK_IMAGE=/mnt/d/ubuntu-22.04-desktop-amd64.iso

# RELEASENOTE_URL はリリースノートの URL です。
RELEASENOTE_URL="http://"

# 作業ディレクトリーの作成
mkdir ~/my-distribution
cd ~/my-distribution

# ディスクイメージのシンボリックリンクを作成します。
ln -s $DISK_IMAGE image.iso

# ディスクイメージをマウント
# 警告が出ますが無視してください。
mkdir mnt
sudo mount -o loop image.iso mnt

# ディスクイメージのコピー
# マウントした場所は書き換えができないのでコピーします。
# ただし、ディストリビューションのファイルシステムである /casper/filesystem.squashfs は除外してコピーします。
mkdir disk
rsync -P -a --exclude=/casper/filesystem.squashfs mnt/ disk

# ファイルシステムイメージのマウント
mkdir mntfs
sudo mount -t squashfs -o loop mnt/casper/filesystem.squashfs mntfs

# ファイルシステムをコピー
# マウントした場所は書き換えできないので、コピーします。
mkdir squashfs
sudo rsync -P -a mntfs/ squashfs

# マウントは不要になったのでアンマウントします。
sudo umount mntfs
sudo umount mnt
rm -r mntfs mnt

# シンボリックリンクも不要なので削除します
rm image.iso

# リリースノートの URL を設定します。
echo $RELEASENOTE_URL | sudo tee disk/.disk/release_notes_url

# ディスク情報を設定します。
today=$(date +"%Y%m%d")
echo -n "MyDistribution 22.04 LTS \"Jammy Jellyfish\" - Release amd64 ($today)" | tee
echo -n "MyDistribution 22.04 LTS \"Jammy Jellyfish\" - Release amd64 ($today)" | sudo tee disk/.disk/info

# インストーラーの言語を日本語に設定します。
cat | sudo tee -a disk/preseed/ubuntu.seed <<EOF
d-i debian-installer/language string ja
d-i debian-installer/locale string ja_JP.UTF-8
d-i keyboard-configuration/layoutcode string jp
d-i keyboard-configuration/modelcode jp106
d-i keyboard-configuration/layout select Japanese
d-i keyboard-configuration/variant select Japanese
EOF

# grub.cfg の日本語化
splash=$(echo "splash --- debian-installer/language=ja" \
"debian-installer/locale=ja_JP.UTF-8" \
"keyboard-configuration/layoutcode?=jp" \
"keyboard-configuration/modelcode?=pc105")
sudo sed -i "s#splash ---#$splash#" disk/boot/grub/grub.cfg

カスタマイズするためのスクリプトの割り当て

# MyDistribution.sh は Ubuntu をカスタマイズするスクリプトです。
chroot squashfs /bin/bash MyDistribution.sh

ファイルシステムの作成

# パッケージ一覧を書き込み
sudo chroot squashfs/ dpkg-query -W --showformat='${binary:Package}\t${Version}\n' |\
tee disk/casper/filesystem.manifest

# ファイルシステムのサイズを書き込み
sudo du -B 1 -s squashfs/ | cut -f1 | sudo tee disk/casper/filesystem.size

# ファイルシステムのイメージ化
sudo mksquashfs squashfs/ disk/casper/filesystem.squashfs -xattrs -comp xz
sudo rm disk/casper/filesystem.squashfs.gpg

# md5sum.txt を出力
cd disk
find . -type f -not -name 'md5sum.txt' -not -path './boot/*' -not -path './EFI/*' -print0 | xargs -0 md5sum | sudo tee md5sum.txt
md5sum ./boot/memtest86+.bin | sudo tee -a md5sum.txt
md5sum ./boot/grub/*.cfg | sudo tee -a md5sum.txt
cd ..

ディスクイメージの作成

VOLUME_ID="MyDistribution"
OUTPUT_ISO="mydistribution-22.04-desktop-amd64.iso"

xorriso \
-as mkisofs \
-volid "$VOLUME_ID" \
-o "$OUTPUT_ISO" \
-J -joliet-long -l \
-b boot/grub/i386-pc/eltorito.img \
-no-emul-boot \
-boot-load-size 4 \
-boot-info-table \
--grub2-boot-info \
--grub2-mbr /usr/share/cd-boot-images-amd64/images/boot/grub/i386-pc/boot_hybrid.img \
-append_partition 2 0xef /usr/share/cd-boot-images-amd64/images/boot/grub/efi.img \
-appended_part_as_gpt \
--mbr-force-bootable \
-eltorito-alt-boot \
-e --interval:appended_partition_2:all:: \
-no-emul-boot \
-partition_offset 16 \
-r \
disk/

QEMU で起動してみる

QEMU をインストールしていない場合

sudo apt install -y qemu-system-x86

LiveCD を起動する

sudo qemu-system-x86_64 -m 4G -cdrom mydistribution-22.04-desktop-amd64.iso -boot d --enable-kvm -usb -smp 6

仮想ディスクにインストールする場合

qemu-img create -f qcow2 disk.qcow2 32G
sudo qemu-system-x86_64 -hda disk.qcow2 -m 4G -cdrom mydistribution-22.04-desktop-amd64.iso -boot d --enable-kvm -usb -smp 6

Firefox のビルドをインストール

Ubuntu 22.04 は snap 版の Firefox がインストールされているらしく、 環境によって起動ができなかったので、ビルド済み Firefox のインストールの方法をメモ。

apt / snap 版の Firefox のアンインストール

sudo apt purge firefox
sudo snap remove firefox

Firefox のビルドをインストール

# ダウンロード
wget "https://download.mozilla.org/?product=firefox-latest-ssl&os=linux64&lang=ja" --trust-server-names

# 展開
tar xvf firefox-*.tar.bz2

# 配置
sudo cp -r firefox /usr/lib

# 実行ファイルのシンボリックリンクを作成
sudo ln -s /usr/lib/firefox/firefox /usr/bin/firefox

# デスクトップファイルをダウンロードし配置
sudo mkdir -p /usr/share/applications
sudo wget https://bit.ly/3Mwigwx -O /usr/share/applications/firefox.desktop

Ubuntu で gsettings を使用し Dock の設定を行う

スクリプトで Dock の設定したいときや、SSH で設定したいときに使う。

Dock を自動的に隠す

設定する値説明
true自動的に隠さない
false自動的に隠す

例: Dock を自動的に隠す

# 現在の設定
$ gsettings get org.gnome.shell.extensions.dash-to-dock dock-fixed
true

$ gsettings set org.gnome.shell.extensions.dash-to-dock dock-fixed false

パネルモード

Dock を画面の端まで引き伸ばして表示。

設定する値説明
true引き延ばさない
false引き延ばす

例: パネルを引き延ばさない

# 現在の設定
$ gsettings get org.gnome.shell.extensions.dash-to-dock extend-height
true

$ gsettings set org.gnome.shell.extensions.dash-to-dock extend-height false

アイコンサイズの変更

設定する値説明
数値アイコンサイズ

例: アイコンサイズを 30 に変更

# 現在の設定
$ gsettings get org.gnome.shell.extensions.dash-to-dock dash-max-icon-size
48

$ gsettings set org.gnome.shell.extensions.dash-to-dock dash-max-icon-size 30

Dock の表示位置を変更

「設定」では設定ができない 'TOP' が設定可能。上に微妙な隙間ができる。

設定する値説明
LEFT
BOTTOM
RIGHT
TOP

例: Dock の表示位置を下に設定

# 現在の設定
$ gsettings get org.gnome.shell.extensions.dash-to-dock dock-position
'LEFT'

$ gsettings set org.gnome.shell.extensions.dash-to-dock dock-position 'BOTTOM'

ゴミ箱の表示

設定する値説明
true表示
false非表示

例: ゴミ箱を非表示に設定

# 現在の設定
$ gsettings get org.gnome.shell.extensions.dash-to-dock show-trash
true

$ gsettings set org.gnome.shell.extensions.dash-to-dock show-trash false

OpenLDAP の slappasswd で生成される SSHA とは

slappasswd コマンドとは

slappasswd コマンドは OpenLDAP 用のパスワードを生成するコマンドで、 デフォルトでは SSHA を用いて、パスワードをハッシュ化する。

認証の仕組み

SSHA では生成されたハッシュの末尾 4 バイトがソルトとなっており、 入力されたパスワードと保存されているソルトからハッシュを生成し、 保存されているハッシュと一致するかどうかで認証を行う。

以下のプログラムでは、 適切なパスワード (例: admin) を与えると、元のハッシュと生成されたハッシュが一致する。

require 'base64'
require 'digest'

pass = 'admin'
ssha = '{SSHA}23AUBfRZytVFNpe7onuFhyCSJOHRzCWh'
ssha =~ /{.+}(.+)/
salt256s = Base64.decode64(Regexp.last_match(1)).unpack('C*')[-4..-1]

salt = salt256s.pack('C*')
b_ssha = Digest::SHA1.digest(pass + salt)
Base64.strict_encode64(
(b_ssha.unpack('C*') + salt256s).pack('C*')
)

Blog 環境の移行

ブログの環境を jekyll から Docusaurus に移行しました。 アクセスの多い記事に関しては jekyll から移行予定です。

Python で極値の検出

概要

信号の極値を検出する。

信号の生成

例として疑似的な信号を生成する。

  • 3 [Hz] の信号 + 0.01 [Hz] の信号 + ノイズ
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from scipy import signal

t = np.arange(30 * 100) / 100
x = np.sin(2 * np.pi * t / 3) + np.random.randn(len(t)) * 0.2 + np.sin(2 * np.pi * t / 100)
df = pd.DataFrame({'Data': x}, index=pd.to_datetime(t, unit='s').time)

fig, ax = plt.subplots()
df.plot(ax=ax, xlim=['00:00:00', '00:00:10'])
plt.show()

tmp

信号の性質を調べる

def acorr(df: pd.DataFrame, ra: int = 3, fs=100):
x = np.correlate(df.Data.values, df.Data.values, mode='full')
t = (np.arange(len(x)) - len(x) / 2 + 0.5) / fs
x /= x.max()
fig, ax = plt.subplots()
ax.set_xlim(-ra, ra)
ax.set_ylim(0, 1)
ax.plot(t, x)
ax.set_title('Autocorrelation')
ax.grid(axis='x')
ax.set_xticks(np.linspace(-ra, ra, 2 * ra + 1))
plt.show()

acorr(df)

主な信号は 1/3 [Hz] であることがわかる。そのため、1/3 [Hz] でローパスフィルターをかける。

tmp

ローパスフィルターをかけ、極値の検出

ローパスフィルターをかけ、極値を検出できるようにする。

1/3 [Hz] でローパスフィルターをかけても正しく検出されない場合は、 周波数を下げていく。

tmp

fs = 10
lpf = 0.1
b, a = signal.butter(5, lpf / fs * 2, 'low')
df['Filter'] = signal.filtfilt(b, a, df.Data.values)
max_idx = signal.argrelmax(df['Filter'].values)
min_idx = signal.argrelmin(df['Filter'].values)

df['max_index'] = False
df.iloc[max_idx[0], 2] = True
df['min_index'] = False
df.iloc[min_idx[0], 3] = True

fig, ax = plt.subplots()
df.plot(ax=ax)
ax.set_xlim(['00:00:00', '00:00:30'])
ax.scatter(
df.loc[df['max_index'], ['Filter']].index,
df.loc[df['max_index'], ['Filter']],
color='tab:orange',
zorder=3)
ax.scatter(
df.loc[df['min_index'], ['Filter']].index,
df.loc[df['min_index'], ['Filter']],
color='tab:green',
zorder=3)
plt.show()