2015-06-25
Java 小软摘录

  • Raccoon

    download apk from play store to your pc. check the thread in xda-developers.com.

Read More

2014-08-07
h5ai 中文文件名/目录“乱码”,中文URL 404错误的解决方案

很久之前摘录了一文《h5ai 中文目录及文件均为乱码的更正方法》,距发表该文至今,h5ai已经更新了好几个版本了,目前最新的是0.25.2。刚好最近需要通过局域网以web服务的形式共享一些资料,所以重新回来了解h5ai。而这次终于是解决了曾困惑了我很久的有关中文文件和中文URL处理的问题。 当然,官方默认仍然是不支持,解决这个问题还是要自己手动修改一下源码,方法已在h5ai 官方github 的issue 140《Support non UTF-8 encoded file systems》 中提及,在这里简单分享一下。

让h5ai完美支持中文

仅需修改class-app.php 这个文件就可以解决问题了。 h5ai/server/php/inc/class-app.php 第84行

$encoded_parts[] = rawurlencode($part);

修改为:

$encoded_parts[] = rawurlencode(mb_convert_encoding($part, “UTF-8”, “GBK”));

第95行

return normalize_path(ROOT_PATH . “/“ . rawurldecode($rel_url));

修改为:

return normalize_path(ROOT_PATH . “/“ . mb_convert_encoding(rawurldecode($rel_url), “GBK”, “UTF-8”));

Read More

2014-06-24
灵活地变动Nginx 的默认文档“index” 值

为什么会有这个需求?还不是因为BA的问题… 接到“内容不符”的通知,要么滚要么大改。运营上线已久,大改不现实,滚到外地的话即浪费资金又不利于国内优秀资源的使用。冒险用上这招,继续低调行事… 得益于linux 平台及强大nginx,还有被Q了的Google,最终才能使方案得以顺利实现。码文记录也顺便分享给有需要的朋友,虽然过分很简单,但真的很有用。对于nginx 的理解仍然是冰山一角!

需求及思路

用户访问www.xxx.com 时,需要展示“符合要求”的内容,而用户入口非www.xxx.com 时则展示“不太符合要求”的内容。 方案一: 这个第一时间想到的,就是新建目录,把现有内容放置在新目录下并绑定二级域名继续使用,而根目录随意放置一个静态文件供展示就可以了。 弊端:工作量相对大了;整站放置在二级目录,不知道会不会影响其他已绑定二级域名的子频道;不利于日后大动作。 方案二: 根据来访域名,动态变换主页。nginx 可以用set 来设置变量,简单!方便!快捷!

方案实施

最终实现预期功能的nginx 这一小段 配置文件如下:

if ($host = ‘www.xxx.com') {
set $index “default.php”;
set $index_more “index.php”;
}
if ($host != ‘www.xxx.com') {
set $index “index.php”;
set $index_more “default.php”;
}
index $index index.htm $index_more;
# index index.html index.htm index.php;

也就是$host 为www.xxx.com 时,index 最优先的默认文档为default.php。当$host 不是www.xxx.com 时,则优先使用原来的index.php! 修改保存后,使用nginx -t测试提示successful。然后通过nginx -s reload重新加载nginx 配置。大功告成!


*这里新增加一个$index_more 的变量(variable)是折衷的办法,当我使用如下判断时,遇到了403 错误:

if ($host = ‘www.xxx.com') {
set $index “default.php index.htm index.php”;
}
if ($host != ‘www.xxx.com') {
set $index “index.php index.htm default.php”;
}
index $index;
# index index.html index.htm index.php;

似乎是因为变量赋值出现空格而导致了403。度娘无解,Google 也不知道怎么描述具体问题,有机会的话,还想去stackoverflow 咨询一下。如果有朋友知晓个中缘由的,希望能分享一下解决方法。

Read More

2014-06-24
利用Discuz checkrobot() 函数给搜索引擎的蜘蛛爬虫启用301重定向

