在一台64位的Widnows2008上,安装了Erlang之后,运行erl,测试几条erlang语句,一切正常。但是在试图启动一个使用了SSL类库的应用程序时,出现了如下的提示:
Unable to load crypto library. Failed with error:
“load_failed, Failed to load NIF library c:/PROGRA~2/ERL58~1.2/lib/crypto-2.0.2/
priv/lib/crypto: ‘Unspecified error’”
OpenSSL might not be installed on this system.
“(pubSageService@Apptest2)1> i
=ERROR REPORT==== 21-Oct-2011::09:47:29 ===
The on_load function for module crypto returned {error,
{load_failed,
“Failed to load NIF library c:
/PROGRA~2/ERL58~1.2/lib/crypto-2.0.2/priv/lib/crypto: ‘Unspecified error’”}}
n(pubSageService@Apptest2)1> it terminating in do_boot”,{undef,[{crypto,start,[]
},{init,start_it,1},{init,start_em,1}]}}
Crash dump was written to: erl_crash.dump
init terminating in do_boot ()
该机器已经安装了64位的OpenSSL类库(下载http://www.slproweb.com/products/Win32OpenSSL.html)
Google之后找到了一篇Google Groups上面的讨论文章
http://groups.google.com/group/erlang-programming/browse_thread/thread/288684b61116baf3
首先怀疑Win32的 OpenSSL类库安装的有问题,于是重新安装了一遍,之前安装的忘记最后一步是否选择了将OpenSSL的类库拷贝打到系统目录下(Windows\System32\),重新安装的时候确认拷贝,但是启动仍然失败。
接下来又把那几个dll拷贝到Erlang的安装目录(就是上面的提示的那个目录):
c:/PROGRA~2/ERL58~1.2/lib/crypto-2.0.2/priv/lib/crypto
这个是缩写的目录,实际是:
C:\Program Files (x86)\erl5.8.2\lib\crypto-2.0.2\priv\lib
这次换了个错误提示:
Unable to load crypto library. Failed with error:
“load_failed, Failed to load NIF library c:/PROGRA~2/ERL58~1.2/lib/crypto-2.0.2/
priv/lib/crypto: ‘Unspecified error’”
OpenSSL might not be installed on this system.
“(pubSageService@Apptest2)1> i
=ERROR REPORT==== 21-Oct-2011::09:47:29 ===
The on_load function for module crypto returned {error,
{load_failed,
“Failed to load NIF library c:
/PROGRA~2/ERL58~1.2/lib/crypto-2.0.2/priv/lib/crypto: ‘Unspecified error’”}}
n(pubSageService@Apptest2)1> it terminating in do_boot”,{undef,[{crypto,start,[]
},{init,start_it,1},{init,start_em,1}]}}
Crash dump was written to: erl_crash.dump
init terminating in do_boot ()
又仔细看了一遍帖子,怀疑是64的OpenSSL和64位的Windows 2008不兼容,于是重新安装了一个32位的,一切正常~
LuManager是一个优秀的国产Linux服务器管理软件,集成了Apache,Nigix,MySQL,FTP,Bind,Memcache,PHP5等软件包,可以实现Apache与Nigix的一键切换,多服务器负载均衡,域名智能解析,用户管理,流量监测功能等。可以通过Web界面来管理整个服务器,还能一键安装DedeCMS,Discuz!等Web应用程序。
LuManager在安装和使用过程中可能碰到导入Mysql失败的情况。
一般有2种情况:
情况1 安装MySQL时出错
Mysql 安装成功,继续安装LuNamp1.0
Mysql was successfully installed! Continue…
已耗时:30 分钟
Runtime: 30 分钟
ERROR 2002 (HY000): Can’t connect to local MySQL server through socket ‘/tmp/mysql.sock’ (2)
MySQL数据导入不成功,可能是数据库没启动,或者是MySQL没安装成功,请重装一次试试!
Mysql data was not imported!
LuNamp安装失败
LuNamp was install failed
分析:
原来系统安装了一个MySQL,在系统原有MySQL没有停止服务的时候开始安装了LuManager,有可能是原有MySQL服务产生了影响。
解决:
杀死系统中正在运行的MySQL
方法1
如果你知道原有的MySQL服务器root用户密码,那么通过这个命令就能停止(忘记密码的看方法2):
mysqladmin -uroot -p’password’ shutdown
注意:
1. /etc/init.d/mysql stop 并不是正确的停止mysql服务的方法!
2. 如果你试图通过 /usr/local/LuNamp/cmd 目录下的 mysql-stop 来停止服务,那么你可能会碰到如下提示:
protest1:/usr/local/LuNamp/cmd# ./mysql-stop
1
MySQL manager or server PID file could not be found! failed!
可以通过方法2来解决
方法2
首先确保当前是root用户,运行如下命令:
protest1:/usr/local/LuNamp/cmd# ps -Af | grep mysqld
返回结果如下(注意加粗的那一行,那个PID就是MySQL的进程ID):
root 6928 1 0 Jun21 ? 00:00:00 /bin/sh /usr/bin/mysqld_safe
mysql 17427 6928 0 14:56 ? 00:00:00 /usr/sbin/mysqld –basedir=/usr –datadir=/var/lib/mysql –user=mysql –pid-file=/var/run/mysqld/mysqld.pid –skip-external-locking –port=3306 –socket=/var/run/mysqld/mysqld.sock
root 17428 6928 0 14:56 ? 00:00:00 logger -p daemon.err -t mysqld_safe -i -t mysqld
root 17460 17340 0 14:58 pts/2 00:00:00 grep mysqld
接着运行
protest1:/usr/local/LuNamp/cmd#Kill 17427
杀死了MySQL进程后,重新运行./zijidelu_install.sh就可以了
情况2 进入系统时出错,提示:
Can’t connect to local MySQL server through socket ‘/tmp/mysql.sock’(2)
截图:
解决方法:
首先参考情况1的方法1或者方法2来杀死当前正在运行的MySQL服务,然后以root用户身份进入
/usr/local/LuNamp/cmd
运行当前目录的mysql-start
protest1:/usr/local/LuNamp/cmd#./mysql-start
然后刷新LuManager的Web界面应该就能顺利进入了:-)
这纯属一个使用技巧,找了很多Linux的Windows客户端,貌似都不能在同一个用户界面上跨机器拷贝传输文件,用来用去还是WinSCP顺手,以前跨机器传输的时候都是开多个窗口,拖放。今天偶然发现WinSCP也可以在同一个用户界面上跨机器拷贝传输文件。
首先要确保WinSCP的工具栏“会话按钮”是显示状态,方便在多台Linux之间切换界面
点击“会话按钮”工具栏的倒数第二个按钮,可以登录更多的Linux机器(注意:要拷贝的文件的目标机器必须先在这里登录)

