__builtin_bswap

mgba 読んでたら __builtin_bswap というマクロが出てきた。

これは GCC に含まれるビルトイン関数。

gcc.gnu.org

これは、バイトを逆順に呼び出す関数。例えば、データ上のリトルエンディアンの値をビッグエンディアンで読み出したりできる。 正確には、変換するデータの大きさを表す 数字の suffix がつく。

簡単に確認してみる。

#include <stdio.h>


int main() {
    printf("%x\n", __builtin_bswap32(0x12345678));
    return 0;
}

出力

% ./a.out
78563412

0x12345678 の 32bit のデータが逆順に読み出すことを確認することができた。

GBAの開発環境

お久しぶりです。

最近は諸事情で時間が大きく取れているので、前から作りたいなぁと思っていたエミュレータの作成に取り掛かっています。

エミュレート対象は GBA (Game Boy Advance) になります。 まだ調査、分析段階ですが、mgba や virtualboyadvance といったソフトウェアを解析しています。

google で最初の方に出てくる以外で良さそうなサイトは、こことかがまとまっていていいかなと思っています。もっといいのあったら教えてください。

https://problemkaputt.de/gbatek.htm

ROM の解析やテスト用の ROM を作るのに、GBA の開発環境が必要になってくると思います。この方のが一番最新のような気がします。

booth.pm

Dockerfile も公開されているので、その手の人は理解が簡単です。

docker image にも、binutils, gcc などが含まれているので問題なく使うことができてます。

それにしても、mgba すごいですね。こういうもの書けるようになりたいなぁという気持ちしか起こりません。

今、少しわからないところがあって、arm の decoder の部分がわかってないです。

ARMDecoder decoder = _armDecoderTable[((opcode >> 16) & 0xFF0) | ((opcode >> 4) & 0x00F)];

この部分ですね。

decoder なんでこれで デコードできるんだろう って悩んでいます。 ARMv4 の命令フォーマット見たりしているんですけど、いまいち検討がついてません。

精進します。

[追記] 完全に理解した

django-rest-social-auth!

前置き

認証勉強したい。 python使いたい。 jwt使いたい。

django-rest-social-authを使ってみる(読んでみる)ことにした。

github.com

example_projectを動かすとき、いろいろエラー出るので、 動かしたときのパッケージうんぬんを載せておく。

asgiref==3.2.10
certifi==2020.6.20
cffi==1.14.2
chardet==3.0.4
cryptography==3.0
defusedxml==0.6.0
Django==3.1
django-rest-knox==4.1.0
django-sslserver==0.22
djangorestframework==3.11.1
djangorestframework-simplejwt==4.4.0
idna==2.10
oauthlib==3.1.0
pycparser==2.20
PyJWT==1.7.1
python3-openid==3.2.0
pytz==2020.1
requests==2.24.0
requests-oauthlib==1.3.0
rest-social-auth==4.2.0
six==1.15.0
social-auth-app-django==3.4.0
social-auth-core==3.3.3
sqlparse==0.3.1
urllib3==1.25.10

これを requirements.txt に保存してpip install -r requirements.txt をすれば、 動かせる

pythonでunzip

三行でまとめると

某サイトでたくさんzipを落とした。 マウスでクリックして解凍が嫌だった。 だからスクリプトで解凍した。

以下、スクリプト

import os, glob, zipfile

for name in glob.glob("*.zip"):
    base, ext = os.path.splitext(name)
    os.mkdir(base)
    with zipfile.ZipFile(name) as zip:
        zip.extractall(base)

globでcwdのzipを抽出。splitextで拡張子と名前分割。 現在のディレクトリにzipが散乱してあることを前提にしているので、 baseでディレクトリを作成。zip.extractall(base)で解凍先指定&解凍。

glob, splitextはそんな使い方だったなぁとか思い出した。 zipfileは初めて使った。便利。

bandcampさん、一括ダウンロードとかないんですか?

build.gradleにtest結果をブラウザで表示させるタスクの追加

デスクトップでプログラミングするモチベーションが高まったので、javaとかいろいろそろえてみた。

プロジェクトの環境は、openJDK 14 と gradle 6.3。

> gradle test

でテストの実行、カバレッジ表示用のhtmlが表示される。

だから、これをコマンドラインから表示させたかった。

なので、

① 新しいタスクの追加 ② 既存タスク test の実行(依存) 以下、実行フェーズで ③ テストカバレッジHTMLのパスの取得 ④ パスが存在したらそのファイルをブラウザで開く

っていう流れで新しいタスクを追加した。

task openTest {
    dependsOn "test"
    doFirst {
        def path = Path.of(System.getProperty("user.dir") + "\\build\\reports\\tests\\test\\index.html")
        if(Files.exists(path)) {
            Desktop.getDesktop().browse(path.toUri())
        }
    }
}

やっつけで書いた....

doFirst 外で書くと全部実行されるというワナとかdependsOnは実行フェーズ内で書けないとか知見が多かった。

これずっとnvimで書いてたのでnvim用のプラギン探さないとな。てか既にブラウザにカバレッジ出すタスクありそう。

ひとりぼっちの○○生活6巻感想

