2020年9月28日月曜日

JavaScript学習 入門

JavaScriptの勉強をしたので、中で役に立ちそうな記載例をまとめておきます。

標準出力のしかた



 process.stdin.resume();
 process.stdin.setEncoding('utf8');

 //改行なし標準出力
 process.stdout.write("hello world");

 //改行あり標準出力
 process.stdout.write("hello world\n");

 //改行あり標準出力
 console.log("hello world");


変数の宣言


 process.stdin.resume();
 process.stdin.setEncoding('utf8');

 var apple = "りんご";
 var num = 3;

 console.log(apple + "が");
 console.log(num + "個");



ランダムな値を出力



 process.stdin.resume();
 process.stdin.setEncoding('utf8');

 //0~9のランダムな数字を出力
 var randnum = parseInt(Math.random() * 10);

 console.log(randnum);



if文による条件分岐


 process.stdin.resume();
 process.stdin.setEncoding('utf8');

 var num = parseInt(Math.random() * 10);

 //5以上ならOK
 if(num >= 5) {
     console.log(num + " OK");
 } else {
     console.log(num + " NG");
 }



現在の年を表示する


 process.stdin.resume();
 process.stdin.setEncoding('utf8');

 //現在の西暦を取得する
 var today = new Date();
 var seireki = today.getFullYear();

 console.log("西暦" + seireki + "年");



while文を使った繰り返し


 process.stdin.resume();
 process.stdin.setEncoding('utf8');

 var count = 0;
 while (count < 10) {
     console.log(count);
     count = count + 1;
 }



標準入力のデータを出力


 process.stdin.resume();
 process.stdin.setEncoding('utf8');

 var input_string = "";

 //標準入力から受け取り
 var reader = require('readline').createInterface({
     input: process.stdin,
     output: process.stdout
 });

 //入力文字列を代入
 reader.on('line', (line) => {
     input_string = line
 });

 //入力データを数値に置き換えて演算後に出力
 reader.on('close', () => {
     var input_int = parseInt(input_string)
     console.log(100 + input_int);
 });


標準入力のデータを配列に格納して出力


 process.stdin.resume();
 process.stdin.setEncoding('utf8');

 var lines = [];
 var reader = require('readline').createInterface({
     input: process.stdin,
     output: process.stdout
 });

 //標準入力を1行ずつ配列に格納
 reader.on('line', (line) => {
     lines.push(line);
 });

 //配列の内容を出力
 reader.on('close', () => {
     console.log("hello " + lines[0]);
     console.log("hello " + lines[1]);
     console.log("hello " + lines[2]);
 });

配列の基本的な使い方


 process.stdin.resume();
 process.stdin.setEncoding('utf8');

 var poke1 = "ニャース";
 var poke2 = "ポッポ";

 var team = ["アーボ","マタドガス",poke2,"しゃべる" + poke1];
 console.log(team);


2020年9月25日金曜日

H26春ES午後2問2の解き方 工業用内視鏡

問題の感想

工業用内視鏡の問題です。


解答

  • 設問1

  • (1)(a)メモリーカードが装着されカバーが閉じていること
    (1)(b)ACアダプタから電力が供給されていること
    (1)(c)音声録音の有効無効の設定
    (2)(a)a:メニュー画面
    (2)(a)b:動画記録
    (2)(a)d:静止画記録
    (2)(a)e:表示
    (2)(b)c:キャプチャメモリの内容を圧縮
    (2)(c)メニューデータ表示、動画表示、静止画表示、動画再生、静止画再生
    (3)(a)コンフィグレーションデータが壊れる
    (3)(b)電源ON時に毎回書き込み処理を実行しないようにするため
    (3)(c)初期化処理でのシリアルフラッシュメモリへのデータ更新は、FPGAのコンフィグレーションデータの読み込みの完了を待ってから行うから

  • 設問2

  • (1)(a)入力:温度情報、カバー開閉情報
    (1)(a)出力:LEDのON又はOFF情報
    (1)(b)ACアダプタからの給電の有無、バッテリ残量
    (1)(c)カバー開、バッテリ残量不足、電源スイッチが押された
    (2)(a)5ミリ秒ごとにモータにパルスを出力する前
    (2)(b)0度センサONの期間の出力パルス数の半分だけ逆回転させる
    (2)(c)0.2

  • 設問3

  • (1)メモリカードへの記録中に、リモート制御モードへの移行指示を受信した
    (2)f:メイン
    (2)g:操作部I/F
    (2)h:リモート制御
    (2)i:遠隔操作者からの接続完了
    (2)j:表示制御
    (2)k:イメージ処理
    (3)操作部から捜査情報を無視し、リモート制御タスクからの操作情報をメインタスク又は湾曲部制御タスクに送信する

2020年9月24日木曜日

H28春ES午後2問2の解き方 資源探査用無人海底調査機

問題の感想

資源調査用無人探査機の問題です。