在搜索相关资料时,看到不少朋友拿“跳转”来干“坏事”,例如欺骗友链。因为Discuz 换了默认域名,而www 仅做简单的展示。这次给蜘蛛作301 重定向的目的就是为了提供更好的用户体验,同时也避免因为“主页”做了大规模的变动而导致搜索引擎大K。

Discuz checkrobot() 函数:

checkrobot() 函数已在source/function/function_core.php 中定义

function checkrobot($useragent = ‘’) {
static $kw_spiders = array(‘bot’, ‘crawl’, ‘spider’ ,’slurp’, ‘sohu-search’, ‘lycos’, ‘robozilla’);
static $kw_browsers = array(‘msie’, ‘netscape’, ‘opera’, ‘konqueror’, ‘mozilla’);

$useragent = strtolower(empty($useragent) ? $\_SERVER\['HTTP\_USER_AGENT'\] : $useragent);
if(strpos($useragent, 'http://') === false && dstrpos($useragent, $kw_browsers)) return false;
if(dstrpos($useragent, $kw_spiders)) return true;
return false;

}

判断蜘蛛,启用PHP 301 重定向

新建一个php 页面,引入Discuz 核心类source/class/class_core.php:

发送301 HTTP 状态码后,跳转至新地址http://newdomain.com/。

使用蜘蛛模拟工具查看结果

使用较多的就是Chinaz 的工具了,执行一下蜘蛛模拟访问,发现输出了预期的新地址网页内容,也就是成功了。普通访客即非robot 不会遇到301 重定向。简单地完成任务!

Read More

2014-06-16
RamNode VPS 使用的一些小问题,简单总结一下

使用RamNode 的原因,主要是LEB 上的评价不错,虽然是后起之秀。不知道国内使用RamNode 的产品的朋友多不多,其实开始还是比较趋向linode 的,不过$20/month 似乎有点浪费,而且门槛有点高,虽然刚申请的美国payoneer 信用卡已经审批通过,目前已在途中,加上$30/year 的养卡费用,真的压力山大,希望RamNode 能带来一点好事吧。实在不想折腾了…

RamNode VPS 套餐/配置:

还是没太大把握,月付还是首选。选择了最低配的 RamNode VPS,价钱是:$6.00 USD Monthly!机房是Seattle(西雅图)。

  • 256MB RAM
  • 1 CPU Core Access
  • 5GB SSD Space
  • 1Gbps Port
  • 1000GB Bandwidth
  • 1 IPv4 Address
  • 16 IPv6 Addresses

使用TWOYEAR RamNode优惠码,最后终身折扣为$3.48!

安装操作系统及编译lnmp:

和大多数VPS 一样,自由灵活安装OS 是标配,起初我是直接选用了RamNode 预用的ubuntu 12.04 LTS Desktop(因为本来是想拿来干其他事的,图个方便),结果VNC 提示“No bootable device”,当然启动项是正确的,难道是内存太小?没继续作深入研究,弃之。 再“reinstall” 时选择了CentOS 6.4 minimal!因为不太熟悉CentOS,在编译lnmp 时遇到很多问题,各种包“Not available“、”no package found“?等… 最终回到较为熟悉Debian 7.3。LNMP 的编译是一气呵成- -!。

迁移旧服务器数据:

安装lftp,用lftp 的mirror 参数直接远程拿过来。就是因为数据在国内,而且带宽本来就很小,所以整个过程用了不止24 小时,而且现在还发现有几百兆的数据没同步过来,甚是郁闷,流量去掉了3 个G。

RamNode VPS升级:

西雅图的速度还不错,ping 值电信在200 左右,联通就大了不少。RamNode 的客服也不错,发ticket 很快就有回应,有点像QQ 聊天一样… 既然没什么问题,考虑到256MB / 5G SSD 不太够用,还是升级到512MB / 10G SSD 了。 直接在”My services“ 选择已购产品然后”upgrade“,滑动滑条至512MB 确认配置选择。补上差价,使用RamNode优惠码后大概多了4 美元。还是有点小贵的样子… 通过paypal 付款升级后,等待客服手动更新服务器信息才行。VPS Control Panel 显示的VPS 信息中,内存是马上更新至512MB 的,唯独硬盘信息一项(Disk Spache)仍然是5GB,当时没留心看RamNode 发来的ticket:

KVMs are manually upgraded and you will need to manually re-size your disk to the larger size once we provision the upgraded information for you.

升级后的硬盘根分区是不会立刻跟新至最大值的,需要手动resize。但也不是付款后就能马上执行resize 操作,因为RamNode 还没给你升级完毕呢。耐心收邮件吧,RamNode 发来的升级完成的邮件内容:

Hello Fuying, Your KVM VPS upgrade order has been received and processed. KVM requires a restart of your VPS in order to use your new resources. You have to restart your VPS from the SolusVM control panel specifically. Once you have restarted, you will have to resize your disk partition(s) using the GParted or System Rescue ISOs. If you need us to resize your disk for you, please open a support ticket and allow 24 hours for us to perform the work. We are not responsible for any data loss as a result of partition resizing. If you have any questions or concerns, please open a support ticket. Thanks for your business!

这时,可以执行磁盘的resize 操作,也可以发ticket 给RamNode 让RamNode 给你完成,但不会为你的数据丢失负责。我是自己通过挂载System Rescue 镜像到CDROM,通过VNC 进入root shell,然后用那个startx 启动图形界面,再使用GParted 手动新增分区了并设置开机挂载到/home,并没有直接扩展原来的跟分区(其实,VPS 控制面板是可以直接选用GParted 镜像的)。但,发ticket 咨询RamNode 如果执行VPS 控制面板的重装操作系统操作,会直接清除掉整个磁盘的数据,汗吧!如果真有必要重装系统,还是挂载ISO 镜像到CDROM,再手动安装,安装时别格式化新增分区就好了。这样就可以避免分区数据的丢失! 来自我的ticket:

yeah, thanks ! it works now. another question ? i created a new partition /dev/vda3 and mounted it on /home. if i use the reinstall function over the Contorl Panel, will it erase my whole disk or just the root partition ? Just in case.

RamNode 回复:

It will erase your whole disk, yes.

Read More

2014-05-24
WSS 默认编辑器Kindeditor 配置记录,修正prettyPrint 代码高亮的实现

发表了《WSS 富文本编辑器kindeditor 到ueditor 的替换,并实现代码高亮!》之后,虽然感觉ueditor 确实功能丰富,但为了以后方便WSS 的升级,还是直接在WSS 及Kindeditor 上作小幅度的修正来实现代码高亮。

首先,去掉默认WSS 对Kindeditor 工具栏(items)的定制:

Windows使用notepad++ 通过正则表达式替换。

var editor;
KindEditor.ready(function(K) {
editor = K.create(‘#csa_remark1’, {
width : ‘95%’,
height: ‘350px’,
items:[
‘source’, ‘|’, ‘undo’, ‘redo’, ‘|’, ‘preview’, ‘print’, ‘template’, ‘cut’, ‘copy’, ‘paste’,
‘plainpaste’, ‘wordpaste’, ‘|’, ‘justifyleft’, ‘justifycenter’, ‘justifyright’,
‘justifyfull’, ‘insertorderedlist’, ‘insertunorderedlist’, ‘indent’, ‘outdent’, ‘subscript’,
‘superscript’, ‘clearhtml’, ‘quickformat’, ‘selectall’, ‘|’, ‘fullscreen’, ‘/‘,
‘formatblock’, ‘fontname’, ‘fontsize’, ‘|’, ‘forecolor’, ‘hilitecolor’, ‘bold’,
‘italic’, ‘underline’, ‘strikethrough’, ‘lineheight’, ‘removeformat’, ‘|’, ‘image’,
‘flash’, ‘media’, ‘insertfile’, ‘table’, ‘hr’, ‘map’, ‘code’, ‘pagebreak’, ‘anchor’,
‘link’, ‘unlink’, ‘|’, ‘about’
]
});
});

