2012 年 10 月

浏览模式: 标准 | 列表 | 图文
thinkinlamp 数据库大会

thinkinlamp 数据库大会

归到数据库分类实在让我有点汗颜,毕竟这只是一个聚会性质的交流。并非真的就是与数据库相关,但内容因为还是涉及到了数据库,所以。。。归到这里吧。

这次大会去的比较晚了,因为小朋友的屁股上发了点东西(俗语:风疹块),所以本来是考虑不去的,但因为三件事,我还是去了:1、小朋友的屁股上用了以前的药,好了很多,几乎没了;2、票子送不掉,很多人一听是早上8点到场,都大义懔然的放弃了;3、锅巴引诱我,说是给我准备了特别的礼物

意外:意外在这里看到了前前同事,余老板,原来,她还在篱笆网,她笑称自己是钉子户,其实我是真的挺佩服她,能在国内一家互联网公司做超过5年,并不是一件容易的事情。

废话说了那么多,现在就让我们开始吧。
因为去的晚,所以对数据库与SSD的存储没有听到多少,但说白了,听了对我也没多大用处,小公司吧,用不上这些,大公司吧,可挑选的余地又太大,如果求稳,就研究不了新技术 ,如果求新技术 ,却又不能保证一定稳定,象网易,在云阅读上就用了SSD的硬件,我想他在备份上面的代价会是多少呢?小公司真的烧不起这个钱啊,虽然说混合应用的SSD+SATA的盘1T也才1000左右,但我们没那么多机房来折腾,也不会有dell公司的人来帮忙维护和技术支持,我们不是VIP用户啊,亲

第二个演讲的又是让我很郁闷的,虽然我在事前其实也很想知道这一块的东西,legenddb,类似于mysql proxy或者说mysqlcluster的工具,他们确实走在了我们的前面,但对应用型 的公司来说,没人敢用就是一个很大的问题。你没有完整的技术支持,不能保证后续的服务,出了BUG,你不能在很快响应。国内很多公司选择了mysql,有很大一部分原因在于,mysql社区版是开源的,所以可以有针对性的对它进行修改。如果你legend开源了,你还能走多久?legenddb,老谭也在台上说了,目前在某些join查询上效率还不是很高。而legenddb最大的功能其实就是用来做分布式数据库,并且通过timeline来做数据同步等(为了一致,每台服务器还必须得精准校验时间,否则可能会出问题,即数据出错),有兴趣的朋友可以上他们的网站上看看:http://www.mysqlab.net/,我感兴趣的原因是,它们说他们的软件是基于go开发的,黑黑

第三位演讲的是支付宝的朋友。讲了一个数据库的架构方面的设计,即又要保证ACID,还得让CAP这个标准也能够相对较好的应用。什么时候选择ACP,什么时候选择APC,都是一个讲究,在这上面,他用了一个简单的例子,即:用户付钱给商家。看起来很简单,但因为支付宝是担保交易,所以,简单的看起来就是:
1、用户支付时:用户update余额,中间帐户update状态
2、物流进行时:中间帐户维护状态
3、用户确认时:商家update余额,中间帐户update状态
只是在第一步的时候,特别是在聚划算的时候,传说每秒就是几千单,如果从传统意义上来说,没有一台服务器能够达到这样的效果,于是就采用了类似分片的效果,将中间帐户切分成N份(也就可以用N台机器来处理),然后再通过事务合并(这一段是我猜想。。。)
有时候说起来简单,做起来很复杂啊。比如他说,当搞活动的时候就加几台机器,活动结束后就减几台机器。对于程序来说,加减法并不是数学上的加减法,每加一台服务器,带来的成本和风险就会大几分,怎么把握也是一个难题。当然对于我这样的应用型人来说,暂时遇不到,很幸福啊。
好象我对第三位演讲的内容也介绍的比较水,但由于他的内容集中在CAP把握的度上,所以我也不太好介绍,毕竟我对这方面的掌握也不是特别的深