解答

  • 設問1

  • (1)a:設定深度に達した
    (1)b:浮上指示受信
    (1)c:位置通知受信
    (1)d:一定時間内に位置通知が受信できない
    (1)e:最後の通過地点到達
    (2)(a)スラスタ、速度センサユニット、深度センサ
    (2)(b)位置通知を受信し、現在位置が補正された
    (2)(c)データが地上局に到達する時間が遅れ、オペレータが適切なタイミングで制御要求によって指示できなくなる
    (2)(d)中継器との通信中断によるデータの欠落部分が検出できるようにするため
    (3)(a)0.25
    (3)(b)2.5

  • 設問2

  • (1)(a)f:深査計画情報
    (1)(a)g:深査開始
    (1)(a)h:深度計測
    (1)(a)i:深度計測開始
    (1)(a)j:位置通知
    (1)(b)測位タスク、自律航行タスク、情報管理タスク
    (1)(c)音響通信が中断中の時は送信要求を破棄する。
    (2)(a)位置通知、自律航行停止
    (2)(b)自律航行タスクから通過地点到達のメッセージを受信したとき
    (2)(c)情報送信要求
    (3)(a)測位タスクの優先度を、自律航行タスクの優先度より高くする
    (3)(b)測位タスクが現在位置情報を書き込みするために、現在位置情報の資源を獲得する前に自律航行タスクが位置通知を受信したとき
    (3)(c)自律航行タスクがメインタスクから受信して書き換えた現在位置情報を使用する前に測位タスクが書き換えてしまう

  • 設問3

  • (1)(a)動作中の送信を停止させるメッセージ
    (1)(b)主MPUが暴走をしていること
    (2)(a)不正な位置通知又は制御通知を受信し、不正な動作をすること
    (2)(b)メインタスクから、音響通信開始を受信したとき
    (2)(c)処理:回収ステップを実行する
    (2)(c)理由:位置通知を受信できないから

2020年9月23日水曜日

Python学習 関数

概要

Pythonの勉強の中で、関数に関する役に立ちそうな情報をまとめます。

自分で関数を作って定義する


 # coding: utf-8

 def say_hello():
     print("hello world")

 say_hello()
 say_hello()


関数を作って戻り値を返す


 # coding: utf-8

 def sum(x, y):
     return x * y

 num1 = sum(3, 4)
 print(num1)

 num2 = sum(300, 400)
 print(num2)


グローバル変数

関数内でグローバル変数を操作したいときは、global宣言を行います。

 # coding: utf-8

 message = "soto"

 def sum(x):
     global message
     message = message + "naka"
     return x

 print("1_" + message)
 num = sum(1)
 print("2_" + message)


関数のデフォルト値


 # coding: utf-8

 def introduce(name = "日本人"):
     print("私は" + name + "です。")

 #引数を指定した場合その値が採用される
 introduce("東京都民")

 #引数を指定しない時、デフォルトの引数が採用される
 introduce()


関数の引数をリストにして渡す


# coding: utf-8

#変数をリストにする場合は"*"をつける
def introduce(greeting, *names):
    for name in names:
        print("私は" + name + "です。" + greeting)

introduce("こんにちは", "青森県民", "秋田県民", "岩手県民")


関数の引数をディクショナリで渡す


 # coding: utf-8

 #ディクショナリ形式で渡すときは**をつける
 def introduce(**people):
     for name, greeting in people.items():
         print("私は" + name + "です。" + greeting)
     print(people)

 introduce(taro = "はじめまして", jiro = "こんにちは", saburo = "よろしくお願いします")

2020年9月22日火曜日

H24春ES午後2問2の解き方 電動介護ベッドシステム

問題の感想

電動介護ベッドシステムの問題です。


解答

  • 設問1

  • (1)(a)回転数:1600
    (1)(a)パルス数:4800
    (1)(b)10度~30度
    (2)(a)制御部が使用開始指示を受信してから使用終了指示を受信するまでの間に制御部の電源がOFF,ONされる状況
    (2)(b)利用者氏名を表示
    (2)(c)キーOFF情報を受信する前に稼働範囲制限になったこと
    (3)(a)背中DWキー、ひざ下UPキー
    (3)(b)θ2用モータ、θ3用モータ

  • 設問2

  • (1)(a)a:θ2がθ3の半分になったとき
    (1)(a)b:θ3がθ2の2倍になったとき
    (1)(a)c:Hが400mmになったとき
    (1)(b)d:0度
    (1)(b)e:背中UPキー
    (1)(b)f:背中DWキー
    (2)(a)操作部にRFID読取り許可を送信する
    (2)(b)g:モータ制御
    (2)(b)h:可動部位置
    (2)(b)i:LAN
    (2)(b)j:表示編集
    (2)(b)k:10秒タイマを開始

  • 設問3

  • (1)l:エンコーダタスクにモータの回転開始を通知した状態において、エンコーダタスクから取得したモータの動作量に変化がない
    (1)m:モータ制御タスクがエンコーダタスクに指示した回転方向と、エンコーダタスクから読み取った回転方向が一致しない
    (2)処理:疎通確認情報を一定周期で制御部に送信する
    (2)n:操作部からの疎通確認情報が一定時間以上届かない

2020年9月21日月曜日

Python学習 多次元リスト

概要

Pythonの勉強で多次元リストを学んだので情報をまとめます


リストの中にリストを入れると2次元リストになる


 # coding: utf-8

 team_a = ["ポッポ", "コラッタ", "プリン"]
 team_b = ["ビートル", "キャタピー", "トランセル"]
 team_c = ["コイキング", "オニスズメ", "ニドラン"]

 teams = [team_a, team_b, team_c]

 print(teams)
 print(teams[0])
 print(teams[1])
 print(teams[2])
 print(teams[2][0])
 print(teams[2][1])
 print(teams[2][2])


2次元リストの要素の更新、2次元リストの要素の数を表示


 # coding: utf-8

 teams = [["ポッポ", "コラッタ"], ["ビートル", "キャタピー", "コクーン"], ["トランセル", "オニスズメ", "ニドラン"], ["ピカチュウ"]]
 print(teams)

 teams[0][1] = "コイキング" #コラッタをコイキングに変更
 print(teams)

 print(len(teams)) #リストの長さ1次元目の長さ
 print(len(teams[0])) #リストの中のリストの長さ


2次元リストの要素の追加削除


 # coding: utf-8

 teams = [["ポッポ", "コラッタ"], ["ビートル", "キャタピー", "コクーン"], ["トランセル", "オニスズメ", "ニドラン"], ["ピカチュウ"]]
 print(teams)
 
 #2次元リストの要素を追加
 teams.append(["ズバット","ピッピ","イシツブテ"])
 print(teams)

 #2次元リストの要素を削除
 del teams[1]
 print(teams)

 #リストの中の要素を削除
 del teams[0][1]
 print(teams)


