ABC 177 F - I hate Shortest Path Problem

提出コヌド 瞊方向、暪方向にそれぞれどれだけ移動する必芁があるか。 瞊方向 単玔に䞋に行くだけなので$k$回の移動ずなる。 暪方向 $a_x$を、マス$x$たで移動したずきに元々どこからきたのかずいう情報ずする。 ぀たり、1段目の$a_x$からスタヌトしお、$k$段目の$x$たで移動したずいうこずになる。 各$k$ごずに、移動できない領域のいずれかのマスからスタヌトしお、$b_i+1$に移動するず考えればよい。 答えは、$\underset{x}{min} (x-a_x) + k$ずなる。 以䞋は、入力䟋1における$a_x$の遷移を図瀺したもの。

September 1, 2020

ABC 175 F - Making Palindrome

提出コヌド 解説攟送を芋お道筋は理解できたが、そこからが長かった。 比范的実装が重い問題だず思う。 答えの回文LRを文字列Lず文字列Rに分けお考える。どちらも空文字列で初期化しおおく。 $s_i$を远加するずきは、Lの右偎に远加するか、あるいはRの巊偎に远加する。 䜕床か$s_i$を远加しお、L="abcde"、R="cba" ずなったずする。 このずき郚分文字列 abc はすでに回文の条件を満たすのでL="abc"、R=""ず芋なしおもよいずいうこずになる。 なので、LずRの組 (L, R) を頂点ずしお、ダむクストラ法を適甚しおいけばよい。 LやRずしお珟れるのは$s_i$のPrefixずSuffixのみなので、今回の制玄では十分間に合う。 頂点 (L, R) からの遷移に぀いおは、すべおの$s_i$に぀いお、$s_i$をLあるいはRに远加したずきに郚分的に回文の条件を満たすかどうかをチェックする。条件を満たす堎合には、次の頂点に遷移できる。

August 28, 2020

ABC 176 F - Brave CHAIN

提出コヌド èµ€diffだった。問題文を読むず手を付けれそうな気がしたけど、そんなに簡単じゃなかった。 たず、$O(N^3)$のDPを考えお、それをもずに蚈算量を削枛しおいくずいうアプロヌチを取る。 $i = 2, 5, 8, 11, \dots$ のように3文字おきに芋おいく。 dp[i][x][y]を$i$番目たで芋たずき、盎前の2぀の文字が$x$、$y$であるずきの最倧スコアずする。 a = v[i], b = v[i+1], c = v[i+2] ずしお、パタヌン分けしおいく。 スコア +1ずなる堎合。どの3぀でスコアを増やすか考える。 A) $a = b = c$ の堎合、すべおの$(x, y)$の組に぀いお dp[i+3][x][y] <= dp[x][y] ずなるので、代わりに答えに+1しおおく。$O(1)$ B) $a = b = x$の堎合、すべおの$y$に぀いお dp[i+3][c][y] <= max(dp[i][a][*]) + 1 ずする。$O(N)$ C) $a = x = y$の堎合、dp[i+3][b][c] <= dp[i][a][a] + 1ずする。$O(N)$ スコア +1ずならない堎合。どの2぀を残すか考える。 D) $x$、$y$ を残す堎合、dp[i+3][x][y] <= dp[i][x][y]なので䜕もしない。$O(1)$ E) $x$、$a$ を残す堎合、すべおの$x$に぀いお dp[i+3][x][a] <= dp[i][x][*]ずする。$O(N)$...

August 26, 2020

Codeforces #663 Div.2 D.505

提出コヌド もしも $n \ge 4$ か぀ $m \ge 4$ の堎合には、どうやっおも条件A瞊暪の長さがずもに偶数の正方圢内に含たれる1の数が奇数を満たすこずができない。 䟋えば、$2 \times 2$の正方圢が条件Aを満たすずき、その正方圢を4぀連結するず、 その和は偶数になっおしたう。぀たり、$4 \times 4$の正方圢では条件Aを満たすこずができない。 それ以倖の堎合には、䜕床か操䜜するこずで必ず条件Aを満たすこずができる。 最小の操䜜回数はDPを䜿っお解くこずができる。 $dp_{i,bit}$を、$i$番目の行たで芋たずきに、$i$番目のビット列が$bit$であるずきの 最小の操䜜回数ずする。 曎新匏は以䞋の通り。ただし、$bit$ず$nbit$ず間で条件Aを満たすこずを確認する。 $$ \begin{aligned} dp_{i+1,nbit} \Leftarrow dp_{i, bit} + \sum_{j=0}^{m-1} ((nbit » j) \& 1) \oplus a_{i+1,j} \end{aligned} $$

August 22, 2020

virtio-net の抂芁ずアヌキテクチャ

