新人をバイナリアンに育てる ~ その10 ~

やはりこういう地味なものは、地味にしか展開しない。新人、高橋君8月に突入。C言語は初めてで、ポインタの前の配列で苦戦。

新人高橋君 日報 8/1(月) 18:21

作業報告します

今日行ったこと
 -"C言語入門書の次に読む本"を409ページ中122-137まで読み進める
 -"明解C言語"を325ページ中118-132まで読み進める

 -複数行読んで、1文字目に応じて異なる関数を読んで異なる表示をするプログラムの作成
 -複数行読んで、各コマンドを実行するプログラムの作成

今後のtodo
 -"C言語入門書の次に読む本"を読み進める
 -"明解C言語"を読み進める


 -入力に応じて三角形、四角形、円を複数個描画その後にrawデータで保存するプログラムの作成
  -複数行読んで、最初の計画通り各コマンドを実行するプログラム

 -行を読むプログラムをバイナリフォーマットで行うようにする
 -文字列を10進数の数に変換するプログラムの作成する
 -文字列を16進数の数に変換するプログラムの作成

社長コメント

もうちょい詳しく書きましょう。
>   -複数行読んで、最初の計画通り各コマンドを実行するプログラム
s(小文字)
とかいてあったら表示をする
S(大文字) ファイル名
と書いてあったらセーブする
L(大文字) ファイル名
と書いてあったらロードする

ファイル名の処理(とくに一貫性のある処理=美しいプログラム)が難しいかもしれない。

>  -文字列を10進数の数に変換するプログラムの作成する
-> my_atoi ね
>  -文字列を16進数の数に変換するプログラムの作成
-> my_atoi16 ね


コメント

「1文字目に応じて異なる関数を読んで異なる表示をするプログラムの作成」でなかなか先に進まず。
switch/case でも苦戦中。教える方とも我慢比べ。報告を見てもやっぱりわからないので、指導が入ります。

週刊社長通信 8/1

■ What's New
本日、XXXにいってきました。
案件として成立しそうです。
なんかぼちぼち日本語で書いた資料が効いてきている。YYY のウェブとか。
もうちょい日本語のWebを増やすか、、、

先週の金曜日は SSS という会社に行ってきました。
サッカースタジアムを上から俯瞰したいらしい。
これも WEB 経由。

営業いらないじゃん。ウェブを充実させていこう、、、

ZZZの案件=> 「同プロジェクトの経験のない会社への発注はリスクが高い」
だって。そんじゃ最初からコンペするな、、、といいたい。

■ 読書
ゲーテル・エッシャー・バッハ」再帰が難しいまま、160ページくらい=>(再開)
いそがしくて読書してないのか、、、
今日は「生命とは何か」をもって電車に乗りました。

科学の”正しい”知識を増やしていくことは我々の業種にとって重要です。
文学やイデオロギーよりも重要です。
なぜなら、こーしょな文学論やくだらないイデオロギー談義は宇宙の果てでは意味がありませんが、
正しい科学の知識は宇宙の果てでも意味があるから。

■みんながリーナス・トラバースさんになろう。
 =>どうすればなれるか?
 =>3つの柱がある

1. コンピュータプログラミング技術
-> ポインタと再帰がわかること
2. コンピュータ設計技術
3. コミュニケーション能力

とくに最終的に重要になってくるのが設計能力。
これは囲碁が上達する人の原理と同じ。

ものの本によると、囲碁が上達する人は初心者の時からわかるらしい。
なぜその手を打ったか論理的に説明できることが重要らしい。
論理の正誤はこの際問題にならない。

最終的には設計書を書けるようになりましょう!!!
設計書が書ければ一人前です。

どうも、Yさんとかは頭の中に設計書があるみたいね。

                                                                                            • -

スタックマシンをつくりたいのだが、その前に scheme を復活させることにした。
DirectFB でそれなり数のテストを作らなきゃならなくなって、
C のソースをたくさん書くのは嫌なので、scheme にしようと。
まぁみんなを Lisp に巻き込むという事だね。

で今ソースを見たら boost を使っている、、、
だめじゃん。Linux ならいいけど、、、組み込みシステムに使えない。

                                                                                            • -

ということで、プログラマが知らなければならない言語
1. C
2. forth
3. lisp
4. VHDL
5. アセンブラ
6. C++
7. sed
8. awk

というのが私のおすすめ順。Forth がわかれば組み込みシステム技術者になれるでしょう。Lisp を知っていればコンパイラ技術者になれるでしょう。VHDL を知っていればハードウェア関連に強くなれるでしょう。LispVHDL は出会わなくても組み込みシステム技術者になれます。Forth も出会わなくても大丈夫な言語ですが、、、知っているのと知らないのでは大違い。組み込み技術者にとって必須の技術が詰まっている。Lisp も出会わなくても大丈夫と言えば体上部ですが、、、これは知っているのと知らないので大きく人生を変える言語でしょう。Emacsmule を使っている人は普段からlisp を使って自分の環境を拡張してください。

Java を知っていても Python を知っていても Ruby を知っていても、それだけではコンピュータのエキスパートにはなれないでしょう。sedawk は知っていると便利かな。特にawk はちょっとしたコンパイラだからね。

あと、Object 指向は必要な概念ではないね。C++ は便利で好きな言語だけど。Lisp でプログラムを書いていて思ったけど、一切、オブジェクト指向の必要がなくかける。

しかも破綻せずに。C は規模が大きくなると破綻する(ので C++ が必要になる)けど lisp は破綻しない。ただし、だからといって、必要なのは関数型言語でもない。マクロでもない。(マクロは便利だけど)

必要なのはクロージャーとデリゲート。いずれもインタフェースを提供する機構だ。C++ は class でクロージャーを、テンプレートでデリゲートを手に入れた。Lisp は最初から両方持っている。

巷の流行に惑わされないようにしましょう。
惑わされそうなキーワード:オブジェクト指向、関数型、マクロ、Railsクロージャー、デリゲート
(ん?今必要って言ったばかりジャン、、、、)

■追伸
dc というプログラムをインストールして使えるようにしておいてください。dc は一種の電卓です。

http://www.gnu.org/s/bc/
bc の中に dc があるらしい。
ソースをダウンロードしてコンパイルしてインストールしてください。
出来るかな?

コメント

いまにして思えば、やはり文学的な心は必要。重要。いろんなことへの感受性の解像度が低いと結局、正しい知識を得ても運用できない。

偉そうに Forth っていっているけど、Forth 今でもかけないし、、、

なぜか dc をコンパイルせよと言っている。謎。

新人高橋君 日報 8/2(火) 18:18

作業報告します

今日行ったこと
 -"C言語入門書の次に読む本"を409ページ中138-154まで読み進める
 -"明解C言語"を325ページ中133-148まで読み進める

 -複数行読んで、各コマンドを実行するプログラムの作成
  -表示、セーブ、ロードそれぞれを動作させるところまで

今後のtodo
 -"C言語入門書の次に読む本"を読み進める
 -"明解C言語"を読み進める


 -入力に応じて三角形、四角形、円を複数個描画その後にrawデータで保存するプログラムの作成
  -複数行読んで、最初の計画通り各コマンドを実行するプログラムの手直し

 -行を読むプログラムをバイナリフォーマットで行うようにする

 -文字列を10進数の数に変換するプログラムmy_atoiの作成
 -文字列を16進数の数に変換するプログラムmy_atoi16の作成

コメント

ちゃくちゃくとバイナリアンへの道を進んでいます。s(表示) と S(セーブ) と L(ロード) がコマンド。「行を読むプログラムをバイナリフォーマットで行うようにする」は何を意味しているのか今となってはわからない。

社長の指示

