【調査】リアルタイムWeb実装技術

概要

・動的に表示内容を更新するWebサイト、Webアプリケーションを実装するために常に最新の情報を表示したい。

・そのために、任意のタイミング(リアルタイム)でクライアント−サーバ間でデータの送受信を行う必要がある。

Ajax(Asynchronous JavaScript and Xml)

ページの遷移やリロードをせずに、ページの一部を置き換える技術。名前の通りXMLとJavaScriptを使って非同期のリクエストをサーバに送って、レスポンスをページに反映させる。

・接続1回に対して、情報の取得は多くて1回。

・クライアントは定期的に、サーバに接続を行う必要がある。(ポーリング)

・クライアント側からのみ、リアルタイムに送信可能。

・サーバ側の情報はクライアントが取得しにいく必要がある。

Comet

サーバがリクエストを受け取ってもすぐにレスポンスを返さず、限界まで接続しておくことでサーバからの通知機能を実現開いている。接続中であれば、サーバで発生したイベントを即座に知ることができる。接続負荷が大きいという欠点がある。

・サーバは応答を返すのをできるだけ引き延ばす。(ロングポーリング)

・引き延ばす時間に限界があるため、最接続が必要。

・サーバ側からリアルタイムに送信が可能。

・クライアント側からの送信はAjaxで別に行う必要がある。

Webソケット

W3CとIETFがクライアント−サーバ間の通信を行う為に規定している双方向通信用の技術規格。AjaxやCometで利用されていたXMLHttpRequestの欠点を解決する技術として開発された。

・一度接続してしまえばつなぎっぱなしでOK!

・接続が切れない限り、最接続が不要。

・クライアント/サーバの双方からリアルタイム送信が可能。

・接続の確立はクライアントから行う必要がある。

総評

サーバ側でイベントが発生したときにリアルタイムに更新したい場合など、総合的にWebソケットを使ってリアルタイムWebを実現するのが良さそう。

AjaxとCometの欠点を補ってできた技術というだけあって、Webソケットにはほとんど欠点がない?対応してないブラウザがあるのとノウハウが少ないくらい?

双方向性 リアルタイム性 接続処理負荷 接続の継続性
Ajax × ×
Comet ×
Webソケット

文字に合ったテキストボックス

HTMLでテキストボックスを表示する方法にinputタグのtype属性にtextを設定する方法があります。

<input type="text">

しかし、文字の大きさや文字数、フォントを変更した際に文字が切れてしまうことがあり、そのような時のためにsize属性があります。入力する文字数が決まっている場合にはsizeを指定してあげることで、文字が切れる心配がなくなります。

<input type="text" size="5" value="5文字表示">

WordPressのCSSと競合しているようで上手く表示されませんが、このように記述することで、文字のサイズとテキストボックスの大きさをそろえることができます。

また、HTML5から利用できるようになったtype属性のnumberがあります。こちらは数値を入力するためのテキストボックスで右端の三角矢印を押すことで、数字を入れることもできます。しかし、こちらにはsize属性を指定することができません。

そこで、若干無理矢理ですが長さの単位にem(エム)を使用することで解決しようと思います。emは一文字分の長さを表す単位です。font-sizeの1pxは、文字の高さが1pxであることを示しています。font-sizeを1pxに設定しても文字の幅は1pxにならないためテキストボックスの横幅は1文字あたり0.67emぐらいに設定してみます。

<input type="number" style="width:4.27em;">


フォントやフォントサイズを変更するたびに横幅を指定し直すことはしたくないので、このような方法を取ることにしました。注意点としましては三角矢印の領域も横幅に含まれるようなので、実際には1〜3文字分程度多めに横幅を指定する必要がありそうです。

また、テキストボックスとは関係ありませんが、emを設定することで画面の大きさに応じて文字サイズを変更するといったこともできます。h1の文字の大きさが画面の大きさに合わせて自動で変わるようにCSSで記述します。

h1 {
  font-size: 3em;
  line-height: 1;
  margin-bottom: 0.5em;
}

html {
  font-size : 75%;
}

/*画面サイズ768px以上の時*/
@media screen and (min-width : 768px){
  html{ font-size : 87.5%;}
}

/*画面サイズ768px以上の時*/
@media screen and (min-width : 1024px) {
  html{ font-size : 100%};
}

この画面の大きさの区分は、スマートフォン、タブレット、PCの画面を基準に設定されています。

———————参考文献———————-
CSSで使用する単位一覧 http://www.tagindex.com/stylesheet/basic/length.html

画面遷移の方法 (HTML/CSS)

HTMLにおける画面遷移の方法には、formタグを使うものとaタグの属性でhref=””を設定する方法があるが、用途の違いを調べました。

formタグを使う場合

<form action="http//yamamoto.arkoak.com" method="get">
  次のページ
</form>

このように記述することで、formタグでくくった中にあるinputタグの値を次のページに引き渡すことができます。また、method属性の値をpostに設定することで、URLに引き渡す値を表示させずに渡すことが可能です。

Aタグ(アンカータグ)を使う場合

<a href="http//yamamoto.arkoak.com">
  次のページ
</a>

アンカータグを使う場合このように記述します。値をリンク先に渡したい場合は、URLの最後に?a=1&b=100などと変数名と値を書くことで、formタグ同様に値を渡すことはできます。

ここで本題であるが、訳あってinputタグのsubmitを使わずにアンカータグにクラス設定をすることで、ボタンにリンクを貼らなくてはいけなくなりました。そのままアンカータグにクラスを指定すれば、同じようなボタンができると考えていたが、なかなか上手くいかなかったので、その解決手法を調べました。

・HTML

<a href="http//yamamoto.arkoak.com" class="btn-link">
  ページ先頭へ
</a>

・CSS

.btn-link {
  text-align: center;
  background: #ccc;
  border:2px solid #333;
  width: 120px;
  height: 50px;
  font-size: 18px;
  color: #000;
}

このようなスタイルシートで示したボタンにリンクを張りたい場合、アンカータグを使うと下のボタンのように下線が出てきたり、文字が上によってしまいます。下線はスタイルシートでtext-decorationプロパティにnoneを設定することで、解消されます。
ページ先頭へ

まず、paddingを使って余白を調節することを考えました。

  padding-top: 20px;

ページ先頭へ

一見上手く行ったように見えるが、ボタンが縦にのびてしまっています。どうすればいいか悩んだあげくマージンを負に設定して隙間を埋めることにしました。上下中央はとりあえずあきらめます。

