工作中任务优先级的排序–台面儿上的事儿

最近工作中遇到一些问题。总结起来就是台面儿上的事儿做的不够。

为了吸取教训,总结一下给自己,以便以后杜绝此类事情的发 生。

  1. 领导看的是某些list,因此,功夫要下在这些list上面,因为不管你领导看不见的工作做的有多好,list不漂亮等于零,就算你做的再垃圾,list做的好,台面儿上的话讲的好,你依然是领导心目中的好兵。
  2. 对于需求的变更,要先声明流程,声明有可能带来的延期以及预估延期时间,并知会相关人员。
  3. 一个人的能力毕竟是有限的,要熟练掌握分配任务与督促、协调。
  4. 当没有明确授权的时候,低调而不失速度的往前走。参照第一条,经常发一些进展的邮件,做好list,尽管这可能会占用你宝贵的编码时间。而且你的兴趣不在这,但光练不说假把式,说,也很重要。有由可能会逐渐带来明确的授权。
  5. 杜绝工作中的情绪化,这会毁掉你的前途,尤其是你面对的是一些你猜不透的领导和根深蒂固的“嫡系部队”的时候。

 

Posted in 心情随笔 | Leave a comment

php查询MongoDB遇到长整型的问题

困扰了我一天的问题。首先是Mongodb副本集。查php的Mongo扩展手册把副本集搞定。然后又是长整型时间的问题。

存进mongo的是java的长整型时间戳。而php是弱类型语言,且php的时间戳是11位。目前还是10位的阶段。转换成java的时间戳需要在后面补零。

// 生成java时间戳
$time = (string)$time.'000';
$time = (int)$time;

但是查询结果根本没有数据。把框架的Mongo用Debug打印出查询语句,没有问题。把查询语句直接在shell里查也没问题。但就是没数据。
后来打开Mongo的日志,调整级别为5,这样会记录查询语句。参照这里

发现我所查询的时间都变成了负数:“{ $gt: -154503944 }

然后万能的google找到了答案。php的长整型需要使用MongoInt64这个类来转换一下。虽然你在php中输出结果是一样的,但查询起来就不一样了。那么在上面的语句后面再加上一句就对了。

// 必须的一步,将长整形使用MongoInt64转换成64位整型
$time = new MongoInt64($time);

Mongo扩展的类参考在这里:http://www.php.net/manual/en/mongoint64.construct.php

Posted in PHP & MYSQL | Tagged | 1 Comment

Yii框架针对gbk编码的修改,CHtml可用,兼容php5.4

如果你的Yii框架不得已要使用gbk编码,你要做的有四件事:
1.复制一份儿框架中的中文语言包出来改为gbk编码,放在protected/messages,然后配置文件的components段中加入

// gbk编码的语言包
'coreMessages'=>array(
	//'basePath'=>null,
	'basePath'=>  dirname(__FILE__).DIRECTORY_SEPARATOR.'..'.DIRECTORY_SEPARATOR.'messages',
),

2.复制一份儿框架中的i18n中关于中文的文件改为gbk编码,放在protected/i18n/data下
然后config/main.php中加入

'localeDataPath'=>dirname(__FILE__).DIRECTORY_SEPARATOR.'../i18n/data',

3.复制一份儿框架中的views/exception.php到protected/views/system,改一下里面的编码为gbk,默认是utf8,否则调试页面就乱码了。

4.修改CHtml类:

CHtml类使用了htmlspecialchars来格式化输出,但htmlspecialchars不支持gbk编码。
当然,你可以把htmlspecialchars的编码去掉,但php5.4这样做时,就会没有输出。
一共改两个方法,一个是encode,还有一个encodearray

如果你使用了apc的话,请修改框架目录中yiilite.php中对应的两个方法。

如果你不使用apc的话,并且像我一样不愿意修改框架本身,可以把Chtml复制一份出来然后使用Yii的classmap来自定义这个类的路径。然后在入口文件处来定义,例如我的:

require_once ($yii);
// 重写yii class map,使用自定义的CHtml。 yiilite中的代码要手动修改不能使用此方法覆盖
Yii::$classMap=array('CHtml'=>__DIR__.'/../protected/extensions/helpers/CHtml.php');

