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

NMF (HALS) の実装

· 約1分
ひかり
Main bloger
import numpy as np

X = np.array([[1, 1], [2, 1], [3, 1.2], [4, 1], [5, 0.8], [6, 1]])

n_components, n_samples, n_features, = (2,) + X.shape
W = np.random.uniform(size = (n_samples, n_components))
H = np.random.uniform(size = (n_components, n_features))

eps = 1e-4

# NMF
for i in range(100):
# update B
A = X.T.dot(W)
B = W.T.dot(W)
for j in range(n_components):
tmp = H[j, :] + A[:, j] - H.T.dot(B[:, j])
H[j, :] = np.maximum(tmp, eps)

# update A
C = X.dot(H.T)
D = H.dot(H.T)
for j in range(n_components):
tmp = W[:, j] * D[j, j] + C[:, j] - W.dot(D[:, j])
W[:, j] = np.maximum(tmp, eps)
norm = np.linalg.norm(W[:, j])
if norm > 0:
W[:, j] /= norm

print(W)
print(H)
print(W.dot(H))

WSL2 で DNS サーバーを設定する

· 約1分
ひかり
Main bloger

/etc/resolv.conf の自動生成の無効化

/etc/wsl.conf を以下のように編集する。

[network]
generateResolvConf = false

/etc/resolv.conf の作成

例えば、DNS サーバーが 1.1.1.1 のとき、/etc/resolv.conf は以下のように編集する。

nameserver 1.1.1.1

削除されないように

WSL2 を再起動すると /etc/resolv.conf が削除されるので、削除されないようにする。

sudo chattr +i /etc/resolv.conf

参考サイト

brew 環境下で nokogiri をインストールできないとき

· 約1分
ひかり
Main bloger

以下の二つのエラーが出た。

zlib is missing; necessary for building libxml2
xslt is missing. Please locate mkmf.log to investigate how it is failing.

解決法

  • libxslt, libxml2 をインストール
  • brew でインストールされている libxml2 のパスを指定
brew install libxslt libxml2
bundle config build.nokogiri --use-system-libraries --with-xml2-include=$(brew --prefix libxml2)/include/libxml2

参考サイト

Windows の OpenSSH で Permission denied が出る原因

· 約1分
ひかり
Main bloger
  • パスワードでのログインは可能 (ただし、設定で無効化している)
  • 公開鍵認証で Permission denied が出る

実際に localhost:22 に接続すると、

hikari@localhost: Permission denied (publickey,keyboard-interactive).

とエラーが出る。

image

原因

Administrators グループ、つまり「管理者ユーザー」はデフォルトで、C:\ProgramData\ssh\administrators_authorized_keys の公開鍵を 参照して認証しているようだ。

これを、$env:userprofile\.ssh\authorized_keys に変更する。

解決法

管理者権限で C:\ProgramData\ssh\sshd_config を開き、以下のように下の二行をコメントする。

image

- Match Group administrators
- AuthorizedKeysFile __PROGRAMDATA__/ssh/administrators_authorized_keys
+ #Match Group administrators
+ # AuthorizedKeysFile __PROGRAMDATA__/ssh/administrators_authorized_keys

保存が終わったら、サービスを再起動する。

Restart-Service sshd

termux に powerline をインストールする

· 約1分
ひかり
Main bloger
pkg install golang

powerline のインストール

あとは、Powerline のインストール方法とほぼ同じ

go get -u github.com/justjanne/powerline-go

.profile に設定

~/.profile を開き、以下を追加する。

GOPATH=$HOME/go
function _update_ps1() {
PS1="$($GOPATH/bin/powerline-go -newline -error $?)"
}
if [ "$TERM" != "linux" ] && [ -f "$GOPATH/bin/powerline-go" ]; then
PROMPT_COMMAND="_update_ps1; $PROMPT_COMMAND"
fi

フォントの設定

例として、yuru7/PlemolJP をインストールする。

wget https://github.com/yuru7/PlemolJP/releases/download/v0.4.0/PlemolJP_NF_v0.4.0.zip
unzip PlemolJP_NF_v0.4.0.zip
cp PlemolJP_NF_v0.4.0/PlemolJP35Console_NF/PlemolJP35ConsoleNF-Medium.ttf $HOME/.term
ux/font.ttf
rm PlemolJP_NF_v0.4.0 -rf
rm PlemolJP_NF_v0.4.0.zip

termux に ssh する

· 約1分
ひかり
Main bloger
pkg install openssh

エラーが出る場合

Android 版の termux で実行するとエラーが起こるので、 既存の termux を削除し Github から termux をインストールすることをおすすめします。

サーバーの起動

sshd

公開鍵の設定

クライアントの公開鍵 (~/.ssh/id_*.pub) を termux の ~/.ssh/authorized_keys に追加する。

公開鍵はメールで自分宛てに送ったり、twitter の DM で自分宛てに送ったりして、コピペすると楽。

