深入理解 System.currentTimeMillis() 与时区

今天在解答同事对于 Unix Timestamp 的时区问题的疑问时,看到了这篇文章:

深入理解System.currentTimeMillis()

https://coderdeepwater.cn/2020/12/29/java_source_code/currentTimeMillis/

通过阅读发现,虽然该文章对于这个函数调用的原理解释的非常好,但是却在开头处犯了一个致命的错误,误导了我的同事。在这篇文章中,作者说:

深入理解System.currentTimeMillis()

System.currentTimeMills()的返回值取决于Java运行时系统的本地时区!千万不要忘记这一点!
同一时刻,在英国和中国的两个人同时用System.currentTimeMills()获取当前系统时间,其返回值不是一样的,除非手动将操作系统的时区设置成同一个时区(英国使用UTC+0,而中国使用UTC+8,中国比英国快8个小时).

这个观点是完全错误的,正因为这里的错误误导了我的同事,走入了错误的排查方向。

首先说结论:

  1. System.currentTimeMillis() 的返回值与系统时区无关。在一台时区和时间皆设置正确的机器上,这个函数的返回值总是当前时间与 UTC 0 时的 1970年1月1日 0时0分0秒即 1970-01-01 00:00:00 UTC 的差值
  2. 同一时刻,在地球上任意地点的两个人在时区和时间皆设置正确的机器上同时用 System.currentTimeMills() 获取当前系统时间,其返回值一定一样,与时区无关

首先明确几个概念:

  1. 时间:是一个客观存在的物理量,是物质运动变化的表现
  2. 时间单位:人为了方便对时间进行计量,人为定义了年、月、日、时、分、秒、毫秒等一系列时间单位
  3. 公历日期:人为规定的纪年体系,用来记录准确的时间
  4. 时区:由于地球自转的存在,地球上各个地区的日升日落时间并不一致。因此为了使用方便,人为将地球划分成了 24 个时区,每两个相邻时区间的时间表示相差 1 小时
  5. Unix 时间戳:人为规定的用来描述一个确切时间点的系统。以 1970-01-01 00:00:00 UTC 为基点,计算当前时间与基点的秒数差,不考虑闰秒

从这几个概念中,我们可以知道,Unix 时间戳是用于精确描述一个确定的时间点,具体的方式是计算两个时间点之间的秒数差。由于我们的宇宙只有单时间线,所以计算两个确定的时间点之间的秒数差,在地球上任何地方的时间都是一致的。因此我们可以知道,在一个确定的时间点上,地球上所有人计算得到的当前的 Unix 时间戳,都应当是一致的。

那么,为什么还有人遇到不同时区获取到的时间戳不一致的问题呢?这就要说到实际使用中对时间的展示方式了。

一个简单的例子,如果我说现在是北京时间 2020年01月01日 08时00分00秒,那么这可以表示一个准确的时刻。对于同一个时刻,我还可以说,现在是格林威治时间 2020年01月01日 00时00分00秒。这两个句子实际上表达的是同一个时刻。

但是,如果我只说现在是 2020年01月01日 00时00分00秒,那么不能表示一个准确的时刻。因为在句话里,我没有说明时区信息,导致缺失了定位到准确时刻的必要条件。

因此我们可以发现,我们日常说话时的表述,其实都是不精确的。那么在程序员的世界里,我们最容易犯的错误,也跟这个类似。

当我们查看一个服务器的时间信息的时候,大多数人不会关心时区信息。假设现在有一台 UTC 0 时区的服务器,很多人拿到后,在检查服务器时间时,第一反应是这个服务器的时间不对,因为桌面上的时钟是 2020年01月01日 08时00分00秒,而机器告诉我的是 2020年1月1日 00时00分00秒,晚了 8 小时。于是,使用 date -s "2020/01/01 08:00:00" 一把梭,再看机器的时间,完美!

那么这时候,如果我用 System.currentTimeMills()来获取时间戳,得到的是什么呢?得到的当然是 1577865600000,代表北京时间 2020年01月01日 16时00分00秒。因为机器本身运行在 0 时区,对于机器来说,现在是 0 时区的 8 点,那换算到 +8 的北京时区,自然是 16 点。

这也就是前面为何一直强调时区和时间皆设置正确的原因。刚说的案例就是典型的时间与时区设置不匹配。机器的时区是 0 时区的,但是用户设置进去的时间却是 +8 时区的。在这种情况下,System.currentTimeMills()自然获取不到正确的值。

因此,我们在修改机器的系统时间时,一定要带上时区信息。如:date -s "2020/01/01 08:00:00 +8" 。这样就可以准确的告诉系统我们想要设置的时刻,避免因为自动的时区转换导致调错机器的时间。

10大最适合编程的字体推荐下载,让代码看起来更美更舒服!

现在有事没事就喜欢写写代码的人越来越多了,对于成天盯着屏幕工作的开发人员来说,编程代码可能是每天见得最多的东西了。可是绝大部分人都一直使用编辑器默认的字体,其实,换一套适合自己的编程字体不仅能让代码看得更舒服,甚至还能提高工作效率的!

如果你有想过换一种编程字体,却不知道哪里找合适的,那么看看异次元软件世界为您推荐的10款最适合编程的字体吧,这些字体能让你的代码瞬间“优雅”起来!换一种字体,换一番心情嘛。当然,除了编程之外,经常需要编辑英文文档的朋友同样适用……

前言:

下面字体的排序是作者的主观感受,每个人的喜好都不一样。建议您都试试,按照自己的喜好来选择。另外,还在使用 Windows XP 的同学,如果您希望显示到如截图中清晰的字体效果,则必须安装微软的ClearType设置程序对清晰度进行设置。

10. Courier

也叫Courier New,这大概是我们最熟悉的字体了,基本上所有系统都有。很不幸,很多终端和编辑器都默认使用此种字体,虽然不会影响使用,但它太无趣了。如果你正在使用这种字体,建议调大一点,并打开系统的 anti-aliasing (抗锯齿) 设置。

clip_image001

下载 Courier New 字体

9. Andale Mono

比Courier稍好,也是常见的默认字体。我感觉字母太宽了,字符间距也比较蠢。

clip_image002

下载 Andale Mono 字体

8. Monaco

Mac的默认字体,好像也只有Mac上有。小字号的时候表现不错,而且再大些也不寒碜。

clip_image003

下载 Monaco 字体

7. Profont

与Monaco类似的位图字体,你能够在Mac, Windows和Linux上面使用。小字号的时候表现好。非Mac平台上Monaco的最佳替代。喜欢小字号且不怕眼睛疲劳的同学可以考虑。

clip_image004

下载 Profont 字体

6. Monofur

独特的等宽字体,各种字号下都表现不错,但是需要设置anti-aliasing。怀旧而且喜欢与众不同的人推荐。

clip_image005

下载 Monofur 字体

5. Proggy

干净的等宽字体,好像很受Windows用户欢迎,但在Mac上也不错。使用时,字号可以小一点,无需anti-aliasing。

clip_image006

下载 Proggy 字体

4. Droid Sans Mono

开源字体,可以在这里下载,适合手机屏幕。是等宽字体中最突出的一个。可惜0和O区别不大。

clip_image007

下载 Droid Sans Mono 字体

3. Deja Vu Sans Mono

我最喜欢的免费字体系列,以Vera为基础,但是比后者提供更多字符了。适于任何字号,需要anti-aliasing。

clip_image008

下载 Deja Vu Sans Mono 字体

2. Consolas + 中文雅黑混合版

Consolas 是商业字体,专门为微软设计,微软不少产品上都有,所以很可能你的系统上已经有了。需要anti-aliasing。如果不是商业的,我可能就把它放第一了。Consolas仅含英文字母部分,这里提供的是雅黑中文+Consolas英文的混合体,即使代码里有中文注释显示效果也能很好的!

