Linux PID 1 和 Systemd (coolshell.cn)
要说清 Systemd,得先从Linux操作系统的启动说起。Linux 操作系统的启动首先从 BIOS 开始,然后由 Boot Loader 载入内核,并初始化内核。内核初始化的最后一步就是启动 init 进程。这个进程是系统的第一个进程,PID 为 1,又叫超级进程,也叫根进程。它负责产生其他所有用户进程。所有的进程都会被挂在这个进程下,如果这个进程退出了,那么所有的进程都被 kill 。如果一个子进程的父进程退了,那么这个子进程会被挂到 PID 1 下面。
by @技术头条 2017-08-21 13:38 查看详情
NoSQL: 如何在 Ubuntu 16.04 上安装 OrientDB (linux.cn)
通常在我们提及数据库的时候,想到的是两个主要的分类:使用用于用户和应用程序之间进行对接的一种被称为结构化查询语言(Structured Query Language ,缩写 SQL)的关系型数据库管理系统(Relational Data base Management System,缩写 RDBMS) 以及非关系型数据库管理系统(non-relational database management systems 或称 NoSQL 数据库)。

这两种模型在如何处理(存储)数据的方面存在着巨大的差异。
by @技术头条 2017-08-21 13:37 查看详情
深度学习(Deep Learning)发展史 (linux.cn)
本文节选自人民邮电出版社最新出版的 AI 圣经《深度学习(DEEP LEARNING)》。《深度学习(DEEP LEARNING)》英文版由美国麻省理工学院 MIT 出版社于 2016 年 12 月推出,一经出版就风靡全球。《深度学习(DEEP LEARNING)》的一大特点是介绍深度学习算法的本质,脱离具体代码实现给出算法背后的逻辑,不写代码的人也完全可以看。

由深度学习领域三位前沿、权威的专家 Ian Goodfellow、Yoshua Bengio 和 Aaron Courville 合著的人工智能领域的圣经、长期位居美国亚马逊人工智能类图书榜首的《深度学习(DEEP LEARNING)》中文版上市,为国内火热的人工智能大潮再添一把火。
by @技术头条 2017-08-21 13:36 查看详情
为什么你应该成为一名系统管理员? (linux.cn)
网络和系统管理工作工资高、岗位多。

为什么你应该成为一名系统管理员

我们为秩序而战,而服务器大叔则需要你成为系统管理员。

这是个很好的机会,因为你已经管理过你有的那些系统,你本可以不需酬劳地管理那些日逐一日地运行的系统。但还是有一些面试官,愿意拿一笔很不错的薪水来找一些人去管理他们的系统。目前,系统和网络管理的失业率几乎为零,但是美国劳工统计局估计到 2024 年该领域将持续 9% 的增长。

你可能会问,自动化运维怎么样?大概你已经听一些系统管理员说过,他们打算如何来自动化他们所有的工作,或者,他们如何在一个 shell 脚本里自动化完成他们前任者的工作。你听过的有多少成功的?自动化了某个任务,就会有更多的东西需要自动化。

