git diffで、特定のブランチでpull requestからマージした際の差分だけを取りたいなということがあったので、備忘で残しておく。

↓みたいな感じで、git merge-baseで前のcommitを取ってくればいいようだ。

git  --no-pager diff --name-only HEAD $(git merge-base HEAD HEAD^)

こんなんでできたのか〜、知らんかったな とい...


お仕事中、git diffの出力をフルパスで取得したいなぁということがあったので、いい感じのやり方無いかなと調べた結果。

↓みたいな感じで、--line-prefix オプションにgit rev-parseで取得したgitリポジトリのpathをくっつけてやればいいようだ。

git --no-pager diff --name-only --line-prefix=$(git rev-parse --show-t...

久しぶりにPythonのバージョンを上げてみたところ、なぜかPython3.8のときには動作していた以下のようなプログラムで、『can't register atexit after shutdown』というエラーが出るようになった。

なんだろうなと思ったのだが、どうもthreadingでちゃんとjoinを待たないとエラーになるようになったらしい。 (ちゃんとjoinしてたつもりだったけど、どうも別の処理と混同していた...


xargsで各引数ごとの出力の先頭を色分けして表示する

結構前にネットサーフィンしてたところ、xargsの行頭に引数を色付きで出力するようなコマンドについて見かけたのだが、同じような処理を既存のxargsで行えないかと思ったのでやってみた。

seq 3 8 | nl | xargs -n2 bash -c 'seq $1 | sed "s/^/printf \$(tput setaf 0)\$(tput setab $(($0 % 9)))$1\$(tput sgr0)\"...

前にgrepでひらがな・カタカナ・漢字を抽出する方法について書いてたことがあったけど、先日置換が必要になったので念の為残しておく。

PerlのUnicodeプロパティスクリプトを使った置換(perl)

置換と言ったらsedなのだけど、残念ながらPerlのUnicodeプロパティスクリプト(\p{Hiragana}みたいな指定)がsedでは使えない。 なので、Perlで置換処理を実行する必要がある。

# perlでひらがなだけを置換する場合
command... | perl -C -ple 'use utf8;s/\p{Hiragana}/_/g'
$ cat a....

2021年あけましておめでとうございます(´・ω・`)。 色々とゴタゴタしてるうちに2020年が終わってしまった…。 最近は時間が経つのが早い…。

そんな年末年始にdotfilesを色々といじってる際、再読込するとPATHが重複して登録される記述がところどころに散見される状態だった。 これを修正するのも面倒だし、どうしたもんかなと考えていたのだけど、bashrc/zshrcで読み込みんだ最後にPATHから重複した要素をすべて削除させることで対応することにした。

以下のような記述をbashrc/zshrcの末尾に記述すればいい。

export PATH=$(printf %s "$P...

たまに、複数のDNSサーバに複数のドメインやIPアドレスの名前解決の結果を取得したいことがある。 要はdigを複数のサーバに対して複数の引数で連続でバーっと雑に実行したいということがあった。ので、bash functionを作った(昔に)。

本当は並列でバーっと処理するように書いたほうが良かったのかもしれないが、そんなに頻繁に実行しないだろってことでシングルになっている。

結構頻繁に使うので、自分のdotfilesにも組み込んでる。

# color code
export COLOR_RED=$'\E[0;31m'
export COLOR_GREEN=$'\E[0;32m'...

たまに、雑にパラレルにpingを打ちたいということがあったので、そういうbash funcionを作った(だいぶ前に)。 pingの行頭にtimestampを付けて、かつ雑にブレース展開などで複数のipアドレスにpingを打ったりできるようにしている。

pingの他、port指定のためにcurlコマンドが必要になるけど、まあfunctionとかを自由に入れられる環境なら入ってるでしょってことでチェック入れてない。

自分のdotfilesにも組み込んでる。

# color code
export COLOR_RED=$'\E[0;31m'
export COLOR_GREEN=$...

ふと、バイナリファイルの置換とかってどうやるのかなと思ってググってみたのだが、実はそれ専用のコマンドでbbeというものがあることを知った。 sedと同じような構文で、より効率的にバイナリの置換処理ができるらしい。

ちょっと便利そう。

1. インストール

MacOSや比較的メジャーなディストリであれば、普通にパッケージ管理ツールからのインストールができる。

# MacOSの場合
brew install bbe

# aptの場合
sudo apt install bbe

# pacman
sudo pacman -S bbe


Chinachu(Docker+PX-Q3PE4)+Amatsukazeによる録画+自動CMカット・エンコーディングを行う録画システムの構築

最近、家の大掃除と並行してNW構成や仮想基盤についてもすべて再設計しての作り直しを行っていたのだが、そんな中でPLEXのPX-Q3PE4が手に入ったので、せっかくだから今風の録画システムを作ってみることにする。

今風というにはちょっと古いかもしれないが、録画の管理には安定して動作してそうなChinachuを使う。 録画サーバ側の構築はめんどくさいのでDockerで行う。

また、CMの自動カット・エンコーディングについても自動で行わせたい。 なので、別途Windowsサーバを用意してAmatsukazeをサーバとして稼働させることにした。 こちらではNvidiaのGPUを使って、ハー...


ちょっとした作業をする際に知ったのだが、2017年頃にリリースされているOpenSSH v7.6以降ではReverse Dynamic Forwardingというものが追加されていたらしい。

-Dオプションで指定するDynamic Forwardingの逆で、sshサーバ側からsshクライアント側にsocksの口を開くというものらしい。 こんなの追加されてたんだ…(知らなかった)。

オプションの指定は簡単で、-R...


今年に入ってから自宅の環境を全部作り変えしたのだけど、その一環としてGithubのリポジトリをローカルのGitlab-CEにMirroringしてバックアップをする仕組みを取り入れてみた。

実はGitlabではGithub等とのMirroringの仕組み自体は用意されているのだが、残念ながらGitlab-CEではpushしか扱えない様になっている。 (Gitlab-EEではpush/pullどっちもできるのだが、Github-CEではpullができない(少なくとも、手元のGitlab-CE13.2.2ではダメ。))

流石に個人用に使ってるGitlabでEEを使うのはお財布的にちょっ...


なんかコロナで在宅になってたり、このBlogのシステムの移行したり、家のサーバ環境を一新したり、etc,etc...と色々やってたら、もう9月になってたことに気付いてちょっとビビった(´・ω・`)。

しばらく何も書けてなかったのだが流石にその間に忘れちゃってることも多いので、今月辺りからちゃんと残すようにしよう…。

最近は仕事の内容がインフラからWebサイトの診断とかそういうのがメインになってきてやることが結構変わって...


職場や自宅では、クライアントマシンとしてMacを使っている(+Manjaro in Thinkpad)。 で、個人的にその日の作業用に日付別のディレクトリ(自分の場合は~/Work/YYYYMM/YYYYMMDD/)を作っておいて、そこに一時ファイルやダウンロードしてきたファイル、その日のメモなどを配置するような使い方をしている。

このとき、ダウンロードディレクトリ (~/Downloads)を日付別のダウンロードディレクトリ(~/Work/YYYYMM/YYYYMMDD/Downloads)のシンボリックリンクとすることで、ディレクトリが日付別になっていることを意...


最近は定型的な作業はfunctionを事前に作っておいてそれを使うようにしているのだけど、たまにwatchコマンドとかで実行させたいときに引っかかることがある。

悲しいことだけど、watchコマンドなどではfunctionやenvは読み込んでくれない(PythonとかからSubprocessなどで呼び出す場合でも同様だろう)。 なので、以下のように無理やり実行する方法を使っている。

watch "bash -c 'source ~/.bashrc 2>/dev/null; function ...'"

これでfunctionをwatchコマンド内でも実行できるようにできる。

...


たまにsshfsでマウントした領域のログファイルに対してtail -fをすることがあるのだけど、どうも更新を検知してくれないということがあった。 なんでだろうなと調べてみたところ、どうやらsshfsではsftpプロトコルを使っているので、inotifyを使ったファイルの更新検知ができないらしい(まぁそらそうだわ…)。

調べてみたところ、対応としてはtailでinotifyなしでもファイルをチェックするように「---disable-inotify」オプションを付与してやればいいようだ。 インターバルの指定は「-s」で指定できる。

tail ---disable-inotify PATH
...

少し前(というか2019年の年末)に、Twitterでファイルをコマンドで利用したあとにリダイレクトで上書きしてはいけないよねというツイートがあった。

これは結構やってしまう(そしてやらかして学習する)人が多いと思うのだけど、shellの解釈の順序の関係でコマンドの処理より先にリダイレクトの処理が...


先日実施された第45回シェル芸勉強会に出席してきたので、その復習。 前回の45回はawkでゴリゴリ解いていくような問題が多かったのだけど、今回はいろんなコマンドを組み合わせて解いていくような問題が多めになっているらしい。

問題および模範解答はこちら。あと、問題を解くに当たって必要になるファイルは以下のコマンドで取得してくる。

git clone https://github.com/ryuichiueda/ShellGeiData

Q1.

csvファイル「data.csv」に、日別のトマト・バナナ・ピーマンの売れた個数が書かれているので、それぞれが記録されている最後の日の日付...


よく作業用のディレクトリとかを一定期間ごとにtar(+gzip)でアーカイブしてあるのだが、たまに過去のデータを調べるためにそのアーカイブしたファイルの中を検索したい事があったりする。 そういった際にいちいちアーカイブを展開して調べるのは面倒なので、なんかいい方法が無いかなと考えていたところ、どうやらGNU tarだと「--to-command」で指定したコマンドに対し、標準入力でtar内のファイルの中身を渡すことができるらしい。 なので、環境変数でtar内のどのファイルなのかも出力させることができる。

ただ標準入力から受け付けてるので、tar内のどのファイルに指定した文字列が含まれて...


ふとした思いつきで、bashやzshのhistoryファイル(通常は環境変数のHISTFILEで指定したファイル)以外のファイルに、任意のフォーマットで実行したコマンドや実行時間、カレントディレクトリといった情報を記録できないだろうかと思ったので、試してみることにした。 今回はファイルに出力しているが、中の処理を書き換えれば実行履歴をDBに記録することもできると思うので、もし利用する場合は使い方に応じて適宜書き換えて貰えればいいだろう。

なお、この方法は単純にシェルの設定で対処しているだけの方法なので、ログの記録を強制できるというものではない(回避することは可能なはず)。 もし実行コマンド...


ごくごくたまにではあるのだが、GoogleやらBingの検索結果を一覧で取得することがあったのでそういうスクリプトをこさえて対応していた。 で、その実行結果で特定のドメインの検索結果からPATHごとにどのようなGETパラメータが使われているか集計したいということがあった。

具体的に言うと、例えば自分がよくお世話になっている上田先生のブログ(https://b.ueda.tech/)で検索かけて、その結果となるURLの一覧を抽出したとする(上田先生勝手にスミマセン…)。 その場合、以下のようなURLの一覧が取得されるのだが、そのPATHごとにどのようなGETパラメータをのパラメー...


たまにlogを見ながら作業をしたりすることがあるのだけど、そういうときサーバによってはログの日付がGMTで記録されてたりする。 ここは日本であり、やはり自分もJSTで普段生活しているので、いちいち脳内で+9時間して読み取るのはちょっとだるい。できればJSTになってる時刻でログを読みたいところ・・・。

というわけで、取得したログをJSTに変換して出力する方法について考えてみることにした

1. awkで日付を変換する(外部コマンド使用)

apacheのログなんかだと、デフォルトでは日付の表記が「28/Nov/2019:09:03:19」のようになってしまっている。 これだとちょっと...


Twitterをボケーッと眺めていたところ、xargsで呼び出したコマンドにキー入力をしたいという内容があったので、どうやったらできるのか調べてみた。

通常、対象のプロセスで標準入力が開いてないとだいたいの(というか、普通の)コマンドは処理を待たずに終了してしまう。なので、なんとかしてターミナルを標準入力として渡してやればいいということになる。

1. /dev/ttyを読み込ませる

以下のように、/dev/ttyをxargsで呼び出したコマンド内部で読み込ませる事で、ターミナルの入力を渡すことができる。


先日のシェル芸勉強会において、awkで巨大な数字を取り扱うという内容があった。 awkでは、巨大な数字を扱おうとすると以下のようなエラーが出力されることがあるのだけど、これを回避する方法について考えるという内容だった。

$ echo|awk '{print(999^300)}'
+inf

Stack Overflowとかを漁っていると、どうも53bit分までのデータしか扱えないため、それ以上の数字になるとinfとして扱われてしまっている模様。

c++ - Does big integer in AWK only have 53 bits? - Stack Overflow

...

先日行われたシェル芸勉強会の中で、別のファイルから1行ずつデータを取得させたいということがあった。 いろいろとやり方を調べたりしていたのだが、その中でくんすとさんがいい感じの回答をしていた。

cat speech | awk 'NF==0{getline< "speech2"}{print}'#シェル芸

実行例を書いてみる。 以下の例では、「seq.txt」の空行に「aiueo.txt」というファイルの中身を差し込んでいっている。


pythonで簡単なCUIのツールを作っていたとき、pipでインストール時にbash/zshの補完ファイルも一緒にインストールさせたいというのがあったので、やり方について調べてみた。 で、結論としては以下のようなsetup.pyを作成すれば良さそうだということがわかった。


ちょっとしたツールをPythonで作ったので、pipインストールできるように以下のようにsetup.pyを書いてたのだけど、どうもinstall_requiresが処理されないということがあった。

setup.py
import os import platform import setuptools from hoge import __version__ if __name__ == "__main__": setuptools.setup( name='hoge', version=__version__, ins...

先日実施された第44回シェル芸勉強会に出席してきたので、その復習。 今回は実用的な内容…ということだったのだが、そうはならんかったらしい(´・ω・`)。 冒頭で、awkなどでゴリゴリ書いていく問題がメインらしいので、多分難しめなんだろうなぁと思ったけど、おわってみたらやはり難しい問題が多かった。

問題および模範解答はこちら。あと、問題を解くに当たって必要になるファイルは以下のコマンドで取得してくる。

git clone https://github.com/ryuichiueda/ShellGeiData

Q1.

数独の問題で、マップ?のデータから各行列にどのような値が入って...


tmuxでアクティブpaneかどうかでの色分けをpane_synchronizedに応じて切り替える

普段あまりtmuxを使っていないのだけど、tmux.confの設定でアクティブなpaneかどうかで色を分けるといった対応をしていたりする。 ↓こんな感じ。

で、pane_synchronizedかどうかに応じてこのアクティブなpaneだけ色を変えるのをtmux.confで変更したいということがあったので、その備忘。 対処方法だが、ちょうど自分がpane_synchronizedの切り替えをショートカットキーでトグル切り替えで処理していたので、以下のようにtmux.confに記述することで対処した(自分のtmux.confから抜粋)。

#-----------------------...

個人的に Goでsshのクライアントコマンド を作ってるのだけど、ssh接続で使用している処理が肥大化してメンテナンスが辛くなってきたので、ライブラリとして外出しすることにした。

以下のようなことが簡単にできるように作ってある。 細かい使い方については GoDoc を参照してもらえれば…(´・ω・`)。

  • ログインシェルへの接続(Ctrl+Cとかタブ補完もできる)
  • ターミナルログの取得(タイムスタンプ付与)
  • sshやhttp,socks5の多段プロキシ接続
  • x11 forwarding
  • port forwarding
  • pkcs11認証(Yubikeyとかの物理...