>  -文字列を10進数の数に変換するプログラムmy_atoiの作成
>  -文字列を16進数の数に変換するプログラムmy_atoi16の作成
1st version はただの16進数のみを解読
例: 123
ABC
abc
AbC
xyz -> error

2nd version はただの16進数と 0x をつけた 16進数を解読する
例: 0x123
0xABC
DEF
Def
def
0xDEF
XYZ -> error

>  -行を読むプログラムをバイナリフォーマットで行うようにする
バイナリになると
一行ではなく一文字ずつあるいはまとまって読むようになる。
まずは
P ... (10, 10) に点を打つ
L ... (15, 15, 20, 20) に線を書く
s ... show する
この3つをサポートする。

任意の場所に点を打てるようにするにはどうしたらよいか?

* ヒント
関数の戻り値をうまく使う

determine -> dispatch_xxxxxx
xxxxxx は graphic とか file とか show とか

doit = dispatch_graphic(....);
で、もし実行したら 1 が返る、実行していないなら 0 とすると
if ( doit == 1 ) {
continue; // <- continue は何かを調べておいてください。
}
とすればよい。その後
doit = dispatch_xxxxxx
if ( doit == 1 ) {
....
...
...

とすればスマートになる。

コメント

何事も step by step。一文字読むプログラムでも難しい。そして、continue が何かを教えている。社著の私は最終的にはバイナリを読むということをさせたいらしい。

新人高橋君 日報 8/3(水) 18:12

作業報告します

今日行ったこと
 -"C言語入門書の次に読む本"を409ページ中155-164まで読み進める
 -"明解C言語"を325ページ中149-162まで読み進める

 -DCのインストー
  -挑戦中、コンパイルがうまくいかない

 -複数行読んで、各コマンドを実行するプログラムの改良

 -文字列を10進数の数に変換するプログラム my_atoi の作成
 -文字列を16進数の数に変換するプログラム my_atoi16 の作成
  -ただの16進数を解読するところまで

今後のtodo
 -"C言語入門書の次に読む本"を読み進める
 -"明解C言語"を読み進める


 -入力に応じて三角形、四角形、円を複数個描画その後にrawデータで保存するプログラムの作成
  -複数行読んで、最初の計画通り各コマンドを実行するプログラムの手直し

 -文字列を16進数の数に変換するプログラムmy_atoi16の作成
  -ただの16進数と0xをつけた16進数を解読するようにする

 -行を読むプログラムをバイナリフォーマットで行うようにする

社長コメント

報告をもう少し細かくしてください。(読む側にわかるように)

>  -複数行読んで、各コマンドを実行するプログラムの改良
どんな改良をしたのかをわかるようにしましょう。

コメント

dc のコンパイルはオーバワークだったらしい。ちょっと先を急ぎ過ぎた。my_atoi16 はある程度できたみたい。だんだんと社長の私も要求が増え始めた。まぁ読む側にわかるように、、、という意識は難しいよね。

新人高橋君 日報 8/4(木) 18:14

作業報告します

今日行ったこと
 -"C言語入門書の次に読む本"を409ページ中165-174まで読み進める
 -"明解C言語"を325ページ中163-179まで読み進める

 -文字列を16進数の数に変換するプログラムmy_atoi16の作成
  -0xが先頭についていた場合のことも含めて作成
  -テストプログラムの作成

今後のtodo
 -"C言語入門書の次に読む本"を読み進める
 -"明解C言語"を読み進める


 -入力に応じて三角形、四角形、円を複数個描画その後にrawデータで保存するプログラムの作成
  -複数行読んで、最初の計画通り各コマンドを実行するプログラムの手直し

 -行を読むプログラムをバイナリフォーマットで行うようにする
  -バイナリファイルを読み込み、
   Pを読み込むと(10, 10)に点を打ち、Lを読み込むと(15, 15, 20, 20)に線を描き
   sを読み込むと表示させるプログラムの作成

コメント

だんだんとバイナリを扱う感じになってきた。my_atoi16 で 0x がついたものに対応した。よしよしって感じかね。一歩一歩進んでいるという感じ。

新人高橋君 日報 8/5(金) 18:28

作業報告します

今日行ったこと
 -"C言語入門書の次に読む本"を409ページ中165-174まで読み進める
 -"明解C言語"を325ページ中163-179まで読み進める

 -バイナリファイルを読み込みコマンドに応じた図形を描画するプログラムの作成
  -Pを読み込むと(10, 10)に点を打ち、Lを読み込むと(15, 15, 20, 20)に線を描き
   sを読み込むと表示させるところまで

今後のtodo
 -"C言語入門書の次に読む本"を読み進める
 -"明解C言語"を読み進める

 -バイナリファイルを読み込みコマンドに応じた図形を描画するプログラムの作成
  -バイナリファイルの作成
  -コマンドに応じた図形を描画するプログラムの作成

コメント

ん?ついにちょっと作業がアクセラレートされた?来週に期待しちゃうね。(10, 10) への点うちと(15, 15) - (20, 20) への線はできたらしい。いままで三角形とか書いてたからそこは難しくないでしょう。

RAM Disk が足りない

RAMDISK incomplete write で落ちたとき、RAMDISK が足りないのかもしれない。

RAMDISK: gzip image found at block 0
mmc0: new high speed SD card at address 09c1
mmcblk0: mmc0:09c1 SD02G 1.83 GiB
mmcblk0: p1 p2
mmcblk0: p2 size 6995968 extends beyond EOD, truncated
usb 1-1: new high-speed USB device number 2 using ci_hdrc
RAMDISK: incomplete write (30800 != 32768)
write error
EXT4-fs (ram0): couldn't mount as ext3 due to feature incompatibilities
EXT4-fs (ram0): bad geometry: block count 32769 exceeds size of device (32768 blocks)
EXT2-fs (ram0): error: couldn't mount because of unsupported optional features (240)
EXT4-fs (ram0): couldn't mount as ext3 due to feature incompatibilities
EXT4-fs (ram0): bad geometry: block count 32769 exceeds size of device (32768 blocks)
EXT2-fs (ram0): error: couldn't mount because of unsupported optional features (240)
List of all partitions:
0100 32768 ram0 (driver?)
0101 32768 ram1 (driver?)
0102 32768 ram2 (driver?)
0103 32768 ram3 (driver?)
0104 32768 ram4 (driver?)
0105 32768 ram5 (driver?)
0106 32768 ram6 (driver?)
0107 32768 ram7 (driver?)
0108 32768 ram8 (driver?)
0109 32768 ram9 (driver?)
010a 32768 ram10 (driver?)
010b 32768 ram11 (driver?)
010c 32768 ram12 (driver?)
010d 32768 ram13 (driver?)
010e 32768 ram14 (driver?)
010f 32768 ram15 (driver?)
b300 1921024 mmcblk0 driver: mmcblk
b301 81920 mmcblk0p1 00065e7c-01
b302 1838080 mmcblk0p2 00065e7c-02
No filesystem could mount root, tried: ext3 ext4 ext2 vfat msdos
Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(1,0)
CPU0: stopping
CPU: 0 PID: 0 Comm: swapper/0 Not tainted 4.4.0-xilinx-00001-gcb108df-dirty #2
Hardware name: Xilinx Zynq Platform
[] (unwind_backtrace) from [] (show_stack+0x10/0x14)
[] (show_stack) from [] (dump_stack+0x80/0xcc)
[] (dump_stack) from [] (ipi_cpu_stop+0x3c/0x6c)
[] (ipi_cpu_stop) from [] (handle_IPI+0x5c/0x7c)
[] (handle_IPI) from [] (gic_handle_irq+0x78/0x94)
[] (gic_handle_irq) from [] (__irq_svc+0x54/0x90)
Exception stack(0xc071bf30 to 0xc071bf78)
bf20: 00000000 00000000 2f0c0000 ef7d9000
bf40: b70cd1d8 00000000 b8851aca 00000000 ef7d8618 00000001 00000000 00000000
bf60: 00000008 c071bf80 c038e938 c038e95c 60000113 ffffffff
[] (__irq_svc) from [] (cpuidle_enter_state+0xdc/0x1d4)
[] (cpuidle_enter_state) from [] (cpu_startup_entry+0x1a4/0x208)
[] (cpu_startup_entry) from [] (start_kernel+0x33c/0x39c)
[] (start_kernel) from [<0000807c>] (0x807c)

そんなときは boot 時の引数に ramdisk_size を追加すればよい

bootargs=console=ttyPS0,115200 root=/dev/ram rw rootwait earlyprintk ramdisk_size=65536

あるいは .config で CONFIG_BLK_DEV_RAM_SIZE を 32768 から増やせばよい。

CONFIG_BLK_DEV_RAM=y
CONFIG_BLK_DEV_RAM_COUNT=16
CONFIG_BLK_DEV_RAM_SIZE=32768

新人をバイナリアンに育てる ~ その9 ~

新人で C の初心者高橋君。Linux のコマンドを理解し、Emacs(Mule) でメールが打てるようになりました。プログラムも配列を VRAM に見立てて線を書いたりしています。

いままで、報告の箇条書きのマークに ー をつかってましたが、ちゃんと - を使うようになりました。今まで混乱するから本人には伝えていなかったのですが、7週間たってようやくそういった細かいことを伝えてもいい時期になりました。それまでは、キャパオバーということで意図的に伝えてなかったのでした。

新人高橋君 日報 7/25(月) 18:12

作業報告します

今日行ったこと
 -"C言語入門書の次に読む本"を409ページ中39-54まで読み進める
 -"明解C言語"を325ページ中41-52まで読み進める

 -1行読んで、1文字目と空白で区切った列を文字列として表示するプログラムの作成

今後のtodo
 -"C言語入門書の次に読む本"を読み進める
 -"明解C言語"を読み進める


 -入力に応じて三角形、四角形、円を複数個描画その後にrawデータで保存するプログラムの作成

  -1行読んで、1文字目と空白で区切った列を”数字”として表示するプログラム 
  -1行読んで、1文字目に応じて、異なる関数を読んで、異なる表示をするプログラム
  -複数行読んで、1文字目に応じて、異なる関数を読んで、異なる表示をするプログラム
  -複数行読んで、最初の計画通り各コマンドを実行するプログラム

  -円を描画するプログラムの作成
 
 -図を回転させるプログラムの作成

社長コメント 7/25(月) 18:34

日々の報告として

問題点:
改善点:

をあげておくと、週の終わりにそれをまとめるだけになります。
例えば今日であれば、

問題点:
 関数内で ++ しても影響しない理由 => 調査が必要
 C言語で配列を関数の引数として渡した時の動き

それとも issue track をいれるかな、、、ソース管理(git)も課題だな、、、


>  -"C言語入門書の次に読む本"を409ページ中39-54まで読み進める
=>えらいね。ちゃんと記号を変え始めた。
こういう応答がコミュニケーションだね。


>   -円を描画するプログラムの作成
>  -図を回転させるプログラムの作成
これは今後の個人的な課題ということでやらないかもしれない。

予定としては
一行読んで実行するプログラム、それの改良
スタック型のプログラム
シリアル通信
ネットワーク
Z80
LCD

ってところか。予定は予定なので変わるかもしれない。

コメント

あれ?金曜日と同じ内容「1行読んで、1文字目と空白で区切った列を文字列として表示するプログラムの作成」でてこずっているのか?意外と、こういう文字列操作は C だと大変なのだろう。

ついに git の導入を考え始めます。あと社長のコメントもすぐにコメントするようになった。相手のかキャパに余裕が出てきたと判断したのか?あるいは業を煮やしたのか?

新人高橋君 日報 7/26(火) 18:42

作業報告します

今日行ったこと
 -"C言語入門書の次に読む本"を409ページ中55-74まで読み進める
 -"明解C言語"を325ページ中53-69まで読み進める

 -1行読んで、1文字目と空白で区切った列を文字列として表示するプログラムの作成
 -1行読んで、1文字目と空白で区切った列を数字として表示するプログラムの作成
 -C言語で配列を関数の引数としたときの動作の調査
  -プログラム中に[]を伴わずに単独で現れた配列名はその配列の先頭要素のポインタとみなされるらしい
   そのため文字列を表示させるプログラムでは動作したようだ

今後のtodo
 -"C言語入門書の次に読む本"を読み進める
 -"明解C言語"を読み進める


 -入力に応じて三角形、四角形、円を複数個描画その後にrawデータで保存するプログラムの作成

  -1行読んで、1文字目に応じて、異なる関数を読んで、異なる表示をするプログラム
  -複数行読んで、1文字目に応じて、異なる関数を読んで、異なる表示をするプログラム
  -複数行読んで、最初の計画通り各コマンドを実行するプログラム

コメント

まだまだ配列で右往左往しています。ポインタの理解はまだまだ先になりそうです。

新人高橋君 日報 7/27(水) 18:04

作業報告します

今日行ったこと
 -"C言語入門書の次に読む本"を409ページ中75-90まで読み進める
 -"明解C言語"を325ページ中70-85まで読み進める

 -1行読んで、1文字目と空白で区切った列を数字として表示するプログラムの作成
 -1行読んで、1文字目に応じて、異なる関数を読んで、異なる表示をするプログラムの作成


今後のtodo
 -"C言語入門書の次に読む本"を読み進める
 -"明解C言語"を読み進める


 -入力に応じて三角形、四角形、円を複数個描画その後にrawデータで保存するプログラムの作成

  -1行読んで、1文字目に応じて、異なる関数を読んで、異なる表示をするプログラム
  -複数行読んで、1文字目に応じて、異なる関数を読んで、異なる表示をするプログラム
  -複数行読んで、最初の計画通り各コマンドを実行するプログラム

 -やってみたいプロジェクトの計画

コメント

「1文字目と空白で区切った列を数字として表示するプログラム」atoi とかを使うということになるのでしょう。数字とascii 文字と配列の関係に自ら気付いてくれることを願って、あまり、指導していない。いいのか悪いのかは不明。わかった気になってもらっても困るしね。

新人高橋君 日報 7/28(木) 18:05

作業報告します

今日行ったこと
 -"C言語入門書の次に読む本"を409ページ中91-106まで読み進める
 -"明解C言語"を325ページ中88-101まで読み進める

 -1行読んで、1文字目に応じて、異なる関数を呼んで異なる表示をするプログラムの訂正
 -複数行読んで1文字目に応じて異なる関数を呼んで異なる表示をするプログラムの作成

 -やってみたいプロジェクトの計画
  -ある文章を読み、こちらが望む文字列(1つでも複数個でも)の統計情報をそれぞれ得るプログラムの作成をやりたいと思います

今後のtodo
 -"C言語入門書の次に読む本"を読み進める
 -"明解C言語"を読み進める


 -入力に応じて三角形、四角形、円を複数個描画その後にrawデータで保存するプログラムの作成
  -複数行読んで、最初の計画通り各コマンドを実行するプログラム

 -やってみたいプロジェクトの計画

社長コメント

>  -やってみたいプロジェクトの計画
>   -ある文章を読み、こちらが望む文字列(1つでも複数個でも)の統計情報をそれぞれ得る
> プログラムの作成をやりたいと思います
もういくつか出してみて。

野心的ななにかがあるのかな?

コメント

「1文字目に応じて、異なる関数を呼んで」case で分岐するプログラムだね。ascii コードは理解し始めた模様。やってみたいプロジェクトに統計情報を得るプログラムとなった。まぁ悪くないよね。自分で先を見据えられるかどうかがポイントだ。しかし、社長の私はダメ出ししている。ダメじゃん。

新人高橋君 日報 7/29(金) 18:17

作業報告します

今日行ったこと
 -"C言語入門書の次に読む本"を409ページ中107-121まで読み進める
 -"明解C言語"を325ページ中102-117まで読み進める

 -Emacs の設定の変更
 -テキストファイルを読んでこちらが入力した文字列の統計情報を得るプログラムの作成

 -週報作成

今後のtodo
 -"C言語入門書の次に読む本"を読み進める
 -"明解C言語"を読み進める


 -入力に応じて三角形、四角形、円を複数個描画その後にrawデータで保存するプログラムの作成
  -複数行読んで、最初の計画通り各コマンドを実行するプログラム

コメント

ひといきついて、自分の”やりたい”と言っていたことをしてもらうことにしたんだね。もちーベーションを高めたいという表れだ。入社したてはこんなもんだよね。でも、この悠長さで大丈夫か?2か月たったけどポインタの理解ができてないぞ。

おまけ:社長オブジェクト指向について延々と語る

> Lisp で書いているのだが、Lisp すごいね。
オブジェクト指向の良さは

  1. 情報の隠ぺい
  2. ポリフォリズム

特に、情報の隠ぺいは強力。問題を局所化できるので開発が楽。
Lisp は開発が決して楽ではない。
情報も隠蔽しない傾向にあるから、ノーガードの打ち合いみたいになる。
いろんなことができすぎるので、今の時代のセキュリティには合わない気もする。

C++/Java も含めてオブジェクト指向の抱える問題は、アプリケーション構築時のクラス概念の破綻だ。
だいたいにおいてきれいにいかない。
それは、オブジェクト指向が提供する哲学が、複雑なアプリケーションを網羅しないことを指す気がする。

クラスは継承される毎にたいていメンバー変数が増える。
上位クラスから見ると下位クラスは見えないし(当たり前)
下位クラスからのアクセスを上位クラスは隠蔽する。
下位のクラスは問題を局所化できる。
小さなプログラムなら非常にきれいに書ける。

変数という意味ではオブジェクト指向は、上位クラスから下位クラスに行くにしたがって
細かい条件に応じて、”つけたす”事ができる。これは、下位クラスが、具象化していき
より細かい条件を、細かく満たすことができることを指している。

一方、メソッドについては実は違う。
メソッドはオブジェクト指向では上位クラスが、意味的にはすべてのありとあらゆる
メソッドを用意していて、下位クラスはそれを選択して使うことになる。
よくある、
図形 -> 多角形 -> 三角、四角
は、すべてのありとあらゆる図形的なメソッドを図形が持つことを意味する。
だから、一番上のクラスは万能クラスなのだ。

また、クラスが持つ概念もアプリケーションが複雑になるにつれてあやふやになる。
図形程度だと問題は起きない。
しかし、複雑なアプリケーションを考えるとすぐに破たんする。
多重継承とか難しく考えなければならなくなる。
飛行機はタイヤがあるけど車?とか。

だから、オブジェクト指向的には
万能乗り物 -> 飛行機、車
位の階層でしかものを考えられない。
乗り物 -> 陸を走る、空を飛ぶ、海を渡る -> さらに細かいクラス
といった具合にきれいに階層化はならない。

だから、オブジェクト指向的なクラス階層を考えるとアプリケーションは破たんする。

オブジェクト指向がもたらすものはクラス階層ではなく、"ポリフォリズム"につきる。
これだけ。

ポリフォリズムというと難しく聞こえるが、要は API を用意して、それに合致する
個々の処理は、個々に任せるような仕組み。オブジェクト指向
個々=下位のクラスの仮想関数
となる。これはいったい何をしめしているのか?

API を用意して、その中身はブラックボックス化しようとしているに過ぎない。
結局、プログラマのやりたいことは
”問題を局所化”
”局所化された問題を解く"
である。
仮想関数で局所化された問題を解く仕組みが C++/Javaオブジェクト指向だ。
C++ の template は別の意味で問題を局所化する。
C# のデリゲートも別の意味で問題を局所化する。

いずれも API (かそれに類するもの)が決定され、中身を別途書く。
じつはそれってマクロじゃないか?というのが今回の結論。

for(int I = 0 ; I < 100; ++I ) {
なんか処理
}

このなんか処理のところを

  1. subroutine で呼ぶ -> 構造化!!
  2. iter->do_somtihng(); -> オブジェクト指向

何でもいいんじゃないか?
API が規定されてブラックボックス化できれば!!
テンプレートなんてマクロだしね。

lisp のマクロは言語レベルで高度なマクロを提供する。
そのために、ほとんどのケースで、オブジェクト指向もデリゲートもいらない。

ただ関数が呼ばれればよい。必要であれば関数のすげ替えをすれば
個々の対応ができる(仮想関数のようなこともできる)。

その代り、設計に頭をすごく悩ませることになる。慣れてくると加速するような気もする。
いろいろ設計して、結局 common lisp の用意するマクロがつかることがわかる、、、
ということは何度もある。だから、ほとんどのケースで既存のライブラリの使いまわしで
やれてしまう。

C++ は結局、ライブラリの再利用ができない。
Lisp は出来る。マクロという高度な抽象化ができるからだ。
C++ はテンプレートでそれを実現しようとしている。
テンプレートは難しすぎて、結局、だれも理解できないものができる。(Lisp も同じだが、、、、)

セキュリティの問題と難しさで世の中絶対にlisp の時代は来ないけど、
lisp を使えるようになって、マイライブラリが充実してくると、
たぶん、プログラムの構築スピードはとんでもないことになりそう

新人をバイナリアンに育てる ~ その8 ~

新人で C の初心者高橋君。4週間本を読んで配列を理解し、配列を VRAM に見立てて線を書いたりしています。ラインを書くプログラムは出来たようですが、まだまだ改良点があるようです。

argc や argv の解析は C 初心者には難しいのでごく簡単な字句解析を教えてもらいます。

そして、プログラム構築の方法として step by step で実現する方法を伝授されます。

社長のコメント 7/19(火) 23:26

*プログラムの集約
 ー線分を描画するプログラムの手直し
線分をかくのはもっと集約できると思う。中間的には4パターン、最終的には2パ
ターンかな、、、
傾きが 0~1, 1以上,-1~0,-1以下
これがもっと集約されるかな?

*入力に応じて、、、
>  ー入力に応じて三角形、四角形、円を複数個描画その後にrawデータで保
> 存するプログラムの作成
ある”テキスト”を読んで、そのテキスト内容に応じて描画するプログラムにした
い。
簡単な仕様としては、最初に一文字があってそれがコマンド。そのあと、空白区切り
で引数。
引数は整数。例えば

P 10 10
L 10 10 20 20
B 10 10 20 20
F 10 10 20 20

P が点を打つ
L がライン
B がbox四角を書く
F が四角を塗りつぶす
引数は整数で x0 y0 あるいは x0 y0 x1 y1
あとは自分で必要なコマンドを考える。(<=ここ重要。自分で考えることが重要)

*円を書くについて
>   ーまた円を描画する方法について調べる
>    ー円を描画させるアルゴリズムはあるようなので利用したい
簡単にはサインコサインをつかえばできるね。
あと 1/8 の円を書けばあとは書けるかな。

ということで、
まずは
*プログラムの集約
*入力に応じて、、、
 これを実現するために、
1) 1行読むプログラム(<= それ以外はしない。新たに作る)
2) 1行読んで1文字目を表示するプログラム
3) 1行読んで、1文字目と空白で区切った列を”文字列”として表示するプログラム
4) 1行読んで、1文字目と空白で区切った列を”数字”として表示するプログラム
5) 1行読んで、1文字目に応じて、異なる関数を読んで、異なる表示をするプログラム
 最終形態を考えてプログラムする。
