• mac 摄像头故障 无法启动摄像头 no connected camera 相机未连接

    ###故障情况 1. qq视频打不开摄像头 2. photo booth,FaceTime 也显示 “相机未连接” 3. 同样关于本机中的 摄像头也无法识别了 最初 选择了重启。。问题解决了。 并非硬件故障。。 实际上是软件占用导致的 ###解决方法 终端输入 [bash] sudo killall VDCAssistant 输入密码即可 平时经常遇到。。保存一下方便以后查找
    Jan/31/2015 00:06
    评论(0)
  • dell U2414 显示器 DisplayPort 黑屏问题解决

    ###问题描述 我使用的是一台DELL UltraSharp U2414h 显示器 mac bookpro 使用 mini dp=》dp连接。 * 电脑能成功分屏,或者能出现显示器界面。 * 突然黑屏,或者一会儿闪黑屏,一会儿又恢复 * 进入省电模式 最初我遇到的情况是一会儿闪黑屏,好在我有2根dp线,换了一根问题解决了。 可是用了一周,突然直接进入省电模式。。 而电脑现实的是已经分屏了。。部分窗口已经到显示器上了。。 各种上网查原因。给的反馈居然都是打dell 400 电话上门更换,甚至很多人已经换了好多台。。 后来不死心,继续google。 在英文结果中看到dell官方的解决办法 关键的问题 还是在于 dp 版本的兼容问题。具体情况不明,如果遇到类似问题可尝试在1.2 或1.1a中切换尝试,以及更换其他dp线材。 http://en.community.dell.com/support-forums/peripherals/f/3529/t/19585842 * Turn the laptop and both U2414Hs off * Disconnect all cables from the U2414Hs * Press and hold in the power buttons for 8 seconds * Reconnect the U2414Hs power cords * Turn the laptop on * Turn #1 U2414H on * Press the Menu button * Choose Input Source * Choose DisplayPort * Go to Display Settings * Change DisplayPort 1.2 to Enable * Exit the OSD (On Screen Display) * Set the Laptop display settings to extend the windows desktop to the #1 U2414H 在显示器设置中修改dp接口 为1.2 http://displayportpro.com/dell-u2414h-displayport-not-working/ 1. 使菜单高亮显示 DisplayPort 或 Mini DisplayPort。 2. 按住电源键约 8 秒。 3. 改为 DP 1.2 或 取消。 网站还建议*不要使用*廉价线材 Never use cheap non certified cables or adapters with DisplayPort video cards, motherboards, laptops or monitors. They are known to have tons of issues: ONLY buy certified cables from known manufacturers. Also, you should avoid Ebay: it’s filled with bad cables or fake / gray market cables.
    Jan/19/2015 10:39
    评论(0)
  • nexus5电信破解版相机无法录像

    会出现这种情况的用户可能跟我一样是电信破解版用户 系统是4.4.2 破解教程可能是4.4 下载正确的rom 提取boot.img 刷入即可 https://developers.google.com/android/nexus/images?hl=zh-cn adb 简直好用,先确认可以使用, ➜ ~ sudo adb devices * daemon not running. starting it now on port 5037 * * daemon started successfully * List of devices attached 076a8ba42517d*** device 然后直接reboot进bootloader ➜ ~ adb reboot bootloader ➜ ~ sudo fastboot devices 076a8ba42517d*** fastboot 直接刷入boot.img ➜ ~ fastboot flash boot boot.img sending 'boot' (8628 KB)... OKAY [ 0.487s] writing 'boot'... OKAY [ 0.748s] finished. total time: 1.235s ➜ ~ fastboot reboot rebooting... finished. total time: 0.001s
    Dec/11/2014 13:33
    评论(0)
  • phonegap 青浦之家 手机客户端

    很早见PHONEGAP的时候总觉得,只是个浏览器嵌套个网页。 记得还用它做了个yingou.net的客户端,缺乏美工,依然是粗糙的网页感。 一次在看web框架,发现很多web框架达到的效果接近于客户端了。 尝试着嵌入phonegap,体验超好。 于是又开始陶腾客户端啦。 翻history 出来的记录。 [bash] cordova create qphome com.qphome.qpapp QphomeMobile 111 cd qphome/ 112 cordova platform add android 113 cordova platform add ios 114 cordova plugin add org.apache.cordova.network-information 115 cordova plugin add org.apache.cordova.splashscreen 116 cordova plugin add org.apache.cordova.camera 117 cordova plugin add org.apache.cordova.geolocation 118 cordova plugin add https://github.com/jpush/jpush-phonegap-plugin.git 119 cordova plugin add org.apache.cordova.contacts 120 cordova plugin add org.apache.cordova.file-transfer 主要是用到的几个插件, 已经挺像回事儿了
    [file:143] [file:144] [file:146] [file:147] [file:145]
    Jun/22/2014 01:32
    评论(0)
  • OpenWRT+wifidog portal认证路由器 青浦之家wifi

    ###项目背景 portal认证形式的公共wifi已经很常见了 例如星巴克,银行,i-shanghai。 在朋友的推荐下,打算在[青浦](http://www.qphome.com/)地区架设与青浦之家合作的认证路由器。 具体功能为: 1. 添加“青浦百事通(qingpubaishitong)”微信号或商家微信号获取上网密码。 2. 使用青浦之家账户直接登陆。 3. 设定认证密码直接登陆。 4. 青浦之家任意访问。 5. 联网情况的统计。 6. 上网时段时长控制。 ###wifidog portal认证方式有多重,我们选择了十分普遍额开源项目wifidog,支持openwrt,用户群体大,资料较完善,中文资料多。 主要优点: 1. 开源( github,上提供了源码及基于php的认证网关源码) 2. 国内使用wifidog的情况比较普遍,二次开发更容易。 (总结:低成本,易上手。) 目前也存在一定的缺点 1. 通过实际抓包发现,心跳包不断的检查用户在线情况,网关服务器性能开销较大。 2. 基于iptables,协议繁琐。 3. 隐私问题,url直接传递含隐私的信息。 ###工作机制 /ping 心跳接口 `"GET /ping/?gw_id=网关id&sys_uptime=1183&sys_memfree=105884&sys_load=0.14&wifidog_uptime=1169 HTTP/1.0"` /login 新用户认证跳转页面 `GET /login/?gw_address=111&gw_port=111&gw_id=111&mac=88:72:0d:f2:88:29&url=url HTTP/1.1` /auth 用户检测 `/auth/?stage=counters&ip=192.168.10.81&mac=88:72:0d:f2:a8:29&token=85ea71f2484b2c52fee&incoming=5638570&outgoing=722214&gw_id=111 HTTP/1.0`
    [file:137] [file:138] [file:139]
    Oct/15/2014 03:25
    评论(0)
  • NGINX为目录增加密码保护

    为了防止一些可能出现存在漏洞的后台脚本暴露,使用验证的方式保护这些文件所在的目录 使用apache的htpasswd工具生成密码
    [email protected]:~$ htpasswd -b -c filename username passwd
    Adding password for user ******
    
    
    命令参数注释: Usage: htpasswd [-cmdpsD] passwordfile username htpasswd -b[cmdpsD] passwordfile username password htpasswd -n[mdps] username htpasswd -nb[mdps] username password -c Create a new file. -n Don't update file; display results on stdout. -m Force MD5 encryption of the password (default). -d Force CRYPT encryption of the password. -p Do not encrypt the password (plaintext). -s Force SHA encryption of the password. -b Use the password from the command line rather than prompting for it. -D Delete the specified user. -b 使用命令行处理 -c创建密码 后面3个参数分别是 文件名,用户名 密码 附一个可用的bash脚本 用于创建密码
       #!/bin/bash
       PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
       export PATH
    
       #set UserName
    
               username=""
               read -p "Please input UserName:" username
               if [ "$username" = "" ]; then
                       echo "Error:UserName can't be NULL!"
                       exit 1
               fi
               echo "==========================="
               echo "UserName was: $username"
               echo "==========================="
    
       #set password
    
               unpassword=""
               read -p "Please input the Password:" unpassword
               if [ "$unpassword" = "" ]; then
                       echo "Error:Password can't be NULL!"
                       exit 1
               fi
               echo "==========================="
               echo "Password was: $unpassword"
               echo "==========================="
       password=$(perl -e 'print crypt($ARGV[0], "pwdsalt")' $unpassword)
    
       #set htpasswd file
    
               htfile=""
               read -p "Please input Auth filename:" htfile
               if [ "$htfile" = "" ]; then
                       echo "Error:Auth filename can't be NULL!"
                       exit 1
               fi
               echo "==========================="
               echo "Auth File:$htfile"
               echo "==========================="
    
               get_char()
               {
               SAVEDSTTY=`stty -g`
               stty -echo
               stty cbreak
               dd if=/dev/tty bs=1 count=1 2> /dev/null
               stty -raw
               stty echo
               stty $SAVEDSTTY
               }
               echo ""
               echo "Press any key to Creat...or Press Ctrl+c to cancel"
               char=`get_char`
       if [ ! -f $htfile ]; then
         echo "Create Auth file......"
    cat >$htfile<
    
    加执行权限后 跟据操作提示
    输入用于名,密码 文件路径即可,
    由于我放的目录不在NGINX目录.稍稍修改了下.. 可用
    
    然后修改 NGINX配置
    需要注意的是目录
    .*是此目录的所有文件
    否则 导致  可直接访问 admin/index.php
    
    PHP 需要重新解释 
    
    
    location ~^/admin/.* {
        auth_basic "sorry ,for admin";
        auth_basic_user_file /usr/passwd/yxmiandroid.pwd;
    location ~ .php$ {
    fastcgi_pass 127.0.0.1:9000;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME /www/$fastcgi_script_name;
    include fastcgi_params;
    
    }
    
    }
    
    
    Mar/16/2012 02:52
    评论(0)
  • ubuntu下为IPAD充电 ipad_charge

    外接充电器总是个麻烦..一天10小时的守着电脑,还要用一个USB口的外置充电器..这不科学... 按苹果的说法 IPAD电池巨大,0.5A的USB满足不了它.. 好吧..好吧 不过好在有个ipad_charge的小软件 恩.. 科学了... 若是WINDOWS用户 可使用 华硕的 ai charger http://event.asus.com/mb/2010/AI_Charger/ 技嘉科技 ON/OFF Charge http://www.gigabyte.com.tw/microsite/185/on-off-charge.htm 微星i-Charger http://www.softpedia.com/get/IPOD-TOOLS/Other-IPOD-tools-Updates/i-Charger.shtml LINUX用户们可以使用 ipad_charge https://github.com/mkorenkov/ipad_charge/ 作者BLOG http://korenkov.info/ipadcharge-util-updated Now it supports iPad 3 among other devices. Full list of supported devices:
    • iPad
    • iPad2
    • iPad3
    • iPod Touch 2G
    • iPod Touch 3G
    • iPod Touch 4G
    • iPhone 3GS
    • iPhone 4
    • iPhone 4S
    安装方法
    sudo aptitude install libusb-1.0-0 libusb-1.0-0-dev
    git clone https://github.com/mkorenkov/ipad_charge.git
    cd ./ipad_charge
    make
    sudo make install
    
    
    看到国人移植了pyusb 版本 http://www.cnblogs.com/clowwindy/archive/2011/12/28/charge_ipad_in_python.html
    #!/usr/bin/python
    
    import usb.core
    import usb.util
    import usb.backend.libusb10
    import sys, getopt
    
    opts = getopt.getopt(sys.argv[1:],'',['off'])
    off = 'off' in opts[1]
    
    VENDOR_APPLE = 0x05ac
    PRODUCT_IPAD1 = 0x129a
    PRODUCT_IPAD2 = 0x129f
    
    # find our device
    dev = usb.core.find(idVendor=VENDOR_APPLE, idProduct=PRODUCT_IPAD1)
    if not dev:
        dev = usb.core.find(idVendor=VENDOR_APPLE, idProduct=PRODUCT_IPAD2)
    
    if dev is None:
        raise ValueError('Device not found')
    
    usb.util.claim_interface(dev, 0)
    dev.ctrl_transfer(usb.util.CTRL_TYPE_VENDOR|usb.util.CTRL_OUT, 0x40, 0x6400, 0x6400 if not off else 0, None, 2000)
    usb.util.release_interface(dev, 0)
    
    
    May/25/2012 21:39
    评论(0)
  • php使用json代替serialize的想法

    我需要把一些内容存放在数据库,感觉这些没必要建立字段,于是索性放在数组中序列化后存入数据库. 使用serialize序列化后的字符串很多内容都是不需要的,比如长度信息,数据类型. 感觉平时用的json不错. 打算用json代替, 网上好多结果都是json语serialize的速度比较,这个倒没很大的必要. 需要注意的是 json_decode时返回的是object,需要
    json_decode("字符串",ture);
    后来发现也不是那么完美.. json_encode会对中文进行编码.如果含有大量的中文,那长度超过了serialize. 这让人很蛋疼,网上给出的办法是对内容进行urlencode,json_enocde后再urldecode
    function jsonencode($code){ //新json_encode
     $code = json_encode(urlencodearray($code));//对数组处理
     return urldecode($code);
    }
    function urlencodearray($data){//urlencode数组
     if(is_array($data)){
     foreach($data as $key=>$val){
     $data[$key] = urlencodearray($val);
     }
     return $data;
     }else{
     return urlencode($data);
     }
    }
    真是菊花一紧啊.... 再这之后还可以进行一次压缩. 当然,如果不考虑内容的可读性,用其他的扩展也不错,比如msgpack,
    Jan/27/2012 03:49
    评论(0)
  • linux下通过wget模拟 批量回帖抢楼

    discuz 回帖必要的参数 header 中 referer 帖子地址 若出现 意外提交一般为这个不对 cookies 登录状态 内容中 formhash message 有了这些 就可以模拟发帖了 首先通过wget 登录 获取COOKIES
    $ wget --post-data="username=yingouqlj&password=password" --save-cookies=cookie.txt --keep-session-cookies "http://www.qwing.com/logging.php?action=login&loginsubmit=true"
    
    
    登录后 使用之前的COOKIES 打开 帖子页面 获取 FORMHASH
    
    wget --load-cookies cookie --keep-session-cookies http://www.qwing.com/viewthread.php?tid=7231
    
    
    到下载的文件中 找到表单中的值 最后提交
    
     wget --referer 'http://www.qwing.com/viewthread.php?tid=7231' --load-cookies=cookie.txt --keep-session-cookies -r -x --post-data 'formhash=3084dc74&message=%7B%3A7_383%3A%7D' 'http://www.qwing.com/post.php?action=reply&fid=11&tid=7231&extra=&replysubmit=yes&infloat=yes&handlekey=fastpost&inajax=1'
    
    
    
    最后 循环执行把。。哈
    Nov/19/2011 16:16
    评论(0)
  • DISCUZ漫游平台移植记

    想让自己的网站支持应用平台 个人能力有限.不可能自己搭建应用平台 国内的开源SNS程序中 只有DISCUZ提供了应用平台(漫游) GOOGLE 的OPENSOCIAL 目前没找到方法 FACEBOOK 的是被墙的.. 刚好THINKSNS 也已经使用了漫游平台. 那应该是没问题的.. 用THINKSNS 的代码看了下差不多是从UCHOME 移过来的 所以打算吧THINKSNS 的这个移动到我自己的SNS程序上 discuz漫游平台分析 首先是注册站点 获取 ['site_key'] ['my_site_id'] ['my_site_key'] 这3个参数 用过DISCUZ 产品都知道 我在图中标明了 常见问题: 已被注册 参考DISCUZ官方解决方法 使用DISCUZ 提供的附件 根据需要选择“恢复漫游数据”或“重新注册到漫游平台” null 我就不小心重复注册了N 次 应用部分
    $_GET['id'] = intval($_GET['id']); //用户访问的appid
    $app		= doQuery("SELECT * FROM {$db_prefix}myop_myapp WHERE `appid` = {$_GET['id']} LIMIT 1");
    //检查数据库是否存在 (判断注册漫游ID)
    $extra 		 = $_GET['my_extra'];
    $timestamp	 = $_MY_GLOBAL['timestamp'];
    $url 		.= '&my_current='.urlencode($current_url);
    $url 		.= '&my_extra='.urlencode($extra);
    $url 		.= '&my_ts='.$timestamp;
    $url 		.= '&my_appVersion='.$app['version'];
    $hash 		 = $_SITE_CONFIG['my_site_id'] . '|' . $qljid . '|' . $_GET['id'] . '|' . $current_url . '|' . $extra . '|' . $timestamp . '|' . $_SITE_CONFIG['my_site_key'];
    $hash		 = md5($hash);
    $url		.= '&my_sig='.$hash;
    $my_suffix   = urlencode($my_suffix);
    //IFRAME的参数  具体用抓包工具分析
    
    如果用户已注册了 直接可以游戏了 如果没注册 那么就需注册漫游ID 但是漫游ID不返回具体错误参数 所以需要自己改一下api/my.php 给这个文件输出日志 已方便知道漫游平台与站点通信的参数
    log_result(serialize($_REQUEST));//序列化了传入的参数
    log_result( $server->formatResponse($response));//这个是MY输出的参数 已经是序列化了的
    function  log_result($word) {
    	@$fp = fopen("/home/jump/public_html/qlj/apps/myop/log.txt","a");	
    	@flock($fp, LOCK_EX) ;
    	@fwrite($fp,$word."\r");
    	@flock($fp, LOCK_UN); 
    	@fclose($fp);
    }
    
    然后我们去注册应用 再打开 日志文件
    a:4:{s:6:"module";s:15:"UserApplication";s:6:"method";s:3:"add";s:6:"params";s:491:"a:18:{s:3:"uId";s:1:"6";s:5:"appId";i:1061581;s:7:"appName";s:12:"小小战争";s:7:"privacy";s:6:"public";s:12:"allowSideNav";b:1;s:9:"allowFeed";b:1;s:16:"allowProfileLink";b:1;s:14:"defaultBoxType";s:4:"wide";s:11:"defaultMYML";s:0:"";s:18:"defaultProfileLink";s:0:"";s:7:"version";s:1:"0";s:13:"displayMethod";s:6:"canvas";s:12:"displayOrder";N;s:13:"userPanelArea";s:1:"3";s:11:"canvasTitle";s:0:"";s:12:"isFullscreen";b:0;s:16:"displayUserPanel";b:0;s:16:"additionalStatus";s:3:"new";}";s:4:"sign";s:32:"3857683fdb087a0984bacca88e228f3b";}
    
    a:6:{s:8:"timezone";i:8;s:7:"version";s:5:"X_VER";s:10:"my_version";s:3:"0.4";s:7:"charset";N;s:8:"language";s:5:"zh_CN";s:6:"result";i:1;}
    
    a:4:{s:6:"module";s:4:"Feed";s:6:"method";s:24:"publishTemplatizedAction";s:6:"params";s:513:"a:19:{s:3:"uId";s:1:"6";s:5:"appId";i:1061581;s:13:"titleTemplate";s:40:"{actor} 添加了 {app} 应用";s:9:"titleData";a:1:{s:3:"app";s:69:"小小战争";}s:12:"bodyTemplate";N;s:8:"bodyData";a:0:{}s:11:"bodyGeneral";N;s:6:"image1";N;s:10:"image1Link";N;s:6:"image2";N;s:10:"image2Link";N;s:6:"image3";N;s:10:"image3Link";N;s:6:"image4";N;s:10:"image4Link";N;s:9:"targetIds";N;s:7:"privacy";s:6:"public";s:12:"hashTemplate";N;s:8:"hashData";N;}";s:4:"sign";s:32:"d87dcbc4a5656958f29efc5467914eb6";}
    
    a:6:{s:8:"timezone";i:8;s:7:"version";s:5:"X_VER";s:10:"my_version";s:3:"0.4";s:7:"charset";N;s:8:"language";s:5:"zh_CN";s:6:"result";N;}
    
    a:4:{s:6:"module";s:7:"Friends";s:6:"method";s:3:"get";s:6:"params";s:35:"a:1:{s:4:"uIds";a:1:{i:0;s:1:"1";}}";s:4:"sign";s:32:"b21279970e2c99f307e0a4f962abcb45";}
    
    
    a:6:{s:8:"timezone";i:8;s:7:"version";s:5:"X_VER";s:10:"my_version";s:3:"0.4";s:7:"charset";N;s:8:"language";s:5:"zh_CN";s:6:"result";a:1:{i:1;a:3:{i:0;s:1:"2";i:1;s:1:"4";i:2;s:2:"12";}}}
    
    返回参数中 最重要的是 RESULT 注册的时候需要提交很多信息 如用户资料等等. 只放了写大概 不会写文章.具体 就看输出的错误 抓包分析结果.看有没有空值的参数 再与DISCUZ跟THINKSNS对比 看异常的地方 即可
    Mar/20/2011 03:30
    评论(0)
  • 3月11日去了上海gtug谷歌开发技术分享活动

    挺有意思的活动,来自GOOGLE GROUP 分享一下 也算是宣传吧 [email protected] 上海GTUG 内容安排: 18:00 - 18:30 Set Up / Registration 签到 18:30 - 18:50 Opening 开场 18:50 - 19:00 HTML5 Identity 19:00 - 20:00 Chrome / HTML5 20:00 - 20:15 Break 休息 20:15 - 21:00 Andriod 21:00 - 21:20 AdMob 21:20 - 21:30 Q & A 问答 对于HTML5与 CSS3 关注有段日子了 但是游览器的不兼容,也只能是看到新的好玩的就拿来玩弄一下 这次的HTML5演讲列的很详细,部分内容也没听到过,还详细介绍了HTML的规范等 不过有点可惜..比较多.细节的部分不够.时间原因吧.比较关注的websockets也简单的带过了 不过CSS3部分好像有点多...这部分内容网上也比较多. ---------------- 哎 感慨IE的用户量下降的怎么那么慢. ---------------- android部分的内容 ANDROID的老用户了,虽然没有做过任何ANDROID应用,最为老用户..我还用着比较老的1.6 而演讲的内容中比较多的是3.0,2.3...痛苦.. 3.0的UI 用户体验 貌似改变很大,唯一可惜的是...演讲人的应用... 都是一些IPHONE上很成熟的移植产品 至于ADMOB 这个不发表意见... 演讲者属于运营 管理类 大人物..所以无法产生共识..个人比较喜欢新奇或偏向技术层面的东西 总结.不管是HTML5 还是 ANDROID 感觉移动市场的魅力越来越大 首先ANDROID 跟 IOS 的游览器均为WEBKIT内核,可以很好的支持HTML5,相反PC下 更多的是IE. 移动平台的增长对HTML5的普及很有帮助,而HTML5 也很多的考虑到了移动平台.如重力感应, 这些 都是PC机不需要的硬件设备.典型应用如GOOGLEMAP 的 手机版 另外ANDROID 演讲部分 让我比较开眼界的是 NCF近场通信 这个也就是以前 电视广告里说的 IPHONE 的电子刷卡支付, 这个会推动 移动支付.还有物联网. 可以说是相当好玩的一个东西 废话 抱怨有点多. 就到这吧 放几张 从微博偷来的图 人还是挺多了呵呵 很不好意思的说 这个图里找到了我一个后脑勺 很不好意思的说 这个图里找到了我一个后脑勺. 呵呵 那天的HTML5贴纸 那天的贴纸
    Mar/20/2011 03:30
    评论(0)
  • php延时更新点击数[文件缓存]

    想法来源 用户积分增加 列入 用户访问空间时增加1分 用户首次登陆增加10分 那么每次操作都要insert一次 这显然很浪费 如果可以缓存一次性写入那么就可以降低MYSQL的压力了 像上面的情况我只要一次性增加11分即可 在THINKPHP中找到了方法 下面代码转载自THINKPHP(advmodel.class.php)
    setLazyInc($field,$condition='',$step=1,$lazyTime=0) { //缓存累加
            if(empty($condition) && isset($this->options['where']))
                $condition   =  $this->options['where'];
            if(empty($condition)) { // 没有条件不做任何更新
                return false;
            }
            if($lazyTime>0) {// 延迟写入
                $guid =  md5($this->name.'_'.$field.'_'.serialize($condition));
                $step = $this->lazyWrite($guid,$step,$lazyTime);
                if(false === $step ) return true; // 等待下次写入
            }
            return $this->setField($field,array('exp',$field.'+'.$step),$condition);
        }
    
    function lazyWrite($guid,$step,$lazyTime) {   
            if(false !== ($value = F($guid))) { // 存在缓存写入数据
                if(time()>F($guid.'_time')+$lazyTime) {
                    // 延时更新时间到了,删除缓存数据 并实际写入数据库
                    F($guid,NULL);
                    F($guid.'_time',NULL);
                    return $value+$step;
                }else{
                    // 追加数据到缓存
                    F($guid,$value+$step);
                    return false;
                }
            }else{ // 没有缓存数据
                F($guid,$step);
                // 计时开始
                F($guid.'_time',time());
                return false;
            }
        }
    
    上面有个 FUNCTION F 在FACTIONS.PHP
    // 快速文件数据读取和保存 针对简单类型数据 字符串、数组
    function F($name,$value='',$path=DATA_PATH) { //修改$path为自己的缓存路径
        static $_cache = array();
        $filename   =   $path.$name.'.php';
        if('' !== $value) {
            if(is_null($value)) {
                // 删除缓存
                return unlink($filename);
            }else{
                // 缓存数据
                $dir   =  dirname($filename);
                // 目录不存在则创建
                if(!is_dir($dir))  mkdir($dir);
                return file_put_contents($filename,"");
            }
        }
    
    调用方法
    setLazyDec($field,$condition='',$step=1,$lazyTime=0) 
    //根据需要 自己修改吧我加入了table 等多个
    function lazyaddint($table,$field,$condition='',$num=1,$ltime=0)
    //调用方法 更具实际需要修改吧
    lazyaddint('表明','字段名',"WHERE条件",增加数量,缓存时间);
    
    
    此方法 会在缓存目录中创建2个临时文件
    //07e8c1b06dbdc4f282bf7bf9311a1fce_time.php
    
    
    //07e8c1b06dbdc4f282bf7bf9311a1fce.php
    
    
    根据时间超过 设定的时间就写入数据库 此方法已经适用无问题 感觉方法不太好.. 期待MEMCACHED的方式
    Mar/09/2011 00:56
    评论(0)
  • 老discuz直接升级至discuz x2

    我这个是discuz 6.1吧。大概。。 版本忘记了。。 是gbk版本。 老论坛。在我17岁那年玩的 由于当时未满18.。随便上网 搜了个身份正。。拿去 beian了。 后来beian重申。。 哪能记得当时用的谁的。。。 就这样。。 beian被取消了。。 无奈啊。 现在放国外服务器上 挂着吧。 似乎转换有点麻烦 决定一个个 表的手工转换
    INSERT INTO `qphome`.`cdb_ucenter_members` (`uid`, `username`, `password`, `email`, `myid`, `myidkey`, `regip`, `regdate`, `lastloginip`, `lastlogintime`, `salt`, `secques`) SELECT 	uid,username,password,email,myid,myidkey,regip,regdate,lastloginip,lastlogintime,salt,secques 
    FROM  `qphome_old`.`uc_members` 
    
    
    
    
    	INSERT INTO `qphome`.`cdb_forum_thread` (`tid`,`fid`,`typeid`,`sortid`,`readperm`,`price`,`author`,`authorid`,`subject`,`dateline`,`lastpost`,`lastposter`,`views`,`replies`,`displayorder`,`highlight`,`digest`,`rate`,`special`,`attachment`,`moderated`,`closed`) select `tid`,`fid`,`typeid`,`sortid`,`readperm`,`price`,`author`,`authorid`,`subject`,`dateline`,`lastpost`,`lastposter`,`views`,`replies`,`displayorder`,`highlight`,`digest`,`rate`,`special`,`attachment`,`moderated`,`closed` from `qphome_old`.`cdb_threads`
    
    
    		INSERT INTO `qphome`.`cdb_forum_forum` (`fid`,`fup`,`type`,`name`,`status`,`displayorder`,`styleid`,`threads`,`posts`,`todayposts`,`lastpost`,`allowsmilies`) select `fid`,`fup`,'forum' as `type`,`name`,`status`,`displayorder`,`styleid`,`threads`,`posts`,`todayposts`,`lastpost`,`allowsmilies` from `qphome_old.cdb_forums`
    			
    
    				INSERT INTO `qphome`.`cdb_forum_post` (`pid`,`fid`,`tid`,`first`,`author`,`authorid`,`subject`,`dateline`,`message`,`useip`,`invisible`,`anonymous`,`usesig`,`htmlon`,`bbcodeoff`,`smileyoff`,`parseurloff`,`attachment`,`rate`,`ratetimes`,`status`	)
    				select `pid`,`fid`,`tid`,`first`,`author`,`authorid`,`subject`,`dateline`,`message`,`useip`,`invisible`,`anonymous`,`usesig`,`htmlon`,`bbcodeoff`,`smileyoff`,`parseurloff`,`attachment`,`rate`,`ratetimes`,`status`	 from `qphome_old`.`cdb_posts`
    
    INSERT INTO `qphome`.`cdb_common_member`
    	(`uid`,`email`,`username`,`password`,`adminid`,`groupid`,`groupexpiry`,`extgroupids`,`regdate`,`credits`,`timeoffset`,`accessmasks`	)
    	select `uid`,`email`,`username`,`password`,`adminid`,`groupid`,`groupexpiry`,`extgroupids`,`regdate`,`credits`,`timeoffset`,`accessmasks` from `qphome_old`.`cdb_members`
    
    
    
    
    INSERT INTO `qphome`.`cdb_forum_forumfield`(
    `fid`,`description`,`password`,`icon`,`moderators`,`rules`,`threadtypes`,`threadsorts`,`viewperm`,`postperm`,`replyperm`,`getattachperm`,`postattachperm`,`keywords`,`supe_pushsetting`,`formulaperm`,`modrecommend`	
    	) select `fid`,`description`,`password`,`icon`,`moderators`,`rules`,`threadtypes`,`threadsorts`,`viewperm`,`postperm`,`replyperm`,`getattachperm`,`postattachperm`,`keywords`,`supe_pushsetting`,`formulaperm`,`modrecommend`	
    from `qphome_old`.`cdb_forumfields`
    
    
    UPDATE  `qphome`.`cdb_forum_forum` SET  `fup` =  '10' WHERE  `cdb_forum_forum`.`fid` in(11,12,13,14);
    UPDATE  `qphome`.`cdb_forum_forum` SET  `fup` =  '83' WHERE  `cdb_forum_forum`.`fid` in(84,85,86,87,88,89,90,91,92,93,104,105);
    
    
    
    			
    				INSERT INTO `qphome`.`cdb_common_member_profile`(
    	`uid`,`realname`,`gender`,`birthyear`,`birthmonth`,`birthday`,`alipay`,`icq`,`qq`,`yahoo`,`msn`,`taobao`,`site`,`bio`
    		
    		)(
    		select f.uid,'' as `realname`,m.`gender`,YEAR(m.`bday`) as `birthyear`,MONTH(m.`bday`) as `birthmonth`,DAY(m.`bday`) as `birthday`,f.`alipay`,f.`icq`,f.`qq`,f.`yahoo`,f.`msn`,f.`taobao`,f.`site`,f.`bio`
    		
    from		`qphome_old`.`cdb_memberfields` as f left join `qphome_old`.`cdb_members` as m on f.`uid`=m.`uid`
    		)
    			
    
    
    			INSERT INTO `qphome`.`cdb_common_member_count`(
    
    	`uid`,`extcredits1`,`extcredits2`,`extcredits3`,`extcredits4`,`extcredits5`,`extcredits6`,`extcredits7`,`extcredits8`,`posts`,`threads`,`digestposts`,`views`,`oltime`
    	
    	) select  `uid`,`extcredits1`,`extcredits2`,`extcredits3`,`extcredits4`,`extcredits5`,`extcredits6`,`extcredits7`,`extcredits8`,`posts`,`threads`,`digestposts`,`pageviews` as `views`,`oltime`
    	from `qphome_old`.`cdb_members` 
    
    
    	
    				INSERT INTO `qphome`.`cdb_common_member_status`(
    				
    					`uid`,`regip`,`lastip`,`lastvisit`,`lastactivity`,`lastpost`
    					)
    					select `uid`,`regip`,`lastip`,`lastvisit`,`lastactivity`,`lastpost`  	from `qphome_old`.`cdb_members` 
    
    
    
    INSERT INTO `cdb_ucenter_pm_lists`
    (authorid, pmtype, subject, members, min_max, dateline,lastmessage) 
    SELECT * from (SELECT msgfromid as authorid, 1 as pmtype, '' as subject, 2 as members, 
    CONCAT(LEAST(msgfromid,msgtoid),'_',GREATEST(msgfromid,msgtoid)) as min_max, dateline, 
    CONCAT('a:3:{s:12:"lastauthorid";s:',LENGTH(msgfromid),':"',msgfromid,'";s:10:"lastauthor";s:',LENGTH(msgfrom),':"',msgfrom,'";s:11:"lastsummary";s:',LENGTH(message),':"',LEFT(IF(LENGTH(subject) > 0 AND STRCMP(subject, message), CONCAT(subject, '\r\n', message), message),150),'";}') as lastmessage
    FROM `uc_pms` 
    WHERE related = 1 order by dateline desc) as tmp GROUP BY min_max;
    
    
    
    
    INSERT INTO `cdb_ucenter_pm_members` (plid, uid, isnew, lastupdate) SELECT plid, SUBSTRING_INDEX(min_max, '_', 1), 0, 0 FROM `cdb_ucenter_pm_lists`;
    INSERT INTO `cdb_ucenter_pm_members` (plid, uid, isnew, lastupdate) SELECT plid, SUBSTRING_INDEX(min_max, '_', -1), 0, 0 FROM `cdb_ucenter_pm_lists`;
    
    ALTER TABLE  `cdb_ucenter_pm_indexes` ADD  `pmidold` INT NULL;
    
    
    
    
    INSERT INTO `cdb_ucenter_pm_indexes` (plid, pmidold) SELECT l.plid, p.pmid FROM `uc_pms` p LEFT JOIN `cdb_ucenter_pm_lists` l ON CONCAT(LEAST(p.msgfromid, p.msgtoid), '_', GREATEST(p.msgfromid, p.msgtoid)) = l.min_max WHERE p.related = 1;
    
    
    
    
    INSERT INTO `cdb_ucenter_pm_messages_0` (pmid, plid, authorid, message, delstatus, dateline) SELECT i.pmid, i.plid, p.msgfromid, IF(LENGTH(p.subject) > 0 AND STRCMP(p.subject, p.message), CONCAT(p.subject, '\r\n', p.message), p.message), IF(l.authorid = p.msgfromid, p.delstatus, IF(p.delstatus > 0, 3-p.delstatus, 0)), p.dateline FROM `cdb_ucenter_pm_indexes` i LEFT JOIN `uc_pms` p ON i.pmidold = p.pmid LEFT JOIN `cdb_ucenter_pm_lists` l ON i.plid = l.plid WHERE i.plid % 10 = 0;
    INSERT INTO `cdb_ucenter_pm_messages_1` (pmid, plid, authorid, message, delstatus, dateline) SELECT i.pmid, i.plid, p.msgfromid, IF(LENGTH(p.subject) > 0 AND STRCMP(p.subject, p.message), CONCAT(p.subject, '\r\n', p.message), p.message), IF(l.authorid = p.msgfromid, p.delstatus, IF(p.delstatus > 0, 3-p.delstatus, 0)), p.dateline FROM `cdb_ucenter_pm_indexes` i LEFT JOIN `uc_pms` p ON i.pmidold = p.pmid LEFT JOIN `cdb_ucenter_pm_lists` l ON i.plid = l.plid WHERE i.plid % 10 = 1;
    INSERT INTO `cdb_ucenter_pm_messages_2` (pmid, plid, authorid, message, delstatus, dateline) SELECT i.pmid, i.plid, p.msgfromid, IF(LENGTH(p.subject) > 0 AND STRCMP(p.subject, p.message), CONCAT(p.subject, '\r\n', p.message), p.message), IF(l.authorid = p.msgfromid, p.delstatus, IF(p.delstatus > 0, 3-p.delstatus, 0)), p.dateline FROM `cdb_ucenter_pm_indexes` i LEFT JOIN `uc_pms` p ON i.pmidold = p.pmid LEFT JOIN `cdb_ucenter_pm_lists` l ON i.plid = l.plid WHERE i.plid % 10 = 2;
    INSERT INTO `cdb_ucenter_pm_messages_3` (pmid, plid, authorid, message, delstatus, dateline) SELECT i.pmid, i.plid, p.msgfromid, IF(LENGTH(p.subject) > 0 AND STRCMP(p.subject, p.message), CONCAT(p.subject, '\r\n', p.message), p.message), IF(l.authorid = p.msgfromid, p.delstatus, IF(p.delstatus > 0, 3-p.delstatus, 0)), p.dateline FROM `cdb_ucenter_pm_indexes` i LEFT JOIN `uc_pms` p ON i.pmidold = p.pmid LEFT JOIN `cdb_ucenter_pm_lists` l ON i.plid = l.plid WHERE i.plid % 10 = 3;
    INSERT INTO `cdb_ucenter_pm_messages_4` (pmid, plid, authorid, message, delstatus, dateline) SELECT i.pmid, i.plid, p.msgfromid, IF(LENGTH(p.subject) > 0 AND STRCMP(p.subject, p.message), CONCAT(p.subject, '\r\n', p.message), p.message), IF(l.authorid = p.msgfromid, p.delstatus, IF(p.delstatus > 0, 3-p.delstatus, 0)), p.dateline FROM `cdb_ucenter_pm_indexes` i LEFT JOIN `uc_pms` p ON i.pmidold = p.pmid LEFT JOIN `cdb_ucenter_pm_lists` l ON i.plid = l.plid WHERE i.plid % 10 = 4;
    INSERT INTO `cdb_ucenter_pm_messages_5` (pmid, plid, authorid, message, delstatus, dateline) SELECT i.pmid, i.plid, p.msgfromid, IF(LENGTH(p.subject) > 0 AND STRCMP(p.subject, p.message), CONCAT(p.subject, '\r\n', p.message), p.message), IF(l.authorid = p.msgfromid, p.delstatus, IF(p.delstatus > 0, 3-p.delstatus, 0)), p.dateline FROM `cdb_ucenter_pm_indexes` i LEFT JOIN `uc_pms` p ON i.pmidold = p.pmid LEFT JOIN `cdb_ucenter_pm_lists` l ON i.plid = l.plid WHERE i.plid % 10 = 5;
    INSERT INTO `cdb_ucenter_pm_messages_6` (pmid, plid, authorid, message, delstatus, dateline) SELECT i.pmid, i.plid, p.msgfromid, IF(LENGTH(p.subject) > 0 AND STRCMP(p.subject, p.message), CONCAT(p.subject, '\r\n', p.message), p.message), IF(l.authorid = p.msgfromid, p.delstatus, IF(p.delstatus > 0, 3-p.delstatus, 0)), p.dateline FROM `cdb_ucenter_pm_indexes` i LEFT JOIN `uc_pms` p ON i.pmidold = p.pmid LEFT JOIN `cdb_ucenter_pm_lists` l ON i.plid = l.plid WHERE i.plid % 10 = 6;
    INSERT INTO `cdb_ucenter_pm_messages_7` (pmid, plid, authorid, message, delstatus, dateline) SELECT i.pmid, i.plid, p.msgfromid, IF(LENGTH(p.subject) > 0 AND STRCMP(p.subject, p.message), CONCAT(p.subject, '\r\n', p.message), p.message), IF(l.authorid = p.msgfromid, p.delstatus, IF(p.delstatus > 0, 3-p.delstatus, 0)), p.dateline FROM `cdb_ucenter_pm_indexes` i LEFT JOIN `uc_pms` p ON i.pmidold = p.pmid LEFT JOIN `cdb_ucenter_pm_lists` l ON i.plid = l.plid WHERE i.plid % 10 = 7;
    INSERT INTO `cdb_ucenter_pm_messages_8` (pmid, plid, authorid, message, delstatus, dateline) SELECT i.pmid, i.plid, p.msgfromid, IF(LENGTH(p.subject) > 0 AND STRCMP(p.subject, p.message), CONCAT(p.subject, '\r\n', p.message), p.message), IF(l.authorid = p.msgfromid, p.delstatus, IF(p.delstatus > 0, 3-p.delstatus, 0)), p.dateline FROM `cdb_ucenter_pm_indexes` i LEFT JOIN `uc_pms` p ON i.pmidold = p.pmid LEFT JOIN `cdb_ucenter_pm_lists` l ON i.plid = l.plid WHERE i.plid % 10 = 8;
    INSERT INTO `cdb_ucenter_pm_messages_9` (pmid, plid, authorid, message, delstatus, dateline) SELECT i.pmid, i.plid, p.msgfromid, IF(LENGTH(p.subject) > 0 AND STRCMP(p.subject, p.message), CONCAT(p.subject, '\r\n', p.message), p.message), IF(l.authorid = p.msgfromid, p.delstatus, IF(p.delstatus > 0, 3-p.delstatus, 0)), p.dateline FROM `cdb_ucenter_pm_indexes` i LEFT JOIN `uc_pms` p ON i.pmidold = p.pmid LEFT JOIN `cdb_ucenter_pm_lists` l ON i.plid = l.plid WHERE i.plid % 10 = 9;
    
    
    
    
    UPDATE `cdb_ucenter_pm_members` m, (SELECT plid, dateline FROM `cdb_ucenter_pm_messages_0` ORDER BY dateline DESC) msg SET m.lastdateline = msg.dateline WHERE m.plid % 10 = 0 AND m.plid = msg.plid;
    UPDATE `cdb_ucenter_pm_members` m, (SELECT plid, dateline FROM `cdb_ucenter_pm_messages_1` ORDER BY dateline DESC) msg SET m.lastdateline = msg.dateline WHERE m.plid % 10 = 1 AND m.plid = msg.plid;
    UPDATE `cdb_ucenter_pm_members` m, (SELECT plid, dateline FROM `cdb_ucenter_pm_messages_2` ORDER BY dateline DESC) msg SET m.lastdateline = msg.dateline WHERE m.plid % 10 = 2 AND m.plid = msg.plid;
    UPDATE `cdb_ucenter_pm_members` m, (SELECT plid, dateline FROM `cdb_ucenter_pm_messages_3` ORDER BY dateline DESC) msg SET m.lastdateline = msg.dateline WHERE m.plid % 10 = 3 AND m.plid = msg.plid;
    UPDATE `cdb_ucenter_pm_members` m, (SELECT plid, dateline FROM `cdb_ucenter_pm_messages_4` ORDER BY dateline DESC) msg SET m.lastdateline = msg.dateline WHERE m.plid % 10 = 4 AND m.plid = msg.plid;
    UPDATE `cdb_ucenter_pm_members` m, (SELECT plid, dateline FROM `cdb_ucenter_pm_messages_5` ORDER BY dateline DESC) msg SET m.lastdateline = msg.dateline WHERE m.plid % 10 = 5 AND m.plid = msg.plid;
    UPDATE `cdb_ucenter_pm_members` m, (SELECT plid, dateline FROM `cdb_ucenter_pm_messages_6` ORDER BY dateline DESC) msg SET m.lastdateline = msg.dateline WHERE m.plid % 10 = 6 AND m.plid = msg.plid;
    UPDATE `cdb_ucenter_pm_members` m, (SELECT plid, dateline FROM `cdb_ucenter_pm_messages_7` ORDER BY dateline DESC) msg SET m.lastdateline = msg.dateline WHERE m.plid % 10 = 7 AND m.plid = msg.plid;
    UPDATE `cdb_ucenter_pm_members` m, (SELECT plid, dateline FROM `cdb_ucenter_pm_messages_8` ORDER BY dateline DESC) msg SET m.lastdateline = msg.dateline WHERE m.plid % 10 = 8 AND m.plid = msg.plid;
    UPDATE `cdb_ucenter_pm_members` m, (SELECT plid, dateline FROM `cdb_ucenter_pm_messages_9` ORDER BY dateline DESC) msg SET m.lastdateline = msg.dateline WHERE m.plid % 10 = 9 AND m.plid = msg.plid;
    
    
    
    
    
    
    UPDATE `cdb_ucenter_pm_members` m, (SELECT plid, count(*) as pmnum FROM `cdb_ucenter_pm_messages_0` WHERE delstatus IN (0,1) GROUP BY plid) msg, `cdb_ucenter_pm_lists` l SET m.pmnum = msg.pmnum WHERE m.plid % 10 = 0 AND m.plid = msg.plid AND m.plid = l.plid AND IF(SUBSTRING_INDEX(l.min_max, '_', 1) = l.authorid, SUBSTRING_INDEX(l.min_max, '_', -1), l.authorid) = m.uid;
    UPDATE `cdb_ucenter_pm_members` m, (SELECT plid, count(*) as pmnum FROM `cdb_ucenter_pm_messages_0` WHERE delstatus IN (0,2) GROUP BY plid) msg, `cdb_ucenter_pm_lists` l SET m.pmnum = msg.pmnum WHERE m.plid % 10 = 0 AND m.plid = msg.plid AND m.plid = l.plid AND IF(SUBSTRING_INDEX(l.min_max, '_', 1) = l.authorid, l.authorid, SUBSTRING_INDEX(l.min_max, '_', -1)) = m.uid;
    UPDATE `cdb_ucenter_pm_members` m, (SELECT plid, count(*) as pmnum FROM `cdb_ucenter_pm_messages_1` WHERE delstatus IN (0,1) GROUP BY plid) msg, `cdb_ucenter_pm_lists` l SET m.pmnum = msg.pmnum WHERE m.plid % 10 = 1 AND m.plid = msg.plid AND m.plid = l.plid AND IF(SUBSTRING_INDEX(l.min_max, '_', 1) = l.authorid, SUBSTRING_INDEX(l.min_max, '_', -1), l.authorid) = m.uid;
    UPDATE `cdb_ucenter_pm_members` m, (SELECT plid, count(*) as pmnum FROM `cdb_ucenter_pm_messages_1` WHERE delstatus IN (0,2) GROUP BY plid) msg, `cdb_ucenter_pm_lists` l SET m.pmnum = msg.pmnum WHERE m.plid % 10 = 1 AND m.plid = msg.plid AND m.plid = l.plid AND IF(SUBSTRING_INDEX(l.min_max, '_', 1) = l.authorid, l.authorid, SUBSTRING_INDEX(l.min_max, '_', -1)) = m.uid;
    UPDATE `cdb_ucenter_pm_members` m, (SELECT plid, count(*) as pmnum FROM `cdb_ucenter_pm_messages_2` WHERE delstatus IN (0,1) GROUP BY plid) msg, `cdb_ucenter_pm_lists` l SET m.pmnum = msg.pmnum WHERE m.plid % 10 = 2 AND m.plid = msg.plid AND m.plid = l.plid AND IF(SUBSTRING_INDEX(l.min_max, '_', 1) = l.authorid, SUBSTRING_INDEX(l.min_max, '_', -1), l.authorid) = m.uid;
    UPDATE `cdb_ucenter_pm_members` m, (SELECT plid, count(*) as pmnum FROM `cdb_ucenter_pm_messages_2` WHERE delstatus IN (0,2) GROUP BY plid) msg, `cdb_ucenter_pm_lists` l SET m.pmnum = msg.pmnum WHERE m.plid % 10 = 2 AND m.plid = msg.plid AND m.plid = l.plid AND IF(SUBSTRING_INDEX(l.min_max, '_', 1) = l.authorid, l.authorid, SUBSTRING_INDEX(l.min_max, '_', -1)) = m.uid;
    UPDATE `cdb_ucenter_pm_members` m, (SELECT plid, count(*) as pmnum FROM `cdb_ucenter_pm_messages_3` WHERE delstatus IN (0,1) GROUP BY plid) msg, `cdb_ucenter_pm_lists` l SET m.pmnum = msg.pmnum WHERE m.plid % 10 = 3 AND m.plid = msg.plid AND m.plid = l.plid AND IF(SUBSTRING_INDEX(l.min_max, '_', 1) = l.authorid, SUBSTRING_INDEX(l.min_max, '_', -1), l.authorid) = m.uid;
    UPDATE `cdb_ucenter_pm_members` m, (SELECT plid, count(*) as pmnum FROM `cdb_ucenter_pm_messages_3` WHERE delstatus IN (0,2) GROUP BY plid) msg, `cdb_ucenter_pm_lists` l SET m.pmnum = msg.pmnum WHERE m.plid % 10 = 3 AND m.plid = msg.plid AND m.plid = l.plid AND IF(SUBSTRING_INDEX(l.min_max, '_', 1) = l.authorid, l.authorid, SUBSTRING_INDEX(l.min_max, '_', -1)) = m.uid;
    UPDATE `cdb_ucenter_pm_members` m, (SELECT plid, count(*) as pmnum FROM `cdb_ucenter_pm_messages_4` WHERE delstatus IN (0,1) GROUP BY plid) msg, `cdb_ucenter_pm_lists` l SET m.pmnum = msg.pmnum WHERE m.plid % 10 = 4 AND m.plid = msg.plid AND m.plid = l.plid AND IF(SUBSTRING_INDEX(l.min_max, '_', 1) = l.authorid, SUBSTRING_INDEX(l.min_max, '_', -1), l.authorid) = m.uid;
    UPDATE `cdb_ucenter_pm_members` m, (SELECT plid, count(*) as pmnum FROM `cdb_ucenter_pm_messages_4` WHERE delstatus IN (0,2) GROUP BY plid) msg, `cdb_ucenter_pm_lists` l SET m.pmnum = msg.pmnum WHERE m.plid % 10 = 4 AND m.plid = msg.plid AND m.plid = l.plid AND IF(SUBSTRING_INDEX(l.min_max, '_', 1) = l.authorid, l.authorid, SUBSTRING_INDEX(l.min_max, '_', -1)) = m.uid;
    UPDATE `cdb_ucenter_pm_members` m, (SELECT plid, count(*) as pmnum FROM `cdb_ucenter_pm_messages_5` WHERE delstatus IN (0,1) GROUP BY plid) msg, `cdb_ucenter_pm_lists` l SET m.pmnum = msg.pmnum WHERE m.plid % 10 = 5 AND m.plid = msg.plid AND m.plid = l.plid AND IF(SUBSTRING_INDEX(l.min_max, '_', 1) = l.authorid, SUBSTRING_INDEX(l.min_max, '_', -1), l.authorid) = m.uid;
    UPDATE `cdb_ucenter_pm_members` m, (SELECT plid, count(*) as pmnum FROM `cdb_ucenter_pm_messages_5` WHERE delstatus IN (0,2) GROUP BY plid) msg, `cdb_ucenter_pm_lists` l SET m.pmnum = msg.pmnum WHERE m.plid % 10 = 5 AND m.plid = msg.plid AND m.plid = l.plid AND IF(SUBSTRING_INDEX(l.min_max, '_', 1) = l.authorid, l.authorid, SUBSTRING_INDEX(l.min_max, '_', -1)) = m.uid;
    UPDATE `cdb_ucenter_pm_members` m, (SELECT plid, count(*) as pmnum FROM `cdb_ucenter_pm_messages_6` WHERE delstatus IN (0,1) GROUP BY plid) msg, `cdb_ucenter_pm_lists` l SET m.pmnum = msg.pmnum WHERE m.plid % 10 = 6 AND m.plid = msg.plid AND m.plid = l.plid AND IF(SUBSTRING_INDEX(l.min_max, '_', 1) = l.authorid, SUBSTRING_INDEX(l.min_max, '_', -1), l.authorid) = m.uid;
    UPDATE `cdb_ucenter_pm_members` m, (SELECT plid, count(*) as pmnum FROM `cdb_ucenter_pm_messages_6` WHERE delstatus IN (0,2) GROUP BY plid) msg, `cdb_ucenter_pm_lists` l SET m.pmnum = msg.pmnum WHERE m.plid % 10 = 6 AND m.plid = msg.plid AND m.plid = l.plid AND IF(SUBSTRING_INDEX(l.min_max, '_', 1) = l.authorid, l.authorid, SUBSTRING_INDEX(l.min_max, '_', -1)) = m.uid;
    UPDATE `cdb_ucenter_pm_members` m, (SELECT plid, count(*) as pmnum FROM `cdb_ucenter_pm_messages_7` WHERE delstatus IN (0,1) GROUP BY plid) msg, `cdb_ucenter_pm_lists` l SET m.pmnum = msg.pmnum WHERE m.plid % 10 = 7 AND m.plid = msg.plid AND m.plid = l.plid AND IF(SUBSTRING_INDEX(l.min_max, '_', 1) = l.authorid, SUBSTRING_INDEX(l.min_max, '_', -1), l.authorid) = m.uid;
    UPDATE `cdb_ucenter_pm_members` m, (SELECT plid, count(*) as pmnum FROM `cdb_ucenter_pm_messages_7` WHERE delstatus IN (0,2) GROUP BY plid) msg, `cdb_ucenter_pm_lists` l SET m.pmnum = msg.pmnum WHERE m.plid % 10 = 7 AND m.plid = msg.plid AND m.plid = l.plid AND IF(SUBSTRING_INDEX(l.min_max, '_', 1) = l.authorid, l.authorid, SUBSTRING_INDEX(l.min_max, '_', -1)) = m.uid;
    UPDATE `cdb_ucenter_pm_members` m, (SELECT plid, count(*) as pmnum FROM `cdb_ucenter_pm_messages_8` WHERE delstatus IN (0,1) GROUP BY plid) msg, `cdb_ucenter_pm_lists` l SET m.pmnum = msg.pmnum WHERE m.plid % 10 = 8 AND m.plid = msg.plid AND m.plid = l.plid AND IF(SUBSTRING_INDEX(l.min_max, '_', 1) = l.authorid, SUBSTRING_INDEX(l.min_max, '_', -1), l.authorid) = m.uid;
    UPDATE `cdb_ucenter_pm_members` m, (SELECT plid, count(*) as pmnum FROM `cdb_ucenter_pm_messages_8` WHERE delstatus IN (0,2) GROUP BY plid) msg, `cdb_ucenter_pm_lists` l SET m.pmnum = msg.pmnum WHERE m.plid % 10 = 8 AND m.plid = msg.plid AND m.plid = l.plid AND IF(SUBSTRING_INDEX(l.min_max, '_', 1) = l.authorid, l.authorid, SUBSTRING_INDEX(l.min_max, '_', -1)) = m.uid;
    UPDATE `cdb_ucenter_pm_members` m, (SELECT plid, count(*) as pmnum FROM `cdb_ucenter_pm_messages_9` WHERE delstatus IN (0,1) GROUP BY plid) msg, `cdb_ucenter_pm_lists` l SET m.pmnum = msg.pmnum WHERE m.plid % 10 = 9 AND m.plid = msg.plid AND m.plid = l.plid AND IF(SUBSTRING_INDEX(l.min_max, '_', 1) = l.authorid, SUBSTRING_INDEX(l.min_max, '_', -1), l.authorid) = m.uid;
    UPDATE `cdb_ucenter_pm_members` m, (SELECT plid, count(*) as pmnum FROM `cdb_ucenter_pm_messages_9` WHERE delstatus IN (0,2) GROUP BY plid) msg, `cdb_ucenter_pm_lists` l SET m.pmnum = msg.pmnum WHERE m.plid % 10 = 9 AND m.plid = msg.plid AND m.plid = l.plid AND IF(SUBSTRING_INDEX(l.min_max, '_', 1) = l.authorid, l.authorid, SUBSTRING_INDEX(l.min_max, '_', -1)) = m.uid;
    
    
    
    
    
    
    ALTER TABLE `cdb_ucenter_pm_indexes`
      DROP `pmidold`;
    
    
    
    
    
    
    
    
    另外 discuz 的附件表 分表了 分成一个索引表 cdb_forum_attachment 还有0-9的附件详情表 cdb_forum_attachment_$1 根据 tid决定的最后一位决定存放的表 用php处理下把
    query("select a.*,f.description from `cdb_attachments` as a left join `cdb_attachmentfields` as f on a.aid=f.aid  limit 9999999");
    $a=0;
    while($r=$db->fetch_array($query)){
    	$tableid=substr($r['tid'],-1);
    	$at[]=array('aid'=>$r['aid'],	'tid'=>$r['tid'],'pid'=>$r['pid'],'uid'=>$r['uid'],'tableid'=>$tableid,'downloads'=>$r['downloads']);
    	$atb[$tableid][]=array(
    	'aid'=>$r['aid'],
    	'tid'=>$r['tid'],
    	'pid'=>$r['pid'],
    	'uid'=>$r['uid'],
    	'dateline'=>$r['dateline'],
    	'filename'=>daddslashes($r['filename']),
    	'filesize'=>$r['filesize'],
    	'attachment'=>$r['attachment'],
    	'remote'=>0,
    	'description'=>daddslashes($r['description']),
    	'readperm'=>$r['readperm'],
    	'price'=>$r['price'],
    	'isimage'=>$r['isimage'],
    	'width'=>$r['width'],
    	'thumb'=>$r['thumb'],
    	'picid'=>$r['picid'],
    	);
    	$a++;
    	$atcount[$tableid]++;
    	}
    	echo "数量 :$a     \r\n";
    $db->query("TRUNCATE TABLE `cdb_forum_attachment`");
    	$sql="INSERT INTO `cdb_forum_attachment` (`aid`, `tid`, `pid`, `uid`, `tableid`, `downloads`) VALUES";
    	foreach($at as $a){
    		$sql.="('{$a['aid']}','{$a['tid']}','{$a['pid']}','{$a['uid']}','{$a['tableid']}','{$a['downloads']}'),";
    		}
    	$sql=substr($sql,0,-1);	
    	$db->query($sql);
    	for($i=0;$i<10;$i++){
    			$db->query("TRUNCATE TABLE `cdb_forum_attachment_$i`");
    $sql="INSERT INTO `discuz_new`.`cdb_forum_attachment_$i` (`aid`, `tid`, `pid`, `uid`, `dateline`, `filename`, `filesize`, `attachment`, `remote`, `description`, `readperm`, `price`, `isimage`, `width`, `thumb`, `picid`) VALUES ";
    	foreach($atb[$i] as $a){
    		$sql.="('{$a['aid']}','{$a['tid']}','{$a['pid']}','{$a['uid']}','{$a['dateline']}','{$a['filename']}','{$a['filesize']}','{$a['attachment']}','{$a['remote']}','{$a['description']}','{$a['readperm']}','{$a['price']}','{$a['isimage']}','{$a['width']}','{$a['thumb']}','{$a['picid']}'),";
    		}
    	$sql=substr($sql,0,-1);	
    	//echo $sql;		
    	$db->query($sql);
    		echo "已完成 表 $i 共有  {$atcount[$i]} 条记录 \r\n";
    		}
    
    ?>
    
    
    
    只要熟悉 表结构。这些挺容易操作的 用这样的方法 可以把任意一个论坛系统自由的转来转去。
    Mar/12/2012 20:37
    评论(0)
  • android 短信完美备份

    我的G1用了好久了 实在按耐不住 决定刷机了 却发现原来1.5中备份的短信无法在1。6中导入 试了N多种工具 其中包括 91助手 后来发现 原来android使用的数据库为sqlite 只要找到数据库存放的位置 直接复制文件就OK 啦
    cd /data/data/com.android.providers.telephony/databases/
    # ls
    ls
    mmssms.db
    telephony.db
    #
    
    
    其中有2个文件 一个是mmssms.db就是短信的数据库 另一个貌似是电话记录吧
    E:\android\sdk\android-sdk-windows\tools>sqlite3 mmssms.db
    SQLite version 3.5.9
    Enter ".help" for instructions
    sqlite> select * from sms;
    1|1|+86136****8332||1265257968682||1|-1|2|||Xiaozhu?|
    2|2|1860****190|114|1265267997786|0|1|-1|1|0||body|+8613800210500
    
    用sqlite3就可以打开了 这里说下 我在ubuntu上用sqlite说是加密或格式不对 请重新安装sqlite3 ubuntu貌似是sqlite 2.8
    Feb/10/2010 16:13
    评论(0)
  • 青浦之家上用的过滤URL类广告for discuz

    实在是无法忍受那些群发广告 加了个过滤的判断 大家需要就拿去用吧 本插件使用于:青浦论坛 新注册用户的组 无法发布URL连接 只有发贴或其他方式得到得到更高的级别 才可以使用URL 效果见图片 url过滤 安装方法 请一定要备份原来的文件,这是个良好的习惯 方法一: 自己修改代码
    $tagstatus = $tagstatus && $forum['allowtag'] ? ($tagstatus == 2 ? 2 : $forum['allowtag']) : 0;
    
    在下面加上
    //为防止混乱自己加上注释-下面一行是URL过滤调用的文件
    require_once DISCUZ_ROOT.'./include/qphome_spam.inc.php';
    
    另外关于消息提示的文字 请大家自己修改下吧 [color=Red]templates/default/message.lang.php 第133行 请自己把中文修改成想看到的格式[/color] 不会改的去DISCUZ下附件 这个只是个简单的URL 过滤 如果有大家有更好的方法,或更好的正则 贴出来大家分享 主要代码
    result_first("SELECT groupid FROM {$tablepre}members WHERE uid='$discuz_uid'");
    if($newusergroup['groupid'] =='10'){
    if(preg_match("\[url(=((.*){1}:\/\/|www\.)([^\[\"']+?))?\](.+?)\[\/url\]",$message)){
    showmessage('qphome_url_erro');
    }
    }
    ?>
    
    再分享段 QQ366921提到的手机 号 试了好久 呵呵
    if(preg_match("/^0{0,1}(13[4-9]|15[7-9]|15[0-2]|18[7-8])[0-9]{8}$/",$message)){
    showmessage('qphome_mobile_erro');
    }
    
    
    Oct/15/2009 20:25
    评论(0)
  • 人品计算器算法

    人品计算器 一个十分老套的娱乐FLASH 权权在群里又发了 姓名:朱钟权 人品得分:99 评价:你是世人的榜样! 我哥真背啊 1分。 我见过的最低分 姓名:吴少群 人品得分:1 评价:算了,跟你没什么人品好谈的... 我也好不到哪去啊 姓名:钱礼骏 人品得分:68 评价:你的人品勉勉强强..要自己好自为之.. 哈这都可以 姓名:午夜yingou 人品得分:99 评价:你是世人的榜样! 为了扭转趋势 来看看到底是怎么计算的 参考下FLASH 的脚本
    function nameResult(str)
    {
        var _loc1 = checkPreList(str);
        if (_loc1 == null)
        {
            _loc1 = getResult(str);
        } // end if
        var _loc2 = "姓名:" + str + "\n";
        _loc2 = _loc2 + ("人品得分:" + foramtResult(_loc1) + "\n");
        _loc2 = _loc2 + ("评价:" + getValue(_loc1));
        return (_loc2);
    } // End of the function
    function foramtResult(n)
    {
        return (n >= 0 && n <= 100 ? (n) : ("负溢出")); } // End of the function function getValue(n) {     var _loc2 = "";     if (n == 0)     {         _loc2 = "你一定不是人吧?怎么一点人品都没有?!";     }     else if (n > 0 && n <= 5)     {         _loc2 = "算了,跟你没什么人品好谈的...";     }     else if (n > 5 && n <= 10)     {         _loc2 = "是我不好...不应该跟你谈人品问题的...";     }     else if (n > 10 && n <= 15)     {         _loc2 = "杀过人没有?放过火没有?你应该无恶不做吧?";     }     else if (n > 15 && n <= 20)     {         _loc2 = "你貌似应该三岁就偷看隔壁大妈洗澡的吧...";     }     else if (n > 20 && n <= 25)     {         _loc2 = "你的人品之低下实在让人惊讶啊...";     }     else if (n > 25 && n <= 30)     {         _loc2 = "你的人品太差了。你应该有干坏事的嗜好吧?";     }     else if (n > 30 && n <= 35)     {         _loc2 = "你的人品真差!肯定经常做偷鸡摸狗的事...";     }     else if (n > 35 && n <= 40)     {         _loc2 = "你拥有如此差的人品请经常祈求佛祖保佑你吧...";     }     else if (n > 40 && n <= 45)     {         _loc2 = "老实交待..那些论坛上面经常出现的偷拍照是不是你的杰作?";     }     else if (n > 45 && n <= 50)     {         _loc2 = "你随地大小便之类的事没少干吧?";     }     else if (n > 50 && n <= 55)     {         _loc2 = "你的人品太差了..稍不小心就会去干坏事了吧?";     }     else if (n > 55 && n <= 60)     {         _loc2 = "你的人品很差了..要时刻克制住做坏事的冲动哦..";     }     else if (n > 60 && n <= 65)     {         _loc2 = "你的人品比较差了..要好好的约束自己啊..";     }     else if (n > 65 && n <= 70)     {         _loc2 = "你的人品勉勉强强..要自己好自为之..";     }     else if (n > 70 && n <= 75)     {         _loc2 = "有你这样的人品算是不错了..";     }     else if (n > 75 && n <= 80)     {         _loc2 = "你有较好的人品..继续保持..";     }     else if (n > 80 && n <= 85)     {         _loc2 = "你的人品不错..应该一表人才吧?";     }     else if (n > 85 && n <= 90)     {         _loc2 = "你的人品真好..做好事应该是你的爱好吧..";     }     else if (n > 90 && n <= 95)     {         _loc2 = "你的人品太好了..你就是当代活雷锋啊...";     }     else if (n > 95 && n <= 99)
        {
            _loc2 = "你是世人的榜样!";
        }
        else if (n == 100)
        {
            _loc2 = "天啦!你不是人!你是神!!!";
        }
        else
        {
            _loc2 = "你的人品竟然负溢出了...我对你无语..";
        } // end else if
        return (_loc2);
    } // End of the function
    function getResult(str)
    {
        var _loc3 = 0;
        for (var _loc1 = 0; _loc1 < str.length; ++_loc1)
        {
            _loc3 = _loc3 + str.charCodeAt(_loc1);
        } // end of for
        return (_loc3 % 100);
    } // End of the function
    function checkPreList(str)
    {
        var _loc1 = null;
        for (var _loc3 in PrenameList)
        {
            if (PrenameList[_loc3][0] == str)
            {
                _loc1 = PrenameList[_loc3][1];
                break;
            } // end if
        } // end of for...in
        return (_loc1);
    } // End of the function
    PrenameList = new Array();
    PrenameList.push(["日本人", -1]);
    PrenameList.push(["小日本", -1]);
    PrenameList.push(["日本", -1]);
    PrenameList.push(["日本鬼子", -1]);
    getURL("FSCommand:showmenu", false);
    inputName.maxChars = 20;
    resultArea.text = "请输入要计算的名字 然后点击计算按钮\n本程序内容纯属构 仅供娱乐之用\n如有雷同 纯属巧合\n----------by cordy";
    okBtAction = new Object();
    okBtAction.click = function ()
    {
        var _loc1 = inputName.text;
        _loc1 = _loc1.split(" ").join("");
        _loc1 = _loc1.split(" ").join("");
        _loc1 = _loc1.split("\t").join("");
        inputName.text = _loc1;
        if (_loc1 == "")
        {
            resultArea.text = "请先输入要计算的名字";
        }
        else
        {
            resultArea.text = nameResult(_loc1);
        } // end else if
    };
    okBt.addEventListener("click", okBtAction);
    这个算发 遍历你输入的每个字符,然后求和之后再和100求余数 用PHP来验证结果 把 钱 礼 骏 分别转换成是UNICODE 然后相加 然后计算余数 PHP:
    ". mod(getUnicodeFromOneUTF8("钱"));
     echo "
    ". mod(getUnicodeFromOneUTF8("钱")+getUnicodeFromOneUTF8("礼")+getUnicodeFromOneUTF8("骏"));
    function mod($num)
    {
    return $num %100;
    } 
    
    function getUnicodeFromOneUTF8($word) {
      if (is_array( $word))
        $arr = $word;
      else
        $arr = str_split($word);
      $bin_str = '';
      foreach ($arr as $value)
        $bin_str .= decbin(ord($value));
      $bin_str = preg_replace('/^.{4}(.{4}).{2}(.{6}).{2}(.{6})$/','$1$2$3', $bin_str);
      return bindec($bin_str); //返回类似20320, 汉字"你"
    }
    ?>
    最后的结果为 65 68 钱=65 钱礼骏=68 跟人品计算器的结果相同 姓名:钱 人品得分:65 评价:你的人品比较差了..要好好的约束自己啊.. 姓名:钱礼骏 人品得分:68 评价:你的人品勉勉强强..要自己好自为之.. 因为是余数 所以结果只能是 00-99
    Oct/23/2009 23:31
    评论(0)
  • MySQL导出导入命令

    备份数据需要用的..先收藏 经常需要翻翻的 只是图一个方便 1.导出整个数据库 mysqldump -u 用户名 -p 数据库名 > 导出的文件名 mysqldump -u yingouqlj -p qphome > qphome.sql 2.导出一个表 mysqldump -u 用户名 -p 数据库名 表名> 导出的文件名 mysqldump -u yingouqlj -p qphome cdb_users> qp_users.sql 3.导出一个数据库结构 mysqldump -u yingouqlj -p -d --add-drop-table q_wifi >d:q_wifi.sql -d 没有数据 --add-drop-table 在每个create语句之前增加一个drop table 4.导入数据库 常用source 命令 进入mysql数据库控制台, 如mysql -u root -p mysql>use 数据库 然后使用source命令,后面参数为脚本文件(如这里用到的.sql) mysql>source d:yg_db.sql 详细介绍 导出要用到MySQL的mysqldump工具,基本用法是: shell> mysqldump [OPTIONS] database [tables] 如果你不给定任何表,整个数据库将被导出。 通过执行mysqldump --help,你能得到你mysqldump的版本支持的选项表。 注意,如果你运行mysqldump没有--quick或--opt选项,mysqldump将在导出结果前装载整个结果集到内存中,如果你正在导出一个大的数据库,这将可能是一个问题。 mysqldump支持下列选项: --add-locks 在每个表导出之前增加LOCK TABLES并且之后UNLOCK TABLE。(为了使得更快地插入到MySQL)。 --add-drop-table 在每个create语句之前增加一个drop table。 --allow-keywords 允许创建是关键词的列名字。这由表名前缀于每个列名做到。 -c, --complete-insert 使用完整的insert语句(用列名字)。 -C, --compress 如果客户和服务器均支持压缩,压缩两者间所有的信息。 --delayed 用INSERT DELAYED命令插入行。 -e, --extended-insert 使用全新多行INSERT语法。(给出更紧缩并且更快的插入语句) -#, --debug[=option_string] 跟踪程序的使用(为了调试)。 --help 显示一条帮助消息并且退出。 --fields-terminated-by=...   --fields-enclosed-by=...   --fields-optionally-enclosed-by=...   --fields-escaped-by=...   --fields-terminated-by=... 这些选择与-T选择一起使用,并且有相应的LOAD DATA INFILE子句相同的含义。 LOAD DATA INFILE语法。 -F, --flush-logs 在开始导出前,洗掉在MySQL服务器中的日志文件。 -f, --force, 即使我们在一个表导出期间得到一个SQL错误,继续。 -h, --host=.. 从命名的主机上的MySQL服务器导出数据。缺省主机是localhost。 -l, --lock-tables. 为开始导出锁定所有表。 -t, --no-create-info 不写入表创建信息(CREATE TABLE语句) -d, --no-data 不写入表的任何行信息。如果你只想得到一个表的结构的导出,这是很有用的! --opt 同--quick --add-drop-table --add-locks --extended-insert --lock-tables。 应该给你为读入一个MySQL服务器的尽可能最快的导出。 -pyour_pass, --password[=your_pass] 与服务器连接时使用的口令。如果你不指定“=your_pass”部分,mysqldump需要来自终端的口令。 -P port_num, --port=port_num 与一台主机连接时使用的TCP/IP端口号。(这用于连接到localhost以外的主机,因为它使用 Unix套接字。) -q, --quick 不缓冲查询,直接导出至stdout;使用mysql_use_result()做它。 -S /path/to/socket, --socket=/path/to/socket 与localhost连接时(它是缺省主机)使用的套接字文件。 -T, --tab=path-to-some-directory 对于每个给定的表,创建一个table_name.sql文件,它包含SQL CREATE 命令,和一个table_name.txt文件,它包含数据。 注意:这只有在mysqldump运行在mysqld守护进程运行的同一台机器上的时候才工作。.txt文件的格式根据--fields-xxx和--lines--xxx选项来定。 -u user_name, --user=user_name 与服务器连接时,MySQL使用的用户名。缺省值是你的Unix登录名。 -O var=option, --set-variable var=option设置一个变量的值。可能的变量被列在下面。 -v, --verbose 冗长模式。打印出程序所做的更多的信息。 -V, --version 打印版本信息并且退出。 -w, --where='where-condition' 只导出被选择了的记录;注意引号是强制的! "--where=user='jimf'" "-wuserid>1" "-wuserid<1" 最常见的mysqldump使用可能制作整个数据库的一个备份: mysqldump --opt database > backup-file.sql 但是它对用来自于一个数据库的信息充实另外一个MySQL数据库也是有用的: mysqldump --opt database | mysql --host=remote-host -C database 由于mysqldump导出的是完整的SQL语句,所以用mysql客户程序很容易就能把数据导入了: shell> mysqladmin create target_db_name shell> mysql target_db_name < backup-file.sql 就是 shell> mysql 库名 < 文件名
    Jul/10/2009 10:21
    评论(0)
  • dlink-524m无线路由器去天线改SMA头

    换天线 DLINK 524M 的天线是不可拆卸的 拆了路由器(1年包换呢..还没过保,就这么拆了) [file:125] 买的馈线以及 SMA头 [file:126] 哎这点东西花了 五十多米 呢 , 好贵. 貌似这线短了 10CM 不够啊 [file:127] MOD玩家必备的YY 装备,, [file:128] 只能在侧面装SMA头了 这个位置刚好 DREMEL很好用,..力道大,,方便 [file:129] 加SMA头 [file:130] 完成了 [file:131] [file:132]
    Apr/01/2009 16:03
    评论(0)
  • sagem 5061s改SMA(侧改)

    SAGEM(萨基姆)WL5061S 特点 与瑞银同种芯片GW38871K

    2手 不支持BT3 灵敏度较高 2手洋垃圾,适合DIY玩家 此次改SMA头, 原貌 qljSAGEM 760N相比 有屏蔽层 呵呵 [caption id="" align="aligncenter" width="818" caption="sagem 5061s侧改"][/caption] 侧改的样子比较帅.. 嘿嘿

    May/29/2009 12:28
    评论(0)
  • 青浦之家微信打印机

    微信还有一个火爆的产品就是微信打印机咯。 原理很简单,收消息的接口 收到图片验证后,发给打印机。 查看了网上的产品都卖的比较贵,只好自己写了玩玩啦。 初步的成本计算,电脑+喷墨打印机+耗材。 喷墨打印机的选择,最好选择连供方式的打印机,耗材成本低。 ###自己做了个视频演示 > ####题外话 > 试了各种软件,微视,快拍等都无法完成效果,最后还是一段一段录制视频,iMovie编辑。。这软件挺简单的。不错! 简单介绍下我这个版本。 * 采用linux。 1. 缺点:无法以软件形式出售给商家,(就是无法在商家现有的电脑上直接安装软件)。 2. 缺点:无法去教会商家自行修改等复杂操作。 3. 优点:定制好后,可脱离键盘鼠标操作。 4. 优点:开发容易。 5. 优点:成本低,低配置电脑,开发板(我在树莓派运行。成本低至极点!!) * 使用PHP nodejs 1. 依然依赖浏览器,BS架构,好处是CSS可直接简单做好漂亮的页面。 2. 不能像软件一样交由商家操作。 3. php模块CURL,GD,一个用于下载图片,一个用于合并模版+照片缩放。 4. 代替平是NGINX+PHP CLI (自行脑洞吧。。权限略麻烦) * 使用cups 1. 有主流驱动,但是好多硬件设备不支持。我用的EPSON L301需单独安装驱动,但是官网没有ARM驱动。
    [file:149][file:148]
    [file:151] 下面的代码主要是本地端的 选择了NODEJS的原因。 可以通过NODEJS转发解决跨域问题。 直接调用命令执行lp打印 其中注释掉的基本是余留的旧代码。。可无视。起初选择了一些打印组件。但是都存在一些小问题。实在无奈。。查阅手册发现直接调用命令 很简单! [javascript] var http=require('http'); var url=require('url'); var urlparse = url.parse; var fs=require('fs'); var child_process=require('child_process'); //var mine=require('./mine').types; var path=require('path'); //var Printer=require('lp-client'); var express = require('express'); var options={}; options.destination='EPSON L300 Series'; options.debug=false; var app = express(); app.use("/proxy", function (req, res) { var url = req.url.substr(6); var target = urlparse(url); var headers = {}; for (var k in req.headers) { if (k === 'host' || k === 'connection') { continue; } headers[k] = req.headers[k]; } //console.log(url); //console.log(target.path); var options = { host: target.hostname, port: target.port || 80, path: target.path, method: req.method, headers: headers }; var proxyReq = http.request(options, function (response) { res.writeHead(response.statusCode, response.headers); response.on('data', function (chunk) { res.write(chunk); }); response.on('end', function () { res.end(); }); }); proxyReq.on('error', function (err) { proxyReq.abort(); res.writeHead(500); res.end(url + ' error: ' + err.message); }); req.on('data', function (chunk) { proxyReq.write(chunk); }); req.on('end', function () { proxyReq.end(); }); }); app.use("/printer", function (req, res) { var params=url.parse(req.url,true).query; try{ // var qlp=new Printer(options); //qlp.queueFile('/var/www/html/wx_photos/print/'+params.dourl); //delete(qlp); var lcmd='lp /var/www/html/wx_photos/print/'+params.dourl+' > /var/www/html/wx_photos/log/'+params.dourl+'.log'; var ch=child_process.exec(lcmd, function(error,stdout,stderr){ console.log(stdout); console.log(stderr); console.log(error); } ); }catch(error){ console.log(error); } console.log('打印'+params.dourl); res.write('1'); }); app.use(express.static(__dirname + '/qpweb')); app.listen(2017); console.log('青浦之家打印服务已启动');
    Sep/28/2014 23:47
    评论(0)
  • cookies 域名中 点前缀的问题

    情况是这样的 在做 青浦之家WIFI鉴权程序的时候发生了2个cookies键值 区别在于 wifi.qphome.com .wifi.qphome.com 而读取的时候 读取了第一个 Domain=domain Optional. The Domain attribute specifies the domain for which the cookie is valid. An explicitly specified domain must always start with a dot. 规范中提到了 如果是个明确的域名. 开始出就会带点
    Sep/11/2014 11:10
    评论(0)
  • osx更换SSD后开启TRIM支持

    MACBOOKPRO用的是传统磁盘,由于开机速度,应用程序打开速度越来越慢改换SSD 只需要输入四条命令即可 [bash] sudo cp /System/Library/Extensions/IOAHCIFamily.kext/Contents/PlugIns/IOAHCIBlockStorage.kext/Contents/MacOS/IOAHCIBlockStorage /System/Library/Extensions/IOAHCIFamily.kext/Contents/PlugIns/IOAHCIBlockStorage.kext/Contents/MacOS/IOAHCIBlockStorage.original sudo perl -pi -e 's|(\x52\x6F\x74\x61\x74\x69\x6F\x6E\x61\x6C\x00).{9}(\x00\x54)|$1\x00\x00\x00\x00\x00\x00\x00\x00\x00$2|sg' /System/Library/Extensions/IOAHCIFamily.kext/Contents/PlugIns/IOAHCIBlockStorage.kext/Contents/MacOS/IOAHCIBlockStorage sudo kextcache -system-prelinked-kernel sudo kextcache -system-caches 期间如果出现错误 Can’t create kext cache under / – owner not root 执行下面操作 [bash] sudo chown root:admin / 重启后看效果 [file:122]
    Oct/20/2013 13:34
    评论(0)
  • 空调遥控器与ARDUINO红外接收器

    淘宝买的空调万能遥控器(万能的淘宝19元包邮) 当然啦.这本来就是个10块钱的东西嘛= = 这遥控器还是挺好玩的存储了大量遥控器的码表.长按对应品牌的按钮.即可开始对码.松开后就存储下来了. 想起来以前买的arduino都没用咋玩过.也刚好里面有红外接收器,翻了出来. [file:112] [file:111] 图片使用fritzing生成. 需要使用到的库 请这边下载 https://github.com/shirriff/Arduino-IRremote 下载解压后更名为IRremote并导入 导入方法: [file:107] HS38B红外接收头正面超上,从左到右边依次对应OUT,GND,VCC+5V [file:109] 代码 [arduino] /* * IRremote: IRrecvDemo - demonstrates receiving IR codes with IRrecv * An IR detector/demodulator must be connected to the input RECV_PIN. * Version 0.1 July, 2009 * Copyright 2009 Ken Shirriff * [url]http://arcfn.com[/url] */ #include int RECV_PIN = 11;//定义红外接收器的引脚为11 IRrecv irrecv(RECV_PIN); decode_results results; void setup() { Serial.begin(9600); irrecv.enableIRIn(); // 初始化红外接收器 Serial.println('started'); } void loop() { if (irrecv.decode(&results)) { Serial.println(results.value, HEX);//以16进制换行输出接收代码 Serial.println('---------');//为了便于观看输出结果增加一个空行 irrecv.resume(); // 接收下一个值 } } 最终输出结果 [file:108] 可能是空调的缘故(富士通的)有趣的是 当设置温度是.按下上或下.都会发送一串值,随后发送一下FFFF空置..再连续发送几串值.虽没蛋疼的去理解这几段是什么意思,猜测是将遥控器上的当前状态发送一下.比如温度,风速之类的.同步一下. 当然富士通的遥控器就是这样.当调节温度的时候空调是没反应的.此时遥控器可连续调节温度.直到停止调节后的2秒.空调才滴滴一响.. 这东西还是挺好玩的.一个邪恶的念头.. 记录大部分空调的值..然后循环一个个的测试过来.帮别人在夏天把空调都改成制热... 在小区游走一遍对着窗户照吧..哈哈哈哈
    Aug/31/2013 05:03
    评论(0)
  • 从google map api导入商家信息

    最近着手做o2o项目 需要用到很多商户信息,关键是还需要商家的经纬度 起初,手动添加,然后通过GOOGLEMAPAPI 标记位置存储到数据库 可是这样添加效率太低了,决定从GOOGLE这边获取信息导入 ###参考GOOGLE MAP开发手册 ####应用场景 1. 使用地方搜索,拖动MARKER后获取附近商家列表 2. 点击列表,使用地方详情请求,获取商家信息,名称,地址,电话,坐标 3. 添加表单提交到数据库 [file:91] 加载地方信息库 `` 以下代码改造自官方实例,我对JS不擅长,代码比较喳喳,有点混乱..在行GOOGLE API的用户欢迎指出 [javascript] function initialize() { var pyrmont = new google.maps.LatLng(31.150681,121.124178); map = new google.maps.Map(document.getElementById('map'), { mapTypeId: google.maps.MapTypeId.ROADMAP, center: pyrmont, zoom: 16 }); var marker = new google.maps.Marker({ position: map.getCenter(), map: map, draggable: true }); google.maps.event.addListener(marker, 'dragend', function() { $("#gglist").html('');//返回的列表,拖动时清空下 var custPoint = marker.getPosition(); var newloc=new google.maps.LatLng(custPoint.lat().toFixed(6),custPoint.lng().toFixed(6)); var request = { location: newloc, radius: '500' // query: $("#maptp").val() 这行如果使用文本搜索,比如输入关键字 青浦 这样的 }; service = new google.maps.places.PlacesService(map); service.search(request, get_list);//textSearch 使用文本搜索 }); } function get_list(results, status) {// 返回的商家列表 if (status == google.maps.places.PlacesServiceStatus.OK) { for (var i = 0; i < results.length; i++) { var place = results[i]; //showlist(results[i]); $("#gglist").append('
  • '+place.name+'
  • '); } } } 返回的数据主要是名字,一定要记得 reference,查询详情需要传递这个参数 详情中也有评论..不过GOOGLE 的评论太少了.. [javascript] function addthis(ggref){ //根据传递reference 获取商家信息 var request = {reference:ggref}; service = new google.maps.places.PlacesService(map); service.getDetails(request, get_gg_detail); } function get_gg_detail(place, status){//返回后添加到表单 }