clip_image009

下载 Consolas 雅黑字体

1. Inconsolata

我最喜欢的等宽字体,免费。我遇到它之后,很快就把原来的默认字体Deja Vu Sans Mono抛弃了。真正适合任何字号的好字体。感谢它的创造者Raph Levien!

clip_image010

下载 Inconsolata 字体

How to Install Java on Linux

Java allows you run cross-platform applications that can run on Mac OS-X, Linux, and Windows (among other OSs) without modification. Here’s how to install it on a GNU/Linux machine.

Steps

Manual Non-RPM Method

This is the generic method that also works with GNU/Linux clones that do not support RPM. It does not require administrator rights and allows installing multiple Java versions on the same computer.

  1. 1.Download the JDK.[1].
    • Click on the “Download” link under Java Platform (JDK) 7u4.
    • Accept the license and continue.
  2. 2.Select the right download. Under the “Product/File Description” you should pick your corresponding Linux option. For example, if you’re running Linux x86 (32-bit), you need to choose the corresponding “*.tar.gz” version.

    2943-21

  3. 3.Download the file as a .gz. Save it to your GNU/Linux machine.
  4. 4.Switch to the directory where you saved the file. You do not need to be a root and only must have the write access to the folder where you wish to install Java. If your administrator is not supportive, you may need to place Java into your home folder or (even better) on some shared network location
  5. 5.Uncompress the file. For example, you could do this in your home folder. Uncompressing will create a folder called “jdk1.7.0_04”. Java is now installed.
    • The installed Java jre is rather independent and can be easily moved into another place just by copying all its files.
    • You can install multiple different jre’s this way: they coexist together and can be used if some software requires the older version to run.
  6. 6.Launch Java. The Java executable you need to launch is located in a subfolder, called “bin.” This way of installation will not configure a default Java command for you — you must do this manually or always include the full path in your startup script.

Manual RPM Method

This seems like a “more civilized” way to install Java because it allows the installer to check the dependencies on some system libraries that may be missing. However, it does not support versioning easily and may fail even in some systems that do support RPMs. (Though the current Java installations are rather self-dependent and the required minimal requirements are usually satisfied anyway.)

  1. 1.Download the JDK.[2].
    • Click on the “Download” link under Java Platform (JDK) 7u4.
    • Accept the license and continue.
  2. 2.Select the right download. Under the “Product/File Description” you should pick your corresponding Linux option. For example, if you’re running Linux x86 (32-bit), you need to choose the corresponding “*.rpm” version, for example “jdk-7u4-linux-i586.rpm”.

    2943-2

  3. 3.Download the .rpm file. Save it to your GNU/Linux machine.
  4. 4.Log in as root and switch to the directory where you saved the file. Or, become root by running su and entering the super-user password.
  5. 5.Install the rpm file by executing ‘rpm -ivh filename.rpm’, where filename is the name of your .rpm file. (Such as jdk-7u4-linux-i586.rpm).
    • You may receive a message telling that program “rpm” is not installed.
    • If that is the case the program “rpm” is not installed. You need to install it writing: sudo apt-get install rpm. Enter your password, and you’re finished.
  6. 6.Create symbolic links. If you want to be able to execute this version of Java interpretor or compiler from any directory on your GNU/Linux system, you will have to create a few symbolic links:
    • sudo ln -s -v jdk1.7.0_04/bin/java /usr/bin/java
    • sudo ln -s -v jdk1.7.0_04/bin/javac /usr/bin/javac
    • Note that by installing using this method there could be dependencies that fail. It is better to use the package installer that handles all dependencies for you, since you will not be able to use Java correctly until the dependencies are resolved.

Ubuntu Method Using a GUI Package Manager

  1. 1.Open a package manager. You can use Synaptic or Adept Manager.
  2. 2.Install Open JDK. Java JDK and JRE are not available for installation through GUI Package Manager. You’ll need to install Open JDK instead.
    • Perform a search for openjdk-7-jdk.
    • Select openjdk-7-jdk for installation. Depending on the package manager, you may be asked if you wish to install the required dependencies or it will automatically select them without confirmation. For example, the openjdk-7-jre was already selected by Synaptic Package Manager. If you want to use Java as a plug-in in your browser, then also select to install icedtea-7-plugin.
  3. 3.Apply the changes. Click the button to apply the changes. Depending on the package manager, a pop-up window may appear asking for you to confirm the changes.
  4. 4.Wait for Java to install.

Ubuntu Method Using a Console

  1. 1.Enter one of the following commands into your console program:
    • sudo apt-get install openjdk-7-jdk openjdk-7-jre (if you don’t want the browser plug-in)
    • sudo apt-get install openjdk-7-jdk openjdk-7-jre icedtea-7-plugin (if you do need the plug-in)
    • apt-get automatically takes care of the dependencies and lists the changes for confirmation.
  2. 2.Enter y to confirm the installation.

Ubuntu OpenJDK Method Using a Console

  1. 1.Ubuntu no longer supports the Sun Java package in favor of OpenJDK.
  2. 2.Enter one of the following into your console program:
    • If you do not want the browser plugin, sudo apt-get install openjdk-6-jre.
    • If you do want the browser plugin, sudo apt-get install openjdk-6-jre icedtea6-plugin
    • If you’re working on a server without graphics, and want an environment just for running server applications (e.e. Tomcat or Glassfish), sudo apt-get install –no-install-recommends openjdk-6-jre-headless
    • If you need the full JDK (for writing Java programs): sudo apt-get install openjdk-6-jdk
    • apt-get automatically takes care of the dependencies and lists the changes for confirmation.
  3. 3.Enter y to confirm the installation.

Tips

  • It’s much easier to install from the repositories than from the download on Oracle’s site.
  • Even though it might be unfamiliar to you, using the console method is actually easier than the GUI method.
  • If you find how-to specific for your distribution we recommend using it because in some distributions, Java can be included in the software repositories (which you can benefit from).
  • On Red Hat 8.0 Linux, one could start a Nautilus file manager, desending to the directory, and click on the name of the rpm filename and activate the installation process. This does not work any more in Fedora Core 4 (other FC versions not tested). In reality, if you do this you will get a (warning) message saying that the file name indicates the file is not executable while the content of the file is of the type “executable”.
  • Another tip to follow progress of the rpm install is to use ‘rpm -ivv … ‘ which turns on theverbose output and gives you more info on the install as it progresses. You can do the same thing with other rpm actions to get rpm to be more verbose about what is going on.

Sources and Citations

  1.  www.oracle.com/technetwork/java/javase/downloads/index.html
  2.  www.oracle.com/technetwork/java/javase/downloads/index.html

学习Web应用漏洞最好的教程—-WebGoat

WebGoat是一个用于讲解典型web漏洞的基于J2EE架构的web应用,他由著名的WEB应用安全研究组织OWASP精心设计并不断更新,目前的版本已经到了5.0。WebGoat本身是一系列教程,其中设计了大量的web缺陷,一步步的指导用户如何去利用这些漏洞进行攻击,同时也指出了如何在程序设计和编码时避免这些漏洞。Web应用程序的设计者和测试者都可以在WebGoat中找到自己感兴趣的部分。
虽然WebGoat中对于如何利用漏洞给出了大量的解释,但是还是比较有限,尤其是对于初学者来说,但觉得这正是其特色之处:WebGoat的每个教程都明确告诉你存在什么漏洞,但是如何去攻破要你自己去查阅资料,了解该漏洞的原理、特征和攻击方法,甚至要自己去找攻击辅助工具,当你成功时,WebGoat会给出一个红色的Congratulation,让你很有成就感!(咱号称搞技术的不就需要这个吗?)

