小编Era*_*dan的帖子

了解GenericTraversableTemplate和其他Scala集合内部

我和一个熟人Kotlin,Clojure和Java8粉丝交换了电子邮件,并问他为什么不是Scala.他提供了很多理由(Scala太学术化,功能太多,不是我第一次听到这个,我认为这是非常主观的)但他最大的痛点就是一个例子,他不喜欢他能用的语言不了解基本数据结构的实现,他给了LinkedList作为例子.

我看了看scala.collection.LinkedList并计算了我理解或有点理解的事情.

  • CanBuildFrom - 经过一番努力,我得到它,输入类,而不是历史上最长的遗书[1]
  • LinkedListLike - 我不记得我在哪里阅读它,但我确信这是有充分理由的

但后来我开始盯着这些

  • GenericTraversableTemplate - 现在我也在摸不着头脑......
  • SeqFactory,GenericCompanion - 好的,现在你失去了我,我开始理解他的观点

能够理解这一点的人能解释一下GenericTraversableTemplate SeqFactoryGenericCompanion在LinkedList的上下文中吗?它们的用途是什么,对最终用户有什么影响(例如我确信它们存在的原因很充分,这是什么原因?)

它们是出于实际原因吗?或者它是一个可以简化的抽象层次?

我喜欢Scala集合,因为我不必理解内部能够有效地使用它们.我不介意复杂的实现,如果它帮助我保持我的使用更简单.例如,如果我能够使用它来编写更清晰,更优雅的代码,我不介意支付复杂库的价格.但是更好地理解它肯定会很好.

[1] - Scala 2.8馆藏图书馆是"历史上最长的遗书"吗?

scala

12
推荐指数
1
解决办法
281
查看次数

为什么我在这个例子中得到"借来的价值不够长寿"?

编者注:此问题中的代码早于Rust 1.0.此代码的等效现代版本按原样编译.

我还在学习Rust的步骤,并对以下内容感到惊讶.

我无法理解为什么这段代码会编译:

use std::iter::AdditiveIterator;

fn main() {

    let range = [1,2,3,4,5,6,7,8,9];
    let sum = range.iter().map(|&x| x * x).filter(|&x| x % 2 == 0).sum();

    println!("{}", sum);
}
Run Code Online (Sandbox Code Playgroud)

虽然这不是:(只是向上移动.iter())

use std::iter::AdditiveIterator;

fn main() {

    let range = [1,2,3,4,5,6,7,8,9].iter();
    let sum = range.map(|&x| x * x).filter(|&x| x % 2 == 0).sum();

    println!("{}", sum);
}
Run Code Online (Sandbox Code Playgroud)

这会导致此错误:

test.rs:5:17: 5:36 error: borrowed value does not live long enough
test.rs:5     let range = [1,2,3,4,5,6,7,8,9].iter();
                          ^~~~~~~~~~~~~~~~~~~
Run Code Online (Sandbox Code Playgroud)

我确定它与Rust作用域等有关,但是我不确定我是如何通过将方法调用移动到另一行来产生影响的.

rust borrow-checker rust-obsolete

12
推荐指数
1
解决办法
2349
查看次数

Spark如何向工人发送关闭?

当我写RDD转换时,例如

val rdd = sc.parallelise(1 to 1000) 
rdd.map(x => x * 3)
Run Code Online (Sandbox Code Playgroud)

我理解x => x * 3只是一个Function1 的closure()需要是Serializable,我想我在某处编辑EDIT:它正好在文档中暗示:http://spark.apache.org/docs/latest/programming-guide. html#passing-functions-to-spark它被"发送"给工人执行.(例如Akka向线路工作人员发送"可执行的一段代码")

它是如何工作的?

