<?php

Erlang入门注意事项,第一期

最近在看Erlang的介绍,对于一个入门级的新人而言,erlang还是有不少需要注意的地方。先简单整理一下,自己备忘或是方便新人吧。。这里记录不是很详细,只是记录了一部分我认为需要特别注意的地方。

1. 变量首字母必须是大写
2. 元子(Atoms):元子是在Erlang中的另一个数据类型。元子以小写字母开头,元子只是一个简单的名字,其它什么都不是。他们不
像变量可以带有一个值。也可以用单引号括起来声明一个元子,此时可使用大写字母开头或包含其他字符 (类似枚举)

3. 元组(Tuple) - 元素 (类似对象)
C:\Documents and Settings\zhys9>erl
Eshell V5.7.5  (abort with ^G)
1> A=a.
a
2> B=b.
b
3> C={char, A,B}.
{char,a,b}
4> {char, First, Second} = C.
{char,a,b}
5> First.
a
在复杂结构的元组中提取变量的另一种提取方式:(使用匿名变量)
6> {_,First1,_}=C.
{char,a,b}
11> First1.
a

4. 列表 (类似数组)
5. 字符串 必须使用双引号; erl中并没有字符串类型,取而代之我们可以提供一个由ASCII字符组成的列表。实际上是一个整数列表;用$a获取字母a的ASCII码值;
6. 变量在它的上下文(作用域)中,只能赋值一次
7. 函数format/2(format带有2个参数)带有两个列表。第一个列表几乎总是在“”中列出。这个列表原样输出,除了~w被使用第二个参数中的对相的元素替换了。每个~n都是一个新行。io:format/2函数自身返回一个元子ok,如果一切都按计划正确执行的话。
8. 注释以%开始,直到本行结束。 如 % comments (意味着不能通%来取模了)
9. 外部函数:在一个模块中声明多个外部可访问的函数:-export([fac/1, mult/2]). 另:局部函数无需在此声明
10. 守卫 guard 在《Erlang程序设计》中被称为“断言”
list_max([Head|Rest], Result_so_far) when Head > Result_so_far ->
list_max(Rest, Head);
list_max([Head|Rest], Result_so_far)  ->
list_max(Rest, Result_so_far).
只有很少一部分的内建函数,可以于用守卫,你也无法在守卫中使用你自己定义的函数。

11. 匿名函数:fun
fun可以拥有任意多个参数
1> Fun = fun(A, B) -> A*B end.
#Fun<erl_eval.12.113037538>
2> Fun(2,5).
10
3> Muti=Fun.
#Fun<erl_eval.12.113037538>
4> Muti(3,9).
27

12. 高阶函数:能够返回fun或接受fun作为参数的函数
13. 列表解析:
5> Foo = [{2,2},{3,3},{4,4}].
[{2,2},{3,3},{4,4}]
6> [A*B || {A, B} <- Foo].
[4,9,16]
7> lists:sum([A*B || {A, B} <- Foo]).
29

14. 取余数:6 rem 5 值是1; 取整除数: 7 div 2 值是3;

阅读全文 »

fsockopen VS pfsockopen

前几天cyberty说起pfsockopen,我还不是很了解,大家平时用的最多的应该是fsockopen,事实上我基本没用过pfsockopen
那么这两个函数有什么区别呢?先看一下手册上的介绍:
resource fsockopen ( string target [, int port [, int &errno [, string &errstr [, float timeout]]]] )
resource pfsockopen ( string hostname [, int port [, int &errno [, string &errstr [, float timeout]]]] )
两函数的参数完全一致,从手册上能看出来的区别只是一句话It is the persistent version of fsockopen().
或许此时你想到了mysql_connect 和 mysql_pconnect,经验告诉我们mysql_pconnect并没有预期的效果。那么psocketopen会是什么效果呢?
下面我做了几组测试,每组测试时反复50次连接:

给一些说明: 第一行的1~5代表测试次数的序号,fsockopen 和 pfsockopen在各种情况分别测试了5次;其他数字是执行时间(以秒为单位)。
从测试结果来看pfsockopen在同一次请求中大量反复使用的连接具有复用效果,但是在需要获取内容时表现不佳。
总体来看区别不是很大,或许需要更大量的测试数据来支持这一结论。
下面是测试代码,根据需要改动注释代码:

ini_set("display_errors", "On");
error_reporting(E_ALL);
set_time_limit(600);
$t1 = microtime(true);
[...]

阅读全文 »

通过shell+crontab实现自动分割nginx日志

最近有几个朋友问这个事情,干脆写出来吧。。
nginx自身不能按天分割日志,因此还是自己动手来吧~
本文提供的这个脚本会把当前的log文件打包为当前日期为文件名的tgz包,并保存到指定目录。
首先把下面的脚本copy保存为/root/daily_logs.sh

