使用Git部署Hexo博客到Ubuntu服务器

本站服务器由UCloud( https://www.ucloud.cn/ )公司赞助提供!

Hexo是使用Node.js开发的静态站点生成器,支持Markdown语法写作,并且有着强大的插件系统,是不少技术开发者搭建个人博客的一个好选择,本文将介绍如何在一台Ubuntu云服务器上使用Git部署Hexo博客站点。

前提条件

  1. 安装Ubuntu操作系统的云服务器一台,同时还需安装Nginx和Git,分别用于静态页面托管以及版本管理部署等;
  2. 本地电脑安装node.js环境以及npm;
  3. 本地电脑安装Git环境;
  4. 本地电脑安装SSH终端;(非必要条件,但是安装了可以方便你访问云服务器,我用的是Xshell,也可以考虑用PuTTY、SecureCRT等)

了解完以上前提条件后,开始动手搭建自己的博客吧。

Nginx配置

购买一台云服务器,由于初期流量不是很大,服务器可以不需要很高的配置,等到需要时再升级(云服务器升级配置很方便的)。下面是我的服务器配置,我在服务器上安装了Ubuntu 16.04版本的操作系统。

登录远程服务器(使用SSH终端远程登录操作更方便),安装Nginx

1
sudo apt-get install nginx

安装完成后(这时我们还没有配置域名),在浏览器直接通过IP地址可以看到下面的网页提示,可以看到下面的网页提示说明安装成功。

接下来,创建/home/ubuntu/www/hexo_blog目录用于Nginx托管网页

1
2
cd /home/ubuntu
sudo mkdir -p www/hexo_blog

使用vim修改Nginx的默认配置文件

1
sudo vim /etc/nginx/sites-available/default

将其中的root指向我们上一步创建的/home/ubuntu/www/hexo_blog目录,同时配置你购买的域名到server_name

1
2
3
4
5
6
7
8
9
10
11
12
...
server {
...
...
root /home/ubuntu/www/hexo_blog; # 指向你的托管目录
index index.html index.htm;
...
...
server_name blog.coderclock.com; # 设置你的域名
...

最后重启你的Nginx服务器,让配置生效。

1
sudo service nginx restart

完成Nginx配置后,接下来是Git配置。

继续阅读全文 »

Android SO文件的兼容和适配

开发Android应用时,有时候Java层的编码不能满足实现需求,就需要到C/C++实现后生成SO文件,再用System.loadLibrary()加载进行调用,这里成为JNI层的实现。常见的场景如:加解密算法,音视频编解码等。在生成SO文件时,需要考虑适配市面上不同手机CPU架构,而生成支持不同平台的SO文件进行兼容。目前Android共支持七种不同类型的CPU架构,分别是:ARMv5,ARMv7 (从2010年起),x86 (从2011年起),MIPS (从2012年起),ARMv8,MIPS64和x86_64 (从2014年起)。如果你要完美兼容所有类型的手机,理论上是要在的libs目录下放置各个架构平台的SO文件。

这样一来,虽然可以兼容所有机型,但你的项目体积也会变得非常庞大。是否一定需要带入这么多SO文件去兼容呢?答案是否定的。

继续阅读全文 »

为什么ContentResolver调用bulkInsert批量插入数据失败

做Android开发的朋友肯定对使用ContentProvider插入数据并不陌生,通常我们使用ContentProvider基本都是经历如下两个步骤:

  • 声明定义ContentProvider及其相关的URI,编写Provider中对应的增删改查方法;
  • 使用ContentResolver及其对应的URI来对ContentProvider进行增删改查操作;

对于使用ContentProvider进行插入操作,分别可以使用insert、bulkInsert两个API接口,前者用于单条数据插入操作,后者则更适合批量数据插入操作,简单的了解了一遍ContentProvider的相关知识后,来看看下面这段代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
public static void addOrUpdateContacts(Context context, Collection<ContactStruct> contacts) {
if (contacts == null || contacts.isEmpty()) {
return;
}
final int kCount = contacts.size();
ContentValues[] valuesArray = new ContentValues[kCount];
int pos = 0;
for (ContactStruct contact : contacts) {
ContentValues values = new ContentValues();
values.put(ContactTable.COLUMN_UID, contact.uid);
values.put(ContactTable.COLUMN_NAME, contact.name);
values.put(ContactTable.COLUMN_PHONE, contact.phone);
values.put(ContactTable.COLUMN_PINYIN, contact.pinyin);
values.put(ContactTable.COLUMN_REMARK, contact.remark);
// add "REPLACE" flag
values.put(ContactProvider.SQL_INSERT_OR_REPLACE, true);
valuesArray[pos++] = values;
}
try {
int ret = context.getContentResolver().bulkInsert(ContactProvider.Contact.CONTENT_URI, valuesArray);
if (ret != kCount) {
Log.e(Log.TAG_DATABASE, "addOrUpdateContacts partial failed, succ:" + ret + ",total:" + kCount);
}
} catch (Exception e) {
e.printStackTrace();
}
}

其传入contacts是一组联系人信息数据,通过一个循环的转换成ContentValues类型的数组,再使用context.getContentResolver().bulkInsert将ContentValues数组插入到数据库中去。简单的了解这段代码的作用后,大家觉得这种写法是否存在问题呢?

继续阅读全文 »

开源推荐:Android图片压缩开源库

推荐两个Github上开源的Android图片压缩库,两个库的代码量不多,可以直接使用或者借鉴学习。商业使用,别忘了遵循其对应的开源协议

需求场景

图片压缩在Android开发的需求中非常常见,如:拍照上传服务器,选择原图上传或者压缩上传,这里必然会涉及到压缩处理图片的问题。

Luban

https://github.com/Curzibn/Luban

Luban,也称鲁班。该库作者一针见血的提出当前图片压缩处理的一些问题:单纯对图片进行裁切,压缩已经有很多文章介绍。但是裁切成多少,压缩成多少却很难控制好,裁切过头图片太小,质量压缩过头则显示效果太差。所以,他通过微信朋友圈发送近100张不同分辨率图片,对比原图与微信压缩后的图片逆向推算出来的压缩算法,具体的算法实现在项目中有详细说明介绍。使用上,支持普通调用方式外,也支持RxJava!

Compressor

继续阅读全文 »

Android ConstraintLayout使用指南

升级Android Studio 2.3之后,IDE默认生成的Activity布局都是以ConstraintLayout做为根布局,体验了一把这个Google去年就开始力推的ConstraintLayout后,觉得非常不错,本文用于记录ConstraintLayout各个方面的使用知识。

平台支持

  • ConstraintLayout最低兼容Android 2.3;
  • 目前Android Studio 2.3默认使用ConstraintLayout作为布局文件的根布局;
  • 想要使用ConstraintLayout,需在项目的build.gradle添加com.android.support.constraint:constraint-layout:XXX版本号依赖;

基础使用

ConstraintLayout翻译成中文也称为约束布局,在整个使用体验过程中真的是贯穿约束二字,这一节先来介绍一些基础使用,后面你就会慢慢感受到约束布局的魅力。创建完工程后打开布局文件,底部切换Design的Tab上,可以看到整个操作界面

左上角的面板是放置了系统内置各种各样的控件,想要布局直接拖到到布局文件中即可(所见即所得),右边的面板是选中布局文件中的控件时期各种各样的空间属性,ConstraintLayout最大的好处在于让我们通过拖控件的形式进行布局,并且不用担心适配问题。所以,先来拖个控件试试看,将一个Button拖动到屏幕正中央,然后运行显示看看效果。

模拟器运行后的效果

而实际运行后却发现,这个Button还是位于屏幕左上角,说好的居中效果呢?这里就要开始引入ConstraintLayout的约束概念,我们切换回去看xml的布局代码,发现了两个问题。第一,布局预览时能够看到显示居中的Button,是因为控件属性设置中引用了两个tools命名空间下的属性。

继续阅读全文 »

利用Android源码,轻松实现汉字转拼音功能

今天和大家分享一个从Android系统源代码提取出来的汉字转成拼音实现方案,只要一个类,560多行代码就可以让你轻松实现汉字转成拼音的功能,且无需其他任何第三方依赖。

需求场景

实际开发过程中需要用到实现汉字转成拼音的场景比较常见,如:通讯录里的联系人字母导航栏,为没有设置头像的用户生成一个名字首字母的头像,国家(省份、城市)字母导航栏,搜索关键字转换成拼音等。

实现方案

Android平台上将汉字转换成为拼音已经有一些开源的第三方实现方案,如pinyin4j和TinyPinyin

pinyin4j:https://sourceforge.net/projects/pinyin4j
TinyPinyin:https://github.com/promeG/TinyPinyin

以上这两个实现方案,都需要引入不少类以及一些相应的编码文件,这里和大家介绍一个比上面两个方案还要精简的实现方案,只要560行代码且无需依赖于其他任何编文件的实现。这个类是从Android系统通讯录源码中提取的,类名为HanziToPinyin,其类文件路径如下:

/packages/providers/ContactsProvider/src/com/android/providers/contacts/HanziToPinyin.java

这是一个很独立的类,需要使用的项目直接拷贝到自己对应的工程里面即可使用,需要注意的是,我是在Android 4.2.2的系统源码中拷贝出来的,为什么选择4.2.2,一个是4.2.2之后(4.3开始)的HanziToPinyin不再可以独立使用,需要依赖于Transliterator,而这个类我们是无法直接引用的。

而Android 2.x的HanziToPinyin在测试了很多转换的结果发现是错误的,所以选择了最后一个可以采纳使用的版本Android 4.2.2。

继续阅读全文 »

Android应用继续瘦身,以及一些注意事项

自上次对应用瘦身过后,经历的若干功能的迭代,很快的,安装包大小又到了15MB,老大说要控制在10MB之内,于是便开始了新一轮的瘦身之旅。

如果你还没读过我的前面一篇瘦身文章,可以先去看看:

Android应用瘦身,从18MB到12.5MB

已经看过上文的朋友,可以直接阅读本文,文章接下来将会为你带来更多瘦身方案,以及一些需要注意的问题。

WebP局限性

在我的上一篇文章提到,让大家谨慎使用WebP格式的图片,并且提及到Android Studio不支持预览WebP图片的问题,而最新的2.3版本已经支持预览WebP文件,同时还能够帮我们将JPG和PNG转换成为WebP图片,虽然IDE的升级让我们喜出望外,但你仍然要关心WebP的一下几个问题:

  • WebP的编码时间为PNG的5倍以上,解码速度与PNG差不多,甚至更快;
  • WebP编码时占用内存比PNG高25%,解码时比PNG低30%;
  • Android 4.0+开始支持WebP图片,但是带透明度的WebP图片是在4.2.1+之后才支持的,在4.2.1之前则无法显示;

针对以上一二点,你可能需要考虑一下自家用户实际机型分布情况,如果大部分都是中低端配置机型,使用了WebP后对体验可能会有所下降,对于高配设备,完全可以忽略。而针对第三点,则需要考虑用户的系统分布,相信绝大部分App的用户已经满足4.0+这个条件,但对于满足4.2.1+条件就很难说了,至少我们这款有几百万用户的产品仍有不少用户不满足此条件,因此也不敢随便提升最低兼容版本,但是你仍然可以进行一些WebP的处理,主要如下:

  • 对于不需要透明度的PNG图片,先转成JPG格式后,再使用IDE进行WebP转换。不要直接用PNG转换成WebP,否则转换后的WebP仍然带了透明度,在4.2.1之前的设备任然无法显示,先转换成JPG就是为了去除PNG的透明度;
  • 将PNG转换成JPG时,建议采用专业的图片处理工具,因为我在使用一些在线转换工具转换成为JPG时,发现有少量的图片转换成JPG后再转成WebP时在4.2.1之前依然无法正常显示,但经过专业的处理的图片处理工具转换后的图片则全部没有问题;
  • 在将JPG转换成WebP图片时,采用IDE默认75的有损压缩质量,超过75之后,压缩效果反而会变差;

虽然IDE给了我们WebP更方便的支持,但实际上受限于Android系统版本的问题,所以,我们只能对有限的图片做处理,对于项目中有大量留白的透明像素的图片,转换成JPG效果会失真,所以,也只能暂时忽略掉。最后,推荐一个腾讯出品的WebP在线工具——智图:https://zhitu.isux.us/ 。关于WebP的知识,我非常建议大家阅读以下两篇腾讯出品的文章,你会收获很多

继续阅读全文 »

关于Android RecyclerView的那些开源LayoutManager

Google默认为RecyclerView提供了LinearLayoutManager、StaggeredGridLayoutManager、GridLayoutManager,已经可以满足很多开发需求了,但是实际开发过程中,免不了出现一些更加新颖的交互设计。于是,便从Github上整理了一波关于RecyclerView可以使用的LayoutManager,在实际开发中需要用到时,遇到相似的效果时即可随手拈来,提高效率。

FanLayoutManager

https://github.com/Cleveroad/FanLayoutManager

来自国外一家名为Cleveroad的科技公司的开源作品,因其效果就像风扇扇叶旋转一样,所以名中带Fan。效果不错,API上也有很多的配置参数,用起来还是挺灵活的。

CarouselLayoutManager

https://github.com/Azoft/CarouselLayoutManager

让你的RecyclerView秀出传送带效果,支持横向和纵向两种选择。

ChipsLayoutManager

https://github.com/BelooS/ChipsLayoutManager

一种流式布局的效果,很像我们平时看到的标签云。该库同样提供了很多可配置效果的API,并且支持多种多花效果。

继续阅读全文 »

几个不错的Android开源音视频播放器

整理了一下Github上几个开源的音视频播放器项目,有兴趣的同学可以clone代码去研究学习。

UniversalMusicPlayer

https://github.com/googlesamples/android-UniversalMusicPlayer

这是Google开源的一个音频播放器项目,它向我们展示了如何在不同的设备上(Android phones, tablets, Android Auto, Android Wear, Android TV and Google Cast)提供一致的用户体验。

StylishMusicPlayer

https://github.com/ryanhoo/StylishMusicPlayer

采用RxJava开发的本地音乐播放器,UI图标都是Material Design上找的,最终作品颜值如下。

继续阅读全文 »

搭建个人博客,你需要知道这些

一个多月前开始筹备搭建自己的个人博客,由于要等国内备案完成,因此直到这两天才算完全搞定。今天把个人博客搭建需要了解的相关知识整理一下,希望可以给同样想建站的同学提供一点参考。

博客生成器

一个网站最基础的部分就是网页,如果想从HTML页面写起,显然成本太高,好在大牛们已经做好了博客生成器来解决网页编写的问题。一般来说,博客生成器分为动态和静态两种。其中,动态博客生成器典型代表有:WordPress、FarBox、Ghost等,静态的博客生成器典型代表有:Hexo、Jekyll、Octopress、Hugo等。关于动态和静态的区别主要有以下几点:

  • 资源占用上,静态的相比动态占用服务器资源少,还可以托管在Github Pages上;
  • 发布更新操作上,由于静态博客没有管理后台,所以发布更新内容要比动态博客繁琐;
  • 访问速度上,由于静态博客没有数据库,所以访问速度更快;
  • 安全性上,静态博客相比动态博客免疫了很多Web攻击套路;

我的博客便是选择了Hexo这个静态博客生成器。

Web服务器

有了博客生成器后,只需按照对应官方文档配置即可生成一个最简单的本地博客站点,如果想要让网络上人能够访问,你还需要将将其部署上服务器才行。对于服务器的选择,肯定要选择知名的服务器提供商,相对来说会比较稳定靠谱,国内的UCloud、阿里云、腾讯云、七牛云,国外的有亚马逊。如果使用静态博客生成器,还可以考虑用Github Pages,这样可以节省一笔租服务器的开销,对于还没有收入的在校学生,是个很不错的选择。不过,Github偶尔在国内无法访问,这点得做好心理准备。

继续阅读全文 »