整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

《HelloGitHub》第99期

兴趣是最好的老师, HelloGitHub 让你对编程感兴趣!

简介

HelloGitHub 分享 GitHub 上有趣、入门级的开源项目。

github.com/521xueweihan/HelloGitHub

这里有实战项目、入门教程、黑科技、开源书籍、大厂开源项目等,涵盖多种编程语言 Python、Java、Go、C/C++、Swift 等,让你在短时间内感受到开源的魅力,对编程产生兴趣!


以下为本期内容|每个月 28 号更新

C 项目

1、 HandBrake :免费的开源视频转码工具。这是一款功能强大、社区驱动的开源视频转码工具,它支持将各种不同格式的视频文件,转换为 MP4 和 MKV 等常见格式。

地址: github.com/HandBrake/HandBrake

C# 项目

2、 SwashbucklerDiary :记录生活点滴的侠客日记。这个项目的作者因为喜欢写日记,所以开发了这款离线优先的日记应用。它拥有简洁清爽的界面,用户可以选择记录日记时的天气、心情和位置。除了支持 Web 在线使用外,还提供了 Android、Windows、iOS 和 macOS 客户端。

地址: github.com/Yu-Core/SwashbucklerDiary

3、 SyncClipboard :跨平台的剪贴板同步工具。该项目可以轻松实现不同设备间剪贴板内容同步,支持文本、图片和文件。使用时可以选择自己部署服务端,或者使用支持 WebDAV 协议的网盘。

地址: github.com/Jeric-X/SyncClipboard

C++ 项目

4、 ladybird :真正独立的开源浏览器。该项目作者想要从头构建一个真正独立的 Web 浏览器,所以他从自己写的 SerenityOS 操作系统中分离出浏览器引擎部分,计划基于此做一个全新、跨平台的开源浏览器。目前项目处于早期阶段,尚未发布可供下载的安装包。

地址: github.com/LadybirdBrowser/ladybird

5、 mosh :适用于移动端的远程终端工具。这是一款专为移动和不稳定的网络环境设计的远程终端工具,它能够在网络切换、高延迟和 IP 变化的情况下,保持远程会话的稳定和更快的响应,适用于 Android、iOS、Linux 和 macOS 等系统。

地址: github.com/mobile-shell/mosh

6、 OpenArk :专业的 Windows 恶意程序分析与清理工具。这是一款 Windows 平台上的对抗和清理 Rootkit(恶意程序)工具,它能够帮助程序员发现系统中隐藏的恶意软件,支持查看进程、进程注入、内核驱动模式和扫描等功能。来自 @SHOWTA 的分享

地址: github.com/BlackINT3/OpenArk

Go 项目

7、 dblab :交互式的数据库命令行客户端。这是一个用 Go 编写的轻量级、交互式的 TUI 数据库客户端,它开箱即用、方便快捷,支持 PostgreSQL、MySQL、SQLite3 和 Oracle 数据库,不是桌面工具用不起,而是命令行的更有性价比。

地址: github.com/danvergara/dblab

8、 go-size-analyzer :分析 Go 编译后文件大小的工具。该项目通过逆向工程和反汇编,收集二进制文件中的地址,合并后计算出每个依赖在最终的二进制文件中所占大小,并通过可视化的方式展示出来。它可以用来分析 Go 程序编译后的文件体积,支持命令行和 Web 两种使用方式。来自 @Zxilly 的分享

地址: github.com/Zxilly/go-size-analyzer

9、 gws :简单、快速的 Go WebSocket 库。该项目是用 Go 编写的 WebSocket 库,它提供了简洁明了的 API,具备高吞吐、低延迟、低内存占用、稳定可靠的特点,可用于高并发场景,支持上下文接管、自定义窗口大小和广播等功能。来自 @道一 的分享

地址: github.com/lxzan/gws

10、 river :基于 Postgres 的后台任务管理平台。该项目是基于 Go+Postgres 数据库开发的任务队列,它内置 Web 管理后台,支持自动重试、定时任务和优先级等功能。

地址: github.com/riverqueue/river

11、 watermill :快速开发事件驱动应用的 Go 库。这是一个能够高效处理消息流的 Go 库,即发布/接收消息并做出反应。它上手容易,支持 Kafka、RabbitMQ、HTTP 和 MySQL binlog 等消息中间件,适用于处理实时数据流、分布式事务和微服务通信等场景。来自 @DeShuiYu 的分享

