Nutch安装配置问题和解决

file

Nutch 1.x

按官方文档NutchTutorial安装Nutch 1.11

下载的.tar.gz解压到/usr/share目录下。

Solr 4.x

nutch 1.x支持solr 4.x(来源),官方教程也是对应solr 4.x的,所以先下载solr 4.10.4来用。

注1:NutchTutorial里有几处对schema.xml文件的修改(EnglishPorterFilterFactory等等),在nutch 1.11里已经改好了,不再需要。

注2:NutchTutorial最后部分bin/nutch solrindex命令的最后一个参数crawl/segments/,经试验应为crawl/segments/*,否则会提示找不到文件错误。

启动solr内置的jetty服务器,命令:

java -jar start.jar

然后在浏览器里访问下面的地址即可管理solr:

http://localhost:8983/solr/

在浏览器里可以使用下面的链接执行查询(即solr API):

http://localhost:8983/solr/collection1/select?q=mykeyword&wt=xml&indent=true

注:如果Solr用5.4版本的,启动命令是(Nutch的文档里example/start.jar是5.2以前的solr启动方式):

bin/solr start -e cloud -noprompt

Nutch2与Solr5的集成方式在官方文档里没有详细描述,solr5的目录结构与solr4不一样(没有collection1),以下文章可参考:文章1

mmseg4j

为支持中文分词,我们使用mmseg4j项目。

从github上的mmseg4j主页下载2.3.0版本,解压后得到两个.jar文件,放在 /usr/share/solr-4.10.4/example/solr-webapp/webapp/WEB-INF/lib/ 目录下,并在schema.xml里加入mmseg4j的field types。

参考1

注意:要特别注意mmseg4j与solr的版本匹配,在mmseg4j的下载包里有说明,针对solr 4.9和4.10要使用mmseg4j的2.2.0版本。如果使用了mmseg4j 2.3.0版,分词时会提示java.lang.RuntimeException: java.lang.AbstractMethodError异常。

Nutch 2.x

首先是官方文档,实在是太简略了点,这篇文章一起参考一下。

按官方文档进行到ant runtime命令时有两个问题:1)需要等比较久且一开始的几分钟内没有进度;2)可能会警告找不到tools.jar文件,只要yum安装java-1.7.0-openjdk-devel即可(注意不要用java 1.6,版本过低会导致编译失败),JAVA_HOME环境变量在/etc/profile里指定,执行source /etc/profile以便不重启生效。

进行到bin/nutch inject urls这一步时可能会报一些找不到类异常或VerifyError错误,一般是由于nutch与hbase里一些jar包版本不一致造成的,解决方法是用hbase里的jar代替nutch里的相应jar包。主要是$hbase_home$/lib目录下的hbase*.jar、hadoop*.jar、htrace*.jar和protobuf*.jar,复制到$nutch_home$/runtime/local/lib目录下,注意先移除旧的jar包。

遇到一个不好解决的问题:ava.lang.IncompatibleClassChangeError: Found interface org.apache.hadoop.mapreduce.TaskAttemptContext, but class was expected。仔细又看了官方文档,与Nutch2配套的hbase建议是hbase-hadoop(没写hadoop1或hadoop2,原来是指hadoop1,虽然hbase的quickstart里说大部分情况用hadoop2:“in most cases, you should choose the file for Hadoop 2”),之前我是按hadoop2下载的,改为hadoop1环境即可。

改为hadoop1后,nutch inject可以正常执行了,但nutch generate时遇到java.lang.NoSuchMethodError: org.apache.hadoop.hbase.HRegionLocation.getServerAddress()异常。问题应该是gora-hbase版本,在ivy.xml里改为0.6.1,重新ant runtime,发现build出来的hbase相关的jar包自动都升级为0.98了(之前ivy.xml里是0.5,对应0.94),而且包文件名都带hadoop2!然后inject时又报java.lang.IncompatibleClassChangeError: Found interface org.apache.hadoop.mapreduce.Counter, but class was expected异常(在hadoop.log里看)。

待参考:http://www.cnblogs.com/mactech/p/4229708.html http://stackoverflow.com/questions/26236112/hadoop-2-5-1-nutch-2-2-1-found-interface-org-apache-hadoop-mapreduce-taskatte

再次查看官方文档,发现其中的nutch2下载链接有变化(也许是我记错了),以前我下载的是nutch 2.3,现在指向的是nutch 2.3.1。下载2.3.1后查看ivy.xml发现gora版本是0.6.1(nutch 2.3时对应gora 0.5),且hadoop对应2.5.2(nutch 2.3时对应hadoop 1.2.0)。重新用nutch 2.3.1按官方文档,配合hbase-0.98.8-hadoop2,所有问题解决。

solr5引入了configset的概念,所以schema.xml文件的位置与solr4有所不同。

nutch-site.xml配置文件说明:见此链接

nutch2.3.1使用crawl命令时提示“No IndexWriters activated - check your configuration”错误,解决方法是在nutch-site.xml里添加plugin.includes属性,详见此链接

nutch2.3.1里solrindex被index取代,指定solr地址改为-D solr.server.url=xxx,例如bin/nutch index -D solr.server.url=http://localhost:8983/solr 1453805148-685784700 -crawlId crawl2

nutch2.3.1的parse步骤提示“http://news.sina.com.cn/ skipped. Content of size 130163 was truncated to 65536”,在nutch-site.xml里设置http.content.limit为-1。(nutch-default.xml里可以看到所有可设置的项)

nutch2.3.1的updatedb步骤耗时过长:查看logs/hadoop.log发现无法连接到hbase在一直重试,不知道什么原因hbase停止了,$HBASE_HOME$/bin/start-hbase后updatedb继续完成。

nutch2.3.1的fetch步骤控制台里显示“... 500 URLs in 2 queues”,实际队列里的url数量超过500但无法显示,原因见这个链接

注意:两个配置文件regex-normalize.xml和regex-urlfilter.xml起作用是有先后的,normalize在前,所以filter时用来匹配的url是经过normalize的。例如http://my.website.com/product/38392/?from=mobile这样一个url,在normalize步骤有可能已经变成了http://my.website.com/product/38392/。这两个配置文件里使用的正则表达式遵守Perl5语法

seed.txt里的url可以用"#"注释

删除solr里已索引的文档:

curl http://localhost:8983/solr/collection1/update --data-binary "<delete><query>\*</query></delete>" -H 'Content-type:text/xml; charset=utf-8'
curl http://localhost:8983/solr/collection1/update --data-binary "<commit/>" -H 'Content-type:text/xml; charset=utf-8'

使用bin/crawl脚本抓取时,发现regex-urlfilter.txt没起作用,原因是bin/crawl脚本里的generate命令加了-noFilter参数,去掉后解决。 

通过solr-index命令导入solr的文档,tstamp字段值都是"1970-01-01T00:00:00Z"。根据nutch用户组里的讨论,tstamp字段应该是抓取网页的时间,不应该为空(1970)。但检查了solrindex-mapping.xml文件,里面tstamp字段的stored参数值已经是true。暂时的解决方案,在nutch-site.xml的plugin.includes里添加index-more插件,这样在solr索引的每个文档里会多出date、contentLength等若干个新字段,其中date字段可用于表示文档的抓取时间。

Nutch常用参数

1、同一服务器两次抓取间隔:nutch-site.xml里fetcher.server.delay

2、只抓取站内链接:nutch-site.xml里db.ignore.external.links

3、从页面里最多解析出多少个链接:nutch-site.xml里db.max.outlinks.per.page 

Hbase

常用命令

由于磁盘空间占满,扩容后hbase无法正常启动。查看$hbase_home$/logs/后发现ERROR master.HMasterCommandLine: Master exiting / java.io.EOFException at ...readInt,看起来像是zookeeper在读取数据文件时报的错误,可能是之前的非正常停止导致数据文件损坏,于是在$hbase_home$/conf/hbase-site.xml配置文件里将hbase.zookeeper.property.dataDir指向另一个新建的目录,再start-hbase恢复正常。

有用链接:HBase集群安装过程中的问题集锦

Nutch集群

在name节点上

首先配置hadoop,主要参考Hadoop: Setting up a Single Node Cluster,按Pseudo-Distributed Operation配置。

1.下载hadoop-2.7.2/hadoop-2.7.2.tar.gz并解压缩到/usr/share/目录下

2.编辑/etc/profile文件,在结尾处添加export $HADOOP_HOME=/usr/share/hadoop-2.7.2和export PATH=$PATH:$HADOOP_HOME/bin这两句,以便nutch脚本可以找到并执行hadoop。

3.编辑$HADOOP_HOME/etc/hadoop/hadoop-env.sh,将JAVA_HOME指到java安装目录(即使在/etc/profile里已经有JAVA_HOME,这一步也不能省略)

4.通过访问http://localhost:50070/可看到dfs信息

5.设置hbase-site.xml让hbase使用hdfs:

<property>
  <name>hbase.cluster.distributed</name>
  <value>true</value>
</property>
<property>
  <name>hbase.rootdir</name>
  <value>hdfs://cluster1:9000/hbase</value>
</property>

如果启动hbase时提示找不到JAVA_HOME,修改hbase-env.sh脚本。

6.修改yarn-site.xml:

<property>
    <name>yarn.resourcemanager.hostname</name>
    <value>cluster1</value>
</property>
<property>
    <name>yarn.nodemanager.aux-services</name>
    <value>mapreduce\_shuffle</value>
</property> 

在data节点上:

1.安装hadoop,步骤和name节点上相同。

2.将name节点的authorized_keys文件scp到data节点,确保name节点可以不用密码ssh到data节点

3.将name节点的几个配置文件复制到data节点相同目录下:

scp /usr/share/hadoop-2.7.2/etc/hadoop/core-site.xml root@cluster2:/usr/share/hadoop-2.7.2/etc/hadoop/core-site.xml
scp /usr/share/hadoop-2.7.2/etc/hadoop/hdfs-site.xml root@cluster2:/usr/share/hadoop-2.7.2/etc/hadoop/hdfs-site.xml
scp /usr/share/hadoop-2.7.2/etc/hadoop/mapred-site.xml root@cluster2:/usr/share/hadoop-2.7.2/etc/hadoop/mapred-site.xml
scp /usr/share/hadoop-2.7.2/etc/hadoop/yarn-site.xml root@cluster2:/usr/share/hadoop-2.7.2/etc/hadoop/yarn-site.xml

4.在name节点的/etc/hosts里添加data节点的ip,例如“10.0.0.2 cluster2”,否则data节点可能会无法连接到name节点(“Datanode denied communication with namenode because hostname cannot be resolved”)

5.在name节点的$HADOOP_HOME/etc/hadoop/slaves里添加data节点的ip地址

6.(如果执行job时提示找不到HBaseConfiguration等异常,说明.job文件里缺少相应的jar包),用下面的方法重新打包:

cd runtime/deploy
unzip -d apache-nutch-2.3.1 apache-nutch-2.3.1.job 
rm  apache-nutch-2.3.1.job 
cd apache-nutch-2.3.1 
rm lib/hbase-\*\*\*.jar 
cp /usr/share/hbase-0.98.8-hadoop2/lib/hbase-common-0.98.8-hadoop2.jar lib/ 
cp /usr/share/hbase-0.98.8-hadoop2/lib/hbase-client-0.98.8-hadoop2.jar lib/
cp /usr/share/hbase-0.98.8-hadoop2/lib/hbase-protocal-0.98.8-hadoop2.jar lib/
zip -r ../apache-nutch-2.3.1.job ./\* 
cd .. 
rm -r apache-nutch-2.3.1

补充:还要修改deploy里nutch-site.xml、hbase-site.xml,并打到.job包里。 

7.在hdfs上创建种子列表目录

hdfs dfs -mkdir /urls
hdfs dfs -put seed.txt /urls

参考:

Nutch and Hadoop Tutorial

Running Nutch in (pseudo) distributed-mode (Nutch1.x)

INSTALL HADOOP+HBASE+NUTCH+ELASTICSEARCH

验证hadoop

hadoop自带了一些示例应用,可以用于验证hadoop集群是否正常,以wordcount为例:

hdfs dfs -mkdir /wordcount
hdfs dfs -mkdir /wordcount/input

#编辑一个本地文件test.txt并输入一些单词或短语,例如hello word,每个占一行
vi test.txt
#输入内容(略)
hdfs dfs put test.txt /wordcount/input

#/wordcount/output目录必须“不存在”,否则会报错
hadoop jar $HADOOP\_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar wordcount /wordcount/input/\* /wordcount/output

#查看hdfs上生成的结果
hdfs dfs -ls /wordcount/output
hdfs dfs -cat /wordcount/output/part-r-00000

另:集群里每台机器的hostname最好与/etc/hosts文件里所用的保持一致。

遇到的问题:

1、org.apache.zookeeper.ClientCnxn: Opening socket connection to server localhost/127.0.0.1:2181. Will not attempt to authenticate using SASL (unknown error)

解决:查看datanode上的$HADOOP_HOME$/etc/hadoop/logs/yarn-root-nodemanager-xxx.log文件,发现org.apache.hadoop.ipc.Client: Retrying connect to server: 0.0.0.0/0.0.0.0:8031的错误信息。参考这个帖子,在datanode的yarn-site.xml里添加了yarn.resourcemanager.hostname属性,0.0.0.0异常消失,但无法连接到2181端口问题依旧。后检查发现master上的hbase-site.xml有两个,其中一个在/usr/share/hbase-xxx目录下,另一个在nutch/runtime/deploy里,前者里没有配置hbase.zookeeper.quorum属性,添加后重启hbase问题解决(另外还添加了一个hbase.master属性值为master:60000)。

Nutch二次开发

网站内容抽取

可采用boilerpipe,一个开源的基于训练的内容抽取库。或采用针对每个网站分别定制的方案,参考链接1

支持js加载

考虑phantomjsselenium

自定义如何Parse所抓取到的网页

使用ParsingFilter和IndexingFilter,参考链接

Solr查询

Solr的查询语法很丰富,通过组合各种参数可以达到多种查询目标,官方文档可通过这个链接下载(pdf格式):Apache Solr Reference Guide

限定在指定日期范围内的文档里搜索:fq=date:[2016-02-15T00:00:00Z TO 2016-02-15T23:59:59Z]

要进行分组统计,使用facet参数,例如统计最近30天内指定关键词出现次数(注意:网上有些资料使用facet.date,这个参数已经在solr 3.1以后deprecated了,用facet.range替换):facet=true&facet.range=date&facet.range.start=NOW/DAY-31DAY&facet.range.end=NOW/DAY&facet.range.gap=%2B1DAY (%2B是URL encode后的加号)

其他爬虫工具

WebCollector

Heritrix3

(本文原始链接:https://www.cnblogs.com/bjzhanghao/p/5104653.html

使用AndroidStudio 1.3.2遇到的一些坑

以下环境为Android Studio 1.3.2,Gradle 2.7(as自带2.4,单独下载的2.7)

编译时提示Multiple dex files define: Lcom/sina/weibo/sdk/BuildConfig异常

新浪微博提供的SDK里所带的weibosdkcore.jar里包含了BuildConfig类,而api工程也会生成同名(包名也相同)类,所以有此编译异常。解决方法是用工具(如7zip)直接删除weibosdkcore.jar里的BuildConfig.class文件。还有其他解决方法,这个链接不错。

无法clean project

有时clean后仍然有文件残留(例如classes.jar),此时需要手工删除项目路径下的build目录(删除时可能会提示classes.jar被占用,多半是as自己在使用,可关闭as再重试)。比较恶心的是,clean时并不会提示你有文件无法删除。

两个project共享一个module

假设自己写了一个android library(名称library1),然后想在Project1和Project2里都使用它,但不把library1复制两份。窍门是在project2的setting.gradle文件里像下面这样引用project1里的资源:

include ':../project1/library1'

参考链接

Configuration with name 'default' not found.

检查settings.gradle文件里,include的module是否存在,通常是include了不存在的module造成的。参考链接

Proguard提示Duplicate Entry错误

多个module依赖多个相同的jar文件时会有这个问题,我当时遇到的是xutils,解决办法是在jcenter上找到了对应的repository,改为不直接使用jar而是使用repository解决。Proguard Troubleshooting

用proguardFile还是proguardFiles?

在build.gradle里指定项目proguard配置文件时,用proguardFiles可以同时指定多个,用proguardFile可指定一个(可多行),经测试效果是一样的。注意:在module settings对话框里可能会显示不出来正确的文件名。还有一个变化:比较新的as版本缺省文件名是proguard-rules.pro,以前是proguard-rules.txt。

被依赖module里BuildConfig.DEBUG的值总为false

例如module A依赖module B和module C,在Eclipse里运行时B和C里BuildConfig.DEBUG的值会是true(导出签名apk后会自动变成false);然而在Android Studio里B和C里的BuildConfig.DEBUG值总是false,A里的正常。这样就导致if(BuildConfig.DEBUG){Log.d(...)}日志无法正常显示。参考链接 参考链接2

WordPress安装使用问题记录

file

本文记录在使用WordPress过程中的问题和解决。

安装

安装过程比较顺利,没有遇到大问题。安装环境是CentOS 6.5(DigitOcean的CentOS7 image里默认的yum源没有mysql-serve比较奇怪),安装步骤如下:

安装apache、mysql和php

 yum install httpd mysql-server mysql php php-mysql

下载wordpress安装包

wget https://wordpress.org/latest.tar.gz

解压缩到apache目录下

tar zxvf latest.tar.gz
mv /root/wp/wordpress /var/www/html

修改document root

修改/etc/httpd/conf/httpd.conf配置文件,添加域名配置:

ServerName www.mydomain.com

并在文件最后增加下面的设置:

<VirtualHost \*:80>
    DocumentRoot /var/www/html/wordpress
    ServerName www.mydomain.com
</VirtualHost>

如果有多个<VirtualHost>,需要在httpd.conf里启用下面这个配置:

NameVirutalHost *:80

启动apache和mysql服务器

service httpd start
service mysqld start

创建mysql用户(在mysql命令行里)

> create database wordpress;
> grant all privileges ON wordpress.* TO 'username'@'localhost' identified by 'mypassword' with grant option;
> flush privileges;

此时可以在浏览器里访问http://www.mydomain.com进入wordpress的安装向导,并按向导完成剩余的设置工作。

问题和解决

1、Wordpress向导提示无法建立"wp-config.php"文件

可手工在wordpress目录下建立此文件。

2、上传图片时提示“Unable to create directory wp-content/uploads/2014/11. Is its parent directory writable by the server?”

上传图片提示Unable to create directory wp-content/uploads/2014/11. Is its parent directory writable by the server?无法建立目录wp-content/uploads/2014/11。有没有上级目录的写权限?

试了网上一些办法没起作用,实际试验下来这样解决:

1) 在wp-content下建立uploads目录,并执行“chown -R nobody:nobody uploads”;

2) 将wp-content和wp-content/uploads的权限全部设置为777(不建议)。

3、上传plugin时提示需要ftp用户名密码

这也是由于权限不正确引起的,解决方法是将wordpress所在目录的所有者设为apache(在有些系统里可能是www):

chown -R apache:apache /var/www/html/wordpress

参考链接

4、加载google字体慢导致blog打开很慢

通过安装插件,用国内镜像字体网址替代google字体网址。参考链接

FreeSwitch安装配置记录

安装FreeSwitch

主要命令如下:

git clone -b v1.2.stable git://git.freeswitch.org/freeswitch.git  
cd freeswitch/  
./bootstrap.sh && ./configure && make && make install && make hd-sounds-install && make hd-moh-install && make samples

最后一个命令大约执行20分钟

缺省安装目录:/usr/local/freeswitch/

FreeSwitch所需的端口列表(需在防火墙设置里打开):http://wiki.freeswitch.org/wiki/Firewall

FreeSwitch默认只支持音频,为支持视频,修改vars.xml如下:

<X-PRE-PROCESS cmd="set" data="global\_codec\_prefs=PCMU,PCMA,GSM,**H264,H263-1998,H263**"/>  
<X-PRE-PROCESS cmd="set" data="outbound\_codec\_prefs=PCMU,PCMA,GSM,**H264,H263-1998,H263**"/>

检验是否安装成功

FreeSwitch安装后缺省用户是1000~1020,密码均为1234。用任意sip客户端(boghe, linphone, x-lite等等)登录,拨9664应该可以听到等待音乐,说明安装成功了。还有一些功能号码,总结如下:

\------------------  
号码 | 说明  
\----------------------  
9664 | 保持音乐  
9196 | echo,回音测试  
9195 | echo,回音测试,延迟5秒  
9197 | milliwatte extension,铃音生成  
9198 | TGML 铃音生成示例  
5000 | 示例IVR  
4000 | 听取语音信箱  
33xx | 电话会议,48K(其中xx可为00-99,下同)  
32xx | 电话会议,32K  
31xx | 电话会议,16K  
30xx | 电话会议,8K  
2000-2002 | 呼叫组  
1000-1019 | 默认分机号

曾遇到过一个问题,接通9664后立刻被自动挂断,接上摄像头后问题消失。

配置电信/联通双线

复制internal.xml为internal2.xml,修改internal2.xml里第一行的name为internal2,再将sip-ip和rtp-ip改为与internal里不同的那个公网ip,重启freeswitch即可。(用sofia status命令应该可以看到新建的internal2生效)

要使用智能域名解析,将vars.xml里的domain改为域名即可。

防掉线

在profile文件里修改nat-options-ping属性为true,大约每30秒FreeSwitch会发一个options包给客户端以保持连接。
http://wiki.freeswitch.org/wiki/Sofia.conf.xml#nat-options-ping

中文语音

中文语音包下载和使用方法:https://groups.google.com/forum/#!topic/freeswitch-cn/gYXmAv7sGKU

参考资料

http://www.dujinfang.com/2010/04/14/freeswitch-chu-bu.html

安装配置opensips过程记录

本文操作系统为CentOS,所用Opensips版本为1.8.2。

Update2013/6/27: 版本1.9.1也已验证通过,下载地址为http://opensips.org/pub/opensips/latest/src/opensips-1.9.1_src.tar.gz

安装CentOS

(若已有环境可跳过此步骤)

1、安装虚拟机,VMWare Server 2.0遇到问题无法显示console(Chrome里),换为Virtualbox 4.2后可正常使用;

2、在虚拟机里安装CentOS 6.3,选择standard server类型安装。

对这种纯命令行界面的虚拟机,可以用telnet直接访问,操作剪贴板什么的比较方便;

若虚拟机映射的网卡没有自动启动,用ifup eth0命令启动。

若(Virtualbox的)虚拟机是复制过来的,可能需要先删除 /etc/udev/rules.d/70-persistent-net.rules,再修改/etc/sysconfig/network-scripts/ifcfg-eth0里的HWAddr地址。

若需要配置网卡ip地址,先ifconfig -a查看网卡设备号和MAC地址,然后编辑/etc/sysconfig/network-scripts/ifcfg-eth0文件,示例如下:

DEVICE="eth0" BOOTPROTO\="none" HWADDR\="08:00:27:81:30:F4" NM\_CONTROLLED\="yes" ONBOOT\="yes" TYPE\="Ethernet" UUID\="dcd43c45-adf4-480b-b461-179ee8d2e8d6" IPADDR\=192.168.1.120 NETMASK\=255.255.255.0 GATEWAY\=192.168.1.1

/etc/resolv.conf里指定dns以便安装软件包(CentOS6以后可以在ifg-eth0里指定dns了)

nameserver 202.181.202.140 nameserver 208.67.220.220

安装Opensips(根据官方的Tutorial视频整理的主要步骤)

opensips提供了一个视频教程(这个页面有下载链接,90M),推荐使用menuconfig方式,更方便且不容易出错。以下为步骤摘要:

yum install gcc make
yum install flex bison ncurses libncurses-dev ncurses-devel
yum install mysql mysql-server mysql-libs mysql-devel

wget http://opensips.org/pub/opensips/1.8.2/src/opensips-1.8.2\_src.tar.gz
tar zxvf opensips-1.8.2\_src.tar.gz
cd opensips-1.8.2-tls

make menuconfig (勾选db\_mysql,其他不用动)
菜单里选"Compile And Install Opensips"
退出menuconfig

vi /usr/etc/opensips/opensipsctlrc,把与mysql有关的注释去掉(DB\_PATH和USERCOL保留注释)
service mysqld start  
opensipsdbctl create(提示的两个问题都选no)
osipsconfig (选择ENABLE\_TCP,USE\_AUTH,USE\_DBACC,USE\_DBUSERLOC,USE\_DIALOG,然后generate residential script)  
用生成的opensips\_residential\_xxx.cfg替换原先的opensips.cfg

vi /usr/etc/opensips/opensips.cfg (改listen地址和mpath,后者一般是/usr/lib/opensips/modules)  
opensipsctl start (netstat -anp查端口)  
service iptables stop (关闭防火墙)

如果启动opensips时提示错误,检查/var/log/messages(若opensips.cfg里设置了log_stderror=no则日志都进入此文件,链接),一般是模块参数未设置引起的。例如在log里发现:

“ERROR:uri:db\_checks\_fixup1: configuration error - no database URL is configured!”

则在opensips.cfg里的loadmodule "uri.so"后添加modparam("uri", "db\_url","mysql://opensips:opensipsrw@localhost/opensips")即可。

创建测试用户:

opensipsctl add 101 101

如果创建用户时提示ERROR: domain unknown: use usernames with domain or set default domain in SIP\_DOMAIN,可修改opensipsctlrc文件将SIP\_DOMAIN设为本机域名或IP地址。

进一步配置Opensips

设置日志输出方式

opensips.cfg里有几个参数控制日志的输出:

debug=3 #此值控制日志输出的详细程度,3为普通,4为详细(会产生很多日志)。  
log\_stderror=no #设置为no表示将日志输出到文件,否则输出到控制台(应该是以前台方式启动opensips服务时才有用)。  
log\_facility=LOG\_LOCAL0 #应该是用于在syslog服务的配置文件里区分opensips产生的日志(见下面“使用独立的log文件”)。  
fork=yes #设置为yes表示在后台启动opensips服务,设置为no表示在前台启动。

使用独立的log文件

opensips使用syslog服务,所以缺省情况下日志会进入/var/log/message这个文件,如果希望使用独立的log文件,可以这样设置:

touch /var/log/opensips.log  
vi /etc/rsyslog.conf  --> 增加一行:local0.\*             /var/log/opensips.log  
/etc/init.d/rsyslog restart

配置STUN模块

opensips自带一个stun模块,可以实现stun服务器的功能(需要双网卡)。配置方法也很简单(官方文档),在opensips.cfg里添加如下内容:

\#### STUN module  
loadmodule "stun.so"  
modparam("stun", "primary\_ip", "11.22.33.44") #opensips服务器的ip地址  
modparam("stun", "primary\_port", "5060") #必须与opensips的udp端口相同(一般是5060)  
modparam("stun", "alternate\_ip", "55.66.77.88") #另一网卡的ip地址  
modparam("stun", "alternate\_port", "3479") #另一端口号

配置好stun以后,可以使用stun-client来测试,以windows下为例,测试命令为:

stun-client-0-96.exe 11.22.33.44:5060 -v

安装配置RTPProxy模块

rtpproxy模块通常与nathelper模块一起使用。首先要确保服务器上已经安装了rtpproxy,启动rtpproxy:

rtpproxy -F

然后在opensips.cfg文件里做如下配置:

loadmodule "rtpproxy.so"  
modparam("rtpproxy", "rtpproxy\_sock", "unix:/var/run/rtpproxy.sock") # CUSTOMIZE ME

安装配置MediaProxy模块

MediaProxy官方文档链接

一个在CentOS6上安装MediaProxy2.5.2的参考链接

下载mediaproxy源码(和所需要的各种依赖包),并安装(过程略)。安装完成后:

config.ini.sample复制到/etc/mediaproxy/config.ini,把tls目录也复制过来。

echo 1 > /proc/sys/net/ipv4/ip\_forward
media-dispatcher restart
media-relay restart

opensips.cfg里配置mediaproxy模块,如下:

\#### MediaProxy module  
loadmodule "mediaproxy.so"  
modparam("mediaproxy", "disable", 0)  
#modparam("mediaproxy", "mediaproxy\_socket", "/var/run/mediaproxy/dispatcher.sock")  
modparam("mediaproxy", "mediaproxy\_timeout", 500)  
modparam("mediaproxy", "signaling\_ip\_avp", "$avp(nat\_ip)")  
modparam("mediaproxy", "media\_relay\_avp", "$avp(media\_relay)")

若mediaproxy提示No suitable relay found,可能是certification方面的问题。 参考链接

(未完)

抓取SIP包

在Opensips所在服务器上使用tcpdump可以抓取SIP包以便分析问题(注意要抓取的网卡是eth0或eth1):

tcpdump -nqt -s 0 -A -i eth0 port 5060 -w /home/capture\_file\_name.pcap

参考:http://jonathanmanning.com/2009/10/26/how-to-voip-sip-capture-with-tcpdump-on-linux/

要抓手机上的包稍微复杂一些,要先root手机,然后把tcpdump复制到手机上使用:

adb shell
su
tcpdump -nqt -s 0 -w /sdcard/packets\_xx.pcap
adb pull /sdcard/packets\_xx.pcap

具体请参考这篇文章

安装opensips-cp

从sourceforge下载opensips-cp源码压缩包后,里面附有名为INSTALL的文档,建议根据这个文档进行安装,网上能查到的一些资料往往是过期的或不准确的。

yum install httpd php php-mysql php-xmlrpc php-pear

pear install MDB2
pear install MDB2#mysql
pear install MDB2#mysqli
pear install log

/etc/php.ini里:
short\_open\_tag置为On
/usr/share/pear加到inculde\_path变量里(一些教程写的是加/usr/share/php,实际检验要加/usr/share/pear)

wget http://sourceforge.net/projects/opensips-cp/files/opensips-cp/5.0/opensips-cp\_5.0.tgz/download
tar -zxvf opensips-cp\_5.0.tgz

将解压缩后的文件夹(名字一般是“5.0”)复制到/var/www目录下,并改名为opensips-cp

vi /etc/httpd/conf/httpd.conf,添加下面一行:
Alias /cp "/var/www/opensips-cp/web"

chown apache:apache /var/www/opensips-cp/config/access.log (如果是其他版本linux,用户名可能是www-data或其他)

(随源码附带的安装文档INSTALL有点看不懂,postgresql应该是与mysql二选一。)

安装必须的admin:

cd /var/www/opensips-cp/config/tools/admin/add\_admin/
mysql -Dopensips -p<ocp\_admin\_privileges.mysql
mysql -uroot opensips进入mysql命令行,执行下面的命令添加管理员用户:
INSERT INTO ocp\_admin\_privileges (username,password,ha1,available\_tools,permissions) values ('admin','admin',md5('admin:admin'),'all','all');

安装cdrviewer:

cd /var/www/opensips-cp/config/tools/system/cdrviewer/
mysql -Dopensips -p < cdrs.mysql
mysql -Dopensips -p<opensips\_cdrs.mysql
cd /var/www/opensips-cp/cron\_job
vi generate-cdrs\_mysql.sh (填写数据库连接信息)

注意,generate-cdrs\_mysql.sh这个文件里的call opensips\_cdrs\_1\_6()可能要改为call opensips\_cdrs(),必须要与opensips\_cdrs.mysql里定义的名称一致。

vi /etc/crontab 添加定时任务,例如每三分钟生成一次:

\*/3 \* \* \* \* root /var/www/opensips-cp/cron\_job/generate-cdrs\_mysql.sh