.btn-link {
  display: block;
  text-decoration: none;
  padding-top: 20px;
  margin-top: -20px;
}

上手く表示されていないかも知れませんが、chromeではちゃんと表示されることを確認しました。とりあえず、このボタンで妥協します。

JavaScriptを使わずに図形を描画

円の描画

HTMLとCSSだけで図形を表示する必要があったのでその覚え書き。円を描画するためには四角形の要素の角に丸みを持たせていくことで描画できる。

・HTML

<div id="circle"></div>

・CSS

#id {
  border: 2px solid #000;
  border-radius: 50%;
  height: 50px;
  width: 50px;
}

表示させると以下のような円が描画される。

 

border-radiusプロパティの値を調整することで、角の丸い四角形を描くことも可能である。

border-radius: 10px;

 

backgroundプロパティの値を変更すれば、図形を塗りつぶすことをできる。

background: #000;

 

このように、border-radiusを使うことでJavaScriptを使わなくても図形の描画ができる。

三角形の描画

三角形の描画には高さと幅のない四角形のborderに幅を持たせることで、描画することが多くあります。図のように対角線のtopの部分だけを表示し、それ以外は透明色を設定しています。

triangle

cssでは以下のように書くことができます。

.triangle {
  width: 0px;
  height: 0px;
  border: 30px solid transparent;
  border-top: 30px solid #0ff;
} 

三角形

塗りつぶされた三角形を表示する場合は、このようにCSSを記述し、divタグなどにクラス設定をすることで描画できます。しかし、枠線だけを表示したい場合は、この方法では捧持することができません。SVGやJavaScriptを使えば容易にできると思いますが、今回は塗りつぶされた三角形に背景色と同じ色の三角形で塗りつぶすことで、枠線だけの三角形を描画したいと思います。

<div class="triangle"></div>
.triangle {
 width: 100px;
 text-align: center;
}

.triangle:before {
  content: "";
  vertical-align: middle;
  width: 0px;
  height: 0px;
  border: 30px solid transparent;
  border-top: 30px solid #0ff;
}

.triangle:after {
  content: "";
  position: relative;
  top: -5px;
  left: 50px;
  width: 0px;
  height: 0px;
  border: 20px solid transparent;
  border-top: 20px solid #222;
}

枠のみの三角形
スクリーンショット 2014-08-28 23.08.01

CSSセレクターなど

今週学習した小ネタ的な物の覚え書き。

ラジオボタン

まず、ラジオボタンのアイテムの設定方法の種類について。ラジオボタンにはプロパティを設定することによって、必ず選択させたり、どれも選択させなかったりなど設定することができる。

必ず選択させる方法

<form>
  <div>
    <label>
      <input type="radio" name="test" value="Item1" required>Item1
    </label>
  </div>
  <div>
    <label>
      <input type="radio" name="test" value="Item2">Item2
    </label>
  </div>
  <div>
    <label>
      <input type="radio" name="test" value="Item3">Item3
    </label>
    <input type="submit" value="button">
  </div>
</form>
何もアイテムを選択せずにボタンを押すと、チップが出てきて入力を促してくれる。requiredを設定することで、この部分のエラー処理を行う必要がなくなりそうで便利だと思った。requiredの部分をdisableに設定することで選択できなくなり、checkedで選択済みになり、multipleで複数選択可能になる。

CSSセレクター

よく使うセレクタをいくつかピックアップして覚えておこうと思う。

1.  *(すべての要素に適用)

* {
  font-size: 15px;
}

2.  .X(指定したクラス名がある要素に適用)

.btn {
  font-size: 15px;
}

3.  #X(指定したID名がある要素に適用)

クラスと違い、IDはhtmlの中で一度しか使用することができない。用途の違いとしてはページのある場所に飛びたい時などに使用される(いくつもあると問題なので)。

#top {
}
<a href="http://yamamoto.arkoak.com/?p=855#top">ページ先頭へ</a>

ページ先頭へ

4.  E   F(子、孫要素に適用)

要素Eの下にあるFに適用される。Fの下にある孫要素にも適用される。

5.  E > F(子要素のみに適用)

要素Eの下にあるFに適用される。Fの下にある孫要素には適用されない。

6.  n-th child()  (n番目の要素に適用)

複数の要素が並んでいるときに、番号を指定して適用させることができる。例えば表で一列目だけ色を変更したい場合は次のように記述する。

・HTML

  <table>
    <thead>
      <td><th>1</th><th></th></td>
    </thead>
    <tbody>
      <td><th>2</th><tr></tr></td>
    </tbody></pre>
 </table>

・CSS

tbody > th:n-th-child(1) {
  background: #999;
}

7.  E:before,  E:after(要素の前後に適用)

指定した要素の前後に適用される。例えば要素の前後に決まった単語などをつけたい時に使うことができる。

・CSS

div > h1:before,
div > h1:after {
  content: "-------------";
}

・HTML

<div><h1>参考文献</h1></div>

このように記述することで、毎回同じ文章を書く手間を省けくことができる。

————-参考文献————-

w3school.comのwebページにてすべてのセレクタが参照できる。http://www.w3schools.com/cssref/css_selectors.asp

 

 

 

CSSでレイアウト

Webアプリケーションの画面のレイアウトをHTML, CSSで作成する際、画面が崩れて嵌ってしまいだいぶ苦戦したのでその覚え書き。

まず、displayプロパティの各値の特徴について。

display

・縦に積まれていく

・幅と高さを指定できる。

・上下、左右にmargin、paddingを指定できる。

・text-alignは要素の中身に使用できる。

・verticle-alignは指定できない(縦に並ぶので)。

inline

・横に並んでいく。

・幅と高さは指定できない。文字の大きさに合わせて変化する。

・左右のみmargin、paddingを指定できる。

・text-alignは親要素に指定することで使用できる。

・verticle-alignを指定できる。

inline-block

・横に並んでいく。

・幅と高さを指定できる。

・text-alignは親要素に指定することで使用できる。

・verticle-alignを指定できる。

inline-blockは高さ、幅を指定できるブロック要素みたいな感じでレイアウトを行う際によく使われる。

CSSでレイアウトを考える際、テキストやボタンなどの部品の固まりを要素として考えるが、単純に要素を並べていくと通常下図左側のように要素が下へ下へと並んでいく。座標を指定して要素を動かすことも可能であるが、画面の大きさやブラウザによって表示され方が異なってくるので推奨されない。

