我们用Redis来统计实时在线的人数,首先获得当前时间(Unix timestamps)除以60,可以基于这个值创建一个key, 然后添加用户到这个集合中. 当超过你设定的最大的超时时间,则将这个集合设为过期;而当需要查询当前在线用户的时候,则将最后N分钟的集合交集在一起即可。

由于redis连接对象是线程安全的,所以可以直接使用一个全局变量来表示。

import time
from redis import Redis
from datetime import datetime
ONLINE_LAST_MINUTES = 5
redis = Redis()
 
def mark_online(user_id):
    now = int(time.time()) 
    expires = now + (app.config['ONLINE_LAST_MINUTES'] * 60) + 10 #timestamp
    all_users_key = 'online-users/%d' % (now // 60)
    user_key = 'user-activity/%s' % user_id                
    p = redis.pipeline()
    p.sadd(all_users_key, user_id)  
    p.set(user_key, now)
    p.expireat(all_users_key, expires) 
    p.expireat(user_key, expires)
    p.execute()
 
def get_user_last_activity(user_id): 
    last_active = redis.get('user-activity/%s' % user_id)
    if last_active is None:
        return None
    return datetime.utcfromtimestamp(int(last_active))
 
def get_online_users(): 
    current = int(time.time()) // 60        
    minutes = xrange(app.config['ONLINE_LAST_MINUTES'])
    return redis.sunion(['online-users/%d' % (current - x)  
                         for x in minutes])

最近在用curl调一堆接口,但是在shell下面显示的又是一堆,很不优雅。出于一个Python程序猿的职业素养,考虑使用处理下curl返回的字符串。

#!usr/bin/python
# -*- coding: UTF-8 -*-

import os, sys, json
  
length = len(sys.argv)  
  
print "=================================="  
if length > 1:  
    try:  
        jsonstr = sys.argv[1]  
        jsonObj = json.loads(jsonstr)  
        formatJsonStr = json.dumps(jsonObj,indent=4,ensure_ascii=False,sort_keys=True)  
  
        print formatJsonStr  
    except Exception, e:  
        print "json parse error."  
else :  
    print "argv's length is 1, no json text input."  
print "=================================="

BTW,Python有自己的request,不用死磕curl=. =

crontab命令可以定时执行操作,最小周期是每分钟执行一次。现在有个问题,如果设定了定时任务,但有可能在term内任务并没有执行完成,这时系统会再执行任务。导致两个相同的任务在执行。这里使用flock文件锁解决crontab冲突问题。

flock文件锁

< ~ > crontab -l
* * * * * flock -xn /tmp/cron/mytest.lock -c 'python /tmp/cron/test.py >> /tmp/cron/test.log'

代码锁

<?php  

$lockfile = '/tmp/mytest.lock';  
  
if(file_exists($lockfile)){  
    exit();  
}else{  
    file_put_contents($lockfile, 1, true);  
}  
  
for($i=0; $i<300; $i++){  
    echo date('Y-m-d H:i:s')."\r\n";  
    sleep(1);  
}  
  
unlink($lockfile);  
?>  

Mac上没有flock,只有shlock

如果有个女孩子给你发:2002 TQ97,那么她就是在跟你表白,这第 201314 颗小行星的名字。

Andromeda and Meteor

Andromeda and Meteor

在漂亮的仙女座大星系背景前那道神秘的绿光是什么?一颗流动星尘。

当摄影师 Hemmerich 在拍摄仙女座时,突然一颗来自外太空的沙粒大小岩粒,在那刹那间掠过了镜头,只用了远不到 1 秒钟的时间就通过了这片 10 度视野。

当进入地球大气层之后,剧烈的减速使这颗流动星尘发生了数次耀发,颗粒汽化后产生泛绿的辉光气体,可能是源自上面的镍。

文章via于一个小众,安静,展示未知之美的线上杂志「MorningRocks

0x00 Readme.md

最近在看米特尼克的《反欺骗的艺术》,所以对欺骗的艺术特别感兴趣。上周在我师傅保平哥和我师父的师傅宇神的帮助下,成功搞定了etcd集群的SSL客户认证,后来在总结中发现里面用easy-rsa的部分和我之前搞过的4G流量“免流”还是有好多的相似点,今天就来分享一下我的经历,有这方面的大神希望也可以一起来探讨。

0x01 为什么会有免流漏洞?

以联通举例,大家都知道,联通手机号访问“联通营业厅”,或者参加一些免流量活动是免流量费的,那么运营商是如何区分用户使用的是免流量业务还是正常访问互联网的呢,这里就要说到我们平常所说的免流IP了,当计费系统检测到用户访问的是白名单中的网址时就不会进行扣费。 问题就出现在这里,当用户通过蜂窝网络访问互联网时,会向服务器发送一条请求头,其中包含有:url、UA、网络协议、host、cookie、来源地址和文件类型等多种信息。

如果我们通过某种方法欺骗运营商,让运营商认为我们所有的流量都是访问“联通营业厅”产生的,那么联通就会免掉这部分的流量。具体方法和配置请往下看:)

