小编Gre*_*Cat的帖子

容纳Java的最后N个元素的大小限制队列

关于Java库的一个非常简单快速的问题:是否有一个现成的类,它实现了Queue一个固定的最大大小 - 即它总是允许添加元素,但它会默默地删除头元素以容纳新添加元素的空间.

当然,手动实现它是微不足道的:

import java.util.LinkedList;

public class LimitedQueue<E> extends LinkedList<E> {
    private int limit;

    public LimitedQueue(int limit) {
        this.limit = limit;
    }

    @Override
    public boolean add(E o) {
        super.add(o);
        while (size() > limit) { super.remove(); }
        return true;
    }
}
Run Code Online (Sandbox Code Playgroud)

据我所知,Java stdlibs中没有标准的实现,但可能是Apache Commons中的那个或类似的东西?

java queue collections

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

Ruby:require vs require_relative - 在Ruby <1.9.2和> = 1.9.2中运行的解决方法的最佳实践

如果我想require在Ruby中使用相关文件并且希望它在1.8.x和> = 1.9.2中工作,那么最佳实践是什么?

我看到几个选项:

  • 只是去$LOAD_PATH << '.'忘记一切
  • $LOAD_PATH << File.dirname(__FILE__)
  • require './path/to/file'
  • 检查RUBY_VERSION<1.9.2,然后定义require_relativerequire,require_relative随后在需要的地方使用
  • 检查是否require_relative已存在,如果已存在,请尝试按上一种情况继续操作
  • 使用奇怪的结构 - 例如
    require File.join(File.dirname(__FILE__), 'path/to/file')
    Run Code Online (Sandbox Code Playgroud)
    它们似乎不能在Ruby 1.9中工作,因为,例如:
    $ cat caller.rb
    require File.join(File.dirname(__FILE__), 'path/to/file')
    $ cat path/to/file.rb
    puts 'Some testing'
    $ ruby caller
    Some testing
    $ pwd
    /tmp
    $ ruby /tmp/caller
    Some testing
    $ ruby tmp/caller
    tmp/caller.rb:1:in 'require': no such file to load -- tmp/path/to/file (LoadError)
        from tmp/caller.rb:1:in '<main>' …
    Run Code Online (Sandbox Code Playgroud)

ruby ruby-1.9 ruby-1.8

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

使用git repository作为数据库后端

我正在做一个处理结构化文档数据库的项目.我有一个类别树(约1000个类别,每个级别最多约50个类别),每个类别包含数千个(最多,比方说,~10000)结构化文档.每个文档都是几千字节的数据,采用某种结构化形式(我更喜欢YAML,但它也可能是JSON或XML).

该系统的用户可以进行多种操作:

  • 通过ID检索这些文档
  • 通过其中的一些结构化属性搜索文档
  • 编辑文件(即添加/删除/重命名/合并); 每个编辑操作都应记录为具有一些注释的事务
  • 查看特定文档的记录更改历史记录(包括查看更改文档的人员,时间和原因,获取早期版本 - 如果需要,可能还原为此版本)

当然,传统的解决方案是使用某种文档数据库(例如CouchDB或Mongo)来解决这个问题 - 然而,这个版本控制(历史)的东西诱惑我一个疯狂的想法 - 为什么我不应该使用git存储库作为一个这个应用程序的数据库后端?

乍一看,它可以像这样解决:

  • category = directory,document = file
  • 通过ID获取文档=>更改目录+读取工作副本中的文件
  • 使用编辑注释编辑文档=>通过各种用户进行提交+存储提交消息
  • history =>正常的git日志和旧事务的检索
  • search =>这是一个稍微棘手的部分,我想这需要定期将一个类别导出到关系数据库中,并对我们允许搜索的列进行索引

这个解决方案还有其他常见的陷阱吗?有没有人试图实现这样的后端(即任何流行的框架 - RoR,node.js,Django,CakePHP)?这个解决方案是否会对性能或可靠性产生任何影响 - 即它是否证明git比传统数据库解决方案慢得多,或者存在任何可扩展性/可靠性缺陷?我认为推送/拉取彼此存储库的这类服务器集群应该相当强大和可靠.

基本上,告诉我,如果这个解决方案将工作和为什么它会或不会做?

database git database-replication database-performance document-database

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

从Java String中删除所有不可打印字符的最快方法

StringJava中删除所有不可打印字符的最快方法是什么?

