akcmthdkunのブログ

雑多なメモ

raftまわり

分散システム学習リンク集

 


本体(MIT 6.5840)

• コース本体・2026年版(講義動画/スケジュール/全ラボ): https://pdos.csail.mit.edu/6.824/

• Raftラボ課題ページ(2025年版・読みやすい): http://nil.csail.mit.edu/6.5840/2025/labs/lab-raft1.html

 

助走教材

 


• Raft可視化(アニメで選挙・複製が見える/最初の5分用): https://thesecretlivesofdata.com/raft/

• Raft論文 “In Search of an Understandable Consensus Algorithm”(ラボの教科書): https://raft.github.io/raft.pdf

• Raft関連リンク集(実装例・他の可視化も豊富): https://raft.github.io/

1280. Students and Examinations

  • left join したときにonに指定した列も新しく作られるテーブルに含まれる。
  • onの条件に合致しなかった場合、右側のテーブルの項目はnullになる
  • count(列名)を指定することで、その列の値がnullのものは除いてカウントする
  • order byを使うときは下記のように書くと複数列を指定できる
order by aaa.id asc, bbb.name desc
#select *
select Students.student_id,Students.student_name,Subjects.subject_name,count(Examinations.subject_name)as attended_exams
from Students
cross join Subjects
left join Examinations
on Students.student_id = Examinations.student_id
and Subjects.subject_name=Examinations.subject_name
group by Students.student_id,Subjects.subject_name
order by Students.student_id asc,Subjects.subject_name asc;

1661. Average Time of Process per Machine

結構脳筋だった。 別解法だと、case whenでstartの値を-かけてSUMを取ることでend-startを実現していた。

# Write your MySQL query statement below
with Processtime as (
    select a.machine_id,a.process_id,B.timestamp-A.timestamp as process_time
    from Activity as A
    join Activity as B
    on A.activity_type='start'
    and B.activity_type='end'
    and A.machine_id=B.machine_id
    and A.process_id=B.process_id
)
# select * from Processtime
select machine_id,round(avg(process_time),3) as processing_time
from Processtime
group by machine_id

sqlに慣れる

背景

  • 今までRDBに触れてこなかったので、あんまりSQL慣れしてない。
  • 一応データ分析とかでpandasは使ってきたのでなんとなく基本的な操作の概念はわかる
  • だが、JOINとかサブクエリとか用語が来たときに何してるのかがぱっとわからない
  • SQLを書くことにとりあえず慣れたいが、今今の業務だとそんなにSQLを書くようなことはしない。
  • そもそもAIが書いてくれるので自分で書くことがなくなるが、何してるか理解するためにメンタルモデルを作りたい

やること

  • leetcodeのsql 50を解く
  • 学びは下にメモしてく

各問題の気づき

197. Rising Temperature

lag関数

  • lagを使うと、上の行との差分を出せる
  • 一方lagを使うときはover句を使う必要がある。
  • over句では、指定した要素ごとに小テーブルを切り出して差分を取るか、なんの列を基準にソートしてその結果に対して差分を出すのか、を指定する。
  • lagは前の行との差分を出すが、前日ならみたいな細かい操作はできない。そういうときはdatediffを使う
  • lagを使うときはwhereで条件指定できない。条件指定するには、cte,サブクエリを使って一旦小テーブルに切り出してからwhereする

datediff

  • datediff(expression1,expression2)みたいな感じで指定した列ごとの差分を出せる
  • where datediff(a,b)=1 みたいな感じにすると前日との差分みたいな感じで出せる
  • 同じテーブルの前日との差分を求めたいときはself joinを使う

self join

  • 自分自身をjoinするやり方
  • self joinするときは 
select * 
from table as A
join table as B
on datediff(a.x,b.x)=1 

みたいな感じでテーブルごとにエイリアスをつけるひつようがある

xxxx

  • aaa
  • bbb