Edited at

仮説・検証(52)プログラミング言語教育のXYZ

この資料は、下記のyoutubeにあげた資料の補足資料です。

名古屋Reject会議 2011

https://www.youtube.com/watch?v=He1_tg4px-w&t=489s


目次


  1. あなたはどうやって言語を覚えましたか

    2.1 母語方式

    2.2 外来語方式


  2. 言語教育の課題

    2.2 状態

    2.1 技能(skill)


  3. 言語

    3.1 アセンブラ

    3.2 Fortran

    3.3 COBOL

    3.4 C

    3.5 JAVA

    3.6 PHP

    3.7 Verilog HDL

    3.8 UML

    3.9 Event-B

    3.10 SPIN

    3.11 coq

    3.12 uppaal

    3.13 alloy

    3.14 LaTeX

    3.15 python

    3.16 R

    4 エディタ

    4.1 VZエディタ

    4.2 Mule(Emacs)

    4.3 Eclipse


  4. 設計指針

    5.1 万能指針(universal design)

    5.2 形の設計指針


  5. 作業

    6.1 HAZOP

    6.2 見直し(review)

    6.3 作業診断(process assessment)

    6.4 検索


  6. 動画

    8.参考文献



1.あなたはどうやって言語を覚えましたか

この資料は、名古屋Reject会議の発表を元に、プログラミング言語を覚えるためのいくつかの材料を用意することです。

ABCが入門だとすれば、XYZは技術の最高峰を収める最後の詰めについてを述べようと企画したものです。

発表はグダグダでしたが、現在岐阜大学にいる今井圭吾さんの、適宜説明や突っ込みが絶妙でした。色々補足してくださった。なんとか内容は若いプログラマには伝わったようです。

参加者の大半は20代。

プログラマではない方には、いつものように何を言っているかわからないという、すごい褒め言葉を頂いています。


1.1 母語方式

なんども何度も繰り返し言語を使うことにより、徐々に使えるようになる。


写経

新しい言語を覚えるときは、まず10冊その言語のプログラムを入力する

- OSの版、言語の版による違い

- 日本語のコード、フォントへの対応の違い

- ネットワーク、データベースへの対応の違い

- ライブラリの違い

などなど、いろいろな違いが分かり、自分に必要な機能は何かが掴める。


1.2外来語方式

母語との対比で、同意語、構造、文法などを理解する。

- 言語仕様

- 文法検査(syntax checker)等道具類の作成

- 検査・証明の記述


2.言語教育の課題


2.1状態

言語は覚えても書けない

役に立つモデルが書けない

何を検証、証明すればいいかわからない


2.2 技能(skill)

スキル表が大きくて最初は入力できても保守できない

本当に必要な能力はなんですか


3.言語


3.1アセンブラ

VZエディタのN5200版の移植

https://qiita.com/kaizen_nagoya/items/5551be98dcbed8f41949


3.2Fortran

連立微分方程式のPade近似解法 Fortran手による最適化とコンパイラの最適化、誤差の評価

https://qiita.com/kaizen_nagoya/items/c55d29f0d7e9ebd07a31


3.3 COBOL

事務処理ではCOBOL。簡易言語という、COBOLよりも行数が短く記述できる、検索、編集、出力用の言語を併用していました。


3.4 C

OBJのシンタックスチェッカの試作, ソフトウェアシンポジウム1992,長野

SEA MAIL Vol7. No.1, 1992に渡邊雄一氏が「時間の制約もあっていずれの話題もの今一つ理解できなかった。やはり苦心談というものは、発表しきれない部分を、予稿集にもっと”くどくど”と書いて欲しかった。」と書かれている。ちなみに電総研には3ヶ月滞在。

1)C言語の拡張の仕様を再設計, 2)8086のディスアセンブラの仕様の記述 3) objのシンタックスチェッカの3つの内容の紹介。

1)はC++のexceptionとは異なる実装例。

2)

「項書き換え機能付きプログラム」のディスアセンブラの作成

https://qiita.com/kaizen_nagoya/items/8b8fe645b06bc7eccefb

3)はOBJの言語仕様の対称性がないことの指摘のみで、解決策は提示していない。どれも苦心したことではなく、困ったことを解決しただけで苦心はしていない。困ったことの共感が得られない人には何を説明しても無駄だと悟った時だった。

