关注小众语言,记录、分享技术点滴!

0%

不希望数据表中有重复记录的时候我们可以给表添加一个联合唯一索引
例如,user表中有user_id,user_name两个字段,如果不希望有两条一摸一样的的user_id和user_name,我们可以给user表添加两个字段的联合唯一索引:

1
alter table user add unique index(user_id,user_name);

这样当向表中添加相同记录的时候,会返回1062的添加失败信息。
但是有一种情况是表中已经有n个重复的记录,这时候我们才想起来要添加唯一索引,再执行上面的操作时,数据库会告诉你已经有重复的记录了,建立索引失败,这时候,我们可以用下面的操作:

1
alter ignore table user add unique index(user_id,user_name);

它会删除重复的记录(别怕,会保留一条),然后建立唯一索引,高效而且人性化。
尤其是绿色的那条sql,在建立索引的同时删除了重复数据,相当有用。

在我们会在JS中用window.open来打开一个新窗口来处理一些操作,为了有更好的用户友好性,一般在关闭window.open打开的子窗口时,同时刷新父窗口来获取最新数据。代码如下:

1
2
3
4
function closeMeAndReloadParent(){
opener.location.reload();
window.close();
}

设计目标:
避免重复提交数据.
检查来路,是否是外部提交
匹配要执行的动作(如果有多个逻辑在同一个页面实现,比如新增,删除,修改放到一个PHP文件里操作)
这里所说的token是在页面显示的时候,写到FORM的一个隐藏表单项(type=hidden).
token不可明文,如果是明文,那就太危险了,所以要采用一定的加密方式.密文要可逆.俺算法很白痴,所以采用了网上一个现成的方法.

如何达到目的:
怎样避免重复提交?
在SESSION里要存一个数组,这个数组存放以经成功提交的token.在后台处理时,先判断这个token是否在这个数组里,如果存在,说明是重复提交.
如何检查来路?
可选项,这个token在生成的时候,加入了当前的session_id.如果别人copy你的html(token一迸copy),在提交时,理论上token里包含的session_id不等于当前session_id,就可以判断这次提交是外部提交.
如何匹配要执行的动作?
在token的时候,要把这个token的动作名称写进这个token里,这样,在处理的时候,把这个动作解出来进行比较就行了.

MySQL中同步两个表中的某些字段

以前我们在写update的时候往往是使用 update tablename set columnname = value这样的简单语法,而今天遇到一个需求,根据一张表中的数据来更新另外一张表中的某些字段值,比如有个A表和B表,A中有字段id,name,email,phone,cno,这里的cno也是唯一的,B表中有id,othercloumn,email,phone,cno,这时候想通过B中的email和phone值来更新A中的email和phone值。我们可以使用一下语句实现这个功能:

语句1

1
update A, B set A.email= B.email where A.cno=B.cno

语句2

1
update A set A.email= (select B.email from B where A.cno=B.cno)

在JavaScript中我们需要用到trim的地方很多,但是JavaScript又没有独立的trim函数或者方法可以使用,所以我们需要自己写个trim函数来实现我们的目的。
方案一: 以原型方式调用,即obj.trim()形式,此方式简单且使用方面广泛,定义方式如下:

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
/** * 删除左右两端的空格 */
String.prototype.trim=function() {
return this.replace(/(^\s*)|(\s*$)/g, '');
}
/** * 删除左边的空格 */
String.prototype.ltrim=function() {
return this.replace(/(^\s*)/g,'');
}
/** * 删除右边的空格 */
String.prototype.rtrim=function() {
return this.replace(/(\s*$)/g,'');
}
//使用示例如下:
alert(document.getElementById('abc').value.trim());
alert(document.getElementById('abc').value.ltrim());
alert(document.getElementById('abc').value.rtrim());
```
方案二: 以工具方式调用,即trim(obj)的形式,此方式可以用于特殊处理需要,定义方式如下:
```js
/** * 删除左右两端的空格 */
function trim(str) {
return str.replace(/(^\s*)|(\s*$)/g, '');
}
/** * 删除左边的空格 */
function ltrim(str) {
return str.replace(/(^\s*)/g,'');
}
/** * 删除右边的空格 */
function rtrim(str) {
return str.replace(/(\s*$)/g,'');
}
//使用示例如下:
alert(trim(document.getElementById('abc').value));
alert(ltrim(document.getElementById('abc').value));
alert(rtrim(document.getElementById('abc').value));

Charlie Miller是黑客大赛Pwn2Own连续两年的冠军,最近他在接受访问的时候爆出,微软的Windows 7操作系统比苹果的MacOS更难攻破,当被问及Linux是否更加安全的时候,Charlie说攻击Linux操作系统实际上更加容易,之所以针对Linux的攻击较少,主要是因为其普及规模不如Windows操作系统,看样子开源软件真的并非一定安全。

Charlie还提到,Flash插件实际上是一个巨大的安全威胁,安装了Flash的浏览器都是不安全的,很容易成为黑客攻击的目标。

人人网使用的开源软件列表

MySQL
关系型数据库存储系统,我们的DBA团队很强大,每人管理上百台MySQL服务器,其他就不多说了,网上资料太多了

