BNN-PYNQ をリビルドする

Linux では簡単

tkat0.hateblo.jp
方法はこちらが詳しい。

Windows ではコンパイル時にエラー

これはどうも clang の 4.5.2(?) のバグらしい。(clang のバージョンなのか g++ のバージョンなのか不明)

c++ - Clang on Cygwin with C++11 - Stack Overflow

これによると、4.7.2 をつかえとなっている。どうやら clang はヘッダーなどを g++ から拝借してきているようだ。g++ の構文では通るが clang では通らないという記述があるらしい。でも、ちゃんと type_info という定義はある。
で、4.7.2 を見てみると、、、どちらでも通る記述に変更されている。

diff exception_ptr.h*
132c132
<       const class type_info*
---
>       const type_info*

これ単純に class ってつけ足せばいいのでは、、、、ビンゴ!!コンパイルが通るようになる。そしてまたエラー。

throw_with_nested という関数が2度定義されていて、どちらにも = 0 で初期値をいれている。これ、2回目の定義の時は初期値を入れてはだめなのでは?

> diff nested_exception.h*
122c122
<     __throw_with_nested(_Ex&& __ex, const nested_exception*)
---
>     __throw_with_nested(_Ex&& __ex, const nested_exception* = 0)

ビンゴ!!エラーがなくなる。これでとりあえずこの問題解決。Vivado HLS の最近のバージョンでも同じ問題が残っているので、いちいちぜんぶに変更しないといけない(もちろん自己責任で)

c:/Xilinx/Vivado_HLS/2016.2/win64/tools/clang/include/c++/4.5.2

とにかくこうすると、うまくいく。

シェルプロで作られているよ

なんだかしらんが、シェルプロで作るようになっている。なので、非常にめんどくさい。なんで tcl で共通化しないんだよ。Linux 文化オンリー?
しかたがないのでシェルプロを見ながらつくりなおし。っていうか Vivado HLS はさっきの修正でうまくいく。問題は Vivado の方。
Vivado HLS でつくった BlackBox Jam なる IP を Vivado にいれこむ。これ、単純にいれて自動配線に任せてよさそう。で、どういうわけか、合成と実装のオプションを変えている。タイミングがメットしなかったんだねきっと。

set_property strategy Flow_PerfOptimized_high [get_runs synth_1]

set_property STEPS.SYNTH_DESIGN.ARGS.DIRECTIVE AlternateRoutability [get_runs synth_1]
set_property STEPS.SYNTH_DESIGN.ARGS.RETIMING true [get_runs synth_1]

set_property strategy Performance_ExtraTimingOpt [get_runs impl_1]
set_property STEPS.OPT_DESIGN.ARGS.DIRECTIVE Explore [get_runs impl_1]
set_property STEPS.POST_ROUTE_PHYS_OPT_DESIGN.ARGS.DIRECTIVE AggressiveExplore [get_runs impl_1]
set_property STEPS.PHYS_OPT_DESIGN.ARGS.DIRECTIVE AggressiveExplore [get_runs impl_1]
set_property STEPS.POST_ROUTE_PHYS_OPT_DESIGN.IS_ENABLED true [get_runs impl_1]

よくこんな設定見つけたな、、、、とおもいつつ、、、GUI からその通りに修正。(しゅうせいしなくてもいけるのか?誰か人柱)

とりあえず、合成もできたし、自分のデザインに入れ込むこともできた。

f:id:ryos36:20170909232858p:plain

ただし、これ、使い方がよくわからない。

BNN-PYNQ をリビルドする

type_info の unknown type name

error: unknown type name 'type_info'
const type_info*

https://forums.xilinx.com/t5/High-Level-Synthesis-HLS/Building-Xilinx-Binary-Neural-Network-in-HLS-Error-on-Windows/td-p/757041
https://github.com/jingpu/Halide-HLS/issues/5

https://stackoverflow.com/questions/12938663/clang-on-cygwin-with-c11

diff exception_ptr.h*
132c132
<       const class type_info*
---
>       const type_info*
diff nested_exception.h*
122c122
<     __throw_with_nested(_Ex&& __ex, const nested_exception*)
---
>     __throw_with_nested(_Ex&& __ex, const nested_exception* = 0)


qiita.com

github.com

tkat0.hateblo.jp

とりあえず Ubuntu をアップグレード

手元の VMWare 上の Ubuntu が 14.04 だったので、16.04 にしてみた。が、upgrade しようとすると、

The required dependency 'apt (>= 1.0.1ubuntu2.13)' is not installed.

だと。apt が古いのか?

14.04 --> 16.04 failed; apt (>= 1.0.1ubuntu2.13)' is not installed - Ask Ubuntu

をみると

sudo apt update
sudo apt dist-upgrade

したあとに、

sudo do-release-upgrade

すればいいみたい。このあと、SDSoC 2016.4 を入れる予定。やれやれ。

新人をバイナリアンに育てる ~ その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 とか関数名を言われてもすぐにプログラミングは出来ません。
がんばれ!!