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

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

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

285

Published on

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
285
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
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)); }

×