enumerate関数を使って、リストの何番目かを取り出す


 # coding: utf-8

 team = ["ヒトカゲ", "ゼニガメ", "フシギダネ"]

 for (i, person) in enumerate(team):
     print(str(i) + "番目の" + person)


forinを使ってリストを作成する


 # coding: utf-8

 num = [i * 2 for i in range(10)] #要素が10個の1次元リスト
 print(num)

 num2 = [[1 for i in range(3)] for j in range(4)] #3要素のリストが4個ある多次元リスト
 print(num2)

H22春ES午後2問2の解き方 野菜栽培工場システム

問題の感想

センサを使った野菜工場の問題です。記述式の問題の文字数が多く、難しかったです。

解答

  • 設問1

  • (1)a:200
    (1)b:2
    (1)c:7
    カメラユニットからの送信データは、ヘッダとペイロードを含めて20kバイトとあり、栽培室内のブロック数は全部で10ブロックなので、
    20kバイト × 10ブロック =200kバイト。 となります。
    各ユニットから送信されるデータはそれぞれ10バイト固定であり、ブロック外に5ユニット、ブロック内には10ブロック×5ユニットなので、
    10バイト × 55ユニット = 550バイト。 となります。なので1かなと思いましたが、正解は2みたいです。
    ポーリング周期は0.25秒なので、(200kバイト+2kバイト)×4=808kバイト/秒=6464kビット/秒。切り上げて7Mビット/秒となります。
    (2)(a)
    (2)(a)時間
    (2)(b)土壌水分養分センサユニット、温湿度センサユニット

  • 設問2

  • (1)f:センサ監視
    (1)g:出力ユニット制御
    (1)h:静的
    (1)i:再入
    (1)j:ブロックを示す番号
    後続のタスクによって変数の内容が上書きされる可能性がある変数の割り当て方として、アドレスを固定して割り当てる場合があります。それを静的に割り当てるといいます。なので、hの解答は「静的」となります。

    ブロックごとにタスクを生成する場合、同じ関数を別々に呼び出しても処理が動けるようすることを、再入可能(複数の呼び出し元から呼ばれても不具合がおきない)といいます。なのでiの回答は「再入」になります。

    一つの関数を複数の呼び出し元から呼び出す場合にそれぞれを区別する必要があります。ここではブロックごとに同じ関数を呼び出す可能性があるので、関数の引数にブロック番号を入れるのが効果的です。なのでjの回答は、「ブロックを示す番号」となります。
    (2)(a)栽培制御シーケンスに記載のない出力ユニットを手動モードで動かすとその動作が止まらなくなる
    自動モードから手動モードに切り替えるときに各出力ユニットの状態を保存しないと、自動モードに戻した後に発生する不具合について回答します。
    自動モードは栽培制御シーケンスに従って制御するのに対して、手動モードでは表示部と操作部を用いて手動で操作を行います。
    手動モードでは各ユニットに対して手動で処理を行うので、栽培制御シーケンスで処理を行っていないユニットを操作した場合に、手動で設定したままの状態が自動モードに遷移した後も残り続けることになります。それが可能性のある不具合になります。
    (2)(b)受信した場合:データ解析タスクからの制御指示
    (2)(b)受信しなかった場合:手動モード切替時の出力ユニットの状態

  • 設問3

  • (1)暗号化されたデータのデータ長
    (2)(a)データ解析タスクがフラッシュメモリをセマフォでアンロックし、複合タスクがロックする間に入出力管理タスクがフラッシュメモリに書き込んでいる。
    (2)(b)データ解析タスクと複合タスクの処理が行われる間は、入出力管理タスクのフラッシュメモリへの書き込みを抑止する。
    栽培制御シーケンスの書き込み処理と複合処理が競合した場合にまれに複合できない不具合が発生するらしく、その過程について問われています。
    セマフォの振る舞いについてまとめます。

    ・入出力タスクは、シーケンスを受信したとき、フラッシュメモリをロックして、データをに格納後、アンロックする。
    ・データ解析タスクは、フラッシュメモリをロックして、複合タスクに通知した後、アンロックする
    ・複合タスクは、フラッシュメモリをロックして、データを複合した後、アンロックする

    この説明を見るとセマフォの操作が怪しいように感じます。
    問題では書き込みと複合が競合した時とあり、複合タスクの処理が行われる前に、ほかのタスクにロックがされるケースがデータ問題の原因となります。

Python学習 ディクショナリ機能

概要

pythonのディクショナリ機能に関して、情報をまとめます。

キーに紐づく情報を登録する


 # coding: utf-8

 pokeDictionary = {"炎":"ヒトカゲ", "水":"ゼニガメ", "草":"フシギダネ"}

 print(pokeDictionary)

 #水ポケモンを表示
 print(pokeDictionary["水"])

 #変数で草ポケモンを表示
 poketype = "草"
 print(pokeDictionary[poketype])



ディクショナリに要素を追加したり削除したりする


 # coding: utf-8

 pokeDictionary = {"炎":"ヒトカゲ", "水":"ゼニガメ", "草":"フシギダネ"}

 #ディクショナリの長さを表示
 print(len(pokeDictionary))

 #ディクショナリに要素を追加
 pokeDictionary["電気"] = "ピカチュウ"
 print(pokeDictionary)

 #ディクショナリの要素を書き換え
 pokeDictionary["炎"] = "リザード"
 print(pokeDictionary)

 #ディクショナリの要素を削除
 del pokeDictionary["草"]
 print(pokeDictionary)



