百作坊

100dos.com


  • 首页

  • 归档

  • 分类

  • 标签

  • 关于

如何使用 hexo 在多台 PC 发布文章?

发表于 2017-03-14   |   分类于 流程&工具

最近公司和家里各有一台电脑,有需求在俩台电脑上都能发布 Hexo 文章。怎么办呢?

知乎上的回答提供了思路,即创建俩个分支 master 和 hexo,下面的方案大体一样,具体操作流程详细描述一下。如何在PC1上创建 Hexo 项目,可以参考之前的文章。如果像我一样已经有在线的 Github Pages,可以考虑重新创建 Project,这样可以保证 master 和 hexo 代码纯净。

重新部署 hexo:

  1. 重新创建 hexo 项目 hexo init blog.100dos.com ,拷贝之前的 _config.yml、 theme、README.md、CNAME 等资源到新的hexo
  2. 提交代码到master,然后创建 hexo 分支,切换到 hexo 分支
  3. 确保 hexo 分支的代码 hexo server 运行时,跟你之前的博客一样
  4. 提交 hexo 分支代码,切换到 master,git merge hexo 合并刚刚的修改(如果有的话)
  5. 最后在查看 hexo server master 分支下的代码,没问题的话,准备提交github。如果有问题,在 hexo 分支修改,然后再 merge 到 master
  6. 删除 Github 上的原Project
  7. 提交 hexo 分支到Github,git push origin hexo
  8. 部署 master 分支,hexo d --g
  9. OK完成重新部署工作。

如何在其他电脑发布文章?

  1. 检出代码 git clone git@github.com:jixiaod/jixiaod.github.io.git
  2. 切换到 hexo 分支,创建文章 hexo new xxxxx,文章编写完成后,提交
  3. 切换到master,合并hexo分支新编写的文章,git merge hexo
  4. 部署 master 分支,hexo d --g,发布新文章成功

亲测,有效。可以查看我的 Github Hexo 代码。

图解 autoscan、aclocal、automake、autoconf、autoheader、configure

发表于 2017-03-14   |   分类于 C/C++

autoscan (autoconf)

扫描源代码以搜寻普通的可移植性问题,比如检查编译器、库、头文件等,生成文件configure.scan,它是configure.ac的一个雏形。

aclocal (automake)

根据已经安装的宏,用户定义宏和 acinclude.m4 文件中的宏将 configure.ac 文件所需要的宏集中定义到文件 aclocal.m4 中。aclocal是一个 perl 脚本程序,它的定义是:

aclocal - create aclocal.m4 by scanning configure.ac

user input files optional input process output files
================ ============== ======= ============
acinclude.m4 - - - - -.
V
.-------,
configure.ac ------------------------>|aclocal|
{user macro files} ->| |------> aclocal.m4
`-------'

autoheader(autoconf)

根据 configure.ac 中的某些宏,比如 cpp 宏定义,运行 m4,生成 autoconfig.h.in

user input files optional input process output files
================ ============== ======= ============
aclocal.m4 - - - - - - - .
|
V
.----------,
configure.ac ----------------------->|autoheader|----> autoconfig.h.in
`----------'

automake

automake 将 Makefile.am 中定义的结构建立 Makefile.in,然后 configure 脚本将生成的 Makefile.in 文件转换为 Makefile。如果在 configure.ac 中定义了一些特殊的宏,比如 AC_PROG_LIBTOOL,它会调用 libtoolize,否则它会自己产生 config.guess 和 config.sub。

user input files optional input processes output files
================ ============== ========= ============
.--------,
| | - - -> COPYING
| | - - -> INSTALL
| |------> install-sh
| |------> missing
|automake|------> mkinstalldirs
configure.ac ----------------------->| |
Makefile.am ----------------------->| |------> Makefile.in
| |------> stamp-h.in
.---+ | - - -> config.guess
| | | - - -> config.sub
| `------+-'
| | - - - -> config.guess
|libtoolize| - - - -> config.sub
| |--------> ltmain.sh
| |--------> ltconfig
`----------'

autoconf

