2020年10月25日日曜日

画像ファイルの左上に日時テキストを合成する


概要

定点カメラで写真を撮影してGoogle Driveに転送しているのですが、転送後にGASでファイルを移動すると更新日時が変わってしまうので撮影日時がわからなくなってしまいました。
画像に日時が表示されれば便利だなと思ったのでPILで処理を作ってみました。
フォントの指定が必要だったので、ttfファイルはIPAのサイトからダウンロードしました。


 from PIL import Image, ImageDraw, ImageFont
 import datetime

 #日時情報を取得
 now = datetime.datetime.now()
 nowtime = now.strftime('%Y/%m/%d %H:%M')

 #対象のファイルをopen
 photo = Image.open("XXXXX.jpg")
 draw = ImageDraw.Draw(photo)

 #フォントを指定して日付情報を書き込み
 font = ImageFont.truetype("ipag.ttf", size=250)
 draw.text((0, 0), nowtime, fill=(255,140,0), font=font)

 #ファイルを上書き保存
 photo.save("XXXXX.jpg")

2020年10月24日土曜日

ラズパイで写真を撮ってgoogle driveのフォルダと同期する


概要

ラズパイで写真を撮ってgoogle drive に送信する処理で、定点カメラを作りました。ファイルを同期する際にdrive上の古いファイルを消すようにしています。
ただ、部屋の電気を消した後も送信し続けるので、通信量がもったいないなと思ったので、ファイルサイズが200KB以下(真っ暗)な場合は送信しないようにしてみました。

YYYYYYYYYYYYYYY google drive上のファイルID


 #!/usr/bin/python
 # coding: utf-8

 import os
 
 #写真を撮影
 filename = '/var/local/sync_file/file.jpg'
 com = 'raspistill -q 10 -vf -hf -o ' + filename
 os.system(com)

 #サイズを取得して200KB以下なら処理をしない
 size = os.path.getsize('/var/local/sync_file/file.jpg')
 if size >= 200000:
 
    # クラウド上の古いファイルを削除する
    file_list = "gdrive list --query \"name = 'file.jpg' and trashed = false\" | grep file.jpg"
    id_str = os.popen(file_list).read().rstrip()
    id_list = id_str.split("   ")
    com3 = "gdrive delete " + id_list[0]
    os.system(com3)

    # 写真を同期してクラウド上のファイルを更新する
    com4 = 'gdrive sync upload --keep-local /var/local/sync YYYYYYYYYYYYYYY'
    os.system(com4)

Pythonサンプルコード


使用例

「1 2 3」のような標準入力を変数に代入する処理。

 import sys

 input_line = [] #空のリスト

 for line in sys.stdin.readlines():   #標準入力を1行ずつ取り出す
     input_line.append(line.rstrip()) #1行ずつリストに格納
 
     input_param = input_line[0].split(' ') #リストの中身を値ごとに区切ってリストに格納

     num_1 = int(input_param[0])
     num_2 = int(input_param[1])
    
 print(str(num_1) +" "+ str(num_2))

2020年10月19日月曜日

令和2年度ES10月午後2問2 スマートバスシステム

問題の感想

スマートバスの問題でした。時間が足りませんでした。

間違えている可能性が高いので参考までに。

  • 設問1

  • (1)(a)メッセージ名:スマートバスへの送信指示
    (1)(a)通信内容:スマートバスzへのバス停停車指示の送信を指示
    (1)(b)スマートバスzの到着までの予想時間の表示内容を更新する
    (1)(c)d:送信完了
    (1)(c)e:指示取消
    (2)(a)スマートバスから送信する情報がない場合
    (2)(b)バス停待機指示メッセージを受信した場合
    (2)(c)乗客の人数
    (3)(a)180
    (3)(b)50
    (3)(c)46

  • 設問2

  • (1)(a)スマートバスがバス停付近で停車した場合とバス停で停車した場合を区別したいから
    (1)(b)カードID
    (2)各履歴情報を基に解析した結果
    (3)(a)緊急停車ボタン押下を受信した
    (3)(b)スピーカ

  • 設問3

  • (1)乗客の人数、降車ボタンの押下の有無
    (2)バス停に設置された路側機の路側機ID
    (3)g:後方車載器ID
    (3)h:後者情報
    (4)(a)車車間運行判定タスクが運航予定の判断を行っているタイミング
    (4)(b)タスク名:運行管理
    (4)(b)変更内容:降車ボタンを押下されたときは、車車間運行判定タスクから次のバス停通過の判断結果になってもバス停運行予定を更新しない

令和2年度ES10月午後1問2 所有者を追尾するスーツケース

問題の感想

所有者を追尾するスーツケースです。最新のIT家電なのが面白かったです。
自信は全然ないですが解答案です。

間違えている可能性が高いので参考までに。

  • 設問1

  • (1)異常な加速度を検出した時、スマホから制御をされた時
    (2)最後に測位が成功した時の目標位置まで移動し、その位置で停止する。

  • 設問2

  • (1)スーツケースまでの距離をスマホに表示する
    (2)8
    (3)57cm
    (4)スーツケースが段差まで走行してしまう

  • 設問3

  • (1)測位ユニット、加速度センサ、施錠・解錠ユニット
    (2)a:測位情報
    (2)b:加速度異常
    (3)スーツケースと所有者との距離が2メートル以上離れたことを検知した時

令和2年度ES10月午後1問1 日本円紙幣整理機

問題の感想

紙幣を束にする装置の問題でした。図が見慣れなくて戸惑いました。
自信は全然ないですが解答案です。