ディクショナリの要素をループで操作する


 # coding: utf-8

 pokeDictionary = {"炎":"ヒトカゲ", "水":"ゼニガメ", "草":"フシギダネ"}
 print(pokeDictionary)

 #キー情報でループを回す
 for poketype in pokeDictionary:
 	print(pokeDictionary[poketype] + "が、あらわれた!")
	
 #キーと名前の両方の情報でループを回す事もできる(けどキーで回すほうがシンプルかも)
 for (poketype, name) in pokeDictionary.items():
 	print(poketype + "タイプの" + name + "が、あらわれた!")


ディクショナリの内容をソートする


 # coding: utf-8

 pokeDictionary = {"ヒトカゲ":4, "ゼニガメ":7,"フシギダネ":1}

 #ディクショナリの情報を表示
 print(pokeDictionary)

 #名前順にソートしてリストの内容を表示
 print(sorted(pokeDictionary))

 #ディクショナリの要素をitemsでタプルの形にしてソート
 print(sorted(pokeDictionary.items()))

2020年9月20日日曜日

H21春ES午後2問2の解き方 画像認識を用いた駐車場管理システム

問題の感想

駐車場管理システムの問題です。簡単なような気がしたんですが、あまり解けませんでした。
問題と解答は公式サイトに載っています→平成21年春

解答

  • 設問1
  • (1)0.61
    静止画像の転送時間を問われています。計算を間違えなければ式は単純かもしれません。
    640[ピクセル]×480[ピクセル]×2[バイト]×8[ビット]=4915200[ビット]
    4915200[ビット]÷10[Mビット/秒]×0.8=0.6144
    よって回答は、0.61となります。
    (2)(a)車両情報を認識する
    (2)(b)入庫する車両を登録する
    (2)(c)駐車情報を表示する

  • 設問2
  • (1)(a)入庫ユニット
    (1)(b)入庫許可要求を受信してから、入庫完了通知を受信する前に、ほかの入庫ユニットから入庫許可要求を受信した場合
    (2)(a)pattren:21
    (2)(a)mode :OR
    (2)(b)近接センサの状態を読みだしてから、bit0をクリアするまでの間に近接センサの状態が変化した場合
    (2)(c)d:180
    (2)(c)e:120
    最短ON時間は、最短車両長の1.5m。最短OFF時間は最短車両間隔の1.0mを最大時速30km/時で走行した場合の時間を計算します。
    30km/時 = 30km ÷ 3600秒 × 1000m =8.33m/秒
    1.5m ÷ 8.33m/秒 = 180ミリ秒
    1.0m ÷ 8.33m/秒 = 120ミリ秒
    (3)(a)処理6と処理7の間
    (3)(b)完了を待たないと、車両Aの入庫完了後開閉バーが開かないから
  • 設問3
  • (1)(a)f:メインタスク
    (1)(a)g:案内板管理タスク
    (1)(a)h:通信制御タスク
    (1)(b)駐車状態管理テーブルを参照せずに更新フラグをOFFにすることで、その後更新フラグを参照しても、更新フラグがOFFのままとなる。
    (2)(a)i:更新
    (2)(a)j:参照
    (2)(b)理由:案内板管理タスクが待ち状態に遷移しないことで、町情報管理タスクが実行できないから
    poll_mbxが原因である理由と、修正内容を問われています。
    説明文にdly_tskで一定時間待つ処理を削除してメール受信有無を監視する処理に変えたとあります。
    poll_mbxはメールの受信有無を確認する関数ではありますが、一定時間待つ処理が入っていません。なので優先度の低い案内板管理タスクが待ち状態にならないことが問題の原因となります。
    修正案としては、メール受信を待つrecv_mbxを使う事になります。
    (2)(b)修正:poll_mbxに代えてrecv_mbxでメールを受信する

2020年9月19日土曜日

ラズパイが「timeout waiting for hardware interrupt」で起動しなくなる

家のラズパイが起動しなくなりました。
起動するといかのようなメッセージが出て、その状態で固まっています。
試しにSDカードを他のラズパイに入れて起動確認すると同じ結果だったので、SDカードが壊れているような気がします。
大したデータはなかったので、SDカードにOSを書き直したら使えるようになりました。


 [  13.286840] mmc0: timeout waiting for hardware interrupt
  [  23.526838] mmc0: timeout waiting for hardware interrupt

2020年9月15日火曜日

特定のビーコンを測定

概要

スマホから出ているビーコンを特定してスキャンしてみようと思いましたが、どれがスマホから出ているビーコンなのかわからず断念しました。
スキャンしたデータを見ると、Address Typeが全部randomだったので、MACの特定は無理なのかもしれません。

使用例



 # coding: utf-8

 import bluepy
 import datetime

 TARGET_MAC = "XX:XX:XX:XX:XX:XX"
 TARGET_UUID = "XXXXXXXXXXXXXXXXXXXXXXXXXXX"

 print("=======================================================================")
 print("TIME                         MAC address          RSSI    UUID")
 while True:
     scanner = bluepy.btle.Scanner(0)
     devices = scanner.scan(1.0)

     for device in devices:

         # TARGET_MAC をチェック
         if TARGET_MAC in device.addr:
             now = datetime.datetime.now()
             print(now.strftime("%Y/%m/%d %H:%M:%S.%f") + ",  " + str(device.addr) + ",    " + str(device.rssi) + ",   ---")

         # TARGET_UUID をチェック
         for(adtype, desc, value) in device.getScanData():
             if adtype == 255:

                 if TARGET_UUID in value:
                     now = datetime.datetime.now()
                     print(now.strftime("%Y/%m/%d %H:%M:%S.%f") + ",  " + str(device.addr) + ",    " + str(device.rssi) + ",   " + str(value))


2020年9月14日月曜日

周辺のBluetoothをスキャンする

「bluepy」というライブラリを仕事で使ったので、Bluetoothの情報をスキャンする処理を作ってみました。
必要なパッケージや事前準備については別のサイトで見つけてください。

