それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

Cloudflareのリクエストがまれに、500エラーになるので調べていた.

結論から言うと。Apacheが、H2をリッスンできなくて詰んでた

Cloudflare の 500 エラーになる。

Cloudflareのリクエストがまれに、500エラーになるので調べていたら

Cloudflare→nginx→ apache とリバプロを構成しているのが原因らしい。 そしてさらにエラーを見ていると http/2 のリクエストが一部エラーになっている。

HTTP/2の捌き方の問題。

cloudflare側がhtttp/2でリクエストを投げてくるのだが、こちらが非対応であればCloudflare側が制御してエラーが出ないようにしてくれる。しかし、Cloudflare側の制御が間に合わなくて500エラーになることが多いようですね。

リクエスト1000件に対して、約10%がエラーになっていました。

CloudflareのCDNのうち、10%に設定ミスがあるようで、HTTP/2をうまく捌いてくれないようでした。

http_upgrade

そこで、リバプロを構成しているnginx をhttp_upgrade を有効にして

proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";

本体であるApacheに、h2 のプロトコルを捌くよう設定した

<VirtualHost *:443 >
  Protocols http/1.1 h2c h2

これで、cloudflareの500エラーが大幅に減った。

cloudflareの500エラーについてはいろいろと原因が考えられるが、調べているとCloudflareも完璧ではないことがわかる。

コマンドが含まれるパッケージを探す。apt-file

このコマンドは、どのパッケージ?

「えっと、いつも使うコマンド入れたいんだけど」というときに、パッケージ名とコマンド名が違う事がある。そのときにいちいちGoogle検索がだるいので、Aptで検索したい。

コマンドやファイルががどのパッケージに含まれるか検索する apt-file

ファイル一覧から検索してくる。

インストール

sudo apt install apt-file
sudo apt-file update

実際使った例

$ apt-file search qemu-img
qemu-utils: /usr/bin/qemu-img
qemu-utils: /usr/share/man/man1/qemu-img.1.gz

apt-file 自身を apt-file で探してみるなど。

$ apt-file search apt-file
aide-common: /usr/share/aide/config/aide/aide.conf.d/31_aide_apt-file
apt-file: /etc/apt/apt.conf.d/50apt-file.conf
apt-file: /usr/bin/apt-file
apt-file: /usr/share/apt-file/is-cache-empty
apt-file: /usr/share/bash-completion/completions/apt-file
apt-file: /usr/share/doc/apt-file/NEWS.Debian.gz
apt-file: /usr/share/doc/apt-file/README.md.gz
apt-file: /usr/share/doc/apt-file/changelog.gz
apt-file: /usr/share/doc/apt-file/copyright
apt-file: /usr/share/doc/apt-file/examples/60disable-contents-fetching.conf
apt-file: /usr/share/doc/apt-file/examples/apt-file-2-update.sh
apt-file: /usr/share/doc/apt-file/examples/apt-file.conf
apt-file: /usr/share/man/man1/apt-file.1.gz
cruft-common: /usr/lib/cruft/filters-unex/apt-file
fish-common: /usr/share/fish/completions/apt-file.fish
live-build: /usr/share/live/build/hooks/normal/0400-update-apt-file-cache.hook.chroot
open-infrastructure-system-build: /usr/share/live/build/hooks/normal/0400-update-apt-file-cache.hook.chroot
zsh-common: /usr/share/zsh/functions/Completion/Debian/_apt-file

だたし、特徴のないコマンド名だと大変よ。

$sudo apt-file search dig

dig だと大量の出力 がやばい

digest とか digital までヒットしちゃう。

$sudo apt-file search dig
zfs-dkms: /usr/src/zfs-0.8.3/module/icp/api/kcf_digest.c

コマンド名が短いとき本当に大変です。

コマンドを検索したいときは bin とかつけたほうが良さそう。

