それマグで!

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

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

LVMの物理HDDを交換するときの手順

LVMでディスクを交換するときは最初にやるのはこれ

新しいディスクをLVMに接続し LVに割り当てる。
pvmove でディスク交換
vg から取り外し
物理的に取り出し

vgから古いディスクの取り外し( VG容量に余裕があるとき、容量を拡張するとき)

vg からディスクを外す前に pvmoveコマンドを先に実行する必要がある。

pvmove は物理ディスクにかきこまれたlvmが使っている領域をべつのlvm/ lv の割り当てディスクに移動させて、物理ディスクを安全に解放してくれる。

なんて便利な機能。

しかし、よくミスる。 「取り外しー>容量減らすー>ディスク減らす」と考えて、ついついvgreduce を打ってしまいまがち

pvmove /dev/sdX /dev/sdY
vgreduce vg-name /dev/sdX
pvremove /dev/sdX
resize2fs /dev/mapper/vg-name-lvname

この順番が大事

ついつい vgreduce をやlvextend先にやろうとしてしまう。

pvmove は本当に便利なのにね。

容量の大きなディスクに入れ替えるとき( VG容量が満杯の余裕がないとき)

pvcreate /dev/sdX
vgextent  VGNAME /dev/sdX
pvmove /dev/sdY /dev/sdX
vgreduce VGNAME /dev/sdY
pvremove /dev/sdY
  1. 新しいディスクを pvcreate
  2. vg に新HDDを追加
  3. pvmove で旧HDD→新HDDへ
  4. vgreduce でVGの旧HDDを削減
  5. pvcremove で旧HDDを削除

こちらも順番が大事。

もし、pvmove をやめたいとき

pvmove 中に再起動が必要になったとか。pvmove 中に端末がおちちゃって経過がわからないとか、time コマンドをつけたかったとか。そういときに一旦中止する時にどうするのか。

pvmove --abort

これでpvmoveをキャンセルできます。

縮小するとき

LVMを必要以上に確保ししていて別のディスクに移したいとときは、

sudo mv /mnt/cryptDisk01/SOME_DATA /mnt/newDISK # 必要に応じ容量確保
sudo lvreduce -L -8T data/video --resizefs # 必要に応じて適当にLVを調整
sudo pvmove /dev/mapper/cryptDisk01
sudo vgreduce data /dev/mapper/cryptDisk01
sudo pvremove /dev/mapper/cryptDisk01
sudo lvextend -l 100%FREE  data/video
sudo resize2fs  /dev/mapper/data-video

適宜やれば確実に終わる。8TBは数日かかった・・・

2020-07-17

記述を変更

イオンカードのログインでワンタイムパスワードの送信画面をスキップする方法

イオンカードのログインにワンタイムパスワードの送信画面がめんどくさい

イオンカードにPCからログインすると、ワンタイムパスワードの送信画面になる。 f:id:takuya_1st:20190927013104p:plain

これは、リスクベース認証と呼ばれるものであり、リスクが高いアクセスは「追加認証」を要求するという考えによるものです

スマホページからログインすると追加認証がない。

不思議なんですが、「スマホページ」からアクセスすると「追加認証」が発生しません。

f:id:takuya_1st:20190927013402p:plain

スマホページにアクセスするには

Google 検索で、「イオンカード ログイン」 で検索してみてください。

Google検索はスマホページを優先的に表示します。そのためスマホページのログイン画面がまっさきに検索結果に上がってきます。

f:id:takuya_1st:20190927013646p:plain

Google検索からログインページに到達すると、パソコンでも追加認証が発生しません

これはセキュリティ対策をスルーしていますが犯罪ですか?

いいえ、イオンカードのセキュリティ対策が根本的に「誤り」です。

Google検索だけでたどり着くので、このようなアクセス方法は自然なものです。

イオングループが意図して隠しているわけでもありませんし、PCだけセキュリティを厳しくしていることは「明確に公開されていません」 つまり、私達が回避しても、不正アクセス禁止法にかかるようなものでもありません。

セキュリティに関して

このような、セキュリティ対策にならないものを、リスクベース認証と呼称し、間違った概念を広めているイオングループは意識を改めてもらいたいと思います。

