x86インラインアセンブラ

VC++では、__asmキーワードを用いてx86インラインアセンブラのコードを書くことができる。

メモ

  • C言語の変数名がそのまま使える。
  • 語順はギブミーチョコレート語順。ARMと同じ。モトローラ系やH8とかとは逆。
  • ARMと違ってレジスタ⇔メモリのやりとりもmov命令。
  • x64では使えない。
  • あいかわらず汎用レジスタが少ない。30年前から変わってない。
  • eaxとかのeは32ビットの印。もともと16ビットのaxとかだったから。
  • 1行1命令ならセミコロンは不要。(ふつう1命令しか書かないし。)
  • 分岐命令jccは条件によっていろいろ
    • 無条件 jmp
    • 等号 je(==), jne(!=)
    • 符号つきの大小比較 jg(>), jl(<), jge(>=), jle(<=)
    • 符号なしの大小比較 ja(>), jb(<), jae(>=), jbe(<=)
    • 異名もある je=jz, jng=jleなど

足し算のコード

#include<stdio.h>

int main(void)
{
    int a, b, c;
    a = 10;
    b = 20;
    
    // c = a + b
    __asm{
        mov eax, a
        add eax, b
        mov c, eax
    }

    printf("c = %d\n", c);

    return 0;
}

1から10までの総和を求めるコード

#include<stdio.h>

int main(void)
{
    int x;

    // x = sum of 1...10
    __asm{
        xor eax, eax
        mov ecx, 1
    label1:cmp ecx, 10
        jg label2
        add eax, ecx
        inc ecx
        jmp label1
    label2:mov x, eax
    }

    printf("x = %d\n", x);

    return 0;
}

transformの行列

HTML5Canvasのtransformメソッドの6つの引数は、アフィン変換行列を表す。

context.transform(a,b,c,d,e,f);


\left (\begin{array}{c}
    x' \\
    y' \\
    1
\end{array} \right)
=
\left( \begin{array}{ccc}
    a & c & e \\
    b & d & f \\
    0 & 0 & 1
\end{array} \right)

\left( \begin{array}{c}
    x \\
    y \\
    1
\end{array} \right)

平行移動

右にΔxピクセル、下にΔyピクセル

\left( \begin{array}{ccc}
    0 & 0 & \mathit{\Delta}x \\
    0 & 0 & \mathit{\Delta}y \\
    0 & 0 & 1
\end{array} \right)

拡大・縮小

x軸方向にs倍、y軸方向にt倍

\left( \begin{array}{ccc}
    s & 0 & 0 \\
    0 & t & 0 \\
    0 & 0 & 1
\end{array} \right)

回転

時計回りにθ回転

\left( \begin{array}{ccc}
    \cos \theta & -\sin \theta & 0 \\
    \sin \theta & \cos \theta & 0 \\
    0 & 0 & 1
\end{array} \right)

蛇足

  • いうまでもないが、それらの合成は行列の積となる。
  • はてな記法Markdownて、TeXの数式使えたのね。

ARアプリの作り方メモ

AndroidでARアプリ的なものを作るときのためのメモ

やるべきこと

  • カメラ映像の表示
  • オーバーレイ表示
  • センサーから端末の向きを取得
  • 現在位置の取得

※ マーカーについては扱わない。マーカーを使う場合、ARToolKitOpenCVといったライブラリを使用する。

カメラ映像の表示

  • AndroidManifest.xmlにカメラの使用と許可を宣言
    • uses-featureにandroid.hardware.camera
    • uses-permissionにandroid.permission.CAMERA
  • SurfaceViewに表示させる
  • カメラの画角はCamera#getHorizontalViewAngle(),Camera#getVerticalViewAngle()で取得できる
// 関連クラス/インタフェース
import android.hardware.Camera;
import android.view.SurfaceView;
import android.view.SurfaceHolder;
import android.view.SurfaceHolder.Callback;

※ API21以降では、android.hardware.camera2.*を使うらしい。しらんけど。