WebGoat甚至支持在其中加入自己的教程,具体方法可以查看其说明文档

WebGoat中包括的漏洞教程主要有

Cross-site Scripting (XSS)
Access Control
Thread Safety
Hidden Form Field Manipulation
Parameter Manipulation
Weak Session Cookies
Blind SQL Injection
Numeric SQL Injection
String SQL Injection
Web Services
Fail Open Authentication
Dangers of HTML Comments

 

建议在使用WebGoat时对照OWASP的文档来看,比较有用的是下面三个:

OWASP Testing Guide 3.0
OWASP Code Review Guide 1.1
OWASP Development Guide 2.0
如果你以前没有接触过OWASP,当你看到这些文档时,应该会有一种感觉叫做兴奋。

 

下面简单说一下安装方法(windows下):
先下载webscarab-current.zip(这个自带tomcat,还有一个下载方式是war文件,需要自己安装tomcat,建议使用第一个),地址为http://www.owasp.org/index.php/Category:OWASP_WebGoat_Project,解压到一个文件夹,运行webgoat.bat即可启动其自带的tomcat,通过访问http://localhost/WebGoat/attack,输入用户名guest,密码guest即可进入。如下图所示:
webgoat1

有一点值得注意的是默认Tomcat只开放在127.0.0.1的80端口,其他的机器没有办法访问,这也是为了安全考虑,因为WebGoat中的漏洞实在太多了。如果是拿来学习,建议还是将其开在0.0.0.0上,修改tomcat下conf中server-80.xml,将其中的所有127.0.0.1改为0.0.0.0并重新运行webgoat.bat即可。server-8080.xml也可以改,但是要运行webgoat_8080.bat才有效果,
知道有WebGoat这个好东东得益于一次和Fortify厂商的接触,Fortify也是OWASP的主要资助者,他们的程序跟踪分析器(PTA)和静态代码分析器(SCA)常常拿WebGoat来做演示。但是很可惜,没有保存Fortify的分析结果,Fortify也不提供个demo版,只好先拿IBM(收购自WatchFire)的AppScan来看看WebGoat中是否有那么多漏洞,下面是扫描结果:

WebGoat2-appscan

 

的确漏洞无数!好了,开始学习吧!

E-Mail is forever—美国教授亲授,跟教授通邮件的18种礼仪

当你正身处美国校园,一步一步的完成你的美国梦。但是与当地学生以及教授之间的交流是否存在问题呢?其实,无论你是何种文化背景,在现今这个生活节奏越来越快的社会,某些细节也许就能体现你的与众不同。正所谓“细节决定成败”,与教授的交流中,有些小细节可能就会改变他对你的看法。

当然,在步入数字化时代的现今,教授也像其他人一样,越来越依赖电子化操作。除了平时的办公时间,以及课堂上面对面交流,或许他们更愿意通过电子邮件与你探讨问题和看法。但是在你点击发送键前,有些事情也是需要考虑一下的。

1. E-mail is forever. Once you send it off, you can’t get it back. Once your professor has it, he or she owns it and can save it or, in the worst case, forward it onto colleagues for a good laugh—at your expense.
邮件是永久性的。一旦你把它发出去了,就不可能再收回来了。只要教授收到了邮件,他就主宰了这封邮件的命运,或者保存,或者是把邮件转发给同事博取一笑(这是最糟的情况)——后果自负哦。

2. E-mail goes where it’s told. Check—and double check—to see that the right address appears in the “To” line. Just because your mom and your professor are both named “Lynn” is no reason to send all your love to Professor Lynn.
邮件要发到你被告知的邮箱里。检查,再检查,看“发送到”那一栏的地址是不是正确。仅仅因为你的妈妈和你的教授的名字都是”Lynn”,也没有理由把你所有的爱都寄送到了Lynn教授那里吧。

3. Professors might not be using the cruddy university e-mail system. So send it to the address they actually use, not the one on the university directory. (Check the syllabus or assignment sheet for clues.)
教授可能不使用大学的乱七八糟的邮箱系统。所以把邮件发送到他们真正在用的邮箱地址,而不是大学通讯录上的邮箱地址。(检查一下他们的个人摘要或者任务分配表来寻找一些线索。)

4. Professors might not open mail sent from luckydogpig@thepound.com. They prefer to open mail sent from more reputable addresses, like you@theCruddyUniversityE-mailSystem.edu.
教授可能不会打开一封发自luckydogpig@thepound.com的邮件。他们更喜欢打开那些来自比较有名的邮箱地址,就像you@theCruddyUniversityE-mailSystem.edu。

5. Subject lines are for subjects. Put a brief explanation of the nature of the e-mail (like “question about paper”) in the subject line. Never include demands such as “urgent request—immediate response needed.” That’s the surest way to get your request trashed.
主题栏要紧扣主题。在主题栏要对这封邮件有一个简要的解释。千万不要包含一些要求,比如说“紧急请求–请立即回复”,可以很肯定的说,你的请求会像垃圾一样处理掉。

6. Salutations matter. The safest way to start is with “Dear Professor So and So” (using their last name). That way you won’t be getting into the issue of whether the prof has a Ph.D. or not, and you won’t seem sexist when you address your female-professor as “Ms.” or, worse yet, “Mrs. This and That.”
称呼很重要。最安全的开头方式是用“亲爱的×××教授”。这样的话你就不会再考虑这个教授是不是个博士或其他,并且当你称呼你的女教授“Ms”或者“Mrs.”也不会显得像是个性别歧视者。

7. Clear and concise is best. Your prof might get 25 or 30 E-mails a day, so, it’s best if you ask your questions in as focused and succinct a way as possible. (Hint: it’s often good to number your questions). And, if your question is very elaborate or multifaceted, it’s best to go to an in-person office hour. You’ll get better service that way.
清楚简洁是最好的。你的教授每天会收到25-30封邮件,所以如果你的问题很简洁明了那是最好的(一般把问题一条条列出来比较好)。如果你的问题表述的很详尽或者多层面的,最好在教授的办公时间面谈,这样教授就能够更有效地帮你解决问题。

8. Always acknowledge. If your professor deigns to answer—or send you the handout or reference that you asked for—be sure to tell him or her that you got it. That way he or she will think kindly of you next time they see you in class.
必须要告知教授已收到邮件。如果你的教授屈尊给你回答或者发送你需要的资料,一定要告诉他你已经收到了。这样,下次在课堂上看到你的时候,他们就会觉得你是个不错的学生。

9. THIS IS NOT A SHOUTING MATCH. Don’t write in all uppercase letters, which is an E-mail convention for anger or other strong emotions. No one likes yelling.
这不是大声嚷嚷的争吵。邮件不要都用大写字母来写,因为这是一种在邮件中表达愤怒或者其他强烈的感情的方式。没有人喜欢喊叫的。

10. No one really likes emoticons and smileys. Trust us on this one. 🙂
没有人真的喜欢表情符号和微笑符。请相信这一点。

11. This is not Facebook. Don’t write the professor in the way you’d write on your friend’s wall.
这不是Facebook。你写给教授的邮件不要像你在朋友留言板上的留言一样。
重要提示:千万不要和你的教授开玩笑,这个时候,无论多可笑都不可以。

12. This is not IM-ing. So pls dun wrte yor profeSR lIk ur txtN. uz abbrz @ yor own rsk. coRec me f Im wrng.
这不是写即时消息….所以不要像写短消息一样用单词的缩写形式,你绝对是在冒风险。(如果我说的不对请改正)

