异步 API 的设计:POST /stars 直接返回成功和location字段返回查询进度的api轮询 GET /queue/12345,查询当前的进度
3.高位字节M、低位字节L:一个16位(双字节)的数据0x2211 22是高位字节 11是低位字节32位的数据,比如 0x3F68415B 3f68是高位字节 4158是低位字节,这个数据被存到内存的时候有可能高位在前 高位优先 ,高位在后 低位优先0x1234567的大端字节序是0123 4567,小端字节序是6745 2301
1.过滤shell命令中的特殊字符:$a="`ifconfig`";$a=escapeshellcmd($a);$res=system($a);var_dump($res);shell_exec — 通过 shell 环境执行命令,并且将完整的输出以字符串的方式返回。
2.字节:存储容量的计量单位,一个字节等于8位,0x2211是十六进制是二进制0b00100010 00010001,两个8位也就是两个字节
2019年2-7~9 阳光PHP峰会API开发;中间件;安全;区块链;DevOps;渐进式Web应用程序(PWA);持续交付;数据库;Javascript ;PHP核心;单元测试;UI / UX;异步PHP;可扩展性;团队开发
htmlentities — 将字符转换为 HTML 转义字符,对所有html实体转义htmlspecialchars只是对 < > " ' &进行转义
mysql输入查询:SELECT VERSION(), CURRENT_DATE;
GNU AWK 的用户指南
凡人皆有一死 ,凡人皆须侍奉动不动就觉得一年比一年差的,是因为你年龄一年比一年大了,越来越需要钱了,偏偏发现财富自由离自己太远。回到刚毕业的时候,就算变天了你还会觉得很兴奋,百度一下“行业寒冬”,你就就会发现2014、2015、2016、2017、2018年年都寒冬。哪年不过冬了?哪年各位的薪资没涨的?哪年各位生活质量有下降的?
postfix配置测试smtp修改 /etc/postfix/transport然后执行 postmap /etc/postfix/transport, 再执行postfix reload
讲清楚技术方案:1.介绍需求背景2.介绍整体技术方案3.介绍协议和库表结构
nginx可以用信号控制:kill -s HUP 8587 将HUP信号发送到主进程,使用新配置启动新的工作进程,正常关闭旧工作进程,即打开日志文件和新的侦听套接字。kill -s USR2 8587 即时升级可执行文件
导入群发列表时有^M特殊字符:$outEmail=(string)trim($outEmail); 强制转一下
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 & Driverinterface 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();
stream_get_meta_data - 从流/文件指针中检索标头/元数据返回结果:timed_out (bool)如果流在等待最后一次调用fread()或fgets()时的数据时超时,则为TRUE。
2.网络地址转换(NAT):内网的主机想通过互联网被外网访问,需要进行网络地址转换;从一组地址到另一组叫N-to-N静态网络地址转换;当映射是M-to-N M>N时是动态网络地址转换;网络地址端口映射是NAT的一个扩展,在这里很多的地址和端口被映射到单个地址和端口,N-to-1的映射
门诊系统:electron vue vuex 界面就是elementui
360浏览器侧边翻译插件
PCRE(Perl Compatible Regular Expressions)是一个Perl库,包括 perl 兼容的正则表达式库。
stream_socket_client ( string $remote_socket [, int &$errno [, string &$errstr [, float $timeout = ini_get("default_socket_timeout") [, int $flags = STREAM_CLIENT_CONNECT [, resource $context ]]]]] )
timeoutNumber of seconds until the connect() system call should timeout.
1.从单页应用(SPA)到服务器渲染(SSR)2.编译器原理和技术涉及到程序设计语言,计算机体系结构,语言理论,算法,软件工程3.编译器是一个程序,将某种语言(源语言)编写的程序翻译成一个与之等价的另一种语言(目标语言)编写的程序,翻译的过程中可以报告错误,编译器的早期工作集中在如何把算数表达式翻译成机器代码
print_r(01234==1234) false,0开头是八进制,0x开头是十六进制,0b开头是二进制yigoubao的密码规则:md5(md5($password) . 'yoshop_salt_SmTRx')php -r "echo md5(md5('admin123') . 'yoshop_salt_SmTRx');"
域名反向解析即从IP地址到域名的映射:系统提供一个特别域,该特别域称为逆向解析域
企管nginx改造:
系统开发统计读取阿里云的使用情况:
swoole的三种运行模式:base模式,线程模式,进程模式IO:BIO阻塞IO;NIO非阻塞IO,同步IO;异步IOIO组合:同步阻塞IO;同步非阻塞IO;异步阻塞IO;异步非阻塞IOIO操作:发起IO请求;实际IO操作阻塞和非阻塞区别:第一步发起IO请求是否会被阻塞同步和异步区别:第二步实际IO读写是否会被阻塞
BIO:while true accept 多线程处理读写
__set是个不存在的属性赋值,两个参数__set($k,$v),属性名和属性值__get读取不存在属性时
$obj->test="aaa", __set("test",'aaa'),属性中放个数组,arr["test"]="aaa"echo $obj->test ,__get("test"),arr["test"]
declare 结构用来设定一段代码的执行指令。declare 的语法和其它流程控制结构相似:是一个在 declare 代码段中解释器每执行 N 条可计时的低级语句就会发生的事件declare(ticks=1);PHP进行信号管理,第二个参数是回调函数:pcntl_signal(SIGUSR1, "sig_handler");给进程发送信号:posix_kill ( int $pid , int $sig )
kill -l:linux进程的所有信号
sendid,midphp魔术方法:__construct()[构造], __destruct()[析构], __call()[调用不存在的方法], __callStatic()[调用不存在的静态方法], __get()[获取不存在属性的值], __set()[为不存在属性赋值调用],__isset()[isset不存在的属性], __unset()[unset不存在的属性], __sleep()[序列化对象的时候], __wakeup()[反序列化对象的时候], __toString(), __invoke(), __set_state(), __clone() 和 __debugInfo()
1.企邮日发信量100万,计划每天或每周一张表,根据sendid后面的日期进行对应2.在读信接口里增加sendid字段2.给前端定义一个接口,maildeliverystatus,只有已发送的邮件读信时会去调,把sendid传给我3.我要拿着sendid去查表然后直接返回对应数字
测试:单元测试,API测试,性能测试,持续集成,灰度发布单元测试:人为规定的最小的被测功能模块,c语言是一个函数,java是一个类,图形软件是一个窗口API测试:定位是服务对外输出的接口测试,偏重业务测试性能测试:单接口压测和模拟用户行为的压测,ab压测,wrk压测;loadrunner,jmeter
ubuntu用户创建的目录下用root创建文件,ubuntu用户可以删除但是不能编辑覆盖
File upload error - unable to create a temporary file设置upload_tmp_dir="/temp" 然后重启环境就可以了,如果还不行就去看看文件夹的权限是否有权限,赋予写入权限就好了
php调用这个库的应该都是短链接,然后这样是否也会发生切换过程中,数据写到老库,没有同步到新库的情况短链接是不会发生这种情况
1.手写票一般我们叫做“普通发票”,机打票叫做“增值税普通发票”,发票需要去税务局买2.增值税专用发票,可以进行税款抵扣,需要提供企业名称,纳税人识别号,地址,电话,开户银行,开户账号3.增值税普通发票提供纳税人识别号,企业抬头
企邮webmail的跳转部分企邮web读取阿里云双读上线
得到等N位为1其它位为0的数,可用1左移N位即得得到等N位为0其它位为1的数,用前数位反一下即得
修改指定状态位为0,a&=~(1<<29)修改指定状态位为1,a|=1<<29
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-FPM4.隧道(tunnel):在HTTP连接上转发非HTTP协议的数据,例如:HTTP/SSL 在HTTP连接上传输SSL数据
HTTP首部(head头信息)1.通用首部:Date 通用缓存首部(Cache-Control)2.请求首部:Accept 条件请求首部(if-),安全请求首部(Authorization)3.响应首部:Server4.实体首部(用于主体部分的首部):content-type:5.扩展首部:非标准的,自己定义的
PHP的脚本执行还是会经过编译环节, 只不过它们一般会在运行的时候实时进行编译1.启动PHP及Zend引擎, 加载注册的扩展模块2.读取脚本文件,Zend引擎对脚本文件进行词法分析,语法分析。3.编译成opcode执行
route add -net 100.118.0.0/16 gw 172.16.228.1 添加网络
100:客户端应该继续发送请求,表示服务器已经接受到了,继续请求101:理解了客户端请求,并通过Upgrade消息头通知客户端采用新协议通讯,服务器发完后会切换到新协议102:由webdav(rfc2518)扩展的状态码,代表处理将被继续执行201:请求已经被实现,新的资源已经建立,uri随location头信息返回202:服务器已经接受请求,但是不知道结果,异步的时候使用203:成功处理但是返回的实体头部元信息不是原始服务器上的有效集合204:成功处理,不返回实体,返回更新了的元信息205:和204差不多,要求请求者重置文档
1.分表的方式,是横向还是纵向,是以用户来分,还是以时间或者商家。 或者多维度,多维度的情况下,如何进行表数据之间的同步2.查询订单,肯定是要有一定的时间限制,比如最近3个月的,其他的以一定的时间规则归档,查询时候是进入另外的数据表查询,没法查全部3.缓存MEMCACHE 使用原子性操作add,实现并发锁4.遇到大的问题,那么就缩小范围,限制住他的思路
下午请假
安卓问题:客户端现有问题是,修改密码后还会调用登陆接口,没有正常提示文本信息,退出也退出不了
流媒体服务器(Nginx+rtmp)docker下安装宝塔面板更安全
存储服务器-云盘分布式文件系统应用服务器web服务器数据库平台反垃圾的网关服务日志服务器-每天发送一次,各web服务器的syslog-ng
1.二叉查找树中的结点是2-结点(一个键两条链),引入3-结点(两个键三条链),即成2-3树;然后将2-3树中3-结点分解,即成红黑树,故结合二叉查找树易查找和2-3树易插入的特点,便成了红黑二叉查找树,简称红黑树。2.B树每一个结点可以有几个到几千个孩子,降低树的高度,减少磁盘io,顶部几层被反复查询存在内存中,剩余的存在磁盘中3.含n个结点的b树高度也是lgn,分支因子大,高度小很多,
明天导一下应该修改密码的列表
Redis与其他key-value存储有什么不同?1.复杂的数据结构并且提供对他们的原子性操作2.运行在内存中但是可以持久化到磁盘3.键值对越多开销越大,放到一个key里就小很多4.采用多个Redis节点通过客户端Hash的办法解决了大数据集分配的问题5.访问MySQL的数据只能通过主键(ID) 。执行查询操作时,通过Redis读取数据;使用redis的数据结构创建二级索引
分布式理解:1.一个需要巨大资源的计算分成小的部分,分配给多台独立的服务器,计算结果综合后得到最终结果2.分布式网络存储技术是将数据分散的存储于多台独立的机器设备上
顺时针打印矩阵:1.行数和列数取出来row,col,圈数就是 (较小值-1)/2+12.外层循环控制圈数,内层四个for循环,i3.第一个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的特殊情况
根据企邮被禁用的发垃圾的账号,查询它们最近7天的海外SMTP登录IP(排除中国大陆和港澳台以及查询失败的),共45077个海外IP,已经全部查封。被查封的IP进行企邮SMTP/POP/IMAP登录均会失败。
汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它!1.字符串翻转,前n位取模长度,abc翻转成cba 后面的翻转成fedXYX ,然后再统一翻转 XYZdefabc2.第二种思路,字符串复制一份拼接在一起,截取从n开始到len长度的子字符串,n也是要取模
当有一天我看到一棵奇怪的树,第一反应是想拍下来给你看,我就知道大事不好了。HRBP(HR BUSINESS PARTNER)
Electron使用 JavaScript, HTML 和 CSS 构建跨平台的桌面应用
MYSQL随机提取一条记录:SELECT * FROM tablename ORDER BY RAND() LIMIT 1。
常用的解决思路:1.暴力穷举(递归,回溯),n个数的全排列,八皇后问题2.分治法(分而治之,然后归并),空间换时间(活用哈希表)3.选择合适的数据结构,寻找最小的k个数(堆代替数组)4.如果题目允许排序,优先排序,已经排好序的可以考虑二分5.不改变队列顺序的贪心和动态规划
1.回溯法,按照深度优先的原则从根结点出发搜索解空间树,总是先判断该结点是否肯定不包含问题的解,如果肯定不包含,则跳过该结点为根的子树搜索,逐层向其祖先结点回溯,求问题的所有解时,要回溯到根,且根结点的所有子树都已被搜索才结束2.用for循环+递归方式求解 for循环套在外层,表示遍历数组的第i个数字;内层递归表示结果list里的第i个数字
前后端分离的验证码问题1.生成验证码的数字存mememchache,key是唯一id 返给前端2.验证时,前端带着id来 查找对应的验证码申诉自
1.回溯法(探索与回溯法)是一种选优搜索法,又称为试探法,按选优条件向前搜索,以达到目标,原先选择并不优或达不到目标,就退回一步重新选择2.回溯法从根节点开始按深度优先搜索策略形成的树称为状态空间树
企管调用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 插入自动更新当前时间;更新自动更新当前时间
我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?斐波那契数列
1.堆(二叉堆):可以视为一棵完全的二叉树,除了最底层之外,每一层都是满的,这使得堆可以利用数组来表示,每一个结点对应数组中的一个元素2.给出某个结点的下标,可以计算出父结点的和孩子结点的下标; parent(i)=floor(i/2) left(i)=2i right=2i+13.最大堆和最小堆,最大堆:根结点是最大值,最小堆:根结点是最小值4.堆排序就是把最大堆堆顶的最大数取出,剩余的堆继续调整为最大堆,再次将堆顶的最大数取出,直到剩余数只有一个结束5.最大堆调整(维护最大堆,子节点永远小于父结点) ;创建最大堆(把一个数组调整成最大堆的数组);堆排序(创建最大堆,交换,维护最大堆)maxHeapify (array,index,heapSize) //最大堆调整 iMax,iLeft,iRight while true iMax=index;iLeft=2*index+1;iRight=2*index+2 如果根结点小于左右子树里结点值,就交换一下这两个值 利用第三方变量,交换下两个值buildMaxHeap(array) //创建最大堆,把一个数组调整成最大堆的数组 iParent=floor((size-1)/2) for i=iParent;i>=0;i-- maxHeapify (array,i,size)sort(arr) buildMaxHeap(array, heapSize);//创建最大堆 for (int i = heapSize - 1; i > 0; i--) { swap(array, 0, i); //交换第一个和最后一个 maxHeapify(array, 0, i);//维护最大堆,size小了一个
字符串的全排列:1.输入一个字符串,输出字符串中字符的所有排列2.从集合中依次选出每一个元素,作为排列的第一个元素,然后对剩余的元素进行全排列,如此递归处理
最长公共子串和最长公共子序列
请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
最短路径问题的实际例子:1.路程最短,时间最短,换乘最少,实际地图场景比这些更复杂2.非网图可以理解为所有边为1的网3.迪杰斯特拉算法是按照路径长度递增次序产生最短路径的算法,并不是一下子就求出v0到v8的最短路径,而是一步一步求出他们之间顶点的最短路径
同时包含数字、大写字母、小写字母、特殊字符中三种组合 70004 连续3位及以上数字不能连号(例如123、654)70005 连续3位及以上字母不能连续和相同(例如abc、cba aaa) 70006 密码不包含账号 70007 长度8到20位 70002
日志业务的流程:应用产生日志→采集→传输→按需过滤与转换→存储→分析与查看。2.根据数据的不同维度,对数据进行分类、分级。例如:我们从日志中区分error、info、和 debug3.平台扩展做加减法,我们在查询时都增加分布式缓存,纵向扩展:如增加扩展磁盘和内存。
JavaScript由三部分组成:1. ECMAScript(核心)作为核心,它规定了语言的组成部分:语法、类型、语句、关键字、保留字、操作符、对象2. DOM(文档对象模型)3. BOM (浏览器对象模型)4. ECMAScript第五个版本 ES6是第六个版本5. ES6 块级作用域 关键字let, 常量const,对象字面量的属性赋值简写,赋值解构,函数参数 - 默认值、参数打包、 数组展开(Default 、Rest 、Spread),箭头函数 Arrow functions,字符串模板 Template strings,Iterators(迭代器)+ for..of,生成器 (Generators),class,Modules,Map + Set + WeakMap + WeakSet,Promises是处理异步操作的对象,Symbol是一种基本类型通过调用symbol函数产生,Symbol是一种基本类型。Symbol 通过调用symbol函数产生
从某个源点到其余各顶点的最短路径问题:1.人脑是来创造而不是做枯燥复杂的计算的,那些背圆周率的有啥意义2.迪杰斯特拉算法,思路是:v0,v1,v2,v3,v4,v5v0到v1到v2 v0到v1到v3 v0到v1到v4 v0到v1到v5 所有可能性都算一遍,取最小的边
1.网图和非网图,最短路径的含义不同,非网图没有边上的权值,指两点之间经过的边数最少的路径2.
明天国庆节
is_uploaded_file — 判断文件是否是通过 HTTP POST 上传的如果 filename 所给出的文件是通过 HTTP POST 上传的则返回 TRUE。这可以用来确保恶意的用户无法欺骗脚本去访问本不能访问的文件,例如 /etc/passwd。
最小生成树:1.例子在村庄之间架设通信网络,村庄之间有不同的距离,用最小的成本完成这次任务2.这是个带权值的图,即网结构,所谓最小成本就是n个顶点用n-1条边,权值和最小3.连通图的生成树是一个极小的连通子图,足以构成一棵树的n-1条边,构造连通图的最小代价生成树称为最小生成树4.两种经典算法:普里姆算法和克鲁斯卡尔算法
1.图的深度优先遍历类似前序遍历,图的广度优先类似树的层序遍历2.将图进行变形,根据顶点和边的关系进行层次划分,使用队列来进行遍历3.广度优先遍历的关键点是使用一个队列来把当前结点的所有下一级关联点存进去,依次进行
排序算法稳定性:1.如果Ai = Aj,排序前Ai在Aj之前,排序后Ai还在Aj之前,则称这种排序算法是稳定的,保证排序前后两个相等的数的相对顺序不变2.排序算法如果是稳定的,那么从一个键上排序,然后再从另一个键上排序,前一个键排序的结果可以为后一个键排序所用3.稳定性算法:冒泡 平均n^2 最好n 最坏n^2不稳定算法:选择 平均n^2
山一程,水一程,身向榆关那畔行,夜深千帐灯。 风一更,雪一更,聒碎乡心梦不成,故园无此声
图的邻接表实现方式:1.顶点数组,需要存储指向第一个邻接点的指针2.每个顶点Vi的所有邻接点构成一个单链表,无向图称为顶点Vi的边表,有向图称为顶点Vi作为弧尾的出边表
快速排序:1.基于二分的思想2.第一个作为基准数,左右各一个指针,同时扫描,右边先走,找到比基准数小的停下左边再走,找到比基准数大的停下,左右交换3.当左右相遇的时候,把当前的和基准数调换,递归调用4.快速排序的最差时间复杂度和冒泡排序是一样的都是O(N2),它的平均时间复杂度为O(NlogN)
quickSort &arr,left,right if left>right return temp=arr[left] i=left j=right while i<j while arr[j]>=temp && i<j j-- while arr[i]<=temp && i<j i++ t=arr[i] a[i]=arr[j] a[j]=t; arr[left]=arr[i] arr[i]=temp
quickSort(arr,left,i-1) quickSort(arr,i+1,right)
奥帆中心八大关 第二海水浴场 海军博物馆 鲁迅公园 小青岛公园 栈桥天主教堂→胶澳总督府旧址→江苏路基督教堂→德国总督府旧址→信号山公园→德国监狱旧址博物馆中国海洋大学(鱼山校区)→大学路→鱼山路→中山公园→奥帆中心→五四广场
流清→太清宫→华严寺→仰口
PORT模式:当数据传输时,客户端建立套接字接听。绑定port中的端口。服务器中使用的端口是20;PASV模式:当数据传输时,服务端建立套接字接听。客户端去连接pasv中指定的端口。这时候服务器端用的端口不是20,而是pasv中的端口。
图的物理存储的实现:邻接矩阵 邻接链表 十字链表 邻接多重表有向图的存储方法:十字链表无向图存储的优化:邻接多重表
图的遍历:1.从图中某一顶点出发访遍图中其余顶点,且使每个顶点仅被访问一次2.需要给访问过的顶点打上标记,设置个数组visited[n],访问过后设置为13.遍历次序:深度优先遍历和广度优先遍历深度优先遍历DFS:1.类似走迷宫右手定则,走一个做标记,一直往右走,直到重复了,就退回上一个顶点2.从某个顶点v出发访问和v有路径相通的顶点,递归调用
pdo获取受影响的行数:$stmt=$pdo->prepare($sql);$bool=$stmt->execute();$rowCount=$stmt->rowCount();
stripos — 查找字符串首次出现的位置(不区分大小写),应使用 === 运算符来测试此函数的返回值if(stripos($newpwd,$account->getLocal())!==false){}curl cookiecurl_setopt($ch, CURLOPT_COOKIEFILE, "cookiefile");
增强密码组合策略,数字、大小写字母、特殊字符中3种组合,长度8到20位。密码规则:• 长度8到20位• 密码不包含账号和空格• 连续3位及以上数字不能连号(例如123、654)• 连续3位及以上字母不能连续(例如abc、cba)• 不能包含连续3个及以上相同字符(例如aaa、rrr)• 同时包含数字、大写字母、小写字母、特殊字符中三种组合
图的存储结构:1.顶点是逻辑上的相对的概念2.不可以用顺序存储,不可以像多重链表,一个数据域多个指针域,浪费太大3.邻接矩阵,两个结构分别存储,顶点用一个一维数组,边是顶点和顶点的关系用二维数组存储 3.1 一维数组存顶点(v0,v1,v2) ,二维矩阵存关系 , 无向图是一个对称矩阵 v0 v1 v2 v0 0 v1 0 v2 0 3.2 判断顶点Vi和Vj是否存在弧,只需查找矩阵arc[i][j]V4.图结构定义MGraph vexs[3] //顶点 arc[3][3]//边 numVex//顶点数 numArc//边数
1.未正确使用安全带2.定点停车超过边线30cm未超过50cm3.曲线行驶左后轮压线4.坡道起步溜车超过50cm5.倒车入库左前轮压七米线
删除重复的结点:1.在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
1.图数据结构,周游中国,地图路线选择,寻找最短路径;一对一 一对多 多对多2.图中的数据元素称为顶点,不允许没有顶点,顶点之间的关系用边表示3.无向边:边没有方向,图中任意边都是无向边,称为无向图;有向边又称为弧,A到D,A是弧头,D是弧尾4.无向图中,任意两个顶点都存在边,该图为无向完全图;有向图中就是有向完全图;5.与边相关的数称为权,带权的图称为网;路径的长度是路径上边的数目
2.输入两个链表,找出他们的第一个公共结点:
复杂链表的复制(每个结点中有结点值,两个指针,一个指向下一个结点,另一个指向任意一个结点),返回复制后复杂结点的head
合并两个排序的链表,已解决
北医三院中午11点
重建二叉树,输入二叉树前序(中左右)和中序遍历(左中右)的结果,重建出二叉树:找到中序的根结点,中序根结点左边的都是左孩子,右边的都是右孩子
推荐的书:深入理解计算机系统、现代操作系统、C程序设计语言、C语言数据结构和算法、Unix环境高级编程、TCP/IP网络通信详解算法导论,大话数据结构,剑指offerJava面向对象编程、Java编程思想、J2EEPHP5权威编程
深入理解计算机系统:第五章 优化程序性能 Optimizing Program Performance第六章 存储器层次结构 The Memory Hierarchy第八章 异常控制流 Exceptional Control Flow第九章 虚拟存储器 Virtual Memory
上传图片接口:$file = $_FILES[$name];$attarr["content"] = file_get_contents($file["tmp_name"]);
倒排索引-最基础的搜索技术:1.例如一张单词表,单词和对应的文章id编号,单词表是有序的2.索引表的通用结构:次关键字(单词) 记录号表(文章编号)3.不是通过记录确定属性值,而是通过属性值确定记录的位置因此成为倒排索引4.维护比较困难,插入和删除操作都要做相应的处理二叉排序树1.有序线性表,因为要维护顺序,插入和删除操作耗费很多时间2.左子树小于中根结点,右子树大于中根结点,插入和删除效率更高3.在插入删除的时候,顺序表需要移动很多元素,二叉树不会
多路查找树(B树)1.善于使用文字的人,通常是深沉而严谨的2.从磁盘上进行不断的数据处理,为了降低对外存设备的访问次数,需要新的数据结构3.每一个结点孩子数多于两个,每个结点存储多个元素,所有元素存在某种特定排序关系4.四种特殊形式:2-3树 2-3-4树 b树 b+树2-3树:1.2结点包含一个元素和两个孩子,与二叉搜索树类似,但是要么没有孩子,要么就有两个2.3结点包含一小一大两个元素和三个孩子,
剑指offer1.二维数组中查找,从左下角开始查找,当要查找数字比左下角数字大时。右移,要查找数字比左下角数字小时,上移2.输入一个链表,输出该链表中倒数第k个结点。第一个指针走(k-1)步,到达第k个节点,两个指针同时往后移动,当第一个结点到达末尾的时候,第二个结点所在位置就是倒数第k个节点了
上线企邮客户端上线pop代收的redis
二分查找的过程是一棵二叉树1.最坏情况lgn+1,最好情况1,最终是O(lgn)2.前提条件是需要有序表顺序存储,对于频繁插入和删除的不建议使用
线性索引查找:索引就是把一个关键字与它对应的记录关联的过程,每个索引项至少包含关键字和对应记录在存储器中的位置,组织大型数据库以及磁盘文件的一种重要技术按照结构:线性索引,树形索引,多级索引三种线性索引:稠密索引,分块索引,倒排索引稠密索引:将数据集中的每个记录对应一个索引项,一定是按照关键码有序的排列分块索引:块内无序,块间有序,第二块比第一块所有都大,块间有序可以提升效率,每一块对应一个索引项,分块索引表.先二分或者插值查找分块,然后在分块内部进行顺序查找
分块索引的三个数据项1.最大关键码,之后的块在比较的时候方便2.块中存储的记录个数,方便循环3.指向块首数据元素的指针,便于对记录进行遍历
master进程主要用来管理worker进程,具体包括如下4个主要功能:(1)接收来自外界的信号。(2)向各worker进程发送信号。(3)监控woker进程的运行状态。(4)当woker进程退出后(异常情况下),会自动重新启动新的woker进程
open_basedir 将PHP所能打开的文件限制在指定的目录树中,包括文件本身。当程序要使用例如fopen()或file_get_contents()打开一个文件时,这个文件的位置将会被检查。当文件在指定的目录树之外,程序将拒绝打开。
1.顺序表查找:for(i=1;i<=n;i++){a[i]==key return}顺序表查找的优化:解决每次都要对i是否小于n作比较,设置一个哨兵,如果查找失败,一定会在结尾a[0]处等于key,此时返回0;免去了每次都判断是否越界a[0]=key;i=n;while(a[i]!=key){i--}
有序表查找:2.折半查找:取中间记录的查找方法,又称为二分查找.前提是线性表中的记录必须是有序的,取中间记录作为比较对象,若关键字相等则查找成功,若小于则在左半区查找,若大于则在右半区查找left mid rightwhile(left<right){ mid=(left+right)/2 if(key<a[mid]){right=mid-1} else if(key>a[mid]){left=mid+1} else{return mid}}return 0
PHP读取命令行输入:$handle=fopen("php://stdin","r");$line=fgets($handle);
前序遍历生成二叉树function createBinTree(){ $handle=fopen("php://stdin","r"); $e=trim(fgets($handle)); var_dump($e); if($e=="#"){ $binTree=null; }else{ $binTree=new BinTree(); $binTree->data=$e; $binTree->left=createBinTree(); $binTree->right=createBinTree(); } return $binTree;}
查看两个段是否有交集: public static function isIntersect($oldIps,$newIps){ if($newIps[0]>$newIps[1]){ return false; } foreach($oldIps as $old){ if($old[0]<=$newIps[0] && $newIps[0]<=$old[1]){ return false; } if($old[0]<=$newIps[1] && $newIps[1]<=$old[1]){ return false; } if($newIps[0]<=$old[0] && $old[1]<=$newIps[1]){ return false; } } return true; }查找:根据给定的某个值,在查找表中确定一个其关键字等于给定值的数据元素查找表:同一类型的数据元素构成的集合关键字:数据元素中某个数据项的值,又称为键值,可以唯一标识一个记录,称为主关键字主关键码:主关键字所在的数据项次关键字:可以识别多个数据元素或记录查找表按照操作方式分为:静态查找表和动态查找表静态查找表:只查找操作的查找表,查询某元素是否在查找表中,查询某元素的属性等动态查找表:在查找过程中同时插入查找表中不存在的数据元素,或者删除已存在的元素查找结构:专门为查找操作设置的数据结构,为了提高查找扥性能,在存储时可以将查找组织成表和树等结构1.顺序表查找:
科目二坡起溜车,倒车入库压左边线
二叉树的建立:将二叉树中每个结点的空指针引出一个虚结点,其值为特定值#,处理二叉树为原二叉树的扩展二叉树,扩展二叉树做到一个遍历序列确定一棵二叉树
下午考科二
企邮pop代收redis队列改造:企邮官网海外提示
创建一个循环链表//头结点指向自身$linkList->next=$linkList; //最后一个结点指向头结点 $node->next=$linkList;
明天下午考科目二:1.身份证2.安全带3.身子对准两条红色线
logo图:width: 330px;height: 50px;背景图width: 500px;height: 350px;
$list=new Node();$list->next=null;$temp=$list;for($i=0;$i<10;$i++){ $node=new Node(); $node->data="aaa{$i}"; $node->next=null; $temp->next=$node; $temp=$node;}
链表获取元素1.声明结点p指向链表第一个结点,j初始化1开始2.j<i,p指向下一结点,因为此时p是指向的p的next,因此不需要等于3.如果到末尾了,p还为null,就是没有查找到插入元素1.插入元素和查找类似,找到位置后2.生成新的结点s, s->next=p->next p->next=s;删除元素1.删除元素,找到位置后2.绕过一下,q=p->next p->next=q->next;
明天早上8点龙泉驾校考前集训后天下午科目二考试
企邮api调用客服token
树转换成二叉树:1.加线,所有兄弟节点间加一条连线2.去线,只保留它与第一个孩子结点的连线,删除与其他孩子结点的连线3.层次调整,以树的根结点为轴心,将整棵树顺时针旋转一定的角度4.第一个孩子是二叉树结点的左孩子,兄弟转换过来的孩子是结点的右孩子5.森林转换成二叉树,可以理解为森林里的每棵树都是兄弟
二叉树转换成树1.加线,若某结点的左孩子结点存在,就把这个左孩子的右孩子结点和该结点相连2.去线,删除原二叉树中所有结点与其右孩子结点的连线3.二叉树转换成森林,从根结点开始,若右孩子存在,就把之间的连线删除
树的遍历分为先根遍历和后根遍历1.先访问根结点,依次先根遍历树的每颗子树2.后根遍历,先依次后根遍历每棵子树,再访问根结点赫夫曼编码-最基本的压缩编码方法赫夫曼树-叶子结点带权的二叉树
线性表的顺序存储结构,在内存中找一块地,通过占位的形式,把一定的内存空间给占了,一维数组来实现顺序存储结构三个属性,数组data,数组长度MAX_SIZE,当前长度length
分治依托于递归,分治是一种思想,而递归是一种手段,递归式可以刻画分治算法的时间复杂度。分治策略求解递归式方法:1.代入法,递归树法,主方法最大子数组问题:给定一个连续的数值数组,找出其中连续的求和为最大的子数组
漢語拼音 Tao Shi Han Tau Shihan注音二式 Tau Shr Han通用拼音 Tao Shih Han威妥瑪拼音 T'ao Shih Han耶魯拼音 Tau Shr Han
算法导论:1.2-1 给出应用层需要算法内容的应用的一个例子,并讨论涉及的算法的功能:数据库应用,快速查找与排序1.2-2插入排序和归并排序在相同机器上的实现,规模为n的输入,插入排序运行8n^2,归并排序需要64nlgn,问对哪些n值插入排序优于归并排序:n^2 8nlgn进行比较 :40左右开始,归并排序会比较快1.2-3 运行时间是100n^2小于2^n的点 :n是15的时候
分治策略:分解,将问题划分为子问题,子问题形式与原问题一样,规模更小解决,递归求解出子问题合并,子问题的解组合成原问题的解
pow(x,y),pow() 函数返回 x 的 y 次方。log() 自然对数。以E为底log10() 以 10 为底的对数。
自然对数以常数e为底数的对数,记作lnN(N>0)对数函数lg,是以10为底的对数(常用对数),如lg 10=1,lg即为log10阶乘指从1乘以2乘以3乘以4一直乘到所要求的数
明天预约科目二考试:1.身份证必须带2.安全带必须系
mysql_select_db("byzx",$con);$res=mysql_query("drop table test");$res=mysql_query("create table test (id int)");var_dump(mysql_error());
中序遍历加线索化二叉树,递归实现:InThreading(p->lchild);如果没有左孩子,p->lchild=pre如果前驱没有右孩子,pre->rchild=p;因为此时还没有访问到后继,InThreading(p->rchild);pre=p,以便下次使用如果所采用的二叉树需要经常遍历或查找结点时需要某种遍历序列中的前驱和后继,采用线索二叉链表存储结构非常不错
1.区块链 = 链成一串的区块集合,区块ID,上一个区块的ID,生成时间,数据,区块散列值2.非对称加密,公钥加密,私钥解密;公钥加密后私钥解密转给别人3.面向对象、解耦,这些手段只能增强系统可维护性,对性能反而会有细微的损耗,从没听说过还能提升性能,如果是数据库的问题,从数据库层面来解决,只留下必须由客户端处理的小部分
date当前日期: echo `date +%Y%m%d`
Redis Desktop Manager (aka RDM) — is a fast open source Redis database management application for Windows, Linux and MacOS.
组件:1.大型框架很难集成自定义的库或第三方库的日子一去不复返了2.从不断增多的大量专用组件中选择合适的
线索二叉树:1.有n个结点的二叉链表,一共是2n个指针域,有n-1个分叉线,有2n-(n-1)=n+1个空指针域非常的浪费2.利用空地址存放指向结点在某种遍历次序下的前驱和后继结点的地址3.把这种指向前驱和后继的指针称为线索,加上线索的二叉链表称为线索链表,相应的二叉树称为线索二叉树4.所有空指针域中的lchild指向前驱,rchild指向后继结点,将一棵二叉树转变成了双向链表,这就是线索化
二叉链表:1.链式存储结构.每个结点有两个孩子,设计一个数据域,两个指针域,叫做二叉链表2.遍历二叉树二叉树的遍历:从根结点出发,按照某种次序依次访问二叉树中的所有结点,每个结点仅被访问一次[访问和次序],对于计算机来说它只会处理线性序列前序遍历:先访问根结点,前序遍历左子树,前序遍历右子树;中左右中序遍历:左中右 preOrderFunc(T->lchild);printf("%c",T->data);preOrderFunc(T->rchild)后序遍历:左右中 preOrderFunc(T->lchild);preOrderFunc(T->rchild);printf("%c",T->data);层序遍历:一层层的遍历前序遍历递归代码:printf("%c",T->data);preOrderFunc(T->lchild);preOrderFunc(T->rchild)
推导遍历结果:前序abcdef(中左右) 中序cbaedf(左中右) 后序遍历结果是多少(左右中) cbefda a b d c e f中序abcdefg 后序bdcafge 前序 eacbdgf e a g c f b d1.已知前中可以唯一确定一颗二叉树2.已知后中可以唯一确定一棵二叉树3.已知前后不能确定一棵二叉树
二叉树创建:利用递归的原理,只不过在原来打印结点的地方,改成了生成结点,给结点赋值的操作if(ch=='#'){*T=NULL;}else{malloc();(*T)->data=ch;createFunc((*T)->lchild);createFunc((*T)->rchild);}
php:// — 访问各个输入/输出流(I/O streams)
上线企邮客服限制企业后的个人发信限制
科目二早上学车已挂,1.没有带身份证2.没有系安全带3.定点停车离右边太远4.速度太快曲线行驶压线
企邮群发助手脚本降低发统计邮件频率//工作时间$nowHour=intval(date("H",time()));$sendMonitor=false;if(9<$nowHour && $nowHour<18){ $rand=rand(0,2); if($rand==0){ $sendMonitor=true; }}
1.完全二叉树的顺序存储,存到一维数组中,相应的下标存入到同样的位置2.一般的二叉树,也可以按上面的存储,但是空的地方设置为^表示不存在,但是对于斜树不同
2.安装php的redis扩展yum install php-redis
3.如何设置一个严格30分钟过期的Session通过 session_save_path() 来获取session文件的存储位置。然后依次读取每个文件并反序列化。把session写到memcache或数据库里
mysql中时间戳转时间:select *,FROM_UNIXTIME(send_time,'%Y年%m月%d') from mass_send_records order by id desc limit 30;
Vagrant是一个基于Ruby的工具,用于创建和部署虚拟化开发环境
二叉树:n个结点的有限集合,根结点的左子树和右子树组成,查找起来效率特别高1.每个结点最多有两颗子树2.左子树和右子树都是有顺序的,次序不能颠倒3.即使只有一棵树,也要区分左子树和右子树4.斜树,左斜树,右斜树,每一层只有一个结点5.满二叉树,很完美,所有的分支结点都存在左子树,右子树,所有叶子在同一层6.完全二叉树,按层序编号,结点位置和满二叉树一致,按层序标号不能有空档二叉树的性质:1.第i层上,最多有2的i-1次方个结点2.深度为k,最多有2的k次方-1个结点3.终端结点数是n0,度为2的结点数是n2则n0=n2+14.具有n个结点的完全二叉树的深度为[log2n]+1二叉树的存储结构:1.顺序存储结构也可以实现存储二叉树,将二叉树上的结点按照层序编号,顺序存储在一维数组中,一般存完全二叉树最合适,其他的二叉树会有空间浪费2.
孩子双亲表示法:1.设计两种结点结构,孩子链表的孩子结点child和next和parent2.表头数组的表头结点,data和firstchild
1.树中结点的最大层次称为树的深度2.树中结点的各子树看成从左之右是有次序的,不能互换的,则称该树为有序树,否则称为无序树3.线性结构:第一个元素无前驱,最后一个无后继,中间一个前驱一个后后继4.树结构:根节点无双亲,唯一;叶节点无孩子,可以多个;中间结点一个双亲多个孩子5.树的抽象数据类型:InitTree(*T):构造空树TDestoryTree(*T):销毁树TCreateTree(*T,definition):按definition中给出树的定义来构造树TreeDepth(T):返回T的深度Root(T):返回T的根节点Value(T,cur_e):cur_e是树T中一个结点,返回该结点的值Assign(T,cur_e,value):给树T的结点cur_e赋值为valueParent(T,cur_e):返回cur_e的双亲LeftChild(T,cur_e):返回cur_e的最左孩子RightSibling(T,cur_e):返回cur_e的右兄弟InsertChild(*T,*p,i,c):p指向T的某个结点,i为所指结点p的度加上1DeleteChild(*T,*p,i):删除T中p所指结点的第i个子树树的存储结构:顺序存储结构和链式存储结构都可以实现对树的存储结构的表示,双亲表示法,孩子表示法,孩子兄弟表示法6.在每个结点中,附设一个指示器指示其双亲结点到链表中的位置,data和parent;根结点没有双亲,parent位置存-1;其他结点都有双亲位置7.根据结点的parent指针找到双亲结点,时间复杂度是O(1),直到parent是-1,如果要知道某个结点的孩子,需要O(n)8.可以把此结构扩展为双亲域,长子域,右兄弟域,存储结构的设计是很灵活的9.孩子表示法,每个结点有多个指针域,每个指针指向一颗子树的根结点,多重链表表示法;树的每个结点的度,孩子个数是不同的.指针域的个数等于树的度,显然是很浪费空间的.第二种方案是每个结点指针域的个数等于该结点的度,data为数据域,degree为度域,child1到childd为指针域,这样运算上时间损耗10.每个结点的孩子结点排列起来,以单链表存储,n个结点有n个孩子链表,n个头指针组成一个线性表用一维数组存储,设计两种结构:孩子链表的孩子结点,表头数组的表头结点
维生素B2不足:口角发炎,出现各种皮肤性疾病如皮肤炎等,手肢有灼热感觉,对光有过度敏感的反应等。应多进食肝脏、牛奶、鸡蛋、豆类、绿色蔬菜。维生素B2(核黄素)的主要食物来源为瘦肉、肝、蛋黄、糙米及绿叶蔬菜。小米含很多的维生素B2 。维生素B2对人体没有任何副作用,过量的维生素B2会从尿液中直接排出体外
404页面更新
redis的内存统计:redis-cli连接后使用info memory命令查看内存redis数据存储的细节:内存分配器(jemalloc),简单动态字符串SDS,5种对象类型及内部编码,redisObject
朴素的模式匹配:1.对主串S做大循环,对字串T做小循环2.S[0]和T[0]存长度,S[1]和T[1]是开始while(i<=S[0]&&j<=T[0]) i=i-j+2 //i退回到上次匹配首位的下一位 j=1//j回第一位,当前位置if(j>T[0]) i-T[0]3.时间复杂度,最简单的是O(1),平均O(n-m),最坏O((n-m+1)*m)KMP模式匹配算法:1.避免重复遍历2.T串中的首字符与T后面的字符不相等,如果S串的首字符与T串的相等可以推断出后面的
数据库创建提案
1.串的链式存储结构不如顺序存储结构性能好,顺序存储结构,计算机中存在一个自由存储区,叫做"堆",可以由malloc()和free()来管理2.朴素的模式匹配,字串的定位操作通常称为串的模式匹配
linux进程的三态模型:1.就绪状态:获得了除cpu之外的必要资源2.执行状态:获得了cpu,正在执行 3.阻塞状态:等待某个事件发生而无法执行
使用@font-face调用服务器端字体的代码:@font-face { font-family : name ; src : url( url ) ; sRules }
1.登陆验证2.前端效果3.短信验证4.发送短信5.模板展示
MySQL的flush privileges语法:将当前user表的用户信息和privilige表的权限设置从mysql库(就是mysql数据库的内置库)提取到内存里只允许内网用户访问:update user set Host='172.16.%.%' where User='root';
varchar(50),在4.1版本之前代表50个字节;之后的版本代表50个字符char(50),最大字符个数50,尾部的空格会被删除;在进行检索的时候,char列会删除尾部的空格
1.串的比较是通过字符之间的编码来进行的,字符编码指的是字符在对应字符集中的序号2.s<t 满足条件:n<m ; k<min(m,n),Ai=Bi,Ak<Bk 两个条件之一的时候 .词典中单词有序排列前面的字母比后面的字母小,字符串这种数据结构的典型应用3.串的抽象数据类型StrAssign(T,*chars):生成一个值等于字符串常量chars的串TStrCopy(T,S):串S存在,串S复制得串TClearString(S):串S存在,将串清空StringEmpty(S):判断串S是否为空StrLength(S):串S的长度StrCompare(S,T):比较S和T,>0 <0 =0Concat(T,S1,S2):用T返回S1和S2连接而成的新串SubString(Sub,S,pos,len):用Sub返回串S从第pos位置起长度为len的字串
IP登陆限制问题:
1.队列是先进先出的线性表,FIFO,允许插入的一端叫队尾,允许删除的一端队头2.队列的抽象数据类型InitQueue(*Q):初始化操作 QueueLength(Q):返回队列的长度DestroyQueue(*Q):销毁队列 ClearQueue(*Q):清空队列 QueueEmpty(Q):判断队列是否为空GetHead(Q,*e):用e返回队列的队头元素EnQueue(*Q,e):插入e到队列的队尾元素DeQueue(*Q,*e):删除队列的队头元素3.引入两个指针front指向队头元素,rear指向队尾元素的下一个位置,队列顺序存储的不足,出队列时每个元素都移动,如果不移动会有假溢出问题4.循环队列,把队列头尾相接的顺序存储结构,解决假溢出问题5.单目运算符 >算术运算符 >移位 >比较 >按位 >逻辑 >三目运算符 >赋值运算符6.快速排序:通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序 从数列中挑出一个元素,称为基准 重新排列数列,所有元素比基准小的放在基准前面,比基准大的放在基准后面,称为分区操作 递归的把基准值左边的和基准值右边的进行排序
pdo Mysql:$sql ='select * from iplimit_white where ent_id=:ent_id and user_id=:user_id';$sth=$db->prepare($sql);$sth->execute(array(':ent_id'=>1,':user_id'=>2));
php的heredoc技术:<<<Eof……Eof;
1.栈与四则基本运算:1.不需要括号的后缀表达式称为逆波兰表示,解决了程序实现四则运算的难题2.所有符号都在要运算数字的后面出现,9 3 1 - 3*+10 2 /+,遍历表达式,遇到数字就进栈,遇到符号就将栈顶的两个数字出栈运算,结果进栈3.后缀表达式的推导过程,9+(3-1)*3+10/2 ,若是数字就直接输出,若是符号则判断与栈顶的优先级,是右括号或优先级低于栈顶的,栈顶的依次出栈输出,当前符号进栈
2.对照七位的ASCII码表 控制符码值 < 大写字母码值 < 小写字母码值3.文件的逻辑结构是用户可见结构:无结构的流式文件 ; 有结构的记录式文件4.文件型病毒系计算机病毒的一种,主要通过感染计算机中的可执行文件(.exe)和命令文件(.com) 宏病毒是一种寄存在文档或模板的宏中的计算机病毒。 引导型病毒指寄生在磁盘引导区或主引导区的计算机病毒5.七层网络协议:应用层:HTTP FTP SMTP DNS Telnet HTTPS协议在HTTP协议的基础上,添加了SSl/TLS握手以及数据加密传输,也属于应用层协议表示层 会话层传输层:TCP UDP网络层:IP ICMP RIP OSPF BGP IGMP数据链路层:SLIP CSLIP 物理层6.运算符优先级:&&>||>=
group by配合group_concat可以合并多条记录到一条
1.斐波那契数列公式:f(n),当n=0 是0;当n=1 是1;当n>1 f(n-1)+f(n-2)2.迭代法实现数列a[0]=0;a[1]=1;for(int i=2;i<40;i++){a[i]=a[i-1]+a[i-2]}3.递归法实现数列int Fbi(int i){if(i<2) return i==0?0:1;return Fbi(i-1)+Fbi(i-2);}4.迭代使用的是循环结构,递归使用的是选择结构;递归结构清晰但是会建立大量函数副本,迭代不占更多内存
31 65 76 13 27 10 8231 65 76 13 27 10 8231 65 13 76 27 10 8231 65 13 27 76 10 8231 65 13 27 10 76 82
31 65 13 27 10 76 8231 13 65 27 10 76 8231 13 27 65 10 76 8231 13 27 10 65 76 82
索引案例学习:1.如果使用某个索引进行范围查询,就无法再使用另一个索引(或者该索引的后续字段)进行排序了2.使用in()技术
栈的应用-函数递归-斐波那契数列-前面相邻之和构成后一项1.假设兔子在出生两个月以后就有繁殖能力,一对兔子每月能生出一对小兔子,假设所有兔子不死,一年后多少对兔子1 1 2 3 5 8 13 21 34 55 89 144 233
ip格式校验和ip段交集检测获取用户IP:$_SERVER['REMOTE_ADDR']
类的自动加载:1. spl_autoload_register() 函数可以注册任意数量的自动加载器,当使用尚未被定义的类(class)和接口(interface)时自动去加载。2.__autoload() 函数也能自动加载类和接口,在以后的版本中它可能被弃用
栈顶放在单链表的头部,并且不需要头结点,对于空栈,链栈的空其实就是top=NULL,1.链栈的进栈操作s->next=S->top 把当前栈顶元素赋值给新结点的后继S->top=s 把新结点赋值给栈顶指针2.链栈的出栈操作,时间复杂度均为O(1s)p=S->top 栈顶元素赋值给pS->top=S->top->next 栈顶的后继赋值给栈顶,栈顶指针下移free(p) 释放内存
获取系统的性能和状态:1.为基准测试建立目录,将测试结果,配置文件,测试指标,脚本和其他说明保存下来2.收集CPU使用率,磁盘I/O,网络流量统计,show global status计数器等3.自动化测试,可以是一个makefile文件或者一组脚本,可以根据选择:shell,PHP等
1.栈的顺序存储结构-进栈操作:S->top++S->data[S->top]=e出栈操作:S->top--
2.两栈共享空间:两个栈是在数组的两端,向中间靠拢,栈满是top1+1=top2,两个栈顶会面进栈操作:S->top+1=S->top2栈满S->data[++S->top1] 根据传入的栈序号,栈1S->data[--S->top2] 栈2
出栈就是判断两个栈的序号S->top1-- ; S->top2++
基准测试的指标:吞吐量,单位时间内的事务处理数(TPS)响应时间或延迟,测试任务所需的整体时间,百分比响应时间并发性,HTTP协议是无状态的,大多数用户只是浏览读取,并不等同于web服务器的并发性,仅仅是表示会话存储机制可以处理多少数据的能力,关注正在工作中的并发操作或者是同时工作中的线程数或者连接数,使用sysbench测试,记录Threads_running状态值可扩展性,
栈是限定仅在表尾进行插入和删除操作的线性表,先进后出的数据结构,允许插入和删除的一端称为栈顶,另一端称为栈底,不含任何数据元素的栈称为空栈队列是只允许在一端进行插入操作,在另一端进行删除操作的线性表
1.将单链表中终端结点的指针端由空指针改为指向头结点,单循环链表,循环链表和单链表的主要差异就在于循环的判断条件上原来是判断p->next是否为空,现在则是p->next不等于头结点,则循环未结束2.指向终端结点的尾指针代表该循环链表3.两条循环链表合并成一个循环链表p=rearA->next;保存A表的头结点rearA->next=rearB->next->next;将本是B表的第一个结点赋值给rearA->nextrearB->next=p; 将原A表的头结点赋值给rearB->next free(p)
1.双向链表就是在单链表的每个结点中,再设置一个指向其前驱结点的指针域2.双向链表的插入操作,将s插入到p和p->next之间 , 先搞定s的前驱和后继 , 再搞定后结点的前驱 ,最后搞定前结点的后继s->prior=p ;把p赋值给s的前驱s->next=p->next ;把p->next赋值给s的后继p->next->prior=s ;把s赋值给p->next的前驱p->next =s ; 把s赋值给p的后继3.删除结点pp->prior->next=p->next ;把p->next赋值给p->prior的后继p->next->prior=p->prior ;把p->prior赋值给p->next的前驱
插入元素: 时间复 杂度都是O(n)1.如果插入位置不合理,抛出异常2.线性表长度大于等于数组长度,抛出异常或动态增加容量3.从最后一个元素开始向前遍历到第i位置,分别向后移动一个位置 L->data[k+1]=L->data[k]4.将元素填入位置i处 L->data[i-1]=e5.表长加1
1.静态链表其实也是要提前申请大的内存,只是在删除和插入的时候,不需要之后的每个元素都变化2.静态链表本身也是数组 也需要固定分配存储大小 只是静态链表加入了游标 来实现指针的作用 插入和删除和链表的效率一样3.静态链表是为了让没有指针的高级语言也能够用数组实现链表功能4.静态链表分配足够大的空间,两个链表一个实际链表一个备用链表,数组的第一个元素的cur用来存放备用链表第一个结点的下标,数组最后一个元素的cur用来存放第一个插入元素的下标,实际链表的最后一个元素cur为0
FormData类型其实是在XMLHttpRequest 2级定义的,它是为序列化表以及创建与表单格式相同的数据(当然是用于XHR传输)创建一个formData对象实例有几种方式1、创建一个空对象实例 var formData = new FormData();
单链表结构和顺序存储结构的优缺点:1.存储分配方式=>顺序存储是用一段连续的存储单元依次存储线性表的数据元素;单链表采用链式存储结构,用一组任意存储单元存放2.时间性能=>查找 顺序结构是O(1) 单链表是O(n) ;插入和删除 顺序存储是O(n) 单链表是O(1)3.空间性能=>顺序存储是预分配存储空间 ; 单链表不需要预分配,元素个数不受限制
静态链表:数组描述的链表,游标实现法,如何用静态数组模拟动态链表结构的存储空间分配,需要时申请,无用时释放
数组的每个下标都对应一个data和一个cur,cur相当于单链表中的next指针,我们把cur称作游标结构体数组:是指数组中的每个元素都是一个结构体。在实际应用中,结构体数组常被用来表示一个拥有相同数据结构的群体
只要是人写的代码,就有bug,不是这出问题就是那出问题,如果没有问题就是你还没有发现,阿里也不例外楼上说不浮不躁的装个屁呢,房价一直涨涨涨 生活成本一直涨涨涨 你还有心情不浮不躁慢慢潜心研究
链表头指针勘误:1.头指针是指链表指向第一个结点的指针2.若链表有头结点,则是指向头结点的指针3.头指针具有标识作用,用头指针冠以链表的名字4.无论链表是否为空,头指针均存在5.图3-6-4和图3-6-6,两图中“头指针”改为“后继指针地址”。图3-6-6,“0900”应该改为“NULL”6.单链表在C语言中用结构指针来描述7.单链表的读取主要是靠指针后移查找
单链表第i个数据插入结点的思路:1.声明一个指针p指向链表的第一个结点,初始化j从1开始2.当j<i时,就遍历链表,让p的指针向后移,不断指向下一结点,j累加13.若到链表末尾p为空,则说明第i个元素不存在4.否则查找成功在系统中生成空结点s5.将数据元素e赋值给s->data6.单链表的插入标准语句:s->next=p->next; p->next=s;
单链表删除第i个数据结点的思路前三步一样4.查找成功,将想删除的结点p->next赋值给q5.删除标准语句p->next=q->next6.将q结点的数据赋值给e7.释放q结点 , free(q)
插入和删除都分为两部分,遍历查找第i个元素,插入和删除元素,单链表和顺序表的时间复杂度:查找的的时候都是O(n),链表在插入和删除的时候都是O(1),插入和删除越频繁优势越明显
ip登陆限制:1.该企业是否开启的状态位2.该用户是否在白名单3.该用户ip是否在限制ip和ip段中
A和B的并集操作:循环B中的每个元素,判断当前元素是否在A中,如果不在就插入到A中线性表的顺序存储结构用一维数组来实现,第i个数据元素的存储位置可以由a1推算出loc(Ai)=Loc(A1)+(i-1)*c
Service Worker 会在另外的线程去缓存图片,等图片缓存完之后,再次刷新页面,就能看到它的威力。
散列函数:1.直接定址法,f(key)=a*key+b,简单但是很少用2.数字分析法,手机号的后四位等,抽取方法是使用关键字的一部分来计算散列存储位置的方法,在散列函数中是常常用到的手段3.平方取中法4.折叠分割求和法5.除留余数法,f(key)=key mod p (p<=m) 如果表的长度是m,通常p为小于等于表长的最小质数6.随机数法,f(key)=random(key) ,设计好一个随机种子,使用相同的随机种子可以得到相同的数
解决哈希冲突:1.开放定址法之一线性探测法,f(key)=(f(key)+n) mod 12 ,都不是同义词却需要争夺一个地址的情况称为堆积,增加平方运算不让关键字聚集在某一块区域,称为二次探测法f(key)=(f(key)+n的平方) mod 12, 位移量n采用随机函数生成,称之为随机探测法2.再散列函数法,调用多个散列函数3.链地址法将关键字为同义词的记录存储在一个单链表中,在散列表中只保留所有同义词表的头指针4.公共溢出区法,给所有冲突的关键字存到单独的溢出表
C语言静态数组:数组的长度需要事先指定,只能是一个常数,系统会为它分配一个固定大小的空间,以后都不能改变数组越界,访问到数组以外的内存数组溢出,赋值时超出数组长度
动态数组:数组的长度无法预先确定,执行代码的过程中用malloc分配的,需要手动释放内存
php字符串比较大小:1.两个字符进行大小比较时,是比较着这两个字符的ASCII码大小2.两个字符串进行大小比较时,是从第一个字符开始,分别比教对应的ASCII大小3.当一个数字与一个字符串/字符进行大小比较时,首先系统尝试将此字符串/字符转换为整型,例如:intval("999元")为9994.0与任意不可转化为数字的字符串比较都为true
1.结构体指针,指针指向结构体,结构体变量名和数组名不同,数组名在表达式中会被转换成数组指针.2.结构体不会分配内存空间,是一种数据类型,结构体变量才包含实实在在的数据3.终端节点的指针端由空指针改为指向头结点,称为单循环列表,简称循环列表4.顺序表查找时,挨个比较记录a[i]与key的值,有序表查找时利用小于,大于,折半查找 5.散列技术: 存储位置=f(关键字),不需要比较直接取得存储位置;散列技术是在记录的存储位置和它的关键字之间建立一个确定的对应关系f,使得每个关键字key对应一个存储位置f(key).f称为散列函数或者哈希函数;采用散列技术将记录存储在一块连续的存储空间中,被称为散列表或哈希表6.散列技术既是存储方法也是查找方法,主要是面向查找的存储,最适合的求解问题是查找与给定值相等的记录7.不适用散列技术的情况:一对多;范围查找;排序;最大最小值8.冲突:两个关键字key1!=key2,但是f(key1)=f(key2),这种现象称为冲突9.哈希函数的标准是,计算简单,散列地址分布均匀
动态内存分配:1.在静态存储区域分配,编译时就分配好的变量2.在栈中进行分配,函数3.在堆中进行分配,调用malloc等函数,如果没有释放就一直在内存中
ps命令的返回结果:USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND VSZ: 占用的虚拟记忆体大小 RSS: 占用的记忆体大小 TTY: 终端的次要装置号码 (minor device number of tty) STAT: 该行程的状态: D: 不可中断的静止 R: 正在执行中 S: 静止状态 T: 暂停执行START: 行程开始时间 TIME: 执行的时间 COMMAND:所执行的指令
指针变量对星号*的总结:在我们目前所学到的语法中,星号*主要有三种用途:表示乘法,例如int a = 3, b = 5, c; c = a * b;,这是最容易理解的。表示定义一个指针变量,以和普通变量区分开,例如int a = 100; int *p = &a;。表示获取指针指向的数据,是一种间接操作,例如int a, b, *p = &a; *p = 100; b = *p;
float 称为单精度浮点型,double 称为双精度浮点型,采用指数形式(2.1E5 = 2.1×105 ),float 始终占用4个字节,double 始终占用8个字节,小数在内存中的存储形式有关,很多简单的小数压根不能精确存储
哈希冲突攻击利用的哈希表最根本的弱点是:开源算法和哈希实现的确定性以及可预测性,利用特殊构造的key来进行攻击。要解决这个问题的方法则是让攻击者无法轻易构造 能够进行攻击的key序列。PHP采用的是一种 治标不治本的做法: 限制用户提交数据字段数量 这样可以避免大部分的攻击,执行json_decode()的时候也可能会遭受攻击,目前PHP中HashTable的哈希冲突解决方法就是链接法。
SDS(简单动态字符串)和C字符串有区别:1.容易获取长度2.杜绝缓冲区溢出3.减少修改字符串时带来的内存重分配次数
4.疑似问题:删除一个群发列表,增加一个新的群发列表,此时点返回,列表里面会少几条,刷新后正常显示
Service Mesh 是用于处理服务间通信的基础设施层。它负责通过构成现代云原生应用程序的复杂拓扑结构来可靠地传递请求,是位于 TCP / IP 之上的抽象层的网络模型,对服务节点间请求的路由机制进行了抽象
快速排序原理:1.先找第一个数字为基准数2.从右往左找小于基准数的,停止,从左往右找大于基准数的停止,两个交换3.直到左右的相遇停止,和基准数进行交换4.左边的继续递归,右边的继续递归5.快速排序之所以比冒泡快,因为每次交换都是跳跃式的
给定a、b两个文件,各存放50亿个url,每个url各占64字节,内存限制是4G,让你找出a、b文件共同的url1.遍历文件,对每个url求取hash(url)%1000,然后根据所取得的值将url分别存储到1000个小文件2.所有可能相同的url都在对应的小文件3.把其中一个小文件的url存储到hash_set中。然后遍历另一个小文件的每个url,看其是否在刚才构建的hash_set中
快速排序:1.序列中找第一个数作为基准数,
海量日志数据,提取出某日访问百度次数最多的那个IP:1.大文件切分,比如切分成1024个小文件2.每个小文件构筑key是ip,value是次数的map,找出最多的那个3.排序一下
搜索引擎会通过日志文件把用户每次检索使用的所有检索串都记录下来,每个查询串的长度为1-255字节。假设目前有一千万个记录(这些查询串的重复度比较高,虽然总数是1千万,但如果除去重复后,不超过3百万个。一个查询串的重复度越高,说明查询它的用户越多,也就是越热门。),请你统计最热门的10个查询串,要求使用的内存不能超过1G,Top K 算法维护一个Key为Query字串,Value为该Query出现次数的HashTable,每次读取一个Query,如果该字串不在Table中,那么加入该字串,并且将Value值设为1;如果该字串在Table中,那么将该字串的计数加一即可。最终我们在O(N)的时间复杂度内完成了对该海量数据的处理
创建链表尾插法1.创建头结点,头结点的next指向null2.把头结点赋值给一个中间变量3.循环中创建结点, 中间变量的next指向新结点4.新结点覆盖中间变量
主从读取中,有些update语句指定了从库
1209 - The MySQL server is running with the--read-only option so it cannot execute this statement两种原因:1.连到从库了。从库一般设置为只读。2.主库的read_only参数被修改为1
$i=0;echo $i++;输出0echo $i;输出1
vim的多行注释:1.按ctrl + v进入 visual block模式2.按上下选中要注释的行3.按大写字母I,再插入注释符,例如//4.按两下esc5.按ctrl + v进入 visual block模式,按箭头选中要取消的//6.按d删除
c语言字符数组和字符串:1.存放字符的数组称为字符数组 char str[]2.'\0'也被称为字符串结束标志3.由" "包围的字符串会自动在末尾添加'\0'4.逐个字符地给数组赋值并不会自动添加'\0'5.局部变量初始化为零值会自动添加结束标志6.直接使用一个指针指向字符串的形式 char* str7.最根本的区别是在内存中的存储区域不一样,字符数组存储在全局数据区或栈区,第二种形式的字符串存储在常量区。全局数据区和栈区的字符串(也包括其他数据)有读取和写入的权限,而常量区的字符串(也包括其他数据)只有读取权限,没有写入权限。
字符串包含算法:1.时间复杂度O(n + m),空间复杂度O(1)先把长字符串a中的所有字符都放入一个Hashtable里,然后轮询短字符串b,看短字符串b的每个字符是否都在Hashtable里,如果都存在,说明长字符串a包含短字符串b,否则,说明不包含2.用一个整数代替了hashtable,空间复杂度为O(1),时间复杂度还是O(n + m)hash |= (1 << (a[i] - 'A'));if ((hash & (1 << (b[i] - 'A'))) == 0)
发送群发邮件时判断邮件的大小,限制100M
filesize()获取文件字节大小unlink()删除文件rmdir()删除目录
旋转字符串:1.暴力移位法2.三步反转法3.链表翻转4.尾部移到头部5.单词翻转函数:描述客观世界变化规律的重要数学模型,指数函数,对数函数,幂函数指数:a的x次方,a ^ x对数函数:a ^x=N,x叫做以a为底N的对数,x=log(a)N [指数式化为对数式],计算机上的log都是默认以10为底的对数,因此log100 = 2,log1000 = 3
1.微软经典的单词翻转题:输入“I am a student.”,则输出“student. a am I”。
待做:获取模板详情读取s3解析上传图片问题
分布式文件系统是指文件系统管理的物理存储资源不一定直接连接在本地节点上,而是通过计算机网络与节点相连。分布式文件系统的设计基于客户机/服务器模式。
申请redis服务:
申请服务器权限:
go语言圣经-包简介:1.模块化的特性允许每个包可以被其它的不同项目共享和重用2.每个包一般都定义了一个不同的名字空间用于它内部的每个标识符的访问3.控制包内名字的可见性和是否导出来实现封装特性4.修改了源文件必须重新编译该源文件对应的包和所有依赖该包的其他包go语言圣经-包声明1.源文件的开头都必须有包声明语句,确定当前包被其它包导入时默认的标识符(也称为包名)2.默认包名一般采用导入路径名的最后一段的约定3.名字为main的包是给go build(§10.7.3)构建命令一个信息,包编译完之后必须调用连接器生成一个可执行程序
练习 9.3: 扩展Func类型和(*Memo).Get方法,支持调用方提供一个可选的done channel,使其具备通过该channel来取消整个操作的能力(§8.9)。一个被取消了的Func的调用结果不应该被缓存。
数据库持久连接:1.持久的数据库连接是指在脚本结束运行时不关闭的连接。当收到一个持久连接的请求时。PHP 将检查是否已经存在一个(前面已经开启的)相同的持久连接。如果存在,将直接使用这个连接;如果不存在,则建立一个新的连接。所谓“相同”的连接是指用相同的用户名和密码到相同主机的连接。
PDO持久化连接:$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass, array( PDO::ATTR_PERSISTENT => true));
竞争检查器(the race detector):在go build,go run或者go test命令后面加上-race的flag,能够记录所有运行期对共享变量访问工具的test
GO环境变量:$GOROOT GO的安装目录;$GOPATH GO的源码目录
竞争条件:无论任何时候,只要有两个goroutine并发访问同一变量,且至少其中的一个是写操作的时候就会发生数据竞争。
apache配置Directory目录权限:
<Directory 目录路径> #Options Indexes MultiViews #indexes允许目录浏览 #AllowOverride All #允许.htaccess覆盖 AllowOverride AuthConfig #身份认证 AuthName "login" AuthUserFile /etc/apache2/.htpasswd require valid-user</Directory>htpasswd -c /var/www/test/.htpasswd admin
连接管理:1.每个客户端连接都会在服务器进程中拥有一个线程,这个连接的查询只会在这个单独的线程中执行,服务器会缓存线程,5.5及以上版本提供了API支持线程池,可以使用池中的少量线程来服务大量连接2.线程池与连接池区别,连接池是指客户端,预先创建一定的连接,利用这些连接服务于客户端请求,如果连接超过时需要将连接排队
事务:1.严格的ACID测试,原子性,一致性,隔离性,持久性2.死锁是指两个或者多个事务在同一资源上相互占用,并请求锁定对方占用的资源,导致恶性循环,部分或者完全回滚其中一个事务才能打破死锁
rpc:1.远程过程调用,两台服务器a,b,在a服务器上的应用2.首先,要解决通讯的问题,主要是通过在客户端和服务器之间建立TCP连接3.第二,要解决寻址的问题,也就是说,A服务器上的应用怎么告诉底层的RPC框架,如何连接到B服务器(如主机或IP地址)以及特定的端口,方法的名称名称是什么4.第三,当A服务器上的应用发起远程过程调用时,方法的参数需要通过底层的网络协议如TCP传递到B服务器,由于网络协议是基于二进制的,内存中的参数的值要序列化成二进制的形式5.第四,B服务器收到请求后,需要对参数进行反序列化(序列化的逆操作),恢复为内存中的表达方式,然后找到对应的方法(寻址的一部分)进行本地调用6.第五,返回值还要发送回服务器A上的应用,也要经过序列化的方式发送,服务器A接到后,再反序列化,恢复为内存中的表达方式
主键索引和唯一索引的区别:1.主键创建后一定包含一个唯一性索引,唯一性索引并不一定就是主键2.唯一索引允许空值,而主键列不允许为空值3.一个表最多只能创建一个主键,但可以创建多个唯一索引
1.聚簇索引:不是一种单独的索引类型,是一种数据存储方式,在同一个结构中保存b树索引和数据行,一个表只能有一个聚簇索引,innodb通过主键聚集数据,二级索引(非聚簇)需要两次索引查找,如果主键是一个随机的例如uuid,性能就会很糟糕,主键尽量使用自增id.
2.覆盖索引:一个索引覆盖所有需要查询的字段的值,称为覆盖索引,对innodb表特别有用,查询时在explain的extra列可以看到using index,使用时也要符合最左前缀原则
3.索引扫描来做排序,explain后的type列是index,如果没有覆盖全部查询列,速度慢,只有当索引的列顺序和order by子句的顺序完全一致并且所有列的排序顺序都一样,才能使用索引来做排序
高性能的使用索引策略1.独立的列2.前缀索引和索引选择性; 每个列的前几个字符 和 不重复的索引对总记录数的比值 尽量让这个前缀的选择性和完整列的选择性接近,选择性越高越好,这样索引会小点 select count(distinct name)/count(*) as sel from test3.多列索引,注意是否出现索引合并现象4.选择合适的索引列顺序 选择性高的字段放在前面5.聚簇索引,innodb支持6.覆盖索引,不需要回表
两个表添加索引:alter table group0 add index idx_user(user);alter table contact_group0 add index idx_user(user);
企管:企管离职管理项目二期上线
header("Access-Control-Allow-Origin: *");//跨域header头
第九章:基于共享变量的并发9.1.竞争条件 1.没有办法确认一个事件是在另一个事件的前面或者后面发生的话,说明x和y这两个事件是并发的 2.一个函数在并发的情况下,依然可以正常的工作,那么就说这个函数是并发安全的 3.竞争条件指的是程序在多个goroutine交叉执行的时候,没有给出正确的结果 4.只要有两个goroutine并发访问同一个变量,且至少其中的一个是写操作的时候就会发生数据竞争 5.避免数据竞争:不要写变量,避免从多个goroutine访问变量,使用channel来查询更新变量
配置文件中,换成主从:corpinfo 'dsn' => array(有些特殊的查询,是指定的查询的主库:Sina_Application::resource('corpinfo')->getConnection(Sina_Db_Adapter::MASTER)->prepare($strSql);
今天加的白名单问我为啥8号的邮件落垃圾夹,查找添加到白名单的:
聊天服务:1.让一些用户通过服务器向其他所有用户广播文本消息2.程序中有四种goroutine,main broadcaster 每个客户端连接handleConn clientWriter
企邮登陆后主页面白屏:
图:由顶点的有穷非空集合和顶点之间的边集合组成,G(V,E)
并发和并行的区别:并发是两个队列交替使用一台咖啡机,并行是两个队列同时使用两台咖啡机,如果串行,一个队列使用一台咖啡机
操作系统中的堆栈与数据结构中的堆栈是两个概念:1.堆区(heap)一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收,通过malloc和new等动态申请的内存2.栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
Go语言圣经-channels1.如果说goroutine是Go语言程序的并发体的话,那么channels则是它们之间的通信机制。
"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; Trident/7.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.3; .NET4.0C; .NET4.0E; Tablet PC 2.0; MARKANYEPS#25111; SMJB; printmade=3.0.0.8; Microsoft Outlook 14.0.7189; ms-office; MSOffice 14)"
"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/7.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.3; .NET4.0C; .NET4.0E; MARKANYREPORT#25106; printmade=3.0.0.8; Microsoft Outlook 14.0.7197; ms-office; MSOffice 14)"
"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/7.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.3; .NET4.0C; .NET4.0E; MARKANYREPORT#25106; printmade=3.0.0.8; Microsoft Outlook 14.0.7197; ms-office; MSOffice 14)"
"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/7.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.3; .NET4.0C; .NET4.0E; MARKANYREPORT#25106; printmade=3.0.0.8; Microsoft Outlook 14.0.7197; ms-office; MSOffice 14)"
"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.2; WOW64; Trident/7.0; .NET4.0C; .NET4.0E; .NET CLR 2.0.50727; .NET CLR 3.0.30729; .NET CLR 3.5.30729; InfoPath.3; Microsoft Outlook 14.0.7197; ms-office; MSOffice 14)"
S类型的结构体可以包含*S指针类型的成员,这可以让我们创建递归的数据结构,比如链表和树结构等二叉树来实现一个插入排序:type tree struct {}func Sort(values []int) {}插入并且排好序func add(t *tree, value int) *tree {}往树中增加元素func appendValues(values []int, t *tree) []int {}按照树的顺序把树中的值,追加到一个slice中
PHP文件进行加密——ZendGuard加密与ZendLoader解密
go语言隐藏式接口:interface-数据解耦鸭子理论-长得像我们就把它当做一样的好了
1.获取模板列表2.获取模板详情
su -s /bin/bash -c "ls" www使用nologin用户运行程序
特别提示: 报名所需证件A、 身份证 B、一寸白底彩色照片6张露耳免冠照(近视需要带眼镜拍摄)C、外地身份证需要居住卡或居住证(3个月有效期)D、机动车驾驶员申请专项体检合格证明。
制作自己的 Docker 容器1. .dockerignore 忽略打包的文件2. Dockerfile 文件3. docker image build -t koa-demo . //创建image文件4. docker container run -p 8000:3000 -it koa-demo /bin/bash //从image文件生成容器运行容器的 3000 端口映射到本机的 8000 端口,-it参数 容器的 Shell 映射到当前的 Shell
企管离职管理获取代收imap信息内部接口array_unshift头部添加元素array_push尾部添加元素
一个操作如果多次任意执行所产生的影响(或者叫副作用),都是相同的。1.调用方发起创建订单的请求,订单系统收到了,并成功创建订单了。但是由于系统原因或者网络原因等,没有及时告知调用方订单已经创建成功,调用方一直等待回复,直到超时了。调用方再次发起了创建订单的请求,这个时候就可能会生成多个订单。2.使用一个唯一的流水号ID,用来标识是不是同一个请求或者交易。这种ID通常都需要具备全局唯一性。假设让客户端来生成这个ID, 1)先将这个ID保存到一个流水表里面,并且流水表中将这个ID设置为UNIQUE KEY,如果插入出现冲突了,则说明这个创建订单的请求已经处理过了,直接返回之前的操作结果。 2)万一调用方进行重试的时候,重新生成一个流水号,那就没得救了,会生成多个订单了。这个只能让客户端来保证了。
Go语言圣经-匿名函数-警告:捕获迭代变量1.将介绍Go词法作用域的一个陷阱在循环体中用循环变量d赋值一个新的局部变量,问题的原因在于循环变量的作用域2.在该循环中生成的所有函数值都共享相同的循环变量3.通常,为了解决这个问题,我们会引入一个与循环变量同名的局部变量,作为循环变量的副本。
Go语言圣经-Deferred函数在调用普通函数或方法前加上关键字defer,就完成了defer所需要的语法。当defer语句被执行时,跟在defer后面的函数会被延迟执行
Redis 哈希(Hash)Redis hash 是一个string类型的field和value的映射表,hash特别适合用于存储对象。Redis 中每个 hash 可以存储 232 - 1 键值对(40多亿)。hget hset
QUIC(Quick UDP Internet Connection)是谷歌制定的一种基于UDP的低时延的互联网传输层协议QUIC很好地解决了当今传输层和应用层面临的各种需求,包括处理更多的连接,安全性,和低延迟。QUIC融合了包括TCP,TLS,HTTP/2等协议的特性,但基于UDP传输。
404的网站被iptables防火墙拦了while [ 1 ] ;do iptables -D INPUT 1 ;done;
date("Y-m-d",strtotime('Monday'));date("Y-m-d",strtotime('Next Monday'));下周一date("Y-m-d",strtotime('Last Monday'));上周一
表扩展字段:alter table `tblz` add fidin int(10) unsigned NOT NULL DEFAULT '0' ;alter table `tblz` add fidout int(10) unsigned NOT NULL DEFAULT '0' ;
exponential 指数 back-off 倒退
Go语言圣经-函数1.函数可以让我们将一个语句序列打包为一个单元,然后可以从程序中其它地方多次调用2.探索递归函数、匿名函数、错误处理和函数其它的很多特性
Go语言圣经-函数声明1.函数声明包括函数名、形式参数列表、返回值列表(可省略)以及函数体2.形式参数列表描述了函数的参数名以及参数类型3.如果一组形参或返回值有相同的类型,我们不必为每个形参都写出参数类型4.实参通过值的方式传递,因此函数的形参是实参的拷贝,如果实参包括引用类型,如指针,slice(切片)、map、function、channel等类型,实参可能会由于函数的间接引用被修改
go语言圣经-布尔型1.布尔值可以和&&(AND)和||(OR)操作符结合,并且有短路行为2.&&的优先级比||高
chunk_split — 将字符串分割成小块:base64_encode() 的输出转换成符合 RFC 2045 语义的字符串。它会在每 chunklen 个字符后边插入 end行尾序列符号。
go语言圣经-包和文件-导入包1.每个包都有一个全局唯一的导入路径2.按照惯例,一个包的名字和包的导入路径的最后一个字段相同练习 2.2: 写一个通用的单位转换程序,用类似cf程序的方式从命令行读取参数,如果缺省的话则是从标准输入读取参数,然后做类似Celsius和Fahrenheit的单位转换,长度单位可以对应英尺和米,重量单位可以对应磅和公斤等。
&是二进制“与”运算,参加运算的两个数的二进制按位进行运算,运算的规律是:0 & 0=00 & 1=01 & 0=01 & 1=1
练习 2.3: 重写PopCount函数,用一个循环代替单一的表达式。比较两个版本的性能。(11.4节将展示如何系统地比较两个不同实现的性能。)练习 2.4: 用移位算法重写PopCount函数,每次测试最右边的1bit,然后统计总数。比较和查表算法的性能差异。练习 2.5: 表达式x&(x-1)用于将x的最低的一个非零的bit位清零。使用这个算法重写PopCount函数,然后比较性能。
go语言圣经-基础数据类型1.基础类型、复合类型、引用类型和接口类型2.基础类型,包括:数字、字符串和布尔型3.复合数据类型——数组(§4.1)和结构体(§4.2)4.引用类型包括指针(§2.3.2)、切片(§4.2))字典(§4.3)、函数(§5)、通道(§8),都是对程序中一个变量或状态的间接引用
go语言圣经-浮点数1.两种精度的浮点数,float32和float64,应该优先使用float64类型2.%g %e(带指数)或%f的形式参数打印浮点数3.
go语言圣经-声明1.四种类型的声明语句:var、const、type和func,分别对应变量、常量、类型和函数实体对象的声明2.包一级声明语句声明的名字可在整个包对应的每个源文件中访问,局部声明的名字就只能在函数内部很小的范围被访问
go语言圣经-赋值1.元组赋值是另一种形式的赋值语句,它允许同时更新多个变量的值,用法交换两个变量的值2.最大公约数(GCD算法),计算斐波纳契数列(Fibonacci)的第N个数 更加简洁3.表达式太复杂的话,应该尽量避免过度使用元组赋值;调用一个有多个返回值的函数,可以使用元组赋值,额外的返回值来表达某种错误类型,可以用下划线空白标识符_来丢弃不需要的值4.程序中还有很多地方会发生隐式的赋值行为:函数传参,复合类型的字面量
1.上传附件的流程:
2.群发邮件发送带附件邮件
获取保存的已发送邮件模板详情接口,从s3读取文件并解析出内容:
Linux diff比较两个目录的不同:diff dir1 dir2 -urNaq-a --text Treat all files as text.-u -U NUM --unified[=NUM] Output NUM (default 3) lines of unified[统一] context.-u,-U<列数>或--unified=<列数>:以合并的方式来显示文件内容的不同;-N --new-file Treat absent[缺少] files as empty.-r --recursive Recursively compare any subdirectories found.-q --brief Output only whether files differ.[不显示内容]
使用git rebase合并多次commit
2.获取已保存群发模板列表3.续期中转站接口,插入了一个队列,暂时可能此功能不能使用
sha1_file(),计算文件的 sha1 散列值linux json格式化工具jq,yum install jq
curl_setopt_array() - 为 cURL 传输会话批量设置选项CURLOPT_PUT TRUE 时允许 HTTP 发送文件。要被 PUT 的文件必须在 CURLOPT_INFILE和CURLOPT_INFILESIZE 中设置。
location = /uri =开头表示精确匹配,只有完全匹配上才能生效。location ^~ /uri ^~ 开头对URL路径进行前缀匹配,并且在正则之前。location ~ pattern ~开头表示区分大小写的正则匹配。location ~* pattern ~*开头表示不区分大小写的正则匹配。location /uri 不带任何修饰符,也表示前缀匹配,但是在正则匹配之后。location / 通用匹配,任何未匹配到其它location的请求都会匹配到,相当于switch中的default。
Go 语言具有很强的表达能力,它简洁、清晰而高效。得益于其并发机制, 用它编写的程序能够非常有效地利用多核与联网的计算机,其新颖的类型系统则使程序结构变得灵活而模块化。 Go 代码编译成机器码不仅非常迅速,还具有方便的垃圾收集机制和强大的运行时反射机制。 它是一个快速的、静态类型的编译型语言,感觉却像动态类型的解释型语言。
Order Deny,Allow的用法:影响最终判断结果的只有两点:1. order语句中allow、deny的先后顺序,最后的是最优先的;2. allow、deny语句中各自包含的范围。
常用:Order Deny,AllowDeny from all //禁止所有Allow from 61.135.152.134 //允许指定ip
Order Allow,DenyAllow from all //允许所有Deny from 61.135.152.134 //禁止指定ip
config命令:CONFIG GET * 获取所有的配置项config set 设置配置项
查询性能优化:1.为什么查询速度会慢,整个查询过程的生命周期,都可能消耗大量时间2.慢查询基础:优化数据访问 1)向服务器请求了不需要的数据,select * 2)扫描了而外的记录,explain sql查看返回结果中的rows是扫描行数,using where是指全部返回然后过滤不符合条件的,效率低3.重构查询的方式 1)切分查询,大查询变小查询 , 容易使用查询缓存 , 减少锁的竞争 , 容易对数据库进行拆分 2)分解关联查询,join查询拆分后用in实现 ,更加高效减少冗余记录查询4.查询优化基础 1)查询缓存 2)查询优化器,自动进行各种优化 3)MySQL如何执行关联查询 union查询,将每次查询放到一张临时表中,然后再读取临时表 任何关联都是嵌套循环关联操作,回溯 4)排序优化,避免排序,避免大数据量排序,文件排序using filesort效率低 两次传输排序,单次传输排序
redis的监控日志:redis-cli monitor
群发邮件项目主要流程(细节限制暂忽略)1.提供给前端HTTP发送接口参数为: to [群发列表id,根据此id获取列表中的邮箱地址] from [发件人] subject [标题] msgtxt [邮件内容]
3.插入redis服务中 lpush send_mass_mail "{from}|{to}|{eml文件地址}"
4.后台执行脚本 rpop send_mass_mail 1)取出队列中的一条记录,拆分出来发件人,收件人,文件eml地址 2)fopen读取并替换掉eml文件中的发件人部分(因为前面是吧所有人收件人的邮箱地址拼在了To那里), 此时要把当前这个收件人替换回去,如果不替换,收件后会显示出所有的收件人 3)调用内部smtp服务,循环发送邮件 4)队列空时删掉eml文件目录
fwrite(): send of 8192 bytes failed with errno=32 Broken pipesmtp服务那边,配置没有同步,同步以后,我的测试机就没法发信了
发送群发邮件接口开发增加邮箱地址接口开发导入邮箱地址接口开发新增群发列表接口开发获取已发送邮件列表开发获取已发送邮件详情开发获取群发列表接口开发获取邮箱地址列表接口开发删除已发送群发邮件接口开发删除群发列表接口开发删除邮箱地址接口开发获取发送日志列表接口开发
企邮日常维护和功能,性能优化,提升系统可靠性企业用户使用过程中的问题1.处理维护日常提案,解决用户投诉问题,降低用户流失2.运营工作支持
发送群发接口:1.在/mnt/entmail/mass_mail 生成eml文件,规则:sendmassmail_{id}.eml2.插入队列规则:"from|to|邮件文件地址"3.记录到发送表4.保存到已发送模板表
定时脚本:1.轮询队列内容2.取出eml文件内容,拆分替换收件人部分,循环调用内部smtp服务发信
获取邮箱地址列表的分页部分主要代码:$this->sum=empty($this->sum) ? 0:$this->sum;$this->pagenum=ceil($this->sum/$this->pagesize);$this->pageno=empty($req->pageno)? 1 : $req->pageno;$start=($pageno-1)*$pagesize;$end=$pagesize;$preSql="select * from mass_list_detail{tid} where user_email_id=:user_email_id and mass_id=:mass_id order by id desc limit {$start},{$end}";$preSql=$this->makeSql($preSql);
中转站下载文件超限上线,下载中转站文件bug修复
设计能力:懂得如何利用分层、面向对象、设计模式等设计组织代码编码能力:熟悉PHP语法特性,清晰简洁的使用PHP语言解决产品需求,了解不同版本PHP新特性和PHP内部实现原理工程能力:可以快速构建工程,使用工程化思想开发项目协作能力:懂得快速多人协作开发维护工程项目,基于版本控制软件和WiKi平台进行日常开发扩展能力:熟悉和了解通讯协议DNS/TCP/HTTP/HTTPS/SSL/TLS/SMTP/IMAP,进行域名解析流程调试,迁移项目到更安全协议,邮箱业务相关工作.了解前端技术,包括HTML/CSS/JS和安卓移动端等,方便与其他同事进行沟通合作,提升项目的前端用户体验.熟悉常用数据存储技术,包括MySQL,Memcache,以及一些消息队列MemcacheQ,Redis,高性能的使用MySQL,内存缓存和队列服务解决项目需求熟练使用和配置Nginx,Apache,PHP-FPM,Memcache,SVN,FTP等常用服务端软件,搭建和测试LNAMP环境,维护线上项目稳定运行熟练使用Linux Shell以及各种命令工具进行系统日志监控,错误调试,调查统计等日常工作优化能力:产品功能优化、业务逻辑优化、基础技术优化、操作系统底层优化等
工程化:即系统化、模块化、规范化的一个过程。指将具有一定规模数量的单个系统或功能部件,按照一定的规范,组合成一个模块鲜明、系统性强的整体。
查看openssl的版本:openssl version -a OpenSSL从1.0.1开始才支持TLS 1.2
如果我有10万会员需要做excel导出,请问怎么让程序不超时,两个接口一个是触发导出脚本的接口一个是查询进度的接口脚本执行,前台无需等待,脚本里往一个地方存一下当前第几条的进度,查询进度接口1秒一查进度进度100%了,文件就生成了,直接跳到文件去下载
curl网络连接不上,iptables清除一下就好了
-A INPUT -s 202.106.182.212/32 -d 125.39.104.0/24 -p tcp -m tcp --dport 22 -j ACCEPT -A INPUT -s 202.106.184.253/32 -d 125.39.104.0/24 -p tcp -m tcp --dport 22 -j ACCEPT -A INPUT -s 219.142.78.199/32 -d 125.39.104.0/24 -p tcp -m tcp --dport 22 -j ACCEPT -A INPUT -s 219.142.118.199/32 -d 125.39.104.0/24 -p tcp -m tcp --dport 22 -j ACCEPT -A INPUT -s 125.39.104.0/24 -d 125.39.104.0/24 -p tcp -m tcp --dport 25 -j ACCEPT -A INPUT -s 125.39.104.0/24 -d 125.39.104.0/24 -p tcp -m tcp --dport 80 -j ACCEPT -A INPUT -s 125.39.104.0/24 -d 125.39.104.0/24 -p tcp -m tcp --dport 110 -j ACCEPT -A INPUT -s 125.39.104.0/24 -d 125.39.104.0/24 -p tcp -m tcp --dport 143 -j ACCEPT -A INPUT -s 125.39.104.0/24 -d 125.39.104.0/24 -p tcp -m tcp --dport 2025 -j ACCEPT -A INPUT -s 125.39.104.0/24 -d 125.39.104.0/24 -p tcp -m tcp --dport 11811 -j ACCEPT -A INPUT -s 125.39.104.0/24 -d 125.39.104.0/24 -p tcp -m tcp --dport 20024 -j ACCEPT -A INPUT -s 60.28.175.224/32 -d 125.39.104.0/24 -p tcp -m tcp -j ACCEPT -A INPUT -s 60.28.164.37/32 -d 125.39.104.0/24 -p tcp -m tcp -j ACCEPT -A INPUT -d 125.39.104.0/24 -p tcp -j REJECT --reject-with icmp-port-unreachable -A INPUT -d 125.39.104.0/24 -p udp -j REJECT --reject-with icmp-port-unreachable
上线定时发信的群发单显问题
mysql内存不足启动失败:[ERROR] InnoDB: mmap(136151040 bytes) failed; errno 12[ERROR] InnoDB: Cannot allocate memory for the buffer pool[ERROR] InnoDB: Plugin initialization aborted with error Generic error[ERROR] Plugin 'InnoDB' init function returned error.[ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.[ERROR] Failed to initialize plugins.[ERROR] Aborting需要分配交换空间swapdd if=/dev/zero of=/swapfile bs=1M count=1024mkswap /swapfileswapon /swapfilefree -h 查看swap空间有了在文件/etc/fstab中加入 /swapfile swap swap defaults 0 0
nonaggregated的 非聚集问题使用 select @@sql_mode; 命令可以看到,数据库设置了 ONLY_FULL_GROUP_BY 的mode,对于GROUP BY聚合操作,如果在SELECT中的列,没有在GROUP BY中出现,又没有出现在聚集函数中,那么这个SQL是不合法的,因为列不在GROUP BY从句中
一个数据表,字段:id、id_num(18位身份证号);id_num前八位代表城市,第17位是奇数的话是男,是偶数的话是女,写出sql语句:统计每个城市的男性和女性select count(mass_name) from mass_list where mod(substring(mass_name,17,1),2)=1 group by substring(mass_name,1,8) union select count(mass_name) from mass_list where mod(substring(mass_name,17,1),2)=0 group by substring(mass_name,1,8);
正则表达式模式修正符:i 忽略大小写m 多行视作一行g 全局匹配s .圆点匹配换行符,默认不包括换行x 空白字符除了被转义的或在字符类中的以外完全被忽略,在未转义的字符类之外的 # 以及下一个换行符之间的所有字符,包括两头,也都被忽略。e preg_replace() 在替换字符串中对逆向引用作正常的替换u 此修正符启用了一个 PCRE 中与 Perl 不兼容的额外功能。模式字符串被当成 UTF-8。U : 正则表达式的特点:就是比较”贪婪“ .* .+ 所有字符都符合这个条件
MySQL预处理技术:1.减轻服务器压力2.防止sql注入,把传递过去的危险字符也只当做参数处理3.将sql语句强制一分为二:第一部分为前面相同的命令和结构部分,第二部分为后面可变的数据部分基本使用prepare sql_1 from "select * from mass_list";execute sql_1;drop prepare sql_1;传参:prepare sql_2 from "select * from mass_list where id=?";set @id=1;execute sql_2 using @id;
prepare sql_3 from "insert into mass_list (mass_name) values(?)";set @name='zhang';execute sql_3 using @name;
prepare sql_3 from "insert into mass_list (mass_name,user_email_id) values(?,?),(?,?)";set @name='zhang';set @id=1;execute sql_3 using @name,@id,@name,@id;//参数按顺序传递
测试查找群发单显功能问题,定时发信,群发单显功能,没有拆分后发送
新建群发列表接口代码编写
json_encode()1.默认就是把所有 ASCII 可显示字符以外的统统转义为 Unicode如果把那些字符转义为 Unicode 之后,无论文件编码是否一致,都不会出现乱码,因此中文转成Unicode编码是有好处的
2.对单引号和双引号的处理是有差异的,并且受数组键值包裹字符串的引号影响
4.出现错误时的处理,json_decode失败的问题:
var_dump(json_last_error());//打印出错信息var_dump($b);
一、什么是接口文档?在项目开发中,web项目的前后端分离开发,APP开发,需要由前后端工程师共同定义接口,编写接口文档,之后大家都根据这个接口文档进行开发,到项目结束前都要一直维护。二、为什么要写接口文档?1、项目开发过程中前后端工程师有一个统一的文件进行沟通交流开发2、项目维护中或者项目人员更迭,方便后期人员查看、维护
RESTful 接口:REST 是一个很流行的前后端交互形式的约定。这只是一套约定,并不是某个技术标准.REST 充分利用了 HTTP 规范中的方法,达到接口描述的语义化
安全:1.使用HTTPS协议2.数据加密
群发助手项目文档设计
两种方式set_include_path($new_include_path)ini_set('include_path',$new_include_path);利用常量 PATH_SEPARATOR 可跨平台扩展 include path,可以把自己设置的path加在现有include_path的尾部
MERGE存储引擎把一组MyISAM数据表当做一个逻辑单元来对待,让我们可以同时对他们进行查询
索引(Index)是帮助MySQL高效获取数据的数据结构,可以理解为“排好序的快速查找数据结构”,在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法
覆盖索引是select的数据列只用从索引中就能够取得,不必读取数据行,你想要通过索引覆盖select多列,那么需要给需要的列建立一个多列索引,当然如果带查询条件,where条件要求满足最左前缀原则
逗号分隔值(Comma-Separated Values,CSV,有时也称为字符分隔值,因为分隔字符也可以不是逗号),其文件以纯文本形式存储表格数据(数字和文本)上传csv后,不用再另存,直接使用$_FILES['uploadfile']['tmp_name']文件路径
对数公式是数学中的一种常见公式,如果a^x=N(a>0,且a≠1),则x叫做以a为底N的对数,记做x=log(a)(N),其中a要写于log右下。其中a叫做对数的底,N叫做真数。通常我们将10以底的对数叫做常用对数,以e为底的对数称为自然对数。
mysql的索引分为 单列索引 多列索引 唯一索引多列索引生效原则是 从前往后依次使用生效,如果中间某个索引没有使用,那么断点前面的索引部分起作用,断点后面的索引没有起作用;index(a,b,c) ,最左前缀原则where a=3 and b=45 and c=5 .... 这种三个索引顺序使用中间没有断点,全部发挥作用;where a=3 and c=5... 这种情况下b就是断点,a发挥了效果,c没有效果where b=3 and c=4... 这种情况下a就是断点,在a后面的索引都没有发挥作用,这种写法联合索引没有发挥任何效果;where b=45 and a=3 and c=5 .... 这个跟第一个一样,全部发挥作用,abc只要用上了就行,跟写的顺序无关
给域名添加两个A记录到不同的ip,可以作为DNS负载
1.群发列表功能梳理,用户自建群发列表,发送群发邮件
计算email的hashfunction getEmailHash($email, $mod = 10) { $m = md5($email, true); $f = 0; $wm = 65536 % $mod; for ($i = 0; $i < 4; ++$i) { $n = ord($m[$i * 2 + 1]) * 256 + ord($m[$i * 2]); $cm = $n % $mod; for ($j = 0; $j < $i; ++$j) { $cm = $cm * $wm; if ($cm > $mod) { $cm = $cm % $mod; } } $f += $cm; } return $f % $mod;}
OAuth应用通常包括三种角色:Consumer:消费方;Service Provider:服务提供者;User:用户
在BRE方式中,只承认^ 、$、 . 、[ 、] 、*这些是元字符,所有其他的字符都被识别为文字字符。而ERE中,则添加了(、 ) 、{ 、} 、?、 + |、等元字符(及其相关功能),如果在BRE中使用需要加反斜杠
grep默认是BRE, -E是ERE , -P是PRE
deposits 存放 sanity 神志正常
linux查看平均负载 cat /proc/loadavgon-cpu/off-cpu火焰图的使用是程序性能分析的利器pgrep根据名称查看进程idstrace追踪系统调用和信号TokuDB 是一个支持事务的“新”引擎,有着出色的数据压缩功能devops三板斧,awk,strace,Gnuplot
快速查找配置文件:strace -eopen nginx 2>&1 |grep conf
春节上班第一天
静态链表:数组描述的链表,游标实现法
扫码登陆功能上线:
usleep() 函数延迟代码执行若干微秒。一微秒等于百万分之一秒。
防止洪水攻击的脚本#!/bin/bash/bin/netstat -na |grep SYN_RECV |awk '{print $5}' |awk -F : '{print $1}' | sed '/^$/d' |sort|uniq -c|sort -rn|head -n 10|grep -v -E '192.168|127.0'′ |sed '/^$/d' |awk '{if ($2!=null && $1>20);{print $2}}'>/tmp/dropip
for i in $(cat /tmp/dropip)do/sbin/iptables -A INPUT -s $i -j DROPecho "$i kill at `date`">>/var/log/ddosdone
DNS(Domain Name System,域名系统),万维网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串第一,从协议的层面看,它是一种应用层协议第二,从实体的层面看,它是一个由分层的DNS服务器实现的分布式数据库根DNS服务器, 顶级域(Top-Level Domain, TLD )DNS服务器和权威DNS服务器根DNS服务器:因特网上有13个根DNS服务器, 其中大部分分布在北美洲
西单机房故障,影响登陆,收信,发信
ob_implicit_flush(1)打开隐式刷新使用 cURL 扩展,它可以设置连接超时和读取超时(CURLOPT_TIMEOUT,CURLOPT_CONNECTTIMEOUT)CURLOPT_TIMEOUT 允许 cURL 函数执行的最长秒数。CURLOPT_TIMEOUT_MS 设置cURL允许执行的最长毫秒数。CURLOPT_CONNECTTIMEOUT 在尝试连接时等待的秒数。设置为0,则无限等待。CURLOPT_CONNECTTIMEOUT_MS 尝试连接等待的时间,以毫秒为单位。设置为0,则无限等待。
ftell — 返回文件指针读/写的位置fseek — 在文件指针中定位fgets — 从文件指针中读取一行fread($fp,2);读取指定字节数
redis安装:apt-get install redis-serverredis-serverredis-cliredis> set foo barOKredis> get foo"bar"
命令:1.遍历key keys/scan keys * ;scan 02.判断key是否存在existsexists foo3.删除key,deldel foo4.返回给定key的value类型,typetype foo5.给list添加元素,lpushlpush foo5 16.查看list长度,llenllen foo7.查看元素,lindexlindex foo 08.查看一段列表,lrangelrange foo 0 -19.从头部删除元素,lpoplpop foo
Maximum execution time of 30 seconds exceededhtmlspecialchars_decode();
1.查找发送邮件服务器错误问题2.修改pop代收为最近30天和收取全部需求整理3.测试apache运行模式优化问题4.测试TCP连接问题
查找发送邮件服务器错误问题
man ascii可以生成ascii码表
修改pop代收为最近30天和收取全部需求整理
结束连接:TCP 有一个特别的概念叫做 half-close,这个概念是说,TCP 的连接是全双工(可以同时发送和接收)连接,因此在关闭 连接的时候,必须关闭传和送两个方向上的连接。客户机给服务器一个 FIN 为1的 TCP 报文,然后服务器返回给客户端一个确认 ACK 报文, 并且发送一个 FIN 报文,当客户机回复 ACK 报文后(四次握手),连接就结束了。
客户端状态迁移:CLOSED->SYN_SENT->ESTABLISHED->FIN_WAIT_1->FIN_WAIT_2->TIME_WAIT->CLOSED服务端状态迁移:CLOSED->LISTEN->SYN 收到->ESTABLISHED->CLOSE_WAIT->LAST_ACK->CLOSED
ulimit -aulimit -n用于限制进程能够打开的文件描述符的最大数目。因为任何设备在linux下都是文件,通信的接口也有专门的接口文件负责,所以linux下进程tcp链接的最大并发量也受限于该值
十六进制表示法:一个字节由8位组成,值域 0000 0000 ~ 1111 1111,0~255以16为基数,0~9 a~f十进制: 0 1 2 3 4 5 6 7十六进制:0 1 2 3 4 5 6 7二进制: 0000 0001 0010 0011 0100 0101 0110 01118 9 A B C D E F8 9 10 11 12 13 14 151000 1001 1010 1011 1100 1101 1110 1111习题:将0x39A7FB转为二进制 0011 1001 1010 0111 1111 1011将二进制1100 1001 0111 1011 转为十六进制 0xC97B
字长:32位机,64位机,说的就是32字长,64字长,英文叫word size,虚拟地址范围0~2的32次方-1 大约4GB
seq:Sequence number(顺序号码)ack:Acknowledge number(确认号码)syn:SYN(synchronous建立联机)
TCP首部标志位:S SYN 同步序号F FIN 完成发送R RST 复位P PST 推送. 置为0
深入理解计算机系统:虚拟存储器是一个抽象的概念.它为每个进程提供了一个假象,即每个进程独占的使用主存并发和并行:线程级并行,指令级并行,单指令多数据并行
企邮扫码登陆接口部分上线用户上传附件错误1.$_FILES --超全局变量,HTTP 文件上传变量通过 HTTP POST 方式上传到当前脚本的项目的数组,PHP 能够接受任何来自符合 RFC-1867 标准的浏览器上传的文件,上传的过程中,文件存放在/tmp/phpXxXxx里,有的时候磁盘满了,/tmp/下放不了文件也会报错
3.上传多个文件 <input name="userfile[]" type="file" /><br /><input name="userfile[]" type="file" /><br />获取$_FILES['userfile']['tmp_name'][0],$_FILES['userfile']['tmp_name'][1]
5.对 PUT 方法的支持,使用标准的输入流,$putdata = fopen("php://stdin", "r");
基于应用的性能测试:
service apache2 restart && sudo service php5-fpm restart
文件内容关键字提取并进行计数排序(百度和sohu面试题):此类问题,可以演变成分析日志,查看TCP各个状态连接数,查看单IP连接数排名等等
1.数据类型和变量:数据是放在内存中的,明确三件事:数据存储在哪里、数据的长度以及数据的处理方式int n;数据类型指明了数据的长度和处理方式,变量名指明了数据存储在哪里
2.数据长度:是指数据占用多少个字节,数据类型指明了数据长度基本类型占用的字节数:char 1,short 2,int 4,long 4,float 4,double 8
3.整数的长度,C语言并没有严格规定 short、int、long 所占用的字节数,只做了宽泛的限制:short 至少占用2个字节。int 建议为一个机器字长。32位环境下机器字长为4字节,64位环境下机器字长为8字节。short 的长度不能大于 int,long 的长度不能小于 int。
4.整数的正负数:int是4个字节占用32位内存,第31位表示符号,0是正数,1是负数;如果不希望设置符号位,可以在数据类型前面加 unsigned如果不考虑正负数,当所有的位都为1时它的值最大,为 2的32次方-1 = 4,294,967,295 ≈ 43亿
计算:111:2的3次方-1 101:2的2次方+2的0次方 10:2的1次方+2的0次方
5.在内存中,数值一律采用补码表示原码:一个整数转成二进制;反码:正数的反码就是其原码;负数的反码是将原码中除符号位以外的每一位取反;补码:正数的补码就是其原码;负数的补码是其反码加1。
8.链表的实现很简单,通常只需要三个关键元素:指向上个元素的指针指向下个元素的指针数据容器
413 Request Entity Too Large企邮HTTPS上传附件,代理限制太小了
企邮上传超大附件报错ACT ERRORwin7 ie8compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET4.0C; .NET4.0E
Connect,Processing,Waiting,Total字段。这些数据能大致说明测试过程中所需要的时间。其实我们可以只看Total字段中的min,max两列数据值,这两个值分别显示了测试过程中,花费时间最短和最长的时间。
1.吞吐量:指对网络、设备、端口、虚电路或其他设施,单位时间内成功地传送数据的数量,三个重要参数QPS(TPS)、并发数、响应时间并发:在操作系统中,是指一个时间段中有几个程序都处于已启动运行到运行完毕之间;与并行的区别,并行是指两个或者多个事件在同一时刻发生,并发是指两个或多个事件在同一时间间隔内发生
nmap扫描端口的工具
扫码登陆获取检测状态接口增加header头Cache-Control:no-cache
一.从PHP 5.6.x 移植到 PHP 7.0.x不兼容:1.错误和异常处理 1.1 set_exception_handler()函数申明的类型 function handler($e){ var_dump($e); } set_exception_handler('handler'); throw new Exception("sb"); 1.2 当内部构造器失败的时候,总是抛出异常 1.3 解析错误会抛出 ParseError 异常 1.4 E_STRICT 警告级别变更
cgi:一种协议,CGI/1.1 标准fastcgi:一种升级版协议,常驻型php-cgi:解释PHP脚本的程序,实现了fastcgi协议,进程管理较差php-fpm:是fastcgi进程的管理器,升级版php-cgi,升级了进程调度
哈希表是一种通过哈希函数,将特定的键映射到特定值的一种数据结构,它维护键和值之间一一对应关系。1.键(key):用于操作数据的标示,例如PHP数组中的索引,或者字符串键等等。2.槽(slot/bucket):哈希表中用于保存数据的一个单元,也就是数据真正存放的容器。3.哈希函数(hash function):将key映射(map)到数据应该存放的slot所在位置的函数。4.哈希冲突(hash collision):哈希函数将两个不同的key映射到同一个槽的情况。(链接法和开放寻址法解决)
数据容器定义:1.保存哈希表数据本身typedef struct _Bucket{ char *key; void *value; struct _Bucket *next;} Bucket;2.保存 typedef struct _HashTable{ int size; int elem_num; Bucket** buckets;} HashTable;
1.修复企邮发送超大附件获取中转站地址拼接完整url2.修复企邮签名保存并设置为默认签名错误3.测试修改密码后弹窗重新输入验证新密码问题4.测试扫码登陆失败提案问题5.前端资源加载后,文件不全问题,CDN问题
测试扫码登陆失败问题
TCP状态TIME_WAIT:主动关闭方在收到被关闭方的FIN后会处于并长期,2个MSL时间(1-4分钟),主动回收并将TCP连接设为CLOSED问题:主动关闭方短时间内大量关闭连接,该socket所占用的本地端口号将一直无法释放stdin, stdout, stderr ,标准输入,标准输出,标准错误
1.老师留下作业,我不会做就抄别人的,然后去办公室交作业,看见老师说:“我抄完了! ”2.我同事跟人争执,急了张口来了句“你以为我吃饭长大的啊?”我一直纳闷他到底吃什么长大的。
1.测试修改密码后弹窗重新输入验证新密码2.客户端获取签名接口代码思路梳理分表的时候,是根据当前用户的唯一标识计算出的hash值,作为分表名称id,所有的这个用户的数据,只会进入这张分表中3.要做:对PHP版本升级,测试相应性能,修改高版本PHP不兼容的地方.系统化了解PHP的不同版本的差异点;系统化了解性能测试以及性能测试框架;系统性总结现在项目的性能瓶颈点,升级版本对项目的提升点以及带来的整体好处
无头浏览器即headless browser,是一种没有界面的浏览器。既然是浏览器那么浏览器该有的东西它都应该有,只是看不到界面而已。
CGI:通用网关接口Common Gateway Interface,它可以让一个客户端,从网页浏览器向执行在Web服务器上的程序请求数据CGI描述了客户端和这个程序之间传输数据的一种标准
CGI的运行原理1.客户端通过HTTP协议访问URL2.服务端HTTP daemon守护进程启动子进程,在子进程中把数据传递给CGI程序3.子进程通过HTTP协议返回给客户端
malloc函数的实质体现在,它有一个将可用的内存块连接为一个长长的列表的所谓空闲链表。调用malloc函数时,它沿连接表寻找一个大到足以满足用户请求所需要的内存块。
strcat函数将两个char类型的数据连接,返回char *strlen()函数:返回字符串的长度,在#include <string.h>这个头文件中
上线webmail弹窗
企邮新浪存储部分兼容HTTPS修复企邮发信文本框空格问题
EDS开发:支持代理商查看名下用户的eds报表客服系统外发登陆日志查询优化显示详细的错误日志,显示外发频率次数限制
PHP中弱类型的实现:1.变量存储在zval结构体中typedef struct _zval_struct zval;//typedef给类型起一个别名zval结构体的type字段就是实现弱类型最关键的字段了,type的值可以为: IS_NULL、IS_BOOL、IS_LONG、IS_DOUBLE、IS_STRING、IS_ARRAY、IS_OBJECT和IS_RESOURCE 之一。
2.变量的值存储在zvalue_value联合体中typedef union _zvalue_value zvalue_value结构体和共用体的区别在于:结构体的各个成员会占用不同的内存,互相之间没有影响;而共用体的所有成员占用同一段内存,修改一个成员会影响其余所有成员。共用体使用了内存覆盖技术,共用体占用的内存等于最长的成员占用的内存.
ICO (ICO是一种区块链行业术语)IPO:首次公开募股
写时复制:PHP存储变量的结构体,结构体名_zval_struct,结构体成员:struct _zval_struct{ zvalue_value value;//变量值 zend_uint refcount__gc;//指向该结构体的变量数 zend_uchar type;//变量类型 zend_uchar is_ref__gc;//是否为引用变量,0否,1是}$myName = $name;这个过程中并没有主动变成两个结构体(这也算PHP内部实现优化的一种,只用一个结构体,省了内存)。$myName改成’gzchen’,而是复制多了一份结构体出来,两个结构体分别对应着$name和$myName。这个就是写时复制(Copy-on-write,COW)在作怪,他没有在$myName = $name;赋值的时候就分裂成两个结构体,而是在我们改写其中一个变量时发生效果,属于一种慢复制(也称慢分裂)
unsigned int是非负整数unsigned char 8个bit
$memLimit=str_replace('M','',ini_get("memory_limit"))*1024*1024; $memUsage= memory_get_usage()*2; if($memUsage<$memLimit){ return; } if($memUsage<1024*1024*1000){ ini_set("memory_limit",$memUsage); Sina_Mail_Log::error("increase memory {$memUsage}","EXTEND_MEMORY"); }
php的写时复制(Copy-on-Write,也缩写为COW):PHP中将一个变量赋值给新变量时,不会立即为新变量分配内存空间,只是增加了对内存空间的引用。当原变量或者新变量作出任何改变时,才会为新变量 分配一块内存空间var_dump(memory_get_usage());//int(120784)$a=10;var_dump(memory_get_usage());//int(120864),增加80$b=$a;var_dump(memory_get_usage());//int(120912),增加48echo $b;var_dump(memory_get_usage());//int(120912),不变$b=10;var_dump(memory_get_usage());//int(120944),比120864增加80
86万 30年还清,利息87万等额本息还款(每月固定),等额本金还款(每月递减)房贷有三种贷款买房方式,商业贷款,公积金贷款,公积金+商业贷款组合贷款
Remix是指一首曲子的重新编曲混音版或一张重新编曲混音专辑。Verse主歌 Chorus副歌 Bridge桥接 ,flow:从哪开始,在哪结束,中间怎么转。
show slave status\G; 里面Slave_IO_Running: Connecting,Slave_SQL_Running: Yes
主主复制:change master to master_host='115.159.28.111',master_user='root',master_password='xx',master_log_file='mysql-bin.000006',master_log_pos=154;
3.对数公式a^x=N(a>0,且a≠1),则x叫做以a为底N的对数,记做x=log a (N)大O符号表示算法复杂度O(1) 常数复杂度O(n) 线性复杂度O(n^2)平方复杂度O(log n)对数复杂度,以2为底n的对数
B树:平衡多叉查找树,这种数据结构一般用在数据库和文件系统上,B-tree就是指的B树磁盘:是一个扁平的圆盘(与电唱机的唱片类似)。盘面上有许多称为磁道的圆圈,数据就记录在这些磁道上。树的高度:从结点x向下到某个叶结点最长边的条数树的深度:从根节点往下数
树:具有n个节点的有限集节点的度:一个节点拥有的子节点数量即成为节点的度叶节点:没有子节点的节点节点关系:孩子节点,双亲节点,兄弟节点,三角关系表示法:双亲表示法[下标,data,parent]查找双亲方便,查找孩子麻烦孩子表示法[下标,data,firstchild,child,next]双亲孩子表示法[下标,data,parent,firstchild,child,next]孩子兄弟表示法[data,child,brother]
mysql中的索引类型(index/key):普通索引:默认的主键索引:自增字段一定是,唯一性约束;主键不一定自增唯一索引:提供唯一性约束,可以有多个唯一索引全文索引:不支持中文全文检索,一般用第三方,coreseek/xunsearch外键索引:只有InnoDB支持,效率不高不推荐,只使用外键思想保证数据一致性和完整性