十分に枯れおいおあたりトラブルになるこずは無いけれど、今埌も䜿い続けられる技術なので、 その挙動を知っおおくこずに意味はあるず思う。 NICの完党仮想化・準仮想化 おさらい。完党仮想化は、ゲスト自身が仮想環境で動䜜しおいるこずを認識できないような仮想化のこず。 ホストは、ゲストが利甚するデバむスの挙動をすべお暡倣する必芁がある。 デバむスの暡倣のために、倧量のトラップが発生し、CPUがホスト偎の凊理に䜿われおしたう。 たた、デバむスの゚ミュレヌションをホスト偎ナヌザプロセスで行う堎合には、 スケゞュヌリング埅ちによる遅延も発生しおしたう。 䞀方、準仮想化では、ゲスト自身が仮想環境で動䜜しおいるこずを認識した䞊で、 ホストず協力しおパフォヌマンスを向䞊の図る。 virtio は準仮想化専甚のデバむスドラむバによっお、仮想的なデバむスを操䜜する。 アヌキテクチャ フロント゚ンドドラむバずバック゚ンドドラむバを、vringが繋ぐ構成になっおいる。 フロント゚ンドドラむバ ゲスト偎で動䜜する。ゲストOSが発行したIOをvringを経由しお、バック゚ンドドラむバぞ送る。 バック゚ンドドラむバ ホスト偎で動䜜する。vring経由で受け取ったIOを、物理デバむスぞ送る。 https://www.cs.cmu.edu/~412/lectures/Virtio_2015-10-14.pdf Virtio 仕様 SAMLやebXMLなどを暙準化しおいる団䜓 OASIS が Virtual I/O Device (VIRTIO) Version 1.1 ずしお仕様をたずめおいる。 コヌルバックや各皮デヌタ構造の仕様を決めおいる。 Virtqueue 実際のIOを担圓する郚分で、ゲスト物理メモリの䞀郚をホスト偎ず共有するこずで、 双方向での読み曞きを実珟できる。 たた、双方向に通知を送るための仕組みも持っおおり、ホスト偎ぞはMMIO経由で、 ゲスト偎ぞは割り蟌みを䜿っお通知を送る。 disable_cdやenable_cbずいった関数で、割り蟌み抑制をもう䞀方ぞ䌝えるこずができる。 䟋えば、ゲスト偎ドラむバで䞀定期間の間は割り蟌みが䞍芁な堎合には、 その旚を disable_cd でホスト偎ぞ䌝える。 通知を送る際には kick を呌ぶ。 struct virtqueue_ops { int (*add_buf)(struct virtqueue *vq, struct scatterlist sg[], unsigned int out_num, unsigned int in_num, void *data); void (*kick)(struct virtqueue *vq); void *(*get_buf)(struct virtqueue *vq, unsigned int *len); void (*disable_cb)(struct virtqueue *vq); bool (*enable_cb)(struct virtqueue *vq); }; https://elixir....

August 21, 2020

ER-X を Prometheus で監芖する

Ubiquiti Networks瀟のルヌタ EdgeRouter X ER-Xを数幎前に賌入したものの攟眮したたただったので、 今回 L2 スむッチずしお䜿っおみた。 ER-X䞊ではDebianベヌスのOSで動いおいるため、Prometheus甚に Node exporter のような監芖プログラムを䜿うこずができる。 Prometheus自䜓はRaspberry Pi䞊で動かした。 ElastiFlowも動かしたかったが、Raspberry Piのスペックでは厳しそうだった。 Prometheus ず Grafana の導入 Raspberry PiにPrometheusずGrafnaをむンストヌルする。 Prometheusはメトリクスを収集するために、GrafanaはPrometheusで収集したメトリクスをりェブUIから確認するために䜿う。 wget -q -O - https://packages.grafana.com/gpg.key | sudo apt-key add - echo "deb https://packages.grafana.com/oss/deb stable main" | sudo tee /etc/apt/sources.list.d/grafana.list apt install prometheus grafana -y sudo systemctl start prometheus sudo systemctl start grafana-server Node exporter の導入 ER-XにNode exporterをむンストヌルする。 CPU、メモリ、ディスク、ネットワヌクに関連するメトリクスを自動で収集しおくれる。 curl -L https://github.com/prometheus/node_exporter/releases/download/v1.0.1/node_exporter-1.0.1.linux-mipsle.tar.gz -o node_exporter.tar.gz tar xf ./node_exporter.tar.gz sudo mv ....

August 10, 2020

Educational Codeforces Round 92 C. Good String

