我们的自动构建在Jenkins上运行.构建本身在从属服务器上运行,从服务器通过SSH执行.
我收到一个错误:
00:03:25.113 [codesign-app] build/App.app: User interaction is not allowed.
Run Code Online (Sandbox Code Playgroud)
我已经尝试了迄今为止我在其他帖子中看到的所有建议:
在所有情况下,我都会得到同样的错误.
为了诊断问题,我尝试在我的本地终端上运行"security unlock-keychain"命令,发现它实际上并没有解锁钥匙串 - 如果我查看Keychain Access,锁定符号仍然存在.无论我是在命令行上传递密码还是让它提示我,都是这种情况.使用GUI解锁相同的钥匙串将提示我输入密码然后解锁.另外,如果我运行"security lock-keychain",我会在运行命令后立即看到键锁.这让我觉得解锁钥匙串实际上并不起作用.我在Lion(我们用于构建奴隶)和Mavericks(我正在开发)上遇到相同的行为.
接下来,我尝试将-v添加到所有安全命令:
list-keychains "-d" "system" "-s" "/Users/tester/.secret/App.keychain"
Listing keychains to see if it was added: ((
"/Library/Keychains/System.keychain"
))
unlock-keychain "-p" "**PASSWORD**" "/Users/tester/.secret/App.keychain"
build/App.app: User interaction is not allowed.
Run Code Online (Sandbox Code Playgroud)
从这看起来,列表 - 钥匙链似乎是不起作用的.也许都不行.:/
这里有一个类似的问题.解决方案很有趣 - 在launchctl中将"SessionCreate"设置为true.但我不是在master上构建 - 我的构建过程是从一个slave构建机器上的SSH启动的.也许有一种命令行方式可以在运行"SessionCreate"时执行launchctl正在执行的操作?
我正在尝试更新到Rails 5,我收到以下弃用警告:
弃用警告:方法to_hash已弃用,将在Rails 5.1中删除,因为
ActionController::Parameters
不再继承哈希.使用此弃用行为会暴露潜在的安全问题.如果您继续使用此方法,则可能会在您的应用中创建可被利用的安全漏洞.相反,请考虑使用其中一种未被弃用的文档化方法:http://api.rubyonrails.org/v5.0.0/classes/ActionController/Parameters.html(从/ Data/Projects/portal/trunk/app中的column_header调用) /helpers/application_helper.rb:114)
警告所在的行如下所示:
link_to(name,
{
action: action_name,
params: params.merge({ order: key, page: nil })
},
{
title: "Sort by this field",
}) +
Run Code Online (Sandbox Code Playgroud)
如你所见,我不是在打电话to_hash
.也许Rails是.也许其他一些宝石.我无从谈论,因为他们认为不值得提供堆栈跟踪.(临提示-它通常是值得提供一个堆栈跟踪!)
所以无论如何,我跟着链接,打算找一个替代品,并且该merge
方法不会出现被弃用,但也许他们只是忘了记录弃用状态,所以我真的不能确定.
那么我应该做些什么来清除这个呢?
GSON似乎在做一些技巧,它查看我的JavaBeans的内部字段,而不是使用可公开访问的属性信息.不幸的是,这对我们来说不会飞,因为我们神奇创造的豆子里充满了私人田地,我不希望它存放下来.
@Test
public void testJson() throws Exception
{
Player player = new MagicPlayer(); //BeanUtils.createDefault(Player.class);
player.setName("Alice");
Gson gson = new GsonBuilder()
.registerTypeAdapter(Player.class, new PlayerTypeAdapter())
.create();
System.out.println(gson.toJson(bean));
}
private static class PlayerTypeAdapter implements JsonSerializer<Player>
{
@Override
public JsonElement serialize(Player player, Type type,
JsonSerializationContext context)
{
throw new RuntimeException("I got called, woohoo");
}
}
public static interface Player //extends SupportsPropertyChanges
{
public String getName();
public void setName(String name);
}
// Simple implementation simulating what we're doing.
public static class MagicPlayer implements Player
{ …
Run Code Online (Sandbox Code Playgroud) 我们的系统中有一些代码用于自动生成自签名证书到密钥存储区,然后由Jetty使用.如果给定主机的密钥已经存在,则没有任何反应,但如果它不存在,我们会生成一个新密钥,如下所示:
public void generateKey(String commonName) {
X500Name x500Name = new X500Name("CN=" + commonName);
CertAndKeyGen keyPair = new CertAndKeyGen("DSA", "SHA1withDSA");
keyPair.generate(1024);
PrivateKey privateKey = keyPair.getPrivateKey();
X509Certificate certificate = keyPair.getSelfCertificate(x500Name, 20*365*24*60*60);
Certificate[] chain = { certificate };
keyStore.setEntry(commonName, privateKey, "secret".toCharArray(), chain);
}
Run Code Online (Sandbox Code Playgroud)
只要密钥库中只有一个密钥和证书,这一切都可以正常工作.一旦你有多个密钥,当你尝试连接时会发生奇怪的事情:
java.io.IOException: HTTPS hostname wrong: should be <127.0.0.1>
Run Code Online (Sandbox Code Playgroud)
这是一个非常神秘的错误,但我终于设法通过编写连接到服务器的单元测试来跟踪它,并断言证书上的CN与主机名匹配.我发现非常有趣 - Jetty似乎随意选择向客户提供哪种证书,但是以一致的方式.
例如:
我编写了一些代码,这些代码循环遍历商店中的证书以将其打印出来,并发现它并非始终如一地选择第一个证书或类似的任何小问题.
那么它究竟使用什么标准呢?最初我认为localhost很特别,但第三个例子完全让我感到困惑.
我认为这是由KeyManagerFactory以某种方式决定的,在我的情况下是SunX509.
当我在JAVA中阅读System.nanoTime()API时.我找到了这一行:
一个应该使用t1 - t0 <0,而不是t1 <t0,因为数字溢出的可能性.
http://docs.oracle.com/javase/7/docs/api/java/lang/System.html#nanoTime()
比较两个nanoTime值
Run Code Online (Sandbox Code Playgroud)long t0 = System.nanoTime(); ... long t1 = System.nanoTime();
一个应该使用t1 - t0 <0,而不是t1 <t0,因为数字溢出的可能性.
我想知道为什么t1 - t0 < 0
防止溢出的最佳方法.
因为我读了一些比其他A < B
更优选的线程A - B < 0
.
Java Integer compareTo() - 为什么使用比较与减法?
这两件事情是矛盾的.
我想编写一些应用程序,让一些事情按计划进行。
每隔几分钟轮询一次 URL 进行更新似乎是一个相当常见的用例。不过,在这种特殊情况下,我只是想实现一个时钟。
这有效:
@Composable
fun App() {
var ticks by remember { mutableStateOf(0) }
// Not 100% happy about this unused variable either
val timer = remember {
Timer().apply {
val task = object : TimerTask() {
override fun run() {
ticks++
}
}
scheduleAtFixedRate(task, 1000L, 1000L)
}
}
MaterialTheme {
Text(
// A real application would format this number properly,
// but that's a different question
text = "$ticks"
)
}
}
Run Code Online (Sandbox Code Playgroud)
但我必须导入java.util.Timer
,所以它不会是可移植的。
Jetpack Compose …
timer kotlin android-jetpack-compose compose-desktop compose-multiplatform
(我知道这是一个重复的问题,但原始的海报问错了原因.我并不是说我正确地问它,但是让我们看看.)
我们有一个运行在非标准端口号上的Web服务.尽管用户似乎能够记住端口号,但偶尔他们会输入http:而不是https:.有人问我们是否可以在该端口上提供HTTP,然后在同一端口上将它们重定向到HTTPS.这听起来很邪恶......我喜欢可用性但感觉浏览器的工作应该是这样做的吗?
我见过的一个解决方案是"在Jetty面前编写自己的代理".这个解决方案可行,但我不认为它会运行良好,因为我不相信我能编写一个与Jetty本身一样高效的代理.此外,即使代理本身有效,所有数据仍然需要额外跳跃,这无论如何都会保证减慢流量.
有比这更好的方法吗?也许Jetty本身有一些协议检测逻辑可以被楔入的地方,这将允许利用它们的速度,同时还删除代理将引入的额外跳.
我们有很多字符串包含相同的子字符串,从关于检查日志或如何联系支持的句子到包含公司或产品名称的类似品牌的字符串.重复导致了我们自己的一些问题(主要是拼写错误或复制/粘贴错误),但它也会导致问题,因为它增加了翻译者必须翻译的文本数量.
我提出的解决方案是这样的:
public class ExpandingResourceBundleControl extends ResourceBundle.Control {
public static final ResourceBundle.Control EXPANDING =
new ExpandingResourceBundleControl();
private ExpandingResourceBundleControl() { }
@Override
public ResourceBundle newBundle(String baseName, Locale locale, String format,
ClassLoader loader, boolean reload)
throws IllegalAccessException, InstantiationException, IOException {
ResourceBundle inner = super.newBundle(baseName, locale, format, loader, reload);
return inner == null ? null : new ExpandingResourceBundle(inner, loader);
}
}
Run Code Online (Sandbox Code Playgroud)
ExpandingResourceBundle
委托实际资源包但执行{{this.kind.of.thing}}的转换以查找资源中的密钥.
每当你想要获得其中一个,你必须去:
ResourceBundle.getBundle("com/acme/app/Bundle", EXPANDING);
Run Code Online (Sandbox Code Playgroud)
这工作正常 - 一段时间.
最终发生的是一些新代码(在我们的例子中是自动生成的代码,它是由马蒂斯吐出来的)在不指定自定义控件的情况下查找相同的资源包.如果你编写一个简单的单元测试来调用它然后没有,这似乎是不可重现的,但它是在应用程序运行真实时发生的.不知何故,内部缓存ResourceBundle
弹出好的值并用破坏的值替换它.我还没弄清楚为什么Sun的jar文件是在没有调试信息的情况下编译的,所以调试它是一件苦差事.
我的问题:
有没有办法全局设置我可能不知道的默认ResourceBundle.Control?这样可以相当优雅地解决所有问题.
有没有其他方式优雅地处理这种事情,也许根本没有篡改ResourceBundle类?
这个新的Java 7 try-with-resources构造非常好.或者至少,这是很好的,直到一个例外走过来,毁了我的一天.
我终于把它归结为一个可重复的测试,它只使用JUnit + jMock.
@Test
public void testAddSuppressedIssue() throws Exception {
Mockery mockery = new Mockery();
final Dependency dependency = mockery.mock(Dependency.class);
mockery.checking(new Expectations() {{
allowing(dependency).expectedCall();
allowing(dependency).close();
}});
try (DependencyUser user = new DependencyUser(dependency)) {
user.doStuff();
}
}
// A class we're testing.
private static class DependencyUser implements Closeable {
private final Dependency dependency;
private DependencyUser(Dependency dependency) {
this.dependency = dependency;
}
public void doStuff() {
dependency.unexpectedCall(); // bug
}
@Override
public void close() throws IOException { …
Run Code Online (Sandbox Code Playgroud) 我们正在使用新的Java打印API,用于PrinterJob.printDialog(attributes)
向用户显示对话框.
想要下次保存用户的设置,我想这样做:
PrintRequestAttributeSet attributes = loadAttributesFromPreferences();
if (printJob.printDialog(attributes)) {
// print, and then...
saveAttributesToPreferences(attributes);
}
Run Code Online (Sandbox Code Playgroud)
但是,我通过这样做发现,有时候(我还没弄清楚)属性是如何在内部获得一些不良数据,然后当你打印时,你会得到一个什么都没有的白页.然后代码将中毒的设置保存到首选项中,并且所有后续的打印运行也会中毒设置.此外,练习的整个点,使新运行的设置与用户为上一次运行选择的设置相同,将被取消,因为新对话框似乎不使用旧设置.
所以我想知道是否有正确的方法来做到这一点.当然,Sun并不打算用户每次启动应用程序时都必须选择打印机,页面大小,方向和边距设置.
编辑以显示存储方法的实现:
private PrintRequestAttributeSet loadAttributesFromPreferences()
{
PrintRequestAttributeSet attributes = null;
byte[] marshaledAttributes = preferences.getByteArray(PRINT_REQUEST_ATTRIBUTES_KEY, null);
if (marshaledAttributes != null)
{
try
{
@SuppressWarnings({"IOResourceOpenedButNotSafelyClosed"})
ObjectInput objectInput = new ObjectInputStream(new ByteArrayInputStream(marshaledAttributes));
attributes = (PrintRequestAttributeSet) objectInput.readObject();
}
catch (IOException e)
{
// Can occur due to invalid object data e.g. InvalidClassException, StreamCorruptedException
Logger.getLogger(getClass()).warn("Error trying to read print attributes from preferences", e);
}
catch (ClassNotFoundException …
Run Code Online (Sandbox Code Playgroud) java ×7
jetty ×2
certificate ×1
code-signing ×1
comparison ×1
exception ×1
gson ×1
http ×1
https ×1
java-7 ×1
jenkins ×1
json ×1
kotlin ×1
macos ×1
math ×1
overflow ×1
port ×1
preferences ×1
printing ×1
ruby ×1
ssh ×1
ssl ×1
substitution ×1
swing ×1
timer ×1