プログラミングスキルの獲得について考えてみた(初級編)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のオプション調べるか。

自動ビルド2009-03-07 08:21

ようやく面倒になったので自動化しよう。Antやその手のツール使わないでもWindowsのバッチファイルでなんとかなるわ。


  • コメント。rem
  • 変数。setコマンドでてきとーな環境変数に設定
  • BATファイルの引数ゲット。%1で一個目の引数、%2で二個目の引数。BATにドロップして処理もできちゃうよ。
  • 分岐。if、goto。
  • ファイルがあるかないかで分岐。if not exist hogefile goto nai
  • エラー処理。if ERRORLEVEL 1 goto errで正常終了(0)ではない1以上なら:errに飛ぶ。
  • ファイル削除。delコマンド
  • フォルダ削除。りむーぶでぃれくとりー。rd /S /Q hoge
  • カレントディレクトリ変更。cdコマンド。「.」は現在のディレクトリ。「..」は親ディレクトリ。
  • ファイルコピー。copyコマンド
  • フォルダ作成。mdコマンド
  • ファイル、フォルダ移動。moveコマンド

テキストファイルにリビジョン番号を埋め込むには、

type text1.txt > text.txt
echo %Revision% >> text.txt
type text2.txt >> text.txt
でごまかした。