为了方便大家查阅,现把2010年03期《程序员》杂志中相关链接及代码发布在此:
程序天下事
P16页,推荐资源
1.文章:《关于战略问题的通信之六》,摘自《软件随想录》:
http://www.ruanyifeng.com/blog/2009/03/strategy_letter_vi.html。
2.ASP.NET Ajax Library(工具):http://ajax.codeplex.com/。
3.Script#(工具):http://projects.nikhilk.net/ScriptSharp。
4.Doloto(工具):http://research.microsoft.com/en-us/projects/doloto/。
P17页,推荐资源
BlueDavy之技术Blog:OSGi原理与最佳实践:http://www.blogjava.net/BlueDavy
P18页,推荐资源
1、Peter Backlund和Patrik Fredriksson提供的领域驱动设计案例讲解
http://www.youtube.com/watch?v=eA8xgdtqqs8
2、Cockburn厨房里的敏捷讨论
http://www.youtube.com/watch?v=XlGHeICHi-s
P19页,推荐资源
Linux基金会启动免费Linux培训网络研讨会:http://training.linuxfoundation.org
P21页,推荐资源
1、W3C官网
索引数据API
http://www.w3.org/TR/2010/WD-IndexedDB-20100105/
2、Computing英国网站
微软利用MySQL的不确定性
http://www.computing.co.uk/computing/news/2255963/redmond-exploits-mysql
3、InfoWorld
新版Groovy语言令Java和SQL开发更惬意
4、甲骨文官网
甲骨文收购Silver Creek Systems
http://www.oracle.com/us/corporate/press/042861
P23页,推荐资源
《Engines of Creation: An Overview of Game Engines》(文章)链接:http://www.gamasutra.com/view/feature/3832/engines_of_creation_an_overview_.php
P25页,推荐资源
Technology Evaluation Centers:http://cn.technologyevaluation.com/
TEC拥有各类知识库的资料库。
P26页,推荐资源
1. Maxim博客(关注Ruby和Rails开发技术):http://mediumexposure.com/
2.《Getting Up To Speed With Rails 3》(文章):http://darwinweb.net/articles/82
P28页,推荐资源
奉继承:云计算=SaaS+网格计算+虚拟化
http://www.spluss.cn/a/news/2010/0203/1027.html
P29页,推荐资源
重构之美 – Switchable 组件开发心得
作者:玉伯(lifesinger)
链接:http://lifesinger.org/blog/2010/01/the-beauty-of-refactoring/
《SafeMessager:我的安全信使》
P71页,代码段:
这时可以故意引发异常,然后利用adb的logcat来监视错误输出,捕捉有用的信息。
Uri smsUri = Uri.parse(”content://sms”);
Cursor c = getContentResolver().query(smsUri,new String[]{”dummyField”},null,null, null);
上述代码中的”dummyField”就是故意输入的错误字段名,此时logcat中就会出现下述信息:
… no such column: dummyField while compiling: SELECT dummyField FROM sms …
《微软云计算平台Azure概述(一)》
P110 相关链接:
为了更容易的在本地进行关于Azure的操作,我们需要下载Azure SDK (http://www.microsoft.com/downloads/details.aspx?FamilyID=6967ff37-813e-47c7-b987-889124b43abd&displaylang=en)。
P110 代码段1:
让我们到默认的页面在Page_Load模块里加一些日志。
protected void Page_Load(object sender, EventArgs e)
{
System.Diagnostics.Trace.TraceInformation(”The Default.aspx page had been opened.”);
}
P111 代码段2:
现在来创建一个新的类叫作CommentEntity然后将下面的代码粘贴:
public class CommentEntity : TableServiceEntity
{
public string Content { get; set; }
public string Author { get; set; }
public DateTime CreateOn { get; set; }
public CommentEntity()
: base(DateTime.UtcNow.ToString(”yyyyMMdd”),
string.Format(”{0:10}_{1}”, DateTime.MaxValue.Ticks - DateTime.Now.Ticks, Guid.NewGuid()))
{
}
}
P111 代码段3:
我们添加另外一个名为WhiteboardDataContext的类,用于配置数据上下文和数据源。
{
private CloudStorageAccount _account;
public IQueryable<CommentEntity> Comments
{
get
{
return CreateQuery<CommentEntity>(”Comments”);
}
}
public WhiteboardDataContext(CloudStorageAccount account)
: base(account.TableEndpoint.AbsoluteUri, account.Credentials)
{
_account = account;
var tableStorage = new CloudTableClient(_account.TableEndpoint.AbsoluteUri, _account.Credentials);
if (!tableStorage.DoesTableExist(”Comments”))
{
CloudTableClient.CreateTablesFromModel(typeof(WhiteboardDataContext), _account.TableEndpoint.AbsoluteUri, _account.Credentials);
}
}
public void AddCommentEntity(CommentEntity comment)
{
AddObject(”Comments”, comment);
SaveChanges();
}
}
P111 代码段4:
下面我们来到前端的文件 – Default.aspx然后添加一个文本框,一个添加新评论的按钮,和一个在存储器里显示所有评论的GridView。在后台的代码中,我们创建几个methods:
public partial class _Default : System.Web.UI.Page
{
WhiteboardDataContext _context;
protected void Page_Load(object sender, EventArgs e)
{
_context = new WhiteboardDataContext(CloudStorageAccount.FromConfigurationSetting(”DataConnectionString”));
if (!IsPostBack)
{
BindComments();
}
}
protected void btnPostComment_Click(object sender, EventArgs e)
{
var comment = new CommentEntity()
{
Content = txtNewComment.Text,
CreateOn = DateTime.Now
};
_context.AddCommentEntity(comment);
BindComments();
}
private void BindComments()
{
var comments = _context.Comments.ToList();
gvComments.DataSource = comments;
gvComments.DataBind();
}
}
P112 代码段5:
下一步是为Azure应用程序定义配置读取器。修改OnStart函数,如下面的代码所示:
public override bool OnStart()
{
DiagnosticMonitor.Start(”DiagnosticsConnectionString”);
// For information on handling configuration changes
// see the MSDN topic at http://go.microsoft.com/fwlink/?LinkId=166357.
RoleEnvironment.Changing += RoleEnvironmentChanging;
Microsoft.WindowsAzure.CloudStorageAccount.SetConfigurationSettingPublisher((configName, configSetter) =>
{
configSetter(Microsoft.WindowsAzure.ServiceRuntime.RoleEnvironment.GetConfigurationSettingValue(configName));
});
return base.OnStart();
}
《在Java 中使用协程(Coroutine)》
P114 代码段1:
一为receive 方式,二为react方式,代码例子如下:
receive{
case MessageObject(args) => doHandle(args)
}
react{
case MessageObject(args) => doHandle(args)
}
P114 代码段2:
下面来看基于Scala Actor 实现并发处理请求的一个简单例子。
class Processor extends Actor{
def act(){
loop{
react{
case command:String => doHandle(command)
}
}
}
def doHandle(command:String){
// 业务逻辑处理
}
}
当需要并发执行此Processor 时,在处理时需要的仅为调用以下代码:
val processor=new Processor()
processor.start
processor ! “Hello”
P115 代码段3:
下面来看基于Kilim 实现并发处理请求的一个简单例子。
public class Processor extends Task{
private String command;
public Processor(String command){
this.command=command;
}
public void execute() throws Pausable,Exception{
// 业务逻辑处理
}
}
在处理时,仅需调用以下代码:
Task processor=new Processor(command);
processor.start();
P115 代码段4:
一种为通过Future 方式发送消息来实现:
class Processor(command:String) extends Actor{
def act(){
val actor=new NetSenderActor()
val ft=actor !! command
println(ft())
}
}
class NetSenderActor extends Actor{
def act(){
case command:String => {
reply(“received command:”+command)
}
}
}
第二种为通过receive 的方式来实现:
class Processor(command:String) extends Actor{
def act(){
val actor=new NetSenderActor()
actor ! command
var senderResult=””
receive{
case result:String => {
senderResult=result
}
}
println(senderResult)
}
}
class NetSenderActor extends Actor{
def act(){
case command:String => {
sender ! (“received command:”+command)
}
}
}
P115 代码段5:
在Kilim 中要实现Task 之间的同步调用非常简单,代码如下:
public class TaskA extends Task{
public void execute() throws Pausable,Exception{
Mailbox<Object> result=new Mailbox<Object>();
Task task=new TaskB(result);
task.start();
Object resultObject=result.get();
System.out.println(resultObject);
}
}
public class TaskB extends Task{
private Mailbox<Object> result;
public TaskB(Mailbox<Object> result){
this.result=result;
}
public void execute() throws Pausable,Exception{
result.put(“result from TaskB”);
}
}
《特性检测不等于浏览器检测》
P117 代码段1:
因此,这样的代码是不好的:
if (navigator.userAgent.indexOf(”MSIE 7″) > -1){
//do something
}
应该这样写:
if(document.all){
//do something
}
P117 代码段2:
例如,在DOM还未成熟的时候,并非所有浏览器都支持getElementById(),所以我们常常见到这样的代码:
if(document.getElementById){ //DOM
element = document.getElementById(id);
} else if (document.all) { //IE
element = document.all[id];
} else if (document.layers){ //Netscape < 6
element = document.layers[id];
}
P117 代码段3:
我们开始看到这样的代码:
//AVOID!!!
if (document.all) { //IE
id = document.uniqueID;
}
else {
id = Math.random();
}
P117 代码段4:
更进一步,人们开始将下面的代码:
varisIE = navigator.userAgent.indexOf(”MSIE”) > -1;
替换成:
varisIE = !!document.all;
……
又不知道了什么时候,开发者们发现document.all实际上并不是检测IE浏览器的最佳指征,于是又出现了这样的代码:
varisIE = !!document.all&&document.uniqueID;
P118 代码段5:
下面的代码片段撷取自MooTools 1.1.2(注,目前最新版本是1.1.4,代码已经有所不同):
//取自MooTools 1.1.2
if (window.ActiveXObject) window.ie = window[window.XMLHttpRequest ? 'ie7' : 'ie6'] = true;
else if (document.childNodes&& !document.all&& !navigator.taintEnabled) window.webkit = window[window.xpath ? 'webkit420' : 'webkit419'] = true;
else if (document.getBoxObjectFor != null || window.mozInnerScreenX != null) window.gecko = true;
P118 代码段5:
我好奇地发现,在MooTools 1.2.4中仍然存在依赖于getBoxObjectFor()的基于特性的浏览器检测:
//取自MooTools 1.2.4
var Browser = $merge({
Engine: {name: ’unknown’, version: 0},
Platform: {name: (window.orientation != undefined) ? ’ipod’ : (navigator.platform.match(/mac|win|linux/i) || ['other'])[0].toLowerCase()},
Features: {xpath: !!(document.evaluate), air: !!(window.runtime), query: !!(document.querySelector)},
Plugins: {},
Engines: {
presto: function(){
return (!window.opera) ? false : ((arguments.callee.caller) ? 960 : ((document.getElementsByClassName) ? 950 : 925));
},
trident: function(){
return (!window.ActiveXObject) ? false : ((window.XMLHttpRequest) ? ((document.querySelectorAll) ? 6 : 5) : 4);
},
webkit: function(){
return (navigator.taintEnabled) ? false : ((Browser.Features.xpath) ? ((Browser.Features.query) ? 525 : 420) : 419);
},
gecko: function(){
return (!document.getBoxObjectFor&&window.mozInnerScreenX == null) ? false : ((document.getElementsByClassName) ? 19 : 18);
}
}
}, Browser || {});
《Linux内核调试新秀——SystemTap》
P127 代码段1:
看看SystemTap是怎么做的吧:
#!/usr/bin/stap -v
probe kernel.function(”sys_open”) {
if (task_execname(task_current()) == ”Xorg”) {
printf(”open %s\n”, user_string($filename));
}
}
P127 代码段2:
下面的例子展示了内嵌C语言的用法,其中位于“%{”和“}%”之间的代码块为内嵌C语言。
#! /usr/bin/env stap
%{
#include <linux/netdevice.h>
#include <linux/skbuff.h>
#include <linux/string.h>
%}
function getname:string(field:long) %{
struct sk_buff *skb;
struct net_device *dev;
int p;
char *name;
char buf[MAXSTRINGLEN];
p = (int)(THIS->field);
skb = (struct sk_buff *)p;
dev = (struct net_device *)(skb->dev);
name = (char*)(dev->name);
sprintf(buf, ”receive: dev: %s length: %d\n”, name, skb->len);
strlcpy (THIS->__retvalue, buf, MAXSTRINGLEN);
%}
probe kernel.function(”netif_rx”) {
printf(”%s\n”, getname($skb));
}
probe kernel.function(”netif_receive_skb”) {
printf(”%s\n”, getname($skb));
}
如有需要请下载Word版本:2010年03期《程序员》配套源码及相关链接






东西还蛮好的,看看啦。