Bluetoothを詳しくスキャン

それぞれの通信のアドバタイジングデータを表示します。

 # coding: utf-8

 import bluepy

 scanner = bluepy.btle.Scanner(0)
 devices = scanner.scan(3) #3秒のスキャンデータ

 for device in devices:
     print("")
     print("===============================")
     print("MAC Address  : " + device.addr)
     print("Address Type : " + device.addrType)
     print("RSSI         : " + str(device.rssi))

     for(adtype, desc, value) in device.getScanData():
         print("-----------------------------")
         print("  AdTypeCode   : " + str(adtype))
         print("  Ddescription : " + str(desc))
         print("  ValueText    : " + str(value))

 print("===============================")

出力結果はこんな感じです

 ===============================
 MAC Address  : XX:XX:XX:XX:XX:XX
 Address Type : random
 RSSI         : -99
 -----------------------------
   AdTypeCode   : 1
   Ddescription : Flags
   ValueText    : 1a
 -----------------------------
   AdTypeCode   : 22
   Ddescription : 16b Service Data
   ValueText    : 00fe00e0e47bf92896cd56daec3ea6394c7156000102
 ===============================
  :
  :

Bluetoothを簡単にスキャン

シンプルにMACアドレスとRSSIの値だけ出力します。

 # coding: utf-8

 import bluepy

 scanner = bluepy.btle.Scanner(0)
 devices = scanner.scan(3) #3秒のスキャンデータ

 for device in devices:
     print("MAC Address : " + device.addr + "     RSSI : " + str(device.rssi))

出力結果はこんな感じです

 MAC Address : XX:XX:XX:XX:XX:XX     RSSI : -91
 MAC Address : XX:XX:XX:XX:XX:XX     RSSI : -55
 MAC Address : XX:XX:XX:XX:XX:XX     RSSI : -72
 :
 :

2020年9月12日土曜日

Python学習 リスト処理

Python学習の覚書

リストについて学んだので参考になりそうなサンプルを載せました


リストの表示

リストの内容を表示する方法

 # coding: utf-8

 team = ["投手", "捕手"]
 print(team)
 print(team[0])
 print(team[1])
 print(len(team))

リストの操作

リストに要素を追加して、削除する方法

 # coding: utf-8

 team = ["投手", "捕手"]
 print(team)

 team.append("内野手") #要素の追加
 print(team)

 team.pop(1) #要素の削除
 print(team)
 
 team.insert(0,外野手) #リストの0番目に要素の追加
 print(team)
 

リストのループ処理

ループを使ってリストの要素を取り出す

 # coding: utf-8

 team = ["投手", "捕手", "内野手"]
 print(team)

 for i in team:
     print(i)


文字列からリストの作成

split関数を使ってリストを作成する

 # coding: utf-8

 line = "ヒトカゲ,ゼニガメ,フシギダネ"
 print(line.split(","))


標準入力からリストの作成

readline関数を使ってリストを作成する。

 # coding: utf-8

 import sys

 array = [] #空のリスト
 for line in sys.stdin.readlines(): #標準入力を1行ずつ取り出す
     array.append(line.rstrip()) #lineの内容を改行なしで取り出してリストに格納
     print(line.rstrip()) #要素の内容を表示

 print(array) #リストを表示

リストのソート

sorted関数を使ってリストを作成する。reverseオプションで逆にすることもできる。

 # coding: utf-8

 pokelist = ["イシツブテ","ウツボット","アンノーン","イワーク"]
 print(pokelist)
 print(sorted(pokelist)) #アイウエオ順に並び替え
 print(sorted(pokelist,reverse=True)) #アイウエオ順の逆に並び替え


Python学習 ループ処理

Python学習の覚書

ループ処理を学んだので、役に立ちそうなサンプルを載せました。

for文の繰り返し処理

for文を使って6から10を繰り返す処理

 # coding: utf-8

 for i in range(6,11):
    print(str(i))

while文の繰り返し処理

while文を使って1から10を繰り返す処理

 # coding: utf-8

 i = 1
 while i <= 10:
     print(str(1))
     i+=1

複数行のデータを読み込む処理

3行のデータを読み込んで出力する処理

 # coding: utf-8

 for i in range(3):
     line = input().rstrip()
     print(line)

Python学習 条件分岐、比較演算

Python学習の覚書

分岐条件や比較演算子について学んだ際に、役に立ちそうなサンプルを残しておきました。


数字のif文


 # coding: utf-8
 
 number = 1
 if number == 1:
     print( "数字が1の時")
 elif number == 2:
     print( "数字が2の時")
 else:
     print( "数字がそれ以外の時") 

print文で改行をしたくない場合

このように「end=""」を追記します。

 print("hello world", end="")

ランダムの数値を出力するとき

このように「end=""」を追記します

 # coding: utf-8
 import random

 num = random.randint(1,10)
 print(num)


today関数で年情報を取得する

datetimeをインポートして現在の年を取得しています。

 # coding: utf-8
 import datetime

 nen = datetime.date.today().year

 print(nen)

2020年9月6日日曜日

H26春ES午後1問2の解き方 省エネ対応の自動販売機

問題の感想

省エネ対応自動販売機の問題です。問題はシンプルでしたが、記述が多くて大変でした。

