erlang中的消息循环如何工作,它们在处理消息时是否同步?
据我所知,循环将从"接收"消息开始,然后执行某些操作并点击循环的另一次迭代.
那必须同步吗?对?
如果多个客户端将消息发送到同一个消息循环,那么所有这些消息都会排队并一个接一个地执行,或者?
要在并行处理多个消息,您必须在不同的进程中生成多个消息循环,对吧?
还是我误解了所有这些?
我需要从套接字解析输入流.数据是从Telnet客户端发送的,因此我想通过查找'\r'流中的第一个字符来处理传入的字符串,然后在返回char之前选择字节并最终处理任何backspace '\b'字符.
'\b'在这里处理比特的惯用方法是什么?我目前正在使用一个可变堆栈并将chars推到它上面,如果有一个退格,我会弹出最后一个char.然后将结果转换为字符串.
但我认为使用模式匹配和尾递归可能有一些很好的方法.那么,如何以F#方式完成呢?
let receiveInput (inputBuffer:StringBuilder) (received:Tcp.Received)=
let text = Encoding.ASCII.GetString(received.Data.ToArray());
inputBuffer.Append(text) |> ignore
let all = inputBuffer.ToString()
match all.IndexOf('\r') with
| enter when enter >= 0 ->
let textToProcess = all.Substring(0,enter)
inputBuffer.Remove(0,enter+2) |> ignore
//this is the part I'm wondering about
let stack = new Stack<char>()
for c in textToProcess do
if c = '\b' then stack.Pop() |> ignore
else stack.Push c
let input = new System.String(stack |> Seq.rev |> Seq.toArray)
Some(input)
| …Run Code Online (Sandbox Code Playgroud) 在F#中使用不可变字典时,添加/删除条目时会产生多少开销?
它会将整个存储桶视为不可变并克隆这些存储桶并仅重新创建项目已更改的存储桶吗?
即使是这种情况,似乎还有很多需要完成的复制才能创建新的字典(?)
我一直认为F#有两种不同的方式来传递参数,咖喱风格和元组风格.这实际上是对的吗?
它不仅仅是一种风格,咖喱风格和参数可以是简单的值或元组.
例如
someFunc (a,b) =
Run Code Online (Sandbox Code Playgroud)
这不是一个带有一个咖喱风格参数的函数,恰好是一个元组吗?允许我使用pipleline运算符将元组传递给此函数?(元组元素的名称)
(1,2) |> someFunc
Run Code Online (Sandbox Code Playgroud)
它是否正确?
什么被认为是对复杂单元(如编译器)进行单元测试的最佳方法?
多年来我写了一些编译器和解释器,我发现这种代码很难以一种好的方式进行测试.
如果我们采用类似抽象语法树生成的东西.你会如何使用TDD测试?
小结构可能很容易测试.例如:
string code = @"public class Foo {}";
AST ast = compiler.Parse(code);
Run Code Online (Sandbox Code Playgroud)
因为那不会产生很多ast节点.
但是,如果我真的想测试编译器可以为类似方法生成AST:
[TestMethod]
public void Can_parse_integer_instance_method_in_class ()
{
string code = @"public class Foo { public int method(){ return 0;}}";
AST ast = compiler.Parse(code);
Run Code Online (Sandbox Code Playgroud)
你会断言什么?手动定义代表给定代码的AST,并断言生成的AST符合手动定义的AST看起来非常简洁,甚至可能容易出错.
那么像这样的TDD复杂场景的最佳策略是什么?
tdd parsing unit-testing compiler-theory abstract-syntax-tree
当它变得可见/隐藏时,我正试图让ng-show元素动画化.但它只是表现为普通的ng-show,instand show/hide.
我找到了这个例子:http://jsfiddle.net/Kx4TS/1/ ,它工作正常.
但是,如果我使用相同的ng-animate属性和相同的css,它在我的情况下不起作用.还有什么我需要做的或动画不起作用的情况?
我的代码看起来像这样:
<div style="" ng-show="item.hasMax()"
class="box" ng-animate="{show: 'fadeIn', hide:'fadeOut'}">
Run Code Online (Sandbox Code Playgroud)
而css是:
.fadeIn-setup,.fadeOut-setup {
-webkit-transition: 1s linear opacity;
-moz-transition: 1s linear opacity;
-o-transition: 1s linear opacity;
transition: 1s linear opacity;
}
.fadeIn-setup{
opacity:0;
}
.fadeOut-setup{
opacity:1;
}
.fadeIn-setup.fadeIn-start {
opacity: 1;
}
.fadeOut-setup.fadeOut-start{
opacity:0;
}
Run Code Online (Sandbox Code Playgroud)
此外,是否有可能使ng-animate像jquery slideDown/slideUp动画那样做?
有什么方法可以将PhantomJS网络服务器的结果作为二进制文件返回?
更具体地说,如果我将页面的屏幕截图呈现为base64,那么我可以将此base64字符串转换为二进制并返回它,以便客户端将其作为图像接收吗?
这就是我到目前为止所做的,我已经评论了一些显然无效的实验
response.statusCode = 200;
response.setHeader("Content-Type", "image/png");
//response.setHeader("Content-Encoding","base64");
var base64 = page.renderBase64('png');
//var binary=atob(base64,"b");
response.write(base64 );
response.close();
Run Code Online (Sandbox Code Playgroud)
想法?
可以说我有一个IObservable<Something>服务器端,存储在静态字段或其他任何东西.
让我们假设我有一个SignalR集线器,它有一个Subscribe方法和一个有notify功能的signalR客户端.
public static IObservable<string> Events;
protected void Application_Start()
{
//dummy observable just to generate events for me..
Events = Observable
.Timer(TimeSpan.Zero, TimeSpan.FromMilliseconds(50))
.Select(l => l.ToString());
...snip..
}
Run Code Online (Sandbox Code Playgroud)
和:
public class MyHub1 : Hub
{
public void Subscribe()
{
Clients.All.notify("start");
WebApiApplication.Events
.Subscribe(s => Clients.Caller.notify(s));
}
}
Run Code Online (Sandbox Code Playgroud)
和:
myHub.client.notify = function (event) {
console.info(event);
};
Run Code Online (Sandbox Code Playgroud)
我需要做什么才能使所有客户共享可观察信息?也就是说,我希望每个连接客户端在订阅后接收最后200个事件.然后每个客户端应该实时滴答相同的事件.
我想Replay应该以某种方式使用IObservable 的方法.我希望这个行为非常类似于聊天,用户可以实时查看最后的x条消息+每个新事件.
除了如何实际构成可观察的查询之外,在Asp.NET中存储和设置共享事件流的最佳方法是什么?
我正在努力学习SynchronizationContext和朋友们.如果我在例如控制台应用程序的开头设置自定义同步上下文.在什么条件下,当前的同步上下文会与我的异步操作一起流动?Task和其他人之间是否存在差异,例如Delegate.BeginInvoke?
void Main()
{
SynchronizationContext.SetSynchronizationContext(new FooContext());
Action a = () =>
{
var current = SynchronizationContext.Current;
//current is null here
};
a.BeginInvoke(null,null);
...sleep
Run Code Online (Sandbox Code Playgroud)
如果我在线程池上执行东西,我是否被迫为当前正在执行我的工作的特定线程分配同步上下文?
c# asynchronous synchronizationcontext task-parallel-library
我们正在使用Json.net进行序列化.我们希望允许任何类型的用户定义的类/消息可序列化.
这Json.net不能支持开箱即用的一件事是,如果你存储的int,float或decimal在object现场.例如
public class SomeMessage
{
public object Something {get;set;}
}
Run Code Online (Sandbox Code Playgroud)
如果我存储一个int,float或者decimal在Something字段中,它将被反序列化为a long或a double(因为json.net除了猜测json中基元的类型之外不能做任何事情("foo":123 < - int或长?)
我完全知道我可以在属性上使用正确的类型并设置各种提示.
但是我想为任何随机类/消息解决这个问题.
我目前的方法是一个自定义的JsonConverter,它处理上面的类型,然后将它们序列化为代理类型,它将值保存为字符串,并将其作为类型的鉴别器.然后在ReadJson上我将其转回正确的类型.
这样做有很多过热.特别是对于代理类型的类型名称."foo.bar.baz.PrimitiveSurrogate,mylib"
我可以自定义此typename的存储方式吗?例如,如果我想将别名应用于某些特定类型?
还有其他方法吗?我可以将整个事物序列化为一个特殊的字符串,它会更小,但是再一次,感觉就好了.
那么,如果我想在存储在无类型结构中时保持基元的正确类型,我有什么选择呢?
[编辑]
普通Json:
{
"foo":123
}
Run Code Online (Sandbox Code Playgroud)
与
我们目前的代理版本:
{
"foo": {
"$type":"Akka.Serialization.PrimitiveSurrogate, Akka",
"V":"123",
"T":1
}
}
Run Code Online (Sandbox Code Playgroud)
我可以用"V"代替V和T:"123L"并解析后缀,因为我们只存储该类型的int,float和decimal,所以我们可以很容易地得到一个硬编码的描述符.
但是,这仍然没有摆脱代理人本身的$类型,我想至少缩短到类似"$ type":"代理"或者那个方向的东西.
[再次编辑]我已经把它归结为:
{"$type":"Akka.Util.PrimitiveSurrogate, Akka","V":"F123.456"}
Run Code Online (Sandbox Code Playgroud)
但我真的想摆脱长名字,并以某种方式替换别名.
[再次编辑]
我现在已经明白了:
{"$":"M123.456"}
Run Code Online (Sandbox Code Playgroud)
那个好的imo.我们不需要与任何其他json系统互操作,它只是我们在两端的框架,所以即使它不漂亮,编写的格式也可以工作.
c# ×3
f# ×3
javascript ×2
angularjs ×1
ascii ×1
asp.net ×1
asynchronous ×1
base64 ×1
currying ×1
dictionary ×1
erlang ×1
immutability ×1
json ×1
json.net ×1
message-loop ×1
mime-types ×1
ng-animate ×1
parsing ×1
phantomjs ×1
signalr ×1
tdd ×1
telnet ×1
tuples ×1
unit-testing ×1