易栈网-膘叔

浏览模式: 标准 | 列表 | 图文
杂烩,附招聘信息

杂烩,附招聘信息

项目中用到了memcached,类文件是不知道谁找来的MemcacheWrapper,其中有一个方法是namespace(),在正式机上跑的没问题,但是测试机上却老是显示语法有误,说是T_STRING没有正确结尾。开始的时候以为是文件编码导致,但仔细一看,原来是这个namespace名称,但为什么正式机上没问题呢?翻开手册才知道,这个名词是从5.3才开始变成关键字的。这让我想起了一些其他的名称,比如use,goto,import等 。自从命名空间开始后,很多人都认为import会变成关键字,但结果还是采用了use作为关键字。

因此,在写代码的时候,可以看一下PHP附录的保留关键字等。

-------------------------------

一号店,是11在群里说的,说是这个网店吸引了风投,但我看了看,没有什么特别的地方,连京东都可以卖非电器类产品了,这类网站那怎么赢利呢?事实上华联等都有网站,而且送货费也不贵,所以,随便看看喽。。观望一下

-------------------------------

最后,给自己现在的单位进行一下招聘。

条件我也不多说了,总之是PHP方面的人才,一些附加条件我也就多说了,什么精通这个精通那个的。

只有几个条件:1年PHP开发经验的2名,2年+开发经验的2名。1年左右经验的,最基本的CRUD要会,顺便熟悉康盛的系统为佳。2年+的,需要有独立做项目的经验,能够根据需求独立完成项目,当然也不希望是算盘珠一样,一定要有自己的想法才行。

然后就是大家都要求的,性格开朗,有团队经验犹佳之类。那句能够承受加班压力的我就不写了,项目一般不会要求加班,只希望在工作时间把任务完成,这是最佳的。要加班的话,也就是上线前几天和上线后几天,可能会有加班情况出现,但这个,其实大家都懂的吧。

请身在上海,并有意愿从事PHP和已经从事PHP但想換換岗位的可以联系我。可以留言,也可以QQ我:19129540.

月光博客:用dropbox备份网站

DropBox最近又在准备折腾了,理由其实不算太充分,事实上,在资料方面,我一直是在用wizExplorer,但是对于文件等,除了QQ的存储,好象没有其他什么的了(当然金山的快盘也行,但不太敢用,因为,以前联想的lenovodata,突然间就成了收费盘,很郁闷的)

Dropbox我在之前也有介绍,也有使用,但就在申请API的第二天,我发现,dropbox再也打不开了,现在嘛,你懂的。。。

主要是我想同步一些目录,和文件,又不是特别大,但是数据比较多,如果用网上的SVN来进行同步,我想,意义也不是特别大。不过,我是有准备将我的服务器慢慢改成svn,因为,它不用备案。有域名就要备案,很繁琐啊。rsynx也可以,但是我需要互动,而不仅仅只是备份

上面是月光的博客:

  虽然目前从国内访问Dropbox有小小困难,但是从国外访问还是正常的,对于拥有国外Linux虚拟主机的用户,可能会遇到这样的需求,就是如何将国外虚拟主机上的网站备份到Dropbox上,下面我以Dreamhost为例介绍一下备份的方法。
