有人知道从Microsoft Edge中的ReadableStream创建新响应的方法吗?
对于Chrome,这非常简单.您可以在第一个参数ReadableStream的构造函数中获取并传递它Response.例如,您可以Response通过网络响应创建一个带有另一个状态代码的新代码,而无需复制响应:
fetch('https://www.baqend.com/')
.then(res => new Response(res.body, { status: 222 }))
.then(it => it.text())
.then(it => console.log('Text prefix ' + it.substr(0,16)))
.catch(it => console.log('error: ' + it))
Run Code Online (Sandbox Code Playgroud)
虽然这在Chrome中完美运行,但Edge不支持构造函数的ReadableStream输入Response.我在Edge中使用它的唯一方法是首先获得文本响应(有效地复制响应并阻止流):
fetch('https://www.baqend.com/')
.then(it => it.text())
.then(text => new Response(text, { status: 222 }))
.then(it => it.text())
.then(it => console.log('Text prefix ' + it.substr(0,16)))
.catch(it => console.log('error: ' + it))
Run Code Online (Sandbox Code Playgroud)
有没有人知道从Edge中的可读流创建新响应的方法?
PS:我正在使用Microsoft Edge 42.17115.1.0(最新的开发人员预览版,因为我正在测试Service Workers)
PPS:第一代码不工作在Firefox或者是因为Firefox不支持获取RedableStream的Response.body …
如果我有以下具有私有构造函数的case类,并且我无法访问companion对象中的apply-method.
case class Meter private (m: Int)
val m = Meter(10) // constructor Meter in class Meter cannot be accessed...
Run Code Online (Sandbox Code Playgroud)
有没有办法将case类与私有构造函数一起使用,但是在公开的伴随中保留生成的apply-method?
我知道两个选项之间没有区别(在我的例子中):
val m1 = new Meter(10)
val m2 = Meter(10)
Run Code Online (Sandbox Code Playgroud)
但我想禁止第一种选择.
- 编辑 -
令人惊讶的是以下工作(但实际上并不是我想要的):
val x = Meter
val m3 = x(10) // m3 : Meter = Meter(10)
Run Code Online (Sandbox Code Playgroud) 最终方法不能在子类中重写.但有了Scala的魔力,似乎这是可能的.
请考虑以下示例:
trait Test {
final def doIt(s: String): String = s
}
object TestObject extends Test {
def doIt: String => String = s => s.reverse
}
Run Code Online (Sandbox Code Playgroud)
该方法doIt中的对象TestObject具有不相同的签名doIt中的性状Test.因此doIt重载而不是重写.但正常调用doIt始终调用方法TestObject:
val x = TestObject.doIt("Hello") //> x : String = olleH
Run Code Online (Sandbox Code Playgroud)
问:
我怎样才能调用原始的方法doIt上TestObject.这是可能的还是这种方法"有点被覆盖"?
我在Mac OS(El Capitan 10.11.4)上使用版本1.12.0(版本10871)中的docker,我想为docker守护程序提供配置文件.
在Ubuntu下,您将配置置于/etc/default/docker(参见文档)下.不幸的是,我无法弄清楚在Mac OS中将配置放在何处
有任何想法吗?
除了浏览器缓存之外,还有一些浏览器缓存数据的方式.对于Chrome,渲染引擎Blink中还有另一个缓存,可将图像,样式,脚本和字体(可能更多)存储在内存中.
此缓存用于站点上的连续导航.从Blink缓存传递的资源(from memory cache)在网络选项卡中标记.从浏览器缓存提供的资源标记为(from disk cache).
我现在的问题是,哪些资源存储在这个非常快的缓存中?从我的测试来看,它变化很大:
磁盘缓存命中和内存缓存命中之间的一个巨大差异与Service Workers结合使用.在服务工作者中无法观察到由内存缓存提供的请求(因为缓存位于服务工作者之前).磁盘缓存提供的请求通过Service Worker(因为浏览器缓存位于Service Worker后面).
为了显示解释的行为,我构建了一个包含所有资源类型的测试页面:https://dm-clone-optimized.app.baqend.com/
您可以使用顶部的链接浏览站点,并观察请求在网络选项卡和控制台中的行为方式.每个页面加载相同的资源.
经过一些导航(Chrome 70.0.3538.67)之后,我大部分时间都会遇到这种情况:

