通常,Web服务需要压缩几个大文件以供客户端下载.最明显的方法是创建一个临时zip文件,然后将echo其创建给用户或将其保存到磁盘并重定向(将来某个时间删除它).
但是,这样做有缺点:
像ZipStream-PHP这样的解决方案通过将数据按文件铲入Apache文件来改进这一点.但是,结果仍然是高内存使用率(文件完全加载到内存中),以及磁盘和CPU使用率的大幅飙升.
相反,请考虑以下bash片段:
ls -1 | zip -@ - | cat > file.zip
# Note -@ is not supported on MacOS
Run Code Online (Sandbox Code Playgroud)
这里,zip以流模式运行,导致内存占用量低.管道具有整数缓冲区 - 当缓冲区已满时,OS会暂停写入程序(管道左侧的程序).这样可确保zip其输出速度与输出速度一样快cat.
然后,最佳方式是执行相同的操作:cat使用Web服务器进程替换,将zip文件流式传输给用户,并将其动态创建.与仅流式传输文件相比,这将产生很少的开销,并且将具有无问题的,非尖峰的资源配置文件.
如何在LAMP堆栈上实现这一目标?
OpenGL中是否有一种通用的方法,当以原生大小(包括边缘像素)绘制时,允许从图集中完美地2D绘制纹理,并在过滤到非原生大小时进行高质量缩放?
假设您正在编写某种用于从纹理图集中绘制精灵的系统,以便用户可以指定精灵,以及绘制精灵的大小和位置.另外,他们可能只想绘制精灵的子矩形.
例如,这是一个64x64棋盘:

......并且单独在其纹理图集中:

注意:我们假设视口设置为将1:1映射到设备像素.
为清晰起见进行编辑:请注意,下面的前两个方法没有给出所需的结果,并且专门用于概述不起作用的内容.
1.要以原生大小绘制精灵,只需使用GL_NEAREST即可
这适用于以原始大小绘制,但是当用户以64x64以外的大小绘制对象时,NEAREST过滤会产生较差的结果.它还会强制纹理像素与像素网格对齐,在非整数像素位置绘制对象时效果不佳:

2.启用GL_LINEAR
(0.5/atlas_size,0.5/atlas_size)to (63.5/atlas_size,63.5/atlas_size).否则,对于最外面的像素,线性过滤将对图集中的精灵的邻居进行采样.

请注意,除了与背景混合的边缘像素之外,我们得到像素精确的绘图,因为顶点边界落在像素之间的中间.
编辑:还要注意,此行为还取决于是否启用了抗锯齿功能.如果不是,前一种方法实际上确实提供像素完美渲染,但是当精灵从像素对齐移动到子像素位置时不提供良好的转换.在许多情况下,加抗锯齿是必须的.
3.在纹理图集中填充精灵
边缘像素问题的两个明显的解决方案涉及在纹理图集中用1px边框填充精灵的边缘.你可以:
这基本上为我们提供了线性缩放的像素精确绘图.但是,如果我们允许用户只绘制精灵的子矩形,则这些方法中的任何一个都会失败,因为子矩阵显然没有所需的填充.
我错过了什么吗?这个问题有一般的解决方案吗?
double val = 0.1;
std::stringstream ss;
ss << val;
std::string strVal= ss.str();
Run Code Online (Sandbox Code Playgroud)
在Visual Studio调试器中,val值为0.10000000000000001(因为无法表示0.1).当val使用stringstream转换时,strVal等于"0.1".但是,当使用boost :: lexical_cast时,结果strVal是"0.10000000000000001".
另一个例子如下:
double val = 12.12305000012;
在visual studio下val显示为12.123050000119999,并使用stringstream和默认精度(6)它变为12.1231.我真的不明白为什么它不是12.12305(...).
是否存在默认精度,或者stringstream是否有特定的算法来转换无法准确表示的double值?
谢谢.
我经常发现自己在桌子上进行了几次独立的连接.例如,假设我们有桌子collections,有独立的与两个一对N的关系photos和songs,其中N是从零到很多.
现在,假设我们希望得到一个集合,这两个公司(独立)相关联的照片和歌曲.
我通常会使用这样的东西:
SELECT
collections.collectionid as collectionid,
photos.name as photo_name,
songs.name as song_name
FROM collections
LEFT JOIN photos ON collections.collectionid = photos.collectionid
LEFT JOIN songs ON collections.collectionid = songs.collectionid
WHERE collections.collectionid = 14
Run Code Online (Sandbox Code Playgroud)
当然,将一个表左连接到另外两个表,如果第一个连接导致M行而第二个连接N成行,则给M * N出行.就数据库流量和性能而言,这似乎不是最理想的.
+--------------+------------+-----------+
| collectionid | photo_name | song_name |
+--------------+------------+-----------+
| 14 | 'x' | 'a' | \
| 14 | 'x' | 'b' | - Each photo is …Run Code Online (Sandbox Code Playgroud) 我有一个Objective C项目,它包含一个带有一些辅助函数的C文件.尝试float从C文件返回s时,我有一个严重且非常恼人的问题.
C档案:
float returnFloat() {
return 10.0;
}
Run Code Online (Sandbox Code Playgroud)
同时在Objective C实例方法中:
float x;
x = returnFloat();
Run Code Online (Sandbox Code Playgroud)
x始终为0.000000.我有什么想法我做错了吗?
编辑
好的,我已经意识到我在Objective C文件中有一堆"隐式声明"警告,与我在C文件中使用的函数有关.
使用返回ints的函数的赋值工作正常.在从返回a的函数进行赋值的情况下float,调试器会说"由编译器优化掉的变量".
是不是我可能没有使用"正确"的方法在Objective C项目中包含一个包含辅助函数的C文件?我(愚蠢地?)让Xcode自动链接它.即使如此,为什么这个问题只有在函数返回时才会出现float?
在Javascript的原型继承系统中,对象的内部原型引用被设置为其构造函数的"prototype"属性,该属性本身就是一个对象.
可以解析构造函数的"prototype"属性的属性,就好像它们是对象实例的属性一样.但是,实例无法访问构造函数对象的实际属性:
function MyConstructor() { }
MyConstructor.x = 3
MyConstructor.prototype.y = 7
a = new MyConstructor()
a.x == 3 // FALSE
a.y == 7 // TRUE
Run Code Online (Sandbox Code Playgroud)
然而,如果属性(" x构造器")的函数体与声明this的关键字,这些特性是当然的情况下解决的:
function MyConstructor() {
this.x = 3
}
MyConstructor.prototype.y = 7
a = new MyConstructor()
a.x == 3 // TRUE
Run Code Online (Sandbox Code Playgroud)
为什么?有什么不同?