CentOS7使用firewalld打开关闭防火墙与端口

1、firewalld的基本使用
启动: systemctl start firewalld
查看状态: systemctl status firewalld
停止: systemctl disable firewalld
禁用: systemctl stop firewalld
2.systemctl是CentOS7的服务管理工具中主要的工具,它融合之前service和chkconfig的功能于一体。

启动一个服务:systemctl start firewalld.service
关闭一个服务:systemctl stop firewalld.service
重启一个服务:systemctl restart firewalld.service
显示一个服务的状态:systemctl status firewalld.service
在开机时启用一个服务:systemctl enable firewalld.service
在开机时禁用一个服务:systemctl disable firewalld.service
查看服务是否开机启动:systemctl is-enabled firewalld.service
查看已启动的服务列表:systemctl list-unit-files|grep enabled
查看启动失败的服务列表:systemctl –failed

3.配置firewalld-cmd

查看版本: firewall-cmd –version
查看帮助: firewall-cmd –help
显示状态: firewall-cmd –state
查看所有打开的端口: firewall-cmd –zone=public –list-ports
更新防火墙规则: firewall-cmd –reload
查看区域信息:  firewall-cmd –get-active-zones
查看指定接口所属区域: firewall-cmd –get-zone-of-interface=eth0
拒绝所有包:firewall-cmd –panic-on
取消拒绝状态: firewall-cmd –panic-off
查看是否拒绝: firewall-cmd –query-panic
那怎么开启一个端口呢
添加
firewall-cmd –zone=public –add-port=80/tcp –permanent    (–permanent永久生效,没有此参数重启后失效)
重新载入
firewall-cmd –reload
查看
firewall-cmd –zone= public –query-port=80/tcp
删除
firewall-cmd –zone= public –remove-port=80/tcp –permanent

直接命令:service firewalld stop

 

1. Disable Firewalld Service.

[root@rhel-centos7-tejas-barot-linux ~]# systemctl mask firewalld

2. Stop Firewalld Service.

[root@rhel-centos7-tejas-barot-linux ~]# systemctl stop firewalld

3. Install iptables service related packages.

[root@rhel-centos7-tejas-barot-linux ~]# yum -y install iptables-services

4. Make sure service starts at boot:

[root@rhel-centos7-tejas-barot-linux ~]# systemctl enable iptables

# If you do not want ip6tables, You can skip following command.

[root@rhel-centos7-tejas-barot-linux ~]# systemctl enable ip6tables

5. Now, Finally Let’s start the iptables services.

[root@rhel-centos7-tejas-barot-linux ~]# systemctl start iptables

# If you do not want ip6tables, You can skip following command.

[root@rhel-centos7-tejas-barot-linux ~]# systemctl start ip6tables

Firewalld Service is now disabled and stop, You can use iptables.

yii框架post提交遇到400 (Unable to verify your data submission. )

第一种解决办法是关闭Csrf

public function init(){
    $this->enableCsrfValidation = false;
}

第二种解决办法是在form表单中加入隐藏域

<input name="_csrf" type="hidden" id="_csrf" value="<?= Yii::$app->request->csrfToken ?>">

第三种解决办法是在AJAX中加入_csrf字段

<input name="_csrf" type="hidden" id="_csrf" value="<?= Yii::$app->request->csrfToken ?>">
var csrfToken = $('#_csrf').val();
$.ajax({
  type: 'POST',
  url: url,
  data: {_csrf:csrfToken},
  success: success,
  dataType: dataType
});

基于AIML的PHP聊天天机器人

0. 提醒

该聊天机器人是参考AIML 2.5和Program-P而写成的,这聊天机器人实现的aiml标签和标准的aiml标签由一定的差距,所以你从网上下载的aiml语料库可能没法正常工作。适用于UTF-8编码的,单词后缀根据不同的时态而改变的那些语言。感兴趣的朋友可以自己研究学习一下。

1. 介绍

