返回首页
最新
嗨,HN!我是Vince。我构建了Nallely,这是一个模块化的反应式Python框架,用于通过将信号处理模块连接在一起来创建自定义MIDI乐器,就像一个控制系统的模块化合成器。Nallely专注于实时、线程隔离的反应式行为,让你可以实验新兴的行为。
<p>演示视频:<a href="https://www.youtube.com/watch?v=rbMnKAdqAVI" rel="nofollow">https://www.youtube.com/watch?v=rbMnKAdqAVI</a>,展示了从零开始构建一个补丁,并在最后进行热调试。</p>
<p>主要特点:
* 连接反应式模块(神经元)的可视化补丁界面,
* 通过Python API、WebSocket和/或代码生成进行扩展,
* 集成任何输入源(MIDI、网络摄像头等)以控制合成器。</p>
<p># 是的,但为什么?
现有的软件/库虽然在MIDI操作方面功能强大,但不利于实时实验。它们是低级的,难以动态重连,且通常对于嵌入式或无头设置来说负担较重。我希望有一个系统能够动态演变,模块可以实时补丁、热插拔和调试。</p>
<p># 架构
该系统围绕一个没有共享数据的反应式线程模型构建:每个神经元都在自己的线程中运行,并通过通道发送消息进行通信。不再有CC……在神经元级别,一切都是信号(一个简单的整数/浮点值随时间变化)。没有全局时钟,每个神经元都在自己的时间上工作。由于每个神经元都是反应式的,它们大部分时间处于休眠状态。该系统深受“系统如生命体”哲学和Smalltalk的启发,将每个线程视为一个小的生命实体,而不仅仅是一个处理单元。以下是如何编写一个简单的采样保持模块:</p>
```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
```
<p>控制层使用一个小型WebSocket协议,反应式的Web UI利用它来控制和检查会话。一个WebSocket总线神经元允许外部应用程序自动注册,以发送/接收信号:网络中的另一个神经元可以提供从任何源捕获的信号。它们对于在不同机器上分配计算负载非常有用。</p>
<p># 到目前为止我学到了什么
在MIDI/音乐上下文中,简单的线程模型可以非常强大:
* 你可以停止/恢复一个线程,毫无缝隙地停止处理链的一部分;
* 溢出的神经元可以减轻压力,而不会影响整个会话;
* 如果一个线程崩溃,它会被暂停,以便你能够调试该实例,并恢复它;
* 简单的WebSocket具有可接受的吞吐量。</p>
<p>我原本以为一个完全基于Python线程的系统会非常低效,但结果出乎意料地合理。根据经验,我发现每个线程的CPU使用率约为1-2%。一个20线程的经典会话(约45个补丁)在CPython 3.13 GIL下大约使用21%的CPU和45MB的内存。CPython 3.14无GIL显示出类似的CPU使用率,但内存约为65MB。反馈循环会提高使用率(约38%)。有趣的是,在CPython 3.13中,负载分布在多个核心上,我想线程足够休眠,能够频繁释放GIL。</p>
<p># 尝试一下!
你可以在最新的GitHub Actions构建的工件中获取预编译的PyInstaller二进制文件。文档链接在自述文件中,深入文章可以在这里找到:<a href="https://dr-schlange.github.io/nallely-midi/posts" rel="nofollow">https://dr-schlange.github.io/nallely-midi/posts</a>。</p>
<p># 我希望得到反馈
* 有什么可以改进的地方,以便让人更容易上手?
* 是否存在盲点或设计选择,可能在长期内造成问题?
* 尽管它是以MIDI为导向,但系统实际上是信号无关的,有什么非音频使用案例的想法吗?(例如视觉等)</p>
我很欣赏关于“谁在招聘 / 谁想被招聘”的帖子。我想知道我们是否可以稍微改变一下这个模式,讨论一下人们是如何找到他们现在的工作,或者那些在他们职业生涯中有意义和影响力的工作的。
定位:你是如何找到这份工作的?是这份工作找到你的?
面试:你做过什么让你脱颖而出的事情吗?有没有一些可能不太直观的不同策略?
生存:每份工作都有其缺陷,你是如何在面对让之前的工作变得困难 / 不愉快 / 无法忍受的问题时,维持自己的收入能力的?
我目前失业,早些时候辞去了在美国某州工作的职位,因为他们没有将软件开发视为一项重要工作。当你无法进行任何测试,得不到基础设施或项目管理的支持,所有事情都必须自己在一个封闭的环境中完成时,完成工作是非常困难的。还得在一个储藏室里的服务器上运行应用程序。
这是我人生中第一次“选择自己”,辞去了对我的心理健康产生非常负面影响的工作。找到一种方法重新回到职场很困难,因为我需要面对对敌对和有毒工作环境的恐惧。
希望能得到一些想法或方向,给我一些新的尝试,而不是一遍又一遍地做那些失败的事情。
PR测试审查与增强 – 一种能够审查您在PR中的测试并建议缺失用例和必要改进的人工智能。
我最近被解雇了,决定将我的精力投入到一些有意义的事情上。在两周的时间里,我每天工作16小时,开发了一款工具,可以将澳大利亚银行的PDF文件转换为干净、可靠的CSV格式,专门针对澳大利亚的银行。
大多数澳大利亚银行只提供PDF格式的对账单,而通用的转换工具往往无法正常工作:列会错位,多行描述会导致解析失败,表头会移动。现有的工具处理得并不好,我想要一个能正常工作的工具。
为了开始,我使用了自己的银行对账单来构建初始的解析器。当我意识到获取更真实的测试数据是多么困难时,我有了一个“显而易见”的时刻。人们不会随便交出他们的财务账本。这坚定了我的核心原则:信任和隐私必须是绝对的首要任务。
我最初尝试在客户端使用JavaScript构建一切,以实现最大程度的隐私,但性能和可靠性都很差,并且将解析器暴露在前端会使其容易被复制。
我最终选择了一个折衷方案:在Google Cloud Run上使用Python和FastAPI作为后端。这让我能够在可靠性和严格的隐私架构之间取得平衡。文件实时处理,临时文件在请求完成后立即删除。没有持久存储,也没有请求体的日志记录。
我的技术方案简单明了,专注于可靠性:
- 我使用pdfplumber提取文本,避免复杂且容易出错的OCR。
- 我应用了一组特定于银行的正则表达式模式,以准确定位日期、金额和描述。
- 采用前瞻性启发式算法正确合并多行交易。每个解析器都根据其银行独特的PDF布局特征进行定制。
该项目的重点非常明确。我不打算支持数百家银行并提供平庸的结果,而是专注于少数几家,以确保做到准确。目前支持CommBank、Westpac、UBank和ING,接下来是ANZ和NAB。整个项目部署在Cloudflare Pages上,输出适合Excel、Google Sheets、Xero或MYOB的干净CSV文件。
这是一项有趣的挑战,涉及逆向工程混乱的真实数据。
欢迎在这里试用:<a href="https://aussiebankstatements.com" rel="nofollow">https://aussiebankstatements.com</a>
我很想听听反馈。如果在你的对账单上出现问题,提供一个经过编辑的样本将对改进解析器大有帮助。
我也很想知道这里的其他人是如何应对类似的混乱数据提取挑战的。