解决 apt-get install 依赖问题

前面我为了解决ros rviz 仿真启动 Segmentation fault 的问题,安装了自己下载的 libpcre3 版本,结果 导致 我的ubuntu安装管理器 爆炸了,不管是安装还是卸载 都会报 软件包的 依赖问题,如下:

E: Error, pkgProblemResolver::Resolve generated breaks, this may be caused by held packages.
libpcre3-dev : Depends: libpcre3 (= 1:8.31-2ubuntu2.3) but 2:8.35-7.1ubuntu1 is installed

废话不多说,直接上解决方法:

sudo apt-get install libpcre3=1:8.31-2ubuntu2.3 libpcre3-dev=1:8.31-2ubuntu2.3

唉, 菜鸟果然苦逼啊, 一步一个坑。

apache如何做到日志分割

现在许多网站都是用 apache 做 web 代理的,随时间时间的推长,apache 的访问日志 access.log 会越来越大,所以如果能实现每天分割成一个新得日志,这是比较方便管理的。

当然,apache 本身就具备这样的功能,我需要在 apache 的配置文件中,每个网站的日志部分需要调整成如下的格式

httpd.conf:ErrorLog "| /usr/local/apache/bin/rotatelogs /data/www/log/%Y_%m_%d_error.log 86400 480"
httpd.conf: CustomLog "| /usr/local/apache/bin/rotatelogs /data/www/log/%Y_%m_%d_access.log 86400 480" common

在上面的 ErrorLog 和 CustomLog 需要调整成上面的格式。

最后的效果如下

未分类

apache重启时让其自动输入ssl密码

编辑:/etc/httpd/conf.d/ssl.conf

vim ssl.conf

找到:

# SSLPassPhraseDialog builtin

修改成:

SSLPassPhraseDialog exec:/etc/httpd/conf.d/key.sh

创建:key.sh

编辑:/etc/httpd/conf.d/key.sh

vim key.sh

#!/bin/bash

 echo ‘your pass phrase’                          #注意‘’号输入方式

注意key.sh的权限755

重启服务器

问题解决

关于ubuntu下安装完PHP+Apache后,无法解析php的解决方案

根据 http://blog.csdn.net/renzhenhuai/article/details/12009595

安装完之后,html文件可以正常解析,php源码直接输出,不能被解析。

通常情况下是apache未加载php模块,通常情况下需要修改httpd.conf文件,但是在ubuntu下为apache2.conf文件

修改如下:

设置

LoadModule php5_module        /usr/lib/apache2/modules/libphp5.so
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps

/usr/lib/apache2/modules/libphp5.so换成你的路径。

如果apache2.conf中该项配置,直接加入即可。

然后重启apache即可

sudo /etc/init.d/apache2 restart

使用Vagrant和Virtual Box搭建虚拟开发环境

一、Vagrant介绍

未分类

Vagrant是一款用来构建虚拟开发环境的外挂工具,可以简化虚拟机配置和管理。它底层支持VirtualBox、VMware、AWS等,非常适合使用php/python/ruby/java语言开发web应用。
Vagrant是一个基于Ruby的工具,用于创建和部署虚拟化开发环境。它使用Oracle的开源VirtualBox虚拟化系统,使用Chef创建自动化虚拟环境。

下载安装:
点击前往官网下载https://www.vagrantup.com/downloads.html

Vagrant支持全平台的系统。

未分类

安装过程也是简单粗暴,直接下一步就好。注意,安装之后并没有出现程序图标(至少我的Mac没有),需要在命令行里敲vagrant查看有没有安装成功。如果不行,请检查一下$PATH里面是否包含vagrant所在的路径。
安装Vagrant也一并把Virtual box安装下,虽然Vagrant也支持VM虚拟机,不过是收费的。安装Virtual box可以免费使用。

二、Vagrant命令

未分类

三、使用Vagrant安装配置虚拟机

安装有两种方式,可以在线安装也可以离线安装,考虑到国内互联网大环境,不推荐在线安装。这里采用离线安装的方式。

0x1 下载Box镜像

