无聊的长城

我TM一个技术博客你没事儿老封我干吗啊。防民之口到这个地步。。。
如果你是一个东德边防士兵,发现有人逃往西德,你可能因职责必须要开枪,但如果你有良心,那就将枪口抬高一寸。

Posted in 互联网络 | 4 Comments

python学习笔记之字符串

字符串格式化:
format = “hello %s, %s enough for ya?”
values = (‘world’,’hot’)
print format % values
结果:hello world, hot enough for ya?
注:如果不是在命令行执行,把print后面的用括号括起来

与php类似但函数或方法名不一样的地方:
php explode=> python split
php trim => python strip
php implode => python join

Posted in python | 1 Comment

python学习笔记之字典

字典是最与php的数组相似的序列结构。python的列表只能是以索引数字开头并且顺序递增的序列。字典则可以是以字母为key的序列。

元组一般用圆括号来表示,如(1,2,3)
列表一般用方括号来表示,如[1,2,3]
而字典(dict)则用大括号来表示,如{‘a’:1,’b’:2,’c’:3}
与php不同,php的key,value是用key=>value来表示,python而是用冒号“:”来分隔。

字典可以使用大括号书写键和值或使用dict函数来创建。
dict函数可以指定两个元组或列表来对应创建字典。如:
items = [('name','gumby'),('age','42')]
d = dict(items)
与列表的区别:
k in d(d为字典),查找的是键,而非value,表达式 v in l(l为列表)则用来查找值,而不是索引。

一些字典方法:

clear 清除字典。“原地操作”,不会返回值,类似于列表的sort方法
copy方法返回一个相同键值对儿的新字典。浅复制。因为值本身就是相同的,而不是副本。
在副本中替换值的时候,原始字典不受影响。但是如果修改了某个值,原始字典也会改变。避免这个问题的一种方法就是使用深度复制(deep copy)。
from copy import deepcopy
deepcopy(d)

d.fromkes方法使用给定的值创建新字典。每个键默认对应的是None
get方法获取一个不存在的键时,不会报错,会返回None
has_key方法相法于表达式k in d
items方法将所有的字母项以列表的方式返回。这些列表中的每一项都来自于(键,值)。但是项在返回时没有特殊的顺序。
iteritmes的方法大致相同,但是会返回一个迭代器对象而不是列表。在很多情况下iteritems效率更高。迭代器,相当于decode json之后的对象,而非数组、
keys方法将字典中的键以列表的形式返回。而iterkeys则返回针对键的迭代器。
pop弹出给定键的值。popitem会弹出最后一个元素(实际上是随机项),但如果想一个接一个地移除并处理字典,popitem效率就会高很多,因为不必先获取字典的键值列表。

values和itervalues方法以列表或迭代器的形式返回字典中的值,返回值的列表可以包含重复项。

Posted in python | Leave a comment

python学习笔记之列表和元组

列表和元组的主要区别在于,列表可以修改,而元组不可以修改。也就是说,如果要根据要求来添加元素,那么列表可能会更好用。序列不能修改的时候,使用元组更合适。

序列

索引:索引就是php数组的键值。从0开始。
分片:php的slice,如果number[3:9] 注意,截取的值是从第4个索引开始。
步长:分片的每次操作的步进长度。不可以是0,要以是负数,即从后往前数。

序列相加:使用+号进行序列的连接操作
两种相同类型的序列才能相加。
用一个数字x乘以一个序列会生成一个新的序列,原来的序列会被重复x次。

None是一个python的内建值,它的确切含义是“什么也没有”,有的语言用null。
成员资格:使用in可以检查一个字符串是否存在一个列表或字符串中。
len可以检查列表或字符串的长度。php使用str_len和count来检查。

list函数,根据字符串来创建列表。如list(‘hello’)
注意:不能为列表一个位置不存在的元素进行赋值

