WPF快速指导8:WPF基元素类
WPF快速指导8:WPF基元素类
本文摘要:
1:什么是基元素类;
2:基元素类的使用;
3:其它重要基类
1:什么是基元素类
WPF中的大部分类都是从 SDK 文档中通常称为基元素类的四个类派生而来。这些类包括 UIElement、FrameworkElement、ContentElement 和 FrameworkContentElement。DependencyObject 也相关,因为它是 UIElement 和 ContentElement 的公共基类。
UIElement 用作 FrameworkElement 的基类,ContentElement 用作 FrameworkContentElement 的基类。
某些 UIElement 类要用作内容宿主:这些类为一个或多个 ContentElement 类(DocumentViewer 就是此类的一个示例)提供承载和呈现。ContentElement 用作以下元素的基类:所具有的对象模型稍小,并且更多地用于对 UIElement 中可能承载的文本、信息或文档内容进行寻址。
2:基元素类的使用
如果您要实现控件,您可能需要从以下类中派生:实际控件、控件系列基类或至少是 Control 基类。
如果您创建从 DependencyObject 派生的类,则将继承以下功能:
GetValue 和 SetValue 支持以及一般的属性系统支持。
使用以下两种属性的能力:依赖项属性,以及作为依赖项属性实现的附加属性。
如果您创建从 UIElement 派生的类,则除了能够继承 DependencyObject 提供的功能外,还将继承以下功能:
对动画属性值的基本支持。有关更多信息,请参见动画概述。
对基本输入事件和命令的支持。有关更多信息,请参见输入概述和命令概述。
可以重写以便为布局系统提供信息的虚方法。
如果您创建从 FrameworkElement 派生的类,则除了能够继承 UIElement 提供的功能外,还将继承以下功能:
对样式设置和演示图板的支持。有关更多信息,请参见 Style 和演示图板概述。
对数据绑定的支持。有关更多信息,请参见数据绑定概述。
对动态资源引用的支持。有关更多信息,请参见资源概述。
对属性值继承以及元数据中有助于向框架服务报告属性的相关情况(如数据绑定、样式或布局的框架实现)的其他标志的支持。有关更多信息,请参见框架属性元数据。
逻辑树的概念。有关更多信息,请参见 WPF 中的树。
对布局系统的实际 WPF 框架级实现的支持,包括 OnPropertyChanged 重写(该重写可以检测到影响布局的属性更改)。
如果您创建从 ContentElement 派生的类,则除了能够继承 DependencyObject 提供的功能外,还将继承以下功能:
对动画的支持。有关更多信息,请参见动画概述。
对基本输入事件和命令的支持。有关更多信息,请参见输入概述和命令概述。
如果您创建从 FrameworkContentElement 派生的类,则除了能够继承 ContentElement 提供的功能外,还将获得以下功能:
对样式设置和演示图板的支持。有关更多信息,请参见 Style 和动画概述。
对数据绑定的支持。有关更多信息,请参见数据绑定概述。
对动态资源引用的支持。有关更多信息,请参见资源概述。
对属性值继承以及元数据中有助于向框架服务报告属性情况(如数据绑定、样式或布局的框架实现)的其他标志的支持。有关更多信息,请参见框架属性元数据。
您不会继承对布局系统修改(如 ArrangeOverride)的访问权限。布局系统实现只在 FrameworkElement 上提供。但是,您会继承 OnPropertyChanged 重写(可以检测影响布局的属性更改并将这些更改报告给任何内容宿主)。
3:其它重要基类
DispatcherObject
DispatcherObject 为 WPF 线程模型提供支持,并允许为 WPF 应用程序创建的所有对象与 Dispatcher 相关联。即使不从 UIElement、DependencyObject 或 Visual 派生,也应考虑从 DispatcherObject 派生,以获得对线程模型的这种支持。有关更多信息,请参见线程处理模型。
Visual
Visual 实现二维对象在近似矩形的区域中通常需要具有可视化表示的概念。Visual 的实际呈现发生在其他类中(不是独立的),但 Visual 类提供一个由呈现过程在多种级别使用的已知类型。Visual 实现命中测试,但它不公开报告命中测试阳性结果(这些结果位于 UIElement 中)的事件。有关更多信息,请参见可视化层编程。
Freezable
Freezable 通过在出于性能原因需要不可变对象时提供为对象生成副本的途径,来模拟可变对象的不变性。Freezable 类型为某些图形元素(如几何形状、画笔以及动画)提供了一个通用的基础。值得注意的是,Freezable 不是一个 Visual;当应用 Freezable 以填充另一个对象的属性值时,它包含的属性将变成子属性,而这些子属性可能会影响呈现。有关更多信息,请参见Freezable 对象概述。
Animatable
Animatable 是一个 Freezable 派生类,它特别添加了动画控件层和某些实用工具成员,从而使当前动画的属性可以与未动画的属性区分开。
控件
Control 是称为控件或组件(取决于技术)的对象类型的理想基类。一般而言,WPF 控件类是直接表示 UI 控件或积极参与控件组合的类。Control 实现的主要功能是控件模板化。
TMJ .NET培训,开创 200元/月,学到会!
NET C# 入门级
.NET C# 专业级
.NET 架构级
BS系统专业级
BS系统安全
1.开篇及C#程序、解决方案的结构
2.源码管理之TFS入门
3.打老鼠初级
……
21.CMS之主要功能实现
22.进程和线程基础
23.类型转换
24.算法基础
25.初级课程之剩余知识点
1.消灭打老鼠游戏中的自定义委托
2.垃圾回收
3.Dispose模式
……
16.异常使用指导
17.最常用的重构指导
18.Debug和IDE的进阶
19.Resharper的使用
20.ILSPY的使用
1.Socket入门
2.打造打老鼠游戏网络版
3.WCF入门
……
10.依赖注入
11.万物兼可测试
12.软件指标之覆盖率计算
13.软件指标之代码行
14.软件指标之圈复杂度、嵌套深度
1.HTML
2.WebForm原理
3.CSS必知必会
……
19.让浏览器缓存Shop
20.Asp.net的生命周期
21.Asp.net网站的发布以及调试晋级
22.BS程序的本质
23.压力测试我们的Shop
1.Fiddler必知必会
2.IE开发者工具必知必会
3.跨站脚本防范
4.权限欺骗防范
5.参数越界防范
6.会话劫持防范
7.CSRF防范
8.盗链防范
9.静态文件的保护
将本文分享到:
QQ空间
新浪微博
人人网
开心网
搜狐微博
MSN
谷歌
更多
TMJ .NET培训,开创 200元/月,学到会!
NET C# 入门级
.NET C# 专业级
.NET 架构级
BS系统专业级
BS系统安全
1.开篇及C#程序、解决方案的结构
2.源码管理之TFS入门
3.打老鼠初级
……
21.CMS之主要功能实现
22.进程和线程基础
23.类型转换
24.算法基础
25.初级课程之剩余知识点
1.消灭打老鼠游戏中的自定义委托
2.垃圾回收
3.Dispose模式
……
16.异常使用指导
17.最常用的重构指导
18.Debug和IDE的进阶
19.Resharper的使用
20.ILSPY的使用
1.Socket入门
2.打造打老鼠游戏网络版
3.WCF入门
……
10.依赖注入
11.万物兼可测试
12.软件指标之覆盖率计算
13.软件指标之代码行
14.软件指标之圈复杂度、嵌套深度
1.HTML
2.WebForm原理
3.CSS必知必会
……
19.让浏览器缓存Shop
20.Asp.net的生命周期
21.Asp.net网站的发布以及调试晋级
22.BS程序的本质
23.压力测试我们的Shop
1.Fiddler必知必会
2.IE开发者工具必知必会
3.跨站脚本防范
4.权限欺骗防范
5.参数越界防范
6.会话劫持防范
7.CSRF防范
8.盗链防范
9.静态文件的保护
将本文分享到:
QQ空间
新浪微博
人人网
开心网
搜狐微博
MSN
谷歌
更多
本文基于Creative Commons Attribution 2.5 China Mainland License发布,欢迎转载,演绎或用于商业目的,但是必须保留本文的署名http://www.cnblogs.com/luminji(包含链接)。如您有任何疑问或者授权方面的协商,请给我留言。
【工具】作为技术人可能要用到的IT技术网址清单
IT技术网址清单(第一组)机器人工场官网:https://robotframework.org/jetbrains官网:https://plugins.jetbrains.com/spring官网:https://start.spring.io/gradle官网:https://gradle.org/maven官网:https://maven.apache.org/visualstudio官网:https://marketplace.visualstudio.com/leetcode官网:https://leetcode-cn.com/eclipse官网:https://www.eclipse.org/apche官网:https://www.apache.org/编写高性能、应用程序类的网站https://ngrx.io/有 jetbrains账号希望通过账号直接激活 IDE的地址https://account.jetbrains.com/login用于开发下载组件的地址https://www.jetbrains.com/app应用开发类地址https://www.docker.com/开发技术类地址,用于下载开发工具、插件或源代码等https://reactjs.org/使用 JavaScript 实现的开源可视化库地址https://www.ag-grid.com/端到端的开源机器学习平台https://tensorflow.google.cn/蚂蚁数据可视化地址https://antv.gitee.io/使用 JavaScript 实现的开源可视化库地址https://echarts.apache.org/en/index.html编程类地址https://cn.mobx.js.org/访问会跳转到docs.microsoft.com地址, 这个是微软系技术相关的文档网站https://docs.microsoft.com/en-us/tableau帮助-开发技术类地址https://www.tableau.com/support/help网站快速成型工具地址https://element.eleme.cn/#/zh-CN站长资讯https://s95.cnzz.com/Autofac 是一款超赞的.NET IoC 容器,该地址是Autofac 中文文档地址 >https://autofac.readthedocs.io/en/latest/美团技术地址https://tech.meituan.com/开发技术类地址,用于下载开发工具、插件或源代码等https://cn.vuejs.org/IT技术网址清单(第二组)PIP安装源地址https://pypi.org/simple/http://pypi.doubanio.com/simplehttps://pypi.tuna.tsinghua.edu.cn/simple/http://pub.mirrors.aliyun.com/pypi/simple/https://mirrors.bfsu.edu.cn/pypi/web/simple/开发和服务于企业级后台产品的地址https://www.antdv.com/docs/vue/introduce-cn/北森-一体化人才管理云平台https://www.beisen.com/微软的技术类地址https://referencesource.microsoft.com/微软的技术类地址https://dotnet.microsoft.com/滴滴开源平台地址https://didi.github.io/微软相关网站https://login.microsoftonline.com/common/oauth2/v2.0/authorize?client_id=2793995e-0a7d-40d7-bd35-6968ba142197&redirect_uri=https%3A%2F%2Fmyapps.microsoft.com&scope=openid+profile+email+offline_access&response_type=code&response_mode=fragment&code_challenge=TjCnI5xLEwwtgZwpXm_IdzLPIw1UsKIgrg_ibGx5spE&code_challenge_method=S256&state=08d3376c-e50b-4857-bc83-fb12e587918a&safe_rollout=apply%3A4c5f1cd9-65ad-4147-acf6-e9a11c424a40开发技术类相关网站https://apache.org/开发技术类相关网站https://developer.mozilla.org/en-US/编码、加解密、格式转换在线工具https://www.jsons.cn/Platform官网https://www.redhat.com/en/technologies/cloud-computing/openshiftRedhat官网https://www.redhat.com/ennodejs官网https://nodejs.org/en/redux官网https://redux.js.org/编程类在线做实验地址https://www.lanqiao.cn/courses/?show_merge_modal=true可用于搜索论文的地址https://www.paperweekly.site/IT技术类地址https://matplotlib.org/阿里巴巴矢量图库https://www.iconfont.cn/前端知识图谱https://f2e.techIT技术网址清单(第三组)在线学习网站清单国家精品课程在线学习平台 网易云课堂,网络技术类学习地址https://study.163.com/考试云https://www.kaoshiyun.com.cn/飞书https://www.feishu.cn/菜鸟教程https://www.runoob.com/程序开发学习站点 >https://www.itbaizhan.com/java官网https://java.com/en/oracle官网https://www.oracle.com/index.htmlapache官网http://www.apache.org/hp报修期限的查询页面https://support.hp.com/cn-zh/checkwarranty百度学术https://xueshu.baidu.com/设计师网站https://dribbble.com/微信读书https://weread.qq.com/知识协作https://www.notion.so极客服务中心https://fuwu.jiker.com天涯知识库https://book.sbkk8.com/极客时间https://time.geekbang.org/高顿网校https://www.gaodun.com三维动态设计学习交流,设计技法https://momentor.cn/轻学堂https://www.qingxuetang.com轻学堂https://m.qingxuetang.com个人图书馆地址http://www.360doc.com/index.html专业百科问答知识网站https://www.yebaike.com/牛客网,可以在线学习和刷题的网站https://www.nowcoder.com/es6语法电子书(前端方向)https://es6.ruanyifeng.com/前端框架技术类地址https://dvajs.com/前端框架技术类地址https://umijs.org/前端框架技术类地址https://ahooks.js.org/彭博技术支持网站https://www.blpprofessional.com/彭博技术支持网站https://solutions.refinitiv.cn/用于输入文字内容后生成二维码的地址https://cli.im/网站快速成型工具地址https://element.eleme.io/#/软件开发和协作工具的地址https://www.atlassian.com/在线编辑器工具地址https://editor.swagger.io/开发技术入门介绍网站https://router.vuejs.org/现代化代码技术类网站https://spring.io/python官方网站,可上传代码https://www.python.org/编程类学习地址https://www.w3cschool.cn/csdn开发者社区网站可以上传文件https://www.csdn.net/掘金是一个技术类网站,可发布代码类的文章https://juejin.cn/python代码类技术网站可上传代码https://pypi.org/简书网站可以发布文章https://www.jianshu.com/博客园网站可发布技术、代码类等文章https://www.cnblogs.com/CSDN的博客地址可发布文章和上传文件 >https://blog.csdn.net/易百教程-技术类地址https://www.yiibai.com/中文开源交流社区地址可上传技术类文章和代码https://www.oschina.net/思否是一个技术类地址可上传文章https://segmentfault.com/IT技术网站可上传代码https://www.51cto.com/Java编程类地址可上传代码https://www.iteye.com/IT技术类网站可上传代码https://testerhome.com/开发技术类相关网站https://flink.apache.org/angular是开发技术类网站,可上传代码https://angular.io/促进软件开发与相关领域知识的技术类网站https://www.infoq.com/angular是开发技术类中文版网站,可上传代码https://angular.cn/开发技术类网站,可上传代码https://kubernetes.io/在线创建、托管、浏览技术类文档的地址,可上传文档https://readthedocs.org/highcharts技术类地址,可上传文章https://www.highcharts.com.cn/IT技术网址清单(第四组)开发技术入门介绍网站https://mvnrepository.com/?__cf_chl_rt_tk=JQw2Ka5vmvl06OZxekRmVXBewGeeDg5wuZB2pFWZugQ-1637029575-0-gaNycGzNB1Enpm技术类论坛,可上传代码类文章https://www.npmjs.com/软件测试论坛,可上传文章http://www.51testing.com/html/index.html黑马程序员官网,可发布代码类帖子https://www.itheima.com/程序员社区网站https://stackoverflow.com/中文开源技术交流社区https://www.oschina.net/开发技术类社区网站https://shardingsphere.apache.org/促进软件开发与相关领域知识的技术类网站https://www.infoq.cn/开发技术类社区探讨网站https://www.daniweb.com/开发者交流学习网站https://dzone.com/有关云技术相关的网站https://www.dreamincode.net/?__cf_chl_rt_tk=A82Pq_jOx92POylqN9Rd78Avr4.18K7fnXwLpbK21gE-1637029742-0-gaNycGzNB2UIT技术社区网站https://bytes.com/编程类的博客网站https://simpleprogrammer.com/编程类教程的网站https://www.tutorialspoint.com/index.htm极客时间https://time.geekbang.org/菜鸟教程地址-开发技术类的https://www.runoob.com/开发技术类相关网站https://service.blpprofessional.com/portal/sessions/new人工智能技术社区https://www.6aiq.com/开发技术类相关网站https://www.hitachivantara.com/go/pentaho.html?source=pentaho-redirect开发技术类相关网站https://webpack.js.org/elastics中文社区https://elasticsearch.cn/微信开发平台地址https://open.weixin.qq.com/css技巧网站-开发技术类https://css-tricks.com/查看开发技术类文档地址https://docs.ansible.com/开发技术类出版社网站https://www.sitepoint.com/微软开发者工具平台https://visualstudio.microsoft.com/Kakfa中文教程https://www.orchome.com/kafka/index构建应用框架平台https://angular.cn/构建应用框架平台https://material.angular.cn/基于 Nginx 与 Lua 的高性能 Web 平台https://openresty.org/en/nginx是开发技术类相关的地址https://nginx.org/rabbit开发技术类地址https://www.rabbitmq.com/JDK/SDK组件下载的地址https://sdkman.io/阿里云帮助相关地址https://help.aliyun.com/Node.js 中文网http://nodejs.cn/IT技术网址清单(第五组)UI涉及语言和React组件库地址https://ant-design.gitee.io/index-cn在线IDE地址https://codesandbox.io/用于构建用户界面的JavaScript库https://react.docschina.org/前端开发框架中文网https://www.bootcss.com/在线手册中心,用于开发类教程学习的手册https://docs.pythontab.com/是通过JavaScript 实现的开源可视化库地址https://babeljs.io/用于现代 JavaScript 应用程序的静态模块打包工具https://webpack.docschina.org/React或JS/Node方面专业训练平台https://reacttraining.com/查看代码类的套接字段https://socket.io/JavaScript测试框架网站https://jestjs.io/访问后跳转的是echarts.apache.org地址,这个是使用 JavaScript 实现的开源可视化库地址https://echarts.baidu.com/微软代码编辑器网站https://code.visualstudio.com/高性能负载均衡器网站https://www.nginx.com/angular模块以及相关技术类的教程https://www.angularjs.net.cn/JavaScript 开源可视化库地址https://www.javascript.com/JavaScript编程类开发技术地址https://www.typescriptlang.org/JavaScript技术类网站https://dev.mysql.com/JetBrains IDE 及插件 CDNhttps://download.jetbrains.com.cn/网络安全行业门户https://www.freebuf.com/前端技术博客http://www.codehunter.cn/苹果开发者网站https://developer.apple.com技术论坛https://vue-js.com云端知识库https://www.yuque.com/api协作平台https://www.apifox.cn/格式转换工具http://www.jsons.cn/java教程网站https://www.baeldung.com/jmeter官网https://jmeter.apache.org/网络安全行业门户网站http://www.freebuf.com/开箱即用的CTF学习解决方案https://www.ctfhub.com/#/index前端框架技术学习博客https://jspang.com/阿里云mvn仓库入口https://developer.aliyun.comIT技术网址清单(第六组)Eclipse 插件市场http://marketplace.eclipse.org/Spring 开发资源下载https://download.springsource.com/Eclipse 开发资源下载https://download.eclipse.orgOracle 开发资源下载http://download.oracle.com/JBoss 开发资源下载http://download.jboss.org/Gradle 插件市场https://plugins.gradle.org/java热部署插件激活码获取http://jrebel.cicoding.cn/前端大牛张鑫旭的技术博客https://www.zhangxinxu.com/前端大牛阮一峰的技术博客http://www.ruanyifeng.com/home.htmlCDN站点,用于加载echarts.apache.org等网站依赖的静态资源https://cdn.jsdelivr.netvisualstudiohttps://marketplace.visualstudio.com/技术类博客https://www.cleverbn.cn/#/码农公社,开发类网址http://u1.net.cn/程序员博客https://www.xfqiao.com/开源软件镜像站https://mirrors.sjtug.sjtu.edu.cn/https://mirrors.sustech.edu.cn/https://mirrors.tuna.tsinghua.edu.cn/开源网站https://www.jeasyui.com/https://developer.mozilla.org/en-US/华为开源镜像站https://mirrors.huaweicloud.com/homehttps://mirrors.huaweicloud.com/home在线校验格式化工具https://www.bejson.com/技术类网址https://www.jsdelivr.com/Python data science.https://www.anaconda.com/aixcoder 代码搜索https://codesearch.aixcoder.com/IT技术网址清单(第七组)龙蜥社区(阿里开源Linux openAnolis官网)https://openanolis.cnopenEuler(华为开源Linux)官网https://www.openeuler.orgopenEuler文档https://docs.openeuler.orgCentOS官网https://www.centos.orghttps://docs.centos.orgCentOS Wikihttps://wiki.centos.orgLinux内核官网https://www.kernel.orgoracle 官网https://support.oracle.com/portal/oracle 文档的网址https://docs.oracle.com/en/前端mock插件官网https://mockjs.com/下载开源工具https://sourceforge.net/桌面端开发框架electron官方文档https://www.electronjs.org/scala官网 http://www.scala-lang.org正则可视化工具https://wangwl.net/static/projects/visualRegex/正则解析工具https://regex101.com/浏览器兼容性查询网站https://caniuse.com葡萄城官网https://www.grapecity.com站长之家https://www.chinaz.com/https://font.chinaz.com/https://down.chinaz.com/https://sc.chinaz.com/https://rank.chinaz.com/https://whois.chinaz.com/https://icp.chinaz.com/https://api.chinaz.com/https://top.chinaz.com/开发类网址https://www.5axxw.com/开发类社区网址https://bbs.5axxw.com/forum.php代码开发平台https://hutool.cn/echarts官网https://echarts.apache.org/zh/index.html开发文档https://devdocs.ioapifox 软件首页登录地址https://apifox-api.apipark.cn/lombok官网,可以查看文档http://www.projectlombok.orgIT学习https://www.tabnine.com/cloudflare官网https://www.cloudflare.com/微信开发文档https://developers.weixin.qq.com/企业微信开发文档https://work.weixin.qq.com/开发框架https://www.uviewui.com/IT技术网址清单(第八组)typescript中文文档网https://www.tslang.cn/qt 开发官方文档https://doc.qt.io/debian官网(linux操作系统)https://www.debian.orgllvm官网(编译器)https://llvm.org开发工具类下载网址https://dbeaver.io/技术类网站https://www.tableau.com/jboss官网https://www.jboss.org/mongdb 官网https://www.mongodb.com/cloud开发技术类网站https://www.it610.com/https://www.hellojava.com/https://www.west999.com/https://www.tqwba.com/开发技术类网站https://www.shangmayuan.com/数据库社区地址https://www.modb.pro/开发技术类网站http://www.javashuo.com/技术类地址https://www.itranslater.com/开发类地址https://www.codingdict.com/mybatis官方文档https://blog.mybatis.org/简书,技术问题查询https://www.jianshu.com51CTO企业版IT学习网站(目前招行多家分行信息技术部与51CTO有合作都有企业版高级用户https://saas.51cto.com/掘金是一个技术网站,可以发布技术类文章https://juejin.cn https://api.juejin.cnsmartx网站https://www.smartx.com/技术类地址https://www.bubuko.com/C语言编程网http://c.biancheng.net/搜狐数码https://digi.it.sohu.com/开发技术类博客地址https://www.xujun.org/通信社区类地址https://www.txrjy.com/forum.php天融信官网地址https://www.topsec.com.cn/程序员类地址https://www.techug.com/大数据知识库 http://www.saoniuhuo.com/代码在线工具箱https://www.matools.com/LINUX学习地址https://www.linuxprobe.com/API开发和使用平台https://www.postman.com/后端框架源码阅读网站,用于学习框架源码https://coderead.cn/IBM官方支持文档库https://www.ibm.com/support/
LAMP应用架构优势与搭建
Office Anywhere采用基于WEB的企业计算平台,如下图:
LAMP架构的优势
名词解释(引自百度百科):
LAMP :基于Linux,Apache,MySQL和PHP的开放资源网络开发平台。Linux是开放操作系统;Apache是最通用的网站服务器;MySQL是带有基于网络管理附加工具的关系型数据库;PHP是流行的对象脚本语言,它包含了多数其它语言的优秀特征来使得它的网络开发更加有效。
许多网站采用Apache 网站服务器+MySQL数据库+PHP语言引擎开发。可运行于Windows,Linux,Unix,苹果Mac OS等多种操作系统。
下面分别介绍Apache、PHP、MySQL的优势。
Apache网站服务器
Apache 是一个开源软件项目,自1996年起,一些顶尖的软件工程师,在美国伊利诺斯大学超级计算机应用程序国家中心(National Center for Supercomputing Applications,简称为NCSA)开发的 NCSA HTTPd 服务器的基础上开发与维护Apache服务器,1999年Apache软件基金会成立。
Apache的特点是简单、速度快、性能稳定。
Apache是世界使用排名第一的Web服务器软件,它可以运行在几乎所有广泛使用的计算机平台上。
据Netcraft统计:截止2008年6月,全世界互联网站总量达1.72亿,使用Apache服务器的位居第一,达49.12%,而使用微软IIS的为35.39%。
国内使用Apache服务器的知名网站和应用有:
搜狐(Apache 1.3)、新浪(Apache 2.0.54)、网易(Apache 2.2.6)、腾讯QQ网站、新华网、中华网、人民网、chinaren、淘宝网
以上网站服务信息,可以到http://uptime.netcraft.com查询,国外采用Apache的网站更多,不再详述。
PHP语言引擎
PHP的优势包括:开源模式使得开发者无需付费,支持多种操作系统,强大的的可伸缩性,稳定高效运行,快速开发,面向对象的编程,支持和JAVA的交互等特性。
PHP在数据库方面的支持非常丰富,包括:filePro,Informix,InterBase,mSQL,Microsoft SQL Server,MySQL,Sybase,ODBC,Oracle,PostgreSQL等等。
作为全球最普及的互联网开发语言之一,占到了全世界互联网应用的40%, PHP从1994年诞生至今已被2000多万个网站采用,国外流行程度更高。全球知名互联网公司Yahoo!、Goolge、Lycos、YouTube和中国知名网站新浪、百度、腾讯、TOM 等均是PHP 技术的经典应用。其中新浪网90%以上的Web开发采用PHP语言(资料数据转自CSDN程序员杂志2008年6月刊,新浪网架构师所著原文)。
并且,随着PHP 技术的成熟和完善,PHP 已经从一种针对网络开发的计算机语言发展成为了一个适合于企业级部署的技术平台,IBM、 Cisco、西门子、Adobe等公司均在普遍选用 PHP 技术。
在国际权威机构的调查报告中显示,PHP 技术在全球互联网社区领域的应用位居第一。在Alexa中文网站500强中,394家网站全部或部分应用着PHP 技术。在中国,目前也有着数十万的PHP 爱好者和程序员,他们身在不同地区,但都是PHP、开源的追随者。
PHP语言的发展十分迅猛,Web2.0时代的到来,更加速了PHP的普及,以下是几个生动的案例:
微软2007年花2.4亿美金收购1.6%股份的世界第二大社区网站facebook就采用了PHP语言开发,利用PHP的高度可伸缩特性,facebook支持用户开发扩展应用模块,这种全新的技术特性造就了facebook的极大成功,目前市值已超过100亿美元,它的未来就是一个网络版的操作系统。可以看到尽管微软发明了ASP.net语言,但仍非常看好PHP技术。
著名网站百度、雅虎都使用PHP开发重量级应用,比如百度的企业竞价排名系统就采用PHP开发,这是百度目前最大的收入来源,百度企业竞价排名管理站点网址:www2.baidu.com。
大家所熟知的PHP开发的论坛软件Discuz!几乎占据了80%的国内论坛软件市场,我们看到的门户网站论坛或社区,大多采用了PHP开发。
在国内OA领域,至少有30%以上的OA品牌采用PHP开发,这也包括采用通达OA平台开发的30余家正规品牌和众多盗版产品,PHP开发的OA在国内几乎有统一天下之势。
PHP与JAVA、ASP、ASP.net等网络语言的数据对比
现在最流行的统计方式,就是Google了,看看Google的搜索结果,基本就能判断出其在市面上的网站的使用情况,
约有11,050,000,000项符合php的查询结果
约有 3,540,000,000项符合asp的查询结果
约有 1,900,000,000项符合aspx的查询结果
约有 771,000,000项符合jsp的查询结果
全球PHP网站页面达到110亿,超过了ASP、ASP.net和JSP的总和。
这段时间葛优频繁曝光,总是喋喋不休的告诉俺们一个道理——用的人多的卡就是好卡。而如果套用这个光头明星的话,那就是:我,相信群众,从上面查询的结果大家可以看到,人民群众是很爱戴PHP的。
MySQL数据库
MySQL是一个关系型数据库管理系统,目前MySQL被业界广泛地应用,在过去两年里,MySQL在所有开发者使用的数据库中获得了25%的市场份额。
MySQL开发者为瑞典MySQL AB公司。在2008年1月16日,被Java语言的创始和主导公司—美国Sun公司10亿美元收购。
Mysql已经在中国设立了研发与技术支持中心(万里开源携手MySQL共建MySQL中国研发中心),通达科技通过与之交流,加强了合作的认识,也获得了技术指导,将更好地提高Mysql的企业应用水平。MySQL中国充分肯定了通达在企业推广Mysql数据库应用的贡献,欢迎通达向用户推荐使用Mysql数据库。双方也将在后续的市场推广中,展开更深层次的合作,包括向集团企业用户提供高可靠的基于Mysql的数据库解决方案和优质服务,更多信息参考通达网站新闻。
大家所熟悉的新浪网、腾讯QQ、淘宝网,都大量采用了MySQL数据库。
腾讯QQ采用Linux操作系统+MySQL数据库平台,至2004年2月,其注册用户数已经达到2.8亿户,活跃人数9200万,凭借上千台服务器组成的集群应用,至2005年2月,腾讯QQ的同时在线人数突破了1000万,这也充分证明了MySQL数据库的的大容量、快速响应的特点。
MySQL CEO Mickos说:MySQL尤其适用于Web应用,这也是该产品如今最为广泛的应用领域。其重要客户包括了Yahoo和Google,他们都在自己的站点中使用MySQL数据库。该产品同样还被用于嵌入式环境,在诸如零售业、制造业、政府机构和大学这样的环境用于完成办公任务。由于其可以实现各种用途,MySQL的客户遍布各个领域,从电信业(沃达丰、爱立信)到IT(惠普、德州仪器)再到新闻出版(美联社、时代杂志)。
MySQL客户还包括:朗讯、北电、美洲银行、西门子、思科、摩托罗拉、UPS、美国国防部、美国洛克希德-马丁公司、德国邮政、道琼斯、迪斯尼、戴姆勒-克莱斯勒等。
对于超高负载系统,通达可以提供Linux集群+MySQL数据库集群版的高性能配置方案,这种方案与Google或Baidu的集群系统方案类似,扩展空间很大,如果增加大量用户,只需再增加节点服务器就可以了。
快速部署LAMP
使用yum安装方式部署lamp(由于本人能力有限,所以有不尽人意的地方还请多多包涵)
一、yum配置
//进行yum源路径的配置
//baseurl为yum源的路径,Server为一会挂载的光盘中的目录,我们用到的包都在这个目录下;enable=1开启yum功能;gpgcheck=0不验证yum安装的包,其下面的一行为验证方式。
二、挂载系统光盘
//将光盘挂载到目录mnt下
三、安装apache、php和mysql包
//安装时间稍微长点
修改主机名
#hostname oracle.com
#vim /etc/sysconfig/network
修改http.conf中servername
查看apache是否可以使用
# php –i用来查看php服务的,只是输出的信息太多无法截图了
查看mysql服务的安装
开启apache和mysql的服务和设置开机启动
四、编写两个简易的网页做测试
① 静态网页测试
② 动态网页测试(php)
五、安装discuz论坛
解压discuz包到/var/www/html目录下
在/var/www/html中会看到名为upload的包,这就是discuz解压后的目录
在浏览器地址栏里输入192.168.8.254/upload/install进行discuz的安装
//点击“我同意”进行下一步
//进行目录、文件权限检查时显示当前状态不可写
我们进入/var/www/html/upload下对那些不可写的目录和文件进行权限的修改
把那些不可写的目录和文件复制到一个文件中去,我这里就把它们复制到名chmod的文件
//由于本人vi下的编辑能力有限,所以用了上面的笨方法
再次刷新页面
//可以看到刚才的那些文件和目录变成可写了,点击下一步
//修改“数据库用户名”为root,密码为空;管理员账号admin,密码随意,点击下一步
//让我们填一些联系方式,先不管了直接跳过
//看到我们的论坛了,让我们亲自体验一下吧
//点击“登录”,输入管理员账号和密码,接下来你就可以发挥自己的想象来设计自己的网站了。
我们使用脚本来快速部署LAMP
vim lamp.sh
#!/bin/sh
yum –y install http* php* mysql*
echo “192.168.8.254”>/var/www/html/index.html
echo “<?php;phpinfo();?>”&gt;/var/www/html/index.php
/etc/init.d/httpd start
/etc/init.d/mysqld start
chkconfig httpd on
chkconfig mysqld on
unzip Discuz_7.2_FULL_SC_UTF8.zip –d /var/www/html/
cd /var/www/html/upload/
chmod 777 ./config.inc.php
chmod 777 ./attachments
chmod 777 ./forumdata
chmod 777 ./forumdata/cache
chmod 777 ./forumdata/templates
chmod 777 ./forumdata/threadcaches
chmod 777 ./forumdata/logs
chmod 777 ./uc_client/data/cache
clear
echo "Please access http://192.168.8.254/upload/install/ to begin your installation."
//192.168.8.254为我服务器的地址,此脚本我放在/opt目录下执行,并且Discuz_7.2_FULL_SC_UTF8.zip包也在此目录下,一定要在同一个目录下执行。
此文下载地址:http://down.51cto.com/data/159575
由于页面内容过多,我写的一个源代码定制安装文档已上传到http://down.51cto.com/data/160441,花了我四天的时间详细的在机器上亲自实施了两次。此文档为生产当中用的最为频繁的方法,如果需要源码包就给我留言我单播给你
本文转自 baiying 51CTO博客,原文链接:http://blog.51cto.com/baiying/476474,如需转载请自行联系原作者
WPF快速指导9:WPF中的属性(依赖项属性)
WPF快速指导9:WPF中的属性(依赖项属性)
本文摘要:
1:什么是依赖项属性;
2:实现依赖项属性;
1:什么是依赖项属性
Windows Presentation Foundation (WPF) 提供了一组服务,这些服务可用于扩展公共语言运行时 (CLR) 属性的功能。这些服务通常统称为 WPF 属性系统。由 WPF 属性系统支持的属性称为依赖项属性。
依赖项属性的用途在于提供一种方法来基于其他输入的值计算属性值。这些其他输入可以包括系统属性(如主题和用户首选项)、实时属性确定机制(如数据绑定和动画/演示图板)、重用模板(如资源和样式)或者通过与元素树中其他元素的父子关系来公开的值。另外,可以通过实现依赖项属性来提供独立验证、默认值、监视其他属性的更改的回调以及可以基于可能的运行时信息来强制指定属性值的系统。派生类还可以通过重写依赖项属性元数据(而不是重写现有属性的实际实现或者创建新属性)来更改现有属性的某些具体特征。
更通俗一点的理解就是,依赖项属性用来支持样式设置、数据绑定、继承、动画和默认值。
讨论依赖项属性时所使用的术语:
依赖项属性:一个由 DependencyProperty 支持的属性。
依赖项属性标识符:一个 DependencyProperty 实例,在注册依赖项属性时作为返回值获得,之后将存储为一个类成员。在与 WPF 属性系统交互的许多 API 中,此标识符用作一个参数。
CLR“包装”:属性的实际 get 和 set 实现。这些实现通过在 GetValue 和 SetValue 调用中使用依赖项属性标识符来合并此标识符,从而使用 WPF 属性系统为属性提供支持。
2:实现依赖项属性
下面的示例定义 IsSpinning 依赖项属性,并说明 DependencyProperty 标识符与它所支持的属性之间的关系。
public static readonly DependencyProperty IsSpinningProperty =
DependencyProperty.Register(
"IsSpinning", typeof(Boolean),
...
);
public bool IsSpinning
{
get { return (bool)GetValue(IsSpinningProperty); }
set { SetValue(IsSpinningProperty, value); }
}
TMJ .NET培训,开创 200元/月,学到会!
NET C# 入门级
.NET C# 专业级
.NET 架构级
BS系统专业级
BS系统安全
1.开篇及C#程序、解决方案的结构
2.源码管理之TFS入门
3.打老鼠初级
……
21.CMS之主要功能实现
22.进程和线程基础
23.类型转换
24.算法基础
25.初级课程之剩余知识点
1.消灭打老鼠游戏中的自定义委托
2.垃圾回收
3.Dispose模式
……
16.异常使用指导
17.最常用的重构指导
18.Debug和IDE的进阶
19.Resharper的使用
20.ILSPY的使用
1.Socket入门
2.打造打老鼠游戏网络版
3.WCF入门
……
10.依赖注入
11.万物兼可测试
12.软件指标之覆盖率计算
13.软件指标之代码行
14.软件指标之圈复杂度、嵌套深度
1.HTML
2.WebForm原理
3.CSS必知必会
……
19.让浏览器缓存Shop
20.Asp.net的生命周期
21.Asp.net网站的发布以及调试晋级
22.BS程序的本质
23.压力测试我们的Shop
1.Fiddler必知必会
2.IE开发者工具必知必会
3.跨站脚本防范
4.权限欺骗防范
5.参数越界防范
6.会话劫持防范
7.CSRF防范
8.盗链防范
9.静态文件的保护
将本文分享到:
QQ空间
新浪微博
人人网
开心网
搜狐微博
MSN
谷歌
更多
本文基于Creative Commons Attribution 2.5 China Mainland License发布,欢迎转载,演绎或用于商业目的,但是必须保留本文的署名http://www.cnblogs.com/luminji(包含链接)。如您有任何疑问或者授权方面的协商,请给我留言。
WPF快速指导11:输入和命令
WPF快速指导11:输入和命令
本文摘要:
1:输入的种类;
2:命令
1:输入的种类
可在基元素类上找到公开的主输入 API:UIElement、ContentElement、FrameworkElement 和 FrameworkContentElement。除了基元素类上的输入 API,Keyboard 类和 Mouse 类还提供了用于处理键盘和鼠标输入的其他 API。
Keyboard 类上的输入 API 的示例有 Modifiers 属性(用于返回当前按下的 ModifierKeys)和 IsKeyDown 方法(用于确定是否按下了指定的键)。
下面的示例使用 GetKeyStates 方法确定 Key 是否处于按下状态。
if ((Keyboard.GetKeyStates(Key.Return) & KeyStates.Down) > 0)
{
btnNone.Background = Brushes.Red;
}
Mouse 类上的输入 API 的示例有 MiddleButton(用于获取鼠标中键的状态)和 DirectlyOver(用于获取鼠标指针当前位于其上的元素)。
下面的示例确定鼠标上的 LeftButton 是否处于 Pressed 状态。
if (Mouse.LeftButton == MouseButtonState.Pressed)
{
UpdateSampleResults("Left Button Pressed");
}
还有一类是触笔输入Stylus,在这里不做赘述。
2:命令
使用命令,输入处理可以更多地在语义级别(而不是在设备输入级别)进行。命令是简单的指令,如 Cut、Copy、Paste 或 Open。命令对于集中命令逻辑很有用。同一命令可通过 Menu、在 ToolBar 上或者通过键盘快捷方式来访问。命令还提供了在命令不可用时禁用控件的机制。
RoutedCommand 是 ICommand 的 WPF 实现。执行 RoutedCommand 时,将在命令目标上引发 PreviewExecuted 和 Executed 事件,这两个事件与其他输入一样,都通过元素树进行隧道和冒泡操作。如果未设置命令目标,则具有键盘焦点的元素将成为命令目标。执行该命令的逻辑将附加到 CommandBinding。当 Executed 事件访问该特定命令的 CommandBinding 时,将调用 CommandBinding 上的 ExecutedRoutedEventHandler。此处理程序执行命令的操作。
WPF 提供了一个由 ApplicationCommands、MediaCommands、ComponentCommands、NavigationCommands 和 EditingCommands 组成的常见命令库,您也可以定义自己的命令库。
WPF 中的路由命令模型可以分为四个主要概念:命令、命令源、命令目标以及命令绑定:
命令是要执行的操作。
命令源是调用命令的对象。
命令目标是在其上执行命令的对象。
命令绑定是将命令逻辑映射到命令的对象。
TMJ .NET培训,开创 200元/月,学到会!
NET C# 入门级
.NET C# 专业级
.NET 架构级
BS系统专业级
BS系统安全
1.开篇及C#程序、解决方案的结构
2.源码管理之TFS入门
3.打老鼠初级
……
21.CMS之主要功能实现
22.进程和线程基础
23.类型转换
24.算法基础
25.初级课程之剩余知识点
1.消灭打老鼠游戏中的自定义委托
2.垃圾回收
3.Dispose模式
……
16.异常使用指导
17.最常用的重构指导
18.Debug和IDE的进阶
19.Resharper的使用
20.ILSPY的使用
1.Socket入门
2.打造打老鼠游戏网络版
3.WCF入门
……
10.依赖注入
11.万物兼可测试
12.软件指标之覆盖率计算
13.软件指标之代码行
14.软件指标之圈复杂度、嵌套深度
1.HTML
2.WebForm原理
3.CSS必知必会
……
19.让浏览器缓存Shop
20.Asp.net的生命周期
21.Asp.net网站的发布以及调试晋级
22.BS程序的本质
23.压力测试我们的Shop
1.Fiddler必知必会
2.IE开发者工具必知必会
3.跨站脚本防范
4.权限欺骗防范
5.参数越界防范
6.会话劫持防范
7.CSRF防范
8.盗链防范
9.静态文件的保护
将本文分享到:
QQ空间
新浪微博
人人网
开心网
搜狐微博
MSN
谷歌
更多
本文基于Creative Commons Attribution 2.5 China Mainland License发布,欢迎转载,演绎或用于商业目的,但是必须保留本文的署名http://www.cnblogs.com/luminji(包含链接)。如您有任何疑问或者授权方面的协商,请给我留言。
C#笔记24:善用Visual Studio
C#笔记24:善用Visual Studio
1:调试的四个窗口
2:加快编码速度
3:加快编码速度
4:使用第三方工具丰富VS
5:VS2010中的工具
6:学会调试
1:调试的四个窗口
立即窗口:提供运行时动态增加代码,或者动态改变当前代码变量的窗口。
快速监视窗口:能够快速监视当前代码中的变量。
调用堆栈窗口:查看当前代码是被其它那个文件的代码所调用。
线程窗口:查看当前应用程序所启用的线程。
有关调试的更多技巧,请参考http://msdn.microsoft.com/zh-cn/library/sc65sadd.aspx和http://msdn.microsoft.com/zh-cn/library/7fe0dd2y.aspx
2:启用编辑并继续
调试代码过程中,如果发现代码有误,不需要停止调试,直接暂停调试,修改代码,然后恢复运行,就可调试刚才修改的代码。
3:加快编码速度
a、智能感知。如输入prop,再按TAB,即可生成一个公共属性。要查看所有支持智能感知功能的关键字,请在智能感知右键中查看所有符号即可。
b、善用重构功能。如选中一段代码,按ctrl+r+m,便会将该段代码重构成一个函数。
c、善用tab,如事件或委托变量的+=后按tab,便可完成一系列自动代码的生成。
d、善用其它快捷键。默认的快捷键,不再赘述。一个技巧是,如果想查看某个功能的快捷键,可以在“选项”-“键盘”中的“显示命令包含”中输入功能名字,即可查找到该快捷键。你还可以在此处定义你自己的快捷键。
4:使用第三方工具丰富VS
第三方工具中,只介绍一个最有用的工具,那就是RedGat。里面的常规工具如下,其中最重要的是Reflector,集成到你的VS中后,可以支持直接调试第三方DLL和FRAMEWORK中开放的DLL,这对于我们阅读他人优秀代码提升自己的水平有很大作用。
1) ANTS Memory Profiler 5.1.0.152) ANTS Performance Profiler 5.2.0.263) Exception Hunter 2.1.0.24) PInvoke Visual Studio Add-in 1.1.0.75) SQL Backup 6.3.0.486) SQL Backup Server Components 6.3.0.487) SQL Compare 8.1.0.3608) SQL Comparison SDK 8.0.1.89) SQL Data Compare 8.0.2.510) SQL Data Generator 1.2.0.28611) SQL Dependency Tracker 2.5.0.55812) SQL Doc 2.0.0.73313) SQL Multi Script 1.1.0.3414) SQL Packager 6.0.0.10715) SQL Prompt 4.0.3.1216) SQL Refactor 1.5.1.3117) SQL Response 1.3.0.5818) SQL Response Alert Repository 1.3.0.5819) SQL Object Level Recovery Native 1.1.0.3220) .NET Reflector 6.0.0.816
5:VS2010中的工具
VS2010中有一个Extension Manager,其中有很多有用的VS工具。大家可查阅。
6:学会调试
这里有两篇非常不错的文章,强烈推荐:
http://www.cnblogs.com/alexis/archive/2010/11/06/1870519.html
http://www.cnblogs.com/alexis/archive/2010/11/07/1871073.html
TMJ .NET培训,开创 200元/月,学到会!
NET C# 入门级
.NET C# 专业级
.NET 架构级
BS系统专业级
BS系统安全
1.开篇及C#程序、解决方案的结构
2.源码管理之TFS入门
3.打老鼠初级
……
21.CMS之主要功能实现
22.进程和线程基础
23.类型转换
24.算法基础
25.初级课程之剩余知识点
1.消灭打老鼠游戏中的自定义委托
2.垃圾回收
3.Dispose模式
……
16.异常使用指导
17.最常用的重构指导
18.Debug和IDE的进阶
19.Resharper的使用
20.ILSPY的使用
1.Socket入门
2.打造打老鼠游戏网络版
3.WCF入门
……
10.依赖注入
11.万物兼可测试
12.软件指标之覆盖率计算
13.软件指标之代码行
14.软件指标之圈复杂度、嵌套深度
1.HTML
2.WebForm原理
3.CSS必知必会
……
19.让浏览器缓存Shop
20.Asp.net的生命周期
21.Asp.net网站的发布以及调试晋级
22.BS程序的本质
23.压力测试我们的Shop
1.Fiddler必知必会
2.IE开发者工具必知必会
3.跨站脚本防范
4.权限欺骗防范
5.参数越界防范
6.会话劫持防范
7.CSRF防范
8.盗链防范
9.静态文件的保护
将本文分享到:
QQ空间
新浪微博
人人网
开心网
搜狐微博
MSN
谷歌
更多
本文基于Creative Commons Attribution 2.5 China Mainland License发布,欢迎转载,演绎或用于商业目的,但是必须保留本文的署名http://www.cnblogs.com/luminji(包含链接)。如您有任何疑问或者授权方面的协商,请给我留言。
WPF快速指导7:控件和自定义控件
WPF快速指导7:控件和自定义控件
本文摘要:
1:控件和自定义控件的概念;
2:更改控件的外观;
3:自定义控件的设计原则;
1:控件和自定义控件的概念
Windows Presentation Foundation (WPF) 附带了许多几乎在所有 Windows 应用程序中都会使用的常见 UI 组件,如 Button、Label、TextBox、Menu 和 ListBox。以前,这些对象被称为控件。现在,WPF SDK 继续使用术语“控件”泛指任何代表应用程序中可见对象的类。请注意,类不必从 Control 类继承即可具有可见外观。从 Control 类继承的类包含一个 ControlTemplate,允许控件的使用方在无需创建新子类的情况下根本改变控件的外观。
那么,什么是自定义控件。从第一段的描述中其实已经看到,自定义控件包含两类。一类是集成Control来实现,一类是仅仅通过定义ControlTemplate即可。
2:更改控件的外观
通过执行以下操作之一来更改控件的外观:
更改控件的属性值。
为控件创建 Style。
为控件创建新 ControlTemplate。
3:自定义控件的设计原则
通过丰富内容模型、样式、模板和触发器,最大程度地减少了创建新控件的需要。但是,如果确实需要创建新控件,那么理解 WPF 中的不同控件创作模型就显得非常重要。WPF 提供三个用于创建控件的一般模型,每个模型都提供不同的功能集和灵活度。这三个模型的基类分别为 UserControl、Control 和 FrameworkElement。
从 UserControl 派生
在 WPF 中创建控件的最简单方法是从 UserControl 派生。如果生成继承自 UserControl 的控件,需要将现有组件添加到 UserControl,命名这些组件,然后在 可扩展应用程序标记语言 (XAML) 中引用事件处理程序。执行这些操作之后,即可在代码中引用这些命名元素和定义事件处理程序。此开发模型与用于 WPF 应用程序开发的模型非常相似。
如果生成正确,UserControl 可以利用丰富内容、样式和触发器的优点。但是,如果控件继承自 UserControl,则使用该控件的用户将无法使用 DataTemplate 或 ControlTemplate 来自定义其外观。因此,有必要从 Control 类或其派生类(UserControl 除外)进行派生,以便创建支持模板的自定义控件。
从 UserControl 派生的优点
如果符合以下所有情况,请考虑从 UserControl 派生:
希望以类似于生成应用程序的方式生成控件。
控件仅由现有组件组成。
不需要支持复杂自定义项。
从 Control 派生
从 Control 类派生是大多数现有 WPF 控件使用的模型。在创建继承自 Control 类的控件时,可使用模板定义其外观。通过这种方式,可以将运算逻辑从可视化表示形式中分离出来。这样还可以确保使用命令和绑定而非事件来分离 UI 和逻辑,并在可能时避免引用 ControlTemplate 中的元素。 如果将控件的 UI 和逻辑正确分离,则控件的用户可以重定义该控件的 ControlTemplate 以自定义其外观。 尽管构建自定义 Control 不像构建 UserControl 那样容易,但是自定义 Control 可提供最大的灵活性。
从 Control 派生的优点
如果符合以下任一情况,请考虑从 Control 派生,而不要使用 UserControl 类:
希望控件外观能通过 ControlTemplate 进行自定义。
希望控件支持不同的主题。
从 FrameworkElement 派生
从 UserControl 或 Control 派生的控件依赖于组合现有元素。很多情况下,这是一种可接受的解决方案,因为从 FrameworkElement 继承的任何对象都可以位于 ControlTemplate 中。但是,某些时候,简单的元素组合不能满足控件的外观需要。对于这些情况,使组件基于 FrameworkElement 才是正确的选择。
生成基于 FrameworkElement 的组件有两种标准方法:直接呈现和自定义元素组合。直接呈现涉及的操作包括:重写 FrameworkElement 的 OnRender 方法,并提供显式定义组件视觉效果的 DrawingContext 操作。此方法由 Image 和 Border 使用。自定义元素组合涉及的操作包括使用 Visual 类型的对象组合组件的外观。有关示例,请参见使用 DrawingVisual 对象。Track 是 WPF 中使用自定义元素组合的控件示例。在同一控件中,也可以混合使用直接呈现和自定义元素组合。
从 FrameworkElement 派生的优点
如果符合以下任一情况,请考虑从 FrameworkElement 派生:
希望对控件的外观进行精确控制,而不仅仅是简单的元素组合提供的效果。
想要通过定义自己的呈现逻辑来定义控件的外观。
想要以一种 UserControl 和 Control 之外的新颖方式组合现有元素。
TMJ .NET培训,开创 200元/月,学到会!
NET C# 入门级
.NET C# 专业级
.NET 架构级
BS系统专业级
BS系统安全
1.开篇及C#程序、解决方案的结构
2.源码管理之TFS入门
3.打老鼠初级
……
21.CMS之主要功能实现
22.进程和线程基础
23.类型转换
24.算法基础
25.初级课程之剩余知识点
1.消灭打老鼠游戏中的自定义委托
2.垃圾回收
3.Dispose模式
……
16.异常使用指导
17.最常用的重构指导
18.Debug和IDE的进阶
19.Resharper的使用
20.ILSPY的使用
1.Socket入门
2.打造打老鼠游戏网络版
3.WCF入门
……
10.依赖注入
11.万物兼可测试
12.软件指标之覆盖率计算
13.软件指标之代码行
14.软件指标之圈复杂度、嵌套深度
1.HTML
2.WebForm原理
3.CSS必知必会
……
19.让浏览器缓存Shop
20.Asp.net的生命周期
21.Asp.net网站的发布以及调试晋级
22.BS程序的本质
23.压力测试我们的Shop
1.Fiddler必知必会
2.IE开发者工具必知必会
3.跨站脚本防范
4.权限欺骗防范
5.参数越界防范
6.会话劫持防范
7.CSRF防范
8.盗链防范
9.静态文件的保护
将本文分享到:
QQ空间
新浪微博
人人网
开心网
搜狐微博
MSN
谷歌
更多
本文基于Creative Commons Attribution 2.5 China Mainland License发布,欢迎转载,演绎或用于商业目的,但是必须保留本文的署名http://www.cnblogs.com/luminji(包含链接)。如您有任何疑问或者授权方面的协商,请给我留言。
带你读《KVM实战:原理、进阶与性能调优》之三:构建KVM环境
点击查看第一章点击查看第二章
第3章
构建KVM环境通过第2章了解KVM的基本原理之后,你是否迫不及待地想实践一下如何使用KVM来构建自己的虚拟化环境呢?本章将介绍如何通过整套的流程与方法来构建KVM环境,其中包括:硬件系统的配置、宿主机(Host)操作系统的安装、KVM的编译与安装、QEMU的编译与安装、客户机(Guest)的安装,直到最后启动你的第一个KVM客户机。
3.1 硬件系统的配置
我们知道,KVM从诞生伊始就需要硬件虚拟化扩展的支持,所以这里需要特别讲解一下硬件系统的配置。KVM最初始的开发是基于x86和x86-64处理器架构上的Linux系统进行的,目前,KVM被移植到多种不同处理器架构之上,包括AIM联盟(Apple–IBM–Motorola)的PowerPC架构、IBM的S/390架构、ARM架构(2012年开始)等。其中,在x86-64上面的功能支持是最完善的(主要原因是Intel/AMD的x86-64架构在桌面和服务器市场上的主导地位及其架构的开放性,以及它的开发者众多),本书也采用基于Intel x86-64架构的处理器作为基本的硬件环境。在x86-64架构的处理器中,KVM需要的硬件虚拟化扩展分别为Intel的虚拟化技术(Intel VT)和AMD的AMD-V技术。其中,Intel在2005年11月发布的奔腾四处理器(型号:662 和672)中第一次正式支持VT技术(Virtualization Technology),之后不久的2006年5月AMD也发布了支持AMD-V的处理器。现在比较流行的针对服务器和桌面的Intel处理器多数都是支持VT技术的,本节着重讲述与英特尔的VT技术相关的硬件设置。首先处理器(CPU)要在硬件上支持VT技术,还要在BIOS中将其功能打开,KVM才能使用到。目前,多数流行的服务器和部分桌面处理器的BIOS都默认将VT打开了。在BIOS中,VT的选项通过“Advanced→Processor Configuration”来查看和设置,它的标识通常为“Intel(R) Virtualization Technology”或“Intel VT”等类似的文字说明。除了支持必需的处理器虚拟化扩展以外,如果服务器芯片还支持VT-d(Virtualization Technology for Directed I/O),建议在BIOS中将其打开,因为后面一些相对高级的设备的直接分配功能会需要硬件VT-d技术的支持。VT-d是对设备I/O的虚拟化硬件支持,在BIOS中的位置可能为“Advanced→Processor Configuration”或“Advanced→System Agent (SA) Configuration”,它在BIOS中的标志一般为“Intel(R) VT for Directed I/O”或“Intel VT-d”。下面以一台Intel Haswell-UP平台的服务器为例,来说明在BIOS中的设置。1)BIOS中的Advanced选项,如图3-1所示。
2)BIOS中Enabled的VT和VT-d选项,如图3-2所示。
对于不同平台或不同厂商的BIOS,VT和VT-d等设置的位置可能是不一样的,需要根据实际的硬件情况和BIOS中的选项来灵活设置。设置好了VT和VT-d的相关选项,保存BIOS的设置并退出,系统重启后生效。在Linux系统中,可以通过检查/proc/cpuinfo文件中的CPU特性标志(flags)来查看CPU目前是否支持硬件虚拟化。在x86和x86-64平台中,Intel系列CPU支持虚拟化的标志为“vmx”,AMD系列CPU的标志为“svm”。所以可以用以下命令行查看“vmx”或者“svm”标志:[root@kvm-host ~]# grep -E "svm|vmx" /proc/cpuinfo flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc aperfmperf eagerfpu pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 fma cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm ida arat epb pln pts dtherm tpr_shadow vnmi flexpriority ept vpid fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid xsaveopt
3.2 安装宿主机Linux系统
KVM是基于内核的虚拟化技术的,要运行KVM虚拟化环境,安装一个Linux操作系统的宿主机(Host)是必需的。由于Redhat公司是目前对KVM项目投入最多的企业之一,从RHEL 6(RedHat Enterprise Linux 6)开始,其系统自带的虚拟化方案就采用了KVM;而从RHEL 7开始,更是只支持KVM的虚拟化。而且RHEL也是最流行的企业级Linux发行版之一,所以本节选用RHEL来讲解Linux系统的安装步骤和过程,并且本章后面的编译和运行都是在这个系统上进行的。当然,KVM作为流行的开源虚拟机之一,可以在绝大多数流行的Linux系统上编译和运行,所以依然可以选择RHEL之外的其他Linux发行版,如CentOS、Fedora、Ubuntu、Debian、OpenSuse等系统都是不错的选择。本节内容基于目前最新的RHEL版本—RHEL 7.3 Server版的系统来简单介绍,普通Linux安装的基本过程不再详细描述,这里主要说明安装过程中一些值得注意的地方。在选择哪些安装包(SOFTWARE SELECTION)时(图3-3),点进去选择“Server with GUI”,而不是默认的“Minimal Install”,如图3-4所示。
在选择了“Server with GUI”之后,右侧还有可以额外增加的组件供选择(见图3-4),我们需要选上“Development Tools”,因为在本书的KVM编译过程中以及其他实验中可能会用到,其中包括一些比较重要的软件包,比如:gcc、git、make等(一般被默认选中)。可以看到还有“Virtualization Hypervisor”“Virtualization Tools”,这里可以暂时不选它们(选上也没有关系),因为在本章中会自己编译KVM和QEMU,而在附录A介绍发行版中的KVM时,我们会安装Virtualization Host环境,并使用发行版中自带的KVM Virtualization功能。
然后,单击“Done”按钮并继续进行后面的安装流程。可以安装相应的软件包,安装过程的一个快照如图3-5所示。在安装完所有软件包后,系统会提示安装完成需要重启系统,重启后即可进入RHEL 7.3系统中。至此,Linux系统就安装完毕了,这就是在本书中作为宿主机(Host)的操作系统,后面的编译和实验都是在这个宿主机上进行的(当然,我们会使用本章讲述的自己编译的kernel和QEMU来进行实验)。
3.3 编译和安装KVM
3.3.1 下载KVM源代码
KVM作为Linux kernel中的一个module而存在,是从Linux 2.6.20版本开始被完全正式加入内核的主干开发和正式发布代码中。所以,只需要下载2.6.20版本,Linux kernel代码即可编译和使用KVM。当然,如果是为了学习KVM,推荐使用最新正式发布或者开发中的kernel版本,如果是实际部署到生产环境中,还需要自己选择适合的稳定版本进行详尽的功能和性能测试。如果你想使用最新的处于开发中的KVM代码,需要自己下载KVM的代码仓库,本节就是以此为例来讲解的。总的来说,下载最新KVM源代码,主要有以下3种方式:1)下载KVM项目开发中的代码仓库kvm.git。2)下载Linux内核的代码仓库linux.git。3)打包下载Linux内核的源代码(Tarball格式)。1.下载kvm.gitKVM项目的代码是托管在Linux内核官方源码网站http://git.kernel.org上的,可以到上面查看和下载。该网页上virt/kvm/kvm.git 即KVM项目的代码,它是最新的、功能最丰富的KVM源代码库(尽管并非最稳定的)。目前,kvm.git的最主要维护者(maintainer)是来自Redhat公司的Paolo Bonzini和Radim Krˇcmáˇr。从http://git.kernel.org/?p=virt/kvm/kvm.git网页可以看到,kvm.git的下载链接有以下3个URL,可用于下载最新的KVM的开发代码仓库。git://git.kernel.org/pub/scm/virt/kvm/kvm.githttp://git.kernel.org/pub/scm/virt/kvm/kvm.githttps://git.kernel.org/pub/scm/virt/kvm/kvm.git这3个URL下载的内容完全一致,根据自己实际情况选择其中一个下载即可。Linux内核相关的项目一般都使用Git作为源代码管理工具,KVM当然也是用Git管理源码的。可以使用git clone命令来下载KVM的源代码,也可以使用Git工具的其他命令对源码进行各种管理。这里不详述Git的各种命令,有兴趣的读者可以参考其他文稿。kvm.git的下载方式和过程为以下命令行所示:[root@kvm-host ~]# git clone git://git.kernel.org/pub/scm/virt/kvm/kvm.gitCloning into 'kvm'...remote: Counting objects: 5017872, done.remote: Compressing objects: 100% (938249/938249), done.Receiving objects: 100% (5017872/5017872), 1006.69 MiB | 60.72 MiB/s, done.remote: Total 5017872 (delta 4229078), reused 4826094 (delta 4038351)Resolving deltas: 100% (4229078/4229078), done.Checking out files: 100% (55914/55914), done.[root@kvm-host ~]# cd kvm/[root@kvm-host kvm]# pwd/root/kvm 2.下载linux.gitLinux内核的官方网站为http://kernel.org,其中源代码管理网站为http://git.kernel.org,可以在那里找到最新的linux.git代码。在源码管理网站上,我们看到有多个linux.git,我们选择Linus Torvalds的源码库(也即是Linux内核的主干)。在内核源码的网页http://git.kernel.org/?p=linux/kernel/git/torvalds/linux.git 中可以看到,其源码仓库也有以下3个链接可用:git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.githttp://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.githttps://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git这3个URL中源码内容是完全相同的,可以使用git clone命令复制到本地,其具体操作方式与前一种(kvm.git)的下载方式完全一样。3.下载Linux的Tarball在Linux官方网站(http://kernel.org)上,也提供Linux内核的Tarball文件下载。除了在其首页上单击一些Tarball之外,也可以到以下网址下载Linux内核的各个版本的Tarball:□ftp://ftp.kernel.org/pub/linux/kernel。□http://www.kernel.org/pub/linux/kernel。kernel.org还提供一种rsync的方式下载,此处不详细叙述,请参见其官网首页的提示。以用wget下载linux-4.8.1.tar.xz 为例,命令行代码如下:[root@kvm-host ~]# wgethttps://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.8.1.tar.xz4.通过kernel.org的镜像站点下载由于Linux的源代码量比较大,如果只有美国一个站点可供下载,那么速度会较慢,服务器压力也较大。所以,kernel.org在世界上多个国家和地区都有一些镜像站点,而且一些Linux开源社区的爱好者们也自发建立了不少kernel.org的镜像,在中国的镜像站点中,推荐大家从以下两个镜像站点下载Linux相关的代码及其他源码,访问速度比较快。□清华大学开源镜像站:http://mirror.tuna.tsinghua.edu.cn,其中的链接地址https://mirror.tuna.tsinghua.edu.cn/kernel与http://www.kernel.org/pub/linux/kernel是同步的,用起来比较方便。□北京交通大学的一个开源镜像站:http://mirror.bjtu.edu.cn/kernel/linux/kernel。还有以下两个镜像站推荐给大家:□网易开源镜像站,http://mirrors.163.com。□搜狐开源镜像站,http://mirrors.sohu.com。
3.3.2 配置KVM
上面3种方式下载的源代码都可以同样地进行配置和编译,本章以开发中的最新源代码仓库kvm.git来讲解KVM的配置和编译等。KVM是作为Linux内核中的一个module而存在的,而kvm.git是一个包含了最新的KVM模块开发中代码的完整的Linux内核源码仓库。它的配置方式与普通的Linux内核配置完全一样,只是需要注意将KVM相关的配置选择为编译进内核或者编译为模块。在kvm.git(Linux kernel)代码目录下,运行“make help”命令可以得到一些关于如何配置和编译kernel的帮助手册。命令行如下:
对KVM或Linux内核配置时常用的一些配置命令解释如下。1)make config:基于文本的最为传统也是最为枯燥的一种配置方式,但是它可以适用于任何情况之下。这种方式会为每一个内核支持的特性向用户提问,如果用户回答“y”,则把特性编译进内核;回答“m”,则把特性作为模块进行编译;回答“n”,则表示不对该特性提供支持;输入“?”则显示该选项的帮助信息。在了解之后再决定处理该选项的方式。在回答每个问题前必须考虑清楚,如果在配置过程中因为失误而给了错误的回答,就只能按“Ctrl+c”组合键强行退出然后重新配置了。2)make oldconfig:make oldconfig和make config类似,但是它的作用是在现有的内核设置文件基础上建立一个新的设置文件,只会向用户提供有关新内核特性的问题。在新内核升级的过程中,make oldconfig非常有用,用户将现有的配置文件.config复制到新内核的源码中,执行make oldconfig,此时,用户只需要回答那些针对新增特性的问题。3)make silentoldconfig:和上面make oldconfig一样,只是额外悄悄地更新选项的依赖关系。4)make olddefconfig:和上面make silentoldconfig一样,但不需要手动交互,而是对新选项以其默认值配置。5)make menuconfig:基于终端的一种配置方式,提供了文本模式的图形用户界面,用户可以通过移动光标来浏览所支持的各种特性。使用这种配置方式时,系统中必须安装ncurses库,否则会显示“Unable to find the ncurses libraries”的错误提示。其中“Y”“N”“M”“?”输入键的选择功能与前面make config中介绍的一致。6)make xconfig:基于X Window的一种配置方式,提供了漂亮的配置窗口,不过只能在X Server上运行X桌面应用程序时使用。它依赖于QT,如果系统中没有安装QT库,则会出现“Unable to find any QT installation”的错误提示。7)make gconfig:与make xconfig类似,不同的是make gconfig依赖于GTK库。8)make defconfig:按照内核代码中提供的默认配置文件对内核进行配置(在Intel x86-64平台上,默认配置为arch/x86/configs/x86_64_defconfig),生成.config文件可以用作初始化配置,然后再使用make menuconfig进行定制化配置。9)make allyesconfig:尽可能多地使用“y”输入设置内核选项值,生成的配置中包含了全部的内核特性。10)make allnoconfig:除必需的选项外,其他选项一律不选(常用于嵌入式Linux系统的编译)。11)make allmodconfig:尽可能多地使用“m”输入设置内核选项值来生成配置文件。12)make localmodconfig:会执行 lsmod 命令查看当前系统中加载了哪些模块(Modules),并最终将原来的.config 中不需要的模块去掉,仅保留前面 lsmod 命令查出来的那些模块,从而简化了内核的配置过程。这样做确实方便了很多,但是也有个缺点:该方法仅能使编译出的内核支持当前内核已经加载的模块。因为该方法使用的是 lsmod 查询得到的结果,如果有的模块当前没有被加载,那么就不会编到新的内核中。下面以make menuconfig为例,介绍一下如何选择KVM相关的配置(系统中要安装好ncurses-devel包)。运行make menuconfig后显示的界面如图3-6所示。选择了Virtualization之后,进入其中进行详细配置,包括选中KVM、选中对处理器的支持(比如:KVM for Intel processors support,KVM for AMD processors support)等,如图3-7所示。
提示:为了确保生成的.config文件生成的kernel是实际可以工作的(直接make defconfig 生成的.config文件编译出来的kernel常常是不能工作的),最佳实践是以你当前使用的config(比如,我们安装好RHEL 7.3的OS以后,/boot/config-3.10.0-xxx.x86_64)为基础,将它复制到你的linux 目录下,重命名为.config,然后通过make olddefconfig更新补充一下这个.config。在配置完成之后,就会在kvm.git目录下面生成一个.config文件。最好检查一下KVM相关的配置是否正确。在本次配置中,与KVM直接相关的几个配置项主要情况如下:
3.3.3 编译KVM
在对KVM源代码进行了配置之后,编译KVM就是一件比较容易的事情了。它的编译过程完全是一个普通Linux内核编译的过程,需要经过编译kernel、编译bzImage和编译module等3个步骤。编译bzImage这一步不是必需的,在本章示例中,config中使用了initramfs,所以这里需要这个bzImage,用于生成initramfs image。另外,在最新的Linux kernel代码中,根据makefile中的定义可以看出,直接执行“make”或“make all”命令就可以将这里提及的3个步骤全部包括在内。本节是为了更好地展示编译的过程,才将编译的步骤分为这3步来解释。1)编译kernel的命令为“make vmlinux”,其编译命令和输出如下:[root@kvm-host kvm]# make vmlinux -j 20
LINK vmlinux
LD vmlinux.o
MODPOST vmlinux.o
GEN .version
CHK include/generated/compile.h
UPD include/generated/compile.h
CC init/version.o
LD init/built-in.o
KSYM .tmp_kallsyms1.o
KSYM .tmp_kallsyms2.o
LD vmlinux #这里就是编译、链接后生成了启动所需的Linux kernel文件
SORTEX vmlinux
SYSMAP System.map
其中,编译命令中的“-j”参数并非必需的,它是让make工具用多任务(job)来编译。比如,上面命令中提到的“-j 20”,会让make工具最多创建20个GCC进程,同时来执行编译任务。在一个比较空闲的系统上,有一个推荐值作为-j参数的值,即大约为2倍于系统上的CPU的core的数量(CPU超线程也算core)。如果-j后面不跟数字,则make会根据现在系统中的CPU core的数量自动安排任务数(通常比core的数量略多一点)。2)执行编译bzImage的命令“make bzImage”,其输出如下:[root@kvm-host kvm]# make bzImage
CHK include/config/kernel.release
CHK include/generated/uapi/linux/version.h
CHK include/generated/utsrelease.h
LD arch/x86/boot/setup.elf
OBJCOPY arch/x86/boot/setup.bin
OBJCOPY arch/x86/boot/vmlinux.bin
HOSTCC arch/x86/boot/tools/build
BUILD arch/x86/boot/bzImage #这里生成了我们需要的bzImage文件
Setup is 17276 bytes (padded to 17408 bytes).System is 5662 kBCRC 3efff614Kernel: arch/x86/boot/bzImage is ready (#2) 3)编译kernel和bzImage之后编译内核的模块,命令为“make modules”,其命令行输出如下:[root@kvm-host kvm]# make modules -j 20
IHEX2FW firmware/emi26/loader.fw
IHEX2FW firmware/emi26/firmware.fw
IHEX2FW firmware/emi26/bitstream.fw
IHEX2FW firmware/emi62/loader.fw
IHEX2FW firmware/emi62/bitstream.fw
IHEX2FW firmware/emi62/spdif.fw
IHEX2FW firmware/emi62/midi.fw
H16TOFW firmware/edgeport/boot2.fw
H16TOFW firmware/edgeport/boot.fw
H16TOFW firmware/edgeport/down.fw
H16TOFW firmware/edgeport/down2.fw
IHEX2FW firmware/whiteheat_loader.fw
IHEX2FW firmware/whiteheat.fw
IHEX2FW firmware/keyspan_pda/keyspan_pda.fw
IHEX2FW firmware/keyspan_pda/xircom_pgs.fw
3.3.4 安装KVM
编译完KVM之后,下面介绍如何安装KVM。KVM的安装包括两个步骤:安装module,安装kernel与initramfs。1.安装module通过“make modules_install”命令可以将编译好的module安装到相应的目录中,默认情况下module被安装到/lib/modules/$kernel_version/kernel目录中。[root@kvm-host kvm]# make modules_install
INSTALL /lib/firmware/whiteheat.fw
INSTALL /lib/firmware/keyspan_pda/keyspan_pda.fw
INSTALL /lib/firmware/keyspan_pda/xircom_pgs.fw
DEPMOD 4.8.0+
安装好module之后,可以查看一下相应的安装路径,可看到kvm模块也已经安装。如下所示:[root@kvm-host kvm]# ll /lib/modules/4.8.0+/kernel/total 16drwxr-xr-x 3 root root 16 Oct 15 15:05 archdrwxr-xr-x 3 root root 4096 Oct 15 15:05 cryptodrwxr-xr-x 66 root root 4096 Oct 15 15:06 driversdrwxr-xr-x 26 root root 4096 Oct 15 15:06 fsdrwxr-xr-x 3 root root 18 Oct 15 15:06 kerneldrwxr-xr-x 4 root root 152 Oct 15 15:06 libdrwxr-xr-x 2 root root 31 Oct 15 15:06 mmdrwxr-xr-x 32 root root 4096 Oct 15 15:06 netdrwxr-xr-x 10 root root 135 Oct 15 15:06 sounddrwxr-xr-x 3 root root 16 Oct 15 15:06 virt [root@kvm-host kvm]# ll /lib/modules/4.8.0+/kernel/arch/x86/kvm/total 11256-rw-r--r-- 1 root root 1940806 Oct 15 15:05 kvm-intel.ko-rw-r--r-- 1 root root 9583878 Oct 15 15:05 kvm.ko 2.安装kernel和initramfs通过“make install”命令可以安装kernel和initramfs,命令行输出如下:[root@kvm-host kvm]# make installsh ./arch/x86/boot/install.sh 4.8.0+ arch/x86/boot/bzImage \
System.map "/boot"
[root@kvm-host kvm]# ll /boot -t......drwx------. 6 root root 103 Oct 15 15:12 grub2-rw-r--r-- 1 root root 58106303 Oct 15 15:11 initramfs-4.8.0+.imglrwxrwxrwx 1 root root 23 Oct 15 15:10 System.map -> /boot/System.map-4.8.0+lrwxrwxrwx 1 root root 20 Oct 15 15:10 vmlinuz -> /boot/vmlinuz-4.8.0+-rw-r--r-- 1 root root 3430941 Oct 15 15:10 System.map-4.8.0+-rw-r--r-- 1 root root 5815104 Oct 15 15:10 vmlinuz-4.8.0+ 可见,在/boot目录下生成了内核(vmlinuz)和initramfs等内核启动所需的文件。在运行make install之后,在grub配置文件(如:/boot/grub2/grub.cfg)中也自动添加了一个grub选项,如下所示:menuentry 'Redhat Enterprise Linux Server (4.8.0+) 7.2 (Maipo)' ... {
load_video
insmod gzio
insmod part_msdos
insmod xfs
set root='hd1,msdos1'
if [ x$feature_platform_search_hint = xy ]; then
search --no-floppy --fs-uuid --set=root --hint-bios=hd1,msdos1 --hint-efi=hd1, msdos1 --hint-baremetal=ahci1,msdos1 da2e2d53-4b33-4bfe-a649- 73fba55a7a9d
else
search --no-floppy --fs-uuid --set=root da2e2d53-4b33-4bfe-a649-73fba55a7a9d
fi
linux16 /vmlinuz-4.8.0+ root=/dev/mapper/rhel-root ro rd.lvm.lv=rhel/root crashkernel=auto rd.lvm.lv=rhel/swap vconsole.font=latarcyrheb-sun16 vconsole.keymap=us rhgb /dev/disk/by-uuid/19d79b0d-898f-4d34-a895-c842fa65e9b9 LANG=en_US.UTF-8 console=ttyS0,115200 console=tty0 intel_iommu=on
initrd16 /initramfs-4.8.0+.img
}检查了grub之后,重新启动系统,选择刚才为了KVM而编译、安装的内核启动。系统启动后,登录进入系统,通常情况下,系统启动时默认已经加载了kvm和kvm_intel这两个模块。如果没有加载,手动用modprobe命令依次加载kvm和kvm_intel模块。[root@kvm-host kvm]# modprobe kvm[root@kvm-host kvm]# modprobe kvm_intel[root@kvm-host kvm]# lsmod | grep kvmkvm_intel 192512 0 kvm 577536 1 kvm_intel 确认KVM相关的模块加载成功后,检查/dev/kvm这个文件,它是kvm内核模块提供给用户空间的QEMU程序使用的一个控制接口,它提供了客户机(Guest)操作系统运行所需要的模拟和实际的硬件设备环境。[root@kvm-host kvm]# ls -l /dev/kvm crw-rw-rw-+ 1 root kvm 10, 232 Oct 9 15:22 /dev/kvm
3.4 编译和安装QEMU
除了在内核空间的KVM模块之外,在用户空间需要QEMU来模拟所需要的CPU和设备模型,以及启动客户机进程,这样才有了一个完整的KVM运行环境。在编译和安装了KVM并且启动到编译的内核之后,下面来看一下QEMU的编译和安装。
3.4.1 曾经的qemu-kvm
在上一版中,我们是以qemu-kvm为例来讲解QEMU/KVM的。qemu-kvm原本是kernel社区维护的专门用于KVM的QEMU的分支。在2012年年末的时候,这个分支并入了主流的QEMU(git://git.qemu-project.org/qemu.git)。从此,不再需要特殊的qemu-kvm,而只是通用的QEMU加上--enable-kvm选项就可以创建KVM guest了。
3.4.2 下载QEMU源代码
在并入主流QEMU以后,目前的QEMU项目针对KVM/x86的部分依然是由Redhat公司的 Paolo Bonzini作为维护者(Maintainer),代码的git url托管在qemu-project.org上。QEMU开发代码仓库的网页连接为:http://git.qemu.org/qemu.git。其中,可以看到有如下2个URL链接可供下载开发中的最新qemu-kvm的代码仓库。git://git.qemu.org/qemu.githttp://git.qemu.org/git/qemu.git 可以根据自己实际需要选择当中任一个,用git clone命令下载即可,它们是完全一样的。另外,也可以到以下下载链接中根据需要下载最近几个发布版本的代码压缩包。http://wiki.qemu.org/Download在本节后面讲解编译时,是以下载开发中的最新的qemu.git为例的。获取其代码仓库过程如下:[root@kvm-host ~]# git clone git://git.qemu.org/qemu.gitCloning into 'qemu'...remote: Counting objects: 294725, done.remote: Compressing objects: 100% (59425/59425), done.remote: Total 294725 (delta 238595), reused 289874 (delta 234513)Receiving objects: 100% (294725/294725), 94.23 MiB | 37.66 MiB/s, done.Resolving deltas: 100% (238595/238595), done.[root@kvm-host ~]# cd qemu[root@kvm-host qemu]# lsaccel.c CODING_STYLE dtc kvm-all.c numa.c qemu-io.c README target-mips trace
3.4.3 配置和编译QEMU
QEMU的配置并不复杂,通常情况下,直接运行代码仓库中configure文件进行配置即可。当然,如果对其配置不熟悉,可以运行“./configure --help”命令查看配置的一些选项及其帮助信息。显示配置的帮助信息如下:[root@kvm-host qemu]# ./configure --help
Usage: configure [options]Options: [defaults in brackets after descriptions]
Standard options:
--help print this message
--prefix=PREFIX install in PREFIX [/usr/local]
--interp-prefix=PREFIX where to find shared libraries, etc.
use %M for cpu name [/usr/gnemul/qemu-%M]
--target-list=LIST set target list (default: build everything)
Available targets: aarch64-softmmu alpha-softmmu
arm-softmmu cris-softmmu i386-softmmu lm32-softmmu
m68k-softmmu microblazeel-softmmu microblaze-softmmu
mips64el-softmmu mips64-softmmu mipsel-softmmu
mips-softmmu moxie-softmmu or32-softmmu
ppc64-softmmu ppcemb-softmmu ppc-softmmu
s390x-softmmu sh4eb-softmmu sh4-softmmu
sparc64-softmmu sparc-softmmu tricore-softmmu
unicore32-softmmu x86_64-softmmu xtensaeb-softmmu
xtensa-softmmu aarch64-linux-user alpha-linux-user
armeb-linux-user arm-linux-user cris-linux-user
i386-linux-user m68k-linux-user
microblazeel-linux-user microblaze-linux-user
mips64el-linux-user mips64-linux-user
mipsel-linux-user mips-linux-user
mipsn32el-linux-user mipsn32-linux-user
or32-linux-user ppc64abi32-linux-user
ppc64le-linux-user ppc64-linux-user ppc-linux-user
s390x-linux-user sh4eb-linux-user sh4-linux-user
sparc32plus-linux-user sparc64-linux-user
sparc-linux-user tilegx-linux-user
unicore32-linux-user x86_64-linux-user
Advanced options (experts only):NOTE: The object files are built at the place where configure is launched 以上configure选项中我们特别提一下“--target-list”,它指定QEMU对客户机架构的支持。可以看到,对应的选项非常多,表面上QEMU对客户机的架构类型的支持是非常全面的。由于在本书中(也是多数的实际使用场景)我们只使用x86架构的客户机,因此指定“--target-list= x86_64-softmmu”,可以节省大量的编译时间。执行configure文件进行配置的过程如下:[root@kvm-host qemu]# ./configure --target-list=x86_64-softmmuInstall prefix /usr/localBIOS directory /usr/local/share/qemu...ELF interp prefix /usr/gnemul/qemu-%MSource path /root/qemuC compiler ccHost C compiler cc...QEMU_CFLAGS -I/usr/include/pixman-1 -Werror -pthread -I/usr/include/glib-2.0 -I/usr/lib64/glib-2.0/include -fPIE -DPIE -m64 -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -Wstrict-prototypes -Wredundant-decls -Wall -Wundef -Wwrite-strings -Wmissing-prototypes -fno-strict-aliasing -fno-common -fwrapv -Wendif-labels -Wmissing-include-dirs -Wempty-body -Wnested-externs -Wformat-security -Wformat-y2k -Winit-self -Wignored-qualifiers -Wold-style-declaration -Wold-style-definition -Wtype-limits -fstack-protector-strongLDFLAGS -Wl,--warn-common -Wl,-z,relro -Wl,-z,now -pie -m64 -g ...host CPU x86_64host big endian notarget list x86_64-softmmu #这里就是我们--target-list指定的...VNC support yes #通常需要通过VNC连接到客户机中。默认...KVM support yes #这是对KVM的支持。默认...在配置完以后,qemu目录下会生成config-host.mak和config.status文件。config-host.mak里面可以查看你通过上述configure之后的结果,它会在后续make中被引用。config.status是为用户贴心设计的,便于后续要重新configure时,只要执行“./config.status”就可以恢复上一次configure的配置。这对你苦心配置了很多选项,而后又忘了的情况非常有用。经过配置之后,编译就很简单了,直接执行make即可。最后,编译生成x86_64-softmmu /qemu-system-x86_64文件,就是我们需要的用户空间用于其KVM客户机的工具了(在多数Linux发行版中自带的qemu-kvm软件包的命令行是qemu-kvm,只是名字不同的downstream,用户可以等同视之)。
3.4.4 安装QEMU
编译完成之后,运行“make install”命令即可安装QEMU。QEMU安装过程的主要任务有这几个:创建QEMU的一些目录,复制一些配置文件到相应的目录下,复制一些firmware文件(如:sgabios.bin、kvmvapic.bin)到目录下,以便qemu命令行启动时可以找到对应的固件供客户机使用;复制keymaps到相应的目录下,以便在客户机中支持各种所需键盘类型;复制qemu-system-x86_64、qemu-img等可执行程序到对应的目录下。下面的一些命令行检查了QEMU被安装之后的系统状态。
由于QEMU是用户空间的程序,安装之后不用重启系统,直接用qemu-system-x86_64、qemu-img这样的命令行工具就可以了。
3.5 安装客户机
安装客户机(Guest)之前,我们需要创建一个镜像文件或者磁盘分区等,来存储客户机中的系统和文件。关于客户机镜像有很多种制作和存储方式(将在第4章中进行详细的介绍),本节只是为了快速地演示安装一个客户机,采用了本地创建一个镜像文件,然后将镜像文件作为客户机的硬盘,将客户机操作系统(以RHEL 7为例)安装在其中。首先,需要创建一个镜像文件。我们使用上节中生成好的qemu-img工具来完成这个任务。它不仅用于创建guest,还可以在后续管理guest image。详见“qemu-img --help”及“man qemu-img”。[root@kvm-host ~]# qemu-img create -f raw rhel7.img 40GFormatting 'rhel7.img', fmt=raw size=42949672960上述就是用qemu-img create命令创建了一个空白的guest image,以raw格式,image文件的名字是“rhel7.img”, 大小是40G。虽然我们看到它的大小是40G,但是它并不占用任何磁盘空间。[root@kvm-host ~]# ls -lh rhel7.img -rw-r--r-- 1 root root 40G Oct 15 10:44 rhel7.img[root@kvm-host ~]# du -h rhel7.img 0 rhel7.img这是因为qemu-img聪明地为你按实际需求分配文件的实际大小,它将随着image实际的使用而增大。qemu-img也支持设置参数让你可以一开始就实际占有40G(当然建立的过程也就比较耗时,还会占用你更大空间。所以qemu-img默认的方式是按需分配的),如下:[root@kvm-host ~]# qemu-img create -f raw -o preallocation=full rhel7.img 40GFormatting 'rhel7.img', fmt=raw size=42949672960 preallocation=full[root@kvm-host ~]# ls -lh rhel7.img -rw-r--r-- 1 root root 40G Oct 15 10:58 rhel7.img[root@kvm-host ~]# du -h rhel7.img 40G rhel7.img除raw格式以外,qemu-img还支持创建其他格式的image文件,比如qcow2,甚至是其他虚拟机用到的文件格式,比如VMware的vmdk、vdi、vhd等。不同的文件格式会有不同的“-o”选项。创建完空白guest image之后,我们将RHEL 7安装所需的ISO文件准备好。[root@kvm-host ~]# ls -l RHEL-7.2-20151030.0-Server-x86_64-dvd1.iso -rw-r--r-- 1 root root 4043309056 Oct 30 2015 RHEL-7.2-20151030.0-Server-x86_64-dvd1.iso启动客户机,并在其中用准备好的ISO安装系统,命令行如下:qemu-system-x86_64 -enable-kvm -m 8G -smp 4 -boot once=d -cdrom RHEL-7.2-20151030.0-Server-x86_64-dvd1.iso rhel7.img其中,-m 8G是给客户机分配8G内存,-smp 4是指定客户机为对称多处理器结构并分配4个CPU,-boot once=d 是指定系统的启动顺序为首次光驱,以后再使用默认启动项(硬盘),-cdrom ** 是分配客户机的光驱。默认情况下,QEMU会启动一个VNC server端口(5900),可以用vncviwer工具来连接到QEMU的VNC端口查看客户机。通过启动时的提示,这里可以使用“vncviewer :5900”命令连接到QEMU启动的窗口。根据命令行指定的启动顺序,当有CDROM时,客户机默认会从光驱引导,启动后即可进入客户机系统安装界面,如图3-8所示。
可以选择Install安装客户机操作系统,和安装普通Linux系统类似,根据需要做磁盘分区、选择需要的软件包等。安装过程中的一个快照如图3-9所示。
在系统安装完成后,客户机中安装程序提示信息,如图3-10所示。
和普通的Linux系统安装一样,安装完成后,重启系统即可进入刚才安装的客户机操作系统。
3.6 启动第一个KVM客户机
在安装好了系统之后,就可以使用镜像文件来启动并登录到自己安装的系统之中了。通过如下的简单命令行即可启动一个KVM的客户机。[root@kvm-host ~]#qemu-system-x86_64 -m 8G -smp 4 /root/rhel7.imgVNC server running on ‘::1:5900’用vncviwer命令(此处命令为vncviwer :5900)查看客户机的启动情况。客户机启动完成后的登录界面如图3-11所示。
在通过VNC链接到QEMU窗口后,可以按组合键Ctrl+Alt+2切换到QEMU监视器窗口。在监视器窗口中可以执行一些命令,比如执行“info kvm”命令来查看当前QEMU是否使用KVM,如图3-12所示(显示为kvm support: enabled)。
用组合键Ctrl+Alt+1切换回普通的客户机查看窗口,就可以登录或继续使用客户机系统了。至此,你就已经启动属于自己的第一个KVM客户机了,尽情享受KVM虚拟化带来的快乐吧!
3.7 本章小结
本章主要讲解了如何一步一步地构建属于自己的KVM虚拟化环境。硬件和BIOS中虚拟化技术的支持是KVM运行的先决条件,编译KVM和QEMU是掌握KVM必需的、最基础的也是不可或缺的技能。其中的配置和编译KVM(或Linux kernel)是最复杂也是非常重要的环节,理解这些环节对Linux kernel相关技术(包括KVM)的学习具有非常重要的价值。通过本章,相信你已经对KVM的虚拟化环境的构建比较了解了,请自己动手构建一套自己的KVM虚拟化系统吧。也许在构建环境过程中你会碰到这样那样的问题,不过只有当你把它们都解决之后才能真正理解。然后,继续看后面的章节来了解KVM虚拟化都提供了哪些功能、命令行,以及它们的基本原理。
ElasticSearch学习笔记之原理介绍
ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。
揭面:
架构图:
架构各模块介绍:
Lucence Directory:是lucene的框架服务发现以及选主 ZenDiscovery: 用来实现节点自动发现,还有Master节点选取,假如Master出现故障,其它的这个节点会自动选举,产生一个新的Master;
Plugins:插件可以通过自定的方式扩展加强Elasticsearch的基本功能,比如可以自定义类型映射,分词器,本地脚本,自动发现等;
Scripting:使用脚本语言可以计算自定义表达式的值,比如计算自定义查询相关度评分。支持的脚本语言有groovy,js,mvel(1.3.0废弃),python等;
Disovery:该模块主要负责集群中节点的自动发现和Master节点的选举。节点之间使用p2p的方式进行直接通信,不存在单点故障的问题。Elasticsearch中,Master节点维护集群的全局状态,比如节点加入和离开时进行shard的重新分配;
River:代表es的一个数据源,也是其它存储方式(如:数据库)同步数据到es的一个方法。它是以插件方式存在的一个es服务,通过读取river中的数据并把它索引到es中;
Gateway:模块用于存储es集群的元数据信息;
Zen Discovery:zen发现机制是elasticsearch默认的内建模块。它提供了多播和单播两种发现方式,能够很容易的扩展至云环境。zen发现机制是和其他模块集成的,例如所有节点间通讯必须用trasport模块来完成。
核心概念:
集群(Cluster):ES集群是一个或多个节点的集合,它们共同存储了整个数据集,并提供了联合索引以及可跨所有节点的搜索能力。多节点组成的集群拥有冗余能力,它可以在一个或几个节点出现故障时保证服务的整体可用性。
集群靠其独有的名称进行标识,默认名称为“elasticsearch”。节点靠其集群名称来决定加入哪个ES集群,一个节点只能属一个集群;
节点(node):一个节点是一个逻辑上独立的服务,可以存储数据,并参与集群的索引和搜索功能, 一个节点也有唯一的名字,群集通过节点名称进行管理和通信;
主节点:主节点的主要职责是和集群操作相关的内容,如创建或删除索引,跟踪哪些节点是群集的一部分,并决定哪些分片分配给相关的节点。稳定的主节点对集群的健康是非常重要的。虽然主节点也可以协调节点,路由搜索和从客户端新增数据到数据节点,但最好不要使用这些专用的主节点。一个重要的原则是,尽可能做尽量少的工作。
对于大型的生产集群来说,推荐使用一个专门的主节点来控制集群,该节点将不处理任何用户请求。
数据节点:持有数据和倒排索引。
客户端节点:它既不能保持数据也不能成为主节点,该节点可以响应用户的情况,把相关操作发送到其他节点;客户端节点会将客户端请求路由到集群中合适的分片上。对于读请求来说,协调节点每次会选择不同的分片处理请求,以实现负载均衡。
部落节点:部落节点可以跨越多个集群,它可以接收每个集群的状态,然后合并成一个全局集群的状态,它可以读写所有节点上的数据。
索引(Index): ES将数据存储于一个或多个索引中,索引是具有类似特性的文档的集合。类比传统的关系型数据库领域来说,索引相当于SQL中的一个数据库,或者一个数据存储方案(schema)。索引由其名称(必须为全小写字符)进行标识,并通过引用此名称完成文档的创建、搜索、更新及删除操作。一个ES集群中可以按需创建任意数目的索引。
文档类型(Type):类型是索引内部的逻辑分区(category/partition),然而其意义完全取决于用户需求。因此,一个索引内部可定义一个或多个类型(type)。一般来说,类型就是为那些拥有相同的域的文档做的预定义。例如,在索引中,可以定义一个用于存储用户数据的类型,一个存储日志数据的类型,以及一个存储评论数据的类型。类比传统的关系型数据库领域来说,类型相当于“表”。
文档(Document) :文档是Lucene索引和搜索的原子单位,它是包含了一个或多个域的容器,基于JSON格式进行表示。文档由一个或多个域组成,每个域拥有一个名字及一个或多个值,有多个值的域通常称为“多值域”。每个文档可以存储不同的域集,但同一类型下的文档至应该有某种程度上的相似之处。相当于数据库的“记录”
Mapping: 相当于数据库中的schema,用来约束字段的类型,不过 Elasticsearch 的 mapping 可以自动根据数据创建。
ES中,所有的文档在存储之前都要首先进行分析。用户可根据需要定义如何将文本分割成token、哪些token应该被过滤掉,以及哪些文本需要进行额外处理等等。
分片(shard) :ES的“分片(shard)”机制可将一个索引内部的数据分布地存储于多个节点,它通过将一个索引切分为多个底层物理的Lucene索引完成索引数据的分割存储功能,这每一个物理的Lucene索引称为一个分片(shard)。
每个分片其内部都是一个全功能且独立的索引,因此可由集群中的任何主机存储。创建索引时,用户可指定其分片的数量,默认数量为5个。
Shard有两种类型:primary和replica,即主shard及副本shard。
Primary shard用于文档存储,每个新的索引会自动创建5个Primary shard,当然此数量可在索引创建之前通过配置自行定义,不过,一旦创建完成,其Primary shard的数量将不可更改。
Replica shard是Primary Shard的副本,用于冗余数据及提高搜索性能。
每个Primary shard默认配置了一个Replica shard,但也可以配置多个,且其数量可动态更改。ES会根据需要自动增加或减少这些Replica shard的数量。
ES集群可由多个节点组成,各Shard分布式地存储于这些节点上。
ES可自动在节点间按需要移动shard,例如增加节点或节点故障时。简而言之,分片实现了集群的分布式存储,而副本实现了其分布式处理及冗余功能。
创建索引:
过程:当分片所在的节点接收到来自协调节点的请求后,会将该请求写入translog,并将文档加入内存缓存。如果请求在主分片上成功处理,该请求会并行发送到该分片的副本上。当translog被同步到全部的主分片及其副本上后,客户端才会收到确认通知。
内存缓冲会被周期性刷新(默认是1秒),内容将被写到文件系统缓存的一个新段(segment)上。虽然这个段并没有被同步(fsync),但它是开放的,内容可以被搜索到。
每30分钟,或者当translog很大的时候,translog会被清空,文件系统缓存会被同步。这个过程在Elasticsearch中称为冲洗(flush)。在冲洗过程中,内存中的缓冲将被清除,内容被写入一个新段。段的fsync将创建一个新的提交点,并将内容刷新到磁盘。旧的translog将被删除并开始一个新的translog。
ES如何做到实时检索?
由于在buffer中的索引片先同步到文件系统缓存,再刷写到磁盘,因此在检索时可以直接检索文件系统缓存,保证了实时性。
这一步刷到文件系统缓存的步骤,在 Elasticsearch 中,是默认设置为 1 秒间隔的,对于大多数应用来说,几乎就相当于是实时可搜索了。
不过对于 ELK 的日志场景来说,并不需要如此高的实时性,而是需要更快的写入性能。我们可以通过 /_settings接口或者定制 template 的方式,加大 refresh_interval 参数。
当segment从文件系统缓存同步到磁盘时发生了错误怎么办? 数据会不会丢失?
由于Elasticsearch 在把数据写入到内存 buffer 的同时,其实还另外记录了一个 translog日志,如果在这期间故障发生时,Elasticsearch会从commit位置开始,恢复整个translog文件中的记录,保证数据的一致性。
等到真正把 segment 刷到磁盘,且 commit 文件进行更新的时候, translog 文件才清空。这一步,叫做flush。同样,Elasticsearch 也提供了 /_flush 接口。
索引数据的一致性通过 translog 保证,那么 translog 文件自己呢?
Elasticsearch 2.0 以后为了保证不丢失数据,每次 index、bulk、delete、update 完成的时候,一定触发刷新translog 到磁盘上,才给请求返回 200 OK。这个改变在提高数据安全性的同时当然也降低了一点性能
检索文档:
搜索相关性
相关性是由搜索结果中Elasticsearch打给每个文档的得分决定的。默认使用的排序算法是tf/idf(词频/逆文档频率)。词频衡量了一个词项在文档中出现的次数 (频率越高 == 相关性越高),逆文档频率衡量了词项在全部索引中出现的频率,是一个索引中文档总数的百分比(频率越高 == 相关性越低)。最后的得分是tf-idf得分与其他因子比如(短语查询中的)词项接近度、(模糊查询中的)词项相似度等的组合
更新删除索引:
删除和更新也都是写操作。但是Elasticsearch中的文档是不可变的,因此不能被删除或者改动以展示其变更。那么,该如何删除和更新文档呢?
磁盘上的每个段都有一个相应的.del文件。当删除请求发送后,文档并没有真的被删除,而是在.del文件中被标记为删除。该文档依然能匹配查询,但是会在结果中被过滤掉。当段合并(我们将在本系列接下来的文章中讲到)时,在.del文件中被标记为删除的文档将不会被写入新段。
接下来我们看更新是如何工作的。在新的文档被创建时,Elasticsearch会为该文档指定一个版本号。当执行更新时,旧版本的文档在.del文件中被标记为删除,新版本的文档被索引到一个新段。旧版本的文档依然能匹配查询,但是会在结果中被过滤掉。
物理删除索引:当索引数据不断增长时,对应的segment也会不断的增多,查询性能可能就会下降。因此,Elasticsearch会触发segment合并的线程,把很多小的segment合并成更大的segment,然后删除小的segment,当这些标记为删除的segment不会被复制到新的索引段中。
Elasticseach查询:
Elasticseach查询分为两种,结构化查询和全文查询;
尽管统一称之为query DSL,事实上Elasticsearch中存在两种DSL:查询DSL(query DSL)和过滤DSL(filter DSL)。
查询子句和过滤子句的自然属性非常相近,但在使用目的上略有区别。
简单来讲,当执行full-text查询或查询结果依赖于相关度分值时应该使用查询DSL,当执行精确值(extac-value)查询或查询结果仅有“yes”或“no”两种结果时应该使用过滤DSL。
Filter DSL计算及过滤速度较快,且适于缓存,因此可有效提升后续查询请求的执行速度。而query DSL不仅要查找匹配的文档,还需要计算每个文件的相关度分值,因此为更重量级的查询,其查询结果不会被缓存。
不过,得益于倒排索引,一个仅返回少量文档的简单query或许比一个跨数百万文档的filter执行起来并得显得更慢。
Elasticsearch支持许多的query和filter,但最常用的也不过几种。
Filter DSL中常见的有term Filter、terms Filter、range Filter、exists and missing Filters和bool Filter。
而Query DSL中常见的有match_all、match 、multi_match及bool Query。鉴于时间关系,这里不再细述,朋友们可参考官方文档学习。
Queries用于查询上下文,而filters用于过滤上下文,不过,Elasticsearch的API也支持此二者合并运行。
组合查询可用于合并查询子句,组合过滤用于合并过滤子句,然而,Elasticsearch的使用习惯中,也常会把filter用于query上进行过滤。不过,很少有机会需要把query用于filter上的。
结构化搜索:是指查询包含内部结构的数据。日期,时间,和数字都是结构化的:它们有明确的格式给你执行逻辑操作。一般包括比较数字或日期的范围,或确定两个值哪个大。
文本也可以被结构化。一包蜡笔有不同的颜色:红色,绿色,蓝色。一篇博客可能被打上 分布式 和 搜索的标签。电子商务产品有商品统一代码(UPCs) 或其他有着严格格式的标识。
通过结构化搜索,你的查询结果始终是 是或非;是否应该属于集合。结构化搜索不关心文档的相关性或分数,它只是简单的包含或排除文档。
这必须是有意义的逻辑,一个数字不能比同一个范围中的其他数字更多。它只能包含在一个范围中,或不在其中。类似的,对于结构化文本,一个值必须相等或不等。这里没有 更匹配 的概念。
所谓的全文搜索查询通常是指在给定的文本域内部搜索指定的关键字,但搜索操作该需要真正理解查询者的目的,例如:
(1) 搜索“UK”应该返回包含“United Kingdom”的相关文档;
(2) 搜索“jump”应该返回包含“JUMP”、“jumped”、“jumps”、“jumping”甚至是“leap”的文档;
为了完成此类全文搜域的搜索,ES必须首先分析文本并将其构建成为倒排索引(inverted index),倒排索引由各文档中出现的单词列表组成,列表中的各单词不能重复且需要指向其所在的各文档。
因此,为了创建倒排索引,需要先将各文档中域的值切分为独立的单词(也称为term或token),而后将之创建为一个无重复的有序单词列表。这个过程称之为“分词(tokenization)”。
其次,为了完成此类full-text域的搜索,倒排索引中的数据还需进行“正规化(normalization)”为标准格式,才能评估其与用户搜索请求字符串的相似度。
这里的“分词”及“正规化”操作也称为“分析(analysis)”。
Analysis过程由两个步骤的操作组成:首先将文本切分为terms(词项)以适合构建倒排索引,其次将各terms正规化为标准形式以提升其“可搜索度”。这两个步骤由分析器(analyzers)完成。
一个分析器通常需要由三个组件构成:字符过滤器(Character filters)、分词器(Tokenizer)和分词过滤器(Token filters)组成。
字符过滤器:在文本被切割之前进行清理操作,例如移除HTML标签,将&替换为字符等;
分词器:将文本切分为独立的词项;简单的分词器通常是根据空白及标点符号进行切分;
分词过滤器:转换字符(如将大写转为小写)、移除词项(如移除a、an、of及the等)或者添加词项(例如,添加同义词);
Elasticsearch内置了许多字符过滤器、分词器和分词过滤器,用户可按需将它们组合成“自定义”的分析器。
与SOLR比对:
三种使用方式:
使用案例:
1)维基百科,类似百度百科,牙膏,牙膏的维基百科,全文检索,高亮,搜索推荐;
2)The Guardian(国外新闻网站),类似搜狐新闻,用户行为日志(点击,浏览,收藏,评论)+社交网络数据(对某某新闻的相关看法),数据分析,给到每篇新闻文章的作者,让他知道他的文章的公众反馈(好,坏,热门,垃圾,鄙视,崇拜);
3)Stack Overflow(国外的程序异常讨论论坛),IT问题,程序的报错,提交上去,有人会跟你讨论和回答,全文检索,搜索相关问题和答案,程序报错了,就会将报错信息粘贴到里面去,搜索有没有对应的答案;
4)GitHub(开源代码管理),搜索上千亿行代码;
5)电商网站,检索商品;
6)日志数据分析,logstash采集日志,ES进行复杂的数据分析(ELK技术,elasticsearch+logstash+kibana);
7)商品价格监控网站,用户设定某商品的价格阈值,当低于该阈值的时候,发送通知消息给用户,比如说订阅牙膏的监控,如果高露洁牙膏的家庭套装低于50块钱,就通知我,我就去买;
8)BI系统,商业智能,Business Intelligence。比如说有个大型商场集团,BI,分析一下某某区域最近3年的用户消费金额的趋势以及用户群体的组成构成,产出相关的数张报表,最近3年,每年消费金额呈现100%的增长,而且用户群体85%是高级白领,开一个新商场。ES执行数据分析和挖掘,Kibana进行数据可视化;
9)国内:站内搜索(电商,招聘,门户,等等),IT系统搜索(OA,CRM,ERP,等等),数据分析(ES热门的一个使用场景)
原文发布时间为:2018-08-22
本文作者:等待九月
本文来自云栖社区合作伙伴“我的小碗汤”,了解相关信息可以关注“我的小碗汤”。
聊聊阿里社招面试,谈谈“野生”Java程序员学习的道路
引言
很尴尬的是,这个类型的文章其实之前笔者就写过,原文章里,笔者自称LZ(也就是楼主,有人说是老子的简写,笔者只想说,这位同学你站出来,保证不打死你,-_-),原文章名称叫做《回答阿里社招面试如何准备,顺便谈谈对于Java程序猿学习当中各个阶段的建议》,首发于笔者的博客园博客,这里也郑重声明一下,所有内容类似文章均属转载或抄袭。
之前看过的朋友可能会有疑问,为什么要再次捡起这篇文章,还把称谓改成了笔者这么高端的词汇。
简单的解释一下,原因有三个,第一个原因,是说不得的原因,请各位看官自行YY。第二个原因,是两年过去了,笔者在阿里也呆了700+天的时间,所以对这篇文章,又有了一些新的理解和想法,想回过头来,再完善一下。最后一个原因,是因为最近笔者经常刷某音,根据玩某音的经验,发两次会火,哈哈,-_-。
所以,这篇文章,可以说是之前那篇文章的进阶版,为了方便大家观看,本文会引入很多原文章的内容,避免没看过上一篇文章的同学,还需要回过头去翻看。(好吧,我承认是为了偷懒,-_-)
阿里社招面试都问什么?
和之前一样,文章一上来,我们先来谈谈阿里的社招面试都问什么,其实这个话题并不是什么秘密,所有来阿里面试过的同学,都能回答一二。两年前的时候,笔者在文章里是这么回答的。
这个是让LZ最头疼的一个问题,也是群里的猿友们问的最多的一个问题。
说实话,LZ只能隐约想起并发、JVM、分布式、TCP/IP协议这些个关键字,具体的问题真的是几乎都没记住。而且就算LZ记住了,也告诉你了,你也背会了,但LZ觉得,在面试中,你被问到一模一样问题的可能性依然很小。
甚至,就算你运气好被问到了,你也照着背下来了,也不一定就能对你的面试起到正面的作用,因为面试官万一多问一句,你可能就露馅了,那还不如干脆点说不会更好。
LZ参加的是阿里的社招面试,而社招不同于校招,问题的范围其实是很随机的。因为能参加一些比较知名的互联网公司社招的人,70%以上都会有个3-5年的经验。这倒不是说一两年经验的同学没有机会进这些公司,而是因为这种公司,大部分情况下只招一些比较资深的开发和应届生,而不招那些处于中间阶段的人。而1-2年经验的同学,往往就刚好处于这个尴尬的阶段。
对于能有3-5年经验的这部分人中,每个人的经历又都不同,所擅长的点也不一样,因此这就会导致每个人的问题和范围都不太一样。
很少说有哪个知名的互联网公司,比如BAT、京东、360、搜狐、网易等这些公司,其社招面试还有固定的问题和模式,让你可以像应届生面试一样,在面试前靠临时抱佛脚度过这一关。
大部分公司在社招的时候,不光是阿里,其它公司也都一样(因为LZ在一年多前也参加过很多其它知名互联网公司的面试,详情见《记录2015年年初跳槽的经历!》),基本上都分为两个阶段的提问。
__第一个阶段是主语言本身以及它的高级特性,第二个阶段是讲述自己的项目,并在中间穿插着问题。__
所以,LZ不妨就这两个阶段,谈谈社招面试的准备,而不是去把阿里面试的过程背一遍。说实话,LZ也确实记不住,所以不要再问LZ阿里面试都会问哪些问题了,你看看上面那个连接里的文章,也会发现,LZ里面也基本上没有写具体的问题,原因是一样的,真的记不住啊。(就是因为记忆力的问题,导致LZ从小偏科,文科成绩一直堪忧,-_-)
看到当时自己的回答,笔者有种在review几年前代码的错觉,不过好在,哪怕是现在来看,当时写的虽然多了些废话,但整体思路应该还是没错的。
只不过在这里,笔者想要再补充下,如果把以上两个阶段再概括化一下,其实得到的答案,就基本适用于所有面试,而并非只是阿里的社招面试。
__那就是,第一阶段是主语言,第二阶段是项目__。
这点相信不少人在面试的过程中,已经深有体会,大部分面试就是分这么两个阶段去问的,只不过针对不同的公司和职位,每个阶段面试的难易程度会不同,所问的问题范围,自然也会有所不同。
说到面试的难易程度,不得不八卦一下,据之前笔者在网上某地方看到的评论中说,就面试的技术难度而言,BAT之间的排列顺序是这样的,阿里>百度>腾讯。
对此,笔者实际的感受倒是和上面一致,因为笔者参加过百度和阿里的面试,就个人的感觉而言,阿里的难度是高于百度的。
不过笔者说阿里的难度比百度高,其实也仅限于笔者那一次具体的面试,实际上,两家公司面试的具体难度,是不能这么简单对比的。
面试的难度,根据职位的不同(比如低级工程师还是高级),部门的不同(比如业务部门还是纯研发部门),用人需求的不同(比如是急需还是人才储备),面试官的喜好(比如是装逼型还是温和型)等等因素,就算是在同一家公司,难度也是会有差异的,所以不能简单的对比两家公司的面试难度。
到底难不难,只有来试了才知道!
所以,阿里中间件团队欢迎你!(咳咳,不要问我为啥加这句话,说不得,0-0)
阿里社招面试如何准备?
这个话题相信是大家比较关心的话题,之前笔者其实已经详细谈论过了,就这一部分内容来说,之前写的还是比较详细的,所以索性偷个懒,把原文搬上来了。
LZ会分为四个部分来谈论这个问题,由于LZ本身是Java出身,因此关于主语言的问题,都是与Java相关,其它语言的同学可以选择性忽略。此外,面试的时候一般面试官的问题都是环环相扣,逐渐深入的,这点在下面大家可以更明显的感受出来。
__1、主语言本身以及它的高级特性。__
主语言当然就是你平日里拿来赚钱的家伙。不要告诉LZ你没有主语言,你会N多种语言,或者是你精通N多种语言,你要非这么说的话,你可以来杭州试试,LZ保证不打死你,最多打残。
__ __LZ的主语言很显然是Java,那么对于Java来说,它的语言本身以及它的高级特性,都有哪些比较容易在面试中问到呢?
一般情况下,主要有以下知识点很容易被问到。(PS:以下所列举的,都是一些Java相对而言比较高级一点的知识点,因为这里谈的是社招,而不是校招)
__1)Java的数据结构相关的类实现原理,比如LinkedList,ArrayList,HashMap,TreeMap这一类的。以下简单模拟一个数据结构的连环炮。__
比如,面试官先问你HashMap是不是有序的?
你肯定回答说,不是有序的。那面试官就会继续问你,有没有有顺序的Map实现类?
你如果这个时候说不知道的话,那这个问题就到此结束了。如果你说有TreeMap和LinkedHashMap。
那么面试官接下来就可能会问你,TreeMap和LinkedHashMap是如何保证它的顺序的?
如果你回答不上来,那么到此为止。如果你依然回答上来了,那么面试官还会继续问你,你觉得它们两个哪个的有序实现比较好?
如果你依然可以回答的话,那么面试官会继续问你,你觉得还有没有比它更好或者更高效的实现方式?
如果你还能说出来的话,那么就你所说的实现方式肯定依然可以问你很多问题。
__以上就是一个面试官一步一步提问的例子。所以,如果你了解的不多,千万不要敷衍,因为可能下一个问题你就暴露了,还不如直接说不会,把这个问题结束掉,赶紧切换到你熟悉的领域。__
__2)Java并发包当中的类,它们都有哪些作用,以及它们的实现原理,这些类就是java.concurrent包下面的。与上面一样,咱们也简单的模拟一个并发包的连环炮。__
比如面试官可能会先问你,如果想实现所有的线程一起等待某个事件的发生,当某个事件发生时,所有线程一起开始往下执行的话,有什么好的办法吗?
这个时候你可能会说可以用栅栏(Java的并发包中的CyclicBarrier),那么面试官就会继续问你,你知道它的实现原理吗?
如果你继续回答的话,面试官可能会继续问你,你还知道其它的实现方式吗?
如果你还能说出很多种实现方式的话,那么继续问你,你觉得这些方式里哪个方式更好?
如果你说出来某一个方式比较好的话,面试官依然可以继续问你,那如果让你来写的话,你觉得还有比它更好的实现方式吗?
如果你这个时候依然可以说出来你自己更好的实现方式,那么面试官肯定还会揪着这个继续问你。
__为什么说面试的时候要引导面试官,原因就在这了。因为面试官的提问很多时候都是有迹可循的,你如果抓住了他的轨迹,能够猜到他下面很可能会问什么,那你在回答的时候就可以往你想要谈的方向去说。这样面试时就会显得更加从容,更加的游刃有余。__
__3)IO包和NIO包中的内容。这部分里面NIO会是重点,IO包大部分都会比较熟悉,因此可能会直接略过,直接问你NIO的内容。__
IO包和NIO包的内容相对来说不是很多,首先NIO模型要熟悉,特别是其中的selector一定要非常清楚它的职责和实现原理。其实NIO的核心是IO线程池,一定要记住这个关键点。有的时候,面试官可能也会问你IO包的设计模式(装饰器模式),为什么要这样设计?
有的面试官还会问你有没有更好的设计,这个时候如果你不知道请果断说自己现在的水平有限,想不出来更好的设计,千万不要信口开河,随意YY。
__4)Java的虚拟机的内容。这部分主要包括三部分,GC、类加载机制,以及内存。__
一个__GC部分简单的连环炮。__
__ __面试官可以先问你什么时候一个对象会被GC?
接着继续问你为什么要在这种时候对象才会被GC?
接着继续问你GC策略都有哪些分类?
你如果说出来了,继续问你这些策略分别都有什么优劣势?都适用于什么场景?
你继续说出来了以后,给你举个实际的场景,让你选择一个GC策略?
你如果选出来了,继续问你,为什么要选择这个策略?
__下面是关于类加载机制的简单连环炮。__
__ __首先肯定是先问你Java的类加载器都有哪些?
回答了这些以后,可能会问你每个类加载器都加载哪些类?
说完以后,可能会问你这些类加载之间的父子关系是怎样的?
你在回答的时候可能会提到双亲委派模型,那么可以继续问你什么是双亲委派模型?
你解释完了以后,可能会继续问你,为什么Java的类加载器要使用双亲委派模型?
你回答完以后,可能会继续问你如何自定义自己的类加载器,自己的类加载器和Java自带的类加载器关系如何处理?
__再来一个关于内存的连环炮。__
__ __首先肯定就是问你内存分为哪几部分,这些部分分别都存储哪些数据?
然后继续问你一个对象从创建到销毁都是怎么在这些部分里存活和转移的?
接着可能会问你,内存的哪些部分会参与GC的回收?
完事以后,可能还会问你Java的内存模型是怎么设计的?
你回答了以后,还会继续问你为什么要这么设计?
问完以后,还可能会让你结合内存模型的设计谈谈volatile关键字的作用?
你在谈的时候,肯定会提到可见性,那么接着可见性这三个字,还可以继续问你并发的内容。
__基本上Java语言本身以及语言稍微高级点的内容就是以上部分,如果你能把以上四部分了解的非常透彻,那基本上Java这部分就没啥问题了,因为光以上的内容就够你跟面试官聊很久了。你聊这些聊得久了,自然问你其它问题的时间就会短点。__
你从LZ写这些问题的过程也应该能感受出来,很多时候,面试官都是顺着一条线一路问下去的,如果你觉得这条线你不熟悉的话,就要及时拐弯,引导面试官去问其它方面的问题。千万不要一直往下深入,直到自己跳不出来为止,那就尴了个尬了。
2、讲述自己的项目,并在中间穿插着问题
__ __这一部分是面试过程中必问,也是聊得最久的一个阶段。除非你前面的语言部分非常扎实,扎实到面试官问了一两个小时,依旧没有探出你对语言本身的了解到底有多深。否则的话,你一定逃不过自己的项目这一关,而且一般情况下聊得时间不会太短。
__这一部分内容,一般的模式就是你自己去讲你做过的项目,然后面试官会冷不丁的让你去解释其中某一部分,比如让你解释当时为什么要这么做,或者问你现在觉得有没有更好的办法。而这些穿插的问题,大部分与你的项目所用到的技术有关。而你需要做的,就是充分、再充分的去总结自己做过的项目(尤其是最近的一两个项目),挖掘出一个甚至N个亮点,以备于到时候可以让面试官产生眼前一亮的感觉。如果你能达到这种效果的话,基本上离你成功就不远了。__
这部分内容由于和每个人自己的经历息息相关,因此这里也没法列举可能问到的问题。这篇文章《程序员面经:面试前到底该不该刷题以及面试前该如何准备》是LZ之前写的,里面大概讨论了下如何在面试前总结,有兴趣的可以去了解一下。
__3、额外的加分项__
上面两个阶段基本上是必问的,还有一些加分项。这些加分项中,有些内容面试官也会问你(比如TCP/IP协议、算法),但更多的是会先问你了解不了解,你了解的话再继续聊,不了解的话就直接略过了,不至于因为这种问题而直接把你打入地狱。
下面LZ列举一下这些加分项,如果可以的话,这些加分项还是要争取一下的。
1、计算机系统原理。
2、网络通信协议(TCP/IP,HTTP等)。
3、数据结构与算法。
4、著名开源项目的源码。
5、你自己有很棒的开源项目。
6、你的个人博客。
7、待评论区补充。
这几项当中,对于前1-3项,如果你之前就比较了解,只是由于时间问题忘记了的话,还是可以临时抱佛脚一下的。至于后面4-6项,就需要你日常的积累了,不是一时半会儿能做到的。如果你平日里没有积累,那么后面这三个加分项只能抛弃了。
__4、与你职位相关的内容__
其实这最后一项是对前面三项的补充,你应该尽量去主攻和你面试的职位相关的内容。比如你面试一个实时计算的职位,那么你的算法最好要厉害,对于著名的实时计算开源项目要熟悉,最好阅读过源码,而且还要对分布式系统有一定的见解。
因此,这个第4部分没有具体的内容,只是提醒你,如果你很明确自己的面试职位,最好在面试前准备的时候,尽量朝职位的需求方向靠拢,这样成功的可能性更大。
看完以后,关于连环炮的部分,笔者这里还是想简单再补充几句,上面之所以举了那么多连环炮的例子,其实并不是想让大家背下来,而是想让各位看官体会一下社招面试的套路。
说到底,这些连环炮的例子,就是在考验你对某一个知识点理解的有多深。就笔者的亲身经历而言,其实上面所提到的这些连环炮,你并不需要每个都理解的很深,只需要有那么一两个点比较深,甚至超过面试官的理解,就可以达到要求了。
很多时候,面试官并不需要你对每一个知识点都很深入,他只是在考察你的理解能力,以及平时有没有一些技术积累。
如果一个面试官,只因为一两个技术知识点而否决你的话,那么只有两种可能,第一种是这个点,可能确实是你所面试的职位中,非常重要的知识点,比如面试算法类岗位的话,算法不好是不行的,或者是面试偏运维类的技术岗位,Linux玩不好也是不行的。
第二种可能就是——他在装逼,-_-。
“野生”Java程序猿学习的道路
这一部分笔者上篇文章谈了很多,不过这一次,笔者在Java程序猿前面加了个限定词——野生。
笔者一向自称是“野生”程序员,所谓的“野生”,笔者这里先简单下一个定义,就是__在大学之前,从来没想过会走程序猿这条路,而是在进入社会之后,才逐渐走上程序猿这条路的人,笔者称之为“野生”程序猿__。
自学还是培训机构?
“野生”程序猿有不少程序猿“正规军”所不具备的共性,其中__最典型的一个共性,就是“野生”程序猿在进入社会之后,都会经历一个学习入门的阶段__。
也正是因此,社会上出现了大量的培训机构,所以往往“野生”程序猿在入行初期,所面临的第一个问题就是,到底是自学,还是选择培训机构?
笔者就收到过无数这类的问题,其实这个问题没办法一概而论,要具体情况具体分析,但如果简单粗暴一些来说的话,假设你家里不缺那个培训费,就去培训机构,反之就别去。
毕竟花了钱,总会多一些学习上的资源,最起码聊胜于无。
所以,这个问题通俗点说,就是__有钱就去,没钱就自学__。
就像那个经典的笑话一样,说自己买东西有选择恐惧症的同学,不是真的有选择恐惧症,唯一的原因就是——穷,呵呵哒。
算法到底重不重要?
除了上述的共性之外,__“野生”程序员还有一个共性,就是学习曲线和程序员“正规军”会有所不同,前者是从实践到理论,后者是从理论到实践__,这就会导致“野生”程序员的基本功一般不怎么扎实,比如算法、计算机系统原理、计算机网络等。
私底下,无数同学问过笔者同样的一个问题,到底算法重不重要?阿里面试考不考算法?
其实第一个问题,关于算法到底重不重要,笔者这里是有两个答案的,如果来问的同学互相对质一下的话,可能会发现笔者给每个人的答案会略有不同。
如果是一个学生来问的话,笔者会告诉他,算法非常重要,一定要全力学习。
而如果是一个已经踏入职场多年的人来问的话,笔者一般会告诉他,按需学习即可,如果你做的工作和算法关系很大,那自然要好好学,比如你做算法工程师,你告诉我算法重不重要?
当然重要!
而如果你每天写的是增删改查,更注重业务,那还是别花那个精力了,省省吧,有学算法这个精力,多研究研究业务,多思考思考技术与业务结合这种问题,可能比你学习算法收效更高。
至于第二个问题,阿里面试考不考算法,笔者清晰记得,面试官问了这样一个问题的,“你对算法的了解多不?”
而笔者当时的回答是,“不好意思,这个我不会。”
看到这里,可能有的同学会有疑问了,“作者啊,你这样做不太好,你这不等于告诉大家,算法不重要,不学算法一样可以进阿里吗?”
有这种疑问的同学,是没有想明白这么一件事,算法是否重要,和是否一定要花精力学习它,并没有什么直接的卵关系。
更何况,不会算法能进阿里也很正常,难道你觉得阿里万千工程师,都是熟悉算法的吗?我敢说,你敢信吗?
还有不少人有一个误区,那就是,“算法好的人,工资都高了不少。”
关于这个,笔者只想说,如果这个人本身就是搞算法类工作的,那无可厚非,但是如果他是搞增删改查的,笔者可以很确定的说,他学算法这个时间去学点别的,工资可能会更高。
所以,不要被这个表象迷惑了,他高工资本质是因为他业余时间学习了才高,而不是因为学习了算法才高。
__俗话说学以致用,不光花钱要花到刀刃上,学习也是要学到刀刃上的,因为时间比金钱更珍贵__。
当然,以上所说对于算法要按需学习的论调,仅适合于毕业多年,已经进入职场的同学,如果你是一个在校生,那么对于算法这个东西,就只有一个字——学!往死里学!
“野生”Java程序员如何学习
扯完了家常,咱们聊点正事,“野生”程序员,如何度过自己的学习和职场生涯。关于这个话题,笔者会引用一下上一篇文章中的内容,但是两年过去了,笔者会对其中再做一些补充。接下来,我们首先看一下之前笔者所写的前奏。
这一部分其实也算是今天的重点,这一部分用来回答很多群里的朋友所问过的问题,那就是LZ你是如何学习Java的,能不能给点建议?
今天LZ是打算来点干货,因此咱们就不说一些学习方法和技巧了,直接来谈每个阶段要学习的内容甚至是一些书籍。这一部分的内容,同样适用于一些希望转行到Java的同学。
在大家看之前,LZ要先声明两点。
1、由于LZ本人是Java后端开发出身,因此所推荐的学习内容是Java Web和Java后端开发的路线,非Java Web和Java后端开发的同学请适当参考其学习思想即可,切勿照搬。
2、下面对于【第一部分】的推荐内容,目的是让你尽快成为一个可以参加工作的Java开发者,更适用于处于待业状态,准备转行Java的同学。如果你是在校学生,务必要在学好基础(比如计算机系统、算法、编译原理等等)的前提下,再考虑去进行下面的学习。
其实这段前奏中,笔者第2点中所说的“处于待业状态,准备转行Java的同学”,就是今天一直提到的“野生”程序员。
笔者这里专门提到这点,也是希望看官们可以明白,本文所有内容,都是围绕着“野生”程序员展开的,如果你不属于其中的一员,那么一定要对文中提到的学习道路自行取舍。
哪怕是“野生”程序员,也不一定就非要完全照搬文中的学习,也要有自己的思考。
第一阶段——未参加工作的同学
这个阶段,其实就是上面笔者提到过的,是“野生”程序员学习入门的阶段。大部分人在这个阶段学习的时候,都是非常痛苦的,所谓万事开头难,是有一定道理的。
不过没关系,谁让你运气好,看到了这篇文章呢(吹逼会不会遭雷劈?),你只需要保持学习的信念,然后按照下面的思路去学习就可以了。
强调一下,对于程序员来说,心中那股信念很重要,你要问笔者这股信念是什么,笔者只能说只可意会不可言传,自己在职场生涯中慢慢体会吧。
一、Java基础
首先去找一个Java的基础教程学一下,这里可以推荐一个地址,或者你也可以参照这个地址上去找相应的视频,地址为http://www.runoob.com/java/java-tutorial.html。
学习Java基础的时候,应该尽量多动手,很多时候,你想当然的事情,等你写出来运行一下,你就会发现不是这么回事儿,不信你就试试。
学完以上内容以后,你应该对Java有一个基本的了解了,你可以用Java语言写出一些简单的程序,并且你用的是最简单的编辑器,比如记事本。
这个时候,不要急于进入下一部分,留下几天好好写一些程序,尽可能熟悉这些基础内容。
__二、Web开发__
等你写上几天程序以后,你往往会比较迷茫,因为你写的东西似乎看起来毫无用处,比如实现一个简单的计算器,读取一个文件等。这个时候你就应该去学着写一些让你觉得有意思的东西了,所以你应该学习更多的知识。
这些内容主要是Web开发相关的内容,包括HTML/CSS/JS(前端页面)、Servlet/JSP(J2EE)以及Mysql(数据库)相关的知识。
它们的学习顺序应该是从前到后,因此最先学习的应该是HTML/CSS/JS(前端页面),这部分内容你可以去上面的那个runoob网站上找。你可以试着自己写一些页面,当然,你可以尽你最大的努力让它变得最漂亮。这部分内容对于后端Java来说,理论上不是特别重要,但至少要达到可以自己写出一些简单页面的水平。
接下来,你需要学习的是Servlet/JSP(J2EE)部分,这部分是Java后端开发必须非常精通的部分,因此这部分是这三部分中最需要花精力的,而且这个时候,你要学会使用开发工具,而不能再使用记事本了,可以选择eclipse。
当你下载安装好eclipse以后,请视频中的教程一步一步去学习,一定要多动手。关于Servlet/Jsp部分视频的选择,业界比较认可马士兵的视频,因此推荐给大家。当然了,LZ本人并没有看过他的视频,所以不好说的太绝对,如果大家自己有更好的选择,可以坚持自己的,不要被LZ干扰。
原本LZ也是打算出教学视频的,但是由于时间问题,还是决定放弃了。但是如果你看视频的过程中遇到了问题,欢迎来LZ的交流群提问,或者去斗鱼观看LZ的直播提出你的问题,直播地址和群号都在LZ的个人博客左侧。
最后一步,你需要学会使用数据库,mysql是个不错的入门选择,而且Java领域里主流的关系型数据库就是mysql。这部分一般在你学习Servlet/Jsp的时候,就会接触到的,其中的JDBC部分就是数据库相关的部分。你不仅要学会使用JDBC操作数据库,还要学会使用数据库客户端工具,比如navicat,sqlyog,二选一即可。
__三、开发框架__
当你学会以上内容以后,这个时候你还不足以参加工作,你还需要继续深造。公司里为了提高开发的效率,会使用一些Java Web框架,因此你还需要学习一些开发框架。
目前比较主流的是SSM框架,即spring、springmvc、mybatis。你需要学会这三个框架的搭建,并用它们做出一个简单的增删改查的Web项目。你可以不理解那些配置都是什么含义,以及为什么要这么做,这些留着后面你去了解。但你一定要可以快速的利用它们三个搭建出一个Web框架,你可以记录下你第一次搭建的过程,相信我,你一定会用到的。
还要提一句的是,你在搭建SSM的过程中,可能会经常接触到一个叫maven的工具。这个工具也是你以后工作当中几乎是必须要使用的工具,所以你在搭建SSM的过程中,也可以顺便了解一下maven的知识。在你目前这个阶段,你只需要在网络上了解一下maven基本的使用方法即可,一些高端的用法随着你工作经验的增加,会逐渐接触到的。
关于学习SSM框架的地址给大家推荐一个,这里面有视频,大家可以去观看,地址是http://edu.51cto.com/lesson/id-76468.html。
__四、找工作__
当你完成开发框架的学习以后,你就该找工作了,在校的找实习,毕业的找全职。与此同时,在找工作的同时,你不应该停下你的学习,准确的说,是你在以后都不能停下学习。
上面这些内容你只是囫囵吞枣的学会了使用,你可以逐步尝试着去了解更多的东西,网络是你最重要的老师。
两年过去了,其实这个学习路线,并没有什么太大的变化,唯一变化的点,就是spring-boot的普及,省去了之前很多框架整合的工作。回想11年笔者培训那会儿,想要搭建一个SSH框架,还要自己梳理jar包,整合一大堆配置,一不小心就各种报错,而且那异常往往都不是简单的NPE,甭提多苦逼了。所以,同学们,珍惜你现在的生活吧,呵呵哒。
第二阶段——工作0到1年的同学
这个阶段是所有人都会经历的一个阶段,这个阶段的程序员,心里往往都是非常复杂的,刚找到工作,坐在明亮的办公室里,仿佛自己成为了电视剧中的主角,难免会感到意气风发,但是同时心中又不免会有些恐惧,生怕自己一个不小心,再次被打回原形。
如果你有这样的感觉,不用紧张,这是所有人都要经历的,你要做的,就是让自己彻底沉浸在工作和学习当中即可,原因很简单,因为这个时候——你还是单身狗,-_-。
恭喜你,这个时候,你已经拥有了一份Java的工作。这个阶段是你成长极快的阶段,而且你可能会经常加班。
但是加班不代表你就可以松懈了,永远记得LZ说的那句话,从你入行那一刻起,你就要不停的学习。在这一年里,你至少需要看完《Java编程思想》这本书。这本书的内容是帮助你对于Java有一个更加深入的了解,是Java基础的升级版。
这本书很厚,当初看这本书,LZ花了整整三个月。正常速度的话,应该可以在半年左右看完。LZ这里不要求过高,只要你在一年以内把这本书看完即可。当然了,LZ所说的看完,是充分吸收,而不是读一遍就完事了,因此有些内容你可能会看不止一遍。
总而言之,这个阶段的核心学习思想就是,在工作中实践,并且更加深入的了解Java基础。
补充一下,看书的时候,不要只是看书,一定要经常思考,比如思考你所写的代码,和书中的内容是否有联系。
举个实际的例子,当你看到static这一部分内容的时候,你是否会去翻一下你现在开发的项目里,是否有地方使用static,它使用的目的是什么,它使用的方式是否正确。
只有这样看书,你才能真正的把书看进去,一定要注意,看书的最终目的是为了引发自己的思考,只看书不思考的话,那叫背书,不叫看书。说到这里,有不少同学问过笔者这样的一个问题,“我看书看不进去怎么办呢?有没有什么好的办法?”
笔者这里可以很负责的告诉你,哪有什么岁月静好,只是有人替你负重前行而已。
所以,不要期望有什么开开心心,快快乐乐就把书给看了的办法,你想的倒还挺美,呵呵哒。
这玩意儿没有什么好办法,就是靠着自己内心的一股信念,强迫自己去看,特别是刚开始的时候,是最困难的,熬过那一段时间,后面看起来相对来说会顺畅很多。
万事开头难,用在看书学习上,也同样适用。
第三阶段——工作1到2年的同学
这个阶段的你一般已经做了一年的增删改查,与刚入职时的意气风发不同,这个时候的你,会开始考虑你未来要走的路,但通常在这个时候,你很难看清前方的路,因此你或许会有些焦虑。
如果你存在这样的焦虑,不必忧心,只需记得,在程序员的道路上,学习能使你变得更加充实,继续沉浸在学习的海洋中吧。
这部分时间段的同学,已经对Java有了一个更加深入的了解。但是对于面向对象的体会可能还不够深刻,编程的时候还停留在完成功能的层次,很少会去考虑设计的问题。
于是这个时候,设计模式就来了。LZ当时看的是《大话设计模式》这本书,并且写了完整版的设计模式博客。因此,LZ要求大家,最多在你工作一年的时候,必须开始写博客,而设计模式就是你博客的开端。
请记住,LZ所提的基本都是最低要求,因此不要有任何松懈的心理,否则五年后,你不要去羡慕别人高于你的工资,也不要去羡慕别人进入了某公司。
这一年,你必须对于设计模式了如指掌,《大话设计模式》可以作为你的开端。当然了,你也可以去看LZ的个人博客去学习,地址是http://www.cnblogs.com/zuoxiaolong/p/pattern26.html。
此外,设计模式并不是你这一年唯一的任务,你还需要看一些关于代码编写优化的书。比如《重构 改善既有代码的设计》,《effective java》。
总而言之,这个阶段,你的核心任务就是提高你的代码能力,要能写出一手优雅的代码。
这个阶段笔者所建议的三本书,其实都是在教你如何更好的编写和设计你的代码,除此之外,设计模式这个系列,也是在锻炼你对问题的抽象能力。
使用Java这种面向对象的语言,抽象能力是非常重要的一项能力,和上面一样,笔者建议,当你看完设计模式、重构和Effective Java这几本书后,一定要结合自己的项目,做深入的思考。
不思考的人生是不完整的,只干活儿不动脑子的人,看似勤奋,实际就是台机器,既然是机器,那就早晚会被取代的。
只有不断思考,总结过往,指导未来的人,才最终会成为这个社会的主导者。
第四阶段——工作2到3年的同学
这个阶段,对于程序员来说,是非常重要的一个阶段。在笔者的学习道路规划中,这个阶段学习的目的,是为了让你从初中级工程师迈入高级,实现质的提升,因此,这一部分的学习,难度会比之前两年的要高。
但既然你已经踏上了这条路,就没有回旋的余地,只能往前冲。
所以,做好心理准备,迎接挑战吧。
有的同学在这个时候觉得自己已经很牛逼了,于是忍不住开始慢慢松懈。请记住,你还嫩的多。
这个阶段,有一本书是你必须看的,它叫做《深入理解Java虚拟机》。这本书绝对是Java开发者最重要的书,没有之一。在LZ眼里,这本书的重要性还要高于《Java编程思想》。
这本书的内容是帮助你全面的了解Java虚拟机,在这个阶段,你一定已经知道Java是运行在JVM之上的。所以,对于JVM,你没有任何理由不了解它。LZ之前有写过JVM系列的知识,可以去看一下,地址是http://www.cnblogs.com/zuoxiaolong/category/508918.html。
另外,在过去2年的工作当中,你肯定或多或少接触过并发。这个时候,你应该去更加深入的了解并发相关的知识,而这部分内容,LZ比较推荐《Java并发编程实战》这本书。只要你把这本书啃下来了,并发的部分基本已经了解了十之六七。
与此同时,这个阶段你要做的事情还远不止如此。这个时候,你应该对于你所使用的框架应该有了更深入的了解,对于Java的类库也有了更深入的了解。因此,你需要去看一些JDK中的类的源码,也包括你所使用的框架的源码。
这些源码能看懂的前提是,你必须对设计模式非常了解。否则的话,你看源码的过程中,永远会有这样那样的疑问,这段代码为什么要这么写?为什么要定义这个接口,它看起来好像很多余?
由此也可以看出,这些学习的过程是环环相扣的,如果你任何一个阶段拉下来了,那么你就真的跟不上了,或者说是一步慢步步慢。而且LZ很负责的告诉你,LZ在这个阶段的时候,所学习的东西远多于这里所罗列出来的。因此千万不要觉得你已经学的很多了,LZ所说的这些都只是最低要求,不光是LZ,很多人在这个时间段所学习的内容都远超本文的范围。
如果你不能跟上节奏的话,若干年后,如果不是程序猿市场还不错的话,你很可能不仅仅是工资比别人低,公司没别人好,而是根本就找不到工作。
总而言之,这个阶段,你需要做的是深入了解Java底层和Java类库(比如并发那本书就是Java并发包java.concurrent的内容),也就是JVM和JDK的相关内容。而且还要更深入的去了解你所使用的框架,方式比较推荐看源码或者看官方文档。
另外,还有一种学习的方式,在2年这个阶段,也应该启用了,那就是造轮子。
不要听信那套“不要重复造轮子”的论调,那是公司为了节省时间成本编造出来的。重复造轮子或许对别人没有价值,因为你造的轮子可能早就有了,而且一般情况下你造出来的轮子还没有现存的好。但是对别人没有价值,不代表对你自己没有价值。
一个造轮子的过程,是一个从无到有的过程。这个过程可以对你进行系统的锻炼,它不仅考察你的编码能力,还考察你的框架设计能力,你需要让你的轮子拥有足够好的扩展性、健壮性。
而且在造轮子的过程中,你会遇到各种各样的难题,这些难题往往又是你学习的契机。当你把轮子造好的时候,你一定会发现,其实你自己收获了很多。
所以,这个阶段,除了上面提到的了解JVM、JDK和框架源码以外,也请你根据别人优秀的源码,去造一个任何你能够想象出来的轮子。
可以看到,这个阶段笔者列的任务非常之多,不仅要了解JVM、并发、JDK类库,还要自己尝试造轮子。
如果你仔细阅读了本文的话,你会发现,阿里社招面试笔者所举的连环炮中,有一大部分都是这个阶段学习的,那些连环炮中,基本上都是JVM、并发和JDK一些类库的内容。
而比较巧的是,阿里大部分招聘要求的年限,都是3年或以上。这意味着什么?
相信反应快的同学已经明白了,你如果可以在3年内,完成笔者的学习计划的话,那么在你满3年的时候,刚好可以来阿里检验你的学习成果。
所以,阿里中间件欢迎你!(没有违和感的植入两次,今年我要3.75了,-_-)
第五阶段——工作3到4年的同学
这个阶段的同学,很多已经碰到了天花板,在此之前,只要你按部就班的学习,智商又没啥硬伤,90%以上的同学(有人问,剩下的10%呢?笔者只想说,我怎么知道?/尴尬),在工作3年的时候,都可以达到年薪30W左右这个范围(仅指2015年或以后北上深一线城市)。
而如果你的年薪想要更上一层楼(一般10W为一档,比如40W、50W等),仅靠之前的积累是远远不够的,你需要打造你的核心竞争力,在之前的文章里,笔者把这个所谓的核心竞争力,称之为差异性,其实想表达的意思都是一样的。
具体如何在这个阶段学习,还是先看看之前笔者是怎么建议的吧。
这个阶段的同学,提升已经是很难了,而且这个阶段的学习往往会比较多样化。
因为在前3年的过程中,你肯定或多或少接触过一些其它的技术,比如大数据、分布式缓存、分布式消息服务、分布式计算、软负载均衡等等。这些技术,你能精通任何一项,都将是你未来面试时巨大的优势,因此如果你对某一项技术感兴趣的话,这个时候可以深入去研究一下。这项技术不一定是你工作所用到的,但一定是相关的。
而且在研究一门新技术时,切忌朝三暮四。有的同学今天去整整大数据,搞搞Hadoop、hbase一类的东西。过不了一段时间,就觉得没意思,又去研究分布式缓存,比如redis。然后又过不了一段时间,又去研究分布式计算,比如整整Mapreduce或者storm。
结果到最后,搞得自己好像什么都会一样,在简历上大言不惭的写上大数据、分布式缓存、分布式计算都了解,其实任何一个都只是浮于表面。到时候面试官随便一问,就把你给识破了。
一定要记住,作为一个程序猿,平日里所接触的技术可能会很多,但是想要让一门技术成为你的优势,那么一定是你对这门技术的了解强过绝大多数人才行。
因此在这个阶段,你就不能再简单的去学习前3年的内容了,虽然前面的学习如果还不够深入的话依旧要继续,但这个时候你应该更多的考虑建立你的优势,也可以称为差异性。
差异性相信不难理解,就是让你自己变得与众不同。你前面三年的学习足够你成为一名基本合格的Java开发者,但你离成为一名优秀的Java开发者还有很大的距离。
所谓优秀,即能别人所不能。而你前三年所学习的内容,是很多做过几年的Java开发都能够掌握的。那么为了让自己有差异性,你就需要另辟蹊径,找一个方向深入研究下去,以期在将来,你能够成为这个领域的专家,比如分布式计算领域的专家,大数据领域的专家,并发领域的专家等等。
此外,你除了建立你的差异性之外,还要去弥补你基础上的不足,直到现在,LZ都没有提及基础知识。原因是基础是很枯燥无味的,学的太早不仅容易懵逼,而且懵逼的同时还容易产生心理阴影,以至于以后再不想去研究这些基础。但基础又是你深入研究一些领域时所必须掌握的,比如你去研究分布式计算,你不懂算法你玩个毛毛?比如你去做分布式缓存,你对计算机系统的内存不了解,你如何去做缓存?
如果你的基础本来就非常强,那么恭喜你,相信你在之前的工作中已经充分体会到了这些基础对你的帮助。但LZ相信大部分人的基础都很薄弱,哪怕是科班毕业的人,很多人也不敢说自己当初的基础学的多么强大,比如算法、计算机系统原理、编译原理这些。
但是每个人时间都是有限的,而且这些基础的书籍每一本读下来,没个一年半载的,还真拿不下来,因此还是要有所抉择的。虽然艺多不压身,但问题是艺多是有代价的,是需要你付出时间和精力的,而LZ个人更赞成在同等代价的情况下获取最大的收获。
首先,LZ比较推崇的基础书籍有三本,分别是《深入理解计算机系统》,《tcp/ip详解 卷一、二、三》,《数据结构与算法》。其中TCP/IP有三本书,但我们这里把这三本看成是一本大书。
这三本分别适合三种人,《深入理解计算机系统》比较适合一直从事Java Web开发和APP后端开发工作的人群。《tcp/ip详解 卷一、二、三》比较适合做网络编程的人群,比如你使用netty去开发的话,那么就要对TCP/IP有更深入的了解。而《数据结构与算法》这本书,则比较适合做计算研究工作的人,比如刚才提到的分布式计算。
另外,LZ要强调的是,这里所说的适合,并不是其它两本对你就没有用。比如你做Java Web和APP后端开发,《tcp/ip详解 卷一、二、三》这本书对你的作用也是很大的。这里只是分出个主次关系而已,你要是时间足够的话,能把三本都精读那当然最好不过了。但如果时间有限的话,那么就先挑对你帮助最大的书去读。
理论上来讲,这一年你能把这三本其中一本精读下来,就已经非常厉害了。有了基础,有了前面的工作经验,你就可以去开拓属于你的领域了。
在这一年里,一定要规划好自己的领域,建立好自己的优势,制造出差异性。如果你对自己的领域不够清晰的话,随着你工作的时间日益增多,你接触的技术会越来越多,这个时候,你很容易被淹死在技术的海洋里,看似接触的技术越来越多,会用的也越来越多,但你毫无优势。
有的同学可能会问,“LZ,我也不知道我的领域是什么啊?怎么办呢?”
对于这种人,LZ只想说,“卧槽,这还问我?要不干脆我替你学习得了,好不好?”
可以看到,在这个阶段,笔者提到了三本基础书籍(操作系统原理、网络协议、算法),这三本书,会让你更加的接近底层。
如果你仔细品味本文所提到的学习路线,你会注意到,笔者一直在让你由浅入深的学习,也就是__一直在让你提高知识的深度,而不是知识的广度__。
这就回答了不少同学问过笔者的那个问题,“到底是先有广度后有深度好,还是先有深度后有广度好?”
首先,很多人在思考这个问题的时候,有一个误区,那就是一直在纠结这个问题本身,有的说学习要先学深了,才好提升自己的广度,而有的却说,学习要先了解更多,开阔眼界,才能更好的提升自己的深度。其实,这种讨论已经本末倒置了,回答这个问题很简单,看市场上需要哪一类,就是哪个好。
所以,把上面那个问题换一下,你就很容易得到答案了,“如果让你来面试一个5年经验以下的程序员,你喜欢在某个领域研究很深的人,还是每个都懂点的人?”
答案是显而易见的,笔者相信大部分人,都会选择在某个领域有深度钻研的人,特别是一些一二线的互联网公司。
或许有的同学在这个时候,会用“全栈工程师”这个概念来试图反驳,毕竟全栈工程师这个概念,有一段时间被炒得很热,很多公司的招聘上都加了这么一条——全栈工程师优先。
全栈工程师这个概念,其实是小公司(或者是大公司的小部门)为了节省人力成本,想让程序员干杂活,却又不好意思直说,因此所编造出来得美丽的谎言,可笑可悲的是,一些不知全栈真正含义的程序员,还以自己是全栈为荣,觉得自己跟上了潮流,真的是被人卖了还在帮人数钱。
笔者在这里可以很负责的说,初入职场的头几年,一定是以提高深度为主才是正道,像全栈工程师这种潮流,就如同最近一些采用非常规手段出名的网红一般,注定只是昙花一现,只有一技傍身,才是长久之计。
第六阶段——工作4到5年的同学
4到5年其实也是一个比较重要的阶段,咱们先来看看,两年前,笔者是怎么来讨论这个阶段的。
经过前面一年的历练,相信你在自己所钻研的领域已经有了自己一定的见解,这个时候,技术上你应该已经遇到瓶颈了。
这个时候不要着急提高自己的技术,已经是时候提高你的影响力了,你可以尝试去一些知名的公司去提高你的背景,你可以发表一些文章去影响更多的人。当然,你也可以去Github创建一个属于你的开源项目,去打造自己的产品。这次的开源项目不同于之前的造轮子,你这个时候是真的要去尽量尝试造出来真正对别人有价值的轮子。
技术学到这个阶段,很容易遇到瓶颈,而且往往达到一定程度后,你再深入下去的收效就真的微乎其微了,除非你是专门搞学术研究的。然而很可惜,大部分程序猿做不到这一步,那是科学家做的事情。
这个时候提高影响力不仅仅是因为技术上容易遇到瓶颈,更多的是影响力可以给你创造更多的机会。程序猿在某种程度上和明星很像,一个好的电视剧和电影就可以成就一批明星,程序猿有的时候也是,一个好的项目就可以成就一群程序猿。
比如国内几个脍炙人口的项目,像淘宝、支付宝、QQ、百度、微信等等。这每一个项目,都成就了一批程序猿。LZ敢说,这里面任何一个项目,如果你是它的核心开发,光是这样一个Title,就已经是你非常大的优势。更何况还不止如此,Title说到底也是个名头,更重要的是,这种项目在做的时候,对你的历练一定也是非常给力的。
而你如果想要参与这样的项目,除了靠运气之外,影响力也是很重要的一个手段。比如你在分布式计算领域有一定的影响力,那么如果有什么好的关于分布式计算的项目,对方就很可能会邀请你。就算人家不邀请你,你自己主动去面试的时候,对方如果知道你在这个领域的影响力,也肯定会起到很大的作用,而这个作用,甚至可能会超过你现在的技术能力。
所以,在这个阶段,你最大的任务是提高自己的影响力,为自己未来的十年工作生涯那一天做准备。如果你能够靠你的影响力和以前积累的技术,参与到一个伟大的项目当中,那么你后面的五年也就有着落了。
当然了,LZ现在满打满算,做程序猿也就4年半不到,因此关于4年到5年这一部分,LZ的见解不一定是对的,就算是对的,也不一定是适合任何人的。所以,希望大家自己有的判断力,去决定到底该如何度过这一年。
从引文中最后一段可以看出,笔者当初写的时候,才工作不到4年半,所以当时笔者也是处于一个摸索的阶段。
如今两年过去了,其实现在来看,到了这个阶段,笔者已经很难再提出有效的建议了。
如果你仔细阅读了本文,会注意到,在前3年的时候,笔者建议的学习道路都是一样的,因为笔者没有给出任何选择的余地,就按照笔者所罗列的去学就可以了。
但是从第3年开始,也就是第3到4年的时候,笔者所给的建议当中,已经出现了选择,比如操作系统原理、网络协议、算法这三本书,再比如你准备钻研的领域,都是在让你自己选择,而不是笔者直接告诉你,应该看哪本书,钻研哪个领域。
这其实是符合常规的学习道路的,初中级工程师的时候,大家学的都一样,3年过去,进阶为高级工程师以后,自然每个人会走向不同的领域。
就和上学一样,小的时候学的都差不多,高中就开始分文理班了,大学就开始选专业了,到了研究生......
额,忽然想起没上过研究生,不太清楚,但学习的道路肯定更加细分了,对不对?
所以,在4到5年这个阶段,其实同样没有固定的道路可走,之前之所以建议大家提高“影响力”,其实现在笔者自己回想起来,其中深层次的原因,是希望大家去一些知名的公司,比如......咳咳.......你懂的(这次完美的暗示,感觉要个4不过分)。
其实在第3-5年这段期间,最好的选择,就是一边提高自己的核心竞争力,一边着手开始进入一家可以“洗白”的公司,或者说是可以提高“影响力”的公司。
什么叫“洗白”?
作为一个“野生”程序员,你通常没有华丽的学历,你能仰仗的,只有自己的实力,这在你做程序员,包括做一些中低层技术管理者的时候,并不会特别阻碍你的发展。
但是当你想往上爬的时候,也就是做高层技术管理者的时候,你没有一定的背景,就算你实力再牛逼,也是无济于事的,这就是笔者所说的“影响力”,其实也可以叫“信服力”。
你听说过哪个公司的CTO或者是技术总监,是没什么学历,也没进过任何大公司,一穷二白的野书生吗?
可能有的人这个时候会举手发言了,“作者你说的不对啊,我见过这样的人啊!啥学历没有,啥大公司没进过,但人家就是CTO,老厉害了呢。”
这只有两种情况,第一种,你说的这个人太厉害,不在本文讨论范围内,呵呵哒,第二种,这个CTO,是一个披着项目经理的皮,管着十人二十人的假CTO,因为公司一共就这么点人,-_-。
总而言之,言而总之,说了这么多,“洗白”的意思就是,在学历不够亮眼的情况下,就想办法提高一下自己的公司背景吧。
最起码,如果哪一天,你真的坐上了CTO的位置,你的简介里可以加这么一句话,“曾就职于某著名XXXX公司,任XXX职位。”
是不是感觉多了一些信服力呢?
所以,还是那句话,阿里中间件欢迎你!5年了,同学,你该回家了!(老板,今年我要5,-_-)
第七阶段——工作5年以上的同学
这一部分之前的文章是没有的,因为那时候笔者自己工作还不到5年。对于这个阶段的同学来说,与5年前初入职场相比,除了工作上的不同以外,最大的可能是来自于生活上的变化。
所以,这个阶段,咱们不谈工作,不谈学习道路,咱们来谈谈生活。5年前,你可能还是单身狗,你自由,你拼搏,你各种跳槽,你四处流浪,但是5年过去了,你恐怕已经结婚,甚至孩子都有了,这个时候的你,不得不考虑一些现实问题。
买车?买房?落户?
这每一项,都像一座大山一样,压在奋斗在一线城市的上班族身上。特别是买房这件事,哪怕你此时已经年薪50W,在一线城市,买房依旧是非常困难。
因为50W扣掉各种乱七八糟,估计得缩水15W,等于是到手只有35W左右了,再加上你的花销,一年能存20W算是非常不错了,而一线的一套房子,首付基本上最少的都要上百万(也就是总价300W,这已经是一线的白菜价了),这都要存5年才够,更何况有多少人在这个时候,年薪还不到50W。
再者说,你敢保证这5年房价不涨?你敢保证这5年你一次都没有大的花销?
有的同学可能要举手说话了,“我爸妈已经给我在北京2环买好房子了呀。”
那笔者只能说,“这位同学,请你出去!呵呵哒......”
咱们这里讨论的,主要是非二代同学,关于二代同学们,笔者给你的建议只有一个,吃好玩好就行,就别出来抢饭碗了,-_-。
好了,言归正传,买房其实只是第一大难关,其它城市笔者不知道,但是在北京,落户比买房还要困难,基本可以说是无路可走,虽说最近出了个积分落户,但怎么看都是中看不中用。
当然,因为笔者早就逃离北京,所以对这个政策没有细研究,有兴趣的同学可以自行去这个地址研究下,看你有没有落户的希望,呵呵哒。
说到这里,笔者不得不提到之前写的一篇文章,题目叫做《程序员们,再不行动就来不及了!》,其实讲的就是程序员的安家之道。
具体的这里就不再具体详述了,有兴趣的同学可以自行去看,这里只是引用一下文中的一句话——__一线城市奋斗攒钱,二线城市安居乐业__。
一句话已经道出了程序员的最终归宿,而在二线城市中,目前最合适的,杭州就是其中之一。
杭州的互联网行业相当发达,工资不比一线的低多少,甚至还可能会更高,但是房子均价却是一线的一半都不到,再加上杭州风景怡人,这样的城市,绝对是最适合在外拼搏的“野生”程序员,安居乐业的好地方。而从一线转往杭州,总需要一个公司来过渡,那这个最合适的公司也自不用说,咳咳.......你懂的.......(毫无违和感的植入,-_-)
而其他知名互联网公司,大部分都在北上深,就算工资高些,但是从生活压力,和幸福感上来说,相信和杭州这样的宜居城市,是没办法相提并论的。
5年了,5年的奋斗是为了什么?或许在你初入职场的时候,你意气风发,你要改变世界,但是当你结婚生子以后,你会发现,在你改变世界之前,你要先安居乐业,-_-。
所以,还是那句话,咳咳......
阿里中间件欢迎你!
“野生”Java程序员学习道路小结
其实纵观笔者今天所讲的,就是“野生”Java程序员,如何通过学习和努力,进入阿里,并且在杭州买房落户的道路。
是的,这个学习道路的终点,不是帮助你成为技术大牛,而是教你安居乐业。
毕竟咱们在外奋斗,不就是想在大城市扎根安家吗?
至于当初改变世界的梦想,等你把生活安顿好了以后,再去谈改变世界也不晚。
当然了,有一点要强调一下,关于学习的那一部分(也就是前4年),是相对来说比较通用的,基本上所有的Java学习者,都可以适当参考一下笔者当时的学习路线,甚至在极端情况下,照搬也不无不可。(免责声明:学成啥样,作者概不负责,-_-)
但是,对于安家落户的这一部分(也就是4年后),可能并不适用于所有人,比如有的人老家就是深圳这种一线城市的,那自然没有必要来杭州了,毕竟深圳也有阿里中心嘛,-_-。
因此,在工作的前面几年,你可以按照笔者的学习道路去走,但是当你工作到3-4年这个阶段的时候(又或者是你讨到老婆的时候,-_-),一边工作学习,一边你也要规划一下,你未来要去哪个城市安家,进哪家公司。
认准目标以后,你就要好好研究一下这个城市的房价、购房政策、落户政策等,也要研究一下这个公司面试,都倾向于哪方面(比如本文第一部分的内容,-_-),然后等钱存的差不多以后......
好了,之所以后面用省略号,是怕你们现在的老板看到以后,来杭州找我拼命,但是我相信你们看懂了,-_-。
文末划重点
写到现在,整篇文章算是完成了10%,虽然之前已经写了2W多字,但本文最重要的,是在末尾的这一小段文字。
那就是——广告!
咳咳......就是这么直接......为了弥补,最末尾准备了双彩蛋,-_-。老板说了,评论或者转发数超过1W,今年直接打5,明年直接连升两级,-_-。
反正你是老板,你说啥都对咯,1W......呵呵哒......
咳......说正经的,前不久,笔者给我们的产品开发了一个新功能,虽说这个功能不大,但是它是有划时代意义的一个feature,意味着凡是基于SpringCloud或者ServiceMesh开发的应用,从此在任意一台机器上,都可以轻松的接入EDAS。
就因为这个feature,笔者还有幸成为了云栖大会的演讲嘉宾,上去狠狠的装了一把,/偷笑。
这个feature到底是什么?
热烈欢迎你到这个地址来亲自体验一下,只需要几分钟噢,https://help.aliyun.com/document_detail/72618.html。
什么?你连EDAS都还没听说过?
你真的out了,-_-,EDAS(Enterprise Distributed Application Service)是阿里巴巴中间件团队研发的 PaaS 平台,专门为企业提供高可用和分布式的互联网架构解决方案,赶快到这个地址了解一下吧,https://www.aliyun.com/product/edas。
文末双彩蛋
2W多字的文章,能看到现在的,应该是真爱了。(假装不知道你直接跳到彩蛋,-_-)
多的不说了,献歌一首,《程序员版一人饮酒醉》,/偷笑,https://kg2.qq.com/node/play?s=lW1J2-lrkrR3klvD&shareuid=619598862d2a31893d&topsource。
最后,再附上当时云栖上的宣传照一张,不过要你们自己找,/偷笑,https://yunqi.aliyun.com/2018/shanghai/guest。
我的诚意已经送上,明年能不能升职加薪(迎娶白富美是没戏了),就看你们了,-_-。
诚邀您关注阿里中间件微信公众号!我们懂您的胃口:定期分享最前沿技术干货!我们懂您的喜好:大量精品大会、沙龙、比赛为您量身定做!我们懂您的情调:海量惊喜奖品随时放送!你还不来加入我们吗?就现在!最in的程序圈子,由您创造!