选了付费问答类题目,在体验分答的过程中,发现分答的模式,提问者的答案被偷听是需要1元,提问者可以分成0.5元。想到几个问题:
1. 有哪些问题是可以赚到钱的。
2. 哪些人是在分答上赚到钱的。
3. 哪些人才是分答上最受欢迎的。
4. 能否从分答的数据上分析用户是否活跃,有没有前景。
显然,这些数据是无法直接在网上直接找到的。要想得到答案,需要爬取分答的数据。
之前没有搞过类似爬取,想尝试爬取的乐趣
通常的数据爬取都用python,也有很多成熟的爬取方案。但是,我想尝试一下Go。一来温习一下Go相关知识。二来学习Go上其他没有接触过的东西
需要分析出哪些数据是从哪些链接请求来的,返回数据的格式。
1. 获取账户信息
http://apis-fd.zaih.com/v1/accounts/587503258
返回的结果是json格式
{"answers_count": 209, "avatar": "http://wx.qlogo.cn/mmopen/RZrGLEga7AiawE5sTQk0kItX6c9JR5dLkkKv1ZTosFv3Llc7upHc26pH8Ls75NYuDsr68pZzbic2UiaZqqgiaLEDVUngOpg0YgtI/0", "followers_count": 16220, "gravity": -1, "id": 587503258, "income": 12777950, "introduction": "u4f17u591au660eu661fu827au4ebau7684u79c1u4ebau60c5u611fu4e13u5bb6uff0cu54a8u8be2u673au6784u82b1u9547u8463u4e8bu957fu3001u767eu4e07u7545u9500u4e66u4f5cu5bb6u2026u672cu5e73u5
为了防止进程异常退出后服务停止,简单的做法,在crontab里定时检测(真有这么做的),若是进程不在就拉起。常见的问题有:检测进程是“存在”的,于是放弃拉起。或者进程是“不存在”的,于是不断地拉起。
很多情况下,程序需要限定有限(单个)进程运行,这个时候需要防止重复运行。
粗暴的做法,是通过ps命令然后grep等工具找到对应的进程名字是否进行判断。
这种方法的问题是,进程的名字并不是识别进程的标识。就好像,人的名字并不是真正地识别人一样(身份证号码)。无法保证其他程序名字和你写的不一样。
那么,能否在自己启动的时候判断是否还有一个另外的自己(进程)
假设能,那么判断期间内将有两个自己,因此跟命题要求不符(只能存在一个进程)
简单地讲,
不通过外界,你是无法确认是否自己是否还活着的。只能感觉自己将要死,但无法判断是否真的死了。
通过外界判断,需要遵守同样的规则。首先先看
对于程序来讲,不通过外界,也无法判断自己是否还活着,常见的方法是通过pidfile。
在ubuntu上,由/sbin/start-stop-daemon来负责管理pidfile
如/etc/init.d/ntp
start-stop-daemon --start --quiet --oknodo --pidfile $PIDFILE --startas $DAEMON -- -p $PIDFILE $NTPD_OPTS
其中,PIDFILE的值
PIDFILE=/var/run/ntpd.pid
文件内容是存放自己pid值,启动的时候,
如果存在pidfile文件,那么读取里面的pid值,并判断pid是否在运行着。
do_pidfile(const char *name)
{
FILE *f;
static pid_t pid = 0;
if (pid)
return pid_check(pid);
f = fopen(name, "r");
if
本文代码涉及所有文件存放在
https://github.com/ochapman/passwd_demo.git
熟悉linux的人应该用过修改用户密码工具passwd,如下所示:
ochapman@ubuntu14:~/code/pam$ passwd
Changing password for ochapman.
(current) UNIX password:
提示了修改谁的密码,并要求输入当前的密码。
一般情况下,读取当前密码,校验当前密码是否正确,再去更新shadow/passwd文件…
linux下,这类工作主要由PAM承包
PAM能抽象到什么程度呢,本文将用一个简单的例子展示PAM的威力。
下面是一个简单的例子,实现了passwd的基本功能
/*
* passwd_demo
* a simple passwd utility for showing PAM usage
* derived from shadow
*/
#include <stdio.h>
#include <errno.h>
#include <sys/types.h>
#include <stdbool.h>
#include <stdlib.h>
#include <security/pam_appl.h>
#include <security/pam_misc.h>
#define SHADOW_PAM_CONVERSATION misc_conv
static struct pam_conv conv = {
SHADOW_PAM_CONVERSATION,
NULL
};
void do_pam_passwd (const char *user, bool silent, bool change_expired)
{
pam_handle_t *pamh = NULL;
int flags = 0, ret;
if (silent)
flags |= PAM_SILENT;
if (change_expired)