Category Archives: Computer Engineering

WordPress迁移笔记

最开始的时候,我的这个网站是建在实验室的Amazon EC2上面的。

后来因为临近毕业,不再用实验室租的服务器了,就在RamNode上面重新部署了一遍Wordpress,同时架了一个shadowsocks在上面。

但是ss用的人好多,不知道为什么突然有一天就被封掉了,3.6刀一个月的稳定VPS就这么没了。

最近找到一个叫做VirMach的VPS在打折,算上打折码35刀一年,试用了一下还比较稳定。于是又要把Wordpress搬到这个网站上面来。搬来搬去挺麻烦的,网上的教程不是很具体,或者因为一些版本的原因不是非常贴合。摸索了一会终于解决了这些问题,现在记录一下运行的步骤,万一以后又要转移的时候可以拿出来看看。

总体上来说,包括三个步骤:
Part I:  迁移数据库
参考链接:
RamNode上面登录mysql:
root@www:/usr/local/bin# mysql -uroot -ptsinghua
然后检查有多少个数据库:
mysql> show databases;
好多啊
| Database           |
+——————–+
| information_schema |
| lzq_wordpress      |
| mysql              |
| performance_schema |
| sys                |
| wordpress_db
这里看了一下wp-config.php文件,貌似用到的其实也就只有wordpress_db这个数据库
所以只dump出这个数据库
root@www:/home/lzq/wordpress# mysqldump -uroot -pwordpress_db > wordpress_db.sql
密码好像是tsinghua
另外可以通过wget传输放在共享目录里面的数据,这样会更快一点
root@shaojuanzi:/home# wget www.lzq8272587.cn/photo/wordpress_db.sql
在另一个主机上面再导入数据库
创建一个相同名字的数据库
mysql> create database wordpress_db;
然后再插入数据
root@shaojuanzi:/home/lzq# mysql -uroot -p wordpress_db < ../wordpress_db.sql
记得在配置文件里面修改密码
root@shaojuanzi:/home/lzq/wordpress# vim wp-config.php
Part II: 迁移网站
把之前的整个网站打包
root@shaojuanzi:/home/lzq/wordpress# vim wp-config.php
放到web文件夹里面去,然后用wget下载
在/etc/apache2/apache2.conf这个文件里面加入下面的内容,设置网站的默认主页为我们自己的
<Directory /home/lzq/wordpress/photo>
        Options Indexes FollowSymLinks
        AllowOverride All
        Require all granted
</Directory>
<Directory /home/lzq/wordpress>
        Options Indexes FollowSymLinks
        AllowOverride All
        Require all granted
</Directory>
然后注意到,现在这个conf文件只是include了另一个配置文件,所以要找到
site-available/000-default文件
修改成以下的内容
root@www:/home/lzq/wordpress/photo# cat /etc/apache2/sites-available/000-default.conf
<VirtualHost *:80>
        # The ServerName directive sets the request scheme, hostname and port that
        # the server uses to identify itself. This is used when creating
        # redirection URLs. In the context of virtual hosts, the ServerName
        # specifies what hostname must appear in the request’s Host: header to
        # match this virtual host. For the default virtual host (this file) this
        # value is not decisive as it is used as a last resort host regardless.
        # However, you must set it for any further virtual host explicitly.
        #ServerName www.example.com
        ServerAdmin webmaster@localhost
        DocumentRoot /home/lzq/wordpress
<Directory /home/lzq/wordpress/photo>
        Options Indexes FollowSymLinks
        AllowOverride All
        Require all granted
</Directory>
<Directory /home/lzq/wordpress>
        Options Indexes FollowSymLinks
        AllowOverride All
        Require all granted
</Directory>
        # Available loglevels: trace8, …, trace1, debug, info, notice, warn,
        # error, crit, alert, emerg.
        # It is also possible to configure the loglevel for particular
        # modules, e.g.
        #LogLevel info ssl:warn
        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined
        # For most configuration files from conf-available/, which are
        # enabled or disabled at a global level, it is possible to
        # include a line for only one particular virtual host. For example the
        # following line enables the CGI configuration for this host only
        # after it has been globally disabled with “a2disconf”.
        #Include conf-available/serve-cgi-bin.conf
</VirtualHost>
# vim: syntax=apache ts=4 sw=4 sts=4 sr noet
这样就可以了!!
Part III:重启
root@shaojuanzi:/etc/apache2/sites-available# /etc/init.d/mysql start
root@shaojuanzi:/etc/apache2# /etc/init.d/apache2 restart
[ ok ] Restarting apache2 (via systemctl): apache2.service.
哎呀妈呀终于算是成功的把网站迁移过去了。
千万千万不要再被封掉了!

 

VSCO滤镜分享

手机上现在修图的软件很多,其中滤镜这方面做得最好的,VSCO算一个。现在最新版本的VSCO集成了很多很好的滤镜。效果大概是这样的:

 