scripts.js,并scripts2.js从内存中缓存logo.png也来自内存styles.css来自磁盘缓存 :(scripts2.js?id=1也来自磁盘缓存 :(我很想了解Blink内存缓存是如何工作的,以及如何调整我的网站以将其用于具有适当cache control标头的所有资源.
----编辑----
最让我担心的是:为什么动态添加的脚本根本没有缓存?这对框架有明显的影响,scripts.js因为它们将所有依赖项作为动态添加的脚本标记插入.
我希望我的服务工作者在某些情况下的行为就像浏览器缓存一样.这意味着在使用缓存命中进行响应时,我首先需要确保资源未过期.我可以这样做,例如:
const cacheControl = response.headers.get('cache-control');
const date = new Date(response.headers.get('date'));
const age = parseInt(response.headers.get('age') || '0', 10);
const maxAge = getMaxAge(cacheControl);
const expiration = date.getTime() + 1000 * (maxAge - age);
const isFresh = Date.now() < expiration;
Run Code Online (Sandbox Code Playgroud)
我得到的cache-control,date并age从缓存的响应头,计算到期,并比较当前时间.
这种方法的唯一问题是它可能受客户端和服务器之间的时钟漂移影响.这是因为日期标题是在服务器端生成的,但最终的比较是使用本地客户端时间进行的.
假设客户端时间关闭一天(有时可能会发生这种情况),现在缓存条目可能比预期更长或更短一天缓存.
我想要的解决方案是在缓存中存储响应时将获取时间添加为自定义标头.然后我可以使用这个自定义标题而不是
const networkResponse = fetch(request);
// does not work, headers are immutable
networkResponse.headers.append('x-time-fetched', Date.now());
cach.put(request, networkResponse);
Run Code Online (Sandbox Code Playgroud)
遗憾的是,此解决方案不起作用,因为网络响应不可变.顺便说一句:复制响应以添加此附加信息不是一种选择.
有人知道如何正确识别浏览器等陈旧缓存条目吗?
我刚刚在 Redis 中发现了 Lua 环境的一个有趣的行为:
我有一个 Lua 脚本,执行一些简单的设置操作,并在脚本末尾生成像 id 这样的唯一时间戳 - 将 Redis 用作时间戳预言机 - 像这样:
...
local time = redis.call('TIME')
local millis = (tonumber(time[1]) * 1000) + math.floor(tonumber(time[2]) / 1000)
local version = string.format("%.0f",mills) .. string.format("%05d", math.random(99999))
Run Code Online (Sandbox Code Playgroud)
现在version是这样的:145209287564117083由一个时间戳和末尾的五个随机数字组成 - 至少我是这么想的。
实际发生的情况是,末尾的五个随机数字(由 生成)math.random(99999)根本不是随机的,而是始终是数字17083,无论脚本执行的频率如何。
对我来说这不是什么大问题(因为我可以在脚本返回后附加随机数字),但我没想到会出现这种行为,因此需要相当长的时间来找到我的错误。
我希望这些信息可以节省一些时间。
我有一个简单的 4 台服务器设置,运行 jMeter(3 个从站,1 个主站):
从机 1:10.135.62.18 运行 ./jmeter-server -Djava.rmi.server.hostname=10.135.62.18
从站 2:10.135.62.22 运行 ./jmeter-server -Djava.rmi.server.hostname=10.135.62.22
从站 3:10.135.62.20 运行 ./jmeter-server -Djava.rmi.server.hostname=10.135.62.20
大师:10.135.62.11 与 remote_hosts=10.135.62.18,10.135.62.22,10.135.62.20
我开始测试 ./jmeter -n -t /root/jmeter/simple.jmx -l /root/jmeter/result.jtl -r
具有以下输出:
Writing log file to: /root/apache-jmeter-3.0/bin/jmeter.log
Creating summariser <summary>
Created the tree successfully using /root/jmeter/simple.jmx
Configuring remote engine: 10.135.62.18
Configuring remote engine: 10.135.62.22
Configuring remote engine: 10.135.62.20
Starting remote engines
Starting the test @ Mon Aug 29 11:22:38 UTC 2016 (1472469758410)
Remote engines have been started
Waiting for …Run Code Online (Sandbox Code Playgroud) 我正在单个服务器上实现乐观事务(BOCC)。在提交时,根据当前数据库状态验证读取和写入集(如果自读取后状态发生更改,则事务将中止)。如果验证成功,所有对象都会写入数据库。
对不同对象集的验证(加上数据库更新)可以是并发的,但必须使用读锁和写锁来保护重叠的对象集。
我使用ReentrantReadWriteLock来确保验证的安全,效果很好。现在我正在编写一个恢复机制,如果由于某些错误(验证后)并非所有对象都写入数据库,该机制会重复更新过程。
因此恢复会重复数据库写入,然后尝试释放锁(恢复成功后)。问题是我尝试从不同的线程释放锁(因为恢复是由另一个后台服务执行的),这会抛出IllegalMonitorStateException. 该方法的注释unlock验证了此行为。
/**
* Attempts to release this lock.
*
* <p>If the current thread is the holder of this lock then
* the hold count is decremented. If the hold count is now
* zero then the lock is released. If the current thread is
* not the holder of this lock then {@link
* IllegalMonitorStateException} is thrown.
*
* @throws IllegalMonitorStateException if the current thread does not
* hold …Run Code Online (Sandbox Code Playgroud) caching ×2
javascript ×2
scala ×2
apply ×1
case-class ×1
concurrency ×1
config ×1
daemon ×1
docker ×1
final ×1
http ×1
java ×1
jmeter ×1
locking ×1
lua ×1
macos ×1
networking ×1
overriding ×1
random ×1
redis ×1
rendering ×1
response ×1
stream ×1
transactions ×1