13. This is not CollegeHumor. Resist the temptation to talk about the “bad ass” paper you need help with, your “loser” TA who didn’t teach you what you needed to know, or the “crappy” grade you just got on the midterm.

这不是校园幽默。不要随意拿以下的事情当谈资:你的论文很难搞,你那个“很衰”助教都不教些你想知道的东西,或者是你期中考试考了个很烂的分数。

14. This is not RateMyProfessors.com. The professor doesn’t want your comments about his or her performance in the class. Save those for the end-of-semester evaluations, where you’ll be able to spout off. Anonymously.
这不是在评价你的教授。没有教授想听你评价他们的课堂表现,所以把你的意见留到期末评价中,你可以滔滔不绝地表达出你对老师的看法,而且是匿名的。

15. Spelling mistakes make you look like a doofus. So always use the spel check, and proofread yyour e-mail, two
拼写错误会使你看起来像个笨蛋。所以每次都要使用拼写检查,并校对你的邮件两遍。

16. Signoffs and signatures count. Always end by thanking the professor for his or her time, and closing with “Best wishes” or “Regards” (or some other relatively formal, but friendly, closing). And always sign with your (entire) real name, not some wacky nickname like Ry-Ry or Biff.
最后的签名很重要。每封邮件最后都要感谢教授抽出时间来帮助你,并以“Best Wishes、Regards”来结尾。(或者其他相关的正式语,但是要用友好的语气。)然后签上你的全名,而不是什么昵称,就像Ry-Ry 或者 Biff。

17. Your prof doesn’t want to hear your philosophy of life. Skip the cute quotes or statements of your religious or political views at the bottom of your E-mail. You never know what offends.
你的教授不想听你讲你的人生哲学。在你的邮件最后不要说什么你引用的宗教或者政治观点。你永远不知道这些会不会冒犯你的教授。

18. Don’t lay it on too thick. It’s one thing to be polite and friendly in your e-mail; it’s another thing to wind up with a brown nose.
不要太过殷勤。在邮件中表现出礼貌和友好很重要,但是要适度,不要搞得像是在阿谀奉承。

使用Sencha Architect 2快速搞定Web App的UI

Ext JS是啥
首先簡單介紹一下Ext JS好了。不知道大家有沒有用過miroko?他是N年前我跟水利系室友非常愛用的免費服務,可以幫你掛BT並存到他所提供的網路硬碟空間內,對學術網路頻寬超級大,一秒可以衝到5~10Mb。(但是自從開始收費就跟它再會了) 它那種淡藍色UI,就是使用當時剛推出的Ext JS 1.0刻的。還是沒啥畫面嗎?這裡有真相

進入正題前,先看看官方提供的範例長怎樣吧!

feed1
圖:官方的範例之一:Feed Viewer,阿就藍藍的,非常的『2007』

簡而言之,Ext JS是Sencha公司推出的一個純JS的Web前端框架,提供一般Web App會用到的UI元件(按鈕、表格、Tab…)讓你實作出想要的user flow;且便於繼承擴充,定義出自己客製的元件;另外也提供許多好用的JS utility及Ajax Data Source支援,跟後端CRUD做完美的配合。在外觀上,預設主題是簡單但有點過時的淡藍色,不過他的主題是以SASS/Compass實作,因此只要找對美工,也是可以盡情揮灑的。目前它大多應用於企業端的內部Web Application based的資訊系統(至少敝公司將它視為UI標準之一orz,另外不知道為啥,在大陸跟日本的開發者社群似乎都相當發達)。我個人認為它的優點在於良好的繼承架構、便於快速開發及擴充,還有完整豐富的社群、官方支援及API(用商業化套件的好處就在於任何奇怪、無恥的問題只要PO個版就有解,瀏覽器相容等問題都不用自己去搞,也不會叫你RTFM);但是相對的,跟jQuery+jQuery UI的方便性比起來,它的缺點是架構較為固定,很難去把它的架構翻掉自己重新設計;另外最重要的,它在某些情況可能要錢
kitchensink1
圖:Ext JS 4.1 提供的Nepune主題

授權
其實寫這篇文章真的有點掙扎,因為真的像是業配文orz。還是先來講講授權的部分:Ext Core是Ext JS的核心,提供類似於jQuery的DOM操作等功能,是免費的且使用MIT License;打個比方:Ext Core之於Ext JS,就如同jQuery之於jQuery UI。雖然Ext JS也算是開源的,但它的授權就比較複雜。如果也是用於open source開發,則適用GPLv3;如果是商業用途且將原始碼視為公司proprietary,則適用Sencha Commercial License;如果是要把它做成另外的商業化SDK(如Ext.NET),Sencha也提供OEM License。而今天要講的Sencha Architect,則是Sencha推出的架構設計工具,一套要價$399鎂,但提供免費試用。

開始使用Sencha Architect做第一個Ext JS的UI
進入正題,前幾天Sencha發表了最新的Sencha Architect 2 (梗在這,因為它以前叫Ext Designer,現在升級變Architect XD)。它是一個強大的東西,只要拉一拉、摳一摳,十分鐘就可以把UI刻好了。除了拉UI之外,它之所以會改名為Architect,是因為它可以直接在裡面寫code、做event handling、甚至定義MVC架構。(另外一大賣點是可以開發Sencha Touch當成手機App,但是本周主題是Web App,所以就不提這段XD)這篇文也不會涉獵到太深的架構部分,目標先設定在快速上手並做出一個會動的Web UI。話不多說,讓我們開始吧(羞)

下載並安裝
載點在此,試用前須註冊Sencha Forum的帳號。它本身是以QT及其內建Webkit寫成的跨平台程式,可以在Windows/MacOS/Linux上執行。將程式打開之後,可以看到一個很熟悉的WYSIWYG所見及所得編輯器:左邊是工具箱、中間是畫布、右上是階層圖、右下是一欄欄的屬性。
wysiwyg1
圖:Sencha Architect跑起來的樣子

開始拉UI
迫不及待要從左邊拉東西進來了吧?首先,身為一個web app,會需要的是一個viewport。它可以把整個網頁的畫面撐開,讓我們在裡面做layout。
viewport6
圖:把整個Web App畫面撐開的東西是Viewport

繼續瘋狂拉東西進來之前,還是要先對Ext JS所提供的各種layout有基本的認識。這個Ext Layout Browser裡面有各種layout的DEMO及基本介紹。一般來說,我們常常在web app的最外面使用Border Layout,將畫面分成東南西北中發板幾塊(region)。
要設定這個viewport的layout類型,可以在右邊屬性中找到layout下拉選取,或是在畫布上的藍色齒輪跳出的快速設定popup中選取。接下來真的就可以從左邊亂拉元件了。要注意的是,若是在一個border layout的container裡面,它需要有一個region: ‘center’ (中央)的子元件;其他東西南北則不一定要有。拉完之後可能長這樣
region6
圖:Border Layout的示意圖,紅色框起來的地方套用了border layout

以下面的圖為例,我西邊放了一個Tree Panel,將它的collapsible(可收合)及split(邊緣分割線)屬性設為true;中間則放了一個包含三個tab的Tab Panel。在第一個Tab,我將它的layout設為absolute,這時候畫面上會出現格線方便我們直接拖拉調整子元件的位置。若要將表單欄位貼到最右邊,可以將anchor屬性設為100%。
在我們拉表單的時候,可以在畫布上的元件按右鍵使用duplicate功能快速複製;複製後可用transform將其轉為其他類別的元件(如:將combo box下拉選單欄位轉為date field日期欄位。它們都是繼承Ext.form.field.Base)。

