什么是正确的序列类型?我有这个代码:
(defrecord MethodInfo [^clojure.lang.ISeq preconds ^clojure.lang.ISeq postconds])
Run Code Online (Sandbox Code Playgroud)
但它似乎没有正确执行类型要求,因为我可以写(new MethodInfo 1 2).
我必须从Clojure Web应用程序调用用Java编写的servlet,我不明白该怎么做.
使用Java开发webapp,我必须在web.xml中描述所有映射.在Compojure中,我看到,我必须描述路线.那么,我可以将Java servlet绑定到一个这样的路由吗?
对不起,如果我的问题是愚蠢的,但我搜索了很多但没有找到答案; 我刚刚开始为网络开发.
我一直在处理我写的服务器的问题.它在Clojure中,但我认为这并不重要,我们可以假装它是用Java编写的.无论如何,它工作正常,在一个小时的时间,但进入配合它的表现非常糟糕:所有的活动停止,为大约十五秒钟,然后它正常工作了几秒钟,然后停止十五秒...等(通常)大约十分钟左右,然后恢复正常行为.
我用YourKit做了很多分析,我排除了一些看似合理的嫌疑人:
这不是垃圾收集问题:我正在运行它-XX:+UseConcMarkSweepGC,并且我已经验证了服务器在次要和主要集合期间继续运行正常,因为这个垃圾收集器的并发性质.当我们耗尽总内存或其他东西时,我们并没有挣扎:当前堆大小远低于其最大值.
我不认为这是一个锁定/同步问题,但我不是100%肯定.YourKit分析器有时会显示等待的线程,例如通过锁定来竞争System.out以生成日志消息,但是当没有任何事情要做时,唯一的长等待是线程池中的工作线程.当然,YourKit说它从来没有发现任何死锁.
这不是因为连接了探查器而引起的,因为即使我启动服务器然后在不附加探查器的情况下单独使用它仍然会发生.
这不是系统占用所有CPU时间的其他过程:top我的java进程显示CPU使用率为100%,其他所有内容基本上为0%.
我最大的问题是,在这些奇怪的问题中我无法看到服务器正在做什么,因为探查器停止接收样本.这是CPU使用率图表的图表:

