2作者: drschlange7 个月前
大家好,我是 Vince。我开发了 Nallely,一个模块化的反应式 Python 框架,用于通过连接信号处理模块来创建自定义 MIDI 乐器,就像控制系统的模块化合成器一样。Nallely 专注于实时、线程隔离的反应式行为,让您可以试验涌现行为。 演示视频:<a href="https:&#x2F;&#x2F;www.youtube.com&#x2F;watch?v=rbMnKAdqAVI" rel="nofollow">https:&#x2F;&#x2F;www.youtube.com&#x2F;watch?v=rbMnKAdqAVI</a> 从头开始构建一个补丁,并在接近结尾时对正在运行的实例进行热调试。 主要特点: * 用于连接反应式模块(神经元)的视觉补丁界面, * 可通过 Python API、WebSocket 和/或代码生成进行扩展, * 集成任何输入源(MIDI、网络摄像头等)来控制合成器。 \# 是的,但为什么? 现有的提出 MIDI 操作的软件/库功能强大,但对现场实验不友好。它们是低级别的,难以即时重新连接,并且通常对于嵌入式或无头设置来说很笨重。我想要一个也可以动态演进的系统,可以在其中实时修补、热插拔和调试模块。 \# 架构 该系统围绕一个反应式线程模型构建,没有共享数据:每个神经元都存在于其自己的线程中,并通过通过通道发送消息进行通信。神经元级别不再有 CC 等,一切都是信号(通过时间的简单 int/float 值)。没有全局节拍,每个神经元都在自己的时间上工作。每个神经元都是反应式的,它们大部分时间都在休眠。该系统大量借鉴了“系统即生命体”的哲学和 Smalltalk,将每个线程视为一个小的生命实体,而不是一个处理单元。以下是如何编写一个简单的 Sample&Hold 模块: ```python class SampleHold(VirtualDevice): input_cv = VirtualParameter(name="input", range=(0, 127)) trigger_cv = VirtualParameter(name="trigger", range=(0, 1), conversion_policy=">0") @on(trigger_cv, edge="rising") def hold_value(self, value, ctx): return self.input ``` 控制层使用一个小的 WebSocket 协议,基于 React 的 Web UI 使用它来控制和内省会话。一个 WebSocket 总线神经元允许外部应用程序自动注册到它以发送/接收信号:网络中的另一个神经元可以提供从任何来源捕获的信号。它们对于在不同机器上分配计算负载很有用。 \# 到目前为止我学到了什么 一个简单的线程模型在 MIDI/音乐环境中可能很强大: * 您可以停止/恢复一个线程,无缝地停止处理链的一部分; * 溢出的神经元可以减轻压力,而不会影响整个会话; * 如果一个线程崩溃,它会暂停,让您能够调试实例并恢复它; * 简单的 websockets 具有可接受的吞吐量。 我预计一个完全基于 Python 线程的系统会非常低效,但它出人意料地合理。根据经验,我看到每个线程大约 1-2% 的 CPU 占用率。一个 20 个线程的经典会话(大约 45 个补丁)在 CPython 3.13 GIL 上大约使用 21% 的 CPU 和 45MB RAM。CPython 3.14 no-GIL 显示了类似的 CPU 占用率,但 RAM 占用率约为 65MB。反馈循环会增加使用率(大约 38%)。有趣的是,在 CPython 3.13 上,负载分布在多个核心上,我假设线程休眠的时间足够长,可以经常释放 GIL。 \# 试试吧! 您可以在最新的 github actions artifacts 中获取预编译的 PyInstaller 构建的二进制文件。文档链接在 README 中,深入的文章可以在这里找到:<a href="https:&#x2F;&#x2F;dr-schlange.github.io&#x2F;nallely-midi&#x2F;posts" rel="nofollow">https:&#x2F;&#x2F;dr-schlange.github.io&#x2F;nallely-midi&#x2F;posts</a>。 \# 我很乐意收到反馈 * 可以改进什么以使其更容易上手? * 是否存在可能长期存在问题的盲点或设计选择? * 虽然它以 MIDI 为导向,但该系统实际上是信号无关的,对于非音频用例有什么想法吗?(例如视觉效果等)
2作者: dirtybirdnj7 个月前
我很欣赏“谁在招聘 / 谁想被聘用”的帖子。我很好奇我们是否可以稍微改变一下这个模式,讨论一下人们是如何找到他们现在的工作的,或者哪些工作对他们的职业生涯有意义和影响。<p>寻找:你是如何找到这份工作的?是它找到了你吗?<p>面试:你做了什么与众不同的事情吗?有哪些可能不那么直观的策略?<p>生存:每份工作都有其缺点,你做了什么来维持你的收入能力,尽管之前的工作中存在让你感到困难 / 不愉快 / 无法忍受的问题?<p>目前失业中,今年早些时候辞去了在美国某个州的工作,因为他们没有把软件开发当回事。当你无法获得任何测试、无法获得任何基础设施或项目管理支持,必须在真空环境中独自完成所有事情时,很难完成工作。不得不把应用程序运行在壁橱里的服务器上。<p>这是我人生中第一次“选择自己”,辞掉了工作,而不是继续留在对我的心理健康产生非常负面影响的环境中。在不解决对充满敌意、有毒的工作环境的恐惧的情况下,很难找到重返就业的途径。<p>希望有一些想法或方向,可以给我一些新的尝试,而不是一遍又一遍地做同样的事情,然后一次又一次地失败。
2作者: matherslabs7 个月前
我最近被解雇了,决定把精力投入到一些有意义的事情上。在两周的时间里,我每天工作16个小时,构建了一个工具,可以将澳大利亚银行的PDF文件转换成干净、可靠的CSV文件,专门针对澳大利亚的银行。 大多数澳大利亚银行只提供PDF格式的账单,而通用的转换器通常会失败:列会错位,多行描述会破坏解析,标题会偏移。现有的工具处理得不好,我想要一个能正常运行的工具。 为了开始,我使用了我自己的银行账单来构建初始的解析器。当我意识到获取更真实的测试数据有多难时,我有一个“恍然大悟”的时刻。人们不会轻易交出他们的财务账本。这巩固了我的核心原则:信任和隐私必须是绝对的首要任务。 我最初尝试使用JavaScript在客户端构建所有内容,以实现最大的隐私性,但性能和可靠性都很差,而且在前端暴露解析器会使它们容易被复制。 我最终选择了中间方案:在Google Cloud Run上使用Python和FastAPI后端。这使我能够在可靠性和严格的隐私架构之间取得平衡。文件会实时处理,并且临时文件会在请求完成后立即删除。没有持久性存储,也没有请求主体的日志记录。 我的技术方法很简单,并且侧重于可靠性: * 我使用pdfplumber提取文本,避免复杂且容易出错的OCR。 * 我应用一组特定于银行的正则表达式模式来精确定位日期、金额和描述。 * 一个前瞻性启发式方法可以正确地合并多行交易。每个解析器都针对其银行独特的PDF布局怪癖进行了定制。 该项目是有意为之的。我没有支持数百家银行并取得平庸的结果,而是专注于一小部分银行,以确保它们正确。它目前支持联邦银行(CommBank)、西太平洋银行(Westpac)、UBank和ING,接下来是澳新银行(ANZ)和澳大利亚国民银行(NAB)。整个项目部署在Cloudflare Pages上,并输出干净的CSV文件,可用于Excel、Google Sheets、Xero或MYOB。 这是一个逆向工程混乱、真实世界数据的有趣挑战。 在这里试用:[https://aussiebankstatements.com](https://aussiebankstatements.com) 我很乐意听到反馈。如果它在你的账单上出错,经过编辑的样本将对改进解析器有很大帮助。 我也很好奇,这里其他人是如何解决类似混乱的数据提取挑战的。