takuya@ubuntu01:~$ sudo apt-file search /bin/dig
bind9-dnsutils: /usr/bin/dig
digikam: /usr/bin/digikam
digikam: /usr/bin/digitaglinktree
digitemp: /usr/bin/digitemp_DS2490
digitemp: /usr/bin/digitemp_DS9097
digitemp: /usr/bin/digitemp_DS9097U
golang-golang-x-tools: /usr/bin/digraph
tomcat9-common: /usr/share/tomcat9/bin/digest.sh

dpkg -L / -S  もいい

dpkg -S $(which lsusb)
dpkg -L util-linux | grep bin/

なぜ再びかいたのか

自分で過去にメモをブログに投稿していたけど、検索で出てこないし、サイト内検索でマッチしなかったので、再度書くことにした。Googleさんは過去記事をインデックスから削除して存在しないことにするからまじ困る。

関連資料

https://takuya-1st.hatenablog.jp/entry/2016/06/03/000000

wget が ipv6 につないでしまう。aliasでIPv4 に限定する

wget が v6アドレスを使ってしまう。

wgetで、v6アドレスを呼びに行ってしまう。NTTの壊れたフレッツ v6 ネットワークで大問題が起きている。

IPoEに早く対応させたほうがいいけど。v6のアドレスをIoT家電が山盛りの家庭内に頒布するのは躊躇われる。

wget をv4アドレスに限定する。

alias wget='wget --inet4-only'

wgetrc を書く方法もある。

参考資料

https://techpiezo.com/linux/wget-force-ipv4-ipv6-connection/

ddしたイメージを qcow / vmdk に変換する

dd イメージは、raw イメージと呼びます。

raw イメージでググれば出てきます。

qemu-img convert -f raw dd-rescued.img -O qcow2 output-qcow.img

ポイント -f でインプット側のフォーマットを指定する。dd したデータは raw です。

参考資料。

http://www.tuxfixer.com/convert-qcow2-to-raw-image-raw-to-qcow2-image/

wsl でリモートのX11転送を行う。

windowsx11 転送

windows とWSL で X11 転送をやりたいなと。xming とか cygwin でやってたけど、WSLでもできるのでやってみた

手順

  • vcxsrv をインストール
  • Xlaunch を設定
  • wsl に x11-appsを犬
  • DISPLAY設定
  • 起動

準備 ( vcxsrv )

vcxsrv を使います。

choco install vcxsrv

Xlaunch を初期設定。

Xlaunch を起動します

f:id:takuya_1st:20201108134402p:plain

ウインドウをタイプを聞かれたら、Multipleにしておくと無難。

f:id:takuya_1st:20201108134416p:plain

タスクバーにXが常駐したら準備完了

f:id:takuya_1st:20201108134712p:plain

WSL側から使えるようにする

sudo apt install x11-apps

DISPLAY 環境変数を設定する。

echo 'export DISPLAY=localhost:0.0' >> ~/.bashrc
source ~/.bashrc

ローカルX11準備完了を確認

いったん、ローカルで、X11-app を起動してチェックする。

takuya@wsl : xeyes
takuya@wsl : xcalc

f:id:takuya_1st:20211209151405p:plain

ssh でX転送する

ssh -X user@myserver

適当なX11アプリを起動する

takuya@myserver $ xeyes
takuya@myserver $ nautilus
takuya@myserver $ virt-manager

f:id:takuya_1st:20201108135030p:plain

これでVirt-managerをリモート転送で使えました。

2021-12-09 追記

X11 forwarding がエラーになった。 f:id:takuya_1st:20211209150539p:plain

Warning: No xauth data; using fake authentication data for X11 forwarding.
X11 forwarding request failed on channel 0

対策 クライアント側

ログイン時にエラー・メッセージが次のとき

 No xauth data; using fake authentication data for X11 forwarding.
xauth generate $DISPLAY

対策 sshd_config 側

ログイン時に、エラー・メッセージが次のとき

X11 forwarding request failed on channel 0

ssh サーバー側の設定で次の設定を入れる。

X11UseLocalhost no

この設定で

X11 forwarding request failed on channel 0

これで再度動くようになった。