オーバーレイ表示

  • FrameLayoutに複数のViewを配置するだけで重ね表示になる
  • ARGB形式で色指定し半透明表示する
  • 透過PNGの画像リソースを使う
  • Canvasのtranslate()/scale()/rotate()とsave()/restore()

センサーから端末の向きを取得

  • 地磁気センサと加速度センサから向きを計算
    • SensorManager.getOrientation()を使用
// 関連クラス/インタフェース
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;

現在位置の取得

  • AndroidManifest.xmlに位置情報の許可を宣言
  • 逆ジオコーディング(経度・緯度から住所を取得)
    • Geocoder#getFromLocation()
// 関連クラス/インタフェース
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.location.Geocoder;
import android.location.Address;

専門外分野のメモ

Node.js

  • サーバーサイドJavaScript環境
  • Linux, Mac OS等のUnix系プラットフォームで動作する
  • node hoge.js みたいにして実行
  • 入出力はすべて非同期でシングルスレッド上で処理される
  • httpモジュールを使ってHTTPリクエストに応答する
  • child_processモジュールを使って外部コマンドを実行できる

GPGPU

  • GPUといえば、NVIDIA(とAMD)
  • NVIDIAは、CUDA (クーダ)という独自拡張したC言語による開発環境で開発する
  • AMDは、OpenCLベースでの開発なのがいまいち。ROCmなにそれ?

Arduinoのボード別ソースの場所

Arduinoのボード別のライブラリソースは、通常は下記の場所にある。
(Winsows10の場合)

C:\Users\ユーザ名\AppData\Local\Arduino??\packages\arduino\hardware\

この場所にアーキテクチャごとにフォルダを切って置かれる。

avr\
sam\
stm32f4\

アルミの種類

ひとくちにアルミと言ってもいろいろある。

純アルミ (1000系)

軟らかい。軟らかすぎてきれいに切削しにくい。(削るとネットリした手ごたえで、粘り気がありキレが悪い。) ホムセンで売ってるアルミ板は純アルミ系のA1050が多い。1mm厚くらいなら万能バサミでもたやすく切れるが、強度の必要な部品には向かない。耐食性は高い。

Al-Cu (2000系)

強度が高い。切削しやすい。A2017(ジュラルミン)A2024(超ジュラルミン)が代表的。耐食性は劣る。純アルミとは対照的。

Al-Mn (3000系)

耐食性は高く、純アルミよりは強度がある。アルミ缶に使われるA3004とか。

Al-Si (4000系)

熱膨張率が低く、耐摩耗性にも優れるらしい。しらんけど。

Al-Mg (5000系)

まあまあ強度があり、加工しやすく、耐食性も良い。バランスが良いので様々な用途に広く使われている。A5052が代表的で、ロボコン界でも定番。サーボのブラケットなどの板金部品によく使われている。モノタロウとかでも手に入る。

Al-Mg-Si (6000系)

強度・耐食性とも良く、押出成型(金太郎飴のように同じ断面の長い部材)に向いている。A6063が代表的でアルミサッシなどに使われる。ホムセンで売ってるアルミ材(アングル、チャンネル、パイプなど)もA6063が多い。

Al-Zn-Mg (7000系)

強度が高い。アルミ合金中最高の強度を持つA7075(超々ジュラルミン)が代表的。


図: A6063のアングル材の例 (コーナン)
f:id:licheng:20181019190857j:plain

フォトセンサのメモ

もうライントレースとか作ることないかもしれんけど、昔のメモ。

フォトレクレクタIC

LEDとフォトダイオードが1つになった4ピンのIC。すごく小さいが、フォトダイオードの出力には外付けで増幅回路が必要になり、ちょっと面倒。
f:id:licheng:20181018201824j:plain

増幅回路内蔵フォトIC

フォトダイオードと増幅回路を内蔵したIC。LEDとは別々。
f:id:licheng:20181018201757j:plain