Azureの各リージョンに東日本からiperfしてみた

  • 投稿日:
  • by
  • カテゴリ:

自宅からAzureの各リージョンへのiperfでのネットワーク帯域とは別に、Azure東日本から各リージョンへの帯域も計測してみた。東日本にUbuntuを立てて、そこから「VNET peeringをしない」で、各リージョンに立てたUbuntuにiperfをかけるとこんな感じ、と。

「自宅から直接、各リージョンに接続するより、東日本を経由した方が(当然のことながら)高速」
→「VPN Gatewayを東日本に立てて、他のリージョンにアクセスした方が高速」
→でも、それを全部自前で設定するのは面倒だなぁ、ということになるので、Azure Virtual WANの登場、と。

japaneast : 938 Mbits/sec
japanwest : 890 Mbits/sec
koreacentral : 589 Mbits/sec
koreasouth : 458 Mbits/sec
eastasia : 330 Mbits/sec
southeastasia : 211 Mbits/sec
southindia : 201 Mbits/sec
westus2 : 146 Mbits/sec
westus : 132 Mbits/sec
australiaeast : 127 Mbits/sec
australiacentral : 121 Mbits/sec
westcentralus : 109 Mbits/sec
australiasoutheast : 108 Mbits/sec
westindia : 93.4 Mbits/sec
centralus : 87.5 Mbits/sec
southcentralus : 85.1 Mbits/sec
northcentralus : 83.9 Mbits/sec
eastus2 : 81.9 Mbits/sec
eastus : 80.6 Mbits/sec
centralindia : 75.3 Mbits/sec
canadacentral : 69.1 Mbits/sec
uksouth : 65.6 Mbits/sec
canadaeast : 61.2 Mbits/sec
northeurope : 50.6 Mbits/sec
ukwest : 47.3 Mbits/sec
francecentral : 46.9 Mbits/sec
westeurope : 44.3 Mbits/sec
brazilsouth : 39.3 Mbits/sec
southafricanorth : 31.3 Mbits/sec
uaenorth : 19.6 Mbits/sec

Azureの各リージョンにiperfしてみた

  • 投稿日:
  • by
  • カテゴリ:
20190808-iperf.png

自宅(千葉県市川市)から、Azureの各リージョンにiperfを実行するとどのぐらい出ているのかちょっと気になり、以下のようなスクリプトでUbuntuを立ててiperf3をインストールし5201でリッスン、macOSから10秒ずつiperfを実行してみた。なお自宅はauひかりホーム10ギガで接続されており、マルチならAzure東日本に8Gbps程度で繋がる。

#!/bin/bash
  
regions=$(az account list-locations --query [].name -o tsv)
for region in $regions; do
    RG="rifujitademoiperf${region}"
    VM="rifujitaiperf"
    res=$(az group create -l $region -g $RG)
    ipaddress=$(az vm create --image Canonical:UbuntuServer:18.04-LTS:latest --size Standard_D16s_v3 -g $RG -n $VM --query publicIpAddress -o tsv)
    az vm open-port -g $RG -n $VM --port 5201 --priority 1010
    sleep 30
    ssh-keygen -R $ipaddress
    ssh -o "StrictHostKeyChecking no" $ipaddress <<-'EOF'
    sudo apt-get -y install iperf3
    iperf3 -s -D
EOF
    iperf3 -c $ipaddress -t 10 -b 1000M > iperf_$region.txt
    az group delete --no-wait --yes -g $RG
done

結果は以下の通り。1回のみの実行なので、常にこうなるとは言えないけれど、目安程度にはなるかな。

