使用netbeans来开发django应用 – 求贤若渴, 礼贤下士 – ITeye技术网站

第一步,首先是下载python版本的netbeans6.5,由于我使用的是ubuntu8.04,所以下载地址为:

第二步,安装netbeans,这个没有什么好说的。安装完成之后,启动netbeans会看到工程里面的中文都变成了方框。google之,得知是jdk中缺少netbeans需要的中文字体。


继续阅读使用netbeans来开发django应用 – 求贤若渴, 礼贤下士 – ITeye技术网站

Emacs使用教程(八)

查找替换是任何编辑器都不可能缺少的功能,就连小小的Notepad都有快速查找,更不用说像Emacs这样的庞然大物了。其重要性这里就不多说了,接下来将一步一步给你介绍如何在Emacs中进行查找和替换。

  Emacs将查找分成了四个大类,分别是:简单查找,增量查找,词组查找和正则查找。四种方式各有特点,适用范围也不同,大家根据需要熟悉一两种即可。

​一、增量查找 

   先介绍增量查找的原因是这个是用的最多的查找方式,使用也很方便,直接C-s (isearch-forward)便进入增量查找状态,Minibuffer出现如下提示: 

 

   其实增量查找很好理解,就是边输入边查找,在输入的过程中离光标最近的匹配会用深色高亮,一屏中其它的匹配字符串会浅色高亮,参见这张图:

 

  只要是单词中包含”to” 的都会标记出来,比如tutorial。在输入查找字符串过程中可以随时用Backspace删除输入字符,当输入完成后按下回车会定位到向前最近的匹配字符串,并出现提示“Mark saved where search started”,就是说将你开始查找时光标所在位置加入了标记环,我们可以通过C-u C-@回到那个点。如果没找到字符串提示为“Failing I-search”,后接查找内容。C-s搜索时是向前进行查找,我们还可以使用C-r (isearch-backward)向后进行查找,注意这种方式的查找光标会定位到匹配字符串的最前方。虽然查找过程只会向一个方向进行,但到了文档底部或者头部还是会回到文档的头或底继续找,这就是常说的循环查找。

  在搜索的过程中并不一定第一个匹配项就是我们需要的内容,或者说我们需要找的地方不止一处,这样我们想能够快速的定位到下一个匹配项位置,解决办法也很简单,接上例我们输入”to”后不要急着按回车,而是再用C-s就会向后定位,或者用C-r 向前定位,总之停到你想要的地方为止。另外,如果你退出了这次的查找,后面又想找同一个东西,那么使用C-s C-s 即可,同理C-r C-r 。

  Emacs在多次查找的过程中会维护一个查找环(search ring) ,这是我们见到的第三个环了,前面两个是mark ring、kill ring。在输入C-s后,使用M-n和M-p可以调出查找环中上一个和下一个查找的内容。虽然这个也叫环但它是个标准的队列,有头有尾不会循环。

  在增量查找中还有些特殊的功能:通常查找时是忽略了大小写的,但如果我们输入的查找内容有小写字母还有小写字母,Emacs会自动进入大小写匹配查找状态中;也可以在查找的过程用M-c 快速切换是否大小写敏感,不过只对此次查找启用;如果我们想找回车符用C-j 代替;还可以使用M-Tab (isearch-complete)对查找进行自动完成,候选项是查找环中的东西,当然你用M-Tab 是没效果的,用了后连Emacs都不在了,我们需要对isearch-complete重新绑定;在增量查找状态中按C-h C-h 会进入增量查找的帮助,里面的内容大家可以自己研究;使用C-w 可以将光标处单词复制到查找区域中进行快速输入,这个功能比较常用;与其类似的是C-y 它能够把光标所在处直到行尾的内容都复制到查找区域,提醒一点这两个命令在复制的过程中会把所有字母变成小写;M-y 还能把kill 环里的内容复制到查找区域;C-M-w 用于删除查找区域中最后一个字符;而C-M-y 把光标处字符复制到查找区域最后;复制光标处的字符还有个方法,进入增量查找状态后,首先按M-e 定位到查找区域的最后,再使用C-f 就可以开始复制了。

 

二、简单查找

  简单查找顾名思义就是简单的查找方式(其实不一定有增量查找来的快),有时候又叫它非增量查找。使用命令是C-s RET string RET ,首先用C-s调出增量查找,然后回车取消掉进入简单查找,再输入需要查找的字符串,最后回车Emacs会向后开始找,直到第一个满足的字符串后面。大家在按命令的过程中可以观察Minibuffer中的提示,按下C-s后,会出现一个蓝色的“I-search:”,回车后变为“Search:”,当找到所输入的内容后出现提示“Mark saved where search started”,其实简单查找和增量查找大部分都没什么区别,增量查找中命令基本上这儿也能用,最大的区别就是等你输入完成后它才开始搜索,还有一点就是没有高亮。向前查找的话一回事,C-r RET string RET 。向后向前分别对应命令search-forwardsearch-backward

 

三、词组查找

  词组查找一般用在大段文本编辑中,比如写新闻、写信之类的。它在查找的过程中会忽略掉一些标点符号,比如换行符,逗号,句号之类的,查找时也是进行的增量查找,边输入边找,不过对于单词来说是全词匹配。其命令是M-s w (isearch-forward-word)。查找的示例如下图:

 

 

   我在找”it”的时候,红框圈出来的permitted并没高亮,而我输入”it under”时,逗号和回车符都忽略掉了,这些特点在查找大段句子的时候相当好用。词组查找也可以使用非增量搜索的方式,对应命令M-s w RET words RET (word-search-forward) ,向回找M-s w C-r RET words RET (word-search-backward),这里面的words就是你需要查找的词组。词组查找其余大部分使用方式和前面的类似就不多叙述了。

 

 四、正则查找

  这种查找方式使用正则表达式,功能相当的强大,其主要还是看各人正则表达式的水平了,Emacs中的正则语法放到后面再讲,这里只说下怎么调出正则查找。命令 C-M-s (isearch-forward-regexp),咳,用快捷键的时候把QQ关了,这个是向前找,命令可以看出来使用的是增量查找方式,向后是C-M-r (isearch-backward-regexp)。

 

