TDDBC Sendai 8thに参加2018-10-21 15:44

テスト駆動開発はよく知らないけど、
・今やるべきことにフォーカスする
 ユニットテスト先に書いてREDからGREENにする
・ユニットテストがあるからリファクタリングしやすい
的な良い習慣というイメージだった。

もっと厳密なルール付けとか、テストコードを実装コードでテストするようなテクニックがTDDにはあるようだけど。

実習はペアプログラミングなのでTDD初心者でもOKな感じ。
コードレビュータイムもあったけど、時間がなくてカットされてしまった。
せっかくなのでもう少し解いてGitHubにあげておく。C#とMsTest。
https://github.com/shimitei/csharp-mstest

他の人のコードレビューを見ると、golangはテストの実行が瞬時に完了して良い。
LTではSpockでのユニットテストがいい感じ。従来のテストフレームワークで気になるところが解消する。

TDDの暗黒面は、TDDが悪いわけではないがもっと優先すべきことがあるのではないかな。
設計・優先順位付けとかコーディングがうまくできていないと、結局技術的負債はたまる。
安易な設計でテストファーストにすると手戻りが発生してしまうし、何故かコードを複雑にしたがる人がいる。
安易でもさっさとすすめて問題にぶち当たって解決してのパワープレイができれば苦労しない。
TDDは設計やコーディングのさじ加減をうまくできる人には向いているけど、そうでない人は延々と時間を吸い取られるのでペアプログラミングしかないのかな。

今回のお題は数学的な概念で仕様がいきなりひっくり返ることはないため、インクリメンタルな開発に向いている。
最初は純虚数で次に虚数、ガウス整数が来る。純虚数と虚数を同じクラスにするか別のクラスにするか、最初の純虚数クラスを複雑に作りこんでしまうかでも手間が変わってくると思う。

というわけで、TDDをKeepしつつDDDにTryするのがよさげ。

プログラミングスキルの獲得について考えてみた(初級編)2016-01-18 19:00

資料を見ても、そのうち書いた本人もわからなくなりそうなので整理してみる。

「プログラミングができる」とは、「プログラミング言語の文法」がわかり、適切な「データ構造とアルゴリズム」を選択しコーディング可能なこと。
FizzBuzz問題は、データ構造は考慮する必要がない初級の問題です。この問題が難なく解ける位プログラミングができる人は、ひとまずおいて、FizzBuzzまでの関門は何かを考えてみた。

FizzBuzzの平凡な解答は、ループ処理と条件分岐から成る。人の頭で答えを出す時にはあまり悩むことはなくても、プログラムのコードで表現するには優先順位を考慮する必要があります。
このFizzBuzz問題が解けない人は、ループ処理や条件分岐の構文を理解していないか応用することができていないのでしょう。

「上手な教え方の教科書」によると、プログラミングのような認知機能の学習がうまくいかない理由として5つの問題が挙げられています。

  1. バグ修正の問題(間違った認識を正すことが難しい)
  2. 領域固有化の問題(知識を応用することが難しい)
  3. 不良構造化問題(複雑な問題を解決することが難しい)
  4. メタ認知の問題(自分が理解していることしていないことがわからず、学習を進めることが難しい)
  5. 熟達化の問題(的確に技能を発揮するには一定時間の訓練が必要)

人に教える場合だけでなく、独習するとしてもこれらの問題点を確認することで克服しやすくなります。

「熟達化の問題」はいまひとつ説得力がないので、自分のレベルに合った問題を解くのが良いよと誘導するのに都合がいい理論を持ってきてみたりして(第二言語習得の理論のインプット仮説)。
とにかく、他の認知機能をそつなく学習できるような人はプログラミングにも同様の手法で学習が行えるはず。
プログラミングには論理力が特に重要とされていて、無ければ苦労するがプログラミングを学習することで鍛えることもできるのではないか。
コンピュータの操作方法やプログラミングの構文でつまずいてしまう人でも、コンピュータサイエンスを学ぶことで得られることはあるんじゃないかな。

TIS-100を紹介したかっただけなのに中級に続くかな。

モバイルAdobe AIRアプリをPCに展開する2013-12-06 00:00

Adobe AIR Advent Calendarの6日目に飛び込み参加。

モバイルAIRアプリはAndroidとiOS向け、そんなふうに考えていた時期が俺にもありました。
(BlackBerryサポートはいつのまにか消えてる? )
実は、モバイルAIRアプリはAndroid向けのapk、iOS向けのipa、だけでなくWindowsやMac OS X向けのairファイルも書き出せるんですね。
これで1つのソースコードから4つのOS(Android、iOS、Windows、Mac)をカバーできちゃうぞ。

Flash Builder4.7で新規Flexモバイルプロジェクトを作成するとき「ターゲットプラットフォーム」には「Apple iOS」と「Google Android」があるだけ。
Flexモバイルプロジェクト作成画面