这是一个用PHP写的aiml解析器,目前在PHP5.4环境上能正常运行。

2. 数据库配置

本程序用了MySQL数据库,你需要把chatbot.sql 文件倒入到你的数据库,然后在chatbot/Config.php文件里修改相关数据库配置变量.

4. aiml语料库资源

你可以直接编辑 aiml/chatbot.aiml 文件或者创建一个新的aiml文件然后在aiml/chatbot.aiml文件用include标签引入它。

5. 关于aiml文件

  • aiml 必须要放在 aiml 目录内.
  • chatbot.aiml 是入口文件 ,它里面的 aiml 标签可以包含多个 category 标签 , 一个 default标签和多个 include标签。
  • 被你添加的其它 aiml 文件在根aiml标签里必须要包含一个 topic 标签 , 这个topic标签可以包含多个 category标签和一个default标签 (这里的其他aiml文件不能写include标签,include标签只能出现在chatbot.aiml文件里)。

6. 测试聊天机器人

你可以打开index.php进行和机器人聊天做测试。

7. 调用聊天机器人

如果希望在自己的应用里面调用聊天机器人我们可以这样调用它的api api.php?requestType=talk&input=你好

8. 关于匹配规则

修改之后的匹配规则 :

* ---> (\S+)
# ---> \S+
_ ---> .*
= ---> \S*

9. 关于AIML标签

本聊天机器人的aiml标签和标准aiml标签有所不同,我根据需求对标签做了一些个性化,我们可以在AIML.MD文件里面查到更多本聊天机器人所支持的标签。

10. 关于api.php的返回数据

{
    "status": "success",
    "type": "talk",
    "message": "haha ...",
    "data": {
        "arr1": {
            "name11": "value11",
            "name12": "value12"
        },
        "arr2": {
            "name21": "value21",
            "name22": "value22"
        }
    }
}

当你访问 api.php?requestType=talk&userInput=haha 的时候能得到以上json数据 .

<category>
    <pattern>haha</pattern>
    <template>
        <data name="arr1">
            <attr name="name11">value11</attr>
            <attr name="name12">value12</attr>
        </data>
        <data name="arr2">
            <attr name="name21">value21</attr>
            <attr name="name22">value22</attr>
        </data>
        haha ...
    </template>
</category>

11. 关于userId

当你给api.phpGET方式发送请求的时候带了userId参数, 这个参数会当作用户的唯一标识。若你没给这个参数,程序会用用户的ip当作唯一标示。

$userId = isset($_REQUEST['userId']) ? $_REQUEST['userId'] : $_SERVER['REMOTE_ADDR'];

12. 关于多个chatbot

如果你把’chatbot/Config.php’文件里面的multiChatbot设置成false,所有的用户会分享一个defaultchatbot。当你设置成true的时候每个用户都会拥有独立的chatbot,这些chatbot会吧userId作为唯一标示,每个用户给自己的chatbot设置相关名字,性别,年龄之类的属性。当你在写一个语音助手之类的时候多个chatbot功能会特别好用,因为用户可以给自己的语音助手设置名字了。

$user = $this->getUser($this->_unique);
if ($this->_config->multiChatbot){
    $bot = $this->getBot($this->_unique);
} else {
    $bot = $this->getBot("default");
}

13. 关于userInfo和botInfo

userInfo和botInfo是指用户和聊天机器人的一些属性,例如姓名,年龄,性别等等。用户可以改变这些属性,当然这是我们当写aiml语料库的时候通过一些标签来实现的,我们可以从AIML.MD 学习set, get, del, user, bot等有关标签。

<category>
    <pattern>my name is *</pattern>
    <template>
        ok , your name is
        <star/>
        <set type="user" name="name">
            <star/>
        </set>
    </template>
</category>

<category>
    <pattern>what is my name</pattern>
    <template>
        oh , your name is
        <get type="user" name="name"/>
        , i remembered it last time ...
    </template>
</category>

14. 关于数据库

log 存储日志的表 .