間違えている可能性が高いので参考までに。

  • 設問1

  • (1)紙幣の裏表と向き
    (2)イ、エ
    (3)7束

  • 設問2

  • (1)a:束タスク
    (1)b:搬送路のモータ
    (1)c:投入口のモータ
    (1)d:停止する
    (1)e:管理番号の取得依頼
    (2)f:紙幣タスクの生成
    (2)g:搬送完了通知
    (2)h:返却完了通知

  • 設問3

  • (1)i:指定された通貨及び金種の紙幣式罰用データを紙幣識別ユニットに送信する。
    (2)j:紙幣検出をセンサタスクに依頼する場合は、指定された通貨及び金種の幅や厚さに応じた計測時間

2020年10月17日土曜日

H31ES午後2問2の解き方 土砂災害予知システム

問題の感想

土砂災害予知システムの問題です。解きやすかった気がします。
  • 設問1

  • (1)(a)450
    ノード1の電源投入からノード2の情報が監視装置に到達するまでの時間を求めます。
    ノード1の電源投入後の通信は以下です。これらの時間を足して合計時間を回答します
    ・ノード1が起動して、親ノードを探索する同報送信  50ミリ秒
    ・周りのノードが中継ノード情報を送信する同報送信  50ミリ秒
    ・ノード1が親ノードを決定して個別送信  100ミリ秒
    ・ノード1が再構築のための同報送信   50ミリ秒
    ・ノード2がノード1を親ノードに決定した時の個別送信 100ミリ秒
    ・ノード2の個別送信をノード1から監視装置に個別送信 100ミリ秒
    (1)(b)自ノードのホップ数に1を加える
    親ノードを選択した後に、WSNの再構築の際に送信する中継ノード情報の中にあるホップ数の求め方を問われています。
    この時のホップ数は子ノードが接続する親ノードを選択するためのものなので。自ノードホップ数に1加算した値で送信してネットワークの再構築を行います。
    (2)ノードの消費電力を削減して、一次電池の交換頻度を減らすことができるから
    (3)(a)収集した時の時刻、ノードのGPS位置情報、ノードの電池残量
    (3)(b)子ノードを持たないノード

  • 設問2

  • (1)(a)UI、サーバ通信、データ解析
    (1)(b)データ周期
    (1)(c)装置アラーム発生通知
    (2)b:商用電源からの電力供給が開始したことを検知
    電源関連で不足している処理を考えます。商用電源から電力供給が停止した時のメインタスクへの通知はあるのに、商用電源から電源供給が開始した時のメインタスクへの通知がないことに気づくことができればこの回答にたどり着くことができると思います。
    (3)c:WSNに参加した時刻
    (3)d:新たにセンサデータがエリア情報に保存される

  • 設問3

  • (1)(a)自ノードのアドレス、隣接ノード
    (1)(b)該当するノードに対する電池残量0を記述する
    (1)(c)f:電源ONのシナリオメッセージを受けるまで待機する
    電源OFFになったら、次に電源ONになるまで何もしてはいけません。なので、この回答になります。
    (2)g:該当するノードタスク
    (3)テストシナリオに設定した時刻通りにシナリオイベントを発生させるため

2020年10月11日日曜日

午前問題の間違い箇所

概要

午前問題で間違っているところをメモします。


H21 問3 コンピュータの命令実行順序

命令実行サイクルは以下のようになっています。
  1. 命令読み出し(命令フェッチ)
  2. 命令解読(命令デコード)
  3. 実効アドレス計算
  4. オペランド読み出し
  5. 命令実行
  6. 結果格納

H21 問4 キャッシュメモリのミスヒット率

キャッシュメモリのミスヒット率はアクセスしようとしているデータがキャッシュメモリに存在しない確率の事を言います。
ブロックサイズは32バイトのキャッシュメモリに対して、32ビットの整数型配列データを読みだした場合、一度に8個のデータを読み出すことができます。
8個のデータを読みだしたとき、1個目のデータはミスヒットになり、2~8個目のデータはヒットすることになります。
従って、ミスヒット率は12.5%になります。

H21 問7 バスプロトコル

  • バスマスタ
  • 他の装置に指示を出したり制御したりできる装置
  • バススレーブ
  • バスマスタから制御を受ける装置
  • バスアービタ
  • 複数のバスマスタの使用権を調停する装置

H21 問16 メモリアクセスの速さ

4クロックでメモリアクセスを行う装置のWAIT時間を計算して回答します。
(4クロック+WAITクロック数)÷クロック周波数=メモリアクセス時間


H21 問19 OP25Bの説明

OP25B(OutBound 25 block)の略。説明としては、動的IPドレスを割り当てたネットワークからISP管理外のネットワークに直接送信されたメールを遮断する。

H22 問1 反転増幅器

反復増幅器は入力電圧に対して、移送を反転して絶対値を大きくした出力電圧を得られる装置。

H22 問3 DMA

DMA(Direct Memoty Access)は、DMAコントローラが入出力装置と主記憶の間や、主記憶相互間でCPUを介さず直接データを転送する仕組み。
「専用の制御回路が入出力装置や主記憶などの間のデータ転送を行う方式である。」が説明として適切。

H22 問7 オーバレイ方式

オーバレイはプログラムを複数のオブジェクトファイルに分けておき、必要となる機能のセグメントを実行時にロードする方式。
「必要がなくなったセグメントの領域に、次に実行するセグメントが上書きされる。」が説明として適切。

H22 問18 MACアドレス

MACアドレスのビット数は48。

H22 問19 暗号方式

「共通鍵暗号方式で相手ごとに秘密の通信をする場合、通信相手が多くなるに従って、鍵管理の手間が増える。」が適切な説明。

H22 問21 モジュール結合度

モジュール結合度はモジュール間の依存度を表す尺度であり、依存関係が弱いほうが良いとされている。
「入出力に必要なデータ項目だけをモジュール間の引数として渡す。」が最もモジュール結合度が弱い実装方法。

H22 問25 SOAの説明

SOA(Service Oriented Architecture)は、「業務機能を提供するサービスを組み合わせる事によって、システムを構築する考え方」である。

H23 問17 MPUのウエイトとレディ