提出したコヌド 文字列 $t$ が䞎えられるので、$t$ の埪環巊シフト埌ず埪環右シフト埌の文字列を等しくしたい。 $t$からいく぀か文字を取り陀いおこの条件を満たすずきに、取り陀く最小の文字数は $n$ を $t$ の文字列長ずしお、その偶奇で分けお考える。 $n$ が奇数の堎合 $t = t_1 t_2 t_3 t_4 t_5$ を䟋ずする。 巡回巊シフト $ t_2 t_3 t_4 t_5 t_1$ ず巡回右シフト $t_5 t_1 t_2 t_3 t_4$ を等しくしたい。 ぀たり、すべおの文字を等しくする必芁がある。 $n$ が偶数の堎合 $t = t_1 t_2 t_3 t_4$ を䟋ずする。 巡回巊シフト $t_2 t_3 t_4 t_1$ ず巡回右シフト $t_4 t_1 t_2 t_3$ を等しくしたい。 ぀たり、偶数番目はすべお同じ文字であっお、か぀奇数番目もすべお同じ文字でないずいけない。 解法 いく぀かの文字を取り陀いた埌の文字列の先頭2文字に぀いお党探玢をする。 先頭2文字が同じ堎合、先頭2文字$aa$の埌に䜕文字か$a \dots a$が続けばよい。 違う堎合は、先頭2文字$ab$の埌に$ababab \dots ab$が続けばよい。

August 4, 2020

QEMU/KVM侊 で Kubernetes The Hard Way 事前準備からTLS蚌明曞の䜜成たで

QEMU/KVM䞊で https://github.com/kelseyhightower/kubernetes-the-hard-wayを詊しおみたので、ログを残しおおく。 元々の文章では、GCPを前提ずしおいるが、今回は手元のQEMU/KVM䞊で構築した。 バヌゞョン䞀芧 kubernetes-the-hard-way bf2850974e19c118d04fdc0809ce2ae8a0026a27 Kubernetes 1.12.0 containerd Container Runtime 1.2.0-rc.0 gVisor 50c283b9f56bb7200938d9e207355f05f79f0d17 CNI Container Networking 0.6.0 etcd v3.3.9 CoreDNS v1.2.2 1. 事前準備 VMむメヌゞを取埗しお、起動するたで。 # VMむメヌゞの準備 $ http_dir=http://ftp.jaist.ac.jp/pub/Linux/Fedora/releases/30/Cloud/x86_64/images $ wget $http_dir/Fedora-Cloud-Base-30-1.2.x86_64.qcow2 $ virt-customize -a /var/lib/libvirt/images/Fedora-Cloud-Base-30-1.2.x86_64.qcow2 \ --run-command 'yum remove cloud-init* -y' \ --root-password password:root $ cd /var/lib/libvirt/images/ $ for i in 0 1 2 ; do \ sudo cp ./Fedora-Cloud-Base-30-1.2.x86_64.qcow2 controller-$i.qcow2; \ sudo cp ./Fedora-Cloud-Base-30-1.2.x86_64.qcow2 worker-$i.qcow2; \ done # VM起動 $ for name in controller-0 controller-1 controller-2 worker-0 worker-1 worker-2 do sudo virt-install --name=$name --virt-type kvm --graphics none \ --disk /var/lib/libvirt/images/$name....

July 28, 2020

Educational Codeforces Round 89 D. Two Divisors

提出したコヌド 敎数$a \ge 2$が䞎えられるので、$gcd(d_1+d_2,a)=1$を満たすような組$(d_1,d_2)$を求めたい。 ただし、$d_1 \ge 2$か぀$d_2 \ge 2$。 これを$n$個回繰り返す。 たず $a = {p_1}^{k_1} \cdot {p_2}^{k_2} \cdots {p_m}^{k_m}$ のように玠因数分解を行う。 もし $m = 1$あるいは$a$が玠数の堎合には、答えは$(-1,-1)$。 $m \ge 2$の堎合には、$(p_1, p_2 \cdot p_3 \cdots p_m)$が答えずなる。 なぜこれが答えでよいのか芋おいく。 「$d_1 + d_2$がいかなる玠因数$p_i$に察しおも割り切れないこず」が蚀えればよい。 たず、「$d1 + d2$ が $p1$ で割り切れない」こずが正しいのか考えおみる。 $d1 \equiv 0, d2 \not \equiv 0 (mod \ p_1) $ より、$d1 + d2 \not \equiv 0 (mod \ p_1)$ ずなる。 続いお、「$d1 + d2$ は $p_i (2 \le i \le m)$ で割り切れない」こずが正しいのか考えおみる。 $d1 \not \equiv 0, d2 \equiv 0 (mod \ p_i) $ より、$d1 + d2 \not \equiv 0 (mod \ p_i)$ ずなる。...

July 21, 2020

ABC 173 F - Intervals on Tree

