网页中跨域iframe避免相互刷新死循环的方法
最近在做的系统,需要与客户的网页集成,因此牵涉到了跨域访问的问题。所以使用了大量的iframe绕过浏览器的安全策略。
由于跨域系统的安全限制,这些iframe之间是不能相互通信的,需要靠onload事件和父窗口进行交互,而iframe的刷新动作则须由父窗口控制。
其中遇到了一个有意思的问题。大致是这样的:页面打开时,用户没有登录系统,所有的iframe加载后处于未登录状态,点击任意一个iframe,系统会弹出登录画面,登录系统后,需要重新加载这些iframe,从而实现登录状态的同步。
如下面2张图所示:


于是,我在父窗口中写了这样的jquery脚本:
function refresh() {
__self = $(this);
$('iframe.myDomain').each(function(){
if($(this).attr(id) != __self.attr(id)) {
url = $(this).attr('src');
url = url.replace(/\?rand=.*$/, '?rand=' + Math.random());
$(this).attr('src', url);
}
});
}
$('iframe.myDomain').each(function(){
$(this).bind('load', refresh);
});
每当onload事件发生的时候,refresh函数会被触发,然后就会更新其他的iframe。但是,这样做有个重大的问题!如下图所示,当其他的iframe刷新完成的时候,同样会产生onload事件,此时,refresh再次被触发,又去刷新其他的iframe,产生了连锁反应,整个加载动作陷入了死循环!