共著者が、「3ヶ月の滞在でこれだけの仕事をしたのは稀だ」とおっしゃった途端に質問がなくなったのはなんだったんだろう。それを報告して欲しかった。プログラマのすれ違い例@26年前。


表題は当初、「OBJ言語の非対称性」だった。言いたいのはそれだけ。言語の非対称性は今でもEvent-Bの記述の際に、モデル設計の対称性・非対称性をどう設計するかで迷いが生じる事象と相似。まだ解決していない問題。解決していないのだから苦心はしていない。苦心談は解決してから。

TOPPERS オープンソースのMISRA C対応。

https://researchmap.jp/kaizen/MISRA-C愛好会/

組込み開発者におくるMISRA‐C:2004―C言語利用の高信頼化ガイド,MISRA‐C研究会, 日本規格協会, 2006

https://www.amazon.co.jp/dp/4542503461/

[C][C++]の国際規格案の例題をコンパイルするときの課題7つ。

https://qiita.com/kaizen_nagoya/items/5f4b155030259497c4de

C Puzzle Bookの有り難み5つ、C言語規格及びCコンパイラの特性を認識

https://qiita.com/kaizen_nagoya/items/d89a48c1536a02ecdec9

MISRA C まとめ #include

https://qiita.com/kaizen_nagoya/items/f1a79a7cbd281607c7c9

どうやって MISRA Example Suiteをコンパイルするか

https://qiita.com/kaizen_nagoya/items/fbdbff5ff696e2ca7f00

MISRA-C 2012 Referenceに掲載している文献の入手可能性を確認

https://qiita.com/kaizen_nagoya/items/96dc8b125e462d5575bb

C言語(C++)に対する誤解、曲解、無理解、爽快。

https://qiita.com/kaizen_nagoya/items/3f3992c9722c1cee2e3a


3.5 JAVA

「基礎からわかるTCP/IP JAVAネットワークプログラミング」Eclipseでコンパイル。Wiresharkでデバッグ。

https://qiita.com/kaizen_nagoya/items/14519536b827fdadb32e

第二章JAVAによるネットワークプログラミング phttpd 三箇所でException収集

https://qiita.com/kaizen_nagoya/items/d1db78d3db0e90c0ff9f

大川知、鈴木大郎 著「コンパイラ 言語処理系の基礎からyacc/lexまで」近代科学社(2008)のソースをMacintoshで実行(java版)

https://qiita.com/kaizen_nagoya/items/1606e97b7f10bf8fe519

Macintosh OS Xにbrew caskでEclipseを導入する(5つの壁+1)

https://qiita.com/kaizen_nagoya/items/b17f03db00aceee41a80

インド、インドネシアとJava、Javascript:接尾辞がついて別物と言うが共通点は多い。

https://qiita.com/kaizen_nagoya/items/2c331ff6654d41d5e157

 


3.6 PHP

WEB, DB等


3.7 Verilog HDL

RTL設計スタイルガイド Verilog HDL編(System Verilog対応版)

https://qiita.com/kaizen_nagoya/items/4c02f1575db1f28310a7

RTL設計スタイルガイド Verilog HDL編―LSI設計の基本,2011

https://bookway.jp/modules/zox/index.php?main_page=product_info&products_id=809

PDF 3758円, 中古で過大な値付に注意。


3.8 UML

UMLモデリング入門,児玉 公信, 2008, ISBN 978-4822283582

https://www.amazon.co.jp/dp/4822283585/


3.9 Event-B

http://www.event-b.org/A_errata.pdf


3.10 SPIN(Simple Promela(Process Meta Language) interpreter)

SPIN(simple promela interpreter)入門

https://qiita.com/kaizen_nagoya/items/a18a4e1e5493591e76fa

4日で学ぶモデル検査 (初級編) (CVS教程 (1))

産業技術総合研究所システム検証研究センター, 2006

https://www.amazon.co.jp/dp/4860431197/


3.11 coq

「coq入門」の入門

https://qiita.com/kaizen_nagoya/items/13566f0b2083ea8d4998

MacintoshでCoqide

https://qiita.com/kaizen_nagoya/items/0314ca15130bdfa9dce2


3.12 uppaal

http://www.zipc.com/product/uppaal/


3.13 alloy

alloy analyzer入門

https://qiita.com/kaizen_nagoya/items/b7928e2b8e80b9b00498