安装虚拟机需要下载ISO镜像,创建虚拟机并配置环境等一系列步骤。而Vagrant开源社区提供了许多已经打包好的操作系统,我们称之为box。你可以从box下载地址(下文列出),找到你想要的box,当然你也可以自己制作一个。

  • 官方仓库:https://atlas.hashicorp.com/boxes/search
  • 官方镜像:https://vagrantcloud.com/boxes/search
  • 第三方仓库:http://www.vagrantbox.es/

0x2 安装Box

将你下载的Box放在你需要的文件夹里,打开终端。输入:

vagrant init centos/7 //创建虚拟机
vagrant up  //运行

未分类

这样就开始创建虚拟机了,但是如果出现下面的报错:

未分类

说明电脑没有开启Intel的虚拟化技术,需要进入BIOS打开。

未分类

安装好了之后会发现Virtual box下面多了一台虚拟机,说明安装完成。

未分类

0x2 SSH连接

经过以上操作后,我们完成了centos7虚拟机的安装,现在需要登录虚拟机,进行操作,有以下三种方式:

  • 在开发环境的目录(有Vagrantfile的地方),登录虚拟机
vagrant ssh
  • 使用第三方工具,如secureCRT)或系统ssh命令进行登录,IP为Vagrantfile中指定的hostonly地址,用户名与密码默认都是vagrant

  • 在宿主机的命令行,ssh到本地端口的方式登录。观察客户机的22端口映射到宿主机的是多少,一般是2200或者2222,用户名与密码默认都是vagrant

$ ssh -p 2222 127.0.0.1

0x3 Box的删除

想要删除box首先退出SSH连接状态

exit //退出ssh连接
vagrant destory //删除虚拟机

vagrant + centos/7 搭建自己的本地开发环境

作为前端的童鞋们,也许很少接触到服务器相关的知识,但是要做一名合格的软件工程师,就不得不用到这些『软技能』啦,在踩了无数次坑后,终于搭建好属于自己的开发环境,成就感妥妥的。

简单介绍

  • 本文基于MacOS High Sierra 10.13.3 系统,系统的差异可能导致搭建过程中出现不同问题,请自行Google哦。
  • vagrant是一款利器,利用 vagrant + vitualBox 可以搭建虚拟开发环境并且把代码同步共享到linux虚拟机,你可以把这个虚拟机配成和生产环境一样的。还可以将自己的系统打包成虚拟机镜像,发给小伙伴们使用。
  • vagrant 常用来做开发环境的部署工具,而 docker 是一种虚拟化技术,生产环境上基本上使用docker,并且更轻量级 ,当然你也可以折腾一下docker。
  • centos 与 ubuntu 都是 linux 发型版本之一,
    但通常来说公司都是使用centos作为自己生产环境的系统。

工具及要安装的软件

  • Mac
  • vitualBox
  • vagrant
  • centos/7
  • 宝塔面板(简单好用的服务器管理面板工具)
  • SwitchHosts(好用的hosts管理工具)

安装

到官网下载并安装vitualBox,我下载的是OS X 版的,版本号是 5.2.12
再安装vagrant,此处选择Mac os 版本,以上就根据安装器的提示进行安装即可。
打开终端进到mac系统的宿主目录,创建一个存放你的配置的文件夹, 名字最好取得简单易懂,此处取为centos_vagrant:

$  ~mkdir centos_vagrant

复制代码去网上查找可用的 box , 可以把box理解为类似于iso的镜像文件,搭载了你需要的系统,这里我们去官网查看:

未分类

找到要下载的镜像,点进去,发现可以用vagrant 命令下载并且初始化box:

未分类

但是由于网速原因,在终端下载安装简直比龟速还龟速,这里提供其他两种方法下载:

  1. 去网上找找别人分享的 box文件,这里分享了一个,下载到一开始创建的文件夹centos_vagrant中,但是分享的可能与官网版本有差异,这一点需要注意。

  2. 依然在终端运行vagrant init centos/7 命令,但是在运行过程中会发现终端将box文件原地址打印了出来,见下图, 一出现该地址,即可按 ctrl + c 退出
    将该地址复制出来去浏览器里访问下载,比在终端通过命令行下载快得多,当然这些都需要科学上网才能完成。