解答

  • 設問1
  • (1)1.05
    (2)日の出及び日没の時刻を年月日から計算し、時刻を基に夜間を判断する
    (3)一定間隔で制御部からデータが受信できていることを確認する

  • 設問2
  • (1)a:管理会社
    (1)b:売上管理
    (1)c:商品管理
    (2)d:販売LEDを点灯する指示を出す
    (2)e:売り切れでなくかつ投入金額が単価以上
    (2)f:打ち上げ金額を売上管理タスク
    (2)g:センサが人を検知し、主LEDが消灯中なら点灯する
    (3)(a)金額を金額表示部に表示する指示、金額表示部を消灯にする指示、釣銭を出す指示、品切れLEDを点灯する指示
    (3)(b)商品温度の設定データ

  • 設問3
  • (1)h:情報の送信
    (1)i:商品温度の設定
    (1)j:主LED照明の動作停止
    (1)k:商品管理
    (2)夜間から夜間でない時刻になるとき、主LED照明が点灯している場合、主LED照明の動作停止の指示を受けると、主LED照明が消灯しない

H31春ES午後1問2の解き方 見守りロボット

問題の感想

見守りロボットの問題です。文章が多くて難しかったです。

解答

  • 設問1
  • (1)(a)事象発生なし状況が10分以上継続した場合
    (1)(b)設定スイッチが押されたときのみ割込み
    (2)a:確率値の平均値
    (2)b:45
    (2)c:50
    (2)d:もう一度言って
    (3)音声認識再生モジュールへの電力の供給
  • 設問2
  • (1)再生音声選択、メイン、割込み時間判定
    (2)e:設定開始・終了
    (2)f:項目設定
    (2)g:設定開始
    (2)h:設定終了
    (2)i:次の割込み時刻を設定
    (3)割込み時刻判定タスクから、就寝時間の割込み時刻になったことの通知を受けた時
    (4)お出かけするよ
  • 設問3
  • (1)タッチセンサ
    (2)j:音声認識結果
    (2)k:メイン
    (2)l:異常検出
    (2)m:呼びかけ

H31春ES午後1問1の解き方 気象観測予測システム

問題の感想

気象管理システムの問題です。穴埋めで点が取れませんでした。

間違い箇所

  • 設問1
  • (1)分析装置が同報通信で時刻の設定を指示する
    (2)ディジタル地図におけるディジタル百葉箱の位置情報
  • 設問2
  • (1)4.6
    節電モードにおけるディジタル百葉箱の消費電力を問われています。
    計測部がデータを送信する際の消費電力は0.02ミリWhであり、1分周期に行われるので1日分の消費電力量はこのようになります。
    0.02ミリWh × 60分 × 24時間 = 28.8ミリWh

    カメラ部も1分周期の処理で0.1ミリWhの電力を消費するので、消費電力量はこのようになります。
    0.1ミリWh × 60分 × 24時間 = 144ミリWh

    制御部の消費電力は平均3ミリWと1時間当たりの消費量は3ミリWh。1日当たりの消費電力量はこのようになります。
    3ミリWh × 24時間 = 72ミリWh

    通信部の消費電力は平均180ミリWとあるので、1時間当たりの消費量は180ミリWh。1日当たりの消費電力はこのようになります。
    180ミリWh × 24時間 =4320ミリWh

    1日当たりの消費電力の合計は以下のように求めます。
    28.8ミリWh + 144ミリWh + 72ミリWh + 4320ミリWh = 45648ミリWh = 4.5648Wh = 4.6Wh
    (2)76
    データ保存に必要なフラッシュメモリの容量を問われています。
    気象データのデータサイズは32バイトであり、データ収集は1分周期で、送信は5分周期なので、5回分のデータを確保する必要があります。なので、 32バイト × 5回分 = 160バイト = 0.00016Mバイト必要です。

    静止画データのサイズは6Mバイトで、これも1分周期に測定して5分周期で送信するので5回分のデータを保存する必要があります。 6Mバイト × 5回分 = 30Mバイト必要です。

    動画データは1回あたり45Mバイトですが、送信後削除されることになっているので、1回分保存できればよさそうです。

    よって、必要なサイズは以下のようになります。
    0.00016Mバイト + 30Mバイト +45Mバイト = 75.00016Mバイト = 76Mバイト
  • 設問3
  • (1)a:通信
    (1)b:動画撮影開始指示
    (1)c:通常
    (1)d:動画撮影終了指示
    (1)e:節電
    (2)送信したデータをフラッシュメモリから削除する
    (3)モード管理タスクの優先度を高にする

2020年9月5日土曜日

H29春ES午後1問2の解き方 カメラ付き防犯灯

問題の感想

カメラ付き防犯灯の問題です
問題と解答は公式サイトに載っています→平成29年春

解答

  • 設問1
  • (1)(a)n-4で証明を点灯した。
    (1)(b)証明の点灯と消灯を繰り返す動作
    (2)37
    カメラは1秒間に4フレームで、保存するデータは6分間なので、3600秒×4フレーム=14400フレーム。1フレーム1Mバイトなので、14400Mバイト
    これを240時間なので2400倍する。14400×2400=3456000M
    圧縮すると1%になるので、34560Mバイト
    暗号化すると5%のサイズが増えるので、34560Mバイト+1728Mバイト=36288Mバイト
    (3)同じファイル名のファイルが作成される可能性があるから

  • 設問2
  • (1)(a)画像調整パラメタ
    (1)(b)移動平均値
    (1)(c)圧縮アクセラレータ
    (1)(d)240時間以上経過したファイル
    (1)(e)削除
    (2)(f)画像処理
    (2)(g)照度
    (2)(h)照明
    (2)(i)ファイル管理
    (3)画像処理、ファイル管理
    (4)暗号キーが設定されていないこと

  • 設問3
  • (1)標準電波の受信状況を確認するため
    (2)(a)メイン
    (2)(b)補正時刻になった、時刻補正スイッチが押された
    (2)(c)受信した時刻データをRTCへ設定し、時刻情報に書き込む

H29春ES午後1問1の解き方 観光用案内ロボット

問題の感想

観光案内用ロボットの問題です。
問題と解答は公式サイトに載っています→平成29年春