// ...
func main() {
 saramaSubscriberConfig := kafka.DefaultSaramaSubscriberConfig()
 // equivalent of auto.offset.reset: earliest
 saramaSubscriberConfig.Consumer.Offsets.Initial = sarama.OffsetOldest

 subscriber, err := kafka.NewSubscriber(
  kafka.SubscriberConfig{
   Brokers:               []string{"kafka:9092"},
   Unmarshaler:           kafka.DefaultMarshaler{},
   OverwriteSaramaConfig: saramaSubscriberConfig,
   ConsumerGroup:         "test_consumer_group",
  },
  watermill.NewStdLogger(falsefalse),
 )
 if err != nil {
  panic(err)
 }

 messages, err := subscriber.Subscribe(context.Background(), "example.topic")
 if err != nil {
  panic(err)
 }

 go process(messages)
// ...

地址: github.com/ThreeDotsLabs/watermill

Java 项目

12、 spring-reading :Spring 源码阅读。这是一份讲解 Spring 源码的图文教程,内容涵盖了 Spring 框架的核心概念和关键功能,而且还贴心地标注了难度等级,更加便于学习。来自 @Lex 的分享

地址: github.com/xuchengsheng/spring-reading

13、 xpipe :一键远程登录 Docker 实例的工具。该项目是用于管理远程服务器的桌面工具,它会在 SSH 连接到服务器后,自动检测服务器环境和 shell 类型,实现一键登录各种容器实例(Docker、LXC、WSL),并支持远程文件管理和工具集成等功能。来自 @孤胆枪手 的分享

地址: github.com/xpipe-io/xpipe

JavaScript 项目

14、 earthworm :让你上瘾的英语学习网站。这是一个开源的在线学习英语网站,支持自托管和本地运行。它采用连词成句、循序渐进的方法帮你学习英语。通过不断地重复形成肌肉记忆,并结合游戏奖励和积分排名的方式,让背单词变得有趣且高效。来自 @Immerse 的分享

地址: github.com/cuixueshe/earthworm

15、 million :优化 React 组件性能的工具。该项目是专为 React 应用设计的优化编译器,它通过优化虚拟 DOM 和直接更新 DOM 节点,来减少页面更新的耗时,从而提升 React 组件性能,最高可达 70%,支持 VSCode 插件和命令行的使用方式。

地址: github.com/aidenybai/million

16、 pouchdb :开源的 JavaScript 数据库。该项目是用 JavaScript 编写、运行在浏览器里的 NoSQL 数据库,它能够在离线状态下将数据存储至本地,并在网络恢复后自动同步数据,保持数据与服务器同步。

var db = new PouchDB('dbname');

db.put({
  _id'hellogithub-1',
  name'HelloGitHub',
  age69
});

db.changes().on('change'function({
  console.log('Ch-Ch-Changes');
});

db.replicate.to('远程数据库地址');

地址: github.com/pouchdb/pouchdb

17、 stf :通过浏览器控制多台 Android 设备。这是一个用 Node.js 开发的安卓智能设备群测工具,它提供了一个可远程调试多台 Android 设备的 Web 平台,支持 Android 手机和手表等设备。来自 @wang-qa 的分享

地址: github.com/DeviceFarmer/stf

18、 ua-parser-js :解析 User-Agent 的 JS 库。这是一个用于解析 User-Agent 的库,它可将用户代理字符串解析为 UAParser 对象,便于检测和查看用户的浏览器、操作系统、CPU 和设备型号等信息。

const parser = new UAParser(ua);

console.log(parser.getResult());
/*
{
    ua: "Mozilla/5.0 (Linux; Android 10; STK-LX1 Build/HONORSTK-LX1; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/110.0.5481.153 Mobile Safari/537.36 musical_ly_2022803040 JsSdk/1.0 NetType/WIFI Channel/huaweiadsglobal_int AppName/musical_ly app_version/28.3.4 ByteLocale/en ByteFullLocale/en Region/IQ Spark/1.2.7-alpha.8 AppVersion/28.3.4 PIA/1.5.11 BytedanceWebview/d8a21c6",
    browser: {
        name: "TikTok",
        version: "28.3.4",
        major: "28"
    },
    cpu: {},
    device: {
        type: "mobile",
        model: "STK-LX1",
        vendor: "Huawei"
    },
    engine: {
        name: "Blink",
        version: "110.0.5481.153"
    },
    os: {
        name: "Android",
        version: "10"
    }
}
*/

地址: github.com/faisalman/ua-parser-js

PHP 项目

19、 openemr :免费的开源医院管理系统。该项目是目前最流行的开源医院管理系统,它集成了医院日常运营所需的所有功能,如预约、患者档案、电子计费和医疗记录等,同时支持中文在内的 30 多种语言。

地址: github.com/openemr/openemr

Python 项目

20、 CleanMyWechat :自动删除电脑端微信缓存数据的工具。该项目是用 PyQt5 写的 Windows 工具,它可以清理微信电脑客户端自动下载的无用数据,支持自动识别账号、多账号管理,以及选择清理文件的类型和设置清理多久以前文件等功能。

地址: github.com/blackboxo/CleanMyWechat

21、 searxng :尊重个人隐私的 Python 元搜索引擎。该项目是基于 Flask 构建的聚合搜索引擎,能够整合来自 70 多个搜索引擎的搜索结果。它安装简单、不追踪用户行为,支持选择搜索引擎、安全搜索和多语言等功能。来自 @孤胆枪手 的分享

地址: github.com/searxng/searxng

22、 vulture :Python 的“死”代码侦探。这是一个 Python 的静态代码分析工具,它可以找出 Python 项目中未使用的代码,仅需一条命令,就能清理没用和无效的 Python 函数、变量和代码片段。

地址: github.com/jendrikseipp/vulture

23、 warp :编写高性能仿真程序的 Python 框架。该项目是英伟达开源的 Python 框架,它通过即时编译技术将 Python 代码,转换为可以在 CPU 或 GPU 上运行的高效内核代码,可用于编写模拟物理环境、碰撞检测和图形处理等程序。

import warp as wp
import numpy as np

num_points = 1024

@wp.kernel
def length(points: wp.array(dtype=wp.vec3),
           lengths: wp.array(dtype=float))
:


    # thread index
    tid = wp.tid()
    
    # compute distance of each point from origin
    lengths[tid] = wp.length(points[tid])


# allocate an array of 3d points
points = wp.array(np.random.rand(num_points, 3), dtype=wp.vec3)
lengths = wp.zeros(num_points, dtype=float)

# launch kernel
wp.launch(kernel=length,
          dim=len(points),
          inputs=[points, lengths])

print(lengths)

地址: github.com/NVIDIA/warp

24、 wsgidav :基于 WSGI 的 WebDAV 服务器。WebDAV 是一种允许在网络上直接编辑和管理文件的通信协议,多用于文档共享、云存储和文件同步等场景。该项目是用 Python 写的 WebDAV 服务器,可独立运行、自带简单的 Web 界面,支持 MS Office 文档在线编辑和身份验证等功能。

地址: github.com/mar10/wsgidav

Ruby 项目

25、 lolcommits :基于 Git 的程序员自拍。该项目能在每次用 git 提交代码时,自动使用摄像头拍照,并在照片上标记 commit ID,这样不仅可以记录“生活”,还能一眼找到代码的作者。

地址: github.com/lolcommits/lolcommits

Rust 项目

26、 100-exercises-to-learn-rust :学习 Rust 的 100 个练习。该教程秉承着边学边做的原则,内含大约 100 道练习题和答案,带你从零开始学习 Rust 编程语言。

地址: github.com/mainmatter/100-exercises-to-learn-rust

27、 crossbeam :Rust 并发编程工具库。在 Rust 的并发编程世界中,它就像一把瑞士军刀,提供了丰富且强大的无锁并发数据结构和工具,极大地提升了 Rust 并发编程的效率。来自 @DeShuiYu 的分享

地址: github.com/crossbeam-rs/crossbeam

28、 zellij :更容易上手的终端复用器。该项目是一个 Rust 写的终端多路复用器,支持单窗口多标签、分割窗口和自动恢复连接等功能。它提供了开箱即用的默认配置,同时拥有强大的插件系统,从而深受初学者和高级用户的喜爱。

地址: github.com/zellij-org/zellij

Swift 项目

29、 Loop :一款优雅的 macOS 窗口管理工具。这是一款极简的 macOS 窗口管理应用,它无需复杂的配置,即可通过简单的组合键,轻松实现移动窗口位置、调整窗口大小以及排列窗口,交互十分优雅,使用体验极佳。

地址: github.com/MrKai77/Loop

30、 noTunes :禁用 iTunes 的工具。这是一款 macOS 应用,它可以阻止 iTunes 或 Apple Music 自动启动和弹出,还支持设置 iTunes 的替代品。

地址: github.com/tombonez/noTunes

其它

31、 anx-reader :免费的 Android 电子书阅读器。这是一款用 Flutter 编写的电子书阅读软件,它免费且没广告,支持 WebDAV 同步电子书、笔记和阅读进度,适用于 Android 手机和平板电脑。

地址: github.com/Anxcye/anx-reader

32、 etcher :简单易用的 USB/SD 启动盘制作工具。该项目可以将操作系统镜像烧录进 SD 卡或 USB 设备,可用于制作可启动、便携式的操作系统。它拥有友好的操作界面,仅需 3 步就能完成 USB 启动盘制作,适用于 Linux、macOS 和 Windows 10 及更高版本。

地址: github.com/balena-io/etcher

33、 GmsCore :谷歌服务框架的开源替代品。该项目是一个开源的替代 Google Play 服务的解决方案,它可以让无法安装或不想用 Google 服务的用户,运行依赖谷歌服务的 Android 应用。

地址: github.com/microg/GmsCore

34、 OpenGlass :低成本的 AI 智能眼镜。该项目仅需 25 美元,就可以将普通的眼镜升级成 AI 智能眼镜。它支持录制视频、识别物体和翻译文本等功能,但需要与电脑配合使用,不支持在镜片上显示内容。

地址: github.com/BasedHardware/OpenGlass

35、 scribe :用 HTML 的方式展示乐谱。该项目通过 CSS+SVG+HTML 代码,实现了在网页上显示音乐符号和乐谱。

地址: github.com/stephband/scribe

36、 WTF-zk :零知识证明入门教程。这是一份入门级的零知识证明教程,零知识证明是一种技术,允许一方在不泄露任何具体信息的情况下向另一方证明某件事为真,多用于密码学、隐私计算和 Web3 等领域。

地址: github.com/WTFAcademy/WTF-zk

开源书籍

37、 introduction-to-bash-scripting :《Bash 脚本入门指南》。这是一本教你如何编写出色的 Bash 脚本的开源书籍。

地址: github.com/bobbyiliev/introduction-to-bash-scripting

38、 PyTorch-Tutorial-2nd :《Pytorch 实用教程》。这本书不仅全面介绍了 PyTorch 的基础知识,还包含丰富的 PyTorch 实战案例和大型语言模型部署实例,能帮你快速上手 PyTorch,并具备出色的开发能力。来自 @TingsongYu 的分享

地址: github.com/TingsongYu/PyTorch-Tutorial-2nd

机器学习

39、 gateway :大型语言模型 API 聚合网关。该项通过提供统一且快速的 API,让开发者能够轻松访问超过 200 个 LLMs,还支持多模态、自动重试和负载均衡等功能。

地址: github.com/Portkey-AI/gateway

40、 MoneyPrinterTurbo :一键生成短视频的 AI 工具。该项目是基于大模型服务的 AI 视频生成工具,只需要提供一个主题或关键字,就可以自动生成高清的短视频。它拥有简单易用的 Web 界面,支持批量生成、设置视频时长和横/竖屏尺寸等功能。来自 @jolahua 的分享

地址: github.com/harry0703/MoneyPrinterTurbo

41、 Omost :极简提示词的文生图工具。该项目基于 LLM 的编程能力帮用户自动完善文生图的提示词,可以根据用户输入的简短提示词生成高质量的图片,还支持图片局部修改等功能,比如将图片中的龙变成恐龙,极大地降低了编写文生图的门槛,无需复杂的提示词即可生成满意的图片。

地址: github.com/lllyasviel/Omost

42、 Scrapegraph-ai :基于 AI 的 Python 爬虫。这是一个由 AI 驱动的 Python 爬虫库,它借助 LLM 的能力,可以根据提示词自动抓取目标网站的数据。

smart_scraper_graph = SmartScraperGraph(
    prompt="List me all the projects with their descriptions",
    source="目标网站",
    config=graph_config
)

result = smart_scraper_graph.run()
print(result)

地址: github.com/VinciGit00/Scrapegraph-ai

最后

谢参与 分享 开源项目的小伙 ,欢迎更多的开 源爱 好者 来 HelloGitHub 自荐/推荐开源项目

希望本期内容有你感兴趣的开源项目,兴趣是最好的老师,它能点燃你对开源的热情、勇敢地迈出第一步,随时欢迎你加入开源的大家庭!如果还没看过瘾, 点击阅读 往期内容。

辑导读:网易云音乐一直以高质量的评论出圈,它的内容社区在众多在线音乐平台中是属于佼佼者。它是如何打造有共鸣的内容社区的呢?本文将从三个方面进行分析,希望对你有帮助。

摘要:

在早期市场上的音乐市场份额已被“酷狗音乐”和“QQ音乐”一分为二,大众都认为这已成为定局时,网易云音乐平台伴随着一句宣言“边听音乐边看评论”,推出了推荐和评论这个功能,以个性化的乐评和精准化的歌曲推荐另辟蹊径,一跃成为音乐领域的一匹黑马。

本文将尝试基于“互动仪式链”分析网易云音乐APP互动仪式的构成要素及其结果,并为其发展道路提供思路。

什么是互动仪式链?

美国社会学家兰德尔柯林斯在其所著的《互动仪式链》一书中正式提出“互动仪式链理论”。那什么是互动仪式链呢?书中提出的解释的核心机制是高度相互关注的情感连带。互动仪式也就是际遇者由资本和情感的交换而进行的日常程序化活动。简单来说就是人与人在同一(物理/虚拟)空间场景下所产生的高度情感链接。在当今社会,互动仪式链被大家广泛探讨。

一、网易云音乐如何达成互动仪式

1. 达成互动仪式链的条件

柯林斯指出,达成互动仪式通过四个方面发生作用:

  • 两个或两个以上的人同时聚集在同一个场所,不管他们是否会有意识的关注对方,都能通过其身体在场而相互影响
  • 对局外人设定了界限,因此参与者知道谁在参加,而谁被排除在外
  • 人们将其注意力集中在共同的对象或活动上,并通过相互传达该关注焦点,而彼此知道了关注的焦点
  • 人们分享共同的情绪或情绪体验。接下来笔者就详细分析用户在使用该产品过程中的行为和视角,分析构成其互动仪式的条件

1)统一的场所

仪式始于个体共同采取某一行动或者参与某一事件,现如今“网易云音乐”平台上的注册用户已经超过八亿,可以说用户都以匿名的形式共同聚集在线上音乐平台中。平台中的音乐、歌单、电台、听听、K歌都有各自的评论区,让互不相识的用户都通过在相应的评论区和社区中发表自己的言论,展开交流而互相影响着。

2)对局外人设限

