惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

D
DataBreaches.Net
T
Threatpost
N
News and Events Feed by Topic
PCI Perspectives
PCI Perspectives
V2EX - 技术
V2EX - 技术
D
Docker
G
Google Developers Blog
Microsoft Security Blog
Microsoft Security Blog
N
News and Events Feed by Topic
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
Google Online Security Blog
Google Online Security Blog
The GitHub Blog
The GitHub Blog
Hacker News - Newest:
Hacker News - Newest: "LLM"
Y
Y Combinator Blog
M
MIT News - Artificial intelligence
Blog — PlanetScale
Blog — PlanetScale
博客园 - 司徒正美
T
Troy Hunt's Blog
Webroot Blog
Webroot Blog
Security Archives - TechRepublic
Security Archives - TechRepublic
量子位
Apple Machine Learning Research
Apple Machine Learning Research
H
Help Net Security
F
Full Disclosure
B
Blog
O
OpenAI News
H
Hackread – Cybersecurity News, Data Breaches, AI and More
博客园_首页
Google DeepMind News
Google DeepMind News
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
Engineering at Meta
Engineering at Meta
大猫的无限游戏
大猫的无限游戏
Forbes - Security
Forbes - Security
Know Your Adversary
Know Your Adversary
B
Blog RSS Feed
MongoDB | Blog
MongoDB | Blog
Scott Helme
Scott Helme
T
The Exploit Database - CXSecurity.com
博客园 - 聂微东
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
The Last Watchdog
The Last Watchdog
Recorded Future
Recorded Future
IT之家
IT之家
Project Zero
Project Zero
Stack Overflow Blog
Stack Overflow Blog
小众软件
小众软件
Attack and Defense Labs
Attack and Defense Labs
L
Lohrmann on Cybersecurity
SecWiki News
SecWiki News
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com

夜行人

回家路上 第一期的直播演示项目 震动检测器 正能量 在线参观CodeLab Neverland 发布 CodeLab Adapter 3.3.1 DynamicTable 之 纸糊方向盘 CodeLab DynamicTable: 一个可实施的技术方案 CodeLab Insight 发布 Alpha 版 情人节 Home Assistant 周报 && IoT 周报 (02) Joplin: 关注隐私的 Evernote 开源替代软件 浏览器的未来与 Web 传感器 Home Assistant 周报 && IoT 周报 (01) 百宝箱(01) 论自由 介绍 WebThings Home Assistant 周报 && iot 周报 (00) 百宝箱(00) 毛姆读书心得 传世之作 周末徒步 CodeLab Adapter ❤️ Jupyter/Python 航班 躲雨 夏令营途中 [译]思想--作为一种技术 The future of coding 美国之行 三门问题的程序模拟 从Python转向Pharo https://blog.just4fun.site/post/iot/iot-open-source-projects/ Python异步编程笔记 https://blog.just4fun.site/post/iot/iot-open-source-hardware-community/ 万物积木化开发者社区 CodeLab ❤️ Blender Scratch3技术分析之云变量 API(第7篇) [译]对管道(Pipes)的偏爱 [译]提出正确的问题比得到正确答案更重要 蓝牙设备与Scratch3.0 创建你的第一个Scratch3.0 Extension Scratch3技术分析之项目内部数据(第6篇) Scratch3技术分析之社区 API(第5篇) Scratch3技术分析之User API(第4篇) Scratch3技术分析之项目主页API(第3篇) Scratch3技术分析之静态资源API(第2篇) Scratch3.0、micro:bit与Windows7 https://blog.just4fun.site/post/iot/zerynth-vs-micropython/ 核聚变、方所与半宅空间 可视化编程为何是个糟糕的主意 codelab.club周末聚会 关于codelab.club '下一件大事'是一个房间 Hungry Robot - Eat everything 编程作为一种思考方式 今日简史 史蒂夫·乔布斯传 罗素自选文集 https://blog.just4fun.site/post/edx/tianjin-scratch-ai/ https://blog.just4fun.site/post/edx/richie-cms-openedx/ 徒步武功山 WebUSB与micro:bit 积木化编程与3D场景 夜宿武功山顶 scratch3-adapter接入优必选Alpha系列机器人 https://blog.just4fun.site/post/edx/video-migration-note/ scratch3-adapter重构笔记 https://blog.just4fun.site/post/edx/edx-community-members/ 两种硬件编程风格的比较 使用micro:bit自制PPT翻页笔 柏拉图对话集 scratch3.0 + micro:bit 七月电影放映计划 非营利组织的管理 Screenly--用树莓派让任何屏幕变为可编程的数字标牌 以最佳实践开始你的Django项目 micro:bit与事件驱动 为Scratch3.0设计的插件系统(上篇) OCR应用一例 近两年读过的一些好书 blockly开发之使用python驱动浏览器中的turtle(2) 牛顿新传 文学理论入门 逻辑的引擎 人生的意义 blockly开发之生成并运行js代码(1) blockly开发之hello world(0) micro:bit使用笔记 神器之Termux https://blog.just4fun.site/post/iot/micropython-notes/ Cozmo what is this Scratch的前世今生 下段旅程 我行在远方 爆裂 途中杂记 https://blog.just4fun.site/post/edx/open-edx-startup/ cozmo系列之入门 - 有性格且可编程的机器人 PaperWeekly开发笔记 创业二三事
explore Open edX tracking system
2016-03-24 · via 夜行人