解答

  • 設問1
  • (1)212.5
    データ転送を開始してから表示バッファへの書き込みを完了するまでの時間を問われています。
    1画素が16ビットで500000画素のデータなので、8000000ビットのデータです。

    表示データをLANで転送する際の実行転送時間は、
    8Mビット÷40Mビット/秒=0.2秒

    LANコントローラから表示バッファへの実行転送速度は、
    1Mバイト÷80Mバイト/秒=0.0125秒

    0.2+0.0125=0.2125秒 212.5ミリ秒が回答になります。
    (2)体の正面を0度にすると、体が正面から右方向に回らないから

  • 設問2
  • (1)(a)5/9
    (1)(b)周期:240
    (1)(b)幅:133
    (1)(b)誤差:0.50
    体を200度の位置に近い位置で停止させる場合PWM信号を出力するタイマの設定値(周期、highの値)を問われています。
    240kHのクロックなので、周期は240になります。
    200度のデューティ比は5/9なので、240×5/9=133なので回答は、133になります。

    この時の誤差は、デューティ比と実際の角度の違いで角度を求めます。
    5/9-133/240=0.5555−0.5541=0.0014
    0.0014×360度=0.504=0.5度が誤差になります。
    (2)体の回転を開始してから停止位置になるまでの時間を長くしたいから

  • 設問3
  • (1)(a)最も近い人がいる方向
    (1)(b)タッチされた座標がメニューのボタンの座標であった
    (1)(c)メニュー及びメニューのボタンを表示する
    (1)(d)表示&LAN通信
    (1)(e)体をロボット台座の正面に向ける
    (2)メインタスク、人検出タスク

H28春ES午後1問2の解き方 食券販売機

問題の感想

食券販売機の問題です
問題と解答は公式サイトに載っています→平成28年春

解答

  • 設問1
  • (1)料理の種類、メニューボタンの配置位置
    (2)メニューボタンにタッチされた結果すべての料理の販売可能数が0となった場合
    (3)62.3
    ■計算に必要な情報
    ①3つのユニットにそれぞれ100バイトのデータを送信。
    ②3つのユニットからそれぞれ20バイトのデータ送信。
    ③各ユニットはデータ受信後に500マイクロ秒の処理を行う。
    ④シリアルバスの通信速度は100kビット/秒。
    ⑤制御部はデータ受信後100マイクロ秒の処理を行ってから通信を開始する。
    ⑥1バイトは10ビット

    ■やってること
    ・ユニット1に100バイトのデータ送信
    ・ユニット1が500マイクロ秒の処理
    ・ユニット1が制御部に20バイトのデータ送信
    ・制御部は100マイクロ秒の処理
    ・ユニット2に100バイトのデータ送信
    ・ユニット2が500マイクロ秒の処理
    ・ユニット2が制御部に20バイトのデータ送信
    ・制御部は100マイクロ秒の処理
    ・ユニット3に100バイトのデータ送信
    ・ユニット3が500マイクロ秒の処理
    ・ユニット3が制御部に20バイトのデータ送信

    上記の時間の合計を求めます。
    データの送信時間の合計は、100+20+100+20+100+20=360バイト=3600ビット
    3600ビット÷100kビット=0.036秒=36ミリ秒
    処理時間は、500+100+500+100+500=1700マイクロ秒=1.7ミリ秒
    合わせると37.7ミリ秒で、そのあと100ミリ秒周期で動くので、100-37.7=6.23なので以下が回答になります。

  • 設問2
  • (1)(a)ア:メニューボタン
    (1)(a)イ:確定ボタン
    (1)(a)ウ:取消ボタン
    (1)(b)エ:購入候補リスト、合計金額
    (1)(c)オ:各料理の販売可能数を注文開始前の値に戻す
    (1)(d)カ:入金金額が合計金額以上となるの
    (1)(d)キ:現金出納ユニットからの排出完了通知
    (2)タイミング:注文タスクから注文動作の終了が通知されたとき
    (2)理由:待機中状態に遷移するか、営業終了状態に遷移するかを決定するから

  • 設問3
  • (1)販売可能数が0となった料理の販売可能数の減算を依頼された場合
    (2)タスク名:タッチパネルタスク
    (2)情報:ボタン情報
    (3)a:注文番号の取得を制御タスク
    (3)b:注文番号の取得を親機

2020年9月4日金曜日

H28春ES午後1問1の解き方 カーオーディオシステム

問題の感想

自動釣銭機の問題です。
問題と解答は公式サイトに載っています→平成28年春

解答

  • 設問1
  • (1)バッファ4段目までPCMデータを蓄積する時間
    (2)(a)再生音が途切れる
    (2)(b)3

  • 設問2
  • (1)(a)優先度の高いタスクが、WDTのカウント時間以上に連続して動作していることを検出するため
    (1)(b)メインタスク、PCMデータ受信タスク、音声出力タスク
    タスクが動作していることを示すフラグを持たせた場合、スマートフォンの音楽再生中にタスクの待ち状態をチェックすべきタスクの内容を問われています。
    音楽再生のデータフローが圧縮音楽ファイルから行う場合と、スマートフォンから行われる場合があり、図2のデータフローから必要なタスクを選択します。
    DAC送信処理があるので、音声出力タスク。PCMデータ受信処理があるので、CPMデータ受信タスク。画面表示の情報の送信などを行っているから、メインタスク。
    ということで回答は以下になります。
    (2)(a)検索結果の圧縮音楽ファイルをメインタスクに通知する
    (2)(b)b:1000サンプル
    (2)(b)c:4段目
    (2)(b)d:メインタスク
    (2)(c)①再生経過時間
    (2)(c)②圧縮音楽ファイル名

  • 設問3
  • (1)e:オーバフロー
    (1)f:アンダフロー
    (1)g:23040
    周波数差が0.01%の場合、5分間の音楽再生で発生する可能性がある差分のバッファサイズを問われています。
    周波数差が0.01%なので、192kHzの場合19.2Hzが周波数差。1秒間に19.2回サンプリング分の誤差が発生。
    5分間なので、60秒×5回=300秒 19.2回×300秒=5760回
    量子化ビットが32ビットなので4バイトだから、5760回×4バイト=23040バイトになります。
    (2)2.60
    伸張タスクの処理時間を求めます。
    1サイクルの時間が5.20マイクロ秒であり、1回の伸張処理は1000サイクル分の処理を行うので、1回の伸張処理の時間は5.20ミリ秒。
    CPU占有率を50%以下にする場合、半分の性能しか出ないので、2.60ミリ秒。回答は以下になります。

