mysql下管理用户的命令

安装完mysql默认的root用户虽然没有设置密码,但是只能在本机登录。如果linux系统本身已经足够安全,这也是一个不错的选择。我见过不少系统,为了操作方便,设置了一些非常简单的密码,这种简单的密码跟不设密码差不多了。

如果要改root用户的密码:首先进入mysql,然后运行

set PASSWORD FOR 'root'@'localhost' = PASSWORD('mypassword');

这条命令也可以用来更改其它用户的密码。从所周知,mysql的用户包含了两部分名字和主机名两部分。所以'root'@'%''root'@'localhost'是不一样的,mysql默认没有创建'root'@'%'这个用户。如果要更改其它用户的密码,只需要替换一下上述命令的用户名部分就可以了。

mysql使用create user命令来创建一个新用户,比如:

create user fish;

就创建了一个名为fish的新用户。使用drop user命令删除一个用户,比如:

drop user 'fish'@'%';

就删除了上面那个用户了。值得注意的是mysql认为单写fish就代表了'fish'@'%'

现在我们创建一个数据库:

:::mysql
create database mydatabase;

然后赋权限给fish这个用户。

grant all on mydatabase.* to fish;

all代表fish拥有该数据库的所有权限,当然,也可以细分权限,比如fish可以只拥有添加数据,而没有添加、删除表的权限。mysql还可以划分细至表的权限,详细的信息查看手册吧。

类型:LinuxApp,创建时间:十二月 31, 2011, 9:57 a.m. 点击查看完整内容。。。
怎么给linux的网卡绑定多个IP

windows下给网卡添加多个IP是很容易的事,那linux下应该怎么做呢?不同的linux发行版有不同的做法。这两天刚好需要做这么一个东西,于是google了一下,在终端下,最普适的方法是使用ifconfig命令。

比如要给第一个以太网网卡绑定192.168.0.1/24这个IP ,192.168.0.1/24这种写法朋友们应该知道吧,24的意思是掩码是255.255.255.0,前24个位是掩码。一条命令搞定:

/sbin/ifconfig eth0:1 192.168.0.1 netmask 255.255.255.0

这里面比较奇怪的是第一个参数eth0:1,据说这个叫虚拟设备?eth0是第一个以太网网卡,如果是第二个以太网网卡的话就是eth1,冒号后面是以0开始的数字,每个IP对应一个。

不过,唯一的问题是,启动系统之后配置的IP就丢了。

对于这个问题,如果是使用redhat的话, 终端下有一个很不错的setup命令。输入setup,选择网络配置,可以看到setup程序列出了所有的网卡,一般就是一个eth0eth1(如果双网卡的话)。我们可以新增一个设备,名为eth0:1,把IP地址和掩码填上去,下次启动就自动添加了这个IP了。想要立即生效的话就运行:

service network restart
类型:LinuxApp,创建时间:十二月 31, 2011, 9:53 a.m. 点击查看完整内容。。。
一个定时器,用来做类似于crontab的工作

前几天写一个后台程序,定时查看一个URL的修改,本来想用crontab做的,后来想想就算了,因为python写起来更简单。于是我就实现了一个每小时(可配置)醒过来做一次操作的小小工具类。与threading的Timer不一样的是,它是单线程的。

本文包含一段小脚本可以模拟crontab,定时在某个时间执行操作。

类型:Python,创建时间:十二月 31, 2011, 9:50 a.m. 点击查看完整内容。。。
应用python编写shell脚本

本文介绍使用python编写shell脚本所使用的模块与注意事项。主要是os, os.path, shutil。除了这三个模块,可以对文件以及文件夹之外,还有另外一些模块关注系统的其它方面,比如密码,帐户信息。

使用os.environ可以访问环境变量。使用sys.argv可以获得用户传入的参数。

类型:Python,创建时间:十二月 30, 2011, 9:03 p.m. 点击查看完整内容。。。
俯卧撑
【 以下文字转载自 NewExpress 讨论区 】
发信人: xfh (加油中国), 信区: NewExpress
标  题: 强大的俯卧撑
发信站: 水木社区 (Wed Jul  2 01:06:21 2008), 站内

欧阳峰蹲下了身子。

欧阳峰伸长了脖子。

