首页 文章 精选 留言 我的

精选列表

搜索[安全相关],共10000篇文章
优秀的个人博客,低调大师

一些比较值得思考和了解的.NET相关的面试题

以前一直是被别人面试,后来“多年的媳妇熬成婆”,走上技术管理岗位之后也面试过别人。对于面试我始终认为有些技巧的,想要在短短半个小时到一两个小时内了解候选人是否满足岗位需要,确实不太容易。 我一般会根据面试者的工作经验状况选择相应的面试形式。对于工作经验较少的面试者(两年及以下)偏向于做题或者实际上机操作为主,因为这样的面试者进来之后也是做一些初级的工作,能够熟练操作软件和了解一些基本常识就够了;如果具有多年工作经验的一般都是通过谈话来了解面试者的水平,俗话说“行家一伸手,便知有没有”,经验丰富的开发人员知道在不同的场合下、不同的阶段要注意些什么问题,通过谈话就能知道对方处在什么水平。 上面说的是本人的经验,下面也谈谈本人几年来在电话面试中被问及的一些有代表性的问题,这些问题多半与.NET有关,如果有兴趣可以看一看。当然在这些我认为值得记录的问题当中绝对没有任何有关控件用法的问题。下面的问题以我回忆的次序为序。 问:请谈一谈ASP.NET1.1和ASP.NET2.0中页面的不同点。 下面请看在ASP.NET1.1中采用页面代码分离模式时ASP.NET页面的声明代码(来自于彬月论坛,我早年曾经以它来学习三层架构): <%@Pagelanguage="c#"Codebehind="ListLWord.aspx.cs"AutoEventWireup="false"Inherits="TraceLWord1.ListLWord"%> 它对应的后台代码声明如下: publicclassListLWord:System.Web.UI.Page 而在ASP.NET2.0中采用页面代码分离模式时的ASP.NET页面代码: <%@PageLanguage="C#"AutoEventWireup="true"CodeFile="Test.aspx.cs"Inherits="Test"%> 它对应的后台代码如下: publicpartialclassTest:System.Web.UI.Page 从代码声明上可以看出ASP.NET1.1中ASP.NET页面HTML代码与cs代码建立关联是通过Codebehind关键字,在后台代码中它是直接继承System.Web.UI.Page的;而在ASP.NET2.0中是通过CodeFile关键字建立关联的,在后台代码中使用了partial关键字,表明当前类是一个局部类。 因为年代比较久远,加之ASP.NET1.1基本没有人在使用,对这两种方式的处理方式的不同我已经记得不太清楚了,记得好像当年有个人专门讲了这种处理方式的优点的。这里要说的是,ASP.NET引擎在背后做的一些工作。Java EE的程序员都会被告知所有的JSP页面在第一次被请求时会被编译成servlet文件,然后再将这些servler文件编译成.class文件文件,以后再次请求的时候就直接运行编译后的.class文件(我当年学JSP的时候别人是这么告诉我的),其实在ASP.NET中也存在着类似的处理流程,并且因为在ASP.NET中处理过程比这个还稍微复杂一点(特别是在使用了代码分离模式时),当第一次请求时编译引擎会将包含HTML代码的aspx页面代码和包含cs代码的.cs文件合成一个.cs文件,然后再将这个.cs文件编译成.dll文件,JIT(即时编译器)会将这些代码编译成本地机器代码,然后运行这些本地机器代码得到的结果返回给客户端,这些本地机器代码会缓存在内存当中,如果在内存没有被清理的情况下再有客户端请求这个页面就会直接运行内存中缓存的本地机器代码,否则就需要再将.dll文件编译成本地机器代码并执行和缓存了。当然,如果对aspx代码或者.cs代码进行了改动,那么下一次请求就会又走一遍整个流程了。 问:请谈一谈二进制序列化和Xml序列化的特点。 二进制序列化和反序列化使用BinaryFormatter类,Xml序列化使用XmlSerializer类。二进制序列化的特点是:无论是否是只读属性,所有成员都将被序列化;序列化的性能高。Xml序列化的特点是:互操作性强;可读性强。 其实关于序列化的类还有SoapFormatter等其它序列化方式,适用于不同的场合。在周公博客上也有关于BinaryFormatter、XmlSerializer和SoapFormatter用法的例子,有兴趣的可以找一找。 问:什么是浅拷贝?什么是深层拷贝?如何实现深层拷贝? 浅拷贝(shallow copy)也叫影子拷贝,在.NET里所有对象的老祖宗Object类里就定义了一个MemberwiseClone()方法来实现浅拷贝。具体做法是创建一个浅表副本,方法是创建一个新对象,然后将当前对象的非静态字段复制到该新对象。 如果字段是值类型的,则对该字段执行逐位复制。如果字段是引用类型,则复制引用但不复制引用的对象;因此,原始对象及其复本引用同一对象。 在浅拷贝里会出现一个问题,那就是如果对对象A实行浅拷贝得到对象B,假设对象A中有引用类型变量M,一旦改变了M的值对象B中对应的变量值也会随之改变,这在有些情况下会产生不可预知的情况,为了解决这个问题,就需要实现深层拷贝(deep copy)。实行深层拷贝之后,不管是A中值类型变量的值被复制到B中,连A中引用类型的字段的值也会被复制到B中,这样改变A中引用类型的值就不会反应到B中对应的字段上去。 如何实现深层拷贝呢?在MSDN中建议我们实现ICloneable来达到实现创建深层副本或者浅表副本的目的,在实际中一般都是采用序列化A,然后将序列化的结果反序列化得到B来实现深层拷贝的目的。 问:请讲一讲ASP.NET命名管道的细节。 ASP.NET命名管道也叫HTTP Pipeline,它是指当客户端的请求经Web服务器到ASP.NET引擎之后的一系列处理过程的细节。关于HTTP流程处理细节在周公拙作《ASP.NET夜话》第十二章中描述过(因为和出版社签订了协议所以没有在博客上发表),如果有想知道细节的请看http://www.cnblogs.com/xiaopin/archive/2010/08/26/1808956.html了解,特别是那些只知道拖拽控件的程序员朋友强烈建议去看一看,看过那个图之后你就会知道原来你随便在网页上拖拽一个控件,这么简单的过程背后却有很多复杂的事情要处理,在其中涉及到了HttpApplication、HttpContext、HttpResponse、HttpRequest、HttpCookie、HttpSession还有HttpSessionState等,除此之外还应该了解一下ASP.NET页面的生命周期,这样你就知道在什么时候可以做什么不可以做什么。 在这里仅仅将作者话的那个图拿出来在这里展示一下,这个图画得相当不错。 问:请问ASP.NET在IIS5、IIS6和IIS7中会有什么不同。 IIS5的ASP.NET请求处理过程 从上图可以看出在IIS中Web服务器和ASP.NET程序分开,Web服务器进程是一个名为inetinfo.exe的非托管程序,而ASP.NET程序进程是一个名为aspnet_wp.exe的进程。 IIS6的ASP.NET请求处理过程 从上图可以看出在IIS6中监听客户端HTTP请求的是http.sys,它在kernel-mode下工作,而处理ASP.NET请求的则是w3wp.exe,它是工作在user-mode下,而在kernel-mode下工作的允许访问所有内存和CPU指令。 IIS7的ASP.NET请求处理过程 在IIS7中处理模式又可以分为两种:经典模式和集成模式。在IIS7中经典模式是兼容IIS6的模式,在IIS6中ASP.NET ISAPI是以插件的形式存在,而在IIS7中则是从插件的角色转换到核心。 IIS6 的执行架构图,以及 IIS7应用程序池配置成经典模式的执行架构图 IIS 7 的执行架构图(集成托管信道模式下的架构) 也就是从IIS5到IIS6的改进主要在http.sys上,而从IIS6到IIS7的改进主要是ISAPI的改进。 注:上面文字和图片来自于对蝈蝈俊.net文章的整理,该篇文章的网址是:http://blog.joycode.com/ghj/archive/2008/07/25/115200.joy 问:请问System.Web.UI.Page类实现了哪个接口?它有定义了哪些方法和属性? 我们知道所有的ASP.NET页面都直接或者间接集成自System.Web.UI.Page类,System.Web.UI.Page类又实现了System.Web.IHttpHandler接口,在这个接口中定义了一个void ProcessRequest(HttpContext context)方法和一个IsReusable属性。IsReusable属性是一个bool值,这个值是指示IHttpHandler的实例是否可再次使用,一般情况下这个值应该设为false,典型的例子就是我们自己编写的Page类,因为它默认设置为false了,所以即使想服务器上同一个页面发送了多次请求,每次得到的都是不同实例。很多初学者经常问:明明我在Page内声明了一个成员变量并赋值了,为什么点击一个按钮PostBack之后就没有值了呢?就是因为不重用实例,提交之后得到的是一个新的实例(建议初学者不要轻易更改这个默认设置来在不同请求间存储变量值)。 关于ASP.NET页面生存周期中的事件和方法如下: 问:如果用.NET语言设计一个类似于Tomcat的Web服务器,你的思路是怎么样的? Tomcat是Java中的一个Java EE容器,支持JSP和servlet。在早年的时候我曾有过模仿Tomcat的想法,所以在当时我也回答了一下我的思路。当时别人问这个问题并不是真的要我用代码去实现这么一个功能,因为大部分人都没有写Web服务器的经历,问这个问题主要是考核我在遇到以前没有遇到过的问题时的反应和思路。 问:数据库死锁是如何产生的?如何解决死锁问题? 如果说上一个问题与.NET还有一点关系的话,那么这个问题其实与.NET没有一点关系了。说实在话在被问及以前我没有遇到过数据库死锁的问题,所以也不知道如何解决。后来查阅了很多资料,对此算是有所了解,如果有人感兴趣,可以参考网址http://www.cnblogs.com/changbluesky/archive/2010/06/10/1753021.html。 总结:在几年的被别人面试的经历中,被问过的问题不光有技术的,也有管理方面的(关于管理方面的我在博客上也谈过几个经典的问题,名字是《技术管理中常见的几个问题》),回忆其中的一些技术方面的问题总结出这些问题来。除了自己总结之外,也是给一些学会了熟练拖拽控件的程序员了解一下在ASP.NET中往深处挖可以学到的知识,当然这些只是点,掌握了这些点之后就可以尝试以点带面了,千万不要停留在表面。 本文转自周金桥51CTO博客,原文链接:http://blog.51cto.com/zhoufoxcn/385287 ,如需转载请自行联系原作