有人在聚会上参加评论并说它实际上并没有发送任何序列化的代码,但是因为每个工作者都得到了jar的"副本",所以它只需要引用哪个函数来运行或类似的东西(但是我我不确定我是否正确引用了那个人

我现在对它的实际工作方式感到十分困惑.

所以我的问题是

  1. 如何将转型关闭发送给工人?通过akka序列化?或者他们"已经在那里",因为火花将整个超级罐发送给每个工人(听起来不太可能......)

  2. 如果是这样,那么罐子的其余部分是如何发送给工人的?这是"cleanupClosure"在做什么?例如,只向工作人员发送相关的字节码而不是整个uberjar?(例如,只有关闭的依赖代码?)

  3. 总而言之,在任何时候,确实会激发类似--jars路径中的罐子与工人同步吗?或者它是否向工人发送"恰当数量"的代码?如果确实发送了闭包,是否需要重新计算它们?或者每次安排任务时是否发送关闭任务?对不起,如果这是愚蠢的问题,但我真的不知道.

如果你能得到你的答案,请添加消息来源,我在文档中找不到它,我太谨慎了,只是通过阅读代码来尝试结束它.

apache-spark

12
推荐指数
1
解决办法
2769
查看次数

如何使用Google地图搜索我自己的位置数据(与Places搜索API功能相同,但对于我自己的"地点")

查看相关问题:谷歌地图自定义本地搜索/搜索控制

我知道我可以在Google地图中创建自定义位置和信息窗口,例如http://code.google.com/apis/ajax/playground/#info_windows_sharing_v3

我了解本地搜索可以找到附近的地方(公共地点),
例如http://code.google.com/apis/ajax/playground/#localsearch_with_markers

不过我的问题很简单:如何将两者结合起来?如何启用与本地/地点搜索功能相同的功能,但仅限于自定义标记位置(例如我自己的位置数据而不是Google的地方/本地数据)?

例如,如果我有一组自定义位置数据/标记(未发布到Google商家信息),如何允许用户查找相对于地址或他/她当前位置的自定义地点附近的列表?

google-maps google-maps-api-3 google-maps-markers google-local-search

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

spark在哪里寻找文本文件?

我认为加载文本文件只能从群集中的工作者/群组中完成(您只需要确保所有工作人员都可以访问相同的路径,方法是在所有节点上提供该文本文件,或者使用映射到的某个共享文件夹相同的路径)

例如spark-submit/ spark-shell可以从任何地方启动,并连接到spark master,你启动的机器spark-submit/ spark-shell(除了你处于"集群"部署模式之外,它也是我们的驱动程序运行的地方)与集群无关.因此,任何数据加载只能由工人进行,而不是在驱动程序机器上进行,对吗?例如,应该没有办法sc.textFile("file:///somePath")导致在驱动程序机器上查找文件的火花(同样,驱动程序在集群外部,例如在"客户端"部署模式/独立模式下),对吧?

嗯,这也是我想的......

我们演员

  • 机器A:驱动程序运行的地方
  • 机器B:两个火花主人和一个工人跑

第一幕 - 希望

当我从机器B启动一个spark-shell来激发BI上的主人得到这个:

scala> sc.master
res3: String = spark://machinB:7077

scala> sc.textFile("/tmp/data/myfile.csv").count()
res4: Long = 976
Run Code Online (Sandbox Code Playgroud)

第二幕 - 冲突

但是当我从机器A启动一个spark-shell时,指向BI上的spark master得到这个:

scala> sc.master
res2: String = spark://machineB:7077

scala> sc.textFile("/tmp/data/myfile.csv").count()
org.apache.hadoop.mapred.InvalidInputException: Input path does not exist: file:/tmp/data/myfile.csv
Run Code Online (Sandbox Code Playgroud)

确实/tmp/data/myfile.csv在机器A上不存在,但是机器A不在集群上,它只是驱动程序运行的地方

第三幕 - 惊奇

甚至更奇怪的是,如果我在机器A上提供此文件,它不会再抛出此错误.(相反,它创建了一个作业,但没有任务,只是由于超时而失败,这是另一个值得单独提问的问题)

Spark有什么方式可以解决我错过的问题吗?我认为连接到遥控器时火花壳,与你运行的机器无关.那么当我在机器A上提供该文件时,为什么错误会停止?这意味着sc.textFile的位置包括启动spark-shellspark-submit的位置(在我的情况下也是驱动程序运行的位置)?这对我来说毫无意义.但同样,我愿意学习新事物.

结语

tl; dr - sc.textFile("file:/ somePath")在机器A上运行一个驱动程序到机器B,C,D上的一个集群...(驱动程序不是集群的一部分)

看起来它正在寻找路径文件:/ somePath也在驱动程序上,是真的(还是仅仅是我)?那知道吗?这是设计的吗?

我有一种感觉,这是我的工作场所网络所特有的一些奇怪的网络/ VPN拓扑问题,但这仍然是我发生的事情,而且我完全混淆它是仅仅是我还是已知的行为.(或者我根本没有得到Spark如何工作,这总是一个选项)

apache-spark

11
推荐指数
1
解决办法
2976
查看次数

Hibernate查询缓存 - 对于不在二级缓存中的对象 - 有风险吗?有用?不好的做法?

与此问题相关

前提:

这些是我的假设,根据我的阅读,经验和理解,他们可能是错的,如果他们是,请评论,我会编辑问题.

  • 查询缓存主要与二级缓存一起使用
  • 查询缓存缓存查询+参数的标识符结果
  • 如果数据库已更改,则查询缓存存在风险,并且未将其反映到缓存中

题:

我有一个不在二级缓存中的对象.由于一些糟糕的编程或其他约束,加载对象的代码在同一个休眠会话中被多次调用.回顾是使用HQL查找查询,例如

 hibernateTemplate.find("from Foo f where f.bar > ?", bar);
Run Code Online (Sandbox Code Playgroud)

在添加查询缓存之前,如果上述代码在同一个Hibernate会话中被调用了N次,那么数据库就会有N次命中

然后我想看看如果添加查询缓存会发生什么:

 Query query = session.createQuery("from Foo f where f.bar > ?");
 query.setCacheable(true);
 query.setParameter(bar);
 query.list();
Run Code Online (Sandbox Code Playgroud)

当我添加查询缓存时,我注意到在同一个会话期间,hibernate不会再次访问数据库N次,每个会话只有一次.

  1. 所以我的第一个假设是Hibernate首先在Session Cache中搜索,然后在2nd Level Cache中搜索.这个假设是否正确?
  2. 我还假设如果Foo不在第二级缓存中的object()在数据库中被更改,那么查询缓存(跨会话范围)将返回错误的标识符,从而返回错误的对象.那是对的吗?
  3. 那么,对于包含不可变信息的查询,即使对于非2L缓存对象,使用查询缓存是否安全可行?(例如,其where子句包含将始终返回相同结果的条件的查询,例如,当ser_num和id对在创建后不更改时,"select p.ser_num where p.id =?")

顺便说一下,在相关问题中声称查询缓存不适用于会话缓存范围.我想知道这个说法或其他什么吗?

hibernate second-level-cache session-cache query-cache

10
推荐指数
1
解决办法
6470
查看次数

如何在Eclipse中的JSP/JSP标签中获取EL(表达式语言)内容辅助(自动完成)?

有没有办法,通过配置,升级或插件来获得JSP EL表达式的内容辅助?

例如

$ { CTRL+ SPACE...

要么

$ {pageContext中.CTRL+ SPACE...

等等...

eclipse jsp jsp-tags el

10
推荐指数
1
解决办法
3064
查看次数

在调试模式下启动时显示Eclipse无法连接到VM错误

Eclipse正在显示当我在调试模式下打开任何程序时无法连接到VM错误.这是异常堆栈

 java.net.SocketException: socket closed
    at java.net.PlainSocketImpl.socketAccept(Native Method)  //I dont know which socket is closed in my PC
    at java.net.PlainSocketImpl.accept(PlainSocketImpl.java:384)
    at java.net.ServerSocket.implAccept(ServerSocket.java:453)
    at java.net.ServerSocket.accept(ServerSocket.java:421)
    at org.eclipse.jdi.internal.connect.SocketTransportService.accept(SocketTransportService.java:95)
    at org.eclipse.jdi.internal.connect.SocketTransportImpl.accept(SocketTransportImpl.java:56)
    at org.eclipse.jdi.internal.connect.SocketListeningConnectorImpl.accept(SocketListeningConnectorImpl.java:135)
    at org.eclipse.jdt.internal.launching.StandardVMDebugger$ConnectRunnable.run(StandardVMDebugger.java:107)
    at java.lang.Thread.run(Thread.java:619)
Run Code Online (Sandbox Code Playgroud)

即使我的Localhost工作正常,我ping 127.0.01和localhost都工作正常,即使我重新启动我的电脑甚至得到相同的错误.不知道我的PC中关闭了哪个套接字.请帮助我..我正在使用eclipse 8.x.

java

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

我在哪里可以在Java EE 6中配置@Asynchronous调用后面的线程池?

我最近了解到,通过简单地添加注释,我可以轻松地使任何会话bean方法异步@Asynchronous.

例如

@Asynchronous
public Future<String> processPayment(Order order) throws PaymentException {
    ... 
}
Run Code Online (Sandbox Code Playgroud)

我知道Java EE 7添加了Concurrency Utilities,但在Java EE 6中,方法的线程池配置在@Asyncronous哪里?有没有办法设置超时?它是一个固定的线程池吗?一个缓存的?什么是优先事项?它可以在容器中的某个位置配置吗?

java java-ee java-ee-6 glassfish-3

10
推荐指数
1
解决办法
3285
查看次数

如何删除Linux中的文件,我所拥有的是文件描述符

我有一个int早先打开的文件描述符(via open),我需要删除该文件.

我真的必须先获取文件名并打电话remove吗?(例如,通过使用C中的文件描述符获取文件名中的技术)

或者是否有其他(linux特定的OK)方式完全基于文件描述符?

我搜索过,我能找到的最好的是上面的答案.

c linux

10
推荐指数
1
解决办法
6669
查看次数