欧阳峰瞪圆了双眼。

欧阳峰四肢着地。

欧阳峰鼓起了腮班。

洪七很冷静。

洪七解下了葫芦。

洪七拧开了葫芦盖子。

洪七咕嘟咕嘟地喝了几口。

“动手吧。”

洪七声音平静。

....

类型:随感,创建时间:十二月 30, 2011, 8:01 p.m. 点击查看完整内容。。。
screen程序使用初探

screen是用于在一个终端上模拟多个终端的linux程序。比如我们使用putty登录到linux,并且要运行多个程序。这时我们就可以使用screen程序。

screen程序的主要特性:

  • 可以模拟多个终端,使用Ctrl+A,N 这样的快捷键方便地切换。
  • 可以把正在进行的工作保存起来,下次登录的时候恢复它们。我们称之为会话管理,每次进行的所有工作组成一个会话。
  • 在不同的终端复制和粘贴,不知道怎么用。。

本文简单介绍screen命令行的使用,以及操作。

类型:LinuxApp,创建时间:十二月 31, 2011, 2 a.m. 点击查看完整内容。。。
在多线程编程的时候如何让子线程退出

虽然python下推荐使用多进程编程,但是在一些场合下,多线程编程还是方便一些。

最近就经常写一些关于网络方面的命令小程序,一个线程不断地从命令行得到用户的输入并且向网络发送一些东西,另外一个线程则从网络接收数据并打印在屏幕上。平常结束一个程序的办法是调用exit()函数,不过对于多线程的网络程序似乎却有点难办,因为除了一条sys.exit()语句外,还需要结束从网络接收数据的后台线程。

不幸的是python没有提供结束线程的接口,不能像java或者c#那样,使用thread.interrupt() 就可以让线程结束。更糟糕的是,python调用系统函数的时候会被阻塞在内核,除非阻塞被解除,这个线程不再继续执行python解释器的代码了,所以interrupt()理论上根本无法实现。那要怎么退出线程呢?我的解决办法是:

设置一个名为exiting的全局变量,从网络读数据的线程以它为循环条件。如果要让这个线程退出,只需要改变一下exiting的值,接着发送一些信息让线程退出阻塞。 调用线程的join函数可以等待线程退出。

类型:Python,创建时间:十二月 31, 2011, 1:48 a.m. 点击查看完整内容。。。
传参数应该用哪种形式——值、引用、指针?

最近写C++程序经常郁闷传参数的时候应该传值、传引用还是传指针。

  • 传值 :int func(User u);
  • 传指针: int func(User* u);
  • 传引用: int func(User& u);

传值是传参数最常见的方法,相当简单,是C++的基础传参方法。如果参数是整形、字符等基础类型,用传值的方法是最快的,也是最简单的。它的缺陷是对于一些很大的对象,比如上面定义的User对象,使用传值方法时,内存开销比较大,会重新创建一个User对象。还有一个情况,如果User是多态的,这样传参数会出问题。因为C++会调用新创建的User对象的复制构造函数,而默认的复制构造函数只会把需要的属性复制到新对象里,引起所谓的切割现象。

在C++古生代,传指针是传值之外的唯一方法。与传值相比较,需要考虑内存管理的问题,在栈上分配的对象通常就不能传递指针,因为函数返回之后栈上的对象会被析构,这时的指针就会成为野指针,引用它会造成内存访问异常。即使对象是在堆上分配的,传指针里也同样要考虑分配错误等问题。不过,与传值相比,传指针对付大型对象和多态对象很有效,而且,使用指针形式传递的变量在运行过程中可以被修改。

传引用似乎结合了两者的优点。与传指针一样,传引用能很好地对付大型对象多态对象,而且相对于传指针,传引用通常是不需要考虑内存管理的问题,因为只能使用另一个已经初始化的变量来初始化引用。一切看起来似乎都很美好。不过优点往往也是缺点,引用类型的变量不适合作为类的属性,因为引用一旦初始化就不能改变其指向的对象。C++这种面向底层的语言真是让人很痛苦。

总结一下:

基础类型传值、普通的非多态的对象传引用,多态对象以及分配在堆上的对象传指针。