未分类

搭建环境

了解vagrant常用命令

$ vagrant

未分类

安装 box

进入到刚刚创建的centos_vagrant文件夹,如果里面有vagrantfile文件, 先删除它,刚刚下载好的box文件,也放到这个文件夹,重命名一下,这里命名为centos-7.box
打开终端,进入到centos_vagrant文件夹,使用以下命令:

$ vagrant box add centos-7.box
$ vagrant init centos-7
$ vagrant up

这个过程最好保证你的应用 vitualBox 是开着的

设置文件及目录共享

  • 可以将常用的命令加入到alias 里,在全局使用,因为我安装了zsh,所以编辑.zshrc并保存,没有安装的同学找到.bashrc或.bash_profile进行编辑。
#vagrant-centos
alias centos_up='cd ~/centos_vagrant && vagrant up'
alias centos_status='cd ~/centos_vagrant && vagrant status'
alias centos_ssh='cd ~/centos_vagrant && vagrant ssh'
alias centos_halt='cd ~/centos_vagrant && vagrant halt'
alias centos_reload='cd ~/centos_vagrant && vagrant reload --provision'
alias centos_vi='cd ~/centos_vagrant && vi Vagrantfile'
  • 修改vagrantfile
    在本地随意建一个文件夹,假设为centos_vagrant_project,使用 centos_ssh或者vagrant ssh(后面默认使用centos_xxx),登录到虚拟机
    使用 ls -al命令,会发现虚拟环境里只有.ssh、.bashrc等文件

在虚拟机也创建一个,最好是同名的文件夹,方便管理

$ mkdir centos_vagrant_project

重开终端,使用 centos_vi对vagrantfile进行编辑,并且一定要去掉前面的#号注释!!( 不会使用vim 命令的也可使用文本编辑),
修改如下:

未分类

第一个文件夹目录是你本机要映射到虚拟机的目录,第二个是你虚拟机上的目录,第二句config.vm.synced…是将原本的默认路径禁止掉
但是这里有个坑,在我以为配置完成后,centos_reload重启后,在本机的centos_vagrant_project文件夹中做了一些改动,发现在虚拟机里并没有任何变化,经过排查,发现是虚拟机映射的那个目录(后面那个)路径不对,应该是:/home/vagrant/centos_vagrant_project ,即这个路径是绝对路径, pwd命令可以查看文件路径
需要注意的是,前面的本机的目录 ~/centos_vagrant_project里面的波浪线代表的是宿主目录,即 /users/username
这样目录映射共享就做好了,在本机的文件夹下,添加一个文件,会发现在虚拟机里的文件也同步了。

外部访问与端口转发

  • 自己安装Nginx去做域名映射太复杂,这里推荐一个简便的工具——宝塔面板,当然你也可以自己安装Nginx去折腾…
  • 登录到虚拟机,使用 root 账户
$ centos_ssh
$ sudo su - 

使用以下命令安装:

$ yum install -y wget && wget -O install.sh http://download.bt.cn/install/install.sh && sh install.sh

安装完成后,会分配一个账户及密码给你,一定要记好

未分类

如果之前你已经装了Nginx,可以使用命令删除它

$ yum remove nginx
  • 修改vagrantfile做端口转发与外部访问
    centos_vi打开并编辑vagrantfile文件,配置如下

未分类

简单说一下,guest是虚拟机上对应的端口,host是本机对应的端口,由于我本机80端口常用来做项目,避免哪天不小心开着虚拟机,端口被占用,还一直找不到原因,所以选择了不常用的8089
本机的8888端口也对应虚拟机的8888端口,即之前安装宝塔的时候它需要的端口。配置好后重启虚拟机,浏览器里输入127.0.0.1:8888,使用之前分配给你的账户和密码,登录到宝塔面板,登录后最好改个好记的账户名和密码

