diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..c219de4d --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +.DS_Store +.sass-cache diff --git a/README.md b/README.md new file mode 100644 index 00000000..e69de29b diff --git a/css/style.css b/css/style.css new file mode 100644 index 00000000..dfe85060 --- /dev/null +++ b/css/style.css @@ -0,0 +1,162 @@ +* { + box-sizing: border-box; } + +html, +body { + display: block; + position: relative; + margin: 0; + padding: 0; + background-color: #eee; + font-family: "Source Han Sans SC", "Helvetica Neue", Helvetica, Arial, "Lantinghei SC", "Hiragino Sans GB", STHeiti, "Microsoft Yahei", "Microsoft Sans Serif", sans-serif; + font-size: 16px; + word-wrap: break-word; + word-break: break-all; } + +ul { + margin-top: 1px; + margin-bottom: 1px; + margin-left: 0; + padding-left: 3%; + list-style-type: square; } + ul li { + line-height: 1.5em; } + +p { + line-height: 1.5em; + margin: 0; } + +h1, +h2, +h3 { + margin: 10px 0; } + +.hide { + display: none !important; } + +.root { + margin: 10px; + padding: 10px 40px 80px; + background-color: #fff; + border-width: 1px; + border-style: solid; + border-color: #ddd; + border-radius: 5px; } + .root h1 { + font-size: 1.7em; } + .root p span { + color: #c00; } + .root .join-us { + width: 100%; + padding: 0; + margin: 1em 0 1em -6%; + list-style: none; + text-align: center; } + .root .join-us li { + display: inline-block; } + .root .join-us li:first-child { + margin-right: 5%; } + .root ul h2 { + font-weight: 400; } + .root ul .node li { + margin: 0.5em 0; } + .root ul .node li h3, + .root ul .node li h4, + .root ul .node li h5 { + margin: 0; + padding: 0; + font-weight: 400; } + .root ul .node li h5 { + font-size: 0.95em; } + +#intro h2, +#end h2 { + font-size: 1.17em; + font-weight: 500; } + +#frontEndIndex h2, +#cloudComputingIndex h2, +#securityIndex h2, +#IOAMIndex h2, +#bigDataIndex h2, +#language h2 { + display: inline-block; + color: #17f; } + #frontEndIndex h2:focus, #frontEndIndex h2:hover, + #cloudComputingIndex h2:focus, + #cloudComputingIndex h2:hover, + #securityIndex h2:focus, + #securityIndex h2:hover, + #IOAMIndex h2:focus, + #IOAMIndex h2:hover, + #bigDataIndex h2:focus, + #bigDataIndex h2:hover, + #language h2:focus, + #language h2:hover { + color: #00f; + text-decoration: underline; } +#frontEndIndex h3 span, +#cloudComputingIndex h3 span, +#securityIndex h3 span, +#IOAMIndex h3 span, +#bigDataIndex h3 span, +#language h3 span { + font-size: 0.85em; + font-weight: 400; } + +#IH h2 { + display: inline-block; + color: #17f; } + +.to-top, .to-top::before { + display: block; + position: fixed; + opacity: 0.98; } + .to-top::before { + content: ""; + right: 2em; + bottom: 2em; + width: 4em; + height: 4em; + background-image: url("../img/top.svg"); + background-size: contain; + background-repeat: no-repeat; } + .to-top:focus, .to-top:focus::before, .to-top:hover, .to-top:hover::before { + cursor: pointer; } + +li.closed { + list-style-image: url("../img/plus.png"); } + +li.opened { + list-style-image: url("../img/minus.png"); } + +li.normal { + list-style-image: none; } + +.expand-collapse { + display: block; + position: fixed; + top: 0; + right: 2em; + width: 8em; + height: 2em; + padding: 0.5em; + background-color: #fff; + border-width: 1px; + border-style: solid; + border-color: #ddd; + border-top: none; + font-size: 0.8em; + text-align: center; } + .expand-collapse a { + color: #17f; } + .expand-collapse a:focus, .expand-collapse a:hover { + color: #00f; + cursor: pointer; + text-decoration: underline; } + +footer { + margin-left: 10px; + margin-bottom: 10px; } + +/*# sourceMappingURL=style.css.map */ diff --git a/css/style.css.map b/css/style.css.map new file mode 100644 index 00000000..3aac8d28 --- /dev/null +++ b/css/style.css.map @@ -0,0 +1,7 @@ +{ +"version": 3, +"mappings": "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", +"sources": ["../sass/_base.sass","../sass/list.sass"], +"names": [], +"file": "style.css" +} diff --git a/data/IOAM.md b/data/IOAM.md new file mode 100644 index 00000000..f1e311ac --- /dev/null +++ b/data/IOAM.md @@ -0,0 +1,64 @@ +- ### Linux基础 + - Linux FHS : Filesystem Hierarchy Standard + - Linux 基本操作命令:Linux command cheat sheet + + - #### Linux 内置编辑器: + - vi + - nano + + - Linux 系统 + - Centos + - Debian + - Ubuntu + +- ### 运维命令 + +- ### 基础服务 + - LAMP或LNMP :Apache/Nginx,MySQL,PHP/Python/Perl LAMP (software bundle) + - FTP + - DNS + - SAMBA + - EMAIL + - NTP + - DHCP + +- ### 运维平台工具 + - Nagios + - Puppet + - Zabbix + - Cacti + - SaltStack + +- ### 脚本 + - Shell + - Python + - Perl + +- ### 底层 + - Linux C + - Linux 内核 + +- ### 网络 + - TCP/IP协议 + - tcpdump抓包 + +- ### DevOps + - SSH证书 + - Fabric + - SaltStack + - Puppet + - pssh/dsh + +- ### 安全 + - #### 防火墙配置 + - iptables + +- ### 硬件 + - 接口类型 + - 查看硬件信息 + - 知道各类型服务器,如塔式、机架式、刀片式 + +- ### 其它 + - 安全意识 + - 责任心 + - 沟通方式/技巧 \ No newline at end of file diff --git a/data/IOAM.png b/data/IOAM.png new file mode 100644 index 00000000..a72004f6 Binary files /dev/null and b/data/IOAM.png differ diff --git a/data/big-data.md b/data/big-data.md new file mode 100644 index 00000000..d0fe909b --- /dev/null +++ b/data/big-data.md @@ -0,0 +1,94 @@ +- ### 大数据处理框架 + - #### Spark + - RDD + - Spark SQL + - Spark Streaming + - MLLib + + - #### Hadoop + - HDFS(分布式文件系统) + - Mapreduce(计算框架) + - Yarn(资源管理平台) + - Pig(piglatin 语句到 mapreduce 的映射) + - Hive(数据仓库,提供 SQL) + - Mahout(机器学习算法的 mapreduce 实现库) + + - #### Kafka + - #### Storm + - #### ELK + - ElasticSearch + - Logstash + - Kibana + +- ### 数据库 + - SQL + - MySQL + - MongoDB + - Cassandra + - Redis + - SQLite + - bsddb + - HBase + +- ### 编程语言 + - Python + - R + - Ruby + +- ### 数据分析挖掘 + - MATLAB + - SPSS + - SAS + + +- ### 数据可视化 + - R + - D3.js + - ECharts + - Excle + +- ### 人工智能 + - #### 机器学习 + - 聚类 + - 时间序列 + - 推荐系统 + - 回归分析 + - 文本挖掘 + - 决策树 + - 支持向量机 + - 贝叶斯分类 + - 神经网络 + +- ### 算法 + - #### 一致性 + - paxos + - raft + - gossip + + - #### 数据结构 + - 栈,队列,链表 + - 散列表 + - 二叉树,红黑树,B树 + - 图 + + - #### 常用算法 + - ##### 排序 + - 插入排序 + - 桶排序 + - 堆排序 + - 快速排序 + - 最大子数组 + - 最长公共子序列 + - 最小生成树 + - 最短路径 + - 矩阵的存储和运算 + +- ### 云计算 + - #### 云服务 + - SaaS + - PaaS + - IaaS + - Openstack + - Docker + + diff --git a/data/big-data.png b/data/big-data.png new file mode 100644 index 00000000..bcc7f820 Binary files /dev/null and b/data/big-data.png differ diff --git a/data/cloudComputing.md b/data/cloudComputing.md new file mode 100644 index 00000000..6ae1a3dd --- /dev/null +++ b/data/cloudComputing.md @@ -0,0 +1,202 @@ +- ### 运维 + - #### DevOps + - 持续交付 + - 持续集成 + + - #### 部署 + - 蓝绿部署 + - 灰度发布 + - 金丝雀发布 + - Canary 部署 + - PHOENIX 部署 + - AWS CloudFormation + + - #### 配置 + - Chef + - Puppet + - Ansibie + - AWS OpsWorks + +- ### 开发 + + - #### 流程 + - Scrum + - Crystal + - FDD + + - #### 语言 + - Java + - Python + - Go + - Javascript + - PHP + - Ruby + +- ### 架构 + + - #### 分布式系统 + - ##### 消息队列 + - ZeroMQ + - ActiveMQ + - RabbitMQ + - AWS SQS + + - ##### 事件/消息驱动 + - AWS SWS + - AWS Lambda + - AKKA + + - ##### RPC + - Thrift + - Protocol + + - #### Microservices + - #### RESTFull + - #### CAP 理论 + + +- ### 应用 + - #### 前端应用 + - ##### Web 应用 + - Javascript/Ajax + - HTML/CSS + - 桌面虚拟化 + - 移动应用 + - IoT + + - #### 后端应用 + - 高性能计算 + - 渲染 + + - #### 行业应用 + - CRM + - ERP + - 生物科学 + +- ### 基础架构 + - #### 计算 + - ##### 自动扩展 + - AWS Autoscaling + - OpenStack/Hoo! + + - ##### 负载均衡 + - AWS ELB + - HAProxy + - Nginx + + - ##### 虚拟化 + - ##### Hypervisor + - Xen + - KVM + - Hyper-V + + - ##### 容器 + - Docker + - CoreOS + - UnixLXC + + - #### 网络 + - ##### TCP/IP + - ##### VLANs + - ##### DNS/CDN + - ##### HTTP/HTTPS 协议 + + - #### 存储 + - ##### 网络存储 + - AWS EBS + - NFS v4 + - Ceph + - Apache CloudStack + + - ##### 对象存储 + - AWS S3 + - OpenStack Swift + + - ##### 块存储 + - SAN + - AWS EBS + - RAID 概念 + + - ##### 灾难恢复 + - ##### 文件系统 + - ext4 + - XFS + +- ### 平台 + - #### 操作系统 + - ##### Linux + - Redhat/Centos + - Ubuntu + - Debian + - SUSE + - ##### Windows Server + +- ### 数据管理 + - #### SQL + - AWS RDS + - MySQL + - PostgreSQL + + - #### NoSQL + - DynamoDB + - MongoDB + - Cassandra + + - #### 缓存 + - Momcached + - Redis + - AWS Elastics Cache + + - #### 检索 + - Solr + - Elasticssearch + - AWS Elastics Search + +- ### 大数据 + - #### 语言、工具 + - R + - Python + - Java + - Scala + + - #### MapReduce + - Hadoop + - HDFS + - HBase + - Hive + - Spark + + - #### 数据流 + - AWS Kinesis + - Storm + + - #### 机器学习 + - Spark ML + - scikit learn + - AWS ML + + - #### 身份认证 + - SAML + - OpenID + - Microsoft AD + - AWS IAM + + - #### 管理 + - ##### 日志 + - AWS CloudTrail + - Logstash + - Fluentd + + - ##### 监控 + - ZABBIX + - OBSERVIUM + - INICGA + - AWS CloudWatch + +- ### 安全 + - #### Firewall + - #### DDOS + - #### iptables + - #### WAF + - #### IDS/IPS + - #### VPN \ No newline at end of file diff --git a/data/cloudComputing.png b/data/cloudComputing.png new file mode 100644 index 00000000..c659a7e3 Binary files /dev/null and b/data/cloudComputing.png differ diff --git a/data/dev-lang-Go.md b/data/dev-lang-Go.md new file mode 100644 index 00000000..5ea5d9d5 --- /dev/null +++ b/data/dev-lang-Go.md @@ -0,0 +1,95 @@ +- ### Golang + - #### Go 语言环境搭建 + - ##### Go 安装 + - ##### GOPATH 与工作空间 + - ##### Go 命令 + - ##### Go开发工具 + - #### GO 语言编程基础 + - ##### 关键词和语法(Language Syntax) + - ##### 数据类型(Arrays, Slices and Maps) + - ##### 流程控制(if/else,for/range) + - ##### Go 函数(Function) + - ##### 面向对象(Methods, Interfaces and Embedding) + - ##### 包处理(Packaging and Exporting) + - ##### Go 指针(Using Pointers) + - ##### 程序测试(Testing and Debugging) + - ##### 对象合成(Composition) + - ##### 错误处理(Error Handling) + - ##### 标准库(Standard Library) + - ##### 反射(Reflection) + - #### 并发编程 + - ##### Go 并发基础(Concurrency, Race Conditions and Channels) + - ##### 并发模式(Concurrency Patterns) + - #### Go Web 编程 + - ##### Web基础 + - ##### Web工作方式 + - ##### Go 搭建一个简单的web服务 + - ##### Go 的 HTTP 包详解 + - ##### 表单 + - ##### 处理表单的输入 + - ##### 验证表单的输入 + - ##### 预防跨站脚本 + - ##### 防止多次递交表单 + - ##### 处理文件上传 + - ##### 数据库 + - ##### database/sql接口 + - ##### 使用MySQL数据库 + - ##### 使用PostgreSQL数据库 + - ##### 使用beedb库进行ORM开发 + - ##### NOSQL数据库操作 + - ##### Session 和数据存储 + - ##### Session 和 Cookie + - ##### Go 如何使用 Session + - ##### Session 存储 + - ##### 预防 Session 劫持 + - ##### 文本文件处理 + - ##### XML 处理 + - ##### JSON 处理 + - ##### 正则处理 + - ##### 模板处理 + - ##### 文件操作 + - ##### 字符串处理 + - ##### Web服务 + - ##### Socket 编程 + - ##### WebSocket + - ##### REST + - ##### RPC + - ##### 安全与加密 + - ##### 预防 CSRF 攻击 + - ##### 确保输入过滤 + - ##### 避免 XSS 攻击 + - ##### 避免 SQL 注入 + - ##### 存储密码 + - ##### 加密和解密数据 + - ##### 国际化和本地化 + - ##### 设置默认地区 + - ##### 本地化资源 + - ##### 国际化站点 + - ##### 错误处理,调试和测试 + - ##### 错误处理 + - ##### 使用GDB调试 + - ##### Go怎么写测试用例 + - ##### 部署与维护 + - ##### 应用日志 + - ##### 网站错误处理 + - ##### 应用部署 + - ##### 备份和恢复 + - ##### 如何设计一个Web框架 + - ##### 项目规划 + - ##### 自定义路由器设计 + - ##### Controller 设计 + - ##### 日志和配置设计 + - ##### 实现博客的增删改 + - ##### 扩展Web框架 + - ##### 静态文件支持 + - ##### Session 支持 + - ##### 表单支持 + - ##### 用户认证 + - ##### 多语言支持 + - ##### pprof支持 + - #### Go 应用 + - ##### Docker + - ##### Bee Go + - ##### NSQ + - ##### NewSQL + - #### Go 实战案例 \ No newline at end of file diff --git a/data/dev-lang-Go.png b/data/dev-lang-Go.png new file mode 100644 index 00000000..a2797205 Binary files /dev/null and b/data/dev-lang-Go.png differ diff --git a/data/dev-lang-total.md b/data/dev-lang-total.md new file mode 100644 index 00000000..70f43de4 --- /dev/null +++ b/data/dev-lang-total.md @@ -0,0 +1,152 @@ +- ### 综述 + - #### 范式 + - ##### 声明式 + - ##### 函数式 + - Common Lisp + - Clojure + - Haskell + - Erlang + - Scala + - LISP + - Logo + - F# + - ##### 逻辑式 + - Prolog + - ##### 命令式 + - ##### 非结构化 + - COBOL + - ##### 结构化 + - ##### 面向对象 + - Visual Basic + - Objective-C + - Smalltalk + - Python + - Ruby + - Eiffel + - Java + - C++ + - C# + - ##### 过程式 + - Delphi/Object Pascal + - Fortran + - BASIC + - Pascal + - Go + - C + - ##### 原型 + - IO + - ##### 元编程 + - ##### 泛型/模板 + - Eiffel + - C++ + - D + - ##### 反射化 + - ECMAScript + - Python + - Java + - Ruby + - PHP + - Perl + - R + + - #### 移动 + - ##### IOS + - Swift + - AppleScript + - Objective-C + - ##### 黑莓 + - JAVA + - HTML + - C/C++ + - Adobe Air + - ##### Android + - JAVA + - ##### windows phone + - C# + - VB + - C++ + - javascript + + - #### 平台 + - ##### .NET框架 + - Visual Basic .NET + - Visual C# + - ASP.NET + - C# + - F# + - J# + - ##### Java VM + - Groovy + - Clojure + - JRuby + - Ceylon + - Jython + - Scala + - Kawa + - Java + + - #### 脚本语言 + - Lua + - Perl + - JSP + - PHP + - ASP + - ##### Shell + - sh + - csh + - ksh + - sed + - awk + - bash + - Ruby + - Tcl/Tk + - Python + - VBScript + - AppleScript + - ##### ECMAScript派生 + - Dart + - JScript + - JavaScript + - ActionScript + - CoffeeScript + + - #### 其他 + - Ada + - Forth + - AAuto + - 易语言 + - ALGOL + - ##### 汇编语言 + - ##### x86/amd64汇编指令 + - Intel汇编 + - AT&T汇编 + + - #### 专业工具 + - ##### 标记 + - Curl + - ##### SGML + - XML + - SVG + - XSLT + - SSML + - SGML + - HTML + - XHTML + - DHTML + - XML Schema + - ##### 数据库 + - LINQ + - T-SQL + - XQuery + - PL/SQL + - Visual FoxPro + - ##### 样式格式描述 + - XSL + - CSS + - ##### 工业与辅助设计 + - AutoCAD + - ##### 科学与统计计算 + - R + - MATLAB + - FORTRAN + - Mathematica \ No newline at end of file diff --git a/data/dev-lang-total.png b/data/dev-lang-total.png new file mode 100644 index 00000000..247fbb00 Binary files /dev/null and b/data/dev-lang-total.png differ diff --git a/data/dev-lang.md b/data/dev-lang.md new file mode 100644 index 00000000..4eeacc60 --- /dev/null +++ b/data/dev-lang.md @@ -0,0 +1,248 @@ + - ### 综述(贡献者:@吴坚;下载:开发语言综述.md | 开发语言综述.png) + - #### 范式 + - ##### 声明式 + - ##### 函数式 + - Common Lisp + - Clojure + - Haskell + - Erlang + - Scala + - LISP + - Logo + - F# + - ##### 逻辑式 + - Prolog + - ##### 命令式 + - ##### 非结构化 + - COBOL + - ##### 结构化 + - ##### 面向对象 + - Visual Basic + - Objective-C + - Smalltalk + - Python + - Ruby + - Eiffel + - Java + - C++ + - C# + - ##### 过程式 + - Delphi/Object Pascal + - Fortran + - BASIC + - Pascal + - Go + - C + - ##### 原型 + - IO + - ##### 元编程 + - ##### 泛型/模板 + - Eiffel + - C++ + - D + - ##### 反射化 + - ECMAScript + - Python + - Java + - Ruby + - PHP + - Perl + - R + + - #### 移动 + - ##### IOS + - Swift + - AppleScript + - Objective-C + - ##### 黑莓 + - JAVA + - HTML + - C/C++ + - Adobe Air + - ##### Android + - JAVA + - ##### windows phone + - C# + - VB + - C++ + - javascript + + - #### 平台 + - ##### .NET框架 + - Visual Basic .NET + - Visual C# + - ASP.NET + - C# + - F# + - J# + - ##### Java VM + - Groovy + - Clojure + - JRuby + - Ceylon + - Jython + - Scala + - Kawa + - Java + + - #### 脚本语言 + - Lua + - Perl + - JSP + - PHP + - ASP + - ##### Shell + - sh + - csh + - ksh + - sed + - awk + - bash + - Ruby + - Tcl/Tk + - Python + - VBScript + - AppleScript + - ##### ECMAScript派生 + - Dart + - JScript + - JavaScript + - ActionScript + - CoffeeScript + + - #### 其他 + - Ada + - Forth + - AAuto + - 易语言 + - ALGOL + - ##### 汇编语言 + - ##### x86/amd64汇编指令 + - Intel汇编 + - AT&T汇编 + + - #### 专业工具 + - ##### 标记 + - Curl + - ##### SGML + - XML + - SVG + - XSLT + - SSML + - SGML + - HTML + - XHTML + - DHTML + - XML Schema + - ##### 数据库 + - LINQ + - T-SQL + - XQuery + - PL/SQL + - Visual FoxPro + - ##### 样式格式描述 + - XSL + - CSS + - ##### 工业与辅助设计 + - AutoCAD + - ##### 科学与统计计算 + - R + - MATLAB + - FORTRAN + - Mathematica + +- ### Golang(贡献者:@谢孟军;下载:Golang.md | Golang.png) + - #### Go 语言环境搭建 + - ##### Go 安装 + - ##### GOPATH 与工作空间 + - ##### Go 命令 + - ##### Go开发工具 + - #### GO 语言编程基础 + - ##### 关键词和语法(Language Syntax) + - ##### 数据类型(Arrays, Slices and Maps) + - ##### 流程控制(if/else,for/range) + - ##### Go 函数(Function) + - ##### 面向对象(Methods, Interfaces and Embedding) + - ##### 包处理(Packaging and Exporting) + - ##### Go 指针(Using Pointers) + - ##### 程序测试(Testing and Debugging) + - ##### 对象合成(Composition) + - ##### 错误处理(Error Handling) + - ##### 标准库(Standard Library) + - ##### 反射(Reflection) + - #### 并发编程 + - ##### Go 并发基础(Concurrency, Race Conditions and Channels) + - ##### 并发模式(Concurrency Patterns) + - #### Go Web 编程 + - ##### Web基础 + - ##### Web工作方式 + - ##### Go 搭建一个简单的web服务 + - ##### Go 的 HTTP 包详解 + - ##### 表单 + - ##### 处理表单的输入 + - ##### 验证表单的输入 + - ##### 预防跨站脚本 + - ##### 防止多次递交表单 + - ##### 处理文件上传 + - ##### 数据库 + - ##### database/sql接口 + - ##### 使用MySQL数据库 + - ##### 使用PostgreSQL数据库 + - ##### 使用beedb库进行ORM开发 + - ##### NOSQL数据库操作 + - ##### Session 和数据存储 + - ##### Session 和 Cookie + - ##### Go 如何使用 Session + - ##### Session 存储 + - ##### 预防 Session 劫持 + - ##### 文本文件处理 + - ##### XML 处理 + - ##### JSON 处理 + - ##### 正则处理 + - ##### 模板处理 + - ##### 文件操作 + - ##### 字符串处理 + - ##### Web服务 + - ##### Socket 编程 + - ##### WebSocket + - ##### REST + - ##### RPC + - ##### 安全与加密 + - ##### 预防 CSRF 攻击 + - ##### 确保输入过滤 + - ##### 避免 XSS 攻击 + - ##### 避免 SQL 注入 + - ##### 存储密码 + - ##### 加密和解密数据 + - ##### 国际化和本地化 + - ##### 设置默认地区 + - ##### 本地化资源 + - ##### 国际化站点 + - ##### 错误处理,调试和测试 + - ##### 错误处理 + - ##### 使用GDB调试 + - ##### Go怎么写测试用例 + - ##### 部署与维护 + - ##### 应用日志 + - ##### 网站错误处理 + - ##### 应用部署 + - ##### 备份和恢复 + - ##### 如何设计一个Web框架 + - ##### 项目规划 + - ##### 自定义路由器设计 + - ##### Controller 设计 + - ##### 日志和配置设计 + - ##### 实现博客的增删改 + - ##### 扩展Web框架 + - ##### 静态文件支持 + - ##### Session 支持 + - ##### 表单支持 + - ##### 用户认证 + - ##### 多语言支持 + - ##### pprof支持 + - #### Go 应用 + - ##### Docker + - ##### Bee Go + - ##### NSQ + - ##### NewSQL + - #### Go 实战案例 \ No newline at end of file diff --git a/data/frontEnd.md b/data/frontEnd.md new file mode 100644 index 00000000..136ba7a0 --- /dev/null +++ b/data/frontEnd.md @@ -0,0 +1,213 @@ +- ### 浏览器 + - IE6/7/8/9/10/11 (Trident) + - Firefox (Gecko) + - Chrome/Chromium (Blink) + - Safari (WebKit) + - Opera (Blink) + +- ### 编程语言 + - JavaScript/Node.js + - CoffeeScript + - TypeScript + +- ### 切页面 + - HTML/HTML5 + - CSS/CSS3 + - Sass/LESS/Stylus + - PhotoShop/Paint.net/Fireworks/GIMP/Sketch + +- ### 开发工具 + + - #### 编辑器和IDE + - VIM/Sublime Text2 + - Notepad++/EditPlus + - WebStorm + - Emacs EmacsWiki + - Brackets + - Atom + - Lime Text + - Light Table + - Codebox + - TextMate + - Neovim + - Komodo IDE / Edit + - Eclipse + - Visual Studio/Visual Studio Code + - NetBeans + - Cloud9 IDE + - HBuilder + - Nuclide + + - #### 调试工具 + - Firebug/Firecookie + - YSlow + - IEDeveloperToolbar/IETester + - Fiddler + - Chrome Dev Tools + - Dragonfly + - DebugBar + - Venkman + + - #### 版本管理 + - Git/SVN/Mercurial + - Github/GitLab/Bitbucket/Gitorious/GNU Savannah/Launchpad/SourceForge/TeamForge + +- ### 代码质量 + + - #### Coding style + - JSLint/JSHint/jscs + - CSSLint + - Markup Validation Service + - HTML Validators + + - #### 单元测试 + - QUnit/Jasmine + - Mocha/Should/Chai/Expect + - Unit JS + + - #### 自动化测试 + - WebDriver/Protractor/Karma Runner/Sahi + - phantomjs + - SourceLabs/BrowserStack + +- ### 前端库/框架 + - jQuery/Underscore/Mootools/Prototype.js + - YUI3/Dojo/ExtJS/KISSY + - Backbone/KnockoutJS/Emberjs + - #### AngularJS + - Batarang + - Bootstrap + - Semantic UI + - Juice UI + - Web Atoms + - Polymer + - Dhtmlx + - qooxdoo + - React + - Brick + + - #### 前端标准/规范 + - HTTP/1.1: RFCs 7230-7235 + - HTTP/2 + - ECMAScript 5/6 + - W3C: DOM/BOM/XHTML/XML/JSON/JSONP/... + - CommonJS Modules/AMD + - HTML5/CSS3 + - ##### Semantic Web + - MicroData + - RDFa + - ##### Web Accessibility + - WCAG + - Role Attribute + - WAI-ARIA + +- ### 性能 + - JSPerf + - YSlow 35 rules + - PageSpeed + - HTTPWatch + - DynaTrace's Ajax + - 高性能JavaScript + +- ### SEO + +- ### 编程知识储备 + - 数据结构 + - OOP/AOP + - 原型链/作用域链 + - 闭包 + - 编程范型 + - 设计模式 + - Javascript Tips + +- ### 部署流程 + + - #### 压缩合并 + - YUI Compressor + - Google Clousure Complier + - UglifyJS + - CleanCSS + + - #### 文档输出 + - JSDoc + - Dox/Doxmate/Grunt-Doxmate + + - #### 项目构建工具 + - make/Ant + - GYP + - Grunt + - Gulp + - Yeoman + - FIS + - Mod + +- ### 代码组织 + + - #### 类库模块化 + - CommonJS/AMD + - YUI3模块 + - CMD + - UMD + + - #### 业务逻辑模块化 + - bower/component + + - #### 文件加载 + - LABjs + - SeaJS/Require.js + + - #### 模块化预处理器 + - Browserify + - Webpack + +- ### 安全 + - CSRF/XSS + - CSP + - Same-origin policy + - ADsafe/Caja/Sandbox + +- ### 移动Web + - HTML5/CSS3 + - 响应式网页设计 + - Zeptojs/iScroll + - V5/Sencha Touch + - PhoneGap + - jQuery Mobile + - W3C Mobile Web Initiative + - W3C mobileOK Checker + - Open Mobile Alliance + +- ### 前沿技术社区/会议 + - D2/WebRebuild + - NodeParty/W3CTech/HTML5梦工厂 + - JSConf/沪JS(JSConf.cn) + - QCon/Velocity/SDCC + - JSConf/NodeConf + - CSSConf + - YDN/YUIConf + - HybridApp + - WHATWG + - MDN + - codepen + - w3cplus + - CNode + +- ### 计算机知识储备 + - 编译原理 + - 计算机网络 + - 操作系统 + - 算法原理 + - 软件工程/软件测试原理 + - Unicode + +- ### 软技能 + - 知识管理/总结分享 + - 沟通技巧/团队协作 + - 需求管理/PM + - 交互设计/可用性/可访问性知识 + +- ### 可视化 + - SVG/Canvas/VML + - SVG: D3/Raphaël/Snap.svg/DataV + - Canvas: CreateJS/KineticJS + - WebGL/Three.JS \ No newline at end of file diff --git a/data/security.md b/data/security.md new file mode 100644 index 00000000..3ea916e3 --- /dev/null +++ b/data/security.md @@ -0,0 +1,217 @@ +- ### 基础必备 + - #### HTTP抓包与调试 + - ##### Firefox插件 + - Firebug(抓包与各种调试) + - Tamper Data(拦截修改) + - Live Http Header(重放功能) + - Hackbar(编码解码/POST提交) + - Modify Headers(修改头部) + + - ##### Fiddler + - 浏览器代理神器 + - 拦截请求或响应 + - 抓包 + - 重放 + - 模拟请求 + - 编码解码 + - ##### 第三方扩展 + - ##### Watcher + - Web前端安全的自动审计工具 + - Wireshark(各种强大的过滤器语法) + - Tcpdump(命令行的类Wireshark抓包神器) + - ##### Python + - ##### urllib2 + - 打开请求响应调试 + - 编辑urllib2的do_open里的h.set_debuglevel + - 改为h.set_debuglevel(1),这时可以清晰看到请求响应数据,包括https + + - #### 什么是跳转 + - ##### 服务端跳转 + - 302 + - 301 + - urllib2 + + - ##### 客户端跳转 + + - #### Office 能力 + - Word + - Excel + - PPT + - yEd + - Visio + - FreeMind + + - #### Linux 基础 + + - #### Vim 基础 + + - #### Python 基础 + + - #### 算法 + - 快排 + - 二分 + + - #### 正则表达式 + - ##### 调试工具 + - Kodos + - RegexBuddy + - Regexper + + - #### 研发能力 + - 瀑布模型 + - 需求分析能力 + - 调试能力 + - 敏捷思想 + + - #### 翻墙技能 + +- ### Web安全 + + - #### Web服务组件 + + - #### 安全维度 + - 漏洞 + - 风险 + - 事件 + + - #### Web安全标准 + - OWASP + - WASC + + - #### 实战环境 + - ##### XSS + - ##### SQL + - ##### i春秋 + - ##### Sebug + ZoomEye + + - #### 工具 + - ##### Firefox + - Firebug 调试JavaScript,HTTP请求响应观察,Cookie,DOM树观察等 + - Tamper Data 拦截修改 + - Live Http Header 重放功能 + - Hackbar 编码解码/POST提交 + - Modify Headers 修改头部 + - GreaseMonkey : Original Cookie Injector for Greasemonkey User Link + - NoScript 进行一些JavaScript的阻断 + - AutoProxy 翻墙必备 + + - ##### Chrome + - F12 打开开发者工具,功能==Firebug+本地存储观察等 + - SwichySharp 翻墙必备 + - CookieHacker + + - ##### Web2.0 Hacking + - XSS'OR + - XSSEE 3.0 Beta + - Online JavaScript beautifier + - BeEF + + - ##### HTTP代理 + - Fiddler + 非常经典好用的Web调试代理工具 + - Burp Suite + 神器,不仅HTTP代理,还有爬虫、漏洞扫描、渗透、爆破等功能 + - mitmproxy + Python写的,基于这个框架写神器实在太方便了 + + - ##### 漏洞扫描 + - AWVS + 不仅漏扫方便,自带的一些小工具也好用 + - Nmap + 绝对不仅仅是端口扫描!几百个脚本 + - Python自写脚本/工具 + + - ##### 漏洞利用 + - sqlmap + SQL注入利用最牛神器,没有之一 + - Metasploit + 最经典的渗透框架 + - Hydra + 爆破必备 + + - ##### 抓包工具 + - Wireshark + 抓包必备 + - Tcpdump + Linux下命令行抓包,结果可以给Wireshark分析 + + - ##### Sebug + ZoomEye + + - ##### Kali Linux + +- ### 嵌入式安全 + - #### 路由器安全 + - ##### 基础 + - 嵌入式Linux系统方面知识 + - 开发系统互联参考模型-第三层网络层 + - MIPS/ARM汇编知识 + - VxWorks系统方面知识 + - JTAG调试接口规范 + - 嵌入式系统交叉环境开发 + - 路由器芯片方案提供商 + + - ##### 站点 + - OpenWrt.org + - routerpwn.com + - see.sl088.com(Uboot_编译) + - devttys0.com + + - ##### 工具 + - Binwalk + - IDA Pro + - gdb/gdbserver + - qemu-system + - qemu-user-static + - Smiasm + - Metasm + - JTAG硬件调试器 + + - #### 摄像头安全 + + - #### 工控安全 + - ##### 基础 + - 工业生产环境的基本结构,如:SCADA、PCS + - 工业生产环境的信息安全风险点 + - 工控网络组态、逻辑开发、应用组态的基本技术方法 + - 抓包、看RFC分析几个常规工业以太网协议,如:Profinet、Modbus + - PLC + - ##### 站点 + - 事件跟踪分析 + - ##### 标准协会/测试工具 + - DHS CET套件 + - NERC ES-ISAC + - ICS-ISAC + - NTSB美国国家工控测试床 + - NIST SP 800-82 + - ISA-99控制系统安全协会 + - NERC CIP标准 + + - ##### 工具 + - ##### 仿真类 + - 电力仿真软件testhaness + - Modbus仿真软件ModScan + - 电力104协议仿真软件PMA + - ##### 测试类 + - Wurldtech Achilles + - Codenomicon Defensics + - Spirent + - BPS + - ##### 源代码 + - 发现 + - 操纵 + - 异常监测 + + - ##### 其他 + - ZoomEye 工控 + - Shodan 工控 + + +- ### 移动安全 +- ### 系统安全 +- ### 反病毒 +- ### 云安全 + - DDOS + - #### 接口安全 + - 验证 + - 越权 + - 校验 diff --git a/img/minus.png b/img/minus.png new file mode 100644 index 00000000..4956850a Binary files /dev/null and b/img/minus.png differ diff --git a/img/plus.png b/img/plus.png new file mode 100644 index 00000000..e09ee95f Binary files /dev/null and b/img/plus.png differ diff --git a/img/qq.png b/img/qq.png new file mode 100644 index 00000000..720bf9e1 Binary files /dev/null and b/img/qq.png differ diff --git a/img/top.svg b/img/top.svg new file mode 100644 index 00000000..4e70f78e --- /dev/null +++ b/img/top.svg @@ -0,0 +1,31 @@ + + \ No newline at end of file diff --git a/img/wechat.png b/img/wechat.png new file mode 100644 index 00000000..6fb54b3a Binary files /dev/null and b/img/wechat.png differ diff --git a/index.html b/index.html new file mode 100644 index 00000000..3d6c16b0 --- /dev/null +++ b/index.html @@ -0,0 +1,141 @@ + + + +
+ + +2015/09/11发布,后续动态请关注微信公众号:StuQ
+"+(escaped?code:escape(code,true))+"\n
"}return''+(escaped?code:escape(code,true))+"\n
\n"};Renderer.prototype.blockquote=function(quote){return"\n"+quote+"\n"};Renderer.prototype.html=function(html){return html};Renderer.prototype.heading=function(text,level,raw){return"
"+text+"
\n"};Renderer.prototype.table=function(header,body){return""+text+"
"};Renderer.prototype.br=function(){return this.options.xhtml?""+escape(e.message+"",true)+""}throw e}}marked.options=marked.setOptions=function(opt){merge(marked.defaults,opt);return marked};marked.defaults={gfm:true,tables:true,breaks:false,pedantic:false,sanitize:false,sanitizer:null,mangle:true,smartLists:false,silent:false,highlight:null,langPrefix:"lang-",smartypants:false,headerPrefix:"",renderer:new Renderer,xhtml:false};marked.Parser=Parser;marked.parser=Parser.parse;marked.Renderer=Renderer;marked.Lexer=Lexer;marked.lexer=Lexer.lex;marked.InlineLexer=InlineLexer;marked.inlineLexer=InlineLexer.output;marked.parse=marked;if(typeof module!=="undefined"&&typeof exports==="object"){module.exports=marked}else if(typeof define==="function"&&define.amd){define(function(){return marked})}else{this.marked=marked}}).call(function(){return this||(typeof window!=="undefined"?window:global)}()); \ No newline at end of file diff --git a/js/script.js b/js/script.js new file mode 100644 index 00000000..68e721e3 --- /dev/null +++ b/js/script.js @@ -0,0 +1,213 @@ +/* + - Author: Steve + - Mail: steve@stuq.org + - Date: Aug 31th, 2015 + */ + + +// DOM methods +(function(window, document) { + var elementPrototype = typeof HTMLElement !== 'undefined' ? HTMLElement.prototype : Element.prototype; + + var $id = window.$id = function(id) { + return document.getElementById(id); + }; + + var $tag = window.$tag = function(tagName) { + return document.getElementsByTagName(tagName); + }; + + elementPrototype.tagEles = function(tagName) { + return this.getElementsByTagName(tagName); + }; + + elementPrototype.hasClass = function(className) { + return !!this.className.match(new RegExp('(\\s|^)' + className + '(\\s|$)')); + }; + + elementPrototype.addClass = function(className) { + if (!this.hasClass(className)) { + this.className += ' ' + className; + this.className = this.className.trim(); + } + }; + + elementPrototype.removeClass = function(className) { + if (this.hasClass(className)) { + var reg = new RegExp('(\\s|^)' + className + '(\\s|$)'); + this.className = this.className.replace(reg, ' '); + this.className = this.className.trim(); + } + }; + + elementPrototype.isLeafNode = function() { + return this.tagEles('li').length ? false : true; + }; + + elementPrototype.openNode = function() { + this.lastElementChild.removeClass('hide'); + this.removeClass('closed'); + this.addClass('opened'); + }; + + elementPrototype.normalizeNode = function() { + this.lastElementChild.removeClass('hide'); + this.firstElementChild.removeClass('node'); + this.firstElementChild.style.cursor = 'initial'; + this.addClass('normal'); + this.removeClass('closed'); + }; +})(window, document); + +// skillmap class +(function(window, document) { + var skillmap = window.skillmap = function() { + // AJAX for IE and other browsers + var newRequest = function() { + var xhr; + + if (typeof XMLHttpRequest !== 'undefined') { + xhr = new XMLHttpRequest(); + } else { + var versions = ["MSXML2.XmlHttp.5.0", + "MSXML2.XmlHttp.4.0", + "MSXML2.XmlHttp.3.0", + "MSXML2.XmlHttp.2.0", + "Microsoft.XmlHttp"]; + + for (var i = 0, len = versions.length; i < len; i++) { + try { + xhr = new ActiveXObject(versions[i]); + break; + } catch(e) {} + } + } + return xhr; + }; + + // read md file from server + var readTextFile = function(file) { + var rawFile = new newRequest(); + rawFile.open("GET", file, false); + rawFile.send(null); + try { + return rawFile.responseText; + } catch(error) { + console.log(error); + } + }; + + // scroll element to destination + var scrollTo = function(element, to, duration) { + if (duration < 0) { + $id('toTop').addClass('hide'); + return; + } + + var difference = to - element.scrollTop; + var perTick = difference / duration * 2; + + setTimeout(function() { + element.scrollTop = element.scrollTop + perTick; + scrollTo(element, to, duration - 2); + }, 10); + }; + + var defaultOpen = [ + 'index', + 'intro', + 'language', +// 'bottomQrcode', + 'end' + ]; + + var init = function() { + window.onload = function() { + var mdList = { + 'devLang': 'data/dev-lang.md', + 'bigData': 'data/big-data.md', + 'cloudComputing': 'data/cloudComputing.md', + 'frontEnd': 'data/frontEnd.md', + 'IOAM': 'data/IOAM.md', + 'security': 'data/security.md' + }, liArray = $tag('li'); + + for (var i in mdList) { + $id(i).innerHTML = marked(readTextFile(mdList[i])); + } + + for (var i = 0; i < liArray.length; i++) { + if (!liArray[i].isLeafNode()) { + liArray[i].firstElementChild.style.cursor = 'pointer'; + liArray[i].lastElementChild.addClass('hide'); + liArray[i].addClass('closed'); + + if (liArray[i].id !== 'bottomQrcode') { + liArray[i].firstElementChild.onclick = function() { + if (this.parentElement.lastElementChild.hasClass('hide')) { + this.parentElement.lastElementChild.removeClass('hide'); + this.parentElement.removeClass('closed'); + this.parentElement.addClass('opened'); + } else { + this.parentElement.lastElementChild.addClass('hide'); + this.parentElement.removeClass('opened'); + this.parentElement.addClass('closed'); + } + } + } + } else { + liArray[i].addClass('normal'); + } + } + + for (var i = 0; i < defaultOpen.length; i++) { + $id(defaultOpen[i]).openNode(); + } + $id('bottomQrcode').normalizeNode(); + + window.onscroll = function() { + if (window.scrollY > 0) { + $id('toTop').removeClass('hide'); + } + + $id('toTop').onclick = function() { + var body = document.body; + var dE = document.documentElement; // dE for firefox + + if (body.scrollTop || dE.scrollTop) { + scrollTo(body.scrollTop ? body : dE, 0, 50); + } else { + body.scrollIntoView(); + } + } + } + + $id('expand').onclick = function() { + for (var i = 0; i < liArray.length; i++) { + if (liArray[i].hasClass('closed')) { + liArray[i].removeClass('closed'); + liArray[i].addClass('opened'); + liArray[i].lastElementChild.removeClass('hide'); + } + } + } + + $id('collapse').onclick = function() { + for (var i = 0; i < liArray.length; i++) { + if (liArray[i].hasClass('opened')) { + liArray[i].removeClass('opened'); + liArray[i].addClass('closed'); + liArray[i].lastElementChild.addClass('hide'); + } + } + } + } + }; + + return { + init: init + }; + }; +})(window, document); + +skillmap().init(); diff --git a/sass/_base.sass b/sass/_base.sass new file mode 100644 index 00000000..d9e8a078 --- /dev/null +++ b/sass/_base.sass @@ -0,0 +1,44 @@ +// base.sass + + +* + box-sizing: border-box + +html, +body + display: block + position: relative + margin: 0 + padding: 0 + background: + color: #eee + font: + family: "Source Han Sans SC", "Helvetica Neue", Helvetica, Arial, "Lantinghei SC", "Hiragino Sans GB", STHeiti, "Microsoft Yahei", "Microsoft Sans Serif", sans-serif + size: 16px + word: + wrap: break-word + break: break-all + +ul + margin: + top: 1px + bottom: 1px + left: 0 + padding: + left: 3% + list-style: + type: square + li + line-height: 1.5em + +p + line-height: 1.5em + margin: 0 + +h1, +h2, +h3 + margin: 10px 0 + +.hide + display: none !important diff --git a/sass/list.sass b/sass/list.sass new file mode 100644 index 00000000..e702a0dd --- /dev/null +++ b/sass/list.sass @@ -0,0 +1,147 @@ +// list.sass + + +@import base + +.root + margin: 10px + padding: 10px 40px 80px + background: + color: #fff + border: + width: 1px + style: solid + color: #ddd + radius: 5px + + h1 + font-size: 1.7em + + p + span + color: #c00 + + .join-us + width: 100% + padding: 0 + margin: 1em 0 1em -6% + list-style: none + text-align: center + + li + display: inline-block + &:first-child + margin-right: 5% + + ul + h2 + font: + weight: 400 + + .node + li + margin: 0.5em 0 + + h3, + h4, + h5 + margin: 0 + padding: 0 + font: + weight: 400 + + h5 + font: + size: 0.95em + +#intro, +#end + h2 + font: + size: 1.17em + weight: 500 + +#frontEndIndex, +#cloudComputingIndex, +#securityIndex, +#IOAMIndex, +#bigDataIndex, +#language + h2 + display: inline-block + color: #17f + + &:focus, + &:hover + color: #00f + text-decoration: underline + + h3 + span + font: + size: 0.85em + weight: 400 + +#IH + h2 + display: inline-block + color: #17f + +.to-top + display: block + position: fixed + opacity: 0.98 + + &::before + @extend .to-top + content: '' + right: 2em + bottom: 2em + width: 4em + height: 4em + background: + image: url('../img/top.svg') + size: contain + repeat: no-repeat + + &:focus, + &:hover + cursor: pointer + +li.closed + list-style-image: url('../img/plus.png') +li.opened + list-style-image: url('../img/minus.png') +li.normal + list-style-image: none + +.expand-collapse + display: block + position: fixed + top: 0 + right: 2em + width: 8em + height: 2em + padding: 0.5em + background: + color: #fff + border: + width: 1px + style: solid + color: #ddd + top: none + font-size: 0.8em + text-align: center + + a + color: #17f + + &:focus, + &:hover + color: #00f + cursor: pointer + text-decoration: underline + +footer + margin-left: 10px + margin-bottom: 10px