五、替换

  本次的另一半内容就是介绍Emacs中的替换功能,就是将一个字符串变成另一个字符串。

  最简单粗暴的方式就是使用replace-string 这个命令,用法如下:M-x replace-string RET oldstring RET newstring RET,第一次回车输入需要替换的字符串,第二次回车输入想要变成的字符串,最后确认。它将会把所有匹配oldstring 的字符串全部替换掉,建议大家在没绝对把握前还是不要用这个的好。在替换的过程中Emacs对大小写有比较智能化的处理,比如输入M-x replace-string RET abc RET efg RET,所有的”abc”都变成了”efg”,但是”ABC”会替换成”EFG”,不止这样”aBc”会改为”eFg”,大写对大写,小写对小写。当然我们可能不想做这样的变化,那么把变量case-replace 设为nil 即可,还有个相关的变量case-fold-search ,设为nil后,它会在查找的时候就强制匹配大小写。

  暴力替换的正则版命令replace-regexp,用法和上面一样,只是oldstring改为正则表达式。

  实际上,我们在替换的时候并不希望所有的东西都换掉,还是想中间有个给自己判断选择的过程,在Emacs中称其为查找替换,M-% (query-replace) ,用的时候和前面一样,先输入oldstring,再输newstring,但是它是一个一个找的,对每个找到的匹配询问用户该如何处理,根据你的回答它再做出下个动作。下面这张表列出了所有可能的回答和相应。 

 

输入 响应
SPC 或者 y 替换当前匹配并前进到下一个匹配处
DEL 或者 n 忽略此次匹配并前进到下一个匹配处
. 替换当前匹配并退出
, 替换当前匹配并停在此处,再按y后前进
! 替换所有剩余匹配
^ 回到前一个匹配处
RET 或者 q 直接退出
e 修改新字符串
C-r 进入递归编辑状态
C-w 删除当前匹配并进入递归编辑状态
C-M-c 退出递归编辑状态,返回查找替换
C-] 退出递归编辑状态,同时退出查找替换
C-h 显示帮助

 

      这些命令中,相对y,n,q用的会多点。但如果按了任何其它的键都会退出查找替换状态,不小心退出后还能使用C-x ESC ESC返回。

      最后说下什么是递归编辑状态,简单的说就是你在查找替换的过程中突然发现需要修改点东西,但又不想直接退出查找替换,这时Emacs提供了一个临时的编辑状态可以让你先干刚想起的事,等你做完了还可以回到查找替换状态,这个临时的状态就叫递归编辑状态。

 

      注意看,这时mode line中的模式名外面加了一层方括号”[]”,标明进入了递归编辑状态。干完事后使用C-M-c 就可以回到前一个状态,实际上,在任何时候都可以用命令 recursive-edit 进入递归编辑,用abort-recursive-edit 或者top-level 退出,也可以用C-M-c 返回前一状态。

 

小结:

 

按键

命令

作用

C-s

isearch-forward

向前进行增量查找

C-r

isearch-backward

向后进行增量查找

M-c

 

(查找状态)切换大写敏感

C-j

newline-and-indent

(查找状态)输入换行符

M-Tab

isearch-complete (查找状态)自动匹配

C-h C-h

 

(查找状态)进入查找帮助

C-w   (查找状态)将光标处单词复制到查找区域
C-y   (查找状态)将光标处直到行尾内容复制到查找区域
M-y   (查找状态)把kill 环中最后一项复制到查找区域
C-M-w   (查找状态)删除查找区域最后一个字符
C-M-y   (查找状态)将光标处字符复制到查找区域最后
C-f   (查找状态)将光标处字符复制到查找区域最后
C-s RET search-forward 向前进行简单查找
C-r RET search-backward 向后进行简单查找
M-s w isearch-forward-word 向前进行词组查找
M-s w RET word-search-forward 向前进行词组查找(非增量方式)
M-s w C-r RET word-search-backward 向后进行词组查找(非增量方式)
C-M-s isearch-forward-regexp 向前进行正则查找
C-M-r isearch-backward-regexp 向后进行正则查找
  replace-string 全文替换
  replace-regexp 全文正则替换
M-% query-replace 查找替换
  recursive-edit 进入递归编辑
  abort-recursive-edit 退出递归编辑
  top-level 退出递归编辑

 

 

 

 

变量

作用

case-replace 设置大小写自动替换
case-fold-search 设置大小写匹配查找

 

 

 

MacOS使用截图的方法

MacOS使用截图的方法:

1.Command+shift+3:全屏截图
2.Command+shift+4:鼠标选定区域截图

​按键

解说

Command-Shift-3

将整个屏幕拍下并保存到桌面。

Command-Shift-Control-3

将整个屏幕拍下并保存到剪贴板(Clipboard),可以Command+V直接粘贴到如Photoshop等软件中编辑

Command-Shift-4

将屏幕的一部分拍下并保存到桌面。按下这个组合键后,光标会变为一个十字,你可以拖拉来选取拍摄区域。

Command-Shift-Control-4

将屏幕的一部分拍下并保存到剪贴板。

Command-Shift-4再按空格键

这时光标会变为一个照相机图标,点击可拍下当前窗口或菜单或Dock以及图标等,只要将照相机图标移动到不同区域(有效区域会显示为浅蓝色)点击.

Command-Shift-Control-4再按空格键

将选取的窗口或其他区域的快照保存到剪贴板。

使用第二种截图,还有两个小技巧

1.  使用Command+shift+4后,按下空格键,鼠标会变成一个小相机,这时候你使用鼠标对一个窗口点击一下鼠标左键,你已经对一个窗口进行了截图。

2. 按Command+shift+4 后 ,画一个抓取的区域,不要松开鼠标,接着:

1. 按住空格可以移动这个区域
2. 按住 Shift后,将锁定X 或者 Y轴进行拖动
3. 按住 Option后 将按照区域圆心进行放大.

最后所有截图将直接显示在桌面上。

 

 

 

Emacs使用教程(七)

 Emacs 在不同的操作系统中表现会有一些小的差异,这里我接着上一章所提到的粘贴复制来比较一下不同操作系统中Emacs的剪切板。

 

一、复制到剪切板

  在Emacs中我们剪切、复制文本除了使用命令之外,还可以利用工具栏上的快捷按钮或者菜单栏里面菜单项,在默认情况使用工具栏和菜单栏进行剪切复制都会把相关内容发送到系统剪切板供其它程序使用。在Windows 和Mac OS X中使用C-w 或M-w也会复制内容到剪切板,不过Linux不行。

  我们选择区域的另一种方式是使用鼠标,它也有小小的差别,如下表: 

使用鼠标选择区域
  Linux Windows Mac OS X