スマホページにはメールによるワンタイムパスワードを導入せず、パソコンからのアクセスのみにワンタイムパスワードを導入して煩雑にしているだけです。煩雑にすることがセキュリティでは無いと思います。

また、このようなアクセス方法を不正アクセス禁止法にもとづく不正アクセスというためにはGoogle検索という誰でもたどり着く公開ページからのアクセスをストップする必要があり、対策していないイオンカード側の落ち度と言えます。

とっととスマホページにも2段階認証を導入するか、PCブラウザからの2段階認証を見直す必要があると思います。

なぜブログ記事にしたのか

このような現状はもう1年以上続いています。

最近、イオンカードが取った対策は、ログインページを使いにくくすることという「とんでもない」対策でした。

ダイアログをだして、ページ遷移を促すのですね。これはひどい対策です。

f:id:takuya_1st:20190927015546p:plain

iPadスマホですか?PCですか?よくわかりませんが、2段階認証を回避されたくないという意図をビンビンに感じます。

私は、これをみてもう記事にして公開したほうがいいなと思った次第です。

イオンカードのWEB明細必須化か・・・

さらに言えば、かりにアカウントを取られたとしてもカードの利用明細を閲覧には、経済的損害は発生しません。閲覧という行為に対するリスクベース認証として、現状は過剰すぎるのではないでしょうか。

登録情報の編集などリスクの高い変更についてリスクベース認証をするのは理解できますが、閲覧に二段階認証はやりすぎではないでしょうか。何度も書いてますが、「郵送」に比べてWEBページの閲覧は相当に煩雑であり、ユーザーに手間を押し付けるものであります。エコでもなんでもありません。郵便局の配達は、イオンカードの明細の有無に関係なくルートを巡っています。CO2削減にもなりません。ペーパー発行を控えてもエコにはなりません。コスト削減の言い訳に使うエコはエコロジーでなくエコノミーです。本当にエコロジーを実現したいのであれば配達先の集配局の近辺ででオンデマンド印刷して配達すればいいわけです。多大なコストを掛けたWEB明細を必須にするのは、利用率の改善の意図を疑ってしまいます。なぜ利用率が悪いのか、使い勝手が悪いのでは無いでしょうか。多大なコストを掛けて作ったWEB明細サービスやアプリが利用されないテコ入れであれば、「サンクコスト」としてとっとと諦めるか、ユーザー動線を調査をするのがあるべき姿だったと思われます。小手先の対応や必須化などと社内理論としか思えない言い訳につきあわされる私達利用者は溜まったもんじゃないですよね。

参考資料

利用端末の登録をしましたが、ログインするたびにワンタイムパスワードの送信画面が表示されます。 | よくあるご質問| 暮らしのマネーサイト

空白区切り文字列 を xargs で行へ展開-1行→複数行

xargs があるとすぐ出来ます。

xargs -n1  echo 

空白区切りされた文字列をぱぱっと複数行にする。 xargs と echo を組み合わせると楽。

takuya@~$ echo hello world hello world hello world hello world  | xargs -n1 echo
hello
world
hello
world
hello
world
hello
world

他の方法

他にも色々と方法があると思う。 for を使うとか、bash の展開をつかって配列にするとか。アレコレ考えられるけど、xargs を使うのがシェルっぽくていいと思う。

参考資料

https://qiita.com/maskedw/items/2dfdf6fa7eee991ddc45

laravel のマイグレーションで特定のmigration のファイル名指定して、一つだけ再度・何度も実行したい

laravel でmigrate するとき、特定のファイルだけを実行したい

migrate refresh とかだと全部のテーブルが再生成されちゃうので、別のテーブルデータを消さずに特定のテーブルだけを再構築したい。

サンプル

指定したマイグレーションのファイルだけを実行する

artisan migrate:refresh --step=1  --path=/database/migrations/2019_09_18_182637_create_users_table.php 

指定方法

上記のコマンドは、次のように分解できる。

## マイグレーションを全部実行する
php artisan migrate:refresh 

これと個数を組み合わせ

## マイグレーションを先頭から1つだけ
php artisan migrate:refresh  --step=1