安装smonitor:
(此处INSTALL文档有笔误,这里已更正)

cd /var/www/opensips-cp/config/tools/system/smonitor/ 
mysql -Dopensips -p < tables.mysql

vi /etc/crontab 添加定时任务,例如每分钟一次:

\* \* \* \* \* root php /var/www/opensips-cp/cron\_job/get\_opensips\_stats.php > /dev/null

安装add_user:

(最前面已经装过了ocp\_admin\_privileges.mysql,这里应该不需要再做一次,INSTALL文档的小问题不少)

启动opensips-cp:

service mysqld start
service httpd start

打开浏览器访问http://xxx.xxx.xxx.xxx/cp/ 应该能看到登录界面,用之前创建的admin用户登录。

其他有用链接

Opensips官方论坛

关于sip和sip的客户端

Best practices for SIP NAT traversal

一些问题和解决

服务器端保持连接:使用 nat_traversal或nathelper模块(根据讨论组里的一些帖子,这两个模块的功能几乎相同),让opensips每个一段时间向客户端发一个包,使得路由器上的端口映射将保持(即洞口一直打开)。在客户端抓包时应该可以看到这些来自服务器的sip包,一般名称为OPTIONS。

客户端接收到INVITE命令后没有RING:很奇怪的问题,但在我这里时不时的发生,客户端程序为Boghe v2.0.153.836,暂时还没有找到原因和解决方法。

