ブログの名前なんて適当で良いのでは

説明を求めるな、記事を読め

ウェアラブルスピーカーを買った

いやぁ結構つらいですね、色々と。

そんなわけで、巷で有名だった「ウェアラブルスピーカー」を購入してみました。 今回私が購入したのは、以下の商品です。

https://www.bose.co.jp/ja_jp/products/speakers/portable_speakers/soundwear-companion.html

首からかけるタイプで、Bluetoothで接続できます。 初めてのBOSE製品で、そういう面でも良さを感じています。

このデバイスのとても良いところは、メガネをかけている人とかだとヘッドホンすると耳が痛くなるという現象を対策することができます。

実際にかけてみるとこんな感じです。

f:id:encry1024:20180501210917j:plain

1週間ほど使ってみて個人的に感じた所感を箇条書きでまとめておきます。

  • Bluetoothはやはり便利
  • 首に重さを感じると思ったが、ぶっちゃけ気にならない
  • 音は普通に漏れ、指向性はないので、家で使うしかない
  • 映画とかだと臨場感があるサウンド、特に低音を感じられる
  • ヘッドホンなどと違い耳が密封されていないのに、耳元で音がなるので少し不思議な感覚
  • 便利ではあるが、3万出すのはちょっと高いかなぁ・・・

値段が高いという点を除けば面白いアイテムなので、お金に余裕のある方はぜひ使ってみてください〜

Rust用VirusTotalライブラリを強化したら、VirusTotalに掲載してもらえた話

はじめに

encry1024.hatenablog.com

以前、VirusTotalのRust用ライブラリが見当たらないということで、需要があるかは知らないが軽くモックを作成したという話をブログに投稿した。
今年の4月から新社会人として忙しい日々を送っているわけだが、新入社員研修中だからといって、コードを書く感触を忘れてはならないので、このライブラリをもっとまともに拡張しようと決意した。また、一つの目標としてある程度ちゃんと作って、VirusTotal APIの利用例のところに載せてもらうことを目標にがんばった。(これに関してはまたあとで詳しく記述する)

前回との差分

github.com

対応APIを増やした

以前はモックとして作成しただけなのでURLの検査ぐらいだったが、ファイル、ドメインIPアドレス、コメントなど様々なAPIに対応させた。対応している機能は、GitHubのREADME.mdに書いてある。

ドキュメンテーションを書いた

これに関してはまだ不十分かもしれないが、ドキュメンテーションを作成した。また、小さなexampleも添えたので使い方には困らないと思う。(まぁどれもまったく同じような使い方しかしないので、一回使えば関数名変えればすぐ使えるのでそこまで需要はないかもしれないが)

crates.ioに公開した

前回のはGitHubにあげていただけなので、Cargo.tomlとかに書いて読み込めるようにcrates.ioにアップロードした。この手順は以下のサイトを参考にした。簡潔、明瞭で非常に分かりやすかった。

takatorix.hatenablog.com

これからの課題

まだテストコードを書いていないのと、行き当たりばったりな実装をしているため、レスポンスのjsonのデシリアライズが適当な感じがある。というのも、構造体名とかを適当につけてしまっている。使う人がいるかわからないけど、迷惑がかからないうちに規則の整った名前に一括して変更したいと思う。

VirusTotal API 利用例一覧のところに名前が乗った

実は、この記事を書いているのもこれが嬉しかったから、せっかくだしまとめようと思った次第である。 VirusTotalのページの中で、APIを使って作られた利用例一覧のページが存在する。 support.virustotal.com

f:id:encry1024:20180416213121p:plain そして、ここに自分のライブラリ、そして名前が掲載されたのだ。
見ればわかるが、実はRustのライブラリが今まで一個もなかったのだ。やったね先駆者になれた(極小領域で)

おわりに

