我想在我的应用程序中记录用户活动,以便向用户展示以及进行管理。我的客户是公司,因此我可以在三个层次上介绍活动:
为了进行日志记录,我将创建一个模型来存储日志条目。我看到了几种方法。
首先,我可以将每个记录的活动存储在其自己的实体中,然后根据需要进行查询:
class Activity(ndb.Model):
activity = ndb.StringProperty()
user_id = ndb.StringProperty()
company_id = ndb.StringProperty()
其次,我可以将用户的所有活动存储在单个实体中:
class UserActivity(ndb.Model):
activity = ndb.StringProperty(repeated=True) # Note this is now a list
company_id = ndb.StringProperty()
第三,我可以将公司的所有活动存储在单个实体中:
class CompanyActivity(ndb.Model):
activity = ndb.StringProperty(repeated=True) # Would store user_id here somehow
这三个选项的功能/性能折衷是什么?我知道,如果频繁进行看跌交易,第二和第三种选择会存在潜在的争用问题,但是为了讨论起见,我们假设这不是问题。
对于第二个和第三个选项,减少数据存储实体的总数是否有显着优势(因为它们将合并为更少的实体)?还是我应该选择第一种选择?
使用重复属性的唯一好处是可以避免最终的一致性问题:每当您阅读UserActivity
或CompanyActivity
实体时,您就会知道您已获得所有活动的
完整 列表。使用第一种方法时,您必须进行查询才能获得该列表,并且该列表可能会错过最近的活动,因为相应的查询索引可能尚未更新以反映它们。
但是,除了您提到的潜在争用问题之外,对于重复属性方法还需要考虑另一个缺点:随着越来越多的活动添加到列表中,这些实体的大小将逐渐增加,这意味着:
get()
/put()
次,因此逐渐降低整体应用程序性能特别是第三种方法还需要一种获取每个用户活动报告的简单方法。
我坚持第一种方法,这是最灵活,可扩展的方法,缺点很小:
Activity
实体中的用户/公司ID属性,以及由于实体数量较多而导致的更大索引)是恕我直言的(很便宜)。您如何让新启动的活动在Android TalkBack中宣布自己? 我能找到的所有文档都只提到视图,而不是活动,这些视图只有在触摸时才宣布自己。我需要的是,在更改“活动”时,使用一些语音文本来告诉用户他们在应用层次结构中的位置。现在,在每次活动更改时,TalkBack每次都只声明应用程序名称,这没有用。 我尝试过将 contentDescription 添加到活动布局 XML 中的根布局元素,但这
如果您在开发共享库的公司工作,或者您在开源或商业库中工作,则可能需要开发自己的自动配置。 自动配置类可以捆绑在外部jar中,仍然可以通过Spring Boot获取。 自动配置可以与“启动器”相关联,该“启动器”提供自动配置代码以及您将使用它的典型库。 我们首先介绍了构建自己的自动配置需要了解的内容,然后我们将继续介绍创建自定义启动器所需的典型步骤。 可以使用演示项目来展示如何逐步创建启动器。 4.
我将遵循“Pro Spring Boot”一书中的“扩展Spring Boot应用程序”一章。在本章中,作者首先解释如何创建自己的spring boot starter-。源代码可以在这里找到。我对maven和spring都是新手。 如果我使用与编写器1.3.3相同的Spring启动版本,它可以正常工作。释放。但是它不适用于当前版本的Spring引导,我想让它适用于当前版本。 基本文件夹结构: 当
好吧,所以我试图在Java创建自己的LinkedList类(带有泛型类型),但是遇到了一些问题。我创建了一个LinkedListNode类,它基本上设置并获取next和right指针以及节点的键。我的LinkedList类代码发布在下面,如果您编译并运行,您会发现它没有按照应该的方式设置列表。此刻,我正在尝试在节点x之后插入节点y,但我的打印输出看起来像: 键:5-上一键:6-下一键:6键:6-上
本文向大家介绍ActionScript 3 添加自己的活动,包括了ActionScript 3 添加自己的活动的使用技巧和注意事项,需要的朋友参考一下 示例 您可以通过扩展Event类来创建自己的事件并进行调度。 然后,您可以使用调度和收听它EventDispatcher。请注意,大多数Flash对象是事件分派器。 请注意,clone如果要重新分派事件,则需要使用该方法。
如果你只需要掌控一个应用的全部的消息和触发的事件,那么使用默认的**/**命名空间即可。如果你想要利用第三方代码,或者分享你的代码给别人,http://socket.io提供了一种命名一个socket的途径。 使用多路由控制一条单一的连接是有好处的。比如下方的示例代码,客户端发起两个WebSocket连接,而服务器端使用多路由技术仅仅只需要建立一个连接。 服务器端(app.js) var io =