“网易云音乐”诞生之初,伴随着一句宣言“边听音乐边看评论”,乐评是“网易云音乐”和其他音乐类APP的重要区别。在最初网易云音乐的产品负责人(幕后产品一书作者)在2014年做过这样的一次用户调研。他采访了各个年龄段的音乐爱好者,询问他们是否有边听音乐边看评论的需求,当时的主流论调是“听音乐是一件私人的事情,并不想用“评论交流”但是评论功能还是上线了。刚开始的评论功能并不火爆,但随着评论和回复数量的逐渐增多,用户开始感受到群体参与对自身的影响,于是开始投入到互动中,并推进这种互动仪式。在这个过程中,用户所参与的话题具有一定的排他性。

歌词、演唱者、歌曲的用途等都可以成为用户在评论区互动的话题,但只有对话题有所了解的用户才会参与到讨论中,评论的每一类话题都各自拥有一部分参与者,并将对相关话题没有了解的用户排除在外。

3)共同的关注点

柯林斯认为,共同的关注是成为发展共享符号的关键,目前音乐类APP普遍都包含“个性推荐”的功能,基于大数据算法收集分析用户的听歌偏好,分析用户在听歌场景下的行为,包括用户听一首歌的时长,常听的歌,对那些歌或歌单进行了收藏、下载、评论、喜欢等。