下面是要修改的CHtml类中的两个方法

public static function encode($text)
{
	if(PHP_VERSION < '5.4.0') {
		return htmlspecialchars($text,ENT_QUOTES);
	}
	else
	{
		if(strtolower(Yii::app()->charset) == 'utf-8') {
			$charset = 'UTF-8';
		} else {
			$charset = 'ISO-8859-1';
		}
		return htmlspecialchars($text,ENT_QUOTES,$charset);
	}

	return htmlspecialchars($text,ENT_QUOTES,Yii::app()->charset);
}
public static function encodeArray($data)
{
	$d=array();
	foreach($data as $key=>$value)
	{
		if(is_string($key))
			$key=self::encode($key);
		if(is_string($value))
			$value=self::encode($value);
		else if(is_array($value))
			$value=self::encodeArray($value);
		$d[$key]=$value;
	}
	return $d;
}

 

Posted in PHP & MYSQL | Tagged , | 1 Comment

js浮点数运算,加减乖除函数

//浮点数加法运算
function FloatAdd(arg1, arg2) {
    var r1, r2, m;
    try {
        r1 = arg1.toString().split(".")[1].length
    } catch(e) {
        r1 = 0
    }
    try {
        r2 = arg2.toString().split(".")[1].length
    } catch(e) {
        r2 = 0
    }
    m = Math.pow(10, Math.max(r1, r2)) return (arg1 * m + arg2 * m) / m
}

//浮点数减法运算
function FloatSub(arg1, arg2) {
    var r1, r2, m, n;
    try {
        r1 = arg1.toString().split(".")[1].length
    } catch(e) {
        r1 = 0
    }
    try {
        r2 = arg2.toString().split(".")[1].length
    } catch(e) {
        r2 = 0
    }
    m = Math.pow(10, Math.max(r1, r2));
    //动态控制精度长度
    n = (r1 >= r2) ? r1: r2;
    return ((arg1 * m - arg2 * m) / m).toFixed(n);
}

//浮点数乘法运算
function FloatMul(arg1, arg2) {
    var m = 0,
    s1 = arg1.toString(),
    s2 = arg2.toString();
    try {
        m += s1.split(".")[1].length
    } catch(e) {}
    try {
        m += s2.split(".")[1].length
    } catch(e) {}
    return Number(s1.replace(".", "")) * Number(s2.replace(".", "")) / Math.pow(10, m)
}

//浮点数除法运算
function FloatDiv(arg1, arg2) {
    var t1 = 0,
    t2 = 0,
    r1, r2;
    try {
        t1 = arg1.toString().split(".")[1].length
    } catch(e) {}
    try {
        t2 = arg2.toString().split(".")[1].length
    } catch(e) {}
    with(Math) {
        r1 = Number(arg1.toString().replace(".", "")) r2 = Number(arg2.toString().replace(".", "")) return (r1 / r2) * pow(10, t2 - t1);
    }
}

Continue reading

Posted in 个人收藏 | Tagged | 2 Comments

mamp 2.0.5 安装 Zend Optimizer

MAMP2.0版本默认取消了对Zend Optimizer的支持。这也可以理解,这东西活到现在的确已经没啥意义了。

但是shopex这烂货,7年了,还TM加密,真是无语。我05年的用户,偶然登陆shopex居然因为系统升级把我所有的授权都弄没了。两天了还没搞定。再度BS一下。

言归正传,参考了一德国人的blog,是因为apache 32位和64位的问题。

首先肯定是下载Optimizer扩展,从这里下载for macos的就可以,然后把对应的php5.2.x版本的ZendOptimizer.so文件copy到

/Applications/MAMP/bin/php/php5.2.17/lib/php/extensions/no-debug-non-zts-20060613/

php.ini中设置为:

[Zend]
zend_extension="/Applications/MAMP/bin/php/php5.2.17/lib/php/extensions/no-debug-non-zts-20060613/ZendOptimizer.so"
zend_optimizer.enable_loader = 1
zend_optimizer.optimization_level=15

然后执行:

mv /Applications/MAMP/Library/bin/httpd /Applications/MAMP/Library/bin/httpd.64
lipo -thin i386 /Applications/MAMP/Library/bin/httpd.64 -output /Applications/MAMP/Library/bin/httpd.32
ln -s /Applications/MAMP/Library/bin/httpd.32 /Applications/MAMP/Library/bin/httpd

