我正在为Apache SSHd编写自定义文件系统类.当客户端尝试get
不存在的文件时,我遇到了问题.
我的对象返回doesExist() == false
.
这会导致服务器发送SSH_FX_NO_SUCH_FILE数据包以响应SSH_FXP_STAT.
使用OpenSSH客户端,这很好用:客户端报告"找不到文件'/ foo'".
但是,PSFTP(Putty SFTP客户端)对其请求进行管道传输,因此无论对STAT的响应如何,它都会发送一个OPEN数据包.然后它在生成的文件句柄上发送一个READ,它当前在我的代码中导致异常,这导致整个会话终止.
当尝试读取不存在的文件时,服务器响应应该是什么?
对于详细的道歉,这是有问题的Apache代码.我不想修改它 - 我的类是这里的SshFile"文件".但如果Apache代码肯定是错误的,我想我必须给他们一个补丁.
if (version <= 4) {
String path = buffer.getString();
int pflags = buffer.getInt();
// attrs
try {
SshFile file = resolveFile(path);
if (file.doesExist()) {
if (((pflags & SSH_FXF_CREAT) != 0) && ((pflags & SSH_FXF_EXCL) != 0)) {
sendStatus(id, SSH_FX_FILE_ALREADY_EXISTS, path);
return;
}
} else {
if (((pflags & SSH_FXF_CREAT) != 0)) {
if (!file.isWritable()) {
sendStatus(id, SSH_FX_FAILURE, "Can not create " + …
Run Code Online (Sandbox Code Playgroud) 我想从整个屏幕到TForm1画布绘制一个屏幕截图。
该代码在Delphi XE3中运行良好
procedure TForm1.Button1Click(Sender: TObject);
var
c,scr: TCanvas;
r,r2: TRect;
begin
c := TCanvas.Create;
scr := TCanvas.Create;
c.Handle := GetWindowDC(GetDesktopWindow);
try
r := Rect(0, 0, 200, 200);
form1.Canvas.CopyRect(r, c, r);
finally
ReleaseDC(0, c.Handle);
c.Free;
end;
Run Code Online (Sandbox Code Playgroud)
现在,我想先将屏幕快照复制到另一个画布。有没有办法做到这一点而不会出现此错误?
procedure TForm1.Button1Click(Sender: TObject);
var
c,scr: TCanvas;
r,r2: TRect;
begin
c := TCanvas.Create;
scr := TCanvas.Create;
c.Handle := GetWindowDC(GetDesktopWindow);
try
r := Rect(0, 0, 200, 200);
scr.CopyRect(r,c,r); <-- Error, canvas does not allow drawing
form1.Canvas.CopyRect(r, scr, r); <-- Error, canvas does not allow drawing …
Run Code Online (Sandbox Code Playgroud) 我的代码从数据库读取一些配置值。如果它们未定义(由 getValueFromDB 方法返回 null),我想将它们默认为配置文件中定义的值。
是否可以Optional.ofNullable().OrElse()
用于所有出现的getValueFromDB()
空检查并在为空的情况下分配默认值。或者这会是滥用/滥用Optional
吗?
我的Spring配置如下所示:
<jee:remote-slsb id="ejb1"
jndi-name="org.example.Ejb1"
business-interface="org.example.Ejb1"
environment-ref="ejb1Properties">
</jee:remote-slsb>
<util:properties id="ejb1Properties" location="classpath:ejb1.properties"/>
<jee:remote-slsb id="ejb2"
jndi-name="org.example.Ejb2"
business-interface="org.example.Ejb2"
environment-ref="ejb2Properties">
</jee:remote-slsb>
<util:properties id="ejb2Properties" location="classpath:ejb2.properties"/>
Run Code Online (Sandbox Code Playgroud)
...因为两个EJB可能使用不同的JNDI URL,不同的上下文工厂和身份验证凭据.ejb1.properties和ejb2.properties具有相同名称的属性,具有不同的值:
ejb1.properties:
java.naming.factory.initial=weblogic.jndi.WLInitialContextFactory
java.naming.provider.url=t3://example1:7101
java.naming.security.principal=id1
java.naming.security.credential=foo
ejb2.properties:
java.naming.factory.initial=weblogic.jndi.WLInitialContextFactory
java.naming.provider.url=t3://example2:7101
java.naming.security.principal=id2
java.naming.security.credential=bar
Run Code Online (Sandbox Code Playgroud)
但是,我希望我的用户有一个属性文件来维护,而不是两个.
显然,编写一个从核心属性文件生成ejb1.properties和ejb2.properties的启动脚本很容易.但有没有办法让Spring从单个文件获取属性,适当地映射名称?
在HK2中,配置注入的基本示例代码是这样的(在扩展的类中AbstractBinder
:
bind(BuilderHelper
.link(FooImpl.class) // the class of the object to be injected
.to(FooInterface.class) // identifies what @Inject fields to link to
.build());
Run Code Online (Sandbox Code Playgroud)
这导致HK2 FooImpl()
在需要创建时调用构造函数FooInterface
.
如果FooImpl没有构造函数怎么办?
FooImpl.getInstance()
fooFactory.create()
我看到ResourceConfig
有一个方法,bind(FactoryDescriptors factoryDescriptors)
但我不清楚构建FactoryDescriptors
对象的成语是什么,并且无法在线找到任何示例.
我在Tomcat中将Jersey应用程序部署为WAR.我得到了所有资源的404s,我正在试图找出原因.
由于我启用了Jersey日志记录,因此我看到一条日志消息,指示Jersey正在初始化:
INFO: org.apache.catalina.startup.HostConfig deployWAR
+INFO: Deploying web application archive myApp.war
INFO: org.glassfish.jersey.server.ApplicationHandler initialize
+INFO: Initiating Jersey application, version Jersey: 2.3.1 2013-09-27 07:50:09... [.logger.j2se.BizManagerHandler]
Run Code Online (Sandbox Code Playgroud)
从其他SO帖子来看,我希望看到这样的日志作为下一行:
INFO: Scanning for root resource and provider classes in the packages:
com.xxx.restful
Run Code Online (Sandbox Code Playgroud)
我没有看到此日志,也没有显示找到资源的任何日志 - 所以我不确定扫描是否正在发生.
该web.xml
范围内myApp.war
包含此:
<servlet>
<servlet-name>My Servlet</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>javax.ws.rs.Application</param-name>
<param-value>com.example.MyConfig</param-value>
</init-param>
<init-param>
<param-name>com.sun.jersey.config.property.packages</param-name>
<param-value>com.example.myApp.rest</param-value>
</init-param>
<init-param>
<param-name>com.sun.jersey.spi.container.ContainerRequestFilters</param-name>
<param-value>com.sun.jersey.api.container.filter.LoggingFilter</param-value>
</init-param>
<init-param>
<param-name>com.sun.jersey.spi.container.ContainerResponseFilters</param-name>
<param-value>com.sun.jersey.api.container.filter.LoggingFilter</param-value>
</init-param>
<init-param>
<param-name>com.sun.jersey.config.feature.Trace</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>com.sun.jersey.config.feature.Debug</param-name>
<param-value>true</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
Run Code Online (Sandbox Code Playgroud)
我想我的日志做看到的证据表明,这个servlet元素正在部署.
有没有理由我错过了为什么:
我正在和一些使用哈希引用的Perl搏斗.
最后,事实证明我的问题是这一行:
$myhash{$key} |= {};
Run Code Online (Sandbox Code Playgroud)
也就是说,"给$ myhash {$ key}一个对空哈希的引用,除非它已经有一个值".
然而,解除引用并尝试将其用作哈希引用会导致使用字符串作为哈希引用的解释器错误.
将其更改为:
if( ! exists $myhash{$key}) {
$myhash{$key} = {};
}
Run Code Online (Sandbox Code Playgroud)
......让事情奏效.
所以我没有问题.但我很好奇发生了什么事.
谁能解释一下?
我google了很多,但没有找到答案.这是我有的:
parentList.forEach(p -> {
childList
.stream()
.filter(c -> p.id() == c.parentId())
.<...continue working on stream...>
});
Run Code Online (Sandbox Code Playgroud)
我找不到如何用谓词替换"过滤器"部分的方法,因为我似乎需要将参数传递给Predicate?
我需要这样做.
public class MyClass{
private static IDictionary<String, Type> databaseAccessClasses
= new Dictionary<String, Type>();
private static IDictionary<String, Type> DatabaseAccessClasses
{
get { return DataAccessFactory.databaseAccessClasses; }
set { DataAccessFactory.databaseAccessClasses = value; }
}
}
Run Code Online (Sandbox Code Playgroud) 我想做FP等价的(伪代码):
var l1 = [ '1', '2', '3' ];
var l2 = [ 'a', 'b', 'c' ];
var table = []
for i in l1 {
var row = [];
for j in l2 {
row.push([i, j]);
}
table.push(row);
}
Run Code Online (Sandbox Code Playgroud)
导致table ==
:
[
[["1", "a"], ["1", "b"], ["1", "c"]],
[["2", "a"], ["2", "b"], ["2", "c"]],
[["3", "a"], ["3", "b"], ["3", "c"]]
]
Run Code Online (Sandbox Code Playgroud)
我已经实现了这个:
const headEquals = (x,y) => R.equals(R.head(x), R.head(y));
const transform = R.compose(
R.groupWith(headEquals),
R.xprod
);
const …
Run Code Online (Sandbox Code Playgroud) 我正在寻找一个ActiveMQ经纪人admin命令,告诉它暂停队列-即:
我找不到这样的命令。最常见的答案是应该在客户端对其进行管理-即找到每个消费者并停止它。其他答案是解决方法,例如操纵网络路由或防火墙,以便客户端和代理不再通信。
对其他消息队列的粗略调查表明,ActiveMQ在这方面并不罕见。
在我看来,可能无法实现此功能有两个原因:
是什么,为什么?
从任何字符串开始,我需要确定该字符串是否包含仅一个或多个指定单个字符的实例.例如"£"会通过我的测试,"wertf"会失败.我采取的方法如下:
string source = "any string";
char[] candidate = source.ToCharArray();
char validCharacter = '£';
if (candidate.Length > 0)
{
// (code removed) if candidate length = 1 then just test candidate[0] against validCharacter
bool isValid = true;
int index = 0;
while (index < candidate.Length - 1)
{
if (candidate [index] != validCharacter )
{
isValid = false;
break;
}
index++;
}
if (isValid)
{
// success, do what needs doing
}
}
Run Code Online (Sandbox Code Playgroud)
正如你所料,这是有效的,但我不禁觉得我可能会错过这里的一招.是否有一种更好,更简洁的方法,这样做不会牺牲上述的清晰度?
我有这样的旧式代码:
if (setContainer.getSet() == null) {
return null;
}
for (SetElement setElement : setContainer.getSet()){
if ("SomeString".equals(SetElement.getCode())) {
return setElement.getValue();
}
}
return null;
Run Code Online (Sandbox Code Playgroud)
我试过这个,但它不会检查Set是否为null:
setContainer.getSet()
.stream()
.filter(setValue -> "SomeValue".equals(setElement.getCode()))
.map(SetElement::getValue)
.findAny()
.orElse(null) ;
Run Code Online (Sandbox Code Playgroud)
据我所知,我应该使用,Stream.of()
但我不明白如何执行上面的代码,因为它总是返回Optional<Set<SetElement>>