05

2010年02期《程序员》配套源码及相关链接

作者: chenqiuge 分类:坊间人语   阅读:11,521 次 添加评论

为方便查阅,我们把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 Stencilhttp://phruby.com/index.html


P19页,推荐资源


Rails 3核心开发者Yehuda Katz的blog:http://yehudakatz.com/


P21页,推荐资源


Computerworld

开源商务智能产品逐步进入主流应用

http://www.computerworld.com/s/article/346174/Open_Source_BI_Going_Mainstream_for_Routine_Uses?taxonomyId=9


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 译者:为之漫笔

http://www.cn-cuckoo.com/2010/01/08/how-nicholas-c-zakas-interviewing-the-front-end-engineer-1332.html


P66页,资源推荐


值得阅读的图书:http://one.linuxpk.com

值得访问的开源BLOG:http://blog.sina.com.cn/copu/

值得访问的技术社区:http://moblin.csdn.nethttp://www.moblin.org

http://www.linuxpk.comhttp://www.intel.com/software

http://www.cnbeta.com


《在硝烟中怒放——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.comCNET的iPhone观察

MobClix www.mobclix.comiPhone 应用分析服务网站

AndroiLib www.androlib.comAndroid 应用分析服务网站


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 = 0x003D;

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期《程序员》配套源码及相关链接


转播到腾讯微博

----->立刻申请加入《程序员》杂志读者俱乐部,与杂志编辑直接交流,参与选题,优先投稿

One Response to “2010年02期《程序员》配套源码及相关链接”

  1. 张雅彬 说道:

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

请评论

preload preload preload
京ICP备06065162