将 configure.ac 中的宏展开,生成 configure 脚本。这个过程可能要用到 aclocal.m4 中定义的宏。

user input files optional input processes output files
================ ============== ========= ============
aclocal.m4 - - - - - -.
V
.--------,
configure.ac ----------------------->|autoconf|------> configure ----->autoconfig.h, Makefile

Centos7 安装 Gitlab-CE

发表于 2017-03-03   |   分类于 linux
  1. 安装配置依赖项
    如想使用Postfix来发送邮件,在安装期间请选择’Internet Site’. 您也可以用sendmai或者 配置SMTP服务 并 使用SMTP发送邮件.
    在 Centos 6 和 7 系统上, 下面的命令将在系统防火墙里面开放HTTP和SSH端口.
sudo yum install curl policycoreutils openssh-server openssh-clients
sudo systemctl enable sshd
sudo systemctl start sshd
sudo yum install postfix
sudo systemctl enable postfix
sudo systemctl start postfix
sudo firewall-cmd --permanent --add-service=http
sudo systemctl reload firewalld

如果提示防火墙没打开,执行

systemctl start firewalld

  1. 添加GitLab仓库,并安装到服务器上
    curl -sS http://packages.gitlab.cc/install/gitlab-ce/script.rpm.sh | sudo bash
    sudo yum install gitlab-ce
  1. 启动GitLab

    sudo gitlab-ctl reconfigure
  2. 使用浏览器访问GitLab

首次访问GitLab,系统会让你重新设置管理员的密码,设置成功后会返回登录界面.
默认的管理员账号是root,如果你想更改默认管理员账号,请输入上面设置的新密码登录系统后修改帐号

5.配置域名访问
以上基本是官方内容,以下配置自己的域名。首先添加 godaddy的域名 A 记录到服务器IP。

在文件

vi /etc/gitlab/gitlab.rb

找到nginx的配置文件位置,并修改默认域名为自己的域名。

更多可官方安装文档 :https://www.gitlab.cc/downloads/#centos7

CentOS 7 从零开始搭建 LNMP 环境(nginx/1.10.3 PHP/7.1.2 Mysql/5.7.17)

发表于 2017-03-03   |   分类于 linux

最近买了 Linode VPS 服务。5刀每月,只有1G的内存,编译 Mysql 内存溢出,然后升级到2G内存的版本,每月10刀……以下纪录 LNMP 环境安装过程:

安装 Nginx

~# yum install wget
~# wget http://nginx.org/download/nginx-1.10.3.tar.gz
~# tar zxf nginx-1.10.3.tar.gz
~# cd nginx-1.10.3
~# yum install pcre-devel pcre openssl openssl-devel
~# yum install gcc
~# ./configure --prefix=/opt/nginx
~# make & make install

修改配置文件,启动 Nginx服务

~# /opt/nginx/sbin/nginx

重启

~# /opt/nginx/sbin/nginx -s reload

安装 PHP

~# wget http://jp2.php.net/get/php-7.1.2.tar.gz/from/this/mirror
~# tar zxf mirror
~# cd php-7.1.2
~# yum install zlib-devel zlib libxml2 libxml2-devel libpng libpng-devel libcurl-devel curl libcurl libzip-devel libzip gd bzip2-devel bzip2
~# ./configure --prefix=/opt/php --enable-fpm --with-openssl --with-zlib --with-mysqli=mysqlnd --enable-pcntl --enable-soap --enable-zip --enable-sockets --enable-mbstring --with-curl --with-pcre-regex --with-bz2 --with-gd --with-pdo-mysql=mysqlnd --with-mysqli=mysqlnd --enable-maintainer-zts
~# make & make install

启动 php-fpm,使用默认的配置文件

~# cd /opt/php
~# mv etc/php-fpm.conf.default etc/php-fpm.conf
~# mv etc/php-fpm.d/www.conf.default etc/php-fpm.d/www.conf
~# sbin/php-fpm -y etc/php-fpm.conf

安装 Mysql

~# wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.17.tar.gz
~# tar zxf mysql-5.7.17.tar.gz
~# cd mysql-5.7.17
// cmake安装mysql,会自行下载并安装boost
~# yum install cmake gcc gcc-c++ ncurses-devel cmake libaio bison
~# cmake . -DCMAKE_INSTALL_PREFIX=/opt/mysql -DWITH_BOOST=/opt/boost/ -DMYSQL_DATADIR=/opt/mysql/data -DWITH_INNOBASE_STORAGE_ENGINE=1 -DMYSQL_UNIX_ADDR==/opt/mysql/mysql.sock -DMYSQL_USER=mysql -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci
~# make & make install

创建 Mysql 账户

~# groupadd mysql
~# useradd -r -g mysql -s /bin/false mysql
~# chown -R mysql .
~# chgrp -R mysql .

启动 Mysql 服务

//生成初始化 Mysql 帐号root 密码
[root@li1571-79 mysql]# bin/mysqld --initialize --user=mysql
2017-03-03T02:59:23.230496Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
2017-03-03T02:59:23.576085Z 0 [Warning] InnoDB: New log files created, LSN=45790
2017-03-03T02:59:23.628088Z 0 [Warning] InnoDB: Creating foreign key constraint system tables.
2017-03-03T02:59:23.685971Z 0 [Warning] No existing UUID has been found, so we assume that this is the first time that this server has been started. Generating a new UUID: 67ce62cb-ffbd-11e6-a9b9-f23c91e57db2.
2017-03-03T02:59:23.688763Z 0 [Warning] Gtid table is not ready to be used. Table 'mysql.gtid_executed' cannot be opened.
2017-03-03T02:59:23.690301Z 1 [Note] A temporary password is generated for root@localhost: &H4FpSyD/b6<

最后的 &H4FpSyD/b6< 即是生成的临时账户,启动 Mysql 服务

~# cp support-files/mysql.server /opt/mysql/bin
~# cd /opt/mysql
~# bin/mysql.server start

[root@li1571-79 mysql]# bin/mysql -uroot -p -h127.0.0.1 -P3306
Enter password:
输入临时帐号密码,即可进入mysql 客户端。第一次登录,强制需要修改临时密码
mysql> alter user 'root'@'localhost' identified by '123abc';
Query OK, 0 rows affected (0.01 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.01 sec)

到这里,LNMP 到这里LNMP 初始默认环境搭建完成。

进程和线程

发表于 2017-02-27   |   分类于 底层原理

进程(process)是计算机中已运行程序的实体。关于进程需要知道的几点:

  • 进程是程序的基本执行实体。
  • 在面向线程设计的系统(如当代多数操作系统、Linux 2.6及更新的版本)中,进程本身不是基本运行单位,而是线程的容器。
  • 程序本身只是指令、数据及其组织形式的描述,进程才是程序(那些指令和数据)的真正运行实例。
  • 若干进程有可能与同一个程序相关系,且每个进程皆可以同步(循序)或异步(平行)的方式独立运行。
  • 现代计算机系统可在同一段时间内以进程的形式将多个程序加载到存储器中,并借由时间共享(或称时分复用),以在一个处理器上表现出同时(平行性)运行的感觉。
  • 同样的,使用多线程技术(多线程即每一个线程都代表一个进程内的一个独立执行上下文)的操作系统或计算机架构,同样程序的平行线程,可在多CPU主机或网络上真正同时运行(在不同的CPU上)。
  • 进程需要一些资源才能完成工作,如CPU使用时间、存储器、文件以及I/O设备,且为依序逐一进行,也就是每个CPU核心任何时间内仅能运行一项进程。
  • 进程在运行时,状态(state)会改变。进城的状态包括:
    • 新生(new):进程新产生中。
    • 运行(running):正在运行。
    • 等待(waiting):等待某事发生,例如等待用户输入完成。亦称“阻塞”(blocked)
    • 就绪(ready):排班中,等待CPU。
    • 结束(terminated):完成运行。
  • 进程间通信(IPC Inter-process communication):每个进程都有自己的一部分独立的系统资源,彼此是隔离的。为了能使不同的进程互相访问资源并进行协调工作,才有了进程间通信。
  • 进程控制块是操作系统能够支持多进程和提供多处理的结构。
  • 当操作系统做进程切换时,它会执行两步操作,一是中断当前处理器中的进程,二是执行下一个进程。 不管是中断还是执行,进程控制块中的程序计数器、上下文数据和进程状态都会发生变化。

