Erlo

[PHP] 2018年终总结

2019-01-02 11:02:39 发布   2907 浏览  
页面报错/反馈
收藏 点赞

去掉敏感信息后的不完整版

==========================================================================
2018年12月29日 记录:

目前在维护的最低PHP版本只有5.6了:
1.5.6.39版本
convert.quoted-printable-encode过滤器时核心的segfault错误
imap扩展的错误
phar扩展的错误,PharData类提供了一个访问和创建不可执行的tar和zip存档的高级接口
5.6.38版本
apache2的头信息Transfer-Encoding:chunked的XSS bug
5.6.37版本
exif扩展修复了堆缓冲区溢出,exif扩展可以获取图像元数据

 

==========================================================================
2018年12月28日 记录:

mysqldump客户端逻辑备份程序,可以生成一组sql或csv,文本,xml
1.如果不使用--single-transaction选项,mysqldump至少需要SELECT权限,SHOW VIEW,TRIGGER和LOCK TABLES权限
2.对于大规模备份和还原,物理备份更合适,以原始格式复制数据文件,可以快速恢复
3.表主要是InnoDB表考虑使用MySQL Enterprise Backup产品的mysqlbackup命令;主要MyISAM表,考虑使用mysqlhotcopy
4.mysqldump默认是逐行检索,要启用内存缓冲,使用--skip-quick,此时如果是大表内存会可能有问题

join语法,外部连接优化:
如果LEFT JOIN中ON或USING部分中的右表没有匹配的行,则将所有列设置为NULL的行用于右表。您可以使用此事实在表中查找在另一个表中没有对应项的行:
SELECT left_tbl.*
FROM left_tbl LEFT JOIN right_tbl ON left_tbl.id = right_tbl.id
WHERE right_tbl.id IS NULL;

==========================================================================
2018年12月27日 记录:

1.vscode配置PHP IntelliSense

左下角齿轮==>settings==>extensions==>PHP==>
{
"php.executablePath": "D:/phpServer/php70n/php.exe"
}

2.log_format记录post数据
log_format mail_test_log escape=json 'postdata= $request_body';
server {
access_log /var/log/nginx/default.access.log mail_test_log;
}

双引号会被转成x22,escape=json可以解决
3.
nginx的内置变量
$time_local 格式化的时间
$request 请求地址
$status 响应码
$body_bytes_sent 传送页面的字节数
$http_referer 来源地址
$http_user_agent 客户端UA
$document_root 当前文件的目录绝对地址,比如:/var/www/html
$fastcgi_script_name 当前url的绝对地址,比如:/info.php
$request_filename 当前请求文件的绝对物理地址,基于root和alias指令,比如:/var/www/html/info.php
$http_cookie cookie信息

4.nginx的if判断语句
-e 文件或目录存在, !-e 文件或目录不存在,== 等值判断 , ~正则匹配返回true(区分大小写),~*正则匹配返回true(不区分大小写)
-f 文件是否存在,-x文件是否可执行
5.
nginx的path_info传递过来的参数,打印$_SERVER
["PHP_SELF"]=>
string(17) "/index.php/232323"
["PATH_INFO"]=>
string(17) "/232323"


==========================================================================
2018年12月26日 记录:

1.linux都会将内存充分利用,将一些程序调用过的硬盘数据读入内存(buffer/cache);物理内存是真正的硬件提供的内存,虚拟内存是虚拟出的一块逻辑内存,被称为交换空间(swap space)
2.buffers和cached都是内存操作,保存系统曾经打开过的文件以及文件属性信息
3.buffers是缓冲块设备做的,只记录文件系统的元数据,cached是给文件内容做缓冲
比如用find查找后buffer大量增加;用cat读取文件后cached大量增加
4.内存释放: /proc是虚拟文件系统;可以通过修改他下面的文件作为与kernel实体间进行通信的手段
echo 3 >/proc/sys/vm/drop_caches

log_format指令:
"log_format" directive is not allowed here ,只能放在http块下,不能放在server块

==========================================================================
2018年12月25日 记录:

1.
socket_create ( int $domain , int $type , int $protocol )
domain:
AF_INET基于IPv4的Internet协议。
AF_INET6基于IPv6的Internet协议。
AF_UNIX本地通信协议族。高效率和低开销使其成为IPC(进程间通信)的一种很好的形式。
type:
SOCK_STREAM(TCP字节流),SOCK_DGRAM(UDP数据报),SOCK_RAW(ICMP的ping程序)
protocol:
SOL_TCP,SOL_UDP
2.
getprotobyname()获取下各个协议对应的数字
/etc/protocols 在这也能看到对应的数字
ip:0 icmp:1 ggp:3 tcp:6 egp:8 pup:12 udp:17 hmp:20 xns-idp:22 rdp:27

3.vim在当前行迅速插入到下一行,普通模式下按o
4.php.ini中的variables_order参数EGPCS (Environment, Get, Post, Cookie, and Server),会影响这些变量$_SERVER $_POST, $_ENV, $_GET, $_COOKIE
5.一个字符串中关键词会出现多次,我怎么才能做到替换关键词的时候 只替换一次,并且要随机位置;explode拆分开,随机拼新的字符串进去
6.mysql使用各种字符集存储数据,是一组符号和编码,排序规则是用于比较字符集中的字符的一组规则,并根据各种排序规则进行比较

==========================================================================
2018年12月24日 记录:

异步 API 的设计:
POST /stars 直接返回成功和location字段返回查询进度的api
轮询 GET /queue/12345,查询当前的进度

redis的hash:
1.hmset user:1000 username taoshihan birthyear 1991 verified 1 //设置hash中的多个域
2.hget user:1000 username //hget是取回单个域
3.hgetall user:1000 //hgetall取回所有域
4.hmget user:1000 username birthyear //hmget取回多个域

1.NGINX Unit是个动态应用程序和web服务器,可以在不中断服务的情况下完成部署配置更改,以多种语言运行代码
2.共享内存是常用的进程间通信,两个进程可以直接共享访问同一块内存区域。Shared Memory没有同步机制,需要自己协商处理
3.Buildroot使嵌入式Linux变得简单

==========================================================================
2018年12月21日 记录:

MySQL Native Driver,MySQLnd是用C语言编写的PHP扩展。替代原来的(libmysqlclient)mysql client library

==========================================================================
2018年12月20日 记录:

1.mysql数据库的user表保存了所有mysql账号和密码
2.show grants可以查看所有赠予的权限,使用revoke可以撤销权限
GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION
GRANT PROXY ON ''@'' TO 'root'@'localhost' WITH GRANT OPTION
sql注入漏洞和代码中的输出有关

3.高位字节M、低位字节L:一个16位(双字节)的数据0x2211 22是高位字节 11是低位字节
32位的数据,比如 0x3F68415B 3f68是高位字节 4158是低位字节,这个数据被存到内存的时候有可能高位在前 高位优先 ,高位在后 低位优先
0x1234567的大端字节序是0123 4567,小端字节序是6745 2301