実装して、英語で交渉するだけで達成できる感じではあるが、有名なサービスの末端にでも自分の名前が乗ると嬉しいという感情を初めて体験した。OSS等にもまったく貢献していないので、貢献したら自分のコードがマージされた時の嬉しさっていうのはこういう感じなんだろうなぁと思った。
終盤、非常にエモい内容になったが、Rustしか使えないけどVirusTotal使いたいっていう人の役に立てたら幸いです(そんな人おるんか?)

Franzのfilmarks用プラグインを作成した。

はじめに

学生生活が終わり、明日は入社式。 社会人になってもプライベートで、何かアイディアを形にしたり、便利なものを作ったり、改良したり、そういう心持ちでがんばりたいと思います。 というわけで、タイトルのものを作りました。

Franz

そもそもFranzってなんだよっていう人は以下の記事でも見てみてください。

liginc.co.jp

簡単に言うと、いろんなチャットツールなどを一元管理できるアプリです。 実は、結構初期から使っているんですが、あまり人におすすめしたことはなく、最近ようやく知名度が上がってきたかなぁという感じだと思います。一元管理できる系は、賛否両論あると思いますが、私は好きです。

Franzで管理できる例として、有名なチャットサービス系Slack 、ChatWorkを始め、TrelloやGitHubなどいろんなサービスがもとから管理できるようになっています。ただ海外で有名なサービスがほとんどで、日本人にとっては馴染みが薄いサービスも多いです。 しかし、Franzの良いところは拡張のプラグインが簡単に作成できるという点です。当初は、ほとんど日本語記事がありませんでしたが、最近はちらほらQiita等でも見かけます、基本1次ソースを追うほうが良いのは自明で、GitHubプラグインリポジトリを見れば、作り方はすぐわかると思います。

github.com

ざっくりまとめると、アイコンに使う icon.svgicon.png、サービス情報などを記載するpackage.json、Franzでサービスを追加する際に呼ばれるindex.js、画面のUIを担当するwebview.jsディレクトリにまとめて、所定のプラグインディレクトリに入れれば良いだけです。

Filmarks

Filmarksってなんだよっていう人も多いと思うのですが、これは映画視聴管理SNSです。見たい映画のclipや、見た映画のレビューを書いたり、フォロー、フォロワーが見た映画とかを教えてくれたりする感じです。まぁ誰も知らないと思うんですが、私はめちゃくちゃ洋画を見るので、こういう感じのもので管理しないと辛いという現状があります。ちなみに私のアカウントは、これです。

filmarks.com

ツイッターほど流速が早いわけではないですが、定期的に見たり、映画検索に使いたいサイトなので、Franzで試しに管理してみようと思いました。それで作成したプラグインはこちらです。

github.com

一応、フォロワーからのイイネ的な新着通知の数も取得してFranz側で表示したようにしてます。 Filmarks上で新着があると、Franz側ではこんな感じで表示されます。

f:id:encry1024:20180401172949p:plain f:id:encry1024:20180401172953p:plain

おわり

JavaScriptの初心者の私でもリポジトリ見れば簡単に作れたので、常時見ておきたいサイトなどがある人は、Franzを使って一元管理してみると便利かもしれません。ぜひ作ってみてください。

Filmarksの中の人へ
Filmarksには公式のAPIとかがないので、提供するのが義務とは思っていませんが、いろいろと情報を集めたいときにHTMLゴリゴリパースプログラムを書かなくてはいけなくてしんどいので、もしFilmakrsの中の人が見てたら、公式API提供とかも考えてくださると大変うれしく思います。 Filmarksはとても使いやすくてデザインも好きで大ファンです。

angstrom ctf 2018のwriteupと感想

Twitter上でとあるプロがWeb全完しているツイートをしていたので、僕もWebだけチャレンジしてみた。

Source Me1

HTMLを見るとパスワードが書いてあるので、普通にログインするとフラグ
actf{source_aint_secure}

get me

パスにauthパラメータがあるので、これをtrueにすればフラグ
actf{why_did_you_get_me}