在 PHP 中的 PCNTL 扩展实现了Unix方式的进程创建,程序执行,信号处理以及进程的中断。但是只能 CLI 环境下使用,且在 Windows 平台不可用。

<?php
$pid = pcntl_fork();
//父进程和子进程都会执行下面代码
if ($pid == -1) {
//错误处理:创建子进程失败时返回-1.
die('could not fork');
} else if ($pid) {
//父进程会得到子进程号,所以这里是父进程执行的逻辑
pcntl_wait($status); //等待子进程中断,防止子进程成为僵尸进程。
} else {
//子进程得到的$pid为0, 所以这里是子进程执行的逻辑。
}

线程(thread)是操作系统能够进行运算调度的最小单位。

  • 它被包含在进程之中,是进程中的实际运作单位。
  • 一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。
  • 在Unix System V及SunOS中也被称为轻量进程(lightweight processes),但轻量进程更多指内核线程(kernel thread),而把用户线程(user thread)称为线程。
  • 线程是独立调度和分派的基本单位。线程可以操作系统内核调度的内核线程,如Win32线程;由用户进程自行调度的用户线程,如Linux平台的POSIX Thread;或者由内核与用户进程,如Windows 7的线程,进行混合调度。
  • 同一进程中的多条线程将共享该进程中的全部系统资源,如虚拟地址空间,文件描述符和信号处理等等。但同一进程中的多个线程有各自的调用栈(call stack),自己的寄存器环境(register context),自己的线程本地存储(thread-local storage)。
  • 一个进程可以有很多线程,每条线程并行执行不同的任务。
  • 线程的四种基本状态:
    • 产生(spawn)
    • 中断(block)
    • 非中断(unblock)
    • 结束(finish)

在PHP中有 pthreads 多线程扩展,实现了面向对象的 多线程 API。可以创建、读取、写入以及执行多线程应用,并可以在多个线程之间进行同步控制。

<?php
class workerThread extends Thread {
public function __construct($num){
$this->num = $num;
}
public function run(){
while(true){
echo $this->num . "\n";
sleep(1);
}
}
}
for ($i=0; $i < 50; $i++){
$workers[$i] = new workerThread($i);
$workers[$i]->start();
}

线程较之进程,其优势在于一个快,不管是创建新的线程还是终止一个线程;或者是线程间的切换还是线程间共享数据或通信,其速度与进程相比都有较大的优势。进程和线程区别:

  • 线程是在一个进程内的,可以共享内存变量实现线程间通信。
    • 而进程间通信是要借助于进程间通信(IPC),文件、管道、消息队列等等。
  • 线程比进程更轻量级,开大量进程会比线程消耗更多系统资源。
    • 比如 PHP-FPM 模块。通常情况下,一个PHP-FPM 进程占用的内存为10M左右,假如支持10000并发,就需要100G的内存。一台物理机的资源是有限的,就那么多CPU和内存,决定了单独依靠 PHP-FPM 不可能开发出单机百万级并发的系统。

我们用多进程和多线程的很大因素是为了解决并发问题,先理清一个概念并发和并行是不是一个意思?

并发和并行的区别就是一个处理器同时处理多个任务和多个处理器或者是多核的处理器同时处理多个不同的任务。 前者是逻辑上的同时发生(simultaneous),而后者是物理上的同时发生。

由于进程的性能问题,我们觉得并发使用的更多的线程,而不是进程。在处理网络请求时,多线程模型下,可以采用一个独立线程接受请求然后派发到各个 worker 线程的方式。但是使用多线程也存在一些问题:

  • 线程读写变量存在同步问题,需要加锁
  • 锁的粒度过大会有性能问题,可能会导致只有1个线程在运行,其他线程都在等待锁。这样就不是并行了
  • 同时使用多个锁,逻辑复杂,一旦某个锁没被正确释放,可能会发生线程死锁
  • 某个线程发生致命错误会导致整个进程崩溃