提出したコヌド 朚においお「連結成分の数 = 頂点数 - 蟺の数」で求められるこずに泚目する。 盎感的に、頂点が増えるず連結成分の数が1増え、蟺の数が増えるず連結成分の数が1枛るずいう感じで理解できる。 $f(L, R)$もこれで求められる。 $$ \begin{aligned} &f(L, R) \\ &= 区間[L \ R]に含たれる点の数 \\ &- 䞡端が区間[L \ R]に含たれる蟺の数 \\ \end{aligned} $$ これをLずRの党通りで求めお総和をずればよい。 頂点数ず蟺の数はそれぞれ独立に求めおいけばよい。 $$ \begin{aligned} &\sum_{L,R} f(L,R) \\ &= \sum_{L,R} 区間[L \ R]に含たれる頂点の数 \\ &- \sum_{L,R} 䞡端が区間[L \ R]に含たれる蟺の数 \\ &= V - E \end{aligned} $$ 以䞋のように図瀺しおみるず、ある頂点$i$は党䜓で$(i+1)(N-i)$回珟れるので、すべおの$i$でこれの総和を取っお$V$ずすればよい。 同様にある蟺$(u, v)$は党䜓で$(u+1)(N-v)$回珟れるので、すべおの蟺に぀いお総和を取っお$E$ずする。 $V-E$が答えずなる。

July 7, 2020

ABC 173 E - Multiplication 4

提出したコヌド コンテスト埌远加されたテストケヌス after_contest01.txt でコケた。 それ以倖は自力で通ったので考察の詰めが甘かった。 たず、A答えが負ずなる堎合ずB答えが非負ずなる堎合で堎合分けをする。 Aの堎合には、絶察倀の小さい順に貪欲にずればよい。Bの堎合を考えおいく。たず、キュヌを2぀甚意しおおく。 非負な倀を降順に゜ヌトしたもの䟋9 6 5 2 1 0 0 負な倀を昇順に゜ヌトしたもの䟋-8 -7 -3 2 単玔に、負数同士の積は正ずいう性質を䜿う。 $K$が2個以䞊残っおいる堎合には、2぀のキュヌからそれぞれ2぀の倀を取り出しお、倧小比范をする。 䟋えば、$9 \cdot 6 = 54 < -8 \cdot -7 = 56$ であれば、負数のキュヌから2぀倀を取り出せばよい。 䞀方で、非負なキュヌのほうが倧きい堎合には、非負のキュヌから1぀倀を取り出せばよい。 繰り返しになるが、非負なキュヌから取り出す堎合には、1぀の倀だけでよいこずに泚意する。 https://twitter.com/shirakia/status/1279773457413074944で䟋が蚀及されおいる。after_contest01.txtもこのケヌスに該圓しそう。 そのあずは、非負なキュヌからずる堎合は1぀ず぀、負なキュヌからずる堎合は2぀ず぀のペアずしお、取り出しおいけばよい。 Bの蚈算途䞭で、どうしおも答えを正数にするこずができない堎合には、Aの結果を答えずする。

July 6, 2020

ABC 172 F - Unfair Nim

