xcode7下安装Alamofire第三方网络基础库
1.安装类库管理工具
CocoaPods安装和使用教程 去中心化的依赖管理器Carthage (这里没有使用这个库)
2.安装Alamofire
https://github.com/Alamofire/Alamofire
以下为在使用Cocopods管理Alamofire类库的前后项目结构图,项目名称为CocoaPodsDemo
By admin
read more1.安装类库管理工具
CocoaPods安装和使用教程 去中心化的依赖管理器Carthage (这里没有使用这个库)
2.安装Alamofire
https://github.com/Alamofire/Alamofire
以下为在使用Cocopods管理Alamofire类库的前后项目结构图,项目名称为CocoaPodsDemo
By admin
read more使用 git 做代码管理工具时,设置 gitignore 是必不可少的流程,一些系统或者 IDE 会在目录下生成与项目不相关的文件,而这些文件我们不期望被提交到仓库之中。理解 gitignore 的 pattern 规则十分重要。
关于 Pattern 规则,可以查看 git 的相关文档: http://git-scm.com/docs/gitignore,大致有以下几点:
# 开头表示注释,如果相匹配 #,可以在前面加一个反斜杠,即 \#;!,则这些匹配过的部分将被移出,如果要匹配以 ! 开头的内容,需要加上反斜杠,如 \!important.txt;foo/,则默认会匹配所有(包含父子文件夹)中的 foo 文件夹内容,并且它不会匹配单个的文件;foo,Git 会将其作为一个 shell 的查找命令匹配内容。需要注意的**:
** 开头,如 **/foo,最后会匹配所有文件夹下的 foo 文件(夹);/** 开头,如 abc/**,则表示匹配 abc 目录下的所有内容((relative to the location of the .gitignore file, with infinite depth);**,如 a/**/b,则会匹配 a/b、a/x/b、a/x/y/b以及所有类似的内容。如果我们要匹配 ‘foo’ 目录下除去 ‘foo/bar/‘ 的内容,可以这样做:
By admin
read more要说表空间,Mysql的表空间管理远远说不上完善。换句话说,事实上Mysql根本没有真正意义上的表空间管理。Mysql的Innodb包含两种表空间文件模式,默认的共享表空间和每个表分离的独立表空间。只要在my.cnf里面增加innodb_file_per_table=1就可以从共享表空间切换到独立表空间。当然对于已经存在的表,则需要执行alter table MY_TABLE engine=innodb命令迁移数据。
由于是默认的方式,就暂且理解为Mysql官方推荐的方式。相对而言所有的数据都在一个(或几个)文件中,比较利于管理,而且在操作的时候只需要open这一个(或几个)文件即可,相对来说代价很低。
但问题是在数据达到以G为单位来计算的时候优劣逆转。一个大小惊人的文件很不利于管理,而且对于一个如此巨大的文件来说,读写它需要耗费的资源一样巨大。更加令人费解的是,MySQL竟然将索引和数据保存于同一个文件中,索引和数据之间尚存在资源争用,不利于性能的提升。你当然可以通过innodb_data_file_path的配置规划多个表空间文件,但MySQL的逻辑是“用满后增加”,仅仅是一个文件的拆分而已,不能从根本上分离数据和索引。
之前曾经遭遇到700G以上的表空间文件,而且更加让人郁闷的是对于如此大的文件还在以每天数G的数量增加。由于无法停机,即便是拷贝一下也要花费差不多一夜,只能眼睁睁看着它继续增大而毫无保守可行的办法。
相对而言对立表空间每个表都有独立的多个数据文件,而且做到了索引和数据的分离。多个小文件之间很方便的完成跨数据库甚至跨硬件的数据拷贝和迁移。相对来说灵活性很好。
这样做同样带来另一个方面的问题。当数据库中的表数量达到一定级别时,每次操作所涉及的文件过多,如果按照默认Centos的ulimit -n = 1024的话,仅仅只能保证同时打开256个表以内,这在习惯上“拆库拆表”的MySQL数据结构上很难达到要求。尚且这种数据文件的利用率不算很高,当大量“不高”的文件集中起来,浪费的空间也很惊人,更何况最后可能出现的状况不是“一堆K级别的小文件”而是“一堆G级别的大文件”,有点适得其反的意思。你自然可以联想到分区表,又是一个“仅仅做文件拆分而已”,多个分区文件缺一不可。
之前同样遇到过这个问题,MySQL连接大的状况下大量的timeout,但主机负载还算可以,查了一圈才知道是open files限制的问题,限制一修改,负载变得惊人,但连接数却又提升的不多。
总之,两种方法各有所长,部分互补,但都不是解决问题的终极方案。期待MySQL能够出现真正意义上表空间的概念,更加自由的规划数据文件。
By admin
read more本次,我们通过对比,明明白白的知道索引、提交频率对InnoDB表写入速度的影响,了解有哪些需要注意的。
先直接说几个结论吧:
1、关于索引对写入速度的影响:
a、如果有自增列做主键,相对完全没索引的情况,写入速度约提升 3.11%;
b、如果有自增列做主键,并且二级索引,相对完全没索引的情况,写入速度约降低 27.37%;
因此,InnoDB表最好总是有一个自增列做主键。
2、关于提交频率对写入速度的影响(以表中只有自增列做主键的场景,一次写入数据30万行数据为例):
a、等待全部数据写入完成后,最后再执行commit提交的效率最高;
b、每10万行提交一次,相对一次性提交,约慢了1.17%;
c、每1万行提交一次,相对一次性提交,约慢了3.01%;
d、每1千行提交一次,相对一次性提交,约慢了23.38%;
e、每100行提交一次,相对一次性提交,约慢了24.44%;
f、每10行提交一次,相对一次性提交,约慢了92.78%;
g、每行提交一次,相对一次性提交,约慢了546.78%,也就是慢了5倍;
因此,最好是等待所有事务结束后再批量提交,而不是每执行完一个SQL就提交一次。
曾经有一次对比测试mysqldump启用extended-insert和未启用导出的SQL脚本,后者比前者慢了不止5倍。
下面是详细的测试案例过程,有兴趣的同学可以看看:
DROP TABLE IF EXISTS \`mytab\`;
CREATE TABLE \`mytab\` (
\`id\` int(10) unsigned NOT NULL AUTO_INCREMENT,
\`c1\` int(11) NOT NULL DEFAULT ‘0’,
\`c2\` int(11) NOT NULL DEFAULT ‘0’,
\`c3\` timestamp NOT NULL DEFAULT CURRENT\_TIMESTAMP ON UPDATE CURRENT\_TIMESTAMP,
\`c4\` varchar(200) NOT NULL DEFAULT ”,
PRIMARY KEY (\`id\`)
) ENGINE=InnoDB;
DELIMITER $$$
DROP PROCEDURE IF EXISTS \`insert_mytab\`;
CREATE PROCEDURE \`insert_mytab\`(in rownum int, in commitrate int)
BEGIN
DECLARE i INT DEFAULT 0;
SET AUTOCOMMIT = 0;
WHILE i < rownum DO INSERT INTO mytab(c1, c2, c3,c4) VALUES( FLOOR(RAND()\*rownum),FLOOR(RAND()\*rownum),NOW(), REPEAT(CHAR(ROUND(RAND()\*255)),200)); SET i = i+1; /\* 达到每 COMMITRATE 频率时提交一次 */ IF (commitrate > 0) AND (i % commitrate = 0) THEN
COMMIT;
SELECT CONCAT(‘commitrate: ‘, commitrate, ‘ in ‘, I);
END IF;
END WHILE;
/\* 最终再提交一次,确保成功 \*/
COMMIT;
SELECT ‘ALL COMMIT;’;
END; $$$
#测试调用
By admin
read moreMySQL在以下几种情况会创建临时表:
1、UNION查询;
2、用到TEMPTABLE算法或者是UNION查询中的视图;
3、ORDER BY和GROUP BY的子句不一样时;
4、表连接中,ORDER BY的列不是驱动表中的;
5、DISTINCT查询并且加上ORDER BY时;
6、SQL中用到SQL_SMALL_RESULT选项时;
7、FROM中的子查询;
8、子查询或者semi-join时创建的表;
EXPLAIN 查看执行计划结果的 Extra 列中,如果包含 ** Using Temporary** 就表示会用到临时表。
当然了,如果临时表中需要存储的数据量超过了上限( tmp-table-size 或 max-heap-table-size 中取其大者),这时候就需要生成基于磁盘的临时表了。
在以下几种情况下,会创建磁盘临时表:
1、数据表中包含BLOB/TEXT列;
2、在 GROUP BY 或者 DSTINCT 的列中有超过 512字符 的字符类型列(或者超过 512字节的 二进制类型列,在5.6.15之前只管是否超过512字节);
3、在SELECT、UNION、UNION ALL查询中,存在最大长度超过512的列(对于字符串类型是512个字符,对于二进制类型则是512字节);
4、执行SHOW COLUMNS/FIELDS、DESCRIBE等SQL命令,因为它们的执行结果用到了BLOB列类型。
从5.7.5开始,新增一个系统选项** internal_tmp_disk_storage_engine** 可定义磁盘临时表的引擎类型为 InnoDB,而在这以前,只能使用 MyISAM。而在5.6.3以后新增的系统选项 default_tmp_storage_engine 是控制 CREATE TEMPORARY TABLE创建的临时表的引擎类型,在以前默认是MEMORY,不要把这二者混淆了。
见下例:
mysql> set default_tmp_storage_engine = "InnoDB";
-rw-rw---- 1 mysql mysql 8558 Jul 7 15:22 #sql4b0e_10_0.frm -- InnoDB引擎的临时表
-rw-rw---- 1 mysql mysql 98304 Jul 7 15:22 #sql4b0e_10_0.ibd
-rw-rw---- 1 mysql mysql 8558 Jul 7 15:25 #sql4b0e_10_2.frm
mysql> set default_tmp_storage_engine = "MyISAM";
-rw-rw---- 1 mysql mysql 0 Jul 7 15:25 #sql4b0e_10_2.MYD -- MyISAM引擎的临时表
-rw-rw---- 1 mysql mysql 1024 Jul 7 15:25 #sql4b0e_10_2.MYI
mysql> set default_tmp_storage_engine = "MEMORY";
-rw-rw---- 1 mysql mysql 8558 Jul 7 15:26 #sql4b0e_10_3.frm -- MEMORY引擎的临时表
延伸阅读:
By admin
read more我们先了解下InnoDB引擎表的一些关键特征:
InnoDB引擎表是基于B+树的索引组织表(IOT);
每个表都需要有一个聚集索引(clustered index);
所有的行记录都存储在B+树的叶子节点(leaf pages of the tree);
基于聚集索引的增、删、改、查的效率相对是最高的;
如果我们定义了主键(PRIMARY KEY),那么InnoDB会选择其作为聚集索引;
如果没有显式定义主键,则InnoDB会选择第一个不包含有NULL值的唯一索引作为主键索引;
如果也没有这样的唯一索引,则InnoDB会选择内置6字节长的ROWID作为隐含的聚集索引(ROWID随着行记录的写入而主键递增,这个ROWID不像ORACLE的ROWID那样可引用,是隐含的)。
综上总结,如果InnoDB表的数据写入顺序能和B+树索引的叶子节点顺序一致的话,这时候存取效率是最高的,也就是下面这几种情况的存取效率最高:
使用自增列(INT/BIGINT类型)做主键,这时候写入顺序是自增的,和B+数叶子节点分裂顺序一致;
该表不指定自增列做主键,同时也没有可以被选为主键的唯一索引(上面的条件),这时候InnoDB会选择内置的ROWID作为主键,写入顺序和ROWID增长顺序一致;
除此以外,如果一个InnoDB表没有显式主键,但有可以被选择为主键的唯一索引,且该唯一索引可能不是递增关系时(例如字符串、UUID、多字段联合唯一索引的情况),该表的存取效率就会特别差。
实际情况是如何呢?经过简单TPCC基准测试,修改为使用自增列作为主键与原始表结构分别进行TPCC测试,前者的TpmC结果比后者高9%倍,足见使用自增列做InnoDB表主键的明显好处,其他更多不同场景下使用自增列的性能提升可以自行对比测试下。
附图:
1、B+树典型结构
2、InnoDB主键逻辑结构
延伸阅读:
1、TPCC-MySQL使用手册, http://imysql.com/2012/08/04/tpcc-for-mysql-manual.html
2、B+Tree index structures in InnoDB, http://blog.jcole.us/2013/01/10/btree-index-structures-in-innodb/
3、B+Tree Indexes and InnoDB – Percona, http://www.percona.com/files/presentations/percona-live/london-2011/PLUK2011-b-tree-indexes-and-innodb.pdf
4、MySQL官方手册: Clustered and Secondary Indexes,
https://dev.mysql.com/doc/refman/5.6/en/innodb-index-types.html 关于MySQL的方方面面大家想了解什么,可以直接留言回复,我会从中选择一些热门话题进行分享。 同时希望大家多多 转发,多一些阅读量是老叶继续努力分享的绝佳助力,谢谢大家 🙂
By admin
read more# $3的位置是IP地址,可按情况修改,如:
# [30/Sep/2012:19:14:47 +0800] 110.75.176.58 www.example.com "GET / HTTP/1.1" 200 3629 "-" "Yahoo! Slurp China"
cat nginx.log | awk '{print $3}' | sort | uniq -c | sort -nr | less
#输出:
# 120 189.17.37.109
# 96 12.15.61.22
# 95 12.20.29.33
# 。。。 。。。
By admin
read more最近有下二次开发的程序,由于源程序使用了zend压缩,提示需要安装 Zend Guard Loader 扩展。而安装zend guard 7后,发现在phpinfo()里检测不到,后来才发现原来zend guard只能使用nfs非安全线程的php,没有办法,重新下载NFS版本的php版本。以下为安装要点:
我用的是WampServer集成环境,于是就想到了把 Apache 换成 FastCGI 模式来跑 PHP5.3 nts 版,这样就可以使用Zend Guard Loader 扩展了。
1、下载 PHP5.3.28 ,解压到 F:/php5.3.28nts ,配置好 php.ini,也顺便把 Zend Guard Loader 扩展配置好。
2、下载 mod_fcgid-2.3.6-win32-x86.zip 或 http://www.apachelounge.com/download/ 解压 manual、modules 目录中的文件到 f:\wamp\bin\apache\apache2.2.22 对应目录里去。
3、打开 Apache 配置文件 F:\wamp\bin\apache\apache2.2.22\conf\httpd.conf ,用#号注释掉 LoadModule php5_module “F:/wamp/bin/php/php5.3.13/php5apache2_2.dll” ,并在下面一行加入 :
LoadModule fcgid_module modules/mod_fcgid.so
4、在 httpd.conf 配置文件的最后加入下面的配置:
<IfModule mod_fcgid.c>
AddHandler fcgid-script .fcgi .php
#php.ini的存放目录
FcgidInitialEnv PHPRC "F:/php5.3.28nts"
# 设置PHP_FCGI_MAX_REQUESTS大于或等于FcgidMaxRequestsPerProcess,防止php-cgi进程在处理完所有请求前退出
FcgidInitialEnv PHP_FCGI_MAX_REQUESTS 1000
#php-cgi每个进程的最大请求数
FcgidMaxRequestsPerProcess 1000
#php-cgi最大的进程数
FcgidMaxProcesses 3
#最大执行时间
FcgidIOTimeout 120
FcgidIdleTimeout 120
#php-cgi的路径
FcgidWrapper "F:/php5.3.28nts/php-cgi.exe" .php
AddType application/x-httpd-php .php
</IfModule>
5、告诉 Apache 执行方式,修改配置如下:
By admin
read more很多时候由于异常或程序错误会导致个别进程占用大量系统资源,需要结束这些进程,通常可以使用以下命令Kill进程:
mysql中kill掉所有锁表的进程
3点钟刚睡下, 4点多, 同事打电话告诉我用户数据库挂掉了. 我起床看一下进程列表.
mysql>show process list;
出来哗啦啦好几屏幕的, 没有一千也有几百条, 查询语句把表锁住了, 赶紧找出第一个Locked的thread_id, 在mysql的shell里面执行.
mysql>kill thread_id;
kill掉第一个锁表的进程, 依然没有改善. 既然不改善, 咱们就想办法将所有锁表的进程kill掉吧, 简单的脚本如下.
#!/bin/bash
mysql -u root -e "show processlist" | grep -i "Locked" >> locked_log.txt for line in `cat locked_log.txt | awk '{print $1}'`
do
echo "kill $line;" >> kill_thread_id.sql
done
现在kill_thread_id.sql的内容像这个样子
kill 66402982;
kill 66402983;
kill 66402986;
kill 66402991;
.....
好了, 我们在mysql的shell中执行, 就可以把所有锁表的进程杀死了.
mysql>source kill_thread_id.sql
当然了, 也可以一行搞定
for id in `mysqladmin processlist | grep -i locked | awk '{print $1}'`
do
mysqladmin kill ${id}
done
如果要查看阻塞语句的话,只需要将上面的”Locked”修改成”Sending”即可。
By admin
read moreshell脚本检测和检查mysql数据库是否存在坏表
此脚本的主要用途是检测mysql服务器上所有的数据库或者单独数据库中的坏表,适用于RHEL/Centos系列
#!/bin/bash
#此脚本的主要用途是检测mysql服务器上所有的db或者单独db中的坏表
#变量说明 pass mysql账户口令 name mysql账号名称 data_path mysql目录路径 directory_list 目录列表 file_list文件列表 db_name 数据库名称 repair_count单库中待修复的表总数
#变量说明 repair_count_all所有库中待修复的表总数 mysql_version mysql版本 _file_name 数据表名称
echo -e "此脚本的主要用途是检测mysql服务器上所有的数据库或者单独数据库中的坏表\n\n"
pass=123456
name=root
read -p "输入mysql存储路径: " choose
data_path=$choose
unset choose
read -p "请输入mysql命令路径: " mysql_version
#标准输入、标准输出、标准错误输出的文件标示符 由 0、1、2标识
read -p "请选择是检查服务器上所有数据库还是指定的数据库 1:检查全部数据库 2:只检查指定数据库: " choose
if [ $choose == 1 ]; then
cd $data_path
for directory_list in $(ls)
do
if [ -d $directory_list ];then
if [ "mysql" != "${directory_list}" -a "test" != "${directory_list}" ];then
cd ${directory_list}
echo "当前检查数据库为:"${directory_list}
for file_list in $(ls *.frm)
do
_file_name=${file_list%.frm}
echo -e "\n" >> /tmp/check_table_all.log
${mysql_version} -h 127.0.0.1 -u${name} -p${pass} -e "check table "${directory_list}.${_file_name} 2>&1 >> /tmp/check_table_all.log
done
cd ..
fi
fi
done
cat /tmp/check_table_all.log | grep "Table is marked as crashed" > /tmp/check_table_repair.log
repair_count_all=` awk 'END{print NR}' /tmp/check_table_repair.log `
echo -e "所有数据库用有${repair_count_all}张表需要修复!"
more /tmp/check_table_repair.log
else
read -p "请输入要检查的数据库名称: " db_name
cd ${data_path}/${db_name}
for file_list in $(ls *.frm)
do
_file_name=${file_list%.frm}
echo -e "\n" >> /tmp/check_${db_name}.log
${mysql_version} -h 127.0.0.1 -u${name} -p${pass} -e "check table "${db_name}.$_file_name 2>&1 >> /tmp/check_${db_name}.log
done
cat /tmp/check_${db_name}.log | grep "Table is marked as crashed" > /tmp/check_${db_name}_Repair.log
repair_count=`awk 'END{print NR}' /tmp/check_${db_name}_Repair.log`
echo -e "${db_name}中共有${repair_count}个表需要修复!\n "
more /tmp/check_${db_name}_Repair.log
fi
By admin
read more环境: CentOS7.1 X64 MySQL5.7.10 PHP7.0.4 Tengine/2.1.2 (nginx/1.6.2)
参考: http://blog.haohtml.com/archives/15340
一。安装常用扩展库
sudo yum -y install gcc gcc-c++ autoconf libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel zlib zlib-devel glibc glibc-devel glib2 glib2-devel bzip2 bzip2-devel ncurses ncurses-devel curl curl-devel e2fsprogs e2fsprogs-devel libidn libidn-devel openssl openssl-devel openldap openldap-devel nss_ldap openldap-clients openldap-servers libevent libevent-devel libcurl libcurl-devel net-tools
sudo yum -y install libmcrypt libmcrypt-devel libaio
如果通过Yum安装不了libmcrypt的话,直接源码编译
wget -O libmcrypt-2.5.8.tar.gz "http://downloads.sourceforge.net/mcrypt/libmcrypt-2.5.8.tar.gz?big_mirror=0"
tar zxvf libmcrypt-2.5.8.tar.gz
cd libmcrypt-2.5.8
./configure
make
sudo make install
添加www用户,php-fpm和nginx统一使用此用户
sudo groupadd www
sudo useradd -g www www
===========================
By admin
read more软件版本: 操作系统:ubuntu10.04 内核版本:Linux version 2.6.32-36-generic git 版本:git version 1.7.0.4
目录:
1. 文件状态
一般仓库中的文件可能存在于这三种状态:
1)Untracked files → 文件未被跟踪; 2)Changes to be committed → 文件已暂存,这是下次提交的内容; 3) Changes bu not updated → 文件被修改,但并没有添加到暂存区。如果 commit 时没有带 -a 选项,这个状态下的文件不会被提交。
$git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# new file: file2
#
# Changed but not updated:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: file
#
# Untracked files:
# (use "git add <file>..." to include in what will be committed)
#
# file3
2. 提交
By admin
read morepackage main
import "fmt"
func main() {
data := make(chan int) // 数据交换队列
exit := make(chan bool) // 退出通知
go func() {
for d := range data { // 从队列迭代接收数据,直到 close 。
fmt.Println(d)
}
fmt.Println("recv over.")
exit <- true // 发出退出通知。
}()
data <- 1 // 发送数据。
data <- 2
data <- 3
close(data) // 关闭队列。
fmt.Println("send over.")
<-exit // 等待退出通知。
}
输出结果:
1
2
3
send over.
recv over.
而如果将上面与 exit chan有关的三行删除掉,则结果为:
By admin
read more对于 chan 介绍见: https://github.com/astaxie/build-web-application-with-golang/blob/master/zh/02.7.md
这里我们主要通过实例来介绍对chan的理解及用法.
实例1:
func main() {
ci := make(chan int)
ci <- 4
value := <-ci
fmt.Println(value)
}
执行结果错误为:
fatal error: all goroutines are asleep - deadlock! goroutine 1 [chan send]:
从上面“fatal error: all goroutines are asleep - deadlock!” 这句我们可以看出是groutings 阻塞了,这里为写阻塞,从“goroutine 1 [chan send]”可以看出来。
这一点文档里已经说明阻塞的原因了:
默认情况下,channel接收和发送数据都是阻塞的,除非另一端已经准备好,这样就使得Goroutines同步变的更加的简单,而不需要显式的lock。所谓阻塞,也就是如果读取(value := <-ch)它将会被阻塞,直到有数据接收。其次,任何发送(ch<-5)将会被阻塞,直到数据被读出。无缓冲channel是在多个goroutine之间同步很棒的工具。
解决办法:
我们只要将其中发送方(写)或者读取方(读)放到一个goroutine里就可以了,这样主程序main()里与goroutine通过channel来通讯即可。
func main() {
ci := make(chan int)
go write(ci)
value := <-ci
fmt.Println(value)
}
func write(c chan int) {
c <- 4
}
-–-–-–-–
By admin
read more为了在团队里搭建统一的本地开发环境,最近花了点时间用了下vagrant和docker,在此做个记录, 这也算一个DevOps的实践。
Vagrant 是一款用来构建虚拟开发环境的工具,非常适合 php/python/ruby/java 这类语言开发 web 应用,“代码在我机子上运行没有问题”这种说辞将成为历史。
我们可以通过 Vagrant 封装一个 Linux 的开发环境,分发给团队成员。成员可以在自己喜欢的桌面系统(Mac/Windows/Linux)上开发程序,代码却能统一在封装好的环境里运行,非常霸气。
以上介绍直接抄自网络,我觉得介绍的很到位。
「注意点:」
vagrant up命令执行后,如果看到下面的错误信息,则需要安装另外一个工具:
[default] The guest additions on this VM do not match the installed version of VirtualBox! In most cases this is fine, but in rare cases it can prevent things such as shared folders from working properly. If you see shared folder errors, please make sure the guest additions within the virtual machine match the version of VirtualBox you have installed on your host and reload your VM.
By admin
read more