4.[^abc]正则是查找所有不在中括号之间的字符,那么[^ ]这个就是查找所有不是空格的字符
5.通过人工建立一个根目录,通常称为(chroot)jail,你可以从根本上阻止程序访问或者修改(可能是恶意的)文件以外的目录。
比如建立了这样的目录/home/sam/jail ,在jail用户看来,他就是/
6.将include的文件放在配置为拒绝Web服务器访问的文件夹中
禁止非法引用的简单方式
<?php define('APPLICATION', true); ?> <?php if (!defined('APPLICATION')) exit; ?>
7.md5和sha1不适合密码,MD5,SHA1和SHA256之类的散列算法设计得非常快速和高效很容易被人暴力反解,两个考虑因素是计算费用和盐
crypt()函数

==========================================================================
2018年12月19日 记录:


1.过滤shell命令中的特殊字符:
$a="`ifconfig`";
$a=escapeshellcmd($a);
$res=system($a);
var_dump($res);
shell_exec — 通过 shell 环境执行命令,并且将完整的输出以字符串的方式返回。

2.字节:存储容量的计量单位,一个字节等于8位,0x2211是十六进制是二进制0b00100010 00010001,两个8位也就是两个字节

3.mysql拆分字符串的函数+计算字符长度的函数
select length(substring_index(path,"/",5)) from user;

 

5.
sqlmap.py -u "http://115.159.28.111/test/db.php?id=1" --batch --tables //列出所有的表
sqlmap.py -u "http://115.159.28.111/test/db.php?id=1" --batch --schema //列出所有表的表结构
sqlmap.py -u "http://115.159.28.111/test/db.php?id=1" --batch -D pan --dump -T drama //获取表的数据
//设置cookie请求
sqlmap.py -u "http://entadmin.sina.net/control/mg_mlist.php?flag=1&id=&act=&flag=1&pagecount=20&pagetotal=&findval=2&findfld=findemail" --batch --tables --cookie "d=1; modewindow=PRINT; language=cn; mon=0; quotasize=10485760; SINA_USER=tony72%40luobo.sina.net; SPRIAL=b75abf80646ade46aabf8118653bb541; hpid=C6MTlB-rH1tylZsMzVsk6Vsy9YD_55tXp6D79UAMeTE_LTAx5TB-vUD05Yr_9T1nZIC0VUB05Y-aiLDNvUD79UAMeTE_LTA05L1j5KD_YU1nfTFyE41nfTFyE4vnWZD_pUrNtPDMlTDM9Y; SID=BbHkrkCZCwCMZlSED5lSTbT.%2154E.qlUET4U8%40KLb%214DE88ZETCE48T.T4.44CiZrSSL7-M47rDkll45SZSEZEZK7TZK4; sn=nWZD_pUrNtPDMlTDM9YC6MTlB-6om1nfTFyE4v; PHPSESSID=drcmfmv0truar5njqihhcmc627; __guid=216626370.578084966931658100.1545201942810.3057; monitor_count=1"


==========================================================================
2018年12月18日 记录:

1.
xss攻击一个常用的方法就是注入HTML元素执行js脚本,前端展示时进行过滤
<object data="data:text/html;base64,PHNjcmlwdD5hbGVydCgiSGVsbG8iKTs8L3NjcmlwdD4=">

 

3.
in_array ( mixed $needle , array $haystack [, bool $strict = FALSE ] )
第三个参数是true,就检测类型,否则不检测

4.array_flip — 交换数组中的键和值,返回一个反转后的 array,例如 array 中的键名变成了值,而 array 中的值成了键名。
$arr=array_flip($haystack);
if ( isset($arr[$needle]) ) 判断是否存在在数组中

5.array_map — 为数组的每个元素应用回调函数
因为in_array不区分大小写,所以使用这个对数组的所有元素转成小写
return in_array(strtolower($needle), array_map('strtolower', $haystack));

2019年2-7~9 阳光PHP峰会
API开发;中间件;安全;区块链;DevOps;渐进式Web应用程序(PWA);持续交付;数据库;
Javascript ;PHP核心;单元测试;UI / UX;异步PHP;可扩展性;团队开发

 

==========================================================================
2018年12月17日 记录:

htmlentities — 将字符转换为 HTML 转义字符,对所有html实体转义
htmlspecialchars只是对 < > " ' &进行转义

 

==========================================================================
2018年12月14日 记录:

 

查询45天以前没有登录的邮箱:
strtotime('-45day')

mysql输入查询:
SELECT VERSION(), CURRENT_DATE;