是否发送到系统剪切板 no yes yes
是否发送到Kill环 yes yes yes

       在Linux中想要发送到系统剪切板除了使用鼠标点工具栏还可以利用几个剪切板命令,比如clipboard-kill-region 剪切区域并发送到系统剪切板和Kill 环中,clipboard-kill-ring-save 复制区域内容到系统剪切板和Kill 环中。当然这两个命令Windows 和Mac里面也可以用。本质上这两个命令就是菜单栏中对应的剪切和复制。

 

二、从剪切板中提取

      既然从Emacs到系统剪切板有差异那从剪切板复制到Emacs里面也有些不同,直接看下表: 

从系统剪切板粘贴
  Linux Windows Max OS X
C-y粘贴 yes yes yes
工具栏粘贴按钮 yes yes no
菜单栏粘贴菜单项 yes yes no
鼠标中键 yes yes yes
M-x clipboard-yank yes yes yes

      这里解释几个地方,一是鼠标中键,有的鼠标没中键就是滑轮了,它也有粘贴功能,而命令clipboard-yank 从剪切板中粘贴对应的是菜单栏上的粘贴功能。

 

小结:

      本章内容很少,就是一些简单的对比,在以后的学习中还能见到更多的不同平台下Emacs的差异。

 

按键

命令

作用

  clipboard-kill-region 剪切区域并发送到系统剪切板和Kill 环中
  clipboard-kill-ring-save 复制区域内容到系统剪切板和Kill 环中
  clipboard-yank 从剪切板中粘贴到Emacs中

YUM保存软件包及离线下载

默认情况下,当前版本的 yum 在成功下载和安装软件包后,会把下载的文件删掉。这样可以减少 yum 占用的磁盘空间。你可以打开缓存,这样 yum 将在缓存目录保留下载到的文件。

1. 缓存优势:

  • yum 的性能可以提高

  • 只使用缓存你可以离线运行 yum 操作

  • 你可以复制缓存中的软件包以备用

默认情况下,yum 在 /var/cache/yum/ 目录保存临时文件,每个仓库都有自己的子目录。仓库目录中 packages/ 子目录包含了缓存的软件包。例如,目录/var/cache/yum/development/packages/ 包含从 development 仓库下载的软件包。

2. 启用 yum 缓存

要配置 yum 保留已下载的文件而不是删除,设置 /etc/yum.conf 中的keepcache 选项为 1:

keepcache=1

打开缓存后,每个 yum 操作都可能从仓库下载软件包数据。要保证缓存包含了软件包数据,在启用缓存后运行一个操作,例如 list 或 search 来下载软件包数据而不影响系统。

3.在只使用缓存的模式下使用 yum

要在没有网络的情况下执行 yum,只要启用了缓存,就可以用 -C 选项。这样 yum 就不会检查网络上的仓库,只使用缓存。在这个模式中,yum 只能安装已下载并缓存的软件包。

要在没有网络连接的时候搜索软件包 tsclient,输入命令:

su -c 'yum -C list tsclient'

4. 缓存带来的好处

如果你有多台机子 只须要一台机子从网上下载 软件包跟软件更新包 , 还有如果你想重装系统不想再下载的几个G的更新跟软件(前提缓存了你系统所有安装的软件的更新包).

在开启 缓存的状态下因为 yum 下载的软件包不会被删除,所以可以多次利用.(就是占硬盘空间而以, 呵呵几个G我不放在眼里,我硬盘有 1.2TB)

很简单的方法,把这台机子的 /var/cache/yum/ 目录下的所有文件包过目录. 复制到另一台机子下的相同目录. 执行.

# yum -C update
# yum -C install <软件包名>

5.清空 yum 缓存

# yum clean headers

要删除缓存中所有软件包,使用命令:

#yum clean package
[root@Iprayz ~]# rpm -ql yum    /var/cache/yum
[root@Iprayz ~]# cat /etc/yum.conf |grep  cachedir cachedir=/var/cache/yum/$basearch/$releasever
[root@Iprayz ~]# cat /etc/yum.conf |grep keep  keepcache=0
#  Fedora which don't keep old packages around. If you don't like this checking
[root@Iprayz ~]#

Maven简介

1.1 何为Maven

Maven这个词可以翻译为“知识的积累”,也可以翻译为“专 家”或“内行”。本书将介绍Maven这一跨平台的项目管理工具。作为Apache组织中的一个颇为成功的开源项目,Maven主要服务于基于Java平 台的项目构建、依赖管理和项目信息管理。无论是小型的开源类库项目,还是大型的企业级应用;无论是传统的瀑布式开发,还是流行的敏捷模式,Maven都能 大显身手。

1.1.1  何为构建

不管你是否意识到,构建(build)是每一位程序员每天都在做的工作。早上来 到公司,我们做的第一件事情就是从源码库签出最新的源码,然后进行单元测试,如果发现失败的测试,会找相关的同事一起调试,修复错误代码。接着回到自己的 工作上来,编写自己的单元测试及产品代码,我们会感激IDE随时报出的编译错误提示。
忙到午饭时间,代码编写得差不多了,测试也通过了,开心地享 用午餐,然后休息。下午先在昏昏沉沉中开了个例会,会议结束后喝杯咖啡继续工作。刚才在会上经理要求看测试报告,于是找了相关工具集成进IDE,生成了像 模像样的测试覆盖率报告,接着发了一封电子邮件给经理,松了口气。谁料QA小组又发过来了几个bug,没办法,先本地重现再说,于是熟练地用IDE生成了 一个WAR包,部署到Web容器下,启动容器。看到熟悉的界面了,遵循bug报告,一步步重现了bug……快下班的时候,bug修好了,提交代码,通知 QA小组,在愉快中结束了一天的工作。

仔细总结一下,我们会发现,除了编写源代码,我们每天有相当一部分时间花在了编 译、运行单元测试、生成文档、打包和部署等烦琐且不起眼的工作上,这就是构建。如果我们现在还手工这样做,那成本也太高了,于是有人用软件的方法让这一系 列工作完全自动化,使得软件的构建可以像全自动流水线一样,只需要一条简单的命令,所有烦琐的步骤都能够自动完成,很快就能得到最终结果。

1.1.2  Maven是优秀的构建工具

前面介绍了Maven的用途之一是服务于构建,它是一个异常强大的构建工具,能 够帮我们自动化构建过程,从清理、编译、测试到生成报告,再到打包和部署。我们不需要也不应该一遍又一遍地输入命令,一次又一次地点击鼠标,我们要做的是 使用Maven配置好项目,然后输入简单的命令(如mvn clean install),Maven会帮我们处理那些烦琐的任务。

Maven是跨平台的,这意味着无论是在Windows上,还是在Linux或者Mac上,都可以使用同样的命令。

