Your SlideShare is downloading. ×
  • Like
2010年04期《程序员》配套源码及相关链接
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×

Now you can save presentations on your phone or tablet

Available for both IPhone and Android

Text the download link to your phone

Standard text messaging rates apply

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

  • 278 views
Published

 

  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
    Be the first to like this
No Downloads

Views

Total Views
278
On SlideShare
0
From Embeds
0
Number of Embeds
0

Actions

Shares
Downloads
6
Comments
0
Likes
0

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. 2010 年 04 期《程序员》配套源码及相关链接 为了方便大家查阅,现把2010年04期《程序员》杂志中相关链接及代码发布在此: 程序天下事 P16页,推荐资源 1.文章:《关于战略问题的通信之六》,摘自《软件随想录》: http://www.ruanyifeng.com/blog/2009/03/strategy_letter_vi.html。 2.ASP.NET Ajax Library(工具):http://ajax.codeplex.com/。 Ajax Library 以开源形式,发布于 CodePlex 网站。 3.Script#(工具):http://projects.nikhilk.net/ScriptSharp。 一个可以将 C#源码编译成普通 JavaScript 脚本的工具。 4.Doloto(工具):http://research.microsoft.com/en-us/projects/doloto/。 一个研究项目性质的工具,可以优化网站所使用的 JavaScript 文件。 P17页,推荐资源 BlueDavy 之技术 Blog:OSGi 原理与最佳实践:http://www.blogjava.net/BlueDavy P18页,推荐资源 Peter Backlund 和 Patrik Fredriksson 提供的领域驱动设计案例讲解 http://www.youtube.com/watch?v=eA8xgdtqqs8 Alistair 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 开发更惬意 http://www.infoworld.com/d/developer-world/new-version-groovy-cozies-java- sql-242?source=rss_infoworld_news 4、甲骨文官网 甲骨文收购 Silver Creek Systems http://www.oracle.com/us/corporate/press/042861 P23 页,推荐资源 《Engines of Creation: An Overview of Game Engines》(文章)链接:
  • 2. 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)。
  • 3. 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;
  • 4. 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("DataConnect ionString")); if (!IsPostBack) { BindComments(); } } protected void btnPostComment_Click(object sender, EventArgs e) { var comment = new CommentEntity() { Content = txtNewComment.Text, CreateOn = DateTime.Now };
  • 5. _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.GetC onfigurationSettingValue(configName)); }); return base.OnStart(); } 《在Java 中使用协程(Coroutine)》 P114 代码段 1: 一为receive 方式,二为react方式,代码例子如下: receive{ case MessageObject(args) => doHandle(args) } react{ case MessageObject(args) => doHandle(args) }
  • 6. 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()) }
  • 7. } 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;
  • 8. 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(); }
  • 9. 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); },
  • 10. 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 %sn", 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: %dn", name, skb->len);
  • 11. strlcpy (THIS->__retvalue, buf, MAXSTRINGLEN); %} probe kernel.function("netif_rx") { printf("%sn", getname($skb)); } probe kernel.function("netif_receive_skb") { printf("%sn", getname($skb)); }