但是正版的VSCO购买这些滤镜的话很贵。(不过淘宝要便宜很多。)

下面分享一个免费使用滤镜的方法。

 

###############

2016-05-28最新更新:之前写的原有方法已经失效,现在提供最新的Android版本的更新方法

Step1: 下载TiBackup并且安装,7.3版本的钛备份:http://pan.baidu.com/s/1eS6WgWa

Step2: 下载包括了所有VSCO滤镜的备份文件,传送门:http://pan.baidu.com/s/1c1AhLSk

注意,这个里面有个Backup文件夹,里面有3个文件。

Step3: 将Backup文件夹放到手机的sdcard目录下

Step4:启动TiBackup,注意这里需要root权限。将备份目录设置为sdcard下的这个Backup文件夹。

Step5:重启钛备份,在备份,恢复一栏就可以看到备份文件了。点击,恢复即可。

记住恢复的时候,选择恢复App+Data。

Step6,:这时候你会发现VSCO已经安装进去了。选择照片,这个时候所有的滤镜就应该已经可以用了。

OK!

###############

 

#下面为2016-05-28之前的方法,现在已经失效#

Step 1:

让你的手机能够穿墙。Android可以使用SS,具体参考:

http://www.lzq8272587.cn/2016/05/27/ss%E4%BD%BF%E7%94%A8%E6%96%B9%E6%B3%95/

ios需要自己找VPN或者找个能穿的AP,现在ios9.0以上好像不支持SS。

Step 2:

登陆VSCO。

 

 

这里使用的账号密码: VSCO账号   PPFFFJ@SINA.COM   密码   12345678

 

科科!

 

 

 

 

SS使用方法

Shadowsocks使用说明(2016-05-27更新)

直接到这个地址下载你的平台(Windows,Android,Mac)所需要的版本:http://pan.baidu.com/s/1o8b7GOM

安装shadowsocks(Windows下直接点开就行,其它平台类似。这里以Windows举例),并运行。

 

在小图标处找到shadowsocks,打开服务器设定,如上图所示,选择Servers->Edit

Servers。

 

 

如上图所示设置,密码为tsinghua。

 

2016-5-27更新:这里52的IP地址暂时不开放使用了,请使用107.161.26.199这个IP。同理,下面出现的52开头的IP地址全部换成107开头的这个地址。

 

确定以后,选择服务器为52开头的服务器,并且启动代理,Enable System Proxy如下图所示。

 

代理模式的话,两种都可以。简单解释一下,这里PAC大概就是国内网站不走代理,其它流量走代理;Global模式就是所有流量都走代理。

 

此时可测试,IE之类的打开浏览器可以正常使用。

 

如果是Chrome,可以安装一个插件,然后启动shadowsocks之后选择“系统代理”

 

 

原理就是socks5代理了。

Android 6.0新特性:新的Permission模型

我们都知道,在Android上的应用有”权限“这一说法。

具体而言,每次我们安装好一个应用之后,系统都会弹出一个框框,说这个应用将会访问以下权限,是不是要允许?

然后我们就点允许或者不允许,然后确定就是了。

在代码层面,这些权限是通过Manifest文件制定的。就像下面这样:

这些权限,称之为install permission,就是程序安装的时候设定的权限,之后会一直允许。

 

在Android 6.0中Google提出了新的授权模型,叫做real-time permission。简单来说,就是不仅要在安装的时候授权,还要在运行程序的时候,当app要使用某个权限的时候,弹出一个框框让用户自己去选择是否授权。

 

举例来说,比如要访问磁盘读写了,就会弹出一个框框,说现在要访问设备上的资料了,允不允许。

 

但是,并不是所有的permission都需要这样授权。有一些permission被称作危险的权限,例如读写磁盘,这类权限是需要运行时询问的;另一些权限,如Internet访问,被称作安全权限,只要安装的时候允许了就可以了。

对于危险权限的设定如下图:

另外要注意一点,如果对于一个ground的某个权限授权了,就意味着会对这个group里面所有的权限授权。

 

比如我们授权读,那么就顺便授予写权限了。

 

那么如何在代码里面实现这个功能?

我们需要在Activity里面动态的申请权限,并且在回调函数里面执行后续的工作。

例如我们写一个这个函数:

 

然后重写回调函数:

 

 

这样就会申请disk的读写操作,并且在写权限被授予之后,创建一个MyLogger,这个是我自定义的一个日志文件。

这样,运行的时候就会弹出一个框框,不过是在Android 6.0场景下:

参考:http://www.captechconsulting.com/blogs/runtime-permissions-best-practices-and-how-to-gracefully-handle-permission-removal

 

 

Android AIDL研究,Service的回调

回调的基本思路,创建一个回调接口,然后把这个回调接口以参数的形势在远程调用的时候传递过去。

 

例子:假如设定了

其中,E3RemoteService是远程Service暴露出的接口,而ICallBack是要传递给Service的接口参数

 