さらにパスを指定する。

## マイグレーションを指定したファイルから1つだけ
php artisan migrate:refresh  --step=1 --path=/database/migrations/ファイル名

パスの設定や step の指定を忘れて migrate:refresh すると全部消えちゃうので注意が必要。

どういうときに使うのか

テーブルを追加するときにアレコレ試しているローカル環境で使う。

いちいち seeder や seed を使ってデータを追加するのも面倒なので。

テーブルの定義のマイグレーションを、指定して再実行したり、テーブル定義を書き直したりしたときに使います。

これを使うことで、テーブル定義のを書いながら何度も試せるので、マイグレーションをfresh でゼロからしてしまうことなくなるので便利です。

laravel だとテーブル定義を作りながら考えられるのはいいことだと思います。

併せて使いたい status コマンド

migrate:status をつかえば、いまどこまでmigration が適用されているかわかる。

artisan migrate:status

マイグレーションの適用結果はデータベースに格納されている。それをコマンドから見ることができる。

参考資料

https://stackoverflow.com/questions/45473624/laravel-5-4-specific-table-migration

lvm で容量拡張

よく使うものだけ抜粋

lvm のアレコレはすっ飛ばして、よく使うコマンドだけを抜粋してメモに残します。

余っているpv から容量を追加する

pv と vg に容量は割り当て済みとする。

sudo lvextend -L +10g vg/temp_cache

終わったら、ext4 をリサイズする。

sudo resize2fs /dev/mapper/my-temp_cache

関連資料

詳細はこちら

LVMの lvextend でLVを拡張する - それマグで!

chrome で印刷プレビューのCSSをデバッグ表示するには

印刷プレビューのCSSを触りたい

印刷プレビューの media type print css をいじったりチェックしたり、デバッグしたり、表示おかしいので直したいときがあります。

CSSのプリントを印刷プレビューでチェックするのは途方も無い時間がかかる。

そこで、印刷プレビューでレンダリングしてくれるモードが、開発ツールになる。

chrome の開発ツールでメニューからRenderingを選ぶ

開発ツールの下側のメニュー → レンダリングを選ぶ

f:id:takuya_1st:20190918001744p:plain

media type を print にする

プリントにすると、印刷プレビューがブラウザに表示される。これで楽になるね!

f:id:takuya_1st:20190918001804p:plain

PostgreSQLでtimestamp/now() を文字列にする char キャスト

PostgreSQL でタイムスタンプを文字列として取り出したい

char にキャストするときに長さをつける

now() の場合

select now()::char(30);

実行結果

sample> select now()::char(30);
+--------------------------------+
| now                            |
|--------------------------------|
| 2019-09-13 15:27:51.427441+00  |
+--------------------------------+
SELECT 1
Time: 0.086s

current_timestamp の場合

select current_timestamp::char(29)

実行結果

sample> select current_timestamp::char(29)
+-------------------------------+
| now                           |
|-------------------------------|
| 2019-09-13 15:29:01.630241+00 |
+-------------------------------+
SELECT 1
Time: 0.067s
sample>

あんまり美しいやり方ではないけれど

PostgreSQLでランダムなINTを生成する

ランダムなINTがほしい

cast の場合はこれ

select cast(random()*100 as integer);

::int を使ったキャストを使う場合はこんな感じ

floor(random() * 1000 + 1)::int;

参考資料

https://www.postgresql.jp/document/9.4/html/functions-math.html

Chromeの開発ツールのネットワークから拡張機能のログを隠す

Google Chrome の開発ツールに拡張機能が邪魔

プライベート・ブラウズ・モードでアクセスすれば、拡張機能のリクエストログをを隠すことが出来るが。

わざわざ拡張機能のためにプライベートブラウズで悪世するのも面倒ですよね。

ネットワークのフィルタを使う

そこで、devtool -> network -> filter にある、フィルタを使う方法があった。

-scheme:chrome-extension

これで拡張機能のログを隠せる。

f:id:takuya_1st:20190913144252p:plain

ちなみに、以下が拡張機能のネットワークのログを隠す前です。 f:id:takuya_1st:20190913144646p:plain