#! /bin/bash

nginx_app=/home/nginx/sbin/nginx #设置nginx的目录
logs_dir=/data/logs/ #log目录
bak_dir=/data/logs/bak/ #log备份目录

#先把现有的log文件挪到备份目录临时存放
cd $logs_dir
echo "moving logs"
/bin/mv *.log $bak_dir
sleep 3

#重建nginx log
echo "rebuild logs"
echo "$nginx_app -s reopen"
$nginx_app -s reopen

#按天打包log文件
echo "begining of tar"
cd $bak_dir
/bin/tar czf `date +%Y%m%d`.tgz *.log

#删除备份目录的临时文件
echo "rm logs"
rm -f *.log
echo "done"

并添加执行权限:
chmod +x /root/daily_logs.sh
然后增加crontab,这里以每晚0点执行为例:

[root@localhost ~]# crontab -e
0 0 * * * /root/daily-task.sh > /dev/null 2>&1

保存后退出,以后就可以自动分割nginx的日志啦~
收工。。

阅读全文 »

很不错的erlang中文手册,适合新手入手

比较好的一个erlang中文手册,适合新手入手。
如果需要请点击这里下载,感谢译者。
注意:需要安装pdf阅读器,如果你不想安装。
请在线查看:http://www.docin.com/p-47521830.html
如果你打算安装一个阅读器,推荐:Foxit
下面摘抄一下文档目录:
目录
译者 注…………………………………………………..I
其它译者………………………………………………….II
第1部分 入门………………………………………………1
1.1 简介……………………………………………….1
1.1.1 简介……………………………………………1
1.1.2 其它方面 ………………………………………..1
1.2 顺序编程 ……………………………………………1
1.2.1 Erlang Shell …………………………………..1
1.2.2 模块和函数 ………………………………………3
1.2.3 元子(Atoms) …………………………………….6
1.2.4 元组 …………………………………………..7
1.2.5 列表 …………………………………………..8
1.2.6 标准模块及用户手册 ……………………………….11
1.2.7 将输出写到终端上 …………………………………11
1.2.8 一个更大的例子 …………………………………..12
1.2.9 变量的匹配、守卫和作用域 …………………………..14
1.2.10 更多关于列表 …………………………………..16
1.2.11 If和Case……………………………………..21
1.2.12 内建函数(BIFs) …………………………………25
1.2.13 复杂函数……………………………………….27
1.3 并行编程……………………………………………29
1.3.1 进程…………………………………………..29
[...]

阅读全文 »

linux下erlang之OTP编译安装

在安装otp时遇到了一点问题,整体的安装过程比较简单。

wget http://erlang.org/download/otp_src_R13B04.tar.gz
tar xzf otp_src_R13B04.tar.gz
cd otp_src_R13B04
./configure –prefix=/home/erlang

configure之后发现有以下提示信息:
[code lang="code"]
*********************************************************************
********************** APPLICATIONS DISABLED **********************
*********************************************************************
odbc : ODBC library - link check failed
jinterface : No Java compiler found
*********************************************************************
*********************************************************************
********************** APPLICATIONS INFORMATION *******************
*********************************************************************
wx [...]

阅读全文 »

中国式房价的一则笑话

今天偶然看到下面一则笑话,发来分享一下吧。 权当娱乐吧。
以前,有个地主有很多地,找了很多长工干活,地主给长工们盖了一批团结楼住着,一天,地主的谋士对地主说:东家,长工们这几年手上有点钱了,他们住你的房子,每月交租子,不划算,反正他们永远住下去,你干脆把房子卖给他们起个名堂叫做——公房出售!告诉他们房子永远归他们了,可以把他们这几年攒的钱收回来,地主说:不错,那租金怎么办?谋士说:照收不误,起个日本名儿,叫物业费!地主很快实行了,赚了好多钱,长工们那个高兴啊!­
  过了几年,地主的村子发展成城镇了,有钱人越来越多,没地方住,谋士对地主说:东家,长工们这几年手上又有钱了,咱们给他们盖新房子,起个名堂叫做旧城改造,他们把手上的钱给我们,我们拆了房子盖新的,叫他们再买回去,可以多盖一些卖给别人,地主又实行了,这次,有些长工们不高兴了,地主的家丁派上用途了,长工们打掉牙只好往肚子里咽,地主又赚了好多钱。­
  又过了几年,地主的村子发展成大城市了,有钱人更多了,地主的土地更值钱了,谋士对地主说:东家,咱们把这些长工的房子拆了,在这个地方建别墅,拆出来的地盖好房子卖给那些有钱的大款还能赚一笔,地主说:长工们不干怎么办?谋士说:咱给他们钱多点儿,起个名堂叫货币化安置,咱再到咱们的猪圈旁边建房子,起个名堂叫经济适用房,给他们修个马车道让他们到那边买房住,地主说:他们钱不够怎么办?谋士说:从咱家的钱庄借前给他们,一年6分利,咱这钱还能生钱崽,又没风险,地主又实行了,长工们拿到钱,地主的经济适用房到现在才建了一间,长工们只好排队等房子,直到现在,还等着呢……­
  于是,长工们开始闹事了,地主有点慌,忙问谋士怎么办?谋士说:赶紧通知长工们,房子要跌价了,别买了,租房住吧,正好把我们的猪圈租给他们,结果,这么多年后,长工们的钱全没了,还在租房住,直到永远! ­
