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

SSH トンネル

ローカルポート転送​

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 のインストール方法

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() を使わない

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);
}
}
}

モニター無しで Raspberry Pi のセットアップ

モニター不要で Raspberry Pi のセットアップ方法の説明。

  • 有線での接続が必要なため、LAN ケーブルを接続できる Raspberry Pi 端末であること
  • Raspberry Pi を操作するためのパソコンが必要

Raspberry Pi Imager をインストールし、OS を選択。書き込み先の micro SD を選択し、WRITE で書き込む。

Raspberry Pi Imager

設定

SSH の有効化​

SSH を有効にすることで外部から Raspberry Pi の操作が可能

micro SD カードを挿し直し、直下に ssh という名前でテキストファイルを作成。拡張子は不要。

Raspberry Pi enable SSH

VNC の有効化​

config.txt を開き、

framebuffer_width=1280
framebuffer_height=720

のコメントを外し上書き保存。

Raspberry Pi enable VNC

起動​

micro SD カードを Raspberry Pi に挿し、電源を接続し起動する。

SSH で接続​

ホスト名は raspberrypi、ユーザー名は pi、パスワードは raspberry で接続

Raspberry Pi connect SSH

パッケージの更新​

sudo apt update
sudo apt upgrade -y

VNC の有効化​

sudo raspi-config

Raspberry Pi config

3 Interface Options を選択し、P3 VNC を選択し、YES。Finish で閉じる。

VNC で接続​

Raspberry Pi VNC viewer

ユーザー名、パスワードは SSH のときと同様。

Raspberry Pi VNC connected

Wi-Fi の有効化​

VNC から Wi-Fi を有効にすることで有線接続が不要となり、電源のみで Raspberry Pi を操作することが可能。

Webrick で rbenv 経由でインストールした Ruby の CGI が動かない場合の対処法

ブラウザで CGI を実行すると、 /usr/bin/env: 'ruby': No such file or directory とエラーが出る

#!/usr/bin/env ruby

# ...

原因

$PATH が設定されていない。

#!/usr/bin/env bash

echo -ne "Content-type: text/html\n\n"
echo $PATH

とすると、

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

と表示され、Ruby のあるディレクトリーがないことがわかる。

対処法

:CGIPathEnv で Ruby のパスを設定する。

srv = WEBrick::HTTPServer.new({
:DocumentRoot => "./site/",
:Port => 8080,
:CGIPathEnv => ENV["PATH"]
})

gem 作り方

テンプレートの作成​

bundle gem <GEM 名> -t
cd <GEM 名>

Gemspec の編集​

  1. <GEM 名>.gemspec を開く。
  2. spec.summary、spec.description、spec.homepage、 を編集する
  3. spec.metadata["allowed_push_host"] にホームページの URL を記述
  4. spec.homepage に Gem のページを記述
  5. spec.metadata["source_code_uri"] にリポジトリの URL を記述
  6. spec.metadata["changelog_uri"] に changelog.md の URL を記述

最低限このくらい設定する。

GitHub に push しインストール​

git init
git add .
git commit -mFirst\ Commit
git remote add origin [email protected]:<ユーザー名>/<GEM 名>.git
git push -u origin master

インストール​

gem install specific_instal
gem specific_install -l "git://github.com/<ユーザー名>/<GEM 名>.git"

Gemfile​

gem "<GEM 名>", github: "<ユーザー名>/<GEM 名>.git", branch: :main

ターミナル上で画像を表示するコマンド

ターミナル上で画像を表示する tiv コマンドの紹介。

tiv

ファイルエクスプローラー開くのがめんどくさいときに良い。

git clone https://github.com/stefanhaustein/TerminalImageViewer.git
cd TerminalImageViewer/src/main/cpp
make -j
sudo make install

Bash でユークリッド互除法

  1. A と B の余り C

  2. B と C の余り D

  3. C と D の余り E

    ...

  4. X と Y の余り 0

    となったときの Y の値が最大公約数。

Bash のスクリプト

#!/usr/bin/env bash

function gcd(){
test $2 -eq 0 && echo $1 || gcd $2 $(($1 % $2))
}

gcd 1071 1029
# 21