2024-02-11

19 篇热帖

1. What it was like working for Gitlab (yorickpeterse.com)

在GitLab的工作经历总结

工作历程回顾 (2015-2021)

作者于2015年10月加入GitLab,成为第28号员工,至2021年12月离职。在公司从约30人增长至约2000人的过程中,其工作经历了几个关键阶段:

2015-2017:性能挑战与工具建设

  • 初始挑战:GitLab当时性能极差,几乎每周都有宕机,用户抱怨“GitLab很慢”。公司缺乏有效的性能监控基础设施。
  • 核心工作:作者的主要任务是提升性能。他首先构建了性能监控工具,后来该功能成为GitLab官方的“GitLab性能监控”。他还开发了“Sherlock”性能分析器。
  • 文化阻力:性能并非公司的首要优先事项,资源分配不足。公司存在“在Hacker News上匿名抱怨比通过内部渠道提建议更有效”的玩笑。
  • 团队组建:公司意识到问题的规模后,成立了专门的“性能”团队,作者开始向专业经理汇报。

2017-2018:关键贡献与重大危机

  • 重大成就:团队更名为“数据库”团队,预算增加。作者开发了数据库负载均衡器,这对GitLab的性能和生存至关重要。该负载均衡器能透明地将读写请求导向主库或从库,并处理“写入后粘性”的问题。
  • 严重事故:2018年1月31日,作者在解决一系列问题时意外删除了生产数据库。由于备份系统长期失效且无警报,情况危急。最终依靠他数小时前为其他工作复制到暂存环境的数据进行恢复,但损失了约6小时的数据,恢复过程耗时约24小时。
  • 技术分歧:团队基于数据分析(如读写比约10:1)认为分片是不必要的过度设计,但管理层多年间反复推动数据库分片。

2019-2021:流程改进与离职

  • 角色转变:作者转入新成立的“交付”团队,致力于改善混乱的发布流程。当时代码从提交到部署至GitLab.com平均需数天,最长达三周。
  • 关键项目:推动合并了GitLab社区版(CE)和企业版(EE)的代码仓库,以简化发布流程。经过努力,部署时间从最差三周缩短到约一天。
  • 公司文化变迁:公司聚会从注重员工的轻松活动转变为更商业化的“峰会”。管理层推动安装具有监控功能的笔记本电脑管理软件(如SentinelOne),引发了员工对隐私的担忧。
  • 个人冲突与离职:作者因工作节奏变化、个人生活问题及与新经理的冲突,被列入“绩效提升计划”。他对此过程感到不满,认为其不够公平。最终,在GitLab上市后,作者出于税务考虑于2021年12月离职,专注于个人项目Inko。

主要经验与反思

基于在GitLab的经历,作者总结了以下核心教训:

  1. 可扩展性应融入公司文化:GitLab的主要收入来自自托管企业版客户,而非SaaS版的GitLab.com,这导致对SaaS版面临的扩展性问题投入不足。
  2. 团队应更数据驱动、开发者驱动:决策过多依赖产品经理,而非直接由了解技术的团队负责人与用户互动后做出。应减少层级,赋予团队更多自主权。
  3. “最小可行产品”离不开数据支撑:缺乏对用户需求的深刻理解,导致构建了许多无人问津或功能不全的功能(如无服务器平台、有问题的Kubernetes支持)。
  4. SaaS与自托管模式难以兼顾:两者在部署速度、架构需求上存在根本冲突。专注于一种模式能提供更好的体验。
  5. 人多未必力量大:增加开发人员数量不一定提高生产力。大多数公司可能只需20-50名开发者,超过100人则应反思产品范围是否过大。
  6. 对Ruby on Rails的复杂看法:Rails的便利性(如ActiveRecord)也容易引入性能问题(如N+1查询)。Ruby的元编程特性在大规模项目中增加了难度。尽管如此,尚无更优的替代框架能完全匹配Rails的生产力。
  7. 部署速度至关重要:快速部署(理想在1小时内)能提高事件响应效率并提升团队士气。GitLab花了约四年才接近这一目标。
  8. 基于地理位置的薪资具有歧视性:对于全远程公司,为相同职位和职责的员工因所在地不同而支付差异巨大的薪水是不公平的。作者支持像0xide公司那样,基于职位而非地点支付统一薪资。

结论

作者在GitLab的经历充满成就感与挑战。他为自己参与构建的关键系统(如性能监控、数据库负载均衡器)感到自豪,但也对公司后期的文化走向感到遗憾。尽管存在缺陷,他仍认为GitLab相比许多其他公司表现更好,并会推荐他人在此工作。

3. The surreal life of a professional bridesmaid (thehustle.co)

珍·格兰茨在曼哈顿的公寓里,在一次朋友要求她当伴娘的经历后,决定在Craigslist上发布一则“职业伴娘”的广告。这个起初带点玩笑性质的举动,意外地收到了大量新娘的咨询,从而开启了她作为全美最知名职业伴娘的十年事业。

