存档在 ‘【项目】’ 分类

源码:Instant Logo Maker 在线图标生成器

2016年5月19日

昨天收到BrandBucket的一封邮件,建议我将一个域名在其平台上架销售。有段话正好符合我早先对NameCup的构想:为域名销售提供外围服务市场,比如Logo制作,销售页制作,甚至销售提成担保服务。

且不考虑从猪八戒那里拉供应商,先考虑下在线自助logo制作。

于是找到了域名啦LOGO在线制作生成程序(http://down.chinaz.com/soft/30818.htm)。而这个程序原来就是InstantLogoMaker。

安装调试:

1. /.htaccess

如果不是根目录安装,需要修改RewriteBase为当前目录,否则转写路径错误导致无图片输出。

Options +FollowSymLinks
RewriteEngine on
RewriteBase /tool/domain-logo-generator/
RewriteRule ^image\.png$ image.php [T=application/x-httpd-php,L]
RewriteRule ^image\.gif$ image.php [T=application/x-httpd-php,L]

2. PHP Warning: imagettfbbox(): Could not find/open font

参考:http://amon.org/imagettfbbox

3. PHP Notice: Undefined variable: pick in

参考资料:http://www.jb51.net/article/32127.htm

可在报错的PHP程序文件头部加入:

ini_set("error_reporting","E_ALL & ~E_NOTICE");

现在InstantLogoMaker可以正常运行了。

下一步,是对程序进行适应性改造。

任务:
1. 限制图纸大小:300X100
2. 限制输出背景透明
3. 收罗普适性的几何图标替换原有图标
4. 调整图标和文字的位置参数,保证输出效果的一致性

慢慢改吧。

怎样在CentOS上使用iptables自动封IP

2016年2月26日

linux上用iptables自动封ip的bash脚本,这个还是有一定效果的。

CentOS 内置了一个非常强劲的防火墙,统称为 iptables,但更正确的名称是 iptables/netfilter。iptables 是一个用户空间的模块。作为用户,你在命令行就是通过它将防火墙规则放进缺省的表里。netfilter 是一个核心模块,它内置于内核中,进行实际的过滤。iptables 有很多前端图像界面可以让用户新增或定义规则,但它们很多时不及使用命令行般有灵活性,而且限制用户了解实际发生的事情。

参考资料:《linux上用iptables自动封ip的bash脚本》
参考资料:《在 Redhat / CentOS Linux 中安装 iptables 防火墙》
参考资料:《linux下IPTABLES配置详解》
参考资料:《IPTables》

1. 安先装iptables

2. 下面的脚本保存为drop_ips.sh

#!/bin/bash                        
     
    ###########################################
    # 封锁ip 用iptables                 
    # usage:                            
    # 
    # create date 2010-11-11            
    # update date 2010-11-12            
    ###########################################
     
     
    # 定义端口                          
    CHK_PORT="80 25" 
     
    # 定义输出文件                      
    IPTABLE_OUTPUT=/tmp/ip_drop_tables  
    # 定义输出文件备份  
    IPTABLE_OUTPUT_BAK=/tmp/ip_drop_tables.bak  
     
    # 扫描ip的 间隔时间  
    SCAN_HTTP_IP_TIMEOUT=20  
     
    # 处理ip的间隔时间  
    HANDLE_IP_TIMEOUT=120  
     
    # 连接数量最大限制  
    MAX_CONNECT_IP_NUM=100  
     
    # 排除在外的ip  
    ACCEPT_IP="203.95.110.2" 
     
    # 已经封锁的ip   
    DROP_IP_RECORD_FILE=/tmp/drop_ip_record  
     
    #################################################################  
    #定义方法  
    #################################################################  
    # 输出ip到文件  
    output_ip_table()  
    {  
            # 拿到端口号  
            port_num=$1  
            # 查此端口上的连接ip 输出到指定的目录  
            #echo "start scan ......"  
            netstat -na --tcp| grep ESTABLISHED | awk '{ if ( index($4,":"'"$port_num"'"") ) print $5}' | awk -F ':' '{print $1}' | sort  >> $IPTABLE_OUTPUT  
            #echo "scan end ......"  
    }  
     
     
    # 把需要观测端口列出                                 
    check_port()  
    {  
            for port_td in $CHK_PORT  
            do 
            # echo "port : "$port_td  
                # 扫描此端口  
            output_ip_table $port_td  
        done  
    }  
     
     
    # 封杀ip  
    drop_ip_from_table()  
    {  
        iptables -I INPUT -s "$1" -j DROP  
    }  
     
    # 排除ip  
    accept_ip()  
    {  
        for access_ip in $ACCEPT_IP  
        do 
            iptables -I INPUT -s "$access_ip" -j ACCEPT  
        done  
    }  
     
    # 提取需要的ip  
    get_iptable()  
    {  
        # 如果已经存在就删除  
        if [ -e $IPTABLE_OUTPUT_BAK ] ; then  
            rm -rf $IPTABLE_OUTPUT_BAK  
        fi  
        # copy 一份出去   
        cp $IPTABLE_OUTPUT $IPTABLE_OUTPUT_BAK  
        # 排序 数组  
        declare -a ip_array_org=($(cat ${IPTABLE_OUTPUT_BAK} | sort))  
        # 循环  
        # 比对用的ip 初始化  
        tmp_ip=0.0.0.0  
        let "tmp_ip_count=1" 
        for tmp_element in "${ip_array_org[@]}" 
        do            
            # 初始化 没有特殊设置为排除ip  
            is_not_set_accept="true" 
            # 初始化 是否已封杀了  
            is_not_drop="true" 
            # 如果相等  
            if [ "$tmp_ip" = "$tmp_element" ] ; then   
                let "tmp_ip_count+=1" 
            else              
                # 打印  
                echo "ip: $tmp_ip count: $tmp_ip_count"   
                # 如果大于某个数字 就封杀  
                if (( $tmp_ip_count >= $MAX_CONNECT_IP_NUM )) ; then  
                    # 如果没有记录就封杀  
                    if  cat /tmp/drop_ip_record | grep "$tmp_ip" > /dev/null   ; then  
                        echo "this ip $tmp_ip has been mask !" 
                        is_not_drop="false" 
                    else      
                        # 循环 需要排除ip  
                            for tmp_access_ip in $ACCEPT_IP  
                        do 
                            # 如果排除ip里有 就去封锁此ip  
                            if [ "$tmp_access_ip" = "$tmp_ip" ] ; then   
                                echo "this ip $tmp_ip was mark to accept !" 
                                is_not_set_accept="false" 
                            fi  
                        done   
                    fi  
                    if [ $is_not_set_accept = "true" ] && [ $is_not_drop = "true"] ; then  
                        echo "add a new ip to drop : $tmp_ip" 
                        drop_ip_from_table $tmp_ip  
                        # 记录ip  
                        echo "$tmp_ip" >> $DROP_IP_RECORD_FILE  
                    fi  
                fi  
                # 归零  
                let "tmp_ip_count=1" 
                tmp_ip=$tmp_element  
            fi  
        done  
        # 全部处理完了 删除原件  
        rm -rf $IPTABLE_OUTPUT  
        # 排除ip  
        # accept_ip  
          
    }  
     
    # 扫描ip  
    scan_http_access_ip()  
    {  
        # 获取当前时间作为开始时间  
        start_time=`date +%s`  
            # 循环开始    
        while true 
        do 
            # 开始检查 扫描ip  
            check_port  
            # 线程停止  
            sleep $SCAN_HTTP_IP_TIMEOUT  
            # 获取当前时间  
            cur_time=`date +%s`  
            # 时间差  
            let "time_out=$cur_time-$start_time" 
            echo "time_out : "$time_out  
            # 超过2分钟  
            if (( $time_out >= $HANDLE_IP_TIMEOUT )) ; then  
                # 整理一次ip表  
                echo " times up"              
                get_iptable           
                # 重置开始时间  
                start_time=`date +%s`  
            fi  
        done      
    }  
     
    # 程序执行入口  
    main_app()  
    {  
        # 定时扫描ip  
        scan_http_access_ip  
    }  
     
    main_app 

然后执行下面的脚本,让其自动在后台运行

sh ~/scripts/drop_ips.sh &

怎样使用logrotate对Apache进行日志切割

2016年2月18日

CentOS中编译安装Apache默认日志是不切割的,可以使用工具Cronnolog进行日志切割。

使用logrotate指令,可让你轻松管理系统所产生的记录文件。它提供自动替换,压缩,删除和邮寄记录文件,每个记录文件都可被设置成每日,每周或每月处理,也能在文件太大时立即处理。您必须自行编辑,指定配置文件,预设的配置文件存放在/etc目录下,文件名称为logrotate.conf。

参考资料:http://blog.csdn.net/cjwid/article/details/1690101
参考资料:http://baike.baidu.com/view/4811958.htm
参考资料:https://linuxconfig.org/logrotate

语法:

logrotate [-?dfv][-s <状态文件>][--usage][配置文件]

参数:

-?或–help  在线帮助。
-d或–debug  详细显示指令执行过程,便于排错或了解程序执行的情况。
-f或–force  强行启动记录文件维护操作,纵使logrotate指令认为没有需要亦然。
-s< 状态文件>或–state=< 状态文件>  使用指定的状态文件。
-v或–version  显示指令执行过程。
-usage  显示指令基本用法。

日志文件的管理:
1、logrotate 配置
2、缺省配置 logrotate
3、使用include 选项读取其他配置文件
4、使用include 选项覆盖缺省配置
5、为指定的文件配置转储参数
一、logrotate 配置

logrotate 程序是一个日志文件管理工具。用来把旧的日志文件删除,并创建新的日志文件,我们把它叫做“转储”。我们可以根据日志文件的大小,也可以根据其天数来转储,这个过程一般通过 cron 程序来执行。
logrotate 程序还可以用于压缩日志文件,以及发送日志到指定的E-mail 。

logrotate 的配置文件是 /etc/logrotate.conf。主要参数如下表:

参数 功能
compress 通过gzip 压缩转储以后的日志
nocompress 不需要压缩时,用这个参数
copytruncate 用于还在打开中的日志文件,把当前日志备份并截断
nocopytruncate 备份日志文件但是不截断
create mode owner group 转储文件,使用指定的文件模式创建新的日志文件
nocreate 不建立新的日志文件
delaycompress 和 compress 一起使用时,转储的日志文件到下一次转储时才压缩
nodelaycompress 覆盖 delaycompress 选项,转储同时压缩。
errors address 专储时的错误信息发送到指定的Email 地址
ifempty 即使是空文件也转储,这个是 logrotate 的缺省选项。
notifempty 如果是空文件的话,不转储
mail address 把转储的日志文件发送到指定的E-mail 地址
nomail 转储时不发送日志文件
olddir directory 转储后的日志文件放入指定的目录,必须和当前日志文件在同一个文件系统
noolddir 转储后的日志文件和当前日志文件放在同一个目录下
prerotate/endscript 在转储以前需要执行的命令可以放入这个对,这两个关键字必须单独成行
postrotate/endscript 在转储以后需要执行的命令可以放入这个对,这两个关键字必须单独成行
daily 指定转储周期为每天
weekly 指定转储周期为每周
monthly 指定转储周期为每月
rotate count 指定日志文件删除之前转储的次数,0 指没有备份,5 指保留5 个备份
tabootext [+] list 让logrotate 不转储指定扩展名的文件,缺省的扩展名是:.rpm-orig, .rpmsave, v, 和 ~
size size 当日志文件到达指定的大小时才转储,Size 可以指定 bytes (缺省)以及KB (sizek)或者MB (sizem).
二、缺省配置 logrotate

logrotate 缺省的配置募?/etc/logrotate.conf。
Red Hat Linux 缺省安装的文件内容是:

# see “man logrotate” for details
# rotate log files weekly
weekly

# keep 4 weeks worth of backlogs
rotate 4

# send errors to root
errors root
# create new (empty) log files after rotating old ones
create

# uncomment this if you want your log files compressed
#compress
1
# RPM packages drop log rotation information into this directory
include /etc/logrotate.d

# no packages own lastlog or wtmp –we’ll rotate them here
/var/log/wtmp {
monthly
create 0664 root utmp
rotate 1
}

/var/log/lastlog {
monthly
rotate 1
}

# system-specific logs may be configured here

缺省的配置一般放在logrotate.conf 文件的最开始处,影响整个系统。在本例中就是前面12行。

第三行weekly 指定所有的日志文件每周转储一次。
第五行 rotate 4 指定转储文件的保留 4份。
第七行 errors root 指定错误信息发送给root。
第九行create 指定 logrotate 自动建立新的日志文件,新的日志文件具有和
原来的文件一样的权限。
第11行 #compress 指定不压缩转储文件,如果需要压缩,去掉注释就可以了。

三、使用include 选项读取其他配置文件
include 选项允许系统管理员把分散到几个文件的转储信息,集中到一个
主要的配置文件。当 logrotate 从logrotate.conf 读到include 选项时,会从指定文件读入配置信息,就好像他们已经在/etc/logrotate.conf 中一样。

第13行 include /etc/logrotate.d 告诉 logrotate 读入存放在/etc/logrotate.d 目录中的日志转储参数,当系统中安装了RPM 软件包时,使用include 选项十分有用。RPM 软件包的日志转储参数一般存放在/etc/logrotate.d 目录。

include 选项十分重要,一些应用把日志转储参数存放在 /etc/logrotate.d 。

典型的应用有:apache, linuxconf, samba, cron 以及syslog。

这样,系统管理员只要管理一个 /etc/logrotate.conf 文件就可以了。

四、使用include 选项覆盖缺省配置

当 /etc/logrotate.conf 读入文件时,include 指定的文件中的转储参数将覆盖缺省的参数,如下例:

# linuxconf 的参数
/var/log/htmlaccess.log
{ errors jim
notifempty
nocompress
weekly
prerotate
/usr/bin/chattr -a /var/log/htmlaccess.log
endscript
postrotate
/usr/bin/chattr +a /var/log/htmlaccess.log
endscript
}
/var/log/netconf.log
{ nocompress
monthly
}

在这个例子中,当 /etc/logrotate.d/linuxconf 文件被读入时,下面的参数将覆盖/etc/logrotate.conf中缺省的参数。

Notifempty
errors jim

五、为指定的文件配置转储参数
经常需要为指定文件配置参数,一个常见的例子就是每月转储/var/log/wtmp。为特定文件而使用的参数格式是:

# 注释
/full/path/to/file
{
option(s)
}

下面的例子就是每月转储 /var/log/wtmp 一次:
#Use logrotate to rotate wtmp
/var/log/wtmp
{
monthly
rotate 1
}

六、其他需要注意的问题

1、尽管花括号的开头可以和其他文本放在同一行上,但是结尾的花括号必须单独成行。

2、使用 prerotate 和 postrotate 选项
下面的例子是典型的脚本 /etc/logrotate.d/syslog,这个脚本只是对
/var/log/messages 有效。

/var/log/messages
{
prerotate
/usr/bin/chattr -a /var/log/messages
endscript
postrotate
/usr/bin/kill -HUP syslogd
/usr/bin/chattr +a /var/log/messages
endscript
}

第一行指定脚本对 /var/log messages 有效
花括号外的/var/log messages

prerotate 命令指定转储以前的动作/usr/bin/chattr -a 去掉/var/log/messages文件的“只追加”属性 endscript 结束 prerotate 部分的脚本postrotate 指定转储后的动作

/usr/bin/killall -HUP syslogd

用来重新初始化系统日志守护程序 syslogd

/usr/bin/chattr +a /var/log/messages

重新为 /var/log/messages 文件指定“只追加”属性,这样防治程序员或用户覆盖此文件。

最后的 endscript 用于结束 postrotate 部分的脚本

3、logrotate 的运行分为三步:

判断系统的日志文件,建立转储计划以及参数,通过cron daemon 运行下面的代码是 Red Hat Linux 缺省的crontab 来每天运行logrotate。

#/etc/cron.daily/logrotate
#! /bin/sh

/usr/sbin/logrotate /etc/logrotate.conf

4、/var/log/messages 不能产生的原因:
这种情况很少见,但是如果你把/etc/services 中的 514/UDP 端口关掉的话,这个文件就不能产生了。

小结:本文通过对Red Hat 系统上典型的logrotate 配置例子的介绍,详细说明了logrotate 程序的应用方法。希望对所有Linux 系统管理员有所帮助。管理好,分析好日志文件是系统安全的第一步,在以后的文章里FreeLAMP还会介绍另外一个检查日志的好东东 logcheck。

数据采集工具

2016年1月18日

scrapy

官网:http://scrapy.org/
源码:https://github.com/scrapy/scrapy.org

集搜客GooSeeker网页抓取套件

官网:http://www.gooseeker.com/

下载:http://www.gooseeker.com/pro/download?filename=gooseeker_Win_FF38.x_5.6.0_zh.xpi.zip&filetype=xpi

结构:
MS谋数(台)—— MetaStudio:抓取规则定义软件
DS打数(机)—— DataScraper:执行网页抓取的网络爬虫
MC数满仓—— MetaCorpora:抓取结果入库清洗软件

工具阶段——网页数据的结构化转化工具:集搜客网络爬虫

集搜客GooSeeker大数据软件开发始于2007年,2007年正是语义网络走向商用的时期,集搜客致力于提供一套便捷易用的软件,将网页内容进行语义标注和结构化转换。一旦有了语义结构,整个Web就变成了一个大数据库;一旦内容被赋予了意义(语义),就能从中挖掘出有价值的知识,集搜客创造了以下商业应用场景:

1. 集搜客网络爬虫不是一个简单的网页抓取器,她能够集众人之力把语义标签摘取下来
2. 每个语义标签代表大数据知识对象的一个维度,多维度整合,剖析此知识对象
3. 知识对象可以是多个层面的,比如:市场竞争、消费者洞察、品牌地图、企业画像

方案阶段——围绕核心工具开发一系列大数据处理软件:竞争情报、电商分析、消费者洞察

历经8年辛勤耕耘,GooSeeker已把互联网内容结构化和语义化技术成功推广到金融、保险、电信运营、电信设备制造、电子制造、零售、电商、旅游、教育等行业。围绕核心产品,由一系列软件组件给各行业提供大数据解决方案,主要解决如下核心问题:

1. 内容聚合层面:例如,将金融和财经类信息汇聚,自动分类并用CMS系统进行管理,形成行业垂直信息聚合平台
2. 市场情报与竞争分析层面:例如,零售营销竞争要素分析,包括定价、货架和品类、促销、库存、品牌等要素在电商网站上的展现和蕴含的竞争情报
3. 消费者洞察和品牌分析层面:例如,将所有消费者互动信息进行聚合和挖掘,研究用户对产品的期望、产品与市场的契合度、品牌态度、品牌感知、品牌鸿沟、品牌传播等。
4. 商机发掘层面:例如,商圈分析——在哪里开店?企业画像——如何挖掘B2B销售机会?需求分析——哪些人群最可能需要光纤服务?

社区化阶段——将核心工具开放,搭建大数据能力交流平台

GooSeeker看到太多空谈“啤酒与尿布”,看到更多大数据“高大上”得遥不可及。基于8年服务大数据行业的经验,GooSeeker正在将大数据具象化和亲民化——凝炼成多层面的大数据资源,让最广泛的人可以利用大数据。集搜客是“搜客”的家园,让我们一起玩转大数据,发现数据之美:

1. 集方法——大数据应用场景、分析模型、研究报告,以及Web数据挖掘攻略
2. 集数据——集搜客网络爬虫软件
3. 集工具——天据棱镜系列软件(中文信息处理和商业情报挖掘)、天据天眼系列软件(电商营销和经营分析)
4. 集朋友——大数据挖掘互助平台

关于深圳市天据电子商务有限公司

深圳市天据电子商务有限公司以GooSeeker研发中心的技术后盾,整合多方资源,获得多笔资金注入,研发、市场营销、咨询师骨干组建的团队富有执行力,为商业客户提供全面周到的商业竞争情报分析服务,为商业客户的经营决策活动提供数据和数据分析支持。

深圳市天据电子商务有限公司及GooSeeker研发中心与国内多所著名高校和研究机构紧密合作,致力于语义网络和互联网信息处理的研究工作,公司的产品和解决方案已被众多世界500强企业所采用。

已有近百家大型企事业单位的IT系统集成了集搜客网络爬虫,以及配套的数据清洗和数据集成软件模块,这得益于集搜客网络爬虫独特的开放的设计思想和软件架构,更详细信息参看集搜客网络爬虫功能列表。将这些能力打包成开放的软件模块,集成到各类IT软件系统中,IT系统根据自己的业务目标,可以自动调度和管理网络爬虫,典型案例有:

1. 中国进出口银行项目:集搜客网络爬虫负责抓取中文财经、金融、证券和经济报告类网站内容,而爬行范围、时间安排和其它管理指令是由整个IT系统的其他软件模块发出。
2. 某电商竞争分析项目:集搜客网络爬虫负责从国内所有主流电商网站上获取商品、品牌、价格、库存、货架、品类、以及促销信息,爬虫调度、数据汇聚等操作指令的下发都由整个情报分析系统负责。
3. 某手机消费者洞察项目:集搜客网络爬虫从电商、论坛、社交媒体、微博、问答等等主流自媒体网站上抓取用户评论和各种互动产生的内容,经过数据清洗处理,交给数据挖掘系统进行分析
4. 某上市公司的母婴产品导购平台项目:集搜客网络爬虫实时监视天猫、淘宝、京东和各主流电商的商品、货架、店铺变化情况,及时通知导购平台,例如,某导购攻略提及的商品下架了或者价格变化了,要实时根据通知进行调整

怎样将Destoon的资讯内容中的外链经过短网址处理后输出

2015年2月28日

发现在Destoon后台》系统维护》网站设置》服务器优化,开启“图片延时加载”功能。这个功能将自动检测正文中的图片HTML标签<img>,并对参数进行改造。

例如:

<img src="http://www.domain.com/image/lazy.gif" class="lazy" original="http://www.domain.com/image/001.jpg"  title="Title" alt="Title" />

另外一个开关是清除内容链接,将正文中的超链接清除(怀疑是在内容发布时处理,而不是如WordPress插件Autolink URI一样在动态生成网页时将正文中所有不是超链接的网址都转换)。

遵循这个思路,可以将短网址通过接口自动生成功能引入?

$url = "http://www.domain.com/";
$shorturl = file_get_contents("http://sho.rt/api.php?signature=w53h6ef4s3&action=shorturl&format=simple&url=$file_url");

这个方案如果能够实现,依然存在问题:

A. 如果如图片延时加载功能一样,属于临时处理模式。关闭功能后,依然输出原代码。

  • Destoon只有正文这个字段,正文中的外链并不作为字段存储,同时生成相应的短网址也无字段存储,或者替换原外链
  • 如果是动态/伪静态页面模式:初次访问Destoon某资讯页面,所有外链将生成相应的短网址并输出。再次访问,将重新生成短网址一遍。短网址程序无论设定为执行去重检查还是每访问接口即生成新短网址,都将造成服务器资源的压力。
  • 如果是纯静态页面模式,初次访问Destoon某资讯页面,所有外链将生成相应的短网址并输出,同时生成静态页面,那么也就避免了上一条中短网址服务器压力的问题。但同时造成了静态页面占用大量空间这个问题。

B. 如果采用脚本直接对数据库操作,属于永久处理模式。

  • 采用脚本直接对数据库操作:1. 筛选外链;2. 短网址处理;3. 替换原外链为短网址。这样无论是动态/伪静态/纯静态页面模式,都不影响了。