我们一直在不停地寻找避免重复的方法。设计的重复、编码的重复、文档的重复,当 然还有构建的重复。Maven最大化地消除了构建的重复,抽象了构建生命周期,并且为绝大部分的构建任务提供了已实现的插件,我们不再需要定义过程,甚至 不需要再去实现这些过程中的一些任务。最简单的例子是测试,我们没必要告诉Maven去测试,更不需要告诉Maven如何运行测试,只需要遵循Maven 的约定编写好测试用例,当我们运行构建的时候,这些测试便会自动运行。

想象一下,Maven抽象了一个完整的构建生命周期模型,这个模型吸取了大量其 他的构建脚本和构建工具的优点,总结了大量项目的实际需求。如果遵循这个模型,可以避免很多不必要的错误,可以直接使用大量成熟的Maven插件来完成我 们的任务(很多时候我们可能都不知道自己在使用Maven插件)。此外,如果有非常特殊的需求,我们也可以轻松实现自己的插件。

Maven还有一个优点,它能帮助我们标准化构建过程。在Maven之前,十个项目可能有十种构建方式;有了Maven之后,所有项目的构建命令都是简单一致的,这极大地避免了不必要的学习成本,而且有利于促进项目团队的标准化。

综上所述,Maven作为一个构建工具,不仅能帮我们自动化构建,还能够抽象构建过程,提供构建任务实现;它跨平台,对外提供了一致的操作接口,这一切足以使它成为优秀的、流行的构建工具。

1.1.3  Maven不仅仅是构建工具

Java不仅是一门编程语言,还是一个平台,通过JRuby和Jython,我 们可以在Java平台上编写和运行Ruby和Python程序。我们也应该认识到,Maven不仅是构建工具,还是一个依赖管理工具和项目信息管理工具。 它提供了中央仓库,能帮我们自动下载构件。

在这个开源的年代里,几乎任何Java应用都会借用一些第三方的开源类库,这些 类库都可通过依赖的方式引入到项目中来。随着依赖的增多,版本不一致、版本冲突、依赖臃肿等问题都会接踵而来。手工解决这些问题是十分枯燥的,幸运的是 Maven提供了一个优秀的解决方案,它通过一个坐标系统准确地定位每一个构件(artifact),也就是通过一组坐标Maven能够找到任何一个 Java类库(如jar文件)。Maven给这个类库世界引入了经纬,让它们变得有秩序,于是我们可以借助它来有序地管理依赖,轻松地解决那些繁杂的依赖 问题。

Maven还能帮助我们管理原本分散在项目中各个角落的项目信息,包括项目描 述、开发者列表、版本控制系统地址、许可证、缺陷管理系统地址等。这些微小的变化看起来很琐碎,并不起眼,但却在不知不觉中为我们节省了大量寻找信息的时 间。除了直接的项目信息,通过Maven自动生成的站点,以及一些已有的插件,我们还能够轻松获得项目文档、测试报告、静态分析报告、源码版本日志报告等 非常具有价值的项目信息。

Maven还为全世界的Java开发者提供了一个免费的中央仓库,在其中几乎可以找到任何的流行开源类库。通过一些Maven的衍生工具(如Nexus),我们还能对其进行快速地搜索。只要定位了坐标,Maven就能够帮我们自动下载,省去了手工劳动。

使用Maven还能享受一个额外的好处,即Maven对于项目目录结构、测试用 例命名方式等内容都有既定的规则,只要遵循了这些成熟的规则,用户在项目间切换的时候就免去了额外的学习成本,可以说是约定优于配置 (Convention Over Configuration)。

1.2 为什么需要Maven

Maven不是Java领域唯一的构建管理的解决方案。本节将通过一些简单的例子解释Maven的必要性,并介绍其他构建解决方案,如IDE、Make和Ant,并将它们与Maven进行比较。

1.2.1  组装PC和品牌PC

笔者初中时开始接触计算机,到了高中时更是梦寐以求希望拥有一台自己的计算机。我的第一台计算机是赛扬733的,选购是一个漫长的过程,我先阅读了大量的杂志以了解各类配件的优劣,CPU、内存、主板、显卡,甚至声卡,我都仔细地挑选,后来还跑了很多商家,调货、讨价还价,组装好后自己装操作系统和驱动程序……虽然这花费了我大量时间,但我很享受这个过程。可是事实证明,装出来的机器稳定性不怎么好。

一年前我需要配一台工作站,这时候我已经没有太多时间去研究电脑配件了。我选择了某知名PC供应商的在线商店,大概浏览了一下主流的机型,选择了我需要的配置,然后下单、付款。接着PC供应商帮我组装电脑、安装操作系统和驱动程序。一周后,物流公司将电脑送到我的家里,我接上显示器、电源、鼠标和键盘就能直接使用了。这为我节省了大量时间,而且这台电脑十分稳定,商家在把电脑发送给我之前已经进行了很好的测试。对了,我还能享受两年的售后服务。

使用脚本建立高度自定义的构建系统就像买组装PC,耗时费力,结果也不一定很好。当然,你可以享受从无到有的乐趣,但恐怕实际项目中无法给你那么多时间。使用Maven就像购买品牌PC,省时省力,并能得到成熟的构建系统,还能得到来自于Maven社区的大量支持。唯一与购买品牌PC不同的是,Maven是开源的,你无须为此付费。如果有兴趣,你还能去了解Maven是如何工作的,而我们无法知道那些PC巨头的商业秘密。

1.2.2  IDE不是万能的

当然,我们无法否认优秀的IDE能大大提高开发效率。当前主流的IDE如Eclipse和NetBeans等都提供了强大的文本编辑、调试甚至重构功能。虽然使用简单的文本编辑器和命令行也能完成绝大部分开发工作,但很少有人愿意那样做。然而,IDE是有其天生缺陷的:

  • IDE依赖大量的手工操作。编译、测试、代码生成等工作都是相互独立的,很难一键完成所有工作。手工劳动往往意味着低效,意味着容易出错。

  • 很难在项目中统一所有的IDE配置,每个人都有自己的喜好。也正是由于这个原因,一个在机器A上可以成功运行的任务,到了机器B的IDE中可能就会失败。

我们应该合理利用IDE,而不是过多地依赖它。对于构建这样的任务,在IDE中一次次地点击鼠标是愚蠢的行为。Maven是这方面的专家,而且主流IDE都集成了Maven,我们可以在IDE中方便地运行Maven执行构建。

1.2.3  Make

