12月 15

raspberry pi GPIO 控制步进电机

  其它部分的工具(python-setuptools,python-dev)已经在初始化时安装。现在安装GPIO
sudo easy_install RPi.GPIO

  需要在root权限下调用。如果不想使用管理权限,也可以用第三方的WiringPi,使用easy_install直接安装。
  接上步进电机和驱动板。
image
板子是V2.0的,内存512M的,使用GPIO图如下:
Raspberry-Pi-GPIO-Layout-Revision-2

#!/bin/env python
# -*- coding:utf-8 -*-
# Revision:
# Date:        2012-12-11
# Author:      simonzhang
# Email:       simon-zzm@163.com
# Web:         www.simonzhang.net
# ------------------------------- 
import time
import RPi.GPIO as GPIO

#要使用的四个针脚
Pins = [17,18,22,23]

#初始化。使用BCM2835标准。具体对应要查说明
#http://elinux.org/RPi_BCM2835_GPIOs
GPIO.setmode(GPIO.BCM)
for pin in Pins:
    try:
        GPIO.setup(pin, GPIO.OUT)
        GPIO.output(pin, False)
    except:
        pass

# 顺时针旋转矩阵
Seq1 = []
Seq1 = range(0, 4)
Seq1[0] = [1,0,0,0]
Seq1[1] = [0,1,0,0]
Seq1[2] = [0,0,1,0]
Seq1[3] = [0,0,0,1]

# 逆时针旋转矩阵
Seq2 = []
Seq2 = range(0, 4)
Seq2[0] = [0,0,0,1]
Seq2[1] = [0,0,1,0]
Seq2[2] = [0,1,0,0]
Seq2[3] = [1,0,0,0]

#初始化步数
setup_count = 0
while 1:
  for set in range(0, 4):
      # 小于100步按照逆时针转,100步到200步之间按顺时针转
      print "setup %s" % setup_count
      if 100 < setup_count < 200:
          l = Seq1[set]
      else:
          l = Seq2[set]
      for ls in range(len(Pins)):
          if l[ls] == 1:
              GPIO.output(Pins[ls], True)
          else:
              GPIO.output(Pins[ls], False)
      # 大于200步初始化为0,否则加1
      if setup_count < 200:
          setup_count += 1
      else:
          setup_count = 0
      # 需要做一定延迟,最小延迟应该是0.01s
      time.sleep(0.1)

raspberry pi GPIO 控制步进电机 python 源码

9月 12

golang 批量检查页面

  在学习go语言,所以当前的需求使用go来试验一下。需要:循环检查某些url并返值,并获取所用时间,如果返回内容长度超过100个字节,只显示前100个字节,不足100个字节显示全部。我将url写在url.txt文件中,方便以后增加。
  在centos 5.4下go1.0.2编译通过。虽然编译通过,但是个人感觉还是不如python方便,并且变异出来的东西都快3M了,让我想起了当年的delphi。如果这种监测实验脚本还是首选python。但是用python做有个问题,如果使用“while 1”循环使用urllib2获取,时间一长就失败过多。具体原因没有查,直接用crontab或脚本调用解决。

package main

import ("fmt"
        "os"
        "net/http"
        "io/ioutil"
        "time"
        )

func main() {
        var str string
        userFile := "url.txt"
        fin,err := os.Open(userFile)
        defer fin.Close()
        if err != nil {
                fmt.Println(userFile,err)
                return
        }
        buf := make([]byte, 1)
        //
        for{
            n,_:= fin.Read(buf)
            if 0==n {break}
            if string(buf)=="\n"{
               //开始通过url获得页面
               starttime:=time.Now().Unix()
               res, err := http.Get(str)
               endtime:=time.Now().Unix()
               usetime:=endtime-starttime
               if err != nil {
                   fmt.Println(err)
               } 
               context, err := ioutil.ReadAll(res.Body)
               if err != nil {
                   fmt.Println(err)
               }
               res.Body.Close()
               // 获得完毕打印
               if len(context) >100{
                     fmt.Println(string(context)[:100])
               } else {
                     fmt.Println(string(context))
               }
               fmt.Println("get url:", str, " use time :", usetime)
               str=""
            } else {
                str+=string(buf)
              }
        }
}
6月 09