# 例:
echo ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKYztjZfIVMl5o0J2DrigTsl1XgbSKMUgYCpfOfhMtmw hikari@B450M-K >> ~/.ssh/authorized_keys

ログイン

# スマホの ip アドレスを確認
ip a

ssh 192.168.x.x -p 8022

Windows の OpenSSH でパスワード認証を無効にする

· 約1分
ひかり
Main bloger

管理者権限でターミナルを開く

設定ファイルを編集するために管理者権限が必要なため、管理者権限でターミナルを開く。

ターミナルのアイコンを右クリックして、ターミナルを右クリックして、「管理者として実行」

image

image

ターミナルで設定ファイルを開く

notepad C:\ProgramData\ssh\sshd_config

を実行。

image

設定ファイルを編集

- # PasswordAuthentication yes
+ PasswordAuthentication no

image

image

に変更し上書き保存する。

SSH サーバーの再起動

ターミナルに戻り、以下のようにコマンドを実行し、SSH サーバーを再起動する。

Restart-Service sshd

接続テスト

設定が有効になっているかテストする。

ssh localhost

を実行し、

user@localhost: Permission denied (publickey,keyboard-interactive).

のようになっていれば OK

SSH トンネル

· 約2分
ひかり
Main bloger

ローカルポート転送

ssh -L [クライアントのポート]:[転送したいホスト]:[転送したいホストのポート]

クライアント A、SSH サーバー B、転送ホスト C があり C:8080 を A のポート 80 に転送したい場合。

ssh -L80:C:8080 B

この転送で、A から http://localhost へアクセスすると、 B の http://C:8080 と同じ内容が表示される。

まとめると、 A から C は見えなくても、A から B へ SSH が接続でき、 B から C が見える場合、B を経由して C のポートを A へ転送可能。

-g をつけると、A のホスト名で A のネットワークにあるパソコンから C:8080 へアクセスができる。

家のネットワーク上にあるポートを外部に転送したいとき、 とりあえず 22 番だけ外部に開放している状態であれば、 ssh 経由で家のネットワークにアクセス可能。

リモートポート転送

ssh -R [クライアントのポート]:[転送したいホスト]:[転送したいホストのポート]

ローカル転送と異なり、 接続先から見えるポートを転送するのではなくクライアント側から見える ポートを転送する。

クライアント B、SSH サーバー A、転送ホスト C があり C:8080 を A のポート 80 に転送したい場合。

ssh -R80:C:8080 A

この転送で、A から http://localhost へアクセスすると、 B の http://C:8080 と同じ内容が表示される。

B が外からアクセスできない場合でも、 B と A の接続を確立させれば、 C の内容を A に転送可能。 B を直接操作できない場合に使うことが多く、 B と A の接続が切れるトラブルが発生した場合、A から C へのアクセスが不可能になるので、B と A の接続が切断された場合に自動的に再接続するツール autossh が使われることが多い。

Powerline のインストール方法

· 約1分
ひかり
Main bloger

Go のインストール

powreline-go のインストールのために Go をインストールする。

brew install go

Powerline-go のインストール

go get -u github.com/justjanne/powerline-go

設定

Bashrc

Vim とか nano とかで ~/.bashrc を開き、以下を追加する。

GOPATH=$HOME/go
function _update_ps1() {
PS1="$($GOPATH/bin/powerline-go -newline -error $?)"
}
if [ "$TERM" != "linux" ] && [ -f "$GOPATH/bin/powerline-go" ]; then
PROMPT_COMMAND="_update_ps1; $PROMPT_COMMAND"
fi

source ~/.bashrc を実行すると変更が適応される。

フォント

一応これで終了だが、文字化けする場合がある。 Powerline に対応したフォントを設定する必要がある。 Windows では、Cascadia Code PL とか、Cascadia Mono PL とかが使える。

おすすめは、https://github.com/yuru7/PlemolJP/ の PlemolJP。 ダウンロードは、 https://github.com/yuru7/PlemolJP/releases の PlemolJP_NF_vX.X.X.zip をクリックし、ダウンロードし展開してフォントをインストール。 フォントの設定は、PlemolJP35 Console NF とする。

Arduino で delay() を使わない

· 約1分
ひかり
Main bloger

Arduino で delay() を使うと、待機時間中に何もできない。 millis() を使用した 1 秒周期の LED 点滅するプログラムを作った。

  1. millis() で時間を取得し時間で割って、t に代入
  2. 前回の t と新たな t を比較して異なる場合に関数を実行

unsigned long t = 0, ot;

void setup(){
pinMode(LED_BUILTIN, OUTPUT);
}

void loop() {
ot = t;
t = millis() / 500;
if(ot != t){
if(t % 2){
digitalWrite(LED_BUILTIN, LOW);
}else{
digitalWrite(LED_BUILTIN, HIGH);
}
}
}