でも、リリースビルドの書き出しで「書き出し形式」項目の選択を「デスクトップでのインストール用の署名済み AIR パッケージ」にすると、.airファイルにパッケージされるのでWindowsやMac OS Xにインストールできるぞ。
モバイルFlexプロジェクト書き出し

ただし、AIRパッケージではネイティブエクステンションを使えないので100% Pure ActionScriptで限界に挑戦しましょう。
実際に1つのソースコードから4OSサポートのアプリ開発をしてますが、まあなんとかなります。

1つのソースといっても、OSや端末によってサポートされる機能が違うので気をつけないといけない部分はあります。
私はFlexモバイルプロジェクトで開発してますが、この時点で(デスクトップ向けの)Flexプロジェクトとサポートされる機能が違います。

デバイスプロファイルの記述通り、mobileDeviceプロファイルの機能だけサポートされます。「チェック」と書かれている機能は、実行時にisSupportedメソッドを呼び出して機能を使えるか確認しましょう。センサー類等のハードウェアが必要になる機能は使える使えないが想像できますが、NetworkInfo.isSupportedはiOSでは常にfalseだったりしてひどい。

OS毎に処理を分けたい場合は、Capabilities.osを見て分岐しましょう。
const isAndroid:Boolean = (Capabilities.os.toLocaleLowerCase().indexOf("linux") >= 0);
const isIOS:Boolean = (Capabilities.os.toLocaleLowerCase().indexOf("iphone") >= 0);
const isWin:Boolean = (Capabilities.os.toLocaleLowerCase().indexOf("windows") >= 0);
const isMac:Boolean = (Capabilities.os.toLocaleLowerCase().indexOf("mac os") >= 0);
こんな感じでいけます。
NetworkInfo.isSupportedの他に、SWFLoaderもiOSでは動作しないとか試してみてわかることが多すぎ。

あとは、app.xmlのinitialWindows要素内の記述はもともとデスクトップアプリ向けで、AndroidやiOSでは意味のないものが多いですが、モバイルAIRアプリでもWindowsやMac上で動作させる場合は有効です。(widthとかheightとか)
fullScreenをtrueにするとデスクトップでも全画面表示になってしまうので、実行時にOSを判別してモバイル端末だけ全画面にするとよいでしょう。
stage.displayState = StageDisplayState.FULL_SCREEN;
で全画面に切り替え、
stage.displayState = StageDisplayState.NORMAL;
で全画面解除になります。


クロスプラットフォーム開発の暗黒面はまた今度。
NativeApplication.nativeApplication.exit();でiOSじゃアプリ終了しやがらねえなんてかわいいもんだぜ。

MinGWで変愚蛮怒をコンパイルしない2009-09-22 20:15

これもSJIS対応してないじゃない。
gcc -finput-charset=cp932 -fexec-charset=cp932 hoge.c
などとしても
no iconv implementation, cannot convert from cp932 to UTF-8
と出る。
他のバージョンのgcc持ってくるとよさそうなのだけどめんどくさいのでしっかく。

いっそUnicodeで、となるとC言語ではさらにめんどくさそう。
Windowsな世界ではTCHAR(_TCHAR)と__T()マクロだけど、gccはなんか違うっぽいな。
JBand
<http://sourceforge.jp/projects/jband/>
はAngbandをUnicode対応にするらしいのでがんばってちょ。

ひさしぶりにsourceforge.jp眺めたらやたらプロジェクト数が水増しされているような。「(機械翻訳)」ってついてるやつは全部Freshmeatか。

lcc-win32で変愚蛮怒をコンパイルしない2009-09-22 14:20

2009-08-24版のlccでmakeして、マゴット犬に屠られてみるまでやってみた。

なんと、sjis対応してなかったのでしっかく。
表、能、ソに\足してごまかしてみたけど、化けて表示されちゃう。

コンパイル速いけれど、まだこなれてないのかなあ。
init2.cのstore_table配列で、宣言よりも初期化の記述が少ないと途中でコンパイルをあきらめたりする。てきとーに埋めると通る。

readdib.cのReadDIB関数でコンパイルエラー。
Error readdib.c: 324 the left hand side of the assignment can't be assigned to
if (!MakeBitmapAndPalette(hDC, pInfo->hDIB, &((HPALETTE)pInfo->hPalette),
&((HBITMAP)pInfo->hBitmap)))
これは
if (!MakeBitmapAndPalette(hDC, pInfo->hDIB, (HPALETTE*)&(pInfo->hPalette),
(HBITMAP*)&(pInfo->hBitmap)))
これでどうだ。

他にはchuukei.cでヘッダ足りない。
#ifdef WINDOWS
#include <windows.h>
#include <mmsystem.h> // added
#endif

VK_ATTN等の定義がlcc-win32に付いてるヘッダーファイルには無いので定義する。