MPUの処理速度に比べて、メモリや入出力装置のアクセス速度は遅いため、両者間で信号のやり取りをする際に速度を調整する必要があり、そのための機能が、ウエイト機能とレディ機能である。
「アクセス速度の遅いメモリにMPUを同期させる」が適切な回答となる。

H23 問22 JTAG

JTAG(Joint Test Action Group)はマイコンの内部に埋め込まれたデバッグ用回路を使ってデバッグできるようにした団体や規格の事を言う。
「マイコン自身にデバッグに必要となる機能が内蔵されており、それを外部から制御するための端子がある。この端子を利用してデバッグを行う」が適切である。

H23 問23 コデザイン

コデザインは要件定義などの上流工程でハードウェアとソフトウェアの機能分担を明確にして十分検証した上で、以後のハードウェア設計、ソフトウェア設計を進める手法である。
「上流工程段階で、ハードウェアとソフトウェアとの機能分担を協調シミュレーションによって十分検証することで、仕様を満たしていることを確認していく手法」が適切な説明である。

H24 問9 優先度に基づくスケジューリング

タスクBの動作中にタスクAが割り込んだ時の割込みハンドラの処理時間を考える。
タスクAのデッドラインが60マイクロ秒なので、選択肢は20か30になります。
30だと、タスクAの処理時間が30+30=60であり、タスクBが間に合わなくなるので、回答は20マイクロ秒になります。

H24 問14 SSCGの効果

SSCG(Spread Spectrum Clock Generator)はCPUの動作に支障のない範囲で生成されるクロック発生周期を微妙に変動させるカイロであり電磁妨害ノイズの周波数が分散され、特定の周波数でノイズが低減される効果がある。

H24 問15 チャタリング除去

チャタリングは、機械的な接点が切り替わるときに生じる微小な振動である。RSフリップフロップを用いると、スイッチが最初に切り替わった瞬間に出力信号が変化してチャタリングが生じても出力信号が維持される。なので「RSフリップフロップでスイッチ信号を受ける」が適切。

H24 問20 ケプナートリゴー法

問題解決に際し、状況把握、問題分析、決定分析、潜在的問題分析の四つの思考プロセスがある手法は、ケプナートリゴー法(KT法)である。

H25 問4 スヌープキャッシュ

スヌープキャッシュはマルチコアプロセッサで各コアに接続されたキャッシュコントローラが共有バス上の動作を監視することにより、キャッシュの内容の一致を保証する方式です。
従って「共有バスを介して、各コアのキャッシュが他コアのキャッシュの更新状態を管理し、コヒーレンシを保つ」が適切な解答になります。

H25 問17 ハザード

論理回路の出力にハザードが発生する原因としては、「素子及び配線の遅延時間のばらつき」となります。

H26 問16 NFC

NFC(Near Field Communication)は「ピアツーピアで通信する機能を備えている」
ちなみにピアツーピアとはクライアント同士で通信するという事。

H26 問22 MDA

MDA(Model-Driven Architecture)はプラットフォームに依存せずアプリケーションの機能をモデル化し、そのモデル情報を基にコードを自動生成する開発手法です。

H26 問23 DNSラウンドロビン

DNSラウンドロビンは、1つのドメインに対して複数のIPを割り当てることによって負荷分散をする仕組みです。
「DNSにおいて、一つのIPドレスに対して複数のサーバ名を割り当てることによって実現します」が適切です。

H27 問4 ミラーリング

RAIDは複数のハードディスクを組み合わせることにより1台の仮想的なハードディスクとして認識させて冗長性を向上させる技術の事です。
ミラーリングはRAID1になります。

H27 問17 PPP

PPP(Point to Point)は2転換を接続してデータ通信を行うための通信プロトコルです。
「認証機能や圧縮機能を持ち、2点間を接続する通信プロトコルである」が適切です。

H27 問20 共通フレーム

共通フレームによればシステム要件の表かタスクにおいて見極めることは、
「システム要件を満たすシステム方式設計が実現可能かどうか」が適切です。

H28 問1 バススヌープ

共有されたメモリインタフェースバス上のトランザクションを観察して、そのトランザクションが自分のキャッシュメモリ上にあるデータの場合、キャッシュメモリの該当するエントリを更新して、マルチプロセッサ動作時の各プロセッサのキャッシュ、および主記憶の内容の一貫性を保つための技術。

H28 問3 ユニファイドメモリ

画面表示用フレームバッファがユニファイドメモリ方式であるシステムの特徴は、「主記憶の一部を表示領域として使用する」である。

H28 問5 コンピュータと周辺装置

パラレル転送方式では、転送クロックを高速化するとデータの各ビット間での信号到達タイミングの整合をとることが困難になる。

H28 問7 アプリケーションタスク

リアルタイムシステムにおいて、アプリケーションタスクの通知方法は、「イベントフラグを使って入出力要求元のタスクに入出力完了を通知する」である。

H28 問17 TCPヘッダとUDPヘッダのフィールド

TCPヘッダとUDPヘッダのどちらにも存在するフィールドは「チェックサム」のフィールドである。

H28 問22 Observerパターン

デザインパターンの一つであるObserverパターンを利用して実現できることは「あるオブジェクトの状態が変化した時に、それに依存する全てのオブジェクトに自動的に通知する。」

H28 問25 サブライセンス

特許のサブライセンスとは「特許の実施権の許諾を受けたものが、されに第三者に当該特許の実施権を許諾すること」

H30 問8 セマフォ

P操作は資源のロックをしたいときに使われ、V操作は資源のアンロックをしたいときに使います。
従って「V操作は待ち状態のプロセスがあればそのプロセスを一つ実行可能状態へ移す」が適切な解答となります。

H30 問20 FPGAの設計フロー

FPGAの設計フローは、「機能の記述→論理合成→配置配線」という順番で行われます。

