bamboo’s blog

Bambooの気まぐれブログ

不定期日記(小型二輪免許を取ってきた話)

こんにちは、Bambooです。今まで技術的な発信がメインでしたが、日記的な使い方もありかなーと思い、不定期で日記を書くことにしました。日記と言えど、その日の出来事を書くというよりは、思いついたことを思うがままに書き連ねるだけですが(笑)まあ暇な…

今後の運用予定

今まで思いつきをそのまま文章化してきた当ブログですが、もう少しちゃんと運用ルールを決めようと思います。 というのも、最近技術系のブログを書く場合にはQiitaで執筆したほうが執筆者同士の交流がしやすいのではないかと感じておりまして、、、 このブロ…

Online 3GX Builderの実装

はじめに Online 3GX Builderは、3gx(Nintendo 3DS向け拡張プラグイン)をオンラインでビルドできるツール。この記事ではどのように実装したかをざっくりと説明。 入力処理 Online 3GX BuilderはHerokuでホスティングしている。普段Herokuで公開するサービス…

GitHubの公開鍵認証でSSHがハングした話

経緯 先日リリースされたラズパイOSの64bit版にgitの設定を行っていたときに直面。ssh -T git@github.comで接続しようとしたところ、SSHセッションがハングし、強制終了せざるを得なくなった。 原因 OpenSSHにはIPQoSというオプションが付いており、使用する…

CTRPFを使わずに3gxプラグインをビルドしてみる

はじめに 3gxtoolという、3ds向けのプラグインを作成するツールがあります。通常はCTRPFと呼ばれるフレームワークを用いて作成しますが、今回はCTRPFを使わずに0からプラグインを作成してみます。 コード とりあえず最小のプログラムを作成してみましょう。s…

ghq+pecoでリポジトリ管理したら便利だった話

はじめに ある程度長い間プロジェクトを作ったり貢献したりしていると、ローカルリポジトリがごちゃごちゃしてくる。そんなとき、ふとインターネット記事で見つけたghq+pecoの組み合わせがかなり使いやすかったので、備忘録的な感じで残しておこうと思う。 …

ビジュアルプログラミングの必要性

ビジュアルプログラミングとは 皆さんは「ビジュアルプログラミング」と呼ばれるものを聞いたことがありますか?プログラミングと聞くと、テキストでコードを記述する様子を想像するかもしれませんが、ビジュアルプログラミングはそうではありません。 ビジ…

OSSライセンスの種類と使うべきライセンス

ライセンスの種類 OSSライセンスは以下の3つに分類されます。 コピーレフト型 準コピーレフト型 非コピーレフト型 それぞれ以下のような違いがあります。 分類 改変部分の公開義務 改変部分以外の公開義務 コピーレフト型 有り 有り 準コピーレフト型 有り …

UbuntuのPPAをRaspbianに追加する方法

はじめに Raspbianに入っているツール、デフォルトだと結構バージョンの低いものが多いです。「新しいバージョンが使いたい!」というときに、RaspbianにもPPAを追加できたら便利ですよね。今回はRaspbianにPPAを追加する方法を紹介します。 手順 今回は例と…

GDBでコアダンプ解析

今回はコアダンプを用いたGDBでのデバッグ方法を解説します。 そもそもコアダンプとは Wikipediaでは以下のように説明されています。 コアダンプは、ある時点の使用中のメモリの内容をそのまま記録したものであり、一般に異常終了したプログラムのデバッグに…

AArch64でHello, World!

AArch64とは Armアーキテクチャの64bit拡張。ARMv8-Aアーキテクチャより導入されている。 環境構築 いつも通り、GCCとQEMUのユーザーモードエミュレーションを使用する。 $ sudo apt install gcc-aarch64-linux-gnu qemu-user コード コメントアウトする時は…

RustでArmバイナリをビルドする

はじめに 今回はRustでArmバイナリをビルドする手順について紹介します。記事を作成するにあたり、以下の記事を参考にさせていただきました。 ラズパイに向けてRustをクロスコンパイル! 実行環境 Ubuntu 20.04 LTS (WSL2) 1. 新しいプロジェクトの作成 今回…

RISC-VでHello, World

RISC-Vとは 以下、Wikipediaより引用(Wikipediaのライセンスに基づく)。 RISC-V(リスク ファイブ)は、確立された縮小命令セットコンピュータ (RISC) の原則に基づいたオープン標準の命令セットアーキテクチャ (ISA) である。他の多くのISA設計とは異なり…

浮動小数点数の扱い方(Arm)

はじめに Armには、浮動小数点数を扱うためのVFPと呼ばれる機構が用意されている。今回はこれを用いて、浮動小数点数の表示をしてみよう。 C言語 今回例として作成する処理は、C言語で書くと以下のようになる。円周率3.14を表示するというものだ。 #include <stdio.h></stdio.h>…

Armの開発環境構築(Windows篇)

手順 WSLとWindows TerminalをMicrosoft Storeからインストール(Windows Terminalは必須ではないが、操作性に優れているため推奨)。各種設定は以下を参考に。 Windows Subsystem for Linux (WSL1) をインストールしてみよう! Windowsで至高のターミナル生…