property 是存储userbot的有关属性的表 , 相当于我们聊天机器人的脑袋,帮我们记住一些属性。 set ,get, del, user, bot 等标签是用来操作这个表的 .

data 表用来存储用户的输入,机器人的回复,input, that, topic 等标签会操作Parser::$_data数组,每次程序开始运行的时候程序会从这个表加载数据到这个数组里,然后程序要结束的时候再会存储到这个表里面。表的唯一标示还是userId


Enjoy it

https://github.com/kompasim/chatbot

yii2常用功能大全

1.模板url生成

<?php
use yii\helpers\Html;
<a href="<?=Yii::$app->urlManager->createUrl(['home/language','lang'=>'CN'])?>" class="language-cn"></a>

URL 管理器是一个名叫 urlManager 的内置应用组件。在 WEB 应用和控制台应用中以通过以下两种方式创建 URL:

  1. \Yii::$app->urlManager->createUrl($params)
  2. \Yii::$app->urlManager->createAbsoluteUrl($params, $schema = null)

createUrl 方法生成根目录的相对路径,例如:/index.php?r=article/view

createAbsoluteUrl() 方法生成的是绝对路径,例如:http://www.example.com/index.php?r=article/view

常见的利用 URL 管理器创建 URL 的例子:

// URL:/index.php?r=article/view
\Yii::$app->urlManager->createUrl('article/view');
// URL:/index.php?r=article/view&id=2
\Yii::$app->urlManager->createUrl(['article/view','id'=>2]);
echo \Yii::$app->urlManager->createAbsoluteUrl('kernel/article/view');

git 在切换分支时候不想提交文件,怎么办? git的文件储存功能

git 的储存功能。

原文:http://www.liaoxuefeng.com/

件开发中,bug就像家常便饭一样。有了bug就需要修复,在Git中,由于分支是如此的强大,所以,每个bug都可以通过一个新的临时分支来修复,修复后,合并分支,然后将临时分支删除。

当你接到一个修复一个代号101的bug的任务时,很自然地,你想创建一个分支issue-101来修复它,但是,等等,当前正在dev上进行的工作还没有提交:

$ git status
# On branch dev
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       new file:   hello.py
#
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#       modified:   readme.txt
#

并不是你不想提交,而是工作只进行到一半,还没法提交,预计完成还需1天时间。但是,必须在两个小时内修复该bug,怎么办?

幸好,Git还提供了一个stash功能,可以把当前工作现场“储藏”起来,等以后恢复现场后继续工作:

$ git stash
Saved working directory and index state WIP on dev: 6224937 add merge
HEAD is now at 6224937 add merge

现在,用git status查看工作区,就是干净的(除非有没有被Git管理的文件),因此可以放心地创建分支来修复bug。

首先确定要在哪个分支上修复bug,假定需要在master分支上修复,就从master创建临时分支:

$ git checkout master
Switched to branch 'master'
Your branch is ahead of 'origin/master' by 6 commits.
$ git checkout -b issue-101
Switched to a new branch 'issue-101'

现在修复bug,需要把“Git is free software …”改为“Git is a free software …”,然后提交:

$ git add readme.txt 
$ git commit -m "fix bug 101"
[issue-101 cc17032] fix bug 101
 1 file changed, 1 insertion(+), 1 deletion(-)

修复完成后,切换到master分支,并完成合并,最后删除issue-101分支:

$ git checkout master
Switched to branch 'master'
Your branch is ahead of 'origin/master' by 2 commits.
$ git merge --no-ff -m "merged bug fix 101" issue-101
Merge made by the 'recursive' strategy.
 readme.txt |    2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
$ git branch -d issue-101
Deleted branch issue-101 (was cc17032).

太棒了,原计划两个小时的bug修复只花了5分钟!现在,是时候接着回到dev分支干活了!

$ git checkout dev
Switched to branch 'dev'
$ git status
# On branch dev
nothing to commit (working directory clean)