如果你参加过系统管理者会议或观看过他们的视频,你会发现这是一个需要新鲜血液的领域。不仅仅是明显的缺少年轻人,而且相当地性别和种族不平等。虽然有点儿跑题,但是多样性已经被证明可以提高系统管理员非常感兴趣的自我恢复力、解决问题的能力,创新力和决策力。
by @技术头条 2017-08-21 13:35 查看详情
一次由于MTU设置不当导致的网络访问超时 (www.bo56.com)
现象 Server A 调用本机的接口,能正常返回。调用Server B的接口,总是超时。被调用接口是能正常执行的,而且有执行日志记录。 Server C 调用Server B的接口也能正常返回。 分析 根据以上,基本可以排除是Server B接口服务的问题导 …
by @技术头条 2017-08-21 13:35 查看详情
LXD 2.15 中的存储管理 (linux.cn)
长久以来 LXD 已经支持多种存储驱动。用户可以在 zfs、btrfs、lvm 或纯目录存储池之间进行选择,但他们只能使用单个存储池。一个被频繁被提到的需求是不仅支持单个存储池,还支持多个存储池。这样,用户可以维护一个由 SSD 支持的 zfs 存储池用于 I/O 密集型容器,另一个简单的基于目录的存储池用于其他容器。幸运的是,现在这是可能的,因为 LXD 在几个版本后有了自己的存储管理 API。
by @技术头条 2017-08-16 12:31 查看详情
API设计原则 (coolshell.cn)
Qt的设计水准在业界很有口碑,一致、易于掌握和强大的API是Qt最著名的优点之一。此文既是Qt官网上的API设计指导准则,也是Qt在API设计上的实践总结。虽然Qt用的是C++,但其中设计原则和思考是具有普适性的(如果你对C++还不精通,可以忽略与C++强相关或是过于细节的部分,仍然可以学习或梳理关于API设计最有价值的内容)。整个篇幅中有很多示例,是关于API设计一篇难得的好文章。
需要注意的是,这篇Wiki有一些内容并不完整,所以,可能会有一些阅读上的问题,我们对此做了一些相关的注释。
by @技术头条 2017-08-16 12:30 查看详情
Docker、Kubernetes 和 Apache Mesos 对比中的一些误区 (linux.cn)
有无数的文章、讨论、以及很多社区喋喋不休地比较 Docker、Kubernetes 和 Mesos。如果你只是听信了只言片语,你可能会认为这三个开源项目正为了称霸容器界而殊死搏斗。你可能还相信从他们中选出一个如宗教信仰般神圣——真正的信徒会忠于他们的信仰,而且会烧死那些敢于考虑替代方案的异教徒。
那都是废话。
虽然所有这三种技术都使得使用容器来部署、管理和伸缩应用成为可能,但实际上它们各自解决了不同的问题,并且根植于迥异的上下文环境中。事实上,这三种被广泛采用的工具链,都是有差别的。
让我们重新审视每个项目的原始任务、技术架构,以及它们是如何相互补充和交互的,而不是纠结于比较这些快速迭代的技术之间重叠的特性。
by @技术头条 2017-08-16 12:28 查看详情
10分钟学会基本的 Flexbox 布局 (www.css88.com)
Flexbox 是 flexible box 的简称(愚人码头注:意思是“灵活的盒子容器”),是 CSS3 引入的新的布局模式。它决定了元素如何在页面上排列,使它们能在不同的屏幕尺寸和设备下可预测地展现出来。

它之所以被称为 Flexbox ,是因为它能够扩展和收缩 flex 容器内的元素,以最大限度地填充可用空间。与以前布局方式(如 table 布局和浮动元素内嵌块元素)相比,Flexbox 是一个更强大的方式:

在不同方向排列元素
重新排列元素的显示顺序
更改元素的对齐方式
动态地将元素装入容器
by @技术头条 2017-08-16 12:26 查看详情
浏览器user-agent详解 (ducaijun.iteye.com)
很好的UA版本历史介绍。

user-agent 字串史可以说明曾对 user-agent 嗅探说不的原因:IE 想要将自己识别为 Netscape 4,Konqueror 和 WebKit 想要识别为 Firefox,Chrome 想要识别为 Safari。这样使得除 Opera 外所有浏览器的 user-agent 嗅探区别很小,想要从一堆茫茫浏览器海洋中找出有用的标识太少了。关于嗅探要记住:一款浏览器与其它浏览器是兼容的,这样造成了不能完全准确的断定是哪款 浏览器。

比如说 Chrome ,它声称任何可以在 Safari 3 访问的网站 Chrome 也都可以访问,但是对检测 Chrome 没有一点用。为了浏览器的兼容--这便是这个声明的理由。
by @技术头条 2017-07-28 10:22 查看详情
如何掌握所有的程序语言。作者:王垠 (www.yinwang.org)
对的,我这里要讲的不是如何掌握一种程序语言,而是所有的……

很多编程初学者至今还在给我写信请教,问我该学习什么程序语言,怎么学习。由于我知道标题问题的答案,所以总感觉这个问题是如此“低级”,一直没来得及回复 :P 可是逐渐的,我发现原来不只是小白们有这个问题,就连美国大公司的很多资深工程师,其实也没搞明白。