見比べてみたら減っているのがわかるでしょうか。

便利!!

拡張機能の通信ログが出てくるのを隠せないのか?

たぶん無理です。 chrome-extension のログを隠すのは、セキュリティ上の問題だと思う。

参考資料

https://stackoverflow.com/questions/16436369/is-it-possible-to-hide-extension-resources-in-the-chrome-web-inspector-network-t

Mac でVPNを接続するコマンド。ついでに整理しておく

macVPNを接続する。

Macに標準のサービスを使って設定しているPPP系 LT2P over TLS のような設定だとnetworksetup から出来る

scutil もいいけど、networksetup でもいい。私はこっち。

macVPNに接続するには

networksetup -connectpppoeservice "$VPN_NAME"

切断するには、

networksetup -disconnectpppoeservice "$VPN_NAME"

接続状態を見るには。

networksetup -showpppoestatus "$VPN_NAME"

$VPN_NAME :サービス名を取得するには

覚えられないので、bashrcにした

networksetup はコマンドが多過ぎて、覚えられないで、bashrcに書くことにした。

#!/usr/bin/env bash



if ! [[ $plat_name =~ darwin ]] ; then
    return;
fi


function vpn.getFullName(){
  VPN_NAME=$(networksetup -listallnetworkservices  | \grep $1  );
  echo $VPN_NAME;
}

function vpn.isConnected(){
  VPN_NAME=$( vpn.getFullName $1 )
  [[ $(networksetup -showpppoestatus "$VPN_NAME" )  == connected ]];
}
function vpn.disconnect {
    vpn.menu_icon.conceal
    VPN_NAME=$( vpn.getFullName $1 )
    networksetup -disconnectpppoeservice "$VPN_NAME"
}
function vpn.menu_icon.conceal() {
    if type vpn_menu.py  2>&1 > /dev/null ;then
        vpn_menu.py -d
    fi
}
function vpn.menu_icon.display() {
    if type vpn_menu.py  2>&1 > /dev/null ;then
        vpn_menu.py -e
    fi
}

function vpn.connect(){
    vpn.menu_icon.display
    VPN_NAME=$( vpn.getFullName $1 )
    vpn.disconnect "$VPN_NAME"
    vpn.isConnected  "$VPN_NAME" || networksetup -connectpppoeservice "$VPN_NAME"
    cnt=0
    echo "conncting...";
    while ! vpn.isConnected "$VPN_NAME"
    do
    (( cnt++ ))
    printf "${cnt} time  .waiting...\r"
    sleep 1
    if (( $cnt > 30 )) ; then
      echo failed.
      return 1 ;
    fi
    done;
    printf "                                  \r"
    echo "connected"
    return 0;
}

function vpn.addRoute(){
  echo add route;
  for IP_ADDR; do
    echo ip route add ${IP_ADDR}/32 dev ppp0
    ip route add ${IP_ADDR}/32 dev ppp0
  done

}

関連資料

sudo -e ( sudoedit ) でvimで保存しても反映されない

sudo -e (名前=sudoedit ) コマンドは一時ファイルで編集する

sudo -e とは環境変数EDITORを使って、/tmp フォルダにファイルを作ってそれを開いてくれる。 エディタのプロセスを終了したら、元のファイルに上書きされる

:w だけでは反映されない

vim で開いているときは、 :w だと反映さません。時々ハマります、 :w を押しても更新が結果に出ない。 sudo -e を使っていると、なんでなんで、とパニックになることがあります。

sudoedit / sudo -e はそういうものです。

man sudo を見てみると sudoedit のポイントは次の通り。

長いので抜粋

シンボリックリンクの編集は許可しない

セキュリティポリシーによって指定されたエディタを起動して、 テンポラリファイルを編集する。

編集対象のファイルのコピーをテンポラリファイルとして作成する。 
編集作業がすむと、テンポラリファイルをオリジナルのファイルにコピーして、 テンポラリファイルを消去する。 


sudoers ポリシーでは、環境変数 SUDO_EDITOR,VISUAL, EDITOR を (この順番で) 使用する。
-e でエディタが実行されるときは、sudo を起動したユーザの環境が、 変更を受けずに使われる。

