手机浏览 RSS 2.0 订阅 膘叔的简单人生 , 腾讯云RDS购买 | 超便宜的Vultr , 注册 | 登陆
浏览模式: 标准 | 列表2024年11月的文章

jQuery Plugins -- JQzoom

demo地址:http://www.51toria.cn/demo/JQplus/jqzoom/

 

使用的JS:

 

XML/HTML代码(用JS代码的时候居然卡住了。没办法,只能用XML代码来展示)
  1. //**************************************************************  
  2. // jQZoom allows you to realize a small magnifier window,close  
  3. // to the image or images on your web page easily.  
  4. //  
  5. // jqZoom version 1.0  
  6. // Author Doc. Ing. Renzi Marco(www.mind-projects.it)  
  7. // Released on Dec 05 2007  
  8. // i'm searching for a job,pick me up!!!  
  9. // mail: renzi.mrc@gmail.com  
  10. //**************************************************************  
  11.   
  12. (function($){  
  13.   
  14.         $.fn.jqueryzoom = function(options){  
  15.   
  16.         var settings = {  
  17.                 xzoom: 200,     //zoomed width default width  
  18.                 yzoom: 200,     //zoomed div default width  
  19.                 offset: 10,     //zoomed div default offset  
  20.                 position: "right"  //zoomed div default position,offset position is to the right of the image  
  21.             };  
  22.   
  23.             if(options) {  
  24.                 $.extend(settings, options);  
  25.             }  
  26.   
  27.         $(this).hover(function(){  
  28.   
  29.   
  30.             var imageLeft = $(this).get(0).offsetLeft;  
  31.             var imageRight = $(this).get(0).offsetRight;  
  32.             var imageTop =  $(this).get(0).offsetTop;  
  33.             var imageWidth = $(this).get(0).offsetWidth;  
  34.             var imageHeight = $(this).get(0).offsetHeight;  
  35.   
  36.             var bigimage = $(this).attr("alt");  
  37.   
  38.             if($("div.zoomdiv").get().length == 0){  
  39.   
  40.             $(this).after("<div class='zoomdiv'><img class='bigimg' src='"+bigimage+"'/></div>");  
  41.   
  42.             }  
  43.   
  44.             if(settings.position == "right"){  
  45.   
  46.             leftpos = imageLeft + imageWidth + settings.offset;  
  47.   
  48.             }else{  
  49.   
  50.             leftpos = imageLeft - settings.xzoom - settings.offset;  
  51.   
  52.             }  
  53.   
  54.             $("div.zoomdiv").css({ top: imageTop,left: leftpos });  
  55.   
  56.             $("div.zoomdiv").width(settings.xzoom);  
  57.   
  58.             $("div.zoomdiv").height(settings.yzoom);  
  59.   
  60.             $("div.zoomdiv").show();  
  61.   
  62.   
  63.                     $(document.body).mousemove(function(e){  
  64.   
  65.                     var bigwidth = $(".bigimg").get(0).offsetWidth;  
  66.   
  67.                     var bigheight = $(".bigimg").get(0).offsetHeight;  
  68.   
  69.                     var scaley ='x';  
  70.   
  71.                     var scalex'y';  
  72.   
  73.   
  74.                     if(isNaN(scalex)|isNaN(scaley)){  
  75.   
  76.                     var scalex = Math.round(bigwidth/imageWidth) ;  
  77.   
  78.                     var scaley = Math.round(bigheight/imageHeight);  
  79.   
  80.                     }  
  81.   
  82.                     mouse = new MouseEvent(e);  
  83.   
  84.   
  85.   
  86.                     scrolly = mouse.y - imageTop - ($("div.zoomdiv").height()*1/scaley)/2 ;  
  87.   
  88.                     $("div.zoomdiv").get(0).scrollTop = scrolly * scaley  ;  
  89.   
  90.                     scrollx =    mouse.x - imageLeft - ($("div.zoomdiv").width()*1/scalex)/2 ;  
  91.   
  92.                     $("div.zoomdiv").get(0).scrollLeft = (scrollx) * scalex ;  
  93.   
  94.   
  95.                     });  
  96.             },function(){  
  97.                $("div.zoomdiv").hide();  
  98.                $(document.body).unbind("mousemove");  
  99.                $(".lenszoom").remove();  
  100.                $("div.zoomdiv").remove();  
  101.             });  
  102.   
  103.         }  
  104.   
  105. })(jQuery);  
  106.   
  107. function MouseEvent(e) {  
  108. this.x = e.pageX  
  109. this.y = e.pageY  
  110. }  

 

页面调用方法:

JavaScript代码
  1. jQuery.noConflict();  
  2. jQuery(document).ready(function(){  
  3. $("img.jqzoom").jqueryzoom();  
  4. });  

 

Tags: jquery, plugins, jqzoom, javascript, demo

不要轻信 PHP_SELF

原文地址:http://www.phpv.net/html/1639.html,作者:手气不错

未删节版本