[例] P 10 10
なら
(10, 10) に点を打つ
と英語で表示する。など(ここも仕様の詳細は自分で考える)
6)複数行読んで、1文字目に応じて、異なる関数を読んで、異なる表示をするプログ
ラム
7)複数行読んで、最初の計画通り各コマンドを実行するプログラム

古典的だけど、バッファと空白をうまく使うと、使用メモリ量が減る。
うまく使わないと文字列なのでバグだらけになるのでよく考えましょう。
領域があるかどうかに注意する。

*円を書く
まぁ時間があったら自分でやってください。

社長さらにコメント 7/19(火) 23:32

>  ー線分を描画するプログラムの手直し
今日、私が出したヒントで、方法に気が付いたようです。
よく、すぐに気が付いたと思います。

このように、知識を増やしていけば(=経験を積めば)技術はついていきます。
ソースを読むなどして習得していってください。

もう一つの習得方法は、方法論です。
難しい問題(<=どうしたらよいかアイデアが出ない問題)は
より簡単な問題ならどのように解くかを考えていきます。
難しい問題はいろんなパターン(というか45度で)で線を引くでした。
これをもっと簡単な問題に置き換えてやればいいわけです。
例えば、0-10 まで加算する。10-100まで加算する。1から-10まで加算する。など、
これは2次元が難しいので、1次元に優しくして、さらに、描画を加算にしました。