今天休闲活动进入第二个星期,稍微闲下来一点,我想来统一回答一下这个搁置已久的“初级问题”。这个话题貌似曾经写过,然而现在我想把它重新写一遍。因为通过跟很多人的交流,我对自己头脑中的(未转化为语言的)想法,有了更精确的表达。

如果你存在以下的种种困惑,那么这篇文章也许会对你有所帮助:

你是编程初学者,不知道该选择什么程序语言来入门。
你是资深的程序员或者团队领导,对新出现的种种语言感到困惑,不知道该“投资”哪种语言。
你的团队为使用哪种程序语言争论不休,发生各种宗教斗争。
你追逐潮流采用了某种时髦的语言,结果两个月之后发现深陷泥潭,痛苦不堪……
虽然我已经不再过问这些世事,然而无可置疑的现实是,程序语言仍然是很重要的话题,这个情况短时间内不会改变。程序员的岗位往往会要求熟悉某些语言,甚至某些奇葩的公司要求你“深入理解 OOP 或者 FP 设计模式”。对于在职的程序员,程序语言至今仍然是可以争得面红耳赤的宗教话题。它的宗教性之强,以至于我在批评和调侃某些语言(比如 Go 语言)的时候,有些人会本能地以为我是另外一种语言(比如 Java)的粉丝。

显然我不可能是任何一种语言的粉丝,我甚至不是 Yin 语言的粉丝 ;) 对于任何从没见过的语言,我都是直接拿起来就用,而不需要经过学习的过程。看了这篇文章,也许你会明白我为什么可以达到这个效果。理解了这里面的东西,每个程序员都应该可以做到这一点。嗯,但愿吧。

重视语言特性,而不是语言

很多人在乎自己或者别人是否“会”某种语言,对“发明”了某种语言的人倍加崇拜,为各种语言的孰优孰劣争得面红耳赤。这些问题对于我来说都是不存在的。虽然我写文章批评过不少语言的缺陷,在实际工作中我却很少跟人争论这些。如果有其它人在我身边争论,我甚至会戴上耳机,都懒得听他们说什么 ;) 为什么呢?我发现归根结底的原因,是因为我重视的是“语言特性”,而不是整个的“语言”。我能用任何语言写出不错的代码,就算再糟糕的语言也差不了多少。

任何一种“语言”,都是各种“语言特性”的组合。打个比方吧,一个程序语言就像一台电脑。它的牌子可能叫“联想”,或者“IBM”,或者“Dell”,或者“苹果”。那么,你可以说苹果一定比 IBM 好吗?你不能。你得看看它里面装的是什么型号的处理器,有多少个核,主频多少,有多少 L1 cache,L2 cache……,有多少内存和硬盘,显示器分辨率有多大,显卡是什么 GPU,网卡速度,等等各种“配置”。有时候你还得看各个组件之间的兼容性。

这些配置对应到程序语言里面,就是所谓“语言特性”。举一些语言特性的例子:

变量定义
算术运算
for 循环语句,while 循环语句
函数定义,函数调用
递归
静态类型系统
类型推导
lambda 函数
面向对象
垃圾回收
指针算术
goto 语句
这些语言特性,就像你在选择一台电脑的时候,看它里面是什么配置。选电脑的时候,没有人会说 Dell 一定是最好的,他们只会说这个型号里面装的是 Intel 的 i7 处理器,这个比 i5 的好,DDR3 的内存 比 DDR2 的快这么多,SSD 比磁盘快很多,ATI 的显卡是垃圾…… 如此等等。

程序语言也是一样的道理。对于初学者来说,其实没必要纠结到底要先学哪一种语言,再学哪一种。曾经有人给我发信问这种问题,纠结了好几个星期,结果一个语言都还没开始学。有这纠结的时间,其实都可以把他纠结过的语言全部掌握了。

