我需要$PATH
在我的应用程序中解析环境变量.所以我想知道哪些转义字符有效$PATH
.我创建了一个名为test的测试目录/bin:d
并在其中创建了一个测试脚本
funny
.如果我用绝对路径调用它,它就会运行.我只是无法弄清楚如何逃脱:
的$PATH
我试图逃跑的结肠\
和包成单'
,双"
引号.但总是在我跑的which funny
时候找不到它.我正在运行CentOS 6.
我用 Python 开发了一个性能关键且 CPU 密集型的应用程序。为了达到可接受的性能,我使用 PyPy 和使用 os.fork 生成的多个进程。总的来说,我现在对接近编译语言的性能感到满意。但我最初使用的时候必须生成很多 GUID:
\n\nimport uuid\nprint(str(uuid.uuid4()))\n
Run Code Online (Sandbox Code Playgroud)\n\n生成 UUID。但分析显示,UUID 生成约占总运行时间的 20%。这似乎是由于对os.urandom()
in的调用uuid.uuid4()
在某些系统(包括 OS\xc2\xa0X)上似乎很慢。然后我替换os.urandom()
为random.getrandbits()
:
import random\n str(UUID(int=random.getrandbits(128), version=4))\n
Run Code Online (Sandbox Code Playgroud)\n\n这很快。但现在事实证明我的并行运行工作进程大量生成重复的 GUID。
\n\n我怀疑 python 的伪数生成器是用当前时间作为种子的,这就是为什么不同的进程会生成相同的随机数。我能想到的一种可能的修复方法是将进程 ID 包含到数字生成器的种子中。但由于我不太确定 uuid 和随机包是如何在内部构建的,所以我不确定这是否足以防止冲突。我发现了一些作为 c 扩展编写的替代 UUID 实现,但由于 PyPy 我无法使用它们。
\n\n由于某些库的原因,我只在这个项目中使用 python,而且我在 python 中编码的经验很少。
\n\n更新:
\n\n现在我已经seed(SystemRandom().getrandbits(128))
在分叉后添加了。因此使用 /dev/urandom 播种 PRNG。到目前为止,这似乎运作良好。
我喜欢 rossum 提出的用主进程 RNG 为子进程播种的想法。但现在想起来,我想使用操作系统的 RNG 来播种 RNG 应该更安全。特别是,因为我的应用程序还分布在多个节点上运行。恕我直言,用 mac 地址和时间戳播种初始 RNG,然后使用 rossums 提案应该也可行。
\n我正在寻找一个不会发出语法错误的简单模板引擎。我的意思是,根据定义,每个模板都应该具有有效的语法。如果无法解析变量或代码构造,它应该简单地打印出损坏的代码,而不是中止渲染。
我想这样做的原因是因为我想在高级用户可以调整自己的模板的环境中使用它们,但我很难将错误传达给他们。
现在,我正在使用一些高级搜索和替换标记,效果很好,但不支持循环和 if 语句。我想要一个简单的模板语言,允许非常简单的 if 和循环语句。
你知道有什么模板引擎可以在 Java 中做到这一点吗?
实施例A
模板:
My template <h1>{title}</h1>
<p>{message}</p>
<ul>
{foreach items as item}
<li>{item.value}</li>
{/foreach}
</ul>
Run Code Online (Sandbox Code Playgroud)
数据:
{
"title": "Hello World",
"items": [
{
"value": "foo"
},
{
"value": "bar"
}
]
}
Run Code Online (Sandbox Code Playgroud)
结果:
My template <h1>Hello World</h1>
<p>{message}</p>
<ul>
<li>foo</li>
<li>bar</li>
</ul>
Run Code Online (Sandbox Code Playgroud)
实施例B
模板:
My template <h1>{title}</h1>
<p>{message}</p>
<ul>
{foreach items
<li>{item.value</li>
{/foreach}
</ul>
Run Code Online (Sandbox Code Playgroud)
数据:
{
"title": "Hello World",
"message": "Test",
"items": [
{
"value": "foo"
},
{
"value": "bar"
} …
Run Code Online (Sandbox Code Playgroud) 我目前正在开发一个需要缓存不同资源的应用程序。不同类型的资源都有处理程序,这些处理程序将知道哪些数据与确定相关,是否必须重建资源或者是否可以从缓存中获取它。为此,处理程序应生成所有相关数据的哈希值以进行缓存。根据上下文,数据可以是基元(int、float...)、字符串、切片、结构体和映射。所以几乎一切。用于散列的对象数量也可能有所不同。
为了计算处理程序中的哈希值,我创建了一个具有类型 的可变参数的哈希函数interface{}
。
我目前的做法是这样的:
func Hash(objs ...interface{})([]byte) {
// Use MD5 because it's fast and is reasonably enough protected against accidental collisions.
// There is no scenario here where intentional created collisions could do harm.
digester := crypto.MD5.New()
encoder := gob.NewEncoder(digester)
encoder.Encode(objs) // In real life one would handle that error
return digester.Sum(make([]byte, 0))
}
Run Code Online (Sandbox Code Playgroud)
这有效。但这个实现有一些让我头疼的事情。因为我不确定gob 是否总是表现出确定性,对于当前版本似乎是这种情况,但正如引用的答案指出的那样,版本之间可能会有变化。根据 gob 的文档,传输结构时将省略默认值(0 表示整数、空字符串、nil...)。此外,所有 int 值都将作为通用数字传输。所以unit64和int将是相同的。对于我的用例,我想不出这有什么实际问题,但这听起来像是麻烦的根源。
现在,如果我从头开始编写该函数,我会适当地谨慎行事,用反射遍历该结构并创建一个哈希树。但我不想那样做。
我很确定我不是第一个满足这些要求的人,但我无法在网络上找到任何经过良好测试的 go 代码来解决这个问题。
附录
另请参阅:https://crypto.stackexchange.com/questions/10058/how-to-hash-a-list-of-multiple-items
这并不像看起来那么微不足道。正如 Adrian 指出的那样,简单地连接数据是行不通的,因为这样Hash("12", "3")
和Hash("123") …