$ grep receiver iperf* | sed 's/^iperf_\([a-z0-9]*\).txt:.* \([0-9\.]* Mbits\/sec\).*$/\1 : \2/' | sort -nr -k3
japaneast : 765 Mbits/sec
japanwest : 185 Mbits/sec
koreacentral : 115 Mbits/sec
koreasouth : 55.2 Mbits/sec
westus2 : 35.2 Mbits/sec
southeastasia : 32.2 Mbits/sec
australiaeast : 30.0 Mbits/sec
southcentralus : 27.0 Mbits/sec
canadaeast : 23.3 Mbits/sec
australiasoutheast : 21.6 Mbits/sec
canadacentral : 21.4 Mbits/sec
centralindia : 21.2 Mbits/sec
westindia : 20.6 Mbits/sec
centralus : 16.3 Mbits/sec
southindia : 15.0 Mbits/sec
northcentralus : 13.4 Mbits/sec
eastasia : 12.7 Mbits/sec
eastus2 : 10.2 Mbits/sec
uaenorth : 7.99 Mbits/sec
brazilsouth : 7.45 Mbits/sec
westcentralus : 6.77 Mbits/sec
westeurope : 6.18 Mbits/sec
francecentral : 5.41 Mbits/sec
westus : 4.96 Mbits/sec
uksouth : 4.60 Mbits/sec
australiacentral : 4.50 Mbits/sec
northeurope : 3.95 Mbits/sec
ukwest : 3.40 Mbits/sec
eastus : 1.35 Mbits/sec
southafricanorth : 1.03 Mbits/sec
# definition for Azure
define("AZ_REGION", "japaneast");
define("VISION_SERVICE_URI", "https://" . AZ_REGION . ".api.cognitive.microsoft.com/vision/v2.0/");
define("OCR_URI", VISION_SERVICE_URI . "ocr");

# definition of VS_API_KEY from Azure Portal or result of az command as follow
# $ az cognitiveservices account keys list -n COG_NAME -g RES_GRP --query key1 -o tsv
define("VS_API_KEY", "API KEY HERE");

# concatenate '.text' in 'words'
function text_concat($words, $item){
	$words .= $item->text;
	return $words;
}

# post an image for Azure Computer Vision OCR
function get_ocr_result($image_path){
	# initiate cURL
	$curl_session = curl_init();
	curl_setopt_array($curl_session,
		array(
			CURLOPT_URL	=>	OCR_URI,
			CURLOPT_POST	=>	true,
			CURLOPT_HTTPHEADER =>	array(
					"Content-Type: application/octet-stream", 
					"Ocp-Apim-Subscription-Key: " . VS_API_KEY
			),
			CURLOPT_POSTFIELDS	=>	file_get_contents($image_path),
			CURLOPT_RETURNTRANSFER	=>	true,
			CURLOPT_BINARYTRANSFER	=>	true,
		)
	);
	$curl_result = curl_exec($curl_session);
	curl_close($curl_session);
	$json = json_decode($curl_result);
	# extract texts(chars) from json
	$res_lines = array();
	$max_height = 0;
	foreach($json->regions as $region){
		foreach($region->lines as $ln_num => $line){
			$tmp = array_reduce($line->words, "text_concat");
			list($d, $d, $d, $height) = explode(",", str_replace('"', "", $line->boundingBox));
			# highest font is used for name
			if($max_height < (int)$height){
				$tmp_len = mb_strlen($tmp);
				if(2 <= $tmp_len && $tmp_len <= 8){
					if(preg_match("/^[\p{Han}\p{Hiragana}\p{Katakana}]+$/u", $tmp)) {
						$max_height = (int)$height;
						$maybe_name = $tmp;
					}
				}
			}
			if(strcmp($maybe_name, $tmp) != 0){
				$res_lines[] = $tmp;
			}
		}
	}
	return array($res_lines, $maybe_name);
}

list($lines_in_image, $maybe_name) = get_ocr_result($tmpfile);
var_dump($lines_in_image);
var_dump($maybe_name);

Azure上のCentOS 7.6のカーネルバージョン一覧を作る

  • 投稿日:
  • by
  • カテゴリ:

Azure IaaSで利用できるCentOS 7.6のカーネルバージョンの一覧を作りたいけれども手作業は面倒。az vm image listの結果からリソースグループとVMを作ってsshでコマンド実行したら、リソースグループごと削除するスクリプト。queryの使い方など、参考になるかと。

#!/bin/bash
  
grp_prefix="riodemocentos"

tmplt="res=\$(az group create -l japaneast -g ${grp_prefix}%s)\n ipaddress=\$(az vm create --image %s --size Standard_F4s_v2 -g ${grp_prefix}%s -n ${grp_prefix}%s -o tsv --query publicIpAddress)\n ssh -t -o \"StrictHostKeyChecking no\" \$ipaddress 'uname -r'\n res=\$(az group delete --yes --no-wait -g ${grp_prefix}%s)\n\n"

