星野歯科駒沢クリニック
HOSHINO DENTAL KOMAZAWA CLINIC
$$(AND制御演算子)
プログラミング && 歯科治療
左項のコマンドが成功した時、右項のコマンドを実行する。左項のコマンドが失敗した時は、右項のコマンドを実行しない。
if(分岐制御条件式)
&&をif文で書き直すと
if プログラミング then 歯科治療 fi
ワンライナーのコマンドにすると
if プログラミング; then 歯科治療; fi
論理的思考法とは、物事を順序立てて考え、計画的に目的を実行できる事、問題解決力を向上させる思考法。プログラミング教育の目的として、安易な即応的思考ではなく、知識・経験から論理的に考え判断する事を学ぶ。又、目的の解決法は一つではない事も学ぶ。逆に論理的ではない思考を簡単に言うと、「分からないから、面倒だから、これでいいや」と物事を直ぐに対応してしまう事。安易なその場しのぎな対応の事。
もし歯科医が論理的ではない思考で治療をすると、どうなってしまうのか?治療の失敗につながります。
患者さんがより良い治療を受けるためには、医療設備・歯科医のスキルは必要条件として当然です。他に隠れた条件もあります。それは実益がある問題解決力です。治療に問題が生じた場合に、適切かつ正確に判断できているのか。これは治療で非常に重要な事になるでしょう。一本の歯の治療でも問題解決力は必要ですが、一口腔単位の治療(矯正治療など)は、期間も長く、審美と機能の両立を考えるなど問題解決力が重要となります。
患者さんが「歯科医の思考判断力が優れているのか判断する」のは難しいと思います。しかし最近では、「プログラミング的思考を学ぶという事が、問題解決力を養うのに役立っている」という事が分かってきました。患者さんの状態は個人差があり、条件が異なるため、問題解決のプロセスが見えてくるまで熟考し、安易な治療が行われないようにするべきです。
歯科医が論理的思考の上で、専門知識を最大限に活かせる事が、より良い治療につながると思います。
1.プログラミング言語
プログラミング言語は数多く存在します。例えばFORTRAN,C言語,C++,C#,JavaScript,Ruby,PHP,VBA,Bash,Swift,GO,Assembly,Python,SQL,Perl などがあります。
その言語の規則に基づいた形式で、プログラムを記述し、コンピュータに処理を指示します。
2.言語処理系
プログラミング言語で書かれたテキストファイル(ソースコード)を動かすには、処理系というプログラムが必要です。
コンパイル言語
Compile(コンパイル)とは、ソースコードを実行可能ファイルに変換する事。実行可能ファイルとは、コンピュータが直接実行できるバイナリーコード(機械語命令列)。ソースコードでは動かないので、コンパイルをして実行可能ファイルに変換して実行します。
C言語など
インタプリタ言語
コンパイルは必要なく、インタプリタによって内部形式に変換され実行されます。スクリプト言語とも呼ばれています。
Bash,Pythonなど
3.ノイマン型コンピュータ
現在のコンピュータは、フォン・ノイマンが提唱した「ノイマン型」と呼ばれる構造になっています。ノイマン型コンピュータとは、演算装置・制御装置
・記憶装置・入力装置・出力装置で構成されています。プログラムは、記憶装置に格納されてから実行されます。
4.GUI/CUI
GUI(グラフィカル・ユーザ・インタフェース)
ウインドウ、アイコンなどをマウスで操作する。
CUI(キャラクタ・ユーザ・インタフェース)
キーボードから文字(コマンド)を入力して操作する。別名 CLI(コマンドライン・インタフェース)
5.文字コードと符号化方式
文字コードの基本は、ASCII(英文字)です。日本語ではJISコード、全世界の文字を集めたUnicodeがあります。
・ASCII
・JIS
・Unicode
文字とビット組み合わせの対応規則(文字コード)を定義して、符号化方式を用いて利用します。
・Shift_JIS
・EUC-JP
・UTF-8
1.文字コード
① ASCII
・米国標準コード
・英数字、記号、制御文字
・1バイトコード(7ビット)
② ASCII各国版
・ISO/IEC 646
・JIS X 0201
・カタカナ(半角)
・1バイトコード(8ビット)
③ ASCII拡張版
・ISO/IEC 2022
・JIS X 0208
・漢字、カタカナ、平仮名(全角)
・2バイトコード(7,8ビット)
・JIS X 0213
・JIS X 0208拡張版
・JIS 2000,JIS 2004
④ Unicode
・国際符号化文字集合(UCS)
・ISO/IEC 10646
・JIS X 0221
・マルチバイト
※ ISO(国際規格) JIS(日本規格)
2.符号化方式
1バイトコードのASCII、JIS X 0201は、2バイトコードのJIS X 0208と併用する符号化方式で、Shift_JIS、EUC-JPがあります。Unicodeは UTF-8、UTF-16、UTF-32があります。
① Shift_JIS
・JIS X 0201 + JIS X 0208
・Windows環境依存文字
・CP932
・Windows-31J
・MS932
・2バイトコード(8ビットコード)
② EUC-JP
・ASCII + JIS X 0208
・Extended Unix Code
・2バイトコード(8ビットコード)
③ UTF-8
・8ビット単位、1~4バイトコード
・ASCII互換
1.プログラムの基本構造
・順次処理 (sequential)
・選択処理 (select)
・反復処理 (loop)
順次処理 : プログラムを順番に実行する
選択処理 : 条件によって処理内容を変える
反復処理 : 同じ処理を繰り返し実行する
1)プログラムユニット
サブルーチン (subroutine) : モジュール
・ 手続き (procedure) : 動作の実行
・ 関数 (function) : 戻り値生成
サブルーチン基本形
・ 引数
仮引数 : 定義時の引数 (parameter)
実引数 : 呼出し時の引数 (argument)
・ 戻り値 (return value)
実行結果を呼出し元へ返す値
2)プログラムの作成
1.ソースコード (C言語)
2.プリプロセス (preprocessor)
インクルード : include
ヘッダファイル : header file
ライブラリ定義
3.コンパイル (compiler)
CPU固有のアセンブリ言語に変換
① 字句解析 : lexical analyzer
② 構文解析 : parser
③ コード生成 : code generator
4.アセンブル (assembler)
アセンブリ言語を機械語に変換
オブジェクトファイル
5.リンク (linker)
ライブラリ、オブジェクトファイルを結合
ダイナミックリンク (実行時に参照)
6.実行可能プログラム
2.プログラムの実行
プログラムの実行は CPUが行います
CPU : 中央処理装置
・ OSがプログラムをメモリに転送
・ メモリからCPUに転送し、解読をして実行
CPU処理の基本
① Fetch : 命令をレジスタに読み込む
② Decode : レジスタの命令を解読
③ Execute : 演算、制御など命令を実行
CPUの構成
・ 制御装置
・ 演算装置 (ALU)
・ 記憶装置 (レジスタ)
スレッドの生成
・ プログラムを実行 (プロセス生成)
・ プロセス内部でスレッド生成
スレッド : Thread
・ コードを実行する実体
・ 関数、サブルーチンから生成
・ コード、データ、レジスタ値(コンテキスト)
・ スレッドが無いとプロセスのプログラムは実行できない
プロセス : Process
・ メモリに展開された実行中のプログラム
・ スレッドを含むリソースコンテナ
・ リソースはメモリ、ファイルアクセスなどスレッド実行に必要
・ OSが管理する実行中のプログラムの単位
3.CPUアーキテクチャ
設計構想の分類
① RISC : Reduced Instruction Set Computer
縮小命令セット (単純な命令の組み合わせで実行)
② CISC : Complex Instruction Set Computer
複合命令セット (複雑な処理も1つの命令で実行)
命令セット : CPUで使用する命令の集合と動作の規定
CPU基本機能の拡張分類
① x86
・IA-32アーキテクチャ
・CISC
・32 bit
・リトルエンディアン
・i386
② x86_64
・IA-32拡張版
・CISC
・64 bit
・リトルエンディアン
・AMD64
バイトオーダー : メモリのデータ格納方式
① ビッグエンディアン : 0x12, 0x34
② リトルエンディアン : 0x34, 0x12
※ 0x1234 (2バイト以上)
4.データ構造
メモリのデータ配置
Data Structure: C
・変数 : variable
・配列 : array[]
・構造体: struct
1)変数
・データとしてメモリ確保
・型がメモリサイズ決定
・メモリ空間での名前参照
・データ型
int型 : 4バイト(整数型)
char型: 1バイト (整数型/文字型)
・定義(宣言)
int s;
int a,b;
・代入
s = 10;
・初期化(宣言+代入)
int x = 2;
int y = {3};
・文字: character
char x = ‘A’;
2)配列
・連続したメモリ配置
・要素は同じ型
・文字列: char型配列
char x[4] = “ABC”;
char y[4] = {‘A”B”C’,’¥0′};
終了文字=’¥0′: ASCII 0x00(NUL)
・int型
int z[3] = {1,2,3};
・main関数への引数(コマンドライン)
int main(int argc, char *argv[]);
argc: argument count
argv: argument vector
char *argv[]: 配列の先頭要素へのポインタ
(文字列の先頭アドレス)
*argv[] と**argv は同じ
argc: argvの要素数
argv[0], argv[1], argv[2] -> 3
argv[0]: プログラム名
argv[1]: 引数1
argv[2]: 引数2
vector: ベクタ
・複数の文字列を格納するデータ構造
・char *型の配列
・(char *)0が最後の要素
3)構造体
・配列と異なり連続したメモリの配置ではない
・メモリ配置は境界調整のためパディング
・要素は複数の型、複数のデータ
・構造体タグ(型の名前)
struct ABC (struct ABC型)
struct: 構造体宣言(キーワード)
・構造体を格納する変数
struct ABC x;
(struct ABC型の変数x)
・構造体メンバ(データ定義)
struct ABC {}x;
ブロック内でメンバ定義
{int i, char d[5];}
・typedef: 型に別名を付ける
type name(型名)-> define(定義)
typedef struct list list;
struct list -> list
構造体タグ名と型名は名前空間が異なるので同名でも可
・名前空間: C
・変数名、関数名、型名
・構造体タグ名、共用体タグ名
5.プロセスの生成
UNIX/Linux
arch/x86(IA-32,x86_64)
・プログラムを実行 ➝ プロセスの生成
・プロセスはカーネルが管理 プロセスID
・カーネル
OS本体のプログラム
プログラムの実行はカーネルモードで実行
・CPU特権レベルの変更
ユーザモード ➝ カーネルモード
ユーザ空間からシステムコール
・システムコール
OS内部の機能を関数として呼び出す
カーネル空間(メインメモリ)で実行
・カーネル処理へのイベント
① ソフトウェア割り込み (int $0x80)
② システムコール (sysenter, syscall)
③ ハードウェア割り込み
6. Linuxプログラミング
・C言語
・アセンブリ言語
・スクリプト言語
1)C言語
コード ➝ ビルド ➝ 実行
・プログラム ➝ ライブラリ関数 ➝ システムコール
・プログラム ➝ システムコール
・関数
1.System call
・カーネルが提供する関数
・fork, execve, …
2.Library call
・ライブラリに含まれる関数
・execv, execl, …
・戻り値 関数(引数)
・システムコール
1.fork
#include
pid_t fork(void);
・プロセスのコピーを生成
・pid_t 型
符号付整数 (int)
プロセスID
ライブラリ定義データ型
typedef: 型名定義(別名)
・include: ヘッダファイル取り込み
・ヘッダファイル: ライブラリを定義したファイル
2.execve
#include
int execve(const char *path, char *const argv[], char *const envp[]);
・指定プログラムの実行
・実行するプログラムの
path: パス名
argv: 引数(配列)
envp: 環境(配列)
・env: 環境変数の設定
・ライブラリ関数
・execv
・execvp
・execl
・execle
・execlp
#include
・指定プログラムの実行
int execv(const char *path, char *const argv[]);
・execv
path: パス名
argv: 引数(配列)
・exec
v: vector(配列)引数
l: list(リスト)引数
e: env(環境変数)
p: path(検索パス)
2)アセンブリ言語
コード ➝ アセンブル(リンク)➝ 実行
・オペコード、オペランド
・マシン語命令と1対1対応
・システムコール(CPU命令)
x86: sysenter
x64: syscall
3)スクリプト言語
コード ➝ シェル ➝実行
・シェルプログラミング
bash (Linux shell)
・端末エミュレータ ➝ シェル起動
・ユーザ ➝ シェル ➝ カーネル
・shell(シェル)
・interpreter
コマンドインタプリタ
コマンド解釈実行
・interactive
対話的
キーボード入力
・shell script
シェルスクリプト
ファイル入力
・プログラム
シェルコマンド(ビルトイン)
実行ファイル(外部コマンド)
1.shell command
シェル内部コマンド
cd, pwd, export, …
2.executable program
シェル外部コマンド(PATH)
/bin/ls, /usr/bin/cal, …
スクリプトファイル(テキスト➝インタプリタ)
バイナリファイル(C言語➝コンパイル)
・コマンドの判別
type コマンド名
・コマンド実行(構文)
command option argument
コマンド オプション 引数
・シェルスクリプト
コマンドを記述したテキストファイル
・シェルスクリプト実行
① bash(コマンド)の引数
bash ./file.sh
② カレントシェルで実行
. ./file.sh
source ./file.sh
③ 実行ファイル
#!/bin/bash
chmod +x file.sh
./file.sh
3.Shell Script
① command argument
・command: コマンド(実行ファイル)として実行
・argument: 別のコマンドの引数として実行
② shell
・current: シェル変数、環境変数
・sub: シェル変数、環境変数
・child: 環境変数
③ process
・parent: forkを実行したプロセス
・child: forkを実行したプロセスのコピー
④ variable
・local: シェル変数
・environment: 環境変数
⑤ environment
・PATH=$PATH:/パス
・export PATH
・~/.bashrc
・PATH設定なし➝./file.sh
・PATH設定あり➝ file.sh
⑥ .,source
・カレントシェルでファイル読み込み
⑦ file permission
・chmod +x 実行許可
・実行ファイル
⑧ shebang
・#!/bin/bash
・インタプリタの指定
・サブシェル (fork)
(cmd)
・カレントシェル (exec)
{ cmd;}
・fork
・親プロセスとコード共有
・データ、スタックはコピー
・コピー領域の変更は親プロセスに影響しない
・shell command
・current shell
・ビルトインコマンド
・executable program
・child(shell,process)
・外部コマンド
7.プロセス間通信
IPC: InterProcess Communication
・親子プロセス
・任意プロセス
・ネットワーク上のプロセス
・プロセスにシグナル送信
1)パイプ
・親子プロセス間
・コマンド(出力➝入力)
・ls | wc (fork)
・単方向
2)名前付きパイプ
・任意プロセス間
・p: ファイル
・named pipe (FIFO)
・mkfifo (mknod)
3)ソケット
・ネットワーク通信
・s: ファイル
・soket, bind
4)シグナル
・プロセスにシグナル送信
・端末制御文字
・killコマンド
・シグナル
・stty -a
・kill -l
・受信時の動作
①シグナル
・SIGINT :終了 ^C interrupt
・SIGQUIT :終了 ^\ core dump
・SIGTSTP :中断 ^Z
・SIGTERM :終了
・SIGKILL :終了
②stty -a(端末環境)
制御文字設定
・intr = ^C
・quit = ^\
・susp = ^Z
・eof = ^D
・^C = Ctrl + C
・端末入力の^CをSIGINTに変換し送信
・^D: end of file (logout, exit)
③kill -l (シグナル一覧)
シグナル番号、シグナル名
・2) SIGINT
・3) SIGQUIT
・9) SIGKILL
・15)SIGTERM
・18)SIGTSTP
kill: 指定プロセスにシグナル送信
kill -INT PID
④シグナル受信時の動作
1)デフォルト動作
2)シグナルハンドラ起動
3)シグナル無視
・trap:シグナルハンドラの設定
・シグナル受信時の動作変更
trap コマンド シグナル名
・シグナル無視
trap ” INT TERM
337
クリニックについて
CLINIC OVERVIEW
料金表
PRICE LIST