Source Me2

HTMLを見るとJavaScriptでなんかのmd5値の比較があったので、そのハッシュ値をググったら、password1234がでてきた。これを使って普通にログインするとフラグ
actf{md5_hash_browns_and_pasta_sauce}

SEQUEL

適当にシングルクォーテーションを入れると以下のエラーがでる。

Warning: mysqli_num_rows() expects parameter 1 to be mysqli_result, boolean given in /root/problems/web/sequel/deploy/source/public/index.php on line 5

よって、 ' UNION SELECT 1, 2 #-- とかやればログインできてフラグ
actf{sql_injection_more_like_prequel_injection}

MADLIBS

http://web2.angstromctf.com:7777/get-source からソースが見れる。 app.secret_keyflag.txtの内容を読み込んでいることがわある。 あとまぁ自明にSSTIだとわかるので、試しにAuthorNameに適当な入力を {{ 1 + 2}} とすると、3がHTMLに描画される。app.secret_keyとかは、app.configに辞書型として保存されているので、{{config}} を投げてみると一気にリークするので、その中にフラグ

(でもなんでapp.configじゃなくてconfigでいいんだろう・・・グローバル定義されているのかな・・・) actf{wow_ur_a_jinja_ninja}

md5 (writreupを見て理解)

ソースを見ると、入力は違うけど、salt付きmd5が等しい場合にFLAGを出力する問題

<?php  
  include 'secret.php';  
  if($_GET\["str1"\] and $_GET\["str2"\]) {  
    if ($_GET\["str1"\] !== $_GET\["str2"\] and  
        hash("md5", $salt . $_GET\["str1"\]) === hash("md5", $salt . $_GET\["str2"\])) {  
      echo $flag;  
    } else {  
      echo "Sorry, you're wrong.";  
    }  
    exit();  
  }  
?>

よくあるタイプのmd5比較かと思いきや、===で比較している。うーんと考えていて結局わからなかった。誰か教えて。 他の人writeupを見たら、PHPだと以下のような結合が可能なみたい。

php > echo "secret" . array();
secretArray
php > echo "secret" . array("x", "y", "z");
secretArray

なので、配列としてパラメータを投げてあげれば良い。

http://web.angstromctf.com:3003/?str1[]=a&str2[]=b

actf{but_md5_has_charm}

FILE STORER

アカウント作ってログインしてみると、URLを指定してファイルをuploadできる。色々見ても特にそれっぽい手がかりがないが、files以下で.gitとかにアクセスすると、\[Errno 21\] Is a directory: u'.git' とか出るので、存在が確定。 dvcs-ripperを使ってしゅっと取ってくる。

$ dvcs-ripper/rip-git.pl -u http://web2.angstromctf.com:8899/files/.git

取得してきたファイルの中ににindex.pyがあるので見てみると、最初のほうでadminユーザの作成を行い、そこでadminのパスワードがフラグだとわかる。

class user:
    def __init__(self, username, password):
        self.username = username
        self.__password = password
        self.files = []
    def getPass(self):
        return self.__password

users = {}

users["admin"] = user("admin", os.environ["FLAG"])

また、後ろの方に/user/usernameのルーティングがあることがわかる。

@app.route("/user/<username>", methods=['POST'])
def getInfo(username):
    val = getattr(users[username], request.form['field'], None)
    if val != None: return val
    else: return "error"

よって、/user/adminに対してPOSTで、fieldパラメータに_user__passwordを設定して投げればフラグ

$ curl -X POST -d "field=_user__password" http://web2.angstromctf.com:8899/user/admin

actf{2_und3rsc0res_h1des_n0th1ng}

the best website (時間内には解けなかった)

アクセスするととりわけ、いわゆる普通なページが表示される。ソースコードを見ると、コメント文でlog.txtとあるので、アクセスしてみると以下の様に出る。