到目前为止,我已经尝试并测量了138字节,131个字符的字符串:

  • 字符串replaceAll()- 最慢的方法
    • 517009结果/秒
  • 预编译模式,然后使用匹配器 replaceAll()
    • 637836结果/秒
  • 使用StringBuffer,codepointAt()逐个获取代码点并附加到StringBuffer
    • 711946结果/秒
  • 使用StringBuffer,charAt()逐个获取字符并附加到StringBuffer
    • 1052964结果/秒
  • 预分配char[]缓冲区,charAt()逐个获取字符并填充此缓冲区,然后转换回String
    • 2022653结果/秒
  • 预分配2个char[]缓冲区 - 旧的和新的,一次获取现有String的所有字符,getChars()逐个迭代旧缓冲区并填充新缓冲区,然后将新缓冲区转换为String - 我自己的最快版本
    • 2502502结果/秒
  • 与2个缓冲区相同的东西 - 仅使用byte[],getBytes()并指定编码为"utf-8"
    • 857485结果/秒
  • 具有2个byte[]缓冲区的相同内容,但将编码指定为常量Charset.forName("utf-8")
    • 791076结果/秒
  • 与2个byte[]缓冲区相同的东西,但指定编码为1字节本地编码(几乎没有理智的事情要做)
    • 370164结果/秒