她的服务从2500美元起价,提供从短信情感支持到婚礼当天全程协助的各种套餐。每次工作前,她都需要与新娘共同编造一个合理的身份(如高中同学),并牢记相关细节以应付宾客。这带来了巨大压力,工作中常需处理新娘的恐慌、突发状况(如新郎被临时抛弃)甚至清理宠物粪便等极端情况。她坦言每次走进未知的婚礼现场都充满焦虑,从未感到轻松。

这份工作曾让她精疲力竭,甚至在机场卫生间崩溃哭泣。被科技公司裁员后,她全身心投入生意,业务规模扩大到年收入超十万美元,并发展了其他副线服务,包括撰写婚礼誓词(375美元)、伴娘致辞(AI辅助版35美元),以及推出书籍和卡牌游戏等产品。

格兰茨认为,职业伴娘市场的存在反映了当代婚礼期望过高(部分受社交媒体影响)以及人们普遍缺乏支持网络的孤独现状。她强调自己真正售卖的是“支持系统”——一个能随时回应、在婚礼各种危机中提供稳定情感和事务性帮助的角色。尽管个人并不喜欢婚礼,但她珍视在人生重要时刻支持他人的意义。

4. OpenFPGA (www.analogue.co)

OpenFPGA:面向视频游戏保存的FPGA硬件与生态系统

OpenFPGA是由Analogue公司推出的首个专为视频游戏硬件保存而设计的、基于FPGA(现场可编程门阵列)技术的硬件及生态系统。其核心目标是通过FPGA这一“硬件保存的巅峰技术”,为视频游戏的历史提供一种不折不扣的保存、研究、学术应用和永久游玩的方式,并倡导去中心化的发展模式。

历史起点:保存第一个视频游戏 OpenFPGA项目的首个演示核心(Core)聚焦于视频游戏的起源——1962年诞生于MIT的PDP-1计算机上的《Spacewar!》。该游戏被公认为世界上第一个数字视频游戏,奠定了视频游戏作为受科幻启发、推动技术极限的新艺术形式的基础。通过第三方开发者基于公开源代码在openFPGA上重建了PDP-1核心,使得《Spacewar!》可以在Analogue Pocket掌机上得以保存和体验。

技术规格与硬件基础 OpenFPGA基于Analogue Pocket设备构建,其核心硬件配置包括:

  • 主FPGA:Intel/Altera Cyclone V,具备49K逻辑单元和3.4Mbit块RAM。
  • 辅助FPGA:Intel/Altera Cyclone 10,具备15K逻辑单元。
  • 存储系统:包括2x独立可寻址的16MB Cellular RAM(128Mbit x 16)、32MB低延迟同步DRAM(32Mbit x 16)以及256KB异步SRAM(128Kbit x 16)。这为模拟各种复杂硬件提供了充足的资源。

开发者支持与生态 Analogue将openFPGA向第三方开发者开放,旨在鼓励社区共同参与游戏硬件的保存工作。

  • 开发平台:每一台Analogue Pocket都可作为开发平台。
  • 资源与工具:开发者可访问免费的在线资源学习如何为openFPGA进行开发。
  • 开发者套件:提供了限量版的Analogue Developer Kits,供高级开发者使用。
  • 扩展能力:开发者可利用Analogue Pocket的I/O接口,通过卡带适配器或其他接口连接原始或定制硬件,以支持传统媒介。
  • 法律立场:Analogue明确表示不支持或认可任何受版权或其他知识产权保护材料的未授权使用或分发,且openFPGA所演示的《Spacewar!》和PDP-1已进入公有领域。

愿景 OpenFPGA的推出标志着Analogue在重新诠释历史游戏硬件的旅程中进入了新阶段。它将硬件保存的钥匙交给了开发者与用户社区,致力于通过合作开发、游玩和探索,共同保存视频游戏这一历史媒介。

5. Keycloak SSO with Docker Compose and Nginx (du.nkel.dev)

Keycloak SSO 使用 Docker Compose 与 Nginx 的部署指南

文章介绍如何在 Linux 服务器上用 Docker Rootless 部署 Keycloak 以实现单点登录(SSO),并用 nginx 反向代理统一管理流量与 SSL 证书。适用于需要安全、高隔离性用户认证的服务,兼容主流 SSO 协议如 OIDC、OAuth 2.0、SAML。以下为部署主要流程和要点:

架构概念

整体采用 nginx 作为前置代理,监听 80/443 端口,将请求按域名/端口转发至各自运行于 Rootless Docker Namespace 的后端服务,如 Mastodon、Keycloak、Nextcloud。这样实现一种经济高效、兼顾隔离和资源共享的多服务架构。

前置准备

  1. 一台 Linux (如 Ubuntu、Debian) 虚拟机,具备 SSH 远程管理权限。
  2. 一枚绑定主机公网 IP 的域名或子域名(如 your.tld.com)。
  3. 参考 Mastodon 部署文档,创建无密码非 root 用户 keycloak,目录为 /srv/keycloak,并设定 /etc/subuid、/etc/subgid,使其支持 rootless Docker(支持 Postgres 容器嵌套非 root)。
  4. 通过 dockerd-rootless-setuptool.sh 安装 rootless Docker,并为 keycloak 用户配置开机自启。

