小编maa*_*nus的帖子

使用浏览器缓存进行增量更新

客户端(AngularJS应用程序)从服务器获取相当大的列表.这些列表可能有数百或数千个元素,这可能意味着几兆字节未压缩(并且一些用户(管理员)获得更多数据).

我不打算让客户端得到部分结果,因为排序和过滤不应该打扰服务器.

压缩工作正常(大约10倍),因为列表不经常更改304 NOT MODIFIED,也有很多帮助.但是缺少另一个重要的优化:

由于列表的典型更改相当小(例如,修改两个元素并添加新元素),因此传输更改只是一个好主意.我想知道如何正确地做到这一点.

喜欢的东西GET /offer/123/items应该总是返回所有项目的报价号123,对不对?这里可以使用压缩和304,但没有增量更新.像GET /offer/123/items?since=1495765733听起来像是要走的路,但是浏览器缓存不会被使用:

  • 或者没有任何改变,答案是空的(缓存它是没有意义的)
  • 或者某些东西已经改变了,客户端更新了它的状态,并且从不再要求自1495765733以来的更改(并且缓存它更没意义)

显然,当使用"since"查询时,不会为"资源"缓存任何内容(原始查询只使用一次或根本不使用).

所以我不能依赖浏览器缓存,我只能使用localStorage或者sessionStorage,它有一些缺点:

  • 它被限制在几兆字节(浏览器HTTP缓存可能会更大并自动处理)
  • 当我达到极限时,我必须实施一些替换策略
  • 浏览器缓存存储了我没有得到的压缩数据(我必须重新压缩它们)
  • 它不适用于用户(管理员)获取更大的列表,因为即使单个列表可能已经超出限制
  • 它在注销时被清空(客户的要求)

鉴于HTML 5和HTTP 2.0,这是非常令人不满意的.我错过了什么?

是否可以将浏览器HTTP缓存与增量更新一起使用?

ajax rest caching http single-page-application

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

使用Pattern.LITERAL是否与Pattern.quote相同?

更确切地说:做

Pattern.compile(s, x | Pattern.LITERAL)
Run Code Online (Sandbox Code Playgroud)

Pattern.compile(Pattern.quote(s), x)
Run Code Online (Sandbox Code Playgroud)

为任何String s和任何其他标志创建等效的正则表达式x

如果没有,如何模拟Pattern.LITERAL?

java regex

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

如何找出要提交的文件的空间要求?

我要归档一个包含大量垃圾的旧项目.我希望我再也不需要它,但我想把所有重要的东西都置于版本控制之下.由于项目中的混乱,不容易说出什么是来源和什么可以消失(没有makefile,没有make clean,没有).所以我想把几乎所有的东西放在那里,只考虑最大的文件进行排除.

如何列出要提交(或暂存)的文件及其大小?

我可以写一个脚本或其他什么,但希望有一个更简单的解决方案.我在Cygwin下工作,唯一可用的gui是git gui不显示文件大小.否则它对我需要的东西来说是完美的.

git size commit

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

如何使用LoadingCache将递归转换为迭代?

我完全重写了这个问题,因为原来的问题无法解决.为了保持简单,我使用Fibonacci数字作为玩具示例.

平凡的递归缓存的计算一个很长的堆栈跟踪结束,正如预期.这就是为什么我想有这样一个抽象类IterativeLoadingCache,我可以扩展喜欢这里的类似

@Override
protected Integer computeNonRecursivelly(Integer key) {
    final Integer x1 = getOrEnqueue(key-1);
    final Integer x2 = getOrEnqueue(key-2);
    if (x1==null) return null;
    if (x2==null) return null;
    return x1+x2;
}
Run Code Online (Sandbox Code Playgroud)

并且它将在不使用递归的情况下处理所有缓存和计算.

真的不是在寻找斐波纳契数的有效计算.我需要一些允许使用缓存和递归函数的东西,其中递归深度可以任意高.

我已经有了一种解决方案,但它效率很低而且非常难看,所以我希望得到一些好的建议.如果其他人需要它或者已经实现它,我也很好奇.

java tree recursion caching guava

6
推荐指数
2
解决办法
1486
查看次数

Gradle testCompile with mockito找不到包

当我添加

dependencies {
    testCompile 'org.mockito:mockito-all:1.9.5'
}
Run Code Online (Sandbox Code Playgroud)

对我来说build.gradle,JAR文件被下载了,但是编译失败了

error: package org.mockito does not exist
Run Code Online (Sandbox Code Playgroud)

以及一堆后续错误.当我更换testCompilecompile,它的工作原理.我对Gradle还是比较初学者,但testCompile听起来对我来说也是对的.此外,

testCompile 'junit:junit:4.+'
testCompile 'com.google.guava:guava-testlib:18.+'
Run Code Online (Sandbox Code Playgroud)

工作得很好.有人能解释一下这里发生了什么吗?

java mockito gradle

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

通过自定义注释注入常量

我的代码中有一堆常量,用于我系统的各种可调属性.我正在将它们全部移动到中央.properties文件中.我目前的解决方案是有一个Properties.java静态加载.properties文件并公开各种getter方法,如下所示:

public class Properties {
    private static final String FILE_NAME = "myfile.properties";
    private static final java.util.Properties props;