通过这些指标,平台为用户推荐可能感兴趣的内容,从而提升应用程序的点击率,进一步增强用户粘性。“每日推荐”和“私人FM”功能就是个性化推荐的典型体现,在不少音乐的评论区都能看到类似于“从日推来的举手”“日推这首歌的女生我想和你结婚”这样有趣的内容,平台通过个性化推荐机制,将用户集中在“日推”的关注点上,用户基于该关注点展开社交。一起交流对于该歌单或歌曲的理解或经历。

4)共同的情感体验

音乐社交是基于兴趣之上的陌生人社交,“网易云音乐”实际是通过情感的传播来运作的,用户对于每一首歌都有自己的简介,而分享机制就给了情感流通的机会。对于任何一首歌都会有不同的用户对于在曲目有所经历.引起大多数用户共鸣的评论大多数是难忘的青涩初恋、前女友/前男友、暗恋、逝去的青春、回不去的童年、一代人共同的记忆、喜欢的偶像、未来的畅想。

这类评论主要的特点是用户将自己的经历、心情于音乐联系再来一起。他们不仅是在评论音乐,更是在表达、抒发自己的感情。用户可以在“网易云音乐”中的“音乐圈”里浏览关注他人的动态,并进行点赞、评论、同时也可以分享音乐,并期待他人对自己的评论、点赞。用户将自己的故事分享出去,引发其他用户的共鸣,从而达到共同的情感体验。

