我经常读到Hg(和Git和......)在合并方面比SVN更好但是我从未见过Hg/Git可以合并SVN失败的地方(或者SVN需要人工干预的地方)的实际例子.您可以发布一些分支/修改/提交/ ....-操作的逐步列表,显示SVN在Hg/Git愉快地移动时会失败的位置吗?实用,非常特殊的情况请...
一些背景:我们有几十个开发人员在使用SVN进行项目,每个项目(或一组类似项目)都在自己的存储库中.我们知道如何应用发布和功能分支,所以我们不会经常遇到问题(即,我们一直在那里,但我们已经学会克服Joel的问题 "一个程序员给整个团队造成创伤"或"需要六个开发人员两周才能重新整合分支机构").我们的发布分支非常稳定,仅用于应用错误修正.我们的中继线应该足够稳定,能够在一周内创建发布.我们还有一些开发人员或开发人员可以使用的功能分支.是的,它们在重新集成后被删除,因此它们不会使存储库混乱.;)
所以我仍然试图找到Hg/Git优于SVN的优势.我很想获得一些实践经验,但目前还没有任何我们可以移动到汞/ GIT中还没有更大的项目,所以我坚持用只含有少量由文件小型人工玩的项目.而且我正在寻找一些你可以感受到Hg/Git令人印象深刻的力量的案例,因为到目前为止我经常读到它们但却未能自己找到它们.
为什么下面的XAML给我一个带有(无意义)消息的"XamlParseException""表达式类型不是有效的样式值".在运行时?
<Control x:Class="TestApp.Max.MyControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:Max="clr-namespace:TestApp.Max"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300">
<Control.Template>
<ControlTemplate>
<TextBlock Name="txt" Text="{TemplateBinding Max:MyControl.Foo}" />
<ControlTemplate.Triggers>
<Trigger Property="Control.IsMouseOver" Value="True">
<Setter TargetName="txt" Property="Text" Value="{TemplateBinding Max:MyControl.Bar}" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Control.Template>
</Control>
Run Code Online (Sandbox Code Playgroud)
违规行是
<Setter TargetName="txt" Property="Text" Value="{TemplateBinding Max:MyControl.Bar}" />
Run Code Online (Sandbox Code Playgroud)
如果我用普通的Binding替换TemplateBinding,它开始工作:
{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Text2}
Run Code Online (Sandbox Code Playgroud)
我不应该使用TemplateBinding,因为我在ControlTemplate中?异常消息的真正含义是什么?
通常当我尝试安装新软件包时,conda也想更新其他软件包,即使我已经添加了--no-update-dependencies开关.这些更新似乎是"不必要的" - 就像大多数时候只有版本号的最后一部分发生了变化.
今天我想安装mpld3包,conda想要将我的python包从版本3.4.4-2更新到3.4.4-4,即使我已经添加了--no-update-dependencies开关.
如何让conda安装mpld3包而不触及我的其他包?
C:\...>conda install -p pyenv --no-update-dependencies mpld3
Fetching package metadata: ....
Solving package specifications: ...........
Package plan for installation in environment C:\...\pyenv:
The following packages will be downloaded:
package | build
---------------------------|-----------------
vs2010_runtime-10.00.40219.1| 0 1.1 MB
python-3.4.4 | 4 31.7 MB
mpld3-0.2 | py34_0 123 KB
------------------------------------------------------------
Total: 33.0 MB
The following NEW packages will be INSTALLED:
mpld3: 0.2-py34_0
vs2010_runtime: 10.00.40219.1-0
The following packages will be UPDATED:
python: 3.4.4-2 --> 3.4.4-4
Proceed ([y]/n)?
Run Code Online (Sandbox Code Playgroud) 我想测试以下异步工作流程(使用NUnit + FsUnit):
let foo = async {
failwith "oops"
return 42
}
Run Code Online (Sandbox Code Playgroud)
我为它编写了以下测试:
let [<Test>] TestFoo () =
foo
|> Async.RunSynchronously
|> should equal 42
Run Code Online (Sandbox Code Playgroud)
自从foo抛出后,我在单元测试运行器中得到以下stacktrace:
System.Exception : oops
at Microsoft.FSharp.Control.CancellationTokenOps.RunSynchronously(CancellationToken token, FSharpAsync`1 computation, FSharpOption`1 timeout)
at Microsoft.FSharp.Control.FSharpAsync.RunSynchronously(FSharpAsync`1 computation, FSharpOption`1 timeout, FSharpOption`1 cancellationToken)
at ExplorationTests.TestFoo() in ExplorationTests.fs: line 76
Run Code Online (Sandbox Code Playgroud)
不幸的是,堆栈跟踪并没有告诉我异常的位置.它在RunSynchronously处停止.
某处我听说Async.Catch神奇地恢复了堆栈跟踪,所以我调整了我的测试:
let [<Test>] TestFooWithBetterStacktrace () =
foo
|> Async.Catch
|> Async.RunSynchronously
|> fun x -> match x with
| Choice1Of2 x -> x |> should equal 42
| Choice2Of2 …
Run Code Online (Sandbox Code Playgroud) 我使用Process.Start来启动批处理文件.批处理文件使用"START"命令并行启动多个程序然后退出.
批处理文件完成后,Process.HasExited变为true,Process.ExitCode包含正确的退出代码.
但是当我调用Process.WaitForExit()时,它会挂起/永不返回.
下面的代码演示了这个问题.它创建一个批处理文件,启动它然后打印:
Process is still running...
Batch file is done!
Process has exited. Exit code: 123
Calling WaitForExit()...
Run Code Online (Sandbox Code Playgroud)
然后它应该打印:
WaitForExit returned.
Run Code Online (Sandbox Code Playgroud)
...但它永远不会(尽管HasExited是真的,我们已经有了一个ExitCode).
open System.IO
open System.Diagnostics
open System.Threading
let foobat = """
START ping -t localhost
START ping -t google.com
ECHO Batch file is done!
EXIT /B 123
"""
File.WriteAllText("foo.bat", foobat)
use p = new Process(StartInfo = ProcessStartInfo("foo.bat",
UseShellExecute = false,
RedirectStandardOutput = true,
RedirectStandardError = true))
let onOutput = DataReceivedEventHandler(fun _ args -> printfn "%s" args.Data)
p.OutputDataReceived.AddHandler …
Run Code Online (Sandbox Code Playgroud) 简化后,我要解决以下问题:
你有一个填充0和1的二维数组.找到最小数量的矩形,使它们覆盖所有1.矩形不应重叠.
函数签名可能如下所示:
List<Rectangle> FindCoveringRectangles(bool[,] array)
我已经有一个"足够好"的解决方案,但并不总能找到最小数量的矩形.我想知道是否有一些众所周知且有效的算法可用于解决这个问题?
例:
输入数组:
..........
.1.....11.
.......11.
...111....
...111....
...111....
....1111..
....1111..
......11..
..........
Run Code Online (Sandbox Code Playgroud)
(为了便于阅读,将0替换为点)
可能导致以下矩形:
(2,2,2,2),
(2,8,3,9),
(4,4,6,6),
(7,5,8,8),
(9,7,9,8)
Run Code Online (Sandbox Code Playgroud)
(上,左,下,右),基于1
可以有多个解决方案,但其中一个就足够了.
我有以下F#程序:
open MyModule
printfn "%d" test
Run Code Online (Sandbox Code Playgroud)
MyModule是:
module MyModule
printfn "foo"
let test =
printfn "bar"
42
Run Code Online (Sandbox Code Playgroud)
这会产生以下输出:
foo
bar
42
Run Code Online (Sandbox Code Playgroud)
当我将MyModule更改为:
module MyModule
printfn "foo"
let test =
// printfn "bar" <-- note the comment!
42
Run Code Online (Sandbox Code Playgroud)
......结果是:
42
Run Code Online (Sandbox Code Playgroud)
为什么"foo"不再打印?
我使用Async.Catch来处理异步工作流抛出的异常:
work
|> Async.Catch
|> Async.RunSynchronously
|> fun x -> match x with
| Choice1Of2 _ -> () // success
| Choice2Of2 ex -> // failure, handle exception
Run Code Online (Sandbox Code Playgroud)
今天我注意到Async.Catch不处理OperationCanceledExceptions.而不是从Async.Catch获得选择,异常不断冒泡直到它击中我.我希望下面的测试是红色的,但它是绿色的:
[<Test>]
let ``Async.Catch doesnt work on OperationCancelledExceptions``() =
use cancellationTokenSource = new System.Threading.CancellationTokenSource(1000)
let work = async {
while true do
do! Async.Sleep 100
}
(fun () -> work
|> Async.Catch
|> fun x -> Async.RunSynchronously (x, cancellationToken=cancellationTokenSource.Token)
|> ignore)
|> should throw typeof<System.OperationCanceledException>
Run Code Online (Sandbox Code Playgroud)
使用Async.Catch + Choices +匹配以及其他一些使用try/catch块评估一些异常似乎不正确......它看起来像下面这样,这太复杂了.除此之外,我想知道Async.Catch有什么用,因为我必须使用try/catch块...:
[<Test>]
let ``evaluating …
Run Code Online (Sandbox Code Playgroud) 当其 MailboxProcessor 被处理(或以其他方式停止)时,是否可以让 PostAndAsyncReply 立即返回?或者是否有一些关于如何安全地使用 PostAndReply 方法而不造成死锁的“模式”/最佳实践?
现在我遇到的问题是 PostAndAsyncReply 在 MailboxProcessor 被处理后永远不会返回。使用 timeout 参数不是一种选择,因为我迫不及待(此外,选择合理的超时非常困难或不可能,因为它取决于太多因素)。
[<Test>]
let ``waiting for a reply from a disposed agent``() =
use server = MailboxProcessor.Start(fun inbox -> async {
()
})
(server :> System.IDisposable).Dispose()
server.PostAndReply (fun reply -> reply) // <- deadlock
|> ignore)
Run Code Online (Sandbox Code Playgroud)
编辑:我见过的大多数邮箱处理器示例(包括 MSDN 上的示例)甚至不介意处理邮箱处理器。并且 MSDN 没有解释 MailboxProcessors 在被处理时如何反应。没有必要处置它们吗?
Dapper(1.13 Noobget Package)创建不同的SQL语句,具体取决于它是与普通的ADO.NET数据库连接一起使用还是与装饰的迷你探查器数据库连接一起使用.
示例代码(使用Postgresql测试)
Usings:
using System.Linq;
using Dapper;
using Npgsql;
using NUnit.Framework;
using StackExchange.Profiling;
using StackExchange.Profiling.Data;
Run Code Online (Sandbox Code Playgroud)
Test1使用普通的ADO.NET连接并失败:
[TestFixture]
public class DapperTests {
private const string cnnstr = "HOST=...;DATABASE=...;USER ID=...;PASSWORD=...;";
[Test]
public void Test1() {
using (var cnn = new NpgsqlConnection(cnnstr)) {
cnn.Open();
// The following line fails:
cnn.Query<int>("SELECT 1 WHERE 42 IN @Items", new {Items = new[] {41, 42, 43}}).Single();
// Npgsql.NpgsqlException : ERROR: 42883: operator does not exist: integer = integer[]
}
}
Run Code Online (Sandbox Code Playgroud)
Test2使用围绕ADO.NET连接的mini-profiler连接并成功: …
取消不同类型的Asyncs时,我遇到了看似不一致的行为问题.
为了重现这个问题,让我们说有一个函数可以获取一个"作业"列表(Async <_>列表),等待它们完成并打印出它们的结果.该函数还会获取取消令牌,因此可以取消它:
let processJobs jobs cancel =
Async.Start(async {
try
let! results = jobs |> Async.Parallel
printfn "%A" results
finally
printfn "stopped"
}, cancel)
Run Code Online (Sandbox Code Playgroud)
该函数被调用如下:
let jobs = [job1(); job2(); job3(); job4(); job5()]
use cancel = new CancellationTokenSource()
processJobs jobs cancel.Token
Run Code Online (Sandbox Code Playgroud)
稍后它会被取消:
Thread.Sleep(1000)
printfn "cancelling..."
cancel.Cancel()
Run Code Online (Sandbox Code Playgroud)
取消令牌源被取消后,该函数应执行finally块并打印"已停止".
这适用于job1,2和3,但是当列表中有job4或job5时不起作用.
Job1只是Async.Sleeps:
let job1() = async {
do! Async.Sleep 1000000
return 10
}
Run Code Online (Sandbox Code Playgroud)
Job2启动一些异步子进程并等待它们:
let job2() = async {
let! child1 = Async.StartChild(async {
do! Async.Sleep 1000000
return …
Run Code Online (Sandbox Code Playgroud) 有没有办法让protobuf序列化/反序列化F#的歧视联盟?
我正在尝试使用protobuf序列化消息.消息是F#记录和受歧视的联合.
序列化似乎适用于记录,但我不能让它与歧视的联合工作.
在下面的代码中,测试testMessageA和testMessageB是绿色的.测试testMessageDU为红色.
module ProtoBufSerialization
open FsUnit
open NUnit.Framework
open ProtoBuf
type MessageA = {
X: string;
Y: int;
}
type MessageB = {
A: string;
B: string;
}
type Message =
| MessageA of MessageA
| MessageB of MessageB
let serialize msg =
use ms = new System.IO.MemoryStream()
Serializer.SerializeWithLengthPrefix(ms, msg, PrefixStyle.Fixed32)
ms.ToArray()
let deserialize<'TMessage> bytes =
use ms = new System.IO.MemoryStream(buffer=bytes)
Serializer.DeserializeWithLengthPrefix<'TMessage>(ms, PrefixStyle.Fixed32)
[<Test>]
let testMessageA() =
let msg = {X="foo"; Y=32}
msg |> serialize |> deserialize<MessageA> |> …
Run Code Online (Sandbox Code Playgroud) 我想使用FSharp.Data.CsvProvider(v1.1.10)创建一个类型来处理带有";"的CSV文件 分隔符和预定义的模式.
以下行报告错误:
type CsvType1 = CsvProvider<Sample="1;2;3", Separator=";", Schema="category (string), id (string), timestamp (string)">
Run Code Online (Sandbox Code Playgroud)
错误是:
指定的参数既不是文件,也不是格式良好的CSV:无法找到文件'...\1; 2; 3'.
将Sample设置为"",null或不设置它会产生其他错误.
使用","的分隔符和"1,2,3"的样本工作正常..但是无法读取我的csv文件.
我究竟做错了什么?