域名映射

  • 打开宝塔面板,在 “软件管理” 中安装你需要的,比如:Nginx、PHP、Mysql…
  • 在 “网站” 中可以添加站点,但是使用宝塔面板建站的时候默认给你建到了 www/wwwroot目录下,不过问题也不大
  • 推荐使用 SwitchHosts 软件管理你本地的hosts

域名映射示例

  • 在本地创建test_erp文件夹,路径为’~/my-pro/test_erp’
  • 新建站点时,路径为/www/wwwroot/test_erp,域名为test-erp.com
  • 建好站点不用再进到虚拟机建目录,宝塔会帮你创建好
  • 使用SwitchHosts配置hosts站点:127.0.0.1 test-erp.com
  • 增加vagrantfile的配置,做好目录映射,重启虚拟机
  • 浏览器中使用 test-erp.com:8089访问

宝塔域名配置:

未分类

页面如下:

未分类

本机文件路径:

未分类

虚拟机文件路径:

未分类

vagrantfile文件配置:

未分类

打包镜像

$ vagrant package --output centos-7-ydj.box --vagrantfile Vagrantfile

输出结果:

➜  centos_vagrant vagrant package --output centos-7-ydj.box --vagrantfile Vagrantfile
==> default: Attempting graceful shutdown of VM...
==> default: Clearing any previously set forwarded ports...
==> default: Exporting VM...
==> default: Compressing package to: /Users/zhangyilan/centos_vagrant/centos-7-ydj.box
==> default: Packaging additional file: Vagrantfile
➜  centos_vagrant ls
Vagrantfile      centos-7-ydj.box centos-7.box

打包完成!!

tips

  • 每次修改完vagrantfile文件或者对虚拟机做了操作,一定要reload重启!!
  • Nginx配置易出现403 Forbbiden 权限问题,涉及到linux 的 目录/用户/权限 等系列问题
  • 端口、文件名等等,主机和虚拟机最好保持一致,不然会很头疼的
  • 涉及到服务器等相关的,不学点 linux、vim 命令,几乎动不了手…

结语

