【技术新闻】程序员不是包身工

程序员是活生生的人,他们有自己的情欲,兴趣和生活。老板们有了一个现实的愿望,想实现它,经过辛苦和几番努力让这个想法能够成形。要么是有了投资人,要么是自己的收入所得,你可以用这些钱来雇佣其他人帮助你。这些被雇佣的人把自己生活相当重要的一部分投入到帮助实现这个愿望中。静下来想想,这些人值得你去感激。

在大卫的这篇博客中,他说员工在下班后做业余项目对老板不利,对公司有害。这种思想太落后了。

首先,一个人在业余时间应该做什么、不应该做什么,别人不该说三道四,这是一种极大的侮辱,这是对他人无礼的个人评判。这是一种极其短视的行为。

老板应该鼓励员工做业余项目

尤其是对一些在创业公司工作的中坚(例如——设计和开发老板的产品的这些人),做业余项目对他们有格外的好处。下面就是一些:

试验:在建议公司使用某些新技术前可以先在业余项目上试验一下;做再多的理论研究也不比曾经使用过某个新框架能获得更真切的个人评价。
独立自主:这是一个他们能够独立自主做所有决定的地方(无论正确还是错误),而不是像在公司里通过各种商谈妥协才能出一套方案。你可以把这视作创造力的释放。
加强知识掌握:程序员有机会能在自己喜爱的方向上进一步研究某种技术,这比在公司上班的标准时间里学习要神速的多。
消遣解压:提供多样性的生活节奏,避免因为在公司长期从事某一种工作/项目而带来的疲倦的感觉。
专心:能够促使程序员更高效的完成工作,因为他们并不能把所有时间都放在工作上。有句老话说,“如果你希望快速的完成一个事情,那就去问问一个忙碌的人是怎么做的。”
为开源社区做贡献:如果不是因为有如此多的人在业余时间做项目,你将看不到这些优秀技术社区向开源项目捐赠代码。业余项目对此有很大帮助。
社交网络:程序员有机会经常和日常工作外的人群接触,这能帮助他们获取知识,扩大社交网络。也许某天他们能给你的创业公司介绍新的人才。
我相信还会有很多其它的好处。

如果我只是埋头在以前的那些工作上,我将不可能现在在KISSmetrics公司开发产品(我甚至不可能进入科技界,因为我的专业是电子工程)。对于目前的工作,我所有的技能都是来自例如Greenhorn Connect等业余项目,在业余时间去学习新技能,饥渴的阅读各种书籍,每个老板都希望能雇佣到对所做的事情有热情的员工,希望他们具有广泛的知识,精湛的技能。但这是有连带的附加条款的,你必须接受他们的业余活动。

做业余项目的程序员更容易辞职?

在回到大卫的那篇议论,他看起来认为,如果一个员工有了业余项目,他们很可能会辞职去自己创业。如果一个程序员真的准备好了去经营一个业务,那他真的应该立即辞职,但有很多原因他们不会这样做:

资金问题 他们缺乏资金,并且知道当一个创意成熟时去募资是愚蠢的。更重要的,并不是所有的业余项目都有清晰的盈利前景。
动机问题 很多的业余项目都是因为兴趣和爱好。有时这些项目可能会变成值得用全天时间去开发的业务,但通常,他们只是一种业余爱好,不值得投入所有时间。
生活稳定问题 公司工作很稳定。很多事情会影响一个人的生活,并不是所有程序员都喜欢去创业,同时也有时间因素。他们也许结婚了,也许会迁移到另外一个城市,很多事情都会导致他们不会把创业放在第一位考虑。
但所有的这些都不会阻挡他们把价值奉献到工作上。

现在是卖方市场,程序员是抢手货

如果你拥有很好的技能,比如设计,产品管理,技术工程,在创业公司工作是个不错的选择。各种公司一定会争相聘用你。除了薪水的扶摇直上,老板们会发现,吸引有才华的人,仅用钱是不够的。良好的公司文化,老板知人善用,尊重他们的自由,这都是重要的因素。

大卫的观点也许适合你,但我要告诫那些老板,抛弃你们那些对员工不信任的态度,支持他们做业余项目。你们从他们这些活动中获得的隐形好处远比大卫所说的那些损失要多的多,而且避免了阻拦有才华潜能的程序员的进步发展。

Jhonse技术博客说明:
来源于: 外刊IT评论

【技术新闻】编程从业五年句句朴实的十四条经验

排列不分先后:

1. 当性能遇到问题时,如果能在应用层进行计算和处理,那就把它从数据库层拿出来。排序和分组就是典型的例子。在应用层做性能提升总是要比在数据库层容易的多。就像对于MySQL,sqlite更容易掌控。

2. 关于并行计算,如果能避免就尽量避免。如果无法避免,记住,能力越大,责任越大。如果有可能,尽量避免直接对线程操作。尽可能在更高的抽象层上操作。例如,在iOS中,GCD,分发和队列操作是你的好朋友。人类的大脑没有被设计成用来分析那些无穷临时状态——这是我的惨痛教训所得。

3. 尽可能简化状态,尽可能局部本地化。适用至上。

4. 短小可组合的方法是你的好朋友。

5. 代码注释是危险的,因为它们很容易更新不及时或给人误导,但这不能成为不写注释的理由。不要注释鸡毛蒜皮的事情,但如果需要,在某些特殊地方,战略性的长篇注释是需要的。你的记忆会背叛你,也许会在明天早上,也许会在一杯咖啡后。

6. 如果你认为一个用例场景也许“不会有问题吧”,它也许就是一个月后让你在发布的产品中遭受惨痛失败的地方。做一个怀疑主义者,测试,验证。

7. 有疑问时,和团队中所有相关人交流。