多进程方式更加稳定,另外利用进程间通信(IPC)也可以实现数据共享。至于为什么进程想对安全稳定,主要是依靠进程沙箱),可以查看这篇文章《为什么浏览器采用多进程模型》。

  • 共享内存,这种方式和线程间读写变量是一样的,需要加锁,会有同步、死锁问题。
  • 消息队列,可以采用多个子进程抢队列模式,性能很好
  • PIPE,UnixSock,TCP,UDP。可以使用read/write来传递数据,TCP/UDP方式使用socket来通信,子进程可以分布运行

Swoole 框架的多进程和多线程的设计实用就非常合理,在需要稳定的时候使用进程,在需要效率的时候使用线程。盗个图

Swoole 中 worker/task 进程都是由 Manager 进程 Fork 并管理的。

  • 子进程结束运行时,Manager 进程负责回收此子进程,避免成为僵尸进程。并创建新的子进程
  • 服务器关闭时,Manager 进程将发送信号给所有子进程,通知子进程关闭服务
  • 服务器 reload 时,Manager进程会逐个关闭/重启子进程

Swoole 提供了完善的进程管理机制,当Worker进程异常退出,如发生PHP的致命错误、被其他程序误杀,或达到 max_request 次数之后正常退出。主进程会重新拉起新的 Worker 进程。 Worker 进程内可以像普通的 apache+php 或者 php-fpm 中写代码。不需要像 Node.js 那样写异步回调的代码。

Swoole 的Master主进程是一个多线程的程序,其中一组很重要的是Reactor线程。Swoole 在接收到一个请求连接之后,将这个链接分配给一个固定的Reactor线程,并由这个线程来监听socket。在socket可读时读取数据,并进行协议解析,将请求投递到Worker进程。在socket可写时将数据发送给TCP客户端。

8w+拉勾网招聘数据帮你查询 - 家附近的工作

发表于 2017-02-09   |   分类于 流程&工具

从拉勾网抓取的 86341 条招聘企业数据,企业地址匹配 LBS 经纬度取自高德开放平台API,成功匹配到 83090 条经纬度数据。没有做详细做企业主正在招聘岗位的数据,所以很大可能情况会遇到附近的公司没有招聘信息的情况,但是某些方面还是能大概了解自己附近有什么值得考虑的公司,有一定参考价值。

查询附近的工作

Github地址: https://github.com/jixiaod/NearbyJobs

下载 mongo 数据包

https://github.com/jixiaod/NearbyJobs/blob/master/jobs.tar.gz

导入 mongo 数据

~# tar zxf jobs.tar.gz
~# mongoimport -d jobs -c company --upsert jobs.json

geo 查询

// 进入mongodb,我的是默认环境
~# mongo
> use jobs
// 创建索引
> db.company.createIndex({ "loc": "2d" })
// 查询附近的工作,自己的坐标可以从[高德开放平台API]获得。
> db.company.find({"loc":{"$near":[116.673886,39.943799]}},{"short_name":1, "address":1})

扫雷 - 微信小程序

发表于 2017-01-19   |   分类于 Javascript

微信小程序这几天很火,9号正式发布,今天19号过了10天,到现在略有降温的趋势。个大厂商对微信小程序的态度很不看好,最激进的要数[罗辑思维],直接下架了自己的[得到APP]。滴滴、京东等APP也只保留了最精简的功能,某些担心过于完善的功能会抢夺APP本身的用户。不过这也印证了小程序的初衷,小而精、用完即走。(并不否认腾讯微信平台确实流氓的事实)

PS:墨迹天气也开发了微信小程序版本,并且在1月9号第一时间发布,欢迎使用。

作为技术人员,怎能不亲手试试小程序开发呢?扫雷 Minesweeper