append方法用于在列表末尾追加新的对象。
count方法统计某个元素在列表中出现的次数,如x.count(1)
extend方法可以在列表的末尾追加另一个序列中的多个值。
index方法从列表中找出某个值第一个匹配项的索引位置。
insert方法用于将对象插入到列表中。
pop方法从列表中移除数据,默认是最后一个。
remove方法用于移除列表中某个值的第一个匹配项。pop是操作key,remove是操作value
reverse将列表中的元素反向存放。
sort方法排序列表中的元素。
sort方法排序后并不会返回列表。所以要得到一个排序的列表要先将x赋值给y,再对y排序。
sort高级排序提供两个参数,第一个参数是必须指定一个函数在排序过程中使用,第二个是正序倒序的bool值

元组

元组与列表一样,也是一种序列。唯一不同的是元组不能修改。
元组大部分时候是通过圆括号括起来的。如(1,2,3),序列则是通过方括号括起来的。
如果要实现只包括一个值的元组,也必须加一个逗号,如(23,)
tuple函数:以一个序列做为参数并把它转换为元组。
元组的分片还是元组。就像列表的分片还是列表一样。

Posted in python | Leave a comment

Php Aes加密类

今天写了一个php的AES加密类。适用于Yii的扩展。

如果不用在Yii框架中,把代码中Yii::app()->params['encryptKey'] 换成你对应的默认key就可以了。

代码见github:

https://github.com/wkii/utils/blob/master/Yii/extensions/PhpAes.php

 

Posted in PHP & MYSQL | Tagged | Leave a comment

php生成excel列名,超过26列大于Z的方法

这是phpExcel类中的方法。今天查到了,记录一下备忘。

public static function stringFromColumnIndex($pColumnIndex = 0)
	{
		//	Using a lookup cache adds a slight memory overhead, but boosts speed
		//	caching using a static within the method is faster than a class static,
		//		though it's additional memory overhead
		static $_indexCache = array();

		if (!isset($_indexCache[$pColumnIndex])) {
			// Determine column string
			if ($pColumnIndex < 26) {
				$_indexCache[$pColumnIndex] = chr(65 + $pColumnIndex);
			} elseif ($pColumnIndex < 702) {
				$_indexCache[$pColumnIndex] = chr(64 + ($pColumnIndex / 26)) .
											  chr(65 + $pColumnIndex % 26);
			} else {
				$_indexCache[$pColumnIndex] = chr(64 + (($pColumnIndex - 26) / 676)) .
											  chr(65 + ((($pColumnIndex - 26) % 676) / 26)) .
											  chr(65 + $pColumnIndex % 26);
			}
		}
		return $_indexCache[$pColumnIndex];
	}

将列的数字序号转成字母使用:

PHPExcel_Cell::stringFromColumnIndex($i); // 从o开始

将列的字母转成数字序号使用:

PHPExcel_Cell::columnIndexFromString(‘AA’);

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

Yii deleteByAttributs 用法,慎用Dao的delete

Yii框架一定要慎用Dao的delete,一不小心它生不成条件的话,就变成了整表删除。

可以用ActiveRecord的deleteByAttributes或deleteAll方法相对不容易写错。

deleteByAttributes用法如下:

MyClass::model()->deleteAllByAttributes(array(
    'phone_number'=>$phoneNumber,
));

或者第一个参数为空,使用第二个条件参数

MyClass::model()->deleteAllByAttributes(array(),'`phone_number` = :phone_number',array(
    ':phone_number'=>$phoneNumber,
));

或者使用deleteAll():

MyClass::model()->deleteAll('`phone_number` = :phone_number',array(
    ':phone_number'=>$phoneNumber,
));

再来一个带in条件的

$condition = new CDbCriteria();
$condition->addCondition('status=:status');
$condition->params = array(':status'=>1);
$condition->addInCondition('user_id',array(100111,100221,100221));
User::model()->deleteAll($condition);

Dao带in条件的示例


Yii::app()->db->createCommand()
->delete('mw_user', array('and', 'user_id=:user_id', array('in', 'position_id', array(1,2,3))),array(':user_id'=>121111));

但是请慎用DAO的delete,当你的条件写错一点,它将无法生成where条件,同时sql语句中也没有了where,但还不一定报错,结果就成了没有where的delete,结果会是整表被删除了。

Posted in PHP & MYSQL | Tagged | Leave a comment

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

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

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

  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