2021-12-09 追記

  • ローカルでの動作チェックについて追記
  • フルスクリーンへのリンクを作成
  • サーバー側設定を追記

chocolatey でインストール済みのパッケージを一覧する。

chocolately でインストールしたソフトを表示したい。

表示の仕方をいつも忘れるのでメモしておく。

choco list --localonly

インストール済みの一覧をふだん見ることはないんだけど、Windowsのインストール済みソフトの管理を見ていると、あれこれってchoco install してたっけと考え直すことがあるので。

choco でインストールしたはずだけど、きえてたりするのもあって、記憶が曖昧になってるときに使える。

実際の動作例

PS C:\WINDOWS\system32> choco list --localonly
Chocolatey v0.10.15
autohotkey 1.1.33.02
autohotkey.install 1.1.33.02
barrier 2.3.2
chocolatey 0.10.15
chocolatey-core.extension 1.3.5.1
chocolatey-windowsupdate.extension 1.0.4
cpu-z 1.94.0.20201009
cpu-z.install 1.94.0.20201106
docker-desktop 2.4.0.0
DotNet4.5.2 4.5.2.20140902
foxitreader 10.1.0.37527
git 2.26.2
git.install 2.26.2
gpg4win-vanilla 2.3.4.20191021
hyper 3.0.2
KB2919355 1.0.20160915
KB2919442 1.0.20160915
KB2999226 1.0.20181019
KB3033929 1.0.5
KB3035131 1.0.3
mamp 4.2.0
mattermost-desktop 4.4.2
mingw 8.1.0
nodejs 14.6.0
nodejs.install 14.6.0
obs 0.659.20200402
obs-studio 25.0.8
obs-studio.install 25.0.8
openvpn 2.4.7
putty 0.74
putty.portable 0.74
pyenv-win 1.2.4.20200318
python 3.8.5.20200721
python3 3.8.5.20200721
rlogin 2.25.0
selenium 3.141.59
selenium-chrome-driver 83.0.4103.39
selenium-chromium-edge-driver 81.0.416.77
selenium-ie-driver 3.150.1
slack 4.6.0
teraterm 4.105
vcredist140 14.26.28720.3
vcredist2015 14.0.24215.20170201
vcredist2017 14.16.27033
virt-viewer 8.0.256
vlc 3.0.10
vscode 1.45.1
vscode.install 1.45.1
winrar 5.91.0.20200917
winscp 5.17.6
winscp.install 5.17.6
Xming 6.9.0.31
52 packages installed.
PS C:\WINDOWS\system32> choco search virt

choco したパッケージの更新(アップグレード)ーself all

chocolately 便利ですよね。

chocolately のパッケージ管理とインストールが便利なので、Windowsを使うときはいつも使っています。

chocolately 自身の更新

chocolately を使って、chocolately を更新できます。

choco upgrade chocolately 

self-upgrade ができるのはとても便利。

インストール済みのパッケージをすべてアップグレードする

更新作業をアプリ毎にされるのはめんどくさいので、まとめてアップグレードしてしまいます。

このコマンドで、すべてのchocolately インストール済みパッケージを更新できます。

choco upgrade all

でかけている間に終わらせたいときは、すべてをyes としておく

choco upgrade all -y

これで、chocolately をつかったパッケージを便利地に使えるようになります。

こうなると、ブラウザでファイルをダウンロードしてインストールが煩わしく感じますね。

参考資料

https://chocolatey.org/courses/installation/upgrading

https://chocolatey.org/docs/commandsupgrade

エポスカード

広告です。

エポスカード(まるい)

エポスカード(EPARK)

WSLでWindowsのパスとLinuxのパスを変換

WSLのパスを変換したい。

WindowsUbuntuのパスを相互に変換できたら、シェルスクリプトとか作るのに便利ですよね。

調べたら、できるので歓喜した

wsl wslpath PATH

WindowsLinux

WindowsのパスをWSL のLinuxのパスに変換する

C:\Users\takuya>wsl wslpath  C:/Users/takuya/Desktop/
/mnt/c/Users/takuya/Desktop/

