プログラミング

Processingで魚眼

魚眼のことがちょっとだけ分かった。Processingたのしい。 魚眼でレナさん メモ スケッチ PImage srcImg; // 元画像 PImage dstImg; // 処理後の画像 int W,H; // 画像のサイズ int R; // レンズの半径 int D; // レンズの中心から投影面までの距離 void set…

専門外分野のメモ

JavaScriptに関するメモ 高速化について 重いスクリプトの<script>要素は、<head>要素内でなく、<body>要素内末尾に書いた方がページの表示が速い。 JS MinifierとかYUI Compressorとかでコードの圧縮(コメントやら空白やら改行を除去)すると読み込み時間短縮。 evalは処理コスト</body></head>…

Processingネタ

ProcessingでBox2D Box2Dとは Box2Dはゲーム用の2D物理演算エンジン。 C++, Java, C#, Python, JavaScript, ActionScriptで利用できる。 Processingでも利用することができる。 Processingへの導入方法 [スケッチ] > [ライブラリをインポート] > [ライブラリ…

C言語のプログラムにLuaインタプリタを組み込む

ここではWindows/VC++環境で、C言語のプログラムにLuaインタプリタを組み込んでみる。 Luaライブラリのダウンロード Lua Binariesより、Windows用のライブラリをダウンロードする。 32ビット版ならlua-x.x.x_Win32_dllw4_lib.zip 64ビット版ならlua-x.x.x_Wi…

ARMインラインアセンブラ

IAR EWARMで動作確認。GCCインラインアセンブラ構文を採用しており、他でもだいたい同じっぽい。VC++でのx86のインラインアセンブラに比べるとちょっとC言語の変数にアクセスする記法が分かりにくいかも。 基本 VC++と同様に__asmキーワードを用いてインライ…

C#とC++のラムダ式

ラムダ式(lambda expression)とは 要するに名前のない関数 (無名関数、匿名関数)、その場で書く関数 (関数リテラル) 値と同じように変数に代入したり関数に渡したりできる。 C#とC++では微妙に書き方が違う。 C#は (引数) => {処理} C++は [キャプチャ](引数…

画像の回転