Keycloak 基本部署流程

  1. 使用 machinectl shell keycloak@ 登录新建的 keycloak 用户(不能用 sudo 切换,否则 XDG_RUNTIME_DIR 不生效)。
  2. 创建持久数据目录:mkdir -p ~/data/postgres16 ~/docker && cd ~/docker
  3. 准备 docker-compose.yml,示例如下:
services:
  postgres_db:
    image: postgres:16
    restart: always
    volumes:
      - /srv/keycloak/data/postgres16:/var/lib/postgresql/data
    environment:
      POSTGRES_DB: keycloak
      POSTGRES_USER: ${POSTGRES_USER:-keycloak}
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-eX4mP13p455w0Rd}

  keycloak:
    image: quay.io/keycloak/keycloak:25.0.1
    restart: on-failure:5
    environment:
      KC_LOG_LEVEL: debug
      KC_DB: postgres
      KC_DB_URL: 'jdbc:postgresql://postgres_db/keycloak'
      KC_DB_USERNAME: ${POSTGRES_USER:-keycloak}
      KC_DB_PASSWORD: ${POSTGRES_PASSWORD:-eX4mP13p455w0Rd}
      KC_DB_SCHEMA: public
      KC_HOSTNAME: ${KC_HOSTNAME:-your.tld.com}
      KC_HTTP_ENABLED: true
      HTTP_ADDRESS_FORWARDING: true
      KEYCLOAK_ADMIN: admin
      KEYCLOAK_ADMIN_PASSWORD: ${KEYCLOAK_ADMIN_PASSWORD:-eX4mP13p455w0Rd}
    ports:
      - '127.0.0.1:8080:8080'
    depends_on:
      - postgres_db
  1. 新建 .env 文件保存敏感变量(DB、管理员密码、域名等)。
  2. 启动和查看日志:docker compose up -d && docker compose logs --follow
  3. 本地测试:通过 ssh 隧道将本地 8080 端口转发到远程,浏览器访问 127.0.0.1:8080 检查首页。
  4. 可选:.git 管理 docker 配置,但 .env 需写入 .gitignore。

Nginx 配置

  1. 跟据实际域名 your.tld.com,新建 /etc/nginx/sites-available/your.tld.com.conf,软链到 sites-enabled。
  2. 配置 80 端口自动跳转到 443,443 使用高安全性 TLS 配置(建议用 Mozilla SSL configurator 生成)。
  3. 反向代理 / 路径流量至 http://127.0.0.1:8080,并设置 host、X-Forwarded-* 等 headers。
  4. 配置 SSL 证书,可用 Certbot 自动签发管理。
  5. 检查 nginx 配置(nginx -t)并 reload,确保服务可用。

Keycloak 镜像自定义与优化

  • 若需自定义扩展或使用主题,可用多阶段 Dockerfile 构建,在 build 阶段运行 /opt/keycloak/bin/kc.sh build,然后将构建产物复制到最终镜像,并配置 ENTRYPOINT。
  • docker-compose.yml 可去掉 image 行,替换为 build: . 及 command: start --optimized。
  • 持久化数据卷管理 /srv/keycloak/data/postgres16,通过删除该目录可完全重置数据库。

生产环境优化

  • MulticastSocket 缓冲区:编辑宿主机 /etc/sysctl.conf 增加 net.core.rmem_max=26214400 和 net.core.wmem_max=1048576 后执行 sysctl -p。
  • 启用 Quarkus XA 事务恢复:keycloak 容器增加挂载 /srv/keycloak/data/keycloak/ObjectStore,并设置环境变量 QUARKUS_TRANSACTION_MANAGER_ENABLE_RECOVERY=true,目录需提前创建并赋予容器(UID 1000)权限。

调试与后续

  • 日志:docker compose logs --follow,nginx 日志 tail -f 访问与错误日志。
  • 数据库可进入容器内,以 psql 查询调试。
  • 配置主题可结合 keycloakify 等工具进一步自定义用户界面。

本指南已更新至 Keycloak 25.0.1,适合现代生产环境安全、可维护的认证需求。

6. Undisclosed tinkering in Excel behind economics paper (retractionwatch.com)

文章摘要:经济学论文中未公开的Excel数据处理争议

一篇关于27个国家绿色创新和专利的经济学论文因数据处理问题引发质疑。论文发表在《Journal of Cleaner Production》上,仅被引用一次,但其方法受到专家批评。

核心问题

  • 论文声称使用“平衡面板数据”(即无缺失值),但实际数据存在大量缺失。
  • 第一作者Almas Heshmati(瑞典延雪平大学经济学教授)被披露使用Excel自动填充功能填补缺失值:选择缺失值前后几个观察值,拖动填充单元格;若出现负值,则替换为最后一个正值。
  • 更严重的是,在缺乏邻近数据时,Heshmati从电子表格中的其他国家复制数据,例如新西兰数据取自荷兰,美国数据取自英国。这导致超过十分之一的空白单元格被填补,包括结果变量,但论文未提及这些是填补值。