Linuxwindows

Linux のパスをWindowsに変換する。

C:\Users\takuya>wsl wslpath -w /mnt/c/Users/takuya/Desktop/
C:\Users\takuya\Desktop

コマンドプロンプト(PS)以外

上記の例は、コマンドプロンプト( cmd.exe ) と PowerShell( PS ) で動作させているのですが。

WSLのBashの中からどうやってやるのかとなると、少しめんどくさい。

/mnt/c/windows/system32/wsl.exe wslpath -w /mnt/c

このようにして、直接指定しないとWSLのBashにはWindowsへの$PATHが通ってないので、手軽には使えない。

PATHを設定して通せばいいかというと、WSLからWindowsへのPATHをつけると色々不便なのでAliasくらいがいいのではないでしょうか。

phpで'rm -rf'で再帰的に空じゃないフォルダを消す。

php で rm -rf をする方法を探してた

PHPの組み込み機能をすごく上手につかった方法を発見したのでメモ。

<?php
function rm_rf($dir){
  $entries = new RecursiveIteratorIterator(
    new RecursiveDirectoryIterator($dir, RecursiveDirectoryIterator::SKIP_DOTS),
    RecursiveIteratorIterator::CHILD_FIRST
  );
  
  foreach ($entries as $entry) {
    $func = ($entry->isDir() ? 'rmdir' : 'unlink');
    $func($entry->getRealPath());
  }
  rmdir($dir);
}

これを使うと、再帰的な削除でドットファイル再帰的な関数呼び出しも発生しない。頭いいなぁ。と思う。

RecursiveDirectoryIteratorで、ドット除去したファイル一覧を取得して、 RecursiveIteratorIterator::CHILD_FIRSTで、引数に指定されたディレクトリを最後に回す。

そうすると、foreach だけですべて削除が完成する。よく考えてある。というか RecursiveIteratorIteratorはそのためにあったんだと感心する。

以前の資料

php rmdir() で空じゃないフォルダを消すには? - それマグで!

gitlab をインストールしたらクローラー拒否を忘れずに

gitlab をインストールしたら、クローラー設定を拒否しとこう

GitLabをオンプレミスでインストールするときは、たいてい他社・他人に見られたくないレポジトリだったりするので、存在を検索に出したくないので 念の為にクローラーを切っていおくのがいいと思う。

対象ファイル。

/opt/gitlab/embedded/service/gitlab-rails/public/robots.txt
takuya@:nginx$ sudo cat /opt/gitlab/embedded/service/gitlab-rails/public/robots.txt
# See http://www.robotstxt.org/robotstxt.html for documentation on how to use the robots.txt file
#
# To ban all spiders from the entire site uncomment the next two lines:
User-Agent: *
Disallow: /

Windows のDHCPと固定(static)をコマンドで切り替える。

windows の netsh で dhcp と固定IPを切り替えられる。

DHCP固定IPアドレスを切り替えができるようになるので手軽に、IPをオンオフするプログラムを使わずとも、コマンドラインで完結する。

ただし、DHCPをオフにしてしまうと、DNSサーバーとデフォルトゲートウェイが変わってしまうので注意が必要。

現在の設定を確認する。

netsh interface ip show config  eth01

