基本情報技術者試験 誤り制御の実施方法

この記事では、基本情報技術者試験を受けようとされている方に向けて、
誤り制御の実施方法に関する内容の解説します。

基本情報技術者試験では比較的出題例が多い分野となろので、
しっかり勉強しておきましょう。

誤り制御とは

コンピュータ間通信の途中で失われた情報や壊れた情報を検知し、適切な状態に修正することを指します。コンピュータ間通信では必ずエラーが発生するため、誤り制御が必須となります。

誤り制御の手法


以下では、試験で出題されたことがある各種のメモリの誤り制御方式を解説します。

パリティチェック


パリティチェックは、データに対してパリティビットと呼ばれる検査用のビットを追加することで誤りを検知する方法です。発生する主な誤りは、データビット列中の0と1が誤って送付されることであるため、パリティビットによりデータビット列の0と1の組み合わせが正しいものであるかを確認する手法が有効です。

パリティチェックはその方法により、奇数パリティと偶数パリティ、および垂直パリティと水平パリティに分かれます。

奇数パリティと偶数パリティ


対象となるビット列の1の個数が奇数である場合にパリティを0にするのが奇数パリティであり、対象となるビット列の1の個数が偶数である場合にパリティを0にするのが偶数パリティです。

これらの方法では1ビットの誤りは偶奇が逆になるので検出できますが,ビット位置の特定はできません。また,2ビット誤ると偶奇が誤る前と同じになるため,誤りの検出はできません。

垂直パリティと水平パリティ


垂直パリティはデータのビット列を一定ブロックごとに分けて並べたうえで、
垂直方向に対してパリティビット(奇数パリティか偶数パリティ)を設ける方法です。
水平パリティは同様にビット列を一定ブロックごとに分けて並べたうえで、
水平方向に対してパリティビットを設ける方法です。

どちらか1つの方法だけであれば,奇数パリティと同じように
偶奇の違いで誤りを検出できません。

水平パリティと垂直パリティを併用することによって,
1ビットの誤りと訂正ができるようになります。

チェックサム


各項目の合計値をたし,その結果をデータとともに記録しておきます。データを読み出すときも,同じ計算をし,合計と違っていたら,データが誤って記録されたと判断できます。

ハミング符号方式


ハミング符号方式では、2ビットの誤りを検出でき,1ビットの誤りは訂正できます。

パリティビットを複数つけることによって、誤りを検知できる量を増やします。

パリティチェックでは、ビット列に誤りの有無しかわかりませんでしたが、ハミング符号方式では複数のパリティビットによりデータのどこに誤りが生じたかまで特定できます。これによって、誤り検知時に再送要求をする必要がなく、受信側でデータを訂正でき、効率的な通信を実現できます。

CRC(Cyclic Redundancy Check, 巡回冗長検査)


CRCは、ビット列を生成多項式で割った余りを算出して相手に送付ことによって、パリティチェックなどの方式よりも多くのビットの誤りを検知できるようにした方法です。

CRC符号は誤り検出用の符号であり、正しい値へ訂正する機能はありません。

参考文献

基本情報技術者試験 アクチュエータ

問題

アクチュエータの機能として,適切なものはどれか。

ア キーボード,タッチパネルなどに使用され,コンピュータに情報を入力する。

イ アナログ電気信号を,コンピュータが処理可能なディジタル信号に変える。

ウ コンピュータが出力した電気信号を力学的な運動に変える。

エ 物理量を検出して,電気信号に変える。

解説


コンピュータが出力した信号を機械的な動作に変えるものをアクチュエータ(作動装置)と総称します。なのでウが正解です。

actuate(作動させる)にor(するもの)をくっつけたのが、アクチュエータなので、
直訳すると作動させるものとなります。

直訳通り、アクチュエータとはエネルギー供給によって回転運動を行ったり、精密制御を加えたり等機器を動かすためのデバイスです。

動力源+動力源を任意の信号へと変換する回路+機械的要素を備えています。

動力源には電気や油圧などが使われています。

アクチュエータの使用例

  • ワイパーの往復運動
  • ドアの開閉
  • ロボットの関節動作
  • 医療機器
  • ゲームのコントローラの振動   等

他の選択肢の解説

ア キーボード,タッチパネルなどに使用され,コンピュータに情報を入力する。
→ 入力デバイス

イ アナログ電気信号を,コンピュータが処理可能なディジタル信号に変える。
→ アナログ-デジタル変換回路

エ 物理量を検出して,電気信号に変える。
→ センサー

参考文献

JavaScript 論理演算子 AND OR

本記事では論理演算子のAND、OR演算子を紹介します。

論理演算子

論理演算子は基本的に真偽値を扱う演算子です。

AND演算子は両辺の演算子がどちらも、trueであればtrueを返し、そうでなければfalseを返す、OR演算子は両辺の演算子がどちらも、falseであればfalseを返し、そうでなければtrueを返すという演算子です。

AND演算子(&&)