优秀的个人博客,低调大师

马云:想在未来拿高薪 就去做与数据分析相关的工作

据外媒报道,中国电商巨头阿里巴巴的创始人马云(微博)预计未来人类社会将发生巨大的变化,这位亿万富翁在接受CNBC采访时表示,在未来的30年里,人工智能将超越人类的知识,导致很多人失业。 他说:“新浪潮即将来临,很多就业机会将被夺走。有些人会赶上潮流,变得更加富有和成功。但是对于那些落后的人,未来将是痛苦的。” 马云说,在快速逼近的技术新时代,核心是数据。根据他对未来就业市场的预测,与数据和数据分析有关的技能将变得非常有价值。 马云说:“整个世界将变成数据,我认为这还只是数据时代的开始。” 阿里巴巴拥有客户的大量数据,它的很多客户每天都要访问阿里巴巴网站很多次。马云解释说,通过这些信息,他看到了世界将在未来几十年里变成什么样。 他说:“我们认为,数据将在未来变得对人们的生活非常重要。明天,一切事物都将通过物联网与网络相连。” 马云并非唯一一个强调分析技能重要性的商业领袖。特斯拉和SpaceX首席执行官埃隆-马斯克(Elon Musk)正在研究一个项目,打算将人脑与计算机相连,目的是为了提高人脑的数据处理速度。微软联合创始人、未来学家比尔-盖茨(Bill Gates)说,收集信息的能力将改变全球健康状况,避免疾病传播。 谷歌(微博)母公司Alphabet的执行董事长埃里克-施密特(Eric Schmidt)和公司首席执行官拉里-佩奇(Larry Page)的顾问乔纳森-罗森博格(Jonathan Rosenberg)均认为,数据分析是年轻人最应该学习的顶级职业技能。 施密特说:“我所说的数据分析指的是统计学的基本知识,是人们如何利用大数据来做决策的基本知识。” 他说:“我认为,对数据分析的基本理解对下一代年轻人来说非常重要,这就是你们要进入的世界。” 本文转自d1net(转载)