サンプルで学ぶAlloy, 斉藤直希

https://www.slideshare.net/NSaitoNmiri/alloy-42500369


3.14 python

「Python 入門」の入門

https://qiita.com/kaizen_nagoya/items/22c99c5926984ede6573

Windows(MS)にPython(Anaconda)を導入する(5つの罠)

https://qiita.com/kaizen_nagoya/items/7bfd7ecdc4e8edcbd679


3.15 R

R(データマイニング入門) Raspbian(Raspberry PI),Mac OSX, docker/ubuntu 6段階。データ取得・導入・起動・実行・描画・一括実行。

https://qiita.com/kaizen_nagoya/items/e8417310129c2425af59


3.16 LaTeX

確率論及統計論(伏見康司)の数式をTeX(LaTeX)入力するための13の技法

https://qiita.com/kaizen_nagoya/items/9c692c4d3546ffbb70b4


4 エディタ


4.1 VZエディタ

VZエディタ移植に当たって実施したことと成果

https://qiita.com/kaizen_nagoya/items/5551be98dcbed8f41949

VZ倶楽部, ビレッジセンター, 1991

https://researchmap.jp/joaglnxz8-50024/


4.2 Mule(Emacs)

マルチリンガル環境の実現―X Window/Wnn/Mule/WWWブラウザでの多国語環境, 錦見美貴子,‎ 戸村哲,‎ 桑理聖二,‎ 吉田智子,

プレンティスホール出版,1996, ISBN 978-4887350205

https://www.amazon.co.jp/dp/4887350201


4.3 Eclipse

Macintosh OS XにEclipseを導入する(5つの壁+1)

https://qiita.com/kaizen_nagoya/items/b17f03db00aceee41a80


5. 設計

https://qiita.com/kaizen_nagoya/items/34daa0403eaca5e8b5a6


5.1 万能設計(universal design)

万能設計.png


5.2 形の設計指針

万能.png


6.作業


6.1 HAZOP

効率的なHAZOPの進め方

https://qiita.com/kaizen_nagoya/items/2b8eae196945b7976446

ちょけねこ たんじょうびのおくりもの 

https://qiita.com/kaizen_nagoya/items/fc9675686c229f7a155e

https://www.slideshare.net/kaizenjapan/hazop-safety-and-security-at-fukui-201712

狙い通り2.png


6.2 見直し(review)

算譜(program)の見直し(review)に必要な志向・技能・技法・手順、上位7

https://qiita.com/kaizen_nagoya/items/6d5962e1a0e4be28405c


視点

視点.png


6.3 作業診断(process assessment)

作業診断(process assessment)を成功させる5つの鍵。失敗する5つの罠

https://qiita.com/kaizen_nagoya/items/bcdc60db20e8d7081fab


6.4 検索

プログラマに必須な検索技法

https://qiita.com/kaizen_nagoya/items/8ee1f5e241e2aee39f5c


7 動画

名古屋Reject会議 2011

https://www.facebook.com/kaizen.nagoya/videos/142012459202158/


8.参考文献

組込みシステム開発事例集, 産業技術連携推進会議情報電子部会組込み技術研究会, 工業調査会, 2006,ISBN 978-4769351313

https://www.amazon.co.jp/dp/4769351313/

プロセス改善ナビゲーションガイド ベストプラクティス編, IPA, 2008, https://www.amazon.co.jp/dp/4274501752/

SWEST4

https://swest.toppers.jp/SWEST4/report.html#program

組込みソフトウェア開発技術者教育

における議論に基づいています。


MISRA C断片コンパイル用ヘッダ


misra_c.h

/* Author, (c) Dr. Ogawa Kiyoshi*/

/* ver 1.0 January 1, 1999 */
/* ver 2.0 Feburary 2, 2005 */
/* ver 3.0 March 3, 2013 */
/* @kaizen_nagoya, researchmap.jp/kaizen/MISRA-C/ */
/* Purpose: macro, definition and/or information to MISRA-C Examples.*/
/* https://gcc.gnu.org/onlinedocs/gcc/Standards.html */
/* https://gcc.gnu.org/c99status.html */
/* http://www.polyomino.org.uk/computer/c/ */
#ifndef __MISRA_C__
#define __MISRA_C__

