在用Java编写的OpenOffice/LibreOffice Calc(Spreadsheet)的UNO扩展中,如何确定UDF(电子表格函数)实现中的调用单元?
备注
Application.Caller
这也是Apache OpenOffice Bugzilla上的功能请求
我正在开发独立于平台的应用程序.我收到一个文件URL*.在Windows上这些是:
file:///Z:/folder%20to%20file/file.txt
file://host/folder%20to%20file/file.txt
(UNC路径)
我正在使用new File(URI(urlOfDocument).getPath())
哪个适用于第一个,也适用于Unix,Linux,OS X,但不适用于UNC路径.
将文件转换为File(..)路径,与Java 6兼容的标准方法是什么?
......
*注意:我从OpenOffice/LibreOffice(XModel.getURL())收到这些URL.
考虑以下情况:我们使用Java 8并行流来执行并行forEach循环,例如,
IntStream.range(0,20).parallel().forEach(i -> { /* work done here */})
Run Code Online (Sandbox Code Playgroud)
并行线程的数量由系统属性"java.util.concurrent.ForkJoinPool.common.parallelism"控制,通常等于处理器的数量.
现在假设我们想限制特定工作的并行执行次数 - 例如因为该部分是内存密集型而内存约束意味着并行执行的限制.
限制并行执行的一种明显而优雅的方法是使用信号量(这里建议),例如,下面的代码片段将并行执行的数量限制为5:
final Semaphore concurrentExecutions = new Semaphore(5);
IntStream.range(0,20).parallel().forEach(i -> {
concurrentExecutions.acquireUninterruptibly();
try {
/* WORK DONE HERE */
}
finally {
concurrentExecutions.release();
}
});
Run Code Online (Sandbox Code Playgroud)
这很好用!
但是:在worker(at /* WORK DONE HERE */
)中使用任何其他并行流可能会导致死锁.
对我来说,这是一个意外的行为.
说明:由于Java流使用ForkJoin池,因此内部forEach正在分叉,并且连接似乎正在等待.但是,这种行为仍然是出乎意料的.请注意,如果设置"java.util.concurrent.ForkJoinPool.common.parallelism"
为1 ,并行流甚至可以工作.
另请注意,如果存在内部并行forEach,则它可能不透明.
问题: 这种行为是否符合Java 8规范(在这种情况下,它意味着禁止在并行流工作者中使用信号量)或者这是一个错误?
为方便起见:下面是一个完整的测试用例.除了"true,true"之外,两个布尔值的任何组合都有效,这会导致死锁.
澄清:为了明确这一点,让我强调一个方面:acquire
信号量不会发生死锁.请注意,代码包含
如果该段代码使用另一个并行流,则死锁发生在2. 然后在OTHER流内发生死锁.因此,似乎不允许一起使用嵌套并行流和阻塞操作(如信号量)!
请注意,记录并行流使用ForkJoinPool并且ForkJoinPool和Semaphore属于同一个包 - java.util.concurrent
(因此可以预期它们可以很好地互操作).
/*
* (c) Copyright Christian P. Fries, …
Run Code Online (Sandbox Code Playgroud) 注意:我已经在另一个SO帖子中解决了这个问题 - 在嵌套的Java 8并行流动作中使用信号量可能是DEADLOCK.这是一个错误吗? - 但是这篇文章的标题表明问题与使用信号量有关 - 这有点分散了讨论的注意力.我正在创建这个,以强调嵌套循环可能有性能问题 - 虽然这两个问题可能是一个共同的原因(也许是因为我花了很多时间来弄清楚这个问题).(我不认为它是重复的,因为它强调另一种症状 - 但如果你只是删除它).
问题:如果嵌套两个Java 8 stream.parallel().forEach循环并且所有任务都是独立的,无状态的等等 - 除了提交到公共FJ池 - 然后在并行循环内嵌套并行循环执行得更差而不是在并行循环内嵌套顺序循环.更糟糕的是:如果同步包含内循环的操作,您将获得DEADLOCK.
演示性能问题
如果没有"同步",您仍然可以观察到性能问题.您可以在以下网址找到演示代码:http://svn.finmath.net/finmath%20experiments/trunk/src/net/finmath/experiments/concurrency/NestedParallelForEachTest.java (有关更详细的说明,请参阅JavaDoc).
我们的设置如下:我们有一个嵌套的stream.parallel().forEach().
现在:将24个外循环任务提交给具有并行性的池8我们期望24/8*11 =最多33秒(在8核或更好的机器上).
结果是:
问题:你能证实这种行为吗?这是人们对框架的期望吗?(我现在更加小心,声称这是一个错误,但我个人认为这是由于ForkJoinTask的实现中的一个错误.备注:我已将此发布到并发兴趣(请参阅http:// cs.oswego.edu/pipermail/concurrency-interest/2014-May/012652.html),但到目前为止我没有得到确认).
证明了僵局
以下代码将为DEADLOCK
// Outer loop
IntStream.range(0,numberOfTasksInOuterLoop).parallel().forEach(i -> {
doWork();
synchronized(this) {
// Inner loop
IntStream.range(0,numberOfTasksInInnerLoop).parallel().forEach(j -> {
doWork();
});
}
});
Run Code Online (Sandbox Code Playgroud)
其中numberOfTasksInOuterLoop = 24
,numberOfTasksInInnerLoop = 240
,outerLoopOverheadFactor = 10000
和 …
试图从我的SVN回购结账给我
svn: E195019: Redirect cycle detected for URL ...
但是,当我在某个(特定)代理服务器后面时,似乎只会出现此错误.
正如在其他帖子中所讨论的(参见towise svn给我"检测到URL'域/ svn'的重定向循环'"),如果SVN DAV配置错误,例如使用SVNParentPath,则应该使用SVNPath,则会发生此错误.但是,我的配置似乎是正确的 - 据我所知 - 问题只发生在代理后面.
存储库的设置或多或少是标准的,例如,
ServerAlias svn.mydomain.com <Location /myrepo> DAV svn SVNPath /var/www/vhosts/mydomain.com/svn/myrepo AuthType Basic AuthName "mydomain svn" AuthUserFile /var/www/vhosts/svn.mydomain.com/conf/htpasswd-myproject # Allow read-only access to anyone, otherwise require # require authentication Require valid-user </Location>
我已经实现了UIApplicationDelegate
application:didFinishLaunchingWithOptions:
Run Code Online (Sandbox Code Playgroud)
和
application:handleOpenURL:
Run Code Online (Sandbox Code Playgroud)
根据规范,即
application:didFinishLaunchingWithOptions:
returns YES
Run Code Online (Sandbox Code Playgroud)
和
application:handleOpenURL: opens the URL.
Run Code Online (Sandbox Code Playgroud)
该代码在iOS 4下运行(在两种情况下,即,当应用程序启动时以及从暂停状态变为活动状态时).但是,代码在iOS 3.2下不起作用.
我想全局替换Java并行流默认使用的公共线程池,例如for
IntStream.range(0,100).parallel().forEach(i -> {
doWork();
});
Run Code Online (Sandbox Code Playgroud)
我知道可以通过向专用线程池提交此类指令来使用专用的ForkJoinPool(请参阅Java 8并行流中的自定义线程池).这里的问题是
Executors.newFixedThreadPool(10)
?备注:我之所以要更换F/J池,是因为它似乎有一个错误,使其无法用于嵌套并行循环.
嵌套并行循环的性能很差,可能导致死锁,请参阅http://christian-fries.de/blog/files/2014-nested-java-8-parallel-foreach.html
例如:以下代码导致死锁:
// Outer loop
IntStream.range(0,24).parallel().forEach(i -> {
// (omitted:) do some heavy work here (consuming majority of time)
// Need to synchronize for a small "subtask" (e.g. updating a result)
synchronized(this) {
// Inner loop (does s.th. completely free of side-effects, i.e. expected to work)
IntStream.range(0,100).parallel().forEach(j -> {
// do work here
});
}
});
Run Code Online (Sandbox Code Playgroud)
(即使在"在这里工作"没有任何额外的代码,因为并行性设置为<12).
我的问题是如何更换FJP.如果您想讨论嵌套并行循环,您可能会检查嵌套Java 8并行forEach循环执行不佳.这种行为有望吗?.
在我的项目中,我经常使用 Java Futures 处理并发任务。在一个应用程序中,每个并发任务在完成期间都需要相当大的内存块。由于一些其他设计选择,该内存是在线程外部创建的对象中创建和引用的(参见下面更详细的示例)。
令我惊讶的是,即使在未来任务(即它的计算线程)已经完成之后,future 仍然持有对这个对象的引用。也就是说:如果在别处没有对该对象的其他引用,则该对象将不会被释放,除非未来被释放 - 即使任务已完成。
我天真的想法是,限制并发线程的数量会自动限制任务持有的资源(内存)数量。这不是真的!
考虑下面的代码。在这个例子中,我创建了一些任务。在计算过程中,ArrayList(它是一个外部变量)的大小会增加。该方法返回一个Vector<Future>
. 即使任务已经完成,即使 ArrayList 的范围已经离开,Future 仍然持有对 ArrayList 的引用(通过FutureTask.sync.callable
)。
总结一下:
问题:释放通过 Future 持有的资源的最佳方式是什么?(当然,我知道可调用的局部变量在线程完成时被释放——这不是我所要求的)。
/*
* (c) Copyright Christian P. Fries, Germany. All rights reserved. Contact: email@christianfries.com.
*
* Created on 17.08.2013
*/
package net.finmath.experiments.concurrency;
import java.util.ArrayList;
import java.util.Vector;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
/**
* @author Christian Fries
*
*/
public class ConcurrencyTest { …
Run Code Online (Sandbox Code Playgroud) 我有一个VBA宏,它是从电子表格函数(用户定义函数,UDF)调用的.当从互联网下载电子表格并且用户相应地设置了"信任中心"设置时,电子表格将在所谓的"受保护的视图"中打开.该函数不会被调用.显示"启用编辑"按钮.如果按下该按钮,电子表格将"受信任"并正常重新打开,开始计算,从而调用用户定义的函数.
然而,在VBA函数的值Application.ActiveWorkbook
是Nothing
.这可以在调试器中验证.
由于我只需要读取电子表格的一些属性(如路径名称),我可以选择检查其可用性Application.ActiveProtectedViewWindow
应该引用工作簿的受保护版本.在调试器中,可以检查此对象.但是,在release(无调试)中运行的值Application.ActiveProtectedViewWindow
也是Nothing
.
这两种行为 - 尤其是第一种行为 - 似乎都是Excel 2010和2013中出现的错误(另请参阅MSDN论坛上的帖子).
问题:在启用编辑后,是否有办法获取活动工作簿的属性?
PS:作为对Siddharth Rout的一个很好的观察的后续,"ThisWorkbook"可能会起作用:在我的情况下,宏不是工作簿开放的一部分.UDF在XLA中定义.因此,ThisWorkbook将引用XLA.我需要获取ActiveWorkbook(=调用UDF的工作簿)而不是ThisWorkbook(=运行UDF的工作簿).
重要要求:
我的函数被称为用户定义函数,即执行顺序由Excel更新单元格确定.
该函数不是正在打开的工作簿的一部分.它是XLA的一部分.
我无法将任何代码添加到打开的工作簿中.
我们正在试验和评估 GitHub Classroom 和 GitHub Actions 的“自动评分”。
在我们的作业中,如果单元测试通过,学生会得到分数。所以 autograding.json 运行起来比较简单mvn test -Dtest=testClass#testmethod
。
在默认设置中,我对以下几点不满意:
如果构建(即测试)失败,GitHub (Actions) 会向您发送邮件,但如果测试成功,您将不会收到邮件。如果学生在通过自动评分(即单元测试)时得到反馈,那就太好了。如何才能做到这一点?
GitHub (Actions) 不会在邮件中提供任何详细信息,您必须访问操作页面。如果您能提供点数以及对错误的一些单行解释,那就更好了。如何才能做到这一点?
为了说明我想要什么:如果 JSON 允许指定成功时的反馈消息和失败时的反馈消息并且GitHub Action 邮件应包含此文本(如果不可能,则应该有一个格式良好的显示此文本的网页)。不幸的是,我没有找到有关 JSON 的任何文档。是否有 autograde.json 的任何文档?
我也对其他选择感兴趣。
以下是我们目前使用的 autograde.json 的示例:
{
"tests": [
{
"name": "Unit Tests - Testing your Application: DoubleVector - BasicFunctionality",
"setup": "",
"run": "mvn -q -B -Dtest=DoubleVectorFromArrayTest#testBasicFunctionality test",
"input": "",
"output": "",
"comparison": "included",
"timeout": 10,
"points": 0.5
},
{
"name": "Unit Tests - Testing your Application: DoubleVector - …
Run Code Online (Sandbox Code Playgroud)