我有一个Web服务器,可以保存缓存文件并保存7天.文件名是md5哈希值,即正好是32个十六进制字符长,并保存在如下所示的树结构中:
00/
00/
00000ae9355e59a3d8a314a5470753d8
.
.
00/
01/
Run Code Online (Sandbox Code Playgroud)
你明白了.
我的问题是删除旧文件需要很长时间.我有一个日常的cron工作
find cache/ -mtime +7 -type f -delete
Run Code Online (Sandbox Code Playgroud)
这需要半天以上才能完成.我担心可伸缩性及其对服务器性能的影响.此外,缓存目录现在是我系统中的一个黑洞,偶尔捕获无辜du或者无辜find.
LRU缓存的标准解决方案是某种堆.有没有办法将其扩展到文件系统级别?是否有其他方法以一种更容易管理的方式实现它?
以下是我考虑的想法:
有任何想法吗?
使用freemarker进行备用行着色的好方法是什么?
这真的是最好的方式吗?
<#assign row=0>
<#list items as item>
<#if (row % 2) == 0>
<#assign bgcolor="green">
<#else>
<#assign bgcolor="red">
</#if>
<tr style='background-color: ${bgcolor}'><td>${item}</td></tr>
<#assign row = row + 1>
</#list>
Run Code Online (Sandbox Code Playgroud)
我试过这样做:
<#assign row=0>
<#list items as item>
<tr style='background-color: ${(row % 2) == 0 ? "green" : "blue"}'><td>${item}</td></tr>
<#assign row = row + 1>
</#list>
Run Code Online (Sandbox Code Playgroud)
但显然你不能在那里使用三元运算符.
注意:我想我之前应该提到它,但我不能使用css类或javascript,因为这个HTML会进入电子邮件消息.
我想编写一个shell脚本,在后台生成几个长时间运行的进程,然后挂起.收到SIGTERM后,我希望所有子进程也终止.
基本上,我想要一个"主过程".
这是我到目前为止所得到的:
#!/bin/sh
sleep 600 &
PID1="$!"
sleep 600 &
PID2="$!"
# supposedly this should kill the child processes on SIGTERM.
trap "kill $PID1 $PID2" SIGTERM
wait
Run Code Online (Sandbox Code Playgroud)
上面的脚本失败了trap: 10: SIGTERM: bad trap.
编辑:我正在使用Ubuntu 9.04
似乎每次我想执行db查询时,我都要编写以下内容:
Connection conn = null;
Statement stmt = null;
ResultSet rset = null;
try {
conn = dataSource.getConnection();
stmt = conn.prepareStatement(sql);
// ...set stmt params
rset = stmt.executeQuery();
while(rset.next()) {
// Do something interesting
}
} finally {
try { if (rset != null) rset.close(); } catch(SQLException e) { }
try { if (stmt != null) stmt.close(); } catch(SQLException e) { }
try { if (conn != null) conn.close(); } catch(SQLException e) { }
}
Run Code Online (Sandbox Code Playgroud)
这真的是最好的方法吗?有没有办法至少减少一些混乱?
编辑:作为一些评论指出的那样,这个代码不长不够.
这基本上是一个数学问题,但编程很相关:如果我有10亿个包含URL的字符串,并且我采用每个字符串的MD5哈希的前64位,我应该期望什么样的冲突频率?
如果我只有1亿个网址,答案会如何变化?
在我看来,碰撞将非常罕见,但这些事情往往令人困惑.
使用MD5以外的其他东西会更好吗?请注意,我不是在寻找安全性,只是一个很好的快速哈希函数.此外,MySQL中的本机支持很好.
编辑:不太重复
我一直在尝试让Zero Clipboard和jQuery UI Dialog一起玩得很好,而且它被证明是相当困难的.
零剪贴板允许通过在按钮上放置透明Flash影片从Javascript复制到剪贴板,以便用户在尝试单击按钮时单击Flash.如您在演示页面中所看到的,这非常适用并且跨浏览器.
但是,当尝试在jQuery UI对话框中使用它时,似乎出现了问题.
首先,我发现flash元素必须放在dialog元素中,否则Chrome和IE拒绝响应click事件.这意味着我不能使用glue便捷方法,但没关系.
但是,现在IE由于某种原因不会接受setTextFlash元素上的方法.
我所做的一个例子就在这里.我的代码从第300行开始,最相关的行是:
$("#showme").dialog({autoOpen: false, width: 550, height: 200});
$("#showme").bind("dialogopen", function() {
if($("#clipflash").length == 0) {
var btn = $("#d_clip_button");
$("<div id='clipflash' style='position:absolute; background: #f00; z-index: 9999' />")
.css(btn.position())
.width(btn.width())
.height(btn.height())
.html(clip.getHTML(btn.width(), btn.height()))
.appendTo("#showme");
}
});
Run Code Online (Sandbox Code Playgroud)
我把div染成了红色,所以更容易发现并将其z-index设置为9999,这是为了安全起见.然后我设置位置和大小以覆盖"按钮",并添加Flash元素的HTML clip.getHTML().
我现在已经工作了好几个小时,所以任何帮助都会非常感激.
几乎忘了:我的问题是IE7在零剪贴板代码中说"对象不支持这个属性或方法".
powtac的评论指向看起来很有前途的东西:
我忘记了自己的黄金法则:为了让Flash ExternalInterface在IE 7中工作,你必须在将EMBED/OBJECT HTML 附加到DOM 之后将其填充到DIV元素中 .愚蠢的IE.
但是,切换线.html(clip.getHTML(btn.width(), btn.height()))并.appendTo("#showme")没有帮助.即使在setTimeout以后添加Flash HTML也无济于事.我觉得我真的很亲近,不过......
我写了这个实用功能:
public static <T> List<T> pluck(String fieldName, List list)
throws NoSuchFieldException, IllegalAccessException {
if (list.isEmpty()) {
return new ArrayList<T>();
}
Class c = list.get(0).getClass();
Field f = c.getField(fieldName);
ArrayList<T> result = Lists.newArrayList();
for (Object object : list) {
result.add((T) f.get(object));
}
return result;
}
Run Code Online (Sandbox Code Playgroud)
我从underscore.js复制了这个想法.用例是:
ArrayList<Person> people = new ArrayList<Person>;
people.add(new Person("Alice", "Applebee"));
people.add(new Person("Bob", "Bedmington"));
people.add(new Person("Charlie", "Chang"));
List<String> firstNames = pluck("firstName", people);
Run Code Online (Sandbox Code Playgroud)
我的问题是,如果调用者输入的类型错误,则在调用者尝试从列表中获取对象之前不会抛出任何异常.理想情况下,我想ClassCastException从pluck方法本身抛出一个.但是,我没有看到在运行时访问列表类型的方法.
有没有一些技巧我可以用来确保调用者没有一个无效的列表?
编辑:所以使用我得到的反馈,一个安全的实现将是:
public static <T,F> List<F> pluck(String fieldName, …Run Code Online (Sandbox Code Playgroud) 我正在使用Cython完成我的第一步,并且已根据wiki中的说明将其安装在我的机器上.
通过Cython教程我得到了pyximport,它应该让cython编译变得非常简单.但是,当我尝试使用它时,我收到以下错误消息(重新格式化):
ImportError: Building module failed:
DistutilsPlatformError('
Python was built with Visual Studio 2003;
extensions must be built with a compiler than can generate compatible binaries.
Visual Studio 2003 was not found on this system. If you have Cygwin installed,
you can try compiling with MingW32, by passing "-c mingw32" to setup.py.',)
Run Code Online (Sandbox Code Playgroud)
所以我的问题是:有谁知道让pyximport使用mingw的方法?
请注意,mingw似乎安装得很好,制作Cython模块(使用setup.py)的好方法对我来说很有用,而且我甚至创建了distutils.cfg像wiki这样的文件告诉我.
Spring Framework有两个类似的类:JdbcTemplate是旧的Java 1.4类,而SimpleJdbcTemplate是更新的,具有更好的方法.
JdbcTemplate有一个方法setQueryTimeout,它基本上允许我访问基础Statement对象上具有相同名称的方法.
有没有办法用SimpleJdbcTemplate做类似的事情?
解决方案:根据skaffman的回答,我SimpleJdbcTemplate自己创建了一个对象JdbcTemplate,所以现在我可以做任何我想做的事.码:
JdbcTemplate jdbcTemplate = this.getJdbcTemplate();
jdbcTemplate.setQueryTimeout(30);
SimpleJdbcTemplate simpleJdbcTemplate = new SimpleJdbcTemplate(jdbcTemplate);
Run Code Online (Sandbox Code Playgroud)
有点满口,但完成工作.
更新:这确实比必要的更复杂.看到答案.
我发现自己一次又一次地遇到类似的问题:有一些代码处理来自用户/网络/某种类型的产品的数据.出于效率原因,我不想打电话flush()或打电话给commit()我收到的每一条数据,但只是偶尔打电话.
我通常会想出这样的代码:
class Processor {
private final static MAX_SAVE_PERIOD = 60000;
private final static MIN_SAVE_PERIOD = 20000;
private final static int MAX_BUFFER = 10000;
Arraylist<Data> dataBuffer = new Arraylist<Data>();
private long lastSave = 0;
public Saver() {
new Timer().schedule(new TimerTask() {
periodicSave();
}, MAX_SAVE_PERIOD, MAX_SAVE_PERIOD);
Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
public void run() {
periodicSave();
}
}));
}
public synchronized void processData(Data data) {
dataBuffer.add(data);
if(dataBuffer.size() >= MAX_BUFFER) {
saveData();
}
}
private synchronzied void periodicSave() { …Run Code Online (Sandbox Code Playgroud) java ×3
jdbc ×2
bash ×1
caching ×1
clipboard ×1
cython ×1
filesystems ×1
flash ×1
flush ×1
freemarker ×1
generics ×1
hash ×1
javascript ×1
jdbctemplate ×1
jquery-ui ×1
linux ×1
mingw ×1
reflection ×1
scripting ×1
sh ×1
sigterm ×1
spring ×1
templates ×1