我正在通过Zed Shaw的艰难学习方式开展工作.
在Valgrind的章节中,"你应该看到的内容"部分包含各种glibc函数的行号.
我已经确定(显然)我的CentOS 5.5安装已经安装了非调试glibc.但yum没有列出glibc-dbg(或任何类似的东西:
[nzucker:~/projects/lcthw]$ yum info \*glibc\* | grep Name
Name : glibc
Name : glibc
Name : glibc-common
Name : glibc-devel
Name : glibc-devel
Name : glibc-headers
Name : compat-glibc
Name : compat-glibc
Name : compat-glibc-headers
Name : glibc-utils
Run Code Online (Sandbox Code Playgroud)
我过去通过随意安装软件包(通过软件包或从源代码构建)来打砖机,所以我想知道我在这里做什么.
问题:
由于我已经安装了glibc-devel,调试库是否已经存在,我只需要链接到它们和/或添加编译开关?
如果我在启用调试的情况下从源代码(或安装软件包)重新构建glibc,我怎么能确保不会意外地破坏机器(即因为构建错误的软件包并触发库不兼容)?
我正在使用Google Guava CacheBuilder创建一个Cache实例.我的代码如下所示:
return CacheBuilder.newBuilder()
.initialCapacity(initialCapacity)
.expireAfterAccess(expirationInterval, TimeUnit.SECONDS)
.removalListener(LOGGING_AUTOEVICTION_ONLY_REMOVAL_LISTENER)
.build();
Run Code Online (Sandbox Code Playgroud)
我的删除监听器,顾名思义:
private static final RemovalListener<MyKey, MyRecord> LOGGING_AUTOEVICTION_ONLY_REMOVAL_LISTENER
= new RemovalListener<MyKey, MyRecord>() {
@Override
public void onRemoval(RemovalNotification<MyKey, MyRecord objectObjectRemovalNotification) {
if (objectObjectRemovalNotification.wasEvicted()) {
log.debug("Entry evicted from cache: {} - Reason: {}", objectObjectRemovalNotification, objectObjectRemovalNotification.getCause());
}
}
};
Run Code Online (Sandbox Code Playgroud)
最后,我只get使用了我的缓存条目get(K key, Callable<? extends V> valueLoader)
这是问题:使用上面的代码,我看到以下日志输出:
19:08:03.287 DEBUG [MyCache] - Entry evicted from cache: MyKey[123]=MyRecord@43ee148b - Reason: SIZE
当我没有maximumSize()在CacheBuilder调用中使用时,为什么记录会从我的缓存中逐出?我怀疑它与"体重"有关.如果是这样,我需要知道maxWeight()在到期时间之前没有被删除的缓存条目?
注意我知道Google Guava网站上的Caches解释.
我有一个相当开放的一般性问题(即"取决于平台,应用程序类型等")但我正在寻找一般指导方针作为答案.
什么时候最好设计一个连续运行的应用程序(100%正常运行时间)与预定的每日关机/重启?
显然,Web应用程序需要一直处于运行状态,因此我们假设我们正在讨论内部企业应用程序,例如会计系统或仅在工作日工作时间主动使用的B2B系统.
我听过的各种论据如下:
Pro 100%正常运行时间:"一旦你运行一个应用程序,最好保持它,因为当你关闭它时它有可能不会重启."
Pro每日重启:"一个持续3年的应用程序可能有一天会停止运行,没有人会知道如何将其重新联机."
其他考虑因素包括内存增长,性能,维护需求等.这是一个编程问题,因为您所做的选择会影响您的技术设计.例如,如果您知道应用程序将每天关闭/重新启动,则无需每天编写某些批处理作业并清除状态.
思考?
在探索Clojure中计算阶乘的各种方法时,我提出了以下(非惯用)函数:
(defn factorial-using-do-dotimes [x]
(do
(def a 1)
(dotimes [i x]
(def a (* a (inc i)))))
a)
Run Code Online (Sandbox Code Playgroud)
REPL:
user=> (factorial-using-do-dotimes 5)
120
Run Code Online (Sandbox Code Playgroud)
这有什么具体的缺点(除了"非惯用")?性能?正确性(即可能的缺陷)?
Steve Losh 发布 了以下Clojure片段:
; Integers and Longs are equal.
(= (Integer. 1) (Long. 1))
true
; Even negative ones.
(= (Integer. -1) (Long. -1))
true
; When you use them as keys in maps, the maps are still equal.
(= {(Integer. 1) :foo} {(Long. 1) :foo})
true
(= {(Integer. -1) :foo} {(Long. -1) :foo})
true
; When you use positive numbers as keys to sets, they're also equal.
(= #{(Integer. 1)} #{(Long. 1)})
true
; But negative ones …Run Code Online (Sandbox Code Playgroud) 这非常重要,我在截止日期前完全陷入困境.非常感谢帮助.
我有一个名为red-black的Clojure项目,它特别包含一个名为interval_tree.clj的文件
我一直在用lein uberjar编译这个项目,然后在其他项目中使用生成的jar,将它安装在本地maven资源库中.
mvn install:install-file \
-Dfile=../red-black/target/red-black-0.1.0.jar \
-DgroupId=self \
-DartifactId=red-black \
-Dversion=0.1.0 \
-Dpackaging=jar \
-DgeneratePom=true \
-DcreateChecksum=true \
-DlocalRepositoryPath=local_mvn_repo
Run Code Online (Sandbox Code Playgroud)
疯狂的是,我添加了一个新功能,编译我的jar并在另一个项目的本地maven存储库中重新安装它,现在java无法找到我的新功能
user=> (red-black.interval-tree/tree-to-flat-list )
CompilerException java.lang.RuntimeException: No such var: red-black.interval-tree/tree-to-flat-list, compiling (NO_SOURCE_PATH:1:1)
Run Code Online (Sandbox Code Playgroud)
但是这个函数是red-black.interval-tree.clj!我甚至进入了我的local_mvn_repo,解压缩了jar,并查看了interval_tree.clj源代码.功能就在那里!
更奇怪的是,该库中的其他功能是可访问的.例如,在我的第二个项目中使用本地mvn repo:
user=> (use 'red-black.interval-tree)
nil
Run Code Online (Sandbox Code Playgroud)
现在一个小标签选项卡魔术:
user=> (red-black.interval-tree/
red-black.interval-tree/add-to-result red-black.interval-tree/black red-black.interval-tree/check-max-interval
red-black.interval-tree/get-color red-black.interval-tree/get-hash red-black.interval-tree/get-interval
red-black.interval-tree/get-key red-black.interval-tree/get-left red-black.interval-tree/get-max
red-black.interval-tree/get-parent red-black.interval-tree/get-right red-black.interval-tree/get-root
red-black.interval-tree/get-sentinel red-black.interval-tree/get-value red-black.interval-tree/has?
red-black.interval-tree/health-check red-black.interval-tree/high red-black.interval-tree/insert
red-black.interval-tree/insert-fixup red-black.interval-tree/left-rotate red-black.interval-tree/low
red-black.interval-tree/max-of-three red-black.interval-tree/new red-black.interval-tree/node
red-black.interval-tree/point-lookup red-black.interval-tree/pretty-print red-black.interval-tree/recursive-max
red-black.interval-tree/red red-black.interval-tree/right-rotate red-black.interval-tree/set-color
red-black.interval-tree/set-interval red-black.interval-tree/set-key red-black.interval-tree/set-left
red-black.interval-tree/set-max red-black.interval-tree/set-parent red-black.interval-tree/set-right …Run Code Online (Sandbox Code Playgroud) 鉴于此功能,我无法修改:
def numbers(c: Char): Iterator[Int] =
if(Character.isDigit(c)) Iterator(Integer.parseInt(c.toString))
else Iterator.empty
// numbers: (c: Char)Iterator[Int]
Run Code Online (Sandbox Code Playgroud)
而这个输入数据:
val data = List('a','b','c','1','d','&','*','x','9')
// data: List[Char] = List(a, b, c, 1, d, &, *, x, 9)
Run Code Online (Sandbox Code Playgroud)
我怎样才能使这个函数变得懒惰,这样data只会处理到第一个出现的数字字符?
def firstNumber(data: List[Char]) :Int = data.flatMap(numbers).take(1)
Run Code Online (Sandbox Code Playgroud) 假设我有这样的数据:
scala> case class Foo(a: Int, b: Int)
defined class Foo
scala> val data: List[Foo] = Foo(1,10) :: Foo(2, 20) :: Foo(3,30) :: Nil
data: List[Foo] = List(Foo(1,10), Foo(2,20), Foo(3,30))
Run Code Online (Sandbox Code Playgroud)
我知道在我的数据中,不会有Foo实例具有相同的field值a-我想将其转换为Map[Int, Foo](我不想要Map[Int, List[Foo]])
我可以:
scala> val m: Map[Int,Foo] = data.groupBy(_.a).mapValues(_.head)
m: Map[Int,Foo] = Map(2 -> Foo(2,20), 1 -> Foo(1,10), 3 -> Foo(3,30))
Run Code Online (Sandbox Code Playgroud)
要么:
scala> val m: Map[Int,Foo] = data.groupBy(_.a).map(e => e._1 -> e._2.head)(collection.breakOut)
m: Map[Int,Foo] = Map(2 -> Foo(2,20), 1 -> Foo(1,10), 3 -> …Run Code Online (Sandbox Code Playgroud) 在Scala 2.9.2中
List(List(1,5,4),List(7,9,11)).flatten.map {i => println(i); identity(i) }.find { _ % 2 == 0 }
Run Code Online (Sandbox Code Playgroud)
打印:
1
5
4
7
9
11
Option[Int] = Some(4)
Run Code Online (Sandbox Code Playgroud)
但
List(List(1,5,4),List(7,9,11)).flatten.map { println("."); identity(_) }.find { _ % 2 == 0 }
Run Code Online (Sandbox Code Playgroud)
打印
.
Option[Int] = Some(4)
Run Code Online (Sandbox Code Playgroud)
我必须承认,我对这种行为感到有些惊讶.Underscore似乎不仅仅是等效内联函数的简写,而是对代码有其他影响.这里发生了什么?