作者归档:Jacob Nie

初识python

image虽然几年前因为google app engine而接触过python,但毕竟没有深入的学习,所有的东西也仅限于google提供的示例;今天又是迫不得已使用python,一看,大爱!跟js有异曲同工这秒!

  • 可单步执行
    作为解释性脚本语言的代表,当然也支持单步调试与执行,就跟js使用firebug一样舒服,可能比那还要舒服;因为js要考虑浏览器的限制,而python不需要考虑这些,可以完全拥有整个系统;
  • 类bash的编程方式
    linux shell编程在服务器端大行其道,而windows的cmd被弱化的不能再被弱化了;基于脚本编程的方式这是我见到的第一例(听说perl也是这样一种语法,没使用过);不需要其他复杂的环境,三两行代码就能完成复杂与重复的功能,真是控制系统必不可少的工具啊!
  • 强大的B/S架构的解决方案
    python目前为止在建设B/S解决方案时不输于php,两者都是解释性语言,都有庞大的用户群
  • 大量服务厂商的支持
    google app engine推出的第一个语言版本就是python,简单,人类阅读的语言;相对于java版本,gae选择python绝对是明智的,而现在的java版本又非常难用;sina app engine使用php,使用较少,暂时不做评论;

昨天写了cmd窗口的难用,当时就有朋友给了我替代方案power cmd,相当给力,打造的windows下shell编程不输于linux。python跟power cmd更加如鱼得水;

浏览器本地存储——从新浪微博得到的启示

偶然间发现如果输入一句话到微博文本框中,即使不提交,也会被持久化——你关掉浏览器再打开,还看到你写的东西,即使你退回再登录也是能够看到你写的东西;

image

但是在cookie里面并不能找到这句话,这就推翻了我对浏览器本地化只能存储到cookie中的认识;那么我想会不会ajax已经同步到了后台,由于存储的速度是立即的,使用ajax就会跟后台代码频繁交互,会拖累整个系统,所以我认为没有,而监控的结果也证明了我的想法;如在chrome里面输入一句话,打开IE登录同样的账号后就不会看到那句话;说明这句话还是持久化到本地了;

image

后来分析新浪的代码,得知,除了cookie,新的html5本地存储支持的更多,如localStorage。而新浪代码中用了三种方式:localStroage, IE的userData和cookie;而在chrome下显示locaStorage,证实了我的想法;

image

代码如下:

//storage
App.storage = (function() {
var a = window.localStorage;
if (window.ActiveXObject) {
store = document.documentElement;
STORE_NAME = “localstorage”;
try {
store.addBehavior(“#default#userdata”);
store.save(STORE_NAME)
} catch(b) {}
return {
set: function(g, h) {
try {
store.setAttribute(g, h);
store.save(STORE_NAME)
} catch(j) {}
},
get: function(g) {
try {
store.load(STORE_NAME);
return store.getAttribute(g)
} catch(h) {
return “”
}
},
del: function(g) {
try {
store.removeAttribute(g);
store.save(STORE_NAME)
} catch(h) {}
}
}
} else {
if (a) {
return {
get: function(g) {
return a.getItem(g) == null ? null: unescape(a.getItem(g))
},
set: function(g, h, j) {
a.setItem(g, escape(h))
},
del: function(g) {
a.removeItem(g)
},
clear: function() {
a.clear()
},
getAll: function() {
var g = a.length,
j = null,
m = [];
for (var h = 0; h < g; h++) {
j = a.key(h),
m.push(j + “=” + this.getKey(j))
}
return m.join(“; “)
}
}
} else {
return {
get: function(n) {
var j = document.cookie.split(“; “),
h = j.length,
g = [];
for (var m = 0; m < h; m++) {
g = j[m].split(“=”);
if (n === g[0]) {
return unescape(g[1])
}
}
return null
},
set: function(g, h, j) {
if (! (j && typeof j === date)) {
j = new Date(),
j.setDate(j.getDate() + 1)
}
document.cookie = g + “=” + escape(h) + “; expires=” + j.toGMTString()
},
del: function(g) {
document.cookie = g + “=”; expires=Fri, 31 Dec 1999 23:59:59 GMT;”
},
clear: function() {
var j = document.cookie.split(“; “),
h = j.length,
g = [];
for (var m = 0; m < h; m++) {
g = j[m].split(“=”);
this.deleteKey(g[0])
}
},
getAll: function() {
return unescape(document.cookie.toString())
}
}
}
}
}

文本编辑器和最难用的编辑器-CMD

最近由于工作原因,经常需要调出cmd窗口,以往只觉得微软自带的Notepad已经够难用的了,没想到CMD窗口竟然超越了我的心理底线,更加难用;

Notepad难用,主要体现在不能高亮显示代码,双击选中文字太不智能化,不能多标签显示,大文本搜索效率底下,功能欠缺(如不支持宏)等,于是我后来试了各种轻量级的文本编辑器,EditPlus, vim到后来的Notepad++。Notepad++是目前为止使用最多的一款文本编辑器,不仅高亮显示,还支持列编辑,括号配对,变量识别,快捷键注释等各种常用功能,一般对IDE没有什么要求的代码,我都会在Notepad++下面来完成;当然重量级的还有UltraEdit,也是一款很优秀的编辑器,但跟EditPlus一样,都是共享软件,虽然提供强大的编码功能,但对于我们这些习惯免费的人来说,升级更新都是一件麻烦事;

CMD这家伙以前在2000和XP的年代都使用过,那时还知道alt + enter全屏查看,记得当年学习c的时候,都是这样来运行自己的程序的;但到win7后,这个功能不能再使用了,如果你使用默认设计,窗口的宽度是固定的,显示不下的时候,就会帮你按行,你如果要复制一行已经被换行文字其中的一部分,是相当麻烦的,特别是这段文字跨多行的时候;不能全屏不说,这个窗口连最大化都没有,你最大的时候只是把窗口的位置定位到(0,0)的地方,呵呵,让你哭笑不得;有时候我在想,为什么这么难用的一个样子还能让他存在这么久呢?微软再没有审美,也要把这块好好做做,看人家linux,多么强调shell编程,而微软好像一直在弱化这块本来的根基;

目前为止,我们使用一些command都还要用到这个丑陋的家伙,没办法,自好自己调整一下,不至于让我们用的窝火;可以在控制台窗口属性栏中,规定一下缓冲区的大小,因为这决定了一行显示多少个字符换行,建议把它设置的大一些,而初始化窗口的大小可以稍微小一些,我们也没有必要使用最大化按钮,因为那基本上没什么作用;设置好以后,就可以在设置的范围内拖动窗口的宽度了,如果你设置的够大,就不再怕文字换行了;当然有大段文字的时候,这种情况还是不可避免的;

image

微软一直弱化命令窗口的行为有时候让人看不懂,我现在的cmd命令已经少得可怜了,当然微软又推出了Powershell来补充这项功能,但毕竟不是默认安装的,推广力度也不太,在程序员中知晓度也不高,这也是现在大部分服务器不再使用windows的原因之一吧

分享工具栏分析

有时候自己想说能够写任何能够实现的效果,但自己写代码最终的结果是费时费力;好处也是易见的,能够自己控制代码,清楚代码格式;

今天一是由于时间太急,二是别人已经找到了一个效果,需要在此基础上做一些调整,然后再加个新的工具栏,于是就想在其基础上修改,颇费了一番功夫,最终的结果也是差强人意……

js代码的压缩我有一定的了解,但像这种压缩方式目前为止只是见过,具体怎么样实现的还真不是太知道;不知道怎么实现压缩的不要紧,关键是能不能恢复成一个可以理解的方式,这个时候chrome的控制台就发挥了其作用;

image

注意看下面这句,eval要的是一个字符器,那么其function返回的p也就是相应的字符器,如果把第一个function返回的字符串提取出来则就是我们想要的东西,将eval后面的所有代码拷贝到chrome的控制台执行,得到我们认可的压缩代码;

image

然后去http://www.css88.com/tool/js_beautify/ 把压缩的代码格式化一下就可以得到如下代码,下面的代码就可以看的懂了,虽然变量还是abcd这些字母来代替,并且可以手动修改了。

他的代码可以学习的地方有如下几个:

  • 代码压缩
    他们的代码压缩方式是我经常见到但又不知道怎么去弄的方式,把关键字都提取到数组中去了,这样的解码难度确实高了不少
  • 良好的代码风格
    里面的所有私有成员都以“_”开头,一目了然
  • 代码配置化
    有自己的数据配置方式,在不改动代码的方式下实现灵活改变

但也有很大的问题在里面,这也是造成我后面扩展困难,不得不重新复制出另一套代码:

  • 全局执行方式
    现在成熟的写法很少进行全局执行,而它的所有js文件都是全局执行
  • 没有对多侧边栏进行考虑
    也许他们本就不需要考虑多个边栏,所以就没有做这方面的考虑
  • 多js加载,虽然实现了一个js里面加载多个其他js,但也造成了速度慢的等问题;
  • 可定制化差;无论从排序还是图标,都没有让人可定制化的地方

if (!window._jiathis_r) {
    var JIATHIS_CONFIGS = {
        webhost: "http://www.jiathis.com",
        lhost: "http://l.jiathis.com",
        codehost: "",
        sc: true,
        uid: 0,
        type: "right",
        move: 1,
        btn: "",
        ckprefix: "jt_",
        jtcbk: "jtss",
        jtck: "",
        custom: [],
        servicelist: {
            ‘jt_ishare’: ‘一键分享,yjfx’,
            ‘jt_copy’: ‘复制网址,fzwz’,
            ‘jt_fav’: ‘收藏夹,scj’,
            ‘jt_print’: ‘打印,dy’,
            ‘jt_email’: ‘邮件,yj’,
            ‘jt_qzone’: ‘QQ空间,qqkj,sns.qzone.qq.com’,
            ‘jt_tsina’: ‘新浪微博,xlwb,weibo.com’,
            ‘jt_tqq’: ‘腾讯微博,txwb,t.qq.com’,
            ‘jt_tsohu’: ‘搜狐微博,shwb,t.sohu.com’,
            ‘jt_t163’: ‘网易微博,wywb,t.163.com’,
            ‘jt_renren’: ‘人人网,rrw,www.renren.com’,
            ‘jt_kaixin001’: ‘开心网,kxw,www.kaixin001.com’,
            ‘jt_sohu’: ‘搜狐白社会,shbsh,bai.sohu.com’,
            ‘jt_taobao’: ‘淘江湖,tjh,i.taobao.com’,
            ‘jt_douban’: ‘豆瓣,db,www.douban.com’,
            ‘jt_xiaoyou’: ‘朋友网,pyw,share.pengyou.com’,
            ‘jt_mop’: ‘猫扑推客,mptk,tk.mop.com’,
            ‘jt_baidu’: ‘百度搜藏,bdsc,cang.baidu.com’,
            ‘jt_tieba’: ‘百度贴吧,bdtb,tieba.baidu.com’,
            ‘jt_tianya’: ‘天涯社区,tysq,my.tianya.cn’,
            ‘jt_feixin’: ‘飞信,fx,space.feixin.10086.cn’,
            ‘jt_qu1’: ‘趣一网,qyw,www.qu1.com’,
            ‘jt_tifeng’: ‘凤凰微博,fhwb,t.ifeng.com’,
            ‘jt_youshi’: ‘优士网,ysw,www.ushi.cn’,
            ‘jt_fanfou’: ‘饭否,ff,fanfou.com’,
            ‘jt_51′: ’51社区,51sq,home.51.com’,
            ‘jt_google’: ‘谷歌,gg’,
            ‘jt_buzz’: ‘谷歌Buzz,ggbuzz’,
            ‘jt_youdao’: ‘有道书签,ydsq,shuqian.youdao.com’,
            ‘jt_qq’: ‘QQ书签,qqsq,shuqian.qq.com’,
            ‘jt_msn’: ‘MSN,msn’,
            ‘jt_sina’: ‘新浪vivi,xlvivi,vivi.sina.com.cn’,
            ‘jt_huaban’: ‘花瓣网,hbw,huaban.com’,
            ‘jt_ifensi’: ‘粉丝网,fsw,cyworld.ifensi.com’,
            ‘jt_115’: ‘115收藏,115sc’,
            ‘jt_hi’: ‘百度空间,bdkj,apps.hi.baidu.com’,
            ‘jt_gmail’: ‘Gmail邮箱,gmailyx,mail.google.com’,
            ‘jt_hotmail’: ‘Hotmail邮箱,hotmailyx’,
            ‘jt_ymail’: ‘Yahoo! mail,yahoo! mail’,
            ‘jt_hexun’: ‘和讯,hx,bookmark.hexun.com’,
            ‘jt_139mail’: ‘139邮箱,139yx’,
            ‘jt_189mail’: ‘189邮箱,189yx’,
            ‘jt_i139’: ‘手机,sj’,
            ‘jt_189cn’: ‘天翼社区,tysq,club.189.cn’,
            ‘jt_139’: ‘139说客,139sk,shequ.10086.cn’,
            ‘jt_tpeople’: ‘人民微博,rmwb,t.people.com.cn’,
            ‘jt_cnfol’: ‘中金微博,zjwb’,
            ‘jt_googlereader’: ‘谷歌阅读,ggyd’,
            ‘jt_translate’: ‘谷歌翻译,ggfy’,
            ‘jt_tuita’: ‘推他,tt,www.tuita.com’,
            ‘jt_sdonote’: ‘麦库记事,mkjs’,
            ‘jt_digu’: ‘嘀咕网,dgw,digu.com’,
            ‘jt_zhuaxia’: ‘抓虾,zx’,
            ‘jt_xianguo’: ‘鲜果,xg’,
            ‘jt_zuosa’: ‘做啥,zs,zuosa.com’,
            ‘jt_ganniu’: ‘赶牛网,gnw,www.ganniu.com’,
            ‘jt_42qu’: ’42区,42q’,
            ‘jt_miliao’: ‘米聊,ml’,
            ‘jt_woshao’: ‘我烧网,wsw,woshao.com’,
            ‘jt_qingsina’: ‘新浪轻博,xlqb,qing.weibo.com’,
            ‘jt_chinanews’: ‘中新网,zxw’,
            ‘jt_gmw’: ‘光明网,gmw’,
            ‘jt_renjian’: ‘人间网,rjw,renjian.com’,
            ‘jt_leihou’: ‘雷猴网,lhw,leihou.com’,
            ‘jt_thexun’: ‘和讯微博,hxwb,t.hexun.com’,
            ‘jt_dream163’: ‘梦幻人生,mhrs,dream.163.com’,
            ‘jt_masar’: ‘玛撒网,msw’,
            ‘jt_renmaiku’: ‘人脉库,rmk,www.renmaiku.com’,
            ‘jt_fb’: ‘Facebook,facebook,www.facebook.com’,
            ‘jt_twitter’: ‘Twitter,twitter,t.co’,
            ‘jt_tumblr’: ‘Tumblr,tumblr,www.tumblr.com’,
            ‘jt_reddit’: ‘Reddit,reddit’,
            ‘jt_instapaper’: ‘Instapaper,instapaper,www.instapaper.com’,
            ‘jt_readitlater’: ‘Read It Later,readitlater,readitlaterlist.com’,
            ‘jt_diglog’: ‘奇客发现,qkfx,www.diglog.com’,
            ‘jt_wealink’: ‘若邻网,rlw’,
            ‘jt_bietiao’: ‘别挑,bt,i.bietiao.com’,
            ‘jt_leshou’: ‘乐收,ls,site.leshou.com’,
            ‘jt_myspacecn’: ‘聚友网,jyw,blog.myspace.cn’,
            ‘jt_tongxue’: ‘同学网,txw’,
            ‘jt_waakee’: ‘挖客网,wkw’,
            ‘jt_cyzone’: ‘创业邦,cyb,u.cyzone.cn’,
            ‘jt_99earth’: ‘救救地球,jjdq’,
            ‘jt_chouti’: ‘抽屉网,ctw’,
            ‘jt_dig24’: ‘递客网,dkw,www.dig24.cn’,
            ‘jt_douban9dian’: ‘豆瓣9点,db9d,9.douban.com’,
            ‘jt_hemidemi’: ‘黑米书签,hmsq,www.hemidemi.com’,
            ‘jt_meilishuo’: ‘美丽说,mls’,
            ‘jt_mogujie’: ‘蘑菇街,mgj,mogujie.cn’,
            ‘jt_tianji’: ‘天际网,tjw,app.tianji.com’,
            ‘jt_poco’: ‘Poco网,pocow,my.poco.cn’,
            ‘jt_baohe’: ‘宝盒网,bhw,www.baohe.com’,
            ‘jt_yijee’: ‘易集网,yjw,www.yijee.com’,
            ‘jt_pdfonline’: ‘Pdf在线转换,pdfzxzh’,
            ‘jt_printfriendly’: ‘友好打印,yhdy’,
            ‘jt_w3c’: ‘W3c验证,w3cyz’,
            ‘jt_bitly’: ‘Bit.ly,bitly,bit.ly’,
            ‘jt_digg’: ‘Digg,digg,digg.com’,
            ‘jt_mailru’: ‘Mail.ru,mail.ru’,
            ‘jt_diigo’: ‘Diigo,diigo’,
            ‘jt_evernote’: ‘EverNote,evernote’,
            ‘jt_friendfeed’: ‘FriendFeed,friendfeed’,
            ‘jt_myspace’: ‘Myspace,myspace’,
            ‘jt_linkedin’: ‘LinkedIn,linkedin’,
            ‘jt_mixx’: ‘Mixx,mixx’,
            ‘jt_netlog’: ‘NetLog,netlog’,
            ‘jt_netvibes’: ‘Netvibes,netvibes’,
            ‘jt_phonefavs’: ‘Phonefavs,phonefavs’,
            ‘jt_pingfm’: ‘Ping.fm,ping.fm’,
            ‘jt_plaxo’: ‘Plaxo,plaxo’,
            ‘jt_delicious’: ‘Delicious,delicious,www.delicious.com’,
            ‘jt_wong’: ‘Mister Wong,misterwong’,
            ‘jt_stumbleupon’: ‘Stumbleupon,stumbleupon’,
            ‘jt_plurk’: ‘Plurk,plurk’,
            ‘jt_funp’: ‘Funp,funp’,
            ‘jt_myshare’: ‘Myshare,myshare’,
            ‘jt_fwisp’: ‘Fwisp,fwisp’
        }
    };
    (function() {
        try {
            var g = jiathis_config || {}
        } catch(e) {
            var g = {}
        };
        var j = document.getElementsByTagName(‘script’);
        for (var i = 0, ci; ci = j[i++];) {
            if (/jiathis/.test(ci.src)) {
                JIATHIS_CONFIGS.codehost = ci.src.substring(0, ci.src.lastIndexOf("/"));
                ci.src.replace(/(type|btn|move|uid)=([^&]+)/g,
                function(a, p, v) {
                    JIATHIS_CONFIGS[p] = v
                })
            }
        }
        var d = document,
        isStrict = d.compatMode == "CSS1Compat",
        dd = d.documentElement,
        db = d.body,
        m = Math.max,
        na = navigator.userAgent.toLowerCase(),
        ie = !!d.all,
        head = d.getElementsByTagName(‘head’)[0] || dd,
        wlh = window.location.host,
        _imgw = typeof(g.imageWidth) == "number" ? g.imageWidth: 26,
        _ckpre = JIATHIS_CONFIGS.ckprefix,
        _lists = JIATHIS_CONFIGS.servicelist,
        _ref = d.referrer,
        _reced = false,
        _mt = typeof(g.marginTop) == "number" ? g.marginTop: 150,
        getWH = function() {
            return {
                h: (isStrict ? dd: db).clientHeight,
                w: (isStrict ? dd: db).clientWidth
            }
        },
        getS = function() {
            return {
                t: m(dd.scrollTop, db.scrollTop),
                l: m(dd.scrollLeft, db.scrollLeft)
            }
        },
        creElm = function(o, t, a) {
            var b = d.createElement(t || ‘div’);
            for (var p in o) {
                p == ‘style’ ? b[p].cssText = o[p] : b[p] = o[p]
            }
            return (a || db).insertBefore(b, (a || db).firstChild)
        },
        _sc = function(a, b, c) {
            var d = new Date();
            d.setTime(d.getTime() + c * 1000);
            document.cookie = a + "=" + escape(b) + (c ? ";expires=" + d.toGMTString() : "") + ";path=/"
        },
        _gc = function(a) {
            var b = document.cookie;
            var c = b.indexOf(a + "=");
            if (c != -1) {
                c += a.length + 1;
                var d = b.indexOf(";", c);
                if (d == -1) {
                    d = b.length
                }
                return unescape(b.substring(c, d))
            }
            return ""
        },
        _rec = function(e) {
            if (!_reced) {
                if ( !! e.origin && e.origin.slice( – 12) == ".jiathis.com") {
                    if (e.data && e.data != "FALSE") {
                        JIATHIS_CONFIGS.jtck = e.data
                    }
                }
                _req();
                _reced = true
            }
        },
        _custom = function() {
            try {
                var a = jiathis_config || {}
            } catch(e) {
                var a = {}
            };
            var u = a.services_custom;
            if (u) {
                if (! (u instanceof Array)) {
                    u = [u]
                }
                for (var b = 0; b < u.length; b++) {
                    var c = u[b];
                    if (c.name && c.icon && c.url) {
                        c.code = c.url = c.url.replace(/ /g, "");
                        c.code = c.code.split("//").pop().split("?").shift().split("/").shift().toLowerCase();
                        JIATHIS_CONFIGS.custom[c.code] = c;
                        JIATHIS_CONFIGS.servicelist[_ckpre + c.code] = c.name + ‘,’ + c.code + ‘,’ + c.code
                    }
                }
            }
        },
        _req = function() {
            try {
                var a = jiathis_config || {}
            } catch(e) {
                var a = {}
            };
            var b = a.shareImg || {};
            b.showType && creElm({
                src: JIATHIS_CONFIGS.codehost + "/plugin.shareimg.js",
                charset: "utf-8"
            },
            "script", head);
            var c, s, E = encodeURIComponent,
            o = _grf(_ref),
            T = document.title || "",
            Y = window.location.href || "",
            an = Y ? Y.indexOf(JIATHIS_CONFIGS.jtcbk) : -1,
            d1 = _gd(o.host),
            d2 = _gd(Y),
            q = null,
            f = (d1 && d2 && d1 == d2) ? false: true;
            if (an > -1) {
                c = Y.substr(an);
                q = c.split("#").pop().split("-").pop().split("=").pop();
                q = _lists[_ckpre + q] ? q: ”
            }
            q = (!q && o.webid) ? o.webid: q;
            if (q && f) {
                s = ‘rsc=’ + q + ‘&rnm=’ + parseInt(JIATHIS_CONFIGS.uid) + ‘&rfh=’ + E(o.host) + ‘&rfp=’ + E(o.path) + ‘&pre=’ + E(Y) + ‘&tit=’ + escape(T);
                (new Image).src = JIATHIS_CONFIGS.lhost + "/l.gif?" + s
            }
        },
        _gd = function(o) {
            var d = null;
            if (o) {
                d = o.split(".").slice( – 2).join(".");
                d = (d == "com.cn") ? o.split(".").slice( – 3).join(".") : d;
                d = d.split("/").shift()
            }
            return d
        },
        _grf = function(r) {
            var h = "",
            p = "",
            q = "",
            m;
            if (r.match(/(?:[a-z]\:\/\/)([^\/\?]+)(.*)/gi)) {
                h = RegExp.$1;
                p = RegExp.$2;
                h = h ? h: "";
                p = p ? p: "";
                if (h) {
                    for (var k in _lists) {
                        m = _lists[k].split(‘,’);
                        if (m[2] && m[2] == h) {
                            q = k.slice(3);
                            break
                        }
                    }
                }
            }
            return {
                host: h,
                path: p,
                webid: q
            }
        },
        jiathis_utility_ifr = !!window.postMessage ? creElm({
            style: "display:none;",
            frameBorder: 0,
            src: JIATHIS_CONFIGS.codehost + "/jiathis_utility.html"
        },
        "iframe") : null,
        div,
        div1 = creElm({
            id: ‘ckepop’,
            style: "height:auto;position:absolute;z-index:100000000;display:none;top:50%;left:50%;overflow:auto;"
        }),
        inputTimer,
        list,
        clist,
        as,
        texts = {},
        script,
        timerover,
        timerout,
        timerloop,
        loop = function() {
            var t = 1000,
            st = getS().t,
            c,
            c = st – div.offsetTop + _mt;
            c != 0 && (div.style.top = div.offsetTop + c / 10 + ‘px’, t = 10);
            timerloop = setTimeout(loop, t)
        },
        iframe = creElm({
            style: ‘position:’ + (/firefox/.test(na) ? ‘fixed’: ‘absolute’) + ‘;display:none;’,
            frameBorder: 0
        },
        ‘iframe’),
        dsp = (_gc("jiathis_off") == ‘yes’) ? ‘display:none;’: ”,
        rpic = g.imageUrl || (JIATHIS_CONFIGS.codehost + "/images/" + (JIATHIS_CONFIGS.btn || ‘r.gif’)),
        lpic = g.imageUrl || (JIATHIS_CONFIGS.codehost + "/images/" + (JIATHIS_CONFIGS.btn || ‘l.gif’)),
        hidemore = g.hideMore || false,
        ckjs = hidemore ? "": " onclick=’$CKE.center(this)’",
        flag = ((!isStrict && /msie /i.test(na)) || (JIATHIS_CONFIGS.move == 1 || /msie 6/i.test(na)));
        div = creElm({
            id: ‘ckepop’,
            style: dsp + "height:auto;position:" + (flag ? ‘absolute’: ‘fixed’) + ";z-index:100000000;top:" + (flag ? ‘0’: _mt + ‘px’) + ";" + (JIATHIS_CONFIGS.type == ‘right’ ? "right:0;overflow:hidden;width:" + _imgw + "px;": "left:-242px;overflow:auto;"),
            innerHTML: JIATHIS_CONFIGS.type == ‘right’ ? "<table cellPadding=0 cellSpacing=0><tbody style=’background:transparent’><tr><td style=’background:transparent’><img src=’" + rpic + "’ style=’cursor:pointer;’ onmouseover=’$CKE.over()’" + ckjs + " /></td><td><div></div></td></tr></tbody></table>": "<table cellPadding=0 cellSpacing=0><tbody style=’background:transparent’><tr><td><div></div></td><td><img src=’" + lpic + "’ style=’cursor:pointer;’ onmouseover=’$CKE.over()’" + ckjs + " /></td></tr></tbody></table>"
        });
        window._jiathis_r = div;
        _custom();
        creElm({
            href: JIATHIS_CONFIGS.codehost + ‘/css/jiathis_share.css’,
            rel: ‘stylesheet’,
            type: ‘text/css’
        },
        ‘link’);
        d.write(‘<script src="’ + JIATHIS_CONFIGS.codehost + ‘/ckepop.js" charset="utf-8"></script><script src="’ + JIATHIS_CONFIGS.codehost + ‘/ckecenterpop.js" charset="utf-8"></script>’);
        $CKE = {
            sers: "",
            pop: div.getElementsByTagName(‘div’)[0],
            centerpop: div1,
            disappear: function(a) {
                var b = window.event || a,
                t = b.srcElement || b.target,
                contain = div1.contains ? div1.contains(t) : !!(div1.compareDocumentPosition(t) & 16),
                contain1 = div.contains ? div.contains(t) : !!(div.compareDocumentPosition(t) & 16);
                if (!contain && !contain1) {
                    iframe.style.display = div1.style.display = ‘none’
                }
            },
            over: JIATHIS_CONFIGS.type == ‘right’ ?
            function() {
                if (div.offsetWidth > _imgw) {
                    return
                }
                clearTimeout(timerloop);
                clearInterval(timerout);
                div.style.cssText += ";width:" + _imgw + "px;left:" + (getWH() – _imgw) + "px";
                var t = 10,
                tmp = 0,
                step = this.pop.offsetWidth / 55;
                timerover = setInterval(function() {
                    if (t == 0) {
                        clearInterval(timerover);
                        flag && loop()
                    } else {
                        var n = Math.round(step * t–);
                        div.style.left = div.offsetLeft – n + ‘px’;
                        div.style.width = div.offsetWidth + n + ‘px’
                    }
                    div.style.zIndex = 100000000
                },
                10)
            }: function() {
                clearTimeout(timerloop);
                clearInterval(timerout);
                clearInterval(timerover);
                var t = 10,
                tmp = 0,
                step = Math.abs(div.offsetLeft / 55);
                timerover = setInterval(function() {
                    if (t == 0) {
                        clearInterval(timerover);
                        flag && loop()
                    } else {
                        var n = Math.round(step * t–);
                        div.style.left = div.offsetLeft + n + ‘px’
                    }
                    div.style.zIndex = 100000000
                },
                10)
            },
            out: JIATHIS_CONFIGS.type == ‘right’ ?
            function() {
                $CKE.cancelClose();
                if (div.offsetWidth > $CKE.pop.offsetWidth) {
                    clearInterval(timerover);
                    clearTimeout(timerloop);
                    div.style.cssText += ";width:" + ($CKE.pop.offsetWidth + _imgw) + "px;left:" + (getWH() – _imgw – $CKE.pop.offsetWidth) + "px";
                    var t = 10,
                    tmp = 0,
                    step = (div.offsetWidth – _imgw) / 55;
                    timerout = setInterval(function() {
                        if (t == 0) {
                            clearInterval(timerout);
                            div.style.left = ”;
                            flag && loop()
                        } else {
                            var n = Math.round(step * t–);
                            div.style.width = div.offsetWidth – n < _imgw ? _imgw: div.offsetWidth – n + ‘px’;
                            div.style.left = div.offsetLeft + n + ‘px’
                        }
                        div.style.zIndex = 100000000
                    },
                    10)
                }
            }: function() {
                $CKE.cancelClose();
                clearInterval(timerover);
                clearInterval(timerout);
                clearTimeout(timerloop);
                var t = 10,
                tmp = 0,
                step = Math.abs((div.offsetLeft + 242) / 55);
                timerout = setInterval(function() {
                    if (t == 0) {
                        clearInterval(timerout);
                        div.style.left = ‘-242px’;
                        flag && loop()
                    } else {
                        var n = Math.round(step * t–);
                        div.style.left = div.offsetLeft – n + ‘px’
                    }
                    div.style.zIndex = 100000000
                },
                10)
            },
            center: function(a) {
                if (a) {
                    db.style.position = ‘static’;
                    var b = getS();
                    div1.style.display = "block";
                    div1.style.margin = ( – div1.offsetHeight / 2 + b.t) + "px " + ( – div1.offsetWidth / 2 + b.l) + "px";
                    list = d.getElementById(‘ckelist’);
                    clist = list.cloneNode(true);
                    as = clist.getElementsByTagName(‘input’);
                    for (var i = 0, ci; ci = as[i++];) {
                        texts[ci.value] = ci.parentNode
                    }
                    with(iframe.style) {
                        left = top = ‘50%’;
                        width = div1.offsetWidth + ‘px’;
                        height = div1.offsetHeight + ‘px’;
                        margin = div1.style.margin;
                        display = ‘block’
                    }
                }
            },
            choose: function(o) {
                clearTimeout(inputTimer);
                inputTimer = setTimeout(function() {
                    var s = o.value.replace(/^\s+|\s+$/, ”),
                    frag = d.createDocumentFragment();
                    for (var p in texts) {
                        eval("var f = /" + (s || ‘.’) + "/ig.test(p)"); !! texts[p].cloneNode && (f && frag.appendChild(texts[p].cloneNode(true)))
                    }
                    list.innerHTML = ”;
                    list.appendChild(frag)
                },
                100)
            },
            centerClose: function() {
                iframe.style.display = div1.style.display = ‘none’
            },
            shareClose: function() {
                var a = d.getElementById("jiathis_sers");
                if (a) {
                    if (!$CKE.sers) {
                        $CKE.sers = a.innerHTML
                    }
                    var b = ‘<div style="margin:10px 5px 10px 10px;font-size:14px;">’;
                    b += ‘<p style="font-weight:normal;margin-bottom:10px;">关闭分享按钮?</p>’;
                    b += ‘<p style="color:#666;font-size:12px;font-weight:normal;margin-bottom:10px;">关闭后,该分享按钮将不再出现,您也无法使用分享到功能,确定吗?</p>’;
                    b += ‘<p style="background:none repeat scroll 0 0 #FEFFDB;border:1px solid #FFDDB3;padding:10px 15px;width:185px;"><a href="javascript:;" onclick="$CKE.doClose();return false;"><u style="font-weight:normal;">确定</u></a>&nbsp;&nbsp;<a href="javascript:;" onclick="$CKE.cancelClose();return false;"><u style="font-weight:normal;">取消</u></a></p>’;
                    b += ‘</div>’;
                    a.innerHTML = b
                }
            },
            doClose: function() {
                iframe.style.display = div1.style.display = div.style.display = ‘none’;
                _sc("jiathis_off", "yes", 86400)
            },
            cancelClose: function() {
                var a = d.getElementById("jiathis_sers");
                if ($CKE.sers && a) {
                    a.innerHTML = $CKE.sers;
                    $CKE.sers = ”
                }
            },
            open: function(A) {
                creElm({
                    src: A,
                    charset: "utf-8"
                },
                "script", head)
            },
            fireEvent: function(F, O) {
                if (F) {
                    F = typeof(F) == "function" ? F: eval(F);
                    F(O)
                }
            }
        };
        if ( !! window.addEventListener) { !! window.addEventListener && window.addEventListener("message", _rec, false)
        } else {
            if ( !! window.postMessage) { ( !! window.attachEvent && window.attachEvent("onmessage", _rec))
            } else {
                _req()
            }
        }
        if (ie) {
            div.onmouseleave = $CKE.out;
            d.attachEvent("onclick", $CKE.disappear)
        } else {
            div.onmouseout = function(e) {
                try {
                    var p = (this.compareDocumentPosition(e.relatedTarget) == 20)
                } catch(e) {
                    var p = false
                }; ! (this === e.relatedTarget || (this.contains ? this.contains(e.relatedTarget) : p)) && $CKE.out.call(this)
            };
            d.addEventListener("click", $CKE.disappear, false)
        };
        flag && loop()
    })();
    function jiathis_sendto(a) {
        try {
            var b = jiathis_config || {}
        } catch(e) {
            var b = {}
        };
        var c = encodeURIComponent,
        cu = JIATHIS_CONFIGS.custom[a] || {},
        U = String(b.url || document.location),
        W = "?webid=" + a,
        G = "&url=" + c(U),
        T = "&title=" + c(b.title || document.title),
        S = b.summary ? "&summary=" + c(b.summary) : "",
        F = JIATHIS_CONFIGS.uid ? "&uid=" + parseInt(JIATHIS_CONFIGS.uid) : "",
        E = b.data_track_clickback ? "&jtss=1": "",
        K = (b.appkey && b.appkey[a]) ? "&appkey=" + b.appkey[a] : "",
        P = b.pic ? "&pic=" + c(b.pic) : "",
        R = (b.ralateuid && b.ralateuid[a]) ? "&ralateuid=" + b.ralateuid[a] : "",
        Q = (b.evt && b.evt[‘share’]) ? b.evt[‘share’] : null,
        A = ‘http://s.jiathis.com/’,
        X = (cu.name && cu.url) ? "&acn=" + c(cu.name) + "&acu=" + c(cu.url) : "",
        B = A + W + G + T + F + E + K + P + R + S + X;
        if (a == ‘copy’ || a == ‘fav’ || a == ‘print’) {
            $CKE.open(B);
            if (a == ‘copy’) {
                jiathis_copyUrl()
            } else if (a == ‘fav’) {
                jiathis_addBookmark()
            } else {
                window.print()
            }
        } else {
            window.open(B, ”)
        }
        $CKE.fireEvent(Q, {
            type: ‘share’,
            data: {
                service: a,
                url: U
            }
        });
        return false
    }
    function jiathis_addBookmark() {
        try {
            var d = jiathis_config || {}
        } catch(e) {
            var d = {}
        };
        var a = d.title || document.title;
        var b = d.url || parent.location.href;
        var c = window.sidebar;
        if (c && !!c.addPanel) {
            c.addPanel(a, b, "")
        } else if (document.all) {
            window.external.AddFavorite(b, a)
        } else {
            alert(‘请按 Ctrl + D 为你的浏览器添加书签!’)
        }
    }
    function jiathis_copyUrl() {
        try {
            var d = jiathis_config || {}
        } catch(e) {
            var d = {}
        };
        var a = d.url || this.location.href;
        var b = d.title || document.title;
        var c = b + " " + a;
        var f = navigator.userAgent.toLowerCase();
        var g = f.indexOf(‘opera’) != -1 && opera.version();
        var h = (f.indexOf(‘msie’) != -1 && !g) && f.substr(f.indexOf(‘msie’) + 5, 3);
        if (h) {
            clipboardData.setData(‘Text’, c);
            alert("复制成功,请粘贴到你的QQ/MSN上推荐给你的好友!")
        } else if (prompt(‘你使用的是非IE核心浏览器,请按下 Ctrl+C 复制代码到剪贴板’, c)) {
            alert(‘复制成功,请粘贴到你的QQ/MSN上推荐给你的好友!’)
        } else {
            alert(‘目前只支持IE,请复制地址栏URL,推荐给你的QQ/MSN好友!’)
        }
    }
}

java编译总结

环境配置
java_home           c:\Program Files\Java\jdk1.6.0\
classpath             %java_home%\lib\tools.jar;.;
path                    %java_home%\bin;

命令编译
javac -d . *.java //按包编译
java com.wondersgroup.Test //带包名执行
java -classpath D:\class12.jar; com.wondersgroup.Test //引入其他包执行

在我的备忘记录里面一直保存着这样的几个用法,当然我们谈论的都是windows的用法;今天在学习sphinx中java示例代码的时候,又有新的发现,更加自动的生成jar文件和更加自动的生成javadoc的方法,非常的简单,将代码贴在下面分析:

mk.cmd
@echo off
javac -cp . -d . *.java
jar cfm sphinxapi.jar MANIFEST.MF org/sphx/api

mkdoc.cmd
@javadoc *.java -d doc

其中javac –cp . –d . *.java跟我记录的java –classpath D:\class12.jar com.wondersgroup.Test中的classpath是一样的,只不过,这里是在编译阶段,将本包中的所有类作为classpath,带包名编译后放在本目录中;

jar cfm sphinxapi.jar MANIFEST.MF org/sphx/api最终目的是生成sphinxapi.jar;,其中已知条件是MANIFEST.MF和org/sphx/api,将其封装成sphinxapi.jar再执行;参数c表示创建新的归档文件;参数f指定归档文件名;m包含MANIFEST.MF;

MF文件如下(最后一行有回车):

Manifest-Version: 1.0
Main-Class: org.sphx.api.test

这样在执行的时候,就能找到入口地址了;jar包的执行方法

java –jar sphinx.jar test

最后一个test是作为参数传递给入口函数的;

当然,根据上次提到的服务,也可以把最后一条命令做成服务,且在开机时就启动;

Sphinx 学习2

接上篇,这样有个延续,对自己以后再看这些东西也会有个启发:

首先来看配置文件:1、sphinx.conf.in 2、sphinx.conf;这两个配置文件是一样的,在1中已经提到,sphinx.conf是由sphinx.conf.in拷贝过去的,对里面的相对路径进行了绝对化;同样在in中,也要对路径进行绝对化,不然不能记录日志,所注册的服务也不能正常启动;以下贴也修改后的配置文件

#
# Minimal Sphinx configuration sample (clean, simple, functional)
#

source src1
{
type            = mysql

sql_host        = localhost
sql_user        = root
sql_pass        = a123456
sql_db            = test
sql_port        = 3306    # optional, default is 3306

sql_query        = \
SELECT id, group_id, UNIX_TIMESTAMP(date_added) AS date_added, title, content \
FROM documents

sql_attr_uint        = group_id
sql_attr_timestamp    = date_added

sql_query_info        = SELECT * FROM documents WHERE id=$id
}

index test1
{
source            = src1
path            = F:/sphinx-2.0.3-win32/data/test1
docinfo            = extern
charset_type        = sbcs
}

index testrt
{
type            = rt
rt_mem_limit        = 32M

path            = F:/sphinx-2.0.3-win32/data/testrt
charset_type        = utf-8

rt_field        = title
rt_field        = content
rt_attr_uint        = gid
}

indexer
{
mem_limit        = 32M
}

searchd
{
listen            = 9312
listen            = 9306:mysql41
log            = F:/sphinx-2.0.3-win32/log/searchd.log
query_log        = F:/sphinx-2.0.3-win32/log/query.log
read_timeout        = 5
max_children        = 30
pid_file        = F:/sphinx-2.0.3-win32/log/searchd.pid
max_matches        = 1000
seamless_rotate        = 1
preopen_indexes        = 1
unlink_old        = 1
workers            = threads # for RT to work
}

 

接下来,再明白一个问题,下面这段代码是注册一个服务,服务的名称叫SphinxSearch,服务的命令就是searchd –config c:\Sphinx\sphinx.conf.in;查看服务就可以看到

F:\sphinx-2.0.3-win32\bin>searchd –install –config F:\sphinx-2.0.3-win32\bin\sphinx.conf.in –servicename SphinxSearch

image

既然windows服务可以注册,当然也可以删除,我在网上查了下,所有命令都在windows中的sc中

sc delete SphinxSearch

这样,在每次启动windows的时候,就可以自动启动SphinxSearch进程,进程端口9312,可以通过telnet命令测试启动是否成功

telnet localhost 9312

最后一步,使用代码测试是否可以使用,测试代码已经在api文件夹里了,里面有各种语言的测试demo,我们使用php文件来测试,把sphinxapi.php和test.php都拷贝到F:\wamp\bin\php\php5.3.5目录(如果设置了 php执行路径不需要这样做)执行下面的命令,并得到如下结果,则说明测试成功,进程已经在监控状态了

F:\wamp\bin\php\php5.3.5>php test.php test
Query ‘test ‘ retrieved 3 of 3 matches in 0.032 sec.
Query stats:
‘test’ found 5 times in 3 documents

Matches:
1. doc_id=1, weight=101, group_id=1, date_added=2012-01-13 05:47:21
2. doc_id=2, weight=101, group_id=1, date_added=2012-01-13 05:47:21
3. doc_id=4, weight=1, group_id=2, date_added=2012-01-13 05:47:21

最忐忑的旅行

今天应该从家里出发赶往上海,到目前为止一切还顺利,不过我需要从现在(2012年1月27日 19:03:47)商丘车站等待K154的到来,到达的时间大概是20:44;从家里到现在几经坎坷……

出发前几天,我已经在预算,要预留够的时间去赶火车。平时到开封的时间大概是2个小时,我想预留三个小时应该没什么问题。而我票面上的开车时间是18:20从郑州出发,到开封的时间约一个小时,于是我想,下午2点多3点钟出发应该没什么问题。于是,今天老妈要求我去大姨妈家,我也没有推脱,反正不吃他们家里的饭,到那里说会话就回来。

去的路上,一些路段非常的不好走,到了姨妈家,竟然还赶上了我的表兄弟,不吃饭总是说不过去。只好硬着头皮说我下午还要赶火车,然后匆匆吃了顿饭就赶了回来。到黄集加油站的时间是14:45左右。本来是从那里直接等到开封的车,但半个小时过去了,不但去开封的车一辆没有,连到庄砦的车都不在这里停,于是心里就有些着急了。关键的时候,还是黑车救了我,一辆不像是拉客的车,走到我的身边响起了喇叭,我就知道这辆车可以上了;花了我5大洋到了庄砦,就看到一辆到兰考开封的车。本来应该把心放下了,没想到的是,此时还不能让我轻松。我跟司机说了我去火车站,赶19:00的车,问能不能按时赶到,他竟然告诉我不一定!顿时让我惊讶!当时他们说发车时间是15:30,到19:00还有3个半小时呢,竟然赶不到开封火车站!后来我也不觉得怎么惊讶了,因为我上次坐他们这辆车到兰考火车站还走了两个小时呢,如果到兰考再停个半小时,19:00肯定赶不到了,而19点是我的最晚时间,我后来查到开封开车时间是19:05,就是说洗车必须在40分左右赶到我才能赶上火车,这样的话时间实现太紧了,非常忐忑要不要坐,坐不一定能赶上火车,不坐呢?还有没有其他的出路呢?

这时,我看到一辆去曹县的车,车上已经很多人了,我想离发车时间不远了,如果我能够直到商丘车站去,还有一个多小时的宽裕时间,但这条路我从来没走过,到底该怎么坐车,我也里也没底。再加上问司机什么时候发车,他永远不给一个准话,只说等下辆车来了就发车,当时大约是15:30;两辆车都还没有走,我还是坐在了去曹县的车上等待发车。15:40左右的时候,开往开封的那辆车启动了,而这辆到曹县的车还没任何动静,当时我真想冲出去跳上那辆车,因为现在时间是非常宝贵的啊,晚一分钟可能就要露宿街头了。但最终我还是没出去,一辆车已经走了,剩下来的只有等待,看这两车到底什么时候能发车;在前期选车的时候,我还问了一下大概到曹县的时间,他们都说大概要一个半小时,而曹县到商丘也大概要一个半小时;这还是中间换车等车的时间不算的情况下呢,这么说,如果车16:00发,那么我大概会在19:30到达商丘,这中间不能出什么问题,而根据当时推测的时间,K154到达商丘的时间应该在20:30左右,这样的时间还来的及。但前提是开往曹县的车16:00得发车,时间不能超过1个半小时才可以,开往商丘的车立马能找到,一个半小时能开往商丘;而这一切都只是假设,不坐过这辆车就不会知道要多长时间才能赶到。

15:50的时候,开往曹县的车终于发动了,我也终于松了一口气;但后面这辆车严重超载,其实也没办法,庄砦开往曹县的车实在太少,人都站在身边,就这样还有很多人一直往车上挤呢。前期基本上走走停停,人也上上下下,到中半段的时候,车上已经塞满了人,路上的人愿意放上挤的就让挤上去,不愿意挤的(如孕妇)就等下一班。所以后半段,停车的时间明显减少,车速也明显加快了。但我还是不放心,时时盯着网络导航,根据已走的里程数计算到达曹县的时间,因为根据这个时间,也能大概推算出曹县到达商丘的时间;不出意料,经过一个小时后,这辆车准时到达曹县,这样留给我的时间就又多了些,我这样想。下车后,我看车停的地方明显没什么客车,就问了一下售票员,果然,那里不是汽车总站,还要到长途汽车站坐车才可以;还好,周边就有一些小三轮,问一下去汽车站多少钱,坐上了去长途汽车的小三轮;在去汽车站的路上,我才发现,原来我已经来过曹县了,去年的时候,免费坐别人的车,就是从菏泽先到曹县,然后再出发去菏泽的。不久就到了长途车站,我一看还要排除买票?但经验告诉我,如果没人拦你,你可以先找到自己坐的车,然后再给钱,于是我一路直冲,进了停车厂,一遍一遍找着自己要坐的车,时间就是金钱啊。终于在最后一刻,看到了开往商丘的车,当时只剩下两个座位了,上车,占座,买票;再问一下出发时间,马上就走!OK,此时的时间是17:15左右,离开车还有很长时间,即使走三个小时,也还能按时赶到。从曹县到商丘速度很快,一个小时左右就到了,但不是火车站,还要换乘一辆公交,不过这些都比较淡定;

看到商丘火车站不那么淡定了,人山人海,完全颠覆了我对它的印象,只有两个候车厅,其余的还等在外面搭建的临时大棚里候车!里里外外都是人,我没办法,只好花了五元钱到了“茶室”,里面同样到处都是人,另外一个候车厅!不过还是有些空位置可以坐下;

坐下看了一下时间,才19:00,还有近两个小时的等待时间,再看一下手机,3G信号不错,于是打开了电脑,记录了一下自己目前所经历的内容

通知区不能显示网络图标

我们对windows了解还是太少了,所有遇到的问题都仅仅是从网上找到答案,也不知道是什么原因;今天又遇到了问题,开机后我的电脑不能显示网络连接了,然后打开或关闭系统图标“网络”是灰色关闭状态;于是网上搜索后得到如下代码

在运行里输入
reg delete HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\StuckRects2 /v Settings /f

image

 

image

在他们看起来简单的要死,但我现在还不理解是什么意思,等下有空了再来查一下是什么意思,以后再遇到这种问题就不会只知其然不知其所以然了

抢购火车票

现在说什么都爆弱了,拿到手3到4个程序,最好用的一个绝对是刷票的利器,配合chrome非常的好用;只可惜现在已经不是买票高峰期了,要测试还要再过几天才行。

在开始的时候,我一直想自己写点代码出来抢购火车票;现在的代码分为两种形式:一种是客户端软件;一种是各种浏览器插件(基于js完成的);就我个人而言,比较倾向于后者。加上我发现订票的系统是使用iframe来完成的,这样的情况下,我们很容易将自己的js注入到订票的页面,由于他不会刷新页面,所以整个订票流程只需要注入一次就可以了。

我的想法比较简单,开始的时候,我只想不要让自己的会话丢失。这个后来被证明还是很有用的,因为到开始抢票的时候,你不可能很轻松的登录进去;而我也只是靠这个买到了几张票。但后来抢深圳票的时候出现了问题——订单一直不能提交;开始的时候我没有什么好的办法,只能手动一遍一遍提交,但结果都是失败;后来我就想找一下现在网络上的一些解决方案,看了一些后,才知道,原来现在的订票网站登录验证码有一个bug,我们可以很轻松的绕过这个验证码。当然如果铁道部现在把这个bug给修补上,我们只能再从其他方面着手了;绕过验证码的好处不言而喻,我们不再需要手动一遍遍的查询车票的剩余信息,不需要手动一遍遍的提交订单,还出现各种报错的页面,而我们只需要做的是自动登录后,选后你的车次,剩下的订单提交就交给自动程序来帮你完成;当然最后的订单支付还是要你来的。

抢购火车票的软件肯定会越来越多,也会越来越好用,并且最终都将是免费的;我们要的仅仅是一张火车票……

sphinx安装流程

sphinx的windows安装确实有点令人费解;

1、下载安装包,我的是sphinx-2.0.3-win32.zip

2、解压到你想要的位置,如c:\sphinx

3、将example.sql导入到你的mysql;可以用命令,也可以使用界面;总之是你会使用的一个方法,生成两个表documents和tags

imageimage

4、修改sphinx.conf.in以便能连上你的mysql;主要是用户和密码两栏

image

5、安装你的sphinx

C:\Sphinx\bin> C:\Sphinx\bin\searchd --install --config C:\Sphinx\sphinx.conf.in --servicename SphinxSearch

6、建立索引,将sphinx-min.conf.in拷贝到bin目录下面,将数据库用户名密码修改,将路径修改成绝对路径

image

7、使用命令建立索引indexer --all

8、使用search查看索引是否创建成功search test