折腾服务器,搭建环境是一个需要耐心、恒心的过程,会遇到各种各样的问题,这个时候就需要去google,不断排查bug,并且要记录,免得再次掉坑里。
合理使用工具也很重要,毕竟咱不是专业的运维er…
Finally , 小哥哥小姐姐们,如果觉得OK,不要吝啬你的小心心咯 (´▽`ʃ♡ƪ),躁起来吧!

lua 三元运算符的使用

C 语言中有 a?b:c 的方法,用来判断,如果a 为真,则结果为b,如果a为假,则结果为c

下面用一个比较的函数来说明lua中三元运算符的使用

-- lua 三元运算符的使用 类似C中的 a > b ? c 
function compare1(a,b) 
    if a > b then 
        return a 
    else 
        return b
    end
end

function mcompare(a,b) 
    return ( a>b and a ) or b
end

print(compare1(1,2)) -->2
print(mcompare(1,2)) -->2

由上可以看书,lua中三元运算符用 (a and b) or c 来表示

解决mysqldump备份报错:SET OPTION SQL_QUOTE_SHOW_CREATE=1

在使用mysqldump备份数据库的时候报如下错误,

mysqldump: Couldn't execute 'SET OPTION SQL_QUOTE_SHOW_CREATE=1': You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'OPTION SQL_QUOTE_SHOW_CREATE=1' at line 1 (1064)

mysqldump命令使用方法参见:http://yanue.net/post-64.html

下面解决方法来源于网络,针对我的版本是mysql5.6,问题解决。

使用命令查看:

rpm -qa | grep -i mysql

经排查发现是数据库版本问题、安装的是mysql5.6 、执行该命令是mysql5.5遗留下来的二进制文件、验证如下

[root@yanue mysql]# which mysqldump
/usr/bin/mysqldump

最后找到解决办法、用新安装的mysql绝对路径来实现备份

#/usr/local/mysql/bin/mysqldump --socket=/tmp/mysql.sock -uroot -p --lock-all-tables zabbix > zabbix.sql

另外:由于mysql server端的版本为5.6,mysql client端的版本为5.5,所以把mysql client端的版本也升到了5.6,再次执行mysqldump就好了.

MySQL中Innodb如何计算索引的统计信息?

摘要: MySQL查询优化器的执行计划是根据统计信息中键值的分布选择合适的索引这是基于索引的选择性的。innodb通过抽样的方式来计算统计信息首先随机的读取少量的索引页面然后以此为样本计算索引的统计信息。老的innodb默认样本页面数为8新版本可以通过innodb_stats_transient_sample_pages5.6.3之前是innodb_stats_sample_pages来设置样本页的数量。

MySQL查询优化器的执行计划是根据统计信息中键值的分布选择合适的索引,这是基于索引的选择性的。innodb通过抽样的方式来计算统计信息,首先随机的读取少量的索引页面,然后以此为样本计算索引的统计信息。老的innodb默认样本页面数为8,新版本可以通过innodb_stats_transient_sample_pages(5.6.3之前是innodb_stats_sample_pages)来设置样本页的数量。样本页的数量设置的更大,理论上来说是可以得到更准确的统计信息,特别是对于超大的表。但是具体设置多大合适还是需要根据实际情况

innodb索引的统计信息存储方式有两种,一种是非持久性存储,既存储在内存中,如果服务器重启就会丢失;一种是持久性存储,即存储到磁盘上,可以永久保存。通过参数innodb_stats_persistent来控制。在MySQL5.6.6之后,默认是持久性存储。

两种存储方式:

非持久性存储,通过设置innodb_stats_persistent=OFF或者使用STATS_PERSISTENT=0创建,通过以下操作可以触发计算统计信息:

a) 执行analyze table

b) 在使用show table status、show index等命令的时候,或者在查询系统表INFORMATION_SCHEMA.TABLES 和 INFORMATION_SCHEMA.STATISTICS的时候。需要一个参数控制是否会触发更新统计信息,innodb_stats_on_metadata=on时。

这里需要注意的是,数据库中有大量的表或者索引的时候,会给数据库的IO带来更大的压力;并且如果频繁的更新统计信息,MySQL的执行计划的稳定性也会受到影响。

c) 在启动mysql客户端的时候采用–auto-rehash参数。

d) 一个表首次被打开的时候。

e) 表发生非常大的变化的时候(大小变化超过1/16或者新插入20亿行数据)。

持久性存储,设置innodb_stats_persistent=ON,或者STATS_PERSISTENT=1创建。

持久化的信息存储在MySQL的系统表mysql.innodb_table_stats 和mysql.innodb_index_stats 中。

因为是持久性存储到磁盘上,所以在表一段时间之后或者是进行大的改动的时候需要手动执行analyze table来更新统计信息。

总结:建议设置持久性存储到磁盘上,可以得到更稳定的执行计划,并且在系统重启之后可以更快速的生成统计信息。但是需要周期性的执行analyze table来手动更新统计信息,否则统计信息永远不变。

MyISAM与InnoDB的区别

MyISAM是MySQL的默认数据库引擎(5.5版之前),由早期的ISAM(Indexed Sequential Access Method:有索引的顺序访问方法)所改良。虽然性能极佳,但却有一个缺点:不支持事务处理(transaction)。不过,在这几年的发展下,MySQL也导入了InnoDB(另一种数据库引擎),以强化参考完整性与并发违规处理机制,后来就逐渐取代MyISAM。

InnoDB,是MySQL的数据库引擎之一,为MySQL AB发布binary的标准之一。InnoDB由Innobase Oy公司所开发,2006年五月时由甲骨文公司并购。与传统的ISAM与MyISAM相比,InnoDB的最大特色就是支持了ACID兼容的事务(Transaction)功能,类似于PostgreSQL。目前InnoDB采用双轨制授权,一是GPL授权,另一是专有软件授权。

MyISAM与InnoDB的区别

1、 存储结构

MyISAM:每个MyISAM在磁盘上存储成三个文件。第一个文件的名字以表的名字开始,扩展名指出文件类型。.frm文件存储表定义。数据文件的扩展名为.MYD (MYData)。索引文件的扩展名是.MYI (MYIndex)。
InnoDB:所有的表都保存在同一个数据文件中(也可能是多个文件,或者是独立的表空间文件),InnoDB表的大小只受限于操作系统文件的大小,一般为2GB。

2、 存储空间

MyISAM:可被压缩,存储空间较小。支持三种不同的存储格式:静态表(默认,但是注意数据末尾不能有空格,会被去掉)、动态表、压缩表。
InnoDB:需要更多的内存和存储,它会在主内存中建立其专用的缓冲池用于高速缓冲数据和索引。

3、 可移植性、备份及恢复

MyISAM:数据是以文件的形式存储,所以在跨平台的数据转移中会很方便。在备份和恢复时可单独针对某个表进行操作。
InnoDB:免费的方案可以是拷贝数据文件、备份 binlog,或者用 mysqldump,在数据量达到几十G的时候就相对痛苦了。

4、 事务支持

MyISAM:强调的是性能,每次查询具有原子性,其执行数度比InnoDB类型更快,但是不提供事务支持。
InnoDB:提供事务支持事务,外部键等高级数据库功能。 具有事务(commit)、回滚(rollback)和崩溃修复能力(crash recovery capabilities)的事务安全(transaction-safe (ACID compliant))型表。

5、 AUTO_INCREMENT

MyISAM:可以和其他字段一起建立联合索引。引擎的自动增长列必须是索引,如果是组合索引,自动增长可以不是第一列,他可以根据前面几列进行排序后递增。
InnoDB:InnoDB中必须包含只有该字段的索引。引擎的自动增长列必须是索引,如果是组合索引也必须是组合索引的第一列。

6、 表锁差异

MyISAM:只支持表级锁,用户在操作myisam表时,select,update,delete,insert语句都会给表自动加锁,如果加锁以后的表满足insert并发的情况下,可以在表的尾部插入新的数据。
InnoDB:支持事务和行级锁,是innodb的最大特色。行锁大幅度提高了多用户并发操作的新能。但是InnoDB的行锁,只是在WHERE的主键是有效的,非主键的WHERE都会锁全表的。

7、 全文索引

MyISAM:支持 FULLTEXT类型的全文索引
InnoDB:不支持FULLTEXT类型的全文索引,但是innodb可以使用sphinx插件支持全文索引,并且效果更好。

8、 表主键

MyISAM:允许没有任何索引和主键的表存在,索引都是保存行的地址。
InnoDB:如果没有设定主键或者非空唯一索引,就会自动生成一个6字节的主键(用户不可见),数据是主索引的一部分,附加索引保存的是主索引的值。

9、 表的具体行数

MyISAM:保存有表的总行数,如果select count() from table;会直接取出出该值。
InnoDB:没有保存表的总行数,如果使用select count(
) from table;就会遍历整个表,消耗相当大,但是在加了wehre条件后,myisam和innodb处理的方式都一样。

10、 CURD操作

MyISAM:如果执行大量的SELECT,MyISAM是更好的选择。
InnoDB:如果你的数据执行大量的INSERT或UPDATE,出于性能方面的考虑,应该使用InnoDB表。DELETE 从性能上InnoDB更优,但DELETE FROM table时,InnoDB不会重新建立表,而是一行一行的删除,在innodb上如果要清空保存有大量数据的表,最好使用truncate table这个命令。

11、 外键

MyISAM:不支持
InnoDB:支持
通过上述的分析,基本上可以考虑使用InnoDB来替代MyISAM引擎了,原因是InnoDB自身很多良好的特点,比如事务支持、存储 过程、视图、行级锁定等等,在并发很多的情况下,相信InnoDB的表现肯定要比MyISAM强很多。另外,任何一种表都不是万能的,只用恰当的针对业务类型来选择合适的表类型,才能最大的发挥MySQL的性能优势。如果不是很复杂的Web应用,非关键应用,还是可以继续考虑MyISAM的,这个具体情况可以自己斟酌。