2014年12月

用Base64编码UTF-8字符串(C语言)

//将ansi字符串转为UTF-8之后转为Base64编码供邮件使用
#include <stdio.h>
#include <windows.h>
#include <string>
#include "base64.h"
using namespace std;

int main()
{
string test1="輸入模式";
WCHAR test1_w[255]={0};
char test1_u8[255]={0};
//mb->wc
int len=MultiByteToWideChar(CP_ACP,0,test1.c_str(),-1,NULL,0);
MultiByteToWideChar(CP_ACP,0,test1.c_str(),-1,test1_w,len);
//wc->utf8
DWORD dwNum = WideCharToMultiByte(CP_UTF8,NULL,test1_w,-1,NULL,0,NULL,FALSE);
WideCharToMultiByte (CP_UTF8,NULL,test1_w, -1, test1_u8, dwNum,NULL,FALSE);
//encode
string test2 = base64_encode((const unsigned char *)test1_u8, strlen(test1_u8)+1);
}

有一个字符串需要以UTF-8字符集编码转换为Base64编码。解释一下以上代码。 test1是一个ansi字符串,通过 MultiByteToWideChar 函数将 test1 ansi字符串转换为 test1_w UTF-16 LE宽字符。然后又通过WideCharToMultiByte 将宽字符串转为UTF-8字符串 test1_u8。 然后通过base64_encode函数转为Base64编码。base64_encode函数来自 René Nyffeneggerhttp://www.adp-gmbh.ch/cpp/common/base64.html

"輸入模式"这四个繁体字的ANSI 16进制编码(中文系统也就是GBK编码)是

DD94 C8EB C4A3 CABD

转换成UTF-8的16进制编码是:

E8BCB8 E585A5 E6A8A1 E5BC8F

上文函数两次调用WideCharToMultiByte和两次调用MultiByteToWideChar 的第一次调用返回值是获取转换后编码buffer的字节数。len等于5,需要4个WCHAR+1个'\0'。 dwNum等于13,需要12 Bytes+1个'\0'。

DigitalOcean 512MB小内存主机MySQL服务经常崩溃的原因

这段时间在DigitalOcean上面的Web服务器架设好了。但是过几天发现网站频繁的出现WordPress报错:“数据库连接失败”。SSH登录上服务器发现MySQL服务已经停了。重启MySQL service mysql restart 之后过几天又出现了同样的问题,网站服务访问,显示“数据库连接失败”。看来每次手动重启MySQL不是个办法,必须找到出错的原因。

首先考虑既然是MySQL出的问题,我就修改配置文件,把MySQL错误日志打开,一般出错,日志里面应该有我需要的报错详细信息。修改 /etc/mysql/my.cnf

[mysqld_safe]
log-error=/var/log/mysql/tunps.com.err
[mysqld]
log-error=/var/log/mysql/tunps.com.err

加入log-error指定错误日志文件路径。过了几天网站又打不开了,赶紧的查看 /var/log/mysql/tunps.com.err 文件

141222 20:08:50 [Note] Plugin 'FEDERATED' is disabled.
141222 20:08:50 InnoDB: The InnoDB memory heap is disabled
141222 20:08:50 InnoDB: Mutexes and rw_locks use GCC atomic builtins
141222 20:08:50 InnoDB: Compressed tables use zlib 1.2.7
141222 20:08:50 InnoDB: Using Linux native AIO
141222 20:08:50 InnoDB: Initializing buffer pool, size = 128.0M
InnoDB: mmap(137363456 bytes) failed; errno 12
141222 20:08:50 InnoDB: Completed initialization of buffer pool
141222 20:08:50 InnoDB: Fatal error: cannot allocate memory for the buffer pool
141222 20:08:50 [ERROR] Plugin 'InnoDB' init function returned error.
141222 20:08:50 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.
141222 20:08:50 [ERROR] Unknown/unsupported storage engine: InnoDB
141222 20:08:50 [ERROR] Aborting