缘起

最近在折腾Open edX数据相关的东西,同时试着将open edx与机器学习结合

如果你是EDM(educational data mining)的新玩家(我也是新手233),对教育领域的数据感兴趣,推荐你这篇论文《教育数据挖掘研究进展综述》,了解一下这个领域的概况和进展

官方的insights显得太重,我们打算享用这个免费午餐,但不定制它。对于个性化的数据分析,我们准备另起炉灶,完全独立于Open edX本身。架构上的设计主要为

  1. 采用edx的tracking system(这套机制的设计十分聪明),但产生独立的log,这样一来既不污染insights的数据源,分析时也避免从一大推的数据里去过滤数据
  2. 为了对接到edx本身,诸如需要获取课程和用户数据,采用我之前写的edx_siteapi与Open edX系统通信。
  3. 将其作为一个独立的服务

我用周末的两天,搭建了初始模型,从目前的进展看来,这条路似乎还算康庄大道

任务描述

架构中的第一条,产生了难题,我试着去hack tracking system的时候,发现它并不是个平坦的结构,hack起来十分痛苦,而我定制开源系统的原则之一是尽可能不侵入原代码。尽可能尊重原有架构,试着去理解它而不是急着改造它,后者的代价太沉重了,危机四伏

所以眼前的第一个任务是理解tracking system的机制,并优雅地定制它

最初思路

另起炉灶

写一个rest服务,在js中用ajax去发送事件(当然你也可以用edx采用的backbone),对应的rest服务去写日志(采用django或是python原生的方式都行),这种方式简单粗暴。因为违背了我拓展开源系统的原则,所以直接pass了

拓展既有的tracking system

1
2
from eventtracking import tracker
tracker.emit('some.event.name', {'foo': 'bar'}) #未注册的事件

问题是日志没有单独剥离出来,分析时,日志量巨大,需要筛选出来,所以这是我们主要需要解决的问题

更好的范式为

1
2
3
from eventtracking import tracker
with tracker.get_tracker().context(event_name, context):
    tracker.emit(event_name, event_data)

Other Tracking Systems(edx支持)

  • Data Dog: 一种系统监控工具,应用监控服务商(saas)
    • airbnb在用
  • Segment: 希望做出一款能与KISSmetrics或Google Analytics展开有力竞争的产品
  • Google Analytics
  • Deprecated APIs

出于国内网络的原因,我们可能需要考虑国内的Analytics服务,由于Analytics用种普遍需求,所以国内也容易找到同类产品:

Open edX中的tracking log

Open edX中的tracking system产生的log与系统业务相关,数据特征皆为教育者所关心。并不是一种不是通用的数据(诸如nginx产生的日志就很通用,仅关心http请求本身),正是这种特质,使其适合作为EDM的数据源

源码分析

由于当前文档的匮乏,我们只好直接翻源码了,涉及的源码主要包括

我们从产生emit(从语义就可以知道这是提交日志事件的功能函数)开始追踪,目的是找到产生独立log的方法:

从class的名字我们可以猜到这个类(Tracker)基本就是我们要找的东西啦

接下来找侵入的地方:

1
2
from eventtracking import tracker  #实际上是eventtracking/tracker.py文件
tracker = tracker.get_tracker() #得到TRACKERS['default'] 在register_tracker赋值 ,产生疑惑:register_tracker何时被注册的
  • -> eventtracking/django/__init__.py 里override_default_tracker()注册tracker,而eventtracking.djangoEventTrackingConfig是触发上边代码的地方,具体原理可见:
1
2
3
4
#cms/envs/common.py
    # Tracking
    'track',
    'eventtracking.django.apps.EventTrackingConfig',  #这里最终触发注册

所以我们完全可以构造自己的tracker,因为TRACKERS是个dict,所以可以同时存在任意多的tracker,每个tracker可以有自己的backends,至此,探索完毕,问题解决


至于细节问题,构造tracker是主要的任务,直接用Tracker构造一个新的就好,核心参数是backends, ThreadLocalContextLocator(), processors,其中backends是定制化的核心,之后加入到TRACKERS中,调用时,from eventtracking import mytracker就好,其他和原生的tracker无异

backend and middleware

既然在读这块的源码,解决完任务,顺便做了更全面的探索(从框架层)

backend

1
2
3
4
#lms/envs/aws.py
# Event tracking
TRACKING_BACKENDS.update(AUTH_TOKENS.get("TRACKING_BACKENDS", {}))
EVENT_TRACKING_BACKENDS['tracking_logs']['OPTIONS']['backends'].update(AUTH_TOKENS.get("EVENT_TRACKING_BACKENDS", {}))

middleware

edx-platform/common/djangoapps/track/middleware.py中,tracker在request里产生,被注入了session之类的属性,tracker生成的时候就很强大了,这就是它有上下文的原因,django作为一个大而全的框架,在此威力在此显现出来

其他

server_track

这个应该是配合js使用的,作为rest服务,这部分没详细去挖掘,我想模仿Segment的机制去实现

xblock tracking system

直接参考既有的插件就行了,这一部分倒是简单

参考