AIの訓練と言えば途上国の画像アノテーションのイメージでしたが、最近の訓練はかなり高度化しているようですね。
専門性を活かせるなら、副業としては結構良さそうです。
脅威モデリングは、システムに対する潜在的な脅威を特定し、対策を講じるための重要なプロセスです。数ある脅威モデリング手法の中でも、リスク中心のアプローチを採用した「TRIKE」は、特にデータフロー図(DFD)を用いた分析に重点を置いています。
今回は、TRIKEの基本概念から特徴、プロセス、そして利点まで、分かりやすく解説します。
TRIKEは、リスク中心のアプローチを採用した脅威モデリング手法です。オープンソースのセキュリティ監査フレームワークとして開発され、特にデータフロー図(DFD)を用いた分析に重点を置いています。
つまり、システムに対する脅威を「リスク」として捉え、DFDを用いて分析することで、より効果的な脅威対策を実現する手法です。
TRIKEは、以下のプロセスで実施されます。
TRIKEは、特にデータフローが複雑なシステムや、リスクベースの脅威モデリングを重視する場合に有効な手法です。TRIKEを活用することで、より効果的な脅威モデリングを実現し、システムのセキュリティを向上させましょう。
前の記事の続きになります。
左側[ツリービュー]の [EditScreen1>EditForm1]を選択し、右側[プロパティ]の[ディスプレイ>フィールド]の[フィールドの編集](環境によっては[8件選択済み])を選択し、[フィールドの追加]を選択します。
[ID]にチェックをつけ、[追加]を選択します。
tasks、good_points、improvement_point、manager_commentについて、コントロールの種類を[テキストの編集]から[複数行テキストの編集]に変更します。
項目IDのDataCardValueXXの番号部分(この例では17)を確認の上、画面タイトルを選択し、以下の通り設定します。
・Textプロパティ:"執務日報 (ID:" & DataCardValue17.Text & ")"
これにより、画面タイトルにIDの値が表示されるようになります。
なお、この後も項目の値により表示や色などを制御する式を多く設定します。DataCardValueの番号部分は左ツリーで確認してください。
項目IDの全体領域を選択し、右側プロパティの[ディスプレイ>表示]をオフにしておきます。
これにより、項目IDが編集エリアで非表示になります。
少々扱いに癖がありますが、各項目の全体領域を選択し、右側[プロパティ]の[詳細設定]の下の方にある、[Height]、[Width]、[X]、[Y]に値設定すると意図したレイアウトになります。
・0行目:working_day(幅320),status(幅320,X320)
・1行目:reporter(幅320),manager(幅320,X320)
・2行目:tasks(幅640)
・3行目:good_points(幅640)
・4行目:improvement_points(幅640)
・5行目:manager_comment(幅640)
この例では、データのステータスやアプリユーザーの役割に応じて表示モード・入力必須を切り替えます。また、報告日からマネージャーまでは初期値を設定します。
まずは報告日(working_day)を設定します。
全体領域を選択し、右クリックで[ロック解除]を選択の上、以下の通り設定します。
・DisplayModeプロパティ:If(DataCardValue10.Text=User().FullName && DataCardValue11.Selected.Value="下書き", DisplayMode.Edit, DisplayMode.View)
※報告者がアプリユーザーかつステータスが下書きの場合は編集モード、それ以外は閲覧モードとします
・Requiredプロパティ:If(DataCardValue10.Text=User().FullName && DataCardValue11.Selected.Value="下書き", true, false)
※報告者がアプリユーザーかつステータスが下書きの場合は入力必須、それ以外は任意とします
続けてデータ領域を選択し、以下の通り設定します。
・DefaultDateプロパティ: If(EditForm1.Mode = FormMode.New,Today(),ThisItem.working_day)
※新規登録時は今日の日付を設定し、それ以外は既存の値を設定します
・Fillプロパティ:If(DataCardValue10.Text=User().FullName && DataCardValue11.Selected.Value="下書き", RGBA(255, 255, 255, 1), RGBA(166, 166, 166, 1))
※報告者がアプリユーザーかつステータスが下書きの場合は背景色を白色、それ以外は灰色にします
・Sizeプロパティ:21
次はステータス(status)を設定します。
全体領域を選択し、右クリックで[ロック解除]を選択の上、以下の通り設定します。
・DisplayModeプロパティ:DisplayMode.View
※ステータスはユーザーが値を指定するのではなく、保存⇒確認依頼⇒確認処理に応じて自動更新するため、閲覧モードとします
続けてデータ領域を選択し、以下の通り設定します。
・DefaultSelectedItemsプロパティ:If(EditForm1.Mode = FormMode.New,Choices([@執務日報].status,"下書き"),ThisItem.status)
※新規登録時は”下書き”を設定し、それ以外は既存の値を設定します
・Fillプロパティ:RGBA(166, 166, 166, 1)
※背景色を灰色にします
報告者(reporter)を設定します。
全体領域を選択し、右クリックで[ロック解除]を選択の上、以下の通り設定します。
・DisplayModeプロパティ:DisplayMode.View
※報告者は自動取得するため、閲覧モードとします
続けてデータ領域を選択し、以下の通り設定します。
・Defaultプロパティ: If(EditForm1.Mode = FormMode.New,User().FullName,ThisItem.reporter)
※新規登録時はアプリユーザーの表示名を設定し、それ以外は既存の値を設定します
・Fillプロパティ:RGBA(166, 166, 166, 1)
※背景色を灰色にします
マネージャー(manager)を設定します。
全体領域を選択し、右クリックで[ロック解除]を選択の上、以下の通り設定します。
・DisplayModeプロパティ:DisplayMode.View
※マネージャーは自動取得するため、閲覧モードとします
続けてデータ領域を選択し、以下の通り設定します。
・Defaultプロパティ: If(EditForm1.Mode = FormMode.New,glb_manager,ThisItem.manager)
新規登録時は前の記事の工程5で定義したグローバル変数(アプリユーザーのマネージャーの表示名、マネージャー不在の場合は本人の表示名)を設定し、それ以外は既存の値を設定します
・Fillプロパティ:RGBA(166, 166, 166, 1)
※背景色を灰色にします
業務内容(tasks)を設定します。
全体領域を選択し、右クリックで[ロック解除]を選択の上、以下の通り設定します。
・DisplayModeプロパティ:If(DataCardValue10.Text=User().FullName && DataCardValue11.Selected.Value="下書き", DisplayMode.Edit, DisplayMode.View)
※報告者がアプリユーザーかつステータスが下書きの場合は編集モード、それ以外は閲覧モードとします
・Requiredプロパティ:If(DataCardValue10.Text=User().FullName && DataCardValue11.Selected.Value="下書き", true, false)
※報告者がアプリユーザーかつステータスが下書きの場合は入力必須、それ以外は任意とします
続けてデータ領域を選択し、以下の通り設定します。
・Fillプロパティ:If(DataCardValue10.Text=User().FullName && DataCardValue11.Selected.Value="下書き", RGBA(255, 255, 255, 1), RGBA(166, 166, 166, 1))
※報告者がアプリユーザーかつステータスが下書きの場合は背景色を白色、それ以外は灰色にします
良かった点(good_points)を設定します。
全体領域を選択し、右クリックで[ロック解除]を選択の上、以下の通り設定します。
・DisplayModeプロパティ:If(DataCardValue10.Text=User().FullName && DataCardValue11.Selected.Value="下書き", DisplayMode.Edit, DisplayMode.View)
※報告者がアプリユーザーかつステータスが下書きの場合は編集モード、それ以外は閲覧モードとします
続けてデータ領域を選択し、以下の通り設定します。
・Fillプロパティ:If(DataCardValue10.Text=User().FullName && DataCardValue11.Selected.Value="下書き", RGBA(255, 255, 255, 1), RGBA(166, 166, 166, 1))
※報告者がアプリユーザーかつステータスが下書きの場合は背景色を白色、それ以外は灰色にします
反省点(improvement_points)も上記と同じ要領で設定します(画面イメージは割愛します)。
最後に、マネージャーコメント(manager_comment)を設定します。
全体領域を選択し、右クリックで[ロック解除]を選択の上、以下の通り設定します。
・DisplayModeプロパティ:If(DataCardValue15.Text=User().FullName && DataCardValue11.Selected.Value="確認待", DisplayMode.Edit, DisplayMode.View)
※マネージャーがアプリユーザーかつステータスが確認待の場合は編集モード、それ以外は閲覧モードとします
続けてデータ領域を選択し、以下の通り設定します。
・Fillプロパティ:If(DataCardValue15.Text=User().FullName && DataCardValue11.Selected.Value="確認待", RGBA(255, 255, 255, 1), RGBA(166, 166, 166, 1))
※マネージャーがアプリユーザーかつステータスが確認待の場合は背景色を白色、それ以外は灰色にします
右上の保存アイコンが確認処理と間違えそうなのでイメージを変更します。
右上のアイコンを選択し、右側プロパティの[ディスプレイ>アイコン]のリストを選択し、[保存]を検索してこれを選択します。
さらに、このアイコンのVisibleプロパティを以下の通り設定します。
If(DataCardValue10.Text=User().FullName && DataCardValue11.Selected.Value="下書き", true,
If(DataCardValue15.Text=User().FullName && DataCardValue11.Selected.Value="確認待",true,false)
)
※報告者がアプリユーザーかつステータスが下書きの場合か、マネージャーがアプリユーザーかつステータスが確認待の場合は表示し、その他の場合は非表示とします
左側[ツリービュー]の [DetailScreen1>DetailForm1]を選択し、右側[プロパティ]の[ディスプレイ>フィールド]の[8件選択済み]を選択し、[フィールドの追加]を選択します。
[ID]にチェックをつけ、[追加]を選択します。
項目IDのDataCardValueXXの番号部分(この例では14)を確認の上、画面タイトルを選択し、以下の通り設定します。
・Textプロパティ:"執務日報 (ID:" & DataCardValue14.Text & ")"
項目IDの全体領域を選択し、右側プロパティの[ディスプレイ>表示]をオフにしておきます。
これにより、項目IDが編集エリアで非表示になります。
少々扱いに癖がありますが、各項目の全体領域を選択し、右側[プロパティ]の[詳細設定]の下の方にある、[Height]、[Width]、[X]、[Y]に値設定すると意図したレイアウトになります。
・0行目:working_day(幅320),status(幅320,X320)
・1行目:reporter(幅320),manager(幅320,X320)
・2行目:tasks(幅640)
・3行目:good_points(幅640)
・4行目:improvement_points(幅640)
・5行目:manager_comment(幅640)
マネージャーのEmailアドレスをコンテキスト変数に格納します。この値は確認依頼時にTeamsの通知先として使用します。
左側[ツリービュー]の [DetailScreen1]を選択し、OnVisibleプロパティを以下の通り設定します。
//マネージャーのEmailアドレスを取得(確認依頼フローで使用)
UpdateContext({
loc_manager_email:LookUp(
Office365ユーザー.SearchUserV2( {searchTerm:"",
isSearchTermRequired:false} ).value,
DisplayName = DataCardValue7.Text
).Mail
});
※式の意味:マネージャーの表示名を元にマネージャーのEmailアドレスを取得します
削除アイコンを二回コピー&ペーストして、確認依頼アイコンと確認処理アイコンとして流用します。
追加したアイコンの左側ツリーと右側プロパティの詳細タブにて、下表の通り設定します。
一通り調整すると、以下のようになります。
なお、確認処理アイコンと削除アイコンの位置が重なっていますが、この後、ステータスと役割に応じた表示制御を設定しますので、問題ありません。
左側ツリーにて確認処理アイコン(IconConfirm1)を選択し、[OnSelect]プロパティを以下の通り設定します。
//確認処理(ステータス更新)
Patch(執務日報,
LookUp(執務日報,ID=Value(DataCardValue14.Text)),
{ status:{Value:“確認済”} }
)
※式の意味:IDをキーにこのデータのステータスを確認済に更新します
左側ツリーにて確認依頼アイコン(IconSubmit1)を選択し、[OnSelect]プロパティを以下の通り設定します。
//確認依頼の処理(ステータス更新、上司へのTeams確認依頼(フロー呼出し))
Patch(執務日報,
LookUp(執務日報,ID=Value(DataCardValue14.Text)),
{ status:{Value:"確認待"}}
);
UpdateContext({localResponse:執務日報_確認依頼通知.Run(
loc_manager_email /* manager's email */, DataCardValue1.Text /* working_day */,
DataCardValue2.Text /* reporter */, DataCardValue4.Text /* tasks */,
If(IsBlank(DataCardValue5.Text)," ",DataCardValue5.Text) /* good_points */,
If(IsBlank(DataCardValue6.Text)," ",DataCardValue6.Text) /* improvement_points */,
DataCardValue14.Text /* ID */
)});
※式の意味:IDをキーにこのデータのステータスを確認待に更新し、確認依頼通知フローを実行します。なお、入力必須でない良かった点・改善点がブランクの場合、フローが正常に実行されませんので、その場合は半角スペースを入れた文字を渡しています。
ちなみに、この段階ではフローが未作成のためエラーが出ますが、フローについては次の工程で紹介します。
最後に、各アイコンのVisibleプロパティにて以下の通り、表示制御を設定します。
・確認処理アイコン(IconConfirm1):If(DataCardValue7.Text=User().FullName && DataCardValue3.Selected.Value="確認待", true, false)
・確認依頼アイコン(IconSubmit1):If(DataCardValue2.Text=User().FullName && DataCardValue3.Selected.Value="下書き", true, false)
・削除アイコン(IconDelete1):If(DataCardValue2.Text=User().FullName && DataCardValue3.Selected.Value="下書き", true, false)
・編集アイコン(IconEdit1):If(DataCardValue2.Text=User().FullName && DataCardValue3.Selected.Value="下書き", true,
If(DataCardValue7.Text=User().FullName && DataCardValue3.Selected.Value="確認待",true,false)
)
※各式の意味:報告者がアプリユーザーかつステータスが下書きの場合は確認依頼・削除・編集アイコンを表示し、マネージャーがアプリユーザーかつステータスが確認待の場合は確認処理・編集アイコンを表示します
左端の[・・・]アイコンを選択し、[Power Automate]を選択し、[フローを新規作成する]を選択します。
[+ 最初から作成]を選択します。
先にフロー全体を示します。
PowerAppsアプリから通知に必要なデータを受け取り、それらに基づきTeamsにアダプティブカードを投稿します。アダプティブカードの応答を受け取り、JSONの解析によりマネージャーコメントを取り出し、SharePointリストのマネージャーコメントに反映しています。
また、フロー名は[執務日報_確認依頼通知]としました。
ここから各ステップの設定内容を紹介します。
[Power Apps (V2)]ステップでは、[入力の追加]より前の工程の[確認依頼]アイコンでフロー呼出しを行ったときの引数を定義します。
・電子メール:email
・テキスト:working_day
・テキスト:reporter
・テキスト:tasks
・テキスト:good_points
・テキスト:improvement_points
・数:id
次のステップを追加する前に、 Webブラウザーの別タブからPowerAppsのアプリ一覧画面を開き、執務日報アプリのURLを確認しておきます。
PowerAppsのアプリ一覧画面で対象アプリの三点マークを選択し、[詳細]を選択します。
Webリンクに表示される値が執務日報アプリのURLですので、これをメモ帳等にコピー&ペーストして控えておきます。
[変数を初期化する-power-apps-url]ステップの設定は以下の通りです。
・ステップの種類:[組み込み>変数>変数を初期化する]
・名前:power-apps-url
・種類:文字列
・値:(先ほど控えた執務日報アプリのURLをペーストする)
[変数を初期化する-adaptive-card]ステップの設定は以下の通りです。
・ステップの種類:[組み込み>変数>変数を初期化する]
・名前:adaptive-card
・種類:文字列
・値: (AdaptiveCardのJsonデータ。後述します)
※AdaptiveCardの作成例:Microsoft Teams にアダプティブ カードを投稿するフローを作成する - Power Automate | Microsoft Learn
AdaptiveCardの値(Jsonデータ)となるコードを改めて掲載します。
{
"$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
"type": "AdaptiveCard",
"version": "1.0",
"body": [
{
"type": "TextBlock",
"text": "執務日報の確認依頼が届きました",
"id": "Subject",
"spacing": "Medium",
"size": "ExtraLarge",
"weight": "Bolder",
"color": "Accent"
},
{
"type": "Container",
"items": [
{
"type": "TextBlock",
"text": "報告者:@{triggerBody()['text_1']}, 稼働日:@{triggerBody()['text']}",
"wrap": true
},
{
"type": "TextBlock",
"text": "■業務内容\n\n@{triggerBody()['text_2']}",
"wrap": true
},
{
"type": "TextBlock",
"text": "■良かった点\n\n@{triggerBody()['text_3']}",
"wrap": true
},
{
"type": "TextBlock",
"text": "■改善点\n\n@{triggerBody()['text_4']}",
"wrap": true
}
]
},
{
"type": "Input.Text",
"placeholder": "報告内容についてコメントがあれば入力",
"style": "text",
"isMultiline": true,
"maxLength": 200,
"id": "manager-comment"
}
],
"actions": [
{
"type": "Action.Submit",
"title": "確認済",
"id": "submit-button"
},
{
"type": "Action.OpenUrl",
"title": "アプリを開く",
"url": "@{variables('power-apps-url')}"
}
]
}
以下は補足事項です。
[アダプティブカードを投稿して応答を待機する]ステップは以下の通りです。
・ステップの種類:[標準>Microsoft Teams>アダプティブ カードを投稿して応答を待機する]
・投稿者:フローボット
・投稿先:フローボットとチャットする
・メッセージ(変数):adaptive-card
・Recipient(変数):email
・IsAlert:はい
また、ステップ名のアダプティブとカードの間に半角スペースがありますが、これを忘れずに削除しておきます(後続の[JSON の解析]ステップの式内でこのステップを指定する際、ステップ名に半角スペースが含まれると正しく動作しないため)。
次のステップでJSONの解析を追加する際、フローの実行結果を使うと、コンテンツとスキーマを簡単に設定できます。
フローを実行するため、まずは右上のアイコンからフローを保存しておきます。
Webブラウザーの別タブからPowerAppsのフロー一覧画面を開き、対象フローの実行アイコンを選択します。
右側にポップアップしたパラメーター(フローの一番最初のステップで指定した入力項目)を適宜入力し、[フローの実行]を選択します。
指定したemailのユーザーのTeamsに通知が届いたら、コメントを入力して[確認済]を選択します。
PowerAppsのフロー一覧画面の対象フローを選択し、直近の実行履歴を選択します。
[アダプティブカードを投稿して応答を待機する]ステップの[出力>body]の値をコピーします。
フローの作成画面に戻り、
[JSON の解析]ステップを設定します。
・ステップの種類: [組み込み>データ操作>JSON の解析]
・コンテンツ(式): body('アダプティブカードを投稿して応答を待機する')
・スキーマ:([サンプルから生成]を選択し、先ほどフローの実行履歴からコピーした値をペーストする)
[項目の更新]ステップは以下の通りです。
・ステップの種類:[標準>SharePoint>項目の更新]
・サイトのアドレス:(執務日報データの格納先であるSharePointリストのあるサイト)
・リスト名:執務日報
・ID(変数):id
・status Value:確認済
・manager-comment(変数):manager-comment
右上のアイコンからフローを保存して閉じ、アプリの編集画面に戻ります。
アプリ編集画面右上の[保存]アイコンを選択し、[公開]アイコンを選択します。
[このバージョンの公開]を選択します。
左上の[戻る]を選択し、アプリの編集を終了します。
このアプリの作成において、特にポイントになりそうな設定要素を挙げておきます。何かアプリを作成する時の参考になれば幸いです。
また、この例では応答を待つアダプティブカードを使用しましたが、報告者が多くいるマネージャーですと煩わしいかもしれません。確認済ボタンを無くした応答を待たないアダプティブカードに変更する、一覧画面に一括確認の機能(別の記事で紹介)を設ける(マネージャーが確認する意味がなくなりそうですが・・・)など、運用しながら使いやすい形に改善していけると良いと思います。
昨日はさいたまマラソンについて書きました。
先日の日曜日がワースト天候だと思ってましたが、今日がまさかの大雪で更新されましたねw 今日が大会でなくて本当に良かったです。寒さというよりも道路が滑りやすくなって危険をともないますからね(流石に中止かもしれませんが)。
寒さと雨風で心折られた人も多いはずです。私もネガティブになりかけましたが途中からランナー皆でゴールを目指していくという気持ちが強くなってなんだかんだテンションが上っていきました。
こうした気持ちになれた理由を後から考えてみると、昨年の富士山登山の経験が大きかったかなと思います。
大雨の中での登山で真冬並みの寒さに加えて、荷物がすべてずぶ濡れで着替えもほぼ全滅、さらに高山病による体調不良が重なって、本当に辛かったです。
それと比べると、寒さはあっても荷物と着替えは無事ですし高山病のような頭痛や吐き気、息苦しさもありません。とてもつらい経験をしているから、このぐらいのことではなんてことないなと思ってしまいました。感覚が麻痺している気もしますw
こちらの講座を修了したので、講座の内容と感想を書く。 www.udemy.com
タイトルそのまま、C#を勉強する順番を1時間程度で解説している動画。
の順に勉強することを推奨し、その理由を教えてくれている。
私はC#歴が長いのだが、その割には「プログラミングができる!」という手ごたえがあまり無く、現在も迷走している。 そんな中でながら見しつつ視聴した。 文法、コーディングルール、オブジェクト指向は新卒のころから嫌になるほどやっている。 TDDも職場で一応それらしきものをやっている。 ちょっとエセだけど。 ドメイン駆動開発、デザインパターン、リファクタリングは今の私の関心を寄せる内容であり、 同時に本やネットの記事を読もうとしても中々読めていないもの達だ。
今の自分の現在地を確認し、次のステップを目指そうという気持ちにしてくれる良い動画だと思った。 今は手を動かしたい時期なので、次は同作者の「C#でドメイン駆動開発」シリーズを進めてみようと思う。
プロジェクトマネジメントについて、個人的なコツをまとめてみた。とくに、工数や工期の見積もりについての考え方を中心に書いている。
時間やストーリーポイントなど、まずは何かしら工数を見積ると思うが、その際は「不確実性コーン」を意識することを心掛ける。
プロジェクトのスコープ、ステークホルダー、要求事項、リスクなど、プロジェクト進行に必要な情報は、プロジェクト開始時には明確になっていないことも多いため、見積もりの振れ幅は大きくなる傾向がある。プロジェクトを検討し始めた時は、0.25倍〜4.0倍の振れ幅があり、プロジェクトの工程が進むにつれて、この振れ幅は小さくなる。この特徴をグラフで表したものが「不確実性コーン」である。
工数の見積もりをする際には、プロジェクトの現在地を考え、感覚値でも良いので最大の振れ幅も考慮しておく。また、現在地が移動した際には、新たに明らかになったり確定した情報が増えているはず。なので、工程やタスクの切れ目では、後続タスクの見直しを行い、スケジュールを常に最新の状態に保つことが重要だと思う。
工数が見積もれたら、次は「可処分時間」「バッファ」「営業日」などを意識しながら工期を考える。
この工期見積もりでよくありがちな失敗として、n時間の工数を単純に8で割った数を必要日数としてしまい、余裕のないギチギチのスケジュールになってしまうことがある。現実的な工期見積もりを実施するために、工数とは別の変数も合わせて考えると良い。
これらの変数を用いて 「(必要総工数 × バッファ係数)÷ 1日あたりの可処分時間 = 必要日数」 を計算する。たとえば、合計100時間を見積もった場合は「(100h x 1.5)÷ 4h = 37.5d」のように計算ができ、ここからさらに営業日を考慮して、最終的な工期を見積もることができる。
バッファの掛け方については、人は資源をあればあるだけ使ってしまうという 「パーキンソンの法則」 もあるので、「CCPM(クリティカルチェーン・プロジェクトマネジメント)」 などの手法を用いて、タスクバッファではなくプロジェクトバッファとして管理するのが良いかなと思う。
プロジェクトマネジメントは、さまざまな要素を考慮しながら進める必要があるが、「不確実性コーン」「可処分時間」「バッファ」などを意識しながら、揺れを最小化するような工夫をしていくことが大事だと思う。また、プロジェクトマネジメントだけでなく、日常生活や仕事全般にも応用できると思うので、参考にしてもらえたら嬉しい。
### メモ
大学院で教育工学を専攻していた時の名残で、今でも Learning & Engineering というメーリングリストに登録しているのだが、先日コミュニティでこんな論文が話題になっていた。
https://dl.acm.org/doi/10.1145/3706468.3706478
タイトルは「MORF: A Post Mortem」。著者はペンシルベニア大学の Ryan Baker 氏と Denver 大学の Stephen Hutt 氏だ。自分の研究分野では有名な LAK(Learning Analytics and Knowledge)というカンファレンスで発表された論文。公開が 3 月 3 日と書いてあるからかなり最近の論文だ。
まず目を引くのはタイトルにつけられている "A Post Motem" というフレーズである。ポストモーテムといえば、何がしかのインシデント(トラブル)への検証や分析を指すが、自分が知る限りでは、あまり論文で好んで使われる単語ではないように思う。
というのも、あるプロジェクトのポストモーテムを書くということは、暗にそのプロジェクトが失敗だったと認めることになり、これは公的な資金を投入して行われた研究プロジェクトにとっては、あまり好ましいことではない。
なんでわざわざポストモーテムというタイトルとつけたのか気になって、自分の仕事とは関係ないのだがせっかくなのでちょっと読んでみることにした。
MORF とは The MOOC Replication Framework の略で、直訳すると MOOC のレプリケーションを行うためのフレームワークということになる。
MOOC のレプリケーションってなんぞやと思うかもしれないが、このフレームワークが生まれた背景には、Coursera や edX をはじめとする、大規模で無料のオンラインコース(Massive Open Online Course)が急速に普及し、多くのユーザーを獲得した経緯があった。
こうした大規模なオンラインコースには、多くの学習者によって蓄積された大量のデータがあり、これは学習者の行動や学習成果に関する貴重な情報源となる一方で、個人のプライバシーにも関わるセンシティブな情報である。
この問題を解決すべく生まれたのが MORF であり、要するに学習者のプライバシーを守ることを最優先におき、研究者が安全に大規模なデータセットを分析できるような MOOC のレプリカを提供するためのフレームワークということになる。
MORF の詳細については2018 年に発表された論文があるので、興味がある方はそちらを参照してほしい。GitHub に公式のレポジトリも公開されている。
MORF の失敗要因はいくつか挙げられているが、自分が興味を持ったポイントについてかいつまんで説明してみる。
まずは Docker コンテナの問題。MORF はユーザーがどの言語を用いて分析しても問題ないように、ユーザーに自身の解析スクリプトを Docker コンテナとしてアップロードさせる仕組みを採用していたのだが、どうもこれが研究者にとっては技術的なハードルが高すぎたらしい。
これは自分も経験があるのだが、研究者の中にもいろいろなタイプがあり、Python や R で分析用の高度なスクリプトを書ける人が必ずしも Docker の基礎的な技術を身につけているかというとそうではない。特に Web 系の技術に疎い研究者にとっては Docker という言葉自体がなんなのかわからないという人も多い。そんな中で、分析用のスクリプトを Docker コンテナに詰め込むというのは MORF のユーザーである分析系の研究者にとってはかなりハードルが高い作業と言える。筆者らもこの点について、言語を問わないという意味で間口を広げたつもりが帰ってユーザーを限定する結果になってしまったと述べている。
次にデバッグと出力の問題。MORF では学習者のプライバシーを守るため、デバッグ用のエラーメッセージにも最小限の情報しか返さないようにしていたという。また分析結果についてもあらかじめ MORF 側で定義されたフォーマット以外の出力は表示されないようになっていたらしく、これも分析者の自由度を狭める結果となった。前者については上述した Docker の問題とも相まって、慣れない Docker を使うにあたってかなり MORF を使用するハードルを上げてしまっていたのではないかと思われる。
このようにこの論文では MORF という分析フレームワークが広まらなかった要因として幾つかの課題が挙げられているが、そもそもなぜこのポストモーテムが必要だったのだろうか。
私はおそらく MORF のような課題は、教育工学分野の内外を問わず、多くの研究者が抱えている課題なのではないか、と思う。今回の件をより一般化していうと、フレームワークや研究の理念を優先させすぎると、ユーザー体験を損ない、結果として誰も使わないプロジェクトになってしまうということだ。
いくら崇高な理念に基づいたプロジェクトであっても、誰からも必要とされないものができてしまっては本末転倒である。
今回の論文でもネクストアクションとして、ユーザービリティテストの強化やコミュニティの育成が挙げられていた。プロジェクト(研究)の本質ではない部分で、よりユーザーに近いウェットな部分にも焦点を当てることが重要であるということだ。
近年プロダクト開発における PM (プロダクトマネージャー) という役割が注目されているが、技術や理念だけではない部分の重要性をこの論文からあらためて学べた気がする。
社会人になってすぐ「基板交換してみようか!」と言われ、何もわからないまま「はい!」と返事した新米エンジニアです。
「基板って実際にどんなもの?」について今回は解説していきたいと思います。
電子機器の中を開けると、緑色の板にたくさんの電子部品がくっついているのを見たことがあるかもしれません。これが 「プリント基板(PCB)」 です!
スマートフォン、パソコン、テレビ、家電…ほとんどの電子機器に使われている、とても重要な部品です。
今回は、 「そもそも基板とは何なのか?」 という基本から、 役割やプリント基板の特徴 について初心者向けにわかりやすく解説していきます!
1. 基板とは? 電子機器の心臓部分!
基板は、 電子部品を固定し、電気的につなぐための土台 です。
もし基板がなかったら、電子部品同士を 1本1本手作業で配線 しなければならず、機器をコンパクトに作ることができません。
例えば、スマホの中には 小さな基板 が入っています。
基板には、 電気を流すための道(回路パターン) がプリントされており、電子部品が適切に接続されています。これによって、スマホのような複雑な電子機器も コンパクトにまとめる ことができるのです!
2. プリント基板(PCB)って?
基板にはいくつか種類がありますが、一般的な電子機器で使われるのは 「プリント基板(PCB: Printed Circuit Board)」 です。
✅ ユニバーサル基板(ブレッドボード)との違い
初心者が電子工作をするときによく使うのが、 ユニバーサル基板 や ブレッドボード です。
基板の種類 |
特徴 |
例 |
ブレッドボード |
配線を自由に変更できる(実験用) |
電子工作、試作回路 |
ユニバーサル基板 |
ハンダ付けして配線する |
自作回路、小型ロボット |
プリント基板(PCB) |
配線があらかじめ印刷されている |
スマホ、パソコン、家電 |
プリント基板は 「プリント」 という名前の通り、銅の回路パターンが 板の上に印刷されている のが特徴です。
これによって、 ミスなく、コンパクトに、効率よく配線 することができます!
3. なぜ基板が必要なのか?(配線と比較して解説)
昔の電子機器では、部品同士を 手作業で1本1本配線 していました。
しかし、この方法には 問題点 があります。
❌ 手作業の配線のデメリット
1. 配線が複雑になりすぎる → 回路がぐちゃぐちゃ
2. 人が配線するのでミスが多い → 接触不良が起こる
3. 大量生産が難しい → 1台作るのに時間がかかる
そこで登場したのが プリント基板(PCB) です!
✅ プリント基板のメリット
• 配線をあらかじめ印刷できる → 自動で配線OK!
• 同じものを大量に作れる → コストを下げられる
• コンパクトにできる → スマホやノートPCに必須!
例えば、スマホの中には 何百もの部品 が詰まっていますが、すべてプリント基板の上に コンパクトに配置 されています。
もし昔のように 1本1本手作業で配線 していたら、今のスマホのサイズでは作れません!
まとめ:基板の基本をおさらい!
✅ 基板とは? → 電子部品を固定し、電気的につなぐための土台
✅ プリント基板(PCB)とは? → 銅の配線が印刷された基板
✅ なぜ基板が必要? → ミスなく、コンパクトに、大量生産できるから!