类型:C++ & Qt4,创建时间:十二月 30, 2011, 7:43 p.m. 点击查看完整内容。。。
关于敏捷开发(转载)

敏捷开发的原则和优点

  • 快速、连续的交付
  • 频繁的交付
  • 工作软件
  • 适应
  • 亲密无间,日常协作
  • 积极主动、熟练人员
  • 自组织的团队
类型:随感,创建时间:十二月 30, 2011, 7:37 p.m. 点击查看完整内容。。。
维护多个WebService API版本的方法

随着软件系统的不断发展,与其相配套的API也必定会发生着不断的变化。如何降低API变化对外部系统的影响是大多数软件系统都要面对的挑战。

在设计指令集、SDK或者API时,向后兼容可以说是最基本的道德,这已经被无法的例子所验证。不过随着软件系统功能的不断增加,维持原来的API往往是不可能的。两相权宜,只能选择有条件的向后兼容。通常的做法是保留原来的函数,然后增加新的函数。比如CreateWindow(String className),如果要新增了一个参数,名为style,那么我们可以再新增一个函数如CreateWindowEx(String className, String style)。显而易见,这种方法是最简便的,却可能不是最好的。利用高级语言的特性可以把它修改为具有默认参数的函数如:CreateWindow(String className, String style="default"),或者简单地再创建一个新的同名函数:CreateWindow(String className, String style)。虽然不能指定默认参数的值,但是Web Service支持前一种做法。

类型:Java,创建时间:十二月 31, 2011, 1:33 a.m. 点击查看完整内容。。。
可重入函数

可重入函数的定义是:

  1. 不为连续的调用持有静态数据。
  2. 不返回指向静态数据的指针;所有数据都由函数的调用者提供。
  3. 使用本地数据,或者通过制作全局数据的本地拷贝来保护全局数据。
  4. 绝不调用任何不可重入函数。

可重入函数有一个很好的性质——它的输出只决定于输入,非常方便进行单元测试。

可重入函数没有全局数据,在运行的时候不会产生竞争条件,只要配合map & reduce这样的高阶函数就可以做并发编程,完全不需要额外的开销。随着多核处理器的流行,这样的概念应该会越来越流行的。

类型:随感,创建时间:十二月 30, 2011, 7:27 p.m. 点击查看完整内容。。。
配置iptables,把80端口转到8080

今天安装了一个tomcat服务器,不想让服务器直接以root用户运行,就配置了一个低权限的用户给它。但是,众所周知,在unix下,非root用户不能监听1024以上的端口号,这个tomcat服务器就没办法绑定在80端口下。

怎么办呢?有两种方案:

1、使用setuid或者sudo提升程序的权限。这个不好,跟直接用root一样的缺点。

2、把到80端口的服务请求都转到8080端口上。这个又分为两种方法。常见的方法是使用apache监听80端口,然后利用ajp转向把服务转到8080。这个办法有很多好处。比如对于一些静态或者php的url就可以直接由apache提供服务,而只把jsp的请求转到tomcat。这里不再详述。我使用的是第二种方法,利用iptables把80端口映射到8080。很简单,在root权限下运行一条命令:

iptables -t nat -A PREROUTING -p tcp –dport 80 -j REDIRECT –to-ports 8080

现在就可以看到效果了。不过据说不能拿本机做试验,因为本机的PREROUTING不起效果。你可以拿别人的机器试一下。

大多数Linux发行版本有关于iptables的配置文件,比如基于Redhat的发行版一般有一个/etc/sysconfig/iptables这个文件。使用这条命令把当前的iptables配置写到这个文件里:

iptables-save > /etc/sysconfig/iptables

重新启动机器之后端口映射就仍然有效

类型:LinuxApp,创建时间:十二月 30, 2011, 7:25 p.m. 点击查看完整内容。。。
对函数式编程的看法

最近函数式编程概念很火,似乎每个“现代化”的编程语言都要沾一下函数式编程,才能称之为现代化的编程语言。java打算在jdk7中加入闭包,.net则早已支持lambda语句。至于python,ruby,javascript等这些过程化的编程语言则争先恐后地加入了函数式编程的战团,各展优雅。可是,函数式编程真的那么重要吗?