Open Watcom C/C++で変愚蛮怒をコンパイルする2009-09-21 21:00

Open Watcomは開発が続いているようなのでよさげ。
インストーラー付きなのでインストールも楽ちん。
サイズが73.8MBは小さい方だろう。

入れたのはOpen Watcom C/C++ Version 1.8。
ソースに手を入れなくてもコンパイル通るし。

問題は、ツールの使い方にちょこっとなじめないくらいかな。
wcc386をコンパイラにして、wcl386をリンカにするのがお手軽そう。
wlinkとか使い方わからん。
wmakeもどこか違うのかなあ。-msでnmake互換で使おう。

変*愚蛮怒メモ
<http://www.asahi-net.or.jp/~KH4S-SMZ/heng/index.html>
にMakefileを、Digital Mars C/C++のも、置いとく。

dmcで変愚蛮怒をコンパイルする (4)2009-09-21 08:33

dmcのsscanfは、%xでは0xを解釈しなさそう。

fscanf, scanf, sscanf
http://www.digitalmars.com/rtl/stdio.html#fscanf

%iならオッケー。
init1.cのparse_m_info関数、parse_d_info関数のsscanfの%xを%iにする。

dmc編はこんなもんかな。

dmcで変愚蛮怒をコンパイルする (3)2009-09-21 00:10

リソースコンパイラ
rcc angband.rc -oangband.res -DJP -DSJIS -j0 -r -32
リンカ
$(LINKER) /SUBSYSTEM:WINDOWS:4.0 /NOMAP $(OBJ), $(EXE_FILE),, comdlg32.lib gdi32.lib winmm.lib wsock32.lib,, angband.res


chuukei.objで_timeGetTime未解決。
#ifdef WINDOWS
#include <windows.h>
#include <mmsystem.h> // added
#endif


リソースコンパイラは日本語対応してなさげ。
rcc ang_eng.rc -oangband.res -r -32
ウィンドウのメニューは英語でもいいか。

実行ファイルは出来た。
実行すると、
'd_info.txt'ファイルの47行目にエラー。
bcc32ビルド版の変愚蛮怒が生成したlib\data\?_info_j.rawを持ってくると問題なさそう。

dmcで変愚蛮怒をコンパイルする (2)2009-09-20 23:52

最初は、makeはBorlandのを使おう。
makefileの書き方も違ったらめんどくさい。

コンパイルオプションはこんな感じかな。
dmc -o-none -WA -D_WIN32_WINNT=0x0400 -DWINVER=0x0400 -DUSE_TRANSPARENCY -DJP -DSJIS -j0 -o artifact.c

さっそくartifact.cでエラー。
usleep関数はあるようなので、本来はh-config.hあたりに
#ifdef __DMC__
# ifndef HAVE_USLEEP
# define HAVE_USLEEP
# endif
#endif
とか書くべきか。
あまりソースは変えたくないので、コンパイルオプションに-DHAVE_USLEEPをつっこんで逃げる。

inet.cでエラー。
Error: 'fd_set' is already defined
FAQか。
Redefined type errors when including the socket header files
http://www.digitalmars.com/faq.html#fd_set

はまるー。
-DWIN32_LEAN_AND_MEANを追加してみると、
#ifdef MACINTOSH
なところでエラーになる。

定義済みマクロに__SC__があるせいか。
Predefined Macros
http://www.digitalmars.com/ctg/predefined.html

h-config.hの
#if defined(__SC__) || defined(__MRC__)
なところを
#ifndef __DMC__
#endif
で囲んで、ソースコードに手を入れたのでdmcはしっかく。

VK_KANAが未定義とか、ヘッダー古すぎだぜ。
これも意地で-Dで定義するか。

Error: need explicit cast for function parameter 5 to get
from: unsigned char *
to : char const *
関数の定義がchar const *だけど、unsigned char *を渡そうとしてるからダメ。融通がきかない。
(char*)でキャストするようにソースに手を入れるしかないかなー?

次はリソースコンパイラ。

dmcで変愚蛮怒をコンパイルする (1)2009-09-20 22:38

Digital Mars C/C++ Compilerのことをぐぐろうとdmcを入れるとデトロイトメタルシティがひっかかる罠。

まずは、
Digital Mars C/C++ Compiler Version 8.50
をダウンロードしてCドライブあたりに展開する。
PATHにC:\dm\binを追加。

パスを通すだけで使えてお手軽感あり。
sc.iniにINCLUDEやLIBの設定があるようだ。

リソースコンパイラが入ってないので
Basic Utilities
も取ってくる。

とっかかりとしてはmakefile.bccをコピってmakefile.dmcにリネームして直していくか。
Basic Utilitiesのbcc使えないかと試してみたら、XP x64じゃ動かないなあbcc32互換じゃなくて16ビット版なのかな。
cl互換使うのもなんなのでdmcのオプション調べるか。