このように”問題を簡略化して解く”という方法論を手に入れると突破力が付きま
す。

ここまで読んだら(読んでいるか読んでいないか心配なので)、メールの返事として
感想をください。

コメント

哲学的なことを言い過ぎかな?コミュニケーションもメールでしろと。結構敷居が高いかも。今考えたら、ちゃんと顔あわせて話した方がよかったかも。じゃなかったら、別の人が顔あわせるべきだったのかな。社長じきじきだと緊張するよね。
と思ったら、間髪入れずに、ほかの社員に指示している(次のメール参照)。それでも、哲学的なことを言い過ぎかな~~~。もっと具体的に指示は出せないものなのだろうか?具体的すぎると考えなくなってしまうかもしれないなぁ~~~。ここは難しい。

SK くんという別の社員に社長から指示 7/19(火) 23:34

SK へ
>   ー行列計算を用いるため要確認
>   ー変換後の座標の判定方法についても考える必要がある
これを実現するための API を設計してください。
設計して、高橋君に渡してください。
難しい設計をしないように。
特に OpenCV などは参考に”しない”ように。難しすぎるので。
以下に簡単な API を作るかがポイントかな。
(あと、”これを実現するため”というあいまいな仕様をどこまで具体化できる
か、、、も重要)

SK くんの回答