layout

要素を横に並べたい場合には次の2つの方法が考えられる。子要素Aのfloatプロパティでleftを設定する方法と要素をinline-blockとして横並びさせる方法がある。floatを使った場合以下のように記述することができる。

・CSS

parent {
  position:relative;
}

childA-block {
  position: relative;
  float: left;
}

childB-block {
  position: relative;
  float: left;
}

・HTML


<div class="parent-block">
  親要素
  <div class="childA-block">
    子要素A
  </div>
  <div class="childB-block">
    子要素B
  </div>
</div>

この場合float:leftと設定することで自分の要素を左側に追いやって、右側にスペースを作っている。

続いてdisplayプロパティのinline-block要素を使う方法である。inline-block要素に設定することで、inline要素とblock要素の両方の性質を持つことができる。inline要素とは、<a>や<span>など主にブロック要素の内容として扱われる要素で、文章として扱われる。一方、<div>や<form>、<table>などはblock要素と呼ばれ、一つのブロックとして扱われるため、通常同時に改行される。

・css

parent-block {
  position: relative;
}
childA-block {
  position: relative;
  display: inline-block;
}
childB-block {
  position: relative;
  display: inline-block;
}

上記のように記述することで、子要素を横に並べることが可能になる。しかし、子要素同士の高さが異なる場合や複雑なレイアウトでfloatとinline-blockの両方を使う必要があるときなどに画面が崩れる場合がある。下図のようなレイアウトを考える。

layout_rational

まず、子要素A, Bをinline-blockで並べ孫要素は単純に上から並べてみる。

.parent-block {
   width: 150px;
   margin: 10px;
   position: relative;
   background-color: #888;
   display: inline-block;
   border: 1px solid;
}

.childA-block{
   position: relative;
   background-color: #aaa;
   display: inline-block;
   border: 1px solid;
}

.childB-block{
   position: relative;
   background-color: #aaa;
   display: inline-block;
   border: 1px solid;
}

スクリーンショット 2014-08-22 21.20.12

 

子要素の高さが異なる場合、子要素Aは子要素Bの高さに合わせてどんどん下へと移動してしまう。また、原因はよくわからないが子要素A, Bの間に隙間ができてしまった。

HTML上で要素間に改行があった場合に、子要素A,B間に隙間が生じてしまう。これを解決する方法もいくつかあって、最も簡単な方法は改行しないことです。

 


<div class="parent-block">
親要素
<div class="childA-block">子要素A</div><div class="childB-block">子要素B</div>
</div>

それ以外にも改行箇所にコメントを挟むことで、防げるようです。


<div class="parent-block">
  親要素
  <div class="childA-block">
    子要素A
  </div><!--
  --><div class="childB-block">
    子要素B
  </div>
</div>

別の方法として、float:leftを使ってレイアウトしてみる。

.parent-block{
   width: 150px;
   margin: 10px;
   position: relative;
   background-color: #888;
   border: 1px solid;
}

.childA-block{
   position: relative;
   background-color: #aaa;
   float: left;
   border: 1px solid;
}

.childB-block{
   position: relative;
   background-color: #aaa;
   float: left;
   border: 1px solid;
}

スクリーンショット 2014-08-22 21.21.03

 

今度は子要素Aの位置は変わらず、子要素A, Bの間にできていた隙間も生じなくなった。しかし、親要素が高さを失いつぶれてしまっていることがわかる。floatを使用することで、親要素が高さを失ってしまったのである。ここで登場するのがoverflowという収まりきらない領域をどのように処理するかを決めるプロパティである。値にhiddenを設定することにより、フロートした要素の回り込みを防ぐことができて、親クラスに高さが復活するようである(自信なし)。高さを持たせたい親クラスに一行書き足すだけでfloatを解除することができ、他にも方法はあるが現在はこれが主流らしい。

.parent-block{
   width: 150px;
   margin: 10px;
   position: relative;
   background-color: #888;
   border: 1px solid;
   overflow: hidden;
}

スクリーンショット 2014-08-22 21.20.34

 

今回は、floatを使うことにより、この問題を解決した。しかし、より複雑になってきた場合、floatとinline-blockを組み合わせるなど、位置の調整が必要になってくることが考えられるので使えこなせるように勉強していきたい。

 

—————————————参考文献—————————————

display: inline、display: block、display: inline-block をマスターしよう!

http://taneppa.net/display-inline-block/

Webサーバとクライアント

Webサーバの役割

Webサーバの役割にはクライアントの要求(リクエスト)に対して必要な情報を表示したり、処理を行った結果をクライアントに返すことがある。そのためWebサーバはブラウザから送られてきたHTTPリクエストの解析とその処理結果をブラウザに返す為にHTTPレスポンスの返信を行う。

さーば
Webサーバの構築

一連の処理の流れを学習するためにC言語を使って、Webサーバを構築する。C言語でネットワークプログラミングを行うためにはWinSock2と呼ばれる、Windowsでソケットを使ってプログラムを書くためのAPIを使用する。WinSock2を使うことで、TCP/IPなどインターネットを使って、通信を行うプログラムが書ける。ここでソケットとはデータの出入り口のことで、ユーザーはソケットに対してデータを読み込んだり、書き込んだりする。そうすることでソケットの裏側で動いている複雑な通信プロトコルを意識せずに通信することができる。開発環境にはVidual Studio 2008を使用する。下図は大まかな処理の流れを示したものである。

dataflow

 

これからwinsock2を使ってソケットプログラミングを勉強していく。とりあえずHTMLファイルを表示させ、複数のクライアントから同時にアクセス可能なWebサーバーを作っていく。

 

————————-参考文献————————-

TCP/IP解析とソケットプログラミング オーム社開発局

HTTPプロトコル

HTTPプロトコルとは

HTTPは通信に関する取り決めの一つで、Webサーバクライアント(ブラウザ)の間でやり取りを行うためのプロトコルです。テキストファイル、画像ファイル、その他複合ファイルをシンプルかつ効率的にクライアントに配布することを実現しています。

HTTPリクエストとHTTPレスポンス

Webサーバーとクライアント間で通信を行う時に、クライアントからWebサーバーに対して、HTTPリクエストが送られ、Webサーバーからクライアントに対してHTTPレスポンスが送られます。HTTPリクエストには「htmlファイルを読み込みたい」などの要求メッセージが記述され、HTTPレスポンスにはその要求に対しての結果が記述されます。その記述内容について、調べたのでその覚え書きです。

