No Such Blog or Diary

«Prev || 1 | 2 | 3 |...| 59 | 60 | 61 || Next»

pdf のページ数を確認するワンライナー

ls *.pdf | python3 -c 'import PyPDF2;import sys;[print("{} {}".format(PyPDF2.PdfFileReader(open(file.strip(), mode="rb")).getNumPages(),file.strip())) for file in sys.stdin.readlines()]'

しばしばお世話になる pdftools の使ってる PyPDF2 ライブラリを呼ぶ感じでテキトウに.とりあえず動けばいい.

追記:PdfFileReader が Obsolete ということで,PdfReader を使って書き換え:

ls *.pdf | python3 -c 'import PyPDF2;import sys;[print("{} {}".format(len(PyPDF2.PdfReader(open(file.strip(), mode="rb")).pages),file.strip())) for file in sys.stdin.readlines()]'

read コマンドを少しまともに使う

タブ区切りのフィールドを,タブ以外はそのままに読み込んで flds という配列に入れてもらう:

while IFS=$'\t' read -a flds; do echo ${flds[0]}; ...; done

IFS をちゃんと指定しておかないと空白まで消えちゃうので注意なのと,-a オプションで配列に入れてもらえるので便利なのと.ここらは今までちゃんと使えていなかったのでメモ.

固定幅の行番号を付けたかった

cat -n で行番号を付けられるけど,固定幅でゼロ埋めした番号がほしいときには悩ましい.どうしましょ? とりあえず awk で行番号と入力を printf すりゃどうとでもなるけれど……

ということで調べたら nl コマンド使って nl -nrz -w3 -ba とかで行けるっぽい.なるほど.

でもまあ,覚えるのめんどくさいから awk でいいかなという気もする.

WSL2 内から Windows をスリープする

リモートから自宅の Windows マシンを叩き起こしたときに再度スリープさせるのをどうしようかなと思ってたけど,よく考えたら WSL2 内から Windows のコマンドを実行できるんだから普通に PowerShell 使って寝かせればよかった:

PowerShell.exe -Command 'Add-Type -Assembly System.Windows.Forms;[System.Windows.Forms.Application]::SetSuspendState("Suspend", $false, $false);'

とりあえずちゃんと寝てくれたのでこれで良いのだろう.

WSL2 で CUDA 使ってみた

Win11 に上げたので WSL2 から CUDA が使えるだろうと,https://docs.nvidia.com/cuda/wsl-user-guide/index.html を参考に WSL2 に CUDA を入れてみた.書かれているコマンドをそのままバージョンだけ 11.5 に変えて:

wget https://developer.download.nvidia.com/compute/cuda/repos/wsl-ubuntu/x86_64/cuda-wsl-ubuntu.pin
sudo mv cuda-wsl-ubuntu.pin /etc/apt/preferences.d/cuda-repository-pin-600
wget https://developer.download.nvidia.com/compute/cuda/11.5.0/local_installers/cuda-repo-wsl-ubuntu-11-5-local_11.5.0-1_amd64.deb
sudo dpkg -i cuda-repo-wsl-ubuntu-11-5-local_11.5.0-1_amd64.deb
sudo apt-key add /var/cuda-repo-wsl-ubuntu-11-5-local/7fa2af80.pub
sudo apt-get update
sudo apt-get -y install cuda

そしてサンプルをビルド&ラン(書き込み権限がないので手元にコピーして):

cp -r /usr/local/cuda-11.5/samples/4_Finance ./
cp -r /usr/local/cuda-11.5/samples/common ./
cd 4_Finance/BlackScholes
make BlackScholes
../../bin/x86_64/linux/release/BlackScholes

ちゃんと動きましたとさ.めでたし.まあ,サンプルを動かさずとも nvidia-smi を実行して GPU が見えてれば問題ない気もする.

Ubuntu 20.04.3 LTS を OpenVPN サーバにしてみた

L2TP/IPsec ももう古いかなということで,OpenVPN で VPN サーバを用意してみた.とりあえず,コミュニティの How to の Installing OpenVPN を見つつテキトウに,Win と Android からつながるところまでやってみた.