Sat Aug 10 2017 10:23:17 GMT-0400 (EDT) - Initial website
Sat Aug 10 2017 14:54:07 GMT-0400 (EDT) - Database integration
Sat Aug 11 2017 14:08:54 GMT-0400 (EDT) - Make some changes to the text
Sat Mar 17 2018 16:24:17 GMT+0000 (UTC) - Add super secret flag to database

何をやったかとその時間が表示されている。一番最新のコメントからデータベースにフラグがあるとわかる。 そこで、データベースとの通信している箇所を探してみると、怪しい感じの通信がある。

http://web.angstromctf.com:7667/boxes?ids=5aad412be07e1e001cfce6d2,5aad412be07e1e001cfce6d3,5aad412be07e1e001cfce6d4

これのレスポンスが以下である。

{"boxes":[{"_id":"5aad412be07e1e001cfce6d2","data":"Go away.^This website has literally nothing of interest. You might as well leave.","__v":0},{"_id":"5aad412be07e1e001cfce6d3","data":"You will be very bored.^Seriously, there's nothing interesting.","__v":0},{"_id":"5aad412be07e1e001cfce6d4","data":"Please just leave.^Scrolling more will only give you more boring content.","__v":0}]}

要は、idを3つ指定してその要素がレスポンスされている。あまりデータベースに詳しいわけじゃないので、_idを検索してみると、Mongodbの記事がいっぱいヒットするので、Mongodbだとわかる。 次に、どうやってここからフラグを引っこ抜くかだが、指定したidの情報を返してくれるという機能があるので、フラグが格納されているデータのid情報をおくれば良いと考え、mongodbのid生成方法についてぐぐると以下の記事を見つけた。

http://toshitanian.hatenablog.com/entry/2014/02/14/015314

これを見ると、mongodbのidは以下のフォーマットになっているらしい。