H30 問24 ソフトウェア検証プロセスの目的

「プロセス又はプロジェクトのそれぞれのソフトウェア作業成果物及び/又はソフトウェアサービスが指定の要求事項を適切に反映していることを確認すること」が目的となります。

H31 問3 メモリインタリーブ

メモリインタリーブは物理上は一つの主記憶領域を論理的に複数に分けて並列アクセスすることでアクセス時間の短縮を図るメモリ高速化の手法です。
従って、「CPUからの主記憶へのアクセスを高速化するために主記憶内部を複数のバンクに分割し、各バンクを並列にアクセスする」が適切な解答になります。

H31 問12 DRAMのリフレッシュ周期

アドレス線が10本なのでリフレッシュする数は、2の10乗で1024です。
全アドレスを51.2ミリ秒でリフレッシュする周期は、51.2ミリ秒÷1024=50マイクロ秒になります。

H31 問14 SRAM型FPGAの特徴

SRAM型FPGAの特徴としては「回路の書き換えが拘束に行え、書き換え回数に制限がない」のが特徴になります。

H31 問22 スタブの説明

上位のモジュールから呼ばれる、下位モジュールの代わりにダミーの戻り値を返すものをスタブといいます。
なので未完成のハードウェアが動いているように見せるデバイスドライバは上位ソフトウェアのスタブということになります。

2020年10月10日土曜日

Python学習 例外処理

概要

Pythonの学習をしています。例外処理について役に立ちそうな記載をまとめます。

例外処理の書き方


 # coding: utf-8

 print(1)

 #例外を検出する処理
 try:
     number = 0
     answer = 100 / number
     print(answer)

 #tryブロックで中断した場合の処理
 except ZeroDivisionError as e:
     print(e)

 #例外にかかわらず実行する処理
 finally:
     print(2)  


例外処理時にスタックトレースの表示


 # coding: utf-8
 import traceback, sys

 print("start")

 try:
     number = 0
     answer = 100 / number
     print(answer)

 except ZeroDivisionError as e:
     print(e)
     print("0では割り算できません")
    
     #スタックトレースを表示
     print(traceback.format_exc())
    
     #実行時エラータブに情報を表示
     sys.stderr.write(traceback.format_exc())

 finally:
     print("end") 


NameErrorの例外を検出する


# coding: utf-8


print("start")
try:
    number = 1
    answer = 100 / number
    print(answer2)
    
except NameError as e:
    print("未定義の変数を呼び出しています")
    print(e)

finally:
    print("end")



種類を問わず例外を検出する


 # coding: utf-8

 print("start")

 try:
     number = "a"
     answer = 100 / number
     print(answer2)
 except Exception as e:
     print("予期せぬエラーが発生しました")
     print(e)

 finally:
     print("end")


raiseで意図的に例外を発生させる


 # coding: utf-8

 print("start")
 try:
     raise Exception("意図的な例外")
    
 except Exception as e:
     print("予期せぬエラーが発生しました")
     print(e)

 finally:
     print("end")


raiseで予備元に例外を伝える


 # coding: utf-8

 def test_exception(number):
     try:
         answer = 100 / number
         return answer
        
     except ZeroDivisionError as e:
         #例外を発生させて関数の予備元に伝える
         raise e

 print("start")
 try:
     answer = test_exception(0)
    
 except ZeroDivisionError as e:
     print(e)

 finally:
     print("end")

2020年10月8日木曜日

Python学習 クラス

概要

Pythonのクラスについて学習したので、使用例をまとめます。

クラスとメソッドとオブジェクトの作成


 # coding: utf-8

 #クラスとメソッドを作成
 class Player:
     def walk(self):
         print("ヒトカゲは荒野を歩いていた")
 
     def attack(self, enemy):
         print("ヒトカゲは" + enemy + "を攻撃した")

 #Playerクラスから作ったオブジェクトを変数に代入
 player1 = Player()

 #変数でメソッドを実行
 player1.walk()
 player1.attack("ゼニガメ")
 


クラスと初期化を行うコンストラクタ


 # coding: utf-8

 class Player:
    
     #オブジェクトの初期化を行うコンストラクタ
     #オブジェクトを作るとき最初に呼ばれる
     #selfはインスタンス変数を使うときに必要となる。
     #メソッドの呼び出しに使ったオブジェクト自身を示す。
     def __init__(self, job):
         #インスタンス変数にjobの値を入れる
         self.job = job

     def walk(self):
         print(self.job + "は歩いていた")

 player1 = Player("ヒトカゲ")
 player1.walk()
 


引数と戻り値のあるメソッドを使う


 # coding: utf-8

 class Item:
     #クラス変数
     tax = 1.08
 
     def __init__(self, price, quantity):
         #インスタンス変数に引数を代入
         self.price = price
         self.quantity = quantity

     def total(self):
         #インスタンスから合計を算出。小数点以下を切り捨てる為int関数を使う
         return int(self.price * self.quantity * Item.tax)

 #オブジェクトを作成
 orange = Item(85, 32)
 print("合計金額は" + str(orange.total()) + "円です")


テキストデータを操作するメソッドを使う


 # coding: utf-8

 text = "pYthon"

 #通常表示
 print(text)

 #先頭の文字だけを大文字に変換
 print(text.capitalize())

 #全ての文字を大文字に変換
 print(text.upper())
 
 #文字列が小文字ならTrue。そうでなければFalse。
 print(text.islower())


クラスの中でしか使えないプライベート関数、プライベート変数


 # coding: utf-8

 class Player:
     def __init__(self, job, weapon):
         self.job = job
         #プライベート変数
         self.__weapon = weapon

     def walk(self):
         print(self.job + "は草むらを歩いていた")
         self.__attack("ピカチュウ")

     #プライベート関数
     def __attack(self, enemy):
         print(self.__weapon + "で" + enemy + "を攻撃")

 player1 = Player("サトシ", "棒")
 player1.walk()


