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

Vnc

https://ja.linux-console.net/?p=716#gsc.tab=0 https://www.server-world.info/query?os=Ubuntu_22.04&p=desktop&f=6 参考サイト いや、色々書いたけど、これが一番参考になります。 ref まあ書いてあることをまとめるよ 必要なソフト サーバ側 tigervnc-standalone-server 以下のコマンドでインストール可能 apt install tigervnc-standalone-server -y で、vpnサーバにクライアントからアクセスするにはパスワードが必要だよね。 そのパスワードの設定を次のコマンド出やります。 vncpasswd Password: Verify: Would you like to enter a view-only password (y/n)? n こういうのが出てきます。 このコマンドでvncサーバを起動できます。 vncserver -localhost no ポート番号の下四桁とディスプレイ番号が一致します。 その他、知っておいたほうがいいもの 実行中のvncサーバ一覧 vncserver -list output X DISPLAY # RFB PORT # RFB UNIX PATH PROCESS ID # SERVER 1 5901 2821 Xtigervnc クライアント側ではretinia? っていうubuntuにデフォで入っているやつ使えば問題ないです。はい、おつかれっす。

November 4, 2022 · 1 min · 59 words · Me

singualrityとかcudaとかnvidia-driverとかその辺で問題が起こったのでまとめておく

cuda nvidia社のGPUを使ってプログラムを書きたいときはCUDAというソフトウェア実行環境を使わないといけない。 cudaの中には、cudaプログラム用のコンパイラー(nvcc)とか、その他ライブラリ、APIも入っている。pythonのtensorflowやpytorchも内部的にはcudaの ライブラリを使っている。そのため、pythonでtensorflowを使う時、cudaのインストールが必要となる。 cuDNN 実はcuda以外にもtensorflowを実行するときに必要なライブラリがあって、それがcuDNN. cudaはgpuを使ったプログラミング全般に関する実行環境である。そのため、デフォルトでDL用のライブラリは入っていない。cuDNNはcudaで書かれたDL用のライブラリである。cuDNNを入れることでGPUで簡単にDLが可能となる。その辺分けるのめんどいから統合してほしいだけども。 nvidia-driver GPUのドライバ。ドライバはハードウェアとのやり取りをするソフト。 singularity コンテナ型仮想環境。 仮想化してくれる範囲だけど、カーネル以外は全部仮想化してくれる。 つまり、ハードに直接干渉しないソフトであれば、全部singularity内で管理してOKってこと。 singularity上でtensorflowを使ってDLをする方法 互換性の確認 上で説明したcuda,cuDNN,nvidia-driverは全部互換性がある。その確認を最初にやるべき。 nvidia-driverのインストール ubuntuだったら、 sudo apt install nvidia-driver-450 とかでインストールできる。 singularityコマンドでdocker hubからtensorflowの最新イメージを持ってくる。 sudo singularity build tensorflow.sif docker://tensorflow/tensorflow:latest-gpu-jupyter コマンドでdockerからコンテナイメージを持ってきてsifファイルをビルドしてくれる。docker->singualrityへの変換は勝手にやってくれる。 ちなみに、jupyterも入っている。singularityには二つのコンテナ型仮想環境が用意されている。sifとsandbox. sifはあとから、apt-get install 等で 新しくファイルをインストールすることが不可能なので、一番最初のビルドの時に必要なソフトすべてをインストールしておく必要がある。 一方,sandboxは環境の変更が可能だが、gpuが使えない。基本的にgpu目的で使っているのでsandboxを使うことなはいかな。 持ってきたコンテナイメージにはcudaが入っている。cuDNNは見つけられないけど、入っているのかな? ドライバーは物理環境のドライバーを共有する。 今回起こっている問題 singularity上でtensorflowを使って学習しているのだが、以下のエラーがでてGPUを使った学習がされない。 2022-10-15 18:03:49.665516: E tensorflow/stream_executor/cuda/cuda_driver.cc:265] failed call to cuInit: UNKNOWN ERROR (34) 2022-10-15 18:03:49.665581: I tensorflow/stream_executor/cuda/cuda_diagnostics.cc:169] retrieving CUDA diagnostic information for host: hoge 2022-10-15 18:03:49.665602: I tensorflow/stream_executor/cuda/cuda_diagnostics.cc:176] hostname: hoge 2022-10-15 18:03:49.665709: I tensorflow/stream_executor/cuda/cuda_diagnostics.cc:200] libcuda reported version is: NOT_FOUND: was unable to find libcuda.so DSO loaded into this program 2022-10-15 18:03:49.665746: I tensorflow/stream_executor/cuda/cuda_diagnostics.cc:204] kernel reported version is: 520.61.5 2022-10-15 18:03:49.665954: I tensorflow/core/platform/cpu_feature_guard.cc:193] This TensorFlow binary is optimized with oneAPI Deep Neural Network Library (oneDNN) to use the following CPU instructions in performance-critical operations: AVX2 FMA To enable them in other operations, rebuild TensorFlow with the appropriate compiler flags. これについて、物理環境のnvidia-driverはバージョン520。一方、dockerハブから持ってきた最新のイメージに入っているcudaのバージョンが11-2。 nvidia-driver-520はcuda11-8しかサポートしていないとのこと。つまり、not compatibleだね。 これは間違いです。nvidia-driverは後方互換性があり、基本的に古いcudaのversionは全部サポートしています。 ...