8. 做正确的事情——你通常会知道这指的是什么。

9. 你的用户并不傻,他们只是没有耐心理解你的捷径。

10. 如果一个开发人员没有被安排长期的维护你们开发的系统,对他保持警惕。80%的血、汗、泪水都是在软件发布后的时间里流的——那时你会变成一个厌世者,但也是更聪明的“行家”。

11. 任务清单是你的好朋友。

12. 主动让你的工作更有乐趣,有时这需要你付出努力。

13. 悄无声息的崩溃,我仍然会为此从噩梦中惊醒。监控,日志,警报。清楚各种的假警报和不可避免的感觉钝化。保持你的系统对故障的敏感和及时警报。

14. 复杂是大敌。

Jhonse技术博客说明:

来源于:http://www.aqee.net/14-lessons-after-five-years-of-professional-programming/

【mysql】union用法(合并三张表的数据查询)

最近公司的项目,需要用到一个功能,就是要获得数据库中三张表的数据,并按时间的顺序显示出来。一开始想到的是jion,最后一分析,发现jion,只能把表的数据左右合并,而没有“叠加”的功能。所以就用到union来整合三张表的数据。

先来看下网上对union的定义:

一 UNION语法 
 
SELECT …    
UNION[ALL | DISTINCT]    
SELECT …    
[UNION [ALL | DISTINCT]    
SELECT …]   
 
UNION用于把来自许多SELECT语句的结果组合到一个结果集合中。 
 
列于每个SELECT语句的对应位置的被选择的列应具有相同的类型。(例如,被第一个语句选择的第一列应和被其它语句选择的第一列具有相同的类型。)在第一个SELECT语句中被使用的列名称也被用于结果的列名称。 
 
SELECT语句为常规的选择语句,但是受到如下的限定: 
·只有最后一个SELECT语句可以使用INTO OUTFILE。 
·HIGH_PRIORITY不能与作为UNION一部分的SELECT语句同时使用。如果您对第一个 SELECT指定了HIGH_PRIORITY,则不会起作用。如果您对其它后续的SELECT语句指定了HIGH_PRIORITY,则会产生语法错误。 
 
如果您对UNION不使用关键词ALL,则所有返回的行都是唯一的,如同您已经对整个结果集合使用了DISTINCT。如果您指定了ALL,您会从所有用过的SELECT语句中得到所有匹配的行。 
 
DISTINCT关键词是一个自选词,不起任何作用,但是根据SQL标准的要求,在语法中允许采用。(在MySQL中,DISTINCT代表一个共用体的默认工作性质。) 
 
您可以在同一查询中混合UNION ALL和UNION DISTINCT。被混合的UNION类型按照这样的方式对待,即DISTINCT共用体覆盖位于其左边的所有ALL共用体。DISTINCT共用体可以使用UNION DISTINCT明确地生成,或使用UNION(后面不加DISTINCT或ALL关键词)隐含地生成。 
 
如果您想使用ORDER BY或LIMIT子句来对全部UNION结果进行分类或限制,则应对单个地SELECT语句加圆括号,并把ORDER BY或LIMIT放到最后一个的后面。以下例子同时使用了这两个子句: 
(SELECT a FROM tbl_name WHERE a=10 AND B=1)UNION(SELECT a FROM tbl_name WHERE a=11 AND B=2)ORDER BY a LIMIT 10;   
 
(SELECT a FROM tbl_name WHERE a=10 AND B=1)UNION(SELECT a FROM tbl_name WHERE a=11 AND B=2)ORDER BY a LIMIT 10;
 
这种ORDER BY不能使用包括表名称(也就是,采用tbl_name.col_name格式的名称)列引用。可以在第一个SELECT语句中提供一个列别名,并在ORDER BY中参阅别名,或使用列位置在ORDER BY中参阅列。(首选采用别名,因为不建议使用列位置。) 
 
另外,如果带分类的一列有别名,则ORDER BY子句必须引用别名,而不能引用列名称。以下语句中的第一个语句必须运行,但是第二个会运行失败,出现在'order clause'中有未知列'a'的错误: 
(SELECT a AS b FROM t) UNION (SELECT …) ORDER BY b;
(SELECT a AS b FROM t) UNION (SELECT …) ORDER BY a;
To apply ORDER BY or LIMIT to an individual SELECT, place the clause inside the parentheses that enclose the SELECT。
为了对单个SELECT使用ORDER BY或LIMIT,应把子句放入圆括号中。圆括号包含了SELECT。
(SELECT a FROM tbl_name WHERE a=10 AND B=1 ORDER BY a LIMIT 10)UNION(SELECT a FROM tbl_name WHERE a=11 AND B=2 ORDER BY a LIMIT 10); 
 
二 实例扩展 
union可以对同一个表的两次查询联合起来. 这样做的益处也非常明显, 比如在blog应用中, 可以利用一条sql语句实现置顶blog和普通blog的分页显示. 
(    
SELECT * FROM `blog`
WHERE top=1    
ORDER BY created DESC    
)    
UNION
(   
SELECT *    
FROM `blog`    
WHERE top = 0    
ORDER BY created DESC    
) LIMIT 2 , 3   
 
注:union要求联合的两个表所要查找的数据列要一样多,如果一个表中没有另一个表的字段,可以用NULL代替。 
 
通过以上对union的用法进行了一次实战,最后完成了此功能!!!!

【mysql】join的使用

在查询中,连接的语法类似

SELECT select_expr FROM table_references 

table_references(对表的引用)的定义如下(也可以看成连接表达式):

table_references:
    table_reference [, table_reference] ...

table_reference:
    table_factor
  | join_table

