Tor

インターネット上での匿名性について 確かフツーのtcp/ip通信はsource/destination がパケットのヘッダーになっているから、サーバはクライアントが誰だか知ることができるんだよね。ヘッダーのsourceを変える方法はいくつかある。例えば、vpn。しかし、vpnはサービス提供者がパケットを全部見ることができるんだよね。んで、不正アクセスがあった時には警察側にログを提供しかねないんですよね。んで、ログから接続先が割れて逮捕されてしまうと。これを防ぐのがtorだね。 警察からの追跡は完全に逃れることができる。ただ、torノードの提供者にヤバいやつがいてパケットダンプをしているってこととかはあると思う。まあ、パケットダンプしていても暗号化されていれば大丈夫なんだけど。 The onion router 匿名性を守るための通信手段がtor。んで、torを使ったインターネットブラウジングを可能にするのが、torブラウザ。 言ってしまえばtorはvpnの上位互換だな。torネットワークに所属するtorノードの中から3つのノードをランダムに選んで、それぞれが暗号化して通信する。通信経路の各ノードは通信元ノードと通信先ノードしかわからないため、完全に秘匿性が守られる。通信元(ブラウザ)と通信先(ウェブサイト)のセットを得ることが不可能である。 例えば、 browser -> tor1 -> tor2 -> tor3 -> website でwebsiteと通信するとき、tor1はbrowserから送られていることがわかるけど、browserがどのサイトを見に行っているかはわからないようになっている。これによって完全に秘匿性が守られるわけだね。素晴らしい。まあ、通信速度はあほみたいに遅いけど。 ただ、気を付けたいのが、tor3 -> websiteの段階では平文が流れるわけだから、ここがhttpだと普通に見れてしまうわけですね。例えば攻撃者がtorネットワークにノードを配置するとき、そのノードがtor3になると通信が全部見られてしまうわけですね。 ちなみにtor3のことを出口ノードって言います。 torを利用するときに使えるツール tor networkから接続いるか どのipから接続しているかがわかるサイト 上のやつの日本版(cman) torの速度をfast.comで ログが取られていない、秘匿性の高いVPNサービス protonVPN PrivateInternetAccess すべての通信にtorを使うtailsというos tails vpn over tor と tor over vpn vpnのの先にtorがあるか、torの先にvpnがあるかのちがいで安全性は変わるのだろうか?いや変わらないな。いずれにしろvpnで秘匿化されるphaseが入るから。いやでもtor3が攻撃者である可能性も否めないので、vpn over torが一番安全なのか。これも平文が流れる場合など限定されるけど。 んで、tor over vpnは、普通にvpnを起動してからtorブラウザを使えばいいね。 vpn over torが厄介でね、まずプロトコルはopenvpnじゃないとだめっぽいですね。んで、openvpnの設定ファイルに次の行を書き込むっぽい。 socks-proxy localhost 9050 socks-proxy-retry vpn over torを使うと、マジで完全にuntracableになる(実はならない。その理由を後で書きます)。 そして、torのさきにvpnを置くことで、torからの接続をブロックしているサイトにもアクセスできるようになるんですね。すばらしい!!vpnの代わりにプロキシ―を使うこともできます。 ただ、ブラウザの通信以外もtorを通すためにはtorそのものをインストールする必要があります。 *vpn over torでも完全匿名にならない理由。 はい、それはtorの入口ノードがどこから接続が来ているかを監視している場合がるからですね。torの入口に攻撃者がいるっていうのが一番面倒くさいです。まあ、あくまでipが割れるってだけですけど。 なんで、一番安全なのはvpn over tor over vpnって感じかな。 これは確実にuntracableになる。 torと仮想通過 tor、という匿名ネットワークを利用するのだから、支払いも匿名でやりたいよね?となると、暗号通過しかないわけですね。暗号通過。 bitcon AtM torノード一覧 ノードリスト ...

January 19, 2023 · 4 min · 679 words · Me

Comments on super linux programing