継承を使ってスーパークラスとサブクラスを定義する


 # coding: utf-8

 #スーパークラスを定義
 class Box:
     def __init__(self, item):
         self.item = item

     def open(self):
         print("宝箱を開いた。" + self.item + "を手に入れた。")

 #サブクラスを定義
 class JewelryBox(Box):
     def look(self):
         print("宝箱はキラキラと輝いている。")

 #スーパークラスのメソッドが使える
 box = Box("鋼鉄の剣")
 box.open()

 #スーパークラスとサブクラスのメソッドが使える
 jewelrybox = JewelryBox("魔法の指輪")
 jewelrybox.look()
 jewelrybox.open()
 


スーパークラスで定義されたメソッドを書き換える


 # coding: utf-8
 
 class Box:
     def __init__(self, item):
         self.item = item

     def open(self):
         print("宝箱を開いた。" + self.item + "を手に入れた。")

 class MagicBox(Box):
     def look(self):
         print("宝箱は、妖しく輝いている。")
        
     #openメソッドで行われる処理を書き換える(オーバーライド)
     def open(self):
         print("宝箱を開いた。" + self.item + "が襲ってきた!")

 box = Box("やくそう")
 box.open()

 magicbox = MagicBox("ミミック")
 magicbox.look()
 magicbox.open()


サブクラスからスーパークラスで定義されたメソッドを呼び出す


 # coding: utf-8
 
 class Player:
     def __init__(self, name):
         self.name = name

     def attack(self, enemy):
         print(self.name + "は、" + enemy + "を攻撃した!")

 class Wizard(Player):
     def __init__(self):
         #スーパークラスのメソッドに引数を与えて呼び出す
         super().__init__("魔法使い")

     def attack(self, enemy):
         self.__spell()
         print(self.name + "は、" + enemy + "に炎を放った!")


 print("=== パーティーでスライムと戦う ===")
 hero = Player("勇者")
 warrior = Player("戦士")
 wizard = Wizard()

 party = [hero, warrior, wizard]
 for member in party:
     member.attack("スライム")


クラスメソッドをデコレータで定義する


 class Player:
     __charactor_count = 0

     #クラス変数を扱うクラスメソッドをデコレータで定義
     #引数をclsにしてクラス自身を取り込み
     @classmethod
     def summary(cls):
         print(str(Player.__charactor_count) + "人で、スライムを攻撃した。")

     def __init__(self, name):
         self.name = name
         Player.__charactor_count += 1
         print(str(Player.__charactor_count) + "番目のプレイヤー、" + self.name + "が登場した。")

     def attack(self, enemy):
         print(self.name + "は、" + enemy + "を攻撃した!")
        

 class Wizard(Player):
     def __init__(self):
         super().__init__("魔法使い")

     def attack(self, enemy):
         self.__spell()
         print(self.name + "は、" + enemy + "に炎を放った!")

     def __spell(self):
         print("ズバーン!")

 print("=== パーティーでスライムと戦う ===")
 hero = Player("勇者")
 warrior = Player("戦士")
 wizard = Wizard()

 party = [hero, warrior, wizard]
 for member in party:
     member.attack("スライム")

 Player.summary()


datetimeオブジェクトを使う


 from datetime import datetime, timedelta, timezone

 #日本時間に設定
 jst   = timezone(timedelta(hours=9))
 today = datetime.now(jst)
 print(today)
 print(today.year)
 print(today.month)
 print(today.day)

 #データを成形
 day = datetime.strptime("2030/01/10 06:02:19", "%Y/%m/%d %H:%M:%S")
 print(day)

2020年10月6日火曜日

H25春ES午後2問2の解き方 ヒートポンプユニット

問題の感想

ヒートポンプの問題です。難しかったです
  • 設問1

  • (1)(a)ヒートポンプユニットの稼働応答を受信してから加圧ポンプを作動する
    (1)(b)湯張り開始時に一定量給湯し、浴槽水位センサが期待される水位を検出できなければ栓が抜けていると判断する
    (2)(a)297
    (2)(b)86
    1日分の給湯量と給湯温度を予測した結果から夜間電力で貯湯する量を算出します。
    給水温度は常に10℃であり、貯湯温度は常に80℃なので、この情報と表の情報から以下の計算をします。
    (100+50)×(40-10)÷(80-10)=64.29
    (200+200)×(42-10)÷(80-10)=182.86
    (64.29+182.86)×1.2=296.58≒297(リットル)

    深夜電力貯湯を行ってから12時間後に貯湯温度が70℃に下がった場合の給湯可能な量が何%になったか問われていますが、何を計算すればいいのかよくわかりません…。
    求めたいのは、それぞれの温度で必要になる高温水の量なので、それぞれの式を考えてみます。
    80℃の時の高温水の量=給湯量×(給湯温度-10)÷(80-10)
    70℃に下がった時の高温水の量=給湯量×(給湯温度-10)÷(70-10)
    この2つの式の違いは最後に70で割るか60で割るかというところなので、それによって生じる比率を算出すると、60/70×100=85.71≒86(%)となります。
    (3)(a)a:制御すべき情報がないことを通知する情報
    (3)(b)最小時間:5.5
    (3)(b)最大時間:20.5
    制御部がリモコンへのデータ送信を開始してから、リモコンからデータを受信するまで4.5ミリ秒かかる場合に、音声データを受信してから合成された音声データが送信され始めるまでの最小、最大時間を問われているのですが、主語がどこで切れてるのか難しくて困惑します…
    「三つのリモコンに送信する音声データの合成処理は、ヒートポンプユニットに対するポーリングの時間を利用して20ミリ秒に1回行い、5ミリ秒以内に完了する」
    と本文中にあるので、合成処理を行うためにヒートポンプの5ミリ秒は必要であり、最短はその前にポーリング処理が行われる洗面所リモコンが、データ受信を完了したタイミングになります。
    (5ー4.5)+5=5.5(ミリ秒)
    最大は、台所リモコンから受信した音声を合成して、ほかのリモコン(浴室と洗面所)に送信するタイミングになります。
    (5ー4.5)+5+5+5+5=20.5(ミリ秒)

  • 設問2

  • (1)(a)リモコンからのイベントが同時に発生しないから
    (1)(b)リモコン
    (2)(a)追加貯湯を行うか行わないかの設定
    (2)(b)ヒートポンプユニットへの稼働要求と停止要求の送信依頼
    (3)(a)貯湯する量を再計算して、貯湯が必要な時だけ貯湯タスクに貯湯指示の通知を行う
    (3)(b)洗面所リモコンからの受信データの通知を受けた時

  • 設問3

  • (1)b:外種キー以外のキーが押されたこと
    (1)c:外部制御状態を解除
    (1)d:通信
    (1)e:制御許可
    (1)f:制御禁止
    (2)(a)g:通知する前
    (2)(a)h:リモコン
    (2)(a)i:外出
    (2)(a)j:制御禁止
    (2)(b)端末からの操作指示に対するリモコンタスクからの結果を待っている状態で制御禁止を受信したときは、操作無効の送信依頼をLANプロトコルタスクに通知する

