小编its*_*dok的帖子

处理大量临时小文件

我有一个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缓存的标准解决方案是某种堆.有没有办法将其扩展到文件系统级别?是否有其他方法以一种更容易管理的方式实现它?

以下是我考虑的想法:

  1. 创建7个顶级目录,每周一个目录,每天清空一个目录.这会使缓存文件的查找时间增加7倍,使文件被覆盖时非常复杂,而且我不确定它对删除时间的作用.
  2. 将文件保存为MySQL表中的blob,其中包含名称和日期的索引.这似乎很有希望,但在实践中它总是比FS慢得多.也许我做得不对.

有任何想法吗?

linux filesystems caching

7
推荐指数
1
解决办法
752
查看次数

freemarker中的交替表行颜色

使用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会进入电子邮件消息.

templates freemarker

7
推荐指数
3
解决办法
2万
查看次数

用于生成进程的shell脚本,在SIGTERM上终止子进程

我想编写一个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

bash scripting sh long-running-processes sigterm

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

从db代码中删除样板

似乎每次我想执行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)

这真的是最好的方法吗?有没有办法至少减少一些混乱?

编辑:作为一些评论指出的那样,这个代码不长不够.

java jdbc

7
推荐指数
3
解决办法
2571
查看次数

使用一个64位数字唯一标识URL

这基本上是一个数学问题,但编程很相关:如果我有10亿个包含URL的字符串,并且我采用每个字符串的MD5哈希的前64位,我应该期望什么样的冲突频率?

如果我只有1亿个网址,答案会如何变化?

在我看来,碰撞将非常罕见,但这些事情往往令人困惑.

使用MD5以外的其他东西会更好吗?请注意,我不是在寻找安全性,只是一个很好的快速哈希函数.此外,MySQL中的本机支持很好.

编辑:不太重复

hash hash-collision birthday-paradox

7
推荐指数
1
解决办法
2059
查看次数

IE中的jQuery UI对话框和Flash

我一直在尝试让Zero ClipboardjQuery 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在零剪贴板代码中说"对象不支持这个属性或方法".

UPDATE

powtac的评论指向看起来很有前途的东西:

我忘记了自己的黄金法则:为了让Flash ExternalInterface在IE 7中工作,你必须在将EMBED/OBJECT HTML 附加到DOM 之后将其填充到DIV元素中 .愚蠢的IE.

但是,切换线.html(clip.getHTML(btn.width(), btn.height())).appendTo("#showme")没有帮助.即使在setTimeout以后添加Flash HTML也无济于事.我觉得我真的很亲近,不过......

javascript flash clipboard jquery-ui zeroclipboard

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

我可以使这个java pluck()方法更安全吗?

我写了这个实用功能:

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)

我的问题是,如果调用者输入的类型错误,则在调用者尝试从列表中获取对象之前不会抛出任何异常.理想情况下,我想ClassCastExceptionpluck方法本身抛出一个.但是,我没有看到在运行时访问列表类型的方法.

有没有一些技巧我可以用来确保调用者没有一个无效的列表?


编辑:所以使用我得到的反馈,一个安全的实现将是:

public static <T,F> List<F> pluck(String fieldName, …
Run Code Online (Sandbox Code Playgroud)

java generics reflection

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

Windows上的Cython pyximport错误

我正在使用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这样的文件告诉我.

mingw cython

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

如何在SimpleJdbcTemplate上设置QueryTimeout?

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)

有点满口,但完成工作.

更新:这确实比必要的更复杂.看到答案.

spring jdbc jdbctemplate

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

定期保存/刷新/提交 - 这个模式有名称吗?

我发现自己一次又一次地遇到类似的问题:有一些代码处理来自用户/网络/某种类型的产品的数据.出于效率原因,我不想打电话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 flush

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