urns=$(az vm image list --publisher openlogic --all -o tsv --query "[?starts_with(version, '7.6')].urn")
for urn in $urns; do
        yyyymmdd=$(echo -n $urn | sed 's/.*\([0-9]\{8\}\)$/\1/')
        printf "${tmplt}" ${yyyymmdd} ${urn} ${yyyymmdd} ${yyyymmdd} ${yyyymmdd}
done

実行すると、こういうスクリプトを生成する。そのままパイプでbashに渡しても良いし、リダイレクトしてファイルにしておいても良いかと。

res=$(az group create -l japaneast -g riodemocentos20181219)
 ipaddress=$(az vm create --image OpenLogic:CentOS:7.6:7.6.20181219 --size Standard_F4s_v2 -g riodemocentos20181219 -n riodemocentos20181219 -o tsv --query publicIpAddress)
 ssh -t -o "StrictHostKeyChecking no" $ipaddress 'uname -r'
 res=$(az group delete --yes --no-wait -g riodemocentos20181219)

res=$(az group create -l japaneast -g riodemocentos20190402)
 ipaddress=$(az vm create --image OpenLogic:CentOS:7.6:7.6.20190402 --size Standard_F4s_v2 -g riodemocentos20190402 -n riodemocentos20190402 -o tsv --query publicIpAddress)
 ssh -t -o "StrictHostKeyChecking no" $ipaddress 'uname -r'
 res=$(az group delete --yes --no-wait -g riodemocentos20190402)

res=$(az group create -l japaneast -g riodemocentos20190708)
 ipaddress=$(az vm create --image OpenLogic:CentOS:7.6:7.6.20190708 --size Standard_F4s_v2 -g riodemocentos20190708 -n riodemocentos20190708 -o tsv --query publicIpAddress)
 ssh -t -o "StrictHostKeyChecking no" $ipaddress 'uname -r'
 res=$(az group delete --yes --no-wait -g riodemocentos20190708)

res=$(az group create -l japaneast -g riodemocentos20190306)
 ipaddress=$(az vm create --image OpenLogic:CentOS-CI:7-CI:7.6.20190306 --size Standard_F4s_v2 -g riodemocentos20190306 -n riodemocentos20190306 -o tsv --query publicIpAddress)
 ssh -t -o "StrictHostKeyChecking no" $ipaddress 'uname -r'
 res=$(az group delete --yes --no-wait -g riodemocentos20190306)

res=$(az group create -l japaneast -g riodemocentos20190426)
 ipaddress=$(az vm create --image OpenLogic:CentOS-CI:7-CI:7.6.20190426 --size Standard_F4s_v2 -g riodemocentos20190426 -n riodemocentos20190426 -o tsv --query publicIpAddress)
 ssh -t -o "StrictHostKeyChecking no" $ipaddress 'uname -r'
 res=$(az group delete --yes --no-wait -g riodemocentos20190426)

res=$(az group create -l japaneast -g riodemocentos20190327)
 ipaddress=$(az vm create --image OpenLogic:CentOS-HPC:7.6:7.6.20190327 --size Standard_F4s_v2 -g riodemocentos20190327 -n riodemocentos20190327 -o tsv --query publicIpAddress)
 ssh -t -o "StrictHostKeyChecking no" $ipaddress 'uname -r'
 res=$(az group delete --yes --no-wait -g riodemocentos20190327)

res=$(az group create -l japaneast -g riodemocentos20190529)
 ipaddress=$(az vm create --image OpenLogic:CentOS-HPC:7.6:7.6.20190529 --size Standard_F4s_v2 -g riodemocentos20190529 -n riodemocentos20190529 -o tsv --query publicIpAddress)
 ssh -t -o "StrictHostKeyChecking no" $ipaddress 'uname -r'
 res=$(az group delete --yes --no-wait -g riodemocentos20190529)

res=$(az group create -l japaneast -g riodemocentos20190130)
 ipaddress=$(az vm create --image OpenLogic:CentOS-LVM:7-LVM:7.6.20190130 --size Standard_F4s_v2 -g riodemocentos20190130 -n riodemocentos20190130 -o tsv --query publicIpAddress)
 ssh -t -o "StrictHostKeyChecking no" $ipaddress 'uname -r'
 res=$(az group delete --yes --no-wait -g riodemocentos20190130)