CallBack的定义:

 

 

在Service的接口中,创建函数,记住要把参数传递过去:

 

在Service里面,实现这两个方法

这样,Service就会回调ICallback里面的方法了。

 

所以,我们还需要在client里面实现这个方法:

 

Android AIDL研究,基本AIDL步骤

首先实现基本数据类型的传递,这里我们将AIDL的双方成为client和server

 

1.在server上创建aidl文件

2.创建一个Service,然后实现这个接口

 

3.在Service的OnBind函数里面,暴露这个接口

其实就是将实现好的接口返回

 

 

4.在client端,在相同的包名下创建相同的aidl文件

5.在client端连接到service,利用bindService方法

创建一个ServiceConnection方法,在连接上之后就可以获得server暴露出的接口了

 

注意Android5.0之后Intent必须显示声明,在bindService的时候,不然会报错。所以这里 使用了一个转化Intent的方法:

 

不要忘记了在Service里面创建过滤器:

这样就可以使用默认数据类型进行传递了。

 

 

 

Volley源码学习之回调类ExecutorDeliver和Delivery的分析

最后,我们看一下这个回调的类是怎么处理回调请求的。
这个ExecutorDelivery里面有两个函数是经常使用的:

重点看一下第二个
这里的Poster是一个executor类,

他干的事情就是执行runnable里面的东西。
所以,postResponse做的事情,就是把request先标记一下,然后执行runnable的事情。好吧我们就看看runnable里面在干嘛

注意,这个runnable里面居然还有一个runnable,这个内嵌的runnable是执行完这个runnable之后执行的runnable。好绕口。
看代码就理解了:

所以,这里调用了request的deliverResponse函数!!!这个就是用户自己定义的了!
然后,如果这个request不是一个中间结果,就可以调用它的finish函数了,最后会把这个request从队列中清理掉。
至此,分析完了整个delivery类。

Volley源码学习之关于NetworkDispatcher的分析

接下来看看Network调度器都在干嘛。
这里就没有Cache队列的,就只有一个队列了

重点关注一下run函数里面干了什么。
同样的,有一个巨大的while循环,从network队列里面取出request进行处理

执行这个request,把结果拿回来

如果这个response根本就没有修改,或者已经交付了,那就不传递一个一样的response了

看看这个finish函数里面做了什么事情:

调用一个Request的finish,其实就是让RequestQueue把这个request删掉。

然后,要把接收到的response转化,并且如果需要的话应该更新cache

最后,依然是调用传递函数,把response返回给application,结束

至此,结束对网络调度器的分析

Volley源码学习之关于CacheDispatcher的分析

下一步,我们分析一下缓存调度线程。

 

先看看这个调度器里面有什么,可以确定的是这个调度器是一个线程

 

里面有两个奇怪的队列,不知道是什么东西。他们的命名跟在RequestQueue里面一样,都是叫m什么队列。

 

还有一个回调的类,应该就是用来返回结果的。

 

结合RequestQueue里面的代码可知道,这里的缓存和网络队列,实际上就是通过start函数创建调度器的时候传过去的。也就是说,RequestQueue和这个调度器里面的队列其实就是一个队列。

 

看构造函数:

 

 

以及RequestQueue里面的start函数:

 

接下来看看Cache调度器里面都做了什么!

这里,初始化了Cache,我们之前的分析中知道,这里是在创建一个文件夹,以及把根目录下的每一个cache文件的CacheHeader读取出来,存到它的那个列表里面。

 

然后在一个巨大的while循环里面,从缓存队列里面取出request处理:

 

 

然后!尝试去Cache里面找key对应的内容。如果没找到,丢给网络队列里面去,添加一个cache-miss的标记,然后就不管了。

 

但是如果找到了,可是过期了,要调用setCacheEntry这个函数,把entry放到request里面去。注意,这里等于把一个过期了的entry装到了Request里面。最后又丢给了NetworkQueue

 

/**
* True if the entry is expired.
*/
public boolean isExpired() {
return this .ttl < System. currentTimeMillis() ;
}

/**
* True if a refresh is needed from the original data source.
*/
public boolean refreshNeeded() {

return this .softTtl < System. currentTimeMillis() ;

}

 

注意这里有一个硬性ttl和一个软ttl判断entry是否过期。

 

如果是两个判断都没有过期,就会直接把response丢给回调的那个类,让回调的类统一处理。

如果硬判断没过期,软判断过期,用了一个非常奇怪的方法处理,它一方面把response返回,另一方面还要把这个request丢给网络调度器。

 

(过期,刷新,这些都是HTTP里面的字段)

 

 

然后,刷新response的操作之后:

这个intermediate是说明这个response不是最新的,还有更新的会到达。

 

然后:

 

参考一下这个接口的说明:

 

所以,这里干的事情就是,把把response交还给应用,并且还要把request丢给network队列。

 

至此,Cache调度器分析完毕。