去掉这一段

items:[
‘source’, ‘|’, ‘undo’, ‘redo’, ‘|’, ‘preview’, ‘print’, ‘template’, ‘cut’, ‘copy’, ‘paste’,
‘plainpaste’, ‘wordpaste’, ‘|’, ‘justifyleft’, ‘justifycenter’, ‘justifyright’,
‘justifyfull’, ‘insertorderedlist’, ‘insertunorderedlist’, ‘indent’, ‘outdent’, ‘subscript’,
‘superscript’, ‘clearhtml’, ‘quickformat’, ‘selectall’, ‘|’, ‘fullscreen’, ‘/‘,
‘formatblock’, ‘fontname’, ‘fontsize’, ‘|’, ‘forecolor’, ‘hilitecolor’, ‘bold’,
‘italic’, ‘underline’, ‘strikethrough’, ‘lineheight’, ‘removeformat’, ‘|’, ‘image’,
‘flash’, ‘media’, ‘insertfile’, ‘table’, ‘hr’, ‘map’, ‘code’, ‘pagebreak’, ‘anchor’,
‘link’, ‘unlink’, ‘|’, ‘about’
]

我使用的正则语句:

搜索

items\:\[.*\}\)\;

替换

\}\)\;\n\}\)\;

顺便参考官方PHP demo 手动在这些文件中加入pretty.css 及prettyPrint{} 以便给编辑器内的pre 标签定义样式。

cssPath : ‘../plugins/code/prettify.css’,

prettyPrint();

涉及的文件较多,自己手动编辑了下面的几个文件:

  • announcement_add.php
  • announcement_edit.php
  • comment_add.php
  • comment_edit.php
  • default_task_add.php
  • default_task_plan.php
  • file_add_folder.php
  • file_edit.php
  • file_edit_folder.php
  • log_add.php
  • log_edit.php
  • project_add.php
  • project_edit.php

Kindeditor 在textarea里设置HTML内容来可实现编辑,需要从服务器端程序(ASP、PHP、ASP.NET等)直接显示内容,所以必须转换HTML特殊字符(>,<,&,”)。

而WSS 在以下的几个文件中没有进行转义,所以需要在textarea 标签中手动加入PHP htmlspecialchars() 函数

  • file_edit.php
  • file_edit_folder.php
  • log_edit.php
  • default_task_plan.php

如default_task_plan.php 文件:

<?php echo $row_Recordset_task[‘csa_remark1’]; ?>

加上htmlspecialchars() 函数后

<?php echo htmlspecialchars($row_Recordset_task[‘csa_remark1’]); ?>

完成编辑器的编辑后,就到了前端内容显示的修正了

为了方便,在WSS 的头部head.php 加入prettyPrint 样式:

再在foot.php 最后加入相关jsprettyPrint() 函数:

prettyPrint();

PS:其中log_view.php 是作为frame 加载的,所以还需在这个文件单独加入上面的css 及js prettyPrint{}

最后,简单“美化”一下显示效果

相关文件包括:

  • skin/themes/base/lhgdialog.css

    /********calendar*******/

    img {border: none;}
    li {list-style: none;}

    去掉li list-style 的定义:

    /********calendar*******/

    img {border: none;}
    /*li {list-style: none;}*/

    并为定义了日历样式的.day_main 加上宽度

    .day_main{height:105px; width:105px; overflow:hidden; }

  • skin/themes/base/tk_style.css

    /* CSS Document */

    img {border: none;}
    ul{list-style: none; padding: 0; }
    li{list-style: none; }

    去掉list-style 的定义:

    /* CSS Document */

    img {border: none;}
    /*ul{list-style: none; padding: 0; }*/
    /*li{list-style: none; }*/
    ul{padding: 0; }

  • editor/plugins/code/pretty.css

    改为自动换行:

    pre.prettyprint {white-space: pre-wrap;}