工作区是干净的,刚才的工作现场存到哪去了?用git stash list命令看看:

$ git stash list
stash@{0}: WIP on dev: 6224937 add merge

工作现场还在,Git把stash内容存在某个地方了,但是需要恢复一下,有两个办法:

一是用git stash apply恢复,但是恢复后,stash内容并不删除,你需要用git stash drop来删除;

另一种方式是用git stash pop,恢复的同时把stash内容也删了:

$ git stash pop
# On branch dev
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       new file:   hello.py
#
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#       modified:   readme.txt
#
Dropped refs/stash@{0} (f624f8e5f082f2df2bed8a4e09c12fd2943bdd40)

再用git stash list查看,就看不到任何stash内容了:

$ git stash list

你可以多次stash,恢复的时候,先用git stash list查看,然后恢复指定的stash,用命令:

$ git stash apply stash@{0}小结

修复bug时,我们会通过创建新的bug分支进行修复,然后合并,最后删除;

当手头工作没有完成时,先把工作现场git stash一下,然后去修复bug,修复后,再git stash pop,回到工作现场。

微信 WEUI原生以及使用webuploader插件上传方法

摘要: weui构架下的原生及webuploader插件上传js代码

weui1.0.0

webuploder-0.1.5

不多说,直接看代码

		$(function() {
			// 允许上传的图片类型
			var allowTypes = [ 'image/jpg', 'image/jpeg', 'image/png', 'image/gif' ];
			// 1024KB,也就是 1MB
			var maxSize = 1024 * 1024;
			// 图片最大宽度
			var maxWidth = 300;
			// 最大上传图片数量
			var maxCount = 6;
			$('.js_file').on('change', function(event) {
				var files = event.target.files;
				// 如果没有选中文件,直接返回
				if (files.length === 0) {
					return;
				}
				for (var i = 0, len = files.length; i < len; i++) {
					var file = files[i];
					var reader = new FileReader();
					// 如果类型不在允许的类型范围内
					if (allowTypes.indexOf(file.type) === -1) {
						$.weui.alert({
							text : '该类型不允许上传'
						});
						continue;
					}
 					if (file.size > maxSize) {
 						$.weui.alert({
 							text : '图片太大,不允许上传'
 						});
 						continue;
 					}
 					if ($('.weui_uploader_file').length >= maxCount) {
 						$.weui.alert({
 							text : '最多只能上传' + maxCount + '张图片'
 						});
 						return;
 					}
					reader.onload = function(e) {
						var img = new Image();
						img.onload = function() {
							// 不要超出最大宽度
							var w = Math.min(maxWidth, img.width);
							// 高度按比例计算
							var h = img.height * (w / img.width);
							var canvas = document.createElement('canvas');
							var ctx = canvas.getContext('2d');
							// 设置 canvas 的宽度和高度
							canvas.width = w;
							canvas.height = h;
							ctx.drawImage(img, 0, 0, w, h);
							var base64 = canvas.toDataURL('image/png');

							// 插入到预览区
							var $preview = $('<li class="weui-uploader__file weui-uploader__file_status" style="background-image:url('
									+ base64 + ')"><div class="weui-uploader__file-content">0%</div></li>');

							$('.weui-uploader__files').append($preview);

							// 然后假装在上传,可以post base64格式,也可以构造blob对象上传,也可以用微信JSSDK上传
							var progress = 0;
							function uploading() {
								$preview.find('.weui-uploader__file-content').text(++progress + '%');
								if (progress < 100) {
									setTimeout(uploading, 30);
								} else {
									// 如果是失败,塞一个失败图标
									//$preview.find('.weui-uploader__file-content').html('<i class="weui_icon_warn"></i>');
									$preview.removeClass('weui-uploader__file_status')
											.find('.weui-uploader__file-content')
											.remove();
								}
							}
							setTimeout(uploading, 30);
						};
						img.src = e.target.result;
					};
					reader.readAsDataURL(file);
				}
			});
		});



