我试图做一个EnumListField在电梯/录音/ Squeryl,类似MappedEnumList的LiftMapper.存储类型应为Long/BIGINT.我明白,如果我定义:
def classOfPersistentField = classOf[Long]
Run Code Online (Sandbox Code Playgroud)
然后Squeryl会知道它应该创建一个BIGINT列.我知道它用于setFromAny()设置值,传入Long.我没有得到的一件是:
它将如何读取该领域的价值?如果它使用valueBox,它将得到一个Seq[Enum#Value],它将不知道如何将其变成一个龙.
我如何告诉Squeryl将我转换Seq[Enum#Value]为Long,或者定义一个返回Long的"getter",并且不与"普通"getter冲突?
在Scala编译器插件中,我正在尝试创建一个实现预先存在的特征的新类.到目前为止我的代码看起来像这样:
def trait2Impl(original: ClassDef, newName: String): ClassDef = {
val impl = original.impl
// Seems OK to have same self, but does not make sense to me ...
val self = impl.self
// TODO: implement methods ...
val body = impl.body
// We implement original
val parents = original :: impl.parents
val newImpl = treeCopy.Template(impl, parents, self, body)
val name = newTypeName(newName)
// We are a syntheic class, not a user-defined trait
val mods = (original.mods | SYNTHETIC) &~ TRAIT …Run Code Online (Sandbox Code Playgroud) 我刚刚发现了HDF5格式,我正在考虑使用它来存储分布在Java应用服务器集群上的3D数据.我发现有几种可用于Java的实现,并想知道它们之间的差异:
Java HD5接口(JHI5)来自HDF组本身的Java包装器.
Nujan:纯Java NetCDF4和HDF5编写器(无法读取HDF5)
最重要的是,我想知道:
涵盖了多少本机API,本机API中不存在的任何限制?
如果支持"Parallel HDF5"?
加载3D数据后,每次访问3D阵列中的一个元素时,是否会获得"本机调用开销"?也就是说,数据实际上是变成了Java对象,还是留在"native/JNI memory"中?
是否知道特定实现的稳定性问题,因为本机代码崩溃通常会导致整个JVM崩溃?
我知道至少有两个字节码增强器在运行时修改"对象模型"以允许透明地执行事务.其中一个是Versant VOD的一部分,我每天都在工作中使用,另一个是Terracotta的一部分.可能还有很多其他的,例如在ORM中,但Versant在我的公司处理这个问题.
我的问题是,是否有这样一个开源API可以单独使用,独立于它的设计产品?你可以说一个"hackable"API.它应该只跟踪更改,而不是读取访问,这将显着减慢代码.换句话说,它不应该要求显式读/写锁定.这需要访问所有执行更改的类,而不仅仅是数据模型,或者需要在内存中保留某种形式的"先前版本"来进行比较.
我试图解决的问题是我有一个"大"(32K到256K)的对象图,它们在(NoSQL)DB中被"序列化".它们是长寿的,必须定期重新序列化才能拥有变化的"历史".但它们的序列化相当昂贵,而且大多数变化都很小.
我可以每次完全序列化它们并在流上运行二进制差异,但这听起来非常占用CPU.更好的解决方案是修改模型上的写操作以协调更改的API,以便在存储初始"图像"之后,仅需要存储协议.
我发现了一些关于Apache Commons Beanutils来比较对象的问题,但这对于就地更改没有用; 我需要在每个"业务事务"之间完整地复制模型.
重申一下,我正在寻找同一JVM中的"内存中"API,它不涉及任何外部服务器应用程序.涉及本机代码的API如果在Win,Mac和Linux上可用,则可以.API当前不必独立打包 ; 它必须能够从"父项目"中提取它以形成一个独立的API(父项目许可证必须允许这样做).
我的对象图将涉及许多大型数组,因此需要有效支持.
这些更改不仅适用于审核,而是可以重播或撤消.更确切地说,使用反序列化的初始图和变更列表,我应该得到一个相同的结束图.此外,从结束图开始,应该可以通过反向应用更改返回到初始图.它使用完全相同的功能,但需要更改协议以保留旧值以及新值.
API许可证应与商业用途兼容.
[编辑]到目前为止,我没有得到有用的答案,它似乎不像我想要的存在.这让我只有一个选择:让它成为现实.当我有一个有效的实现时,我会在这里发布一个链接作为答案,因为这是我项目的下一步,如果没有它,我就无法继续前进.
[编辑]我偶然发现这个有点相关的问题:是否有一个可以"区分"两个对象的Java库?
我已经看过在Scala中登录的示例,它通常看起来像这样:
import org.slf4j.LoggerFactory
trait Loggable {
private lazy val logger = LoggerFactory.getLogger(getClass)
protected def debug(msg: => AnyRef, t: => Throwable = null): Unit =
{...}
}
Run Code Online (Sandbox Code Playgroud)
这似乎与具体的日志框架无关.虽然这样做了,但它还在每个想要进行日志记录的实例中引入了一个无关的lazy val ,这可能是整个应用程序的每个实例.这对我来说似乎太沉重了,特别是如果你有一些特定类型的"小实例".
有没有办法将记录器放在具体类的对象中,只需使用继承?如果我必须在类的对象中显式声明记录器,并从类/特性显式地引用它,那么我编写的代码几乎和我根本没有重用的代码一样多.
在非日志记录特定上下文中表示,问题是:
如何在特征中声明实现类必须具有X类型的单例对象,并且必须通过方法def x:X访问此单例对象?
我不能简单地定义一个抽象方法,因为在类中只能有一个实现.我希望在超级类中登录让我获得超类单例,并且登录子类会让我获得子类单例.或者更简单地说,我希望登录Scala能像Java中的传统日志一样工作,使用特定于执行日志记录的类的静态记录器.我目前对Scala的了解告诉我,如果不像在Java中那样完全相同,这是不可能的,没有太多使用"更好"的Scala带来的好处.
我正在阅读JVM调优,我发现JVM在执行GC时会继续移动对象.但Java对象之间相互引用,人们认为它们是作为指针实现的,但每次移动对象后,JVM都不可能遍历整个堆,并更新所有引用; 肯定会永远.那么它如何解析引用,如果引用没有改变,但对象的物理位置呢?
我已经阅读了很多关于JVM的内容,但在任何地方都没有解释,甚至暗示过.
[编辑]我的观点是,引用是单向的.从指针到指向是"瞬时",但反过来需要完整的堆扫描.虽然有可能,但似乎不太可能.如果10K对象在次要集合中存活,那么执行完整堆扫描需要多长时间才能更新对这些对象的引用10K次?必须使用某种优化的算法或结构.
我想在一个线程中分配内存,并安全地 "释放"指向另一个线程的指针,以便它可以读取该内存.
我正在使用一种翻译成C语言的高级语言.高级语言有线程(未指定的线程API,因为它是跨平台的 - 见下文)并支持标准的C多线程原语,如原子比较交换,但它没有真正记录(没有用法示例).这种高级语言的限制是:
现在,对于大型(不希望复制)或可变大小(我认为数组大小是类型的一部分)消息,这是不切实际的.我想发送这样的消息,这里是我想要实现它的大纲:
我需要知道如何确保这没有数据竞争.我的理解是我需要使用内存栅栏,但我不完全确定哪一个(ATOMIC_RELEASE,...)以及循环中的位置(或者我是否需要任何内容).
因为我的高级语言需要跨平台,所以我需要得到答案:
pthread_mutex_init和pthread_mutex_lock+pthread_mutex_unlockInitializeCriticalSection和EnterCriticalSection+LeaveCriticalSection如果它有帮助,我假设以下架构:
并使用以下编译器(您可以假设所有这些编译器的"最近"版本):
到目前为止,我只在Windows上构建,但是当应用程序完成后,我希望以最少的工作将其移植到其他平台.因此,我试图从一开始就确保跨平台兼容性.
这是我假设的工作流程:
asm.js即将到来.现在甚至有传言称Chrome很快就会完全支持它.
但到目前为止,它已被用于将C/C++源代码编译成JavaScript,它将以接近本机的速度运行(取决于您如何定义近原生...)
我一直计划使用GWT将我的Java代码转换为JavaScript,但现在我想知道当前是否存在将纯Java源代码编译为ASM.JS 的现有路径/过程,那会是什么?
人们可能想要的另一个原因是:在某些Android手机上,Java-to-ASM.js可能比Java-to-Dalvik运行得更快!
尽管多次阅读"Scala编程",我仍然经常发现书中未解释的重要Scala结构,如
@uncheckedVariance
@specialized
Run Code Online (Sandbox Code Playgroud)
和其他奇怪的结构一样
new { ... } // No class name!
Run Code Online (Sandbox Code Playgroud)
等等.
考虑到这本书是由斯卡拉"发明家"本人和其他人写的,我觉得这很令人沮丧.
我试图阅读语言规范,但它是为学者而不是练习程序员.它让我头晕目眩.
在Scala中有"Everything"编程的网站"没有告诉你"吗?
还有是日常斯卡拉博客,但它在一年前去世了.
我有一个特性,它接受一个类型参数,我想说实现这个特征的对象也将符合这个类型参数(使用泛型,以便Java的兼容性)
以下代码:
trait HandleOwner[SELF <: HandleOwner[SELF]] {
self : SELF =>
// ...
def handle: Handle[SELF]
}
trait Common[SELF <: Common[SELF]] extends HandleOwner[SELF] {
// ...
}
Run Code Online (Sandbox Code Playgroud)
给我以下错误:
illegal inheritance; self-type test.Common[SELF] does not conform to
test.HandleOwner[SELF]'s selftype SELF
Run Code Online (Sandbox Code Playgroud)
如果我将Common更改为:
trait Common[SELF <: Common[SELF]] extends HandleOwner[SELF] {
self : SELF =>
// ...
}
Run Code Online (Sandbox Code Playgroud)
然后错误就消失了.
为什么我必须在每个非具体类型中重复相同的声明.如果我有一个基类,并说"extends Comparable",我不必在每个派生类型中重复"extends Comparable",只要具体类实现compareTo方法即可.我认为这应该是一回事.我只是说扩展HandleOwner的类型也将是一个SELF,编译器应该只接受它,并考虑它,同时不要求每个非具体子类型再次重复相同的事情.
我这样做是为了避免使用类强制转换,但我将从字面上扩展每个类,我不会看到我应该重复这个声明数百甚至数千次!