你需要有一个国外的虚拟主机,虚拟主机需要有SSH权限,并能访问外网,符合这样条件的虚拟主机有一些,例如Dreamhost这类主机。
使用SSH帐号登录到你的主机地址,之后执行下面的命令:
wget -O dropbox.tar.gz http://www.dropbox.com/download/?plat=lnx.x86
下载完成文件后,接着,你可以执行下面的命令将其解压缩:
tar -zxof dropbox.tar.gz
接着执行下面的命令将Dropbox程序转移到~目录。
mv .dropbox-dist ~
现在,执行下面的程序即可后台运行Dropbox
~/.dropbox-dist/dropboxd &
第一次执行这个程序的时候,dropboxd会显示一串很长的URL地址,你需要手动在浏览器中执行这个地址,才能将虚拟主机服务器连接到 Dropbox,执行完后,Dropbox的Events中会显示“The computer xxx was linked to your account”,表明该服务器已经连接好。
这时候,你的根目录下会出现一个Dropbox目录,并会自动下载,你可以使用下面命令进入你的Dropbox目录
cd ~/Dropbox
接着,将你的网站目录通过cp -r命令复制到~/Dropbox目录下,就能实现网站的同步备份了。
如果你想停止运行Dropbox,可以通过下面的命令实现:
killall dropbox
对于Dreamhost用户来说,其实你一退出SSH,dropbox就会自动退出,你要想让dropbox一直运行,要购买价格更高的VPS,或者使用screen命令自动挂着SSH也行。
最后赞一下Dropbox的速度,在国外的主机上执行Dropbox真快的吓人,几个G的文件,不到半个小时就全部下载更新完毕,这和国内完全不是一个速度啊,我昨天在国内同步几个G的文件,至少要花整整两天的时间。
参考文章:How To Install Dropbox In An Entirely Text Based Linux Environment

原文来自:http://www.williamlong.info/archives/2222.html

杂记:flashchart,ejs,sprintf

杂记:flashchart,ejs,sprintf

在看cnblog的时候,看到一些文章,确实可以记录。再加上工作中也会遇到问题,因此总会选择性的记录。。

1、flash chart

现在画图的工具越来越多,不再象以前那样用jpgraph了。毕竟没有flash来的方便,而且还能够变化,动态的东西总是让人感觉不错。其实chart这东西,有很多,比如google chart之类的。但flash chart的话,常用的也就那么几个:open flash chart,fushion chart,还有一个Aw chart( 这个名字记不清了,只知道fund123.com【多来米】就是用的这个)。open呢。。很多人用,但模版一般般,不细细研究的话,做出来的Flash总感觉不好看。其他的两个挺不错,功能更加强大,不过好象都是免费版会有LOGO浮在上面(以前我就解决过这个问题,请看:如何用DIV挡住SWF?)