这些过程化编程语言通常提供了一些高阶函数,以及对于闭包的支持。比如python提供了

  • map(function, sequence) -> list
  • filter(function,sequence) -> list
  • reduce(function,sequence) -> result

这些函数在现有的过程式语言环境中基本上都是类似的实现。可以说,不过是语法糖而已,函数式编程擅长的并行计算不可能在这种过程式的编程语言中自动地获得。这种函数式编程有什么意义?更好看还是更简洁?难道还有其它的理由吗?

闭包是具有闭合作用域的匿名函数。他带来的优点和缺点在很多文章中已经被详加探讨。基本上,闭包在大多数过程化的编程语言里被实现为匿名类。说实话,自从用过闭包之后,我就很自觉地将闭包的思想用于软件设计。不过,毕竟只是语法糖,有也可以,没有也不是很遗憾。如同前所述的高阶函数,我认为,它对现有的过程化编程语言改进不是很大。怪不得之前有人建议在Python 3000里去掉lambda

类型:Python,随感,创建时间:十二月 30, 2011, 7:22 p.m. 点击查看完整内容。。。
欧拉神

最近在看Kennth H. Rosen的《离散数学及其应用》,里面有一个欧拉的传记:

列昂哈德·欧拉(Leonhard Euler 1707-1783) 欧拉是瑞士巴赛尔附近一位加尔文教派牧师之子,他13岁进入巴塞尔大学,遵照父亲的愿望开始神学生涯。在大学里,欧拉受到著名的伯努利家族中的数学家约翰·伯努利的指导。他的兴趣和熟练的技能使他放弃神学研究而转向数学。欧拉16岁取得了哲学硕士学位。1727年彼得大帝邀请他加入圣彼得堡的科学院。1741年他来到柏林科学院,在这里一直呆到1766年。然后他回到圣彼得堡,并在那里度过余生。

欧拉的成果多得令人难以置信。他在数学的许多领域都做出了贡献,包括数论、组合以及分析在诸如音乐和造船学这些的领域的应用等。他写的书籍和文章数量在1100部以上,另外还有非常多的去世前未能发表的著作,以至于在他去世之后,用了47年才发表完他的所有著作。他写文章非常快,在世时总有一大摞文章等待发表。柏林科学院总是先发表这一摞最顶上的文章,所以后来的结果常常先于它们所依赖或取代的结果而发表。欧拉有13个孩子,当有一两个孩子在他膝上玩耍时,他照样能够工作。在他生命的最后17年里,他完全失明了。但是,由于他神奇的记忆力,他的数学研究成果的推出并没有受到影响。他的全集的出版工作 由瑞士自然科学协会负责,目前还在进行之中,预期将超过75卷。

类型:随感,创建时间:十二月 30, 2011, 7:18 p.m. 点击查看完整内容。。。
Python的startswith和endswith

做文本处理的时候经常要判断一个文本有没有以一个子串开始,或者结束。Python为此提供了两个函数:

S.startswith(prefix[, start[, end]]) -> bool

如果字符串`S以prefix开始,返回True,否则返回Falsestartend是两个可以缺省的参数。分别是开始比较的位置和结束比较的位置。这个函数也可以写成S[start:end].startswith(prefix)`。

S.endswith(suffix[, start[, end]]) -> bool

如果字符串Ssuffix结束,返回True,否者返回False。与startswith类似,这个函数也可以写成S[start:end].endswith(suffix)startend仍然是从左数起。

Python的这两个函数有个特别的地方——它的prefixsuffix参数不仅可以是字符串,还都可以是一个元组。只要其中一个成立,就返回True,也就是一种“或”的关系。比如:

if filename.endswith((".gif", ".jpg", ".tiff")):
    print "%s是一个图片文件"%filename

上面两行代码根据文件扩展名是否是gifjpgtiff之一来决定文件是不是图片文件。这个代码也可以写成:

if filename.endswith(".gif") or filename.endswith(".jpg") \
        or filename.endswith(".tiff"):
    print "%s是一个图片文件"%filename

不过这样比较麻烦。值得注意的是,不熟悉Python的朋友可能会忘了元组周围的括号。

类型:Python,创建时间:十二月 31, 2011, 1:16 a.m. 点击查看完整内容。。。
百年语言(转载)

Paul Graham 2003年4月