第四位是神仙,(http://xiezhenye.com/),介绍了mongodb的auto sharding。好吧,小公司又是不太会用的一个项目,在小项目中,mysql的查询效率并不会太低于mongodb。所以我就稍稍看了一下,主要也是因为auto sharding是自动切分的,我就不多介绍了。
不过,技术人员的通病就是,自己会用,但不会说。或者是在QQ里在聊天群里非常能说,但现场三棍子打不出个闷屁来,这都是一个问题。下一步我就是要建议thinkinlamp经常搞搞小型聚会,先内部交流,逼着大家上台讲。讲完了再下来沉淀,然后所有人讲完后,再接着讲一遍。只有这样,以后才能真正的走出来,不然,永远只是幕后,没有人认识你啊。

第五位是新浪微博的朋友。他先是很自我宣传了一下,然后介绍了他们在项目中用redis处理计数的功能。表面上很简单的几个数字,来的却并不方便,这其中最大的问题就是用户基数。用他们的话来说,就算是做cache,也不是那么简单的。注册用户3.x亿,每天发贴有1亿+,峰值达到了300W+/秒(这个数据记不清了,希望没错,据说是在春节那天),1亿的数据,相应的人员的微博数要加1,相关人员的未读数要+1,这些存储所花的代价是多少?好吧,我们先用100,000,000折腾一下,1M是多少字节?1G是多少字节?光这些+1所占的空间是多少?如果再加上要绑定的key呢?即用户ID,但又不是直接就用户ID+1,而是uid+comment,uid+post这类组合的key,这样一算的话,它的key得是多长?占了多少空间???说说都是很恐怖的事情,不要说是在做了,所以新浪在不停的为key减少空间。毕竟value只是一个整型,占的空间并不大,相反,key却真正的成了最大的存储空间占用的罪人。这一块的水比较深,我不多介绍。

其实中间还有一位厂商,DSG,但是我没有好好听,毕竟,oracle对我们来说太大了。。我还是初级用户。我很蛋定,谢谢。。。

中间,为了拿到锅巴准备的礼物,上去做一个“oppa 江南 style”的鸟叔POSE。。。。

还是APNS的一些问题

还是APNS的一些问题

其实在做APNS发送信息的时候,总会有一些信息好象没有收到。所以我就在想是什么问题。

看到这一篇的时候,才感觉可能会是这种原因:

问题四:Push消息丢失

如果客户端偶尔能收到消息,但有丢失,那很有可能是服务器往苹果APNs服务器写入失败、或者写成功后苹果服务器未发送(批量往一堆token发送消息,如果第一个token发送失败,那么苹果不会再给后面同一批的token推送消息)。失败原因可通过向苹果做Feekback查询。

---

这段文字来自:http://yangzl.net/tag/ios%E5%BC%80%E5%8F%91%EF%BC%8C%E6%B6%88%E6%81%AF%E6%8E%A8%E9%80%81/

同时觉醒和我说,feekback在这里可以查询一下:http://developer.apple.com/library/mac/#documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/ApplePushService/ApplePushService.html

里面是这么一句:Feedback Service

Sometimes APNs might attempt to deliver notifications for an application on a device, but the device may repeatedly refuse delivery because there is no target application. This often happens when the user has uninstalled the application. In these cases, APNs informs the provider through a feedback service that the provider connects with. The feedback service maintains a list of devices per application for which there were recent, repeated failed attempts to deliver notifications. The provider should obtain this list of devices and stop sending notifications to them. For more on this service, see “The Feedback Service.”

证明还是可以查的嘛 .准备下次慢慢查一下

生日快乐

生日一直是过阴历的,所以老婆也不知道我具体是哪一天。
反而,一大早老爸电话过来说生日快乐 .一下子心情感到激动又羞愧,他们生日的时候,我却也只是一个电话过去而已。

本来约定要吃穷某人的,结果因为老丈人、丈母娘发烧,小朋友拉肚子,老婆身体不舒服,所以放弃了这个伟大的计划,回家带小孩了。当然,照顾完小孩睡觉后。去楼下的小摊上叫了瓶啤酒,点了两个菜。算是过了生日。

然而,令人震精的事情发生了。。某些人居然在微博上炫耀:

最后的海豹:我们的目标,吃穷@颓废小魔,喝穷@膘叔,膘叔,你的牛肉在我这里,欢迎自提,啊哈哈哈,btw,生日快乐

转发(3)| 收藏| 评论 5分钟前 来自小米手机

颓废小魔微博达人: @膘叔 看! 我在:http://t.cn/zll6jsA

上海市,闵行区,姚虹路 - 显示地图

转发| 收藏| 评论 44分钟前 来自iPhone客户端

颓废小魔微博达人: @膘叔 看 我在:http://t.cn/zll6WlO

转发| 收藏| 评论 45分钟前 来自iPhone客户端

你说说看, 这个素质 .。。。真不厚道

测试VPS的磁盘I/O功能

测试VPS的磁盘I/O功能

一般来说测试磁盘的IO功能时都是用的:dd if=/dev/zero of=/root/zerofile bs=1M count=256

这样生成出来的文件大约是268M
为什么是/dev/zero,那是因为:/dev/zero文件代表一个永远输出 0的设备文件,使用它作输入可以得到全为空的文件。因此可用来创建新文件和以覆盖的方式清除旧文件。

当然dd还有另外一个参数:oflag=dsync
但是有人和我说:

Why are you using the flag dsync? This does not test the disks correctly and often reports bad speeds on SSD systems.

dd also will not test the read/write, it only tests sequential writes. Using ioping you can test the various types of disk speeds including random (the most important) or sequential (the least important).
所以,仅作参考即可,不要太当一回事吧

version_compare

version_compare

在项目中遇到点小问题。。。
比如:1.4.0与1.4.1对比。还有1.2与1.21对比
在初期的时候,我都是直接使用version_compare来对比的,但这时候就出现了问题

在国人眼中,1.21其实是1.2的后续版本,它是比1.3小的一个版本。但。。。version_compare即不认的。它认为1.21>1.2,当然1.21也>1.3。。。
好纠结啊。。。

后面没办法,对于1.4.0这种用version_compare了。对于1.21的,直接浮点数来比较了。NND

以后对版本号还是需要有一个规划,不能乱写啊

参考:如何在 Debian / Ubuntu 服务器上架设PPTP / L2TP / IPSec VPN

参考:如何在 Debian / Ubuntu 服务器上架设PPTP / L2TP / IPSec VPN

之前有在自己博客上介绍怎么样安装PPTP的VPN,但很多人说l2tp其实更安全,所以在想办法升级到l2tp...

随便google了一下,结果文章倒是很多,但几乎都打不开,难道这已经是一个关键字了??
还好google 有cache,所以,打开cache看了一下,并且复制回来,等会我就试试:

第一部分:如何用 Debian / Ubuntu 服务器上架设 PPTP VPN服务器

如果你有一台linux主机,通过putty.exe 或苹果电脑的teminal用SSH登录到主机后要用文本编辑器,若是上传下载编辑好的配置文件就太麻烦了。 我先简单介绍一下VI编辑器的用法,学会VI了就不且上传下载编辑好的配置文件了:

vi /etc/ilovezola.conf 这是进入编辑ilovezola.conf的模式,然后hjkl四个键是方向键,分别是左下上右,按字母x可删除一个字符。按a进入插入模式,hjkl就 不能当方向键用了。退出插入模式按ESC键,保存文件输入命令冒号加字母:w 退出输入命令:q 退出并保存就是 :wq

有了这些基础就可以安装PPTP VPN服务器了。下面绿色的字就是可以复制到命令行里执行的,蓝色的字是需要你对比或复制到文件中的,懒人办事效率高,复制吧,不会错的。
先登录你的主机:
ssh root@114.114.114.114
vi /etc/apt/sources.list
然后删除所有deb前面的#号 ,你按照这里操作就行,我直接引用,这不算抄袭:

接着用下面的命令更新你的软件包数据库
apt-get update
现在我们可以正式安装VPN server了。这里我们选择pptp(vpn 协议的一种),因为简单,一条命令搞定。剩下的无非是一些配置。
apt-get install pptpd
pptpd安装完成后,编辑这个文件,
vi /etc/pptpd.conf
去掉下面两行的注释或者直接添加这两行(在文件的最后).这一步是配置ip地址的范围。
localip 192.168.0.1
remoteip 192.168.0.234-238,192.168.0.245

然后在编辑这个文件,
vi /etc/ppp/chap-secrets
在这个文件中添加vpn用户,按照下面的格式,每个用户一行。
username pptpd password *
为了让你的用户连上VPN后能够正常地解析域名,我们需要手动设置DNS. vi /etc/ppp/options,找到ms-dns这一项,设置你的DNS.这里我推荐的是Google 最近发布的Public DNS,原因是因为好记。
ms-dns 8.8.8.8
ms-dns 8.8.4.4

vi /etc/sysctl.conf文件,找到"net.ipv4.ip_forward=1"这一行,去掉前面的注释。
net.ipv4.ip_forward=1
运行下面的命令让配置生效。
sysctl -p
重启pptpd服务
/etc/init.d/pptpd restart
最后开启iptables转发
/sbin/iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j MASQUERADE
ok,安装完毕。

附:使用PPTP VPN的方法:

  1. 如何在 Windows XP 中配置虚拟专用网络 (VPN) 连接 http://support.microsoft.com/kb/314076/zh-cn
  2. How to configure a connection to a virtual private network (VPN) in Windows XP http://support.microsoft.com/kb/314076/en
  3. iOS:设置 VPN http://support.apple.com/kb/HT1424?viewlocale=zh_CN
  4. iOS: Setting up VPN http://support.apple.com/kb/HT1424?viewlocale=en_US
  5. Mac OS X 10.6 Help 建立一个到虚拟专用网络的连接http://docs.info.apple.com/article.html?path=Mac/10.6/zh/9010.html
  6. 设定高级 VPN 选项 http://docs.info.apple.com/article.html?path=Mac/10.6/zh/11941.html
  7. Ubuntu下使用VPN http://wiki.ubuntu.org.cn/如何使用UbuntuVPN
  8. Installing personalVPN-PPTP on Android Mobile Phone http://wiki.witopia.net/wiki/Installing_personalVPN-PPTP_on_Android_Mobile_Phone

第二部分:如何用 Debian / Ubuntu 服务器安装成L2TP / IPSec VPN 服务器

Ubuntu 10.04 LTS(Lucid)自带的OpenSwan有NAT的BUG。10.10 openswan无此问题(但是10.10的xl2tpd有问题,不分配IP,需要手动指定,解决方案见下文,本文都是指使用Ubuntu 10.04 LTS)可以从OpenSWAN下载最新版本(2.6.24+)才可以。也可以使用非官方PPA源
sudo apt-get install python-software-properties
sudo add-apt-repository ppa:openswan/ppa
sudo apt-get update

然后查查看是否是已经跟更新到最新
apt-cache policy openswan
openswan:
Installed: 1:2.6.23+dfsg-1ubuntu1
Candidate: 1:2.6.31-1xelerance1
Version table:
1:2.6.31-1xelerance1 0
500 http://ppa.launchpad.net/openswan/ppa/ubuntu/ lucid/main Packages
*** 1:2.6.23+dfsg-1ubuntu1 0
500 http://us.archive.ubuntu.com/ubuntu/ lucid/universe Packages
100 /var/lib/dpkg/status

可见源里面已经获得2.6.31+的版本
apt-get install openswan就可以可以开始配置了
安装的时候一律回车即可
vi /etc/ipsec.conf,改成这样:
version 2.0
config setup
nat_traversal=yes
virtual_private=%v4:10.0.0.0/8,%v4:192.168.0.0/16,%v4:172.16.0.0/12
oe=off
protostack=netkey

conn L2TP-PSK-NAT
rightsubnet=vhost:%priv
also=L2TP-PSK-noNAT

conn L2TP-PSK-noNAT
authby=secret
pfs=no
auto=add
keyingtries=3
rekey=no
ikelifetime=8h
keylife=1h
type=transport
left=YOUR.SERVER.IP.ADDRESS
leftprotoport=17/1701
right=%any
rightprotoport=17/%any

vi /etc/ipsec.secrets,改成这样:
YOUR.SERVER.IP.ADDRESS %any: PSK "zhimakaimen"
(别忘了把红色的「YOUR.SERVER.IP.ADDRESS」这部分换成你的服务器的 IP 地址,把「zhimakaimen」部分换成随便一个字串,例如你喜欢的一句话如 ilovemoney,等等。)

运行以下命令,这下有点复杂了,前面的知识不够用了,继续补课,先
vi run.sh
然后复制下面的内容到run.sh并保存
for each in /proc/sys/net/ipv4/conf/*
do
echo 0 > $each/accept_redirects
echo 0 > $each/send_redirects
done

然后
./run.sh 这样就执行上面的循环命令了。
检查一下 IPSec 能否正常工作:
sudo ipsec verify
如果在结果中看到「Opportunistic Encryption Support」被禁用(disable)了,没关系,其他项 OK 即可。

重启 openswan:
sudo /etc/init.d/ipsec restart
安装 L2TP。常用的 L2TP 后台软件包是 xl2tpd,它和 openswan 是同一帮人写的。
运行以下命令:
sudo aptitude install xl2tpd
vi /etc/xl2tpd/xl2tpd.conf,改成下面这样,或复制进去就好了
[global]
ipsec saref = yes

[lns default]
ip range = 10.1.2.2-10.1.2.255
local ip = 10.1.2.1
;require chap = yes
refuse chap = yes
refuse pap = yes
require authentication = yes
ppp debug = yes
pppoptfile = /etc/ppp/options.xl2tpd
length bit = yes

这里要注意的是 ip range 一项里的 IP 地址不能和你正在用的 IP 地址重合,也不可与网络上的其他 IP 地址冲突。你照抄就不会错了。

安装 ppp。这是用来管理 VPN 用户的。
sudo aptitude install ppp
检查一下 /etc/ppp 目录里有没有 options.xl2tpd 这个文件,没有的话就建一个
vi /etc/ppp/options.xl2tpd
文件内容如下,把下面的内容复制进来 :
require-mschap-v2
ms-dns 208.67.222.222
ms-dns 208.67.220.220
asyncmap 0
auth
crtscts
lock
hide-password
modem
debug
name l2tpd
proxyarp
lcp-echo-interval 30
lcp-echo-failure 4

注意 ms-dns 两行我填的是 OpenDNS。如果你想用其他的 DNS 服务器(例如谷歌的公共 DNS 8.8.8.8 8.8.4.4 ),请自行更换。
现在可以添加一个 VPN 用户了。用文字编辑器打开chap-secrets 文件
vi /etc/ppp/chap-secrets
# user server password ip
test l2tpd testpassword *

如果你之前设置过 PPTP VPN,chap-secrets 文件里可能已经有了其他用户的列表,如上面那个密码为gfw的fuck用户,就既可登录PPTP VPN,也可以登录l2tp的VPN,因为他的server没有指定为l2tp,而是用星号代替了。你只要把 test l2tpd testpassword * 这样加到后面即可。记得要有空格。

重启 xl2tpd
sudo /etc/init.d/xl2tpd restart
设置 iptables 的数据包转发,下面是两行命令哦:
iptables --table nat --append POSTROUTING --jump MASQUERADE
echo 1 > /proc/sys/net/ipv4/ip_forward
因为某种原因,openswan 在服务器重启后无法正常自动,所以我们可以在 /etc/rc.local 文件里写入如下语句:
vi /etc/rc.local
iptables --table nat --append POSTROUTING --jump MASQUERADE
echo 1 > /proc/sys/net/ipv4/ip_forward
for each in /proc/sys/net/ipv4/conf/*
do
echo 0 > $each/accept_redirects
echo 0 > $each/send_redirects
done
/etc/init.d/ipsec restart

到这里,设置工作已经基本完成。你可以用 iPhone 或 iPad 试着连一下。记得在「Secret」中填入你在上述第三步里填的 zhimakaimen。

如果连接成功,上网也没问题的话,恭喜你,大功告成。我就是这么在linode的Ubuntu 10.04 LTS上搞定VPN的,我之前走了些弯路是因为openswan没安装到最新版,Apple4.us的文章提供的安装方法失败,还好有另一篇文章提供了安装openswan到最新版的方法。所以合并经验,让其他人少走弯路,可以节约学习的时间哦。

L2TP的VPN的使用方法:

  1. 苹果电脑上使用l2tp VPN http://support.apple.com/kb/HT1288?viewlocale=zh_CN

我参考了以下文献,综合了一下,写出以上修正版,由于 Apple4.us 保留一切权利,所以我等他们通知我删除这篇派生的文章吧,因为他们仍然保留让我派生的权利,也保留不让我基于他们的文章派生作品的权利。

  1. 在Linode VPS上安装pptp VPN
    http://blog.cuoluo.net/2009/12/install-pptp-vpn-in-linode-vps/
  2. 如何在 Debian / Ubuntu 服务器上架设 L2TP / IPSec VPN
    https://apple4.us/2010/05/setting-up-l2tp-vpn-on-debian-ubuntu.html
  3. L2TP Over IPSec On Ubuntu(Debian,CentOS) With OpenSwan
    http://ihipop.info/2010/12/1906.html

转:Emoji表情符号兼容方案

Emoji,原来的项目中没有遇到,因为从未想过别人会从网页里发送表情(表情 信息是从iphone手机上发出来的),查了一下资料,果然很多人遇到了这个问题。不过也幸好有了解决方案了。。。

Emoji表情符号兼容方案

一 什么是Emoji

emoji就是表情符号;词义来自日语(えもじ,e-moji,moji在日语中的含义是字符)
表情符号现已普遍应用于手机短信和网络聊天软件。
emoji表情符号,在外国的手机短信里面已经是很流行使用的一种表情。
手机上如何使用emoji:
1.iphone、ipad系统:安装emoji free,再设置-通用-键盘-国际键盘-添加新的键盘,然后把emoji添加在里面即可在发短信和一些输入文本的文本框中输入表情。
IOS 5用户可直接从通用中添加emoji 键盘,无需再安装emoji free
2.android系统:安装“GO输入法国际版”后,在输入法里面点选安装emoji插件可以使用。另外“百度输入法”也自带emoji表情
3.Windows Phone : 安装此 Emoji Keys,在其中输入之后复制粘贴到需要输入表情的地方即可

<此段摘自百度百科 http://baike.baidu.com/view/2631589.htm>

wps-office二次开发帮助文档.rar

二 Emoji表情符号问题
1 问题:
IOS版本之间发送的Emoji表情符号不兼容,只看到方块
不同IOS版本在数据库存数据时,有时会发生系统错误
2 现象:
IOS 4 输入Emoji表情符,在IOS5.01 显示正常,在IOS5.1中(大陆版)显现为方块, 但IOS5.01/5.1输入的表情符号,显示正 常
IOS5.01/5.1 输入表情符,在IOS5.01/5.1中显示正常,但在IOS4.X显示为方块
输入Emoji入帖子正文, 可正常存储。 但用户昵称在IOS4.X 输入Emoji,系统正常, 而IOS5.01/5.1则提示系统错误。
3 本质:
iOS 5 and OS X 10.7 (Lion) use the Unicode 6.0 standard ‘unified’ code points for emoji.
iOS 5 Emoji 采用Unicode 6 标准来统一code points

iOS 4 on SoftBank iPhones used a set of unofficial code points in the Unicode Private Use Area, and so aren't compatible with any other systems
iOS 4 采用SoftBank Unicode, 一种非官方的, 采用私有Unicode 区域。
4 举例:
one emoji symbol "tiger", it is "\U0001f42f" in iOS5, but "\ue050" in earlier iOS version
虎脸Emoji符号在iOS5 为Unicode:\U0001f42f;而在IOS4.x 为:\ue050 (SoftBank 编码)
另外: 按理讲, 从iOS5 应该兼容以前版本的emoji, 但现在出现5.01版本完美兼容(无论大陆版,美版,还是港版), 而5.1 大陆版出现了不兼容现象(腾讯微信也出现了同样的问题)。
三 问题分析
1 系统存储错误问题(如昵称,帖子内容)
原因:
由于IOS5.X 采用新的Unicode, 其UTF8 编码大多为4个字节, 而由于昵称/帖子内容column并没设成utf8mb4,因此存储会 发生错误。
解决方法:
将昵称/帖子内容设成utf8mb4
2 不同iOS 之间Emoji 不兼容的问题。
原因:
iOS 5 到4 不兼容的问题,很简单,unicode6 和softbank编码的不同
iOS 4 到 5,按理说应该兼容,也就是说,iOS应该自动判断如果是softbank编码,自动转成unicode6。但现在看来, iOS5.1(大陆版)好像只支持unicode6, 而不支持softbank.
解决方法:
客户端发送emoji-encoding: Softbank或unicode6, 由服务端分别给出相应的编码表。
四 解决方案
1 数据存储(MySQL varchar 数据类型对UTF8 支持问题)
MYSQL 5.5 之前, UTF8 编码只支持1-3个字节, 从MYSQL5.5开始,可支持4个字节UTF编码,但要特殊标记。例如我们的帖子内容项,我们加上了这个支持。服务端mysql统一存储为ios5.x也就是Unicode编码。
对应alter语句:

ALTER TABLE topic MODIFY COLUMN content varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '内容';

2 编码转换:
iphone手机方案
客户端输入内容时候,统一存储为unicode编码(这里需要从softbank编码转换为unicode编码)。客户端请求内容的时候,需要根据不同的客户端给出不同的编码,ios4采用softbank编码做替换,ios5采用unicode编码直接支持。
android或wp其他手机方案:
如果没有emoji表情库,将无法输入。针对输入问题,将统一采用unicode编码存储。客户端请求内容的时候,将统一用softbank编码,客户端需要把emoji表情符号内置到客户端,做对应的编码和img替换。
web解决方案:
参考android或wp其他手机方案
五 部分代码
1 sql代码

CREATE TABLE `ios_emoji` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增ID',
`unicode` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT 'Unicode编码',
`utf8` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT 'UTF8编码',
`utf16` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT 'UTF16编码',
`sbunicode` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT 'SBUnicode编码',
`filename` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '文件名',
`filebyte` longblob COMMENT '文件内容字节',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT COMMENT='ios表情编码表';

2 java代码

import java.io.UnsupportedEncodingException;
import org.apache.commons.lang.StringUtils;


public class IOSEmojiUtil {

public static String[] ios5emoji ;
public static String[] ios4emoji ;
public static String[] androidnullemoji ;
public static String[] adsbuniemoji;

public static void initios5emoji(String[] i5emj,String[] i4emj,String[] adnullemoji,String[] adsbemoji){
ios5emoji = i5emj;
ios4emoji = i4emj;
androidnullemoji = adnullemoji;
adsbuniemoji = adsbemoji;
}

//在ios上将ios5转换为ios4编码
public static String transToIOS4emoji(String src) {
return StringUtils.replaceEach(src, ios5emoji, ios4emoji);
}
//在ios上将ios4转换为ios5编码
public static String transToIOS5emoji(String src) {
return StringUtils.replaceEach(src, ios4emoji, ios5emoji);
}
//在android上将ios5的表情符替换为空
public static String transToAndroidemojiNull(String src) {
return StringUtils.replaceEach(src, ios5emoji, androidnullemoji);
}

//在android上将ios5的表情符替换为SBUNICODE
public static String transToAndroidemojiSB(String src) {
return StringUtils.replaceEach(src, ios5emoji, adsbuniemoji);
}

//在android上将SBUNICODE的表情符替换为ios5
public static String transSBToIOS5emoji(String src) {
return StringUtils.replaceEach(src, adsbuniemoji, ios5emoji);
}

//eg. param: 0xF0 0x9F 0x8F 0x80
public static String hexstr2String(String hexstr) throws UnsupportedEncodingException{
byte[] b = hexstr2bytes(hexstr);
return new String(b, "UTF-8");
}

//eg. param: E018
public static String sbunicode2utfString(String sbhexstr) throws UnsupportedEncodingException{
byte[] b = sbunicode2utfbytes(sbhexstr);
return new String(b, "UTF-8");
}

//eg. param: 0xF0 0x9F 0x8F 0x80
public static byte[] hexstr2bytes(String hexstr){
String[] hexstrs = hexstr.split(" ");
byte[] b = new byte[hexstrs.length];

for(int i=0;i<hexstrs.length;i++){
b[i] = hexStringToByte(hexstrs[i].substring(2))[0];
}
return b;
}

//eg. param: E018
public static byte[] sbunicode2utfbytes(String sbhexstr) throws UnsupportedEncodingException{
int inthex = Integer.parseInt(sbhexstr, 16);
char[] schar = {(char)inthex};
byte[] b = (new String(schar)).getBytes("UTF-8");
return b;
}

public static byte[] hexStringToByte(String hex) {
int len = (hex.length() / 2);
byte[] result = new byte[len];
char[] achar = hex.toCharArray();
for (int i = 0; i < len; i++) {
int pos = i * 2;
result[i] = (byte) (toByte(achar[pos]) << 4 | toByte(achar[pos + 1]));
}
return result;
}


private static byte toByte(char c) {
byte b = (byte) "0123456789ABCDEF".indexOf(c);
return b;
}

public static void main(String[] args) throws UnsupportedEncodingException {
// TODO Auto-generated method stub
byte[] b1 = {-30,-102,-67}; //ios5 //0xE2 0x9A 0xBD
byte[] b2 = {-18,-128,-104}; //ios4 //"E018"

//-------------------------------------

byte[] b3 = {-16,-97,-113,-128}; //0xF0 0x9F 0x8F 0x80
byte[] b4 = {-18,-112,-86}; //E42A


ios5emoji = new String[]{new String(b1,"utf-8"),new String(b3,"utf-8")};
ios4emoji = new String[]{new String(b2,"utf-8"),new String(b4,"utf-8")};


//测试字符串
byte[] testbytes = {105,111,115,-30,-102,-67,32,36,-18,-128,-104,32,36,-16,-97,-113,-128,32,36,-18,-112,-86};
String tmpstr = new String(testbytes,"utf-8");
System.out.println(tmpstr);


//转成ios4的表情
String ios4str = transToIOS5emoji(tmpstr);
byte[] tmp = ios4str.getBytes();
//System.out.print(new String(tmp,"utf-8"));
for(byte b:tmp){
System.out.print(b);
System.out.print(" ");
}
}

}

六 参考资料
1 Emoji 全编码表:(我参考的这个)
http://punchdrunker.github.com/iOSEmoji/table_html/flower.html
2 Emoji全编码表
http://code.iamcal.com/php/emoji/

3 iOS5/4 Emoji 兼容性:
http://stackoverflow.com/questions/7856775/how-to-convert-the-old-emoji-encoding-to-the-latest-encoding-in-ios5
4 MySQL emoji问题
http://dropblood.com/archives/ios-mysql-emoji
5 Emoji 中文对应表
http://www.iapps.im/wp-content/uploads/2012/02/emoji-pinyin.png?r=010

七 下载资源

emoji图片和编码表 http://download.csdn.net/detail/qdkfriend/4309051

包括emoji文件表,emoji数据编码表(Unicode编码,UTF8编码,UTF16编码,SBUnicode编码)

[转]公安部:明年起司机闯红灯一律扣6分

[转]公安部:明年起司机闯红灯一律扣6分

这个转一下做个记录。。

核心提示:10月8日,公安部发布新修订的《机动车驾驶证申领和使用规定》规定,2013年起司机闯红灯一律扣6分。醉驾大中型客货车将终身禁驾,对3年以下驾龄的驾驶人发生交通死亡事故的,倒查考试发证民警的责任。

严管大中型客货车司机,吸毒驾车“零容忍”,“新手”撞死人倒查考试发证民警的责任,不按规定避让校车记6分……昨天公安部修订并发布的《机动车驾 驶证申领和使用规定》(公安部令第123号,以下简称123号令)中,明显加强了对大中型客货车司机的管理,并提高了涉及校车等交通违法行为的处罚力度。

123号令中,关于校车驾驶人管理的内容自发布之日起施行。其他规定将于2013年1月1日起正式施行。

醉驾大中型客货车终身禁驾

近年来,大中型客货车驾驶人肇事率较高。据统计,2009年至2011年,每年一次死亡10人以上的重特大道路交通事故中,大中型客货车驾驶人肇事导致事故起数和死亡人数均占70%以上。

为 严格限制有严重危险驾驶行为的驾驶人申请大中型客货车驾驶证,123号令规定:造成死亡交通事故负同等以上责任、醉酒驾驶记录的终身不得申请;被处以吊销 或者撤销驾驶证记录的10年内不得申请;记满12分的5年内不得申请大型客车驾驶证、3年内不得申请牵引车、中型客车驾驶证。

此外,针对近 年来暴露出的吸毒后驾驶机动车问题,新令中对吸毒人员申请驾驶证或者驾驶机动车采取“零容忍”措施,规定:3年内有吸食、注射毒品行为或者解除强制隔离戒 毒措施未满3年的,不得申请驾驶证;驾驶人吸食、注射毒品后驾驶机动车或者正在执行社区戒毒、强制隔离戒毒、社区康复措施的,要注销驾驶证。

新手肇事倒查发证民警责任

123 号令中规定,将科目一理论考试拆分为两部分,第一部分主要考核道路交通安全法律法规、交通信号、通行规则等知识,仍作为科目一。第二部分作为安全文明驾驶 考试项目,在实际道路考试后进行,考核安全文明驾驶要求、复杂条件下的安全驾驶知识等,加深驾驶人对安全文明驾驶常识的理解记忆。

此外,对 申领大中型客货车驾驶证的,在科目二场地驾驶技能考试中,增加模拟高速公路、雨雾天、湿滑路、紧急情况处置等考试项目,提高了考试针对性和考试难度。调整 后的大中型客货车科目二考试由原来的“训练10项、考试6项”修改为“训练、考试均为16项”。同时在科目三的实际道路驾驶技能考试中,增加山区、隧道、 陡坡等复杂道路考试,并明确大中型客车考试里程不少于20公里、牵引车和大型货车不少于10公里。

为强调实用性,123号令取消了小型汽车桩考两个桩位之间的移库、通过连续障碍、单边桥等现实生活中应用性不强的考试项目。调整后,小型汽车场地考试项目由原来的“训练10项、考试4项”改为“训练和考试均为5项”,即倒车入库、坡道定点停车与起步、侧方停车、曲线行驶和直角转弯。此外,场地考试中用标线替换现有的标杆,更加贴近实际道路场景。

新规中同时还明确了发证民警的责任。建立了考试培训质量公告制度和违规考试发证责任追究制度,设置考试工作纪律“高压线”,明确民警违规考试发证的法律责任,并规定对3年以下驾龄的驾驶人发生交通死亡事故的,倒查考试发证民警的责任。

新手上高速必须由老手陪同

据统计,我国驾驶人以平均每年2000多万人的速度快速增长,1年以下驾龄的实习期驾驶人肇事比率较高,大中型客货车驾驶人交通违法较为突出。

针 对这一现象,123号令中规定,除第一次领取驾驶证的人以外,增驾新取得大型客车、中型客车、牵引车等驾驶证的驾驶人一并纳入实习期管理。特别是大中型客 货车驾驶人,实习期结束后要参加安全文明驾驶等知识考试,接受交通事故案例警示教育;在实习期内违法记6分以上的,实习期限延长一年,再次记6分以上的, 取消其实习车型的驾驶资格。同时,还规定实习期内有记满12分记录的,要予以注销实习车型的驾驶资格。考虑到高速公路道路情况的特殊性,实习期驾驶人驾车 上高速公路时,必须由持相应或者更高车型驾驶证3年以上的驾驶人陪同。

在驾驶证审验方面,规定大中型客货车驾驶人每年参加审验,但没有记分 的可以免于审验。同时,规定持有其他准驾车型驾驶证且发生交通死亡事故承担同等以上责任的,也要参加当年的审验。此外,加强了审验时的学习教育,规定除审 验交通违法、事故处理,违法记分和满分学习、申报身体条件情况以外,还要参加不少于3小时的法律法规、交通安全文明驾驶等知识学习,并接受交通事故案例警 示教育。

对发生死亡交通事故负同等以上责任、有记满12分记录或者连续3年不审验的,注销最高准驾车型驾驶资格,逐级降低其驾驶资格,最终只保留其小型汽车驾驶资格,加强对驾驶人的管理。

故意遮挡污损号牌记12分

123号令对校车、大中型客货车、危险品运输车等重点车型驾驶人的严重交通违法行为提高了记分分值,记分项由38项增加至52项。

其 中新增的内容有:使用伪造和变造校车标牌、校车超员20%以上记12分、不按规定避让校车记6分等14个涉及校车管理的记分项;中型以上客货车、危险品运 输车在高速公路、城市快速路行驶超速20%以上,或者在其他道路行驶超速50%以上,驾驶营运客车、校车超员20%以上、未取得校车驾驶资格驾驶校车的等 行为记12分,以及疲劳驾驶载客汽车、危险品运输车记12分等记分项。

提高处罚力度的有:将未悬挂或者不按规定安装号牌、故意遮挡污损号牌等违法行为记分由6分提高到12分,将违反道路交通信号灯通行等违法记分由3分提高到6分。

同时,考虑到《道路交通安全法》已规定醉酒驾驶机动车的、吊销机动车驾驶证且5年内不得重新取得驾驶证,取消了原醉酒驾驶机动车违法行为记分。晨报记者 何欣

交管部门新增六项便民服务措施

将驾驶证补换领、审验和小型汽车驾驶证考试等业务向县级车辆管理所下放,方便县乡、农村群众在家门口申领、换领汽车驾驶证,缩短群众办事距离,减少群众往返时间。

将核发和补换领驾驶证的时限由3日缩短为1日。群众在驾驶证遗失或损坏后,在申请办理补换证的当日即可领取新的驾驶证,方便群众驾车出行。同时,对于申领驾驶证的群众,在三个科目考试合格和宣誓仪式后,当日就可领取驾驶证。

将申领大型货车驾驶证的年龄条件由21岁放宽至20岁。

考虑到一些群众由于平时学习工作较忙,不能在2年内完成培训和考试,将驾驶准考证明有效期由2年延长至3年,方便群众通过法规知识考试后,有更充裕的时间参加驾驶技能培训学习,参加考试。

推行互联网、电话等远程自助预约驾驶人考试服务,公开考试预约计划、预约人数和考试人数,方便群众根据自己的学习、工作和生活需要,合理选择时间参加考试。

规定异地从事营运的驾驶人和货车,在备案登记一年后,可以直接在营运地参加驾驶证审验或车辆年检,避免群众多次往返办理业务。

相关新闻

校车驾驶人建立退出机制

记 者昨天从公安部获悉,为贯彻落实国务院《校车安全管理条例》,公安部发布了《关于修改〈机动车登记规定〉决定》(公安部令第124号,以下简称124号 令)和《机动车驾驶证申领和使用规定》(公安部令第123号,以下简称123号令),明确了公安机关交通管理部门参与校车许可条件审查,发放校车标牌和校 车驾驶人资格许可的业务程序和要求。124号令和123号令中关于校车驾驶人管理的内容自发布之日起施行。

规定明确了参与校车使用许可审查工作职责和事项,规范了校车标牌核发条件和程序。同时,严格校车登记检验和报废制度。规定校车在办理注 册登记前必须进行安全技术检验,并按照《校车安全管理条例》每半年参加一次安全技术检验,保证校车安全技术性能。校车标牌有效期与安全技术检验有效期一 致,均为半年。规定达到报废标准的校车必须在车辆管理所的监督下解体,杜绝报废校车流向社会、继续上路行驶。

加强校车使用的日常监管。规定公安交通管理部门要每月清理校车交通违法和事故情况,督促及时接受处理,同时要每月向本级政府、教育行政部门通报校车标牌发放情况和校车交通违法、事故等情况。

严格校车驾驶人资格许可和管理制度。明确了申请校车驾驶资格应具备的条件,以及办理许可的手续和程序,建立了校车驾驶人每年审验、联合监管以及退出机制。

又迁移了。。。

又迁移了。。。

博客又迁移了。。这回是在rockmyweb上面。
感觉好象还行,价格也还能接受。如果运行一阵良好的话,直接备份就Over了(再买一台双机互备),还能做负载均衡。

perl: warning: Setting locale failed.

perl: warning: Setting locale failed.

由于VPS的空间比较小,所以。。。偷懒装了一个debian,其实还有更小的,但我想debian相对会较小一点。。

在执行一些命令的时候会报这种错误 :

perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
LANGUAGE = (unset),
LC_ALL = (unset),
LANG = "zh_CN.UTF-8"
are supported and installed on your system.
perl: warning: Falling back to the standard locale ("C").

这个问题其实很简单,摆明了就是没设置本地环境变量嘛,不过,我也没有设置lang为zh_CN呀。这年头,还是en_US比较安全吧。
在ubuntu下面,可以通过:apt-get install language-pack-en-base 来解决,但debian下没有这个命令,所以只能:

export LANGUAGE=en_US.UTF-8
export LANG=en_US.UTF-8
export LC_ALL=en_US.UTF-8
locale-gen en_US.UTF-8
dpkg-reconfigure locales

然后会出来一个界面,你在里面选择en_US.UTF-8,然后一切就都解决了。很方便