まず,openvpn と easy-rsa のパッケージをインストール.easy-rsa はマシン識別のための証明書などを自前でやるために使う.バージョンはそれぞれ 2.4.7-1 と 3.0.6-1 が入った.

sudo apt install openvpn easy-rsa

次に,証明書周りのセットアップを.そのためにまずは認証局の諸々のファイルを置く場所の作成と認証局の情報を書いたファイルを用意.

sudo mkdir /etc/openvpn/easy-rsa
sudo cp -r /usr/share/easy-rsa/* /etc/openvpn/easy-rsa/
cd /etc/openvpn/easy-rsa/
sudo cp vars.example vars

この vars ファイル内の変数 EASYRSA_REQ_(COUNTRY|PROVINCE|CITY|ORG|EMAIL) の辺りに自分の情報をテキトウに入れておく.

そして,認証局の初期化をして,認証局の証明書を作成.鍵のパスフレーズ(後で使う)を聞かれるのでテキトウに設定して,Common Name はテキトウに My-OpenVPN-CA とかで.

sudo ./easyrsa init-pki
sudo ./easyrsa build-ca

あと,DH のパラメータと HMAC 用の鍵を生成しておく:

sudo ./easyrsa gen-dh
sudo openvpn --genkey --secret /etc/openvpn/ta.key

次いで,サーバ(server)とクライアント(client1)の証明書を発行.面倒な場合は nopass をオプションにつければパスなしの証明書になる.パスをつけるならこのオプションを外す.最終的に証明書発行をするところで CA の鍵のパスフレーズを聞かれるので入れる.

sudo ./easyrsa build-server-full server nopass
sudo ./easyrsa build-client-full client1 nopass

次に,openvpn サーバの設定をする.サンプルファイルに説明があるのでそれを見れば良いけれど,必要なところだけ書くのをヒアドキュメントでコマンドにすると次のような感じ.これは,サーバの外向きネットワークが 192.168.1.0/24 で,そのインターフェースが eth0 で,VPN でつなげてきた連中は 10.8.0.0/24 の仮想ネットワークにつなげて NAPT するという設定.サーバのポートはデフォルトの 1194/udp で.

sudo tee /etc/openvpn/server.conf <<'EOS'
port 1194
proto udp
dev tun
ca /etc/openvpn/easy-rsa/pki/ca.crt
cert /etc/openvpn/easy-rsa/pki/issued/server.crt
key /etc/openvpn/easy-rsa/pki/private/server.key
dh /etc/openvpn/easy-rsa/pki/dh.pem
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist /var/log/openvpn/ipp.txt
push "route 192.168.1.0 255.255.255.0"
push "redirect-gateway eth0 bypass-dhcp"
keepalive 10 120
tls-auth /etc/openvpn/ta.key 0
cipher AES-256-GCM
user nobody
group nogroup
persist-key
persist-tun
status /var/log/openvpn/openvpn-status.log
verb 3
explicit-exit-notify 1
EOS

この設定だと NAPT が動いてくれないと困るので,そこらを有効化する(/etc/sysctl.conf で net.ipv4.ip_forward=1 として,iptables で 10.8.0.0/24 の IPマスカレードを有効化):

sudo sed -e 's/.*net.ipv4.ip_forward=.*/net.ipv4.ip_forward=1/' -i /etc/sysctl.conf
sudo iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -j MASQUERADE

1194/udp が開いてないなら開けておく.また,iptables の内容を保存しておくなら,iptables-persistent を入れて netfilter-persistent save しておく:

sudo apt install iptables-persistent
sudo service netfilter-persistent save

なお,ufw 使ってるときには /etc/ufw/sysctl.conf の方で net/ipv4/ip_forward=1 としてフォワーディングを有効化する.

これでサーバの準備ができたのでサービス起動:

sudo systemctl start openvpn

ログ確認(@server をつけないとサーバのログが見られない):

sudo journalctl -u openvpn@server

つぎに,クライアント側を準備.