图的左侧是正常操作,在此期间我们每隔一秒左右获得一次探查器样本.右侧是"破碎的",并且非常尖刻,因为探测器每10秒左右才会获取样品.在它确实获得的样本中,服务器似乎正在做其通常的业务:响应请求等等; 和日志确认它是做正常的东西,但只能在次探查具有样本:在图表上,为此,探查有没有样品向上倾斜"直线",服务器都无所事事.
那么,这个图表对任何人来说都很熟悉吗?你以前遇到过这个问题并修好了吗?或者你能指出一个工具的方向,可以找出我的服务器在YourKit不能做的时候做了什么吗?如果它很重要,服务器机器正在运行Ubuntu 10.04,和
$ java -version
java version "1.6.0_22"
OpenJDK Runtime Environment (IcedTea6 1.10.10) (rhel-1.28.1.10.10.el5_8-x86_64)
OpenJDK 64-Bit Server VM (build 20.0-b11, mixed mode)
Run Code Online (Sandbox Code Playgroud) 我有一个seq, (def coll '([:a 20] [:b 30] [:c 50] [:d 90]))
我想迭代seq,并只修改与谓词匹配的第一个元素.
谓词 (def pred (fn [[a b]] (> b 30)))
(f pred (fn [[a b]] [a (+ b 2)]) coll) => ([:a 20] [:b 30] [:c 52] [:d 90])
f是我想要的fn,它取一个pred,一个fn应用于匹配pred的第一个elem.所有其余的元素都没有修改并在seq中返回.
做上述的惯用方法是什么?
我一直在编写一个简单的 Clojure 框架,用于为我的 Raspberry Pi 播放音乐(以及后来的一些其他东西)。该程序解析给定音乐目录中的歌曲,然后开始通过 TCP 接口监听控制命令(例如开始、停止、下一首歌曲)。
该代码可通过 GitHub 获取: https://github.com/jvnn/raspi-framework
当前版本在我的笔记本电脑上运行得很好,它会根据指示开始播放音乐(使用 JLayer 库),更改歌曲,然后按预期停止。uberjar 在笔记本电脑上启动也需要几秒钟,但是当我尝试在 Raspberry Pi 上运行它时,速度变得非常慢。
仅启动程序以加载所有类并开始执行实际的程序代码就需要一分钟多的时间。我尝试使用 -verbose:class 开关运行它,似乎 jvm 花费了整个时间来加载大量的类(对于 Clojure 和其他所有内容)。
当程序最终启动时,它确实会对给出的命令做出反应,但播放非常滞后。有一个短的亚秒声音,然后暂停几乎一秒钟,然后另一个声音,另一个暂停等等......所以程序试图播放一些东西,但它只是不能足够快地播放。CPU 使用率接近 98%。
现在,有了 Android 手机等等,我确信 Java 可以在这样的硬件上很好地执行,可以毫无问题地播放一些 mp3 文件。而且我知道 JLayer(或其一部分)用于 gdx 游戏开发框架(也在 Android 上运行),因此它也不应该成为问题。
所以一切都表明我是问题所在。我可以使用 leiningen(所有文件都启用了 aot)、Raspberry Pi 或我的代码来使事情变得更快吗?
谢谢你的时间!
更新: 我做了一个小测试用例来排除一些可能性,并且以下 Clojure 代码仍然存在问题:
(ns test.core
(:import [javazoom.jl.player.advanced AdvancedPlayer])
(:gen-class))
(defn -main
[]
(let [filename "/path/to/a/music/file.mp3"
fis (java.io.FileInputStream. filename)
bis (java.io.BufferedInputStream. fis)
player (AdvancedPlayer. bis)]
(doto player (.play) (.close))))
Run Code Online (Sandbox Code Playgroud)
项目.clj:
(defproject test "0.0.1-SNAPSHOT" …Run Code Online (Sandbox Code Playgroud) 我有时想要进行--ff-only合并,并且选项卡完成有点尴尬,因为--ff存在.但这--ff是默认行为,我无法想象要明确指定它.我能说--ff同义词--ff-only吗?我知道我可以做一个别名ff-merge,但我对这个解决方案并不感到兴奋.我也很满意一个导致--ff<TAB>完成的解决方案--ff-only.
我注意到我的一个 SQL 查询比我预期的要慢得多,结果查询计划程序提出了一个对我来说似乎很糟糕的计划。我的查询如下所示:
select A.style, count(B.x is null) as missing, count(*) as total
from A left join B using (id, type)
where A.country_code in ('US', 'DE', 'ES')
group by A.country_code, A.style
order by A.country_code, total
Run Code Online (Sandbox Code Playgroud)
B 有一个 (type, id) 索引,A 有一个 (country_code, style) 索引。A 比 B 小得多:A 中有 250K 行,B 中有 100M。
所以,我希望查询计划看起来像:
country_code(type, id)索引查找匹配行(如果有)country_code和分组事物style但是查询规划器决定执行此操作的最佳方法是对 B 进行顺序扫描,然后对 A 进行右连接。我无法理解为什么会这样;有没有人有想法?这是它生成的实际查询计划:
Sort (cost=14283513.27..14283513.70 rows=171 width=595)
Sort Key: a.country_code, …Run Code Online (Sandbox Code Playgroud) 说我有这样的一套:
#{"word1" "word2" "word3"}
Run Code Online (Sandbox Code Playgroud)
我怎么能列出这些单词可能被命令的所有方式,即
word1 word2 word3
word2 word3 word1
word3 word2 word1
Run Code Online (Sandbox Code Playgroud)
等等
我听说每个拉链都是一个共元,而我认为每个与其自身组成的拉链仍然是一个拉链,因此它是一个共元。所以我决定创建一个。
\n我有以下拉链列表:
\n{-# LANGUAGE DeriveFunctor #-}\n{-# LANGUAGE InstanceSigs #-}\nmodule ListZipper where\nimport Control.Comonad\nimport Data.List (unfoldr)\nimport Test.QuickCheck (Arbitrary (arbitrary))\n\ndata ListZipper a = ZList {previous :: [a], currentL :: a, next :: [a]} deriving (Functor, Eq)\n\ngoLeft, goRight :: ListZipper a -> Maybe (ListZipper a)\ngoLeft (ZList (p:ps) cur ns) = Just $ ZList ps p (cur : ns)\ngoLeft _ = Nothing\ngoRight (ZList ps cur (n:ns)) = Just $ ZList (cur : ps) n ns\ngoRight _ = Nothing\n\nfork :: b -> (b, b)\nfork …Run Code Online (Sandbox Code Playgroud) 我最近发现了自由\x -> f x x点join f,并且想要了解原因.我从这里开始:
join :: Monad m => m (m a) -> m a
Run Code Online (Sandbox Code Playgroud)
因为我不熟悉"函数monad"而感到难过.有人可以帮助我解释平等的类型推导吗?
clojure ×6
haskell ×2
java ×2
performance ×2
audio ×1
comonad ×1
compojure ×1
composition ×1
function ×1
git ×1
indexing ×1
instance ×1
monads ×1
postgresql ×1
profiling ×1
raspberry-pi ×1
ring ×1
servlets ×1
sql ×1
typechecking ×1
yourkit ×1