为了方便大家查阅,现把2010年01期《程序员》杂志中相关链接及代码发布在此:
程序天下事
P15页,推荐资源:
诗剑书生的专栏:http://blog.csdn.net/axman/
P17页,推荐资源:
《Java EE 6 Overview》—— Reza Rahman
http://www.theserverside.com/tt/articles/article.tss?l=JavaEE6Overview
P18页,推荐资源:
《SQL Server Compact 终极性能调校》 ——黎波
http://www.cnblogs.com/upto/archive/2009/11/08/1598470.html
P19页,推荐资源:
Eweek.com
《微软为SQL Server提供Solo支持》
SQL Server Magazine
《关于SQL Azure的七个事实》
http://www.sqlmag.com/Article/ArticleID/102766/sql_server_102766.html
P21页,推荐资源:
天之虹的新浪博客
http://blog.sina.com.cn/jackiechueng
P23页,推荐资源:
《协同软件的思想精髓》
http://www.cpw.com.cn/Download/Downfile.Asp?id=539
P24页,推荐资源:
微软云计算提供Ruby on Rails支持环境
http://rubyonrails.cloudapp.net/
P25页,推荐资源:
Xen官方网站:http://www.xen.org/
虚拟化973项目:http://grid.hust.edu.cn/973/
P27页,推荐资源:
Peter-Paul Koch (PPK官网):
PPK是自学成才的世界级JavaScript专家,《PPK谈……》系列书籍作者。
Blog:www.quirksmode.org
《世界顶尖运动队教练的成功秘诀》
P50:
感谢InfoQ中文站的支持,原文链接:http://www.infoq.com/cn/articles/sport-coaching-and-agile
《Rails性能优化之路》
P81页,代码段1:
Rails很好地支持了这个原则。比如:
stylesheet_link_tag(”application”)
生成的页面元素是:
<link href=”/stylesheets/application.css?1232285206″ media=”screen” rel=”stylesheet” type=”text/css”/>
P82页,代码段2:
在一个request的生命周期之内,有些数据不会改变,或者我们不关心改变,则可以通过对结果缓存以避免重复计算。
def length
@length ||= end - start
End
P82页,代码段3:
下面的代码是从搜索结果数据集创建产品对象:
records.map { |record| Product.new record }
P82页,代码段4:
避免多次创建transaction的开销。(代码如下)
Product.transaction do
search_results.each do |search_result|
Product.create(search_result)
end
end
P82页,代码段5:
正确使用预先加载可以避免n+1查询:
Company.all(:include => :products, :conditions => ”company.kind = ’toy’”)
产生的sql查询是:
SELECT * FROM companies WHERE kind = ’toy’
SELECT * FROM products WHERE products.company_id IN (12, 423, 431…)
但错误使用预先加载是个很危险的事情,它可能不会影响结果的正确性,但会引起很严重的性能问题:
Company.all(:include => :products, :conditions => ”products.id IS NOT NULL AND
products.weight > 10″)
其实写这个查询的人的目的是为了找出拥有products,并且products的weight大于10的company。但这个语句导致的sql查询是性能低下的:
SELECT companies.id AS t0_r0, …., products.id as t1_r0, … FROM companies LEFT OUTER
JOIN products ON products.company_id = companies.idWHERE products.id IS NOT NULL AND
products.weight > 10
这个sql查询有两个问题:
第一,结果集中的Products信息是不需要的;
第二,LEFT OUTER JOIN的性能劣于INNER JOIN。
我们可以使用如下的语句来避免这两个问题:
Company.all(:joins=> ”INNER JOIN products ON products.company_id = companies.id”, :
conditions => ”products.weight > 10″)
它生成的sql是:
SELECT companies.* FROM companies INNER JOIN products ON products.company_id =
companies.idWHERE products.weight > 10
P82页,代码段6:
View的helper方法生成html元素,比如:
link_to ”My Company”, company_path(@company)# => <a href=”/companies/1″>My Company</a>
《微软UI自动化测试的技术演变(上)》
P102页,代码段1:
首先是启动calc.exe进程,使用WindowOpenEvent捕获新打开的窗口:
Automation.AddAutomationEventHandler(WindowPattern.WindowOpenedEvent,AutomationElement.
RootElement, TreeScope.Children, eventHandler);
System.Diagnostics.Process.Start(“calc.exe”);
在新窗口打开事件的相应函数中,需要判断新打开的窗口是否为计算器窗口,如果是,则开始测试。
void OnWindowOpenOrClose(object src, AutomationEventArgs e)
{
if (e.EventId != WindowPattern.WindowOpenedEvent)
return;
AutomationElement sourceElement =src as AutomationElement;
if (sourceElement.Current.Name == “Calculator”)
{
//开始执行测试
ExecuteTest();
}
}
测试的第一步是通过UIA Condition来找到计算器的按钮:
Condition conditions = new AndCondition(new
PropertyCondition(AutomationElement.AutomationIdProperty,“135″ /*按钮5的AutomationID标识符*/),
new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.Button));
AutomationElement btn=calcWindow.FindAll(TreeScope.Descendants, conditions)[0];
测试的第二步是调用Button的 Invoke Pattern完成按钮电击:
InvokePattern invokeptn=(InvokePattern)btn.GetCurrentPattern(InvokePattern.Pattern);
invokeptn.Invoke();
测试的第三步是找到计算器输出框,并获取输出框的输入,进行测试结果校验。
Condition conditions = new AndCondition(new
PropertyCondition(AutomationElement.AutomationIdProperty, ,“150″ /*计算器结果Text元素的
AutomationID标识符*/),new PropertyCondition(AutomationElement.ControlTypeProperty,
ontrolType.Text));
AutomationElement btn=calcWindow.FindAll(TreeScope.Descendants, conditions)[0];
//读取Text控件的名字,该名字即为输出字符串
return btn.Current.Name;
《在调试器中品味计算机系统的睡眠过程(中)》
P108页,代码段1:
这个函数的原型大致如下:
DWORD WINAPI
NtSetSystemPowerState(
IN POWER_ACTION SystemAction,
IN SYSTEM_POWER_STATE MinSystemState,
IN ULONG Flags);
P109页,代码段2:
第三个参数Flags用来附加本次电源动作的附加信息,是个32位的整数,每个二进制代表一种标志,常用的标志有:
#define POWER_ACTION_QUERY_ALLOWED 0×00000001
#define POWER_ACTION_UI_ALLOWED 0×00000002
#define POWER_ACTION_OVERRIDE_APPS 0×00000004
#define POWER_ACTION_LIGHTEST_FIRST 0×10000000
#define POWER_ACTION_LOCK_CONSOLE 0×20000000
#define POWER_ACTION_DISABLE_WAKES 0×40000000
#define POWER_ACTION_CRITICAL 0×80000000
P109页,代码段3:
下面便是ExRegisterCallback函数的原型:
PVOID
ExRegisterCallback(
IN PCALLBACK_OBJECT CallbackObject,
IN PCALLBACK_FUNCTION CallbackFunction,
IN PVOID CallbackContext
);
《Ophone应用的网络连接管理》
P113 代码段:
OPhone 1.0的网络连接建立过程与OPhone1.5基本一致,但是具体实现的方法有一些差异。OPhone 1.0与OPhone 1.5相比,网络状态改变的监听使用DataConnection.setNetworkStatusListener()。网络连接的建立使用DataConnection.openConnection()。
两个版本下,差异的代码具体如下。
// OPhone 1.0网络连接建立的过程示例
public class ConnectByAp {
// 连接封装类的构造方法
public ConnectByAp(Context context) {
// 获取DataConnection对象的一个引用
mDataConnection = DataConnection.getInstance();
}
// 连接建立
private boolean connect(String apn, String username, String password, long millisec) {
// 设置网络状态变化通知的接受接口
mDataConnection.setNetworkStatusListener(
new DataConnection.OnNetworkStatusListener() {
// 接受连接建立成功的通知
public void onOpenResult(boolean result) {
mNetworkUp = result;
notifyState();
}
// 接受连接建立失败的通知
public void onStatusChanged(int status) {
if (status == DataConnection.NO_RESPONSE)
mNetworkUp = false;
else
mNetworkUp = (status != 0);
}
});
// 判断当前网络连接的状态,如果请求的连接已经建立,则立即返回连接成功,
// 否则首先关闭当前连接
if (mDataConnection.connectionOpened()) {
String currentApn = mDataConnection.getApn();
if (currentApn != null && currentApn.equals(apn)) {
mNetworkUp = true;
return true;
}
else
disconnect();
}
// 设置连接超时
mDataConnection.setTimeOut((int)(millisec / 1000));
// 调用DataConnection的连接建立方法
mNetworkUp = mDataConnection.openConnection(mContext, apn
, username, password);
// 判断连接操作的返回结果,
// 如果连接成功,则等待网络连接状态切换的通知。
if (!mNetworkUp)
return false;
else
waitNotification(millisec);
return mNetworkUp;
}
}
如有需要请下载Word版本:2010年01期《程序员》配套源码及相关链接