僕が感想を書くなんて滅多にないんですけど、書いていこうと思います。理由は気まぐれです。

それでは、ひとりぼっちの○○生活6巻の感想、はっじまーるよー!

待ちに待った待望の6巻です。kindle版を買いました!特典に興味がなかったので。(話と絵が好きなんだ...、ごめんカツヲ先生)

なんと今回はオマケページが多いんです。この巻にして、キャラクター紹介もついてました。本当に、読者冥利に尽きます。

この巻でメインになるのは、主に、佳子なこです。嘘です。全員メインです。

相変わらず、人間をよく観察しているんだろうなと思わされる、カツヲ先生の繊細な動作描写は、脱帽ものです。独特な個性を持ったキャラクターの織りなす優しい話は、全人類が生まれる前に読んでおくべきなんですよね。恥ずかしい話ながら、私は生まれてから読みました。

印象に残ったのは、やはり修学旅行ですかね。ここでは、佳子だけ班別行動を抜け出して、例の友達に会いに行こうとします。結果的に会えませんでしたが、読者としていい意味で裏切られた感じがします。ものごとの解決だけが、前に進む足がかりではない、ということですね。佳子を長い間苦しめて来た呪いが緩んで、やっと時間が進みましたね。おめでとう佳子。

きっと、現実にもこういうことは、やまほどあるんだろうなと思います。1つの方法だけに縛られず問題に挑戦していけば、きっといい方向に進んでいくんじゃないでしょうか。自分では思いつかないような方法を提案くれる仲間、大事にしていきたいです。

そして、なこ。やっと、なこの事情。1巻で触れていた夢の話ですね。なこは、いつもどこかさばさばしていますが、環境が与えた影響なのかもしれません。なこみたいに、生きていればどうしようもないこともある、ということに慣れ過ぎて、諦観を決めつづける人類は多いと思います。やりたいことすべてができるわけじゃないけど、かといってやりたいことすべてができないわけじゃないんです。できるかどうかためしてみる、できるようになるための方法を探すのは、非常に重要なことです。やりたいことを実現するには、それなりの代償が必要なわけですが、立ち向かう勇気と努力は、必要です。なこはこれからがんばっていけるんでしょうか。とても心配です。なこ、頑張って。

今回の巻は、比較的、重めの話が入ってきましたね。重めの話もサクッと終わらせる、この作品のいいところです。がんばりやで観てて面白いキャラクター達が、どんな話を紡いでいくのか、今後も目が離せません。

というわけで、ひとりぼっちの○○生活6巻の感想でした。感想文ぽく書いたつもりなんですけど、どうですかね。自分的に、評価の語彙や表現能力につたない部分があると感じているので、その部分を改善するために、ちょっと書いてみたわけなんですけど、なかなかにむずかしい。意識した点が、違うという部分もあって、普段使っていない表現を多用してみました。他人の評論からも語彙や文法を吸収してみるかといった感じです。いやぁ、かわいいですね、みんな。ぼっちたちを見習って生きていきたいと思います。

push後rebaseを試した

バイトしてて、git push後にtypoに気づいて、前のcommitに含めたいと思ったので、試してみた。

Hello.txtに文字列を挿入した状態で、1つのcommitにしたいという状況を想定した。

% touch Hello.txt
% git add Hello.txt && git commit -m 'Hello.txtの作成'
[master 56ae89e] Hello.txtの作成
 1 file changed, 1 insertion(+)
 create mode 100644 Hello.txt
% git push origin master
% echo 'HELLO' >> Hello.txt && git add Hello.txt && git commit -m '文字列の追加'      (git)-[master]
[master 41c7647] 文字列の追加
 1 file changed, 1 insertion(+)
% git rebase -i HEAD~2                                                                (git)-[master]
[detached HEAD 7800150] Hello.txtの作成
 Date: Sun Feb 16 03:17:40 2020 +0900
 1 file changed, 2 insertions(+)
 create mode 100644 Hello.txt
Successfully rebased and updated refs/heads/master.
% git log --graph                                                                     (git)-[master]
* commit 7800150975f4504c1775c1220b2ec58edfb5582b (HEAD -> master)
| Author: b1u3 <bp16071@shibaura-it.ac.jp>
| Date:   Sun Feb 16 03:17:40 2020 +0900
|
|     Hello.txtの作成
|
...
% git push origin master                                                              (git)-[master]
 ! [rejected]        master -> master (non-fast-forward)
error: failed to push some refs to 'https://github.com/b1u3-YumaNoguchi/TestRepository.git'

ここで、リモートのコミットグラフとローカルのコミットグラフに明らかに相違があるため、errorが出ることは予測できる。

ここから、方法として、①git push --forceか②git pullするというパターンが考えられる。

①の場合、push までに別の commit がされていた場合、それらの commit は、なかったことになってしまう。これは、結局、別の commit をした人が pull した際に merge することになる。 ただし、運よく別の commit がなかった場合、いい感じになる。

②の場合、自分が merge することになる。

なるほど。理解。

どっちがいいかわからないが、挙動がどうなるかぐらいは知っていた方がいいと思った。