pcapファイルのn番目を表示する
cronなんかで毎時pcapなんかが固められていて、
それを利用するプログラムでエラーが起きた時に、
例えば1000番目のパケットでエラーというのが分かったなら
tcpdump -nn -r hoge.pcap -c 1000
で表示できる。
DBで大規模アクセスに対応するメモ
RDBで大規模サービスをやるときにどう捌くか。
joinを減らす(DBに考えさせない)- あえて正規化を崩す
- キャッシュサーバ使って、
I/O減らす(memchachedとか) - レプリケーションしてマスタ/スレーブに分ける。データ読み取りはスレーブ、更新はマスタのDBマシンへ。
linuxでGroovyをセットアップする
ちょうどCIとか、業務でやんないお話を調べているうちに興味が出てきたので。
SDKMANインストール->Groovyインストール、の流れ。10分くらいでできちゃいます。
NAT越えについてメモ
switchの通信対戦なんかでNAT越えの問題がよくあるみたいですが、ここら辺なんでダメなのかよくわかっていなかったのでメモ。
local<->grobalのIPを変換するのがNATlocal側に複数端末を割り当てるときは一つのgrobal ipでは外側からの通信をどの端末に届けていいかわからないので、ポート番号も組み合わせる。これがNAPT- 割り当てはルータの
NATテーブルに定義。これのフィルタリングがフルコーン(すべてok)・過去にlocalから通信した外部の端末のIPならok・過去にlocalから通信した外部の端末のIPとポートならok・シンメトリック型(LAN,WANのポートとIPで一組)の4つの形式がある - 普通のクライアントサーバ型のオンラインゲームなんかだと
NAT越えは比較的簡単 - というのも
local側から外に向かって通信しているので、その段階でNATテーブルが定義されているから - なんで
switchとかでNATを超えられないのかというと、P2P通信だから、お互いに外側からどこに向けて通信すればいいのかわからない。 - これを解決するために
STUNサーバのような外側から自分がどう見えているかを通知するやり方がある。
Vimで一度に4画面開く

こんな感じで一気に4画面開きたいとき、こうする。
vim D.py -c 'sp C.py' -c 'vs A.py' -c 'wincmd j' -c 'vs B.py'
参考
viewport - vim: open 4 files split horizontally AND vertically - Stack Overflow
パケットキャプチャしている端末を見つけ出す

ARPプロトコルのことを調べているときに、Wiresharkなんかでパケットを盗聴している端末を見つけ出す方法があることを知ったので、実際に試してみました。
普段の動作
パソコンがインターネットを通じて通信するとき、
送信するときは
「アプリが送るデータをソケットAPIでネットワークスタックに依頼」
->「OSが適時パケットの分割とヘッダの負荷」
->「NICから物理的な信号として送出」
受信するときは
「NICがブロードキャストor自分宛の通信か判断」
->「OSが受け取ったパケットを組み立て」
->「組み立て終わったデータがアプリへ」
という流れ。
(のはず…)
なので、普通の動きでは自分宛以外のパケットを認識することはできない。
でもこのNICに対して、自分宛以外でもパケットを拾うように設定することもできる。
これをプロミスキャスモードといいます。


プロミスキャスモード
Wiresharkなどのパケットキャプチャソフトはこうした設定でネットワーク上のパケットの様子を調べることができます。

でも全部を取り込んでいる、という点を突いて、キャプチャしている端末を見つけることができます。
パケットキャプチャしている端末を見つける
NICでは宛先macアドレスを見てブロードキャストor自分宛?を判断していて、
似たような判断はOSでもやっているのですが、そのチェックの粒度には差があって、
NICでは厳密にmacアドレスの最初から最後を見ますが、OSでは最初の何バイトかを見て判断しています。

なので、このチェック粒度の差とプロミスキャスモードを組み合わせて、ARPパケットを送りつけてあげることで、キャプチャ端末を特定することができます。
どういうことかというと、ぱっと見ブロードキャストなパケットで、しかもARP要求を送ってあげると
そのパケットは無事APPの層まで到達して、ARP応答が戻ってくる、という仕組みです。