看看內建的API文件
Sencha Architect的一大優點就是它本身整合了Ext的documentation,大幅減少了設計時翻文件的痛苦。如下圖,在左邊的工具箱中點每個元件後,下方都會出現簡單說明;另外,在屬性視窗中的每個屬性旁都有一個問號,滑鼠移上去也會秀出簡單說明。若是想看完整的document,也可以點連結直接跳到線上API去看。
api1
圖:Sencha Architect中內建的documentation功能

看看很好很強大的線上API文件吧!
Ext的原始碼本身是以JS Doc形式做self-documentation的。Sencha也開發了一個工具叫JS Duck將原始碼直接變成像這樣的API網站。裡面可以看到它提供所有的功能,元件Class的繼承hierarchy,還有範例以及別人的評論。這裡面真的很值得探索!

事件處理
若是我想讓user按按鈕之後,將左邊的tree收起來,該怎麼做?(例子很爛請包涵XD) 首先我們先將左邊的tree panel取一個ID叫myTreePanel。有了ID之後,在任何地方都可以使用Ext.getCmp(‘元件ID’)來取得該元件,並進行操作。(題外話,當然這不是唯一方法。若是熟悉CSS selector,也可以用類似jQuery的方法來取得元件,如query、up、down等等。這種寫法相當適合controller使用。)
id6
圖:給咱們Tree panel一個ID

接下來,在button的屬性視窗中加入一個event handler如下圖。一個按鈕所有可能觸發的event全部在下拉選單列給我們看了!很直覺地,click應該就是我們要的(通常試試看就知道是不是我們要的了)。
event6
圖:給button加一個click的event

然後就可以開始寫code了!這一行是利用剛剛設定的ID來拿到左邊的tree,並將它收合。
code6
圖:將左邊的tree收合

簡單吧!到這邊已經可以lay出複雜且會動的UI了!

Data Model與Store
在企業的web application中,前端需要的資料大多從後端DB過來。只要是有『吃資料』的元件,都需指定一個store給它,裡面存有前端畫面需要的所有資料。在store裡面需定義該store所需要存取的欄位(可以直接在store的fields屬性中定義欄位,也可以指定一個定義好的Data Model給它。)。以combo box(下拉選單)為例,它通常需要兩個欄位:顯示文字與實際值。
依照與後端溝通的方式,Ext提供了各種不同的proxy供store使用。另外根據回傳的資料形式不同,也提供了不同的reader供proxy使用。像我最常用的應該是Ajax Proxy搭配Json Reader。舉例來說,若是我們要做一個性別的選單,而資料由後端某個URL傳回來的Json格式如下:

  1. {
  2.     “total”: 2,
  3.     “data”: [
  4.         {“gender”: “M”, “genderText”: “男性”},
  5.         {“gender”: “F”, “genderText”: “女性”}
  6.     ]
  7. }

則需在store新增兩個field:gender和genderText;在proxy的url打上該URL;在reader的root屬性設成”data”(請看上面的json,我們要的資料是在data裡面)。

我知道這又是個爛例子,因為性別其實hard-code就好了XD。下圖是hard-code的combo box store作法: 建立一個Json Store,在field內加兩個欄位;在data裡面hard-code我們的資料;將proxy砍掉。
store6
圖:Store裡的設定

Combo box部分,將store指向上面定義的MyJsonStore;將displayField跟valueField分別設成我們的顯示文字與實際值欄位名;將queryMode設成”local”(若設成remote,當user在combo box敲字篩選時,會在url後面加上?query=xxx然後去問後端,方便後端做篩選處理)。
combo4
圖:Combo box裡的設定

佈署到local並預覽
剛看到Sencha Architect畫面時,一定會想試試看preview跟deploy按鈕到底是在做啥。其實也沒啥,就是幫我們deploy到web server再開啟瀏覽器預覽。須先在settings設定路徑如下圖。另外建議將Ext JS Path改成4.1的http://extjs.cachefly.net/ext-4.1.0-gpl/。
settings5
圖:專案設定畫面

Application及MVC架構
雖然這超出本文涵蓋的主題,但還是稍微談一下好了。當Web App規模大到一定程度時,想必會開始思考如何組織程式碼,讓它可讀性變高,還有方便maintain、動態載入及效能等等架構面的問題。若是有看過backbone.js、require.js、knockout.js等工具的介紹文,應該會對現在流行的架構概念有所認識。其實Ext JS也有它自己類似AMD的機制;如果要做類似backbone的hash routing,也可以透過Ext.history(但它還是用hidden iframe囧 要支援舊瀏覽器沒辦法);最重要的,它的MVC架構設計也是相當優秀,值得另開專文深入討論之。若想瞭解,可以參考這篇官方介紹。看完之後,相信會迫不及待地從左邊工具箱拖出controller來玩玩看吧!

好文分享:
Ext JS 4的Application/MVC架構概觀
Deft JS: Loosely Coupled MVC through Dependency Injection – John Yanarella
下面這幾個archticture tool相關文章也非常值得看看,但跟Ext沒關係
Backbone.js X RequireJS Quick Guide – 大澤木小鐵
介紹Knockout.js的MVVM:Understanding MVVM – A Guide For JavaScript Developers – Addy Osmani

整合後端開發
在瞭解他匯出的行為之後,就會發現其實很容易跟後端開發的專案進行整合。其中會遇到的一個問題就是他跑AMD動態載入JS Class時的路徑是否跟專案中的目錄架構是一樣的,這時候就要對Ext.application中的appFolder屬性做調整。我去年的一篇文章是以Java EE的Web project為例,將Ext Designer 1.2整合Eclipse進行開發。
好文分享:
Node.js+mongodb+EditGrid範例

IE8效能問題
這年頭很多人都愛用Firefox或Chrome進行開發,但是很遺憾的,咱們user可沒那麼先進。更令人沮喪的是Ext JS 4.0至4.0.7版本在IE8以下都有嚴重的效能問題。Sencha的解釋如下:

Ext JS 4 features a brand new rendering pipeline that is significantly more structured and extensible than the rendering process in Ext JS 3. All Components now render the same way, and are driven by XTemplates. They also follow a common hook point regime, enabling the framework and developers to extend or hook into the render process for each Component.
While the new rendering architecture is a big step forward, it did create slow performance in some cases. In 4.0.1 and before the order of operations in the rendering process was not as efficient as it could have been, resulting in many more DOM updates than are actually needed. In 4.0.2 we have corrected this behavior, yielding significant render speed improvements.
We have already identified further optimizations to the rendering pipeline that will be incorporated into Ext JS 4.0.3 and beyond. Performance is very important to all of us and making the framework as fast as we know it can be will remain a top priority for the team.

因此這次公開的4.1版主要就是focus在解決在IE的效能問題,現在已經有改善許多。 但是,在開發期間,良心建議您偶爾還是把IE開來跑跑看,免得像小弟當初一樣,發現時已經距引咎辭職(刪除線)上線的日子不遠矣!

在Linux下,SVN服务器的权限配置

言归正传,按照前面的教程装完1.5.5版以后,当svnadmin create /home/svn/yourproject创建仓库后,应该在仓库目录下的config目录有3个文件——authz、passwd、svnserve.conf。

下面对3个文件进行说明:

svnserve.conf是基础的配置,用于控制访问的权限将[general]前的注释与空格去掉,一定要去掉空格,否则到时客户端登录会出现”Section header must start in the first column的”的告警!亲身体会啊!!最后此文件内容至少包含以下内容:

[general]

anon-access = none

auth-access = write

password-db = passwd

authz-db = authz

其中,anon-access = none禁止匿名登录,auth-access = write为署名登录获得写权限,password-db = passwd指定用户配置文件,authz-db = authz指定权限配置文件

————————————————

passwd是用户配置文件,用于设置用户名以及密码

格式为:

[users]

<用户1> = <密码1>