AND演算子(&&)は、左辺の値の評価結果がtrueに変換できるならば、
右辺の評価結果を返します。
一方で、左辺の値の評価結果がfalseに変換できるならば、
右辺は評価されること無く、左辺の値がそのまま返されます。

このような値が決まった時点でそれ以上評価しないような評価のことを
短絡評価(Short-circuit evaluation)と呼びます。

// 左辺はtrueであるため、右辺の評価結果を返す
console.log(true && true); //true
console.log(true && false); //false
// 左辺がfalseであるなら、その時点でfalseを返す。 右辺は評価されない
console.log(false && true); //false
console.log(false && false); //false

また、AND演算子は左辺を評価する際に、左辺を真偽値へと暗黙的な型変換をしてから判定します。 真偽値への暗黙的な型変換ではどの値がtrueでどの値がfalseになるかは、次のルールによって決まります。

falsyな値はfalseになる

falsyでない値はtrueになる

falsyな値とは以下の値のことを言います。

  • false
  • undefined
  • null
  • 0
  • -0
  • 0n
  • NaN
  • ""や''や``(空文字列)

trueへと変換される値の種類は多いため、falseへと変換されない値はtrueとなると考えておけば十分だと思います。 このオペランドを真偽値に変換してから評価するのはAND、OR演算子で共通の動作です。

次のように、AND演算子(&&)は左辺を真偽値へと変換した結果がtrueの場合は、右辺をそのまま返します。 左辺がfalsyの場合は、右辺は評価されず、左辺がそのまま返されます。

// 左辺はfalsyではないため、評価結果として右辺を返す
console.log(true && 'hello'); //hello
console.log('other' && 'hello'); //hello
// 左辺がfalsyであるため、評価結果として左辺を返す
console.log(false && 'hello'); //false
console.log(undefined && 'hello'); //undefined
console.log(null && 'hello'); //false
console.log(0 && 'hello'); //0
console.log(-0 && 'hello'); //-0
console.log(0n && 'hello'); //On
console.log(NaN && 'hello'); //NaN
console.log("" && 'hello'); //空文字列

AND演算子の利用例

論理演算子は、if文と組み合わせて利用することが多い演算子です。

例1

次のように、numberが3で割り切れかつ 5で割り切れる場合という条件をひとつの式として書くことができます。

let number = 15;
if (number % 3 == 0 && number % 5 == 0) {
    console.log(number);
}

// if文のネストで書くと以下のようになる let number = 15; if (number % 3 == 0) {     if (number % 5 == 0) {         console.log(number);     } }
//出力 15

AND演算子(&&)を使うと、if文のネストに比べて短く書くことができます。

なお、このときに、numberが3で割り切れない(例えば5等の)場合は、その時点でif文の条件式はfalseとなります。 そのため、AND演算子(&&)の右辺は評価されずに、if文の中身も実行されません。

例2

let password = "123456";
if (password  && password.length < 8) {
    console.log('パスワードは8文字以上で入力してください。');
}

この例では、passwordのlengthプロパティを確認し、8よりも小さければエラーメッセージを設定しています。

変数passwordに格納された文字列の長さを見ています。

なので、やりたいことだけを書くと、以下のようなプログラムになりそうです。

if (password  && password.length < 8) {
    console.log('パスワードは8文字以上で入力してください。');
}

ただし、この書き方はよくないです。

これはJavaScript以外の言語にもいえますが、
オブジェクトのpropertiesを参照する時には、そのオブジェクト自体が
nullやundefinedである可能性を考慮しなければいけません。
(厳密な言い方をすると、nullやundefinedはプリミティブだから、
propertiesを持てないのですが、本記事では詳細を割愛します。)

つまり、以下のような書き方をした時に、
エラーが発生し、プログラムが終了してしまいます。

let password;
if (password  && password.length < 8) {
    console.log('パスワードは8文字以上で入力してください。');
}

// 出力 // Error evaluating Javascript output:  TypeError: Cannot read properties of undefined (reading 'length')

上記の例ではpasswordは宣言されただけで、何も値が代入されていません。

そのため変数passwordの中身はundefinedになっているのですが、

if分の中ではpassword.lengthという形で、passwordのpropertiesを呼び出しています。

当然undefinedにはlengthという名前のpropertiesはありません。

そのため、エラーが生じてしまうのです。

それを防ぐために、

password &&

という記載を追加します。

つまり、passwordに値が代入されていない場合は、
エラーが発生するプログラムが実行される前に、処理を打ち切ります。

passwordの中身がnullやundefinedだった場合には、
AND演算子の左側の値がfalseであるとみなされ、その時点で処理が打ち切られるので、
エラーが発生するpassword.lengthという処理が実行されません。

この書き方はよく用いられます。

OR演算子(||)

OR演算子(||)は、左辺の値の評価結果がtrueに変換できるならば、そのまま左辺の値を返します。 一方で、左辺の値の評価結果がfalseならば、右辺の評価結果を返します。

// 左辺がtrueなので、左辺の値が返される
console.log(true || true); //true
console.log(true || false); //true
// 左辺がfalseなので、右辺の値が返される
console.log(false || true); //true
console.log(false || false); //false

