使用systemd

systemd 是一个 Linux 系统基础组件的集合,提供了一个系统和服务管理器,运行为 PID 1 并负责启动其它程序,现在已成为大多数发行版的标准配置。

历史上,Linux 的启动一直采用init用于管理进程和服务。这种方法有两个缺点:一是启动时间长。init进程是串行启动,只有前一个进程启动完,才会启动下一个进程;二是启动脚本复杂。init进程只是执行启动脚本,不管其他事情。脚本需要自己处理各种情况,这往往使得脚本变得很长。因此Systemd应运而生,Systemd 取代了initd,成为系统的第一个进程(PID 等于 1),为系统的启动和管理提供一套完整的解决方案。

根据 Linux 惯例,字母d是守护进程(daemon)的缩写。 Systemd 这个名字的含义,就是它要守护整个系统。

创建配置文件

/etc/systemd/system创建一个以 .service结尾的文件。

例如 servicename.service

一次惨痛的GRE考试

经过两个月的(精心)准备,终于在今天上午迎来了我的第一场GRE考试。

考场在北大理教的计算中心。进场之后是例行的存包,签保密协议等等。等9点过的时候统一安检,入场,拍照片。

我分到的考位是一个靠墙的角落,感觉相当不错,不会有人进进出出。北大的机房很老旧,但是设备还可以。屏幕是16:9的宽屏,在考试时字体会被拉的很宽。键盘虽然不如北工商,但也还说得过去。等所有人都检录完成之后,整个考场几乎可以同时开始考试,这样也就无所谓先进或后进考场,当然也不会在读阅读的时候旁边突然钻出来一个人开始describe the city you live in。

Padavan路由器安装Time Machine服务器

此前我的路由器一直使用OpenWrt。但是,近日在OpenWrt中继配置万能的过程中遇到了一系列问题后,了解到了Padavan这个固件。Padavan固件的功能十分强大,可以实现包括但不限于文件共享,Aria,Transmission,Web容器,Time Machine等强大功能。

源代码:padavan / rt-n56u — Bitbucket
论坛发布页:http://www.right.com.cn/forum/thread-161324-1-1.html

准备工作

  • 一台已经刷入Padavan固件的路由器,并妥善设置opt环境。设置opt环境请参考:像openwrt一样装更多的软件
  • 一块移动硬盘,格式化为ext4(虽然Padavan可以识别NTFS和exFAT分区,但是后期会引发一系列问题,所以请务必使用ext4)
  • 进入系统管理,修改管理员账号为 root

macOS High Sierra安装Caffe框架

英特尔杯人工智能挑战赛需要用到Caffe深度学习框架。Caffe框架在macOS上需要手动编译,然而官方的安装教程年久失修,并且编译过程中会遇到由不同版本或环境而引发的问题,我历时三天,踩了无数的坑之后,终于成功安装了Caffe框架。在此记录下安装的过程和遇到的错误,希望对你有所帮助。

