阿里云CentOS 6.3安装phpMyAdmin

安装 mysql客户端和服务端
# yum install mysql mysql-server
# service mysqld restart

重新设置密码。默认mysql root用户密码为空,phpMyAdmin不允许密码位空。
# mysql_secure_installation

设置mysql服务默认启动
# chkconfig mysqld on

安装rpmforge YUM源 (默认源里不包含phpMyAdmin)
# yum install http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm

安装默认源里不包含phpMyAdmin
# yum install phpMyAdmin

设置访问权限
# vim /etc/httpd/conf.d/phpMyAdmin.conf
注释掉只允许本地访问限制
#<Directory /usr/share/phpMyAdmin/>
# Order Deny,Allow
# Deny from All
# Allow from 127.0.0.1
# Allow from ::1
#</Directory>

重启httpd服务
# service httpd restart

访问 http://my_ip/phpMyAdmin/
使用刚才设置的mysql密码登陆

树莓派驱动4位数码管显示时间

数码管的显示分为静态和动态两种。静态就是一个GPIO控制一个LED小灯管。
但是随着控制数码管数量的增加,GPIO口就占用太多了,所以多个数码管可以有 共阴 和 共阳 两种共享引脚。这个时候如果采用静态点亮数码管的方式,共享引脚的数码管显示完全一样。所谓动态方式,就是通过GPIO选择引脚,选择要点亮的某个数码管,然后通过共享引脚点亮LED小灯管。然后快速切换点亮其他数码管,由于点亮的切换频率非常快所以感觉上数码管一直亮着。

当然也可以使用辅助芯片,如MAX7129等,只需要用更加简化的方式控制显示数据。
点击查看详细文档

这里我使用树莓派自己编码,动态刷新各个数码管。买的数码管有24位引脚,37个led小灯,这个掩饰只使用了4 × 7 = 28 个led灯。
代码:https://github.com/kongove/toys/blob/master/RaspberryPi/leds-example.py
新版本的Python RPi.GPIO里支持提供了一些事件检测函数,可以简化程序,我还没升级。

#
#     __2_
#    |     |    |  0 ->  011 1111 -> 0x3f
#  1 |     | 3  |  1 ->  010 0001 -> 0x21
#    |__7__|    |  2 ->  111 0110 -> 0x76
#    |     |    |  4 ->  ...
#  6 |     | 4  |        ...
#    |__5__|    |  9 ->  ...      -> 0x5f
pins = [27, 17, 22, 10, 25, 24, 11] #GPIO ports
sels = [14, 15, 18, 23] #GPIO ports to select led, there are four led lights
nums = [0x3f, 0x21, 0x76, 0x5e, 0x4d, 0x5b, 0x7b, 0x0e, 0x7f, 0x5f] #0,1,2,3~9 对应编码

演示视频:(为了效果明显这里显示的是 分钟 和 秒)
http://player.youku.com/player.php/sid/XNzAxOTQxODk2/v.swf

树莓派控制HC-SR04超声波模块测距警报

HC-SR04超声波模块看上去很cool,我开始以为是机器人头部,有两个漂亮的眼睛。

HC-SR04共有四个管脚:

  • VCC 接 5+ 电源
  • GND 接地
  • Trig 接 GPIO端口
  • Echo 接 GPIO端口

测试角度位15度(测试范围位一个圆锥,横切面顶角位30度),工作电流15mA,测试范围位 2cm~45cm。

工作原理:
通过GPIO向 Trig 引脚发送 一个大于 10 us(1微妙=0.001毫秒=0.000001秒)的脉冲,即从低电平跳转到高电平,等待10us后,再跳回低电平。此时模块回自动发出8个40KHZ的声波脉冲,当声波返回被模块接受后,模块又会通过 Echo 管脚向树莓派第二个GPIO口发送一个脉冲,脉冲的持续时间等于声波发送到返回的时间。

我们知道声音的速度为 340M/s,声波来回的时间 x 声速 / 2 就能得出测试距离。