HTTPリクエスト

GET /index.html HTTP/1.1
Host: http://localhost:54321
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_4) 
Accept: text/html,image/jpeg
Accept-Language: ja,en-us;
Accept-Encoding: gzip
Cookie: ***************
Connection: keep alive
Cache-Control: max-age=0

まず、1行目はリクエスト行と呼ばれ【メソッド パス名 HTTP/バージョン】の順番に記述されます。”GET”は代表的なメソッドの一つで、サーバに対してページの要求を行います。その他に”HEAD”(ヘッダの情報のみを要求),”POST”(データをURLに表示せずに、ページを要求)などがあります。”GET”と”HEAD”は必ずサポートする必要があります。パス名なURLに記述した場合は/index.htmlのように表示されますが、URLに記述しない場合でも/index.htmlを要求するようになっています。HTTPのバージョンは現在ほとんどが1.1となっています。

2行目のHostヘッダーはクライアントがリクエストするサーバを特定するために記述します。HTTP/1.1ではプロキシや仮想サーバー利用を前提のため、必ず記述する必要があります。

3行目のUser-Agentヘッダーは取得したリソスなどを記述するブラウザやシステムの情報を記述します。

4行目のAcceptヘッダーはWebブラウザが受理できるデータの形式を記述しています。こちらはMIMEと呼ばれるプロトコルで、データの形式をタイプ/サブタイプのように記述する。

5行目のAccept-LanguageはWebブラウザが受理できる言語を記述します。日本語ならja、英語ならen、米語ならen-usです。ブラウザの設定で言語の優先順序を変更することができます。

6行目のAccept-Encodingは利用可能なエンコード方式です。Content Coding方式で記述されます。gzipと記述することで、圧縮転送が可能になります。

7行目のCookieはクッキーに関する情報が記述されます。重要な項目であるようなので別記する予定です。

8行目のConnectionはHTTP/1.1ではすべてkeep aliveに設定されるようで、あまり気にする必要はなさそうです。コンテンツのダウンロードを連続かすることでサーバの負担を軽減させる働きがあるようです。

9行目のCatch-Controlはディレクティブと呼ばれるコマンドをフィールド値に設定することで、キャッシング動作を指定します。max-ageは必ず記述する必要があり、0の場合、キャッシュサーバは常にリクエストをオリジンサーバに渡します。指定されたAge値よりも小さい場合キャッシュされたリソースを受け取ることができます。

HTTPレスポンス


HTTP/1.1 200 ok
Server: Microsoft Internet Server / 4.0
Data: Sat 12 Jun 2014 11:43:11 GMT
Content-type: text/html
Content-length: 300
-空白行-

BODY

1行目はレスポンス行と呼ばれ、【HTTPバージョン ステータス番号 補足メッセージ】の順に記述されます。HTTPのバージョンはHTTPリクエストとそろえる必要があります。代表的なステータス番号と補足メッセージを下図にまとめます。

ステータス番号 補足メッセージ 説明
200 OK 成功しました。
400 Bad Request 要求が不正です。
404 Not Found ページが見つかりません。

 

2行目のServerヘッダーには、サーバーの情報が記述されています。今回のようにWindows PCを使ってローカルホストに接続する場合は、ベンダー名/バージョン番号の順にMicrosoft Internet Server / 4.0のように記述します。

3行目のDateにはGMT(グリニッジ標準時)で応答を返す時刻を記述します。

4行目のContent-typeではコンテンツの種別をMIMEタイプで示します。

5行目のContent-lengthはメッセージボディの長さをバイト単位で示します。

text/htmlの情報を送るために、IE8とCromeに応答を返す場合では、最低でも上述の5行分の情報とBodyであるhtmlファイルの情報が必要でした。これら以外にも表示する情報に応じて必要な情報を記述する必要があると思います。

補正アルゴリズムの提案③

補正アルゴリズム③の概要

焦点のブレなどを補正する3つ目のアルゴリズムとして、目印を使わずに画像の精度を向上させる方法を提案して卒業したいと考えています。目印を使わずに画像の精度向上を行うためには、CT画像の評価の指標としてこれまで使ってきた、サイノグラムのサインカーブの抽出を行っ て、抽出できるサインカーブを増やせるようにサイノグラムに処理を施そうと考えています。最急勾配法焼きなまし法(SA)など最適化アルゴリズムの考え方を使って抽出できるサインカーブの本数が最大になるサイノグラムを作りたいと考えています。

サインカーブの抽出について

サイノグラムの画素をサインカーブ状に順番に調べていくことでサインカーブの抽出を行っています。サインカーブの抽出には2つの指標を用いて、判断をおこなっています。一つ目の指標を連続値と呼んでいます。連続値はサインカーブ上にどれくらい許容誤差以下の連続した画素があるかを調べていて、今回は750px程度連続した画素があればサインカーブと判断しています。もう一つの指標として濃度の平均値を使っています。サインカーブ上に画素の濃度を加算していき、投影方向数で割ったものが境界平均値よりも大きいかどうかを調べています。境界平均値よりも大きいと被写体のある領域だと判断されます。この2つの条件を満たすときサインカーブと判断されます。また、一点境界値以下の領域は被写体以外の領域だと判断して、一つでもそれ以下のピクセルがあるとサインカーブであるとみなされません。

最急勾配法による方法

まずは、最急勾配法の考え方?(正しいかどうかは不明)を使ってサイノグラムを動かします。最急勾配法は反復法を用いて最適解を求める手法で、勾配しか見ないので、単純で計算も速いです。しかし局所解にはまりやすい特徴もあります。今回は抽出できるサイノグラムの本数を評価値として、抽出できるサインカーブが最大になるサイノグラムを求めます。また、これを評価する関数を評価関数といいます。試しにサイノグラムを0°から動かしてみて、その都度最も抽出できたサインカーブの本数が最も多くなるように、サイノグラムを動かしていきます。今回は最大で1000回計算を行うことにします。アルゴリズムは以下のようになっています。

  1. 元のサイノグラムの抽出できるサインカーブの本数を調べる。変数iniに格納。
  2. 上(0°)から順番にサイノグラムを移動させる。計算回数p番目の時はp行目以降のサイノグラムを0.3×p[px]Z方向(-Z方向)に移動させる。
  3. 何番目以降のサイノグラムを移動させたときサイノグラムが最大になるかを変数maxに、その時の行数を変数staに格納しておく。
  4. sta番目から2,3の計算を行う。
  5. 2,3,4を繰り返す。1000回繰り返すか、抽出されるサインカーブの最大値が変化しなくなったら計算終了。

