Date: 九月 21st, 2009
Cate: css

使用print css的时候切不可脱离文档流和限定宽度

IE6, IE7, Firefox在media="print"的时候对于position=absolute的处理迥异.
其中一个很严重的问题是IE下面,print的时候对于postion=absolute这种脱离文档流的页面会有截断现象.
如宽度过长横向截断, 又如页面最后一行或第一行截断, 如下图:

但有时候Firefox不写position=absolute反倒会只显示一页并且最后一行截断, 反而要加上这个设定才能正常.

所以切记, 不要在IE中print的时候做任何脱离文档流的设定, 如position=absolute或者float.
在Firefox中遇到问题则可尝试设定脱离文档流.
以后如果遇到这种情形也应该先排查是否属于此种情形.

同时的,在IE7/Firefox中, 在print的时候如果文档中有设定宽度超过纸张宽度,在默认的Shrink To Fit模式下,字体会缩的很小. 而在IE6下则显示为超过部分被截断.
因此解决方法显而易见应该是去除原宽度设定, 改为使用width=100%(也可以视情形而定).

Date: 九月 5th, 2009
Cate: css

IE6/7下table的padding无效

也许是我落伍了, 居然现在才遇到这个bt的bug:

table {
    padding:10px;
}

居然无法生效. 似乎除了在外面套一个div或者把里面的东西手工的做出margin外没什么更好的办法. sigh.
唯一庆幸的是IE8已经解决了这个问题.

而坏消息是IE6还占据60%的市场.

想到一个迂回的方法, 当table本身不要求border的时候, 可以用border来代替padding.

table {
    border:10px;
}

真实的需要table padding的原因其实是为了提供一个背景, border占位效果其实是一样的.

Date: 六月 9th, 2009
Cate: css

IE系列诡异bug一枚

<style type="text/css">
ul {
    margin:0;
    padding:0;
    padding-top: 100px;
    width: 170px; /*宽度改大就没问题*/
    float:left;/*为了在firefox上看上去正确*/
    background: #eee; /*为了方便看效果*/
}
li{
    width: 170px;
    float:left;
}
a:hover{
    background: #000;/*这条不写就不会有问题*/
}
</style>
<ul>
    <li>
        <a href="#">Column 1 SubItem 1</a>
    </li>
</ul>

以上是重现问题的最小代码. 当鼠标移动到链接上后, ul的下面突然多出一块, 多出部分高度是等于ul的padding-top大小, 通过IE8的IE develop tool观察layout发现多出部分是被加到了ul的height里. 如果设置ul的height大小小于li的总大小, 则有问题, 否则OK.
IE7/IE8标准模式, firefox都OK.
在IE6, IE7/IE8的quirks模式下都有问题.

如果把UL的width去掉就没问题.

相信问题出在IE对float情形下, 外围具有宽度的情形下, 对子元素的宽度总和计算出错, 导致认为子元素一行显示不下而要显示到第二行去.
证据是, 当width改到173(为什么171和172不行?)

但似乎background又和IE的layout属性有什么关系?
IE的bug真的是很让人头疼.

更新: 查证确为IE bug, 描述为float元素的宽度之和要小于100%,否则无法正确显示,最好小于99%.

Date: 五月 25th, 2009
Cate: develop

在portlet里成功使用sendRedirect的条件