博客园的文章是把open和fusion的一些参数进行了分析,可以看:open-flash-chart 和 FusionCharts Free 探究【好象博客园今天坏了?】,整理了一些Fusion的参数:网上整理了一些FCF的常用属性:
功能特性
animation 是否动画显示数据,默认为1(True)
showNames 是否显示横向坐标轴(x轴)标签名称
rotateNames 是否旋转显示标签,默认为0(False):横向显示
showValues 是否在图表显示对应的数据值,默认为1(True)
yAxisMinValue 指定纵轴(y轴)最小值,数字
yAxisMaxValue 指定纵轴(y轴)最小值,数字
showLimits 是否显示图表限值(y轴最大、最小值),默认为1(True)
图表标题和轴名称
caption 图表主标题
subCaption 图表副标题
xAxisName 横向坐标轴(x轴)名称
yAxisName 纵向坐标轴(y轴)名称
图表和画布的样式
bgColor 图表背景色,6位16进制颜色值
canvasBgColor 画布背景色,6位16进制颜色值
canvasBgAlpha 画布透明度,[0-100]
canvasBorderColor 画布边框颜色,6位16进制颜色值
canvasBorderThickness 画布边框厚度,[0-100]
shadowAlpha 投影透明度,[0-100]
showLegend 是否显示系列名,默认为1(True)
字体属性
baseFont 图表字体样式
baseFontSize 图表字体大小
baseFontColor 图表字体颜色,6位16进制颜色值
outCnvBaseFont 图表画布以外的字体样式
outCnvBaseFontSize 图表画布以外的字体大小
outCnvBaseFontColor 图表画布以外的字体颜色,6位16进制颜色值
分区线和网格
numDivLines 画布内部水平分区线条数,数字
divLineColor 水平分区线颜色,6位16进制颜色值
divLineThickness 水平分区线厚度,[1-5]
divLineAlpha 水平分区线透明度,[0-100]
showAlternateHGridColor 是否在横向网格带交替的颜色,默认为0(False)
alternateHGridColor 横向网格带交替的颜色,6位16进制颜色值
alternateHGridAlpha 横向网格带的透明度,[0-100]
showDivLineValues 是否显示Div行的值,默认??
numVDivLines 画布内部垂直分区线条数,数字
vDivLineColor 垂直分区线颜色,6位16进制颜色值
vDivLineThickness 垂直分区线厚度,[1-5]
vDivLineAlpha 垂直分区线透明度,[0-100]
showAlternateVGridColor 是否在纵向网格带交替的颜色,默认为0(False)
alternateVGridColor 纵向网格带交替的颜色,6位16进制颜色值
alternateVGridAlpha 纵向网格带的透明度,[0-100]
数字格式
numberPrefix 增加数字前缀
numberSuffix 增加数字后缀 % 为 '%25'
formatNumberScale 是否格式化数字,默认为1(True),自动的给你的数字加上K(千)或M(百万);若取0,则不加K或M
decimalPrecision 指定小数位的位数,[0-10] 例如:='0' 取整
divLineDecimalPrecision 指定水平分区线的值小数位的位数,[0-10]
limitsDecimalPrecision 指定y轴最大、最小值的小数位的位数,[0-10]
formatNumber 逗号来分隔数字(千位,百万位),默认为1(True);若取0,则不加分隔符
decimalSeparator 指定小数分隔符,默认为'.'
thousandSeparator 指定千分位分隔符,默认为','
Tool-tip/Hover标题
showhovercap 是否显示悬停说明框,默认为1(True)
hoverCapBgColor 悬停说明框背景色,6位16进制颜色值
hoverCapBorderColor 悬停说明框边框颜色,6位16进制颜色值
hoverCapSepChar 指定悬停说明框内值与值之间分隔符,默认为','
折线图的参数
lineThickness 折线的厚度
anchorRadius 折线节点半径,数字
anchorBgAlpha 折线节点透明度,[0-100]
anchorBgColor 折线节点填充颜色,6位16进制颜色值
anchorBorderColor 折线节点边框颜色,6位16进制颜色值
Set标签使用的参数
value 数据值
color 颜色
link 链接(本窗口打开[Url],新窗口打开[n-Url],调用JS函数[JavaScript:函数])
name 横向坐标轴标签名称

事实上,官方例子的xml里面都有注释,只是是英文版而已

2、ejs,也就是上次说的司徒正美的javascript模版引擎,一下出0.3版了,javascript模板系统 ejs v3,由于已经介绍过,不再介绍。

3、javascript的参数是可变的,因此也可以利用这个功能来写一些类似于重构的代码,但这里的例子是类似于PHP的sprintf,可以参考一下:javascript通过arguments实现string.format函数,PHP还有一个vsprintf,如果看好了这篇,事实上,你也可以尝试模似vsprintf了。

4、最后,来一段这个分享一封拒绝老板下班时间安排工作的邮件,毕竟现在这个年头加班已经成了家长便饭了吧?是主动提出还是被动加班?这封邮件不错,但很可能只适合国外。国内?不加班,你走人好了。。

意外:Editplus可以查看16进制了?

众所周知,Editplus是不支持查看16进制的文件的,那可是ultraEdit的特长。

因此,上午有人在QQ群里问Editplus是否支持16进制查看的时候,我毫不犹豫的说不支持,但下午,我在使用Editplus的时候,突然发现了工具栏上有个图标:

bdcec3ff88997826a5015028c100a710

Hx?16进制?于是乎随便打开一个文件,并点击一下。。结果真的出来了

文件内容如下:

639d187abf8e3593f83220bf7e112bda

点击Hx图标,显示:

c7b4d5bbb79b3040393cc7c1227352f5