sino

ソースコードを以下に示します。

public static void moveSino(){
  int proj = 800; //投影方向数
  double den = 0; //移動する濃度
  int max = 0; //抽出できたサイノグラムの最大値
  boolean end = true; //終了判定用

  for(int k = 0; k &lt; 1000; k++){
    int cnt=0, sta=0, ini=0;
    den+=0.2; //移動する濃度を増やす
    sta=start; //移動を開始する位置を決める

    for(int p = sta; p&lt; 800; p++){
      cnt = 0;

      for(int j = 0; j &lt; 512; j++){
        for(int i = 0; i &lt; 800; i++){
          sinogram[j][i] = FBP.sino[j][i];
        }
      }

      //Z方向に移動
      if(noudo&gt;=1){
        for(int j = 0; j &lt; 512-(int)noudo; j++){
          for(int i = p; i &lt; 800; i++){
            sinogram[511-j][i] = FBP.sino[511-j-(int)noudo][i];
          }
        }noudo-=(int)noudo;
      }

      for(int j = 0; j &lt; 512-1; j++){
        for(int i = p; i &lt; 800; i++){
          if(p==0)continue;
          sinogram3[511-j][i]+=FBP.sino[510-j][i]*noudo;
          sinogram3[511-j][i]-=FBP.sino[511-j][i]*noudo;
        }
      }

      //サインカーブの本数を調べる
      cnt = cntSineCarb();
      if(p==0)ini = cnt;

      //抽出できた最大値とその時の行を格納
      if(max&lt;cnt){
        max = cnt;
        start = p;
        end = false;
      }
   }

   if(end)break; //最大値が更新されなかったら終了
   end = true;
}

プログラムを実行します。境界平均値を8000、一点境界値を5000、連続値を750、許容誤差を1000に設定して、サイノグラムの本数を順番に調べ、本数が増える方向にサイノグラムを移動させました。結果を以下に示します。

補正前 補正後③

サインカーブの本数だけでは、19本(4%)と今までで最も抽出できたサインカーブの本数が増えましたがコントラストと輪郭が変化した程度で、見た目の変化はほとんどありませんでした。計算も4周目で計算が終わってしまったので局所解に収まってしまったと考えられます。-Z方向に動かした場合、移動させる濃度を変更した場合も結果はほとんど変わりませんでした。

焼きなまし法(SA)による方法

焼きなまし法も勾配法の一種ですが、計算の途中で敢えて評価値が悪くなる方に解を動かすことによって、局所解にはまりにくくする手法です。

コンピュータの構成要素について

「コンピュータを構成する5つの機能」

コンピュータは、入力記憶制御演算出力の5つの機能を実現する装置から構成されています。人間の脳に相当するものとして中央処理装置CPU)があります。CPUは計算を行う演算装置と、各装置への動作指示や制御を行う制御装置から構成されています。また、主記憶装置メインメモリとも呼ばれ、脳の中にある情報を記憶する部分に相当します。記憶しきれない情報は、ハードディスクやCD、DVD、USBメモリなどの補助記憶装置に記録します。また、マウスやキーボードを入力装置、ディスプレイやプリンタを出力装置と呼びます。

「命令実行の仕組み」

磁気ディスク装置などの補助記憶装置に記憶されているプログラムを実行するためには、あらかじめプログラムを主記憶装置に読み込む必要があります。プログラムを主記憶装置に読み込むことをロードといい、プログラムが主記憶装置にロードされると、コンピュータはそのプログラムを実行する準備をしたのち、プログラムの実行を開始します。

具体的にはプログラムを主記憶装置のどこに読み込んだのかをロードしたプログラムの先頭番地を保持するベースレジスタ(基底レジスタ)に設定し、また、プログラムのどこから実行するのかを実行する命令の番地を保持するプログラムカウンタ(命令アドレスレジスタ)に設定します。レジスタとはCPU内部にある高速アクセスができる記憶装置のことです。

1つ1つの命令はどのような処理をするかを示した命令部(オペレーション部)と、その処理の対象となるデータやデータの記憶場所を示すオぺランド部(アドレス部)から構成されていて、コンピュータが直接理解して実行できる形式になっています。

主記憶にロードされたプログラムの一つ一つの命令は中央処理装置(CPU)で実行されます。CPUではロードされたプログラムを1つずつ「取り出し(命令フィッチ)→解読→実行」というサイクルを繰り返します。

「メモリシステムの仕組み」

磁気ディスク装置などの補助記憶装置に記憶されているプログラムやデータは主記憶に読み込まれ、CPUで主記憶から順に取り出して実行しています。ここで問題となるのはCPUの性能と主記憶、補助記憶装置へのアクセス速度の差です。いくらCPUの性能が高くても、主記憶装置や補助記憶装置へのアクセス速度が遅ければ、処理の高速化は期待できず、コンピュータ全体の性能を落としてしまいます。これらの装置間の動作速度の違いを埋めるのが、レジスタキャッシュメモリディスクキャッシュといった記憶装置です。

メモリシステム

  • レジスタ
    CPU内にある高速アクセスができる記憶装置。プログラム実行中に何度も繰り返し使うデータは、いちいち主記憶にアクセスすると効率が悪いのでレジスタに記憶して処理の高速化を図る。
  • キャッシュメモリ
    CPUと主記憶の間におかれ、CPUの処理速度と主記憶へのアクセス速度の差を埋める。CPUがこれからアクセスすると予想されるデータやプログラムの一部をキャッシュメモリにコピーしておき処理の高速化を図る。
  • ディスクキャッシュ
    主記憶とディスクキャッシュの間におかれ両者のアクセス速度の差を埋めるもの。

キャッシュメモリにあるのはこれからCPUが必要になると予想されるデータであって、ない場合は主記憶から読み込むことになります。CPUが必要とするデータがキャッシュメモリにある確立をヒット率といい、ヒット率が高いほど処理の高速化を図れます。たとえば主記憶のアクセス時間が70nsでキャッシュメモリのアクセス時間が10nsだとします。キャッシュメモリのヒット率が90%だった場合アクセス時間の平均は、

$$(10+10+10+10+10+10+10+10+10+70)\div10=16$$[ナノ秒]