<用户2> = <密码2>

其中用户名,密码不能为中文,至少我设中文登录时提示没有该用户

[users]是必须的。下面列出要访问svn的用户,每个用户一行。

示例:

[users]

alan = password

king = hello

这个里面的user表示当前test版本库的成员

——————————————————

authz是详细的用户授权文件

格式如下(以下内容转载,感谢原创):

  用户组格式:

[groups]

<用户组名> = <用户1>,<用户2>

  其中,1个用户组可以包含1个或多个用户,用户间以逗号分隔。用户必须要在passwd文件里能找到,它是给那个里面的user赋权限.

  版本库目录格式:

[/目录]

@<用户组名> = <权限>

<用户名> = <权限>

  示例:

  [groups]

  admin = alan

  [/]

  @admin = rw

  [/svn/p1/WebProject]

  king = rw(表示king能够读写/svn/p1/WebProject目录下的所有信息)

  [/svn/p1/web]

  zp=r(表示zp能够读/svn/p1/web目录下的所有信息)

————————————

以下是自己的体会:

注意:@admin代表整个组,king 在这里只是一个用户

关于访问路径[/目录],其完整格式[repos-name:path]或者[path],repos-name是版本库的名字

注意:在authz中如果要设定中文文件夹的路径,例如[/测试],请在linux在双击文件用默认记事本打开,然后另存为,注意将编码格式改为UNICODE UTF-8,否则在windows下用TortoiseSVN进行操作时,该中文路径的权限设置会有问题!此乃我的实际测试

当你用的中文svn客户端,并且又出现[瘉澶辫触]的错误不能够签入和签出,那么请检查authz的[path]权限等是否正确

Linux下关于subversion权限配置问题

我们在Linux下安装svn时,会发现这么一个问题,所有配置svn的过程自己都认为成功了,为什么一到客户端访问就会出现这样的提示呢:

Authorization failed

其实这个是权限配置的问题,说白了就是目录没配置对,并且你也没访问对。其实svn的配置不是很难,难的是你怎么用你清晰的思路去理解,以下说一下我是怎么进行配置的:

Subversion启动时候一定要注意应该启动哪个目录,这个细节将直接影响到你最后将给予目录权限的配置文件authz上面。

1、启动: svnserve –d –r /

这样的话在authz里就该:

[test:/] //可以访问test目录下所有文件(test是我在/根下建立的一个文件夹)

086php = rw //具有读写权限

? = r // 除了上面的用户,其他用户只有读的权限

客户端访问应该是这样:

IP test 例:svn://192.168.0.1/test

例如我想访问svn://192.168.0.1 下的所有目录,那么我们就得需要更新svn运行的目录,以及authz文件了。(test是我的仓库)

2、启动:svnserve –d –r /test

Authz文件内容:

[/]

086php = rw

这样你就可以直接访问svn://192.168.0.1目录下的所有文件,其实也就是我的仓库test下的所目录

3、如果你想访问test下的一个目录的话:

启动:svnserve –d –r /

Authz:

[test:/其他目录]

086php = rw

以后访问地址将:svn://192.168.0.1/目录

4、启动:svnserve –d –r /test

Authz:

[/其他目录即可,无需加test仓库名]

086php = r

访问地址变成了:

svn://192.168.0.1/其他目录

ubuntu下svn服务器的安装配置

1.SubVersion服务安装

1
2
sudo apt-get install subversion
sudo apt-get install libapache2-svn

2.服务器配置 
2.1相关用户、组的设定
将自己和“www-data”(Apache 用户)加入组subversion中

1
2
sudo addgroup subversion
sudo usermod -G subversion -a www-data

看下结果:

1
 cat /etc/group|grep subversion

这里注意,需要注销然后再登录以便您能够成为 subversion 组的一员,然后就可以执行签入文件(Check in,也称提交文件)的操作了
仓库位置我们就放在/home/svn下吧:

1
sudo mkdir /home/svn

2.2配置subversion
编辑/etc/subversion/config 文件,修改相关设置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
### Section for configuring miscelleneous Subversion options.
[miscellany]
global-ignores = *.o *.lo *.la *.al .libs *.so *.so.[0-9]* *.a *.pyc *.pyo *.rej *~ #*# .#* .*.swp .DS_Store
### Set mime-types-file to a MIME type registry file, used to
### provide hints to Subversion’s MIME type auto-detection
### algorithm.
# mime-types-file = /path/to/mime.types

### Set enable-auto-props to ‘yes’ to enable automatic properties
### for ‘svn add’ and ‘svn import’, it defaults to ‘no’.
### Automatic properties are defined in the section ‘auto-props’.
enable-auto-props = yes

### Section for configuring automatic properties.
[auto-props]
### The format of the entries is:
###   file-name-pattern = propname[=value][;propname[=value]…]
### The file-name-pattern can contain wildcards (such as ‘*’ and
### ‘?’).  All entries which match (case-insensitively) will be
### applied to the file.  Note that auto-props functionality
### must be enabled, which is typically done by setting the
### ‘enable-auto-props’ option.
*.c = svn:eol-style=native
*.cpp = svn:eol-style=native
*.h = svn:eol-style=native
*.dsp = svn:eol-style=CRLF
*.dsw = svn:eol-style=CRLF
*.sh = svn:eol-style=native;svn:executable
*.txt = svn:eol-style=native
*.png = svn:mime-type=image/png
*.jpg = svn:mime-type=image/jpeg
Makefile = svn:eol-style=native
*.php = svn:keywords=Id Rev Date URL Revision Author

global-ignores是提交时忽略的文件类型,启用auto-props后,让subversion自动添加Id,Revision等keywords
这样就可以使用svn的keywords了。特别是eclipse里就方便多了。设置一下就可以使用
$$Id$$、$$Reversion $$、$$Date $$、$$Author$$ 、$$URL$$作为注释模板的内容,方便极了。

如果在客户端访问subversion版本库时出现这个错误:
svnserve.conf:102: Option expected
为什么会出现这个错误呢,就是因为subversion读取配置文件svnserve.conf时,无法识别有前置空格的配置文件。
要避免出现这个错误,应该在去掉这些行前的#时,也要顺手去掉前面的空格。