#include <float.h>
#include <iso646.h>
#include <limits.h>
#include <stdarg.h>
#include <stdbool.h>
/* define true */
#include <stddef.h>
/* define NULL */
#include <stdint.h>
/* C99: define int16_t */

#ifdef __STDC_VERSION__
#include <stdalign.h>
#include <stdnoreturn.h>
#endif

#include <stdio.h>
// #include <sys/types.h>
typedef bool bool_t;
typedef float float32_t; /* dir4.6 */
typedef long double float64_t; /* dir4.6 */

#ifdef nofreestanding
#include <string.h>
#include <stdlib.h>
#endif

#ifndef DIR4_6
#ifndef __STDC_VERSION__

typedef char char_t;
typedef unsigned char uint8_t; /* dir4.6 */
typedef unsigned short uint16_t; /* dir4.6 */
/*typedef unsigned long uint32_t;*/ /* dir4.6 */
typedef unsigned long long uint64_t; /* dir4.6 */
typedef unsigned long long uint128_t;

typedef signed char int8_t; /* dir4.6 */
typedef signed short int16_t; /* dir4.6 */
/* typedef signed long int32_t; *//* dir4.6 */
typedef signed long long int64_t; /* dir4.6 */
typedef signed long long int128_t;

typedef float float32_t; /* dir4.6 */
typedef long double float64_t; /* dir4.6 */
typedef long double float128_t; /*dir4.6 */
#endif
#endif

#ifndef NC30 /* without renesas NC30WA, manual C.3.3 predefined macro */
#define __ISO_IEC_9899_1999__
#define __int32bit__
#define PR1x(a,b) (void)printf(" "#a " = %" #b "=%x\n", a,a)
#define PR2x(a,b,c) (void)printf(" "#a " = %" #c "=%x \n " #b " = %" #c "=%x\n", a,a,b,b)
#define PR3x(a,b,c,d) PR1x(a,d),PR2x(b,c,d);

#define PR1(a,b) (void)printf(" "#a " = %" #b "\n", a)
#define PR2(a,b,c) (void)printf(" "#a " = %" #c "\n " #b " = %" #c "\n", a, b)
#define PR3(a,b,c,d) PR1(a,d),PR2(b,c,d);

#else /* for renesas NC30W only */
#define __ISO_IEC_9899_1990__
#define __int16bit__
#define PR1(a,b)
#define PR2(a,b,c)
#define PR3(a,b,c,d)
#endif
/*__STANDARD_IO__ */

#ifdef __ISO_IEC_9899_2011__
#include <stdarg.h>
#include <stdint.h>
#define PRSV() printf("ISO/IEC 9899:2011\n")
#elseif __ISO_IEC_9899_1999__
#include <stdarg.h>
#include <stdint.h>
#define PRSV() printf("ISO/IEC 9899:1999"\n)
#elseif __ISO_IEC_9899_1990__
/* #include <stdint.h> */ /*nc30wa is not supported */
typedef _bool bool_t;
typedef signed char int8_t;
typedef signed short int16_t;
typedef signed int int32_t;
typedef signed long int64_t;
typedef signed long long int128_t;
typedef unsigned char uint8_t;
typedef unsigned short uint16_t;
typedef unsigned int uint32_t;
typedef unsigned long uint64_t;
typedef unsigned long long uint128_t;
typedef float float32_t;
typedef double float64_t;
typedef long double float128_t;
/* macro using printf debug or not.*/
#define PRSV() printf("ISO/IEC 9899:1990\n")
#elseif __int16bit__
typedef unsigned short uint16_t;
typedef unsigned long uint32_t;
typedef unsigned long uint64_t;
typedef unsigned long uint128_t;
#define PRSV() printf("no ISO/IEC 9899,16bit\n")
#else
/* typedef unsigned long long uint128_t;*/
#define PRSV() printf("no ISO/IEC 9899,32bit\n")
#endif

/* for each example*/

#ifdef DIR4_8
typedef struct OpaqueType *pOpaqueType;

pOpaqueType GetObject(void);
void UseObject(pOpaqueType);
#endif

#ifdef __MISRAC_6_6__
void f (uint16_t *p){
printf("uint16_t *p = %d, p = %d\n",*p,(int)p);
}
#endif /*__MISRAC_6_6__ */

#ifdef __MISRAC_6_9__
//typedef signed char int8_t;
//typedef signed short int16_t;
//typedef signed int int32_t;