优秀的个人博客,低调大师

Android ThreadUtil 线程公共类,判断是否在主线程/ 子线程执行 相关操作

前言:通常,我们写的公共的模块给别人用,但是这个模块又必须在特定的线程中执行。 比如,一个加载网络图片的的方法,需要在子线程中执行。 /** * 加载网络图片 */ private void loadImage() { try { //用延时3秒操作来模拟网络操作 Thread.sleep( 3000 ); } catch (InterruptedException e) { e.printStackTrace(); } } 但是其他的同事在使用的时候,可能一不小心就在主线程中执行了 loadImage() 方法。这样就势必造成了界面卡顿。 为了避免这种情况,我们需要一个线程判断的工具 ThreadUtil 来帮助我们处理。 当前线程是主线程,抛出异常,不去加载 当前线程是子线程,继续执行,完成加载 package com.app; import android.os.Looper; /** * Created by ${zyj} on 2016/6/7. */ public class ThreadUtil { /** * Throws an {@link java.lang.IllegalArgumentException} if called on a thread other than the main thread. */ public static void assertMainThread() { if (!isOnMainThread()) { throw new IllegalArgumentException("You must call this method on the main thread"); } } /** * Throws an {@link java.lang.IllegalArgumentException} if called on the main thread. */ public static void assertBackgroundThread() { if (!isOnBackgroundThread()) { throw new IllegalArgumentException("YOu must call this method on a background thread"); } } /** * Returns {@code true} if called on the main thread, {@code false} otherwise. */ public static boolean isOnMainThread() { return Looper.myLooper() == Looper.getMainLooper(); } /** * Returns {@code true} if called on the main thread, {@code false} otherwise. */ public static boolean isOnBackgroundThread() { return !isOnMainThread(); } } 然后我们把 loadImage() 修改一下,就成了 /** * 加载网络图片 */ private void loadImage() { //判断是否在子线程。 子线程:继续执行 主线程:抛出异常 ThreadUtil.assertBackgroundThread(); try { //用延时3秒操作来模拟网络操作 Thread.sleep( 3000 ); } catch (InterruptedException e) { e.printStackTrace(); } } 可以看到在 loadImage() 方法中多了一句: ThreadUtil.assertBackgroundThread(); 在assertBackgroundThread() 方法里,判断如果不是子线程就直接抛出"YOu must call this method on a background thread" 正确的调用应该是:在子线程中调用 loadImage() ,比如: new Thread(new Runnable() { @Override public void run() { loadImage(); } }).start(); 总结: ThreadUitl 是参考图片加载框架Glide写的 . ThreadUtil.assertBackgroundThread(); 要求在子线程中执行 ThreadUtil.assertMainThread() ; 要求在主线程运行 代码示例已上传到 github:https://github.com/zyj1609wz/ZUtils

优秀的个人博客,低调大师

Gradle精选: 关于运行失败的单元测试CASE,显示更多相关信息

在Gradle中运行单元测试很简单。一般情况下,如果有一个单元测试CASE执行失败,也会导致构建失败。但是我们却不能立刻在控制台看到为什么这个单元测试失败。我们需要先打开生成的HTML格式的测试报告。现在我们还有其他办法。 首先,我们创建一个下面的Gradle build文件: // File: build.gradle apply plugin: 'java' repositories { mavenCentral() } dependencies { testCompile 'junit:junit:[4,)' } 然后,我们使用下面的Junit单元测试。注意,这个单元测试一直会失败,因为这就是我们想要的CASE场景。 // File: src/test/java/com/mrhaki/gradle/SampleTest.java package com.mrhaki.gradle; import org.junit.*; public class SampleTest { @Test public void sample() { Assert.assertEquals("Gradle is gr8", "Gradle is great"); } } 我们通过执行test任务,来运行单元测试。如果我们运行这个任务,我们发现控制台显示哪一行单元测试失败了,但是我们却看不到单元测试失败的具体原因: $ gradle test :compileJava UP-TO-DATE :processResources UP-TO-DATE :classes UP-TO-DATE :compileTestJava :processTestResources UP-TO-DATE :testClasses :test com.mrhaki.gradle.SampleTest > sample FAILED org.junit.ComparisonFailure at SampleTest.java:8 1 test completed, 1 failed :test FAILED FAILURE: Build failed with an exception. * What went wrong: Execution failed for task ':test'. > There were failing tests. See the report at: file:///Users/mrhaki/Projects/mrhaki.com/blog/posts/samples/gradle/testlogging/build/reports/tests/index.html * Try: Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. BUILD FAILED Total time: 4.904 secs 我们可以再次运行test任务,但是现在我们通过添加命令行选项-i 或者 --info来设置Gradle日志级别到info。现在我们可以在终端看到单元测试失败的具体原因了。 $ gradle test -i Starting Build Settings evaluated using empty settings script. Projects loaded. Root project using build file ... Successfully started process 'Gradle Worker 1' Gradle Worker 1 executing tests. Gradle Worker 1 finished executing tests. com.mrhaki.gradle.SampleTest > sample FAILED org.junit.ComparisonFailure: expected:<gradle is gr[8]> but was:<gradle is gr[eat]> at org.junit.Assert.assertEquals(Assert.java:115) at org.junit.Assert.assertEquals(Assert.java:144) at com.mrhaki.gradle.SampleTest.sample(SampleTest.java:8) Process 'Gradle Worker 1' finished with exit value 0 (state: SUCCEEDED) 1 test completed, 1 failed Finished generating test XML results (0.025 secs) Generating HTML test report... Finished generating test html results (0.027 secs) :test FAILED FAILURE: Build failed with an exception. * What went wrong: Execution failed for task ':test'. > There were failing tests. See the report at: file:///Users/mrhaki/Projects/mrhaki.com/blog/posts/samples/gradle/testlogging/build/reports/tests/index.html * Try: Run with --stacktrace option to get the stack trace. Run with --debug option to get more log output. BUILD FAILED Total time: 5.117 secs 但是这样做仍然会产生很多干扰的日志。最好的办法就是通过配置test任务来自定义单元测试日志级别。我们可以配置不同的日志级别。为了获取单元测试失败的具体原因我们可以仅仅将exceptionFormat设置为full。示例如下: // File: build.gradle apply plugin: 'java' repositories { mavenCentral() } dependencies { testCompile 'junit:junit:[4,)' } test { testLogging { exceptionFormat = 'full' } } 我们可以再次运行test任务,并且使用正常的日志级别,但是这次,我们依然能够看到单元测试失败的具体原因,而没有其他的干扰日志。 $ gradle test :compileJava UP-TO-DATE :processResources UP-TO-DATE :classes UP-TO-DATE :compileTestJava UP-TO-DATE :processTestResources UP-TO-DATE :testClasses UP-TO-DATE :test com.mrhaki.gradle.SampleTest > sample FAILED org.junit.ComparisonFailure: expected:<gradle is gr[8]> but was:<gradle is gr[eat]> at org.junit.Assert.assertEquals(Assert.java:115) at org.junit.Assert.assertEquals(Assert.java:144) at com.mrhaki.gradle.SampleTest.sample(SampleTest.java:8) 1 test completed, 1 failed :test FAILED FAILURE: Build failed with an exception. * What went wrong: Execution failed for task ':test'. > There were failing tests. See the report at: file:///Users/mrhaki/Projects/mrhaki.com/blog/posts/samples/gradle/testlogging/build/reports/tests/index.html * Try: Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. BUILD FAILED Total time: 5.906 secs 实例使用 Gradle 1.6 编写。 联系方式 Email:yanghui1986527#gmail.com Github: https://github.com/snowdream Blog: http://snowdream.github.io/blog/ 简书:http://www.jianshu.com/u/748f0f7e6432 云栖博客:https://yq.aliyun.com/u/snowdream86 QQ群: 529327615 微信公众号: sn0wdr1am

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册