唐僧师徒一行经历九九八十一难终于见到了如来佛求取真经
如来问:"你们带U盘了么?"
唐僧师徒。。。。
如来又问:"移动硬盘呢?"
。。。。。
如来继续问:"IPOD也可以哇"
悟空挖起耳朵来
如来叹了口气:"那你们就原路回去吧,我用QQ传给你们
唐僧:靠,早知道加你QQ就完了,老子还走这么远干嘛
如来突然想起什么,
又问:你们带MP4没有?
唐僧师徒:……
如来:那你们路上是怎么娱乐的?
唐僧师徒:打怪升级
今天遇到 sqlite3 数据库错误 "database disk image is malformed",G 了一下,搞定,遂记录,帮人帮己。
假设原数据库名 abc.sqlite3
#bash >>sqlite3 abc.sqlite3然后
.output "_XB_D.tmp" .dump .quit
再建个新数据库 abc2.sqlite3
#bash >>sqlite3 abc2.sqlite3然后
.read "_XB_D.tmp" .quit
然后修复原来的数据库名和文件权限,应该就没事了。
以上代码来自 文件 RepairUR.zip
不知道如何解释,用过 DW 的人应该知道 Ctrl + T ,这个就是模拟那个的,不过没有自动提示就是了。
建议将这个宏也设置快捷键 Ctrl + T 。(具体设置请参见 Emeditor Macros Help)
| 输入(将~换成空格) | 输出 |
|---|---|
| table | <table>{原来选中的文字}</table> |
| table~ | <table width="100%" border="0" cellpadding="0" cellspacing="0">{原来选中的文字}</table> |
| table~,tbody,tr,td | <table width="100%" border="0" cellpadding="0" cellspacing="0"><tbody><tr><td>{原来选中的文字}</td></tr></tbody></table> |
| div#abc,p | <div id="abc"><p>{原来选中的文字}</p>>div> |
| div#abc,p,a~,img~ | <div id="abc"><p><a href="#"><img src="" width="" height=""/>{原来选中的文字}</a></p>>div> |
var tag,
autoprop={
a: 'href="#"',
div: 'class=""',
style: 'type="text/css"',
link: 'type="text/css" rel="stylesheet" href=""',
script: 'type="text/javascript" src=""',
input: 'type="" name="" value=""',
img: 'src="" width="" height=""',
table: 'width="100%" border="0" cellpadding="0" cellspacing="0"',
iframe: 'frameborder="0" scrolling="no" width="" height="" src=""'
},
sigletag={'br':1, 'link':1, 'hr':1, 'col':1, 'input':1, 'meta':1, 'img':1};
if(tag = prompt("请输入标签:", "div")){
if(tag.indexOf(',')==-1){
var t = buildTag(tag);
document.selection.Text = t[1] + document.selection.Text + t[2];
}else{
var tags = tag.split(/, */),
rstr = '',
rstr2 = '';
for(var i=0,iM=tags.length;i<iM;i++){
tag = buildTag(tags[i]);
rstr += tag[1];
rstr2 = tag[2] + rstr2;
}
document.selection.Text = rstr + document.selection.Text + rstr2;
}
}
/*
返回
[标签,起始标签,结束标签]
*/
function buildTag(t){
var tagname=t.split(/ +/)[0];
var autoa = (t == tagname + ' ') && (tagname in autoprop);
if(tagname.match(/[#\.]/)){
var id = tagname.match(/#([^\.]+)/),
cls = tagname.match(/\.[^\.]+/g);
t = tagname = tagname.match(/^([^#\.]+)/)[1];
if(id)t += ' id="' + id[1] + '"';
if(cls){
t += ' class="' + cls.join(' ').replace(/\./g, '').replace(/ +/g, ' ') + '"';
}
if(autoa)t += ' ';
}
if(autoa){
t += autoprop[tagname];
}
return [tagname,
"<" + t + (tagname in sigletag ? ' />' : '>'),
tagname in sigletag ? '' : ("</" + tagname + ">")];
}
关于日期时间操作的 js 函数库 date-js 。简单实用。
/**
date
set()
clone()
fmt()
Y() ~ FullYear
m() ~ Month
d() ~ Date
H() ~ Hours
M() ~ Minutes
S() ~ Seconds
s() ~ Milliseconds
t() ~ Time
[static] from()
使用示例
var d = date(),
D = new Date();
D.getMonth() == d.m()
D.getFullYear() == d.Y()
D.setFullYear(1999) == d.Y(1999)
D.setHours(8) == d.H(8)
d.set('m+1') == D.setMonth(D.getMonth() + 1)
d.set('Y2008m0') == (D.setFullYear(2008) && D.setMonth(0))
d.fmt('%Y-%m-%d %H:%M:%S.%s %%s') == '2009-02-04 22:23:45 %s'
set()
如果带 +/- 操作,那么表示将相应的项添加或者减少(W 表示增减周.7天.)。
如果不带 +/- 操作,那么:
Y 的设置将自动取当前年的前 n 位补齐 Y 不够 4 位的部分,例如 Y34 会被认为是设置 2034 年,Y123 会被认为是设置 2123 年(假设当前时间为 2009年)。
M 的操作会按照月份的数字设定,比如 M1 将设置月份为 1月,M12 设置月份为 12月,M0 则设置为上一年的最后一月(年份会自动减小)。
W 的操作会设置周几,比如,假设当前为周三,那么 W1 会将日期前移 2 天(到周一),W0 会将日期前移 3 天,到上周日,W7 会将日期后移到本周日,如果设置大于 7 也可以,不过应该比较难理解了。
其他按照字面意思进行。
示例:
Q: 这个月有多少天?
A: d.set('M+1D0').D()
Q: 上个月有多少天?
A: d.set('D0').D()
Q: 5 月有多少天?
A: d.set('M6D0').D()
Q: 这周的第一天是哪天,最后一天呢(假设第一天是周一)?
A: d.set('W1'), d.set('W7')
Q: 如果要显示这个月的日历,那么第一天和最后一天是什么(假设第一天是周一)?
A: d.set('D1W1'), d.set('M+1D0W7')
Q: 上一个问题中,如果所有日历都显示 6 周,那么最后一天如何计算?
A: d.set('D1W1'), d.set('D1W7W+5')
*/
var date = (function(){
function now(){return new date()}
function iter(obj, fn, o){
o = o || obj;
if(!(obj && typeof obj == 'object')){
return;
}
var i,
l = obj.length;
if(typeof l == 'number'){
if(l){
for(i=0;i<l;i++){
if(fn.call(o, obj[i], i, obj) === false){
break;
}
}
}
}else{
for(i in obj){
if(obj.hasOwnProperty(i)){
if(fn.call(o, obj[i], i, obj) === false){
break;
}
}
}
}
return iter;
}
function mixin(target, source){
for (var x in source) {
target[x] = source[x];
}
return mixin;
}
function date(Y, m, d, H, M, S, s){
var r = this;
if(this instanceof date){
this._d = new Date;
}else{
r = new date;
}
if(arguments.length){
r.t(new Date(Y, m, d, H, M, S, s).getTime());
}
return r;
}
mixin(date,
{
conv:{
'Wm':10080,
'dm':1440,
'WS':604800,
'dS':86400,
'Ws':604800000,
'ds':86400000,
'Hs':3600000,
'Ms':60000,
'Ss':1000,
'ss':1
},
from:function(s){
return new date().set(s);
}
}
);
iter(
{
Y: 'FullYear',
m: 'Month',
d: 'Date',
H: 'Hours',
M: 'Minutes',
S: 'Seconds',
s: 'Milliseconds',
t: 'Time'
},
function(v, k){
date.prototype[k] =
(function(s,g){
return function(v) {
v!==undefined && v!==null && this._d[s](v);
return this._d[g]();
}
})('set' + v, 'get' + v);
}
);
mixin(date.prototype,
{
set: function(str){
var d= this;
str.replace(
/[YmdWHMSs][+-]?\d+/g,
function(w){
w= w.match(/(\w)([+-]?)(\d+)/);
var f=w[1], //key
v= w[3], //value
s= w[2]; //type(+/-)
if(s==''){
if(f=='Y' && v.length < 4){
v= '' + String(now().Y()).slice(0,4-v.length) + v
}
if(f=='m'){
v= parseInt(v)-1;
d.m(v);
}else if(f=='W'){
v= parseInt(v)-d.getDay();
if(v){
d.set('d' + (v>0?'+':'') + v);
}
}else{
d[f](parseInt(v))
}
}else{
v= parseInt(s+v, 10);
if(v){
switch(f){
case 'Y':
case 'm':
d[f](d[f]()+v);
break;
default:// dWHMSs
d.t(d.t() + v * date.conv[f+'s']);
break;
}
}
}
return ''
}
);
return this
},
fmt: function(str){
if(!str){
str = 'YY-mm-dd HH:MM:SS';
}
var d= this;
return str.replace(
/%([YmdHMS%])/g,
function(w, s){
return s == '%' ?
s :
(('' + d[s]()).replace(/^(\d)$/, '0$1'));
}
);
},
clone:function(s){
return new date(this.t()).set(s);
},
toString: function(){
return this._d.toString.apply(this._d, arguments);
},
valueOf: function(){
return this._d.valueOf.apply(this._d, arguments);
}
}
);
//date.prototype.str = date.prototype.format = date.prototype.strfmt = date.prototype.fmt;
return {
iter: iter,
mixin: mixin,
date: date,
now: now
};
})().date;
在 收件箱里通过 J/K 键来上下选择邮件,这时候邮件前的方框应该是没有选中的,可以通过 X 键来选中(除了打开邮件外,其他操作都需要选中邮件);
选中邮件后,虽然一般是先看看邮件内容再做操作的,但是你也可以直接:
E 存档,把他移出收件箱,之后可以到 所有邮件里找到(说明我不用看内容就知道这个邮件的用处了,最好还是慎用,加入邮件里有你不知道的内容呢!);
# 删除,只能在 垃圾箱里找了(如果你 30 天都没找,他就没了);
S 打星,表示这个很重要;
Shift + i 设置为已读;
Shift + u 设置为未读(这 2 个有啥用?自己想想吧,我也不知道)
. 或者 鼠标点击, 打标签或者更多操作(探索一下吧)
如果需要看看邮件再做操作,那么 O 或者回车 打开邮件,然后:
如果打开邮件后想返回,按 U 即可;
如果觉得很垃圾,就 # 把它删除(会被放到 Trash 里去,给你后悔的机会,如果你在 30 天内都对他不理不睬,将自动被完全删除);
如果觉得觉得需要稍后处理则 J 继续看下一封邮件;
如果觉得看完即可,则直接 E 存档(把它移出收件箱<我不习惯看到 收件箱里很多邮件>);
如果想存档并立即看下一封,可以用 y, o (我还没用过..)
如果觉得很重要则 S 标记个星号(Star),记得及时将不再重要的邮件的星号去掉,太多星号邮件跟没有一样,慢慢的你就又懒得去管理星号了;
如果邮件应该分类,则在 更多操作里选择相应的标签(Label),此处可以点击那个下拉列表也可以通过 .(英文句点) 调出(标签的具体分类稍后说);
如果使用了 Gmail 实验室(labs) 里的 任务(Task) 功能,可以 Shift + T 使用当前邮件建立新的 任务;
如果需要回复(Replay),则直接在邮件下面的输入框里输入就可以,转发也一样方便;
如果对方也使用 Gmail 并且需要回复的内容较少或者需要回复的内容关联性不强,可以使用聊天的方式回复(ie6 不支持);
OK,就这么多,
下次说说 聊天(Gtalk)功能,还有一些推荐 设置(Setting)。
希望有用。
另:
这里所说的只是我的一些使用习惯和方式,并没有什么其他意思。
如果你还没有或者不满意自己的习惯可以参考一下我的,
如果你有自己的习惯并愿意公开,欢迎分享。
:)
//原始实现
function convertToJsEsc(chars) {
var result = '';
for(var i=0; i<chars.length; i++) {
var code = chars.charCodeAt(i);
switch (code) {
case 0x20: result += "\\s"; break;
case 0x22: result += "\\\""; break;
case 0x27: result += "\\\'"; break;
case 0x28: result += "\\("; break;
case 0x29: result += "\\)"; break;
case 0x2A: result += "\\*"; break;
case 0x2B: result += "\\+"; break;
case 0x2E: result += "\\."; break;
case 0x2F: result += "\\/"; break;
case 0x3F: result += "\\?"; break;
case 0x5B: result += "\\["; break;
case 0x5C: result += "\\\\"; break;
case 0x5D: result += "\\]"; break;
case 0x7B: result += "\\{"; break;
case 0x7D: result += "\\}"; break;
default:
if(code > 0x1F && code < 0x7F) { result += chars[i]; }
else { result += "\\u" + code.toString(16).toUpperCase(); }
break;
}
}
return result === "" ? "Nothing to convert" : result;
}
//我的修改
function convertToJsEsc(chars) {
return chars && chars.replace(
/([ "'\(\)\*\+\.\/\?\[\\\]\{\}])|([\x1F-\x7F])|(.)/g,
function(all, a, b, c){
return a ?
('\\' + (all==' '?'s':all)) :
b ?
all :
('\\u' + all.charCodeAt().toString(16).toUpperCase());
}
) || 'Nothing to convert';
}
有啥区别?
优点:方便修改
缺点:难于理解。
<div style="height:100px;" class="autoscroller">
<div style="height:150px;"></div>
</div>
css
.autoscroller{position:relative;overflow:hidden;}
.autoscroller .scrollcon{overflow:hidden;}
.autoscroller .scrollbar{
position:absolute;right:0;top:0;width:9px;
background:#fff;font-size:1px;line-height:1px;}
.autoscroller .scrollbar s{
position:absolute;left:3px;top:0;height:100%;width:2px;
border-left:1px solid #c3c3c3;background:#000;}
.autoscroller .scrollbar i{
width:9px;position:absolute;
background:url(scroller_btn.gif) repeat-y 0 0;
cursor:n-resize;left:0;top:0;}
.autoscroller .scrollbar i b{
background:url(scroller_btn.gif) no-repeat -9px 0;
display:block;padding:4px 0 0;}
.autoscroller .scrollbar i b b{background-position:-18px 100%;padding:0 0 4px;}
.autoscroller .scrollbar i b b b{background-position:100% 50%;}
img
//require: jquery, drag, wheel
function fix_scrollers(){
var j = jQuery;
/*
.autoscroller
.scrollcon
.scrollbar
s
i
b
b
b*/
j('.autoscroller').each(function(idx, sc){
sc = j(sc);
var con = j('<div class="scrollcon"/>').appendTo(sc),
con0 = con[0];
con.append(sc.find('>*:first'));
var h = [sc[0].offsetHeight, con0.scrollHeight];
if(h[0] - h[1] >= 0)return;
var bar = j('<div class="scrollbar"></div>').appendTo(sc),
btn = bar.find('>i');
con.css('height', h[0] + 'px');
bar.css('height', h[0] + 'px');
bar.find('>s').css('height', h[0] + 'px');
j(j.dir(btn[0], 'firstChild').pop()).css('height', Math.max(0, (h[0] * h[0] / h[1]) - 8) + 'px');
var btnYA = [0, bar[0].offsetHeight - btn[0].offsetHeight];
var sRate = Math.min(1, btnYA[1] / (h[1] - h[0])),
wheelPH = -25 * sRate;
var drag_posY = null,
drag_top = null;
btn.bind('dragstart',function(ev){
drag_posY = ev.offsetY;
drag_top = parseInt(btn.css('top')) || 0;
})
.bind('drag',function(ev){
var offsetY = ev.offsetY - drag_posY;
var top = Math.max(btnYA[0], Math.min(btnYA[1], drag_top + offsetY));
this.style.top = top + 'px';
con0.scrollTop = top / sRate;
});
sc.mousewheel(function(ev, delta){
var btnTop = parseInt(btn.css('top')) || 0;
if((btnTop==btnYA[0] && delta > 0) || (btnTop==btnYA[1] && delta < 0))return true;
btnTop = Math.max(btnYA[0], Math.min(btnYA[1], btnTop + delta * wheelPH));
btn[0].style.top = btnTop + 'px';
con0.scrollTop = btnTop / sRate;
return false;
});
});
}