我使用yesod创建了一个非常简单的应用程序.它并不是很常用,但是当我用htop检查时,它比服务器中的所有其他进程消耗了更多的CPU时间,包括运行时间更长的进程.此外,当我启动该过程时,我发现即使没有发出请求(大多数情况下没有发出请求),它的处理器使用时间也会不断增加.使用yesod应用程序这是常见的还是预期的?
我一直试图找出一种合理的方法来使用持久性来表示SQL后端中的Haskell和类型.
我的目标Haskell数据类型是沿着的
data Widget = FooWidget Int | BarWidget T.Text
data HElement = HElement
{ name :: T.Text
, widget :: Widget
}
Run Code Online (Sandbox Code Playgroud)
我使用以下持久数据类型对它们进行建模:
Element
name T.Text
Foo
elementId ElementId
size Int
Bar
elementId ElementId
colour T.Text
Run Code Online (Sandbox Code Playgroud)
每个元素都只有Foo或Bar,而不是两者.
我想用a Left Outer Join来选择我的所有元素和相应的Foo OR Bar.我的Esqueleto表达式是:
select $
from $ \(elem `LeftOuterJoin` foo `LeftOuterJoin` bar) -> do
on (just (elem ^. ElementId) ==. foo ?. FooElementId)
on (just (elem ^. ElementId) ==. bar ?. BarElementId)
return (elem, foo, bar)
Run Code Online (Sandbox Code Playgroud)
但是,当我执行代码时,我收到错误:
user …Run Code Online (Sandbox Code Playgroud) 我想用我的Yesod应用程序实现大文件上传.现在我有:
module Handler.File where
import Import
import System.Random
import System.FilePath
import Control.Monad
import qualified Data.ByteString.Lazy as LBS
import qualified Data.Text.Encoding
-- upload
uploadDirectory :: FilePath -- FIXME: make this configurable
uploadDirectory = "incoming"
randomFileName :: IO FilePath
randomFileName = do
fname'base <- replicateM 20 (randomRIO ('a','z'))
let fname = uploadDirectory </> fname'base <.> "bin"
return fname
fileUploadForm :: Form (FileInfo, Textarea)
fileUploadForm = renderDivs $ (,)
<$> fileAFormReq "Choose a file"
<*> areq textareaField "What's on the file?" Nothing
getFileNewR …Run Code Online (Sandbox Code Playgroud) Haskell和Yesod新手在这里.我一直在尝试从Yesod书中的Persistent章节(http://www.yesodweb.com/book/persistent)中跟踪与Yesod示例的集成.似乎Sqlite编译并运行良好.但是,我正在尝试使用MongDB,并且很难让事情发挥作用.特别:
在sqlite的示例中:
share [mkPersist sqlSettings, mkMigrate "migrateAll"] [persist|
Yesod书中说"Mongo代码将mongoSettings改为使用".但我无法在任何模块中找到它,并且代码无法编译.所以相反,我不得不使用它而不是mongoSettings:
MkPersistSettings { mpsBackend = ConT ''Action }
我必须导入Language.Haskell.TH.Syntax才能让它进行编译,我假设它应该对用户隐藏,所以我当然不是正确的.
另外,我发现在Mongo的Persistent测试中没有"share"和"migrate"部分.我实际上不确定为什么,我猜它是因为MongoDB是Schema-less而不需要迁移?
SqlPersist
我认为MongoPersist是SqlPersist的对应物,我猜它几乎是 - 我MongoPersist在Persistent的测试目录中的init.hs中找到了一个实例.但它被评论出来了,所以我觉得它已经过时了?否则,就我所知,它无论如何都没有定义.所以我不知道如何转换以下行(Yesod书的第115页,或接近http://www.yesodweb.com/book/persistent的末尾)来为MongoDB工作:
instance YesodPersist PersistTest where
type YesodPersistBackend PersistTest = SqlPersist
runDB action = do
PersistTest pool <- getYesod
runSqlPool action pool
Run Code Online (Sandbox Code Playgroud)使用withMongoDBConn
所以对于sqlite,代码是(上面网页的第一个例子):
main :: IO ()
main = withSqliteConn ":memory:" $ runSqlConn $ do
runMigration migrateAll
johnId <- insert $ Person "John Doe" $ Just 35
... and …Run Code Online (Sandbox Code Playgroud)嗨,大家好
我无法找到任何好的文档或如何使用Yesod将邮件发送到电子邮件地址的示例.
更实际的是,我将提取用户在简单表单(姓名,年龄,邮件正文)中键入的信息,并将此信息作为邮件发送到电子邮件地址.
我有点迷失在这个任务中.
谢谢您的帮助.
我有两个关于RPC调用的相关问题Yesod/Snap/Servant:
假设我在服务器上有一个函数,用Haskell编写,由GHC编译:
add x y = x+y+42
怎么能:
GHCJS),以类型安全的方式做所有这些吗?
例如,我想在客户端上写这样的东西:
main= putStrLn $ show $ add 2 3
Run Code Online (Sandbox Code Playgroud)
这样add函数就可以在服务器上执行了.
Yesod/Snap/Servant在客户端上使用服务器和GHCJS 进行此操作的最简单方法是什么?
2)同样,我想写一个"功能":
getPhaseOfMoon :: IO Phase它在服务器上运行,我想以getPhaseOfMoon类型安全的方式从客户端调用.
所以我可以在客户端上写这个:
main= do
p<-getPhaseOfMoon
putStrLn $ show p
return ()
Run Code Online (Sandbox Code Playgroud)
Phase客户端我怎么能用Yesod/Snap/Servant(服务器)+ GHCJS(客户端)做到这一点?
我只是找不到如何在hamlet模板中注释行.是否有一些注释语法?喜欢
-- <p>Some code should be ignored by template
Run Code Online (Sandbox Code Playgroud)
或者其他的东西?
我正在使用yesod创建一个简单的网站.
它一直工作,直到我向我的数据库模型添加了UTCTime类型的字段.
我最初得到一个错误,建议我在我的cabal文件中添加"time-1.2.0.3",所以我做了,现在我得到了相同的错误,没有建议:
Model.hs:6:8:
Could not find module `Data.Time.Clock.UTC':
it is a hidden module in the package `time-1.2.0.3'
Use -v to see a list of the files searched for.
Run Code Online (Sandbox Code Playgroud)
cabal生成的ghc命令行是:
"C:\Program Files (x86)\Haskell Platform\2011.2.0.1\bin\ghc.exe" --make -o dist\build\lpi\lpi.exe -hide-all-packages -fbuilding-cabal-package -package-conf dist\package.conf.inplace -i -idist\build\lpi\lpi-tmp -i. -idist\build\autogen -Idist\build\autogen -Idist\build\lpi\lpi-tmp -optP-DPRODUCTION -optP-include -optPdist\build\autogen\cabal_macros.h -odir dist\build\lpi\lpi-tmp -hidir dist\build\lpi\lpi-tmp -stubdir dist\build\lpi\lpi-tmp -package-id base-4.3.1.0-f520cd232cc386346843c4a12b63f44b -package-id bytestring-0.9.1.10-cd85f14e02463c02ba4c77d7adcdb54f -package-id clientsession-0.7.3.6-70ebb09e2b4c14267f1463cef3c932ea -package-id hamlet-0.10.5-1bacb5fe791e5cc9e28c8cf9f07c06e2 -package-id hjsmin-0.0.14-a1d374204877c150b681896452f205f4 -package-id mime-mail-0.4.1.0-05d76f10c6f18f7178113a6d760f371a -package-id monad-control-0.3.1-092d8fe82727181557b850f795f847bc -package-id persistent-0.6.4.3-6e59b956a206ce4f4a9296367507c2b8 -package-id persistent-sqlite-0.6.2.1-d32462e51baa09b53b6fd83dae922fc7 -package-id shakespeare-css-0.10.4-f8e17e4528d3a37edee74b13441720de -package-id shakespeare-js-0.10.3-dfec6b68f60671528332da06c9799659 -package-id shakespeare-text-0.10.3-a0ae9b85c3588ff2572080a6d1cdd4c3 …Run Code Online (Sandbox Code Playgroud) 如何以模块化方式编写Database.Esqueleto查询,以便在定义"基本"查询和相应的结果集之后,我可以通过添加其他内部联接和表达式来限制结果集.
此外,如何将返回实体(或字段元组)列表的基本查询转换为计算结果集的查询,因为基本查询不是这样执行的,而是使用LIMIT和OFFSET修改它的版本.
Yesod Book中采用的以下不正确的Haskell代码片段有望澄清我的目标.
{-# LANGUAGE QuasiQuotes, TemplateHaskell, TypeFamilies, OverloadedStrings #-}
{-# LANGUAGE GADTs, FlexibleContexts #-}
import qualified Database.Persist as P
import qualified Database.Persist.Sqlite as PS
import Database.Persist.TH
import Control.Monad.IO.Class (liftIO)
import Data.Conduit
import Control.Monad.Logger
import Database.Esqueleto
import Control.Applicative
share [mkPersist sqlSettings, mkMigrate "migrateAll"] [persistLowerCase|
Person
name String
age Int Maybe
deriving Show
BlogPost
title String
authorId PersonId
deriving Show
Comment
comment String
blogPostId BlogPostId
|]
main :: IO ()
main = runStdoutLoggingT $ runResourceT $ PS.withSqliteConn …Run Code Online (Sandbox Code Playgroud) 基于我之前的问题,我想询问是否有办法在GHCi会话中杀死所有用户创建的线程?
这样做的原因是当一个函数退出GHCi时,它产生的线程不会自动终止,即使通过代码重新加载也会持久化.重新启动GHCi解决了这个问题,但由于我的应用程序需要一段时间才能加载,如果有可能(甚至是hacky)的解决方法,那将会很棒.