小编Seb*_*iot的帖子

HowTo:Lift-Record-Squeryl中的自定义字段

我试图做一个EnumListField在电梯/录音/ Squeryl,类似MappedEnumListLiftMapper.存储类型应为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 record lift squeryl

92
推荐指数
1
解决办法
1185
查看次数

如何在Scala编译器插件中添加新类?

在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)

scala

36
推荐指数
1
解决办法
982
查看次数

Java中的HDF5:可用API之间有什么区别?

我刚刚发现了HDF5格式,我正在考虑使用它来存储分布在Java应用服务器集群上的3D数据.我发现有几种可用于Java的实现,并想知道它们之间的差异:

最重要的是,我想知道:

  • 涵盖了多少本机API,本机A​​PI中不存在的任何限制?

  • 如果支持"Parallel HDF5"?

  • 加载3D数据后,每次访问3D阵列中的一个元素时,是否会获得"本机调用开销"?也就是说,数据实际上是变成了Java对象,还是留在"native/JNI memory"中?

  • 是否知道特定实现的稳定性问题,因为本机代码崩溃通常会导致整个JVM崩溃?

java hdf5

27
推荐指数
2
解决办法
7922
查看次数

是否有对象更改跟踪/版本控制Java API?

我知道至少有两个字节码增强器在运行时修改"对象模型"以允许透明地执行事务.其中一个是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库?

java change-tracking

22
推荐指数
1
解决办法
4210
查看次数

如何在*每个实例*中没有*引用记录器的情况下登录Scala*?

我已经看过在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带来的好处.

logging singleton scala

21
推荐指数
2
解决办法
9580
查看次数

如果JVM在执行GC时继续移动对象,它如何解析引用?

我正在阅读JVM调优,我发现JVM在执行GC时会继续移动对象.但Java对象之间相互引用,人们认为它们是作为指针实现的,但每次移动对象后,JVM都不可能遍历整个堆,并更新所有引用; 肯定会永远.那么它如何解析引用,如果引用没有改变,但对象的物理位置呢?

我已经阅读了很多关于JVM的内容,但在任何地方都没有解释,甚至暗示过.

[编辑]我的观点是,引用是单向的.从指针到指向是"瞬时",但反过来需要完整的堆扫描.虽然有可能,但似乎不太可能.如果10K对象在次要集合中存活,那么执行完整堆扫描需要多长时间才能更新对这些对象的引用10K次?必须使用某种优化的算法或结构.

java heap garbage-collection jvm

21
推荐指数
1
解决办法
3087
查看次数

假设没有"并发访问",安全地将内存块"借出"给C中的另一个线程

问题

我想在一个线程中分配内存,并安全地 "释放"指向另一个线程的指针,以便它可以读取该内存.

我正在使用一种翻译成C语言的高级语言.高级语言有线程(未指定的线程API,因为它是跨平台的 - 见下文)并支持标准的C多线程原语,如原子比较交换,但它没有真正记录(没有用法示例).这种高级语言的限制是:

  • 每个线程执行一个事件处理无限循环.
  • 每个线程都有自己的本地堆,由一些自定义分配器管理.
  • 每个线程都有一个"输入"消息队列,可以包含来自任意数量的不同其他线程的消息.
  • 传递队列的消息是:
    1. 对于固定类型的消息
    2. 使用复制

现在,对于大型(不希望复制)或可变大小(我认为数组大小是类型的一部分)消息,这是不切实际的.我想发送这样的消息,这里是我想要实现它的大纲:

  • 消息(请求回复)可以存储"有效负载"内联(复制,固定限制总值大小),或指向发送方堆中数据的指针
  • 消息内容(发送者堆中的数据)由发送线程拥有(分配和释放)
  • 接收线程在完成消息内容时向发送线程发送确认
  • "发送"线程在发送之后不得修改消息内容,直到收到(ack).
  • 应该永远是对内存并行读访问被写入,写之前完成.这应该由消息队列work-flow保证.