3.apache mod_dav_svn 配置
通过 WebDAV 协议访问(http://) 
关于WebDAV :

WebDAV (Web-based Distributed Authoring and Versioning) 一种基于 HTTP 1.1协议的通信协议.它扩展了HTTP 1.1,在GET、POST、HEAD等几个HTTP标准方法以外添加了一些新的方法,使应用程序可直接对Web Server直接读写,并支持写文件锁定(Locking)及解锁(Unlock),还可以支持文件的版本控制。

编辑 /etc/apache2/mods-available/dav_svn.conf :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
root@hywd:/etc/apache2/mods-available# cat dav_svn.conf
# dav_svn.conf – Example Subversion/Apache configuration
#
# For details and further options see the Apache user manual and
# the Subversion book.
#
# NOTE: for a setup with multiple vhosts, you will want to do this
# configuration in /etc/apache2/sites-available/*, not here.

#
# URL controls how the repository appears to the outside world.
# In this example clients access the repository as http://hostname/svn/
# Note, a literal /svn should NOT exist in your document root.

#enable the repository
DAV svn

# Set this to the path to your repository
#SVNPath /home/svn/vod
# Alternatively, use SVNParentPath if you have multiple repositories under
# under a single directory (/var/lib/svn/repo1, /var/lib/svn/repo2, …).
# You need either SVNPath and SVNParentPath, but not both.
#用这个,以便放多个repository
SVNParentPath /home/svn

# Basic Authentication is repository-wide.  It is not secure unless
# you are using https.  See the ‘htpasswd’ command to create and
# manage the password file – and the documentation for the
# ‘auth_basic’ and ‘authn_file’ modules, which you will need for this
# (enable them with ‘a2enmod’).
AuthType Basic
AuthName “Subversion Repository”
#指定基本用户验证的密码文件存放位置
AuthUserFile /etc/subversion/dav_svn.passwd

# To enable authorization via mod_authz_svn
#mod_authz_svn配置文件的位置
AuthzSVNAccessFile /etc/subversion/dav_svn.authz

# The following three lines allow anonymous read, but make
# committers authenticate themselves.  It requires the ‘authz_user’
# module (enable it with ‘a2enmod’).
#
Require valid-user
#

重启 Apache 2 Web 服务器

1
sudo /etc/init.d/apache2 restart

4.创建 SVN 文件仓库

1
2
3
4
5
6
7
cd /home/svn
sudo mkdir myproject
#更改版本库所属用户、组
sudo chown -R root:subversion myproject
sudo svnadmin create /home/svn/myproject
#赋予组成员对所有新加入文件仓库的文件拥有相应的权限:
sudo chmod -R g+rws myproject

5.密码文件dav_svn.passwd的创建

1
sudo htpasswd -c /etc/subversion/dav_svn.passwd user_name

它会提示你输入密码,当您输入了密码,该用户就建立了。“-c”选项表示创建新的/etc/subversion/dav_svn.passwd 文件,所以user_name所指的用户将是文件中唯一的用户。如果要添加其他用户,则去掉“-c”选项即可:
sudo htpasswd /etc/subversion/dav_svn.passwd other_user_name

6.授权配置文件dav_svn.authz
这里我指定了两个组:管理员组和测试组,指定了两个仓库(vod 、 ThinkPHP 和ftpuserms)的权限 。
vod仓库下管理员组设置为读写权限,测试组只有读的权限
ThinkPHP仓库下管理员组设置为读写权限,测试组只有读的权限
定义ftpuserms储存库下test目录的访问权限:
禁止所有用户访问,星号代表所有用户,权限为空代表没有任何权限
打开test3用户的读权限,打开administrator组的读写权限

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[groups]
administrator=admin,yuan
tester=test1,test2,test3

[vod:/]
@administrator=rw
tester=r

[ThinkPHP:/]
@administrator=rw
tester=r

[ftpuserms:/test]
@administrator=rw
*=
test3=r

启动SVN服务器:

1
killall svnserve; svnserve -d -r /home/svn/

您可以通过下面的命令来访问文件仓库:

1
svn co http://hostname/svn/myproject myproject –username user_name –password passwd

创建目录试试:

1
svn mkdir “http://localhost/svn/vod/branches” “http://localhost/svn/vod/tags” “http://localhost/svn/vod/trunk” -m “create a new project vod” –username vod –password passwd

createfold

auth

如果在Check in的时候遇到如下错误:
Can’t open ‘/home/svn/myproject/db/txn-current-lock’: Permission denied
查看txn-current-lock文件的权限和用户以及组信息,应该类似于:

1
ls -l /home/svn/myproject/db/txn-current-lock

-rw-rwSr– 1 root subversion 0 2009-06-18 15:33 txn-current-lock

除了权限以外,用户及其组如果不对,则仍然会遇到上述问题,可以再次运行命令:

1
sudo chown -R root:subversion myproject

参考文章:
http://www.blogjava.net/rain1102/archive/2009/02/23/256338.html
http://bbs.iusesvn.com/thread-6-1-1.html
http://snowolf.javaeye.com/blog/740347
http://wiki.ubuntu.org.cn/index.php?title=SubVersion&variant=zh-cn#.E9.80.9A.E8.BF.87_WebDAV_.E5.8D.8F.E8.AE.AE.E8.AE.BF.E9.97.AE.28http:.2F.2F.29

28个Unix/Linux的命令行神器

下面是Kristóf Kovács收集的28个Unix/Linux下的28个命令行下的工具(原文链接),有一些是大家熟悉的,有一些是非常有用的,有一些是不为人知的。这些工具都非常不错,希望每个人都知道。本篇文章还在Hacker News上被讨论,你可以过去看看。我以作者的原文中加入了官网链接和一些说明。

dstat & sar

iostat, vmstat, ifstat 三合一的工具,用来查看系统性能(我在《性能调优攻略》中提到过那三个xxstat工具)。

官方网站:http://dag.wieers.com/rpm/packages/dstat/

你可以这样使用:

1
alias dstat='dstat -cdlmnpsy'

dstat_screenshot

slurm

查看网络流量的一个工具

官方网站:  Simple Linux Utility for Resource Management

 

slurm_screenshot

 

vim & emacs

真正程序员的代码编辑器。

vim_screenshot

 

screen, dtach, tmux, byobu

你是不是经常需要 SSH 或者 telent 远程登录到 Linux 服务器?你是不是经常为一些长时间运行的任务而头疼,比如系统备份、ftp 传输等等。通常情况下我们都是为每一个这样的任务开一个远程终端窗口,因为他们执行的时间太长了。必须等待它执行完毕,在此期间可不能关掉窗口或者断开连接,否则这个任务就会被杀掉,一切半途而废了。

Screen是一个可以在多个进程之间多路复用一个物理终端的窗口管理器。Screen中有会话的概念,用户可以在一个screen会话中创建多个screen窗口,在每一个screen窗口中就像操作一个真实的telnet/SSH连接窗口那样。请参看IBM DeveloperWorks的这篇文章《使用 screen 管理你的远程会话

gnu_screen_screenshot1

dtach 是用来模拟screen的detach的功能的小工具,其可以让你随意地attach到各种会话上 。下图为dtach+dvtm的样子。

dtach+dvtm

tmux是一个优秀的终端复用软件,类似GNU Screen,但来自于OpenBSD,采用BSD授权。使用它最直观的好处就是,通过一个终端登录远程主机并运行tmux后,在其中可以开启多个控制台而无需再“浪费”多余的终端来连接这台远程主机;当然其功能远不止于此。与screen相比的优点:可以横向和纵向分割窗口,且窗格可以自由移动和调整大小。可在多个缓冲区进行复制和粘贴,支持跨窗口搜索;非正常断线后不需重新detach;……  有人说——与tmux相比,screen简直弱爆了

tmux3

byobu是Ubuntu开发的,在Screen的基础上进行包装,使其更加易用的一个工具。最新的Byobu,已经是基于Tmux作为后端了。可通过“byobu-tmux”这个命令行前端来接受各种与tmux一模一样的参数来控制它。Byobu的细节做的非常好,效果图如下:byobu-tmux

 

multitail

MultiTail是个用来实现同时监控多个文档、类似tail命令的功能的软件。他和tail的区别就是他会在控制台中打开多个窗口,这样使同时监控多个日志文档成为可能。他还可以看log文件的统计,合并log文件,过滤log文件,分屏,……。

官网:http://www.vanheusden.com/multitail/

multitail_screenshot

 

tpp

终端下的PPT,要是在某某大会上用这个演示PPT,就太TMD的Geek了。

官网:http://www.ngolde.de/tpp.html

tpp_screenshot1

 

xargs & parallel

Executes tasks from input (even multithread).

xargs 是一个比较古老的命令,有简单的并行功能,这个不说了。对于GNU parallel ( online manpage )来说,它不仅能够处理本机上多执行绪,还能分散至远端电脑协助处理。而使用GNU parallel前,要先确定本机有安装GNU parallel / ssh / rsync,远端电脑也要安装ssh。

xargs_screenshot

 

duplicity & rsyncrypto

Duplicity是使用rsync算法加密的高效率备份软件,Duplicity支持目录加密生产和格式上传到远程或本地文件服务器。

rsyncrypto 就是 rsync + encryption。对于rsync的算法可参看酷壳的rsync核心算法

Encrypting backup tools.

duplicity_screenshot

 

nethack & slash’em

NetHackWiki),20年历史的古老电脑游戏。没有声音,没有漂亮的界面,不过这个游戏真的很有意思。网上有个家伙说:如果你一生只做一件事情,那么玩NetHack。这句话很惹眼,但也让人觉得这个游戏很复杂不容易上手。其实,这个游戏很虽然很复杂,却容易上手。虽然玩通关很难,但上手很容易。NetHack上有许多复杂的规则,”the DevTeam thinks of everything”(开发团队想到了所有的事情)。各种各样的怪物,各种各样的武器….,有许多spoilers文件来说明其规则。除了每次开始随机生成的地图,每次玩游戏,你也都会碰到奇怪的事情: 因为喝了一种药水,变成了机器人;因为踢坏了商店的门被要求高价赔偿;你的狗为你偷来了商店的东西….. 这有点象人生,你不能完全了解这个世界,但你仍然可以选择自己的面对方式。

