0%

1.前期准备

yum update //更新yum源
yum groupinstall "Development Tools" //安装开发工具包
yum install wget //安装wget下载工具

2.安装Nginx

yum install nginx -y //安装nginx
service nginx start //开启nginx
chkconfig nginx on //设置开机自启动

Nginx安装完成,现在用IP或者域名就可以访问你的服务器了.

使用Nginx配置反向代理,指向ghost博客的2368端口.

cd /etc/nginx/conf.d //cd到nginx目录
vim default.conf //打开default.conf文件

在文件中写入一下内容:

server {  
    listen 80;
    server_name jingxuetao.com;
    location / {
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header Host $http_host;
        proxy_pass http://127.0.0.1:2368;
        proxy_set_header REMOTE-HOST $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

将上面的server_name 替换成自己的域名,保存退出,并重启Nginx.

service nginx restart

3.安装MySQL

Ghost集成了sqlite3数据库,如果不用MySQL,本步可以忽略.

yum install mysql mysql-server //安装MySQL
service mysqld restart //启动数据库
chkconfig mysqld on //设置开机启动
mysql_secure_installation //开始配置数据库
Set root password? [Y/n] //设置root密码 -- 根据个人需求  
anonymous users? [Y/n] //删除匿名用户 -- y  
Disallow root login remotely? [Y/n] //禁止root用户远程登录 --n
Remove test database and access to it? [Y/n] //删除默认的 test 数据库 --y  
Reload privilege tables now? [Y/n] //是否马上应用最新的设置 --y  

为了支持中文,还需要修改MySQL字符支持.

vim /etc/my.cnf

在对应位置填入对应的内容:

[client]
default-character-set=utf8  
[mysql]
default-character-set=utf8  
[mysqld]
character-set-server=utf8  
collation-server=utf8_general_ci  

然后新建一个Ghost专用MySQL用户跟database:

mysql -u root -p  
//用root用户登录mysql
create database ghost;  
//创建ghost数据库
GRANT ALL PRIVILEGES ON ghost.* To 'ghost'@'%' IDENTIFIED BY '密码';  
//创建ghost database 和 用户名为ghost的用户
//%代表能被所有地址访问

4.安装Node.js

根据Ghost官方建议,安装v0.10.40版本

wget http://nodejs.org/dist/v0.10.40/node-v0.10.40.tar.gz
tar zxvf node-v0.10.40.tar.gz
cd node-v0.10.40
./configure
make && make install

5.安装Ghost

mkdir /var/www //创建Ghost安装路径
wget http://dl.ghostchina.com/Ghost-0.7.4-zh-full.zip //下载Ghost(中文版)
unzip Ghost-0.7.4-zh-full.zip //解压zip文件到当前文件夹
mv config.example.js config.js //重命名,并配置
vim config.js //打开config.js文件,并在里面填写对应内容.如果用sqlite3,只需要配置url
production: {  
    url: 'http://jingxuetao.com', //这里是你自己VPS主机的域名,或者IP
    mail: {},
    database: {
        client: 'mysql'这里我选择使用mysql作为我博客的数据库
        connection: {
            host : '127.0.0.1',
            user : 'ghost', //mysql用户名
            password : '', //密码
            database : 'ghost', //之前创建的ghost数据库名称
            charset : 'utf8'
        },
    server: {
            host: '127.0.0.1',
            port: '2368'//若修改该端口记得在nginx中做相应改变
        }
    }  

现在在www目录下用命令npm start启动Ghost,网页就可以浏览了.

6.使用PM2让Ghost永远在线

只要我们一断开ssh,Ghost的进程就会被关闭,这里我们使用PM2来守护Ghost服务进程,并让其运行在生产模式production上

//!!首先进到ghost的安装目录
//安装pm2
npm install pm2 -g  
//让ghost以production模式运作,指定程序的入口index.js,并且此进程命名为ghost
NODE_ENV=production pm2 start index.js --name "ghost"  
//开机启动
pm2 startup centos  
pm2 save  

进程守护做完,顺便提提pm2重启进程的命令是:

pm2 restart ghost

http://jingxuetao.com/ghost 访问后台

7.设置外部存储

Ghost默认是将图片存储在服务器上的,但是服务器存储空间有限,并且外部存储又不花钱.

https://portal.qiniu.com/ 创建七牛云存储账号,并创建一个空间(公开空间).(使用免费空间之前得冲10块钱),然后修改Ghost配置文件如下:

/*storage: {
     provider: 'local-file-store'
 }*/ //注释掉本地存储代码.
 storage: {
     provider: 'qiniu',
     bucketname: 'blog-pic',//空间名称
     ACCESS_KEY: 'd05f31DxWMuCdnqxxxxHOFc5cMJ4rQbdpnPJGB4F',//账号->密钥(左边菜单栏),将AK,SK分别对应ACCESS_KEY,SECRET_KEY填入
     SECRET_KEY: 'q6l8YgfxOdxGSR8U5_DwBhtyC5133xurgBGyjIHt',
     root: '/image/',
     prefix: 'http://o3pxzuakz.qnssl.com'//选择一个空间->空间设置->域名设置->七牛域名,将网址复制到这.
 }

然后,在default.conf文件的location中添加

client_max_body_size 5m; //设置上传图片最大是5M,不设置上传图片会不成功,默认上传图片大小比较小.

重启Ghost,上传一张图片试试,看看图片地址.

8.设置HTTPS

①申请沃通免费证书,参考这篇文章.
Wosign沃通免费SSL申请开通

②选择nginx的证书,改名为cert.crt跟cert.key

③将证书上传到服务器的/etc/nginx目录下,然后配置Nginx.在/etc/nginx/conf.d目录下,除了default.conf文件之外,应该还有一个sslxxxxx.conf文件(没有就创建ssl.conf文件),将下面内容对比填入或者复制进去.

# HTTPS server
#
server {
    listen 443 ssl;
    server_name jingxuetao.com;
    ssl_certificate /etc/nginx/cert.crt;
    ssl_certificate_key /etc/nginx/cert.key;
    ssl_session_cache shared:SSL:1m;
    ssl_session_timeout 5m;
    ssl_ciphers HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers on;
    location / {
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_pass http://127.0.0.1:2368;
        client_max_body_size 5m;
    }
}

另外还得在config.js文件中将url字段http后面加个s,例如:

url: 'https://jingxuetao.com'

现在通过https://jingxuetao.com 就可以访问自己的网站了.

要想将HTTP请求自动跳转到HTTPS,在default.conf文件的location中添加下面内容

return 301 https://$server_name$request_uri;

现在是实现HTTPS了,但是因为网页中含有其他网站的资源文件(图片,一个是头像,另一个就是后台左上角的那个小图标,再就是自己上传到七牛的图片.),所以现在浏览器地址栏中并没有显示安全连接.

往后需要各种注意的细节,文字描述不清楚.不说了,心好累.

博客本来访问量就不多,耐心看到这的就更少了.如果需要,加我QQ吧,1247846317 验证问题:荆学涛.

END

一.IOS隐藏tabBar的方法:

self.tabBarController.tabBar.hidden = YES;

但是我们跳转隐藏tabBar需要的不是这段代码.

二.push跳转隐藏tabBar

如果在push跳转时需要隐藏tabBar,设置self.hidesBottomBarWhenPushed=YES;并在push后设置self.hidesBottomBarWhenPushed=NO;这样back回来的时候,tabBar会恢复正常显示。代码如下:

NextViewController *next=[[NextViewController alloc]init];
next. hidesBottomBarWhenPushed = YES;
[self.navigationController pushViewController:next animated:YES];

END

“哈哈,我终于从镜像文件变成变成操作系统啦,O(∩_∩)O~,我的主人每天都会用我办公超过10个小时.虽然我的身体素质不好,但是我有一颗顽强灵魂;虽然每天都会很累,但是我很开心.因为我是主人的操作系统呀!(^_\^)”.
______________________________________________________________\
—–一台虚拟机的悲哀

或许我们也是虚拟机.
  • 博客从ACE转移到ECS上了.过程比较曲折,结果还算完美.
  • 明天写一下教程,然后再把HTTPS的反代理弄一下.又得翻代码.
  • 以后不折腾了,不折腾了.

END

现在面临的场景

在做项目过程中难免会创建很多ViewModel,这些ViewModel难免有些共同的方法跟属性,这些共同的方法和属性可以单独提取出来,这就用到category.我现在的具体场景是:每个ViewModel都需要请求数据,当ViewController从当前界面切换到另一个画面时,暂停本页面的网络请求.

源码

NSObject+ViewModel.h文件

@interface NSObject (ViewModel)
@property (nonatomic) NSURLSessionDataTask *dataTask;
- (void)cancelTask; //取消任务
- (void)suspendTask; //暂停任务
- (void)resumeTask; //继续任务
@end

NSObject+ViewModel.m文件

#import "NSObject+ViewModel.h"
#import <objc/runtime.h>//得引入runtime
static const void *dataTaskKey = &dataTaskKey;
@implementation NSObject (ViewModel)
//通过运行时, 实现setter方法动态的绑定属性到对象
/**
  参数一 源对象,此处是self
  参数二 唯一静态变量,dataTaskKey保存的是他自己的地址,因为是静态的,所以地址不会重复
  参数三 关联的对象
  参数四 关联策略(属性的内存管理方式),关联策略详细解释在下面
**/
- (void)setDataTask:(NSURLSessionDataTask *)dataTask{
    objc_setAssociatedObject(self, dataTaskKey, dataTask, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
/**
  参数一 源对象,此处是self
  参数二 唯一静态变量,dataTaskKey保存的是他自己的地址,因为是静态的,所以地址不会重复
**/
- (NSURLSessionDataTask *)dataTask{
    return objc_getAssociatedObject(self, dataTaskKey);
}
- (void)resumeTask{
    [self.dataTask resume];
}
- (void)cancelTask{
    [self.dataTask cancel];
}
- (void)suspendTask{
    [self.dataTask suspend];
}
@end

关联策略

     Behavior    @property Equivalent    Description        OBJC_ASSOCIATION_ASSIGN    @property (assign) 或 @property (unsafe_unretained)    指定一个关联对象的弱引用。        OBJC_ASSOCIATION_RETAIN_NONATOMIC    @property (nonatomic, strong)    指定一个关联对象的强引用,不能被原子化使用。        OBJC_ASSOCIATION_COPY_NONATOMIC    @property (nonatomic, copy)    指定一个关联对象的copy引用,不能被原子化使用。        OBJC_ASSOCIATION_RETAIN    @property (atomic, strong)    指定一个关联对象的强引用,能被原子化使用。        OBJC_ASSOCIATION_COPY    @property (atomic, copy)    指定一个关联对象的copy引用,能被原子化使用。  

这两个方法可以让一个对象和另一个对象关联,就是说一个对象可以保持对另一个对象的引用,并获取那个对象。有了这些,就能实现属性功能了。

END

经过一番折腾,现在博客能通过HTTPS访问了,但是还不完美,主要是图片资源不是通过HTTPS形式访问的.一个是自己上传的图片,这个好解决,修改一下七牛上传的图片地址就行.另一个就是多说的头像,多说的头像不支持HTTPS,这个得通过反代理的形式.不知道ACE支不支持反代理,已经提交了工单.当然自己上传的图片也可以通过反代理的形式.

年轻就是折腾!

END

用了有半年多的b3log solo博客程序,虽然solo的博客编辑用的也是markdown格式的,但是个人感觉好难用.尽管我发表写的博文并不多.但是有点完美主义的我(并不是往自己身上贴标签),还是不愿意再用solo了.我会把www.jingxuetao.com指向原来的IP,原来的程序有几十篇博文,转移起来也好麻烦,懒得动了.然后在导航设置一个链接,链接到原来的博客.呵,不知道以后会不会再换回WordPress.呵呵,我并不知道.以后的事以后再说吧.

现在感觉这个markdown格式用起来还是比较不错的.

public static void main(String args[]){
    System.out.println("hello world!!");
}

现在代码插入也很方便,可能原来插入代码就很方便,只不过是因为心里问题,觉得原来好麻烦.

  1. 现在
  2. 现在插入代码
  3. 现在插入代码很方便

无序列表

  • 无序列表1
  • 无序列表2

还可以插入图片,插入图片也很方便

这是一张即将要插入的图片
public static void main(String args[]){
    //这是一个由```写的高亮代码
}

添加引用:

这是一个引用

添加分割线


一些常用得markdown语法都在这了,用起来还算顺手.

上方配图来自王源宗Bboy

今天同学问了我一个问题,Google了一下,以后会用到,所以在这记录一下.

有时候,项目需要引用XIB,但是有些UI属性在面板不好设置,例如设置圆角.那么我们可以采取一种思路,通过拖线连接到.m文件,然后开始进行代码属性的修改,但是切记.设置圆角的方法,不能在ViewDidLoad里边重写,这样会导致无效,我们需要在drawRect进行设置,然后再进行调用即可.代码如下:

- (void)drawRect:(CGRect)rect{
  [super drawRect:rect];
  self.imgView.layer.cornerRadius = 20;
  self.imgView.clipsToBounds =YES;
}

另外,有道云笔记这个工具不错.

再就是推荐一个国外的非常不错的图库Unsplash,上面有很多高清图,可以免费使用.以后写博客,就从这上面盗图了.

END