看来,我真的落伍了。。打开官网看了一下changelog,果然,就在第一条:

89e202bb2a3a20e9f09a3742c15dcd63

js模拟php:print_r

js模拟php:print_r

在PHP中,我们打印一个数组或者对象的时候,都是用print_r,相对比较直观,可是javascript就不行。翻了翻资料,也看到一些代码的写法。这里是一个简单的处理(不能打印window,document等对象):

function print_r( $value ){
if($value.constructor == Array || $value.constructor == Object ){
document.write("<ul>");
for (var $i in $value){
if($value[$i].constructor == Array || $value[$i].constructor == Object ){
document.write("<li>["+$i+"] => " + typeof( $value ) + " </li><ul>");
print_r($value[$i]);
document.write("</ul>");
}else{
document.write("<li>["+$i+"] => " + $value[$i] + "</li>");
}
}
document.write("</ul>");
}
}
var s = {};
s.i = '123';
s.o = {};
s.o.test = 'tt';
print_r(s);

然后看了一下phpjs.org,它上面的print_r就比较复杂了。。。

function print_r (array, return_val) {
// Prints out or returns information about the specified variable
//
// version: 1008.1718
// discuss at: http://phpjs.org/functions/print_r // + original by: Michael White (http://getsprink.com)
// + improved by: Ben Bryan
// + input by: Brett Zamir (http://brett-zamir.me)
// + improved by: Brett Zamir (http://brett-zamir.me)
// + improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net) // - depends on: echo
// * example 1: print_r(1, true);
// * returns 1: 1

var output = "", pad_char = " ", pad_val = 4, d = this.window.document; var getFuncName = function (fn) {
var name = (/\W*function\s+([\w\$]+)\s*\(/).exec(fn);
if (!name) {
return '(Anonymous)';
} return name[1];
};

var repeat_char = function (len, pad_char) {
var str = ""; for (var i=0; i < len; i++) {
str += pad_char;
}
return str;
};
var formatArray = function (obj, cur_depth, pad_val, pad_char) {
if (cur_depth > 0) {
cur_depth++;
}
var base_pad = repeat_char(pad_val*cur_depth, pad_char);
var thick_pad = repeat_char(pad_val*(cur_depth+1), pad_char);
var str = "";
if (typeof obj === 'object' && obj !== null && obj.constructor && getFuncName(obj.constructor) !== 'PHPJS_Resource') {
str += "Array\n" + base_pad + "(\n";
for (var key in obj) {
if (obj[key] instanceof Array) {
str += thick_pad + "["+key+"] => "+formatArray(obj[key], cur_depth+1, pad_val, pad_char); } else {
str += thick_pad + "["+key+"] => " + obj[key] + "\n";
}
}
str += base_pad + ")\n"; } else if (obj === null || obj === undefined) {
str = '';
} else { // for our "resource" class
str = obj.toString();
}
return str;
};

output = formatArray(array, 0, pad_val, pad_char);
if (return_val !== true) {
if (d.body) {
this.echo(output);
} else {
try {
d = XULDocument; // We're in XUL, so appending as plain text won't work; trigger an error out of XUL
this.echo('<pre xmlns="http://www.w3.org/1999/xhtml" style="white-space:pre;">'+output+'</pre>');
} catch (e) {
this.echo(output); // Outputting as plain text may work in some plain XML
}
}
return true; } else {
return output;
}
}

果然是没有做不到的事,只有想不到的事呀。。。(上面的phpjs.org的print_r需要echo方法,请到phpjs.org下载)

娱乐:盛大锦书只要999元?

娱乐:盛大锦书只要999元?

终于,盛大今天放出了锦书的价格,多少钱呢?请看图:
58d7d5e0098d6b8020caae3d06232284
如此说来,那些抢先锦书的朋友就真的是欲哭无泪了。首先花了998,其次,还往帐户里充值50元。算下来比正式版还贵啊。

事实上,我本来是准备买的,但由于群友的实际案例,我放弃了。锦书我想着,使用android系统,对于一些PDF之类的,应该支持也是不错的呀。但事实上锦书却是只支持自己的格式,其他所谓的支持是用软件把它们转换成盛大的格式(转换速度慢,兼容性差,遇到有图片的PDF等还不支持)

一下子,心就哇凉哇凉的。幸好,我没有买,否则看到这个价格,我的心更加凉了。

javascript模版系统

javascript模版系统

用javascript做模版的话,说来也算是比较方便的,特别是对于PHP开发来说,只要扔一个json数组过来。然后剩下的就可以让javascript来完成了。
搜索一下jQuery的plugin,可以找到大约5~6个模版程序。好象用的比较多的还是jTemplate,上一次司徒正美用javascript写了一个简单的例子,这次又写了一个比较详细的,说是v2,有兴趣的朋友可以尝试一下。。
--start--司徒正美认为模版要处理复杂的玩意,所以写的功能就强大了。
本版本主要是对原模板系统进行提速,去掉消耗巨大的辅助函数。本来想用它与John Resig的 Micro-Templating比较一下速度,发现对方无法处理复杂的模板,残念。

//司徒正美 javascript template - http://www.cnblogs.com/rubylouvre/ - MIT Licensed
(function () {
if(!String.prototype.trim){
String.prototype.trim = function(str) {
return this.replace(/^[\s\xa0]+|[\s\xa0]+$/g, '');
}
}
var dom = {
quote: function (str) {
str = str.replace(/[\x00-\x1f\\]/g, function (chr) {
var special = metaObject[chr];
return special ? special : '\\u' + ('0000' + chr.charCodeAt(0).toString(16)).slice(-4)
});
return '"' + str.replace(/"/g, '\\"') + '"';
}
},
metaObject = {
'\b': '\\b',
'\t': '\\t',
'\n': '\\n',
'\f': '\\f',
'\r': '\\r',
'\\': '\\\\'
},
parser = document.createElement("div"),
startOfHTML = "\t__views.push(",
endOfHTML = ");\n";

//onsite,可选,Boolean,是否就地替换掉模板容器,默认true,如果为false,则返回一个文档碎片,交由用户自己插入到需要的地方
dom.ejs = function (obj) {
var onsite = obj.onsite === void 0 ,
left = obj.left || "<%",
right =obj.right || "%>",
selector = obj.selector,
isLeft = true,
buff = ["var __views = [];\n"],
fragment = document.createDocumentFragment(),
el = document.getElementById(selector),
ejs = dom.ejs;
if (!el) throw "找不到目标元素";
var str = el.text.trim();
if(!ejs[selector]){
while(str.length){
var condition = isLeft ? left :right;
var index = str.indexOf(condition);
if(index !== -1){//取左边
var text = str.slice(0,index);
if(isLeft){
buff.push(startOfHTML, dom.quote(text.trim()), endOfHTML);
}else{
switch (text.charAt(0)) {
case "#"://处理注释
break;
case "="://处理后台返回的变量(输出到页面的);
buff.push(startOfHTML, text.slice(1), endOfHTML)
break;
default:
buff.push(text, "\n")
};
}
}else{
if(isLeft){
buff.push(startOfHTML, dom.quote(str), endOfHTML);
break;
}else{
throw "在字符串{{ "+dom.quote(str)+" }}中找不到右界定符"+right
}
}
str = str.slice(index+2).trim();
isLeft = !isLeft;
}
ejs[selector] = new Function("json", "with(json){"+buff.join("") + '};return __views.join("");')
}
parser.innerHTML = ejs[selector](obj.json || {});
while (parser.firstChild) {
fragment.appendChild(parser.firstChild)
}
return onsite ? el.parentNode.replaceChild(fragment, el) : fragment;
};
window.dom = dom;

})();

这种使用原生代码写的例子,可以被任何代码所使用,如果你有兴趣也可以看看司徒正美的例子的。原文网址在javascript 模板系统 ejs v2,可以移步一观。

了解自己的短板

了解自己的短板

本文写的很乱,已经是想到什么写什么了。所以无可读性,纯属自己的记录和想法

不管是在生活中也好,工作中也好,其实都会有自己的短板,只有了解自己的短板才能扬长避短,以便更好发挥自己的特长 。如果尽让别人注意你的短板,而一直忽略了你的长板,那你在工作中也就会处处受阻无法正常发挥自己的能力。

什么是你的短板?交流?心态?算法?数据结构?数据库?又或者是其他?好好的了解,对自己的职业生涯也有好处。抛开技术因素,可能更多的就是心理因素了。

得明白自己想要的东西,才能真正获得自己想要的东西。看了一下Fenng写的去大公司还是去小公司工作?,就是说了那种迷惘的心态。

去大公司还是去小公司,自己究竟是想干什么 ,为了钱,还是为了技术?

所以我现在明白了自己想要做什么 ,才会想到写这个博客。算是做一个纪录罢

Discuz Uchome 小技巧

Discuz Uchome 小技巧

discuz的ajaxpost功能有点强大,但缺点也很明显,如果ajaxpost提交一个FORM,那么返回的时候只能显示showmessage的内容,而不会主动跳转,因此这里就有一个小技巧 了。。

比如默认submit按钮这样操作:onclick="ajaxpost('formid')";之类的,我们可以先这样。。
onclick="$('__formid').innerText='';ajaxpost('formid');checkPostResult();";
含义其实很简单,先把ajaxpost提示信息所在的div内容清空。然后提交。最后,根据返回值来判断。。

function checkPostResult(){
var cid = setInterval(function(){
if( $('__formid').innerText == 'success'){
alert('提交成功');
location.href='xxxxx.php';
clearInterval(cid);
}
},1000);
}

这个处理也很简单,为什么是用setInterval和clearInterval,主要是由于ajax是异步操作,如果不用setInterval方法 ,那么在ajaxpost结束的时候,其实提示信息还没有append到提示信息所在的ID里,所以用setInterval方法先延迟然后循环处理最后再结束提示。。。

clearInterval用的不太对,但短时间内想不到更好的。先这样临时解决喽。

常用函数:copyToClipboard

常用函数:copyToClipboard

COPY文字到剪贴板很方便,我是指在IE下面,而其他的就有点复杂了。firefox下面有安全选项的。所以很多人都采用了flash来实现。如果不计flash,那么下面这个函数就十分有用了,可能是转的过多了,也不记得来源是哪里了。如果是原作者看到,请提示一下,一定加上您的链接。

function copyToClipboard(txt) {
if(window.clipboardData) {
window.clipboardData.clearData();
window.clipboardData.setData("Text", txt);
} else if(navigator.userAgent.indexOf("Opera") != -1) {
window.location = txt;
} else if (window.netscape) {
try {
netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
} catch (e) {
alert("被浏览器拒绝!\n请在浏览器地址栏输入'about:config'并回车\n然后将'signed.applets.codebase_principal_support'设置为'true'");
}
var clip = Components.classes['@mozilla.org/widget/clipboard;1'].createInstance(Components.interfaces.nsIClipboard);
if (!clip)
return;
var trans = Components.classes['@mozilla.org/widget/transferable;1'].createInstance(Components.interfaces.nsITransferable);
if (!trans)
return;
trans.addDataFlavor('text/unicode');
var str = new Object();
var len = new Object();
var str = Components.classes["@mozilla.org/supports-string;1"].createInstance(Components.interfaces.nsISupportsString);
var copytext = txt;
str.data = copytext;
trans.setTransferData("text/unicode",str,copytext.length*2);
var clipid = Components.interfaces.nsIClipboard;
if (!clip)
return false;
clip.setData(trans,null,clipid.kGlobalClipboard);
alert("复制成功!")
}