网上有许多文章所这是最好的电脑游戏或最好的电脑游戏之一。也许是因为它开放的源代码让人赞赏,古老的历史让人宽容,复杂的规则让人敬畏。虽然它不是当前流行的游戏,但它比任何一个当前流行的游戏都更有可能再经受20年的考验。

Slash’EM 也是一个基于NetHack的经典游戏。

nethack_screenshot1

 

lftp

利用lftp命令行ftp工具进行网站数据的增量备份,镜像,就像使用rsync一样。

lftp_screenshot

 

ack

ack是一个perl脚本,是grep的一个可选替换品。其可以对匹配字符有高亮显示。是为程序员专门设计的,默认递归搜索,省提供多种文件类型供选。

ack_screenshot

 

calcurse & remind + wyrd

calcurse是一个命令行下的日历和日程软件。remind + wyrd也很类似。关于日历,我不得不提一个Linux的Cycle日历,也是一个神器,呵呵。

calcurse_screenshot

 

newsbeuter & rsstail

newsbeuter 和 rsstail 是命令行下RSS的阅读工具。

newsbeuter_screenshot

 

powertop

做个环保的程序员,看看自己的电脑里哪些程序费电。PowerTOP 是一个让 Intel 平台的笔记本电脑节省电源的 Linux 工具。此工具由 Intel 公司发布。它可以帮助用户找出那些耗电量大的程序,通过修复或者关闭那些应用程序或进程,从而为用户节省电源。

powertop_screenshot

 

htop & iotop

htop 和 iotop  用来查看进程,内存和IO负载。

htop_screenshot

ttyrec & ipbt

ttyrec 是一个 tty 控制台录制程序,其所录制的数据文件可以使用与之配套的 ttyplay 播放。不管是你在 tty 中的各种操作,还是在 tty 中耳熟能详的软件,都可进行录制。

ipbt 是一个用来回放 ttyrec 所录制的控制台输入过程的工具。

与此类似的还有Shelr 和 termrec 

ipbt_screenshot

 

rsync

通过SSH进行文件同步的经典工具(核心算法

rsync_screenshot

 

mtr

MTR – traceroute 2.0,其是把 traceroute 和 ping 集成在一块的一个小工具 用于诊断网络。

mtr_screenshot

 

socat & netpipes

socat是一个多功能的网络工具,名字来由是” Socket CAT”,可以看作是netcat的N倍加强版。

netpipes 和socat一样,主要是用来在命令行来进行socket操作的命令,这样你就可以在Shell脚本下行进socket网络通讯了。

socat_screenshot

 

iftop & iptraf

iftopiptraf可以用来查看当前网络链接的一些流量情况。

iftop_screenshot

iptraf-tcpudp2

 

siege & tsung

Siege是一个压力测试和评测工具,设计用于WEB开发这评估应用在压力下的承受能力:可以根据配置对一个WEB站点进行多用户的并发访问,记录每个用户所有请求过程的相应时间,并在一定数量的并发访问下重复进行。

Tsung 是一个压力测试工具,可以测试包括HTTP, WebDAV, PostgreSQL, MySQL, LDAP, and XMPP/Jabber等服务器。针对 HTTP 测试,Tsung 支持 HTTP 1.0/1.1 ,包含一个代理模式的会话记录、支持 GET、POST 和 PUT 以及 DELETE 方法,支持 Cookie 和基本的 WWW 认证,同时还支持 SSL。

参看:十个免费的Web压力测试工具

siege_screenshot

 

ledger

ledger 一个命令行下记帐的小工具。

ledger_screenshot

 

taskwarrior

TaskWarrior 是一个基于命令行的 TODO 列表管理工具。主要功能包括:标签、彩色表格输出、报表和图形、大量的命令、底层API、多用户文件锁等功能。

taskwarrior_screenshot

下图是TaskWarrior 2.0的界面:

TaskWarrior2.0

 

curl

cURL是一个利用URL语法在命令行下工作的文件传输工具,1997年首次发行。它支持文件上传和下载,所以是综合传输工具,但按传统,习惯称cURL为下载工具。cURL还包含了用于程序开发的libcurl。cURL支援的通訊協定有FTP、FTPS、HTTP、HTTPS、TFTP、SFTP、Gopher、SCP、Telnet、DICT、FILE、LDAP、LDAPS、IMAP、POP3、SMTP和RTSP。

curl_screenshot

 

rtorrent & aria2

rTorrent 是一个非常简洁、优秀、非常轻量的BT客户端. 它使用了 ncurses 库以 C++ 编写, 因此它完全基于文本并在终端中运行. 将 rTorrent 用在安装有 GNU Screen 和 Secure Shell 的低端系统上作为远程的 BT 客户端是非常理想的。

aria2 是 Linux 下一个不错的高速下载工具。由于它具有分段下载引擎,所以支持从多个地址或者从一个地址的多个连接来下载同一个文件。这样自然就大大加快了文件的下载速度。aria2 也具有断点续传功能,这使你随时能够恢复已经中断的文件下载。除了支持一般的 http(s) 和 ftp 协议外,aria2 还支持 BitTorrent 协议。这意味着,你也可以使用 aria2 来下载 torrent 文件。

 rtorrent_screenshot

ttytter & earthquake

TTYtter 是一个Perl写的命令行上发Twitter的工具,可以进行所有其他平台客户端能进行的事情,当然,支持中文。脚本控、CLI控、终端控、Perl控的最愛。

Earthquake也是一个命令行上的Twitter客户端。

ttytter_screenshot

earthquake1

 

vifm & ranger

Vifm 基于ncurses的文件管理器,DOS风格,用键盘操作。

vifm_screenshot1

Ranger用 Python 完成,默认为使用 Vim 风格的按键绑定,比如 hjkl(上下左右),dd(剪切),yy(复制)等等。功能很全,扩展/可配置性也非常不错。类似MacOS X下Finder(文件管理器)的多列文件管理方式。支持多标签页。实时预览文本文件和目录。

ranger

cowsay & sl

cowsay  不说了,如下所示,哈哈哈。还有xcowsay,你可以自己搜一搜。

cowsay_screenshot

sl是什么?ls?,呵呵,你会经常把ls 打成sl吗?如果是的话,这个东西可以让你娱乐一下,你会看到一辆火车呼啸而过~~,相当拉风。你可以使用sudo apt-get install sl 安装。

sl

最后,再介绍一个命令中linuxlogo,你可以使用 sudo apt-get install linuxlogo来安装,然后,就可以使用linuxlogo -L
来看一下各种Linux的logo了

linuxlogo

(全文完)