since.2006  

工欲善其事,必先利其器。上次没专门配置开发环境直接在firefox扩展目录修改代码做某个操作时自动清空了扩展目录,欲哭无泪~幸好用了IDE在编辑代码从历史版本中找了回来。
最近要修改个功能为了不碰到上次那样的问题,还是专门配个开发环境吧。

1.先为开发环境创建个自己的Profile,这样随便怎么动都不会影响到正常使用。
Mac OS 在命令行下执行:"/Applications/Firefox.app/Contents/MacOS/firefox-bin -p"
Windows 在快捷方式后加 -p 参数。
上面会打开一个用户配置文件管理窗口,创建一个新的配置文件,创建完成后,在profile目录下创建一个extensions的文件夹,开发的扩展就放在这个目录下。

2.打开firefox,输入about:config修改以下参数
// 把chrome文件的错误输出到错误控制台
javascript.options.showInConsole = true
//禁用 XUL 缓存,使得对窗口和对话框的修改不需要重新加载 XUL 文件
nglayout.debug.disable_xul_cache = true 
// 可以在脚本里用dump来输出调试信息到终端,如dump("test")
browser.dom.window.dump.enabled = true
// 严格的脚本错误报告。如果不设置这个,一些脚本错误将不会被输出到错误控制台。
javascript.options.strict = true
// 使错误控制台里显示更多的和安装和更新有关的错误信息
extensions.logging.enabled = true
3.每次修改内容后用ant自动复制文件到firefox扩展目录
<?xml version="1.0" encoding="utf-8"?>
<project name="ToMeFirefox" default="复制文件至扩展目录" basedir="../">
    <!-- 应用的文件目录 -->
    <property name="app" value="app"/>
    <!-- 应用在firefox扩展目录下的文件夹名 -->
    <!-- 这个扩展目录就是在第1步自定义的profile文件夹下 -->
    <property name="extDirName" value="E:\workspace\FirefoxProfiles\extensions\App@since2006.com"/>

    <target name="复制文件至扩展目录">
        <delete dir="${extDirName}"/>
        <mkdir dir="${extDirName}"/>
        <copy todir="${extDirName}">
            <fileset dir="${app}">
            </fileset>
        </copy>
    </target>

</project>

4.重启firefox测试效果

5.反复重启的话,可以创建个快捷方式在第1步的参数-p后加上Profile的名字每次打开默认使用这个Profile

如:
firefox.exe -p dev -console

 

Posted by hee at 11:07 AM | Permalink | 评论(0)

很久很久以前就用过Gravatar这个网站的用户个性化头像服务,没有设置头像时默认是一个蓝底白字的G字,多数用户没设置的话看起来非常不和谐,发现StackOverflow的用户头像很有意思,准备趁这次BLOG大翻新时添加这个功能,搜索了一下相关实现其实这个头像就是Gravatar提供的,当用户邮箱没有设置过个性头像时生成各种颜色样式的方块图案,这种图案的名字叫:Identicons。

阅读全文 "访客评论头像Gravatar和Identicons" »

Posted by hee at 20:03 PM | Permalink | 评论(0)

以前一直用的是老版本google自定义搜索,可自定义的功能很少。最近趁blog用twitter bootstrap重写时顺便将google自定义搜索功能也更新一把,网上的教程比较繁琐,自己折腾了一晚上,找到一个超简单集成的方法。

简单2步即可完成基本整合功能:
1. 通过Google Custom Search element网页自动生成基本的搜索代码。

2. 添加到网页中,做一些自定义修改,上传收工。

俺的整合代码(效果见右侧搜索功能):

<!-- Google Custom Search Element -->
<!-- 注意两个id:cse-search-form 和 cse-search-result -->
<!-- cse-search-form: 搜索框显示的地方 -->
<!-- cse-search-result: 搜索结果显示的地方 -->

<div id="cse-search-form" style="row-fluid"></div>
<div id="cse-search-result" style="row-fluid"></div>
<script src="http://www.google.com/jsapi" type="text/javascript"></script>
<script type="text/javascript">
    google.load('search', '1', {
        style: google.loader.themes.MINIMALIST
    });
    google.setOnLoadCallback(function () {
        var cse = new google.search.CustomSearchControl();
        var drawOpts = new google.search.DrawOptions();
        drawOpts.setSearchFormRoot("cse-search-form");
        cse.draw('cse-search-result', drawOpts);
    }, true);
</script>

更多高级设置可以参考Custom Search Reference

 

Posted by hee at 23:03 PM | Permalink | 评论(0)
在另一个主机上装了WordPress和自己写的Blog,一天早上收到某个搜索引擎的邮件,提醒说站点被挂马了。

打开网页NOD32立马提示病毒,上网一看说WordPress存在着XSS漏洞,对WordPress不熟悉只好通过升级安装到最新版本搞定这个问题。

接着顺便访问下自己写的Blog,居然同样被挂马了,感到杯具之余正好分析下这马的调用方式。拖下所有文件,查找和首页挂马代码相似的代码:

1. 发现所有目录index.php最开始处都被挂了一段代码,基本能说明挂马操作是程序自动处理的。

2. 内容被PHP base64编码和JS fromCharCode混淆过。

3. 如果访问者是搜索引擎的爬虫,则不执行挂马操作,这样不会让搜索引擎将网站标识为恶意网站(这次知道被挂马,是一个不在这个列表里的搜索引擎提醒的)。

顺便附上相应代码,知己知彼,百战不殆。

阅读全文 "杯具!网站被挂马了~" »

Posted by hee at 22:03 PM | Permalink | 评论(0)
  1. 120×120,这种广告规格适用于产品或新闻照片展示。
  2. 120×60,这种广告规格主要用于做LOGO使用。
  3. 120×90,主要应用于产品演示或大型LOGO。
  4. 125×125,这种规格适于表现照片效果的图像广告。
  5. 234×60,这种规格适用于框架或左右形式主页的广告链接。
  6. 392×72,主要用于有较多图片展示的广告条,用于页眉或页脚。
  7. 468×60,应用最为广泛的广告条尺寸,用于页眉或页脚。
  8. 88×31,主要用于网页链接,或网站小型LOGO。  
网站logo常用的三种规格:
  1. 88*31 这是互联网上最普遍的LOGO规格。
  2. 120*60 这种规格用于一般大小的LOGO。
  3. 120*90 这种规格用于大型LOGO。

Posted by hee at 15:01 PM | Permalink | 评论(0)

JDBC里提供的DatabaseMetaData类提供的方法可以方便的完成这事,但有时候数据库因权限问题自己不能完全控制,用这个类会有问题。

同样用SQL也可以完成这个问题:

-- 列用户所有表:
select name as tn from sysobjects where type='U'

-- 列某个表所有字段及类型,是否允许空等:
select a.colid as id, b.name as tab_name ,
a.name as COLUMN_NAME,
c.name as DATA_TYPE,
a.length as COLUMN_SIZE,
a.prec as length,
a.scale,
case isnull(a.status,0) when 0 then 'NOT NULL' ELSE 'NULL' END AS NULLABLE 
from syscolumns a, sysobjects b, systypes c 
where a.id = b.id and a.usertype = c.usertype and b.name= 'TargetTable' 
order by a.colid
Posted by hee at 10:03 AM | Permalink | 评论(0)