http/2 通信をしているか確認したい。
Chromeの開発ツールで手軽に確認ができます。
開発ツールを開いて、ネットワーク・タブを開く
ネットワークタブのヘッダ行を右クリック
ヘッダ行を右クリックすると、いろいろ選べる。ここからプロトコルを選ぶと、HTTP2 通信かどうか確認できる。
HTTP/2のときは h2
と表示される。
ちなみに、HTTPメソッドも確認できる
いちいり詳細をクリックしなくてもリモートアドレスやGET/POSTなどのメソッドも確認できて便利
私はやってませんでした。物理的に破壊すればいいと思ってたので。
中古HDDなんてヤフオクに出してもクレームの嵐だし。
それでも一定需要があるので「安全に・手軽に」読めなくすることで安心してHDDを出品できるようにすればいい。
HDDの物理破壊では危険です。物理破壊する業者が中間でデータを抜き去る可能性があります。
業務用PCの廃棄業者に丸投げするのも危険です。いくら契約で縛り付けようと、情報が一度流出してしまえば元も子もありません。
破棄するまえに、他社に移管する前で破壊しなくてはいけません。 しかし物理破壊するのはコストが高いです。
推奨されるのは、「データの暗号化」です。暗号化を複合する鍵がなければデータは読めません。iPhoneなどApple製品はこの方式です。
コマンドでデータを破棄する方法は物理破壊より時間はかかりますが、確実にデータを消去することができます。
物理破壊はコストも管理もずさんになるので全くおすすめしません。ところが世間では物理破壊がメインに採用されています。信じられない。
ふと思い出したんですよ。HDDって物理的に破壊する必要があるのかなって。
HDDって最近値下がりしてないし、まだまだ需要があるのかもって思い直しました。
HDDはシュレッダ(shred)コマンドにかけてデータを破壊するか、暗号化ディスクとして読めなければ十分ですよね。
暗号化はOS付属機能でかんたんに実現できるので、ここでは紹介しません。
今回は 「安全にデータを破壊する」方法です。
shred -v /dev/sdX ## または shred -vfz /dev/sdX
-v
を忘れない-v
は進捗状況を表示するオプションなので、これをわすれるといつ終わるのかが全くわからなくなる。必ずつけること
shred コマンドはランダムでファイルを書き換えていくのですごく時間がかかる。しかも3回やる。時間がかかる。本当にかかる。2TB消去するのに、数日とかかかる。
HDD の Write が 50MB/s 程度とすると、100MBに2秒 1000Mに20秒 1000*1000MBに 20,000秒 で、2.5日かかる
もし限界の150MB/s 程度が出たとしても、数回のランダムで埋め尽くすには 24時間程度じゃ足りない。
shred --verbose --random-source=/dev/urandom -n1 /dev/sbX
とにかく最低限で必要十分エントロピーを確保してなデータ消去ならコレで良い。
hdd を shred に掛ける時間を測定する。
4TB のHDDを消去するのに、さて何分掛かるでしょうか。
使ったのは、WD4TB WD4ERFXです、だいたいこれくらいの速度が出ます。
takuya@m75q-1:~$ sudo time shred -vfz /dev/sda [sudo] password for takuya: shred: /dev/sda: pass 1/4 (random)... shred: /dev/sda: pass 1/4 (random)...567MiB/3.7TiB 0%
4TBのShredに何時間かかったのか
user 12743.30 system 33:55:52
34時間です。結構かかりましたね。。。
通常使うなら暗号化ディスクで十分ですね。
まさか、ディスク完全消去のソフトウェアを購入したり、ドリルで穴を開けたりしないでしょ。
shred コマンドでデータを消せない場合があります。SSDです。こいつはいまのところ上書きで消せません。そのため暗号化が必須になります。
いまのところ、SSDをセキュアに完全消去する用事がないので。。。リンクだけ置いときます。
https://wiki.archlinux.org/index.php/Solid_state_drive/Memory_cell_clearing
安全に廃棄するにはドリルとかいうナンノコッチャな対策が世間を賑わせているので。このエントリが検索結果に上位に来るように書き直した。
こんなことを書いていると、ほんとうに思った通りの事件が起きて驚きました。
shred 時間測定したので追記。
takuya@:教科書$ find -type d -maxdepth 1 | xargs ll xargs: ll: そのようなファイルやディレクトリはありません
悲しい。Aliasはあくまで bashのエイリアスであり、シェル経由せずにfork するような場合には全く役に立たない。linux のコマンド実行の仕組みを知っていると別に不思議でもなんでもないんだけど初心者にはコレが不思議らしい。
sudo のときと同じように再帰的なalias展開を使えば、なんとかなる時がある。
alias xargs='xargs '
これをすれば 、動く
takuya@:教科書$ find -type d -maxdepth 1 | xargs ll ./2018-04-23-スキャンファイル: 合計 336K
alias の再帰的な展開に限界があるので、xargsにオプションつけたら、を渡せない
takuya@:教科書$ find -type d -maxdepth 1 | xargs -p ll xargs: ll: そのようなファイルやディレクトリはありません
あああ、、振り出しに戻る。。
find -type d -maxdepth 1 | xargs -I@ bash -c 'source ~/.bashrc;ll @'
find -type d -maxdepth 1 | xargs -I@ bash -ic 'll @'
コマンド文字のエスケープがあるので、ファイル名に「空白」 「&」などが挟まると面倒なことになる。
エイリアスが、bash_aliases変数にあることを利用して
echo "${BASH_ALIASES[ll]}" ls -l -h
これをつかって
find -type d -maxdepth 1 | xargs -I@ ${BASH_ALIASES[ll]} @
などと出来なくもないが、良い解決策はないようです。
どうしても使いたいのであれば、 /usr/local/bin/xargs.sh を作って
引数のaliasを手作業で展開するしか無いと思う。めんどくさいわりに得られるものがないので作るのはしないけど。
#!/bin/bash # 引数を受け取ってalias を展開する #xargs に渡し直す
諦めましょう。
https://unix.stackexchange.com/questions/141367/have-xargs-use-alias-instead-of-binary
以前、rcloneについてのエントリを書きました。いまも便利に使っています。 rclone コマンドで google ドライブにデータを転送する(rcloneインストール方法と使い方) - それマグで!
root で実行すれば良いんですけど、指定したユーザーでないとアクセスが出来ないファイルのバックアップが出来なかったりするので不便です。( ~/.ssh/id_rsa など )
でも、設定ファイルをいっぱい書くのは管理が不便なのでめんどくさい。
config オプションを付ければ、設定を再利用できる。
rclone --config /home/takuya/.config/rclone/rclone.conf sync $SRC gdrive:$DST > /dev/null
config は、 ~/.config/rclone に保存されているので、そこを使えば設定を再利用できる。
rclone だと手軽にクラウドをバックアップサービスに使えるから便利ね。
不要になった runner や、名前をつけ間違えたrunnerを削除したい。
でもGitLabのWeb側で削除したけど、残ってたので、よくわからなったのでまとめた。
sudo gitlab-runner verify --delete
takuya@sakura:~$ sudo gitlab-runner verify --delete Running in system-mode. Verifying runner... is alive runner=b1c83735 Verifying runner... is alive runner=00b62a52 Verifying runner... is alive runner=90cd2aef Verifying runner... is alive runner=a4facb27 ERROR: Verifying runner... is removed runner=5be0fea6 Updated /etc/gitlab-runner/config.toml
消した結果、一つ減りました。
takuya@sakura:~$ sudo gitlab-runner verify --delete Running in system-mode. Verifying runner... is alive runner=b1c83735 Verifying runner... is alive runner=00b62a52 Verifying runner... is alive runner=90cd2aef Verifying runner... is alive runner=a4facb27
--delete オプションで簡単です。unregister はgitlab-server 側から削除される前なら使えるんだけど、削除後はコレが一番簡単だと思う。
remove とか探したけどないし、 stop / start も違うしちょっと迷ったのでメモ。
エラーになりました。
node-pre-gyp WARN Tried to download(404): https://fsevents-binaries.s3-us-west-2.amazonaws.com/v1.2.4/fse-v1.2.4-node-v67-darwin-x64.tar.gz node-pre-gyp WARN Pre-built binaries not found for fsevents@1.2.4 and node@11.0.0 (node-v67 ABI, unknown) (falling back to source compile with node-gyp) gyp ERR! configure error gyp ERR! stack Error: Command failed: /Users/takuya/.pyenv/shims/python2 -c import sys; print "%s.%s.%s" % sys.version_info[:3]; gyp ERR! stack pyenv: python2: command not found gyp ERR! stack gyp ERR! stack The `python2' command exists in these Python versions: gyp ERR! stack 2.7.15
python2じゃないってエラーじゃん。
macOS の標準システムをターゲットに作られているのでpyenv が入っていたら消す。
該当プロジェクトに入って
pyenv local system
npm するまえに、pythonをシステム標準のものにする必要がある。怖い。
node-gyp がエラーになりだすと、gyp 関連で落ちてるのか、node のバージョンで落ちてるか、本当にわからない。
たいていは fsevent でエラーになるんだけど。npm マジ困る。
Google Oauth を使うと、Gitlab側でいちいちユーザーを作らずに済むので便利。
Google OAuthの設定で2つの連携設定がある。
httpsはあったほうが良い。っていうか今どきは当たり前。
Google アカウントでAPI Consoleにログインして、Google のOAuth用のWeb credential を作る。
gitlab の設定をする。
omnibus の場合 /etc/gitlab/gitlab.rb
この設定が大事。
gitlab_rails['omniauth_block_auto_created_users'] = false
この設定を true にするとユーザ登録はできてもブロックされる。
ちなみにデフォルトはブロックです。 GoogleのOAuth連携できるユーザーはすべて無条件で許可されてしまいます。
この設定をfalse にすると google で認証されたユーザーは無条件に許可されるので、Gitlab側の設定で「ドメインに制限」を掛ける必要がある。
Gitlab側の設定では
とたどって許可したいドメインだけに限定しないと大変なことになる。
### OmniAuth Settings ###! Docs: https://docs.gitlab.com/ce/integration/omniauth.html gitlab_rails['omniauth_enabled'] = true gitlab_rails['omniauth_allow_single_sign_on'] = ['google_oauth2'] # gitlab_rails['omniauth_allow_single_sign_on'] = ['saml'] # gitlab_rails['omniauth_sync_email_from_provider'] = 'saml' # gitlab_rails['omniauth_sync_profile_from_provider'] = ['saml'] # gitlab_rails['omniauth_sync_profile_attributes'] = ['email'] # gitlab_rails['omniauth_auto_sign_in_with_provider'] = 'saml' gitlab_rails['omniauth_block_auto_created_users'] = false # gitlab_rails['omniauth_auto_link_ldap_user'] = false # gitlab_rails['omniauth_auto_link_saml_user'] = false gitlab_rails['omniauth_external_providers'] = ['google_oauth2'] gitlab_rails['omniauth_providers'] = [ { "name" => "google_oauth2", "app_id" => "xxxxxxxxxxxxxxx0dse47iulk.apps.googleusercontent.com", "app_secret" => "xxxxxxxxxxxxxxxxxx", "args" => { "access_type" => "offline", "approval_prompt" => "" } } ]
設定したら gitlab を reconfigure してログインをチェックする。コレが大事。
ぱぱっとやれば大丈夫。
VG構成はディスクを再利用するときにどうなってたかわからないと再現が難しい。とくに複数のPVをVGにまとめてから切り出しているときなど。
takuya@:~$ sudo vgcfgbackup Volume group "data" successfully backed up. Volume group "home" successfully backed up.
vgcfgbackup
を使って構成をバックアップとっておくとちょっとだけ安心できる。
リストア(復旧・リカバリ)するには vgcfgrestore を使う。
vgcfgrestore -f /etc/lvm/backup/home home
試したいけど、LVM環境を作って試すのがめんどくさいのでメモ程度。
Gitlabでpushするssh のポートを自分の独自のポートにしたい。
自宅サーバーで運用してたり、セキュリティ的な問題でポート22番以外を使ってるとき、gitlabでsshを使おうとするとデフォルトの22ポートになるので不便。
かといって、.ssh/config で設定するのもめんどくさい。
調べたらできることがわかった。gitlab ホント柔軟に使えるな。
設定ファイルを書き換えて再起動でオッケ
/etc/gitlab/gitlab.rb
gitlab_rails['gitlab_shell_ssh_port'] = 2222
再起動
gitlab-ctl reconfigure
これでコピペするURLにポートが含まれるようになる。わーい。
フレッツ光ネクストを使っていると、例の壊れたv6がWiFi経由で割り振られて辛い。
個人的には、v6のほうが空いているし、フレッツIPv6網の通信は高速なので使いたいんだけど、まだまだv4です。v6→v4 のフォールバックが発生するのが悲しい
内線外線がないGWで守れない通信は正直つらいところ。フレッツ機器でv6を使いたいし網内折返しをフィルタリングをしたいんだけど、、、不便だよね。
sudo networksetup -setv6off Wi-Fi
WiFiの名前は
networksetup -listallnetworkservices
これで取得することができる
su を実行するとカレントディレクトリが変わってしまうので、いまいるディレクトリやeditor 変数をそのままに 別ユーザーになりたい。
sudo にオプションを付ければ、カレントディレクトリなど現在の環境をそのまま維持してsu することができる。
sudo -E su
-E, --preserve-env 現在の環境変数をそのまま保持するのがユーザの意向だと、セキュリティポリシーに指示する。 ユーザが環境を保持する許可を持っていない場合は、 セキュ リティポリシーがエラーを返すことになるだろう。
環境変数の設定と維持は sudoers の設定と密接な関係にある。
私の場合、sudo 実行時に余計な環境変数を持ち込みたくないのでリセットしている。というかディストリビューションのデフォルトはほとんど場合が環境変数を初期化するはずだ。
Defaults env_reset
この設定があれば、 /etc/environment
の設定で環境変数がリセットされるはずだ。
sudo -E
を毎回付けるのが面倒な場合は env_reset を消してしまえばいい。
個人用のLinux Desktop だと便利だと思う。 ただ、共有のサーバーなどでこれをやると知らないあいだに alias 書き換えられてたりして、気づかずマルコマンドを実行する恐れがあって怖い。
なので、他の設定 etc_keep や set_env を sudoersで組み合わせて必要な環境変数だけ持ち込むのがベターだとおもう。これらのついては、はどこか別の機会に
出来ない・・・
ls *.txt | xargs -I@ echo @ ; sleep 1
forループならできるんだけど、for ループだとどうしても不便。
xargs だと限界があるので、もうシェルの文字列にして渡すしか、他に選択肢がない。
ls *.txt | xargs -I@ sh -c 'echo @ ; sleep 1'
これなら動くんです。動くんです。
xargs が1つ実行するたびに、 sh -c 'echo @ ' の@ の部分にファイルを文字列として入れて渡してくれる。
sh だと機能が少ないので、bashにしてやるという手段も取れる。
ls *.txt | xargs -I@ bash -c 'echo @ ; sleep 1'
もうここまできたら、なんでもあり。シェルに文字列渡すんでス。ここなら何でもありです。条件の入力だってできちゃう。
ls *.txt | xargs -I@ bash -c ' [[ @ =~ 2017 ]] echo @ ; sleep 1'
これで、for がなくても戦える。
なんだけど、ここまでする必要あるかなぁ。コマンドを履歴に残したいとかパラレルに実行したいときには相当便利だけど、コードメンテしにくい。。。両刃の剣か。
社内のファイルサーバーのリファラURLが漏れると恥ずい。いやまずい。
何がまずいかというとファイル名が漏れてしまったり、アクセス元のURLとして晒されたり、検索インデックスに追加される恐れがあるからだ。
server { add_header Referrer-Policy no-referrer always; }
これを書くと、ブラウザがリファラを送らなくなる。一般的なブラウザの場合だけどね。 サーバー側で制御できるものはしちゃったほうが良いね。
リファラでファイル名がバレるとそれを使っってターゲット・フィッシングメールが作れるもんね。
origin same-origin strict-origin
基本的に使わない。このサイトからリファラを送るならURLにパスを入れないでくれ。 リファラURLでなく、リファラドメインだけが送られる。
基本的にコレ。このサイトでは同一ドメインでリファラを送ってくれ。 HTTPでセットされたとき、HTTP→HTTP(s)で送られる、HTTPSでセットされたとき、HTTPS→HTTPSのみ、HTTPS→HTTPはリファラ対象外。
このサイトではリファラを絶対送らないでくれ。というヘッダ。
詳しくは、参考資料のMDNページ
https://developer.mozilla.org/ja/docs/Web/HTTP/Headers/Referrer-Policy
https://pypi.org/project/pypdfocr/ というツールを見つけたので、使ってみる
takuya@deskew$ pip install pypdfocr Collecting pypdfocr Using cached https://files.pythonhosted.org/packages/c3/23/1bf42cb12af63d498fcd425882815c21efef37800514dbad9fa28918df5e/pypdfocr-0.9.1.tar.gz Requirement already satisfied: pillow>=2.2 in /Users/takuya/.pyenv/versions/3.7.0/lib/python3.7/site-packages (from pypdfocr) (5.3.0) Collecting reportlab>=2.7 (from pypdfocr) Using cached https://files.pythonhosted.org/packages/d8/d5/583e6235d0c690c2cda2cd080c60413fbf7be8d8e012e003087202edfb50/reportlab-3.5.9-cp37-cp37m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl Collecting watchdog>=0.6.0 (from pypdfocr) Using cached https://files.pythonhosted.org/packages/bb/e3/5a55d48a29300160779f0a0d2776d17c1b762a2039b36de528b093b87d5b/watchdog-0.9.0.tar.gz Collecting pypdf2>=1.23 (from pypdfocr) Using cached https://files.pythonhosted.org/packages/b4/01/68fcc0d43daf4c6bdbc6b33cc3f77bda531c86b174cac56ef0ffdb96faab/PyPDF2-1.26.0.tar.gz Collecting evernote (from pypdfocr) Using cached https://files.pythonhosted.org/packages/f9/6b/877f8edef8ef040d32eb38f3bf6322ba334de9d10614d8db9d869c162fc1/evernote-1.25.3.tar.gz Complete output from command python setup.py egg_info: Traceback (most recent call last): File "<string>", line 1, in <module> File "/private/var/folders/ff/fc49g5wd6xncjylvwy4tdygc0000gn/T/pip-install-yx8p73r2/evernote/setup.py", line 6 exec x ^ SyntaxError: Missing parentheses in call to 'exec' ---------------------------------------- Command "python setup.py egg_info" failed with error code 1 in /private/var/folders/ff/fc49g5wd6xncjylvwy4tdygc0000gn/T/pip-install-yx8p73r2/evernote/
ちょっと困りますよね。python2系は流石にちょっとと。でも動けばいいしPDFをぱぱっと扱えるならpython2でも我慢する。
pyenv global 2.7.15
pip2 install pypdfocr
brew install tesseract
pypdfocr my.pdf
うーん、めっちゃ時間かかる。時間かかる割にtesseractの調整をしてないから精度がいまいちな気がする・・・・・日本語も取れないし。tesseractをちゃんと設定しないとダメだし、所詮OCRなので・・・諦める。
img2pdf を使ってみる
img2pdfは pip で提供されている pythonのコマンドなので pip でインストールする。
pip install img2pdf
これで準備出来た。
ls *.jpg | xargs -I@ img2pdf @ -o @.pdf
ちゃんとしっかり変換できた。
pdftk *.pdf cat output combined.pdf
pdf は1枚ずつ変換してPDFにまとめたほうが良いっぽい
このコマンドは、PDF にJPEGをそのまま埋め込みして変換するので、再エンコードが発生せずに、元のJPEGのまま埋め込める。
言われてみたらたしかに、そうだった。その視点はなかった。
そうだよね。確かこのコマンドを調べて記事にした頃、magick だと変換するので遅いし劣化するから困って無圧縮(無変換)で探してたかもしれない。メモから記事にしたのですっかり忘れてる。