Processingって、ちょこっと画像処理の実験とかするのにちょうどよさげ。 ためしに簡単な画像の回転をやってみた。 回転行列 画像の回転の基本は高校の数学で習う回転行列。 え、今は高校で行列習わないの??? それはアカンやろ! 画像を回転するスケッチ(…

Processingやってみた

Processingとは Javaベースのプログラミング環境 Javaベースだけどクラス原理主義じゃない簡単な言語 ArduinoにそっくりなシンプルなIDE (というか、Processingのほうが先) グラフィックの描画が得意 Processingの良さ (※個人の感想です) 余計なしきたりとか…

C++11のスマートポインタ

前提 C++のnewはJavaやC#のnewのようなつもりで気安く書いてはいけない。 なぜならC++には言語レベルではガベージコレクタが無い。 newしたオブジェクトは自己責任でdeleteしなければならない。 自動解放の仕組みをライブラリレベルで提供しているのがスマー…

いまさらC#でasync/await

いまいち理解が定着してなかったのでおさらい。 asyncなメソッドからTaskを起動してawaitする。 awaitするといったんそのメソッドからリターンする。 タスクが完了するとそのメソッドに戻り、awaitの続きから処理される。 つまり、途中で中断/後で再開するの…

x86インラインアセンブラ

VC++では、__asmキーワードを用いてx86のインラインアセンブラのコードを書くことができる。 メモ C言語の変数名がそのまま使える。 語順はギブミーチョコレート語順。ARMと同じ。モトローラ系やH8とかとは逆。 ARMと違ってレジスタ⇔メモリのやりとりもmov命…

transformの行列

HTML5のCanvasのtransformメソッドの6つの引数は、アフィン変換行列を表す。 context.transform(a,b,c,d,e,f); 平行移動 右にΔxピクセル、下にΔyピクセル 拡大・縮小 x軸方向にs倍、y軸方向にt倍 回転 時計回りにθ回転 蛇足 いうまでもないが、それらの合成…

ARアプリの作り方メモ

AndroidでARアプリ的なものを作るときのためのメモ やるべきこと カメラ映像の表示 オーバーレイ表示 センサーから端末の向きを取得 現在位置の取得 ※ マーカーについては扱わない。マーカーを使う場合、ARToolKitやOpenCVといったライブラリを使用する。 カ…

Androidアプリでバイブレーション

AndroidManifest.xmlにパーミッションの追加 <uses-permission android:name="android.permission.VIBRATE"/> アクティビティでVibratorを取得 import android.os.Vibrator; public class MainActivity extends Activity { private Vibrator vib; @Override public void onCreate(Bundle savedInstanceState) { super.onCr</uses-permission>…

仮想関数とクラスのメモリサイズ

まず、次のC++のコードを見てください。 #include<stdio.h> class ClassA{ int a; int f(); int g(); }; class ClassB{ int a; virtual int f(); virtual int g(); }; int main(void) { printf("sizeof(ClassA) = %d\n", sizeof(ClassA)); printf("sizeof(ClassB) = %</stdio.h>…

EXTERNマクロの話

C言語のソースでよく見かけるEXTERNマクロというトリックについてあれこれ。 EXTERNマクロとは ヘッダファイルで変数宣言に使われる次のようなマクロです。 #undef EXTERN #ifdef _HOGE_ #define EXTERN #else #define EXTERN extern #endif EXTERN int hoge…

VC++のランタイムの抱き込み

VC++で作成したソフトを他のPCに持っていくと、ランタイムが無いというエラーが出ることがある。面倒なので、手軽にすましたいならビルド時に静的リンクでランタイムライブラリを実行ファイルに抱き込むとよい。 プロジェクトの[プロパティ]で、[構成]で[Rel…

C言語の整数の除算についてメモ

C89では、負数の除算の丸め方向は処理系依存。 C99では、負数の除算の丸め方向はゼロ方向への切り捨て。 負方向への切り下げではないことに注意。 符号つき整数のシフト演算(>)が算術シフトとなるか論理シフトとなるかは処理系依存。 gccでもVC++でも、符号…

音声/画像データの雑な扱い方

WAVファイルは先頭44バイトを読み飛ばす。 BMPファイルは先頭54バイトを読み飛ばす。 ※ BMPファイルの画像データは「左下」から「BGR」の順なので要注意。

AndroidをUSBシリアルのホストに

usb-serial-for-androidを使用する方法をメモ。 他にFTDriverというのもある。 (1) usb-serial-for-androidのソースを入手 下記サイトからプロジェクト一式をダウンロード(またはgitでclone)する。 usb-serial-for-android (2) Android Studioでプロジェクト…

標準Cライブラリいろいろ(GNUを中心に)

※ 独断と偏見が混ざっています。 glibc 言わずと知れたGNUの標準Cライブラリ 主にLinuxで使われる POSIXなどUNIX系OSの標準機能を提供 組込み系で使うには重くてデカい、無用の機能が多い uClibc 組込みLinux向けのGNUの標準Cライブラリ uClinux向けに開発さ…

比較演算子と型

間抜けなバグにハマってしまった。 代入演算子と違って比較演算子は右辺の型にキャストされる。 何年C言語やってるねん? uint32_t T = 10; int32_t t = -10; if(t >= T){ printf("over!\n"); }

バージョン管理で無視するべきファイル

Visual Studio *.suo bin/ obj/ Android Studio /.gradle/ /.idea/ /app/build/ /build/ /local.properties /*.iml

組込み屋でもアプリがしたい! 第7局

序盤、中盤、終盤、隙がないAIをめざします。 駒たっ石たちが躍動する僕のオセロをみなさんに見せたいね。 方針 序盤:定石を使う。 中盤:従来通り、重みづけテーブルで局面を評価する。 終盤:単純に石の数で局面を評価する。 序盤 1手目 オセロの1手目は…

組込み屋でもアプリがしたい! 第6局

前回、オセロの盤面を64ビット整数で表現するBit Boardをやりましたが、今回はビット演算を駆使したBit Boardの処理の高速化に取り組みます。とくに合法手(その局面で打てる有効な着手)を列挙する処理の高速化に著しい効果がありました。 石の数を数える Bit…

組込み屋でもアプリがしたい! 第5局

ビットボード これまで盤面の状態を表現するのに8×8の2次元配列を使ってきましたが、無駄にメモリを食うので、ビット演算で扱うように変更します。オセロの盤面は8×8=64マスなので、64ビット整数(C#ではulong型)を使えばちょうと盤面上の石の有無を表現でき…

組込み屋でもアプリがしたい! 第4局

「オメーの読みは『浅い』んだよ。手当たり次第に読んでくからムダ読みが多い。読みの量は多いが、そのほとんどがゴミだ」 (『りゅうおうのおしごと!5』) アルファ・ベータ法 これまで、読みの探索アリゴリズムはミニマックス法を採用してきました。ミニ…

組込み屋でもアプリがしたい! 第3局

強くなるには さて、今回からAIのアルゴリズムを改良して強くしていきます。改良の道筋として、大きく3つが考えられます。 評価関数の改良 (読みの質を高める) ミニマックス法→アルファベータ法 (無駄な読みを捨てて、読みを深くする) 演算の高速化の工夫 (…

組込み屋でもアプリがしたい! 第2局

アルゴリズムを改良していく前に、いったんアプリの機能とソースの体裁をきちんと整えておきます。 機能の不備を改善 着手可能判定とパスの処理を追加 終了判定と勝ち負け判定を追加 表示やメッセージを日本語化 リファクタリング 処理を整理して無駄なクラ…

組込み屋でもアプリがしたい!

根っからの組込み屋が車輪の再発明しながらオセロアプリを作ってみようという企画です。 言語は組込み屋でも比較的取っつきやすい(?) C#を使います。まずはノーヒントで作ってみました。(もちろん、木の探索やミニマックス法は教養として知ってます。) 2…