2020年10月5日月曜日

H30春ES午後2問2の解き方 競りシステム

問題の感想

競りのシステムの問題です。計算問題がなく読解力が問われる問題でした。
公式の問題はここにあります。
IPAの公式過去問


解答

  • 設問1

  • (1)(a)商品の口数:3口
    (1)(a)販売した口数:3口

    出荷ラベルの枚数が「販売した口数」で、「購入メッセージに付加された口数は99であった」とあり、99の場合は販売された口数をすべて購入。
    なので、「競りが行われた商品の口数」は「販売した口数」と等しくなります。

    (1)(b)c:競り休止

    競り中に台端末から送信されるメッセージは「競り休止」と「競り終了」であり、「競り終了」の場合は「競り結果」が管理サーバに送信されるはずなので、「競り休止」が解答になります。

    (1)(c)d:スクリーン表示指示メッセージで、運用状態を休止中に、販売可能な口数を0で表示する。

    購入メッセージを受信したときに制御装置からスクリーン1に送信される通信の内容を問われています。
    メッセージはスクリーン表示指示なので、そのメッセージ名を用いて回答する必要があります。
    表示する内容は、購入メッセージの口数が99であることから、販売可能な口数が0であることを解答する必要があります。

    (2)競り開始価格で競りを開始する場合

    競り開始のメッセージの説明に、「テンキーで入力された値が無ければ付加される値は0である」とあるので、0で競り開始。
    つまり、「競り開始価格で競りを開始する場合」となります。

    (3)29

    表示領域は600×500の静止画で、1ピクセル当たり3バイト、テキストデータは4kバイト必要とのことなので、データサイズは、
    (600×500×3)+4000=904000バイト
    伝送速度は1Gビット/秒の25%なので250Mビット/秒。バイトに合わせて式を考えると以下のようになります
    904000÷(250000000/8)=28.9ミリ秒≒29ミリ秒


  • 設問2

  • (1)(a)スクリーンと台端末への休止中及び新たな販売可能な口数の表示
    (1)(b)最初に取引が成立してから一定時間経過するまでの間

    ある時点からある時点の間に購入要求を受けた時に取引が成立しないと判断するそうです。
    競りのシステムがよくわかりませんが、最初の購入は取引が成立して、購入メッセージの受信を一定時間待った後に取引が成立しなかったすべての買参人端末に取引が成立しなかったことを表示します。
    そのあとはマリ販売が行われ購入メッセージを受け付けることができるので、この回答になります。

    (2)(a)買参人番号、口数
    (2)(b)b:該当する買参人端末に、買参人端末表示指示メッセージを送信

    買参人タスクが購入応答を受けた時の処理を穴埋めします。
    買参人タスクは購入応答で購入の成立/不成立を知ることができます。
    この結果を知った時に行う処理としては、買参人端末に通知することなので、この回答になります。

    (3)(a)a:購入履歴情報の中から、該当する買参人の最後のレコード番号を求め前回レコード番号として記憶

    買参人タスクが起動後に買参人番号を使って行う処理を穴埋めします。
    問題文の中に「買参人番号に対するレコードは購入履歴情報の中に一つ以上存在するものとする」と書いているのでこれをヒントにして考えます。

    (3)(b)追加したレコードには-1を、前回レコード番号のレコードには追加したレコードのレコード番号をそれぞれ書き込む

    購入履歴を古い順に表示させる方法を考えます。
    従来は、最も古いレコードのリンクに-1を設定して、新たに追加したレコードの中に前回レコードの番号を記載していました。
    これを逆にしたいので、追加したレコードには-1を、前回レコード番号のレコードには追加したレコードのレコード番号をそれぞれ書き込む。
    ということになります。


  • 設問3

  • (1)e:商品追加完了
    (1)f:移動処理
    (1)g:商品追加許可
    (2)h:指定された商品情報を競り待ちテーブルの末尾に追加
    (3)i:商品追加要求
    (3)j:商品移動指示
    (3)k:商品移動完了
    (3)l:商品追加許可
    (3)m:競り制御タスクおよび進行監視タスクがデッドロック状態になる

    もし、競り制御タスクが商品移動指示の処理を保留して商品追加許可を待つと発生する不具合の内容を問われています。
    商品追加許可は進行管理タスクから送信されますが、状態が商品移動状態の場合通知は保留するとあります。
    このことから競り制御タスクと進行管理タスクでデッドロックが発生することを解答する必要があります。


2020年10月3日土曜日

H29春ES午後2問2の解き方 複数の駐輪場を管理するシステム