となり、主記憶のアクセス時間よりも短くなります。このアクセス時間の平均を実行アクセス時間(平均メモリアクセス時間)といいます。

「磁気ディスク装置の仕組み」

磁気ディスク装置は、磁性体を塗った円盤状のディスクを一定の間隔で何枚も重ね合わせた構造となっています。中心が同じで半径が同じ同心円状の領域をそれぞれトラックと呼び、さらにトラックを分割したものをセクタといいます。また、トラックの集合をシリンダと呼びます。

磁気ディスク装置から目的のデータを読み込む動作は、①磁気ヘッドをデータが存在する位置まで移動させる→②磁気ヘッドの位置にデータが来るまでディスクを回転させる。→データを読み込む。の3ステップに分けることができます。それぞれにかかる時間を位置決め時間(シーク時間)、回転待ち時間(サーチ時間)、データ転送時間と呼びます。平均回転待ち時間はディスクが一回転する時間の半分です。位置決め時間、回転待ち時間、データ転送時間を合わせたものをアクセス時間とよび、そこからデータ転送時間を引いたものを待ち時間と呼びます。

「コンピュータシステムの構成要素」

コンピュータシステムを低コストで効率よく利用するために、種々のシステム構成要素が採用されています。負荷分散を図るためのクライアントサーバシステム、信頼性の向上を目的としたデュアルシステムデュプレックスシステムなどが該当します。

クライアントサーバシステムCSS)はネットワークを利用して分散処理を行うコンピュータシステムの携帯で、システムの構成を示すものです。CSSはクライアントおよびサーバから構成されています。クライアントはサーバに対してサービスを要求し、サーバが行ったデータ処理(ファイル管理、データベース管理など)の結果を受け取り結果表示などを行います。クライアントとサーバが処理をそれぞれ分散して行うことで処理の負荷分散を図ることができます。

デュアルシステムは2つのCPUで同じ処理を行い、互いの処理結果を照合しながら処理を行うシステムです。コストはかかりますが、信頼性の高い方法です。いずれかが故障した場合は以上の発生した側のシステムを切り離し、残る片方だけで処理を継続することができます。

デュプレックスシステムは2つのCPUを用意する点ではデュアルシステムと同じですが、正常運転中は片方を待機状態にしておきます。主計をオンライン処理(リアルタイム処理)用、副系を優先順位の低いバッチ処理(データを蓄積しておき一括して処理を行う)などに利用します。切り替え時間はおよそ数十分から数時間と言われています。

「OSの構成と目的」

 オペレーティングシステムの定義は明確ではありませんが、基本ソフトウェアを広義のOS、制御プログラムを狭義のOSということがあります。OSはコンピュタを取り巻く諸資源の遊休や無駄をなくし、コンピュータシステムを効率よく運用することでシステム全体の生産性を向上させます。次にOSの目的を整理します。

ハードウェア資源の有効利用
多重プログラミング(マルチプログラミング、1台のCPUでプログラムを交互に処理)、スプール機能(高速な磁気ディスクなどを仮想的な出力装置として使うこと)など。

多様な処理形態への対応
バッチ処理、オンライン処理など、

信頼性と安全性の確保
信頼性と安全性の指標RASISの向上。信用性、可用性、保守性、保全性、機密性

応用ソフトフェアの負荷軽減
仮想記憶(見かけ上の主記憶の容量を拡大する技術。補助記憶を用いることが多い)、ライブラリ管理(複数のプログラムを体系的に蓄積する機能)など

コンピュータ操作と運用の支援
連続処理、運用データの記憶など

狭義のOSである制御プログラムの役割の一つにジョブ管理があります。ジョブ管理は仕事の優先順位の決定や、ジョブの同期処理を行います。ジョブ管理の流れには、リーダ→イニシエータ→ターミネータ→ライタなどがありますが、その中にスプーリングがあります。スプーリングはプリンタなどの低速な装置とのデータのやり取りを、高速な磁気ディスクを介して行うことで、処理効率を高める方法のことです。

もう一つ狭義のOSである制御プログラムの役割の一つにタスク管理があります。タスク管理はプログラムの実行を制御する機能で、プログラムの同期制御、プログラム実行のための資源の動的割り当てや各種の割込み制御も行います。タスクとはOSの下で実行される内部処理の単位のことを言います。

「開発ツール」

コンパイラは原始プログラム(ソースコード)を機械語に翻訳する言語プロセッサの一つで、次の手順で機械語に翻訳します。

  1. 字句解析: ソースコードを変数やトークンに分割
  2. 構文解析: 言語の構文に従って、プログラムを解析
  3. 意味解析: プログラムに意味的な誤りがないか検証
  4. コード生成: 機械語レベルのコードを生成
  5. 最適化: 目的プログラムの無駄な部分を削除

機械語に翻訳された目的プログラム連係編集プログラムリンカ)によって目的プログラム同士を結合させます。プログラムを実行するに当たっては、実行したいプログラムを主記憶もしくは補助記憶装置に格納させる必要がります。この役割を果たすのがローダです。ローダによって主記憶に格納されたらコンピュータはロードモジュールから位置命令ずつ取り出して解釈し、実行します。

[過去問1]

コンピュータの命令実行順序として、適切なものはどれか?(FE-H18-S-18)

ア. オペランド読み出し→命令の解読→命令フィッチ→命令の実行
イ. オペランド読み出し→命令フィッチ→命令の解読→命令の実行
ウ. 命令の解読→命令フィッチ→オペランド読み出し→命令の実行
エ. 命令フィッチ→命令の解読→オペランド読み出し→命令の実行

正解 「
命令フィッチとは命令の取り出しのこと。またオペランド読み出しは命令の対象となるレジスタや値などの読み出しのことを意味する。

[過去問2]

主記憶のアクセス時間60ナノ秒、キャッシュメモリのアクセス時間10ナノ秒のシステムがある。キャッシュメモリを介して主記憶にアクセスする場合の実行アクセス時間が15ナノ秒である時、キャッシュメモリのヒット率は幾らか?(FE-H19-S-20)

ア. 0.1   イ. 0.17   ウ. 0.83   エ. 0.9

正解「
キャッシュヒット率はデータがキャッシュにある確率です。ここでキャッシュのヒット率をHとすると次の式が成立します。15=10×H+(1-H)×60 この式を解くと H=0.9となります。

[過去問3]

メモリインタリーブの説明として、適切なものはどれか?(FE-H21-A-10)

