gallu’s blog

エンジニアでゲーマーで講師で占い師なおいちゃんのブログです。

もしかして…

もしかして 私のほかにもだ・れ・か♪
おいといて。


ふと気付いたので、メモ。
まず本当の初心者さん相手には「とにかく上っ面でいいから作り方を教える」ほうがいいんじゃなかろうか。
で、とりあえず「よぉわからんけどなんとなく組める」状態にして、慣れていただいて。
そこから振り返って「さてはて なんでかっていうとね?」という深い話を、そこからstartしたほうがいいんじゃなかろうか。
先日のドリルの話( http://d.hatena.ne.jp/gallu/20090223/p1 )じゃぁないですが。
考えさせるにしても「0から」やらせるとパンクするんじゃなかろうか、と。
ぢつは出来てるわけじゃないんだけど、とりあえずサンプルを一つ見せて、そこから「ドリルのように」小さく変更するだけでできる、ってのを大量にやらせた方がいいんじゃなかろうか、と。


それを考えると…うん、徒弟制で教える教え方の、想像もつけば形も見える。
本格的に「ごりっ」としたコードを書く時に、正直入れる隙間はないんだけど(入れるような隙間は全部class化されてるし)。
比較的簡単で廉価な、本当にいわゆる「Script」を書く程度の時に(で、これがまた案外にそゆ仕事があったりします。ぽっつらぽっつら)。
その手の事を大量にやらせて、まず「馴染ませる」ほうがよいのではないかと。


んで。尤も大事なのは。
上述である程度「組める」ようになった瞬間、そこで胡座かいたり腰掛けたりしないように、常日頃から「今はまだ未熟がじゅくじゅくな状態で、半熟ですらないんだぞい。一通り組めるようになってやっと"半人前"なんだぞい」と刷り込んで理解させまくる事。
そうすれば「根っこを教えずに表面だけ叩き込む」事による弊害を確実にヘッジできるから。


もしかして。
もしかして。
ずぶの素人さんに、少しだけ教育できる方法論が、手元に降りてきたかもしれない。
…えと…つまりこれはあれですか? 「やれ」と、どなたさ、かがおっしゃってますか?(苦笑

…どうやって学んだんだろう?

最近…という訳でもないのですが。
いわゆる初学者の方々と接する機会というのが決して0ではないわけでして。
彼らが「これからstartをするためにどうしたらよいですか」という質問に対して、まぁ正直なところ「全力でもって回避&逃走」をしていた訳なのですが(より正確には「初心者に対して教えるのがうまいメンツ」に全力で振ってました)。
いやまぁ当面そのスタンスは変わらんのですが(マテ)、とはいえそこになんの考察もない、ってのも如何なものかと思いまして。


まずは自分の事を思い出すです。…思い出すです。…思い出そうとするです。
っつかですねぇかれこれ30年弱前の事を思い出すのって結構大変なんですよ。頑張れ自分!!


昔。
まだ世界が混沌だったころ…って戻りすぎ。
進めて。


…一番初めに組んだっつか打ち込んだプログラムは、多分こんな感じだったと思うです。
言語はN88 BASIC

10 FOR I=0 TO 100 STEP 10
20 LINE (0,I)-(I,100)
30 NEXT

シチュエーションは…あまり好ましくないので省略*1
まぁ。とりあえず打ち込んだらグラフィックが出るですよ。なんとなく格好いいですよ(おいちゃんのセンス的に)。
で。
STEPの値をちょっといぢると、またその網目の密度が広がったり狭まったりするですよ!!


そんな感じで遊び。ついでに、TALK文ってのがあっていやまぁ動く機種限定なのですが。これが「しゃべる」ですよ!!
その辺をいぢりながら…ようは「元々あるプログラムソースの、微かにわかる部分をいじっては壊し」を繰り返して、プログラムってものへの抵抗感を削減していきました。…いやまぁそも「抵抗感あったんかい?」って突っ込みはおいといて。
…まぁその後も。ゲーセンのパソコンに「よくわからないけどこれを打ち込むとパックマンのなんか動くのが動き出す」とかってのを覚えたので…プログラムの前にタイピングを覚えたようなもんですかねぇ。


ここで多分重要なのは。
「初めての人でもごにょごにょできる程度にシンプルで単純でプログラム量が少ない」事。
いきなりン千行とかあったらめげるでしょ?


その後…中学の時は…ゲームはしてたし、例えば信長の野望ってゲームの初期パラメタを決める部分がBASICだったりしてその辺でちょっと手ぇ出すと全パラメタをすごい値に出来たりとかってちょっとした「値の変更」くらいはやったけど…プログラムそのものは、な〜んもやってなかった気がするです。
ベーマガのプログラムも、そんなに見てなかったしなぁ。


その後、紆余曲折があった…ってほどでもないのですが…工業高校に入り。そこでポケコンをげとって…ってあたりから、割とまじめにBASICを触り始めた気がする。…理由は「ゲームを作るため」w
…うんこの頃にはすでに、何となく、どう書けばいいかわかってたなぁ。


そか。
ものの数行、というプログラムからstartして。何十行何百行っていうプログラムから「とりあえず自分がごにょりたいところ」を探してごにょってる内に、何となく「プログラムという文法」に慣れたんだな。わからないなりに。
…もの凄く怪しい知識なので不安なんだけど。もしかしてこれって「乳幼児が言語を覚える過程」に似ているのではないかしらん?


だとすると…「単純なプログラムとそれをちょろっとごにょるドリル」を山盛りで作って。
それを少しづつステップアップさせていくと、実は一番確実にプログラムが覚えられるのかしらん?


さて…とりあえずこれを投げっぱなしジャーマンw
色々なかたからの様々な突っ込みを期待w

*1:上大岡駅にあった…確か長崎屋さんだったと思ったですが。デパートの展示品のパソコンを使って…テープローディングでゲームをやっていたです。で。テープローディングはゲームを動かすまでにン十分ほどかかるので、その間ヒマでヒマで。横の本棚にあった「初めてのべーしっく」みたいなもの…ええ売り物ですともさ…をもってきて、折り目がつくのも気にせずにがば〜っと開いて、何となく打ち込んだってのが真実でございます…長崎屋さんにはなんていうか感謝とお詫びの気持ちでいっぱいです

カレンダーの作り方

お題はこんな感じで。
「年月を入力するとその月のカレンダーを表示するプログラムを作成」
どげんかせんといかん事を一個づつ分解していきませう。


まず
1.年と月の入力を受け取る。
シンプルですね簡単ですね。このレベルで躓くなら、対象言語の入門書あたりを確認してください。
で…


1-1.入力がない、もしくは入力が無効の場合、デフォルトを「今」にする
こんなちょっとした小技がステキだったりします。小枝は美味しいのですが。


つぎ。ここらあたりから微妙に本題。
2.対象年月の「末日」を求める
ここで「ふふん簡単」とか思うと、閏年問題に引っかかりますのでご注意を。


んで。
3.1日から「末日」までの数字をとりあえず出力する
いったんは「数字だけ」。その後で、テーブルタグだのcssだのを使って「縦に」出力したり「横に」出力したりして遊んでおくと後々便利です。


そろそろ面白く。
4.3番の日付に「曜日」を付け足して表示する
曜日の算出方法は色々ありますが。言語が持ってるなんらかのお便利なclassがない場合とか頑張ってみたいとかいう場合、「ツェラーの公式(Zeller's congruence)」を用いてみるとよいでせう。
ここでも、すこ〜し表示で遊んでみると面白いです。


ちなみに、ここで最低限の「カレンダー」は完成だったりしますw
でもまぁせっかくなので、いわゆる「四角いの」を考えて見ませう。
四角いカレンダーを作る場合。最大のポイントは「どこで改行するか?」に尽きます。
とりあえず、多分一般的だと思う「日〜土」の並びで考えてみますが。


回答を書いてしまうと

for(day = 1; day >= 末日; day ++;) {
 日付の出力処理
 if (true == is土曜日(day)) {
  改行処理
 }
}

概ねこんな感じです…でだまされると酷い事になりますw
第一週が変に左よりになっちゃうんですね。
なので。ループの前に、こんな処理を入れてあげます。

if (1日が月曜日なら) {
 空白を1つ
} else
if (1日が火曜日なら) {
 空白を2つ
} else
if (1日が水曜日なら) {
 空白を3つ
} else
if (1日が木曜日なら) {
 空白を4つ
} else
if (1日が金曜日なら) {
 空白を5つ
} else
if (1日が土曜日なら) {
 空白を6つ
}

for(day = 1; day >= 末日; day ++;) {
 日付の出力処理
 if (true == is土曜日(day)) {
  改行処理
 }
}

とりあえず出来ますが…うんぶっちゃけ「うざい」。
ここで。曜日の数値に注目します。多くのツェラーの公式では、0が日曜日〜6が土曜日になります*1
あれ?
ほら冷静に、上のプログラムをもう一度。
ツェラーの公式では、1なら月曜日、2なら火曜日、3なら水曜日、以下略。
…なんか共通点見えてきません?


ってなわけで、改造。

n = ツェラーの公式(1日)
空白をnつ

for(day = 1; day >= 末日; day ++;) {
 日付の出力処理
 if (true == is土曜日(day)) {
  改行処理
 }
}

ほぉらシンプル。
これで概ねカレンダーができあがります。
OKざましょか?


余談
多分、やると怒られるか、或いは怒ってすら貰えない別解。とりあえずPHPで。
$y、$mに年と月が入ってるとします。

$s = `cal $m $y`;
print $s ;

おそまつ。

*1:wikiのだと0が土曜日なんですよねぇ…くまったことに

多分一番無謀なちゃれんぢ始めますw

んと。初心者さんの「コレが出来ない〜」って質問を見ていると、多くの場合一足飛びどころか百足くらい飛ぼうとしてたりします。
なので。
ちとそこら辺で「分解して一段一段登っていく」一助になればいいかなぁと思いまして。


っていうか「初心者相手にするのが苦手」って豪語しているおいちゃんがどこまでできるか?
ベテラン勢の皆様、是非生暖かい突っ込みをお願いいたしますw