    static {
        InputStream in = Properties.class.getClassLoader().getResourceAsStream(
                FILE_NAME);
        props = new java.util.Properties();
        try {
            props.load(in);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    public static String getString(Class<?> cls, String key) {
        return props.getProperty(cls.getName() + '.' + key);
    }

    public static int getInteger(Class<?> cls, String key) {
        return Integer.parseInt(getString(cls, key));
    }

    public static double getDouble(Class<?> cls, String …
Run Code Online (Sandbox Code Playgroud)

java annotations lombok

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

带别名的Hibernate查询

怎么了?

session.createCriteria(Composed.class, "main")
.createAlias("main.id.branch", "b1")
.add(Restrictions.eq("b1.owner", user))
.list();
Run Code Online (Sandbox Code Playgroud)

?相应的HQL工作正常

String hql = "select main from Composed as main"
        + "left join main.id.branch as b1 where b1.owner = ?";
session.createQuery(hql)
.setInteger(0, user.id().intValue())
.list();
Run Code Online (Sandbox Code Playgroud)

从Criteria开始,Hibernate没有创建任何连接和使用where b1x1_.owner_id=?,但是没有b1x1_任何地方,所以它失败了"无法准备语句".

这些课程相当简单

@Entity class Composed {
    @Id ComposedId id; // also tried @EmbeddedId
    ... irrelevant stuff
}

@Embeddable class ComposedId {
    @ManyToOne(optional=false) Branch branch;
    ... irrelevant stuff
}

@Entity class Branch {
    @Id Integer id;
    @ManyToOne(optional=false) User owner;
    ... irrelevant stuff …
Run Code Online (Sandbox Code Playgroud)

java hibernate criteria

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

这个CORS处理程序安全吗?

我写了这个简单的方法来处理我的简单服务器代理中的CORS.

private void handleCors(HttpServletRequest req, HttpServletResponse resp) {
  final String origin = req.getHeader("Origin");
  if (Strings.isNullOrEmpty(origin)) {
    return;
  }
  if (!origin.startsWith("http://localhost:")) {
    return;
  }
  resp.setHeader("Access-Control-Allow-Origin", origin);
  resp.setHeader("Access-Control-Allow-Credentials", "true");
  resp.setHeader("Access-Control-Expose-Headers", "Authorization");
  resp.setHeader("Access-Control-Allow-Headers", "Authorization, Content-Type");
}
Run Code Online (Sandbox Code Playgroud)

实际应用程序不需要它,它仅在手动测试时使用(带ionic serve).我想,这是安全的,因为除了原点是localhost之外什么都不做,但比抱歉更安全.

此外,findbugs抱怨响应分裂漏洞.我应该简单地使用URLEncoder.html#encode还是有更多内容吗?

一般去掉空格或包含空格的情况下做的没有加入CORS标头?

java cors

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

自定义绘制TCustomListbox项目

我正在重写一个VCL组件,显示TCustomListbox在Delphi 10.2中定制的Firemonkey.自定义使用了重写DrawItem,基本上添加了一些缩进并根据项目文本和索引设置文本颜色.

DrawItem让它变得相当容易,但在FMX中似乎没有这样的东西.我可以PaintChildren自己覆盖和绘制每个项目,但是它看起来不同,我必须自己处理滚动和一切.我刚刚开始使用FMX并且还没有源代码.

  • DrawItemFMX中有替代品吗?我可能错过了它.

  • 如果没有,它如何获得所需信息?基本上,要绘制的矩形和理想的使用样式.

问题

Hans的解决方案有效,但有一些重大问题:

颜色

设置颜色不起作用,文本始终为黑色.我尝试了各种可能性,包括这个:

PROCEDURE TMyItem.Paint;
BEGIN
  TextSettings.FontColor := TAlphaColorRec.Red;
  INHERITED;
END;
Run Code Online (Sandbox Code Playgroud)

速度

打开一个包含180个项目的框可能需要两秒钟.我们需要很多项目和它们的数量实际上是我们需要一个自定义框的原因(我们使用TEdit我们组件的一部分提供过滤).使用字符串的版本TMyItem更快(虽然可能比VCL版本慢),但使用这些项目似乎会减慢速度(它比填充类似的HTML列表慢).

或者是其他东西?没有来源,几乎没有文件,我无法分辨.

我试图缓存项目以供重用,但这没有帮助.

看起来使用自定义项实际上比使用字符串更快(以毫秒为单位):

nItems String TMyItem
   200    672      12
  2000   5604     267
 20000  97322   18700
Run Code Online (Sandbox Code Playgroud)

当内容多次更改时,速度问题似乎会累积.我正在使用FListBox.Items.Clear;,然后我尝试了

n := FListBox.Items.Count;
FOR i := 0 TO n-1 DO FListBox.ListItems[n-1-i].Free;
Run Code Online (Sandbox Code Playgroud)

最后FListBox.Clear;,这是最有意义的(我最后发现).最后,每件物品似乎需要2毫秒.

delphi vcl firemonkey delphi-10.2-tokyo

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

如何确保一个字段被正确封装?

我想知道是否有一种简单的方法可以找到直接访问字段的所有方法。更确切地说:

我想确保只有一种方法可以写入一个字段,并且只有一种方法可以读取它。所有其他访问都应使用这两个。

背景:当一个字段被写入时,我需要在某个地方记录这个事实,我可以使用生成的 setter 轻松地做到这一点,但我想确保我不会在某处绕过它。

它用于移动设备而不是服务器,所以我不想/不能使用接口或运行时字节码重写...

我知道,有 ASM,但 AFAIK 使用它意味着我想花更多的工作。我希望,有更好的方法。

更新

没想到,还得声明允许修改代码,但是内存比较紧。因此封装字段(例如,Java FX 样式)或进行备份太糟糕了。有很多领域,所以实际上任何需要接触它们的东西都不好。

我可以想象解析来源,这要么很复杂,要么容易出现误报,因为相同的标识符根据上下文具有不同的含义。它甚至可能被隐藏(例如,在声明同名变量的嵌套类中),但我很乐意更改代码以避免出现问题。

从类文件中获取结构化信息肯定会更好。

java encapsulation static-analysis

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