:w で保存できないのはそういうものです

sudo -e は不意な変更や途中でいったん保存したときに影響が出来ないよう

環境変数の維持が目的なら

vim の設定をそのまま引き継ぎたいなら、次のような代替手段がある。

sudo -E vim 
sudo -E $EDITOR

個人的な感想ですが

sudo vim するよりも、記述途中でファイルをいったん保存できるので、sudo -e のほうが好きです。

でも、終了しないと反映しないのをわすれてよくトラブります、その点については諦める。

参考資料

man sudoedit

-e, --edit 何らかのコマンドを実行するのではなく、1 個以上のファイルを編集する。 セキュ リティポリシーの参照では、コマンドのパス名の代わりに "sudoedit" という文字列 が使用される。 セキュリティポリシーによってユーザに権限があることが認められ ると、 次のことが順番に行われる。

             1.   編集対象のファイルのコピーをテンポラリファイルとして作成する。 テン
                  ポラリファイルのオーナーは sudo を起動したユーザである。

             2.   セキュリティポリシーによって指定されたエディタを起動して、 テンポラ
                  リファイルを編集する。sudoers ポリシーでは、環境変数 SUDO_EDITOR,
                  VISUAL, EDITOR を (この順番で) 使用する。 SUDO_EDITOR, VISUAL,
                  EDITOR のどれも設定されていない場合は、 sudoers(5) の editor オプ
                  ションにリストされたプログラムのうち、 最初のものが使われる。

             3.   編集作業がすむと、テンポラリファイルをオリジナルのファイルにコピー
                  して、 テンポラリファイルを消去する。

         編集する権限のないファイルを編集できないようにするため、 セキュリティポリ
         シーによって明示的に許可されていないかぎり、 以下の制限が行われる。

                         ·   シンボリックリンクの編集は許可しない (バージョン 1.8.15
                             以上)。

                         ·   sudo を実行するのが root であるときを除いて、 編集する
                             ファイルのパス中にシンボリックリンクがある場合、 そのリ
                             ンクの親ディレクトリが sudo を実行するユーザにとって書き
                             込み可能ならば、 リンクをたどらない (バージョン 1.8.16
                             以上)。

                         ·   sudo を実行するのが root であるときを除いて、 ファイルが
                             sudo を実行するユーザにとって書き込み可能なディレクトリ
                             にある場合、 そのファイルの編集を許可しない (バージョン
                             1.8.16 以上)。

         ユーザがデバイス・スペシャルファイルの編集を許可されることは絶対にない。

         指定されたファイルが存在しない場合は作成する。ここで注意すべきは、 sudo に
         よって実行されるコマンドの大部分と違って、 -e でエディタが実行されるとき
         は、sudo を起動したユーザの環境が、 変更を受けずに使われるということだ。 何
         らかの理由で sudo が編集した内容でファイルを更新できないときは、 ユーザに警
         告を発し、編集した内容をテンポラリファイルに保存することになる。

xvfb-run が標準エラーと標準出力を併せてしまう件

xvfb-run で実行すると stderr が取れない。

/usr/bin/xvfb-run を使えば楽ができる。 Xvfb を起動してDISPLAY変数をセットして、DISPLAY変数を渡して別途起動する、というプロセス管理をぱぱっとやってくれるシェルスクリプトです。

しかしstderr が取れない。

実行時に、このようにしてもstderr を捨てることが出来ない。

/usr/bin/xvfb-run /usr/bin/node chrome-cdp-sample.js 2>/dev/null

/usr/bin/xvfb-run が 2>&1 してた。

/usr/bin/xvfb-run:180行付近で渡されたコマンドをXvfb経由で実行されているのですが

# Start the command and save its exit status.
set +e
DISPLAY=:$SERVERNUM XAUTHORITY=$AUTHFILE "$@" 2>&1
RETVAL=$?
set -e

なんと、2>&1 してます。まじかよ。

これを、こう

# Start the command and save its exit status.
set +e
DISPLAY=:$SERVERNUM XAUTHORITY=$AUTHFILE "$@"
#DISPLAY=:$SERVERNUM XAUTHORITY=$AUTHFILE "$@" 2>&1
RETVAL=$?
set -e