为了避免这样的死循环,我们需要让接受到刷新指令的iframe在重新加载页面后不向其他iframe再次发送刷新指令,同时又要让其自身做好接受下一个刷新指令的准备。实现的方法很简单,只要稍稍修改我们的js代码即可。
function noRefresh() {
//不触发任何动作的onload事件处理函数
//重新绑定事件处理函数,为下一次处理onload事件做准备。
$(this).unbind('load');
$(this).bind('load', refresh);
}
function refresh() {
__self = $(this);
$('iframe.myDomain').each(function(){
if($(this).attr('id') != __self.attr('id')) {
url = $(this).attr('src')
url = url.replace(/\?rand=.*$/, '?rand=' + Math.random());
//将待刷新的iframe的onload处理函数重新设置
//其自身刷新后,调用noRefresh,防止刷新事件死循环
$(this).unbind('load');
$(this).bind('load', noRefresh);
//现在,刷新时就不会引起连锁反应了。
$(this).attr('src', url);
}
});
}
$('iframe.myDomain').each(function(){
//初始化的时候,关闭所有的onload事件
$(this).bind('load', noRefresh);
});
OK,问题解决!
最近安装新工作换进的问题总结
配置新的Ubuntu工作机的时候,遇到了些问题,在此总结一下。
A. q4m无法正确编译。
这是由于gcc的版本过高引起的(默认安装的是gcc-4.4)。解决方法如下:
-
安装gcc-4.1:
1$ sudo apt-get install gcc-4.1
-
执行configure的时候用如下的参数:
1
2
3$ ./configure --with-mysql=/usr/local/src/mysql-dfsg-5.1-5.1.41 \
CPPFLAGS=-I/usr/include/mysql \
CXX=g++-4.1
B. evince打开pdf后,左边的目录出现乱码。
原因是由于apparmor禁止evince访问我自定义的字体路径(/fonts),参考了launchpad上的讨论,解决方法如下:
-
修改安全规则,编辑/etc/apparmor.d/usr.bin.evince,加入对字体目录的访问权限:
1
2
3
4
5
6/usr/bin/evince {
#include <abstractions/evince>
#加入下面这2行
/fonts/ r,
/fonts/** r,
#后略 -
重新启动apparmor,此后再启动evince,打开pdf即可:
1$ sudo /etc/init.d/apparmor restart
C. MySQL Workbench 的sql编辑窗口出现乱码
原因不知道,解决方法很简单,只要打开Preferences -> Appearance,删掉Editor的字体名称即可。(汗,之前试了很多字体,都没成功……)
收集一些Canon使用的照片风格
佳能很早就在单反相机里增加了照片风格(Picture Style)的功能。对于我这种经常直出jpeg的懒人来说,还是相当方便的。机身内藏了6款风格,另有3个空档可自由定义。佳能官方提供的照片风格不是很多,幸运的是已经有人做了很多第三方的风格数据。
声明:本文所有风格数据文件以及图片样例都转自 http://www.ecpz.net/viewthread.php?tid=32394
机身内藏的Picture Style有6种:
1) Standard [标准] : 标准色彩配置
2) Portrait [人像] : 降低皮肤红黃二色调使皮肤变得更亮白些
3) Landscape [风景] : 加强了蓝绿颜色的表現,色彩对比鲜艳
4) Neutral [中性] : 近乎原始中性的色彩
5) Faithful [可靠] : 完整呈现在色温5200K的景物的原始色调
6) Monochrome [单色] : 提供了黑白/黃色/橙色/红色/绿色滤镜效果
佳能官网上提供的额外风格:
7 ) Nostagia [怀旧] 除了黃色外,降低了其他颜色的饱和度
8 ) Clear [明亮] 颜色浓烈且对比度高,有点Lomo 正片 feel
9 ) Twilight [晨光/黃昏] 将蓝天呈现为紫红色
10) Emerald [翠绿] 可让海洋颜色更清澈翠绿
11) Autumn Hues [枫红] 增强红和黃色的色调與立体感
12) Portrait Studio [影楼人像] 皮肤颜色偏淡,呈现出白里透红感觉,对比度亦相应减低了一点
13) Portrait Snapshot [抓拍人像] 和影楼人像模式差不多,不过对比度稍为加强
以下是第三方制作的风格
14) RVP 100F
15) RVP Vivid
16) RVP Mild
17) RVP Neutral
18) RDP III
19) T6NA
20) Howay 5.0
21) Olympus Blue
22) E to C
23) New Standard
24) New Emerald
25) Portrait Soft
26) Tsuyazakura
27) Wagokoro Standard
28) Step by Step
29) Old Town Neutral
30) Oil Color
31) Huukei Neutral
32) Akiiro Kouyou
33) Cluster Amaryllis
下面是这些风格的样例(不包括 Monochrome):
解决了重启/关机时cifs超时的问题
自从换了10.04后,系统重启/关机时,cifs超时的老问题又出来了,要等上一分钟左右才有反应。launchpad上也有很多与此有关的bug(参见这里)。
根据帖子里几个兄弟的回复,尝试了调整umountnfs.sh的顺序,但是始终没有办法避免这个问题。
今天偶尔google到了这篇blog,终于解决了这个问题。
做法很简单,只要修改/etc/init/network-manager.conf,加入一段pre-stop script即可,完整的配置文件如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 # network-manager - network connection manager
#
# The Network Manager daemon manages the system's network connections,
# automatically switching between the best available.
description "network connection manager"
# fix the cifs timeout on reboot/shutdown
# http://swiss.ubuntuforums.org/showthread.php?t=1396770
pre-stop script
trap "Caught TERM Signal" TERM
/etc/init.d/umountnfs.sh
trap - TERM
end script
start on (local-filesystems
and started dbus)
stop on stopping dbus
expect fork
respawn
exec NetworkManager
flash player 10.1 的2个进步
虽然我不太喜欢flash的封闭态度,不过adobe倒也并不像Steve Jobs说的那样不思进取。
原本在linux里访问flash技术的网页,经常会遇到2个问题:
- 中文显示成方块,可以通过删除 /etc/fonts/conf.d/49-sansserif.conf 解决。
- 中文输入法无法使用。
这几天把Ubuntu升级到了10.04,google一些配置问题的时候,发现有帖子说flash 10.1 beta已经解决了这些问题。
于是从 http://labs.adobe.com/downloads/flashplayer10.html 下载了rc2版的新插件试试。
安装很简单,解开压缩包后,把libflashplayer.so替换flash-installer包自带的文件即可。
1 | sudo tar zxvf flashplayer10_1_rc2_linux_041910.tar.gz -C /usr/lib/flash-installer/ |
看一看系统自带的10.0和新的10.1 rc2的区别吧:
Equinox p2笔记
Equinox p2是Equinox的组件之一,极大增强了基于Eclipse的包管理功能。
引入p2之后,典型的eclipse目录结构如下:
eclipse/
configuration/
config.ini
org.eclipse.equinox.simpleconfigurator/
bundles.info
dropins/
features/
p2/
plugins/
eclipse.exe
eclipse.ini
...
- p2
目录用于存放p2自身的配置文件 - bundles.info
保存的是安装的插件列表,这个文件由p2维护。有时因为开发需要,也可以手工修改(不建议这么做)。 - dropins
向下兼容用的插件目录,对于无法使用p2安装的插件,直接扔进去就能使用。后面会详细说明。
dropins
p2提供了一种监视目录机制(watched directories),能够自动从被监视的目录中安装及卸载插件。dropins是默认的监视目录。p2在加载dropins目录中的插件时,能够自动解决依赖关系。需要特别注意的是,如果通过p2升级一个安装在dropins目录中的插件,则新版本会安装在eclipse/plugins和eclipse/features目录中。
dropins目录中的插件可以以多种目录组织方式部署,具体可以参看Supported dropins formats。
此外,还可以让多个eclipse共享一个dropins目录,具体的做法在《使用 Equinox p2 简化 Eclipse 插件的安装》有详细介绍。
Bundle pooling
引入p2前,共享插件时间很麻烦的事情,需要通过links的方式。p2支持bundle pooling的方式共享插件包。避免因磁盘上重复包太多引发的一系列管理和空间浪费的问题。
关于bundle pooling的例子,可以参看Bundle pooling
参考资料
OSGi 初体验
最近开始入门OSGi。找到一本《Modular Java —— Creating Flexible Applications with OSGi and Spring》,只有200多页,先从简单的开始吧!
之前对OSGi一直没什么清晰的概念,而这本书里一开始就给了OSGi一个很形象的比喻:
OSGi is sometimes described as “SOA in a JVM.”
在模块化方面,OSGi相对于传统的JVM,有显著的优势:
- Bundle is given its own class space (Bundle运行于独立的类空间之中)
基于这个特性,多个版本的bundle可以在运行时并存。 - 动态模块化,OSGi平台管理bundle的声明周期。可以在运行时动态安装、启动、停止、卸载bundle。
但有一点必须强调:与任何技术一样,OSGi也不是银弹。OSGi仅提供了一种更为灵活和丰富的模块化架构的平台,而真正高质量的模块化设计依然需要设计师遵循了模块化设计的思想。
训练日志 2009-08-07
2009-08-07
训练部位:腿
1. 深蹲
热身:50kg x 12
冲重量:70kg x 6,90kg x 2,100kg x 2
正式: 70kg x 8 (4组)
2. 坐姿曲腿
正式: 20kg x 8 (4组)
3. 坐姿伸腿
正式: 25kg x 10 (4组)
4. 站姿提踵
正式: 史密斯机+30kg x 12 (4组)
训练部位:腹部
1. 举腿
正式:15次(4组)
2. 曲腿仰卧起坐
正式:15次(4组)
训练日志 2009-08-04
2009-08-02
训练部位:手臂后侧
1. 仰卧臂屈伸
热身: 20kg x 10
冲重量: 30kg x 6, 40kg x 4, 45kg x 2
正式: 30kg x 8(4组)
2. 颈后单臂屈伸
正式:10LBs x 8(4组)
3. 俯身臂屈伸
正式:10LBs x 8(4组)
训练部位:腹部
1. 举腿
正式:15次(4组)
2. 曲腿仰卧起坐
正式:15次 (4组)