table_factor:
    tbl_name [[AS] alias] [index_hint_list]
  | table_subquery [AS] alias
  | ( table_references )
  | { OJ table_reference LEFT OUTER JOIN table_reference
        ON conditional_expr }

join_table:
    table_reference [INNER | CROSS] JOIN table_factor [join_condition]
  | table_reference STRAIGHT_JOIN table_factor
  | table_reference STRAIGHT_JOIN table_factor ON conditional_expr
  | table_reference {LEFT|RIGHT} [OUTER] JOIN table_reference join_condition
  | table_reference NATURAL [{LEFT|RIGHT} [OUTER]] JOIN table_factor

join_condition:
    ON conditional_expr
  | USING (column_list)

index_hint_list:
    index_hint [, index_hint] ...

index_hint:
    USE {INDEX|KEY}
      [{FOR {JOIN|ORDER BY|GROUP BY}] ([index_list])
  | IGNORE {INDEX|KEY}
      [{FOR {JOIN|ORDER BY|GROUP BY}] (index_list)
  | FORCE {INDEX|KEY}
      [{FOR {JOIN|ORDER BY|GROUP BY}] (index_list)

index_list:
    index_name [, index_name] ...

其中,table_factor是基本的表选择,而join_table是基于表的一些扩展。
下面,通过实验介绍一下表连接。
首先,假设有以下几个表

table1
id book
1 java
2 c++
3 php
table2
id author
2 zhang
3 wang
4 li
table3
author year
zhang 2003
ma 2006
liu 2011
 

Inner Join 内连接
将两个表中存在连接关系的字段,组成的记录集,叫做内连接。
内连接等价于

mysql> select table1.id as id,book,author from table1, table2 where table1.id=table2.id;
+------+------+--------+
| id   | book | author |
+------+------+--------+
|    2 | c++  | zhang  |
|    3 | php  | wang   |
+------+------+--------+
2 rows in set (0.00 sec)
mysql> select * from table1 inner join table2 using (id);
+------+------+--------+
| id   | book | author |
+------+------+--------+
|    2 | c++  | zhang  |
|    3 | php  | wang   |
+------+------+--------+
2 rows in set (0.00 sec)

可以看出,两者是等价的。没有Using子句的Inner Join相当于是求两个table的笛卡尔积。
Cross Join 交叉连接
在Mysql中,Cross Join可以用逗号表达式表示,例如(table1, table 2)。在Mysql中,Cross Join 和 Inner Join 是等价的,但是在标准SQL中,它们并不等价,Inner Join 用于带有on表达式的连接,反之用Cross Join。以下两个SQL语句是等价的。
Cross Join 指的是两个table的笛卡尔积。以下三句SQL是等价的。

mysql> select * from table1 inner join table2;
mysql> select * from table1 cross join table2;
mysql> select * from (table1, table2);
mysql> select * from table1 nature join table2;
结果集:
+------+------+------+--------+
| id   | book | id   | author |
+------+------+------+--------+
|    1 | java |    2 | zhang  |
|    2 | c++  |    2 | zhang  |
|    3 | php  |    2 | zhang  |
|    1 | java |    3 | wang   |
|    2 | c++  |    3 | wang   |
|    3 | php  |    3 | wang   |
|    1 | java |    4 | li     |
|    2 | c++  |    4 | li     |
|    3 | php  |    4 | li     |
+------+------+------+--------+

不难理解,下面两句SQL也是等价的。

mysql> select * from table1 left join (table2, table3) on (table2.id = table1.id and table2.author = table3.author);
mysql> select * from table1 left join (table2 cross join table3) on (table2.id = table1.id and table2.author = table3.author);
结果集:
+------+------+------+--------+--------+------+
| id   | book | id   | author | author | year |
+------+------+------+--------+--------+------+
|    1 | java | NULL | NULL   | NULL   | NULL |
|    2 | c++  |    2 | zhang  | zhang  | 2003 |
|    3 | php  | NULL | NULL   | NULL   | NULL |
+------+------+------+--------+--------+------+

Natural Join 自然连接
NATURAL [LEFT] JOIN:这个句子的作用相当于INNER JOIN,或者是在USING子句中包含了联结的表中所有公共字段的Left JOIN(左联结)。
也就是说:下面两个SQL是等价的。

mysql> select * from table1 natural join table2;
mysql> select * from table1 inner join table2 using (id);

结果集:
+------+------+--------+
| id   | book | author |
+------+------+--------+
|    2 | c++  | zhang  |
|    3 | php  | wang   |
+------+------+--------+

同时,下面两个SQL也是等价的。

mysql> select * from table1 natural left join table2;
mysql> select * from table1 left join table2 using(id);
结果集:
+------+------+--------+
| id   | book | author |
+------+------+--------+
|    1 | java | NULL   |
|    2 | c++  | zhang  |
|    3 | php  | wang   |
+------+------+--------+

Left Join 左外连接
左外连接A、B表的意思就是将表A中的全部记录和表B中字段连接形成的记录集,这里注意的是最后出来的记录集会包括表A的全部记录。
左连接表1,表二等价于右连接表二,表一。如下两个SQL是等价的:

mysql> select * from table1 left join table2 using (id);
mysql> select * from table2 right join table1 using (id);
结果集:
+------+------+--------+
| id   | book | author |
+------+------+--------+
|    1 | java | NULL   |
|    2 | c++  | zhang  |
|    3 | php  | wang   |
+------+------+--------+

Right Join 右外连接
右外连接和左外连接是类似的。为了方便数据库便于访问,推荐使用左外连接代替右外连接。
最后,讲一下Mysql表连接的一些注意事项。
1、两个表求差集的方法
如果求 左表 – 右表 的差集,使用类似下面的SQL:

SELECT left_tbl.* FROM left_tbl LEFT JOIN right_tbl ON left_tbl.id = right_tbl.id WHERE right_tbl.id IS NULL;
例如
mysql> select table1.* from table1 left join table2 using(id) where table2.id is null;
+------+------+
| id   | book |
+------+------+
|    1 | java |
+------+------+
1 row in set (0.00 sec)

2、Using子句
Using子句可以使用On子句重写。但是使用Select * 查询出的结果有差别。以下两句话是等价的:

mysql> select id, book, author from table1 join table2 using (id);
mysql> select table1.id, book, author from table1 join table2 on table1.id=table2.id;
结果集:
+------+------+--------+
| id   | book | author |
+------+------+--------+
|    2 | c++  | zhang  |
|    3 | php  | wang   |
+------+------+--------+

但是下面两个有些许不同,使用on时候,重复的部分会被输出两次。

mysql> select * from table1 join table2 using (id);
+------+------+--------+
| id   | book | author |
+------+------+--------+
|    2 | c++  | zhang  |
|    3 | php  | wang   |
+------+------+--------+
2 rows in set (0.00 sec)
mysql> select * from table1 join table2 on table1.id=table2.id;
+------+------+------+--------+
| id   | book | id   | author |
+------+------+------+--------+
|    2 | c++  |    2 | zhang  |
|    3 | php  |    3 | wang   |
+------+------+------+--------+
2 rows in set (0.00 sec)

3、Straight Join的使用
STRAIGHT_JOIN 和 JOIN相似,除了大部分情况下,在使用STRAIGHT_JOIN时候,先读右表后读左表。而在大部分情况下是先读左表的。STRAIGHT_JOIN仅用于少数情况下的表连接性能优化,比如右表记录数目明显少于左表。
4、Mysql表连接的运算顺序
在MySQL 5.1版本中,INNER JOIN, CROSS JOIN, LEFT JOIN, 和RIGHT JOIN 比逗号表达式具有更高的优先级。
因此SQL1被解析成SQL3,而不是SQL2。

SQL1 : SELECT * FROM t1, t2 JOIN t3 ON (t1.i1 = t3.i3);
SQL2 : SELECT * FROM (t1, t2) JOIN t3 ON (t1.i1 = t3.i3);
SQL3 : SELECT * FROM t1, (t2 JOIN t3 ON (t1.i1 = t3.i3));

因此会报错,找不到i1列。因此以后在写这样的查询的时候,最好写明白,不要省略括号,这样能避免很多错误。
5、循环的自然连接
在MySQL 5.1版本中,SQL1等价于SQL3, 而在MySQL以前版本中,SQL1等价于SQL2。

SQL1 : SELECT ... FROM t1 NATURAL JOIN t2 NATURAL JOIN t3;
SQL2 : SELECT ... FROM t1, t2, t3 WHERE t1.b = t2.b AND t2.c = t3.c;
SQL3 : SELECT ... FROM t1, t2, t3 WHERE t1.b = t2.b AND t2.c = t3.c AND t1.a = t3.a;

【linux】通过ssh客户端下载文件

一般来说,linux服务器大多是通过ssh客户端来进行远程的登陆和管理的,使用ssh登陆linux主机以后,如何能够快速的和本地机器进行文件的交互呢,也就是上传和下载文件到服务器和本地;
 
与ssh有关的两个命令可以提供很方便的操作:
      sz:将选定的文件发送(send)到本地机器
      rz:运行该命令会弹出一个文件选择窗口,从本地选择文件上传到服务器(receive)
 
当然,还可以设置一下目录了:
设置一下上传和下载的默认目录
options–>session options–>file transfer 下可以设置上传和下载的目录
剩下的你只要在用SecureCRT登陆linux终端的时候:
发送文件到客户端:sz filename
zmodem接收可以自行启动.
从客户端上传文件到linux服务端:
只要服务端执行 : rz
然后在 SecureCRT 里选文件发送,协议 zmodem
 
简单吧,如果你以前一直使用ssh,而又没有对外开放ftp服务,你就直接使用这种方式来传输你的文件。

【linux】命令之压缩解压缩

linux zip命令

1.zip -r myfile.zip ./*


将当前目录下的所有文件和文件夹全部压缩成myfile.zip文件,-r表示递归压缩子目录下所有文件.

2.unzip


unzip -o -d /home/sunny myfile.zip


把myfile.zip文件解压到 /home/sunny/


-o:不提示的情况下覆盖文件;


-d:-d /home/sunny 指明将文件解压缩到/home/sunny目录下;

3.其他


zip -d myfile.zip smart.txt


删除压缩文件中smart.txt文件


zip -m myfile.zip ./rpm_info.txt


向压缩文件中myfile.zip中添加rpm_info.txt文件

要使用 zip 来压缩文件,在 shell 提示下键入下面的命令:

zip -r filename.zip filesdir

在这个例子里,filename.zip 代表你创建的文件,filesdir 代表你想放置新 zip 文件的目录。-r 选项指定你想递归地(recursively)包括所有包括在 filesdir 目录中的文件。

要抽取 zip 文件的内容,键入以下命令:

unzip filename.zip

你可以使用 zip 命令同时处理多个文件和目录,方法是将它们逐一列出,并用空格间隔:

zip -r filename.zip file1 file2 file3 /usr/work/school 

上面的命令把 file1、file2、 file3、以及 /usr/work/school 目录的内容(假设这个目录存在)压缩起来,然后放入 filename.zip 文件中。

tar 命令详解

  -c: 建立压缩档案

  -x:解压

  -t:查看内容

  -r:向压缩归档文件末尾追加文件

  -u:更新原压缩包中的文件

  这五个是独立的命令,压缩解压都要用到其中一个,可以和别的命令连用但只能用其中一个。下面的参数是根据需要在压缩或解压档案时可选的。

  -c: 建立压缩档案

  -x:解压

  -t:查看内容

  -r:向压缩归档文件末尾追加文件

  -u:更新原压缩包中的文件

  下面的参数-f是必须的

  -f: 使用档案名字,切记,这个参数是最后一个参数,后面只能接档案名。

  # tar -cf all.tar *.jpg

  这条命令是将所有.jpg的文件打成一个名为all.tar的包。-c是表示产生新的包,-f指定包的文件名。

  # tar -rf all.tar *.gif

  这条命令是将所有.gif的文件增加到all.tar的包里面去。-r是表示增加文件的意思。

  # tar -uf all.tar logo.gif

  这条命令是更新原来tar包all.tar中logo.gif文件,-u是表示更新文件的意思。

  # tar -tf all.tar

  这条命令是列出all.tar包中所有文件,-t是列出文件的意思

  # tar -xf all.tar

  这条命令是解出all.tar包中所有文件,-t是解开的意思

  压缩

tar –cvf jpg.tar *.jpg //将目录里所有jpg文件打包成tar.jpg

  tar –czf jpg.tar.gz *.jpg //将目录里所有jpg文件打包成jpg.tar后,并且将其用gzip压缩,生成一个gzip压缩过的包,命名为jpg.tar.gz

  tar –cjf jpg.tar.bz2 *.jpg //将目录里所有jpg文件打包成jpg.tar后,并且将其用bzip2压缩,生成一个bzip2压缩过的包,命名为jpg.tar.bz2

  tar –cZf jpg.tar.Z *.jpg //将目录里所有jpg文件打包成jpg.tar后,并且将其用compress压缩,生成一个umcompress压缩过的包,命名为jpg.tar.Z

  rar a jpg.rar *.jpg //rar格式的压缩,需要先下载rar for linux

  zip jpg.zip *.jpg //zip格式的压缩,需要先下载zip for linux

  解压

  tar –xvf file.tar //解压 tar包

  tar -xzvf file.tar.gz //解压tar.gz

  tar -xjvf file.tar.bz2 //解压 tar.bz2

  tar –xZvf file.tar.Z //解压tar.Z

  unrar e file.rar //解压rar

  unzip file.zip //解压zip

  总结

  1、*.tar 用 tar –xvf 解压

  2、*.gz 用 gzip -d或者gunzip 解压

  3、*.tar.gz和*.tgz 用 tar –xzf 解压

  4、*.bz2 用 bzip2 -d或者用bunzip2 解压

  5、*.tar.bz2用tar –xjf 解压

  6、*.Z 用 uncompress 解压

  7、*.tar.Z 用tar –xZf 解压

  8、*.rar 用 unrar e解压

  9、*.zip 用 unzip 解压

  Linux中tar命令详解(转载的资料)

  2008年04月17日 星期四 15:37

  tar命令

  tar 可以为文件和目录创建档案。利用tar,用户可以为某一特定文件创建档案(备份文件),也可以在档案中改变文件,或者向档案中加入新的文件。tar最初被 用来在磁带上创建档案,现在,用户可以在任何设备上创建档案,如软盘。利用tar命令,可以把一大堆的文件和目录全部打包成一个文件,这对于备份文件或将 几个文件组合成为一个文件以便于网络传输是非常有用的。Linux上的tar是GNU版本的。

  语法:tar [主选项+辅选项] 文件或者目录

  使用该命令时,主选项是必须要有的,它告诉tar要做什么事情,辅选项是辅助使用的,可以选用。

  主选项:

  c 创建新的档案文件。如果用户想备份一个目录或是一些文件,就要选择这个选项。

  r 把要存档的文件追加到档案文件的未尾。例如用户已经作好备份文件,又发现还有一个目录或是一些文件忘记备份了,这时可以使用该选项,将忘记的目录或文件追加到备份文件中。

  t 列出档案文件的内容,查看已经备份了哪些文件。

  u 更新文件。就是说,用新增的文件取代原备份文件,如果在备份文件中找不到要更新的文件,则把它追加到备份文件的最后。

  x 从档案文件中释放文件。

  辅助选项:

  b 该选项是为磁带机设定的。其后跟一数字,用来说明区块的大小,系统预设值为20(20*512 bytes)。

  f 使用档案文件或设备,这个选项通常是必选的。

  k 保存已经存在的文件。例如我们把某个文件还原,在还原的过程中,遇到相同的文件,不会进行覆盖。

  m 在还原文件时,把所有文件的修改时间设定为现在。

  M 创建多卷的档案文件,以便在几个磁盘中存放。

  v 详细报告tar处理的文件信息。如无此选项,tar不报告文件信息。

  w 每一步都要求确认。

  z 用gzip来压缩/解压缩文件,加上该选项后可以将档案文件进行压缩,但还原时也一定要使用该选项进行解压缩。

  Linux下的压缩文件剖析

  对于刚刚接触Linux的人来说,一定会给Linux下一大堆各式各样的文件名给搞晕。别个不说,单单就压缩文件为例,我们知道在Windows下最常见 的压缩文件就只有两种,一是,zip,另一个是.rap。可是Linux就不同了,它有.gz、.tar.gz、tgz、bz2、.Z、.tar等众多的 压缩文件名,此外windows下的.zip和.rar也可以在Linux下使用,不过在Linux使用.zip和.rar的人就太少了。本文就来对这些 常见的压缩文件进行一番小结,希望你下次遇到这些文件时不至于被搞晕。

  在具体总结各类压缩文件之前呢,首先要弄清两个概念:打包和压缩。打包是指将一大堆文件或目录什么的变成一个总的文件,压缩则是将一个大的文件通过一些压 缩算法变成一个小文件。为什么要区分这两个概念呢?其实这源于Linux中的很多压缩程序只能针对一个文件进行压缩,这样当你想要压缩一大堆文件时,你就 得先借助另它的工具将这一大堆文件先打成一个包,然后再就原来的压缩程序进行压缩。

  Linux下最常用的打包程序就是tar了,使用tar程序打出来的包我们常称为tar包,tar包文件的命令通常都是以.tar结尾的。生成tar包后,就可以用其它的程序来进行压缩了,所以首先就来讲讲tar命令的基本用法:

  tar命令的选项有很多(用man tar可以查看到),但常用的就那么几个选项,下面来举例说明一下:

  # tar -cf all.tar *.jpg

  这条命令是将所有.jpg的文件打成一个名为all.tar的包。-c是表示产生新的包,-f指定包的文件名。

  # tar -rf all.tar *.gif

  这条命令是将所有.gif的文件增加到all.tar的包里面去。-r是表示增加文件的意思。

  # tar -uf all.tar logo.gif

  这条命令是更新原来tar包all.tar中logo.gif文件,-u是表示更新文件的意思。

  # tar -tf all.tar

  这条命令是列出all.tar包中所有文件,-t是列出文件的意思

  # tar -xf all.tar

  这条命令是解出all.tar包中所有文件,-t是解开的意思

  以上就是tar的最基本的用法。为了方便用户在打包解包的同时可以压缩或解压文件,tar提供了一种特殊的功能。这就是tar可以在打包或解包的同时调用其它的压缩程序,比如调用gzip、bzip2等。

  1) tar调用gzip

  gzip是GNU组织开发的一个压缩程序,.gz结尾的文件就是gzip压缩的结果。与gzip相对的解压程序是gunzip。tar中使用-z这个参数来调用gzip。下面来举例说明一下:

  # tar -czf all.tar.gz *.jpg

  这条命令是将所有.jpg的文件打成一个tar包,并且将其用gzip压缩,生成一个gzip压缩过的包,包名为all.tar.gz

  # tar -xzf all.tar.gz

  这条命令是将上面产生的包解开。

  2) tar调用bzip2

  bzip2是一个压缩能力更强的压缩程序,.bz2结尾的文件就是bzip2压缩的结果。与bzip2相对的解压程序是bunzip2。tar中使用-j这个参数来调用gzip。下面来举例说明一下:

  # tar -cjf all.tar.bz2 *.jpg

  这条命令是将所有.jpg的文件打成一个tar包,并且将其用bzip2压缩,生成一个bzip2压缩过的包,包名为all.tar.bz2

  # tar -xjf all.tar.bz2

  这条命令是将上面产生的包解开。

  3)tar调用compress

  compress也是一个压缩程序,但是好象使用compress的人不如gzip和bzip2的人多。.Z结尾的文件就是bzip2压缩的结果。与 compress相对的解压程序是uncompress。tar中使用-Z这个参数来调用gzip。下面来举例说明一下:

  # tar -cZf all.tar.Z *.jpg

  这条命令是将所有.jpg的文件打成一个tar包,并且将其用compress压缩,生成一个uncompress压缩过的包,包名为all.tar.Z

  # tar -xZf all.tar.Z

  这条命令是将上面产生的包解开

  有了上面的知识,你应该可以解开多种压缩文件了,下面对于tar系列的压缩文件作一个小结:

  1)对于.tar结尾的文件

  tar -xf all.tar

  2)对于.gz结尾的文件

  gzip -d all.gz

  gunzip all.gz

  3)对于.tgz或.tar.gz结尾的文件

  tar -xzf all.tar.gz

  tar -xzf all.tgz

  4)对于.bz2结尾的文件

  bzip2 -d all.bz2

  bunzip2 all.bz2

  5)对于tar.bz2结尾的文件

  tar -xjf all.tar.bz2

  6)对于.Z结尾的文件

  uncompress all.Z

  7)对于.tar.Z结尾的文件

  tar -xZf all.tar.z

  另外对于Window下的常见压缩文件.zip和.rar,Linux也有相应的方法来解压它们:

  1)对于.zip

  linux下提供了zip和unzip程序,zip是压缩程序,unzip是解压程序。它们的参数选项很多,这里只做简单介绍,依旧举例说明一下其用法:

  # zip all.zip *.jpg

  这条命令是将所有.jpg的文件压缩成一个zip包

  # unzip all.zip

  这条命令是将all.zip中的所有文件解压出来

  2)对于.rar

  要在linux下处理.rar文件,需要安装RAR for Linux,可以从网上下载,但要记住,RAR for Linux

  不是免费的;然后安装:

  # tar -xzpvf rarlinux-3.2.0.tar.gz

  # cd rar

  # make

  这样就安装好了,安装后就有了rar和unrar这两个程序,rar是压缩程序,unrar是解压程序。它们的参数选项很多,这里只做简单介绍,依旧举例说明一下其用法:

  # rar a all *.jpg

  这条命令是将所有.jpg的文件压缩成一个rar包,名为all.rar,该程序会将.rar 扩展名将自动附加到包名后。  

# unrar e all.rar

  这条命令是将all.rar中的所有文件解压出来

  到此为至,我们已经介绍过linux下的tar、gzip、gunzip、bzip2、bunzip2、compress、uncompress、 zip、unzip、rar、unrar等程式,你应该已经能够使用它们对.tar、.gz、.tar.gz、.tgz、.bz2、.tar.bz2、. Z、.tar.Z、.zip、.rar这10种压缩文件进行解压了,以后应该不需要为下载了一个软件而不知道如何在Linux下解开而烦恼了。而且以上方 法对于Unix也基本有效。

【linux】命令之mysql备份和恢复

备份

比如我们要备份mysql中已经存在的名为linux的数据库,要用到命令mysqldump 

命令格式如下: 

[root@linuxsir01 root]# mysqldump -u root -p linux > /root/linux.sql 

Enter password:在这里输入数据库的密码 

通过上面的命令,我们要明白两件事,首先备份数据库是要以数据库管理员的身份备份;其次:备份目的地是/root,备份的文件名是linux.sql。其实备份的位置和文件名,根据自己的情况来定。文件名可以自己来取,路径也可以自己来安排。

比如我想把linux的数据库备份到/home/beinan,数据库的文件名为linuxsir031130.sql,所以应该输入如下的命令。 

[root@linuxsir01 root]#mysqldump -u root -p linux > /home/beinan/linuxsir031130.sql 

Enter password:在这里输入数据库管理员root的数据库密码 

如果数据量大会占用很大空间,这时可以利用gzip压缩数据,命令如下: 

#mysqldump -u root -p tm | gzip > tm_050519.sql.gz 

这样我们到/home/beinan目录下就能发现mysql中名为linux的数据库的备份文件linuxsir031130.sql 

综上所述,我们学习时要学会变通。 

恢复

首先我们还是要操作上面几个过程,比如添加数据库管理员(如果您没有添加过mysql数据库管理员的话),创建数据库等。 

比如我们要把在/home/beinan这个目录中的linuxsir031130.sql这个备份,导入名为linux的数据库中,应该如下操作; 

[root@linuxsir01 root]#mysql -u root -p linux < /home/beinan/linuxsir031130.sql 

Enter password:在这里输入密码 

如果机器好,数据库比较小,几分钟就好了。 

如何导出数据库表的数据?(不同于备份哦) 

#mysql 
(#mysql>use linux;)#可有可无 
#mysql>select * from linux.table-name into outfile "/home/table-name.txt"; 

#/home/table-name.txt 可能会报错,如果这样去掉/home直接"table-name.txt" 

默认保存在/var/lib/mysql/table-name.txt 

对mysql数据库常用命令的一点补充; 

几个常用的mysql相关的管理命令 

mysql 命令:基本文本的,显示和使用的mysql数据库。前面已经简单的提过用法;比如登录等。 
mysqladmin 命令,用来创建和维护mysql数据库的命令,前面已经简单的提过; 
isamchk 是用来修复、检查和优化.ism后缀的数据库文件; 
mysqldump 是用于备份数据库,前面已经简单的说明过; 
myisamchk 用来修复.myi后缀的数据库文件; 

比如我们要检查名为linux的数据库.myi数据库表是否存在问题,应该用下面的命令; 

要把mysqld服务器停下来 

[root@linuxsir01 root]# /opt/mysql/share/mysql.server stop 

然后执行 

[root@linuxsir01 root]# /opt/mysql/bin/myisamchk /opt/mysql/var/linux/*.MYI 

上面的命令的意思就是检查所有的.myi文件,数据库的目录在/opt/mysql/var/linux/目录中 

如果有问题,应该用-r参数来修复 

[root@linuxsir01 root]# /opt/mysql/bin/myisamchk -r /opt/mysql/var/linux/*.MYI 

mysqlshow 命令:显示用户选择的数据库和表 

[root@linuxsir01 root]# /opt/mysql/bin/mysqlshow -uroot -p [数据库名] 

比如我要查看名为linux的数据库;应该是: 

[root@linuxsir01 root]# /opt/mysql/bin/mysqlshow -uroot -p linux

【技术新闻】为何编码规范每行代码不超过80个字符是合理的

也许在Python编码风格指导(PEP8)中最有争议的一部分要数每行代码不超过80个字符的限制。没错,实际上是79个字符,但我使用80个字符,这个大概数,它是给程序员的一个参考值。

古老的VT100终端

现在很多软件公司采用的编码规范基本是PEP8,但每行80个字符的限制除外。GitHub上的项目,大多数都遵循PEP8规范(这一点似乎达到了高度的统一),但遵守80个字符限制的很少。在一些有明确规定的规范标准中,这个限制可能会增加(100或120),甚至完全删除。这样做常长见的理由是:我们已经不是使用VT100终端编程的年代了,我们有了更大,更高分辨率的屏幕。这是事实,但我发现,在Python编码中采用这个80个字符的规范,配合空格的使用,这会让我们的代码更急凑,更可读。

有一点你可以看出,在自然情况下,Python语句的长度一般会占大概35-60个字符(不包括缩进)。更长的语句很少见。如果突然有一个句子比其它的要长很多,会显得很突兀,不好看。同样,使用强制性的空格来增加行宽能够从视觉上帮助你优化减少嵌套循环的层数,一般的建议是重构代码不要让缩进多于4层。

例如,把下面这个:

def search(directory, file_pattern, path_match,
           follow_symlinks=True, output=True, colored=True):
    ''' Search the files matching the pattern. The files will be returned, and can be optionally printed '''

    pattern = re.compile(file_pattern)

    results = []

    for root, sub_folders, files in os.walk(directory, followlinks=follow_symlinks):
        # Ignore hidden directories
        if '/.' in root:
            continue

        # Search in files and subfolders
        for filename in files + sub_folders:
            full_filename = os.path.join(root, filename)
            to_match = full_filename if path_match else filename
            match = re.search(pattern, to_match)
            if match:
                # Split the match to be able to colorize it
                # prefix, matched_pattern, sufix
                smatch = [to_match[:match.start()], to_match[match.start(): match.end()], to_match[match.end():]]
                if not path_match:
                    # Add the fullpath to the prefix
                    smatch[0] = os.path.join(root, smatch[0])

                if output:
                    print_match(smatch, colored)

                results.append(full_filename)

    return results

和这个比较:

def search(directory, file_pattern, path_match,
           follow_symlinks=True, output=True, colored=True):
    ''' Search the files matching the pattern.
        The files will be returned, and can be optionally printed '''

    pattern = re.compile(file_pattern)

    results = []

    for root, sub_folders, files in os.walk(directory,
                                            followlinks=follow_symlinks):
        # Ignore hidden directories
        if '/.' in root:
            continue

        # Search in files and subfolders
        for filename in files + sub_folders:
            full_filename = os.path.join(root, filename)
            to_match = full_filename if path_match else filename
            match = re.search(pattern, to_match)
            if match:
                # Split the match to be able to colorize it
                # prefix, matched_pattern, sufix
                smatch = [to_match[:match.start()],
                          to_match[match.start(): match.end()],
                          to_match[match.end():]]
                if not path_match:
                    # Add the fullpath to the prefix
                    smatch[0] = os.path.join(root, smatch[0])

                if output:
                    print_match(smatch, colored)

                results.append(full_filename)

    return results

在第一段代码里会出现滚动条,但即使是没有出现滚动条,这代码表现的也不美观,视觉上不平衡。第二段代码看起来更好,更容易阅读。

另外重要的一点是,我可以在屏幕上显示更多的东西。很多时候我们都需要屏幕上同时看一个文件的多个地方,或多个文件的内容。我喜欢的实现这个目的的方法是让它们按列排列。如果整个文件有80个宽度的限制,代码会有一个很好的呈现,我不用担心代码在编辑器里会否自动折行,不用去麻烦配置编辑器。如果我需要使用 vim在命令行里快速编辑一个文件,就不用担心文件的宽度。能专注于代码。

竖行排列显示

唯一有问题的是使用Django的时候。当使用Django框架,你需要使用很多像这样的调用:

ThisIsMyModel.objects.find(field1=value1, field2=value2).count() 

在有缩进的代码里,一个‘最小’的model函数调用都会让你没有多少剩余空间…但我仍然坚持相同的原则,尽量让代码表现的清晰可读,但这比起其它Python代码来要难的多。

所以,即使这个限制最初的愿望已经和现在完全不符合,我仍然觉得这个限制能帮助我写出更可读紧凑的代码。我是一个要求“可读性”的狂热分子,我甚至认为代码的可读性是一个最重要的需要考虑的方面,程序员应该在任何时候都铭记这一点。

Jhonse技术博客说明: 

http://www.aqee.net/80-chars-per-line-is-great/

 

【技术排行榜】2013年4月编程语言排行榜:Objective-C四年来排名首次下滑

2013年4月TIOBE编程语言排行榜发布!本月Java与C位置互换,C++反超Objective-C进前三,前三甲分别为C、Java、C++。这个月的排名情况,让你大跌眼镜吗?

可以说,在2009年夏天之前Objective-C这门语言很难被人熟知和使用。如今, Objective-C发展如此强劲这要归功于iPhone和iPad,使之一度窜至编程语言排行榜前三甲位置并连续两年摘得年度编程语言桂冠(2011年和2012年)。而今Objective-C的流行趋势发展开始停滞(发展缓慢),这也是自2009年以来第一次从第三降至第四位置。

那么,Objective-C发展缓慢的原因何在?此前看过一篇文章(做iOS开发,我为什么弃用Objective-C而选择RubyMotion?,作为一名iOS开发者Hendrik Mans从Objective-C顽固分子到RubyMotion忠实粉丝的转化过程。他甚至认为RubyMotion的核心思想是用优美的Ruby语言代替丑陋的Objective-C语言。

没了乔帮主的鼎力支持,Objective-C的命运令人担忧?

前20名榜单排行榜:

前10名编程语言走势图:

以下是21-50编程语言排名:

后50名的语言如下:

4th Dimension/4D, ABC, Agilent VEE, Alice, Apex, ATLAS, AutoLISP, bc, BlitzMax, C shell, CFML, CL (OS/400), Clarion, Clipper, Clojure, cT, Dart, Dylan, ECMAScript, Eiffel, Euphoria, F#, Gambas, Go, Groovy, Icon, IDL, LabVIEW, Lasso, Limbo, LPC, MUMPS, Oberon, OCaml, Occam, OpenCL, Oz, PowerShell, Q, REXX, RPG (OS/400), S, Smarty, SPARK, thinBasic, VBScript, VHDL, WebDNA, xBase, XSLT

必须声明,这个榜单本身采集的是英文世界的数据,虽然在反映趋势上有一些参考意义,但与中国的实际情况不完全符合,而且,这张采样本身也有相当大的局限性。

【说明】

TIOBE编程语言社区排行榜是编程语言流行趋势的一个指标,每月更新,这份排行榜排名基于互联网上有经验的程序员、课程和第三方厂商的数量。排名使用著名的搜索引擎(诸如Google、MSN、Yahoo!、Wikipedia、YouTube以及Baidu等)进行计算。请注意这个排行榜只是反映某个编程语言的热门程度,并不能说明一门编程语言好不好,或者一门语言所编写的代码数量多少。

 

【技术排行榜】Web框架性能排行榜,cakePHP表现最差

作为开发人员,你们有讨论过框架对项目的影响吗?一家名为TechEmpower的外包公司对当前流行的各种Web框架进行了测试。

一个框架对网站性能会产生多大影响呢?答案或许会让你大吃一惊。本文数据由自称CTO外包公司的TechEmpower测试所得:

JSON性能测试:

数据库连接测试:

吃惊的是,Cake框架在某些方面的性能居然可以这么低。

Jhonse技术博客说明:

来源于: http://www.oschina.net/news/39118/php-framework-benchmarks