初学者往往不理解,每一种语言里面必然有一套“通用”的特性。比如变量,函数,整数和浮点数运算,等等。这些是每个通用程序语言里面都必须有的,一个都不能少。你只要通过“某种语言”学会了这些特性,掌握这些特性的根本概念,就能随时把这些知识应用到任何其它语言。你为此投入的时间基本不会浪费。所以初学者纠结要“先学哪种语言”,这种时间花的很不值得,还不如随便挑一个语言,跳进去。

很多初学者不了解,一个高明的程序员如果开始用一种新的程序语言,他往往不是去看这个语言的大部头手册或者书籍,而是先有一个需要解决的问题。手头有了问题,他可以用两分钟浏览一下这语言的手册,看看这语言大概长什么样。然后,他直接拿起一段例子代码来开始修改捣鼓,想法把这代码改成自己正想解决的问题。在这个简短的过程中,他很快的掌握了这个语言,并用它表达出心里的想法。

在这个过程中,随着需求的出现,他可能会问这样的问题:

这个语言的“变量定义”是什么语法,需要“声明类型”吗,还是可以用“类型推导”?
它的“类型”是什么语法?是否支持“泛型”?泛型的 “variance” 如何表达?
这个语言的“函数”是什么语法,“函数调用”是什么语法,可否使用“缺省参数”?
……
注意到了吗?上面每一个引号里面的内容,都是一种语言特性(或者叫概念)。这些概念可以存在于任何的语言里面,虽然语法可能不一样,它们的本质都是一样的。比如,有些语言的参数类型写在变量前面,有些写在后面,有些中间隔了一个冒号,有些没有。

这些实际问题都是随着写实际的代码,解决手头的问题,自然而然带出来的,而不是一开头就抱着语言手册看得仔仔细细。因为掌握了语言特性的人都知道,自己需要的特性,在任何语言里面一定有对应的表达方式。如果没有直接的方式表达,那么一定有某种“绕过方式”。如果有直接的表达方式,那么它只是语法稍微有所不同而已。所以,他是带着问题找特性,就像查字典一样,而不是被淹没于大部头的手册里面,昏昏欲睡一个月才开始写代码。

掌握了通用的语言特性,剩下的就只剩某些语言“特有”的特性了。研究语言的人都知道,要设计出新的,好的,无害的特性,是非常困难的。所以一般说来,一种好的语言,它所特有的新特性,终究不会超过一两种。如果有个语言号称自己有超过 5 种新特性,那你就得小心了,因为它们带来的和可能不是优势,而是灾难!

同样的道理,最好的语言研究者,往往不是某种语言的设计者,而是某种关键语言特性的设计者(或者支持者)。举个例子,著名的计算机科学家 Dijkstra 就是“递归”的强烈支持者。现在的语言里面都有递归,然而你可能不知道,早期的程序语言是不支持递归的。直到 Dijkstra 强烈要求 Algol 60 委员会加入对递归的支持,这个局面才改变了。Tony Hoare 也是语言特性设计者。他设计了几个重要的语言特性,却没有设计过任何语言。另外大家不要忘了,有个语言专家叫王垠,他是早期 union type 的支持者和实现者,也是 checked exception 特性的支持者,他在自己的博文里指出了 checked exception 和 union type 之间的关系 :P

很多人盲目的崇拜语言设计者,只要听到有人设计(或者美其民曰“发明”)了一个语言,就热血沸腾,佩服的五体投地。他们却没有理解,其实所有的程序语言,不过是像 Dell,联想一样的“组装机”。语言特性的设计者,才是像 Intel,AMD,ARM,Qualcomm 那样核心技术的创造者。

合理的入门语言

所以初学者要想事半功倍,就应该从一种“合理”的,没有明显严重问题的语言出发,掌握最关键的语言特性,然后由此把这些概念应用到其它语言。哪些是合理的入门语言呢?我个人觉得这些语言都可以用来入门:

Scheme
C
Java
Python
JavaScript
那么相比之下,我不推荐用哪些语言入门呢?

