Mercurial > hg > Document > Growi
changeset 0:e12992dca4a0
init from Growi
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,29 @@ +# Welcome to GROWI :anchor: + +[![GitHub Releases](https://img.shields.io/github/release/weseek/growi.svg)](https://github.com/weseek/growi/releases/latest) +[![MIT License](https://img.shields.io/badge/license-MIT-blue.svg?style=flat)](LICENSE) + +<div class="panel panel-primary"> + <div class="panel-heading">Tips</div> + <div class="panel-body"><ul> + <li>Ctrl(⌘)-/ でショートカットヘルプを表示します</li> + <li>HTML/CSS の記述時は、<a href="https://getbootstrap.com/docs/3.3/css/">Bootstrap 3</a> を利用できます</li> + </ul></div> +</div> + +<div class="clearfix"></div> + +Contents +========= + +|All Pages|[/Sandbox]| +| --- | --- | +| $lsx(/) | <div class="alert alert-success"><span style="font-size: x-large;"><i class="icon-check"></i> [Sandboxをチェック](/Sandbox)</span></div> $lsx(/Sandbox)| + +Slack +===== + +<a href="https://growi-slackin.weseek.co.jp/"><img src="https://growi-slackin.weseek.co.jp/badge.svg"></a> + +GROWI をより良いものにするために、是非 Slack に参加してください。 +開発に関する議論を行っている他、導入時の質問等も受け付けています。 \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/611.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,8 @@ +# 611 + +- 我らが河野研の学生研究室です + +## 正式名称 +- 琉球大学工学部1号館611(河野研) + - 差し入れを送るときは上の宛名に書いておくと便利 +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/611/HackMD.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,13 @@ +# hackmd + +正確にはCodiMDらしい + +## GROWIとの連携 + +- 最初にHackmdの方でアカウントを作る + - http://hackmd.cr.ie.u-ryukyu.ac.jp/ +- growi側で記事を書く +- 上のhackmdタブを押してhackmdに転送する +- http://hackmd.cr.ie.u-ryukyu.ac.jp/ を開く +- 転送されている!! +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/611/README.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,29 @@ +# 研究室向けのいい感じに情報がまとまっているページ(仮) + +# いれておくと良いソフトウェア + +## エディタ関連 + +### Vim +- 言わずもがな +### emacs +- agdaする時とか +### IntelliJ IDE +- ultimate版をいれておくといろいろ出来て便利 + +## grep系 + +### grep +- 使いこなせるように... + +### ag/pt/ripgrep +- Perl/golang/Rustで書かれたgrep +- どれかいれておくと便利 + +### pt +- https://github.com/monochromegane/the_platinum_searcher +- golangで書かれたag + +### ripgrep +- rustで書かれたgrep +- https://github.com/BurntSushi/ripgrep \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/611/Water.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,2 @@ +# 水です +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/611/growi.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,14 @@ +# growiの管理まわり + +- Growi(これ)に関する情報 + +# 動いているサーバー +- 学科の基幹サーバーの1つ`balvenie`上で貸し出しVMの1つとして動いている + - 他には僕らが使っているdalmoreとかがあるタイプ +- なんとなくubuntuで動かしています + +# インターネット周りの設定 +- global ipを持って元気に配信している + - 一応長田先生(+総合情報センター)の許可はとった +- 学科のDNSで`growi.cr`と`hackmd.cr`を設定している + - `growi`はAレコードで、`hackmd`はgrowiに対するCNAME \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/611/marp.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,14 @@ +# marp + +- JavaScriptベースのスライドジェネレーター + - https://marp.app/ +- 日本人が開発している +- cliベースのものとvscodeベースのものがある + - electronベースのものは旧バージョン + +# 研究室のスライド +- リポジトリ + - http://www.cr.ie.u-ryukyu.ac.jp/hg/Members/anatofuz/marp-cr/ +- 雑に背景にロゴをあてただけのもの + - cssよくわからないので... + - デフォルトテーマを使っている \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/611/poster_printer.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,7 @@ +# ポスター印刷 +- ポスターはOmnigraphでつくる。 + +## ポスター印刷の手順 +- 5階の印刷機はネット繋がってないので、コピー室まで行ってUSB接続で印刷する、接続するとSC-T5200がでてくるはず。 +- ドライバーは下から https://www.epson.jp/dl_soft/readme/27146.htm +- ポスターサイズはA0 で縦書き、サイズの調整はfileの方のpagesetupから \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/611/slideshow.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,87 @@ +# slide show +- 研究室でよく使っているmarkdown -> htmlなスライドジェネレーター + +## Install ( attom slideshow) + +```sh + $gem install slideshow-templates -v 3.0.0 + $gem install slideshow-models -v 2.5.0 + $gem install slideshow -v 2.4.1 + $gem list|grep "slide" + slideshow (2.4.1) + slideshow-models (2.5.0) + slideshow-templates (3.0.0) + $ mkdir -p /.slideshow/templates + $cd /.slideshow/templates (無かったら作る) + $hg clone http://www.cr.ie.u-ryukyu.ac.jp/hg/Members/atton/slideshow-s6cr/ +``` + +バージョンがこれじゃないとたしか動かなかったので(ページが無くなったりします), バージョンに気をつけて. + +## Install ( anatofuz slideshow) +anatofuzさんのやつは最新版でも動くらしい. + +```sh + $gem install slideshow + $ mkdir -p /.slideshow/templates + $cd /.slideshow/templates (無かったら作る) + $hg clone http://www.cr.ie.u-ryukyu.ac.jp/hg/Members/anatofuz/slideshow-s6cr/ +``` + +でも, 最新版と言ってもいつ動かなくなるかわからないので, 動いたバージョン誰か書いて...w + +## Example + +```sh + $cd /example # 適当にディレクトリ作って + $vi example.md +``` + +- markdownの中身 +```markdown + title: Christieによるblock chain実装 + author: kiichi aka + profiles: Ryukyu + + # ページタイトル + 日本語も大丈夫みたい。 + + 1. リスト1 + 1. リスト2 + + 途中の改行は無視される。 + + # 次のスライド + ## 次々のスライド +``` + +```sh + $slideshow build example.md -t s6cr + $ls + example.html example.pdf.html example.md +``` + +で, htmlファイルが作られるので, example.htmlを開けばスライドが作られているはず. + +## dockerでのインストール +docker作ったので, 環境によらずにスライドが作れるはず. + +```sh + $ hg clone http://www.cr.ie.u-ryukyu.ac.jp/hg/Members/akahori/slideshow-docker/ + $ cd slideshow-docker + $ make build-run + $ ls + ./ Dockerfile README.pdf.html + ../ Makefile s6/ + .hg/ README.html sample.md + .hgignore README.md scripts/ + $ open README.html +``` + +で, できたスライドが見れる. + +他のファイルを指定したいときは, `make run MD=filename` などで行ける. + + `make run MD=sample.md` + +他のフォルダでdocker runしたいならREADME.mdのUse Commandを参考にしてdocker runをする.
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Agda.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,1 @@ +# Agda
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Agda/add_library.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,44 @@ +# Agda Library の更新や追加 + +## はじめに + +- brew install している場合は brew に追加されたときの最新版が入ってるはず(なので pull してレポジトリ更新すれば良いっぽい) +- version の確認は + head CHENGELOG.md; + +- 現行のAgda(v2.6.1_1) が Library を確認するときは /.agda/librarys と " /.agda/defaults" 、 あとそれぞれのライブラリ内にある hoge.agda-lib のファイルを見るっぽい + +- librarys には std-lib などのライブラリのパスが、 defaults には hoge.agda-lib にかかれている name が列挙されてる +- hoge.agda-lib にはライブラリの名前と読み込み先(大抵はそのライブラリの src)が書かれてる + +## 更新 +- ライブラリ(brew で入れたのであれば "/usr/local/Cellar/agda/branch名/lib/agda/") の下に .git があるのを確認してレポジトリの更新 ("$git pull" だと origin/master のものが反映されるのでdevが入りそう) + - `$git fetch` + - `$git checkout` + - `$git merge` + +- レポジトリを最新のCommitに戻したいときは + - `git reset --hard` +で良さそう + +- 昔のバージョンや安定版に戻りたいときは + `git checkout refs/tags/v1.2; # e.g. v1.2. check "git tag"` +で戻れる + +## 追加 +- 追加したいライブラリ tar で落として解凍、もしくは git clone などして Library を入手(std-libだと "https://github.com/agda/agda-stdlib") +``` + git clone https://github.com/agda/agda-stdlib; + cd agda-stdlib; +``` + +- " /.agda/librarys" に 落としてきた library にある "hoge.agda-lib" のパスを追加 + +``` + echo `pwd;ls *.agda-lib` >> /.agda/librarys; +``` + +- " /.agda/defaults" に library name を追加 +``` + head -1 *.agda-lib | sed 's/name: // >> /.agda/defaults'; +``` \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Agda/debug_build.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,57 @@ +# author("2019-03-14T07:10:48+00:00","game","game") +# Agda の Debug Build + +## インストール方法 + +- git からソースを clone + - `% git clone https://github.com/agda/agda.git` + +- brew であらかじめ `cabal-install` と `agda` を入れておいたほうがいい?(cabal に関しては source から build しないとだめかも?) + +- clone してきた agda ディレクトリに Makefile があるので make + +``` + % make install-debug CABAL_OPTS='--extra-lib-dirs=/usr/local/opt/icu4c/lib --extra-include-dirs=/usr/local/opt/icu4c/include' +``` + +- stdlib もupdate する + - `% https://github.com/agda/agda-stdlib.git` + +- experimental version を使う + - `% git checkout experimental` + +- .emacs.d/init.el もupdate する + +``` + (add-to-list 'load-path " /src/public/agda/src/data/emacs-mode") + (load-file (let ((coding-system-for-read 'utf-8)) + (shell-command-to-string " /src/public/agda/dist-2.6.0-debug/build/agda-mode/agda-mode locate"))) +``` + +``` + (custom-set-variables + ;; custom-set-variables was added by Custom. + ;; If you edit it by hand, you could mess it up, so be careful. + ;; Your init file should contain only one such instance. + ;; If there is more than one, they won't work right. + '(agda2-program-name + " /src/public/agda/dist-2.6.0-debug/build/Agda/agda")) + (custom-set-faces + ;; custom-set-faces was added by Custom. + ;; If you edit it by hand, you could mess it up, so be careful. + ;; Your init file should contain only one such instance. + ;; If there is more than one, they won't work right. + ) +``` + + +- おまけ + +doc をmakeするには sphinx が必要。 +- brew install sphinx-doc +- brew link sphinx-doc --force + +さらに、 + `/usr/local/Cellar/sphinx-doc/1.8.5/libexec/bin/pip3.7 install sphinx_rtd_theme +doc` に移動して +- make html
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Agda/tutorial.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,42 @@ +# Agda入門 + +間違いもあると思うが一応記録していく。 + +## 基本動作 +基本的なコードを以下に記載する。 + +```agda:hello.agda +module hello where + +test1 : Set → Set +test1 x = x +``` + +書いた定義を +C-c C-l でコンパイルすることができる。 + +書いたコードの解説をすると、 +- `module hello where`は必要な宣言で、`module`の次にファイル名を記述する。 +- `test :`の行は関数の宣言と仕様の記述をしている。 + - `:`の前で関数名を定義している + - `:`の後で仕様の記述をしている。 + - 意味はこの関数は**型**がSetの引数を受けとり、返り値として**型**がSetのものを返す。 +- `test =`の行は関数の実装を記述している。 + - `=`の前にxがあるが、これは関数が引数としてxを受け取ったことを表している。 + - 余談だがHaskellでも同じように関数の後ろに引数を記述する。 + - 仕様として、引数で受け取った物をそのまま返しても成り立つ + - Setを受け取りSetを返すだけなのでこれで良い + +また、`=`から後方を削除し、`?`を入力しC-c C-lすることもできる。その際に`{ }`が表示される。 +- その中でC-c C-, すると引数に何が格納されているのか見ることができる。 +- また、C-c C-a するとAuto (proof search)ができ、自動でできるならAgdaが自動的に補完をしてくれる。 + +コマンド群は[ここ](https://agda.wiki.fc2.com/wiki/コマンド一覧)にも記載されている。 + +## 関数定義 + + +## data型 + + +## record型 \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/CbC.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,9 @@ +# Continuation Based C + +- 継続を基本とするC言語Continuation Based C(CbC)のプロジェクトページです + +## リポジトリ +- GCC + - http://www.cr.ie.u-ryukyu.ac.jp/hg/CbC/CbC_gcc/ +- LLVM/clang + - http://www.cr.ie.u-ryukyu.ac.jp/hg/CbC/CbC_llvm/ \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/CbC/GCC.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,96 @@ +# CbC on GCC について + +## インストール方法 + +- まずはMercurialリポジトリから GCC を取得 + +``` + % hg clone ssh://one@www.cr.ie.u-ryukyu.ac.jp/hg/CbC/CbC_devel (保存先。指定しない場合./CbC_develになる) +``` + +- 次にインストール先のディレクトリを作る。ついでにそこに移動。 (!! 必ずCbC_develの外に作ってね! !!) +``` + % mkdir (いんすとーるするとこ) + % cd (↑でつくったとこ) +``` + +- OSX Maverics以降の場合は GMP, MPFR, MPCが必要。configure実行前にインストールする必要がある。 + - gcc4.9.0ではGMP 4.2以上, MPFR 2.4.0以上 MPC 0.8.0以上が要求される。 + - homebrewでインストールする場合、それぞれのformula名はgmp,mpfr,libmpcです。 + +- configureを実行する。この時、インストール先のディレクトリに移動済みであることを確認すること。 +``` + % (GCCとってきた場所)/configure CFLAGS="-g3 -O0" --prefix=$PWD \ + - -disable-nls --disable-bootstrap --enable-languages=c \ + - -enable-checking=tree,rtl,assert,types +``` +- 各オプションについて + - -g3 +gdbでのmacroの展開を可能にする。 + - -O0 +最適化のカット。 + - --prefix=dir +インストール先のディレクトリ指定。 + - --disable-nls +gettextのl10nをoffに。 + - --disable-bootstrap +通常GCCは3回ビルドされるがこれを1回だけに限定。 + - --enable-languages +使用する言語の指定。 + - --enable-checking +デバッグ用の指定。browse_tree,debug_rtx,assertがonになる。 + + +- makeする +``` + % make && make install +``` + +- インストールされたかチェックする。 +``` + % (インストールした場所)/bin/gcc --version +``` +正しくインストールされていればバージョンが見れるはず。見れたら適当なコードで正しく動くか確認すること。 + +## gdbで動かす場合の手順 +- まず動かすときの引数を得る + +``` + % (CbC_GCC) (source file) -v |& grep cc1 +``` +これで実際に実行されるコマンドと引数が取れるので引数だけコピーする。 + +- gdbを動かす +``` + % gdb --args (さっきコピーしたものを貼る) +``` +これでうごくはず。正しく動かない場合はmakeがちゃんとできているか、configureのオプションを間違えていないかなどを確認する。 + +## lldbで動かす場合の手順 +実行時の引数は一緒なのでgdbで動かす場合のとこ見て。 +- lldbを動かす +``` + % lldb (gccのパス) +``` +- 実行 +``` + (lldb) r (コピーしたやつ) +``` + +## gdbのちょっとしたテクニック +### 何度も引っかかるタイプのブレークポイントの最後の一回が見たいとき +- まずコンテニューかけまくる +``` + (gdb) c 9999 +``` +- おそらくは9999回もコンテニューせずに実行が終了する。ここでbreak pointの情報を見る +``` + (gdb) info b +``` +見たいとこが何回止まったのかを確認する。already hit 〜 とかかかれているはず。 +- 最後の一回で止まるように仕向ける +通常実行したらさっき見た数字分break pointを通過するということなので、その回数-1回分無視するようにする。 +``` + (gdb) ignore (break pointの番号) (さっきの数字-1) +``` +これで止まるはず。
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/CbC/GCC/CROSS/ARM.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,69 @@ +# 学科のサーバの1つ DALMORE 上で CbC を CrossCompile した時のメモ + +## 準備 +- http://www.cr.ie.u-ryukyu.ac.jp/~game/pukiwiki/index.php?LLVM を参考に CbC を make + + +- arm の Toolchain をインストール +``` + % sudo yum install gcc-arm-linux-gnu.x86_64 + % sudo -s + % cd /net/open/Linux/arm + % wget 'https://developer.arm.com/-/media/Files/downloads/gnu-rm/7-2017q4/gcc-arm-none-eabi-7-2017-q4-major-linux.tar.bz2?revision=375265d4-e9b5-41c8-bf23-56cbe927e156?product=GNU%20Arm%20Embedded%20Toolchain,64-bit,,Linux,7-2017-q4-major' + % bunzip2 < gcc-arm-none-eabi-7-2017-q4-major-linux.tar.bz2\?revision\=375265d4-e9b5-41c8-bf23-56cbe927e156\?product\=GNU\ Arm\ Embedded\ Toolchain\,64-bit\,\,Linux\,7-2017-q4-major |tar xvf - + % cd gcc-arm-none-eabi-7-2017-q4-major + % /usr/bin/arm-linux-gnu-nm lib/gcc/arm-none-eabi/7.2.1/libgcc.a (armのコードが吐かれているか確認) + % /usr/bin/arm-linux-gnu-objdump -D lib/gcc/arm-none-eabi/7.2.1/libgcc.a +``` + + - 参考にしたサイト +https://gnu-mcu-eclipse.github.io/toolchain/arm/install/ + +## CrossCompile +- hello.c を作って実行する + - プログラミング例 +```c + #include<stdio.h> + + int main() { + printf("Hello World!\n"); + } +``` + + - CrossCompile +``` + % ./bin/clang -target arm-linux-gnueabi -mfpu=neon-fp16 -marm -I /net/open/Linux/arm/gcc-arm-none-eabi-7-2017-q4-major/arm-none-eabi/include/ hello.c -c -mfloat-abi=hard +``` + + - Raspberry Pi で動くことを確認する + DALMORE上で +``` + % scp hello.o pi@innparusu-rpi.cr.ie.u-ryukyu.ac.jp +``` + Raspberry pi 上で +``` + % gcc hello.o + % ./a.out +``` + + - GCC arm cross compiler + +configure の前に prefix のところに arm-monte-eabi-as などがある必要がある。 + +``` +../CbC_gcc/configure --prefix=/usr/local/arm-cbc --disable-nls --disable-bootstrap --target=arm-none-eabi --enable-languages=c --enable-checking=tree,rtl,assert,types + + % make -j24 all-gcc + % make install-gcc +``` + +liggcc.a は以下のように作る + +``` + make -j24 all-target-libgcc + make install-target-libgcc +``` + +`/usr/local/arm-cbc/bin/arm-none-eabi-gcc -B/usr/local/arm-cbc/bin/arm-none-eabi- /src/hello-cbc.c` + +のように-Bをつけて使用する
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/CbC/GCC/GCC9onMac.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,38 @@ +# macOSでのビルド + +- [このサイト](https://solarianprogrammer.com/2019/10/12/compiling-gcc-macos/)の通りにやればだいたいできる +- catalina(high sierraくらい?)からgmpなどのライブラリを個別でビルドしなければGCCのビルドができなかった + - gcc9からGCCのリポジトリに自動でこのあたりのライブラリをインストールする`contrib/download_prerequisites`が追加されていて便利になっていた + +```sh +$contrib/download_prerequisites +(GCCのトップディレクトリで行わないといけない) +``` + +- `/usr/include/`が抜けた問題があるので、`sys_root`を自前で用意する必要がある + - 一部のincludeファイルにmacOSのパッチを与える必要があるらしい(必要ないかも) + +```sh +$cd sys_root +$ln -s /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/Library . +$ln -s /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System . +$mkdir usr && cd usr +$ln -s /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/bin . +$ln -s /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/lib . +$ln -s /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/libexec . +$ln -s /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/share . +$cp -r /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include include +$vim include/Availability.h +``` + +- あとはConfigureを実行する + - `--with-sysroot`を指定しておかないと、`/usr/include`が無いエラーが発生する + - `--with-sysroot`は絶対パスで与えないといけない + +```sh +../CbC_gcc/configure --prefix=$PWD --disable-nls --disable-bootstrap --enable-checking=tree,rtl,assert,types CFLAGS="-g3 -O0" --enable-languages=c,lto --no-create --no-recursion --disable-multilib --with-sysroot=/Users/anatofuz/workspace/cr/CbC/latest_gcc/sys_root +``` + +- ここで何故かMafikefileでなく`config.status`なシェルスクリプトが生成される + - このシェルスクリプトを実行するとMakefileが生成される + - あとは `make -j`すれば良い(`-j`だと一部がうまく動かないので、`make`の方が良いかもしれない) \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/CbC/GCC/homebrew.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,68 @@ +# CbC GCC の homebrew の作り方 + +(https://github.com/ie-developers/homebrew-ie) を自分のgithubにcloneします。 + +それを hoge ユーザでやるとします。 + +cbcgcc.rb をみると作り方が書いてある + +``` + def install + mktemp do + system "#{buildpath}/configure", "--prefix=#{prefix}", "--disable-nls" , "--disable-bootstrap","--enable-checking=tree,rtl,assert,types","CFLAGS=-g3 -O0", "--enable-languages=c,lto", "--no-create", "--no-recursion", "--disable-multilib" + system "sh config.status" + system "make -j 4" + system "make", "install" + end + end +``` + +ここのconfigure makeを適当に直す。 + +``` + brew install hoge/ie/cbcgcc --interactive +``` + +で手元で debug できます。 + +build できたら binary package を作ります。 + +``` + brew install --build-bottle cbcgcc + brew bottle cbcgcc +``` + +とすると sha (hash) 表示されます。これを cbcgcc.rb に書き込みます。 + +``` + bottle do + rebuild 1 + root_url "http://www.cr.ie.u-ryukyu.ac.jp/brew" # Optional root to calculate bottle URLs + sha256 "cd7ea217a174e440cfd7bf6e1367ceca7daae8f6ca9805056dd117e6cbc3ce97" => :mojave + end +``` + +この時に build 番号を増やすこと。 + +``` + cbcgcc--10.0.1.mojave.bottle.tar.gz +``` + +ができてるので、これをfireflyの +``` +/var/www/html/brew/cbcgcc-10.0.1.mojave.bottle.1.tar.gz +``` +にコピーします。この時に rebuild 番号を合わせること。動くなら、すでにある物を消しても良いです。 + + + + + + + + + + + + +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/CbC/LLVM.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,247 @@ +# LLVMを利用してCbCコンパイラを開発した時のメモ + +##インストール + +- まずLLVMを取得する。 + - [[llvm.org:http://llvm.org]]から純粋なLLVMを取ってくる場合 (この場合clangも) +``` + % git clone http://llvm.org/git/llvm.git (保存先。指定しない場合./llvmになる) + % cd llvm/tools + % git clone http://llvm.org/git/clang.git +``` + - 研究室のmercurialからCbCをコンパイルできるよう拡張されたllvmを取ってくる場合 +``` + % hg clone ssh://one@www.cr.ie.u-ryukyu.ac.jp/hg/CbC/CbC_llvm (保存先。指定しない場合./CbC_llvmになる) +``` + +- 次にインストール先のディレクトリを作る。ついでにそこに移動。 (!! 必ずCbC_llvmの外に作ってね! !!) +``` + % mkdir (いんすとーるするとこ) + % cd (↑でつくったとこ) +``` + +## 今は古い!! + - configureを実行する。この時、インストール先のディレクトリに移動済みであることを確認すること。 +``` + % (llvmとってきた場所)/configure --prefix=$PWD --disable-optimized --enable-debug-runtime\ + % --enable-debug-symbols --enable-assertions +``` + - 各オプションについて + - --prefix=dir +インストール先のディレクトリ指定 + - --disable-optimized +最適化無効化 + - --enable-debug-symbols +デバッグ情報を含めてコンパイルする。 + - --enable-debug-runtime +実行時に使用するライブラリのデバッグ情報を含めてコンパイルする。 + - --enable-assertions +assertionを有効化する。 + + +- makeする +``` + % make -j +``` +オプションjをつけてうまくいかないときは -jなしで試す。 + +※jは並列にビルドするオプション。速度は上がるがときどき上手くいかないことがある。 + +## Cmakeを使う方法 +詳しくはcross compilerのとこ + +- cmakeする +このときにビルドするディレクトリに移動すること. + +``` + %cmake3 -G Ninja -DCMAKE_BUILD_TYPE:STRING=Debug -DCMAKE_INSTALL_PREFIX:PATH=/usr/local/cbclang --sysroot=/usr/arm-linux-gnu/sys-root /src/CbC_llvm +``` + +インストールパスは$PWDで良い + +- ninja +``` + % ninja-build +``` +ちなみにubuntuで行う場合はninja-buildでいれないとaptに登録されているninjaが古いという問題がある + + +- インストールされたかチェックする。 +``` + % (インストールした場所)/Debug+Asserts/bin/clang -v +``` +正しくインストールされていればバージョンが見れるはず。見れたら適当なコードで正しく動くか確認すること。 + +## インストールしないでllvmのバージョンを調べる方法 +makeすると時間かかるからね。 +``` + % configure -V +``` + +## gdbで動かす場合の手順 +- まず動かすときの引数を得る +``` + % (CbC_LLVM) (source file) -### |& grep cc1 +``` +これで実際に実行されるコマンドと引数が取れるので引数だけコピーする。 + +- gdbを動かす +``` + % gdb --args (さっきコピーしたものを貼る) +``` +これでうごくはず。正しく動かない場合はmakeがちゃんとできているか、configureのオプションを間違えていないかなどを確認する。 + +## lldbで動かす場合の手順 +実行時の引数は一緒なのでgdbで動かす場合のとこ見て。 +- lldbを動かす +``` + % lldb (clangのパス) +``` +- 実行 +``` + (lldb) r (コピーしたやつ) +``` + +## gdbのちょっとしたテクニック +### 何度も引っかかるタイプのブレークポイントの最後の一回が見たいとき +- まずコンテニューかけまくる +``` + (gdb) c 9999 +``` +- おそらくは9999回もコンテニューせずに実行が終了する。ここでbreak pointの情報を見る +``` + (gdb) info b +``` +見たいとこが何回止まったのかを確認する。already hit 〜 とかかかれているはず。 +- 最後の一回で止まるように仕向ける +通常実行したらさっき見た数字分break pointを通過するということなので、その回数-1回分無視するようにする。 +``` + (gdb) ignore (break pointの番号) (さっきの数字-1) +``` +これで止まるはず。 + +## distcleanについて +LLVMの場合distcleanではなくdist-clean。なのでconfigureからやり直したかったりで綺麗にしたい場合は +``` + % make dist-clean +``` +但し間違ってソースファイルと同じ場所に入れちゃった場合はできない。 + +##clang ASTを見る方法 +``` + % clang -cc1 -ast-dump (source file) +``` +もしくは +``` + % clang -Xclang -ast-dump -c (source file) +``` + +## 最終的に生成されるASTと対応したコードの出力方法 +``` + % clang -cc1 -ast-print (source file) +``` +内部でコードを生成したときにそれが実際に上手くいったかどうか確認するときとか使える。 + +## LLVM IRのアセンブリ表現として出力する方法 +``` + % clang (source file) -S -emit-llvm +``` + +## LLVM IRをlliで実行するためのバイナリとして出力する方法 +``` + % llvm-as (アセンブリ表現のbit code) +``` + +## Machine Codeを見る方法 +``` + % llc -print-machineinstrs (LLVM IR file) +``` +標準エラー出力に出力される。 + +## CbC on LLVM のアップデート方法 + +- まず最新版のLLVM, clangを取得する。 +``` + % git clone http://llvm.org/git/llvm.git (保存先。指定しない場合./llvmになる) + % cd llvm/tools + % git clone http://llvm.org/git/clang.git +``` +- 研究室のmercurialにオリジナルのLLVMを置いたリポジトリがあるので、その中身を最新版で置き換える。 +``` + % hg clone ssh://one@www.cr.ie.u-ryukyu.ac.jp/hg/CbC/LLVM_original + % cd LLVM_original + % rm -rf ./* + % mv ../llvm/* ./ +``` +- リポジトリの状態を確認し、消えてるものは消す、新しく増えたものは登録する。 +``` + % hg status + % hg remove --after + % hg add (新しく増えたファイルで必要なもの。) + % hg commit + % hg push +``` +- タグを付ける。 +``` + % hg tag -r (リビジョン番号) "LLVM X.X" +``` +- CbC on LLVM の方のディレクトリに移動し、更新作業を行う。 + - emacs の場合 ediff-merge を使うと少し楽かも。 +``` + % cd ../CbC_LLVM + % hg incoming ../LLVM_original + % hg pull ../LLVM_original + % hg merge + ``` +- 動くようになったら commit, push して終了。 +``` + % hg commit + % hg push +``` + +- cmake + +``` + % cmake -G Ninja -DCMAKE_BUILD_TYPE:STRING=Debug -DCMAKE_INSTALL_PREFIX:PATH=`pwd` /hg/CbC/LLVM_original +``` + +## memo +### ヘッダファイルが見つからないと言われた時(stdio.h file not found 等) +- command line tools がインストールされてない可能性があるのでインストールする +- 以下のようにclangを実行することでclangの見るパスがわかるので確認してみる +``` + % clang -print-search-dirs +``` + +## homebrewでのインストール方法 +``` + % brew tap ie-developers/ie + % brew install cbc +``` + +でcbcがインストールされる。 + +``` + % brew install cbc --HEAD +``` + +でRepositoryのHEADがインストールされる. + +## llvm 3.8.0 lldb 用tar ball + +http://www.cr.ie.u-ryukyu.ac.jp/software/debug/CbCM.tgz + +lldbがソースを見つけられるようにsymbolic link が必要。 +``` + % sudo mkdir -p /Users/kono/src/public + % sudo ln -s `pwd`/CbC /Users/kono/src/public + % sudo ln -s `pwd`/CbC_llvm /Users/kono/src/public +``` + +で、 + +``` + % sudo lldb -- ./Debug+Asserts/bin/clang -cc1 -S hello.c +``` + +l main で main が表示されれば Ok 。
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/CbC/PS3.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,102 @@ +# CbC環境設定(PS3) +PS3上にCbCの環境を構築したので作業ログを書いとく。 + +今回インストールしたCbCに使われているgccのバージョンは4.5となる。 + one/hg/CbC/CbC_devel/ のリビジョン67:b362627d71baである。 + + +ちなみに今回環境を構築したのはdolphinsになる。dolphinsの + `/opt/cbc/bin` +にpathを通してくれればcbc-gccが使えるようになる。 + +``` + [root@dolphins] # ls /opt/cbc/bin + cbc-cpp-4.5 cbc-gccbug-4.5 powerpc64-unknown-linux-gnu-cbc-gcc-4.5 + cbc-gcc-4.5 cbc-gcov-4.5 powerpc64-unknown-linux-gnu-gcc-4.5.0 +``` + +## gmp,mpfr,mpcのインストール + +gmp,mpfr,mpcをインストールする。ソースは公式ページからとってくること。 +/usr/localを汚すのも忍びないのでホームディレクトリ直下にoptディレクトリをつくってそこにいれる。 +また今回、$HOME/opt 以下にsrcディレクトリをつくってそこにソース関連はおいて作業を行った。 + +``` + # cd $HOME + # mkdir opt + # mkdir opt/src +``` + +インストールする順番はgmp -> mpfr -> mpc の順でいれる。ここで注意なのが、32bitでいれないといけないこと。本当厄介。 + +``` + # cd gmp-5.0.1 + # ./configure --prefix=$HOME/opt ABI='32' + # make >& make.log & + # tail -f make.log + #make install + + # cd mpfr-3.0.0 + # ./configure --prefix=$HOME/opt ABI='32' --with-gmp=$HOME/opt + # make >& make.log & + # tail -f make.log + #make install + + # cd mpc-0.8.2 + # ./configure --prefix=$HOME/opt ABI='32' --with-gmp=$HOME/opt --with-mpfr=$HOME/opt + # make >& make.log & + # tail -f make.log + #make install +``` + +## CbCのインストール +後はCbCをインストールするだけ、/opt 以下に cbc というディレクトリをつくってそこに入れることにした。CbCは hg clone してとってくる。option色々付けるので気をつけてね。 + +``` + # mkdir /opt/cbc + # cd $HOME + # cd opt/src + # hg clone ssh://one@firefly.cr.ie.u-ryukyu.ac.jp//home/one/hg/CbC/CbC_devel + # mkdir build-cbc + # cd build-cbc + # ../CbC_devel/configure --disable-bootstrap --enable-languages=c --enable-checking=tree,rtl,assert,types -program-prefix=cbc- --prefix=/opt/cbc CFLAGS="-g3 -O0" --with-gmp=$HOME/opt --with-mpfr=$HOME/opt --with-mpc=$HOME/opt --program-suffix=-4.5 CC='gcc -m32' +``` + +次に、できたMakefileの最適化をきってデバッグオプションをつける。 +Makefile覗いたら最適化オプションついてるのは以下の4つ + - CFLAGS_FOR_TARGET='-O2 -g3 -O0' + - CXXFLAGS='-g -O2' + - CXXFLAGS_FOR_BUILD='-g -O2' + - CXXFLAGS_FOR_TARGET='-g -O2' + +O2 は O0 に、g は g3 に変更 + - CFLAGS_FOR_TARGET='-O0 -g3 -O0' + - CXXFLAGS='-g3 -O0' + - CXXFLAGS_FOR_BUILD='-g3 -O0' + - CXXFLAGS_FOR_TARGET='-g3 -O0' + +(実はそれぞれのフラグの意味は知らない) + +後はmakeするだけ、だけどその前に、LD_LIBRARY_PATHには$HOME/optのlibを指定しておく。これをしてないと/usr/loca/libをみにいくから。 +make する前にexportして設定すること。 + +``` + # export LD_LIBRARY_PATH=$HOME/opt/lib + # make >& make.log & + # tail -f make.log +``` + +makeが終われば後はinstallするだけである。 + `# make install` + +/opt/cbc/bin にpathを通すことも忘れないように。 + +## エラー +``` + /opt/cbc/libexec/gcc/powerpc64-unknown-linux-gnu/4.5.0/cc1: error while loading shared libraries: libmpc.so.2: cannot open shared object file: No such file or directory +``` + +といったエラーがでる。mpc を /root/opt/ 以下に作成したからそこのライブラリをみるようにしないといけない。 + export LD_LIBRARY_PATY=/root/opt/lib +すればいいけどこれじゃrootしか使えないよね。 +うん、ちょっとミスった
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/CbC/introduction.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,1 @@ +# CbC 入門 \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/CbC/onJupyter.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,28 @@ +# CbC on Jupyter + +## Install docker +docker環境が必要です. + + hg clone http://www.cr.ie.u-ryukyu.ac.jp/hg/Members/aka/jupyter_CbC_kernel + cd jupyter_CbC_kernel + docker build -t aka/jupyter_cbc_kernel . + docker run -p 8888:8888 --name jupyter_cbc_kernel aka/jupyter_cbc_kernel start-notebook.sh + +すると, 次のlogが出ると思います. + + Copy/paste this URL into your browser when you connect for the first time, + to login with a token: + http://0205e0a0e8b6:8888/?token=934058629ebd810e26f1c37a3cbb350fbb8edb95fcf4e0bd&token=934058629ebd810e26f1c37a3cbb350fbb8edb95fcf4e0bd + + +ホストをlocalhostにして, このURLにアクセスして下さい. この例だと + +http://localhost:8888/?token=934058629ebd810e26f1c37a3cbb350fbb8edb95fcf4e0bd&token=934058629ebd810e26f1c37a3cbb350fbb8edb95fcf4e0bd + +です。 + +終わり. + +## 参考サイト + +- [Jupyter C kernel](https://github.com/brendan-rius/jupyter-c-kernel/)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Christie.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,1 @@ +tsts \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Christie/Christieあれこれ.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,1 @@ +tsts \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Christie/Paxos.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,25 @@ +# Paxos + +## goal +Paxosを理解する + +## What Paxos +論文はこちら. +[[paxos made simple:https://lamport.azurewebsites.net/pubs/paxos-simple.pdf]] + +## 3つの役割 +- proposers +- acceptors +- learners + +## 参考サイト + +- [[Paxos Made Simple - Leslie Lamport:https://lamport.azurewebsites.net/pubs/paxos-simple.pdf]] +- [[分散型コンセンサス・アルゴリズム プロトコル まとめ:http://block-chain.jp/blockchain/distributed-consensus-algorithm-protocol/]] +- [[Paxos, Raftなど分散合意プロトコルを概観する(1):http://sharply.hatenablog.com/entry/2016/06/13/230552]] +- [[今度こそ絶対あなたに理解させるPaxos:https://qiita.com/kumagi/items/535c9b7a761d2ed52bc0]] +- [[普通の人でもわかる Paxos:https://www.slideshare.net/tyonekura/paxos-63835103]] +- [[Paxos:https://www.slideshare.net/pfi/paxos-13615514]] +- [[Multi PaxosをJavaで実装してみた:https://blog.riywo.com/2017/09/implemented-multi-paxos-in-java/]] +- [[ざっくり理解するPaxos:http://matope.hatenablog.com/entry/2018/05/13/204749]] +- [[Understanding Paxos:https://www.cs.rutgers.edu/ pxk/417/notes/paxos.html]]
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Christie/RemoteEditorWithChristie.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,1 @@ +Christieでリモートエディタ作成の記録。 \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Christie/RemoteEditorWithChristie/メモ書き.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,1 @@ +tsts \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Christie/alice2christie.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,8 @@ +# Alice Code to Christie Code + + +手抜きですが...evernoteのリンク貼ります. + +https://www.evernote.com/l/ApuNKeKlPZZGj6AduC2JLgpUSmbP9NdVPM8 + +もうノウハウ出し終わったぐらいにこの記事に全部書きますね
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Christie/for.NET.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,29 @@ +## ChristieのC#への書き換えログ + +Christie C#書き換え + +atomicintagerはc#に存在しない + +intを読む, 代入するくらいは原始的が保証されているらしい +一度実装してみてダメなら +volatile修飾子をつける→読み書きがスレッドセーフになるが、コンパイラで最適化されない +https://ufcpp.net/study/csharp/misc_synchronize.html + + +intのインクリメントとかはこのメソッドを使ったほうがいいかも +https://docs.microsoft.com/en-us/dotnet/api/system.threading.interlocked?view=netcore-3.1 + + +java ConcurrentHashMap → C# ConcurrentDictionary + + +java +public static <T> Class<T> +→ Class<T> は返り値の型 +→その前の<T>は汎用型を返さない場合の汎用型関数に付けられる + + +java +int.class vs Intager.class +javaは独自でそれぞれの型についてプリミティブ型とクラス型が用意されているらしい… +https://stackoverflow.com/questions/22470985/integer-class-vs-int-class/22471247
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Events/GGJ.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,97 @@ +## Global Game Jam とは + +- 48時間でゲームを作るイベントです +- お祭りです + +## Global Game Jam を開催するまでの流れ + +運営のグループがあってそれに参加させてもらって情報や登録方法などを教えてもらいます。 + +2014年は + +- Global Game Jam の本体 - basecamp +- Global Game Jam Japan - facebook + +で運営していました。 +それらのグループへの追加は権限を持っている人がいるので、その方達に問合わせる形です。 +具体的なサイトや登録方法は年によって微妙違いそうですが、大まかにはGlobal Game Jam のサイトに会場を登録して承認してもらい、Global Game Jam の運営の手順に従って開催することになります。 + + +## Global Game Jam 2014 を開催するまでの流れ +ログ的に Global Game Jam 2014 University of The Ryukyus を開催するまでの流れを書いておきます。 + +- Global Game Jam Japan のグループに追加してもらう +- Global Game Jam のサイトへ琉大を会場登録 +- ちなみに2014の会場登録は[[サイト:http://globalgamejam.org/2014/jam-sites/global-game-jam-2014-university-ryukyus/games]]の作成でした +- Global Game Jam Japan の権限を持っている人に承認してもらう +- 募集用サイトの作成([[ATND:http://atnd.org/event/E0023031]]を使いました) +- 人を集める +- 開催日時に Global Game Jam の運営手順に従って開催 + + +## Global Game Jam 運営手順 +2014の内容ですが、大まかな内容はおそらく変わらないと思います。 + +- テーマがある +- テーマは指定した時刻まで公開してはいけない(時差の関係) +- 参加者は全員 Global Game Jam のアカウントを作る +- チームでゲームを作ってもらう +- 作ったゲームはクリエイティブコモンズでサイトへとアップロードする + +## 開催にあたっての諸処 + +- チーム作成についてはスキルチェックアンケートを実施しましたが、開催前の解答率が低くて事前にチームをこちらで決めておくのは難しかったです。 +- 会場は確保しておく必要があります。2014は321を確保しました。 +- 2014の 321 は2チーム計14人が広く使って8割埋まる感じでした。20人くらいを越えるとちょっと考える必要があるかもしれません。 +- 3Dプリンタは使えるリソースにあるのを忘れない方が良いかもです(途中まで気付かなかった) +- 運営は2人いた方が良い(どちらかが体調不良しても大丈夫なように) +- 会場の開いている時間は決めた方が良いかもしれない(2014は徹夜する人もいたので完全に開放していたが、場合によっては無人になってしまうこともありえるので、どちらにでも対応できるようにしておきたいかな、と) + +## 後からのフィードバック +### 連絡先一覧 +- 運営サイドの連絡先一覧があるとかなり便利そう。 +- GDC, IDGAの窓口とか、主催者や関係する人のリストとか。 +- ブリブサーや琉大関係者も含めると案外多そうです。 +- メールでもFacebookでもいいとは思います。 + +### 権限 +- 主催者権限や、チームリーダーの権限一覧があるといいかも。 +- 運営としての権限と、Global Game Jamレギュレーションとしての権限。 +- 役割分担とか情報フローとかに直結するので。 + +### 成果物 +- 最終成果物の仕様は、事前にしつこいぐらい説明してていいはず。 +- ソースとリリース版を指定の様式でアップロードとか +- テンパって来てからだと全く覚えられない事例があるので +- 例えば、クリエイティブ・コモンズもいくつか種類あったりするので。 + +### 備品 +- 模造紙とマジックと付箋ぐらいはデジタル・アナログともに運営がたくさん準備しても良いかと。 +- アナログ側のカードスリーブあたりは毎年審議する必要がありそう。 + +### 配信 +- やるとしたら専属のスタッフと機材と事前の打ち合わせが必要そう。 +- 各会場にメリットとデメリットを聞いておくぐらいは合ってよいかと。 + +### 食事/打ち上げ +- 教室次第では、飲食の自由をどうするかも考える。ゴミ捨て含めて。 +- 2014年は弁当を注文したり、打ち上げにハリーズ行ったりもしたので。 + +### 会場案内/外部の人の出入り +- 琉大に来たことが無い人向けに会場案内があると親切。張り紙とか? +- そもそも外部の人を招いていいか誰にどう許可を取ったほうがいいのと、学科LDAPアカウントが必要なケースも想定しつつ。 + +### ログ +- Facebookのグループでやりとりした内容を可能な限りwikiに出してくれると。 +- 前年度経験者がいないくても回る運営ぐらいが理想。 + +## あと nakarx さんのブログ +- 完全にnakarxさん個人のまとめになりますが、アナログ側のゲームジャムレポートがあります。 +- 2012年度 http://d.hatena.ne.jp/nakarx/20121223/1356274383 +- 2013年度 http://d.hatena.ne.jp/nakarx/20140127/1390756829 + +## 2014 年運営リスト +- 宜野湾会場運営 : Kina (m-kina at bribser.co.jp) +- 琉大会場運営 : Higa (e115763 at ie.u-ryukyu.ac.jp) +- 琉大会場運営 : Naka (nakarx at ie-.u-ryukyu.ac.jp) +- 琉大会場運営 : Kohagura (e085726 at ie.u-ryukyu.ac.jp)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Events/srcread/compiler/2020.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,23 @@ +# 2020年 2月 13日 コンパイラ読み回 + +# 環境構築 +mercurialのoriginalのソースコードをそれぞれ最新版にする +- GCC +- LLVM + +## コンパイラのバージョンアップ方法 +1. とりあえず古いリポジトリにあるファイルを`rm -rf`する +- 最新版を持ってきたときに競合する + +2. 最新版を持ってくる + +3. `hg add *`する + +4. hg statusを書き出す + +5. egrepで `egrep '^!' /tmp/hg_status.log`とかして、消えたファイルを確認する + +6. !がついてたファイルを削除する +- vimで`%s/..//`とかすると便利 + +7. hg commit してpushする \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Events/srcread/compiler/rust-2020.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,23 @@ +# Rustコンパイラ読み会 + +# 環境構築 +- [singularityを使ったRustのデバッグビルド](https://scrapbox.io/cr-ryukyu/singularity%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%9FRust%E3%81%AE%E3%83%87%E3%83%90%E3%83%83%E3%82%B0%E3%83%93%E3%83%AB%E3%83%89) +- [singularityでRustコンパイラのデバッグ](https://scrapbox.io/cr-ryukyu/singularity%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%9FRust%E3%81%AE%E3%83%87%E3%83%90%E3%83%83%E3%82%B0%E3%83%93%E3%83%AB%E3%83%89) + +# デバッグ方法 +- コンパイル時に関数に型名を入れるので,nmで関数名を取り出す必要がある + - `$nm /rust/rust/build/x86_64-unknown-linux-gnu/stage1/bin/../lib/librustc_driver-ce53599820ba664c.so | grep parse_expr` + +[* compilerソースながめる] + https://github.com/rust-lang/rust/tree/master/compiler + メイン部分 + https://github.com/rust-lang/rust/tree/master/compiler/rustc_driver + クレート寄せ集めっぽい + run_compiler() + || lambda式 + https://doc.rust-lang.org/rust-by-example/fn/closures.html#:~:text=Closures%20in%20Rust%2C%20also%20called,for%20on%20the%20fly%20usage + FnOnce + `rustc_interface::interface::create_compiler_and_run::hd06f00e0a4bf9137 at interface.rs:190:5` + + +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/FileSystem/GFS2.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,225 @@ +# GFS2 + +## GFS2とは + +Global File System 2 の略。 + +サーバ同士で同一のディスクを共有し利用することができる。 + +環境は Fedora 20 。 + +linux kernel 3.17 あたりでは、現時点ではできない + +## GFS2 の設定 + +### install + +``` + yum install kernel-modules-extra + yum install gfs2-utils lvm2-cluster corosync dlm pacemaker +``` + +### module があるか確認 + +``` + $ lsmod | grep gfs2 + + $ lsmod | grep dlm +``` + +### disk format + +接続されているディスクの一覧 + +``` + $ fdisk -l +``` + +ディスクのフォーマット +sample + +``` + $ fdisk /dev/sdb +``` + +新しくパーティションを作成する + +``` + n +``` + +フォーマットタイプ の入力 +16進数で入力する +lvm を使用するので 8e を指定 + +``` + t +``` + +パーティションの確定と書き込み +w で enter をしてしまうとディスクの中身が消えてしまうので注意 + +``` + w +``` + +### LVM の設定 + +Logical Volume Manager の略 + +パーティションを切り分けたり合成できる + +LVM の、physical volume を作成 + +``` + # pvcreate /dev/sdb1 + Physical volume "/dev/sdb1" successfully created +``` + +physical volume の確認 + +``` + # pvs +``` + +Volume Group を作成する +fcs という名前の、 lvm2 cluster に対応した Volume Group を作成 +- -c : クラスタ対応の許可 +- fcs : Volume Group の名前(任意) + +``` + # vgcreate -cy fcs /dev/sdb1 + Volume group "fcs" successfully created +``` + +``` + # vgs + VG #PV #LV #SN Attr VSize VFree + fcs 1 0 0 wz--n- 1.95t 1.95t + fedora_host 1 2 0 wz--n- 29.31g +``` + +Logical Volume (LV) を作成する。全体の容量を指定 +- -L : LVの容量 +- -n : LV の名前 +- fcs : 切り分ける VG の名前(今回はわけないで全体を使う) + +``` + # lvcreate -L 1.95t -n fcslv fcs + Rounding up size to full physical extent 1.95 TiB + Logical volume "fcs_lv" created + # vgs + VG #PV #LV #SN Attr VSize VFree + fcs 1 1 0 wz--n- 1.95t 3.20g + fedora_host 1 2 0 wz--n- 29.31g 0 +``` + +「状態が ACTIVE か」「path はどこか」を調べる + +``` + # lvscan + ACTIVE '/dev/fedora_host/swap' [2.98 GiB] inherit + ACTIVE '/dev/fedora_host/root' [26.33 GiB] inherit + ACTIVE '/dev/fcs/fcslv' [1.95 TiB] inherit +``` + +/dev/fcslv を使用することができる + +### corosync の設定 + +corosync の設定ファイルの編集 + +``` + vim /etc/corosync/corosync.conf +``` + +以下のように編集する + +``` + totem { + version: 2 + secauth: off + cluster_name: bldsvgfs2 // gfs2 のフォーマットに使用する + } + + nodelist { + node { + ring0_addr: 10.0.0.9 + nodeid: 1 + } + node { + ring0_addr: 10.0.0.10 + nodeid: 2 + } + node { + ring0_addr: 10.0.0.11 + nodeid: 3 + } + } + quorum { + provider: corosync_votequorum + # two_node: 1 + } +``` + +### lvm の設定 + +``` + $ vi /etc/lvm/lvm.conf +``` + +``` + locking_type = 1 +``` + +を + +``` + locking_type = 3 +``` + +にする + + +### GFS2 でフォーマット + +- -p lock_dlm : lock manager の指定。今回は dlm を使用する +- -t fileformat:clustername : フォーマットと corosync で設定したクラスタの名前を指定 +- -j 3 : journaling 数の指定。GFS2 に接続し、ディスクを使用するホストの数を指定する + + # mkfs.gfs2 -p lock_dlm -t gfs2:bldsvgfs2 -j 3 /dev/fcs/fcslv + + +### GFS2 クラスタの起動 + +``` + service pcsd start + service corosync start + service dlm start + service clvmd start + + mount /dev/fcs/fcslv /media/fcs +``` + +### 自動起動の設定 + +``` + systemctl enable pcsd start +``` + +まだ corosync 以下は順番に実行する必要があると考えているため、 +pcsd 以外のプロセスは自動起動に設定していない + +自動起動の設定はこんな感じ + +``` + $ systemctl enable corosync + $ systemctl enable dlm + $ chkconfig clvmd on +``` + +/etc/fstab を書くのなら +``` + + /dev/fcs/fcslv /media/fcs gfs2 _netdev,noatime,nodiratime 0 0 +```
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Gears.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,11 @@ +# Gears + +継続を基本としたC言語 ContinuationBasedC によって記述されたOSです。 + + +## 用語 + +## 実装状況 + +- [CbCXv6](/Gears/Xv6) + - GearsOSのフレームワークに則って書き直されたXv6 \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Gears/Xv6.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,7 @@ +# CbCXv6 + +GearsOSのフレームワークに乗って再実装されたXv6です + +# リポジトリ + +- http://www.cr.ie.u-ryukyu.ac.jp/hg/CbC/CbC_xv6/ \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Gears/Xv6/QA.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,7 @@ +# CbCXv6のQAページ + +- なにか質問があれば雑に書いてきましょう + +--- + +## 質問: \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Gears/Xv6/cmmon_errors.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,12 @@ +# よくあるエラー + +## `Gearef(cbc_context,char)` + +### 原因 +- CodeGearの引数を実装しているInteface/Interfaceの実装に無いフィールドを参照しているときに起こる +- Gearefの第2引数はDataGear(context.hの中のunion Dataにかかれている構造体)でないとだめだが、charは無いので + +### 解決方法 + +- `char* hoge`などを引数で渡していると考えられるので、これをInteface/InterfaceImplのfieldに追加する + - headefileに書けばいい \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Gears/Xv6/src.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,5 @@ +# CbCXv6のソースコード + +| 一覧 | +| -------- | +| $lsx(./) | \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Gears/Xv6/src/CMakeLists.txt.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,4 @@ +# src/CMakeLists.txt + +- CbCXv6のkernelの方のCMakeLists.txt + - usrとかは別のディレクトリに置かれている \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Gears/Xv6/src/gearsTools.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,16 @@ +# src/gearsTools + +- Xv6CbCで使用するPerlスクリプトが置かれている + - ビルド時に利用されて変換するツールが中心 + +# 実行可能なスクリプト + +## 作業中に実行する +- [[trans_impl.pl]] + +## ビルドを行う際に実行する +- [[pmake.pl]] + +## ビルド時に自動で実行される +- [[generate_context.pl]] +- [[generate_stub.pl]] \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Gears/Xv6/src/gearsTools/generate_stub.pl.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,30 @@ +# generate_stub.pl + +- 入力した.cbcファイル、Interfaceのヘッダファイルを元に.cのファイルを作成する + - 別にcbc->cに変換するわけではなく、マクロや `*_stub`CodeGearを生成する + + +## %var + +```perl +if (/^\s*(.*)\s+(\w+);$/ ) { + my $ttype = $1; + my $tname = $2; + if ($ttype =~ /^(union|struct|const)?\s*(\w+)/) { + if ($1 ne 'const') { + $ttype = $2; + } else { + $ttype = "const $2"; + } + } + $var{$name}->{$tname} = $ttype; +``` + +- `__code`の引数で使う変数がこの`%var`に登録される + - Interfaceのフィードにあるかないかで生成されるマクロが異なる +- ここで`%var`には `$name`と`$tname(変数名)`, `$ttype(型名)`が登録される +- `$ttype`は`struct|union`は外された状態で登録される + - これらは `typedef`で外された型名でも使えるため + - そのため`Gearef`のマクロではstructを外した状態で書かれる +- constの場合は `const char`で1つの型なので、constが来ていたらconstを戻している +- いずれにせよポインタの`*`はここでは落とさなければならない \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Gears/Xv6/src/gearsTools/generate_stub.pl/overview.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,36 @@ +# generate_stub.plの外観 + +- 書き直したいので何をしているかを読み解いてみる + +## 使用しているモジュール +- Getopt::Std + - オプション解析部分 +- File::Path + - ディレクトリパスを作るmake_pathのみ使用 + - `mkdir -p`とほぼ同じ + +# 流れ + +- ファイルを入力でもらう +- getDataGear($fh) +- generateDataGear($fh) +- おわり + +# getDataGear + +## 実行に必要な引数 + +`$filename` +- パースする対象のファイルネーム +- CbCのファイルか.h(ヘッダファイル/Interface想定)が来る + +## 内部で使用されている変数 + +- $codeGearName + - gotoで継続する対象のCodeGearの名前が設定される +- $name +- $inTypedef + - 型定義かどうかのファイル + - つまるところInterfaceのヘッダファイルなら1になっている + - 具体的には `/^typedef struct (\w+)\s*<(.*)>/`か`/^typedef struct (\w+)/`にヒットすればこのモードになる +- $described_data_gear \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Gears/Xv6/src/gearsTools/pmake.pl.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,26 @@ +# pmake.pl + +- CMakeを実行する際に変数をいろいろ設定しないといけない為に作られたPerlスクリプト + - いまのところdalmoreとmacOSに対応している + - とはいえmac OSはコンパイラがクラッシュするのでほぼ使えないケド... + +# 実行方法 + +- ビルドしたいディレクトリに移動して + - `perl ~/src/cbcxv6/src/gearsTools/pmake.pl` でビルドされる +- 一度ビルドした場合はファイルを削除しないといけないので + - `perl ~/src/cbcxv6/src/gearsTools/pmake.pl --delete` でビルド前にファイル削除可能 + +# 設定をいじりたい + +- `print_exec_system`に送ったリストがsystemで実行されるようになっている +- 現状はOSがdarwinかそうでないか判断している + - dawrinだとdalmoreだと思いこんで実行している +- 現状コンパイラを探す機能とか、armLibraryを拾ってくる機能は無い + - 付け加えれば問題ないけど... + +## 備考: macOSで動かしたい +- 現状はコンパイラクラッシュするので非対応 +- リンカをlldを使っている関係で、brewでllvmをインストールする必要がある +- ARMのLibraryをRaspberryPiからとってくる必要がある + \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Gears/Xv6/src/impl/pipe.h.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,19 @@ +# pipe.h + +- pipe 構造体 + - struct file interfaceを実装している + +# 内容 +- 2020/01/14現在 + +```c +typedef struct pipe<Impl, Isa> Impl file { + #define PIPESIZE 512 + struct spinlock lock; + char data[PIPESIZE]; + uint nread; // number of bytes read + uint nwrite; // number of bytes written + int readopen; // read fd is still open + int writeopen; // write fd is still open +} pipe; +``` \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Gears/Xv6/src/interface/file.dg.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,24 @@ +# file.dg + +- 名前がかぶっているので新しく作ったfile interface + + +# ファイル内容 +- 2020/01/14現在 + +```c +typedef struct file <Impl> { + union Data* file; + int ref; // reference count + char readable; + char writable; + unsigned int off; + struct stat* st; + char* addr; + int n; + __code stat(Impl* file, struct stat* st, __code next(...)); + __code read(Impl* file, char* addr, __code next(...)); + __code write(Impl* file, char* addr, int n, __code next(...)); + __code close(Impl* file,__code next(...)); +} file; +``` \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Gears/Xv6/src/syscall.cbc.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,15 @@ +# syscall.cbc + +- xv6でシステムコールのディスパッチをしている関数などが定義されている +- ユーザー側から渡された引数をfetchする関数群も定義されている + +## void syscall +- `proc->tf->r0`にsyscallの番号が入っている +- syscallの番号をnumに代入しており、numの値によってsystemcallが呼び出される + +### オリジナルの場合 +- 配列`syscalls`に関数ポインタとして設定されている + +### CbCの場合 +- 対応したenumCodeをいれるべき? + - 現状は決め打ちになっている \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Gears/Xv6/todo.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,6 @@ +# CbCXv6の実装Todo + +- [ ] User側のAPI callをオブジェクト指向的にする +- [ ] Readsyscall周りの再実装 +- [ ] Interfaceの積を取れるようにする +- [ ] usbドライバの作成 \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Gears/Xv6/todo/design.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,74 @@ +# Gearsの設計 + +# CodeGear + +Gearsで使用される基本的な処理のまとまり。 + +CbCの`__code`のこと + +## 宣言 + +```c +__code cg_name(struct hoge* foo) +``` + +# Inteface + +Gearsでのモジュール化の仕組み。JavaのInterface, Haskellの型クラスに相当する。 + +InterfaceはAPIの定義になっており、満たすべきCodeGearと入力を記述する。 + +## 記述 + +### 今現在 + +```c +typedef struct IO <Type, Impl> { + __code read(Impl* io, struct file* file, char* addr, int n, __code next(...)); + __code write(Impl* io, struct file* file, char* addr, int n, __code next(...)); + __code close(Impl* io, struct file* file, int fd, __code next(...)); + __code next(...); +} IO; +``` + + +### 案1 + +- 先頭に`interface`と書き、`<>`の中に利用したいデータ型を書く + - Typeは自分自身の型, Implは実装の型になる + +```c +interface IO <Type, Impl> { + __code read(Impl* io, struct file* file, char* addr, int n, __code next(...)); + __code write(Impl* io, struct file* file, char* addr, int n, __code next(...)); + __code close(Impl* io, struct file* file, int fd, __code next(...)); + __code next(...); +}; +``` + + +## CbCレベルでの表現 + +Interfaceは構造体に変換される。 + +変換される構造体は次のfieldを持つ。 + +- 実装へのポインタ +- 定義したCodeGearの名前に対応したenum Code +- CodeGearの引数 + +上のIOの場合は次のような構造体に変換される。 + +```c +struct IO { + union Data* io; + struct file* file; + char* addr; + int n; + int fd; + enum Code read; + enum Code write; + enum Code close; + enum Code next; +} IO; +``` \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Gears/Xv6/todo/page.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,4 @@ +# おさらい +- 仮想アドレス <-> 物理アドレスの変換をするのがページング + - 実際にはTLBに対象のアドレスがある場合はそちらが使われる + - TLBとアドレスの対応を同期させるために tlb flushが必要になる \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Gears/gearstools/trans_impl.pl.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,17 @@ +# trans_impl.pl + +- Interfaceの定義とInterfaceの実装の定義(ヘッダファイル)を参照して、CbCの雛形を生成するスクリプト + + +# 実行方法 +- `trans_impl.pl`に**実装側のヘッダファイル**を通すことで生成できます + - `perl trans_impl.pl SingleLinkedStack.h` +- `-w` オプションを付けることで、同名の`.cbc`ファイルが生成されます + - `perl trans_impl.pl -w SingleLinkedStack.h` +- `-o` オプションを付けることで、生成するファイル名を指定できます + - `perl trans_impl.pl -o single_linked_stack.cbc SingleLinkedStack.h` + +# 生成されたファイル +- 特にオプションを指定しないと標準出力に出力されます + - `perl trans_impl.pl SingleLinkedStack.h | pbcopy` + - こうしておくとクリップボードにコピーされて便利 \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Gears/introduction.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,8 @@ +# GearsOS 入門 + +- このネームスペースはGears OSを開発する上でのチュートリアルです。 +- 実装状況によりwikiに記述されている内容と異なる場合があります。 + +## 環境構築 +- [CbCコンパイラのinstall](/CbC/install) + - armのクロスコンパイラの構成 \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Gears/introduction/context/context.h.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,28 @@ +# context.h + +GearsOSの中心的なヘッダファイル + +# 内容 + +## 定義されているもの +- GearsOSで利用するマクロ +- GearsOSのContext +- DataGearの集合 + - `union Data` + +## includeしているもの +- 各種enum + - DataGear + - CodeGear +- `c/extern.h` + +# 生成方法 + +## 従来の方法 (~2019/12) + +- 秘伝のタレ的に手で追加していく + - interfaceやImplを手でDataGearにマッピングして追加する + + +## 現在の方法 +- `update_context.pl` もしくは `generate_context.pl` で自動的に生成される \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Gears/introduction/interface.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,7 @@ +# GearsOSのinterface + +- GearsOSにはモジュール化の仕組みとしてInterface構文が存在します + - JavaやgolangのInterface, Haskellの型クラスに相当する構文です + +## Interfaceで定義するもの +- golangのInterfaceでは、関数の集合、及び関数の引数と返り値がinterfaceとして定義されていました \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Gears/introduction/interface/Stack.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,23 @@ +# Stack interface + +- ここではStackのInterfaceについて見てみましょう + +```c +typedef struct Stack<Type, Impl>{ + union Data* stack; + union Data* data; + union Data* data1; + /* Type* stack; */ + /* Type* data; */ + /* Type* data1; */ + __code whenEmpty(...); + __code clear(Impl* stack,__code next(...)); + __code push(Impl* stack,Type* data, __code next(...)); + __code pop(Impl* stack, __code next(Type* data, ...)); + __code pop2(Impl* stack, __code next(Type* data, Type* data1, ...)); + __code isEmpty(Impl* stack, __code next(...), __code whenEmpty(...)); + __code get(Impl* stack, __code next(Type* data, ...)); + __code get2(Impl* stack, __code next(Type* data, Type* data1, ...)); + __code next(...); +} Stack; +``` \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Gears/introduction/interface/about.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,1 @@ +redirect /Gears/introduction/interface \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Gears/introduction/interface/impl.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,4 @@ +# Interfaceの実装 + +- [[Interfaceの定義については確認しました>../about]] +- 続いては定義したInterfaceに具体的な実装を書いていきます \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Gears/introduction/interface/impl/SingleLinkedStack.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,9 @@ +# SingleLinkedStack + +GearsOSのInterfaceを使って[Stack](/Gears/introduction/interface/Stack)を定義しました。 + +今回はこのInterfaceの具体的な実装である`SingleLinkedStack`を見ていきます。 + + +## SingleLinkedStackのヘッダファイル +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Gears/introduction/parallel_execution.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,28 @@ +# parallel_executionイントロダクション + +Gears/Gearsの中心的なプロジェクト`parallel_execution`の入門 + +# 例題を追加したい + +`parallel_execution`の例題はCMakeでビルドされている。 + +新しい例題(プロジェクト)を追加したい場合は、CMakeLists.txtに追記する必要がある。 + +## CMakeLists.txtへの追記 + +ファイル末尾に次のような記述をする。 + +```cmake +GearsCommand( + TARGET + sample + SOURCES + examples/sample/main.cbc TaskManagerImpl.cbc CPUWorker.cbc SynchronizedQueue.cbc AtomicReference.cbc +) +``` + +`GearsCommand`はCMakeのマクロであり、ここにターゲット名と必要なソースを列挙することでビルド対象に加わる。 +マクロの意味は次の通り。 + +- `TARGET` + - プロジェクトの名前。 `make sample`などでビルド出来るようになり、生成されたバイナリの名前にもなる \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Haskell.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,84 @@ +# はじめてのHaskell + +HaskellをやるためにはまずHaskellコンパイラを導入します。 +最も広く使われているものは、The Glasgow Haskell Compiler (GHC) です。 +導入の方法は色々ありますが、手っ取り早く必要なものを揃えるには、''Haskell Platform'' をダウンロードするのがベストです。 +Haskell Platform には GHC コンパイラだけでなく、便利なHaskellのライブラリのセットも同梱されています。 +Haskell Platform を手に入れるには、http://hackage.haskell.org/platform/ に行って、利用している OS 向けの指示に従ってください + +## GHC の構成 +- ghc + - 速いネイティブコードを生成する最適化コンパイラ +- ghci + - 対話型インタプリタとデバッガ +- runghc + - コンパイルせずにHaskellプログラムをスクリプトとして走らせるプログラム + +# Jungle-haskell +非破壊木構造を扱うHaskell module + +## 実際に使ってみよう +研究室のリポジトリからソースを持ってくる +``` +$ hg clone ssh://one@firefly.cr.ie.u-ryukyu.ac.jp/hg/Members/toma/Jungle-haskell/ +``` + +Main.hsという、実際にmoduleをimportして利用しているプログラムがあるので参考にする + +## 利用できる型や関数など +### 型 +- Jungle + - 木とStringを組にして保持するデータ型 + +- Tree + - RootNodeを保持しているデータ型 + +- Node + - childrenとattributesを持つデータ型 + - childrenとして、他のNodeを持つことができる + +- Children + - IntとNodeを組にして保持するデータ型 + +- Attributes + - StringとByteStringを組にして保持するデータ型 + +### 関数 +- createJungle + - 空のJungleを作成する + +- createTree + - Jungleと木の名前を渡すと、その名前の空の木を含んだJungleを返す + +- getTreeByName + - Jungleと木の名前を渡すと、木を返す + - 木の名前が存在しない場合でも、空の木を返す + +- getRootNode + - Treeから、RootNodeを得ることができる + +- getChildren + - NodeからChildrenを得る + +- getAttributes + - NodeからAttributesを得る + +- at + - ChildrenとIntを渡すとNodeを得られる + - 存在しない場合でも、空のNodeを返す + +- get + - AttributesとStringを渡すと、ByteStringが得られる + - 存在しない場合でも、空のByteStringが得られる + +- addNewChildAt + - Treeと、子を追加したいNodeのPath、子を追加したい場所、追加したいNodeを渡すと、追加したTreeを返す + +- deleteChildAt + - Treeと、子を削除したいNodeのPath、削除したい子の場所を渡すと、削除したTreeを返す + +- putAttribute + - Treeと、Attributeを追加したいNodeのPath、Attributeに関連付けたいString、追加したいByteStringを渡すと、追加したTreeを返す + +- deleteAttribute + - Treeと、Attributeを削除したいNodeのPath、Attributeに関連付けたStringを渡すと、削除したTreeを返す
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Haskell/src_read.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,424 @@ +# コンパイラ構成論ソース読み会 〜ghc〜 + +## ghcインストール前に入れる + +``` + $ git clone --recursive git://git.haskell.org/ghc.git +``` + +- /usr/local/以下にインストールしても構わない場合はcloneしてきたディレクトリ上に移動して作業する + +- install先を指定する場合は以下の処理を行ってから作業する + - ディレクトリ作成、移動 +``` + $ mkdir ghc_build + $ cd ghc_build +``` + +- cabalをインストールする + - `$ brew install cabal-install` + + +- happyとAlexをインストールする +``` +$ cabal install happy +$ cabal install Alex +``` + + +- happyとAlexにシンボリックリンクを貼る +``` +$ cd /usr/local/bin +$ ln -s /.cabal/bin/happy happy +$ ln -s /.cabal/bin/alex alex +``` + + +## インストール + + +- 公式ホームページ(https://ghc.haskell.org/trac/ghc/wiki/Building )を参考に + +- mac osはこれを見て環境設定 +https://ghc.haskell.org/trac/ghc/wiki/Building/Preparation/MacOSX + + +- debugはこれを見る https://ghc.haskell.org/trac/ghc/wiki/Debugging/Compiler + +- 詳しくはここ https://ghc.haskell.org/trac/ghc/wiki/Building/Using + +- Haskellコンパイラはセルフビルドする必要性がある為Stage0->Stage1->Stage2の順でビルドする + +- まずはGitリポジトリからGHCをcloneする + https://ghc.haskell.org/trac/ghc/wiki/Building/GettingTheSources +``` + % git clone --recursive git://git.haskell.org/ghc.git +``` + + +- bootを叩く時にm4などが必要になる +``` + % brew install m4 + % brew install autoconf + % brew install automake +``` + + - 残念ながらpathが通らないのでbrew install時に出たパスをzshrcにいれる + + +- git で落としてくる +``` + $ git clone --recursive git://git.haskell.org/ghc.git +``` + +- buildファイルが無いのでbuild.mk.sampleをリネームして用意する + +- /usr/local/以下にインストールしても構わない場合はcloneしてきたディレクトリ上に移動して作業する +``` + $ cd ghc +``` + +- install先を指定する場合は以下の処理を行ってから作業する + - install先ディレクトリ作成、移動 +``` + $ mkdir ghc_build + $ cd ghc_build +``` + - ソースへのリンク作成 +``` + $ lndir ../ghc + $ ln -s ../ghc/.git +``` + +- bootスクリプトの実行 + $ ./ boot + 以前はPerlだったらしいがPythonに変わってた + +- configureの実行 + - `$ ./configure` + - install先を指定する場合は以下のようにprefixを指定する + - `$ ./configure --prefix=$PWD` + +- configure時 + +configureにときにhappyが無いと言われるケースが存在する. +happyはhaskellのパーサジェネレータで,Haskellのstack(The Haskell Tool Stack)かcabalで導入する. + +stackの場合 ghcも入る +``` + $ brew install stack + $ stack install happy +``` + +cabal + +``` + $ brew install cabal-install + $ cabal update + $ cabal install happy +``` + +- build.mk の作成 + - mk以下にbuild.mk.sampleというファイルがあるのでそれをコピーして編集 +``` + $ cp mk/build.mk.sample mk/build.mk + $ vim mk/build.mk +``` +12行目辺りの以下の部分を#を消して有効に +``` + #BuildFlavour = perf +``` +80行目付近の以下の部分を +``` + ifeq "$(BuildFlavour)" "perf" + # perf matches the default settings, repeated here for comparison: + SRC_HC_OPTS = -O -H64m + GhcStage1HcOpts = -O -fasm + GhcStage2HcOpts = -O2 -fasm +``` +このように編集する +``` + ifeq "$(BuildFlavour)" "perf" + # perf matches the default settings, repeated here for comparison: + SRC_HC_OPTS = -O -H64m + GhcStage1HcOpts = -O -fasm -DDEBUG + GhcStage2HcOpts = -O2 -fasm -DDEBUG +``` + + 今はこうする? +``` +GhcStage1HcOpts = -O0 $(GhcFAsm) -fprof-auto -DDEBUG +GhcStage2HcOpts = -O0 $(GhcFAsm) -fprof-auto -DDEBUG +``` + + +- makeとmake installする + - top levelのmakeが下のmakeを呼ぶときに -j が引き継がれるようにする。 +``` + $ make MAKE="make -j" -j + $ make install +``` +prefixを指定した場所に、ghcができている。指定してなければ/usr/local/bin/。 + +- エラーと対処法 +``` +Bad interface file: ***.hi-boot +Bad interface file: ***.hi +``` +- 異なるバージョンのghcでコンパイルされたバイナリが残っているのが原因なのでいちど.hi-boot,.hiファイルを消す。 +``` + $ rm **/*.hi-boot +``` + + - ghc-pkg: ghc no longer supports single-file style package databases + - ghc-pkg 7.9ではファイル形式のデータベースはサポートしていないのでinitし直す必要がある。 + - 古いghcを消した時に発生した。 +``` + $ rm libraries/botstrapping.conf + $ ghc-pkg init libraries/bootstrapping.conf +``` + +# 1日目 + +## どこのghcが呼ばれているのかを調べる + +- 新しくインストールしたghcを、適当なディレクトリに移動する + +``` + $ vim ghc +``` + +- 最後の行のexecをechoに変更する +``` + $ ./ghc ../append.hs +``` + +これで、ghcを実行する時、どのファイルが呼ばれるかがわかる + + +## lldbで追っかけようとした + +``` + $ lldb -- /Users/one/workspace... append.hs +``` + +これでは、mainがないというエラーが出る話が + + +## アセンブラを生成する + +- append.hsを編集し、先頭にModuleを追加する。 + + - .oを生成 +``` + $ ghc_build/bin/ghc -c append.hs +``` + + - .s(アセンブラコード)を生成 +``` + $ ghc_build/bin/ghc -S append.hs +``` + +## ghc_build/compiler/main/HscMain.hsをghciで動かす + +- ghcがあるディレクトリへ移動 +``` + $ cd ghc_build/compiler +``` + +- Hscmain.hsを、ghciで動かすために様々なオプションを追加する + + - cpp : Cのプリプロセッサを通す + - I : #includeファイルを探すディレクトリを、通常のCでの方法で指定する + - S : .s(アセンブラコード)を生成 + - i : 必要なモジュールのディレクトリを指定する + - D : 値を定義する + +- オプションを探す場合 + $ ghc --help + $ man ghc + +##Main.hsを動かす +- FingerPrint.hsが重複していて、エラーが出た + + - FingerPrint.hsを読み込まないように、 + - `__GLASGOW_HASKELL__` < 707なif文にかかる処理を取った + - これをとるとmakeが通らなくなったので必要な処理だったようだ + - buildされるghcのバージョンではなくbuildに使用したghcのバージョン? + + +``` + $ ghci -fno-code -cpp -DSTAGE=2 -I. -I../ghc -I./stage2 -I./stage2/build -iutils:main:prelude:hsSyn:types:typecheck:deSugar:stage2/build:parser:iface:basicTypes:profiling:specialise:coreSyn:cmm:simplCore:codeGen:nativeGen:StgSyn:cbits:rename:simplStg:specialise:stranal:types:vectorise:llvmGen ../ghc/Main.hs +``` + +- この方法でghciは通った +- 次は、ghc_build/compiler/main/HscMain.hsを動かしたい + +- HscEnv とCompileFileを呼び出せばいい +- InitSysToolsをつかってSettingsを作る +``` + let s = SysTools.initSysTools ( Just "/Users/one/workspace/ghc_build/lib/ghc-7.9.20141204" ) + ss <- s +``` +- SettingsからDynFlagsが作れる (defaultDynFlags.Settings DynFlag.hs) + let df = DynFlags.defaultDynFlags s +- DynFlagsからHscEnvが作れる (newHscEnv HscMain.hs) + HscMain.newHscEnv df + - ライブラリが見つからないと怒られる + +# 2日目 +## Haskell Compilerについて勉強する +スライド(http://www.scs.stanford.edu/11au-cs240h/notes/ghc-slides.html#%281%29)を +読んで、Haskell Compilerについて勉強する。 + +## GCについて勉強 +スライド(http://www.slideshare.net/dec9ue/rts-gc)を読んで、 +Gerbage Collectionについて勉強する。 + +## Main.hsを動かす(2) +- .hiと.oがあると、ghciのbreak pointがかけられない。 + $ -fno-code を適用すると .o が作成されなくなる + +- 動かない。Makeをやりなおし。 + +## デバッグオプションがついてない?(問題編) +- config.mk.inの作成 + GhcDebugged=YES + +- configureを実行すると、GhcDebuggedがNOになる。 + GhcDebugged=NO + + +# 3日目 + +## デバッグオプションがついてない?(解決編) + +- 設定を書き換えたい分だけは、新しいファイル(build.mk)に書き込む。 +- build.mkの作成 + + GhcDebugged=YES + +## lldbで読もう +- lldbでcプログラムを読むように、ghcの実行ファイルを読む。 + +- nmコマンドを使って、symboltableから、調査対象の関数名とプログラムアドレスを抜き出す。 + +- プログラムアドレスにbreak pointをあてて、そこからstep実行をして、動作を細かく調査しようとした。 + +- lldbで読んだ結果 + - ライブラリの読み込みやインダイレクトジャンプばかりをやっていて、追いにくそう.. + +## parser/Lexer.x を読む。 +定義を確認し、alexにかけることで**.hsに変換 + alex Parser.x +変換したParser.hsを読む。 + +## Lexer.hsをghciにいれてみる。 +``` + $ ../../build/bin/ghci -fno-code -cpp -DSTAGE=2 -I. -I../ghc -I./stage2 -I./stage2/build -iutils:main:prelude:hsSyn:types:typecheck:deSugar:stage2/build:parser:iface:basicTypes:profiling:specialise:coreSyn:cmm:simplCore:codeGen:nativeGen:StgSyn:cbits:rename:simplStg:specialise:stranal:types:vectorise:llvmGen ./parser/Lexer.hs +``` +- Libraryが読み込めないからソースコードから読むことに。 +- Lexer.hsには字句解析について書かれている。 +- AlexInputが怪しいのでは? + - AlexInputが書かれているコードを探す -> Parser.yに書かれているらしい + +## parser/Parser.hsを読む +Parser.y を happyで *.hsに変換 + happy Parser.y +- Parser.hsで予約語の確認など(tokenとかも) +- 数字の定義をするのが大変らしい + +- happyThenとは? -> ammsの定義を確認 + - aaって何? -> aa = annotation + - amms = リストに対してannotationをマップして付けるもの + +## ParseResultとは? + - parser/Lexer.hsにあるらしい + - runParser発見! + +## parser を実行したい +- parser/Parser.y +- happy parser/Parser.y + - で parser/Parser.hs が手に入る +- parser は runParser で実行できそう? ソースにコメントで書かれてた + +``` + runParser :: DynFlags -> String -> P a -> ParseResult a + runParser flags str parser = unP parser parseState + where + filename = "\<interactive\>" + location = mkRealSrcLoc (mkFastString filename) 1 1 + buffer = stringToStringBuffer str + parseState = mkPState flags buffer location in +``` + +## PState とは? +- parser/HscMain.hsにcaseで使われてる。 + +## Desugar を追う。 + Hskellからcoreにするときにdesugarするので、Desugarを追う。 + - > desugar/Desugar.hsに書かれてる。 + +## dsLExprとは +- deSugar/DsExpr.hsに書いてある。 +- coreExpr を発見 + - coreの計算を行うところらしい。 + - oreSyn/CoreSyn.hsに書いてある。 +- coreSyn/CoreSyn.hsでcoreの定義がされている。 + +## 他に読むものは? +- typechaek/TcUnify.hsを見たら推論木がわかりそう。 +- typecheck/TcType.hsを流し読み。 + + +# 2018 + +## Haskell入門 + +- ソフトウェア工学でも行ったbinary treeの例題 + +- Tree.hsを作る + +``` + data Tree a v = + Node a v (Tree a v) (Tree a v) + | Leaf + deriving (Show) + + insert :: (Ord a ) => Tree a v -> a -> v -> Tree a v + insert Leaf k v = Node k v Leaf Leaf + insert (Node k v left right) k1 v1 + | k == k1 = Node k v1 left right + | k > k1 = Node k v (insert left k1 v1 ) right + | k < k1 = Node k v left ( insert right k1 v1) + + test1 = Node 1 0 Leaf Leaf + + test2 = insert test1 2 1 +``` + +- ghci Node.hs + +- ghcでcoreの出力を見る!! +- mainが無いとghcでコンパイルできない + +``` + data Tree a v = + Node a v (Tree a v) (Tree a v) + | Leaf + deriving (Show) + + insert :: (Ord a ) => Tree a v -> a -> v -> Tree a v + insert Leaf k v = Node k v Leaf Leaf + insert (Node k v left right) k1 v1 + | k == k1 = Node k v1 left right + | k > k1 = Node k v (insert left k1 v1 ) right + | k < k1 = Node k v left ( insert right k1 v1) + + test1 = Node 1 0 Leaf Leaf + + test2 = insert test1 2 1 + + main = do + return test2 +```
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Linda.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,213 @@ +# Lindaライブラリ入手方法 + +Linda serverの本体と、通信プログラムの例です。 通信プログラム作成 +の参考にして下さい。cvsでは、以下のプロジェクト名でチェックアウトしてください。 + + Game_project/Linda + +# Lindaの解説 + +## Lindaとは + +Lindaとは、タプルと呼ばれるIDとDataがセットになったものを、各クライア +ントがサーバに対して out,in,rd などのコマンドを用いて読み書きすることによって通信を行うシステムです。 サーバーに蓄えられたデータへのアクセスは、 APIにタプルのIDを指定することによって行います。 + + +## サーバ (ldserv.c) +Lindaサーバのソースはldserv.cのみです。 + +サーバは、新規にクライアントが接続すると、タプルスペースのID65535にシーケンスな番号をデータとしてもつタプル +を蓄えます。クライアントがこのID65535からタプルを取得(inを用いる)することで、 +クライアント毎にユニークな番号を割り当てることができます。 + +## クライアントAPI (lindaapi.c,lindaapi.h) + +タプル送受信のAPI(out,in,rdなど)を用いると、タプルはCOMMANDキューに溜められていき、プログラマが指定したタイミングで(psx_sync_n()実行時)、 一気にサーバに送信されます。つまりAPIを実行した段階ですぐに通信が 始まるわけではありません。 + +また、サーバからのタプルの受信も psx_sync_n() を実行したときに行い +ます。受信したタプルは REPLYキュー に蓄えられ、psx_reply() で取り出します。 +また、コールバックを用いて受信したときのアクションを登録することができます。 + +## LindaのAPI + + - void start_linda(hostname); + - 通信を初期化して、Linda APIが使用可能にする + - void psx_sync_n(); + - COMMANDキューに溜められたコマンドとデータをサーバへ送信します。 + - また、サーバからデータを取得し、REPLYキューへ溜めます。 + - int psx_out(int id, char *data, int size); + - dataが示すアドレスから、指定したIDのタプルへsize byteのデータを書き込むコマンド。\ + - 返り値は、このコマンドのsequence番号です。 + - int psx_in(int id); + - 指定したID番号のタプルから、データを読み込むコマンド。 + - このコマンドを使用した場合、サーバー上に存在するタプルは、 クライアントがデータを読み込んだ後削除されます。 + - 返り値として、sequence番号を取得します。 + - int psx_rd(int id); + - 指定したID番号のタプルから、データを読み込むコマンド。 + - このコマンドを使用した場合、サーバー上に存在するタプルは、 クライアントがデータを読み込んだ後も残ります。 + - 返り値として、sequence番号を取得します。 + - int psx_wait_rd(int id); + - 基本的に psx_rd() と同じですが、サーバの タプルスペースにデータがあってもすぐには読みこまず、 次にデータが書き込まれるまで待ちます。 + - データが書き込まれたときのみそのデータを読みこみ、クライアントへ送信します。 + - 返り値として、sequence番号を取得します。 + - unsigned char psx_reply(int seq); + - REPLYキューからデータを取り出すときに使用します。 + - psx_in/psx_rdで受け取ったsequence番号を引数とし手渡すと、 要求したデータがREPLYキューにある場合、 データが格納されているTUPLEへのポインタを返します。 + - psx_replyによって返されたポインタの先には、 先頭にそのTUPLEのヘッダ情報が 12bytes 格納されていて、 その後にデータそのものが格納されています。 + - int psx_callback_in(int id,void (*callback)(char *tuple,void *),void *obj); + - サーバからデータを取得した際、REPLYキューに溜めずに任意の関数を 呼び出すよう指定することができます。 + - 引き数の callback 関数ポインタは psx_sync_n() の中で(データが到着したら)呼ばれます。 + - 上記の psx_in / psx_rd / psx_wait_rd のコマンドの各々に対してpsx_callback_in / psx_callback_rd / psx_callback_wait_rd が用意されています。細かな説明は後の方でします。 + - int psx_get_datalength(unsigned char *tuple); + - psx_reply()等で得たTUPLEのヘッダ部分からデータの大きさの情報を得る関数です。 + - 他にシーケンス番号、ID、モードの情報を得る関数も用意しています。 (各々 psx_get_seq(), psx_get_id(),psx_get_mode()) + +## マクロ + +LindaではTUPLEのヘッダ情報やデータ部分へアクセスするためのオフ +セットと して以下のマクロを用意しています。 + + #define LINDA_MODE_OFFSET 0 + #define LINDA_ID_OFFSET 1 + #define LINDA_SEQ_OFFSET 3 + #define LINDA_DATA_LENGTH_OFFSET 7 + #define LINDA_HEADER_SIZE 12 + +これらはpsx_reply()で得たTUPLE(unsigned char のポインタ)のデータ部分 +やヘッダ部分などを取得するときなどに用いられます。データ取得は プログ +ラミングの流れで示します。 以下はpsx_reply()で得たTUPLE (tuple) のヘッ +ダ部分を表示しているところです。 + + printf("MODE: %c\n",*(char*)(tuple+LINDA_MODE_OFFSET)); + printf("ID: %d\n",*(short*)(tuple+LINDA_ID_OFFSET)); + printf("SEQ: %d\n",*(int*)(tuple+LINDA_SEQ_OFFSET)); + printf("DATA_LENGTH: %d\n",*(int*)(tuple+LINDA_DATA_LENGTH_OFFSET); + +ヘッダ情報は異なるエンディアンのCPU上でも対応するように整数の上位 ビッ +トが配列の前の方にくるように揃えているので、予想した結果がでない かも +しれません。ヘッダ部分の情報を得るにはpsx_getから始まる関数群を 使って +下さい。 + +# プログラミングの流れ + +まずは、プログラム初頭でstart_linda(hostname)を 実行して通信を行えるようにしておきます。 + +## データを送信する場合 + +- psx_outでコマンドをキューに追加 (1) + +psx_outした時点では、単にキューへためられるだけで、 まだ通信は開始され +ていません。 Lindaでは、char型かunsigned char型でしかデータを送ること +ができません。 ただ、符号の問題を避けるため、char型ではなくunsigned +char型を使いましょう。 少し詳しく言うと、psx_outは、与えられたポインタ +のアドレスから、 1byteずつ順番に指定されたbyte数サーバーへ送信するとい +う事です。 そこで、送りたいデータを格納している変数や構造体等が +unsigned char型以外である場合、unsigned char型に タイプキャストしてや +る必要があります。 + +- psx_sync_nで実際にコマンドを実行 (2) + +この時、今までキューにためこまれたLindaのコマンドが、一気に実行されま +す。 PlayStation 2では、描画に関する演算はEmotion Engineの中で行われ +ますが、実際の描画処理はGraphics Synthesizerで行われます。 つまり、描 +画処理が行われている間、Emotion Engineには余裕ができます。 その時間を +使用して、通信を行うようにプログラミングしましょう。 (そのタイミングを +考慮して、psx_sync_nを実行しましょう) + + +- 受信相手のデータ受け取りの確認 (3) + +通信を行う際、待ち合わせを行い、 データを受け取るまでゲームが止まって +しまってはいけないので、 Lindaサーバーでは非同期通信を採用しています。 +もし送信するデータを確実に相手に受け取って欲しい場合は、 相手から受け +取りのサイン(Ack)を受け取るようにするとよいでしょう。 + +例えば、送信側が psx_out() したデータを受信側が psx_in() で受け取 るよ +うな通信を何回か繰りかえす場合を考えます。 このとき、通信相手がデータ +を受け取った事を確認してから、 次のデータを送らなければなりません。 何 +も考えずにどんどんpsx_outを行うと、タプルにまだデータが残っているので +新たなデータを書き込めず、キューにためこまれていきます。 そして、処理 +がどんどん重くなってしまい、ゲーム自体もスピードが落ち、 キューがいっ +ぱいになると、失敗するようになってしまいます。 そこで、その確認を取る +ために、相手がデータを受け取ったという サイン(Ack)を、psx_inやpsx_rdを +使用して受け取ります。 Ackを受け取ってから、次のデータをpsx_outして下 +さい。 ただし、プログラムが通信を行う部分でループして、 Ackを得るまで +プログラムが止まるというわけではありません! メインの処理は、Ackを待つ +間も動き続ける書き方をして下さい!! そのために、psx_replyはif文で括ら +れているのです。 + +- (1)からを繰り返し行う (4) + +## データを受信する場合(callbackを使わない) + +- psx_in/psx_rd/psx_wait_rdでsequence番号を取得 (1) + +sequence番号とは、実行したコマンドに与えられる、 整理券の番号みたいな +ものです。 + +- psx_replyでデータの到着を監視 (2) + +データが来ていれば、それに対する処理を実行する。 来ていなければ、その +ままプログラムの処理を進める。 + +- データを任意の変数・構造体に展開 (3) + +データを任意の変数・構造体に展開する際、 データを送信するために 1byte +ずつに分解されたデータ を、元の形に組み立てる必要があります。 +psx_reply() で得たポインタ(仮に reply とします)の 指す先にはTUPLEのヘッ +ダが含まれているので、 実データ(RealData型とします)は + + (RealData *)(reply + LINDA_HEADER_SIZE) + +でアクセスできます。LINDA_HEADER_SIZE は 12 に置き換えられます。 +memcpyを使用すると便利です。 + +- psx_replyで受け取ったポインタをfreeする (4) + +通信で受け取ったデータは、psx_sync_n()の実行時にmallocされ、 メモリの +何処かへ蓄えられています。 それを放っておくと、データを受け取る度に、 +そのデータ分だけ メモリを消費し続ける事になり、メモリ不足の原因となり +ます。 よってデータを任意の変数・構造体に展開し終えた後に、 psx_reply +で得たポインタをfreeして下さい。 勿論、データを任意の変数・構造体に格 +納せずに、 psx_reply で得たポインタをそのまま使用しても構いません。 + +- 送信相手へAckを送る (5) + +必要ならば データを受け取ったというサインを送信者へ送ります。 送信者が +Ack だと分かるものなら、送るデータは何でも構いません。 + +- (1)からを繰り返し行う (6) + + +## データを受信する場合(callbackを使う) + +- psx_callback_in / psx_callback_rd / psx_callback_wait_rd を使う (1) + +callbackを使う場合は引き数にcallbackする関数と、 その関数の引き数にす +る構造体を指定します。この callbackする関数の型は + + void function(char * tuple, void * obj); + +となっています。objは任意の構造体のポインタです。 この関数の内部の処理 +は自由に作ってもいいのですが、 REPLYキューに蓄えられないので、 +psx_reply()を実行しても 答えは返ってきません。 引き数の tuple は +psx_sync_n() 内で malloc されているので、 いらなくなったら free() して +ください。 + +データを受け取ったという情報をAckとして 送る場合などは、この +function() 内で送信する必要があります。 + +この callback 関数を上手く書くと、psx_reply() がいらない ようなプログ +ラムも可能です。 + +# Linda's Tips + +Lindaでのプログラミングの際、以下のことに留意しておいて下さい。 + +- 通信プログラムの例題が、Game_project/Linda/example にあります。 +- IDの幅は、0〜65534です。 +- 65535のIDでpsx_inすると、Lindaサーバーから個別のIDを得られます。 +- IDは、1から順に与えられます。また、IDはASCII文字で送られて来るので、 atoi 関数で数値に変換して下さい。 +- 一度に送れるデータは、1つのタプルにつき、2^32-12bytes(intの最大値-ヘッダサイズ)です。 +- NULLは送らないで下さい。 +- コマンドをためすぎてキューがいっぱいになると失敗します。
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Linux/Kernel/debug_build.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,15 @@ +# FedoraでLinuxのkernelをdebug buildする +- linuxをgdbでデバッグトレースしたい!! +- ansibleがなんとあるので使うといい感じにできる + +## ansible +- http://www.cr.ie.u-ryukyu.ac.jp/hg/Ansible/fedora_kernel_build/ + +## やりかた +- まずdebug buildしたいfedoraのvmをつくる + - dalmoreでやると便利 +- 結構パワーが必要なので、ansibleのファイルにある通りVMの設定を書き換える + - CPUのコア数を8コア + - HDDの容量を30GBは確保する +- cpuのコア数はvirshのxmlを書き換える +- HDDの容量は、qemu-imgでresizeしたあとに、VMにログインしてファイルシステムを拡張する \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Raku.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,9 @@ +# Raku + +ちょっと前までPerl6と呼ばれていたプログラミング言語 + +# Docs + +- 公式Document + - https://docs.raku.org/ + - `docs.perl6.org`のものは古いので見ない \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Raku/UnixDomainSocket.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,32 @@ +Socket おそらく親クラス + +``` + src/core.c/IO/Socket.pm6 +``` + +INETの実装 +``` + src/core.c/IO/Socket/INET.pm6 +``` +なので、 +``` + src/core.c/IO/Socket/Unix.pm6 +``` +を作ればよい。 + +System call constant は、ここに一通りあるらし +``` + nqp/src/vm/moar/QAST/QASTOperationsMAST.nqp +``` +bind は MoarVM の bind_sk から呼ばれるらしい。 +``` + nqp/MoarVM/src/core/ops.c + nqp/MoarVM/src/core/interp.c +``` +この辺。で、実装は、 +``` + nqp/MoarVM/3rdparty/libuv/src/unix/tcp.c +``` +とか。でも、この段階では(余計なことをしてなければ)、Unix/INETの区別はないはず。 + +余計なこととは、Socketを表示する時にアドレスとるとかそんなの。
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Raku/build.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,9 @@ +# macos 上で Raku を build する + + git clone https://github.com/rakudo/rakudo.git + +## 以下を実行する + + perl Configure.pl --prefix=/Users/one/src/Perl6/rakudo_build --gen-moar --gen-nqp --backends=moar --moar-option='--compiler=clang' --moar-option='--static' + +static にしないと moar のshared libraryを見つけられないらしい。開発用なら、これで良いのではないか。 \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Sandbox.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,792 @@ +<div class="panel panel-default"> + <div class="panel-body"> + +# 目次 + +``` +@[toc] +``` + +@[toc] + + </div> +</div> + +# :pencil: Block Elements + +## Headers 見出し + +先頭に`#`をレベルの数だけ記述します。 + +``` +# 見出し1 +## 見出し2 +### 見出し3 +#### 見出し4 +##### 見出し5 +###### 見出し6 +``` + +### 見出し3 +#### 見出し4 +##### 見出し5 +###### 見出し6 + +## Block 段落 + +空白行を挟むことで段落となります。aaaa + +``` +段落1 +(空行) +段落2 +``` + +段落1 + +段落2 + +## Br 改行 + +改行の前に半角スペース` `を2つ記述します。 +***この挙動は、オプションで変更可能です*** + +``` +hoge +fuga(スペース2つ) +piyo +``` + +hoge +fuga +piyo + +## Blockquotes 引用 + +先頭に`>`を記述します。ネストは`>`を多重に記述します。 + +``` +> 引用 +> 引用 +>> 多重引用 +``` + +> 引用 +> 引用 +>> 多重引用 + +## Code コード + +`` `バッククオート` `` 3つ、あるいはチルダ`~`3つで囲みます。 + +``` +print 'hoge' +``` + +### シンタックスハイライトとファイル名 + +- [highlight.js Demo](https://highlightjs.org/static/demo/) の common カテゴリ内の言語に対応しています + + +~~~ +```javascript:mersenne-twister.js +function MersenneTwister(seed) { + if (arguments.length == 0) { + seed = new Date().getTime(); + } + + this._mt = new Array(624); + this.setSeed(seed); +} +``` +~~~ + +```javascript:mersenne-twister.js +function MersenneTwister(seed) { + if (arguments.length == 0) { + seed = new Date().getTime(); + } + + this._mt = new Array(624); + this.setSeed(seed); +} +``` + +### インラインコード + +`` `バッククオート` `` で単語を囲むとインラインコードになります。 + +``` +これは `インラインコード`です。 +``` + +これは `インラインコード`です。 + +## pre 整形済みテキスト + +半角スペース4個もしくはタブで、コードブロックをpre表示できます + +``` + class Hoge + def hoge + print 'hoge' + end + end +``` + + class Hoge + def hoge + print 'hoge' + end + end + +## Hr 水平線 + +アンダースコア`_` 、アスタリスク`*`を3つ以上連続して記述します。 + +``` +*** +___ +--- +``` + +*** +___ +--- + + + +# :pencil: Typography + +## 強調 +### em + +アスタリスク`*`もしくはアンダースコア`_`1個で文字列を囲みます。 + +``` +これは *イタリック* です +これは _イタリック_ です +``` + +これは *イタリック* です +これは _イタリック_ です + +### strong + +アスタリスク`*`もしくはアンダースコア`_`2個で文字列を囲みます。 + +``` +これは **ボールド** です +これは __ボールド__ です +``` + +これは **ボールド** です +これは __ボールド__ です + +### em + strong + +アスタリスク`*`もしくはアンダースコア`_`3個で文字列を囲みます。 + +``` +これは ***イタリック&ボールド*** です +これは ___イタリック&ボールド___ です +``` + +これは ***イタリック&ボールド*** です +これは ___イタリック&ボールド___ です + +# :pencil: Images + +`![Alt文字列](URL)` で`<img>`タグを挿入できます。 + +```markdown +![Minion](https://octodex.github.com/images/minion.png) +![Stormtroopocat](https://octodex.github.com/images/stormtroopocat.jpg "The Stormtroopocat") +``` + +![Minion](https://octodex.github.com/images/minion.png) +![Stormtroopocat](https://octodex.github.com/images/stormtroopocat.jpg "The Stormtroopocat") + +画像の大きさなどの指定をする場合はimgタグを使用します。 + +```html +<img src="https://octodex.github.com/images/dojocat.jpg" width="200px"> +``` + +<img src="https://octodex.github.com/images/dojocat.jpg" width="200px"> + + +# :pencil: Link + +## Markdown 標準 + +`[表示テキスト](URL)`でリンクに変換されます。 + +``` +[Google](https://www.google.co.jp/) +``` + +[Google](https://www.google.co.jp/) + +## Crowi 互換 + +``` +[/Sandbox] +</user/admin1> +``` + +[/Sandbox] +</user/admin1> + +## Pukiwiki like linker + +(available by [weseek/growi-plugin-pukiwiki-like-linker +](https://github.com/weseek/growi-plugin-pukiwiki-like-linker) ) + +最も柔軟な Linker です。 +記述中のページを基点とした相対リンクと、表示テキストに対するリンクを同時に実現できます。 + +``` +[[./Bootstrap3]] +Bootstrap3のExampleは[[こちら>./Bootstrap3]] +``` + +[[../user]] +Bootstrap3のExampleは[[こちら>./Bootstrap3]] + +# :pencil: Lists + +## Ul 箇条書きリスト + +ハイフン`-`、プラス`+`、アスタリスク`*`のいずれかを先頭に記述します。 +ネストはタブで表現します。 + +``` +- リスト1 + - リスト1_1 + - リスト1_1_1 + - リスト1_1_2 + - リスト1_2 +- リスト2 +- リスト3 +``` + +- リスト1 + - リスト1_1 + - リスト1_1_1 + - リスト1_1_2 + - リスト1_2 +- リスト2 +- リスト3 + +## Ol 番号付きリスト + +`番号.`を先頭に記述します。ネストはタブで表現します。 +番号は自動的に採番されるため、すべての行を1.と記述するのがお勧めです。 + +``` +1. 番号付きリスト1 + 1. 番号付きリスト1-1 + 1. 番号付きリスト1-2 +1. 番号付きリスト2 +1. 番号付きリスト3 +``` + +1. 番号付きリスト1 + 1. 番号付きリスト1-1 + 1. 番号付きリスト1-2 +1. 番号付きリスト2 +1. 番号付きリスト3 + + +## タスクリスト + +``` +- [ ] タスク 1 + - [x] タスク 1.1 + - [ ] タスク 1.2 +- [x] タスク2 +``` + +- [ ] タスク 1 + - [x] タスク 1.1 + - [ ] タスク 1.2 +- [x] タスク2 + + +# :pencil: Table + +## Markdown 標準 + +```markdown +| Left align | Right align | Center align | +|:-----------|------------:|:------------:| +| This | This | This | +| column | column | column | +| will | will | will | +| be | be | be | +| left | right | center | +| aligned | aligned | aligned | + +OR + +Left align | Right align | Center align +:--|--:|:-: +This | This | This +column | column | column +will | will | will +be | be | be +left | right | center +aligned | aligned | aligned +``` + +| Left align | Right align | Center align | +|:-----------|------------:|:------------:| +| This | This | This | +| column | column | column | +| will | will | will | +| be | be | be | +| left | right | center | +| aligned | aligned | aligned | + +## TSV (crowi-plus 独自記法) + +``` +::: tsv +Content Cell Content Cell +Content Cell Content Cell +::: +``` + +::: tsv +Content Cell Content Cell +Content Cell Content Cell +::: + +## TSV ヘッダ付き (crowi-plus 独自記法) + +``` +::: tsv-h +First Header Second Header +Content Cell Content Cell +Content Cell Content Cell +::: +``` + +::: tsv-h +First Header Second Header +Content Cell Content Cell +Content Cell Content Cell +::: + +## CSV (crowi-plus 独自記法) + +``` +::: csv +Content Cell,Content Cell +Content Cell,Content Cell +::: +``` + +::: csv +Content Cell,Content Cell +Content Cell,Content Cell +::: + +## CSV ヘッダ付き (crowi-plus 独自記法) + +``` +::: csv-h +First Header,Second Header +Content Cell,Content Cell +Content Cell,Content Cell +::: +``` + +::: csv-h +First Header,Second Header +Content Cell,Content Cell +Content Cell,Content Cell +::: + + +# :pencil: Footnote + +脚注への参照[^1]を書くことができます。また、インラインの脚注^[インラインで記述できる脚注です]を入れる事も出来ます。 + +長い脚注は[^longnote]のように書くことができます。 + +[^1]: 1つめの脚注への参照です。 + +[^longnote]: 脚注を複数ブロックで書く例です。 + + 後続の段落はインデントされて、前の脚注に属します。 + + +# :pencil: Emoji + +See [emojione](https://www.emojione.com/) + +:smiley: :smile: :laughing: :innocent: :drooling_face: + +:family: :family_man_boy: :family_man_girl: :family_man_girl_girl: :family_woman_girl_girl: + +:thumbsup: :thumbsdown: :open_hands: :raised_hands: :point_right: + +:apple: :green_apple: :strawberry: :cake: :hamburger: + +:basketball: :football: :baseball: :volleyball: :8ball: + +:hearts: :broken_heart: :heartbeat: :heartpulse: :heart_decoration: + +:watch: :gear: :gem: :wrench: :envelope: + + +# :pencil: Math + +See [MathJax](https://www.mathjax.org/). + +## Inline Formula + +When $a \ne 0$, there are two solutions to \(ax^2 + bx + c = 0\) and they are + $$x = {-b \pm \sqrt{b^2-4ac} \over 2a}.$$ + +## The Lorenz Equations + +$$ +\begin{align} +\dot{x} & = \sigma(y-x) \\ +\dot{y} & = \rho x - y - xz \\ +\dot{z} & = -\beta z + xy +\end{align} +$$ + + +## The Cauchy-Schwarz Inequality + +$$ +\left( \sum_{k=1}^n a_k b_k \right)^{\!\!2} \leq + \left( \sum_{k=1}^n a_k^2 \right) \left( \sum_{k=1}^n b_k^2 \right) +$$ + +## A Cross Product Formula + +$$ +\mathbf{V}_1 \times \mathbf{V}_2 = + \begin{vmatrix} + \mathbf{i} & \mathbf{j} & \mathbf{k} \\ + \frac{\partial X}{\partial u} & \frac{\partial Y}{\partial u} & 0 \\ + \frac{\partial X}{\partial v} & \frac{\partial Y}{\partial v} & 0 \\ + \end{vmatrix} +$$ + + +## The probability of getting $\left(k\right)$ heads when flipping $\left(n\right)$ coins is: + +$$ +P(E) = {n \choose k} p^k (1-p)^{ n-k} +$$ + +## An Identity of Ramanujan + +$$ +\frac{1}{(\sqrt{\phi \sqrt{5}}-\phi) e^{\frac25 \pi}} = + 1+\frac{e^{-2\pi}} {1+\frac{e^{-4\pi}} {1+\frac{e^{-6\pi}} + {1+\frac{e^{-8\pi}} {1+\ldots} } } } +$$ + +## A Rogers-Ramanujan Identity + +$$ +1 + \frac{q^2}{(1-q)}+\frac{q^6}{(1-q)(1-q^2)}+\cdots = + \prod_{j=0}^{\infty}\frac{1}{(1-q^{5j+2})(1-q^{5j+3})}, + \quad\quad \text{for $|q|<1$}. +$$ + +## Maxwell's Equations + +$$ +\begin{align} + \nabla \times \vec{\mathbf{B}} -\, \frac1c\, \frac{\partial\vec{\mathbf{E}}}{\partial t} & = \frac{4\pi}{c}\vec{\mathbf{j}} \\ + \nabla \cdot \vec{\mathbf{E}} & = 4 \pi \rho \\ + \nabla \times \vec{\mathbf{E}}\, +\, \frac1c\, \frac{\partial\vec{\mathbf{B}}}{\partial t} & = \vec{\mathbf{0}} \\ + \nabla \cdot \vec{\mathbf{B}} & = 0 +\end{align} +$$ + +<!-- Reset MathJax --> +<div class="clearfix"></div> + + +# :pencil: UML Diagrams + +See [PlantUML](http://plantuml.com/). + +## シーケンス図 + +@startuml +skinparam sequenceArrowThickness 2 +skinparam roundcorner 20 +skinparam maxmessagesize 60 +skinparam sequenceParticipant underline + +actor User +participant "First Class" as A +participant "Second Class" as B +participant "Last Class" as C + +User -> A: DoWork +activate A + +A -> B: Create Request +activate B + +B -> C: DoWork +activate C +C --> B: WorkDone +destroy C + +B --> A: Request Created +deactivate B + +A --> User: Done +deactivate A + +@enduml + +<!-- Reset PlantUML --> +<div class="clearfix"></div> + + +## クラス図 + +@startuml + +class BaseClass + +namespace net.dummy #DDDDDD { + .BaseClass <|-- Person + Meeting o-- Person + + .BaseClass <|- Meeting +} + +namespace net.foo { + net.dummy.Person <|- Person + .BaseClass <|-- Person + + net.dummy.Meeting o-- Person +} + +BaseClass <|-- net.unused.Person + +@enduml + +<!-- Reset PlantUML --> +<div class="clearfix"></div> + + +## コンポーネント図 + +@startuml + +package "Some Group" { + HTTP - [First Component] + [Another Component] +} + +node "Other Groups" { + FTP - [Second Component] + [First Component] --> FTP +} + +cloud { + [Example 1] +} + + +database "MySql" { + folder "This is my folder" { + [Folder 3] + } + frame "Foo" { + [Frame 4] + } +} + + +[Another Component] --> [Example 1] +[Example 1] --> [Folder 3] +[Folder 3] --> [Frame 4] + +@enduml + +<!-- Reset PlantUML --> +<div class="clearfix"></div> + + +## ステート図 + + +@startuml +scale 600 width + +[*] -> State1 +State1 --> State2 : Succeeded +State1 --> [*] : Aborted +State2 --> State3 : Succeeded +State2 --> [*] : Aborted +state State3 { + state "Accumulate Enough Data\nLong State Name" as long1 + long1 : Just a test + [*] --> long1 + long1 --> long1 : New Data + long1 --> ProcessData : Enough Data +} +State3 --> State3 : Failed +State3 --> [*] : Succeeded / Save Result +State3 --> [*] : Aborted + +@enduml + +<!-- Reset PlantUML --> +<div class="clearfix"></div> + +# :pencil: blockdiag + +See [blockdiag](http://blockdiag.com/). + +## blockdiag + +<!-- Resize blockdiag --> +<div style="max-width: 600px"> + +::: blockdiag +blockdiag { + A -> B -> C -> D; + A -> E -> F -> G; +} +::: + +</div> + +## seqdiag + +<!-- Resize blockdiag --> +<div style="max-width: 600px"> + +::: seqdiag +seqdiag { + browser -> webserver [label = "GET /index.html"]; + browser <-- webserver; + browser -> webserver [label = "POST /blog/comment"]; + webserver -> database [label = "INSERT comment"]; + webserver <-- database; + browser <-- webserver; +} +::: + +</div> + +## actdiag + +<!-- Resize blockdiag --> +<div style="max-width: 600px"> + +::: actdiag +actdiag { + write -> convert -> image + + lane user { + label = "User" + write [label = "Writing reST"]; + image [label = "Get diagram IMAGE"]; + } + lane actdiag { + convert [label = "Convert reST to Image"]; + } +} +::: + +</div> + +## nwdiag + +<!-- Resize blockdiag --> +<div style="max-width: 600px"> + +::: nwdiag +nwdiag { + network dmz { + address = "210.x.x.x/24" + + web01 [address = "210.x.x.1"]; + web02 [address = "210.x.x.2"]; + } + network internal { + address = "172.x.x.x/24"; + + web01 [address = "172.x.x.1"]; + web02 [address = "172.x.x.2"]; + db01; + db02; + } +} +::: + +</div> + +## rackdiag + +<!-- Resize blockdiag --> +<div style="max-width: 600px"> + +::: rackdiag +rackdiag { + // define height of rack + 8U; + + // define rack items + 1: UPS [2U]; + 3: DB Server + 4: Web Server + 5: Web Server + 6: Web Server + 7: Load Balancer + 8: L3 Switch +} +::: + +</div> + +## packetdiag + +<!-- Resize blockdiag --> +<div style="max-width: 600px"> + +::: packetdiag +packetdiag { + colwidth = 32 + node_height = 72 + + 0-15: Source Port + 16-31: Destination Port + 32-63: Sequence Number + 64-95: Acknowledgment Number + 96-99: Data Offset + 100-105: Reserved + 106: URG [rotate = 270] + 107: ACK [rotate = 270] + 108: PSH [rotate = 270] + 109: RST [rotate = 270] + 110: SYN [rotate = 270] + 111: FIN [rotate = 270] + 112-127: Window + 128-143: Checksum + 144-159: Urgent Pointer + 160-191: (Options and Padding) + 192-223: data [colheight = 3] +} +::: + +</div>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Sandbox/Bootstrap3.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,135 @@ +# Labels + +<span class="label label-default">Default</span> +<span class="label label-primary">Primary</span> +<span class="label label-success">Success</span> +<span class="label label-info">Info</span> +<span class="label label-warning">Warning</span> +<span class="label label-danger">Danger</span> + +# Alerts + +<div class="alert alert-success" role="alert"><b>Well done!</b> You successfully read this important alert message. </div> +<div class="alert alert-info" role="alert"><b>Heads up!</b> This alert needs your attention, but it's not super important. </div> +<div class="alert alert-warning" role="alert"><b>Warning!</b> Better check yourself, you're not looking too good. </div> +<div class="alert alert-danger" role="alert"><b>Oh snap!</b> Change a few things up and try submitting again. </div> + +# Panels + +<div class="panel panel-default"> + <div class="panel-heading">Panel heading without title</div> + <div class="panel-body"> + Panel content + </div> +</div> + +<div class="panel panel-primary"> + <div class="panel-heading">Panel heading without title</div> + <div class="panel-body"> + Panel content + </div> +</div> + +<div class="panel panel-success"> + <div class="panel-heading">Panel heading without title</div> + <div class="panel-body"> + Panel content + </div> +</div> + +<div class="panel panel-info"> + <div class="panel-heading">Panel heading without title</div> + <div class="panel-body"> + Panel content + </div> +</div> + +<div class="panel panel-warning"> + <div class="panel-heading">Panel heading without title</div> + <div class="panel-body"> + Panel content + </div> +</div> + +<div class="panel panel-danger"> + <div class="panel-heading">Panel heading without title</div> + <div class="panel-body"> + Panel content + </div> +</div> + +# Wells + +## Default well + +<div class="well">Look, I'm in a well! </div> + +## Optional classes + +<div class="well well-lg">Look, I'm in a well! </div> + +<div class="well well-sm">Look, I'm in a well! </div> + +# Typography + +## Lead body copy + +<p class="lead">Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Duis mollis, est non commodo luctus.</p> + +## Marked text + +You can use the mark tag to <mark>highlight</mark> text. + +## Small text + +<small>This line of text is meant to be treated as fine print.</small> + +## Alignment classes + +<div class="panel panel-default"> + <div class="panel-body"> + <p class="text-left">Left aligned text.</p> + <p class="text-center">Center aligned text.</p> + <p class="text-right">Right aligned text.</p> + <p class="text-justify">Justified text.</p> + <p class="text-nowrap">No wrap text.</p> + </div> +</div> + +## Transformation classes + +<div class="panel panel-default"> + <div class="panel-body"> + <p class="text-lowercase">Lowercased text.</p> + <p class="text-uppercase">Uppercased text.</p> + <p class="text-capitalize">Capitalized text.</p> + </div> +</div> + + +# Helper classes + +## Contextual colors + +<div class="panel panel-default"> + <div class="panel-body"> + <p class="text-muted">Fusce dapibus, tellus ac cursus commodo, tortor mauris nibh.</p> + <p class="text-primary">Nullam id dolor id nibh ultricies vehicula ut id elit.</p> + <p class="text-success">Duis mollis, est non commodo luctus, nisi erat porttitor ligula.</p> + <p class="text-info">Maecenas sed diam eget risus varius blandit sit amet non magna.</p> + <p class="text-warning">Etiam porta sem malesuada magna mollis euismod.</p> + <p class="text-danger">Donec ullamcorper nulla non metus auctor fringilla.</p> + </div> +</div> + +## Contextual backgrounds + +<div class="panel panel-default"> + <div class="panel-body"> + <p class="bg-primary">Nullam id dolor id nibh ultricies vehicula ut id elit.</p> + <p class="bg-success">Duis mollis, est non commodo luctus, nisi erat porttitor ligula.</p> + <p class="bg-info">Maecenas sed diam eget risus varius blandit sit amet non magna.</p> + <p class="bg-warning">Etiam porta sem malesuada magna mollis euismod.</p> + <p class="bg-danger">Donec ullamcorper nulla non metus auctor fringilla.</p> + </div> +</div>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/growi.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,10 @@ +# growi + +- markdownで書けるwiki + - ようはこれ + +# UML +- plantumlで記述できる +- https://plantuml.com/ +- 詳しい書き方はこの辺をみる + - https://real-world-plantuml.com/ \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/software.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,9 @@ +# Software + +- いい感じの名前空間がなかったので適当に決めました... +- 旧wikiから持ってきたものが多い + - ソースコード読み会などの資料が + +# contents + +| $lsx(./) | \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/software/Blender.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,9 @@ +# Blender とは +3Dモデリング用ソフトです。 + +## アニメーション + アニメーションは、ボーズオブジェクトのアニメーションベースでやるべき。 + + キャラクターアニメーションを作るとき、IKコントロールのボーンズシステムを使ったほうが便利 + + IKの作り方は https://www.youtube.com/watch?v=4yiC6pEQMAw
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/software/Blender/works.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,23 @@ +# Blender作品/ + +## Blenderのショートカットキー; + + + +| > | キー | 効果 | キー | 効果 | +| --- | ---- | ----------------------------------------------------------- | ---- | ------------------------------------------------- | +| > | a | ポイントの全選択・全解除(all) | b | オブジェクトのポイントを選択する(グループ選択) | +| > | c | カーソルが中心になる | d | draw mode(表示モード)を選択できる | +| > | e | Extrude 選択したobjをマウスでひっぱる | f | edge/faceを作る? | +| > | g | 選択したobj (point)の移動ができる(grab) | h | objectをHide(隠す) | +| > | i | Insert key | j | ? | +| > | k | ナイフツール(種類が4つ) | l | ? | +| > | m | Mirror Axis | n | 選択したポイントをxyz軸に対してそれぞれ移動させる | +| > | o | (下の)メニューバーに[Smooth Falloff][Shape Falloff]ができる | p | Separateキー | +| > | q | exit(quit) | r | 選択した全ポイントの中心が回転する。 | +| > | s | オブジェクトのサイズ変更(shift+でsnap) | t | ? | +| > | u | Undoする(shift+でredo) | v | ? | +| > | w | Special(SmoothやBevel等の特殊効果用のメニュー) | x | objectやvertexを削除する | +| > | y | Split:選択したポイントを好きな場所にコピーする | z | solid <--> wier fream 表示切替 | + +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/software/CVS.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,222 @@ +# CVSの使い方 + +CVS は共同プロジェクトによるドキュメントやプログラム・コード等の管理を +行う便利なツールです。ゲーム班にまつわる全ては CVS によって管理されま +すので、CVSで始まりCVSで終わるといっても過言ではないでしょう。 + +ここでは CVSの使い方を例を挙げて説明します。 +ただ、CVSをコマンドから直接打ち込むと面倒なので、cvs-cr というスクリプ +トを作って、それを使います。練習用のプロジェクトに +Game_project/Test/ 以下を用意しましたのでそちらを御利用下さい。 +実際のゲーム作りではGame_project/ 以下にプロジェクトを作ります。特に +PS2 Linux向けのプロジェクトならば Game_project/ps2 を、GBA向けの +プロジェクトならば Game_project/gba をお使い下さい。 + +ここでは Game_project/Test/ 以下に test_program という仮想のプロジェク +トを作り、cvs-cr の使い方の例を挙げて説明することにしていきましょう。 + +## つーかCVSって何だば? + +簡単に言えばプロジェクト運営用のツールで、データベースのような機能を提 +供します。 + + +例えば、プロジェクトとして複数人で一つのプログラムのコーディング作業を行ったら +どうなると思いますか? もちろん誰が何を変更したか分かりませんので、 +コーディングにバグが含まれていたら目も当てられませんね。 +バグを忍ばせた人が誰なのかは全くわかりません。 +よってチームの人間関係にヒビが入ります。 + + +編集する前には cpコマンドとかで バックアップをとるのが妥当ですが、 +cpでバックアップを毎回とるのですか? そいつはちと面倒です。 +それ以前にバックアップ自体にバグが含まれていたら +チームの人間関係に莫大なダメージを与えます。 + + +それと、よくある失敗で、 + + % rm -rf * (メガンテ!!) + +という自爆技があり、これによりチーム全員が自爆します。 +ホームディレクトリでやるとその効果は絶大です。 + + +ということを防ぐためにCVSを使いましょう。習得は楽なので恐れないで下さい。 + +## cvs-crの作りかた + +奴はシェルスクリプトで、中身はこんな感じです。 +locateかfindで探せば見付かるはずですが、まぁ取り敢えずここではcvs-crの作り方を説 +明します。 + + cvs -d game@firefly.cr.ie.u-ryukyu.ac.jp:/home/one/CVS_DB $* + +こんだけです。これを毎回打ち込むのはさすがに面倒なのでシェルスクリプトにするので +す。ここでは説明しませんが多分 alias でもいけますよ。 + +とりあえずcvs-crの作り方を説明します。取り敢えずエディタでcvs-crを書きましょう。 + + % vi cvs-cr + もしくは + % emacs cvs-cr + +これで上記の一行を書いて終了なのです。それから忘れずに実行権を与えましょう + + % chmod +x cvs-cr (ユーザの実行許可) + +でもって /bin ディレクトリ作って cvs-cr を放りこんで下さい。 + + % mkdir /bin + % mv cvs-cr /bin + +次に /bin に実行のパスを通してあげます。パスは tcsh なら /.tcshrc、 +bash なら /.bashrc に書かれてますので、こやつに /bin の実行パスを追 +加します。ここではtcshについて説明しますので適当にいじって下さい。 + + % emacs /.tcshrc (tcshの場合) + +でもって、こんな感じの行を探してみましょう。 + + set path = (/bin /usr/sbin /sbin ...省略(他のbinへのパス)...) + +こやつに追加します + + set path = (/bin /usr/sbin /sbin ...省略(他のbinへのパス)... /bin) + +編集が終わったら忘れがちなのがコレ! + + % source /.tcshrc + % rehash + +はい終了。簡単でした。でも実はこれだけじゃまだ設定不足で、環境変数の +設定が必要です。以下のcvsで用いる環境変数を読み下さい。 + + +## cvsで用いる環境変数 + +PS2Linux では cvs で用いる環境変数を /etc/bashrc , /etc/csh.cshrc で設 +定しています。 + +もし, 出来んやっし! とか PS2 Linux以外の PC から CVS 使う場合は, + /.bashrc か /.tcshrc あたりを以下のように設定しましょう。 + +こっちは bash の場合 + + export CVS_RSH=ssh + export CVSEDITOR=/usr/bin/emacs + +んで、こっちが tcshの設定です。 + + # CVS で用いるログインシェル. 本学科はsshを使うことになってます + setenv CVS_RSH ssh + + # CVS で用いる エディタ. vi でなく emacs とか書くと ログの書き + # 込み時に勝手に emacs が起動します。日本語化け対策はeucで保存す + # ればOK ! + setenv CVSEDITOR vi + + + +## 新規プロジェクトを開始する + +まず、cvsリポジトリの Game_project/Test/ 以下に test_program と +いう新しいプロジェクトを作ります。新規プロジェクトを開始する場合 +は import を使います。そのあとにオプションとして プロジェクト名、 +ユーザ名、リリースタグを指定します。インポートするとエディタが起 +動し、コメントを付けることができます。 +以下を実行すると、カレントディレクトリ以下の(. .. 以外の) ファイ +ル・ディレクトリが Game_project/Test/test_program にリポジトリと +してに追加されます。 + + $ cvs-cr import Game_project/Test/test_program game start + +## プロジェクトをチェックアウトする + +cvsリポジトリよりプロジェクトを入手(チェックアウト)します。 +checkout を使います。 +以下を実行すると、カレントディレクトリに +Game_project/Test/test_program ができます。また、ここで +Game_project/Test/ を指定すると、test_program だけではなく、 +Game_project/Test/ 以下の全てのプロジェクトをチェックアウトでき +ます。 + + $ cvs-cr checkout Game_project/Test/test_program +または + $ cvs-cr co Game_project/Test/test_program + + +おまけとして、checkoutした時に上記の場合、Game_project/Test/test_program +というdirectoryが作成されますが、実際作業するのにわざわざtest_programまで +移動しなければならないので、これがめんどいって人は、-dオプションを使用しましょう。 + + $ cvs-cr co -d directory-name Game_project/Test/test_program +directory-nameの部分に任意の名前をつける。すると、test_program以下が +directory-nameの中にできます。まぁ必要ない人は使わなくてもいいけど、 +リポジトリ階層がかなり深くなるとちょっと移動がめんどくなるので、 +便利かと思います。 + +## プロジェクトをコミットする + +チェックアウトしたファイルなどに変更を加え、その変更をリポジトリ +にも反映させたい場合は commit を使います。ただし、新しくファイル +やディレクトリを追加した場合は add を用いてからコミットしてくだ +さい。コミットしたときに指定したエディタが起動して、コメントを付 +けることができるので、変更箇所などの情報を書くといいでしょう。 +作業用ディレクトリ(チェックアウトした test_program) で以下を実行 +すると、変更を加えたファイルだけをリポジトリに反映します。特定の +ファイルだけをコミットしたい場合はオプションとしてファイル名 +(file_name)を指定してください。 + + $ cvs commit [file_name] + +## リポジトリの変更を自分の作業用ディレクトリに反映させる + +自分がチェックアウトした後に他の人がリポジトリに変更をコミットし +た場合、その変更を自分の作業用ディレクトリに反映させることができ +ます。その場合は update を使います。 + + $ cvs update + +##プロジェクトに新たにファイル・ディレクトリを追加する + +プロジェクトに新たにファイルやディレクトリを追加する場合は作業用 +ディレクトリで add を用いてからコミットします。add だけではリポ +ジトリにファイルができないので、コミットすることを忘れないで下さ +い。 +以下のコマンドは、test_program 以下に新たに add_dir というディレ +クトリと add_file_1.c というファイル、add_dir の下の +add_file_2.c というファイルを追加します。 + + $ cvs-cr add add_dir add_file_1.c + $ cvs-cr add add_dir/add_file_2.c + $ cvs-cr commit + +##プロジェクトにタグ(マーク)をつける +プロジェクトをcheckoutする場合、開発における一定のポイントを取り出したいということが多々あります。そのとき、日付による取得とタグによる取得があります。ここでは、タグによる取得を紹介します。 + +「あ、あのときのリリースバージョンとりたい!」ということが起きたとしましょう。そのとき、日付やタグによる取得をしらないと「えーっと、file_1.cはversion1.1で、file_2.cはversion1.2でfile_3,cはーえっと..???」なんてことになってしまいます。 + + +なぜそんなことがおきるのか?そう、CVSのバージョン管理はファイル別で行われているので(リポジトリ別ではない)、ファイルによって最新バージョンがバラバラになっていることがあります(例えば、file_1.cはversion1.1、file_2.cはversion1.2の様に)。 + +その問題を解決してくれるのが、タグ機能です。ある特定のポイントでタグをつけることにより、後でタグに指されたそれぞれバージョンのファイルをcheckoutすることができます。 + + +さあ、使ってみましょう。現在、Game_project/Test/test_programをcheckoutして、そのディレクトリにいるとします。 +- 以下はタグを付けるコマンドです。tagの後ろにタグ名を付けて下さい。 + cvs tag [tag_name] +- 以下はタグの付いたポイントをcheckoutするコマンドです。 + cvs-cr checkout -r [tag_name] Game_project/Test/test_program + +##プロジェクトを最新の状態にする +タグなどによって古いバージョンに戻したあと、再びプロジェクトを最新の状態にしたいとき。 + cvs up -A +オプション"A"を忘れずに付けましょう。 +##で、CVSって何よ? + +そんなあたなにプレゼント + +[[CVSの使い方:http://nile.ulis.ac.jp/ yuka/memo/cvs.html]] + +CVSについてさらに知りたければ、研究室にCVS関連の本がありますのでどうぞ。もしくは Let's google!!
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/software/CVS/repository_list.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,46 @@ +## CVSリポジトリ一覧 + + +## CVSリポジトリについて + +CVSはデータベースのようなもので、 +そのCVS貯蔵庫のことをCVSリポジトリ(repository)と呼ぶのです。 +CVSについては[[CVSの使い方]]が参考になるでしょう。 + +[[ココ:http://www/internal/viewcvs.cgi/]]から並列信頼研のCVSリポジトリ +にアクセスできますので、「CVSから〜〜とってきて〜」とか言われたら +[[ココ:http://www/internal/viewcvs.cgi/]]を御利用下さい。 + +COLOR(orange){※ ただし研究室インターナルなので研究室内のPCからしかアクセスできませんので要注意!! PWもMacもだめど!!} + +### Game_projectリポジトリについて + +あなたたちがお探しのプロジェクトは''Game_project/ps2''の中で見付けることができるでしょう。 + +そう、例えば''Game_project/ps2/dynamic''を見つけたとしましょう。 +で、何それ? と思ったら、 + + % cd + % cvs-cr co Game_project/ps2/dynamic + +とかやるとホームディレクトリに + + Game_project + +のディレクトリができています。その中に dynamic を見つけるでしょう。 +ディレクトリdynamicの中にはCソースコードやドキュメントが詰まっています。 +大抵は気にせずmakeできるでしょう。 + + % make + +dynamicはPS2 Linux向けに開発されたので、PS2 Linux上でmakeしましょ。実 +行はroot権限が必要ですので、 + + % su + +してから実行します。運が良ければREADMEとかREADME.htmlとか入っているの +でご参照下さい。 + +### 意味よ? + +って思ったらura.ie.classes.studentlabs.game-constructionに投稿しましょう。
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/software/Christie.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,1 @@ +redirect /trash/software/Christie \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/software/FreeMind.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,54 @@ +# FreeMind + +- Javaで書かれたMindMap作成ツール + + +# 書き込もうとしたら泊まる場合 + +## 原因 + +FreeMindは内部的に Java Runtime Environment 7を使用しています. +これはFreemindの内部に入っているためFreeMindはこれを参照するようです. + +何かしらの原因で固まっている場合,このJava7が上手く動いていない/正常に機能していない可能性があります. + +実験した所Java9以上では正常にFreeMindが動かない為Java8をローカルにダウンロードし,これをFreeMindが利用するようにすれば解決します.(おそらく) + +## 環境 +* Mac OS + +## 修正方法 + +* まず[Java SE8](https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html)をダウンロードします + +* installしたらターミナルで `/usr/libexec/java_home -V` を実行します. + +``` +Matching Java Virtual Machines (3): + 11.0.1, x86_64: "Java SE 11.0.1" /Library/Java/JavaVirtualMachines/jdk-11.0.1.jdk/Contents/Home + 10.0.1, x86_64: "Java SE 10.0.1" /Library/Java/JavaVirtualMachines/jdk-10.0.1.jdk/Contents/Home + 1.8.0_181, x86_64: "Java SE 8" /Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home + +/Library/Java/JavaVirtualMachines/jdk-11.0.1.jdk/Contents/Home +``` + +ここでJavaSE 8のinstall pathを確認します,上の例では `/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk` です. + +* 次にFreeMindの設定を行うために `cd /Applications/FreeMind.app/Contents/ ` します + +* ここで 簡単の為に `cd PlugIns` します.lsすると `jdk1.7.0_45.jdk`が入っている事がわかります. +* このディレクトリにあるJavaをFreemindが利用するのでここにシンボリックリンク/ハードリンクを起きます + +`ln -s /Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk` + +* ls -l し正常に /Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk にjdk1.8.0_181.jdkからリンクが貼られている事を確認します +* 続いて ` cd ../` し,一つ前に戻った後 vimかemacsなどでInfo.plistを開きます + +この中の + +``` + 27 <key>JVMRuntime</key> + 28 <string>jdk1.7.0_45.jdk</string> +``` + +このjdkの部分を `jdk1.8.0_181.jdk` (先ほど置いたjdkの名前)に変更すれば大丈夫です. \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/software/Hazelcast.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,321 @@ +# Hazelcast + +## goal +Hazelcastをjavaで動かす. + +## What Hazelcast + +- インメモリ・データグリッドのフレームワーク +- オープンソース +- javaで動く. + +## What in-memory data grid + +- キーと値の1対1でデータを管理 +- 極めて単純なデータ構造であり, メモリ上で動かすので, データ参照, 更新が速い +- 検索やトランザクション管理には向いていない(というか, そんな機能ない?) +- メモリーにデータを分散して管理する. +- パーティションもできる. + +## GetStarted +[[Get Started with Hazelcast IMDG:https://hazelcast.org/getting-started-with-hazelcast/]] + +### IntelliJの設定 +- [[ここ:https://hazelcast.org/download/]]からHazelcast IMDGのzipをダウンロード, 解凍 + +- intelliJで, プロジェクトを作成. + +- プロジェクト作成後, クラスパスを指定 + - Project Structure -> Platform Setting -> SDKs -> 9.0 -> Classpathから「+」ボタンを押す. + - ダウンロードし, 解答した「hazelcast-3.9.x」フォルダの「lib/hazelcast-3.9.1.jar」ファイルを指定し, 追加. + +### サーバーのたて方 +- 新しいjavaファイルを作成. javaのファイル名を「GettingStarted.java」にし, 以下のコードを追加 + + +```java + import com.hazelcast.core.*; + import com.hazelcast.config.*; + + import java.util.Map; + import java.util.Queue; + + public class GettingStarted { + public static void main(String[] args) { + Config cfg = new Config(); + HazelcastInstance instance = Hazelcast.newHazelcastInstance(cfg); + Map<Integer, String> mapCustomers = instance.getMap("customers"); + mapCustomers.put(1, "Joe"); + mapCustomers.put(2, "Ali"); + mapCustomers.put(3, "Avi"); + + System.out.println("Customer with key 1: "+ mapCustomers.get(1)); + System.out.println("Map Size:" + mapCustomers.size()); + + Queue<String> queueCustomers = instance.getQueue("customers"); + queueCustomers.offer("Tom"); + queueCustomers.offer("Mary"); + queueCustomers.offer("Jane"); + System.out.println("First customer: " + queueCustomers.poll()); + System.out.println("Second customer: "+ queueCustomers.peek()); + System.out.println("Queue size: " + queueCustomers.size()); + } + } +``` + +実行結果 + +``` + Members {size:1, ver:1} [ + Member [192.168.0.5]:5701 - f2eb4e2f-028e-4cf4-af5a-005c27591655 this + ] + + Customer with key 1: Joe + Map Size:3 + First customer: Tom + Second customer: Mary + Queue size: 2 +``` + + +2台目 + + +``` + Members {size:2, ver:2} [ + Member [192.168.0.5]:5701 - f2eb4e2f-028e-4cf4-af5a-005c27591655 + Member [192.168.0.5]:5702 - dc880f43-e9d4-4ad4-8428-2ca2d9732aa7 this + ] + + 12月 29, 2017 5:09:32 午後 com.hazelcast.core.LifecycleService + 情報: [192.168.0.5]:5702 [dev] [3.9.1] [192.168.0.5]:5702 is STARTED + Customer with key 1: Joe + Map Size:3 + First customer: Mary + Second customer: Jane + Queue size: 4 +``` + +mapは, <Integer, String>である. そのため, 2台目の場合は上書きしているだけなので, MapSizeは変わらない. + +Queueはpushしているので, 2台目のデータの数と同じである. + +### クライアントの動かし方 +- 新しいjavaファイルを作成. javaのファイル名を「GettingStartedClient.java」にし, 以下のコードを追加 + +```java + package com.hazelcast.test; + + import com.hazelcast.client.config.ClientConfig; + import com.hazelcast.client.HazelcastClient; + import com.hazelcast.core.HazelcastInstance; + import com.hazelcast.core.IMap; + + public class GettingStartedClient { + public static void main(String[] args) { + ClientConfig clientConfig = new ClientConfig(); + clientConfig.addAddress("127.0.0.1:5701"); + HazelcastInstance client = HazelcastClient.newHazelcastClient(clientConfig); + IMap map = client.getMap("customers"); + IQueue queue = client.getQueue("customers"); + System.out.println("Map Size : " + map.size()); + System.out.println("mapCustomers 1 : " + map.get(1)); + System.out.println("Queue Size : " + queue.size()); + System.out.println("queueCustomers poll : " + queue.poll()); + } + } + ``` + +実行結果 + + ``` + Members [3] { + Member [192.168.0.5]:5701 - f2eb4e2f-028e-4cf4-af5a-005c27591655 + Member [192.168.0.5]:5702 - dc880f43-e9d4-4ad4-8428-2ca2d9732aa7 + } + + Map Size : 3 + mapCustomers 1 : Joe + Queue Size : 4 + queueCustomers poll : Mary + ``` + +とりあえず, サーバーで指定したgetMap(String)のStringと同じ名前でgetMap(String)すれば, 同じMapが取れる. + +## 内部について +この2サイトに詳しい説明が書いてある. +- http://d.hatena.ne.jp/Kazuhira/20160928/1475077755 +- http://d.hatena.ne.jp/Kazuhira/20161028/1477663801 + +パーティションでデータを保存しているため, 例えば4つサーバー(Node)をたて, そのうちのサーバー(Node)が1つなくなったとしても, map, queueに入れたデータは残る. + +> HazelcastはNodeを起動すると、指定された方法に沿って他のNodeを見つけ出し、クラスタを構成します。 <略> デフォルトで選択されているのは、マルチキャストです。 + +#ref(http://cdn-ak.f.st-hatena.com/images/fotolife/K/Kazuhira/20160928/20160928233825.jpg,left,nowrap,画像) + +## 教えてもらったもの +このリンク先の記事がとっても役に立つらしい +- https://hazelcast.com/resources/hazelcast-jet-datasheet/ + +## goal2 先輩の手伝い +1.以下のテストを書いてほしいです。 + + ・1つのローカル内で2つのノードに見立てて立ち上げ、データをやりとりします + ・相手ノードのノード名と相手側のデータの2つの入力が揃ったらそれを表示します + ・データをインクリメントしてそれを繰り返します + インプット: + 1 + アウトプット: + A : 1 + B: 2 + A : 3 + B: 4 + A : 5 + B : 6 + A: 7 + B : 8 + A: 9 + + +2.調査:ノード間でトポロジー(ツリーとかリングとか)を形成したいとき、それをサポートする機能はあるか? + +3.調査:送信するデータを圧縮したいとき、それをサポートする機能はあるか? + + +## 1 コード + + +```java + package jp.ac.uryukyu.ie.aka; + import com.hazelcast.core.*; + import com.hazelcast.config.*; + + public class Incrementer { + + + public static void main(String[] args){ + int initData = 0; // dataの初期値 + int maxData = 10; // dataの最大値 + int nodeNum = 2; // 最終的なnodeの数 + char nodeBaseName = 'A'; + + // nodeの生成 + Config config = new Config(); + HazelcastInstance instance = Hazelcast.newHazelcastInstance(config); + + // 名前の生成とアウトプット + int memberSize = instance.getCluster().getMembers().size(); + String localName = String.valueOf((char)(nodeBaseName + memberSize - 1)); + String remoteName = String.valueOf((char)(nodeBaseName + memberSize % nodeNum)); + + System.out.println("local : " + localName); + System.out.println("remote : " + remoteName); + + // 自分と相手のデータ構造体Topicの作成, get + ITopic<Integer> localTopic = instance.getTopic(localName); + ITopic<Integer> remoteTopic = instance.getTopic(remoteName); + + // 自分のTopicはリッスンする. + localTopic.addMessageListener(message -> { + + // 送られてきたデータを受け取る + int data = message.getMessageObject(); + System.out.println("from : " + remoteTopic.getName()); + System.out.println("data : " + data); + + // maxDataに到達するまで, 相手にdata + 1を送り, 到達したら全てのnodeをshutdownする. + if(data < maxData) { + remoteTopic.publish(data + 1); + }else{ + //instance.getLifecycleService().terminate(); + Hazelcast.shutdownAll(); + } + }); + + // 相手のTopicにデータを送る. + remoteTopic.publish(initData); + } + + } +``` + + + +## 実行結果 + +``` +Node A + + local : A + remote : B + + Members {size:2, ver:2} [ + Member [10.10.10.167]:5701 - 30098b8c-ebaf-479a-85ed-6ff96389151a this + Member [10.10.10.167]:5702 - d7d30c33-ee10-43d8-aab4-b90f8a9fa513 + ] + + from : B + data : 0 + from : B + data : 2 + from : B + data : 4 + from : B + data : 6 + from : B + data : 8 + from : B + data : 10 + + +Node B + + Members {size:2, ver:2} [ + Member [10.10.10.167]:5701 - 30098b8c-ebaf-479a-85ed-6ff96389151a + Member [10.10.10.167]:5702 - d7d30c33-ee10-43d8-aab4-b90f8a9fa513 this + ] + + local : B + remote : A + from : A + data : 1 + from : A + data : 3 + from : A + data : 5 + from : A + data : 7 + from : A + data : 9 +``` + +## 2. ノード間でトポロジー(ツリーとかリングとか)を形成したいとき、それをサポートする機能はあるか? + +Q: ノード間でトポロジー(ツリーとかリングとか)を形成したいとき、それをサポートする機能はあるか? + +A: 読めてないけど解説はありました. + +http://docs.hazelcast.org/docs/latest-development/manual/html/Hazelcast_Overview/Hazelcast_Topology.html + +ただ, AliceのTopologyManagerみたいなものはなく, プログラムで指定するっぽい...多分. + +http://docs.hazelcast.org/docs/latest-development/manual/html/Setting_Up_Clusters/Creating_Cluster_Groups.html + +## 3. 送信するデータを圧縮したいとき、それをサポートする機能はあるか? + +Q: 送信するデータを圧縮したいとき、それをサポートする機能はあるか? + +A: あるっぽいです. + +https://blog.hazelcast.com/kryo-serializer/ + + +Kryoというシリアライズ + 圧縮をするフレームワーク? 的なものがJavaの外部フレームワークにあるらしく, それを用いるそうです. + + +## 参考サイト + +- [Message](https://hazelcast.org/use-cases/messaging/) +- [Map](http://docs.hazelcast.org/docs/latest/manual/html-single/) +- [Map Listener](http://docs.hazelcast.org/docs/latest-development/manual/html/Distributed_Events/Event_Listener_for_Members/Listening_for_Map_Events.html) +- [Kryo](http://d.hatena.ne.jp/Kazuhira/20150425/1429946795)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/software/KVM.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,118 @@ +# kvm + +## kvmとは +Linux上で仮想化環境を利用するためのソフトウェア。 +KVMはIntel社のIntel VTやAMD社のAMD-Vなどマイクロプロセッサの提供する仮想化支援機能を利用し、LinuxカーネルをVMMとして動作させる。その上で複数台のコンピュータを仮想的に動作させることができ、Linux自体を含む様々なOSを並列に動作させることができる。 + +## kvmでの差分ディスク管理 + +以下のコマンドを実行することでxmlファイルを作成することができる。 + +``` + % /usr/bin/qemu-kvm -name VMNAME -hda /media/fcs/student/e /e /IMAGENAME.qcow2 -m 2048 +``` + +- "VMNAME"がVM名、"IMAGENAME"がIMAGEファイル名となる。 +- "-m" オプションでメモリ容量の設定。この場合は2048MB +- "-hda" オプションでストレージとして与えるファイルの指定。 + +作成したファイルには必要に応じて以下の変更を加える。 +- type archの値を'i686'からx86_64に。 +- <driver name='qemu' type='qcow2'/>を<disk>〜</disk>間に追加。 +- <graphics type='vnc' port='5901' autoport='no' listen=''/>を<graphics type='vnc' port='5901' autoport='yes' listen='0.0.0.0'/>に変更。 + +既存の xml ファイルをコピーして、直接 xml を書き換えてしまってもよい。 +書き換える必要がある部分は、 +- name +- uuid +- source file +- mac address の4つ。 + +name にはVM名、uuid には uuidgen コマンドで生成されたもの、source file には使用するファイルのパス、mac address には他と被らないように適当な mac address を入れればいい。 + +### ethernetの設定 +ブリッジ接続の場合は、作成したxmlファイルにさらに変更を咥えなければならない。 +- interface typeの値を'ethernet'から'bridge'に変更。 + +### イメージファイルの作成 +QCOW2形式なら、最初に全容量を確保しないのでスペースを広く取らない。また、Copy on Writeが使えるのでイメージ本体には書き込まずに差分ファイルデータに書き込み、差分で管理することができる。 +以下のコマンドを実行することでQCOW形式のイメージファイルが作成される。 + +``` + % qemu-img create -b BASEIMAGE -f qcow2 IMAGE +``` + +- "-b"オプションでbase imageを指定しておくことで作成したイメージファイルには差分のみが書き込まれるようになる。BASEIMAGEにベースとするファイルのパスを指定する。 +- "-f"オプションでフォーマットの指定。ここでは前述したようにQCOW2。 +- IMAGEは作成するイメージファイル名。 + +### xmlファイルの登録 +作成したxmlファイルをvirshに登録する。このとき既にイメージファイルを作成しておく必要がある。登録は以下のコマンドを実行することで行える。 + +``` + % sudo virsh define XMLFILE +``` + +XMLFILEに登録するファイルのパスを指定する。また、登録されたxmlファイルは/etc/libvirt/qemu 以下にコピーされて管理されるため、登録後に元のxmlファイルに変更を加えても反映されない。編集方法については次の項にて示す。 + +### virsh +virshは他にも以下のような用途がある。 +- xmlファイルの編集 +``` + % sudo virsh edit VMNAME +``` +登録したxmlファイルの編集を行う。前述したとおり、これらのファイルは/etc/libvirt/qemu 以下に存在する。 + +- 起動 +``` + % sudo virsh start VMNAME +``` +指定したVMを起動する。 + +- 一覧の確認 +``` + % sudo virsh list --all +``` +登録したVMの一覧を表示する。 + +- VNCポートの確認 +``` + % sudo virsh vncdisplay VMNAME +``` +指定したVMのVNCポートを表示する。 + +- xmlファイルの確認 +``` + % sudo virsh dumpxml VMNAME +``` +指定したVMのxmlファイルの内容を表示する。 + +### kvm で linux kernel を debug する + +http://okinawadevops.github.io/2014/10/18/yosukeota/ + +- ie-virsh define 01 で指定されたディレクトリに qcow2 のイメージを置く +- ie-virsh start 01 で起動する +- ie-virsh vncdisplay 01 で表示された番号に5900を足したものがVNCポートになる +- defineのときに表示されたパスワードでVNCに接続する +- root でログインしてgrubを書き換えてコンソールログインできるようにする +- `/etc/default/grub` を編集する +- ie-virsh console 01 +- あるいはipv6でsshで接続する + +https://fedoraproject.org/wiki/Building_a_custom_kernel を見てkernelをコンパイルする +コンパイルしたディレクトリを手元にコピーする + +ie-virsh destroy 01 , ie-virsh undefine 01 で一度消してからie-virsh gdb-define 01 でデバッグ用にVMを定義する + +`ie-virsh start 01` で起動する +コピーしたソースディレクトリ上に移動し +``` + gdb vnlinux +``` +とする +``` +ie-virsh dumpxml 01 でデバッグポートを確認してgdbの中で + target remote :01234 +``` +01234はデバッグポート
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/software/KVM/ie-virsh.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,52 @@ +# ie-virsh + +- `virsh`のwrapperコマンド + + +# help + +```shell +$ie-virsh +ie-virsh 1.0 +AnaTofuZ <anatofuz@cr.ie.u-ryukyu.ac.jp> + +USAGE: + ie-virsh <SUBCOMMAND> + +FLAGS: + -h, --help Prints help information + -V, --version Prints version information + +SUBCOMMANDS: + console connect to the guest console + define define (but don't start) a domain from an template XML file + define-gdb define the domain in which the gdb port is opened from the template XML file + destroy destroy (stop) a domain + domiflist list all domain virtual interfaces + dominfo domain information + dumpxml domain information in XML + help Prints this message or the help of the given subcommand(s) + list list domains + shutdown gracefully shutdown a domain + start start a (previously defined) inactive domain + ttyconsole tty console + undefine undefine a domain + vncdisplay vncdisplay +``` + + +# list + +- 自分が作ったVMの状況が確認可能 + +# define + +- テンプレートxmlをもとにvmをdefineする + - 名前はなんでも良いが、prefixにlogin user nameが入る + - 例えば e155730 が `ie-virsh define anatofuz` とすると `e155730-anatofuz`というVMが作られる + +# start, dumpxmlなど +- vm名を指定する必要があるが、wrapperなので全部打つ必要がないようにしている + - `e155730-anatofuz` の場合は `ie-virsh start anatofuz` でいい +- vm名をフルで打っても問題ない +- 起動しているvmに対しての操作はidを指定しても問題ないようになっている \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/software/QEMU.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,75 @@ +# QEMU + +- What is QEMU? + +> QEMU is a generic and open source machine emulator and virtualizer. + +- qemu + +https://www.qemu.org/ + +## debug buildの参考になりそう + +- brewでのビルド設定 + - `$brew cat qemu` + +- 検索したら出てきたweb page + - https://www.cnblogs.com/root-wang/p/8005212.html + +## mac osでのビルド時に必要になりそうなパッケージ +``` + "libtool" => :build + "pkg-config" => :build + "glib" + "gnutls" + "jpeg" + "libpng" + "libssh2" + "libusb" + "ncurses" + "pixman" + "vde" +``` + +## linuxでのdebug build + +- https://www.cnblogs.com/root-wang/p/8005212.html が参考になりそう + +``` + ./configure --target-list=i386-softmmu,x86_64-softmmu,arm-softmmu,arm-linux-user --enable-kvm --enable-debug --prefix=$HOME/build/qemu +``` + +## debug時のおすすめ + + (gdb) b disas_arm_insn + Breakpoint 2 at 0x555555691c55: file /home/syster_clown/src/qemu-4.0.0/target/arm/translate.c, line 9180. + (gdb) r + Starting program: /home/syster_clown/build/qemu/bin/qemu-arm ../localhost/sample-32 + [Thread debugging using libthread_db enabled] + Using host libthread_db library "/lib64/libthread_db.so.1". + [New Thread 0x7ffff7acf700 (LWP 1981)] + Thread 1 "qemu-arm" hit Breakpoint 2, disas_arm_insn (s=0x7fffffffd3e0, insn=3852271616) + at /home/syster_clown/src/qemu-4.0.0/target/arm/translate.c:9180 + 9180 if (arm_dc_feature(s, ARM_FEATURE_M)) { + (gdb) bt + #0 disas_arm_insn (s=0x7fffffffd3e0, insn=3852271616) at /home/syster_clown/src/qemu-4.0.0/target/arm/translate.c:9180 + #1 0x000055555569cc7b in arm_tr_translate_insn (dcbase=0x7fffffffd3e0, cpu=0x555557a94f30) + at /home/syster_clown/src/qemu-4.0.0/target/arm/translate.c:13483 + #2 0x00005555556200eb in translator_loop (ops=0x5555559d8ba0 <arm_translator_ops>, db=0x7fffffffd3e0, cpu=0x555557a94f30, + tb=0x555555a77040 <static_code_gen_buffer+2272>) at /home/syster_clown/src/qemu-4.0.0/accel/tcg/translator.c:107 + #3 0x000055555569d3e4 in gen_intermediate_code (cpu=0x555557a94f30, tb=0x555555a77040 <static_code_gen_buffer+2272>) + at /home/syster_clown/src/qemu-4.0.0/target/arm/translate.c:13772 + #4 0x000055555561e699 in tb_gen_code (cpu=0x555557a94f30, pc=415056, cs_base=0, flags=128, cflags=-16777216) + at /home/syster_clown/src/qemu-4.0.0/accel/tcg/translate-all.c:1723 + #5 0x000055555561bbbe in tb_find (cpu=0x555557a94f30, last_tb=0x0, tb_exit=0, cf_mask=0) + at /home/syster_clown/src/qemu-4.0.0/accel/tcg/cpu-exec.c:407 + #6 0x000055555561c328 in cpu_exec (cpu=0x555557a94f30) at /home/syster_clown/src/qemu-4.0.0/accel/tcg/cpu-exec.c:728 + #7 0x000055555565bcf6 in cpu_loop (env=0x555557a9d1f0) at /home/syster_clown/src/qemu-4.0.0/linux-user/arm/cpu_loop.c:218 + #8 0x000055555562a725 in main (argc=2, argv=0x7fffffffdea8, envp=0x7fffffffdec0) + at /home/syster_clown/src/qemu-4.0.0/linux-user/main.c:819 + +## qemu よみ + +- armの命令のエミュレータを読むには qemu-arm をトレースしていく +- 内部で中間表現を生成している +- 中間形式はTCG(Tiny Code Generator )と呼ばれる
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/software/SDL.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,45 @@ +# About SDL (Simple Direct Media Layer) + +SDL's homepage is [[here:http://www.libsdl.org/index.php]] + +Simple Direct media Layer の略だそうです. +フリーの multimedia library としては有名で、 +エミュレータなどがこれで開発されているようです。 +昔は2D 専用だったようですが、今は OpenGL (mesa)をサポートします。 + +# About study of SDL + +SDL を勉強するなら [[SLD本家:http://www.libsdl.org/index.php]]の +Documentationの[[Doc Project:http://sdldoc.csn.ul.ie/]]が役に立ちます。 + +章の構成は、まずソースコードの一部分づつを挙げ、それについて解説し、 +章の最後で全体のソースを紹介し解説しています。手取り足取りという感じで +英語も非常に分かりやすいレベルでかかれています。 + +[[Doc Project:http://sdldoc.csn.ul.ie/]] は 同ページのDownload の項目 +を探せば tar書庫が 手に入ります。 + +# Example + +CVS repository for applications using SDL is... + +``` + Game_project/sdl/... +``` + +If you running a browser on a PC in C.R. lab, you can access C.R. CVS repository +at [[here:http://www.cr.ie.u-ryukyu.ac.jp/internal/viewcvs.cgi/]]. + +# Compile (Mac OS X) + +[[ここ:http://www.libsdl.org/index.php]]からSource Code を入手し、展開されたディレクリに移動して以下のコマンドを実行したらできます。 + +``` + cofigure + make + sudo make install +``` + +もしmake でエラーが出た場合はX11 が正しくinstall されていない可能性があるので、X11 を入れなおすかMakefile のPATH を書き換える必要があります。 + +# include(SDL関連リンク)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/software/SML.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,76 @@ +# SML#をMacにインストールした時のメモ + +## SML#とは +SML#は東北大学天気通信研究所が開発を進めているプログラミング言語。 + +SML#ではStandard MLとの後方互換性, C言事の直接連携, マルチコアCPU上のネイティブスレッドサポートなどの特徴があるプログラミング言語。バックエンドにLLVMを使用している。 + +[SML#ホームページ](http://www.pllab.riec.tohoku.ac.jp/smlsharp/ja/) + +## SML#のインストール + +SML#のインストールには 32bitのGMP(https://gmplib.org )とLLVM3.4(http://llvm.org/releases )が必要 + +### GMPの32bit版インストール +``` + % ./configure ABI=32 --prefix=インストール先 + % make -j + % make install +``` + +既存のGMPライブラリとの衝突を防ぐために --prefix オプションをつけると良い. + +### LLVM3.4の32bit版インストール +configure時に + +``` + % ./configure CC='gcc -m32' CXX='g++ -m32' ..... +``` + +とつけるそれ以外は基本的に[[LLVM]] を参照 + +### SML#のインストール +ソースは公式ホームページに公開している([ダウンロード先](http://www.pllab.riec.tohoku.ac.jp/smlsharp/ja/?Download)) +``` + % ./configure CC='gcc -m32' CXX='g++ -m32' LD='ld -m elf_i386' LDFLAG="-L/インストールしたGMPのlibへのPATH" --prefix= + % make -j + % make install +``` + +でprefix先に bin, libが出来る + +``` + % prefix/bin/smlsharp +``` +でsml#の対話モードが立ち上がる + +``` + % prefix/bin/smlsharp example.sml +``` +でsml#プログラムをコンパイルできる + +## lldbで追う(Cで書かれている部分だけ) +SML#のコンパイラはSML#で書かれているため、lldbでは追うことができない。 + +ランタイムLibraryはCで書かれているためそれは追うことが可能。 + +``` + % lldb prefix/bin/smlsharp int.sml + (lldb) target create "../build/bin/smlsharp" + maiCurrent executable set to '../build/bin/smlsharp' (i386). + (lldb) settings set -- target.run-args "int.sml" + (lldb) b main + Breakpoint 1: where = smlsharp`main + 12 at main.c:16, address = 0x0000270c + (lldb) r + Process 1939 launched: '../build/bin/smlsharp' (i386) + Process 1939 stopped + * thread #1: tid = 0x1dcb20, 0x0000270c smlsharp`main(argc=2, argv=0xbffff9fc) + 12 at main.c:16, queue = 'com.apple.main-thread', stop reason = breakpoint 1.1 + frame #0: 0x0000270c smlsharp`main(argc=2, argv=0xbffff9fc) + 12 at main.c:16 + 13 int + 14 main(int argc, char **argv) + 15 { + - > 16 sml_init(argc, argv); + 17 _SMLmain(); + 18 sml_finish(); + 19 return 0; +```
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/software/Torque.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,313 @@ +# Torque +## Torqueとは +Torqueは、Job Schedulerである。Job Schedulerは、クラスターに次々と投入されるジョブを、キューなどを用い、スケジューリングを行って管理してくれる。 +クラスターを利用して、実験を行う際には、Job Schedulerを用いる必要がある。 +それは、他のクラスターユーザーが存在する場合に、同時に別スレッドで処理を実行してしまうならば、CPUなどのリソースを取り合うことになるため、台数効果などの実験結果が正確に得られないからである。 + +まず、[Torqueのインストール](./install)をする。 +それでは、Torqueの使い方を見てみよう。 + +## Torqueがインストールされたserverにログインする + +``` +ssh ie-user@tino-vm1.ads.ie.u-ryukyu.ac.jp +``` + +このvmはシス管か, 誰かに頼んで上げてもらう(自分のときは名嘉村研の先輩に頼みました + +## queueの作成(サーバー側) +テストとして"tqueue"という名前のqueueを作る。 +``` + Qmgr: create queue tqueue queue_type = execution + Qmgr: set queue tqueue enabled = true + Qmgr: set queue tqueue started = true + Qmgr: set server default_queue = tqueue + Qmgr: set server scheduling = true + Qmgr: set queue tqueue resources_max.ncpus = 2 + Qmgr: set queue tqueue resources_max.nodes = 2 +``` +各コマンドの意味を以下に示す。 +- create queue <queue名> queue_type = <queueのタイプ> + - 指定された名前、タイプのqueueを作成する。 + - タイプはE,executionを指定するとexecution queueになりR,routeを指定するとrouting queueとなる。 +- set queue <queue名> <Attributes> + - 指定したqueueの指定したAttributesを設定する。 +例で設定したAttributesについて +- enabled = <true or false> + - trueにすると新しいjobを受け付ける。 +- started = <true or false> + - trueにするとqueueの中のjobの実行を許可する。 +- resources_max.ncpus = <cpu数> + - queueに割り当てるcpu数を設定する。 +- resources_max.nodes = <node数> + - queueに割り当てるnode数を設定する。 +- set server <Attributes> + - 指定したqueueの指定したAttributesを設定する。 +例で設定したAttributesについて +- default_queue = <queue名> + - 指定したqueueをデフォルトqueueとする。 +- scheduling = <true or false> + - Schedulingを可能にする。 + +ここまでの設定の確認を行う。 + +``` + Qmgr: print server +``` +これでサーバーの設定が確認できる。作成したqueueが表示されればうまくいっている。また、以下のコマンドqueueの確認ができる。 + +``` + Qmgr: list queue <queue名> +``` + +### 設定の保存 +以下のようにリダイレクトして保存する。 + +``` + # echo "p s" | <torqueのインストール先>/bin/qmgr > <ファイル名> +``` + +次回以降はこのファイルを与えることで設定が楽になる。 + +ファイルの与え方もリダイレクト + # <torqueのインストール先>/bin/qmgr < <ファイル名> + +#Torque チュートリアル + + +##Torqueを使用する前に +Torqueは、naha.ie.u-ryukyu.ac.jp上で使用することができる。 +実験を行うためには、パスワードを使用せずにsshできるように、鍵認証の設定を行わなくてはならない。しかし、mauiユーザーでは既に設定が行われているため、Torqueをすぐに使用することができるようになっている。 + + % ssh ie-user@tino-vm1.ads.ie.u-ryukyu.ac.jp + +尚、パスワードはサーバー班が管理しているので、サーバー班から教えてもらうことができる。 + +ログインすると、ホームディレクトリにProjectフォルダがあるので、その中に自分の学籍番号のフォルダを作成し、その中で作業を行うようにする。 + + % mkdir student/eXX57XX + % cd student/eXX57XX + +追記 +ただし, Projectフォルダは分散環境上で共有されていないため, ファイルを共有したい場合は /mnt/data/* の中にworkspaceを作り, その中で作業を行うのが望ましい. + + +##Torque上でジョブを実行する +###ジョブを実行するための準備 +jobs.shを作成する。 + +- jobs.sh + #!/bin/sh + echo hello + hostname + +###ジョブの実行 +Torqueのジョブは、qsubコマンドによって投入される。 + % qsub jobs.sh +このように実行すると、1台のクラスターでのみ処理が行なわれる。 + +###ジョブの実行結果 +スクリプトの実行が終わると、jobs.sh.oXXX, jobs.sh.eXXXという2つのファイルが生成される。XXXは、Torqueによって割り振られたジョブ番号である。 +ファイルにはそれぞれ、標準出力と、標準エラー出力の内容が出力されている。 + + % cat jobs.sh.oXXX + hello + cls001.cs.ie.u-ryukyu.ac.jp + +###複数のノードを用いた実験 +また10台で実験を行うには次のように、実行すれば良い。 + + % qsub -l nodes=10 jobs.sh + % cat jobs.sh.oXXX + hello + cls010.cs.ie.u-ryukyu.ac.jp + +10台のノードを指定しても、実際には10台が使用可能になっただけであり、10台で実行された訳ではない。 +このcls010.csは、親ノードである。この親ノード(cls010.cs)から、他のノード(cls001-cls009)に対して、命令を行うようにプログラミングする必要がある。 + +例えば、以下のような処理を行う必要がある。 + +- jobs.sh + #!/bin/sh + #PBS -N ExampleJob + #PBS -l nodes=10,walltime=00:01:00 + for serv in `cat $PBS_NODEFILE` + do + ssh $serv hostname & + done + wait + +#PBSを用いてコメントをつけると、その部分が、qsubコマンドのオプションとして認識される。 +- -N: ExampleJob.oXXXのように、ジョブに名前を付けることができるようになる。 +- -l: ジョブのオプション。nodes=ノード数、walltime=処理制限時間のように設定できる。 + +親ノードのシェルには、$PBS_NODEFILEという、環境変数が準備されている。 + +- (例) + % echo $PBS_NODEFILE + /var/spool/torque/aux/XXX.naha.ie.u-ryukyu.ac.jp + % cat $PBS_NODEFILE + cls010.cs.ie.u-ryukyu.ac.jp + cls009.cs.ie.u-ryukyu.ac.jp + ...(略)... + cls001.cs.ie.u-ryukyu.ac.jp + +$PBS_NODEFILEの先頭行のホストが親ノードである。 + +このスクリプトを実行してみると、以下のようになった。 + + % qsub jobs.sh + % cat ExampleJob.oXXX + cls003.cs.ie.u-ryukyu.ac.jp + cls009.cs.ie.u-ryukyu.ac.jp + cls008.cs.ie.u-ryukyu.ac.jp + cls010.cs.ie.u-ryukyu.ac.jp + cls007.cs.ie.u-ryukyu.ac.jp + cls006.cs.ie.u-ryukyu.ac.jp + cls004.cs.ie.u-ryukyu.ac.jp + cls005.cs.ie.u-ryukyu.ac.jp + cls002.cs.ie.u-ryukyu.ac.jp + cls001.cs.ie.u-ryukyu.ac.jp + +このように、10台のノードで、hostnameコマンドを実行した結果が表示されていることが分かる。 +これらの他に、mpiを用いて、他のノードにジョブを割り振ることもできる。 + +##1ノード2CPUを用いた実験方法 +クラスターはCoreDuoを搭載しているため、CPUを2つまで使用することができる。つまり、1ノードで、2つの処理を行なうことができる。 +その場合は、以下のように実行する。 + % qsub -l nodes=10:ppn=2 jobs.sh +この場合、$PBS_NODEFILEには、同じホストが2つずつ登録されていることになる。 + +##1ジョブでマルチタスクの実行 +また、1つのジョブで、複数の同じタスクを実行することもできる。 +その場合は、以下のように実行する。 + % qsub -t 1-3 -l nodes=10 jobs.sh +この場合、出力結果も3つのタスクごとに出力される。 + +&ref(torque_qsub.png); + +##その他、便利なコマンド +- jobs.sh + #!/bin/sh + #PBS -N ExampleJob + #PBS -l nodes=1,walltime=00:01:00 + sleep 10 + echo hello + + % qsub jobs.sh +sleepを行って、ジョブを長引かせてテストする。 + % qstat + Job id Name User Time Use S Queue +___ + XXX.naha ExampleJob maui 0 R batch + +このように、ジョブの状態を確認することができる。 + +##Error 対処メモ +Nodeの数を4 9台に設定するとなぜかjobがうまく動かない。以下のようなエラーがでる。 + qsub: Job exceeds queue resource limits MSG=cannot satisfy queue max nodes requirement + +対処法はNodeの数の設定時に、一桁だった場合は 05 といったように0をつけることで解決する。 + % qsub -l nodes=05 test.sh + +全体で登録しているNodeの数が二桁になるとこうする必要がある。 +また、Nodeの数を間違っていなくても、上のエラーがでるときがある。その時は今使っているqueueの設定をみる。 + % qmgr -c "p s" + : + create queue cqueue + set queue cqueue queue_type = Execution + set queue cqueue resources_max.ncpus = 184 + set queue cqueue resources_max.nodes = 46 + set queue cqueue enabled = True + set queue cqueue started = True + +ncpus の値やnodesの値を確認する。resource_max.nodes でなく、 resource_max.nodect も設定したほうがいいかもしれない。 + % sudo qmgr + set queue cqueue resources_max.nodect = 46 + + +##crとcsの両方のtorqueクラスタを1つで使う +crで作成したtorqueのクラスタをcsの方でまとめて使うための方法。 + +以下の2つの設定変更により行える +- クライアント側のserver_nameファイルとconfigファイルをmass00.cs(親)の設定に変更する。 +- 親のtorqueのnodesの設定にcrのクラスタの情報を付け加える。 + +上記の変更をpbsをstopさせて変更を行う。 + % sudo /etc/init.d/torque stop +###クライアント側のserver_nameファイルとconfigファイルをmass00.cs(親)の設定に変更する +変更するファイルは以下の2つ + /var/spool/torque/server_name + /var/spool/torque/mom_priv/config +それぞれの中身をみてみる + mass01(cr) % cat /var/spool/torque/server_name + mass00.cr.ie.u-ryukyu.ac.jp + mass01(cr) % cat /var/spool/torque/mom_priv/config + $logevent 0x1fff + $max_load 1.2 + $ideal_load 1.0 + $pbsserver mass00.cr.ie.u-ryukyu.ac.jp + $restricted mass00.cr.ie.u-ryukyu.ac.jp% +上記のmass00.crをmass.csに変更すればよい + +###親のtorqueのnodesの設定にcrのクラスタの情報を付け加える +変更するファイルは以下のもの + /var/spool/torque/server_priv/nodes + +中にはクライアントとなるサーバのドメインと使用するcpuの数の記述がある。 + % sudo cat /var/spool/torque/server_priv/nodes + mass02.cs.ie.u-ryukyu.ac.jp np=4 + mass03.cs.ie.u-ryukyu.ac.jp np=4 + mass04.cs.ie.u-ryukyu.ac.jp np=4 + :略 + mass46.cs.ie.u-ryukyu.ac.jp np=4 + mass47.cs.ie.u-ryukyu.ac.jp np=4 + +これにmass01.cr.ie.u-ryukyu.ac.jp といったcr側のクライアントの情報を追加してあげればよい。 + +設定が終わったら + % sudo /etc/init.d/torque start +をして起動させる。 +クライアント全部を手作業でやるのは面倒臭いのでcapistrano を使ってください。 + +## workspaceの作り方 +### 力技(rootのゴリ押し) + +例えばie-user@tino-vm1.ads.ie.u-ryukyu.ac.jp で + mkdir /mnt/data/fuga + +と作成しようとしてもPermmision Errorになる. また, rootで作成しても + sudo mkdir /mnt/data/fuga + ls -l /mnt/data + 合計 48 + ... + drwxr-xr-x 2 ie-user ie-user 4096 8月 9 2016 examples + drwxr-xr-x 2 nfsnobody nfsnobody 6 1月 24 06:08 fuga + ... + +となり, usernameとgroupが違うため, 他のvmがfugaにアクセスできない. (そもそも, このvmでもsudoがないとファイルが書き込めないはず. + +このファイルを管理しているのはtino-vm2の方なので, そこにアクセスしてファイル権限を書き換える + ssh tino-vm2.ads.ie.u-ryukyu.ac.jp + # /exports/data がmountされていたため, この中のfugaを変える + sudo chown -R ie-user:ie-user /exports/data/fuga + exit + +その後ファイルを見てみると書き換わっている + ls -l /mnt/data + 合計 48 + ... + drwxr-xr-x 2 ie-user ie-user 4096 8月 9 2016 examples + drwxr-xr-x 2 ie-user ie-user 6 1月 24 06:08 fuga + ... + +ただゴリ押しなので他の方法もあるかも. (というか普通は管理者に言うべきなんだろうなぁ.... + +## Christie用メモ +@tinovm1:/mnt/data/christie-workspace/の中で作業を行う。 +christieを更新した際はjarファイルを置き換えること。(Jenkinsで自動化できるらしい。) + + + +## 参考文献 +http://docs.adaptivecomputing.com/torque/6-1-2/adminGuide/torque.htm#topics/torque/0-intro/introduction.htm%3FTocPath%3DChapter%25201%253A%2520Introduction%7C_____0
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/software/Torque/install.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,82 @@ +## Torqueとは +Torqueは、Job Schedulerである。Job Schedulerは、クラスターに次々と投入されるジョブを、キューなどを用い、スケジューリングを行って管理してくれる。 +クラスターを利用して、実験を行う際には、Job Schedulerを用いる必要がある。 +それは、他のクラスターユーザーが存在する場合に、同時に別スレッドで処理を実行してしまうならば、CPUなどのリソースを取り合うことになるため、台数効果などの実験結果が正確に得られないからである。 + +それでは、Torqueの使い方を見てみよう。 + +# Torqueの設定 +以下のチュートリアルに進む前にTorqueの設定方法について学び、設定する必要がある。 +マシンの準備は[[kvm]]を参考に差分ディスク管理で作成するといいかも。 + +## インストール +ソースからインストールする方法を紹介する。(yum等でもインストールすることは可能だけれど)。 +まずはダウンロード(公式 http://www.adaptivecomputing.com/ を参考に最新版を取得すること!) +``` + # wget http://adaptive.wpengine.com/resources/downloads/torque/torque-4.2.0.tar.gz +``` +解凍 +``` + # tar zxvf torque-4.2.0.tar.gz +``` +インストール +``` + # cd torque-4.2.0 + # ./configure --prefix=<インストール先> --with-default-server=<管理サーバ> --with-server-home=<設定ファイルの保存先> + # make && make install +``` +- torqueはデフォルトではscpを用いるが、rcpを用いたい時には configureを実行する時点で --with-rcpオプションを指定し、`=<rcpの場所>`としなければならない。 +## ポートの設定 +Torqueが使用するポートについて/etc/servicesに記述する。以下に記述例を示す。 +``` + pbs 15001/tcp # pbs_server + pbs_mom 15002/tcp # mom to/from server + pbs_resmom 15003/tcp # mom resource management requests + pbs_resmom 15003/udp # mom resource management requests + pbs_sched 15004/tcp # scheduler +``` + +ここまで完了したら一度以下のコマンドを実行してデータベースの初期化を行う。実行するとpbs_serverがデーモンプロセスとして実行され、qmgrを実行することで設定が行えるようになる。 +``` + # <インストールした場所>/sbin/pbs_server -t create +qmgrを実行すると以下のような表示がでる。 + # <インストールした場所>/bin/qmgr + Max open servers: 4 + Qmgr: +``` + +## スケジューラの設定(サーバー側) +スケジューラの設定は$Torque/sched_priv/sched_configで行える。デフォルトではFIFOスケージューら。 + +## 設定の反映(サーバー側) +サーバーとスケジューラの設定を反映させるために一度pbs_serverを停止させなければならない。 +``` + # killall pbs_server +``` + +## ノードファイルの作成(サーバー側) +先ほど作成したスクリプトから実行する。 +``` + # /etc/rc.d/init.d/torque start +``` +## パスを通す +.zshrcなどに以下のように記述する。 +``` + PATH=<インストールした場所>/bin:$PATH +``` + + +## エラーについて +### Head側からnodeが見えてないエラー +/var/spool/torque/mom_logs にエラーの詳細が記される。(例えば以下のような) +``` + 02/11/2013 20:29:24;0002;   pbs_mom;Svr;pbs_mom;Torque Mom Version = 2.5.5, loglevel = 0 + 02/11/2013 20:29:24;0001;   pbs_mom;Svr;pbs_mom;LOG_ERROR::Operation not permitted (1) in chk_file_sec, Security violation with "config" - config is not owned by admin user + 02/11/2013 20:29:24;0002;   pbs_mom;Svr;read_config;ALERT:  cannot open config file - permissions + 02/11/2013 20:29:24;0002;   pbs_mom;Svr;setpbsserver;mass00.cr.ie.u-ryukyu.ac.jp +``` +このなかの +``` + LOG_ERROR::Operation not permitted (1) in chk_file_sec, Security violation with "config" - config is not owned by admin user +``` +がエラーを示す一文となっており、configファイルの所有者にadmin権限が無いことが原因となっていることがわかる。(このときはrootにしておかなければならないものをmassとしていた。)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/software/WebGL.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,32 @@ +# WebGLとは +困った時のwikipedia: +[[wikipedia-WebGL:http://ja.wikipedia.org/wiki/WebGL]] + +# WebGLを使うために +まずブラウザは、WebKitかChromiumを使う。 + +Chromiumの方はWindows/Linux版もあるらしいけど、個人的にはWebKitをオススメ + +以下手順を簡単にメモ + +- WebKit + - [[WebKitのダウンロード:http://webkit.org/]]とインストール + - インストール後、Terminalで以下のコマンドを入力 +``` + $ defaults write com.apple.Safari WebKitWebGLEnabled -bool YES +``` + - 参考サイト:[[マイコミジャーナル:http://journal.mycom.co.jp/articles/2009/10/22/webkit_webgl/001.html]] + +- Chromium + - Chromiumのダウンロードとインストール + - インストール後、Terminalで以下のコマンドを実行 +``` + $chromium --no-sandbox --enable-webgl +``` + - 参考サイト:[[WebOS Goodies:http://webos-goodies.jp/archives/getting_started_with_webgl.html]] + +WebGLの動作確認として以下のサイトへアクセス + +[[Earth.html:https://cvs.khronos.org/svn/repos/registry/trunk/public/webgl/sdk/demos/webkit/Earth.html]] + +地球と火星が回っていれば動作確認完了
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/software/gdb/how_to/43B8C054697073.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,145 @@ +# デバッグの手法 +私が使っているデバッグの手法を紹介します。 + +## gdbを使ってみる +### gdbの紹介 + +gdbは The GNU Debuggerです。C言プログラムをgdbの上で走らせ、 +特定の箇所で止めて周辺の値を調べたり、プログラムがどの辺りで止まったかを詳しくレポートさせたりします。 + +MacやLinuxには元から入っていますので、何もインストールする必要はありません。 +難しく考えるかもしれませんが、要はプログラムを好きな場所で止めたり、 +値を好きなように変更してみたり、もしくはプログラムの変数の中身を出力してみたりするだけです。 + +ただこれだけでも立派なデバッグ作業なのです。 +使い慣れるとgdb無しではプログラムしたくなくなります。 + +### gdbを使う前に + +gdbを使うには、実行ファイルにgdbに必要なデバッグ情報を付加してあげる必要があります。 +デバッグ情報を付加するにはccに-gオプションを付けます。 +では実際に試してみます。&ref(hello_gdb.c); +を適当なディレクトリに保存してコンパイルします。 + +``` + cc hello_gdb.c -g +``` + + -gオプションでコンパイルするといつものようにa.outが出力されます。 +下準備はこれで終わりですが、a.outを実行するとエラーがでます。 + + セグメントエラー + +...これはなんでしょう? + + +### gdbでよく使うコマンド + +- プログラムの実行 + +プログラムを実行するには run コマンドを使います。プログラムに引数 `<option>` があれば後に付けることができます。 + +``` + (gdb) run <option> +``` + +プログラムを(breakなどを用いて)一時停止し、再開するときには continue を使います。 + +``` + (gdb) continue +``` + +一時停止したプログラムを一行だけ実行することもできます。step と next の二つがありますが、step は関数を呼び出すときにその関数内も一行づつ実行し、next は関数内には入りません。 + +``` + (gdb) step + (gdb) next +``` + +- ブレークポイント + +プログラムを一時停止したい場合はブレークポイントを設けます。関数 `<function_name>` にブレークポイントを設けるには以下のように break コマンドを使います。関数 `<function_name>` が呼ばれると `<function_name>` の最初の行でプログラムが一時停止します。また、ファイル名`<file>` を指定したい場合は `<file>`:`<function_name>` のようにコロンを挟んで指定します。 + +``` + (gdb) break <function_name> + (gdb) break <file>:<function_name> +``` + +プログラム中の全関数を見たい場合は以下のコマンドを実行します。 + +``` + (gdb) info functions +``` + +関数名ではなく、行番号 `<line_num>` を指定することもできます。方法は関数名と同じです。 + +``` + (gdb) break <line_num> + (gdb) break <file>:<line_num> +``` + +ブレークポイントの一覧が見たい場合は以下のコマンドを使います。 + +``` + (gdb) info breakpoints +``` + +ブレークポイントの削除には delete を使います。`<break_number>` は info breakpoints で確認できる、ブレークポイントの番号です。 + +``` + (gdb) delete <break_number> +``` + +- 表示 + +実行中のプログラムの変数を見たい場合は print を使います。 +print は変数 `<variable>` やポインタが指す先の値 `*<pointer>`,式 `<expression>`などを表示することができます。 + +``` + (gdb) print <variable> + (gdb) print *<pointer> + (gdb) print <expression> +``` + +実行しているプログラムのソースコードを表示するには list を使います。引数を与えないと現在実行している行周辺を表示します。関数 `<function>` を与えるとその関数を、行番号 `<line_number>` を与えるとその行番号周辺のソースコードを表示します。 + +``` + (gdb) list + (gdb) list <function> + (gdb) list <line_number> +``` + +通常は10行づつ表示しますが、以下のように set を用いて `<number>` 行づつ表示できるように変更できます。 + +``` + (gdb) set listsize <number> +``` + +- スタック・フレーム + +現在実行している関数がどのようにして呼ばれたかを知りたい場合は where か backtrace を使います。 + +``` + (gdb) where +``` + +where はスタックに詰まれた関数の層を表示します。この層の一つ一つをフレームといいます。現在プログラムが実行しているフレームを見るには frame を使います。frame に引数として各フレームに割り当てられている番号 `<f_number>` (whereで確認できる)を指定すると、そのフレームへ移動します。 + +``` + (gdb) frame + (gdb) frame <f_number> +``` + +層になっているフレームは up と down を使うことで、上または下方向へ移動できます。引数として数字 `<number>` を与えると `<number>` 個分移動します。 + +``` + (gdb) up <number> + (gdb) dowm <number> +``` + + +### 参考文献 + +本ページは以下のページを参考にしました。より詳しくGDBを知りたい方は一読することをお推めします。 + +[[Debugging with GDB:http://www.asahi-net.or.jp/ wg5k-ickw/html/online/gdb-5.0/gdb-ja_toc.html]]
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/software/hg.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,3 @@ +# hg + +- mercurial \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/software/hg/hgignore_templates.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,384 @@ +# hgignore templates + +- mercurialでむしるファイルを設定できるhgignoreのテンプレート集 + - なんかコピペしてつかってください + +# LaTeX + +``` +syntax:glob + +# Created by https://www.gitignore.io/api/latex +# Edit at https://www.gitignore.io/?templates=latex + +### LaTeX ### +## Core latex/pdflatex auxiliary files: +*.aux +*.lof +*.log +*.lot +*.fls +*.out +*.toc +*.fmt +*.fot +*.cb +*.cb2 +.*.lb + +## Intermediate documents: +*.dvi +*.xdv +*-converted-to.* +# these rules might exclude image files for figures etc. +# *.ps +# *.eps +# *.pdf + +## Generated if empty string is given at "Please type another file name for output:" +.pdf + +## Bibliography auxiliary files (bibtex/biblatex/biber): +*.bbl +*.bcf +*.blg +*-blx.aux +*-blx.bib +*.run.xml + +## Build tool auxiliary files: +*.fdb_latexmk +*.synctex +*.synctex(busy) +*.synctex.gz +*.synctex.gz(busy) +*.pdfsync + +## Build tool directories for auxiliary files +# latexrun +latex.out/ + +## Auxiliary and intermediate files from other packages: +# algorithms +*.alg +*.loa + +# achemso +acs-*.bib + +# amsthm +*.thm + +# beamer +*.nav +*.pre +*.snm +*.vrb + +# changes +*.soc + +# comment +*.cut + +# cprotect +*.cpt + +# elsarticle (documentclass of Elsevier journals) +*.spl + +# endnotes +*.ent + +# fixme +*.lox + +# feynmf/feynmp +*.mf +*.mp +*.t[1-9] +*.t[1-9][0-9] +*.tfm + +#(r)(e)ledmac/(r)(e)ledpar +*.end +*.?end +*.[1-9] +*.[1-9][0-9] +*.[1-9][0-9][0-9] +*.[1-9]R +*.[1-9][0-9]R +*.[1-9][0-9][0-9]R +*.eledsec[1-9] +*.eledsec[1-9]R +*.eledsec[1-9][0-9] +*.eledsec[1-9][0-9]R +*.eledsec[1-9][0-9][0-9] +*.eledsec[1-9][0-9][0-9]R + +# glossaries +*.acn +*.acr +*.glg +*.glo +*.gls +*.glsdefs + +# uncomment this for glossaries-extra (will ignore makeindex's style files!) +# *.ist + +# gnuplottex +*-gnuplottex-* + +# gregoriotex +*.gaux +*.gtex + +# htlatex +*.4ct +*.4tc +*.idv +*.lg +*.trc +*.xref + +# hyperref +*.brf + +# knitr +*-concordance.tex +# TODO Comment the next line if you want to keep your tikz graphics files +*.tikz +*-tikzDictionary + +# listings +*.lol + +# luatexja-ruby +*.ltjruby + +# makeidx +*.idx +*.ilg +*.ind + +# minitoc +*.maf +*.mlf +*.mlt +*.mtc[0-9]* +*.slf[0-9]* +*.slt[0-9]* +*.stc[0-9]* + +# minted +_minted* +*.pyg + +# morewrites +*.mw + +# nomencl +*.nlg +*.nlo +*.nls + +# pax +*.pax + +# pdfpcnotes +*.pdfpc + +# sagetex +*.sagetex.sage +*.sagetex.py +*.sagetex.scmd + +# scrwfile +*.wrt + +# sympy +*.sout +*.sympy +sympy-plots-for-*.tex/ + +# pdfcomment +*.upa +*.upb + +# pythontex +*.pytxcode +pythontex-files-*/ + +# tcolorbox +*.listing + +# thmtools +*.loe + +# TikZ & PGF +*.dpth +*.md5 +*.auxlock + +# todonotes +*.tdo + +# vhistory +*.hst +*.ver + +# easy-todo +*.lod + +# xcolor +*.xcp + +# xmpincl +*.xmpi + +# xindy +*.xdy + +# xypic precompiled matrices +*.xyc + +# endfloat +*.ttt +*.fff + +# Latexian +TSWLatexianTemp* + +## Editors: +# WinEdt +*.bak +*.sav + +# Texpad +.texpadtmp + +# LyX +*.lyx~ + +# Kile +*.backup + +# KBibTeX +*~[0-9]* + +# auto folder when using emacs and auctex +./auto/* +*.el + +# expex forward references with \gathertags +*-tags.tex + +# standalone packages +*.sta + +### LaTeX Patch ### +# glossaries +*.glstex + +# End of https://www.gitignore.io/api/latex + + +# Created by https://www.gitignore.io/api/node +# Edit at https://www.gitignore.io/?templates=node + +### Node ### +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* + +# Diagnostic reports (https://nodejs.org/api/report.html) +report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage +*.lcov + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# TypeScript v1 declaration files +typings/ + +# TypeScript cache +*.tsbuildinfo + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variables file +.env +.env.test + +# parcel-bundler cache (https://parceljs.org/) +.cache + +# next.js build output +.next + +# nuxt.js build output +.nuxt + +# react / gatsby +public/ + +# vuepress build output +.vuepress/dist + +# Serverless directories +.serverless/ + +# FuseBox cache +.fusebox/ + +# DynamoDB Local files +.dynamodb/ + +# End of https://www.gitignore.io/api/node +``` \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/software/pypy.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,359 @@ +# コンパイラ構成論ソース読み会 〜pypy〜 + +## インストール + +- 公式ホームページ(http://pypy.org/download.html#installing)を参考に。 + - hg clone で落としてくる。 + - `$ hg clone https://bitbucket.org/pypy/pypy` + +- pypyをコンパイルする。 +hg cloneしてきたpypy上で、ディレクトリを移動する。 + - `$ cd pypy/pypy/goal` + +- pypyをコンパイルする。 + - `$ python ../../rpython/bin/rpython --lldebug -Ojit targetpypystandalone` + +- lldbでデバッグしたい場合のコンパイルは以下のコマンド。 + - `$ python ../../rpython/bin/rpython --lldebug -Ojit targetpypystandalone` + +pypy-cというバイナリが出来上がる! + + +## lldbデバッグする場合 + - 簡単なpythonのファイルを作成する。 + - 今回の場合は &ref(tmp.py); +``` + $ lldb -- [読む側のプログラム] tmp.py +``` +例 : tmp.pをpypy-cで読んでいく様子をlldbでみていく。 +``` + $ lldb -- ./pypy-c tmp.py +``` +lldbのための debug symbol は /private/var/の下にできるのでしばらくすると消えてしまいます。 +なので PYPY_USESSION_DIR や PYPY_USESSION_KEEP を設定すると[[良さそうです。:http://doc.pypy.org/en/latest/getting-started-dev.html#where-to-start-reading-the-sources]] + + +## pypy interepreter をpdbデバッグする + - lldbの場合と同様に、tmp.pyを読んでいく様子をみていく。 +``` + $ python -m pdb pypy/bin/pyinteractive.py tmp.py +``` + +- 各オプションについて + - pdb で break するには + + - `b <filename>:<lineno>` + + - pdb で b を消すには + + - `clear <breakpointid>` + + - pdb で condition をかけるには + + - `condition <breakpointid> <condition>` + + - pdb で condition を消す + + - `condition <breakpointid>` + + - 毎回コマンドを実行するには + + - `commands <breakpointid>` +の後に command を打つ +終わる時に end とか continue を書く + + +## 1日目 + +## どこでパースしているのか探そうという話 +``` + $ lldb -- ./pypy-c tmp.py +``` + + - ファイルを開いているはずなので、まずは open を追う。 + (lldb) b open + - 絶対パスでpythonモジュールを読み込んでるっぽい。 + - なので先頭が/で無いものが tmp.py だとして break point に condition を付ける + - br m -c ((char*)$rdi)[0]!=\'/\' 3.1 + - で 3.1 にある open で $rdi の先頭が / じゃないやつを止めとく + - $rdi に引数な文字列をが残っていたりするので x $rdi とかする + + + + - pyinteractive.py を読む + - パーサを読みたい + + +## pdbデバッグしていく + `$ python -m pdb pypy/bin/pyinteractive.py tmp.py` + + - break point に commnads を設定して、ファイル名を出力させながらトレースしていく。 + - ほしいファイル名はtmp.py。 + +`/Users/e115747/Desktop/pypy/pypy/bin/pyinteractive.py` + - このコードの関数で重要な部分らしい。 + - do_start() : Python実行用環境が作られる関数 + - doit() : 実際にコードが実行される関数 + - これらが main.run_toplevel() に渡されて実行される + + 95行目 : spacce.setitem() + - 第3引数argvがtmp.pyとなっていた + + 174行目 : main.run_toplevel() + - 第2引数がdoit()であった場合にPythonコードが実行される + + pypy/pypy/interpreter/main.py + - 103行目 : f() が doit() と一致。 + + - 一連の流れをみてみると、pythonに変換されたコードが返ってきていることがわかった。 + +## 2日目 + +## python・pypyのコンパイラの仕組み。 + - 図&ref(blackbord.jpg)を載せる。 + - pyinteractiveがpythonを呼ぶかpypyに呼ぶかはスペースによって決まるらしい。 + - pyinteractive は Python 側にパースなども任せている様子 + +## スペースの切り替え部分を探す。 + pypy/pypy/interpreter/main.py + - このソースの + + space.wrap('softspace')) +- でスペースで選択されているらしい。 +- pypyのスペースに切り替えたいなぁ... + +- この段階ではpdbで追っていくと Python VM なコードになったので VM を読むことに。 +- Python VM の frame や pyopcode(python の byte codeの様子)などを追う + + +pypy/pypy/interpreter/baseobjspace.py +- コードの中身(関数やクラス等)を定義している + + +pypy/pypy/interpreter/pyframe.py +- フレームが作成される +- フレーム : 関数の戻り値等をスタックしておいたりするやつ + +pypy/pypy/interpreter/pyopcode.py +- バイトコードの大部分(printやplus等)が書かれている + +frame を作成して exec するところまでは追った。 + + - execute_frame での pdb のバックトレース + +``` + (Pdb) bt + /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/bdb.py(387)run() + - > exec cmd in globals, locals + <string>(1)<module>() + pypy/pypy/bin/pyinteractive.py(204)<module>() + - > sys.exit(main_(sys.argv)) + pypy/pypy/bin/pyinteractive.py(175)main_() + - > verbose=interactiveconfig.verbose): + pypy/pypy/interpreter/main.py(103)run_toplevel() + - > f() + pypy/pypy/bin/pyinteractive.py(159)doit() + - > main.run_file(args[0], space=space) + pypy/pypy/interpreter/main.py(68)run_file() + - > run_string(istring, filename, space) + pypy/pypy/interpreter/main.py(59)run_string() + - > _run_eval_string(source, filename, space, False) + pypy/pypy/interpreter/main.py(48)_run_eval_string() + - > retval = pycode.exec_code(space, w_globals, w_globals) + pypy/pypy/interpreter/eval.py(33)exec_code() + - > return frame.run() + pypy/pypy/interpreter/pyframe.py(140)run() + - > return self.execute_frame() + > pypy/pypy/interpreter/pyframe.py(168)execute_frame() + - > next_instr = r_uint(self.last_instr + 1) +``` + + +## テストのソースを編集し、それを動かしながらデバッグしていく。 + - 直接読みたいパーツをテストしているコードを動かして、パーツのコードを読んでいくことに。 + - parser が読みたい、ということになってので、これをコピって編集する。 + `pypy/interpreter/pyparser/test/test_pyparse.py` + + - 編集したもの -> &ref(hoge.py); + - hoge.pyでparseする。 + $ python hoge.py tmp.py + - すごい文字列いっぱい出てきた! + + - ここからpdbで読んでいく。 + $ python -m pdb hoge.py tmp.py + + - textsrcの中身をprintすると、うまくtmp.pyのsourceがとれている。 + + pypy/interpreter/pyparser/pyparse.py を読んだ + - 141行目からトークナイズの部分。 + + pypy/interpreter/pyparser/pytokenizer.py を読んでる。 + - アルファベット、数字、改行、コメントアウト等の判別等〜 + +- endDFA +- 決定性有限オートマトン( 状態遷移 ) +- 行末を検出するのに使われている。 + +-- + + - 230行目 python_opmap はリストになっている + - 演算子がハッシュになっている! +-- + + - 簡単な計算の流れをみて演算子がハッシュになっているのをみた。 + - 簡単なfor文の流れをみて段落がどのように判別されているのかをみた。 + + - ソースのインデント調べ終え、tree化されていた。 + + +## バイトコードが生成された。 + pypy/interpreter/test/test_compiler.py + - これを編集して -> &ref(hogest.py); + + - バイトコードが生成された。 + `$ python hogest.py tmp.py` + + `$ python -m pdb hogest.py tmp.py` + + - ノードの塊をこれでastにするみたい。 + pypy/pypy/interpreter/astcompiler/astbuilder.py + - 時間の関係上この日は、この部分は読まなかった。 + + +## バイトコードをディスパッチに食わせて、tmp.pyを実行できるかを試した + + - 移植した部分 + + pypy/pypy/interpreter/eval.py(33) + - ↑ 内の関数 exec_code() + + pypy/pypy/interpreter/main.py + - ↑ 内の関数 ensure__main__(space) + + - 他にもあったかな〜〜〜〜? + +## 3日目! + + コンパイラは、与えられたソースコードをいろいろと変換し、 + メモリ上に完全構文木(cst)にしたあと、それを抽象構文気(ast)に変換している。 + + - astはpypy/interpreter/astcompiler/astbuilder.py:(52) build_ast()で作られている + + - stmt の type を見て handle していく感じ? + + - 例えば expr_node_type は以下のように handle されていった + + test -> or_test -> and_test -> not_test -> comparison -> expr -> xor_expr -> and_expr -> shift_expr -> arith_expr -> term -> factor -> power + + + +hanldle_expr + +- どんどんif文でchildrenを取っていっている +- children が 1 の場合は children[0] を取ってきて終了 +- power まできたら handle_power して handle_atom する +- おそらく、演算などがかかりそうな部分にすべて handler があって、 children が 1である(特に演算が無い場合)は次の演算をチェックする、という形で潜っていく様子 + +file_input + +- pypy/interpreter/pyparser/data/Grammar2.7の中に、simple_stmtの構成等が書かれていた。 +pypy/interpreter/pyparser/pytoken.pyの中に、演算子に対応する一覧が書かれている。 + +- type は syms の attribute として管理されているので、内部の値が分かっていてもそれが何に相当るのかは分からない +- 例えば syms.stmt は 322 なのだけれど、 hoge.type = 320 とかだと、hoge は syms の何に相当するのか分からない +- なので syms の attributes と 値から逆引きできるハッシュを作成して読むなどした +- おそらく pypy にはそういう util があるはず +- 書いた逆引きコードは以下。 + +``` + sym_tab = {} + for attr in dir(astbuilder.syms): + v = getattr(astbuilder.syms, attr) + if isinstance(v, int): + sym_tab[v] = attr + + def show_token(n): + + tokens = [] + if n > 256: + return sym_tab[n] + else: + tokens = pytoken.python_tokens.items() + for k, v in tokens: + if n == v: + return k +``` +- ちなみに type の値が 256 以下なら pyop らしい。 + +``` + p dir(syms) + p syms.small_s +``` + +とかも、覚えておくといいかも + + +fileinputに潜る + - stmt.type : 323 --> stmt + +type を識別する巨大な if-elif 文があり + +``` + children[0] の type --> simple_stmt + children[0] の type --> small_stmt + children[0] の type --> expr_stmt +``` + +的な感じで分岐する様子 + + - handle_expr_stmt + + +handle_expr の時点での btのログ + +``` + /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/bdb.py(387)run() + - > exec cmd in globals, locals + <string>(1)<module>() + /Users/e115763/files/build/pypy2/run_pypy.py(58)<module>() + - > pycode = compile_with_astcompiler(source, "exec", StdObjSpace()) + /Users/e115763/files/build/pypy2/run_pypy.py(37)compile_with_astcompiler() + - > ast = astbuilder.ast_from_node(space, cst, info) + /Users/e115763/files/build/pypy2/pypy/interpreter/astcompiler/astbuilder.py(12)ast_from_node() + - > return ASTBuilder(space, node, compile_info).build_ast() + /Users/e115763/files/build/pypy2/pypy/interpreter/astcompiler/astbuilder.py(63)build_ast() + - > stmts.append(self.handle_stmt(stmt)) + /Users/e115763/files/build/pypy2/pypy/interpreter/astcompiler/astbuilder.py(626)handle_stmt() + - > return self.handle_expr_stmt(stmt) + /Users/e115763/files/build/pypy2/pypy/interpreter/astcompiler/astbuilder.py(694)handle_expr_stmt() + - > target_expr = self.handle_testlist(target_node) + /Users/e115763/files/build/pypy2/pypy/interpreter/astcompiler/astbuilder.py(710)handle_testlist() + - > return self.handle_expr(tests.children[0]) + > /Users/e115763/files/build/pypy2/pypy/interpreter/astcompiler/astbuilder.py(721)handle_expr() + - > if first_child.type in (syms.lambdef, syms.old_lambdef): + + + children[1].type : 22 --> EQUAL +``` + + + + + - y などの変数を ast 化すると Ast.NAME が返ってくる + - +等の処理は handle_binop とかでやってる + - ast 初期化の initialize_stateは何かのフラグ? +値が 15 とか 8 とかの決め打ちなので + + - ast.py に AST の定義が書かれているが、これは生成されたコードらしい + + 生成されたコード + pypy/interpreter/astcompiler/ast.py + + ast.pyを生成するコード + /pypy/interpreter/astcompiler/tools/asdl_py.py + + 生成の定義等が書かれているやつ← 超重要!! + pypy/interpreter/astcompiler/tools/Python.asdl + + ソースをpypyの中で適当に書いてると環境が壊れることがあるので注意 + 最悪hg clone等で再構築
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/software/tmux.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,42 @@ + +# tmuxとは + +mac osでデバッグ環境を構築する +端末多重化ソフトウェア。一つのターミナル画面に複数の端末を上げることができる。 +またssh先で実行することで、コネクションが切れた際にも処理を継続してくれる + +# ソースコード + +GitHubにある + + https://github.com/tmux/tmux + +``` + git clone git@github.com:tmux/tmux.git +``` + +## mac osでデバッグ環境を構築する + + brew info aclocal + brew install autoconf + brew install automake + brew install pkg-config + +大体パッケージをインストール終わったらデバッグしていく + +``` + $ ./autogen.sh + $ ./configure +``` + + +autogenの実行時のエラーをはいたらconfigureの前に処理尾する + +### デバッグしたい場合 + +``` + $./configure --prefix=/Users/anatofuz/workspace/cr/Advansed_software/build_tmux --enable-debug +``` + +- prefixにinstall先 +- --enable-debug を指定するとデバッグ環境でbuildされる
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/software/usb_serial.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,39 @@ +# USB Serial通信 + +Raspberry piとのUSB Serial通信の仕方をまとめる。 +参考にしたサイト: [Ubuntuでラズパイ とシリアル接続](http://dotnsf.blog.jp/archives/1071983142.html) + +## 環境 +### 接続先 +機器: Raspberry pi 3B+ +OS: [Raspbian](https://www.raspberrypi.org/downloads/raspbian/) +ケーブル: [USBシリアル変換ケーブル](https://www.switch-science.com/catalog/1196/) + +### 接続元 +OS: Ubuntu 18.04 + + +## 流れ + +Raspberry pi側でSerial通信をEnableにする。 +Raspberry pi側のターミナルで以下のコマンドを入力する +``` +mk@raspberry:~$ raspi-config +``` +設定画面でInterface -> Serialを選択してSerial通信をEnableにします。 + +次にUbuntu側の設定です。Serial通信用のコマンドをインストールします。 +``` +mk@ubuntu:~$ sudo apt install cu +``` +今回は**cuコマンド**を使用しますが、MacOSに標準インストールされている**screenコマンド**でもできます。 +cuコマンドをインストールできたらUSBを接続します。Ubuntu側に他のUSBを接続していなければ```/dev/ttyUSB0```とデバイスが認識されます。 ```/dev/ttyUSB0```の実行権限がないので権限を変更します。 +``` +mk@ubuntu:~$ sudo chmod 666 /dev/ttyUSB0 +``` +あとは下のコマンドでSerial通信を始めることができます。 +``` +mk@ubuntu:~$ sudo cu -s 115200 -l /dev/ttyUSB0 +``` + +切断したい場合は```~.```と入力します。 \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/trash/software/Christie.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,1 @@ +tsts \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,6 @@ +# Gears OSにおける multi threadにおけるプログラム検証 + +# 要約 +* CbC は処理の移行を goto 用いて行い、データ構造はdate gearにより保持する事でプログラムの処理をcode gear毎の独立したものにする。 +* Geas OS はCbCで記述されおり、処理を変更する事なく処理の間に自由にメタ処理を挟む事ができる、これにスケジューラーを挟む事でマルチスレッド処理などが可能となる。 +* メタ計算部分にモデルチェッキングを入れる事でプログラムを実行しながらにして証明することが可能となる。 \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/Itsuki/notes.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,24 @@ +# 進捗報告 +## 研究目的 +- ペアプログラミングなど一つのファイルを複数人で編集する有効的手法の一つとして, 同じファイルを複数人が場所を 問わずに同時編集することができるリモートエディタをあげられる. +- リモートエディタ機能を持つ既存のテキストエディタとしてVisual Studio Code(VScode)のLive Share機能が挙げられる。 + - プログラマーには個人が各々慣れ親しんだ編集環境が存在する。 + - 編集に参加する全員がVScodeの環境を取り入れなければならない。 +- 参加者が好みの異なるエディタ環境で同時編集が行えるリモートエディタを作成したい。 +- 異なるマシン上のエディタ同士の通信は、当研究室が開発する分散フレームワークChristieを用いる。 + +## 進捗内容 +- IntelJのプラグインを勉強してました。 + - javaでAction(Prugin部分)を作成して、pom.xmlにActionを登録するのが基本的な流れらしい。 + - Devkitを使うことでもAction登録ができる。 + - Actionを呼ぶ方法としてメニューバーから呼び出す、キーバインドなどがある。 +- デバック実行時するときにVMを立ててIntelJを起動させてる + - PCの性能のためか + +## やりたいこと +- Christie読み会 + - 前回話していたやつ、過去にDaemonからの流れを呼んでいたのですが、、 +- OS再勉強 + - 内容もだいぶ変わったみたいなので、夏休みに教えれるぐらいには +- シス管のタスクに触れてみたい + - Q.期限とかあるんですか? \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/Itsuki/notes/11-24.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,1 @@ +tsts \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/Itsuki/notes/11/10.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,1 @@ +tsts \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/Itsuki/notes/8-25.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,1 @@ +* \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/Itsuki/notes/August-18.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,1 @@ +- \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/Itsuki/notes/June30.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,1 @@ +tsts
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/Itsuki/notes/Merch-31.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,1 @@ +tsts \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/Itsuki/notes/October-13.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,1 @@ +- tst \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/Itsuki/thesis.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,310 @@ +title: 分散フレームワークChristieを用いたリモートエディタの実装 +author: Takahiro Ikki, Shinji Kono +profile: 琉球大学 +lang: Japanese +code-engine: coderay + +## 研究目的, 背景 +- リモートエディタとは別マシン上から同時に複数人が一つのファイルを編集することができる。 + - ペアプログラミングやリモートワークに特に有効である。 +- 完全同期式の既存のリモートエディタアプリケーションとしてVisual Stdio Codeのlive share機能があげられる。 + - 編集環境を統一しなくてはならない。 +- 編集に参加するユーザーがそれぞれ好きなエディタが使えるアプリケーションを作成する。 +- 本研究室で開発している分散フレームワークChristieを使って開発する。 + - ChristieはGearというプログラミング概念の性質上リモートエディタと相性がよい。 + +<!-- +## 発表の流れ +- リモートエディタの機能と開発手順の解説 + - javaで制作したテスト用エディタ + - コマンドパターンによる命令オブジェクトの作成 + - 編集位置の相違とその解消方法 +- スター型接続によるネットワーク通信 +- Christieの解説 + - Gearの概念 + - アノテーション + - TopologyManager +- 今後の課題とまとめ +!--> + +## リモートエディタの概要説明 +- 本研究で作成するリモートエディタはChristieの機能を用いて通信環境を構成する。 +- サーバーとノードに別れ、サーバーが編集ファイルの正しい状態を保持する。 +- 同期編集セッションに接続したユーザーは自身のマシン上でエディタを使って編集対象ファイルを開く。 + - ユーザーが起こしたファイルへの変更を、命令コマンドとして接続しているサーバー(ハブ)へ送信&実行させる。 +- 命令コマンドはサーバーへ集められ、サーバーは受け取ったコマンドを他の接続ノードへ送信し、実行させる。 + +<div style="text-align: center;"> + <img src="images/RemoteEditor.pdf" alt="MetaGear" width="800"> +</div> + + +## テスト用テキストエディタ +- 通信の構成を行うChristieはjava言語で作成されているため、javaのswingを用いてテキストエディタを制作した。 +- エディタ部分の入力、削除の取得はDocument Listenerクラスを使った。 + - insertUpdate、removeUpdateメソッドがそれぞれ挿入、削除を検知した時に動作する。 +- このエディタはファイルの内容をオフセット番号で取り扱っている。 + +<div style="text-align: center;"> + <img src="images/Editor.png" alt="MetaGear" width="800"> +</div> + +## DocumentListenerの記述部分 + +``` +public class MyDocumentListener implements DocumentListener { + @Override + public void insertUpdate(DocumentEvent e) { + Document doc = e.getDocument(); + loc = e.getOffset(); + System.out.println(loc); + + } + + @Override + public void removeUpdate(DocumentEvent e) { + Document doc = e.getDocument(); + sendLoc = e.getOffset(); + System.out.println("delete " + sendLoc); + } + @Override + public void changedUpdate(DocumentEvent e) { + } +} +``` + +## コマンドパターンの解説 +- リモートエディタの通信では、各ノード(参加ユーザのエディタ)がそれぞれ自身のファイルの変更内容を他のノードに送信する。 +- コマンドパターンとは命令を一つのオブジェクトとして表現するプログラム手法である。 +- 命令を表すクラスを作成し、インスタンスを作成と同時に命令の中身を入力することで命令を作成する。 + - リモートエディタにおいては「オフセットn番目に に 文字列 "A"を入力した」という変更を命令にして送信する。 +- コマンドパターンの利点として、 + - ChristieのGearの概念と相性がいい。 + - 命令に必要な内容をまとめて送信するため、時間差による相違の発生が防げる。 + - オブジェクトとして取り扱えるため管理が行いやすい。 + +``` + package christie.example.RemoteTake; + import org.msgpack.annotation.Message; + + @Message + class RTCommand { + public String line; + public String cmd; + public int offset; + + public RTCommand () {} + + public RTCommand(String cmd, String line, int i) { + this.cmd = cmd; + this.line = line; + this.offset = i; + } + + @Override + public String toString() { + return "RTCommand{" + + "line='" + line + '\'' + + ", cmd='" + cmd + '\'' + + ", offset=" + offset + + '}'; + } + } +``` + + +## コマンドパターン実装の際に起こった問題 +- クラスを他ノードに送信するためには、クラスをシリアライズして送信する必要がある。 + - コマンドの送信にはmsgpackクラスとjavassistを利用している。 +- しかし、送信がうまく行えなかったため、原因を調査した。 + - javaのバージョン進行のため、msgpackバージョン0.6.12が非対称となっていた。 + - msgpackの最新バージョン0.8.20はシリアライズ機能が含まれなくなった。 +- 以上の原因に対処するため以下の対処を行った。 + - javassistのバージョンを最新版へ変更した。 + - シリアライズする命令クラスに対し、クラスをpublicに変更した。 +- 自身でシリアライズ機能をChristieに内蔵してしまえば、これらのパッケージは不要になる。 + +## 編集位置の相違 +- 同期編集のセッションでは命令コマンドの送信のすれ違いにより、ノードごとのファイル状態が異なってしまうことがある。 +- EditorAとEditorBはそれぞれの命令を自身のエディタバッファに施してから命令を送信するため、お互いバッファ状態が異なる状態で受け取った命令を実行してしまう。 + +<div style="text-align: center;"> + <img src="images/difference_offset.pdf" alt="MetaGear" width="800"> +</div> + +## 編集の相違の解消 +- 同期編集のセッションはスター型の通信接続で行うため、サーバー対複数ノードの通信間で相違が発生する。 +- 編集の相違を防ぐためには二つの処理を行う必要がある。 + - サーバーとノード間の命令のすれ違いが発生したことを検知する。 + - すれ違いが発生した際に、オフセットのズレを修正する。 +- サーバーが正しいファイルの状態を保持するためサーバーの状態にノードが合わせる必要がある。 + +## 命令コマンドに番号をつけ相違を解消する +- 命令コマンド番号には以下の特性がある。 + - 全てのノード(サーバーを含める)は事前に処理した命令コマンドの番号を記憶している。 + - 新しく作られた命令コマンドは作られたノードの命令実行済み番号+1 を自身の命令コマンド番号とする。 + - ノードは自身が作成したか、他のノードに送られてきたかに関わらず命令コマンドを実行したら命令実行済み番号をその命令コマンドの番号と同じにする。 +- もしノードが送られてきた命令コマンドを見て、そのコマンドが自身の実行済み番号と同値以下の場合、送信元のノードとの命令のすれ違いが発生していることが分かる。 + +<div style="text-align: center;"> + <img src="images/FixCommand.pdf" alt="MetaGear" width="800"> +</div> + +## すれ違いが発生した際の処理 +- 全てのノードは自分が実行した命令コマンドを記録しており、後からオフセットや文字列を取り出すことができる。 +- すれ違いが発生した時点からの命令の中身を集計、参照しすれ違いで送られてきたコマンドを修正する。 +- insertを例とすると + - 受け取ったコマンドのオフセット > 受信コマンドとすれ違ったコマンドのオフセット のとき、受診したコマンドのオフセットに+1 する。 + - 受け取ったコマンドのオフセット <= 受信コマンドとすれ違ったコマンドのオフセット のとき、受診したコマンドのオフセットを変えずにそのまま実行できる。 + + + +## スター型通信 +- Christieにはノードの通信接続を行うTopologyManagerという機能がある。 +- 同期通信はスター型での接続を行う。 +- スター型通信の利点は + - サーバーが正しいファイル状態を保持するため、整合性を保つことができる。 + - どこかのノードが切断されても、要害の範囲をそのノードのみに抑えることができる。 + - 新しいノードが参加した、もしくは復帰の際にはサーバーのファイル状況を参照するのみで参加、復帰ができる。 + +<div style="text-align: center;"> + <img src="images/Star-Topology.pdf" alt="MetaGear" width="800"> +</div> + +## Christie +- Christieは当研究室で開発している、信頼性を重視した分散フレームワークである. +- 現在はjava上で開発されているが、別言語(CbC)で構成されたGearsOSに組み込む予定があるため,それに向けて書き換え可能な構成となっている。 +- ChristieではデータをGearという単位で分割して記述を行う。 + - CodeGear(以下CG) + - スレッドやクラスに相当し、javaの継承を用いて記述する。keyに全てのDGが格納された際に動作する。 + - DataGear(以下DG) + - DGは変数に相当し、CG内でアノテーションを用いてデータを取り出せる。 + - CodeGearManager(以下CGM) + - ノードに相当し, DG, CG, DataGearManagerの管理をする. + - DataGearManager(以下DGM) + - DGを管理するものであり, putという操作にて変数(DG)をkeyに格納する。 + + +## Christieのコード例 +``` +package christie.example.HelloWorld; + +import christie.codegear.CodeGearManager; +import christie.codegear.StartCodeGear; + +public class StartHelloWorld extends StartCodeGear { + + public StartHelloWorld(CodeGearManager cgm) { + super(cgm); + } + + public static void main(String[] args){ + CodeGearManager cgm = createCGM(10000); + cgm.setup(new HelloWorldCodeGear()); + cgm.setup(new FinishHelloWorld()); + cgm.getLocalDGM().put("helloWorld","hello"); + cgm.getLocalDGM().put("helloWorld","world"); + } +} +``` + +``` +ChristieDaemon.listen: bind to /0:0:0:0:0:0:0:0:10000 +hello world +``` + +<!-- +- 立ち上げ後はManager名を指定してDataSegmentAPI用いてDSのやり取りを行うため、プログラマはManager名を意識することでLocalへの操作もRemoteへの操作も同様に扱える。 +--> + +<!-- + +## Christieの言語概念 +- CGはスレッド, クラスに相当し, javaの継承を用いて記述する. +- DGは変数データに相当し, CG内でアノテーションを用いて変数データを取り出せる. +- CGMはノードであり, DG, CG, DGMを管理する. +- DGMはDGを管理するものであり, putという操作により, 変数データ(DG)を格納できる. + - DGMにはLocalDGMとRemoteDGMが存在する。LocalDGMは各ノード固有のデータベースである。RemoteDSMは他ノードのLocalDGMに対応するproxyであり、接続しているノードの数だけ存在する。 + - DGMのput操作を行う際にはLocalとRemoteのどちらかを選ぶ.Localであれば、LocalのCGMが管理するDGMに対しDGを格納し, Remoteの場合は接続したRemoteさきのCGMのDGMにDGを格納する. + +--> + + +## DGM +- CGMはDGをputという操作を使って、自身や他ノードのDGMに書き込ませる。 + - LocalDGMが自身、RemoteDGMが他ノードのDGMである。 + +<div style="text-align: center;"> + <img src="images/remote_datasegment.pdf" alt="MetaGear" width="800"> +</div> + + +<!-- +- RocalDGMを立ち上げるにはDataSegmentクラスが提供する、connectメソッドを用い、接続したいポートのipアドレスとport番号、そして任意のManager名を指定することで立ち上げる。 +--> + + +## DGのアノテーション +- DGを取り出す際にはCG内で宣言した変数にアノテーションをつける。DGアノテーションには +Take、Peek、TakeFrom、PeekFrom、の4つがある。 + - Take + - 先頭のDGを読み込み、そのDGを削除する。 + - Peek + - 先頭のDGを読み込むが、DGが消去されない。そのため特に操作をしない場合、同じデータを参照し続ける。 + - TakeFrom + - Remote DGM nameを指定することで、その接続先のDGM からTake操作をおこえる。 + - PeekFrom + - Remote DGM nameを指定することで、その接続先のDGM からPeek操作をおこえる。 + +``` +package christie.example.HelloWorld; + +import christie.annotation.Peek; +import christie.annotation.Take; +import christie.codegear.CodeGear; +import christie.codegear.CodeGearManager; + +public class HelloWorldCodeGear extends CodeGear { + + @Take + String helloWorld; + + @Override + protected void run(CodeGearManager cgm) { + System.out.print(helloWorld + " "); + cgm.setup(new HelloWorldCodeGear()); + cgm.getLocalDGM().put(helloWorld,helloWorld); + } +} +``` + +<!-- +## TopologyManager +- TopologyManagerとはTopologyを形成のために、参加を表明したノード、TopologyNodeに名前を与え、必要があればノード同士の配線を行うノードである。 +- TopologyManagerのTopology形成方法として、静的Topologyと動的Topologyがある。 + - 動的Topologyは参加を表明したノードに対し、動的にノード同士の関係を作る。例えばTreeを構成する場合、参加したノードから順にrootに近い役割を与え、またCodeGearはノードが参加し、parentに接続された後に実行される。 + - 静的Toopologyはdotファイルを与えることノード関係の構築を行う。 + +```Code +digraph test { + node0 -> node1 [label="right"] + node1 -> node2 [label="right"] + node2 -> node0 [label="right"] +} +``` + +<div style="text-align: center;"> + <img src="images/ring.pdf" alt="MetaGear" width="500"> +</div> +!--> + +## まとめとこれから +- 本研究発表ではリモートエディタの開発とそれに伴う技術について述べた。現時点で実装できた構成は以下である。 + - リモートエディタの基本となる命令のやり取り部分のコマンドパターン実装。 + - 編集相違を防ぐためのアルゴリズムの発案と検証。 +- 現時点では最低限のセッションを動かすまでの最低限の実装は終わっていない。これから取り組まなければならない課題として以下が挙げられる。 + - スター型Topologyの接続を動的に行わせる。 + - 編集するファイルの共有方法 + - ファイルをそのまま送信すると、負担が大きいと予想される。 + - 既存のエディタを同期通信に対応させる。 +- 以上の課題の課題に取り組み、これからも実装を続けていきたい。
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/Koo0.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,2 @@ +# Koo0 +This is Koo0's page \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/Okud.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,2 @@ +# Okud +This is Okud's page \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/Okud/note/0929.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,17 @@ + +9/29 +###研究目的 + +OSには信頼性が保証できることと拡張性があることが求められている。信頼性をノーマルレベルの計算に対して保証し、 拡張性をメタレベルの計算で実現することを目標にGears OSを設計中である。現在、Geas OS を Raspberry Pi 上で動かすためにはMacとシリアル通信で繋げなければ入力ができない。 Raspberry Pi 上の Gears OS でキーボードやマウスを使えるようになれば利便性が向上する。また、Raspberry Pi 以外のハードウェアで動かす時にも、PCを介して接続しなくて良くなる。 本研究では、Rasberry Pi 上で Gears OS の Device Driver を CbC で開発しすることが目的である。 + +###やったこと +- raspberry piのUEFIを起動した +![raspberry pi UEFI](http://www.cr.ie.u-ryukyu.ac.jp/hg/Papers/2020/okud-thesis/raw-file/tip/img/IMG_0382.jpeg) + +- usb portどこ? +- usbの設定の場所がわからない + https://github.com/tianocore/edk2-platforms/tree/master/Platform/RaspberryPi/RPi3 + +###やること + +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/anatofuz.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,2 @@ +# anatofuz +This is anatofuz's page \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/anatofuz/go-crowi-test-1585901648936609000.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,3 @@ +# this is a sample + +test \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/anatofuz/go-crowi-test-1585901657924167000.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,3 @@ +# this is a sample + +test \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/anatofuz/go-crowi-test-1585901665906321000.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,3 @@ +# this is a sample + +test \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/anatofuz/go-crowi-test-1607073451074435000.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,3 @@ +# this is a sample + +test \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/anatofuz/note/2019/12/18.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,13 @@ +# 日報 + +- nkmr先生の講義で発表 +- 実験2のTAをした +- GearsOSの書き換え作業 + +## GearsOSの書き換え + +- なんか`sys_read_impl.h`時代の名残があったので幾つかファイルを削除した + - interface_impl headerとimplの2種類 +- そろそろsyscall interfaceを書くべき? + - interfaceの仕様が結構混乱を招きそうな気配を感じている + - チュートリアル的な資料の充実...? \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/anatofuz/note/2020/01/14.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,31 @@ + +## 進捗 +- 就活おわり(去年) +- プロシン参加してきました + - Cじゃなくて新しい言語ベースでCbCを実装するのがいいのではみたいな話をしていた +- そろそろHaskellとLispとagdaに詳しくなっておけという圧を感じている +- GearsOSの実装を再開 + - いままでの変更点をある程度roolbackしたい + + +## GearsOSの処理 + +- 変更されたファイル一覧を出力する + +```sh +$hg status --change 120 +M src/interface/SysRead.h +A src/old_makefiles/Makefile.osx +A src/old_makefiles/makefile-armclang +A src/old_makefiles/makefile-armgcc4.8.5 +A src/old_makefiles/makefile-armgccbc +A src/old_makefiles/makefile-osx.inc +A src/old_makefiles/makefile.inc +A src/plautogen/interface/Integer.h +R src/Makefile.osx +R src/makefile-armclang +R src/makefile-armgcc4.8.5 +R src/makefile-armgccbc +R src/makefile-osx.inc +R src/makefile.inc +``` \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/anatofuz/note/2020/01/20.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,28 @@ +# GearsOSのビルド時の情報 + +``` + 'SingleLinkedQueue' => { + 'caller' => { + '/Users/anatofuz/src/firefly/hg/Gears/src/parallel_execution/c/SingleLinkedQueue.c' => [ + 8, + 34, + 46, + 63, + 85 + ] + } + }, + 'SynchronizedQueue' => { + 'caller' => { + '/Users/anatofuz/src/firefly/hg/Gears/src/parallel_execution/c/SynchronizedQueue.c' => [ + 11, + 24, + 43, + 83, + 126, + 145 + ] + } + }, + +``` \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/anatofuz/note/2020/01/27.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,3 @@ +# 研究目的 + +# 進捗 \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/anatofuz/note/2020/02/01.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,109 @@ +# 作業ログ.. + +# CbC_return使おうとして挫折した + +- せっかくなので現在CbC -> Cに戻ってくる箇所を環境付きgotoにしようとした + - 今現在はrerunをすることでCの世界に返ってきている +- とりあえず下のようなパッチを買いてみた +- 現在のgenerate_stub.plは`goto`をすべて`goto meta`に置換してしまう +- 下の書き方だと、引数の`CbC_return`に対してgotoしなければならないので、現状のルーチンでは難しそう + +```patch +diff -r 40b1b7476e77 src/impl/vm_impl.cbc +--- a/src/impl/vm_impl.cbc Tue Jan 28 17:14:44 2020 +0900 ++++ b/src/impl/vm_impl.cbc Sat Feb 01 14:28:28 2020 +0900 +@@ -35,7 +35,7 @@ + vm_impl->copyout_loopvm_impl = C_copyout_loopvm_impl; + vm_impl->switchuvm_check_pgdirvm_impl = C_switchuvm_check_pgdirvm_impl; + vm_impl->init_inituvm_check_sz = C_init_inituvm_check_sz; +- vm->void_ret = C_vm_void_ret; ++ vm->void_ret = C_void_retvm_impl; + vm->init_vmm = C_init_vmmvm_impl; + vm->kpt_freerange = C_kpt_freerangevm_impl; + vm->kpt_alloc = C_kpt_allocvm_impl; +@@ -149,6 +149,15 @@ + goto paging_intvmvm_impl(vm, phy_low, phy_hi, next(...)); + } + +-__code vm_void_ret(struct vm_impl* vm) { +- return; ++ ++__code void_retvm_impl(struct Context* cbc_context, struct vm_impl* vm, void (*return_func)(int, void*), int ret_val, void* cbc_env) { ++ goto return_func(ret_val, cbc_env); + } ++ ++__code void_retvm_impl_stub(struct Context* cbc_context) { ++ vm_impl* vm = (vm_impl*)GearImpl(cbc_context, vm, vm); ++ void (*return_func)(int, void*); ++ return_func = Gearef(cbc_context, vm)->return_func; ++ void* cbc_env = Gearef(cbc_context, vm)->cbc_env; ++ goto void_retvm_impl(cbc_context, vm, return_func, cbc_env); ++} +diff -r 40b1b7476e77 src/interface/vm.h +--- a/src/interface/vm.h Tue Jan 28 17:14:44 2020 +0900 ++++ b/src/interface/vm.h Sat Feb 01 14:28:28 2020 +0900 +@@ -17,6 +17,8 @@ + uint len; + uint phy_low; + uint phy_hi; ++ void* cbc_env; ++ void (*return_func)(int, void*); + __code init_vmm(Impl* vm, __code next(...)); + __code kpt_freerange(Impl* vm, uint low, uint hi, __code next(...)); + __code kpt_alloc(Impl* vm ,__code next(...)); +@@ -29,6 +31,6 @@ + __code uva2ka(Impl* vm, pde_t* pgdir, char* uva, __code next(...)); + __code copyout(Impl* vm, pde_t* pgdir, uint va, void* pp, uint len, __code next(...)); + __code paging_int(Impl* vm, uint phy_low, uint phy_hi, __code next(...)); +- __code void_ret(Impl* vm); ++ __code void_ret(Impl* vm, void (*return_func)(int, void*), int ret_val, void* cbc_env); + __code next(...); + } vm; +diff -r 40b1b7476e77 src/proc.cbc +--- a/src/proc.cbc Tue Jan 28 17:14:44 2020 +0900 ++++ b/src/proc.cbc Sat Feb 01 14:28:28 2020 +0900 +@@ -117,16 +117,20 @@ + //PAGEBREAK: 32 + // hand-craft the first user process. We link initcode.S into the kernel + // as a binary, the linker will generate __binary_initcode_start/_size +-void dummy(struct proc *p, char _binary_initcode_start[], char _binary_initcode_size[]) ++int dummy(struct proc *p, char _binary_initcode_start[], char _binary_initcode_size[]) + { + // inituvm(p->pgdir, _binary_initcode_start, (int)_binary_initcode_size); +- goto cbc_init_vmm_dummy(&p->cbc_context, p, p->pgdir, _binary_initcode_start, (int)_binary_initcode_size); ++ void (*ret)(int, void*); ++ void *env; ++ ret = _CbC_return; ++ env = _CbC_environment; ++ goto cbc_init_vmm_dummy(&p->cbc_context, p, p->pgdir, _binary_initcode_start, (int)_binary_initcode_size, ret, env); + + } + + + +-__ncode cbc_init_vmm_dummy(struct Context* cbc_context, struct proc* p, pde_t* pgdir, char* init, uint sz){//:skip ++__ncode cbc_init_vmm_dummy(struct Context* cbc_context, struct proc* p, pde_t* pgdir, char* init, uint sz, void (*ret)(int, void*), void* env){//:skip + + struct vm* vm = createvm_impl(cbc_context); + // goto vm->init_vmm(vm, pgdir, init, sz , vm->void_ret); +@@ -134,7 +138,9 @@ + Gearef(cbc_context, vm)->pgdir = pgdir; + Gearef(cbc_context, vm)->init = init; + Gearef(cbc_context, vm)->sz = sz ; +- Gearef(cbc_context, vm)->next = C_vm_void_ret ; ++ Gearef(cbc_context, vm)->cbc_env = env; ++ Gearef(cbc_context, vm)->return_func = ret; ++ Gearef(cbc_context, vm)->next = C_void_retvm_impl; + goto meta(cbc_context, vm->init_inituvm); + } + +@@ -152,6 +158,8 @@ + panic("userinit: out of memory?"); + } + ++ void (*ret)(int, void*); ++ void *env; + dummy(p, _binary_initcode_start, _binary_initcode_size); + + p->sz = PTE_SZ; +``` \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/anatofuz/note/2020/02/02.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,41 @@ +# 作業めも +- お腹痛い... +- いくつかのファイルをお引越しした + +# Interfaceの書き方 +- いちいち引数を羅列しないといけないのめんどい +- `__code`に書いたら補完してほしい + - golangのInterfaceに近い書き方? +- 現状のgenerate_stubとかで出来ないか、Perlで書いてみた + +```perl +#!/usr/bin/env perl +use strict; +use warnings; +use DDP {deparse => 1}; + +my $file_name = shift // "vm.h"; +open my $fh, '<', $file_name; + +my @res = (); + +while (my $line = <$fh>) { + if ($line =~ /__code (\w+)/) { + my $args = $'; + #$args eq (Impl* vm, pde_t* pgdir, char* init, uint sz, __code next(...)); + while ($args =~ /((?:struct|union|const)\s+)?([\w*\[\]_]+)\s*(\w+),?/g) { + push(@res, "$2 $3"); + } + } +} + +my @uniq = uniq(@res); +p @uniq; + +sub uniq { + my %seen; + return grep { !$seen{$_}++ } @_; +} +``` + +- できそう \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/anatofuz/note/2020/02/03.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,7 @@ +# きょうのめも +- InterfaceをDataとCodeで分けなくてもいいようになった + +## やったこと +- [[../02]]で書いた正規表現ルーチンがわりと使えそうだったので、これを導入した +- stubを作るところとcontext.hを作るところの2箇所に記述 +- stubの方はポインタ(`*`)を取り外して型情報を登録する必要があるため、微妙に正規表現が異なっている \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/anatofuz/note/2020/02/04.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,3 @@ +# 研究目的 + +TBD... \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/anatofuz/note/2020/02/06.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,130 @@ +# 2020/02/06 + +# panickedをContextに持たせたいやつ + +- かいたはいいがpanic出来ず死がまっていた +- procが0x00のときにアクセスに行って死んでいた + +```patch +diff -r 173753022721 src/console.cbc +--- a/src/console.cbc Thu Feb 06 20:31:43 2020 +0900 ++++ b/src/console.cbc Thu Feb 06 21:00:58 2020 +0900 +@@ -11,7 +11,7 @@ + #include "memlayout.h" + #include "mmu.h" + #include "proc.h" +- ++//data_gear "ConsoleArg.h" + + #define __ncode __code + +@@ -20,7 +20,6 @@ + + static void consputc (int); + +-int panicked = 0; + + struct { + struct spinlock lock; +@@ -133,7 +132,8 @@ + cprintf("cpu%d: panic: ", cpu->id); + + show_callstk(s); +- panicked = 1; // freeze other CPU ++ ++ Gearef(&proc->cbc_context,ConsoleArg)->panicked = 1; // freeze other CPU + + while (1) + ; +@@ -148,7 +148,7 @@ + cprintf("cpu%d: panic: ", cpu->id); + + show_callstk(s); +- panicked = 1; // freeze other CPU ++ Gearef(&proc->cbc_context,ConsoleArg)->panicked = 1; // freeze other CPU + + while (1) + ; +@@ -160,7 +160,7 @@ + + void consputc (int c) + { +- if (panicked) { ++ if (Gearef(&proc->cbc_context, ConsoleArg)->panicked) { + cli(); + while (1) + ; +diff -r 173753022721 src/impl/KernelError.cbc +--- a/src/impl/KernelError.cbc Thu Feb 06 20:31:43 2020 +0900 ++++ b/src/impl/KernelError.cbc Thu Feb 06 21:00:58 2020 +0900 +@@ -28,10 +28,9 @@ + goto next(...); + } + +-__code panicKernelError(struct KernelError* err, char* msg) { ++__code panicKernelError(struct KernelError* err, char* msg, struct ConsoleArg* ca) { + extern struct cpu* cpu; + extern struct { struct spinlock lock; int locking; } cons; +- extern int panicked; + + cli(); + cons.locking = 0; +@@ -39,7 +38,7 @@ + cprintf("cpu%d: panic: ", cpu->id); + + show_callstk(msg); +- panicked = 1; // freeze other CPU ++ ca->panicked = 1; // freeze other CPU + + goto infinity_loopKernelError(err, err->inifinity_loop); + } +diff -r 173753022721 src/interface/Err.h +--- a/src/interface/Err.h Thu Feb 06 20:31:43 2020 +0900 ++++ b/src/interface/Err.h Thu Feb 06 21:00:58 2020 +0900 +@@ -1,5 +1,5 @@ + typedef struct Err <Type, Impl> { + __code error(Impl* err, int err_code, __code next(...)); +- __code panic(Impl* err, char* msg); ++ __code panic(Impl* err, char* msg, struct ConsoleArg* ca); + __code next(...); + } Err; +diff -r 173753022721 src/proc.cbc +--- a/src/proc.cbc Thu Feb 06 20:31:43 2020 +0900 ++++ b/src/proc.cbc Thu Feb 06 21:00:58 2020 +0900 +@@ -7,6 +7,7 @@ + #include "proc.h" + #include "spinlock.h" + #interface "vm.h" ++#interface "ConsoleArg.h" + + #define __ncode __code + +@@ -138,6 +139,11 @@ + goto meta(cbc_context, vm->init_inituvm); + } + ++void create_console_arg(struct Context* cbc_context) { ++ struct ConsoleArg* ca = new ConsoleArg(); ++ ca->panicked = 0; ++} ++ + void userinit(void) + { + struct proc* p; +@@ -145,6 +151,7 @@ + + p = allocproc(); + initContext(&p->cbc_context); ++ create_console_arg(&p->cbc_context); + + initproc = p; + +@@ -228,6 +235,7 @@ + return -1; + } + initContext(&np->cbc_context); ++ create_console_arg(&np->cbc_context); + + // Copy process state from p. + if((np->pgdir = copyuvm(proc->pgdir, proc->sz)) == 0){ +``` \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/anatofuz/note/2020/02/08.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,22 @@ +# 2020/02/08 +- バグ直し +- OSの課題効かれたのでといた + +## バグ +- なんか確保されてないアドレス領域を参照してるらしい +- `Gearef(cbc_context,vm)`で死んでる + +## 解決 +- 生成したCodeGearをContextに書き戻してなかった + - createでやってると思ってたのでコメントにしてた... + +```patch + __ncode cbc_switchuvm_dummy(struct Context* cbc_context, struct proc* proc){ + + struct vm* vm = createvm_impl(cbc_context); +- //Gearef(cbc_context, vm)->vm = (union Data*) vm; ++ Gearef(cbc_context, vm)->vm = (union Data*) vm; + Gearef(cbc_context, vm)->p = proc; + Gearef(cbc_context, vm)->next = C_vm_void_ret ; + goto meta(cbc_context, vm->switchuvm); +``` \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/anatofuz/note/2020/02/11.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,213 @@ +# 2020/02/11 + +# 研究目的 +- 検証を利用して信頼性を確保するGearsOSを開発中 +- Xv6をベースにGearsOSの実装が進んでいる +- 現在のOSに欠かせないネットワーク通信/USBなどのプロトコルを高信頼性で実装したい +- プロコトルは巨大な状態遷移マシンと捉えると、CbC/Gearsでの記述に適している + +# やったこと +- panic関連をチャンレンジしていた +- バグ取り +- generate_stubの解読 + +# panic関連 + +- vm(メモリ関連)の書き換え時に「なにか処理をして引数があってない状況などでpanic」したいケースが多かった + - panicもgotoで飛ばしたい +- panicすると、 + +## panic自体 + +- panic自体はCで書かれている +- cliしてcpuの状態をdumpして無限ループ +- panicしたかどうかのフラグ `panicked` をtrueにしている + +```c +void panic (char *s) +{ + cli(); + + cons.locking = 0; + + cprintf("cpu%d: panic: ", cpu->id); + + show_callstk(s); + panicked = 1; // freeze other CPU + + while (1) + ; +} +``` + +cli +- cpsr(Current Program Status Registe)で割り込みの制御をしているらしい + - csprの割り込みに対応するビットをMSR命令で`DIS_INT`をマスクした値に変えている + +```c +void cli (void) +{ + uint val; + + // ok, enable paging using read/modify/write + asm("MRS %[v], cpsr": [v]"=r" (val)::); + val |= DIS_INT; + asm("MSR cpsr_cxsf, %[v]": :[v]"r" (val):); +} +``` + +panicした場合はconsoleput(文字出力)で処理が分岐する +- cliしてwhile(1)に入る +```c + +void consputc (int c) +{ + if (panicked) { + cli(); + while (1) + ; + } + + if (c == BACKSPACE) { + uartputc('\b'); + uartputc(' '); + uartputc('\b'); + } else { + uartputc(c); + } + + // cgaputc(c); +} +``` + +## CbCで書き直すなら + +panic関数はCodeGearにしたい +- panicked(panicのフラグ)はDataGearに落とし込むのが理想的 +- 今のままだとグローバル変数になってしまう + + +## DataGear/Interface/CodeGear書いてみた +panickedとかlockを持つConsoleArg +- DataGearだけ定義する構文が無いので、Interfaceの構文を使っている + +### Interface +- error/ panicのInterface + - panicはDataGearであるConsoleArgを受け取る +```c +typedef struct Err <Type, Impl> { + __code error(Impl* err, int err_code, __code next(...)); + __code panic(Impl* err, char* msg, struct ConsoleArg* ca); + __code next(...); +} Err; +``` +- 実装側 + - while(1)って書くか、無限に再帰するかなやんだので、gotoする方向でしてみた + +```c +typedef struct KernelError <Type, Isa> impl Err { + __code infinity_loop(Type* err, __code next(...)); + __code next(...); +} KernelError; +``` +- ConsoleArg + - panicしたかどうかのフラグと、lock関連 + - console.cbcでstaticに振られていたもの + +```c +typedef struct ConsoleArg <Type, Impl> { + int panicked; + struct spinlock lock; + int locking; +} ConsoleArg; +``` + +```c +#include "param.h" +#include "proc.h" +#interface "Err.h" + +// ---- +// typedef struct KernelError <Type, Isa> impl Error { +// __code infinity_loop(Type* error, next(...)); +// } KernelError; +// ---- + +Err* createKernelError(struct Context* cbc_context) { + struct Err* err = new Err(); + struct KernelError* kernel_error = new KernelError(); + err->err = (union Data*)kernel_error; + kernel_error->err = (union Data*)kernel_error; + kernel_error->infinity_loop = C_infinity_loopKernelError; + err->error = C_errorKernelError; + err->panic = C_panicKernelError; + return err; +} + +__code infinity_loopKernelError(struct KernelError* err, __code next(...)) { + goto next(...); +} + +__code errorKernelError(struct KernelError* err, int err_code, __code next(...)) { + + goto next(...); +} + +__code panicKernelError(struct KernelError* err, char* msg, struct ConsoleArg* ca) { + extern struct cpu* cpu; + extern struct { struct spinlock lock; int locking; } cons; + + cli(); + cons.locking = 0; + + cprintf("cpu%d: panic: ", cpu->id); + + show_callstk(msg); + ca->panicked = 1; // freeze other CPU + + goto infinity_loopKernelError(err, err->inifinity_loop); +} +``` + +## うごかしてみた + +- うまくpanicできてなくて死んでいる + +``` +#0 cli () at /mnt/dalmore-home/one/src/anatofuz/CbC_xv6/src/arm.c:18 +#1 0x80032b40 in dabort_handler (r=0x87d1ddf8) at /mnt/dalmore-home/one/src/anatofuz/CbC_xv6/src/trap.c:50 +#2 0x800329b8 in trap_dabort () at /mnt/dalmore-home/one/src/anatofuz/CbC_xv6/src/trap_asm.S:133 +#3 0x80020494 in consputc (c=100) at /mnt/dalmore-home/one/build/anatofuz/xv6/CMakeFiles/kernel.dir/c/console.c:163 +#4 0x8002019c in cprintf (fmt=0x80035d78 "data abort: instruction 0x%x, fault addr 0x%x, reason 0x%x \n") + at /mnt/dalmore-home/one/build/anatofuz/xv6/CMakeFiles/kernel.dir/c/console.c:80 +#5 0x80032b68 in dabort_handler (r=0x87d1de98) at /mnt/dalmore-home/one/src/anatofuz/CbC_xv6/src/trap.c:58 +#6 0x800329b8 in trap_dabort () at /mnt/dalmore-home/one/src/anatofuz/CbC_xv6/src/trap_asm.S:133 +#7 0x80020494 in consputc (c=100) at /mnt/dalmore-home/one/build/anatofuz/xv6/CMakeFiles/kernel.dir/c/console.c:163 +#8 0x8002019c in cprintf (fmt=0x80035d78 "data abort: instruction 0x%x, fault addr 0x%x, reason 0x%x \n") + at /mnt/dalmore-home/one/build/anatofuz/xv6/CMakeFiles/kernel.dir/c/console.c:80 +#9 0x80032b68 in dabort_handler (r=0x87d1df38) at /mnt/dalmore-home/one/src/anatofuz/CbC_xv6/src/trap.c:58 +#10 0x800329b8 in trap_dabort () at /mnt/dalmore-home/one/src/anatofuz/CbC_xv6/src/trap_asm.S:133 +#11 0x80020494 in consputc (c=100) at /mnt/dalmore-home/one/build/anatofuz/xv6/CMakeFiles/kernel.dir/c/console.c:163 +#12 0x8002019c in cprintf (fmt=0x80035d78 "data abort: instruction 0x%x, fault addr 0x%x, reason 0x%x \n") + at /mnt/dalmore-home/one/build/anatofuz/xv6/CMakeFiles/kernel.dir/c/console.c:80 +#13 0x80032b68 in dabort_handler (r=0x87d1dfd8) at /mnt/dalmore-home/one/src/anatofuz/CbC_xv6/src/trap.c:58 +#14 0x800329b8 in trap_dabort () at /mnt/dalmore-home/one/src/anatofuz/CbC_xv6/src/trap_asm.S:133 +#15 0x80020494 in consputc (c=100) at /mnt/dalmore-home/one/build/anatofuz/xv6/CMakeFiles/kernel.dir/c/console.c:163 +``` + +``` +Breakpoint 1, consputc (c=105) at /mnt/dalmore-home/one/build/anatofuz/xv6/CMakeFiles/kernel.dir/c/console.c:163 +163 if (Gearef(&proc->cbc_context, ConsoleArg)->panicked) { +(gdb) p proc +$1 = (struct proc *) 0x800b8a5c <ptable+52> +(gdb) p (struct ConsoleArg)proc->cbc_context->data[D_ConsoleArg] +$5 = {ca = 0x87fe1010, panicked = -2013392800, lock = {locked = 2281574596, name = 0x87fe10dc "", cpu = 0x87fe1100, pcs = { + 2281574680, 2281574712, 2281574732, 2281574772, 2281574812, 2281574884, 2281575008, 2281575124, 2281575220, 2281575844}}, + locking = -2013391348} +(gdb) bt +``` + + +# バグ直し + +- Gearefに書き戻すところをコメントにしていた... \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/anatofuz/note/2020/02/12.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,34 @@ +# 2020/02/12 +- XV6いろいろ +- 学サポ +- os.crの設定 + + +## os.crの設定 +akatsuki側で静的にユーザーに割り振っている +- uid 666のuser + +``` + #<IpAddress:0x000055601aabe008 + id: 2514, + user_id: 666, + affiliation: "cr", + domain: "os", + assigned_address: "10.0.0.146", + mac_address: "a0:36:9f:67:6f:60", + created_at: Sat, 26 May 2018 08:10:06 UTC +00:00, + updated_at: Sat, 26 May 2018 08:14:45 UTC +00:00, + vlan: 62>, +``` + +`uid==666`はりょっかさんっぽい + +``` +[14] pry(main)> User.find_by(id:666) +=> #<User:0x000055601833f770 + id: 666, + created_at: Sat, 26 May 2018 08:02:05 UTC +00:00, + updated_at: Sat, 26 May 2018 08:02:05 UTC +00:00, + uid: "k188580", + vm_limit: 0> +``` \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/anatofuz/note/2020/02/15.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,36 @@ +# 2020/02/15 +- コンパイラ読み回 + +# Gears + +## 入出力Interface + +- IO Interfaceの方がいい気がしてきた + +``` +typedef struct IO <Type, Impl> { + __code read(Impl* io, char* addr, __code next(...)); + __code write(Impl* io, char* addr, int n, __code next(...)); + __code close(Impl* io,int fd, __code next(...)); + __code next(...); +} IO; +``` + +- `IO_File`, `IO_Pipe`みたいなのを実装したい +- `struct file`はDataGearとして定義する + - コレ自体をInterfaceとか、InterfaceのImplの引数のfieldに分解しない + - DataGearを宣言する専用の構文がほしい気がする + + +## DataGear宣言用 + +``` +typedef struct file <Data> { + int i; + ... +} file ; +``` + +## やること +- generate_contextでのstruct回収ルーチンの修正 + - parseに失敗したらskipするようにする \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/anatofuz/note/2020/03/01.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,95 @@ +# CbC LLVM + +CbCがありそうなバージョンに戻す +`hg update -r 146 -C` + +`CbC`をhとcppをターゲットに検索する + +`$rg -g '*.cpp' -g '*.h' 'CbC' -l` + +``` +include/llvm/LinkAllPasses.h +lib/IR/Core.cpp +lib/IR/LLVMContextImpl.cpp +lib/IR/ValueTypes.cpp +lib/IR/AsmWriter.cpp +lib/IR/Type.cpp +lib/IR/LLVMContextImpl.h +lib/CodeGen/TargetPassConfig.cpp +include/llvm/Target/TargetOptions.h +include/llvm/IR/Type.h +include/llvm/IR/IRBuilder.h +include/llvm/Transforms/Scalar.h +include/llvm/CodeGen/TargetPassConfig.h +lib/Target/NVPTX/NVPTXISelLowering.cpp +lib/Target/NVPTX/NVPTXAsmPrinter.cpp +lib/Target/XCore/XCoreISelLowering.cpp +lib/Target/Hexagon/HexagonTargetObjectFile.cpp +lib/ExecutionEngine/Interpreter/ExternalFunctions.cpp +lib/Bitcode/Writer/BitcodeWriter.cpp +lib/ExecutionEngine/MCJIT/MCJIT.cpp +lib/Transforms/IPO/PassManagerBuilder.cpp +lib/Transforms/Utils/FunctionComparator.cpp +lib/Transforms/Scalar/Scalar.cpp +lib/Transforms/Scalar/TailRecursionElimination.cpp +lib/Transforms/Scalar/SROA.cpp +lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp +tools/clang/tools/libclang/CIndex.cpp +tools/clang/test/SemaCXX/crashes.cpp +tools/clang/lib/Analysis/FormatString.cpp +tools/clang/lib/Frontend/CompilerInvocation.cpp +tools/clang/lib/Frontend/FrontendOptions.cpp +tools/clang/lib/Lex/Preprocessor.cpp +tools/clang/lib/Lex/PPDirectives.cpp +tools/clang/lib/Lex/Lexer.cpp +tools/clang/lib/Driver/Types.cpp +tools/clang/lib/Lex/PPLexerChange.cpp +tools/clang/lib/Serialization/ASTCommon.cpp +tools/clang/lib/Serialization/ASTReader.cpp +tools/clang/lib/Parse/ParseCbC.cpp +tools/clang/lib/Parse/ParseDecl.cpp +tools/clang/lib/Parse/ParseExpr.cpp +tools/clang/lib/Parse/ParseStmt.cpp +tools/clang/lib/Parse/CbCHelper.h +tools/clang/lib/Parse/Parser.cpp +tools/clang/lib/Parse/ParseTentative.cpp +tools/clang/lib/Sema/SemaType.cpp +tools/clang/lib/Sema/SemaTemplateVariadic.cpp +tools/clang/lib/Sema/DeclSpec.cpp +tools/clang/lib/Sema/SemaCodeComplete.cpp +tools/clang/lib/CodeGen/TargetInfo.cpp +tools/clang/lib/CodeGen/CGCall.cpp +tools/clang/lib/CodeGen/BackendUtil.cpp +tools/clang/lib/CodeGen/CodeGenTypes.cpp +tools/clang/lib/CodeGen/CGCleanup.cpp +tools/clang/lib/CodeGen/CGDebugInfo.cpp +tools/clang/lib/CodeGen/ItaniumCXXABI.cpp +tools/clang/lib/Index/USRGeneration.cpp +tools/clang/lib/AST/TypeLoc.cpp +tools/clang/lib/AST/ItaniumMangle.cpp +tools/clang/lib/AST/NSAPI.cpp +tools/clang/lib/AST/ASTContext.cpp +tools/clang/lib/AST/MicrosoftMangle.cpp +tools/clang/lib/AST/Type.cpp +tools/clang/include/clang/Lex/Lexer.h +tools/clang/include/clang/Lex/Preprocessor.h +tools/clang/include/clang/Parse/Parser.h +tools/clang/include/clang/Sema/DeclSpec.h +tools/clang/include/clang/Serialization/ASTBitCodes.h +tools/clang/include/clang/AST/Type.h +tools/clang/include/clang/AST/ASTContext.h +tools/clang/include/clang/Basic/Specifiers.h +tools/clang/include/clang/AST/CanonicalType.h +``` + +わりと書かれている + + +## 最新バージョンのCbCLLVM内のCbC + +3ファイルしかない +``` +clang/test/SemaCXX/crashes.cpp +tools/clang/lib/Parse/ParseCbC.cpp +tools/clang/lib/Parse/CbCHelper.h +``` \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/anatofuz/note/2020/03/11.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,141 @@ +# LLVMのmerge + +## とりあえずCbCがあるファイルを探す + +ripgrepでcpp, c, hなファイルを検索してperlで整形する +- 変更先は先頭のtoolsが抜けている可能性が高いので`s/^tools\///;`している + +```sh +rg -t cpp 'CbC' -c | perl -lne 's/^tools\///; s/:\d+$//; print ' > tmp +``` + +### 検索結果 + +```txt +include/llvm/LinkAllPasses.h +lib/IR/Core.cpp +lib/IR/LLVMContextImpl.cpp +lib/IR/ValueTypes.cpp +lib/CodeGen/TargetPassConfig.cpp +lib/IR/AsmWriter.cpp +lib/IR/LLVMContextImpl.h +lib/IR/Type.cpp +include/llvm/Target/TargetOptions.h +include/llvm/IR/Type.h +include/llvm/IR/IRBuilder.h +include/llvm/Transforms/Scalar.h +include/llvm/CodeGen/TargetPassConfig.h +lib/Target/NVPTX/NVPTXAsmPrinter.cpp +lib/Target/NVPTX/NVPTXISelLowering.cpp +lib/Target/XCore/XCoreISelLowering.cpp +lib/Target/Hexagon/HexagonTargetObjectFile.cpp +lib/ExecutionEngine/Interpreter/ExternalFunctions.cpp +lib/ExecutionEngine/MCJIT/MCJIT.cpp +lib/Bitcode/Writer/BitcodeWriter.cpp +lib/Transforms/IPO/PassManagerBuilder.cpp +lib/Transforms/Utils/FunctionComparator.cpp +lib/Transforms/Scalar/Scalar.cpp +lib/Transforms/Scalar/SROA.cpp +lib/Transforms/Scalar/TailRecursionElimination.cpp +clang/tools/libclang/CIndex.cpp +lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp +clang/test/SemaCXX/crashes.cpp +clang/lib/Lex/Preprocessor.cpp +clang/lib/Analysis/FormatString.cpp +clang/lib/Lex/PPDirectives.cpp +clang/lib/Lex/Lexer.cpp +clang/lib/Frontend/CompilerInvocation.cpp +clang/lib/Lex/PPLexerChange.cpp +clang/lib/Frontend/FrontendOptions.cpp +clang/lib/Driver/Types.cpp +clang/lib/Serialization/ASTCommon.cpp +clang/lib/Serialization/ASTReader.cpp +clang/lib/Parse/ParseCbC.cpp +clang/lib/Parse/ParseExpr.cpp +clang/lib/Parse/CbCHelper.h +clang/lib/Parse/ParseDecl.cpp +clang/lib/Parse/ParseStmt.cpp +clang/lib/Parse/Parser.cpp +clang/lib/Parse/ParseTentative.cpp +clang/lib/Sema/SemaTemplateVariadic.cpp +clang/lib/Sema/SemaType.cpp +clang/lib/Sema/DeclSpec.cpp +clang/lib/Sema/SemaCodeComplete.cpp +clang/lib/CodeGen/CGCall.cpp +clang/lib/CodeGen/TargetInfo.cpp +clang/lib/CodeGen/BackendUtil.cpp +clang/lib/CodeGen/CodeGenTypes.cpp +clang/lib/CodeGen/CGCleanup.cpp +clang/lib/CodeGen/ItaniumCXXABI.cpp +clang/lib/CodeGen/CGDebugInfo.cpp +clang/lib/AST/TypeLoc.cpp +clang/lib/AST/ItaniumMangle.cpp +clang/lib/AST/NSAPI.cpp +clang/lib/AST/ASTContext.cpp +clang/lib/AST/MicrosoftMangle.cpp +clang/lib/AST/Type.cpp +clang/lib/Index/USRGeneration.cpp +clang/include/clang/Lex/Lexer.h +clang/include/clang/Lex/Preprocessor.h +clang/include/clang/Parse/Parser.h +clang/include/clang/Serialization/ASTBitCodes.h +clang/include/clang/Sema/DeclSpec.h +clang/include/clang/AST/ASTContext.h +clang/include/clang/AST/Type.h +clang/include/clang/AST/CanonicalType.h +clang/include/clang/Basic/Specifiers.h +``` + +## 今のバージョンにあるファイル + +Perlで探す + +`cat ../cbc_llvm_tmp/tmp | perl -lne 'if (-f ) { print }' > found.txt` + +### 検索結果 + +```text +clang/tools/libclang/CIndex.cpp +clang/test/SemaCXX/crashes.cpp +clang/lib/Lex/Preprocessor.cpp +clang/lib/Lex/PPDirectives.cpp +clang/lib/Lex/Lexer.cpp +clang/lib/Frontend/CompilerInvocation.cpp +clang/lib/Lex/PPLexerChange.cpp +clang/lib/Frontend/FrontendOptions.cpp +clang/lib/Driver/Types.cpp +clang/lib/Serialization/ASTCommon.cpp +clang/lib/Serialization/ASTReader.cpp +clang/lib/Parse/ParseExpr.cpp +clang/lib/Parse/ParseDecl.cpp +clang/lib/Parse/ParseStmt.cpp +clang/lib/Parse/Parser.cpp +clang/lib/Parse/ParseTentative.cpp +clang/lib/Sema/SemaTemplateVariadic.cpp +clang/lib/Sema/SemaType.cpp +clang/lib/Sema/DeclSpec.cpp +clang/lib/Sema/SemaCodeComplete.cpp +clang/lib/CodeGen/CGCall.cpp +clang/lib/CodeGen/TargetInfo.cpp +clang/lib/CodeGen/BackendUtil.cpp +clang/lib/CodeGen/CodeGenTypes.cpp +clang/lib/CodeGen/CGCleanup.cpp +clang/lib/CodeGen/ItaniumCXXABI.cpp +clang/lib/CodeGen/CGDebugInfo.cpp +clang/lib/AST/TypeLoc.cpp +clang/lib/AST/ItaniumMangle.cpp +clang/lib/AST/NSAPI.cpp +clang/lib/AST/ASTContext.cpp +clang/lib/AST/MicrosoftMangle.cpp +clang/lib/AST/Type.cpp +clang/lib/Index/USRGeneration.cpp +clang/include/clang/Lex/Lexer.h +clang/include/clang/Lex/Preprocessor.h +clang/include/clang/Parse/Parser.h +clang/include/clang/Serialization/ASTBitCodes.h +clang/include/clang/Sema/DeclSpec.h +clang/include/clang/AST/ASTContext.h +clang/include/clang/AST/Type.h +clang/include/clang/AST/CanonicalType.h +clang/include/clang/Basic/Specifiers.h +```
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/anatofuz/note/2020/03/12.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,6 @@ + +``` +/mnt/dalmore-home/one/src/CbC_llvm/clang/lib/Parse/ParseCbC.cpp:9:10: fatal error: clang/Sema/PrettyDeclStackTrace.h: No such file or directory + 9 | #include "clang/Sema/PrettyDeclStackTrace.h" + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +``` \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/anatofuz/note/2020/03/14.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,48 @@ +エラーっぽい + +```text +FAILED: tools/clang/lib/Parse/CMakeFiles/obj.clangParse.dir/ParseCbC.cpp.o +/usr/local/gcc9/bin/g++ -DGTEST_HAS_RTTI=0 -D_DEBUG -D_GNU_SOURCE -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -Itools/clang/lib/Parse -I/mnt/dalmore-home/one/src/CbC_llvm/clang/lib/Parse -I/mnt/dalmore-home/one/src/CbC_llvm/clang/include -Itools/clang/include -I/usr/include/libxml2 -Iinclude -I/mnt/dalmore-home/one/src/CbC_llvm/llvm/include -fPIC -fvisibility-inlines-hidden -Werror=date-time -Wall -Wextra -Wno-unused-parameter -Wwrite-strings -Wcast-qual -Wno-missing-field-initializers -pedantic -Wno-long-long -Wimplicit-fallthrough -Wno-maybe-uninitialized -Wno-class-memaccess -Wno-redundant-move -Wno-noexcept-type -Wdelete-non-virtual-dtor -Wno-comment -fdiagnostics-color -fno-common -Woverloaded-virtual -fno-strict-aliasing -g -fno-exceptions -fno-rtti -std=c++14 -MD -MT tools/clang/lib/Parse/CMakeFiles/obj.clangParse.dir/ParseCbC.cpp.o -MF tools/clang/lib/Parse/CMakeFiles/obj.clangParse.dir/ParseCbC.cpp.o.d -o tools/clang/lib/Parse/CMakeFiles/obj.clangParse.dir/ParseCbC.cpp.o -c /mnt/dalmore-home/one/src/CbC_llvm/clang/lib/Parse/ParseCbC.cpp +/mnt/dalmore-home/one/src/CbC_llvm/clang/lib/Parse/ParseCbC.cpp: In member function 'clang::ExprResult clang::Parser::Prepare__envForGotoWithTheEnvExpr()': +/mnt/dalmore-home/one/src/CbC_llvm/clang/lib/Parse/ParseCbC.cpp:260:166: error: cannot bind rvalue reference of type 'clang::ParsedAttributes&&' to lvalue of type 'clang::ParsedAttributes' + 260 | star_DS.getRestrictSpecLoc(),star_DS.getAtomicSpecLoc(),star_DS.getUnalignedSpecLoc()),star_DS.getAttributes(),SourceLocation()); + | ~~~~~~~~~~~~~~~~~~~~~^~ +``` + +ParseCbCのそれっぽい場所 + +``` + // cast + ParsedType CastTy; + DeclSpec void_DS(AttrFactory); + setTST(&void_DS, DeclSpec::TST_void); + Declarator DeclaratorInfo(void_DS, DeclaratorContext::TypeNameContext); + DeclSpec star_DS(AttrFactory); + star_DS.Finish(Actions, Actions.getASTContext().getPrintingPolicy()); + DeclaratorInfo.ExtendWithDeclSpec(star_DS); + DeclaratorInfo.SetIdentifier(nullptr, Tok.getLocation()); + DeclaratorInfo.AddTypeInfo(DeclaratorChunk::getPointer(star_DS.getTypeQualifiers(), Loc,star_DS.getConstSpecLoc(),star_DS.getVolatileSpecLoc(), + star_DS.getRestrictSpecLoc(),star_DS.getAtomicSpecLoc(),star_DS.getUnalignedSpecLoc()),star_DS.getAttributes(),SourceLocation()); + +``` + +なんかこの関数の呼び出しで死んでそうな気がする + +`DeclaratorInfo.AddTypeInfo(DeclaratorChunk::getPointer(star_DS.getTypeQualifiers(), Loc,star_DS.getConstSpecLoc(),star_DS.getVolatileSpecLoc(),` + + +```cpp + /// AddTypeInfo - Add a chunk to this declarator. Also extend the range to + /// EndLoc, which should be the last token of the chunk. + /// This function takes attrs by R-Value reference because it takes ownership + /// of those attributes from the parameter. + void AddTypeInfo(const DeclaratorChunk &TI, ParsedAttributes &&attrs, + SourceLocation EndLoc) { + DeclTypeInfo.push_back(TI); + DeclTypeInfo.back().getAttrs().addAll(attrs.begin(), attrs.end()); + getAttributePool().takeAllFrom(attrs.getPool()); + + if (!EndLoc.isInvalid()) + SetRangeEnd(EndLoc); + } +``` \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/anatofuz/note/2020/03/17.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,6 @@ +# 今週やったこと + +- LLVMのmerge +- LLVMでの`CbCParse.cpp`のソースコード読み + - そんな出来てない +- Rakuの同人誌書く作業 \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/anatofuz/note/2020/03/19.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,31 @@ +`Actions.ClassifyName`の最後の値(`CCC`とか`Validator`とか)の型が違うとか言っている +- 型変換できないらしい + + +現在の実装でCCCに入っている値は、 ここで生成されているCCC +- 作り方は`StatementFileterCCC`みたいな感じらしい +- これへのポインタっぽい + +```cpp +StmtResult Parser::ParseStatementOrDeclarationAfterAttributes( + StmtVector &Stmts, ParsedStmtContext StmtCtx, + SourceLocation *TrailingElseLoc, ParsedAttributesWithRange &Attrs) { + const char *SemiError = nullptr; + StmtResult Res; + SourceLocation GNUAttributeLoc; + +... + + // Look up the identifier, and typo-correct it to a keyword if it's not + // found. + if (Next.isNot(tok::coloncolon)) { + // Try to limit which sets of keywords should be included in typo + // correction based on what the next token is. + StatementFilterCCC CCC(Next); + if (TryAnnotateName(&CCC) == ANK_Error) { + // Handle errors here by skipping up to the next semicolon or '}', and + // eat the semicolon if that's what stopped us. + SkipUntil(tok::r_brace, StopAtSemi | StopBeforeMatch); + if (Tok.is(tok::semi)) + ConsumeToken(); + ``` \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/anatofuz/note/2020/03/20.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,59 @@ + +`(gdb) p Tok.getIdentifierInfo()->getName()`でいまトーカナイズしている具体的なものが見える + + +```log +(gdb) s +clang::Parser::ParseDirectDeclarator (this=0xe681410, D=...) at /mnt/dalmore-home/one/src/CbC_llvm/clang/lib/Parse/ParseDecl.cpp:5861 +5861 DeclaratorScopeObj DeclScopeObj(*this, D.getCXXScopeSpec()); +(gdb) n +5863 if (getLangOpts().CPlusPlus && D.mayHaveIdentifier()) { +(gdb) n +5990 } else if (Tok.is(tok::identifier) && D.mayHaveIdentifier()) { +(gdb) +5991 assert(!getLangOpts().CPlusPlus && +(gdb) +5993 assert(Tok.getIdentifierInfo() && "Not an identifier?"); +(gdb) +5994 D.SetIdentifier(Tok.getIdentifierInfo(), Tok.getLocation()); +(gdb) p Tok.getIdentifierInfo() +$26 = (clang::IdentifierInfo *) 0xe6c0070 +(gdb) p Tok.getIdentifierInfo().getName() +Attempt to take address of value not located in memory. +(gdb) p Tok.getIdentifierInfo()->getName() +$27 = {static npos = 18446744073709551615, Data = 0xe6c0060 "__sigset_t", Length = 10} +(gdb) bt +#0 clang::Parser::ParseDirectDeclarator (this=0xe681410, D=...) at /mnt/dalmore-home/one/src/CbC_llvm/clang/lib/Parse/ParseDecl.cpp:5994 +#1 0x00000000059ac371 in clang::Parser::ParseDeclaratorInternal (this=0xe681410, D=..., DirectDeclParser= + (void (clang::Parser::*)(clang::Parser * const, clang::Declarator &)) 0x59acad0 <clang::Parser::ParseDirectDeclarator(clang::Declarator&)>) + at /mnt/dalmore-home/one/src/CbC_llvm/clang/lib/Parse/ParseDecl.cpp:5707 +#2 0x00000000059abb6a in clang::Parser::ParseDeclarator (this=0xe681410, D=...) + at /mnt/dalmore-home/one/src/CbC_llvm/clang/lib/Parse/ParseDecl.cpp:5575 +#3 0x000000000599f682 in clang::Parser::ParseDeclGroup (this=0xe681410, DS=..., Context=clang::FileContext, DeclEnd=0x7fffffffa7ec, FRI=0x0) + at /mnt/dalmore-home/one/src/CbC_llvm/clang/lib/Parse/ParseDecl.cpp:2009 +#4 0x000000000599f0de in clang::Parser::ParseSimpleDeclaration (this=0xe681410, Context=clang::FileContext, DeclEnd=..., Attrs=..., + RequireSemi=true, FRI=0x0, DeclSpecStart=0x0) at /mnt/dalmore-home/one/src/CbC_llvm/clang/lib/Parse/ParseDecl.cpp:1848 +#5 0x000000000599edb8 in clang::Parser::ParseDeclaration (this=0xe681410, Context=clang::FileContext, DeclEnd=..., attrs=..., DeclSpecStart=0x0) + at /mnt/dalmore-home/one/src/CbC_llvm/clang/lib/Parse/ParseDecl.cpp:1782 +#6 0x000000000597790d in clang::Parser::ParseExternalDeclaration (this=0xe681410, attrs=..., DS=0x0) + at /mnt/dalmore-home/one/src/CbC_llvm/clang/lib/Parse/Parser.cpp:885 +#7 0x0000000005976dd6 in clang::Parser::ParseTopLevelDecl (this=0xe681410, Result=..., IsFirstDecl=false) + at /mnt/dalmore-home/one/src/CbC_llvm/clang/lib/Parse/Parser.cpp:703 +#8 0x00000000059728d0 in clang::ParseAST (S=..., PrintStats=false, SkipFunctionBodies=false) + at /mnt/dalmore-home/one/src/CbC_llvm/clang/lib/Parse/ParseAST.cpp:158 +#9 0x0000000003ce6cf5 in clang::ASTFrontendAction::ExecuteAction (this=0xe627190) + at /mnt/dalmore-home/one/src/CbC_llvm/clang/lib/Frontend/FrontendAction.cpp:1047 +#10 0x0000000004573c9f in clang::CodeGenAction::ExecuteAction (this=0xe627190) + at /mnt/dalmore-home/one/src/CbC_llvm/clang/lib/CodeGen/CodeGenAction.cpp:1176 +#11 0x0000000003ce6661 in clang::FrontendAction::Execute (this=0xe627190) + at /mnt/dalmore-home/one/src/CbC_llvm/clang/lib/Frontend/FrontendAction.cpp:940 +#12 0x0000000003c7ecf9 in clang::CompilerInstance::ExecuteAction (this=0xe6231d0, Act=...) + at /mnt/dalmore-home/one/src/CbC_llvm/clang/lib/Frontend/CompilerInstance.cpp:969 +#13 0x0000000003e41e49 in clang::ExecuteCompilerInvocation (Clang=0xe6231d0) + at /mnt/dalmore-home/one/src/CbC_llvm/clang/lib/FrontendTool/ExecuteCompilerInvocation.cpp:292 +#14 0x0000000000a59265 in cc1_main (Argv=..., Argv0=0x7fffffffdded "/mnt/dalmore-home/one/build/anatofuz/llvm/bin/clang-11", + MainAddr=0xa4d980 <GetExecutablePath[abi:cxx11](char const*, bool)>) at /mnt/dalmore-home/one/src/CbC_llvm/clang/tools/driver/cc1_main.cpp:240 +#15 0x0000000000a4f029 in ExecuteCC1Tool (ArgV=...) at /mnt/dalmore-home/one/src/CbC_llvm/clang/tools/driver/driver.cpp:328 +#16 0x0000000000a4f723 in main (argc_=51, argv_=0x7fffffffd968) at /mnt/dalmore-home/one/src/CbC_llvm/clang/tools/driver/driver.cpp:402 +(gdb) +``` \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/anatofuz/note/2020/03/23.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,15 @@ +# 2020/03/23 + +# 昔のLLVMをビルドする +- LLVMのデバッグしてて何が正解なのかよくわからない +- 参考程度に眺めたい +- 現状のCbC_llvmはgdbで起動したらソースコードの参照ができなくなっていた + + +## ビルド方法 +- dalmoreでやる +- `$cmake` で試す + - gccが新しすぎてコンパイルできなかった +- 古めのgcc(gcc-4)くらいで試す + - dalmoreの場合は`/usr/bin/gcc`が古いgcc + - cmakeの実行時にオプションで渡しておく \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/anatofuz/note/2020/03/31.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,107 @@ +# やったこと + +- LLVMのmerge +- dalmoreにこっそりripgrepとfdをいれた +- LLVMでの`CbCParse.cpp`のソースコード読み + - そんな出来てない +- Rakuの同人誌書く作業 +- PDFから時間割の作成プログラムの整備 +- OS研究会どうしよう... + +# LLVM +- 70ちょいのファイルをひたすらコピペする作業をした +- `clang/lib/Parse/ParseCbC.cpp`と`CbCHelper.h`以外は意外とすんなり言っている + - ParseCbC.cppが結構たいへんそう + +## ParseCbC.cpp +- 大体の処理は環境付きgotoの手続き +- CodeSegmentの引数処理も存在している +- 当時の他のコードを参考にしつつ書いていたみたいだが、 バージョンアップの際にかなりAPIが変わっており変更点が多い + + + +## 現状問題になってる箇所 + + +```text +[185/1225] Building CXX object lib/Passes/CMakeFiles/LLVMPasses.dir/PassBuilder.cpp.o +FAILED: lib/Passes/CMakeFiles/LLVMPasses.dir/PassBuilder.cpp.o +/usr/local/gcc9/bin/g++ -DGTEST_HAS_RTTI=0 -D_DEBUG -D_GNU_SOURCE -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -Ilib/Passes -I/mnt/dalmore-home/one/src/CbC_llvm/llvm/lib/Passes -I/usr/include/libxml2 -Iinclude -I/mnt/dalmore-home/one/src/CbC_llvm/llvm/include -fPIC -fvisibility-inlines-hidden -Werror=date-time -Wall -Wextra -Wno-unused-parameter -Wwrite-strings -Wcast-qual -Wno-missing-field-initializers -pedantic -Wno-long-long -Wimplicit-fallthrough -Wno-maybe-uninitialized -Wno-class-memaccess -Wno-redundant-move -Wno-noexcept-type -Wdelete-non-virtual-dtor -Wno-comment -fdiagnostics-color -g -fno-exceptions -fno-rtti -std=c++14 -MD -MT lib/Passes/CMakeFiles/LLVMPasses.dir/PassBuilder.cpp.o -MF lib/Passes/CMakeFiles/LLVMPasses.dir/PassBuilder.cpp.o.d -o lib/Passes/CMakeFiles/LLVMPasses.dir/PassBuilder.cpp.o -c /mnt/dalmore-home/one/src/CbC_llvm/llvm/lib/Passes/PassBuilder.cpp +In file included from include/llvm/IR/PassManager.h:47, + from include/llvm/Analysis/TargetLibraryInfo.h:19, + from include/llvm/Analysis/LazyCallGraph.h:48, + from include/llvm/Analysis/CGSCCPassManager.h:97, + from include/llvm/Passes/PassBuilder.h:19, + from /mnt/dalmore-home/one/src/CbC_llvm/llvm/lib/Passes/PassBuilder.cpp:17: +include/llvm/IR/PassManagerInternal.h: In instantiation of 'PreservedAnalysesT llvm::detail::PassModel<IRUnitT, PassT, PreservedAnalysesT, AnalysisManagerT, ExtraArgTs>::run(IRUnitT&, AnalysisManagerT&, ExtraArgTs ...) [with IRUnitT = llvm::Module; PassT = llvm::TailCallElimPass; PreservedAnalysesT = llvm::PreservedAnalyses; AnalysisManagerT = llvm::AnalysisManager<llvm::Module>; ExtraArgTs = {}]': +include/llvm/IR/PassManagerInternal.h:77:22: required from here +include/llvm/IR/PassManagerInternal.h:79:20: error: cannot convert 'llvm::Module' to 'llvm::Function&' + 79 | return Pass.run(IR, AM, ExtraArgs...); + | ~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~ +In file included from /mnt/dalmore-home/one/src/CbC_llvm/llvm/lib/Passes/PassBuilder.cpp:170: +include/llvm/Transforms/Scalar/TailRecursionElimination.h:61:35: note: initializing argument 1 of 'llvm::PreservedAnalyses llvm::TailCallElimPass::run(llvm::Function&, llvm::FunctionAnalysisManager&)' + 61 | PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM); + | ~~~~~~~~~~^ +In file included from include/llvm/IR/PassManager.h:47, + from include/llvm/Analysis/TargetLibraryInfo.h:19, + from include/llvm/Analysis/LazyCallGraph.h:48, + from include/llvm/Analysis/CGSCCPassManager.h:97, + from include/llvm/Passes/PassBuilder.h:19, + from /mnt/dalmore-home/one/src/CbC_llvm/llvm/lib/Passes/PassBuilder.cpp:17: +include/llvm/IR/PassManagerInternal.h: In instantiation of 'PreservedAnalysesT llvm::detail::PassModel<IRUnitT, PassT, PreservedAnalysesT, AnalysisManagerT, ExtraArgTs>::run(IRUnitT&, AnalysisManagerT&, ExtraArgTs ...) [with IRUnitT = llvm::Module; PassT = llvm::SROA; PreservedAnalysesT = llvm::PreservedAnalyses; AnalysisManagerT = llvm::AnalysisManager<llvm::Module>; ExtraArgTs = {}]': +include/llvm/IR/PassManagerInternal.h:77:22: required from here +include/llvm/IR/PassManagerInternal.h:79:20: error: cannot convert 'llvm::Module' to 'llvm::Function&' + 79 | return Pass.run(IR, AM, ExtraArgs...); + | ~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~ +In file included from /mnt/dalmore-home/one/src/CbC_llvm/llvm/lib/Passes/PassBuilder.cpp:163: +include/llvm/Transforms/Scalar/SROA.h:115:35: note: initializing argument 1 of 'llvm::PreservedAnalyses llvm::SROA::run(llvm::Function&, llvm::FunctionAnalysisManager&)' + 115 | PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM); +``` + +# dalmore + +ripgrep(rg)とfdをいれました +- わりと趣味ですが... + +## ripgrep + +Rustで書かれている早いgrep + +grepみたいに使えるが、コマンド自体が再帰的に検索する + +```shell= +$rg CbC -g '*.h' -g '*.cpp' +llvm/lib/Target/NVPTX/NVPTXISelLowering.cpp +1269:#ifndef noCbC + +llvm/lib/Target/Hexagon/HexagonTargetObjectFile.cpp +333:#ifndef noCbC + +llvm/lib/Target/XCore/XCoreISelLowering.cpp +1887:#ifndef noCbC + +llvm/lib/Transforms/IPO/PassManagerBuilder.cpp +288:#ifndef noCbC +299:#ifndef noCbC +``` + +## fd + +Rustで書かれている早いfind + +```shell +$fd CbC +crdocs/CbC on LLVM.mm +clang/lib/Parse/CbCHelper.h +clang/lib/Parse/ParseCbC.cpp +``` + +# OS研究会 +- XV6の話で出す? + - 去年の坂本くんはみつきさんのreadの話 + - 一応優さんのページングのやつも出てはいる +- 今回の内容 + - Interface追加した + - これは部分的に出来ている + - モデル検査 or Agdaでの検証...? (間に合う?) + \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/anatofuz/note/2020/04/07.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,5 @@ +# 今週の進捗 +- 授業時間割の作成コマンドの作成 +- growiのバックアップ/投稿コマンドの作成 +- LDAPの障害対応 +- LLVMのコンパイルエラー取り \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/anatofuz/note/2020/04/14.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,9 @@ +# 2020/04/14 + +# OS研究会 + +## title + +「継続を用いたxv6 kernelのモジュール化」 + +## 概要 \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/anatofuz/note/2020/04/21.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,7 @@ +# + +# やったこと +- OS研究会の申し込み +- システム管周りの細々したタスク +- 自宅のインターネット強化 +- 寄稿するPerlの記事を書く作業
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/anatofuz/note/2020/04/28.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,8 @@ +# GCCのビルド +- mac環境だといろいろと大変なところがあるが、最新のGCC9だとわりとスムーズにビルドができるらしい +- CbCGCCも9にアップデート済みだった + + +# 家のインターネット +- レキオス光レジデンスからレキオス光 スマートウェイに +- あまり人が使っていない説があるが、100Mbosくらい出るようになり安心 \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/anatofuz/note/2020/05/12.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,21 @@ +# 2020/05/12 + +# xv6の構成要素の継続の分析 + +# 研究目的 +- OS自体そのものは高い信頼性が求められるが、 OSを構成するすべての処理をテストするのは困難である。 +- テストを利用する以外の手法で信頼性を高めたい。 +- OSの状態を状態遷移を基本としたモデルに変換し形式手法を用いて信頼性を高める手法を検討する +- 小さなunixであるxv6 kernelを、状態遷移を基本とした単位でのプログラミングに適したCbCで再実装を行っている +- このためには現状のxv6kernelの処理の状態遷移の分析が必要である。 + - その結果を、 継続ベースでのプログラミングに変換していく必要がある。 +- xv6kernelの構成要素の一部に着目し、状態遷移系の分析と状態遷移系を元に継続ベースでxv6の再実装を行う。 + + + +# 先週やったこと +- TA関連 +- 論文提出 +- 研究計画書を書いた +- 基幹システムの復旧 +- pro3の相談対応 \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/anatofuz/note/2020/05/19.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,24 @@ +# 2020/05/19 + +# xv6の構成要素の継続の分析 + +# 研究目的 +- OS自体そのものは高い信頼性が求められるが、 OSを構成するすべての処理をテストするのは困難である。 + - 実際に動かしてみないと解らないバグ, デッドロック問題などが存在する +- 実装の時点で信頼性を高めたい +- 実際にOS上に動くアプリケーションも、実行される前に事前にバグを検知したい +- このOSを実装する前に、 小さなOSで再実装を行う +- 小さなunixであるxv6 kernelを、状態遷移を基本とした単位でのプログラミングに適したCbCで再実装を行っている +- このためには現状のxv6kernelの処理の状態遷移の分析が必要である。 + - その結果を、 継続ベースでのプログラミングに変換していく必要がある。 +- xv6kernelの構成要素の一部に着目し、状態遷移系の分析と状態遷移系を元に継続ベースでxv6の再実装を行う。 + + + +# 先週やったこと +- TA関連 +- pro3の相談対応 +- 最後の親知らずを抜歯する +- Gearsで下記散らかしていたPerlスクリプトを整理した +- golangでインタプリタを書き始めた + - Gears(CbC)でも実装し直していますが、う〜ん... \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/anatofuz/note/2020/05/26.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,46 @@ +# 2020/05/26 + + +## bottle化 + + +```zsh ++ikoma+anatofuz$ brew install --build-bottle AnaTofuz/homebrew-ie/cbcgcc +Updating Homebrew... +==> Installing cbcgcc from anatofuz/ie +==> Cloning http://www.cr.ie.u-ryukyu.ac.jp/hg/CbC/CbC_gcc +Updating /Users/anatofuz/Library/Caches/Homebrew/cbcgcc--hg +pulling from http://www.cr.ie.u-ryukyu.ac.jp/hg/CbC/CbC_gcc +searching for changes +no changes found +0 files updated, 0 files merged, 0 files removed, 0 files unresolved +==> cd /private/tmp/cbcgcc-20200526-86302-qoy0ni;/private/tmp/cbcgcc-20200526-86302-qoy0ni/contrib/download_prerequisites +==> /private/tmp/cbcgcc-20200526-86302-qoy0ni/configure --prefix=/usr/local/Cellar/cbcgcc/10.0.1 --disable-nls --disable-bootstrap --enable-checking=tree,rtl,as +==> ./config.status +==> make -j 4 +==> make install +==> Not running post_install as we're building a bottle +You can run it manually using `brew postinstall anatofuz/ie/cbcgcc` +==> Caveats +cbcgcc is keg-only, which means it was not symlinked into /usr/local, +because Conflict with various gcc. + +If you need to have cbcgcc first in your PATH run: + echo 'export PATH="/usr/local/opt/cbcgcc/bin:$PATH"' >> ~/.zshrc + +For compilers to find cbcgcc you may need to set: + export LDFLAGS="-L/usr/local/opt/cbcgcc/lib" + +==> Summary +🍺 /usr/local/Cellar/cbcgcc/10.0.1: 674 files, 243.3MB, built in 30 minutes 37 seconds ++ikoma+anatofuz$ brew bottle AnaTofuz/homebrew-ie/cbcgcc +==> Determining anatofuz/ie/cbcgcc bottle rebuild... +==> Bottling cbcgcc--10.0.1.catalina.bottle.2.tar.gz... +==> Detecting if cbcgcc--10.0.1.catalina.bottle.2.tar.gz is relocatable... +./cbcgcc--10.0.1.catalina.bottle.2.tar.gz + bottle do + root_url "https://homebrew.bintray.com/bottles-ie" + rebuild 2 + sha256 "9465b16d6e5443290600bf9bb11c8d2c46f1d3992bcd5d56f85bd2c698e2e6eb" => :catalina + end +``` \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/anatofuz/note/2020/05/30.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,13 @@ +``` +/mnt/dalmore-home/one/src/CbC_llvm/clang/lib/Parse/ParseCbC.cpp: In member function 'clang::ExprResult clang::Parser::Prepare__envForGotoWithTheEnvExpr()': +/mnt/dalmore-home/one/src/CbC_llvm/clang/lib/Parse/ParseCbC.cpp:257:66: error: no matching function for call to 'clang::Sema::ActOnStmtExpr(clang::SourceLocatio +n&, clang::Stmt*, clang::SourceLocation&)' + 257 | Result = Actions.ActOnStmtExpr(Loc, CompoundStmtRes.get(), Loc); + | ^ +In file included from /mnt/dalmore-home/one/src/CbC_llvm/clang/include/clang/Parse/Parser.h:24, + from /mnt/dalmore-home/one/src/CbC_llvm/clang/lib/Parse/ParseCbC.cpp:3: +/mnt/dalmore-home/one/src/CbC_llvm/clang/include/clang/Sema/Sema.h:5103:14: note: candidate: 'clang::ExprResult clang::Sema::ActOnStmtExpr(clang::Scope*, clang: +:SourceLocation, clang::Stmt*, clang::SourceLocation)' + 5103 | ExprResult ActOnStmtExpr(Scope *S, SourceLocation LPLoc, Stmt *SubStmt, + | ^~~~~~~~~~~~~ +``` \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/anatofuz/note/2020/06/01.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,6 @@ +# Gearsで作りたいコマンド + +- CbCのファイルパスで自動でcを開くやつ + - ビルドが別ディレクトリの場合でも対応 +- cleanとcmakeとmakeをワンコマンドで実行する + - ビルドターゲットは引数で指定可能にしたい \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/anatofuz/note/2020/06/02.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,8 @@ +# 2020/06/02 + +# 今週の進捗 +- OS研究会 + - marpのslideテーマ作りました +- LLVMちょっとやったりしていた +- Gearsのデバッグ + - 雛形生成とビルド関連のコマンドを作りたい気がする \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/anatofuz/note/2020/06/04.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,1 @@ +# /user/anatofuz/note/2020/06/04 \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/anatofuz/note/2020/06/08.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,203 @@ +- generate_stubでpar gotoの中身を確認する + - outputがないと駄目らしい + +```sh ++ikoma+anatofuz$ make twice +[ 5%] Generating c/AtomicReference.c +[ 11%] Generating c/examples/twice/main.c +{ + code1 { + code {}, + var {} + }, + createArray { + code { + next "__code" + }, + input 0, + output 2, + var { + output "Array 0", + output1 "Timer 1" + } + }, + createTask1 { + code {}, + var {} + }, + initDataGears { + code {}, + var {} + }, + printArray { + code { + next "__code" + }, + input 2, + output 0, + var { + array "Array 0", + inputTimer "Timer 1" + } + }, + printArray1 { + code { + next "__code" + }, + input 1, + output 0, + var { + array "Array 0" + } + }, + twice { + code { + next "__code" + }, + input 2, + output 1, + var { + array "Array 0", + multiDim "MultiDim 1", + output "Array 0" + } + }, + twice_stub { + input 1, + output 0, + var { + context "Context 0" + } + } +} +{ + code1 { + code {}, + var {} + }, + createArray { + code { + next "__code" + }, + input 0, + output 2, + var { + output "Array 0", + output1 "Timer 1" + } + }, + createTask1 { + code {}, + var {} + }, + initDataGears { + code {}, + var {} + }, + printArray { + code { + next "__code" + }, + input 2, + output 0, + var { + array "Array 0", + inputTimer "Timer 1" + } + }, + printArray1 { + code { + next "__code" + }, + input 1, + output 0, + var { + array "Array 0" + } + }, + twice { + code { + next "__code" + }, + input 2, + output 1, + var { + array "Array 0", + multiDim "MultiDim 1", + output "Array 0" + } + }, + twice_stub { + input 1, + output 0, + var { + context "Context 0" + } + } +} +{ + code1 { + code {}, + var {} + }, + createArray { + code { + next "__code" + }, + input 0, + output 2, + var { + output "Array 0", + output1 "Timer 1" + } + }, + createTask1 { + code {}, + var {} + }, + initDataGears { + code {}, + var {} + }, + printArray { + code { + next "__code" + }, + input 2, + output 0, + var { + array "Array 0", + inputTimer "Timer 1" + } + }, + printArray1 { + code { + next "__code" + }, + input 1, + output 0, + var { + array "Array 0" + } + }, + twice { + code { + next "__code" + }, + input 2, + output 1, + var { + array "Array 0", + multiDim "MultiDim 1", + output "Array 0" + } + }, + twice_stub { + input 1, + output 0, + var { + context "Context 0" + } + } +} +``` \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/anatofuz/note/2020/06/09.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,3 @@ +# 2020/06/09 + +# \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/anatofuz/note/2020/06/16.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,26 @@ + +# 研究目的 + + +# 今週の進捗 +- Gearsの例題と格闘していた +- Gears/Xv6で使っているperl scriptを共通化した +- シス管関係 + - 静的サイト化 + - 投稿サイトの作成 + - スイッチ撮影会 + +# GearsTools +- Gearsのビルドで使われるPerlのツール +- 主に2種類 + - `generate_stub.pl` + - CbCで書かれたファイルを元にCファイル(実際はCbC)を作成する + - `hoge_stub`みたいなメタ計算に該当するCodeGearも生成される + - `generate_context.pl` + - context.hとproject-context.c及び各種enumを作成する + - context.hの作成時に別で作ったPerlモジュールを利用するようになっている + +# GearsToolの差分 + + +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/anatofuz/note/2020/06/21.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,80 @@ +# 2020/06/21 + +- `hoge->next`に値摘んでくれない問題 + - `generate_stub`の527行目くらいが問題そう + +```perl + } elsif (/^(.*)goto (\w+)\-\>(\w+)\((.*)\);/) { + # handling goto statement + # convert it to the meta call form with two arugments, that is context and enum Code + my $prev = $1; + my $next = $2; + my $method = $3; + my $tmpArgs = $4; + #$tmpArgs =~ s/\(.*\)/\(\)/; + my @args = split(/,/,$tmpArgs); + if (! defined $dataGearVarType{$codeGearName}) { + print $fd $_ ; + next ; + } + my @types = @{$dataGearVarType{$codeGearName}}; + my $ntype; + my $ftype; + for my $v (@{$dataGearVar{$codeGearName}}) { + my $t = shift @types; + if ($v eq $next || $v eq "O_$next") { + $ntype = $t; + $ftype = lcfirst($ntype); + } + } +``` + +- ここで`%code`の中身から次のCodeGearを取り出すなどの処理がある + - なんかデバッガでdumpしたら明らかにおかしい結果に... + - ここが関係していそう + +```perl + DB<11> p %code +{ + '' {}, + Lexer {}, + 'Lexer ' { + eat_whitespace [ + [0] "Impl* lexer", + [1] "char* ch", + [2] "__code next" + ], + next [], + next_token [ + [0] "Impl* lexer", + [1] "__code next" + ], + printtest [ + [0] "Impl* lexer", + [1] "__code next" + ], + read_char [ + [0] "Impl* lexer", + [1] "char* ch", + [2] "__code next" + ] + }, + TaskManager { + decrementTaskCount [ + [0] "Impl* taskManagerImpl", + [1] "__code next" + ], + incrementTaskCount [ + [0] "Impl* taskManagerImpl", + [1] "__code next" + ], + next [], + next1 [], + setWaitTask [ + [0] "Impl* taskManagerImpl", + [1] "Context* task", + [2] "__code next" + ], + shutdown [ + +``` \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/anatofuz/note/2020/06/23.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,95 @@ +# 2020/06/23 + +## 起こっていたこと + +``` +__code createTask1(struct LoopCounter* loopCounter, struct TaskManager* taskManager, char* arg) { + Lexer* lexer = createLexerImpl(context); + goto lexer->lex(arg, code2); +} +``` +こういうCodeGearを書いた場合次のマクロが生成されてほしい + +```c +Gearef(context, lexer)->lexer = lexer; + +``` + +- `hoge->next`に値摘んでくれない問題 + - `generate_stub`の527行目くらいが問題そう + +```perl + } elsif (/^(.*)goto (\w+)\-\>(\w+)\((.*)\);/) { + # handling goto statement + # convert it to the meta call form with two arugments, that is context and enum Code + my $prev = $1; + my $next = $2; + my $method = $3; + my $tmpArgs = $4; + #$tmpArgs =~ s/\(.*\)/\(\)/; + my @args = split(/,/,$tmpArgs); + if (! defined $dataGearVarType{$codeGearName}) { + print $fd $_ ; + next ; + } + my @types = @{$dataGearVarType{$codeGearName}}; + my $ntype; + my $ftype; + for my $v (@{$dataGearVar{$codeGearName}}) { + my $t = shift @types; + if ($v eq $next || $v eq "O_$next") { + $ntype = $t; + $ftype = lcfirst($ntype); + } + } +``` + +- ここで`%code`の中身から次のCodeGearを取り出すなどの処理がある + - なんかデバッガでdumpしたら明らかにおかしい結果に... + - ここが関係していそう + +```perl + DB<11> p %code +{ + '' {}, + Lexer {}, + 'Lexer ' { + eat_whitespace [ + [0] "Impl* lexer", + [1] "char* ch", + [2] "__code next" + ], + next [], + next_token [ + [0] "Impl* lexer", + [1] "__code next" + ], + printtest [ + [0] "Impl* lexer", + [1] "__code next" + ], + read_char [ + [0] "Impl* lexer", + [1] "char* ch", + [2] "__code next" + ] + }, + TaskManager { + decrementTaskCount [ + [0] "Impl* taskManagerImpl", + [1] "__code next" + ], + incrementTaskCount [ + [0] "Impl* taskManagerImpl", + [1] "__code next" + ], + next [], + next1 [], + setWaitTask [ + [0] "Impl* taskManagerImpl", + [1] "Context* task", + [2] "__code next" + ], + shutdown [ + +``` \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/anatofuz/note/2020/06/25.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,58 @@ +# CbCからアセンブラを呼ぶ + +- アセンブラで書かれているルーチンを`__code`で`extern`する + - そこに`goto`するだけ + +```c +extern __code swtch(struct context **old, struct context *new); + + __ncode cbc_trap_return(){ + goto swtch(&proc->context, cpu->scheduler); + } +``` + + + +# xv6 + +``` +typedef struct Syscall<Type, Impl> { + __code syscall(); +} + + + +__code dispatch() { + struct Context* kernel = kernel_context; + struct proc* proc1 = Gearef(kernel_context, proc)->now; + int num = Gearef(proc1, trapframe)->zero; + goto kernel->syscall[num](proc1); +} + + + +__code cbc_read_stub(struc Context* cbc_context) { + struct Read* read = Gearef(cbc_context, read)->read; + struct Cotnext* kernel = cbc_context->kernel_context; + + + if(argfd(0, 0, &read->f) < 0 || argint(2, &read->n) < 0 || argptr(1, &read->p, read->n) < 0) { + goto kernel->err_ret(); + } + + goto fileread(cbc_context, kernel, f, n, p, kernel->ret); +} + + + + +__code fileread(struct file* f, int n, char*p, __code next(...)) { + +} + + +__code fileread(Context* cbc_context, Context* kernel, struct file* f, int n, char* p, enum Code next) { + +} + +``` \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/anatofuz/note/2020/06/26.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,23 @@ +# システムコール呼び出し側 + +```c +__code cbc_swi_handler(struct trapframe* r) { + if (proc->killed) { + goto exit(); + } + proc->tf = r; + goto syscall->perform(); +} + +__code cbc_swi_handler_stub(struct trapframe* r) { + struct Context* proc_context = &proc->cbc_context; + struct Context* kernel = &kernel_context->context; + struct Syscall* syscall = Gearef(kernel, Syscall)->syscall; + goto cbc_swi_handler(proc_context, r, syscall); +} +``` + +こんな感じ? +- stubなので`struct Context*`だけ引数にしたい気がする + - trapframeを受け取るのは仕様上しょうがないので、stubにする意味があるのかどうか + - とはいえ構造体を受けて`__code`にわたすのはstubそのものなので悩ましい \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/anatofuz/note/2020/06/30.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,79 @@ +# 今週の進捗 +- Gearsのプロジェクトで色々実験していた +- xv6の書き換え +- シス管関係 + + +# xv6の書き換え +- システムコール周辺から書き換えていく + - `swi_handler`と`syscall`とそれ移行 + - 当分は`read`のInterface化を行う +- 読み会そろそろやるとかいう噂が + + +# xv6の書き換え方針 +- `stub`の変換などで難しそうなルーチン(`generate*`の修正が入りそうなもの)は`__ncode`で宣言する + - `__ncode`の場合はenumが生成されないので`goto meta`が現状ではできない + - ここは変換するクリプト(generate_contextを修正する必要がある) +- 引数周りはInterfaceにする +- Itnerfaceの内部で使うプライベート変数はImpl側に積んで、各`__code`内で取り出す + - 引数も別の構造体にすると良さそうだけど、そこまでまだ追求しない + +# CbCからアセンブラを呼ぶ + +- アセンブラで書かれているルーチンを`__code`で`extern`する + - そこに`goto`するだけ + +```c +extern __code swtch(struct context **old, struct context *new); + + __ncode cbc_trap_return(){ + goto swtch(&proc->context, cpu->scheduler); + } +``` + + + +# xv6 + +``` +typedef struct Syscall<Type, Impl> { + __code syscall(); +} + + + +__code dispatch() { + struct Context* kernel = kernel_context; + struct proc* proc1 = Gearef(kernel_context, proc)->now; + int num = Gearef(proc1, trapframe)->zero; + goto kernel->syscall[num](proc1); +} + + + +__code cbc_read_stub(struc Context* cbc_context) { + struct Read* read = Gearef(cbc_context, read)->read; + struct Cotnext* kernel = cbc_context->kernel_context; + + + if(argfd(0, 0, &read->f) < 0 || argint(2, &read->n) < 0 || argptr(1, &read->p, read->n) < 0) { + goto kernel->err_ret(); + } + + goto fileread(cbc_context, kernel, f, n, p, kernel->ret); +} + + + + +__code fileread(struct file* f, int n, char*p, __code next(...)) { + +} + + +__code fileread(Context* cbc_context, Context* kernel, struct file* f, int n, char* p, enum Code next) { + +} + +``` \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/anatofuz/note/2020/07/07.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,24 @@ +# 2020/07/07 + +# 研究目的 + +# 進捗 +- xv6軽く読んだ +- generate_stubの修正 +- xv6の書き換え + - systemcall呼び出し + - read systemcall + - プロセス関連 + - wakeup + - sleep + - ... + + + +# プロセス関連 +- proc.cbcの中の`__ncode`な部分を優先的に書き換えていく + + +# read system call +- 現状の`__ncode`をそのままInterfaceのAPIにする + - とりあえず分割はしないでただInterfaceに乗せるだけにする \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/anatofuz/note/2020/07/14.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,64 @@ +# 2020/07/14 + +# 研究目的 +- OSの信頼性を保証する必要がある +- 信頼性の保証にはモデル検査や定理証明を使用したい + - 継続ベースの状態遷移系で再実装することで表現しやすくしたい +- 既存のunixであるxv6をCbCで書き換えて、検証を行いやすくしたい + - kernel/user両方をCbCで実装する + + +# 進捗 +- CbC/Gears勉強会した +- Raku(Perl6)の復習 + - わりと忘れている..... +- xv6の書き換え作業 +- シス管関連 + +# CbC勉強会 +- Gearsをざっと勉強した + - 入門記事をいくつか書いてるので興味があれば見てみてください + - https://growi.cr.ie.u-ryukyu.ac.jp/Gears/introduction + +# xv6の書き換え +- `cbc_read`でスタックが積まれていた + - `bl`命令に変換されてる..... + +``` +11 LDR r1, =edata_entry +(gdb) b cbc_read +Breakpoint 1 at 0x800236b8: file /mnt/dalmore-home/one/build/cbcxv6/CMakeFiles/kernel.dir/c/sysfile.c, line 85. +(gdb) c +Continuing. + +Breakpoint 1, cbc_read (next=0x800231b4 <cbc_ret>) at /mnt/dalmore-home/one/build/cbcxv6/CMakeFiles/kernel.dir/c/sysfile.c:85 +85 if(argfd(0, 0, &f) < 0 || argint(2, &n) < 0 || argptr(1, &p, n) < 0) { +(gdb) n +88 goto cbc_fileread(f, p, n, next); +(gdb) x/20i $pc +=> 0x80023730 <cbc_read+136>: ldr r3, [r11, #-28] ; 0xffffffe4 + 0x80023734 <cbc_read+140>: str r3, [r11, #-8] + 0x80023738 <cbc_read+144>: ldr r3, [r11, #-36] ; 0xffffffdc + 0x8002373c <cbc_read+148>: str r3, [r11, #-12] + 0x80023740 <cbc_read+152>: ldr r3, [r11, #-32] ; 0xffffffe0 + 0x80023744 <cbc_read+156>: str r3, [r11, #-16] + 0x80023748 <cbc_read+160>: ldr r3, [r11, #-40] ; 0xffffffd8 + 0x8002374c <cbc_read+164>: str r3, [r11, #-20] ; 0xffffffec + 0x80023750 <cbc_read+168>: ldr r3, [r11, #-20] ; 0xffffffec + 0x80023754 <cbc_read+172>: ldr r2, [r11, #-16] + 0x80023758 <cbc_read+176>: ldr r1, [r11, #-12] + 0x8002375c <cbc_read+180>: ldr r0, [r11, #-8] + 0x80023760 <cbc_read+184>: bl 0x80020f5c <cbc_fileread> + 0x80023764 <cbc_read+188>: nop ; (mov r0, r0) + 0x80023768 <cbc_read+192>: sub sp, r11, #4 + 0x8002376c <cbc_read+196>: pop {r11, pc} + 0x80023770 <sys_read>: push {r11, lr} + 0x80023774 <sys_read+4>: add r11, sp, #4 + 0x80023778 <sys_read+8>: sub sp, sp, #16 + 0x8002377c <sys_read+12>: sub r3, r11, #8 +(gdb) bt +#0 cbc_read (next=0x800231b4 <cbc_ret>) at /mnt/dalmore-home/one/build/cbcxv6/CMakeFiles/kernel.dir/c/sysfile.c:88 +#1 0x800344f0 in trap_swi () at /mnt/dalmore-home/one/src/cbcxv6/src/trap_asm.S:30 +#2 0x000019dc in ?? () +Backtrace stopped: previous frame identical to this frame (corrupt stack?) +``` \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/anatofuz/note/2020/07/21.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,32 @@ +```perl ++dalmore+one (cd /mnt/dalmore-home/one/build/cbcxv6//CMakeFiles/kernel.dir ; perl -d /mnt/dalmore-home/one/src/cbcxv6/src/gearsTools/generate_stub.pl --project xv6 /mnt/dalmore-home/one/src/cbcxv6/src/impl/ReadSyscallImpl.cbc) + +Loading DB routines from perl5db.pl version 1.37 +Editor support available. + +Enter h or 'h h' for help, or 'man perldebug' for more help. + +main::(/mnt/dalmore-home/one/src/cbcxv6/src/gearsTools/generate_stub.pl:18): +18: our($opt_o,$opt_d,$opt_h, $opt_project); + DB<1> b 648 + DB<2> c +main::generateDataGear(/mnt/dalmore-home/one/src/cbcxv6/src/gearsTools/generate_stub.pl:648): +648: my $v = 0; + DB<2> use Data::Dumper + + DB<3> print Dumper \%localCode; +$VAR1 = { + 'consolereadReadSyscallImpl' => 1 + }; + + DB<4> c +main::generateDataGear(/mnt/dalmore-home/one/src/cbcxv6/src/gearsTools/generate_stub.pl:648): +648: my $v = 0; + DB<4> print Dumper \%localCode; +$VAR1 = { + 'consoleread1ReadSyscallImpl' => 1, + 'consolereadReadSyscallImpl' => 1 + }; + + DB<5> +``` \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/anatofuz/note/2020/07/27.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,4 @@ +# 2020/07/27 + +- そもそも`getCodeGear`はinterfaceの読み込みしかしていない模様 + - `goto hoge`の場合、`hoge.cbc`があればそれを読みに行くようになっている \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/anatofuz/note/2020/07/28.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,32 @@ +# DataGear + +context.hにある構造体が登録される仕組み + +```perl + open my $cx,"<","context.h" or die("can't open context.h $!"); + my $inUnionData = 0; + while (<$cx>) { + if (! $inUnionData) { + if ( /^union Data/) { + $inUnionData = 1; + } + next; + } + last if (/union Data end/); + if (/struct (\w+) \{/) { + $dataGear{$1} = 'struct'; + } elsif (/^\s{4}(\w+) (\w+);/) { # primitive type + my $vtype = $1; + my $vname = $2; + if (exists $dataGear{$vname}) { + next; + } + $dataGear{$vtype} = 'primitive'; + } + $dataGear{"Context"} = "struct"; + } +``` + +- デフォルトだとenumの番号で制御されている + - 今のところは型名1つだけ + - もう少し拡張性がほしい気がする \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/anatofuz/note/2020/08/04.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,19 @@ +# 2020/08/04 + +# 研究目的 +- OSの信頼性を保証する必要がある +- 信頼性の保証にはモデル検査や定理証明を使用したい + - 継続ベースの状態遷移系で再実装することで表現しやすくしたい +- 既存のunixであるxv6をCbCで書き換えて、検証を行いやすくしたい + - kernel/user両方をCbCで実装する + +# 進捗 +- lock周りの実装を調査していた + - Gears + - xv6 + - spinlock的なものをkernel_contextに実装したい +- シス管関係 + - B1と一緒に作業したり + - 障害復旧したり + - 学科サイトからHTMLをgoroutineでダウンロードするくんを書いていたりした + \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/anatofuz/note/2020/08/11.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,13 @@ +# 2020/08/11 + +# 先週 +- https://growi.cr.ie.u-ryukyu.ac.jp/user/anatofuz/note/2020/08/04 + +# 今週 +- 学サポでB2,B3にJavaとPythonでデータ分析のやつを教える + - 1日に4時間教えたりしてしんどい +- シス管関連 + - スイッチのconfigを解析するやつ等々 +- そのた + - [ARM勉強会](https://connpass.com/event/180812/)見てた + - [Tour of Rust](https://tourofrust.com/)に手を出す \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/anatofuz/note/2020/08/18.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,193 @@ +# 2020/08/18 + +# 研究目的 +- OSの信頼性を保証する必要がある +- 信頼性の保証にはモデル検査や定理証明を使用したい + - 継続ベースの状態遷移系で再実装することで表現しやすくしたい +- 既存のunixであるxv6をCbCで書き換えて、検証を行いやすくしたい + - kernel/user両方をCbCで実装する + +# 今週 +- 対島を救った +- シス管関連 + - スイッチのconfigをいい感じにパースするスクリプトを書いていた + - あとは後輩と仲良く作業とかakatsukiのとか +- Gears関連 + - 自分で書いてたほうのPerlスクリプトのリファクタ + - generate_stub.plの修正 +- Haskell,Rustの勉強 ... + +# シス管関連 +- Perlのライブコーディングをやってました +- https://gitlab.ie.u-ryukyu.ac.jp/k198584/switchConf2parsedcsv + - システム更新時にクリティカルなポートの一覧をだすくん + +# Gears関連 + +## 方針 +- localCodeに限らずmetaにgotoするのを強制する +- generate_stub側の修正を頑張る + - とりあえずparallelを優先にして、xv6はあとで + +## generate_stub.pl +- 各.cbcごとに.cを生成するくん + - スタブを生成する + - `generate_stub.pl -o hoge.c hoge.cbc`みたいに使う + - なかでパースされるのが`hoge.cbc`だけとは限らない + +### リファクタリング +- とりあえず巨大な`else`を落とす + +```diff + if ($typeName eq $implementation) { + # get implementation + $dataGearName{$codeGearName} .= "\t$typeName* $varName = ($typeName*)GearImpl($context_name, $interface, $varName);\n"; +- } else { +- # interface var +- for my $ivar (keys %{$var{$interface}}) { +- # input data gear field +- if ($varName eq $ivar) { +- if ($typeName eq $var{$interface}->{$ivar}) { +- if ($output) { +- $dataGearName{$codeGearName} .= "\t$typeName$ptrType* O_$varName = &Gearef($context_name, $interface)->$varName;\n"; +- $outputVar{$codeGearName} .= "\t$typeName$ptrType $varName __attribute__((unused)) = *O_$varName;\n"; +- return 1; +- } +- $dataGearName{$codeGearName} .= "\t$typeName$ptrType $varName = Gearef($context_name, $interface)->$varName;\n"; ++ return 1; ++ } ++ # interface var ++ for my $ivar (keys %{$var{$interface}}) { ++ # input data gear field ++ if ($varName eq $ivar) { ++ if ($typeName eq $var{$interface}->{$ivar}) { ++ if ($output) { ++ $dataGearName{$codeGearName} .= "\t$typeName$ptrType* O_$varName = &Gearef($context_name, $interface)->$varName;\n"; ++ $outputVar{$codeGearName} .= "\t$typeName$ptrType $varName __attribute__((unused)) = *O_$varName;\n"; + return 1; +``` + +### .hと.cbcのリスト + +- インターフェイスを読み込む必要が出てくるので、最初にディレクトリ下を再帰的に`.h`と`.cbc`を回収しにいく + - 一時ファイルにしようかなと思ったが、そんなに遅くなかったので実行時に最初に呼び出す方法に + +``` +sub create_interface_name_to_header_path { + my $search_root = shift; + my $files = Gears::Util->find_headers_from_path($search_root); + my $interface_name2headerpath = {}; + + for my $file (@{$files}) { + if ($file =~ m|/(\w+)\.\w+$|) { + my $file_name = $1; + $interface_name2headerpath->{$file_name} = $file; + } + } + + return $interface_name2headerpath; +} + +sub create_cbc_name_to_source_path { + my $search_root = shift; + my $files = Gears::Util->find_cbc_sources_from_path($search_root); + + my $cbc_name2_source_path = {}; + for my $file (@{$files}) { + my $cbc_name = basename $file; + $cbc_name =~ s/\.cbc//; + push(@{$cbc_name2_source_path->{$cbc_name}},$file); + } + return $cbc_name2_source_path; +} +``` + +- なんとこっそりモジュール化しつつある + +```perl +package Gears::Util; +use strict; +use warnings; +use Carp qw/croak/; +use File::Find; + +sub find_cbc_sources_from_path { + my $class = shift; + my $find_path = shift // "."; + + my @files; + find( { wanted => sub { push @files, $_ if /\.cbc/ }, no_chdir => 1 }, $find_path); + + return \@files; +} + +sub find_headers_from_path { + my $class = shift; + my $find_path = shift // "."; + + my @files; + find( { wanted => sub { push @files, $_ if /\.(?:h|dg)/ }, no_chdir => 1 }, $find_path); + + return \@files; +} +``` + +- `getDataGear`の安定感が向上しました + +```diff + } elsif(/^#interface "(.*)"/) { + # use interface + my $interfaceHeader = $1; + next if ($interfaceHeader =~ /context.h/); +- if (-f $interfaceHeader) { +- &getDataGear("$interfaceHeader"); +- &getCodeGear("$interfaceHeader"); +- } else { +- if ($filename =~ /([\w\/]+)\/(.+)$/) { +- $interfaceHeader = "$1/$interfaceHeader"; +- if (-f $interfaceHeader) { +- &getDataGear("$interfaceHeader"); +- &getCodeGear("$interfaceHeader"); +- } +- } ++ $interfaceHeader =~ m|(\w+)\.\w+$|; #remove filename extention ++ my $interfaceName = $1; ++ $call_interfaces{$filename}->{$interfaceName} = 1; ++ if (exists $interface_name_to_header_paths->{$interfaceName}) { ++ &getDataGear($interface_name_to_header_paths->{$interfaceName}); ++ &getCodeGear($interface_name_to_header_paths->{$interfaceName}); + } + +``` + +### 呼び出しもとのinterfaceの特定,使うinterfaceをuseしているかどうか + +- 今週実装予定です +- `getDataGear`で探すと良さそう + - 今までは`getDataGear`では`__code`の引数などは見てなかったので、結構修正する必要はありそう... + - interfaceのパーサーは既に実装しているので、それを呼び出すのが早いかもしれない + +```perl + } elsif(/^#interface "(.*)"/) { + # use interface + my $interfaceHeader = $1; + next if ($interfaceHeader =~ /context.h/); + $interfaceHeader =~ m|(\w+)\.\w+$|; #remove filename extention + my $interfaceName = $1; + $call_interfaces{$filename}->{$interfaceName} = 1; + if (exists $interface_name_to_header_path->{$interfaceName}) { + &getDataGear($interface_name_to_header_path->{$interfaceName}); + &getCodeGear($interface_name_to_header_path->{$interfaceName}); + } + } elsif (/^\_\_code (\w+)\((.*)\)(.*)/) { + my $codeGearName = $1; + if ($filename =~ /^(.*)\/(.*)/) { + $codeGearName = "$1/$codeGearName"; + } + if ( -f "$codeGearName.cbc") { + &getCodeGear("$codeGearName.cbc"); + } + } + next; +``` +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/anatofuz/note/2020/08/19.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,57 @@ +# use warnings対応 + +``` +Global symbol "$opt_o" requires explicit package name (did you forget to declare "my $opt_o"?) at test.pl line 8. +Global symbol "$opt_o" requires explicit package name (did you forget to declare "my $opt_o"?) at test.pl line 9. +Global symbol "$dir" requires explicit package name (did you forget to declare "my $dir"?) at test.pl line 14. +Global symbol "$dir" requires explicit package name (did you forget to declare "my $dir"?) at test.pl line 16. +Global symbol "%dataGearName" requires explicit package name (did you forget to declare "my %dataGearName"?) at test.pl line 65. +Global symbol "%dataGearVar" requires explicit package name (did you forget to declare "my %dataGearVar"?) at test.pl line 75. +Global symbol "%outputVar" requires explicit package name (did you forget to declare "my %outputVar"?) at test.pl line 76. +Global symbol "%outputArgs" requires explicit package name (did you forget to declare "my %outputArgs"?) at test.pl line 77. +Global symbol "$context_name" requires explicit package name (did you forget to declare "my $context_name"?) at test.pl line 78. +Global symbol "$context_name" requires explicit package name (did you forget to declare "my $context_name"?) at test.pl line 79. +Global symbol "$context_name" requires explicit package name (did you forget to declare "my $context_name"?) at test.pl line 83. +Global symbol "$interface" requires explicit package name (did you forget to declare "my $interface"?) at test.pl line 93. +Global symbol "%outputArgs" requires explicit package name (did you forget to declare "my %outputArgs"?) at test.pl line 111. +Global symbol "$interface" requires explicit package name (did you forget to declare "my $interface"?) at test.pl line 112. +Global symbol "$interface" requires explicit package name (did you forget to declare "my $interface"?) at test.pl line 126. +Global symbol "%dataGearName" requires explicit package name (did you forget to declare "my %dataGearName"?) at test.pl line 135. +Global symbol "$context_name" requires explicit package name (did you forget to declare "my $context_name"?) at test.pl line 135. +Global symbol "%dataGearVar" requires explicit package name (did you forget to declare "my %dataGearVar"?) at test.pl line 136. +Global symbol "%dataGearName" requires explicit package name (did you forget to declare "my %dataGearName"?) at test.pl line 137. +Global symbol "%dataGearName" requires explicit package name (did you forget to declare "my %dataGearName"?) at test.pl line 139. +Global symbol "%outputVar" requires explicit package name (did you forget to declare "my %outputVar"?) at test.pl line 142. +Global symbol "%outputVar" requires explicit package name (did you forget to declare "my %outputVar"?) at test.pl line 145. +Global symbol "$context_name" requires explicit package name (did you forget to declare "my $context_name"?) at test.pl line 149. +Global symbol "%dataGearVarType" requires explicit package name (did you forget to declare "my %dataGearVarType"?) at test.pl line 161. +Global symbol "%dataGearVarType" requires explicit package name (did you forget to declare "my %dataGearVarType"?) at test.pl line 165. +Global symbol "%dataGearVar" requires explicit package name (did you forget to declare "my %dataGearVar"?) at test.pl line 168. +Global symbol "$context_name" requires explicit package name (did you forget to declare "my $context_name"?) at test.pl line 179. +Global symbol "%code" requires explicit package name (did you forget to declare "my %code"?) at test.pl line 181. +Global symbol "$context_name" requires explicit package name (did you forget to declare "my $context_name"?) at test.pl line 194. +Global symbol "$context_name" requires explicit package name (did you forget to declare "my $context_name"?) at test.pl line 196. +Global symbol "$context_name" requires explicit package name (did you forget to declare "my $context_name"?) at test.pl line 199. +Global symbol "$context_name" requires explicit package name (did you forget to declare "my $context_name"?) at test.pl line 201. +Global symbol "$context_name" requires explicit package name (did you forget to declare "my $context_name"?) at test.pl line 205. +Global symbol "$context_name" requires explicit package name (did you forget to declare "my $context_name"?) at test.pl line 206. +Global symbol "%codeGear" requires explicit package name (did you forget to declare "my %codeGear"?) at test.pl line 214. +Global symbol "%codeGear" requires explicit package name (did you forget to declare "my %codeGear"?) at test.pl line 215. +Global symbol "$context_name" requires explicit package name (did you forget to declare "my $context_name"?) at test.pl line 231. +Global symbol "$context_name" requires explicit package name (did you forget to declare "my $context_name"?) at test.pl line 232. +Global symbol "$context_name" requires explicit package name (did you forget to declare "my $context_name"?) at test.pl line 233. +Global symbol "$context_name" requires explicit package name (did you forget to declare "my $context_name"?) at test.pl line 234. +Global symbol "$context_name" requires explicit package name (did you forget to declare "my $context_name"?) at test.pl line 235. +Global symbol "$context_name" requires explicit package name (did you forget to declare "my $context_name"?) at test.pl line 235. +Global symbol "$context_name" requires explicit package name (did you forget to declare "my $context_name"?) at test.pl line 236. +Global symbol "$context_name" requires explicit package name (did you forget to declare "my $context_name"?) at test.pl line 236. +Global symbol "$context_name" requires explicit package name (did you forget to declare "my $context_name"?) at test.pl line 237. +Global symbol "$context_name" requires explicit package name (did you forget to declare "my $context_name"?) at test.pl line 237. +Global symbol "$context_name" requires explicit package name (did you forget to declare "my $context_name"?) at test.pl line 238. +Global symbol "$context_name" requires explicit package name (did you forget to declare "my $context_name"?) at test.pl line 238. +Global symbol "$context_name" requires explicit package name (did you forget to declare "my $context_name"?) at test.pl line 242. +Global symbol "$context_name" requires explicit package name (did you forget to declare "my $context_name"?) at test.pl line 245. +Global symbol "$context_name" requires explicit package name (did you forget to declare "my $context_name"?) at test.pl line 245. +test.pl had compilation errors. +``` +こんな感じのエラーを片っ端から潰して回る \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/anatofuz/note/2020/08/20.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,78 @@ +``` +\ { + codes [ + [0] { + args "...", + name "whenEmpty" + }, + [1] { + args "Impl* stack,__code next(...)", + name "clear" + }, + [2] { + args "Impl* stack,Type* data, __code next(...)", + name "push" + }, + [3] { + args "Impl* stack, __code next(Type* data, ...)", + name "pop" + }, + [4] { + args "Impl* stack, __code next(Type* data, Type* data1, ...)", + name "pop2" + }, + [5] { + args "Impl* stack, __code next(...), __code whenEmpty(...)", + name "isEmpty" + }, + [6] { + args "Impl* stack, __code next(Type* data, ...)", + name "get" + }, + [7] { + args "Impl* stack, __code next(Type* data, Type* data1, ...)", + name "get2" + }, + [8] { + args "...", + name "next" + } + ], + content [ + [0] "union Data* stack; +", + [1] "union Data* data; +", + [2] "union Data* data1; +", + [3] "enum Code whenEmpty; +", + [4] "enum Code clear; +", + [5] "enum Code push; +", + [6] "enum Code pop; +", + [7] "enum Code pop2; +", + [8] "enum Code isEmpty; +", + [9] "enum Code get; +", + [10] "enum Code get2; +", + [11] "enum Code next; +" + ], + data [ + [0] "union Data* stack; +", + [1] "union Data* data; +", + [2] "union Data* data1; +" + ], + file_name "/Users/anatofuz/src/firefly/hg/Gears/Gears/src/parallel_execution/tools/../Stack.h", + name "Stack" +} +``` \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/anatofuz/note/2020/08/25.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,183 @@ +# generate_*.plのwarnings対応 + +- perlの場合`use warnings`すると未定義値を使ったケースなどでwarningが出るようになる + - 万能ではないけどあるとバグの検知には便利 + - もっと色々解析する場合はCPANモジュールいれる必要あるので今回はそこまでしない + - 今までのperlスクリプトには無かったので導入した + +## generate_stub.pl + +いろいろでる + +``` +\1 better written as $1 at generate_stub.pl line 523. +\1 better written as $1 at generate_stub.pl line 523. +\1 better written as $1 at generate_stub.pl line 694. +\1 better written as $1 at generate_stub.pl line 694. +\1 better written as $1 at generate_stub.pl line 698. +\1 better written as $1 at generate_stub.pl line 698. +Scalar value @dataGears[...] better written as $dataGears[...] at generate_stub.pl line 630. +Scalar value @dataGears[...] better written as $dataGears[...] at generate_stub.pl line 633. +Use of uninitialized value $1 in string ne at generate_stub.pl line 174, <$fd> line 4. +Use of uninitialized value $structType in pattern match (m//) at generate_stub.pl line 240, <$fd> line 5. +Use of uninitialized value $structType in pattern match (m//) at generate_stub.pl line 240, <$fd> line 5. +Use of uninitialized value $structType in pattern match (m//) at generate_stub.pl line 240, <$fd> line 6. +Use of uninitialized value $const_type in pattern match (m//) at generate_stub.pl line 197, <$fd> line 2. +Use of uninitialized value $const_type in pattern match (m//) at generate_stub.pl line 197, <$fd> line 2. +Use of uninitialized value $const_type in pattern match (m//) at generate_stub.pl line 197, <$fd> line 3. +Use of uninitialized value $const_type in pattern match (m//) at generate_stub.pl line 197, <$fd> line 3. +Use of uninitialized value $const_type in pattern match (m//) at generate_stub.pl line 197, <$fd> line 4. +Use of uninitialized value $const_type in pattern match (m//) at generate_stub.pl line 197, <$fd> line 4. +Use of uninitialized value $const_type in pattern match (m//) at generate_stub.pl line 197, <$fd> line 5. +Use of uninitialized value $const_type in pattern match (m//) at generate_stub.pl line 197, <$fd> line 5. +Use of uninitialized value $const_type in pattern match (m//) at generate_stub.pl line 197, <$fd> line 6. +Use of uninitialized value $const_type in pattern match (m//) at generate_stub.pl line 197, <$fd> line 6. +Use of uninitialized value $const_type in pattern match (m//) at generate_stub.pl line 197, <$fd> line 7. +Use of uninitialized value $const_type in pattern match (m//) at generate_stub.pl line 197, <$fd> line 7. +Use of uninitialized value $structType in pattern match (m//) at generate_stub.pl line 240, <$fd> line 2. +Use of uninitialized value $structType in pattern match (m//) at generate_stub.pl line 240, <$fd> line 3. +Use of uninitialized value $structType in pattern match (m//) at generate_stub.pl line 240, <$fd> line 4. +Use of uninitialized value $structType in pattern match (m//) at generate_stub.pl line 240, <$fd> line 5. +Use of uninitialized value $structType in pattern match (m//) at generate_stub.pl line 240, <$fd> line 6. +Use of uninitialized value $structType in pattern match (m//) at generate_stub.pl line 240, <$fd> line 7. +Reference found where even-sized list expected at generate_stub.pl line 423, <$in> line 57. +Use of uninitialized value $structType in pattern match (m//) at generate_stub.pl line 496, <$in> line 57. +Reference found where even-sized list expected at generate_stub.pl line 423, <$in> line 68. +Reference found where even-sized list expected at generate_stub.pl line 423, <$in> line 77. +Reference found where even-sized list expected at generate_stub.pl line 423, <$in> line 91. +``` + +- わりと細々した修正がほとんど + +```diff + } elsif (! $inCode) { +- s/new\s+(\w+)\(\)/\&ALLOCATE(${context_name}, \1)->\1/g; # replacing new ++ s/new\s+(\w+)\(\)/\&ALLOCATE(${context_name}, $1)->$1/g; # replacing new + print $fd $_; + next; + } elsif (/^(.*)goto (\w+)\-\>(\w+)\((.*)\);/) { +@@ -626,10 +633,10 @@ + print $fd "${prev}GET_META($dataGear)->wait = createSynchronizedQueue(${context_name});\n"; + } + for my $i (0..$inputCount-1) { +- print $fd "${prev}${context_name}\->task->data[${context_name}\->task->idg+$i] = (union Data*)@dataGears[$i];\n"; ++ print $fd "${prev}${context_name}\->task->data[${context_name}\->task->idg+$i] = (union Data*)$dataGears[$i];\n"; + } + for my $i (0..$outputCount-1) { +- print $fd "${prev}${context_name}\->task->data[${context_name}\->task->odg+$i] = (union Data*)@dataGears[$inputCount+$i];\n"; ++ print $fd "${prev}${context_name}\->task->data[${context_name}\->task->odg+$i] = (union Data*)$dataGears[$inputCount+$i];\n"; + } +``` + +- interfaceの実装をしていた場合に生成するStub関連で未定義値(`$interface`)がよく使われていたらしい + +```perl + # interface var + for my $ivar (keys %{$var{$interface}}) { + # input data gear field + if ($varName eq $ivar) { + if ($typeName eq $var{$interface}->{$ivar}) { + if ($output) { + $dataGearName{$codeGearName} .= "\t$typeName$ptrType* O_$varName = &Gearef($context_name, $interface)->$varName;\n"; + $outputVar{$codeGearName} .= "\t$typeName$ptrType $varName __attribute__((unused)) = *O_$varName;\n"; + return 1; + } + $dataGearName{$codeGearName} .= "\t$typeName$ptrType $varName = Gearef($context_name, $interface)->$varName;\n"; + return 1; + } + } + } + + # interface continuation + for my $cName (keys %{$code{$interface}}) { + if ($varName eq $cName) { + # continuation field + $dataGearName{$codeGearName} .= "\tenum Code $varName = Gearef($context_name, $interface)->$varName;\n"; + return 1; + } + } +``` + +- まとめてサブルーチン化して丁寧に条件を確認する方法に変えた + +```perl +sub generateImplStubArgs { + my ($codeGearName, $varName, $typeName, $ptrType, $output, $interfaceName, $isImpl) = @_; + return 0 unless $isImpl; + for my $ivar (keys %{$var{$interfaceName}}) { + # input data gear field + if ($varName eq $ivar) { + if ($typeName eq $var{$interfaceName}->{$ivar}) { + if ($output) { + $dataGearName{$codeGearName} .= "\t$typeName$ptrType* O_$varName = &Gearef($context_name, $interfaceName)->$varName;\n"; + $outputVar{$codeGearName} .= "\t$typeName$ptrType $varName __attribute__((unused)) = *O_$varName;\n"; + return 1; + } + $dataGearName{$codeGearName} .= "\t$typeName$ptrType $varName = Gearef($context_name, $interfaceName)->$varName;\n"; + return 1; + } + } + } + + # interface continuation + for my $cName (keys %{$code{$interfaceName}}) { + if ($varName eq $cName) { + # continuation field + $dataGearName{$codeGearName} .= "\tenum Code $varName = Gearef($context_name, $interfaceName)->$varName;\n"; + return 1; + } + } +} +``` + +## generate_context.pl + +- ファイルハンドルの使い回しが原因 + - せっかくなのでサブルーチン化した +- before + +```perl + $codeGear{"start_code"} = "$ddir/$name-context.c"; + $codeGear{"exit_code"} = "$ddir/$name-context.c"; + $mCodeGear{"start_code"} = "$ddir/$name-context.c"; + $mCodeGear{"exit_code"} = "$ddir/$name-context.c"; + open my $fd,">","$ddir/extern.h" or die("can't open $ddir/extern.h $!"); + for my $code ( sort keys %codeGear ) { + print $fd "extern __code ${code}_stub(struct Context*);\n"; + } + for my $impl ( sort keys %constructor ) { + my ($interface, $constructorArgs) = @{$constructor{$impl}}; + print $fd "extern ${interface}* create${impl}($constructorArgs);\n"; + } + print $fd "\n"; + + open my $fd,">","$ddir/enumCode.h" or die("can't open $ddir/enumCode.h $!"); + print $fd "enum Code {\n"; + for my $code ( sort keys %codeGear ) { + print $fd " C_${code},\n"; + } + print $fd "};\n"; + + my $code_init = ''; + for my $code ( sort keys %mCodeGear ) { + $code_init .= " ${context_name}->code[C_${code}] = ${code}_stub;\n"; + } +``` + +- After + +```perl +sub generateContext { + $codeGear{"start_code"} = "$ddir/$name-context.c"; + $codeGear{"exit_code"} = "$ddir/$name-context.c"; + $mCodeGear{"start_code"} = "$ddir/$name-context.c"; + $mCodeGear{"exit_code"} = "$ddir/$name-context.c"; + + generateExtern(); + generateEnumCode(); + generateContextCsource(); + generateEnumData(); + generateTypedefData(); + generateDataGearInit(); +} +``` \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/anatofuz/note/2020/09/08.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,82 @@ +# 2020/09/08 + +# 最近 +- シス管関連 + - LDAPの構築 + - radius + - その他ansible +- Gears + - Interfaceの実装を満たしていないとエラーを出す + - コンストラクタの自動生成 + - Interfaceの実装の名前空間の実装 + +# Gears Interface + +- 満たしていないmethodが生えているとコンパイルタイムでエラーを出す + - Interfaceの実装のファイルの場合、実装したメソッドを数え上げている + +``` +$ make pop_and_push +[ 7%] Generating c/examples/pop_and_push/StackTestImpl3.c +[ERROR] Not define insertTest4 at examples/pop_and_push/StackTestImpl3.cbc +make[3]: *** [c/examples/pop_and_push/StackTestImpl3.c] Error 255 +make[2]: *** [CMakeFiles/pop_and_push.dir/all] Error 2 +make[1]: *** [CMakeFiles/pop_and_push.dir/rule] Error 2 +make: *** [pop_and_push] Error 2 +``` + +- generate_stubの初回のcbcの読み込み時に数え上げと判定を行う + - 実装するべきCodeGearをパターンマッチする愚直な実装 + +```perl + if ($implInterfaceInfo->{isImpl}) { + for my $shouldImplCode (map { $_->{name} } @{$implInterfaceInfo->{parsedInterfaceInfo}->{codes}}) { + my $isDefine = $shouldImplCode; + for my $implCode (keys %{$codeGearInfo}) { + if ($implCode =~ /$shouldImplCode/) { + $isDefine = 1; + next; + } + } + + if ($isDefine ne 1) { + die "[ERROR] Not define $isDefine at $filename\n"; + } + } + } +``` + +# 名前空間の実装 + +- InterfaceのImplの際に`popSingleLinkedStack`などの様な`__code {interfaceMethod}{ImplType}`の命名規則が敷かれている + - 他の言語(eg, java, golang, Rust, Haskell)等では実装名が関数名に付随することはあまりない + - このあたりはコンパイラ側が吸収しているはず + - 現状は手で書く or `trans_impl.pl`でInterfaceの名前と実装の方名から`.cbc`を自動生成するアプローチ + - 実装はInteraceのCodeGearの名前で書いて、命名規則の変換を`generate_stub`のタイミングで行いたい + +- 新しい記法`#impl`を導入した + +# Gears コンストラクタの自動生成 + +- `#impl`キーワードを定義 + +```perl + } elsif(/^#impl "(.*)"/) { + next unless ($implInterfaceInfo->{genConstructor}); + + my $constructInterface = { + name => $implInterfaceInfo->{interface}, + path => $headerNameToInfo->{$implInterfaceInfo->{interface}}->{path} + }; + + my $constructImpl = { + name => $implInterfaceInfo->{implementation}, + path => $headerNameToInfo->{$implInterfaceInfo->{implementation}}->{path} + }; + + unless ($constructImpl->{path}) { + warn "[WARN] Not found $constructImpl->{name}.h"; + } + print $fd Gears::Stub->generate_constructor($constructInterface, $constructImpl); + next; +``` \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/anatofuz/note/2020/09/15.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,38 @@ +# 2020/09/08 + +# 研究目的 +- OSの信頼性を保証する必要がある +- テストでOSのすべての状態を表現するのは困難 + - デッドロック問題やマルチスレッドに起因するバグなど、動かさないとわからないものがある +- 定理証明やモデル検査を利用して、テストに頼らずに保証したい + - 継続ベースの状態遷移系で再実装することで表現しやすくしたい +- 既存のunixであるxv6をCbCで書き換えて、検証を行いやすくしたい + - kernel/user両方をCbCで実装する + + +# 先週-今週 +- ひたすらシス管周り + - LDAP + - FreeRadius関連 + - wifi対応 + - kvm移植 + - ceph関連 +- Gearsは次は何をしようかなぁと考えています + - いよいよxv6に戻るか、par goto早くするかみたいな + +# LDAP +- nakagusukuがubuntuのLDAPサーバーから全然同期しない + - とりあえずバックアップから復旧 +- ldapsで通信する必要がある環境が多いので、nakagusuku, nishihara対応のLDAPサーバーを作成 + - 証明書を転送してnakagusuku, nishiharaは止める + +# FreeRadius +- LDAPと同じubuntuサーバー上に作成 + - dockerで動かしたいみたいな話もあるが、とりあえずKVMで +- DHCPもやっているので、DHCPを切った状態で動かしている + - nishiharaを止めるタイミングでDHCPを有効化する + +# KVM +- 次期システム2台に構築 + - 現システムから転送を開始しはじめる + \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/anatofuz/note/2020/10/20.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,15 @@ +# 2020/10/20 + +# 研究目的 +- アプリケーションの信頼性を保証するには土台となるOSの信頼性を高く保証する必要がある + - しかしOSの機能をテストですべて検証するのは不可能である。 +- 定理証明やモデル検査を利用して、テストに頼らずに保証したい + - 証明しやすい形、かつ実際に動くソースコードが必要 + - 継続ベースの状態遷移系で再実装することで表現しやすくしたい +- プログラムは二つの計算に分離される + - プログラムは入力と出力の関係を決める計算(ノーマルレベル) + - その計算に必要なメタな計算(メタレベル) +- プログラムの信頼性の保証を動作しつつ行うには、メタレベルの計算を活用したい +- そのためにはメタレベルの計算を柔軟に扱うAPIや実装方法が必要 +- 本研究ではノーマル/メタレベルでの実装に適した、継続を基本とする言語Continuation Based Cを用いて、OSの実装を行い、メタ計算APIについて考察する。 + \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/anatofuz/note/2020/10/27.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,30 @@ +# 2020/10/20 + +# 研究目的 +- アプリケーションの信頼性を保証するには土台となるOSの信頼性を高く保証する必要がある + - しかしOSの機能をテストですべて検証するのは不可能である。 +- 定理証明やモデル検査を利用して、テストに頼らずに保証したい + - 証明しやすい形、かつ実際に動くソースコードが必要 + - 継続ベースの状態遷移系で再実装することで表現しやすくしたい +- プログラムは二つの計算に分離される + - プログラムは入力と出力の関係を決める計算(ノーマルレベル) + - その計算に必要なメタな計算(メタレベル) +- プログラムの信頼性の保証を動作しつつ行うには、メタレベルの計算を活用したい +- そのためにはメタレベルの計算を柔軟に扱うAPIや実装方法が必要 +- 本研究ではノーマル/メタレベルでの実装に適した、継続を基本とする言語Continuation Based Cを用いて、OSの実装を行い、メタ計算APIについて考察する。 + + +# 今週 +- シス管周りいろいろ + - podmanを使えるようにする初期設定コマンドを書いたりした + - 結局使わない方向で + - 無駄にRustでCLIツールを実装していて、色々知見が溜まってきている + - B1とpukiwikiの復旧周りのタスク + - とりあえず学科のweb周りがどう動いているかの説明等 +- Rust + - Rust忘れてたのでRustlingsやってた + - https://github.com/rust-lang/rustlings + +# Gears系 +- par gotoの高速化ちょっとやろうかなみたいな気持ち + - その前にcontextへの書き戻しを検知 or 構文で書き戻しを禁止したい気がする \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/anatofuz/note/2020/11/03.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,28 @@ +# 2020/11/03 + +# 研究目的 +- アプリケーションの信頼性を保証するには土台となるOSの信頼性を高く保証する必要がある + - しかしOSの機能をテストですべて検証するのは不可能である。 +- 定理証明やモデル検査を利用して、テストに頼らずに保証したい + - 証明しやすい形、かつ実際に動くソースコードが必要 + - 継続ベースの状態遷移系で再実装することで表現しやすくしたい +- プログラムは二つの計算に分離される + - プログラムは入力と出力の関係を決める計算(ノーマルレベル) + - その計算に必要なメタな計算(メタレベル) +- プログラムの信頼性の保証を動作しつつ行うには、メタレベルの計算を活用したい +- そのためにはメタレベルの計算を柔軟に扱うAPIや実装方法が必要 +- 本研究ではノーマル/メタレベルでの実装に適した、継続を基本とする言語Continuation Based Cを用いて、OSの実装を行い、メタ計算APIについて考察する。 + + +# 今週 +- 奨学金の免除申請の書類が来たので作文をすることに + - 業績系いろいろ書かないと... + - 指導教員の推薦の作文がありますがどうしましょう... +- ie-virshの実装 + - 大体Rustで実装終わった + - あと`define-gdb`のport問題だけ解決すればなんとかなる + - http://www.cr.ie.u-ryukyu.ac.jp/hg/Members/anatofuz/ie-virsh/ + - https://gitlab.ie.u-ryukyu.ac.jp/k198584/ie-virsh + - c + python2 から rust単体へ... + - 特にRustでやった深い意味はない(やってみたかっただけ) +- そろそろGearsの研究を再開するので、直前までなにやってたかを思い出しつつ色々 \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/anatofuz/note/2020/11/10.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,25 @@ +# 2020/11/10 + +# 研究目的 +- アプリケーションの信頼性を保証するには土台となるOSの信頼性を高く保証する必要がある + - しかしOSの機能をテストですべて検証するのは不可能である。 +- 定理証明やモデル検査を利用して、テストに頼らずに保証したい + - 証明しやすい形、かつ実際に動くソースコードが必要 + - 継続ベースの状態遷移系で再実装することで表現しやすくしたい +- プログラムは二つの計算に分離される + - プログラムは入力と出力の関係を決める計算(ノーマルレベル) + - その計算に必要なメタな計算(メタレベル) +- プログラムの信頼性の保証を動作しつつ行うには、メタレベルの計算を活用したい +- そのためにはメタレベルの計算を柔軟に扱うAPIや実装方法が必要 +- 本研究ではノーマル/メタレベルでの実装に適した、継続を基本とする言語Continuation Based Cを用いて、OSの実装を行い、メタ計算APIについて考察する。 + + +# 今週 +- 奨学金の免除申請の書類が来たので作文をすることに + - 業績系いろいろ書かないと... + - 指導教員の推薦の作文がありますがどうしましょう... + +- アシャリフ先生のpukiwiki置換 + - ひたすらperlを書いてeuc-jpにキレる世界観 + +- https://gitlab.ie.u-ryukyu.ac.jp/os/2020/k198584/filewrite \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/anatofuz/note/2020/11/17.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,113 @@ +試しに`arm-none-gcc`を使ってみる + +```c +#include <stdio.h> + +int main(){ + char* msg = "Hello, World!"; + + for (int i = 0; i < 10; i++) { + printf("number: %d, msg: %s\n", i, msg); + } + + return 0; +} +``` + +```shell ++firefly+one arm-none-eabi-gcc hello.c +/usr/local/Cellar/arm-none-eabi-gcc/9-2020-q2-update/gcc/bin/../lib/gcc/arm-none-eabi/9.3.1/../../../../arm-none-eabi/bin/ld: /usr/local/Cellar/arm-none-eabi-gcc/9-2020-q2-update/gcc/bin/../lib/gcc/arm-none-eabi/9.3.1/../../../../arm-none-eabi/lib/libc.a(lib_a-exit.o): in function `exit': +exit.c:(.text.exit+0x2c): undefined reference to `_exit' +/usr/local/Cellar/arm-none-eabi-gcc/9-2020-q2-update/gcc/bin/../lib/gcc/arm-none-eabi/9.3.1/../../../../arm-none-eabi/bin/ld: /usr/local/Cellar/arm-none-eabi-gcc/9-2020-q2-update/gcc/bin/../lib/gcc/arm-none-eabi/9.3.1/../../../../arm-none-eabi/lib/libc.a(lib_a-sbrkr.o): in function `_sbrk_r': +sbrkr.c:(.text._sbrk_r+0x18): undefined reference to `_sbrk' +/usr/local/Cellar/arm-none-eabi-gcc/9-2020-q2-update/gcc/bin/../lib/gcc/arm-none-eabi/9.3.1/../../../../arm-none-eabi/bin/ld: /usr/local/Cellar/arm-none-eabi-gcc/9-2020-q2-update/gcc/bin/../lib/gcc/arm-none-eabi/9.3.1/../../../../arm-none-eabi/lib/libc.a(lib_a-writer.o): in function `_write_r': +writer.c:(.text._write_r+0x28): undefined reference to `_write' +/usr/local/Cellar/arm-none-eabi-gcc/9-2020-q2-update/gcc/bin/../lib/gcc/arm-none-eabi/9.3.1/../../../../arm-none-eabi/bin/ld: /usr/local/Cellar/arm-none-eabi-gcc/9-2020-q2-update/gcc/bin/../lib/gcc/arm-none-eabi/9.3.1/../../../../arm-none-eabi/lib/libc.a(lib_a-closer.o): in function `_close_r': +closer.c:(.text._close_r+0x18): undefined reference to `_close' +/usr/local/Cellar/arm-none-eabi-gcc/9-2020-q2-update/gcc/bin/../lib/gcc/arm-none-eabi/9.3.1/../../../../arm-none-eabi/bin/ld: /usr/local/Cellar/arm-none-eabi-gcc/9-2020-q2-update/gcc/bin/../lib/gcc/arm-none-eabi/9.3.1/../../../../arm-none-eabi/lib/libc.a(lib_a-fstatr.o): in function `_fstat_r': +fstatr.c:(.text._fstat_r+0x20): undefined reference to `_fstat' +/usr/local/Cellar/arm-none-eabi-gcc/9-2020-q2-update/gcc/bin/../lib/gcc/arm-none-eabi/9.3.1/../../../../arm-none-eabi/bin/ld: /usr/local/Cellar/arm-none-eabi-gcc/9-2020-q2-update/gcc/bin/../lib/gcc/arm-none-eabi/9.3.1/../../../../arm-none-eabi/lib/libc.a(lib_a-isattyr.o): in function `_isatty_r': +isattyr.c:(.text._isatty_r+0x18): undefined reference to `_isatty' +/usr/local/Cellar/arm-none-eabi-gcc/9-2020-q2-update/gcc/bin/../lib/gcc/arm-none-eabi/9.3.1/../../../../arm-none-eabi/bin/ld: /usr/local/Cellar/arm-none-eabi-gcc/9-2020-q2-update/gcc/bin/../lib/gcc/arm-none-eabi/9.3.1/../../../../arm-none-eabi/lib/libc.a(lib_a-lseekr.o): in function `_lseek_r': +lseekr.c:(.text._lseek_r+0x28): undefined reference to `_lseek' +/usr/local/Cellar/arm-none-eabi-gcc/9-2020-q2-update/gcc/bin/../lib/gcc/arm-none-eabi/9.3.1/../../../../arm-none-eabi/bin/ld: /usr/local/Cellar/arm-none-eabi-gcc/9-2020-q2-update/gcc/bin/../lib/gcc/arm-none-eabi/9.3.1/../../../../arm-none-eabi/lib/libc.a(lib_a-readr.o): in function `_read_r': +readr.c:(.text._read_r+0x28): undefined reference to `_read' +/usr/local/Cellar/arm-none-eabi-gcc/9-2020-q2-update/gcc/bin/../lib/gcc/arm-none-eabi/9.3.1/../../../../arm-none-eabi/bin/ld: /usr/local/Cellar/arm-none-eabi-gcc/9-2020-q2-update/gcc/bin/../lib/gcc/arm-none-eabi/9.3.1/../../../../arm-none-eabi/lib/libc.a(lib_a-abort.o): in function `abort': +abort.c:(.text.abort+0x10): undefined reference to `_exit' +/usr/local/Cellar/arm-none-eabi-gcc/9-2020-q2-update/gcc/bin/../lib/gcc/arm-none-eabi/9.3.1/../../../../arm-none-eabi/bin/ld: /usr/local/Cellar/arm-none-eabi-gcc/9-2020-q2-update/gcc/bin/../lib/gcc/arm-none-eabi/9.3.1/../../../../arm-none-eabi/lib/libc.a(lib_a-signalr.o): in function `_kill_r': +signalr.c:(.text._kill_r+0x20): undefined reference to `_kill' +/usr/local/Cellar/arm-none-eabi-gcc/9-2020-q2-update/gcc/bin/../lib/gcc/arm-none-eabi/9.3.1/../../../../arm-none-eabi/bin/ld: /usr/local/Cellar/arm-none-eabi-gcc/9-2020-q2-update/gcc/bin/../lib/gcc/arm-none-eabi/9.3.1/../../../../arm-none-eabi/lib/libc.a(lib_a-signalr.o): in function `_getpid_r': +signalr.c:(.text._getpid_r+0x4): undefined reference to `_getpid' +collect2: error: ld returned 1 exit status +``` + +なんかlinkerで死んでる + +アセンブラはなんかできてるっぽい + +```asm + .cpu arm7tdmi + .eabi_attribute 20, 1 + .eabi_attribute 21, 1 + .eabi_attribute 23, 3 + .eabi_attribute 24, 1 + .eabi_attribute 25, 1 + .eabi_attribute 26, 1 + .eabi_attribute 30, 6 + .eabi_attribute 34, 0 + .eabi_attribute 18, 4 + .file "hello.c" + .text + .section .rodata + .align 2 +.LC0: + .ascii "Hello, World!\000" + .align 2 +.LC1: + .ascii "number: %d, msg: %s\012\000" + .text + .align 2 + .global main + .arch armv4t + .syntax unified + .arm + .fpu softvfp + .type main, %function +main: + @ Function supports interworking. + @ args = 0, pretend = 0, frame = 8 + @ frame_needed = 1, uses_anonymous_args = 0 + push {fp, lr} + add fp, sp, #4 + sub sp, sp, #8 + ldr r3, .L5 + str r3, [fp, #-12] + mov r3, #0 + str r3, [fp, #-8] + b .L2 +.L3: + ldr r2, [fp, #-12] + ldr r1, [fp, #-8] + ldr r0, .L5+4 + bl printf + ldr r3, [fp, #-8] + add r3, r3, #1 + str r3, [fp, #-8] +.L2: + ldr r3, [fp, #-8] + cmp r3, #9 + ble .L3 + mov r3, #0 + mov r0, r3 + sub sp, fp, #4 + @ sp needed + pop {fp, lr} + bx lr +.L6: + .align 2 +.L5: + .word .LC0 + .word .LC1 + .size main, .-main + .ident "GCC: (GNU Arm Embedded Toolchain 9-2020-q2-update) 9.3.1 20200408 (release)" +``` \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/anatofuz/note/2020/11/24.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,106 @@ +# 研究目的 +- アプリケーションの信頼性を保証するには土台となるOSの信頼性を高く保証する必要がある + - しかしOSの機能をテストですべて検証するのは不可能である。 +- 定理証明やモデル検査を利用して、テストに頼らずに保証したい + - 証明しやすい形、かつ実際に動くソースコードが必要 + - 継続ベースの状態遷移系で再実装することで表現しやすくしたい +- プログラムは二つの計算に分離される + - プログラムは入力と出力の関係を決める計算(ノーマルレベル) + - その計算に必要なメタな計算(メタレベル) +- プログラムの信頼性の保証を動作しつつ行うには、メタレベルの計算を活用したい +- そのためにはメタレベルの計算を柔軟に扱うAPIや実装方法が必要 +- 本研究ではノーマル/メタレベルでの実装に適した、継続を基本とする言語Continuation Based Cを用いて、OSの実装を行い、メタ計算APIについて考察する。 + + +# 最近 +- 楽しくなってie-virshの実装を進めていた +- Gearsはコンストラクタ生成周りいじってました + - SingleLinkedStackのコンストラクタを自動生成するように +- あとは松岡くんとかとPerl書いてました + +# Gears + +変換前 + +```c +#include "../context.h" +#include <stdio.h> + +#impl "Stack.h" for "SingleLinkedStack.h" +#data "Node.h" + + +void printStack1(union Data* data) { + struct Node* node = &data->Element.data->Node; + if (node == NULL) { + printf("NULL"); + } else { + printf("key = %d ,", node->key); + printStack1((union Data*)data->Element.next); + } +} +``` + +変換後 + +```c +#include "../context.h" +#include <stdio.h> + +Stack* createSingleLinkedStack(struct Context* context) { + struct Stack* stack = &ALLOCATE(context, Stack)->Stack; + struct SingleLinkedStack* single_linked_stack = &ALLOCATE(context, SingleLinkedStack)->SingleLinkedStack; + stack->stack = (union Data*)single_linked_stack; + stack->data = NULL; + stack->data1 = NULL; + single_linked_stack->top = NULL; + stack->clear = C_clearSingleLinkedStack; + stack->push = C_pushSingleLinkedStack; + stack->pop = C_popSingleLinkedStack; + stack->pop2 = C_pop2SingleLinkedStack; + stack->isEmpty = C_isEmptySingleLinkedStack; + stack->get = C_getSingleLinkedStack; + stack->get2 = C_get2SingleLinkedStack; + return stack; +} +// include "Node.h" + +void printStack1(union Data* data) { + struct Node* node = &data->Element.data->Node; + if (node == NULL) { + printf("NULL"); + } else { + printf("key = %d ,", node->key); + printStack1((union Data*)data->Element.next); + } +} +``` + +生成時にはもとのInterfaceファイルと実装の型のヘッダを見に行く + +- Interface + +```c +typedef struct Stack<Type, Impl>{ + __code clear(Impl* stack,__code next(...)); + __code push(Impl* stack,union Data* data, __code next(...)); + __code pop(Impl* stack, __code next(union Data* data, ...)); + __code pop2(Impl* stack, __code next(union Data* data, union Data* data1, ...)); + __code isEmpty(Impl* stack, __code next(...), __code whenEmpty(...)); + __code get(Impl* stack, __code next(union Data* data, ...)); + __code get2(Impl* stack, __code next(union Data* data, union Data* data1, ...)); + __code next(...); + __code whenEmpty(...); +} Stack; +``` + +- Impl + +```c +typedef struct SingleLinkedStack<Type, Isa> impl Stack { + struct Element* top; +} SingleLinkedStack; +``` + +- 変換時には`next`と`whenEmpty`の様な継続のCodeGearは`C_`を生成しないように仕込まれている + - 一意な実装が存在するわけではないので \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/anatofuz/note/2020/11/26.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,1 @@ +# hello \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/anatofuz/note/2020/11/30.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,50 @@ +```c +/* +data Point = Pt Double + +instance Eq Point where + (Pt x) == (Pt x') = x == x' + +instance Ord Point where + compare (Pt x) (Pt x') + | x == x' = EQ + | x < x' = LT + | otherwise = GT + +main = do print $ (Pt 1) == (Pt 2) -- 出力: False + print $ (Pt 1) >= (Pt 2) -- 出力: False + print $ (Pt 1) <= (Pt 2) -- 出力: True +*/ + +typedef struct Rectangle { + int l; + int w; +} + + +typedef struct Ord { + __code equal(Impl* eq, Impl* other, __code ok(...), __code none(...)); + __code lt(Impl* eq, Impl* other, __code ok(...), __code none(...)); + __code pt(Impl* eq, Impl* other, __code ok(...), __code none(...)); +} + +impl Ord typedef struct Rectangle { + + __code rectangleual(Impl* rectangle, Impl* other, __code ok(...), __code none(...)) { + goto rectangle->eq(other, ok, none, ...); + } + + __code lt(Impl* rectangle, Impl* other, __code ok(...), __code none(...)) { + if (rectangle.x > other.x) { + goto ok(...); + } + goto none(...); + } + +} + +typedef enum PointTypeManager { + Point-Ord, + Point-Equal +} +``` \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/anatofuz/note/2020/12/01.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,192 @@ +# 研究目的 +- アプリケーションの信頼性を保証するには土台となるOSの信頼性を高く保証する必要がある + - しかしOSの機能をテストですべて検証するのは不可能である。 +- 定理証明やモデル検査を利用して、テストに頼らずに保証したい + - 証明しやすい形、かつ実際に動くソースコードが必要 + - 継続ベースの状態遷移系で再実装することで表現しやすくしたい +- プログラムは二つの計算に分離される + - プログラムは入力と出力の関係を決める計算(ノーマルレベル) + - その計算に必要なメタな計算(メタレベル) +- プログラムの信頼性の保証を動作しつつ行うには、メタレベルの計算を活用したい +- そのためにはメタレベルの計算を柔軟に扱うAPIや実装方法が必要 +- 本研究ではノーマル/メタレベルでの実装に適した、継続を基本とする言語Continuation Based Cを用いて、OSの実装を行い、メタ計算APIについて考察する。 + + +# 最近 +- Gearsはコンストラクタ生成周りいじってました + - SingleLinkedStackのコンストラクタを自動生成するように +- 内定者と懇親しました + - 家を探しています +- Gearsで複数のInterfaceの実装を許容したいよねみたいな気分 + - Rustのジェネリクスの制約みたいなの欲しい +- Growiのupgrade + - mongodbも4.4に!!! + +# Gears +- SingleLinkedStackのコンストラクタが消え去った + +変換前 + +```c +#include "../context.h" +#include <stdio.h> + +#impl "Stack.h" for "SingleLinkedStack.h" +#data "Node.h" + + +void printStack1(union Data* data) { + struct Node* node = &data->Element.data->Node; + if (node == NULL) { + printf("NULL"); + } else { + printf("key = %d ,", node->key); + printStack1((union Data*)data->Element.next); + } +} +``` + +変換後 + +```c +#include "../context.h" +#include <stdio.h> + +Stack* createSingleLinkedStack(struct Context* context) { + struct Stack* stack = &ALLOCATE(context, Stack)->Stack; + struct SingleLinkedStack* single_linked_stack = &ALLOCATE(context, SingleLinkedStack)->SingleLinkedStack; + stack->stack = (union Data*)single_linked_stack; + stack->data = NULL; + stack->data1 = NULL; + single_linked_stack->top = NULL; + stack->clear = C_clearSingleLinkedStack; + stack->push = C_pushSingleLinkedStack; + stack->pop = C_popSingleLinkedStack; + stack->pop2 = C_pop2SingleLinkedStack; + stack->isEmpty = C_isEmptySingleLinkedStack; + stack->get = C_getSingleLinkedStack; + stack->get2 = C_get2SingleLinkedStack; + return stack; +} +// include "Node.h" + +void printStack1(union Data* data) { + struct Node* node = &data->Element.data->Node; + if (node == NULL) { + printf("NULL"); + } else { + printf("key = %d ,", node->key); + printStack1((union Data*)data->Element.next); + } +} +``` + +生成時にはもとのInterfaceファイルと実装の型のヘッダを見に行く + +- Interface + +```c +typedef struct Stack<Type, Impl>{ + __code clear(Impl* stack,__code next(...)); + __code push(Impl* stack,union Data* data, __code next(...)); + __code pop(Impl* stack, __code next(union Data* data, ...)); + __code pop2(Impl* stack, __code next(union Data* data, union Data* data1, ...)); + __code isEmpty(Impl* stack, __code next(...), __code whenEmpty(...)); + __code get(Impl* stack, __code next(union Data* data, ...)); + __code get2(Impl* stack, __code next(union Data* data, union Data* data1, ...)); + __code next(...); + __code whenEmpty(...); +} Stack; +``` + +- Impl + +```c +typedef struct SingleLinkedStack<Type, Isa> impl Stack { + struct Element* top; +} SingleLinkedStack; +``` + +- 変換時には`next`と`whenEmpty`の様な継続のCodeGearは`C_`を生成しないように仕込まれている + - 一意な実装が存在するわけではないので + - 微妙に此処がバグっていたので直した + +# Interfaceの複数実装 +- Haskellの例題見ながら雰囲気を考えている + - どのIntefaceが使われているかは型ごとにenumを作成したい + +```c +/* +data Point = Pt Double + +instance Eq Point where + (Pt x) == (Pt x') = x == x' + +instance Ord Point where + compare (Pt x) (Pt x') + | x == x' = EQ + | x < x' = LT + | otherwise = GT + +main = do print $ (Pt 1) == (Pt 2) -- 出力: False + print $ (Pt 1) >= (Pt 2) -- 出力: False + print $ (Pt 1) <= (Pt 2) -- 出力: True +*/ + +typedef struct Rectangle { + int l; + int w; +} + + +typedef struct Ord { + __code equal(Impl* eq, Impl* other, __code ok(...), __code none(...)); + __code lt(Impl* eq, Impl* other, __code ok(...), __code none(...)); + __code pt(Impl* eq, Impl* other, __code ok(...), __code none(...)); +} + +impl Ord typedef struct Rectangle { + + __code rectangleual(Impl* rectangle, Impl* other, __code ok(...), __code none(...)) { + goto rectangle->eq(other, ok, none, ...); + } + + __code lt(Impl* rectangle, Impl* other, __code ok(...), __code none(...)) { + if (rectangle.x > other.x) { + goto ok(...); + } + goto none(...); + } + +} + +typedef enum PointTypeManager { + Point-Ord, + Point-Equal +} +``` + +# Option + +Rustに影響されているのでMaybeみたいなやつがほしい気がする + +```c +typedef struct Option <Type, Impl> { + __code some(Impl* option, union Data* data, __code next(...)); + __code none(Impl* option, __code next(...)); + __code is_ok(Impl* option, __code ok(union Data* data, ...), __code none(...)); +} Option; +``` + +- 意外とかけそうなので例題書いてみるか... + - 1 Interfaceが複数のImplを持つ例題を書くかみたいな気持ち + - 今のInterfaceにImplをもたせる方針をやめるか、中でシンボルテーブルみたいなのを持ちたい気がする + - いやそれがcontextではあるのだけれど... +- .....と思いきやgotoすればいいという感じだったので却下 + +# NEXT + +- メタ計算APIとして自分自身の型情報の取得とかしたい気がする + - もしくはGenericsに該当するAPI +- par gotoの改良したい + - プロセスを作らずにスレッドを作るみたいな戦略もありそう..?
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/anatofuz/note/2020/12/02.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,1 @@ +# tes
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/anatofuz/note/2020/12/04.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,4 @@ +# test +- a +- b +- c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/aosskaito.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,2 @@ +# aosskaito +This is aosskaito's page \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/e165713.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,2 @@ +# e165713 +This is e165713's page \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/ikkun.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,2 @@ +# ikkun +This is ikkun's page \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/ikkun/__template.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,1 @@ +redirect /trash/user/ikkun/__template \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/ikkun/memo/2020/04/27.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,79 @@ +# Gears OSでモデル検査を実現する手法について + +# 要約 +* GeasOSはCbCで記述されており処理単位であるcodeGearの間に自由にメタ計算をはさむことができる。ここにdataGearの状態を記録することにより、ユーザプロセスあるいはカーネルそのもののモデル検査が可能になる。一般的なモデル検査では状態数の爆発は避けられない。記録する状態を抽象化あるいは限定する手法について考察する。 + +# 先行研究との違い +* + +# やること +* スケジューラーの作成(iteratorを使用した物) +* depth firstの探索用のスタックに変わるものを作る + +# つかうもの +excution +DPP(make -o とインクルードをつける) + +# やること +GearsOSにDPPを組み込む +デッドロックすることを確認できればおk +goto スケジューラーをGearsOSにかえる +par goto もつかう +第二フィロソファー使って書く +fork ptrが第二フィロソファー +誰がforkを持ってるかを + +enum action next はいらない +最初にやるのはGearsで第二フィロソファーを動かす +そしたらデッドロックする、滅多にしないだろうけど +それをモデル検査で捕まえる。 + +state.db.cが datagearをバイナリツリー +第二フィロソファーは5人分なので、それ以上アドレスは動かない +自分の状態を登録する、スケジューラーに +ステイトが切り替わる判定をしていく必要がある。 + +codegearから書き込んだ時、それだけ保存するadd memory レンジ + + +goto schedulerの部分でステイトDBのアップデートを入れる + +今のはマルチスレッドで動かさしていないので、forkを排他的制御していない。 + +GearsOSの +スケジューラーのqueueがイテレーターの塊、なのでマルチスレッドで動かす。 +シングルスレッドでチェッキングしているものを、複数スレッど動かす。 + +四段階のお仕事。 +今回の論文はこう言う構築でやりますと言う論文 + +examplesのしたに 書く。 + +forkのロック部分はシンクロナイズドキューでかけるはず +フィロソファーはシングルスレッドのはずなので排他的制御はいらない +twice のところに作っていく。 + + +Gearsの制御は割り込みされないから、書き込んだ際にレーすコンディションで落ちる可能性がある +書き込んで飛ぶけど、書き込みに負けるかもしれない。 +これはばいとにっくそバイトにそーとでも + +第二フィロソファーを動かすまではやりたい。 + + +第二フォロソファーは5プロセッサー +xv6は1プロセッサー + +共有されている部分はI/Oやページテーブル、それの状態数が多いのがOSの問題点になるんじゃないのか + +ページテーブルの状態は馬鹿でかいけど、全てを検証ではなくて、取り合う場合、 +メモリが少ない場合にページテーブルを取り合う。 + +論文の目次も作る +最初の手順は第二フィロソファー +GearsOSの例題を動かす。 +forkの排他制御はシンクロナイズドキューでいけると思うけど、シングルスレッドの検証と相性のいい方法でないといけない。 +パルス先輩がI/Oとの衝突をどうにかするものを + + +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/ikkun/memo/2020/04/28.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,19 @@ +pick upをアトミックにやってほしい、ぱルス先輩のがある +なくても擬似並列では動く + +擬似的にやるなら他かから割り込まれないようにする +しかしその場合は失敗する可能性がある +並列にforkなどの並列のやり方について考える余地がある。 + +ステイトDBについて +普通のCで書いたある。 +ぜんぶCbCにするべきではある、難易度は高い + +第二フィロソファーを動かすところ。 + +goto self は goto hungry になる +インターフェースになる。 +スケジューラー + + +brew で入れられるようにしてほしい
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/ikkun/memo/2020/05/01.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,38 @@ +# 先行研究の内容を整理したかったので + +# CbC +プログラムをcode とdata に分けて記述され、軽量継続によって繋がれる。 +そのため、状態遷移記述になる +状態遷移記述にはタブロー展開が有効 + +# タブロー展開と線形時相論理 +## CbCでのタブロー展開は +プログラムの可能な実行の組み合わせを全て調べる +状態の探索は深さ有線探索(Depth First Search) +プログラムの実行によって生成される状態は木構造で記述される +同じ状態は共有される->Partial Order Reduction(半順序簡約) +### partial Order Reduciton +並列システムのモデルの1つ +大まかに並列なプロセスを忠実にモデルにする化する方法とインターリビングモデルがある +インターリビングは +• 並列実行されるイベントは任意の順序で現れる +• 並列なプロセスを線形順序の実行系列として表現する。 +さらにこのインターリビングモデルの中で、同一の並列プロセスを表している実行系列を簡約するこ事を Partial order Reduciton(半順序簡約)という +## 線形時相論理(LtL)とは +そもそも時相論理とは時間と真偽の組み合わせのこと。 +例えば、「私はそのうちお腹がすく」 +これは今は」お腹が空いている」は偽であるが、時間経過があると真になるということ +線形時相論理はこの時間経過の状態を増やしたものである +何らかの状態であったなら、時間経過によって真になるといったもの(状態を証明だと様相という) +例えば「requestがあればいずれは受理する」(G(requested⊃F acknowledged)といったもの + +* タブロー展開で状態(様相)を洗い出し、それらを繋ぎ合わせて線形時相論理に基づいて記述する事で検証を行う。 + + + +# 参考にしたページ +線形時相論理。 +http://www.cs.tsukuba.ac.jp/~mizutani/under_grad/programtheory/2014/2014-09.pdf +partial order reduction +http://hagi.is.s.u-tokyo.ac.jp/pub/staff/hagiya/kougiroku/jpf/por.pdf +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/ikkun/memo/2020/05/19.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,21 @@ +# GearsOSでモデル検査を実現する手法について + +* プログラムの動作を保証することによって信頼性を高めることができる。 +* 信頼性を高める方法としてモデル検査がある。 +* GearsOS + +# CbC_gccのコンパイルが終わっていない。 +* なぜか32bitでコンパイルされるてしまう問題、 +* 呼び出すリンカーも間違ってはないはずだけど、、、 +* アナグラくんのやつを参考に \ + https://growi.cr.ie.u-ryukyu.ac.jp/user/anatofuz/note/2020/04/28 + +# memo +* web スライドだと端っこ少し見えるみたいなことが起きる +* 自分のものとして考え +* 理論的な話がない(どこを切り取るのか、可能なのか)->この場合はできましたみたいなのがほしい +* スケジューラー部分を自身で検証する。(論文だとユーザープロセスとして動かすだった) +* ユーザープロセスとして動くの見せて? +* ωオートマトンは止まらない問題で、DPPはそれ +* 要するに実装してくる +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/ikkun/memo/2020/05/21.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,18 @@ +# CbC_gccのローカルコンパイル +* 作業ディレクトリは $HOME/myCbC_gcc/build% +* 先日話していたようにCbC_gccのコンパイルでエラーが出てる問題を先生とやってきた + +# 先生とやったこと +* 32bitで出ているので、どこかで32ビットが生成されているからそれを探す、 +* lbgcc + +# memo +* エラーが出ていたshellスクリプトをコピって -ld をはずして tmp.shとした +* gcc -v でコンパイルの内容を見ながら 使われてるオプションから + +-- +./gcc/cc1 hello.c +とすることで中間言語のhello.sが生成される +これならまだライブラリは関係ないので、通る +gcc hello.s とすることで実行ファイルが作成される。 +-- \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/ikkun/memo/2020/06/23.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,1 @@ +# /user/ikkun/memo/2020/06/23 \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/ikkun/memo/2020/06/30.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,21 @@ +# GearsOSにおけるモデル検査 + +# 研究目的 +* 一般的にアプリケーションはテストと言われる方法を用いてバグを発見し修正することで信頼性を高める、しかしバグの再現性が低い場合には発見は困難になる。この際にはデバックを行うプログラマーの経験による予測が必要であり、予想した原因に基づいて1つ1つチェックをしていく必要がある。 +* モデル検査とは、検証したいアプリケーションの状態遷移記述を用いて行われ、特定の状態から遷移する全ての組み合わせに対して検査を行うことで、信頼性を保証する。 +* 当研究室で開発しているGearsOSはアプリケーションやサービスの信頼性をOSの機能として保証することを目指しており、モデル検査による検証や、定理証明を用いる事での信頼性へのアプローチを行っています。 +* 本研究ではGearsOSにおけるDPPのモデル検査を行うことでGearsOSにおけるモデル検査手法の確立と、さらにGearsOS上での自身のモデル検査について研究する。 +# DPP +* dining phirosoper ploblem の略でデッドロック検証モデル。 +* 現在のタスクはマルチスレッド実装。 + + + + + + + + +# 参考文献 +* モデル検査のデバッグへの適用 +http://jasst.jp/archives/jasst06e/pdf/E4-4_paper.pdf \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/ikkun/memo/2020/10/20.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,1 @@ +# /user/ikkun/memo/2020/10/20 \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/ikkun/memo/2020/10/27.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,18 @@ +# GearsOSにおけるモデル検査 + +# 研究目的 +* 一般的にアプリケーションはテストと言われる方法を用いてバグを発見し修正することで信頼性を高める、しかしバグの再現性が低い場合には発見は困難になる。この際にはデバックを行うプログラマーの経験による予測が必要であり、予想した原因に基づいて1つ1つチェックをしていく必要がある。 +* モデル検査とは、検証したいアプリケーションの状態遷移記述を用いて行われ、特定の状態から遷移する全ての組み合わせに対して検査を行うことで、信頼性を保証する。 +* 当研究室で開発しているGearsOSはアプリケーションやサービスの信頼性をOSの機能として保証することを目指しており、モデル検査による検証や、定理証明を用いる事での信頼性へのアプローチを行っています。 +* 本研究ではGearsOSにおけるDPPのモデル検査を行うことでGearsOSにおけるモデル検査手法の確立と、さらにGearsOS上での自身のモデル検査について研究する。 + +# 実装の全体像 +* モデル検査を行うための例題としてのDPPを扱う。DPPは並列で動きつつ、スレッド間でデータのやり取りを行う。このためデッドロックが起こる。今回の研究ではこのデッドロックをモデル検査で検出する。 +* スレッド間でのデータのやり取りはCASを用いているSynchronizedQueueでデータの保証を行う。 +* モデル検査を行うために、DPPを動かしつつstatmantDBとmemoryTreeによってログを保存する。 + +# 現在 +* 先週配信しながら作業するって話でしたが、結局していないので時間決めてやりたいと思います(13~17時)午前中は研究以外をする予定。 + +* TaskmanagerImplの作業していて、mutexってなんぞしました。 +* taskManagerImplからDPP呼び出す。 \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/ikkun/memo/2020/12/01.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,18 @@ +# GearsOSにおけるモデル検査 + +# 研究目的 +* 一般的にアプリケーションはテストと言われる方法を用いてバグを発見し修正することで信頼性を高める、しかしバグの再現性が低い場合には発見は困難になる。この際にはデバックを行うプログラマーの経験による予測が必要であり、予想した原因に基づいて1つ1つチェックをしていく必要がある。 +* モデル検査とは、検証したいアプリケーションの状態遷移記述を用いて行われ、特定の状態から遷移する全ての組み合わせに対して検査を行うことで、信頼性を保証する。 +* 当研究室で開発しているGearsOSはアプリケーションやサービスの信頼性をOSの機能として保証することを目指しており、モデル検査による検証や、定理証明を用いる事での信頼性へのアプローチを行っています。 +* 本研究ではGearsOSにおけるDPPのモデル検査を行うことでGearsOSにおけるモデル検査手法の確立と、さらにGearsOS上での自身のモデル検査について研究する。 + +# 実装の全体像 +* モデル検査を行うための例題としてのDPPを扱う。DPPは並列で動きつつ、スレッド間でデータのやり取りを行う。このためデッドロックが起こる。今回の研究ではこのデッドロックをモデル検査で検出する。 +* スレッド間でのデータのやり取りはCASを用いているSynchronizedQueueでデータの保証を行う。 +* モデル検査を行うために、DPPを動かしつつstatmantDBとmemoryTreeによってログを保存する。 + +# 現在 +* 先週配信しながら作業するって話でしたが、結局していないので時間決めてやりたいと思います(13~17時)午前中は研究以外をする予定。 + +* TaskmanagerImplの作業していて、mutexってなんぞしました。 +* taskManagerImplからDPP呼び出す。 \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/ikkun/slide/2020.4.14.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,6 @@ +# Gears OSにおける multi threadにおけるプログラム検証 + +# 要約 +* CbC は処理の移行を goto 用いて行い、データ構造はdate gearにより保持する事でプログラムの処理をcode gear毎の独立したものにする。 +* Geas OS はCbCで記述されおり、処理を変更する事なく処理の間に自由にメタ処理を挟む事ができる、これにスケジューラーを挟む事でマルチスレッド処理などが可能となる。 +* メタ計算部分にモデルチェッキングを入れる事でプログラムを実行しながらにして証明することが可能となる。 \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/ikkun/slide/2020.4.21.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,8 @@ +# Gears OSでモデル検査を実現する手法について + +* プログラムの信頼性を保証する方法の1つとしてモデル検査がある。 モデル検査を行う場合はプログラムの持ち得る全ての状態を調べる、SPINまたはjava path finderを用いて行われる。しかし、SPINで行う場合にはPROMELAに書き換える必要がありjava path finder はjavaのバイトコードを検証するためのものであるが、大きなプログラムの検証や複数プロセスが扱えないなどの問題点がある。 本研究ではGeasOS上でDPPのモデルチェッキングを行ことで、書き換えを必要とせず、複数プロセスのプログラムの検証を行う + +# 課題 +* GeasOSはgotoによる遷移を行うため、stackを積まない。 +* しかし、モデル検査はDepth firstで行われるため、1つ前の状態に戻る必要がある。そこでモデル検査をおこなうために、、、 +* iterator を使ってのマルチスレッドモデル検査を実装する。
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/ikkun/slide/sigos.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,61 @@ +# 研究目的 +- OS上ではさまざまなアプリケーションやサービスが提供されるが、予期しないエラーが起こり得る +- 本研究室で開発している GearsOS ではアプリケーションやサービスの信頼性をOSの機能として保証することを目指しており、モデル検査による保証について考察する +- GearsOS そのものをGearsOS上でモデル検査することに関しても考察する。 + +# Gears OS +- アプリケーションやサービスの信頼性をOSの機能として保証することを目指している。 +- 信頼性を保証する手法としてモデル検査を上げている。 +- GearsOS は軽量継続を基本とする言語 CbC を用いたOSの実装である。 + +# Continution based C +- CbC とは C言語をベースとして、開発された言語でC言語との違いはプログラムにおける goto 文を用いて CodeGear という単位で遷移する。 +- goto 文による遷移は関数呼び出しとは異なり、stackや環境を隠して持つことがない。 +<div style="text-align: center;"> + <img src="../paper/pic/meta_gear.pdf" alt="normalCodeGear" width="600"> +</div> +# dataGear と meta dataGear +- CbC における入力は dataGear と呼ばれる構造体になっており、ノーマルレベル +とメタレベルがある。 +- メタレベルには計算を行うCPUやメモリ、計算に関するノーマルレベルのdataGearを格納するcontext などがある。context は一般的なOSのプロセスに相当する。 + +# goto + +# 既存のモデル検査手法 +- 一般的に利用されるモデル検査ツールとしてSPINと java path finder(JPF)がある +-- SPIN では以下の性質を検査することができる +* アサーション +* デッドロック +* 到達性 +* 進行性 +* 線形時相論理で記述された仕様 + +- JPF では以下の性質を検査することができる +* スレッドの可能な実行すべてを調べる +* デッドロックの検出 +* アサーション +* Partial Order Reduction + +# タブロー展開と状態数の抽象化 +- GearsOS におけるモデル検査はタブロー展開を用いることでデッドロックを調べる。 +- タブロー法は生成可能な状態のすべてを生成する手法である。 +- 生成された状態の組み合わせを深さ優先探索で調べ、木構造で保存する。この時、同じ状態の組み合わせがあれば抽象化し共有することで、状態数が増えすぎる事を抑える。 +# +- GearsOS による検証用プログラムとして Dining Philosohers Ploblem を用いる。 + + +# DPP +- 5人の哲学者が円卓についており、各々スパゲティーの皿が目の前に用意され、スパゲティーは絡まっている為2つのフォーク使わなければ食べれない。フォークは席の間に1本ずつある。哲学者は、思考とフォークを持つ、食事する。 +- 状態は以下のようになる +* Pickup Right fork +* Pickup Left fork +* eating +* Put Right fork +* Put Left fork +* Thinking + +# GeasOS におけるDPP実装 +- 5つのスレッドで並列処理を行う事で、哲学者の行動を再現する。 +- gearsOSには並列機構の par goto があり、これを使用するスケジューラーによって並列にスレッドを起動する。 +- フォークの管理をsynchronixed Queue を用いることによってスレッド間での同期を行う。 +- スレッドの状態遷移に metaCodeGear を 挟みメタレベルで各スレッドの状態の保存を行う。 \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/jogo.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,2 @@ +# jogo +This is jogo's page \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/jogo/メモ/2020/04/21/zemi/20200421.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,26 @@ +## やったこと + +- シス管 +- 長田研の方の研究 +- dockerの嫌なところ + +## シス管 + +mattermostのバージョンアップとメモリ,CPU,容量マシマシにできた + +## 長田研の方の研究 + +踏み台サーバの提案としてsshrの導入 + +vmに立てていて実装はgolang + +DBにuser,pub-key,host先を置いておいてsshできる + +新規性的にはldapとの連携がとれる + +## Dockerの嫌なところ. + +latestタグを書いておけば新しいものが入ってくる場合というわけはないということ + +dockerのメモリ上限を超えた時にdocker logsではわからないこと. +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/jogo/メモ/2020/04/28/zemi.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,24 @@ +# やったこと +- 長田研の研究 +- 研究室回り +- 雑談 + +# 長田研の研究 + + +sshrのいいところ + +クライアント側sshrサーバにsshするだけでhost先を意識することなく扱える. + +急なipアドレスの変更などによりクライアント側に設定を要求するのではなくプロキシサーバ以下を設定することで気にしなくてよくな. + +公開鍵をsshr自体に渡すことでsshr自体での一元管理ができる. + +# 研究室周り +実験3の内容が決まった. +b4生が長田研のサーバに入れるようにするために行なった +# 雑談 + +wimaxを契約した +先週作業しようとしたら一日中ネットが遅くて動けない日が増えてきた. +今週にwimaxが来ると信じているので進捗を出したい.
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/jogo/メモ/2020/05/05/zemi/20200507.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,16 @@ +# やったこと + +- sshr +- clynelishのお掃除 + +# sshr + +実装中 +進捗を出せてない + +# clynelishのお掃除 + +動いていたvmをバックアップをとった +いつでも掃除してubuntu + ceph + kubernetes構築に移りたい + +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/jogo/メモ/2020/06/16/zemi/20200616.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,26 @@ +# sshrの比較方法 +前回のゼミのlog + + +来週には目次見せてほしいかな +長田先生としては来週までに概要まで見せてほしい + +良いもの作ってるので、それの評価をどうやるか +評価方法の方を考えて来てほしい +修論レベルだと評価方法について突っ込まれる。 +利点の比較の仕方、速度とか、安全性とか、今まで出来なかったことが出来ましたとか + +信頼性をあげてるけど、どうやるか、バグいくつ見つけたとかそういうところ + + + +1. 既存のsshとsshrの速度についての比較(yomitan経由との比較) +2. セキュリティ周りについて. +3. 従来の踏み台サーバとの比較 +4. 新規踏み台サーバを追加することでの利点 + + +1. sshとsshrでの速度を計測 +2. 秘密鍵,公開鍵の登録,または実際に外部公開したさいの対策 +3. yomitanサーバとの比較 +4. sshrサーバを追加することでの管理者側の利点,理療者側の利点. \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/jogo/メモ/2020/06/23/zemi/20200623.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,9 @@ +# やったこと +title abstractを書いた + +# sshrで悩んでること +- sshrの鍵認証の実装をしていた. +- しかし,sshrの用意された関数のドキュメントの記述が少ないので探すのに手こずってる. +- とりあえずパスワード認証のみを一旦実装中 +- 特にわかりにくいのがssh/cryptをクローンしたもので回収したものを使用している点 +- \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/jogo/メモ/2020/06/30.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,61 @@ +# 研究 + +# title +多段 ssh 接続を管理する sshr の改良 + +## abstract + +目的のサーバにアクセスするために外部からサーバへのアクセスへは踏み台サーバからのアクセスが必要である.踏み台サーバでは外部から第三者に乗っ取られることや不特定多数の攻撃の中継地点を防止するためのものである.しかし,利用している踏み台サーバが停止すると学内での復旧作業が必要になってしまうそこで,新規踏み台サーバとしてsshrを提案する.sshrは鶴田博文氏が作成したものである.sshrはシステム管理者が組み込み可能なフック関数を用いてシステム変化に追従できるsshプロキシサーバである.本稿ではsshrを改良し弊学へ利用できるように実装をした. + + +## やったこと + +第139回情報基礎とアクセス技術研究発表会に申し込んで不採録になった + +学会を探した + +[論文募集 \| ソフトウェアエンジニアリングシンポジウム2020(SES2020)](https://ses.sigse.jp/2020/cfp.html#open) + +## 募集テーマ + +- 要求工学 +- 分析・設計技法 +- テスト技法 +- ソフトウェア保守と進化 +- システム評価・管理技術 +- 開発支援環境 +- ソフトウェアプロセス +- ソフトウェア開発マネジメント +- 形式的手法 +- ソフトウェアセキュリティ +- ソフトウェアシステムの安全性 +- 実証的ソフトウェア工学 +- リポジトリマイニング +- ソフトウェア開発の科学(ソフトウェアサイエンス) +- プログラミング言語 +- オブジェクト指向技術 +- AIと知識ベースのソフトウェア工学 +- クラウドコンピューティング +- IoT時代のソフトウェア工学 +- 帰納的に定義されたソフトウェアシステムの開発方法論 +- 量子計算などの新しい計算パラダイムに対するソフトウェア工学 +- ソフトウェア工学に関するメタ研究 +- その他ソフトウェア工学に関するテーマ全般 + +システム評価・管理技術と合致してそうなのでよさそう? + +発表申し込み は7月27日 +投稿締め切り は8月10日 + +開催日が2020年9月10日(木)~9月12日(土) + +システム移行と被ってる.... + +sshrのsshr/cryptの実装への理解が足りていなかったので読みつつやっている +前回アナグラ君と読んで割とわかったので追いつけなかった分を読んで実装していく + + + + + +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/jogo/メモ/2020/07/14/zemi.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,23 @@ +# 研究 + +# title +多段 ssh 接続を管理する sshr の改良 + +## abstract + +目的のサーバにアクセスするために外部からサーバへのアクセスへは踏み台サーバからのアクセスが必要である.踏み台サーバでは外部から第三者に乗っ取られることや不特定多数の攻撃の中継地点を防止するためのものである.しかし,利用している踏み台サーバが停止すると学内での復旧作業が必要になってしまうそこで,新規踏み台サーバとしてsshrを提案する.sshrは鶴田博文氏が作成したものである.sshrはシステム管理者が組み込み可能なフック関数を用いてシステム変化に追従できるsshプロキシサーバである.本稿ではsshrを改良し弊学へ利用できるように実装をした. + +# IOT第51回に申し込んだ + +- 無事に受かりました. +- 8/10までに提出 +- 6~8ページまで +- 長田先生に報告済み +- 研究のコードの方が先週色々会って進まなかったです. +- 心配事が減ったのでclynelishの方もいじります +# 内定通知式に行ってきた + +- 同じ同期の人とあってきました +- ビビっていましたが割と人が良さそうでした + + \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/jogo/メモ/2020/07/21/zemi.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,25 @@ +# 研究 + +# title +多段 ssh 接続を管理する sshr の改良 + +## abstract + +目的のサーバにアクセスするために外部からサーバへのアクセスへは踏み台サーバからのアクセスが必要である.踏み台サーバでは外部から第三者に乗っ取られることや不特定多数の攻撃の中継地点を防止するためのものである.しかし,利用している踏み台サーバが停止すると学内での復旧作業が必要になってしまうそこで,新規踏み台サーバとしてsshrを提案する.sshrは鶴田博文氏が作成したものである.sshrはシステム管理者が組み込み可能なフック関数を用いてシステム変化に追従できるsshプロキシサーバである.本稿ではsshrを改良し弊学へ利用できるように実装をした. + +# 研究(sshr) +- 書いています +- 公開鍵の認証の部分はできてきたがsshrから目的のサーバにsshする部分を書いています. +- 今週中におわらせたい. +- 論文も書き始めました + +# 研究(学科システム) +- 学科の新サーバを起動させた +- 起動させたら夜にアラートメールが来た +- upsの電力を食いながらぎりぎり耐え忍んでいた +- 対策必須 + +# 内定者懇親会? +- オンラインでありました +- 内定者と話したのですがブラック企業じゃないのか不安がっていました +- シス管してれば耐えれるなと若干思いました \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/jogo/メモ/2020/08/04/zemi.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,20 @@ +# 研究 + +# title +多段 ssh 接続を管理する sshr の改良 + +## abstract + +目的のサーバにアクセスするために外部からサーバへのアクセスへは踏み台サーバからのアクセスが必要である.踏み台サーバでは外部から第三者に乗っ取られることや不特定多数の攻撃の中継地点を防止するためのものである.しかし,利用している踏み台サーバが停止すると学内での復旧作業が必要になってしまうそこで,新規踏み台サーバとしてsshrを提案する.sshrは鶴田博文氏が作成したものである.sshrはシステム管理者が組み込み可能なフック関数を用いてシステム変化に追従できるsshプロキシサーバである.本稿ではsshrを改良し弊学へ利用できるように実装をした. + +# sshr + +- 公開鍵の実装を行いたかったがx/crypt/sshがOpenSSHの読み込みに対応していなかった +- いま本体のリポジトリで対応しているような形 +- issueは立ち上がっているが現状も実装していな形 +- 実装方向としてはIPMIの方? + +# 障害対応 + +- 頑張ったということでスーパーで買ったお肉を食べてから腹痛で苦しんでます +- 解決できたがよかったですかシリアルコンソールに慣れたい \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/kono.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,2 @@ +# kono +This is kono's page \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/matac42.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,2 @@ +# matac42 +This is matac42's page \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/matac42/note/2020/12/01/test.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,1 @@ +初めてのgrowi \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/menikon.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,2 @@ +# menikon +This is menikon's page \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/menikon/thesis.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,161 @@ +# CbC による xv6 の FileSystem の書き換え +author: Takahiro Sakamoto, Shinji Kono + +profile: 琉球大学工学部情報工学科並列信頼研 + +## 研究目的 +- OSに対し高い信頼性を実現させたい + +- そのために当研究室ではContinuation based C (CbC)を用いたGearsOSを設計中である + +- 前段階としてシンプルであるが基本的な機能を揃えたOSであるxv6をCbCで書き換える + +- CbCは処理の基本単位をCodeGearとし、stackに値を積む事なくCodeGear間を遷移する + +- CodeGear間は状態遷移であるためOS内部を明確化することができる + +- 本研究ではOS内部の明確化を実現し信頼性を向上させるためにCbCを用いFileSystemを書き換える + +## 研究概要 +- +## Continuation based C +* Continuation based C (CbC) はこの Code Gear 処理の単位としてプログラミング言語として開発している。 +* Code Gear は 関数呼び出し時の環境を使わずに次の Code Gear へと goto 文によって遷移する +* この goto 文による遷移を軽量継続と呼ぶ +* 継続を用いることによって状態遷移ベースでのプログラミングが可能である +* CbC は C と互換性のある言語なので、C の関数も呼び出すことができる +## CbC のコード例 +* CbC では Code Gear は \_\_code Code Gear 名 (引数) の形で記述される +* Code Gear は戻り値を持たないので、関数とは異なり return 文は存在しない +* goto の後に Code Gear 名と引数を並べて、次の Code Gear の遷移を記述する + +## CbC のコード例 +* この goto の行き先を継続と呼び、このときの a+b が次の Code Gear への出力となる + +``` +__code cg0(int a, int b){ + goto cg1(a+b); +} + +__code cg1(int c){ + goto cg2(c); +} +``` +## CbC の継続 + +## Gears におけるメタ計算 +* Gears OS ではメタ計算を Meta Code Gear、Meta Data Gear で表現する +* Meta Code Gear はノーマルレベルの Code Gear の直後に遷移され、メタ計算を実行する +* Meta Code Gear で OS の機能であるメモリ管理やスレッド管理を行う + +## Meta Gear +* Gears OS では、Meta Code Gear は通常の Code Gear の直前、直後に挿入され、メタ計算を実行する +* 通常の計算からはメタ計算は見ることができない + + +## Context +* Gears OS では Context と呼ばれる、使用されるすべての Code Gear、Data Gear を持つ Meta Data Gear を持っている +* Gears OS は必要な Code Gear、Data Gear を参照したい場合、この Context を通す必要がある +* Context は Meta Data Gear であるため、Meta Code Gear を介してアクセスする + +## Context +* Context は全ての Code Gear のリストを持っており、enum で番号とアドレスを対応付けている +``` +enum Code { + C_popSingleLinkedStack, + C_pushSingleLinkedStack, + C_stackTest3, + C_assert3, + ... +}; +``` +``` +context->code[C_popSingleLinkedStack] = popSingleLinkedStack_stub; +context->code[C_pushSingleLinkedStack] = pushSingleLinkedStack_stub; +context->code[C_stackTest3] = stackTest3_stub; +context->code[C_assert3] = assert3_stub; +``` + +## Context +* Data Gear も Code Gear と同様に Context が全ての Data Gear のリストを持っている +* Data Gear のリストも enum で管理されている +* これは引数格納用の Data Gear の番号である +``` +enum DataType { + D_Code, + D_SingleLinkedStack, + D_Stack, + D_TaskManager, + D_Worker, + ... + }; +``` + +## Interface +* Code Gear と Data Gear は Interface と呼ばれるまとまりとして記述される +* Interface は GearsOS でのモジュール化の仕組み +* Interface は使用される Data Gear の定義と、それに対する Code Gear の集合である +* Interface の操作に対応する Code Gear の引数は Interface に定義されている Data Gear を通して行われる + +## Interface の定義 +* Stack の Interface の例である +* typedef struct Interface 名で記述する +* Impl は実際に実装した際のデータ構造の型になる + +``` +typedef struct Stack<Impl> { + union Data* stack; + union Data* data; + __code next(...); + __code whenEmpty(...); + + __code clear(Impl* stack, __code next(...)); + __code push(Impl* stack, union Data* data, __code next(...)); + __code pop(Impl* stack, __code next(union Data* ...)); + __code isEmpty(Impl* stack, __code next(...), __code whenEmpty(...)); + +} +``` +## Interface の定義 +* Data Gear は 操作する Data Gear と +操作に必要な全ての Data Gear Gear が記述されている +* \_\_code で記述されているものが操作の Code Gear である + +``` +typedef struct Stack<Impl> { + union Data* stack; + union Data* data; + __code next(...); + __code whenEmpty(...); + + __code clear(Impl* stack, __code next(...)); + __code push(Impl* stack, union Data* data, __code next(...)); + __code pop(Impl* stack, __code next(union Data* ...)); + __code isEmpty(Impl* stack, __code next(...), __code whenEmpty(...)); + +} +``` +## Interface の実装の記述 +* ソースコードは Interface の実装の初期化のコードである +* 操作の Code Gear には実装した Code Gear の番号が代入されるが、ここを入れ替えることで、複数の実装を持つことができる +``` +Stack* createSingleLinkedStack(struct Context* context) { + struct Stack* stack = new Stack(); + struct SingleLinkedStack* singleLinkedStack = new SingleLinkedStack(); + stack->stack = (union Data*)singleLinkedStack; + singleLinkedStack->top = NULL; + stack->push = C_pushSingleLinkedStack; + stack->pop = C_popSingleLinkedStack; + stack->isEmpty = C_isEmptySingleLinkedStack; + stack->clear = C_clearSingleLinkedStack; + return stack; +} +``` +## xv6 の書き換えの方針 +* xv6 を CbC で書き換え、Gears OS の機能と置き換えることで Gears OS に OS の基本構造を持たせたい +* このためには xv6 をモジュール化することで、xv6 の機能を明らかにする必要がある +* xv6 の Interface を定義し、Gears OS の機能をこれに合わせることによって実現したい + +## CbC による FileSystem の書き換え + +## まとめと今後の方針
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/mk.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,2 @@ +# mk +This is mk's page \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/riono210.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,2 @@ +# riono210 +This is riono210's page \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/riono210/lecture/sofsys/0423.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,1 @@ +#てsと \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/riono210/seminar/202004.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,1 @@ +### テスト \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/riono210/seminar/202004/0414.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,8 @@ +## 202004ゼミ + +### title +```画面配信システムTreeVNCのWifi Multicast実装``` + + + +## 進捗 \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/riono210/seminar/202004/0421.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,1 @@ +#てsつお \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/riono210/seminar/202004/0428.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,1 @@ +#tets \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/riono210/seminar/202006/0616.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,3 @@ +## + +## 研究目的 \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/riono210/seminar/202006/0623.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,7 @@ +## 0623 + + +## 研究目的 + + +## 今週の進捗 \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/riono210/seminar/202008/0811.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,6 @@ +## 0811 + +## 研究目的 + + +## 今週の進捗 \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/riono210/seminar/202011/1124.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,13 @@ +## 11/24 + +## 研究目的 +* ゲームの通信方式にはクライアントサーバ方式とp2p方式がある +* データの安全性やチート対策などでクライアントサーバ方式が主流 +* サーバに接続してマルチプレイなどのデータ同期を実現させているため、低速 +* 高速かつ安全に通信を行たい + * 並列分散フレームワークChristieがある + * Christieを利用してp2pで通信を行う +* ゲーム開発で主に使用されているUnityに対応するためにChristieをC#へ書き換えを行う + +## 今週の進捗 +* 急に
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/riono210/seminar/__template.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,6 @@ +## mmdd + +## 研究目的 + + +## 今週の進捗 \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/riono210/sigos2020.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,143 @@ +# 画面配信システム TreeVNC のマルチキャストの導入 +author: Ryo Yasuda, Shinji Kono +profile: 並列信頼研 + +## 画面配信システムの活用 +- 講義やゼミではプロジェクタを使用して、先生が用意した資料を見ることが多い。その際接続不良など、物理的アクシデントが起きる恐れがある +- 画面配信システムで代用する場合がある。画面配信システムのとしてはAppleTVやUstreamなどが挙げられる + - AppleTVは画面共有先がTVに限定されている + - Ustreamは画面の切り替えを行うことができない + + +<center><img src="https://i.imgur.com/5lT1RZ9.png" alt="message" width="200" height="200"> +<img src="https://i.imgur.com/qpeYXUl.png" alt="message" width="200" height="150"></center> + + + + +## 画面配信システムの活用 +- 画面配信システムTreeVNCは、自身のPC画面を他者のPCと共有できるソフトウェアである +- javaで書かれているためOSに依存せず、物理的な制約なしに使用可能 +- TreeVNCを使用することで、参加者は手元のPCを使用しながら講義を受ける事が可能になる。切り替えの際も、ボタン1つで共有する画面の切替を可能としている + +## TreeVNCの講義等での活用 +- 講義では先生のPC画面を手元のPCで見ることで、コマンドを手元で打ち間違えや、メモを取る際にPCのみに集中を向けることができるようになった +- ゼミにおいてもコードをつなげるために移動する必要がなく、各自の席で発表者の画面を見ることができる +- 以上のようにTreeVNCは従来のプロジェクタなどよりも利便性が高い + +## 本研究の概要 +- 画面配信は送信するデータ量が多いため、TreeVNCでは無線接続の場合、画面配信の遅延が大きくなってしまう +- 現在のTreeVNCのデータ転送方法だと、無線接続で送信するには大きすぎる +- 本研究ではMulticastの導入としてBlockingによるデータの分割を実装した + +## VNC +- VNC(Virtual Network Computing)は、RFB(Remote Frame Buffer)プロトコルを用いてPCの遠隔操作を行うことを目的としたリモートデスクトップソフトウェア +- サーバー側とクライアント側に分かれており、起動したサーバーにクライアントが接続することで遠隔操作を可能にしている +- 全てのNodeが一台のサーバーに接続するため負担が大きい + +<center><img src="https://i.imgur.com/ufIEIe5.png)" alt="message" width="450" height="300"></center> + + +## TreeVNCとは +- TreeVNCは本研究室で開発している画面配信システム +- 木構造の接続方式によりNode間で画像データのやりとりを行う +- 各ノードが2回ずつ画像データをコピーすることで配信側の負荷を分散し、大人数での画面配信が可能 + +<center><img src="https://i.imgur.com/zpeYi9p.png" alt="message" width="450" height="300"></center> + +## UpdateRectangleによる画面更新 +- RFB (Remote Frame Buffer) プロトコルを利用し、自身の画面をネットワークを通じて送信し他者の画面に表示する +- クライアントに送信するデータは画面全てではなく、変更があった部分のFrameBufferを送る +- 配信PC画面の変更があった部分のみをRFBで、UpdateRectangleとしてマルチキャストで一度のみ送信する +- RFBプロトコルでは画像データをRectangleで送信しているため、UpdateRectangleとして送信されるPacketには複数のRectangleが入るような構成をとっている + +<center><img src="https://i.imgur.com/ZN6jMYI.png" alt="message" width="450" height="300"></center> + + +## RFBプロトコルのエンコードタイプ +- ZRLEとはRFBプロトコルでサポートされているエンコードタイプの1つ +- zlib圧縮、タイリング、run lengthエンコードを組み合わせている + +<center><img src="https://i.imgur.com/CdGCftg.png" alt="message" width="500" height="350"></center> + +## RFBプロトコルのエンコードタイプ +- 解凍に必要な辞書を書き出すことができないため、途中からデータを受け取ると正確に解凍できなくなる + +<center><img src="https://i.imgur.com/VxeaTMD.png" +alt="message" width="500" height="350"></center> + + + +## TreeVNCの画像データ圧縮方法 +- ZRLEを応用したZRLEEを使用している +- 辞書の書き出しを行えるようにし、データを途中から受け取っても解凍することが可能 +- ZRLEを一度解凍し、辞書を書き出して再圧縮を行う + + +<center><img src="https://i.imgur.com/VxeaTMD.png" alt="message" width="500" height="400"></center> + + +## Multicastの問題点 +- wifiのMulticast Paketの最大サイズは64KBである +- HDや4Kの画面を更新するためのサイズは大きい + - 4Kディスプレイの場合8MB(画素数) x 8Byte(色情報)で64MB +- 送信データの圧縮と64KB毎のパケット変換が必要 + + +## Blockingの考察 +- 64KBのパケットに収めるため、ZRLEEで圧縮する前にBlockingを行い、Rectangleの再構成を行う +- ZRLEを解凍したデータのRectangleは以下のような状況になっていると考えられ、Phaseで区別する + - 行の途中から行の最後まで Phase0 + - 行の最初から最後まで Phase1 + - 行の最初から行の途中まで Phase2 + +<center><img src="https://i.imgur.com/HrqYOhP.png" alt="message" width="600" height="400"></center> + + +## Blockingの考察 +- 最大3つのRectangleの再構成を行いつつ、ZRLEEで変換を行いパケットの構成をする +- Packetの先頭にはmessageIDなどが格納されているPacke Headerがある +- 各RectangleにはRectangleのx,y座標や圧縮されたデータ長などが格納されているRectangle Headerを持っている + + +<center><img src="https://i.imgur.com/HrqYOhP.png" alt="message" width="600" height="400"></center> + + +## 圧縮方式 +- zlibには以下の3つの圧縮方法が存在する + * NO FLUSH : Stream に格納されたデータを最高率で 圧縮を行う。Stream にある入力データが規定量に満た ない場合は圧縮されない + * SYNC FLUSH : これまでに Stream に格納されたデー タの圧縮を行う。ただし圧縮率が低下する可能性がある + * FULL FLUSH : SYNC FLUSH 同様、これまでに Stream に格納されたデータの圧縮を行う。異なる点 はこれまでの辞書情報がリセットされるため、圧縮率 が極端に低くなる可能性がある + + +<!--## paket lossする可能性 +- wifiのMulticast paketは確実に送信されることが保証されておらず、paket lossする可能性がある +- その対策としては以下の2つが取れる + - 何もしない、定期的に全画面のデータが送信されるため問題ないと考える + - 再送要求を行う、処理が複雑であることが予想される +- 現状では定期的に全画面のデータを送信しており、十分実用に耐えると考える +--> + +## 圧縮方法 +- 1TileごとにSYNC_FLUSHを行なっている +- 行末ではFULL_FLUSHを行う +- NO_FLUSHを利用していないためデータの圧縮率は下がる + +## その他の実装 +- TreeVNCのBuildに使用している、Gradleを4.8から6.1へのバージョンアップ対応 +- java9以降非推奨だったRetinaAIPの更新対応 +- デバッグオプションの修正 + + +## まとめ +- WifiでBlockingを用いて、Multicast paketを利用する手法についての考察と実装を行なった + - Wifiの速度とMulticastの信頼性が高ければ実用的である可能性がある + +- TreeVNCのBuildやAPIのバージョンアップ対応、デバッグオプション修正を行なった + +- 今後の課題 + - Multicast通信の実装 + - WifiのMulticast paket lossは接続環境や状況に依存すると思われるためさらなる実験が必要 + - Node接続時の有線接続と無線接続の判断、区別処理の実装 + - SYNC_FLUSHを使っているため圧縮率が低下しているため、圧縮率の向上についての考察 + \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/riono210/thesis.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,203 @@ +title: 画面配信システム TreeVNC のマルチキャストの導入 +author: Ryo Yasuda, Shinji Kono +profile: 並列信頼研 +lang: Japanese +code-engine: coderay + +<!-- <\!-- slideshow の command -\-> --> +<!-- slide.htmlでは通常キーでのコマンドが存在している --> + +<!-- p,a,s : スライドを自動送り(1,2...) --> +<!-- : スライドを逆方向に自動送り(...,2,1) --> +<!-- n : Page数を on/off --> +<!-- f : 右下ロゴの on/off --> +<!-- t : slide.html.pdf に変更 --> +<!-- c : 右下スライド移動用UIの on/off --> +<!-- d : ロゴ部分の選択…? --> +<!-- [URL](http://~~~) --> +<!-- [FILE](file:///Users/ryokka/~~~) --> +<!-- slideshow build スライド.md -t s6cr --> + +<!-- ## 目次 +- **TreeVNC の概要** + - **基本概念** + - **構造** +- 研究内容 + - TreeVNC の改良 + - 送信データの Blocking +--> + +## 画面配信システムの活用 +- 講義やゼミではプロジェクタを使用して、先生が用意した資料を見ることが多い。その際接続不良など、物理的アクシデントが起きる恐れがある +- 画面配信システムで代用する場合がある。画面配信システムのとしてはAppleTVやUstreamなどが挙げられる + - AppleTVは画面共有先がTVに限定されている + - Ustreamは画面の切り替えを行うことができない + +<center><img src="./fig/AppleTVRogo.svg " alt="message" width="200" height="200"> +<img src="./fig/UstreamRogo.svg" alt="message" width="200" height="150"></center> + + +## 画面配信システムの活用 +- 画面配信システムTreeVNCは、自身のPC画面を他者のPCと共有できるソフトウェアである +- javaで書かれているためOSに依存せず、物理的な制限なしに使用可能 +- TreeVNCを使用することで、参加者は手元のPCを使用しながら講義を受ける事が可能になる。切り替えの際も、ボタン一つで共有する画面の切替を可能としている + +## TreeVNCの講義等での活用 +- 講義では先生のPC画面を手元のPCで見ることで、コマンドを手元で打ち間違えや、メモを取る際にPCのみに集中を向けることができるようになった +- ゼミにおいてもコードをつなげるために移動する必要がなく、各自の席で発表者の画面を見ることができる +- 以上のようにTreeVNCは従来のプロジェクタなどよりも利便性が高い + +## VNC +- VNC(Virtual Network Computing)は、RFB(Remote Frame Buffer)プロトコルを用いてPCの遠隔操作を行うことを目的としたリモートデスクトップソフトウェア +- サーバー側とクライアント側に分かれており、起動したサーバーにクライアントが接続することで遠隔操作を可能にしている +- 全てのNodeが一台のサーバーに接続するため負担が大きい + +<center><img src="./fig/vnc-crop.svg" alt="message" width="450" height="350"></center> + + +## TreeVNCとは +- TreeVNCは本研究室で開発している画面配信システム +- 木構造の接続方式によりNode間で画像データのやりとりを行う +- 各ノードが2回ずつ画像データをコピーすることで配信側の負荷を分散し、大人数での画面配信が可能 + +<center><img src="./fig/treevnc-crop.svg" alt="message" width="450" height="350"></center> + + +## 本研究の概要 +- 画面配信は送信するデータ量が多いため、TreeVNCでは無線接続の場合、画面配信の遅延が大きくなってしまう +- 現在のTreeVNCのデータ転送方法だと、無線接続で送信するには大きすぎる +- 本研究ではMulticastを導入することで、Wifi環境下における画面配信の遅延対策の検討を行なった + +## TreeVNCの画面配信方法 +- RFB (Remote Frame Buffer) プロトコルを利用し、自身の画面をネットワークを通じて送信し他者の画面に表示する +- 他人のPC画面が表示される側と、FrameBufferへの更新が行われる(自身のPC画面を送信する)側に分かれ、それぞれをRFBクライアント、RFBサーバと呼ぶ +- FrameBufferは、メモリ上に置かれた画像データのこと +- RFBクライアントに送信するデータは画面全てではなく、変更があった部分のFrameBufferを送る + + +## Multicastによる画面配信 +- 配信PC画面の変更があった部分のみをUpdateRectangleとしてマルチキャストで一度のみ送信する +- RFBプロトコルでは画像データをRectangleで送信しているため、UpdateRectangleには複数のRectangleが入るような構成をとる + +<center><img src="./fig/UpdateRectangleStruct.svg" alt="message" width="450" height="350"></center> + +## Multicastの問題点 +- wifiのMulticast Paketの最大サイズは64KBである +- HDや4Kの画面を更新するためのサイズは大きい + - 4Kの場合8MB x 8Byteで64MB +- 送信データの圧縮と64KB毎のパケット変換が必要 + +## RFBプロトコルのエンコードタイプ +- ZRLEとはRFBプロトコルでサポートされているエンコードタイプの1つ +- zlib圧縮、タイリング、run lengthエンコードを組み合わせている +- 解凍に必要な辞書を書き出すことができないため、途中からデータを受け取ると正確に解凍できなくなる + +<center><img src="./fig/ZlibTiling.svg" alt="message" width="550" height="450"></center> + + +## TreeVNCの画像データ圧縮方法 +- ZRLEを改変したZRLEEを使用している +- 辞書の書き出しを行えるようにし、データを途中から受け取っても解凍することが可能 +- ZRLEを一度解凍し、辞書を書き出して再圧縮を行う +- zlibは適当なタイミングで圧縮を書き出し(flush)を行う必要がある + - zlibのAPIを用いて、適当なタイミングでflushを行なっている + - 1tileずつflushしてしまうと圧縮率を下げてしまう可能性がある + +<center><img src="./fig/EncodeZRLEE.svg" alt="message" width="550" height="450"></center> + +## Blockingの考察 +- 64KBのパケットに収めるため、ZRLEEで圧縮する前にBlockingを行い、Rectangleの再構成を行う +- ZRLEを解凍したデータのRectangleは以下のような状況になっていると考えられ、Phaseで区別する + - 行の途中から行の最後まで Phase0 + - 行の最初から最後まで Phase1 + - 行の最初から行の途中まで Phase2 + +<center><img src="./fig/FrameUpdateRectangleColor.svg" alt="message" width="500" height="400"></center> + +## Blockingの考察 +- 最大3つのRectangleの再構成を行いつつ、ZRLEEで変換を行いパケットの構成をする +- UpdateRectangleには3つのRectangleが入る + +<center><img src="./fig/FrameUpdateRectangleColor.svg" alt="message" width="500" height="400"></center> + + +## paket lossする可能性 +- wifiのMulticast paketは確実に送信されることが保証されておらず、paket lossする可能性がある +- その対策としては以下の2つが取れる + - 何もしない、定期的に全画面のデータが送信されるため問題ない考える + - 再送要求を行う、処理が複雑であることが予想される +- 現状では何もせず、全画面のデータの送信を待つ方式でも十分実用に耐えると考える + + +<!-- ## TreeVNC の構造 +- TreeVNCは接続してきたクライアントをNodeとし、木構造状に管理する +- ルートのノードをRoot Nodeと呼び、その下に新たなNodeを接続していく +- Root Nodeが参照しているVNCServerからFrameBufferUpdateを取得し、各Nodeに送信する +- 木構造状に接続することで、画像データのコピーを各Nodeに負担させることができる + +<center><img src="./fig/treevnc-crop.svg" alt="message" width="450" height="350"></center> + + +## 木構造の再構成 +- Nodeが切断されたことを検知できなければ木構造が維持できない +- Root Nodeが木構造のネットワークトポロジーを管理しているため、Root NodeにNodeの切断を知らせる必要がある +- 切断検知には画像データが入っているMulticastQueueを使用 +- MulticastQueueから画像データが一定時間取得されず、Timeoutを検知した場合切断したと判断する + +## 画像データのエンコード方法 +- TreeVNCではZRLEというエンコードタイプを元にした、ZRLEEというエンコードを用いて画像データを圧縮を行う +- ZRLEはZlibで圧縮されたデータとそのデータのバイト数がヘッダーとして送られる +- Zlibとはデータの可逆圧縮アルゴリズムが実装されているライブラリ + +## 画像データのエンコード方法 +- ZRLEでは解凍時に必要な辞書データを書き出すことができない +- ZRLEEはRoot Nodeで受け取ったZRLEのデータを一度解凍し、辞書データを付与して再圧縮している + +<center><img src="./fig/EncodeZRLEE.svg" alt="message" width="550" height="450"></center> + +## 共有画面切り替え +- 従来のVNCでは、配信者が切り替わるたびに再起動、再接続を行う必要があった +- TreeVNCでは、画面上にあるShareScreenボタンを押すことで配信者の切り替えが実行できる +- ShareScreen実行後、Root Nodeに対しSERVER CHANGE REQUESTというメッセージが送信される +- メッセージを受け取ったRoot Nodeは配信を希望しているNodeのVNCサーバーと通信を行い、切り替え作業に入る + +<center><img src="./fig/ShareScreenSS.svg" alt="message" width="400" height="300"></center> + +## 有線接続との接続の違い +- 現状のTreeVNCでは画面配信のデータ量は多く、無線LAN接続を行うと画面配信の遅延が大きくなる +- WifiのMulticast機能を利用し、UpdateRectangleを一度だけ送信することで無線LAN接続でも十分に遅延が抑えられると考える +- HDや4kの画面更新には64MB程度となり、これを圧縮しつつwifiのMulticast paketの最大サイズ64KBに変換、送信する必要がある +- paket lossがあった場合、再送処理は複雑であると予想できるため、まずBlokingによる実験を行う + +## RFBプロトコルのUpdateRectangleの構成 +- 1つのUpdateRectangleには複数のRectangleが格納されている +- RectangleはZlibで圧縮されたデータが指定された長さだけ格納されており、そのデータはさらに64x64 ByteのTileに分割されている + +## RFBプロトコルのUpdateRectangleの構成 +- 無線接続の場合、一度に送信できるデータ量が64KBしかないため、それに合わせて更新された部分のRectangleを分割する必要がある + - Phase0 行の途中から始まる部分 + - Phase1 行の最初から最後までの部分 + - Phase2 行の途中で終わる部分 + +<center><img src="./fig/FrameUpdateRectangleColor.svg" alt="message" width="550" height="450"></center> + + +## 木構造とマルチキャストの共存 +- ツリーに無線接続のNodeを加えてしまうと全体の配信遅延に繋がる +- 無線接続時のMulticastの実装を提案 +- Multicastならば、Serverからの送信は一度で済むため、ツリー構造の形成が必要ない +- 従って新しいNodeが無線接続であっても、有線接続のツリーの配信には影響が出ない + +<center><img src="./fig/interface-crop.svg" alt="message" width="500" height="450"></center> +--> + +## まとめ +- WifiでMulticast paketを利用する手法についての考察を行なった + - Wifiの速度とMulticastの信頼性が高ければ実用的である可能性がある + - Blockingは実装中、再圧縮の時間は実用的な時間で済むと予想されている + +- 今後の課題 + - Blockingの実装 + - WifiのMulticast paket lossは接続環境や状況に依存すると思われるためさらなる実験が必要 + - Node接続じの有線接続と無線接続の判断、区別処理の実装 + \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/ryokka.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,2 @@ +# ryokka +This is ryokka's page \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/ryokka/master-slide.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,5 @@ + +# たいとる + + +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/ryokka/poster-slide.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,1 @@ +# てすと \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/shaga4899.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,2 @@ +# shaga4899 +This is shaga4899's page \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/soto.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,2 @@ +# soto +This is soto's page \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/soto/log/2020-04-21.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,38 @@ +# 4/15~4/21の進捗 +まだいまいち自分が何をしたら良いのかまだ分かっていないので、kooさんがPROSYMで提出した論文を読みました。 + +## kooさんの論文について +perl6の起動が遅いことがネックになっている。 +であるならば最初から起動しておけば起動時間について考えなくても良い。 + +### 実装方法 +実行用のサーバープロセスを立ち上げて待機させておく。 +これで起動時間が遅い問題を解決される + +ソケット通信により実行するスクリプトファイルのパスを送信するとこのサーバーにて実行がなされる仕組みである。 + +実行したあとは実行結果をクライアント側に返す + +### 起動時が遅いとは +> MoarVM を起動, NQP をロード, Rakudo をロードもしくはコンパイルし, その後 JIT しながら実行する. +この部分が遅いらしい + +## Continuatuon bsased C での Hoare Logicを用いたred-black-treeの検証 + +- OS やアプリケーションの信頼性は重要である。信頼性を上げるにはプログラムが仕様を満たしていることを検証する必要がある + +- Hoare Logicでは、ある事前条件が成り立つとき、ある何らかの計算 (以下コマンド) を実行した後に事後条件が成り立つことを検証する。 + +- CbCでは継続渡しによって動くが、これをHoare Logicを続けていくことで検証をすることができる + +## 近況 +- 水・木・金はバイトでした + - プロ3とソフトウェア工学で何か課題が出ていたら内容を教えていただけると幸いです… +- 土曜日は母(大学教員)のリモート講義のヘルプをしていました +- 日曜日は勉強会に参加した後にAtCoderをしました。 +- 月曜日はまたバイトをしていました… +- 火曜日(今日)上記の通り、kooさんの論文を読みました。 + +## 私事 +- 授業登録を行った +- ingressを緑にして再スタートすることにした
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/soto/log/2020-04-28.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,24 @@ +# 今週の進捗 + +## 研究内容を考える + +- cbcについて +> Continuation based C(CbC) は、C からループ制御構造とサブルーチンコールを取り除き、継続を導入した C の下位言語である。継続呼び出しは引数付き goto 文で表現される。 + +- Hoare Logicについて +> 事前条件 P を満足する時に、プログラム S を実行すると、その実行後には,事後条件 Q を満足する。プログラム S が終了すれば, プログラム実行の効果として、事前条件と事後条件との対によって表現した意図通りの結果が得られる。 + +- このCbCの継続の部分をHoareLogicで関数の実行を証明してやる、プログラムに使用されている関数一つ一つを独立して正常な実行の証明ができたなら、そのプログラムの正常な実行の証明となる + +- 関数に与えられる引数を事前条件、関数実行後の戻り値を事後条件とし、CbCではこの事後条件が次の関数の引数とするので、次の関数の事前条件となる。実行を継続渡しで行うCbCのプログラム自体の検証ができる + +- また、Hoare Logicの検証の中に「コマンドが停止すること」というものがある。これが外間さんの修論で説明していたもの(少し理解が足りていないのでもう少しみてみます…) + +## 思っていること +- 概念的にはプログラムを全て再起処理で実行する感じ +- 普通のプログラムは、書き方によって様々だが変数を複数箇所で変更したりする。 + - この時のバグつぶしが面倒である。変数がどの関数によって書き換わったのか、関数の流れを探るのが面倒であるため。 + - しかし、CbCの記法なら、デバッグしてやればどこの関数でどの値が渡されたからバグが発生しているのかわかる。 + +## 雑多やったこと +- Tobiuo君のページ更新の監督をしました \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/soto/log/2020-05-19.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,36 @@ +# 今週の進捗 + +## 研究目的 +- cbcについて +> Continuation based C(CbC) は、C からループ制御構造とサブルーチンコールを取り除き、継続を導入した C の下位言語である。継続呼び出しは引数付き goto 文で表現される。 + +- Hoare Logicについて +> 事前条件 P を満足する時に、プログラム S を実行すると、その実行後には,事後条件 Q を満足する。プログラム S が終了すれば, プログラム実行の効果として、事前条件と事後条件との対によって表現した意図通りの結果が得られる。 + +- このCbCの継続の部分をHoareLogicで関数の実行を証明する、プログラムに使用されている関数一つ一つを独立して正常な実行の証明ができたなら、そのプログラムの正常な実行の証明となる + +- 関数に与えられる引数を事前条件、関数実行後の戻り値を事後条件とし、CbCではこの事後条件が次の関数の引数とするので、次の関数の事前条件となる。実行を継続渡しで行うCbCのプログラム自体の検証ができる + +- また、Hoare Logicの検証の中に「コマンドが停止すること」というものがある。これが外間さんの修論で説明していたもの(少し理解が足りていないのでもう少しみてみます…) + + +## 今週の進捗 +バイトの時間以外ずっとソフ演3のoauthをずっとやっていました。 +そしたら日曜日体調を崩しました。 +vscodeのagdaプラグインを調べました。 + + +## sof3 +node.jsでoauthを使ってユーザーの情報を管理したい。 +ですが、自分のwebの理解が足りないのもあってユーザー情報(メールアドレスやトークン情報があるはず)を取得できていない。 +文献が少ない感じなのでnode.js諦めてもうdjangoでやってしまおうかなという話も… + + +## VScodeのagdaプラグインについて +ここ[language-agda - Visual Studio Marketplace](https://marketplace.visualstudio.com/items?itemName=j-mueller.agda&ssr=false#overview) +を調べたのですがどうもシンタックスハイライトと記号のスニペットはあるらしいですが実行は対応していなさそうです。 +[コード](https://github.com/j-mueller/language-agda) + +別手口でやるとしたらatomにプラグインをいれる方法と +spaceemacsにvimのキーマップをいれるかがありそうです(まだ詳しくは調べていません…) +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/soto/log/2020-05-26.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,24 @@ +# 5月26日の進捗 + +## 研究目的 +- CbCとは、Cからループ制御構造とサブルーチンコールを取り除き、継続を導入したCの下位言語である。継続呼び出しは引数付き goto 文で表現される。 + +- CbCの信頼性を検証したい。 + +- ホーア理論の定義に部分正当性と正当性というものがある。事前条件(precondition) P が成り立つときに、プログラム S を実行して、それが停止した場合においては必ず事後条件(postcondition) Q が成り立つならば、プログラム S は、事前条件 P と事後条件 Q とに関して部分的に正当(partially correct)と言う。 + +- DatasegmentをPとし、CodesegmentをS、出力されたDatasegmentをQとしてCbCの記述にHoare Logicを当てはめることでCodesegmentが部分的に正当であることが示せる。 + +- Hoare Logicの定義に正当性(correctness)と言うものがある。プログラム S が事前条件 P に関して停止し、停止後には必ず事後条件 Q が成り立つならば、プログラム S は、事前条件 P と事後条件 Q とに関して正当(correct)であるという。 + - これについてryokkaさんが修論でCbCでのループ文を検証した + + +# 今週やったこと +- 研究目的を書くために論文などを調査 + - Continuation based C での Hoare Logic を用いた仕様記述と検証 + - 継続を基本とする言語CbCによる分散プログラミング + - 継続を基本とするC言語CbCのご紹介 + - An Axiomatic Basis for Computer Programming(途中) + +# その他 +- 申し訳なかったのですが人と協力して何かを行うメンタル的な余裕がなかったのでプロ3を履修中止します…
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/soto/log/2020-06-02.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,36 @@ +# 06/02\_今週の進捗 + +## 研究目的 +- OSやアプリケーションの信頼性は重要な課題である。 + - 信頼性をあげるには「モデル検査」や「定理証明など」がある。 + - 検証手法として「Hoare Logic」がある。 + +- CbCはCode Gear の継続によって記述される。これにHoare Logicの部分正当性を適応させると、CbCで記述されたプログラムの検証を簡単に行うことができる。 + +- CbCをHoare Logicにより検証していく + + + +## CbCについて +- CbCとは、Cからループ制御構造とサブルーチンコールを取り除き、継続を導入したCの下位言語である。継続呼び出しは引数付き goto 文で表現される。 + +- Code / Data Gear による継続によって記述される。 + + +## Hoare Logicについて +- プログラム検証の手法で、事前条件(P)、プログラム(Q)、及びその実行結果の説明(R)とする。 + + - プログラム(Q)の開始前に事前条件(P)が真の場合、結果Rはその完了時に真となるというもの。(部分正当性) + +- 普通のプログラムでは、途中で前提条件となる(P)に何が当てはまるのか正確にはわからない。しかし、CbCなら引数は前のCode Gearの結果が入ることが分かる。 + +- DatasegmentをPとし、CodesegmentをQ、出力されたDatasegmentをRとしてCbCの記述にHoare Logicを当てはめることでCodesegmentが部分的に正当であることが示せる。 + +- Code Gearの前提条件はその前の継続の結果...というようにできる。 + +- このように、CbCではプログラムの一部分を全てHoare Logicにより証明できたなら、その継続となるプログラムとなるので、CbCとの相性が良い。 + + +## 今週の進捗 +- 論文(axiomatic basis for computer Programming)を読んでいます。 +- AtCoderで茶色になりました。
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/soto/log/2020-06-16.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,36 @@ +# 研究目的 +- OSやアプリケーションの信頼性は重要な課題である。 + +- 研究室でCbCという言語を開発している。その信頼性を証明したい。 + +- CbCとは、Cからループ制御構造とサブルーチンコールを取り除き、継続を導入したCの下位言語である。継続呼び出しは引数付き goto 文で表現される。 + +- プログラムの正当性を証明するためにHoare Logicという検証手法がある。これを説明すると、「プログラムの事前条件(P)が成立しているとき、コマンド(C)実行して停止すると(Q)が成り立つ」というもので、CbCの実行を継続するという性質に非常に相性が良い。 + +- これらのことから、Hoare Logicを用いてCbCを検証できるか実験していく。 + +# pre-conditionとpost-conditionについて +- Hoare Logicで前提条件(P)、プログラム(C)、事後条件(P)とあるが、これをCbCに置き換えて考える。 + +- プログラムは単純にCodeGearとなる。 +- 前提条件、事後条件はCodeGearの引数と戻り値であるDataGearとなるが、ここでは引数(前提条件)をPreCondition、戻り値(事後条件)をPostConditionとする。 + + +# Meta Data Gearについて +まだ少し勉強中です… +来週までにはこの部分を理解できるようにします… + +# 今週の進捗として +- 研究目的を書き続けています。 +- btの実装内容を自分があまり理解できていなかった部分があったので、Pythonにて一度実装してみました。 + - 今回の実装部分はサイトのコピペだったので、これから外間さんの書いたbtの実装に合わせるように実装し直してみたい…? + - red-black treeもまずはpythonで実装してみて、必要な要素を理解してからagdaで記述したい。 + +# 近況として +- バイトを週3回から週2回に交渉してきました。(やったね) +- 工学部の近くでハブが出たらしく夜にingressできなくなった。 + +# 来週は +- whileTestPrim.agdaの整理(その時にいろいろ書いたものが残っているため) +- 作成したものをhgにpushしたい +- btの記述
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/soto/log/2020-07-07.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,21 @@ +# 研究目的 +- OSやアプリケーションの信頼性は重要な課題である。 + +- 研究室でCbCという言語を開発している。その信頼性を証明したい。 + +- CbCとは、Cからループ制御構造とサブルーチンコールを取り除き、継続を導入したCの下位言語である。継続呼び出しは引数付き goto 文で表現される。 + +- プログラムの正当性を証明するためにHoare Logicという検証手法がある。これを説明すると、「プログラムの事前条件(P)が成立しているとき、コマンド(C)実行して停止すると事後条件(Q)が成り立つ」というもので、CbCの実行を継続するという性質に非常に相性が良い。 + +- これらのことから、Hoare Logicを用いてCbCを検証できるか実験していく。 + +# 今週の進捗 +- btの実装と睨めっこしてました。 + +# 近況として +- バイトを2ヶ月ほど休む交渉をしてきました。 +- ただ、そろそろ保険管理センターのバイトが始まります… +- あとはOOLのSDNプログラムも始まります… + +# 来週は +- btの実装を読む \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/soto/log/2020-07-14.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,49 @@ +# 研究目的 +- OSやアプリケーションの信頼性を高めることは重要な課題である。 + +- 研究室でCbCという言語を開発している。その信頼性を証明したい。 + +- CbCとは、Cからループ制御構造とサブルーチンコールを取り除き、継続を導入したCの下位言語である。継続呼び出しは引数付き goto 文で表現される。 + +- プログラムの正当性を証明するためにHoare Logicという検証手法がある。これを説明すると、「プログラムの事前条件(P)が成立しているとき、コマンド(C)実行して停止すると事後条件(Q)が成り立つ」というもので、CbCの実行を継続するという性質に非常に相性が良い。 + +- これらのことから、Hoare Logicを用いてCbCを検証できるか実験していく。 + +# 今週やったこと +- 水曜日は柿の種と紅茶をライカムに買いに行ってきました。 +- 木曜日はOkuda君と清水先生のxv6(とCbC)について教えてもらっていました。 + - brewでCbCgccのインストールもした +- 金曜日はrakuのintroをしました。 + - [ここ](https://raku.guide/ja/)とかを見てやっていました。 + - ~~所感としては結構pythonに似ている感じがしていました~~ +- 土日でAtcoderをしていました。(c++,raku,haskellで) +- 月曜日は論文を読んでいました。 + +## xv6 +xv6はMITで使われている超軽量なOS。 +xv6 is a re-implementation of Dennis Ritchie's and Ken Thompson's Unix +Version 6 (v6) +通常はARMアーキテクチャでC言語でビルドするが、これをCbCでビルドするためにバグ取りをしていた。 + +## cbc +感覚的に以下のような物であると理解しました。 + +- c言語は関数を呼び出すときにjunpを行うが、これを行う際に現在のメモリを退避させている。 +- junpで関数を実行するのではなくgotoで行うことで退避することなくプログラムを実行することができる +- ただ、gotoでcode gearに移動すると普通の関数実行のようにreturn文で元の関数に戻ってくることはできない。 + +これらのことから、再起処理を使用するプログラムであるフィボナッチ数列を実装してCbCとcの速度を比較しようとしている。 +退避するメモリが多くなったり、関数呼び出しの回数が増えるとCbCが高速になると考える。 + +### やっている際に理解したこと +- `objdump somefilename`でアセンブラが読める +- セグフォがでたら**lldb**で`process launch` するとセグフォの発生場所がわかる。 + +### 謎 +フィボナッチ数列のコードはcとCbCでほとんど同じだった。しかしc言語の記述でセグフォが発生していた部分がCbCでは発生していなかった。エラー文は以下。 +``` +warning: could not execute support code to read Objective-C class data in the process. This may reduce the quality of type information available. +(unsigned long long) $0 = 15001297698433075202 +``` + +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/soto/log/2020-08-18.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,38 @@ +# 研究目的 +- OSやアプリケーションの信頼性を高めることは重要な課題である。 + +- 研究室でCbCという言語を開発している。その信頼性を証明したい。 + +- CbCとは、Cからループ制御構造とサブルーチンコールを取り除き、継続を導入したCの下位言語である。継続呼び出しは引数付き goto 文で表現される。 + +- プログラムの正当性を証明するためにHoare Logicという検証手法がある。これを説明すると、「プログラムの事前条件(P)が成立しているとき、コマンド(C)実行して停止すると事後条件(Q)が成り立つ」というもので、CbCの実行を継続するという性質に非常に相性が良い。 + +- これらのことから、Hoare Logicを用いてCbCを検証できるか実験していく。 + +- 先行研究としてwhile programの検証をしている「Continuation based C での Hoare Logic を用いた仕様記述と検証」がある。他のループが発生するプログラムの検証が挙げられる。同様に検証が行えるのであれば、共通で使えるライブラリのような形でまとめることで、より容易な検証ができるようになるのではないかと考えている。とあり、Binary Tree や RedBlack Tree などのデータ構造が挙げられる。 + +# 今週やったこと +wehiletest spec specimple +- whiletestprogramをコピペして動かしながら読んでいました。 + +```agda:whiletest.agda +Cond : Set +Cond = (Env → Bool) + +Axiom : Cond -> PrimComm -> Cond -> Set +Axiom pre comm post = ∀ (env : Env) → (pre env) ⇒ ( post (comm env)) ≡ true + +Tautology : Cond -> Cond -> Set +Tautology pre post = ∀ (env : Env) → (pre env) ⇒ (post env) ≡ true +``` + +- axiomとtautologyがわからない(論文にも何をしているものなのか説明がなかった) + +- ploofから難易度が跳ね上がっていたのでremma1まで読み終わった。 + + +# 余談 +- agdaのチュートリアルのようなものを書いています。 +- ABC175に参加して3完しました。 + - C問題が面白かったです。 +- 過去の論文の参考文献にOSの検証をしているものがあるらしいので調べてみたい \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/soto/log/2020-08-25.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,81 @@ +# 研究目的 + +# やっていること +- axiomとtautology +- + +# axiomとtautology +慣習的なものとあったのですが論文などは見つからなかったです… + +axiomとtautologyの定義は以下 +```agda:axiomとtautology +Axiom : Cond -> PrimComm -> Cond -> Set +Axiom pre comm post = ∀ (env : Env) → (pre env) ⇒ ( post (comm env)) ≡ true + +Tautology : Cond -> Cond -> Set +Tautology pre post = ∀ (env : Env) → (pre env) ⇒ (post env) ≡ true +``` +axiomはつまりpre_condition,command,post_conditionを受け取ってそれを検証できる。 + +Tautologyはpre_condとpost_condの2つを受け取ってそれの検証ができる + +# lemma1について +```agda:remma1 +lemma1 : {c10 : ℕ} → Axiom (stmt1Cond {c10}) + (λ env → record { varn = varn env ; vari = 0 }) + (stmt2Cond {c10}) +``` +remma1は +> 事前条件が成り立つとき代入を行うと代入後の事後条件が成り立つ証明 + +とある。 + +stmt1はvarnが入力と等しいことを +stmt2はvarnが入力でvariが0と等しいので入力時のcondになる +stmt1がpre_condとなり、commandがvernにenvを代入、post_condにstmt2となっている。 + +それだとstmt1のvarnは0と等しくして、代入が行われたからstmt2になるという感じのHoare Tripleになるのでは + +# lemma2について +```agda:remma2 +lemma2 : {c10 : ℕ} → Tautology stmt2Cond whileInv + +lemma21 : {env : Env } → {c10 : ℕ} → stmt2Cond env ≡ true → varn env ≡ c10 + +lemma22 : {env : Env } → {c10 : ℕ} → stmt2Cond {c10} env ≡ true → vari env ≡ 0 + +lemma23 : {env : Env } → {c10 : ℕ} → stmt2Cond env ≡ true → varn env + vari env ≡ c10 +``` +lemma2の定義はtautologyでstmt2condとwhileInvを受け取っている。 +なのでstmt2condは代入直後のことを言っている。 +whileinvはvarnとvariを足した値が引数と同値であることを示している。 +tautologyはconditionを二つ受け取り、両方が正しいことを示す。 +つまり代入直後からループを動作させている間も値が等しいことを証明できる。 + +# lemma3について +```agda:lemma3 +lemma3 : Axiom (λ e → whileInv e ∧ lt zero (varn e)) + (λ env → record { varn = varn env ; vari = vari env + 1 }) whileInv' +``` +lemma3の定義はaxiomでPcommの代入の証明となっているので +commandがvariに加算するものになっている。 +post cond がwhileInv'で +こいつの定義がvarnが0以上になっているので良さそう +でもvarnが0以下にならない事しか保証されていないような… + +# lemma4について +lemma4はループが動く度にvarnは減るけどvariと足して +入力と同地になるようにvariが動くことを保証している気がする。 + +# lemma5について +lemma5はtautologyのなんかとtermcond + +varnが0より小さいになっている気がするけど大丈夫なのかこれは +termcondはvariが入力と同じになっている感じ + + +個人的にはlemma3と4は対応している感じがしていて、 +lemma3はループが動く度にvariが足されるけど +varnと足しても入力(c10)と同値になるようにvarnが動く事、 + +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/soto/log/2020-09-08.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,27 @@ +# 研究目的 +- OSやアプリケーションの信頼性を高めることは重要な課題である。 + +- 研究室でCbCという言語を開発している。その信頼性を証明したい。 + +- CbCとは、Cからループ制御構造とサブルーチンコールを取り除き、継続を導入したCの下位言語である。継続呼び出しは引数付き goto 文で表現される。 + +- プログラムの正当性を証明するためにHoare Logicという検証手法がある。これを説明すると、「プログラムの事前条件(P)が成立しているとき、コマンド(C)実行して停止すると事後条件(Q)が成り立つ」というもので、CbCの実行を継続するという性質に非常に相性が良い。 + +- これらのことから、Hoare Logicを用いてCbCを検証できるか実験していく。 + +- cbcはサブルーチンとスープ制御をcから取り除いている。その為、それを実装した際のプログラムを検証をする必要がある。 + +- 先行研究ではCbCにおけるWhileLoopの検証を行なった。 + +- agdaが変数への再代入を許していない為、ループが存在し、かつ再代入がプログラムに含まれるデータ構造である赤黒木の検証を行う + +# 今週の進捗 +- 外間さんの修論を読んで、記述されているコードを一通り動かせた。 +- 中間予稿を執筆中(締め切りは来週) + - 今年からアブストラクトを描かないといけなかったり、Agdaの特殊文字を記載することにてこずっていた。 + - 手法の方は外間さんの手法を整理してそれを書くことでお茶を濁したい。 + + +# 余談 +- 保険管理センターのバイトをしていた。(明日9/9に再MTG) +- 日曜日にTOEICがあるので少し勉強するなど \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/soto/log/2020-09-29.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,28 @@ +# 研究目的 +- OSやアプリケーションの信頼性を高めることは重要な課題である。 + +- 研究室でCbCという言語を開発している。その信頼性を証明したい。 + +- CbCとは、Cからループ制御構造とサブルーチンコールを取り除き、継続を導入したCの下位言語である。継続呼び出しは引数付き goto 文で表現される。 + +- プログラムの正当性を証明するためにHoare Logicという検証手法がある。これを説明すると、「プログラムの事前条件(P)が成立しているとき、コマンド(C)実行して停止すると事後条件(Q)が成り立つ」というものである。 + +- CbC では実行を継続するため、ある関数の実行結果は事後条 件になるが、その実行結果が遷移する次の関数の事前条件になる。それを繋げていくため、個々の関数の正当性を証明することと接続の健全性について証明するだけでプログラム全体の検証を行うことができる。 + +- これらのことから、Hoare Logicを用いてCbCを検証できるか実験していく。 + +- cbcはサブルーチンとスープ制御をcから取り除いている。その為、それを実装した際のプログラムを検証をする必要がある。 + +- 先行研究ではCbCにおけるWhileLoopの検証を行なった。 + +- agdaが変数への再代入を許していない為、ループが存在し、かつ再代入がプログラムに含まれるデータ構造である赤黒木の検証を行う + +# 今週の進捗 +- 中間予稿の方に質問が来ていたので返答していた。 +- OS補講のお手伝いをしたりしていた。 +- シス管の仕事をちらっと見たりしていた。 + - mattermostをumeへ移行するのを見ていた。 +- 保険管理センターのバイトをしてきた。 + - perlのしかもcgiで書かれていてむずかしかったです。 + - 仕様のミスがあったので修正してきた。 +- 普通のバイトしたりもしていた。 \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/soto/log/2020-10-13.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,29 @@ +# 研究目的 +- OSやアプリケーションの信頼性を高めることは重要な課題である。 + +- 研究室でCbCという言語を開発している。その信頼性を証明したい。 + +- CbCとは、Cからループ制御構造とサブルーチンコールを取り除き、継続を導入したCの下位言語である。継続呼び出しは引数付き goto 文で表現される。 + +- プログラムの正当性を証明するためにHoare Logicという検証手法がある。これを説明すると、「プログラムの事前条件(P)が成立しているとき、コマンド(C)実行して停止すると事後条件(Q)が成り立つ」というものである。 + +- CbC では実行を継続するため、ある関数の実行結果は事後条 件になるが、その実行結果が遷移する次の関数の事前条件になる。それを繋げていくため、個々の関数の正当性を証明することと接続の健全性について証明するだけでプログラム全体の検証を行うことができる。 + +- これらのことから、Hoare Logicを用いてCbCを検証できるか実験していく。 + +- cbcはサブルーチンとスープ制御をcから取り除いている。その為、それを実装した際のプログラムを検証をする必要がある。 + +- 先行研究ではCbCにおけるWhileLoopの検証を行なった。 + +- agdaが変数への再代入を許していない為、ループが存在し、かつ再代入がプログラムに含まれるデータ構造である赤黒木の検証を行う + +# 今週の進捗 +- シス管の仕事を手伝ったりしていた。 +- 保険管理センターのバイトをしてきた。 + - 無事終了した。 +- 普通にバイトしたりもしていた。 +- 中間予稿を執筆していた際にWhile testの整頓をしていたのでそれをpushするなどした + - 今見てみるとまだ治せるところがありそうでした… + +# 余談 +- 自作pcを組んだ \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/soto/log/2020-11-17.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,31 @@ +# 研究目的 +- OSやアプリケーションの信頼性を高めることは重要な課題である。 + +- 研究室でCbCという言語を開発している。その信頼性を証明したい。 + +- CbCとは、Cからループ制御構造とサブルーチンコールを取り除き、継続を導入したCの下位言語である。継続呼び出しは引数付き goto 文で表現される。 + +- プログラムの正当性を証明するためにHoare Logicという検証手法がある。これを説明すると、「プログラムの事前条件(P)が成立しているとき、コマンド(C)実行して停止すると事後条件(Q)が成り立つ」というものである。 + +- CbC では実行を継続するため、ある関数の実行結果は事後条件になるが、その実行結果が遷移する次の関数の事前条件になる。それを繋げていくため、個々の関数の正当性を証明することと接続の健全性について証明するだけでプログラム全体の検証を行うことができる。 + +- これらのことから、Hoare Logicを用いてCbCを検証できるか実験していく。 + +- cbcはサブルーチンとスープ制御をcから取り除いている。その為、それを実装した際のプログラムを検証をする必要がある。 + +- 先行研究ではCbCにおけるWhileLoopの検証を行なった。 + +- agdaが変数への再代入を許していない為、ループが存在し、かつ再代入がプログラムに含まれるデータ構造である赤黒木の検証を行う + +## 今週の進捗 + +- btとrbt(llrbt)のinsert部分を実装しました + - ただ、CbCの要素や検証の要素などは無いです + - CbCの方に対応するためには、実装を再起処理で書いてしまっているのでおそらく良く無い +- 停電対応 +- AtCoder + - B問題がちょっと面倒だった + - D問題はいもす法を使うらしい。なるほどわからん。 + +## 余談 +- 先週はプリコネをしていた \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/soto/log/2020-11-24.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,35 @@ +# 研究目的 + +- OSやアプリケーションの信頼性を高めることは重要な課題である。 + +- 研究室でCbCという言語を開発している。その信頼性を証明したい。 + +- CbCとは、Cからループ制御構造とサブルーチンコールを取り除き、継続を導入したCの下位言語である。継続呼び出しは引数付き goto 文で表現される。 + +- プログラムの正当性を証明するためにHoare Logicという検証手法がある。これを説明すると、「プログラムの事前条件(P)が成立しているとき、コマンド(C)実行して停止すると事後条件(Q)が成り立つ」というものである。 + +- CbC では実行を継続するため、ある関数の実行結果は事後条件になるが、その実行結果が遷移する次の関数の事前条件になる。それを繋げていくため、個々の関数の正当性を証明することと接続の健全性について証明するだけでプログラム全体の検証を行うことができる。 + +- これらのことから、Hoare Logicを用いてCbCを検証できるか実験していく。 + +- cbcはサブルーチンとスープ制御をcから取り除いている。その為、それを実装した際のプログラムを検証をする必要がある。 + +- 先行研究ではCbCにおけるWhileLoopの検証を行なった。 + +- agdaが変数への再代入を許していない為、ループが存在し、かつ再代入がプログラムに含まれるデータ構造である赤黒木の検証を行う + +## 今週の進捗 + +- continuationなLLRB-Treeのinsertを実装しました。 + - 関数の最後の方に次の関数へ遷移するように実装したので、おそらく正しく実装できているはず + - insertをする際に下のnodeを参照する。その際にkeyと参照するnodeの反対側を保持する + - その後、mergeする際に保持したtreeをmergeすることでinsertを実行する + +- 関数を循環させたかったのでプロトタイプ宣言のようにできることを発見した。 + +- AtCoder + - ARCはA問題しか解けなかった + - ABCはB問題までしか解けなかった + +## 余談 +- 今週はArknightsをやっていた(危機契約難しい) \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/soto/log/2020-12-1.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,35 @@ +# 研究目的 + +- OSやアプリケーションの信頼性を高めることは重要な課題である。 + +- 研究室でCbCという言語を開発している。その信頼性を証明したい。 + +- CbCとは、Cからループ制御構造とサブルーチンコールを取り除き、継続を導入したCの下位言語である。継続呼び出しは引数付き goto 文で表現される。 + +- プログラムの正当性を証明するためにHoare Logicという検証手法がある。これを説明すると、「プログラムの事前条件(P)が成立しているとき、コマンド(C)実行して停止すると事後条件(Q)が成り立つ」というものである。 + +- CbC では実行を継続するため、ある関数の実行結果は事後条件になるが、その実行結果が遷移する次の関数の事前条件になる。それを繋げていくため、個々の関数の正当性を証明することと接続の健全性について証明するだけでプログラム全体の検証を行うことができる。 + +- これらのことから、Hoare Logicを用いてCbCを検証できるか実験していく。 + +- cbcはサブルーチンとスープ制御をcから取り除いている。その為、それを実装した際のプログラムを検証をする必要がある。 + +- 先行研究ではCbCにおけるWhileLoopの検証を行なった。 + +- agdaが変数への再代入を許していない為、ループが存在し、かつ再代入がプログラムに含まれるデータ構造である赤黒木の検証を行う + +## 今週の進捗 +- continuationなLLRB-Treeのinsertを若干修正 + - あまりよろしく無い実装をしていたのでそれを修正 + - ループ部分のterminationは外せなさそう(外す際にその部分で実装を行わないといけなくなり、意味が変わってくる) + - rotate-right,leftのnextとexitをどうしようか迷っている。 + - 全てnext/exitのどちらかに統一する方法 + - 例外処理としてexitさせる + - 現在は例外処理としてexitさせているが、nextと同じ遷移先を示している。 + +- 水を購入 + +- ダージリンティーを購入 + +## 余談 +- 12月になって寒くなってきた \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/tawata.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,2 @@ +# tawata +This is tawata's page \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/tobaru.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,2 @@ +# tobaru +This is tobaru's page \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/tobaru/master-presentation-slide.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,564 @@ +# CbCインターフェースによる CbCXv6 の書き換え +- 並列信頼研 +- 桃原 優 + +--- + +# 概要 +- OS の信頼性を上げたい +- CbCという言語を使って xv6 という OS を書き換える +- Paging の書き換えを行った +- まだ実装中 +- 将来はコンテナやVMを実装できるはず + +--- + +# OS の信頼性を上げたい +- OS自体が複雑で検証が困難。 + - バグの原因に +- OSの仕様を定義してそれを満たすことを証明する +- 証明しやすい形の記述を作る +- CbCの goto で書く + - 状態遷移系に近い形で記述できる(証明しやすい) + - 関数型の記述 + - 入力に対しての出力を検証する +- 記述のモジュール化 + - CbCのインターフェースで書く + - 煩雑な記述の解消 + - 入力の切り替えによる機能の入れ替え + +--- + +# ノーマルレベルとメタレベル +- ノーマルレベル + - CbCで記述される部分 +- メタレベル + - Paging などのメモリやCPU自体の操作 + - (ノーマルレベルの)プログラムの正しさの証明 + - cmake で生成している + +--- + +# Continuation based C +- 状態遷移ベースで記述できる言語(以下CbC) +- cmake で CbC からメタレベルの記述を生成する +- Code Gear + - 基本的な処理の単位 + - goto 文で遷移する +- Data Gear + - Code Gear からアクセスできるデータの単位 + - 引数など +- Meta Code Gear + - Code Gear の間に挟まれるメタレベルの処理 +- Meta Data Gear + - Code Gearの間の接続などの情報 + - Context(後ほど説明) + +--- + +# ノーマルレベル + +--- +# Code Gear による継続 +- Code Gear の処理の間を goto によって遷移していく +- __code CodeGear名 で定義 +![](https://i.imgur.com/etfQund.png) + + +--- + +# Data Gear の継続 +- Code Gear からアクセスできるデータ +- input Data Gear と Output Data Gear で証明する + +![](https://i.imgur.com/3E0DGWA.png) + +--- +# メタレベル + +--- + +# Meta Code Gear +- メタレベルで見ると Code Gear の間にメタレベルの処理が挟まっている +- cmake で __code CodeGear名_stub が生成される +![](https://i.imgur.com/vy0NxrG.png) + +--- + +# Meta Data Gear +- ノーマルレベルでの書き換えやアクセスを防ぐために存在 +- CbC の 接続可能な Code Gear, Data Gear のリスト +- Data Gear を確保するメモリ空間 +- Context + +--- + +# Context +- Meta Data Gear +- Contextには全てのData Gear と Code Gear が登録されている +- ユーザープロセスに対応して1つのcontextが存在する +- 将来的なVMやコンテナの実装はContextの切り替えるによる実装を目指している +![](https://i.imgur.com/GLIew1x.png) +- Code Gear は Context 内の Data Gear の関数ポインタを持っていてそこにアクセスする +- stub Code Gear でOutput Data Gear のポインタを参照してそこに書き出す + +--- + +# Xv6 +- MIT の講義用教材として作られたOS + - 規格化される前のCで書かれたUNIX V6 を書き換えた + - 1万行程の軽量なOS + - Linuxだと数千万行 +- Xv6 をCbCで書き換える + +--- + +# Xv6の構成 +- system call + - カーネル空間の処理の呼び出し +- VM(仮想メモリ) + - Paging +- File System + - I/O, Read, Write +- Scheduler など + +--- + +# カーネル空間 +- OS の中核となるプログラムで Meta Level に相当する +- Xv6 ではカーネルとユーザープログラムは分離されている +- ユーザープログラムはカーネルに直接アクセスできない。 + - ユーザープログラムによる書き換えやアクセスを防ぐため + - 呼び出す場合は system call + +--- + +# Paging +- Page と呼ばれる固定長のブロックに分割して、メモリとスワップ領域で Page を入れ替えて管理 +- 仮想メモリとして扱うことでフラグメンテーションの解消と空き番地を探す必要がなくなる + +--- + +# Xv6の書き換え方針 +- メタレベルからノーマルレベルを保証するOSを作りたい +- 段階的に書き換えていきたい +- Paging を書き換える理由 + - OS の信頼性を保証する上で重要なメモリ管理部分 + +- __code で書き直していく + +--- + +# インターフェースの導入 +- ノーマルレベルからメタレベルの記述が記述が煩雑になるためインターフェースを導入 +- インターフェースによるメリット + - 煩雑な記述の解消 + - 入力の切り替えによる実装の入れ替え +- 実装は別で定義し、呼び出す + - 後ほど説明 + +--- + +# CbCインターフェース +- Data Gear と Data Gear に対して操作を行う Code Gear の集合を表現する **Meta Data Gear** +- インターフェースを定義してそこから呼び出す + +--- + +# インターフェースの定義 +- Xv6 の Virtual Memory の API 部分のインターフェース +- 以下のコードについて説明していく + +``` c +typedef struct vm<Type,Impl> { + __code init_vmm(Impl* vm, __code next(...)); + __code kpt_freerange(Impl* vm, uint low, uint hi, __code next(...)); + __code kpt_alloc(Impl* vm ,__code next(...)); + __code switchuvm(Impl* vm ,struct proc* p, __code next(...)); + __code init_inituvm(Impl* vm, pde_t* pgdir, char* init, uint sz, __code next(...)); + __code loaduvm(Impl* vm,pde_t* pgdir, char* addr, struct inode* ip, uint offset, uint sz, __code next(...)); + __code allocuvm(Impl* vm, pde_t* pgdir, uint oldsz, uint newsz, __code next(...)); + +``` + +--- + + +# インターフェースの命名(1行目) +- typedef struct の直後にインターフェース名(vm)を書く + +``` c +typedef struct vm<Type,Impl> { +``` + +--- + + +# インターフェースの Code Gear(2行目~) +- vm で使う Code Gear を登録する +- Code Gear は __code CodeGear名(引数); で記述する + - 引数が Data Gear に相当する +- 第1引数の Impl* vm がインターフェースの実装の型になる + + +``` c +typedef struct vm<Type,Impl> { + __code init_vmm(Impl* vm, __code next(...)); + __code kpt_freerange(Impl* vm, uint low, uint hi, __code next(...)); + __code kpt_alloc(Impl* vm ,__code next(...)); + __code switchuvm(Impl* vm ,struct proc* p, __code next(...)); + __code init_inituvm(Impl* vm, pde_t* pgdir, char* init, uint sz, __code next(...)); + __code loaduvm(Impl* vm,pde_t* pgdir, char* addr, struct inode* ip, uint offset, uint sz, __code next(...)); + __code allocuvm(Impl* vm, pde_t* pgdir, uint oldsz, uint newsz, __code next(...)); + +``` + +--- + +# next(...) +- __code next(...) は次の Code Gear の継続先 +- それぞれの Code Gear の引数の1つに設定する +``` c + __code kpt_freerange(Impl* vm, uint low, uint hi, __code next(...)); +//.... + __code next(...); +} vm; +``` +- 例) goto vm->kpt_freerange の引数に exit を設定すると Code Gear である exit に遷移する +``` c +__code exit(){ +//.... +} + +goto vm->kpt_freerange(vm, low, hi, exit); +``` + +--- + +# Interface の実装の型 +- 実装側のヘッダーファイルも vm_impl と同じように用意する + +``` c +typedef struct vm_impl<Impl, Isa> impl vm{ +... + __code loaduvm_ptesize_check(Type* vm_impl, uint i, pte_t* pte, uint sz, +__code next(...)); +``` + + +--- + +# インターフェースの実装 +- 実装は型と実装をそれぞれ別ファイルで定義する(vm_impl.h と vm_impl.cbc) +- 実装するインターフェースは #interface で宣言する + +``` c +#interface "vm.h" +``` + +--- + +# vmインターフェースの実装の初期化 +- 定義が終わったのでインターフェースを使用したい +- メモリ上にインターフェースの置き場所と実装を確保 + - struct vm* vm = new vm(); +- インターフェースと実装の紐付け + - vm->void_ret = C_vm_void_ret; + - Code Gear の enum の設定 + - インターフェースのAPIと enum の番号を紐付けている + +``` c +vm* createvm_impl(struct Context* cbc_context) { + struct vm* vm = new vm(); + struct vm_impl* vm_impl = new vm_impl(); + vm->vm = (union Data*)vm_impl; +.... + vm->void_ret = C_vm_void_ret; + vm->init_vmm = C_init_vmmvm_impl; + vm->kpt_freerange = C_kpt_freerangevm_impl; + vm->loaduvm = C_loaduvmvm_impl; + + vm->kpt_alloc = C_kpt_allocvm_impl; +``` + + +- APIの実装の例(init_vmm) + - C_init_vmmvm_impl が メタレベルでinit_vmmvm_impl と対応する +``` c +__code init_vmmvm_impl(struct vm_impl* vm,__code next(...)) { + initlock(&kpt_mem.lock, "vm"); + kpt_mem.freelist = NULL; + + goto next(...); +} +``` + +--- + +# インターフェース実装内の CbC +- for文やif文がある場合はさらに実装を分ける + - 状態遷移ベースで記述したい +- インターフェースは外から呼び出されるAPI +- それに対してインターフェースの実装の Code Gearから明示的に呼び出される Code Gearは、Java の private メソッドのように扱われる。 +- 実際に vm.c の loaduvm の実装を分けた記述を説明する + +--- + +![](https://i.imgur.com/Cj87Pxu.png) + +--- +# 実装内の明示的な遷移の処理 +- **vm と同じ create_impl 内で** vm_impl を定義し、private で実装する Code Gear を定義する +- loaduvmvm_impl で goto によって private に遷移する + +``` c +__code loaduvmvm_impl(struct vm_impl* vm, pde_t* pgdir, char* addr, struct inode* ip, uint offset, uint sz, __code next(...)) { + Gearef(cbc_context, vm_impl)->pgdir = pgdir; + Gearef(cbc_context, vm_impl)->addr = addr; + Gearef(cbc_context, vm_impl)->ip = ip; + Gearef(cbc_context, vm_impl)->offset = offset; + Gearef(cbc_context, vm_impl)->sz = sz; + Gearef(cbc_context, vm_impl)->next = next; + + goto loaduvm_ptesize_checkvm_impl(vm, next(...)); +} +``` + +- vm のインターフェースの実装を vm_impl に設定している +- vm の実装内で使用する Code Gear も enum の番号で指定する + - vm_impl->loaduvm_ptesize_check = C_loaduvm_ptesize_checkvm_impl; + +``` c +vm* createvm_impl(struct Context* cbc_context) { + struct vm* vm = new vm(); + struct vm_impl* vm_impl = new vm_impl(); + vm->vm = (union Data*)vm_impl; + +... + vm_impl->loaduvm_ptesize_check = C_loaduvm_ptesize_checkvm_impl; +.... + vm->loaduvm = C_loaduvmvm_impl; +.... +} +``` +--- + +# loaduvmの CbCによる書き換え +- loaduvmは + - swapから呼び出す + - kernelの中をloopしてreadiに入る + - 入った場合は待ちになる + - user proc側が待ちになる + +- vm.cのloaduvmの処理をCbC で書き換える + +``` c +int loaduvm (pde_t *pgdir, char *addr, struct inode *ip, uint offset, uint sz) +{ + uint i, pa, n; + pte_t *pte; + + if ((uint) addr % PTE_SZ != 0) { + panic("loaduvm: addr must be page aligned"); + } + + for (i = 0; i < sz; i += PTE_SZ) { + if ((pte = walkpgdir(pgdir, addr + i, 0)) == 0) { + panic("loaduvm: address should exist"); + } + + pa = PTE_ADDR(*pte); + + if (sz - i < PTE_SZ) { + n = sz - i; + } else { + n = PTE_SZ; + } + + if (readi(ip, p2v(pa), offset + i, n) != n) { + return -1; + } + } + + return 0; +} +``` + +- loaduvm_impl がインターフェースから呼ばれる実装 + + +``` c +__code loaduvmvm_impl(struct vm_impl* vm, pde_t* pgdir, char* addr, struct inode* ip, uint offset, uint sz, __code next(...)) { + Gearef(cbc_context, vm_impl)->pgdir = pgdir; + Gearef(cbc_context, vm_impl)->addr = addr; + Gearef(cbc_context, vm_impl)->ip = ip; + Gearef(cbc_context, vm_impl)->offset = offset; + Gearef(cbc_context, vm_impl)->sz = sz; + Gearef(cbc_context, vm_impl)->next = next; + + goto loaduvm_ptesize_checkvm_impl(vm, next(...)); +} +``` +- loaduvm_impl から private な Code Gear が呼ばれる + +``` c +#interface "vm_impl.h" + +__code loaduvm_ptesize_checkvm_impl(struct vm_impl* vm_impl, __code next(...)) { + char* addr = vm_impl->addr; + + if ((uint) addr %PTE_SZ != 0) { + // goto panic + } + + goto loaduvm_loopvm_impl(vm_impl, next(...)); +} +``` + + +- vm.c のloaduvm の実装を CbC で書き直す +``` c + +int loaduvm (pde_t *pgdir, char *addr, struct inode *ip, uint offset, uint sz) +{ + uint i, pa, n; + pte_t *pte; + + if ((uint) addr % PTE_SZ != 0) { + panic("loaduvm: addr must be page aligned"); + } + + for (i = 0; i < sz; i += PTE_SZ) { + if ((pte = walkpgdir(pgdir, addr + i, 0)) == 0) { + panic("loaduvm: address should exist"); + } + + pa = PTE_ADDR(*pte); + + if (sz - i < PTE_SZ) { + n = sz - i; + } else { + n = PTE_SZ; + } + + if (readi(ip, p2v(pa), offset + i, n) != n) { + return -1; + } + } + + return 0; +} +``` + + +- vm.cではここから for だが CbC は if文の中と外にgoto を用意して実装する + +![](https://i.imgur.com/ByA7GVJ.png) + +```c +__code loaduvm_loopvm_impl(struct vm_impl* vm_impl, __code next(...)) { + uint i = vm_impl->i; + uint sz = vm_impl->sz; + + if (i < sz) { + goto loaduvm_check_pgdir(vm_impl, next(ret, ...)); + } + + goto loaduvm_exit(vm_impl, next(...)); +} + + +__code loaduvm_check_pgdir(struct vm_impl* vm_impl, __code next(...)) { + pte_t* pte = vm_impl->pte; + pde_t* pgdir = vm_impl->pgdir; + uint i = vm_impl->i; + char* addr = vm_impl->addr; + uint pa = vm_impl->pa; + + if ((pte = walkpgdir(pgdir, addr + i, 0)) == 0) { + // goto panic + } + pa = PTE_ADDR(*pte); + + vm_impl->pte = pte; + vm_impl->pgdir = pgdir; + vm_impl->addr = addr; + vm_impl->pa = pa; + + goto loaduvm_check_PTE_SZ(vm_impl, next(...)); +} + +__code loaduvm_check_PTE_SZ(struct vm_impl* vm_impl, __code next(int ret, ...)) { + if (sz - i < PTE_SZ) { + n = sz - i; + } else { + n = PTE_SZ; + } + + if (readi(ip, p2v(pa), offset + i, n) != n) { + ret = -1; + goto next(ret, ...); + } + + vm_impl->n = n; + + goto loaduvm_loopvm_impl(vm_impl, next(ret, ...)); +} + +__code loaduvm_exit(struct vm_impl* vm_impl, __code next(int ret, ...)) { + ret = 0; + goto next(ret, ...); +} +``` + + +--- + +# C を CbC に部分的に書き直す手法 +- CbC の場合 goto による 遷移を行うので、関数呼び出しのように goto 以降のコードを実行できない +- 例) goto すると戻ってこれないため それ以降が実行されなくなる。 + +--- + +# CbC から C への遷移 +- 最初の命令は next で戻ってこれるので、dummy の関数を用意してそこで実行する + +``` c +void cbc_init_vmm_dummy(struct Context* cbc_context, struct proc* p, pde_t* pgdir, char* init, uint sz) +{ + // inituvm(p->pgdir, _binary_initcode_start, (int)_binary_initcode_size); + + struct vm* vm = createvm_impl(cbc_context); + // goto vm->init_vmm(vm, pgdir, init, sz , vm->void_ret); + Gearef(cbc_context, vm)->vm = (union Data*) vm; + Gearef(cbc_context, vm)->pgdir = pgdir; + Gearef(cbc_context, vm)->init = init; + Gearef(cbc_context, vm)->sz = sz ; + Gearef(cbc_context, vm)->next = C_vm_void_ret ; + goto meta(cbc_context, vm->init_inituvm); +} + +void userinit(void) +{ + struct proc* p; + extern char _binary_initcode_start[], _binary_initcode_size[]; + + p = allocproc(); + initContext(&p->cbc_context); + + initproc = p; + + if((p->pgdir = kpt_alloc()) == NULL) { + panic("userinit: out of memory?"); + } + + cbc_init_vmm_dummy(&p->cbc_context, p, p->pgdir, _binary_initcode_start, (int)_binary_initcode_size); + +``` + +--- + +# まとめ +- OS 内部で CbC インターフェースを扱えるようになった +- CbC の書 き換えが完了すれば、継続の入力と出力を検査することで OS の信頼性を保証したり、インターフェースの実装の入れ替えが可能になる。 +- Context による複数環境の入れ替えや同時実行を可能にすることで CbCXv6 に おいて コンテナと VM を実装ができると予想される。 \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user/tobaru/master-slide.md Wed Dec 16 14:05:01 2020 +0900 @@ -0,0 +1,564 @@ +# CbCインターフェースによる CbCXv6 の書き換え +- 並列信頼研 +- 桃原 優 + +--- + +# 概要 +- OS の信頼性を上げたい +- CbCという言語を使って xv6 という OS を書き換える +- Paging の書き換えを行った +- まだ実装中 +- 将来はコンテナやVMを実装できるはず + +--- + +# OS の信頼性を上げたい +- OS自体が複雑で検証が困難。 + - バグの原因に +- OSの仕様を定義してそれを満たすことを証明する +- 証明しやすい形の記述を作る +- CbCの goto で書く + - 状態遷移系に近い形で記述できる(証明しやすい) + - 関数型の記述 + - 入力に対しての出力を検証する +- 記述のモジュール化 + - CbCのインターフェースで書く + - 煩雑な記述の解消 + - 入力の切り替えによる機能の入れ替え + +--- + +# ノーマルレベルとメタレベル +- ノーマルレベル + - CbCで記述される部分 +- メタレベル + - Paging などのメモリやCPU自体の操作 + - (ノーマルレベルの)プログラムの正しさの証明 + - cmake で生成している + +--- + +# Continuation based C +- 状態遷移ベースで記述できる言語(以下CbC) +- cmake で CbC からメタレベルの記述を生成する +- Code Gear + - 基本的な処理の単位 + - goto 文で遷移する +- Data Gear + - Code Gear からアクセスできるデータの単位 + - 引数など +- Meta Code Gear + - Code Gear の間に挟まれるメタレベルの処理 +- Meta Data Gear + - Code Gearの間の接続などの情報 + - Context(後ほど説明) + +--- + +# ノーマルレベル + +--- +# Code Gear による継続 +- Code Gear の処理の間を goto によって遷移していく +- __code CodeGear名 で定義 +![](https://i.imgur.com/etfQund.png) + + +--- + +# Data Gear の継続 +- Code Gear からアクセスできるデータ +- input Data Gear と Output Data Gear で証明する + +![](https://i.imgur.com/3E0DGWA.png) + +--- +# メタレベル + +--- + +# Meta Code Gear +- メタレベルで見ると Code Gear の間にメタレベルの処理が挟まっている +- cmake で __code CodeGear名_stub が生成される +![](https://i.imgur.com/vy0NxrG.png) + +--- + +# Meta Data Gear +- ノーマルレベルでの書き換えやアクセスを防ぐために存在 +- CbC の 接続可能な Code Gear, Data Gear のリスト +- Data Gear を確保するメモリ空間 +- Context + +--- + +# Context +- Meta Data Gear +- Contextには全てのData Gear と Code Gear が登録されている +- ユーザープロセスに対応して1つのcontextが存在する +- 将来的なVMやコンテナの実装はContextの切り替えるによる実装を目指している +![](https://i.imgur.com/GLIew1x.png) +- Code Gear は Context 内の Data Gear の関数ポインタを持っていてそこにアクセスする +- stub Code Gear でOutput Data Gear のポインタを参照してそこに書き出す + +--- + +# Xv6 +- MIT の講義用教材として作られたOS + - 規格化される前のCで書かれたUNIX V6 を書き換えた + - 1万行程の軽量なOS + - Linuxだと数千万行 +- Xv6 をCbCで書き換える + +--- + +# Xv6の構成 +- system call + - カーネル空間の処理の呼び出し +- VM(仮想メモリ) + - Paging +- File System + - I/O, Read, Write +- Scheduler など + +--- + +# カーネル空間 +- OS の中核となるプログラムで Meta Level に相当する +- Xv6 ではカーネルとユーザープログラムは分離されている +- ユーザープログラムはカーネルに直接アクセスできない。 + - ユーザープログラムによる書き換えやアクセスを防ぐため + - 呼び出す場合は system call + +--- + +# Paging +- Page と呼ばれる固定長のブロックに分割して、メモリとスワップ領域で Page を入れ替えて管理 +- 仮想メモリとして扱うことでフラグメンテーションの解消と空き番地を探す必要がなくなる + +--- + +# Xv6の書き換え方針 +- メタレベルからノーマルレベルを保証するOSを作りたい +- 段階的に書き換えていきたい +- Paging を書き換える理由 + - OS の信頼性を保証する上で重要なメモリ管理部分 + +- __code で書き直していく + +--- + +# インターフェースの導入 +- ノーマルレベルからメタレベルの記述が記述が煩雑になるためインターフェースを導入 +- インターフェースによるメリット + - 煩雑な記述の解消 + - 入力の切り替えによる実装の入れ替え +- 実装は別で定義し、呼び出す + - 後ほど説明 + +--- + +# CbCインターフェース +- Data Gear と Data Gear に対して操作を行う Code Gear の集合を表現する **Meta Data Gear** +- インターフェースを定義してそこから呼び出す + +--- + +# インターフェースの定義 +- Xv6 の Virtual Memory の API 部分のインターフェース +- 以下のコードについて説明していく + +``` c +typedef struct vm<Type,Impl> { + __code init_vmm(Impl* vm, __code next(...)); + __code kpt_freerange(Impl* vm, uint low, uint hi, __code next(...)); + __code kpt_alloc(Impl* vm ,__code next(...)); + __code switchuvm(Impl* vm ,struct proc* p, __code next(...)); + __code init_inituvm(Impl* vm, pde_t* pgdir, char* init, uint sz, __code next(...)); + __code loaduvm(Impl* vm,pde_t* pgdir, char* addr, struct inode* ip, uint offset, uint sz, __code next(...)); + __code allocuvm(Impl* vm, pde_t* pgdir, uint oldsz, uint newsz, __code next(...)); + +``` + +--- + + +# インターフェースの命名(1行目) +- typedef struct の直後にインターフェース名(vm)を書く + +``` c +typedef struct vm<Type,Impl> { +``` + +--- + + +# インターフェースの Code Gear(2行目~) +- vm で使う Code Gear を登録する +- Code Gear は __code CodeGear名(引数); で記述する + - 引数が Data Gear に相当する +- 第1引数の Impl* vm がインターフェースの実装の型になる + + +``` c +typedef struct vm<Type,Impl> { + __code init_vmm(Impl* vm, __code next(...)); + __code kpt_freerange(Impl* vm, uint low, uint hi, __code next(...)); + __code kpt_alloc(Impl* vm ,__code next(...)); + __code switchuvm(Impl* vm ,struct proc* p, __code next(...)); + __code init_inituvm(Impl* vm, pde_t* pgdir, char* init, uint sz, __code next(...)); + __code loaduvm(Impl* vm,pde_t* pgdir, char* addr, struct inode* ip, uint offset, uint sz, __code next(...)); + __code allocuvm(Impl* vm, pde_t* pgdir, uint oldsz, uint newsz, __code next(...)); + +``` + +--- + +# next(...) +- __code next(...) は次の Code Gear の継続先 +- それぞれの Code Gear の引数の1つに設定する +``` c + __code kpt_freerange(Impl* vm, uint low, uint hi, __code next(...)); +//.... + __code next(...); +} vm; +``` +- 例) goto vm->kpt_freerange の引数に exit を設定すると Code Gear である exit に遷移する +``` c +__code exit(){ +//.... +} + +goto vm->kpt_freerange(vm, low, hi, exit); +``` + +--- + +# Interface の実装の型 +- 実装側のヘッダーファイルも vm_impl と同じように用意する + +``` c +typedef struct vm_impl<Impl, Isa> impl vm{ +... + __code loaduvm_ptesize_check(Type* vm_impl, uint i, pte_t* pte, uint sz, +__code next(...)); +``` + + +--- + +# インターフェースの実装 +- 実装は型と実装をそれぞれ別ファイルで定義する(vm_impl.h と vm_impl.cbc) +- 実装するインターフェースは #interface で宣言する + +``` c +#interface "vm.h" +``` + +--- + +# vmインターフェースの実装の初期化 +- 定義が終わったのでインターフェースを使用したい +- メモリ上にインターフェースの置き場所と実装を確保 + - struct vm* vm = new vm(); +- インターフェースと実装の紐付け + - vm->void_ret = C_vm_void_ret; + - Code Gear の enum の設定 + - インターフェースのAPIと enum の番号を紐付けている + +``` c +vm* createvm_impl(struct Context* cbc_context) { + struct vm* vm = new vm(); + struct vm_impl* vm_impl = new vm_impl(); + vm->vm = (union Data*)vm_impl; +.... + vm->void_ret = C_vm_void_ret; + vm->init_vmm = C_init_vmmvm_impl; + vm->kpt_freerange = C_kpt_freerangevm_impl; + vm->loaduvm = C_loaduvmvm_impl; + + vm->kpt_alloc = C_kpt_allocvm_impl; +``` + + +- APIの実装の例(init_vmm) + - C_init_vmmvm_impl が メタレベルでinit_vmmvm_impl と対応する +``` c +__code init_vmmvm_impl(struct vm_impl* vm,__code next(...)) { + initlock(&kpt_mem.lock, "vm"); + kpt_mem.freelist = NULL; + + goto next(...); +} +``` + +--- + +# インターフェース実装内の CbC +- for文やif文がある場合はさらに実装を分ける + - 状態遷移ベースで記述したい +- インターフェースは外から呼び出されるAPI +- それに対してインターフェースの実装の Code Gearから明示的に呼び出される Code Gearは、Java の private メソッドのように扱われる。 +- 実際に vm.c の loaduvm の実装を分けた記述を説明する + +--- + +![](https://i.imgur.com/Cj87Pxu.png) + +--- +# 実装内の明示的な遷移の処理 +- **vm と同じ create_impl 内で** vm_impl を定義し、private で実装する Code Gear を定義する +- loaduvmvm_impl で goto によって private に遷移する + +``` c +__code loaduvmvm_impl(struct vm_impl* vm, pde_t* pgdir, char* addr, struct inode* ip, uint offset, uint sz, __code next(...)) { + Gearef(cbc_context, vm_impl)->pgdir = pgdir; + Gearef(cbc_context, vm_impl)->addr = addr; + Gearef(cbc_context, vm_impl)->ip = ip; + Gearef(cbc_context, vm_impl)->offset = offset; + Gearef(cbc_context, vm_impl)->sz = sz; + Gearef(cbc_context, vm_impl)->next = next; + + goto loaduvm_ptesize_checkvm_impl(vm, next(...)); +} +``` + +- vm のインターフェースの実装を vm_impl に設定している +- vm の実装内で使用する Code Gear も enum の番号で指定する + - vm_impl->loaduvm_ptesize_check = C_loaduvm_ptesize_checkvm_impl; + +``` c +vm* createvm_impl(struct Context* cbc_context) { + struct vm* vm = new vm(); + struct vm_impl* vm_impl = new vm_impl(); + vm->vm = (union Data*)vm_impl; + +... + vm_impl->loaduvm_ptesize_check = C_loaduvm_ptesize_checkvm_impl; +.... + vm->loaduvm = C_loaduvmvm_impl; +.... +} +``` +--- + +# loaduvmの CbCによる書き換え +- loaduvmは + - swapから呼び出す + - kernelの中をloopしてreadiに入る + - 入った場合は待ちになる + - user proc側が待ちになる + +- vm.cのloaduvmの処理をCbC で書き換える + +``` c +int loaduvm (pde_t *pgdir, char *addr, struct inode *ip, uint offset, uint sz) +{ + uint i, pa, n; + pte_t *pte; + + if ((uint) addr % PTE_SZ != 0) { + panic("loaduvm: addr must be page aligned"); + } + + for (i = 0; i < sz; i += PTE_SZ) { + if ((pte = walkpgdir(pgdir, addr + i, 0)) == 0) { + panic("loaduvm: address should exist"); + } + + pa = PTE_ADDR(*pte); + + if (sz - i < PTE_SZ) { + n = sz - i; + } else { + n = PTE_SZ; + } + + if (readi(ip, p2v(pa), offset + i, n) != n) { + return -1; + } + } + + return 0; +} +``` + +- loaduvm_impl がインターフェースから呼ばれる実装 + + +``` c +__code loaduvmvm_impl(struct vm_impl* vm, pde_t* pgdir, char* addr, struct inode* ip, uint offset, uint sz, __code next(...)) { + Gearef(cbc_context, vm_impl)->pgdir = pgdir; + Gearef(cbc_context, vm_impl)->addr = addr; + Gearef(cbc_context, vm_impl)->ip = ip; + Gearef(cbc_context, vm_impl)->offset = offset; + Gearef(cbc_context, vm_impl)->sz = sz; + Gearef(cbc_context, vm_impl)->next = next; + + goto loaduvm_ptesize_checkvm_impl(vm, next(...)); +} +``` +- loaduvm_impl から private な Code Gear が呼ばれる + +``` c +#interface "vm_impl.h" + +__code loaduvm_ptesize_checkvm_impl(struct vm_impl* vm_impl, __code next(...)) { + char* addr = vm_impl->addr; + + if ((uint) addr %PTE_SZ != 0) { + // goto panic + } + + goto loaduvm_loopvm_impl(vm_impl, next(...)); +} +``` + + +- vm.c のloaduvm の実装を CbC で書き直す +``` c + +int loaduvm (pde_t *pgdir, char *addr, struct inode *ip, uint offset, uint sz) +{ + uint i, pa, n; + pte_t *pte; + + if ((uint) addr % PTE_SZ != 0) { + panic("loaduvm: addr must be page aligned"); + } + + for (i = 0; i < sz; i += PTE_SZ) { + if ((pte = walkpgdir(pgdir, addr + i, 0)) == 0) { + panic("loaduvm: address should exist"); + } + + pa = PTE_ADDR(*pte); + + if (sz - i < PTE_SZ) { + n = sz - i; + } else { + n = PTE_SZ; + } + + if (readi(ip, p2v(pa), offset + i, n) != n) { + return -1; + } + } + + return 0; +} +``` + + +- vm.cではここから for だが CbC は if文の中と外にgoto を用意して実装する + +![](https://i.imgur.com/ByA7GVJ.png) + +```c +__code loaduvm_loopvm_impl(struct vm_impl* vm_impl, __code next(...)) { + uint i = vm_impl->i; + uint sz = vm_impl->sz; + + if (i < sz) { + goto loaduvm_check_pgdir(vm_impl, next(ret, ...)); + } + + goto loaduvm_exit(vm_impl, next(...)); +} + + +__code loaduvm_check_pgdir(struct vm_impl* vm_impl, __code next(...)) { + pte_t* pte = vm_impl->pte; + pde_t* pgdir = vm_impl->pgdir; + uint i = vm_impl->i; + char* addr = vm_impl->addr; + uint pa = vm_impl->pa; + + if ((pte = walkpgdir(pgdir, addr + i, 0)) == 0) { + // goto panic + } + pa = PTE_ADDR(*pte); + + vm_impl->pte = pte; + vm_impl->pgdir = pgdir; + vm_impl->addr = addr; + vm_impl->pa = pa; + + goto loaduvm_check_PTE_SZ(vm_impl, next(...)); +} + +__code loaduvm_check_PTE_SZ(struct vm_impl* vm_impl, __code next(int ret, ...)) { + if (sz - i < PTE_SZ) { + n = sz - i; + } else { + n = PTE_SZ; + } + + if (readi(ip, p2v(pa), offset + i, n) != n) { + ret = -1; + goto next(ret, ...); + } + + vm_impl->n = n; + + goto loaduvm_loopvm_impl(vm_impl, next(ret, ...)); +} + +__code loaduvm_exit(struct vm_impl* vm_impl, __code next(int ret, ...)) { + ret = 0; + goto next(ret, ...); +} +``` + + +--- + +# C を CbC に部分的に書き直す手法 +- CbC の場合 goto による 遷移を行うので、関数呼び出しのように goto 以降のコードを実行できない +- 例) goto すると戻ってこれないため それ以降が実行されなくなる。 + +--- + +# CbC から C への遷移 +- 最初の命令は next で戻ってこれるので、dummy の関数を用意してそこで実行する + +``` c +void cbc_init_vmm_dummy(struct Context* cbc_context, struct proc* p, pde_t* pgdir, char* init, uint sz) +{ + // inituvm(p->pgdir, _binary_initcode_start, (int)_binary_initcode_size); + + struct vm* vm = createvm_impl(cbc_context); + // goto vm->init_vmm(vm, pgdir, init, sz , vm->void_ret); + Gearef(cbc_context, vm)->vm = (union Data*) vm; + Gearef(cbc_context, vm)->pgdir = pgdir; + Gearef(cbc_context, vm)->init = init; + Gearef(cbc_context, vm)->sz = sz ; + Gearef(cbc_context, vm)->next = C_vm_void_ret ; + goto meta(cbc_context, vm->init_inituvm); +} + +void userinit(void) +{ + struct proc* p; + extern char _binary_initcode_start[], _binary_initcode_size[]; + + p = allocproc(); + initContext(&p->cbc_context); + + initproc = p; + + if((p->pgdir = kpt_alloc()) == NULL) { + panic("userinit: out of memory?"); + } + + cbc_init_vmm_dummy(&p->cbc_context, p, p->pgdir, _binary_initcode_start, (int)_binary_initcode_size); + +``` + +--- + +# まとめ +- OS 内部で CbC インターフェースを扱えるようになった +- CbC の書 き換えが完了すれば、継続の入力と出力を検査することで OS の信頼性を保証したり、インターフェースの実装の入れ替えが可能になる。 +- Context による複数環境の入れ替えや同時実行を可能にすることで CbCXv6 に おいて コンテナと VM を実装ができると予想される。 \ No newline at end of file