CAT | 我的日记
require 'win32ole' $col_map =["","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"] class Excel_Info attr_accessor :file_name attr_accessor :range def initialize(file_name) @file_name = file_name @range = {} end end (全文...)
No tags
我是按照我买他们的时间来安排列表的,从这里你也可以看到我是怎么开始学编程的,顺便把我的一些经历说说。
所有的书都是外国人写的,对这点我深感遗憾,国人写的不如我法眼。。。(这话说的)
1.首先是从高中带过来的两本:
一本是《时间简史简装版》一本是《薛定谔的猫》,这两本是我高二时候买的。其实还有一本《时间简史精装版》的,可惜后来被我搞丢了。
这两本都是讲理论物理的,很有意思,而且讲得不深入。。。特别是《薛定谔的猫》我老喜欢了,书籍资料跳转看:
《薛定谔的猫》 http://book.douban.com/subject/1089271/
略。
这个有兴趣的拿去吧,我现在对理论物理无爱了,因为我直到现在这门课还没过。
2.c#
大二之前我不知道啥是编程。。。大二有门课叫做c++,后来我那个暑假想借本书看看啥是c++,然后去了图书馆,我看到好多c啊,c,c++,c#。我不知道他们有啥区别,于是我随便找了一本,后来发现拿的是c#。然后之后就开始我的编程生涯了,从c#开始。
首先是一本重量级的书 《c#2005&.net3.0高级编程》(第5版) ,现在我只有下半本,上半本被人偷了。原价158.00元,现在10块钱处理。这本书很经典哦,主要是很厚,从新街口书店拿到学校,差点没压死我。。。
然后是一本《beginning c# objects–从概念到代码》,这是一本思想重于概念的书,和上面这本书结合起来看最好不过,算是进阶版吧。这本是完整的,18块钱,卡卡
其实我买了很多本c#的书,不过都被我搞丢了。。。
3.php
学了一些c#后,一直没突破,也就给院里做个小软件啥的,都幼稚的要命。后来偶然我不记得啥时候我开始了php旅程,之后php一直跟着我接近一年。。。
php我看过N本书,不过我买的书就可怜的少了,只有一本《php函数参考手册》。php程序员必备,哇咔咔。原价:69.我出 18元。
4.工程方法
学了编程,难免接触点方法学和工程学的东西,毕竟这些东西才是真正的修养,要不一辈子都是一个代码工人而已。
最经典的一本:《代码之美》,如果你不知道这本书有多牛逼,那你真的out了,不多说。原价:99.我出30元。
第二本:《编程之美》,微软那波人写的,很牛逼很好玩,原价:40元,我出20.因为是本好书。
第二本:《系统分析与设计方法》,这本书也很有用。但是我看的很少,我一个学长推荐我看的,我看不懂。。。原价:69,我出20
第三本:《设计模式初学者指南》,这本比较通俗易懂,也是很出名的书。原价:49,我出:15.
第四本:《uml用户指南》,买了没看过,uml太复杂,还是画脑图划得来。原价:49,我出:12.
第五本:《数据结构与算法-java语言版》第二版,我对算法不感冒,看到树那里就看不懂了。罪过啊。原价:59,我出18.
5.电
《无线电合订本 2007 下》,很经典的电子学杂志,里面很多可爱的例子和教程,5元抛了。
6.flash
大三暑假的时候,有个公司说要要我,但是要会flash,于是我花了三个月学flash。之间买了很多书,不过很多都没了,不知道去哪了。
第一本:《flash ActionScript3.0动画教程》很经典的一本书,看了保准不后悔。原价:59,我出 22.
第二本:《游戏关卡设计》,我无爱。5块钱
第三本:《advanced ActionScript3.0 animation》,这是英文版的,装订比书店那种好多了,之所以是英文版是因为没有中文版。我出 18元。
第一个来买的送程序员杂志一本。。。
No tags
记得曾经学c#桌面编程的时候经常有时候要按名字取得某个实例的引用,貌似搞起来挺麻烦.今天群里有个人提出个更变态的需求来.
说他定义了N个数组变量:
var arr_1=new Array(); var arr_2=new Array(); var arr_3=new Array(); var arr_4=new Array();
然后到了某个时候,他想知道自己定义了多少个类似的变量.
哦,真变态,既然需求变态,那我就写了个变态的解决方法:
var count=0
for(var i in window){
if(i.substr(0,4)=="arr_"){
count++
}
}
很无聊吧,很抱歉耽误了你几分钟的时间….
No tags
所谓延迟解析,不是延时加载,不是延时执行。
文中说的延迟解析是指,页面里的某些js代码不会被解析,只有当在程序中要用到的时候才解析,以便减少解析js的时间和性能浪费。
对于延迟解析,我首先想到的就是把js代码存在放一个隐藏的pre里,之后在引用之后从pre里取出来创建一个script。script内容就是div里的js内容,然后把script附加到html里。
思路没问题,但是有两个基本问题需要解决。
首先是script标签在ie下不能用js往里填充内容(innerHtml,innerText都不行,后来有人说text属性可以添加内容,我还没试过,有空再试)。第二个问题是js代码存放在pre里的时候,里面的大于号小于号等特殊符号会被解析成html。
对于第一个问题,我试过了很多方法,最后不得不放弃动态创建script的方法,虽然这在标准浏览器里是允许的,但是ie里是不允许的。
替代办法可能会想到用document.body.innerHTML+=”<script>alert(“aa”);<\/script>”;
这样写的问题就是script里的js不会被解析.
还有一种方法就是document.write.document.write里的js会被立即解析.
不过document.write一定要在文档解析结束之前调用,否则document.write会清楚页面上的内容.(例如:在onload函数里执行document.write会使网页里德内容被清空)
之后是第二个问题,就是一些js里德特殊符号会被错误解析成html元素.所以需要一种方法让html解析器跳过他们,于是自然而然想到了html注释,
于是出来了下面这个完整的demo代码:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title></title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<style>
.script{
display: none;
}
</style>
</head>
<body>
TODO write content
<pre class="script" id="script">
<!--
function aa(){
alert("dd");
}
alert("dddd");
-->
</pre>
</body>
</html>
<script>
//一定要在onload之前调用
var innerhtml=document.getElementById("script").innerHTML;
document.write("<script>"+innerhtml.replace("<!--","").replace("-->","")+"<\/script>")
aa();
</script>
至于这样写有什么用,延迟解析有什么用,我还真没想清楚,今天想了一天能不能把自己的框架做成按需加载(不是动态加载,动态加载浪费连接数,而且操作麻烦,还不如手动引入)延迟解析主要是可以在用到的时候才解析,这点比较让我觉得有点意义.
No tags
今天我们带来四种方法,排除了字符串串接法,因为这种方法灵活性不太高,而且字符串串接效率堪忧.
我们从两个方面来对比这四种方法:代码量和效率;
首先介绍这四种方法的实现:
我们以一段html代码为例还展示各个方法的使用时代码量.
<div class="m-window" style="display:none;" id="tpl">
<div class="wrap">
<div class="hd">
<div class="l"></div>
<div class="m">
<div class="icon"><img src="$!img_url"/></div>
<div class="title">$!title</div>
</div>
<div class="r"></div>
</div>
<div class="bd">
<div class="m"></div>
</div>
</div>
</div>
1。普通的createElement方法:
这种方法没有任何技巧可言,而且代码一些就是一大坨,当然从灵活性来讲它当然是最灵活的,但是繁重的代码量让人蛋疼:
/**
* 这种方法的缺点就是代码太长,而且document.createElement这一个函数名酒好长,而且代码不美观,逻辑容易混乱,从代码中看不出空间上的逻辑
* 优点是,可以完全控制dom,可以随时添加事件,属性,样式,层级
*/
实现代码:
//createElement逐个创建法,这里为了减少代码量,用了一些紧凑写法,和三个变量,
//两个变量用来轮流充当父子元素,另一个变量用来在复杂的地方缓冲一下
var ele,ele1,ele2;
(ele=document.createElement("div")).className="icon";
var ele1;
(ele1=document.createElement("img")).src="img/icon.gif"
ele.appendChild(ele1)
var ele1;
(ele1=document.createElement("div")).className="m";
ele1.appendChild(ele)
var ele;
(ele=document.createElement("div")).className="title";
ele.innerHTML="窗口demo";
ele1.appendChild(ele)
var ele;
(ele=document.createElement("div")).className="hd";
(ele2=document.createElement("div")).className="l";
ele.appendChild(ele2)
ele.appendChild(ele1);
var ele1;
(ele1=document.createElement("div")).className="r";
ele.appendChild(ele1)
var ele1;
(ele1=document.createElement("div")).className="wrap";
ele1.appendChild(ele);
var ele;
(ele=document.createElement("div")).className="bd";
var ele2;
(ele2=document.createElement("div")).className="m";
ele.appendChild(ele2);
ele1.appendChild(ele)
var ele;
(ele=document.createElement("div")).className="m-window";
ele.appendChild(ele1)
document.body.appendChild(ele)
a
2.JsonHtml方法
这种方法是我在淘宝的同事zhuangquan的一个dom创建的实现,在淘江湖中有应用.
原理代码如下:
var JsonHtml={
compose:function(config,attrIndex){
var tag,attr,ref,childs=[];
for(var key in config){
var value=config[key];
switch(key){
case "ref"://引用
ref=value;
break;
case '>>'://子元素
childs=value;
break;
default:
tag=key;
attr=value;
break;
}
}
if(!tag)return;
//支持dom对象
var root=config[tag].nodeName?config[tag]:document.createElement(tag);
if(ref)this[ref]=root;
//设置属性
JsonHtml.setAttr(root,attr,attrIndex);
//添加子类
if(childs){
if(typeof childs=="string"){
root.innerHTML=childs;
}
else{
for(var i=0;i<childs.length;i++){
var num=childs[i].num||1;
for(var j=0;j<num;j++){
//递归
var childEl=arguments.callee.call(this,childs[i]);
if(childEl)root.appendChild(childEl);
}
}
}
}
return root;
},
//设置属性
setAttr:function(target,attr,attrIndex){
var index=attrIndex?attrIndex:0;
for(var p in attr){
var value=attr[p];
switch(p){
case "style":
JsonHtml.setStyle(target,value);
break;
case "className":
target.className=value;
break;
default:
target.setAttribute?target.setAttribute(p,value):target[p]=value;
break;
}
}
},
setStyle:function(target,style){
for(var p in style){
target.style[p]=style[p];
}
}
}
创建上面那段html的方法和优缺点总结如下:
/**
* JsonHtm
* 根据一定的Json格式,构造html,并可把元素绑定到当前作用域
* 便于widget组件构造html代码,并获对元素的引用
* requires SNS
* @author zhangquan
* @date 2009-08-19
*/
document.body.appendChild(JsonHtml.compose({
div:{className:"m-window"},">>":[
{div:{className:"wrap"},">>":[
{div:{className:"hd"},">>":[
{div:{className:"l"}},
{div:{className:"m"},">>":[
{div:{className:"icon"},">>":[
{img:{src:"img/icon.gif"}}
]},
{div:{className:"title"},">>":"窗口demo"}
]},
{div:{className:"r"}}
]},
{div:{className:"bd"},">>":[
{div:{className:"m"}}
]}
]}
]
}))
//优点:用json表示,可以从后来直接穿过json字符串来拼出dom结构
//缺点:不能方便滴绑定事件,和随意引用其中的某个dom元素
s
3.我写的一个函数,是代码量最少的,也是除了createElement之外最灵活的.
原理代码:
/**
*一次性完成创建和初始化某个dom元素的操作,在特定情况下使用节省代码
*简单的创建不推荐使用
*@param {string} tagName 标签名
*@param {ele} parentNode 父元素也可以用p简写
*@param {string} innerHTML 内容
*@param {json} attributes 属性值对
*@param {json} styles 要赋予的样式
*@param {json} event 绑定的事件 例如:event={type:"click",func:function(){}}
*/
var createElement=function(tagName,params,childs){
var ele=document.createElement(tagName);
if(params!=undefined){
//可以用p也可以用parentNode指定父元素
if(params.parentNode||params.p){
(params.parentNode||params.p).appendChild(ele)
}
if(params.innerHTML||params.i){
ele.innerHTML=params.innerHTML||params.i;
}
if(params.className||params.c){
ele.className=params.className||params.c;
}
if(params.attr||params.a){
var attr=params.attr||params.a;
for(var i in attr){
ele[i]=attr[i];
}
}
if(params.styles||params.s){
//这是我定义的一个函数,用来混合样式
// M.dom.mixinStyle(ele,params.styles||params.s)
}
if(params.event||params.e){
params.event=params.event||params.e;
//用来添加事件
// M.Event.on(ele,params.event.type,params.event.func);
}
}
if(childs==undefined) return ele;
if(childs.length==undefined){
ele.appendChild(childs);
} else{
for(var i=0,n=childs.length;i<n;i++){
ele.appendChild(childs[i])
}
}
return ele;
}
s
创建上面的html结构的代码如下:
var C=createElement;
C("div",{c:"m-window",p:document.body},C("div",{c:"wrap"},[
C("div",{c:"hd"},[
C("div",{c:"l"}),
C("div",{c:"m"},[
C("div",{c:"icon"},C("img",{a:{src:"img/icon.gif"}})),
C("div",{c:"title",i:"窗口demo"})
]),
C("div",{c:"r"})
]),
C("div",{c:"bd"},C("div",{c:"m"}))
]))
//缺点,没想出来,因为是我写的
//优点,很明显,代码量最少,而且可以直接往各个元素上加样式属性和事件等等.
//而且是用函数嵌套创建,可以在任何地方插入一个对dom的引用
//没有特殊操作,性能较有,就是直接创建,没有特殊的处理,
//优点太多了,不追叙
s
4.模板创建法:
这种方法把模板放在页面里,然后hidden掉,原理类似php或者其他语言中的模板,效率是最低的,但是重构起来时最简单的.也是我的一个实现:
var ViewBuilder=function(){
/**
*这是一个视图构建类,传进一个模板字符串和数据结构,将其构造成html字符串,此类改进中,因为性能可以提升
*/
return{
/**
*构造函数
*param s 数据结构,必须符合一定的规则,例如:
*
data:{
username:"sffffffffffffffffffffffffffffffffffffffffffffs",
content:"ss",
time:"ss",
yes_num:0,
no_num:0
}
*param tpl_id 存放模板的html元素,值用$!标记,标记跟data里的key相同,顺序不变
*/
build:function(s,tpl){
if(s==null||tpl==null){
alert("ViewBuilder->build()的参数不完整")
}
//获取到模板字符串
var tpl_str=tpl,reg_str="",count=1,replace_txt="";
//根据数据构造正则字符串
for(var data1 in s){
reg_str+="([\\s\\S]*?)\\$\\!"+data1+"";
count++
}
reg_str+="([\\s\\S]*)"
//构造完毕,生成正则字符串
var reg=new RegExp(reg_str);
//在模板字符串里执行这个正则
reg.exec(tpl_str)
count=1
tpl_str=""
//根据匹配的数据重新构造html
for(var data in s){
tpl_str+=RegExp["$"+count]+s[data]
count++
}
tpl_str+=RegExp["$"+count]
//返回html结构的字符串,ok
return tpl_str
}
}
}()
应用代码:
var div=document.createElement("div")
div.className="m-window"
div.innerHTML=ViewBuilder.build({
img_url:"img/icon.gif",
title:"窗口demo"
},$("tpl").innerHTML)
document.body.appendChild(div)
//优点,无论dom多复杂都只需这么些代码
//多次创建窗口的时候比较方便,方便以后更改dom结构,只需要把模板在html中修改即可,直观快速,这是其他方法所不具备的
//缺点,和字符串串接法缺点相同
s
然后我对这四种方法做了个性能测试,从性能上看第一种方法的性能是最快的,其他在不同浏览器中都有不同的表现:
chrome:
firefox:
ie6:
No tags
今天在使用tms的时候出现严重错误,造成数据全部丢失,吓了我一身冷汗,下面把起因总结下,以后可以预防这种错误的出现:
1。改tms的时候标准流程是先在本地测试制作页面,然后把代码专成tms,如果不确定可以在tms里做一个测试的页面,测试功能,不能再原页面上测试.
2。之后开始改tms,首先通知运营停止编辑tms,不要发布tms,然后将tms里的内容复制出来做一个备份,注意这里的备份千万不要动,不要直接在备份上改tms,为了防止不小心改了tms备份,应该将其备份之后就在ide里关掉,这样一是关掉了就没机会改备份了,二是如果在ide里不小心改了备份,之后发现不应该改备份,按着ctrl+z回退的时候会会退到第一次打开这个文件时候的状态,而这个状态可能不是你备份的那个状态,有的ide又不提供前进选项,这时候你的备份就丢失了.这就是我早晨编辑tms的时候出的问题.
3。tms里用name属性来标示每次更改,每次更改内容之后name值都会改变.如果你从备份里粘贴一份备份内容到tms的时候,tms提示你**个name将丢失,确定更改?这个时候就要好好考虑下了,为什么name会丢失?如果是你的确删除了一些tms标签,name是可能丢失的,这是正常的情况.但是如果你的备份比当前的内容旧的话,那种name丢失就不正常了,name丢了,里面的内容也就丢了,这时候要仔细考虑下,防止内容丢失.
有时候虽然你知道name丢失不会造成影响,但是如果运营那边说要回滚,因为样式有误之类的,这时候内容也会丢失,这种情况最好自己也备份一份数据,实在不行找工作人员回滚
4。从tms备份一份到本地之后,不能直接在这个备份上改tms,而应该再复制一份,在这份上面改,改好了之后一起复制到tms里.测试无误之后通知运营.
5。改tms就是要仔细啊,不能图省事……
No tags
1.优化HTML
http://jeekundo.com/2010/02/309
2.像Google一样开会
http://www.isweetriver.com/2010/google-meetings
3.加速Javascript:DOM操作优化
http://www.blogjava.net/emu/archive/2010/03/01/314185.html
Logo设计的好坏,关系着一个企业如何树立形象的问题。Logo设计本身就是一个困难的课题,有了著名的Logo,将它重新设计就是一项更加挑战的工作。如果处理不当,他会带来怎样的后果?文中列出了2009年重新设计过的著名Logo,在这里不评判他们的好坏,只是列在这里,供大家来参考。
1、Telcom
2、Play Station 3
3、Sunny Delight
4、Lays
5、Sony Ericsson
6、Yale
7、Sprite
8、Segd
9、Pfizer
10、Opera
11、OMCA
12、MSN
13、Nicklodeon
14、Movistar
15、Meiji
16、Kraft Foods
17、Doctor WHO
18、Jack in the box
19、France
MOTODEV是摩托罗拉耗费大量人力打造的android开发工具,支持原生的android开发和二次开发的ophone平台开发,同时提供基于java的开发和JavaScript+html+css的UI开发两种方式.
MOTODEV和原生的android开发工具有什么不同呢,其实MOTODEV就是基于原生的开发工具的二次开发,集成了一些常用配置,因为在配置android开发工具的环境的时候非常麻烦,而且经常出错,很多时候都无法解决,这个工具就是把所有的功能都集成进来,无需配置,安装完了就可以开始开发.方便了不少.而且我发现MOTODEV内置的模拟器比原生的模拟器快很多,启动超级快,运行也比较快
最新版下载地址:http://developer.motorola.com/docstools/motodevstudio/download/
moto的开发文档也不错,虽然是英文,但是看着还算流畅,内容很不错

