一 .技术
1)概要:
架构: http://blog.csdn.net/learner811/article/details/39226331
结构: http://blog.csdn.net/learner811/article/details/48412201
linux pipe 监控 (free sar top vmstat uptime)
命令:
http://blog.csdn.net/learner811/article/details/47177219
http://blog.csdn.net/learner811/article/details/50111983
系统: http://blog.csdn.net/learner811/article/details/51487238
监控: http://blog.csdn.net/learner811/article/details/50111983
mysql index 主从(show master status change master to start slave | I/O sql) | 提交(脏读 幻读 不可重复读 串行化)
索引:
http://blog.csdn.net/learner811/article/details/46289173
http://blog.csdn.net/learner811/article/details/46397819
新特性: http://blog.csdn.net/learner811/article/details/49401245
运维: http://blog.csdn.net/learner811/article/details/46355475
知识: http://blog.csdn.net/learner811/article/details/33749053
php array 算法(快排 冒泡 插入 选择)
算法:
(
经典算法
)http://blog.csdn.net/learner811/article/details/48802051
算法概念 http://blog.csdn.net/learner811/article/details/28971369
算法使用 http://blog.csdn.net/learner811/article/details/32068329
算法游戏 http://blog.csdn.net/learner811/article/details/49706591
哈希算法 http://blog.csdn.net/learner811/article/details/27048289
原理 http://blog.csdn.net/learner811/article/details/46580349
插件 http://blog.csdn.net/learner811/article/details/46447241
配置 http://blog.csdn.net/learner811/article/details/38089299
安全 http://blog.csdn.net/learner811/article/details/46799009
设计模式 http://blog.csdn.net/learner811/article/details/39518651
redis+cache curd 区别(主从 事务 持久化 内存和失效等等)
语法:
http://blog.csdn.net/learner811/article/details/48491501
索引: http://blog.csdn.net/learner811/article/details/51002695
http://blog.csdn.net/learner811/article/details/46401519
http://blog.csdn.net/learner811/article/details/46421829
nginx order I/O (epoll就绪通知,不用轮询整个事件表)
http://blog.csdn.net/learner811/article/details/38166767
git
http://blog.csdn.net/learner811/article/details/51585010
http 首部(通用 请求 响应 实体) http://blog.csdn.net/learner811/article/details/51418026
2)详细:
linux
管道:cut join exec redirect +preg
//redirect : cat + > < >> 2>/dev/null tee
cat test.shtest1.sh 2>/dev/null | grep -n 'echo'
ls test.shtest1.shtestsh.sh 2>err.txt | grep 'test'
grep -n 'echo' <test.sh
cat test.sh>test.txt
cat termcap* >> termcapback
cat test.sh|tee -a test.txt &>/dev/null <==> /dev/null 2>&1 正确和错误的信息全部丢弃
ls -l / | tee -a ~/homefile | more
//execute : cat + sh mail tar rpm iconv xargs
cat testpipe.txt | sh testpipe.sh
cat test.sh|mail -s 'test' [email protected]
tar -cvf -packname filename| tar -xvf -(这个减号是取前面的输出作为输入)
rpm -qa|grep licq
iconv -f gb18030 -t utf-8 new-aa.txt
cut -d':' -f1 /etc/passwd | xargs -p -n 5 -e'lp' finger
find /sbin -perm +7000 | xargs ls -l
//join: join paste col more expand head tr
last | tr '[a-z]' '[A-Z]'
cat /etc/passwd | tr -d ':' > /root/passwd.linux
man col | col -b > /root/col.man
cat /etc/man.config | col -x | cat -A | more
paste /etc/passwd /etc/shadow
cat /etc/group|paste /etc/passwd /etc/shadow -|head -n 3
join -t ':' -1 4 /etc/passwd -2 3 /etc/group
grep '^MANPATH' /etc/man.config | head -n 3 | \
>expand -t 6 - | cat -A
//cut:echo +cut split awk sort grep wc touch less
wc -l lsroot*
last | grep [a-zA-Z] | grep -v 'wtmp' | wc -l
grep --color=auto 'MANPATH' /etc/man.config
touch `date +%Y%m%d%k%M%S`.txt
ls -al /etc | less
echo $PATH | cut -d ':' -f 3,5 //3- 3.5 3-5
export | cut -c 12-
cat /etc/passwd | sort -t ':' -k 3 -n
echo $PATH | cut -d ':' -f1 | sort | uniq -c
split -b 300k /etc/termcap termcap
split -l 10 /etc/termcap termcap
cat /etc/passwd | awk -F ':' '{print $1"\t"$2}'
kill -9 `ps -ef | grep smbd | tr -s ' ' | awk -F' ' '{print $2}'`
//preg
(sed -n '1,$p'|grep -n 'echo')<test.sh #这个脚本比较有意思了。由于前面是管道,后面需要把test.sh内容重定向到 sed ,然后sed输出通过管道,输入给grep.需要将前面用"()"运算符括起来。在单括号内的命令,可以把它们看作一个象一个命令样。如果不加括号test.sh就是grep 的输入了。
#上面一个等同于这个
sed -n '1,$p'<test.sh | grep -n 'echo'
sed -n '1,10p'<test.sh | grep -n 'echo'
cat filename |grep -v '^[0-9]*$' | sed 's/|/ /g' |sort -nrk 8 -nrk 9 |tail -n +1 |head -n 10
字符:12
//tr split tee wc wget iconv tar cut join awk xargs sed
tr 删除冒号 cat /etc/passwd |tr -d ':' > /root/passwd.linux
split 分割10行 split -l 10 ./err.txt termcap
tee 输出文件 cat test.sh | tee -a ok.txt
wc 统计行数 last | grep [a-zA-Z] | grep -v ‘zhouyue' | wc -l
wget下载一个文件: wget -P dir url
iconv 转码:iconv -f from -t to new-aa.txt
tar压缩和解压:tar -cvf -packname filename| tar -xvf -(这个减号是取前面的输出作为输入)
cut 截取第一列 cat /etc/passwd |cut -d ':' -f1 | sort | uniq -c
join 连接字符串 join -t ':' -1 4 /etc/passwd -2 3 /etc/group //-1是第一个文件 -2是第二个文件 4是第四个字段 3是第三个字段 匹配的拿前面去,拼接字符,
awk 选取某一列 cat /etc/passwd | awk -F ':' '{print $5}'>>awk.txt 2>&1
xargs php改名字 ls |grep .php |xargs -i mv {} {}.bak
(sed -n '1,$p' )
php 数组
说明:一般的,数组的curd和sort全是操作数组本身,指针也是。
补充一点,就是curd(array,value)而search是(value,array)
//array 元素 集合 kv array_重组 回调 填充 计算 +排序
array() each() reset() end() array_pop() array_push() reset() count() shuffle() range() array_shift array_unshift current pos next prev
array_multisort() +排序 sort-升序 r-降序 k-键名+ a-保持索引关系 u-自定义算法 |nat-自然
array_intersect() array_diff()
array_unique() array_chunk() array_reverse() array_flip() array_slice() array_combine() array_merge array_rand array_search
in_array() array_keys() array_values() array_key_exists() list() each()
array_filter() array_walk() array_map()
array_sum array_product array_count_values
array_fill array_pad
http首部
通用:cache-control connection date pragma trailer transfer-encoding upgrade via warning
请求:accept accept-charset accept-encoding accept-language authorization expect from host if-match -f=modified-since if-none-match
if-range if-unmodified-since max-forwards proxy-authorization range referer user-aget
响应 :accept-ranges age etag location proxy-authenticate retry-after server vary www-authenticate
实体:allow content-encoding content-language content-length content-location content-md5 content-range content-type expires last-modified
+cookie: set-cookie cookie
+other:x-frame-options x-xss-protection dnt p3p
nginx + git
cache(kv ex):
+自建索引
* key - user:userid:9:email(表名:主键名:主键值:列名)
[email protected]
* val - 返回:个数|是否修改|存在性|类型|秒数 -1(已过期) -2(不存在);空字符串|旧值|头尾元素或中间元素|返回随机值
* ex - mem指定 | redis可指定可不指定 ttl
string 静态数据:存取
hash 属性数据:关系
set:去重数据:集合
list:列表数据:头尾
sort set 排序数据:先后
//存取 时效 加减1 键名操作 事务 持久化
//get set setex setex delete mset mget getMultiple=>multi flushdb flushall (ex nx m+)
//ttl persist setTimeout=>expire expireAt| (+4)
//incr incrby decr decrby (number)
//keys randomKey type dbsize rename renameNx move exists (key use)
//curd +eists contain len
//string:getSet get/setRange append strlen (get set)
//hash h m/set m/get del keys vals getall len exists incrby (field 0=>1 2=>3 4=>5 )
//list:l r push/x pop set get | l range/trim/rem/insert lsize |rpoplpush (in out range(save del get insert) lists)
+
//set s add rem move pop sort inter/store union/store diff-前面的差集/store randMember members contains=>sismember size=>scared (inter union diff | add rem pop | member(contain size rand))
//zset z add rem |rev/range rem/rangebyscore score rank |count incrby size |union/inter(add and multiple)
(key score meber | score member | score member … ... )
./memcached -m 256 -c 1000 -P -l 127.0.0.1 -p 11211 -u root -d /tmp/memcached.pid
getVersion getStats hit/cmd.. getExtendedStats getStatus
mysql 索引
覆盖索引用通俗的话讲就是在select的时候只用去读取索引而取得数据,无需进行二次select相关表。这样的索引的叶子节点上面也包含了他们索引的数据。
select a from table_name where b ·····;这样的一个查询,都知道索引应该加在b上面,
查询的处理过程:
首先去检索b索引找到与其对应的索引,
然后根据索引区检索正确的数据行。
注意:没选中索引列和where子句中使用了like,是不能覆盖索引的
覆盖索引不用遵循最左的顺序,但是要建在一个索引内,哪怕是单列的索引也可以是 using index
EXPLAIN SELECT
houseRoleType
FROM house WHERE houseFine=0;
//where 子句内遵循最左前缀
EXPLAIN SELECT
houseTags
FROM house WHERE houseRoleType>0 AND houseType>0 AND houseFine>0
Order 使用索引情况:
Order By Yes:
* where column order x,y 支持最左前缀:column,x,y
* select y from table order by x x,y不必是同一个索引,但必须是索引
Order By No:
* 不同的索引
* 非连续的索引
* asc+desc
* 表达式和多个值
特别提示:mysql一次查询只能使用一个索引。
二.项目(需求 开发 测试 + 编程守则)
1)项目管理:无形(风险+人员)
软件是无形的,开发过程难以预见
风险:
识别--项目(人员) + 产品(程序) + 业务(销售)
分析--可能性(大中小)+ 后果(灾难 严重 可容忍 可忽略)
规划—规避+最小化+应急措施
监控—识别项中反馈的
人员:
主管,包容差异性的一致对待,分类包括任务+自我实现+交互(重要,察觉不和谐 )
组员,规模不要过大,还要有凝聚力,双向沟通是衡量沟通是不是有效的指标
项目规划:
思想:都需要使用眼力直接估算工作量或者估算项目和产品特点
内容:报价 评审 (进度(任务 工作量(人/日)工期 依赖关系) = 条形图+人员分配图 | 工作量=情景点+任务数) 估算(应用组件 功能点 代码行数 | 系统规模+人员变化)
2)需求工程:需求可行性 需求发现 需求描述 需求有效性
用户需求==>系统需求(功能+非功能)
需求文档:术语 需求定义 体系结构 需求描述 系统模型 系统进化
细化:
需求描述 +需求分析 +需求发现 +需求验证
— 需求描述 : 功能 描述 输入 来源 输出 目的地
事件 需求
前置条件 后置条件 其他
— 需求分析:
需求发现 需求分类和组织 需求优先权 需求描述 |
不切实际需求
不可避免的需求 不了解需求 不同的需求 特别的需求 破坏需求 不完善的需求
—需求发现:文档整理 人员采访
用户故事 用例 ==>深入实际(
需求来源于对别人活动的了解)
—需求验证:
有效性 一致性 完备性 真实性 可检验性
需求管理:
原因 + 方法
原因:
技术变化 用户变化 功能变化
方法:
识别 变更(分析 估算 实现)
可追溯 ==>
保持需求描述和系统实现的同步,
3)编程准则:
限制信息可见性,抽象数据类型
检查输入有效性,范围 位数 表现 合理性
异常处理,异常报告给用户 异常通知其他系统 异常处理方法
最小化出错结构,无条件分支 浮点数 并行 递归 中断 继承 别名 无边界数组 默认处理
重启能力,不必重新表单填写 自动保存相关数据不同重新跑数 和向后恢复操作
数组边界
超时处理
常量命名
缺陷分类:
数据缺陷:变量初始化 生命但未使用 赋值两次但中间没使用 数组越界
控制缺陷:不可达代码 无条件的进行循环
输入输出缺陷:变量输出两次,期间没有新赋值
接口缺陷:参数类型 参数数量 函数结果无法使用 未被调用的函数
存储缺陷:未赋值 数据泄露
软件测试:
测试只能够证明存在错误,而不能证明它们不存在
软件审查,审查—>测试—>用例
单纯测试,不能确信输出异常,是由于一个
新的错误造成的,还是
原来的错误的副作用造成的
软件审查,可以发现,由于程序
交互未预料到的情况,
时序问题,和系统
性能问题而导致的
测试用例,是在对输入和
特定情况下的输出,以及锁测试对象的描述
4)分类:
开发测试 + 发布测试 + 用户测试
--
开发测试:缺陷测试==>(
测试驱动开发,减少了回归测试的代价)
单元(状态机)-划分区域 +边界考虑 +路径测试
组件(接口) -接口误用 接口误解 时序错误
系统(时序图)-组件兼容和集成,能正确地进行交互,通过它们的接口在适当的时候传送正确的数据
--
发布测试:有效性测试==>
需求测试-情景测试-性能测试(压测)
--
用户测试 :用户+开发 用户启发 用户验收
项目开始时,了解需求,看远一些,
记住大图景
;找好方法,
分析业务流程
,增加并发性
编程时,
不要靠巧合编程
,
常重构,多测试,多用自动化
;
别重复
,
保持正交性,实现可替换
思想,
提供选择
,多学习,学会交流,不断改进
4)编程守则
技能:
信息(字符数字)集合(数组)透过界面(人机交互),对数据( 数据库 文本 缓存)进行模块化(面向对象的类和面对变化的参数)的批量(循环重复)处理(赋值转化 条件变化)
想要内化这些小声音,还是要靠实践,如果不实践,即使你把这些小声音写在100块钱的高档笔记本上也没有用。
规范:
函数小 参数少 动名配合效果好,变量 函数(做什么或回答做什么) 明其义,注释自然不用了,调用依赖有先后 展示行为隐藏数据
命名:类 变量和数据库 缩写和魔法数字 | 目录 app clas conf data doc htdocs iamges css js lib template upload
注释:作用 参数 返回值 作者 日期
代码风格:缩进 断行 打印
感受:
你可以把它想做是一种心理上的杂耍(边抛边接:通过轮流抛接,使两个或两个以上的物体同时保持在空中)
设计看成是一个险恶的、杂乱的和启发式的过程
开发高质量代码最终并没有要求你付出更多,只是你需要对资源进行重新分配,以低廉的成本来防止缺陷的出现,从而避免代驾高昂的修正工作
在小项目里的一些看起来“理当如此”的活动在大项目中必须仔细地计划
编程工作本质上是项无法监督的工作,因为没人真正清楚你正在做什么。
状况共有=目标共存+信息共享 通用性 = 功能最小化+沟通最大化 |
solve:现象+ 问题+方法;
重构:大布局==>小步快跑 (
面向对象 封装 继承 多态 | 单一 替换 倒置 隔离 开闭 多用组合少用继承
)
5.分层 数据和业务( 贫血模型 vs 充血模型)
6.领域设计
观念:没有银弹,只能通过职责分配的高内聚和低耦合来实现
泛化(Generalization), 实现(Realization),关联(Association),聚合(Aggregation),组合(Composition),依赖(Dependency)