Make也许是最早的构建工具,它由Stuart Feldman于1977年在Bell实验室创建。Stuart Feldman也因此于2003年获得了ACM国际计算机组织颁发的软件系统奖。目前Make有很多衍生实现,包括最流行的GNU Make和BSD Make,还有Windows平台的Microsoft nmake等。

Make由一个名为Makefile的脚本文件驱动,该文件使用Make自己定义的语法格式。其基本组成部分为一系列规则(Rules),而每一条规则又包括目标(Target)、依赖(Prerequisite)和命令(Command)。Makefile的基本结构如下:

<span style="font-size: small;">TARGET… : PREREQUISITE…  
COMMAND  
…  
…  
</span>

     Make通过一系列目标和依赖将整个构建过程串联起来,同时利用本地命令完成每个目标的实际行为。Make的强大之处在于它可以利用所有系统的本地命令,尤其是UNIX/Linux系统,丰富的功能、强大的命令能够帮助Make快速高效地完成任务。

但是,Make将自己和操作系统绑定在一起了。也就是说,使用Make,就不能实现(至少很难)跨平台的构建,这对于Java来说是非常不友好的。此外,Makefile的语法也成问题,很多人抱怨Make构建失败的原因往往是一个难以发现的空格或Tab使用错误。

1.2.4  Ant

Ant不是指蚂蚁,而是意指“另一个整洁的工具”(Another Neat Tool),它最早用来构建著名的Tomcat,其作者James Duncan Davidson创作它的动机就是因为受不了Makefile的语法格式。我们可以将Ant看成是一个Java版本的Make,也正因为使用了Java,Ant是跨平台的。此外,Ant使用XML定义构建脚本,相对于Makefile来说,这也更加友好。

与Make类似,Ant有一个构建脚本build.xml,如下所示:

<?xml version="1.0"?>
<project name="Hello" default="compile">
<target name="compile" description="compile the Java source code to class files">
<mkdir dir="classes"/>
<javac srcdir="." destdir="classes"/>
</target>
<target name="jar" depends="compile" description="create a Jar file ">
<jar destfile="hello.jar">
<fileset dir="classes" includes="**/*.class"/>
<manifest>
<attribute name="Main.Class" value="HelloProgram"/>
</manifest>
</jar>
</target>
</project>

build.xml的基本结构也是目标(target)、依赖(depends),以及实现目标的任务。比如在上面的脚本中,jar目标用来创建应用程序jar文件,该目标依赖于compile目标,后者执行的任务是创建一个名为classes的文件夹,编译当前目录的java文件至classes目录。compile目标完成后,jar目标再执行自己的任务。Ant有大量内置的用Java实现的任务,这保证了其跨平台的特质,同时,Ant也有特殊的任务exec来执行本地命令。

和Make一样,Ant也都是过程式的,开发者显式地指定每一个目标,以及完成该目标所需要执行的任务。针对每一个项目,开发者都需要重新编写这一过程,这里其实隐含着很大的重复。Maven是声明式的,项目构建过程和过程各个阶段所需的工作都由插件实现,并且大部分插件都是现成的,开发者只需要声明项目的基本元素,Maven就执行内置的、完整的构建过程。这在很大程度上消除了重复。

Ant是没有依赖管理的,所以很长一段时间Ant用户都不得不手工管理依赖,这是一个令人头疼的问题。幸运的是,Ant用户现在可以借助Ivy管理依赖。而对于Maven用户来说,依赖管理是理所当然的,Maven不仅内置了依赖管理,更有一个可能拥有全世界最多Java开源软件包的中央仓库,Maven用户无须进行任何配置就可以直接享用。

1.2.5  不重复发明轮子

【该小节内容整理自网友Arthas最早在Maven中文MSN的群内的讨论,在此表示感谢】

小张是一家小型民营软件公司的程序员,他所在的公司要开发一个新的Web项目。经过协商,决定使用Spring、iBatis和Tapstry。jar包去哪里找呢?公司里估计没有人能把Spring、iBatis和Tapstry所使用的jar包一个不少地找出来。大家的做法是,先到Spring的站点上去找一个spring.with.dependencies,然后去iBatis的网站上把所有列出来的jar包下载下来,对Tapstry、Apache commons等执行同样的操作。项目还没有开始,WEB.INF/lib下已经有近百个jar包了,带版本号的、不带版本号的、有用的、没用的、相冲突的,怎一个“乱”字了得!

在项目开发过程中,小张不时地发现版本错误和版本冲突问题,他只能硬着头皮逐一解决。项目开发到一半,经理发现最终部署的应用的体积实在太大了,要求小张去掉一些没用的jar包,于是小张只能加班加点地一个个删……

小张隐隐地觉得这些依赖需要一个框架或者系统来进行管理。

小张喜欢学习流行的技术,前几年Ant十分流行,他学了,并成为了公司这方面的专家。小张知道,Ant打包,无非就是创建目录,复制文件,编译源代码,使用一堆任务,如copydir、fileset、classpath、ref、target,然后再jar、zip、war,打包就成功了。

项目经理发话了:“兄弟们,新项目来了,小张,你来写Ant脚本!”

“是,保证完成任务!”接着,小张继续创建一个新的XML文件。target clean; target compile; target jar; …… 不知道他是否想过,在他写的这么多的Ant脚本中,有多少是重复劳动,有多少代码会在一个又一个项目中重现。既然都差不多,有些甚至完全相同,为什么每次都要重新编写?

终于有一天,小张意识到了这个问题,想复用Ant脚本,于是在开会时他说:“以后就都用我这个规范的Ant脚本吧,新的项目只要遵循我定义的目录结构就可以了。”经理听后觉得很有道理:“嗯,确实是个进步。”

这时新来的研究生发言了:“经理,用Maven吧,这个在开源社区很流行,比Ant更方便。”小张一听很惊讶,Maven真比自己的“规范化Ant”强大?其实他不知道自己只是在重新发明轮子,Maven已经有一大把现成的插件,全世界都在用,你自己不用写任何代码!

为什么没有人说“我自己写的代码最灵活,所以我不用Spring,我自己实现IoC;我不用Hibernate,我自己封装JDBC”?

 

解决CentOS安装过程中出现的Kdump安装失败

在安装完成重启后开始进行一些初始化的配置,在最后一项是配置Kdump,但是蛋疼的问题出现了。

看到这个“没有足够的内存配置kdump”(在英文界面下提示的是“insufficient memory to configure kdump”),但是我后来分配了4G内存给虚拟机,但是还是提示这个错误。后来想起kdump还有一个图形界面配置的命令,所以在终端下输入system-config-kdump命令,会弹出下面的界面:

选择Target settings,会弹出下面的界面:

我第一次点开的时候没有红色圈住的那部分,后来就点了那个“Reload”按钮,然后再点击了“apply”按钮,在终端下输入service kdump restart终于启动成功了!真是太爽了!

赶紧测试一下,输入echo “c”>/proc/sysrq-trigger,界面会出现一些信息,类似下面一样:

过一会系统就会自动重启,这个时候就说明你的kdump已经配置成功了,重启之后/var/crash目录下就可以看到有一个文件夹,文件夹的名字是日期,里面就是你需要的core文件。至此终于神奇的误打误撞成功了。如果你还没成功,就把那几个“apply”、“reload”,“enable”,“disable”按钮来回点,多试几次,说不定也像我一样成功了。

最后总结一下整个过程:

1、完全安装CentOS 6.2,所有的包都选,一个也不要落下。
2、安装按成后忽略“没有足够的内存配置kdump”(在英文界面下提示的是“insufficient memory to configure kdump”)这个错误,进入系统后打开终端输入system-config-kdump命令,如果没有,先安装。
3、在界面中先点击reload按钮,然后在点击“apply”让配置生效,重启系统,测试看是否成功。

 

安装CentOS时提示kdump安装失败

由于测试需要,我在Ubuntu的虚拟机下安装了CentOS。安装过程中一切顺利,结果在启动的时候发现kdump启动失败。
听名字感觉kdump像个debug工具。上网搜索了一下,得知:
[codesyntax lang=”text”]

kdump是在系统崩溃、死锁或者死机的时候用来转储内存运行参数的一个工具和服务。
打个比方,如果系统一旦崩溃那么正常的内核就没有办法工作了,
在这个时候将由kdump产生一个用于capture当前运行信息的内核,
该内核会将此时的内存中的所有运行状态和数据信息收集到一个dump core
文件中以便于Red Hat工程师分析崩溃原因,一旦内存信息收集完成,系统将自动重启。
这和以前的diskdump,netdump是同样道理。只不过kdump是RHEL5特有的。

[/codesyntax]
虽然不影响设备的正常使用,启动不了老是觉得不舒服。经过我的多次研究,我是这样修复的:

编辑/etc/sysconfig/kdump文件:
设置MKDUMPRD_ARGS和KDUMP_COMMANDLINE

MKDUMPRD_ARGS="/sbin/mkdumprd"(默认时这个参数的空的)
KDUMP_COMMANDLINE="ro root=LABEL=xxx"

其中xxx是root所在的分区的卷标。查看root卷标的命令是:
ls /etc/disk/by-label

保存,然后重启。

重启之后如果还不行:
安装kexec-tools
[codesyntax lang=”bash”]

yum install kexec-tools

[/codesyntax]
其实我不知道安装这个软件是不是必须的,
对于一般用户来说,没有必要开kdump。
所以建议初次时候通过ntsysv禁止其随开机启动

Emacs使用教程(四)

上回介绍了在Emacs中如何插入删除文本的简单操作,以及一些杂七杂八的命令,都还是蛮容易的。这回先跳过编辑这部分,介绍Emacs中的Minibuffer,呃,翻译过来叫迷你缓冲,听着比较难受,后面还是用E文吧。

 

一、初识Minibuffer

  Minibuffer 乃是Emacs命令读取复杂参数的位置。比如说文件名,缓冲名,命令名以及Lisp表达式这些东西。Minibuffer 显示在echo area中,当Minibuffer处于使用状态时,会出现一个彩色的提示符并以冒号结尾,根据提示符信息输入参数,以回车提交。取消Minibuffer 使用C-g,也就是上节介绍的取消命令。
  其实Minibuffer并不是太神秘,最常见的地方就是打开文件时提示我们输入文件名:

  按下C-x C-f 后,回显区就会变成这个样子,其中Find file 就是Minibuffer的提示符,因为它是蓝色的。后面的路径是Minibuffer自动添加的默认值,我们可以把参数选项insert-default-directory设置为nil,关闭这个默认路径。
  这里插入一下如何设置Emacs参数选项,我们键入M-x set-variable RET insert-default-directory RET后输入nil 即可,这里的RET代表回车。改回默认,前面输入一样最后输入t 。其实我们按下M-x set-variable也激活了Minibuffer。

 

  二、在Minibuffer中编辑

  我们可以将Minibuffer看成和主输入区类似的缓冲,Minibuffer中也有个buffer嘛,就是说某些主输入区的命令Minibuffer也可以用。同样我们看上面那张图,使用C-a 可以把光标移到d字符的位置,再按C-e 光标又回到最后,还可以使用M-Backspace删除“info/” 回到上级目录。不过需要注意的一点是,RET是Minibuffer的结束符而不是换行符,所以如果我们需要插入新行就不能使用回车,而是用C-o。同样对于TAB、SPC、?(前两个分别对应Tab键和空格键)在Minibuffer中经常用于自动补全,所以也不能直接输入,我们需要使用C-q 来插入,比如TAB,就用C-q TAB来替换。可以说Minibuffer和主输入区基本上一样,同样的快捷键、同样的操作方式,复制粘贴功能一应俱全。
  通常情况,Minibuffer在屏幕中只有一行,随着你输入的增多,Minibuffer会自动调整大小来适应。变量 resize-mini-windows用于控制Minibuffer的大小变化,其默认值是grow-only,大小只增不减,设为t 后,如果你删除一行会自动缩小,设为nil,就不会动了。变量max-mini-window-height 控制Minibuffer高度的最大值,设为浮点数表示占整个窗口的百分比,整数表示最大可以有多少行。默认值是0.25。
  当我们操作Minibuffer时也可以控制另一个窗口,C-M-v 命令就是用来滚动另一个窗口的文本,这个是往下翻页,C-M-S-v 是往上翻页,大家要看清楚,这不是四个键一起按,如果你不小心按的是s键,你会发现出来的是QQ聊天窗口,所以出于对中国广大QQ用户的考虑,Emacs把它改成了大写的s,就是说还要加上Shift键,呃,这是我目前见的最长的按键了而且比较变态。其实,也有简洁的方式,M-PageUp和M-PageDown,不过这两个键不在主键盘区,就看各位心情了。
  Minibuffer 一般情况是不允许递归调用的,也就是我们不能连按两次C-x C-f,它会提示Minibuffer正在使用,我们也可以设置变量enable-recursive-minibuffers 为t 来激活递归调用,不过容易引起错误,大家还是尽量避免吧。