Shell
PowerShell
AWK
Perl
PHP
Basic
Go
总的说来,你不应该使用所谓“脚本语言”作为入门语言,特别是那些源于早期 Unix 系统的脚本语言工具。PowerShell 虽然比 Unix 的 Shell 有所进步,然而它仍然没有摆脱脚本语言的根本问题——他们的设计者不知道他们自己在干什么 :P

采用脚本语言学编程,一个很严重的问题就是使得学习者抓不住关键。脚本语言往往把一些系统工具性质的东西(比如正则表达式,Web 概念)加入到语法里面,导致初学者为它们浪费太多时间,却没有理解编程最关键的概念:变量,函数,递归,类型……

不推荐 Go 语言的原因类似,虽然 Go 语言不算脚本语言,然而他的设计者显然不明白自己在干什么。所以使用 Go 语言来学编程,你不能专注于最关键,最好的语言特性。

掌握关键语言特性,忽略次要特性

为了达到我之前提到的融会贯通,一通百通的效果,初学者应该专注于语言里面最关键的特性,而不是被次要的内容分心。我发现很多编程培训班和野鸡大学的编程入门课,往往一来就教学生如何使用 printf 打印“Hello World!”,进而要他们记忆 printf 的各种“格式字符”的意义,要他们实现各种复杂格式的打印输出,甚至要求打印到文本文件里,然后再读出来……

可是殊不知,这种输出输入操作其实根本不算是语言的一部分,而且对于掌握编程的核心概念来说,都是次要的。有些人的 Java 课程进行了好几个星期,居然还在布置各种 printf 的作业。学生写出几百行的 printf,却不理解变量和函数是什么,甚至连算术语句和循环语句都不知道怎么用!这就是为什么很多初学者感觉编程很难,我连 %d,%f,%.2f 的含义都记不住,还怎么学编程!

然而这些野鸡大学的“教授”头衔是如此的洗脑,以至于被他们教过的学生(比如我女朋友)到我这里请教,居然骂我净教一些没用的东西,学了连 printf 的作业都没法完成 :P 你别跟我讲 for 循环,函数什么的了…… 可不可以等几个月,等我背熟了 printf 的用法再学那些啊?

所以你就发现一旦被差劲的老师教过,这个程序员基本就毁了。就算遇到好的老师,他们也很难纠正过来。

自己动手实现语言特性

在基本学会了各种语言特性,能用它们来写代码之后,下一步的进阶就是去实现它们。只有实现了各种语言特性,你才能完完全全的拥有它们,成为它们的主人。否则你就只是它们的使用者,你会永远做语言创造者们的仆人。

有个大师说得好,完全理解一种语言最好的方法就是自己动手实现它,也就是自己写一个解释器来实现它的语义。但我觉得这句话应该稍微修改一下:完全理解一种“语言特性”最好的方法就是自己亲自实现它。

注意我在这里把“语言”改为了“语言特性”。你并不需要实现整个语言来达到这个目的,因为我们最终使用的是语言特性。只要你自己实现了一种语言特性,你就能理解这个特性在任何语言里的实现方式和用法。

举个例子,学习 SICP 的时候,大家都会亲自用 Scheme 实现一个面向对象系统。用 Scheme 实现的面向对象系统,跟 Java,C++,Python 之类的语言语法相去甚远,然而它却能帮助你理解任何这些 OOP 语言里面的“面向对象”这一概念,它甚至能帮助你理解各种面向对象实现的差异。

这种效果是你直接学习 OOP 语言得不到的,因为在学习 Java,C++,Python 之类语言的时候,你只是一个用户,而用 Scheme 自己动手实现了 OO 系统之后,你成为了一个创造者。

类似的特性还包括类型推导,类型检查,惰性求值,如此等等。我实现过几乎所有的语言特性,所以任何语言在我的面前,都是可以被任意拆卸组装的玩具,而不再是凌驾于我之上的神圣。

总结

写了这么多,重要的话重复三遍:语言特性,语言特性,语言特性,语言特性!不管是初学者还是资深程序员,应该专注于语言特性,而不是纠结于整个的“语言品牌”。只有这样才能达到融会贯通,拿起任何语言几乎立即就会用,并且写出高质量的代码。
by @技术头条 2017-07-07 14:54 查看详情
Twitter数据挖掘:如何使用Python分析大数据 (www.itran.cc)
大数据无处不在。在时下这个年代,不管你喜欢与否,在运营一个成功的商业的过程中都有可能会遇到它。