html

<div class="weui-cells weui-cells_form">
	<form method="post">
		<div class="weui-cells__title">照片</div>
		<div class="weui-cell">
			<div class="weui-cell__bd">
				<div class="weui-uploader__bd">
					<ul class="weui-uploader__files">
						<li class="weui-uploader__file" style="background-image:url(http://imgsize.ph.126.net/?imgurl=http://cms-bucket.nosdn.127.net/ba2d23de68ad4dcc8ed67622f911f14c20170113154227.png_140x88x1x85.jpg)">
						</li>
					</ul>
					<div class="weui-uploader__input-box">
						<input id="uploaderInput" class="weui-uploader__input js_file" type="file" accept="image/*" multiple>
					</div>
				</div>
			</div>
		</div>
		<div class="weui-btn-area"><a href="javascript:;" class="weui-btn weui-btn_primary">保存</a></div>
	</form>
</div>

上面是搜到的原生解决办法,这个基础上可以将base64上传到七牛,详见:

https://support.qiniu.com/question/69078

下面是webuploader插件上传代码,本例上传七牛

var uploader = WebUploader.create({
	auto: true,
	swf: '/statics/webuploader-0.1.5/Uploader.swf',
	server: 'http://upload.qiniu.com/',
	pick: '#imgInput',
	accept: {
		title: 'Images',
		extensions: 'gif,jpg,jpeg,bmp,png',
		mimeTypes: 'image/*'
	},
	method: 'POST',
	formData: {'token':'%token%'}
});
uploader.on('uploadStart',function(file) {
	this.options.formData.key='image/'+new Date().getTime()+'/'+file.name.replace(/,/g, '');
});
uploader.on('fileQueued', function(file) {
	var $preview = $('<li id="'+file.id+'" class="weui-uploader__file weui-uploader__file_status"><div class="weui-uploader__file-content">0%</div></li>');
	$('#imgList').append($preview);
	uploader.makeThumb(file, function( error, src) {
	$('#'+file.id).css('background-image','url('+src+')');
    }, 79, 79 );
});
uploader.on('uploadProgress', function(file, percentage ) {
	$('#'+file.id).find('.weui-uploader__file-content').html(percentage+'%');
});
uploader.on('uploadSuccess', function(file, response) {
	$('#'+file.id).removeClass('weui-uploader__file_status')
	.find('.weui-uploader__file-content')
	.remove();
// 上传成功,想干点什么就在这里干吧
});

html

<div class="weui-cell">
	<div class="weui-cell__bd">
		<div class="weui-uploader__bd">
			<ul class="weui-uploader__files" id="imgList">
				<li id="" class="weui-uploader__file" style="background-image:url()"></li>
			</ul>
			<div class="weui-uploader__input-box">
				<div id="imgInput" class="weui-uploader__input">选择图片</div>
			</div>
		</div>
	</div>
</div>

https://my.oschina.net/illone/blog/826574

h5ai 目录列表程序完整安装使用教程 web 文件管理

H5ai是一款功能强大 php 文件目录列表程序,由德国开发者 Lars Jung 主导开发,它提供多种文件目录列表呈现方式,支持多种主流 Web 服务器,例如 Nginx、Apache、Cherokee、Lighttpd 等,支持多国语言,可以使用本程序在线预览文本、图片、音频、视频等。

请注意,默认情况下,放到目录下的 .php 文件将会被直接执行,并不以文本显示。

安装

1.1 首先需要搭建好 Web 服务器,例如 LNMP(Linux/Nginx/MySQL/Php)组合,本文直接以 LNMP 组合为例。

推荐使用 PHP 7 版本。

1.2 下载 h5ai 安装包

转至官网下载:https://larsjung.de/h5ai/

1.3 设置好虚拟主机后,编辑虚拟主机配置文件:

vim /usr/local/nginx/conf/vhost/your_domain.conf

1.3.1 将 root 一行,改为:

index index.html index.php /_h5ai/public/index.php;

1.4 去除被禁用的 PHP 函数:

vim /usr/local/php/etc/php.ini
搜索 scandirexecpassthru,将其从被禁用的函数中删除。

1.5 重启 web 服务器:

service php-fpm restart
service nginx reload

1.6 虚拟主机 ROOT 目录大概是这个样子的,要在网站上显示的目录和 _h5ai 文件夹放在一起:

.
├── _h5ai
│   ├── CHANGELOG.md
│   ├── private
│   ├── public
│   └── README.md
├── 您要显示的文件夹
│   ├── 子文件夹1
│   ├── 文件1
│   └── 文件2
└── 您要显示的文件夹
├── 文件1
└── 文件2

开启 h5ai 更多功能

到目前为止,h5ai 可以正常使用了,但是我们可以开启 _h5ai 全部功能。通过 http(s)://your_domain/_h5ai/public/index.php 可以查看 _h5ai 的全部功能开启情况,默认密码是空的。

2.1 安装 FFmpeg

debian 8:

2.1.1 编辑软件源文件:
vim /etc/apt/sources.list

2.1.2 添加四个软件源

    1. deb http://www.deb-multimedia.org jessie main non-free
    2. deb ftp://ftp.deb-multimedia.org jessie main non-free
    3. deb http://www.deb-multimedia.org stable main non-free
    4. deb ftp://ftp.deb-multimedia.org stable main non-free

2.1.3 更新软件源

    1. aptget y update

2.1.4 安装 ffmpeg
apt-get -y install ffmpeg

Ubuntu 16.04+:

2.1.1 直接通过命令安装:

apt-get -y install ffmpeg

CentOS:

2.1.1 安装 FFmpeg 或 libav。

FFmpeg:

注意:请转至 http://www.ffmpeg.org/releases/ 查看最新的 FFmpeg 版本。

编译安装。

    1. wget http://www.ffmpeg.org/releases/ffmpeg-*.*.tar.gz
    2. tar zxvf ffmpeg-*.*.tar.gz
    3. cd ffmpeg-*.*
    4. ./configure
    5. make
    6. make install

libav:

http://libav.org/download/

下载源码编译即可。

2.2 略缩图功能

2.2.1 图片:
将 _h5ai 中,private 与 public 文件夹中的 cache 目录设置权限为 755。
2.2.2 EXIF:
通过 phpize 安装 PHP 的 exif 模块即可。
2.2.3 视频略缩图:
参考 2.1 安装 FFmpeg 即可。
2.2.3 PDF 略缩图:
安装 ImageMagick。

可使用如下命令:

Ubuntu/Debian:
apt-get install ImageMagick -y
CentOS:
yum install ImageMagick -y

2.3 Shell tar、Shell zip和Shell du

参考 1.4 去除在 php.ini 中被禁用函数 exec与 passthru 即可。

另外去除禁用的 scandir 函数(如果有),不然会导致无法显示目录。

2.4 options.json 中的更多功能

位于 _h5ai/private/conf 目录下。

打包下载:
搜索 “download”
127 行,enabled 由 false 改为 true。

文件信息及二维码:
搜索 “info”
185 行,enabled 由 false 改为 true。

默认简体中文:
搜索 “l10n”
202 行,enabled 由 false 改为 true。

文件及文件夹多选:
搜索 “select”
323 行,enabled 由 false 改为 true。

默认密码:

首先生成自定义 sha512 密码:http://md5hashing.net/hashing/sha512
然后搜索 “passhash”,大概第 10 行,将其密码改成自己生成的。

上一张完整开启所有功能的截图:

2.6 在目录头部或尾部显示 HTML 内容

在需要显示自定义 HTML 的目录下,添加 _h5ai.headers.html 或 _h5ai.footers.html。这个通常用于对该目录的一些说明。支持 HTML 标签。

_h5ai.headers.html 头部 HTML
_h5ai.headers.html 尾部 HTML