我做了一个守护进程,它使用了一种非常原始的形式ipc(telnet并发送一个按特定顺序排列某些单词的String).我抢购了它,现在JSON用来将消息传递给Yesod服务器.但是,有一些我真的很喜欢我的设计,我不确定我现在的选择.
这就是我在做的事情:
buildManager :: Phase -> IO ()
buildManager phase = do
let buildSeq = findSeq phase
jid = JobID $ pack "8"
config = MkConfig $ Just jid
flip C.catch exceptionHandler $
runReaderT (sequence_ $ buildSeq <*> stages) config
-- ^^ I would really like to keep the above line of code, or something like it.
return ()
Run Code Online (Sandbox Code Playgroud)
buildSeq中的每个函数都是这样的
foo :: Stage -> ReaderT Config IO ()
data Config = MkConfig (Either JobID …Run Code Online (Sandbox Code Playgroud) 如何从from语句中生成esqueleto以生成SQL字符串?
文档toRawSql说"你可能只是打开持久性的查询记录".我尝试了所有可能的形式MonadLogger,但我从未打印过任何SQL.同样的文档也说"手动使用这个功能......可能但很乏味".但是,不会QueryType导出该类型的构造函数,也不会导出返回该类型值的任何函数.我设法通过注意这QueryType是一个newtype和使用来解决这个问题unsafeCoerce!
我也被迫提供Connection(我通过SQLite获得),即使不需要连接到数据库来生成SQL.
这就是我所拥有的.肯定有更好的办法.
withSqliteConn ":memory:" $
\conn -> return $ toRawSql SELECT
(unsafeCoerce ((const mempty)
:: a -> Text.Lazy.Builder.Builder))
(conn, initialIdentState) myFromStatement)
Run Code Online (Sandbox Code Playgroud)
http://hackage.haskell.org/package/esqueleto-1.3.4.2/docs/Database-Esqueleto-Internal-Sql.html
我需要在我的应用程序中要求多种身份验证类型; 特别是:应用程序的某些部分需要对dropbox进行身份验证,而某些部分则需要基于电子邮件的身份验证,例如browserID.
我怎么处理这个?
我可以将身份验证附加到子网站吗?由于YesodAuth类在所有示例中都将master foundation数据类型作为参数,因此我不知道如何做到这一点.
如果没有,还有其他方法吗?
我是Haskell和Yesod的新手,我正在尝试构建一个可以从外部API回答查询的简单Web应用程序.我已经构建了一个解析器(使用Parsec),它获取了我想要作为常规Int值加载的实体的ID.
但是,我对于我的生活无法弄清楚如何将这个Int变成get可接受的东西(即a Key(?)).文档中的所有示例仅从先前插入或从url dispatch获取id.
任何帮助将不胜感激,因为我似乎被困... :)
似乎关于并发访问的规则是未记录的(在Haskell方面)并且简单地假设开发人员熟悉正在使用的特定后端.对于生产需求而言,这是一个完全合理的假设,但对于随意的原型设计和开发,如果持久性*包更加自包含,那将会很好.
那么,管理对persistent-sqlite和family的并发访问的规则是什么?隐含地,如果我们有连接池,则必须允许某种程度的并发,但是通常创建单个连接池并且调用replicateM x $ forkIO (useThePool connectionPool)会产生以下错误.
user error (SQLite3 returned ErrorBusy while attempting to perform step.)
Run Code Online (Sandbox Code Playgroud)
编辑:现在下面是一些示例代码.
在下面的代码中,我分叉了6个线程(任意数字 - 我的实际应用程序执行3个线程).每个线程不断存储和查找记录(来自其他线程正在访问的记录的唯一记录,但这无关紧要),打印其中一个字段.
{-# LANGUAGE TemplateHaskell, QuasiQuotes
, TypeFamilies, FlexibleContexts, GADTs
, OverloadedStrings #-}
import Control.Concurrent (forkIO, threadDelay)
import Database.Persist
import Database.Persist.Sqlite hiding (get)
import Database.Persist.TH
import Control.Monad
import Control.Monad.IO.Class
share [mkPersist sqlSettings, mkMigrate "migrateAll"] [persist|
SomeData
myId Int
myData Double
MyId myId
|]
main = withSqlitePool "TEST" 40 $ \pool -> do
runSqlPool (runMigration migrateAll) pool
mapM_ forkIO [runSqlPool …Run Code Online (Sandbox Code Playgroud) 我是Yesod的新手,我无法静态构建Yesod,因此我可以部署到Heroku.
我更改了默认的.cabal文件以反映静态编译
if flag(production)
cpp-options: -DPRODUCTION
ghc-options: -Wall -threaded -O2 -static -optl-static
else
ghc-options: -Wall -threaded -O0
Run Code Online (Sandbox Code Playgroud)
它不再构建.我得到了一大堆警告,然后是一大堆未定义的引用,如下所示:
Linking dist/build/personal-website/personal-website ...
/usr/lib/ghc-7.0.3/libHSrts_thr.a(Linker.thr_o): In function
`internal_dlopen':
Linker.c:(.text+0x407): warning: Using 'dlopen' in statically linked
applications requires at runtime the shared libraries from the glibc
version used for linking
/usr/lib/ghc-7.0.3/unix-2.4.2.0/libHSunix-2.4.2.0.a(HsUnix.o): In
function `__hsunix_getpwent':
HsUnix.c:(.text+0xa1): warning: Using 'getpwent' in statically linked
applications requires at runtime the shared libraries from the glibc
version used for linking
/usr/lib/ghc-7.0.3/unix-2.4.2.0/libHSunix-2.4.2.0.a(HsUnix.o): In
function `__hsunix_getpwnam_r':
HsUnix.c:(.text+0xb1): warning: Using 'getpwnam_r' in …Run Code Online (Sandbox Code Playgroud) 我是Haskell的新手,所以这可能是一个微不足道的问题.我看到一条错误消息说
Couldn't match expected type 'Data.Text.Lazy.Internal.Text'
with actual type 'Data.Text.Internal.Text'
Run Code Online (Sandbox Code Playgroud)
我认为问题是实际的类型是Data.Text.Text,它期望懒惰的文本.如何将一个转换为另一个?
编辑:
这是一个提供此错误的简化代码.
Run Code Online (Sandbox Code Playgroud)
基本上我有一个带有textarea输入元素的yesod表单,我想通过电子邮件发送textarea的内容.
{-# LANGUAGE OverloadedStrings #-}
import Data.Text.Lazy.Encoding
import Network.Mail.Mime
import Yesod
data FormData = FormData { dataField :: Textarea } deriving Show
part d = Part {
partType = "text/plain; charset=utf-8"
, partEncoding = None
, partFilename = Nothing
, partContent = encodeUtf8 $ unTextarea $ dataField d
, partHeaders = []
}
main = return ()
该耶索德书说
加密防止用户检查数据,签名确保会话既不会被劫持也不会被篡改.
我不清楚为什么会这样.如果窃听者在从服务器发送cookie并在合法用户发出另一个请求之前使用它时获取cookie,那么会话最终是否会被劫持?
在我看来,真正防止会话劫持的唯一方法是始终使用SSL.但是如果我这样做那么Yesod的签名和加密最终会成为不必要的开销(EDIT:防止劫持的开销.正如@sr_在评论中指出的那样,它仍然有用).
我想在Yesod应用程序中使用websockets.如果我对websockets包的理解是正确的,这意味着我需要定义一个ServerApp,它是PendingConnection -> IO ()如何处理连接请求的函数,然后使用我的Warp设置的settingsIntercept字段将其插入我的应用程序.如何根据Yesod的身份验证进行处理?例如,如果我想拒绝除以授权用户身份登录的客户端之外的连接,我该如何检测当前登录的用户?因为我们不是在Handler monad中工作,所以似乎我们没有办法调用像maybeAuthId.是手动查看连接请求标头的唯一选择吗?
yesod ×10
haskell ×9
esqueleto ×1
heroku ×1
json ×1
linux ×1
persistence ×1
persistent ×1
security ×1
websocket ×1