こうすれば、stderr を取れますね。 なんでこんな事になってるんだろう。意味があるんだろうけど、想像がつかない。

参考資料

phpでOSの判定をする組み込み変数

php で実行環境をチェックするには

PHP_OS という、ウルトラ素晴らしい定数が、最初から組み込まれています。

<?php
var_dump(PHP_OS);

実行結果

macOS ( OS X ) での実行結果

string(6) "Darwin"

Ubuntu での実行結果

string(5) "Linux"

とてもかんたんにOSを判別できます。

参考

https://www.php.net/manual/en/reserved.constants.php

Excelの書式設定で数字を0埋めする。(ゼロパディング)

Excel で数字をゼロ埋めたい。

000123 のように数字を0で埋めることで、桁数が揃ったり、視認性があるので採用する人も多いと思います。

また、最大桁数が一瞥してわかるのも魅力ですね。

ゼロ埋めはヒューマンインタフェース*1として、対人間との情報のやり取りとして非常に優秀です。

数字をゼロ埋めにする書式設定

次のような、セルがあるときに

f:id:takuya_1st:20190909142609p:plain ( A列は比較用です

セルの書式設定→その他

セルの書式設定を呼び出します。

f:id:takuya_1st:20190909142621p:plain

書式設定で0をたくさん書きます。

ゼロの数でゼロ埋めの個数が決まります。

 0000: 123→ 0123
00000: 123→00123

今回は、0 を6つ書きました。

f:id:takuya_1st:20190909142636p:plain

000 の場合です。

では、最大桁数より少ないゼロの数を指定したらどうなるでしょうか。

結果は次のようになります。 f:id:takuya_1st:20190909144642p:plain

二回目以降はユーザー定義

一度書式を指定したら、次から、ユーザー定義に出現します。

そこから選ぶのが速いでしょう。

ユーザー定義書式に名前をつけられたいいのにな。

数字?文字?

数字のゼロ埋め 00123 のように記載するのは、文字列と数値をごっちゃにするので、あまりよろしくないのですが。

何がよろしくいかというと、数字であるところを、文字列にしてしまう方がいらっしゃいます。

さら悪いことには、ごっちゃにする方々への予防策のために、担当者が「うちでは0埋めを採用しない」とか「0埋めをみたら文字列だと思え」などと、謎なローカル・ルールが誕生してたりします。
声の大きいひとの意見が通るのは良くないですよね。理性的に行動してほしい。

セルの値を「数字」としてあつかい、表示の書式設定で0を補って数字を書式表示するのが正しい。

Excel ワールド

プログラミングを習ったことがある人だと printf(%06d, 134 ) のような printf による書式を考えてしまいがちです。

しかし、ExcelVBAには GNU bash のような 組み込み printf も、C言語のような stdio による printf もありません。

Excelにはエクセルの流儀があり、プログラミングの世界にはプログラミングの流儀があがります。

私はプログラマなので、これをExcel異世界だと思うようにしています。プログラミングとExcelの世界は似ていますが、違いますね。

「郷に入れば郷に従え」の通り、あれこれローカルルールや独自基準をつくらず、素直な解決方法を受け入れるようにしたいです。

*1:今どきの呼び方をするなら、UI/UXでしょうか

Excel でセルの書式設定をすると、なぜか中国(台湾・イ語)にロケールがなってしまう。

excelの書式設定を変えると。。。

なぜか、セルの書式設定で 0000 を設定し、再度画面を開くと、書式設定が次のように、非日本語判定されてしまいました。

f:id:takuya_1st:20190909135810p:plain

私は台湾はスキなんだけど、いまこのExcelで台湾を求めてないんです。

なぜか中国判定されてしまう。

別に問題はないのだけれど、ちょっと気持ち悪いと思います。

解決策

[$-ja-JP]0000000

設定したところ f:id:takuya_1st:20190909135835p:plain

これで解決。する。

嘘だろと思ったけど、本当に解決したので、メモ。

参考資料

Excelの「セルの書式設定」の「ユーザー設定」における先頭に0がある数値の設定につ - マイクロソフト コミュニティ