python 统计一段字符串中某字符串出现次数

统计一段字符串中某字符串出现次数。如查询“It takes only a minute to get a crush on someone,an hour to like someone,and a day to love someone- but it takes a lifetime to forget someone”中出现“takes”出现的次数。

str = ‘It takes only a minute to get a crush on someone,an hour to like someone,and a day to love someone- but it takes a lifetime to forget someone’
get_count = count_find_str(str, 'takes')
print get_count

函数如下

def count_find_str(str,find_str):
    _str = str
    _find_str = find_str
    _pos = _str.find(_find_str)
    _find_str_count = 0
    while _pos != -1:
        _find_str_count = _find_str_count + 1
        _pos = _pos + len(_find_str)
        _pos = _str.find(_find_str, _pos)
    return _find_str_count

注意:在单词过短的情况下会出现错误,如统计“a”,除了“a”本身作为单词出现,在单词中的“a”字母也会被统计。所以,建议统计字符串短写的长单词。我是为了统计数据库连接数所写的这个,实际测试还是很好用。

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()
10月 04

python 链接 redis 测试

[2011-9-11 张子萌]
[2012-5-27 张子萌 修改]
  安装支持的模块,简单的方法是使用easy_install
# easy_install redis

  也可以下载安装包手动安装。做个简单的写入测试,使用有664039行的密码表,将密码放到redis中。代码如下:

#!/usr/bin/env python
import redis
def main():
    r = redis.Redis(host='192.168.1.200', port=6379, db=0)
    w_pass=open('big_pass.txt','r').readlines()
    next_line=0
    count_lines=len(w_pass)
    while next_line+1 < count_lines:
        r.set(str(next_line),w_pass[next_line])
        next_line=next_line+1
    print 'Game over!'
if __name__=='__main__':
    main()

测试服务器为一个Xeon(TM)双核 3.20GHz 的 cpu,内存4G。
a)写入
用两台机器做测试。两台机器均在一个千兆局域网内。实验很简单所以只记录了cpu的负载和脚本运行时间。
# time python test_redis1.py
Game over!
real 4m16.878s
user 0m55.910s
sys 0m16.879s

cpu部分
远端机缓存 load average: 1.46, 1.26, 1.34

Redis服务器 load average: 0.52, 0.30, 0.22

单台服务器本地测试:
# time python python_redis.py
Game over!
real 1m32.065s
user 1m2.643s
sys 0m17.890s

cpu部分
load average: 1.32, 0.57, 0.32

b)存环从reids中读取所有数据,测试结果如下:
两台服务器:
# time python test_redis1.py
Game over!

real 4m32.776s
user 1m3.687s
sys 0m17.675s

Redis服务器Cpu部分
load average: 0.90, 0.96, 0.69
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
27525 root 15 0 117m 110m 712 S 7.3 2.8 2:55.36 redis-server

单台服务器本地测试:
# time python python_redis.py
Game over!

real 1m44.790s
user 1m9.294s
sys 0m19.031s

Cpu部分
load average: 1.36, 0.92, 0.63

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
3255 root 18 0 153m 47m 2640 R 87.1 1.2 0:29.43 python
27525 root 15 0 117m 110m 712 S 33.1 2.8 2:29.26 redis-server

Redis的其它操作并未测试,但是从当前测试看,单进程每秒读写差不多再7000-8000,cpu使用维持在百分之三十多,确实效率不错。
注为了测试方便,我的redis服务没有加密码。如需加访问密码或有其它需参数,参考如下:
host='localhost'
port=6379
db=0
password=None
socket_timeout=None
connection_pool=None
charset='utf-8'
errors='strict'
unix_socket_path=None