然后重启即可。查看phpinfo看看有没有“with Zend Optimizer v3.3.9”,有则成功。

Posted in PHP & MYSQL | Tagged , , | Leave a comment

nginx access_log 设置

最近在配置本地nginx开发环境时,发现一个问题,当server段不指定access_log时,并且http段中也未指定任何access_log参数时,它会默认写到logs/access.log这个文件,也就是access_log默认值就是”logs/access.log”,而且是所有server的访问日志。但nginx网站上我并未找到此配置的默认值。

如果我们不需要,在http段中加一行access_log off;然后在特定的server中配置自己想写入的日志。开发环境我默认不写日志,即不配置任何access_log,需要时才打开。
nginx的http段中,设置access log:

log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

log_format  gzip  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $bytes_sent "$http_referer" '
                      '"$http_user_agent" "$gzip_ratio"';

log_format download  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $bytes_sent "$http_referer" "$http_user_agent" '
                      '"$http_range" "$sent_http_content_range"';

#access_log  logs/access.log  main;
access_log off;
Posted in Uncategorized | Tagged , | 3 Comments

php的error_log设置

php的error_log可以设置输出到一个文件或输出到系统日志。

备忘一下输出文件,必须使用绝对地址。并且该目录php有写入权限。

Posted in PHP & MYSQL | Leave a comment

Mac OS X 安装mysql过程

从mysql官网http://mysql.com/downloads/mysql/下载dmg格式的安装文件。推荐使用64位(x86, 64-bit)。

打开安装包,第一个扩展名为pkg的文件即是安装文件。mysql不必编译安装,直接运行pkg安装即可。MySQL的Mac OS X PKG安装到/usr/local/mysql-VERSION,并且还会生成一个符号连接,/usr/local/mysql,指向新的位置。如果有/usr/local/mysql目录,首先将它改名为/usr/local/mysql.bak。安装完后,安装器会自动执行mysql_install_db在MySQL数据库中创建授权表。

安装完成后,双击MySQL.prefPane文件,即可给系统编好设置添加一个mysql的管理面板,可以在系统偏好设置中开启和关闭mysql。

如果安装了MySQL.prefPane这个偏好设置项,打开系统偏好设置会看到新增一项“MySQL”项。打开后可以启动和停止mysql服务。同时可以看到下方有个单选框“Automatically Start MySQL Server on Startup”,就是是否随系统开机启动Mysql服务,选中它的话,下面这项MySQLStartupItem.pkg就不必安装了。

MySQLStartupItem.pkg这个文件是干吗的呢?它提供了mysql随mac系统开机启动的功能。如何取消随系统启动呢?前面刚刚说完,不选中随机启动就行了。

仔细阅读readme.txt文件会发现,你可以为mysql和mysqladmin做两个alias。这样就不必每次输入完整路径来执行mysql和mysqladmin了。

Continue reading

Posted in PHP & MYSQL | Tagged , | Leave a comment

git删除本地和远程tags

又用到了删除git仓库的tags,

删除本地tag:

git tag -d v0.1

只删除本地的没有用,下次fetch的时候还会拉下来,再删除远程仓库中的tag,跟删除远程分支的语法类似

git push origin :refs/tags/v0.1
Posted in git | Leave a comment

老司机21条警告

1:堵车或等灯的时候别跟的太近,除非有人想加塞,至少要留出可以一把掰出去的距离,以防前车故障,自己也被加在中间。这是一个老司机告诉我的,当年他在3环就这样陪着前车呆了半个小时。

2:排队时,为了防止别人加塞,在加塞来车一侧,多留半个车身。比如你在左转道排队,经常有人从直行道过来加塞,你尽量用右轮压着左转道的右边线开,给自己向左迂回留出余地,再跟紧前车,加塞的很难得逞。

3:正常行驶时,前车突然并线给你让路,绝对没好事,咱们现在的司机还没这个觉悟,千万别给油超车,最好马上松油预备刹车,同时迅速观察两侧后视镜,判断出如果要并线往哪边并,八成前面有情况。 Continue reading

Posted in Uncategorized | Leave a comment