問題の感想

駐輪場の問題です。計算問題がなく読解力が問われる問題でした。

解答

  • 設問1

  • (1)(a)返却通知、精算カード支払い通知
    (1)(b)会員番号、自転車ID
    (1)(c)管理サーバからレンタル用ラック数を増やす指示を受信した結果、空き一般用ラックを空きレンタル用ラックとする場合
    (2)(a)f:会員番号確認要求
    (2)(a)i:貸出通知
    (2)(b)g:電子ロック制御指示
    (2)(b)h:自転車検出通知
    (3)(a)情報:精算機に接続されているラックの総数
    (3)(a)取得方法:精算機に戻ってきた接続確認要求の3バイト目から取得する
    (3)(b)a:受信したシリアルIFとは異なるシリアルIF

  • 設問2

  • (1)(a)貸出可能なレンタル自転車の有無と、有りの場合のラック番号
    (1)(b)一定時間後にレンタル待ち状態に遷移し、貸出可能になっている可能性があるから
    (1)(c)b:レンタル待ち
    (1)(c)c:同一の会員番号
    ラック管理タスクの処理の中で、レンタル通知を受けた時の処理を穴埋めします。
    bは、「空き2」以外で「レンタル可」返す状態を回答すればいいので、「レンタル通知」を受けて「取出待ち2」状態になった後の状態を回答すればいいので、
    「レンタル待ち」となります。
    cは、状態が「取出待ち2」のままの時「レンタル不可」を返す対象を回答するので、「同一の会員番号」が解答になります。
    (2)(a)レンタル用ラックに一般自転車を止めている状態
    (2)(b)d:自転車ID NG
    (2)(b)e:自転車ID OK
    (3)ラックの状態が自転車ID確認待ち1からレンタル待ちに変化することで種別が変化したことを認識する
    一般用ラックにレンタル自転車を返却した場合に、ラック管理タスクが種別変化を認識する方法を回答します。
    ラック管理タスクは、状態の変化をラック制御タスクからのラック状態通知で知ることができます。
    ラック制御タスクの状態遷移図を見ると、一般用ラックにレンタル自転車(自転車IDがある自転車)が返却された場合には、 状態が「自転車ID確認待ち1」から「レンタル待ち」に変化していることがわかります。この通知で種別変化を認識することができます。

  • 設問3

  • (1)j:要求した会員番号以外の応答
    ラック管理タスクの処理の中で、管理サーバから「会員番号確認応答」を受信したときに精算機2に送信する場合の条件を回答します。
    「会員番号確認要求」はもともと精算機(ラック管理タスク)から送信されていたものですので、それが2台になったことで精算機1から送信された要求でなければ、精算機2に送信する必要があります。
    (2)操作内容:精算機1で貸出手続きを行い、レンタル自転車を取り出す前に精算機2で同じ貸出カードで貸出手続きを行った
    (2)変更点:レンタル要求で指定された会員番号を他精算機のラック管理タスクに送信し、重複で借りられないようにする。
    精算機1から「貸出通知」が送信されてから、精算機2からも「貸出通知」が送信される事象が発生したそうです。この不具合解析をします。
    操作内容については、「貸出通知」が送信される契機が、ラックからレンタル自転車が取り出されて貸し出された際に通知するものですが、自転車の貸し出しは自転車を借りた状態では借りれないように管理しているはずです。
    通常は、自転車の「貸出通知」でだれが自転車を借りているかを把握しているのですが、今回はそれが2回出てしまっているということで、考えられる操作内容としては、 「精算機1で貸出手続きを行い、レンタル自転車を取り出す前に精算機2で同じ貸出カードで貸出手続きを行った。」となります。
    変更点としては、「貸出通知」で管理していたレンタル済みの利用者の情報をもっと早い段階で認識する必要があるので、貸出する際のレンタル通知の情報を他の精算機と共有する必要があります。なので、変更点としては、 「レンタル要求で指定された会員番号を他精算機のラック管理タスクに送信し、重複で借りられないようにする。」となります。
    (3)ラック状態を受信する前に、他精算機からの精算要求を受信した
    「③精算通知待ちで精算要求を受けると、精算応答でエラーを通知する」この事象が発生するシーケンスを回答します。
    従来、ラック管理タスクは、ラック制御タスクが「精算待ち」状態の時だけに「精算要求」を行っていましたが、精算機が2台になり、ほかの精算機からは「精算待ち」状態でない場合にも「精算要求」を送信してしまうことでこのエラーが発生しています。
    なので、回答としては、「ラック状態を受信する前に、他精算機からの精算要求を受信した」となります。

2020年10月2日金曜日

H23春ES午後2問2の解き方 入退場ゲートシステム

問題の感想

入退場ゲートシステムの問題です。