また、AND演算子と同様に、OR演算子は左辺を評価する際に、左辺を真偽値へと暗黙的な型変換します。 次のように、OR演算子は左辺がfalsyの場合には右辺の値を返します。

// 左辺はfalsyではないため、左辺の値が返される
console.log(true || 'hello'); //other
console.log('other' || 'hello'); //other
// 左辺がfalsyなので、右辺の値が返される
console.log(false || 'hello'); //hello
console.log(undefined || 'hello'); //hello
console.log(null || 'hello'); //hello
console.log(0 || 'hello'); //hello
console.log(-0 || 'hello'); //hello
console.log(0n || 'hello'); //hello
console.log(NaN || 'hello'); //hello
console.log("" || 'hello'); //hello

OR演算子の利用例

例1

今までは1つの式に1つの演算子を使った例だけを紹介しましたが、多数の演算子を用いることができます。
let firstName = "";
let lastName = "mue"; let userName = "駆け出しエンジニア"; const name = firstName || lastName || userName || "Anonymous";
console.log(name); 
// 出力 mue

上記の例では、firstName、lastName、userNameの順に値を確認していき、trueに変換できるものがあれば、それ以降は評価されず、その値が出力されます。変換できるものが無ければ、Anonymousが出力されるようになっています。

例2

let obj = { test: 'test' };
obj = obj || {};
console.log(obj); 
 //出力 { test: 'test' } 
let obj ;
obj = obj || {};
console.log(obj); 
 //出力 {}

上記2つのコードの2行目をみてください。obj が未定義ならば、obj を生成され、すでに存在してる場合は、そのまま使うということをやっています。

なぜこんな紛らわしい書き方をするかというと、AND演算子の使用例でも述べたように、
オブジェクト自体がnullやundefinedである可能性を考慮しなければいけないからです。

変数に自分自身を代入する読みにくい変なコードなのですが、
初期値を指定する際などに、非常によく使われる書き方なので覚えておきましょう。

参考文献

・ITやWebに関する備忘録 IT / Web技術. JavaScriptのANDとOR【現場でよく使われる特殊な書き方】. <https://web.lingual-ninja.com/2019/07/javascript-and-or.html> (参照日2022年10月8日).
・JavaScript Primer. 演算子. <https://jsprimer.net/basic/operator/> (参照日2022年10月8日).
・ゼロプラスワン. JavaScript 論理演算子OR「||」の特殊な用法. <https://zero-plus-one.jp/javascript/javascript-logical-operators-or/> (参照日2022年10月8日).

Windows でnpmのnode_modulesを削除する方法

Windows11にローカルでインストールしたnode_modulesを
エクスプローラー経由での削除ができなくて困っていたので、
node_modulesを削除方法をメモとして残しておきます。

windowsでnode_modulesを削除ができない原因

結論からいうと、パスの長さが250文字以上をデフォルトで認識しないようになっているからです。

npmでは依存ライブラリをnode_modulesというディレクトリの中に保存しています。
ライブラリhogeが依存しているライブラリはnode_modules/hoge/node_modules/
の中に保存されます。この方式をとることで、使っているライブラリAとBが、
共通のライブラリCに依存している場合に、AとBが使っているCのバージョンが
異なっていても問題無くなります。

その代償として、ファイル数が増えています。
また、依存関係が深ければ深いほどファイルシステム上のパスも長くなっています。

LinuxやMacではパスが長くても問題ありません。
しかし、Windowsでは長いパスは、OSやファイルシステムは対応してますが、エクスプローラーやコマンドプロンプトが対応してません。

要するに、Windowsでは、ファイルパス名が長すぎて削除できないモジュールが
出てくるため、node_modules ディレクトリを削除できませんでした。

削除方法

削除方法としては、フォルダの共有化で一括削除する方法やnpm uninstall パッケージ名
で削除する方法等があるようですが、本記事ではより簡潔な方法を紹介します。

①windowsアプリのubuntuを立ち上げます。

②消去したいnode_modulesディレクトリまでcdコマンドで移動します。

③以下のコマンドを実行します。

rm -r node_modules

 rm(ファイルを削除する)コマンドに、オプションとして
 -r(ディレクトリを削除)をつけています。   

エクスプローラーは対応していないけれど、OS自体は対応しているので、
以上の方法で削除できるかと思います。 

参考文献

・Qiita @ryomoucmei. Windows10でnode_modulesをサクッと消す手順. <https://qiita.com/ryomoucmei/items/2b7c9494316976217ae7> (参照日2022年10月1日).
・Qiita @kusano_k. Windows 10でnpmのnode_modulesを削除する方法. <https://qiita.com/kusano_k/items/570b6442780538b83a41> (参照日2022年10月1日).
・Monaural. Windows環境下でローカルインストールされたnpmモジュールを一括削除する. <https://ka2.org/delete-local-installed-npm-modules-into-windows> (参照日2022年10月1日).

人気の投稿