在某一台需要拷贝的文件上单击鼠标右键,选择“远程复制”
在新弹出的窗口中“目标会话”就可以选择其他的Linux机器以及对应的目录了。
缺点就是不能同时拷贝到多台机器,以及文件拷贝实际上是先拷贝到本地,再拷贝到远程
之前碰到过一次,但是当时是和ssl的问题一起解决的,所以再一次的疏忽了,Erlang安装的时候一定要确认所有需要的库都正确安装了。
错误情况是在erl环境中运行 odbc:start(). 的时候
抛出如下的异常:
** exception error: undefined function odbc:start/0
该异常的解决办法和《Erlang {“no such file or directory”,”crypto.app”} 的解决方法》类似首先确认linux下安装了如下的包:
apt-get install unixodbc unixodbc-dev
接着重新安装erlang解决。
因为几次都碰到安装后某些类库无法使用的问题,总结了一下:
apt-get install gcc g++ build-essential m4 libncurses5-dev libssl-dev flex unixodbc-dev fop libwxbase2.8-dev libwxgtk2.8-dev libgl1-mesa-dev libglu1-mesa-dev libglut3-dev libncurses5-dev libc6 unixodbc gcj openssl xsltproc
还有一个
apt-get install sun-java6-jdk
如果这个包不能正确安装,说明更新源可能有问题,用编辑器打开/etc/apt/sources.list增加一个
deb http://http.us.debian.org/debian/ lenny main contrib non-free
然后保存关闭再次运行 apt-get update然后再安装,应该就没问题了。
库安装完成后在源码目录下
./configure –prefix=/usr/
make
make install
安装完成后输入erl就能使用最新的Erlang运行环境了
如果是直接apt-get install erlang的,就不用看这个了,我这个是erlang源码编译安装的说明。另外如果有错或者缺少某些类库,还请指出,谢谢。
碰到IP地址与Int转换的问题,得到了一个csv格式的ip列表,但是ip地址却是int格式。因为使用的时候主要是在数据库里使用,所以写个程序转换一把有些麻烦,后来想到mysql里面有自定义函数,于是尝试了一把,顺利解决:-)
DELIMITER $$
USE `iptest`$$
DROP FUNCTION IF EXISTS `int2ip`$$
CREATE DEFINER=`root`@`%` FUNCTION `int2ip`(num BIGINT) RETURNS VARCHAR(255) CHARSET utf8BEGIN DECLARE result VARCHAR(255); SET result = CONCAT( CAST((num DIV 16777216% 256) AS SIGNED), ‘.’, CAST(num DIV 65536 % 256 AS SIGNED ), ‘.’, CAST(num DIV 256%256 AS SIGNED ), ‘.’, CAST(num%256 AS SIGNED ));RETURN result; END$$
DELIMITER ;
使用的时候:
Select int2ip(`ip`) from table;
附int整型和ip转换的公式,摘自:
http://www.liveq.net/?p=129
IP Address = 202.186.13.4
w = 202, x = 186, y = 13 and z = 4
INT IP Number = 16777216*202 + 65536*186 + 256*13 + 4
= 3388997632 + 12189696 + 3328 + 4
= 3401190660
INT 转 IP:
w = int ( IP Number / 16777216 ) % 256
x = int ( IP Number / 65536 ) % 256
y = int ( IP Number / 256 ) % 256
z = int ( IP Number ) % 256
一台新安装的Debian Linux 6.0, 安装了Erlang R14B02. 直接运行erl,输入一些测试,没有问题。但是部署一个Erlang的应用程序之后,启动出错,主要提示为:
{"no such file or directory","crypto.app"}
这个Erlang的应用程序用到了openssl相关的类库,检查了一遍系统的类库,发现 openssl-dev这个库没有安装,apt-get安装后继续出错,搜索发现erlang-ssl这个库没有,apt-get安装后还是无效。
最后发现一个成功解决的案例:
http://permalink.gmane.org/gmane.comp.networking.rabbitmq.general/5650
随后将Erlang卸载,重新编译安装(加这个参数 '–with-ssl=PATH')后一切正常。
后记:Erlang在编译的时候如果系统缺少一些类库,比如odbc,ssl等,会给出一些警告信息,但是并不会阻塞后面的安装,安装成功后一般会认为安装成功了(基本的测试也能通过),但是实际上一些erlang的类库并没有成功编译安装,这种情况下重新编译安装即可。
拿福能在2010年才进入中国,在今天(5月23日)将要举办一次“千人挑战活动”,其目的是千名博主目标的实现起到激励作用,在放入广告代码并写一篇小小的拿福能及其活动介绍,便可平分这个活动的50000元费用,点此查看活动详情。 这仅仅是个开始,当然,我也参加了。在未来的日子里,拿福能还要在中国举办各种线上、线下活动,如果你想免费看电影、认识更多博主、获得小礼品就尽快来参加吧。 不要紧张,只需简单5步,即可在活动中大展拳脚! 1、 注册。
2、 博客绑定拿福能。
3、 在博客中插入拿福能广告代码。
4、写一篇简短博文,介绍拿福能,并在文中添加本活动页面链接:http://www.nuffnang.com.cn/blog/2011/05/23/challenge-1000
参考:http://www.erlang.org/doc/reference_manual/expressions.html
Erlang的比较运算符
| op | Description |
| == | 等于 |
| /= | 不等于 |
| =< | 小于等于 |
| < | 小于 |
| >= | 大于等于 |
| > | 大于 |
| =:= | 精确的等于 |
| =/= | 精确的不等于 |
如果要比较两个数,如果两个数之间是不同的类型,比如float和int那么,==操作会首先把两个数字转换成相同的相同类型。举例:
1> 1==1.0.
true
2> 1=:=1.0.
false
所以一般推荐用精确等于去比较
比较运算符的大小级别:
number < atom < reference < fun < port < pid < tuple < list < bit string
3> 1 > a.
false
| op | Description | Argument type |
| + | number | |
| - | number | |
| + | number | |
| - | number | |
| * | number | |
| / | 浮点数除法,结果是浮点数 | number |
| bnot | 一元not运算符 | integer |
| div | 整数除法,结果是整数 | integer |
| rem | 求玉树 | integer |
| band | and运算 | integer |
| bor | or运算 | integer |
| bxor | xor异或运算 | integer |
| bsl | 左移位操作 | integer |
| bsr | 右移位操作 | integer |
逻辑运算符
| op | Description |
| not | 一元逻辑not |
| and | 逻辑and |
| or | 逻辑or |
| xor | 逻辑xor |
此外,逻辑运算符还包括一个orelse 和andalso
原始的or和and是不带”短路运算”操作的,而orelse和andalso是带短路运算操作的。
短路运算举例
Express1 and Express2
Express1 andalso Express2
如果Express1 为假,and会继续判断Express2,然后整体判定为假,而andalso”短路”操作,直接判定整个表达式为假,从效率上来说,andalso会高一些





最新评论