我正在使用REST构建客户端产品.所有用户交互都将通过浏览器完成(配置内容将在localhost上运行的服务器上).我希望一切都符合REST,即使应用程序将在客户端的机器上运行localhost,也永远无法从外部访问.
命令非常简单:
这是我想出的:
什么是最RESTful的实现方式?
注意:
我不是要求仔细检查我的软件架构.我有理由选择REST接口而不是unix域套接字,CLI接口,甚至是常规GUI接口.理由会使问题过于复杂化并使其过于局部化.
我对几个不同的项目(仅限客户端和服务器)都有相同的需求,我正在寻找有关最佳实践的社区意见.
我一直在使用EcmaScript 5规范中的Object.create,我正在尝试创建一个多继承类型结构.
假设我有一些功能:a,b和c.只处理原型,我可以这样做:
function a () {}
a.prototype = {
fnA = function () {},
propA = 500
};
function b () {}
b.prototype = a.prototype;
b.prototype.fnB = function () {};
b.prototype.propB = 300;
function c () {}
c.prototype = b.prototype;
c.prototype.fnC = function () {};
c.prototype.propC = 200;
Run Code Online (Sandbox Code Playgroud)
但是使用Object.create,我会做一些事情:
function a() {}
a.prototype = {
fnA = function () {},
propA = 500
};
var b = Object.create(new a());
b.fnB = function () {};
b.propB = 300;
var c …Run Code Online (Sandbox Code Playgroud) javascript prototypal-inheritance ecmascript-5 object-create
我找到了看起来很有用的SCons,但这并不是我想要的.我真的不想要一个构建工具; 我真正想要的是包管理器.
其他语言有类似的工具:
我想拥有一个开源D项目的数据库,只需要几个命令即可集成到更大的应用程序中,例如(假设dpack是命令):
# get source from database, run build script if there is one
dpack install some_package
# builds current package, grabbing dependencies as necessary
dpack build
# removes source (build will fail without it)
dpack remove
Run Code Online (Sandbox Code Playgroud)
对D有什么这样的吗?如果没有,我可能最终会自己写.
我正在使用两端的node.js构建一个文件同步程序(与Dropbox不同).我需要有数千个客户端同时请求数据.
这是我目前的系统:
我将以压缩块的形式提供数据,例如每个50 MB,因此HTTP请求开销(标头)可以忽略不计.
如果我使用websockets进行请求和推送通知,会有:
我想我需要通过专用websocket发送通知,因为我不希望它们在下载过程中在服务器上排队(大量开销).
注意:只要客户端的系统处于打开状态,这些websockets将是长期打开的.
编辑:我将在不同端口上的不同http服务器上使用websockets,以便将它们移动到不同的CPU核心.我可能会有数千个(如果不是数十万个)并发的websockets打开...
我做了一些搜索,但我找不到JavaScript正则表达式中\ s中包含的空白字符的确切列表.
我知道我可以依赖空格,换行,回车和制表符作为空格,但我认为,因为JavaScript传统上只用于浏览器,所以可能是URL编码的空格和类似的东西 ,%20也会得到支持.
JavaScript的正则表达式编译器究竟考虑了什么? 如果浏览器之间存在差异,我只关心webkit浏览器,但了解任何差异会很好.那么,node.js呢?
我想使用Git跟踪大型工作目录(许多演出)的微观变化(每天几次).数据将是混合二进制/纯文本.二进制数据的变化几乎不会与文本信息一样多.很少需要访问旧提交,并且可能很慢,而最近的历史需要很快.
我不想永久丢失旧数据,只需将其移动到备份服务器或其他东西.Git中是否存在允许将旧历史存档并仅在本地存储库中保留某个子集的内容?
如果没有,是否有更适合此目的的工具?我喜欢Git,因为我知道它,我想要版本控制和差异.我不需要Git的任何高级功能(如分支/合并,不分发),所以任何其他类似的VCS都会很好.
我有一些频道都收到相同的消息:
func broadcast(c <-chan string, chans []chan<- string) {
for msg := range c {
for _, ch := range chans {
ch <- msg
}
}
}
Run Code Online (Sandbox Code Playgroud)
但是,由于每个通道chans都可能以不同的速率读取,因此当我得到一个慢的消费者时,我不想阻止其他通道.我用goroutines解决了这个问题:
func broadcast(c <-chan string, chans []chan<- string) {
for msg := range c {
for _, ch := range chans {
go func() { ch <- msg }()
}
}
}
Run Code Online (Sandbox Code Playgroud)
但是,传递给每个通道的消息顺序很重要.我看了一下规范,看看频道在封锁时是否保留了顺序,而我发现的只是:
如果容量大于零,则通道是异步的:如果缓冲区未满(发送)或非空(接收),则通信操作成功而不阻塞,并且按发送顺序接收元素.
对我来说,如果写入被阻止,那么它不会被"发送",而是等待被发送.有了这个假设,上面没有说明多个goroutine在写入时被阻止的发送顺序.
在通道被解除阻塞后,是否有关于发送顺序的保证?
我喜欢Go,特别是goroutines.它们简单而有效.经过一番挖掘后,似乎它们基本上是光纤复用到内核线程池上(如果我错了,请纠正我).
话虽如此,D中是否有任何标准库(或相对受欢迎且支持的第三方添加)?
我想要的主要是:
这里的主要目标是使Web服务器尽可能高效地与Node.js和Go的速度相媲美.这意味着可能存在许多活动连接(http,websockets,数据流).
我喜欢上面提到的其他平台,但D更加通用化.如果不是太笨重,我会选择D而不是其他人.
我正在D标准库中寻找Set实现,我只发现了这些:
如果我只能弄清楚如何使用它们,这两种方法都可以正常工作.我从RedBlackTree开始(因为我已经熟悉它们是如何工作的),这就是我想出的:
auto rbt = redBlackTree!string();
foreach(s; setOfStrings) {
rbt.insert(s);
}
foreach(s; rbt) {
if (s[0 .. 3] == "sth") {
rbt.removeKey(s);
}
}
Run Code Online (Sandbox Code Playgroud)
我知道我可以在第一个foreach中完成这个条件,但这只是一个示例,表明我需要添加和删除Set中的元素.这会工作,但我得到编译错误:
错误:模板std.container.RedBlackTree(串).RedBlackTree.removeKey(U)如果(!isImplicitlyConvertible(U,ELEM))不匹配任何函数模板声明
错误:!模板std.container.RedBlackTree(串).RedBlackTree.removeKey(U)如果(!isImplicitlyConvertible(U,ELEM))不能从参数类型推断模板函数()(字符串
我不需要红黑树(任何没有重复的东西),速度不是太重要.我可以这样做:
string[] arr;
foreach(s; setOfStrings) {
// check for duplicate code here...
arr ~= s;
}
for(int i = 0; i < arr.length; i++) {
if (s[0 .. 3] == "sth") {
arr = arr[0 .. i] ~ arr[i + 1 .. $];
i++;
}
}
Run Code Online (Sandbox Code Playgroud)
标准库中是否有任何简单的Set?
我正在 Windows 中编写一个批处理文件来运行安装后脚本,需要做的一件事是在系统路径中添加一个目录。
该脚本正在运行,它执行以下操作:
setx Path "%PATH%;c:\path\to\add" -m
这是正确设置路径,但如果用户重新安装程序,此脚本可能会多次运行。
我想搜索字符串,c:\path\to\add所以我不会一遍又一遍地向系统路径添加相同的路径。这在带有 的 Linux 中非常简单sed,但我不知道 Windows 中的命令是什么。我找到了findstr,但这似乎只适用于文件。
在不安装额外软件的情况下,这在 Windows 中是可能的吗?
编辑:
我正在使用 Inno Setup 创建安装可执行文件。
d ×3
go ×2
javascript ×2
batch-file ×1
channel ×1
concurrency ×1
containers ×1
coroutine ×1
ecmascript-5 ×1
git ×1
goroutine ×1
inno-setup ×1
node.js ×1
optimization ×1
path ×1
phobos ×1
regex ×1
rest ×1
set ×1
websocket ×1
windows ×1