体验网络电话预订春运火车票,KC拨通率比手机高。

2010/01/31

  又到春节之时,归家的心情也是十分迫切,希望尽快与家人团聚。每当此时,都会唱起费翔《故乡的云》:归来吧!浪迹天涯的游子……
  春运的火车票,永远供不应求,今年既使有了武广专线,火车票还是一票难求。(今天春运时,武广可以提前预定10天的车票,平时,可以提前预定20天的车票。)
  每到订票前,都会找朋友商量如何预定火车票。交流过程中,朋友发给我一篇《订票热线-深圳2010年春运电话订票流程(攻略)》(深圳的朋友可以看一下),仔细一看,似乎象KC网络电话的软文。进入KC网络电话官网(http://www.keepc.com),关于如何预定车票的文章很多,如《快速使用KC网络电话订火车票》,写的真详细的。广告也是铺天盖地,宣传说可以订到火车票。于是乎,我就抱着一种试试的态度,看一下到底有没有那么灵验。然而充值后不久就出现网络故障(心中不禁汗一下),无法拨打电话,经过N久时间,终于恢复了。
  今天起个大早,开启床边的笔记本,左手拿起手机,右手拿着鼠标,蓄势待发,准备好好的拼一把。经过一段时间的测试,发现手机拨打时,直接就给我“结束通话”,没有一点机会。而网络电话,还会给我提示“线路正忙,请稍候再拨”,幻想着还有一丝希望。最终还是都订不到,呵呵,也许是RP不行。上午11时,用手机拨打订票号码,还是“结束通话”,而网络电话拨打,可以拨通,结果肯定是没有票。
  经过测试,也验证了网络电话确实比手机好一点,原因应该是网络电话使用的中国电信的线路(见KC主页下方,显示了“广东省电信增值业务经营许可证”),同一网络,所以拨通率比较高。在11点时,其他的网络电话也是差不多(如阿里通网络电话),在手机无法拨通时,都可以拨通订票电话。
  关于网络电话的话质部分,也是我需要重点关注的。我拨打订票电话时,话质很好,比较清晰,但是,如果拨打手机或固话,那可只能用一个差字来形容。我试用了KC,66call,阿里通等三款网络电话。先声明,我使用的网络是1M ADSL(当时只有我一人在上网),在深圳地区拨打湖南地区的手机,KC,66call两款软件的话质,实在不敢恭维,对方根本听不清我的声音,有时根本没有声音。而阿里通,对方可以听到声音,只是有些延迟,并且有时还有回音(开始有点怀念UUcall了)。在通话过程中,我可以听到对方的声音。我又试着使用KC拨打深圳本地手机时,话质一般,也会出现停顿的问题。呵呵,看来,我是不敢使用网络电话拨打朋友的手机了。
  虽然最终还是没有订到火车票,不过,自己也对网络电话有个大概的了解。谨记:网络电话有风险,使用需谨慎。

PS:
哎,手机是冒的指望了,我还是继续使用网络电话拨打电话,至少可以拨打订票电话,比手机好啊。^-^
订票热线-深圳2010年春运电话订票流程(攻略)

Tags:,,,, Posted in 活在当下2 条评论

UUCall 王者归来!2月4日立春之时。

2010/01/31

官网:http://www.uucall.com/
截图:

uucall归来

截图于 2010/1/31 13:35

Tags:, Posted in 休闲小站我抢沙发

看163读书频道,了解真实的蒙古国

2010/01/24

  习惯性的打开163,看看新闻、体育、科技、读书等频道,在读书频道看到一篇文章,题目是《蒙古国人如何看待自己的历史传承》,才明白自己的天真与无知,感慨!原来真相不是这样。
  文章中有一句让我记忆犹新的话:“想知道中国人在蒙古人的心里是什么位置吗?日本人在中国人心里是什么样,中国人在蒙古人心里就是什么样。”,这句话已经全面的诠释中国人在蒙古人的形象。
  本文只是抛砖引玉,希望大家有空也可以了解一下历史与现实。

  如今在蒙古国,中国人几乎涉足到了所有的商业领域。其中最主要集中在矿产与基础设施建设方面,以
至于很多蒙古人会抱怨说,中国人正在掠夺他们的资源,抢夺他们的饭碗。很多富裕起来的中国人在蒙古偏偏
又不注意自己的形象,将自身的恶劣品行带入蒙古。一些华侨向我反应,有些中国老板在当地一掷千金,随意
追求蒙古女人,在公共场合大声说话,这些都造成了极坏的影响。

  链接地址:http://history.book.163.com/10/0122/17/5TLAH1S7009243E2.html

Tags:,, Posted in 休闲小站我抢沙发

onbeforeunload事件在IE7/IE8中,导致Xheditor使用不正常

2009/12/31

  Xheditor(详情请查看《xhEditor在Firefox下不能删除文字的Bug及解决方案》)Web在线编辑器已经在网站的部分功能中使用很长时间了,一直都很稳定的,确实很好用,非常值得推荐。
  昨天将Xheditor嵌入到其他功能时,在此功能中我们使用了onbeforeunload事件(onbeforeunload事件是在刷新、关闭、离开此页面时触发),防止会员不小心操作而导致资料的丢失。然而在IE7下测试时,发现当我们单击Xheditor工具栏的按钮时,竟然响应了onbeforeunload事件,如图:
xeditor_onbeforeunload
  经过查看源代码,发现工具栏按钮的源代码A标签使用了javascript:;,用Firebug查看,如下图:
xeditor_firebug
  在IE7/IE8浏览器中,把javascript:;当做了一个页面,所以才会响应onbeforeunload事件。
  解决方案,使用#+onclick=”return false”方式,赶紧修改Xeditor代码,再次用Firebug查看,如图:
xeditor_firebug_ok
  一切搞定,上班铃声响起来了,开始一天的工作喽^-^

Tags:,, Posted in 前端技术我抢沙发

Sphinx实现Mysql LIKE “%word%”方式的模糊搜索

2009/11/28

  上个月的今天,网站Sphinx搜索引擎上线,目前观察Sphinx运行一切正常,整整一个月时间,可谓历经千辛万苦,终于终成正果。其间也遇到了种种问题,最后也都一一解决,目前正在开发关键字智能提示(Suggest)、关键字相似度提示等功能,更好的增强网站的搜索能力。
  今天我就与大家交流一下,如何实现Mysql LIKE的模糊搜索。由于Sphinx使用分词库后,我们就无法使用模糊搜索功能,然而模糊搜索对于我们来讲是必须要实现的,呵呵,Sphinx提供了一元分词Sphinx官网(贴子标题:full-text searching in Chinese document.)也给出相应的设置方法,如下:

        min_word_len            = 1
        charset_type            = utf-8
        charset_table = U+FF10..U+FF19->0..9, 0..9, U+FF41..U+FF5A->a..z, U+FF21..U+FF3A->a..z,\
        A..Z->a..z, a..z, U+0149, U+017F, U+0138, U+00DF, U+00FF, U+00C0..U+00D6->U+00E0..U+00F6,\
        U+00E0..U+00F6, U+00D8..U+00DE->U+00F8..U+00FE, U+00F8..U+00FE, U+0100->U+0101, U+0101,\
        U+0102->U+0103, U+0103, U+0104->U+0105, U+0105, U+0106->U+0107, U+0107, U+0108->U+0109,\
        U+0109, U+010A->U+010B, U+010B, U+010C->U+010D, U+010D, U+010E->U+010F, U+010F,\
        U+0110->U+0111, U+0111, U+0112->U+0113, U+0113, U+0114->U+0115, U+0115, \
        U+0116->U+0117,U+0117, U+0118->U+0119, U+0119, U+011A->U+011B, U+011B, U+011C->U+011D,\
        U+011D,U+011E->U+011F, U+011F, U+0130->U+0131, U+0131, U+0132->U+0133, U+0133, \
        U+0134->U+0135,U+0135, U+0136->U+0137, U+0137, U+0139->U+013A, U+013A, U+013B->U+013C, \
        U+013C,U+013D->U+013E, U+013E, U+013F->U+0140, U+0140, U+0141->U+0142, U+0142, \
        U+0143->U+0144,U+0144, U+0145->U+0146, U+0146, U+0147->U+0148, U+0148, U+014A->U+014B, \
        U+014B,U+014C->U+014D, U+014D, U+014E->U+014F, U+014F, U+0150->U+0151, U+0151, \
        U+0152->U+0153,U+0153, U+0154->U+0155, U+0155, U+0156->U+0157, U+0157, U+0158->U+0159,\
        U+0159,U+015A->U+015B, U+015B, U+015C->U+015D, U+015D, U+015E->U+015F, U+015F, \
        U+0160->U+0161,U+0161, U+0162->U+0163, U+0163, U+0164->U+0165, U+0165, U+0166->U+0167, \
        U+0167,U+0168->U+0169, U+0169, U+016A->U+016B, U+016B, U+016C->U+016D, U+016D, \
        U+016E->U+016F,U+016F, U+0170->U+0171, U+0171, U+0172->U+0173, U+0173, U+0174->U+0175,\
        U+0175,U+0176->U+0177, U+0177, U+0178->U+00FF, U+00FF, U+0179->U+017A, U+017A, \
        U+017B->U+017C,U+017C, U+017D->U+017E, U+017E, U+0410..U+042F->U+0430..U+044F, \
        U+0430..U+044F,U+05D0..U+05EA, U+0531..U+0556->U+0561..U+0586, U+0561..U+0587, \
        U+0621..U+063A, U+01B9,U+01BF, U+0640..U+064A, U+0660..U+0669, U+066E, U+066F, \
        U+0671..U+06D3, U+06F0..U+06FF,U+0904..U+0939, U+0958..U+095F, U+0960..U+0963, \
        U+0966..U+096F, U+097B..U+097F,U+0985..U+09B9, U+09CE, U+09DC..U+09E3, U+09E6..U+09EF, \
        U+0A05..U+0A39, U+0A59..U+0A5E,U+0A66..U+0A6F, U+0A85..U+0AB9, U+0AE0..U+0AE3, \
        U+0AE6..U+0AEF, U+0B05..U+0B39,U+0B5C..U+0B61, U+0B66..U+0B6F, U+0B71, U+0B85..U+0BB9, \
        U+0BE6..U+0BF2, U+0C05..U+0C39,U+0C66..U+0C6F, U+0C85..U+0CB9, U+0CDE..U+0CE3, \
        U+0CE6..U+0CEF, U+0D05..U+0D39, U+0D60,U+0D61, U+0D66..U+0D6F, U+0D85..U+0DC6, \
        U+1900..U+1938, U+1946..U+194F, U+A800..U+A805,U+A807..U+A822, U+0386->U+03B1, \
        U+03AC->U+03B1, U+0388->U+03B5, U+03AD->U+03B5,U+0389->U+03B7, U+03AE->U+03B7, \
        U+038A->U+03B9, U+0390->U+03B9, U+03AA->U+03B9,U+03AF->U+03B9, U+03CA->U+03B9, \
        U+038C->U+03BF, U+03CC->U+03BF, U+038E->U+03C5,U+03AB->U+03C5, U+03B0->U+03C5, \
        U+03CB->U+03C5, U+03CD->U+03C5, U+038F->U+03C9,U+03CE->U+03C9, U+03C2->U+03C3, \
        U+0391..U+03A1->U+03B1..U+03C1,U+03A3..U+03A9->U+03C3..U+03C9, U+03B1..U+03C1, \
        U+03C3..U+03C9, U+0E01..U+0E2E,U+0E30..U+0E3A, U+0E40..U+0E45, U+0E47, U+0E50..U+0E59, \
        U+A000..U+A48F, U+4E00..U+9FBF,U+3400..U+4DBF, U+20000..U+2A6DF, U+F900..U+FAFF, \
        U+2F800..U+2FA1F, U+2E80..U+2EFF,U+2F00..U+2FDF, U+3100..U+312F, U+31A0..U+31BF, \
        U+3040..U+309F, U+30A0..U+30FF,U+31F0..U+31FF, U+AC00..U+D7AF, U+1100..U+11FF, \
        U+3130..U+318F, U+A000..U+A48F,U+A490..U+A4CF

        ngram_len = 1
        ngram_chars     = U+4E00..U+9FBF,U+3400..U+4DBF,U+20000..U+2A6DF, \
                    U+F900..U+FAFF,U+2F800..U+2FA1F,U+2E80..U+2EFF,U+2F00..U+2FDF, \
                    U+3100..U+312F,U+31A0..U+31BF,U+3040..U+309F,U+30A0..U+30FF, \
                    U+31F0..U+31FF,U+AC00..U+D7AF,U+1100..U+11FF,U+3130..U+318F, \
                    U+A000..U+A48F,U+A490..U+A4CF

  一元分词设置比较简单,具体的参数说明,请查看Sphinx中文手册(文章最后有提供下载),主要是PHP代码部分,当时困扰了很久,其实在手册中有说明,都怪自己没有仔细查看。
  假设:搜索 深圳 两个字,默认情况下,Sphinx会返回包含“深”字和包含“圳”的记录,这样会导致搜索结果不是我们所需要的,如有一条记录是“深圳市圳圳有限公司”,也会搜索出来,简言之,就是相当于”或”的意思。
  这时我们就需要在PHP代码预处理一下,给字符串加上双引号,如“深圳”,明确告诉Sphinx,搜索的是词组,再比如搜索深圳 大学(中间有空格),PHP处理后,就变成“深圳” “大学”(中间有空格),这样我们就可以得到正确的搜索结果了。
  Sphinx0.9.8中文手册下载: Coreseek官网下载 本地下载

Tags:,,, Posted in Sphinx之路我抢沙发

xhEditor在Firefox下不能删除文字的Bug及解决方案

2009/11/08

  由于网站上使用的UBB可视化编辑器,在清除Word代码等方面,表现差强人意,严重影响到会员的使用,为了稳定民怨四起的局势,创建和谐社会,又一次网罗天下所有的UBB可视化编辑器了(早前搜刮过几次,毫无所获),终于踏破铁鞋无觅处,让我们找到了xhEditor

  xhEditor是何方神圣?以下是官网的介绍:xhEditor是一个基于jQuery开发的简单迷你并且高效的可视化XHTML编辑器,基于网络访问并且兼容IE 6.0-8.0,Firefox 3.0,Opera 9.6,Chrome 1.0,Safari 3.22。通过插件的方式,还支持UBB代码,正合我意。xhEditor有详细的文档及演示,最新版本是0.9.8,目前还有些许地方不够完善,相信后续的版本一定会让大家更加兴奋,感谢作者的无私奉献。

  在使用xhEditor可视化编辑器时,发现了有一点与其他编辑器不同的地方,如FCKeditor(后更名为CKeditor)淘宝KISSY Editor,以及网站正在的UBB可视化编辑器,它们的iframe和textarea处于DOM的同一级,切换时,只是显示隐藏。而xhEditor不同,它都是操作iframe,textarea是在iframe的代码中,这也延升到本文碰到的问题及解决方案。

  以下问题,只存在于Firefox下,IE是正常的。

  在xhEditor的可视化状态时,保证你已经输入了内容,如图1:

xheditor测试

xheditor测试

  接下来按下“源代码”按钮切换到源代码模式,再次按下“源代码”按钮切换到可视化编辑状态,问题就出现在这里(如图2):当你想删除文字,按下Delete键或Backspace键时,你会发现,删除键失灵了,无法删除内容。很奇怪,光标都在的,就是不能删除。当你输入其他文字后,你会发现,又可以删除了。
xheditor测试

  这个问题困扰了很久,在网上用中文搜索了很久,大家都没碰到这种问题,最后关头,只能使用Google必杀技了,使用英文单词进行搜索,终于找到相关的解决方案,标题是IFRAME designMode=”on” – backspace doesnt work at,可以单击进入,里面有详细介绍。原来是Firefox的一个Bug,修改this.toggleSource函数,代码如下:

jBody.find('#sourceCode').remove();
if(isIE)_doc.body.contentEditable='true';
else {
  _doc.designMode = 'On';
  if(isMozilla)_doc.execCommand("inserthtml", false, "fill IFRAME with stuff"); // 添加这句
}

  呵呵,问题终于解决。

Tags:,, Posted in 前端技术我抢沙发

恭喜!Sphinx版网站搜索功能终于上线喽……

2009/10/28

  千呼万唤,万众期待的Sphinx版搜索功能终于上线了,于今天早上闪亮登场!
  经过各位同仁们的齐心合力,特别是汪洋童鞋噼里啪啦的敲着键盘修正Bug,实在是功不可没。
  目前Sphinx搜索功能已经修正了大部分的Bug,已经稳定下来了。

Tags:,, Posted in Sphinx之路3 条评论

Sphinx: UpdateAttributes修改isdeleted后,导致搜索错误

2009/10/21

  在上一篇博文《Sphinx: php调用UpdateAttributes函数删除索引数据》中讲到,使用updateAttributes函数可以很方便的修改属性值,如isdeleted(标识删除记录)、price、refreshtime等属性,动态的修改属性值,而不需要重建索引,同时速度也是非常快。
  在项目中,我們也采用了“主索引+增量索引”的方式,增量索引保存一天的数据,在PHP中我使用以下代码进行搜索:

   $res = $sp->query ( $q, "*");  // $q 搜寻的表达式 * 所有索引
   

  在实际测试当中,我们发现,当使用updateAttributes函数修改isdeleted为1后(Sphinx也提示修改成功)。在搜索结果中,竟然发现了这笔删除的记录,按照正常的逻辑,删除的记录不会显示出来,因为我设置了:

   $sp->SetFilter('isdeleted', array(0));
   

  通过输出$res数据,查看了isdelete值,isdeleted是等于0:

   [1] => Array
          (
              [weight] => 1
               [attrs] => Array
                  (
                    [isdeleted] => 0
                  )
          )
    

  奇怪的是,isdeleted竟然等於0,但是updateAttributes函數返回值為1,也就是意味是修改是成功的,於是我把過濾條件修改了一下:

    $res = $sp->SetFilter('isdeleted', array(1));
    

刷新網頁,結果很讓人費解,這件刪除的記錄,同樣被搜索到了,如下:

   [1] => Array
          (
              [weight] => 1
               [attrs] => Array
                  (
                    [isdeleted] => 1
                  )
          )
     

  從中不難發現,isdeleted值竟然變成1了,一條記錄同時擁有兩個值?舊的記錄還存在?
  正在毫無頭緒時,我嘗試修改了query函數的$index參數,將 * 修改成索引名稱,如下:

    $sp->query ( $q, "ws_index,ws_delta_index");  // $q 搜寻的表达式 * 所有索引
    

  刷新網頁,真是讓人意想不到,搜索結果正常了。
  Sphinx版本:0.9.9-rc2
  總結:由於不瞭解sphinx的索引的機制,目前猜测,Sphinx似乎还保存了舊索引,在使用 * 時,同時也搜尋到了舊索引,导出结果有误,應該是sphinx的一个Bug,看來,以後還是指定索引名稱方為上策。

Tags:,,,, Posted in Sphinx之路4 条评论

Sphinx: php调用UpdateAttributes函数删除索引数据

2009/10/21

  最近一直在学习Sphinx,并应用到实际项目当中,作为php开发语言中首选的搜索引擎,其优势不言而喻,在张宴的博文《亿级数据的高并发通用搜索引擎架构设计》中有详细的介绍。
  Sphinx索引建立后,如何删除记录?确实是件很头痛的事情,Sphinx资料也是甚少,幸好有coreseek论坛,很多问题都可以迎刃而解,了解到Sphinx中没有提供直接操作的方法,而是通过在数据表中添加一个字段来处理,标识记录是否删除,具体的方法如下:
  数据表: 创建表时,多添加一个isdeleted字段(名字可以随便取)
  配置文件:将字段添加为属性,如:sql_attr_uint = isdeleted
  php搜索:$sp 为Sphinx对象,php代码:

      $sp->SetFilter(’isdeleted’, array(0));    //  setFilter 设置过滤的条件,以上就是只显示isdeleted=0的数据。
    

  php标识删除数据:

     $sp->UpdateAttributes(’sp_index’, array(’isdeleted’), array(2=>array(1)));
     

  目前我使用的是0.9.9-rc2版本,sphinxapi.php 中的 UpdateAttributes 也支持MVA数据的修改了(UpdateAttributes ( $index, $attrs, $values, $mva=false )),使用UpdateAttributes修改属性值也变得非常方便了,不过,目前只支持整型数据,如float,bool暂不支持。

Tags:,, Posted in Sphinx之路我抢沙发

php agi程序无法获取通话时间的问题

2009/10/17

         最近在学习Asterisk时,遇到了一个问题,软电话拨打外线后,当软电话主动挂机时,PHP AGI程序并不继续自动执行了,导致无法获取通话时间、通话状态等信息。
         代码摘自Arnold.Deng’s Blog中的《php agi 中判断可用的通道》博文,内容如下:

#!/usr/bin/php -q
answer();
$result = $agi->exec('chanIsAvail Zap/1&Zap/2&Zap/3&Zap/4'); // 使用 chanIsAvail 指令检查可用通道,后面的参数是通道列表
$result = $agi->get_variable('AVAILCHAN'); // 获取可用的通道的名字,例如:Zap/1-1
$agi->verbose('result:'.$result[data]);
$channel = $result[data];
$result = $agi->get_variable('AVAILORIGCHAN'); // 获取可用的通道的标准名字,例如:Zap/1
$agi->verbose('result:'.$result[data]);
$result = $agi->get_variable('AVAILSTATUS'); // 获取可用的通道的状态标识
$agi->verbose('result:'.$result[data]);

if (empty($channel)){ // 如果没有可用的通道,例如:FXO卡上都没有接电话外线
   $agi->exec('Playtones congestion'); // 播放拥塞提示音
   $agi->exec('Congestion 10'); // 提示拥塞,等待 10 秒后挂机
   $agi->hangup(); // 主动挂机
   exit;
}

$dnid = $agi->request['agi_extension']; // 获取要外拨的号码
$agi->exec_dial($channel, $dnid, 30); // 拨号开始,超时时间 30 秒
$dialstatus   = $agi->get_variable("DIALSTATUS"); // 获取拨号的状态
$agi->verbose('dialstatus:'.$dialstatus[data]);
$answeredtime = $agi->get_variable("ANSWEREDTIME"); // 获取通话时间长度
$agi->verbose('answeredtime:'.$answeredtime[data]);
$agi->hangup(); // 主动挂机
?>

以下是控制台输出的结果:

AGI Rx << VERBOSE "result:Zap/4" 1
  /var/lib/asterisk/agi-bin/example/dial_out.php: result:Zap/4
AGI Tx >> 200 result=1
AGI Rx << GET VARIABLE AVAILSTATUS
AGI Tx >> 200 result=1 (0)
AGI Rx << VERBOSE "result:0" 1
  /var/lib/asterisk/agi-bin/example/dial_out.php: result:0
AGI Tx >> 200 result=1
AGI Rx << EXEC Dial Zap/4-1/913798598446|30
    -- AGI Script Executing Application: (Dial) Options: (Zap/4-1/913798598446|30)
    -- Called 4-1/913798598446
    -- Zap/4-1 answered SIP/104-b7a04048
    -- Hungup 'Zap/4-1'
AGI Tx >> 200 result=-1
  == Spawn extension (test, 913798598446, 1) exited non-zero on 'SIP/104-b7a04048'

         由于对Asterisk了解甚少,一直也没有找到方案,后来在cnasterisk.com发贴求助,得到了答案是将AGI改为DeadAGI方式,按照上面的说的方式,果然奏效,php agi程序能够正常的执行了。高兴之余,我查了一下资料:
         DeadAGI ( )的用法也很像 AGI( ),但是它允许你的 AGI 脚本在死信道(比如,一个挂起的信道)中正常的运转。也就是说通用的 AGI( )不能在死信道中正常运转。
         目前使用是正常的,后续将进行观察,需要加深对Asterisk的了解。

Tags:, Posted in 服务端技术我抢沙发