(本文出自2003年Python大会上的一篇主题讲话)

很难预测人们的生活在一百年后会是什么样子,我们只能给很少的事物一个确切的预测。我们知道到那时候每个人都将驾驶气垫轿车,地方法规将对建造上百层的高楼无所制约,大部分时间都将日月无光,女人们都将精通武术(martial arts)……在这里,让我们把这幅图景的一个细节放大来看看:那时候人们用什么编程语言来写那些气垫轿车的控制软件呢?

这是一个值得思考的问题,其意义不在于我们一定要用这种语言,而是在于据此我们可以选择可能发展成那种语言的语言——如果我们够幸运的话。

类型:Python,创建时间:十二月 30, 2011, 7:08 p.m. 点击查看完整内容。。。
两年不重装系统的秘诀

以前写的一些东西。。主要是我使用电脑的习惯。老是中毒重装电脑的可以看一下。

类型:随感,创建时间:十二月 30, 2011, 7:07 p.m. 点击查看完整内容。。。
Python的exit函数

在2.5版本之前的Python,输入exit或者quit会得到这样一条说明:

>>> exit
'Use Ctrl-D (i.e. EOF) to exit.'

尝试着输入exit()或者quit(),python报错。

>>> exit()
Traceback (most recent call last):
File "<stdin>", line 1, in ?
TypeError: "str" object is not callable

很多新手都碰到这个问题。似乎exitquit的存在只是为了告诉别人不要用exitquit。这可真是奇怪的逻辑。

新版本的Python改了这种做法。输入exit()quit()就如我们所料地退出了Python。这也意味着很多情况下我们不用再导入sys这个模块了

Python2.5之前的程序:

>>> import sys
>>> sys.exit()

现在:

>>> exit()

不过需要注意的事,脚本里面并不能应用exit()函数。它只存在于解释器内。这个改动主要是为了方便*nix程序员的使用。Windows程序员都喜欢直接关闭窗口吧。

类型:Python,创建时间:十二月 31, 2011, 1:03 a.m. 点击查看完整内容。。。
Python的条件运算符

长期以来Python世界的人一直在争论是否应该拥有条件运算符。它可以用来处理根据条件返回不同的值。比如:

if contition:
    x=true_value
else:
    x=false_value

他们虽然讨论了很久,但是一直没什么结果。在python-dev邮件列表和comp.lang.python新闻主上甚至为此举行了一次投票。最后的结果是大家都同意应该添加条件运算符,可是它的语法形式是什么还是没有结果。主要的争论是C语言的cond ? true_v : false_vif cond then true_v else false_v到底挑哪个好。

最终,Guido van Rossum(Python语言的作者)挑了这样一个令人意想不到的语法形式:

true_value if condition else false_value

它的意义是:如果condition为真,计算并返回true_value,并跳过false_value的计算,否则计算并返回false_value。它完全等价于完整形式。

这个表达式的优先级是最低的,但是它优于=号。因此以下这两种形式是一样的

level = 1 if logging else 0
level = (1 if logging else 0)

不过笔者认为后一种形式看起来比较好一点,而且可以免去记忆运算符优先级的麻烦。

类型:Python,创建时间:十二月 30, 2011, 6:59 p.m. 点击查看完整内容。。。
Python的日志系统

如果使用Python写一个比较大型的程序,你一定会用上日志系统。特别是Python这样的动态语言,很多错误都只能在运行的时候才能发现,一个好的日志系统对于Python程序相当重要。最简单的解决方案当然是直接使用print输出运行信息。但是这样太简单了,没有分级功能,如果在发布的时候想去掉调试用的运行信息还得找出所有的print语句进行修改。再者,print只能输出到控制台,想要输出到文件或者通过电子邮件发送到其他地方,一个print语句就没办法解决了。

通过使用Python的日志系统,就可以解决以上问题。

本文介绍了logging模块的简单使用,以及如何设置日志的输出格式、输出方式和过滤器。logging模块不止可以在屏幕上打印出日志信息,还可以将信息保存在文件,或者发到网络上,或者保存到linux/windows的系统日志里面。点击文章标题就可以阅读更多信息。

类型:Python,创建时间:十二月 31, 2011, 12:56 a.m. 点击查看完整内容。。。