小编Eri*_*rik的帖子

Microsoft Edge中来自Stream的新响应

有人知道从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不支持获取RedableStreamResponse.body …

javascript response stream microsoft-edge

35
推荐指数
1
解决办法
612
查看次数

Scala case类私有构造函数但是public apply方法

如果我有以下具有私有构造函数的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 apply private-constructor case-class

33
推荐指数
2
解决办法
2万
查看次数

覆盖最终方法

最终方法不能在子类中重写.但有了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)

问: 我怎样才能调用原始的方法doItTestObject.这是可能的还是这种方法"有点被覆盖"?

overriding scala final

16
推荐指数
2
解决办法
4529
查看次数

在mac os下的Docker deamon配置路径

我在Mac OS(El Capitan 10.11.4)上使用版本1.12.0(版本10871)中的docker,我想为docker守护程序提供配置文件.

在Ubuntu下,您将配置置于/etc/default/docker(参见文档)下.不幸的是,我无法弄清楚在Mac OS中将配置放在何处

有任何想法吗?

macos daemon config docker

15
推荐指数
3
解决办法
1万
查看次数

Blink内存缓存存储什么?

除了浏览器缓存之外,还有一些浏览器缓存数据的方式.对于Chrome,渲染引擎Blink中还有另一个缓存,可将图像,样式,脚本和字体(可能更多)存储在内存中.

此缓存用于站点上的连续导航.从Blink缓存传递的资源(from memory cache)在网络选项卡中标记.从浏览器缓存提供的资源标记为(from disk cache).

我现在的问题是,哪些资源存储在这个非常快的缓存中?从我的测试来看,它变化很大:

  • 它非常适用于直接在HTML中的图像和脚本标记.
  • 它有时适用于直接在HTML中的样式(链接)标记.有时它不起作用(在具有相同会话的同一浏览器中).
  • 它几乎从不用于以编程方式插入HTML的脚本标记.有时它有效.

磁盘缓存命中和内存缓存命中之间的一个巨大差异与Service Workers结合使用.在服务工作者中无法观察到由内存缓存提供的请求(因为缓存位于服务工作者之前).磁盘缓存提供的请求通过Service Worker(因为浏览器缓存位于Service Worker后面).

为了显示解释的行为,我构建了一个包含所有资源类型的测试页面:https://dm-clone-optimized.app.baqend.com/

您可以使用顶部的链接浏览站点,并观察请求在网络选项卡和控制台中的行为方式.每个页面加载相同的资源.

经过一些导航(Chrome 70.0.3538.67)之后,我大部分时间都会遇到这种情况: 在此输入图像描述

  • HTML是从网络中获取的
  • 脚本标签scripts.js,并scripts2.js从内存中缓存
  • 图像标记logo.png也来自内存
  • 样式链接标记styles.css来自磁盘缓存 :(
  • 以编程方式添加的脚本标记scripts2.js?id=1也来自磁盘缓存 :(

有时虽然,我真的很幸运,一切都是从内存缓存中提供的: 在此输入图像描述

我很想了解Blink内存缓存是如何工作的,以及如何调整我的网站以将其用于具有适当cache control标头的所有资源.

----编辑----

最让我担心的是:为什么动态添加的脚本根本没有缓存?这对框架有明显的影响,scripts.js因为它们将所有依赖项作为动态添加的脚本标记插入.

caching rendering google-chrome

11
推荐指数
1
解决办法
350
查看次数

识别Service Worker缓存中的过时缓存条目

我希望我的服务工作者在某些情况下的行为就像浏览器缓存一样.这意味着在使用缓存命中进行响应时,我首先需要确保资源未过期.我可以这样做,例如:

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,dateage从缓存的响应头,计算到期,并比较当前时间.

这种方法的唯一问题是它可能受客户端和服务器之间的时钟漂移影响.这是因为日期标题是在服务器端生成的,但最终的比较是使用本地客户端时间进行的.

假设客户端时间关闭一天(有时可能会发生这种情况),现在缓存条目可能比预期更长或更短一天缓存.

我想要的解决方案是在缓存中存储响应时将获取时间添加为自定义标头.然后我可以使用这个自定义标题而不是

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)

遗憾的是,此解决方案不起作用,因为网络响应不可变.顺便说一句:复制响应以添加此附加信息不是一种选择.

有人知道如何正确识别浏览器等陈旧缓存条目吗?

javascript caching http browser-cache service-worker

6
推荐指数
1
解决办法
264
查看次数

Redis Lua 脚本 math.random

我刚刚在 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,无论脚本执行的频率如何。

对我来说这不是什么大问题(因为我可以在脚本返回后附加随机数字),但我没想到会出现这种行为,因此需要相当长的时间来找到我的错误。

我希望这些信息可以节省一些时间。

random lua redis

4
推荐指数
1
解决办法
2610
查看次数

jMeter 分布式测试:Master 不会关闭

我有一个简单的 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)

networking jmeter virtual-machine performance-testing

4
推荐指数
1
解决办法
1297
查看次数

不同线程释放的可重入ReadWriteLock

我正在单个服务器上实现乐观事务(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)

java concurrency multithreading locking transactions

1
推荐指数
1
解决办法
1439
查看次数