一不小心改错了/etc/sudoers文件的权限,结果无法用sudo再次改回来了。
报错:
sudo: /etc/sudoers is mode 0640, should be 0440
Segmentation fault
小时候以为,聪明人加勤奋,天下无敌。于是夏练三伏,冬练三九,二十多年过去了,修成“IT劳模”。一日梦醒,才明白,人生的牌桌只和了两把屁胡。愧对江东父老,甚憾!要想大成,光靠勤奋和努力是远远不够的。
金山雷军说的,是句大实在话。我想说人生方向不能错,得有见识,见识就那样还能折腾什么样?
按照landscape-common即可。
sudo apt-get install landscape-common
移除该信息:
ubuntu_server_disable_landscape_information_at_login
最近富士康总是连跳,昨天亲眼见了小区里一跳楼惨状。
民不聊生!
给人们希望!给人们希望!给人们希望!给人们希望!给人们希望!给人们希望!给人们希望!
一个大写站立的人最基本的良知:
一、祖国是祖国,政府是政府;政府是奴仆,祖国是母亲,那些迷糊于政府是祖国甚至大肆口淫者,都是把母亲当成奴仆的禽兽,人人可诛之!
二、中华文明,包括《论语》,最大的精神之一,就是朝可改、代可换,任何奴仆想迷糊主人、在主人面前不把主人当人,最后的下场都是被打得稀巴烂,这才是真正的中国文化!
三、任何的政府,都只能是奴仆,政府官员更是奴仆,任何大写、站立的人,都是主人,都必须有主人的心态,对恶奴就是要教训,任何国家,只要大写站立的人越多,恶奴出现的机会越少,那些甘心给恶奴舔沟子的,衣冠禽兽都够不上,必须非人道毁灭之!
四、任何奴仆的花费,都来自主人,任何政府的运行与资金,都来自纳税人。不尊重纳税人的,没资格政府。棍棒之下出好仆,政府就是该被纳税人批评,干得好是政府及其官员的天职,无须赞美。干不好就下来,让干得好的上,这是天经地义的!
五、最无耻的就是所谓的父母官,父母是父母,官员不过是奴仆,父母官的意思是父母奴仆,这不是禽兽是什么?对官员,只能奴仆视之,觉得不爽的,就别当,没人求你!
好了,更多的就不写了,只要越来越多人能做到这几条,中国人民才真正站起来!
最后,必须补充的是,祖国不是用来爱的,祖国对于本ID来说,更是这样的土地,本ID心甘情愿地把肉烂于其中,把骨化在其中,即使把所有的鲜血只去浇灌其中一朵花朵,让她能在一个并不光明的清晨,开得更加娇艳,本ID也心甘情愿!
下面这段脚本保存为hello.py,位于Web 根目录下/dir/path目录,我们可以通过下面URL通过来访问
http://my_site.tld/dir/path/hello.py 或
http://my_site.tld/dir/path/hello
def index(): s = """\ <html> <body> <h2>Hello World!</h2> </body> </html> """ return s
文档根目录是Apache是查找请求文件的地方,可以查看http.conf找出文档根目录。
在配置中把位于/dir/path目录下的请求交由Publisher Handler来处理。
————————-
原文:http://webpython.codepoint.net/mod_python_publisher_hello_world
翻译:blog.panzhibiao.com
如果通过Linux发行包安装mod_python,下面这行配置通常已经在httpd.con之类的配置文件里了
LoadModule python_module modules/mod_python.so
没有请添加之。有两个配置选项可以配置:SetHandler和AddHandler指令。
SetHandler指令
本入门介绍将采用此方式。如果你希望避开郁闷的配置问题,你可以跟着此配置来做。采用下面这个配置,所有的文件都通过Publisher Handler来处理。
<Directory /path/to/publisher/directory> SetHandler mod_python PythonHandler mod_python.publisher PythonDebug On </Directory>
上述这几行配置必须包含在Apache的类似httpd.conf的配置文件或.htaccess文件中。<Directory>指令不可以在.htaccess文件中使用。只不过包含三行就搞定。
第一行, SetHandler mod_python, 告诉Apache所有文件都交给mod_python来处理,不管扩展名如何。
第二行,PythonHandler mod_python.publisher,是mod_python指令,指定使用Publisher Handler。
第三行,PythonDebug On,设置mod_python打印debug信息到标准输出,方便调试。在生产环境中应置为Off。
在后面的内容中我们将使用此配置。其开启遍历算法,比下面介绍的方便些。换句话说,它允许执行index page,哪怕在类似http://mysite.tld这样的URL中没有声明,同时.py扩展名也不是必须的。
如果需要处理一些静态文件,可以这么着来配置:
<Files ~ "\.(gif|html|jpg|png)$"> SetHandler default-handler </Files>
AddHandler指令
第二种是通过AddHandler指令代替SetHandler
AddHandler mod_python .py
通过此指令,其他类型的文件都交给默认的Hnadler来处理,而无需设置它们。这里需要在URLs中显式声明’.py’扩展名。
———————
原文:http://webpython.codepoint.net/mod_python_publisher_apache_configuration
翻译者:blog.panzhibiao.com
Mod_python是Apache专有模块。Mod_python 3.x系列需要Apache 2.x和Python 2.2.1以上版本。对于Apache 1.3只有使用mod_python 2.x系列了。本入门介绍使用mod_python 3.1以上版本。
对于每次CGI请求,Python解释器都必须运行一次。而mod_python方式,Apache会启动一个主解释器,对于每个apache虚拟主机都有一个子解释器,这个子解释器处理其所有请求,直至服务器关闭。
Apache处理完成一个请求是分阶段来进行,Handler是用于某个请求的特定过程中。Handlers由Apache及其扩展模块提供,比如mod_python。
mod_python中有多个handers可供选择。大部分的通用性不是很好,但Publisher和PSP却有着极好的通用性,这里我们将主要介绍一下。
PSP handler处理在文本中嵌入python代码的脚本,就像php和asp那样。如果你习惯使用这样方式,并不打算学习其他的模式,PSP是很好选择。
Publisher Handler允许通过URL方式,访问模块中的函数和变量。它避免出现意大利面条式的代码风格,其代码组织更像应用程序。
如果你的*nix发行版没有提供mod_python安装包,或者使用的是Windows平台,你可以到 modpython.org下载安装之。
——————-
原文:http://webpython.codepoint.net/mod_python_tutorial
翻译者:http://blog.panzhibiao.com
php函数调用并没有支持命名参数(具名参数),而命名参数有时候会特别好用,尤其函数拥有一大堆参数列表的时候。
通过下面方法可以间接实现php命名参数调用。
/** * 发起一个HTTP请求 * * @param string $url * @param array $options * * @example * * @return string */ function shttp_request($url, $options = array()) { //默认配置 $default_options = array( 'post_data' => array(), //可以关联数组,也可以直接是经过URL编码后字符串 'headers' => array(), //http请求头信息, 格式为KEY=>VALUE形式 'timeout' => 3, //sec, 超时,0为不限制 'follow_loc' => 0, //是否跟踪Location跳转 'output_header' => 0, //是否输出HTTP头信息 'userpwd' => array(), //用户名和密码,需要验证时使用。格式:array('username', 'password') 'maxredirs' => 5, // 最大跳转次数 'halt' => 1, //遇到错误是否exit ); $options = array_merge($default_options, $options); $ch = curl_init(); //url curl_setopt($ch, CURLOPT_URL, $url); //instead of outputting it out directly curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); //automatically set the Referer curl_setopt($ch, CURLOPT_AUTOREFERER, true); //TRUE to follow any "Location: " header that the server sends curl_setopt($ch, CURLOPT_FOLLOWLOCATION, $options['follow_loc'] ? true : false); //maximum amount of HTTP redirections to follow curl_setopt($ch, CURLOPT_MAXREDIRS, $options['maxredirs']); //The number of seconds to wait whilst trying to connect. Use 0 to wait indefinitely curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $options['timeout']); if( !empty($options['headers']) ) { $header_user_agent = 0;//is set user agent foreach ($options['headers'] as $hkey=>$hval) { if(strtolower(trim($hkey)) == 'user-agent') { $header_user_agent = 1; } $nheaders[] = trim($hkey).": ".trim($hval); } curl_setopt($ch, CURLOPT_HTTPHEADER, $nheaders); } //Set Default User-Agent if( empty($header_user_agent) ) { //IE7 on Windows Xp curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)'); } //TRUE to include the header in the output curl_setopt($ch, CURLOPT_HEADER, $options['output_header'] ? true : false); //HTTPS if( stripos($url, "https://") !== FALSE ) { curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); } //Set Username & Password if( !empty($options['userpwd']) ) { curl_setopt($ch, CURLOPT_USERPWD, "[{$options['username']}]:[{$options['password']}]"); } //post data if( !empty($options['post_data']) ) { curl_setopt($ch, CURLOPT_POST, true); if( is_array($options['post_data']) ) { $encoded = ""; foreach ( $options['post_data'] as $k=>$v) { $encoded .= "&".rawurlencode($k)."=".rawurlencode($v); } $encoded = substr($encoded, 1);//去掉首个'&' curl_setopt($ch, CURLOPT_POSTFIELDS, $encoded); }else{ curl_setopt($ch, CURLOPT_POSTFIELDS, $options['post_data']); } } $res = curl_exec($ch); if( $res === FALSE ) { //echo "[function shttp_request]REQUEST URL: {$url},FAILURE! Error: ".curl_error($ch)."\n"; if($options['halt']) { curl_close($ch); exit(); }else{ return FALSE; } } curl_close($ch); return $res; }
上面通过cURL模块实现一次HTTP请求函数,cURL通常具有很多参数,如果通过常见的参数列表往往需要特别长的参数才可以实现。但很麻烦,参数太多,次序记不住,容易出错。
通过传入一个php关联数组即可实现。默认配置写到函数内部,然后调用array_merge()来达到默认参数的效果,是不是很酷?
示例:发起一个调用
shttp_request("http://blog.panzhibiao.com", array('post_data'=>'a=1&b=2', 'timeout'=>10));
Windows安装Lua
http://code.google.com/p/luaforwindows/
Ubuntu 10.4安装Lua
到官方网站 http://www.lua.org/ftp/ 下在最新版Lua。
# 下在Lua最新版,并解压 wget http://www.lua.org/ftp/lua-5.1.4.tar.gz tar zxvf lua-5.1.4.tar.gz cd lua-5.1.4 # 安装libreadline5 sudo apt-get install libreadline5 libreadline5-dev # 安装编译工具 sudo apt-get install build-essential # 编译安装Lua sudo make linux sudo make install
资源
参考手册:http://www.lua.org/ftp/refman-5.0.pdf