我需要知道如何确保这没有数据竞争.我的理解是我需要使用内存栅栏,但我不完全确定哪一个(ATOMIC_RELEASE,...)以及循环中的位置(或者我是否需要任何内容​​).


便携性考虑因素

因为我的高级语言需要跨平台,所以我需要得到答案:

  • Linux,MacOS以及可选的Android和iOS
    • 使用pthreads原语来锁定消息队列:pthread_mutex_initpthread_mutex_lock+pthread_mutex_unlock
  • 视窗
    • 使用Critical Section Objects来锁定消息队列:InitializeCriticalSectionEnterCriticalSection+LeaveCriticalSection

如果它有帮助,我假设以下架构:

  • 用于Windows/Linux/MacOS的英特尔/ AMD PC架构(?).
  • 适用于iOS和Android的未知(ARM?)

并使用以下编译器(您可以假设所有这些编译器的"最近"版本):

  • Windows上的MSVC
  • Linux上的铿锵声
  • Xcode在MacOS/iOS上
  • 适用于Android的CodeWorks for Android

到目前为止,我只在Windows上构建,但是当应用程序完成后,我希望以最少的工作将其移植到其他平台.因此,我试图从一开始就确保跨平台兼容性.


试图解决方案

这是我假设的工作流程:

  1. 读取队列中的所有消息,直到它为空(仅当它完全为空时才阻塞).
  2. 在这里叫一些"记忆围栏"?
  3. 读取消息内容(消息中指针的目标),并处理消息.
    • 如果消息是"请求",则可以处理该消息,并将新消息缓冲为"回复".
    • 如果消息是"回复",则可以释放原始"请求"的消息内容(隐式请求"确认").
    • 如果消息是"回复",并且它本身包含指向"回复内容"的指针(而不是"内联回复"),那么也必须发送"回复确认".
  4. 在这里叫一些"记忆围栏"?
  5. 将所有缓冲的消息发送到适当的消息队列中. …

c multithreading thread-safety nim-lang

21
推荐指数
1
解决办法
597
查看次数

将Java编译为asm.js

asm.js即将到来.现在甚至有传言称Chrome很快就会完全支持它.

但到目前为止,它已被用于将C/C++源代码编译成JavaScript,它将以接近本机的速度运行(取决于您如何定义近原生...)

我一直计划使用GWT将我的Java代码转换为JavaScript,但现在我想知道当前是否存在将纯Java源代码编译为ASM.JS 的现有路径/过程,那会是什么?

人们可能想要的另一个原因是:在某些Android手机上,Java-to-ASM.js可能比Java-to-Dalvik运行得更快!

java asm.js

20
推荐指数
1
解决办法
6398
查看次数

是否有"高级Scala"主题的中心站点/页面?

尽管多次阅读"Scala编程",我仍然经常发现书中未解释的重要Scala结构,如

@uncheckedVariance
@specialized
Run Code Online (Sandbox Code Playgroud)

和其他奇怪的结构一样

new { ... }  // No class name!
Run Code Online (Sandbox Code Playgroud)

等等.

考虑到这本书是由斯卡拉"发明家"本人和其他人写的,我觉得这很令人沮丧.

我试图阅读语言规范,但它是为学者而不是练习程序员.它让我头晕目眩.

在Scala中有"Everything"编程的网站"没有告诉你"吗?

还有是日常斯卡拉博客,但它在一年前去世了.

scala

16
推荐指数
3
解决办法
3934
查看次数

斯卡拉:非法继承; 自我类型Y不符合X的自我类型SELF

我有一个特性,它接受一个类型参数,我想说实现这个特征的对象也将符合这个类型参数(使用泛型,以便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,编译器应该只接受它,并考虑它,同时不要求每个非具体子类型再次重复相同的事情.

我这样做是为了避免使用类强制转换,但我将从字面上扩展每个类,我不会看到我应该重复这个声明数百甚至数千次!

scala self-type

14
推荐指数
1
解决办法
7611
查看次数