それマグで!

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

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

neovim で python3 の環境を安定的に運用するために pyenv/virtualenev 化した。

neovim と pyenv が同時にあると困る。

pyenv で version を切り替えた後に neovim を使おうとすると python3 系のpip モジュールが見つからなくて困る。

問題をもうちょっと詳しく

次のような状態になると、neovim がpython3 ネーヨ。とエラーになる。

pip install X.x.x
pip local X.x.x
nvim /path/to.py ##  動くには動くがneovim モジュール見つからない

原因と経緯

なんでこんな事が起きるのか。

  1. neovim でアレコレするには python3 が必要 ( pip install neovim )
  2. python3 は pyenv で管理されている。
  3. pyenv でバージョンを切り替える。
  4. pyenv local / virtualenv 環境下に pip install neovim しないと neovim がエラーになる

python3とneovim のプラグインを諦めて使うしないかなという解決策で凌いでいたが限界。

pyenv install に neovim.egg を入れていたけどそれも面倒。

解決策 neovimが virtualenv を使えばいいんだ。

nvim 側が、virtualenv のpython3を使えばいいんだと気づく。

neovim 専用の virtualenv を作り、nvim は init.vim で virtualenv を参照すればいい。

やりかた

pyenv を使って nvim 専用の virtualenv を作る。

必要なものをインストール

さいしょに、必要になるvenvを用意する。

pyenv と pyenv-virtualenv は brew でぱぱっと入れた。

brew install pyenv pyenv-virtualenv

venv を準備する。

pyenv virtualenv 3.7.2 nvim-python3
pyenv activate nvim-python3
pip install neovim

nvim 側が venv を使うようにする。

nvim 側でシェルから渡される $PYENV_ROOT の環境変数を用いて、python3 を指し示す。

~/config/neovim/init.vim

~/config/neovim/init.vim または ~/config/nvim/init.vim

"" for only neovim. in pyenv virtualenv named 'nvim-python3'
if has('nvim') && isdirectory( $PYENV_ROOT."/versions/nvim-python3" )
  let g:python3_host_prog = $PYENV_ROOT.'/versions/nvim-python3/bin/python'
endif

私は、設定をvim/neovim で適当にコピペで使いまわしつつ vimrc を あちこちで使い回せるように if 文を入れました。

最後に :checkheath

:checkhealth

f:id:takuya_1st:20190312174206p:plain

まぁ、起動するとエラーならなきゃOKですが。念の為。

コレの設定による効果

pyenv 切り替え後で neovimが壊れるとか気にしなくていいんです。

更新やインストールに対する心理的負荷が大幅に軽減されました。

まとめ

Python2.x 系のサポートを有効にする。

pyenv virtualenv 2.7.17 nvim-python2
pyenv activate nvim-python2
pip install --upgrade pip
pip install  neovim
pipenv which python 

Python3.x系のサポートを有効にする

pyenv virtualenv 3.7.4 nvim-python3
pyenv activate nvim-python2
pip install --upgrade pip
pip install  neovim
pipenv which python 

init.vim に追記する。

"" for only neovim. in pyenv virtualenv named 'nvim-python2'
if has('nvim') && isdirectory( $PYENV_ROOT."/versions/nvim-python3" )
     let g:python_host_prog = $PYENV_ROOT.'/versions/nvim-python2/bin/python'
endif
"" for only neovim. in pyenv virtualenv named 'nvim-python3'
if has('nvim') && isdirectory( $PYENV_ROOT."/versions/nvim-python3" )
     let g:python3_host_prog = $PYENV_ROOT.'/versions/nvim-python3/bin/python'
endif

バージョン番号は好きな番号でいい。

2019-05-17

パス修正

2020/08/15

python2 のバージョン使って、インストールしないと Deopleteがエラーになったので追記。

2021/05/18

pyenv virtualenv のインストールについて追記

参考資料

PHP Fatal error: Uncaught ErrorException: preg_replace(): JIT compilation failed: になる。

macOS でphp7.3 を homebrew で入れた場合に発生します。

ほんと、もうphpは。。。brew にちゃんとしたコンパイル設定を送ってよね。

PHP Fatal error:  Uncaught ErrorException: preg_replace(): JIT compilation failed:

no more memory in phar:///usr/local/Cellar/composer/1.8.4/bin/composer/vendor/symfony/console/Formatter/OutputFormatter.php:36

