【ICP】第四课作业 Microblog
Course 4 Microblog
第四课作业
目录
Course 4 Microblog
要求
Motoko代码
样例演示
思考题
要求
(1)把 Message 类型改为一个记录结构,并在里面添加 time 字段,记录发消息的时间。
(2)修改 posts 和 timeline 方法,仅返回指定时间之后的内容:
import Time "mo:base/Time";func posts(since: Time.Time): async [Message] {…};func timeline(since: Time.Time): async [Message] {…};
(3)思考题:如果关注对象很多,运行timeline 就会比较慢,有什么办法可以提高效率?
Motoko代码
/* main.mo */import Iter "mo:base/Iter";import List "mo:base/List";import Principal "mo:base/Principal";import Time "mo:base/Time";actor {type Time = Time.Time; // 定义Time类型public type Message = { // 定义Message的Record类型,包含text和time两个变量text: Text;time: Time;};public type Microblog = actor {follow: shared(Principal) -> async (); // 添加关注对象follows: shared query () -> async [Principal]; // 返回关注列表post: shared (Text) -> async (); // 发布新消息posts: shared query (Time) -> async [Message]; // 返回所有发布的消息timeline: shared (Time) -> async [Message]; // 返回所有关注对象发布的消息};stable var followed: List.List<Principal> = List.nil();public shared func follow(id: Principal): async () {followed := List.push(id, followed);};public shared query func follows(): async [Principal] {List.toArray(followed);};stable var messages: List.List<Message> = List.nil();public shared (msg) func post(text: Text): async () {assert(Principal.toText(msg.caller) == "oeo2i-5hw57-hh6wd-2v376-t4cy6-j6ihw-kc7j5-eksox-t34te-j4p2a-zae");var sendmsg: Message = {text = text;time = Time.now();};messages := List.push(sendmsg, messages);};// 返回满足Time>since的元素public shared query func posts(since: Time): async [Message] {var res: List.List<Message> = List.nil();for (msg in Iter.fromList(messages)) {if (msg.time >= since) {res := List.push(msg, res);};};List.toArray(res);};// 返回关注列表中Time>since的元素public shared func timeline(since: Time): async [Message] {var all: List.List<Message> = List.nil();for (id in Iter.fromList(followed)) {let canister: Microblog = actor(Principal.toText(id));let msgs: [Message] = await canister.posts(since);for (msg in Iter.fromArray(msgs)) {all := List.push(msg, all);};};List.toArray(all);};// public shared func clearFollow(): async [Principal] {// for (follow in Iter.range(0, (List.size<Principal>(followed)))) {// if (List.isNil<Principal>(followed)) {// var followed: List.List<Principal> = List.pop<Principal>(follow);// };// };// List.toArray(followed);// };// public shared func clearPost(): async [Message] {// for (post in Iter.range(0, (List.size<Message>(messages)))) {// if (List.isNil<Message>(messages)) {// var messages: List.List<Message> = List.pop<Message>(post);// } // };// List.toArray(messages);// };}
样例演示
其中microblog_backend的Canister ID:uc3dz-gqaaa-aaaal-abebq-cai,
microblog_backend2的Canister ID:ux4su-hyaaa-aaaal-abeca-cai
以下使用A代表microblog_backend,使用B代表microblog_backend2。
首先在A中使用post函数发布一个消息
随后调用A的posts函数查看已发布的所有消息
使用B的follow函数关注A
使用B的follows函数列出所有关注的对象
使用B的timeline函数列出关注对象发的信息
思考题
Q:如果关注对象很多,运行 timeline 就会比较慢,有什么办法可以提高效率?
A:Canister自身会有一定的存储空间,可以考虑使用空间换时间,牺牲存储空间来存储关注对象的消息数据,这样可以提高调用timeline的效率。然而这样对Canister的存储空间的消耗也较大,开发者需要在调用速度和内存大小中权衡。
【ICP】第四课作业 Microblog相关推荐
- 第四课 脱壳必备知识要点及方法
第四课 脱壳必备知识要点及方法 今天所要讲的是这高级篇中最为关键,最为重要的一课,希望大家能认真学习,反复推敲,举一反三学习脱壳的各种方法,当然有的时候可能需要几种方法一起使用,今后我们也会一点一点 ...
- 全民一起玩Python提高篇第四课:深入数据类型与语法细节(下)
提高健壮性 如果 try 结构的位置不当,可能导致死循环等问题. file_name=input('请输入文件名:') try:with open(file_name) as f:#用with的方式读 ...
- 湘潭大学信息安全课作业答案7
湘潭大学信息安全课作业答案7 教师:李澄清院长 整理自助好心的助教大哥-申哥. 1. Do gENtleMnE rEad Not GeNtLeme'ns otHer maIl gGtlNmenE Do ...
- HTML网页设计结课作业~仿蘑菇街商城网站源码(HTML+CSS+JS)
HTML网页设计结课作业~仿蘑菇街商城网站源码(HTML+CSS+JS) 临近期末, 你还在为HTML网页设计结课作业,老师的作业要求感到头大?HTML网页作业无从下手?网页要求的总数量太多?没有合适 ...
- 云服务器deeplearning_吴恩达deeplearning.ai将于11月6日开放第四课,主讲卷积神经网络...
截止到2017年10月25日,吴恩达在Coursera上有3门深度学习课程: 第一课:神经网络和深度学习(Neural Networks and Deep Learning) 第二课:改善深度神经网络 ...
- 湘潭大学信息安全课作业答案2
湘潭大学信息安全课作业答案2 教师:李澄清院长 整理自助好心的助教大哥-申哥. 代码答案等来自19级各位同学,与网上流传的参考答案不一致,仅供参考 1.在信息安全领域,柯克霍夫斯原则(Kerckhof ...
- 计算机系统的构成课程导入,第四课:计算机互联网络
第四课:计算机互联网络 [教学目标] 1.知识目标: (1)了解计算机网络的产生.应用和工作原理: (2)了解怎样构成计算机网络 : (3)网络是如何工作的,都需要什么硬件和软件资源 . 2.能力目标 ...
- 《计算机应用基础》第四次作业,[业务]计算机应用基础四次小作业
[业务]计算机应用基础四次小作业 (8页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 9.9 积分 本科专业第一次小作业辅导:课本第39页,第52页的填空 ...
- 商务汇报PPT制作的七堂课-第四课:文字美化
我们课程已经进入到第四课了,那我想针对前边的三天课程和大家做一个小小的总结,我们第一天讲了配色,第二天讲了模板制作,第三天讲了结构搭建,其实你发现,这就是我们做一个PPT的步骤,你打开电脑之后,根据你 ...
最新文章
- java拆分excel_Jexcel实现按一定规则分割excel文件的方法
- the application has stopped unexpected。please try again
- sql 精读(四) 标准 SQL 中聚合分析功能示例
- Android 官网无法访问的解决方法
- 卖家工具箱源码_我的测试和代码分析工具箱
- Pyhton——动态语言
- 老师说过链表是分水岭,至少得会这些题目
- 谷歌发布MetNet神经网络模型预测天气
- 简单明了学习SQL CTE递归查询
- 解决公司服务器加入域中不能启动应用系统的问题
- Linux头文件引用小技巧
- 什么是Http无状态协议?
- Visual Assist X 颜色配置习惯
- 用g++编译cpp文件
- c语言long和short,long和short是什么意思?
- Android apps 拍立知-功能实现2(相机/选择相册及图像识别调用)
- JAVA学习者从入门到精通
- 架构师的职责是什么?
- 洛谷P1617 爱与愁的一千个伤心的理由
- 蓝桥杯2022年第十三届省赛真题-纸张尺寸
热门文章
- 调用网易短信接口(发短信模板通知)
- php 魔术方法 构造析构
- signature=e48117269aff62d4a3fa5fe5baffd0d1,The BAFF/APRIL System in Autoimmunity
- 自定义控件九宫格滑动解锁
- 未分配利润与利润表不一致_​未分配利润与利润表不一致的原因有哪些
- 【信号与系统】(二十四)z变换与z域分析——z域分析
- 一个HTTP打趴80%面试者,你是否也被面试官”虐“?
- Java时钟(实现扫秒及表盘替换)
- Pink老师案例---更换百度皮肤点,击小图片更换背景图。
- 宝马神器 CGDI MINI增加,不用拆降级