我看到一个非常奇怪的行为,其中 Haskell 的bracket函数根据是否使用stack run或被stack test使用而表现不同。
考虑以下代码,其中两个嵌套的括号用于创建和清理 Docker 容器:
module Main where
import Control.Concurrent
import Control.Exception
import System.Process
main :: IO ()
main = do
bracket (callProcess "docker" ["run", "-d", "--name", "container1", "registry:2"])
(\() -> do
putStrLn "Outer release"
callProcess "docker" ["rm", "-f", "container1"]
putStrLn "Done with outer release"
)
(\() -> do
bracket (callProcess "docker" ["run", "-d", "--name", "container2", "registry:2"])
(\() -> do
putStrLn "Inner release"
callProcess "docker" ["rm", "-f", "container2"]
putStrLn "Done with …Run Code Online (Sandbox Code Playgroud) 我正在研究一个简单的服务器端渲染(SSR)场景:只是一个登录页面,其中包含用户名和密码的文本输入。
与 SSR 一样,当客户端首次加载页面时,他们会获得服务器渲染的版本,该版本未经过水化。看起来不错,并且可以单击文本框并输入内容。
希望 JS 能够快速加载,并且在用户在框中输入任何内容之前就发生水合作用,并且一切正常。
但是,如果用户的网络速度很慢并且 JS 需要几秒钟才能加载怎么办?然后会发生以下情况:
一定有一个最佳实践,对吗?我尝试过一些事情,例如测试 iftypeof window === "undefined"并将输入设置为disabledif so,但没有什么是令人满意的。我认为最好的用户体验是让水合组件拾取已键入的字符,但我也可以禁用编辑,直到水合完成。
FWIW 我正在使用 Material UI,它会带来一些额外的样式问题,但除此之外,我认为这个问题适用于任何 SSR 文本输入场景。
Next.JS 文档和其他教程描述如何部署非静态应用程序(即您运行的应用程序npm run start)的方式似乎在应用程序中留下了很多不必要的东西。他们说就跑npm run build,然后跑npm run start,恭喜你,你完成了!
这对我来说很奇怪,因为当其他系统(如 Webpack)创建可部署版本时,它要小得多。通过最小的我的意思是它不包含
devDependencies 在 node_modules就我而言,这些额外的东西加起来可达数百兆字节。
我有一个看起来像这样的部分解决方案:
npm run buildnode_modules,.next,static,package.json,和几个其他的东西进去cd到新文件夹并运行npm prune --production以删除开发依赖项这基本上有效,但我并不完全满意。一方面,node_modules仍然包含很多不需要的东西。在 Webpack 产品中,由于树抖动,这些东西将被忽略。另一方面,我有几个其他特定于应用程序的文件夹,我必须记住要复制过来。
为什么这么难?有没有更好的方法来做到这一点?
我试图在屏幕坐标中使用 Javascript 找到 HTML 元素的边界框,以便我可以使用外部工具(例如 的ffmpeg屏幕x11grab录制功能)来单独获取该元素的屏幕截图/视频。
如果没有 CSS 缩放,那么我可以找到元素的边界框,elem如下所示:
let viewportTop = window.screenY + (window.outerHeight - window.innerHeight);
let viewportLeft = window.screenX;
let rect = elem.getBoundingClientRect();
let width = rect.width;
let height = rect.height;
let left = viewportLeft + rect.left;
let top = viewportTop + rect.top;
Run Code Online (Sandbox Code Playgroud)
然后我可以使用这些width, height, left, top坐标在浏览器窗口上记录所需的框。
然而,有时我想增加元素的缩放以便更容易看到:
elem.style.zoom = "2";
Run Code Online (Sandbox Code Playgroud)
完成此操作后,返回的边界框elem.getBoundingClientRect()现在按比例缩小了2。如果我使用上面的方法来计算我的记录边界框,它不再与元素对齐。
window.getComputedStyle(elem, null).getPropertyValue("zoom")我在调用、解析缩放数字并使用它来纠正边界框方面取得了一些成功。然而,这不是一个完美的解决方案——如果我想缩放document.body一定量并且也缩放目标元素一定量怎么办?
所以,我想知道是否有一种通用方法可以将坐标转换为elem.getBoundingClientRect屏幕坐标,即使在 CSS 缩放应用于各种元素时也能正常工作。
我看到了toEnum . fromEnum在Chars in上使用的函数HaskellNet.Network.Auth。
b64Encode :: String -> String
b64Encode = map (toEnum.fromEnum) . B64.encode . map (toEnum.fromEnum)
b64Decode :: String -> String
b64Decode = map (toEnum.fromEnum) . B64.decode . map (toEnum.fromEnum)
Run Code Online (Sandbox Code Playgroud)
乍一看这个功能应该和 一样id吧?为什么会在这里?
我想知道我是否可以写一个函数isPure :: Free f () -> Bool,它告诉你给定的自由 monad 是否相等Pure ()。对于一个简单的情况,这很容易做到,但对于更复杂的情况,我无法弄清楚 functor 有约束f。
import Control.Monad.Free
-- * This one compiles
isPure :: Free Maybe () -> Bool
isPure (Pure ()) = True
isPure _ = False
-- * This one fails to compile with "Ambiguous type variable ‘context0’ arising from a pattern
-- prevents the constraint ‘(Functor context0)’ from being solved."
{-# LANGUAGE RankNTypes #-}
type ComplexFree = forall context. (Functor context) => Free context …Run Code Online (Sandbox Code Playgroud) 我正在开发一个系统(受lsp-types启发),该系统使用标记有类型信息的 GADT 来表示客户端和服务器交换的不同类型的消息:
{-# LANGUAGE GADTs, DataKinds, KindSignatures, RankNTypes #-}
data From = FromClient | FromServer
data MessageType = Request | Notification
data Message (from :: From) (typ :: MessageType) where
Request1 :: Message FromClient Request
Request2 :: Message FromClient Request
Request3 :: Message FromServer Request
Notification1 :: Message FromClient Notification
Run Code Online (Sandbox Code Playgroud)
我的问题是,给定这些构造函数的列表(在存在性包装器中),我如何选择具有特定类型的它们的子集?
data SomeMessage where
SomeMessage :: forall f t. Message f t -> SomeMessage
allMessages = [SomeMessage Request1
, SomeMessage Request2
, SomeMessage Request3
, SomeMessage Notification1] …Run Code Online (Sandbox Code Playgroud) 我有一个关于转换Text为Data.Vector.Unboxed.Vector. 我一直在使用这样的基准测试工具来玩它weigh,并且我看到了很多无关的分配:
{-# LANGUAGE BangPatterns #-}
module Main (main) where
import Control.Monad
import Data.String.Interpolate
import Data.Text as T
import qualified Data.Vector.Unboxed as VU
import Weigh
testFunc :: Int -> Text -> Weigh ()
testFunc inputSize text = wgroup [i|#{inputSize} characters|] $ do
func' "VU_fromList" VU.fromList (T.unpack text)
func' "VU_fromListN" (\t -> VU.fromListN (T.length t) (T.unpack t)) text
main :: IO ()
main = mainWith $
forM_ [10, 100, 1000, 10000, 100000] $ \n -> …Run Code Online (Sandbox Code Playgroud) 我看到一个非常奇怪的反复出现的问题,Cabal干扰了我获得可重复的Haskell构建的能力.我有一个带沙盒的cabal项目.如果我这样做cabal install,我会得到表格的错误
Y failed during the building phase. The exception was:
ExitFailure 1
X depends on Y which failed to install.
其中X是我项目的直接依赖,Y是一些传递依赖.但是,如果我只是键入cabal install X,那么它的工作原理!
这是一个具体的例子:我的项目取决于interpolate包.当我这样做时cabal install --allow-newer,我得到这样的错误:
Resolving dependencies...
Configuring haskell-src-meta-0.6.0.9...
Building haskell-src-meta-0.6.0.9...
Preprocessing library haskell-src-meta-0.6.0.9...
[1 of 6] Compiling Language.Haskell.TH.Instances.Lift ( src/Language/Haskell/TH/Instances/Lift.hs, dist/dist-sandbox-d2861272/build/Language/Haskell/TH/Instances/Lift.o )
[2 of 6] Compiling Language.Haskell.Meta.Syntax.Translate ( src/Language/Haskell/Meta/Syntax/Translate.hs, dist/dist-sandbox-d2861272/build/Language/Haskell/Meta/Syntax/Translate.o )
[3 of 6] Compiling Language.Haskell.Meta.Parse ( src/Language/Haskell/Meta/Parse.hs, dist/dist-sandbox-d2861272/build/Language/Haskell/Meta/Parse.o )
[4 of 6] Compiling Language.Haskell.Meta.Parse.Careful ( src/Language/Haskell/Meta/Parse/Careful.hs, dist/dist-sandbox-d2861272/build/Language/Haskell/Meta/Parse/Careful.o ) …Run Code Online (Sandbox Code Playgroud)