===
杯具啊。。。

阅读全文 »

解决cacti大量sleep连接占用mysql资源的问题

最近发现msyql的进程数经常保持在20个并发连接,感觉非常奇怪。show processlist 之后才发现原来全都是cacti的连接,而且全部是sleep状态。因此考虑到有可能是连接数据库时使用了持久连接,或mysql_connect 的bool new_link 参数为false了。
接下来就有了查找目标,首先进入到cacti程序的根目录。

[root@localhost htdocs]# cd cacti
[root@localhost cacti]# grep -r mysql_pconnect .
./lib/adodb/drivers/adodb-mysql.inc.php: $this->_connectionID = @mysql_pconnect($argHostname,$argUsername,$argPassword,$this->clientFlags);
./lib/adodb/drivers/adodb-mysql.inc.php: [...]

阅读全文 »

linux下根据/proc/stat计算CPU使用情况算法详解

本文是介绍在Linux/unix下如何根据/proc/stat文件的信息计算得到CPU使用率。大多情况下自己做系统监控时都会用到这个文件
首先找来一段扫盲文字“在linux下,CPU利用率分为用户态,系统态和空闲态,分别表示CPU处于用户态执行的时间,系统内核执行的时间,和空闲系统进程执行的时间。平时所说的CPU利用率是指:CPU执行非系统空闲进程的时间 / CPU总的执行时间。在内核中,有一个全局变量:Jiffies。 Jiffies代表时间。它的单位随硬件平台的不同而不同。系统里定义了一个常数HZ,代表每秒种最小时间间隔的数目。这样jiffies的单位就是1/HZ。Intel平台jiffies的单位是1/100秒,这就是系统所能分辨的最小时间间隔了。每个CPU时间片,Jiffies都要加1。 CPU的利用率就是用执行用户态+系统态的Jiffies除以总的Jifffies来表示。”
下面我们看一下/proc/stat 的内容结构

/bin/cat /proc/stat
cpu 3783155 5336 947214 78774537 115679 6 89497 0
cpu0 871159 806 194940 19851524 8176 0 2221 0
cpu1 918820 1900 203290 19794976 7834 1 1980 0
cpu2 922359 882 213789 19715943 61418 2 14503 0
cpu3 1070815 1747 335193 19412092 38250 1 70791 0
intr 284814153 209329067 3 0 0 4 0 [...]

阅读全文 »

一个简单的由perl实现的端口监控脚本,邮件通知+手机短信通知

先说一下原理,1,根据端口的响应时间来判断是否宕掉;2,如果宕掉了就发一封邮件到指定邮箱(注意:需要用到sendmail, 要安装配置好)
另一个,如果需要手机短信通知。其实不需要搞什么飞信接口了,直接去注册一个139邮箱,免费的邮件到达短信通知,包括邮件内容的! 如果不想用139邮箱,也可以选择qq邮箱的短信通知服务。或其他服务商,任你选择了。

#!/usr/bin/perl -X

use IO::Socket;

##############################
# Constant define (configure)
##############################
# mail config
use constant MAIL_ADDR => ('to'=>'zhys9@139.com', 'from'=>'nginx.org@gmail.com');
# common config
use constant MD5SUM_FILE => '/tmp/__monitor_md5sum_hash';
# apache
use constant WEBSERVER_PORT => 80;
use constant WEBSERVER_HOSTS [...]

阅读全文 »

系统监控配置之cacti+rrdtool+netsnmp

一,安装rrdtool 官网: http://oss.oetiker.ch/rrdtool/

/usr/bin/wget http://oss.oetiker.ch/rrdtool/pub/rrdtool-1.4.2.tar.gz
/bin/tar xzf rrdtool-1.4.2.tar.gz
cd rrdtool-1.4.2
./configure –prefix=/home/rrdtool

提示以下warning信息:
configure: WARNING:
—————————————————————————-
* I found a copy of pkgconfig, but there is no pangocairo.pc file around.
  You may want to set the PKG_CONFIG_PATH variable to point to its
  location.
—————————————————————————-
configure: WARNING:
—————————————————————————-
* I could not find a working copy of pangocairo. Check config.log for hints on why
  this is the case. Maybe [...]

阅读全文 »