October 15, 2022 · 1 min · 157 words · Me

暗号理論(授業)とOpenssl

初回はガイダンスだったので、2回目から記録をとっていく。 第2回 概要 本講義全体では、主に公開鍵暗号理論の数学的な側面について進めていくことになる。が、公開鍵が何者かわからずに理論を学んでも仕方がない、ということでそれに先立ち、公開鍵暗号が出てくるまでの歴史と公開鍵暗号が使用される場面、さらに公開鍵の問題点を説明する、という感じの流れ。 公開鍵が出てくるまでの歴史 公開鍵は、共通鍵を安全に配送するために考え出された暗号である。 つまり、公開鍵が出てくるまでの鍵はすべて共通鍵暗号方式であり、送信者と受信者で同じ鍵を共有する必要がある。 シーザー暗号 ローマの軍人、ユリウス・シーザーが考え出した暗号。平文のアルファベットをアルファベット順でn文字シフトさせる。送信者と受信者でシフトする文字数n(鍵)を共有する必要がある。 問題点としては、鍵の数が25しかないので破るのが簡単ということ。 換字暗号 シーザー暗号を一般化したものとして、生み出された暗号。シーザー暗号では鍵に対して全ての文字をnシフトしていた。一方、この暗号は,文字1文字に対して暗号文を一対一に写像する。可能な鍵の種類はpermutation(25)になる。 問題点としては、平文と暗号文の対が流出すると鍵が破られること、また、同じ鍵でやり取りを続けていると規則性が見つかってしまうことがある。 バーナム暗号 発明されたのは、1918年。このころは電信がすでに発達していた。つまり、「ビット」という概念が存在した。 ビット列で生成された平文と同じ長さの鍵を用意する。平文と鍵のビット同士の排他的論理和をとることで暗号文が生成される。復号には同じ鍵を用いて、暗号文と鍵の排他的論理和をとる。 自分は、このバーナム暗号が現代の共通鍵暗号方式でも使われいてると思っていたが、どうやら違うようです。後ほど共通鍵のセクションで説明する鍵が現代では使われているみたい。授業ではバーナム暗号が使われない理由として、共通鍵を共有するのが難しいと言っていたが、それは全部の共通鍵に共通することじゃないか?と思った。なぜ現代でバーナム暗号が共通鍵に使われないかは調べてみる価値があるかもしれない。 その他、古典的な暗号技術 エニグマ暗号器、ローレンツ暗号器の二つが説明されていたが、原理についてはそこまで説明していなかった。 現代の暗号技術 共通鍵暗号 今まで説明してきたのも全部共通鍵暗号だが、現代ではさらに強力な共通鍵暗号が考案されているらしい。 1977年にDESという共通鍵暗号が考案され、さらに2001年にAESというさらに強力な暗号が考案された。 公開鍵暗号 ここまで共通鍵をずっと説明してきたが,共通鍵を使った暗号系の問題に「どのように安全に共通鍵を2者間で共有するか」がある。これを鍵配送問題という。 鍵配送問題を解決するために発明されたのが「公開鍵暗号方式」である。さらに、公開鍵暗号方式の特徴を活かして認証や署名をすることもできる。 じつは、公開鍵にも問題点はあるが、それを解決する手段として、公開鍵を使った署名が行われる(デジタル証明書)。後ほど説明する。 公開鍵暗号方式では、秘密鍵と公開鍵という二つの鍵をペアで生成する。 公開鍵で暗号化された暗号文は、秘密鍵でしか復号できない。この逆も存在し、秘密鍵で暗号化された暗号文は公開鍵でしか復号できない。この特徴を用いることで2者間で安全に情報のやり取りができるようになる。 公開鍵暗号方式ではRSA暗号が使われる。「非常に大きな2つの素数の積の素因数分解が原理上不可能である」性質を用いているため、鍵の長さが非常に長いのが特徴で、現在、RSA暗号の安全性を担保する為には2048bitの鍵が必要となっている。 原理的には、すべての通信を公開鍵暗号で行うことも可能だが、暗号、復号のコストが大きいため、共通鍵を公開鍵暗号方式で交換した後は、共通鍵で暗号通信をするのが一般的である。 認証と署名についても説明したいと思う。 認証とは、「公開鍵のペアである秘密鍵が本物であるか」を証明するための仕組み。原理は簡単で、送信者は元文を公開鍵で暗号化し、暗号文を受信者に送る。受信者が秘密鍵で復号してそれを送信者に送り返す。元文と秘密鍵で復号されて送られてきた文が同じであれば受信者がもっている秘密鍵が本物であることが証明できる。つまり、送信相手が安全ということが保証される。 署名とは、「送られてきたデータが改ざんされていないこと」を証明するための仕組み。AがBになにか情報を送りたいときに署名をつかう例で説明する。 まず、AとBの両者で共通のハッシュ関数を用意する。Aはハッシュ関数に送信したい情報を入れてハッシュ値をえる。そのハッシュ値を秘密鍵で暗号化する。Aは暗号化されたハッシュ値と平文をBに送る。Bは、1)送られてきた平文を公開されているハッシュ関数にかけてハッシュ値を得る。さらに,2)Aから送られてきた暗号化されたハッシュ値を公開鍵を使って復号する。この二つの値が一致すれば、Aが送ってきた文書に改ざんがないことが証明できる。 (同時に、認証もできている気がするのだが) 公開鍵暗号方式を用いて共通鍵を交換し、その共通鍵を使って通信をすれば安全なように思える。しかし、AさんとBさんの間にXという攻撃者が入る、man in the middle attackというものがある。これは、 AがBに自ら公開鍵を渡して公開鍵暗号による通信を行うとすると、XはAがBに送った公開鍵を取得し、Bには代わりに自分の公開鍵をAのものと偽って送信する。Bは(Aのものと思い込んでいる)Xの公開鍵で暗号化したデータをAに送信する(が実際はXがBの情報を不正に入手することになる)。 という攻撃手法。 つまり、公開鍵暗号方式では、「一般公開されているように見える公開鍵が、目的としている人の公開鍵である保証がない」という問題点が存在する。 この問題を解決するために、「公開鍵暗号基盤(Publick Key Infrastructure)」が整備された。 具体的には、「公開鍵が本人のものであることを証明する機関」を設けた。この機関を認証局(CA)という。 例えとして、Aが自分の公開鍵の正当性を保証する流れを考える。 Aは公開鍵が本物であることを証明するために、CA認証局に自分の公開鍵を渡す。CAは、Aから渡された公開鍵が、Aの秘密鍵のペアであることを上で説明した認証等の技術を使って確認する。その後、CAはCAが持っている秘密鍵を用いてAの公開鍵をハッシュ化し、さらに暗号化する(署名)。この、ハッシュ化されて、暗号化された公開鍵がデジタル証明書である。技術的には「認証局の秘密鍵・公開鍵を用いた署名」を使っている。 ここでBがAの公開鍵が本当にBのものであるかを確認したいときには、Aのデジタル証明書をCAの公開鍵で復号する。復号された公開鍵のハッシュ値とAが本物であると宣言する公開鍵のハッシュ値が一致すれば、その公開鍵は本当にAのものであることが証明される。 なお、上で説明しているハッシュ値を計算するための「ハッシュ関数」は公開されているものである。つまり、署名がどのようなハッシュ関数を用いて生成されたかは公開されている。規格化されているということ。 例えば、SHA-1は公開されているハッシュアルゴリズムで20バイトのハッシュ値を生成する。ソースコードはここで見られる。他には、sha-256というのもある。これは、256ビットのハッシュ値を生成する。 ちなみに、ssl化されているサイトはurlの左に鍵マークがついている。この鍵マークをクリックすると、デジタル証明書に関する情報が得られる。このサイトのデジタル証明書を例に説明していく(非常に見づらいですが。 認証局は,Let’s Encryptであることがわかる。 技術的に大事なところは、Fingerprintsのところ。これは、ハッシュ化された公開鍵ですね。SHA-256 Fingerprintは、2048bitの公開鍵を256bitにハッシュ化した時のハッシュ値。SHA-1 Fingerprintは20バイトのハッシュ値。20バイト=160ビット=40hex。 SHA-1 fingerprintを見ると、確かに40文字ある。 さらに写真は割愛するが、detaileタブで「Certificate Signature Value」が見られるが、これは認証局によって生成された、デジタル署名である。内容はこんな感じ AD B9 37 B3 F6 A5 BC B9 E8 98 8B 83 05 76 59 E6 8E 57 E5 4C E8 7B 25 7B 01 D0 A1 85 A5 06 C5 26 DD C9 FD 0E 9B 79 1E 8A 5F 42 F5 F0 8D BC 32 02 F0 DC 44 55 FF EB 2A 1B D0 62 D5 8A 6C 31 E3 09 FE C9 B6 1A 1A E5 6F 52 8B B0 91 51 EB 4D D3 64 07 48 18 B0 A8 30 99 5E 5C 7C 8B 53 F6 38 67 F8 D1 26 FC 86 A0 A0 A4 43 45 25 49 55 B0 CD 23 C2 CE CF 78 78 AB FF 1E 16 50 AC 87 44 37 10 49 B5 59 AC 11 F4 69 4E 17 05 5C C9 29 59 38 B7 A0 A8 AB B9 D6 54 0B C1 02 8B A6 42 4E 17 70 3E 89 F6 13 E5 BF C2 9C E7 23 DA 68 FB 15 EC BC C9 4B 73 6B 42 6C 41 56 E4 D9 20 94 52 AE F1 E0 BF DB B5 19 08 9D 54 1A DB E6 EF 7B 01 B2 1C 57 8C 1E BA 51 39 7C EC 0D 75 0C 61 C2 CF B1 16 61 E1 0F C7 B0 49 2A 53 10 A1 5E D5 24 A5 0A 24 9F 75 7D 10 3B 92 4F 84 77 2E DB 34 EF 2A 02 B4 98 D6 62 DB 161616 = (2**4)3 = 212 = 4096bit。 これが署名。この署名をLet’s Encryptの公開鍵で復号すると、SHA-1ハッシュが出てくるはず。 ...

October 6, 2022 · 3 min · 579 words · Me