void rotate( double srcX, double srcY, double *dstX, double *dstY, double angle );

でどうでしょうか。

一般的な行列の計算用の API、こんな感じでどうでしょう。
API の名前を名前を matrix_2x2_2x1 などと工夫したいところですが、とりあえず

// ( out_x ) ( a11 a12 )(x)
// =
// ( out_y ) ( a21 a22 )(y)

void
matrix( double a11, double a12, double a21, double a22,
double x, double y, double *out_x, double *out_y )
{
}

新人高橋君 日報 7/20(水)

作業報告します

今日行ったこと
 ー"初めて使うMule/Emacs"を229ページ中52-66ページまで読み進める
 ー"明解C言語"を311ページ中2-22ページまで読み進める

プログラム関連
 ー線分を描画するプログラムの手直し
 ー線分を描画するプログラムの手直し
 ー1行読むプログラムの作成

今後のtodo
 ー"初めて使うMule/Emacs"を読む
 ー"明解C言語"を読む


 ー入力に応じて三角形、四角形、円を複数個描画その後にrawデータで保存するプログ
ラムの作成

  ー1行読んで1文字目を表示するプログラム 
  ー1行読んで、1文字目と空白で区切った列を”文字列”として表示するプログラム 
  ー1行読んで、1文字目と空白で区切った列を”数字”として表示するプログラム 
  ー1行読んで、1文字目に応じて、異なる関数を読んで、異なる表示をするプログラム
  ー複数行読んで、1文字目に応じて、異なる関数を読んで、異なる表示をするプログラム
  ー複数行読んで、最初の計画通り各コマンドを実行するプログラム

  ー円を描画するプログラムの作成
 
 ー図を回転させるプログラムの作成

コメント

具体性が増してきた。さすがに「1行読んで1文字目を出すプログラム」はクリアした。でも、これを本人がどうとらえるかが重要。「初心者だからこうしている」ととらえないでプログラムを作るときは「常にこれくらい易しいのから始める」ととらえてくれてるのがよい。
SK 君の提案難しいけど、ちゃんとこなせるのだろうか?

社長のコメント 7/22(金) 14:22

> void
> matrix( double a11, double a12, double a21, double a22,
> double x, double y, double *out_x, double *out_y ) { }
out_x と out_y をグローバル変数にして、ポインタを使わないようにしますか。

いっそのこと、全部、グローバル変数にするかね、、、、

> 3) 1行読んで、1文字目と空白で区切った列を”文字列”として表示するプ
> ログラム

1行読んで
1文字目+改行を出力
更に各、空白で区切った”語”を1行ずつ”文字列”として表示する
プログラム

コメント

やっぱり、ポインタが鬼門か。ポインタを回避するためにグローバル変数にしようとしている(私が)。ちゃんと説明してあげろよ!?なのか。しかも金曜日の 14:22 にこんなこと言われて対応できるのか?ピ~~~ンチ。
あと、3) のプログラムできてなかったのか?より詳細に説明している。進捗はどうなっているんだ?

新人高橋君 日報 7/22(金)

作業報告します

今日行ったこと
 ー"C言語入門書の次に読む本"を409ページ中2-38まで読み進める
 ー"明解C言語"を325ページ中22-40まで読み進める

 ー線分を描画するプログラムの簡単な手直し
 ー1行読んで、1文字目と空白で区切った列を文字列として表示するプログラムの作成

今後のtodo
 ー"C言語入門書の次に読む本"を読み進める
 ー"明解C言語"を読み進める


 ー入力に応じて三角形、四角形、円を複数個描画その後にrawデータで保存するプログラムの作成

  ー1行読んで、1文字目と空白で区切った列を”数字”として表示するプログラム 
  ー1行読んで、1文字目に応じて、異なる関数を読んで、異なる表示をするプログラム
  ー複数行読んで、1文字目に応じて、異なる関数を読んで、異なる表示をするプログラム
  ー複数行読んで、最初の計画通り各コマンドを実行するプログラム

  ー円を描画するプログラムの作成
 
 ー図を回転させるプログラムの作成

コメント

結局、ポインタの理解まで行かなかった(のだと思う)。まぁ、金曜日の 14:30 位に言われてすぐには対応できないでしょう。そして、rotate とか matrix とか関数名を言われてもすぐにプログラミングは出来ません。
がんばれ!!

新人をバイナリアンに育てる ~ その7 ~

新人で C の初心者高橋君。4週間本を読んで配列を理解し、社長からコメントをもらいます。


新人「ー拡張させてみたが予想以上にソースが煩雑なため訂正予定」
社長「重要なことは”煩雑”であることを一歩引いて感じることができるかどうかだね。
あと、無駄な処理をしていないかとか、、、、
この経験が重なると、美的感覚が(プログラミング上の美的感覚)が養われてくる。
これらのことを感じるためには、”動いた”を終着駅にしないことだね。」