CentOS 7.6 on Azure

  • 投稿日:
  • by
  • カテゴリ:

CentOS 7.6にはAzure用にチューニングされたカーネルがあるのだけれど、デフォルトではインストールされていないので以下の手順が必要。

デフォルトでインストールされているカーネルを確認。

$ uname -r
3.10.0-862.11.6.el7.x86_64

これはCentOS 7.5のカーネル。

kernel-azureパッケージをインストール。

$ sudo yum -y install centos-release-azure
$ sudo yum -y install kernel-azure
$ sudo reboot

再起動後、カーネルを再度確認。

$ uname -r
3.10.0-957.21.3.el7.azure.x86_64

いつもと同じようにiperf3でloでテスト。Azure用カーネル、劇的に性能上がる。

# uname -r
3.10.0-957.1.3.el7.x86_64

# iperf3 -c 127.0.0.1 -u -l 16 -b 20M
Connecting to host 127.0.0.1, port 5201
[  4] local 127.0.0.1 port 49703 connected to 127.0.0.1 port 5201
[ ID] Interval           Transfer     Bandwidth       Total Datagrams
[  4]   0.00-1.00   sec  1.69 MBytes  14.2 Mbits/sec  110626  
[  4]   1.00-2.00   sec  1.64 MBytes  13.8 Mbits/sec  107513  
[  4]   2.00-3.00   sec  1.94 MBytes  16.2 Mbits/sec  126838  
[  4]   3.00-4.00   sec  1.57 MBytes  13.2 Mbits/sec  103206  
[  4]   4.00-5.00   sec  2.16 MBytes  18.1 Mbits/sec  141488  
[  4]   5.00-6.00   sec  1.80 MBytes  15.1 Mbits/sec  117800  
[  4]   6.00-7.00   sec  1.92 MBytes  16.1 Mbits/sec  125602  
[  4]   7.00-8.00   sec  1.73 MBytes  14.5 Mbits/sec  113292  
[  4]   8.00-9.00   sec  2.06 MBytes  17.3 Mbits/sec  135330  
[  4]   9.00-10.00  sec  2.00 MBytes  16.7 Mbits/sec  130795  
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bandwidth       Jitter    Lost/Total Datagrams
[  4]   0.00-10.00  sec  18.5 MBytes  15.5 Mbits/sec  0.007 ms  352/1212490 (0.029%)  
[  4] Sent 1212490 datagrams

iperf Done.

# iperf3 -c 127.0.0.1 -u -l 16 -b 40M
Connecting to host 127.0.0.1, port 5201
[  4] local 127.0.0.1 port 33688 connected to 127.0.0.1 port 5201
[ ID] Interval           Transfer     Bandwidth       Total Datagrams
[  4]   0.00-1.00   sec  1.48 MBytes  12.4 Mbits/sec  96935  
[  4]   1.00-2.00   sec  1.55 MBytes  13.0 Mbits/sec  101492  
[  4]   2.00-3.00   sec  1.62 MBytes  13.6 Mbits/sec  106127  
[  4]   3.00-4.00   sec  1.34 MBytes  11.2 Mbits/sec  87531  
[  4]   4.00-5.00   sec  1.88 MBytes  15.7 Mbits/sec  122992  
[  4]   5.00-6.00   sec  1.35 MBytes  11.3 Mbits/sec  88171  
[  4]   6.00-7.00   sec  1.60 MBytes  13.5 Mbits/sec  105106  
[  4]   7.00-8.00   sec  1.91 MBytes  16.1 Mbits/sec  125484  
[  4]   8.00-9.00   sec  1.72 MBytes  14.4 Mbits/sec  112536  
[  4]   9.00-10.00  sec  1.34 MBytes  11.3 Mbits/sec  88005  
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bandwidth       Jitter    Lost/Total Datagrams
[  4]   0.00-10.00  sec  15.8 MBytes  13.2 Mbits/sec  0.007 ms  58/1034379 (0.0056%)  
[  4] Sent 1034379 datagrams

iperf Done.