Configuration for interface "eth01"
    DHCP enabled:                         No ### 
 ( 略

DHCPをONの状態からオフにする。

DHCPをオフにすると、GatewayDNSも消えちゃうので、ちゃんと自分でやる必要があったので注意。

netsh interface ip set address eth01 static 192.168.11.189/24 gateway=192.168.11.1
netsh interface ip set dnsservers eth01 static 192.168.11.1 primary yes

DHCP をONにする。

IPアドレスの固定と一緒に覚えておく必要があります。

 netsh interface ip set address eth01 dhcp
 netsh interface ip set dnsservers eth01 dhcp

DNS を固定・DHCP切り替える。

DNSを固定からDHCPの経由からのオファーに切り替える。

 netsh interface ip set dnsservers eth01 dhcp

DNSDHCPオファーから、固定に切り替える

netsh interface ip set dnsservers eth01 static 192.168.11.1 primary yes

DHCPの切り替えはちょっとめんどくさいかも

わたしは、普段LinuxサーバーなどはDNSを固定で運用しているのですが、Windowsなどは完全にDHCPからのオファーを使うことにして dhcp を設定ています。

固定IPに変えるとDNSが固定になるのは、DHCPがそういうものなので仕方がないのです。

Windowsの1つのNICに複数のIPアドレスを割り当てる。

windows でも ip addr add したい。

macLinux を使っていると、 ip addr add のようなコマンドで、一つのネットワークカード(イーサネット・アダプタ)に、複数のIPアドレスを割り当てることが出来ます。

linux での例

Linux では設定を書き換えなくても、次のコマンドで手軽に、IPを追加することが出来ますよね。

ip addr add 192.168.1.10/24 dev eth1
ip addr add 192.168.2.10/24 dev eth1
ip addr add 192.168.4.10/24 dev eth1

また、IPごとにゲートウェイを変えることができるので、便利なんですが。。。

Windowsでも同じことがしたい

Windowsでも、ネットワーク・アダプタに複数のIPアドレスを割り当てたい。ネットワークを構築しているといちいち差し替えるのがだるいので、同じようなことがしたいなと思っていた。

windows 特有の制限(DHCPオフでStaticが必須・管理者)

DHCPをオンにしたままでは、複数のIPを追加できません。(やり方はあるだろうけど、netsh で単純にやるのは不可能に近いと思います。)

Linuxだと、DHCPをオンにしたままで、IPアドレスを追加することが出来ますが、Windowsでは出来ないようです。いったん、Staticに変えてあげる必要があります。

また、ネットワークの設定変更には管理者権限が必要です。

PS C:\Users\takuya> netsh interface ipv4 add address name=eth01 address=192.168.4.1 mask=255.255.255.0
The requested operation requires elevation (Run as administrator).

netshを使って、IPアドレスを複数割り当てる。

IPアドレスを、一つに複数を追加することが出来ます。

このコマンドを実行するとStatic設定になります。DHCPと共存が出来ません。

DHCP取得済みのIPアドレスデフォルトゲートウェイは削除されます。DHCPデフォルトゲートウェイと通信できなくなるので注意してください。

PS C:\WINDOWS\system32> netsh interface ipv4 add address name=アダプタ名 address=192.168.5.1 mask=255.255.255.0

管理者権限で、IPアドレスを追加する。

PS C:\WINDOWS\system32> netsh interface ipv4 add address name=eth01 address=192.168.5.1 mask=255.255.255.0

ゲートウェイを正しく設定し直す。

Staticになるので、デフォルトゲートウェイが消えちゃうので、デフォルトゲートウェイを設定し直す。

PS C:\WINDOWS\system32> netsh interface ipv4 add route 0.0.0.0./0 'my-eth01' 192.168.11.1

または

route add 0.0.0.0/0 192.168.11.1

DHCPがオフになっちゃうので結局は、ゲートウェイを設定しなくちゃいけないんですよね。Windows のネットワークのDHCPとStatic の排他処理はなんとかならないものか。

省略形

引数名を明示しなくても、順番で指定できる、またネットマスクも省略できる。

netsh interface ipv4 add address name=アダプタ名 address=192.168.5.1 mask=255.255.255.0
netsh interface ipv4 add address アダプタ名  192.168.5.2/24 

消す(利用後)

netsh interface ipv4 delete address eth01 192.168.5.2

使いにくい・・・慣れよう

linux の ip addr add みたいにアドレスを手軽に追加できないのが辛い。DHCPをオフにしてデフォルトゲートウェイゲートウェイの設定をし直ししなくちゃいけないのが辛い。

うまくメトリックを調整できればいいんだけど。

windows のdhcp と固定を 切り替える。

windows のネットワークを切り替えをコマンドプロンプトでやる。

DHCPのオンと、固定IP(static) をWindowsのコントロールパネルからポチポチ切り替えるのがめんどくさい。

マウス移動多すぎるし、コントロールパネルが「設定」に隠れて探しくくなって手間が多い。

Windowsネットワークアダプタを固定IPにする。

PS C:\WINDOWS\system32> netsh interface ipv4 set address name=eth01 static 192.168.5.100 255.255.255.0 192.168.5.1

name=名前で利用する、アダプタ名称は、netsh interface ipv4 show ineterfaces / netsh interface ipv4 show config のコマンドで事前に調べておく。

DHCP を有効にする。

PS C:\WINDOWS\system32> netsh interface ipv4 set address name=eth01 dhcp

DHCPをオンにして自動取得するようにするは、次のコマンドを使う。

set dhcp したら、即座にDHCPの取得が始まる。ipconfig renew をしなくてもいい。

name は省略可能なので、もっとシンプルに書ける。

name=XXX の部分の name は省略が可能なので、もっとシンプルに書くことが出来てわかりやすく、覚えやすくなる。

PS C:\WINDOWS\system32> netsh interface ipv4 set  address eth01 static 192.168.5.100 255.255.255.0 192.168.5.1

PS C:\WINDOWS\system32> netsh interface ipv4 set  address eth01 dhcp

これで、コマンドの窓の履歴から、矢印キーとEnterで切り替えと有効化を連続して試せるようになり、ネットワークを扱うときに格段に楽になります。

windows のネットワーク・デバイス名をnetshで変更する。

windows のネットワークのデバイス名を変更する。

netsh を使って、Windowsのアダプタ(ネットワークインタフェース)の名称を、手軽に変更することが出来ます。

C:\Users\takuya> netsh interface set interface name='旧名称' newname='新名称'

ネットワークの名称はそのままだと、日本語だったり、イーサネットXXのようなわかりにくい名前なので、xNIXライクに、ethX のような名前に変更したら便利かもしれないとおもってやってみました。ネットワークアダプタのデフォルト名称が本当にわかりにくくて、複数のLANポートを持っていると混乱するのでわかりやすい名前をつけておけばWindowsも使いやすくなるのではないでしょうか。

変更前の状態

PS C:\Users\takuya> netsh interface ipv4 show interfaces

Idx     Met         MTU          State                Name
---  ----------  ----------  ------------  ---------------------------
  1          75  4294967295  connected     Loopback Pseudo-Interface 1
 20          25        1500  disconnected  Wi-Fi
 14          25        1500  connected     イーサネット
  8          65        1500  disconnected  Bluetooth ネットワーク接続 2

変更します。

PS C:\Users\takuya> netsh interface set interface name='イーサネット' newname='eth01'

変更後の状態

PS C:\Users\takuya> netsh interface ipv4 show interfaces

Idx     Met         MTU          State                Name
---  ----------  ----------  ------------  ---------------------------
  1          75  4294967295  connected     Loopback Pseudo-Interface 1
 20          25        1500  disconnected  Wi-Fi
 14          25        1500  connected     eth01
  8          65        1500  disconnected  Bluetooth ネットワーク接続 2

ipv4 を指定しましたが、ipv6 のアダプタ名も併せて変わっています。

v6 を指定して interface 一覧を出力すると、こちらも変わっています。

PS C:\Users\takuya> netsh interface ipv6 show interfaces

Idx     Met         MTU          State                Name
---  ----------  ----------  ------------  ---------------------------
  1          75  4294967295  connected     Loopback Pseudo-Interface 1
 20          25        1500  disconnected  Wi-Fi
 14          25        1500  connected     eth01
  8          65        1500  disconnected  Bluetooth ネットワーク接続 2

コントロールパネルでも確認できます。

f:id:takuya_1st:20201025154020p:plain

netsh でインタフェースの名前を変えることが出来ました。

ただし、windowsLinuxなどとは管理体系が似ているようで異なるので、ちょっと癖があります。

とくに、netsh interface で ipv4 /ipv6 を指定するが、設定がどちらにも影響するのがちょっと不自然なコマンドな気がしますね。