こんな”哲学的”なこと言ったってわかるわけないじゃん。そもそも、今の自分でも理解が難しい。この数年後「神の数式」を見て、「美的」ということがいかに空疎な事かを知ることになります。数式やプログラムが「美しい」なんてのは妄想でしかないと今は思っています。

新高橋君:日報 7/11(Mon)

作業報告します

今日行ったこと
 ー"Unix/linuxコマンドの使い方"を322ページ中237-247まで読み進める
 ー"新C言語入門"を198ページ中75-98まで読み進める
 今週の計画の詳細をまとめる

プログラム関連
 ー線分を描画するプログラムの作成
  ー第四象限内の線分を描画するところまで終了
 
今後のtodo
 ー"Unix/linuxコマンドの使い方"を読み進める
 ー"新C言語入門"を読む


 ー入力に応じて三角形、四角形、円を複数個描画その後にrawデータで保存するプログ
ラムの作成
  ー三角形を描画させる関数を作成するための前準備として線分を描画するプログラムの作成
   ーあらゆる点の線分を描画するプログラムの作成
    ー与えられた値に応じて適切な線分の描画関数を呼び出すプログラム
    ーfloatを使わずに線分を描画するプログラムにするように変更
  
  ーまた円を描画する方法について調べるべき
   ー図を回転させるプログラムを応用できないか確認したい

 ー図を回転させるプログラムの作成
  ー行列計算を用いるため要確認
  ー変換後の座標の判定方法についても考える必要がある

コメント

C 言語の習得はやはり難しい。とにかく回数。と思い、複数の本の配列までをやってもらうことにしていた。線の描画は、第四象限内までできたらしい。え!こんなペース?と思う人もいるかもしれない。でも、実際はこれくらいがが妥当なのだ。

社長通信 7/11(Mon)

みんながリーナス・トラバースさんになろう。
 =>どうすればなれるか?
 =>科学的アプローチが必要


脱線しつつ、、、直接スレッデッドコードを勉強。(LOL で読んだはずなのだが、、、、)
http://jp.rubyist.net/magazine/?0008-YarvManiacs
がわかりやすい。

スタックマシンの本を読むことにする。
あと、IA64 の本も読むことにする。=>レジスタウィンドウを使っているから。

GLSL について調査したことを一杯忘れたので、やり直し、、、
スーパースカラー=>アウトオブオーダーなプロセッサ
ついでにレジスタを動的に割り当てるかレジスタウィンドウにするかしたい。

コメント

社長が率先して技術的なことを頑張っているなというメッセージ

新人じゃない人の日報

  • Fill Rect の、性能評価テスト

fps を計って表示するようにした
HW 使った場合 -> 580 FPS 前後
HW 未使用 -> 60 FPS 前後

コメント

おーさすが。Fill Rect (DirectFB のアクセラレータとして実装)、HW 使うと相当速くなる。当たり前だけどちょっとうれしい。

新進高橋君:日報 7/12(Tue)

作業報告します

今日行ったこと
 ー"Unix/linuxコマンドの使い方"を322ページ中248-260まで読み進める
 ー"新C言語入門"を198ページ中99-120まで読み進める

プログラム関連
 ー線分を描画するプログラムの作成
  ー第四象限内の線分を描画させた
  ーfloatを使用しないで線分を描画させた
   ー少々汚いため軽く手直しが必要
  ー実行時の引数で線分を描画するように改良

今後のtodo
 ー"Unix/linuxコマンドの使い方"を読み進める
 ー"新C言語入門"を読む


 ー入力に応じて三角形、四角形、円を複数個描画その後にrawデータで保存するプログ
ラムの作成
  ー三角形を描画させる関数を作成するための前準備として線分を描画するプログラムの作成
   ーあらゆる点の線分を描画するプログラムの作成
  
  ーまた円を描画する方法について調べるべき
   ー図を回転させるプログラムを応用できないか確認したい

 ー図を回転させるプログラムの作成
  ー行列計算を用いるため要確認
  ー変換後の座標の判定方法についても考える必要がある

コメント

前日までは線分描画に float を使っていたらしい。この辺が、数学とプログラミングの違いかな。float つかったら遅くなるからね。

新進高橋君:日報 7/13(Wed)

作業報告します

今日行ったこと
 ー"Unix/linuxコマンドの使い方"を322ページ中261-272まで読み進める
 ー"新C言語入門"を198ページ中121-140まで読み進める

プログラム関連
 ー線分を描画するプログラムの作成
  ー引数の数に対応したヘルプの作成
  ー点が指定された範囲を越えた場合の処理の関数の作成
  ーあらゆる線分を描画するプログラムの作成
   ただし手直しすべき部分があるかもしれない

今後のtodo
 ー"Unix/linuxコマンドの使い方"を読み進める
 ー"新C言語入門"を読む


 ー入力に応じて三角形、四角形、円を複数個描画その後にrawデータで保存するプログ
ラムの作成
  ー三角形を描画させる関数の作成
  
  ーまた円を描画する方法について調べる
   ー図を回転させるプログラムを応用できないか確認したい

 ー図を回転させるプログラムの作成
  ー行列計算を用いるため要確認
  ー変換後の座標の判定方法についても考える必要がある

コメント

ついに線分描画で全方向の描画ができるようになった。if を使ったのか case を使ったのか、、、、いずれにせよ場合分けが出来たということ。「ただし手直しすべき部分があるかもしれない」が何なのかは不明。

新進高橋君:日報 7/14(Thu)

作業報告します

今日行ったこと
 ー"Unix/linuxコマンドの使い方"を322ページ中272-281まで読み進める
 ー"新C言語入門"を198ページ中141-161まで読み進める

プログラム関連
 ー線分を描画するプログラムの手直し
 ー三角形を描画するプログラムの作成
  ー複数個描画させる仕組みについて考える必要がある

今後のtodo
 ー"Unix/linuxコマンドの使い方"を読み進める
 ー"新C言語入門"を読む


 ー入力に応じて三角形、四角形、円を複数個描画その後にrawデータで保存するプログ
ラムの作成
  ーまた円を描画する方法について調べる
   ー円を描画させるアルゴリズムはあるようなので利用したい

 ー図を回転させるプログラムの作成
  ー行列計算を用いるため要確認
  ー変換後の座標の判定方法についても考える必要がある

コメント

線分を組み合わせて三角形を作るプログラムにチャレンジ。Logo とかだと簡単にできそうな気がするが、、、

新進高橋君:日報 7/15(Fri)

作業報告します

今日行ったこと
 ー"Unix/linuxコマンドの使い方"を322ページ中282-294まで読み進める
 ー"新C言語入門"を198ページ中161-174まで読み進める

プログラム関連
 ー三角形を描画するプログラムの手直し
 ー円を描画するプログラム
  ー見たアルゴリズムには欠点があるらしいので別の方法を模索中

今後のtodo
 ー"Unix/linuxコマンドの使い方"を読み進める
 ー"新C言語入門"を読む
 ー"C実践プログラミング"の読んでいない部分を読み進める

 ー入力に応じて三角形、四角形、円を複数個描画その後にrawデータで保存するプログ
ラムの作成
  ーまた円を描画する方法について調べる
   ー円を描画させるアルゴリズムはあるようなので利用したい
  ー線分を描画するプログラムの訂正
   ー関数が多すぎて逆に分かりにくくなってる問題
   ー線分を描画させる関数について冗長性がありすぎる問題
    ーエラー判定も若干冗長性がある

 ー図を回転させるプログラムの作成
  ー行列計算を用いるため要確認
  ー変換後の座標の判定方法についても考える必要がある