专家反应

  • 剑桥大学计量经济学教授Andrew Harvey认为,大量填补数据会使统计检验无效;复制数据“更糟糕”。
  • 哥本哈根大学荣誉退休教授Søren Johansen称此行为为“作弊”,因未在论文中说明。
  • 其他专家(如Gary Smith、Marco Hafner)指出,自动填充和复制数据缺乏合理依据,若有必要,应通过敏感性分析报告假设影响。

作者回应

  • Heshmati在邮件中承认未在论文数据部分解释填补程序是“无意疏忽”,并表示对填补负责。
  • 他辩护称,若不使用填补,数据几乎无用;填补后数据才变得“平衡”。他还提到合著者Mike Tsionas(已故)知晓此方法。
  • 在与质疑的博士生沟通时,Heshmati分享了数据并召开Zoom会议解释,但未进行敏感性分析。

其他细节

  • 合著者Mike Tsionas(兰卡斯特大学经济学教授)已去世,被赞为计量经济学领域的杰出学者。
  • 期刊编辑和出版商(Elsevier)未回应置评请求。

总结: 该事件突出了经济学研究中数据透明度和方法合规性的重要性。未经披露的数据填补可能影响研究结果的可靠性,并引发学术诚信问题。专家强调,任何填补方法都应在论文中明确说明,并评估其潜在影响。

8. Aho – a Git implementation in Awk (github.com)

Aho是一个使用AWK语言实现的Git版本控制系统。

项目目的 该项目是一个玩具项目,旨在探索Git的内部工作原理以及GNU AWK的较新特性。其主要目的是用于娱乐和教育,并非用于实际生产。

技术要求与依赖

  • 需要 gawk(GNU AWK)5.0 或更高版本。
  • 使用 pigz 进行zlib压缩。
  • 其余功能依赖于GNU coreutils。因此,该实现主要适用于大多数Linux系统,而在BSD或macOS上可能无法直接运行。

基本功能与示例 项目实现了一系列核心的Git命令,通过示例展示了其用法:

  1. 初始化仓库:使用 aho init 在当前目录创建.aho目录作为Git仓库。
  2. 暂存文件:使用 aho add -v . 将文件添加到暂存区。示例中展示了添加项目文件和一个新建文件testfile
  3. 仓库结构.aho目录的结构模拟了标准Git仓库,包含objects(存储对象)、refs(存储引用)、index(暂存区)等关键部分。
  4. 兼容性验证:通过设置GIT_DIR=.aho环境变量,可以使用原生的git ls-files --stage命令查看由Aho生成的暂存区内容,结果与Git格式兼容。

贡献与开发计划

  • 欢迎任何有助于改进作者对AWK或Git知识的理解的输入。
  • 已实现/计划实现的功能initadd/rmstatuscommitresetbranchswitchconfig(只读)、ls-filescat-file
  • 不计划实现的功能:不计划添加任何网络功能(如clonepush),尽管使用AWK理论上可以实现。
9. RSS is still pretty great (www.pcloadletter.dev)

文章总结:RSS 依然强大

核心观点

作者认为,在互联网信息泛滥、信噪比低下的环境中,RSS(Really Simple Syndication)是消费高质量、低噪音内容的最佳方式。

RSS 的工作原理

  • 定义:RSS 是一种基于规范(如 RSS 或 Atom)的内容聚合格式。任何发布内容的网站都可以生成一个RSS源文件,包含足够的信息以供其他地方展示。
  • 规范稳定:RSS 规范非常稳定(RSS 最后更新于2009年,Atom更新于2005年)。
  • 消费方式:用户通常使用RSS聚合器(如 Feedly, NewsBlur)来订阅和阅读来自多个网站的RSS源。聚合器会根据更新频率轮询并缓存内容。
  • 发布简易:对于网站发布者来说,设置RSS源通常很简单,许多建站平台(如WordPress)或静态网站生成器(如11ty)都有相关插件。

RSS 模式的优势(高质量内容消费)

  1. 自主选择:用户完全控制订阅哪些内容源,不受推荐算法的影响。可以随时取消订阅。
  2. 偏向深度内容:RSS源的内容通常来自个人或组织的博客,作者在发布前进行了充分的思考和准备,质量较高。
  3. 减少低价值内容:大大减少了仅为广告而生的浅薄内容,因为许多广告在RSS聚合器中无法渲染。
  4. 避免社交噪音:没有网络骂战、喷子或为了“点赞”而表演的行为,提供纯粹的阅读体验。
  5. 按需阅读:内容在聚合器中等待用户有空时阅读,而非像邮件那样打扰用户。

对RSS批评的回应

  • “没有分析数据”:作者认为并非所有事物都需要分析,且分析常与破坏内容的广告问题相关。
  • “不社交/无互动”:作者类比书籍,认为专注阅读而不互动也是有价值的。
  • “非实时更新”:作者认为这有助于内容保持深思熟虑的特质,而非追求即时性。
  • “带来流量负担”:作者认为RSS轮询带来的流量与网站流量相比通常很小,不是大问题。
  • “RSS已死/过时”:作者承认其普及度下降,但认为它很好地满足了一个特定的利基需求,无需追求广泛流行。