Read More

2014-05-24
WSS 富文本编辑器kindeditor 到ueditor 的替换,并实现代码高亮!

因为需要,wss 默认的kindeditor 似乎不太“够”用,所以转投百度开源的富文本编辑器ueditor。特编文以记录各个文件的编辑过程!wss 的版本是1.3.2。

  1. 编辑内容展示 首先,按照官方文档的编辑内容展示 部分,需要使用uparse 在展示页面中对ueditor的产出的编辑数据,进行解析和转换,以呈现不同的效果。
//uParse的语法
//uParse(cssSelector,\[options\])

在wss 根目录的head.php 文件head 部分加入javascript:

 uParse('#content_detail', {
    rootPath: 'editor/'
}) 
  1. 以“文档” 部分为例

    • file_edit.php

      根据百度官方的demo,需要在调用编辑器的页面载入ueditor 的几个关键文件并实例化:

        这里写你的初始化内容 





        var ue = UE.getEditor('container'); 

    在wss 上的处理:

    *   找到

         var editor;
                KindEditor.ready(function(K) {
                        editor = K.create('#tk\_doc\_description', {
                    width : '96%',
                    height: '500px',
                    items:\[
                'source', '|', 'undo', 'redo', '|', 'preview', 'print', 'template', 'cut', 'copy', 'paste',
                'plainpaste', 'wordpaste', '|', 'justifyleft', 'justifycenter', 'justifyright',
                'justifyfull', 'insertorderedlist', 'insertunorderedlist', 'indent', 'outdent', 'subscript',
                'superscript', 'clearhtml', 'quickformat', 'selectall', '|', 'fullscreen', '/',
                'formatblock', 'fontname', 'fontsize', '|', 'forecolor', 'hilitecolor', 'bold',
                'italic', 'underline', 'strikethrough', 'lineheight', 'removeformat', '|', 'image',
                'flash', 'media', 'insertfile', 'table', 'hr', 'map', 'code', 'pagebreak', 'anchor', 
                'link', 'unlink', '|', 'about'
        \]
        });
                }); 

        替换为:

         var ue = UE.getEditor('tk\_doc\_description'); 

    *   找到:

        <?php echo $row\_Recordset1\['tk\_doc_description'\]; ?>

        替换为:

        <?php echo $row\_Recordset1\['tk\_doc_description'\]; ?>

        PS:采用了script标签作为编辑器容器对象,并设置了其类型是纯文本,从而在避免了标签内部JS代码执行的同时解决了部分同学在使用传统的textarea标签作为容器所带来的一次额外转码问题。

*   file_view.php

    加入uparse 解析转义的cssSelector

    找到

         null) { ?>



    替换为

         null) { ?>



    也就是加入了div
Read More

2014-05-13
自定义Openshift Apache/PHP/Mysql 的时区(TIMEZONE),修改区域为"Asia/Shanghai" '+08:00'

有趣的是,OpenShift 某些cartridge 的配置文件是可以自定义的,如php.ini 、my.cnf,但是自定义的配置在应用重启后就会丢失,这样也是为了保证应用的稳定吧。但针对个人开发需要,需要变更某些参数时就麻烦了。 这一次遇到的问题是与系统时间有关的,OpenShift 默认时区是GMT,不使用我们大陆用户使用的东8 时区,所以需要修改TIMEZONE 来迎合个人使用需要。我的一个应用(appname)使用的Cartridge 有PHP5、Mysql-5.5、phpMyadmin。这次要定义Apache、PHP及Mysql 的TIMEZONE值。 Apache / PHP: 1) 在php 应用更目录(Documentroot)添加.htaccess 文件,有的话就直接在原基础上修改就可以了。加入定义内容:

SetEnv TZ Asia/Shanghai
php_value date.timezone Asia/Shanghai

2) 重启应用:

ctl_all restart

3) 查看phpinfo :

Apache Environment 段相关值如下

TZ