対症療法

php.ini ファイルに次の行を書き込む。

pcre.jit=0

まぁそのうち治るだろうから、 user.ini を使うといいと思う。私はそうした

だってphp.ini を書き換えたらもとに戻すの忘れそうだもの

真剣に治すとしたら

ビルドオプションを変えてビルドし直し。でしょうか。php7.3 の別バージョンを使うとか。それともphp7.2 を諦めて使うか、まぁソレくらいが無難ですかね。

参考資料

https://stackoverflow.com/questions/53690624/errors-installing-composer-on-macos-jit-compilation-failed

https://bugs.php.net/bug.php?id=77260

tcpdumpで 自分自身のIPへのパケットを見る( locahost / 自分のIP )

自分自身へのパケットをキャプチャする

sudo tcpdump -i lo

tcpdump を使えば、自分から自身の宛のパケット、つまりループバックアドレスへのパケットと、自分自身のIPへのパケットを見ることができる。

自分自身へのパケットとは

localhost 宛のパケット 。 ::1 とか 127.0.0.1 と、自分が持ってる自IPアドレス を指す。

自分自身が持ってるIPへのパケット

たとえば、自分のIPが 192.168.12.34 のとき、

ping 192.168.12.34 

このように自ホストIPから自ホストIPへのパケットの場合も含まれる。

明示したいとき

127.0.0.1/24 を除いて、自ホストIPへのパケットを見るときはこのようにする。

sudo tcpdump -i lo host 192.168.12.34

参考資料

https://stackoverflow.com/questions/3130911/tcpdump-localhost-to-localhost

mysql locahost の接続では、unix socket かTCPかを明示しないとsock エラーで混乱した

ローカルホストのmysql に接続するときに、次のようにすることが多かった。

mysql -h localhost

正直、これでつながってるから、TCPだと思ってた。

でも、繋がらないので驚いた。エラーをよく見るとmysql.sockって書いてある。 あれれTCP/IP接続じゃなーい?

ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)

衝撃の事実。いままでTCPだと思ってたものは unix socketでした。

今日ね、mysql をポート別にdocker で3つ起動てlocalhost側にdocker から公開したんですよ。 つながらないんです。

アレレと思って調べてたら。mysqllocalhost には明示しない限りUNIX ドメインソケットでつなぐんですって。

tcpでつながってると思いこんでたやつ

takuya@:~$ mysql -v -h localhost  
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [(none)]>

しかし、実際はTCPではなかった。

なんかうまくつながらない時があると思ってたけど

ERROR 2003 (HY000): Can't connect to MySQL server on 'localhost' (111 "Connection refused")
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)

あれれれれ、つながらない。

ポートを確認してみる。

つながらないからポートを確認してみると閉じてる。

takuya@:~$ sudo nmap 127.0.0.1 -p  3306