开门见山,考虑下面的代码(原文连接有详细的解释)

PHP代码
  1. <html>  
  2.     <body>  
  3.         <?php  
  4.             if (isset($_REQUEST['submitted']) && $_REQUEST['submitted'] == '1') {  
  5.                 echo "Form submitted!";  
  6.             }  
  7.         ?>  
  8.         <form action="<?php echo $_SERVER['PHP_SELF']; ?>">  
  9.             <input type="hidden" name="submitted" value="1" />  
  10.             <input type="submit" value="Submit!" />  
  11.         </form>  
  12.     </body>  
  13. </html>  

看似准确无误的代码,但是暗藏着危险。让我们将其保存为 foo.php ,然后放到 PHP 环境中使用

foo.php/%22%3E%3Cscript%3Ealert('xss')%3C/script%3E%3Cfoo

访问,会发现弹出个 Javascript 的 alert -- 这很明显又是个 XSS 的注入漏洞。究其原因,发现是在

echo $_SERVER['PHP_SELF'];

这条语句上直接输出了未过滤的值。追根数源,我们看下 PHP 手册的描述

'PHP_SELF'

The filename of the currently executing script, relative to the document root.
For instance, $_SERVER['PHP_SELF'] in a script at the address
http://example.com/test.php/foo.bar would be /test.php/foo.bar. The __FILE__
constant contains the full path and filename of the current (i.e. included) file.
If PHP is running as a command-line processor this variable contains the script
name since PHP 4.3.0. Previously it was not available.

原因很明确了,原来是 $_SERVER['PHP_SELF'] 虽然“看起来”是服务器提供的环境变量,但这的确和 $_POST 与 $_GET 一样,是可以被用户更改的。

其它类似的变量有很多,比如 $_COOKIE 等(如果用户想“把玩”他们的 cookie,那我们也是没有办法)。解决方案很简单,使用 strip_tagshtmlentities 等此类函数过滤或者转义。

echo htmlentities($_SERVER['PHP_SELF']);

-- Split --

上述的例子让我们需要时刻保持谨慎 coding 的心态。Chris Shiflett 在他的 Blog 总结的相当直白,防止 XSS 的两个基本的安全思想就是

Filter input
Escape output

我将上面翻译成 “过滤输入,转义输出”。详细的内容,可以参考他 Blog 的这篇文章,此处略。

Tags: php, php_self

MySQL主从服务器的一些技巧

问题:主从服务器表类型的选择

一般的共识是主服务器使用innodb,从服务器使用myisam,以便各尽其能。

问题:主从服务器字段类型的选择

字段类型对于分页等操作有很大影响。主服务器一般是innodb,因为不涉及查询,所以可以使用varchar等来存储字符串来节省空间,从服务器一般是 myisam,因为涉及查询,所以必须在char和varchar之间仔细权衡,没有varchar, text, blob字段的表是静态表,反之是动态表,静态表的检索效率要比动态表好若干倍,一般来说,所有涉及大结果集的查询都应该尽可能保证在静态表上完成,这里 说一个例子:比如说常见的articles表有title(varchar), body(text)等字段,在做文章列表的时候,因为不是静态表,所以查询不会很快,下面开始重构解决方案:把原来的articles表拆分成 subjects表和contents表,title字段设置为一个足够的char类型放在subjects表里,body字段还保持是text类型放到 contents表里,subjects和contents表之间的关系是一对多,这样,顺带着也方便的实现了多页文章的功能,而且更重要的是在查询文章 列表的时候,操作都是在subjects静态表里完成,效率肯定会比前一种方案提升很多。

问题:主从服务器NOW()函数造成数据不一致

假设在主服务器上执行一条INSERT .... VALUES ( ..., NOW()),那么在从服务器上也会同样执行一条的SQL语句,但是一来主从服务器各自的时间设置可能就不一致,二来主从服务器间的SQL同步也可能存在 时间上的的延迟,这样,NOW()在两台服务器上的结果就可能不一致。解决方法是显而易见的,就是不要使用NOW(),时间的计算在应用程序里完成。这里 介绍一个额外的小技巧:在PHP里如果想获得当前时间的时间戳,不要用time(),而应该使用$_SERVER[‘REQUEST_TIME’] (PHP版本大于5.1有效),这样少做了一次系统调用,更有效率。

问题:主从服务器读写分离时读操作失败

先重现一下问题:比如说添加一条新数据,添加成功后根据last_insert_id跳转到新添加数据的浏览页面。在此过程中添加新数据的操作是在主服务 器上完成的,浏览新数据的操作实在从服务器上完成的,不过由于主从服务器间SQL同步存在延迟,所以当使用last_insert_id在从服务器上查询 的时候,从服务器很可能还没有还没来得及同步到此记录,所以读操作失败。解决思路也不复杂,在代码里加入一个缓存层(可以使用memcached),新添 加的数据都顺手放到缓存层里一份,新数据的读操作也先查询缓存层,这样就不会再有读操作失败的问题了,当然删除或者更新数据的时候也要顺带着处理好缓存数 据,可以使用观察者模式来搞定。不过这样缓存方案只限于读取单一的记录,对于读取列表的记录的情况,则是无效的。

