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相关推荐

  1. 第四课 脱壳必备知识要点及方法

    第四课  脱壳必备知识要点及方法 今天所要讲的是这高级篇中最为关键,最为重要的一课,希望大家能认真学习,反复推敲,举一反三学习脱壳的各种方法,当然有的时候可能需要几种方法一起使用,今后我们也会一点一点 ...

  2. 全民一起玩Python提高篇第四课:深入数据类型与语法细节(下)

    提高健壮性 如果 try 结构的位置不当,可能导致死循环等问题. file_name=input('请输入文件名:') try:with open(file_name) as f:#用with的方式读 ...

  3. 湘潭大学信息安全课作业答案7

    湘潭大学信息安全课作业答案7 教师:李澄清院长 整理自助好心的助教大哥-申哥. 1. Do gENtleMnE rEad Not GeNtLeme'ns otHer maIl gGtlNmenE Do ...

  4. HTML网页设计结课作业~仿蘑菇街商城网站源码(HTML+CSS+JS)

    HTML网页设计结课作业~仿蘑菇街商城网站源码(HTML+CSS+JS) 临近期末, 你还在为HTML网页设计结课作业,老师的作业要求感到头大?HTML网页作业无从下手?网页要求的总数量太多?没有合适 ...

  5. 云服务器deeplearning_吴恩达deeplearning.ai将于11月6日开放第四课,主讲卷积神经网络...

    截止到2017年10月25日,吴恩达在Coursera上有3门深度学习课程: 第一课:神经网络和深度学习(Neural Networks and Deep Learning) 第二课:改善深度神经网络 ...

  6. 湘潭大学信息安全课作业答案2

    湘潭大学信息安全课作业答案2 教师:李澄清院长 整理自助好心的助教大哥-申哥. 代码答案等来自19级各位同学,与网上流传的参考答案不一致,仅供参考 1.在信息安全领域,柯克霍夫斯原则(Kerckhof ...

  7. 计算机系统的构成课程导入,第四课:计算机互联网络

    第四课:计算机互联网络 [教学目标] 1.知识目标: (1)了解计算机网络的产生.应用和工作原理: (2)了解怎样构成计算机网络 : (3)网络是如何工作的,都需要什么硬件和软件资源 . 2.能力目标 ...

  8. 《计算机应用基础》第四次作业,[业务]计算机应用基础四次小作业

    [业务]计算机应用基础四次小作业 (8页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 9.9 积分 本科专业第一次小作业辅导:课本第39页,第52页的填空 ...

  9. 商务汇报PPT制作的七堂课-第四课:文字美化

    我们课程已经进入到第四课了,那我想针对前边的三天课程和大家做一个小小的总结,我们第一天讲了配色,第二天讲了模板制作,第三天讲了结构搭建,其实你发现,这就是我们做一个PPT的步骤,你打开电脑之后,根据你 ...

最新文章

  1. java拆分excel_Jexcel实现按一定规则分割excel文件的方法
  2. the application has stopped unexpected。please try again
  3. sql 精读(四) 标准 SQL 中聚合分析功能示例
  4. Android 官网无法访问的解决方法
  5. 卖家工具箱源码_我的测试和代码分析工具箱
  6. Pyhton——动态语言
  7. 老师说过链表是分水岭,至少得会这些题目
  8. 谷歌发布MetNet神经网络模型预测天气
  9. 简单明了学习SQL CTE递归查询
  10. 解决公司服务器加入域中不能启动应用系统的问题
  11. Linux头文件引用小技巧
  12. 什么是Http无状态协议?
  13. Visual Assist X 颜色配置习惯
  14. 用g++编译cpp文件
  15. c语言long和short,long和short是什么意思?
  16. Android apps 拍立知-功能实现2(相机/选择相册及图像识别调用)
  17. JAVA学习者从入门到精通
  18. 架构师的职责是什么?
  19. 洛谷P1617 爱与愁的一千个伤心的理由
  20. 蓝桥杯2022年第十三届省赛真题-纸张尺寸

热门文章

  1. 调用网易短信接口(发短信模板通知)
  2. php 魔术方法 构造析构
  3. signature=e48117269aff62d4a3fa5fe5baffd0d1,The BAFF/APRIL System in Autoimmunity
  4. 自定义控件九宫格滑动解锁
  5. 未分配利润与利润表不一致_​未分配利润与利润表不一致的原因有哪些
  6. 【信号与系统】(二十四)z变换与z域分析——z域分析
  7. 一个HTTP打趴80%面试者,你是否也被面试官”虐“?
  8. Java时钟(实现扫秒及表盘替换)
  9. Pink老师案例---更换百度皮肤点,击小图片更换背景图。
  10. 宝马神器 CGDI MINI增加,不用拆降级