基本情報技術者試験を受けようと思う。
概要
基本情報技術者試験(FE)を受ける決意を固める。
動機
なんだかんだで自分も情報工学の学生であるわけで、やはりIT業界で有名な資格試験の一つや二つくらいは欲しいと思うわけである。そこでとりあえずは無難に基本情報技術者からとってみようと思ったのだ。
内容
このカテゴリーは個人的な日記なのでかなりざっくり書く。
令和3年の春季試験で基本情報技術者試験を受けようと思う。対策は参考書1冊よんで、過去問を解くというシンプルな方法。
参考書として
柏木先生の基本情報技術者教室というのを買ってきた。内容をぱらぱらと眺めてみたが、よくまとまっていて、章ごと細切れで問題に取り組めるのでいい感じだ。
過去問は何かしら本を買わなければならないか、と最初思っていたが調べてみるとIPAのHPに過去問と解説、講評が載っていたので、買わずに済むかもしれない。
ほかに特筆することはないが、強いて言うなら試験が終わるまでは、「基本情報技術者試験」というワードをネットで検索しないように気を付けることくらいか。ネット上では試験対策のモチベを下げるような情報がウヨウヨしているので。
ということでぼちぼち進めて進捗があればまた日記を書こうと思う。
まとめ
基本情報技術者試験を受けることにした。
ユークリッドの互除法を思い出して実装する
概要
ユークリッドの互除法をC++で実装する。ユークリッドの互除法は数の大きい2数の最大公約数や、3数の最大公約数を求めるなどの場面で便利に使える。
なお、この記事でユークリッドの互除法自体の証明とかはやらないので注意。
動機・経緯
アルゴリズムの講義でユークリッドの互除法を思い出しておいてねと言われたので復習。以前ABCでそういった問題を解いた記憶があったのでプログラムを漁って持ってきた。
内容
ユークリッドの互除法の手法
片方の数を割った余りをもって割った数を割る。これを繰り返す。余りは試行するほどに小さくなっていくので必ずいつかは終わる。余りが0になったら終了。機械的に実行できるのでプログラムの実装はかなり簡単。
プログラムの実装
実装はシンプル。二つの数を受けて
プログラム(C++)
#include <iostream> using namespace std; int main(){ int ia,ib,iSurplus; cin >> ia >> ib; //二つの数を受ける。 iSurplus = ia % ib; //剰余 を求める while(iSurplus != 0){ //剰余が0になるまで続ける。 ia = ib; ib = iSurplus; iSurplus = ia % ib; } cout << ib << endl; //剰余 が0になったら最後に割るのに使った数を出力する return 0; }
実行結果
C:\Users\horis\Desktop>g++ -o Euclid Euclid.cpp -Wall -Werror C:\Users\horis\Desktop>Euclid 2020 ← 入力1 856 ← 入力2 4 ← 出力
3数の最大公約数を求める
以前ABCで出題された問題。3数の最大公約数を求めている。方法としては先にの2数の最大公約数を計算して、その最大公約数との最大公約数を計算することで全体の最大公約数を求めている。
プログラム
#include<iostream> using namespace std; int main (){ int K,surp,temp,sum,save_a,save_b,save_c; sum = 0; cin >> K; for(int a = 1;a<=K;a++){ for(int b = 1;b<=K;b++){ for(int c = 1;c<=K;c++){ save_a = a; save_b = b; save_c = c; surp = a%b; while(surp!=0){ a = b; b = surp; surp = a % b ; } //bにaとbの最大公約数が入っている if(b<c){ temp = b; b = c; c = temp; } surp = b%c; while(surp!= 0){ b = c; c = surp; surp = b%c; } //ここでcにb,cの最大公約数が入っている sum = sum+c; a = save_a; b = save_b; c = save_c; } } } cout << sum<<'\n'; return 0; }
実行結果
C:\Users\horis\Desktop>g++ -o gcd gcd.cpp -Wall -Werror C:\Users\horis\Desktop>gcd 2 ← 入力 9 ← 出力 C:\Users\horis\Desktop>gcd 200 ← 入力 10813692 ← 出力
まとめ
ユークリッドの互除法を利用することで、最大公約数を簡単に求められる。また、ユークリッドの互除法自体が、機械的であるのでプログラムによる実装も簡単である。
コンピュータの性能評価(MIPS , CPI)の計算練習
概要
コンピュータやプログラムの性能評価指標、具体的にはMIPSやCPI、プログラムの改善度の基本的な計算例題とその解き方を示す。問題は基本情報技術者とか応用情報技術者試験のものをそのまま引っ張ってきたり、改題したりしている。(IPA曰く、出典を示せば許諾は取らなくていいらしい)
評価基準を正しく使って計算することが今回の目的なので、解法・解説がややくどい感じになっている点ご留意いただきたい。
動機
以前「プロセッサの評価方法まとめ」という記事を書いたのだが、肝心の計算演習をおざなりにしていた感があったので、ここで簡単な計算練習をしておこうと思った。
内容
例題1
以下の表のとおり、コンピュータAとコンピュータBの2台のコンピュータがある。それぞれのMIPS値を計算し、計算したMIPS値によって性能を比較せよ。なお、2台のコンピュータにおいては命令セットが同一のものであることが保証される。(応用情報技術者試験平成24年春期午前問12を改題)
クロックサイクル周期 | CPI | |
---|---|---|
コンピュータA | 1ナノ秒 | 4.0 |
コンピュータB | 4ナノ秒 | 0.5 |
解答・解説
プログラムの実行時間をS , クロック周波数を , 実行命令数を , クロックサイクル時間を とすると、
と表される。
①を変形して、
これを②に代入する
コンピュータAにおいて , であるので、MIPS値は
コンピュータBにおいて , であるので、MIPS値は
よってこのプログラムの実行において、コンピュータBはコンピュータAの2倍の処理性能を持つといえる。
例題2
クロック周波数が1GHzのCPUがある。このCPUの命令種別が、表に示す二つから成っているとき、処理能力は約何MIPSか。(基本情報技術者試験平成20年春期午前問19)
命令種別 | 実行時間(クロック) | 出現頻度(%) |
---|---|---|
命令1 | 10 | 60 |
命令2 | 5 | 40 |
解答・解説
この計算をするために、まず、CPIを求める。
CPIは命令の実行に必要なクロック数の平均値で、プログラムによって異なる。プログラムに 種類の命令が使われており、i 種類目の実行クロック数を , そしてその i 種類目の命令が出現する回数を とするとCPIは一般的に次のように与えられる。
しかし、本問のようにすでに出現頻度が与えられている場合(ここでは i 種類目の出現頻度を%としよう)、
で計算できる。
以上を利用して、CPIを計算する。
ここで例題1の要領で、MIPSの式
にプログラム実行時間Sの計算式
を代入する。すると、
ここで、クロック周波数 , を代入する。結果として、
とMIPS値が求まる。
例題3
あるコンピュータを並列化によって高速化することに成功した。改善前のあるプログラムにおける実行時間は100秒であった。そのうち90%は改善の影響を受けたが、10%は影響を受けなかった。改善の影響を受ける部分に関しては9倍の高速化が実現された。全体の改善度はいくらか。(IT Text コンピュータアーキテクチャ演習問題1-5を改題)
解答・解説
コンピュータの性能改善に関してはアムダールの法則を用いる。並列化による改善度はプログラムの実行時間の比で表すことができる。高速化の影響を受ける前のプログラムの実行時間を , 高速化の影響を受けた後のプログラムの実行時間を とすると、改善度は
とあらわされる。
ここで高速化の影響を受けた後の実行時間に着目したい。
アムダールの法則の主張は並列化によるプログラムの速度向上は、逐次処理部分(つまり並列化できない部分)には及ばず、改善可能な部分に制限があるということである。
この主張に従って、を改善可能な部分と改善不可能な部分に分ける。
改善可能なプログラムの割合を , また、改善可能な部分に関しての改善度を とすると、
とあらわされるので、全体の改善度の式は
となる。問題文より , , であるので、全体の改善度は
となる。
まとめ
CPIを用いたプログラム実行時間の表現、MIPSの定義など、その指標が何を示しているのかを理解しながら計算を進めることが重要だろう。
参考文献
シェル操作メモ1
概要
Linux、bashによる基本的なコマンドライン操作をまとめている。説明や実行例は省き、チートシート的に参照することを想定している。Linux教科書を参考にしている都合上、網羅的ではないのでご注意を。オプション類もざっくりしか書かない。まぁ、詳しい説明はマニュアルを参照すればいい話なので。
動機
単なるメモ書き。画面の端に置いといてチラチラ見るためのチートシートが欲しかった。
内容
・ディレクトリの移動
cd (移動先)
また、ルートディレクトリやホームディレクトリなどは以下のように指定できる。
ルートディレクトリ /
ホームディレクトリ ~
カレントディレクトリ .
一つ上のディレクトリ ..
・名前入力の補完
長いファイル名などを入力するとき、入力途中でTabキーを押すとファイル名が補完される。Tabキーを押した時点でファイル名が一つに特定されないときは重複しているファイル名の共通部分だけが補完される。
・カーソル移動
ctrl + A 行頭へ ctrl + E 行末へ ctrl + H カーソルの一つ前を削除 ctrl + D カーソルの一つ先を削除 ctrl + C 処理の中断 ctrl + S 画面出力の一時停止 ctrl + Q 画面出力の再開 ctrl + Z 処理のサスペンドする ctrl + L 画面をきれいにする clearとだいたい同じ
変数の定義と削除
変数名=値
変数を定義できる。=の前後でスペースを入れてはいけない点に注意する。
export 変数名
シェル変数を環境変数にできる。
unset 変数名
変数を消去する。
・変数を参照する
echo $変数
変数の中身を表示する。
echo '文字列'
画面に文字列を出力する
echo "文字列"
echo "$変数名"
ダブルクォーテーションでくくると、文字列の時はそのまま文字列が出力されるが、変数が含まれているときは変数の中身を展開して表示する。
env
printenv
環境変数を一覧表示する
set
シェル変数と環境変数の両方を表示する。
・コマンドを続けて実行する
コマンド1;コマンド2
コマンド1を実行し、そのあとにコマンド2を実行する。
コマンド1&&コマンド2
コマンド1を実行し、成功したらコマンド2を実行する。
コマンド1 || コマンド2
コマンド1を実行し、失敗したらコマンド2を実行する。
・コマンドの履歴を参照する
history
コマンド操作の履歴を確認する
!番号
historyで対応している番号を入力することにより、そのコマンド操作を再度行う。
・マニュアルを参照する
man 参照したいコマンド名、キーワード
指定したコマンド、キーワードのマニュアルを参照できる
オプションで -aを指定するとすべてのセクションを検索し、 -f を指定するとwhitisコマンドと同等、-k を指定するとaproposコマンドと同等になる。
whatis 参照したいコマンド名、キーワード
指定したキーワードと完全一致するマニュアルを検索する
apropos 参照したいコマンド名、キーワード
指定したキーワードを含むマニュアルを検索する
ls ディレクトパス
指定したディレクトリに存在するファイル、サブディレクトリを表示する。オプションで-a を指定すると . から始まるファイルも含めて、-dで指定したディレクトリを含めて、 -i でiノード、-t で時間を含めて、 -F でファイルの種類も含めて、 -l で詳細な情報も含めて、一覧表示する。ほかにもいろいろオプションがある。
・コピーする
cp オプション コピー元 コピー先
コピー元のファイルをコピー先にコピーする。オプションで -f をつければ同名ファイルに上書き、 -r をつければディレクトリを再帰的にコピーする。ほかにもいくつかオプションがある。
・ファイルを移動する
mv オプション 移動元 移動先
指定元を指定先に移動する。移動元と移動先が同一ディレクトリであれば元ファイルの名前が変わるだけなので、名前の変更にもよく用いられる。オプションで -f をつければ同名ファイルに上書き、 -i を指定すると上書きの際に確認を求めるようになる。
・ディレクトリの作成
mkdir オプション ディレクトリ名
シンプル。指定した名前で空のディレクトリを作成する。オプションで、-m を指定するとアクセス権を指定でき、-p を指定すると親ディレクトリも同時に作成できる。
・ディレクトリの削除
rmdir オプション ディレクトリ名
空のディレクトリを削除する。オプション -p で複数階層まとめて削除できる。ただ、空でないディレクトリは削除できないので注意したい。
rm オプション ファイル名あるいはディレクトリ名
ファイル・ディレクトリを削除するコマンド。オプションで -r を指定すればディレクトリも削除できる。-f で確認なし、-i で確認して削除する。安全を考えれば -i を指定して運用するのがよいだろう。
・ファイルの作成、タイムスタンプの変更
touch オプション ファイル名
タイムスタンプを変更する。でもファイルを作成するのにも使える。便利。オプションで -t を指定すると、指定した時間にタイムスタンプを変更できる。 -a だとアクセス時間だけ、 -m で修正時間だけ変更する。
・ファイルの種類を確認する。
file ファイル名
指定したファイルの種類を確認する。通常はcatする前にfileでファイルの種類を確認するのが良いとされている。(らしい)
ファイルの中身を表示する
cat ファイル名
指定したファイルの中身をのぞき見れる。オプションで -n を指定すると行番号も付与できる。よく使う。
・テキストの一部を見る
nl オプション ファイル名
テキストの一部を参照、あるいはすべてに行番号を付与して表示できる。オプションで形式と選択範囲を指定できる。
head オプション ファイル名
ファイル先頭部分を表示する。-n オプションを指定して、行番号を与えれば指定行分だけ表示できる。 -c で指定バイト分だけの表示もできる。
tail オプション ファイル名
headコマンドの逆。末尾からの行数、バイト数を指定して表示できる。
cut オプション ファイル名
指定した文字数、区切り文字、フィールドを指定して取り出せる。 -c で文字数、 -d で区切り文字 -f でフィールドを指定できる。
・8進数、16進数で表示してみる
od オプション ファイル名
ファイルをいろいろな形式で表示できる。-c ではASCII、-o では8進数、 -x では16進数での表示になる。デフォルトでは8進数。
・ファイルを連結する
paste オプション ファイル名1 ファイル名2 ....
いくつかのファイルを読み込んで連結できる。-d オプションを指定すれば、区切り文字を指定できる。
・文字列の変換、削除
tr オプション 文字列 (文字列2)
文字列を変換したり、削除したりできる。-dオプションを指定すれば文字列と合致するものを削除できる。-sで連続する文字を1文字に圧縮できる。また、クラスを指定することで文字列の変換を行うことができる。
sed オプション コマンド ファイル名
オプションを指定してテキストストリームを編集できる。オプションコマンドをそれぞれ指定するが、-fオプションを付与すればあらかじめ書いておいたコマンドを使うこともできる。使い方がややこしいのでマニュアルの参照を推奨。
・文字列のカウント
wc オプション ファイル名
ファイルの行数、単語数、文字数を表示数する。-c で文字数のみ、-l で行数のみ、-w で単語数のみの出力にもできる。
・ハッシュ関数
md5sum ファイル名
sha1sum ファイル名
sha256sum ファイル名
sha512sum ファイル名
ファイルのハッシュ値を取得できる。ハッシュ値はすこしのファイル編集でも大きく変化するため、ファイルが改ざんされていないことを示す証明につかえる。
・文字列検索
grep オプション 検索パターン
入力ストリームの中から検索パターンに合致するものを表示できる。表示するものに関してはオプションで色々変えられる。一応検索パターンの後にファイル名を指定すればファイル内を検索することもできる。まぁでも使い方としてはlsやcatの出力をパイプして吐かせるのが一般的だろう。
・長い文章を眺める。
less ファイル名
長いファイルの中を参照したりできる。manで標準になっているもので、moreの上位互換。一般的な利用法としては入力ストリームをパイプして吐かせる方法。catやlsなどの出力を渡す。操作は以下のように行う。
k 上方向に1行スクロール j 下方向に1行スクロール b 上方向に1画面スクロール f 下方向に1画面スクロール q 終了 /文字列 下方向で入力した文字列を検索する ?文字列 上方向で入力した文字列を検索する h ヘルプ
まとめ
bashには便利なコマンドがたくさん備わっている。
ここに乗せているコマンド以外にもたくさんコマンドがある。詳しい説明はmanでマニュアルを検索して調べよう。
参考文献
Linux教科書 LPIC level1 version5.0対応 3章
Razerのキーボード買ったけど。。。。
概要
Razer Huntsman Tournament Editionを手に入れたので簡単なファーストインプレッションでも。
動機・経緯
パソコンを1台追加したので、それに伴ってキーボードが追加で1台必要になった。普段はFilcoのmajestouch2サイレント赤軸モデルを愛用しているので、それを買い足そうと思ったのだが、あいにくドスパラでは扱ってなかったので、条件の中でもっとも信頼がおけそうな製品ということで、本キーボードを購入した。キーボードを買う条件としては毎回
・メカニカル(リニア)か東プレスイッチ
・US配列
・テンキーレス
を条件としている。
内容
あくまで文字入力のためだけに使うので、今回は文字入力にのみ限定して感想を述べる。
外観はシンプル。光りこそするが、デザインはいわゆるゲーミング感があまりなくてなじみやすい。ライティングもそこまで派手ではないので、目に入ってもあまり邪魔にならない。
キーに関して、まずは荷重が軽い。調べたところ荷重40gとのこと。普段使っているのが45gであるが、5gでここまで軽くなるのか、というくらい軽い。
このキーに関してRazerが推しているのが作動距離が短くて入力が高速であるということ。しかし、これに関してはあまり良い印象を受けなかった。というのも、誤入力が増えたからだ。これは自分だけの問題かもしれないが、キーを打つときに隣のキーに指の先や爪が触れる時がある。通常のキーボードではキー荷重がそこまで軽くないし、作動距離もそこそこ長いので問題ないのだが、このキーボードだとそれだけで意図しない入力が発生してしまう。困る。
また、キーボードそのものの形状もあまり感触がよくない。ここでいうキーボードの形状とは、キーの階段の角度のことを言っている。自分はゲーマではないので、どういう事情でこういう形状になっているのかわからないが、とにもかくにもキー配列の傾斜が緩すぎるし、最下段のキーが高すぎる。これのせいでタイプしていて非常に疲れてしまう。
最後、ドライバに関してはよく出てきている。logicool(logitech)のg-hubのような不具合も今のところないし、操作も直感的である。ライティングを細かく調整するのも容易だと感じた。
以上勘案して、Razer Huntsman Tournament Editionは文字入力しか行わない自分にとってはあまり感触がよくなかった。
しかし、これらの形状はゲーマのために最適化されたもののはずだし、ゲームをしている人が触るとまた違う感想を持つのかもしれない。馴れの要素も大きいはず。そこらへんも踏まえて、あくまで一意見としてとらえてほしい。
まとめ
Razer Huntsman Tournament Edition買ったけど、自分にはあまり刺さらなかった。。。。。。
MX Linuxを導入する
概要
2020/09/25現在DistroWatchのランキングで最も上位にいるLinuxディストリビューションである、MX Linuxを導入する。ISOイメージをUSBメモリに焼いて、実家から持ってきたデスクトップパソコンにインストールする。
動機・経緯
前回、過去に自分が設定したパスワードによってUEFI設定画面へのログインを阻まれるというトラブルに見舞われた。幸いにして無事解決したので、今回はMX Linuxを導入したい。
Linuxの環境が必要になったときはいつもLinux Mintを使っているのだが、たまには冒険をするのも大切だろうと思うので、流行のLinuxディストリを試すことにする。
そんなに難しいことをするわけではないのでササっと済ませたいところ。
準備物
・Windows環境 (今回はwindows10を使う)
・USBメモリ (4GBくらいあれば十分)
・おやつ+コーヒー(待ち時間を有効に使うため)
内容
まずは、ISOイメージを手に入れるところから始める。MX LinuxのHPにアクセス。
"Download"ボタンを押すと、ダウンロードページに飛ぶ。
"Direct Repo"をクリックして、"Download Latest Version"をクリックすると、ダウンロードが始まる。この記事を書いている段階での最新版は、
"MX-19.2_September_x64.iso"だった。大きさは1.8GB。
当方、家のインターネット回線があまりに低速なため1GBを超えるダウンロードは大変時間を要する作業となる(30分くらい)。この待ち時間の間に、先ほど固めていた杏仁豆腐をいただくことにしよう。
おいしい。。。
ついでにUSBのフォーマットもやっておく。
USBへISOイメージを焼くのに、UNetBootinを使うので、持っていない場合にはダウンロードしておくとよいだろう。MX Linuxに限らずISOイメージを焼くときには何かと重宝する。ダウンロードリンクは↓
ISOイメージのダウンロードが完了したら、UNetbootinでファイルとUSBメモリを選択して、焼いていく。
これも時間がかかるので気長に待つ。
完了したら、USBメモリを取り出して、インストールするコンピュータにさしかえる。
USBメモリからOSをbootするには、BIOSの設定画面からブート時に使うドライバの優先度を入れ替える。USBメモリを最優先にすればUSBメモリに焼いてあるMXLinuxが立ち上がる。
Boot Option PrioritiesでUSBメモリを最上位に。
ここで、 "not a COM32R image" と怒られて入力を求められるが、liveと入力してenter。これで問題なく起動できる。
起動したら、デスクトップ上のインストーラーをクリック。指示に従って入力をしていく。すべての設定が済んだら再起動を求められるので、おとなしく再起動しよう。
無事再起動できた。以上がMX Linuxの導入手順となる。
今後はしばらくこのディストリビューションを使ってみようと思う。
まとめ
・杏仁豆腐おいしい。
BIOSのパスワードを忘れた。
概要
ずいぶん前に自作したWindowsPCのBIOSパスワードをなんとか思い出したかった。
が、しかし無理だったのでcmosの中身を吹っ飛ばす。
動機
Linuxのプログラミング専用機として使うべくして、自宅から5年ほど前に組んだwindowsPCを持ってきた。久々にスイッチを押したら無事起動し、windows8.1が立ち上がった。そこまではよかったのだが、いざLinuxを焼いたUSBを挿してBIOS画面に入ろうとしたらパスワードを求められた。当然biosのパスワードなんて完全に忘れたので、設定したパスワードを忘れていただくことにした。
バンッ!!!(机を叩く音)
内容
Biosの情報はマザーボードのCMOSメモリに保存されている。CMOSメモリをリフレッシュするため、マザボ上にはボタン電池が入っている。今回はボタン電池を外しcmosメモリを放電させることで、パスワードを含めたbiosの設定を忘れていただく。
注意点として、この方法はbios設定がcmosメモリのみに記憶されていることを前提としている。調べたところによると、メーカーによってはcmosメモリの内容がEPROMなどの不揮発性メモリにも書かれていることがあるらしい。この場合は今回のようにcmosメモリをクリアするだけでは、設定を消去できない。
まず、電源ケーブルを抜いてカバーを外す。配線が汚いことには目をつむってほしい。
グラフィックボードの後ろにボタン電池がちらっと見える。ささっと作業を終えたいところだったが、グラフィックボードを外す必要がありそうだ。
グラフィックボードを外すと、ボタン電池が完全に見えるようになったので外す。
横のツメを押してやれば簡単に外れる。まぁでもこれはマザーボードのメーカにもよるだろう。マザボによっては簡単だったり、反対に外しにくかったりするかも。
この後は基本、しばらくはCMOSメモリに蓄えられた電荷が逃げるまで放置する。
この間に電源ボタンを連打したり、ドライバなどの導体で端子に触れたりして放電を促してみるのもよいかもしれない。
待っている間は暇なので、辛そうなラーメンでも食べてみるか。
グハ゛ァ゛ア゛!か゛ら゛い゛!!!!
しばらく待ったら、(自分の場合は1時間後くらいに)ボタン電池とかグラボとか元に戻して、起動する。
うまくいったようだ。
無事、パスワードを求められることなくbios画面にたどり着くことができた。
まとめ
・ボタン電池を外してcmosメモリの内容を揮発させることで、パスワード含め設定を消去できる。
・辛ラーメンはからい。