假设我在食谱中有一个默认属性:
default.nginx_upstreams = {
'service1' => ['service1.server.com'],
'service2' => ['service2.server.com'],
}
Run Code Online (Sandbox Code Playgroud)
然后它会在角色和环境中被修改和覆盖,直到它最终到达我的配方.在那里,我计算了一些我想要添加到属性的附加服务.如果我做这样的事情:
node.nginx_upstreams.merge! {'service3' => ['service3.server.com']}
Run Code Online (Sandbox Code Playgroud)
然后当我尝试使用属性在我的模板,我得到了undefined method 'each' for nil:NilClass我的模板时,我尝试做
<% node.nginx_upstreams.each do |name, servers| %>
Run Code Online (Sandbox Code Playgroud)
另外,我也得到了WARN: Setting attributes without specifying a precedence is deprecated and will be removed in Chef 11.0.有用的警告告诉我如何以正常优先级设置属性(显然,使用node.set["key"] = "value",但不告诉我如何指定默认或覆盖属性.
通过这样做,我可以解决这个问题:
upstreams = node.nginx_upstreams.to_hash
upstreams.merge! {'service3' => ['service3.server.com']}
template "nginx_config" do
variables({:upstreams=>upstreams})
end
Run Code Online (Sandbox Code Playgroud)
但这感觉就像一个黑客.我在这个页面node.set()之外找不到任何文档,这也表明你可以在配方中设置正常和覆盖属性,但没有说明如何.
那么......你如何从配方中正确设置属性(与其他所有东西深度融合)?这个node.set()电话实际上做了什么,我可以告诉它我想要合并的优先级吗?
我有一个资源表(比方说汽车),我想原子地声称.然后,我想知道我刚才声称的资源.
如果每个用户有一个资源限制,我可以执行以下操作:
UPDATE cars SET user = 'bob' WHERE user IS NULL LIMIT 1
SELECT * FROM cars WHERE user = 'bob'
Run Code Online (Sandbox Code Playgroud)
这样,我原子地声明了资源,然后我可以看到我刚刚声明了哪一行.
当'bob'可以声称多辆车时,这不起作用.我意识到我可以获得已经由鲍勃声称的汽车列表,声称另一辆汽车,然后SELECT再次看到发生了什么变化,但这感觉很乱.
我想知道的是,有什么方法可以看到我刚刚使用上一次更新更新了哪些行?
如果做不到这一点,还有其他一些技巧可以原子地声称一行吗?我真的想避免使用SERIALIZABLE隔离级别.如果我做这样的事情:
1 SELECT id FROM cars WHERE user IS NULL
2 <here, my PHP or whatever picks a car id>
3 UPDATE cars SET user = 'bob' WHERE id = <the one i picked>
Run Code Online (Sandbox Code Playgroud)
这就REPEATABLE READ足够了吗?换句话说,我可以保证其他一些交易不会声明我的软件在第2步中选择的行吗?
我想知道如何在preg_match中检查一个字符串被分解成一个数组,看它是否以www开头.我已经有一个检查http:// www.
function isValidURL($url)
{
return preg_match('|^http(s)?://[a-z0-9-]+(.[a-z0-9-]+)*(:[0-9]+)?(/.*)?$|i', $url);
}
$stringToArray = explode(" ",$_POST['text']);
foreach($stringToArray as $key=>$val){
$urlvalid = isValidURL($val);
if($urlvalid){
$_SESSION["messages"][] = "NO URLS ALLOWED!";
header("Location: http://www.domain.com/post/id/".$_POST['postID']);
exit();
}
}
Run Code Online (Sandbox Code Playgroud)
谢谢!斯特凡
有没有办法暂停一个进程(从一个可执行文件运行),以便它在暂停时停止cpu加载,并等待它被取消暂停继续它的工作?可能是在python中,或者以某种方式可以通过python访问.
我在python中创建稀疏文件如下:
>>> f = open('testfile', 'ab')
>>> f.truncate(1024000)
>>> f.close()
Run Code Online (Sandbox Code Playgroud)
文件完成后,占用0个磁盘空间,但其inode大小设置为我的截断值(1000K):
igor47@piglet:~/test$ ls -lh testfile
-rw-r--r-- 1 igor47 igor47 1000K 2010-07-09 04:02 testfile
igor47@piglet:~/test$ du -hs testfile
0 testfile
Run Code Online (Sandbox Code Playgroud)
如何在python中获取文件的实际空间使用量(分配大小)?该stat调用返回文件的表观大小,我不知道如何获得除了读取整个文件之外的其他实际用法(它可能会变得非常大)
>>> os.stat('testfile').st_size
1024000
Run Code Online (Sandbox Code Playgroud) 我正在使用chef属性为我的服务生成配置.但是,在某些时候,我需要将属性mash转换为简单的ruby哈希.这曾经在Chef 10中正常工作:
node.myapp.config.to_hash
Run Code Online (Sandbox Code Playgroud)
但是,从Chef 11开始,这不起作用.只有属性的顶级转换为散列,然后嵌套值保持不可变的mash对象.修改它们会导致这样的错误:
Chef :: Exceptions :: ImmutableAttributeModification ------------------------------------------- -----如果未指定要设置的优先级,则节点属性是只读的.要设置属性,请使用类似`node.default ["key"] ="value"'的代码
我已经尝试了一些解决这个问题的方法,但是没有用:
node.myapp.config.dup.to_hash
JSON.parse(node.myapp.config.to_json)
Run Code Online (Sandbox Code Playgroud)
json解析hack,看起来应该很好用,导致:
JSON::ParserError
unexpected token at '"#<Chef::Node::Attribute:0x000000020eee88>"'
Run Code Online (Sandbox Code Playgroud)
有没有任何实际可靠的方法,除了在每个cookbook中包含嵌套解析函数,将属性转换为简单,普通,好的旧ruby哈希?
我经常发现自己想要创建一个表格表 - 一堆行,每行是一个单独的表单,有自己的字段和提交按钮.例如,这是一个宠物店应用示例 - 想象一下这是一个结账屏幕,您可以选择更新您选择的宠物的数量和属性,并在退房前保存您的更改:
Pet Quantity Color Variety Update
snake 4 black rattle update
puppy 3 pink dalmatian update
Run Code Online (Sandbox Code Playgroud)
我希望能够使用看起来像这样的HTML来做到这一点:
<table>
<thead><tr><th>Pet</th> <th>Quantity</th> <th>Color</th> <th>Variety</th> <th>Update</th></tr></thead>
<tbody>
<tr>
<form>
<td>snake<input type="hidden" name="cartitem" value="55"></td>
<td><input name="count" value=4/></td>
<td><select name="color"></select></td>
<td><select name="variety"></select></td>
<td><input type="submit"></td>
</form>
</tr>
</tbody>
</table>
Run Code Online (Sandbox Code Playgroud)
这基本上是一个表格,每行一个表格.点击更新一次允许您更新该特定行(这不是一个真实的例子,我的真实应用程序确实需要行的独立性).
但这不是有效的HTML.根据规范,a <form>必须完全位于a <td>或完全位于a之外<table>.这个无效的html打破了javascript库,是一个巨大的痛苦处理.
我最终创建一个表来包含列标题,然后为每个表单创建一个表.但这需要固定的列宽,使输入排列整齐的列,这是低于标准的.你最终如何处理这个问题?我缺少一个明显的简单解决方案吗?如何制作表格表格?
我有一个我从git存储库管理的项目.我们使用progit分支策略(如接受的答案中所述,这里:小开发团队的Git分支策略),其中一个分支是生产分支,另一个分支是开发/测试分支.我们使用fabric部署代码.
当我们准备使用git创建新的生产版本时,我们将开发/测试分支合并到生产分支中,然后使用结构部署生产分支.问题是开发和生产之间存在代码差异 - 一些徽标更改,一些不同的数据库主机/凭据等等.我一直在保存包含差异的.patch文件,并且在部署生产环境时使用结构应用补丁,但这不能很好地工作.特别是,如果补丁周围的某些代码发生了变化,它将完全失败 - 补丁无法应用,我的部署将中止.
我一直在想我是否应该直接将所有更改应用到生产分支?这有什么缺点?
我关心的一个特殊用例是我们是否需要制作修补程序.我们目前通过从生产环境分支,进行更改,然后将该分支合并回开发和生产来实现这一目标.如果生产分支与开发分支不同,那么当修补程序合并到开发中时,这些更改是否会被拉入开发分支?
我正在使用python的svgwrite生成SVG图形.每当我想要画一些东西时,我发现自己做了这个丑陋的尴尬事情:
line = drawing.line(start = "%dmm" % start, end = "%dmm" % end)
Run Code Online (Sandbox Code Playgroud)
我希望我能做到:
line = drawing.line(start = start, end = end)
Run Code Online (Sandbox Code Playgroud)
有没有办法将整个svg绘图的默认单位设置为'mm'?
python ×3
chef-infra ×2
atomic ×1
attributes ×1
branch ×1
cad ×1
chef-recipe ×1
coding-style ×1
deployment ×1
fabric ×1
file ×1
filesize ×1
flat-file ×1
forms ×1
git ×1
hash ×1
history ×1
html ×1
macos ×1
mysql ×1
php ×1
preg-match ×1
process ×1
regex ×1
resources ×1
ruby ×1
signals ×1
sparse-file ×1
svg ×1
transactions ×1
url ×1