本教程将会简要介绍何谓大数据,无论你是尝试抓住时机的商人,抑或是寻找下一个项目的编程高手,你都可以学到它是如何为你所用,以及如何使用Twitter API和Python快速开始。

大数据就像它看起来那样——有大量的数据。单独而言,你能从单一的数据获取的洞见穷其有限。但是结合复杂数学模型以及强大计算能力的TB级数据,却能创造出人类无法制造的洞见。大数据分析提供给商业的价值是无形的,并且每天都在超越人类的能力。
by @技术头条 2017-06-20 00:43 查看详情
SIP INVITE 会话建立过程 (www.ideawu.net)
运行于 UDP 之上的 SIP,因为 UDP 是不可靠传输的,所以 SIP 协议本身要自己实现可靠传输。对于如何可靠传输,SIP 的 RFC 文档没有要求实现独立的传输层,而是将可靠传输隐含于交互过程本身。如果向 TCP/IP 协议那样分层,特点是清晰。而将可靠传输隐含于交互,则可控程度更高,当然也更复杂。
所以,RFC 中创造了一些概念,如 Transaction 等等,对于有经验的程序员来说,这完全没必须,反而造成困扰。对于程序员,用几句简单的过程描述就可以解决。如下。
Client: 定期重复发送 INVITE 直到收到响应。
Server:收到 INVITE 后,定期重复发送响应,直到收到 ACK。
Client:收到响应后,认为会话已经建立。这时如果再次收到响应,继续发送 ACK。
Server:收到 ACK,认为会话已经建立。这时如果再次收到 INVITE,丢弃。
里面有两个“定期发送”,其实就是超时重传的意思。当然,超时重传有最终次数限制。
程序看到上面的话,实现起来就简单了。不太明白 RFC 为什么要用 Trasaction 那样奇怪的方式来描述,可能和那个时期或者某个公司的编程习惯有关,作者可能是基于自己的某个代码实现来描述。其他人实现时,未必需要 Transaction 这种东西。
关于可靠传输,我已经在另一篇博客文章(http://www.ideawu.net/blog/archives/782.html )中介绍了,就是确认,重传,排序(序号)。SIP 把确认隐含于交互过程,例如响应是对 INVITE 的确认,ACK 是对响应的确认。在不同的状态接受不同类型的报文,以及会话建立之后对非期望报文的丢弃就属于排序(序号)。SIP 本身也有序号,并不是单纯的报文排序之用。
by @技术头条 2017-06-20 00:39 查看详情
一个屏蔽 IP  的脚本 (xiezhenye.com)
在测试可用性的时候,经常需要模拟断网。这时候用 iptables 是比较方便的。但是如果想更方便一点,不用去敲那么长的命令会更好些。于是就写了个 ban_ip 脚本。
by @技术头条 2017-06-20 00:39 查看详情
2017 年的八大系统运维和工程发展趋势 (linux.cn)
预测趋势是棘手的,尤其是在快速发展的系统运维和工程领域。2016 年,在我们的 Velocity 大会上,我们讨论了分布式系统、SRE、容器化、无服务架构,人员倦怠以及与提供软件相关的人力与技术挑战等诸多问题。以下是我们认为的下一年的趋势:
1、 分布式系统
我们认为这个很重要,我们在整个 Velocity 会议上再次关注了它。
2、 站点可靠性工程(SRE)
站点可靠性工程(Site Reliability Engineering)(SRE)-它只是运维么?或者它是 DevOps 的另外一个名称吗?这是 Google 对那些需要做大量系统及软件工程的运维专业人士的称呼。它由在像 Dropbox 公司的前 Google 人向业内推广,招聘 SRE 的职位正不断增加,特别是有大型数据中心的面向网络的公司。在某些情况下,SRE 的作用更多地是帮助开发人员运营自己的服务。
3、 容器化
公司将。。。
by @技术头条 2017-06-20 00:38 查看详情
关于Linux系统清理/tmp/文件夹,你可能想知道的 (www.opsers.org)
我们知道,在Linux系统中/tmp文件夹里面的文件会被清空,至于多长时间被清空,如何清空的,可能大家知识的就不多了,所以,今天我们就来剖析一个这两个问题。
在RHEL\\CentOS\\Fedora\\系统中(本次实验是在RHEL6中进行的)
先来看看tmpwatch这个命令,他的作用就是删除一段时间内不使用的文件(removes files which haven’t been accessed for a period of time)。具体的用法就不多说了,有兴趣的自行研究。我们主要看看和这个命令相关的计划任务文件。
他就是/etc/cron.daily/tmpwatch,我们可以看一下这个文件里面的内容
#! /bin/sh
flags=-umc
/usr/sbin/tmpwatch \"$flags\" -x /tmp/.X11-unix -x /tmp/.XIM-unix \\
-x /tmp/.font-unix -x /tmp/.ICE-unix -x /tmp/.Test-unix \\
-X \'/tmp/hsperfdata_*\' 10d /tmp
/usr/sbin/tmpwatch \"$flags\" 30d /var/tmp
for d in /var/{cache/man,catman}/{cat?,X11R6/cat?,local/cat?}; do
if [ -d \"$d\" ]; then
/usr/sbin/tmpwatch \"$flags\" -f 30d \"$d\"
fi
done
这个脚本大家仔细分析一下就明白了,第一行相当于一个标记(参数),第二行就是针对/tmp目录里面排除的目录,第三行,这是对这个/tmp目录的清理,下面的是针对其他目录的清理,就不说了。
我们就来看/usr/sbin/tmpwatch \"$flags\" 30d /var/tmp这一行,关键的是这个30d,就是30天的意思,这个就决定了30天清理/tmp下不访问的文件。如果说,你想一天一清理的话,就把这个30d改成1d。这个你懂的……哈哈!
但有个问题需要注意,如果你设置更短的时间来清理的话,比如说是30分钟、10秒等等,你可以在这个文件中设置,但你会发现重新电脑,他不清理/tmp文件夹里面的内容,这是为什么呢?这就是tmpwatch他所在的位置决定的,他的上层目录是/etc/cron.daily/,而这个目录是第天执行一次计划任务,所以说,你设置了比一天更短的时间,他就不起作用了。这下明白了吧。
所以结论是:在RHEL6中,系统自动清理/tmp文件夹的默认时限是30天
在Debian\\Ubuntu系统中(Ubuntu10.10为实验环境)
在Ubuntu系统中,在/tmp文件夹里面的内容,每次开机都会被清空,如果不想让他自动清理的话,只需要更改rcS文件中的TMPTIME的值。
我们看如何来修改
sudo vi /etc/default/rcS

TMPTIME=0
修改成
TMPTIME=-1或者是无限大
改成这样的话,系统在重新启动的时候就不会清理你的/tmp目录了。
依些类推,如果说要限制多少时间来更改的话,就可以改成相应的数字(本人没有测试,我是这么理解的)
所以结论是:在Ubuntu中,系统自动清理/tmp文件夹的时限默认每次启动
by @技术头条 2017-06-19 10:31 查看详情
我眼中的前端九段 (www.barretlee.com)
前端是技术岗,是为解决公司业务而设立的工种,非要用类似围棋九段来划分能力,那也需要从更加全面的角度去切割。我也尝试划出九段,给大家参考:

一段

能够使用 form 表单提交数据,并通过后台处理将数据展示出来,能够实现表单数据的异步校验。能实现这个功能,基本上对 html/js 有了基本的了解,也了解一点后端语言。

二段

能够搭建个人博客,将博客静态部署到 github pages,也能够动态部署到 Server,并准确对静态资源做缓存处理。能实现这个功能,基本上对 linux 简单命令和 http 相关知识有所了解,对 git 也有了一点了解。

三段

能够从零开始实现一个网站的前台和后台,能够良好的管理多页面的 css/js 文件,并且掌握基本的数据库知识,熟悉一门后端语言。

四段

能够使用构建工具对前端代码进行编译、合并、压缩等处理,能够简单地设计一个网站的架构,并且能够对架构做持续调优。这一段位需要具备基本的工程化能力和架构能力。

五段

掌握网页的各种调试手段,对 Native 知识有基本了解,能够对大流量的网站做优化处理,能够考虑网页的性能优化问题,对新技术有自己的认知,熟悉掌握一门后端语言,并且了解基本的运维知识。

六段

在前端技术使用上可以游刃有余,能够在项目开发中担任 PM 角色,可以针对一个项目作出全面的技术方案评估,并可以良好的落地方案,能够作出准确的技术选型,了解不同工具、框架的长短处,能够带领 3~5 人进行项目开发。

七段

能够在团队的边界技术上有所突破,能够看到项目和团队的问题,找到解决方案,提升团队的整体水平,用技术帮助业务获得持续发展的可能。

八段

能够在前端的边界上有所突破,引领行业的发展。能够对前端在下一个阶段的发展作出定义。

九段

有资格跟「前端阿尔法狗」对战。
by @技术头条 2017-06-06 00:38 查看详情
【死磕Java并发】—–J.U.C之重入锁:ReentrantLock (cmsblogs.com)
ReentrantLock,可重入锁,是一种递归无阻塞的同步机制。它可以等同于synchronized的使用,但是ReentrantLock提供了比synchronized更强大、灵活的锁机制,可以减少死锁发生的概率。

API介绍如下:

一个可重入的互斥锁定 Lock,它具有与使用 synchronized 方法和语句所访问的隐式监视器锁定相同的一些基本行为和语义,但功能更强大。ReentrantLock 将由最近成功获得锁定,并且还没有释放该锁定的线程所拥有。当锁定没有被另一个线程所拥有时,调用 lock 的线程将成功获取该锁定并返回。如果当前线程已经拥有该锁定,此方法将立即返回。可以使用 isHeldByCurrentThread() 和 getHoldCount() 方法来检查此情况是否发生。

ReentrantLock还提供了公平锁也非公平锁的选择,构造方法接受一个可选的公平参数(默认非公平锁),当设置为true时,表示公平锁,否则为非公平锁。公平锁与非公平锁的区别在于公平锁的锁获取是有顺序的。但是公平锁的效率往往没有非公平锁的效率高,在许多线程访问的情况下,公平锁表现出较低的吞吐量。
by @技术头条 2017-03-27 10:05 查看详情
如何建设高可用系统 (ifeve.com)
面试的时候经常会问一个问题,如何建设高可用系统?大家可以一起探讨下。

“高可用性”(High Availability)通常来描述一个系统经过专门的设计,从而减少停工时间,而保持其服务的高度可用性。
by @技术头条 2017-03-27 10:04 查看详情
CSS font-family常见中文字体对应的英文名称 (www.zhangxinxu.com)
虽然一些常见中文字体,例如“宋体”,“微软雅黑”等,直接使用中文名称作为CSS font-family的属性值也能生效,但我们一般都不使用中文名称,而是使用英文名称,主要是规避乱码的风险。还有一些中文字体,直接使用中文名称作为CSS font-family的属性值是没有效果的,如“思源黑体”, “兰亭黑体”等,需要使用对应的英文字体名称才可以。

总而言之一句话,你要想使用中文字体,就必须要知道其对应的英文名称。

我在网上搜索相关资料的时候,发现几乎唯一流传一份中英文对应数据是2010年某位同学整理的,现在已经2017年了,所以其中不少内容已经过时了,如“仿宋_GB2312”、“楷体_GB2312” windows7及其以后版本都没有了;同时有很多遗漏和缺失的地方,例如OS X新晋“苹方”等字体。

所以,我特意花了一两天的时间,对以往的数据进行了修正和补充,保证每一个字体都在不同系统下一个一个亲自测试验证,整理了一份更完善的中文字体英文名称对应关系一览表。
by @技术头条 2017-03-27 10:04 查看详情