Windows マシンの場合は,OpenVPN のクライアントをインストールする.https://openvpn.net/community-downloads/ から MSI installer を落として入れれば OK.32-bit 版か 64-bit 版か自分の環境にあったほうを.

そして、"C:\Program Files\OpenVPN\config\" に設定ファイルを置く.メンドイので WSL のコマンドとしてやれば次のとおり.192.168.1.132 としている部分はサーバの外側のアドレスで,FQDN でもよい.他のパラメータはサーバのパラメータと同じ感じで.

cd "/mnt/c/Program Files/OpenVPN/config"
cat > client1.ovpn <<'EOS'
client
dev tun
proto udp
remote 192.168.1.132 1194
resolv-retry infinite
nobind
persist-key
persist-tun
ca ca.crt
cert client1.crt
key client1.key
remote-cert-tls server
tls-auth ta.key 1
cipher AES-256-GCM
verb 3
EOS

さらに,同じディレクトリにサーバ上の以下のファイルを持ってくる(CA 証明書と,クライアント証明書と,HMAC 用鍵):

/etc/openvpn/easy-rsa/pki/ca.crt
/etc/openvpn/easy-rsa/pki/issued/client1.crt
/etc/openvpn/easy-rsa/pki/private/client1.key
/etc/openvpn/ta.key

これで Windows のクライアントの準備完了.あとは,クライアントの GUI を起動して,タスクトレイのアイコンから右クリックで「接続」でつながる.クライアントの証明書にパスをつけていた場合は,この接続時に入力することになる.

次に Android 用の準備.Android の場合は諸々をひとつのファイルに突っ込んだ設定ファイルを作る.基本的には,設定ファイルで ca, cert, key, tls-auth にファイル名を指定していた部分を,そのパラメータ名のタグで囲って中身を書く形になる.あと,key-direction 1 という新たなオプション項目を入れる(tls-auth の第二パラメータだったのを個別に書いたもの).

色々メンドイのでサーバ上にスクリプトを用意.192.168.1.132 としてる部分はサーバの外側のアドレスで,FQDN でもよい:

cd /etc/openvpn/easy-rsa/
cat > gen_ovpn.sh <<'EOF'
#!/bin/bash
if test ${EUID:-${UID}} != 0; then
  echo "run as root"
  exit 0
fi
if test $# -lt 1; then
  echo "Usage: $0 clientname"
  exit 0
fi
name=$1
cat <<'EOS'
client
dev tun
proto udp
remote 192.168.1.132 1194
resolv-retry infinite
nobind
persist-key
persist-tun
remote-cert-tls server
key-direction 1
cipher AES-256-GCM
verb 3
EOS
function inlining() {
  tag=$1
  file=$2
  echo "<${tag}>"
  cat "$file" | sed -e '/CERTIFICATE/,/CERTIFICATE/p;/PRIVATE KEY/,/PRIVATE KEY/p;/Static key/,/Static key/p;d'  
  echo ""
}
inlining ca /etc/openvpn/easy-rsa/pki/ca.crt
inlining cert "/etc/openvpn/easy-rsa/pki/issued/${name}.crt"
inlining key "/etc/openvpn/easy-rsa/pki/private/${name}.key"
inlining tls-auth /etc/openvpn/ta.key
EOF
chmod 744 gen_ovpn.sh

そして,サーバでクライアント(client2)の証明書を発行して,その証明書などを含んだ設定ファイル(client2.ovpn)をスクリプトに生成させる:

sudo ./easyrsa build-client-full client2
sudo ./gen_ovpn.sh client2 > client2_full.ovpn

あとは,このファイルを google drive 経由とかで Android へ持っていって,OpenVPN のオフィシャルの OpenVPN Connect のアプリを入れてそのファイルを登録すれば OK.接続はアプリの GUI でスイッチをポチるだけ.

なお,この 1ファイルに全部突っ込んだやつは Windows でも使える.

ということで,以上で OpenVPN サーバを用意できることが確認できた.めでたし.NAPT じゃなくてブリッジにするのはまた今度.

«Prev || 1 | 2 | 3 |...| 59 | 60 | 61 || Next»
Search
Feeds

Page Top