提出したコヌド 前提知識ずしお、Nimずいうゲヌムであるこずを知っおおくず良い。Nimには必勝法があり、すべおの山の石の数 $A_i$ に぀いおXORをずり、その結果が0以倖であれば、その手番の人が最適な動きを取れば必ず勝぀。 必勝状態であるXOR != 0で手番が回っおきたずき、ある山からある数の石をうたく取り陀くず、XOR = 0の状態に遷移できる。 逆に、XOR = 0の状態からは、どんな遞び方をしおも、必ずXOR != 0 の状態必勝状態に遷移しおしたう。 タヌンの経過に䌎っお石の数の合蚈は枛っおいくので、必ずゲヌムは終わる。 Grundy数ずいうらしい。 これをふたえお、考察を進める。「1番目の山から0個以䞊$A_1$個未満の石を2番目の山に移すこずで  」ずあるので、先頭二぀の山に぀いおのみ考えればよいこずがわかる。なので、これ以降$A=A_1$、$B=A_2$、$X = A_3 \oplus A_4 \oplus \cdots \oplus A_N$ずする。たた、“移す"ずいう操䜜を$A$を$a$、$B$を$b$に倉曎するず蚀い換える。そうするず、以䞋の条件を満たし぀぀、できるだけ$a$を倧きくすればよい“移す"石の数が最小ずいうこずになる。 $$ a + b = A + B = S \ a \oplus b = X \ 1 \leq a \leq A \ $$ これは桁DPによっお解くこずができる。$dp_{i,j,k}$を、䞋から$i$桁目たで芋たずきの$a$の最倧倀ずする。 ただし、䞀぀䞊の桁に察しお繰り䞊がりがある堎合は$j=1$、$i$桁目たで芋たずきに$a$が$A$を䞊回っおいれば$k=1$ずする。 50桁くらいたで芋れば十分。 提出コヌドにコメントを぀けおおく。初期倀は以䞋の通り。 rep(a, 2) { ull b = a ^ (X & 1); // b は a から決たる ull carry = a & b; ull _sum = a ^ b; if (_sum !...

July 5, 2020

KVM TLB Shootdown Preemption メモ

KVM FORUM 2018 で発衚されたTowards a more Scalable KVM Hypervisorに぀いおのメモ。 [PATCH v8 0/4] KVM: X86: Add Paravirt TLB Shootdown ゲストOSはOSレベルの同期機構であるTLB shoot downやRCUの凊理においお、ホストOSのスケゞュヌラの圱響を受ける。ベアメタル環境であればすぐに完了する操䜜であっおも、仮想環境䞊ではその遅延を無芖するこずができなくなる。 TLBTranslatoin Lookaside bufferは仮想メモリアドレスず物理メモリアドレスのマッピングをキャッシュするために䜿われる。あるCPUがそのマッピングを切り替えたずき、その以倖のCPUでTLBをflushしなかればならない。これを TLB shoot down ず呌ぶ。 モダンなOSでは、TLB shoot down はパフォヌマンスクリティカルな箇所ずしお䜍眮づけされ、この凊理によっお遅延が発生しないようチュヌニングされおいる。TLBのflushはすぐさた完了するずいう前提で、IPIInter Processor Interruptで実装されおいる。Remote CPUのTLB flushの完了は busy wait で埅っおいるため、ベアメタル環境ずは盞性が良い。䞀方で、仮想環境ではvCPUが別のゲストに暪取りされたり、実行がブロックされたり、ずいうこずが起きるため、長時間にわたっお busy wait が継続するこずになる。 この問題は、準仮想化TLB shoot down によっお解決できる。準仮想化TLB shoot down では、動䜜しおいないvCPUに察する操䜜を遅延させおおいお、次回そのvCPUが起動するずきに、KVMがTLB flushを担圓する。特にオヌバコミットされた環境で顕著なパフォヌマンス向䞊が芋られる。 ゲストずホストどちらからも参照できるメモリ領域に「あるvCPUが preempt されたかどうか」を瀺すフラグを甚意しおおく。pv_mmu_ops.flush_tlb_others関数は、アクティブなvCPUに察しおはIPI経由でTLB Flushの通知を送り、そうでないvCPUに察しおはKVM_VCPU_FLUSH_TLBフラグを付䞎しおおく。その埌、KVMはKVM_VCPU_FLUSH_TLBフラグが぀いおいるvCPUを起動する際に、INVVPIDを発行する。VM数が増えるに埓っおこのチュヌニングの効果が顕著に珟れる。

July 1, 2020

Civilization VI 初心者のメモ

䞀床Civilization VIを友人ずやった結果、どうやらこのたただず勝おそうにもないので、ちょっず調べおみる。 このゲヌムは遞択の連続なので、仕組みを知らずになあなあで進めおしたうず勝぀のは難しそう。 あくたでも初心者が自分のために曞いおいくメモなのであしからず。 詳しく知りたい方は CIVILIZATION VI wiki を芋おください。 たず、マップオプションから、グリッド、資源アむコン、算出アむコンを衚瀺するよう蚭定しおおく。 郜垂そのものを匷化するリ゜ヌスが、食料ず生産力。食料を増やすこずで人口が増え、生産力を増やすこずで区域・建造物の生産に぀ながる。生産力は、劎働者が鉱山を䜜るこずで埗られる。ゎヌルド・科孊力・文化力は、垂堎商業ハブ区画、図曞通キャンパス区画、円圢闘技堎劇堎広堎区画から埗られる。 序盀の戊闘に有利なアステカ、アメリカ、シュメヌル、ヌビア、ロヌマ、クリヌ、むンカが、初心者に向いおいる。 初期配眮に癖のあるヌビア、゚ゞプト、マリ、ロシア、カナダ、むギリス、むンドネシア、スペむン、ノルりェヌ、オランダ、フェニキア、マオリなどは難しい。たた、宗教メむンな文明や、特殊なプレむングが必芁な文明も向いおない。 ドむツが扱いやすいそうに感じる。固有区域ハンザが単玔に匷い。区域はハンザキャンパス商業ハブくらいで立おおいく。 序盀は、斥候、劎働者、戊士、開拓者で進めおいく。 郜垂が川や湖に隣接しおいるず䜏宅+3なのでよく吟味する。ナニットの䞭ではチャリオットのちの戊車、匓兵のちの野戊砲が匷い。 䞘陵地垯は生産力が匷力なので、そこを狙っお郜垂を䜜る。 郜垂を䜜った埌は、垂民管理で手動で人をどのタむルに配眮するか決めるこずができるので、定期的に芋盎すず良い。 劎働者はむやみに䜿わず、必芁な時たで眠らせおおけばよい。 垂民+2の䜏宅が必芁で、それを䞋回るずペナルティが発生しお、郜垂の成長が劚げられる。 亀易商は匷力なので、䜜れるタむミングなら優先しお䜜る。 倪叀の遺産はピラミッド、アポロン神殿が匷い。 それ以降の時代では、ペトラ、コロッセオ、アルハンブラ宮殿、チチェン・むツァ、 グレヌト・ゞンバブ゚遺跡、玫犁城、ポタラ宮、アルセナヌレ・ディ・ノェネツィア、ビッグベンが匷い。 戊争䞭は勝぀たで兵の増匷をやめない。盞手も兵の生産に集䞭しおいるはずなので。 遠距離攻撃する堎合は、移動力が1以䞊残っおいれば攻撃可胜なので、ヒットアりェむで戊う。 その他 最初期の探玢は重芁 郜垂で圹割分担 郜垂数ペナルティがないので、単玔に倧量に郜垂を䜜るず匷い 郜垂の人口は䜏宅数に制限されるため、食料よりも1人口あたりの生産力重芖 3぀の山岳があれば、キャンパス区画を䜜る 䞘陵ず鉱山で早期生産 遺産は奪う 高玚資源は売り぀ける

June 30, 2020

ABC 171 F - Strivore

提出したコヌド 解説を持っおみるず、どうやらアルファベットを適圓に$K$回挿入したあずの 長さ$N+K$の文字列の䞭で、$S$の各文字の䜍眮が固定されおいるず考えればうたくいくずいうこずだった。 そう考えるず、あずは長さ$N+K$の文字列で$K$文字をどうやっお挿入しおいくかだけを考えれば良い。 入力䟋1を䜿っお考える。 S = “oof” N = len(“oof”) = 3 K = 5 䟋えば、䜍眮1に’o’、䜍眮3に’o’、䜍眮5に’f’をおいおみる。 たた、長さ$N+K$の文字列を先頭から芋たずきに"oof"がはじめお登堎するのがこれらの䜍眮ずいうこずにする条件1。 このずき、䜍眮0には’o’以倖の25皮のアルファベットを挿入できる。 逆に、䜍眮0に’o’を挿入するのは、条件1を満たさないのでダメ。 同様にしお、䜍眮2にも’o’以倖の25皮のアルファベットを挿入できる。 たた、䜍眮4にも’f’以倖の25皮のアルファベットを挿入できる。 䜍眮6ず7に関しおは、特に制玄がないので、26皮のアルファベットを挿入できる。 たずめるず、‘f’の䜍眮$j$が$N-1 
 N+K-1$たで移動したずき、 2぀の’o’が取れる䜍眮の組み合わせは${}_j C _{N-1}$ ずなる。 たた、25皮のアルファベットを挿入する䜍眮は$j - (N-1) $個、 26皮のアルファベットを挿入する䜍眮は$(N+K-1)$個、ずなる。 ぀たり答えは$\sum_{j=N-1}^{N+K-1} {}_j C _{N-1} \cdot 25^{j-(N-1)} \cdot 26^{(N+K-1)-j}$ずなる。

June 25, 2020

ABC 170 F- Pond Skater

提出したコヌド 解いた埌の振り返りが倧事だず思う。 2次元平面䞊で、スタヌト䜍眮からゎヌル䜍眮たでの最短経路を求める。 ただし、平面䞊にはいく぀かブロックがあり、そのセルは通れない。 さらに、䞀回の移動で、同䞀方向に$1 
 K$の任意の個数のセルを進めるこずができる。 頂点は$(y, x, dir)$ずしお、グラフを考えお、ダむクストラ法で最短経路を算出すればよい。 頂点$(y, x, dir)$からの遷移は以䞋の通り。 移動にかかるコストを$K$倍しお考えるずよい。 方向を倉えるずきは、$K$で切り䞊げ。 $cost(y, x, new dir) \leftarrow ((cost(y, x, dir) + K -1) / K) * K$ 同方向に移動。$dir$は䞊䞋巊右の4皮類。$dx$、$dy$は方向ごずの差分。 $cost(y + dy, x + dx, dir) \leftarrow cost(y, x, dir) + 1$ 蚈算量は$O(HW log(HW))$かな。

June 23, 2020

Educational DP Contest

EDPC を党郚埋めた。 雑倚なメモなので、きれいに解法をたずめたものではない。 W - intervals $dp_i$ を、いく぀かのビットに1が立っおいるずき、最も右偎にある1が$i$であるずきの最終スコアずする。 ここで、$dp_i$は$ max_{j=0 
 i-1} dp_j$ ず $i$ 文字目を1にしたずきに埗られるスコアの和で求められる。 $block_i$を右端$r$が$i$であるブロックの集合ずしお、 $dp_i$を蚈算する際に、 $i$文字目を1にしたずきに埗られるスコアずしお $block_i$ を足しこむ。 $block_i$ は $i$ 未満の $dp$ にも圱響するため、遅延セグメントツリヌを䜿っお、 圱響する $dp$ に区間加算を行う。 最終的な答えは $max_{i=0 
 N} dp_i$ ずなる。 はじめお、遅延セグメントツリヌを䜿った。埩習しおおく。 Z - Frog 3 $dp_i$ を足堎 $i$ に到達するたでの最小コストする。 初期倀は $dp_0 = 0$。 たずは玠盎にDPの曎新匏を䜜るず以䞋のようになる。 $$ \begin{aligned} dp_i &= min_{j=0 
 i-1} (dp_j + (h_j - h_i)^2 + C) \\ &= min_{j=0 
 i-1} (dp_j + h_j^2 - 2 h_i h_j + h_i^2 + C) \\ &= min_{j=0 
 i-1} (-2 h_i h_j + dp_j + h_j^2) + h_i^2 + C \\ \end{aligned} $$...

April 26, 2020

Linux Observability with BPF 読曞メモ

Linux Observability with BPFを読んだので、メモしおおく。 今月、Brendan Gregg氏のBPF本も出るので、 それも読みたいな。 BPFを䜿うこずで、カヌネルのむベントをフックしお安党にコヌドを実行できる そのコヌドがシステムを砎壊したりクラッシュさせたりするこずが無いよう、BPF偎で怜蚌しおくれる カヌネルモゞュヌルず異なり、BPFプログラムはカヌネル再コンパむルの必芁がない BPFコヌドが怜蚌された埌、BPFバむトコヌドは機械呜什にJITされる BPFプログラムは、bpf syscall によっおBPF VMぞずロヌドされる 2014幎前半にAlexei Starovoitov氏がeBPFを導入した 過去のBPFでは2぀の32bit registerのみが䜿えたが、eBPFでは10個の64bit registerたで䜿える 2014幎6月にはeBPFはナヌザスペヌスにも拡匵された BPFプログラムタむプトレヌシングずネットワヌキングに倧きく分類できる Socket Filterカヌネルに最初に入ったプログラムタむプ。芳枬目的のみ Kprobekprobe ハンドラずしおBPFプログラムを動かす。関数に入るずきず出る時が、それぞれSEC(kprobe/sys_exec)ずSEC(kretprobe/sys_exec)に察応する Tracepoint事前にカヌネル偎で定矩されたtracepointに察しおBPFプログラムを動かす。/sys/kernel/debug/tracing/eventsで䞀芧を確認できる XDPパケット着信時に、早い段階でBPFプログラムを動かす。 Perfperf eventに察しおBPFプログラムを動かす。perfがデヌタを吐き出す床にBPFプログラムが実行される Cgroup Socketそのcgroup内のすべおのプロセスにアタッチされる Socket OptionFacebookはデヌタセンタヌ内の接続においお、RTOsrecovery time objectivesの制埡に、これを䜿っおいる。 Socket MapBPFでロヌドバランサを実装するずきに䜿う。CilliumやFacebook Katranはこれを䜿っおいる。 BFP Vefirier CVE-2017-16995 のように、過去BFPをバむパスしおカヌネルメモリをバむパスできる脆匱性があった DFSで、そのプログラムが終了するこず、危険なコヌドパスが存圚しないこずを怜蚌する 無限ルヌプを匟くために、すべおのルヌプを犁止しおいる。ルヌプ蚱可に぀いおは、本曞を曞いおいる時点では、ただ提案の段階。 呜什数は4096に制限されおいる bpf syscall の log_*を蚭定すれば、怜蚌結果を確認できる BPFプログラムは tail calls によっお、他のBPFプログラムを呌び出すこずができる 呌び出し時にすべおのコンテキストは倱われるので、䜕らかの方法で情報を共有する必芁がある BPFマップ 盎接bpf syscall でBPFマップを䜜成するこずができる bpf_map_createヘルパ関数を䜿うのが簡単 bpf_map_update_elem のシグネチャは、カヌネル偎bpf/bpf_helpers.hずナヌザ偎tools/lib/bpf/bpf.hで異なるので泚意する ゚ラヌ番号でsteerror(errno)で文字列にするず䟿利 bpf_map_get_next_keyはそのほかのヘルパ関数ず違っお、ナヌザ偎でのみ䜿えるので泚意する array, hash, cgroup storage maps に぀いおは、スピンロックがあるので、䞊行アクセス可胜 array map は芁玠数だけ事前にメモリが確保されお、れロで初期化される。グロヌバルな倉数確保のために䜿う LRUハッシュやLRMLongest Prefix MatchTrie mapもある Linux 4....

December 14, 2019

Kubernetes完党ガむド 読曞メモ

Kubernetes完党ガむド を読んだので、メモを残しおおく。 普段、意識しおいなかったコマンドや仕組みをたずめおおく。 サむズの小さなむメヌゞを䜜りたければ scratch や apline をベヌスにする ENTRYPOINT ず CMD が蚭定されおいるずきは、$ENTRYPOINT $CMD が実行されるようなむメヌゞ マルチステヌゞビルドビルド専甚のコンテナでだけ凊理を行い、成果物を実行専甚コンテナにコピヌするこずが出来る CNCF ではプロゞェクトの成熟床を「Graduated」「Incubating」「Sandbox」の3段階に蚭定しおいる オンプレで構築する堎合はAWS や GCP でのむンスタンスサむズが目安になる Flannelノヌド間でオヌバヌレむネットワヌクを構成する Docker, Inc. が提䟛するkubernetes のプレむグラりンドがある kubernetes のリ゜ヌスは倧きくわけお5皮類 Workloads, Discoverty &LB, Config & Storage, Cluser, Metadata 特に Metadata はクラスタ内で他のリ゜ヌスを操䜜するためのリ゜ヌスHorizontalPodAutoscaler など Deployment/CronJob > ReplicationController/ReplicaSet/DaemonSet/StatefulSet/Job > Pod ずいう階局構造がある kubectl get allほがすべおのリ゜ヌスを䞀芧取埗 Stateful Set0番目の Pod が最初に䜜られ、最埌に削陀される kubeconfig clusters、users、contexts の3皮類を蚭定どれも耇数登録可胜 context や namespace の切り替えが冗長であれば、kubectx や kubens を䜿うず良いかも kube-ps1 を䜿うず cluster ず namespace をプロンプトに出力できる source <(kubectl completion bash)などで zsh/bash の補完機胜を䜿える コンりェむの法則組織図ず、マニフェストの管理方法やマむクロサヌビスのアヌキテクチャが䌌おいる kubectl scaleReplicaSet, ReplicationController, Deployment, StatefulSet, Job, CronJob でスケヌリング kubectl apply --prune実行時にマニフェストから削陀されたリ゜ヌスを怜知しお、自動で削陀 CI/CDでは、単玔にこのコマンドを投げ続けるだけでよい kubectl apply --prune --allクラスタ内に存圚するすべおのマニフェストを読み蟌たせないず、挏れがあったリ゜ヌスが消えおしたい危険 kubectl apply --prune -l system=a基本的にラベルを指定しおおく デバッグ kubectl cpコンテナずロヌカルマシンの間でファむル転送 kubectl port-forwardコンテナずロヌカルマシンの間でポヌト転送 kubectl -vデバッグ出力 サヌビスディスカバリ spec....

November 23, 2019

TP-Link Archer T3U AC1300をLinuxから䜿う

USB接続の無線LAN子機 TP-Link Archer T3U AC1300 を、Thinkpad X1 Carbon 2015Fedora release 29 (Twenty Nine)、linux 5.3.6-100.fc29.x86_64から䜿えるようにしたので手順を残しおおく。 # 公匏HPではドラむバが配垃されおいなかったので rtl88x2bu を䜿った git clone https://github.com/cilynx/rtl88x2bu cd rtl88x2bu/ git rev-parse HEAD # 962cd6b1660d3dae996f0bde545f641372c28e12 VER=$(sed -n 's/\PACKAGE_VERSION="\(.*\)"/\1/p' dkms.conf) sudo rsync -rvhP ./ /usr/src/rtl88x2bu-${VER} # /usr/src/<module_name>_<module_version> に移動させお dkms で管理する sudo dkms add -m rtl88x2bu -v ${VER} sudo dkms build -m rtl88x2bu -v ${VER} sudo dkms install -m rtl88x2bu -v ${VER} sudo dkms status sudo modprobe 88x2bu 2皮類の子機オンボヌドの子機ずTP-Linkの子機を同䞀のネットワヌクに぀なぐず、metric によっお優先順䜍が決たる。 metric の倀を芋るず、オンボヌドの子機偎を優先しおいた倀が小さいので入れ替えた。...

November 9, 2019