H27春ES午後1問2の解き方 自動釣銭機

問題の感想

自動釣銭機の問題です。
問題と解答は公式サイトに載っています→平成27年春

解答

  • 設問1
  • (1)a:出金金額
    (1)b:五千円紙幣
    (2)2500
    (3)c:金種情報
    (3)d:表示部に表示
    (3)e:入金禁止
  • 設問2
  • (1)硬貨部制御タスクから補充金種の情報を受けた時
    (2)出金金種での出金指示
    (3)メールを送受信するメールボックス番号
  • 設問3
  • (1)操作部指示タスクが、紙幣部の資源を獲得後、紙幣部制御タスクに指示を出す前にレジ指示タスクが起動された
    (2)タスク優先度を同じにする
    (3)硬貨部の資源を獲得後に紙幣部の資源を獲得する

H27春ES午後1問1の解き方 ポータブル心電計

問題の感想

マイコンを内蔵した心電計の問題です。
問題と解答は公式サイトに載っています→平成27年春

解答

  • 設問1
  • (1)計測中に開始ボタンが押されると、計測したデータが消えてしまうから
    (2)タイマ2の割込み直後にタイマ1の割込みが入り計測データを保管する場合があるから
  • 設問2
  • (1)600
    (2)a:8
    体温を示すためのビット数と入力電圧のビット数を回答します。
    体温は25.0~50.0の範囲を0.1刻みで記録する必要があるので、250~500の整数を扱う必要があります。
    なので、250の整数を扱えれば条件は満たせます。250は二進数にすると、「1111 1010」なので必要なビット数は8となります。
    (2)b:10
    bに入れるのは、入力電圧が0~5Vになるときに必要な範囲なので、まずは電圧に対応する温度の範囲を考えると、
    0Vの時は0℃で5Vの時は62.5℃(50×5/4)なので、625の整数で扱えるビット数を考えます。
    625は二進数にすると「‭10 0111 0001‬」なので、必要なビット数は10となります。
  • 設問3
  • (1)c:心電信号及び体温
    (1)d:10秒経過したら
    (1)e:リングバッファ内の未送信のデータ
    (2)加速度の発生タイミングを明確にするため

2020年9月3日木曜日

H26春ES午後1問1の解き方 ICレコーダ

問題の感想

ICレコーダの問題です。記述と計算が多くて疲れます。
問題と解答は公式サイトに載っています→平成26年春


解答

  • 設問1
  • (1)時刻設定で変更前の日時よりも過去の日時を設定した
    (2)PCから同じファイル名の別の音声データに置き換えた
    (3)当該音声データを一度も再生させていない状態
  • 設問2
  • (1)受信する周波数の選択
    (2)137
    ・サンプリング周波数  48[kHz]
    ・量子化ビット数    16[ビット]
    ・12分の1に圧縮する
    ・音声データの記憶領域は 3968[Mバイト]

    サンプリング数は数から、1秒間に48000回の割合でサンプリングする。1サンプリングに必要なビット数は16ビット(=2バイト)で、12分の1に圧縮可能なので、1秒間に必要なサイズは以下のように求めます。

    48000[回]×2[バイト]=96000[バイト]
    96000[バイト]÷12=8000[バイト]

    この情報から1時間の音声データに必要なバイト数を求めます。8[kバイト]×60[秒]×60[分]=28.8[Mバイト]
    この情報からICレコーダのメモリで録音可能な時間を求めます。3968[Mバイト]÷28.8[Mバイト]=137.777[時間]
    小数点以下を切り捨てるので答えは、137[時間]となります。
    (3)12
    音声データ再生時の平均消費電力(W)を求める問題です。
    ・動作電圧は5[V]
    ・MPUは常時起動なので880[マイクロA]
    ・RAMは常時起動なので170[マイクロA]
    ・フラッシュメモリは書き込み以外なので200[マイクロA]
    ・オーディオモジュールはD/A変換なので130[マイクロA]
    ・ラジオは停止中なので10[マイクロA]
    ・アンプは出力中なので380[マイクロA]
    ・LCDは20秒バックライト点灯なので、1830×1/3=610[マイクロA]
    ・40秒バックライト消灯なので、30×2/3=20[マイクロA]
    これらから動作電流を求めて、消費電力を計算します。

    5[V]×(880+170+200+130+10+380+610+20)[マイクロA]=12000[マイクロW]
    答えは整数で求めるので、12[ミリW]です。
  • 設問3
  • (1)(a)音声データ取得関数
    (1)(c)チェックディジット
    (2)(b)次の1秒分の音声データを取得する
    音声再生タスクを使って音声を再生している時の処理内容を回答します。
    音声再生の開始時にファイル管理タスクから音声データ(再生開始位置から2秒分)取得とあるので、再生中も音声データを取得するのかなと想像することができます。
    音声データ格納関数の処理をよく見ると「1秒分の音声データをオーディオモジュールに格納する。」とあるので、1秒の情報もいれて回答するのがよさそうです。
    (3)表示タスクに表示情報を送信する
    (4)前回停止した位置から再生を行うため