这是一个关于MP3文件格式的问题。
我一直在寻找一种获得 MP3 持续时间的方法。由于我使用 JLayer SPI 来解码 MP3,我发现在音频源是文件的情况下这是可能的。
AudioFileFormat fileFormat = AudioSystem.getAudioFileFormat(source);
Long microseconds = (Long) fileFormat.properties().get("duration");
System.out.println(microseconds);
Run Code Online (Sandbox Code Playgroud)
然而,当我采用类似的代码和完全相同的 MP3 并将源更改为 URL 时,JLayer 不提供持续时间:
AudioFileFormat fileFormat = AudioSystem.getAudioFileFormat(source.toURI().toURL());
Long microseconds = (Long) fileFormat.properties().get("duration");
System.out.println(microseconds);
Run Code Online (Sandbox Code Playgroud)
这是一个重要的区别,因为我想要播放的一些音乐将来自 URL,而不是本地文件。
我怀疑这是由于文件格式的限制。
这让我想到一个非常简单的问题。在下载整个文件之前是否可以知道 MP3 的持续时间?
我希望使用 anasyncio.loop在特定时间设置回调。我的问题是我需要根据datetime.datetime对象(UTC)来安排这些,但asyncio.loop.call_at()使用内部参考时间。
对 Ubuntu 上运行的 python 3.7.3 进行快速测试表明asyncio.loop.time()正在报告系统正常运行时间。对于转换,我的第一个想法是天真地存储参考时间并在以后使用它:
from asyncio import new_event_loop
from datetime import datetime, timedelta
_loop = new_event_loop()
_loop_base_time = datetime.utcnow() - timedelta(seconds=_loop.time())
def schedule_at(when, callback, *args):
_loop.call_at((when - _loop_base_time).total_seconds(), callback, *args)
Run Code Online (Sandbox Code Playgroud)
然而,尚不清楚该偏移量 ( datetime.utcnow() - timedelta(seconds=loop.time())) 是否稳定。我不知道即使系统时钟被修改(例如:通过 NTP 更新),系统正常运行时间与 UTC 相比是否会发生漂移。
请记住,这是针对可能一次运行数月的监控软件,小偏差可能非常重要。我应该指出的是,我见过没有 NTP 守护进程的系统每天会损失几分钟的时间,并且一次性 NTP 更新可能会在短时间内将时间改变很多分钟。由于我不知道两者是否保持同步,因此不清楚我需要关心多少。
注意:我知道 python 在安排未来超过 24 小时的事件方面存在问题。我将通过将遥远的未来事件存储在列表中并每 12 小时轮询一次即将发生的事件来解决这个问题,仅在未来 24 小时内安排它们。
是否可以可靠地从 转换为datetime.datetime时间asyncio.loop?或者两个时间系统没有可比性?如果它们具有可比性,我需要做什么特别的事情来确保我的计算是正确的。
我正在读取一组文件(日志文件)中的行,因为它们是使用 pyinotify 编写的。
我正在使用 python 本机方法打开并读取文件:
file = open(self.file_path, 'r')
# ... later
line = file.readline()
Run Code Online (Sandbox Code Playgroud)
这通常是稳定的,可以处理被删除和重新创建的文件。pyinotify 将通知取消链接和后续链接。
但是,某些日志文件不会被删除。相反,它们被截断并将新内容写入同一文件的开头。
我无法可靠地检测何时发生这种情况,因为 pyinotify 仅报告写入。我目前得到的唯一证据是 pyinotify 报告写入并readline()返回一个空字符串。但是,后续的两次写入可能会触发相同的行为。
我曾考虑过比较文件的大小,file.tell()但根据文档tell会产生一个不透明的数字,并且似乎不能相信这是一个字节数。
有没有一种简单的方法来检测文件在读取时是否被截断?
编辑:
可以使用简单的 shell 命令来模拟截断文件:
echo hello > test.log
echo hello >> test.log
# Truncate test.log
echo goodbye > test.log
Run Code Online (Sandbox Code Playgroud)
为了补充这一点,可以使用一个简单的 python 脚本来确认file.tell()文件被截断时不会减少:
foo = open('./test.log', 'r')
line = foo.readline()
while line != '':
print(foo.tell())
print(line)
line = foo.readline()
# Put a breakpoint on the following line …Run Code Online (Sandbox Code Playgroud) 我正在寻找另一个问题(这里),有人正在寻找一种方法来获得x86汇编中64位整数的平方根.
事实证明这很简单.解决方案是转换为浮点数,计算sqrt然后转换回来.
我需要在C中做一些非常相似的事情,但是当我看到等价物时,我会陷入困境.我只能找到一个接收双打的sqrt函数.双精度不具有存储大64位整数的精度而不会引入明显的舍入误差.
是否有一个我可以使用的具有long doublesqrt功能的通用数学库?
当我在随Ubuntu 12.04一起分发的OpenJDK 6 JVM上运行我的多线程Java程序时,所有线程都安排在一个核心上.但是当我从Oracle最新的1.7 JDK在JVM上运行完全相同的程序时,它很好地围绕所有24个可用内核旋转了我的20个线程.在OpenJDK的文档解释了Java线程将被分配到本地线程,但它似乎并不奏效.我的OpenJDK安装中是否存在配置错误,或者它是否真的不支持多核硬件?
OpenJDK的:
java version "1.6.0_27"
OpenJDK Runtime Environment (IcedTea6 1.12.6) (6b27-1.12.6-1ubuntu0.12.04.2)
OpenJDK 64-Bit Server VM (build 20.0-b12, mixed mode)
Run Code Online (Sandbox Code Playgroud)
Oracle JDK:
java version "1.7.0_40"
Java(TM) SE Runtime Environment (build 1.7.0_40-b43)
Java HotSpot(TM) 64-Bit Server VM (build 24.0-b56, mixed mode)
Run Code Online (Sandbox Code Playgroud) 我正在编写一个使用递归结构配置的库。
为了讨论起见,我将这些图结构称为“树”,因为有一个定义的“根”节点,并且每个节点可以引用的不仅仅是“子”节点。正确配置后,不应存在环路。它与树略有不同,因为子节点可以在多个地方使用。
A A
/ \ / \
B C B C
/ \ / \ / \ \
D E F D E |
\ |
F
Run Code Online (Sandbox Code Playgroud)
尽管 E 和 F 在多个层上多次使用,但这两种方法都是可以接受的。节点可以有多个父节点和多个子节点,但绝不能是它们自己的祖先。
然而
A
|
B
|
A
|
...
Run Code Online (Sandbox Code Playgroud)
因为循环是不可接受的。
如果要给我的图书馆一个带有循环的图表,那么图书馆就会发生不好的事情,所以我正在寻找一种方法来检查输入的完整性。我需要确定通过这个结构递归是否会终止,或者它是否会陷入无限循环。实际上,我需要在有向图中寻找循环。
我正在我的 python 应用程序中设置 SSL 客户端验证。目前,我的概念验证代码仅建立安全连接就失败了。
看起来我生成的证书要么具有没有必要权限的证书使用(更有可能是 IMO),要么它们具有服务器无法理解或接受的权限(不太可能是 IMO)。
这应该是相对微不足道的,但我找不到正确的文档。
我已经通过 OpenSSL 生成了服务器和客户端证书。我过去曾对其他应用程序这样做过,没有任何问题。但我对创建客户端证书不太熟悉。OpenSSL 报告我正在使用的客户端证书具有扩展名:
X509v3 extensions:
X509v3 Subject Key Identifier:
AF:AB:9D:AA:88:96:F4:0C:F5:56:9A:2C:DB:B6:BA:D9:DD:11:69:45
X509v3 Subject Alternative Name:
email:a@example.com
X509v3 Basic Constraints:
CA:FALSE
Netscape Cert Type:
SSL Client
X509v3 Authority Key Identifier:
keyid:E1:35:7C:39:7F:39:A4:43:D2:F8:00:59:38:91:71:AF:B9:38:AD:3F
X509v3 Key Usage:
Digital Signature, Key Encipherment
X509v3 Extended Key Usage:
TLS Web Client Authentication
Run Code Online (Sandbox Code Playgroud)
简单的服务器测试代码是:
X509v3 extensions:
X509v3 Subject Key Identifier:
AF:AB:9D:AA:88:96:F4:0C:F5:56:9A:2C:DB:B6:BA:D9:DD:11:69:45
X509v3 Subject Alternative Name:
email:a@example.com
X509v3 Basic Constraints:
CA:FALSE
Netscape Cert Type:
SSL Client …Run Code Online (Sandbox Code Playgroud) 有没有测试文件部分写入失败的好方法?我对模拟完整磁盘特别感兴趣。
我有一些修改文件的代码。对于某些故障,代码无能为力,例如:如果在写入时拔下磁盘。但是对于其他可预测的故障,例如磁盘已满,我的代码应该(并且可以)捕获异常并撤消自最近修改开始以来的所有更改。
我认为我的代码在这方面做得很好,但我正在努力寻找一种方法来对其进行详尽的单元测试。编写单元测试来限制真实的文件系统1是很困难的。我看不到任何限制BytesIO 的方法。我不知道有任何模拟包。
在我自己编写之前,是否有任何标准工具/技术?
1由于一些原因,限制真实的文件系统是很困难的。最大的困难是文件系统通常受限于几个 KiB 而不是字节的块。很难让这个测试所有不愉快的路径。也就是说,一个好的测试会以不同长度的限制重复,以确保file.write(...)测试中的每个单独错误,但是使用 4KiB 的块大小来实现这一点将是困难的。
为什么我必须在源代码中嵌入代码版本,有什么实际原因吗?显然我感兴趣setup.py但也有一些用途__version__。通过“嵌入源代码”,我的意思是我必须将版本号作为文本写入文件中,而不是通过其他方式填充 python 字段。
在其他语言中,我已经设置了构建脚本以了解 git 标签,然后完全通过标签管理版本号。这意味着 repo 中永远不会提交“修改版本号”。我所要做的就是标记新版本的提交并运行构建。
因此,作为一个理论示例,我可能会:
def _get_version()
command = ['git', 'describe', '--tags', '--match' 'versions/[0-9]*.[0-9]*']
result = subprocess.run(command, stdout=subprocess.PIPE).stdout.decode('utf-8')
return result.replace('-', '+', 1).replace('versions/', '')
setuptools.setup(
name="example-pkg-YOUR-USERNAME-HERE", # Replace with your own username
version=_get_version(),
author="Example Author",
author_email="author@example.com",
description="A small example package",
long_description=long_description,
long_description_content_type="text/markdown",
url="https://github.com/pypa/sampleproject",
packages=setuptools.find_packages(),
classifiers=[
"Programming Language :: Python :: 3",
"License :: OSI Approved :: MIT License",
"Operating System :: OS Independent",
],
python_requires='>=3.6',
)
Run Code Online (Sandbox Code Playgroud)
我不清楚的是这是否有效。是setuptools.setup在上传到包存储库之前还是由第三方下载时解析的结果?当然,git repo 仅在上传之前可用,而不是在其他人通过 pip 下载包时可用。 …
我正在尝试检查在修订版401中从我的SVN中删除的项目.该项目现已不存在,并且已完全替换为重写代码,但我想要结帐以便我可以参考在重写时处理旧代码的一小部分.
据我所知,这应该像检查旧路径和最后一个好的修订版(400)一样简单.但是当我尝试这个时,我得到一个错误,因为它正在尝试使用最新版本:
C:\Users\couling\workspace>svn checkout --revision=400 https://svn.domain.com/repos/trunk/OldProject
Error validating server certificate for 'https://svn.domain.com:443':
- The certificate is not issued by a trusted authority. Use the
fingerprint to validate the certificate manually!
Certificate information:
- Hostname: svn.domain.com
- Valid: from Tue, 11 Dec 2012 15:03:33 GMT until Wed, 11 Dec 2013 15:03:33 GMT
- Issuer: Personal Certificate, Foomy Whatsit, Blah, Blah, GB
- Fingerprint: 01:02:03:04:05:06:07:08:09:10:11:12:13:14:15:16:17:18:19:20
(R)eject, accept (t)emporarily or accept (p)ermanently? t
svn: '/repos/!svn/bc/1418/trunk/OldProject' path not found
C:\Users\couling\workspace>
Run Code Online (Sandbox Code Playgroud)
我可以通过Web浏览器轻松浏览到修订版400的文件夹,因此在最坏的情况下我仍然可以查看代码,但我更愿意为我的IDE提供所有源文件的副本.
作为参考,我正在使用此版本的客户端:
C:\Users\couling\workspace>svn --version …Run Code Online (Sandbox Code Playgroud) python ×5
algorithm ×1
audio ×1
c ×1
command-line ×1
duration ×1
file-format ×1
inotify ×1
jlayer ×1
jvm ×1
linux ×1
long-double ×1
mp3 ×1
multicore ×1
openjdk ×1
python-3.x ×1
setuptools ×1
ssl ×1
svn ×1
svn-checkout ×1
tree ×1
unit-testing ×1
versioning ×1
windows ×1