May/13/2013 22:39
评论(1)
  • nginx与apache共存

    nginx监听80端口,将部分请求转发给8980端口的apache. 由于网络上各种捧NGINX的文章.这也导致我认为选择NGINX才是一件很**流行**的事情. 所以连续几年,一直用着NGINX从 0.6X一直到现在.自己坚持的理由很多.. * 网络上的各种诱惑(静态并发更高,更能强大的反向代理服务器) * 配置文件更简洁 * 更节约资源(在小内存的VPS上) * 看起来更时尚(2B) NGINX一直用的好好的.可其中一个网站老出现502,php-fpm老是无响应 一直找不到好的解决办法.. 尝试了各种办法,其中也包括脚本不断检测php-fpm,无响应是自动重启 治标不治本 直到有一天.在另外一台服务器上测试一个东西..发生了同样的情况..浏览器等待了半天.症状及其相似..而罪魁祸是`file_get_contents`立马想到了什么. 联想 >曾经用过华夏名网的虚拟主机(09年的时候)DZ发布了UCHOME.当时名网也选择了NGINX.不过服务器同样老出现502.当时解释的原因是UC的API导致的. 状况 >此网站大量使用api(主要是淘宝API),curl方式.另外还有微博等插件.都有可能使用到file_get_contents.猜测可能出现这种情况的原因是,发起远程请求的时间较长.进程被挂起.. 于是想出了一个比较有意思的想法 >nginx为反向代理服务器,同时安装apache,使用非80端口.将原先fastcgi的方式转发到apache使用mod_php来处理. 先安装下apache..(很少用到都没编译安装过..留档记录) [bash] # 根据错误提示编译和安装 apr 与 apr-util 文件在httpd源码中 [[email protected] httpd-2.2.22]# cd srclib/apr [[email protected] apr]# ./configure --prefix=/usr/local/apr-httpd/ [[email protected] apr]# make [[email protected] apr]# make install [[email protected] apr]# cd ../apr-util [[email protected] apr-util]# ./configure --prefix=/usr/local/apr-util-httpd/ --with-apr=/usr/local/apr-httpd/ [[email protected] apr-util]# make [[email protected] apr-util]# make install [[email protected] apr-util]# cd ../../ [[email protected] httpd-2.2.22]# ./configure --prefix=/usr/local/httpd --with-apr=/usr/local/apr-httpd/ --with-apr-util=/usr/local/apr-util-httpd/ [[email protected] httpd-2.2.22]# make [[email protected] httpd-2.2.22]# make install 之前是编译安装的php,只选择了fastcgi的方式,重新编译一个带mod_php的放在新文件夹避免冲突. [bash] #细节 --prefix --with-apxs2 ./configure --prefix=/usr/local/php5314 --with-apxs2=/usr/local/httpd/bin/apxs --with-libxml-dir --with-zlib --with-bz2 --enable-ftp --with-gd --with-jpeg-dir --with-png-dir --with-zlib-dir --with-freetype-dir --enable-gd-native-ttf --enable-mbstring --with-mysql=/usr/local/mysql --enable-sockets --with-xsl --enable-zip --enable-zend-multibyte --with-curl=/usr --with-openssl rpaf 为了让APACHE获取NGINX从到客户端转发来的真实IP [bash] wget http://stderr.net/apache/rpaf/download/mod_rpaf-0.6.tar.gz tar zxvf mod_rpaf-0.6.tar.gz cd mod_rpaf-0.6 /usr/local/httpd/bin/apxs -i -c -n mod_rpaf-2.0.so mod_rpaf-2.0.c make make install ###配置httpd.conf### `vim /usr/local/httpd/conf/httpd.conf` [bash] #apache在8980端口 Listen 8980 #php模块 LoadModule php5_module modules/libphp5.so #rpaf LoadModule rpaf_module modules/mod_rpaf-2.0.so RPAFenable On RPAFproxy_ips 127.0.0.1 1.1.1.1 #多个Ip根据需要扩展 RPAFsethostname On RPAFheader X-Forwarded-For AddHandler application/x-httpd-php .php #与php-fpm的用户一样.. User nobody Group nobody #另外需要注意的是目录的权限之前在nginx没的 Order Deny,Allow Allow from all php配置文件 根据实际需要修改吧,我比较2装了2个PHP,一个给NGINX,一个给HTTPD 只是把其中一个网站的PHP转到了HTTPD而已 带上配置启动 `/usr/local/httpd/bin/apachectl -k start -f /usr/local/httpd/conf/httpd.conf` ###配置nginx通过proxy_pass模块将php的内容交给HTTPD处理### [bash] location ~ \.php$ { proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $host:80;#没加端口,网站很多链接变成了了8980端口了 proxy_pass http://xxx.com:8980;#网址已替换 } 现在访问网站一样是80端口,但是PHP请求都会被转发到HTTPD上. 另外出现502的可能跟`file_get_contents`有关,建议使用`curl`代替.
    Jan/19/2013 00:43
    评论(0)
  • 华为C8812E手工解锁刷RECOVERY/ROOT/GOOGLE服务包

    我是在UBUNTU环境下的.按官方的教程没成功.回到WINDOWS也没成功.纠结的是驱动都老有问题.还有那些该死的流氓软件,什么豌豆夹.老往手机里装客户端. 主要失败的原因是fastboot找不到设备,后来才知道操作不当.官方的那个方法直接把我带进了recovery.不是bootloader ###环境### * ubuntu 12.04 64bit * huawei c8812e * android 4.0 华为官方提供了WINDOWS的教程.理论上这过程很容易.但是要命的是这教程有点问题. ####准备工作#### **备份手机数据**,解锁会恢复出厂模式 下载androidsdk 主要是adb 与fastboot adb的问题参考 : 去华为官网申请解锁码 结果在一周左右会发送到你邮箱 ####进入FASTBOOT#### 下面是官方的方法 >手机进入fastboot模式: >先将手机关机(注意需要首先在设置菜单中,关闭“快速启动”功能,或者关机后拔下电池,超过2秒后再重新插入),然后同时按下音量下键以及开机键(平板请同时按下音量上键及开机键),并保持10秒钟以上时间,就可以进入fastboot模式。 >连接手机和PC机: >使用USB线连接手机和PC机,打开PC机的命令行窗口,进入ADB安装目录,确认手机与PC连接正常,确认方法为在命令行窗口输入fastboot devices,可以看到正常连接的信息,如:9e42530e fastboot。 这个方法我是没成功!!!太坑了.后来我在网上找到了我可以使用的方法 >**手机在与电脑连接状态下,重启手机(也要取消快速启动的个哦功能),然后一直按手机音量减键,大概十秒,然后手机长期停留在华为的LOGO上.** 此时输入 [bash] [email protected]:~$ sudo fastboot devices c57f2108 fastboot ####解锁#### [bash] [email protected]:~$ sudo fastboot oem unlock 1879620244223445 [sudo] password for yingouqlj: ... (bootloader) Unlocking ... OKAY [ 0.007s] finished. total time: 0.007s [email protected]:~$ 解锁完成了!. ####刷入RECOVERY#### 国产手机刷机最恶心的就是没有纯正的包.比如RECOVERY一般是玩家改造的,非专业第三方机构..比如:ClockworkMod 所有的网站提供的都是一个EXE的一键刷机包,从解锁到刷机到提权,这类工具对普通用户提供了方便..但是看不到过程..是不是觉得很不爽呢? recovery下载地址: 从EXE里面提取出来的,是国内某论坛的汉化版,若有原版的用户请留言,或发至我邮箱 继续到bootloader华为的菊花界面 [bash] [email protected]:~$ fastboot flash recovery recovery.img 有了RECOVERY就可以刷如第三方的ROM了. 由于目前C8812E只有玩家修改的华为厂商固件,做的基本是精简优化,所以我就不刷了.个人比较喜欢cyanogenmod的ROM 直接提权,刷写GOOGLE服务包吧.做这一切我只是为了能用GOOGLE的服务包啊.用来同步我的联系人. 服务包下载地址: [bash] [email protected]:~/下载$ adb push root.zip /sdcard/root.zip [email protected]:~/下载$ adb push gapps-ics-20120429-4.0.4-signed.zip /sdcard/gapps-ics-20120429-4.0.4-signed.zip [email protected]:~/下载$ adb reboot recovery 进入RECOVERY安装ZIP就可以了 另外有了ROOT之后用ROOT.EXPLORE删除一些没必要的软件吧,比如华为的一些东西,去GOOGLE PLAY下GOOGLE输入法代替华为输入法等等. 注意顶部的小按钮**挂在读写**,否则会提示只读文件 文件目录 * /system/app * /system/delapp * /data/cust/app * /data/cust/delapp * /data/cust/wallpaper * /cust/chinatelecom/cn/app * /cust/chinatelecom/cn/delapp
    Dec/14/2012 03:41
    评论(0)
  • Ubuntu下解决adb devices 显示????乱码的问题

    给我的C8812E刷机遇到问题了 *问题状况* [bash] [email protected]:~/android-sdk-linux/platform-tools$ ./adb devices * daemon not running. starting it now on port 5037 * * daemon started successfully * List of devices attached ???????????? device ##解决办法## *设置USB权限* [bash] [email protected]lj-desktop:~/android-sdk-linux/platform-tools$ lsusb Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub Bus 005 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub Bus 006 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub Bus 007 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub Bus 001 Device 002: ID 04f2:b028 Chicony Electronics Co., Ltd VGA UVC Webcam Bus 005 Device 004: ID 1c4f:0003 SiGma Micro HID controller Bus 005 Device 003: ID 1a2c:0021 Bus 001 Device 004: ID 12d1:1035 Huawei Technologies Co., Ltd. U8120 我的手机是 Bus 001 Device 004: ID 12d1:1035 Huawei Technologies Co., Ltd. U8120 增加USB配置文件 [bash] $sudo vim /etc/udev/rules.d/70-android.rules 加入以下内容: SUBSYSTEM=="usb", ATTRS{idVendor}=="12d1", ATTRS{idProduct}=="1035",MODE="0666" 运行命令,重启udev: [bash] $sudo chmod a+rx /etc/udev/rules.d/70-android.rules $sudo service udev restart [email protected]:~/android-sdk-linux/platform-tools$ sudo ./adb kill-server [email protected]:~/android-sdk-linux/platform-tools$ ./adb devices * daemon not running. starting it now on port 5037 * * daemon started successfully * List of devices attached ???????????? device 如果是HTC等大众机型问题到这里基本解决了 1. 华为的是手机继续往下走 2. 拨号输入*#*#2846579#*#* 3. 选择菜单 projectMenu 4. 接着选择后台设置 5. 选择 USB 模式 6. 选择 Google 模式 7. 重启手机 现在就能正常显示了: [bash] [email protected]:~/android-sdk-linux/platform-tools$ sudo ./adb kill-server [email protected]:~/android-sdk-linux/platform-tools$ ./adb devices * daemon not running. starting it now on port 5037 * * daemon started successfully * List of devices attached 0C37DC4D9CA3 device 参考文献:
    Dec/14/2012 03:13
    评论(0)
  • htc desire z (T-MOBILE G2) 修复记

    这手机也有点年头了啊. 从G1在出租车上掉了以后,就买了这款.(当时没啥全键盘手机了) GOOGLE 的服务真的很好用.用ANDROID不用GOOGLE服务真是浪费(当然我是冲着GOOGLE的服务选择的ANDROID),基本换了新手机跟老的一样用,资料也同步过来了,通讯录,照片,文档.日历等常用的东西. G2显示屏居然进灰了,虽然不影响.只是看着不太爽,另外手机也老了,要是拆坏了就换新的哈哈. 作为非专业人员,处理问题要小心的多..比如.没拆卸一颗螺丝我在纸上记录螺丝的位置,避免丝牙不同导致螺丝滑牙,或者长度不一. [file:41] 当我完全肢解了之后我发现了一个蛋疼的问题,到了屏幕面板内部的4个小螺丝,我淘宝买的10多块的螺丝刀拧坏了一个头,另一个头上次在拆解MACBOOKPRO的时候也坏了一个..质量真差啊. 现在既没法拆开,又没法装上...真蛋疼.. 这4颗小螺丝跟屏幕一点都没关系,是固定面板的塑料跟铝壳的,而屏幕是胶水沾的 [file:42] >原来触屏根本不用这样拆,撕去背面的贴纸,卸下背后的螺丝即可,就可以拔掉排线,另外使用吹风机加热屏幕即可取下屏幕了. 而我使用的小功率吹风机吹了几下用螺丝刀硬翘下来了,最后测试触屏失效了,原因是触屏内曾的静电层的薄膜撕开了一点..是我硬撬导致的. [file:43] 淘宝上看了下屏幕,好多8元的(广东的),我选择了上海的一个55元,收到货了一看原来是屏幕前面整块面板,也就是说光屏就值8元啊,好几个店铺都在卖.. 在这里我要说的是,现在的触摸屏手机**没必要贴膜**,屏幕表层是钢化玻璃的,而贴膜是塑料的,用不了多久塑料膜磨损了反而影响视觉,膜本来就不是很偷. 下面是测试图,就算用刀任意划都不会有事的. [file:44]
    Dec/13/2012 14:46
    评论(0)
  • linux与QQ 一个没有尽头话题

    linux下的QQ已经推出N个版本了,基本为第三方的,先后都归西了,也包括当年android刚起步的时候有个第三方的QQ(AQQ),腾讯官方当时未提供官方版本,等官方出了之后.也封杀了. 所以linux下使用QQ一直以来都是一件很蛋疼的事情.很多用户都放弃了QQ,但是身边的朋友都上这个.在天朝脱离QQ就像去了极乐世界一样了.虽然耳根子是清净了,但也差不多脱离这个社会了.. ##官方的linuxqq## __这个版本官方已经禁用了..无法登陆了__,保留这个文章因为,其中有个蛋疼的V..一定有人会遇到啊! 从LINUX QQ 官网下载 安装包 我是UBUNTU 12.04 下的DEB包,双击deb包安装失败. ####选择dpkg安装:方法#### [bash] [email protected]:~/下载$ sudo dpkg -i linuxqq_v1.0.2-beta1_i386.deb [sudo] password for yingouqlj: dpkg:处理 linuxqq_v1.0.2-beta1_i386.deb (--install)时出错: parsing file '/var/lib/dpkg/tmp.ci/control' near line 7 package 'linuxqq:i386': 版本字符串 v1.0.2-beta1 中有错误: version number does not start with digit 在处理时有错误发生: linuxqq_v1.0.2-beta1_i386.deb __解决方法去掉版本号的V__ 解压DEB包及控制文本,修改control中那个v并重新打包,再次安装即可完成. [bash] [email protected]:~/下载$ dpkg-deb -x linuxqq_v1.0.2-beta1_i386.deb qq [email protected]:~/下载$ dpkg-deb -e linuxqq_v1.0.2-beta1_i386.deb qq/DEBIAN [email protected]:~/下载$ dpkg-deb -b qq linuxqq.deb dpkg-deb:正在新建软件包 linuxqq:i386,包文件为 linuxqq.deb。 [email protected]:~/下载$ sudo dpkg -i linuxqq.deb Selecting previously unselected package linuxqq:i386. (正在读取数据库 ... 系统当前共安装有 249168 个文件和目录。) 正在解压缩 linuxqq:i386 (从 qq.deb) ... 正在设置 linuxqq:i386 (1.0.2-beta1) ... 正在处理用于 bamfdaemon 的触发器... Rebuilding /usr/share/applications/bamf.index... 正在处理用于 desktop-file-utils 的触发器... 正在处理用于 gnome-menus 的触发器... 官方的LINUXQQ一直都不太稳定.目前已经无法使用了 [file:32] 不过代替品WEBQQ还不错 ##第三方插件libqq## __这个版本,也有问题,会封号.__ 下面是源的安装,我是懒人. [bash] sudo add-apt-repository ppa:lainme/libqq sudo apt-get update sudo apt-get install libqq-pidgin [file:33] 我的empathy是3.4的顺便更新到新的3.6吧.**可无视这里** [bash] sudo add-apt-repository ppa:telepathy/ppa sudo apt-get update && sudo apt-get upgrade ##基于pidgin的webqq pidgin-lwqq## 我是ubuntu12.04,ubuntu从8就替换了pidgin为empathy.但是empathy并不支持群组,所以你装了插件,empathy支持的很不好,不过可以登陆.跟聊天,不过不好用. [file:34] **建议安装pidgin**,支持群,以及能现实手机状态等.几乎完美了.顺便附上pidgin的源. [bash] sudo add-apt-repository ppa:lainme/pidgin-lwqq sudo apt-get update sudo apt-get install libpurple0 pidgin-lwqq sudo add-apt-repository ppa:pidgin-developers/ppa sudo apt-get update 目前来说,这个可行.比较完美了.不过问题也多,好友多初始化卡, 好友提醒 工具->插件->libnotify 提醒 根据自己需要配置吧,那个该死的好友上线太麻烦了..老跳 *不足之处是,无法屏蔽群,所有的都提醒,好在窗口是合并标签的,所以无太大困扰 *部分联系人无法显示名字,无法显示名字的无法发送消息 *初始化老卡死(可能根好友数量有关) 总之,一般建议使用WEBQQ 用于接受提醒 LWQQ 很好.
    Dec/06/2012 11:39
    评论(0)
  • PHP curl函数采集 :xotao

    curl代理,COOKIES,等参数 由于淘宝API的关系,打算用采集的方式弥补淘宝SDK的不足. 主要就是依靠CURL了 [php] array( 'proxyType'=>false,// 关闭为false 可选 HTTP,SOCKS5 'proxyHost'=>'127.0.0.1', //代理的主机地址 'proxyPort'=>8087, //代理主机的端口 'proxyAuth'=>false, //代理是否要身份认证(HTTP方式时) 'proxyAuthType'=>'BASIC', //认证的方式.可选择 BASIC 或 NTLM 方式 'proxyAuthUser'=>'', //认证的用户名 'proxyAuthPwd'=>'', //认证的密码 ), 'useragent'=>'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/536.11 (KHTML, like Gecko) Ubuntu/12.04 Chromium/20.0.1132.47 Chrome/20.0.1132.47 Safari/536.11 xoTao', 'useCookies'=>true, ); public function curl($url, $postFields = null) //函数来自TopClient,扩展了下 { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_FAILONERROR, false); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_USERAGENT, $this->curl_option['useragent']); if(strlen($url) > 5 && strtolower(substr($url,0,5)) == "https" ) { //https 请求 curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); } if($this->curl_option['proxy']['proxyType']) { $proxyType = $this->curl_option['proxy']['proxyType']=='HTTP' ? CURLPROXY_HTTP : CURLPROXY_SOCKS5; curl_setopt($ch, CURLOPT_PROXYTYPE, $proxyType); curl_setopt($ch, CURLOPT_PROXY, $this->curl_option['proxy']['proxyHost']); curl_setopt($ch, CURLOPT_PROXYPORT, $this->curl_option['proxy']['proxyPort']); if($this->curl_option['proxy']['proxyAuth']) { $proxyAuthType = $this->curl_option['proxy']['proxyAuthType']=='BASIC' ? CURLAUTH_BASIC : CURLAUTH_NTLM; curl_setopt($ch, CURLOPT_PROXYAUTH, $proxyAuthType); $user = "[{$this->curl_option['proxy']['proxyAuthUser']}]:[{$this->curl_option['proxy']['proxyAuthPwd']}]"; curl_setopt($ch, CURLOPT_PROXYUSERPWD, $user); } } if($this->curl_option['useCookies']) { $cookfile = tempnam(sys_get_temp_dir(),'xotao'); curl_setopt($ch, CURLOPT_COOKIEJAR, $cookfile); curl_setopt($ch, CURLOPT_COOKIEFILE, $cookfile); } if (is_array($postFields) && 0 < count($postFields)) { $postBodyString = ""; $postMultipart = false; foreach ($postFields as $k => $v) { if("@" != substr($v, 0, 1))//判断是不是文件上传 { $postBodyString .= "$k=" . urlencode($v) . "&"; } else//文件上传用multipart/form-data,否则用www-form-urlencoded { $postMultipart = true; } } unset($k, $v); curl_setopt($ch, CURLOPT_POST, true); if ($postMultipart) { curl_setopt($ch, CURLOPT_POSTFIELDS, $postFields); } else { curl_setopt($ch, CURLOPT_POSTFIELDS, substr($postBodyString,0,-1)); } } $reponse = curl_exec($ch); if (curl_errno($ch)) { throw new Exception(curl_error($ch),0); } else { $httpStatusCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); if (200 !== $httpStatusCode) { throw new Exception($reponse,$httpStatusCode); } } curl_close($ch); return $reponse; } } ###curl函数库### 这些资料网上很多,选择转过来是因为实在找不到哪个是最初的版本,而我转载的出处都是一些类似站长站的网站采集的,重新整理下 修正:建议资料参考PHP官方手册 * curl_close — 关闭一个curl会话 * curl_copy_handle — 拷贝一个curl连接资源的所有内容和参数 * curl_errno — 返回一个包含当前会话错误信息的数字编号 * curl_error — 返回当前会话错误信息 * curl_exec — 执行一个curl会话 * curl_getinfo — 获取一个curl连接资源句柄的信息 * curl_init — 初始化一个curl会话 * curl_multi_add_handle — 向curl批处理会话中添加单独的curl句柄资源 * curl_multi_close — 关闭一个批处理句柄资源 * curl_multi_exec — 解析一个curl批处理句柄 * curl_multi_getcontent — 返回获取的输出的文本流 * curl_multi_info_read — 获取当前解析的curl的相关传输信息 * curl_multi_init — 初始化一个curl批处理句柄资源 * curl_multi_remove_handle — 移除curl批处理句柄资源中的某个句柄资源 * curl_multi_select — Get all the sockets associated with the cURL extension, which can then be "selected" * curl_setopt_array — 以数组的形式为一个curl设置会话参数 * curl_setopt — 为一个curl设置会话参数,查阅参数请参考 * curl_version — 获取curl相关的版本信息 * curl_init()函数的作用初始化一个curl会话,curl_init()函数唯一的一个参数是可选的,表示一个url地址 * curl_exec()函数的作用是执行一个curl会话,唯一的参数是curl_init()函数返回的句柄。 * curl_close()函数的作用是关闭一个curl会话,唯一的参数是curl_init()函数返回的句柄 * curl_version()函数的作用是获取curl相关的版本信息,curl_version()函数有一個参数,不清楚是做什么的 * curl_getinfo()函数的作用是获取一個curl連接資源句柄的信息 关于curl_getinfo中的参数请查阅PHP.NET官方手册
    Nov/22/2012 18:15
    评论(0)