#ifndef _INT64_T
#define _INT64_T
typedef signed long int64_t;
#endif

#ifndef _bool
typedef unsigned int _bool;
#endif

#endif

#ifdef __MISRAC_DIR_4_1__
#include <string.h>
#include <stdbool.h>
typedef float float32_t;
#endif

#ifdef DIR4_13
typedef struct mutex mutex_t;

struct mutex
{
unsigned int number;
unsigned char* name;
}mutex;

mutex_t n;

mutex_t mutex_lock (void)
{
return n;
}
void mutex_unlock (mutex_t m)
{
m.number = 0;
m.name = (unsigned char *)"";
return;
}

int16_t x;

#endif

#ifdef __MISRAC_RULE_1_1__
#define __zpage // zero page, 0x0000
#define __near // short address
#define __far // full address
#define zpage __zpage

int i = 1;

#endif

#ifdef R2_1

int error_handler (void){
return true;
}

#endif

#ifdef __MISRAC_RULE_2_2__
volatile uint16_t v=1;
char a[]={"123456789ABCDEF"};
char *p=a;
#endif

#ifdef __MISRAC_RULE_3_2__
bool_t b=0;
#endif

#ifdef __MISRAC_RULE_5_1__
int32_t ABC = 1;
#endif

#ifdef __MISRAC_RULE_5_2__
int32_t engine_exhaust_gas_temperature_raw=0;
#endif

#ifdef __MISRAC_RULE_5_3__
struct astruct{
int16_t m;
};

void g (struct astruct *p){printf("struct astruct *p->m = %d\n",p->m);}
#endif

#ifdef __MISRAC_RULE_5_8__
extern void foo (void);
#endif

#ifdef __MISRAC_RULE_5_9__
extern void bar1(void) ;
extern void bar2(void);
#endif

#ifdef __MISRAC_RULE_7_1__
uint16_t code[ 10 ];
#endif

#ifdef __MISRAC_RULE_7_4__
void f1 (char * s1){
PR1(s1,s);
}
void f2(const char *s2){
PR1(s2,s);
}
#endif

#ifdef __MISRAC_RULE_8_1__
xn = 0;
int16_t xc = 1;
fn(void){
return printf("fn(void);\n");
}
int16_t fc(void){
return printf("int16_t fc(void);\n");
}
void gn(char c, const k){
PR2(c,k,d);
}
void gc(char c, const int16_t k){
PR2(c,k,d);
}
#endif

#ifdef __MISRAC_RULE_8_2__

#endif

#ifdef R8_4
extern uint16_t var1; // 宣言
extern void func1( uint16_t var1 );
extern void func2( uint16_t var1 );
#endif

#ifdef __MISRAC_RULE_8_4__
extern int16_t count;

extern void func1 (void);
extern void func2 (int16_t x, int16_t y);
extern void func3 (int16_t x, int16_t y);

#endif

#ifdef __MISRAC_RULE_8_5__
extern int16_t a;
#endif

#ifdef __MISRAC_RULE_8_6__
void f1(void);
void f2(void);
#endif

#ifdef __MISRAC_RULE_8_11__
int32_t array1[10]={0,1,2,3,4,5,6,7,8,9};
int32_t array2[]={9,8,7,6,5,4,3,2,1,0};
#endif

#ifdef __MISRAC_RULE_8_13__
char last_char (const char * const s);
// uint16_t first( const uint16_t a[5]);
#endif

#ifdef __MISRAC_8_14__
volatile bool_t b=true;
struct s{
uint16_t count;
uint16_t a[ 10 ];
};
struct s sps = {
0,
{0,1,2,3,4,5,6,7,8,9}
};
struct s * sp;
char *p="Control Statement Expressions\n";
#endif

#ifdef R11_1
void f(int16_t n){
// printf("%d\n",n);
}
#endif

#ifdef __MISRAC_RULE_11_1__
void f(int16_t n){
PR1(n,d);
}
#endif

#ifdef R11_2
void f(int16_t n){
// printf("%d\n",n);
}
#endif

#ifdef R11_3
uint32_t read_value ( void ){
return true;
}
void print ( uint32_t n ){
PR1(n,d);
}
#endif

#ifdef __MISRAC_RULE_11_3__
uint32_t read_value ( void ){
return true;
}
void print ( uint32_t n ){
PR1(n,d);
}
#endif

