我面临以下两难困境:
设计一种新的网络协议,用于服务器(Java软件)与桌面和移动客户端之间.移动客户端包括J2ME,Android以及未来甚至iPhone.
数据流是一个实时,恒定的流,还有更多不常见的部分.客户端显示此数据的波形以及不需要立即更新的数据.客户端也应该通过身份验证.
如果可能的话,我想避免从头开始创建完全自定义的TCP协议实现.
这些天人们通常建议做REST风格的一切,我也非常喜欢.在这种情况下,我有点犹豫不决:如何在REST之上实现恒定的数据流?一个分块的HTTP响应?
我也在考虑非明文协议(我正在替换的当前协议是二进制协议).那些当前的协议有其相当严重的问题,所以它们确实应该被替换.
Google协议缓冲区看起来非常适合处理低级细节,但我不确定它是否可以在Android中使用.而且我很确定iPhone实现也会遇到问题.
还有BEEP,但我认为它已经死了,我想它是否被广泛使用过.
有任何想法吗?
我想创建一个启动器/运行配置,它只在一组选定的测试类或选定的包中运行JUnit测试.现在看起来我必须为包含我想要运行的测试的每个包创建单独的运行配置.我还记得在旧版本的Eclipse中使用它.
是的,我知道:测试应该是有组织的,这样我就不会遇到这个问题,但现在重新组织源文件夹不是一个选择.
我正在使用Eclipse 3.4.2.
我刚开始使用Clojure,我想我会尝试在Suart哈洛韦的例子存储和检索结构列表,像第一件事就是打在这里.
如果我在属性字符串中使用没有空格的struct实例,那么我的spit/slurp结构哈希工作正常,如下所示:
(struct customer "Apple" "InfiniteLoop")
Run Code Online (Sandbox Code Playgroud)
但如果我用这个:
(struct customer "Apple" "Infinite Loop 1")
Run Code Online (Sandbox Code Playgroud)
我收到一个错误:
Exception in thread "main" clojure.lang.LispReader$ReaderException: java.lang.ArrayIndexOutOfBoundsException: 7 (test-storing.clj:19)
at clojure.lang.Compiler$InvokeExpr.eval(Compiler.java:2719)
at clojure.lang.Compiler$DefExpr.eval(Compiler.java:298)
at clojure.lang.Compiler.eval(Compiler.java:4537)
at clojure.lang.Compiler.load(Compiler.java:4857)
at clojure.lang.Compiler.loadFile(Compiler.java:4824)
at clojure.main$load_script__5833.invoke(main.clj:206)
at clojure.main$init_opt__5836.invoke(main.clj:211)
at clojure.main$initialize__5846.invoke(main.clj:239)
at clojure.main$null_opt__5868.invoke(main.clj:264)
at clojure.main$legacy_script__5883.invoke(main.clj:295)
at clojure.lang.Var.invoke(Var.java:346)
at clojure.main.legacy_script(main.java:34)
at clojure.lang.Script.main(Script.java:20)
Caused by: clojure.lang.LispReader$ReaderException: java.lang.ArrayIndexOutOfBoundsException: 7
at clojure.lang.LispReader.read(LispReader.java:180)
at clojure.core$read__4168.invoke(core.clj:2083)
at clojure.core$read__4168.invoke(core.clj:2081)
at clojure.core$read__4168.invoke(core.clj:2079)
at clojure.core$read__4168.invoke(core.clj:2077)
at chap_03$load_db__54.invoke(chap_03.clj:71)
at clojure.lang.AFn.applyToHelper(AFn.java:173)
at clojure.lang.AFn.applyTo(AFn.java:164)
at clojure.lang.Compiler$InvokeExpr.eval(Compiler.java:2714)
... 12 more
Caused by: java.lang.ArrayIndexOutOfBoundsException: 7 …
Run Code Online (Sandbox Code Playgroud) 我正在使用Emacs的Clojure模式与SLIME和swank-clojure.我有缩进问题.大多数时候缩进都是我想要的:当我按TAB时,它会缩进2个空格.但是,例如,在代理的情况下,我用TAB获得的缩进是巨大的:10个空格.例:
(defn- create-frame []
(let [frame (JFrame. "Hello Swing")
button (JButton. "Click Me")]
(.addActionListener button
(proxy [ActionListener] []
(actionPerformed [evt]
Run Code Online (Sandbox Code Playgroud)
...
代理方法也是如此,例如上面的actionPerformed.
这个设置在哪里,我该如何更改?据我所知,它必须是Clojure模式的问题.
我花了很多时间搞清楚我的代码出了什么问题.它在ert单元测试中运行得很好,但是当我在更大的环境中运行它时失败了.以下是一个有效的代码示例:
(defun func (my-var)
(with-temp-buffer
(message my-var)))
(func "z")
Run Code Online (Sandbox Code Playgroud)
这按预期打印z.现在我正在编写一个主模式,它有一些缓冲区局部变量.其中一个是my-var.此代码演示了我的问题:
(make-local-variable 'my-var)
(setq my-var "y")
(defun func (my-var)
(with-temp-buffer
(message my-var)))
(func "z")
Run Code Online (Sandbox Code Playgroud)
输出?没有,只有这个错误消息:
eval-buffer: Symbol's value as variable is void: my-var
Run Code Online (Sandbox Code Playgroud)
在这个例子中,很容易看到缓冲区局部变量以某种方式干扰动态绑定的my-var.虽然我有多个屏幕值的代码并不是那么容易:-)
所以我的问题是这里真的发生了什么?很明显,temp-buffer以某种方式从"父"缓冲区继承了一个变量,但为什么它有一个void值呢?我会理解它是否会以某种方式获得值"y",但这种行为对我来说就像一个错误.
PS.我正在运行最新的Aquamacs
我在数据库中有大量的行,我需要从中创建XML文档.我正在使用hibernate 3. Criteria和Query接口中的基本list()方法看起来很危险:我认为它几乎必须将所有记录读入内存,即使我只是迭代它们.还是有一些懒惰的装载魔法?如果没有,我似乎还剩下两个选项:使用来自Query的scroll()或iterate()(滚动也出现在Criteria中).如果我想要最小的SQL往返,则iterate看起来并不那么好:"第一个SQL查询仅返回标识符".我是对的,我必须使用scroll()吗?
我有一个奇怪的要求,能够在Linux机器上从Java监听许多网络接口,并确定其中一个是否接收某种类型的UDP数据包.我需要的输出数据是相关接口的IP地址.有没有办法在Java中这样做?
通过通配符地址(新的DatagramSocket(端口))进行监听没有帮助,因为虽然我获得了广播数据包,但我无法确定它们所通过的接口的本地IP地址.在绑定到某个接口(新的DatagramSocket(端口,地址))时收听广播根本不接收数据包.这种情况值得一个代码示例,显示我正在尝试做的事情:
Enumeration interfaces = NetworkInterface.getNetworkInterfaces();
while (interfaces.hasMoreElements()) {
NetworkInterface ni = (NetworkInterface) interfaces.nextElement();
Enumeration addresses = ni.getInetAddresses();
while (addresses.hasMoreElements()) {
InetAddress address = (InetAddress)addresses.nextElement();
if (address.isLoopbackAddress() || address instanceof Inet6Address)
continue; //Not interested in loopback or ipv6 this time, thanks
DatagramSocket socket = new DatagramSocket(PORT, address);
//Try to read the broadcast messages from socket here
}
}
Run Code Online (Sandbox Code Playgroud)
我还尝试使用基于接口的真实IP的开头构建的广播地址来初始化套接字,其余的根据正确的网络掩码:
byte [] mask = { (byte)255, 0, 0, 0 };
byte[] addrBytes = InetAddress.getByName("126.5.6.7").getAddress();
for (int i=0; i < 4; i++) …
Run Code Online (Sandbox Code Playgroud) 我正在使用ELPA的Clojure模式包.否则一切都很好,但我无法忍受paredit模式.我似乎无法轻易将其关闭,现在我只是为我打开的每个缓冲区禁用它.我尝试将此变量设置为nil:
(setq clojure-enable-paredit nil)
Run Code Online (Sandbox Code Playgroud)
但paredit仍然出现.有任何想法吗?
是否可以编写一个使用内部变量的Vector文字,以便正确评估变量,并且生成的Vector不仅包含变量的名称/符号?
例如:
(setq inner ["d" "e"])
["a" "b" inner]
Run Code Online (Sandbox Code Playgroud)
结果成:
["a" "b" inner]
Run Code Online (Sandbox Code Playgroud)
但我想要的是:
["a""b"["d""e"]]
我在Elisp之前做了一些Clojure编码,它按照我的预期工作:
(def inner ["d" "e"])
user=> ["a" "b" inner]
["a" "b" ["d" "e"]]
Run Code Online (Sandbox Code Playgroud)
在这里我对Elisp不了解的基本要素是什么?我当然可以解决这个问题,但我想了解发生了什么.
我正在试图弄清楚如何实现无限滚动列表.它将显示日历和事件,它应该从现在开始或选定日期开始.它应该可以在过去和将来的两个方向上滚动.这里的 OnScrollListener解决方案似乎工作得很好,如果我只需要去未来(索引只是变得更大).但我不明白我将如何回到过去.
这个解决方案似乎对我的情况非常浪费.getView被调用了数千次.也许ListView不是解决方案,我将不得不使用较低级别的代码.有任何想法吗?
编辑:getView被调用了数千次并不是后一种解决方案的错.但是,它仍会被调用太多次并且值不正确.如果我设置这样的选择:
myList.setSelection(Integer.MAX_VALUE的/ 2)
我得到索引从零开始的getView调用.例如,我得到这样的getView调用:
getView pos 0
...
getView pos 26
Run Code Online (Sandbox Code Playgroud)
然后
getView pos 1073741823
...
getView pos 1073741847
Run Code Online (Sandbox Code Playgroud)
哪些是正确的.然后:
getView pos 0
...
getView pos 26
Run Code Online (Sandbox Code Playgroud)
再次
这一切都发生在我滚动或触摸屏幕之前.似乎没有多大意义.