为方便查阅,我们把2010年2月刊《程序员》杂志内文配套源码及相关链接整理如下,请大家参考或使用。
程序天下事
P16页,推荐资源
Linq2Twitter项目:http://linqtotwitter.codeplex.com
可以让.NET程序员使用Linq语法访问Twitter。
Facebook SDK:http://msdn.microsoft.com/en-us/windows/ee388574.aspx
微软发布一个让.NET程序员在各种类型应用程序中访问Facebook的SDK工具包。
Code Contracts:http://msdn.microsoft.com/enus/devlabs/dd491992.aspx
微软开发的一个为.NET代码提供Code Contracts能力的工具包。
P17页,推荐资源:
冒号空间:http://blog.zhenghui.org/
P18页,推荐资源:
UML工具大全:http://www.umlchina.com/Tools/Newindex1.htm
一套UML 2.2和SysML 1.0的免费Microsoft Visio Stencil:http://phruby.com/index.html
P19页,推荐资源:
Rails 3核心开发者Yehuda Katz的blog:http://yehudakatz.com/
P21页,推荐资源:
Computerworld
开源商务智能产品逐步进入主流应用。
P23页,推荐资源:
《ShaderX 7》 从名称上就能看出, 它是专注于游戏图形方面的,是开发实时渲染引擎的必读书!此书详细内容请见: http://www.shaderx7.com/
P26页,推荐资源:
《The Ruby on Rails Tutorial Book》,专为初学者准备的Ruby on Rails免费教程书籍:http://www.railstutorial.org/
P28页,推荐资源:
SaaS博士:http://blog.sina.com.cn/saasfun
在SaaS管理软件领域,SaaS博士的博客的知名度是非常高的。推荐他的Blog,并不代表我赞同他的观点,事实上我的观点和他有非常大的不同,但是SaaS博士可以让我们从另外一个角度来看待SaaS管理软件,时刻来提醒自己。
P29页,推荐资源:
《如何面试前端工程师》,作者:Nicholas C. Zakas 译者:为之漫笔
P66页,资源推荐:
值得阅读的图书:http://one.linuxpk.com
值得访问的开源BLOG:http://blog.sina.com.cn/copu/
值得访问的技术社区:http://moblin.csdn.net ,http://www.moblin.org
http://www.linuxpk.com ,http://www.intel.com/software
《在硝烟中怒放——2009年Web前端技术回顾》
P69:
2009年给我留下深刻印象的一些技术会议:
2009/3/18-20,Mix09 ,官网:http://visitmix.com ,
视频资料:http://videos.visitmix.com/MIX09
2009/4/24-25,JSConf 2009,官网:http://jsconf.us/2009
2009/11/7-8,JSConf(柏林) 2009 ,官网及会议资料:http://jsconf.eu/2009
2009/6/22-24,Velocity 2009,
官网:http://en.oreilly.com/velocity2009
2009/9/14-16,Ajax Experience 2009
官网:http://ajaxexperience.techtarget.com/conference/index.html
会议资料: http://www.slideshare.net/ajaxexperience2009/slideshows
2009/10/28-29,YUIConf 2009
官网:http://yuilibrary.com/yuiconf2009/
2009/11/20,FullFrontal 2009
官网:http://2009.full-frontal.org/
2009/12/19,第四届D2前端技术论坛
官网:http://www.d2forum.org/d2/4/
P71页,参考资源:
Dynamo
http://s3.amazonaws.com/AllThingsDistributed/sosp/amazon-dynamo-sosp2007.pdf
分布式key value漫谈,视频及演讲稿
http://timyang.net/tech/gz-salon-slide/
Tornado Web Server,friendfeed开源的实时Web框架
http://github.com/facebook/tornado
Kestrel,Twitter的开源消息队列产品
http://github.com/robey/kestrel
P77页,资源推荐:
Mobile Crunch www.mobilecrunch.com ,毫无疑问,最新的移动动向以及资讯的来源。
Engadget www.engadget.com ,移动设备的发烧友?那这里就是各种留言和设备的集散地。
iPhone Atlas www.iphoneatlas.com ,CNET的iPhone观察
MobClix www.mobclix.com ,iPhone 应用分析服务网站
AndroiLib www.androlib.com ,Android 应用分析服务网站
P81页,资源推荐 :
中国软件和服务外包网:http://www.cnies.com
《愈演愈烈的信息安全》
P83页,参考文献:
【1】PDF Most Common File Type in Targeted Attacks
http://www.f-secure.com/weblog/archives/00001676.html
《如何消除网站安全的七大风险》
P95页,代码段1:
改善:经过调查,发现在程序目录下的crossdomain.xml文件里的配置如下:
<?xml version=”1.0″?>
<!DOCTYPE cross-domain-policy SYSTEM ”http://www.macromedia.com/xml/dtds/cross-domainpolicy.dtd”>
<cross-domain-policy>
<allow-access-from domain=”*” />
</cross-domain-policy>
P95页,代码段2:
<param name=”allowScriptAccess” value=”always” />
改为<param name=”allowScriptAccess” value=“sameDomain” />
《NoSQL数据库的查询处理》
P106页,代码段1:
……如果不是叶子节点,那么我们将前缀取多一位数,重复一次查找过程。
# Locate the key next to input key
def locate(key)
leaf = locate_leaf_node(key)
return leaf.locate(key)
end
# Locate leaf node containing input key
deflocate_leaf_node(key)
for (i in 1 .. key.length)
node = DHT.lookup(key.prefix(n))
return node if node.is_leaf?
end
raise exception
end
P106页,代码段2 :
……注意我们在步进的时候可以沿着叶子节点之间的链接跨越到下一个叶子节点。
def range(startkey, endkey)
result = Array.new
leaf = locate_leaf_node(startkey)
while leaf != nil
result.append(leaf.range(startkey, endkey))
if (leaf.largestkey<endkey)
leaf = leaf.nextleaf
end
end
return result
End
《微软UI自动化测试的技术演变(下)》
P106页,代码段1:
下面的代码演示了在对WinForm上实现IRawElementProviderSimple接口,实现自定义UIA Nameproperty和Value Pattern。
public class MyForm : System.Windows.Forms.Form, IRawElementProviderSimple
…
protected override void WndProc(ref Message m)
{
const int WM_GETOBJECT = 0×003D;
if ((m.Msg == WM_GETOBJECT) && (m.LParam.ToInt32() ==AutomationInteropProvider.RootObjectId))
{
//MyForm实现了IRawElementProviderSimple接口,直接返回
m.Result = AutomationInteropProvider.ReturnRawElementProvider(
this.Handle, m.WParam, m.LParam,
(IRawElementProviderSimple)this);
return;
}
…
}
public Object GetPatternProvider(int patternId)
{
if (patternId == ValuePatternIdentifiers.Pattern.Id)
{
//创建并且返回ValuePattern object
return new ValuePattern();
}
…
}
public Object GetPropertyValue(int propertyId)
{
//所有的UIA Property都可以从这里返回
if (propertyId == AutomationElementIdentifiers.NameProperty.Id)
{
//把当前时间返回给UIA.Name Property
return string.Format(”{0} {1}”, this.Name, DateTime.Now.ToLongTimeString());
}
…
}
[ComVisible(true)]
public class ValuePattern : IValueProvider
{
public bool IsReadOnly { get { return true; } }
public string Value{
get
{
//把当前时间作为Value Pattern的值返回
return DateTime.Now.ToLongTimeString();
}}
public void SetValue(string value) { return; }
}
P109页,代码段2:
下面通过一个例子演示如何实现UIA客户端接口。首先写一个最简单的WinForm,里面没有任何UIA相关的代码:
public class MyFormClient : System.Windows.Forms.Form
{
[STAThread]
static void Main()
{
Application.Run(new MyFormClient());
}
public MyFormClient()
{
this.Name = ”testForm”;
this.Text = ”ClientUIADemo”;
}
}
把上述代码编译成WinFormServer.exe。
下面代码是测试端代码和对应的UIA 客户端实现:
//通过RegisterClientSideProviders API注册自定义的UIA Client provider
//Client Provider的类型信息保存在ClientSideProviderDescriptionTable数组中
ClientSettings.RegisterClientSideProviders(
UIAutomationClientSideProviders.ClientSideProviderDescriptionTable);
class UIAutomationClientSideProviders
{
public static ClientSideProviderDescription[] ClientSideProviderDescriptionTable =
{ new ClientSideProviderDescription(
WindowProvider.Create,
null) };
}
class WindowProvider : IRawElementProviderSimple
{
internal static IRawElementProviderSimple Create(
IntPtr hwnd, int idChild, int idObject)
{
System.Diagnostics.Process[] processes = System.Diagnostics.Process.GetProcessesByName(”WinFormServer”);
if (processes.Length == 0)
return null;
//判断目标窗口是否指定进程的窗口
//如果是, 则返回实例表示该客户端实现支持该窗口
if (processes[0].MainWindowHandle != hwnd)
return null;
else
return new WindowProvider(hwnd);
}
P110页,代码段3:
//自定义的WPF按钮,从默认Button类继承
public class UIAButton : Button
{
//重载该方法返回自定义的AutomationPeer类
protected override AutomationPeer OnCreateAutomationPeer()
{
return new UIAButtonAutomationPeer(this);
}
}
//自定义的AutomationPeer类,从默认ButtonAutomationPeer类继承
//同时额外实现UIA的ValuePattern
public class UIAButtonAutomationPeer : ButtonAutomationPeer,IValueProvider
{
//重载该方法,返回自定义UIA Name property
protected override string GetNameCore()
{
string originalName= base.GetNameCore();
return string.Format(”{0} {1}”, originalName, DateTime.Now.ToLongTimeString());
}
//重载该方法,返回ValuePattern
//故意没有调用基类的GetPattern,使得默认的Invoke Pattern不会暴露
public override object GetPattern(PatternInterface patternInterface)
{
if (patternInterface == PatternInterface.Value)
{
return this;
}
return null;
}
public bool IsReadOnly { get{return true;} }
//ValuePattern的自定义实现,这里返回控件的长宽信息
public string Value
{
get
{
return string.Format(”Height={0},Wideth={1}”,
Owner.RenderSize.Height,Owner.RenderSize.Width);
}
}
public void SetValue(string value) { }
}
P111页,代码段4:
private static IntPtr CriticalHandleWMGetobject(IntPtr wparam, IntPtr lparam, Visual root, IntPtr handle
《OPhone平台架构及主要开发组件》
P116页,代码段1:
例如,从应用程序中调用Phone程序拨打电话的代码如下所示:
Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse(”tel:10086″));
startActivity(intent);
P117页,代码段2:
下面的代码可以从系统中查询存储在SD卡上的歌曲。
ContentResolver resolver =getContentResolver();
//从Content Provider中获得SD卡上的音乐列表
cursor =resolver.query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,null, null,null, MediaStore.Audio.Media.DEFAULT_SORT_ORDER);
String[] cols = new String[] {MediaStore.Audio.Media.TITLE,MediaStore.Audio.Media.ARTIST, };
int[] ids = new int[] { R.id.track_name, R.id.artist };
if (cursor != null)
startManagingCursor(cursor);
//创建Adapter并绑定到ListView
SimpleCursorAdapter adapter =new SimpleCursorAdapter(this,R.layout.songs_list, cursor,cols, ids);
setListAdapter(adapter);
P117页,代码段3:
BroadcastReceiver没有界面显示,它通过AndroidMa-nifest.xml或者在代码中进行注册,监听应用程序感兴趣的事件。Broad-castReceiver是一个抽象类,定义了一个抽象方法onReceive(),当广播事件到来时,BroadcastReceiver的onReceive()方法会被调用,开发者只需要自己实现此方法即可。
void onReceive(Context curContext, Intent broadcastMsg)
使用BroadcastReceiver可以方便地实现开机自启动应用程序,OPhone系统启动后, 会广播Intent .ACTION_BOOT_COMPLETED事件,因此只需要在程序中定义一个BroadcastReceiver并在AndroidManifest.xml中进行注册。
<receiver android:name=”.BootReceiver” >
<intent-filter>
<action android:name=”android.intent.action.BOOT_COMPLETED” />
</intent-filter>
</receiver>
此外,还需在AndroidManifest.xml中增加权限声明,如果不声明应用程序所需权限,程序运行时会抛出安全异常。
<uses-permissionandroid:name=”android.permission.RECEIVE_BOOT_COMPLETED”/>
最后只需要实现一个BroadcastRe-ceiver即可,代码如下所示:
public class BootReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context arg0, Intent arg1) {
if (arg1.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) {
Intent intent = new Intent(arg0,com.ophone.MusicActivity.class);
//在Activity之外调用startActivity()
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
arg0.startActivity(intent);
}
}
}
如有需要请下载Word版本:2010年02期《程序员》配套源码及相关链接






请问 这些资源都是一直在哪里发布?
不会是手动摘抄的吧,
谢谢分享