路由器修改SIP包:使用Volans VE602W作为路由器,从客户端发出的REGISTER包里的Via字段会被修改为公网地址,导致opensips服务器判断是否来自内网(nat_traversal模块中的nat_client_test方法)失败,其他三个路由器(TPLink、Mercury和Buffalo没有这种情况)。暂时没有找到解决方法。这里有一个类似问题。

客户端接收到重复的OPTIONS消息:由于重复(通过不同路由器)登录到opensips,Opensips有时会发送多个OPTIONS包给客户端,直到服务器认为客户端已经掉线。若客户端在REGISTER消息的Contact字段里添加了expires=xxx时,服务器会在location表里记录客户端失效的时间,若这个时间很长则服务器会一直尝试连接客户端。

有时接通以后没有视频画面:遇到过这样的问题:拨打十次,每次都能接通,但有时没有画面。后来发现是服务器防火墙禁止了一些端口(用iptables --list INPUT查询发现服务器仅允许udp 35000~50000进入)。解决方法是启动rtpproxy时指定端口范围,例如rtpproxy -m 40000 -M 50000 -F。

Contact URI字段没有被改为公网IP:通过增加调试信息发现虽然fix_nated_contact()方法已经被调用,但服务器端发回的sip包里Contact URI里的内网地址并没有被替换为公网地址。在公司没有这个问题,在家有这个问题(更换路由器无效),暂时没找到原因。(更正:这个问题本身有误,应该观察从服务器返回的200OK消息,而不是服务器接收到的原始消息)

