2月 04

raspberry pi 开机wifi自动启动并发邮件通知(二)

比之前脚本添加了,测试公网IP的函数。
def get_global_ip():
get_html = urllib2.urlopen(‘http://iframe.ip138.com/ic.asp’).read()
_re_ip = re.compile(r’\d{2,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}’, re.DOTALL)
_global_ip = _re_ip.findall(get_html)[0]
return _global_ip

代码下载NotificationIP.py

1月 08

python 连接hbase存、取图片

  连接hbase1.0.4需要使用Thrift,我用的是python2.6。
  安装thrift。下载地址https://dist.apache.org/repos/dist/release/thrift/0.9.0/thrift-0.9.0.tar.gz解压后安装命令。
在hbase服务器上,确保hbase服务已经启动。在thrift目录中,用管理员运行一下命令安装。
./configure
make
make install

  安装完毕生成hbase的client代码命令格式如下,
thrift –gen
登陆到hbase的权限进入
$ cd hbase/src/main/resources/org/apache/hadoop/hbase/thrift

生成python的
$ thrift –gen py Hbase.thrift
再生成一个C的学习备用,与本文无关
$ thrift –gen c_glib Hbase.thrift

将gen-py文件夹下的hbase文件夹拷贝到要连接hbase的服务器的python目录下,我用的是python2.6,自己手动安装的。命令如下
cp -R hbase /usr/local/lib/python2.6/site-packages/

拷贝完毕用import导入 hbase成功。开始写代码了。参考hbase里的例子在hbase/src/examples/中。

  我的任务就是把某个目录下,以jpg结尾的图片放到hbase里,因为图片名没有重复,所以用图片名做row name。hbase手动建表’hbase(main):013:0> create ‘img’, ‘data:”。

  首先统计一下照片的数量。这个image目录下只有jpg的图片,使用匹配只是备将来使用。下面只是测试脚本,不关心业务逻辑。

# find /image/ -name \*.jpg -type f |wc -l
13140

# du -s -h /image
303M /image/

  本地共有13140张照片共303M,写入hbase测试脚本如下:

#!/bin/bash 
# -------------------------------
# Revision:
# Date:        2012-12-11 
# Author:      simonzhang 
# Email:       simon-zzm@163.com 
# Web:         www.simonzhang.net 
# -------------------------------

import os
import re

from thrift.transport import TSocket  
from thrift.transport import TTransport  
from thrift.protocol import TBinaryProtocol  
   
from hbase import Hbase  
from hbase.ttypes import *

#### base set
find_path=(r'/image/',
           )

class HbaseWrite():
    def __init__(self):
        self.tableName = 'img'
        self.transport = TSocket.TSocket('192.168.100.100', 9090)
        self.transport = TTransport.TBufferedTransport(self.transport)
        self.transport.open()
        self.protocol = TBinaryProtocol.TBinaryProtocol(self.transport)
        self.client = Hbase.Client(self.protocol)

    def createTable(self, tableName):
        col1 = ColumnDescriptor(name="data:",maxVersions=1)
        self.client.createTable(tableName,[col1])

    def write(self, PicPath, PicName):
        row = PicName.split('.')[0]
        _data = PicName.split('.')[1]
        PicData = open('%s/%s' % (PicPath, PicName), 'rb').read()
        # 此处需要注意格式,网上的格式报错,少个参数报错如下
        # TypeError: mutateRow() takes exactly 5 arguments (4 given)
        self.client.mutateRow(self.tableName, row, [Mutation(column="data:%s" % _data, value=PicData)], {})

    def read(self, tableName, PicName):
        row = PicName.split('.')[0]
        data_type = PicName.split('.')[1]
        get_data = self.client.get(tableName, row, 'data:%s' % data_type, {})[0]
        if get_data:
            return get_data.value
        else:
            return "Error"


def main(_path):
    WHB = HbaseWrite()
    WHB.createTable()
    find_file=re.compile(r"^[0-9a-z]*.jpg$")
    find_walk=os.walk(_path)
    for path,dirs,files in find_walk:
        for f in files:
            if find_file.search(f):
                path_name=path
                file_name=f
                WHB.write(path_name, file_name)


if __name__ == "__main__":
    for get_path in find_path:
        main(get_path)

开始测试脚本
# time python hbase_test.py

real 1m15.471s
user 0m4.881s
sys 0m2.867s

到hbase里查看写入的数量,证明已经完全写入。
hbase(main):001:0> count ‘img’
:
:
:
13140 row(s) in 10.2780 seconds

2013-5-16. 因为对hadoop理解不足。以下写的有问题,提醒大家注意。

hbase使用hadoop进行存储,查看hadoop的磁盘使用量。
26K namenode1/
298M u01/

  我的内存给namenode可以使用25G。根据以上数据计算结果如下:
((25*1000*1000)/26)*298= 286538461M = 286538G = 286 T

  如果每台服务器有三块1T存储硬盘,此集群可以有95台服务器。共存储此类照片大约为12634615360张。内网测试,写入速度3.9M。

  注:有一点需要注意,写入的数据删除后磁盘空间也不会释放,原理应该改和mongodb一样,但是没有仔细查看。

11月 13

python 通过邮件服务器发送 邮件

很早写的,本来觉得意义不大,还是放上来,以备丢了。python2.6下发送通过。

#!/bin/env python
# -*- coding:utf-8 -*-
# -------------------------------------------------------------------------------
# Filename:    sendmail.py
# Revision:    1.0
# Date:        2012-7-18
# Author:      simonzhang
# Email:       simon-zzm@163.com
# Web:         www.simonzhang.net
# -------------------------------------------------------------------------------
import smtplib
from email.mime.text import MIMEText

#
mail_host = 'smtp.exmail.qq.com'
mail_user = 'XXXXXXXX'
mail_pwd = 'XXXXXXXXX'

def mail_send(content, mailto, get_sub):
    msg = MIMEText(content.encode('utf8'), _subtype='html',  _charset='utf8')
    msg['From'] = mail_user
    msg['Subject'] = u'%s' % get_sub
    msg['To'] = mailto
    try:
        s = smtplib.SMTP()
        s.connect(mail_host)
        s.login(mail_user,mail_pwd)
        s.sendmail(mail_user,[mailto],msg.as_string())
        s.close()
    except Exception ,e:
        print e
6月 25

如果我做双色球报表系统性能会如何

  双色球有人中了5.7亿,各种怀疑的声音也此起彼伏。有人说停售到开奖直播中间有一段时间是在算出现概率。我对是否在算并不感兴趣,我倒是想知道,如果在算要用什么样子的服务器

,会有多大压力。实际值2012072期销售349310588元,共174655294注。我用一台很老的dell 2850 来试验,双核3.2主频的单cpu,4G内存,ide接口硬盘。 Centos 5.4 64位系统,mysql5。

  写个脚本产生随机数来模拟彩票投注。根据投注号产生MD5码,取MD5的前两位作为分表依据。
  需要速度,所以开始用C来作,因学艺不精,C写的东西速度很慢,并且也没有找到原因,我将c的代码放在最后,如有朋友能帮忙解决烦请告知。最后还是用python来做。通过初步试验,

产生100万数据并入库需要3分多钟,如果产生1.8亿需要12个多小时。最后决定只产生一张表的数据,一张表数据100万。取MD5前两位,如果每张表都是100万,总共能产生2.56亿注,这个值

可以满足测试要求。

  产生表的SQL如下:

CREATE TABLE `dt_00` ( \
             `Id` int(11) NOT NULL AUTO_INCREMENT, \
             `CreateUnixTime` varchar(13) NOT NULL, \
             `RedBlue` varchar(21) DEFAULT NULL, \
             `HashValues` varchar(32) DEFAULT NULL, \
             `SaleId` int(11) DEFAULT NULL, \
             PRIMARY KEY (`Id`), \
             KEY `i_RedBlue` (`RedBlue`), \
             KEY `i_HashValues` (`HashValues`) \
             ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

  产生投注的脚本如下,因为开始考虑到要放到256张表里,所以就没有做成批量入库,而是做成生成SQL语句,5000条提交一次。:

#!/bin/env python
# ----------------------------------------
# Filename:    rand.py
# Revision:    1.0
# Date:        2012-06-24
# Web:        http://www.simonzhang.net
# Author:      simonzhang
# Email:       simon-zzm@163.com
# ----------------------------------------
import random
import time
import MySQLdb
import hashlib


def mysql_run(sql):
    try:
        db = MySQLdb.connect(host = '192.168.1.41', user = 'double', passwd = 'ball', db = 'doubleball')
        cursor = db.cursor()
    except MySQLdb.Error, e:
        print "Error %d:%s" % (e.args[0], e.args[1])
        exit(1)
    try:
        result_set = ''
        cursor.execute('%s' % sql)
        result_set = cursor.fetchall()
        cursor.close()
        db.close()
        return  result_set
    except MySQLdb.Error, e:
        print "Error %d:%s" % (e.args[0], e.args[1])
        cursor.close()
        db.close()


def create_sql():
    z = 0
    _tmp_di = []
    while (z < 6):
        red = random.randint(1, 33)
        count_rand_di = 0
        if len(_tmp_di) > 0:
            for i in _tmp_di:
                if red == i:
                    count_rand_di += 1
        if count_rand_di == 0:
            _tmp_di.append(red)
            z += 1
    _tmp_di.sort()
    blue = random.randint(1, 16)
    _result_di = ''
    for j in xrange(6):
        if j == 1:
            _result_di = "%s" % _tmp_di[j]
        else:
            _result_di += " %s" % _tmp_di[j]
    _get_md5 = hashlib.md5("%s+%s" % (_result_di, blue)).hexdigest()
    if _get_md5[0:2] == "00":
       _create_sql = "INSERT INTO  dt_00(CreateUnixTime,RedBlue,HashValues) VALUES (\'%s\',\'%s+%s\',\'%s\');" % (int(time.time()), _result_di, blue, _get_md5)
    else:
       _create_sql = ""
    return _create_sql


def write_time():
    _open_file = open("history.txt", "ab")
    get_time = time.localtime()
    _open_file.write("%s-%s-%s %s:%s:%s\n" % (get_time[0], get_time[1], get_time[2], get_time[3], get_time[4], get_time[5]))
    _open_file.close()


def main():
    _get_sql = ''
    for i in xrange(1000000):
        _loop_status = 0
        while _loop_status == 0:
            _tmp_sql = create_sql()
            if len(_tmp_sql) >2:
                _loop_status = 1
        _get_sql += _tmp_sql
        if i % 5000  == 0:
            print i
            mysql_run("%scommit;" % _get_sql)
            _get_sql = ''


if __name__ == "__main__":
    write_time()
    main()
    write_time()

  运行完毕使用sql分组统计,查看分组和排序结果SQL如下,运行一次用时6.693秒。

SELECT
	count(*) AS c,
	RedBlue,
	HashValues
FROM
	dt_00 d
GROUP BY
	d.HashValues
ORDER BY
	c DESC

  结论:因为要保证速度和稳定,所以购买系统应该是各省有各省的一套系统,然后准实时向中心汇数据,所以汇总需要的时间基本可以忽略。统计是按照分表的方式进行计算,然后在合

并结果,从计算效率来看,如果使用Dell R420高配的服务器,即使只有一台,系统也可以在3-5分钟产生出所有的分析报表(这个是估算,因为不知道需要多少统计表,也不知道需要统计的

逻辑)。如果是用oracle数据库应该会更安全快速。

  我写失败的C代码:

#include 
#include 
#include 

/*快速排序*/
void quickSort(int a[],int left,int right)
{
  int i,j,temp;
  i=left;
  j=right;
  temp=a[left];
  if (left>right)
    return;
  while(i!=j)
  {
    while(a[j]>=temp && j>i)
      j--;
    if(j>i)
      a[i++]=a[j];
    while (a[i]<=temp && j>i)
      i++;
    if(j>i)
      a[j--]=a[i];
  }
  a[i]=temp;
  quickSort(a,left,i-1);
  quickSort(a,i+1,right);
}

void main()
{
   int i,z;
   int red,blue;
   int count_rand_di;
   int di[6];
   char result_di[30]="";
   z=0;
   while(z<6)
   {
      srand(time(0)); 
      red=1+(int)(33.0*rand()/(RAND_MAX+1.0));
      count_rand_di=0;
      for(i=0;i

  编译命令:
gcc rand.c -o rand -Wall

参考资料:

http://baike.baidu.com/view/19016.htm

4月 08

python的聪明组合

  一直在买双色就是没有中过,看过高人指点,根据“聪明组合”写了这个脚本。在技术上没有任何难度,都是体力活。为了大家方便。
  运行脚本输入12个红球数,组合成10组。然后在自己加上篮球即可。

#!/bin/env python
# -*- coding:utf-8 -*-
# -------------------------------------------
# Filename:    clever12.py
# Revision:    1.0
# Date:        2012-3-13
# Author:      simonzhang
# WEB:         www.simonzhang.net
# Email:       simon-zzm@163.com
# -------------------------------------------

def run_group(di):
    fen = di.split(' ')
    A = fen[0]
    B = fen[1]
    C = fen[2]
    D = fen[3]
    E = fen[4]
    F = fen[5]
    G = fen[6]
    H = fen[7]
    I = fen[8]
    J = fen[9]
    K = fen[10]
    L = fen[11]
    print("%s %s %s %s %s %s"%(A,B,D,E,K,L))
    print("%s %s %s %s %s %s"%(A,B,E,F,H,I))
    print("%s %s %s %s %s %s"%(A,B,E,G,I,K))
    print("%s %s %s %s %s %s"%(A,B,E,I,J,L))
    print("%s %s %s %s %s %s"%(A,C,D,E,F,L))
    print("%s %s %s %s %s %s"%(A,C,D,G,H,J))
    print("%s %s %s %s %s %s"%(A,C,D,I,K,L))
    print("%s %s %s %s %s %s"%(A,C,F,G,H,L))
    print("%s %s %s %s %s %s"%(A,C,F,H,J,K))
    print("%s %s %s %s %s %s"%(A,D,F,G,J,L))

def main():
    get_list = raw_input("12 number :")
    if len(get_list) == 35:
        run_group(get_list)
    else:
        print "input error"

if __name__ == "__main__":
    main()