解答

  • 設問1

  • (1)(a)利用者を認証する
    (1)(b)入退場情報を取得する
    (1)(c)動作モードを設定する
    (2)(a)状態名:認証完了待ち
    (2)(a)状態遷移条件:カード検出
    (2)(a)状態遷移時の処理:退場用カードリーダ読みとり禁止
    (2)(a)状態遷移時の処理:認証開始
    (2)(b)d:ゲートにセンサ又はゲート外センサ通過
    (2)(b)e:退場用カードリーダ読取り禁止
    (2)(b)f:退場用カードリーダ読取り許可
    (2)(c)ゲート内センサ、ゲート外センサの通過を順次待ち、その後ふらっぱを閉じてからz入退場情報を送信し、入場方カードリーダを読取り許可状態にする
    (3)g:0.5
    (3)h:2.7
    (3)i:3.7
    装置の処理時間を問われています。
    まずgは「親機が子機1の入退場情報をSCに送信し始めてから子機4の入退場情報を受信し終わるまでの時間」とあるので、
    10Mビット/秒の50%の通信効率なので、5Mビット/秒。 バイトに直して3台分の100バイトのデータを送信するので、300バイト÷5/8Mバイト=0.48ミリ秒
    小数第一までで求めるので回答は以下になります。
    0.5ミリ秒

    hは子機4の入退場受信中に親機の入退場情報が発生した場合の割込み時間を問われています。
    親機の入退場情報をの送信時間を求めればいいので、100バイト÷1/8Mバイト=0.8ミリ秒
    この後、親機と子機1~3の入退場情報をSCに送信した後に子機4の入退場情報がSCに送信されます。ただし、子機1~3の入退場情報を親機は受信済みなので、
    0.8ミリ秒×4-(0.48ミリ秒)=2.72ミリ秒。小数第2を四捨五入するので、回答は2.7ミリ秒となります。

    iは子機4が入退場情報をLANに送信し始めてからの時間なので0.16ミリ秒。
    hで求めた割込み時間の2.7ミリ秒。子機4の情報がSCに送信される時間の0.8ミリ秒の合計で以下になります。
    0.16ミリ秒+2.7ミリ秒+0.8ミリ秒=3.66ミリ秒 四捨五入して3.7ミリ秒
    。ここではブロックごとに同じ関数を呼び出す可能性があるので、関数の引数にブロック番号を入れるのが効果的です。なのでjの回答は、「ブロックを示す番号」となります。

  • 設問2

  • (1)(a)1回目の認証でエラーとなったが、2回目の認証で認証でき、正常に入場した。
    (1)(b)フラッパ入場開要求
    (2)(a)子機からの認証要求処理が遅延しないようにするから
    (2)(b)通過制御タスク:動作モード指示
    (2)(b)ID情報管理タスク:ID情報通知
    (2)(b)親子通信監理タスク:動作モード指示
    (3)認証要求を受信したら親子通信監理タスクに認証要求の送信依頼を行い、その受信した結果を要求タスクに送信する。

  • 設問3

  • (1)ゲート内にいる利用者の情報送信要求
    (2)j:1.5秒タイマ
    (2)k:カードリーダ
    (2)l:カード検出通知
    (2)m:ID情報管理
    (2)n:緊急指示
    (3)緊急指示を受信したとき、その受信したことをSC通信管理タスクに通知する処理を追加する

H27春ES午後2問2の解き方 多地点接続テレビ会議システム

問題の感想

多地点接続テレビ会議システムの問題です。似たようなデータがたくさん出てくるので、その辺の情報が整理できないと難しいです。

解答

  • 設問1

  • (1)(a)a:未登録
    (1)(a)b:登録失敗
    (1)(a)c:一定時間経過
    (1)(a)d:登録完了
    (1)(a)e:接続要求受信
    (1)(a)f:切断要求受信
    (1)(b)遷移元状態名:会議
    (1)(b)遷移先状態名:待機
    (1)(b)遷移条件:会議サーバとの通信途絶
    (2)(a)g:②
    (2)(a)g:④
    (2)(a)g:④
    (2)(a)g:⑦
    (2)(a)g:⑤
    (2)(a)g:⑤
    (2)(b)②の処理が実行中なので⑦の処理が待たされるから
    (2)(c)66%
    会議状態で、魚眼カメラを使用しており、モニタ出力している時のMPUの使用率を問われています。
    図9の中にMPUの動作状況が載っているので、その中の100ミリ秒に着目してMPUの使用率を求めます。

    ①⑧処理 (0.2+0.2)×5=4ミリ秒
    ②③④処理 8.3+0.1+7.8=16.2ミリ秒
    ⑤⑥⑦処理 8.0+0.1+7.8=15.9ミリ秒
    4+16.2+15.9=34.1ミリ秒

    これに魚眼レンズを使用して発話者検出をした場合のMPU使用率が32%と問題文にあるので、
    34.1+32=66.1%
    整数で答えよとあるので、四捨五入して66%が回答になります。

  • 設問2

  • (1)(a)管理タスクが操作画面バッファを編集中に、映像出力タスクが起動されたとき
    (1)(b)9個
    「動画処理DSPが圧縮・合成を行っている間の100ミリ分の音声データは保持されなければならない」とあるので、100ミリ秒÷20ミリ秒で5ブロック必要で、
    さらに「圧縮・合成処理には80ミリ秒かかる」とあるので、80ミリ秒÷20ミリ秒=4ブロックが追加で必要となります。
    (1)(c)人物検出処理中にカメラ映像が上書きされることを防ぐため
    (2)(a)(ア)発話者マーク位置通知
    (2)(a)(イ)音声入力通知
    (2)(a)(ウ)出力映像切替え要求
    (2)(b)m:音声入力
    (2)(b)n:会議音声
    (2)(b)o:音声出力
    (2)(c)カメラ切替え通知
    (3)(a)p:カメラ映像の2分割
    (3)(a)q:発話者マークの合成
    (3)(a)r:4
    拠点動画処理タスクが音声入力通知の回数を利用して行う処理を問われています。
    音声入力通知は20ミリ秒周期に通知されるのですが、[MPUの音声・映像処理概要]のところに「100ミリ秒分の音声・映像が格納されたところで、動画処理DSPを使用して圧縮・合成する。」とあるので、rの回答は4(0始まりで100ミリ秒を検出したいので)になります。
    (3)(a)s:動画処理DSP
    (3)(a)t:圧縮・合成要求
    (1)(b)会議映像メモリの内容と操作画面バッファの内容とを合成してモニタに出力する

  • 設問3

  • (1)魚眼カメラの映像でないと人物検出ができないから
    (2)人物の名前
    (3)(a)u:カメラ切替え通知
    (3)(a)v:音声方向通知
    (3)(a)理由:魚眼カメラの映像を出力するしかないかを判断する必要があるから
    (3)(b)w:人物の位置と名前
    (3)(c)x:魚眼カメラの映像