ア. CPUから主記憶へのアクセスを高速化するために、キャッシュメモリと主記憶との両方に
同時にデータを書き込む。
イ. CPUから主記憶へのアクセスを高速化するために、主記憶内部を複数のバンクに分割
し、各バンクを並列にアクセスする。
ウ. CPUと主記憶のアクセス速度の違いによるボトルネックを解消するために、高速かつ小
容量のメモリを配置する。
エ. パイプライン処理を乱すことなくするために、キャッシュメモリを命令用とデータ用の2つに分
割する。

正解「
「ア」はライトスルーというデータの書き込み方の説明です。高速化は望めませんがデータ整合性が保たれます。「ウ」はメモリキャッシュの説明になります。

[過去問4]

RAID1~5の各構成は、何に基づいて区別されるか?

ア. 構成する磁気ディスク装置のアクセス性能
イ. コンピュータ本体とのインターフェースの違い
ウ. データおよび冗長ビットの記憶方法と記憶位置の違い
エ. 保障する信頼性のMTBF値

正解「
RAIDは複数のハードディスクを組み合わせて一つのハードディスクとして扱うことで、速度や信頼性を向上させます。

[過去問5]

CASEツールが提供する機能のうち、上流CASEツールに属するものはどれか?

ア. DFD作成支援          イ. テストデータの作成支援
ウ. プログラムの自動生成     エ. ライブラリの管理支援

正解「
イ、ウは下流CASEツールに属するものです。エは、共通CASEが提供する機能になります。上流CASEが設計行程、下流CASEが開発工程となります。DFDとはデータの流れとプロセスの流れを整理する技法のことです。

[過去問6]

RS-232Cの特徴に関する記述のうち,適切なものはどれか。

ア. パラレルインターフェースである。
イ. 通信可能な最高速度は,19,200ビット/秒である。
ウ. デイジーチェーン接続が可能である。
エ. 全二重の双方向通信を行うことができる。

正解「
RS-232Cは,パソコンとモデムやマウスなどの機器を接続するシリアルインタフェースです。規格上の通信速度の上限は19.2kbps(19.2kビット/秒)ですが,ほとんどのパソコンで115.2kbpsで通信ができます。最大転送距離は15m,全二重・半二重,同期・非同期いずれにも対応します。

 [過去問7]

仮想記憶システムにおいて,ページ置換えアルゴリズムとしてFIFOを採用して,仮想ページ参照列1,4,2,4,1,3を3ページ枠の実記憶に割り当てて処理を行った。表の割当てステップ“3”までは,仮想ページ参照列中の最初の1,4,2をそれぞれ実記憶に割り当てた直後の実記憶ページの状態を示している。残りをすべて参照した直後の実記憶ページの状態を示す太枠部分に該当するものはどれか。

kj3000-18a-27-01

ア. 1 3 4  イ. 2 3 4  ウ. 3 4 2  エ. 4 1 3

正解「
FIFO(FirstInFirstOut:先入先出)は,ページフォールトが発生したとき,最も古くからあるページをページアウトするページ置換えアルゴリズムです。したがって,下図の手順で処理を行うと残りをすべて参照した直後の実記憶ページの状態を示す太枠部分に該当します。

kj3000-18a-27-06

 [過去問8]

仮想記憶方式の一つに,仮想アドレス空間を固定長の領域に分割して管理するものがある。この固定長の領域を示す用語はどれか。

ア. セグメント  イ. フレーム  ウ. セクタ  エ. ページ

正解「
セクタは,フロッピーディスクや磁気ディスク,ハードディスクにおいて,トラックを均等に分割した円弧の部分。固定長ですが,仮想記憶とは関係ありません。セグメントは,プログラムの自立している部分であって,必ずしもそのプログラム全体が主記憶上になくても実行できる単位。例えば,内部サブルーチンが該当します。内部サブルーチンだから,サイズが一定とは限りません。フレームは,通信上の伝送単位を指すことが一般的です。通信方式によって,種々のサイズがあり,必ずしも固定長ではありません。また,仮想記憶とは関係ありません。ページは,プログラムを一定量のサイズに分割した単位です。仮想記憶ではページ単位に仮想記憶と主記憶の間で入れ替えが行われます。

 [過去問9]

システムが単位時間内にジョブを処理する能力の評価尺度はどれか。

ア. ターンアラウンドタイム  イ. スループット  ウ. MIPS値  エ. 応答時間

正解「
ターンアラウンドタイムは,ジョブを依頼してから完全な出力を得るまでの時間間隔。MIPSは,1秒間に実行できる命令の数を百万(106)の単位で示したものでハードウェアの性能指標の1つです。応答時間(レスポンスタイム)は,データを送信してから処理結果が返ってくるまでの時間間隔です。オンラインシステムの特性指標の1つです。

 [過去問10]

処理装置を構成する要素のうち,分岐命令の実行によって更新されるものはどれか。

ア. 命令レジスタ  イ. プログラムレジスタ  ウ. 汎用レジスタ エ. インデックスレジスタ

正解「
命令レジスタは,主記憶から取り出された命令を,解読するために,一時的に命令を格納するレジスタです。プログラムレジスタは,次に実行する命令のアドレスを格納するレジスタです。通常は,現在実行中の命令の次の命令(現在アドレス+命令語長)を指しているが,分岐命令であると,処理結果によって,分岐先のアドレスを格納します。汎用レジスタは,種々の目的に汎用的に使用するレジスタです。インデックスレジスタは,アドレス修飾を行うときに使用するレジスタです。

 [過去問11]

入出力インタフェースに関する記述のうち,適切なものはどれか。

ア. USBは,高速な周辺装置と低速な周辺装置向けの二つの転送モードをもち,一般にプリンタやスキャナ,モデムなどは高速モードで利用する。
イ. ATA/ATAPI-4(通常,IDEと呼ばれている)は,データを1ビットずつ直列(シリアル)に転送するインタフェースであり,モデムやマウスなどを接続するために用いる。
ウ. セントロニクスは,赤外線通信の規格として,ノート型パソコンや携帯情報端末でのデータ交換やプリンタへの印刷データ送信などに使う。
エ. RS-232Cは,8ビットのデータを並列(パラレル)に転送するインタフェースであり,プリンタを接続するために用いられることが多い。