# uname -r
3.10.0-957.21.3.el7.azure.x86_64

# iperf3 -c 127.0.0.1 -u -l 16 -b 20M
Connecting to host 127.0.0.1, port 5201
[  4] local 127.0.0.1 port 58778 connected to 127.0.0.1 port 5201
[ ID] Interval           Transfer     Bandwidth       Total Datagrams
[  4]   0.00-1.00   sec  2.33 MBytes  19.5 Mbits/sec  152401  
[  4]   1.00-2.00   sec  2.39 MBytes  20.0 Mbits/sec  156379  
[  4]   2.00-3.00   sec  2.23 MBytes  18.7 Mbits/sec  146162  
[  4]   3.00-4.00   sec  2.46 MBytes  20.6 Mbits/sec  161235  
[  4]   4.00-5.00   sec  2.32 MBytes  19.4 Mbits/sec  151733  
[  4]   5.00-6.00   sec  2.53 MBytes  21.2 Mbits/sec  165982  
[  4]   6.00-7.00   sec  2.38 MBytes  20.0 Mbits/sec  156162  
[  4]   7.00-8.00   sec  2.43 MBytes  20.4 Mbits/sec  159078  
[  4]   8.00-9.00   sec  2.32 MBytes  19.5 Mbits/sec  152196  
[  4]   9.00-10.00  sec  2.44 MBytes  20.5 Mbits/sec  160227  
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bandwidth       Jitter    Lost/Total Datagrams
[  4]   0.00-10.00  sec  23.8 MBytes  20.0 Mbits/sec  0.003 ms  0/1561555 (0%)  
[  4] Sent 1561555 datagrams

iperf Done.

# iperf3 -c 127.0.0.1 -u -l 16 -b 40M
Connecting to host 127.0.0.1, port 5201
[  4] local 127.0.0.1 port 43757 connected to 127.0.0.1 port 5201
[ ID] Interval           Transfer     Bandwidth       Total Datagrams
[  4]   0.00-1.00   sec  3.55 MBytes  29.8 Mbits/sec  232619  
[  4]   1.00-2.00   sec  3.15 MBytes  26.5 Mbits/sec  206694  
[  4]   2.00-3.00   sec  2.91 MBytes  24.4 Mbits/sec  190630  
[  4]   3.00-4.00   sec  3.62 MBytes  30.4 Mbits/sec  237474  
[  4]   4.00-5.00   sec  3.60 MBytes  30.2 Mbits/sec  235865  
[  4]   5.00-6.00   sec  3.08 MBytes  25.8 Mbits/sec  201622  
[  4]   6.00-7.00   sec  2.96 MBytes  24.8 Mbits/sec  193999  
[  4]   7.00-8.00   sec  3.33 MBytes  27.9 Mbits/sec  218094  
[  4]   8.00-9.00   sec  3.54 MBytes  29.7 Mbits/sec  232162  
[  4]   9.00-10.00  sec  3.51 MBytes  29.4 Mbits/sec  229942  
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bandwidth       Jitter    Lost/Total Datagrams
[  4]   0.00-10.00  sec  33.3 MBytes  27.9 Mbits/sec  0.004 ms  0/2179101 (0%)  
[  4] Sent 2179101 datagrams

iperf Done.

原始的な方法なんだけど、AzureにLinuxのVMを立ててそこにrsyncでバックアップするスクリプト。rsyncdの設定は普通にすればOK。クライアントはrsyncではなく、parsyncfpを使って爆速にする。これをcronで1日1回動かすので、chmod 755とかその辺は適宜設定して欲しい。ストレージをStandard / Premiumで切り替えてコストも最小に抑えてある。

#!/bin/bash

com="parsyncfp --rsyncopts=\"-a\" --chunksize=32M --nowait --NP=32"
par_dir="/opt"
src_dir="/Photos_and_Videos/"

hosts='your_vm_name'
for vm in $hosts; do
	disk=$(az vm show -g ${vm} -n ${vm} -o tsv --query storageProfile.osDisk.name)
	az disk update -g $vm --sku Premium_LRS --name $disk -o table
	dnames=$(az vm show -g ${vm} -n ${vm} -o tsv --query storageProfile.dataDisks[].name)
	for disk in $dnames; do
		az disk update -g $vm --sku Premium_LRS --name $disk -o table
	done
	az vm start -g $vm -n $vm -o table