4バイトの,[Unix](http://d.hatena.ne.jp/keyword/Unix)エポックからの経過秒数([Unix](http://d.hatena.ne.jp/keyword/Unix)時間)
3バイトのマシンID
2バイトのプロセスID
3バイトのカウンタ(開始番号はランダム)

最初のlog.txt情報からフラグをデータベースに追加した時間はわかり、5aad4131となる。次にマシンIDとプロセスIDはきっと同じだろうと予想して、カウンタの末尾1byteだけをブルートフォースするスクリプトを書いて回していたら、5aad4131e07e1e001cfce6d5のidで、フラグが降ってきた。

actf{0bj3ct_ids_ar3nt_s3cr3ts}

日商簿記3級 受験体験記

はじめに

本日,第148回の日商簿記3級を受けてきました. 合否はまだですが,解答速報の結果とかを見る限り9割後半での合格してそうです.これで落ちてたら面白いですね.そしたらこの記事はきっと消えます.

2018年3月15日 追記 97/100点で1問ミスで合格していました。良かったね。唯一やらかしたミスは、凡ミスで計算に使う値を間違ってしまった感じです。

普段パソコンオタクがやっている僕が,なぜ簿記の試験を受けたのか疑問に思う人が多いと思いますが僕にもよくわかりません.(は?) たぶん,最近はIPA情報処理試験しか受けていなくて,違うタイプの資格の勉強とそのテストを受けたかったんだと思います.3級は個人事業主の仕訳とかが主なテスト範囲なのですが,最終的には決算整理をして,貸借対照表損益計算書を作るところがゴールになるので,企業内のお金のこととかもこの資格を通して勉強したことにより理解しやすくなるんだろうなぁという感じはしてまぁ無駄ではなかったかなぁという感じがしています.

さて,前置きはこれぐらいにしておいて,簿記3級を初めて受ける人の参考になるように勉強法とかを記録しておきたいと思います.半分自分の日記も兼ねているので読みにくいかもしれませんが. 重ね重ねいいますが,僕はただのパソコンカタカタする人間で,大学もパソコンカタカタ学科なので,0から勉強する人とまったく同じスタートラインだと思ってください.

教材

教科書としては以下の本を利用しました.

https://www.amazon.co.jp/みんなが欲しかった-簿記の教科書-日商3級-商業簿記-みんなが欲しかったシリーズ/dp/4813268897

問題集としては以下の本を利用しました.

Amazon CAPTCHA

この2冊からわかるように予想問題集のようなものは買いませんでした.最初は過去問題集も買わない予定でしたが,後から振り返ってみてみると買わないと合格はさすがに厳しいと感じました.

勉強の流れ

まず全体的な勉強時間に関してですが,合計約1ヶ月ぐらいだと思います.ただ,卒業論文に追われたりしながらやっていたので,1月の勉強量はかなり少なく,2月も試験直前の1週間しかやっていません.さらに言えば試験1週間前にインフルエンザB型になってしまったので,時間換算して見れば結構少ないかもしれないです.

教科書を使って知識を詰め込む

1月中は少ない時間をやりくりしながら上述した教科書を用いて勉強しました.この本に「二回は読んで二回は演習問題を解く」ということが書いてあったので,その通りやりました. 簿記では,勘定科目という仕訳をする際に重要な用語が数多く出てきます.例えば,いわゆる通貨・紙幣は,現金(資産) といったように勘定科目名と,属する貸借対照表損益計算書の中の5つのカテゴリがあるので,これも両方しっかりと覚えるようにしました.あと普段パソコンオタクをしているせいで字を全く書かないので漢字練習をやる小学生の如く何回も書いたりもしました. また,この資格においてゴリ押しで暗記するとコケる(もとい勉強するのが目的だったので最初からこれをやろうとは思いませんでしたが)ので,理解しながら覚えるようにしました.よくある店主個人の所得税租税公課として処理しないといったような細かいところも見逃さないように本の隅々まで見ました.あとは,簿記の試験どの問題も突き詰めれば仕訳がしっかりできていないと後段の計算も間違ってしまうので,最低,仕訳問題は解けるということを意識して取り組むと良いかもしれません.試算表や貸借対照表の説明とかはありますがこれらは読むより解く方が慣れるので演習の時期にたくさんやればなれます.

過去門演習

次に試験1週間前ぐらいに過去問題集を買ってきてやりました.とりあえずこの頃にはインフルエンザだと発覚する前ですが発熱していたので,無理をしない程度に1日2回分ぐらいやっていて(たまに多くがんばったり),試験の2日前には掲載されている12回が終わるようにしました.ちなみにこの12回の点数はほとんど70 ~ 85ぐらいで,最後の二回だけ慣れてきたのか90点台が出ていました. やるとわかるのですが,第3,5問が配点が大きくなおかつ計算も大変です.いかにこの2つの計算や電卓計算が慣れれるかが勝負どころだとは思います.しかしこれらもまずは仕訳をしなくてはならないので,第1問に出てくるような仕訳ができないと元も子もないです.

試験前日

試験前日は,過去に間違った問題を見直したり,自分なりの直前チェックシートを作ってそれを眺めたりしていました.試験当日はこの直前チェックシートを見てました.この直前チェックシートでは,過去門演習を通して自分がやりがちな間違いとかどうしても覚えきれていないこととかを書いておきました.

反省点

章を作ったけれど正直あまり反省点はないかもしれない.一応教科書にあるようなことはほぼ頭に入ったし,1年とおしてどうやって個人商店がお金の管理をしているのかとかもわかったし. ただ,唯一あるとすれば,すべり止めがしっかり効いた電卓を使うべきだったということかもしれない.試験本番になるとやはり力が入るので普段キーボードを叩くような感覚で電卓を叩く.そうするとすべり止めが甘い電卓だと打っている最中にどんどんずれてとても打ちにくい.第3問とかは百万単位ぐらいの足し算を10回連続で計算したりするのでとても打ちにくかった.受ける人は,いつもより早く強くタイプしても電卓がずれないかを確認しておいたほうが良いと思う.

おわりに

合否もでてないがこんな記事を書いてしまって,ここまで来て今更ながら落ちていたら恥ずかしいなと思うんですがまぁきっと受かっているでしょう.もしゼロから簿記3級を勉強しようとしている人の参考になると嬉しいです.

Rustの勉強がてらVirusTotal Public APIを利用したライブラリを作ってみる

最近あまりブログというものを書いていないので文章の感じがわからないですが,とりあえず今僕はインフルエンザB型にかかって安静にしています.

さて,本題ですが,最近というのも半年ぐらい前からたまにRustを書いています. 最初は弊団体Cpawの夏合宿で,Rustを0から勉強するというところが発端で,参加した数人はもうRustは嫌で書いてなさそうですが,僕は割と体にあったのでちょこちょこ書いています. 以前は,RustでCASL2/COMET2周りを書いたりしました.

encry1024.hatenablog.com

今回は,HTTP周りを触りつつ,Rust製が見当たらなさそうなものを何か作りたいなぁと思って見つけたのがVirusTotal APIを利用したライブラリでした.Google検索でRust VirusTotalで調べると以下が出てきましたが,見ての通り中身が何もない開発が止まっているリポジトリです.

github.com

本当に無いのかは,もう検索するのがだるくてやらなかったですが,さっさと土台を作ってしまいましょう. ということで,VirusTotalのURLの検査だけ完成したので公開しました.

github.com

このライブラリを使うと,こんな感じでURLのスキャンとそのレポートを見るコードを書くことができます.

extern crate virustotal;

use virustotal::*;

fn main() {

    let api = "Your API KEY";
    let url = "The URL you want to check";
    let res = url::scan(api, url);
    println!("{:?}", url::report(api, &res.scan_id.unwrap()));
    
}

まだテストコードも無くて雑な感じですが,public apiは個数が少ないので,そのうち完成しそうという未来が見える開発という点で気持が楽ですね.ぶっちゃけあまりRustをわからず雰囲気で書いているので,書き方のコツとかあったら教えてください.

新年なのでRustでComet IIエミュレータを書いた

あけましておめでとうございます.今年もよろしくお願いします.

さて,昨日は大晦日だったので海老天蕎麦を食ったり,大掃除したりといろいろしていたんですが,最終的には夜からガキ使を見ながらだらだらとRustでComet IIのエミュレータを書いていました.去年の冬コミケ(C93)ではRustでWebアプリケーションフレームワークIronを使った同人誌を売ったりしていたのもあり,自分の中でRust熱が強いのでこれを書いてみました.

git.alicemacs.com

一応仕様に記載されている命令(SVC以外)は実装しました.ただシフト系の命令はゴリ押し実装しているのでミスってる感じあると思うのでぼちぼち修正していきます.上記のexampleにもありますが,現状は機械語を実行するだけなので,ハンドアセンブルした機械語を格納する必要があります.まだリファクタリングをしていないので変数名やモジュール分けが綺麗ではないですが,ざっくりとexampleのコードと共に実装の裏側を紹介して行きたいと思います.上記に掲載されているexampleコードを張っておきます.

extern crate rust_casl2;
use rust_casl2::emu::Emu;

fn main() {
    let mut emu = Emu::new();
    emu.gr[1] = 0x0;
    emu.gr[2] = 0xdead;
    emu.memory[0] = 0x1412; // LD GR1, GR2
    let code = emu.fetch();
    emu.execute(code);
    println!("{:x}", gr[1]); //=> 0xdead
    println!("{:x}", gr[2]); //=> 0xdead
}

冒頭では,初めにミュータブルなEmu構造体のインスタンを生成しています.現状memoryフィールドに機械語を突っ込んだりするので,mutを付けています.

Emu構造体は,src/emu.rs にあります.

pub struct Emu{
    
    pub memory: [u16; 65536],
    
    // General Register
    pub gr: [u16; 8],
    
    // Program Register
    pub pr: u16,
    
    // Stack Pointer
    pub sp: Vec<u16>,
    
    // Flag Register [OF, SF, ZF]
    fr: [bool; 3], 
}

Comet IIでは基本的に符号なし16bitな処理なので,フィールドも基本的にはそうしています.各種フィールドの使い方はコメント通りです.
フラグレジスタは,当初u8の末尾3bitを使う方針でいましたが,なんか気持悪かった(使わない上位ビットが余っていて)ので,[bool; 3]にしましたが,3つのboolフィールドを持つ構造体を作って使いやすいメソッドを付けたほうが良い気がしてきました.

次のexampleの数行では,各種レジスタやメモリーにexample用の値を設定しています.今回の例ではLD命令を使ってレジスタ間での値のロードをしようとしています.具体的にはGR2に入っている0xdeadをGR1にロードします.LD命令のレジスタ間のオペコードは0x14なので,0x1412で LD GR1 GR2 を表しています.

値の設定後は,fetchメソッドでProgram Registerが指すmemoryから値を取ってきて,executeメソッドに渡して実行します.よくあるパイプラインの処理では,fetch -> decode -> executeとかですが,decodeな処理を書こうとすると冗長な気がした(たぶん正確にここらへんの区別がわかってないからかもしれない)ので,一気にexecuteという表現にしてしまっています. では,命令の実行部分を見てみましょう.executeメソッドの内部では,命令の上位1byteを見て愚直にmatchで分岐させています.分岐後の呼び出す関数は,無駄にsrc/instruction に小分けにして書いてあります.例としてsrc/instruction/ld.rs のLD命令を見てみましょう.

pub fn ld_r1_r2(emu: &mut Emu, code: u16) {

    let r1 = ((code & 0xf0) >> 4) as usize;
    let r2 = (code & 0xf) as usize;

    emu.gr[r1] = emu.gr[r2];

    let v = emu.gr[r1];
    emu.set_fr(ZF, v == 0);
    emu.set_fr(SF, is_set_msb(v));
    emu.set_fr(OF, false);

}

引数に設定されているcodeはfetchで取り出してきた2byteで,その中から1つ目,2つ目のレジスタに対応する値を取り出してr1, r2に格納します(上位1byte使っていないのが気になるのでu8とかに変えても良い気がしてきた).注意点としてこれをgrレジスタ配列の添字として使うので,u8等ではダメで,usizeに変換する必要があります. LD命令では,フラグレジスタを変更する必要があるので,各種ZF, SF, OFを設定しています.is_set_msb関数はsrc/util.rsで定義していて最上位bitが立っているかどうかのboolを返す関数となっています. そして,executeメソッド後ではgr[1]が0xdeadのgr[2]で書き換わっているのでprintln!で出力してみるとgr[1]の方で0xdeadが出力されるという感じです.

一応,各種命令のソースコードと共に単体テストを書いていますが,機械語自体にミスがあったりするかもしれないし,ハンドアセンブルするのも慣れてきてしまってはいますが,楽するためにもCASL2アセンブルするプログラムを作ったほうが良いという結論になり作っています.本当はそれ含めて公開する予定でしたが,間に合いませんでした.これはまた次の機会に公開したいと思います.

皆様にとって良い一年になりますように

2018-01-12 追記:

上記で言ってたCASL2アセンブラが完成しました.相変わらず突貫工事なのでミスはありそうですが,とりあえずツールとして動くレベルになりました.それと同時にいろいろ改造してコマンドラインツールとしてアセンブルとエミュレートが実行できるようになりました.

git.alicemacs.com

あとはRustでのテストやドキュメントの書き方とか含めリファクタリングをしながら理解を深めていこうかなと考えています.