はじめに 図書館で借りた、「c言語によるスーパーlinuxプログラミング」という本の返却期限が近づいているのでさっさとまとめておきたいと思う 1章:c言語の位置づけ cを勉強することでプログラムの動きをマシンレベルでイメージすることができるからいいよねと。ただし、記述は非常に具体的になる。それでは面倒なことが多いと。そういう理由から「高級言語」が開発されたと。スクリプト言語ともいう。どの言語を使うかは何を開発したいか?に依存するわけですね。システムだったらc/c++,webだったら、jsとかね。適材適所が大事ってこと。 strace python だけでもシステムコールがたくさん呼び出されることからも、pythonがインタープリタ言語であることがわかる。 この辺の続きを詳しく知りたければ、「linuxの仕組み」という本を読むことをお勧めします。 2章:ubuntuの導入 ubuntuはまだ一般的になっていません。と。いえ、もう一般的になっています。既知の事実がつらつらと書かれているだけですね。 3章:大規模プログラミングとライブラリの利用 複数の開発者による並行開発を実現するには、アプリケーションの分割は必須の技術。ライブラリの利用は分割プログラミングのゴール。 改めてc/c++プログラムのビルド工程 プリプロセッサによるファイルのインクルードやマクロの展開(プログラム中で#でかかれている所) アセンブラへの展開とアセンブル作業によるオブジェクトコードへの変換 オブジェクトファイルの結合やライブラリとのリンクを実施 で、コンパイルってのは「実行ファイルを作る」って意味で使われるけど、どっちかっていうと、「オブジェクトファイルを作る」って意味だな。で、ビルドが「実行ファイルを作る」だな。うん、 だから、「分割コンパイル」ってのは、どっちかというと、分割ビルド ≒ 分割したファイルをコンパイルしてリンクするってかんじ。 ライブラリの種類についてもここで説明されているので、チョットやります。 ライブラリの種類とリンク ビルド ≒ コードをコンパイルしてオブジェクトファイルの生成 + ライブラリのリンク なわけだけれど、ライブラリにはスタティックリンクとシェアードリンクの2種類があると。で、共有ライブラリのリンクはさらに、 実行形式のメモリへのロード時にリンクされる、動的リンクライブラリ 必要に応じてメモリへロード、リンクされる、動的ローディング の二つがある。 ldd ./binary で調べられるんですね。便利ですね。 んで、ライブラリをリンクする時ってのは、ライブラリが提供する関数を使いたいときだと思うんですけど、この、関数の仕様(インターフェース)がどうなっているか?を知る方法が、ヘッダーファイルなんですよねー。そうなんですよ、まさに。 だからヘッダーファイルには定義はかかないんですよね。引数と返り値だけなんです。 自分で共有ライブラリを作る方法 まずは、mainがない、関数だけの.cppと.hppを作る。 -fPICオプションをつけてコンパイルする。この時、.oファイルができる。 e.g., mylib.o g++ -shared -o libmylib.so mylib.o でshared-libraryができる。 ヘッダーファイルと作ったshared-libraryを/libにおいて完了。あとは、コンパイル時に-lmylibってつけることを忘れずに。ライブラリのリンクでよく忘れるやつね。大事だから。 g++ -o myapp myapp.cpp -L/path/to/library -lmylib でコンパイルできるよーって話ね。あと大事なの。 ...

January 17, 2023 · 6 min · 1072 words · Me

Slurmクラスタ構築日記

HPCといえばSlurmだよね ラズパイが腐るほどあるので、Slurmクラスタを作る。流れとしては、Slurmの全体像を理解してから、実際にSlurmをインストールして、クラスタを構築。んで、MPIジョブを投入できたら最高ですね。 参考文献 slurm公式 Slurmの全体像 クラスタを使って並列分散処理をしたいとき、どうするか?例えばMPIを使ってなにかを計算したいとき、どうするか?直接mpirunをすればいいよね?簡単だ。うん。ユーザがおれ一人で他の人がクラスタを使わない前提であれば直接実行していいよね。しかし、HPCシステムってのは基本的にはいろんな人に使われるんですよ。そんな時にいろんな人が同時にMPIのジョブを実行すると何が起こるか? まあ、これは予想だけど、基本的に1つのMPIプロセスに対して1つのコアが割り当てられるので、コア数を超えるプロセスが割り当てられそうなときは、mpirunの実行が失敗すると思うんですよ。 このようなリソース競合によるジョブの実行失敗などを防いだり、その他、リソースのマネジメントをするのがリソースマネジメントシステム(RMS)だよね。SlurmもRMSなわけだ。いろいろなRMSがあるわけで、その中でもSlurmの特徴が三つある。 ある一定期間、ユーザが計算資源(ノード)を占有することを許す 各ノードに対して、ジョブのスタート、実行、監視を可能にする 待ち行列内のpending jobに対して、恣意的な実行を可能にする slurmのアーキテクチャ 各ノードでslurmdデーモンが動いている。そして、マネジメントノード(マスターノード)ではslurmctldデーモンが動いている。ユーザはクライアントアプリを使って、slurmctldにアクセスし、ジョブのサブミットや、状態の確認ができる。 Slurmのインストール 参考文献 文献1 文献2(一番参考になった資料) 前提 ノード間でuidが同じユーザが作られていること これは、最初にラズパイの設定をするときにユーザ名を一律に決めておくことで解決できる。 ノード間でシステムの時刻が一致している事 これは、raspi-configのロケール設定でAsia/Tokyoを選ぶことで解決できる マスターノードのあるディレクトリをnfsとして外部にエクスポートしておくといろいろとらく マスターノード、スレーブノードのホスト名を決めておく /etc/hosts マスターノードの設定 リポジトリからのインストール sudo apt install slurm-wlm -y Slurmの設定 設定ファイルの場所は /etc/slurm/slurm.conf この場所に、デフォルトの設定ファイルを持ってくる cp /usr/share/doc/slurm-client/examples/slurm.conf.simple.gz . gzip -d slurm.conf.simple.gz mv slurm.conf.simple slurm.conf 設定ファイル(slurm.conf)の内容は厳密にかかないとだめ SlurmctldHost=node01(<ip addr of node01>) # e.g.: node01(192.168.1.14) # actual : zeta(172.20.2.1) SelectType=select/cons_res SelectTypeParameters=CR_Core ... ... ClusterName=glmdev ... ... NodeName=zeta NodeAddr=172.20.2.1 CPUs=4 Sockets=1 CoresPerSocket=4 State=UNKNOWN NodeName=slave1 NodeAddr=172.20.2.3 CPUs=4 Sockets=1 CoresPerSocket=4 State=UNKNOWN NodeName=slave2 NodeAddr=172.20.2.4 CPUs=4 Sockets=1 CoresPerSocket=4 State=UNKNOWN NodeName=slave3 NodeAddr=172.20.2.5 CPUs=4 Sockets=1 CoresPerSocket=4 State=UNKNOWN NodeName=slave4 NodeAddr=172.20.2.6 CPUs=4 Sockets=1 CoresPerSocket=4 State=UNKNOWN PartitionName=mycluster Nodes=slave[1-4] Default=YES MaxTime=INFINITE State=UP cgroup関係の設定ファイルをつくる /etc/slurm/cgroup.confに ...

January 16, 2023 · 2 min · 359 words · Me

goを学んだ

c++と比較した時のgo。印象を箇条書きで クラスという概念がない?関数と構造体だけで頑張る感じなのか?かなりcに近い言語っていうイメージだな。構造体があれば言うてもクラス作れるからな。 しかしソースコードを見てみると、メソッドみたいにアクセスしてるんやが?どういうことや? package datastruct import "fmt" // Queue implementation type Queue struct { data []int size int } // NewQueue instantiates a new queue func NewQueue(cap int) *Queue { return &Queue{data: make([]int, 0, cap), size: 0} } // Push adds a new element at the end of the queue func (q *Queue) Push(n int) { q.data = append(q.data, n) q.size++ } // Pop removes the first element from queue func (q *Queue) Pop() bool { if q.IsEmpty() { return false } q.size-- q.data = q.data[1:] return true } // Front returns the first element of queue func (q *Queue) Front() int { return q.data[0] } // IsEmpty checks if the queue is empty func (q *Queue) IsEmpty() bool { return q.size == 0 } // String implements Stringer interface func (q *Queue) String() string { return fmt.Sprint(q.data) } import ( "fmt" "testing" ) func TestQueue(t *testing.T) { queue := NewQueue(10) fmt.Println(queue) if !queue.IsEmpty() { t.Fatalf("True is expected, but %v\n", queue.IsEmpty()) } queue.Push(10) fmt.Println(queue) queue.Push(1) fmt.Println(queue) queue.Push(-5) fmt.Println(queue) if queue.IsEmpty() { t.Fatalf("False is expected, but %v\n", queue.IsEmpty()) } if queue.Front() != 10 { t.Fatalf("10 is expected, but %v\n", queue.Front()) } queue.Pop() fmt.Println(queue) if queue.Front() != 1 { t.Fatalf("1 is expected, but %v\n", queue.Front()) } queue.Pop() fmt.Println(queue) if queue.Front() != -5 { t.Fatalf("-5 is expected, but %v\n", queue.Front()) } queue.Pop() fmt.Println(queue) if !queue.IsEmpty() { t.Fatalf("True is expected, but %v\n", queue.IsEmpty()) } } なるほど、cっぽい感じで、構造体とそれを操作する関数に分かれているけど、関数はメソッドのように構造体に紐づく。 cでは、関数に構造体のポインタを渡さないと構造体に変更を加えることができなかったけど、goでは構造体か関数を呼び出せるやんか。んで、この構造体に紐づけられているメソッドのような関数の定義方法はgo特有の定義方法になっているって話ですよね。 ...

January 1, 2023 · 2 min · 272 words · Me

k8sクラスタの環境構築

ことはじめ k8sという技術が注目を浴びている。web業界での近年の大きな変化としてはアプリケーションアーキテクチャの変化が挙げられる。従来は、アプリケーションを構成するソフトはモノリシック(一枚板)であった。つまり、アプリケーションは、一つのソースコードで1プロセスで動いているような感じだった。しかし、このモノリシックなアーキテクチャではソースコードが複雑で、変更が加えにくい等の問題があった。チームで開発する際も、メンバーみんなが同じソースコードをつかってビルドをする必要がある等、いろいろと面倒なことが多かったと思う。そこで、近年はアプリ開発にはマイクロサービスアーキテクチャが採用されている。マイクロサービスアーキテクチャは、小さなコンポーネントの集合が全体として一つのアプリケーションを構成しているようなアーキテクチャである。 自分も意図せずして、開発してきたアプリはマイクロアーキテクチャにしていたが、こちらの方が各コンポーネントの役割をきちんと明確化して進められるので、開発を分担できるのと、変更を加えるとき、役割がコンポーネントに分かれているので、各コンポーネントの中身だけを変えればよく、管理が簡単になると思われる。つまり、APIだけそろえておけば、後は中身はなんだっていいということだ。 これによって、アジャイル開発が非常に簡単になると思われる。 そして、このコンポーネントをひとつひとつをコンテナ化するってのも近年の大きな流れっぽい。そして、コンテナ化されたコンポーネント(マイクロサービス)をうまく協調させるのが コンテナオーケストレーションツールってはなしだ。 コンポーネントを協調させる、と書いたが、具体的には(k8sの機能は非常に多いので、俺が理解できる、かつ、大事そうなものだけをピックアップする)、 コンテナのスケジューリング スケーリング/オートスケーリング 障害時のセルフヒーリング ロードバランシング ワークロードの管理 とかがある。 一方、HPC分野でもK8Sを活用しようという試みがある。これはどういうことか?実は僕もよくわかっていません。k8sをスケジューラに使おうっていう話ぽい。そして、slurmと比較して、k8sが何なのかってのを調べてるみたいですね。 参考資料を少し上げておきます。 ref1 ref2 ref3 これは研究室の仲間と一緒に調べていくことにして、僕は僕で、web業界で使われているk8sがどんなものなのかに焦点を合わせて勉強していきたいと思う。 そして、実際にk8s上で去年開発したアプリを動かしてみる、というのを最終目標にしたいです。せっかくあのアプリはマイクロサービスアーキテクチャになっているからね。インターフェースは全部rest化されているし。 物理クラスタの構築 実験環境はラズパイクラスタです。 まあ、自宅lan内にマスターノードを1台置いて、その下にあらたなネットワークを作って、マスターノードでnatした。 あと、サブネットワークでipを固定した。 詳しくは、別の記事に書いてあるのでそっちを見てくれるとありがたい。 k8sの基本的なコンポーネント 参考動画 基本用語説明 dbと連携させたjsアプリを題材に、k8sのコンポーネントを説明していくよ! cluster k8sのリソースを管理する集合体のこと node 物理マシン、もしくは仮想マシンのこと。つまり、ホストのこと。 ノードには、master nodeと普通のnodeがある。 master nodeはkubernetesを管理するため、次の管理コンポーネントを持つ kube apiserver:kubernetesのAPIを公開する。kubectlからの操作を受け付ける役割。kubeletからもアクセスを受けるし、他にもいろいろなクライアントがある。これがclusterへのgatewayになる。 etcd:分散kvs。クラスタのバッキングストアとして使用される。ログとかが記録されている。etcdは分散kvs、ということはetcdを何個か立てることが可能、ということでして、そうするとetcd間で内容の一貫性を保たないといけないわけですね。ということは?お?層です。分散合意アルゴリズムのraftが使われているわけですね。最高です。 kube scheduler:コンテナを配置する最適なnodeを選択する。ここも研究の対象になりえるところではある。 kube controller manager: リソースを制御する 普通のNodeはコンテナ化されたアプリケーションを実際に実行するホスト pod コンテナの集合体。PodはNodeの中で動作し、一つ以上のコンテナを持つ。 K8sにデプロイするときは、Pod単位で行う。 pod一つでなにか機能を果たす、とかそういう感じでpodにまとめるのだと思われる。 そうだね、1 application per Podというのが基本らしい。 しかし、そのアプリケーションは2つのコンテナから構成されていても問題ない。 k8sはvirtual networkを提供。各Podはこの仮想ネットワーク上でIPアドレスを持っている。 そして、これが結構大事な概念だんだが、Podは結構簡単に死ぬ。そして、Podが死んだら、新しいPodがデプロイされるのだが、その時にIPアドレスが変わってしまうというのが不便らしい。その時に使うのがServiceらしい。 Container Dockerコンテナのこと ReplicaSet 同一仕様のPodを複数生成する仕組み。 ReplicaSetを複数持っておくことで、一つのReplicaSetが死んでも他のReplicaSetに 処理を移すことでシステムが死んでいる時間をなくす。 後は、ロードバランスもできる。 データベースは基本的にk8sクラスタの外で管理する。というのも、ステートを考えるのが面倒くさいかららしいです。 Service Serviceは、Podにアクセスするための経路を定義。 PodのIPアドレスを固定できる。 外部への公開ポイントもここで設定する。 Deployment ReplicaSetの上位リソースで、ReplicaSetを管理する。 つまり、 DeploymentがReplicaSetを管理し、ReplicaSetがPodを管理する。 ...

December 27, 2022 · 12 min · 2433 words · Me

Look back 2022

2022年を振り返る 競馬は結構やったね。今年は全体でプラス収支でした。天皇賞の日にwin5をあてたのがかなりでかかったですね。+5マンくらいでしょうか?結構いい感じだと思いますけど。 本日、2022/12/25。 クリスマスなんかじゃないのですよ。有馬記念なんですよ。4角でエフが3番手あたりからラストスパートをかける瞬間、鳥肌が立ちましたわ。去年のデジャブかと。結果は5着にだったけど、57キロ、半年ぶりの出走、さらに体調も万全とは言えない中でよく頑張ったと思う。来年に期待。来年こそは復活してほしい。 大きな出来事としては、まあ、大学院に進学したよね。 あとは、そうね、学会で発表したりしたな。論文も書いて出したな。そして、一番行きたかった企業に内定をもらえた年でもあるな。インターンの時期からひよらずに挑戦し続けたことが功を奏したと思う。これは称賛に値する。 開発関係。初めてちゃんとしたソフトを作った気がするな。フロントからバック、インフラまで全部やったのは初めてだったからね。これは嬉しかった。もちろんデータベースもいじってね。 自分が主導で開発できたのは称賛に価するね。まあ、このおかげで内定もらえたっていうのはある。開発に協力してくれた友人にも感謝。 来年はもう少しレベルの高いソフトを作りたい。なんならサービスでもいいんだよ。 サービス指向でいこう。別に、既存のサービスでもいいのだよ。大事なのはサービスの作り方を学ぶってことなのだよ。頑張ろう。 研究。これに関しては完全に失速してしまっている。いや、なんというか、まあやりがいを感じないってのがあるよね。といってもあと一年だからうかうかしていられない。後ほどちゃんと目標を立てて頑張る。 キョウプロ 。まあ、これは就活のために頑張ってたってのもあるけど、もう決まってしまったし、今後は趣味でやることになるけどね。でもやはりレッドコーダにはあこがれるところがあるからね。来年も頑張っていきたいと思う。 ピアノ。 忙しくてってのは言い訳何だが、今年は4月にちょっと手を付けたけど、その後は全く手を付けられなかったね。これはもったいないです。頑張らないと。これも来年に持ち越し。 筋トレ。 うん、体のつくりは変わってきた。自分でもいい体になってきているって実感がある。しかし、さぼってしまうことも多かった。もっと行けるだろってのが正直な感想。これも今後に期待。 生活習慣。 いい時期もあったね。4月とかはマジで良かった。何でよかったのか?と今考えてみると、あの頃はネットフリックスを見ていなかったね。確かに、ネットフリックスを見ると寝るのが遅くなる。んで朝起きられないわ。これ、改善しよう。んで10月からは寒くなってやはり起きられませんね。これはどうにかしないとね。頑張って起きるしかないよ。 食生活。 コンビニ飯とかは食べていない。 が、栄養のバランスが良かったかといわれると、微妙ではある。正直ね。 なにか一品ちゃんと作れるとかなりいいですね。 総評。 やらないといけない最低ラインはちゃんと守れたと思う。しかし、最低限という感じだな。 自分の若さからしてもっと活動的にならないといけないとは思っている。今後に期待だな。 2023年の目標 水色コーダーになる。毎日ときましょうかね,また。頑張る。 23時寝、6時起きの生活を確立する。土日に遊べるように、平日にしっかり頑張る。 ーー>早朝バイトを始めたこと、この2頭立てがかなり聞いている。頑張りましたね。 日本史データベースを完成させる。この辺はk8sクラスタとしてデプロイできるとかなりかっこいいですね!そして、それだけさらにAWSでデプロイできると完璧です。 会社のシステムも作る。データベースも、bustubを完成させた後に、MITライセンスで出せるなにかが作りたい。 国際会議で登壇したい。scかhipcがいいな。来年。頑張る。ipdpsでもいい。 ピアノ。ブルグミュラーを終わらせる。結局これが現実的な目標な気がする。 リスクとリターンを考えて、アグレッシブに行動する。 ーー>かなりできていると思うけど、どうだろう。 ソフトウェアエンジニアとしての基礎を勉強する。つまり、インターンシップに参加する。メルカリがいいです。 ーー>infinite loopに応募しました。まあ、俺のことをとらないのはさすがにセンスがなさすぎるので大丈夫だと思いますが。 –> 落ちました。ちょっと天狗になっていました。謙虚になろう。 キャッシュフローマネジメント。つまり、会計も学びたいという話。 フロントエンドとして、reactをマスターしないといけない!!まじで!!いや、これマジで。チューかここができるようになったらだいぶ強いと思う。 ーー>reactのコンポーネントを作りまくるのがいいと思う。というのもコンポーネントって一回作ると再利用が可能になるんですよ!!再利用できるといいこといっぱいあるよね!!ってことで、はい、githubでreactのコンポーネント用のrepoを作ることをお勧めします。はい。 kaggleも強くなりたいって話 株も始めようという話 動画編集技術も磨かないとねという話。 正規表現を使った何かしらのソフトを作る 目標のデッドライン 冬休み中(~1/10) セキュリティーの授業の単位をとるために行けるところまで行く。openssl。 Go言語を一通り(メルカリのバックエンドはGOが必須らしいので) -> これやりました。 k8sの基礎を学びましょう 勉強になりそうなyoutube 実際にmicroserviceeを作る 早朝バイトに申し込む 警備のバイト 清掃のバイト ワークフローマネジメントについて、論文を読んでください eFlows4HPC works 2022 windowsをバックアップする 達成報酬 SSD(セキュリティーまで) ー>いらないので、電源だけにします。 電源(データベースまで) 学期中 ジムの申し込みをやる gold’s gym 達成報酬 ryzen9 16core 32threadを買う権利を得る –> 12core 24threadsを買いました。ryzen9 5900x.4マン弱で買えたのはでかい。 春休み中 学期中に達成できなくて、持ち越しでやらないといけないこと 頑張ってセキュリティーの授業は単位を撮ろう ーー>無理でした。おつかれした。 ...

December 25, 2022 · 1 min · 142 words · Me

CMU_db_intro_1-3

シラバス 授業ページ 第一回 もっとも簡単なデータベースとして、pythonを使って CSVファイルでデータを保存する方法が紹介されていた。 しかし、もちろんこれではだめである。 問題点 データ整合の問題(data integrity) 実装の問題(implementation) 耐久性の問題(durability) -> これらの問題を解決するためにDBMSを使う その他、データベースの歴史などつまらない話。edgar coddさんの名前は覚えておいた方がいいかも。IBMの研究者で1970年にRDBの理論を書いた論文を発表した。これは覚えておく価値がある。 結論としては、データを使う側としては、データがどうやって管理されるかは興味がない。きれいなインターフェースだけ提供してほしいと。なのでデータベースを作ろうという話。 第二回 relationlan languagesには、 DML DDL DCL があるってはなし。 全体的に、SQLの文法を学んだって感じ。 結構難しいものまで扱っているんですよね。 aggregates avg(col) min(col) max(col) count(col) String operation Pattern Matcing % : matchies any substrings _ : matchies any one character String functions SUBSTRING(S,B,E) UPPER(S) とかね。 Concatination ||でつなげることができるらしいです。 Date and Time DATE,TIME型がああるよって話ですね。 Output Redirection クエリが返す結果を別のテーブルに保存することができる。 SELECT cid INTO CoutseIds FROM enrolled; て感じで Output Control 結果を整形することができるって話。昇順に並べたり、降順に並べたり、どのカラムで並べるかを決定したり、何個出力させるかを決定したり、って感じや。 SELECT sid,grade FROM enrolled WHERE cid = '15-721' ORDER BY grade LIMIT 10; 的な感じですね。 ...

December 15, 2022 · 7 min · 1334 words · Me

Tidbによる同一データベース内におけるトランザクションクエリと解析クエリの共存

ことはじめ HTAPワークロード向けのデータベースとしてcockroach dbが有名。最近新たにtidbというのが台頭してきた。 個人的にOLAPとOLTPの両方のワークロードを効率よく捌くことに興味があるのでいろいろと調べてみる。 データベースの基本をまとめる データベースの基本用語説明 トランザクション 一連の処理をまとめたもの。一連の処理単位でコミット(確定)もしくはロールバック(破棄)する。この、一連の処理単位でコミットするかしないかを決めるのが大事。例えば、次のような処理を考える。 トランザクション開始ー>在庫テーブルで保持している商品の在庫を減らす ー> 注文テーブルに購入者情報を登録 ー> トランザクション終了 ここで、ステップ2で在庫テーブルで保持している商品の在庫を減らした後、ステップ3でエラーが発生したとする。 この時、この一連の処理がトランザクション処理として扱われている場合は、エラー発生後、処理開始前までロールバックすることが可能である。 しかし、トランザクション処理がない場合は、ステップ2だけが実行され、一貫性のないデータになってしまう。こういったことを防ぐために「トランザクション処理」が必要となる。 Mysqlで実際にトランザクションを実行するためのSQLを下に示す。 mysql> BEGIN; Query OK, 0 rows affected (0.01 sec) mysql> UPDATE `users` SET `name` = "xxx" WHERE `id` = 1; Query OK, 1 row affected (0.00 sec) Rows matched: 1 Changed: 1 Warnings: 0 mysql> ROLLBACK; Query OK, 0 rows affected (0.00 sec) Beginでトランザクションが始まる。最後にROLLBACKしているからこれは破棄される。 mysql> BEGIN; Query OK, 0 rows affected (0.00 sec) mysql> UPDATE `users` SET `name` = "xxx" WHERE `id` = 1; Query OK, 1 row affected (0.00 sec) Rows matched: 1 Changed: 1 Warnings: 0 mysql> COMMIT; Query OK, 0 rows affected (0.00 sec) これは最後にCOMMITされているので変更が永続化されるわけですね。 ちなみに、BEGINの代わりにSTART TRANSACTIONで初めてもいいです。 ...

December 12, 2022 · 2 min · 378 words · Me

カーネギーメロン大学のデータベースの授業、を受けるきっかけとなった出来事

ことはじめ 先日参加したPDCATのポスターセッションでデータベースについて研究している学生がいた。自分とおなじM1の学生。研究内容は、マルチスレッドを使ったトランザクション処理の高速化について。最近はsiloっていう実装がよく使われているらしい。ここにかなり詳しく書かれている。どっかで聞いたことある話だと思って記憶を探っていたところ、夏に応募して落ちたある企業のインターンの内容とすごく似ていると思い出した。彼に、そのインターンで作っているデータベースエンジンについて知っているか尋ねてみたら、なんとそのチームでインターンをしているとのこと。 私の代わりに合格したのは君だったか。 その学生にどうやってデータベースを勉強したのかを尋ねてみた。そして有益な情報をたくさん得ることができた。データベースには「ヨット本」という聖書があるらしい。さらに、カーネギーメロン大学のデータベースの授業はすべてyoutubeで見ることができるらしい。(カーネギーメロン大学はデータベースの研究で有名らしい)よくあるような、データベースを使う側からみた授業(うちの大学でもあったタイプの授業)ではなく、完全にデータベースのシステム側、実装側の授業。最終課題では自分でデータベースエンジンを実装するらしい。ちなみにその学生は実際に自分でデータベースエンジンを実装して、それをポートフォリオにインターンに受かったらしい。まずはオーソドックスな2-phase-lockのデータベースを実装するのがいい、というアドバイスをもらったのだけど、そもそもtwo-phase-lockがなにかもわからないわけでね…ということでカーネギーメロン大学の授業を受けようって話だ。 詳細データベース。ストレージエンジンと分散データシステムの仕組み cassandra defenitive guide CMU Intro to Database systems CMU Advanced Databases By Andy Pavlo。上のIntroductionが終わったらこっちをやってもついていけるだろう。

December 11, 2022 · 1 min · 19 words · Me

ラズパイでルータを作る (ラズパイでhadoopクラスタを構築するための準備)

ことはじめ HPCの研究室に所属している割にはHPCっぽいことができていなくて不満なので、自分でHPCぽいことをやることにした。自分のいう「HPCぽさ」ってのは、大規模なデータ分析とか難しい処理を複数ノードを使って効率よくやることとか、まあとりあえずクラスタが好きなんすよ。 ってことでとりあえず手始めにラズパイでHadoopクラスタを構築する。その後kubernetesクラスタや、slurmクラスタも試してみる。 やることは全部で5つある。3つめと4つ目ははHadoopクラスタの構築のためではなく、MPIを使った実行も可能にするためである。勉強にはなる。 1. ラズパイのルータ化 2. クラスタネットワークに属しているノードのIPアドレスを固定 3. ノード間をシームレスで移動できるようにkeychain loginを追加 4. nfsを使ってノード間で共有ディレクトリを作る 5. hadoopの導入 ラズパイのルータ化(やることその1) 大元のLanにはsoftbankのルータを使っているが、このネットワークにラズパイクラスタを置きたくない。なので、ラズパイ一台をルータ兼マスターノードにして新しいネットワーク(172.20.2.0/24)を構築する。 ネットワークの構成 192.168.3.0/24がメインのネットワークで、この中にルータ兼マスターノードをつくる。マスターノードは2つのnicを持つが、 192.168.3.0/24側は、192.168.3.4 新しいネットワーク側(172.20.2.0/24)は172.20.2.1。 そして172.20.2.0/24の中にラズパイクラスタをいっぱい配置する。 必要な道具 ラズパイはether net ポートが1つしかない。そのためラズパイで外部からアクセス可能なLanを作るためにはもう一つ物理的なLanポートが必要になる。これには usb -> ether net変換アダプタを使う。 ifconfigの結果は次のような感じになる。 eth0がもとからついているポートでeth1が追加されたやつ。 eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.3.4 netmask 255.255.255.0 broadcast 192.168.3.255 inet6 fe80::dea6:32ff:fefa:54df prefixlen 64 scopeid 0x20<link> inet6 2400:2413:121:fd00:dea6:32ff:fefa:54df prefixlen 64 scopeid 0x0<global> ether dc:a6:32:fa:54:df txqueuelen 1000 (Ethernet) RX packets 841 bytes 96345 (96.3 KB) RX errors 0 dropped 281 overruns 0 frame 0 TX packets 472 bytes 90115 (90.1 KB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 eth1: flags=4098<BROADCAST,MULTICAST> mtu 1500 ether 18:c2:bf:e9:3b:8d txqueuelen 1000 (Ethernet) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 eth0がメインネットワーク側。eth1がクラスタネットワーク側。以下、新しいネットワークを作るための設定 ...

December 10, 2022 · 2 min · 367 words · Me