#ifdef R11_4
void print ( uint16_t n ){
PR1(n,d);
}
#endif

#ifdef __MISRAC_RULE_11_9__
void f ( uint8_t *p ){
if (NULL == p){
PR1(NULL,d);
} else {
PR2(*p,NULL,d);
}
}
#endif

#ifdef __MISRAC_RULE_12_1__
int8_t f(int8_t a, int8_t b){
return a+b;
}
#endif

#ifdef __MISRAC_RULE_12_3__
void f(int8_t a, int8_t b){
PR2(a,b,d);
}
#endif

#ifdef __MISRAC_RULE_13_1__
void p ( uint16_t a[ 2 ] ){
PR2(a[0],a[1],d);
}
#endif

#ifdef __MISRAC_RULE_13_2__

#endif

#ifdef R14_1
uint32_t read_u32(void){
static uint32_t i = 14;
return --i;
}
float32_t read_float32(void){
static float32_t f = 0;
return ++f;
}
#endif

#ifdef __MISRAC_RULE_14_4__
bool_t flag= true;
#endif

#ifdef __MISRAC_RULE_17_3__
double power (double d, int n){
return (double)d*n;
}
#endif

#ifdef R17_6
#define TEN 10U
uint16_t v1[TEN]={0,1,2,3,4,5,6,7,8,9};
uint16_t v2[TEN+TEN]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20};
uint16_t v3[TEN+TEN+TEN]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30};

uint16_t t2(uint16_t n, uint16_t a[20]) {
uint16_t i;
uint16_t sum=0U;
for(i = 0U; i < n; ++i){
sum = sum + a[i];
}
return sum;
}
uint16_t t(uint16_t n, uint16_t a[]) {
uint16_t i;
uint16_t sum=0U;
for(i = 0U; i < n; ++i){
sum = sum + a[i];
}
return sum;
}
#endif

#ifdef __MISRAC_RULE_17_6__
uint16_t v1[10]={0,1,2,3,4,5,6,7,8,9};
uint16_t v2[20]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20};
#endif

#ifdef __MISRAC_C_2_1_
#ifndef __STANDARD_IO__
/* without renesas NC30W */
#define PR(a,b,c,d,e) printf("%" #a " + %" #a "= %" #a ", %" #b "\n", c, d, c + d, e)
#define PRC(a,b,c,d,e,f) printf("%" #a" + %" #a " = %" #a ", %" #b "\n", c, d, (f) c + d, e)
#define PRT(a,b,c,d,e,f) PR(a,b, c, d, e); e = c + d;PR(a,b, c, d, e); e = (f) c + d;
/*printf(#e"= %llu ",e)*/;PRC(a,a, c, d, e, f);PRC(a,b, c, d, e, f)
#else
/* for renesas NC30W only */
#define PR(a,b,c,d,e)
#define PRC(a,b,c,d,e,f)
#define PRT(a,b,c,d,e,f)
#endif
/*__STANDARD_IO__ */
#endif
/* __MISRAC_C_2_1_ */

#endif /* __MISRAC__ */



参考文献

ぼくのかんがえた さいきょうの新人研修

https://qiita.com/aosho235/items/23625cdb340eaaeb5b94

新人教育の際に気をつけたこと

https://qiita.com/yu-croco/items/c41aa79a87fdbcf418fb

Qiitaで組立語(assembler)・機械語(machine language)・CPU<アセンブラへの道>

https://qiita.com/kaizen_nagoya/items/46f2333c2647b0e692b2

C言語(C++)に対する誤解、曲解、無理解、爽快。

https://qiita.com/kaizen_nagoya/items/3f3992c9722c1cee2e3a

量子コンピュータプログラムへの道

https://qiita.com/kaizen_nagoya/items/37c90488c87bbe9f2d71

<この項は順次追記しています。>


文書履歴(document history)

ver. 1.00 初稿 20180206

ver. 1.01 項目追加 20180304

ver. 1.02 URL追加 20180325

ver. 1.03 C言語URL追記 20180329

ver. 1.04 参考文献追記 20180716

ver. 1.05 タグ変更 20180801

ver. 1.06 はてな追記 20190509

このエントリーをはてなブックマークに追加

http://b.hatena.ne.jp/guide/bbutton