Joel on software
几篇很不错的文章 1 易用的界面,简单的一步 2 主次分明 3 每日构建(daily build)是你的朋友 4 第四战略篇:膨胀软件与80/20的谣传 5 行进中开火 6 看起来简单, 实际上复杂 7 给计算机系学生的建议 8 轻松面试找到理想员工-非官方的面试技术指南 9 The Joel Test: 软件开发成功 12 法则 10 《微独立软件供应商:从理想到现实》序 11 抽象渗漏法则 原文:Joel on software ...
几篇很不错的文章 1 易用的界面,简单的一步 2 主次分明 3 每日构建(daily build)是你的朋友 4 第四战略篇:膨胀软件与80/20的谣传 5 行进中开火 6 看起来简单, 实际上复杂 7 给计算机系学生的建议 8 轻松面试找到理想员工-非官方的面试技术指南 9 The Joel Test: 软件开发成功 12 法则 10 《微独立软件供应商:从理想到现实》序 11 抽象渗漏法则 原文:Joel on software ...
gentoo还真是费电啊,:-) 转自水木 发信人: arsenal (为人民服务), 信区: MilitaryJoke 标 题: Re: 当大国是要负责任的 发信站: 水木社区 (Thu Dec 3 23:56:09 2009), 站内 那帮无耻之徒洗衣服还用热水,干衣服还用烘干机,装系统用gentoo,下了班还不关灯,纯 浪费 【 在 lin (没有) 的大作中提到: 】 : 标 题: Re: 当大国是要负责任的 : 发信站: 水木社区 (Thu Dec 3 23:54:25 2009), 站内 : : 坏什么呀,你看那些发达国家都那么高的排放量,富人烧上炕了, : 咱穷人就只能硬挺着啊? : : 【 在 amdopteron (皓龙) 的大作中提到: 】 : : TG太坏了…… : : : -- : : ※ 来源:·水木社区 newsmth.net·[FROM: 114.245.140.*] -- ※ 来源:·水木社区 newsmth.net·[FROM: 221.217.204.*]
从这里看到了一个slide,[ Scalable JavaScript Application Architecture](http://www.slideshare.net/nzakas/scalable-javascript- application-architecture) 觉得很不错,分享一下,国外技术人员做的slide确实很cool [Scalable JavaScript Application Architecture](http://www.slideshare.net/nzakas/scalable-javascript- application-architecture “Scalable JavaScript Application Architecture”) View more documents from Nicholas Zakas.
此脚本已过时,请访问这个替代 From: notsobad 最近在追着就看豆瓣的那些直播贴,很无聊。。。。 写了个greasemokey脚本,添加了个只看楼主功能。 代码在这里 /********************************************************* 用于douban小组中的"只看搂主",会把楼主的帖子加边框,同时,添加快捷键n,p “n”: 跳转到楼主下一个帖子,如果到了本页结尾,则跳回第一条 "p": 跳转到楼主下一个帖子,如果到了本页结尾,则跳回下一页 *********************************************************/ // ==UserScript== // @name douban // @namespace douban // @description test // @include *.douban.com/* // ==/UserScript== var log = (unsafeWindow.console && console.log) || GM_log; var $ = unsafeWindow.jQuery || function(){}; log("now url: " + location.href); function xPath(aNode, aExpr) { var xpe = new XPathEvaluator(); var nsResolver = xpe.createNSResolver(aNode.ownerDocument == null ? aNode.documentElement : aNode.ownerDocument.documentElement); var result = xpe.evaluate(aExpr, aNode, nsResolver, 0, null); var found = []; var res; while (res = result.iterateNext()) found.push(res); return found; } (function(){ /********************************************************** 用于douban小组中的"只看搂主",会把楼主的帖子加边框,同时,添加快捷键n,p “n”: 跳转到楼主下一个帖子,如果到了本页结尾,则跳回第一条 "p": 跳转到楼主下一个帖子,如果到了本页结尾,则跳回下一页 **********************************************************/ if(location.href.indexOf("http://www.douban.com/group/topic") != 0) return; var temp = /&_lz_id=([^&\/\#]+)/.exec(location.href); if(temp){ var lz_id = temp[1]; var lz_url = "http://www.douban.com/people/"+ lz_id + "/"; }else{ // First page var lz = xPath(document , '//div[@id="in_tablem"]//td[@class="wrtd"][1]/a')[0]; var lz_id = lz.href.split('/people/')[1].replace('/',''); var lz_url = lz.href; } log("lz is: " + lz_url); var all = xPath(document , '//div[@id="in_tablem"]/table[@class="wr"]//table[@class="wr"]'); var pages = xPath(document , '//div[@id="in_tablem"]/div[@class="paginator"]//a'); //为分页链接附加参数,_lz_id Array.forEach(pages, function(p){ var sep = p.href.indexOf('?') != -1 ? '&' : '?'; p.href += sep + '_lz_id=' + lz_id; }); //高亮楼主, 添加锚点 var lz_list = []; Array.forEach(all, function(table, index){ user = table.getElementsByTagName('a')[0]; //log("now user: " + user.href); if(user.href == lz_url){ table.style.border="5px solid black"; table.style.overflow = "scroll"; lz_list.push(index); var a = document.createElement('a'); a.name = index; table.parentNode.insertBefore(a, table); } }); //快捷键 var i = 0; document.addEventListener('keydown', function(e){ if(e.target.tagName == 'INPUT' || e.target.tagName == 'TEXTAREA') return; var has_more = !!lz_list && i < lz_list.length && true; // 'n'=>78, 'p'=>80, 'j'=>74 if(!has_more){ if(e.keyCode == 80) location.href = pages[pages.length-1].href; else if(e.keyCode == 78) i=0; return; } if(e.keyCode == 78 || e.keyCode == 80){ //log('Moving next....'); location.href = '#' + lz_list[i]; i++; } },false); })();
我需要做一个页面保存的功能, 在服务端把页面整个wget保存下来。 由于服务端是有会话的,所以需要对本机的请求给自动通过,以前一直是用验证HTTP_HOST 是否为 localhost,这个方法有局限,今天想到可以这样 if($_SERVER['SERVER_ADDR'] == $_SERVER['REMOTE_ADDR']){ //。。。。。。。 } 由于有些内容离线看是没有意义的,所以决定添加一些标记来标识离线时要删掉的内容 如下: ...
让浏览器输出一个xml的下载, ie6下面问题真多 两个函数 function is_ie (){ //Not Internet Explorer return stristr($_SERVER['HTTP_USER_AGENT'], 'MSIE') !== FALSE; } function encode_filename($name){ return is_ie() ? urlencode($name) : $name; } 特定的header header('Content-Type: application/xml'); header("Content-Disposition: attachment;filename=". encode_filename("测试-" . $t->name . ".xml")); header('Pragma: private'); header('Cache-control: private, must-revalidate'); echo $xw->outputMemory(); 参考这个: http://markmail.org/message/i4okzvwuxmeggrkp 这个: http://www.jtricks.com/bits/content_disposition.html The filename should be in US-ASCII charset. The filename should not have any directory path information specified. The filename should not be enclosed in double quotes even though most browsers will support it. Content-Type header should be before Content-Disposition. Content-Type header should refer to an unknown MIME type (at least until the older browsers go away).
taotao,也就是自己qq签名的api哎 参考这个 http://code.google.com/p/taotao/source/browse/trunk/TaotaoResponse.cs 还有这个 http://www.taotao.com/js/dkapi.js 可以得到地址为: <http://www.taotao.com/cgi- bin/msgj?qq=$>{qq}&num=${taotao_num}&t=${taotao_type} 如: [http://www.taotao.com/cgi- bin/msgj?qq=281116124&num=20&t=1](http://www.taotao.com/cgi- bin/msgj?qq=281116124&num=20&t=1) 貌似没什么限制,可以自己代码里用 附: 格式化后的dkapi.js 从这里可一看出返回参数的用途 var MAX_ITEMS=20,taotao_pane_id="id_apiPane",KEY_WORD_YJ="[假]"; var taotao_sr=new Array('网页','QQ机器人','QQ空间','QQ签名','短信','手机上网','MSN机器人','MSN签名','手机QQ','彩信','订阅',"",'QQ状态'); function LK(str) { return document.createElement(str); }function LL(str) { return document.getElementById(str); }function LG(str,target) { var re=new RegExp("http(s)?://([a-z0-9?.=%&-_;#\\/])+","ig"); if(target=='_blank') { str=str.replace(re,"<a target='_blank' href='$&'>$&</a>"); }else { str=str.replace(re,"<a href='$&'>$&</a>"); }return str; }function LH(str) { if(typeof(str)=="string") { str=str.replace(/[\r\n\t\0]/g,""); return str; } }function LE(str,target) { str=LH(str); var re=/(\[URL=(.[^\[]*)\])(.*?)(\[\/URL\])/ig; if(target=='_blank') { str=str.replace(re,"<A HREF=$2 TARGET=_blank>$3</A>"); }else { str=str.replace(re,"<A HREF=$2>$3</A>"); }return str; }function initApi() { if(typeoftaotao_qq=='undefined') { alert("we can not get qq num,show nothing...!"); return ; }if(typeoftaotao_num=='undefined'||taotao_num<=0||taotao_num>20) { taotao_num=20; }if(typeoftaotao_type=='undefined'||taotao_type<0||taotao_type>1) { taotao_type=0; } }function LI(url) { g_cximg=null; g_cximg=new Array(); var re=/\[IMG\](.+?)\[\/IMG\]/ig,tt=url.match(re); g_ubbcon=url.replace(re,''); for(var i=0;i<tt.length;++i) { g_cximg[g_cximg.length]=tt[i].replace(re,"$1"); } }function LF(str) { if(str.substr(0,3)==KEY_WORD_YJ) { str='<font style="color:red">'+KEY_WORD_YJ+'</font>'+str.substr(3,str.length-3); }return str; }function doApi(obj) { if(obj.ret!=0) { pane.innerHTML="对不起!暂时无法获取滔滔的唠叨,请稍候重试..."; return ; }var qq=obj.ui.qq,name=obj.ui.name,usn=obj.ui.usn,rank=obj.ui.rank,lrank=obj.ui.lrank,rec=obj.rec; var arr=obj.posts,i=0,data,pane=LL(taotao_pane_id),li,span,a,bD=false; for(i=0;i<arr.length;i++) { data=arr[i]; li=LK("li"); li.style.wordBreak="break-all"; li.style.height="auto"; li.style.overflowY="auto"; if(obj.type==1) { a=LK('a'); a.style.marginRight="8px"; a.innerText=data.nm; a.textContent=data.nm; a.href="<http://www.taotao.com/v1/space/>"+data.qq; li.appendChild(a); if(data.pqq) { li.appendChild(document.createTextNode("@")); a=LK('a'); a.style.marginRight="8px"; a.innerText=data.pnm; a.textContent=data.pnm; a.href="<http://www.taotao.com/v1/space/>"+data.pqq; li.appendChild(a); } }span=LK("span"); if(data.sr==10) { span.innerHTML=LE(data.cn,"_blank"); }else if(data.sr==9) { LI(data.cn); var cxlen=g_cximg.length; span.innerHTML=g_ubbcon+' <a target="_blank" href="<http://www.taotao.com/caixin.shtml?qq='+qq+>"&tid="+data.id+'">点击查看彩信</a>'; }else { span.innerHTML=LF(LG(data.cn,"_blank")); }li.appendChild(span); span=LK("span"); span.style.marginLeft="8px"; a=LK('a'); a.style.color="#929091"; if(parseInt(data.pqq)>0) { a.href='<http://www.taotao.com/v1/reply/t.'+data.pid+'/u.'+data.pqq>; }else { a.href='<http://www.taotao.com/v1/reply/t.'+data.id+'/u.'+qq>; }a.innerHTML=LJ(data.time); li.appendChild(span); span.appendChild(a); span=LK("span"); span.style.marginLeft="4px"; span.innerText="通过 "+taotao_sr[data.sr]; span.textContent="通过 "+taotao_sr[data.sr]; li.appendChild(span); pane.appendChild(li); } }function LJ(t) { if(t.charAt(1)!=',') { return t; }if(t.length<2) { return ""; }var n=t.charAt(0),v=t.substr(2,t.length),s=''; if(n==1) { s='约 '+v+' 秒前'; }else if(n==2) { s='约 '+v+' 分钟前'; }else if(n==3) { s='约 '+v+' 小时前'; }else if(n==4) { s='约 1 天前'; }else if(n==5) { s='约 3 天前'; }else if(n==6) { s='约 1 周前'; }else if(n==7) { s=v; }return s; }function inclApi() { var src="<http://www.taotao.com/cgi-bin/msgj?qq=>"+taotao_qq+"&num="+taotao_num+"&t="+taotao_type,htm='<div>'+'<ul id='+taotao_pane_id+' style="margin-bottom:5px">'+'</ul>'+'<table cellpadding="0" cellspacing="0" border="0" width="100%">'+'<tr>'+'<td align="left">'+'<a href="<http://www.taotao.com/v1/space/'+taotao_qq+'>" style="color:#0278c2;float:left;display:block;">更多唠叨</a>'+'</td>'+'<td align="right">'+'<a href="<http://www.taotao.com>" title="滔滔" target="_blank" style="width:96px;height:20px;cursor:pointer;float:left;display:block;*filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src=\'[http://www.taotao.com/images/logo.png\',sizingMethod=\'image\'](http://www.taotao.com/images/logo.png%5C',sizingMethod=%5C'image%5C'));background:url(<http://www.taotao.com/images/logo.png>) no-repeat left top !important;*background:none;"></a>'+'</td>'+'</tr>'+'</table>'+'</div>'; window.document.write(htm); window.document.write('<sc'+'ript type="text/javascript" charset="utf-8" src="'+src+'"></'+'script>'); }initApi(); inclApi();
王菲的歌 流非飞 王菲 菲菲不停问我 是我犯错吗 多讲反而是错 菲菲不停问我 别这样那么 喜欢依然是我 曾经我问我为何 答话这样傻 请你不要随便胡乱评论我 飞自由 飞自由 完全非自由 完全非自由 飘拂可能是我 令你着了火 偏偏不明白我 仿佛表情做错 扮相着了魔 通通不原谅我 如果说话这样奇 故事太迷离 不要管那是非 胡乱来做戏 (菲菲)看笑语满天 (菲菲)请放过我吧 (菲菲)太自我太不羁 (菲菲)不爱理无心机 (music) 菲菲今天不打领呔 姿色多古怪 事实是他不想太乖 东方 天天 清新 大众 一周的心态 事实大家思想太歪 菲菲不揪不睬上街 清高的姿态 事实是她不太愉快 假装天天款要摆 高深的一派 但愿问他可否了解 曾经我问我为何 答话这样傻 请你不要随便胡乱评论我 飞自由 飞自由 完全非自由 完全非自由 (music) (菲菲)看笑语满天飞 (菲菲)请放过我吧 (菲菲)太自我太不羁 (菲菲)不再叫菲菲 曾经我问我为何 答话这样傻 请你不要随便胡乱评论我 喜欢依然是你 像似没结果 北京依然是美 菲菲依然念记 像似没结果 喜欢依然是你 (music) 完全非自由 (END)
怎么调试django程序呢? models还好,可以在django shell中很方便的调试 而view中只能发送httpresponse对象到浏览器,print打印的东西不会在浏览器输出 找到了这篇文章 http://simonwillison.net/2008/May/22/debugging/ 收获: 如果用的是development server,print输出到了对应的terminal中 ...
关于 django的缓存 几篇文章 http://docs.djangoproject.com/en/dev/topics/cache/ http://www.woodpecker.org.cn/obp/django/django-faq/cache.html http://groups.google.com/group/python-cn/browse_thread/thread/917d211b25576342/d0b957e338644540?lnk=gst&q=django%E7%BC%93%E5%AD%98%E6%9C%BA%E5%88%B6# 可以用下面的view代码测试缓存是否工作 from django.views.decorators.cache import cache_page @cache_page(60 * 2) def test(request, task_id): s = datetime.datetime.now() return HttpResponse(str(s)) 另: 如果使用文件型缓存,如 CACHE_BACKEND = 'file:///tmp/django_cache' 需要注意/tmp/django_cache 必须对你的server用户是可写的,如nobody 如果你同时运行开发服务器和生产服务器,一定要注意写权限 ...