迁移到阿里云一些笔记

  现在看到的博客已经跑在阿里云上了,随之迁移的还有找歌词后台和花图相册(链接就在屏幕左侧)。由于之前用的linkcloud云主机业务与阿里云合并,商务那边通知到期后只能迁移到阿里云上,正好他们家的内核版本过低,无法满足docker需要,于是尽早开始了迁移计划。

  首先是转移备案,阿里的备案系统还是蛮方便的,后台填完资料,寄送幕布,都很快,最后审核了一周多点也就过了。收到邮件后立刻新开了主机,配置环境。这里还有个小插曲,备案前其实就买了一个,后来觉得配置太高了,于是又退了。事实证明,阿里的单核顶linkcloud双核。

  迁移并不复杂,无非是安装新环境,打包,传输,解压,运行,验证。这里简单做下笔记,以备不时之需。

1. 磁盘挂载
  买了新主机,自然是先挂载好数据盘,阿里的帮助中心已经写的很清楚了。我选配了100g的普通云盘,挂在点位于/dev/xvdb,将用ext4格式化。fdisk -l可以看到一个xvdb磁盘未包含任何分区信息,用fdisk /dev/xvdb对磁盘进行分区,再次使用fdisk -l可以看到/dev/xvdb1出现,用mkfs.ext4 /dev/xvdb1进行格式化。

配置到fstab以便开机自动挂载

echo '/dev/xvdb1 /mnt/vdb1 ext4 defaults 0 0' >> /etc/fstab

此时可以重启下验证是否成功df -h

/dev/xvdb1       99G   60M   94G   1% /mnt

