小编Phi*_*ing的帖子

在下载整个文件之前是否可以知道 MP3 的持续时间?

这是一个关于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 的持续时间?

audio mp3 file-format duration jlayer

6
推荐指数
1
解决办法
4738
查看次数

asyncio.loop.time() 是否与 datetime.datetime.now() 具有可比性以及如何比较?

我希望使用 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?或者两个时间系统没有可比性?如果它们具有可比性,我需要做什么特别的事情来确保我的计算是正确的。

python python-3.x python-asyncio

6
推荐指数
1
解决办法
6796
查看次数

如何检测文件在读取时是否被截断

我正在读取一组文件(日志文件)中的行,因为它们是使用 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)

python linux file-monitoring inotify

6
推荐指数
1
解决办法
2310
查看次数

如何轻松计算C中无符号长long的平方根?

我正在寻找另一个问题(这里),有人正在寻找一种方法来获得x86汇编中64位整数的平方根.

事实证明这很简单.解决方案是转换为浮点数,计算sqrt然后转换回来.

我需要在C中做一些非常相似的事情,但是当我看到等价物时,我会陷入困境.我只能找到一个接收双打的sqrt函数.双精度不具有存储大64位整数的精度而不会引入明显的舍入误差.

是否有一个我可以使用的具有long doublesqrt功能的通用数学库?

c long-double unsigned-long-long-int

5
推荐指数
2
解决办法
1万
查看次数

OpenJDK JVM不会在多个核心上调度线程

当我在随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)

openjdk multithreading jvm multicore

5
推荐指数
0
解决办法
1481
查看次数

检测树结构(图形)中的循环

我正在编写一个使用递归结构配置的库。

为了讨论起见,我将这些图结构称为“树”,因为有一个定义的“根”节点,并且每个节点可以引用的不仅仅是“子”节点。正确配置后,不应存在环路。它与树略有不同,因为子节点可以在多个地方使用。

      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)

因为循环是不可接受的。

如果要给我的图书馆一个带有循环的图表,那么图书馆就会发生不好的事情,所以我正在寻找一种方法来检查输入的完整性。我需要确定通过这个结构递归是否会终止,或者它是否会陷入无限循环。实际上,我需要在有向图中寻找循环。

algorithm tree infinite-loop graph-algorithm

5
推荐指数
1
解决办法
5629
查看次数

python 中 SSL 客户端的正确证书用途是什么?

我正在我的 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)

python ssl client-certificates

5
推荐指数
1
解决办法
2690
查看次数

有没有测试文件部分写入失败的好方法?

有没有测试文件部分写入失败的好方法?我对模拟完整磁盘特别感兴趣。

我有一些修改文件的代码。对于某些故障,代码无能为力,例如:如果在写入时拔下磁盘。但是对于其他可预测的故障,例如磁盘已满,我的代码应该(并且可以)捕获异常并撤消自最近修改开始以来的所有更改。

认为我的代码在这方面做得很好,但我正在努力寻找一种方法来对其进行详尽的单元测试。编写单元测试来限制真实的文件系统1是很困难的。我看不到任何限制BytesIO 的方法。我不知道有任何模拟包。

在我自己编写之前,是否有任何标准工具/技术?


1由于一些原因,限制真实的文件系统是很困难的。最大的困难是文件系统通常受限于几个 KiB 而不是字节的块。很难让这个测试所有不愉快的路径。也就是说,一个好的测试会以不同长度的限制重复,以确保file.write(...)测试中的每个单独错误,但是使用 4KiB 的块大小来实现这一点将是困难的。

python unit-testing

5
推荐指数
1
解决办法
69
查看次数

为什么我必须在 python 源代码中嵌入代码版本,有什么实际原因吗?

为什么我必须在源代码中嵌入代码版本,有什么实际原因吗?显然我感兴趣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 下载包时可用。 …

python versioning setuptools

5
推荐指数
1
解决办法
302
查看次数

如何在命令行上从SVN签出已删除的项目

我正在尝试检查在修订版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)

svn windows command-line svn-checkout

4
推荐指数
1
解决办法
783
查看次数