我使用树莓派GPIO接口驱动超声波模块,测量距离,并根据距离用蜂鸣器发出不同频率的警报。(功能有点类似倒车雷达)
代码: https://github.com/kongove/toys/blob/master/RaspberryPi/sound-wave-alert.py
演示
视频:
http://player.youku.com/player.php/sid/XNzAxOTU2OTcy/v.swf

Continue reading “树莓派控制HC-SR04超声波模块测距警报”

树莓派 + 继电器模块 + Python web:实现手机控制电灯开关

目标:使用手机控制电灯开关

实现方案:
通过下图的 “继电器模块” 来切断、闭合220v交流电,使用树莓派的GPIO口向继电器 “IN” 口输入高低电频,控制继电器模块。手机和树莓派的通信使用HTTP请求,在树莓派端起一个简单的web服务程序,通过手机浏览器访问。

改进:
如果不是中央控制,每个继电器连接一个树莓派成本太高,而且不方便整合。更简洁的方案是使用51单片机,或者Ardunio + 蓝牙模块。Ardunio上把蓝牙作为一个串口操作,设置只需一行 “Serial.begin(9600);” 读数据一行 “val=Serial.read();”  (整个程序才20行:https://github.com/hackwjfz/Arduino/blob/master/bluetooth.ino)
手机端可以用 ”蓝牙串口调试助手” 做调试控制,也可以使用Java (Android,使用BluetoothAdapter库,并需要在AndroidManifest.xml中添加BLUETOOTH和BLUETOOTH_ADMIN权限)写一个APP读写串口。

继电器连接图:
IN 接树莓派任意GPIO口,GND接树莓派GND(接地),VCC接树莓派v3v电源。
常开和公用端接交流电200v,这样IN置高电平是开关断开,置低电平时开关闭合。如果用常闭替换常开,结果相反。
开始我接的是5v电源到VCC口,开关总是闭合状态,加了一些电阻能工作了,最后放到3v上就不用电阻了。

IMG_20140421_085402

简单Web服务:
这里没有使用HTTP GET/POST请求,而是对访问路径做了一个解析。访问 http://101.168.0.3/on 或 http://101.168.0.3/off ,树莓派会调用Python RPi库,把GPIO14置 “高” 或者 “低” 电平。
(备注:101.168.0.3为树莓派IP地址,我使用树莓派GPIO14连接继电器IN口,GPIO14编号为8)
(使用Shell、C控制GPIO可参考:http://amosk.info/blog/archives/914,Python相对更简便一些)

#!/usr/bin/python
from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer
import os, commands, socket
import RPi.GPIO as GPIO
class MyHandler(BaseHTTPRequestHandler):
    def do_GET(self):
        self.send_response(200)
        self.send_header('Content-type', 'text/html')
        self.end_headers()
     self.wfile.write("<html><body><br><br>")
     self.wfile.write("<br><br> <br><br><center><h1>")
        if "on" in self.path:
            self.wfile.write("<a href=/off><img src=http://imghost/on.png></a><br>")
            GPIO.setmode(GPIO.BOARD)
            GPIO.setup(8, GPIO.OUT) 
            GPIO.output(8, GPIO.HIGH)
     elif "off" in self.path:
            self.wfile.write("<a href=/on><img src=http://imghost/off.png></a>")
            GPIO.setmode(GPIO.BOARD)
            GPIO.setup(8, GPIO.OUT) 
            GPIO.output(8, GPIO.LOW)
        #os.system("bash set_led.sh 14 %s" % self.path[1:])

try:
    server = HTTPServer(('', 80), MyHandler)
    server.socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
    server.serve_forever()
except KeyboardInterrupt:
    server.socket.close()

演示视频(掩饰代码里,我添加了一个随机播放音乐的按钮,所以能听到音乐):
http://player.youku.com/player.php/sid/XNzAxNjM2MTEy/v.swf

Linux 搜狗拼音输入法 (Ubuntu 14.04发布)

Screenshot from 2014-04-18 11:38:14

>>>>  2014-09-02 update: 可以下载deb文件, 解压后会有一个data.tar.xz, 把这个文件解压到 / 根目录下, 配置系统输入法就可以了.  当前最新版本为: 1.1.0.0037

sudo tar Jxvf data.tar.xz -C /
sudo mv /usr/lib/x86_64-linux-gnu/fcitx/fcitx-sogoucloudpinyin.so /usr/lib64/fcitx/

>>> END

Ubuntu14.04昨天发布[0],搜狗官方同时推出支持 Ubuntu 12.04和14.04 的拼音输入法。Note:软件包中包含不开源的二进制包!
Fedora用户可以从这里[1] 下载 Fedora RPM 包, 搜狗拼音作为fcitx的一个扩展,这里需要预先安装 fctix.

[root@amosk devel]# rpm -qa |grep fcitx
fcitx-4.2.8.4-1.fc20.x86_64
fcitx-libs-4.2.8.4-1.fc20.x86_64
fcitx-gtk3-4.2.8.4-1.fc20.x86_64
fcitx-table-chinese-4.2.8.4-1.fc20.noarch
fcitx-data-4.2.8.4-1.fc20.noarch
fcitx-configtool-0.4.7-2.fc20.x86_64
fcitx-qt4-4.2.8.4-1.fc20.x86_64
fcitx-gtk2-4.2.8.4-1.fc20.x86_64
fcitx-libpinyin-0.3.1-1.fc20.x86_64
fcitx-table-4.2.8.4-1.fc20.x86_64
fcitx-pinyin-4.2.8.4-1.fc20.x86_64

并添加下面内容到 /etc/profile

export  GTK_IM_MODULE=fcitx  
export  QT_IM_MODULE=fcitx  
export  XMODIFIERS="@im=fcitx"

这篇博客就是使用sougou-pinyin输入的。

[0] http://mirrors.neusoft.edu.cn/ubuntu-releases/14.04/ubuntu-14.04-desktop-amd64.iso
[1] http://pan.baidu.com/s/1GKoUJ#dir/path=%2Flinux%2Frpms (已经失效!!请直接解压官方deb安装)

Continue reading “Linux 搜狗拼音输入法 (Ubuntu 14.04发布)”

Arduino vs. Raspberry Pi vs. 51单片机

AT89c51 / STC89c51 单片机: 百科介绍

  • AT89c51必须使用编程器烧写程序,STC89c51则可以使用编程串口烧写
  • 需要了解硬件结构和寄存器设置、指令较多
  • 多数使用繁琐的汇编语言进行编程,效率底
  • 成本在15元左右

Arduino (阿尔杜伊诺)单片机:百科介绍

  • 支持串口、USB烧写程序
  • 单片机一次智能运行烧写进去的一个程序
  • 20 HZ 的 CPU、内存小
  • 自带外设很少,需要添加额外接口板
  • 只需掌握少量指令,使用C语言、官方库就可以开始操作硬件
  • 软硬件都开放,有大量成熟的开源库课复用
  • 比传统单片机有更多的资料(博客、网站、社区)
  • 成本在40元左右

Raspberry Pi:百科介绍

  • 有Linux操作系统、多进程/线程并发,单片机是单进程。同时启动关机过程耗时更多。
  • 更强CPU 700 HZ
  • 支持更多PC外设 (如:HDMI、USB、RJ45、SD读卡器等)
  • 不许要像单片机一样关心太多硬件细节
  • 可以使用Linux标准系统调用,Python、Java等高级语言
  • 可架设Web服务器,通过HTTP请求和手机客户端、浏览器等交互
  • 稳定的以太网,单片机上要的TCP协议栈都是第三方实现,系统负载太大、且不稳定
  • 比传统单片机和Arduino成本高、耗电量大
  • 但单片机支持更多的传感器器件
  • 更高的成本 380元左右

结论:

  • 没有最好的,只有最适合的,在适当的场合发挥各自的优势。
  • 需要更远距离的通信、控制,适合用数梅派上的通用以太网接口
  • 简单的控制终端适合用单片机,成本低且使用蓝牙、无线实现更简单
  • 在不考虑成本情况下,更高级的平台,能够提高开发效率
  • 单片机体积更小,易于电路整合

升级OpenSSL 修复Heartbleed安全bug(CVE-2014-0160)

heartbleed

问题描述:OpenSSL处理TLS和DTLS心跳扩展包时有信息泄漏缺陷。TLS或DTLS客户端或服务器,可以通过发送特殊制造的TLS或DTLS心跳包,来透视连接的客户端或服务器限制访问的可能包含敏感信息的内存。
解决方法:升级 openssl,使用 Heartbleed 探测工具【1】【2】重新扫描系统,确保安全。
  • RHEL7 beta: openssl-1.0.1e-16.el6_5.7
  • RHEL6: openssl-1.0.1e-34.el7
  • Fedora: openssl-1.0.1e-37.fc20.1.x86_64

【1】https://access.redhat.com/site/labsinfo/heartbleed
【2】https://github.com/gavin-romig-koch/heartbleed

From: http://www.openssl.org/news/secadv_20140407.txt
OpenSSL Security Advisory [07 Apr 2014]
========================================

TLS heartbeat read overrun (CVE-2014-0160)
==========================================

A missing bounds check in the handling of the TLS heartbeat extension can be
used to reveal up to 64k of memory to a connected client or server.

Only 1.0.1 and 1.0.2-beta releases of OpenSSL are affected including
1.0.1f and 1.0.2-beta1.

Thanks for Neel Mehta of Google Security for discovering this bug and to
Adam Langley <agl@chromium.org> and Bodo Moeller <bmoeller@acm.org> for
preparing the fix.

Affected users should upgrade to OpenSSL 1.0.1g. Users unable to immediately
upgrade can alternatively recompile OpenSSL with -DOPENSSL_NO_HEARTBEATS.

1.0.2 will be fixed in 1.0.2-beta2.
# rpm -qi openssl --changelog
....
* Mon Apr 07 2014 Dennis Gilmore <dennis@ausil.us> - 1.0.1e-37.1
- pull in upstream patch for CVE-2014-0160
- removed CHANGES file portion from patch for expediency

[amos@amosk tmp]$ python heartbleed-poc.py amosk.info
Scanning amosk.info on port 443
Connecting...
Sending Client Hello...
Waiting for Server Hello...
 ... received message: type = 22, ver = 0302, length = 66
Message Type is 0x02
 ... received message: type = 22, ver = 0302, length = 2555
Message Type is 0x0B
 ... received message: type = 22, ver = 0302, length = 331
Message Type is 0x0C
 ... received message: type = 22, ver = 0302, length = 4
Message Type is 0x0E
Server sent server hello done
Server TLS version was 1.2

Sending heartbeat request...
No heartbeat response received from amosk.info, server likely not vulnerable

使用lsof侦测程序句柄泄漏

Unix/Linux 中一切皆文件,socket、设备、目录等都是用文件来表示,_进程_操作这些对象首先要打开文件,打开时返回一个整数文件句柄,句柄用于唯一标识进程和对象之间的连接关系。

open文件的时候,会调用get_unused_id()来分配一个未被占用的文件描述符。

有一次去SK公司玩,一起分析一个文件句柄泄漏。用 lsof 观察发现/tmp/目录下有大量文件没有被关闭,就删除了,造成句柄泄漏。单个进程句柄使用超过了(ulimit -n, 1024)的限制。 通过ulimit -n 2048扩大文件描述符数量限制并不能从根本解决问题。ulimit 还可以用来设置更多系统资源限制,比如内存core大小、进程数目等。

由于这里的文件都是/tmp/目录下,所以很快想到是python程序当中零时文件创建操作引起的。grep后发现有三处使用了python temfile模块使用了零时文件,通过修改零时文件前缀可以定位具体出错位置。

调试发现文件被open了两次,只有close一次。tempfile.mkstemp(prefix=”tmp1_”) 会返回一个文件句柄和临时文件路径,这个临时文件_已经被分配文件句柄_了!!

[amos@amosk devel]$ python
Python 2.7.5 (default, Feb 19 2014, 13:47:28) 
[GCC 4.8.2 20131212 (Red Hat 4.8.2-7)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import tempfile
>>> tempfile.mkstemp()
(3, '/tmp/tmptcK5Fn')

[amos@amosk devel]$ lsof /tmp/tmptcK5Fn
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF  NODE NAME
python  5759 amos    3u   REG   0,32        0 74511 /tmp/tmptcK5Fn
# 占用了文件句柄 3

>>> f = open('/tmp/tmptcK5Fn', 'w')

[amos@amosk devel]$ lsof /tmp/tmptcK5Fn
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF  NODE NAME
python  5759 amos    3u   REG   0,32        0 74511 /tmp/tmptcK5Fn
python  5759 amos    4w   REG   0,32        0 74511 /tmp/tmptcK5Fn
# 两个文件句柄被占用 3,4
>>> f.close()

[amos@amosk devel]$ lsof /tmp/tmptcK5Fn
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF  NODE NAME
python  5759 amos    3u   REG   0,32        0 74511 /tmp/tmptcK5Fn
# close后文件句柄 3 还被占用

>>> os.remove('/tmp/tmptcK5Fn')

[amos@amosk devel]$ lsof -p $pid |grep tmpmEt_pM
python  12459 amos    3u   REG               0,32         0  182528 /tmp/tmpmEt_pM (deleted)
# 文件已被删除,但句柄未被释放

* tempfile.mkstemp()
返回一个文件句柄,和文件路径,此时文件句柄已被分配。正确的使用方法是,通过os.fdopen()打开文件。

# 正确使用方法1
fd,path = tempfile.mkstemp()
f = os.fdopen(fd, 'w')
f.close()

# 正确使用方法2
fd,path = tempfile.mkstemp()
....
os.close(fd)

* tempfile.mktemp()
只返回一个唯一的临时文件路径,并不打开文件。只需要正常使用返回的路径打开使用关闭文件就行。

* tempfile.TemporaryFile() 返回一个类文件对象,用于临时数据保存(实际上对应磁盘上的一个临时文件)。当文件对象被close或者被del的时候,临时文件将从磁盘上删除。

tempfile.TemporaryFile([mode='w+b'[, bufsize=-1[, suffix=''[, prefix='tmp'[, dir=None]]]]])

>>> f = tempfile.TemporaryFile()
# 用 lsof 查看,这个临时文件是被删除状态 /tmp/tmpchVMut (deleted)

>>> f.write("hellon")
>>> f.seek(0) # 移动指针读取文件
>>> f.read()
'hellon'
>>> f.close() # 句柄被释放

使用 nethogs 查看进程占用带宽

netstat –statistics 可以查看非常详细的统计信息,但是不包含进程信息,只包含没有计算的原始数据。

nethogs 是一款简洁的终端网络监控软件,可以输出进程PID,用户名,程序名或IP端口信息,收发速率,非常直观。 可以使用 -d 参数调整刷新的频率。Web服务器套用了nginx, ruby, c 系统调用等,所以PID信息没有抓取到,可以看到下面80/8080端口的行没有PID。

使用iptables规则限制下载amosk.info服务器文件速率,每秒10个包
# iptables -A INPUT -d amosk.info -m limit --limit 1/s -j ACCEPT

更多iptables使用:http://www.cnblogs.com/JemBai/archive/2009/03/19/1416364.html

# nethogs -h
usage: nethogs [-V] [-b] [-d seconds] [-t] [-p] [device [device [device ...]]]
		-V : prints version.
		-d : delay for update refresh rate in seconds. default is 1.
		-t : tracemode.
		-b : bughunt mode - implies tracemode.
		-p : sniff in promiscious mode (not recommended).
		device : device(s) to monitor. default is eth0

When nethogs is running, press:
 q: quit
 m: switch between total and kb/s mode

# nethogs -d 5 eth1
NetHogs version 0.8.0

  PID USER PROGRAM                                 DEV    SENT  RECEIVED       
24784 root ruby                                    eth1   0.949  12.052 KB/sec
25966 root sshd: root@pts/4                        eth1   5.996   1.775 KB/sec
?     root 12.12.123.212:8080-113.74.211.34:64983        31.991   1.676 KB/sec
?     root 12.12.123.212:80-27.150.134.139:57327         39.763   1.468 KB/sec
?     root 12.12.123.212:8080-113.74.211.34:64984        26.885   1.243 KB/sec
?     root 12.12.123.212:8080-27.150.134.139:57328        1.937   0.219 KB/sec
?     root 12.12.123.212:8080-114.102.76.57:35705         0.180   0.167 KB/sec
7808  root sshd: root@pts/2                        eth1   0.089   0.141 KB/sec
737   newr /usr/sbin/nrsysmond                     eth1   0.496   0.114 KB/sec
19887 root sshd: root@pts/5                        eth1   0.143   0.064 KB/sec
22187 root sshd: root@pts/0                        eth1   0.488   0.013 KB/sec
?     root 12.12.123.212:8080-114.102.76.57:35704         0.000   0.000 KB/sec
?     root 12.12.123.212:8080-113.74.211.34:64982         0.000   0.000 KB/sec
?     root 12.12.123.212:8080-114.102.76.57:35703         0.000   0.000 KB/sec
1310  root /usr/local/aegis/aegis_client/aegis_00  eth1   0.000   0.000 KB/sec
?     root 12.12.123.212:8080-27.36.218.38:34520          0.000   0.000 KB/sec
?     root 12.12.123.212:8080-113.74.211.34:64981         0.000   0.000 KB/sec
?     root 12.12.123.212:8080-113.74.211.34:64980         0.000   0.000 KB/sec
?     root 12.12.123.212:8080-113.74.211.34:64979         0.000   0.000 KB/sec
?     root 12.12.123.212:8080-113.74.211.34:64978         0.000   0.000 KB/sec
?     root 12.12.123.212:80-114.102.76.57:35702           0.000   0.000 KB/sec
?     root 12.12.123.212:80-27.156.33.66:55921            0.000   0.000 KB/sec
24982 root sshd: root@pts/1                        eth1   0.013   0.000 KB/sec
?     root unknown TCP                                    0.000   0.000 KB/sec

  TOTAL                                                 108.928  18.932 KB/sec

Continue reading “使用 nethogs 查看进程占用带宽”

workrave 预防重复使力伤害

workrave是一款预防 RSI (Repetitive strain injury:重复使力伤害) 的软件,此类软件对于经常使用电脑的人非常管用。

简单说这款软件能根据键盘鼠标等输入,记录使用计算机时间,打开软件有一个很小的窗口,上面有三个时间进度条。提前休息、滞后休息都会影响下一次休息提醒的时间和长短,比较智能。

软件会有不同种类的提醒,如手脚活动提醒、饮水提醒等,还配套有特种保健操演示,可以跟着一起做。提醒的方式有弹窗、声音等。也可以设置强制休息,这时候键盘鼠标输入无效,直到休息时间结束。

总之对于经常忘我工作、忘记休息,脖子疼、手腕疼、背部疼、眼睛疼的人非常有用。

workrave是自由软件,支持GNU/Linux和Windows。

http://www.workrave.org/
http://nchc.dl.sourceforge.net/project/workrave/workrave/1.10/workrave-win32-v1.10-installer.exe

Screenshot from 2014-04-02 09:29:33Screenshot from 2014-04-02 09:29:23