Aug 21, 2024. | By: Meow-meow
“开源软件供应链点亮计划——暑期2024” 目前项目开发时间已经过半。今年 TUNA 共立项四个项目,开发正在有序进行中。我们邀请了各位学员和导师简要介绍各自项目目前的进展,欢迎各位感兴趣的朋友们一同交流。
经过最初的一段时间调研后,最终选择在 quinn-proto 的基础上,对 quinn-udp 和 quinn 的功能进行移植。
没曾想,在实际开发过程中,移植 quinn-udp 的”可选”功能反而花费了更长的时间,因为需要把 quinn-udp 中直接调用 syscall 实现的 socket 操作封装为“基于完成的异步”的形式并移植到 io-uring 和 iocp 上。
quinn 的移植则相对容易一些,主要就是去除对 tokio 的依赖以及把与 quinn-udp 的交互修改为与自己封装的 socket 交互。
目前已基本完成了 quinn 的大部分功能的移植,一些额外功能如统计数据、work limiter 等则暂时没有计划。不过目前 benchmark 结果表现略逊于 quinn,推测可能是 quinn-udp 使用了 recvmmsg 批量接收消息的原因,不过还需进一步确认。
目前计划先完善当前的工作,进行 review 并 merge 到主分支上。接下来计划移植 h3-quinn
的功能(这东西代码才几百行),也许可以用 quic-interop-runner 进行一下测试。
目前已在 Fork 仓库中向 CIRCT 添加了一个 Partition Pass。我们计划在 HW Dialect 层对电路模块进行划分,这样 Lower 到 Arc Dialect 层之前就是已经划分好的电路模块。
Partition Pass 已经做了初步实现,现在可以对简单带状态的单层模块进行不完全自动(需手动指定 reg 分配到哪个子模块中)划分,划分效果如下 MLIR 例子:
hw.module @GCD(in %clk : !seq.clock, in %rst : i1, in %in_a : i64, in %in_b : i64, in %in_valid : i1, out in_ready : i1, out out : i64, out out_valid : i64) {
%c0_i63 = hw.constant 0 : i63
%true = hw.constant true
%c0_i64 = hw.constant 0 : i64
%false = hw.constant false
%smaller = seq.firreg %13 clock %clk {firrtl.random_init_start = 0 : ui64} : i64
%larger = seq.firreg %11 clock %clk {firrtl.random_init_start = 64 : ui64} : i64
%working = seq.firreg %15 clock %clk reset sync %rst, %false {firrtl.random_init_start = 128 : ui64} : i1
%0 = comb.icmp bin eq %smaller, %c0_i64 : i64
%1 = comb.and bin %0, %working {sv.namehint = "done"} : i1
%2 = comb.concat %false, %larger : i1, i64
%3 = comb.concat %false, %smaller : i1, i64
%4 = comb.sub bin %2, %3 : i65
%5 = comb.concat %false, %in_a : i1, i64
%6 = comb.mux bin %working, %4, %5 {sv.namehint = "na"} : i65
%7 = comb.mux bin %working, %smaller, %in_b {sv.namehint = "nb"} : i64
%8 = comb.concat %false, %7 : i1, i64
%9 = comb.icmp bin ugt %6, %8 : i65
%10 = comb.extract %6 from 0 : (i65) -> i64
%11 = comb.mux %9, %10, %7 {sv.namehint = "nlarger"} : i64
%12 = comb.extract %6 from 0 : (i65) -> i64
%13 = comb.mux %9, %7, %12 {sv.namehint = "nsmaller"} : i64
%14 = comb.xor bin %1, %true : i1
%15 = comb.mux bin %working, %14, %in_valid {sv.namehint = "nworking"} : i1
%16 = comb.concat %c0_i63, %1 : i63, i1
%17 = comb.xor bin %working, %true : i1
hw.output %17, %larger, %16 : i1, i64, i64
}
"hw.module"() ({
^bb0(%arg15: i1, %arg16: !seq.clock, %arg17: i1, %arg18: i64):
%32 = "hw.constant"() {value = true} : () -> i1
%33 = "hw.constant"() {value = 0 : i64} : () -> i64
%34 = "hw.constant"() {value = false} : () -> i1
%35 = "seq.firreg"(%39, %arg16, %arg17, %34) <{name = "working"}> {firrtl.random_init_start = 128 : ui64} : (i1, !seq.clock, i1, i1) -> i1
%36 = "comb.icmp"(%arg18, %33) <{predicate = 0 : i64, twoState}> : (i64, i64) -> i1
%37 = "comb.and"(%36, %35) <{twoState}> {sv.namehint = "done"} : (i1, i1) -> i1
%38 = "comb.xor"(%37, %32) <{twoState}> : (i1, i1) -> i1
%39 = "comb.mux"(%35, %38, %arg15) <{twoState}> {sv.namehint = "nworking"} : (i1, i1, i1) -> i1
%40 = "comb.xor"(%35, %32) <{twoState}> : (i1, i1) -> i1
"hw.output"(%40, %35) : (i1, i1) -> ()
}) {comment = "", module_type = !hw.modty<input in_valid : i1, input clk : !seq.clock, input rst : i1, input reg_smaller : i64, output in_ready : i1, output reg_working : i1>, parameters = [], per_port_attrs = [], result_locs = [#loc, #loc1], sym_name = "GCD_P0"} : () -> ()
"hw.module"() ({
^bb0(%arg10: i64, %arg11: i64, %arg12: !seq.clock, %arg13: i1, %arg14: i64):
%20 = "hw.constant"() {value = false} : () -> i1
%21 = "comb.concat"(%20, %31) : (i1, i64) -> i65
%22 = "comb.concat"(%20, %arg14) : (i1, i64) -> i65
%23 = "comb.sub"(%21, %22) <{twoState}> : (i65, i65) -> i65
%24 = "comb.concat"(%20, %arg10) : (i1, i64) -> i65
%25 = "comb.mux"(%arg13, %23, %24) <{twoState}> {sv.namehint = "na"} : (i1, i65, i65) -> i65
%26 = "comb.mux"(%arg13, %arg14, %arg11) <{twoState}> {sv.namehint = "nb"} : (i1, i64, i64) -> i64
%27 = "comb.concat"(%20, %26) : (i1, i64) -> i65
%28 = "comb.icmp"(%25, %27) <{predicate = 8 : i64, twoState}> : (i65, i65) -> i1
%29 = "comb.extract"(%25) <{lowBit = 0 : i32}> : (i65) -> i64
%30 = "comb.mux"(%28, %29, %26) {sv.namehint = "nlarger"} : (i1, i64, i64) -> i64
%31 = "seq.firreg"(%30, %arg12) <{name = "larger"}> {firrtl.random_init_start = 64 : ui64} : (i64, !seq.clock) -> i64
"hw.output"(%31, %31) : (i64, i64) -> ()
}) {comment = "", module_type = !hw.modty<input in_a : i64, input in_b : i64, input clk : !seq.clock, input reg_working : i1, input reg_smaller : i64, output out : i64, output reg_larger : i64>, parameters = [], per_port_attrs = [], result_locs = [#loc2, #loc1], sym_name = "GCD_P1"} : () -> ()
"hw.module"() ({
^bb0(%arg5: i64, %arg6: i64, %arg7: !seq.clock, %arg8: i1, %arg9: i64):
%3 = "hw.constant"() {value = 0 : i63} : () -> i63
%4 = "hw.constant"() {value = 0 : i64} : () -> i64
%5 = "hw.constant"() {value = false} : () -> i1
%6 = "seq.firreg"(%18, %arg7) <{name = "smaller"}> {firrtl.random_init_start = 0 : ui64} : (i64, !seq.clock) -> i64
%7 = "comb.icmp"(%6, %4) <{predicate = 0 : i64, twoState}> : (i64, i64) -> i1
%8 = "comb.and"(%7, %arg8) <{twoState}> {sv.namehint = "done"} : (i1, i1) -> i1
%9 = "comb.concat"(%5, %arg9) : (i1, i64) -> i65
%10 = "comb.concat"(%5, %6) : (i1, i64) -> i65
%11 = "comb.sub"(%9, %10) <{twoState}> : (i65, i65) -> i65
%12 = "comb.concat"(%5, %arg5) : (i1, i64) -> i65
%13 = "comb.mux"(%arg8, %11, %12) <{twoState}> {sv.namehint = "na"} : (i1, i65, i65) -> i65
%14 = "comb.mux"(%arg8, %6, %arg6) <{twoState}> {sv.namehint = "nb"} : (i1, i64, i64) -> i64
%15 = "comb.concat"(%5, %14) : (i1, i64) -> i65
%16 = "comb.icmp"(%13, %15) <{predicate = 8 : i64, twoState}> : (i65, i65) -> i1
%17 = "comb.extract"(%13) <{lowBit = 0 : i32}> : (i65) -> i64
%18 = "comb.mux"(%16, %14, %17) {sv.namehint = "nsmaller"} : (i1, i64, i64) -> i64
%19 = "comb.concat"(%3, %8) : (i63, i1) -> i64
"hw.output"(%19, %6) : (i64, i64) -> ()
}) {comment = "", module_type = !hw.modty<input in_a : i64, input in_b : i64, input clk : !seq.clock, input reg_working : i1, input reg_larger : i64, output out_valid : i64, output reg_smaller : i64>, parameters = [], per_port_attrs = [], result_locs = [#loc3, #loc1], sym_name = "GCD_P2"} : () -> ()
现在的策略是每个 output 划分成一个单独的子模块。下一步计划着手处理带 instance 的嵌套模块切分,在切这样的模块时尽力避免跨模块边界过多的连线。之后我们计划对模块进行图建模,然后引入 METIS 库来对图进行划分,并由该库来决定 reg 状态分配到哪个子模块中。在实现完这些后向上游仓库打开 PR 并推动合并。
Profiler 使用 rust 语言实现。目前已完成 T1 profiler 的多个基本模块编写,并将已编写完成的模块组合得到了一个分析器 DEMO。
仿真得到的 Event Log 原始输出为 jsonl 文件,每行为一个 json 对象,描述了一个事件及其时间戳。 由于原始输出的体积庞大,仿真管线会将原始事件日志经 zstd
压缩之后存储。Profiler 利用了 zstd crate 可以直接读取压缩之后的日志文件。事件解析部分,利用 serde
库将 Json 编码的事件直接读取为 Rust 中定义的结构体。
事件会按事件顺序给出,但由于 Chisel 语言的限制,同一时钟周期内发生的事件记录顺序难以事先确定。同时 Profiler 在执行特定的分析任务时可能只需要部分类型的事件。在处理事件之前,会先将事件进行过滤,筛选出感兴趣的事件,并对同一周期内记录的事件进行重排序。
为了更精细的分析 Profiler 得到的结果,RTL 设计人员希望能将部分较为细节的分析结果与仿真波形对齐,希望 Profiler 能以波形文件的方式部分低层次的分析结果。
目前 Profiler 以 FST 格式输出分析波形文件。本项目将 FST C-API 进行了简单的包装已完成 FST 格式输出功能。已可以输出 hierarchy 定义,记录下 int/bits 和 string 类型信号的波形,本部分功能基本完备。
性能分析的方法学部分已有初步设计,但尚未完成所有细节。 后续计划主要完善性能分析的方法学后,与 RTL 设计人员沟通,添加相应的 event log,并编写性能分析的代码。
除了核心功能开发外,还有以下非核心功能。若时间充裕,也考虑进行开发。
T1 支持参数化的生成多种不同配置的加速器,但目前仿真器产生的日志文件不包含配置信息,profiler 难以获得设计参数。目前阶段暂时在 profiler 硬编码设计参数。后续考虑与仿真器部分统一接口。
Profiler 输出的事件分析波形需要与仿真波形一起打开进行查看。目前使用 GtkWave 的 twinwave
程序可以打开两个并列且滚动同步的窗口,但使用并不方便。
目前开源的波形查看软件 GtkWave 和 Surfer 均缺乏同时打开多个波形文件,将其聚合显示在同一窗口的功能(该功能在对应的仓库均有 Feature Request,但由于社区开发力量不足,暂无实质的开发进展)。未来考虑参与到 GtkWave 或 Surfer 社区的多波形文件查看功能的开发之中。
目前事件波形以 FST 格式输出,未来会增加 VCD 格式输出的功能。由于 VCD 格式是较为简单的文本格式,。目前的 Profiler 代码中已对事件波形输出部分设计了相应的接口。添加该功能不需要大的架构改动。
运行程序
t1-profiler --wave-path analysis.fst event-log.jsonl.zstd
查看分析结果
twinwave analysis.fst + wave.fst
不知不觉一个多月过去了,我们也已经在官网上刊登了两次双周报。以下是对目前工作的一部分总结和一些暂时尚未写在报告中的进展。
项目仍处于早期开发阶段,我们基本确定了渲染部分的实现方式。经过测试,点和路径已经可以成功渲染,但对于复合多边形仍有一些工作需要完成。
我们计划将项目划分为不同的组件,以便未来的开发和维护。
由于缺少足够简洁的OSM API封装,我开发了一个 OSM API 模块,使用 Promises 封装了 OSM 的一些接口,能够与符合 OSM 标准的 API 进行通信并提交结果,同时将返回的 XML 解析为 JavaScript 对象,以便在程序中更容易操作。
目前,我们的代码无法执行任何编辑操作,虽然能从 OSM 网站获取 XML 或 JSON 数据,但尚不能直接渲染。因此,我手动构建了几个点作为非常基础的渲染测试。(请原谅配色方案的粗糙,我会在后续进行优化。)
背景瓦片功能也进行了测试,目前运行良好。
由于地球上71%的面积是海洋,大部分陆地无人居住,而我不幸随机选择了一个位于荒野中的位置,因此在这张截图里没能展示出可识别的 OSM 数据。不过瓦片确实可以正常请求和渲染,正如截图中的开发者工具所示。
此外,我们在尝试为所有瓦片请求添加自定义 User-Agent 以遵守 OSMF 的瓦片使用政策时遇到了一个小技术问题。具体来说,我们希望自定义请求头部(例如,在 User-Agent 中插入 Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:128.0) Gecko/20100101 Firefox/128.0 BusFensi/0.0.1
之类的信息,而不是使用浏览器的默认 User-Agent)。我们需要对 pixi.js 进行一些修改,因为 pixi.js 似乎通过 <img>
标签加载图片。然而,这样做不符合良好的开发实践。因此,根据 @bhousel 的建议,我们决定放弃这个相对不重要的需求。
目前,数据渲染部分已经设置完毕,不过仍有一些细节需要打磨,比如样式和控制渲染的元素。这些将在后续功能开发中同步调整,以确保样式与编辑逻辑一致。
(糟糕,确实看起来不太美观)
不过,只需几行代码,我就可以移除建筑物(以及其他非公路特征)的渲染,这将使其看起来好得多。我会逐步调整样式——也许借鉴一些 iD 编辑器的颜色?
至于编辑功能,现在无法进行演示,因为目前只有拖动点、平移地图和调整缩放级别的功能。
由于其他模块的接口仍在开发中,一些功能尚未实现。例如,路径的高亮显示,目前默认逻辑是选择整个路径,而不是高亮显示路径的某一段。再比如,多边形的渲染还没有实现,因为这需要编辑模块的接口。
目前,正在编写状态管理模块,为编辑提供稳定支持。这部分主要包括操作逻辑和全局数据管理。
在地图编辑的操作逻辑中,我引入了一个状态机,通过监听鼠标和键盘事件来管理编辑器的当前状态。状态机在代码中被称为“stateMachine.js”,它根据状态图中提供的功能和状态关系,处理状态转换和数据维护。根据当前状态,它决定触发哪 些操作以及要转换到的新状态。状态机提供了钩子,允许其他组件(如 Pixi.js 中的鼠标事件)跟踪事件。编辑操作在状态转换期间进行。
一般来说,在状态机的状态转换过程中,会对全局数据进行一系列更改。为了管理这些更改,代码中使用了一个双向链表,称为“操作列表”。该列表提供撤销、重做和执行接口。执行接口接受一个操作,执行它,然后将其添加到列表的末尾。为了避免多个重复操作,某些操作会被合并。
一个操作提供执行、撤销和重做接口,有些操作还提供合并选项。操作在执行、撤销或重做时应维护全局数据,并管理其他相关更改,例如受影响元素的 UI 和跨层的数据。这种方法确保所有更改都集中在一起,最大限度地减少在撤销和重做操作期间维护相关更改的认知负担。
全局数据是每个操作中引用的对象,操作列表确保在撤销和重做操作期间,操作的顺序是正确的。例如,它确保在撤销一个操作时,状态反映所有后续操作已经被撤销。
由于实际的编辑操作尚未完成,撤销和重做功能暂时未考虑,因为它们依赖于仍在进行中的部分代码。
项目的核心模块现已基本完成,这使我们能够进入开发的后期阶段。接下来的工作主要是在现有框架内添加新功能。
项目已经开发了大约一个半月,截止日期在九月底,时间相对紧张。因此,我将优先完成核心功能,将一些非核心功能推迟到以后完成,以确保项目顺利完成。
以下是需要实现的主要功能:
请注意,UI 的实现可能会被推迟,因为优先考虑开发基本图形模块。
作为一个公共交通编辑器,它应支持公共交通编辑功能。在 OSM XML 中,公共交通关系由一个关系元素表示,该元素有一个路线和一系列标签,指示该元素的具体内容。
对于元数据的编辑,可以使用前面提到的属性视图。
对于点的精确位置编辑,将使用地图模块。我考虑添加一些样式以突出当前正在编辑的路线,使其更容易识别。
对于路线、点和路径之间的成员关系,需要将地图的选择功能与属性视图集成。
此外,可能需要一个路线创建功能,包括添加新点、创建新路线和编辑路线属性。
为了基于站点关系实现路线计算,利用现有的 API 如 Valhalla 或 OSRM 可以非常有效,因为它们本身就是基于 OSM 的模型来设计数据读取的。
Jul 7, 2024. | By: Shengqi Chen
在 2024 年 7 月 6 日于湖南长沙举办的 ACM TURC 2024 会议上,TUNA 代表 @Harry_Chen 和 @dangfan 向现任 ACM 主席 Yannis Ioannidis 教授 1 2 3 介绍 TUNA,并赠送 2023 夏季款 Tunaive 一件。Yannis 教授对 Tunaive 上的 Quine Logo 设计表示赞赏,并称回国后有兴趣对相关代码进行运行测试。
May 9, 2024. | By: Meow-meow
今年,中科院软件所继续举办 “开源软件供应链点亮计划——暑期2024” 项目。该项目与 Google Summer of Code 形式类似:开源社区提供项目需求并提供导师(mentor),在校学生利用暑期时间进行开发,主办方为顺利完成的项目提供一定额度的奖金。无论 GSoC 还是“点亮计划”,都是一种非常好的开源实践范式,能够有效增进高校学生对开源的理解、增加与真实社区的接触,并积累宝贵的经验。本次 TUNA 协会将继续作为社区加入这一计划,提供若干项目需求。TUNA 愿意和大家一起为国内的开源生态添砖加瓦,欢迎有能力、有热情、有时间的小伙伴们参加。
2023 年,TUNA 基于自身与上游需求,共立项 TUNA 镜像站帮助文档、清华大学网络学堂助手更新迭代、flutter-nfc-kit 更新迭代等多个方面的 5 个项目,4 个项目顺利结项,其中 清华大学网络学堂助手(Learn Helper)更新迭代(学生:王铮,导师:陈晟祺)获评最佳质量奖。详情可见 TUNA 项目页面 和 官网公示。
你也可在活动官网查看 TUNA 的项目列表。
项目说明会将于 5 月 11 日举行,活动细节见 https://tuna.moe/event/2024/ospp2024/
本页最后更新时间:2024/05/10
下面是一些通用的注意事项:
以下项目从 TUNA 的实际需求而来,目前或者将作为 TUNA 的自有项目开放源码,由 TUNA 和开发者共同维护。
下面的项目非 TUNA 维护,由 TUNA 成员和相应的上游社区成员(可能为同一人)共同担任导师。项目成果将以 Pull Request 的形式回馈给上游项目。
项目描述:CIRCT 是基于 LLVM/MLIR 开发的电子设计自动化 (EDA) 工具,提供了硬件电路的统一中间表示、不同硬件描述语言 (HDL) 的前端和输出以及综合、仿真功能。目前 Chisel HDL 使用 CIRCT 作为其后端。
CIRCT 中的仿真器后端目前正在进行活跃开发中,原理是电路中间表示下降到 LLVM 方言上,将 HDL 所定义的电路直接编译为对应的软件仿真器。这一编译器整体称为 Arcilator (和 Verilog 仿真编译器 Verilator 对应),在 CIRCT 中主要参与的方言是 ARC 方言。目前 Arcilator / ARC 只支持单线程仿真,为了进行多线程仿真需要进行电路划分以及线程之间的同步工作。本项目的目标是为 Arcilator / ARC 添加初步的多线程仿真支持。
May 6, 2023. | By: Yipeng Liu
今年,中科院软件所继续举办 “开源软件供应链点亮计划——暑期2023” 项目。该项目与 Google Summer of Code 形式类似:开源社区提供项目需求并提供导师(mentor),在校学生利用暑期时间进行开发,主办方为顺利完成的项目提供一定额度的奖金。无论 GSoC 还是“点亮计划”,都是一种非常好的开源实践范式,能够有效增进高校学生对开源的理解、增加与真实社区的接触,并积累宝贵的经验。本次 TUNA 协会将继续作为社区加入这一计划,提供若干项目需求。TUNA 愿意和大家一起为国内的开源生态添砖加瓦,欢迎有能力、有热情、有时间的小伙伴们参加。
May 8, 2022. | By: Yipeng Liu
今年,中科院软件所继续举办 “开源软件供应链点亮计划——暑期2022” 项目。该项目与 Google Summer of Code 形式类似:开源社区提供项目需求并提供导师(mentor),在校学生利用暑期时间进行开发,主办方为顺利完成的项目提供一定额度的奖金。无论 GSoC 还是“点亮计划”,都是一种非常好的开源实践范式,能够有效增进高校学生对开源的理解、增加与真实社区的接触,并积累宝贵的经验。本次 TUNA 协会将继续作为社区加入这一计划,提供若干项目需求。TUNA 愿意和大家一起,为国内的开源生态添砖加瓦,欢迎有能力、有热情、有时间的小伙伴们参加。
Apr 6, 2021. | By: Shengqi Chen
今年,中科院软件所与华为 openEuler 项目继续共同举办 “开源软件供应链点亮计划——暑期2021” 项目。本次 TUNA 协会将继续作为社区加入这一计划,提供若干项目需求。欢迎有能力、有热情、有时间的小伙伴们参加,也欢迎 TUNA 成员们提出更多需求。TUNA 愿意和大家一起,为国内的开源生态添砖加瓦。
Nov 17, 2020. | By: Zenithal
繁忙的期中周,悠闲的金枪鱼(只有你一个没有期中的比较闲吧)。在这种百闲之中偷着忙的 TUNA 成员应邀来到南京,来到了开源软件供应链2020峰会的现场。
开源软件供应链2020峰会是「开源软件供应链点亮计划——暑期2020」的后续会议,既「围绕现代软件构建模式的关键供应关系网络——开源软件供应链展开深入解读,论道开源最新技术前沿话题」,也对暑期的项目进行总结,并展望2021年的计划。
TUNA 作为国内较大的高校开源社区,参与了「点亮计划」,从而也参与这次峰会。
Sep 30, 2020. | By: Xavier Yao
May 18, 2020. | By: Harry Chen
今年,中科院软件所与华为 openEuler 项目共同举办了 “开源软件供应链点亮计划——暑期2020” 项目。该项目与 Google Summer of Code 形式类似:开源社区提供项目需求并提供导师(mentor),在校学生利用暑期时间进行开发,主办方为顺利完成的项目提供一定额度的奖金。无论 GSoC 还是这次的“点亮计划”,都是一种非常好的开源实践范式,能够有效地增进高校学生对开源的理解、增加与真实社区的接触,并积累宝贵的经验。
本次 TUNA 协会有意作为社区加入这一计划,提供若干项目需求。欢迎有能力、有热情、有时间的小伙伴们参加,也欢迎 TUNA 成员们提出更多需求。TUNA 愿意和大家一起,为国内的开源生态添砖加瓦。
Sep 8, 2018. | By: Xavier Yao
临近开学的一个周末,我们回到了久违多年的盒子咖啡馆,举办了一场自由讨论的 tunight-lite。说是“小聚”,结果来了20多位同学,差点把咖啡馆挤爆2333。事实表明 Geek 们也是需要 social 的XD。
Jun 25, 2018. | By: Yuxiang Zhang
六月末,由Linux基金会主办的 LC3(LinuxCon + ContainerCon + CloudOpen)中国会议,在奥利匹克公园旁的国家会议中心如期召开。会议为期三日,正好赶上清华考试周,因此 TUNA 仅有少数咸鱼成员参加了会议。会上我们见到了专程从重庆赶来参会的几位开源工场的小伙伴,并进行了亲切友好的交流。
Feb 19, 2018. | By: Xavier Yao & Harry Chen
金枪鱼之夜,英文名为 Tunight,是面向 TUNA 协会成员的小型技术交流沙龙。该系列活动于 2014 年秋季学期发起,以大约每周一次的频率维持至今。活动通常围绕某一话题,以讲授、答疑、交流、实践的形式展开。金枪鱼之夜自 2015 年秋季学期起,提供活动录音 Podcast;2016 年起,在 TUNA 直播间视频直播。欢迎校内外志同道合的同学报名演讲。
Jun 17, 2017. | By: Xavier Yao
 进入考试周,北京高温黄色预警信号持续多天,最高气温38℃。高温的天气让等待新版本发布的人们内心更加的躁动。2017 年 6 月 17 日下午两点,TUNA 协会联合 USTCLUG 的 Yang Boyuan 同学以及北京 GNU/Linux 用户组在李兆基科技大楼举办了 Debian Stretch Release Party。
Feb 5, 2017. | By: Xavier Yao & Jason Lau
提供 2017 春季学期各金枪鱼之夜音、视频及讲稿下载。
Oct 7, 2016. | By: Xavier Yao
2016 年国庆假期的最后一天,寒冷的天气挡不住大家参加 TUNA 活动的热情。在某世界一流隔壁大学大名鼎鼎的真维斯楼,TUNA 举行了秋季学期新成员见面会。本次百团招新,在全新设计的注册网站和全新制作的贴纸和易拉宝的助攻下,我们招到新成员的人数和往年差不多,依然是50个左右……黑线
May 16, 2016. | By: Justin Wong
又是一年春夏之交,安全是这个时节的主题。2016 年 5 月 15 日下午两点,科普讲座——网络安全科普日·物联网时代的安全威胁,在 清华五教 5105 准时开场。
May 1, 2016. | By: Justin Wong
最近 TUNA 新增了一台跑着 RHEL7 的服务器,之前我们用的都是 Debian,虽然早年也接触过 CentOS,但是对 RH 系的生态系统还是不太熟练。这篇文章也算是 对头一次在 RHEL7 上折腾的一个备忘。
Sep 19, 2015. | By: Justin Wong
金秋送爽,艳阳高照,2015 年 9 月 19 日下午两点,2015软件自由日清华站在清华大学新水利馆欢乐开场。本次活动 由 TUNA 协会和北京 GNU/Linux 用户组联合举办,且得到了 Ubuntu 社区、Fedora 社区、openSUSE 社区、Firefox 社区、 阿里移动安全和七牛云存储等赞助方的大力支持,赞助方为此次活动提供了非常丰厚的礼品。
May 15, 2015. | By: Justin Wong
5 月的北京,夜晚的阵阵清风吹过宁静清华园,空气中飘荡着初夏的味道,这是发布新版本的季节!
2015 年 5 月 21 日,TUNA 协会邀请到了 [pTex-ng][pTex-ng] 的作者 马起园(李阿玲)、 中文 TeX 文档类/宏包 CTeX-kit 的开发者 刘海洋 还有 TUNA 协会成员,ThuThesis 维护者 赵涛(Alick Zhao) 等人, 共同分享 TeX 与汉字处理的技术与应用,还有 pTeX-ng、CTeX 2.0、最新版 ThuThesis 特性的演示。
Mar 29, 2015. | By: Justin Wong
2015 年 3 月 29 日,沙尘退去,阳光明媚,春暖花开。众多 GNU/Linux 爱好者的启蒙人, 《鸟哥的 Linux 私房菜》作者 鸟哥·蔡德明 来到清华大学,在三教 3201 与同学们见面。
上午 10 点,来自 openSUSE 社区的 Sunny,Max 和 鸟哥 一同到达会场,活动如期开始。
Nov 16, 2014. | By: Justin Wong
2014 年 11 月 16 日,openSUSE 13.2 Release Party 清华站如期在中央主楼报告厅举办, 本次活动由 openSUSE 社区发起,TUNA 协会协办,SUSE 公司提供了礼品等各项资金支持。
活动中我们又见到了很多熟悉的面孔,绝对中立的 openSUSE 吸引到了来自北京各个开源社区同僚前来欢聚。
下午两点,来自 TUNA 的 Justin Wong 宣布活动开始,本次活动的主题是「做一只安静的蜥蜴」,openSUSE 作为一个 由社区驱动写作开发的自由的 Linux 发行版,深受广大自由开源软件爱好者的喜爱,「安静」二字也很符合 openSUSE 与世无争,默默贡献的特质。
Nov 1, 2014. | By: Justin Wong
2014 年 11 月 1 日,TUNA 那举行了创会以来首次新成员欢迎会,在本次活动中,除了新入会的同学, 还有不少知其名而不知其面的同学和幽灵会员参与。
最近上线的 gdanmaku 服务为本次活动带来了弹幕支持,害羞说话的同学们即可通过弹幕参与互动,活动在轻松快乐的气氛中开始。
Oct 3, 2014. | By: Justin Wong
2014年9月27日下午两点,清华大学TUNA协会在中央主楼二层网络中心报告厅举行了软件自由日庆祝活动,除了TUNA成员和清华同学外, 还有来自BJGUG, BLUG, GitCafe 和 CSDN 的小伙伴一同参加了活动。 由于本学期清华开学较晚,活动时间比正常时间推迟了一周。
此次软件自由日包括4个话题:
Aug 30, 2014. | By: Alick Zhao
2014 年 3 月 15 日,春季学期开学后不久的一个周六,清华大学 TUNA 协会在五教 5102 主办了硬件自由日清华站的活动。 活动有超过 70 人参加。此次活动的主题为“让软件工程师硬起来”。
下午一点时分组织者和一些观众陆续到场。活动注册沿用电子注册方式,每个人在注册电脑上的 LibreOffice 表格中填写各自的信息,这个表格会转换为 csv 格式, 被最后幸运抽奖的程序读取使用。本次活动启用了微博墙实时互动,现场第二块投影幕布由 scateu 提供。
Aug 30, 2014. | By: Alick Zhao
Note: This is a press style report of FUDCon APAC 2014, which summarizes the event highlights. Don’t miss the links to slides, videos, and photos!
FUDCon APAC 2014 was successfully held at Conference Center at New Main Building of Beihang University, Beijing, China during May 23 to 25, 2014. This year the event was held together with GNOME.Asia Summit, an annual conference for GNOME users and developers in Asia. It turns out to be a rather exciting experience of mutually beneficial cooperation of free and open source communities. In total, GNOME.Asia and FUDCon APAC 2014 attracted more than 500 registrants, and among them over 300 attended the event.
Sep 25, 2013. | By: Alick Zhao
上周六(9 月 21 日)北京天气晴好,由清华大学学生网管会 (TUNA) 主办,并由北京 GNOME 用户组 (BJGUG) 协办的自由软件日清华站活动顺利举行。活动有超过 60 人参加。接近下午两点时开始现场注册,这次活动的注册为电子注册,每个人在注册电脑上的 LibreOffice 表格中填写各自的信息,这个表格会被最后幸运抽奖的程序直接读取。我们准备了光盘、贴纸与宣传海报,注册后每人都可以领取。
Subscribe to this blog via RSS.
Report 15
Fedora 1
Server 1
Ospp 7
Award 1
Duanzi 2
Debian 1
Report (15) Fedora (1) Server (1) Arrangement (2) Ospp (7) Open source (7) Community (8) Award (1) Duanzi (2) Debian (1)