在spring portlet的过程总发现使用actionResponse.sendRedirect(String url)有时成功有时不成功, 甚是蹊跷.
查阅portlet api后得知sendRedirect不能与一些方法同用, 相信如同在servlet里不能先out.print再sendRedirect一样, 因为outputstream不能打开两遍.
不能一同使用的方法是

  • setPortletMode
  • setWindowState
  • setRenderParameter
  • setRenderParameters
  • removePublicRenderParamter
  • 由此引发的问题是, sendRedirect不能与很多类或者方法一起使用. 如

    spring中的parameterMappingInterceptor, 因为这个handler里主动调用setRenderParameter设置返回render方法的action参数.

    这种例子会有很多, 只能使用过程中密切注意.
    这里另一篇类似问题的文章, http://forum.springsource.org/showthread.php?t=55857, 是它使我获得灵感.

    Date: 五月 15th, 2009
    Cate: 未分类

    VPN下同时上本地网络

    VPN是一种很奇妙的东西,为了安全无所不用其极.

    A,B用路由器连起来, 但只有一个显示器.
    A机器是常用机器, 为了保持清洁, 所以没装公司VPN.
    B机器装了VPN,可以正常拨VPN.

    1. 需要VPN的时候, A远程桌面到B上拨VPN,提示证书紊乱. 相信是A上应该装证书, 如此一来就没必要在B上装VPN了.

    换一种做法.

    2. 需要VPN的时候, 在B上拨VPN, 远程桌面A做日常娱乐, 连接失败.
    ping A不通.
    ping –R A发现先经过16.159.152.9, 蹊跷.
    查看route, 断开VPN后再查看route

    route print

    比较发现, 其中有两行

    192.168.1.0     255.255.255.0     16.159.152.9   16.159.152.9

    192.168.1.0     255.255.255.0     192.168.1.100 192.168.1.100

    上一行是连接VPN后添加上去的.
    这一行表示将内网先解析到VPN去, 当然, 就连不上本地A机器.
    于是修改之

    route change 192.168.1.0 mask 255.255.255.0 192.168.1.100

    再ping A, 连通了.
    再远程桌面A, 成功连上.

    到此VPN可以用, 本地网络也OK了.这样在家办公的时候也可以爽了.

    Date: 四月 25th, 2009
    Cate: 未分类

    Ext3转Ext4实录

    本人linux菜鸟, 虚拟机上玩Ubuntu, 刚从8.10升级到9.04, 将Ext3转Ext4格式, 实录如下:

    1. 打开终端, 登录为root, 用parted工具查看当前文件系统格式, 当为ext3

    sudo su
    parted
    print all
    quit

    2. 修改fstab, 预先将分区格式改为ext4, 防止转换格式后启动不成功

    vi /etc/fstab

    3. 关机, 然后用Ubuntu 9.10的CD启动, 并在光盘上运行, 登陆为root, 确认分区没有被mount

    sudo su
    cd /
    umount /dev/sda1

    4. 开始转换

    tune2fs -O extents,uninit_bg,dir_index /dev/sda1
    fsck -pf /dev/sda1

    5. 稍等一下就转换成功了. 确认转换成功

    parted
    print all
    quit

    6. 重启画面可以看到/boot分区是ext4格式了

    Date: 四月 2nd, 2009
    Cate: tools
    4 msgs

    MDIE plugin – 在当前文件夹打开cmd窗口

    MDIE是一个日本产的多窗口浏览器,速度快,支持鼠标手势, 还有很多好处数不胜数,现在它已经成功取代QTTabbar在我电脑里的位置.

    MDIE支持通过JavaScript扩展软件功能, 于是也写了一个插件:在当前窗口打开cmd窗口,并进入到当前目录.

    用到的javascript的代码:

    var cmdbat = "S:\\Softwares\\MDIE\\script\\test.bat";
    var shell = new ActiveXObject("WScript.Shell");
    shell.Run(‘cmd /K ‘ + cmdbat + ‘ "‘ + FolderView.Path + ‘"’);//以/K模式打开cmd窗口执行后不关闭, 并传递当前文件夹路径给bat文件

    以下是bat文件内容:

    @echo off rem 不打印命令
    set root=%1 rem 设置临时变量
    title %root:~1,-2% rem 将cmd窗口标题置为指定文件夹
    %root:~1,2% rem 切换盘符, 因为cd命令不能直接进入其他盘符的文件夹
    cd %1 rem 进入指定文件夹

    将这个脚本和鼠标手势关联起来, 会带来非常炫的效果.

    感谢z29的回复.

    修改bat内容为如下:

    :: 不打印命令
    @echo off
    :: 设置临时变量
    set tmp=%1
    :: 将cmd窗口标题置为指定文件夹
    title %tmp:~1,-1%
    :: 进入指定文件夹
    cd /d %1

    如果不需要修改窗口标题, 直接写的javascript如下:

    var shell = new ActiveXObject("WScript.Shell");
    shell.Run(‘cmd /K @cd /d "’ + FolderView.Path + ‘"’);//以/K模式打开cmd窗口执行后不关闭

    Date: 三月 25th, 2009
    Cate: tools

    用于调试监听程序HTTP传输的工具

    开发中常有需要调试SOAP的时候, 有时不是自己的代码, 或者即使是自己的代码, 写日志也不方便, 或者SOAP Client根本没提供日志输出.
    一般来说, 可以用一些抓包软件来抓传输HTTP时通过网卡的流量, 类似软件有wireshark等.但其中很大的不便在于网卡的流量是分包的,不容易完整的查看一个事务.
    因此这个SoftX HTTP Debugger就有了用武之地.

    它可以查看选定程序的HTTP流量,比如java.exe(含weblogic等),用来调试java程序的web service交互.

    它可以调试,中途截断,或者返回自定义数据.

    不过似乎不能调试HTTPS.

    先点调试程序,然后选择程序

    http_debugger1

    正常操作程序

    http_debugger2

    可以查看接受到或者发出去的HTTP流量,如这里的SOAP的XML文件

    http_debugger3

    相当有用的工具,虽然不用的时候不需要,但想用的时候绝对可以提供极大的方便.

    下载看这里http://www.greendown.cn/soft/3523.html

    Date: 三月 13th, 2009
    Cate: css

    自定义上传按钮样式

    上传控件的按钮与输入框是绑定一起的,所以不能单独自定义样式.
    而浏览器因为安全问题,要求上传必须通过直接点击上传控件实现,而不能通过javascript间接调用.
    所以为了页面美观,保持样式一致, 要么放弃使用上传控件改用flash, 要么就想方设法绕过去.

    其中一种方法如下

    customized_file_upload

    源码在此

    <style type="text/css">
    .goButton {
        vertical-align:middle;
        cursor:pointer;
        width:auto;
        overflow:visible;
        font: bold 11px Arial, Helvetica, sans-serif;
        color: #F5F5F5;
        background-color: #626262;
        outline: 1px solid #626262;
        border: 1px solid #FFF !important;
        border: 3px double #626262;
        outline-bottom: 1px solid #626262;
        border-bottom: 1px solid #626262 !important;
        border-bottom:1px solid #626262;
        padding-left:4px;
        padding-right:4px;
    }
    .browseButton {
        position:absolute;
        top:0;
        left:250px;
    }
    .filediv {
        position:relative;
    }
    .file {
        position:absolute;
        top:0;
        left:0;
        cursor:pointer;
        FILTER: alpha(opacity=0); /* IE */
        -moz-opacity:0.0; /* Moz + FF */
        opacity: 0.0; /* CSS3 */
    }
    .fileText {
        position:absolute;
        top:0;
        left:0;
        width:248px
    }
    </style>
    <div class="filediv">
        <div>
            <input type="button" value="Browse…" class="goButton browseButton" />
        </div>
        <div>
            <input type="file" class="file" hidefocus="true" size="37" onchange="document.getElementById(‘tt’).value=this.value;" /> 
        </div> 
        <div> 
            <input type="text" id="tt" readonly="true" class="fileText" /> 
        </div>
    </div>

    如果要移动这个控件,可以定义filediv的位置. <
    br />此方法有一点不足,用以代替的按钮只有一部分位置可点击,所以切记不要写很多文字.

    Date: 三月 8th, 2009
    Cate: 未分类

    MSN无法登陆的可能原因及解决方法

    买了新电脑,装了新的2003,装了msi版的MSN,装了该装的或可能不需要的组件,居然发现MSN报各种莫名的以800和810开头的错.网上的各种方法也都试过,但都不奏效.

    问题解决的路径是这样的:

    1. 正常登陆总是有各种莫名错误

    2. 发现测试的时候似乎检查端口的时候很慢, 且有时行有时不行

    3. 使用了IE代理的时候能顺利登陆

    4. 于是想是否端口被限制

    5. 将路由DMZ主机设置成本机, 结果依然不能顺利登陆

    6. 检查windows防火墙, 结果根本没开

    7. 偶然想起卡巴斯基有安全防御, 其中有相关web监控, 于是查看什么内容

    8. 有监控端口, 其中有MSN端口1863端口.

    9. 去掉对1863端口监控, 结果MSN能顺利登陆

    总结: MSN无法登陆的时候检查下端口通讯是否良好, 是否有杀毒软件监控端口, 这次纯属卡巴斯基好心办坏事.