系统环境及安装配置

  • Macbook Air 13′ macOS High Sierra
  • Homebrew
  • Xcode
  • Miniconda Python2(Caffe建议使用Anaconda Python,另外我在尝试使用Python3编译Caffe时遇到了未知的错误,因此建议使用Python2.7)
  • openBLAS(Intel的MKL库会提供更高性能且更稳定的计算,在校学生可以通过这里申请:Intel® Math Kernel Library (Intel® MKL) | Intel® Software
  • CPU ONLY模式(MacBook Air没有NVIDIA GPU,因此使用CPU ONLY模式,不需要安装CUDA及cuDNN)

MySQL 权限管理

前段时间,我班有两个人的MySQL数据库被攻破,所有数据被清空。他们的MySQL实例有两个共同点:

  1. 暴露3306端口。
  2. 使用root用户登录且为弱密码。

MySQL的root用户权限过大,使用root登录是较危险的。因此我们应当避免在生产环境使用root登录,而是新建一个权限较小的用户,以确保安全。

使用蓝图(Blueprint)组织Flask应用

在一些重量级Web框架中(如Laravel/Django),框架中已经预置了整个框架的目录结构,在没有特殊需求的情况下通常不会改变它。在Flask这类轻量级框架中,理论上你可以把一个项目的全部代码都放进一个.py文件中。然而一旦项目规模稍大,就会变得庞大而难以管理。这时,我们需要蓝图(Blueprint)来帮助我们管理代码结构。

蓝图

什么是蓝图

Flask用蓝图(blueprints) 的概念来在一个应用中或跨应用制作应用组件和支持通用的模式。蓝图很好地简化了大型应用工作的方式,并提供给 Flask 扩展在应用上注册操作的核心方法。一个 Blueprint 对象与 Flask 应用对象的工作方式很像,但它确实不是一个应用,而是一个描述如何构建或扩展应用的蓝图 。

简而言之,我们可以将蓝图理解为Flask应用中的一个模块。

记第六届中国软件杯决赛

经过7月份的初赛,我们成功晋级了中国软件杯的决赛。9月4号,我们启程前往南京参加决赛。

关于比赛:大学生软件设计大赛官方网站—中国软件杯全国大学生软件设计大赛组委会主办
我们的赛题:安全可靠赛题2:分布式爬虫系统 – 六届赛题 – 大学生软件设计大赛官方网站—中国软件杯全国大学生软件设计大赛组委会主办

第一天 签到

9月4号,正好是学校开学第一天,我们一大早出发前往南京。第一周的课就先翘为敬了。

我们的车次是刚上线运行不久的复兴号,有车载WiFi,看了下IP应该是移动的4G,速度很良心。而且小桌板比和谐号更大,简直是为了车上赶代码量身定制的(误。

使用nginx unit部署微服务

前端时间,nginx发布了nginx unit。NGINX Unit 是一个动态的网络应用服务器,它被设计为可运行多种编程语言的。通过API可以轻巧,多面化的动态配置Unit。目前为止nginx unit支持php,python以及go。其他语言如java,javascript等语言尚未提供支持。

有了nginx unit,我们就可以不用配置繁琐的php-fpm和uwsgi,只需要一个json文件即可部署一个微服务。

NGINX Unit 现在是beta版本。你现在虽然可以使用它,但建议仅用于测试环境,不建议用于生产环境。

GitHub:https://github.com/nginx/unit/

中文文档:https://github.com/tuzimoe/unit/blob/master/README_zh-Hans.md

下面我们使用nginx unit部署一个django项目,以hyriamb/nem-downloader: django网易云音乐下载器,适用于新版api为例。

使用Jenkins持续集成Java应用

Jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具。用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件持续集成。
在这学期的软件工程课设中,我们使用Jenkins持续构建、测试及部署一个Spring Boot应用。

安装Jenkins

在安装之前请确保已经安装了JDK和maven。
安装Jenkins有两种方法,一种是从官网下载打包好的.war包;或通过apt等包管理器安装。我的系统是Debian8,安装过程参考这篇文章即可,本文不再赘述。
How To Install Jenkins on Ubuntu 16.04 | DigitalOcean

使用Laravel和jwt-auth编写API

JSON Web Token(JWT)是一个轻量级的认证规范,它允许用户和服务器之间传递安全可靠的信息。

在传统的WEB应用中,服务端成功的返回一个响应于两件事。其一是通过一种存储机制保存会话信息(SESSION)。每一个会话都有它独特的信息,常常是一个长的,随机化的字符串,它被用来让未来的请求检索信息。其次,包含在响应头里面的信息使客户端保存了一个COOKIE。服务器自动的在每个子请求里面加上了会话ID,这使得服务器可以通过检索SESSION中的信息来辨别用户。
API应该被设计成无状态的。这意味着没有登录,注销的方法,也没有SESSION和COOKIE。因此,我们引入JWT。

使用jwt进行认证和授权

认证

客户端向服务器发送用于登录的用户名和密码,服务器将用户名和密码和数据库比对成功后,将一条形如 eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ的token返回给客户端,客户端应在本地存储这个token。
这条token被 .分为三个部分:头部(Header),载荷(Payload)和签名(Signature)。其中头部的 algtyp两个字段定义了此token所使用的加密算法和token类型;载荷中包含有认证用户的信息;签名则将头部和载荷以及key用base64编码后计算SHA256。

授权

在同一个会话中,当客户端再次向服务器发送请求时,将token附带在请求头的 Authorization字段中。服务器验证此token(是否有效,是否在有效期内等)后,即可对客户端授权。

dingo api是一个为Laravel和Lumen设计的用于更好地实现RESTful API的第三方库,并且兼容jwt-auth。下面我们使用dingo api和jwt-auth来编写一个登录/登录和认证的API。

安装

我们需要安装jwt-auth和dingo api
composer.json中加入如下两行

执行安装

配置

首先配置jwt-auth
编辑 config/app.php
providers中加入
'Tymon\JWTAuth\Providers\JWTAuthServiceProvider'

aliases中加入
'JWTAuth' => 'Tymon\JWTAuth\Facades\JWTAuth'

发布配置
php artisan vendor:publish --provider="Tymon\JWTAuth\Providers\JWTAuthServiceProvider"

生成key
php artisan jwt:generate

接下来配置dingo api
providers中加入
Dingo\Api\Provider\LaravelServiceProvider::class

发布配置
php artisan vendor:publish --provider="Dingo\Api\Provider\LaravelServiceProvider"

创建路由

routes/api.php

注册/登录

app/Api/Controllers/AuthController.php

鉴权

在成功登录后,客户端会收到服务器返回的token。在token有效期内(默认是一个小时),客户端在请求需要鉴权的路由时,只需在HTTP请求头中加入名为 Authorization,值为 bearer +token的字段即可,如果token过期则需要重新登录。
在服务器上, api.auth中间件会自动进行token的鉴定。在Controller中,调用 Auth::User()即可获得已认证的用户实例。
app/Api/Controllers/TestController.php

参考资料

http://www.haomou.net/2014/08/07/2014_session/
https://github.com/dingo/api/wiki
https://github.com/tymondesigns/jwt-auth/wiki