正解「
USBは,パソコンと周辺機器を接続するシリアルインタフェースです。データ転送速度には12Mビット/秒のフルスピードモードと1.5Mbpsのロースピードモードがある。フルスピードモードでは比較的高速なプリンタやスキャナ,ロースピードモードでは比較的低速なキーボードやマウスを接続します。ATA/ATAPI-4(IDE)は,ハードディスクやCD-ROMを接続するパラレルインタフェースです。セントロニクスは,パソコンとプリンタを接続する8ビットのパラレルインタフェースです。赤外線通信の規格には,IrDAがあります。RS-232Cはシリアルインタフェースであり,主にモデムを接続するインタフェース規格です。

 [過去問12]

タスク管理の役割として,適切なものはどれか。

ア. 仮想記憶空間を提供し,実記憶を有効に利用する。
イ. マルチプログラミングの制御を行い,CPUを有効に利用する。
ウ. 各種の補助記憶装置へのアクセス手段を,装置に依存しない形態で提供し,応用プログラム作成の負担を軽減する。
エ. 入出力装置の制御を行い,正確かつ効率良く入出力装置を動作させる。

正解「
アは記憶管理の役割、ウはデータ管理、エは入出力管理の役割です。

 [過去問13]

1つの命令で複数のデータに対して同じ処理を並列に行うので、マルチメディア系の処理に適しているのはどれか。

ア. MIMD  イ. SIMD  ウ. SISD エ. MISD

正解「
MIMD(複数命令、複数データ処理)は複数の独立した命令が異なるデータを処理するコンピュータです。並列処理とパイプライン制御が可能なマルチプロセッサシステムが該当します。SIMDは、1つの命令で複数のデータを同時処理するコンピュータです。ベクトルプロセッサ(アレイプロセッサ)など、並列処理が可能なコンピュータが該当します。SISDは、遂次処理のコンピュータです。ノイマン型コンピュータが該当します。MISDは、1つのデータを複数の命令が同時に処理するコンピュータです。パイプライン制御を行うコンピュータが該当します。

 [過去問14]

CD-Rのデータ記録方法として,適切なものはどれか。

ア. ディスクに塗布した磁性体の磁化の方向を,磁気ヘッドによって変化させて記録する。
イ. 磁化されているディスクの記録膜にレーザ光を当てて熱し,磁気ヘッドで磁化の方向を変化させて記録する。
ウ. 有機色素が塗られたディスクにレーザ光を当て,有機色素の層にピットと呼ばれる焦げ跡を作って記録する。
エ. ディスクをはり合わせた2層構造をもち,レーザ光で記録層を相変化させて記録する。

正解「ウ」
CD-Rは,約700Mバイトの記憶容量を持ち、データを一度だけ書き込めるCDです。一度書き込んだデータは消去できませんが,追記はできます。記録面に金色や青緑色の有機色素が塗布されており,これにレーザ光を照射して色素を焦がしデータを記録します。焦げ目がCDのピット(微小な凹凸)に相当します。一方,表面にレーザ光を照射して反射光を読み取ることでデータを読み取ります。比較的安価な媒体なので,個人レベルで音楽の編集やバックアップ媒体として使われています。

 [過去問15]

ページ置換えアルゴリズムにおけるLRU方式の説明として,適切なものはどれか。

ア. 一番古くから存在するページを置き換える方式
イ. 参照回数の最も少ないページを置き換える方式
ウ. 最後に参照されてからの経過時間が最も長いページを置き換える方式
エ. 最後に参照されたページを置き換える方式

正解「
LRU(Least Recentry Used)は,最も長い間参照されていないページを追い出すページ置換アルゴリズムです。アはFIFO(First In First Out:先入れ先出し)の説明です。イはLFU(Least Frequently Used)の説明です。エはLIFO(Last In First Out:後入れ先出し)の説明です。

 [過去問16]

命令の構成に関する記述のうち,適切なものはどれか。

ア. 命令は,命令コードとオペランドで構成される。ただし,命令の種類によっては,オペランドがないものもある。
イ. 命令語長が長いコンピュータほど,命令の種類も多くなる。
ウ. オペランドの個数は,その命令で指定する主記憶の番地の個数と等しい。
エ. コンピュータの種類によって命令語の長さは異なるが,一つのコンピュータでは,命令語の長さは必ず一定である。

正解「イ」
命令コードは動作を指定し,オペランドは処理対象データの番地を指します。オペランドは,ベースレジスタ番号,インデックスレジスタ番号,主記憶装置のアドレスなどから構成されます。0アドレス方式では,演算はスタックの先頭と次のデータとの間で行うため,オペランドを指定しません。

 [過去問17]

プログラムの動作過程を実行順にモニタリングするデバッギングツールはどれか。

ア. プリティプリンタ  イ. インスペクタ  ウ. クロスリファレンス エ. トレーサ

正解「エ」
プリティプリンタは,ソースプログラムの字下げなど,整形を行うツールです。インスペクタは,会話型のテストツールです。プログラム実行途中におけるデータの強制変更,内容参照などを行います。クロスリファレンス(相互参照)は,プログラム中に現れる変数や定数,記号などを定義しているプログラム中の行番号と,それらを参照している文の行番号を一覧表にしたものです。コンパイラなどの言語プロセッサがもつ機能です。トレーサは,プログラムで実行した文(命令)などを実行順に印刷するなど,動作過程を時系列的にモニタするテストツールです。

 [過去問18]

三つのタスクの優先度,各タスクを単体で実行した場合の処理装置(CPU)と入出力装置(I/O)の占有時間は,表のとおりである。優先順位方式のタスクスケジューリングを行うOSのもとで,三つのタスクが同時に実行可能状態になってから,タスクCが終了するまでの間に,タスクCが実行可能状態にある時間は延べ何ミリ秒か。ここで,各タスクの入出力は並行して処理が可能であり,OSのオーバヘッドは無視できるものとする。

FEdf

ア. 5  イ. 2   ウ. 8 エ. 11

正解「
優先順位方式のスケジューリングでは,現在実行中のタスクよりも優先度の高いタスクが投入されると,現在実行中のタスクはプリエンプションされ,投入されたタスクが実行されます。三つのタスクが同時に実行可能状態になったので,最も優先度の高いタスクAが最初に実行状態となります。この前提で各タスクのタイムチャートを作り正解を求めます。

kj3000-12a-32-02

—————————————————-参考文献—————————————————-

「キタミ式イラストIT塾 基本情報技術者, きたみりゅうじ(著)」

「絵で見て覚える基本情報技術者, 大滝みや子(著), SE」