done

yyyy=$(date +%Y)
for vm in $hosts; do
	vmurl=$(az network public-ip list -g ${vm} --query [].dnsSettings.fqdn -o tsv)
	${com} --startdir="${par_dir}${src_dir}" ${yyyy} rsync://${vmurl}:${src_dir}
done

for vm in $hosts; do
	az vm deallocate -g $vm -n $vm -o table
	disk=$(az vm show -g ${vm} -n ${vm} -o tsv --query storageProfile.osDisk.name)
	az disk update -g $vm --sku Standard_LRS --name $disk -o table
	dnames=$(az vm show -g ${vm} -n ${vm} -o tsv --query storageProfile.dataDisks[].name)
	for disk in $dnames; do
		az disk update -g $vm --sku Standard_LRS --name $disk -o table
	done
done

Excel for macOSのUTF-8 CSVからBOMを自動で除去する

  • 投稿日:
  • by
  • カテゴリ:

ツイでそんな話題があったので、ちょっとAutomatorで書いてみた。

まず、Automatorでremove_bom.workflowというフォルダアクションを作成する。
20190716211400.png

ext=${1##*.}
if [ "${ext}" == "csv" ]; then
	bom_exists=$(grep -l ^$'\xef\xbb\xbf' $1)
	if [ "$bom_exists" == "$1" ]; then
		cat $1 | (rm $1; sed '1s/^[^[:alnum:]]*//' > $1)
	fi
fi

拡張子がcsvで、BOMが付いていたら、alnum(Alpha Numeric)じゃない先頭の文字列を消す、というロジック。macOSのsedではhexdecimalな検索が出来ないのでこうしてるが、brew install sedすればもっと確実に、

remove_bom.workflow.zip

sed -i '1s/^\xef\xbb\xbf//'

すりゃ良い。

で、こいつを保存したら「監視したいフォルダ」を右クリックしてコンテキストメニューから「フォルダアクション設定...」を選ぶ。

20190716211509.png

「サービスを確認」ダイアログで[サービスを実行]ボタンをクリック。

20190716211513.png

「フォルダアクション設定」が表示されたら、右側の[スクリプト]の下にある[+]ボタンをクリック。

20190716211520.png

「関連付けるスクリプトを選択:」で先に保存したアクションを選択する。

20190716211525.png

さて、Excelで、"CSV UTF-8 (コンマ区切り) (.csv)"で保存してみよう。

20190716211620.png

うまく行けば、保存したCSVは次の瞬間にBOMが除去されているので、hexdumpコマンドで見るとこの通り"EF BB BF"が先頭から消えているはず。

20190716211652.png

これはmacOSのfseventsdをベースにしているので、既に存在するファイル名に対してExcelで「別名で保存」して上書きすると動かない弱点があるので注意。

実はこれ、同じ要領でmacOSのスクショの名前を変更するのに使っていたので、似たようなものだったりする。"ScreenShots YYYY-MM-DD hh.mm.ss.png"という名前で保存されてしまって、この日時部分がscreenshotsコマンドはカスタマイズ出来ないが、個人的に"YYYYMMDDhhmmss.png"というファイル名の方が都合がよく、スクショをとったら自動的にファイル名をrenameしてる。

追記(2019.07.23):さらにバグを見つけたので修正。

prefix=$(defaults read com.apple.screencapture name)

dname=$(dirname "$1")
fname=$(basename "$1")
ext=".$(defaults read com.apple.screencapture type)"

if [ "${fname:0:${#prefix}}" == "$prefix" ]; then
if [ "$ext" == "." ]; then
ext=$(echo "$fname" | sed 's/.*\(\.[^\.]*\)$/\1/')
fi
to=(`echo -n "$fname" | sed "s/${prefix}\ \([0-9]\{4\}\)-\([0-9]\{2\}\)-\([0-9]\{2\}\)\ \([0-9]\{1,2\}\)\.\([0-9]\{2\}\)\.\([0-9]\{2\}\)${ext}/\1 \2 \3 \4 \5 \6/"`)
yyyymmdd="${to[0]}${to[1]}${to[2]}"
# Why Apple doesn't use zero-filled 2 digits 'hour'?
hhmmss=$(printf %02d ${to[3]})${to[4]}${to[5]}
mv "${1}" "${dname}/${yyyymmdd}${hhmmss}${ext}"
fi

追記(2019.07.18):バグを見つけたので修正版。

prefix=$(defaults read com.apple.screencapture name)
dname=$(dirname "$1")
fname=$(basename "$1")
ext=".$(defaults read com.apple.screencapture type)"
if [ "$ext" == "" ]; then
	ext=$(echo "$fname" | sed 's/.*\(\.[^\.]*\)$/\1/')
fi
if [ "${fname:0:${#prefix}}" == "$prefix" ]; then
	to=(`echo -n "$fname" | sed "s/${prefix}\ \([0-9]\{4\}\)-\([0-9]\{2\}\)-\([0-9]\{2\}\)\ \([0-9]\{1,2\}\)\.\([0-9]\{2\}\)\.\([0-9]\{2\}\)${ext}/\1 \2 \3 \4 \5 \6/"`)
	yyyymmdd="${to[0]}${to[1]}${to[2]}"
	# Why Apple doesn't use zero-filled 2 digits 'hour'?
	hhmmss=$(printf %02d ${to[3]})${to[4]}${to[5]}
	mv "${1}" "${dname}/${yyyymmdd}${hhmmss}${ext}"
fi

rename_screenshots.workflow.zip

こちらは旧バージョン。

fname=$(basename $1)
if [ "${fname:0:11}" == "ScreenShots" ]; then
	to=$(echo $1 | sed 's/ScreenShots\ \([0-9]\{4\}\)-\([0-9]\{2\}\)-\([0-9]\{2\}\)\ \([0-9]\{2\}\)\.\([0-9]\{2\}\)\.\([0-9]\{2\}\)\.png/\1\2\3\4\5\6.png/')
	mv "${1}" ${to}
fi

なお、これらのフォルダアクションは、~/Library/Workflows/Applications/Folder Actions/に保存されている。

Mac miniが届いて1ヶ月

  • 投稿日:
  • by
  • カテゴリ:

メインで使ってきたMacBook Pro 2017 13インチだと色々性能が不足してきてるのでMac miniを6月12日に買ったのだけれど、全然ブログに記録してなくて過去のマシン遍歴が分からなくなってるな、と。

20190712-about.png

20190712.png

2018年11月28日には、MBA 13.3 1.6GHz / 16GB / 512GBを予備機として購入してたが、これもブログに書いてない。

2017年2月に、MBP 2017を社給で。

その前は、2016年11月25日に購入した、MBP 3.3GHz / 16GB / 512GB。

さらに前。2015年4月13日にMBA 2.2GHz / 8GB / 256GB。

2014年8月24日、MBP 3.0GHz / 16GB / 512GB。

2011年9月12日、MBA 1.6GHz / 4GB / 64GB。

個人購入以外に社給のものが数台あるので、よく分からなくなってるな...。

RHELのアクティブなサービス一覧を取得する

  • 投稿日:
  • by
  • カテゴリ:

とりま動けば良いや、って大急ぎで書いたので、汚いのは勘弁。サービスの一覧を取得して、そのサービスファイルを入れたrpmパッケージから変更されたファイルの一覧を作成するスクリプト。

#!/bin/bash

while read line || [ -n "${line}" ]; do
        user=$(echo -n $line | cut -d ' ' -f 1)
        host=$(echo -n $line | cut -d ' ' -f 2)
        port=$(echo -n $line | cut -d ' ' -f 3)
        if [ -z "$user" ]; then
                user="root"
        fi
        if [ -z "$port" ]; then
                port=22
        fi
        if [ -z "$host" ]; then
                exit
        fi
        # guess RHEL7/8
        os_vers=$(ssh -n -o "StrictHostKeyChecking  no" -p ${port} ${user}@${host} '[ -f /etc/os-release ]&& OS_VERS="$(eval $(grep ^VERSION= /etc/os-release); echo ${VERSION})"; echo ${OS_VERS:0:1}')
        if [ "$os_vers" == "8" ] || [ "$os_vers" == "7" ]; then
                ssh -n -o "StrictHostKeyChecking  no" -p ${port} ${user}@${host} "sudo systemctl list-units --no-pager --state=running *.service | grep '^.*.service' | sed 's/^\(.*\)\.service.*/\\1/'" > service_$host.txt
                while read serv || [ -n "${serv}" ]; do
                        echo "service:${serv}" >> changed_conf_$host.txt
                        ssh -n -o "StrictHostKeyChecking  no" -p ${port} ${user}@${host} "sudo rpm -V \$(sudo rpm -qf /usr/lib/systemd/system/$serv.service)" >> changed_conf_$host.txt
                done < service_$host.txt
        else
                ssh -n -o "StrictHostKeyChecking  no" -p ${port} ${user}@${host} 'LV=$(grep /etc/inittab | cut -d: -f2); sudo chkconfig --list | grep ${LV}:on | awk "{print \$1}"' > service_$host.txt
                while read serv || [ -n "${serv}" ]; do
                        echo "service:${serv}" >> changed_conf_$host.txt
                        ssh -n -o "StrictHostKeyChecking  no" -p ${port} ${user}@${host} "sudo rpm -V \$(sudo rpm -qf /etc/rc.d/init.d/$serv)" >> changed_conf_$host.txt
                done < service_$host.txt
        fi

done < host_list.txt

RHEL8でSELinux=EnforcingでPodman

  • 投稿日:
  • by
  • カテゴリ:

まあ、こんなコマンドでmariadb-10.4をSELinuxをEnforcingしてるRHEL8上で動かしたい、と。

$ sudo podman run --name mariadb_01 -v /data/mariadb:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root_pass -d mariadb:10.4

実行してログを見ると、

$ sudo podman logs d80
Emulate Docker CLI using podman. Create /etc/containers/nodocker to quiet msg.
find: '/var/lib/mysql/': Permission denied

まあ、そうですわな。

$ sudo grep preventing /var/log/messages
Jul  8 12:57:11 riotestrhel8 setroubleshoot[26736]: SELinux is preventing /usr/sbin/mysqld from write access on the directory mariadb. For complete SELinux messages run: sealert -l 1a5b17b0-e8a5-40c7-8217-4fa52f6ca285
Jul  8 12:57:11 riotestrhel8 platform-python[26736]: SELinux is preventing /usr/sbin/mysqld from write access on the directory mariadb.
#012
#012*****  Plugin catchall_labels (83.8 confidence) suggests   *******************
#012
#012If you want to allow mysqld to have write access on the mariadb directory
#012Then you need to change the label on mariadb
#012Do
#012# semanage fcontext -a -t FILE_TYPE 'mariadb'
#012where FILE_TYPE is one of the following: cgroup_t, container_file_t, container_var_lib_t, fusefs_t, nfs_t, svirt_home_t, tmpfs_t, virt_home_t.
#012Then execute:
#012restorecon -v 'mariadb'
#012
#012
#012*****  Plugin catchall (17.1 confidence) suggests   **************************
#012
#012If you believe that mysqld should be allowed write access on the mariadb directory by default.
#012Then you should report this as a bug.
#012You can generate a local policy module to allow this access.
#012Do
#012allow this access for now by executing:
#012# ausearch -c 'mysqld' --raw | audit2allow -M my-mysqld
#012# semodule -X 300 -i my-mysqld.pp
#012

ですよねぇ。

$ sudo semanage fcontext -a -t cgroup_t '/data/mariadb'
$ semanage fcontext -l  | grep mariadb
/data/mariadb                                      all files          system_u:object_r:cgroup_t:s0 
/usr/lib/systemd/system/mariadb.*                  regular file       system_u:object_r:mysqld_unit_file_t:s0 
/var/log/mariadb(/.*)?                             all files          system_u:object_r:mysqld_log_t:s0 
/var/run/mariadb(/.*)?                             all files          system_u:object_r:mysqld_var_run_t:s0 
$ sudo chcon system_u:object_r:cgroup_t:s0 /data/mariadb

といった感じで。

何が気になっていたかというと、DockerだとSELinuxの設定はちょっと面倒なことになるんだけど、Podmanだと「普通に」SELinuxを管理すれば良いのかな?ということ。普通にやりましょう、ということでしたw
これはPodmanの利点かも。