PHP5.3浮点数转换整型的问题
最近工作中遇到一个奇怪问题:
浮点数 intval((0.7+0.2)*100)=89 或者 (int)((0.7+0.2)*100)=89,其中只有0.7与0.2才会出现这样的情况,浮点数运算后,
转换为整型才有这个问题,也算是PHP的一个BUG吧,一句话:PHP够…..
我的PHP环境:php 5.3
在手机上使用 HTML5 创建离线的 Web 应用
记得在几年前的SAAS模式下,在浏览器实现离线操作,受到很多的局限性,今天在手机 上做一些离线小应用是没有问题的,如下:
开启浏览器缓存:<html manifest=”MyHomeStuff.manifest”>
(详细说明GOOGLE下)
有三个文件,test.html, MyHomeStuff.js, MyHomeStuff.manifest,具体内容如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | <!DOCTYPE HTML> <html manifest="MyHomeStuff.manifest"> <head> <meta name="viewport" content="width=480; initial-scale=1.0; maximum-scale=1.0; user-scalable=0;"> <title>MyHomeStuff</title> <script type="text/javascript" src="MyHomeStuff.js" ></script> </head> <body onload="onInit()"> <h3>Overview.</h3> <ul id="itemData" > </ul> <h3>Details</h3> <form name="itemForm"> <label for="id">Id:</label><input type="text" name="id" id="id" size=2 disabled="true"/> <label for="amount">Qty:</label><input type="text" name="amount" id="amount" size = 3/> <label for="name">Name:</label><input type="text" name="name" id="name" size=10 /> <br> <br> <input type="button" name="create" value="create" onclick="onCreate()" /> <input type="button" name="update" value="update" onclick="onUpdate()" /> <input type="button" name="delete" value="delete" onclick="onDelete()" /> </form> <h4>Status</h4> <div id="status"></div> </body> </html> |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 | //1. initialization var localDB = null; function onInit(){ try { if (!window.openDatabase) { updateStatus("Error: DB not supported"); } else { initDB(); createTables(); queryAndUpdateOverview(); } } catch (e) { if (e == 2) { updateStatus("Error: Invalid database version."); } else { updateStatus("Error: Unknown error " + e + "."); } return; } } function initDB(){ var shortName = 'stuffDB'; var version = '1.0'; var displayName = 'MyStuffDB'; var maxSize = 65536; // in bytes localDB = window.openDatabase(shortName, version, displayName, maxSize); } function createTables(){ var query = 'CREATE TABLE IF NOT EXISTS items(id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, amount VARCHAR NOT NULL, name VARCHAR NOT NULL);'; try { localDB.transaction(function(transaction){ transaction.executeSql(query, [], nullDataHandler, errorHandler); updateStatus("Table 'items' is present"); }); } catch (e) { updateStatus("Error: Unable to create table 'items' " + e + "."); return; } } //2. query db and view update // event handler start with on* function onUpdate(){ var id = document.itemForm.id.value; var amount = document.itemForm.amount.value; var name = document.itemForm.name.value; if (amount == "" || name == "") { updateStatus("'Amount' and 'Name' are required fields!"); } else { var query = "update items set amount=?, name=? where id=?;"; try { localDB.transaction(function(transaction){ transaction.executeSql(query, [amount, name, id], function(transaction, results){ if (!results.rowsAffected) { updateStatus("Error: No rows affected"); } else { updateForm("", "", ""); updateStatus("Updated rows:" + results.rowsAffected); queryAndUpdateOverview(); } }, errorHandler); }); } catch (e) { updateStatus("Error: Unable to perform an UPDATE " + e + "."); } } } function onDelete(){ var id = document.itemForm.id.value; var query = "delete from items where id=?;"; try { localDB.transaction(function(transaction){ transaction.executeSql(query, [id], function(transaction, results){ if (!results.rowsAffected) { updateStatus("Error: No rows affected."); } else { updateForm("", "", ""); updateStatus("Deleted rows:" + results.rowsAffected); queryAndUpdateOverview(); } }, errorHandler); }); } catch (e) { updateStatus("Error: Unable to perform an DELETE " + e + "."); } } function onCreate(){ var amount = document.itemForm.amount.value; var name = document.itemForm.name.value; if (amount == "" || name == "") { updateStatus("Error: 'Amount' and 'Name' are required fields!"); } else { var query = "insert into items (amount, name) VALUES (?, ?);"; try { localDB.transaction(function(transaction){ transaction.executeSql(query, [amount, name], function(transaction, results){ if (!results.rowsAffected) { updateStatus("Error: No rows affected."); } else { updateForm("", "", ""); updateStatus("Inserted row with id " + results.insertId); queryAndUpdateOverview(); } }, errorHandler); }); } catch (e) { updateStatus("Error: Unable to perform an INSERT " + e + "."); } } } function onSelect(htmlLIElement){ var id = htmlLIElement.getAttribute("id"); query = "SELECT * FROM items where id=?;"; try { localDB.transaction(function(transaction){ transaction.executeSql(query, [id], function(transaction, results){ var row = results.rows.item(0); updateForm(row['id'], row['amount'], row['name']); }, function(transaction, error){ updateStatus("Error: " + error.code + " Message: " + error.message); }); }); } catch (e) { updateStatus("Error: Unable to select data from the db " + e + "."); } } function queryAndUpdateOverview(){ //remove old table rows var dataRows = document.getElementById("itemData").getElementsByClassName("data"); while (dataRows.length > 0) { row = dataRows[0]; document.getElementById("itemData").removeChild(row); }; //read db data and create new table rows var query = "SELECT * FROM items;"; try { localDB.transaction(function(transaction){ transaction.executeSql(query, [], function(transaction, results){ for (var i = 0; i < results.rows.length; i++) { var row = results.rows.item(i); var li = document.createElement("li"); li.setAttribute("id", row['id']); li.setAttribute("class", "data"); li.setAttribute("onclick", "onSelect(this)"); var liText = document.createTextNode(row['amount'] + " x "+ row['name']); li.appendChild(liText); document.getElementById("itemData").appendChild(li); } }, function(transaction, error){ updateStatus("Error: " + error.code + " Message: " + error.message); }); }); } catch (e) { updateStatus("Error: Unable to select data from the db " + e + "."); } } // 3. misc utility functions // db data handler errorHandler = function(transaction, error){ updateStatus("Error: " + error.message); return true; } nullDataHandler = function(transaction, results){ } // update view functions function updateForm(id, amount, name){ document.itemForm.id.value = id; document.itemForm.amount.value = amount; document.itemForm.name.value = name; } function updateStatus(status){ document.getElementById('status').innerHTML = status; } |
1 2 | CACHE MANIFEST MyHomeStuff.js |
Redis 曝新 BUG:内存超限后的死循环
Redis曝出了一个新bug,如果你设定了Redis的maxmemory,并且这个Redis有Slave,那么当你的maxmemory限制达到后,就会出现死循环。具体原因和流程如下:
- Redis 达到了配置中设定的maxmemory限制,开始按LRU策略删除数据
- 被过期清除的数据会生成DEL 日志推送到Slave
- 但是如果Slave达到一定数量时,这条DEL日志使用的output buffer空间可能会超过刚刚清除数据空闲出来的空间,这时候会导致空间又超限了
- 于是整个清除过程就变成了死循环
而且这个问题不仅会出现在Slave的情况下,在写AOF buffer的时候也会发生同样的问题。
Redis作者随后发布了补丁(This fixes issue)对这个问题进行修复。目前此bug的修复已经合并到2.4的主干中,截止目前为止,Redis官方2.4.8稳定版本中已经包含对此问题的修复。
问题地址:issues #327
SEO优化网站的.htaccess技巧
1. 反盗链
那些盗用了你的内容,还不愿意自己存储图片的网站是无耻的。你可以通过以下配置来放置别人盗用你的图片:
RewriteBase /
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://(www.)?yoursite.com/.*$ [NC]
RewriteRule .(gif|jpg|swf|flv|png)$ /feed/ [R=302,L]
2. 防止目录浏览
有时候目录浏览是有用的,但大部分情况会有安全问题。为了让你的网站更安全,你可以通过htaccess文件来禁用这个功能:
1 Options All -Indexes
3. SEO友好的301永久重定向
这一招是我常用的。每次我更改网站URL结构的时候,我都会做301重定向:
Redirect 301 http://www.yoursite.com/article.html http://www.yoursite.com/archives/article
精美的后台管理界面模板布局和手机网站模版[转]
15个微型的JavaScript框架[转]
问一个 Web 开发者最喜欢的 JS 库是什么,多数回答都是 jQuery,不管他所作的网站是大是小。开发者倾向使用 jQuery 的原因是它可以降低代码的复杂度、而且 jQuery 经过良好的测试,大量的用户以及很好的社区生态以及大量的插件。
不过 jQuery 的体积比较大,本文即将介绍的是 15 个微型的 JavaScript 小框架,这些框架都支持 Web 和智能手机平台,短小精干。
Zepto.js
Zepto.js 是支持移动WebKit浏览器的JavaScript框架,具有与jQuery兼容的语法。2-5k的库,通过不错的API处理绝大多数的基本工作。
Data.js
Data.js 是一个数据操作和持久化的 JS 库,支持 Node.js 和浏览器。
一个简单的HTML标签搞死64位的Windows7
<iframe height=’18082563‘></iframe>
这个很小的 iframe 标签(当然了,实际上它运行起来并不小)是一个强大到足以让一个64位的Win7系统崩溃的标签,它将导致 Win7 发生著名的蓝屏错误 Blue Screen Of Death (BSoD). 该漏洞是由 w3bd3vil 报告的。
该漏洞在64位的Win7下的Safari 浏览器测试中招,我很讨厌蓝屏,因此没有测试其他浏览器。微软正在进一步验证该漏洞,下面是关于该漏洞的一些技术细节:
注意:请为自己的测试负责
描述:
该漏洞是由于 win32k.sys 的一个错误导致内存的崩溃,当页面上包含一个 iframe,其 height 属性是个非常大的值时该错误就会发生。
目前该漏洞仅存在于64位的win7系统。
解决方案:
目前尚无有效方案
Mac下架SVN
Mac create svn 作个笔记:
1.准备工作
准备好源码包安装,客户端我用smart svn
2.安装
安装不多写,make && make install
3.配置
首先需要创建一个版本库存放的目录,如:
# mkdir -p /usr/local/svndata
之后需要使用 svnadmin 命令来创建一个版本库,如:
# svnadmin create /usr/local/svndata/test
svnadmin 和 svnlook 都是服务器端的工具,他们可以直接操作版本库服务器上的目录和文件,
而不需要 Subversion 服务器运行。
进入到刚才创建的版本库目录 /var/svnroot/test 中,可以看到里面的目录结构如下:
# ls
conf db format hooks locks README.txt
其中的conf目录为存放配置文件的地方,里面共有三个文件:authz、passwd 和 svnserve.conf 。
svnserve.conf 文件是用来设置认证和授权策略的,例如认证使用简单的用户名和密码机制,授权策略为经过认证的用户可以读写版本库、匿名用户只能读不能写。这个配置文件如下:
[general]
# 匿名用户只读
anon-access = read
# 认证用户可写
auth-access = write
# 使用 passwd 文件保存用户名和密码
password-db = passwd
其中最后一行 password-db = passwd 的意思是按照 passwd 文件中设置的用户名和密码进行验证,故需要配置 passwd 文件,如:
[users]
test = 111111
4.启动
运行 svnserve 命令,带 -d 选项即可以作为一个单独的守护进程运行,-r 选项可以指定发布哪个目录下的版本库。
# svnserve -d -r /var/svnroot
一旦服务器运行,就在端口3690进行监听。使用 telnet 可以测试到 3690 端口已经开放了,如下:
# telnet 127.0.0.1 3690
Linux服务器管理软件
发现一套WEB服务器管理软件,个人感觉不错,与大家分享!
Linux服务器管理系统 wdcp v2.0 正式版发布
不多说,可看演示http://demo.wdlinux.cn:8080
用户密码:admin/wdlinux.cn
详细功能列表 http://www.wdlinux.cn/wdcp
原文章链接:URL

近期评论