实现思路:

  • 如果不了解扫雷的游戏规则,请自行 Google
  • 绘制一张 10*10 的地图,并且标注地雷和非地雷,并且需要用数字表示每个点周围地雷的数量
  • 用 mineMap[x][y] 表示一个点位
    • mineMap[x][y] < 0 (代码中 == -1) 初始状态
    • 0 < mineMap[x][y] < 9 该点周围地雷的数量
    • mineMap[x][y] == 9 表示该点是地雷
    • mineMap[x][y] > 9 (代码中 == 10)表示该点插旗

Github

  • https://github.com/jixiaod/wechat-app-minesweeper

如何跑起来?

  • 下载 & 安装 微信小程序开发工具
  • 配置 wechat-app-minesweeper 代码目录到开发工具即可

玩法

  • 需要注意的是,由于没有鼠标右键标记Flag,简单做了 Flag 切换,开启后,方可标记Flag
  • 最初的想法是通过 tap 和 longtap 来区分扫雷和Flag,但是开发工具不能区分这俩个事件,只能作罢

[读书笔记]- 《大清相国》

发表于 2016-12-27   |   分类于 读书笔记

很多事情不像表面上那么简单,尤其是在官场,要考虑点更多。发生的时间、涉及的官员、所涉及到官员之间的关系、地位、各自的立场。

皇上:要顾全皇族的利益,凡事涉及皇族,一定是要偏袒皇族,照顾其颜面。朝中大臣以和为贵,可以接受做官贪赃枉法,但是对上对皇上要有敬畏之心,对下对百姓不能做太过分出格。

陈廷敬:心怀天下百姓,一心要肃清官场腐败。

鳌拜/明珠/索额图:一人之下,万人之上。任人唯亲,独揽大权。

高士其:墙头草,唯利是图。

等等……

书中围绕陈廷敬一生为官,发生的诸多故事展开。故事的来龙去脉都大同小异,朝廷出了什么事(比如大户统筹案、宝泉局毁钱鬻铜案等),然后派陈廷敬微服私访查明真相,结果又查出来了个大贪官,然后最终如何处置这点事儿。

事故虽然不算太精彩,但更精彩的部分是揣摩为官的道理。如何看准官场的风向,想要参人,也要看这个人是参得参不得。皇上用的人参不得,皇上宠信的大臣参不得,皇上宠信的大臣的人也要看情况是不是可以参。总之要先摸清皇上的意思,最简单的情况,皇上示意可以参,你参就一点毛病没有。

身为人臣,最忌讳功高盖主。虽然在书的最后章节里,皇上对陈廷敬的评价是“宽大老成,几近完人!”,但是请注意也只是“几近”哦,因为完人只有皇帝他老人家而已。此时陈廷敬也已是七旬老人,事君也已有四十八年,可又能怎样呢?得到皇上嘉许时不也还要赶忙连连扣头谢恩。所以你陈廷敬如果是完人,那皇上又是什么呢?

陈廷敬一心要肃清官场,整天参来参去。弄的皇帝很不开心,但是陈廷敬为官清廉,又没有确着的罪证。皇上只好让张英随便编个理由参他,导致陈廷敬第一次被贬。连明珠后来都跟萨穆哈都说:“你以为陈廷敬真的有罪?他根本就没罪!”。

后来,陈廷敬自己也有所悟:“我让皇上知道天下没几个好官了,我就完了;我让天下人知道大清没几个清官了,天下就完了。”

皇上也得哄着。如果让皇上觉得你认为他是傻逼,你就完了!!!你只能比皇上更傻逼……

最终,陈廷敬用“等”、“忍”、“稳”、“恨”四字诀,扳倒了明珠和索额图,坐上了大清相国的位置。等待时机,逆境要忍,做事要稳,下手要狠。

好吧,挺难的,突然想到冯小刚给广告词:“做人做事,安全第一……”。

123…22
小弟

小弟

纪录工作和生活

170 日志
13 分类
119 标签
RSS
微博 Code 豆瓣
© 2008 - 2017 『百作坊』 Generated by Hexo & Theme by Next & Public by Github Pages.