三、自动补全

  Emacs中的命令有那么多,我们也不可能每一个都记的住,电脑里的路径也很长,记漏几个字符也很正常,这个时候自动补全就显得很重要了。常用的自动补全有四个键TAB、SPC、RET和?。我们先看它们的准确定义。
  TAB    尽可能的补全Minibuffer中的字符,如果没有满足要求的,则列出所有可能的补全。对应命令minibuffer-complete。
  SPC    最多补全Minibuffer中的一个词,如果没有满足要求的,则列出所有可能的补全,在输入路径时SPC不可用。对应命令minibuffer-complete-word。
  RET    提交Minibuffer中的文本,或者选取第一个可能的补全提交。对应命令minibuffer-complete-and-exit。
  ?      列出所有可能的补全。对应命令minibuffer-completion-help。
  下图就是我们按ins TAB TAB后自动补全的例子:

  第一个TAB补全了“ert-”,第二TAB列出了所有可能的补全。
  再仔细解读下这几个键,TAB是用的最多的自动补全,可以说每个操作系统的shell都支持TAB自动补全,它的设计目标也是尽可能的补全我们的输入,而一次补全需要满足下面三个准则:

  • 光标前Minibuffer中的文本必须和补全候选项中开头的内容一致,如果光标后还有文本则其需为补全候补项剩下内容的字串。

  • 如果不满足上一条件,则使用部分匹配补全,即将Minibuffer中的文本以”-“或者空格分开,分别补全。比如输入”em-l-m”,再按TAB,则会补全至”emacs-list-mode”。

  • 如果仍无满足的候选项,则继续使用第一条准则,不过忽略光标后的文本。

  空格键的匹配模式与TAB类似,不过它只匹配到下一个”-“或者空格,比如输入auto-f 后按空格会完成auto-fill-,需要再按一个空格才会完全补全为auto-fill-mode。此外,在TAB和SPC的匹配当中可以使用通配符”*”,代表任意一个或多个字符。
  在没有完全匹配项时,Emacs会列出所有满足条件的匹配,我们可以使用多种方法来选择某一项。
  Mouse-1, Mouse-2,就是鼠标左右键。
  或者在Minibuffer中按M-v,就会切换到补全候选项窗口,然后我们可以使用RET选择光标位置的项(choose-completion)。或者使用左右箭头键移动光标(next-completion、previous-completion)。很遗憾,除了使用上下左右,没有更快的方法了,M-f 和M-b 都是移到”-“字符的位置。再说明一点,上面几个命令想要能用,就必须把Minibuffer递归调用打开。
  在我们使用RET提交输入时,会出现三种不同情况的自动补全,三种情况根据提交内容的使用情况区分。

  • 严格匹配,故名思意,就是说输入的内容要完全匹配某一项才行。我们使用C-x k 来关闭某一个buffer时会提示输入buffer名,这个时候就是使用的严格匹配。如果找不到这个buffer 命令就不会执行。

  • 谨慎匹配,这个和严格匹配类似,区别在于回车后如果没有找到一个完全匹配的项Minibuffer不会退出,而是进行自动补全,再按RET就可以提交输入,然后退出Minibuffer。谨慎匹配用在读取必须存在的文件时。

  • 宽松匹配,C-x C-f 就是典型的宽松匹配,有一致的就打开这个文件,没有一至的就新建个文件。

  自动补全还有种icomplete 模式,使用M-x icomplete-mode 启动,作用是自动更新可能的补全。

  接下来再介绍一些自动补全的变量。
  completion-auto-help ,设为nil 时不会出现补全候选项列表,必须使用? 手动调出。设为lazy,在按第二次TAB时会出现补全候选项列表。
  completion-ignored-extensions,它的值包含了一些字符串,包含了比如”.o”, “.elc”, “~” 之类的,这样在输入文件名自动补全时就不会选择以这些结尾的文件了,不过当所有可能的候选都在忽略后缀里面,所有忽略全部无效。比如有foo.c 和 foo.elc 两个文件,输入foo TAB,会得到foo.c,但你输入foo.e TAB 还是会出现foo.elc。此外如果它的某项值是以”/” 结尾,则代表的是一个文件夹。
  read-file-name-completion-ignored-case ,值为non-nil 表示忽略大小写,nil 为不忽略大小写。

四、Minibuffer 历史

  在Minibuffer中的每次输入都保存在Minibuffer的历史当中,我们可以很方便的调出之前输入的某次命令。
  M-p 移到Minibuffer历史中的前一条,previous-history-element。
  M-n 移到Minibuffer历史中的后一条,next-history-element。M-r regexp RET 移到Minibuffer历史中的前一条,使用正则表达式,previous-matching-history-element。
  M-s regexp RET 移到Minibuffer历史中的后一条,使用正则表达式,next-matching-history-element。
  提醒一下,这些要Minibuffer处于激活状态才能使用。每次移动后取出的历史会替换当前的输入,而当我们在最后一条记录时继续使用M-n,还是会照样出现一条记录,不过这个记录是Emacs猜的。此外还需要说明的是,Emacs 维护了多个不同的历史,比如我们打开文件的路径历史,或者我们调用编译器的编译参数历史,而Emacs搜索历史也是在相应的历史列表中进行。
  关于Minibuffer历史的参数常用有两个,history-length 历史队列最大值,history-delete-duplicates 是否删除相同的历史。都是字面意思就不仔细说了。
  如果我们现在在主窗口也可以快速的调出最近执行的命令,使用C-x ESC ESC (repeat-complex-command)再执行一次最近的Minibuffer中的命令,Emacs会提示你是否执行。我们还可以使用M-p, M-n 来选择其他的历史。命令M-x list-command-history 可以列出最近所有的历史。
  最后说下Minibuffer历史的本质,它们都是储存在Lisp变量command-history中项,其中每一项都保存的每次执行的命令和参数。

小结:

  这次讲的东西不少哈。

按键

命令

作用

(none) set-variable 设置变量
C-M-v scroll-other-window 向下滚动另一个窗口
M-PageDown 同上 同上
C-M-S-v scroll-other-window-down 向上滚动另一个窗口
M-PageUp 同上 同上
TAB minibuffer-complete 自动补全Minibuffer
SPC minibuffer-complete-word 自动补全Minibuffer中一个词
RET minibuffer-complete-and-exit 提交Minibuffer
? minibuffer-completion-help 列出所有可能补全
RET(候选列表中) choose-completion 选择候选项
previous-completion 上一个候选项
next-completion 下一个候选项
C-x k kill-buffer 关闭一个buffer
(none) icomplete-mode 自动更新补全模式
M-p previous-history-element 前一历史
M-n next-history-element 后一历史
M-r (regexp) previous-matching-history-element 前一历史,使用正则表达式
M-s (regexp) next-matching-history-element 后一历史,使用正则表达式
C-x ESC ESC repeat-complex-command 重复最近一次命令
(none) list-command-history 列出所有命令历史

   