hookコードでレジスタ書き出し(CTRPF)

概要 きっかけはどぅーむーんさんのツイート。 全レジスタ確認の考えまくったところ、可能性は低いがある。それも構成自体は超簡単に作れそうと考えれるから後は実現だけ。— どぅーむーん (@domoon_mutex) 2021年3月14日 内容としては、hookコードでレジスタ…

Armでのnopの扱い

Armにはnopという「何もしない命令」が存在する。これは主に以下のような用途で使用される。 遅延処理 別の命令のダミー 命令のパディング 上記はあくまで一例であり、他にも用途は様々。 こんなnopだが、すべてのバージョンで同じようにnopを扱えるわけでは…

CTRPFで学ぶソートアルゴリズム

はじめに CTRPFと呼ばれるNintendo 3DS向けのプラグインシステムがある。今回はこれを用いて、ソートアルゴリズムについて学ぶ。 ソートアルゴリズム データの集合を一定の規則に従って並べることを「ソート」と言う。このソートを行う手順や計算手法のこと…

命令の末尾に"s"をつけると・・・?(Arm)

はじめに 皆さんはArm命令の末尾にsがついた命令を見たことがあるだろうか。見たことはあっても、通常の命令と何が違うのかイマイチ分からない、という方も多いかもしれない。今回はこのsがどのような意味を持つのか詳しく見てみよう。 sの意味 末尾にsを付…

即値もレジスタも自由に操作!バレルシフタの役割(Arm)

はじめに ArmをはじめとするRISCプロセッサは固定長命令であるため、32bitの即値をそのまま使用することはできない。Armの命令では、下位8bitが即値に割り当てられることが多い。 「それだと8bitサイズの即値しか使えないじゃないか!!」そう思った方がいる…

x86-64 呼び出し規約(概略)

Microsoft x64 引数 型 第1 第2 第3 第4 整数・ポインタ RCX RDX R8 R9 浮動小数点 XMM0 XMM1 XMM2 XMM3 レジスタだけでは引数が不足する場合、スタックを使用する。 戻り値 整数型・ポインタ型はRAXを、浮動小数点型はXMM0を使用して返される。 System …

フォークしたリポジトリを同期する方法

はじめに リポジトリをフォークした後、フォーク元のリポジトリが更新された場合に同期する方法を紹介。 方法 ①フォーク元のリポジトリをupstreamという名前で追加する。 git remote add upstream (元のリポジトリのURL) ②フォーク元のリポジトリが追加され…

Thumb命令とは(ARM)

はじめに Thumb命令とは、ARMプロセッサに組み込まれている16bit長の命令である。命令に制限はあるものの、ARM命令の半分の長さで実行できるため、ARM命令と組み合わせることで効率のよいコードを作成することができる。 Thumb関数の書き方 .thumb .thumb_fu…

ARM命令をハンドアセンブルしてみる

はじめに アセンブラがまだ発達していなかった頃、人間は機械語への翻訳をすべて手作業で行っていた。今となってはアセンブラやツールがかなり発達しているため、簡単に機械語に翻訳できる。とはいえ、アセンブリの命令と機械語がどのように対応しているかを…

ARMショートコーディング(コード短縮)技法

はじめに ショートコーディングとは、ソースコードをいかに短くできるかというものである。今回はARMアセンブリにおいて、どのようにすればコードを短くできるか、色々と考えてみる。 条件実行の短縮 mov r0, #0 @ r0 = 0 cmp r0, #0 @ if(r0 == 0) beq <label> @ g</label>…

GCCインラインアセンブラの使い方

インラインアセンブラとは、ソースコード内にアセンブリコードを埋め込むことができるというコンパイラの機能である。本記事では、GCCにおけるインラインアセンブラの扱い方について解説する。 書き方 インラインアセンブラは、asmまたは__asm__から始め、()…

連長圧縮について

圧縮の基本ともいえる連長圧縮についておさらい。 連長圧縮とは Wikipediaより引用。 連長圧縮(れんちょうあっしゅく)は、データ圧縮アルゴリズムの一つで、可逆圧縮に分類される。ランレングス圧縮、RLE (Run Length Encoding) とも呼ばれる。 アルゴリズ…

WSLのUbuntuでllamaをビルド

llamaは3DSのfirmエミュレータ。ビルドするためにはいくつかパッケージをインストールする必要があったためメモ。 手順 まずはパッケージの更新。 sudo apt update && sudo apt upgrade -y 続いて必要なパッケージをインストール。 sudo apt install cargo p…

bssセクション初期化の必要性

概要 最近バイナリサイズ削減や高速化について試行錯誤しているのだが、そこでふと疑問に思った。bssセクションの初期化(0クリア)はスタートアップルーチンで当たり前のように行われているが、これは必ずしも必要なものなのだろうか。今回はこれについて調べ…

3DSのスレッド遅延処理(ASM)

前回の記事では入力キーの判定をASMコードに埋め込み、フラッシュ表示を行うという内容を扱った。(まだ読んでいない方はこちら) 今回はスレッド遅延処理を前回のコードを用いて実装してみる。 方法 svc命令の一種であるSleepThreadを使用する。引数に遅延さ…