Tokyo Cabinet
一个key-value的存储引擎,日本人开发,国内很多公司也开始使用,我们内部很多地方也用它来代替MySQL来做存储,比如我们的搜索结果页的用户资料,就是用它来做一层MySQL外的冗余存储,目的是加快搜索结果页的显示。在key-value并需要持久存储的场景下,用它比MySQL更有效,Cabinet本身只是一个存储引擎,没有网络处理能力,你可以用它作为自己的某个系统的下层存储引擎,更好的是搭配Tokyo Tyrant使用。

Tokyo Tyrant
一个支持Memcached传输协议的网络接口,由Tokyo Cabinet的作者开发,目的是为Tokyo Cabinet提供网络接入能力,即Tokyo Tyrant处理网络连接,协议解析,然后调用Tokyo Cabinet的API来完成持久化存储。

ICE
一个跨语言的网络通讯框架,框架本身提供了强大的通讯能力,管理工具,负载均衡方案,其跨语言能力也是一个很大的亮点,基于这个框架之上,我们选用合适的语言来提供合适的服务,比如我们使用C++来开发Cache服务,使用Java来开发一些逻辑服务。框架本身可以很重,也可以很轻,具体要看你怎么用:)

Memcached
一个纯内存的key-value的cache系统,高效、稳定,使用广泛,如果你连它都没听说过就太out啦,memcached本身不具备分布式能力,需要依靠Client来实现分布,这里强调一点的是,你应该选择一致性Hash来做key的分布。各种语言的client都有,我们使用spymemcached作为java的Client,spymemcached是一个异步的NIO的memcached client,对网络IO的处理非常的精巧,也更加高效,同时因为提供异步操作方式,可以让你对Memcached的操作有更好的控制能力,Memcached到1.4.0版本之后,开始支持binary protocol,spymemcached对其也支持的比较好,使用binary protocol可以提高对协议的解析效率和网络IO的读写效率。
上面说到我们使用ICE自己开发了Cache服务,为什么我们还要用Memcached呢?主要在对Cache的操作粒度不一样,Memcached对Cache对象以binary byte作为一个整体来操作,需要频繁的序列化和反序列化,我们使用ICE提供的Cache服务,可以以Cache对象的一个或者多个字段来操作,比如一个用户对象,我们可以只更新它的姓名,而Memcached

Nginx
高效、稳定的Web Server,我们利用其代理能力,做跨IDC的请求代理,同时也将其和我们的Resin(Java Web 容器)搭配,放在Resin的前面来解决Resin的对网络连接处理能力弱的问题,在一些小地方也用它来做7层的负载均衡

Resin
一个Java Web Server,比Tomcat更高效,是我们主要的Java Web容器

Squid
代理服务器,我们用他来做图片文件的反向代理缓存

LVS
能提供4层的负载均衡,高效、高可用,高并发。我们用他替代了很多硬件的负载均衡设备

Struts
Java web框架,不过这个已经是历史了,我们开发了一套自己的Web框架替代了它,未来我们也会把我们的内部的这套Web框架开源出来

Lucence
基于Java的搜索引擎框架,用它我们构建了一个搜索集群来提供搜人的服务

Netty
一个Java的网络框架,和apache的mina类似,但比mina更高效,我们用来做一些小的服务

Ganglia
一个监控系统,帮组我们了解我们每台Server的资源利用情况

首先我们先来了解一下域名的各种状态及域名注册与删除周期。

国际域名注册与删除周期

通常情况下,英文国际域名分为四种状态:活动期、注册商保留期、赎回期以及删除期。

  1. Active:国际域名在活动状态,最少注册时长不少于1年,最多注册时长不超过10年。
  2. On Hold:注册商保留期,一般为30天(Oray所注册顶级域名的保留期大约为30天),此期间虽然域名过期了,但用户仍然可以通过Oray对域名进行续费。
  3. RGP:赎回期,为40天,此期间用户必须付出高昂的费用才能重新获得该域名的拥有权。
  4. Soon To Expire:删除期,为5天,此期间域名无法注册和赎回。
  5. 四种状态过后,域名管理机构释放域名给公众注册。

国内域名注册与删除周期

通常情况下,国内域名分为三种状态

  1. Active:国内域名在活动状态,最少注册时长不少于1年,最多注册时长不超过10年。
  2. On Hold:注册商保留期,一般为1-45天(Oray所注册顶级域名的保留期大约为30天),此期间虽然域名过期了,但用户仍然可以通过Oray对域名进行续费。
  3. RGP:赎回期,为15天,此期间用户必须付出高昂的费用才能重新获得该域名的拥有权。
  4. 三种状态过后,域名管理机构释放域名给公众注册。
    可以看到,相比之下,国内域名过期后,释放出来给公众注册的时间比国际域名快,因此要更加注意对域名进行及时的续费。

Load Info在线制作Loading图标的免费网站,目前网站提供了90多种(总有一种适合你)动态图标。 点击图片,可以自定义背景色和前景色,更有三种不同的尺寸可以选择,包括 16×16, 24×24, 48×46,很是方便实用。Ajax Load同样可以在线制作Loading图标, Ajax Load所提供的种类没有Load Info丰富,不是先看到Loading的样式,下拉菜单选择样式,点击生成才能看到具体的样式 点击进入 loadinfo 点击进入 ajaxload

sql代码

1
2
3
4
5
6
7
8
9
10
SELECT id,title,CASE WHEN status='1' THEN '已审核' ELSE '未审核' END AS status FROM table  
#原表
id title status
11
2 我的 0

#最后显示 显示
id title status
1 我 已审核
2 我的 未审核