像上一章所展示的那样,许多简单的同步问题都可以用互斥体解决。这一章中我会介绍一个更大的挑战,著名的“生产者-消费者”问题,以及一个用于解决它的新工具,条件变量。 10.1 工作队列 在一些多线程的程序中,线程被组织用于执行不同的任务。通常它们使用队列来相互通信,其中一些线程叫做“生产者”,向队列中放入数据,另一些线程叫做“消费者”,从队列取出数据。 例如,在GUI应用中,可能有一个运行GUI的线程
在接下来的几个练习中,我们将返回到网页搜索引擎的构建。为了回顾,搜索引擎的组件是: 抓取:我们需要一个程序,可以下载一个网页,解析它,并提取文本和任何其他页面的链接。 索引:我们需要一个索引,可以查找检索项并找到包含它的页面。 检索:我们需要一种方法,从索引中收集结果,并识别与检索项最相关的页面。 如果你做了练习 8.3,你使用 Java 映射实现了一个索引。在本练习中,我们将重新审视索引器,并创
到目前为止,我们对变量之间关系的分析纯粹是描述性的。我们知道如何找到穿过散点图的最佳直线来绘制。在所有直线中它的估计的均方误差最小,从这个角度来看,这条线是最好的。 但是,如果我们的数据是更大总体的样本呢?如果我们在样本中发现了两个变量之间的线性关系,那么对于总体也是如此嘛?它会是完全一样的线性关系吗?我们可以预测一个不在我们样本中的新的个体的响应变量吗? 如果我们认为,散点图反映了被绘制的两个变
OpenGL 提供了多个绘制函数。我们目前使用的 glDrawArrays()函数属于“顺序绘制”的类别。这意味着顶点缓冲区以指定的偏移量进行扫描,它将每 X( 1 个顶点时表示点,两个顶点表示线,等等)个顶点作为一个图元。这种方法使用起来很方便,但是它的缺点是如果有多个图元共享通一个顶点,那么这个被共享的顶点就会在顶点缓冲区中存在多次。即,在顺序绘制中不存在共享的概念。要实现顶点的共享,我们需要
十六进制字面量,以关键字hex打头,后面紧跟用单或双引号包裹的字符串。如hex"001122ff"。在内部会被表示为二进制流。通过下面的例子来理解下是什么意思: pragma solidity ^0.4.0; contract HexLiteral{ function test() returns (string){ var a = hex"001122FF"; /
web应用是十分多样化的,为了实现某种应用,那哪种或哪些是最好的呢?或者说,对于web应用有没有一种最好的体系? 问题 你能配置一个单一的web体系去满足每个普通的web应用吗?包括一般性的界面呈现风格,身份验证,表单数据确认等等? 解决方案: MVC模式把你的软件组织架构分解成3个清晰的任务 model结合了应用数据,应用流程以及业务逻辑 view从model中提取数据并呈现出来 control
在一个应用软件的成型过程中,一些意想不到的商业逻辑到处出现。比如,基于价格的考虑,这个任务必须减少项目;而那个任务也因为销售税而必须选择合适的比率;而其它的任务也必须因为其他的特别条件而终止。一些商业规则是简单的,只需要不到一两个布尔比较关系就够了,然而它的规则可能需要费时的估计,需要查询数据库或者用户输入数据来引导。 通过书写代码可以把抽象(比如一条商业规则)转化为具体可见的东西。但是抽象物(比
第十一课:2D文本 本课将学习如何在三维场景之上绘制二维文本。本例是一个简单的计时器: API 我们将实现这些简单的接口(位于common/text2D.h): void initText2D(const char * texturePath); void printText2D(const char * text, int x, int y, int size); voi
3D音效 本章将介绍如何在jME3中实现3D音效,了解音源(Audio Source)、音频侦听器(Audio Listener)、混响(Reverb)等概念及其应用。 jME3支持2种音频资源格式:WAV和OGG。使用OGG格式需要在项目中添加jme3-jogg类库的依赖: dependencies { compile 'org.jmonkeyengine:jme3-jogg:3.1.0
这里说的定制Backbonejs,主要是定制Backbone中的sync部分,也就是最后和服务器端通信的部分。 17.1 三个级别的定制 首先得说,在Backbone里面和后端能通信的对象也就两个------Model和Collection。这俩的主要工作就是从服务器拉取数据,保存到实例中,或者把实例中的属性发送到服务器端。 上面两中类型的对象都是基于Backbone.sync来进行通信的,同时也
前面花了四章的时间完成了项目(wechat)的开发,并且也放到了线上。这篇来说说模块化的事情。 15.1 模块化的概念 对于通常的网站来说,一般我们不会把所有的js都写到一个文件中,因为当一个文件中的代码行数太多的话会导致维护性变差,因此我们常常会根据业务(页面)来组织js文件,比如全站都用到的功能,我就写一个base.js,只是在首页会用到的功能,就写一个index.js。这样的话我更改首页的逻
(警告:缺乏适当安全防护措施的CGI脚本可能会让您的网站陷入危险状态。本文中的脚本只是简单的样例,不保证在真实网站上使用的安全性。) CGI脚本是驻留在Web服务器上的脚本,而且可以被客户端(浏览器)运行。客户端通过脚本的URL来访问脚本,就像访问普通页面一样。服务器识别出请求的URL是一个脚本,于是就运行该脚本。服务器如何识别特定的URL为脚本取决于服务器的管理员。在本文中我们假设脚本都存放在一
描述 跨站脚本,或者 XSS,涉及到站定包含非预期的 JavaScript 脚本代码,它随后传给用于,用户在浏览器中执行了该代码。它的一个无害示例为: alert('XSS'); 这会调用 JavaScript 函数alert,并创建一个简单的弹出窗口,带有文本XSS。现在,在这本书的前一个版本中,我推荐你在报告中使用这个例子。但是,一个非常成功的黑客告诉我这是个糟糕的例子,因为漏洞的接收者通常
概述 φ4直通式节流阀是一种直通式流量控制阀,用于流量的调节和控制,手动旋钮控制调节,可完全锁定关闭。 尺寸图纸 搭建案例
Node 相对于大多数 web 技术还算是年轻的,这意味着没有现成和成熟的框架或应用系统可以直接上手使用,商业化还处于萌芽状态。反过来,这也能让开发者接触到较多的底层细节,如 HTTP 协议、进程模型、服务模型等,这些底层原理与其它现有技术并无实质上的差别。对于 Node 开发者而言,很多其它语言走过的路需要开发者带着 Node 特性重新去实践一遍。这并不是坏事,Node 更接近底层使得开发者对于