プログラミング

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

まず、次の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/ 【今】 .vs Debug *.vcxproj.user 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…

InetAddressUtils

Androidプログラミングのメモ。 org.apache.http.conn.util.InetAddressUtilsは、API-23以降では使えなくなりました。 IPアドレスがIPv4であるか否かを、下記のようにして判定していた箇所は、 if(InetAddressUtils.isIPv4Address(inetAddress.getHostAddres…

Xcodeでプロジェクトの名前を変更

メモ。 プロジェクトのフォルダを丸ごとコピーして名前を変更。 Xcodeで開く。 Project Navigatorでプロジェクト名を変更。 プロジェクトの[General]の[Bundle Identifier]を変更。 [Manage Schemes]でSchemeを変更。 ソースファイルのフォルダ名を変更。 プ…

Android Studioでアプリのバージョン情報指定

Moduleのbuild.gradleに記述する。 versionCodeは整数値、versionNameは文字列を設定する。 【例】 apply plugin: 'com.android.application' android { compileSdkVersion 23 buildToolsVersion "23.0.2" defaultConfig { applicationId "net.lipoyang.gppr…

Androidアプリでゲームパッドのイベントを取る

ミニ四駆ラジコンのプロポアプリを作って痛感したのは、タッチパネルUIだとスティックの感触がないから画面から目を離して操作しづらい、ということです。これはラジコンやロボットのコントローラとしては致命的です。というわけで、ゲームパッドを使えるよ…

iOSアプリ公開手順メモ

Androidアプリに比べて手続きが面倒なので手順をメモ。 前提 アプリは開発済み Apple ID は持ってる(私用とは別の開発用IDが吉?) 登録処理には Safari を使うこと (Chromeだと正常動作しない) 概要 Apple Developer Programに登録 (ショバ代を払う) Certifi…

Androidアプリ開発メモ

プロジェクトの作成 Blank Activity アクションバーにメニューが付いてる。古臭い。 Empty Activity 空っぽのアクティビティ。こっちを使う。 ボタン Activity を implements OnClickListener にする onCreate()で、Button button1 = (Button)findViewById(R…

Google PlayへのAndroidアプリのリリース

手順メモ。 事前準備 Google Play Developer への登録する。25ドルかかる。 Googleアカウントの作成 (まあ、たいてい既に持ってることと思う。) Google Play Developerアカウントの作成 apkパッケージ作成 Android Studio のメニューから [ビルド] > [Genera…

CLIラッパの作り方

ネイティブコードのHogeCクラスを含むライブラリHogeC.libを、C#で利用するためのCLIラッパライブラリHogeSharp.dllの作り方をメモします。 プロジェクトの作成 [ファイル]>[新しいプロジェクト]>[テンプレート]>[Visual C++]>[CLR]>[クラスライブラリ]で新…

Android Studioへの移行メモ

Android Studioのセットアップ (1) JDKのダウンロードとインストール こちらからjdk-*u**-windows-x**.exeをダウンロードしてインストールする。 ただし今のところは、JDK8系よりJDK7系のほうが無難らしい。 (2) Android Studioのダウンロードとインストール…

Visual Studioでプロジェクトのフォルダ名を変える

右クリック→「名前の変更」で、ソリューション名、プロジェクト名、名前空間名などは変更できるが、プロジェクト名を変更してもプロジェクトのフォルダ名は元のままで、実害は無いけどもカッコ悪い。そこで手動で変更する方法をメモ。 Visual Studioを閉じる…

apkパッケージの作り方

もうEclipseで開発なんて古いだろうけど、いちおうメモ。 [File]>[Export]>[Android]>[Export Android Application] [Project Checks] で、出力するプロジェクトを選択 [Keystor selection] で、初回は電子署名を新規生成 [Create new keystor]で、保存先、…

C#のToString()のフォーマット指定

すぐ忘れるので、メモ 実数は"F". "F4"としたら小数第4位まで. 整数(10進数表示)は"D". "D8"としたらゼロ埋め8桁 (負号も桁に含む) 整数(16進数表示)は"X". "X8"としたらゼロ埋め8桁 【追記】 string.Format()のほうがsprintf()感覚で使えて便利? str = Str…

セグフォとコアダンプ

C/C++のコードがセグメンテーションフォールト(セグフォ)で落ちる場合、突然プロセスが死ぬのでどこで問題が発生したのか分かりにくいです。そんなときに有効な手がかりとなるのがコアダンプです。 GCCでデバッグ情報つきでコンパイルする (-gオプション) $ …

OpenSSLのビルド(ARM9用)

組込みのARM9用にOpenSSLをビルドする手順メモ。(じゃっかん古い内容を含んでいます…) ソースのダウンロード https://www.openssl.org/source/ からソースをダウンロード]する。 (執筆時点で最新版は openssl-1.0.1l.tar.gz) ビルド ホスト環境は、Ubuntu10.…