长话短说,我厌倦了与之相关的荒谬的并发规则NSManagedObjectContext(或者更确切地说,它完全缺乏对并发性的支持以及如果你试图共享NSManagedObjectContext跨线程而爆炸或做其他不正确的事情),并且我正在尝试实现线程安全的变体.
基本上我所做的是创建一个子类来跟踪它创建的线程,然后将所有方法调用映射回该线程.这样做的机制有点令人费解,但问题的关键在于我有一些辅助方法,如:
- (NSInvocation*) invocationWithSelector:(SEL)selector {
//creates an NSInvocation for the given selector
NSMethodSignature* sig = [self methodSignatureForSelector:selector];
NSInvocation* call = [NSInvocation invocationWithMethodSignature:sig];
[call retainArguments];
call.target = self;
call.selector = selector;
return call;
}
- (void) runInvocationOnContextThread:(NSInvocation*)invocation {
//performs an NSInvocation on the thread associated with this context
NSThread* currentThread = [NSThread currentThread];
if (currentThread != myThread) {
//call over to the correct thread
[self performSelector:@selector(runInvocationOnContextThread:) onThread:myThread withObject:invocation waitUntilDone:YES];
}
else {
//we're okay to invoke …Run Code Online (Sandbox Code Playgroud) 我正在努力让以下NamedQuery工作:
@NamedQuery(name="MyEntity.findByUser", query="SELECT m FROM MyEntity m WHERE m.owner = :user OFFSET :offset LIMIT :limit")
Run Code Online (Sandbox Code Playgroud)
问题是,这会导致Hibernate在服务器启动时使用以下堆栈跟踪进行爆炸:
[INFO] [talledLocalContainer] java.lang.NullPointerException
[INFO] [talledLocalContainer] at org.hibernate.hql.ast.ParameterTranslationsImpl.getNamedParameterExpectedType(ParameterTranslationsImpl.java:63)
[INFO] [talledLocalContainer] at org.hibernate.engine.query.HQLQueryPlan.buildParameterMetadata(HQLQueryPlan.java:296)
[INFO] [talledLocalContainer] at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:97)
[INFO] [talledLocalContainer] at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:56)
[INFO] [talledLocalContainer] at org.hibernate.engine.query.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:72)
[INFO] [talledLocalContainer] at org.hibernate.impl.SessionFactoryImpl.checkNamedQueries(SessionFactoryImpl.java:400)
[INFO] [talledLocalContainer] at org.hibernate.impl.SessionFactoryImpl.<init>(SessionFactoryImpl.java:351)
[INFO] [talledLocalContainer] at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1291)
[INFO] [talledLocalContainer] at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:713)
[INFO] [talledLocalContainer] at org.hibernate.ejb.HibernatePersistence.createEntityManagerFactory(HibernatePersistence.java:121)
[INFO] [talledLocalContainer] at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:83)
[INFO] [talledLocalContainer] at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:60)
(...)
Run Code Online (Sandbox Code Playgroud)
经过一些反复试验后,我发现用文字值(分别为0和10)替换":offset"和":limit"工作正常.是否有这样的原因,有没有办法让命名参数在我的查询中工作?
我已经看到一些其他示例使用定位参数来动态设置命名查询中的偏移量和限制值,但我宁愿不让我的代码退化为一堆难以理解的query.setParameter(1, "someValue");废话.命名参数应该摆脱那种垃圾代码.
我想将UIView渲染成CGContextRef
-(void)methodName:(CGContextRef)ctx {
UIView *someView = [[UIView alloc] init];
MagicalFunction(ctx, someView);
}
Run Code Online (Sandbox Code Playgroud)
因此,这里的MagicalFunction应该将UIView(可能是它的图层)渲染到当前上下文中.
我怎么做?
提前致谢!
我正在浏览Android 的Phonegap源代码,并尝试验证他们的notification.alert()方法只是委托给本机JavaScript alert()函数.他们的代码做了:
Notification.prototype.alert = function(message, completeCallback, title, buttonLabel) {
var _title = (title || "Alert");
var _buttonLabel = (buttonLabel || "OK");
PhoneGap.exec(completeCallback, null, "Notification", "alert", [message,_title,_buttonLabel]);
};
Run Code Online (Sandbox Code Playgroud)
在我看来像"alert"将被解释为要调用的函数的名称exec(),但是exec()正在执行:
PhoneGap.exec = function(success, fail, service, action, args) {
try {
var callbackId = service + PhoneGap.callbackId++;
if (success || fail) {
PhoneGap.callbacks[callbackId] = {success:success, fail:fail};
}
//using: ["Notification", "alert", callbackId, true]
var r = prompt(PhoneGap.stringify(args),
"gap:"+PhoneGap.stringify([service, action, callbackId, true]));
//...
} catch …Run Code Online (Sandbox Code Playgroud) 我正在尝试从文件系统中读取二进制文件,然后使用JavaScript对其进行base64编码.我正在使用FileReader API来读取数据和此处的base64编码器.
我的代码似乎接近工作,问题是生成的base64数据是错误的.这是我到目前为止所得到的:
function saveResource() {
var file = $(".resourceFile")[0].files[0];
var reader = new FileReader();
reader.onload = function(evt) {
var fileData = evt.target.result;
var bytes = new Uint8Array(fileData);
var binaryText = '';
for (var index = 0; index < bytes.byteLength; index++) {
binaryText += String.fromCharCode( bytes[index] );
}
console.log(Base64.encode(binaryText));
};
reader.readAsArrayBuffer(file);
};
Run Code Online (Sandbox Code Playgroud)
这是我正在测试的文件(它是100x100蓝色方块):

根据在线base64解码器/编码器,该文件应编码为:
/ 9J/4AAQSkZJRgABAgAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCABkAGQDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4 + Tl5ufo6erx8vP09fb3 + PN6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3 + PN6/9oADAMBAAIRAxEAPwDxyiiiv3E8wKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoooo AKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA //ž
...而是我从JavaScript中获得的是:
W7/DmMO/w6AAEEpGSUYAAQIAAAEAAQAAw7/DmwBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDLDv8ObAEMBCQkJDAsMGA0NGDIhHCEyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMsO/w4AAEQgAZABkAwEiAAIRAQMRAcO/w4QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoLw7/DhADCtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDLCgcKRwqEII0LCscOBFVLDkcOwJDNicsKCCQoWFxgZGiUmJygpKjQ1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5esKDwoTChcKGwofCiMKJworCksKTwpTClcKWwpfCmMKZwprCosKjwqTCpcKmwqfCqMKpwqrCssKzwrTCtcK2wrfCuMK5wrrDgsODw4TDhcOGw4fDiMOJw4rDksOTw5TDlcOWw5fDmMOZw5rDocOiw6PDpMOlw6bDp8Oow6nDqsOxw7LDs8O0w7XDtsO3w7jDucO6w7/DhAAfAQADAQEBAQEBAQEBAAAAAAAAAQIDBAUGBwgJCgvDv8OEAMK1EQACAQIEBAMEBwUEBAABAncAAQIDEQQFITEGEkFRB2FxEyIywoEIFELCkcKhwrHDgQkjM1LDsBVicsORChYkNMOhJcOxFxgZGiYnKCkqNTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXrCgsKDwoTChcKGwofCiMKJworCksKTwpTClcKWwpfCmMKZwprCosKjwqTCpcKmwqfCqMKpwqrCssKzwrTCtcK2wrfCuMK5wrrDgsODw4TDhcOGw4fDiMOJw4rDksOTw5TDlcOWw5fD mMOZw5rDosOjw6TDpcOmw6fDqMOpw6rDssOzw7TDtcO2w7fDuMO5w7rDv8OaAAwDAQACEQMRAD8Aw7HDiijCosK/cTzDgMKiwoooAMKiwoooAMKiwoooAMKiwoooAMKiwoooAMKiwoooAMKiwoooAMKiwoooAMKiwoooAMKiwoooAMKiwoooAMKiwoooAMKiwoooAMKiwoooAMKiwoooAMKiwoooAMKiwoooAMKiwoooAMKiwoooAMKiwoooAMKiwoooAMKiwoooAMKiwoooAMKiwoooAMKiwoooAMKiwoooAMKiwoooAMKiwoooAMKiwoooAMKiwoooAMKiwoooAMKiwoooAMKiwoooAMKiwoooAMKiwoooAMKiwoooAMKiwoooAMKiwoooAMKiwoooAMKiwoooAMKiwoooAMKiwoooAMKiwoooAMKiwoooAMKiwoooAMKiwoooAMKiwoooAMKiwoooA8O/w5k =
如果我不得不冒险猜测我会说这个问题与二进制数据中的非打印字符有关(如果我对明文文档进行编码,则可以正常工作).但解决这个问题的最佳方法是什么?
编辑
看起来这可能是base64库本身的一个问题(如果不是这样,那么将如何Uint8Array解压缩到用于库调用的字符串中) …
Chrome的JavaScript控制台曾经有一个非常有用的功能,如果您输入当前范围内可见的任何功能的名称,它将打印该功能的完整定义.基本上如本答案中所述.
不久前(我认为至少几个月,可能更多)它停止这样做,然而,输入一个函数名称现在给出了一个非常无益的响应,如:
我知道我可以单击该行(或右键单击,然后选择"显示函数定义")以在"源"选项卡中显示函数定义,但与之前的内联函数定义相比,这是非常笨重的(对于工作流通常沿着'获取函数定义,复制/粘贴到控制台,更改一些内容,然后覆盖原始函数定义').
另一个技巧是+ ""在函数名称之后添加一个(jobClicked + ""而不是jobClicked代码),它在控制台中显示代码但丢失了所有语法高亮.
有没有办法让JavaScript控制台回到之前在JavaScript控制台内部显示完整函数定义的行为,语法高亮完整?
我正在尝试做一些似乎应该相对简单并且碰到一点墙的东西.
假设我有一个产品列表,我将其作为名称下的请求属性公开products.我们还要说每个产品都有一个id字段,并且我还有一堆请求属性以表格形式设置,selectedProduct_<product-id>以指示选择哪些.
我知道有更好的方法来表示这些信息,例如将所有选定的ID放入a Map并进行检查,但我们假设我无论出于何种原因都无法访问该方法.
所以我想做的是products只有在selectedProduct_...为当前产品设置属性时才迭代并发出一些标记.就像是:
<c:forEach var="product" items="${products}">
<c:if test="${! empty selectedProduct_${product.id}}">
<div class="productId">${product.id}</div>
</c:if>
</c:forEach>
Run Code Online (Sandbox Code Playgroud)
但当然这不起作用,因为它会消失${! empty selectedProduct_${product.id}}.
如果我将product-id硬编码到表达式中,将会起作用,例如:
${! empty selectedProduct_17}
...假设'17'是有效的产品ID.显然这不实用,但希望它说明了我想要实现的目标.基本上我需要:
selectedProduct_...循环中每次迭代使用的正确值forEach.<c:set var="key" value="selectedProduct_${product.id}"/>除了我不确定如何key使用它来获取具有该名称的request属性的值(没有在<% %>块中作弊和运行文字Java代码)之外,还有一些简单的事情.这可能使用纯JSP/JSTL吗?我知道我可以在其中运行一些Java代码<% %>来解决这个问题,但这似乎是非常糟糕的形式.当然存在更优雅的解决方案?
我正在尝试实现一个自定义JSP标记,它接受作为Collection对象的属性a 并将它们输出为JSON格式的数组(Collection提供一个getJsonString()返回该对象的JSON格式表示的方法中的每个对象).我的标签实现如下:
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ attribute name="objects" required="true" rtexprvalue="true" %>
<c:set var="output" value="" />
<c:forEach var="obj" items="${objects}">
<c:if test="${! empty showComma}">
<c:set var="output" value="${output}, " />
</c:if>
<c:set var="output" value="${output}${obj.jsonString}" />
<c:set var="showComma" value="yes" />
</c:forEach>
[${output}]
Run Code Online (Sandbox Code Playgroud)
...我想通过做类似的事情来使用它:
<myTaglib:jsonArray objects="${myCollection}" />
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试使用标记时,我得到一个堆栈跟踪说:
javax.el.PropertyNotFoundException: Property 'jsonString' not found on type java.lang.String
Run Code Online (Sandbox Code Playgroud)
所以它抱怨${obj.jsonString}表达,但我绝对不会传递一些Collection字符串.此外,如果我将其更改为${obj}我看到正在输出的正确对象类型,并且如果我将自定义标记的代码复制/粘贴到我想要使用它的JSP中,它可以正常工作,所以我真的不确定是什么继续在这里.
我假设我将如何传递Collection到自定义标签有一些问题,但我无法弄清楚它是什么.有任何想法吗?
我正在尝试使用一个NSInvocation从子类调用超类方法.涉及的代码相对简单,如下所示:
- (NSInvocation*) invocationWithSelector:(SEL)selector {
NSInvocation* call = [[NSInvocation alloc] init];
[call retainArguments];
call.target = super; //ERROR: use of undeclared identifier 'super'
call.selector = @selector(selector);
return call;
}
Run Code Online (Sandbox Code Playgroud)
这对我来说有点奇怪,因为我一直认为它super遵循的规则几乎相同self(即它可以被视为对相关对象的直接引用并分配给变量,用作返回值等) .看来实际情况并非如此.
无论如何,是否有任何简单的方法来让我NSInvocation的目标超类实现(我不能self用作目标,因为子类重写超类方法),或者我是否需要寻找其他方法?
上下文
我正在审查服务器端应用程序中用于扩展图像的一些遗留Java代码.直到最近它主要用于具有1024x768或更低分辨率的输入图像,并且在这种情况下它似乎运行良好(或者至少足够好).
然而,现在,许多被操纵的图像的分辨率范围从2592x1936(8MP)到6000x4000(24MP).这导致OutOfMemoryError在服务器上频繁报告,我认为这是由图像处理代码引起的.
测试用例
我把一个简单的测试应用程序放在一起,调用图像处理代码的方式与服务器相同(有一点需要注意;测试用例是单线程的,而服务器环境显然不是这样):
public static void main(String[] args) throws Exception {
File file = new File("test_fullres.png"); //8MP test image, PNG format
for (int index = 0; index < 1000; index++) {
File output = new File("target/images/img_" + index + ".jpg");
verifyImageIsValidAndScale(file, output, 1024, 768, true, 80);
if (index % 10 == 0) {
String memStats = "Memstats after " + index + " iterations:";
memStats += "\tFree Memory: " + (Runtime.getRuntime().freeMemory() / 1024.0 / 1024.0) + …Run Code Online (Sandbox Code Playgroud) java ×3
javascript ×3
ios ×2
jsp ×2
jstl ×2
android ×1
cgcontext ×1
cocoa-touch ×1
concurrency ×1
console ×1
cordova ×1
core-data ×1
custom-tag ×1
ejbql ×1
el ×1
file-upload ×1
filereader ×1
hibernate ×1
html5 ×1
image ×1
inheritance ×1
ipad ×1
iphone ×1
jquery ×1
jsp-tags ×1
memory ×1
nsinvocation ×1
objective-c ×1
prompt ×1
uiview ×1