发现如上内容。Fatal error: cannot allocate memory for the buffer pool。看来是申请内存失败。网上搜索发现很多人都出现过这个问题。一般会出现在内存较小的VPS主机上。比如我这台主机只有512MB的内存。解决方法是利用Linux的swap交换分区虚拟部分硬盘当内存来使用。具体操作步骤如下

  1. dd if=/dev/zero of=/swapfile bs=1M count=1024

  2. mkswap /swapfile

  3. swapon /swapfile

  4. /etc/fstab 文件新建一行写入 /swapfile swap swap defaults 0 0

这样一个1GB的swap分区就建立成功了,重启MySQL,以后MySQL服务运行得很稳定,再也没有无故停止过。

F3右转弯灯失灵 更换转向继电器

116700KM

上次F3和大货车严重擦挂在驿川补漆,更换了左外后视镜。结果左外后视镜没修好造成短路,每次调节外后视镜的时候直接短路烧保险丝。然后又从新开车过去修理。

高高兴兴下班,路上发现右转弯灯失灵,自己淘宝购买flasher转弯灯继电器换上后搞定。

这段时间上下班都是巴到右边道走~因为右转弯灯拨动后闪烁一下就灭了~可以确定前中后三个转向灯没有问题~google后90%确认是继电器flasher出了问题~估计是金属片接触不良~为保万无一失~x宝25元购得副厂flasher换上后左右转向灯才一切正常~

F3右转弯灯失灵1.jpg

F3右转弯灯失灵2.jpg

F3右转弯灯失灵3.jpg

DigitalOcean的Debian主机手动安装配置LAMP

最近觉得虚拟主机有诸多不方便的地方,将主机转到了比较便宜的VPS主机供应商DigitalOcean那儿。用的是最便宜的512MB内存、20GB硬盘的套餐。价格是$5/mo。一年算下来是以前虚拟主机价格的一倍。虽然贵了,但是享受的服务肯定要好很多。而且VPS比虚拟主机限制更少,有更多的发挥空间。

DigitalOcean把VPS机器叫做Droplet。我建立了一个Debian 7.0 x64 Linux系统的Droplet。应用程序里面没有选择LAMP,造成Droplet就是一个空白的机器,什么都需要自己手动安装配置好。就当是练手吧。

Debian系统采用apt包管理器。首先更新一下系统包:

apt-get update
apt-get upgrade --show-upgraded

安装Apache

apt-get install apache2

开启伪静态(如果网站需要)

a2enmod rewrite

/etc/apache2/sites-available/下目录下建立虚拟主机配置文件,命名为 tunps.com

vi /etc/apache2/sites-available/tunps.com

tunps.com 文件内容如下:

<VirtualHost *:80>
ServerAdmin me@tunps.com
ServerName tunps.com
ServerAlias www.tunps.com
DocumentRoot /srv/www/tunps.com/web/
ErrorLog /srv/www/tunps.com/log/error.log
CustomLog /srv/www/tunps.com/log/access.log combined
</VirtualHost>

建立网站目录

mkdir -p /srv/www/tunps.com/web
mkdir -p /srv/www/tunps.com/log

让tunps.com站点生效,内部原理就是在 /etc/apache2/sites-enabled/ 下建立 tunps.com 配置文件的软链接。

a2ensite tunps.com
service apache restart

如果要停用网站:

a2dissite tunps.com
service apache restart

安装MySQL

apt-get install mysql-server

安装过程中会叫你设置MySQL数据库root密码,请牢记。具体的参数配置修改在 /etc/mysql/my.cnf 文件中。

如果MySQL用于生产环境,需要运行一下脚本来加强MySQL安全

mysql_secure_installation

然后创建数据库tunpscom,并授权给tunpscom_test这个用户

create database tunpscom;
grant all on tunpscom.* to 'tunpscom_test' identified by 'password'

安装PHP

apt-get install php5 php5-mysql phpmyadmin

然后重启Apache2

service apache restart

至此整个配置LAMP的过程结束。