二、互动仪式的结果分析

互动仪式在发生作用初期产生的是短暂的情感,当组成要素有效综合时,短暂的情感会转化为长期情感,并产生四种结果。

  • 群体团结,群体中的个体相互之间形成认同感,从而形成团体里的成员
  • 个体的情感能量
  • 代表群体的符号,使成员感到自己与集体相关
  • 维护群体的道德感

1)促成群体团结

“网易云音乐“被称为“云村”,用户称自己为“云村村民”“云村”和“地球村”有异曲同工之意。平台的愿景是通过平台,使得人与人之间少一点隔阂,能够自如地感受到音乐的美好,分享音乐带来的快乐。音乐和技术缩短了人际间的距离,使得用户放佛置身一个沟通无障碍的小村落,这表明“网易云音乐”不止作为一个听歌APP,更是一个对广大乐迷粉丝开放的音乐社区。

边听音乐对看评论所产生的或喜悦或感动或悲伤的情感要素是一方面,另一方面对这种在线参与的长期作用结果就是产生群体成员感,用户通过加入讨论引起共鸣,增加彼此间的交流,通过创建歌单获得了收藏与关注,自我认同感得到相应提升。所有人都为自己是云村村民感到自豪。

2)释放个体的情感能量

在互动仪式中,情感能量的不平等将导致仪式出现分层,频繁输出内容个人能量强的参与者往往成为互动中心的关注焦点,支配着互动过程的发展。他们也被称为社群中的意见领袖。普通参与者能够从群体的互动中得到充分的情感能量,这使其不仅成为群体的热情支持者,更有机会成为其中的领导者。

在“网易云音乐”中,优质的歌单及其创建者容易称为多数听歌用户关注的中心,作为听众,用户通过搜索歌单,收听其中歌曲、转发、点赞、评论等一系列行为表达自己的偏好。同时,作为UGC创作者,用户可以常见歌单并收录曲目,从封面到标题再到歌单内容,每一张歌单都包含着创建者的情感偏好,“网易云音乐”通过这样一种社交体检,强化用户UGC属性,发展音乐社交文化,为用户提供释放情绪和情感平台。

3)创建代表群体的符号

“网易云音乐”和网易云旗下的其他产品一样,采用红、黑、白配色为主,网易的图标是一个红白相间的音符,音乐播放器界面测模拟了黑胶唱片,通过复古的元素,激起用户的怀旧情怀。在“网易商场”中大多也是以配色为基调的产品,为用户提供了一种品牌标示。

2019年1月,“网易云音乐”的年度听歌报告在朋友圈和微博等社交平台上疯狂转发,报告内容主要是用户上一年的听歌偏好,喜欢听的歌曲类型,听得最多的歌以及对用户来说一些特殊的音乐时刻“网易云音乐”以数据整理的方式发布用户的听歌数据,给每位用户留下了值得几年的音乐会议。

用户将自己的听歌报告发布在微博、朋友圈等主流社交平台,以晒歌单的方式表明自己的群体身份,裂变式的传播与分享体现了用户对于网易云音乐的认同。

4)维护群体的道德感

用户在注册网易云账号时,必须遵守《云音乐社区行为规范》条列才能注册成功。该条列中的条款显示用户不得发布铭感话题,一旦违反,将面临“禁言”或“账号封禁”等相应处理。处于一种类似于维护领地的心里,为了对抗外来的不和谐力量,用户通过在评论区举报消极违规的评论。以维持平台和谐氛围,有次展现出群体的价值取向。

三、网易云音乐的互动对策

当前移动音乐市场已从增量市场转变为存量是市场,用户规模逐渐稳定,没有大规模上涨控件。因此对音乐平台来说,在当前如何从既有社群中获取更高的价值,增强用户粘性,成了亟待解决的问题。

“网易云音乐”虽然具有良好的社交机制,但由于其自身的版权缺失,以及其竞争对手纷纷引入音乐社群的功能,单纯走听歌互动这条路已经无法为他带来额外的价值,“网易云音乐”想要在众多平台中稳住阵脚,还需要不断做出改进,发觉用户群体的价值。

1. 促进资源共享化

版权的缺失对于音乐平台的发展来说无疑是致命的,没有了版权,就失去了互动仪式发生的首要条件,无法聚集在同一场所,即用户无法直接通过制定歌曲聚合在一起参与讨论,创建UGC内容。“网易云音乐”要想获得更多的音乐版权,既要和行业内的竞争对手相互合作,也要积极培养用户的付费仪式。

从行业角度来看,在数字音乐版权正规化的大环境下,个平台间的互通和共享已称为主流趋势。2019年8月,第47次CNNIC中国互联网报告发布。