2. nginx
  使用apt-get安装,同步旧服务器的conf.d/*配置文件,Jenkins密码文件,SSL证书。删除默认站点sites-available和sites-enabled目录下的default。nginx推荐做法是将站点配置(Virtual Host)文件放在sites-available下,在sites-enabled下建立到available的连接,可以方便的启用和禁用。我这里简单处理全放在了conf.d下。

关闭nginx版本显示和post大小限制:

vim /etc/nginx/nginx.conf
server_tokens off;
client_max_body_size 20M;

配置完重启nginx进程,检测是否有误

3. mysql
  使用apt-get安装,同步旧服务器conf,授权远程登录,修改root密码:

GRANT ALL PRIVILEGES ON *.* TO root@"%" IDENTIFIED BY "newpassword";
GRANT ALL PRIVILEGES ON *.* TO root@“127.0.0.1" IDENTIFIED BY "newpassword";
GRANT ALL PRIVILEGES ON *.* TO root@"localhost" IDENTIFIED BY "newpassword";
flush privileges;

导出旧服务器上的db,p参数表示待输入密码

mysqldump -p db_name > db_name.sql

复制到新机器上登录mysql后用以下命令导入

source /root/db_name.sql;

若数据量不大,可以用GUI工具转移,例如Navicat的数据传输功能

4. redis
  下载源代码&编译安装

wget http://download.redis.io/releases/redis-3.0.6.tar.gz
tar xf redis-3.0.6.tar.gz
cd redis-3.0.6/
make
make install

安装为服务,自启动

cd utils
./install_server.sh

为了安全起见,redis仅监听来自本机的请求,设置bind 127.0.0.1,并设置密码requirepass。再修改启动脚本,增加密码(若设置了密码,必须要如下操作,否则无法正常重启redis)

vim /etc/init.d/redis_6379
定义变量:
PASS="pass"
在stop方法中增加-a参数
$CLIEXEC -p $REDISPORT -a $PASS shutdown

迁移redis数据,在旧机器上登录redis-cli,使用save指令将内存数据保存到/var/lib/redis/dump.rdb中,再scp到新机器对应的目录上,重启即可。

5. java,maven,jenkins,tomcat
  官方JDK最新已经是8u65了,直接用最新的,不得不说Oracle也是个坑货,下载个jdk还要验证一下,导致直接wget链接会失败的。这里加一个cookie就好了:

wget --no-cookies --header "Cookie: oraclelicense=accept-securebackup-cookie;" http://download.oracle.com/otn-pub/java/jdk/8u66-b17/jdk-8u66-linux-x64.tar.gz

下载放在/usr/java 目录中
tar xf 解压到/usr/java/jdk1.8.0_66

设置环境变量:

# set maven home
export MAVEN_HOME=/usr/local/apache-maven-3.3.3
export PATH=$MAVEN_HOME/bin:$PATH

# set java home
export JAVA_HOME=/usr/java/jdk1.8.0_66
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar:$CLASSPATH

# set jenkins home
export JENKINS_HOME=/mnt/vdb1/.jenkins

将旧机器的相关目录打包scp过来即可

6. fastdfs
  Fastdfs安装可以参考我之前的文章,这里简单带过。先安装libfastcommon和做好链接,同步旧服务器配置文件和照片数据目录,设置为服务自动启动:

update-rc.d fdfs_trackerd defaults 90
update-rc.d fdfs_storaged defaults 95

7. php和wordpress
  apt-get安装php5-fpm和php5-mysql,复制wordpress目录。新版本的fpm默认没有监听9000端口,而是采用unix sock来连接,因此nginx站点配置中修改下

fastcgi_pass unix:/var/run/php5-fpm.sock;

  最后再检查各个项目是否正常,接口是否能调用成功,再到dnspod中将各域名A纪录指向阿里云的新IP,保证平滑迁移,至此就算完成了。

灯光博物馆

  得知海山世界近期弄了个国际灯光节,也给本来就很赞的夜景更添几许华丽。作为光影爱好者,自然不能错过,吃过晚餐,带上EOS M3便去瞧了下,顺便叫上朋友叙叙旧。不过户外的展出是在少的可怜,不细看都没发现新设的灯光摆放在那。

  当然既然是用上了“国际”两个字的主题,怎能少的了从国外重金搬过来的展品,这不都圈起来放在了海上世界B区桥下的展厅,没错就是要收费,祭出了即将到期的深大学生证半价进去看了一圈。挺好使的,考虑还是别申请毕业了,再多玩玩~~

  接下来就是剧透了,里面一共就7幅作品,说实话第一眼却是觉得无聊,弄几个霓虹灯,几何图形就来糊弄人。后来多次观察与解说的攀谈中才知会,原来重点是在这些作品的表现形式,均带有起源性和里程碑意义,不然怎么叫灯光博物馆呢。

  James Turrell的三幅全息作品,最为印象深刻,大概是科因为幻情节吧,一听到全息这两个词就已经激动不已了。不同观察角度有不同的效果,仿佛是在一个有限的平面上孕育着无限的信息。比如蓝色的这幅,正面看是蓝色的一条斜线,在向右移动时候,线段会逐渐拉伸成为一个面,这幅作品仅在自然光下便可观测到。
IMG_3671
  中间黄色这幅起初并没有发现任何内容,原来是要低角度才能看得到,里面是一个金黄色的直角三角体,左右移动均能明显看到三角体的左右两侧,随着视野而变化。上下角度的改变也会出现以绿色为主渐变效果,当然我更愿意相信是光源在介质中折射时碰到临界值处失真的表现。
IMG_3665
  第三幅是镇馆之宝了,造价也是不菲。两个三角形呈一定角度,再用一个三角形从中间插入,最重要的是这些都是立体的,向外凸出,仿佛就在眼前,裸眼3D来着。在头顶的一个渐变光照射下格外清晰,立体感非常强烈,可惜照片没办法捕捉。
IMG_3664
  目前看到的全息作品都是一些简单的几何图形,要是有更为复杂的自然场景那会是如何?或者将摄影照片全息化又会是如何?不可思议,妙不可言,期待。剩下几个作品就不做介绍了,叙述的故事大过于表现形势,一言难尽。

一些扩展连接:
http://www.seaworldchina.com/news.aspx?id=10000611&page=7
http://jamesturrell.com/work/type/holograms/
https://zh.wikipedia.org/wiki/%E5%85%A8%E6%81%AF%E6%91%84%E5%BD%B1

Sony Xperia™ Z5 Premium 扶不起的安卓

  有点标题党了,之所以想到“扶不起”大概是看到了太多老人假摔讹钱的新闻。确实安卓这个生态也是在野蛮生长,本以为旗舰机会好一点,却也是无用。

  就在几个月前的手机掉水之后,一直在寻找一款主力机,首选当然是Apple新机6s系列,但实在不喜欢凸出的摄像头,于是不再作为首选考虑。期间了解到 Sony Xperia™ Z5 Premium Dual 国行会在10月底预售开启,素有机皇之称。了解了硬件后都还比较满意,尤其防水功能更是实用,于是第一时间订购。

  满怀期待的等到了11月10号统一发货,第二天下午便收到了,简单说下优缺点:说实话4K屏却没那么的吸引人,大部分时候是渲染在1080p分辨率被拉升到4K,整个就一个朦胧美,一点都不精致。目前仅打开相册和视频会切换成4K,确实细节多了不少,非常惊艳,忍不住凑近仔细看。接下来是2300w像素的摄像头,或许也是期待过于高了点,官方宣传夜景效果好,正好当天晚上在欢乐海岸和努比亚团队在拍摄光绘,着重试了下拍夜景的效果,依旧很失望。自带的相机下始终没能达到ISO 12800,人像黑乎乎的,平均ISO仅1000左右,或许是为了减少噪点吧。实体的拍摄键还是很好用的,可以一只手端着横排。商场内暖光场合依旧有白平衡不稳,画面时冷时热。自带的相机默认并没有选择最大像素,开始不知为何,后来才知道,4K屏下渲染一张全尺寸的照片竟然要两次才能完成,而且是纵向间隔,不仔细看看不出,就当是卡个一秒样子。

  以上还不是最糟糕的,糟糕的还是在安卓系统上,众所周知的原因,国行系统是没有谷歌服务框架 Google Services Framework 的,这意味着没有一个可靠的App下载超市,仅有一个“索尼精选”的超市,内容少不说,大部分内容还是百度提供的,搞不好给你来个百度全家桶也不是不可能。所以以前下载App的习惯是去官网下载,现在很多都不提供apk下载,仅留一个Google Play的链接。由于国内第三方超市极其强势,几乎都是定制版,比如下载新浪微博,官网的下载链接就是360的服务器,而且启动界面也打上了360 Logo,一些常用App权限项也是多的惊人,虽然国行系统带了一个应用权限管理,但似乎无效,比如关闭了支付宝的地理位置访问,会导致无法启动,而关闭联系人却依然能取到。更有甚者如大众点评在安装后,应用权限管理都崩溃了,更别说拦截。实在是难以理解。而我在iPhone玩的部落战争也由于没有GSF,无法转移到这台手机上来。

  这个手机充电也是个大麻烦,公司台式机和Macbook的USB 3.0都无法满足充电需求,只能用自带的充电头冲,这个充电头仅仅输出1.5A,边冲边玩也是不行的,几次看到充满还需要1天之久的提示,也是醉了。官方送的抗蓝光贴膜和蓝牙运动耳机以及有线耳机就不吐槽了,简直就想直接丢掉。

  这还没结束,我手头这台手机居然还掉信号,自从收到手机打的三个超过5分钟的都断掉过,或者是卡上几秒没有声音。之前有朋友提醒过Sony手机向来信号不好,尤其是水货。看来国行也不过如此,但希望这只是个例。

  说完了缺点也说下优点:1. 侧面的指纹识别还是很好用的,比较顺手,口袋里拿出来握姿就能解锁,识别速度和准确度都还不错。2. 双击屏幕点亮也是很不错的设计,方面在上班时候放在桌子上,看消息,免去了拿起手机按解锁键。3. 背面的镜面设计也很好看,我选的是黑色版,整个后背给人感觉特别正式,气派,市面上也很少有雷同设计。4. 立体声外放绝对好评,横过来听歌,看视频超级享受。5. 独立快门按钮,对焦快,白天拍摄画质不错。

  总之,依然是缺点多余优点的一款产品,仅仅在我手上用了一天,现在已经联系售后在走退货流程了,实在没有想到安卓阵营发展到5.1了居然还是这个样子。大法的黑科技如何牛叉,硬件工艺如何先进,却栽倒在安卓这个烂系统上。

iPhone 5 进水换电池纪录

  国庆期间很不幸的把手机掉水盆里了,完完整整的泡了几秒钟。赶紧关机后置于米袋中大半天后,发现屏幕里面还是有水迹,随后拿到就近的手机维修店开机烘烤了个把小时,总算把水迹弄干了,没过多检查就先拿回家了。

  用了一段时间后发现电池出现了异常,电量指示的百分比在开机后就不会再变了,每次都是开机时的电量,且在电量低于40%左右,会频繁的重启,几乎无法使用。于是想到用iTools的“电池专家”来看看有无头绪,果然已经检测不到电池容量了,电压,温度,充放电循环次数都无法显示,仅剩一个序列号。出于职业习惯,打开了系统实时日志,发现大量的Error是在获取电池信息,具体为:

CLTM[23] <Error>: CLTM: Could not get event from service (gas gauge battery)
CLTM[23] <Error>: CLTM: Could net get value for gas gauge battery
...

  至此有七成把握是电池上的芯片出问题了(这块的电路无法完全断电),当然也有可能是主板的电源接口附近的某个部件短路而损坏,但几率小得多。这也是为什么一定要尽快关机的原因,如果能直接扣电池则最好。更具体来讲可以参考这篇博客,详细解释了iPhone电池的四个连接点用途。可见正是因为第三根SWI信号线失去了作用,导致的报错。

  后来在万能的淘宝上购买了一块副产电池,抱着试一试的心态,发现果然正常了,看来这台iPhone 5还能多用一段时间。之所以没有选择原厂Sony电池是因为毕竟机器已经停产很久了,即便有也是放置了很久的,还不如副产出产较新的好点。换电池过程比较简单,卸下底部的两个螺丝,用吸盘吸住底部屏幕,用点力气就可以将屏幕抠出来。这里要注意顶部的排线,屏幕抬起角度不要超过90度。实际上iPhone 6以后都采取了防水设计,可以有效的阻止水侵入内部。

轻量级ORM框架DbUtils和OrmLite

  最近在树莓派上部署了一套数据抓取工具,需要将抓取的数据录入到MySQL,特意找了下一些轻量级的ORM框架,这里简单介绍下DbUtils和OrmLite的配置和使用。

1. DbUtils

  Apache旗下的,速度与稳定性不言而喻,但其配置还是有点啰嗦,依赖dbcp连接池。

  地址:http://commons.apache.org/proper/commons-dbutils/

添加pom依赖:

<dependency>
	<groupId>commons-dbutils</groupId>
	<artifactId>commons-dbutils</artifactId>
	<version>1.6</version>
</dependency>
<dependency>
	<groupId>commons-dbcp</groupId>
	<artifactId>commons-dbcp</artifactId>
	<version>1.4</version>
</dependency>

添加dbcp.properties配置文件,放在classpath中:

driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://192.168.91.128:3306/db
username=steven
password=steven
initialSize=10
maxActive=50
maxIdle=20
minIdle=5
maxWait=60000
#附带连接属性
connectionProperties=useUnicode=true;characterEncoding=utf8
#自动提交(auto-commit)
defaultAutoCommit=true
#只读(read-only)
defaultReadOnly=
#事务级别(TransactionIsolation)
defaultTransactionIsolation=READ_COMMITTED

新增JdbcUtil.java来加载属性文件

package com.dorole.utils;

import java.io.InputStream;
import java.sql.SQLException;
import java.util.Properties;

import javax.sql.DataSource;

import org.apache.commons.dbcp.BasicDataSourceFactory;

import com.mysql.jdbc.Connection;

public class JdbcUtil {
	private static DataSource ds;
	private static ThreadLocal<Connection> tl = new ThreadLocal<Connection>();

	static {
		try {
			Properties prop = new Properties();
			InputStream in = JdbcUtil.class.getClassLoader()
					.getResourceAsStream("dbcp.properties");
			prop.load(in);
			ds = BasicDataSourceFactory.createDataSource(prop);
		} catch (Exception e) {
			throw new ExceptionInInitializerError(e);
		}
	}

	public static DataSource getDataSource() {
		return ds;
	}

	public static Connection getConnection() throws SQLException {
		try {
			Connection conn = tl.get();
			if (conn == null) {
				conn = (Connection) ds.getConnection();
				tl.set(conn);
			}
			return conn;
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	}
}

插入数据:

QueryRunner runner = new QueryRunner(JdbcUtil.getDataSource());
String sql = "INSERT INTO `orders` (`storeName`, `telecomNumber`) VALUES (?, ?)";
Object params[] = { order.getStoreName(), order.getTelecomNumber(), };
try {
	runner.update(sql, params);
} catch (SQLException e) {
	e.printStackTrace();
}

2. OrmLite

  这个在Android上用的比较多,结合轻量级的数据库HSQLDB,非常适合嵌入式设备,但这里我们使用MySQL做演示,有意思的是连BaseDao都给封装好了,配置简单,易于使用。

  地址:http://ormlite.com/

添加pom依赖:

<dependency>
	<groupId>com.j256.ormlite</groupId>
	<artifactId>ormlite-jdbc</artifactId>
	<version>4.9</version>
</dependency>

新增OrderDao接口,默认的增删改查已经有了,故可以留空:

package com.dorole.dao;

import com.dorole.model.Order;
import com.j256.ormlite.dao.Dao;

public interface OrderDao extends Dao<Order, Integer> {

}

新增OrderDaoImpl实现类

package com.dorole.dao.impl;

import java.sql.SQLException;

import com.dorole.dao.OrderDao;
import com.dorole.model.Order;
import com.j256.ormlite.dao.BaseDaoImpl;
import com.j256.ormlite.support.ConnectionSource;

public class OrderDaoImpl extends BaseDaoImpl<Order, Integer> implements
		OrderDao {
	public OrderDaoImpl(ConnectionSource connectionSource,
			Class<Order> dataClass) throws SQLException {
		super(connectionSource, dataClass);
	}
}

初始化:

OrderDao orderDao = null;
ConnectionSource connectionSource;
try {
	connectionSource = new JdbcConnectionSource(
			"jdbc:mysql://192.168.91.128:3306/db");
	((JdbcConnectionSource) connectionSource).setUsername("steven");
	((JdbcConnectionSource) connectionSource).setPassword("steven");
	orderDao = new OrderDaoImpl(connectionSource, Order.class);
} catch (SQLException e) {
	e.printStackTrace();
}

插入数据:

try {
	Order order = new Order();
	orderDao.create(order);
} catch (SQLException e) {
	e.printStackTrace();
}