RSS 的合理批评

  1. 内容渲染限制:聚合器可能无法完美显示复杂视觉内容(如动画、交互效果)。
  2. 缺乏发现机制:RSS本身没有内置的内容发现功能,依赖聚合器的附加功能。
  3. 控制力有限:发布者无法完全控制聚合器如何解释和展示源文件(如处理文章路径变更)。
  4. 技术门槛:对于非技术用户来说,理解XML格式的源文件和订阅过程不够直观。

结论

只要将其用于设计目的——消费内容,而非用于社交或内容发现,RSS 仍是一项非常可靠的技术。作者鼓励曾因社交媒体而放弃RSS的人重新考虑将其纳入信息获取方式。

10. RLHF a LLM in <50 lines of Python (datadreamer.dev)

概述

本文介绍了如何使用DataDreamer库,通过不到50行Python代码,高效地对大型语言模型(LLM)进行基于人类反馈的强化学习(RLHF)对齐。重点展示了一种更稳定、高效的对齐方法DPO(直接偏好优化)结合LoRA(低秩适应)技术,以仅训练部分权重的方式优化模型。

技术方法

  • 核心目标:使指令微调后的LLM生成更符合人类偏好的回答。
  • 对齐方法:采用DPO,它比传统RLHF更稳定高效。DPO无需训练独立的奖励模型,直接利用人类偏好数据集进行模型对齐。
  • 参数效率:使用LoRA技术,仅微调模型的一小部分参数,显著减少计算和存储成本。
  • 工具框架:DataDreamer库简化了整个数据加载、模型训练和验证流程。