Continue reading

0x00 About Disaster Recovery

etcd的备份可以写个定时脚本执行。

备份方式用etcdctl backup命令将数据存到指定位置,然后用Rsync同步到其他两个机房。

这部分数据可以用来灾难恢复,只有数据而没有集群状态。


0x01 Specific Steps of Disaster Recovery

在使用etcd集群的过程中,有时会出现少量主机故障,这时我们需要对集群进行维护。然而,在现实情况下,还可能遇到由于严重的设备或网络的故障,导致超过半数的节点无法正常工作。

在etcd集群无法提供正常的服务,我们需要用到一些备份和数据恢复的手段。etcd背后的raft,保证了集群的数据的一致性与稳定性。所以我们对etcd的恢复,更多的是恢复etcd的节点服务,并还原用户数据。

首先,从剩余的正常节点中选择一个正常的成员节点, 使用 etcdctl backup 命令备份etcd数据。

$ ./etcdctl backup --data-dir /var/lib/etcd -backup-dir /tmp/etcd_backup
$ tar -zcxf backup.etcd.tar.gz /tmp/etcd_backup

这个命令会将节点中的用户数据全部写入到指定的备份目录中,但是节点ID,集群ID等信息将会丢失, 并在恢复到目的节点时被重新。这样主要是防止原先的节点意外重新加入新的节点集群而导致数据混乱。

Continue reading

Dioxide Measuring Instrument

Elko NV is in the extreme right hand side

你一定过的一切都好

我不需要故意将回忆导向滥情

我们只是很简单地最后没有在一起

像大多数人一样

–Aaron Nieh, Inappropriate

step 1. 安装python2.7,并将python添加到系统环境变量中

step 2. 安装uncompyle2

https://github.com/wibiti/uncompyle2

解压安装之后,测试是否安装成功:

> python setup.py installpython
> C:\Python27\Scripts\uncompyle2 -h

step 3. 反编译pyc文件

> python C:\Python27\Scripts\uncompyle2 C:\vpn.pyc > vpn.py

It Works!

etcd 是一个高可用的分布式 k/v存储系统,使用etcd的场景默认处理的数据都是控制数据,对于应用数据,只推荐数据量很小,但是更新访问频繁的情况。etcd官方给出的定义是

A highly-available key value store for shared configuration and service discovery.

1. etcd概述

etcd作为一个受到ZooKeeper与doozer启发而催生的项目,除了拥有与之类似的功能外,更专注于以下四点:

  • 简单:基于HTTP+JSON的API让你用curl就可以轻松使用。
  • 安全:可选SSL客户认证机制。
  • 快速:每个实例每秒支持一千次写操作。
  • 可信:使用Raft算法充分实现了分布式。

1.1集群大小与容错

etcd 推荐使用 奇数 作为集群节点个数。因为奇数个节点与和其配对的偶数个节点相比(比如 3节点和4节点对比),容错能力相同,却可以少一个节点。

 
集群大小 最大容错
1 0
2 1
4 1
5 2
6 2
7 3
8 3
9 4

Continue reading