我最好的尝试如下:

    char[] oldChars = new char[s.length()];
    s.getChars(0, s.length(), oldChars, 0);
    char[] newChars = new char[s.length()];
    int newLen = 0;
    for (int j = 0; j < s.length(); …
Run Code Online (Sandbox Code Playgroud)

java string optimization performance micro-optimization

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

x86_64寄存器rax/eax/ax/al覆盖完整寄存器内容

正如广泛宣传的那样,现代x86_64处理器具有64位寄存器,可以以向后兼容的方式用作32位寄存器,16位寄存器甚至8位寄存器,例如:

0x1122334455667788
  ================ rax (64 bits)
          ======== eax (32 bits)
              ====  ax (16 bits)
              ==    ah (8 bits)
                ==  al (8 bits)
Run Code Online (Sandbox Code Playgroud)

这样的方案可以从字面上理解,即,总是可以使用指定的名称仅访问寄存器的一部分用于读取或写入目的,并且这将是高度逻辑的.实际上,对于高达32位的所有内容都是如此:

mov  eax, 0x11112222 ; eax = 0x11112222
mov  ax, 0x3333      ; eax = 0x11113333 (works, only low 16 bits changed)
mov  al, 0x44        ; eax = 0x11113344 (works, only low 8 bits changed)
mov  ah, 0x55        ; eax = 0x11115544 (works, only high 8 bits changed)
xor  ah, ah          ; eax = 0x11110044 (works, only high 8 …
Run Code Online (Sandbox Code Playgroud)

assembly x86-64 cpu-registers zero-extension

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

现代浏览器中当前的cookie限制是多少?

从2011年开始,现代浏览器的通用cookie限制是什么?我特别感兴趣的是:

  • 单个cookie的最大大小
  • 每个主机/域名+路径的最大cookie数
  • 每个主机/域名的最大cookie数
  • 给定浏览器中所有Cookie的最大数量/最大总大小

我知道RFC 2109指定:

  • 至少300个饼干
  • 每个cookie至少4096个字节(通过Set-Cookie标头的语法描述中构成cookie非终端的字符大小来衡量)
  • 每个唯一的主机或域名至少有20个cookie

但什么是现实世界的规格?

javascript browser cookies cross-browser limit

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

IntelliJ IDEA - 省略默认的Java类头生成

每次当我使用IDEA并使用普通的"New Java class"菜单选项创建Java类时,它会在类本身之前生成一个丑陋且无用的Javadoc样式头:

/**
 * Created by greycat on 18.03.14.
 */
Run Code Online (Sandbox Code Playgroud)

我可能会咆哮很多,为什么它没用,例如:

  1. 无论如何,我会在我的VCS中拥有作者身份和时间戳
  2. 它公然违反任何Javadoc文档实践(例如,使用@author@since标记)
  3. 它使用丑陋,模糊,特定于语言环境的日期格式

有没有办法禁用这种行为,即只创建普通,干净的类模板,没有这个标题?

java intellij-idea

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

从网页链接到PDF文档中的特定部分(锚点)

Adobe有一个标准,理论上指定从浏览器中单击的链接打开PDF文档,以打开PDF文档的特定部分(AKA"锚点","命名参考").如果想要引用大型PDF的特定部分(例如某些标准或规范),此功能应该非常有用.

但是,从我现在看来,对这个标准的支持几乎不存在.

例如,这些链接应在第3.2.6节"注释类型"中打开Scala参考PDF:

  1. http://www.scala-lang.org/docu/files/ScalaReference.pdf#subsection.3.2.6
  2. http://www.scala-lang.org/docu/files/ScalaReference.pdf#nameddest=subsection.3.2.6
  3. http://www.scala-lang.org/docu/files/ScalaReference.pdf#page=23

(Techincally,变体#3应该打开第23页,它本质上是相同的目的地)

是否有一种工作方式(可能有几个垫片,专有包装或其他任何东西)使这个工作在大多数系统上?如果我关心其他系统,Adobe Reader插件的使用份额是多少?

如果不可能,至少我想为每个平台(即Windows,Linux,Mac)找到一个可行的解决方案,如果他们希望能够使用命名的目标链接,我可以向我的网站的用户推荐.

从我测试过:

  • Windows,MSIE/Firefox/Chrome,Adobe Acrobat Reader插件 - 所有版本均适用于版本9+,但是:
    • MSIE有一个奇怪的缓存问题(即在缓存文档之前锚不起作用)
    • 旧版本不起作用
    • 它存在链接格式问题:通常,它应该是与真实Web服务器的常规绝对链接,以"http://"开头.相对链接,samba风格的链接(\\HOST\dir\file.pdf#something),"http"(或可能是"https")方案之外的任何其他内容都不起作用
  • Windows,任何设置为单独运行Adobe Acrobat Reader的浏览器都不起作用
  • Windows,任何浏览器,FoxIt Reader - 都不起作用
  • Windows,任何浏览器,CutePDF - 都不起作用
  • Linux/Konqueror/Okular - 只有变体#1有效
  • Linux,设置为运行Okular或任何其他PDF查看器作为外部进程的任何其他浏览器都不起作用(因为浏览器不在命令行中传递任何"#arguments")
  • 任何操作系统,Firefox 15+ PDF.js内部PDF查看器 - 都不起作用

如果您尝试以各种不同的组合进行测试,我将不胜感激.

html pdf anchor hyperlink

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

Java中的非阻塞(异步)DNS解析

是否有一种干净的方法以非阻塞的方式异步解析Java中的DNS查询(通过主机名获取IP)(即状态机,而不是1个查询= 1个线程 - 我想同时运行数万个查询,但是没有运行成千上万的线程)?

到目前为止我发现了什么:

  • 标准InetAddress.getByName()实现是阻塞的,看起来标准Java库缺少任何非阻塞实现.
  • 在批量问题中解决DNS讨论了类似的问题,但找到的唯一解决方案是多线程方法(即一个线程在每个给定时刻只处理1个查询),这不是真正可扩展的.
  • dnsjava库也只是阻塞.
  • dnsjava有一些古老的非阻塞扩展,可以追溯到2006年,因此缺乏任何现代的Java并发性东西,例如Future范式使用,以及非常有限的仅限队列的实现.
  • dnsjnio项目也是dnsjava的扩展,但它也适用于线程模型(即1个查询= 1个线程).
  • asyncorg似乎是我迄今为止针对此问题找到的最佳解决方案,但是:
    • 它也是从2007年开始,看起来已经废弃了
    • 几乎没有任何文档/ javadoc
    • 使用许多非标准技术,如Fun

我错过了任何其他想法/实施?

澄清.我有一个相当大(每天几TB)的日志量.每个日志行都有一个主机名,可以来自互联网上的任何地方,我需要一个IP地址作为我的进一步统计计算的主机名.行的顺序并不重要,所以,基本上,我的想法是开始2个线程:首先迭代线:

  • 读一行,解析它,获取主机名
  • 发送查询到DNS服务器以解析给定的主机名,不要阻止回答
  • 将行和DNS查询套接字句柄存储在内存中的某个缓冲区中
  • 转到下一行

第二个线程将:

  • 等待DNS服务器回答任何查询(使用epoll/ kqueuelike技术)
  • 阅读答案,找到缓冲区中的哪一行
  • 将已解析IP的行写入输出
  • 继续等待下一个答案

Perl中的一个简单的模型实现AnyEvent向我展示了我的想法通常是正确的,我可以通过这种方式轻松实现每秒15-20K查询的速度(天真的阻塞实现每秒2-3次查询 - 只是为了比较 - 所以这就像4个数量级的差异).现在我需要在Java中实现相同的 - 我想跳过我自己的DNS实现;)

java dns asynchronous event-driven nonblocking

28
推荐指数
2
解决办法
8876
查看次数

在Scala中初始化2D(多维)数组

通过放置类似的内容,可以很容易地在Java中初始化2D数组(或者实际上是任何多维数组):

int[][] x = new int[][] {
        { 3, 5, 7, },
        { 0, 4, 9, },
        { 1, 8, 6, },
};
Run Code Online (Sandbox Code Playgroud)

它易于阅读,类似于2D矩阵等.

但是我如何在Scala中做到这一点?

最好的我可以想出看起来,更简洁:

val x = Array(
    Array(3, 5, 7),
    Array(0, 4, 9),
    Array(1, 8, 6)
)
Run Code Online (Sandbox Code Playgroud)

我在这里看到的问题:

  • 它一遍又一遍地重复"数组"(比如除了之外还有其他的东西Array)
  • 它需要,在每个Array调用中省略尾随
  • 如果我搞砸了,除了插入一些Array()在阵列的中间,它会好与编译器,但类型x将变得悄无声息Array[Any],而不是Array[Array[Int]]:

    val x = Array(
        Array(3, 5, 7),
        Array(0, 4), 9, // <= OK with compiler, silently ruins x
        Array(1, 8, 6)
    )
    
    Run Code Online (Sandbox Code Playgroud)

    有一个防范它,直接指定类型,但它看起来比在Java中更难过:

    val …
    Run Code Online (Sandbox Code Playgroud)

scala initialization multidimensional-array

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