C実践プログラミングを今週の休日中借ります

コメント

三角形の次はなぜか円。四角形が簡単すぎるから?「関数が多すぎて逆に分かりにくくなってる問題」があるらしい。どんな問題なのだ?土日の間に勉強するらしい。えらいぞ。

新人をバイナリアンに育てる ~ その6 ~

新人で C の初心者高橋君。4週間本を読んで配列を理解しました。バイナリアンになるためについに fopen/fclose を勉強します。
いままで、あまり具体的に指示を出していなかったためプログラムを書くのに四苦八苦していました。ここは、いままでの私の講師の経験を活かし(なぜいままでやらなかったのか、、、、それはここまで、C 言語初心者ははじめてだったから。入社した人は大抵 C 言語かけた)具体的な指示を出すようにします。
さすがに噛み砕いた指示だったらしく、順調にこなしはじめます。やっと ToDo で進捗が出始めました。本人もうれしいことでしょう。

新人:高橋君 日報 7/4(Mon) 17:59

作業報告します

今日行ったこと
 ー"Unix/linuxコマンドの使い方"を322ページ中182-193まで読み進める
 ー"やさしいC++"を98-109まで読み進める

プログラム関連
 ー実行時に第1引数で与えたファイルをfopen,fcloseするプログラムの作成
 ー実行時に第1,2引数で与えたファイルをfopen,fcloseしてそのときのコメントをつけるプログラムの作成
 ー第1引数で与えたグレイスケールのrawイメージデータを
  第2引数で与えた名前のRGBのrawイメージデータに変換するプログラムの作成
 ー第1引数で与えられたRGBのrawイメージデータを
  第2引数で与えた名前のグレイスケールのrawイメージデータに変換するプログラムの作成

今後のtodo
 ー"Unix/linuxコマンドの使い方"を読み進める
 ー"やさしいC++"を読み進める

 ー実行時に第1引数で与えられた72x34のグレースケールのデータに四角を書き加え、
  第2引数で与えられた72x34のグレースケールのデータに”出力”するプログラム作成
 ーシェルプログラムを使い今まで作成したコマンドを組み合わせて実行して、
  与えられた第1引数をgimpでよめるRGBのrawデータでこれに四角を書き加え、
  第2引数をgimpでよめるRGBのrawデータに”書き加え出力”するプログラムの作成

 ー今まで作成したプログラムの改良、具体的には入力に応じて三角形、四角形、円を複数個描画、その後にrawデータで保存するプログラムの作成を行いたい

社長コメント 7/4(Mon) 21:35

少しアイデアが出てきたようです。
実現可能でもなくてよいので、あとアイデアを5個、できれば 10個、もっとできれば
20個考えて書き出してください。
”実現可能でなくてもよい”がポイントです。

コメント

報告時間も 17時50分台になり、落ち着いてきた模様。報告も詳細化され、本人も達成感があることでしょう。「その後にrawデータで保存するプログラムの作成を行いたい」と報告も want が入ってきてモチベーションも上がったようです。
最初からそうすればよかった、、、、
なのに、私は、それ以上を要求しているぞ。だめじゃん。ほめてるけど、ほめてない。道を険しくしすぎ。

新人:高橋君 日報 7/5(Tue) 18:09

作業報告します

今日行ったこと
 ー"Unix/linuxコマンドの使い方"を322ページ中194-202まで読み進める
 ー"やさしいC++"を110-120まで読み進める

プログラム関連
 ー実行時に第1引数で与えられた72×34のグレイスケールのrawイメージデータに四角形
を書き加え
  第2引数で与えられたファイル名で書き出すプログラムの作成
 
今後行ってみたいプログラムの立案

今後のtodo
 ー"Unix/linuxコマンドの使い方"を読み進める
 ー"やさしいC++"を読み進める
 ー"新C言語入門"を読む

 ーシェルプログラムを使い今まで作成したコマンドを組み合わせて実行して、
  与えられた第1引数をgimpでよめるRGBのrawデータでこれに四角を書き加え、
  第2引数をgimpでよめるRGBのrawデータに”書き加え出力”するプログラムの作成


 ー今まで作成したプログラムの改良、具体的には入力に応じて三角形、四角形、円を複数個描画、その後にrawデータで保存するプログラムの作成を行いたい
 ー図を回転させるプログラムの作成
 ー関数電卓の作成
 ーチェス、オセロ、五目並べなど簡単な人工知能プログラム作成
 ー文章から任意の文字列のを数えるプログラムの作成
 ー四角形の適当な情報、座標などを与えられたらその形状、面積を出すプログラムの作成
  ーー難易度から考えてプログラムの改良の後に文字列についてのプログラム作成を行いたいと思う

コメント

道を険しくする社長に必死についてきています。「今後行ってみたいプログラムの立案」してます。えらしなぁ~~。まさかこのあと、私は、それは無理だろ~~とかモチベーション下げること言ってないだろうな。

社長コメント 7/5(Tue) 21:55

ふむふむ。
悪くないんじゃない。
やりたい順(難易度を無視して)は?

コメント

「ふむふむ」とか普段使わない言葉でオブラートに包んでいるね。あと、時間もづらしてメールして、怒らないように(怒っているように見えるらしいよ。早口だから)直接のコミュニケーションは現場に任せている。いろいろ気を使った跡は見える。

新人:高橋君 日報 7/6(Wed) 18:14

作業報告します

今日行ったこと
 ー"Unix/linuxコマンドの使い方"を322ページ中203-210まで読み進める
 ー"やさしいC++"を121-126まで読み進める
 ー"新C言語入門"を2-22まで読み進める

プログラム関連
 ー今まで作ったプログラムをシェルプログラムを使って
  第1引数で与えられた72×34のRGBのrawデータに四角形を書き加えて
  第2引数で与えられた名前のファイルに書き出すプログラムの作成
 ー四角形を描く関数に不備があったため訂正
 ー操作説明させる関数も同様に不備があったため訂正
 
今後行ってみたいプログラムについての計画

今後のtodo
 ー"Unix/linuxコマンドの使い方"を読み進める
 ー"新C言語入門"を読む

 行ってみたいプログラムについての細かい仕様の決定


 ー今まで作成したプログラムの改良、具体的には入力に応じて三角形、四角形、円を複数個描画、
  その後にrawデータで保存するプログラムの作成を行いたい
  ー三角形を描画させる関数を作成するための前準備として線分を描画するプログラムの作成
  ーまた円を描画する方法について調べるべき

 ー図を回転させるプログラムの作成
  ーおそらく行列を用いるため確認
  ー変換後の座標の判定方法についても考える必要がある

 ー関数電卓の作成
  ー簡単な電卓のプログラムの作成は行っているため肉付けをしていく方向で
   ーあまりくどくならないようにすべき

 ーチェス、オセロ、五目並べなど簡単な人工知能プログラム作成
 ー文章から任意の文字列を数えるプログラムの作成
 ー四角形の適当な情報、座標などを与えられたらその形状、面積を出すプログラムの作成

コメント

なんかしらないが、成長の跡が見れる。プログラム作成時に細かくブレイクダウンしないといけないというのが伝わったんだね。

新人:高橋君 日報 7/7(Thu) 18:06

作業報告します

今日行ったこと
 ー"Unix/linuxコマンドの使い方"を322ページ中211-226まで読み進める
 ー"新C言語入門"を24-50まで読み進める

プログラム関連
 ー四角形を描画するプログラムについて説明を追加
 ー線分を描画するプログラムの雛形を作成
  ー縦線、横線、簡単な斜線については描画に成功した
 
今後行ってみたいプログラムについての計画

今後のtodo
 ー"Unix/linuxコマンドの使い方"を読み進める
 ー"新C言語入門"を読む


 ー入力に応じて三角形、四角形、円を複数個描画その後にrawデータで保存するプログ