代码实现步骤

  1. 初始化环境:使用DataDreamer创建输出目录。
  2. 加载数据集:从Hugging Face Hub获取DPO数据集(Intel/orca_dpo_pairs),为演示目的仅保留1000个样本。
  3. 数据划分:按90%训练集、10%验证集的比例分割数据。
  4. 配置训练器
    • 模型:TinyLlama/TinyLlama-1.1B-Chat-v1.0
    • 使用LoRA配置(LoraConfig)进行高效微调
    • 设备:使用两张CUDA GPU(cuda:0, cuda:1
    • 数据类型:bfloat16
  5. 开始训练
    • 输入数据包括提示、优选回答和拒绝回答
    • 训练3个批次,批量大小为1,梯度累积步数为32(以模拟更大批量)

关键参数与配置

  • 数据集Intel/orca_dpo_pairs,包含问题、优选回答和拒绝回答字段。
  • 训练超参数:3个epoch,有效批量大小为32(通过梯度累积实现)。
  • 硬件与精度:双GPU训练,使用bfloat16混合精度以优化性能。

总结

该实现展示了如何通过DataDreamer库和DPO方法,在有限代码内完成LLM的人类偏好对齐。结合LoRA技术,进一步提升了训练效率,使得在消费级硬件上调整较大模型成为可能。整个过程突出了数据准备、模型配置和高效训练的关键步骤。

11. Javalin – a simple web framework for Java and Kotlin (javalin.io)

Javalin - 面向 Java 和 Kotlin 的简易 Web 框架

Javalin 是一个轻量级、易用的 Web 框架,专为 Java 和 Kotlin 语言设计。其核心设计目标是简单性与互操作性,同时保持高性能和灵活性。

核心特点

1. 简单

  • 学习成本低:与其他 Java/Kotlin Web 框架相比,Javalin 需要掌握的概念极少。
  • 无强制继承或接口:开发者无需继承特定类或频繁实现接口。
  • 代码量小:Javalin 仅由数千行代码构成,基于 Jetty 构建,便于理解源码。

2. 可互操作

  • 统一构建方式:许多框架为 Java 和 Kotlin 提供不同版本,而 Javalin 从设计上就注重互操作性,两种语言下的应用构建方式相同。

3. 灵活

  • 阻塞与异步模式
    • 默认设计为简单的阻塞编程模型,易于理解和推理。
    • 若返回结果为 Future,Javalin 会自动切换到异步模式。

4. 支持 OpenAPI

  • 内置 OpenAPI 支持:与许多轻量框架不同,Javalin 原生支持 OpenAPI 规范。
  • 集成工具:包含 Swagger UI 和 ReDoc 等文档工具。

5. 基于 Jetty

  • 底层引擎:Javalin 运行在 Jetty 之上——JVM 平台上最常用且稳定的 Web 服务器之一。
  • 完全可配置:开发者可全面配置 Jetty 服务器,包括 SSL、HTTP/3 及其他所有 Jetty 提供的功能。

总结

Javalin 以“简单”为核心,通过最小化概念和代码量降低学习门槛,同时借助 Jetty 确保性能与稳定性。其语言互操作性和灵活的异步支持使其适用于 Java 和 Kotlin 开发者,而内置的 OpenAPI 支持则简化了 API 文档化流程。整体上,Javalin 在保持轻量的同时提供了丰富的可配置选项。

12. Show HN: A platform for remote piano lessons based on the Web MIDI API (keyboardconnect.com)

Keyboard Connect 是一个专为钢琴教师设计的远程教学视频会议平台。

该平台的核心功能是允许教师和学生共享音频、视频、乐谱以及MIDI数据,从而打造一个专注且互动性强的远程钢琴课程体验。

其技术基础是Web MIDI API,使得MIDI数据的实时传输和交互成为可能,这是该平台的关键特色。

13. Demoscene and video game music streaming radio links (mw.rat.bz)

Demoscene与视频游戏音乐流媒体电台链接汇总

本文档由Michael Walden维护,最初创建于约2011年,最近更新于2024年2月29日。它汇集了作者所知的、专门播放Demoscene(一种涉及图形、音乐和编程的计算机艺术场景)和视频游戏音乐的在线流媒体电台链接。

核心内容与结构

文章主体是一个持续更新的电台列表,目前包含约69个电台。每个电台条目通常包括:

  • 电台主页链接
  • 播放列表链接(如 .m3u, .pls 文件),点击后可在默认播放器中启动。
  • 直接流媒体链接(如 .mp3, .ogg, .aac, .opus 格式),可在浏览器中播放。
  • 为同一电台提供不同格式、比特率或频道的多种流媒体选项,以满足不同网络条件和质量需求。
  • 部分条目标注了流媒体当前状态(如“DOWN”、“WORKS!”、“GONE”)。

列表并非按特定顺序排列,大致反映了作者发现电台的时间顺序。

电台类型与特点

列表中的电台专注于以下几类音乐:

  1. Demoscene音乐:源自计算机演示场景的原创电子音乐。
  2. 复古计算机音乐:主要来自 Commodore 64 (C64 SID芯片)AmigaAtariZX SpectrumAmstrad CPC 等8位和16位计算机。
  3. 电子游戏音乐:包括经典游戏原声(OST)、混音(Remix)、以及基于游戏音乐的创作。
  4. Chiptune / Tracker音乐:使用老式声音芯片或跟踪器软件制作的音乐。

电台广播平台主要使用 SHOUTcastIcecast

其他资源

除了电台链接,文章还提供了大量非流媒体的相关资源链接:

  • 维基百科页面:关于Demoscene、Chiptune、模块文件(Module file)、Keygen的介绍。
  • 音乐存档与数据库网站
    • High Voltage SID Collection (HVSC):最大的C64 SID音乐集合。
    • Mod ArchiveModland:模块音乐(.mod, .xm, .it等)的大型存档。
    • Amiga Music Preservation (AMP):Amiga音乐存档。
    • VGMRips:复古游戏音乐提取存档。
    • Stone Oakvalley's Authentic SID Collection (SOASC=)Amiga Music Collection (SOAMC=):经授权的音乐合集。
  • 社区与信息站点:如 ChipMusic.org、Pouët.net(Demoscene资源)、ExoticA(维基)。
  • 混音与再创作网站:如 Remix.Kwed.org(C64音乐混音)、AmigaRemix(Amiga游戏/演示音乐混音)。

发现新电台的方法

作者分享了用于发现新电台的索引网站搜索关键词

  • 索引网站:StreamFinder.com、TuneIn、Internet-Radio.com、AllRadio.Net、RCAST.NET、Zeno.FM、radio-browser.info等。
  • SHOUTcast & Icecast 关键词搜索:文章列出了大量实用的搜索关键词,如 Demoscene, Chiptune, SID, MOD, Tracker, Commodore, Amiga, C64, Video Game, VGM, 8bit, Keygen 等,帮助用户在这些目录中主动发现更多电台。

维护与更新

  • 作者定期验证链接有效性,但电台流媒体可能经常暂时中断,建议无法播放时改天再试。
  • 最近一次大规模更新在2024年2月29日,添加了多个新电台和资源链接(详见文末的“Changelog”部分)。
  • 作者邀请读者通过其联系方式提供更正或补充
  • 文档底部提供了Hacker News 上相关讨论的链接。
14. How to Study (2023) (cse.buffalo.edu)

《学习指南》核心要点总结

本文是由布法罗大学William J. Rapaport教授撰写的一份综合性学习方法指南,旨在为各学科学生提供高效学习的实用建议。

核心观点

  1. 学习风格与个人方法:虽然存在关于“学习风格”的理论,但缺乏证据支持其有效性。真正重要的是个人的“学习方式”。如果当前成绩不理想,就需要调整学习方法。
  2. 学习不等于做作业:学习是一个更广泛的概念,包含但不限于完成作业。

主要方法与建议

1. 时间管理

  • 投入充足时间:将学业视为全职工作,每周投入约40小时。按课程学分计算,课外学习时间应约为课内时间的1.5-2倍。
  • 制定目标与计划:设定成绩目标,并据此调整课外活动。将学习时间分散安排,避免最后时刻的“填鸭式”学习。

2. 课堂笔记与复习

  • 记详细笔记:在课堂上尽可能完整地记录,使用速记符号。不必追求工整,但要保证自己能看懂。
  • 课后重写整理:强烈建议课后尽快将课堂笔记重新工整地抄写到专用笔记本上。这个过程本身就是最有效的复习,并能帮助发现知识漏洞、理清逻辑。
  • 避免使用电脑记笔记:手写有助于加深理解和记忆,并能避免网络等干扰。

3. 阅读方法

  • 主动慢读:阅读时要主动思考,与文本“对话”。作者推荐一个算法:逐句阅读,不理解时回读或求助,确保理解后再继续。
  • 做标记与笔记:建议在书页边缘用竖线标记重点,并在专门的笔记本中摘录原文、写下详细评论和索引。
  • 文学作品例外:对于文学作品,可以先快速通读以获取整体感受,再进行慢速精读。

4. 考试准备

  • 避免被动重读:被动重读课本或笔记效果甚微,容易产生“能力错觉”。
  • 采用主动复习策略
    • 制作复习大纲:基于整理好的笔记,将核心内容浓缩到1-2张纸上。
    • 进行自我测试:制作“闪卡”(问题/答案),通过反复书写答案来测试自己,效果远胜于单纯背诵。
    • 练习真题:写范文、做练习题,并与同学讨论或向老师请教。
  • 合理安排复习时间:提前至少一周开始复习,每天分配时间,并在考前进行重点强化。

5. 研究与论文写作

  • 谨慎选题:避免过于宽泛或过于狭窄的主题。
  • 系统研究与记笔记:慢读资料,并像阅读教科书一样做详细笔记,务必记录来源和页码。
  • 构建提纲:根据笔记整理出逻辑清晰的论文结构。
  • 先写后改:根据提纲和笔记快速撰写初稿,之后再进行慢读和修订,并可寻求反馈。
  • 管理时间,避免拖延

结论

作者承认遵循所有建议需要付出大量努力,并鼓励学生尝试并调整这些方法以适应个人情况。但强调,要想真正掌握知识并取得好成绩,没有捷径,这些努力是必需的。文中还列举了多名成功运用这些方法的学生和教育工作者的反馈作为佐证。

15. OpenTTD (www.openttd.org)

OpenTTD 游戏概述

OpenTTD 是一款基于 Chris Sawyer 创作的经典游戏《Transport Tycoon Deluxe》的开源模拟游戏。它旨在尽可能还原原版游戏体验,同时引入大量新功能。游戏采用 GNU General Public License version 2.0 授权。

核心增强特性

相较于原版,OpenTTD 实现了以下重大改进:

  • 地图与多人游戏:地图尺寸最大可扩大64倍;支持最多255名玩家、15家公司的稳定多人模式,并支持旁观者模式。
  • 服务器与网络:提供专用服务器模式和游戏内管理控制台;客户端与服务器通信全面支持 IPv6 和 IPv4
  • 内容与资源:可在游戏内下载 AI、NewGRF(图形和行为修改包)、场景和高度图。
  • 游戏机制:改进了寻路算法;增加了自动铺设轨道/公路工具、改进的地形编辑工具;支持运河、升船机和渡槽;车站更大且可连接;支持巨无霸和多节火车;可配置车辆加速模型;新增车辆克隆、自动替换与更新功能;支持在斜坡和海岸上建造;支持高级/条件订单以及订单共享与复制。
  • 建筑与交通:更长更高的桥梁及多种新设计,桥下轨道/公路可灵活布置;重新设计的机场系统(包含国际机场、大都市机场等更多类型);支持进路信号机、信号旗和路径信号;支持驱动式公交车站(适用于铰接车辆和电车);一个地块可种植多棵树。
  • 游戏体验:可贿赂城镇当局;提供大量配置选项以自定义游戏体验;使用 zlib 压缩存档以缩小文件大小且不中断游戏;支持超过50种语言的国际化翻译,以及18种语言的动态城镇名生成(NewGRF可支持更多语言);游戏资源(图形、音效、音乐)可自由分发;支持用户编写自定义AI的框架。

易用性改进

为提升用户体验,OpenTTD 优化了诸多操作:

  • 提供轨道类型转换工具。
  • 几乎所有工具(拆除、道路/铁轨建造与移除、车站、场景编辑器等)都支持拖放操作。
  • 大部分列表(载具、车站、城镇、产业等)支持按多种条件排序。
  • 支持鼠标滚轮(滚动菜单、缩放视图)。
  • 鼠标靠近屏幕边缘时自动滚动。
  • 可将整列火车拖到拆除图标处一次性出售。
  • 按住 Shift 键可显示操作成本预估。
  • 拥有高级选项配置窗口,可在游戏内直接修改设置。

图形与界面特性

  • 支持保存为 BMP、PNG 或 PCX 格式的截图。
  • 提供更多货币种类(包括2002年引入的欧元)。
  • 支持多个视口,可同时观察游戏世界的不同区域。
  • 可选择全屏模式的分辨率和刷新率。
  • 特定日期后出现彩色报纸。
  • 车辆利润使用颜色编码标识。
  • 可通过快进按钮或 TAB 键加速游戏。
  • 窗口支持吸附和置顶,能自动与其他窗口对齐。
  • 提供更多快捷键,减少鼠标点击。
  • 支持32位图形。
  • 支持从右到左书写的语言。
  • 支持不同大小的字体,并能根据字体和翻译自动缩放用户界面。

注: 游戏功能繁多,此处无法详尽列举。玩家可亲自体验,或查阅 Wiki 获取更全面的功能列表与说明。

16. Show HN: Miracode, a Minecraft programming font that is readable (github.com)

Miracode 编程字体介绍

Miracode 是一款基于 Monocraft 的编程字体,旨在提供更好的可读性,同时保留 Minecraft 界面字体的风格。

主要特点

  • 改进可读性:在 Monocraft 基础上重新设计了 1500+ 个字形,优化了细字符(如 "i" 和 "l")的显示,使其更适合等宽字体环境。
  • 独特的棱角风格:通过特殊算法将字符像素转换为线条和曲线,赋予字符独特的棱角外观。
  • 编程连字:包含箭头、比较运算符等编程连字,提升了代码视觉区分度;还增加了 Monocraft 中没有的连字(如 "TODO:" 和 "NOTE:")。

安装方法

  • Windows:下载最新版 Miracode.ttf 文件,右键点击选择“安装”。
  • Mac:下载 .ttf 文件,双击后选择“安装字体”。
  • Linux:将文件移至 ~/.local/share/fonts 目录,运行终端命令 fc-cache -fv 或重启登录。

使用方式

安装后,在支持自定义字体的应用中选择 "Miracode"(注意空格)即可。可能需要重启应用或计算机才能生效。

常见问题

  • 可用连字:文中展示了部分连字示例。
  • 字符生成方式:使用 FontForge 的 Python 扩展,从配置文件生成字形,并通过组合附加符号创建完整字符。
  • 贡献方式:可通过提交 issue 或 pull request 建议改进,但作者可能不保证接受所有更改。
17. Becoming a dungeon master for an interview (www.propelauth.com)

摘要

传统面试常与岗位实际工作脱节,例如软件工程师的算法面试虽有趣,却与多数工作相关性有限。为设计更贴近支持工程师真实工作场景的面试,团队开发了一种模拟测试格式。

面试设计

  • 模拟环境:采用一个简化版知名产品的伪造产品,提供其文档和一组基于真实客户问题的待处理邮件/工单队列。
  • 核心目标:要求候选人像实际工作中一样,优先处理并解决队列中的问题。
  • 评估维度:此过程能提供多方面信号,包括候选人的优先级判断能力、解析模糊或误解性问题的能力等。

存在的问题

  • 单一的工单解决过程无法模拟真实工作中必需的多方沟通(如向客户追问、挖掘日志、获取更多信息),容易导致盲目猜测。

解决方案:引入“地下城主(DM)”角色

  • 为每个工单预先准备额外资料(如客户在特定提示下会提供的代码片段、工程师对产品的回答、或问题的根本原因)。
  • 候选人提出下一步操作,面试官根据资料动态回应,模拟真实的互动过程。
  • 此方式借鉴了桌面角色扮演游戏《龙与地下城》中地下城主的准备思路:预判多种可能性,以应对候选人不确定的探索路径。由于面试场景相对简单,准备工作比构建整个幻想世界容易得多。

实践示例

  • 候选人通过逐步提问(如澄清问题细节、建议进行环境检查),引导模拟的客户自行发现并解决了问题(例如云函数未配置互联网访问)。面试并非期待候选人直接指出专业术语,而是观察其能否通过合理提问引导出正确方向。

流程效果与挑战

  • 效果:整个练习约45分钟,提供了丰富的洞察,且多位候选人可通过不同路径达到相同解决方案。候选人反馈该流程比传统面试更有趣
  • 挑战
    1. 有时候选人不清楚可操作的边界,需面试官切换到简单工单进行引导演示。
    2. 面试官的培训成本较高,需要通过观察和实践来标准化问题与评估。

总结

该方法需要前期投入和创意,但通过高度模拟日常工作,能获得比脱离现实的面试更准确的评估信号,同时提升了候选人的面试体验。

18. Show HN: Multi-monitor KVM using just a USB switch (github.com)

Simple KVM:基于USB切换器的低成本多显示器控制方案

Simple KVM是一个允许使用单一键盘、鼠标和显示器控制多台计算机的程序,旨在提供比传统昂贵KVM切换器更经济的解决方案。

核心功能与原理

  • 工作原理:程序监测USB设备的连接/断开或快捷键输入,随后通过DDC/CI协议向支持的显示器发送指令以切换输入源。
  • 多显示器支持:明确支持多显示器配置。
  • 当前限制:目前仅提供Windows版本。

使用所需设备

  1. 将计算机连接到显示器。
  2. 将鼠标和键盘连接到一个USB切换器。
  3. 在其中一台计算机上运行SimpleKVM程序。

操作方式

  • 可通过USB切换器物理切换或使用程序快捷键在不同计算机间切换。
  • 提供设置选项,支持程序开机时自动运行。

USB切换器推荐

项目建议搭配任何USB切换器使用,并列举了三款不同规格和价位的示例(无关联性):

  • 支持4台计算机的SABRENT 4口切换器(约29美元)
  • 支持2台计算机的2口切换器(约24美元)
  • 仅有一个USB输入的2口切换器(约3美元)

项目来源

该项目的灵感来源于haimgel的display-switch程序。

总结而言,Simple KVM通过结合廉价USB硬件和DDC/CI技术,以软件方式实现了传统KVM切换器的核心功能,显著降低了多设备控制成本,并支持多显示器环境。