变量

作用

insert-default-history 打开文件是否插入默认路径
resize-mini-window Minibuffer大小变化模式
max-mini-window-height Minibuffer最大高度
enable-recursive-minibuffers 是否允许Minibuffer递归调用
completion-auto-help 自动补全帮助模式
completion-ignored-extensions 自动补全忽略后缀名列表
read-file-name-completion-ignored-case 自动补全是否大小写敏感
history-length 自动补全历史长度
history-delete-duplicates 自动补全是否删除重复项

2014年底回顾

蓦然间发现  原来今天已经到了2014年的倒数第二天
回顾这一年  我只能说自己不曾后悔

唯一的感觉是累  然后就是自己的付出与收获有点不成正比
作为一名运维人员  我觉得我是成功的  但又是失败的

怎么说呢   年初住在安贞 离上班的地点不是很远  这段时间刚好还有着工资的缓慢增长 所以每月都有点小激动  算是每月的神秘大礼吧
而且当时自己接手的事情也比较多  终端到交易平台 再到商户信息平台  每一次测试实际上都是对代码掌控能力的一次巩固   这样的日子 忙却安定……

不记得从哪个月开始  公司那边蔓延一种离职之风   一个个老员工慢慢的退出了福尔这个平台
当时  也没有想太多  毕竟是自己的第一份工作  就算是工资少点   自己看得都不是那么重
记得第一个走的好像是终端的届哥  然后就到了本组的财哥  信息的说姐   具体的顺序不是太记得了  只是感觉中层骨干人员在慢慢流失
当时对此看的也不是太重  毕竟雏鹰总得要经历风雨才能翱翔蓝天  中层的退出不外乎是我们新人的一次历练
虽然过程或许曲折  但前景应该是一片光明……

不得不承认期间自己犯了很多错
拖了很多后腿  时间进度控制的往往差强人意
但终归也算是体验到了成功的喜悦
也算是在一步步的成长吧

到了年中  发现自己已经毕业工作一年了
在几个好友的聚会上   总免不了会谈及到工作生活中的一些琐事
结果发现 虽然自己的生活忙碌而充实  但总少了些许东西
细想了下  应该是工作的激情~~~
想当年工作的时候都是载着满满的热情  但是那段时间  所有的一切感觉总是忙碌而没有新知识的收获
便想着挤点时间去充充电  考个软考证……
虽然明白  就算是拿到证了  或许对自己而言魅族实际上的好处  但至少总可以证明自己的青春没有白费

接下来就开始学霸的日子  周末跑去国图  徜徉在书香之中
好吧  得要承认   去那边不仅仅是纯粹的为了考试   也想着体验纸质书的那种触动以及学习的氛围
这种  或许也可以算是对考研生活中被动学习的一种弥补吧
毕竟  得不到的永远在骚动……

结果 很神奇的  这次软考竟然通过了
有点有激动  但更多的只是一种  只要有付出 总归会有收获的人生态度的认可
只是接下来的搬家让我有点淡淡的忧伤
住的远了  自己需要负担的房租还涨幅了
刚好当时奶头也刚好跟我“分道扬镳”  分住在帝都的南北
不过  兴庆的是龙宝过来了  有了大厨  自己的饮食质量总归是有指数级的增长
不过  问题也就来了   要知道吃货总归是抵挡不了美食的诱惑的
三个月增长近15斤就是一个非常明显的佐证

到下半年了  在帝都也参与了一次大学同学的游玩 —— 世界公园一日游
期间不可避免的涉及到了薪资浮动的相关事宜
想想公司从7月提出薪酬变更计划  到现在都还是“静若处子”   一下子感觉自己的工作生涯貌似缺少了点什么动力
不得不承认   运维的工资要比开发的要少  但是自己从不认为自己的能力就要比其他孩子低   只是整个行情是这样  自己也无力吐槽一点……
好吧  准切来说  也正是由于那一次的聚会  心里总感觉有些许躁动
但是  生活又总那么忙碌  基本上找不到任何空闲的时间来充实自己的技术
没办法  只能充分利用公交上的1个小时了

努力说服自己买了个手机 将自己的盛大换成了现在的荣耀
其实  最主要是准备换个双卡的手机  不要让自己接电话的时候  总在背包里面翻半天  而且也充分利用起湖南号的那100条免费短信 

然而 坏事年年有  今年特别多
在龙宝准备回广西的那几天  合租房说要拆隔断  而且还说房子已经被房东没卖出去了
没办法  自己也没有太多的精力去跟他们据理力争   只能默默的接受生活的无奈
更要命的当时  王小兵也回深圳办理离职  也就是说自己得要开始一个人接手两个人的工作了
曾记否 每天晚上拖着疲惫不堪的身躯  穿梭在天通苑周边的各个小区  回家之后看到其他租客都已经退房  只留下垃圾一片
当时真是有一种直接放弃的冲动
干脆直接回深圳办理离职!!!
终归强行制止了自己的冲动 理性的继续穿梭于房子周边  要命的是不知哪个挨千刀的将路由给顺走  搞得连续几天都木有网络~~   只能拿着手机在赶集 58上搜索合租房的信息
现在想想  也挺兴庆 当时公司那边没做监管  还是可以上外网  手机也还有足够的流量来进行搜查  不然当时估计还会是各种凌乱……
在此  还是得要非常感谢圈的收留  让我在最后的几个月里还没沦落到睡马路的境地
同时也感谢梁哥当天直接非常给力的房屋搬迁  
至少  年底的这一两个月还是相当顺利……

之后  在月底又开始筹备自己工作的转型
在拉勾 内推等网络上投递了无数次简历  每天晚上明明已经很晚了  却还在修改简历
只能说否极泰来吧 竟然第一次面试就让我直接拿到offer了
这也算是我一年来工作的认可吧~~
只是之后百度游戏及UC的电话面试 让我对电话面试累觉不爱
其实  也不是自己能力不够  而是电话面试 自己总不能在第一时间明白对方的需求  让自己有些丧失优势
毕竟  运维虽然说很多需要进行尝试与学习的  但说白了 很多时候只要建立起一套自己的理念   其他的应当都不是事

好了  感觉自己洋洋洒洒的做了年度流水账   夜深了  只能休息了 
争取年底前把总结的后半部分给写完……