ラムの作成
  ー三角形を描画させる関数を作成するための前準備として線分を描画するプログラムの作成
   ー簡単な斜線については成功したので今後はあらゆる点に対応できるようなプログラムの作成に入る
  ーまた円を描画する方法について調べるべき
   ー図を回転させるプログラムを応用できないか確認したい

 ー図を回転させるプログラムの作成
  ー行列計算を用いるため要確認
  ー変換後の座標の判定方法についても考える必要がある

コメント

配列を VRAM に見立てて、縦線、横線、簡単な斜め線(たぶん45度) の線を書いてもらった。なんか進んでいる気がする。まだこの時点でポインタは出てきてないね。先は長い。

新人:高橋君 日報 7/8(Fri) 18:13

作業報告します

今日行ったこと
 ー"Unix/linuxコマンドの使い方"を322ページ中227-236まで読み進める
 ー"新C言語入門"を198ページ中51-74まで読み進める

プログラム関連
 ー線分を描画するプログラムの作成
  ー拡張させてみたが予想以上にソースが煩雑なため訂正予定

今後のtodo
 ー"Unix/linuxコマンドの使い方"を読み進める
 ー"新C言語入門"を読む


 ー入力に応じて三角形、四角形、円を複数個描画その後にrawデータで保存するプログ
ラムの作成
  ー三角形を描画させる関数を作成するための前準備として線分を描画するプログラムの作成
   ーあらゆる点の線分を描画するプログラムの作成
  ーまた円を描画する方法について調べるべき
   ー図を回転させるプログラムを応用できないか確認したい

 ー図を回転させるプログラムの作成
  ー行列計算を用いるため要確認
  ー変換後の座標の判定方法についても考える必要がある

コメント

配列を VRAM に見立てての任意の線分描画に挑戦。達成できたのかどうか不明。「拡張させてみたが予想以上にソースが煩雑」。まぁそうなるよね。初めての C みたいな感じだから。よく5週目でここまできたよ。

6週目の目標として三角形、四角形、円を描きたいみたいだ。できるといいね。(できたんだっけ?おぼえてない)

新人をバイナリアンに育てる ~ その5 ~

ここまで新人:高橋君たんたんと本を読んでます。もちろん手も動かしてますが。FORTRAN は経験ありでも C は初めてです。配列で四苦八苦しています。バイナリアンの道はまだはじまったばかりです。

しかし、社長の私は期待しすぎて、ついに4週目の木曜日に決断します。この試練を乗り越えられるのか?

社長の指示 6/30(Thu) 22:01

関数を改良するために
寄り道をします。

int main(int argc, char *argv[])

1) 引数の数を返すプログラムを書く。
例えば
a.out a b c
とすれば、
引数の数は 3ですと表示する。(漢字は使わないほうがよいので次のようになる)
Argument Count:3
と表示する。

[めやす] argc, argv を理解する。特に argc

2) 引数を表示するプログラムを書く。
例えば
a.out a b c
とすれば、

1:a
2:b
3:c

と表示する。
a.out aaa bb cccc
なら
1:aaa
2:bb
3:cccc


[めやす] argc, argv を理解する。特に argv

3) 文字と文字列の理解
再度、"C実践プログラミング"の文字列の部分を読んで、実際に試して理解を深め
る。
特に、今までの
unsigned char data[72][34] あるいは char data[1000];
との違いを”考える”

4) 数字と文字と理解
実行時の第1引数を分解し、文字(文字列ではない)として、さらに数字として表示
する。
例えば
a.out abcdef
とあれば
0:a:<数字>
1:b:<数字>
2:c:<数字>
3:d:<数字>
4:e:<数字>
5:f:<数字><数字> には実際の数字が入る。大文字のA なら 16進数で 0x41 になるはず。

5) 数字の表現と文字の理解
例えば
char c;
とあったときに
c = 48;
c = 0x30;
c = '0';
c = 060;
の違いを理解して、それぞれ表示するプログラムを作る。

6) 実行時の第1引数を与えられたらそれを fopen して fclose するプログラム。
a.out in.bin
としたら、in.bin を fopen して、fclose するプログラム
fopen と fclose 以外は何もしないことに注意。つまりほとんど何もしないプログラ
ム。


6-1) さらに動作の様子を表示するプログラム

fopen 字には fope:in.bin
fclose 時には fclose:in.bin と表示する。

動作の表示をするだけで、それ以外、何も変わらないことに注意。
難しく考えすぎないこと

7) 実行時に第1,2引数を与えられたらそれを fopen して fclose するプログラム
a.out in.bin out.bin

fopen:in.bin
fclose:in.bin
fopen:out.bin
fclose:out.bin


と表示しながら fopen/fclose するプログラム。
fopen と fclose 以外は何もしないことに注意。つまりほとんど何もしないプログラ
ム。

8) 実行時に第1,2引数を与えられたら
第1引数を 72x34 のグレースケールのデータ(いままでの out.bin)
第2引数を gimp でよめる RGB の raw データに”変換”するプログラム。

cp コマンドに似ている動きをする
例えば
a.out in.bin out-rgb.bin
としたら out-rgb.bin を作るプログラム。できたデータ out-rgb.bin は
in.bin を元にした RGB の raw データとなる。

9) 8) の逆をするプログラム。
第1引数を gimp でよめる RGB の raw データ
第2引数を 72x34 のグレースケールのデータ(いままでの out.bin)
に”変換”するプログラム。

10) 実行時に第1,2引数を与えられたら
第1引数を 72x34 のグレースケールのデータ(いままでの out.bin)
これに四角を書きくわえ(rect 関数で書き加える)
第2引数を 72x34 のグレースケールのデータ(いままでの out.bin)
に”出力”するプログラム。

11) シェルプログラムを使い上記コマンドを組み合わせて実行して
与えられた第1引数を gimp でよめる RGB の raw データ

これに四角を書きくわえ

第2引数を gimp でよめる RGB の raw データに”書き加え出力”するプログラ
ム。

シェルプログラムを使うところに注意。
すべてのプログラム名がa.out だと大変混乱する。工夫が必要。

12) ところどころで、改善点をあげる。

コメント

ついに社長の私、決断。バイナリアンへの道を具体的に指示。C 初心者の高橋君に argc, argv のプログラムを指示します。ポインタの理解もままならないのにこれを乗り越えられるのでしょうか?

新人:高橋君 日報 7/1(Fri) 18:43

作業報告します

今日行ったこと
 ー"Unix/linuxコマンドの使い方"を322ページ中172-181まで読み進める
 ー"やさしいC++"を81-97まで読み進める

 ー引数の数を返すプログラムの作成
 ー引数を表示するプログラムの作成
 ー第一引数を分解し、文字として、数字として表示するプログラムの作成

今後のtodo
 ー"Unix/linuxコマンドの使い方"を読み進める
 ー"やさしいC++"を読み進める
 ー"新C言語入門"を読む
 
 ー実行時に第1引数を与えたらそれをfopen,fcloseするプログラムの作成
 ー実行時に第1引数、第2引数を与えることでグレイスケールデータを操作するプログラムの作成

コメント

どうしたか覚えてないけど、argc, argv を教えたのかもしれない。し、独学せよ!!と突き放したのかもしれない。とにかく、引数の数を返すプログラムは出来た。
この時点で彼は、文字列と文字とアスキーコードと数字が混乱したままプログラムを書いている。
逆にいうと、数学はこの手の文字のコード化の理解に役に立たなかった。
そして、ポインタの理解をするために「新C言語入門」を来週から読むように指示する。
来週は fopen/fclose の理解。

がんばれ、新人:高橋君。