Jun
14
#UPDATE: 并不是不能处理反引号,而是不能直接写%,需要转义。
某脚本x.sh,接受一个参数,比如20110517,用于处理20110517的日志。
处理前一天的日志,非常理所当然地使用如下命令
由于是每天早上8点30分执行,所以很理所当然地:
$ crontab -e
30 8 * * * PATH_TO_SCRIPT/x.sh `date -d "-1 day" +%Y%m%d`
但是过了几天发现脚本根本就没有被处理(在某些机器上,cron fail时会将邮件发送给用户"You have new mail in /var/spool/mail/USERNAME")。
原因是坑爹的cron没法正确处理反引号。
解决办法是,额外写个脚本将这句命令包装,在crontab中执行包装脚本 在%前面都加上反斜杠。
某脚本x.sh,接受一个参数,比如20110517,用于处理20110517的日志。
处理前一天的日志,非常理所当然地使用如下命令
PATH_TO_SCRIPT/x.sh `date -d "-1 day" +%Y%m%d`
由于是每天早上8点30分执行,所以很理所当然地:
$ crontab -e
30 8 * * * PATH_TO_SCRIPT/x.sh `date -d "-1 day" +%Y%m%d`
但是过了几天发现脚本根本就没有被处理(在某些机器上,cron fail时会将邮件发送给用户"You have new mail in /var/spool/mail/USERNAME")。
解决办法是,
May
27
前些天写的程序在上线的时候出现BUG了,错误提示就是call_user_func_array无法调用指定的函数。
代码大概是这样的
追了一下发现是PHP版本的问题,开发环境使用的是php 5.2.17,而线上环境是旧版本的5.1.6。5.1版的php的call_user_func / call_user_func_array函数没法调用类的静态函数,所以出现了这个问题。
没有很好的解决方法,大致就是
1. 升级PHP(最后我们是这么做的)
2. 使用字符串拼出一段php代码,然后用eval来执行。很挫,但是也能用。
代码大概是这样的
class foo {
public static function bar($arg1, $arg2) {
//do sth.
}
}
call_user_func_array("foo:bar", array(1, 2));
public static function bar($arg1, $arg2) {
//do sth.
}
}
call_user_func_array("foo:bar", array(1, 2));
追了一下发现是PHP版本的问题,开发环境使用的是php 5.2.17,而线上环境是旧版本的5.1.6。5.1版的php的call_user_func / call_user_func_array函数没法调用类的静态函数,所以出现了这个问题。
没有很好的解决方法,大致就是
1. 升级PHP(最后我们是这么做的)
2. 使用字符串拼出一段php代码,然后用eval来执行。很挫,但是也能用。
May
21
支持到 万亿,精确到角分。
<?php
$_NUMS = array('零','壹','贰','叁','肆','伍','陆','柒','捌','玖');
function four_num($num)
{
global $_NUMS;
$unit = array("", "拾", "佰", "仟");
$str = '';
$i = 0;
if ($num == 0)
return '零';
$arr_str = array();
while ($num > 0) {
$x = $num % 10;
if ($x == 0)
$arr_str[] = $_NUMS[0];
else
$arr_str[] = $_NUMS[$x] . $unit[$i];
$num = floor($num / 10);
$i++;
}
$arr_str = array_reverse($arr_str);
$str = join("", $arr_str);
$str = preg_replace('/(零)+/', '零', $str);
$str = preg_replace('/零$/', '', $str);
return $str;
}
function rmb($amount)
{
//去除开头的空格、正负号、前导0、小数点、符号
$amount = preg_replace('/(^\s*(\+|-)?0*)|\.|¥/', '', $amount);
if ($amount == '')
return '零元整';
if (strlen($amount) == 1) $amount = '0' . $amount;
$int_part = substr($amount, 0, '-2');
$float_part = substr($amount, -2);
$jiao = intval($float_part{0});
$fen = intval($float_part{1});
$unit = array('', '万', '亿', '万');
while (strlen($int_part) % 4 != 0) $int_part = '0' . $int_part;
$groups = str_split($int_part, 4);
$groups = array_reverse($groups);
//print_r($groups);
$arr_str = array();
for ($i = 0; $i < count($groups); $i++) {
$arr_str[] = four_num($groups[$i]) . $unit[$i];
if ($groups[$i] < 1000)
$arr_str[] = '零';
}
$arr_str = array_reverse($arr_str);
//print_r($arr_str);
$ret = join('', $arr_str);
$ret = preg_replace('/^(零)+/', '', $ret);
$ret = preg_replace('/(零)+/', '零', $ret);
$ret = preg_replace('/零万/', '', $ret);
$ret = preg_replace('/零亿/', '亿', $ret);
$ret = preg_replace('/(零)$/', '', $ret);
if ($ret !== '') $ret .= '元';
if ($float_part == 0) {
$ret .= '整';
}
else {
global $_NUMS;
if ($ret !== '' && ($groups[0] % 10 == 0 || $jiao == 0)) {
$ret .= '零';
}
if ($jiao != 0) $ret .= $_NUMS[$jiao] . '角';
if ($fen != 0) $ret .= $_NUMS[$fen] . '分';
}
return $ret;
}
//TEST CASE
case_test("壹仟肆佰零玖元伍角", rmb('1409.50'));
case_test("陆仟零柒元壹角肆分", rmb('6007.14'));
case_test("壹仟陆佰捌拾元零叁角贰分", rmb('1680.32'));
case_test("壹拾万柒仟元零伍角叁分", rmb('107000.53'));
case_test("壹万陆仟肆佰零玖元零贰分", rmb('16409.02'));
case_test("叁佰贰拾伍元零肆分", rmb('325.04'));
case_test("壹亿壹仟元零叁角", rmb('10000100030'));
function case_test($stdans, $ans)
{
if ($stdans == $ans)
echo "TEST OK\n";
else
echo "$stdans <==> $ans\n";
}
?>
$_NUMS = array('零','壹','贰','叁','肆','伍','陆','柒','捌','玖');
function four_num($num)
{
global $_NUMS;
$unit = array("", "拾", "佰", "仟");
$str = '';
$i = 0;
if ($num == 0)
return '零';
$arr_str = array();
while ($num > 0) {
$x = $num % 10;
if ($x == 0)
$arr_str[] = $_NUMS[0];
else
$arr_str[] = $_NUMS[$x] . $unit[$i];
$num = floor($num / 10);
$i++;
}
$arr_str = array_reverse($arr_str);
$str = join("", $arr_str);
$str = preg_replace('/(零)+/', '零', $str);
$str = preg_replace('/零$/', '', $str);
return $str;
}
function rmb($amount)
{
//去除开头的空格、正负号、前导0、小数点、符号
$amount = preg_replace('/(^\s*(\+|-)?0*)|\.|¥/', '', $amount);
if ($amount == '')
return '零元整';
if (strlen($amount) == 1) $amount = '0' . $amount;
$int_part = substr($amount, 0, '-2');
$float_part = substr($amount, -2);
$jiao = intval($float_part{0});
$fen = intval($float_part{1});
$unit = array('', '万', '亿', '万');
while (strlen($int_part) % 4 != 0) $int_part = '0' . $int_part;
$groups = str_split($int_part, 4);
$groups = array_reverse($groups);
//print_r($groups);
$arr_str = array();
for ($i = 0; $i < count($groups); $i++) {
$arr_str[] = four_num($groups[$i]) . $unit[$i];
if ($groups[$i] < 1000)
$arr_str[] = '零';
}
$arr_str = array_reverse($arr_str);
//print_r($arr_str);
$ret = join('', $arr_str);
$ret = preg_replace('/^(零)+/', '', $ret);
$ret = preg_replace('/(零)+/', '零', $ret);
$ret = preg_replace('/零万/', '', $ret);
$ret = preg_replace('/零亿/', '亿', $ret);
$ret = preg_replace('/(零)$/', '', $ret);
if ($ret !== '') $ret .= '元';
if ($float_part == 0) {
$ret .= '整';
}
else {
global $_NUMS;
if ($ret !== '' && ($groups[0] % 10 == 0 || $jiao == 0)) {
$ret .= '零';
}
if ($jiao != 0) $ret .= $_NUMS[$jiao] . '角';
if ($fen != 0) $ret .= $_NUMS[$fen] . '分';
}
return $ret;
}
//TEST CASE
case_test("壹仟肆佰零玖元伍角", rmb('1409.50'));
case_test("陆仟零柒元壹角肆分", rmb('6007.14'));
case_test("壹仟陆佰捌拾元零叁角贰分", rmb('1680.32'));
case_test("壹拾万柒仟元零伍角叁分", rmb('107000.53'));
case_test("壹万陆仟肆佰零玖元零贰分", rmb('16409.02'));
case_test("叁佰贰拾伍元零肆分", rmb('325.04'));
case_test("壹亿壹仟元零叁角", rmb('10000100030'));
function case_test($stdans, $ans)
{
if ($stdans == $ans)
echo "TEST OK\n";
else
echo "$stdans <==> $ans\n";
}
?>
Mar
29
本文转自 酷壳(Coolshell.cn) http://coolshell.cn/articles/4102.html 酷壳这个网站非常不错,推荐大家订阅。
-----------------
有人在酷壳的留言版上询问下面的问题
keep_walker :
今天晚上我看到这篇文章。
http://programmers.stackexchange.com/questions/62502/small-c-projects
我也遇到了和提问的老外一样的问题。。能给像遇到这样烦恼的程序员一点建议嘛?谢谢!
我相信,这可能是很多朋友的问题,我以前也有这样的感觉,编程编到一定的时候,发现能力到了瓶颈,既不深,也不扎实,半吊子。比如:你长期地使用Java和.NET ,这些有虚拟机的语言对于开发便利是便利,但是对于程序员来说可能并不太好,原因有两个:
1. 虚拟机屏蔽了操作系统的系统调用,以及很多底层机制。
2. 大量的封装好的类库也屏蔽了很多实现细节。
一段时间后,你会发现你知其然,不知所以然。。我以前在CSDN上写过一篇《Java NIO类库Selector机制解析(上,下,续)》,在那篇文章中我说提到过(有讥讽的语气)Java的程序员不懂底层实现,所以很难把技术学得更扎实。此时,一部分程序员会不自然地想学学底层的技术,很自然的,C语言就被提了上来。
下面是我给这位朋友的一些建议:
· 鼓励并为你叫好。我鼓励你想要去学C语言的想法和精神,很多人都觉得C语言好学,其实并不然,现在的这个社会更多地去关注那些时髦的技术,而忽略了这个流行了40+年的C语言。一门技术如果能够流行40多年,这才是你需要去关注和学习的技术,而不是那些刚出来的技术(过度炒作的技术,Windows编程史)。这才是踏踏实实的精神。
· 不要找借口。这一条路走下来并不容易,不要给自己找借口。我最不喜欢听到的就是“很忙,没有时间”这样的借口。我以前在银行做项目,早9点到晚10点,周一到周六,我一样可以每天抽1个小时来看书和专研,一年下来也能精读5、6本书。我现在的工作项目和招聘任务很紧张,刚生的小孩只有自己和老婆两人带,还需要准备讲课,但是我还是能够找到时间看文章写文章维护酷壳。所以,我可以告诉你,“时间就像乳沟,只要你肯挤,就一定会有”。
· 学好C语言和系统编程。我认为,学好编程有四个方面:语言、算法和数据结构、系统调用和设计。
·· 语言。我可以告诉你C语言有两大主题你要好好学,一个是内存管理,一个是指针!这个世界上90%以上的C/C++出的严重性错误全是和这两个有关。不要看谭浩强的那本书,那本是本烂书。推荐这本书给你《C程序设计语言(第2版·新版)》
·· 算法和数据结构。我认为,用C语言实现算法和数据结构莫过于最爽的事情。推荐你看这本书——算法:C语言实现(第1~4部分)基础知识、数据结构、排序及搜索(原书第3版)
·· 系统编程。Windows下推荐两本书——《Windows 程序设计 》和《Windows核心编程》,Unix/Linux下推荐两本书——《Unix高级环境编程》和《Unix网络编程卷1,套接字》《Unix网络编程卷2,进程间通信》尤其是《Unix网络编程》这本书,一通百通,无论Windows还是Unix/Linux,都是一样的。
·· 系统设计。关于设计方面,我全力推荐《Unix编程艺术》,看完以后,你就明白什么是真正的编程文化了。然后,当你看到Windows的Fans的某些言论时,你就知道什么叫一笑了之了。
如果你能在2-3年内精读完这些书,并全部融会贯通,那么你就明白什么是一览众山小的感觉了!我足足花了5年时间才算是真正全部读完这些书的。最后,祝你好运!努力!
-----------------
有人在酷壳的留言版上询问下面的问题
keep_walker :
今天晚上我看到这篇文章。
http://programmers.stackexchange.com/questions/62502/small-c-projects
我也遇到了和提问的老外一样的问题。。能给像遇到这样烦恼的程序员一点建议嘛?谢谢!
我相信,这可能是很多朋友的问题,我以前也有这样的感觉,编程编到一定的时候,发现能力到了瓶颈,既不深,也不扎实,半吊子。比如:你长期地使用Java和.NET ,这些有虚拟机的语言对于开发便利是便利,但是对于程序员来说可能并不太好,原因有两个:
1. 虚拟机屏蔽了操作系统的系统调用,以及很多底层机制。
2. 大量的封装好的类库也屏蔽了很多实现细节。
一段时间后,你会发现你知其然,不知所以然。。我以前在CSDN上写过一篇《Java NIO类库Selector机制解析(上,下,续)》,在那篇文章中我说提到过(有讥讽的语气)Java的程序员不懂底层实现,所以很难把技术学得更扎实。此时,一部分程序员会不自然地想学学底层的技术,很自然的,C语言就被提了上来。
下面是我给这位朋友的一些建议:
· 鼓励并为你叫好。我鼓励你想要去学C语言的想法和精神,很多人都觉得C语言好学,其实并不然,现在的这个社会更多地去关注那些时髦的技术,而忽略了这个流行了40+年的C语言。一门技术如果能够流行40多年,这才是你需要去关注和学习的技术,而不是那些刚出来的技术(过度炒作的技术,Windows编程史)。这才是踏踏实实的精神。
· 不要找借口。这一条路走下来并不容易,不要给自己找借口。我最不喜欢听到的就是“很忙,没有时间”这样的借口。我以前在银行做项目,早9点到晚10点,周一到周六,我一样可以每天抽1个小时来看书和专研,一年下来也能精读5、6本书。我现在的工作项目和招聘任务很紧张,刚生的小孩只有自己和老婆两人带,还需要准备讲课,但是我还是能够找到时间看文章写文章维护酷壳。所以,我可以告诉你,“时间就像乳沟,只要你肯挤,就一定会有”。
· 学好C语言和系统编程。我认为,学好编程有四个方面:语言、算法和数据结构、系统调用和设计。
·· 语言。我可以告诉你C语言有两大主题你要好好学,一个是内存管理,一个是指针!这个世界上90%以上的C/C++出的严重性错误全是和这两个有关。不要看谭浩强的那本书,那本是本烂书。推荐这本书给你《C程序设计语言(第2版·新版)》
·· 算法和数据结构。我认为,用C语言实现算法和数据结构莫过于最爽的事情。推荐你看这本书——算法:C语言实现(第1~4部分)基础知识、数据结构、排序及搜索(原书第3版)
·· 系统编程。Windows下推荐两本书——《Windows 程序设计 》和《Windows核心编程》,Unix/Linux下推荐两本书——《Unix高级环境编程》和《Unix网络编程卷1,套接字》《Unix网络编程卷2,进程间通信》尤其是《Unix网络编程》这本书,一通百通,无论Windows还是Unix/Linux,都是一样的。
·· 系统设计。关于设计方面,我全力推荐《Unix编程艺术》,看完以后,你就明白什么是真正的编程文化了。然后,当你看到Windows的Fans的某些言论时,你就知道什么叫一笑了之了。
如果你能在2-3年内精读完这些书,并全部融会贯通,那么你就明白什么是一览众山小的感觉了!我足足花了5年时间才算是真正全部读完这些书的。最后,祝你好运!努力!
Mar
9
估计以后邀请码就比较容易搞了,这就是最后一次派送啦~
http://www.diandian.com/r/027e6099
http://www.diandian.com/r/037b2f51
http://www.diandian.com/r/33aab971
http://www.diandian.com/r/50ad60cd
http://www.diandian.com/r/52f95bc3
http://www.diandian.com/r/5abb05b0
http://www.diandian.com/r/79956ca4
http://www.diandian.com/r/8794afb2
http://www.diandian.com/r/9ea68bf2
http://www.diandian.com/r/a34bd3e9
http://www.diandian.com/r/bb370768
http://www.diandian.com/r/bcc267f7
http://www.diandian.com/r/c491726e
http://www.diandian.com/r/ec98f20e
http://www.diandian.com/r/f7c36b9c
http://www.diandian.com/r/fd75a7bb
http://www.diandian.com/r/027e6099
http://www.diandian.com/r/037b2f51
http://www.diandian.com/r/33aab971
http://www.diandian.com/r/50ad60cd
http://www.diandian.com/r/52f95bc3
http://www.diandian.com/r/5abb05b0
http://www.diandian.com/r/79956ca4
http://www.diandian.com/r/8794afb2
http://www.diandian.com/r/9ea68bf2
http://www.diandian.com/r/a34bd3e9
http://www.diandian.com/r/bb370768
http://www.diandian.com/r/bcc267f7
http://www.diandian.com/r/c491726e
http://www.diandian.com/r/ec98f20e
http://www.diandian.com/r/f7c36b9c
http://www.diandian.com/r/fd75a7bb
Mar
4
http://www.diandian.com/r/52f7c9ac
http://www.diandian.com/r/16b7315d
http://www.diandian.com/r/432311ec
http://www.diandian.com/r/e574befe
http://www.diandian.com/r/59a2739b
http://www.diandian.com/r/a097a1a3
http://www.diandian.com/r/16b7315d
http://www.diandian.com/r/432311ec
http://www.diandian.com/r/e574befe
http://www.diandian.com/r/59a2739b
http://www.diandian.com/r/a097a1a3
Mar
1
http://www.diandian.com/r/8dfe1b5c
http://www.diandian.com/r/a097a1a
http://www.diandian.com/r/d954af00
http://www.diandian.com/r/a1d1bb05
http://www.diandian.com/r/c221cc06
http://www.diandian.com/r/30435e12
http://www.diandian.com/r/1c939121
http://www.diandian.com/r/f5ad9e83
http://www.diandian.com/r/31e5ad13
http://www.diandian.com/r/a097a1a
http://www.diandian.com/r/d954af00
http://www.diandian.com/r/a1d1bb05
http://www.diandian.com/r/c221cc06
http://www.diandian.com/r/30435e12
http://www.diandian.com/r/1c939121
http://www.diandian.com/r/f5ad9e83
http://www.diandian.com/r/31e5ad13