php mysql查询超内存:
$db->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, false);不缓存结果
$sql = "select * from ent_lastlogin "
. "where time <'2018-10-30'";
$uresult = $db->query($sql);
if ($uresult) {
while ($r = $uresult->fetch(PDO::FETCH_ASSOC)) {}

==========================================================================
2018年12月13日 记录:

 

1.PATH_INFO是一个CGI 1.1的标准,不要误解为nginx的功能
2.PHP对该标准进行了支持,PHP中有两个pathinfo,环境变量$_SERVER['PATH_INFO'];pathinfo() 函数
3.pathinfo() 函数以数组的形式返回文件路径的信息,先不管它
4.nginx的配置项是对$_SERVER['PATH_INFO]值进行设置,如果不配置默认是没有的
5.因为路径部分是这样的index.php/111,所以location ~ .php {} 把php后面的$必须以php结尾去掉
6.传递PATH_INFO参数:
fastcgi_param PATH_INFO $fastcgi_path_info; 此时
["PHP_SELF"]=>string(3) "NFO"
["PATH_INFO"]=>string(3) "NFO"
7.
fastcgi_split_path_info ^((?U).+.php)(/?.+)$;此时
["PATH_INFO"]=>"/111"
["PHP_SELF"]=>"/index.php/111"
8.重写隐藏index.php,如果请求的是文件名才重写
if (!-e $request_filename) {
rewrite ^/(.*)$ /index.php/$1 last;
break;
}
此时:
["PATH_INFO"]=>"/111"
["PHP_SELF"]=>"/index.php/111"

GNU AWK 的用户指南

==========================================================================
2018年12月12日 记录:

 

调试nginx rewrite
1.rewrite_log on;会发送相关notice日志到error_log的文件里
2018/12/12 11:09:58 [notice] 10987#10987: *1 "info.html" matches "/info.html", client: 218.30.113.42, server: 115.159.28.111, request: "GET /info.html HTTP/1.1", host: "115.159.28.111"
2018/12/12 11:09:58 [notice] 10987#10987: *1 rewritten data: "/info.php", args: "", client: 218.30.113.42, server: 115.159.28.111, request: "GET /info.html HTTP/1.1", host: "115.159.28.111"
2.设置error_log的日志级别为debug
3.只记录自己的ip
events {
debug_connection 1.2.3.4;
}

凡人皆有一死 ,凡人皆须侍奉
动不动就觉得一年比一年差的,是因为你年龄一年比一年大了,越来越需要钱了,偏偏发现财富自由离自己太远。
回到刚毕业的时候,就算变天了你还会觉得很兴奋,百度一下“行业寒冬”,你就就会发现2014、2015、2016、2017、2018年年都寒冬。哪年不过冬了?哪年各位的薪资没涨的?哪年各位生活质量有下降的?

==========================================================================
2018年12月11日 记录:

postfix配置测试smtp
修改 /etc/postfix/transport
然后执行 postmap /etc/postfix/transport,
再执行postfix reload

 

1.PHP开发团队宣布即将推出PHP 7.0.33。此版本中修复了五个与安全相关的问题。
善恶的彼岸,当你凝视深渊时,深渊也在凝视着你。凡不能毁灭我的,必使我强大。
2.PHP的imap扩展安装 apt-get install php-imap
版本7.0.33 18年12月6日
核心:修复了错误#77231(使用convert.quoted-printable-encode过滤器时的Segfault错误)。
IMAP:修正了错误#77020(imap_mail中的空指针取消引用)。
修复了错误#77153(imap_open允许通过mailbox参数运行任意shell命令)。
Phar:修复了错误#77022(PharData始终使用模式0666创建新文件)。
修复了phar_parse_pharfile中的错误#77143(堆缓冲区溢出(READ:4))。
3.为了快速处理静态数据集,例如服务器名称,映射指令的值,MIME类型,请求头字符串的名称,nginx使用哈希表。
4.access_log syslog:server=[2001:db8::1]:12345,facility=local7,tag=nginx,severity=info combined;配置nginx日志到syslog

==========================================================================
2018年12月10日 记录:

 

讲清楚技术方案:
1.介绍需求背景
2.介绍整体技术方案
3.介绍协议和库表结构

fpm:FastCGI Process Manager 是一种替代的PHP FastCGI实现,对于负载较重的站点非常有用。
1.先进的进程控制,优雅的停止启动
2.能够使用不同的uid/gid/chroot/environment启动worker,使用不同的php.ini,监听不同的端口
3.stdout stderr日志记录
4.opcode cache破坏的情况下紧急重启
5.加速上传支持
6.slowlog慢日志记录脚本,可以记录PHP跟踪和远程进程的execute_data, ptrace或者类似工具读取和分析
7.fastcgi_finish_request()刷新所有数据,当在做耗时操作的时候,比如视频转换和统计处理,在fastcgi_finish_request()之后,该脚本仍将占用FPM进程。因此,对于长时间运行的任务过度使用它可能会占用所有FPM线程,直到pm.max_children
8.动态静态子进程产生
9.基础的SPAI状态,基于php.ini的配置文件

php-fpm开启慢查询日志:
/etc/php/7.0/fpm/pool.d/www.conf
slowlog = /var/log/php-fpm-$pool.log.slow
request_slowlog_timeout = 5

 

1.MySQL服务器支持200,000个表和大约5,000,000,000记录,每个表最多支持64个索引。每个索引可以包含1到16列或部分列。 InnoDB表的最大索引宽度为767字节或3072字节
2.mysqldump和mysqladmin,以及图形程序,如MySQL Workbench。 MySQL Server内置支持SQL语句来检查,优化和修复表。通过mysqlcheck客户端获得。 myisamchk,这是一个非常快速的命令行实用程序,用于在MyISAM表上执行这些操作。
3.mysql8.0 mysql系统数据库中的授权表现在是InnoDB(事务)表,可以回滚。以前,是MyISAM(非事务)表
4.caching_sha2_password身份验证插件,实现了SHA-256密码散列,使用缓存来解决延迟问题
5.MySQL现在支持角色,这些角色被命名为特权集合
6.MySQL现在维护有关密码历史的信息,从而限制了以前密码的重用

 

==========================================================================
2018年12月7日 记录:

nginx可以用信号控制:
kill -s HUP 8587 将HUP信号发送到主进程,使用新配置启动新的工作进程,正常关闭旧工作进程,即打开日志文件和新的侦听套接字。
kill -s USR2 8587 即时升级可执行文件

导入群发列表时有^M特殊字符:
$outEmail=(string)trim($outEmail); 强制转一下

1.vmstat指令查看操作系统每秒进程切换的次数。system-- -----in 每秒中断;cs 每秒上下文切换 数量
2.pcntl没有提供进程间通信的功能
pcntl不支持重定向标准输入和输出
pcntl只提供了fork这样原始的接口,容易使用错误


==========================================================================
2018年12月6日 记录:

RUP:统一软件开发过程,面向对象基于网络的程序开发方法论
UML:统一建模语言
OO设计的基本原则
单一原则:一个类只做一件事
开闭原则:对扩展开放,对修改关闭
里式替换:子类必须能够替换所有父类的使用
依赖倒置:设计依赖于抽象而不是实现
最少知识:对象应当尽可能少的去了解其他对象
接口隔离:接口倾向于小而多
组合优先:优先使用类的组合而不是继承
OOA面向对象分析 OOD面向对象设计 OOP面向对象编程

构造型设计模式:
单例模式,抽象工厂模式,构造者模式,原型模式,工厂方法模式

单例:
私有化构造方法
通过静态方法创建并保持对象
注意实例化方法需要线程安全
private static $instance;private function __construct(){}
public static function getInstance(){
if(self::instance==null) self::instance=new self();
return self::instance;
}
适用场景:类的对象全局唯一,节约频繁创建对象的资源开销,单例类必须是无状态的

抽象工厂模式:
使用与实现分离,调用方只依赖于业务逻辑接口,与具体实现无关
剥离调用者和实现的耦合,应对变化,典型案例:JDBC API & Driver
interface UserRepository{}
interface RepositoryFactory{public function createUserRepository()}
class MysqlRepositoryFactory implements RepositoryFactory{}
class MySqlUserRepositoryFactory implements UserRepository{}

构造者模式:
用于创建一个复杂对象,一个对象需要依赖于大量外部对象或者其他设置参数,通过构造方法创建太复杂
对象的创建非常复杂,总是需要很多配置和预先创建其他对象
class Query{}
class QueryBuilder{ return $this}
(new QueryBuilder())->addSelect()->addWhere()->build()->getResult();

==========================================================================
2018年12月5日 记录:

 

stream_get_meta_data - 从流/文件指针中检索标头/元数据
返回结果:timed_out (bool)如果流在等待最后一次调用fread()或fgets()时的数据时超时,则为TRUE。

1.LVS可以使用IP负载平衡技术或应用级负载均衡技术。通过透明地添加或删除集群中的节点来实现系统的可伸缩性。
2.IPFW是比较老的Linux内核版本提供的防火墙软件包,Ipchains替代Ipfwadm,提供了更为严格的包过滤控制机制,Iptables是一个管理内核包过滤的工具
3.基于DNS的负载均衡,不合适,不平衡,因为有TTL时间的存在,会有段时间每个用户固定访问某个IP
4.基于调度程序的负载均衡,分为两个级别 应用级和IP级,应用级比如分配HTTP到集群,当负载很高时,应用级将会成为新的瓶颈.IP级的开销很小
5.有三种负载方法NAT(网络地址转换),TUN(ip隧道),DR(直接路由);nat和fullnat的区别是解决了跨虚拟局域网的问题

=========================================================================
2018年12月4日 记录:

 

1.LVS:Linux Virtual Server Linux虚拟服务器,是一组服务器,核心是ip_vs代码, 运行在LVS director,director是一个四层交换,相当于一个路由器,接收客户端请求分配给后端realservers服务器

2.网络地址转换(NAT):内网的主机想通过互联网被外网访问,需要进行网络地址转换;从一组地址到另一组叫N-to-N静态网络地址转换;当映射是M-to-N M>N时是动态网络地址转换;网络地址端口映射是NAT的一个扩展,在这里很多的地址和端口被映射到单个地址和端口,N-to-1的映射

 

==========================================================================
2018年12月3日 记录:


1.DNS服务器的IP地址:cat /etc/resolv.conf
2.DNS的通信过程:
tcpdump -i eth0 -s 0 -n -l port 53

10:44:10.203166 IP 10.105.38.204.47751 > 10.236.158.114.53: 44627+ A? www.huiful.com. (32)
我的IP地址10.105.38.204端口47751向DNS服务器的10.236.158.114端口53发送请求
44627是我这个请求的标识,+代表启用递归查询,A?表示A类型的查询,32代表DNS查询报文长度

3.DNS的响应
10:44:10.203634 IP 10.236.158.114.53 > 10.105.38.204.47751: 44627 1/0/0 A 123.207.167.115 (48)
44627和请求对应,1/0/0 1个应答资源 0个授权记录 0个额外信息记录 A记录IP地址 48是报文长度

host -t A www.baidu.com的DNS查询过程:
IP 10.105.38.204.39732 > 10.236.158.106.53: 11431+ A? www.baidu.com. (31)
IP 10.236.158.106.53 > 10.105.38.204.39732: 11431 3/0/0 CNAME www.a.shifen.com., A 115.239.210.27, A 115.239.211.112 (90)

4.TCP协议更靠近应用层,因此在程序中有更强的互操作性,一些socket选项都和TCP有关
5.TCP头部信息,TCP状态转移过程,TCP数据流(交互数据流,成块数据流,紧急数据),TCP数据流的控制(超时重传,拥塞控制)
6.TCP协议通信必须先建立连接,连接是双全工的,双方的数据读写通过一个连接进行,交换完成后,都必须断开连接.
7.TCP的连接是一对一的,因此基于广播和多播(目标多个主机)的程序不能使用,udp非常适合广播和多播
8.字节流服务:发送端执行多次写操作,TCP模块先放入发送缓冲区,真正发送时可能被封装成一个或多个TCP报文段发出;接收端先放入TCP接收缓冲区,然后再一次或多次读出,用户指定的程序读缓冲区的大小
9.udp是数据报服务:发送端每发送一个,接收端就要接收一个
10.TCP头部结构:指定源端端口,目的端端口,管理TCP连接

门诊系统:
electron vue vuex 界面就是elementui

360浏览器侧边翻译插件

==========================================================================
2018年11月30日 记录:

1.ICMP协议并非完全意义上的网络层协议,它使用同一层的IP协议提供的服务
2.传输层提供端到端(end to end)通信,只关心起始端和目的端,与网络层使用逐跳不同
3.TCP协议为应用层提供可靠的面向连接的基于流的服务,使用超时重传,数据确认保证可靠性,基于流的数据没有长度边界限制,源源不断流入,读出
4.UDP提供不可靠,无连接,基于数据报的服务
5.DNS协议即使用了TCP服务,又使用了UDP服务,/etc/services可以看到知名应用层协议,使用了哪些传输层协议
6.封装,协议栈依次从上往下传递,每经过一层就加上自己的头部信息,TCP封装后的有TCP头部信息,TCP内核缓冲区,共同构成了TCP报文段
7.数据链路层封装的称为帧,以太网上的叫以太网帧,令牌环网络上的则是令牌环帧
8.分用,协议栈自底向上依次传递
9.ARP协议可以将网络层地址到任意物理地址转换,从IP地址到MAC地址转换
10.ARP高速缓存,把经常访问的机器的IP地址到物理地址的映射缓存起来,避免了重复的ARP请求

PCRE(Perl Compatible Regular Expressions)是一个Perl库,包括 perl 兼容的正则表达式库。

==========================================================================
2018年11月29日 记录:

PHP default_socket_timeout配置:
控制file_get_contents的超时时间

stream_socket_client ( string $remote_socket [, int &$errno [, string &$errstr [, float $timeout = ini_get("default_socket_timeout") [, int $flags = STREAM_CLIENT_CONNECT [, resource $context ]]]]] )

timeout
Number of seconds until the connect() system call should timeout.

1.从单页应用(SPA)到服务器渲染(SSR)
2.编译器原理和技术涉及到程序设计语言,计算机体系结构,语言理论,算法,软件工程
3.编译器是一个程序,将某种语言(源语言)编写的程序翻译成一个与之等价的另一种语言(目标语言)编写的程序,翻译的过程中可以报告错误,编译器的早期工作集中在如何把算数表达式翻译成机器代码

==========================================================================
2018年11月28日 记录:

1.网络编程:通过计算机网络与其他程序通信,相互通信的程序中一方为client,一方为server
2.两种网络编程API:socket和XTI,AT&T(美国电话电报公司)传输层接口TLI进行修改的产物
3.usenet新闻组就是论坛,ANSI C是美国国家标准组织(ANSI)和国际标准组织ISO推出的C语言标准
4.C语言标准化:ANSI C==>C89,C90差不多是一个==>C99==>C11
5.POSIX可移植操作系统接口,定义了操作系统应该为程序提供的接口标准,系统调用和库函数只是实现上的细节不同,通常对开发人员是透明的
6.IPv6:互联网工程任务组设计的新版本IP协议,号称可以为每一粒沙子编上网址,IPv6长度128b,表示方法有,冒分十六进制,0位压缩表示法,内嵌IPv4地址表示法
7.web和服务器通信使用应用协议HTTP,在传输层使用TCP协议,TCP又使用了网络层IP协议,IP则使用了某种数据链路层通信
8.两个不同局域网的客户和服务器,使用路由器router连接到广域网的,最大的广域网是因特网


print_r(01234==1234) false,0开头是八进制,0x开头是十六进制,0b开头是二进制
yigoubao的密码规则:md5(md5($password) . 'yoshop_salt_SmTRx')
php -r "echo md5(md5('admin123') . 'yoshop_salt_SmTRx');"

==========================================================================
2018年11月27日 记录:

企管系统个性登录页左侧菜单无法点击:
查找样式问题,在审查元素里挨个删除html元素,就能查询到影响的div,进而定位到css

域名反向解析即从IP地址到域名的映射:
系统提供一个特别域,该特别域称为逆向解析域

企管nginx改造:

==========================================================================
2018年11月26日 记录:

系统开发统计读取阿里云的使用情况:

swoole的三种运行模式:base模式,线程模式,进程模式
IO:BIO阻塞IO;NIO非阻塞IO,同步IO;异步IO
IO组合:同步阻塞IO;同步非阻塞IO;异步阻塞IO;异步非阻塞IO
IO操作:发起IO请求;实际IO操作
阻塞和非阻塞区别:第一步发起IO请求是否会被阻塞
同步和异步区别:第二步实际IO读写是否会被阻塞

BIO:
while true
accept
多线程处理读写

PHP之道:https://laravel-china.github.io/php-the-right-way/

__set是个不存在的属性赋值,两个参数__set($k,$v),属性名和属性值
__get读取不存在属性时

$obj->test="aaa", __set("test",'aaa'),属性中放个数组,arr["test"]="aaa"
echo $obj->test ,__get("test"),arr["test"]


==========================================================================
2018年11月23日 记录:

 

==========================================================================
2018年11月22日 记录:

declare 结构用来设定一段代码的执行指令。declare 的语法和其它流程控制结构相似:
是一个在 declare 代码段中解释器每执行 N 条可计时的低级语句就会发生的事件
declare(ticks=1);
PHP进行信号管理,第二个参数是回调函数:
pcntl_signal(SIGUSR1, "sig_handler");
给进程发送信号:
posix_kill ( int $pid , int $sig )

1.curl post数据:
curl "http://120.78.219.34:8018/accountapi/getSms" -d "tel=18812341234"
2.ab -r遇到socket错误时跳过

kill -l:linux进程的所有信号

==========================================================================
2018年11月21日 记录:

 

1.is_object — 检测变量是否是一个对象
2.依赖注入,两个类依赖的时候,需要构造函数里传进去,构造函数注入
3.控制反转(IOC)是一种思想,依赖注入(DI)是实施这种思想的方法。
4.工厂模式注入,原本A类依赖B类和C类,现在变成了A依赖Factory,Factory依赖B和C。
5.高层模块不应该依赖于底层模块,两个都应该依赖抽象。抽象不应该依赖于细节,细节应该依赖于抽象
6.1、IaaS(基础设施即服务:Infrastructure as a Service)
2、PaaS(平台即服务:Platform as a Service)
3、SaaS(软件即服务:Software as a Service)
7.glusterFS 分布式文件系统

==========================================================================
2018年11月20日 记录:


sendid,mid
php魔术方法:
__construct()[构造], __destruct()[析构], __call()[调用不存在的方法], __callStatic()[调用不存在的静态方法],
__get()[获取不存在属性的值], __set()[为不存在属性赋值调用],
__isset()[isset不存在的属性], __unset()[unset不存在的属性], __sleep()[序列化对象的时候], __wakeup()[反序列化对象的时候], __toString(), __invoke(), __set_state(), __clone() 和 __debugInfo()

1.file_put_contents — 将一个字符串写入文件,LOCK_EX 在写入时获得一个独占锁。
读取时需要解锁
$myfile=fopen('test.txt','rt');
flock($myfile,LOCK_SH);
$read=file_get_contents('test.txt');
2.PHP-AOP扩展,面向切面编程,非侵入式的编程方法aop_add_after()函数的使用

==========================================================================
2018年11月19日 记录:

 

1.企邮日发信量100万,计划每天或每周一张表,根据sendid后面的日期进行对应
2.在读信接口里增加sendid字段
2.给前端定义一个接口,maildeliverystatus,只有已发送的邮件读信时会去调,把sendid传给我
3.我要拿着sendid去查表然后直接返回对应数字

c10k问题:单机一万并发连接问题
1.如果一个连接就创建一个进程或线程,资源消耗巨大
2.异步模式select/poll模型,select最大不能超过1024,poll没有限制但是每次收到数据都要遍历连接查看哪个连接有数据请求
3.epoll依赖linux,只返回状态变化的文件句柄,不会去遍历,效率更高了
4.libevent对事件接口进行了封装
5.协程,c语言中的coroutine,go语言中的goroutine,在少量线程的基础上进行调度

 

测试:单元测试,API测试,性能测试,持续集成,灰度发布
单元测试:人为规定的最小的被测功能模块,c语言是一个函数,java是一个类,图形软件是一个窗口
API测试:定位是服务对外输出的接口测试,偏重业务测试
性能测试:单接口压测和模拟用户行为的压测,ab压测,wrk压测;loadrunner,jmeter

ubuntu用户创建的目录下用root创建文件,ubuntu用户可以删除但是不能编辑覆盖

==========================================================================
2018年11月16日 记录:

 

100亿的文件统计ip的个数:
我设计一个简单的哈希函数是 f(ip) = ip % 10000,(ip 是个32位整数) 那么 5 % 10000 = 5,不管 5 在哪个地方 5 % 10000 的结果都是 5,这就保证了相同的 ip 会被放在同一个子文件中,方便统计,相同的元素经过同一个哈希函数,得出的哈希值是一样的。 那么我把100亿个 ip,都进行 ip % 10000 的操作,就完成了 100GB 文件分解成 10000个子文件的任务了。当然实际中哈希函数的选取很重要,尽量使得元素分布均匀,哈希冲突少的函数才是最好的。
10MB 的小文件里面存着很多 ip,他们虽然是乱序的,但是相同的 ip 会映射到同一个文件中来! 那么可以用二叉树统计出现次数,二叉树节点保存(ip, count)的信息,把所有 ip 插入到二叉树中,如果这个 ip 不存在,那么新建一个节点, count 标记 1,如果有,那么把 count++,最终遍历一遍树,就能找出 count 最大的 ip 了
3.设计api问题
4.如何防止扫密码
5.get和post的安全性问题和区别,长度的限制问题
6.
(1)http协议并未规定get和post的长度限制
(2)get的最大长度限制是因为浏览器和web服务器限制了URL的长度
7.如果一直用同一个错误密码,只计算一次,不会当成扫号。IP也不变的情况下
8.变量名随机
创建一个jwt token,里面绑定随机码
通过加密算法产生变量名
账号密码token一起传后台
9.动态平台在对北显七层配置进行灰度变更时,由于Nginx服务端口配置文件引用错误,导致七层流量分流错误,财经、邮箱等业务数据返回异常

==========================================================================
2018年11月15日 记录:

1.mysql的批量更新用法 case when
UPDATE `post` SET
`parent_id` = CASE `id`
WHEN '1' THEN '100'
WHEN '2' THEN '100'
END,`title` = CASE `id`
WHEN '1' THEN 'A'
WHEN '2' THEN 'A'
END WHERE `id` IN ('1','2','3','4','5')
2.MySQL提示“too many connections” ,sleep的连接太多了
MySQL配置文件/etc/my.cnf,设置成max_connections=1000,wait_timeout=5
3.MySQL server has gone away和wait_timeout有关系.两次sql执行间隔时间太长
所以在new PDO的时候,要根据wait_timeout的值判断,大于的就重新new,不大于的就单例返回
4.yield的生成器使用,每次只读一行数据,内存中始终只占一行数据
function readTxt(){
$handle = fopen("./test.txt", 'rb');
while (feof($handle)===false) {
yield fgets($handle);
}
fclose($handle);
}
foreach (readTxt() as $key => $value) {
echo $value.'<br />';
}

==========================================================================
2018年11月14日 记录:

 

nginx改造:
1./mnt/entmail/webapp目录权限和nginx执行用户权限

3.php.ini 设置upload_tmp_dir="/temp"

cron的日志位置/var/log/cron
开启cron日志:
vim /etc/rsyslog.d/50-default.conf
cron.* /var/log/cron.log

1.Epoll是poll的改进版,在高并发下能同时处理大量文件描述符,nginx使用了
2.Poll是监控资源是否可用,轮询整个文件描述符集合,例如在多个socket连接建立后,可以知道哪些连接发了请求,与select比不会清空文件描述符
3.Epoll只会查询被内核IO事件唤醒的集合,只有发生IO的socket会调用callback函数
4.文件描述符,一切皆文件网络是文件键盘是文件,像写文件那样传输网络数据,通过/proc/的文件看到进程的资源使用情况
5.

==========================================================================
2018年11月13日 记录:

 


File upload error - unable to create a temporary file
设置upload_tmp_dir="/temp" 然后重启环境就可以了,如果还不行就去看看文件夹的权限是否有权限,赋予写入权限就好了

nginx的请求处理:
1.worker进程中有个函数,无限循环,不断处理收到的客户端请求,并进行处理
2.系统提供的事件处理机制(select/epoll/kqueue)
3.接收数据,初始化HTTP Request ,处理请求头请求体
4.读取配置文件进行处理阶段,location rewrite filter等
5.产生响应发送给客户端

php调用这个库的应该都是短链接,然后这样是否也会发生切换过程中,数据写到老库,没有同步到新库的情况
短链接是不会发生这种情况

==========================================================================
2018年11月12日 记录:

Nginx 的特点:
1.处理静态文件
2.反向代理加速
3.fastCGI,简单的负载均衡和容错
4.模块化的结构
5.分阶段资源分配技术,使得它的 CPU 与内存占用率非常低,保持 10,000 个没有活动的连接,它只占 2.5M 内存
6.支持内核 Poll 模型,能经受高负载的考验,有报告表明能支持高达 50,000 个并发连接数
7.采用 master-slave 模型,能够充分利用 SMP 的优势,且能够减少工作进程在磁盘 I/O 的阻塞延迟。当采用 select()/poll() 调用时,还可以限制每个进程的连接数
8.强大的 Upstream 与 Filter 链,有点像 Unix 的管道
9.采用了一些 os 提供的最新特性如对 sendfile (Linux2.2+),accept-filter (FreeBSD4.1+),TCP_DEFER_ACCEPT (Linux 2.4+)的支持

Nginx 架构:
1.默认采用多进程后台模式启动,可以手动配置成单进程前台模式用于调试,进程数一般和cpu内核数相同,太多进程会导致竞争cpu资源,带来不必要的上下文切换
2.发送kill -HUP pid的信号给master进程,master进程会从新加载配置文件,启动新的worker进程,退出老的worker进程,也是-s reload所做的
3.在master进程建立好需要listen的 socket,然后fork出子进程,子进程抢accept_mutex的互斥锁,抢到的子进程进行 accept处理
4.每个子进程采用异步非阻塞事件处理, select/poll/epoll/kqueue的系统调用,设置超时时间,当事件没准备好时,放到 epoll 里面,事件准备好了,我们就去读写,当读写返回 EAGAIN(再试一次)时,我们将它再次加入到 epoll 里面,线程还是只有一个,在请求间进行不断的循环切换,这里的切换没有代价,只要内存够大就行
5.apache那种简单的多线程,每个请求会独占一个工作线程,当并发数上到几千时,就同时有几千的线程在处理请求占用内存大,线程间上下文切换占用的cpu开销大
6.事件处理通常包含,网络信号(异步非阻塞),信号,定时器(放在一颗维护定时器的红黑树里面)

nginx的connection
1.主进程监听端口创建socket,fork出子进程,子进程互斥锁竞争accept新的连接,三次握手建立连接以后,异步非阻塞读写事件处理,nginx或客户端主动关掉连接
2.每个进程都有连接数的限制,ulimit -n,超过时创建socket会失败
3.nginx能建立的最大连接数 worker_连接数*worker_进程数;作为反向代理时则为worker_连接数*worker_进程数 /2 ,nginx也要请求另外的处理服务占用一个连接
4.利用accept_mutex锁来平衡每个worker进程的连接数

nginx与keepalive
1.http1.0和http1.1都支持长连接,默认1.0是关闭的,1.1是打开的
2.http1.0需要指定Connection:keep-alive表示使用长连接,响应头中会包含content-length,客户端依据这个长度表示接收完成,否则会一直接收数据
3.http1.1不需要指定connection,响应头中Transfer-encoding 为 chunked则会是流式传输,每块会包含当前块的长度;如果非chunked则要有content-length,否则会一直接收直到服务端主动断开
4.keepalive_timeout 来配置超时时间,如果为0则会直接关闭,默认65秒

1.手写票一般我们叫做“普通发票”,机打票叫做“增值税普通发票”,发票需要去税务局买
2.增值税专用发票,可以进行税款抵扣,需要提供企业名称,纳税人识别号,地址,电话,开户银行,开户账号
3.增值税普通发票提供纳税人识别号,企业抬头

==========================================================================
2018年11月9日 记录:

自动回复的主题乱码:
1.原信的主题没有指定编码
2.可能是qq邮箱的问题

100万个URL如何找到出现频率最高的前100个:
1.放到数组里面,key是url,value是出现次数,排序
2.hash code 版本,hash和url关联起来
3.数据库实现法,伪哈希索引

==========================================================================
2018年11月8日 记录:

企邮webmail的跳转部分
企邮web读取阿里云双读上线

得到等N位为1其它位为0的数,可用1左移N位即得
得到等N位为0其它位为1的数,用前数位反一下即得

修改指定状态位为0,a&=~(1<<29)
修改指定状态位为1,a|=1<<29

beyound compare比较
http://www.94afx.com/a/diannaoruanjian/beyondcompare4.html

==========================================================================
2018年11月7日 记录:

HTTP message:HTTP报文,客户端服务器请求响应模型,是通过HTTP 报文的格式化数据块进行的
HTTP method:HTTP方法
GET:客户端向服务器请求获取资源
POST:客户端发送数据到服务端
PUT:客户端将数据存储到服务器中去
DELETE:从服务端删除命名资源
HEAD:客户端获取命名资源的HTTP头信息
HTTP/应用层==>TCP/传输层==>IP/网络层
HTTP/0.9 ==> HTTP/1.0 ==> HTTP/1.0+ ==>HTTP/1.1 ==> HTTP/2.0

web的结构组件:
1.代理:位于客户端和服务器之间,接收所有请求并转发给服务器
2.缓存:代理缓存或web缓存,下一次请求是缓存提供的服务
3.网关(gateway):将HTTP协议转成其他协议的服务,例如:HTTP/FTP HTTP转到PHP-FPM
4.隧道(tunnel):在HTTP连接上转发非HTTP协议的数据,例如:HTTP/SSL 在HTTP连接上传输SSL数据

 

==========================================================================
2018年11月6日 记录:

HTTP连接管理:
1.HTTP如何使用TCP连接的
2.TCP连接的时延,瓶颈,存在的障碍
3.HTTP的优化,并行连接,keep-alive,管道连接
4.HTTP就是HTTP over TCP over IP,HTTPS是HTTP和TCP之间插入放入TLS或者SSL
5.保持TCP连接的正确运行,四个值<源ip地址,源端口,目的ip,目的端口
6.HTTP时间线,请求=>DNS查询=>响应=>请求=>服务器处理=>响应=>关闭
7.TCP性能点:TCP连接建立握手(花费50%时间);
TCP延迟确认算法(占第二);
TIME_WAIT时延和端口耗尽(记录最近所关闭连接的IP地址和端口号,2MSL通常2分钟)
TCP慢启动拥塞控制;数据聚集的Nagle算法;

HTTP首部(head头信息)
1.通用首部:Date
通用缓存首部(Cache-Control)
2.请求首部:Accept
条件请求首部(if-),安全请求首部(Authorization)
3.响应首部:Server
4.实体首部(用于主体部分的首部):content-type:
5.扩展首部:非标准的,自己定义的

PHP的脚本执行还是会经过编译环节, 只不过它们一般会在运行的时候实时进行编译
1.启动PHP及Zend引擎, 加载注册的扩展模块
2.读取脚本文件,Zend引擎对脚本文件进行词法分析,语法分析。
3.编译成opcode执行

阿里云读取附件部分的双读改造
测试外发限制部分,有24分钟的缓存时间,php -i|grep "gc_maxlifetime" 1440秒

route add -net 100.118.0.0/16 gw 172.16.228.1 添加网络

==========================================================================
2018年11月5日 记录:

1.长链接和短链接的优缺点
2.tcp为啥是四次挥手
3.数据库的几大索引,联合索引的最左原则,btree和二叉树的区别
4.redis的底层数据类型,list,set
5.nginx的负载均衡策略,select和epoll的区别
6.统计日志中IP访问量前十的
7.PHP的执行过程opcode,生命周期
8.array函数shift和unshift的区别
9.手写算法顺时针矩阵横竖斜求和相等算法
10.手写二分查找算法
11.设计滴滴发单抢单查看订单系统,日活200w,redis挂了怎么办
12.设计销售BD系统,钉钉考勤签到功能实现,分级审核等功能
13.设计通用审核流的系统,请假啊 财务啊 之类的功能
14.rpc系统
15.http协议里面的499

100:客户端应该继续发送请求,表示服务器已经接受到了,继续请求
101:理解了客户端请求,并通过Upgrade消息头通知客户端采用新协议通讯,服务器发完后会切换到新协议
102:由webdav(rfc2518)扩展的状态码,代表处理将被继续执行
201:请求已经被实现,新的资源已经建立,uri随location头信息返回
202:服务器已经接受请求,但是不知道结果,异步的时候使用
203:成功处理但是返回的实体头部元信息不是原始服务器上的有效集合
204:成功处理,不返回实体,返回更新了的元信息
205:和204差不多,要求请求者重置文档


4xx系列的错误码是和客户端有关的
nginx自定义的状态码:
495, https certificate error
496, https no certificate
497, http to https
498, canceled
499, client has closed connection是客户端等到超时主动关掉的

 

1.分表的方式,是横向还是纵向,是以用户来分,还是以时间或者商家。 或者多维度,多维度的情况下,如何进行表数据之间的同步
2.查询订单,肯定是要有一定的时间限制,比如最近3个月的,其他的以一定的时间规则归档,查询时候是进入另外的数据表查询,没法查全部
3.缓存MEMCACHE 使用原子性操作add,实现并发锁
4.遇到大的问题,那么就缩小范围,限制住他的思路

==========================================================================
2018年11月2日 记录:

下午请假

==========================================================================
2018年11月1日 记录:

nginx切换改造项目,https测试支持问题改造
1.访问http://mail.sina.net
强制跳转问题
资源路径问题
页面内链接问题

 

安卓问题:
客户端现有问题是,修改密码后还会调用登陆接口,没有正常提示文本信息,退出也退出不了


==========================================================================
2018年10月31日 记录:

 

流媒体服务器(Nginx+rtmp)
docker下安装宝塔面板更安全

存储服务器-云盘
分布式文件系统
应用服务器
web服务器
数据库平台
反垃圾的网关服务
日志服务器-每天发送一次,各web服务器的syslog-ng

1.二叉查找树中的结点是2-结点(一个键两条链),引入3-结点(两个键三条链),即成2-3树;然后将2-3树中3-结点分解,即成红黑树,故结合二叉查找树易查找和2-3树易插入的特点,便成了红黑二叉查找树,简称红黑树。
2.B树每一个结点可以有几个到几千个孩子,降低树的高度,减少磁盘io,顶部几层被反复查询存在内存中,剩余的存在磁盘中
3.含n个结点的b树高度也是lgn,分支因子大,高度小很多,

==========================================================================
2018年10月30日 记录:

明天导一下应该修改密码的列表

 

排序算法:
非线性比较类:
交换排序
冒泡:平均O(n^2),最坏O(n^2) 最好O(n) 空间O(1) 稳定
快速:平均O(nlogn),最坏O(n^2),平均O(nlogn),空间O(nlogn) 不稳定
插入排序
插入:平均O(n^2),最坏O(n^2) 最好O(n) 空间O(1) 稳定
希尔:平均O(n^1.3),最坏O(n^2),最好O(n),空间O(1) 不稳定
选择排序
选择:平均O(n^2),最坏O(n^2),最好O(n^2),空间O(1) 不稳定
堆 :平均O(nlogn),最坏O(nlogn),平均O(nlogn),空间O(1) 不稳定
归并排序
二路归并:平均O(nlogn),最坏O(nlogn),平均O(nlogn),空间O(1) 稳定
多路归并
线性非比较类:
计数:平均O(n+k),最坏O(n+k),最好O(n+k),空间O(n+k) 稳定
桶:平均O(n+k),最坏O(n^2),最好O(n),空间O(n+k) 稳定
基数:平均O(n*k),最坏O(n*k),最好O(n*k),空间O(n+k) 稳定
稳定:原来a在b前面,a=b,排序后a任然在b前面 冒泡,插入,归并,计数,桶,基数
不稳定:a=b,排序前a在b前面,排序后可能在后面,快速,希尔,选择,堆
冒泡:
1.比较相邻元素,从第一个开始较大的逐渐往后移动,后面是所有已经排好序的了
2.for{for{}},arr[j]>arr[j+1]
选择:
1.两层循环,假定第一层循环的i元素是最小值,
2.内层循环找出比i还小的元素,交换下他们

1.按位& | ~ ^ 与或非 异或
2.&与运算 0&0=0 1&0=0 1&1=1
3.fgetss函数的bug,遇到<会把后面的所有内容都替换成空白
4.rpm -q dpkg -L 两个查询包命令的

==========================================================================
2018年10月29日 记录:

Redis Cluster的架构图:REmote DIctionary Server。
1.所有的redis节点彼此互联(PING-PONG机制)
2.节点的fail是通过集群中超过半数的节点检测失效时才生效
3.客户端与redis节点直连,不需要中间proxy层
4.redis-cluster把所有的物理节点映射到[0-16383]slot上(哈希槽)

Redis分布式锁:不同的进程必须以独占资源的方式实现资源共享
https://github.com/ronnylt/redlock-php/
1.社区给了个redlock锁的实现类
2.最低实现就是独享,无死锁,容错
3.当前时间,随机值,依次尝试的实现

Redis与其他key-value存储有什么不同?
1.复杂的数据结构并且提供对他们的原子性操作
2.运行在内存中但是可以持久化到磁盘
3.键值对越多开销越大,放到一个key里就小很多
4.采用多个Redis节点通过客户端Hash的办法解决了大数据集分配的问题
5.访问MySQL的数据只能通过主键(ID) 。执行查询操作时,通过Redis读取数据;使用redis的数据结构创建二级索引

分布式理解:
1.一个需要巨大资源的计算分成小的部分,分配给多台独立的服务器,计算结果综合后得到最终结果
2.分布式网络存储技术是将数据分散的存储于多台独立的机器设备上

顺时针打印矩阵:
1.行数和列数取出来row,col,圈数就是 (较小值-1)/2+1
2.外层循环控制圈数,内层四个for循环,i
3.第一个for循环,从左到右,j=i;j<col-i;j++;j<; arr[i][j]
4.第二个for循环,从上到下,k=i+1;k<row-i;k++; arr[k][col-1-i]
5.第三个循环,从右到左,m=col-2-i;m>=i&&row-1-i!=i;m-- arr[row-1-i][m]//row-1-i!=i单行的时候只打印一次
6.第四个循环,从下到上,n=row-2-i;n>=i&&col-1-i!=i;n-- arr[n][i]

编译原理-有限自动机:
不确定的有限自动机(NFA),一种数学模型;确定的有限自动机(DFA),是NFA的特殊情况

==========================================================================
2018年10月26日 记录:

根据企邮被禁用的发垃圾的账号,查询它们最近7天的海外SMTP登录IP(排除中国大陆和港澳台以及查询失败的),
共45077个海外IP,已经全部查封。被查封的IP进行企邮SMTP/POP/IMAP登录均会失败。

汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它!
1.字符串翻转,前n位取模长度,abc翻转成cba 后面的翻转成fedXYX ,然后再统一翻转 XYZdefabc
2.第二种思路,字符串复制一份拼接在一起,截取从n开始到len长度的子字符串,n也是要取模

当有一天我看到一棵奇怪的树,第一反应是想拍下来给你看,我就知道大事不好了。
HRBP(HR BUSINESS PARTNER)

Electron使用 JavaScript, HTML 和 CSS 构建跨平台的桌面应用

==========================================================================
2018年10月25日 记录:

 

MYSQL随机提取一条记录:SELECT * FROM tablename ORDER BY RAND() LIMIT 1。

常用的解决思路:
1.暴力穷举(递归,回溯),n个数的全排列,八皇后问题
2.分治法(分而治之,然后归并),空间换时间(活用哈希表)
3.选择合适的数据结构,寻找最小的k个数(堆代替数组)
4.如果题目允许排序,优先排序,已经排好序的可以考虑二分
5.不改变队列顺序的贪心和动态规划

1.回溯法,按照深度优先的原则从根结点出发搜索解空间树,总是先判断该结点是否肯定不包含问题的解,如果肯定不包含,则跳过该结点为根的子树搜索,逐层向其祖先结点回溯,求问题的所有解时,要回溯到根,且根结点的所有子树都已被搜索才结束
2.用for循环+递归方式求解
for循环套在外层,表示遍历数组的第i个数字;内层递归表示结果list里的第i个数字


==========================================================================
2018年10月24日 记录:

 

前后端分离的验证码问题
1.生成验证码的数字存mememchache,key是唯一id 返给前端
2.验证时,前端带着id来 查找对应的验证码申诉自

1.回溯法(探索与回溯法)是一种选优搜索法,又称为试探法,按选优条件向前搜索,以达到目标,原先选择并不优或达不到目标,就退回一步重新选择
2.回溯法从根节点开始按深度优先搜索策略形成的树称为状态空间树

==========================================================================
2018年10月23日 记录:

企管调用mic的部分,ip改成域名的形式

输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
思路:
1.利用递归形成递归树,达到深度优先,固定首字母的效果
2.得复位以后才能再次深度优先
3.回溯法思想
4.一张图和一个运行过程,只能慢慢体会了

mysql `updateDate` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
插入自动更新当前时间;更新自动更新当前时间

==========================================================================
2018年10月22日 记录:

我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?斐波那契数列

1.堆(二叉堆):可以视为一棵完全的二叉树,除了最底层之外,每一层都是满的,这使得堆可以利用数组来表示,每一个结点对应数组中的一个元素
2.给出某个结点的下标,可以计算出父结点的和孩子结点的下标; parent(i)=floor(i/2) left(i)=2i right=2i+1
3.最大堆和最小堆,最大堆:根结点是最大值,最小堆:根结点是最小值
4.堆排序就是把最大堆堆顶的最大数取出,剩余的堆继续调整为最大堆,再次将堆顶的最大数取出,直到剩余数只有一个结束

登录查看全部

参与评论

评论留言

还没有评论留言,赶紧来抢楼吧~~

手机查看

返回顶部

给这篇文章打个标签吧~

棒极了 糟糕透顶 好文章 PHP JAVA JS 小程序 Python SEO MySql 确认