Starting Nmap 7.40 ( https://nmap.org ) at 2019-03-11 11:07 JST
Nmap scan report for localhost (127.0.0.1)
Host is up (0.000060s latency).
PORT     STATE  SERVICE
3306/tcp closed mysql

Nmap done: 1 IP address (1 host up) scanned in 0.34 seconds

ややこしいので整理する。

これはUNIX SOCK ファイル経由

takuya@:~$ mysql -v -h localhost
[mariadb] Password:

この接続はlocalhost にあるデフォルトのパス位置にある、sock ファイル

接続を調べてみた

## これはTCP
takuya@:~$ mysql -v -h localhost --protocol=TCP
## これはTCPじゃなさそう
takuya@:~$ mysql -v -h localhost -P 3306

これは、ポートを明示しているのでTCPと思いきや、UNIXだった(tcpdump で何も見えない。TCP接続に失敗後にフォールバック??)

localhost 宛のパケットを tcpdump -i lo  で見てたけど、パケットを送ってない。まさかのミステリー。

同一ホスト内でIPしてた場合。

これらは全部TCP

takuya@192.168.11.100:~$ mysql -v -h 192.168.11.100
takuya@192.168.11.100:~$ mysql -v -h 192.168.11.100 -P 3306 
takuya@192.168.11.100:~$ mysql -v -h 192.168.11.100 --port 3306 
takuya@192.168.11.100:~$ mysql -v -h 192.168.11.100 --port 3306 --protocol=TCP

tcpdump -i lo  で見てたけど、パケットが出てきたので、TCPだと思われる。

注意点

この実験をする前に、ユーザの接続権限を確認しておくこと。

mysql> select Host,User from mysql.user;
+-----------+------------------+
| Host      | User             |
+-----------+------------------+
| localhost | mysql.infoschema |
| localhost | mysql.session    |
| localhost | mysql.sys        |
| localhost | root             |
+-----------+------------------+
4 rows in set (0.00 sec)

root@localhost のように、localhost 限定だと、そもそもつながらない。

CREATE USEr 'takuya' identified by 'your pass'
RENAME USER 'takuya'@'localhost' TO 'takuya'@'%';
GRANT ALL PRIVILEGES ON * . * TO 'takuya'@'%';

結論

localhost への mysqlTCP接続(ポートを変えるなど)のとき --protocol=TCP をつける。のが今の所無難っぽい

そして、これはドキュメントを読んで、さらに調査が必要。

xml のシンタックスチェックを手早く行うコマンド

xmlシンタックスチェックは、xmllint で

apt install xmllint

だけど、シンタックスチェックがなにもないときに、余計な出力が多すぎる。

XMLシンタックスチェックを手早く行う

xmllint --noout sample.xml

これをすると、OKのときは、「なにもしない」ので、手軽にシンタックスがOKだとわかる。

OKの結果をどうしても結果を知りたいときは

xmllint --noout samplex.ml && echo syntax OK

関連資料

php/php-cliでプロジェクト単位(ディレクトリ単位)の設定を.user.iniで読み込ませる。

php でプロジェクト単位の設定を使いたい

php には、ディレクトリ単位で php の設定を変更する user.ini という特殊なファイルを使うことができる。

イメージとしては .htaccess のようなものでディレクトリに設置することでディレクトリ単位でphpの挙動を変更することが可能。

もし仮に、すべての設定を変更できてしまうと、セキュリティホールを作ったり、php自体の動作を変えてしまえるものなので、すべての変更をできるわけではないが。

php で .user.ini ファイルの使い方

プロジェクトのフォルダに、.user.ini ファイルを置いて 、中身はphp.ini の書き方で設定を上書きする。

これだけ。これでで SAPIの mod_php で使える。php-fcgi のような nginx + php-fpm や apache + php-fpm でもつかえるらしい。

で、コマンドのときはどうするの?

環境変数から指定できます。

たとえば、次のようにすると、カレントディレクトリにある .user.ini を読み込ませる事ができます。

PHP_INI_SCAN_DIR=.  php -i 

これは、bashrc などに記述して export することで別プロセスになっても使用可能です。

export PHP_INI_SCAN_DIR=.

実験してみよう

ここで、環境変数から書き換えを実験してみよう。

.php.user.ini ファイルを作る

date.timezone=UTC

指定して実行する。

takuya@ $ PHP_INI_SCAN_DIR=. php -i | grep timezone
Default timezone => UTC
date.timezone => UTC => UTC

何も指定しないとき

takuya@ $ php -i | grep time
Default timezone => Asia/Tokyo
date.timezone => Asia/Tokyo => Asia/Tokyo

.php.user.ini でいいの?

末尾さえ合ってたら、なんとなく読み込んでくれるんですよね。 conf.d の代わりにも使えそうですね。

takuya@ $ PHP_INI_SCAN_DIR=. php -i | grep ini
Configuration File (php.ini) Path => /usr/local/etc/php/7.3
Loaded Configuration File => /usr/local/etc/php/7.3/php.ini
Scan this dir for additional .ini files => .
Additional .ini files parsed => ./.php.user.ini
user_ini.cache_ttl => 300 => 300
user_ini.filename => .user.ini => .user.ini

PHP_INI_SCAN_DIR=. だけで動かないことも (2023-11-06追記)

PHP_INI_SCAN_DIR=.にすると、/etc/php/xxx/cli/php.ini が読み込まれないことがあるので、ちゃんとバージョンごとに設定する

export PHP_INI_SCAN_DIR=/etc/php/8.2/cli/:/etc/php/8.2/cli/conf.d:.

これめんどくさいんですよねぇ。なんかデフォルトで有効にする事できないのかなぁ。

.user.ini ファイルは便利

このように user.ini ファイルで、一時的な設定を記述することが可能である。

便利に使うと、プロジェクト単位で必要な php.ini の設定を .user.ini として管理できるので、TravisCI のような継続的インテグレーションにおける、自動テスト環境のphp.ini ファイルをいちいち書く必要もないし、Dockerfile でアレコレする必要もなくなる。

とりあえずファイルさえアレば動くというphpの良さが顕在化しているのが user.ini の魅力だと思う。

参考資料

https://stackoverflow.com/questions/41496727/how-to-force-php-cli-to-read-my-user-ini-file

ubuntu で vlanを使う( vconfig コマンド編 )/tcpdump でvlan 確認

最初にパッケージを用意する

sudo apt install vlan

タグVLANのためのインターフェース名を用意する

タグを貼り付けるインターフェース名を確認

ip  a
sudo vconfig add enp3s0 4

すると、enp3s0.4の vlan 専用インターフェースが作られる。 この状態では、このインターフェースから出ていくパケットはVLAN ID4が付与されている。

疎通を確認する。

このインターフェースにIPをつける

sudo ip addr add 10.0.0.4/24 dev enp3s0.4

IPが無事付与されたら、パケットを投げつけたいが、そのまえにルートを確認しておく

takuya@:~$ ip route 
default via 192.168.1.1 dev enp3s0 proto dhcp metric 100 
10.0.0.0/24 dev enp3s0.3 proto kernel scope link src 10.0.0.4

疎通確認の前に、経路を確認するのは、IPv4 を触る者の基本的な身だしなみ。

他のVLANマシン(VLANで疎通できるもの。)と通信をする。

ping 10.0.0.1 

疎通確認がとれたらおっけ。パケットが変なとこに行ってないかとかそういうのは、VLAN設定のところになるので割愛

ちゃんとVLANで通信しているかチェックしたいときはtcpdump

tcpdump でVLANのタグを確認できる。

sudo tcpdump -e -n icmp

tcpdump に -e オプションをつけることで、VLAN ID が出力されるので、表示からVLANのパケットをチェックすることができる。このやり方は嬉しい。 f:id:takuya_1st:20211129172404p:plain

参考資料

https://wiki.ubuntu.com/vlan

findコマンドで、実行可能ファイルだけを取り出す(権限・パーミッションで調べる)

find コマンドでパーミッションが実行のものを取り出す。

find $path -type f -executable 

実行可能なファイルを探すときに便利。

コマンドとして実行可能なファイルや、+x として executable の権限を付与されたファイルを探すのに便利。

他の解法

find -perm  755 

permission をそのものを調べる方法もあり。 perm をつければ権限を調べられる。

関連資料

すぐわかるfindコマンドの使い方 - それマグで!

参考資料

https://superuser.com/questions/38981/how-can-i-find-only-the-executable-files-under-a-certain-directory-in-linux

AESの速度議論のためには種類のCPUで、AESの速度を測定する。- intel arm mips

AES がどれくらいの速度で扱えるかを測定したい。

openssl speed -multi $CORES aes-128-cbc sha256

実験してみた

まずはIntelのCPUで実験

> cat /proc/cpuinfo  |
model name  : Intel(R) Core(TM) i7-6700 CPU @ 3.40GHz
flags       : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch invpcid_single ibrs ibpb stibp kaiser tpr_shadow vnmi flexpriority ept vpid fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm mpx rdseed adx smap clflushopt intel_pt xsaveopt xsavec xgetbv1 xsaves dtherm ida arat pln pts hwp hwp_notify hwp_act_window hwp_epp
bugs        : cpu_meltdown spectre_v1 spectre_v2 spec_store_bypass l1tf
> openssl speed -multi 8 aes-128-cbc sha256
OpenSSL 1.1.0j  20 Nov 2018
built on: reproducible build, date unspecified
options:bn(64,64) rc4(16x,int) des(int) aes(partial) blowfish(ptr)
compiler: gcc -DDSO_DLFCN -DHAVE_DLFCN_H -DNDEBUG -DOPENSSL_THREADS -DOPENSSL_NO_STATIC_ENGINE -DOPENSSL_PIC -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_MONT5 -DOPENSSL_BN_ASM_GF2m -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DRC4_ASM -DMD5_ASM -DAES_ASM -DVPAES_ASM -DBSAES_ASM -DGHASH_ASM -DECP_NISTZ256_ASM -DPADLOCK_ASM -DPOLY1305_ASM -DOPENSSLDIR="\"/usr/lib/ssl\"" -DENGINESDIR="\"/usr/lib/x86_64-linux-gnu/engines-1.1\""
aes-128 cbc     359078.48k   430352.34k   446573.69k   423978.37k   465998.75k   493221.99k
sha256          224244.06k   536218.13k   945057.87k  1299140.74k  1215522.99k  1242332.35k

Raspi3 4コアで実験

> cat /proc/cpuinfo  | grep model
processor   : 3
model name  : ARMv7 Processor rev 4 (v7l)
BogoMIPS    : 38.40
Features    : half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt vfpd32 lpae evtstrm crc32

> openssl speed -multi 4 aes-128-cbc sha256
compiler: gcc -DDSO_DLFCN -DHAVE_DLFCN_H -DNDEBUG -DOPENSSL_THREADS -DOPENSSL_NO_STATIC_ENGINE -DOPENSSL_PIC -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_GF2m -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DAES_ASM -DBSAES_ASM -DGHASH_ASM -DECP_NISTZ256_ASM -DPOLY1305_ASM -DOPENSSLDIR="\"/usr/lib/ssl\"" -DENGINESDIR="\"/usr/lib/arm-linux-gnueabihf/engines-1.1\""
aes-128 cbc     162479.43k   183362.99k   189770.67k   191614.29k   192888.83k   191987.71k
sha256           43623.56k   115694.68k   209662.38k   264529.58k   284770.30k   287719.42k

手元にあるルータでも試してみた。

root@tplinkc7v5:/etc/config# cat /proc/cpuinfo
system type     : Qualcomm Atheros QCA956X ver 1 rev 0
machine         : TP-LINK Archer C7 v5
cpu model       : MIPS 74Kc V5.0

root@tplinkc7v5:/etc/config# openssl speed  aes-128-cbc sha256
compiler: mips-openwrt-linux-musl-gcc -I. -I.. -I../include  -fPIC -DOPENSSL_PIC -DZLIB_SHARED -DZLIB -DOPENSSL_THREADS -D_REENTRANT -DDSO_DLFCN -DHAVE_DLFCN_H -I/build/openwrt-18.06/slaves/phase2/mips_24kc/build/sdk/staging_dir/target-mips_24kc_musl/usr/include -I/build/openwrt-18.06/slaves/phase2/mips_24kc/build/sdk/staging_dir/target-mips_24kc_musl/include -I/build/openwrt-18.06/slaves/phase2/mips_24kc/build/sdk/staging_dir/toolchain-mips_24kc_gcc-7.3.0_musl/usr/include -I/build/openwrt-18.06/slaves/phase2/mips_24kc/build/sdk/staging_dir/toolchain-mips_24kc_gcc-7.3.0_musl/include/fortify -I/build/openwrt-18.06/slaves/phase2/mips_24kc/build/sdk/staging_dir/toolchain-mips_24kc_gcc-7.3.0_musl/include -znow -zrelro -DOPENSSL_SMALL_FOOTPRINT -DHAVE_CRYPTODEV -DUSE_CRYPTODEV_DIGESTS -DOPENSSL_NO_ERR -DTERMIOS -Os -pipe -mno-branch-likely -mips32r2 -mtune=24kc -fno-caller-saves -fno-plt -fhonour-copts -Wno-error=unused-but-set-variable -Wno-error=unused-result -msoft-float -iremap/build/openwrt-18.06/slaves/phase2/mips_24kc/build/sdk/build_dir/target-mips_24kc_musl/openssl-1.0.2p:openssl-1.0.2p -Wformat -Werror=format-security -fstack-protector -D_FORTIFY_SOURCE=1 -Wl,-z,now -Wl,-z,relro -fpic -I/build/openwrt-18.06/slaves/phase2/mips_24kc/build/sdk/feeds/base/package/libs/openssl/include -ffunction-sections -fdata-sections -fomit-frame-pointer -Wall -DOPENSSL_BN_ASM_MONT -DSHA1_ASM -DSHA256_ASM -DAES_ASM
The 'numbers' are in 1000s of bytes per second processed.
type             16 bytes     64 bytes    256 bytes   1024 bytes   8192 bytes
aes-128 cbc      11853.28k    13028.85k    13314.53k    13352.39k    13424.46k
sha256            4376.05k     9761.24k    17090.33k    21060.47k    22263.52k

最近買ったJ5005のマシンでも試してみた。

cat /proc/cpuinfo 
processor   : 0
vendor_id   : GenuineIntel
model name  : Intel(R) Pentium(R) Silver J5005 CPU @ 1.50GHz
stepping    : 1
microcode   : 0x28
cpu MHz     : 972.719
cache size  : 4096 KB

flags       : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf tsc_known_freq pni pclmulqdq dtes64 monitor ds_cpl vmx est tm2 ssse3 sdbg cx16 xtpr pdcm sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave rdrand lahf_lm 3dnowprefetch cpuid_fault cat_l2 pti cdp_l2 ssbd ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid fsgsbase tsc_adjust smep erms mpx rdt_a rdseed smap clflushopt intel_pt sha_ni xsaveopt xsavec xgetbv1 xsaves dtherm ida arat pln pts umip rdpid arch_capabilities
aes-128 cbc     247540.61k   270574.27k   276258.99k   618936.32k   625180.67k   623241.90k
sha256          357970.44k   917322.11k  1770737.49k  2298001.41k  2424143.87k  2547853.99k

まとめ

簡単に数字だけ拾ってみる

cpu aes-128 cbc 16byte
Intel(R) Core(TM) i7-6700 359078.48k
Intel(R) Pentium J5005 247540.61k
ARMv7 Processor rev 4 (v7l) 162479.43k
MIPS 74Kc V5.0 11853.28k

やっぱりPC用のIntelのCPUは段違いに早いっすね。AESとsha256などOpenVPNとかHTTPSとかをIntel/AMD以外のCPUで扱うのは無理がありそう

ルーターにOpenWRTやDD-WRTを突っ込んだとしてもOpenVPNなど暗号化通信のスループットは全く期待できないと思われる。

IPSecOpenVPNとかの暗号化をつかった通信を一般ご家庭で試すにはPCのCPUを使うのが一番いい。 Livaのマシン買ってきてLinuxルータを作るのがいいだろうな

GigaEther が2本ついてるマシン

関連記事

CPUのAES暗号化速度をCPU組込のaesサポートのありなしで測定する。 - それマグで!

参考資料

https://systemausfall.org/wikis/howto/AES-Performance

JetBrainssのコマンドライン launcher を何度も導入し直すのが面倒なのでスクリプト書いた

WebStorm やPycharm をコマンドから呼べるヤツ

コマンドラインからPycharmを起動できるスクリプトはもともとサポートされていますが。

f:id:takuya_1st:20190130223525p:plain

Toolbox を使うとパスが飛びまくる

Jetbrains toolbox を使っていると、PATHがぜんぜんもうダメになって使い物にならない。

たとえば、2019-01-30 現在の pycharm の場所はこんなのになってる。

 '/Users/takuya/Library/Application Support/JetBrains/Toolbox/apps/PyCharm-P/ch-0/183.5153.39/PyCharm.app/Contents'

はぁめんどくさいなぁ。アップデート来るたびにコマンドラインの起動スクリプトを作り直しになるう。

通常で使ってる分にはあんまり問題はないのだけれど。Toolboxを使って自動アップデートにするとコマンドの作成がうまくいかない。

自前で作ることにした。

ポイントは --args で引数のパスを渡すところ

gist.github.com

このファイルを保存して実行すれば大丈夫。

使い方

curl -L http://j.mp/2TkW4uf > pycharm 
pycharm /usr/local/bin

これでオッケ

phpstorm が良ければ

curl -L http://j.mp/2TkW4uf > phpstorm
phpstorm /usr/local/bin

webstorm も rubymine も同じ感じで行けそう

mac にlsusb をインストール

mac で lsbusb をつい叩いてしまう

takuya@macos~$ lsusb
-bash: lsusb: コマンドが見つかりません

あああ、もう。慣れって怖い

mac で同様のコマンドはないのかとおもったら。

教えてもらった。

出来た!

system_profiler SPUSBDataType

あとは、これをAliasにして

alias lsusb='system_profiler SPUSBDataType'

これで困らないね。でも表示が冗長なんだよなぁ。

あれ、brew に面白いものが

ip コマンドみたいに、ダメ元で検索かけたら出てきた。

brew install lsusb

なんと、bash で記述された根性スクリプトだった。コレは楽しい。

sshサーバーに ユーザー名&IPアドレスで制限を掛ける

ユーザーのssh のアクセス制限をIPアドレスで掛けたい。

IPアドレスからのパスワード・アクセスを許可したり、ユーザーごとに許可したりは、Match条件できる。

Match User apache
    PasswordAuthentication yes
Match Address 192.168.10.*
    PasswordAuthentication yes

上記のようにしたらできる。

特定のIPからの指定のユーザーだけを許可するのはどうするのか

結論から言うと、こう書くといい。

AllowUsers apache@172.10.0.0/16

この例だと、指定したIPからのみ、ユーザー名Apacheがログインできる。よく使いそうなユーザー名 www-data や apache などは /sbin/nologin で守ることもできるけど、どうしても使いたいなってときだけに、このようにすることで特定ユーザーの制限されたIPからのみに限定できる。

And条件などが使えないので、具体的には、このように書くしかないんですね。

大胆に、指定IPだけ、SSHを許可する

iptables でやれって話なんですが。うまく使えば、指定IPからだけのSSH接続を許可するっていう使い方ができる。

AllowUsers *@172.10.0.0/16

逆に、拒否するときとか

DenyUsers *@172.10.0.0/16

いちおうman には載ってるんだけど、結構悩んだのでメモしておく。

間違ってハイフン付きのファイル名を作ってしまって消せないときの対応

間違ってハイフンがついたファイルを作ってしまった。

[takuya@ki www]$ ll .
total 1313532
-rw-rw-r--   1 takuya takuya       2926 Dec 10 17:37 backup.php
-rw-rw-r--   1 takuya takuya   31806188 Dec 26 20:09 -C
drwxr-xr-x.  2 apache apache       4096 Jun 20  2018 cgi-bin

あかん、コレめんどくさいやつや。

これは出来ない。

こういうファイルを作ってしまうと、通常の操作では、ファイルを閲覧することが出来ない。

[takuya@ki www]$ ll  -C
ls: cannot access -C: No such file or directory

エスケープはうまく動かない。

いろいろ試してみたけど、すべてが ls のオプションとして解釈される。

[takuya@ki www]$ ll  \-C
[takuya@ki www]$ ll  \'-C'
[takuya@ki www]$ ll  '-C'

ぐぬぬ

現実的な解決方法

パスを指定する

[takuya@ki www]$ ll  ./-C

ハイフンをつなげる。

[takuya@ki www]$ ll -- -C

これらで解決することができる

nologin 指定されたユーザにsu したりする。無理ログイン

apache ユーザーで bash を起動する

apache ユーザーなど /sbin/nologin のユーザーでは suは出来ない。

[takuya@ki data]$ sudo su apache
This account is currently not available.

/etc/passwdを見てみる

するとログインできなくなっている。

apache:x:48:48:Apache:/var/www:/sbin/nologin

無理矢理にログインしてみる

要は、このユーザーでbashを起動すればいいのだから、こんな事ができる。

[takuya@ki data]$ sudo su -s /bin/bash apache
bash-4.1$ id
uid=48(apache) gid=48(apache) groups=48(apache)

sudo su するくらいなら sudo だけでもできる。

[takuya@ki data]$ sudo -u  apache  /bin/bash
bash-4.1$ id
uid=48(apache) gid=48(apache) groups=48(apache)

シェルを起動することはできる。

できるけど、あまり勧められた方法ではない。

連続してコマンドを起動しない限りは、シェルスクリプトファイルをつくってやりたいことを1つにまとめて起動するほうがいいと思う

sudo -u apache /path/to/script

tcpdumpでDHCPv6の近傍探索やリレーのパケットを見る

dhcpv6 を見たい。

tcpdump でやるには次のようにする。

tcpdump -n -vv ‘(udp port 546 or 547) or icmp6’

ここで、UDP の 546, 547 は、v6のDHCPv6で使われる。

リレーエージェントが、DHCPv6 をリレーするのに、547 あてに送信する、送信元は546 だったか。

オプションの -n は逆引きをさせないようにするもので、まぁV6のパケットとアドレスを見たいときに使うだろうし、つけたほうがいいかなって。

参考資料

man tcpdump