截止2020年12月,我国网民规模达到9.89亿。较2020年3月底增长8540万,互联网普及率达70.4%。其中网络音乐的用户规模到6.08亿,使用率为71.1%,行业内高价竞购独家音乐版权的行为逐渐减少,合作共享版权的氛围初步形成。

第47次《中国互联网络发展状况统计报告》(全文)

“网易云”虽然版权不足,但可以加大对优质音乐发掘和扶持力度,为草根创作者提供表演平台,并将优质音乐人的作品作为平台优势和其他平台进行版权置换。这能在一定程度上缓解平台承担过多音乐版权的经济压力,也为用户提供了使用的便利。同时,音乐人在上传音乐作品是,也要保证歌曲和歌单的正版与质量,只有将平台定位为正版渠道平台,才能促成同行间的相互合作,促进正版与的资源共享。

从用户的角度来看,由于互联网发展的过程太快,不少用户还保持着听免费音乐的习惯,用户的付费仪式不够强烈。这非常需要社群中个体能量较高的用户(意见领袖)在主流社交平台为粉丝和普通用户普及正版歌曲的重要性,向其灌输付费仪式,提高用户的媒介素养与自律性。

2. 拓展UGC功能

继短视频和直播的热潮后,社交平台中兴起了Vlog(视频博客,或影响日志)这种大众化分享形式,其对音乐的选择和配合有着更高的要求,这给了“网易云音乐”一个创新和升级的机会。适宜的、有趣的背景音乐会给视频内容增色,具有一定节奏喝适合曲风的音乐才能匹配对应的主题,在媒介融合的背景下,“网易云音乐”可以大胆尝试在平台内专门设置一个“云音乐Vlog”专区,引导用户为Vlog制作音乐素材并上传自己的Vlog作品,优质内容可获得大赏,原创保护和热门推荐的机会,这不仅将视频和音乐紧密联系在一个平台上,而且能激励用户不断生产出优质的原创内容。

3. 积聚品牌情感

根据柯林斯的互动仪式理论,情感是互动仪式的组成要素与结果,互动仪式通过情感的转化正常运转。短期情感产生的群体兴奋需要不断积累才能形成长期情感,而长期聚集的情感能量是加深互动促进群体团结的关键要素。

从短期感情转化到长期感情需要用户的内容分享于传播,同时也离不开品牌造势。“网易云”可以建立积分奖励机制,根据用户对平台所做的贡献给予相应的积分,将评论获得的点赞数、歌曲的播放量和收藏量、分享的次数等指标作为积分项,用户获得的积分可用于兑换平台会员“黑胶VIP”或是“云音乐商场”的产品。通过这种方式,既促进了用户互动社交,又能让用户体验到云音乐的会员特权,并接触网易云品牌旗舰下的其他产品。用户在短期的接触中感受到的也许是兴起,但长期接触后的情感积累下能感受到网易云品牌的情怀与不可替代性,提升产品的口碑与知名度。

四、结语

笔者将柯林斯的互动仪式链置与互联网环境下,互联网时代的互动仪式链凭借虚拟在场互动,群体成员属性较为同质且地位有所提升,仪式非规范并且可以反复进行特点,在网络控件中不断进行一个有一个的互动仪式。

用该理论对网易云音乐互动发生的前提条件和互动结果进行分析解读后,认为“网易云音乐”产生良性互动的核心因素是群体间的情感能量共鸣,UGC模式是增强用户粘性的催化剂.笔者将互动仪式链的理论结合实际案例分享给大家目的是为了给予大家在思考如何提升自己产品的用户粘性以及打造内容社群时能够产生新思路,将该理论的四个维度运用到各自产品的策略中,打造良性循环的内容社群。

在即将到来的5G时代,移动互联网的便捷性将汇集到更多元属性的群体,越来越多的产品思路也摆在了我们面前,期待在未来有更多有意义的产品诞生。

欢迎大家评论区讨论相关内容,笔者经可能给予答复。

参考文献:

[1] 齐菁 . 网易云音乐 CEO 朱一闻: 我们要做一款有灵魂的产品 [EB/OL] . http: / /www. sohu. com/a/289025321_ 168180. html, 2019-01-15.

[2] [美] 兰德尔·柯林斯 . 互动仪式链 [M] . 北京: 商务印书馆,2009: 4.

[3]中国互联网络信息中心. 第47次中国互联网络发展状况统计报告[R/OL]

本文由 @Lueve 原创发布于人人都是产品经理。未经许可,禁止转载

题图来自Unsplash,基于CC0协议

导读:自动化定位解析

写在前面的话

测试自动化是现在的一种趋势,更是许多厌倦功能测试想转型高端测试的测试从业者的迫切需求。关于测试自动化的资料比比皆是,但是杂乱无章,而且好多知识只是一带而过,并且更多针对 Selenium 这块的测试以 Python 语言居多,Java 语言很少。其实,Java 语言更加灵活,毕竟面向对象语言中 Java 才是当之无愧的王者。

怎样良好的整合 Java 知识与 Selenium 完美结合,是本课要讲解的内容,同时,会以实际案例来逐步引出 Selenium 的使用。课程主要有以下特色:

(1)内容由浅入深,零基础自动化人员也能看得懂。

(2)始终以解决实际问题为出发点,通过实际案例引出 Selenium 的相关知识,最大限度的避免课程枯燥,用生动的语言来描述自动化。

(3)细化每个实施的细节,希望讲解一个知识点就能彻底的讲透,并且会以一种由浅入深的形式进行讲解。