Asia/Shanghai

date 段

date/time support

enabled

“Olson” Timezone Database Version

0.system

Timezone Database

internal

Default timezone

Asia/Shanghai

Directive

Local Value

Master Value

date.default_latitude

31.7667

31.7667

date.default_longitude

35.2333

35.2333

date.sunrise_zenith

90.583333

90.583333

date.sunset_zenith

90.583333

90.583333

date.timezone

Asia/Shanghai

GMT

定义Mysql 的TIMEZONE: OpenShift 的mysql 配置文件位于~/mysql-5.1/conf/my.cnf,直接修改这个文件后,修改过的内容同样会在mysql cartridge 重启后丢失。 既然无法通过修改my.cnf 文件添加default-time-zone=timezone(default-time-zone=’+08:00’)来定义时区,那只能另外想办法了。 幸好,OpenShift 考虑得非常周到,可以通过rhc 客户端工具自定义环境变量来设置Mysql 时区!这个环境变量是:

OPENSHIFT_MYSQL_TIMEZONE

那么通过rhc 来定义变量OPENSHIFT_MYSQL_TIMEZONE 的值: 1)

rhc set-env -a a OPENSHIFT_MYSQL_TIMEZONE=’+08:00’ -a appname

2) 重启mysql cartridge 及app

rhc cartridge mysql-5.5 -a date
rhc app start appname

3) 检查变量值

rhc ssh appname –gear ‘env | grep TIMEZONE | grep -v grep’

输出:

OPENSHIFT_MYSQL_TIMEZONE=+08:00

也可以通过查看phpinfo.php 页面检查变量值:

OPENSHIFT_MYSQL_TIMEZONE

+08:00


题外话,如果你的程序遇到500 等其他错误需要查看php 错误信息来调试应用,可以通过一下方法临时变更php 的display_erros 及error_reporting 的值:

Read More

2014-04-23
FbinstTool 修改U盘GRUB 引导,手动添加Ubuntu 及acronis bootcd iso 启动项

FbinstTool 是一个简单易用的修改U 盘启动项的工具,本人喜欢将老毛桃直接写入到4G 手机内存卡中,用来平时维护自己的电脑。 acronis 的版本是acronis True Image 2014,Ubuntu 则为刚更新的14.04 LTS 发行版。

  1. 硬盘已经使用很久,经常有新的坏道出现,acronis 是为了因硬盘故障导致的分区损坏或丢失时好用来恢复win 8.1 update 镜像。
  2. ubuntu 就更方便了,修复grub、chroot 维护系统,甚至直接使用等。

打开 FbinstTool: FbinstTool 使用截图因为制作出来的U 盘启动 维护系统中,有一个是“启动自定义ISO/IMG文件(LMT目录)” 对应的定义文件是根目录的grldr 这个文件,内容为

title 【10】 启动自定义ISO/IMG文件(LMT目录) RUN (ud)/BOOT/GRUB/RUN.LST

所以我是将新增的启动项添加在RUN.LST 最后: FbinstTool 菜单编辑

  • Ubuntu 启动项:

    title [47] Install Ubuntu
    root (hd0,0)
    kernel /ubuntu/vmlinuz boot=casper iso-scan/filename=/ubuntu/ubuntu-14.04-desktop-amd64.iso ro quiet splash locale=zh_CN.UTF-8
    initrd /ubuntu/initrd.lz

  • acronis BootCD 项:

    title [48] Acronis Backup & Recovery 2014 BOOT CD
    map –mem (hd0,0)/ACI.iso (hd32)
    map –hook
    chainloader (hd32)
    boot

Read More

2014-04-17
修改Discuz forumdisplay_subforum.htm,实现显示子版块主题分类!

$value[name]

插件钩子

之前添加数据查询循环调用。 弊端是,如果启用了主题分类的子版块有N 个,那么将会增加N 次Mysql 的Query,所以footer 下面的Queries 会增加N 条。不知道有没有什么好的解决方法…

Read More