環境
パケットキャプチャ側をRaspberry Piで、
偽ARPパケットをVirtual BoxのCent OSから送信します。
パケットの送信にはScapyというPythonのライブラリを使用いたしました。
まずキャプチャ側のNICをプロミスキャスモードにして、

偽ARP要求パケットを送出。

その様子をWiresharkで観察

ARPレスポンスが返ってくる。やったぜ。
参考
社内の盗聴者を見つけ出す---フリーツール「PromiScan」の使い方(中) | 日経 xTECH(クロステック)
ARPを利用してプロミスキャスモードの盗聴ホストを特定してみた - sonickun.log
盗聴者特定ツール
sniffer - How can I detect if someone is sniffing network packets on the LAN? - Information Security Stack Exchange
Windows Terminalをビルドしてインストールする

絵文字に対応したsshクライアントソフトを探していたら、
Windows Terminalなるソフトを見つけました。
冬には配信されるとのことだったけど、githubの方見たらビルドしてインストールはできるみたいなので、やってみました。
自分の環境ではこうだったよ、的な記事なので実際やるときは公式の方見ながら、自己責任でお願いします。
用意するもの
自分はVisual Studio 2017でやったので、githubを参考に以下を用意しました。
Guide for build and installation · Issue #489 · microsoft/terminal · GitHub
- Visual Studio 2017
- Windows 10 SDK (10.0.18362)
- Git for Windows
- Nuget.exe
- Windows 10 Version 1903
Git for Windowsはgitコマンドが使えるツールならなんでもいいです。
Windows 10 SDK (10.0.18362)は以下から
Windows 10 SDK – Windows アプリ開発
Nuget.exeは以下から「nuget.exe」を
NuGet クライアント ツールのインストール | Microsoft Docs
Windows 10 Version 1903は以下から「Windows 10 May 2019 Update」を
Windows 10 のダウンロード
Visual Studio側の準備
必要なものをVisual Studio Installerから入れていきます。
「C++によるデスクトップ開発」
「ユニバーサルWindowsプラットフォーム開発」
にチェック。

さらに、「インストールの詳細」->「ユニバーサルWindowsプラットフォーム開発」から 「C++ユニバーサルWindowsプラットフォーム開発」が未チェックならチェックする。

他に足りないものがあれば、あとでプロジェクトを開いた際に

こんな感じに足りないよ!って言われるので、適宜入れてあげてください。
プロジェクトの準備
以下のプロジェクトをcloneします。
GitHub - microsoft/terminal: The new Windows Terminal, and the original Windows console host -- all in the same place!
適当にディレクトリを作成して、そこで
git clone https://github.com/microsoft/terminal.gitします。

cd terminalして移動。
git submodule update --init --recursiveをします。

さらにNuget.exeを使って、nuget.exe restore OpenConsole.slnを打ってください。

プロジェクトを開いて、64bitマシンならx64に合わせて、Releaseでビルド。
おそらくたくさんエラーが出るので、それを修正していきます。

ちなみに以下に載せる修正の方法とかは、「準備するもの」に載せたIssuesのBuild Stepsに丸々載っているので、英語とか得意ならそっちを直接見た方が早いです。
VtPipeTermのmain.cppの修正。
TEST_LANGのCYRILLIC,CHINESE,JAPANESE,KOREANの前にu8プレフィックスを追記。

C2220エラーが出ているファイルは、適当なエディタで開いて、
UTF-8のBOM付きで保存してください。
Windows 10側の準備
以下をやっていきます。
- Windows 10 1903へのアップデート
- 開発者向け機能の設定
Windows 10 1903へのアップデートは画面に従って進めていけばオッケーです。
外付けのUSBとかくっつけてるとやり直しになっちゃうので、外しておきます。

それが終わったら「設定」->「更新とセキュリティ」->「開発者向け」から「開発者モード」を選択。
Windows Terminalのインストール
プロジェクトをVisual Studioで「ソリューションのビルド」。
ビルドが無事終わったら、Terminal->CascadiaPackageを右クリックして「配置」を選択。

もしDEP3321が出ているなら、

プロジェクトを一個一個右クリックして「プロパティ」から「ターゲットバージョン」「最小バージョン」を最新化してあげます。

これでインストール完了です。

絵文字もばっちりです。やったぜ!