说了这么多,希望读者阅读完全部文章后会以最大限度的掌握自动化,并且爱上自动化!好了,下面开始步入正题。

准备工作

“工欲善其事必先利其器”,做自动化也是如此,所以先花一点时间来介绍要准备的工作。

(1)软件工具准备:JDK 和 Eclipse,搭建 Java 的开发环境,需要注意的是二者的版本必须统一,即 32 位的 JDK 必须对应 32 位的 Eclipse。

(2)框架软件准备:TestNG

安装方式有两种:

  • help-Eclipse Markplace 市场查找下载安装。
  • 在 TestNG 官网上下载对应版本的插件,help-Install new Software 安装已经下载好的插件。

当然所有的插件安装都是这两种方式。

(3)Foxfire(火狐浏览器,建议使用 30~32 版本,目前最新的版本兼容性不好且对插件的支持不够理想)。在火狐浏览器里要下载其插件,必须使用的有:

  • Firebug+firepath 用来辅助我们进行元素定位。
  • Selenium IDE 主要用来验证自动化脚本是不是与实际情况一致。

需要说明的是,Selenium IDE 本身就有用来做简单 UI 界面录制回放的功能。

(4)Google Chrome(谷歌浏览器),演示的时候可能只调用火狐浏览器,但是谷歌浏览器是当前 UI 自动化测试的首选,因为其稳定,插件更新快。

(5)必要的 jar 包

  • log4j-1.2.11.jar,用来支持日志功能的 jar。
  • selenium-server-standalone-2.43.1.jar,核心 jar 必须要有。

(6)浏览器必要的 driver

  • 谷歌的 chromedriver.exe。
  • IE 的 IEDriverServer64.exe。
  • Windows 10 自带的 Microsoft Edge 的 Microsoft WebDriver。

写到这里有可能会问,为什么需要这么多的 driver,其实如果只针对一套流程进行自动化操作,只需要操作一个浏览器即可,但是如果想用同一个流程验证不同浏览器的兼容性时,那么需要同时启动多个浏览器,所以提前准备好主流浏览器的 driver,对我们的工作来说是非常有必要的。

上面的工作全都完成,在 Eclipse 里创建一个纯净的自动化工作目录,将下载好的插件、驱动、jar 都配置好,此时 Eclipse 的工程目录如下图所示:

其中 files 是新建的目录,用来存储各种浏览器的驱动。lib 也是新建的目录,用来存储各种 jar 包。当然,这两个文件的名称都可以自行改变。好了准备工作到此结束,下面进行定位的讲解。

定位实战

UI 自动化的实质其实就是做下面两件事情:

  • 定位到 Web 界面的被测试元素;
  • 对定位到的元素进行录入、单击、双击、拖拽、上传文件、清空等等操作的过程。

请看下面的例子。

(1)打开百度网站的首页:

(2)在输入框输入 GitChat:

此场景运用自动化的思维解决就是:首先要打开一个浏览器 | 在导航栏处输入百度的网址 | 定位到输入框 | 键盘敲入 GitChat 的过程。操作火狐浏览器实现 Java 代码如下:

package com.test.baidu;import org.openqa.selenium.By;import org.openqa.selenium.WebDriver;import org.openqa.selenium.WebElement;import org.openqa.selenium.firefox.FirefoxDriver;public class Baidu { public static void main(String[] args) { //启动火狐浏览器 WebDriver driver = new FirefoxDriver(); //将导航栏导航到百度首页 driver.navigate().to("http://www.baidu.com"); //定位到输入框 WebElement element = driver.findElement(By.id("kw")); //输入 GitChat element.sendKeys("GitChat"); }}

这里重点先讲解里面的定位问题:

WebElement element = driver.findElement(By.id("kw"));

定位方式

常用的定位方式如下:

这些都是常用的定位方式,有 by.id、by.name、by.cssSelector、by.xpath 等等。其中除了 by.cssSelector、by.xpath 外,其他的 by 后面的 id、name、link Text 等指的是 HTML 标记语言中页签内的属性内容,如百度输入框的 HTML 源代码如下:

<span class="bg s_ipt_wr quickdelete-wrap ipthover"><span class="soutu-btn"/><input id="kw" class="s_ipt" autocomplete="off" maxlength="255" value="" name="wd"/><a id="quickdelete" class="quickdelete" href="javascript:;" title="清空" style="top: 0px; right: 0px; display: none;"/></span>

这段代码里的 class、id 就是属性。所以针对百度输入框我们使用的是其 id 的属性。

xpath 定位

首先要明白为什么使用 xpath 定位,它的好处有如下几个方面:

  • 方便维护
  • 定位准确
  • 推荐以后大家无论任何被测试对象都采用 xpath 定位的方式

其次需要了解 xpath 常用符号说明,常用的符号及含义如下所示:

  • /:表示绝对路径,绝对路径是指从跟目录开始
  • //:表示相对路径
  • .:表示当前层
  • ..:表示上一层
  • *:表示通配符
  • @:表示属性
  • []:属性的判断条件表达式

最后运用上面的符号结合 xapth 的相关语法进行定位演示。

演示场景

任找一个 HTML 网页进行定位实战,按照页面代码结构逐级定位得出的结果解释如下,希望通过下面的逐级定位内容能理解相对路径、HTML 的层级结构。

(1)/html/div:没有节点可以被选择,因为 / 代表绝对路径,本定位表示的是 HTML 下一级目录的元素,很明显 HTML 的下一级是 head 和 body,所以本写法无法定位到任何元素。

(2)/html//div:选中 HTML 标签中的所有 div 元素,// 相对路径。就完全等价于 //div 的写法。

(3)//div/div 表示所选择的 div 元素下又包含 div 元素的所有元素。此时完全等价于 //div/div/. 的写法。

(4)//div/div/..:表示 //div/div 定义到的上一层 div 上。

(5)//div/div/*:此时会将 div 下的子节点含有 div 的这层节点下的所有元素都匹配到。

(6)//div[@id="input"]:此时表示在 div 目录下选择一个 id=input 的子节点。

and 与 or 连接符在 xpath 中的使用

and 的使用:此种定位的应用场景为下图所示:

此种场景的 HTML 编码为:

<td class="widgetStyle"><div id="radio"><input class="Volvo" type="radio" name="identity"/><label>Volvo</label><br/><input class="Saab" type="radio" name="identity"/><label>Saab</label><br/><input class="Opel" type="radio" name="identity"/><label>Opel</label><br/><input class="Audi" type="radio" name="identity"/><label>Audi</label></div>

此时我们想定位到 Saab 怎么写呢?(当然也可以不使用 and 连接符进行书写)书写为://input[@class="Saab" and @name="identity"],当然若写成 //input[@class="Saab"] 肯定也不会有问题。

or 的使用:如果定位到 Saab 或者定位到 Opel,此时书写方式为://input[@class="Saab" or @class="Opel"]。

定位顺序(从1开始切记)

现在学习第二种方式,比如定位 Saab。可以这样写://input[@name='identity'][2],同理定位 Volvo,//input[@name='identity'][1](这就是一开始强调的,这种写法必须从 1 开始编号)。

  • 定位 Opel,写成://input[@name='identity'][3]
  • 定位 Audi,写成://input[@name='identity'][4]

常用函数

Xpath 定位还可以使用一些函数,常用的函数如下:

(1)contains():包含。若要匹配出 Saab 还可以这样写://input[@name="identity" and contains(@class,'S')]

(2)text():一个节点的文本值。举个例子,这里面篮字显示的英文结果,HTML 代码为:

<a target="_self" href="/s?rsv_idx=1&wd=111&usm=3&ie=utf-8&sl_lang=en&rsv_srlang=en&rsv_rq=en&rqlang=cn">英文结果</a>

可见这四个字没有任何属性值信息,所以定位此信息的时候需要使用 text() 函数。场景如下图所示:

此时定位英文结果即可使用://a[text()="英文结果"]

(3)last()函数,定位 Audi 写成 //input[@name='identity'][4],可以看到 Audi 这个元素本身就处于 input 最后一个了,此时可以使用 last() 函数进行匹配://input[@name="identity"][last()]。

(4)starts-with:以 starts-with 为开头写法实例://input[starts-with(@id,'user')]代表 input 下 id 以 user 为开头的元素。

(5)not():表示否定,一般情况下会与返回值为 true 或者 false 的函数组合起来使用。比如上面提到的 contains() 与 starts-with。

用实例来说:现在想要定位到不是 Audi 车除外的三种车元素,此时写法为://input[@name="identity" and not (contains(@class,'A'))]。

当然 not() 还有一种特殊用法就是直接 Not。//input[not(@class)] 表示匹配出 input 下所有不含 class 属性的元素。

总结:唯一需要注意的是所有函数的写法 function(@属性,'内容')。

Xpath 轴定位说明

(1)基本轴

轴可以在位置路径中快捷引用特定的节点(忽略属性和名称空间节点)。child 例子:

"child::*" 当前节点的子节点。 "child::childnodename" 当前节点名为childnodename的子节点。 "child::text()" 当前节点文本子节点。 "child::node()" 当前节点的子节点。 "child::*/child::nodename" 取当前节点的子节点的名为nodename的子节点。

(2)特殊轴

self当前节点descendant当前节点的后代(子节点或子节点的子节点…)parent当前节点的父节点ancestor当前节点的祖先节点(父节点和父节点的父节点…)preceding按文档顺序位于当前节点之前的非祖先节点attribute当前节点的属性namespace当前节点的名称空间preceding-sibling当前节点之前的所有兄弟节点following当前节点之后的所有节点following-sibling当前节点之后的所有兄弟节点descendant-or-self当前节点和后代节点ancestor-or-self当前节点和祖先节点

以上的两种轴类型,没什么好说的,先记住吧。具体怎么用请看下面实例。

第一个实例:继续定位上述中的 Volvo,使用 xpath 轴书写如下://div[@id="radio"]/descendant::input[1] 也可以定位到。

第二个实例:定义 Audi 上的所有节点,使用 xpath 轴写法如下://input[@name="identity" and @class="Audi"]/preceding-sibling::*

(3)需要注意的几个问题。

[] 后面需要跟 /,/ 后面在加上关键字。

轴关键字后面必须使用 ::,这个后面可以接节点名称,如 input、div 等。如果后面跟的是 *,代表全部。

轴后面接节点名称是节点前面的定位方式全部可以继续适用。

对于轴的使用建议是能不用就不用,条条大路通罗马,没必要非使用轴进行定位。

cssSelector 定位

了解即可,能用 xpath 就不用 cssSelector。原因很简单,HTML 的代码我们更熟悉。

CSS 常用符号说明

  • # 表示 id
  • . 表示class
  • :表示子元素,层级

值得注意的是:一个空格也表示子元素,但是所有的后代子元素,就相当于 xpath 中的相对路径。