单向有声音/视频或仅音频能拨通:可能是SIP包的长度超出了网络设备的MTU值,在UDP协议下,如果客户端不能处理过长的SIP包(一般是带有SDP的那些SIP消息,而且视频请求比音频请求产生的SIP消息要大),多出的部分可能会被丢弃,导致服务器发送/接收的SIP包失效。解决办法有:1)切换到TCP协议;2)精简SIP包尺寸,有些客户端生成的SIP包里带有不必要的字段可以删除掉(如果能够定制开发的话),另外这里有一个参考链接;3)使用支持超长UDP包或SIP包比较小的客户端(我用的基于doubango的boghe这部分做的不太好,换用x-lite后发现同样的请求SIP包长度小很多:18xx vs 10xx)。

清除在线用户:opensipsctl ul rm id可以删除一个在线用户,一个用户段时间内多次登录时会造成重复记录,这时可能需要清除掉这个用户的在线状态。

(本文原文链接:https://www.cnblogs.com/bjzhanghao/archive/2013/02/13/2910903.html)

从google获得大尺寸地图图片文件

现在有很多工具可以从google地图获得大尺寸的地图图片文件,用于离线地图软件。这个地址介绍的方法我认为更加简单,而且同时适用街道地图和卫星地图,摘要如下:

1. 给你的firefox安装screengrab这个插件,这里是安装链接

2. 打开google地图网站,把地图定位到想要的位置(以中心点为准);

3. 点击地图右上方的“链接”链接,把弹出窗口里“粘贴 HTML 以便嵌入网站”里的内容复制下来并存成一个.html文件,如map.html,文件内容大概如下:

<iframe width\="425" height\="350" frameborder\="0" scrolling\="no" marginheight\="0" marginwidth\="0" src\="http://ditu.google.cn/maps?f=q&hl=zh-CN&geocode=&q=%E5%8C%97%E4%BA%AC&ie=UTF8&z=10&ll=40.037078,116.464691&output=embed&s=AARTsJrxRs93mjURz58t1CN5oqwlje5dZQ"\></iframe\><br /><small\><a href\="http://ditu.google.cn/maps?f=q&hl=zh-CN&geocode=&q=%E5%8C%97%E4%BA%AC&ie=UTF8&z=10&ll=40.037078,116.464691&source=embed" style\="color:#0000FF;text-align:left"\>查看大图</a\></small\>

4. 修改map.html文件的内容,把width和height改为所需要的大小,例如width="4000" height="4000"(注意,修改以后得到的地图的中心点座标是保持不变的);如果需要,还可以修改z值(缩放值),最大可以到17;

5. 在浏览器里打开map.html文件,即可得到一个显示大地图的网页;

6. 点击firefox状态栏里screengrab的图标,选择“Save->Complete Page/Frame”命令将整个地图保存为一个4000x4000的图片文件;街道地图推荐使用png格式,卫星地图推荐jpg格式,格式切换在screengrab的选项里改。(注意,0.95版的screengrab好像只能保存不超过9000x8000的图片,以后应该会修正)

file

图1 将浏览器里的大地图通过screengrab保存为图片文件

Eclipse 3.4新特性 – Plug-in spy

Eclipse 3.4提供了一个新功能:在任何界面下按Alt+Shift+F1 (Windows, Mac OS里用Shift+Option+F1),就可以看到Eclipse用来实现当前选中界面元素的类。

这个功能至少我看起来对插件开发人员很有用,因为当你想要模仿实现(或利用)Eclipse里的某个界面时,不用再像以前那样猜这个界面的实现类的名字了。比如最开始我就用了很久才找到属性视图的实现类是PropertySheet,而我总是朝着PropertyView的方向找,当然很难找到。

file

Plug-in Spy本是一个单独的小项目,在3.4里直接集成到workbench里了。

来源:Eclipse 3.4 Hidden Treasures

Cognos8安装使用问题记录

网上已经有很多关于cognos8的安装配置文章了(如这篇),这里介绍的是自己的亲身经历,供大家参考。以下是Cognos v8.3安装过程中遇到的问题和解决方法:

环境

Cognos v8.3

问题和解决

  1. 运行issetup.exe安装完成后,把cognos自带的jre里bcprov-jdk13-125.jar复制到机器缺省jre的相应目录下,否则运行Cognos Configuration会提示找不到类错误。

  2. Cognos8产品包括很多张安装盘(Image),BI Server包括最常用的功能,其他如Metric Studio、Framework Manager和SDK等等都需要在BI Server的基础上单独安装,这些component的安装也很简单,直接安装到BI Server所在目录即可。

  3. 在Cognos Configuration里启动Cognos Service时提示[ ERROR ] CFG-ERR-0103 Unable to start Cognos 8。只有使用cognos自带的content manager数据库时才报这个错误,改用SQL后错误消失。参考链接1(但后来测试中发现用SQL Server也会报这个错,怀疑有两个可能:1.数据库中未创建ContentStore所需的那些表,如果是这种情况,需要按cognos文档中的方法运行创建表的script命令;2.数据库使用的是Express版本,这种可能性较小,但如果是这种情况换用标准版就能解决;另,SQL Server Express版本的默认端口号是1702而非1433,在Cognos Configuration的Content Store里要注意正确配置)

  4. 为Metric Studio创建包时提示DPR-ERR-2014: Unable to load balance the request because no nodes in the cluster are available, or no nodes are configured for the service: metricsManagerService.
    解决方法:到Cognos Configuration里,在Cognos Planning这一项里,根据你的数据库类型新建一个resource,指向ContentStore那个数据库(也就是让这个数据库的配置与Content Manager下面的那个数据库配置一致),重启Cognos问题解决。

  5. 运行cognos sdk的jsp例子。要把$cognos dir$/sdk/lib下的xalan.jar复制到$cognos dir$/webapps/samples/WEB-INF/lib下,然后在Cognos Configuration里重启cognos,用http://localhost:9300/samples/index.jsp 就可以访问了。(cognos文档里说还需要在bootstrap_win32.xml里配置tools.jar的路径,我没配置好像也可以用,可能是有一些例子需要还没遇到)

  6. 启动report studio时提示HAL ERROR The web request failed. 12002 - Unknown URL: dialogs/_YU7.xml(解决方案探索中)

  7. 在工作区间里添加链接前要先设置Acceptable Domain列表,这是在Cognos Configuration的Cognos Application Firewall (CAF)里设置的,在Valid domains or hosts项里添加即可。

  8. 数据库里数据改变后,Report里的内容不更新。解决方法:这个问题可能是由于Cognos缓存了数据,要取消缓存,在Framework Manager里选择Project->Edit Govenors,勾掉Allow Usage of Local Cache选项,我试验的结果好像需要重新发布包并Update报表才生效。参考链接

  9. 把cognos报表集成到其他portal里。报表的地址可以在报表属性里找到,要去掉标题和工具条,可以加ui.header=false&ui.toolbar=false在URL里(cognos8.2里试验正确,cognos 8.3里可能要用cv.headercv.toolbar

  10. 在Transformer里更新一个powercube的时候,如果提示The locking of Cube XXX.mdc failed. It is probably in use by another application,可能是在浏览器里正在查看使用该powercube的报表,关掉浏览器过一段时间应该就可以正常更新了。

  11. 安装镜像名和component对应关系(部分):

    c8bisrvr_xxx -> BI Server
    c8bimodel_xxx -> Framework Manager, Map Manager
    c8bisamples -> (Samples)

无光驱笔记本n410c装windows xp总结

LP的Compaq n410c笔记本硬盘坏了,就买了一个80g日立pata笔记本硬盘。到今天十月五号花了五天空余时间,总算在新换的硬盘上装好了windows xp。网上已经有不少无光驱笔记本安装windows xp的网页,但这次情况稍微有些特殊(安装程序会中途关机),并且手里也没有常说的IDE转接头,所以这里总结这次的安装经验,供有类似需要的朋友和自己以后参考:

阶段1:

  1. 把新硬盘装进移动硬盘盒,连接到另一台winxp电脑上,鼠标右键点“我的电脑”选“管理”,在“磁盘管理”里给新硬盘分区;
  2. 随便找一个u盘,用“超级启动盘1.7”这个软件制作成启动u盘(选HDD方式),这一步用"HP USB Disk Storage Format Tool"应该也行;
  3. 把新硬盘从移动硬盘盒里拿出来,装到笔记本里,把u盘也插上。启动笔记本电脑,在bios里设置u盘启动(n410c要求在bios里打开legacy usb设备才能设置u盘启动),顺利的话可以进u盘上的dos系统,这时c:是u盘,d:是则新硬盘第一分区(这时如果运行fdisk也可以给新硬盘分区,但无法设置新硬盘的主分区为active分区,这好像会为用这块硬盘启动启动带来麻烦);
  4. format d:/s命令将新硬盘做成启动盘(直接用sys c: d:命令不能成功,怀疑与硬盘分区非active有关);
  5. 把新硬盘从笔记本里取出,装到移动硬盘盒里,连接到另一台电脑上,复制windows xp的安装文件到新硬盘第一个分区,顺便复制himems.sys,smartdrv.exe这两个文件到根目录,建立一个config.sys文件(为smartdrv准备的),内容很简单如下:
    device = himem.sys6
  6. 把新硬盘装回笔记本电脑,用新硬盘启动系统,顺利的话可以进入dos环境;
  7. 执行smartdrv.exe(否则安装过程漫长),然后进入xp安装路径的i386路径,执行winnt开始安装;

看到windows xp安装程序在n410c上开始了,我以为问题搞定了,结果证明高兴太早了。第一次重启后,还未进入图形界面安装阶段,安装程序开始复制文件,复制到driver.cab的时候n410c突然关机,现象就和掉电一样,再次执行多次安装程序或换不同的xp安装镜像现象一致,只是有时还没到driver.cab就关机了。

阶段2:

  1. (在阶段1安装到一半失败的基础上)把新硬盘装回移动硬盘盒,用“超级启动盘”直接把新硬盘做成启动盘;
  2. 把新硬盘安回笔记本电脑,用新硬盘启动,结果失败;
  3. 把新硬盘装回移动硬盘盒,用HP USB Disk Storage Format Tool把它做成win98启动盘;(做了两三次后再做就会失败,很奇怪)
  4. 把新硬盘安回笔记本电脑,用新硬盘启动,成功进入win98的dos环境。执行xp安装程序,安装到一半时同样会自动关机;
  5. 既然xp安装程序过不去,试试win2000怎么样。利用移动硬盘盒把win2000 professional安装程序拷到新硬盘上,装回笔记本启动进入dos,之行win2000的winnt命令开始安装,结果顺利安装成功。在win2000里运行winxp的setup程序,准备把win2000升级为xp,这次xp安装程序是在图形界面下执行的,没想到再次出现了中途关机的状况,看来升级的路也走不通;

阶段3:

  1. 把新硬盘安装到另一台有光驱的笔记本电脑上,以正常方法在xp安装程序里为硬盘分区和安装,安装完成后第一次进入操作系统后,立即按制作万能ghost系统的方法操作(参考链接),可以不需要系统减肥的步骤,关键是卸载硬件驱动这一步,不过我在卸载各种驱动以后没有执行sysprep封装这一步。
  2. 把安装好xp并处理为万能ghost系统的硬盘装到无光驱笔记本电脑上,这时xp应该可以启动,但因为我没有执行sysprep这一步,所以在用户登录界面键盘鼠标(包括外接鼠标)都没有反应,因此无法进入实际使用。
  3. 想到是没有执行sysprep封装步骤,所以把硬盘再次装到有光驱笔记本里,却发现笔记本死活认不出有硬盘存在(bios里都找不到,有人提到过ibm t60笔记本里需要设置scsi model为compatible,但我的笔记本不是这个型号,bios里也没有类似选项..);

已经花费了不少时间,为了不造成更大损失把另一台笔记本也搞坏,放弃了继续尝试,只是到现在也不明白为什么只有第一次装上时能认出来。

阶段4:

  1. (在阶段3的基础上)用新硬盘在无光驱电脑上启动,在xp启动时按F8并选择安全模式进入,在登录界面等待几分钟,发现鼠标键盘可以用了(哈哈);
  2. 登录进入以后重启电脑,这回以正常模式启动xp,也可以顺利登录进入了,这时可以安装各种驱动软件;

现在看起来似乎正常了,但有一个问题:无法软关机,即选择关闭电脑后会提示“您现在可以安全关闭计算机了”,自己还要按电源键4秒关 机;原因是前面制作万能ghost系统时修改了acpi相关的驱动,在设备管理器里计算机下可以看到是Standard PC

阶段5:

  1. 我解决这个问题的办法是在Standard PC上点鼠标右键,选更新驱动程序,这时驱动程序被自动更新为ACPI Uniprocessor PC,按提示重新启动电脑,结果自检后黑屏,左上角有一个正常大小的光标闪烁,汗..(现在想来,正确的解决方法也许直接用halacpi.dll改名并替换system32下的hal.dll)
  2. 因为另一台笔记本已经不认这块硬盘了,想重装不太容易,另外问题显然出在更换的acpi驱动上,所以在网上搜dos下是否有办法把这个驱动换回来。竟然找到了一个网页(链接),方法是用xp安装光盘启动进入恢复模式(在阶段4后发现实际用usb光驱也可以启动n410c,后悔为什么最早没发现,不过让我感到安慰的是用光驱安装一样会中途关机无法完成。进入恢复模式也有中途关机问题,摸索出的解决方法是在安装一开始提示Press F6 if you need to install a third-party SCSI or RAID driver时按F5,后面过一会儿会提示你选择acpi设备,选第一项即可。但我没有用这种方法实验能不能成功从光驱完整安装xp,如果能就好了,下次需要重装的时候再试吧);
  3. 在恢复模式下,先expand i386\halacpi.dl_ c:\,然后copy c:\alacpi.dll c:\windows\system32即把安装盘上的halacpi.dl_解压缩改名覆盖原来的hal.dll,若直接用安装盘上的hal.dll则是Standard PC,好像大部分支持acpi的电脑都应该用halacpi.dll,而刚好我那台有光驱笔记本用的是halaacpi.dll(比前者多了一个a,支持的是Uniprocessor PC),在新电脑里选更新驱动程序后给恢复了有光驱笔记本的驱动,所以造成了无法启动;(替换的过程也可以参考这个链接
  4. 再次用新硬盘重启,果然能进xp了,只是所有的驱动都需要重新扫描安装一次,不过大多数让xp自动安装都可以发现(因为之前已经装过一次)。

希望不要再出什么新问题。

file

搬家前链接:https://www.cnblogs.com/bjzhanghao/archive/2007/10/06/915055.html