问题:主从服务器索引是否有必要保持一致

一般都是利用主从服务器完成读写分离,从服务器上进行读操作,主服务器进行写操作,这样的话,主服务器上仅保留主键,外键,唯一索引等必要的索引即可,以 便保持数据合法性,而对于那些原本用于优化SELECT操作的索引,可以全部删除,如此的话主服务器的写操作效率会提升很多。

作者:老王
原文:http://hi.baidu.com/thinkinginlamp/blog/item/5d72dd5469b1885fd0090633.html

Tags: database, mysql, 主从数据库, myisam, innodb

小家伙生病了

周六,小家伙病倒了,脸红红的。
因为平常也有时候会脸红,所以也没当一回事,第二天,才发现发烧了,听老婆说好象到40度了。在医院挂了水。
周一,结果发现烧退了,去医院检查了一下,发现白血球增多了。于是又挂了一瓶水先。
周二,去儿童医院检查一下。如果不行,可能准备住院了。

小家伙,希望你健康。
顺便提醒一下爸爸妈妈们,现在这个季节确实容易感冒,如果有人咳嗽啥的,尽量离远点。我们小家伙就是病毒性感冒。
尽量不要让别人走上来亲亲脸啥的。注意卫生啊。

再次希望小家伙身体健康

Tags: 肖佑阳, 生病, 病毒性感冒

使用CyberArticle收藏文章

对于国产软件,我还是一向抱着支持的态度的。对Maxthon支持过,购买过正版杀毒软件,使用着个人版的WPS、fOXMAIL等。

凡是力所能及的,我一般还是会选择支持一下。

这次我介绍的软件是CyberArticle,如果我没有记错的话,以前它还有个中文名叫网文快捕,很早就用它了,惭愧的是那时候用的好象是破解版的。(软件这东西,是越来越不值钱了,现在要想从软件上赚用户的钱,除了软件本身外,服务才是大头。)

5月的天空是黑白的,很多人都选择了将自己的一部分薪酬对四川同胞们进行了帮助。CyberArticle也不例外,对于原本25元的软件,降价为20元,同时承诺所有的钱全部捐给灾区。

然后,同事mpeg凭着一个善良、博爱的心购买了这款软件,同时又博爱的将注册码告诉了我,让我又体验了了一下正版软件的乐趣。(后来我将此软件又推荐了给某某糖同学,他也兴高采烈的告诉我,购买了正版软件,我为我感到“自豪”)

我说的当然不完全是介绍这款软件,只是本软件在5.1测试版后,正式开始支持mysql了,这才是让我很心动的地方。

作为一个搞PHP开发的WEB开发人员,我的电脑里没有access软件和sql server express等,但mysql是从3.x开始就一直睡在我的机器里了。

启动这个功能后,快捕同学在我的数据库里建立了n个表,然后我发现我所存储的数据全部是用bLOB字段进行存储的(本来还想自己导出来使用呢,现在看来,还是有点复杂度的。)

但至少还是方便了我,如果我以后(我是说如果)心情好的话,还可以把这个网文快捕的数据采用WEB方式提供在网上呀。

我第天摘呀摘,网站的内容也就会随之增加,多幸福的事情啊。(随便说说。还没有研究完CybleArticle的数据结构呢,而且,即使我建表的时候选择了utf8,它建出来的表,还是采用了latin1_swedish_ci,有点让人失望,呵呵。希望以后会有改进吧,同时希望数据结构能够再优化一点。能够把blob字段等单出提到外部去,而不是和一些其他相关信息存储在一条记录里。)

官方提示:

XML/HTML代码
  1. 需要注意的地方:  
  2. 1:MySQL安装。安装MySQL的时候,尽量选择utf-8作为默认的编码。  
  3.    
  4. 2:MySQL端口。如果MySQL采用了默认端口,您不需要做任何配置。  
  5. 否则,请找到CyberArticle安装目录下面的文件Plugins\Books\WizMySqlOleDB.ini,例如:  
  6. C:\Program files\Wizissoft\CyberArticle\Plugins\Books\WizMySqlOleDB.ini  
  7. 用记事本打开这个文件,将[Server]下面的port的值修改成MySQL端口,例如:  
  8. [Server]  
  9. port=4444  
  10. 然后保存该文件。  
  11.    
  12. 3:修改MySQL设置。  
  13. 找到MySQL安装目录,例如:D:\MySQL\my.ini  
  14. 用记事本打开my.ini 找到[mysqld]这一行,添加下面的内容:  
  15. #扩大缓冲区  
  16. max_allowed_packet=16M  
  17.    
  18. 修改完设置之后,请重新启动MySQL服务。  
  19.    
  20. 完成设置之后,您就可以新建MySQL类型的书籍了。  

 

Tags: cyberarticle, 收藏, 网文快捕, 国产软件, 支持